Mini Kabibi Habibi

Current Path : C:/Program Files/Adobe/Adobe Photoshop 2025/Required/UXP/com.adobe.photoshop.sharepanel/
Upload File :
Current File : C:/Program Files/Adobe/Adobe Photoshop 2025/Required/UXP/com.adobe.photoshop.sharepanel/index.js

!function(n){var g={};function t(I){if(g[I])return g[I].exports;var e=g[I]={i:I,l:!1,exports:{}};return n[I].call(e.exports,e,e.exports,t),e.l=!0,e.exports}t.m=n,t.c=g,t.d=function(n,g,I){t.o(n,g)||Object.defineProperty(n,g,{enumerable:!0,get:I})},t.r=function(n){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})},t.t=function(n,g){if(1&g&&(n=t(n)),8&g)return n;if(4&g&&"object"==typeof n&&n&&n.__esModule)return n;var I=Object.create(null);if(t.r(I),Object.defineProperty(I,"default",{enumerable:!0,value:n}),2&g&&"string"!=typeof n)for(var e in n)t.d(I,e,function(g){return n[g]}.bind(null,e));return I},t.n=function(n){var g=n&&n.__esModule?function(){return n.default}:function(){return n};return t.d(g,"a",g),g},t.o=function(n,g){return Object.prototype.hasOwnProperty.call(n,g)},t.p="",t(t.s=247)}([function(module,exports,__webpack_require__){"use strict";eval("\n\nif (true) {\n  module.exports = __webpack_require__(97);\n} else {}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMC5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9yZWFjdC9pbmRleC5qcz9hYjViIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC5wcm9kdWN0aW9uLm1pbi5qcycpO1xufSBlbHNlIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC5kZXZlbG9wbWVudC5qcycpO1xufVxuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBRUE7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///0\n")},function(module,__webpack_exports__,__webpack_require__){"use strict";eval("/* WEBPACK VAR INJECTION */(function(global, setImmediate, process) {/* harmony import */ var _helpers_bind_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(44);\n\n\n\n\n// utils is a library of generic helper functions non-specific to axios\n\nconst {toString} = Object.prototype;\nconst {getPrototypeOf} = Object;\n\nconst kindOf = (cache => thing => {\n    const str = toString.call(thing);\n    return cache[str] || (cache[str] = str.slice(8, -1).toLowerCase());\n})(Object.create(null));\n\nconst kindOfTest = (type) => {\n  type = type.toLowerCase();\n  return (thing) => kindOf(thing) === type\n}\n\nconst typeOfTest = type => thing => typeof thing === type;\n\n/**\n * Determine if a value is an Array\n *\n * @param {Object} val The value to test\n *\n * @returns {boolean} True if value is an Array, otherwise false\n */\nconst {isArray} = Array;\n\n/**\n * Determine if a value is undefined\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if the value is undefined, otherwise false\n */\nconst isUndefined = typeOfTest('undefined');\n\n/**\n * Determine if a value is a Buffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Buffer, otherwise false\n */\nfunction isBuffer(val) {\n  return val !== null && !isUndefined(val) && val.constructor !== null && !isUndefined(val.constructor)\n    && isFunction(val.constructor.isBuffer) && val.constructor.isBuffer(val);\n}\n\n/**\n * Determine if a value is an ArrayBuffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is an ArrayBuffer, otherwise false\n */\nconst isArrayBuffer = kindOfTest('ArrayBuffer');\n\n\n/**\n * Determine if a value is a view on an ArrayBuffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false\n */\nfunction isArrayBufferView(val) {\n  let result;\n  if ((typeof ArrayBuffer !== 'undefined') && (ArrayBuffer.isView)) {\n    result = ArrayBuffer.isView(val);\n  } else {\n    result = (val) && (val.buffer) && (isArrayBuffer(val.buffer));\n  }\n  return result;\n}\n\n/**\n * Determine if a value is a String\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a String, otherwise false\n */\nconst isString = typeOfTest('string');\n\n/**\n * Determine if a value is a Function\n *\n * @param {*} val The value to test\n * @returns {boolean} True if value is a Function, otherwise false\n */\nconst isFunction = typeOfTest('function');\n\n/**\n * Determine if a value is a Number\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Number, otherwise false\n */\nconst isNumber = typeOfTest('number');\n\n/**\n * Determine if a value is an Object\n *\n * @param {*} thing The value to test\n *\n * @returns {boolean} True if value is an Object, otherwise false\n */\nconst isObject = (thing) => thing !== null && typeof thing === 'object';\n\n/**\n * Determine if a value is a Boolean\n *\n * @param {*} thing The value to test\n * @returns {boolean} True if value is a Boolean, otherwise false\n */\nconst isBoolean = thing => thing === true || thing === false;\n\n/**\n * Determine if a value is a plain Object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a plain Object, otherwise false\n */\nconst isPlainObject = (val) => {\n  if (kindOf(val) !== 'object') {\n    return false;\n  }\n\n  const prototype = getPrototypeOf(val);\n  return (prototype === null || prototype === Object.prototype || Object.getPrototypeOf(prototype) === null) && !(Symbol.toStringTag in val) && !(Symbol.iterator in val);\n}\n\n/**\n * Determine if a value is a Date\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Date, otherwise false\n */\nconst isDate = kindOfTest('Date');\n\n/**\n * Determine if a value is a File\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a File, otherwise false\n */\nconst isFile = kindOfTest('File');\n\n/**\n * Determine if a value is a Blob\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Blob, otherwise false\n */\nconst isBlob = kindOfTest('Blob');\n\n/**\n * Determine if a value is a FileList\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a File, otherwise false\n */\nconst isFileList = kindOfTest('FileList');\n\n/**\n * Determine if a value is a Stream\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Stream, otherwise false\n */\nconst isStream = (val) => isObject(val) && isFunction(val.pipe);\n\n/**\n * Determine if a value is a FormData\n *\n * @param {*} thing The value to test\n *\n * @returns {boolean} True if value is an FormData, otherwise false\n */\nconst isFormData = (thing) => {\n  let kind;\n  return thing && (\n    (typeof FormData === 'function' && thing instanceof FormData) || (\n      isFunction(thing.append) && (\n        (kind = kindOf(thing)) === 'formdata' ||\n        // detect form-data instance\n        (kind === 'object' && isFunction(thing.toString) && thing.toString() === '[object FormData]')\n      )\n    )\n  )\n}\n\n/**\n * Determine if a value is a URLSearchParams object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a URLSearchParams object, otherwise false\n */\nconst isURLSearchParams = kindOfTest('URLSearchParams');\n\nconst [isReadableStream, isRequest, isResponse, isHeaders] = ['ReadableStream', 'Request', 'Response', 'Headers'].map(kindOfTest);\n\n/**\n * Trim excess whitespace off the beginning and end of a string\n *\n * @param {String} str The String to trim\n *\n * @returns {String} The String freed of excess whitespace\n */\nconst trim = (str) => str.trim ?\n  str.trim() : str.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n\n/**\n * Iterate over an Array or an Object invoking a function for each item.\n *\n * If `obj` is an Array callback will be called passing\n * the value, index, and complete array for each item.\n *\n * If 'obj' is an Object callback will be called passing\n * the value, key, and complete object for each property.\n *\n * @param {Object|Array} obj The object to iterate\n * @param {Function} fn The callback to invoke for each item\n *\n * @param {Boolean} [allOwnKeys = false]\n * @returns {any}\n */\nfunction forEach(obj, fn, {allOwnKeys = false} = {}) {\n  // Don't bother if no value provided\n  if (obj === null || typeof obj === 'undefined') {\n    return;\n  }\n\n  let i;\n  let l;\n\n  // Force an array if not already something iterable\n  if (typeof obj !== 'object') {\n    /*eslint no-param-reassign:0*/\n    obj = [obj];\n  }\n\n  if (isArray(obj)) {\n    // Iterate over array values\n    for (i = 0, l = obj.length; i < l; i++) {\n      fn.call(null, obj[i], i, obj);\n    }\n  } else {\n    // Iterate over object keys\n    const keys = allOwnKeys ? Object.getOwnPropertyNames(obj) : Object.keys(obj);\n    const len = keys.length;\n    let key;\n\n    for (i = 0; i < len; i++) {\n      key = keys[i];\n      fn.call(null, obj[key], key, obj);\n    }\n  }\n}\n\nfunction findKey(obj, key) {\n  key = key.toLowerCase();\n  const keys = Object.keys(obj);\n  let i = keys.length;\n  let _key;\n  while (i-- > 0) {\n    _key = keys[i];\n    if (key === _key.toLowerCase()) {\n      return _key;\n    }\n  }\n  return null;\n}\n\nconst _global = (() => {\n  /*eslint no-undef:0*/\n  if (typeof globalThis !== \"undefined\") return globalThis;\n  return typeof self !== \"undefined\" ? self : (typeof window !== 'undefined' ? window : global)\n})();\n\nconst isContextDefined = (context) => !isUndefined(context) && context !== _global;\n\n/**\n * Accepts varargs expecting each argument to be an object, then\n * immutably merges the properties of each object and returns result.\n *\n * When multiple objects contain the same key the later object in\n * the arguments list will take precedence.\n *\n * Example:\n *\n * ```js\n * var result = merge({foo: 123}, {foo: 456});\n * console.log(result.foo); // outputs 456\n * ```\n *\n * @param {Object} obj1 Object to merge\n *\n * @returns {Object} Result of all merge properties\n */\nfunction merge(/* obj1, obj2, obj3, ... */) {\n  const {caseless} = isContextDefined(this) && this || {};\n  const result = {};\n  const assignValue = (val, key) => {\n    const targetKey = caseless && findKey(result, key) || key;\n    if (isPlainObject(result[targetKey]) && isPlainObject(val)) {\n      result[targetKey] = merge(result[targetKey], val);\n    } else if (isPlainObject(val)) {\n      result[targetKey] = merge({}, val);\n    } else if (isArray(val)) {\n      result[targetKey] = val.slice();\n    } else {\n      result[targetKey] = val;\n    }\n  }\n\n  for (let i = 0, l = arguments.length; i < l; i++) {\n    arguments[i] && forEach(arguments[i], assignValue);\n  }\n  return result;\n}\n\n/**\n * Extends object a by mutably adding to it the properties of object b.\n *\n * @param {Object} a The object to be extended\n * @param {Object} b The object to copy properties from\n * @param {Object} thisArg The object to bind function to\n *\n * @param {Boolean} [allOwnKeys]\n * @returns {Object} The resulting value of object a\n */\nconst extend = (a, b, thisArg, {allOwnKeys}= {}) => {\n  forEach(b, (val, key) => {\n    if (thisArg && isFunction(val)) {\n      a[key] = Object(_helpers_bind_js__WEBPACK_IMPORTED_MODULE_0__[/* default */ \"a\"])(val, thisArg);\n    } else {\n      a[key] = val;\n    }\n  }, {allOwnKeys});\n  return a;\n}\n\n/**\n * Remove byte order marker. This catches EF BB BF (the UTF-8 BOM)\n *\n * @param {string} content with BOM\n *\n * @returns {string} content value without BOM\n */\nconst stripBOM = (content) => {\n  if (content.charCodeAt(0) === 0xFEFF) {\n    content = content.slice(1);\n  }\n  return content;\n}\n\n/**\n * Inherit the prototype methods from one constructor into another\n * @param {function} constructor\n * @param {function} superConstructor\n * @param {object} [props]\n * @param {object} [descriptors]\n *\n * @returns {void}\n */\nconst inherits = (constructor, superConstructor, props, descriptors) => {\n  constructor.prototype = Object.create(superConstructor.prototype, descriptors);\n  constructor.prototype.constructor = constructor;\n  Object.defineProperty(constructor, 'super', {\n    value: superConstructor.prototype\n  });\n  props && Object.assign(constructor.prototype, props);\n}\n\n/**\n * Resolve object with deep prototype chain to a flat object\n * @param {Object} sourceObj source object\n * @param {Object} [destObj]\n * @param {Function|Boolean} [filter]\n * @param {Function} [propFilter]\n *\n * @returns {Object}\n */\nconst toFlatObject = (sourceObj, destObj, filter, propFilter) => {\n  let props;\n  let i;\n  let prop;\n  const merged = {};\n\n  destObj = destObj || {};\n  // eslint-disable-next-line no-eq-null,eqeqeq\n  if (sourceObj == null) return destObj;\n\n  do {\n    props = Object.getOwnPropertyNames(sourceObj);\n    i = props.length;\n    while (i-- > 0) {\n      prop = props[i];\n      if ((!propFilter || propFilter(prop, sourceObj, destObj)) && !merged[prop]) {\n        destObj[prop] = sourceObj[prop];\n        merged[prop] = true;\n      }\n    }\n    sourceObj = filter !== false && getPrototypeOf(sourceObj);\n  } while (sourceObj && (!filter || filter(sourceObj, destObj)) && sourceObj !== Object.prototype);\n\n  return destObj;\n}\n\n/**\n * Determines whether a string ends with the characters of a specified string\n *\n * @param {String} str\n * @param {String} searchString\n * @param {Number} [position= 0]\n *\n * @returns {boolean}\n */\nconst endsWith = (str, searchString, position) => {\n  str = String(str);\n  if (position === undefined || position > str.length) {\n    position = str.length;\n  }\n  position -= searchString.length;\n  const lastIndex = str.indexOf(searchString, position);\n  return lastIndex !== -1 && lastIndex === position;\n}\n\n\n/**\n * Returns new array from array like object or null if failed\n *\n * @param {*} [thing]\n *\n * @returns {?Array}\n */\nconst toArray = (thing) => {\n  if (!thing) return null;\n  if (isArray(thing)) return thing;\n  let i = thing.length;\n  if (!isNumber(i)) return null;\n  const arr = new Array(i);\n  while (i-- > 0) {\n    arr[i] = thing[i];\n  }\n  return arr;\n}\n\n/**\n * Checking if the Uint8Array exists and if it does, it returns a function that checks if the\n * thing passed in is an instance of Uint8Array\n *\n * @param {TypedArray}\n *\n * @returns {Array}\n */\n// eslint-disable-next-line func-names\nconst isTypedArray = (TypedArray => {\n  // eslint-disable-next-line func-names\n  return thing => {\n    return TypedArray && thing instanceof TypedArray;\n  };\n})(typeof Uint8Array !== 'undefined' && getPrototypeOf(Uint8Array));\n\n/**\n * For each entry in the object, call the function with the key and value.\n *\n * @param {Object<any, any>} obj - The object to iterate over.\n * @param {Function} fn - The function to call for each entry.\n *\n * @returns {void}\n */\nconst forEachEntry = (obj, fn) => {\n  const generator = obj && obj[Symbol.iterator];\n\n  const iterator = generator.call(obj);\n\n  let result;\n\n  while ((result = iterator.next()) && !result.done) {\n    const pair = result.value;\n    fn.call(obj, pair[0], pair[1]);\n  }\n}\n\n/**\n * It takes a regular expression and a string, and returns an array of all the matches\n *\n * @param {string} regExp - The regular expression to match against.\n * @param {string} str - The string to search.\n *\n * @returns {Array<boolean>}\n */\nconst matchAll = (regExp, str) => {\n  let matches;\n  const arr = [];\n\n  while ((matches = regExp.exec(str)) !== null) {\n    arr.push(matches);\n  }\n\n  return arr;\n}\n\n/* Checking if the kindOfTest function returns true when passed an HTMLFormElement. */\nconst isHTMLForm = kindOfTest('HTMLFormElement');\n\nconst toCamelCase = str => {\n  return str.toLowerCase().replace(/[-_\\s]([a-z\\d])(\\w*)/g,\n    function replacer(m, p1, p2) {\n      return p1.toUpperCase() + p2;\n    }\n  );\n};\n\n/* Creating a function that will check if an object has a property. */\nconst hasOwnProperty = (({hasOwnProperty}) => (obj, prop) => hasOwnProperty.call(obj, prop))(Object.prototype);\n\n/**\n * Determine if a value is a RegExp object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a RegExp object, otherwise false\n */\nconst isRegExp = kindOfTest('RegExp');\n\nconst reduceDescriptors = (obj, reducer) => {\n  const descriptors = Object.getOwnPropertyDescriptors(obj);\n  const reducedDescriptors = {};\n\n  forEach(descriptors, (descriptor, name) => {\n    let ret;\n    if ((ret = reducer(descriptor, name, obj)) !== false) {\n      reducedDescriptors[name] = ret || descriptor;\n    }\n  });\n\n  Object.defineProperties(obj, reducedDescriptors);\n}\n\n/**\n * Makes all methods read-only\n * @param {Object} obj\n */\n\nconst freezeMethods = (obj) => {\n  reduceDescriptors(obj, (descriptor, name) => {\n    // skip restricted props in strict mode\n    if (isFunction(obj) && ['arguments', 'caller', 'callee'].indexOf(name) !== -1) {\n      return false;\n    }\n\n    const value = obj[name];\n\n    if (!isFunction(value)) return;\n\n    descriptor.enumerable = false;\n\n    if ('writable' in descriptor) {\n      descriptor.writable = false;\n      return;\n    }\n\n    if (!descriptor.set) {\n      descriptor.set = () => {\n        throw Error('Can not rewrite read-only method \\'' + name + '\\'');\n      };\n    }\n  });\n}\n\nconst toObjectSet = (arrayOrString, delimiter) => {\n  const obj = {};\n\n  const define = (arr) => {\n    arr.forEach(value => {\n      obj[value] = true;\n    });\n  }\n\n  isArray(arrayOrString) ? define(arrayOrString) : define(String(arrayOrString).split(delimiter));\n\n  return obj;\n}\n\nconst noop = () => {}\n\nconst toFiniteNumber = (value, defaultValue) => {\n  return value != null && Number.isFinite(value = +value) ? value : defaultValue;\n}\n\n/**\n * If the thing is a FormData object, return true, otherwise return false.\n *\n * @param {unknown} thing - The thing to check.\n *\n * @returns {boolean}\n */\nfunction isSpecCompliantForm(thing) {\n  return !!(thing && isFunction(thing.append) && thing[Symbol.toStringTag] === 'FormData' && thing[Symbol.iterator]);\n}\n\nconst toJSONObject = (obj) => {\n  const stack = new Array(10);\n\n  const visit = (source, i) => {\n\n    if (isObject(source)) {\n      if (stack.indexOf(source) >= 0) {\n        return;\n      }\n\n      if(!('toJSON' in source)) {\n        stack[i] = source;\n        const target = isArray(source) ? [] : {};\n\n        forEach(source, (value, key) => {\n          const reducedValue = visit(value, i + 1);\n          !isUndefined(reducedValue) && (target[key] = reducedValue);\n        });\n\n        stack[i] = undefined;\n\n        return target;\n      }\n    }\n\n    return source;\n  }\n\n  return visit(obj, 0);\n}\n\nconst isAsyncFn = kindOfTest('AsyncFunction');\n\nconst isThenable = (thing) =>\n  thing && (isObject(thing) || isFunction(thing)) && isFunction(thing.then) && isFunction(thing.catch);\n\n// original code\n// https://github.com/DigitalBrainJS/AxiosPromise/blob/16deab13710ec09779922131f3fa5954320f83ab/lib/utils.js#L11-L34\n\nconst _setImmediate = ((setImmediateSupported, postMessageSupported) => {\n  if (setImmediateSupported) {\n    return setImmediate;\n  }\n\n  return postMessageSupported ? ((token, callbacks) => {\n    _global.addEventListener(\"message\", ({source, data}) => {\n      if (source === _global && data === token) {\n        callbacks.length && callbacks.shift()();\n      }\n    }, false);\n\n    return (cb) => {\n      callbacks.push(cb);\n      _global.postMessage(token, \"*\");\n    }\n  })(`axios@${Math.random()}`, []) : (cb) => setTimeout(cb);\n})(\n  typeof setImmediate === 'function',\n  isFunction(_global.postMessage)\n);\n\nconst asap = typeof queueMicrotask !== 'undefined' ?\n  queueMicrotask.bind(_global) : ( typeof process !== 'undefined' && process.nextTick || _setImmediate);\n\n// *********************\n\n/* harmony default export */ __webpack_exports__[\"a\"] = ({\n  isArray,\n  isArrayBuffer,\n  isBuffer,\n  isFormData,\n  isArrayBufferView,\n  isString,\n  isNumber,\n  isBoolean,\n  isObject,\n  isPlainObject,\n  isReadableStream,\n  isRequest,\n  isResponse,\n  isHeaders,\n  isUndefined,\n  isDate,\n  isFile,\n  isBlob,\n  isRegExp,\n  isFunction,\n  isStream,\n  isURLSearchParams,\n  isTypedArray,\n  isFileList,\n  forEach,\n  merge,\n  extend,\n  trim,\n  stripBOM,\n  inherits,\n  toFlatObject,\n  kindOf,\n  kindOfTest,\n  endsWith,\n  toArray,\n  forEachEntry,\n  matchAll,\n  isHTMLForm,\n  hasOwnProperty,\n  hasOwnProp: hasOwnProperty, // an alias to avoid ESLint no-prototype-builtins detection\n  reduceDescriptors,\n  freezeMethods,\n  toObjectSet,\n  toCamelCase,\n  noop,\n  toFiniteNumber,\n  findKey,\n  global: _global,\n  isContextDefined,\n  isSpecCompliantForm,\n  toJSONObject,\n  isAsyncFn,\n  isThenable,\n  setImmediate: _setImmediate,\n  asap\n});\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(21), __webpack_require__(77).setImmediate, __webpack_require__(16)))//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMS5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvdXRpbHMuanM/YzUzMiJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbmltcG9ydCBiaW5kIGZyb20gJy4vaGVscGVycy9iaW5kLmpzJztcblxuLy8gdXRpbHMgaXMgYSBsaWJyYXJ5IG9mIGdlbmVyaWMgaGVscGVyIGZ1bmN0aW9ucyBub24tc3BlY2lmaWMgdG8gYXhpb3NcblxuY29uc3Qge3RvU3RyaW5nfSA9IE9iamVjdC5wcm90b3R5cGU7XG5jb25zdCB7Z2V0UHJvdG90eXBlT2Z9ID0gT2JqZWN0O1xuXG5jb25zdCBraW5kT2YgPSAoY2FjaGUgPT4gdGhpbmcgPT4ge1xuICAgIGNvbnN0IHN0ciA9IHRvU3RyaW5nLmNhbGwodGhpbmcpO1xuICAgIHJldHVybiBjYWNoZVtzdHJdIHx8IChjYWNoZVtzdHJdID0gc3RyLnNsaWNlKDgsIC0xKS50b0xvd2VyQ2FzZSgpKTtcbn0pKE9iamVjdC5jcmVhdGUobnVsbCkpO1xuXG5jb25zdCBraW5kT2ZUZXN0ID0gKHR5cGUpID0+IHtcbiAgdHlwZSA9IHR5cGUudG9Mb3dlckNhc2UoKTtcbiAgcmV0dXJuICh0aGluZykgPT4ga2luZE9mKHRoaW5nKSA9PT0gdHlwZVxufVxuXG5jb25zdCB0eXBlT2ZUZXN0ID0gdHlwZSA9PiB0aGluZyA9PiB0eXBlb2YgdGhpbmcgPT09IHR5cGU7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYW4gQXJyYXlcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYW4gQXJyYXksIG90aGVyd2lzZSBmYWxzZVxuICovXG5jb25zdCB7aXNBcnJheX0gPSBBcnJheTtcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyB1bmRlZmluZWRcbiAqXG4gKiBAcGFyYW0geyp9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHRoZSB2YWx1ZSBpcyB1bmRlZmluZWQsIG90aGVyd2lzZSBmYWxzZVxuICovXG5jb25zdCBpc1VuZGVmaW5lZCA9IHR5cGVPZlRlc3QoJ3VuZGVmaW5lZCcpO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgQnVmZmVyXG4gKlxuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIEJ1ZmZlciwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzQnVmZmVyKHZhbCkge1xuICByZXR1cm4gdmFsICE9PSBudWxsICYmICFpc1VuZGVmaW5lZCh2YWwpICYmIHZhbC5jb25zdHJ1Y3RvciAhPT0gbnVsbCAmJiAhaXNVbmRlZmluZWQodmFsLmNvbnN0cnVjdG9yKVxuICAgICYmIGlzRnVuY3Rpb24odmFsLmNvbnN0cnVjdG9yLmlzQnVmZmVyKSAmJiB2YWwuY29uc3RydWN0b3IuaXNCdWZmZXIodmFsKTtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhbiBBcnJheUJ1ZmZlclxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYW4gQXJyYXlCdWZmZXIsIG90aGVyd2lzZSBmYWxzZVxuICovXG5jb25zdCBpc0FycmF5QnVmZmVyID0ga2luZE9mVGVzdCgnQXJyYXlCdWZmZXInKTtcblxuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgdmlldyBvbiBhbiBBcnJheUJ1ZmZlclxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSB2aWV3IG9uIGFuIEFycmF5QnVmZmVyLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNBcnJheUJ1ZmZlclZpZXcodmFsKSB7XG4gIGxldCByZXN1bHQ7XG4gIGlmICgodHlwZW9mIEFycmF5QnVmZmVyICE9PSAndW5kZWZpbmVkJykgJiYgKEFycmF5QnVmZmVyLmlzVmlldykpIHtcbiAgICByZXN1bHQgPSBBcnJheUJ1ZmZlci5pc1ZpZXcodmFsKTtcbiAgfSBlbHNlIHtcbiAgICByZXN1bHQgPSAodmFsKSAmJiAodmFsLmJ1ZmZlcikgJiYgKGlzQXJyYXlCdWZmZXIodmFsLmJ1ZmZlcikpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBTdHJpbmdcbiAqXG4gKiBAcGFyYW0geyp9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgU3RyaW5nLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3QgaXNTdHJpbmcgPSB0eXBlT2ZUZXN0KCdzdHJpbmcnKTtcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIEZ1bmN0aW9uXG4gKlxuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgRnVuY3Rpb24sIG90aGVyd2lzZSBmYWxzZVxuICovXG5jb25zdCBpc0Z1bmN0aW9uID0gdHlwZU9mVGVzdCgnZnVuY3Rpb24nKTtcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIE51bWJlclxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBOdW1iZXIsIG90aGVyd2lzZSBmYWxzZVxuICovXG5jb25zdCBpc051bWJlciA9IHR5cGVPZlRlc3QoJ251bWJlcicpO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGFuIE9iamVjdFxuICpcbiAqIEBwYXJhbSB7Kn0gdGhpbmcgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhbiBPYmplY3QsIG90aGVyd2lzZSBmYWxzZVxuICovXG5jb25zdCBpc09iamVjdCA9ICh0aGluZykgPT4gdGhpbmcgIT09IG51bGwgJiYgdHlwZW9mIHRoaW5nID09PSAnb2JqZWN0JztcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIEJvb2xlYW5cbiAqXG4gKiBAcGFyYW0geyp9IHRoaW5nIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIEJvb2xlYW4sIG90aGVyd2lzZSBmYWxzZVxuICovXG5jb25zdCBpc0Jvb2xlYW4gPSB0aGluZyA9PiB0aGluZyA9PT0gdHJ1ZSB8fCB0aGluZyA9PT0gZmFsc2U7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBwbGFpbiBPYmplY3RcbiAqXG4gKiBAcGFyYW0geyp9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgcGxhaW4gT2JqZWN0LCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3QgaXNQbGFpbk9iamVjdCA9ICh2YWwpID0+IHtcbiAgaWYgKGtpbmRPZih2YWwpICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IHByb3RvdHlwZSA9IGdldFByb3RvdHlwZU9mKHZhbCk7XG4gIHJldHVybiAocHJvdG90eXBlID09PSBudWxsIHx8IHByb3RvdHlwZSA9PT0gT2JqZWN0LnByb3RvdHlwZSB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG90eXBlKSA9PT0gbnVsbCkgJiYgIShTeW1ib2wudG9TdHJpbmdUYWcgaW4gdmFsKSAmJiAhKFN5bWJvbC5pdGVyYXRvciBpbiB2YWwpO1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgRGF0ZVxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBEYXRlLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3QgaXNEYXRlID0ga2luZE9mVGVzdCgnRGF0ZScpO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgRmlsZVxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBGaWxlLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3QgaXNGaWxlID0ga2luZE9mVGVzdCgnRmlsZScpO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgQmxvYlxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBCbG9iLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3QgaXNCbG9iID0ga2luZE9mVGVzdCgnQmxvYicpO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgRmlsZUxpc3RcbiAqXG4gKiBAcGFyYW0geyp9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgRmlsZSwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmNvbnN0IGlzRmlsZUxpc3QgPSBraW5kT2ZUZXN0KCdGaWxlTGlzdCcpO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgU3RyZWFtXG4gKlxuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIFN0cmVhbSwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmNvbnN0IGlzU3RyZWFtID0gKHZhbCkgPT4gaXNPYmplY3QodmFsKSAmJiBpc0Z1bmN0aW9uKHZhbC5waXBlKTtcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIEZvcm1EYXRhXG4gKlxuICogQHBhcmFtIHsqfSB0aGluZyBUaGUgdmFsdWUgdG8gdGVzdFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGFuIEZvcm1EYXRhLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3QgaXNGb3JtRGF0YSA9ICh0aGluZykgPT4ge1xuICBsZXQga2luZDtcbiAgcmV0dXJuIHRoaW5nICYmIChcbiAgICAodHlwZW9mIEZvcm1EYXRhID09PSAnZnVuY3Rpb24nICYmIHRoaW5nIGluc3RhbmNlb2YgRm9ybURhdGEpIHx8IChcbiAgICAgIGlzRnVuY3Rpb24odGhpbmcuYXBwZW5kKSAmJiAoXG4gICAgICAgIChraW5kID0ga2luZE9mKHRoaW5nKSkgPT09ICdmb3JtZGF0YScgfHxcbiAgICAgICAgLy8gZGV0ZWN0IGZvcm0tZGF0YSBpbnN0YW5jZVxuICAgICAgICAoa2luZCA9PT0gJ29iamVjdCcgJiYgaXNGdW5jdGlvbih0aGluZy50b1N0cmluZykgJiYgdGhpbmcudG9TdHJpbmcoKSA9PT0gJ1tvYmplY3QgRm9ybURhdGFdJylcbiAgICAgIClcbiAgICApXG4gIClcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIFVSTFNlYXJjaFBhcmFtcyBvYmplY3RcbiAqXG4gKiBAcGFyYW0geyp9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgVVJMU2VhcmNoUGFyYW1zIG9iamVjdCwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmNvbnN0IGlzVVJMU2VhcmNoUGFyYW1zID0ga2luZE9mVGVzdCgnVVJMU2VhcmNoUGFyYW1zJyk7XG5cbmNvbnN0IFtpc1JlYWRhYmxlU3RyZWFtLCBpc1JlcXVlc3QsIGlzUmVzcG9uc2UsIGlzSGVhZGVyc10gPSBbJ1JlYWRhYmxlU3RyZWFtJywgJ1JlcXVlc3QnLCAnUmVzcG9uc2UnLCAnSGVhZGVycyddLm1hcChraW5kT2ZUZXN0KTtcblxuLyoqXG4gKiBUcmltIGV4Y2VzcyB3aGl0ZXNwYWNlIG9mZiB0aGUgYmVnaW5uaW5nIGFuZCBlbmQgb2YgYSBzdHJpbmdcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyIFRoZSBTdHJpbmcgdG8gdHJpbVxuICpcbiAqIEByZXR1cm5zIHtTdHJpbmd9IFRoZSBTdHJpbmcgZnJlZWQgb2YgZXhjZXNzIHdoaXRlc3BhY2VcbiAqL1xuY29uc3QgdHJpbSA9IChzdHIpID0+IHN0ci50cmltID9cbiAgc3RyLnRyaW0oKSA6IHN0ci5yZXBsYWNlKC9eW1xcc1xcdUZFRkZcXHhBMF0rfFtcXHNcXHVGRUZGXFx4QTBdKyQvZywgJycpO1xuXG4vKipcbiAqIEl0ZXJhdGUgb3ZlciBhbiBBcnJheSBvciBhbiBPYmplY3QgaW52b2tpbmcgYSBmdW5jdGlvbiBmb3IgZWFjaCBpdGVtLlxuICpcbiAqIElmIGBvYmpgIGlzIGFuIEFycmF5IGNhbGxiYWNrIHdpbGwgYmUgY2FsbGVkIHBhc3NpbmdcbiAqIHRoZSB2YWx1ZSwgaW5kZXgsIGFuZCBjb21wbGV0ZSBhcnJheSBmb3IgZWFjaCBpdGVtLlxuICpcbiAqIElmICdvYmonIGlzIGFuIE9iamVjdCBjYWxsYmFjayB3aWxsIGJlIGNhbGxlZCBwYXNzaW5nXG4gKiB0aGUgdmFsdWUsIGtleSwgYW5kIGNvbXBsZXRlIG9iamVjdCBmb3IgZWFjaCBwcm9wZXJ0eS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdHxBcnJheX0gb2JqIFRoZSBvYmplY3QgdG8gaXRlcmF0ZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGNhbGxiYWNrIHRvIGludm9rZSBmb3IgZWFjaCBpdGVtXG4gKlxuICogQHBhcmFtIHtCb29sZWFufSBbYWxsT3duS2V5cyA9IGZhbHNlXVxuICogQHJldHVybnMge2FueX1cbiAqL1xuZnVuY3Rpb24gZm9yRWFjaChvYmosIGZuLCB7YWxsT3duS2V5cyA9IGZhbHNlfSA9IHt9KSB7XG4gIC8vIERvbid0IGJvdGhlciBpZiBubyB2YWx1ZSBwcm92aWRlZFxuICBpZiAob2JqID09PSBudWxsIHx8IHR5cGVvZiBvYmogPT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbGV0IGk7XG4gIGxldCBsO1xuXG4gIC8vIEZvcmNlIGFuIGFycmF5IGlmIG5vdCBhbHJlYWR5IHNvbWV0aGluZyBpdGVyYWJsZVxuICBpZiAodHlwZW9mIG9iaiAhPT0gJ29iamVjdCcpIHtcbiAgICAvKmVzbGludCBuby1wYXJhbS1yZWFzc2lnbjowKi9cbiAgICBvYmogPSBbb2JqXTtcbiAgfVxuXG4gIGlmIChpc0FycmF5KG9iaikpIHtcbiAgICAvLyBJdGVyYXRlIG92ZXIgYXJyYXkgdmFsdWVzXG4gICAgZm9yIChpID0gMCwgbCA9IG9iai5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIGZuLmNhbGwobnVsbCwgb2JqW2ldLCBpLCBvYmopO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBJdGVyYXRlIG92ZXIgb2JqZWN0IGtleXNcbiAgICBjb25zdCBrZXlzID0gYWxsT3duS2V5cyA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG9iaikgOiBPYmplY3Qua2V5cyhvYmopO1xuICAgIGNvbnN0IGxlbiA9IGtleXMubGVuZ3RoO1xuICAgIGxldCBrZXk7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGtleSA9IGtleXNbaV07XG4gICAgICBmbi5jYWxsKG51bGwsIG9ialtrZXldLCBrZXksIG9iaik7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGZpbmRLZXkob2JqLCBrZXkpIHtcbiAga2V5ID0ga2V5LnRvTG93ZXJDYXNlKCk7XG4gIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhvYmopO1xuICBsZXQgaSA9IGtleXMubGVuZ3RoO1xuICBsZXQgX2tleTtcbiAgd2hpbGUgKGktLSA+IDApIHtcbiAgICBfa2V5ID0ga2V5c1tpXTtcbiAgICBpZiAoa2V5ID09PSBfa2V5LnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgIHJldHVybiBfa2V5O1xuICAgIH1cbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuY29uc3QgX2dsb2JhbCA9ICgoKSA9PiB7XG4gIC8qZXNsaW50IG5vLXVuZGVmOjAqL1xuICBpZiAodHlwZW9mIGdsb2JhbFRoaXMgIT09IFwidW5kZWZpbmVkXCIpIHJldHVybiBnbG9iYWxUaGlzO1xuICByZXR1cm4gdHlwZW9mIHNlbGYgIT09IFwidW5kZWZpbmVkXCIgPyBzZWxmIDogKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnID8gd2luZG93IDogZ2xvYmFsKVxufSkoKTtcblxuY29uc3QgaXNDb250ZXh0RGVmaW5lZCA9IChjb250ZXh0KSA9PiAhaXNVbmRlZmluZWQoY29udGV4dCkgJiYgY29udGV4dCAhPT0gX2dsb2JhbDtcblxuLyoqXG4gKiBBY2NlcHRzIHZhcmFyZ3MgZXhwZWN0aW5nIGVhY2ggYXJndW1lbnQgdG8gYmUgYW4gb2JqZWN0LCB0aGVuXG4gKiBpbW11dGFibHkgbWVyZ2VzIHRoZSBwcm9wZXJ0aWVzIG9mIGVhY2ggb2JqZWN0IGFuZCByZXR1cm5zIHJlc3VsdC5cbiAqXG4gKiBXaGVuIG11bHRpcGxlIG9iamVjdHMgY29udGFpbiB0aGUgc2FtZSBrZXkgdGhlIGxhdGVyIG9iamVjdCBpblxuICogdGhlIGFyZ3VtZW50cyBsaXN0IHdpbGwgdGFrZSBwcmVjZWRlbmNlLlxuICpcbiAqIEV4YW1wbGU6XG4gKlxuICogYGBganNcbiAqIHZhciByZXN1bHQgPSBtZXJnZSh7Zm9vOiAxMjN9LCB7Zm9vOiA0NTZ9KTtcbiAqIGNvbnNvbGUubG9nKHJlc3VsdC5mb28pOyAvLyBvdXRwdXRzIDQ1NlxuICogYGBgXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9iajEgT2JqZWN0IHRvIG1lcmdlXG4gKlxuICogQHJldHVybnMge09iamVjdH0gUmVzdWx0IG9mIGFsbCBtZXJnZSBwcm9wZXJ0aWVzXG4gKi9cbmZ1bmN0aW9uIG1lcmdlKC8qIG9iajEsIG9iajIsIG9iajMsIC4uLiAqLykge1xuICBjb25zdCB7Y2FzZWxlc3N9ID0gaXNDb250ZXh0RGVmaW5lZCh0aGlzKSAmJiB0aGlzIHx8IHt9O1xuICBjb25zdCByZXN1bHQgPSB7fTtcbiAgY29uc3QgYXNzaWduVmFsdWUgPSAodmFsLCBrZXkpID0+IHtcbiAgICBjb25zdCB0YXJnZXRLZXkgPSBjYXNlbGVzcyAmJiBmaW5kS2V5KHJlc3VsdCwga2V5KSB8fCBrZXk7XG4gICAgaWYgKGlzUGxhaW5PYmplY3QocmVzdWx0W3RhcmdldEtleV0pICYmIGlzUGxhaW5PYmplY3QodmFsKSkge1xuICAgICAgcmVzdWx0W3RhcmdldEtleV0gPSBtZXJnZShyZXN1bHRbdGFyZ2V0S2V5XSwgdmFsKTtcbiAgICB9IGVsc2UgaWYgKGlzUGxhaW5PYmplY3QodmFsKSkge1xuICAgICAgcmVzdWx0W3RhcmdldEtleV0gPSBtZXJnZSh7fSwgdmFsKTtcbiAgICB9IGVsc2UgaWYgKGlzQXJyYXkodmFsKSkge1xuICAgICAgcmVzdWx0W3RhcmdldEtleV0gPSB2YWwuc2xpY2UoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0W3RhcmdldEtleV0gPSB2YWw7XG4gICAgfVxuICB9XG5cbiAgZm9yIChsZXQgaSA9IDAsIGwgPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgYXJndW1lbnRzW2ldICYmIGZvckVhY2goYXJndW1lbnRzW2ldLCBhc3NpZ25WYWx1ZSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBFeHRlbmRzIG9iamVjdCBhIGJ5IG11dGFibHkgYWRkaW5nIHRvIGl0IHRoZSBwcm9wZXJ0aWVzIG9mIG9iamVjdCBiLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBhIFRoZSBvYmplY3QgdG8gYmUgZXh0ZW5kZWRcbiAqIEBwYXJhbSB7T2JqZWN0fSBiIFRoZSBvYmplY3QgdG8gY29weSBwcm9wZXJ0aWVzIGZyb21cbiAqIEBwYXJhbSB7T2JqZWN0fSB0aGlzQXJnIFRoZSBvYmplY3QgdG8gYmluZCBmdW5jdGlvbiB0b1xuICpcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW2FsbE93bktleXNdXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgcmVzdWx0aW5nIHZhbHVlIG9mIG9iamVjdCBhXG4gKi9cbmNvbnN0IGV4dGVuZCA9IChhLCBiLCB0aGlzQXJnLCB7YWxsT3duS2V5c309IHt9KSA9PiB7XG4gIGZvckVhY2goYiwgKHZhbCwga2V5KSA9PiB7XG4gICAgaWYgKHRoaXNBcmcgJiYgaXNGdW5jdGlvbih2YWwpKSB7XG4gICAgICBhW2tleV0gPSBiaW5kKHZhbCwgdGhpc0FyZyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFba2V5XSA9IHZhbDtcbiAgICB9XG4gIH0sIHthbGxPd25LZXlzfSk7XG4gIHJldHVybiBhO1xufVxuXG4vKipcbiAqIFJlbW92ZSBieXRlIG9yZGVyIG1hcmtlci4gVGhpcyBjYXRjaGVzIEVGIEJCIEJGICh0aGUgVVRGLTggQk9NKVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb250ZW50IHdpdGggQk9NXG4gKlxuICogQHJldHVybnMge3N0cmluZ30gY29udGVudCB2YWx1ZSB3aXRob3V0IEJPTVxuICovXG5jb25zdCBzdHJpcEJPTSA9IChjb250ZW50KSA9PiB7XG4gIGlmIChjb250ZW50LmNoYXJDb2RlQXQoMCkgPT09IDB4RkVGRikge1xuICAgIGNvbnRlbnQgPSBjb250ZW50LnNsaWNlKDEpO1xuICB9XG4gIHJldHVybiBjb250ZW50O1xufVxuXG4vKipcbiAqIEluaGVyaXQgdGhlIHByb3RvdHlwZSBtZXRob2RzIGZyb20gb25lIGNvbnN0cnVjdG9yIGludG8gYW5vdGhlclxuICogQHBhcmFtIHtmdW5jdGlvbn0gY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IHN1cGVyQ29uc3RydWN0b3JcbiAqIEBwYXJhbSB7b2JqZWN0fSBbcHJvcHNdXG4gKiBAcGFyYW0ge29iamVjdH0gW2Rlc2NyaXB0b3JzXVxuICpcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5jb25zdCBpbmhlcml0cyA9IChjb25zdHJ1Y3Rvciwgc3VwZXJDb25zdHJ1Y3RvciwgcHJvcHMsIGRlc2NyaXB0b3JzKSA9PiB7XG4gIGNvbnN0cnVjdG9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIGRlc2NyaXB0b3JzKTtcbiAgY29uc3RydWN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gY29uc3RydWN0b3I7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb25zdHJ1Y3RvciwgJ3N1cGVyJywge1xuICAgIHZhbHVlOiBzdXBlckNvbnN0cnVjdG9yLnByb3RvdHlwZVxuICB9KTtcbiAgcHJvcHMgJiYgT2JqZWN0LmFzc2lnbihjb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3BzKTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIG9iamVjdCB3aXRoIGRlZXAgcHJvdG90eXBlIGNoYWluIHRvIGEgZmxhdCBvYmplY3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2VPYmogc291cmNlIG9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IFtkZXN0T2JqXVxuICogQHBhcmFtIHtGdW5jdGlvbnxCb29sZWFufSBbZmlsdGVyXVxuICogQHBhcmFtIHtGdW5jdGlvbn0gW3Byb3BGaWx0ZXJdXG4gKlxuICogQHJldHVybnMge09iamVjdH1cbiAqL1xuY29uc3QgdG9GbGF0T2JqZWN0ID0gKHNvdXJjZU9iaiwgZGVzdE9iaiwgZmlsdGVyLCBwcm9wRmlsdGVyKSA9PiB7XG4gIGxldCBwcm9wcztcbiAgbGV0IGk7XG4gIGxldCBwcm9wO1xuICBjb25zdCBtZXJnZWQgPSB7fTtcblxuICBkZXN0T2JqID0gZGVzdE9iaiB8fCB7fTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWVxLW51bGwsZXFlcWVxXG4gIGlmIChzb3VyY2VPYmogPT0gbnVsbCkgcmV0dXJuIGRlc3RPYmo7XG5cbiAgZG8ge1xuICAgIHByb3BzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoc291cmNlT2JqKTtcbiAgICBpID0gcHJvcHMubGVuZ3RoO1xuICAgIHdoaWxlIChpLS0gPiAwKSB7XG4gICAgICBwcm9wID0gcHJvcHNbaV07XG4gICAgICBpZiAoKCFwcm9wRmlsdGVyIHx8IHByb3BGaWx0ZXIocHJvcCwgc291cmNlT2JqLCBkZXN0T2JqKSkgJiYgIW1lcmdlZFtwcm9wXSkge1xuICAgICAgICBkZXN0T2JqW3Byb3BdID0gc291cmNlT2JqW3Byb3BdO1xuICAgICAgICBtZXJnZWRbcHJvcF0gPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICBzb3VyY2VPYmogPSBmaWx0ZXIgIT09IGZhbHNlICYmIGdldFByb3RvdHlwZU9mKHNvdXJjZU9iaik7XG4gIH0gd2hpbGUgKHNvdXJjZU9iaiAmJiAoIWZpbHRlciB8fCBmaWx0ZXIoc291cmNlT2JqLCBkZXN0T2JqKSkgJiYgc291cmNlT2JqICE9PSBPYmplY3QucHJvdG90eXBlKTtcblxuICByZXR1cm4gZGVzdE9iajtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgYSBzdHJpbmcgZW5kcyB3aXRoIHRoZSBjaGFyYWN0ZXJzIG9mIGEgc3BlY2lmaWVkIHN0cmluZ1xuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBzZWFyY2hTdHJpbmdcbiAqIEBwYXJhbSB7TnVtYmVyfSBbcG9zaXRpb249IDBdXG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGVuZHNXaXRoID0gKHN0ciwgc2VhcmNoU3RyaW5nLCBwb3NpdGlvbikgPT4ge1xuICBzdHIgPSBTdHJpbmcoc3RyKTtcbiAgaWYgKHBvc2l0aW9uID09PSB1bmRlZmluZWQgfHwgcG9zaXRpb24gPiBzdHIubGVuZ3RoKSB7XG4gICAgcG9zaXRpb24gPSBzdHIubGVuZ3RoO1xuICB9XG4gIHBvc2l0aW9uIC09IHNlYXJjaFN0cmluZy5sZW5ndGg7XG4gIGNvbnN0IGxhc3RJbmRleCA9IHN0ci5pbmRleE9mKHNlYXJjaFN0cmluZywgcG9zaXRpb24pO1xuICByZXR1cm4gbGFzdEluZGV4ICE9PSAtMSAmJiBsYXN0SW5kZXggPT09IHBvc2l0aW9uO1xufVxuXG5cbi8qKlxuICogUmV0dXJucyBuZXcgYXJyYXkgZnJvbSBhcnJheSBsaWtlIG9iamVjdCBvciBudWxsIGlmIGZhaWxlZFxuICpcbiAqIEBwYXJhbSB7Kn0gW3RoaW5nXVxuICpcbiAqIEByZXR1cm5zIHs/QXJyYXl9XG4gKi9cbmNvbnN0IHRvQXJyYXkgPSAodGhpbmcpID0+IHtcbiAgaWYgKCF0aGluZykgcmV0dXJuIG51bGw7XG4gIGlmIChpc0FycmF5KHRoaW5nKSkgcmV0dXJuIHRoaW5nO1xuICBsZXQgaSA9IHRoaW5nLmxlbmd0aDtcbiAgaWYgKCFpc051bWJlcihpKSkgcmV0dXJuIG51bGw7XG4gIGNvbnN0IGFyciA9IG5ldyBBcnJheShpKTtcbiAgd2hpbGUgKGktLSA+IDApIHtcbiAgICBhcnJbaV0gPSB0aGluZ1tpXTtcbiAgfVxuICByZXR1cm4gYXJyO1xufVxuXG4vKipcbiAqIENoZWNraW5nIGlmIHRoZSBVaW50OEFycmF5IGV4aXN0cyBhbmQgaWYgaXQgZG9lcywgaXQgcmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgY2hlY2tzIGlmIHRoZVxuICogdGhpbmcgcGFzc2VkIGluIGlzIGFuIGluc3RhbmNlIG9mIFVpbnQ4QXJyYXlcbiAqXG4gKiBAcGFyYW0ge1R5cGVkQXJyYXl9XG4gKlxuICogQHJldHVybnMge0FycmF5fVxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZnVuYy1uYW1lc1xuY29uc3QgaXNUeXBlZEFycmF5ID0gKFR5cGVkQXJyYXkgPT4ge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZnVuYy1uYW1lc1xuICByZXR1cm4gdGhpbmcgPT4ge1xuICAgIHJldHVybiBUeXBlZEFycmF5ICYmIHRoaW5nIGluc3RhbmNlb2YgVHlwZWRBcnJheTtcbiAgfTtcbn0pKHR5cGVvZiBVaW50OEFycmF5ICE9PSAndW5kZWZpbmVkJyAmJiBnZXRQcm90b3R5cGVPZihVaW50OEFycmF5KSk7XG5cbi8qKlxuICogRm9yIGVhY2ggZW50cnkgaW4gdGhlIG9iamVjdCwgY2FsbCB0aGUgZnVuY3Rpb24gd2l0aCB0aGUga2V5IGFuZCB2YWx1ZS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdDxhbnksIGFueT59IG9iaiAtIFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gLSBUaGUgZnVuY3Rpb24gdG8gY2FsbCBmb3IgZWFjaCBlbnRyeS5cbiAqXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuY29uc3QgZm9yRWFjaEVudHJ5ID0gKG9iaiwgZm4pID0+IHtcbiAgY29uc3QgZ2VuZXJhdG9yID0gb2JqICYmIG9ialtTeW1ib2wuaXRlcmF0b3JdO1xuXG4gIGNvbnN0IGl0ZXJhdG9yID0gZ2VuZXJhdG9yLmNhbGwob2JqKTtcblxuICBsZXQgcmVzdWx0O1xuXG4gIHdoaWxlICgocmVzdWx0ID0gaXRlcmF0b3IubmV4dCgpKSAmJiAhcmVzdWx0LmRvbmUpIHtcbiAgICBjb25zdCBwYWlyID0gcmVzdWx0LnZhbHVlO1xuICAgIGZuLmNhbGwob2JqLCBwYWlyWzBdLCBwYWlyWzFdKTtcbiAgfVxufVxuXG4vKipcbiAqIEl0IHRha2VzIGEgcmVndWxhciBleHByZXNzaW9uIGFuZCBhIHN0cmluZywgYW5kIHJldHVybnMgYW4gYXJyYXkgb2YgYWxsIHRoZSBtYXRjaGVzXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHJlZ0V4cCAtIFRoZSByZWd1bGFyIGV4cHJlc3Npb24gdG8gbWF0Y2ggYWdhaW5zdC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHIgLSBUaGUgc3RyaW5nIHRvIHNlYXJjaC5cbiAqXG4gKiBAcmV0dXJucyB7QXJyYXk8Ym9vbGVhbj59XG4gKi9cbmNvbnN0IG1hdGNoQWxsID0gKHJlZ0V4cCwgc3RyKSA9PiB7XG4gIGxldCBtYXRjaGVzO1xuICBjb25zdCBhcnIgPSBbXTtcblxuICB3aGlsZSAoKG1hdGNoZXMgPSByZWdFeHAuZXhlYyhzdHIpKSAhPT0gbnVsbCkge1xuICAgIGFyci5wdXNoKG1hdGNoZXMpO1xuICB9XG5cbiAgcmV0dXJuIGFycjtcbn1cblxuLyogQ2hlY2tpbmcgaWYgdGhlIGtpbmRPZlRlc3QgZnVuY3Rpb24gcmV0dXJucyB0cnVlIHdoZW4gcGFzc2VkIGFuIEhUTUxGb3JtRWxlbWVudC4gKi9cbmNvbnN0IGlzSFRNTEZvcm0gPSBraW5kT2ZUZXN0KCdIVE1MRm9ybUVsZW1lbnQnKTtcblxuY29uc3QgdG9DYW1lbENhc2UgPSBzdHIgPT4ge1xuICByZXR1cm4gc3RyLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvWy1fXFxzXShbYS16XFxkXSkoXFx3KikvZyxcbiAgICBmdW5jdGlvbiByZXBsYWNlcihtLCBwMSwgcDIpIHtcbiAgICAgIHJldHVybiBwMS50b1VwcGVyQ2FzZSgpICsgcDI7XG4gICAgfVxuICApO1xufTtcblxuLyogQ3JlYXRpbmcgYSBmdW5jdGlvbiB0aGF0IHdpbGwgY2hlY2sgaWYgYW4gb2JqZWN0IGhhcyBhIHByb3BlcnR5LiAqL1xuY29uc3QgaGFzT3duUHJvcGVydHkgPSAoKHtoYXNPd25Qcm9wZXJ0eX0pID0+IChvYmosIHByb3ApID0+IGhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKSkoT2JqZWN0LnByb3RvdHlwZSk7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBSZWdFeHAgb2JqZWN0XG4gKlxuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIFJlZ0V4cCBvYmplY3QsIG90aGVyd2lzZSBmYWxzZVxuICovXG5jb25zdCBpc1JlZ0V4cCA9IGtpbmRPZlRlc3QoJ1JlZ0V4cCcpO1xuXG5jb25zdCByZWR1Y2VEZXNjcmlwdG9ycyA9IChvYmosIHJlZHVjZXIpID0+IHtcbiAgY29uc3QgZGVzY3JpcHRvcnMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhvYmopO1xuICBjb25zdCByZWR1Y2VkRGVzY3JpcHRvcnMgPSB7fTtcblxuICBmb3JFYWNoKGRlc2NyaXB0b3JzLCAoZGVzY3JpcHRvciwgbmFtZSkgPT4ge1xuICAgIGxldCByZXQ7XG4gICAgaWYgKChyZXQgPSByZWR1Y2VyKGRlc2NyaXB0b3IsIG5hbWUsIG9iaikpICE9PSBmYWxzZSkge1xuICAgICAgcmVkdWNlZERlc2NyaXB0b3JzW25hbWVdID0gcmV0IHx8IGRlc2NyaXB0b3I7XG4gICAgfVxuICB9KTtcblxuICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhvYmosIHJlZHVjZWREZXNjcmlwdG9ycyk7XG59XG5cbi8qKlxuICogTWFrZXMgYWxsIG1ldGhvZHMgcmVhZC1vbmx5XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqXG4gKi9cblxuY29uc3QgZnJlZXplTWV0aG9kcyA9IChvYmopID0+IHtcbiAgcmVkdWNlRGVzY3JpcHRvcnMob2JqLCAoZGVzY3JpcHRvciwgbmFtZSkgPT4ge1xuICAgIC8vIHNraXAgcmVzdHJpY3RlZCBwcm9wcyBpbiBzdHJpY3QgbW9kZVxuICAgIGlmIChpc0Z1bmN0aW9uKG9iaikgJiYgWydhcmd1bWVudHMnLCAnY2FsbGVyJywgJ2NhbGxlZSddLmluZGV4T2YobmFtZSkgIT09IC0xKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgdmFsdWUgPSBvYmpbbmFtZV07XG5cbiAgICBpZiAoIWlzRnVuY3Rpb24odmFsdWUpKSByZXR1cm47XG5cbiAgICBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBmYWxzZTtcblxuICAgIGlmICgnd3JpdGFibGUnIGluIGRlc2NyaXB0b3IpIHtcbiAgICAgIGRlc2NyaXB0b3Iud3JpdGFibGUgPSBmYWxzZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIWRlc2NyaXB0b3Iuc2V0KSB7XG4gICAgICBkZXNjcmlwdG9yLnNldCA9ICgpID0+IHtcbiAgICAgICAgdGhyb3cgRXJyb3IoJ0NhbiBub3QgcmV3cml0ZSByZWFkLW9ubHkgbWV0aG9kIFxcJycgKyBuYW1lICsgJ1xcJycpO1xuICAgICAgfTtcbiAgICB9XG4gIH0pO1xufVxuXG5jb25zdCB0b09iamVjdFNldCA9IChhcnJheU9yU3RyaW5nLCBkZWxpbWl0ZXIpID0+IHtcbiAgY29uc3Qgb2JqID0ge307XG5cbiAgY29uc3QgZGVmaW5lID0gKGFycikgPT4ge1xuICAgIGFyci5mb3JFYWNoKHZhbHVlID0+IHtcbiAgICAgIG9ialt2YWx1ZV0gPSB0cnVlO1xuICAgIH0pO1xuICB9XG5cbiAgaXNBcnJheShhcnJheU9yU3RyaW5nKSA/IGRlZmluZShhcnJheU9yU3RyaW5nKSA6IGRlZmluZShTdHJpbmcoYXJyYXlPclN0cmluZykuc3BsaXQoZGVsaW1pdGVyKSk7XG5cbiAgcmV0dXJuIG9iajtcbn1cblxuY29uc3Qgbm9vcCA9ICgpID0+IHt9XG5cbmNvbnN0IHRvRmluaXRlTnVtYmVyID0gKHZhbHVlLCBkZWZhdWx0VmFsdWUpID0+IHtcbiAgcmV0dXJuIHZhbHVlICE9IG51bGwgJiYgTnVtYmVyLmlzRmluaXRlKHZhbHVlID0gK3ZhbHVlKSA/IHZhbHVlIDogZGVmYXVsdFZhbHVlO1xufVxuXG4vKipcbiAqIElmIHRoZSB0aGluZyBpcyBhIEZvcm1EYXRhIG9iamVjdCwgcmV0dXJuIHRydWUsIG90aGVyd2lzZSByZXR1cm4gZmFsc2UuXG4gKlxuICogQHBhcmFtIHt1bmtub3dufSB0aGluZyAtIFRoZSB0aGluZyB0byBjaGVjay5cbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaXNTcGVjQ29tcGxpYW50Rm9ybSh0aGluZykge1xuICByZXR1cm4gISEodGhpbmcgJiYgaXNGdW5jdGlvbih0aGluZy5hcHBlbmQpICYmIHRoaW5nW1N5bWJvbC50b1N0cmluZ1RhZ10gPT09ICdGb3JtRGF0YScgJiYgdGhpbmdbU3ltYm9sLml0ZXJhdG9yXSk7XG59XG5cbmNvbnN0IHRvSlNPTk9iamVjdCA9IChvYmopID0+IHtcbiAgY29uc3Qgc3RhY2sgPSBuZXcgQXJyYXkoMTApO1xuXG4gIGNvbnN0IHZpc2l0ID0gKHNvdXJjZSwgaSkgPT4ge1xuXG4gICAgaWYgKGlzT2JqZWN0KHNvdXJjZSkpIHtcbiAgICAgIGlmIChzdGFjay5pbmRleE9mKHNvdXJjZSkgPj0gMCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmKCEoJ3RvSlNPTicgaW4gc291cmNlKSkge1xuICAgICAgICBzdGFja1tpXSA9IHNvdXJjZTtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gaXNBcnJheShzb3VyY2UpID8gW10gOiB7fTtcblxuICAgICAgICBmb3JFYWNoKHNvdXJjZSwgKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgICBjb25zdCByZWR1Y2VkVmFsdWUgPSB2aXNpdCh2YWx1ZSwgaSArIDEpO1xuICAgICAgICAgICFpc1VuZGVmaW5lZChyZWR1Y2VkVmFsdWUpICYmICh0YXJnZXRba2V5XSA9IHJlZHVjZWRWYWx1ZSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHN0YWNrW2ldID0gdW5kZWZpbmVkO1xuXG4gICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHNvdXJjZTtcbiAgfVxuXG4gIHJldHVybiB2aXNpdChvYmosIDApO1xufVxuXG5jb25zdCBpc0FzeW5jRm4gPSBraW5kT2ZUZXN0KCdBc3luY0Z1bmN0aW9uJyk7XG5cbmNvbnN0IGlzVGhlbmFibGUgPSAodGhpbmcpID0+XG4gIHRoaW5nICYmIChpc09iamVjdCh0aGluZykgfHwgaXNGdW5jdGlvbih0aGluZykpICYmIGlzRnVuY3Rpb24odGhpbmcudGhlbikgJiYgaXNGdW5jdGlvbih0aGluZy5jYXRjaCk7XG5cbi8vIG9yaWdpbmFsIGNvZGVcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9EaWdpdGFsQnJhaW5KUy9BeGlvc1Byb21pc2UvYmxvYi8xNmRlYWIxMzcxMGVjMDk3Nzk5MjIxMzFmM2ZhNTk1NDMyMGY4M2FiL2xpYi91dGlscy5qcyNMMTEtTDM0XG5cbmNvbnN0IF9zZXRJbW1lZGlhdGUgPSAoKHNldEltbWVkaWF0ZVN1cHBvcnRlZCwgcG9zdE1lc3NhZ2VTdXBwb3J0ZWQpID0+IHtcbiAgaWYgKHNldEltbWVkaWF0ZVN1cHBvcnRlZCkge1xuICAgIHJldHVybiBzZXRJbW1lZGlhdGU7XG4gIH1cblxuICByZXR1cm4gcG9zdE1lc3NhZ2VTdXBwb3J0ZWQgPyAoKHRva2VuLCBjYWxsYmFja3MpID0+IHtcbiAgICBfZ2xvYmFsLmFkZEV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsICh7c291cmNlLCBkYXRhfSkgPT4ge1xuICAgICAgaWYgKHNvdXJjZSA9PT0gX2dsb2JhbCAmJiBkYXRhID09PSB0b2tlbikge1xuICAgICAgICBjYWxsYmFja3MubGVuZ3RoICYmIGNhbGxiYWNrcy5zaGlmdCgpKCk7XG4gICAgICB9XG4gICAgfSwgZmFsc2UpO1xuXG4gICAgcmV0dXJuIChjYikgPT4ge1xuICAgICAgY2FsbGJhY2tzLnB1c2goY2IpO1xuICAgICAgX2dsb2JhbC5wb3N0TWVzc2FnZSh0b2tlbiwgXCIqXCIpO1xuICAgIH1cbiAgfSkoYGF4aW9zQCR7TWF0aC5yYW5kb20oKX1gLCBbXSkgOiAoY2IpID0+IHNldFRpbWVvdXQoY2IpO1xufSkoXG4gIHR5cGVvZiBzZXRJbW1lZGlhdGUgPT09ICdmdW5jdGlvbicsXG4gIGlzRnVuY3Rpb24oX2dsb2JhbC5wb3N0TWVzc2FnZSlcbik7XG5cbmNvbnN0IGFzYXAgPSB0eXBlb2YgcXVldWVNaWNyb3Rhc2sgIT09ICd1bmRlZmluZWQnID9cbiAgcXVldWVNaWNyb3Rhc2suYmluZChfZ2xvYmFsKSA6ICggdHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmIHByb2Nlc3MubmV4dFRpY2sgfHwgX3NldEltbWVkaWF0ZSk7XG5cbi8vICoqKioqKioqKioqKioqKioqKioqKlxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGlzQXJyYXksXG4gIGlzQXJyYXlCdWZmZXIsXG4gIGlzQnVmZmVyLFxuICBpc0Zvcm1EYXRhLFxuICBpc0FycmF5QnVmZmVyVmlldyxcbiAgaXNTdHJpbmcsXG4gIGlzTnVtYmVyLFxuICBpc0Jvb2xlYW4sXG4gIGlzT2JqZWN0LFxuICBpc1BsYWluT2JqZWN0LFxuICBpc1JlYWRhYmxlU3RyZWFtLFxuICBpc1JlcXVlc3QsXG4gIGlzUmVzcG9uc2UsXG4gIGlzSGVhZGVycyxcbiAgaXNVbmRlZmluZWQsXG4gIGlzRGF0ZSxcbiAgaXNGaWxlLFxuICBpc0Jsb2IsXG4gIGlzUmVnRXhwLFxuICBpc0Z1bmN0aW9uLFxuICBpc1N0cmVhbSxcbiAgaXNVUkxTZWFyY2hQYXJhbXMsXG4gIGlzVHlwZWRBcnJheSxcbiAgaXNGaWxlTGlzdCxcbiAgZm9yRWFjaCxcbiAgbWVyZ2UsXG4gIGV4dGVuZCxcbiAgdHJpbSxcbiAgc3RyaXBCT00sXG4gIGluaGVyaXRzLFxuICB0b0ZsYXRPYmplY3QsXG4gIGtpbmRPZixcbiAga2luZE9mVGVzdCxcbiAgZW5kc1dpdGgsXG4gIHRvQXJyYXksXG4gIGZvckVhY2hFbnRyeSxcbiAgbWF0Y2hBbGwsXG4gIGlzSFRNTEZvcm0sXG4gIGhhc093blByb3BlcnR5LFxuICBoYXNPd25Qcm9wOiBoYXNPd25Qcm9wZXJ0eSwgLy8gYW4gYWxpYXMgdG8gYXZvaWQgRVNMaW50IG5vLXByb3RvdHlwZS1idWlsdGlucyBkZXRlY3Rpb25cbiAgcmVkdWNlRGVzY3JpcHRvcnMsXG4gIGZyZWV6ZU1ldGhvZHMsXG4gIHRvT2JqZWN0U2V0LFxuICB0b0NhbWVsQ2FzZSxcbiAgbm9vcCxcbiAgdG9GaW5pdGVOdW1iZXIsXG4gIGZpbmRLZXksXG4gIGdsb2JhbDogX2dsb2JhbCxcbiAgaXNDb250ZXh0RGVmaW5lZCxcbiAgaXNTcGVjQ29tcGxpYW50Rm9ybSxcbiAgdG9KU09OT2JqZWN0LFxuICBpc0FzeW5jRm4sXG4gIGlzVGhlbmFibGUsXG4gIHNldEltbWVkaWF0ZTogX3NldEltbWVkaWF0ZSxcbiAgYXNhcFxufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///1\n")},function(module,__webpack_exports__,__webpack_require__){"use strict";eval('/* WEBPACK VAR INJECTION */(function(process) {/* unused harmony export ServerStyleSheet */\n/* unused harmony export StyleSheetConsumer */\n/* unused harmony export StyleSheetContext */\n/* unused harmony export StyleSheetManager */\n/* unused harmony export ThemeConsumer */\n/* unused harmony export ThemeContext */\n/* unused harmony export ThemeProvider */\n/* unused harmony export __PRIVATE__ */\n/* unused harmony export createGlobalStyle */\n/* unused harmony export css */\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return dt; });\n/* unused harmony export isStyledComponent */\n/* unused harmony export keyframes */\n/* unused harmony export styled */\n/* unused harmony export useTheme */\n/* unused harmony export version */\n/* unused harmony export withTheme */\n/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(8);\n/* harmony import */ var _emotion_is_prop_valid__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(95);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(0);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var shallowequal__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(92);\n/* harmony import */ var shallowequal__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(shallowequal__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var stylis__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(20);\n/* harmony import */ var _emotion_unitless__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(93);\nvar f="undefined"!=typeof process&&void 0!==process.env&&(process.env.REACT_APP_SC_ATTR||process.env.SC_ATTR)||"data-styled",m="active",y="data-styled-version",v="6.1.17",g="/*!sc*/\\n",S="undefined"!=typeof window&&"HTMLElement"in window,w=Boolean("boolean"==typeof SC_DISABLE_SPEEDY?SC_DISABLE_SPEEDY:"undefined"!=typeof process&&void 0!==process.env&&void 0!==process.env.REACT_APP_SC_DISABLE_SPEEDY&&""!==process.env.REACT_APP_SC_DISABLE_SPEEDY?"false"!==process.env.REACT_APP_SC_DISABLE_SPEEDY&&process.env.REACT_APP_SC_DISABLE_SPEEDY:"undefined"!=typeof process&&void 0!==process.env&&void 0!==process.env.SC_DISABLE_SPEEDY&&""!==process.env.SC_DISABLE_SPEEDY?"false"!==process.env.SC_DISABLE_SPEEDY&&process.env.SC_DISABLE_SPEEDY:"production"!=="production"),b={},E=/invalid hook call/i,N=new Set,P=function(t,n){if(false){ var a, o, s, i; }},_=Object.freeze([]),C=Object.freeze({});function I(e,t,n){return void 0===n&&(n=C),e.theme!==n.theme&&e.theme||t||n.theme}var A=new Set(["a","abbr","address","area","article","aside","audio","b","base","bdi","bdo","big","blockquote","body","br","button","canvas","caption","cite","code","col","colgroup","data","datalist","dd","del","details","dfn","dialog","div","dl","dt","em","embed","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","header","hgroup","hr","html","i","iframe","img","input","ins","kbd","keygen","label","legend","li","link","main","map","mark","menu","menuitem","meta","meter","nav","noscript","object","ol","optgroup","option","output","p","param","picture","pre","progress","q","rp","rt","ruby","s","samp","script","section","select","small","source","span","strong","style","sub","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","tr","track","u","ul","use","var","video","wbr","circle","clipPath","defs","ellipse","foreignObject","g","image","line","linearGradient","marker","mask","path","pattern","polygon","polyline","radialGradient","rect","stop","svg","text","tspan"]),O=/[!"#$%&\'()*+,./:;<=>?@[\\\\\\]^`{|}~-]+/g,D=/(^-|-$)/g;function R(e){return e.replace(O,"-").replace(D,"")}var T=/(a)(d)/gi,k=52,j=function(e){return String.fromCharCode(e+(e>25?39:97))};function x(e){var t,n="";for(t=Math.abs(e);t>k;t=t/k|0)n=j(t%k)+n;return(j(t%k)+n).replace(T,"$1-$2")}var V,F=5381,M=function(e,t){for(var n=t.length;n;)e=33*e^t.charCodeAt(--n);return e},z=function(e){return M(F,e)};function $(e){return x(z(e)>>>0)}function B(e){return false||e.displayName||e.name||"Component"}function L(e){return"string"==typeof e&&( true||false)}var G="function"==typeof Symbol&&Symbol.for,Y=G?Symbol.for("react.memo"):60115,W=G?Symbol.for("react.forward_ref"):60112,q={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},H={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},U={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},J=((V={})[W]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},V[Y]=U,V);function X(e){return("type"in(t=e)&&t.type.$$typeof)===Y?U:"$$typeof"in e?J[e.$$typeof]:q;var t}var Z=Object.defineProperty,K=Object.getOwnPropertyNames,Q=Object.getOwnPropertySymbols,ee=Object.getOwnPropertyDescriptor,te=Object.getPrototypeOf,ne=Object.prototype;function oe(e,t,n){if("string"!=typeof t){if(ne){var o=te(t);o&&o!==ne&&oe(e,o,n)}var r=K(t);Q&&(r=r.concat(Q(t)));for(var s=X(e),i=X(t),a=0;a<r.length;++a){var c=r[a];if(!(c in H||n&&n[c]||i&&c in i||s&&c in s)){var l=ee(t,c);try{Z(e,c,l)}catch(e){}}}}return e}function re(e){return"function"==typeof e}function se(e){return"object"==typeof e&&"styledComponentId"in e}function ie(e,t){return e&&t?"".concat(e," ").concat(t):e||t||""}function ae(e,t){if(0===e.length)return"";for(var n=e[0],o=1;o<e.length;o++)n+=t?t+e[o]:e[o];return n}function ce(e){return null!==e&&"object"==typeof e&&e.constructor.name===Object.name&&!("props"in e&&e.$$typeof)}function le(e,t,n){if(void 0===n&&(n=!1),!n&&!ce(e)&&!Array.isArray(e))return t;if(Array.isArray(t))for(var o=0;o<t.length;o++)e[o]=le(e[o],t[o]);else if(ce(t))for(var o in t)e[o]=le(e[o],t[o]);return e}function ue(e,t){Object.defineProperty(e,"toString",{value:t})}var pe= false?undefined:{};function de(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];for(var n=e[0],o=[],r=1,s=e.length;r<s;r+=1)o.push(e[r]);return o.forEach(function(e){n=n.replace(/%[a-z]/,e)}),n}function he(t){for(var n=[],o=1;o<arguments.length;o++)n[o-1]=arguments[o];return true?new Error("An error occurred. See https://github.com/styled-components/styled-components/blob/main/packages/styled-components/src/utils/errors.md#".concat(t," for more information.").concat(n.length>0?" Args: ".concat(n.join(", ")):"")):undefined}var fe=function(){function e(e){this.groupSizes=new Uint32Array(512),this.length=512,this.tag=e}return e.prototype.indexOfGroup=function(e){for(var t=0,n=0;n<e;n++)t+=this.groupSizes[n];return t},e.prototype.insertRules=function(e,t){if(e>=this.groupSizes.length){for(var n=this.groupSizes,o=n.length,r=o;e>=r;)if((r<<=1)<0)throw he(16,"".concat(e));this.groupSizes=new Uint32Array(r),this.groupSizes.set(n),this.length=r;for(var s=o;s<r;s++)this.groupSizes[s]=0}for(var i=this.indexOfGroup(e+1),a=(s=0,t.length);s<a;s++)this.tag.insertRule(i,t[s])&&(this.groupSizes[e]++,i++)},e.prototype.clearGroup=function(e){if(e<this.length){var t=this.groupSizes[e],n=this.indexOfGroup(e),o=n+t;this.groupSizes[e]=0;for(var r=n;r<o;r++)this.tag.deleteRule(n)}},e.prototype.getGroup=function(e){var t="";if(e>=this.length||0===this.groupSizes[e])return t;for(var n=this.groupSizes[e],o=this.indexOfGroup(e),r=o+n,s=o;s<r;s++)t+="".concat(this.tag.getRule(s)).concat(g);return t},e}(),me=1<<30,ye=new Map,ve=new Map,ge=1,Se=function(e){if(ye.has(e))return ye.get(e);for(;ve.has(ge);)ge++;var t=ge++;if(false){}return ye.set(e,t),ve.set(t,e),t},we=function(e,t){ge=t+1,ye.set(e,t),ve.set(t,e)},be="style[".concat(f,"][").concat(y,\'="\').concat(v,\'"]\'),Ee=new RegExp("^".concat(f,\'\\\\.g(\\\\d+)\\\\[id="([\\\\w\\\\d-]+)"\\\\].*?"([^"]*)\')),Ne=function(e,t,n){for(var o,r=n.split(","),s=0,i=r.length;s<i;s++)(o=r[s])&&e.registerName(t,o)},Pe=function(e,t){for(var n,o=(null!==(n=t.textContent)&&void 0!==n?n:"").split(g),r=[],s=0,i=o.length;s<i;s++){var a=o[s].trim();if(a){var c=a.match(Ee);if(c){var l=0|parseInt(c[1],10),u=c[2];0!==l&&(we(u,l),Ne(e,u,c[3]),e.getTag().insertRules(l,r)),r.length=0}else r.push(a)}}},_e=function(e){for(var t=document.querySelectorAll(be),n=0,o=t.length;n<o;n++){var r=t[n];r&&r.getAttribute(f)!==m&&(Pe(e,r),r.parentNode&&r.parentNode.removeChild(r))}};function Ce(){return true?__webpack_require__.nc:undefined}var Ie=function(e){var t=document.head,n=e||t,o=document.createElement("style"),r=function(e){var t=Array.from(e.querySelectorAll("style[".concat(f,"]")));return t[t.length-1]}(n),s=void 0!==r?r.nextSibling:null;o.setAttribute(f,m),o.setAttribute(y,v);var i=Ce();return i&&o.setAttribute("nonce",i),n.insertBefore(o,s),o},Ae=function(){function e(e){this.element=Ie(e),this.element.appendChild(document.createTextNode("")),this.sheet=function(e){if(e.sheet)return e.sheet;for(var t=document.styleSheets,n=0,o=t.length;n<o;n++){var r=t[n];if(r.ownerNode===e)return r}throw he(17)}(this.element),this.length=0}return e.prototype.insertRule=function(e,t){try{return this.sheet.insertRule(t,e),this.length++,!0}catch(e){return!1}},e.prototype.deleteRule=function(e){this.sheet.deleteRule(e),this.length--},e.prototype.getRule=function(e){var t=this.sheet.cssRules[e];return t&&t.cssText?t.cssText:""},e}(),Oe=function(){function e(e){this.element=Ie(e),this.nodes=this.element.childNodes,this.length=0}return e.prototype.insertRule=function(e,t){if(e<=this.length&&e>=0){var n=document.createTextNode(t);return this.element.insertBefore(n,this.nodes[e]||null),this.length++,!0}return!1},e.prototype.deleteRule=function(e){this.element.removeChild(this.nodes[e]),this.length--},e.prototype.getRule=function(e){return e<this.length?this.nodes[e].textContent:""},e}(),De=function(){function e(e){this.rules=[],this.length=0}return e.prototype.insertRule=function(e,t){return e<=this.length&&(this.rules.splice(e,0,t),this.length++,!0)},e.prototype.deleteRule=function(e){this.rules.splice(e,1),this.length--},e.prototype.getRule=function(e){return e<this.length?this.rules[e]:""},e}(),Re=S,Te={isServer:!S,useCSSOMInjection:!w},ke=function(){function e(e,n,o){void 0===e&&(e=C),void 0===n&&(n={});var r=this;this.options=Object(tslib__WEBPACK_IMPORTED_MODULE_0__[/* __assign */ "a"])(Object(tslib__WEBPACK_IMPORTED_MODULE_0__[/* __assign */ "a"])({},Te),e),this.gs=n,this.names=new Map(o),this.server=!!e.isServer,!this.server&&S&&Re&&(Re=!1,_e(this)),ue(this,function(){return function(e){for(var t=e.getTag(),n=t.length,o="",r=function(n){var r=function(e){return ve.get(e)}(n);if(void 0===r)return"continue";var s=e.names.get(r),i=t.getGroup(n);if(void 0===s||!s.size||0===i.length)return"continue";var a="".concat(f,".g").concat(n,\'[id="\').concat(r,\'"]\'),c="";void 0!==s&&s.forEach(function(e){e.length>0&&(c+="".concat(e,","))}),o+="".concat(i).concat(a,\'{content:"\').concat(c,\'"}\').concat(g)},s=0;s<n;s++)r(s);return o}(r)})}return e.registerId=function(e){return Se(e)},e.prototype.rehydrate=function(){!this.server&&S&&_e(this)},e.prototype.reconstructWithOptions=function(n,o){return void 0===o&&(o=!0),new e(Object(tslib__WEBPACK_IMPORTED_MODULE_0__[/* __assign */ "a"])(Object(tslib__WEBPACK_IMPORTED_MODULE_0__[/* __assign */ "a"])({},this.options),n),this.gs,o&&this.names||void 0)},e.prototype.allocateGSInstance=function(e){return this.gs[e]=(this.gs[e]||0)+1},e.prototype.getTag=function(){return this.tag||(this.tag=(e=function(e){var t=e.useCSSOMInjection,n=e.target;return e.isServer?new De(n):t?new Ae(n):new Oe(n)}(this.options),new fe(e)));var e},e.prototype.hasNameForId=function(e,t){return this.names.has(e)&&this.names.get(e).has(t)},e.prototype.registerName=function(e,t){if(Se(e),this.names.has(e))this.names.get(e).add(t);else{var n=new Set;n.add(t),this.names.set(e,n)}},e.prototype.insertRules=function(e,t,n){this.registerName(e,t),this.getTag().insertRules(Se(e),n)},e.prototype.clearNames=function(e){this.names.has(e)&&this.names.get(e).clear()},e.prototype.clearRules=function(e){this.getTag().clearGroup(Se(e)),this.clearNames(e)},e.prototype.clearTag=function(){this.tag=void 0},e}(),je=/&/g,xe=/^\\s*\\/\\/.*$/gm;function Ve(e,t){return e.map(function(e){return"rule"===e.type&&(e.value="".concat(t," ").concat(e.value),e.value=e.value.replaceAll(",",",".concat(t," ")),e.props=e.props.map(function(e){return"".concat(t," ").concat(e)})),Array.isArray(e.children)&&"@keyframes"!==e.type&&(e.children=Ve(e.children,t)),e})}function Fe(e){var t,n,o,r=void 0===e?C:e,s=r.options,i=void 0===s?C:s,a=r.plugins,c=void 0===a?_:a,l=function(e,o,r){return r.startsWith(n)&&r.endsWith(n)&&r.replaceAll(n,"").length>0?".".concat(t):e},u=c.slice();u.push(function(e){e.type===stylis__WEBPACK_IMPORTED_MODULE_4__[/* RULESET */ "a"]&&e.value.includes("&")&&(e.props[0]=e.props[0].replace(je,n).replace(o,l))}),i.prefix&&u.push(stylis__WEBPACK_IMPORTED_MODULE_4__[/* prefixer */ "d"]),u.push(stylis__WEBPACK_IMPORTED_MODULE_4__[/* stringify */ "g"]);var p=function(e,r,s,a){void 0===r&&(r=""),void 0===s&&(s=""),void 0===a&&(a="&"),t=a,n=r,o=new RegExp("\\\\".concat(n,"\\\\b"),"g");var c=e.replace(xe,""),l=stylis__WEBPACK_IMPORTED_MODULE_4__[/* compile */ "b"](s||r?"".concat(s," ").concat(r," { ").concat(c," }"):c);i.namespace&&(l=Ve(l,i.namespace));var p=[];return stylis__WEBPACK_IMPORTED_MODULE_4__[/* serialize */ "f"](l,stylis__WEBPACK_IMPORTED_MODULE_4__[/* middleware */ "c"](u.concat(stylis__WEBPACK_IMPORTED_MODULE_4__[/* rulesheet */ "e"](function(e){return p.push(e)})))),p};return p.hash=c.length?c.reduce(function(e,t){return t.name||he(15),M(e,t.name)},F).toString():"",p}var Me=new ke,ze=Fe(),$e=react__WEBPACK_IMPORTED_MODULE_2___default.a.createContext({shouldForwardProp:void 0,styleSheet:Me,stylis:ze}),Be=$e.Consumer,Le=react__WEBPACK_IMPORTED_MODULE_2___default.a.createContext(void 0);function Ge(){return Object(react__WEBPACK_IMPORTED_MODULE_2__["useContext"])($e)}function Ye(e){var t=Object(react__WEBPACK_IMPORTED_MODULE_2__["useState"])(e.stylisPlugins),n=t[0],r=t[1],c=Ge().styleSheet,l=Object(react__WEBPACK_IMPORTED_MODULE_2__["useMemo"])(function(){var t=c;return e.sheet?t=e.sheet:e.target&&(t=t.reconstructWithOptions({target:e.target},!1)),e.disableCSSOMInjection&&(t=t.reconstructWithOptions({useCSSOMInjection:!1})),t},[e.disableCSSOMInjection,e.sheet,e.target,c]),u=Object(react__WEBPACK_IMPORTED_MODULE_2__["useMemo"])(function(){return Fe({options:{namespace:e.namespace,prefix:e.enableVendorPrefixes},plugins:n})},[e.enableVendorPrefixes,e.namespace,n]);Object(react__WEBPACK_IMPORTED_MODULE_2__["useEffect"])(function(){shallowequal__WEBPACK_IMPORTED_MODULE_3___default()(n,e.stylisPlugins)||r(e.stylisPlugins)},[e.stylisPlugins]);var d=Object(react__WEBPACK_IMPORTED_MODULE_2__["useMemo"])(function(){return{shouldForwardProp:e.shouldForwardProp,styleSheet:l,stylis:u}},[e.shouldForwardProp,l,u]);return react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement($e.Provider,{value:d},react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(Le.Provider,{value:u},e.children))}var We=function(){function e(e,t){var n=this;this.inject=function(e,t){void 0===t&&(t=ze);var o=n.name+t.hash;e.hasNameForId(n.id,o)||e.insertRules(n.id,o,t(n.rules,o,"@keyframes"))},this.name=e,this.id="sc-keyframes-".concat(e),this.rules=t,ue(this,function(){throw he(12,String(n.name))})}return e.prototype.getName=function(e){return void 0===e&&(e=ze),this.name+e.hash},e}(),qe=function(e){return e>="A"&&e<="Z"};function He(e){for(var t="",n=0;n<e.length;n++){var o=e[n];if(1===n&&"-"===o&&"-"===e[0])return e;qe(o)?t+="-"+o.toLowerCase():t+=o}return t.startsWith("ms-")?"-"+t:t}var Ue=function(e){return null==e||!1===e||""===e},Je=function(t){var n,o,r=[];for(var s in t){var i=t[s];t.hasOwnProperty(s)&&!Ue(i)&&(Array.isArray(i)&&i.isCss||re(i)?r.push("".concat(He(s),":"),i,";"):ce(i)?r.push.apply(r,Object(tslib__WEBPACK_IMPORTED_MODULE_0__[/* __spreadArray */ "b"])(Object(tslib__WEBPACK_IMPORTED_MODULE_0__[/* __spreadArray */ "b"])(["".concat(s," {")],Je(i),!1),["}"],!1)):r.push("".concat(He(s),": ").concat((n=s,null==(o=i)||"boolean"==typeof o||""===o?"":"number"!=typeof o||0===o||n in _emotion_unitless__WEBPACK_IMPORTED_MODULE_5__[/* default */ "a"]||n.startsWith("--")?String(o).trim():"".concat(o,"px")),";")))}return r};function Xe(e,t,n,o){if(Ue(e))return[];if(se(e))return[".".concat(e.styledComponentId)];if(re(e)){if(!re(s=e)||s.prototype&&s.prototype.isReactComponent||!t)return[e];var r=e(t);return true||false,Xe(r,t,n,o)}var s;return e instanceof We?n?(e.inject(n,o),[e.getName(o)]):[e]:ce(e)?Je(e):Array.isArray(e)?Array.prototype.concat.apply(_,e.map(function(e){return Xe(e,t,n,o)})):[e.toString()]}function Ze(e){for(var t=0;t<e.length;t+=1){var n=e[t];if(re(n)&&!se(n))return!1}return!0}var Ke=z(v),Qe=function(){function e(e,t,n){this.rules=e,this.staticRulesId="",this.isStatic= true&&(void 0===n||n.isStatic)&&Ze(e),this.componentId=t,this.baseHash=M(Ke,t),this.baseStyle=n,ke.registerId(t)}return e.prototype.generateAndInjectStyles=function(e,t,n){var o=this.baseStyle?this.baseStyle.generateAndInjectStyles(e,t,n):"";if(this.isStatic&&!n.hash)if(this.staticRulesId&&t.hasNameForId(this.componentId,this.staticRulesId))o=ie(o,this.staticRulesId);else{var r=ae(Xe(this.rules,e,t,n)),s=x(M(this.baseHash,r)>>>0);if(!t.hasNameForId(this.componentId,s)){var i=n(r,".".concat(s),void 0,this.componentId);t.insertRules(this.componentId,s,i)}o=ie(o,s),this.staticRulesId=s}else{for(var a=M(this.baseHash,n.hash),c="",l=0;l<this.rules.length;l++){var u=this.rules[l];if("string"==typeof u)c+=u, false&&(false);else if(u){var p=ae(Xe(u,e,t,n));a=M(a,p+l),c+=p}}if(c){var d=x(a>>>0);t.hasNameForId(this.componentId,d)||t.insertRules(this.componentId,d,n(c,".".concat(d),void 0,this.componentId)),o=ie(o,d)}}return o},e}(),et=react__WEBPACK_IMPORTED_MODULE_2___default.a.createContext(void 0),tt=et.Consumer;function nt(){var e=Object(react__WEBPACK_IMPORTED_MODULE_2__["useContext"])(et);if(!e)throw he(18);return e}function ot(e){var n=react__WEBPACK_IMPORTED_MODULE_2___default.a.useContext(et),r=Object(react__WEBPACK_IMPORTED_MODULE_2__["useMemo"])(function(){return function(e,n){if(!e)throw he(14);if(re(e)){var o=e(n);if(false){}return o}if(Array.isArray(e)||"object"!=typeof e)throw he(8);return n?Object(tslib__WEBPACK_IMPORTED_MODULE_0__[/* __assign */ "a"])(Object(tslib__WEBPACK_IMPORTED_MODULE_0__[/* __assign */ "a"])({},n),e):e}(e.theme,n)},[e.theme,n]);return e.children?react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(et.Provider,{value:r},e.children):null}var rt={},st=new Set;function it(e,r,s){var i=se(e),a=e,c=!L(e),p=r.attrs,d=void 0===p?_:p,h=r.componentId,f=void 0===h?function(e,t){var n="string"!=typeof e?"sc":R(e);rt[n]=(rt[n]||0)+1;var o="".concat(n,"-").concat($(v+n+rt[n]));return t?"".concat(t,"-").concat(o):o}(r.displayName,r.parentComponentId):h,m=r.displayName,y=void 0===m?function(e){return L(e)?"styled.".concat(e):"Styled(".concat(B(e),")")}(e):m,g=r.displayName&&r.componentId?"".concat(R(r.displayName),"-").concat(r.componentId):r.componentId||f,S=i&&a.attrs?a.attrs.concat(d).filter(Boolean):d,w=r.shouldForwardProp;if(i&&a.shouldForwardProp){var b=a.shouldForwardProp;if(r.shouldForwardProp){var E=r.shouldForwardProp;w=function(e,t){return b(e,t)&&E(e,t)}}else w=b}var N=new Qe(s,g,i?a.componentStyle:void 0);function O(e,r){return function(e,r,s){var i=e.attrs,a=e.componentStyle,c=e.defaultProps,p=e.foldedComponentIds,d=e.styledComponentId,h=e.target,f=react__WEBPACK_IMPORTED_MODULE_2___default.a.useContext(et),m=Ge(),y=e.shouldForwardProp||m.shouldForwardProp; false&&false;var v=I(r,f,c)||C,g=function(e,n,o){for(var r,s=Object(tslib__WEBPACK_IMPORTED_MODULE_0__[/* __assign */ "a"])(Object(tslib__WEBPACK_IMPORTED_MODULE_0__[/* __assign */ "a"])({},n),{className:void 0,theme:o}),i=0;i<e.length;i+=1){var a=re(r=e[i])?r(s):r;for(var c in a)s[c]="className"===c?ie(s[c],a[c]):"style"===c?Object(tslib__WEBPACK_IMPORTED_MODULE_0__[/* __assign */ "a"])(Object(tslib__WEBPACK_IMPORTED_MODULE_0__[/* __assign */ "a"])({},s[c]),a[c]):a[c]}return n.className&&(s.className=ie(s.className,n.className)),s}(i,r,v),S=g.as||h,w={};for(var b in g)void 0===g[b]||"$"===b[0]||"as"===b||"theme"===b&&g.theme===v||("forwardedAs"===b?w.as=g.forwardedAs:y&&!y(b,S)||(w[b]=g[b],y||"development"!=="production"||Object(_emotion_is_prop_valid__WEBPACK_IMPORTED_MODULE_1__[/* default */ "a"])(b)||st.has(b)||!A.has(S)||(st.add(b),console.warn(\'styled-components: it looks like an unknown prop "\'.concat(b,\'" is being sent through to the DOM, which will likely trigger a React console error. If you would like automatic filtering of unknown props, you can opt-into that behavior via `<StyleSheetManager shouldForwardProp={...}>` (connect an API like `@emotion/is-prop-valid`) or consider using transient props (`$` prefix for automatic filtering.)\')))));var E=function(e,t){var n=Ge(),o=e.generateAndInjectStyles(t,n.styleSheet,n.stylis);return false&&false,o}(a,g); false&&false;var N=ie(p,d);return E&&(N+=" "+E),g.className&&(N+=" "+g.className),w[L(S)&&!A.has(S)?"class":"className"]=N,s&&(w.ref=s),Object(react__WEBPACK_IMPORTED_MODULE_2__["createElement"])(S,w)}(D,e,r)}O.displayName=y;var D=react__WEBPACK_IMPORTED_MODULE_2___default.a.forwardRef(O);return D.attrs=S,D.componentStyle=N,D.displayName=y,D.shouldForwardProp=w,D.foldedComponentIds=i?ie(a.foldedComponentIds,a.styledComponentId):"",D.styledComponentId=g,D.target=i?a.target:e,Object.defineProperty(D,"defaultProps",{get:function(){return this._foldedDefaultProps},set:function(e){this._foldedDefaultProps=i?function(e){for(var t=[],n=1;n<arguments.length;n++)t[n-1]=arguments[n];for(var o=0,r=t;o<r.length;o++)le(e,r[o],!0);return e}({},a.defaultProps,e):e}}), false&&(false),ue(D,function(){return".".concat(D.styledComponentId)}),c&&oe(D,e,{attrs:!0,componentStyle:!0,displayName:!0,foldedComponentIds:!0,shouldForwardProp:!0,styledComponentId:!0,target:!0}),D}function at(e,t){for(var n=[e[0]],o=0,r=t.length;o<r;o+=1)n.push(t[o],e[o+1]);return n}var ct=function(e){return Object.assign(e,{isCss:!0})};function lt(t){for(var n=[],o=1;o<arguments.length;o++)n[o-1]=arguments[o];if(re(t)||ce(t))return ct(Xe(at(_,Object(tslib__WEBPACK_IMPORTED_MODULE_0__[/* __spreadArray */ "b"])([t],n,!0))));var r=t;return 0===n.length&&1===r.length&&"string"==typeof r[0]?Xe(r):ct(Xe(at(r,n)))}function ut(n,o,r){if(void 0===r&&(r=C),!o)throw he(1,o);var s=function(t){for(var s=[],i=1;i<arguments.length;i++)s[i-1]=arguments[i];return n(o,r,lt.apply(void 0,Object(tslib__WEBPACK_IMPORTED_MODULE_0__[/* __spreadArray */ "b"])([t],s,!1)))};return s.attrs=function(e){return ut(n,o,Object(tslib__WEBPACK_IMPORTED_MODULE_0__[/* __assign */ "a"])(Object(tslib__WEBPACK_IMPORTED_MODULE_0__[/* __assign */ "a"])({},r),{attrs:Array.prototype.concat(r.attrs,e).filter(Boolean)}))},s.withConfig=function(e){return ut(n,o,Object(tslib__WEBPACK_IMPORTED_MODULE_0__[/* __assign */ "a"])(Object(tslib__WEBPACK_IMPORTED_MODULE_0__[/* __assign */ "a"])({},r),e))},s}var pt=function(e){return ut(it,e)},dt=pt;A.forEach(function(e){dt[e]=pt(e)});var ht=function(){function e(e,t){this.rules=e,this.componentId=t,this.isStatic=Ze(e),ke.registerId(this.componentId+1)}return e.prototype.createStyles=function(e,t,n,o){var r=o(ae(Xe(this.rules,t,n,o)),""),s=this.componentId+e;n.insertRules(s,s,r)},e.prototype.removeStyles=function(e,t){t.clearRules(this.componentId+e)},e.prototype.renderStyles=function(e,t,n,o){e>2&&ke.registerId(this.componentId+e),this.removeStyles(e,n),this.createStyles(e,t,n,o)},e}();function ft(n){for(var r=[],s=1;s<arguments.length;s++)r[s-1]=arguments[s];var i=lt.apply(void 0,Object(tslib__WEBPACK_IMPORTED_MODULE_0__[/* __spreadArray */ "b"])([n],r,!1)),a="sc-global-".concat($(JSON.stringify(i))),c=new ht(i,a); false&&false;var l=function(e){var t=Ge(),n=react__WEBPACK_IMPORTED_MODULE_2___default.a.useContext(et),r=react__WEBPACK_IMPORTED_MODULE_2___default.a.useRef(t.styleSheet.allocateGSInstance(a)).current;return false&&false, false&&false,t.styleSheet.server&&u(r,e,t.styleSheet,n,t.stylis),react__WEBPACK_IMPORTED_MODULE_2___default.a.useLayoutEffect(function(){if(!t.styleSheet.server)return u(r,e,t.styleSheet,n,t.stylis),function(){return c.removeStyles(r,t.styleSheet)}},[r,e,t.styleSheet,n,t.stylis]),null};function u(e,n,o,r,s){if(c.isStatic)c.renderStyles(e,b,o,s);else{var i=Object(tslib__WEBPACK_IMPORTED_MODULE_0__[/* __assign */ "a"])(Object(tslib__WEBPACK_IMPORTED_MODULE_0__[/* __assign */ "a"])({},n),{theme:I(n,r,l.defaultProps)});c.renderStyles(e,i,o,s)}}return react__WEBPACK_IMPORTED_MODULE_2___default.a.memo(l)}function mt(t){for(var n=[],o=1;o<arguments.length;o++)n[o-1]=arguments[o]; false&&false;var r=ae(lt.apply(void 0,Object(tslib__WEBPACK_IMPORTED_MODULE_0__[/* __spreadArray */ "b"])([t],n,!1))),s=$(r);return new We(s,r)}function yt(e){var n=react__WEBPACK_IMPORTED_MODULE_2___default.a.forwardRef(function(n,r){var s=I(n,react__WEBPACK_IMPORTED_MODULE_2___default.a.useContext(et),e.defaultProps);return false&&false,react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(e,Object(tslib__WEBPACK_IMPORTED_MODULE_0__[/* __assign */ "a"])({},n,{theme:s,ref:r}))});return n.displayName="WithTheme(".concat(B(e),")"),oe(n,e)}var vt=function(){function e(){var e=this;this._emitSheetCSS=function(){var t=e.instance.toString();if(!t)return"";var n=Ce(),o=ae([n&&\'nonce="\'.concat(n,\'"\'),"".concat(f,\'="true"\'),"".concat(y,\'="\').concat(v,\'"\')].filter(Boolean)," ");return"<style ".concat(o,">").concat(t,"</style>")},this.getStyleTags=function(){if(e.sealed)throw he(2);return e._emitSheetCSS()},this.getStyleElement=function(){var n;if(e.sealed)throw he(2);var r=e.instance.toString();if(!r)return[];var s=((n={})[f]="",n[y]=v,n.dangerouslySetInnerHTML={__html:r},n),i=Ce();return i&&(s.nonce=i),[react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement("style",Object(tslib__WEBPACK_IMPORTED_MODULE_0__[/* __assign */ "a"])({},s,{key:"sc-0-0"}))]},this.seal=function(){e.sealed=!0},this.instance=new ke({isServer:!0}),this.sealed=!1}return e.prototype.collectStyles=function(e){if(this.sealed)throw he(2);return react__WEBPACK_IMPORTED_MODULE_2___default.a.createElement(Ye,{sheet:this.instance},e)},e.prototype.interleaveWithNodeStream=function(e){throw he(3)},e}(),gt={StyleSheet:ke,mainSheet:Me}; false&&false;var St="__sc-".concat(f,"__"); false&&(false);\n//# sourceMappingURL=styled-components.browser.esm.js.map\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(16)))//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMi5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9zdHlsZWQtY29tcG9uZW50cy9kaXN0L3N0eWxlZC1jb21wb25lbnRzLmJyb3dzZXIuZXNtLmpzP2JjZTkiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0e19fc3ByZWFkQXJyYXkgYXMgZSxfX2Fzc2lnbiBhcyB0fWZyb21cInRzbGliXCI7aW1wb3J0IG4gZnJvbVwiQGVtb3Rpb24vaXMtcHJvcC12YWxpZFwiO2ltcG9ydCBvLHt1c2VSZWYgYXMgcix1c2VTdGF0ZSBhcyBzLHVzZU1lbW8gYXMgaSx1c2VFZmZlY3QgYXMgYSx1c2VDb250ZXh0IGFzIGMsdXNlRGVidWdWYWx1ZSBhcyBsLGNyZWF0ZUVsZW1lbnQgYXMgdX1mcm9tXCJyZWFjdFwiO2ltcG9ydCBwIGZyb21cInNoYWxsb3dlcXVhbFwiO2ltcG9ydCphcyBkIGZyb21cInN0eWxpc1wiO2ltcG9ydCBoIGZyb21cIkBlbW90aW9uL3VuaXRsZXNzXCI7dmFyIGY9XCJ1bmRlZmluZWRcIiE9dHlwZW9mIHByb2Nlc3MmJnZvaWQgMCE9PXByb2Nlc3MuZW52JiYocHJvY2Vzcy5lbnYuUkVBQ1RfQVBQX1NDX0FUVFJ8fHByb2Nlc3MuZW52LlNDX0FUVFIpfHxcImRhdGEtc3R5bGVkXCIsbT1cImFjdGl2ZVwiLHk9XCJkYXRhLXN0eWxlZC12ZXJzaW9uXCIsdj1cIjYuMS4xN1wiLGc9XCIvKiFzYyovXFxuXCIsUz1cInVuZGVmaW5lZFwiIT10eXBlb2Ygd2luZG93JiZcIkhUTUxFbGVtZW50XCJpbiB3aW5kb3csdz1Cb29sZWFuKFwiYm9vbGVhblwiPT10eXBlb2YgU0NfRElTQUJMRV9TUEVFRFk/U0NfRElTQUJMRV9TUEVFRFk6XCJ1bmRlZmluZWRcIiE9dHlwZW9mIHByb2Nlc3MmJnZvaWQgMCE9PXByb2Nlc3MuZW52JiZ2b2lkIDAhPT1wcm9jZXNzLmVudi5SRUFDVF9BUFBfU0NfRElTQUJMRV9TUEVFRFkmJlwiXCIhPT1wcm9jZXNzLmVudi5SRUFDVF9BUFBfU0NfRElTQUJMRV9TUEVFRFk/XCJmYWxzZVwiIT09cHJvY2Vzcy5lbnYuUkVBQ1RfQVBQX1NDX0RJU0FCTEVfU1BFRURZJiZwcm9jZXNzLmVudi5SRUFDVF9BUFBfU0NfRElTQUJMRV9TUEVFRFk6XCJ1bmRlZmluZWRcIiE9dHlwZW9mIHByb2Nlc3MmJnZvaWQgMCE9PXByb2Nlc3MuZW52JiZ2b2lkIDAhPT1wcm9jZXNzLmVudi5TQ19ESVNBQkxFX1NQRUVEWSYmXCJcIiE9PXByb2Nlc3MuZW52LlNDX0RJU0FCTEVfU1BFRURZP1wiZmFsc2VcIiE9PXByb2Nlc3MuZW52LlNDX0RJU0FCTEVfU1BFRURZJiZwcm9jZXNzLmVudi5TQ19ESVNBQkxFX1NQRUVEWTpcInByb2R1Y3Rpb25cIiE9PXByb2Nlc3MuZW52Lk5PREVfRU5WKSxiPXt9LEU9L2ludmFsaWQgaG9vayBjYWxsL2ksTj1uZXcgU2V0LFA9ZnVuY3Rpb24odCxuKXtpZihcInByb2R1Y3Rpb25cIiE9PXByb2Nlc3MuZW52Lk5PREVfRU5WKXt2YXIgbz1uPycgd2l0aCB0aGUgaWQgb2YgXCInLmNvbmNhdChuLCdcIicpOlwiXCIscz1cIlRoZSBjb21wb25lbnQgXCIuY29uY2F0KHQpLmNvbmNhdChvLFwiIGhhcyBiZWVuIGNyZWF0ZWQgZHluYW1pY2FsbHkuXFxuXCIpK1wiWW91IG1heSBzZWUgdGhpcyB3YXJuaW5nIGJlY2F1c2UgeW91J3ZlIGNhbGxlZCBzdHlsZWQgaW5zaWRlIGFub3RoZXIgY29tcG9uZW50LlxcblRvIHJlc29sdmUgdGhpcyBvbmx5IGNyZWF0ZSBuZXcgU3R5bGVkQ29tcG9uZW50cyBvdXRzaWRlIG9mIGFueSByZW5kZXIgbWV0aG9kIGFuZCBmdW5jdGlvbiBjb21wb25lbnQuXFxuU2VlIGh0dHBzOi8vc3R5bGVkLWNvbXBvbmVudHMuY29tL2RvY3MvYmFzaWNzI2RlZmluZS1zdHlsZWQtY29tcG9uZW50cy1vdXRzaWRlLW9mLXRoZS1yZW5kZXItbWV0aG9kIGZvciBtb3JlIGluZm8uXFxuXCIsaT1jb25zb2xlLmVycm9yO3RyeXt2YXIgYT0hMDtjb25zb2xlLmVycm9yPWZ1bmN0aW9uKHQpe2Zvcih2YXIgbj1bXSxvPTE7bzxhcmd1bWVudHMubGVuZ3RoO28rKyluW28tMV09YXJndW1lbnRzW29dO0UudGVzdCh0KT8oYT0hMSxOLmRlbGV0ZShzKSk6aS5hcHBseSh2b2lkIDAsZShbdF0sbiwhMSkpfSxyKCksYSYmIU4uaGFzKHMpJiYoY29uc29sZS53YXJuKHMpLE4uYWRkKHMpKX1jYXRjaChlKXtFLnRlc3QoZS5tZXNzYWdlKSYmTi5kZWxldGUocyl9ZmluYWxseXtjb25zb2xlLmVycm9yPWl9fX0sXz1PYmplY3QuZnJlZXplKFtdKSxDPU9iamVjdC5mcmVlemUoe30pO2Z1bmN0aW9uIEkoZSx0LG4pe3JldHVybiB2b2lkIDA9PT1uJiYobj1DKSxlLnRoZW1lIT09bi50aGVtZSYmZS50aGVtZXx8dHx8bi50aGVtZX12YXIgQT1uZXcgU2V0KFtcImFcIixcImFiYnJcIixcImFkZHJlc3NcIixcImFyZWFcIixcImFydGljbGVcIixcImFzaWRlXCIsXCJhdWRpb1wiLFwiYlwiLFwiYmFzZVwiLFwiYmRpXCIsXCJiZG9cIixcImJpZ1wiLFwiYmxvY2txdW90ZVwiLFwiYm9keVwiLFwiYnJcIixcImJ1dHRvblwiLFwiY2FudmFzXCIsXCJjYXB0aW9uXCIsXCJjaXRlXCIsXCJjb2RlXCIsXCJjb2xcIixcImNvbGdyb3VwXCIsXCJkYXRhXCIsXCJkYXRhbGlzdFwiLFwiZGRcIixcImRlbFwiLFwiZGV0YWlsc1wiLFwiZGZuXCIsXCJkaWFsb2dcIixcImRpdlwiLFwiZGxcIixcImR0XCIsXCJlbVwiLFwiZW1iZWRcIixcImZpZWxkc2V0XCIsXCJmaWdjYXB0aW9uXCIsXCJmaWd1cmVcIixcImZvb3RlclwiLFwiZm9ybVwiLFwiaDFcIixcImgyXCIsXCJoM1wiLFwiaDRcIixcImg1XCIsXCJoNlwiLFwiaGVhZGVyXCIsXCJoZ3JvdXBcIixcImhyXCIsXCJodG1sXCIsXCJpXCIsXCJpZnJhbWVcIixcImltZ1wiLFwiaW5wdXRcIixcImluc1wiLFwia2JkXCIsXCJrZXlnZW5cIixcImxhYmVsXCIsXCJsZWdlbmRcIixcImxpXCIsXCJsaW5rXCIsXCJtYWluXCIsXCJtYXBcIixcIm1hcmtcIixcIm1lbnVcIixcIm1lbnVpdGVtXCIsXCJtZXRhXCIsXCJtZXRlclwiLFwibmF2XCIsXCJub3NjcmlwdFwiLFwib2JqZWN0XCIsXCJvbFwiLFwib3B0Z3JvdXBcIixcIm9wdGlvblwiLFwib3V0cHV0XCIsXCJwXCIsXCJwYXJhbVwiLFwicGljdHVyZVwiLFwicHJlXCIsXCJwcm9ncmVzc1wiLFwicVwiLFwicnBcIixcInJ0XCIsXCJydWJ5XCIsXCJzXCIsXCJzYW1wXCIsXCJzY3JpcHRcIixcInNlY3Rpb25cIixcInNlbGVjdFwiLFwic21hbGxcIixcInNvdXJjZVwiLFwic3BhblwiLFwic3Ryb25nXCIsXCJzdHlsZVwiLFwic3ViXCIsXCJzdW1tYXJ5XCIsXCJzdXBcIixcInRhYmxlXCIsXCJ0Ym9keVwiLFwidGRcIixcInRleHRhcmVhXCIsXCJ0Zm9vdFwiLFwidGhcIixcInRoZWFkXCIsXCJ0aW1lXCIsXCJ0clwiLFwidHJhY2tcIixcInVcIixcInVsXCIsXCJ1c2VcIixcInZhclwiLFwidmlkZW9cIixcIndiclwiLFwiY2lyY2xlXCIsXCJjbGlwUGF0aFwiLFwiZGVmc1wiLFwiZWxsaXBzZVwiLFwiZm9yZWlnbk9iamVjdFwiLFwiZ1wiLFwiaW1hZ2VcIixcImxpbmVcIixcImxpbmVhckdyYWRpZW50XCIsXCJtYXJrZXJcIixcIm1hc2tcIixcInBhdGhcIixcInBhdHRlcm5cIixcInBvbHlnb25cIixcInBvbHlsaW5lXCIsXCJyYWRpYWxHcmFkaWVudFwiLFwicmVjdFwiLFwic3RvcFwiLFwic3ZnXCIsXCJ0ZXh0XCIsXCJ0c3BhblwiXSksTz0vWyFcIiMkJSYnKCkqKywuLzo7PD0+P0BbXFxcXFxcXV5ge3x9fi1dKy9nLEQ9LyheLXwtJCkvZztmdW5jdGlvbiBSKGUpe3JldHVybiBlLnJlcGxhY2UoTyxcIi1cIikucmVwbGFjZShELFwiXCIpfXZhciBUPS8oYSkoZCkvZ2ksaz01MixqPWZ1bmN0aW9uKGUpe3JldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGUrKGU+MjU/Mzk6OTcpKX07ZnVuY3Rpb24geChlKXt2YXIgdCxuPVwiXCI7Zm9yKHQ9TWF0aC5hYnMoZSk7dD5rO3Q9dC9rfDApbj1qKHQlaykrbjtyZXR1cm4oaih0JWspK24pLnJlcGxhY2UoVCxcIiQxLSQyXCIpfXZhciBWLEY9NTM4MSxNPWZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPXQubGVuZ3RoO247KWU9MzMqZV50LmNoYXJDb2RlQXQoLS1uKTtyZXR1cm4gZX0sej1mdW5jdGlvbihlKXtyZXR1cm4gTShGLGUpfTtmdW5jdGlvbiAkKGUpe3JldHVybiB4KHooZSk+Pj4wKX1mdW5jdGlvbiBCKGUpe3JldHVyblwicHJvZHVjdGlvblwiIT09cHJvY2Vzcy5lbnYuTk9ERV9FTlYmJlwic3RyaW5nXCI9PXR5cGVvZiBlJiZlfHxlLmRpc3BsYXlOYW1lfHxlLm5hbWV8fFwiQ29tcG9uZW50XCJ9ZnVuY3Rpb24gTChlKXtyZXR1cm5cInN0cmluZ1wiPT10eXBlb2YgZSYmKFwicHJvZHVjdGlvblwiPT09cHJvY2Vzcy5lbnYuTk9ERV9FTlZ8fGUuY2hhckF0KDApPT09ZS5jaGFyQXQoMCkudG9Mb3dlckNhc2UoKSl9dmFyIEc9XCJmdW5jdGlvblwiPT10eXBlb2YgU3ltYm9sJiZTeW1ib2wuZm9yLFk9Rz9TeW1ib2wuZm9yKFwicmVhY3QubWVtb1wiKTo2MDExNSxXPUc/U3ltYm9sLmZvcihcInJlYWN0LmZvcndhcmRfcmVmXCIpOjYwMTEyLHE9e2NoaWxkQ29udGV4dFR5cGVzOiEwLGNvbnRleHRUeXBlOiEwLGNvbnRleHRUeXBlczohMCxkZWZhdWx0UHJvcHM6ITAsZGlzcGxheU5hbWU6ITAsZ2V0RGVmYXVsdFByb3BzOiEwLGdldERlcml2ZWRTdGF0ZUZyb21FcnJvcjohMCxnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHM6ITAsbWl4aW5zOiEwLHByb3BUeXBlczohMCx0eXBlOiEwfSxIPXtuYW1lOiEwLGxlbmd0aDohMCxwcm90b3R5cGU6ITAsY2FsbGVyOiEwLGNhbGxlZTohMCxhcmd1bWVudHM6ITAsYXJpdHk6ITB9LFU9eyQkdHlwZW9mOiEwLGNvbXBhcmU6ITAsZGVmYXVsdFByb3BzOiEwLGRpc3BsYXlOYW1lOiEwLHByb3BUeXBlczohMCx0eXBlOiEwfSxKPSgoVj17fSlbV109eyQkdHlwZW9mOiEwLHJlbmRlcjohMCxkZWZhdWx0UHJvcHM6ITAsZGlzcGxheU5hbWU6ITAscHJvcFR5cGVzOiEwfSxWW1ldPVUsVik7ZnVuY3Rpb24gWChlKXtyZXR1cm4oXCJ0eXBlXCJpbih0PWUpJiZ0LnR5cGUuJCR0eXBlb2YpPT09WT9VOlwiJCR0eXBlb2ZcImluIGU/SltlLiQkdHlwZW9mXTpxO3ZhciB0fXZhciBaPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSxLPU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzLFE9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyxlZT1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLHRlPU9iamVjdC5nZXRQcm90b3R5cGVPZixuZT1PYmplY3QucHJvdG90eXBlO2Z1bmN0aW9uIG9lKGUsdCxuKXtpZihcInN0cmluZ1wiIT10eXBlb2YgdCl7aWYobmUpe3ZhciBvPXRlKHQpO28mJm8hPT1uZSYmb2UoZSxvLG4pfXZhciByPUsodCk7USYmKHI9ci5jb25jYXQoUSh0KSkpO2Zvcih2YXIgcz1YKGUpLGk9WCh0KSxhPTA7YTxyLmxlbmd0aDsrK2Epe3ZhciBjPXJbYV07aWYoIShjIGluIEh8fG4mJm5bY118fGkmJmMgaW4gaXx8cyYmYyBpbiBzKSl7dmFyIGw9ZWUodCxjKTt0cnl7WihlLGMsbCl9Y2F0Y2goZSl7fX19fXJldHVybiBlfWZ1bmN0aW9uIHJlKGUpe3JldHVyblwiZnVuY3Rpb25cIj09dHlwZW9mIGV9ZnVuY3Rpb24gc2UoZSl7cmV0dXJuXCJvYmplY3RcIj09dHlwZW9mIGUmJlwic3R5bGVkQ29tcG9uZW50SWRcImluIGV9ZnVuY3Rpb24gaWUoZSx0KXtyZXR1cm4gZSYmdD9cIlwiLmNvbmNhdChlLFwiIFwiKS5jb25jYXQodCk6ZXx8dHx8XCJcIn1mdW5jdGlvbiBhZShlLHQpe2lmKDA9PT1lLmxlbmd0aClyZXR1cm5cIlwiO2Zvcih2YXIgbj1lWzBdLG89MTtvPGUubGVuZ3RoO28rKyluKz10P3QrZVtvXTplW29dO3JldHVybiBufWZ1bmN0aW9uIGNlKGUpe3JldHVybiBudWxsIT09ZSYmXCJvYmplY3RcIj09dHlwZW9mIGUmJmUuY29uc3RydWN0b3IubmFtZT09PU9iamVjdC5uYW1lJiYhKFwicHJvcHNcImluIGUmJmUuJCR0eXBlb2YpfWZ1bmN0aW9uIGxlKGUsdCxuKXtpZih2b2lkIDA9PT1uJiYobj0hMSksIW4mJiFjZShlKSYmIUFycmF5LmlzQXJyYXkoZSkpcmV0dXJuIHQ7aWYoQXJyYXkuaXNBcnJheSh0KSlmb3IodmFyIG89MDtvPHQubGVuZ3RoO28rKyllW29dPWxlKGVbb10sdFtvXSk7ZWxzZSBpZihjZSh0KSlmb3IodmFyIG8gaW4gdCllW29dPWxlKGVbb10sdFtvXSk7cmV0dXJuIGV9ZnVuY3Rpb24gdWUoZSx0KXtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcInRvU3RyaW5nXCIse3ZhbHVlOnR9KX12YXIgcGU9XCJwcm9kdWN0aW9uXCIhPT1wcm9jZXNzLmVudi5OT0RFX0VOVj97MTpcIkNhbm5vdCBjcmVhdGUgc3R5bGVkLWNvbXBvbmVudCBmb3IgY29tcG9uZW50OiAlcy5cXG5cXG5cIiwyOlwiQ2FuJ3QgY29sbGVjdCBzdHlsZXMgb25jZSB5b3UndmUgY29uc3VtZWQgYSBgU2VydmVyU3R5bGVTaGVldGAncyBzdHlsZXMhIGBTZXJ2ZXJTdHlsZVNoZWV0YCBpcyBhIG9uZSBvZmYgaW5zdGFuY2UgZm9yIGVhY2ggc2VydmVyLXNpZGUgcmVuZGVyIGN5Y2xlLlxcblxcbi0gQXJlIHlvdSB0cnlpbmcgdG8gcmV1c2UgaXQgYWNyb3NzIHJlbmRlcnM/XFxuLSBBcmUgeW91IGFjY2lkZW50YWxseSBjYWxsaW5nIGNvbGxlY3RTdHlsZXMgdHdpY2U/XFxuXFxuXCIsMzpcIlN0cmVhbWluZyBTU1IgaXMgb25seSBzdXBwb3J0ZWQgaW4gYSBOb2RlLmpzIGVudmlyb25tZW50OyBQbGVhc2UgZG8gbm90IHRyeSB0byBjYWxsIHRoaXMgbWV0aG9kIGluIHRoZSBicm93c2VyLlxcblxcblwiLDQ6XCJUaGUgYFN0eWxlU2hlZXRNYW5hZ2VyYCBleHBlY3RzIGEgdmFsaWQgdGFyZ2V0IG9yIHNoZWV0IHByb3AhXFxuXFxuLSBEb2VzIHRoaXMgZXJyb3Igb2NjdXIgb24gdGhlIGNsaWVudCBhbmQgaXMgeW91ciB0YXJnZXQgZmFsc3k/XFxuLSBEb2VzIHRoaXMgZXJyb3Igb2NjdXIgb24gdGhlIHNlcnZlciBhbmQgaXMgdGhlIHNoZWV0IGZhbHN5P1xcblxcblwiLDU6XCJUaGUgY2xvbmUgbWV0aG9kIGNhbm5vdCBiZSB1c2VkIG9uIHRoZSBjbGllbnQhXFxuXFxuLSBBcmUgeW91IHJ1bm5pbmcgaW4gYSBjbGllbnQtbGlrZSBlbnZpcm9ubWVudCBvbiB0aGUgc2VydmVyP1xcbi0gQXJlIHlvdSB0cnlpbmcgdG8gcnVuIFNTUiBvbiB0aGUgY2xpZW50P1xcblxcblwiLDY6XCJUcnlpbmcgdG8gaW5zZXJ0IGEgbmV3IHN0eWxlIHRhZywgYnV0IHRoZSBnaXZlbiBOb2RlIGlzIHVubW91bnRlZCFcXG5cXG4tIEFyZSB5b3UgdXNpbmcgYSBjdXN0b20gdGFyZ2V0IHRoYXQgaXNuJ3QgbW91bnRlZD9cXG4tIERvZXMgeW91ciBkb2N1bWVudCBub3QgaGF2ZSBhIHZhbGlkIGhlYWQgZWxlbWVudD9cXG4tIEhhdmUgeW91IGFjY2lkZW50YWxseSByZW1vdmVkIGEgc3R5bGUgdGFnIG1hbnVhbGx5P1xcblxcblwiLDc6J1RoZW1lUHJvdmlkZXI6IFBsZWFzZSByZXR1cm4gYW4gb2JqZWN0IGZyb20geW91ciBcInRoZW1lXCIgcHJvcCBmdW5jdGlvbiwgZS5nLlxcblxcbmBgYGpzXFxudGhlbWU9eygpID0+ICh7fSl9XFxuYGBgXFxuXFxuJyw4OidUaGVtZVByb3ZpZGVyOiBQbGVhc2UgbWFrZSB5b3VyIFwidGhlbWVcIiBwcm9wIGFuIG9iamVjdC5cXG5cXG4nLDk6XCJNaXNzaW5nIGRvY3VtZW50IGA8aGVhZD5gXFxuXFxuXCIsMTA6XCJDYW5ub3QgZmluZCBhIFN0eWxlU2hlZXQgaW5zdGFuY2UuIFVzdWFsbHkgdGhpcyBoYXBwZW5zIGlmIHRoZXJlIGFyZSBtdWx0aXBsZSBjb3BpZXMgb2Ygc3R5bGVkLWNvbXBvbmVudHMgbG9hZGVkIGF0IG9uY2UuIENoZWNrIG91dCB0aGlzIGlzc3VlIGZvciBob3cgdG8gdHJvdWJsZXNob290IGFuZCBmaXggdGhlIGNvbW1vbiBjYXNlcyB3aGVyZSB0aGlzIHNpdHVhdGlvbiBjYW4gaGFwcGVuOiBodHRwczovL2dpdGh1Yi5jb20vc3R5bGVkLWNvbXBvbmVudHMvc3R5bGVkLWNvbXBvbmVudHMvaXNzdWVzLzE5NDEjaXNzdWVjb21tZW50LTQxNzg2MjAyMVxcblxcblwiLDExOlwiX1RoaXMgZXJyb3Igd2FzIHJlcGxhY2VkIHdpdGggYSBkZXYtdGltZSB3YXJuaW5nLCBpdCB3aWxsIGJlIGRlbGV0ZWQgZm9yIHY0IGZpbmFsLl8gW2NyZWF0ZUdsb2JhbFN0eWxlXSByZWNlaXZlZCBjaGlsZHJlbiB3aGljaCB3aWxsIG5vdCBiZSByZW5kZXJlZC4gUGxlYXNlIHVzZSB0aGUgY29tcG9uZW50IHdpdGhvdXQgcGFzc2luZyBjaGlsZHJlbiBlbGVtZW50cy5cXG5cXG5cIiwxMjpcIkl0IHNlZW1zIHlvdSBhcmUgaW50ZXJwb2xhdGluZyBhIGtleWZyYW1lIGRlY2xhcmF0aW9uICglcykgaW50byBhbiB1bnRhZ2dlZCBzdHJpbmcuIFRoaXMgd2FzIHN1cHBvcnRlZCBpbiBzdHlsZWQtY29tcG9uZW50cyB2MywgYnV0IGlzIG5vdCBsb25nZXIgc3VwcG9ydGVkIGluIHY0IGFzIGtleWZyYW1lcyBhcmUgbm93IGluamVjdGVkIG9uLWRlbWFuZC4gUGxlYXNlIHdyYXAgeW91ciBzdHJpbmcgaW4gdGhlIGNzc1xcXFxgXFxcXGAgaGVscGVyIHdoaWNoIGVuc3VyZXMgdGhlIHN0eWxlcyBhcmUgaW5qZWN0ZWQgY29ycmVjdGx5LiBTZWUgaHR0cHM6Ly93d3cuc3R5bGVkLWNvbXBvbmVudHMuY29tL2RvY3MvYXBpI2Nzc1xcblxcblwiLDEzOlwiJXMgaXMgbm90IGEgc3R5bGVkIGNvbXBvbmVudCBhbmQgY2Fubm90IGJlIHJlZmVycmVkIHRvIHZpYSBjb21wb25lbnQgc2VsZWN0b3IuIFNlZSBodHRwczovL3d3dy5zdHlsZWQtY29tcG9uZW50cy5jb20vZG9jcy9hZHZhbmNlZCNyZWZlcnJpbmctdG8tb3RoZXItY29tcG9uZW50cyBmb3IgbW9yZSBkZXRhaWxzLlxcblxcblwiLDE0OidUaGVtZVByb3ZpZGVyOiBcInRoZW1lXCIgcHJvcCBpcyByZXF1aXJlZC5cXG5cXG4nLDE1OlwiQSBzdHlsaXMgcGx1Z2luIGhhcyBiZWVuIHN1cHBsaWVkIHRoYXQgaXMgbm90IG5hbWVkLiBXZSBuZWVkIGEgbmFtZSBmb3IgZWFjaCBwbHVnaW4gdG8gYmUgYWJsZSB0byBwcmV2ZW50IHN0eWxpbmcgY29sbGlzaW9ucyBiZXR3ZWVuIGRpZmZlcmVudCBzdHlsaXMgY29uZmlndXJhdGlvbnMgd2l0aGluIHRoZSBzYW1lIGFwcC4gQmVmb3JlIHlvdSBwYXNzIHlvdXIgcGx1Z2luIHRvIGA8U3R5bGVTaGVldE1hbmFnZXIgc3R5bGlzUGx1Z2lucz17W119PmAsIHBsZWFzZSBtYWtlIHN1cmUgZWFjaCBwbHVnaW4gaXMgdW5pcXVlbHktbmFtZWQsIGUuZy5cXG5cXG5gYGBqc1xcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShpbXBvcnRlZFBsdWdpbiwgJ25hbWUnLCB7IHZhbHVlOiAnc29tZS11bmlxdWUtbmFtZScgfSk7XFxuYGBgXFxuXFxuXCIsMTY6XCJSZWFjaGVkIHRoZSBsaW1pdCBvZiBob3cgbWFueSBzdHlsZWQgY29tcG9uZW50cyBtYXkgYmUgY3JlYXRlZCBhdCBncm91cCAlcy5cXG5Zb3UgbWF5IG9ubHkgY3JlYXRlIHVwIHRvIDEsMDczLDc0MSw4MjQgY29tcG9uZW50cy4gSWYgeW91J3JlIGNyZWF0aW5nIGNvbXBvbmVudHMgZHluYW1pY2FsbHksXFxuYXMgZm9yIGluc3RhbmNlIGluIHlvdXIgcmVuZGVyIG1ldGhvZCB0aGVuIHlvdSBtYXkgYmUgcnVubmluZyBpbnRvIHRoaXMgbGltaXRhdGlvbi5cXG5cXG5cIiwxNzpcIkNTU1N0eWxlU2hlZXQgY291bGQgbm90IGJlIGZvdW5kIG9uIEhUTUxTdHlsZUVsZW1lbnQuXFxuSGFzIHN0eWxlZC1jb21wb25lbnRzJyBzdHlsZSB0YWcgYmVlbiB1bm1vdW50ZWQgb3IgYWx0ZXJlZCBieSBhbm90aGVyIHNjcmlwdD9cXG5cIiwxODpcIlRoZW1lUHJvdmlkZXI6IFBsZWFzZSBtYWtlIHN1cmUgeW91ciB1c2VUaGVtZSBob29rIGlzIHdpdGhpbiBhIGA8VGhlbWVQcm92aWRlcj5gXCJ9Ont9O2Z1bmN0aW9uIGRlKCl7Zm9yKHZhciBlPVtdLHQ9MDt0PGFyZ3VtZW50cy5sZW5ndGg7dCsrKWVbdF09YXJndW1lbnRzW3RdO2Zvcih2YXIgbj1lWzBdLG89W10scj0xLHM9ZS5sZW5ndGg7cjxzO3IrPTEpby5wdXNoKGVbcl0pO3JldHVybiBvLmZvckVhY2goZnVuY3Rpb24oZSl7bj1uLnJlcGxhY2UoLyVbYS16XS8sZSl9KSxufWZ1bmN0aW9uIGhlKHQpe2Zvcih2YXIgbj1bXSxvPTE7bzxhcmd1bWVudHMubGVuZ3RoO28rKyluW28tMV09YXJndW1lbnRzW29dO3JldHVyblwicHJvZHVjdGlvblwiPT09cHJvY2Vzcy5lbnYuTk9ERV9FTlY/bmV3IEVycm9yKFwiQW4gZXJyb3Igb2NjdXJyZWQuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vc3R5bGVkLWNvbXBvbmVudHMvc3R5bGVkLWNvbXBvbmVudHMvYmxvYi9tYWluL3BhY2thZ2VzL3N0eWxlZC1jb21wb25lbnRzL3NyYy91dGlscy9lcnJvcnMubWQjXCIuY29uY2F0KHQsXCIgZm9yIG1vcmUgaW5mb3JtYXRpb24uXCIpLmNvbmNhdChuLmxlbmd0aD4wP1wiIEFyZ3M6IFwiLmNvbmNhdChuLmpvaW4oXCIsIFwiKSk6XCJcIikpOm5ldyBFcnJvcihkZS5hcHBseSh2b2lkIDAsZShbcGVbdF1dLG4sITEpKS50cmltKCkpfXZhciBmZT1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSl7dGhpcy5ncm91cFNpemVzPW5ldyBVaW50MzJBcnJheSg1MTIpLHRoaXMubGVuZ3RoPTUxMix0aGlzLnRhZz1lfXJldHVybiBlLnByb3RvdHlwZS5pbmRleE9mR3JvdXA9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTAsbj0wO248ZTtuKyspdCs9dGhpcy5ncm91cFNpemVzW25dO3JldHVybiB0fSxlLnByb3RvdHlwZS5pbnNlcnRSdWxlcz1mdW5jdGlvbihlLHQpe2lmKGU+PXRoaXMuZ3JvdXBTaXplcy5sZW5ndGgpe2Zvcih2YXIgbj10aGlzLmdyb3VwU2l6ZXMsbz1uLmxlbmd0aCxyPW87ZT49cjspaWYoKHI8PD0xKTwwKXRocm93IGhlKDE2LFwiXCIuY29uY2F0KGUpKTt0aGlzLmdyb3VwU2l6ZXM9bmV3IFVpbnQzMkFycmF5KHIpLHRoaXMuZ3JvdXBTaXplcy5zZXQobiksdGhpcy5sZW5ndGg9cjtmb3IodmFyIHM9bztzPHI7cysrKXRoaXMuZ3JvdXBTaXplc1tzXT0wfWZvcih2YXIgaT10aGlzLmluZGV4T2ZHcm91cChlKzEpLGE9KHM9MCx0Lmxlbmd0aCk7czxhO3MrKyl0aGlzLnRhZy5pbnNlcnRSdWxlKGksdFtzXSkmJih0aGlzLmdyb3VwU2l6ZXNbZV0rKyxpKyspfSxlLnByb3RvdHlwZS5jbGVhckdyb3VwPWZ1bmN0aW9uKGUpe2lmKGU8dGhpcy5sZW5ndGgpe3ZhciB0PXRoaXMuZ3JvdXBTaXplc1tlXSxuPXRoaXMuaW5kZXhPZkdyb3VwKGUpLG89bit0O3RoaXMuZ3JvdXBTaXplc1tlXT0wO2Zvcih2YXIgcj1uO3I8bztyKyspdGhpcy50YWcuZGVsZXRlUnVsZShuKX19LGUucHJvdG90eXBlLmdldEdyb3VwPWZ1bmN0aW9uKGUpe3ZhciB0PVwiXCI7aWYoZT49dGhpcy5sZW5ndGh8fDA9PT10aGlzLmdyb3VwU2l6ZXNbZV0pcmV0dXJuIHQ7Zm9yKHZhciBuPXRoaXMuZ3JvdXBTaXplc1tlXSxvPXRoaXMuaW5kZXhPZkdyb3VwKGUpLHI9bytuLHM9bztzPHI7cysrKXQrPVwiXCIuY29uY2F0KHRoaXMudGFnLmdldFJ1bGUocykpLmNvbmNhdChnKTtyZXR1cm4gdH0sZX0oKSxtZT0xPDwzMCx5ZT1uZXcgTWFwLHZlPW5ldyBNYXAsZ2U9MSxTZT1mdW5jdGlvbihlKXtpZih5ZS5oYXMoZSkpcmV0dXJuIHllLmdldChlKTtmb3IoO3ZlLmhhcyhnZSk7KWdlKys7dmFyIHQ9Z2UrKztpZihcInByb2R1Y3Rpb25cIiE9PXByb2Nlc3MuZW52Lk5PREVfRU5WJiYoKDB8dCk8MHx8dD5tZSkpdGhyb3cgaGUoMTYsXCJcIi5jb25jYXQodCkpO3JldHVybiB5ZS5zZXQoZSx0KSx2ZS5zZXQodCxlKSx0fSx3ZT1mdW5jdGlvbihlLHQpe2dlPXQrMSx5ZS5zZXQoZSx0KSx2ZS5zZXQodCxlKX0sYmU9XCJzdHlsZVtcIi5jb25jYXQoZixcIl1bXCIpLmNvbmNhdCh5LCc9XCInKS5jb25jYXQodiwnXCJdJyksRWU9bmV3IFJlZ0V4cChcIl5cIi5jb25jYXQoZiwnXFxcXC5nKFxcXFxkKylcXFxcW2lkPVwiKFtcXFxcd1xcXFxkLV0rKVwiXFxcXF0uKj9cIihbXlwiXSopJykpLE5lPWZ1bmN0aW9uKGUsdCxuKXtmb3IodmFyIG8scj1uLnNwbGl0KFwiLFwiKSxzPTAsaT1yLmxlbmd0aDtzPGk7cysrKShvPXJbc10pJiZlLnJlZ2lzdGVyTmFtZSh0LG8pfSxQZT1mdW5jdGlvbihlLHQpe2Zvcih2YXIgbixvPShudWxsIT09KG49dC50ZXh0Q29udGVudCkmJnZvaWQgMCE9PW4/bjpcIlwiKS5zcGxpdChnKSxyPVtdLHM9MCxpPW8ubGVuZ3RoO3M8aTtzKyspe3ZhciBhPW9bc10udHJpbSgpO2lmKGEpe3ZhciBjPWEubWF0Y2goRWUpO2lmKGMpe3ZhciBsPTB8cGFyc2VJbnQoY1sxXSwxMCksdT1jWzJdOzAhPT1sJiYod2UodSxsKSxOZShlLHUsY1szXSksZS5nZXRUYWcoKS5pbnNlcnRSdWxlcyhsLHIpKSxyLmxlbmd0aD0wfWVsc2Ugci5wdXNoKGEpfX19LF9lPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKGJlKSxuPTAsbz10Lmxlbmd0aDtuPG87bisrKXt2YXIgcj10W25dO3ImJnIuZ2V0QXR0cmlidXRlKGYpIT09bSYmKFBlKGUsciksci5wYXJlbnROb2RlJiZyLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQocikpfX07ZnVuY3Rpb24gQ2UoKXtyZXR1cm5cInVuZGVmaW5lZFwiIT10eXBlb2YgX193ZWJwYWNrX25vbmNlX18/X193ZWJwYWNrX25vbmNlX186bnVsbH12YXIgSWU9ZnVuY3Rpb24oZSl7dmFyIHQ9ZG9jdW1lbnQuaGVhZCxuPWV8fHQsbz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3R5bGVcIikscj1mdW5jdGlvbihlKXt2YXIgdD1BcnJheS5mcm9tKGUucXVlcnlTZWxlY3RvckFsbChcInN0eWxlW1wiLmNvbmNhdChmLFwiXVwiKSkpO3JldHVybiB0W3QubGVuZ3RoLTFdfShuKSxzPXZvaWQgMCE9PXI/ci5uZXh0U2libGluZzpudWxsO28uc2V0QXR0cmlidXRlKGYsbSksby5zZXRBdHRyaWJ1dGUoeSx2KTt2YXIgaT1DZSgpO3JldHVybiBpJiZvLnNldEF0dHJpYnV0ZShcIm5vbmNlXCIsaSksbi5pbnNlcnRCZWZvcmUobyxzKSxvfSxBZT1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSl7dGhpcy5lbGVtZW50PUllKGUpLHRoaXMuZWxlbWVudC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShcIlwiKSksdGhpcy5zaGVldD1mdW5jdGlvbihlKXtpZihlLnNoZWV0KXJldHVybiBlLnNoZWV0O2Zvcih2YXIgdD1kb2N1bWVudC5zdHlsZVNoZWV0cyxuPTAsbz10Lmxlbmd0aDtuPG87bisrKXt2YXIgcj10W25dO2lmKHIub3duZXJOb2RlPT09ZSlyZXR1cm4gcn10aHJvdyBoZSgxNyl9KHRoaXMuZWxlbWVudCksdGhpcy5sZW5ndGg9MH1yZXR1cm4gZS5wcm90b3R5cGUuaW5zZXJ0UnVsZT1mdW5jdGlvbihlLHQpe3RyeXtyZXR1cm4gdGhpcy5zaGVldC5pbnNlcnRSdWxlKHQsZSksdGhpcy5sZW5ndGgrKywhMH1jYXRjaChlKXtyZXR1cm4hMX19LGUucHJvdG90eXBlLmRlbGV0ZVJ1bGU9ZnVuY3Rpb24oZSl7dGhpcy5zaGVldC5kZWxldGVSdWxlKGUpLHRoaXMubGVuZ3RoLS19LGUucHJvdG90eXBlLmdldFJ1bGU9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5zaGVldC5jc3NSdWxlc1tlXTtyZXR1cm4gdCYmdC5jc3NUZXh0P3QuY3NzVGV4dDpcIlwifSxlfSgpLE9lPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlKXt0aGlzLmVsZW1lbnQ9SWUoZSksdGhpcy5ub2Rlcz10aGlzLmVsZW1lbnQuY2hpbGROb2Rlcyx0aGlzLmxlbmd0aD0wfXJldHVybiBlLnByb3RvdHlwZS5pbnNlcnRSdWxlPWZ1bmN0aW9uKGUsdCl7aWYoZTw9dGhpcy5sZW5ndGgmJmU+PTApe3ZhciBuPWRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHQpO3JldHVybiB0aGlzLmVsZW1lbnQuaW5zZXJ0QmVmb3JlKG4sdGhpcy5ub2Rlc1tlXXx8bnVsbCksdGhpcy5sZW5ndGgrKywhMH1yZXR1cm4hMX0sZS5wcm90b3R5cGUuZGVsZXRlUnVsZT1mdW5jdGlvbihlKXt0aGlzLmVsZW1lbnQucmVtb3ZlQ2hpbGQodGhpcy5ub2Rlc1tlXSksdGhpcy5sZW5ndGgtLX0sZS5wcm90b3R5cGUuZ2V0UnVsZT1mdW5jdGlvbihlKXtyZXR1cm4gZTx0aGlzLmxlbmd0aD90aGlzLm5vZGVzW2VdLnRleHRDb250ZW50OlwiXCJ9LGV9KCksRGU9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUpe3RoaXMucnVsZXM9W10sdGhpcy5sZW5ndGg9MH1yZXR1cm4gZS5wcm90b3R5cGUuaW5zZXJ0UnVsZT1mdW5jdGlvbihlLHQpe3JldHVybiBlPD10aGlzLmxlbmd0aCYmKHRoaXMucnVsZXMuc3BsaWNlKGUsMCx0KSx0aGlzLmxlbmd0aCsrLCEwKX0sZS5wcm90b3R5cGUuZGVsZXRlUnVsZT1mdW5jdGlvbihlKXt0aGlzLnJ1bGVzLnNwbGljZShlLDEpLHRoaXMubGVuZ3RoLS19LGUucHJvdG90eXBlLmdldFJ1bGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGU8dGhpcy5sZW5ndGg/dGhpcy5ydWxlc1tlXTpcIlwifSxlfSgpLFJlPVMsVGU9e2lzU2VydmVyOiFTLHVzZUNTU09NSW5qZWN0aW9uOiF3fSxrZT1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSxuLG8pe3ZvaWQgMD09PWUmJihlPUMpLHZvaWQgMD09PW4mJihuPXt9KTt2YXIgcj10aGlzO3RoaXMub3B0aW9ucz10KHQoe30sVGUpLGUpLHRoaXMuZ3M9bix0aGlzLm5hbWVzPW5ldyBNYXAobyksdGhpcy5zZXJ2ZXI9ISFlLmlzU2VydmVyLCF0aGlzLnNlcnZlciYmUyYmUmUmJihSZT0hMSxfZSh0aGlzKSksdWUodGhpcyxmdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbihlKXtmb3IodmFyIHQ9ZS5nZXRUYWcoKSxuPXQubGVuZ3RoLG89XCJcIixyPWZ1bmN0aW9uKG4pe3ZhciByPWZ1bmN0aW9uKGUpe3JldHVybiB2ZS5nZXQoZSl9KG4pO2lmKHZvaWQgMD09PXIpcmV0dXJuXCJjb250aW51ZVwiO3ZhciBzPWUubmFtZXMuZ2V0KHIpLGk9dC5nZXRHcm91cChuKTtpZih2b2lkIDA9PT1zfHwhcy5zaXplfHwwPT09aS5sZW5ndGgpcmV0dXJuXCJjb250aW51ZVwiO3ZhciBhPVwiXCIuY29uY2F0KGYsXCIuZ1wiKS5jb25jYXQobiwnW2lkPVwiJykuY29uY2F0KHIsJ1wiXScpLGM9XCJcIjt2b2lkIDAhPT1zJiZzLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5sZW5ndGg+MCYmKGMrPVwiXCIuY29uY2F0KGUsXCIsXCIpKX0pLG8rPVwiXCIuY29uY2F0KGkpLmNvbmNhdChhLCd7Y29udGVudDpcIicpLmNvbmNhdChjLCdcIn0nKS5jb25jYXQoZyl9LHM9MDtzPG47cysrKXIocyk7cmV0dXJuIG99KHIpfSl9cmV0dXJuIGUucmVnaXN0ZXJJZD1mdW5jdGlvbihlKXtyZXR1cm4gU2UoZSl9LGUucHJvdG90eXBlLnJlaHlkcmF0ZT1mdW5jdGlvbigpeyF0aGlzLnNlcnZlciYmUyYmX2UodGhpcyl9LGUucHJvdG90eXBlLnJlY29uc3RydWN0V2l0aE9wdGlvbnM9ZnVuY3Rpb24obixvKXtyZXR1cm4gdm9pZCAwPT09byYmKG89ITApLG5ldyBlKHQodCh7fSx0aGlzLm9wdGlvbnMpLG4pLHRoaXMuZ3MsbyYmdGhpcy5uYW1lc3x8dm9pZCAwKX0sZS5wcm90b3R5cGUuYWxsb2NhdGVHU0luc3RhbmNlPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmdzW2VdPSh0aGlzLmdzW2VdfHwwKSsxfSxlLnByb3RvdHlwZS5nZXRUYWc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50YWd8fCh0aGlzLnRhZz0oZT1mdW5jdGlvbihlKXt2YXIgdD1lLnVzZUNTU09NSW5qZWN0aW9uLG49ZS50YXJnZXQ7cmV0dXJuIGUuaXNTZXJ2ZXI/bmV3IERlKG4pOnQ/bmV3IEFlKG4pOm5ldyBPZShuKX0odGhpcy5vcHRpb25zKSxuZXcgZmUoZSkpKTt2YXIgZX0sZS5wcm90b3R5cGUuaGFzTmFtZUZvcklkPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMubmFtZXMuaGFzKGUpJiZ0aGlzLm5hbWVzLmdldChlKS5oYXModCl9LGUucHJvdG90eXBlLnJlZ2lzdGVyTmFtZT1mdW5jdGlvbihlLHQpe2lmKFNlKGUpLHRoaXMubmFtZXMuaGFzKGUpKXRoaXMubmFtZXMuZ2V0KGUpLmFkZCh0KTtlbHNle3ZhciBuPW5ldyBTZXQ7bi5hZGQodCksdGhpcy5uYW1lcy5zZXQoZSxuKX19LGUucHJvdG90eXBlLmluc2VydFJ1bGVzPWZ1bmN0aW9uKGUsdCxuKXt0aGlzLnJlZ2lzdGVyTmFtZShlLHQpLHRoaXMuZ2V0VGFnKCkuaW5zZXJ0UnVsZXMoU2UoZSksbil9LGUucHJvdG90eXBlLmNsZWFyTmFtZXM9ZnVuY3Rpb24oZSl7dGhpcy5uYW1lcy5oYXMoZSkmJnRoaXMubmFtZXMuZ2V0KGUpLmNsZWFyKCl9LGUucHJvdG90eXBlLmNsZWFyUnVsZXM9ZnVuY3Rpb24oZSl7dGhpcy5nZXRUYWcoKS5jbGVhckdyb3VwKFNlKGUpKSx0aGlzLmNsZWFyTmFtZXMoZSl9LGUucHJvdG90eXBlLmNsZWFyVGFnPWZ1bmN0aW9uKCl7dGhpcy50YWc9dm9pZCAwfSxlfSgpLGplPS8mL2cseGU9L15cXHMqXFwvXFwvLiokL2dtO2Z1bmN0aW9uIFZlKGUsdCl7cmV0dXJuIGUubWFwKGZ1bmN0aW9uKGUpe3JldHVyblwicnVsZVwiPT09ZS50eXBlJiYoZS52YWx1ZT1cIlwiLmNvbmNhdCh0LFwiIFwiKS5jb25jYXQoZS52YWx1ZSksZS52YWx1ZT1lLnZhbHVlLnJlcGxhY2VBbGwoXCIsXCIsXCIsXCIuY29uY2F0KHQsXCIgXCIpKSxlLnByb3BzPWUucHJvcHMubWFwKGZ1bmN0aW9uKGUpe3JldHVyblwiXCIuY29uY2F0KHQsXCIgXCIpLmNvbmNhdChlKX0pKSxBcnJheS5pc0FycmF5KGUuY2hpbGRyZW4pJiZcIkBrZXlmcmFtZXNcIiE9PWUudHlwZSYmKGUuY2hpbGRyZW49VmUoZS5jaGlsZHJlbix0KSksZX0pfWZ1bmN0aW9uIEZlKGUpe3ZhciB0LG4sbyxyPXZvaWQgMD09PWU/QzplLHM9ci5vcHRpb25zLGk9dm9pZCAwPT09cz9DOnMsYT1yLnBsdWdpbnMsYz12b2lkIDA9PT1hP186YSxsPWZ1bmN0aW9uKGUsbyxyKXtyZXR1cm4gci5zdGFydHNXaXRoKG4pJiZyLmVuZHNXaXRoKG4pJiZyLnJlcGxhY2VBbGwobixcIlwiKS5sZW5ndGg+MD9cIi5cIi5jb25jYXQodCk6ZX0sdT1jLnNsaWNlKCk7dS5wdXNoKGZ1bmN0aW9uKGUpe2UudHlwZT09PWQuUlVMRVNFVCYmZS52YWx1ZS5pbmNsdWRlcyhcIiZcIikmJihlLnByb3BzWzBdPWUucHJvcHNbMF0ucmVwbGFjZShqZSxuKS5yZXBsYWNlKG8sbCkpfSksaS5wcmVmaXgmJnUucHVzaChkLnByZWZpeGVyKSx1LnB1c2goZC5zdHJpbmdpZnkpO3ZhciBwPWZ1bmN0aW9uKGUscixzLGEpe3ZvaWQgMD09PXImJihyPVwiXCIpLHZvaWQgMD09PXMmJihzPVwiXCIpLHZvaWQgMD09PWEmJihhPVwiJlwiKSx0PWEsbj1yLG89bmV3IFJlZ0V4cChcIlxcXFxcIi5jb25jYXQobixcIlxcXFxiXCIpLFwiZ1wiKTt2YXIgYz1lLnJlcGxhY2UoeGUsXCJcIiksbD1kLmNvbXBpbGUoc3x8cj9cIlwiLmNvbmNhdChzLFwiIFwiKS5jb25jYXQocixcIiB7IFwiKS5jb25jYXQoYyxcIiB9XCIpOmMpO2kubmFtZXNwYWNlJiYobD1WZShsLGkubmFtZXNwYWNlKSk7dmFyIHA9W107cmV0dXJuIGQuc2VyaWFsaXplKGwsZC5taWRkbGV3YXJlKHUuY29uY2F0KGQucnVsZXNoZWV0KGZ1bmN0aW9uKGUpe3JldHVybiBwLnB1c2goZSl9KSkpKSxwfTtyZXR1cm4gcC5oYXNoPWMubGVuZ3RoP2MucmVkdWNlKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQubmFtZXx8aGUoMTUpLE0oZSx0Lm5hbWUpfSxGKS50b1N0cmluZygpOlwiXCIscH12YXIgTWU9bmV3IGtlLHplPUZlKCksJGU9by5jcmVhdGVDb250ZXh0KHtzaG91bGRGb3J3YXJkUHJvcDp2b2lkIDAsc3R5bGVTaGVldDpNZSxzdHlsaXM6emV9KSxCZT0kZS5Db25zdW1lcixMZT1vLmNyZWF0ZUNvbnRleHQodm9pZCAwKTtmdW5jdGlvbiBHZSgpe3JldHVybiBjKCRlKX1mdW5jdGlvbiBZZShlKXt2YXIgdD1zKGUuc3R5bGlzUGx1Z2lucyksbj10WzBdLHI9dFsxXSxjPUdlKCkuc3R5bGVTaGVldCxsPWkoZnVuY3Rpb24oKXt2YXIgdD1jO3JldHVybiBlLnNoZWV0P3Q9ZS5zaGVldDplLnRhcmdldCYmKHQ9dC5yZWNvbnN0cnVjdFdpdGhPcHRpb25zKHt0YXJnZXQ6ZS50YXJnZXR9LCExKSksZS5kaXNhYmxlQ1NTT01JbmplY3Rpb24mJih0PXQucmVjb25zdHJ1Y3RXaXRoT3B0aW9ucyh7dXNlQ1NTT01JbmplY3Rpb246ITF9KSksdH0sW2UuZGlzYWJsZUNTU09NSW5qZWN0aW9uLGUuc2hlZXQsZS50YXJnZXQsY10pLHU9aShmdW5jdGlvbigpe3JldHVybiBGZSh7b3B0aW9uczp7bmFtZXNwYWNlOmUubmFtZXNwYWNlLHByZWZpeDplLmVuYWJsZVZlbmRvclByZWZpeGVzfSxwbHVnaW5zOm59KX0sW2UuZW5hYmxlVmVuZG9yUHJlZml4ZXMsZS5uYW1lc3BhY2Usbl0pO2EoZnVuY3Rpb24oKXtwKG4sZS5zdHlsaXNQbHVnaW5zKXx8cihlLnN0eWxpc1BsdWdpbnMpfSxbZS5zdHlsaXNQbHVnaW5zXSk7dmFyIGQ9aShmdW5jdGlvbigpe3JldHVybntzaG91bGRGb3J3YXJkUHJvcDplLnNob3VsZEZvcndhcmRQcm9wLHN0eWxlU2hlZXQ6bCxzdHlsaXM6dX19LFtlLnNob3VsZEZvcndhcmRQcm9wLGwsdV0pO3JldHVybiBvLmNyZWF0ZUVsZW1lbnQoJGUuUHJvdmlkZXIse3ZhbHVlOmR9LG8uY3JlYXRlRWxlbWVudChMZS5Qcm92aWRlcix7dmFsdWU6dX0sZS5jaGlsZHJlbikpfXZhciBXZT1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSx0KXt2YXIgbj10aGlzO3RoaXMuaW5qZWN0PWZ1bmN0aW9uKGUsdCl7dm9pZCAwPT09dCYmKHQ9emUpO3ZhciBvPW4ubmFtZSt0Lmhhc2g7ZS5oYXNOYW1lRm9ySWQobi5pZCxvKXx8ZS5pbnNlcnRSdWxlcyhuLmlkLG8sdChuLnJ1bGVzLG8sXCJAa2V5ZnJhbWVzXCIpKX0sdGhpcy5uYW1lPWUsdGhpcy5pZD1cInNjLWtleWZyYW1lcy1cIi5jb25jYXQoZSksdGhpcy5ydWxlcz10LHVlKHRoaXMsZnVuY3Rpb24oKXt0aHJvdyBoZSgxMixTdHJpbmcobi5uYW1lKSl9KX1yZXR1cm4gZS5wcm90b3R5cGUuZ2V0TmFtZT1mdW5jdGlvbihlKXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9emUpLHRoaXMubmFtZStlLmhhc2h9LGV9KCkscWU9ZnVuY3Rpb24oZSl7cmV0dXJuIGU+PVwiQVwiJiZlPD1cIlpcIn07ZnVuY3Rpb24gSGUoZSl7Zm9yKHZhciB0PVwiXCIsbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgbz1lW25dO2lmKDE9PT1uJiZcIi1cIj09PW8mJlwiLVwiPT09ZVswXSlyZXR1cm4gZTtxZShvKT90Kz1cIi1cIitvLnRvTG93ZXJDYXNlKCk6dCs9b31yZXR1cm4gdC5zdGFydHNXaXRoKFwibXMtXCIpP1wiLVwiK3Q6dH12YXIgVWU9ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWV8fCExPT09ZXx8XCJcIj09PWV9LEplPWZ1bmN0aW9uKHQpe3ZhciBuLG8scj1bXTtmb3IodmFyIHMgaW4gdCl7dmFyIGk9dFtzXTt0Lmhhc093blByb3BlcnR5KHMpJiYhVWUoaSkmJihBcnJheS5pc0FycmF5KGkpJiZpLmlzQ3NzfHxyZShpKT9yLnB1c2goXCJcIi5jb25jYXQoSGUocyksXCI6XCIpLGksXCI7XCIpOmNlKGkpP3IucHVzaC5hcHBseShyLGUoZShbXCJcIi5jb25jYXQocyxcIiB7XCIpXSxKZShpKSwhMSksW1wifVwiXSwhMSkpOnIucHVzaChcIlwiLmNvbmNhdChIZShzKSxcIjogXCIpLmNvbmNhdCgobj1zLG51bGw9PShvPWkpfHxcImJvb2xlYW5cIj09dHlwZW9mIG98fFwiXCI9PT1vP1wiXCI6XCJudW1iZXJcIiE9dHlwZW9mIG98fDA9PT1vfHxuIGluIGh8fG4uc3RhcnRzV2l0aChcIi0tXCIpP1N0cmluZyhvKS50cmltKCk6XCJcIi5jb25jYXQobyxcInB4XCIpKSxcIjtcIikpKX1yZXR1cm4gcn07ZnVuY3Rpb24gWGUoZSx0LG4sbyl7aWYoVWUoZSkpcmV0dXJuW107aWYoc2UoZSkpcmV0dXJuW1wiLlwiLmNvbmNhdChlLnN0eWxlZENvbXBvbmVudElkKV07aWYocmUoZSkpe2lmKCFyZShzPWUpfHxzLnByb3RvdHlwZSYmcy5wcm90b3R5cGUuaXNSZWFjdENvbXBvbmVudHx8IXQpcmV0dXJuW2VdO3ZhciByPWUodCk7cmV0dXJuXCJwcm9kdWN0aW9uXCI9PT1wcm9jZXNzLmVudi5OT0RFX0VOVnx8XCJvYmplY3RcIiE9dHlwZW9mIHJ8fEFycmF5LmlzQXJyYXkocil8fHIgaW5zdGFuY2VvZiBXZXx8Y2Uocil8fG51bGw9PT1yfHxjb25zb2xlLmVycm9yKFwiXCIuY29uY2F0KEIoZSksXCIgaXMgbm90IGEgc3R5bGVkIGNvbXBvbmVudCBhbmQgY2Fubm90IGJlIHJlZmVycmVkIHRvIHZpYSBjb21wb25lbnQgc2VsZWN0b3IuIFNlZSBodHRwczovL3d3dy5zdHlsZWQtY29tcG9uZW50cy5jb20vZG9jcy9hZHZhbmNlZCNyZWZlcnJpbmctdG8tb3RoZXItY29tcG9uZW50cyBmb3IgbW9yZSBkZXRhaWxzLlwiKSksWGUocix0LG4sbyl9dmFyIHM7cmV0dXJuIGUgaW5zdGFuY2VvZiBXZT9uPyhlLmluamVjdChuLG8pLFtlLmdldE5hbWUobyldKTpbZV06Y2UoZSk/SmUoZSk6QXJyYXkuaXNBcnJheShlKT9BcnJheS5wcm90b3R5cGUuY29uY2F0LmFwcGx5KF8sZS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIFhlKGUsdCxuLG8pfSkpOltlLnRvU3RyaW5nKCldfWZ1bmN0aW9uIFplKGUpe2Zvcih2YXIgdD0wO3Q8ZS5sZW5ndGg7dCs9MSl7dmFyIG49ZVt0XTtpZihyZShuKSYmIXNlKG4pKXJldHVybiExfXJldHVybiEwfXZhciBLZT16KHYpLFFlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQsbil7dGhpcy5ydWxlcz1lLHRoaXMuc3RhdGljUnVsZXNJZD1cIlwiLHRoaXMuaXNTdGF0aWM9XCJwcm9kdWN0aW9uXCI9PT1wcm9jZXNzLmVudi5OT0RFX0VOViYmKHZvaWQgMD09PW58fG4uaXNTdGF0aWMpJiZaZShlKSx0aGlzLmNvbXBvbmVudElkPXQsdGhpcy5iYXNlSGFzaD1NKEtlLHQpLHRoaXMuYmFzZVN0eWxlPW4sa2UucmVnaXN0ZXJJZCh0KX1yZXR1cm4gZS5wcm90b3R5cGUuZ2VuZXJhdGVBbmRJbmplY3RTdHlsZXM9ZnVuY3Rpb24oZSx0LG4pe3ZhciBvPXRoaXMuYmFzZVN0eWxlP3RoaXMuYmFzZVN0eWxlLmdlbmVyYXRlQW5kSW5qZWN0U3R5bGVzKGUsdCxuKTpcIlwiO2lmKHRoaXMuaXNTdGF0aWMmJiFuLmhhc2gpaWYodGhpcy5zdGF0aWNSdWxlc0lkJiZ0Lmhhc05hbWVGb3JJZCh0aGlzLmNvbXBvbmVudElkLHRoaXMuc3RhdGljUnVsZXNJZCkpbz1pZShvLHRoaXMuc3RhdGljUnVsZXNJZCk7ZWxzZXt2YXIgcj1hZShYZSh0aGlzLnJ1bGVzLGUsdCxuKSkscz14KE0odGhpcy5iYXNlSGFzaCxyKT4+PjApO2lmKCF0Lmhhc05hbWVGb3JJZCh0aGlzLmNvbXBvbmVudElkLHMpKXt2YXIgaT1uKHIsXCIuXCIuY29uY2F0KHMpLHZvaWQgMCx0aGlzLmNvbXBvbmVudElkKTt0Lmluc2VydFJ1bGVzKHRoaXMuY29tcG9uZW50SWQscyxpKX1vPWllKG8scyksdGhpcy5zdGF0aWNSdWxlc0lkPXN9ZWxzZXtmb3IodmFyIGE9TSh0aGlzLmJhc2VIYXNoLG4uaGFzaCksYz1cIlwiLGw9MDtsPHRoaXMucnVsZXMubGVuZ3RoO2wrKyl7dmFyIHU9dGhpcy5ydWxlc1tsXTtpZihcInN0cmluZ1wiPT10eXBlb2YgdSljKz11LFwicHJvZHVjdGlvblwiIT09cHJvY2Vzcy5lbnYuTk9ERV9FTlYmJihhPU0oYSx1KSk7ZWxzZSBpZih1KXt2YXIgcD1hZShYZSh1LGUsdCxuKSk7YT1NKGEscCtsKSxjKz1wfX1pZihjKXt2YXIgZD14KGE+Pj4wKTt0Lmhhc05hbWVGb3JJZCh0aGlzLmNvbXBvbmVudElkLGQpfHx0Lmluc2VydFJ1bGVzKHRoaXMuY29tcG9uZW50SWQsZCxuKGMsXCIuXCIuY29uY2F0KGQpLHZvaWQgMCx0aGlzLmNvbXBvbmVudElkKSksbz1pZShvLGQpfX1yZXR1cm4gb30sZX0oKSxldD1vLmNyZWF0ZUNvbnRleHQodm9pZCAwKSx0dD1ldC5Db25zdW1lcjtmdW5jdGlvbiBudCgpe3ZhciBlPWMoZXQpO2lmKCFlKXRocm93IGhlKDE4KTtyZXR1cm4gZX1mdW5jdGlvbiBvdChlKXt2YXIgbj1vLnVzZUNvbnRleHQoZXQpLHI9aShmdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbihlLG4pe2lmKCFlKXRocm93IGhlKDE0KTtpZihyZShlKSl7dmFyIG89ZShuKTtpZihcInByb2R1Y3Rpb25cIiE9PXByb2Nlc3MuZW52Lk5PREVfRU5WJiYobnVsbD09PW98fEFycmF5LmlzQXJyYXkobyl8fFwib2JqZWN0XCIhPXR5cGVvZiBvKSl0aHJvdyBoZSg3KTtyZXR1cm4gb31pZihBcnJheS5pc0FycmF5KGUpfHxcIm9iamVjdFwiIT10eXBlb2YgZSl0aHJvdyBoZSg4KTtyZXR1cm4gbj90KHQoe30sbiksZSk6ZX0oZS50aGVtZSxuKX0sW2UudGhlbWUsbl0pO3JldHVybiBlLmNoaWxkcmVuP28uY3JlYXRlRWxlbWVudChldC5Qcm92aWRlcix7dmFsdWU6cn0sZS5jaGlsZHJlbik6bnVsbH12YXIgcnQ9e30sc3Q9bmV3IFNldDtmdW5jdGlvbiBpdChlLHIscyl7dmFyIGk9c2UoZSksYT1lLGM9IUwoZSkscD1yLmF0dHJzLGQ9dm9pZCAwPT09cD9fOnAsaD1yLmNvbXBvbmVudElkLGY9dm9pZCAwPT09aD9mdW5jdGlvbihlLHQpe3ZhciBuPVwic3RyaW5nXCIhPXR5cGVvZiBlP1wic2NcIjpSKGUpO3J0W25dPShydFtuXXx8MCkrMTt2YXIgbz1cIlwiLmNvbmNhdChuLFwiLVwiKS5jb25jYXQoJCh2K24rcnRbbl0pKTtyZXR1cm4gdD9cIlwiLmNvbmNhdCh0LFwiLVwiKS5jb25jYXQobyk6b30oci5kaXNwbGF5TmFtZSxyLnBhcmVudENvbXBvbmVudElkKTpoLG09ci5kaXNwbGF5TmFtZSx5PXZvaWQgMD09PW0/ZnVuY3Rpb24oZSl7cmV0dXJuIEwoZSk/XCJzdHlsZWQuXCIuY29uY2F0KGUpOlwiU3R5bGVkKFwiLmNvbmNhdChCKGUpLFwiKVwiKX0oZSk6bSxnPXIuZGlzcGxheU5hbWUmJnIuY29tcG9uZW50SWQ/XCJcIi5jb25jYXQoUihyLmRpc3BsYXlOYW1lKSxcIi1cIikuY29uY2F0KHIuY29tcG9uZW50SWQpOnIuY29tcG9uZW50SWR8fGYsUz1pJiZhLmF0dHJzP2EuYXR0cnMuY29uY2F0KGQpLmZpbHRlcihCb29sZWFuKTpkLHc9ci5zaG91bGRGb3J3YXJkUHJvcDtpZihpJiZhLnNob3VsZEZvcndhcmRQcm9wKXt2YXIgYj1hLnNob3VsZEZvcndhcmRQcm9wO2lmKHIuc2hvdWxkRm9yd2FyZFByb3Ape3ZhciBFPXIuc2hvdWxkRm9yd2FyZFByb3A7dz1mdW5jdGlvbihlLHQpe3JldHVybiBiKGUsdCkmJkUoZSx0KX19ZWxzZSB3PWJ9dmFyIE49bmV3IFFlKHMsZyxpP2EuY29tcG9uZW50U3R5bGU6dm9pZCAwKTtmdW5jdGlvbiBPKGUscil7cmV0dXJuIGZ1bmN0aW9uKGUscixzKXt2YXIgaT1lLmF0dHJzLGE9ZS5jb21wb25lbnRTdHlsZSxjPWUuZGVmYXVsdFByb3BzLHA9ZS5mb2xkZWRDb21wb25lbnRJZHMsZD1lLnN0eWxlZENvbXBvbmVudElkLGg9ZS50YXJnZXQsZj1vLnVzZUNvbnRleHQoZXQpLG09R2UoKSx5PWUuc2hvdWxkRm9yd2FyZFByb3B8fG0uc2hvdWxkRm9yd2FyZFByb3A7XCJwcm9kdWN0aW9uXCIhPT1wcm9jZXNzLmVudi5OT0RFX0VOViYmbChkKTt2YXIgdj1JKHIsZixjKXx8QyxnPWZ1bmN0aW9uKGUsbixvKXtmb3IodmFyIHIscz10KHQoe30sbikse2NsYXNzTmFtZTp2b2lkIDAsdGhlbWU6b30pLGk9MDtpPGUubGVuZ3RoO2krPTEpe3ZhciBhPXJlKHI9ZVtpXSk/cihzKTpyO2Zvcih2YXIgYyBpbiBhKXNbY109XCJjbGFzc05hbWVcIj09PWM/aWUoc1tjXSxhW2NdKTpcInN0eWxlXCI9PT1jP3QodCh7fSxzW2NdKSxhW2NdKTphW2NdfXJldHVybiBuLmNsYXNzTmFtZSYmKHMuY2xhc3NOYW1lPWllKHMuY2xhc3NOYW1lLG4uY2xhc3NOYW1lKSksc30oaSxyLHYpLFM9Zy5hc3x8aCx3PXt9O2Zvcih2YXIgYiBpbiBnKXZvaWQgMD09PWdbYl18fFwiJFwiPT09YlswXXx8XCJhc1wiPT09Ynx8XCJ0aGVtZVwiPT09YiYmZy50aGVtZT09PXZ8fChcImZvcndhcmRlZEFzXCI9PT1iP3cuYXM9Zy5mb3J3YXJkZWRBczp5JiYheShiLFMpfHwod1tiXT1nW2JdLHl8fFwiZGV2ZWxvcG1lbnRcIiE9PXByb2Nlc3MuZW52Lk5PREVfRU5WfHxuKGIpfHxzdC5oYXMoYil8fCFBLmhhcyhTKXx8KHN0LmFkZChiKSxjb25zb2xlLndhcm4oJ3N0eWxlZC1jb21wb25lbnRzOiBpdCBsb29rcyBsaWtlIGFuIHVua25vd24gcHJvcCBcIicuY29uY2F0KGIsJ1wiIGlzIGJlaW5nIHNlbnQgdGhyb3VnaCB0byB0aGUgRE9NLCB3aGljaCB3aWxsIGxpa2VseSB0cmlnZ2VyIGEgUmVhY3QgY29uc29sZSBlcnJvci4gSWYgeW91IHdvdWxkIGxpa2UgYXV0b21hdGljIGZpbHRlcmluZyBvZiB1bmtub3duIHByb3BzLCB5b3UgY2FuIG9wdC1pbnRvIHRoYXQgYmVoYXZpb3IgdmlhIGA8U3R5bGVTaGVldE1hbmFnZXIgc2hvdWxkRm9yd2FyZFByb3A9ey4uLn0+YCAoY29ubmVjdCBhbiBBUEkgbGlrZSBgQGVtb3Rpb24vaXMtcHJvcC12YWxpZGApIG9yIGNvbnNpZGVyIHVzaW5nIHRyYW5zaWVudCBwcm9wcyAoYCRgIHByZWZpeCBmb3IgYXV0b21hdGljIGZpbHRlcmluZy4pJykpKSkpO3ZhciBFPWZ1bmN0aW9uKGUsdCl7dmFyIG49R2UoKSxvPWUuZ2VuZXJhdGVBbmRJbmplY3RTdHlsZXModCxuLnN0eWxlU2hlZXQsbi5zdHlsaXMpO3JldHVyblwicHJvZHVjdGlvblwiIT09cHJvY2Vzcy5lbnYuTk9ERV9FTlYmJmwobyksb30oYSxnKTtcInByb2R1Y3Rpb25cIiE9PXByb2Nlc3MuZW52Lk5PREVfRU5WJiZlLndhcm5Ub29NYW55Q2xhc3NlcyYmZS53YXJuVG9vTWFueUNsYXNzZXMoRSk7dmFyIE49aWUocCxkKTtyZXR1cm4gRSYmKE4rPVwiIFwiK0UpLGcuY2xhc3NOYW1lJiYoTis9XCIgXCIrZy5jbGFzc05hbWUpLHdbTChTKSYmIUEuaGFzKFMpP1wiY2xhc3NcIjpcImNsYXNzTmFtZVwiXT1OLHMmJih3LnJlZj1zKSx1KFMsdyl9KEQsZSxyKX1PLmRpc3BsYXlOYW1lPXk7dmFyIEQ9by5mb3J3YXJkUmVmKE8pO3JldHVybiBELmF0dHJzPVMsRC5jb21wb25lbnRTdHlsZT1OLEQuZGlzcGxheU5hbWU9eSxELnNob3VsZEZvcndhcmRQcm9wPXcsRC5mb2xkZWRDb21wb25lbnRJZHM9aT9pZShhLmZvbGRlZENvbXBvbmVudElkcyxhLnN0eWxlZENvbXBvbmVudElkKTpcIlwiLEQuc3R5bGVkQ29tcG9uZW50SWQ9ZyxELnRhcmdldD1pP2EudGFyZ2V0OmUsT2JqZWN0LmRlZmluZVByb3BlcnR5KEQsXCJkZWZhdWx0UHJvcHNcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2ZvbGRlZERlZmF1bHRQcm9wc30sc2V0OmZ1bmN0aW9uKGUpe3RoaXMuX2ZvbGRlZERlZmF1bHRQcm9wcz1pP2Z1bmN0aW9uKGUpe2Zvcih2YXIgdD1bXSxuPTE7bjxhcmd1bWVudHMubGVuZ3RoO24rKyl0W24tMV09YXJndW1lbnRzW25dO2Zvcih2YXIgbz0wLHI9dDtvPHIubGVuZ3RoO28rKylsZShlLHJbb10sITApO3JldHVybiBlfSh7fSxhLmRlZmF1bHRQcm9wcyxlKTplfX0pLFwicHJvZHVjdGlvblwiIT09cHJvY2Vzcy5lbnYuTk9ERV9FTlYmJihQKHksZyksRC53YXJuVG9vTWFueUNsYXNzZXM9ZnVuY3Rpb24oZSx0KXt2YXIgbj17fSxvPSExO3JldHVybiBmdW5jdGlvbihyKXtpZighbyYmKG5bcl09ITAsT2JqZWN0LmtleXMobikubGVuZ3RoPj0yMDApKXt2YXIgcz10Pycgd2l0aCB0aGUgaWQgb2YgXCInLmNvbmNhdCh0LCdcIicpOlwiXCI7Y29uc29sZS53YXJuKFwiT3ZlciBcIi5jb25jYXQoMjAwLFwiIGNsYXNzZXMgd2VyZSBnZW5lcmF0ZWQgZm9yIGNvbXBvbmVudCBcIikuY29uY2F0KGUpLmNvbmNhdChzLFwiLlxcblwiKStcIkNvbnNpZGVyIHVzaW5nIHRoZSBhdHRycyBtZXRob2QsIHRvZ2V0aGVyIHdpdGggYSBzdHlsZSBvYmplY3QgZm9yIGZyZXF1ZW50bHkgY2hhbmdlZCBzdHlsZXMuXFxuRXhhbXBsZTpcXG4gIGNvbnN0IENvbXBvbmVudCA9IHN0eWxlZC5kaXYuYXR0cnMocHJvcHMgPT4gKHtcXG4gICAgc3R5bGU6IHtcXG4gICAgICBiYWNrZ3JvdW5kOiBwcm9wcy5iYWNrZ3JvdW5kLFxcbiAgICB9LFxcbiAgfSkpYHdpZHRoOiAxMDAlO2BcXG5cXG4gIDxDb21wb25lbnQgLz5cIiksbz0hMCxuPXt9fX19KHksZykpLHVlKEQsZnVuY3Rpb24oKXtyZXR1cm5cIi5cIi5jb25jYXQoRC5zdHlsZWRDb21wb25lbnRJZCl9KSxjJiZvZShELGUse2F0dHJzOiEwLGNvbXBvbmVudFN0eWxlOiEwLGRpc3BsYXlOYW1lOiEwLGZvbGRlZENvbXBvbmVudElkczohMCxzaG91bGRGb3J3YXJkUHJvcDohMCxzdHlsZWRDb21wb25lbnRJZDohMCx0YXJnZXQ6ITB9KSxEfWZ1bmN0aW9uIGF0KGUsdCl7Zm9yKHZhciBuPVtlWzBdXSxvPTAscj10Lmxlbmd0aDtvPHI7bys9MSluLnB1c2godFtvXSxlW28rMV0pO3JldHVybiBufXZhciBjdD1mdW5jdGlvbihlKXtyZXR1cm4gT2JqZWN0LmFzc2lnbihlLHtpc0NzczohMH0pfTtmdW5jdGlvbiBsdCh0KXtmb3IodmFyIG49W10sbz0xO288YXJndW1lbnRzLmxlbmd0aDtvKyspbltvLTFdPWFyZ3VtZW50c1tvXTtpZihyZSh0KXx8Y2UodCkpcmV0dXJuIGN0KFhlKGF0KF8sZShbdF0sbiwhMCkpKSk7dmFyIHI9dDtyZXR1cm4gMD09PW4ubGVuZ3RoJiYxPT09ci5sZW5ndGgmJlwic3RyaW5nXCI9PXR5cGVvZiByWzBdP1hlKHIpOmN0KFhlKGF0KHIsbikpKX1mdW5jdGlvbiB1dChuLG8scil7aWYodm9pZCAwPT09ciYmKHI9QyksIW8pdGhyb3cgaGUoMSxvKTt2YXIgcz1mdW5jdGlvbih0KXtmb3IodmFyIHM9W10saT0xO2k8YXJndW1lbnRzLmxlbmd0aDtpKyspc1tpLTFdPWFyZ3VtZW50c1tpXTtyZXR1cm4gbihvLHIsbHQuYXBwbHkodm9pZCAwLGUoW3RdLHMsITEpKSl9O3JldHVybiBzLmF0dHJzPWZ1bmN0aW9uKGUpe3JldHVybiB1dChuLG8sdCh0KHt9LHIpLHthdHRyczpBcnJheS5wcm90b3R5cGUuY29uY2F0KHIuYXR0cnMsZSkuZmlsdGVyKEJvb2xlYW4pfSkpfSxzLndpdGhDb25maWc9ZnVuY3Rpb24oZSl7cmV0dXJuIHV0KG4sbyx0KHQoe30sciksZSkpfSxzfXZhciBwdD1mdW5jdGlvbihlKXtyZXR1cm4gdXQoaXQsZSl9LGR0PXB0O0EuZm9yRWFjaChmdW5jdGlvbihlKXtkdFtlXT1wdChlKX0pO3ZhciBodD1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSx0KXt0aGlzLnJ1bGVzPWUsdGhpcy5jb21wb25lbnRJZD10LHRoaXMuaXNTdGF0aWM9WmUoZSksa2UucmVnaXN0ZXJJZCh0aGlzLmNvbXBvbmVudElkKzEpfXJldHVybiBlLnByb3RvdHlwZS5jcmVhdGVTdHlsZXM9ZnVuY3Rpb24oZSx0LG4sbyl7dmFyIHI9byhhZShYZSh0aGlzLnJ1bGVzLHQsbixvKSksXCJcIikscz10aGlzLmNvbXBvbmVudElkK2U7bi5pbnNlcnRSdWxlcyhzLHMscil9LGUucHJvdG90eXBlLnJlbW92ZVN0eWxlcz1mdW5jdGlvbihlLHQpe3QuY2xlYXJSdWxlcyh0aGlzLmNvbXBvbmVudElkK2UpfSxlLnByb3RvdHlwZS5yZW5kZXJTdHlsZXM9ZnVuY3Rpb24oZSx0LG4sbyl7ZT4yJiZrZS5yZWdpc3RlcklkKHRoaXMuY29tcG9uZW50SWQrZSksdGhpcy5yZW1vdmVTdHlsZXMoZSxuKSx0aGlzLmNyZWF0ZVN0eWxlcyhlLHQsbixvKX0sZX0oKTtmdW5jdGlvbiBmdChuKXtmb3IodmFyIHI9W10scz0xO3M8YXJndW1lbnRzLmxlbmd0aDtzKyspcltzLTFdPWFyZ3VtZW50c1tzXTt2YXIgaT1sdC5hcHBseSh2b2lkIDAsZShbbl0sciwhMSkpLGE9XCJzYy1nbG9iYWwtXCIuY29uY2F0KCQoSlNPTi5zdHJpbmdpZnkoaSkpKSxjPW5ldyBodChpLGEpO1wicHJvZHVjdGlvblwiIT09cHJvY2Vzcy5lbnYuTk9ERV9FTlYmJlAoYSk7dmFyIGw9ZnVuY3Rpb24oZSl7dmFyIHQ9R2UoKSxuPW8udXNlQ29udGV4dChldCkscj1vLnVzZVJlZih0LnN0eWxlU2hlZXQuYWxsb2NhdGVHU0luc3RhbmNlKGEpKS5jdXJyZW50O3JldHVyblwicHJvZHVjdGlvblwiIT09cHJvY2Vzcy5lbnYuTk9ERV9FTlYmJm8uQ2hpbGRyZW4uY291bnQoZS5jaGlsZHJlbikmJmNvbnNvbGUud2FybihcIlRoZSBnbG9iYWwgc3R5bGUgY29tcG9uZW50IFwiLmNvbmNhdChhLFwiIHdhcyBnaXZlbiBjaGlsZCBKU1guIGNyZWF0ZUdsb2JhbFN0eWxlIGRvZXMgbm90IHJlbmRlciBjaGlsZHJlbi5cIikpLFwicHJvZHVjdGlvblwiIT09cHJvY2Vzcy5lbnYuTk9ERV9FTlYmJmkuc29tZShmdW5jdGlvbihlKXtyZXR1cm5cInN0cmluZ1wiPT10eXBlb2YgZSYmLTEhPT1lLmluZGV4T2YoXCJAaW1wb3J0XCIpfSkmJmNvbnNvbGUud2FybihcIlBsZWFzZSBkbyBub3QgdXNlIEBpbXBvcnQgQ1NTIHN5bnRheCBpbiBjcmVhdGVHbG9iYWxTdHlsZSBhdCB0aGlzIHRpbWUsIGFzIHRoZSBDU1NPTSBBUElzIHdlIHVzZSBpbiBwcm9kdWN0aW9uIGRvIG5vdCBoYW5kbGUgaXQgd2VsbC4gSW5zdGVhZCwgd2UgcmVjb21tZW5kIHVzaW5nIGEgbGlicmFyeSBzdWNoIGFzIHJlYWN0LWhlbG1ldCB0byBpbmplY3QgYSB0eXBpY2FsIDxsaW5rPiBtZXRhIHRhZyB0byB0aGUgc3R5bGVzaGVldCwgb3Igc2ltcGx5IGVtYmVkZGluZyBpdCBtYW51YWxseSBpbiB5b3VyIGluZGV4Lmh0bWwgPGhlYWQ+IHNlY3Rpb24gZm9yIGEgc2ltcGxlciBhcHAuXCIpLHQuc3R5bGVTaGVldC5zZXJ2ZXImJnUocixlLHQuc3R5bGVTaGVldCxuLHQuc3R5bGlzKSxvLnVzZUxheW91dEVmZmVjdChmdW5jdGlvbigpe2lmKCF0LnN0eWxlU2hlZXQuc2VydmVyKXJldHVybiB1KHIsZSx0LnN0eWxlU2hlZXQsbix0LnN0eWxpcyksZnVuY3Rpb24oKXtyZXR1cm4gYy5yZW1vdmVTdHlsZXMocix0LnN0eWxlU2hlZXQpfX0sW3IsZSx0LnN0eWxlU2hlZXQsbix0LnN0eWxpc10pLG51bGx9O2Z1bmN0aW9uIHUoZSxuLG8scixzKXtpZihjLmlzU3RhdGljKWMucmVuZGVyU3R5bGVzKGUsYixvLHMpO2Vsc2V7dmFyIGk9dCh0KHt9LG4pLHt0aGVtZTpJKG4scixsLmRlZmF1bHRQcm9wcyl9KTtjLnJlbmRlclN0eWxlcyhlLGksbyxzKX19cmV0dXJuIG8ubWVtbyhsKX1mdW5jdGlvbiBtdCh0KXtmb3IodmFyIG49W10sbz0xO288YXJndW1lbnRzLmxlbmd0aDtvKyspbltvLTFdPWFyZ3VtZW50c1tvXTtcInByb2R1Y3Rpb25cIiE9PXByb2Nlc3MuZW52Lk5PREVfRU5WJiZcInVuZGVmaW5lZFwiIT10eXBlb2YgbmF2aWdhdG9yJiZcIlJlYWN0TmF0aXZlXCI9PT1uYXZpZ2F0b3IucHJvZHVjdCYmY29uc29sZS53YXJuKFwiYGtleWZyYW1lc2AgY2Fubm90IGJlIHVzZWQgb24gUmVhY3ROYXRpdmUsIG9ubHkgb24gdGhlIHdlYi4gVG8gZG8gYW5pbWF0aW9uIGluIFJlYWN0TmF0aXZlIHBsZWFzZSB1c2UgQW5pbWF0ZWQuXCIpO3ZhciByPWFlKGx0LmFwcGx5KHZvaWQgMCxlKFt0XSxuLCExKSkpLHM9JChyKTtyZXR1cm4gbmV3IFdlKHMscil9ZnVuY3Rpb24geXQoZSl7dmFyIG49by5mb3J3YXJkUmVmKGZ1bmN0aW9uKG4scil7dmFyIHM9SShuLG8udXNlQ29udGV4dChldCksZS5kZWZhdWx0UHJvcHMpO3JldHVyblwicHJvZHVjdGlvblwiIT09cHJvY2Vzcy5lbnYuTk9ERV9FTlYmJnZvaWQgMD09PXMmJmNvbnNvbGUud2FybignW3dpdGhUaGVtZV0gWW91IGFyZSBub3QgdXNpbmcgYSBUaGVtZVByb3ZpZGVyIG5vciBwYXNzaW5nIGEgdGhlbWUgcHJvcCBvciBhIHRoZW1lIGluIGRlZmF1bHRQcm9wcyBpbiBjb21wb25lbnQgY2xhc3MgXCInLmNvbmNhdChCKGUpLCdcIicpKSxvLmNyZWF0ZUVsZW1lbnQoZSx0KHt9LG4se3RoZW1lOnMscmVmOnJ9KSl9KTtyZXR1cm4gbi5kaXNwbGF5TmFtZT1cIldpdGhUaGVtZShcIi5jb25jYXQoQihlKSxcIilcIiksb2UobixlKX12YXIgdnQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKCl7dmFyIGU9dGhpczt0aGlzLl9lbWl0U2hlZXRDU1M9ZnVuY3Rpb24oKXt2YXIgdD1lLmluc3RhbmNlLnRvU3RyaW5nKCk7aWYoIXQpcmV0dXJuXCJcIjt2YXIgbj1DZSgpLG89YWUoW24mJidub25jZT1cIicuY29uY2F0KG4sJ1wiJyksXCJcIi5jb25jYXQoZiwnPVwidHJ1ZVwiJyksXCJcIi5jb25jYXQoeSwnPVwiJykuY29uY2F0KHYsJ1wiJyldLmZpbHRlcihCb29sZWFuKSxcIiBcIik7cmV0dXJuXCI8c3R5bGUgXCIuY29uY2F0KG8sXCI+XCIpLmNvbmNhdCh0LFwiPC9zdHlsZT5cIil9LHRoaXMuZ2V0U3R5bGVUYWdzPWZ1bmN0aW9uKCl7aWYoZS5zZWFsZWQpdGhyb3cgaGUoMik7cmV0dXJuIGUuX2VtaXRTaGVldENTUygpfSx0aGlzLmdldFN0eWxlRWxlbWVudD1mdW5jdGlvbigpe3ZhciBuO2lmKGUuc2VhbGVkKXRocm93IGhlKDIpO3ZhciByPWUuaW5zdGFuY2UudG9TdHJpbmcoKTtpZighcilyZXR1cm5bXTt2YXIgcz0oKG49e30pW2ZdPVwiXCIsblt5XT12LG4uZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw9e19faHRtbDpyfSxuKSxpPUNlKCk7cmV0dXJuIGkmJihzLm5vbmNlPWkpLFtvLmNyZWF0ZUVsZW1lbnQoXCJzdHlsZVwiLHQoe30scyx7a2V5Olwic2MtMC0wXCJ9KSldfSx0aGlzLnNlYWw9ZnVuY3Rpb24oKXtlLnNlYWxlZD0hMH0sdGhpcy5pbnN0YW5jZT1uZXcga2Uoe2lzU2VydmVyOiEwfSksdGhpcy5zZWFsZWQ9ITF9cmV0dXJuIGUucHJvdG90eXBlLmNvbGxlY3RTdHlsZXM9ZnVuY3Rpb24oZSl7aWYodGhpcy5zZWFsZWQpdGhyb3cgaGUoMik7cmV0dXJuIG8uY3JlYXRlRWxlbWVudChZZSx7c2hlZXQ6dGhpcy5pbnN0YW5jZX0sZSl9LGUucHJvdG90eXBlLmludGVybGVhdmVXaXRoTm9kZVN0cmVhbT1mdW5jdGlvbihlKXt0aHJvdyBoZSgzKX0sZX0oKSxndD17U3R5bGVTaGVldDprZSxtYWluU2hlZXQ6TWV9O1wicHJvZHVjdGlvblwiIT09cHJvY2Vzcy5lbnYuTk9ERV9FTlYmJlwidW5kZWZpbmVkXCIhPXR5cGVvZiBuYXZpZ2F0b3ImJlwiUmVhY3ROYXRpdmVcIj09PW5hdmlnYXRvci5wcm9kdWN0JiZjb25zb2xlLndhcm4oXCJJdCBsb29rcyBsaWtlIHlvdSd2ZSBpbXBvcnRlZCAnc3R5bGVkLWNvbXBvbmVudHMnIG9uIFJlYWN0IE5hdGl2ZS5cXG5QZXJoYXBzIHlvdSdyZSBsb29raW5nIHRvIGltcG9ydCAnc3R5bGVkLWNvbXBvbmVudHMvbmF0aXZlJz9cXG5SZWFkIG1vcmUgYWJvdXQgdGhpcyBhdCBodHRwczovL3d3dy5zdHlsZWQtY29tcG9uZW50cy5jb20vZG9jcy9iYXNpY3MjcmVhY3QtbmF0aXZlXCIpO3ZhciBTdD1cIl9fc2MtXCIuY29uY2F0KGYsXCJfX1wiKTtcInByb2R1Y3Rpb25cIiE9PXByb2Nlc3MuZW52Lk5PREVfRU5WJiZcInRlc3RcIiE9PXByb2Nlc3MuZW52Lk5PREVfRU5WJiZcInVuZGVmaW5lZFwiIT10eXBlb2Ygd2luZG93JiYod2luZG93W1N0XXx8KHdpbmRvd1tTdF09MCksMT09PXdpbmRvd1tTdF0mJmNvbnNvbGUud2FybihcIkl0IGxvb2tzIGxpa2UgdGhlcmUgYXJlIHNldmVyYWwgaW5zdGFuY2VzIG9mICdzdHlsZWQtY29tcG9uZW50cycgaW5pdGlhbGl6ZWQgaW4gdGhpcyBhcHBsaWNhdGlvbi4gVGhpcyBtYXkgY2F1c2UgZHluYW1pYyBzdHlsZXMgdG8gbm90IHJlbmRlciBwcm9wZXJseSwgZXJyb3JzIGR1cmluZyB0aGUgcmVoeWRyYXRpb24gcHJvY2VzcywgYSBtaXNzaW5nIHRoZW1lIHByb3AsIGFuZCBtYWtlcyB5b3VyIGFwcGxpY2F0aW9uIGJpZ2dlciB3aXRob3V0IGdvb2QgcmVhc29uLlxcblxcblNlZSBodHRwczovL3MtYy5zaC8yQkFYemVkIGZvciBtb3JlIGluZm8uXCIpLHdpbmRvd1tTdF0rPTEpO2V4cG9ydHt2dCBhcyBTZXJ2ZXJTdHlsZVNoZWV0LEJlIGFzIFN0eWxlU2hlZXRDb25zdW1lciwkZSBhcyBTdHlsZVNoZWV0Q29udGV4dCxZZSBhcyBTdHlsZVNoZWV0TWFuYWdlcix0dCBhcyBUaGVtZUNvbnN1bWVyLGV0IGFzIFRoZW1lQ29udGV4dCxvdCBhcyBUaGVtZVByb3ZpZGVyLGd0IGFzIF9fUFJJVkFURV9fLGZ0IGFzIGNyZWF0ZUdsb2JhbFN0eWxlLGx0IGFzIGNzcyxkdCBhcyBkZWZhdWx0LHNlIGFzIGlzU3R5bGVkQ29tcG9uZW50LG10IGFzIGtleWZyYW1lcyxkdCBhcyBzdHlsZWQsbnQgYXMgdXNlVGhlbWUsdiBhcyB2ZXJzaW9uLHl0IGFzIHdpdGhUaGVtZX07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zdHlsZWQtY29tcG9uZW50cy5icm93c2VyLmVzbS5qcy5tYXBcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBOztBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///2\n')},function(module,__webpack_exports__,__webpack_require__){"use strict";eval("/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1);\n\n\n\n\n/**\n * Create an Error with the specified message, config, error code, request and response.\n *\n * @param {string} message The error message.\n * @param {string} [code] The error code (for example, 'ECONNABORTED').\n * @param {Object} [config] The config.\n * @param {Object} [request] The request.\n * @param {Object} [response] The response.\n *\n * @returns {Error} The created error.\n */\nfunction AxiosError(message, code, config, request, response) {\n  Error.call(this);\n\n  if (Error.captureStackTrace) {\n    Error.captureStackTrace(this, this.constructor);\n  } else {\n    this.stack = (new Error()).stack;\n  }\n\n  this.message = message;\n  this.name = 'AxiosError';\n  code && (this.code = code);\n  config && (this.config = config);\n  request && (this.request = request);\n  if (response) {\n    this.response = response;\n    this.status = response.status ? response.status : null;\n  }\n}\n\n_utils_js__WEBPACK_IMPORTED_MODULE_0__[/* default */ \"a\"].inherits(AxiosError, Error, {\n  toJSON: function toJSON() {\n    return {\n      // Standard\n      message: this.message,\n      name: this.name,\n      // Microsoft\n      description: this.description,\n      number: this.number,\n      // Mozilla\n      fileName: this.fileName,\n      lineNumber: this.lineNumber,\n      columnNumber: this.columnNumber,\n      stack: this.stack,\n      // Axios\n      config: _utils_js__WEBPACK_IMPORTED_MODULE_0__[/* default */ \"a\"].toJSONObject(this.config),\n      code: this.code,\n      status: this.status\n    };\n  }\n});\n\nconst prototype = AxiosError.prototype;\nconst descriptors = {};\n\n[\n  'ERR_BAD_OPTION_VALUE',\n  'ERR_BAD_OPTION',\n  'ECONNABORTED',\n  'ETIMEDOUT',\n  'ERR_NETWORK',\n  'ERR_FR_TOO_MANY_REDIRECTS',\n  'ERR_DEPRECATED',\n  'ERR_BAD_RESPONSE',\n  'ERR_BAD_REQUEST',\n  'ERR_CANCELED',\n  'ERR_NOT_SUPPORT',\n  'ERR_INVALID_URL'\n// eslint-disable-next-line func-names\n].forEach(code => {\n  descriptors[code] = {value: code};\n});\n\nObject.defineProperties(AxiosError, descriptors);\nObject.defineProperty(prototype, 'isAxiosError', {value: true});\n\n// eslint-disable-next-line func-names\nAxiosError.from = (error, code, config, request, response, customProps) => {\n  const axiosError = Object.create(prototype);\n\n  _utils_js__WEBPACK_IMPORTED_MODULE_0__[/* default */ \"a\"].toFlatObject(error, axiosError, function filter(obj) {\n    return obj !== Error.prototype;\n  }, prop => {\n    return prop !== 'isAxiosError';\n  });\n\n  AxiosError.call(axiosError, error.message, code, config, request, response);\n\n  axiosError.cause = error;\n\n  axiosError.name = error.name;\n\n  customProps && Object.assign(axiosError, customProps);\n\n  return axiosError;\n};\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (AxiosError);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvY29yZS9BeGlvc0Vycm9yLmpzPzc5MTciXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgdXRpbHMgZnJvbSAnLi4vdXRpbHMuanMnO1xuXG4vKipcbiAqIENyZWF0ZSBhbiBFcnJvciB3aXRoIHRoZSBzcGVjaWZpZWQgbWVzc2FnZSwgY29uZmlnLCBlcnJvciBjb2RlLCByZXF1ZXN0IGFuZCByZXNwb25zZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZSBUaGUgZXJyb3IgbWVzc2FnZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbY29kZV0gVGhlIGVycm9yIGNvZGUgKGZvciBleGFtcGxlLCAnRUNPTk5BQk9SVEVEJykuXG4gKiBAcGFyYW0ge09iamVjdH0gW2NvbmZpZ10gVGhlIGNvbmZpZy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbcmVxdWVzdF0gVGhlIHJlcXVlc3QuXG4gKiBAcGFyYW0ge09iamVjdH0gW3Jlc3BvbnNlXSBUaGUgcmVzcG9uc2UuXG4gKlxuICogQHJldHVybnMge0Vycm9yfSBUaGUgY3JlYXRlZCBlcnJvci5cbiAqL1xuZnVuY3Rpb24gQXhpb3NFcnJvcihtZXNzYWdlLCBjb2RlLCBjb25maWcsIHJlcXVlc3QsIHJlc3BvbnNlKSB7XG4gIEVycm9yLmNhbGwodGhpcyk7XG5cbiAgaWYgKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKSB7XG4gICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgdGhpcy5jb25zdHJ1Y3Rvcik7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5zdGFjayA9IChuZXcgRXJyb3IoKSkuc3RhY2s7XG4gIH1cblxuICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICB0aGlzLm5hbWUgPSAnQXhpb3NFcnJvcic7XG4gIGNvZGUgJiYgKHRoaXMuY29kZSA9IGNvZGUpO1xuICBjb25maWcgJiYgKHRoaXMuY29uZmlnID0gY29uZmlnKTtcbiAgcmVxdWVzdCAmJiAodGhpcy5yZXF1ZXN0ID0gcmVxdWVzdCk7XG4gIGlmIChyZXNwb25zZSkge1xuICAgIHRoaXMucmVzcG9uc2UgPSByZXNwb25zZTtcbiAgICB0aGlzLnN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cyA/IHJlc3BvbnNlLnN0YXR1cyA6IG51bGw7XG4gIH1cbn1cblxudXRpbHMuaW5oZXJpdHMoQXhpb3NFcnJvciwgRXJyb3IsIHtcbiAgdG9KU09OOiBmdW5jdGlvbiB0b0pTT04oKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC8vIFN0YW5kYXJkXG4gICAgICBtZXNzYWdlOiB0aGlzLm1lc3NhZ2UsXG4gICAgICBuYW1lOiB0aGlzLm5hbWUsXG4gICAgICAvLyBNaWNyb3NvZnRcbiAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLmRlc2NyaXB0aW9uLFxuICAgICAgbnVtYmVyOiB0aGlzLm51bWJlcixcbiAgICAgIC8vIE1vemlsbGFcbiAgICAgIGZpbGVOYW1lOiB0aGlzLmZpbGVOYW1lLFxuICAgICAgbGluZU51bWJlcjogdGhpcy5saW5lTnVtYmVyLFxuICAgICAgY29sdW1uTnVtYmVyOiB0aGlzLmNvbHVtbk51bWJlcixcbiAgICAgIHN0YWNrOiB0aGlzLnN0YWNrLFxuICAgICAgLy8gQXhpb3NcbiAgICAgIGNvbmZpZzogdXRpbHMudG9KU09OT2JqZWN0KHRoaXMuY29uZmlnKSxcbiAgICAgIGNvZGU6IHRoaXMuY29kZSxcbiAgICAgIHN0YXR1czogdGhpcy5zdGF0dXNcbiAgICB9O1xuICB9XG59KTtcblxuY29uc3QgcHJvdG90eXBlID0gQXhpb3NFcnJvci5wcm90b3R5cGU7XG5jb25zdCBkZXNjcmlwdG9ycyA9IHt9O1xuXG5bXG4gICdFUlJfQkFEX09QVElPTl9WQUxVRScsXG4gICdFUlJfQkFEX09QVElPTicsXG4gICdFQ09OTkFCT1JURUQnLFxuICAnRVRJTUVET1VUJyxcbiAgJ0VSUl9ORVRXT1JLJyxcbiAgJ0VSUl9GUl9UT09fTUFOWV9SRURJUkVDVFMnLFxuICAnRVJSX0RFUFJFQ0FURUQnLFxuICAnRVJSX0JBRF9SRVNQT05TRScsXG4gICdFUlJfQkFEX1JFUVVFU1QnLFxuICAnRVJSX0NBTkNFTEVEJyxcbiAgJ0VSUl9OT1RfU1VQUE9SVCcsXG4gICdFUlJfSU5WQUxJRF9VUkwnXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZnVuYy1uYW1lc1xuXS5mb3JFYWNoKGNvZGUgPT4ge1xuICBkZXNjcmlwdG9yc1tjb2RlXSA9IHt2YWx1ZTogY29kZX07XG59KTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoQXhpb3NFcnJvciwgZGVzY3JpcHRvcnMpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb3RvdHlwZSwgJ2lzQXhpb3NFcnJvcicsIHt2YWx1ZTogdHJ1ZX0pO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZnVuYy1uYW1lc1xuQXhpb3NFcnJvci5mcm9tID0gKGVycm9yLCBjb2RlLCBjb25maWcsIHJlcXVlc3QsIHJlc3BvbnNlLCBjdXN0b21Qcm9wcykgPT4ge1xuICBjb25zdCBheGlvc0Vycm9yID0gT2JqZWN0LmNyZWF0ZShwcm90b3R5cGUpO1xuXG4gIHV0aWxzLnRvRmxhdE9iamVjdChlcnJvciwgYXhpb3NFcnJvciwgZnVuY3Rpb24gZmlsdGVyKG9iaikge1xuICAgIHJldHVybiBvYmogIT09IEVycm9yLnByb3RvdHlwZTtcbiAgfSwgcHJvcCA9PiB7XG4gICAgcmV0dXJuIHByb3AgIT09ICdpc0F4aW9zRXJyb3InO1xuICB9KTtcblxuICBBeGlvc0Vycm9yLmNhbGwoYXhpb3NFcnJvciwgZXJyb3IubWVzc2FnZSwgY29kZSwgY29uZmlnLCByZXF1ZXN0LCByZXNwb25zZSk7XG5cbiAgYXhpb3NFcnJvci5jYXVzZSA9IGVycm9yO1xuXG4gIGF4aW9zRXJyb3IubmFtZSA9IGVycm9yLm5hbWU7XG5cbiAgY3VzdG9tUHJvcHMgJiYgT2JqZWN0LmFzc2lnbihheGlvc0Vycm9yLCBjdXN0b21Qcm9wcyk7XG5cbiAgcmV0dXJuIGF4aW9zRXJyb3I7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBBeGlvc0Vycm9yO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///3\n")},function(module,exports){eval("/**\n * Node.js module for Forge.\n *\n * @author Dave Longley\n *\n * Copyright 2011-2016 Digital Bazaar, Inc.\n */\nmodule.exports = {\n  // default options\n  options: {\n    usePureJavaScript: false\n  }\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNC5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9ub2RlLWZvcmdlL2xpYi9mb3JnZS5qcz9kMzI3Il0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTm9kZS5qcyBtb2R1bGUgZm9yIEZvcmdlLlxuICpcbiAqIEBhdXRob3IgRGF2ZSBMb25nbGV5XG4gKlxuICogQ29weXJpZ2h0IDIwMTEtMjAxNiBEaWdpdGFsIEJhemFhciwgSW5jLlxuICovXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgLy8gZGVmYXVsdCBvcHRpb25zXG4gIG9wdGlvbnM6IHtcbiAgICB1c2VQdXJlSmF2YVNjcmlwdDogZmFsc2VcbiAgfVxufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///4\n")},function(module,exports,__webpack_require__){"use strict";eval("\n\nvar isOldIE = function isOldIE() {\n  var memo;\n  return function memorize() {\n    if (typeof memo === 'undefined') {\n      // Test for IE <= 9 as proposed by Browserhacks\n      // @see http://browserhacks.com/#hack-e71d8692f65334173fee715c222cb805\n      // Tests for existence of standard globals is to allow style-loader\n      // to operate correctly into non-standard environments\n      // @see https://github.com/webpack-contrib/style-loader/issues/177\n      memo = Boolean(window && document && document.all && !window.atob);\n    }\n\n    return memo;\n  };\n}();\n\nvar getTarget = function getTarget() {\n  var memo = {};\n  return function memorize(target) {\n    if (typeof memo[target] === 'undefined') {\n      var styleTarget = document.querySelector(target); // Special case to return head of iframe instead of iframe itself\n\n      if (window.HTMLIFrameElement && styleTarget instanceof window.HTMLIFrameElement) {\n        try {\n          // This will throw an exception if access to iframe is blocked\n          // due to cross-origin restrictions\n          styleTarget = styleTarget.contentDocument.head;\n        } catch (e) {\n          // istanbul ignore next\n          styleTarget = null;\n        }\n      }\n\n      memo[target] = styleTarget;\n    }\n\n    return memo[target];\n  };\n}();\n\nvar stylesInDom = [];\n\nfunction getIndexByIdentifier(identifier) {\n  var result = -1;\n\n  for (var i = 0; i < stylesInDom.length; i++) {\n    if (stylesInDom[i].identifier === identifier) {\n      result = i;\n      break;\n    }\n  }\n\n  return result;\n}\n\nfunction modulesToDom(list, options) {\n  var idCountMap = {};\n  var identifiers = [];\n\n  for (var i = 0; i < list.length; i++) {\n    var item = list[i];\n    var id = options.base ? item[0] + options.base : item[0];\n    var count = idCountMap[id] || 0;\n    var identifier = \"\".concat(id, \" \").concat(count);\n    idCountMap[id] = count + 1;\n    var index = getIndexByIdentifier(identifier);\n    var obj = {\n      css: item[1],\n      media: item[2],\n      sourceMap: item[3]\n    };\n\n    if (index !== -1) {\n      stylesInDom[index].references++;\n      stylesInDom[index].updater(obj);\n    } else {\n      stylesInDom.push({\n        identifier: identifier,\n        updater: addStyle(obj, options),\n        references: 1\n      });\n    }\n\n    identifiers.push(identifier);\n  }\n\n  return identifiers;\n}\n\nfunction insertStyleElement(options) {\n  var style = document.createElement('style');\n  var attributes = options.attributes || {};\n\n  if (typeof attributes.nonce === 'undefined') {\n    var nonce =  true ? __webpack_require__.nc : undefined;\n\n    if (nonce) {\n      attributes.nonce = nonce;\n    }\n  }\n\n  Object.keys(attributes).forEach(function (key) {\n    style.setAttribute(key, attributes[key]);\n  });\n\n  if (typeof options.insert === 'function') {\n    options.insert(style);\n  } else {\n    var target = getTarget(options.insert || 'head');\n\n    if (!target) {\n      throw new Error(\"Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.\");\n    }\n\n    target.appendChild(style);\n  }\n\n  return style;\n}\n\nfunction removeStyleElement(style) {\n  // istanbul ignore if\n  if (style.parentNode === null) {\n    return false;\n  }\n\n  style.parentNode.removeChild(style);\n}\n/* istanbul ignore next  */\n\n\nvar replaceText = function replaceText() {\n  var textStore = [];\n  return function replace(index, replacement) {\n    textStore[index] = replacement;\n    return textStore.filter(Boolean).join('\\n');\n  };\n}();\n\nfunction applyToSingletonTag(style, index, remove, obj) {\n  var css = remove ? '' : obj.media ? \"@media \".concat(obj.media, \" {\").concat(obj.css, \"}\") : obj.css; // For old IE\n\n  /* istanbul ignore if  */\n\n  if (style.styleSheet) {\n    style.styleSheet.cssText = replaceText(index, css);\n  } else {\n    var cssNode = document.createTextNode(css);\n    var childNodes = style.childNodes;\n\n    if (childNodes[index]) {\n      style.removeChild(childNodes[index]);\n    }\n\n    if (childNodes.length) {\n      style.insertBefore(cssNode, childNodes[index]);\n    } else {\n      style.appendChild(cssNode);\n    }\n  }\n}\n\nfunction applyToTag(style, options, obj) {\n  var css = obj.css;\n  var media = obj.media;\n  var sourceMap = obj.sourceMap;\n\n  if (media) {\n    style.setAttribute('media', media);\n  } else {\n    style.removeAttribute('media');\n  }\n\n  if (sourceMap && typeof btoa !== 'undefined') {\n    css += \"\\n/*# sourceMappingURL=data:application/json;base64,\".concat(btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))), \" */\");\n  } // For old IE\n\n  /* istanbul ignore if  */\n\n\n  if (style.styleSheet) {\n    style.styleSheet.cssText = css;\n  } else {\n    while (style.firstChild) {\n      style.removeChild(style.firstChild);\n    }\n\n    style.appendChild(document.createTextNode(css));\n  }\n}\n\nvar singleton = null;\nvar singletonCounter = 0;\n\nfunction addStyle(obj, options) {\n  var style;\n  var update;\n  var remove;\n\n  if (options.singleton) {\n    var styleIndex = singletonCounter++;\n    style = singleton || (singleton = insertStyleElement(options));\n    update = applyToSingletonTag.bind(null, style, styleIndex, false);\n    remove = applyToSingletonTag.bind(null, style, styleIndex, true);\n  } else {\n    style = insertStyleElement(options);\n    update = applyToTag.bind(null, style, options);\n\n    remove = function remove() {\n      removeStyleElement(style);\n    };\n  }\n\n  update(obj);\n  return function updateStyle(newObj) {\n    if (newObj) {\n      if (newObj.css === obj.css && newObj.media === obj.media && newObj.sourceMap === obj.sourceMap) {\n        return;\n      }\n\n      update(obj = newObj);\n    } else {\n      remove();\n    }\n  };\n}\n\nmodule.exports = function (list, options) {\n  options = options || {}; // Force single-tag solution on IE6-9, which has a hard limit on the # of <style>\n  // tags it will allow on a page\n\n  if (!options.singleton && typeof options.singleton !== 'boolean') {\n    options.singleton = isOldIE();\n  }\n\n  list = list || [];\n  var lastIdentifiers = modulesToDom(list, options);\n  return function update(newList) {\n    newList = newList || [];\n\n    if (Object.prototype.toString.call(newList) !== '[object Array]') {\n      return;\n    }\n\n    for (var i = 0; i < lastIdentifiers.length; i++) {\n      var identifier = lastIdentifiers[i];\n      var index = getIndexByIdentifier(identifier);\n      stylesInDom[index].references--;\n    }\n\n    var newLastIdentifiers = modulesToDom(newList, options);\n\n    for (var _i = 0; _i < lastIdentifiers.length; _i++) {\n      var _identifier = lastIdentifiers[_i];\n\n      var _index = getIndexByIdentifier(_identifier);\n\n      if (stylesInDom[_index].references === 0) {\n        stylesInDom[_index].updater();\n\n        stylesInDom.splice(_index, 1);\n      }\n    }\n\n    lastIdentifiers = newLastIdentifiers;\n  };\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNS5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luamVjdFN0eWxlc0ludG9TdHlsZVRhZy5qcz8yZGJhIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG52YXIgaXNPbGRJRSA9IGZ1bmN0aW9uIGlzT2xkSUUoKSB7XG4gIHZhciBtZW1vO1xuICByZXR1cm4gZnVuY3Rpb24gbWVtb3JpemUoKSB7XG4gICAgaWYgKHR5cGVvZiBtZW1vID09PSAndW5kZWZpbmVkJykge1xuICAgICAgLy8gVGVzdCBmb3IgSUUgPD0gOSBhcyBwcm9wb3NlZCBieSBCcm93c2VyaGFja3NcbiAgICAgIC8vIEBzZWUgaHR0cDovL2Jyb3dzZXJoYWNrcy5jb20vI2hhY2stZTcxZDg2OTJmNjUzMzQxNzNmZWU3MTVjMjIyY2I4MDVcbiAgICAgIC8vIFRlc3RzIGZvciBleGlzdGVuY2Ugb2Ygc3RhbmRhcmQgZ2xvYmFscyBpcyB0byBhbGxvdyBzdHlsZS1sb2FkZXJcbiAgICAgIC8vIHRvIG9wZXJhdGUgY29ycmVjdGx5IGludG8gbm9uLXN0YW5kYXJkIGVudmlyb25tZW50c1xuICAgICAgLy8gQHNlZSBodHRwczovL2dpdGh1Yi5jb20vd2VicGFjay1jb250cmliL3N0eWxlLWxvYWRlci9pc3N1ZXMvMTc3XG4gICAgICBtZW1vID0gQm9vbGVhbih3aW5kb3cgJiYgZG9jdW1lbnQgJiYgZG9jdW1lbnQuYWxsICYmICF3aW5kb3cuYXRvYik7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1lbW87XG4gIH07XG59KCk7XG5cbnZhciBnZXRUYXJnZXQgPSBmdW5jdGlvbiBnZXRUYXJnZXQoKSB7XG4gIHZhciBtZW1vID0ge307XG4gIHJldHVybiBmdW5jdGlvbiBtZW1vcml6ZSh0YXJnZXQpIHtcbiAgICBpZiAodHlwZW9mIG1lbW9bdGFyZ2V0XSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHZhciBzdHlsZVRhcmdldCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodGFyZ2V0KTsgLy8gU3BlY2lhbCBjYXNlIHRvIHJldHVybiBoZWFkIG9mIGlmcmFtZSBpbnN0ZWFkIG9mIGlmcmFtZSBpdHNlbGZcblxuICAgICAgaWYgKHdpbmRvdy5IVE1MSUZyYW1lRWxlbWVudCAmJiBzdHlsZVRhcmdldCBpbnN0YW5jZW9mIHdpbmRvdy5IVE1MSUZyYW1lRWxlbWVudCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIFRoaXMgd2lsbCB0aHJvdyBhbiBleGNlcHRpb24gaWYgYWNjZXNzIHRvIGlmcmFtZSBpcyBibG9ja2VkXG4gICAgICAgICAgLy8gZHVlIHRvIGNyb3NzLW9yaWdpbiByZXN0cmljdGlvbnNcbiAgICAgICAgICBzdHlsZVRhcmdldCA9IHN0eWxlVGFyZ2V0LmNvbnRlbnREb2N1bWVudC5oZWFkO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgLy8gaXN0YW5idWwgaWdub3JlIG5leHRcbiAgICAgICAgICBzdHlsZVRhcmdldCA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbWVtb1t0YXJnZXRdID0gc3R5bGVUYXJnZXQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1lbW9bdGFyZ2V0XTtcbiAgfTtcbn0oKTtcblxudmFyIHN0eWxlc0luRG9tID0gW107XG5cbmZ1bmN0aW9uIGdldEluZGV4QnlJZGVudGlmaWVyKGlkZW50aWZpZXIpIHtcbiAgdmFyIHJlc3VsdCA9IC0xO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3R5bGVzSW5Eb20ubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoc3R5bGVzSW5Eb21baV0uaWRlbnRpZmllciA9PT0gaWRlbnRpZmllcikge1xuICAgICAgcmVzdWx0ID0gaTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIG1vZHVsZXNUb0RvbShsaXN0LCBvcHRpb25zKSB7XG4gIHZhciBpZENvdW50TWFwID0ge307XG4gIHZhciBpZGVudGlmaWVycyA9IFtdO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykge1xuICAgIHZhciBpdGVtID0gbGlzdFtpXTtcbiAgICB2YXIgaWQgPSBvcHRpb25zLmJhc2UgPyBpdGVtWzBdICsgb3B0aW9ucy5iYXNlIDogaXRlbVswXTtcbiAgICB2YXIgY291bnQgPSBpZENvdW50TWFwW2lkXSB8fCAwO1xuICAgIHZhciBpZGVudGlmaWVyID0gXCJcIi5jb25jYXQoaWQsIFwiIFwiKS5jb25jYXQoY291bnQpO1xuICAgIGlkQ291bnRNYXBbaWRdID0gY291bnQgKyAxO1xuICAgIHZhciBpbmRleCA9IGdldEluZGV4QnlJZGVudGlmaWVyKGlkZW50aWZpZXIpO1xuICAgIHZhciBvYmogPSB7XG4gICAgICBjc3M6IGl0ZW1bMV0sXG4gICAgICBtZWRpYTogaXRlbVsyXSxcbiAgICAgIHNvdXJjZU1hcDogaXRlbVszXVxuICAgIH07XG5cbiAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICBzdHlsZXNJbkRvbVtpbmRleF0ucmVmZXJlbmNlcysrO1xuICAgICAgc3R5bGVzSW5Eb21baW5kZXhdLnVwZGF0ZXIob2JqKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3R5bGVzSW5Eb20ucHVzaCh7XG4gICAgICAgIGlkZW50aWZpZXI6IGlkZW50aWZpZXIsXG4gICAgICAgIHVwZGF0ZXI6IGFkZFN0eWxlKG9iaiwgb3B0aW9ucyksXG4gICAgICAgIHJlZmVyZW5jZXM6IDFcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlkZW50aWZpZXJzLnB1c2goaWRlbnRpZmllcik7XG4gIH1cblxuICByZXR1cm4gaWRlbnRpZmllcnM7XG59XG5cbmZ1bmN0aW9uIGluc2VydFN0eWxlRWxlbWVudChvcHRpb25zKSB7XG4gIHZhciBzdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gIHZhciBhdHRyaWJ1dGVzID0gb3B0aW9ucy5hdHRyaWJ1dGVzIHx8IHt9O1xuXG4gIGlmICh0eXBlb2YgYXR0cmlidXRlcy5ub25jZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICB2YXIgbm9uY2UgPSB0eXBlb2YgX193ZWJwYWNrX25vbmNlX18gIT09ICd1bmRlZmluZWQnID8gX193ZWJwYWNrX25vbmNlX18gOiBudWxsO1xuXG4gICAgaWYgKG5vbmNlKSB7XG4gICAgICBhdHRyaWJ1dGVzLm5vbmNlID0gbm9uY2U7XG4gICAgfVxuICB9XG5cbiAgT2JqZWN0LmtleXMoYXR0cmlidXRlcykuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgc3R5bGUuc2V0QXR0cmlidXRlKGtleSwgYXR0cmlidXRlc1trZXldKTtcbiAgfSk7XG5cbiAgaWYgKHR5cGVvZiBvcHRpb25zLmluc2VydCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIG9wdGlvbnMuaW5zZXJ0KHN0eWxlKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgdGFyZ2V0ID0gZ2V0VGFyZ2V0KG9wdGlvbnMuaW5zZXJ0IHx8ICdoZWFkJyk7XG5cbiAgICBpZiAoIXRhcmdldCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ291bGRuJ3QgZmluZCBhIHN0eWxlIHRhcmdldC4gVGhpcyBwcm9iYWJseSBtZWFucyB0aGF0IHRoZSB2YWx1ZSBmb3IgdGhlICdpbnNlcnQnIHBhcmFtZXRlciBpcyBpbnZhbGlkLlwiKTtcbiAgICB9XG5cbiAgICB0YXJnZXQuYXBwZW5kQ2hpbGQoc3R5bGUpO1xuICB9XG5cbiAgcmV0dXJuIHN0eWxlO1xufVxuXG5mdW5jdGlvbiByZW1vdmVTdHlsZUVsZW1lbnQoc3R5bGUpIHtcbiAgLy8gaXN0YW5idWwgaWdub3JlIGlmXG4gIGlmIChzdHlsZS5wYXJlbnROb2RlID09PSBudWxsKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgc3R5bGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChzdHlsZSk7XG59XG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAgKi9cblxuXG52YXIgcmVwbGFjZVRleHQgPSBmdW5jdGlvbiByZXBsYWNlVGV4dCgpIHtcbiAgdmFyIHRleHRTdG9yZSA9IFtdO1xuICByZXR1cm4gZnVuY3Rpb24gcmVwbGFjZShpbmRleCwgcmVwbGFjZW1lbnQpIHtcbiAgICB0ZXh0U3RvcmVbaW5kZXhdID0gcmVwbGFjZW1lbnQ7XG4gICAgcmV0dXJuIHRleHRTdG9yZS5maWx0ZXIoQm9vbGVhbikuam9pbignXFxuJyk7XG4gIH07XG59KCk7XG5cbmZ1bmN0aW9uIGFwcGx5VG9TaW5nbGV0b25UYWcoc3R5bGUsIGluZGV4LCByZW1vdmUsIG9iaikge1xuICB2YXIgY3NzID0gcmVtb3ZlID8gJycgOiBvYmoubWVkaWEgPyBcIkBtZWRpYSBcIi5jb25jYXQob2JqLm1lZGlhLCBcIiB7XCIpLmNvbmNhdChvYmouY3NzLCBcIn1cIikgOiBvYmouY3NzOyAvLyBGb3Igb2xkIElFXG5cbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICAqL1xuXG4gIGlmIChzdHlsZS5zdHlsZVNoZWV0KSB7XG4gICAgc3R5bGUuc3R5bGVTaGVldC5jc3NUZXh0ID0gcmVwbGFjZVRleHQoaW5kZXgsIGNzcyk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIGNzc05vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjc3MpO1xuICAgIHZhciBjaGlsZE5vZGVzID0gc3R5bGUuY2hpbGROb2RlcztcblxuICAgIGlmIChjaGlsZE5vZGVzW2luZGV4XSkge1xuICAgICAgc3R5bGUucmVtb3ZlQ2hpbGQoY2hpbGROb2Rlc1tpbmRleF0pO1xuICAgIH1cblxuICAgIGlmIChjaGlsZE5vZGVzLmxlbmd0aCkge1xuICAgICAgc3R5bGUuaW5zZXJ0QmVmb3JlKGNzc05vZGUsIGNoaWxkTm9kZXNbaW5kZXhdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3R5bGUuYXBwZW5kQ2hpbGQoY3NzTm9kZSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGFwcGx5VG9UYWcoc3R5bGUsIG9wdGlvbnMsIG9iaikge1xuICB2YXIgY3NzID0gb2JqLmNzcztcbiAgdmFyIG1lZGlhID0gb2JqLm1lZGlhO1xuICB2YXIgc291cmNlTWFwID0gb2JqLnNvdXJjZU1hcDtcblxuICBpZiAobWVkaWEpIHtcbiAgICBzdHlsZS5zZXRBdHRyaWJ1dGUoJ21lZGlhJywgbWVkaWEpO1xuICB9IGVsc2Uge1xuICAgIHN0eWxlLnJlbW92ZUF0dHJpYnV0ZSgnbWVkaWEnKTtcbiAgfVxuXG4gIGlmIChzb3VyY2VNYXAgJiYgdHlwZW9mIGJ0b2EgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgY3NzICs9IFwiXFxuLyojIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2Jhc2U2NCxcIi5jb25jYXQoYnRvYSh1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoc291cmNlTWFwKSkpKSwgXCIgKi9cIik7XG4gIH0gLy8gRm9yIG9sZCBJRVxuXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBpZiAgKi9cblxuXG4gIGlmIChzdHlsZS5zdHlsZVNoZWV0KSB7XG4gICAgc3R5bGUuc3R5bGVTaGVldC5jc3NUZXh0ID0gY3NzO1xuICB9IGVsc2Uge1xuICAgIHdoaWxlIChzdHlsZS5maXJzdENoaWxkKSB7XG4gICAgICBzdHlsZS5yZW1vdmVDaGlsZChzdHlsZS5maXJzdENoaWxkKTtcbiAgICB9XG5cbiAgICBzdHlsZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjc3MpKTtcbiAgfVxufVxuXG52YXIgc2luZ2xldG9uID0gbnVsbDtcbnZhciBzaW5nbGV0b25Db3VudGVyID0gMDtcblxuZnVuY3Rpb24gYWRkU3R5bGUob2JqLCBvcHRpb25zKSB7XG4gIHZhciBzdHlsZTtcbiAgdmFyIHVwZGF0ZTtcbiAgdmFyIHJlbW92ZTtcblxuICBpZiAob3B0aW9ucy5zaW5nbGV0b24pIHtcbiAgICB2YXIgc3R5bGVJbmRleCA9IHNpbmdsZXRvbkNvdW50ZXIrKztcbiAgICBzdHlsZSA9IHNpbmdsZXRvbiB8fCAoc2luZ2xldG9uID0gaW5zZXJ0U3R5bGVFbGVtZW50KG9wdGlvbnMpKTtcbiAgICB1cGRhdGUgPSBhcHBseVRvU2luZ2xldG9uVGFnLmJpbmQobnVsbCwgc3R5bGUsIHN0eWxlSW5kZXgsIGZhbHNlKTtcbiAgICByZW1vdmUgPSBhcHBseVRvU2luZ2xldG9uVGFnLmJpbmQobnVsbCwgc3R5bGUsIHN0eWxlSW5kZXgsIHRydWUpO1xuICB9IGVsc2Uge1xuICAgIHN0eWxlID0gaW5zZXJ0U3R5bGVFbGVtZW50KG9wdGlvbnMpO1xuICAgIHVwZGF0ZSA9IGFwcGx5VG9UYWcuYmluZChudWxsLCBzdHlsZSwgb3B0aW9ucyk7XG5cbiAgICByZW1vdmUgPSBmdW5jdGlvbiByZW1vdmUoKSB7XG4gICAgICByZW1vdmVTdHlsZUVsZW1lbnQoc3R5bGUpO1xuICAgIH07XG4gIH1cblxuICB1cGRhdGUob2JqKTtcbiAgcmV0dXJuIGZ1bmN0aW9uIHVwZGF0ZVN0eWxlKG5ld09iaikge1xuICAgIGlmIChuZXdPYmopIHtcbiAgICAgIGlmIChuZXdPYmouY3NzID09PSBvYmouY3NzICYmIG5ld09iai5tZWRpYSA9PT0gb2JqLm1lZGlhICYmIG5ld09iai5zb3VyY2VNYXAgPT09IG9iai5zb3VyY2VNYXApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB1cGRhdGUob2JqID0gbmV3T2JqKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVtb3ZlKCk7XG4gICAgfVxuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChsaXN0LCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OyAvLyBGb3JjZSBzaW5nbGUtdGFnIHNvbHV0aW9uIG9uIElFNi05LCB3aGljaCBoYXMgYSBoYXJkIGxpbWl0IG9uIHRoZSAjIG9mIDxzdHlsZT5cbiAgLy8gdGFncyBpdCB3aWxsIGFsbG93IG9uIGEgcGFnZVxuXG4gIGlmICghb3B0aW9ucy5zaW5nbGV0b24gJiYgdHlwZW9mIG9wdGlvbnMuc2luZ2xldG9uICE9PSAnYm9vbGVhbicpIHtcbiAgICBvcHRpb25zLnNpbmdsZXRvbiA9IGlzT2xkSUUoKTtcbiAgfVxuXG4gIGxpc3QgPSBsaXN0IHx8IFtdO1xuICB2YXIgbGFzdElkZW50aWZpZXJzID0gbW9kdWxlc1RvRG9tKGxpc3QsIG9wdGlvbnMpO1xuICByZXR1cm4gZnVuY3Rpb24gdXBkYXRlKG5ld0xpc3QpIHtcbiAgICBuZXdMaXN0ID0gbmV3TGlzdCB8fCBbXTtcblxuICAgIGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobmV3TGlzdCkgIT09ICdbb2JqZWN0IEFycmF5XScpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxhc3RJZGVudGlmaWVycy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGlkZW50aWZpZXIgPSBsYXN0SWRlbnRpZmllcnNbaV07XG4gICAgICB2YXIgaW5kZXggPSBnZXRJbmRleEJ5SWRlbnRpZmllcihpZGVudGlmaWVyKTtcbiAgICAgIHN0eWxlc0luRG9tW2luZGV4XS5yZWZlcmVuY2VzLS07XG4gICAgfVxuXG4gICAgdmFyIG5ld0xhc3RJZGVudGlmaWVycyA9IG1vZHVsZXNUb0RvbShuZXdMaXN0LCBvcHRpb25zKTtcblxuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBsYXN0SWRlbnRpZmllcnMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICB2YXIgX2lkZW50aWZpZXIgPSBsYXN0SWRlbnRpZmllcnNbX2ldO1xuXG4gICAgICB2YXIgX2luZGV4ID0gZ2V0SW5kZXhCeUlkZW50aWZpZXIoX2lkZW50aWZpZXIpO1xuXG4gICAgICBpZiAoc3R5bGVzSW5Eb21bX2luZGV4XS5yZWZlcmVuY2VzID09PSAwKSB7XG4gICAgICAgIHN0eWxlc0luRG9tW19pbmRleF0udXBkYXRlcigpO1xuXG4gICAgICAgIHN0eWxlc0luRG9tLnNwbGljZShfaW5kZXgsIDEpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGxhc3RJZGVudGlmaWVycyA9IG5ld0xhc3RJZGVudGlmaWVycztcbiAgfTtcbn07Il0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///5\n")},function(module,exports,__webpack_require__){"use strict";eval("\n\n/*\n  MIT License http://www.opensource.org/licenses/mit-license.php\n  Author Tobias Koppers @sokra\n*/\n// css base code, injected by the css-loader\nmodule.exports = function (useSourceMap) {\n  var list = []; // return the list of modules as css string\n\n  list.toString = function toString() {\n    return this.map(function (item) {\n      var content = cssWithMappingToString(item, useSourceMap);\n\n      if (item[2]) {\n        return '@media ' + item[2] + '{' + content + '}';\n      } else {\n        return content;\n      }\n    }).join('');\n  }; // import a list of modules into the list\n\n\n  list.i = function (modules, mediaQuery) {\n    if (typeof modules === 'string') {\n      modules = [[null, modules, '']];\n    }\n\n    var alreadyImportedModules = {};\n\n    for (var i = 0; i < this.length; i++) {\n      var id = this[i][0];\n\n      if (id != null) {\n        alreadyImportedModules[id] = true;\n      }\n    }\n\n    for (i = 0; i < modules.length; i++) {\n      var item = modules[i]; // skip already imported module\n      // this implementation is not 100% perfect for weird media query combinations\n      // when a module is imported multiple times with different media queries.\n      // I hope this will never occur (Hey this way we have smaller bundles)\n\n      if (item[0] == null || !alreadyImportedModules[item[0]]) {\n        if (mediaQuery && !item[2]) {\n          item[2] = mediaQuery;\n        } else if (mediaQuery) {\n          item[2] = '(' + item[2] + ') and (' + mediaQuery + ')';\n        }\n\n        list.push(item);\n      }\n    }\n  };\n\n  return list;\n};\n\nfunction cssWithMappingToString(item, useSourceMap) {\n  var content = item[1] || '';\n  var cssMapping = item[3];\n\n  if (!cssMapping) {\n    return content;\n  }\n\n  if (useSourceMap && typeof btoa === 'function') {\n    var sourceMapping = toComment(cssMapping);\n    var sourceURLs = cssMapping.sources.map(function (source) {\n      return '/*# sourceURL=' + cssMapping.sourceRoot + source + ' */';\n    });\n    return [content].concat(sourceURLs).concat([sourceMapping]).join('\\n');\n  }\n\n  return [content].join('\\n');\n} // Adapted from convert-source-map (MIT)\n\n\nfunction toComment(sourceMap) {\n  // eslint-disable-next-line no-undef\n  var base64 = btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap))));\n  var data = 'sourceMappingURL=data:application/json;charset=utf-8;base64,' + base64;\n  return '/*# ' + data + ' */';\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNi5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanM/MjRmYiJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxuLypcbiAgTUlUIExpY2Vuc2UgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHBcbiAgQXV0aG9yIFRvYmlhcyBLb3BwZXJzIEBzb2tyYVxuKi9cbi8vIGNzcyBiYXNlIGNvZGUsIGluamVjdGVkIGJ5IHRoZSBjc3MtbG9hZGVyXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh1c2VTb3VyY2VNYXApIHtcbiAgdmFyIGxpc3QgPSBbXTsgLy8gcmV0dXJuIHRoZSBsaXN0IG9mIG1vZHVsZXMgYXMgY3NzIHN0cmluZ1xuXG4gIGxpc3QudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgIHZhciBjb250ZW50ID0gY3NzV2l0aE1hcHBpbmdUb1N0cmluZyhpdGVtLCB1c2VTb3VyY2VNYXApO1xuXG4gICAgICBpZiAoaXRlbVsyXSkge1xuICAgICAgICByZXR1cm4gJ0BtZWRpYSAnICsgaXRlbVsyXSArICd7JyArIGNvbnRlbnQgKyAnfSc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gY29udGVudDtcbiAgICAgIH1cbiAgICB9KS5qb2luKCcnKTtcbiAgfTsgLy8gaW1wb3J0IGEgbGlzdCBvZiBtb2R1bGVzIGludG8gdGhlIGxpc3RcblxuXG4gIGxpc3QuaSA9IGZ1bmN0aW9uIChtb2R1bGVzLCBtZWRpYVF1ZXJ5KSB7XG4gICAgaWYgKHR5cGVvZiBtb2R1bGVzID09PSAnc3RyaW5nJykge1xuICAgICAgbW9kdWxlcyA9IFtbbnVsbCwgbW9kdWxlcywgJyddXTtcbiAgICB9XG5cbiAgICB2YXIgYWxyZWFkeUltcG9ydGVkTW9kdWxlcyA9IHt9O1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgaWQgPSB0aGlzW2ldWzBdO1xuXG4gICAgICBpZiAoaWQgIT0gbnVsbCkge1xuICAgICAgICBhbHJlYWR5SW1wb3J0ZWRNb2R1bGVzW2lkXSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChpID0gMDsgaSA8IG1vZHVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBpdGVtID0gbW9kdWxlc1tpXTsgLy8gc2tpcCBhbHJlYWR5IGltcG9ydGVkIG1vZHVsZVxuICAgICAgLy8gdGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBub3QgMTAwJSBwZXJmZWN0IGZvciB3ZWlyZCBtZWRpYSBxdWVyeSBjb21iaW5hdGlvbnNcbiAgICAgIC8vIHdoZW4gYSBtb2R1bGUgaXMgaW1wb3J0ZWQgbXVsdGlwbGUgdGltZXMgd2l0aCBkaWZmZXJlbnQgbWVkaWEgcXVlcmllcy5cbiAgICAgIC8vIEkgaG9wZSB0aGlzIHdpbGwgbmV2ZXIgb2NjdXIgKEhleSB0aGlzIHdheSB3ZSBoYXZlIHNtYWxsZXIgYnVuZGxlcylcblxuICAgICAgaWYgKGl0ZW1bMF0gPT0gbnVsbCB8fCAhYWxyZWFkeUltcG9ydGVkTW9kdWxlc1tpdGVtWzBdXSkge1xuICAgICAgICBpZiAobWVkaWFRdWVyeSAmJiAhaXRlbVsyXSkge1xuICAgICAgICAgIGl0ZW1bMl0gPSBtZWRpYVF1ZXJ5O1xuICAgICAgICB9IGVsc2UgaWYgKG1lZGlhUXVlcnkpIHtcbiAgICAgICAgICBpdGVtWzJdID0gJygnICsgaXRlbVsyXSArICcpIGFuZCAoJyArIG1lZGlhUXVlcnkgKyAnKSc7XG4gICAgICAgIH1cblxuICAgICAgICBsaXN0LnB1c2goaXRlbSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBsaXN0O1xufTtcblxuZnVuY3Rpb24gY3NzV2l0aE1hcHBpbmdUb1N0cmluZyhpdGVtLCB1c2VTb3VyY2VNYXApIHtcbiAgdmFyIGNvbnRlbnQgPSBpdGVtWzFdIHx8ICcnO1xuICB2YXIgY3NzTWFwcGluZyA9IGl0ZW1bM107XG5cbiAgaWYgKCFjc3NNYXBwaW5nKSB7XG4gICAgcmV0dXJuIGNvbnRlbnQ7XG4gIH1cblxuICBpZiAodXNlU291cmNlTWFwICYmIHR5cGVvZiBidG9hID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdmFyIHNvdXJjZU1hcHBpbmcgPSB0b0NvbW1lbnQoY3NzTWFwcGluZyk7XG4gICAgdmFyIHNvdXJjZVVSTHMgPSBjc3NNYXBwaW5nLnNvdXJjZXMubWFwKGZ1bmN0aW9uIChzb3VyY2UpIHtcbiAgICAgIHJldHVybiAnLyojIHNvdXJjZVVSTD0nICsgY3NzTWFwcGluZy5zb3VyY2VSb290ICsgc291cmNlICsgJyAqLyc7XG4gICAgfSk7XG4gICAgcmV0dXJuIFtjb250ZW50XS5jb25jYXQoc291cmNlVVJMcykuY29uY2F0KFtzb3VyY2VNYXBwaW5nXSkuam9pbignXFxuJyk7XG4gIH1cblxuICByZXR1cm4gW2NvbnRlbnRdLmpvaW4oJ1xcbicpO1xufSAvLyBBZGFwdGVkIGZyb20gY29udmVydC1zb3VyY2UtbWFwIChNSVQpXG5cblxuZnVuY3Rpb24gdG9Db21tZW50KHNvdXJjZU1hcCkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWZcbiAgdmFyIGJhc2U2NCA9IGJ0b2EodW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KHNvdXJjZU1hcCkpKSk7XG4gIHZhciBkYXRhID0gJ3NvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LCcgKyBiYXNlNjQ7XG4gIHJldHVybiAnLyojICcgKyBkYXRhICsgJyAqLyc7XG59Il0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///6\n")},function(module,exports,__webpack_require__){eval("/* WEBPACK VAR INJECTION */(function(process, setImmediate, global, Buffer) {/**\n * Utility functions for web applications.\n *\n * @author Dave Longley\n *\n * Copyright (c) 2010-2018 Digital Bazaar, Inc.\n */\nvar forge = __webpack_require__(4);\nvar baseN = __webpack_require__(237);\n\n/* Utilities API */\nvar util = module.exports = forge.util = forge.util || {};\n\n// define setImmediate and nextTick\n(function() {\n  // use native nextTick (unless we're in webpack)\n  // webpack (or better node-libs-browser polyfill) sets process.browser.\n  // this way we can detect webpack properly\n  if(typeof process !== 'undefined' && process.nextTick && !process.browser) {\n    util.nextTick = process.nextTick;\n    if(typeof setImmediate === 'function') {\n      util.setImmediate = setImmediate;\n    } else {\n      // polyfill setImmediate with nextTick, older versions of node\n      // (those w/o setImmediate) won't totally starve IO\n      util.setImmediate = util.nextTick;\n    }\n    return;\n  }\n\n  // polyfill nextTick with native setImmediate\n  if(typeof setImmediate === 'function') {\n    util.setImmediate = function() { return setImmediate.apply(undefined, arguments); };\n    util.nextTick = function(callback) {\n      return setImmediate(callback);\n    };\n    return;\n  }\n\n  /* Note: A polyfill upgrade pattern is used here to allow combining\n  polyfills. For example, MutationObserver is fast, but blocks UI updates,\n  so it needs to allow UI updates periodically, so it falls back on\n  postMessage or setTimeout. */\n\n  // polyfill with setTimeout\n  util.setImmediate = function(callback) {\n    setTimeout(callback, 0);\n  };\n\n  // upgrade polyfill to use postMessage\n  if(typeof window !== 'undefined' &&\n    typeof window.postMessage === 'function') {\n    var msg = 'forge.setImmediate';\n    var callbacks = [];\n    util.setImmediate = function(callback) {\n      callbacks.push(callback);\n      // only send message when one hasn't been sent in\n      // the current turn of the event loop\n      if(callbacks.length === 1) {\n        window.postMessage(msg, '*');\n      }\n    };\n    function handler(event) {\n      if(event.source === window && event.data === msg) {\n        event.stopPropagation();\n        var copy = callbacks.slice();\n        callbacks.length = 0;\n        copy.forEach(function(callback) {\n          callback();\n        });\n      }\n    }\n    window.addEventListener('message', handler, true);\n  }\n\n  // upgrade polyfill to use MutationObserver\n  if(typeof MutationObserver !== 'undefined') {\n    // polyfill with MutationObserver\n    var now = Date.now();\n    var attr = true;\n    var div = document.createElement('div');\n    var callbacks = [];\n    new MutationObserver(function() {\n      var copy = callbacks.slice();\n      callbacks.length = 0;\n      copy.forEach(function(callback) {\n        callback();\n      });\n    }).observe(div, {attributes: true});\n    var oldSetImmediate = util.setImmediate;\n    util.setImmediate = function(callback) {\n      if(Date.now() - now > 15) {\n        now = Date.now();\n        oldSetImmediate(callback);\n      } else {\n        callbacks.push(callback);\n        // only trigger observer when it hasn't been triggered in\n        // the current turn of the event loop\n        if(callbacks.length === 1) {\n          div.setAttribute('a', attr = !attr);\n        }\n      }\n    };\n  }\n\n  util.nextTick = util.setImmediate;\n})();\n\n// check if running under Node.js\nutil.isNodejs =\n  typeof process !== 'undefined' && process.versions && process.versions.node;\n\n\n// 'self' will also work in Web Workers (instance of WorkerGlobalScope) while\n// it will point to `window` in the main thread.\n// To remain compatible with older browsers, we fall back to 'window' if 'self'\n// is not available.\nutil.globalScope = (function() {\n  if(util.isNodejs) {\n    return global;\n  }\n\n  return typeof self === 'undefined' ? window : self;\n})();\n\n// define isArray\nutil.isArray = Array.isArray || function(x) {\n  return Object.prototype.toString.call(x) === '[object Array]';\n};\n\n// define isArrayBuffer\nutil.isArrayBuffer = function(x) {\n  return typeof ArrayBuffer !== 'undefined' && x instanceof ArrayBuffer;\n};\n\n// define isArrayBufferView\nutil.isArrayBufferView = function(x) {\n  return x && util.isArrayBuffer(x.buffer) && x.byteLength !== undefined;\n};\n\n/**\n * Ensure a bits param is 8, 16, 24, or 32. Used to validate input for\n * algorithms where bit manipulation, JavaScript limitations, and/or algorithm\n * design only allow for byte operations of a limited size.\n *\n * @param n number of bits.\n *\n * Throw Error if n invalid.\n */\nfunction _checkBitsParam(n) {\n  if(!(n === 8 || n === 16 || n === 24 || n === 32)) {\n    throw new Error('Only 8, 16, 24, or 32 bits supported: ' + n);\n  }\n}\n\n// TODO: set ByteBuffer to best available backing\nutil.ByteBuffer = ByteStringBuffer;\n\n/** Buffer w/BinaryString backing */\n\n/**\n * Constructor for a binary string backed byte buffer.\n *\n * @param [b] the bytes to wrap (either encoded as string, one byte per\n *          character, or as an ArrayBuffer or Typed Array).\n */\nfunction ByteStringBuffer(b) {\n  // TODO: update to match DataBuffer API\n\n  // the data in this buffer\n  this.data = '';\n  // the pointer for reading from this buffer\n  this.read = 0;\n\n  if(typeof b === 'string') {\n    this.data = b;\n  } else if(util.isArrayBuffer(b) || util.isArrayBufferView(b)) {\n    if(typeof Buffer !== 'undefined' && b instanceof Buffer) {\n      this.data = b.toString('binary');\n    } else {\n      // convert native buffer to forge buffer\n      // FIXME: support native buffers internally instead\n      var arr = new Uint8Array(b);\n      try {\n        this.data = String.fromCharCode.apply(null, arr);\n      } catch(e) {\n        for(var i = 0; i < arr.length; ++i) {\n          this.putByte(arr[i]);\n        }\n      }\n    }\n  } else if(b instanceof ByteStringBuffer ||\n    (typeof b === 'object' && typeof b.data === 'string' &&\n    typeof b.read === 'number')) {\n    // copy existing buffer\n    this.data = b.data;\n    this.read = b.read;\n  }\n\n  // used for v8 optimization\n  this._constructedStringLength = 0;\n}\nutil.ByteStringBuffer = ByteStringBuffer;\n\n/* Note: This is an optimization for V8-based browsers. When V8 concatenates\n  a string, the strings are only joined logically using a \"cons string\" or\n  \"constructed/concatenated string\". These containers keep references to one\n  another and can result in very large memory usage. For example, if a 2MB\n  string is constructed by concatenating 4 bytes together at a time, the\n  memory usage will be ~44MB; so ~22x increase. The strings are only joined\n  together when an operation requiring their joining takes place, such as\n  substr(). This function is called when adding data to this buffer to ensure\n  these types of strings are periodically joined to reduce the memory\n  footprint. */\nvar _MAX_CONSTRUCTED_STRING_LENGTH = 4096;\nutil.ByteStringBuffer.prototype._optimizeConstructedString = function(x) {\n  this._constructedStringLength += x;\n  if(this._constructedStringLength > _MAX_CONSTRUCTED_STRING_LENGTH) {\n    // this substr() should cause the constructed string to join\n    this.data.substr(0, 1);\n    this._constructedStringLength = 0;\n  }\n};\n\n/**\n * Gets the number of bytes in this buffer.\n *\n * @return the number of bytes in this buffer.\n */\nutil.ByteStringBuffer.prototype.length = function() {\n  return this.data.length - this.read;\n};\n\n/**\n * Gets whether or not this buffer is empty.\n *\n * @return true if this buffer is empty, false if not.\n */\nutil.ByteStringBuffer.prototype.isEmpty = function() {\n  return this.length() <= 0;\n};\n\n/**\n * Puts a byte in this buffer.\n *\n * @param b the byte to put.\n *\n * @return this buffer.\n */\nutil.ByteStringBuffer.prototype.putByte = function(b) {\n  return this.putBytes(String.fromCharCode(b));\n};\n\n/**\n * Puts a byte in this buffer N times.\n *\n * @param b the byte to put.\n * @param n the number of bytes of value b to put.\n *\n * @return this buffer.\n */\nutil.ByteStringBuffer.prototype.fillWithByte = function(b, n) {\n  b = String.fromCharCode(b);\n  var d = this.data;\n  while(n > 0) {\n    if(n & 1) {\n      d += b;\n    }\n    n >>>= 1;\n    if(n > 0) {\n      b += b;\n    }\n  }\n  this.data = d;\n  this._optimizeConstructedString(n);\n  return this;\n};\n\n/**\n * Puts bytes in this buffer.\n *\n * @param bytes the bytes (as a binary encoded string) to put.\n *\n * @return this buffer.\n */\nutil.ByteStringBuffer.prototype.putBytes = function(bytes) {\n  this.data += bytes;\n  this._optimizeConstructedString(bytes.length);\n  return this;\n};\n\n/**\n * Puts a UTF-16 encoded string into this buffer.\n *\n * @param str the string to put.\n *\n * @return this buffer.\n */\nutil.ByteStringBuffer.prototype.putString = function(str) {\n  return this.putBytes(util.encodeUtf8(str));\n};\n\n/**\n * Puts a 16-bit integer in this buffer in big-endian order.\n *\n * @param i the 16-bit integer.\n *\n * @return this buffer.\n */\nutil.ByteStringBuffer.prototype.putInt16 = function(i) {\n  return this.putBytes(\n    String.fromCharCode(i >> 8 & 0xFF) +\n    String.fromCharCode(i & 0xFF));\n};\n\n/**\n * Puts a 24-bit integer in this buffer in big-endian order.\n *\n * @param i the 24-bit integer.\n *\n * @return this buffer.\n */\nutil.ByteStringBuffer.prototype.putInt24 = function(i) {\n  return this.putBytes(\n    String.fromCharCode(i >> 16 & 0xFF) +\n    String.fromCharCode(i >> 8 & 0xFF) +\n    String.fromCharCode(i & 0xFF));\n};\n\n/**\n * Puts a 32-bit integer in this buffer in big-endian order.\n *\n * @param i the 32-bit integer.\n *\n * @return this buffer.\n */\nutil.ByteStringBuffer.prototype.putInt32 = function(i) {\n  return this.putBytes(\n    String.fromCharCode(i >> 24 & 0xFF) +\n    String.fromCharCode(i >> 16 & 0xFF) +\n    String.fromCharCode(i >> 8 & 0xFF) +\n    String.fromCharCode(i & 0xFF));\n};\n\n/**\n * Puts a 16-bit integer in this buffer in little-endian order.\n *\n * @param i the 16-bit integer.\n *\n * @return this buffer.\n */\nutil.ByteStringBuffer.prototype.putInt16Le = function(i) {\n  return this.putBytes(\n    String.fromCharCode(i & 0xFF) +\n    String.fromCharCode(i >> 8 & 0xFF));\n};\n\n/**\n * Puts a 24-bit integer in this buffer in little-endian order.\n *\n * @param i the 24-bit integer.\n *\n * @return this buffer.\n */\nutil.ByteStringBuffer.prototype.putInt24Le = function(i) {\n  return this.putBytes(\n    String.fromCharCode(i & 0xFF) +\n    String.fromCharCode(i >> 8 & 0xFF) +\n    String.fromCharCode(i >> 16 & 0xFF));\n};\n\n/**\n * Puts a 32-bit integer in this buffer in little-endian order.\n *\n * @param i the 32-bit integer.\n *\n * @return this buffer.\n */\nutil.ByteStringBuffer.prototype.putInt32Le = function(i) {\n  return this.putBytes(\n    String.fromCharCode(i & 0xFF) +\n    String.fromCharCode(i >> 8 & 0xFF) +\n    String.fromCharCode(i >> 16 & 0xFF) +\n    String.fromCharCode(i >> 24 & 0xFF));\n};\n\n/**\n * Puts an n-bit integer in this buffer in big-endian order.\n *\n * @param i the n-bit integer.\n * @param n the number of bits in the integer (8, 16, 24, or 32).\n *\n * @return this buffer.\n */\nutil.ByteStringBuffer.prototype.putInt = function(i, n) {\n  _checkBitsParam(n);\n  var bytes = '';\n  do {\n    n -= 8;\n    bytes += String.fromCharCode((i >> n) & 0xFF);\n  } while(n > 0);\n  return this.putBytes(bytes);\n};\n\n/**\n * Puts a signed n-bit integer in this buffer in big-endian order. Two's\n * complement representation is used.\n *\n * @param i the n-bit integer.\n * @param n the number of bits in the integer (8, 16, 24, or 32).\n *\n * @return this buffer.\n */\nutil.ByteStringBuffer.prototype.putSignedInt = function(i, n) {\n  // putInt checks n\n  if(i < 0) {\n    i += 2 << (n - 1);\n  }\n  return this.putInt(i, n);\n};\n\n/**\n * Puts the given buffer into this buffer.\n *\n * @param buffer the buffer to put into this one.\n *\n * @return this buffer.\n */\nutil.ByteStringBuffer.prototype.putBuffer = function(buffer) {\n  return this.putBytes(buffer.getBytes());\n};\n\n/**\n * Gets a byte from this buffer and advances the read pointer by 1.\n *\n * @return the byte.\n */\nutil.ByteStringBuffer.prototype.getByte = function() {\n  return this.data.charCodeAt(this.read++);\n};\n\n/**\n * Gets a uint16 from this buffer in big-endian order and advances the read\n * pointer by 2.\n *\n * @return the uint16.\n */\nutil.ByteStringBuffer.prototype.getInt16 = function() {\n  var rval = (\n    this.data.charCodeAt(this.read) << 8 ^\n    this.data.charCodeAt(this.read + 1));\n  this.read += 2;\n  return rval;\n};\n\n/**\n * Gets a uint24 from this buffer in big-endian order and advances the read\n * pointer by 3.\n *\n * @return the uint24.\n */\nutil.ByteStringBuffer.prototype.getInt24 = function() {\n  var rval = (\n    this.data.charCodeAt(this.read) << 16 ^\n    this.data.charCodeAt(this.read + 1) << 8 ^\n    this.data.charCodeAt(this.read + 2));\n  this.read += 3;\n  return rval;\n};\n\n/**\n * Gets a uint32 from this buffer in big-endian order and advances the read\n * pointer by 4.\n *\n * @return the word.\n */\nutil.ByteStringBuffer.prototype.getInt32 = function() {\n  var rval = (\n    this.data.charCodeAt(this.read) << 24 ^\n    this.data.charCodeAt(this.read + 1) << 16 ^\n    this.data.charCodeAt(this.read + 2) << 8 ^\n    this.data.charCodeAt(this.read + 3));\n  this.read += 4;\n  return rval;\n};\n\n/**\n * Gets a uint16 from this buffer in little-endian order and advances the read\n * pointer by 2.\n *\n * @return the uint16.\n */\nutil.ByteStringBuffer.prototype.getInt16Le = function() {\n  var rval = (\n    this.data.charCodeAt(this.read) ^\n    this.data.charCodeAt(this.read + 1) << 8);\n  this.read += 2;\n  return rval;\n};\n\n/**\n * Gets a uint24 from this buffer in little-endian order and advances the read\n * pointer by 3.\n *\n * @return the uint24.\n */\nutil.ByteStringBuffer.prototype.getInt24Le = function() {\n  var rval = (\n    this.data.charCodeAt(this.read) ^\n    this.data.charCodeAt(this.read + 1) << 8 ^\n    this.data.charCodeAt(this.read + 2) << 16);\n  this.read += 3;\n  return rval;\n};\n\n/**\n * Gets a uint32 from this buffer in little-endian order and advances the read\n * pointer by 4.\n *\n * @return the word.\n */\nutil.ByteStringBuffer.prototype.getInt32Le = function() {\n  var rval = (\n    this.data.charCodeAt(this.read) ^\n    this.data.charCodeAt(this.read + 1) << 8 ^\n    this.data.charCodeAt(this.read + 2) << 16 ^\n    this.data.charCodeAt(this.read + 3) << 24);\n  this.read += 4;\n  return rval;\n};\n\n/**\n * Gets an n-bit integer from this buffer in big-endian order and advances the\n * read pointer by ceil(n/8).\n *\n * @param n the number of bits in the integer (8, 16, 24, or 32).\n *\n * @return the integer.\n */\nutil.ByteStringBuffer.prototype.getInt = function(n) {\n  _checkBitsParam(n);\n  var rval = 0;\n  do {\n    // TODO: Use (rval * 0x100) if adding support for 33 to 53 bits.\n    rval = (rval << 8) + this.data.charCodeAt(this.read++);\n    n -= 8;\n  } while(n > 0);\n  return rval;\n};\n\n/**\n * Gets a signed n-bit integer from this buffer in big-endian order, using\n * two's complement, and advances the read pointer by n/8.\n *\n * @param n the number of bits in the integer (8, 16, 24, or 32).\n *\n * @return the integer.\n */\nutil.ByteStringBuffer.prototype.getSignedInt = function(n) {\n  // getInt checks n\n  var x = this.getInt(n);\n  var max = 2 << (n - 2);\n  if(x >= max) {\n    x -= max << 1;\n  }\n  return x;\n};\n\n/**\n * Reads bytes out as a binary encoded string and clears them from the\n * buffer. Note that the resulting string is binary encoded (in node.js this\n * encoding is referred to as `binary`, it is *not* `utf8`).\n *\n * @param count the number of bytes to read, undefined or null for all.\n *\n * @return a binary encoded string of bytes.\n */\nutil.ByteStringBuffer.prototype.getBytes = function(count) {\n  var rval;\n  if(count) {\n    // read count bytes\n    count = Math.min(this.length(), count);\n    rval = this.data.slice(this.read, this.read + count);\n    this.read += count;\n  } else if(count === 0) {\n    rval = '';\n  } else {\n    // read all bytes, optimize to only copy when needed\n    rval = (this.read === 0) ? this.data : this.data.slice(this.read);\n    this.clear();\n  }\n  return rval;\n};\n\n/**\n * Gets a binary encoded string of the bytes from this buffer without\n * modifying the read pointer.\n *\n * @param count the number of bytes to get, omit to get all.\n *\n * @return a string full of binary encoded characters.\n */\nutil.ByteStringBuffer.prototype.bytes = function(count) {\n  return (typeof(count) === 'undefined' ?\n    this.data.slice(this.read) :\n    this.data.slice(this.read, this.read + count));\n};\n\n/**\n * Gets a byte at the given index without modifying the read pointer.\n *\n * @param i the byte index.\n *\n * @return the byte.\n */\nutil.ByteStringBuffer.prototype.at = function(i) {\n  return this.data.charCodeAt(this.read + i);\n};\n\n/**\n * Puts a byte at the given index without modifying the read pointer.\n *\n * @param i the byte index.\n * @param b the byte to put.\n *\n * @return this buffer.\n */\nutil.ByteStringBuffer.prototype.setAt = function(i, b) {\n  this.data = this.data.substr(0, this.read + i) +\n    String.fromCharCode(b) +\n    this.data.substr(this.read + i + 1);\n  return this;\n};\n\n/**\n * Gets the last byte without modifying the read pointer.\n *\n * @return the last byte.\n */\nutil.ByteStringBuffer.prototype.last = function() {\n  return this.data.charCodeAt(this.data.length - 1);\n};\n\n/**\n * Creates a copy of this buffer.\n *\n * @return the copy.\n */\nutil.ByteStringBuffer.prototype.copy = function() {\n  var c = util.createBuffer(this.data);\n  c.read = this.read;\n  return c;\n};\n\n/**\n * Compacts this buffer.\n *\n * @return this buffer.\n */\nutil.ByteStringBuffer.prototype.compact = function() {\n  if(this.read > 0) {\n    this.data = this.data.slice(this.read);\n    this.read = 0;\n  }\n  return this;\n};\n\n/**\n * Clears this buffer.\n *\n * @return this buffer.\n */\nutil.ByteStringBuffer.prototype.clear = function() {\n  this.data = '';\n  this.read = 0;\n  return this;\n};\n\n/**\n * Shortens this buffer by triming bytes off of the end of this buffer.\n *\n * @param count the number of bytes to trim off.\n *\n * @return this buffer.\n */\nutil.ByteStringBuffer.prototype.truncate = function(count) {\n  var len = Math.max(0, this.length() - count);\n  this.data = this.data.substr(this.read, len);\n  this.read = 0;\n  return this;\n};\n\n/**\n * Converts this buffer to a hexadecimal string.\n *\n * @return a hexadecimal string.\n */\nutil.ByteStringBuffer.prototype.toHex = function() {\n  var rval = '';\n  for(var i = this.read; i < this.data.length; ++i) {\n    var b = this.data.charCodeAt(i);\n    if(b < 16) {\n      rval += '0';\n    }\n    rval += b.toString(16);\n  }\n  return rval;\n};\n\n/**\n * Converts this buffer to a UTF-16 string (standard JavaScript string).\n *\n * @return a UTF-16 string.\n */\nutil.ByteStringBuffer.prototype.toString = function() {\n  return util.decodeUtf8(this.bytes());\n};\n\n/** End Buffer w/BinaryString backing */\n\n/** Buffer w/UInt8Array backing */\n\n/**\n * FIXME: Experimental. Do not use yet.\n *\n * Constructor for an ArrayBuffer-backed byte buffer.\n *\n * The buffer may be constructed from a string, an ArrayBuffer, DataView, or a\n * TypedArray.\n *\n * If a string is given, its encoding should be provided as an option,\n * otherwise it will default to 'binary'. A 'binary' string is encoded such\n * that each character is one byte in length and size.\n *\n * If an ArrayBuffer, DataView, or TypedArray is given, it will be used\n * *directly* without any copying. Note that, if a write to the buffer requires\n * more space, the buffer will allocate a new backing ArrayBuffer to\n * accommodate. The starting read and write offsets for the buffer may be\n * given as options.\n *\n * @param [b] the initial bytes for this buffer.\n * @param options the options to use:\n *          [readOffset] the starting read offset to use (default: 0).\n *          [writeOffset] the starting write offset to use (default: the\n *            length of the first parameter).\n *          [growSize] the minimum amount, in bytes, to grow the buffer by to\n *            accommodate writes (default: 1024).\n *          [encoding] the encoding ('binary', 'utf8', 'utf16', 'hex') for the\n *            first parameter, if it is a string (default: 'binary').\n */\nfunction DataBuffer(b, options) {\n  // default options\n  options = options || {};\n\n  // pointers for read from/write to buffer\n  this.read = options.readOffset || 0;\n  this.growSize = options.growSize || 1024;\n\n  var isArrayBuffer = util.isArrayBuffer(b);\n  var isArrayBufferView = util.isArrayBufferView(b);\n  if(isArrayBuffer || isArrayBufferView) {\n    // use ArrayBuffer directly\n    if(isArrayBuffer) {\n      this.data = new DataView(b);\n    } else {\n      // TODO: adjust read/write offset based on the type of view\n      // or specify that this must be done in the options ... that the\n      // offsets are byte-based\n      this.data = new DataView(b.buffer, b.byteOffset, b.byteLength);\n    }\n    this.write = ('writeOffset' in options ?\n      options.writeOffset : this.data.byteLength);\n    return;\n  }\n\n  // initialize to empty array buffer and add any given bytes using putBytes\n  this.data = new DataView(new ArrayBuffer(0));\n  this.write = 0;\n\n  if(b !== null && b !== undefined) {\n    this.putBytes(b);\n  }\n\n  if('writeOffset' in options) {\n    this.write = options.writeOffset;\n  }\n}\nutil.DataBuffer = DataBuffer;\n\n/**\n * Gets the number of bytes in this buffer.\n *\n * @return the number of bytes in this buffer.\n */\nutil.DataBuffer.prototype.length = function() {\n  return this.write - this.read;\n};\n\n/**\n * Gets whether or not this buffer is empty.\n *\n * @return true if this buffer is empty, false if not.\n */\nutil.DataBuffer.prototype.isEmpty = function() {\n  return this.length() <= 0;\n};\n\n/**\n * Ensures this buffer has enough empty space to accommodate the given number\n * of bytes. An optional parameter may be given that indicates a minimum\n * amount to grow the buffer if necessary. If the parameter is not given,\n * the buffer will be grown by some previously-specified default amount\n * or heuristic.\n *\n * @param amount the number of bytes to accommodate.\n * @param [growSize] the minimum amount, in bytes, to grow the buffer by if\n *          necessary.\n */\nutil.DataBuffer.prototype.accommodate = function(amount, growSize) {\n  if(this.length() >= amount) {\n    return this;\n  }\n  growSize = Math.max(growSize || this.growSize, amount);\n\n  // grow buffer\n  var src = new Uint8Array(\n    this.data.buffer, this.data.byteOffset, this.data.byteLength);\n  var dst = new Uint8Array(this.length() + growSize);\n  dst.set(src);\n  this.data = new DataView(dst.buffer);\n\n  return this;\n};\n\n/**\n * Puts a byte in this buffer.\n *\n * @param b the byte to put.\n *\n * @return this buffer.\n */\nutil.DataBuffer.prototype.putByte = function(b) {\n  this.accommodate(1);\n  this.data.setUint8(this.write++, b);\n  return this;\n};\n\n/**\n * Puts a byte in this buffer N times.\n *\n * @param b the byte to put.\n * @param n the number of bytes of value b to put.\n *\n * @return this buffer.\n */\nutil.DataBuffer.prototype.fillWithByte = function(b, n) {\n  this.accommodate(n);\n  for(var i = 0; i < n; ++i) {\n    this.data.setUint8(b);\n  }\n  return this;\n};\n\n/**\n * Puts bytes in this buffer. The bytes may be given as a string, an\n * ArrayBuffer, a DataView, or a TypedArray.\n *\n * @param bytes the bytes to put.\n * @param [encoding] the encoding for the first parameter ('binary', 'utf8',\n *          'utf16', 'hex'), if it is a string (default: 'binary').\n *\n * @return this buffer.\n */\nutil.DataBuffer.prototype.putBytes = function(bytes, encoding) {\n  if(util.isArrayBufferView(bytes)) {\n    var src = new Uint8Array(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n    var len = src.byteLength - src.byteOffset;\n    this.accommodate(len);\n    var dst = new Uint8Array(this.data.buffer, this.write);\n    dst.set(src);\n    this.write += len;\n    return this;\n  }\n\n  if(util.isArrayBuffer(bytes)) {\n    var src = new Uint8Array(bytes);\n    this.accommodate(src.byteLength);\n    var dst = new Uint8Array(this.data.buffer);\n    dst.set(src, this.write);\n    this.write += src.byteLength;\n    return this;\n  }\n\n  // bytes is a util.DataBuffer or equivalent\n  if(bytes instanceof util.DataBuffer ||\n    (typeof bytes === 'object' &&\n    typeof bytes.read === 'number' && typeof bytes.write === 'number' &&\n    util.isArrayBufferView(bytes.data))) {\n    var src = new Uint8Array(bytes.data.byteLength, bytes.read, bytes.length());\n    this.accommodate(src.byteLength);\n    var dst = new Uint8Array(bytes.data.byteLength, this.write);\n    dst.set(src);\n    this.write += src.byteLength;\n    return this;\n  }\n\n  if(bytes instanceof util.ByteStringBuffer) {\n    // copy binary string and process as the same as a string parameter below\n    bytes = bytes.data;\n    encoding = 'binary';\n  }\n\n  // string conversion\n  encoding = encoding || 'binary';\n  if(typeof bytes === 'string') {\n    var view;\n\n    // decode from string\n    if(encoding === 'hex') {\n      this.accommodate(Math.ceil(bytes.length / 2));\n      view = new Uint8Array(this.data.buffer, this.write);\n      this.write += util.binary.hex.decode(bytes, view, this.write);\n      return this;\n    }\n    if(encoding === 'base64') {\n      this.accommodate(Math.ceil(bytes.length / 4) * 3);\n      view = new Uint8Array(this.data.buffer, this.write);\n      this.write += util.binary.base64.decode(bytes, view, this.write);\n      return this;\n    }\n\n    // encode text as UTF-8 bytes\n    if(encoding === 'utf8') {\n      // encode as UTF-8 then decode string as raw binary\n      bytes = util.encodeUtf8(bytes);\n      encoding = 'binary';\n    }\n\n    // decode string as raw binary\n    if(encoding === 'binary' || encoding === 'raw') {\n      // one byte per character\n      this.accommodate(bytes.length);\n      view = new Uint8Array(this.data.buffer, this.write);\n      this.write += util.binary.raw.decode(view);\n      return this;\n    }\n\n    // encode text as UTF-16 bytes\n    if(encoding === 'utf16') {\n      // two bytes per character\n      this.accommodate(bytes.length * 2);\n      view = new Uint16Array(this.data.buffer, this.write);\n      this.write += util.text.utf16.encode(view);\n      return this;\n    }\n\n    throw new Error('Invalid encoding: ' + encoding);\n  }\n\n  throw Error('Invalid parameter: ' + bytes);\n};\n\n/**\n * Puts the given buffer into this buffer.\n *\n * @param buffer the buffer to put into this one.\n *\n * @return this buffer.\n */\nutil.DataBuffer.prototype.putBuffer = function(buffer) {\n  this.putBytes(buffer);\n  buffer.clear();\n  return this;\n};\n\n/**\n * Puts a string into this buffer.\n *\n * @param str the string to put.\n * @param [encoding] the encoding for the string (default: 'utf16').\n *\n * @return this buffer.\n */\nutil.DataBuffer.prototype.putString = function(str) {\n  return this.putBytes(str, 'utf16');\n};\n\n/**\n * Puts a 16-bit integer in this buffer in big-endian order.\n *\n * @param i the 16-bit integer.\n *\n * @return this buffer.\n */\nutil.DataBuffer.prototype.putInt16 = function(i) {\n  this.accommodate(2);\n  this.data.setInt16(this.write, i);\n  this.write += 2;\n  return this;\n};\n\n/**\n * Puts a 24-bit integer in this buffer in big-endian order.\n *\n * @param i the 24-bit integer.\n *\n * @return this buffer.\n */\nutil.DataBuffer.prototype.putInt24 = function(i) {\n  this.accommodate(3);\n  this.data.setInt16(this.write, i >> 8 & 0xFFFF);\n  this.data.setInt8(this.write, i >> 16 & 0xFF);\n  this.write += 3;\n  return this;\n};\n\n/**\n * Puts a 32-bit integer in this buffer in big-endian order.\n *\n * @param i the 32-bit integer.\n *\n * @return this buffer.\n */\nutil.DataBuffer.prototype.putInt32 = function(i) {\n  this.accommodate(4);\n  this.data.setInt32(this.write, i);\n  this.write += 4;\n  return this;\n};\n\n/**\n * Puts a 16-bit integer in this buffer in little-endian order.\n *\n * @param i the 16-bit integer.\n *\n * @return this buffer.\n */\nutil.DataBuffer.prototype.putInt16Le = function(i) {\n  this.accommodate(2);\n  this.data.setInt16(this.write, i, true);\n  this.write += 2;\n  return this;\n};\n\n/**\n * Puts a 24-bit integer in this buffer in little-endian order.\n *\n * @param i the 24-bit integer.\n *\n * @return this buffer.\n */\nutil.DataBuffer.prototype.putInt24Le = function(i) {\n  this.accommodate(3);\n  this.data.setInt8(this.write, i >> 16 & 0xFF);\n  this.data.setInt16(this.write, i >> 8 & 0xFFFF, true);\n  this.write += 3;\n  return this;\n};\n\n/**\n * Puts a 32-bit integer in this buffer in little-endian order.\n *\n * @param i the 32-bit integer.\n *\n * @return this buffer.\n */\nutil.DataBuffer.prototype.putInt32Le = function(i) {\n  this.accommodate(4);\n  this.data.setInt32(this.write, i, true);\n  this.write += 4;\n  return this;\n};\n\n/**\n * Puts an n-bit integer in this buffer in big-endian order.\n *\n * @param i the n-bit integer.\n * @param n the number of bits in the integer (8, 16, 24, or 32).\n *\n * @return this buffer.\n */\nutil.DataBuffer.prototype.putInt = function(i, n) {\n  _checkBitsParam(n);\n  this.accommodate(n / 8);\n  do {\n    n -= 8;\n    this.data.setInt8(this.write++, (i >> n) & 0xFF);\n  } while(n > 0);\n  return this;\n};\n\n/**\n * Puts a signed n-bit integer in this buffer in big-endian order. Two's\n * complement representation is used.\n *\n * @param i the n-bit integer.\n * @param n the number of bits in the integer.\n *\n * @return this buffer.\n */\nutil.DataBuffer.prototype.putSignedInt = function(i, n) {\n  _checkBitsParam(n);\n  this.accommodate(n / 8);\n  if(i < 0) {\n    i += 2 << (n - 1);\n  }\n  return this.putInt(i, n);\n};\n\n/**\n * Gets a byte from this buffer and advances the read pointer by 1.\n *\n * @return the byte.\n */\nutil.DataBuffer.prototype.getByte = function() {\n  return this.data.getInt8(this.read++);\n};\n\n/**\n * Gets a uint16 from this buffer in big-endian order and advances the read\n * pointer by 2.\n *\n * @return the uint16.\n */\nutil.DataBuffer.prototype.getInt16 = function() {\n  var rval = this.data.getInt16(this.read);\n  this.read += 2;\n  return rval;\n};\n\n/**\n * Gets a uint24 from this buffer in big-endian order and advances the read\n * pointer by 3.\n *\n * @return the uint24.\n */\nutil.DataBuffer.prototype.getInt24 = function() {\n  var rval = (\n    this.data.getInt16(this.read) << 8 ^\n    this.data.getInt8(this.read + 2));\n  this.read += 3;\n  return rval;\n};\n\n/**\n * Gets a uint32 from this buffer in big-endian order and advances the read\n * pointer by 4.\n *\n * @return the word.\n */\nutil.DataBuffer.prototype.getInt32 = function() {\n  var rval = this.data.getInt32(this.read);\n  this.read += 4;\n  return rval;\n};\n\n/**\n * Gets a uint16 from this buffer in little-endian order and advances the read\n * pointer by 2.\n *\n * @return the uint16.\n */\nutil.DataBuffer.prototype.getInt16Le = function() {\n  var rval = this.data.getInt16(this.read, true);\n  this.read += 2;\n  return rval;\n};\n\n/**\n * Gets a uint24 from this buffer in little-endian order and advances the read\n * pointer by 3.\n *\n * @return the uint24.\n */\nutil.DataBuffer.prototype.getInt24Le = function() {\n  var rval = (\n    this.data.getInt8(this.read) ^\n    this.data.getInt16(this.read + 1, true) << 8);\n  this.read += 3;\n  return rval;\n};\n\n/**\n * Gets a uint32 from this buffer in little-endian order and advances the read\n * pointer by 4.\n *\n * @return the word.\n */\nutil.DataBuffer.prototype.getInt32Le = function() {\n  var rval = this.data.getInt32(this.read, true);\n  this.read += 4;\n  return rval;\n};\n\n/**\n * Gets an n-bit integer from this buffer in big-endian order and advances the\n * read pointer by n/8.\n *\n * @param n the number of bits in the integer (8, 16, 24, or 32).\n *\n * @return the integer.\n */\nutil.DataBuffer.prototype.getInt = function(n) {\n  _checkBitsParam(n);\n  var rval = 0;\n  do {\n    // TODO: Use (rval * 0x100) if adding support for 33 to 53 bits.\n    rval = (rval << 8) + this.data.getInt8(this.read++);\n    n -= 8;\n  } while(n > 0);\n  return rval;\n};\n\n/**\n * Gets a signed n-bit integer from this buffer in big-endian order, using\n * two's complement, and advances the read pointer by n/8.\n *\n * @param n the number of bits in the integer (8, 16, 24, or 32).\n *\n * @return the integer.\n */\nutil.DataBuffer.prototype.getSignedInt = function(n) {\n  // getInt checks n\n  var x = this.getInt(n);\n  var max = 2 << (n - 2);\n  if(x >= max) {\n    x -= max << 1;\n  }\n  return x;\n};\n\n/**\n * Reads bytes out as a binary encoded string and clears them from the\n * buffer.\n *\n * @param count the number of bytes to read, undefined or null for all.\n *\n * @return a binary encoded string of bytes.\n */\nutil.DataBuffer.prototype.getBytes = function(count) {\n  // TODO: deprecate this method, it is poorly named and\n  // this.toString('binary') replaces it\n  // add a toTypedArray()/toArrayBuffer() function\n  var rval;\n  if(count) {\n    // read count bytes\n    count = Math.min(this.length(), count);\n    rval = this.data.slice(this.read, this.read + count);\n    this.read += count;\n  } else if(count === 0) {\n    rval = '';\n  } else {\n    // read all bytes, optimize to only copy when needed\n    rval = (this.read === 0) ? this.data : this.data.slice(this.read);\n    this.clear();\n  }\n  return rval;\n};\n\n/**\n * Gets a binary encoded string of the bytes from this buffer without\n * modifying the read pointer.\n *\n * @param count the number of bytes to get, omit to get all.\n *\n * @return a string full of binary encoded characters.\n */\nutil.DataBuffer.prototype.bytes = function(count) {\n  // TODO: deprecate this method, it is poorly named, add \"getString()\"\n  return (typeof(count) === 'undefined' ?\n    this.data.slice(this.read) :\n    this.data.slice(this.read, this.read + count));\n};\n\n/**\n * Gets a byte at the given index without modifying the read pointer.\n *\n * @param i the byte index.\n *\n * @return the byte.\n */\nutil.DataBuffer.prototype.at = function(i) {\n  return this.data.getUint8(this.read + i);\n};\n\n/**\n * Puts a byte at the given index without modifying the read pointer.\n *\n * @param i the byte index.\n * @param b the byte to put.\n *\n * @return this buffer.\n */\nutil.DataBuffer.prototype.setAt = function(i, b) {\n  this.data.setUint8(i, b);\n  return this;\n};\n\n/**\n * Gets the last byte without modifying the read pointer.\n *\n * @return the last byte.\n */\nutil.DataBuffer.prototype.last = function() {\n  return this.data.getUint8(this.write - 1);\n};\n\n/**\n * Creates a copy of this buffer.\n *\n * @return the copy.\n */\nutil.DataBuffer.prototype.copy = function() {\n  return new util.DataBuffer(this);\n};\n\n/**\n * Compacts this buffer.\n *\n * @return this buffer.\n */\nutil.DataBuffer.prototype.compact = function() {\n  if(this.read > 0) {\n    var src = new Uint8Array(this.data.buffer, this.read);\n    var dst = new Uint8Array(src.byteLength);\n    dst.set(src);\n    this.data = new DataView(dst);\n    this.write -= this.read;\n    this.read = 0;\n  }\n  return this;\n};\n\n/**\n * Clears this buffer.\n *\n * @return this buffer.\n */\nutil.DataBuffer.prototype.clear = function() {\n  this.data = new DataView(new ArrayBuffer(0));\n  this.read = this.write = 0;\n  return this;\n};\n\n/**\n * Shortens this buffer by triming bytes off of the end of this buffer.\n *\n * @param count the number of bytes to trim off.\n *\n * @return this buffer.\n */\nutil.DataBuffer.prototype.truncate = function(count) {\n  this.write = Math.max(0, this.length() - count);\n  this.read = Math.min(this.read, this.write);\n  return this;\n};\n\n/**\n * Converts this buffer to a hexadecimal string.\n *\n * @return a hexadecimal string.\n */\nutil.DataBuffer.prototype.toHex = function() {\n  var rval = '';\n  for(var i = this.read; i < this.data.byteLength; ++i) {\n    var b = this.data.getUint8(i);\n    if(b < 16) {\n      rval += '0';\n    }\n    rval += b.toString(16);\n  }\n  return rval;\n};\n\n/**\n * Converts this buffer to a string, using the given encoding. If no\n * encoding is given, 'utf8' (UTF-8) is used.\n *\n * @param [encoding] the encoding to use: 'binary', 'utf8', 'utf16', 'hex',\n *          'base64' (default: 'utf8').\n *\n * @return a string representation of the bytes in this buffer.\n */\nutil.DataBuffer.prototype.toString = function(encoding) {\n  var view = new Uint8Array(this.data, this.read, this.length());\n  encoding = encoding || 'utf8';\n\n  // encode to string\n  if(encoding === 'binary' || encoding === 'raw') {\n    return util.binary.raw.encode(view);\n  }\n  if(encoding === 'hex') {\n    return util.binary.hex.encode(view);\n  }\n  if(encoding === 'base64') {\n    return util.binary.base64.encode(view);\n  }\n\n  // decode to text\n  if(encoding === 'utf8') {\n    return util.text.utf8.decode(view);\n  }\n  if(encoding === 'utf16') {\n    return util.text.utf16.decode(view);\n  }\n\n  throw new Error('Invalid encoding: ' + encoding);\n};\n\n/** End Buffer w/UInt8Array backing */\n\n/**\n * Creates a buffer that stores bytes. A value may be given to populate the\n * buffer with data. This value can either be string of encoded bytes or a\n * regular string of characters. When passing a string of binary encoded\n * bytes, the encoding `raw` should be given. This is also the default. When\n * passing a string of characters, the encoding `utf8` should be given.\n *\n * @param [input] a string with encoded bytes to store in the buffer.\n * @param [encoding] (default: 'raw', other: 'utf8').\n */\nutil.createBuffer = function(input, encoding) {\n  // TODO: deprecate, use new ByteBuffer() instead\n  encoding = encoding || 'raw';\n  if(input !== undefined && encoding === 'utf8') {\n    input = util.encodeUtf8(input);\n  }\n  return new util.ByteBuffer(input);\n};\n\n/**\n * Fills a string with a particular value. If you want the string to be a byte\n * string, pass in String.fromCharCode(theByte).\n *\n * @param c the character to fill the string with, use String.fromCharCode\n *          to fill the string with a byte value.\n * @param n the number of characters of value c to fill with.\n *\n * @return the filled string.\n */\nutil.fillString = function(c, n) {\n  var s = '';\n  while(n > 0) {\n    if(n & 1) {\n      s += c;\n    }\n    n >>>= 1;\n    if(n > 0) {\n      c += c;\n    }\n  }\n  return s;\n};\n\n/**\n * Performs a per byte XOR between two byte strings and returns the result as a\n * string of bytes.\n *\n * @param s1 first string of bytes.\n * @param s2 second string of bytes.\n * @param n the number of bytes to XOR.\n *\n * @return the XOR'd result.\n */\nutil.xorBytes = function(s1, s2, n) {\n  var s3 = '';\n  var b = '';\n  var t = '';\n  var i = 0;\n  var c = 0;\n  for(; n > 0; --n, ++i) {\n    b = s1.charCodeAt(i) ^ s2.charCodeAt(i);\n    if(c >= 10) {\n      s3 += t;\n      t = '';\n      c = 0;\n    }\n    t += String.fromCharCode(b);\n    ++c;\n  }\n  s3 += t;\n  return s3;\n};\n\n/**\n * Converts a hex string into a 'binary' encoded string of bytes.\n *\n * @param hex the hexadecimal string to convert.\n *\n * @return the binary-encoded string of bytes.\n */\nutil.hexToBytes = function(hex) {\n  // TODO: deprecate: \"Deprecated. Use util.binary.hex.decode instead.\"\n  var rval = '';\n  var i = 0;\n  if(hex.length & 1 == 1) {\n    // odd number of characters, convert first character alone\n    i = 1;\n    rval += String.fromCharCode(parseInt(hex[0], 16));\n  }\n  // convert 2 characters (1 byte) at a time\n  for(; i < hex.length; i += 2) {\n    rval += String.fromCharCode(parseInt(hex.substr(i, 2), 16));\n  }\n  return rval;\n};\n\n/**\n * Converts a 'binary' encoded string of bytes to hex.\n *\n * @param bytes the byte string to convert.\n *\n * @return the string of hexadecimal characters.\n */\nutil.bytesToHex = function(bytes) {\n  // TODO: deprecate: \"Deprecated. Use util.binary.hex.encode instead.\"\n  return util.createBuffer(bytes).toHex();\n};\n\n/**\n * Converts an 32-bit integer to 4-big-endian byte string.\n *\n * @param i the integer.\n *\n * @return the byte string.\n */\nutil.int32ToBytes = function(i) {\n  return (\n    String.fromCharCode(i >> 24 & 0xFF) +\n    String.fromCharCode(i >> 16 & 0xFF) +\n    String.fromCharCode(i >> 8 & 0xFF) +\n    String.fromCharCode(i & 0xFF));\n};\n\n// base64 characters, reverse mapping\nvar _base64 =\n  'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';\nvar _base64Idx = [\n/*43 -43 = 0*/\n/*'+',  1,  2,  3,'/' */\n   62, -1, -1, -1, 63,\n\n/*'0','1','2','3','4','5','6','7','8','9' */\n   52, 53, 54, 55, 56, 57, 58, 59, 60, 61,\n\n/*15, 16, 17,'=', 19, 20, 21 */\n  -1, -1, -1, 64, -1, -1, -1,\n\n/*65 - 43 = 22*/\n/*'A','B','C','D','E','F','G','H','I','J','K','L','M', */\n   0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12,\n\n/*'N','O','P','Q','R','S','T','U','V','W','X','Y','Z' */\n   13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,\n\n/*91 - 43 = 48 */\n/*48, 49, 50, 51, 52, 53 */\n  -1, -1, -1, -1, -1, -1,\n\n/*97 - 43 = 54*/\n/*'a','b','c','d','e','f','g','h','i','j','k','l','m' */\n   26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38,\n\n/*'n','o','p','q','r','s','t','u','v','w','x','y','z' */\n   39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51\n];\n\n// base58 characters (Bitcoin alphabet)\nvar _base58 = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz';\n\n/**\n * Base64 encodes a 'binary' encoded string of bytes.\n *\n * @param input the binary encoded string of bytes to base64-encode.\n * @param maxline the maximum number of encoded characters per line to use,\n *          defaults to none.\n *\n * @return the base64-encoded output.\n */\nutil.encode64 = function(input, maxline) {\n  // TODO: deprecate: \"Deprecated. Use util.binary.base64.encode instead.\"\n  var line = '';\n  var output = '';\n  var chr1, chr2, chr3;\n  var i = 0;\n  while(i < input.length) {\n    chr1 = input.charCodeAt(i++);\n    chr2 = input.charCodeAt(i++);\n    chr3 = input.charCodeAt(i++);\n\n    // encode 4 character group\n    line += _base64.charAt(chr1 >> 2);\n    line += _base64.charAt(((chr1 & 3) << 4) | (chr2 >> 4));\n    if(isNaN(chr2)) {\n      line += '==';\n    } else {\n      line += _base64.charAt(((chr2 & 15) << 2) | (chr3 >> 6));\n      line += isNaN(chr3) ? '=' : _base64.charAt(chr3 & 63);\n    }\n\n    if(maxline && line.length > maxline) {\n      output += line.substr(0, maxline) + '\\r\\n';\n      line = line.substr(maxline);\n    }\n  }\n  output += line;\n  return output;\n};\n\n/**\n * Base64 decodes a string into a 'binary' encoded string of bytes.\n *\n * @param input the base64-encoded input.\n *\n * @return the binary encoded string.\n */\nutil.decode64 = function(input) {\n  // TODO: deprecate: \"Deprecated. Use util.binary.base64.decode instead.\"\n\n  // remove all non-base64 characters\n  input = input.replace(/[^A-Za-z0-9\\+\\/\\=]/g, '');\n\n  var output = '';\n  var enc1, enc2, enc3, enc4;\n  var i = 0;\n\n  while(i < input.length) {\n    enc1 = _base64Idx[input.charCodeAt(i++) - 43];\n    enc2 = _base64Idx[input.charCodeAt(i++) - 43];\n    enc3 = _base64Idx[input.charCodeAt(i++) - 43];\n    enc4 = _base64Idx[input.charCodeAt(i++) - 43];\n\n    output += String.fromCharCode((enc1 << 2) | (enc2 >> 4));\n    if(enc3 !== 64) {\n      // decoded at least 2 bytes\n      output += String.fromCharCode(((enc2 & 15) << 4) | (enc3 >> 2));\n      if(enc4 !== 64) {\n        // decoded 3 bytes\n        output += String.fromCharCode(((enc3 & 3) << 6) | enc4);\n      }\n    }\n  }\n\n  return output;\n};\n\n/**\n * Encodes the given string of characters (a standard JavaScript\n * string) as a binary encoded string where the bytes represent\n * a UTF-8 encoded string of characters. Non-ASCII characters will be\n * encoded as multiple bytes according to UTF-8.\n *\n * @param str a standard string of characters to encode.\n *\n * @return the binary encoded string.\n */\nutil.encodeUtf8 = function(str) {\n  return unescape(encodeURIComponent(str));\n};\n\n/**\n * Decodes a binary encoded string that contains bytes that\n * represent a UTF-8 encoded string of characters -- into a\n * string of characters (a standard JavaScript string).\n *\n * @param str the binary encoded string to decode.\n *\n * @return the resulting standard string of characters.\n */\nutil.decodeUtf8 = function(str) {\n  return decodeURIComponent(escape(str));\n};\n\n// binary encoding/decoding tools\n// FIXME: Experimental. Do not use yet.\nutil.binary = {\n  raw: {},\n  hex: {},\n  base64: {},\n  base58: {},\n  baseN : {\n    encode: baseN.encode,\n    decode: baseN.decode\n  }\n};\n\n/**\n * Encodes a Uint8Array as a binary-encoded string. This encoding uses\n * a value between 0 and 255 for each character.\n *\n * @param bytes the Uint8Array to encode.\n *\n * @return the binary-encoded string.\n */\nutil.binary.raw.encode = function(bytes) {\n  return String.fromCharCode.apply(null, bytes);\n};\n\n/**\n * Decodes a binary-encoded string to a Uint8Array. This encoding uses\n * a value between 0 and 255 for each character.\n *\n * @param str the binary-encoded string to decode.\n * @param [output] an optional Uint8Array to write the output to; if it\n *          is too small, an exception will be thrown.\n * @param [offset] the start offset for writing to the output (default: 0).\n *\n * @return the Uint8Array or the number of bytes written if output was given.\n */\nutil.binary.raw.decode = function(str, output, offset) {\n  var out = output;\n  if(!out) {\n    out = new Uint8Array(str.length);\n  }\n  offset = offset || 0;\n  var j = offset;\n  for(var i = 0; i < str.length; ++i) {\n    out[j++] = str.charCodeAt(i);\n  }\n  return output ? (j - offset) : out;\n};\n\n/**\n * Encodes a 'binary' string, ArrayBuffer, DataView, TypedArray, or\n * ByteBuffer as a string of hexadecimal characters.\n *\n * @param bytes the bytes to convert.\n *\n * @return the string of hexadecimal characters.\n */\nutil.binary.hex.encode = util.bytesToHex;\n\n/**\n * Decodes a hex-encoded string to a Uint8Array.\n *\n * @param hex the hexadecimal string to convert.\n * @param [output] an optional Uint8Array to write the output to; if it\n *          is too small, an exception will be thrown.\n * @param [offset] the start offset for writing to the output (default: 0).\n *\n * @return the Uint8Array or the number of bytes written if output was given.\n */\nutil.binary.hex.decode = function(hex, output, offset) {\n  var out = output;\n  if(!out) {\n    out = new Uint8Array(Math.ceil(hex.length / 2));\n  }\n  offset = offset || 0;\n  var i = 0, j = offset;\n  if(hex.length & 1) {\n    // odd number of characters, convert first character alone\n    i = 1;\n    out[j++] = parseInt(hex[0], 16);\n  }\n  // convert 2 characters (1 byte) at a time\n  for(; i < hex.length; i += 2) {\n    out[j++] = parseInt(hex.substr(i, 2), 16);\n  }\n  return output ? (j - offset) : out;\n};\n\n/**\n * Base64-encodes a Uint8Array.\n *\n * @param input the Uint8Array to encode.\n * @param maxline the maximum number of encoded characters per line to use,\n *          defaults to none.\n *\n * @return the base64-encoded output string.\n */\nutil.binary.base64.encode = function(input, maxline) {\n  var line = '';\n  var output = '';\n  var chr1, chr2, chr3;\n  var i = 0;\n  while(i < input.byteLength) {\n    chr1 = input[i++];\n    chr2 = input[i++];\n    chr3 = input[i++];\n\n    // encode 4 character group\n    line += _base64.charAt(chr1 >> 2);\n    line += _base64.charAt(((chr1 & 3) << 4) | (chr2 >> 4));\n    if(isNaN(chr2)) {\n      line += '==';\n    } else {\n      line += _base64.charAt(((chr2 & 15) << 2) | (chr3 >> 6));\n      line += isNaN(chr3) ? '=' : _base64.charAt(chr3 & 63);\n    }\n\n    if(maxline && line.length > maxline) {\n      output += line.substr(0, maxline) + '\\r\\n';\n      line = line.substr(maxline);\n    }\n  }\n  output += line;\n  return output;\n};\n\n/**\n * Decodes a base64-encoded string to a Uint8Array.\n *\n * @param input the base64-encoded input string.\n * @param [output] an optional Uint8Array to write the output to; if it\n *          is too small, an exception will be thrown.\n * @param [offset] the start offset for writing to the output (default: 0).\n *\n * @return the Uint8Array or the number of bytes written if output was given.\n */\nutil.binary.base64.decode = function(input, output, offset) {\n  var out = output;\n  if(!out) {\n    out = new Uint8Array(Math.ceil(input.length / 4) * 3);\n  }\n\n  // remove all non-base64 characters\n  input = input.replace(/[^A-Za-z0-9\\+\\/\\=]/g, '');\n\n  offset = offset || 0;\n  var enc1, enc2, enc3, enc4;\n  var i = 0, j = offset;\n\n  while(i < input.length) {\n    enc1 = _base64Idx[input.charCodeAt(i++) - 43];\n    enc2 = _base64Idx[input.charCodeAt(i++) - 43];\n    enc3 = _base64Idx[input.charCodeAt(i++) - 43];\n    enc4 = _base64Idx[input.charCodeAt(i++) - 43];\n\n    out[j++] = (enc1 << 2) | (enc2 >> 4);\n    if(enc3 !== 64) {\n      // decoded at least 2 bytes\n      out[j++] = ((enc2 & 15) << 4) | (enc3 >> 2);\n      if(enc4 !== 64) {\n        // decoded 3 bytes\n        out[j++] = ((enc3 & 3) << 6) | enc4;\n      }\n    }\n  }\n\n  // make sure result is the exact decoded length\n  return output ? (j - offset) : out.subarray(0, j);\n};\n\n// add support for base58 encoding/decoding with Bitcoin alphabet\nutil.binary.base58.encode = function(input, maxline) {\n  return util.binary.baseN.encode(input, _base58, maxline);\n};\nutil.binary.base58.decode = function(input, maxline) {\n  return util.binary.baseN.decode(input, _base58, maxline);\n};\n\n// text encoding/decoding tools\n// FIXME: Experimental. Do not use yet.\nutil.text = {\n  utf8: {},\n  utf16: {}\n};\n\n/**\n * Encodes the given string as UTF-8 in a Uint8Array.\n *\n * @param str the string to encode.\n * @param [output] an optional Uint8Array to write the output to; if it\n *          is too small, an exception will be thrown.\n * @param [offset] the start offset for writing to the output (default: 0).\n *\n * @return the Uint8Array or the number of bytes written if output was given.\n */\nutil.text.utf8.encode = function(str, output, offset) {\n  str = util.encodeUtf8(str);\n  var out = output;\n  if(!out) {\n    out = new Uint8Array(str.length);\n  }\n  offset = offset || 0;\n  var j = offset;\n  for(var i = 0; i < str.length; ++i) {\n    out[j++] = str.charCodeAt(i);\n  }\n  return output ? (j - offset) : out;\n};\n\n/**\n * Decodes the UTF-8 contents from a Uint8Array.\n *\n * @param bytes the Uint8Array to decode.\n *\n * @return the resulting string.\n */\nutil.text.utf8.decode = function(bytes) {\n  return util.decodeUtf8(String.fromCharCode.apply(null, bytes));\n};\n\n/**\n * Encodes the given string as UTF-16 in a Uint8Array.\n *\n * @param str the string to encode.\n * @param [output] an optional Uint8Array to write the output to; if it\n *          is too small, an exception will be thrown.\n * @param [offset] the start offset for writing to the output (default: 0).\n *\n * @return the Uint8Array or the number of bytes written if output was given.\n */\nutil.text.utf16.encode = function(str, output, offset) {\n  var out = output;\n  if(!out) {\n    out = new Uint8Array(str.length * 2);\n  }\n  var view = new Uint16Array(out.buffer);\n  offset = offset || 0;\n  var j = offset;\n  var k = offset;\n  for(var i = 0; i < str.length; ++i) {\n    view[k++] = str.charCodeAt(i);\n    j += 2;\n  }\n  return output ? (j - offset) : out;\n};\n\n/**\n * Decodes the UTF-16 contents from a Uint8Array.\n *\n * @param bytes the Uint8Array to decode.\n *\n * @return the resulting string.\n */\nutil.text.utf16.decode = function(bytes) {\n  return String.fromCharCode.apply(null, new Uint16Array(bytes.buffer));\n};\n\n/**\n * Deflates the given data using a flash interface.\n *\n * @param api the flash interface.\n * @param bytes the data.\n * @param raw true to return only raw deflate data, false to include zlib\n *          header and trailer.\n *\n * @return the deflated data as a string.\n */\nutil.deflate = function(api, bytes, raw) {\n  bytes = util.decode64(api.deflate(util.encode64(bytes)).rval);\n\n  // strip zlib header and trailer if necessary\n  if(raw) {\n    // zlib header is 2 bytes (CMF,FLG) where FLG indicates that\n    // there is a 4-byte DICT (alder-32) block before the data if\n    // its 5th bit is set\n    var start = 2;\n    var flg = bytes.charCodeAt(1);\n    if(flg & 0x20) {\n      start = 6;\n    }\n    // zlib trailer is 4 bytes of adler-32\n    bytes = bytes.substring(start, bytes.length - 4);\n  }\n\n  return bytes;\n};\n\n/**\n * Inflates the given data using a flash interface.\n *\n * @param api the flash interface.\n * @param bytes the data.\n * @param raw true if the incoming data has no zlib header or trailer and is\n *          raw DEFLATE data.\n *\n * @return the inflated data as a string, null on error.\n */\nutil.inflate = function(api, bytes, raw) {\n  // TODO: add zlib header and trailer if necessary/possible\n  var rval = api.inflate(util.encode64(bytes)).rval;\n  return (rval === null) ? null : util.decode64(rval);\n};\n\n/**\n * Sets a storage object.\n *\n * @param api the storage interface.\n * @param id the storage ID to use.\n * @param obj the storage object, null to remove.\n */\nvar _setStorageObject = function(api, id, obj) {\n  if(!api) {\n    throw new Error('WebStorage not available.');\n  }\n\n  var rval;\n  if(obj === null) {\n    rval = api.removeItem(id);\n  } else {\n    // json-encode and base64-encode object\n    obj = util.encode64(JSON.stringify(obj));\n    rval = api.setItem(id, obj);\n  }\n\n  // handle potential flash error\n  if(typeof(rval) !== 'undefined' && rval.rval !== true) {\n    var error = new Error(rval.error.message);\n    error.id = rval.error.id;\n    error.name = rval.error.name;\n    throw error;\n  }\n};\n\n/**\n * Gets a storage object.\n *\n * @param api the storage interface.\n * @param id the storage ID to use.\n *\n * @return the storage object entry or null if none exists.\n */\nvar _getStorageObject = function(api, id) {\n  if(!api) {\n    throw new Error('WebStorage not available.');\n  }\n\n  // get the existing entry\n  var rval = api.getItem(id);\n\n  /* Note: We check api.init because we can't do (api == localStorage)\n    on IE because of \"Class doesn't support Automation\" exception. Only\n    the flash api has an init method so this works too, but we need a\n    better solution in the future. */\n\n  // flash returns item wrapped in an object, handle special case\n  if(api.init) {\n    if(rval.rval === null) {\n      if(rval.error) {\n        var error = new Error(rval.error.message);\n        error.id = rval.error.id;\n        error.name = rval.error.name;\n        throw error;\n      }\n      // no error, but also no item\n      rval = null;\n    } else {\n      rval = rval.rval;\n    }\n  }\n\n  // handle decoding\n  if(rval !== null) {\n    // base64-decode and json-decode data\n    rval = JSON.parse(util.decode64(rval));\n  }\n\n  return rval;\n};\n\n/**\n * Stores an item in local storage.\n *\n * @param api the storage interface.\n * @param id the storage ID to use.\n * @param key the key for the item.\n * @param data the data for the item (any javascript object/primitive).\n */\nvar _setItem = function(api, id, key, data) {\n  // get storage object\n  var obj = _getStorageObject(api, id);\n  if(obj === null) {\n    // create a new storage object\n    obj = {};\n  }\n  // update key\n  obj[key] = data;\n\n  // set storage object\n  _setStorageObject(api, id, obj);\n};\n\n/**\n * Gets an item from local storage.\n *\n * @param api the storage interface.\n * @param id the storage ID to use.\n * @param key the key for the item.\n *\n * @return the item.\n */\nvar _getItem = function(api, id, key) {\n  // get storage object\n  var rval = _getStorageObject(api, id);\n  if(rval !== null) {\n    // return data at key\n    rval = (key in rval) ? rval[key] : null;\n  }\n\n  return rval;\n};\n\n/**\n * Removes an item from local storage.\n *\n * @param api the storage interface.\n * @param id the storage ID to use.\n * @param key the key for the item.\n */\nvar _removeItem = function(api, id, key) {\n  // get storage object\n  var obj = _getStorageObject(api, id);\n  if(obj !== null && key in obj) {\n    // remove key\n    delete obj[key];\n\n    // see if entry has no keys remaining\n    var empty = true;\n    for(var prop in obj) {\n      empty = false;\n      break;\n    }\n    if(empty) {\n      // remove entry entirely if no keys are left\n      obj = null;\n    }\n\n    // set storage object\n    _setStorageObject(api, id, obj);\n  }\n};\n\n/**\n * Clears the local disk storage identified by the given ID.\n *\n * @param api the storage interface.\n * @param id the storage ID to use.\n */\nvar _clearItems = function(api, id) {\n  _setStorageObject(api, id, null);\n};\n\n/**\n * Calls a storage function.\n *\n * @param func the function to call.\n * @param args the arguments for the function.\n * @param location the location argument.\n *\n * @return the return value from the function.\n */\nvar _callStorageFunction = function(func, args, location) {\n  var rval = null;\n\n  // default storage types\n  if(typeof(location) === 'undefined') {\n    location = ['web', 'flash'];\n  }\n\n  // apply storage types in order of preference\n  var type;\n  var done = false;\n  var exception = null;\n  for(var idx in location) {\n    type = location[idx];\n    try {\n      if(type === 'flash' || type === 'both') {\n        if(args[0] === null) {\n          throw new Error('Flash local storage not available.');\n        }\n        rval = func.apply(this, args);\n        done = (type === 'flash');\n      }\n      if(type === 'web' || type === 'both') {\n        args[0] = localStorage;\n        rval = func.apply(this, args);\n        done = true;\n      }\n    } catch(ex) {\n      exception = ex;\n    }\n    if(done) {\n      break;\n    }\n  }\n\n  if(!done) {\n    throw exception;\n  }\n\n  return rval;\n};\n\n/**\n * Stores an item on local disk.\n *\n * The available types of local storage include 'flash', 'web', and 'both'.\n *\n * The type 'flash' refers to flash local storage (SharedObject). In order\n * to use flash local storage, the 'api' parameter must be valid. The type\n * 'web' refers to WebStorage, if supported by the browser. The type 'both'\n * refers to storing using both 'flash' and 'web', not just one or the\n * other.\n *\n * The location array should list the storage types to use in order of\n * preference:\n *\n * ['flash']: flash only storage\n * ['web']: web only storage\n * ['both']: try to store in both\n * ['flash','web']: store in flash first, but if not available, 'web'\n * ['web','flash']: store in web first, but if not available, 'flash'\n *\n * The location array defaults to: ['web', 'flash']\n *\n * @param api the flash interface, null to use only WebStorage.\n * @param id the storage ID to use.\n * @param key the key for the item.\n * @param data the data for the item (any javascript object/primitive).\n * @param location an array with the preferred types of storage to use.\n */\nutil.setItem = function(api, id, key, data, location) {\n  _callStorageFunction(_setItem, arguments, location);\n};\n\n/**\n * Gets an item on local disk.\n *\n * Set setItem() for details on storage types.\n *\n * @param api the flash interface, null to use only WebStorage.\n * @param id the storage ID to use.\n * @param key the key for the item.\n * @param location an array with the preferred types of storage to use.\n *\n * @return the item.\n */\nutil.getItem = function(api, id, key, location) {\n  return _callStorageFunction(_getItem, arguments, location);\n};\n\n/**\n * Removes an item on local disk.\n *\n * Set setItem() for details on storage types.\n *\n * @param api the flash interface.\n * @param id the storage ID to use.\n * @param key the key for the item.\n * @param location an array with the preferred types of storage to use.\n */\nutil.removeItem = function(api, id, key, location) {\n  _callStorageFunction(_removeItem, arguments, location);\n};\n\n/**\n * Clears the local disk storage identified by the given ID.\n *\n * Set setItem() for details on storage types.\n *\n * @param api the flash interface if flash is available.\n * @param id the storage ID to use.\n * @param location an array with the preferred types of storage to use.\n */\nutil.clearItems = function(api, id, location) {\n  _callStorageFunction(_clearItems, arguments, location);\n};\n\n/**\n * Check if an object is empty.\n *\n * Taken from:\n * http://stackoverflow.com/questions/679915/how-do-i-test-for-an-empty-javascript-object-from-json/679937#679937\n *\n * @param object the object to check.\n */\nutil.isEmpty = function(obj) {\n  for(var prop in obj) {\n    if(obj.hasOwnProperty(prop)) {\n      return false;\n    }\n  }\n  return true;\n};\n\n/**\n * Format with simple printf-style interpolation.\n *\n * %%: literal '%'\n * %s,%o: convert next argument into a string.\n *\n * @param format the string to format.\n * @param ... arguments to interpolate into the format string.\n */\nutil.format = function(format) {\n  var re = /%./g;\n  // current match\n  var match;\n  // current part\n  var part;\n  // current arg index\n  var argi = 0;\n  // collected parts to recombine later\n  var parts = [];\n  // last index found\n  var last = 0;\n  // loop while matches remain\n  while((match = re.exec(format))) {\n    part = format.substring(last, re.lastIndex - 2);\n    // don't add empty strings (ie, parts between %s%s)\n    if(part.length > 0) {\n      parts.push(part);\n    }\n    last = re.lastIndex;\n    // switch on % code\n    var code = match[0][1];\n    switch(code) {\n    case 's':\n    case 'o':\n      // check if enough arguments were given\n      if(argi < arguments.length) {\n        parts.push(arguments[argi++ + 1]);\n      } else {\n        parts.push('<?>');\n      }\n      break;\n    // FIXME: do proper formating for numbers, etc\n    //case 'f':\n    //case 'd':\n    case '%':\n      parts.push('%');\n      break;\n    default:\n      parts.push('<%' + code + '?>');\n    }\n  }\n  // add trailing part of format string\n  parts.push(format.substring(last));\n  return parts.join('');\n};\n\n/**\n * Formats a number.\n *\n * http://snipplr.com/view/5945/javascript-numberformat--ported-from-php/\n */\nutil.formatNumber = function(number, decimals, dec_point, thousands_sep) {\n  // http://kevin.vanzonneveld.net\n  // +   original by: Jonas Raoni Soares Silva (http://www.jsfromhell.com)\n  // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)\n  // +     bugfix by: Michael White (http://crestidg.com)\n  // +     bugfix by: Benjamin Lupton\n  // +     bugfix by: Allan Jensen (http://www.winternet.no)\n  // +    revised by: Jonas Raoni Soares Silva (http://www.jsfromhell.com)\n  // *     example 1: number_format(1234.5678, 2, '.', '');\n  // *     returns 1: 1234.57\n\n  var n = number, c = isNaN(decimals = Math.abs(decimals)) ? 2 : decimals;\n  var d = dec_point === undefined ? ',' : dec_point;\n  var t = thousands_sep === undefined ?\n   '.' : thousands_sep, s = n < 0 ? '-' : '';\n  var i = parseInt((n = Math.abs(+n || 0).toFixed(c)), 10) + '';\n  var j = (i.length > 3) ? i.length % 3 : 0;\n  return s + (j ? i.substr(0, j) + t : '') +\n    i.substr(j).replace(/(\\d{3})(?=\\d)/g, '$1' + t) +\n    (c ? d + Math.abs(n - i).toFixed(c).slice(2) : '');\n};\n\n/**\n * Formats a byte size.\n *\n * http://snipplr.com/view/5949/format-humanize-file-byte-size-presentation-in-javascript/\n */\nutil.formatSize = function(size) {\n  if(size >= 1073741824) {\n    size = util.formatNumber(size / 1073741824, 2, '.', '') + ' GiB';\n  } else if(size >= 1048576) {\n    size = util.formatNumber(size / 1048576, 2, '.', '') + ' MiB';\n  } else if(size >= 1024) {\n    size = util.formatNumber(size / 1024, 0) + ' KiB';\n  } else {\n    size = util.formatNumber(size, 0) + ' bytes';\n  }\n  return size;\n};\n\n/**\n * Converts an IPv4 or IPv6 string representation into bytes (in network order).\n *\n * @param ip the IPv4 or IPv6 address to convert.\n *\n * @return the 4-byte IPv6 or 16-byte IPv6 address or null if the address can't\n *         be parsed.\n */\nutil.bytesFromIP = function(ip) {\n  if(ip.indexOf('.') !== -1) {\n    return util.bytesFromIPv4(ip);\n  }\n  if(ip.indexOf(':') !== -1) {\n    return util.bytesFromIPv6(ip);\n  }\n  return null;\n};\n\n/**\n * Converts an IPv4 string representation into bytes (in network order).\n *\n * @param ip the IPv4 address to convert.\n *\n * @return the 4-byte address or null if the address can't be parsed.\n */\nutil.bytesFromIPv4 = function(ip) {\n  ip = ip.split('.');\n  if(ip.length !== 4) {\n    return null;\n  }\n  var b = util.createBuffer();\n  for(var i = 0; i < ip.length; ++i) {\n    var num = parseInt(ip[i], 10);\n    if(isNaN(num)) {\n      return null;\n    }\n    b.putByte(num);\n  }\n  return b.getBytes();\n};\n\n/**\n * Converts an IPv6 string representation into bytes (in network order).\n *\n * @param ip the IPv6 address to convert.\n *\n * @return the 16-byte address or null if the address can't be parsed.\n */\nutil.bytesFromIPv6 = function(ip) {\n  var blanks = 0;\n  ip = ip.split(':').filter(function(e) {\n    if(e.length === 0) ++blanks;\n    return true;\n  });\n  var zeros = (8 - ip.length + blanks) * 2;\n  var b = util.createBuffer();\n  for(var i = 0; i < 8; ++i) {\n    if(!ip[i] || ip[i].length === 0) {\n      b.fillWithByte(0, zeros);\n      zeros = 0;\n      continue;\n    }\n    var bytes = util.hexToBytes(ip[i]);\n    if(bytes.length < 2) {\n      b.putByte(0);\n    }\n    b.putBytes(bytes);\n  }\n  return b.getBytes();\n};\n\n/**\n * Converts 4-bytes into an IPv4 string representation or 16-bytes into\n * an IPv6 string representation. The bytes must be in network order.\n *\n * @param bytes the bytes to convert.\n *\n * @return the IPv4 or IPv6 string representation if 4 or 16 bytes,\n *         respectively, are given, otherwise null.\n */\nutil.bytesToIP = function(bytes) {\n  if(bytes.length === 4) {\n    return util.bytesToIPv4(bytes);\n  }\n  if(bytes.length === 16) {\n    return util.bytesToIPv6(bytes);\n  }\n  return null;\n};\n\n/**\n * Converts 4-bytes into an IPv4 string representation. The bytes must be\n * in network order.\n *\n * @param bytes the bytes to convert.\n *\n * @return the IPv4 string representation or null for an invalid # of bytes.\n */\nutil.bytesToIPv4 = function(bytes) {\n  if(bytes.length !== 4) {\n    return null;\n  }\n  var ip = [];\n  for(var i = 0; i < bytes.length; ++i) {\n    ip.push(bytes.charCodeAt(i));\n  }\n  return ip.join('.');\n};\n\n/**\n * Converts 16-bytes into an IPv16 string representation. The bytes must be\n * in network order.\n *\n * @param bytes the bytes to convert.\n *\n * @return the IPv16 string representation or null for an invalid # of bytes.\n */\nutil.bytesToIPv6 = function(bytes) {\n  if(bytes.length !== 16) {\n    return null;\n  }\n  var ip = [];\n  var zeroGroups = [];\n  var zeroMaxGroup = 0;\n  for(var i = 0; i < bytes.length; i += 2) {\n    var hex = util.bytesToHex(bytes[i] + bytes[i + 1]);\n    // canonicalize zero representation\n    while(hex[0] === '0' && hex !== '0') {\n      hex = hex.substr(1);\n    }\n    if(hex === '0') {\n      var last = zeroGroups[zeroGroups.length - 1];\n      var idx = ip.length;\n      if(!last || idx !== last.end + 1) {\n        zeroGroups.push({start: idx, end: idx});\n      } else {\n        last.end = idx;\n        if((last.end - last.start) >\n          (zeroGroups[zeroMaxGroup].end - zeroGroups[zeroMaxGroup].start)) {\n          zeroMaxGroup = zeroGroups.length - 1;\n        }\n      }\n    }\n    ip.push(hex);\n  }\n  if(zeroGroups.length > 0) {\n    var group = zeroGroups[zeroMaxGroup];\n    // only shorten group of length > 0\n    if(group.end - group.start > 0) {\n      ip.splice(group.start, group.end - group.start + 1, '');\n      if(group.start === 0) {\n        ip.unshift('');\n      }\n      if(group.end === 7) {\n        ip.push('');\n      }\n    }\n  }\n  return ip.join(':');\n};\n\n/**\n * Estimates the number of processes that can be run concurrently. If\n * creating Web Workers, keep in mind that the main JavaScript process needs\n * its own core.\n *\n * @param options the options to use:\n *          update true to force an update (not use the cached value).\n * @param callback(err, max) called once the operation completes.\n */\nutil.estimateCores = function(options, callback) {\n  if(typeof options === 'function') {\n    callback = options;\n    options = {};\n  }\n  options = options || {};\n  if('cores' in util && !options.update) {\n    return callback(null, util.cores);\n  }\n  if(typeof navigator !== 'undefined' &&\n    'hardwareConcurrency' in navigator &&\n    navigator.hardwareConcurrency > 0) {\n    util.cores = navigator.hardwareConcurrency;\n    return callback(null, util.cores);\n  }\n  if(typeof Worker === 'undefined') {\n    // workers not available\n    util.cores = 1;\n    return callback(null, util.cores);\n  }\n  if(typeof Blob === 'undefined') {\n    // can't estimate, default to 2\n    util.cores = 2;\n    return callback(null, util.cores);\n  }\n\n  // create worker concurrency estimation code as blob\n  var blobUrl = URL.createObjectURL(new Blob(['(',\n    function() {\n      self.addEventListener('message', function(e) {\n        // run worker for 4 ms\n        var st = Date.now();\n        var et = st + 4;\n        while(Date.now() < et);\n        self.postMessage({st: st, et: et});\n      });\n    }.toString(),\n  ')()'], {type: 'application/javascript'}));\n\n  // take 5 samples using 16 workers\n  sample([], 5, 16);\n\n  function sample(max, samples, numWorkers) {\n    if(samples === 0) {\n      // get overlap average\n      var avg = Math.floor(max.reduce(function(avg, x) {\n        return avg + x;\n      }, 0) / max.length);\n      util.cores = Math.max(1, avg);\n      URL.revokeObjectURL(blobUrl);\n      return callback(null, util.cores);\n    }\n    map(numWorkers, function(err, results) {\n      max.push(reduce(numWorkers, results));\n      sample(max, samples - 1, numWorkers);\n    });\n  }\n\n  function map(numWorkers, callback) {\n    var workers = [];\n    var results = [];\n    for(var i = 0; i < numWorkers; ++i) {\n      var worker = new Worker(blobUrl);\n      worker.addEventListener('message', function(e) {\n        results.push(e.data);\n        if(results.length === numWorkers) {\n          for(var i = 0; i < numWorkers; ++i) {\n            workers[i].terminate();\n          }\n          callback(null, results);\n        }\n      });\n      workers.push(worker);\n    }\n    for(var i = 0; i < numWorkers; ++i) {\n      workers[i].postMessage(i);\n    }\n  }\n\n  function reduce(numWorkers, results) {\n    // find overlapping time windows\n    var overlaps = [];\n    for(var n = 0; n < numWorkers; ++n) {\n      var r1 = results[n];\n      var overlap = overlaps[n] = [];\n      for(var i = 0; i < numWorkers; ++i) {\n        if(n === i) {\n          continue;\n        }\n        var r2 = results[i];\n        if((r1.st > r2.st && r1.st < r2.et) ||\n          (r2.st > r1.st && r2.st < r1.et)) {\n          overlap.push(i);\n        }\n      }\n    }\n    // get maximum overlaps ... don't include overlapping worker itself\n    // as the main JS process was also being scheduled during the work and\n    // would have to be subtracted from the estimate anyway\n    return overlaps.reduce(function(max, overlap) {\n      return Math.max(max, overlap.length);\n    }, 0);\n  }\n};\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(16), __webpack_require__(77).setImmediate, __webpack_require__(21), __webpack_require__(30).Buffer))//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9ub2RlLWZvcmdlL2xpYi91dGlsLmpzP2IxZDQiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBVdGlsaXR5IGZ1bmN0aW9ucyBmb3Igd2ViIGFwcGxpY2F0aW9ucy5cbiAqXG4gKiBAYXV0aG9yIERhdmUgTG9uZ2xleVxuICpcbiAqIENvcHlyaWdodCAoYykgMjAxMC0yMDE4IERpZ2l0YWwgQmF6YWFyLCBJbmMuXG4gKi9cbnZhciBmb3JnZSA9IHJlcXVpcmUoJy4vZm9yZ2UnKTtcbnZhciBiYXNlTiA9IHJlcXVpcmUoJy4vYmFzZU4nKTtcblxuLyogVXRpbGl0aWVzIEFQSSAqL1xudmFyIHV0aWwgPSBtb2R1bGUuZXhwb3J0cyA9IGZvcmdlLnV0aWwgPSBmb3JnZS51dGlsIHx8IHt9O1xuXG4vLyBkZWZpbmUgc2V0SW1tZWRpYXRlIGFuZCBuZXh0VGlja1xuKGZ1bmN0aW9uKCkge1xuICAvLyB1c2UgbmF0aXZlIG5leHRUaWNrICh1bmxlc3Mgd2UncmUgaW4gd2VicGFjaylcbiAgLy8gd2VicGFjayAob3IgYmV0dGVyIG5vZGUtbGlicy1icm93c2VyIHBvbHlmaWxsKSBzZXRzIHByb2Nlc3MuYnJvd3Nlci5cbiAgLy8gdGhpcyB3YXkgd2UgY2FuIGRldGVjdCB3ZWJwYWNrIHByb3Blcmx5XG4gIGlmKHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiBwcm9jZXNzLm5leHRUaWNrICYmICFwcm9jZXNzLmJyb3dzZXIpIHtcbiAgICB1dGlsLm5leHRUaWNrID0gcHJvY2Vzcy5uZXh0VGljaztcbiAgICBpZih0eXBlb2Ygc2V0SW1tZWRpYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB1dGlsLnNldEltbWVkaWF0ZSA9IHNldEltbWVkaWF0ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gcG9seWZpbGwgc2V0SW1tZWRpYXRlIHdpdGggbmV4dFRpY2ssIG9sZGVyIHZlcnNpb25zIG9mIG5vZGVcbiAgICAgIC8vICh0aG9zZSB3L28gc2V0SW1tZWRpYXRlKSB3b24ndCB0b3RhbGx5IHN0YXJ2ZSBJT1xuICAgICAgdXRpbC5zZXRJbW1lZGlhdGUgPSB1dGlsLm5leHRUaWNrO1xuICAgIH1cbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBwb2x5ZmlsbCBuZXh0VGljayB3aXRoIG5hdGl2ZSBzZXRJbW1lZGlhdGVcbiAgaWYodHlwZW9mIHNldEltbWVkaWF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHV0aWwuc2V0SW1tZWRpYXRlID0gZnVuY3Rpb24oKSB7IHJldHVybiBzZXRJbW1lZGlhdGUuYXBwbHkodW5kZWZpbmVkLCBhcmd1bWVudHMpOyB9O1xuICAgIHV0aWwubmV4dFRpY2sgPSBmdW5jdGlvbihjYWxsYmFjaykge1xuICAgICAgcmV0dXJuIHNldEltbWVkaWF0ZShjYWxsYmFjayk7XG4gICAgfTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKiBOb3RlOiBBIHBvbHlmaWxsIHVwZ3JhZGUgcGF0dGVybiBpcyB1c2VkIGhlcmUgdG8gYWxsb3cgY29tYmluaW5nXG4gIHBvbHlmaWxscy4gRm9yIGV4YW1wbGUsIE11dGF0aW9uT2JzZXJ2ZXIgaXMgZmFzdCwgYnV0IGJsb2NrcyBVSSB1cGRhdGVzLFxuICBzbyBpdCBuZWVkcyB0byBhbGxvdyBVSSB1cGRhdGVzIHBlcmlvZGljYWxseSwgc28gaXQgZmFsbHMgYmFjayBvblxuICBwb3N0TWVzc2FnZSBvciBzZXRUaW1lb3V0LiAqL1xuXG4gIC8vIHBvbHlmaWxsIHdpdGggc2V0VGltZW91dFxuICB1dGlsLnNldEltbWVkaWF0ZSA9IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gICAgc2V0VGltZW91dChjYWxsYmFjaywgMCk7XG4gIH07XG5cbiAgLy8gdXBncmFkZSBwb2x5ZmlsbCB0byB1c2UgcG9zdE1lc3NhZ2VcbiAgaWYodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICB0eXBlb2Ygd2luZG93LnBvc3RNZXNzYWdlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdmFyIG1zZyA9ICdmb3JnZS5zZXRJbW1lZGlhdGUnO1xuICAgIHZhciBjYWxsYmFja3MgPSBbXTtcbiAgICB1dGlsLnNldEltbWVkaWF0ZSA9IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gICAgICBjYWxsYmFja3MucHVzaChjYWxsYmFjayk7XG4gICAgICAvLyBvbmx5IHNlbmQgbWVzc2FnZSB3aGVuIG9uZSBoYXNuJ3QgYmVlbiBzZW50IGluXG4gICAgICAvLyB0aGUgY3VycmVudCB0dXJuIG9mIHRoZSBldmVudCBsb29wXG4gICAgICBpZihjYWxsYmFja3MubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIHdpbmRvdy5wb3N0TWVzc2FnZShtc2csICcqJyk7XG4gICAgICB9XG4gICAgfTtcbiAgICBmdW5jdGlvbiBoYW5kbGVyKGV2ZW50KSB7XG4gICAgICBpZihldmVudC5zb3VyY2UgPT09IHdpbmRvdyAmJiBldmVudC5kYXRhID09PSBtc2cpIHtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIHZhciBjb3B5ID0gY2FsbGJhY2tzLnNsaWNlKCk7XG4gICAgICAgIGNhbGxiYWNrcy5sZW5ndGggPSAwO1xuICAgICAgICBjb3B5LmZvckVhY2goZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBoYW5kbGVyLCB0cnVlKTtcbiAgfVxuXG4gIC8vIHVwZ3JhZGUgcG9seWZpbGwgdG8gdXNlIE11dGF0aW9uT2JzZXJ2ZXJcbiAgaWYodHlwZW9mIE11dGF0aW9uT2JzZXJ2ZXIgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgLy8gcG9seWZpbGwgd2l0aCBNdXRhdGlvbk9ic2VydmVyXG4gICAgdmFyIG5vdyA9IERhdGUubm93KCk7XG4gICAgdmFyIGF0dHIgPSB0cnVlO1xuICAgIHZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICB2YXIgY2FsbGJhY2tzID0gW107XG4gICAgbmV3IE11dGF0aW9uT2JzZXJ2ZXIoZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgY29weSA9IGNhbGxiYWNrcy5zbGljZSgpO1xuICAgICAgY2FsbGJhY2tzLmxlbmd0aCA9IDA7XG4gICAgICBjb3B5LmZvckVhY2goZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgIH0pO1xuICAgIH0pLm9ic2VydmUoZGl2LCB7YXR0cmlidXRlczogdHJ1ZX0pO1xuICAgIHZhciBvbGRTZXRJbW1lZGlhdGUgPSB1dGlsLnNldEltbWVkaWF0ZTtcbiAgICB1dGlsLnNldEltbWVkaWF0ZSA9IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gICAgICBpZihEYXRlLm5vdygpIC0gbm93ID4gMTUpIHtcbiAgICAgICAgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgb2xkU2V0SW1tZWRpYXRlKGNhbGxiYWNrKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNhbGxiYWNrcy5wdXNoKGNhbGxiYWNrKTtcbiAgICAgICAgLy8gb25seSB0cmlnZ2VyIG9ic2VydmVyIHdoZW4gaXQgaGFzbid0IGJlZW4gdHJpZ2dlcmVkIGluXG4gICAgICAgIC8vIHRoZSBjdXJyZW50IHR1cm4gb2YgdGhlIGV2ZW50IGxvb3BcbiAgICAgICAgaWYoY2FsbGJhY2tzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgIGRpdi5zZXRBdHRyaWJ1dGUoJ2EnLCBhdHRyID0gIWF0dHIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIHV0aWwubmV4dFRpY2sgPSB1dGlsLnNldEltbWVkaWF0ZTtcbn0pKCk7XG5cbi8vIGNoZWNrIGlmIHJ1bm5pbmcgdW5kZXIgTm9kZS5qc1xudXRpbC5pc05vZGVqcyA9XG4gIHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiBwcm9jZXNzLnZlcnNpb25zICYmIHByb2Nlc3MudmVyc2lvbnMubm9kZTtcblxuXG4vLyAnc2VsZicgd2lsbCBhbHNvIHdvcmsgaW4gV2ViIFdvcmtlcnMgKGluc3RhbmNlIG9mIFdvcmtlckdsb2JhbFNjb3BlKSB3aGlsZVxuLy8gaXQgd2lsbCBwb2ludCB0byBgd2luZG93YCBpbiB0aGUgbWFpbiB0aHJlYWQuXG4vLyBUbyByZW1haW4gY29tcGF0aWJsZSB3aXRoIG9sZGVyIGJyb3dzZXJzLCB3ZSBmYWxsIGJhY2sgdG8gJ3dpbmRvdycgaWYgJ3NlbGYnXG4vLyBpcyBub3QgYXZhaWxhYmxlLlxudXRpbC5nbG9iYWxTY29wZSA9IChmdW5jdGlvbigpIHtcbiAgaWYodXRpbC5pc05vZGVqcykge1xuICAgIHJldHVybiBnbG9iYWw7XG4gIH1cblxuICByZXR1cm4gdHlwZW9mIHNlbGYgPT09ICd1bmRlZmluZWQnID8gd2luZG93IDogc2VsZjtcbn0pKCk7XG5cbi8vIGRlZmluZSBpc0FycmF5XG51dGlsLmlzQXJyYXkgPSBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uKHgpIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh4KSA9PT0gJ1tvYmplY3QgQXJyYXldJztcbn07XG5cbi8vIGRlZmluZSBpc0FycmF5QnVmZmVyXG51dGlsLmlzQXJyYXlCdWZmZXIgPSBmdW5jdGlvbih4KSB7XG4gIHJldHVybiB0eXBlb2YgQXJyYXlCdWZmZXIgIT09ICd1bmRlZmluZWQnICYmIHggaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcjtcbn07XG5cbi8vIGRlZmluZSBpc0FycmF5QnVmZmVyVmlld1xudXRpbC5pc0FycmF5QnVmZmVyVmlldyA9IGZ1bmN0aW9uKHgpIHtcbiAgcmV0dXJuIHggJiYgdXRpbC5pc0FycmF5QnVmZmVyKHguYnVmZmVyKSAmJiB4LmJ5dGVMZW5ndGggIT09IHVuZGVmaW5lZDtcbn07XG5cbi8qKlxuICogRW5zdXJlIGEgYml0cyBwYXJhbSBpcyA4LCAxNiwgMjQsIG9yIDMyLiBVc2VkIHRvIHZhbGlkYXRlIGlucHV0IGZvclxuICogYWxnb3JpdGhtcyB3aGVyZSBiaXQgbWFuaXB1bGF0aW9uLCBKYXZhU2NyaXB0IGxpbWl0YXRpb25zLCBhbmQvb3IgYWxnb3JpdGhtXG4gKiBkZXNpZ24gb25seSBhbGxvdyBmb3IgYnl0ZSBvcGVyYXRpb25zIG9mIGEgbGltaXRlZCBzaXplLlxuICpcbiAqIEBwYXJhbSBuIG51bWJlciBvZiBiaXRzLlxuICpcbiAqIFRocm93IEVycm9yIGlmIG4gaW52YWxpZC5cbiAqL1xuZnVuY3Rpb24gX2NoZWNrQml0c1BhcmFtKG4pIHtcbiAgaWYoIShuID09PSA4IHx8IG4gPT09IDE2IHx8IG4gPT09IDI0IHx8IG4gPT09IDMyKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignT25seSA4LCAxNiwgMjQsIG9yIDMyIGJpdHMgc3VwcG9ydGVkOiAnICsgbik7XG4gIH1cbn1cblxuLy8gVE9ETzogc2V0IEJ5dGVCdWZmZXIgdG8gYmVzdCBhdmFpbGFibGUgYmFja2luZ1xudXRpbC5CeXRlQnVmZmVyID0gQnl0ZVN0cmluZ0J1ZmZlcjtcblxuLyoqIEJ1ZmZlciB3L0JpbmFyeVN0cmluZyBiYWNraW5nICovXG5cbi8qKlxuICogQ29uc3RydWN0b3IgZm9yIGEgYmluYXJ5IHN0cmluZyBiYWNrZWQgYnl0ZSBidWZmZXIuXG4gKlxuICogQHBhcmFtIFtiXSB0aGUgYnl0ZXMgdG8gd3JhcCAoZWl0aGVyIGVuY29kZWQgYXMgc3RyaW5nLCBvbmUgYnl0ZSBwZXJcbiAqICAgICAgICAgIGNoYXJhY3Rlciwgb3IgYXMgYW4gQXJyYXlCdWZmZXIgb3IgVHlwZWQgQXJyYXkpLlxuICovXG5mdW5jdGlvbiBCeXRlU3RyaW5nQnVmZmVyKGIpIHtcbiAgLy8gVE9ETzogdXBkYXRlIHRvIG1hdGNoIERhdGFCdWZmZXIgQVBJXG5cbiAgLy8gdGhlIGRhdGEgaW4gdGhpcyBidWZmZXJcbiAgdGhpcy5kYXRhID0gJyc7XG4gIC8vIHRoZSBwb2ludGVyIGZvciByZWFkaW5nIGZyb20gdGhpcyBidWZmZXJcbiAgdGhpcy5yZWFkID0gMDtcblxuICBpZih0eXBlb2YgYiA9PT0gJ3N0cmluZycpIHtcbiAgICB0aGlzLmRhdGEgPSBiO1xuICB9IGVsc2UgaWYodXRpbC5pc0FycmF5QnVmZmVyKGIpIHx8IHV0aWwuaXNBcnJheUJ1ZmZlclZpZXcoYikpIHtcbiAgICBpZih0eXBlb2YgQnVmZmVyICE9PSAndW5kZWZpbmVkJyAmJiBiIGluc3RhbmNlb2YgQnVmZmVyKSB7XG4gICAgICB0aGlzLmRhdGEgPSBiLnRvU3RyaW5nKCdiaW5hcnknKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gY29udmVydCBuYXRpdmUgYnVmZmVyIHRvIGZvcmdlIGJ1ZmZlclxuICAgICAgLy8gRklYTUU6IHN1cHBvcnQgbmF0aXZlIGJ1ZmZlcnMgaW50ZXJuYWxseSBpbnN0ZWFkXG4gICAgICB2YXIgYXJyID0gbmV3IFVpbnQ4QXJyYXkoYik7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLmRhdGEgPSBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIGFycik7XG4gICAgICB9IGNhdGNoKGUpIHtcbiAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7ICsraSkge1xuICAgICAgICAgIHRoaXMucHV0Qnl0ZShhcnJbaV0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2UgaWYoYiBpbnN0YW5jZW9mIEJ5dGVTdHJpbmdCdWZmZXIgfHxcbiAgICAodHlwZW9mIGIgPT09ICdvYmplY3QnICYmIHR5cGVvZiBiLmRhdGEgPT09ICdzdHJpbmcnICYmXG4gICAgdHlwZW9mIGIucmVhZCA9PT0gJ251bWJlcicpKSB7XG4gICAgLy8gY29weSBleGlzdGluZyBidWZmZXJcbiAgICB0aGlzLmRhdGEgPSBiLmRhdGE7XG4gICAgdGhpcy5yZWFkID0gYi5yZWFkO1xuICB9XG5cbiAgLy8gdXNlZCBmb3Igdjggb3B0aW1pemF0aW9uXG4gIHRoaXMuX2NvbnN0cnVjdGVkU3RyaW5nTGVuZ3RoID0gMDtcbn1cbnV0aWwuQnl0ZVN0cmluZ0J1ZmZlciA9IEJ5dGVTdHJpbmdCdWZmZXI7XG5cbi8qIE5vdGU6IFRoaXMgaXMgYW4gb3B0aW1pemF0aW9uIGZvciBWOC1iYXNlZCBicm93c2Vycy4gV2hlbiBWOCBjb25jYXRlbmF0ZXNcbiAgYSBzdHJpbmcsIHRoZSBzdHJpbmdzIGFyZSBvbmx5IGpvaW5lZCBsb2dpY2FsbHkgdXNpbmcgYSBcImNvbnMgc3RyaW5nXCIgb3JcbiAgXCJjb25zdHJ1Y3RlZC9jb25jYXRlbmF0ZWQgc3RyaW5nXCIuIFRoZXNlIGNvbnRhaW5lcnMga2VlcCByZWZlcmVuY2VzIHRvIG9uZVxuICBhbm90aGVyIGFuZCBjYW4gcmVzdWx0IGluIHZlcnkgbGFyZ2UgbWVtb3J5IHVzYWdlLiBGb3IgZXhhbXBsZSwgaWYgYSAyTUJcbiAgc3RyaW5nIGlzIGNvbnN0cnVjdGVkIGJ5IGNvbmNhdGVuYXRpbmcgNCBieXRlcyB0b2dldGhlciBhdCBhIHRpbWUsIHRoZVxuICBtZW1vcnkgdXNhZ2Ugd2lsbCBiZSB+NDRNQjsgc28gfjIyeCBpbmNyZWFzZS4gVGhlIHN0cmluZ3MgYXJlIG9ubHkgam9pbmVkXG4gIHRvZ2V0aGVyIHdoZW4gYW4gb3BlcmF0aW9uIHJlcXVpcmluZyB0aGVpciBqb2luaW5nIHRha2VzIHBsYWNlLCBzdWNoIGFzXG4gIHN1YnN0cigpLiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGFkZGluZyBkYXRhIHRvIHRoaXMgYnVmZmVyIHRvIGVuc3VyZVxuICB0aGVzZSB0eXBlcyBvZiBzdHJpbmdzIGFyZSBwZXJpb2RpY2FsbHkgam9pbmVkIHRvIHJlZHVjZSB0aGUgbWVtb3J5XG4gIGZvb3RwcmludC4gKi9cbnZhciBfTUFYX0NPTlNUUlVDVEVEX1NUUklOR19MRU5HVEggPSA0MDk2O1xudXRpbC5CeXRlU3RyaW5nQnVmZmVyLnByb3RvdHlwZS5fb3B0aW1pemVDb25zdHJ1Y3RlZFN0cmluZyA9IGZ1bmN0aW9uKHgpIHtcbiAgdGhpcy5fY29uc3RydWN0ZWRTdHJpbmdMZW5ndGggKz0geDtcbiAgaWYodGhpcy5fY29uc3RydWN0ZWRTdHJpbmdMZW5ndGggPiBfTUFYX0NPTlNUUlVDVEVEX1NUUklOR19MRU5HVEgpIHtcbiAgICAvLyB0aGlzIHN1YnN0cigpIHNob3VsZCBjYXVzZSB0aGUgY29uc3RydWN0ZWQgc3RyaW5nIHRvIGpvaW5cbiAgICB0aGlzLmRhdGEuc3Vic3RyKDAsIDEpO1xuICAgIHRoaXMuX2NvbnN0cnVjdGVkU3RyaW5nTGVuZ3RoID0gMDtcbiAgfVxufTtcblxuLyoqXG4gKiBHZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhpcyBidWZmZXIuXG4gKlxuICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIHRoaXMgYnVmZmVyLlxuICovXG51dGlsLkJ5dGVTdHJpbmdCdWZmZXIucHJvdG90eXBlLmxlbmd0aCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5kYXRhLmxlbmd0aCAtIHRoaXMucmVhZDtcbn07XG5cbi8qKlxuICogR2V0cyB3aGV0aGVyIG9yIG5vdCB0aGlzIGJ1ZmZlciBpcyBlbXB0eS5cbiAqXG4gKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBidWZmZXIgaXMgZW1wdHksIGZhbHNlIGlmIG5vdC5cbiAqL1xudXRpbC5CeXRlU3RyaW5nQnVmZmVyLnByb3RvdHlwZS5pc0VtcHR5ID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLmxlbmd0aCgpIDw9IDA7XG59O1xuXG4vKipcbiAqIFB1dHMgYSBieXRlIGluIHRoaXMgYnVmZmVyLlxuICpcbiAqIEBwYXJhbSBiIHRoZSBieXRlIHRvIHB1dC5cbiAqXG4gKiBAcmV0dXJuIHRoaXMgYnVmZmVyLlxuICovXG51dGlsLkJ5dGVTdHJpbmdCdWZmZXIucHJvdG90eXBlLnB1dEJ5dGUgPSBmdW5jdGlvbihiKSB7XG4gIHJldHVybiB0aGlzLnB1dEJ5dGVzKFN0cmluZy5mcm9tQ2hhckNvZGUoYikpO1xufTtcblxuLyoqXG4gKiBQdXRzIGEgYnl0ZSBpbiB0aGlzIGJ1ZmZlciBOIHRpbWVzLlxuICpcbiAqIEBwYXJhbSBiIHRoZSBieXRlIHRvIHB1dC5cbiAqIEBwYXJhbSBuIHRoZSBudW1iZXIgb2YgYnl0ZXMgb2YgdmFsdWUgYiB0byBwdXQuXG4gKlxuICogQHJldHVybiB0aGlzIGJ1ZmZlci5cbiAqL1xudXRpbC5CeXRlU3RyaW5nQnVmZmVyLnByb3RvdHlwZS5maWxsV2l0aEJ5dGUgPSBmdW5jdGlvbihiLCBuKSB7XG4gIGIgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGIpO1xuICB2YXIgZCA9IHRoaXMuZGF0YTtcbiAgd2hpbGUobiA+IDApIHtcbiAgICBpZihuICYgMSkge1xuICAgICAgZCArPSBiO1xuICAgIH1cbiAgICBuID4+Pj0gMTtcbiAgICBpZihuID4gMCkge1xuICAgICAgYiArPSBiO1xuICAgIH1cbiAgfVxuICB0aGlzLmRhdGEgPSBkO1xuICB0aGlzLl9vcHRpbWl6ZUNvbnN0cnVjdGVkU3RyaW5nKG4pO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogUHV0cyBieXRlcyBpbiB0aGlzIGJ1ZmZlci5cbiAqXG4gKiBAcGFyYW0gYnl0ZXMgdGhlIGJ5dGVzIChhcyBhIGJpbmFyeSBlbmNvZGVkIHN0cmluZykgdG8gcHV0LlxuICpcbiAqIEByZXR1cm4gdGhpcyBidWZmZXIuXG4gKi9cbnV0aWwuQnl0ZVN0cmluZ0J1ZmZlci5wcm90b3R5cGUucHV0Qnl0ZXMgPSBmdW5jdGlvbihieXRlcykge1xuICB0aGlzLmRhdGEgKz0gYnl0ZXM7XG4gIHRoaXMuX29wdGltaXplQ29uc3RydWN0ZWRTdHJpbmcoYnl0ZXMubGVuZ3RoKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFB1dHMgYSBVVEYtMTYgZW5jb2RlZCBzdHJpbmcgaW50byB0aGlzIGJ1ZmZlci5cbiAqXG4gKiBAcGFyYW0gc3RyIHRoZSBzdHJpbmcgdG8gcHV0LlxuICpcbiAqIEByZXR1cm4gdGhpcyBidWZmZXIuXG4gKi9cbnV0aWwuQnl0ZVN0cmluZ0J1ZmZlci5wcm90b3R5cGUucHV0U3RyaW5nID0gZnVuY3Rpb24oc3RyKSB7XG4gIHJldHVybiB0aGlzLnB1dEJ5dGVzKHV0aWwuZW5jb2RlVXRmOChzdHIpKTtcbn07XG5cbi8qKlxuICogUHV0cyBhIDE2LWJpdCBpbnRlZ2VyIGluIHRoaXMgYnVmZmVyIGluIGJpZy1lbmRpYW4gb3JkZXIuXG4gKlxuICogQHBhcmFtIGkgdGhlIDE2LWJpdCBpbnRlZ2VyLlxuICpcbiAqIEByZXR1cm4gdGhpcyBidWZmZXIuXG4gKi9cbnV0aWwuQnl0ZVN0cmluZ0J1ZmZlci5wcm90b3R5cGUucHV0SW50MTYgPSBmdW5jdGlvbihpKSB7XG4gIHJldHVybiB0aGlzLnB1dEJ5dGVzKFxuICAgIFN0cmluZy5mcm9tQ2hhckNvZGUoaSA+PiA4ICYgMHhGRikgK1xuICAgIFN0cmluZy5mcm9tQ2hhckNvZGUoaSAmIDB4RkYpKTtcbn07XG5cbi8qKlxuICogUHV0cyBhIDI0LWJpdCBpbnRlZ2VyIGluIHRoaXMgYnVmZmVyIGluIGJpZy1lbmRpYW4gb3JkZXIuXG4gKlxuICogQHBhcmFtIGkgdGhlIDI0LWJpdCBpbnRlZ2VyLlxuICpcbiAqIEByZXR1cm4gdGhpcyBidWZmZXIuXG4gKi9cbnV0aWwuQnl0ZVN0cmluZ0J1ZmZlci5wcm90b3R5cGUucHV0SW50MjQgPSBmdW5jdGlvbihpKSB7XG4gIHJldHVybiB0aGlzLnB1dEJ5dGVzKFxuICAgIFN0cmluZy5mcm9tQ2hhckNvZGUoaSA+PiAxNiAmIDB4RkYpICtcbiAgICBTdHJpbmcuZnJvbUNoYXJDb2RlKGkgPj4gOCAmIDB4RkYpICtcbiAgICBTdHJpbmcuZnJvbUNoYXJDb2RlKGkgJiAweEZGKSk7XG59O1xuXG4vKipcbiAqIFB1dHMgYSAzMi1iaXQgaW50ZWdlciBpbiB0aGlzIGJ1ZmZlciBpbiBiaWctZW5kaWFuIG9yZGVyLlxuICpcbiAqIEBwYXJhbSBpIHRoZSAzMi1iaXQgaW50ZWdlci5cbiAqXG4gKiBAcmV0dXJuIHRoaXMgYnVmZmVyLlxuICovXG51dGlsLkJ5dGVTdHJpbmdCdWZmZXIucHJvdG90eXBlLnB1dEludDMyID0gZnVuY3Rpb24oaSkge1xuICByZXR1cm4gdGhpcy5wdXRCeXRlcyhcbiAgICBTdHJpbmcuZnJvbUNoYXJDb2RlKGkgPj4gMjQgJiAweEZGKSArXG4gICAgU3RyaW5nLmZyb21DaGFyQ29kZShpID4+IDE2ICYgMHhGRikgK1xuICAgIFN0cmluZy5mcm9tQ2hhckNvZGUoaSA+PiA4ICYgMHhGRikgK1xuICAgIFN0cmluZy5mcm9tQ2hhckNvZGUoaSAmIDB4RkYpKTtcbn07XG5cbi8qKlxuICogUHV0cyBhIDE2LWJpdCBpbnRlZ2VyIGluIHRoaXMgYnVmZmVyIGluIGxpdHRsZS1lbmRpYW4gb3JkZXIuXG4gKlxuICogQHBhcmFtIGkgdGhlIDE2LWJpdCBpbnRlZ2VyLlxuICpcbiAqIEByZXR1cm4gdGhpcyBidWZmZXIuXG4gKi9cbnV0aWwuQnl0ZVN0cmluZ0J1ZmZlci5wcm90b3R5cGUucHV0SW50MTZMZSA9IGZ1bmN0aW9uKGkpIHtcbiAgcmV0dXJuIHRoaXMucHV0Qnl0ZXMoXG4gICAgU3RyaW5nLmZyb21DaGFyQ29kZShpICYgMHhGRikgK1xuICAgIFN0cmluZy5mcm9tQ2hhckNvZGUoaSA+PiA4ICYgMHhGRikpO1xufTtcblxuLyoqXG4gKiBQdXRzIGEgMjQtYml0IGludGVnZXIgaW4gdGhpcyBidWZmZXIgaW4gbGl0dGxlLWVuZGlhbiBvcmRlci5cbiAqXG4gKiBAcGFyYW0gaSB0aGUgMjQtYml0IGludGVnZXIuXG4gKlxuICogQHJldHVybiB0aGlzIGJ1ZmZlci5cbiAqL1xudXRpbC5CeXRlU3RyaW5nQnVmZmVyLnByb3RvdHlwZS5wdXRJbnQyNExlID0gZnVuY3Rpb24oaSkge1xuICByZXR1cm4gdGhpcy5wdXRCeXRlcyhcbiAgICBTdHJpbmcuZnJvbUNoYXJDb2RlKGkgJiAweEZGKSArXG4gICAgU3RyaW5nLmZyb21DaGFyQ29kZShpID4+IDggJiAweEZGKSArXG4gICAgU3RyaW5nLmZyb21DaGFyQ29kZShpID4+IDE2ICYgMHhGRikpO1xufTtcblxuLyoqXG4gKiBQdXRzIGEgMzItYml0IGludGVnZXIgaW4gdGhpcyBidWZmZXIgaW4gbGl0dGxlLWVuZGlhbiBvcmRlci5cbiAqXG4gKiBAcGFyYW0gaSB0aGUgMzItYml0IGludGVnZXIuXG4gKlxuICogQHJldHVybiB0aGlzIGJ1ZmZlci5cbiAqL1xudXRpbC5CeXRlU3RyaW5nQnVmZmVyLnByb3RvdHlwZS5wdXRJbnQzMkxlID0gZnVuY3Rpb24oaSkge1xuICByZXR1cm4gdGhpcy5wdXRCeXRlcyhcbiAgICBTdHJpbmcuZnJvbUNoYXJDb2RlKGkgJiAweEZGKSArXG4gICAgU3RyaW5nLmZyb21DaGFyQ29kZShpID4+IDggJiAweEZGKSArXG4gICAgU3RyaW5nLmZyb21DaGFyQ29kZShpID4+IDE2ICYgMHhGRikgK1xuICAgIFN0cmluZy5mcm9tQ2hhckNvZGUoaSA+PiAyNCAmIDB4RkYpKTtcbn07XG5cbi8qKlxuICogUHV0cyBhbiBuLWJpdCBpbnRlZ2VyIGluIHRoaXMgYnVmZmVyIGluIGJpZy1lbmRpYW4gb3JkZXIuXG4gKlxuICogQHBhcmFtIGkgdGhlIG4tYml0IGludGVnZXIuXG4gKiBAcGFyYW0gbiB0aGUgbnVtYmVyIG9mIGJpdHMgaW4gdGhlIGludGVnZXIgKDgsIDE2LCAyNCwgb3IgMzIpLlxuICpcbiAqIEByZXR1cm4gdGhpcyBidWZmZXIuXG4gKi9cbnV0aWwuQnl0ZVN0cmluZ0J1ZmZlci5wcm90b3R5cGUucHV0SW50ID0gZnVuY3Rpb24oaSwgbikge1xuICBfY2hlY2tCaXRzUGFyYW0obik7XG4gIHZhciBieXRlcyA9ICcnO1xuICBkbyB7XG4gICAgbiAtPSA4O1xuICAgIGJ5dGVzICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoKGkgPj4gbikgJiAweEZGKTtcbiAgfSB3aGlsZShuID4gMCk7XG4gIHJldHVybiB0aGlzLnB1dEJ5dGVzKGJ5dGVzKTtcbn07XG5cbi8qKlxuICogUHV0cyBhIHNpZ25lZCBuLWJpdCBpbnRlZ2VyIGluIHRoaXMgYnVmZmVyIGluIGJpZy1lbmRpYW4gb3JkZXIuIFR3bydzXG4gKiBjb21wbGVtZW50IHJlcHJlc2VudGF0aW9uIGlzIHVzZWQuXG4gKlxuICogQHBhcmFtIGkgdGhlIG4tYml0IGludGVnZXIuXG4gKiBAcGFyYW0gbiB0aGUgbnVtYmVyIG9mIGJpdHMgaW4gdGhlIGludGVnZXIgKDgsIDE2LCAyNCwgb3IgMzIpLlxuICpcbiAqIEByZXR1cm4gdGhpcyBidWZmZXIuXG4gKi9cbnV0aWwuQnl0ZVN0cmluZ0J1ZmZlci5wcm90b3R5cGUucHV0U2lnbmVkSW50ID0gZnVuY3Rpb24oaSwgbikge1xuICAvLyBwdXRJbnQgY2hlY2tzIG5cbiAgaWYoaSA8IDApIHtcbiAgICBpICs9IDIgPDwgKG4gLSAxKTtcbiAgfVxuICByZXR1cm4gdGhpcy5wdXRJbnQoaSwgbik7XG59O1xuXG4vKipcbiAqIFB1dHMgdGhlIGdpdmVuIGJ1ZmZlciBpbnRvIHRoaXMgYnVmZmVyLlxuICpcbiAqIEBwYXJhbSBidWZmZXIgdGhlIGJ1ZmZlciB0byBwdXQgaW50byB0aGlzIG9uZS5cbiAqXG4gKiBAcmV0dXJuIHRoaXMgYnVmZmVyLlxuICovXG51dGlsLkJ5dGVTdHJpbmdCdWZmZXIucHJvdG90eXBlLnB1dEJ1ZmZlciA9IGZ1bmN0aW9uKGJ1ZmZlcikge1xuICByZXR1cm4gdGhpcy5wdXRCeXRlcyhidWZmZXIuZ2V0Qnl0ZXMoKSk7XG59O1xuXG4vKipcbiAqIEdldHMgYSBieXRlIGZyb20gdGhpcyBidWZmZXIgYW5kIGFkdmFuY2VzIHRoZSByZWFkIHBvaW50ZXIgYnkgMS5cbiAqXG4gKiBAcmV0dXJuIHRoZSBieXRlLlxuICovXG51dGlsLkJ5dGVTdHJpbmdCdWZmZXIucHJvdG90eXBlLmdldEJ5dGUgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuZGF0YS5jaGFyQ29kZUF0KHRoaXMucmVhZCsrKTtcbn07XG5cbi8qKlxuICogR2V0cyBhIHVpbnQxNiBmcm9tIHRoaXMgYnVmZmVyIGluIGJpZy1lbmRpYW4gb3JkZXIgYW5kIGFkdmFuY2VzIHRoZSByZWFkXG4gKiBwb2ludGVyIGJ5IDIuXG4gKlxuICogQHJldHVybiB0aGUgdWludDE2LlxuICovXG51dGlsLkJ5dGVTdHJpbmdCdWZmZXIucHJvdG90eXBlLmdldEludDE2ID0gZnVuY3Rpb24oKSB7XG4gIHZhciBydmFsID0gKFxuICAgIHRoaXMuZGF0YS5jaGFyQ29kZUF0KHRoaXMucmVhZCkgPDwgOCBeXG4gICAgdGhpcy5kYXRhLmNoYXJDb2RlQXQodGhpcy5yZWFkICsgMSkpO1xuICB0aGlzLnJlYWQgKz0gMjtcbiAgcmV0dXJuIHJ2YWw7XG59O1xuXG4vKipcbiAqIEdldHMgYSB1aW50MjQgZnJvbSB0aGlzIGJ1ZmZlciBpbiBiaWctZW5kaWFuIG9yZGVyIGFuZCBhZHZhbmNlcyB0aGUgcmVhZFxuICogcG9pbnRlciBieSAzLlxuICpcbiAqIEByZXR1cm4gdGhlIHVpbnQyNC5cbiAqL1xudXRpbC5CeXRlU3RyaW5nQnVmZmVyLnByb3RvdHlwZS5nZXRJbnQyNCA9IGZ1bmN0aW9uKCkge1xuICB2YXIgcnZhbCA9IChcbiAgICB0aGlzLmRhdGEuY2hhckNvZGVBdCh0aGlzLnJlYWQpIDw8IDE2IF5cbiAgICB0aGlzLmRhdGEuY2hhckNvZGVBdCh0aGlzLnJlYWQgKyAxKSA8PCA4IF5cbiAgICB0aGlzLmRhdGEuY2hhckNvZGVBdCh0aGlzLnJlYWQgKyAyKSk7XG4gIHRoaXMucmVhZCArPSAzO1xuICByZXR1cm4gcnZhbDtcbn07XG5cbi8qKlxuICogR2V0cyBhIHVpbnQzMiBmcm9tIHRoaXMgYnVmZmVyIGluIGJpZy1lbmRpYW4gb3JkZXIgYW5kIGFkdmFuY2VzIHRoZSByZWFkXG4gKiBwb2ludGVyIGJ5IDQuXG4gKlxuICogQHJldHVybiB0aGUgd29yZC5cbiAqL1xudXRpbC5CeXRlU3RyaW5nQnVmZmVyLnByb3RvdHlwZS5nZXRJbnQzMiA9IGZ1bmN0aW9uKCkge1xuICB2YXIgcnZhbCA9IChcbiAgICB0aGlzLmRhdGEuY2hhckNvZGVBdCh0aGlzLnJlYWQpIDw8IDI0IF5cbiAgICB0aGlzLmRhdGEuY2hhckNvZGVBdCh0aGlzLnJlYWQgKyAxKSA8PCAxNiBeXG4gICAgdGhpcy5kYXRhLmNoYXJDb2RlQXQodGhpcy5yZWFkICsgMikgPDwgOCBeXG4gICAgdGhpcy5kYXRhLmNoYXJDb2RlQXQodGhpcy5yZWFkICsgMykpO1xuICB0aGlzLnJlYWQgKz0gNDtcbiAgcmV0dXJuIHJ2YWw7XG59O1xuXG4vKipcbiAqIEdldHMgYSB1aW50MTYgZnJvbSB0aGlzIGJ1ZmZlciBpbiBsaXR0bGUtZW5kaWFuIG9yZGVyIGFuZCBhZHZhbmNlcyB0aGUgcmVhZFxuICogcG9pbnRlciBieSAyLlxuICpcbiAqIEByZXR1cm4gdGhlIHVpbnQxNi5cbiAqL1xudXRpbC5CeXRlU3RyaW5nQnVmZmVyLnByb3RvdHlwZS5nZXRJbnQxNkxlID0gZnVuY3Rpb24oKSB7XG4gIHZhciBydmFsID0gKFxuICAgIHRoaXMuZGF0YS5jaGFyQ29kZUF0KHRoaXMucmVhZCkgXlxuICAgIHRoaXMuZGF0YS5jaGFyQ29kZUF0KHRoaXMucmVhZCArIDEpIDw8IDgpO1xuICB0aGlzLnJlYWQgKz0gMjtcbiAgcmV0dXJuIHJ2YWw7XG59O1xuXG4vKipcbiAqIEdldHMgYSB1aW50MjQgZnJvbSB0aGlzIGJ1ZmZlciBpbiBsaXR0bGUtZW5kaWFuIG9yZGVyIGFuZCBhZHZhbmNlcyB0aGUgcmVhZFxuICogcG9pbnRlciBieSAzLlxuICpcbiAqIEByZXR1cm4gdGhlIHVpbnQyNC5cbiAqL1xudXRpbC5CeXRlU3RyaW5nQnVmZmVyLnByb3RvdHlwZS5nZXRJbnQyNExlID0gZnVuY3Rpb24oKSB7XG4gIHZhciBydmFsID0gKFxuICAgIHRoaXMuZGF0YS5jaGFyQ29kZUF0KHRoaXMucmVhZCkgXlxuICAgIHRoaXMuZGF0YS5jaGFyQ29kZUF0KHRoaXMucmVhZCArIDEpIDw8IDggXlxuICAgIHRoaXMuZGF0YS5jaGFyQ29kZUF0KHRoaXMucmVhZCArIDIpIDw8IDE2KTtcbiAgdGhpcy5yZWFkICs9IDM7XG4gIHJldHVybiBydmFsO1xufTtcblxuLyoqXG4gKiBHZXRzIGEgdWludDMyIGZyb20gdGhpcyBidWZmZXIgaW4gbGl0dGxlLWVuZGlhbiBvcmRlciBhbmQgYWR2YW5jZXMgdGhlIHJlYWRcbiAqIHBvaW50ZXIgYnkgNC5cbiAqXG4gKiBAcmV0dXJuIHRoZSB3b3JkLlxuICovXG51dGlsLkJ5dGVTdHJpbmdCdWZmZXIucHJvdG90eXBlLmdldEludDMyTGUgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHJ2YWwgPSAoXG4gICAgdGhpcy5kYXRhLmNoYXJDb2RlQXQodGhpcy5yZWFkKSBeXG4gICAgdGhpcy5kYXRhLmNoYXJDb2RlQXQodGhpcy5yZWFkICsgMSkgPDwgOCBeXG4gICAgdGhpcy5kYXRhLmNoYXJDb2RlQXQodGhpcy5yZWFkICsgMikgPDwgMTYgXlxuICAgIHRoaXMuZGF0YS5jaGFyQ29kZUF0KHRoaXMucmVhZCArIDMpIDw8IDI0KTtcbiAgdGhpcy5yZWFkICs9IDQ7XG4gIHJldHVybiBydmFsO1xufTtcblxuLyoqXG4gKiBHZXRzIGFuIG4tYml0IGludGVnZXIgZnJvbSB0aGlzIGJ1ZmZlciBpbiBiaWctZW5kaWFuIG9yZGVyIGFuZCBhZHZhbmNlcyB0aGVcbiAqIHJlYWQgcG9pbnRlciBieSBjZWlsKG4vOCkuXG4gKlxuICogQHBhcmFtIG4gdGhlIG51bWJlciBvZiBiaXRzIGluIHRoZSBpbnRlZ2VyICg4LCAxNiwgMjQsIG9yIDMyKS5cbiAqXG4gKiBAcmV0dXJuIHRoZSBpbnRlZ2VyLlxuICovXG51dGlsLkJ5dGVTdHJpbmdCdWZmZXIucHJvdG90eXBlLmdldEludCA9IGZ1bmN0aW9uKG4pIHtcbiAgX2NoZWNrQml0c1BhcmFtKG4pO1xuICB2YXIgcnZhbCA9IDA7XG4gIGRvIHtcbiAgICAvLyBUT0RPOiBVc2UgKHJ2YWwgKiAweDEwMCkgaWYgYWRkaW5nIHN1cHBvcnQgZm9yIDMzIHRvIDUzIGJpdHMuXG4gICAgcnZhbCA9IChydmFsIDw8IDgpICsgdGhpcy5kYXRhLmNoYXJDb2RlQXQodGhpcy5yZWFkKyspO1xuICAgIG4gLT0gODtcbiAgfSB3aGlsZShuID4gMCk7XG4gIHJldHVybiBydmFsO1xufTtcblxuLyoqXG4gKiBHZXRzIGEgc2lnbmVkIG4tYml0IGludGVnZXIgZnJvbSB0aGlzIGJ1ZmZlciBpbiBiaWctZW5kaWFuIG9yZGVyLCB1c2luZ1xuICogdHdvJ3MgY29tcGxlbWVudCwgYW5kIGFkdmFuY2VzIHRoZSByZWFkIHBvaW50ZXIgYnkgbi84LlxuICpcbiAqIEBwYXJhbSBuIHRoZSBudW1iZXIgb2YgYml0cyBpbiB0aGUgaW50ZWdlciAoOCwgMTYsIDI0LCBvciAzMikuXG4gKlxuICogQHJldHVybiB0aGUgaW50ZWdlci5cbiAqL1xudXRpbC5CeXRlU3RyaW5nQnVmZmVyLnByb3RvdHlwZS5nZXRTaWduZWRJbnQgPSBmdW5jdGlvbihuKSB7XG4gIC8vIGdldEludCBjaGVja3MgblxuICB2YXIgeCA9IHRoaXMuZ2V0SW50KG4pO1xuICB2YXIgbWF4ID0gMiA8PCAobiAtIDIpO1xuICBpZih4ID49IG1heCkge1xuICAgIHggLT0gbWF4IDw8IDE7XG4gIH1cbiAgcmV0dXJuIHg7XG59O1xuXG4vKipcbiAqIFJlYWRzIGJ5dGVzIG91dCBhcyBhIGJpbmFyeSBlbmNvZGVkIHN0cmluZyBhbmQgY2xlYXJzIHRoZW0gZnJvbSB0aGVcbiAqIGJ1ZmZlci4gTm90ZSB0aGF0IHRoZSByZXN1bHRpbmcgc3RyaW5nIGlzIGJpbmFyeSBlbmNvZGVkIChpbiBub2RlLmpzIHRoaXNcbiAqIGVuY29kaW5nIGlzIHJlZmVycmVkIHRvIGFzIGBiaW5hcnlgLCBpdCBpcyAqbm90KiBgdXRmOGApLlxuICpcbiAqIEBwYXJhbSBjb3VudCB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQsIHVuZGVmaW5lZCBvciBudWxsIGZvciBhbGwuXG4gKlxuICogQHJldHVybiBhIGJpbmFyeSBlbmNvZGVkIHN0cmluZyBvZiBieXRlcy5cbiAqL1xudXRpbC5CeXRlU3RyaW5nQnVmZmVyLnByb3RvdHlwZS5nZXRCeXRlcyA9IGZ1bmN0aW9uKGNvdW50KSB7XG4gIHZhciBydmFsO1xuICBpZihjb3VudCkge1xuICAgIC8vIHJlYWQgY291bnQgYnl0ZXNcbiAgICBjb3VudCA9IE1hdGgubWluKHRoaXMubGVuZ3RoKCksIGNvdW50KTtcbiAgICBydmFsID0gdGhpcy5kYXRhLnNsaWNlKHRoaXMucmVhZCwgdGhpcy5yZWFkICsgY291bnQpO1xuICAgIHRoaXMucmVhZCArPSBjb3VudDtcbiAgfSBlbHNlIGlmKGNvdW50ID09PSAwKSB7XG4gICAgcnZhbCA9ICcnO1xuICB9IGVsc2Uge1xuICAgIC8vIHJlYWQgYWxsIGJ5dGVzLCBvcHRpbWl6ZSB0byBvbmx5IGNvcHkgd2hlbiBuZWVkZWRcbiAgICBydmFsID0gKHRoaXMucmVhZCA9PT0gMCkgPyB0aGlzLmRhdGEgOiB0aGlzLmRhdGEuc2xpY2UodGhpcy5yZWFkKTtcbiAgICB0aGlzLmNsZWFyKCk7XG4gIH1cbiAgcmV0dXJuIHJ2YWw7XG59O1xuXG4vKipcbiAqIEdldHMgYSBiaW5hcnkgZW5jb2RlZCBzdHJpbmcgb2YgdGhlIGJ5dGVzIGZyb20gdGhpcyBidWZmZXIgd2l0aG91dFxuICogbW9kaWZ5aW5nIHRoZSByZWFkIHBvaW50ZXIuXG4gKlxuICogQHBhcmFtIGNvdW50IHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gZ2V0LCBvbWl0IHRvIGdldCBhbGwuXG4gKlxuICogQHJldHVybiBhIHN0cmluZyBmdWxsIG9mIGJpbmFyeSBlbmNvZGVkIGNoYXJhY3RlcnMuXG4gKi9cbnV0aWwuQnl0ZVN0cmluZ0J1ZmZlci5wcm90b3R5cGUuYnl0ZXMgPSBmdW5jdGlvbihjb3VudCkge1xuICByZXR1cm4gKHR5cGVvZihjb3VudCkgPT09ICd1bmRlZmluZWQnID9cbiAgICB0aGlzLmRhdGEuc2xpY2UodGhpcy5yZWFkKSA6XG4gICAgdGhpcy5kYXRhLnNsaWNlKHRoaXMucmVhZCwgdGhpcy5yZWFkICsgY291bnQpKTtcbn07XG5cbi8qKlxuICogR2V0cyBhIGJ5dGUgYXQgdGhlIGdpdmVuIGluZGV4IHdpdGhvdXQgbW9kaWZ5aW5nIHRoZSByZWFkIHBvaW50ZXIuXG4gKlxuICogQHBhcmFtIGkgdGhlIGJ5dGUgaW5kZXguXG4gKlxuICogQHJldHVybiB0aGUgYnl0ZS5cbiAqL1xudXRpbC5CeXRlU3RyaW5nQnVmZmVyLnByb3RvdHlwZS5hdCA9IGZ1bmN0aW9uKGkpIHtcbiAgcmV0dXJuIHRoaXMuZGF0YS5jaGFyQ29kZUF0KHRoaXMucmVhZCArIGkpO1xufTtcblxuLyoqXG4gKiBQdXRzIGEgYnl0ZSBhdCB0aGUgZ2l2ZW4gaW5kZXggd2l0aG91dCBtb2RpZnlpbmcgdGhlIHJlYWQgcG9pbnRlci5cbiAqXG4gKiBAcGFyYW0gaSB0aGUgYnl0ZSBpbmRleC5cbiAqIEBwYXJhbSBiIHRoZSBieXRlIHRvIHB1dC5cbiAqXG4gKiBAcmV0dXJuIHRoaXMgYnVmZmVyLlxuICovXG51dGlsLkJ5dGVTdHJpbmdCdWZmZXIucHJvdG90eXBlLnNldEF0ID0gZnVuY3Rpb24oaSwgYikge1xuICB0aGlzLmRhdGEgPSB0aGlzLmRhdGEuc3Vic3RyKDAsIHRoaXMucmVhZCArIGkpICtcbiAgICBTdHJpbmcuZnJvbUNoYXJDb2RlKGIpICtcbiAgICB0aGlzLmRhdGEuc3Vic3RyKHRoaXMucmVhZCArIGkgKyAxKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIEdldHMgdGhlIGxhc3QgYnl0ZSB3aXRob3V0IG1vZGlmeWluZyB0aGUgcmVhZCBwb2ludGVyLlxuICpcbiAqIEByZXR1cm4gdGhlIGxhc3QgYnl0ZS5cbiAqL1xudXRpbC5CeXRlU3RyaW5nQnVmZmVyLnByb3RvdHlwZS5sYXN0ID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLmRhdGEuY2hhckNvZGVBdCh0aGlzLmRhdGEubGVuZ3RoIC0gMSk7XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBjb3B5IG9mIHRoaXMgYnVmZmVyLlxuICpcbiAqIEByZXR1cm4gdGhlIGNvcHkuXG4gKi9cbnV0aWwuQnl0ZVN0cmluZ0J1ZmZlci5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uKCkge1xuICB2YXIgYyA9IHV0aWwuY3JlYXRlQnVmZmVyKHRoaXMuZGF0YSk7XG4gIGMucmVhZCA9IHRoaXMucmVhZDtcbiAgcmV0dXJuIGM7XG59O1xuXG4vKipcbiAqIENvbXBhY3RzIHRoaXMgYnVmZmVyLlxuICpcbiAqIEByZXR1cm4gdGhpcyBidWZmZXIuXG4gKi9cbnV0aWwuQnl0ZVN0cmluZ0J1ZmZlci5wcm90b3R5cGUuY29tcGFjdCA9IGZ1bmN0aW9uKCkge1xuICBpZih0aGlzLnJlYWQgPiAwKSB7XG4gICAgdGhpcy5kYXRhID0gdGhpcy5kYXRhLnNsaWNlKHRoaXMucmVhZCk7XG4gICAgdGhpcy5yZWFkID0gMDtcbiAgfVxuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogQ2xlYXJzIHRoaXMgYnVmZmVyLlxuICpcbiAqIEByZXR1cm4gdGhpcyBidWZmZXIuXG4gKi9cbnV0aWwuQnl0ZVN0cmluZ0J1ZmZlci5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5kYXRhID0gJyc7XG4gIHRoaXMucmVhZCA9IDA7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBTaG9ydGVucyB0aGlzIGJ1ZmZlciBieSB0cmltaW5nIGJ5dGVzIG9mZiBvZiB0aGUgZW5kIG9mIHRoaXMgYnVmZmVyLlxuICpcbiAqIEBwYXJhbSBjb3VudCB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHRyaW0gb2ZmLlxuICpcbiAqIEByZXR1cm4gdGhpcyBidWZmZXIuXG4gKi9cbnV0aWwuQnl0ZVN0cmluZ0J1ZmZlci5wcm90b3R5cGUudHJ1bmNhdGUgPSBmdW5jdGlvbihjb3VudCkge1xuICB2YXIgbGVuID0gTWF0aC5tYXgoMCwgdGhpcy5sZW5ndGgoKSAtIGNvdW50KTtcbiAgdGhpcy5kYXRhID0gdGhpcy5kYXRhLnN1YnN0cih0aGlzLnJlYWQsIGxlbik7XG4gIHRoaXMucmVhZCA9IDA7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBDb252ZXJ0cyB0aGlzIGJ1ZmZlciB0byBhIGhleGFkZWNpbWFsIHN0cmluZy5cbiAqXG4gKiBAcmV0dXJuIGEgaGV4YWRlY2ltYWwgc3RyaW5nLlxuICovXG51dGlsLkJ5dGVTdHJpbmdCdWZmZXIucHJvdG90eXBlLnRvSGV4ID0gZnVuY3Rpb24oKSB7XG4gIHZhciBydmFsID0gJyc7XG4gIGZvcih2YXIgaSA9IHRoaXMucmVhZDsgaSA8IHRoaXMuZGF0YS5sZW5ndGg7ICsraSkge1xuICAgIHZhciBiID0gdGhpcy5kYXRhLmNoYXJDb2RlQXQoaSk7XG4gICAgaWYoYiA8IDE2KSB7XG4gICAgICBydmFsICs9ICcwJztcbiAgICB9XG4gICAgcnZhbCArPSBiLnRvU3RyaW5nKDE2KTtcbiAgfVxuICByZXR1cm4gcnZhbDtcbn07XG5cbi8qKlxuICogQ29udmVydHMgdGhpcyBidWZmZXIgdG8gYSBVVEYtMTYgc3RyaW5nIChzdGFuZGFyZCBKYXZhU2NyaXB0IHN0cmluZykuXG4gKlxuICogQHJldHVybiBhIFVURi0xNiBzdHJpbmcuXG4gKi9cbnV0aWwuQnl0ZVN0cmluZ0J1ZmZlci5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHV0aWwuZGVjb2RlVXRmOCh0aGlzLmJ5dGVzKCkpO1xufTtcblxuLyoqIEVuZCBCdWZmZXIgdy9CaW5hcnlTdHJpbmcgYmFja2luZyAqL1xuXG4vKiogQnVmZmVyIHcvVUludDhBcnJheSBiYWNraW5nICovXG5cbi8qKlxuICogRklYTUU6IEV4cGVyaW1lbnRhbC4gRG8gbm90IHVzZSB5ZXQuXG4gKlxuICogQ29uc3RydWN0b3IgZm9yIGFuIEFycmF5QnVmZmVyLWJhY2tlZCBieXRlIGJ1ZmZlci5cbiAqXG4gKiBUaGUgYnVmZmVyIG1heSBiZSBjb25zdHJ1Y3RlZCBmcm9tIGEgc3RyaW5nLCBhbiBBcnJheUJ1ZmZlciwgRGF0YVZpZXcsIG9yIGFcbiAqIFR5cGVkQXJyYXkuXG4gKlxuICogSWYgYSBzdHJpbmcgaXMgZ2l2ZW4sIGl0cyBlbmNvZGluZyBzaG91bGQgYmUgcHJvdmlkZWQgYXMgYW4gb3B0aW9uLFxuICogb3RoZXJ3aXNlIGl0IHdpbGwgZGVmYXVsdCB0byAnYmluYXJ5Jy4gQSAnYmluYXJ5JyBzdHJpbmcgaXMgZW5jb2RlZCBzdWNoXG4gKiB0aGF0IGVhY2ggY2hhcmFjdGVyIGlzIG9uZSBieXRlIGluIGxlbmd0aCBhbmQgc2l6ZS5cbiAqXG4gKiBJZiBhbiBBcnJheUJ1ZmZlciwgRGF0YVZpZXcsIG9yIFR5cGVkQXJyYXkgaXMgZ2l2ZW4sIGl0IHdpbGwgYmUgdXNlZFxuICogKmRpcmVjdGx5KiB3aXRob3V0IGFueSBjb3B5aW5nLiBOb3RlIHRoYXQsIGlmIGEgd3JpdGUgdG8gdGhlIGJ1ZmZlciByZXF1aXJlc1xuICogbW9yZSBzcGFjZSwgdGhlIGJ1ZmZlciB3aWxsIGFsbG9jYXRlIGEgbmV3IGJhY2tpbmcgQXJyYXlCdWZmZXIgdG9cbiAqIGFjY29tbW9kYXRlLiBUaGUgc3RhcnRpbmcgcmVhZCBhbmQgd3JpdGUgb2Zmc2V0cyBmb3IgdGhlIGJ1ZmZlciBtYXkgYmVcbiAqIGdpdmVuIGFzIG9wdGlvbnMuXG4gKlxuICogQHBhcmFtIFtiXSB0aGUgaW5pdGlhbCBieXRlcyBmb3IgdGhpcyBidWZmZXIuXG4gKiBAcGFyYW0gb3B0aW9ucyB0aGUgb3B0aW9ucyB0byB1c2U6XG4gKiAgICAgICAgICBbcmVhZE9mZnNldF0gdGhlIHN0YXJ0aW5nIHJlYWQgb2Zmc2V0IHRvIHVzZSAoZGVmYXVsdDogMCkuXG4gKiAgICAgICAgICBbd3JpdGVPZmZzZXRdIHRoZSBzdGFydGluZyB3cml0ZSBvZmZzZXQgdG8gdXNlIChkZWZhdWx0OiB0aGVcbiAqICAgICAgICAgICAgbGVuZ3RoIG9mIHRoZSBmaXJzdCBwYXJhbWV0ZXIpLlxuICogICAgICAgICAgW2dyb3dTaXplXSB0aGUgbWluaW11bSBhbW91bnQsIGluIGJ5dGVzLCB0byBncm93IHRoZSBidWZmZXIgYnkgdG9cbiAqICAgICAgICAgICAgYWNjb21tb2RhdGUgd3JpdGVzIChkZWZhdWx0OiAxMDI0KS5cbiAqICAgICAgICAgIFtlbmNvZGluZ10gdGhlIGVuY29kaW5nICgnYmluYXJ5JywgJ3V0ZjgnLCAndXRmMTYnLCAnaGV4JykgZm9yIHRoZVxuICogICAgICAgICAgICBmaXJzdCBwYXJhbWV0ZXIsIGlmIGl0IGlzIGEgc3RyaW5nIChkZWZhdWx0OiAnYmluYXJ5JykuXG4gKi9cbmZ1bmN0aW9uIERhdGFCdWZmZXIoYiwgb3B0aW9ucykge1xuICAvLyBkZWZhdWx0IG9wdGlvbnNcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgLy8gcG9pbnRlcnMgZm9yIHJlYWQgZnJvbS93cml0ZSB0byBidWZmZXJcbiAgdGhpcy5yZWFkID0gb3B0aW9ucy5yZWFkT2Zmc2V0IHx8IDA7XG4gIHRoaXMuZ3Jvd1NpemUgPSBvcHRpb25zLmdyb3dTaXplIHx8IDEwMjQ7XG5cbiAgdmFyIGlzQXJyYXlCdWZmZXIgPSB1dGlsLmlzQXJyYXlCdWZmZXIoYik7XG4gIHZhciBpc0FycmF5QnVmZmVyVmlldyA9IHV0aWwuaXNBcnJheUJ1ZmZlclZpZXcoYik7XG4gIGlmKGlzQXJyYXlCdWZmZXIgfHwgaXNBcnJheUJ1ZmZlclZpZXcpIHtcbiAgICAvLyB1c2UgQXJyYXlCdWZmZXIgZGlyZWN0bHlcbiAgICBpZihpc0FycmF5QnVmZmVyKSB7XG4gICAgICB0aGlzLmRhdGEgPSBuZXcgRGF0YVZpZXcoYik7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRPRE86IGFkanVzdCByZWFkL3dyaXRlIG9mZnNldCBiYXNlZCBvbiB0aGUgdHlwZSBvZiB2aWV3XG4gICAgICAvLyBvciBzcGVjaWZ5IHRoYXQgdGhpcyBtdXN0IGJlIGRvbmUgaW4gdGhlIG9wdGlvbnMgLi4uIHRoYXQgdGhlXG4gICAgICAvLyBvZmZzZXRzIGFyZSBieXRlLWJhc2VkXG4gICAgICB0aGlzLmRhdGEgPSBuZXcgRGF0YVZpZXcoYi5idWZmZXIsIGIuYnl0ZU9mZnNldCwgYi5ieXRlTGVuZ3RoKTtcbiAgICB9XG4gICAgdGhpcy53cml0ZSA9ICgnd3JpdGVPZmZzZXQnIGluIG9wdGlvbnMgP1xuICAgICAgb3B0aW9ucy53cml0ZU9mZnNldCA6IHRoaXMuZGF0YS5ieXRlTGVuZ3RoKTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBpbml0aWFsaXplIHRvIGVtcHR5IGFycmF5IGJ1ZmZlciBhbmQgYWRkIGFueSBnaXZlbiBieXRlcyB1c2luZyBwdXRCeXRlc1xuICB0aGlzLmRhdGEgPSBuZXcgRGF0YVZpZXcobmV3IEFycmF5QnVmZmVyKDApKTtcbiAgdGhpcy53cml0ZSA9IDA7XG5cbiAgaWYoYiAhPT0gbnVsbCAmJiBiICE9PSB1bmRlZmluZWQpIHtcbiAgICB0aGlzLnB1dEJ5dGVzKGIpO1xuICB9XG5cbiAgaWYoJ3dyaXRlT2Zmc2V0JyBpbiBvcHRpb25zKSB7XG4gICAgdGhpcy53cml0ZSA9IG9wdGlvbnMud3JpdGVPZmZzZXQ7XG4gIH1cbn1cbnV0aWwuRGF0YUJ1ZmZlciA9IERhdGFCdWZmZXI7XG5cbi8qKlxuICogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIHRoaXMgYnVmZmVyLlxuICpcbiAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBpbiB0aGlzIGJ1ZmZlci5cbiAqL1xudXRpbC5EYXRhQnVmZmVyLnByb3RvdHlwZS5sZW5ndGggPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMud3JpdGUgLSB0aGlzLnJlYWQ7XG59O1xuXG4vKipcbiAqIEdldHMgd2hldGhlciBvciBub3QgdGhpcyBidWZmZXIgaXMgZW1wdHkuXG4gKlxuICogQHJldHVybiB0cnVlIGlmIHRoaXMgYnVmZmVyIGlzIGVtcHR5LCBmYWxzZSBpZiBub3QuXG4gKi9cbnV0aWwuRGF0YUJ1ZmZlci5wcm90b3R5cGUuaXNFbXB0eSA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5sZW5ndGgoKSA8PSAwO1xufTtcblxuLyoqXG4gKiBFbnN1cmVzIHRoaXMgYnVmZmVyIGhhcyBlbm91Z2ggZW1wdHkgc3BhY2UgdG8gYWNjb21tb2RhdGUgdGhlIGdpdmVuIG51bWJlclxuICogb2YgYnl0ZXMuIEFuIG9wdGlvbmFsIHBhcmFtZXRlciBtYXkgYmUgZ2l2ZW4gdGhhdCBpbmRpY2F0ZXMgYSBtaW5pbXVtXG4gKiBhbW91bnQgdG8gZ3JvdyB0aGUgYnVmZmVyIGlmIG5lY2Vzc2FyeS4gSWYgdGhlIHBhcmFtZXRlciBpcyBub3QgZ2l2ZW4sXG4gKiB0aGUgYnVmZmVyIHdpbGwgYmUgZ3Jvd24gYnkgc29tZSBwcmV2aW91c2x5LXNwZWNpZmllZCBkZWZhdWx0IGFtb3VudFxuICogb3IgaGV1cmlzdGljLlxuICpcbiAqIEBwYXJhbSBhbW91bnQgdGhlIG51bWJlciBvZiBieXRlcyB0byBhY2NvbW1vZGF0ZS5cbiAqIEBwYXJhbSBbZ3Jvd1NpemVdIHRoZSBtaW5pbXVtIGFtb3VudCwgaW4gYnl0ZXMsIHRvIGdyb3cgdGhlIGJ1ZmZlciBieSBpZlxuICogICAgICAgICAgbmVjZXNzYXJ5LlxuICovXG51dGlsLkRhdGFCdWZmZXIucHJvdG90eXBlLmFjY29tbW9kYXRlID0gZnVuY3Rpb24oYW1vdW50LCBncm93U2l6ZSkge1xuICBpZih0aGlzLmxlbmd0aCgpID49IGFtb3VudCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIGdyb3dTaXplID0gTWF0aC5tYXgoZ3Jvd1NpemUgfHwgdGhpcy5ncm93U2l6ZSwgYW1vdW50KTtcblxuICAvLyBncm93IGJ1ZmZlclxuICB2YXIgc3JjID0gbmV3IFVpbnQ4QXJyYXkoXG4gICAgdGhpcy5kYXRhLmJ1ZmZlciwgdGhpcy5kYXRhLmJ5dGVPZmZzZXQsIHRoaXMuZGF0YS5ieXRlTGVuZ3RoKTtcbiAgdmFyIGRzdCA9IG5ldyBVaW50OEFycmF5KHRoaXMubGVuZ3RoKCkgKyBncm93U2l6ZSk7XG4gIGRzdC5zZXQoc3JjKTtcbiAgdGhpcy5kYXRhID0gbmV3IERhdGFWaWV3KGRzdC5idWZmZXIpO1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBQdXRzIGEgYnl0ZSBpbiB0aGlzIGJ1ZmZlci5cbiAqXG4gKiBAcGFyYW0gYiB0aGUgYnl0ZSB0byBwdXQuXG4gKlxuICogQHJldHVybiB0aGlzIGJ1ZmZlci5cbiAqL1xudXRpbC5EYXRhQnVmZmVyLnByb3RvdHlwZS5wdXRCeXRlID0gZnVuY3Rpb24oYikge1xuICB0aGlzLmFjY29tbW9kYXRlKDEpO1xuICB0aGlzLmRhdGEuc2V0VWludDgodGhpcy53cml0ZSsrLCBiKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFB1dHMgYSBieXRlIGluIHRoaXMgYnVmZmVyIE4gdGltZXMuXG4gKlxuICogQHBhcmFtIGIgdGhlIGJ5dGUgdG8gcHV0LlxuICogQHBhcmFtIG4gdGhlIG51bWJlciBvZiBieXRlcyBvZiB2YWx1ZSBiIHRvIHB1dC5cbiAqXG4gKiBAcmV0dXJuIHRoaXMgYnVmZmVyLlxuICovXG51dGlsLkRhdGFCdWZmZXIucHJvdG90eXBlLmZpbGxXaXRoQnl0ZSA9IGZ1bmN0aW9uKGIsIG4pIHtcbiAgdGhpcy5hY2NvbW1vZGF0ZShuKTtcbiAgZm9yKHZhciBpID0gMDsgaSA8IG47ICsraSkge1xuICAgIHRoaXMuZGF0YS5zZXRVaW50OChiKTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogUHV0cyBieXRlcyBpbiB0aGlzIGJ1ZmZlci4gVGhlIGJ5dGVzIG1heSBiZSBnaXZlbiBhcyBhIHN0cmluZywgYW5cbiAqIEFycmF5QnVmZmVyLCBhIERhdGFWaWV3LCBvciBhIFR5cGVkQXJyYXkuXG4gKlxuICogQHBhcmFtIGJ5dGVzIHRoZSBieXRlcyB0byBwdXQuXG4gKiBAcGFyYW0gW2VuY29kaW5nXSB0aGUgZW5jb2RpbmcgZm9yIHRoZSBmaXJzdCBwYXJhbWV0ZXIgKCdiaW5hcnknLCAndXRmOCcsXG4gKiAgICAgICAgICAndXRmMTYnLCAnaGV4JyksIGlmIGl0IGlzIGEgc3RyaW5nIChkZWZhdWx0OiAnYmluYXJ5JykuXG4gKlxuICogQHJldHVybiB0aGlzIGJ1ZmZlci5cbiAqL1xudXRpbC5EYXRhQnVmZmVyLnByb3RvdHlwZS5wdXRCeXRlcyA9IGZ1bmN0aW9uKGJ5dGVzLCBlbmNvZGluZykge1xuICBpZih1dGlsLmlzQXJyYXlCdWZmZXJWaWV3KGJ5dGVzKSkge1xuICAgIHZhciBzcmMgPSBuZXcgVWludDhBcnJheShieXRlcy5idWZmZXIsIGJ5dGVzLmJ5dGVPZmZzZXQsIGJ5dGVzLmJ5dGVMZW5ndGgpO1xuICAgIHZhciBsZW4gPSBzcmMuYnl0ZUxlbmd0aCAtIHNyYy5ieXRlT2Zmc2V0O1xuICAgIHRoaXMuYWNjb21tb2RhdGUobGVuKTtcbiAgICB2YXIgZHN0ID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5kYXRhLmJ1ZmZlciwgdGhpcy53cml0ZSk7XG4gICAgZHN0LnNldChzcmMpO1xuICAgIHRoaXMud3JpdGUgKz0gbGVuO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgaWYodXRpbC5pc0FycmF5QnVmZmVyKGJ5dGVzKSkge1xuICAgIHZhciBzcmMgPSBuZXcgVWludDhBcnJheShieXRlcyk7XG4gICAgdGhpcy5hY2NvbW1vZGF0ZShzcmMuYnl0ZUxlbmd0aCk7XG4gICAgdmFyIGRzdCA9IG5ldyBVaW50OEFycmF5KHRoaXMuZGF0YS5idWZmZXIpO1xuICAgIGRzdC5zZXQoc3JjLCB0aGlzLndyaXRlKTtcbiAgICB0aGlzLndyaXRlICs9IHNyYy5ieXRlTGVuZ3RoO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gYnl0ZXMgaXMgYSB1dGlsLkRhdGFCdWZmZXIgb3IgZXF1aXZhbGVudFxuICBpZihieXRlcyBpbnN0YW5jZW9mIHV0aWwuRGF0YUJ1ZmZlciB8fFxuICAgICh0eXBlb2YgYnl0ZXMgPT09ICdvYmplY3QnICYmXG4gICAgdHlwZW9mIGJ5dGVzLnJlYWQgPT09ICdudW1iZXInICYmIHR5cGVvZiBieXRlcy53cml0ZSA9PT0gJ251bWJlcicgJiZcbiAgICB1dGlsLmlzQXJyYXlCdWZmZXJWaWV3KGJ5dGVzLmRhdGEpKSkge1xuICAgIHZhciBzcmMgPSBuZXcgVWludDhBcnJheShieXRlcy5kYXRhLmJ5dGVMZW5ndGgsIGJ5dGVzLnJlYWQsIGJ5dGVzLmxlbmd0aCgpKTtcbiAgICB0aGlzLmFjY29tbW9kYXRlKHNyYy5ieXRlTGVuZ3RoKTtcbiAgICB2YXIgZHN0ID0gbmV3IFVpbnQ4QXJyYXkoYnl0ZXMuZGF0YS5ieXRlTGVuZ3RoLCB0aGlzLndyaXRlKTtcbiAgICBkc3Quc2V0KHNyYyk7XG4gICAgdGhpcy53cml0ZSArPSBzcmMuYnl0ZUxlbmd0aDtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGlmKGJ5dGVzIGluc3RhbmNlb2YgdXRpbC5CeXRlU3RyaW5nQnVmZmVyKSB7XG4gICAgLy8gY29weSBiaW5hcnkgc3RyaW5nIGFuZCBwcm9jZXNzIGFzIHRoZSBzYW1lIGFzIGEgc3RyaW5nIHBhcmFtZXRlciBiZWxvd1xuICAgIGJ5dGVzID0gYnl0ZXMuZGF0YTtcbiAgICBlbmNvZGluZyA9ICdiaW5hcnknO1xuICB9XG5cbiAgLy8gc3RyaW5nIGNvbnZlcnNpb25cbiAgZW5jb2RpbmcgPSBlbmNvZGluZyB8fCAnYmluYXJ5JztcbiAgaWYodHlwZW9mIGJ5dGVzID09PSAnc3RyaW5nJykge1xuICAgIHZhciB2aWV3O1xuXG4gICAgLy8gZGVjb2RlIGZyb20gc3RyaW5nXG4gICAgaWYoZW5jb2RpbmcgPT09ICdoZXgnKSB7XG4gICAgICB0aGlzLmFjY29tbW9kYXRlKE1hdGguY2VpbChieXRlcy5sZW5ndGggLyAyKSk7XG4gICAgICB2aWV3ID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5kYXRhLmJ1ZmZlciwgdGhpcy53cml0ZSk7XG4gICAgICB0aGlzLndyaXRlICs9IHV0aWwuYmluYXJ5LmhleC5kZWNvZGUoYnl0ZXMsIHZpZXcsIHRoaXMud3JpdGUpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGlmKGVuY29kaW5nID09PSAnYmFzZTY0Jykge1xuICAgICAgdGhpcy5hY2NvbW1vZGF0ZShNYXRoLmNlaWwoYnl0ZXMubGVuZ3RoIC8gNCkgKiAzKTtcbiAgICAgIHZpZXcgPSBuZXcgVWludDhBcnJheSh0aGlzLmRhdGEuYnVmZmVyLCB0aGlzLndyaXRlKTtcbiAgICAgIHRoaXMud3JpdGUgKz0gdXRpbC5iaW5hcnkuYmFzZTY0LmRlY29kZShieXRlcywgdmlldywgdGhpcy53cml0ZSk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvLyBlbmNvZGUgdGV4dCBhcyBVVEYtOCBieXRlc1xuICAgIGlmKGVuY29kaW5nID09PSAndXRmOCcpIHtcbiAgICAgIC8vIGVuY29kZSBhcyBVVEYtOCB0aGVuIGRlY29kZSBzdHJpbmcgYXMgcmF3IGJpbmFyeVxuICAgICAgYnl0ZXMgPSB1dGlsLmVuY29kZVV0ZjgoYnl0ZXMpO1xuICAgICAgZW5jb2RpbmcgPSAnYmluYXJ5JztcbiAgICB9XG5cbiAgICAvLyBkZWNvZGUgc3RyaW5nIGFzIHJhdyBiaW5hcnlcbiAgICBpZihlbmNvZGluZyA9PT0gJ2JpbmFyeScgfHwgZW5jb2RpbmcgPT09ICdyYXcnKSB7XG4gICAgICAvLyBvbmUgYnl0ZSBwZXIgY2hhcmFjdGVyXG4gICAgICB0aGlzLmFjY29tbW9kYXRlKGJ5dGVzLmxlbmd0aCk7XG4gICAgICB2aWV3ID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5kYXRhLmJ1ZmZlciwgdGhpcy53cml0ZSk7XG4gICAgICB0aGlzLndyaXRlICs9IHV0aWwuYmluYXJ5LnJhdy5kZWNvZGUodmlldyk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvLyBlbmNvZGUgdGV4dCBhcyBVVEYtMTYgYnl0ZXNcbiAgICBpZihlbmNvZGluZyA9PT0gJ3V0ZjE2Jykge1xuICAgICAgLy8gdHdvIGJ5dGVzIHBlciBjaGFyYWN0ZXJcbiAgICAgIHRoaXMuYWNjb21tb2RhdGUoYnl0ZXMubGVuZ3RoICogMik7XG4gICAgICB2aWV3ID0gbmV3IFVpbnQxNkFycmF5KHRoaXMuZGF0YS5idWZmZXIsIHRoaXMud3JpdGUpO1xuICAgICAgdGhpcy53cml0ZSArPSB1dGlsLnRleHQudXRmMTYuZW5jb2RlKHZpZXcpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGVuY29kaW5nOiAnICsgZW5jb2RpbmcpO1xuICB9XG5cbiAgdGhyb3cgRXJyb3IoJ0ludmFsaWQgcGFyYW1ldGVyOiAnICsgYnl0ZXMpO1xufTtcblxuLyoqXG4gKiBQdXRzIHRoZSBnaXZlbiBidWZmZXIgaW50byB0aGlzIGJ1ZmZlci5cbiAqXG4gKiBAcGFyYW0gYnVmZmVyIHRoZSBidWZmZXIgdG8gcHV0IGludG8gdGhpcyBvbmUuXG4gKlxuICogQHJldHVybiB0aGlzIGJ1ZmZlci5cbiAqL1xudXRpbC5EYXRhQnVmZmVyLnByb3RvdHlwZS5wdXRCdWZmZXIgPSBmdW5jdGlvbihidWZmZXIpIHtcbiAgdGhpcy5wdXRCeXRlcyhidWZmZXIpO1xuICBidWZmZXIuY2xlYXIoKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFB1dHMgYSBzdHJpbmcgaW50byB0aGlzIGJ1ZmZlci5cbiAqXG4gKiBAcGFyYW0gc3RyIHRoZSBzdHJpbmcgdG8gcHV0LlxuICogQHBhcmFtIFtlbmNvZGluZ10gdGhlIGVuY29kaW5nIGZvciB0aGUgc3RyaW5nIChkZWZhdWx0OiAndXRmMTYnKS5cbiAqXG4gKiBAcmV0dXJuIHRoaXMgYnVmZmVyLlxuICovXG51dGlsLkRhdGFCdWZmZXIucHJvdG90eXBlLnB1dFN0cmluZyA9IGZ1bmN0aW9uKHN0cikge1xuICByZXR1cm4gdGhpcy5wdXRCeXRlcyhzdHIsICd1dGYxNicpO1xufTtcblxuLyoqXG4gKiBQdXRzIGEgMTYtYml0IGludGVnZXIgaW4gdGhpcyBidWZmZXIgaW4gYmlnLWVuZGlhbiBvcmRlci5cbiAqXG4gKiBAcGFyYW0gaSB0aGUgMTYtYml0IGludGVnZXIuXG4gKlxuICogQHJldHVybiB0aGlzIGJ1ZmZlci5cbiAqL1xudXRpbC5EYXRhQnVmZmVyLnByb3RvdHlwZS5wdXRJbnQxNiA9IGZ1bmN0aW9uKGkpIHtcbiAgdGhpcy5hY2NvbW1vZGF0ZSgyKTtcbiAgdGhpcy5kYXRhLnNldEludDE2KHRoaXMud3JpdGUsIGkpO1xuICB0aGlzLndyaXRlICs9IDI7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBQdXRzIGEgMjQtYml0IGludGVnZXIgaW4gdGhpcyBidWZmZXIgaW4gYmlnLWVuZGlhbiBvcmRlci5cbiAqXG4gKiBAcGFyYW0gaSB0aGUgMjQtYml0IGludGVnZXIuXG4gKlxuICogQHJldHVybiB0aGlzIGJ1ZmZlci5cbiAqL1xudXRpbC5EYXRhQnVmZmVyLnByb3RvdHlwZS5wdXRJbnQyNCA9IGZ1bmN0aW9uKGkpIHtcbiAgdGhpcy5hY2NvbW1vZGF0ZSgzKTtcbiAgdGhpcy5kYXRhLnNldEludDE2KHRoaXMud3JpdGUsIGkgPj4gOCAmIDB4RkZGRik7XG4gIHRoaXMuZGF0YS5zZXRJbnQ4KHRoaXMud3JpdGUsIGkgPj4gMTYgJiAweEZGKTtcbiAgdGhpcy53cml0ZSArPSAzO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogUHV0cyBhIDMyLWJpdCBpbnRlZ2VyIGluIHRoaXMgYnVmZmVyIGluIGJpZy1lbmRpYW4gb3JkZXIuXG4gKlxuICogQHBhcmFtIGkgdGhlIDMyLWJpdCBpbnRlZ2VyLlxuICpcbiAqIEByZXR1cm4gdGhpcyBidWZmZXIuXG4gKi9cbnV0aWwuRGF0YUJ1ZmZlci5wcm90b3R5cGUucHV0SW50MzIgPSBmdW5jdGlvbihpKSB7XG4gIHRoaXMuYWNjb21tb2RhdGUoNCk7XG4gIHRoaXMuZGF0YS5zZXRJbnQzMih0aGlzLndyaXRlLCBpKTtcbiAgdGhpcy53cml0ZSArPSA0O1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogUHV0cyBhIDE2LWJpdCBpbnRlZ2VyIGluIHRoaXMgYnVmZmVyIGluIGxpdHRsZS1lbmRpYW4gb3JkZXIuXG4gKlxuICogQHBhcmFtIGkgdGhlIDE2LWJpdCBpbnRlZ2VyLlxuICpcbiAqIEByZXR1cm4gdGhpcyBidWZmZXIuXG4gKi9cbnV0aWwuRGF0YUJ1ZmZlci5wcm90b3R5cGUucHV0SW50MTZMZSA9IGZ1bmN0aW9uKGkpIHtcbiAgdGhpcy5hY2NvbW1vZGF0ZSgyKTtcbiAgdGhpcy5kYXRhLnNldEludDE2KHRoaXMud3JpdGUsIGksIHRydWUpO1xuICB0aGlzLndyaXRlICs9IDI7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBQdXRzIGEgMjQtYml0IGludGVnZXIgaW4gdGhpcyBidWZmZXIgaW4gbGl0dGxlLWVuZGlhbiBvcmRlci5cbiAqXG4gKiBAcGFyYW0gaSB0aGUgMjQtYml0IGludGVnZXIuXG4gKlxuICogQHJldHVybiB0aGlzIGJ1ZmZlci5cbiAqL1xudXRpbC5EYXRhQnVmZmVyLnByb3RvdHlwZS5wdXRJbnQyNExlID0gZnVuY3Rpb24oaSkge1xuICB0aGlzLmFjY29tbW9kYXRlKDMpO1xuICB0aGlzLmRhdGEuc2V0SW50OCh0aGlzLndyaXRlLCBpID4+IDE2ICYgMHhGRik7XG4gIHRoaXMuZGF0YS5zZXRJbnQxNih0aGlzLndyaXRlLCBpID4+IDggJiAweEZGRkYsIHRydWUpO1xuICB0aGlzLndyaXRlICs9IDM7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBQdXRzIGEgMzItYml0IGludGVnZXIgaW4gdGhpcyBidWZmZXIgaW4gbGl0dGxlLWVuZGlhbiBvcmRlci5cbiAqXG4gKiBAcGFyYW0gaSB0aGUgMzItYml0IGludGVnZXIuXG4gKlxuICogQHJldHVybiB0aGlzIGJ1ZmZlci5cbiAqL1xudXRpbC5EYXRhQnVmZmVyLnByb3RvdHlwZS5wdXRJbnQzMkxlID0gZnVuY3Rpb24oaSkge1xuICB0aGlzLmFjY29tbW9kYXRlKDQpO1xuICB0aGlzLmRhdGEuc2V0SW50MzIodGhpcy53cml0ZSwgaSwgdHJ1ZSk7XG4gIHRoaXMud3JpdGUgKz0gNDtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFB1dHMgYW4gbi1iaXQgaW50ZWdlciBpbiB0aGlzIGJ1ZmZlciBpbiBiaWctZW5kaWFuIG9yZGVyLlxuICpcbiAqIEBwYXJhbSBpIHRoZSBuLWJpdCBpbnRlZ2VyLlxuICogQHBhcmFtIG4gdGhlIG51bWJlciBvZiBiaXRzIGluIHRoZSBpbnRlZ2VyICg4LCAxNiwgMjQsIG9yIDMyKS5cbiAqXG4gKiBAcmV0dXJuIHRoaXMgYnVmZmVyLlxuICovXG51dGlsLkRhdGFCdWZmZXIucHJvdG90eXBlLnB1dEludCA9IGZ1bmN0aW9uKGksIG4pIHtcbiAgX2NoZWNrQml0c1BhcmFtKG4pO1xuICB0aGlzLmFjY29tbW9kYXRlKG4gLyA4KTtcbiAgZG8ge1xuICAgIG4gLT0gODtcbiAgICB0aGlzLmRhdGEuc2V0SW50OCh0aGlzLndyaXRlKyssIChpID4+IG4pICYgMHhGRik7XG4gIH0gd2hpbGUobiA+IDApO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogUHV0cyBhIHNpZ25lZCBuLWJpdCBpbnRlZ2VyIGluIHRoaXMgYnVmZmVyIGluIGJpZy1lbmRpYW4gb3JkZXIuIFR3bydzXG4gKiBjb21wbGVtZW50IHJlcHJlc2VudGF0aW9uIGlzIHVzZWQuXG4gKlxuICogQHBhcmFtIGkgdGhlIG4tYml0IGludGVnZXIuXG4gKiBAcGFyYW0gbiB0aGUgbnVtYmVyIG9mIGJpdHMgaW4gdGhlIGludGVnZXIuXG4gKlxuICogQHJldHVybiB0aGlzIGJ1ZmZlci5cbiAqL1xudXRpbC5EYXRhQnVmZmVyLnByb3RvdHlwZS5wdXRTaWduZWRJbnQgPSBmdW5jdGlvbihpLCBuKSB7XG4gIF9jaGVja0JpdHNQYXJhbShuKTtcbiAgdGhpcy5hY2NvbW1vZGF0ZShuIC8gOCk7XG4gIGlmKGkgPCAwKSB7XG4gICAgaSArPSAyIDw8IChuIC0gMSk7XG4gIH1cbiAgcmV0dXJuIHRoaXMucHV0SW50KGksIG4pO1xufTtcblxuLyoqXG4gKiBHZXRzIGEgYnl0ZSBmcm9tIHRoaXMgYnVmZmVyIGFuZCBhZHZhbmNlcyB0aGUgcmVhZCBwb2ludGVyIGJ5IDEuXG4gKlxuICogQHJldHVybiB0aGUgYnl0ZS5cbiAqL1xudXRpbC5EYXRhQnVmZmVyLnByb3RvdHlwZS5nZXRCeXRlID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLmRhdGEuZ2V0SW50OCh0aGlzLnJlYWQrKyk7XG59O1xuXG4vKipcbiAqIEdldHMgYSB1aW50MTYgZnJvbSB0aGlzIGJ1ZmZlciBpbiBiaWctZW5kaWFuIG9yZGVyIGFuZCBhZHZhbmNlcyB0aGUgcmVhZFxuICogcG9pbnRlciBieSAyLlxuICpcbiAqIEByZXR1cm4gdGhlIHVpbnQxNi5cbiAqL1xudXRpbC5EYXRhQnVmZmVyLnByb3RvdHlwZS5nZXRJbnQxNiA9IGZ1bmN0aW9uKCkge1xuICB2YXIgcnZhbCA9IHRoaXMuZGF0YS5nZXRJbnQxNih0aGlzLnJlYWQpO1xuICB0aGlzLnJlYWQgKz0gMjtcbiAgcmV0dXJuIHJ2YWw7XG59O1xuXG4vKipcbiAqIEdldHMgYSB1aW50MjQgZnJvbSB0aGlzIGJ1ZmZlciBpbiBiaWctZW5kaWFuIG9yZGVyIGFuZCBhZHZhbmNlcyB0aGUgcmVhZFxuICogcG9pbnRlciBieSAzLlxuICpcbiAqIEByZXR1cm4gdGhlIHVpbnQyNC5cbiAqL1xudXRpbC5EYXRhQnVmZmVyLnByb3RvdHlwZS5nZXRJbnQyNCA9IGZ1bmN0aW9uKCkge1xuICB2YXIgcnZhbCA9IChcbiAgICB0aGlzLmRhdGEuZ2V0SW50MTYodGhpcy5yZWFkKSA8PCA4IF5cbiAgICB0aGlzLmRhdGEuZ2V0SW50OCh0aGlzLnJlYWQgKyAyKSk7XG4gIHRoaXMucmVhZCArPSAzO1xuICByZXR1cm4gcnZhbDtcbn07XG5cbi8qKlxuICogR2V0cyBhIHVpbnQzMiBmcm9tIHRoaXMgYnVmZmVyIGluIGJpZy1lbmRpYW4gb3JkZXIgYW5kIGFkdmFuY2VzIHRoZSByZWFkXG4gKiBwb2ludGVyIGJ5IDQuXG4gKlxuICogQHJldHVybiB0aGUgd29yZC5cbiAqL1xudXRpbC5EYXRhQnVmZmVyLnByb3RvdHlwZS5nZXRJbnQzMiA9IGZ1bmN0aW9uKCkge1xuICB2YXIgcnZhbCA9IHRoaXMuZGF0YS5nZXRJbnQzMih0aGlzLnJlYWQpO1xuICB0aGlzLnJlYWQgKz0gNDtcbiAgcmV0dXJuIHJ2YWw7XG59O1xuXG4vKipcbiAqIEdldHMgYSB1aW50MTYgZnJvbSB0aGlzIGJ1ZmZlciBpbiBsaXR0bGUtZW5kaWFuIG9yZGVyIGFuZCBhZHZhbmNlcyB0aGUgcmVhZFxuICogcG9pbnRlciBieSAyLlxuICpcbiAqIEByZXR1cm4gdGhlIHVpbnQxNi5cbiAqL1xudXRpbC5EYXRhQnVmZmVyLnByb3RvdHlwZS5nZXRJbnQxNkxlID0gZnVuY3Rpb24oKSB7XG4gIHZhciBydmFsID0gdGhpcy5kYXRhLmdldEludDE2KHRoaXMucmVhZCwgdHJ1ZSk7XG4gIHRoaXMucmVhZCArPSAyO1xuICByZXR1cm4gcnZhbDtcbn07XG5cbi8qKlxuICogR2V0cyBhIHVpbnQyNCBmcm9tIHRoaXMgYnVmZmVyIGluIGxpdHRsZS1lbmRpYW4gb3JkZXIgYW5kIGFkdmFuY2VzIHRoZSByZWFkXG4gKiBwb2ludGVyIGJ5IDMuXG4gKlxuICogQHJldHVybiB0aGUgdWludDI0LlxuICovXG51dGlsLkRhdGFCdWZmZXIucHJvdG90eXBlLmdldEludDI0TGUgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHJ2YWwgPSAoXG4gICAgdGhpcy5kYXRhLmdldEludDgodGhpcy5yZWFkKSBeXG4gICAgdGhpcy5kYXRhLmdldEludDE2KHRoaXMucmVhZCArIDEsIHRydWUpIDw8IDgpO1xuICB0aGlzLnJlYWQgKz0gMztcbiAgcmV0dXJuIHJ2YWw7XG59O1xuXG4vKipcbiAqIEdldHMgYSB1aW50MzIgZnJvbSB0aGlzIGJ1ZmZlciBpbiBsaXR0bGUtZW5kaWFuIG9yZGVyIGFuZCBhZHZhbmNlcyB0aGUgcmVhZFxuICogcG9pbnRlciBieSA0LlxuICpcbiAqIEByZXR1cm4gdGhlIHdvcmQuXG4gKi9cbnV0aWwuRGF0YUJ1ZmZlci5wcm90b3R5cGUuZ2V0SW50MzJMZSA9IGZ1bmN0aW9uKCkge1xuICB2YXIgcnZhbCA9IHRoaXMuZGF0YS5nZXRJbnQzMih0aGlzLnJlYWQsIHRydWUpO1xuICB0aGlzLnJlYWQgKz0gNDtcbiAgcmV0dXJuIHJ2YWw7XG59O1xuXG4vKipcbiAqIEdldHMgYW4gbi1iaXQgaW50ZWdlciBmcm9tIHRoaXMgYnVmZmVyIGluIGJpZy1lbmRpYW4gb3JkZXIgYW5kIGFkdmFuY2VzIHRoZVxuICogcmVhZCBwb2ludGVyIGJ5IG4vOC5cbiAqXG4gKiBAcGFyYW0gbiB0aGUgbnVtYmVyIG9mIGJpdHMgaW4gdGhlIGludGVnZXIgKDgsIDE2LCAyNCwgb3IgMzIpLlxuICpcbiAqIEByZXR1cm4gdGhlIGludGVnZXIuXG4gKi9cbnV0aWwuRGF0YUJ1ZmZlci5wcm90b3R5cGUuZ2V0SW50ID0gZnVuY3Rpb24obikge1xuICBfY2hlY2tCaXRzUGFyYW0obik7XG4gIHZhciBydmFsID0gMDtcbiAgZG8ge1xuICAgIC8vIFRPRE86IFVzZSAocnZhbCAqIDB4MTAwKSBpZiBhZGRpbmcgc3VwcG9ydCBmb3IgMzMgdG8gNTMgYml0cy5cbiAgICBydmFsID0gKHJ2YWwgPDwgOCkgKyB0aGlzLmRhdGEuZ2V0SW50OCh0aGlzLnJlYWQrKyk7XG4gICAgbiAtPSA4O1xuICB9IHdoaWxlKG4gPiAwKTtcbiAgcmV0dXJuIHJ2YWw7XG59O1xuXG4vKipcbiAqIEdldHMgYSBzaWduZWQgbi1iaXQgaW50ZWdlciBmcm9tIHRoaXMgYnVmZmVyIGluIGJpZy1lbmRpYW4gb3JkZXIsIHVzaW5nXG4gKiB0d28ncyBjb21wbGVtZW50LCBhbmQgYWR2YW5jZXMgdGhlIHJlYWQgcG9pbnRlciBieSBuLzguXG4gKlxuICogQHBhcmFtIG4gdGhlIG51bWJlciBvZiBiaXRzIGluIHRoZSBpbnRlZ2VyICg4LCAxNiwgMjQsIG9yIDMyKS5cbiAqXG4gKiBAcmV0dXJuIHRoZSBpbnRlZ2VyLlxuICovXG51dGlsLkRhdGFCdWZmZXIucHJvdG90eXBlLmdldFNpZ25lZEludCA9IGZ1bmN0aW9uKG4pIHtcbiAgLy8gZ2V0SW50IGNoZWNrcyBuXG4gIHZhciB4ID0gdGhpcy5nZXRJbnQobik7XG4gIHZhciBtYXggPSAyIDw8IChuIC0gMik7XG4gIGlmKHggPj0gbWF4KSB7XG4gICAgeCAtPSBtYXggPDwgMTtcbiAgfVxuICByZXR1cm4geDtcbn07XG5cbi8qKlxuICogUmVhZHMgYnl0ZXMgb3V0IGFzIGEgYmluYXJ5IGVuY29kZWQgc3RyaW5nIGFuZCBjbGVhcnMgdGhlbSBmcm9tIHRoZVxuICogYnVmZmVyLlxuICpcbiAqIEBwYXJhbSBjb3VudCB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQsIHVuZGVmaW5lZCBvciBudWxsIGZvciBhbGwuXG4gKlxuICogQHJldHVybiBhIGJpbmFyeSBlbmNvZGVkIHN0cmluZyBvZiBieXRlcy5cbiAqL1xudXRpbC5EYXRhQnVmZmVyLnByb3RvdHlwZS5nZXRCeXRlcyA9IGZ1bmN0aW9uKGNvdW50KSB7XG4gIC8vIFRPRE86IGRlcHJlY2F0ZSB0aGlzIG1ldGhvZCwgaXQgaXMgcG9vcmx5IG5hbWVkIGFuZFxuICAvLyB0aGlzLnRvU3RyaW5nKCdiaW5hcnknKSByZXBsYWNlcyBpdFxuICAvLyBhZGQgYSB0b1R5cGVkQXJyYXkoKS90b0FycmF5QnVmZmVyKCkgZnVuY3Rpb25cbiAgdmFyIHJ2YWw7XG4gIGlmKGNvdW50KSB7XG4gICAgLy8gcmVhZCBjb3VudCBieXRlc1xuICAgIGNvdW50ID0gTWF0aC5taW4odGhpcy5sZW5ndGgoKSwgY291bnQpO1xuICAgIHJ2YWwgPSB0aGlzLmRhdGEuc2xpY2UodGhpcy5yZWFkLCB0aGlzLnJlYWQgKyBjb3VudCk7XG4gICAgdGhpcy5yZWFkICs9IGNvdW50O1xuICB9IGVsc2UgaWYoY291bnQgPT09IDApIHtcbiAgICBydmFsID0gJyc7XG4gIH0gZWxzZSB7XG4gICAgLy8gcmVhZCBhbGwgYnl0ZXMsIG9wdGltaXplIHRvIG9ubHkgY29weSB3aGVuIG5lZWRlZFxuICAgIHJ2YWwgPSAodGhpcy5yZWFkID09PSAwKSA/IHRoaXMuZGF0YSA6IHRoaXMuZGF0YS5zbGljZSh0aGlzLnJlYWQpO1xuICAgIHRoaXMuY2xlYXIoKTtcbiAgfVxuICByZXR1cm4gcnZhbDtcbn07XG5cbi8qKlxuICogR2V0cyBhIGJpbmFyeSBlbmNvZGVkIHN0cmluZyBvZiB0aGUgYnl0ZXMgZnJvbSB0aGlzIGJ1ZmZlciB3aXRob3V0XG4gKiBtb2RpZnlpbmcgdGhlIHJlYWQgcG9pbnRlci5cbiAqXG4gKiBAcGFyYW0gY291bnQgdGhlIG51bWJlciBvZiBieXRlcyB0byBnZXQsIG9taXQgdG8gZ2V0IGFsbC5cbiAqXG4gKiBAcmV0dXJuIGEgc3RyaW5nIGZ1bGwgb2YgYmluYXJ5IGVuY29kZWQgY2hhcmFjdGVycy5cbiAqL1xudXRpbC5EYXRhQnVmZmVyLnByb3RvdHlwZS5ieXRlcyA9IGZ1bmN0aW9uKGNvdW50KSB7XG4gIC8vIFRPRE86IGRlcHJlY2F0ZSB0aGlzIG1ldGhvZCwgaXQgaXMgcG9vcmx5IG5hbWVkLCBhZGQgXCJnZXRTdHJpbmcoKVwiXG4gIHJldHVybiAodHlwZW9mKGNvdW50KSA9PT0gJ3VuZGVmaW5lZCcgP1xuICAgIHRoaXMuZGF0YS5zbGljZSh0aGlzLnJlYWQpIDpcbiAgICB0aGlzLmRhdGEuc2xpY2UodGhpcy5yZWFkLCB0aGlzLnJlYWQgKyBjb3VudCkpO1xufTtcblxuLyoqXG4gKiBHZXRzIGEgYnl0ZSBhdCB0aGUgZ2l2ZW4gaW5kZXggd2l0aG91dCBtb2RpZnlpbmcgdGhlIHJlYWQgcG9pbnRlci5cbiAqXG4gKiBAcGFyYW0gaSB0aGUgYnl0ZSBpbmRleC5cbiAqXG4gKiBAcmV0dXJuIHRoZSBieXRlLlxuICovXG51dGlsLkRhdGFCdWZmZXIucHJvdG90eXBlLmF0ID0gZnVuY3Rpb24oaSkge1xuICByZXR1cm4gdGhpcy5kYXRhLmdldFVpbnQ4KHRoaXMucmVhZCArIGkpO1xufTtcblxuLyoqXG4gKiBQdXRzIGEgYnl0ZSBhdCB0aGUgZ2l2ZW4gaW5kZXggd2l0aG91dCBtb2RpZnlpbmcgdGhlIHJlYWQgcG9pbnRlci5cbiAqXG4gKiBAcGFyYW0gaSB0aGUgYnl0ZSBpbmRleC5cbiAqIEBwYXJhbSBiIHRoZSBieXRlIHRvIHB1dC5cbiAqXG4gKiBAcmV0dXJuIHRoaXMgYnVmZmVyLlxuICovXG51dGlsLkRhdGFCdWZmZXIucHJvdG90eXBlLnNldEF0ID0gZnVuY3Rpb24oaSwgYikge1xuICB0aGlzLmRhdGEuc2V0VWludDgoaSwgYik7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBHZXRzIHRoZSBsYXN0IGJ5dGUgd2l0aG91dCBtb2RpZnlpbmcgdGhlIHJlYWQgcG9pbnRlci5cbiAqXG4gKiBAcmV0dXJuIHRoZSBsYXN0IGJ5dGUuXG4gKi9cbnV0aWwuRGF0YUJ1ZmZlci5wcm90b3R5cGUubGFzdCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5kYXRhLmdldFVpbnQ4KHRoaXMud3JpdGUgLSAxKTtcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIGNvcHkgb2YgdGhpcyBidWZmZXIuXG4gKlxuICogQHJldHVybiB0aGUgY29weS5cbiAqL1xudXRpbC5EYXRhQnVmZmVyLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgdXRpbC5EYXRhQnVmZmVyKHRoaXMpO1xufTtcblxuLyoqXG4gKiBDb21wYWN0cyB0aGlzIGJ1ZmZlci5cbiAqXG4gKiBAcmV0dXJuIHRoaXMgYnVmZmVyLlxuICovXG51dGlsLkRhdGFCdWZmZXIucHJvdG90eXBlLmNvbXBhY3QgPSBmdW5jdGlvbigpIHtcbiAgaWYodGhpcy5yZWFkID4gMCkge1xuICAgIHZhciBzcmMgPSBuZXcgVWludDhBcnJheSh0aGlzLmRhdGEuYnVmZmVyLCB0aGlzLnJlYWQpO1xuICAgIHZhciBkc3QgPSBuZXcgVWludDhBcnJheShzcmMuYnl0ZUxlbmd0aCk7XG4gICAgZHN0LnNldChzcmMpO1xuICAgIHRoaXMuZGF0YSA9IG5ldyBEYXRhVmlldyhkc3QpO1xuICAgIHRoaXMud3JpdGUgLT0gdGhpcy5yZWFkO1xuICAgIHRoaXMucmVhZCA9IDA7XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIENsZWFycyB0aGlzIGJ1ZmZlci5cbiAqXG4gKiBAcmV0dXJuIHRoaXMgYnVmZmVyLlxuICovXG51dGlsLkRhdGFCdWZmZXIucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuZGF0YSA9IG5ldyBEYXRhVmlldyhuZXcgQXJyYXlCdWZmZXIoMCkpO1xuICB0aGlzLnJlYWQgPSB0aGlzLndyaXRlID0gMDtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFNob3J0ZW5zIHRoaXMgYnVmZmVyIGJ5IHRyaW1pbmcgYnl0ZXMgb2ZmIG9mIHRoZSBlbmQgb2YgdGhpcyBidWZmZXIuXG4gKlxuICogQHBhcmFtIGNvdW50IHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gdHJpbSBvZmYuXG4gKlxuICogQHJldHVybiB0aGlzIGJ1ZmZlci5cbiAqL1xudXRpbC5EYXRhQnVmZmVyLnByb3RvdHlwZS50cnVuY2F0ZSA9IGZ1bmN0aW9uKGNvdW50KSB7XG4gIHRoaXMud3JpdGUgPSBNYXRoLm1heCgwLCB0aGlzLmxlbmd0aCgpIC0gY291bnQpO1xuICB0aGlzLnJlYWQgPSBNYXRoLm1pbih0aGlzLnJlYWQsIHRoaXMud3JpdGUpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogQ29udmVydHMgdGhpcyBidWZmZXIgdG8gYSBoZXhhZGVjaW1hbCBzdHJpbmcuXG4gKlxuICogQHJldHVybiBhIGhleGFkZWNpbWFsIHN0cmluZy5cbiAqL1xudXRpbC5EYXRhQnVmZmVyLnByb3RvdHlwZS50b0hleCA9IGZ1bmN0aW9uKCkge1xuICB2YXIgcnZhbCA9ICcnO1xuICBmb3IodmFyIGkgPSB0aGlzLnJlYWQ7IGkgPCB0aGlzLmRhdGEuYnl0ZUxlbmd0aDsgKytpKSB7XG4gICAgdmFyIGIgPSB0aGlzLmRhdGEuZ2V0VWludDgoaSk7XG4gICAgaWYoYiA8IDE2KSB7XG4gICAgICBydmFsICs9ICcwJztcbiAgICB9XG4gICAgcnZhbCArPSBiLnRvU3RyaW5nKDE2KTtcbiAgfVxuICByZXR1cm4gcnZhbDtcbn07XG5cbi8qKlxuICogQ29udmVydHMgdGhpcyBidWZmZXIgdG8gYSBzdHJpbmcsIHVzaW5nIHRoZSBnaXZlbiBlbmNvZGluZy4gSWYgbm9cbiAqIGVuY29kaW5nIGlzIGdpdmVuLCAndXRmOCcgKFVURi04KSBpcyB1c2VkLlxuICpcbiAqIEBwYXJhbSBbZW5jb2RpbmddIHRoZSBlbmNvZGluZyB0byB1c2U6ICdiaW5hcnknLCAndXRmOCcsICd1dGYxNicsICdoZXgnLFxuICogICAgICAgICAgJ2Jhc2U2NCcgKGRlZmF1bHQ6ICd1dGY4JykuXG4gKlxuICogQHJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgYnl0ZXMgaW4gdGhpcyBidWZmZXIuXG4gKi9cbnV0aWwuRGF0YUJ1ZmZlci5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbihlbmNvZGluZykge1xuICB2YXIgdmlldyA9IG5ldyBVaW50OEFycmF5KHRoaXMuZGF0YSwgdGhpcy5yZWFkLCB0aGlzLmxlbmd0aCgpKTtcbiAgZW5jb2RpbmcgPSBlbmNvZGluZyB8fCAndXRmOCc7XG5cbiAgLy8gZW5jb2RlIHRvIHN0cmluZ1xuICBpZihlbmNvZGluZyA9PT0gJ2JpbmFyeScgfHwgZW5jb2RpbmcgPT09ICdyYXcnKSB7XG4gICAgcmV0dXJuIHV0aWwuYmluYXJ5LnJhdy5lbmNvZGUodmlldyk7XG4gIH1cbiAgaWYoZW5jb2RpbmcgPT09ICdoZXgnKSB7XG4gICAgcmV0dXJuIHV0aWwuYmluYXJ5LmhleC5lbmNvZGUodmlldyk7XG4gIH1cbiAgaWYoZW5jb2RpbmcgPT09ICdiYXNlNjQnKSB7XG4gICAgcmV0dXJuIHV0aWwuYmluYXJ5LmJhc2U2NC5lbmNvZGUodmlldyk7XG4gIH1cblxuICAvLyBkZWNvZGUgdG8gdGV4dFxuICBpZihlbmNvZGluZyA9PT0gJ3V0ZjgnKSB7XG4gICAgcmV0dXJuIHV0aWwudGV4dC51dGY4LmRlY29kZSh2aWV3KTtcbiAgfVxuICBpZihlbmNvZGluZyA9PT0gJ3V0ZjE2Jykge1xuICAgIHJldHVybiB1dGlsLnRleHQudXRmMTYuZGVjb2RlKHZpZXcpO1xuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGVuY29kaW5nOiAnICsgZW5jb2RpbmcpO1xufTtcblxuLyoqIEVuZCBCdWZmZXIgdy9VSW50OEFycmF5IGJhY2tpbmcgKi9cblxuLyoqXG4gKiBDcmVhdGVzIGEgYnVmZmVyIHRoYXQgc3RvcmVzIGJ5dGVzLiBBIHZhbHVlIG1heSBiZSBnaXZlbiB0byBwb3B1bGF0ZSB0aGVcbiAqIGJ1ZmZlciB3aXRoIGRhdGEuIFRoaXMgdmFsdWUgY2FuIGVpdGhlciBiZSBzdHJpbmcgb2YgZW5jb2RlZCBieXRlcyBvciBhXG4gKiByZWd1bGFyIHN0cmluZyBvZiBjaGFyYWN0ZXJzLiBXaGVuIHBhc3NpbmcgYSBzdHJpbmcgb2YgYmluYXJ5IGVuY29kZWRcbiAqIGJ5dGVzLCB0aGUgZW5jb2RpbmcgYHJhd2Agc2hvdWxkIGJlIGdpdmVuLiBUaGlzIGlzIGFsc28gdGhlIGRlZmF1bHQuIFdoZW5cbiAqIHBhc3NpbmcgYSBzdHJpbmcgb2YgY2hhcmFjdGVycywgdGhlIGVuY29kaW5nIGB1dGY4YCBzaG91bGQgYmUgZ2l2ZW4uXG4gKlxuICogQHBhcmFtIFtpbnB1dF0gYSBzdHJpbmcgd2l0aCBlbmNvZGVkIGJ5dGVzIHRvIHN0b3JlIGluIHRoZSBidWZmZXIuXG4gKiBAcGFyYW0gW2VuY29kaW5nXSAoZGVmYXVsdDogJ3JhdycsIG90aGVyOiAndXRmOCcpLlxuICovXG51dGlsLmNyZWF0ZUJ1ZmZlciA9IGZ1bmN0aW9uKGlucHV0LCBlbmNvZGluZykge1xuICAvLyBUT0RPOiBkZXByZWNhdGUsIHVzZSBuZXcgQnl0ZUJ1ZmZlcigpIGluc3RlYWRcbiAgZW5jb2RpbmcgPSBlbmNvZGluZyB8fCAncmF3JztcbiAgaWYoaW5wdXQgIT09IHVuZGVmaW5lZCAmJiBlbmNvZGluZyA9PT0gJ3V0ZjgnKSB7XG4gICAgaW5wdXQgPSB1dGlsLmVuY29kZVV0ZjgoaW5wdXQpO1xuICB9XG4gIHJldHVybiBuZXcgdXRpbC5CeXRlQnVmZmVyKGlucHV0KTtcbn07XG5cbi8qKlxuICogRmlsbHMgYSBzdHJpbmcgd2l0aCBhIHBhcnRpY3VsYXIgdmFsdWUuIElmIHlvdSB3YW50IHRoZSBzdHJpbmcgdG8gYmUgYSBieXRlXG4gKiBzdHJpbmcsIHBhc3MgaW4gU3RyaW5nLmZyb21DaGFyQ29kZSh0aGVCeXRlKS5cbiAqXG4gKiBAcGFyYW0gYyB0aGUgY2hhcmFjdGVyIHRvIGZpbGwgdGhlIHN0cmluZyB3aXRoLCB1c2UgU3RyaW5nLmZyb21DaGFyQ29kZVxuICogICAgICAgICAgdG8gZmlsbCB0aGUgc3RyaW5nIHdpdGggYSBieXRlIHZhbHVlLlxuICogQHBhcmFtIG4gdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIG9mIHZhbHVlIGMgdG8gZmlsbCB3aXRoLlxuICpcbiAqIEByZXR1cm4gdGhlIGZpbGxlZCBzdHJpbmcuXG4gKi9cbnV0aWwuZmlsbFN0cmluZyA9IGZ1bmN0aW9uKGMsIG4pIHtcbiAgdmFyIHMgPSAnJztcbiAgd2hpbGUobiA+IDApIHtcbiAgICBpZihuICYgMSkge1xuICAgICAgcyArPSBjO1xuICAgIH1cbiAgICBuID4+Pj0gMTtcbiAgICBpZihuID4gMCkge1xuICAgICAgYyArPSBjO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcztcbn07XG5cbi8qKlxuICogUGVyZm9ybXMgYSBwZXIgYnl0ZSBYT1IgYmV0d2VlbiB0d28gYnl0ZSBzdHJpbmdzIGFuZCByZXR1cm5zIHRoZSByZXN1bHQgYXMgYVxuICogc3RyaW5nIG9mIGJ5dGVzLlxuICpcbiAqIEBwYXJhbSBzMSBmaXJzdCBzdHJpbmcgb2YgYnl0ZXMuXG4gKiBAcGFyYW0gczIgc2Vjb25kIHN0cmluZyBvZiBieXRlcy5cbiAqIEBwYXJhbSBuIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gWE9SLlxuICpcbiAqIEByZXR1cm4gdGhlIFhPUidkIHJlc3VsdC5cbiAqL1xudXRpbC54b3JCeXRlcyA9IGZ1bmN0aW9uKHMxLCBzMiwgbikge1xuICB2YXIgczMgPSAnJztcbiAgdmFyIGIgPSAnJztcbiAgdmFyIHQgPSAnJztcbiAgdmFyIGkgPSAwO1xuICB2YXIgYyA9IDA7XG4gIGZvcig7IG4gPiAwOyAtLW4sICsraSkge1xuICAgIGIgPSBzMS5jaGFyQ29kZUF0KGkpIF4gczIuY2hhckNvZGVBdChpKTtcbiAgICBpZihjID49IDEwKSB7XG4gICAgICBzMyArPSB0O1xuICAgICAgdCA9ICcnO1xuICAgICAgYyA9IDA7XG4gICAgfVxuICAgIHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShiKTtcbiAgICArK2M7XG4gIH1cbiAgczMgKz0gdDtcbiAgcmV0dXJuIHMzO1xufTtcblxuLyoqXG4gKiBDb252ZXJ0cyBhIGhleCBzdHJpbmcgaW50byBhICdiaW5hcnknIGVuY29kZWQgc3RyaW5nIG9mIGJ5dGVzLlxuICpcbiAqIEBwYXJhbSBoZXggdGhlIGhleGFkZWNpbWFsIHN0cmluZyB0byBjb252ZXJ0LlxuICpcbiAqIEByZXR1cm4gdGhlIGJpbmFyeS1lbmNvZGVkIHN0cmluZyBvZiBieXRlcy5cbiAqL1xudXRpbC5oZXhUb0J5dGVzID0gZnVuY3Rpb24oaGV4KSB7XG4gIC8vIFRPRE86IGRlcHJlY2F0ZTogXCJEZXByZWNhdGVkLiBVc2UgdXRpbC5iaW5hcnkuaGV4LmRlY29kZSBpbnN0ZWFkLlwiXG4gIHZhciBydmFsID0gJyc7XG4gIHZhciBpID0gMDtcbiAgaWYoaGV4Lmxlbmd0aCAmIDEgPT0gMSkge1xuICAgIC8vIG9kZCBudW1iZXIgb2YgY2hhcmFjdGVycywgY29udmVydCBmaXJzdCBjaGFyYWN0ZXIgYWxvbmVcbiAgICBpID0gMTtcbiAgICBydmFsICs9IFN0cmluZy5mcm9tQ2hhckNvZGUocGFyc2VJbnQoaGV4WzBdLCAxNikpO1xuICB9XG4gIC8vIGNvbnZlcnQgMiBjaGFyYWN0ZXJzICgxIGJ5dGUpIGF0IGEgdGltZVxuICBmb3IoOyBpIDwgaGV4Lmxlbmd0aDsgaSArPSAyKSB7XG4gICAgcnZhbCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHBhcnNlSW50KGhleC5zdWJzdHIoaSwgMiksIDE2KSk7XG4gIH1cbiAgcmV0dXJuIHJ2YWw7XG59O1xuXG4vKipcbiAqIENvbnZlcnRzIGEgJ2JpbmFyeScgZW5jb2RlZCBzdHJpbmcgb2YgYnl0ZXMgdG8gaGV4LlxuICpcbiAqIEBwYXJhbSBieXRlcyB0aGUgYnl0ZSBzdHJpbmcgdG8gY29udmVydC5cbiAqXG4gKiBAcmV0dXJuIHRoZSBzdHJpbmcgb2YgaGV4YWRlY2ltYWwgY2hhcmFjdGVycy5cbiAqL1xudXRpbC5ieXRlc1RvSGV4ID0gZnVuY3Rpb24oYnl0ZXMpIHtcbiAgLy8gVE9ETzogZGVwcmVjYXRlOiBcIkRlcHJlY2F0ZWQuIFVzZSB1dGlsLmJpbmFyeS5oZXguZW5jb2RlIGluc3RlYWQuXCJcbiAgcmV0dXJuIHV0aWwuY3JlYXRlQnVmZmVyKGJ5dGVzKS50b0hleCgpO1xufTtcblxuLyoqXG4gKiBDb252ZXJ0cyBhbiAzMi1iaXQgaW50ZWdlciB0byA0LWJpZy1lbmRpYW4gYnl0ZSBzdHJpbmcuXG4gKlxuICogQHBhcmFtIGkgdGhlIGludGVnZXIuXG4gKlxuICogQHJldHVybiB0aGUgYnl0ZSBzdHJpbmcuXG4gKi9cbnV0aWwuaW50MzJUb0J5dGVzID0gZnVuY3Rpb24oaSkge1xuICByZXR1cm4gKFxuICAgIFN0cmluZy5mcm9tQ2hhckNvZGUoaSA+PiAyNCAmIDB4RkYpICtcbiAgICBTdHJpbmcuZnJvbUNoYXJDb2RlKGkgPj4gMTYgJiAweEZGKSArXG4gICAgU3RyaW5nLmZyb21DaGFyQ29kZShpID4+IDggJiAweEZGKSArXG4gICAgU3RyaW5nLmZyb21DaGFyQ29kZShpICYgMHhGRikpO1xufTtcblxuLy8gYmFzZTY0IGNoYXJhY3RlcnMsIHJldmVyc2UgbWFwcGluZ1xudmFyIF9iYXNlNjQgPVxuICAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0nO1xudmFyIF9iYXNlNjRJZHggPSBbXG4vKjQzIC00MyA9IDAqL1xuLyonKycsICAxLCAgMiwgIDMsJy8nICovXG4gICA2MiwgLTEsIC0xLCAtMSwgNjMsXG5cbi8qJzAnLCcxJywnMicsJzMnLCc0JywnNScsJzYnLCc3JywnOCcsJzknICovXG4gICA1MiwgNTMsIDU0LCA1NSwgNTYsIDU3LCA1OCwgNTksIDYwLCA2MSxcblxuLyoxNSwgMTYsIDE3LCc9JywgMTksIDIwLCAyMSAqL1xuICAtMSwgLTEsIC0xLCA2NCwgLTEsIC0xLCAtMSxcblxuLyo2NSAtIDQzID0gMjIqL1xuLyonQScsJ0InLCdDJywnRCcsJ0UnLCdGJywnRycsJ0gnLCdJJywnSicsJ0snLCdMJywnTScsICovXG4gICAwLCAgMSwgIDIsICAzLCAgNCwgIDUsICA2LCAgNywgIDgsICA5LCAxMCwgMTEsIDEyLFxuXG4vKidOJywnTycsJ1AnLCdRJywnUicsJ1MnLCdUJywnVScsJ1YnLCdXJywnWCcsJ1knLCdaJyAqL1xuICAgMTMsIDE0LCAxNSwgMTYsIDE3LCAxOCwgMTksIDIwLCAyMSwgMjIsIDIzLCAyNCwgMjUsXG5cbi8qOTEgLSA0MyA9IDQ4ICovXG4vKjQ4LCA0OSwgNTAsIDUxLCA1MiwgNTMgKi9cbiAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSxcblxuLyo5NyAtIDQzID0gNTQqL1xuLyonYScsJ2InLCdjJywnZCcsJ2UnLCdmJywnZycsJ2gnLCdpJywnaicsJ2snLCdsJywnbScgKi9cbiAgIDI2LCAyNywgMjgsIDI5LCAzMCwgMzEsIDMyLCAzMywgMzQsIDM1LCAzNiwgMzcsIDM4LFxuXG4vKiduJywnbycsJ3AnLCdxJywncicsJ3MnLCd0JywndScsJ3YnLCd3JywneCcsJ3knLCd6JyAqL1xuICAgMzksIDQwLCA0MSwgNDIsIDQzLCA0NCwgNDUsIDQ2LCA0NywgNDgsIDQ5LCA1MCwgNTFcbl07XG5cbi8vIGJhc2U1OCBjaGFyYWN0ZXJzIChCaXRjb2luIGFscGhhYmV0KVxudmFyIF9iYXNlNTggPSAnMTIzNDU2Nzg5QUJDREVGR0hKS0xNTlBRUlNUVVZXWFlaYWJjZGVmZ2hpamttbm9wcXJzdHV2d3h5eic7XG5cbi8qKlxuICogQmFzZTY0IGVuY29kZXMgYSAnYmluYXJ5JyBlbmNvZGVkIHN0cmluZyBvZiBieXRlcy5cbiAqXG4gKiBAcGFyYW0gaW5wdXQgdGhlIGJpbmFyeSBlbmNvZGVkIHN0cmluZyBvZiBieXRlcyB0byBiYXNlNjQtZW5jb2RlLlxuICogQHBhcmFtIG1heGxpbmUgdGhlIG1heGltdW0gbnVtYmVyIG9mIGVuY29kZWQgY2hhcmFjdGVycyBwZXIgbGluZSB0byB1c2UsXG4gKiAgICAgICAgICBkZWZhdWx0cyB0byBub25lLlxuICpcbiAqIEByZXR1cm4gdGhlIGJhc2U2NC1lbmNvZGVkIG91dHB1dC5cbiAqL1xudXRpbC5lbmNvZGU2NCA9IGZ1bmN0aW9uKGlucHV0LCBtYXhsaW5lKSB7XG4gIC8vIFRPRE86IGRlcHJlY2F0ZTogXCJEZXByZWNhdGVkLiBVc2UgdXRpbC5iaW5hcnkuYmFzZTY0LmVuY29kZSBpbnN0ZWFkLlwiXG4gIHZhciBsaW5lID0gJyc7XG4gIHZhciBvdXRwdXQgPSAnJztcbiAgdmFyIGNocjEsIGNocjIsIGNocjM7XG4gIHZhciBpID0gMDtcbiAgd2hpbGUoaSA8IGlucHV0Lmxlbmd0aCkge1xuICAgIGNocjEgPSBpbnB1dC5jaGFyQ29kZUF0KGkrKyk7XG4gICAgY2hyMiA9IGlucHV0LmNoYXJDb2RlQXQoaSsrKTtcbiAgICBjaHIzID0gaW5wdXQuY2hhckNvZGVBdChpKyspO1xuXG4gICAgLy8gZW5jb2RlIDQgY2hhcmFjdGVyIGdyb3VwXG4gICAgbGluZSArPSBfYmFzZTY0LmNoYXJBdChjaHIxID4+IDIpO1xuICAgIGxpbmUgKz0gX2Jhc2U2NC5jaGFyQXQoKChjaHIxICYgMykgPDwgNCkgfCAoY2hyMiA+PiA0KSk7XG4gICAgaWYoaXNOYU4oY2hyMikpIHtcbiAgICAgIGxpbmUgKz0gJz09JztcbiAgICB9IGVsc2Uge1xuICAgICAgbGluZSArPSBfYmFzZTY0LmNoYXJBdCgoKGNocjIgJiAxNSkgPDwgMikgfCAoY2hyMyA+PiA2KSk7XG4gICAgICBsaW5lICs9IGlzTmFOKGNocjMpID8gJz0nIDogX2Jhc2U2NC5jaGFyQXQoY2hyMyAmIDYzKTtcbiAgICB9XG5cbiAgICBpZihtYXhsaW5lICYmIGxpbmUubGVuZ3RoID4gbWF4bGluZSkge1xuICAgICAgb3V0cHV0ICs9IGxpbmUuc3Vic3RyKDAsIG1heGxpbmUpICsgJ1xcclxcbic7XG4gICAgICBsaW5lID0gbGluZS5zdWJzdHIobWF4bGluZSk7XG4gICAgfVxuICB9XG4gIG91dHB1dCArPSBsaW5lO1xuICByZXR1cm4gb3V0cHV0O1xufTtcblxuLyoqXG4gKiBCYXNlNjQgZGVjb2RlcyBhIHN0cmluZyBpbnRvIGEgJ2JpbmFyeScgZW5jb2RlZCBzdHJpbmcgb2YgYnl0ZXMuXG4gKlxuICogQHBhcmFtIGlucHV0IHRoZSBiYXNlNjQtZW5jb2RlZCBpbnB1dC5cbiAqXG4gKiBAcmV0dXJuIHRoZSBiaW5hcnkgZW5jb2RlZCBzdHJpbmcuXG4gKi9cbnV0aWwuZGVjb2RlNjQgPSBmdW5jdGlvbihpbnB1dCkge1xuICAvLyBUT0RPOiBkZXByZWNhdGU6IFwiRGVwcmVjYXRlZC4gVXNlIHV0aWwuYmluYXJ5LmJhc2U2NC5kZWNvZGUgaW5zdGVhZC5cIlxuXG4gIC8vIHJlbW92ZSBhbGwgbm9uLWJhc2U2NCBjaGFyYWN0ZXJzXG4gIGlucHV0ID0gaW5wdXQucmVwbGFjZSgvW15BLVphLXowLTlcXCtcXC9cXD1dL2csICcnKTtcblxuICB2YXIgb3V0cHV0ID0gJyc7XG4gIHZhciBlbmMxLCBlbmMyLCBlbmMzLCBlbmM0O1xuICB2YXIgaSA9IDA7XG5cbiAgd2hpbGUoaSA8IGlucHV0Lmxlbmd0aCkge1xuICAgIGVuYzEgPSBfYmFzZTY0SWR4W2lucHV0LmNoYXJDb2RlQXQoaSsrKSAtIDQzXTtcbiAgICBlbmMyID0gX2Jhc2U2NElkeFtpbnB1dC5jaGFyQ29kZUF0KGkrKykgLSA0M107XG4gICAgZW5jMyA9IF9iYXNlNjRJZHhbaW5wdXQuY2hhckNvZGVBdChpKyspIC0gNDNdO1xuICAgIGVuYzQgPSBfYmFzZTY0SWR4W2lucHV0LmNoYXJDb2RlQXQoaSsrKSAtIDQzXTtcblxuICAgIG91dHB1dCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKChlbmMxIDw8IDIpIHwgKGVuYzIgPj4gNCkpO1xuICAgIGlmKGVuYzMgIT09IDY0KSB7XG4gICAgICAvLyBkZWNvZGVkIGF0IGxlYXN0IDIgYnl0ZXNcbiAgICAgIG91dHB1dCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKCgoZW5jMiAmIDE1KSA8PCA0KSB8IChlbmMzID4+IDIpKTtcbiAgICAgIGlmKGVuYzQgIT09IDY0KSB7XG4gICAgICAgIC8vIGRlY29kZWQgMyBieXRlc1xuICAgICAgICBvdXRwdXQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSgoKGVuYzMgJiAzKSA8PCA2KSB8IGVuYzQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBvdXRwdXQ7XG59O1xuXG4vKipcbiAqIEVuY29kZXMgdGhlIGdpdmVuIHN0cmluZyBvZiBjaGFyYWN0ZXJzIChhIHN0YW5kYXJkIEphdmFTY3JpcHRcbiAqIHN0cmluZykgYXMgYSBiaW5hcnkgZW5jb2RlZCBzdHJpbmcgd2hlcmUgdGhlIGJ5dGVzIHJlcHJlc2VudFxuICogYSBVVEYtOCBlbmNvZGVkIHN0cmluZyBvZiBjaGFyYWN0ZXJzLiBOb24tQVNDSUkgY2hhcmFjdGVycyB3aWxsIGJlXG4gKiBlbmNvZGVkIGFzIG11bHRpcGxlIGJ5dGVzIGFjY29yZGluZyB0byBVVEYtOC5cbiAqXG4gKiBAcGFyYW0gc3RyIGEgc3RhbmRhcmQgc3RyaW5nIG9mIGNoYXJhY3RlcnMgdG8gZW5jb2RlLlxuICpcbiAqIEByZXR1cm4gdGhlIGJpbmFyeSBlbmNvZGVkIHN0cmluZy5cbiAqL1xudXRpbC5lbmNvZGVVdGY4ID0gZnVuY3Rpb24oc3RyKSB7XG4gIHJldHVybiB1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoc3RyKSk7XG59O1xuXG4vKipcbiAqIERlY29kZXMgYSBiaW5hcnkgZW5jb2RlZCBzdHJpbmcgdGhhdCBjb250YWlucyBieXRlcyB0aGF0XG4gKiByZXByZXNlbnQgYSBVVEYtOCBlbmNvZGVkIHN0cmluZyBvZiBjaGFyYWN0ZXJzIC0tIGludG8gYVxuICogc3RyaW5nIG9mIGNoYXJhY3RlcnMgKGEgc3RhbmRhcmQgSmF2YVNjcmlwdCBzdHJpbmcpLlxuICpcbiAqIEBwYXJhbSBzdHIgdGhlIGJpbmFyeSBlbmNvZGVkIHN0cmluZyB0byBkZWNvZGUuXG4gKlxuICogQHJldHVybiB0aGUgcmVzdWx0aW5nIHN0YW5kYXJkIHN0cmluZyBvZiBjaGFyYWN0ZXJzLlxuICovXG51dGlsLmRlY29kZVV0ZjggPSBmdW5jdGlvbihzdHIpIHtcbiAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChlc2NhcGUoc3RyKSk7XG59O1xuXG4vLyBiaW5hcnkgZW5jb2RpbmcvZGVjb2RpbmcgdG9vbHNcbi8vIEZJWE1FOiBFeHBlcmltZW50YWwuIERvIG5vdCB1c2UgeWV0LlxudXRpbC5iaW5hcnkgPSB7XG4gIHJhdzoge30sXG4gIGhleDoge30sXG4gIGJhc2U2NDoge30sXG4gIGJhc2U1ODoge30sXG4gIGJhc2VOIDoge1xuICAgIGVuY29kZTogYmFzZU4uZW5jb2RlLFxuICAgIGRlY29kZTogYmFzZU4uZGVjb2RlXG4gIH1cbn07XG5cbi8qKlxuICogRW5jb2RlcyBhIFVpbnQ4QXJyYXkgYXMgYSBiaW5hcnktZW5jb2RlZCBzdHJpbmcuIFRoaXMgZW5jb2RpbmcgdXNlc1xuICogYSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDI1NSBmb3IgZWFjaCBjaGFyYWN0ZXIuXG4gKlxuICogQHBhcmFtIGJ5dGVzIHRoZSBVaW50OEFycmF5IHRvIGVuY29kZS5cbiAqXG4gKiBAcmV0dXJuIHRoZSBiaW5hcnktZW5jb2RlZCBzdHJpbmcuXG4gKi9cbnV0aWwuYmluYXJ5LnJhdy5lbmNvZGUgPSBmdW5jdGlvbihieXRlcykge1xuICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBieXRlcyk7XG59O1xuXG4vKipcbiAqIERlY29kZXMgYSBiaW5hcnktZW5jb2RlZCBzdHJpbmcgdG8gYSBVaW50OEFycmF5LiBUaGlzIGVuY29kaW5nIHVzZXNcbiAqIGEgdmFsdWUgYmV0d2VlbiAwIGFuZCAyNTUgZm9yIGVhY2ggY2hhcmFjdGVyLlxuICpcbiAqIEBwYXJhbSBzdHIgdGhlIGJpbmFyeS1lbmNvZGVkIHN0cmluZyB0byBkZWNvZGUuXG4gKiBAcGFyYW0gW291dHB1dF0gYW4gb3B0aW9uYWwgVWludDhBcnJheSB0byB3cml0ZSB0aGUgb3V0cHV0IHRvOyBpZiBpdFxuICogICAgICAgICAgaXMgdG9vIHNtYWxsLCBhbiBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24uXG4gKiBAcGFyYW0gW29mZnNldF0gdGhlIHN0YXJ0IG9mZnNldCBmb3Igd3JpdGluZyB0byB0aGUgb3V0cHV0IChkZWZhdWx0OiAwKS5cbiAqXG4gKiBAcmV0dXJuIHRoZSBVaW50OEFycmF5IG9yIHRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiBpZiBvdXRwdXQgd2FzIGdpdmVuLlxuICovXG51dGlsLmJpbmFyeS5yYXcuZGVjb2RlID0gZnVuY3Rpb24oc3RyLCBvdXRwdXQsIG9mZnNldCkge1xuICB2YXIgb3V0ID0gb3V0cHV0O1xuICBpZighb3V0KSB7XG4gICAgb3V0ID0gbmV3IFVpbnQ4QXJyYXkoc3RyLmxlbmd0aCk7XG4gIH1cbiAgb2Zmc2V0ID0gb2Zmc2V0IHx8IDA7XG4gIHZhciBqID0gb2Zmc2V0O1xuICBmb3IodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgKytpKSB7XG4gICAgb3V0W2orK10gPSBzdHIuY2hhckNvZGVBdChpKTtcbiAgfVxuICByZXR1cm4gb3V0cHV0ID8gKGogLSBvZmZzZXQpIDogb3V0O1xufTtcblxuLyoqXG4gKiBFbmNvZGVzIGEgJ2JpbmFyeScgc3RyaW5nLCBBcnJheUJ1ZmZlciwgRGF0YVZpZXcsIFR5cGVkQXJyYXksIG9yXG4gKiBCeXRlQnVmZmVyIGFzIGEgc3RyaW5nIG9mIGhleGFkZWNpbWFsIGNoYXJhY3RlcnMuXG4gKlxuICogQHBhcmFtIGJ5dGVzIHRoZSBieXRlcyB0byBjb252ZXJ0LlxuICpcbiAqIEByZXR1cm4gdGhlIHN0cmluZyBvZiBoZXhhZGVjaW1hbCBjaGFyYWN0ZXJzLlxuICovXG51dGlsLmJpbmFyeS5oZXguZW5jb2RlID0gdXRpbC5ieXRlc1RvSGV4O1xuXG4vKipcbiAqIERlY29kZXMgYSBoZXgtZW5jb2RlZCBzdHJpbmcgdG8gYSBVaW50OEFycmF5LlxuICpcbiAqIEBwYXJhbSBoZXggdGhlIGhleGFkZWNpbWFsIHN0cmluZyB0byBjb252ZXJ0LlxuICogQHBhcmFtIFtvdXRwdXRdIGFuIG9wdGlvbmFsIFVpbnQ4QXJyYXkgdG8gd3JpdGUgdGhlIG91dHB1dCB0bzsgaWYgaXRcbiAqICAgICAgICAgIGlzIHRvbyBzbWFsbCwgYW4gZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLlxuICogQHBhcmFtIFtvZmZzZXRdIHRoZSBzdGFydCBvZmZzZXQgZm9yIHdyaXRpbmcgdG8gdGhlIG91dHB1dCAoZGVmYXVsdDogMCkuXG4gKlxuICogQHJldHVybiB0aGUgVWludDhBcnJheSBvciB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gaWYgb3V0cHV0IHdhcyBnaXZlbi5cbiAqL1xudXRpbC5iaW5hcnkuaGV4LmRlY29kZSA9IGZ1bmN0aW9uKGhleCwgb3V0cHV0LCBvZmZzZXQpIHtcbiAgdmFyIG91dCA9IG91dHB1dDtcbiAgaWYoIW91dCkge1xuICAgIG91dCA9IG5ldyBVaW50OEFycmF5KE1hdGguY2VpbChoZXgubGVuZ3RoIC8gMikpO1xuICB9XG4gIG9mZnNldCA9IG9mZnNldCB8fCAwO1xuICB2YXIgaSA9IDAsIGogPSBvZmZzZXQ7XG4gIGlmKGhleC5sZW5ndGggJiAxKSB7XG4gICAgLy8gb2RkIG51bWJlciBvZiBjaGFyYWN0ZXJzLCBjb252ZXJ0IGZpcnN0IGNoYXJhY3RlciBhbG9uZVxuICAgIGkgPSAxO1xuICAgIG91dFtqKytdID0gcGFyc2VJbnQoaGV4WzBdLCAxNik7XG4gIH1cbiAgLy8gY29udmVydCAyIGNoYXJhY3RlcnMgKDEgYnl0ZSkgYXQgYSB0aW1lXG4gIGZvcig7IGkgPCBoZXgubGVuZ3RoOyBpICs9IDIpIHtcbiAgICBvdXRbaisrXSA9IHBhcnNlSW50KGhleC5zdWJzdHIoaSwgMiksIDE2KTtcbiAgfVxuICByZXR1cm4gb3V0cHV0ID8gKGogLSBvZmZzZXQpIDogb3V0O1xufTtcblxuLyoqXG4gKiBCYXNlNjQtZW5jb2RlcyBhIFVpbnQ4QXJyYXkuXG4gKlxuICogQHBhcmFtIGlucHV0IHRoZSBVaW50OEFycmF5IHRvIGVuY29kZS5cbiAqIEBwYXJhbSBtYXhsaW5lIHRoZSBtYXhpbXVtIG51bWJlciBvZiBlbmNvZGVkIGNoYXJhY3RlcnMgcGVyIGxpbmUgdG8gdXNlLFxuICogICAgICAgICAgZGVmYXVsdHMgdG8gbm9uZS5cbiAqXG4gKiBAcmV0dXJuIHRoZSBiYXNlNjQtZW5jb2RlZCBvdXRwdXQgc3RyaW5nLlxuICovXG51dGlsLmJpbmFyeS5iYXNlNjQuZW5jb2RlID0gZnVuY3Rpb24oaW5wdXQsIG1heGxpbmUpIHtcbiAgdmFyIGxpbmUgPSAnJztcbiAgdmFyIG91dHB1dCA9ICcnO1xuICB2YXIgY2hyMSwgY2hyMiwgY2hyMztcbiAgdmFyIGkgPSAwO1xuICB3aGlsZShpIDwgaW5wdXQuYnl0ZUxlbmd0aCkge1xuICAgIGNocjEgPSBpbnB1dFtpKytdO1xuICAgIGNocjIgPSBpbnB1dFtpKytdO1xuICAgIGNocjMgPSBpbnB1dFtpKytdO1xuXG4gICAgLy8gZW5jb2RlIDQgY2hhcmFjdGVyIGdyb3VwXG4gICAgbGluZSArPSBfYmFzZTY0LmNoYXJBdChjaHIxID4+IDIpO1xuICAgIGxpbmUgKz0gX2Jhc2U2NC5jaGFyQXQoKChjaHIxICYgMykgPDwgNCkgfCAoY2hyMiA+PiA0KSk7XG4gICAgaWYoaXNOYU4oY2hyMikpIHtcbiAgICAgIGxpbmUgKz0gJz09JztcbiAgICB9IGVsc2Uge1xuICAgICAgbGluZSArPSBfYmFzZTY0LmNoYXJBdCgoKGNocjIgJiAxNSkgPDwgMikgfCAoY2hyMyA+PiA2KSk7XG4gICAgICBsaW5lICs9IGlzTmFOKGNocjMpID8gJz0nIDogX2Jhc2U2NC5jaGFyQXQoY2hyMyAmIDYzKTtcbiAgICB9XG5cbiAgICBpZihtYXhsaW5lICYmIGxpbmUubGVuZ3RoID4gbWF4bGluZSkge1xuICAgICAgb3V0cHV0ICs9IGxpbmUuc3Vic3RyKDAsIG1heGxpbmUpICsgJ1xcclxcbic7XG4gICAgICBsaW5lID0gbGluZS5zdWJzdHIobWF4bGluZSk7XG4gICAgfVxuICB9XG4gIG91dHB1dCArPSBsaW5lO1xuICByZXR1cm4gb3V0cHV0O1xufTtcblxuLyoqXG4gKiBEZWNvZGVzIGEgYmFzZTY0LWVuY29kZWQgc3RyaW5nIHRvIGEgVWludDhBcnJheS5cbiAqXG4gKiBAcGFyYW0gaW5wdXQgdGhlIGJhc2U2NC1lbmNvZGVkIGlucHV0IHN0cmluZy5cbiAqIEBwYXJhbSBbb3V0cHV0XSBhbiBvcHRpb25hbCBVaW50OEFycmF5IHRvIHdyaXRlIHRoZSBvdXRwdXQgdG87IGlmIGl0XG4gKiAgICAgICAgICBpcyB0b28gc21hbGwsIGFuIGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi5cbiAqIEBwYXJhbSBbb2Zmc2V0XSB0aGUgc3RhcnQgb2Zmc2V0IGZvciB3cml0aW5nIHRvIHRoZSBvdXRwdXQgKGRlZmF1bHQ6IDApLlxuICpcbiAqIEByZXR1cm4gdGhlIFVpbnQ4QXJyYXkgb3IgdGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuIGlmIG91dHB1dCB3YXMgZ2l2ZW4uXG4gKi9cbnV0aWwuYmluYXJ5LmJhc2U2NC5kZWNvZGUgPSBmdW5jdGlvbihpbnB1dCwgb3V0cHV0LCBvZmZzZXQpIHtcbiAgdmFyIG91dCA9IG91dHB1dDtcbiAgaWYoIW91dCkge1xuICAgIG91dCA9IG5ldyBVaW50OEFycmF5KE1hdGguY2VpbChpbnB1dC5sZW5ndGggLyA0KSAqIDMpO1xuICB9XG5cbiAgLy8gcmVtb3ZlIGFsbCBub24tYmFzZTY0IGNoYXJhY3RlcnNcbiAgaW5wdXQgPSBpbnB1dC5yZXBsYWNlKC9bXkEtWmEtejAtOVxcK1xcL1xcPV0vZywgJycpO1xuXG4gIG9mZnNldCA9IG9mZnNldCB8fCAwO1xuICB2YXIgZW5jMSwgZW5jMiwgZW5jMywgZW5jNDtcbiAgdmFyIGkgPSAwLCBqID0gb2Zmc2V0O1xuXG4gIHdoaWxlKGkgPCBpbnB1dC5sZW5ndGgpIHtcbiAgICBlbmMxID0gX2Jhc2U2NElkeFtpbnB1dC5jaGFyQ29kZUF0KGkrKykgLSA0M107XG4gICAgZW5jMiA9IF9iYXNlNjRJZHhbaW5wdXQuY2hhckNvZGVBdChpKyspIC0gNDNdO1xuICAgIGVuYzMgPSBfYmFzZTY0SWR4W2lucHV0LmNoYXJDb2RlQXQoaSsrKSAtIDQzXTtcbiAgICBlbmM0ID0gX2Jhc2U2NElkeFtpbnB1dC5jaGFyQ29kZUF0KGkrKykgLSA0M107XG5cbiAgICBvdXRbaisrXSA9IChlbmMxIDw8IDIpIHwgKGVuYzIgPj4gNCk7XG4gICAgaWYoZW5jMyAhPT0gNjQpIHtcbiAgICAgIC8vIGRlY29kZWQgYXQgbGVhc3QgMiBieXRlc1xuICAgICAgb3V0W2orK10gPSAoKGVuYzIgJiAxNSkgPDwgNCkgfCAoZW5jMyA+PiAyKTtcbiAgICAgIGlmKGVuYzQgIT09IDY0KSB7XG4gICAgICAgIC8vIGRlY29kZWQgMyBieXRlc1xuICAgICAgICBvdXRbaisrXSA9ICgoZW5jMyAmIDMpIDw8IDYpIHwgZW5jNDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBtYWtlIHN1cmUgcmVzdWx0IGlzIHRoZSBleGFjdCBkZWNvZGVkIGxlbmd0aFxuICByZXR1cm4gb3V0cHV0ID8gKGogLSBvZmZzZXQpIDogb3V0LnN1YmFycmF5KDAsIGopO1xufTtcblxuLy8gYWRkIHN1cHBvcnQgZm9yIGJhc2U1OCBlbmNvZGluZy9kZWNvZGluZyB3aXRoIEJpdGNvaW4gYWxwaGFiZXRcbnV0aWwuYmluYXJ5LmJhc2U1OC5lbmNvZGUgPSBmdW5jdGlvbihpbnB1dCwgbWF4bGluZSkge1xuICByZXR1cm4gdXRpbC5iaW5hcnkuYmFzZU4uZW5jb2RlKGlucHV0LCBfYmFzZTU4LCBtYXhsaW5lKTtcbn07XG51dGlsLmJpbmFyeS5iYXNlNTguZGVjb2RlID0gZnVuY3Rpb24oaW5wdXQsIG1heGxpbmUpIHtcbiAgcmV0dXJuIHV0aWwuYmluYXJ5LmJhc2VOLmRlY29kZShpbnB1dCwgX2Jhc2U1OCwgbWF4bGluZSk7XG59O1xuXG4vLyB0ZXh0IGVuY29kaW5nL2RlY29kaW5nIHRvb2xzXG4vLyBGSVhNRTogRXhwZXJpbWVudGFsLiBEbyBub3QgdXNlIHlldC5cbnV0aWwudGV4dCA9IHtcbiAgdXRmODoge30sXG4gIHV0ZjE2OiB7fVxufTtcblxuLyoqXG4gKiBFbmNvZGVzIHRoZSBnaXZlbiBzdHJpbmcgYXMgVVRGLTggaW4gYSBVaW50OEFycmF5LlxuICpcbiAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZyB0byBlbmNvZGUuXG4gKiBAcGFyYW0gW291dHB1dF0gYW4gb3B0aW9uYWwgVWludDhBcnJheSB0byB3cml0ZSB0aGUgb3V0cHV0IHRvOyBpZiBpdFxuICogICAgICAgICAgaXMgdG9vIHNtYWxsLCBhbiBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24uXG4gKiBAcGFyYW0gW29mZnNldF0gdGhlIHN0YXJ0IG9mZnNldCBmb3Igd3JpdGluZyB0byB0aGUgb3V0cHV0IChkZWZhdWx0OiAwKS5cbiAqXG4gKiBAcmV0dXJuIHRoZSBVaW50OEFycmF5IG9yIHRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiBpZiBvdXRwdXQgd2FzIGdpdmVuLlxuICovXG51dGlsLnRleHQudXRmOC5lbmNvZGUgPSBmdW5jdGlvbihzdHIsIG91dHB1dCwgb2Zmc2V0KSB7XG4gIHN0ciA9IHV0aWwuZW5jb2RlVXRmOChzdHIpO1xuICB2YXIgb3V0ID0gb3V0cHV0O1xuICBpZighb3V0KSB7XG4gICAgb3V0ID0gbmV3IFVpbnQ4QXJyYXkoc3RyLmxlbmd0aCk7XG4gIH1cbiAgb2Zmc2V0ID0gb2Zmc2V0IHx8IDA7XG4gIHZhciBqID0gb2Zmc2V0O1xuICBmb3IodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgKytpKSB7XG4gICAgb3V0W2orK10gPSBzdHIuY2hhckNvZGVBdChpKTtcbiAgfVxuICByZXR1cm4gb3V0cHV0ID8gKGogLSBvZmZzZXQpIDogb3V0O1xufTtcblxuLyoqXG4gKiBEZWNvZGVzIHRoZSBVVEYtOCBjb250ZW50cyBmcm9tIGEgVWludDhBcnJheS5cbiAqXG4gKiBAcGFyYW0gYnl0ZXMgdGhlIFVpbnQ4QXJyYXkgdG8gZGVjb2RlLlxuICpcbiAqIEByZXR1cm4gdGhlIHJlc3VsdGluZyBzdHJpbmcuXG4gKi9cbnV0aWwudGV4dC51dGY4LmRlY29kZSA9IGZ1bmN0aW9uKGJ5dGVzKSB7XG4gIHJldHVybiB1dGlsLmRlY29kZVV0ZjgoU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBieXRlcykpO1xufTtcblxuLyoqXG4gKiBFbmNvZGVzIHRoZSBnaXZlbiBzdHJpbmcgYXMgVVRGLTE2IGluIGEgVWludDhBcnJheS5cbiAqXG4gKiBAcGFyYW0gc3RyIHRoZSBzdHJpbmcgdG8gZW5jb2RlLlxuICogQHBhcmFtIFtvdXRwdXRdIGFuIG9wdGlvbmFsIFVpbnQ4QXJyYXkgdG8gd3JpdGUgdGhlIG91dHB1dCB0bzsgaWYgaXRcbiAqICAgICAgICAgIGlzIHRvbyBzbWFsbCwgYW4gZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLlxuICogQHBhcmFtIFtvZmZzZXRdIHRoZSBzdGFydCBvZmZzZXQgZm9yIHdyaXRpbmcgdG8gdGhlIG91dHB1dCAoZGVmYXVsdDogMCkuXG4gKlxuICogQHJldHVybiB0aGUgVWludDhBcnJheSBvciB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gaWYgb3V0cHV0IHdhcyBnaXZlbi5cbiAqL1xudXRpbC50ZXh0LnV0ZjE2LmVuY29kZSA9IGZ1bmN0aW9uKHN0ciwgb3V0cHV0LCBvZmZzZXQpIHtcbiAgdmFyIG91dCA9IG91dHB1dDtcbiAgaWYoIW91dCkge1xuICAgIG91dCA9IG5ldyBVaW50OEFycmF5KHN0ci5sZW5ndGggKiAyKTtcbiAgfVxuICB2YXIgdmlldyA9IG5ldyBVaW50MTZBcnJheShvdXQuYnVmZmVyKTtcbiAgb2Zmc2V0ID0gb2Zmc2V0IHx8IDA7XG4gIHZhciBqID0gb2Zmc2V0O1xuICB2YXIgayA9IG9mZnNldDtcbiAgZm9yKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7ICsraSkge1xuICAgIHZpZXdbaysrXSA9IHN0ci5jaGFyQ29kZUF0KGkpO1xuICAgIGogKz0gMjtcbiAgfVxuICByZXR1cm4gb3V0cHV0ID8gKGogLSBvZmZzZXQpIDogb3V0O1xufTtcblxuLyoqXG4gKiBEZWNvZGVzIHRoZSBVVEYtMTYgY29udGVudHMgZnJvbSBhIFVpbnQ4QXJyYXkuXG4gKlxuICogQHBhcmFtIGJ5dGVzIHRoZSBVaW50OEFycmF5IHRvIGRlY29kZS5cbiAqXG4gKiBAcmV0dXJuIHRoZSByZXN1bHRpbmcgc3RyaW5nLlxuICovXG51dGlsLnRleHQudXRmMTYuZGVjb2RlID0gZnVuY3Rpb24oYnl0ZXMpIHtcbiAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgbmV3IFVpbnQxNkFycmF5KGJ5dGVzLmJ1ZmZlcikpO1xufTtcblxuLyoqXG4gKiBEZWZsYXRlcyB0aGUgZ2l2ZW4gZGF0YSB1c2luZyBhIGZsYXNoIGludGVyZmFjZS5cbiAqXG4gKiBAcGFyYW0gYXBpIHRoZSBmbGFzaCBpbnRlcmZhY2UuXG4gKiBAcGFyYW0gYnl0ZXMgdGhlIGRhdGEuXG4gKiBAcGFyYW0gcmF3IHRydWUgdG8gcmV0dXJuIG9ubHkgcmF3IGRlZmxhdGUgZGF0YSwgZmFsc2UgdG8gaW5jbHVkZSB6bGliXG4gKiAgICAgICAgICBoZWFkZXIgYW5kIHRyYWlsZXIuXG4gKlxuICogQHJldHVybiB0aGUgZGVmbGF0ZWQgZGF0YSBhcyBhIHN0cmluZy5cbiAqL1xudXRpbC5kZWZsYXRlID0gZnVuY3Rpb24oYXBpLCBieXRlcywgcmF3KSB7XG4gIGJ5dGVzID0gdXRpbC5kZWNvZGU2NChhcGkuZGVmbGF0ZSh1dGlsLmVuY29kZTY0KGJ5dGVzKSkucnZhbCk7XG5cbiAgLy8gc3RyaXAgemxpYiBoZWFkZXIgYW5kIHRyYWlsZXIgaWYgbmVjZXNzYXJ5XG4gIGlmKHJhdykge1xuICAgIC8vIHpsaWIgaGVhZGVyIGlzIDIgYnl0ZXMgKENNRixGTEcpIHdoZXJlIEZMRyBpbmRpY2F0ZXMgdGhhdFxuICAgIC8vIHRoZXJlIGlzIGEgNC1ieXRlIERJQ1QgKGFsZGVyLTMyKSBibG9jayBiZWZvcmUgdGhlIGRhdGEgaWZcbiAgICAvLyBpdHMgNXRoIGJpdCBpcyBzZXRcbiAgICB2YXIgc3RhcnQgPSAyO1xuICAgIHZhciBmbGcgPSBieXRlcy5jaGFyQ29kZUF0KDEpO1xuICAgIGlmKGZsZyAmIDB4MjApIHtcbiAgICAgIHN0YXJ0ID0gNjtcbiAgICB9XG4gICAgLy8gemxpYiB0cmFpbGVyIGlzIDQgYnl0ZXMgb2YgYWRsZXItMzJcbiAgICBieXRlcyA9IGJ5dGVzLnN1YnN0cmluZyhzdGFydCwgYnl0ZXMubGVuZ3RoIC0gNCk7XG4gIH1cblxuICByZXR1cm4gYnl0ZXM7XG59O1xuXG4vKipcbiAqIEluZmxhdGVzIHRoZSBnaXZlbiBkYXRhIHVzaW5nIGEgZmxhc2ggaW50ZXJmYWNlLlxuICpcbiAqIEBwYXJhbSBhcGkgdGhlIGZsYXNoIGludGVyZmFjZS5cbiAqIEBwYXJhbSBieXRlcyB0aGUgZGF0YS5cbiAqIEBwYXJhbSByYXcgdHJ1ZSBpZiB0aGUgaW5jb21pbmcgZGF0YSBoYXMgbm8gemxpYiBoZWFkZXIgb3IgdHJhaWxlciBhbmQgaXNcbiAqICAgICAgICAgIHJhdyBERUZMQVRFIGRhdGEuXG4gKlxuICogQHJldHVybiB0aGUgaW5mbGF0ZWQgZGF0YSBhcyBhIHN0cmluZywgbnVsbCBvbiBlcnJvci5cbiAqL1xudXRpbC5pbmZsYXRlID0gZnVuY3Rpb24oYXBpLCBieXRlcywgcmF3KSB7XG4gIC8vIFRPRE86IGFkZCB6bGliIGhlYWRlciBhbmQgdHJhaWxlciBpZiBuZWNlc3NhcnkvcG9zc2libGVcbiAgdmFyIHJ2YWwgPSBhcGkuaW5mbGF0ZSh1dGlsLmVuY29kZTY0KGJ5dGVzKSkucnZhbDtcbiAgcmV0dXJuIChydmFsID09PSBudWxsKSA/IG51bGwgOiB1dGlsLmRlY29kZTY0KHJ2YWwpO1xufTtcblxuLyoqXG4gKiBTZXRzIGEgc3RvcmFnZSBvYmplY3QuXG4gKlxuICogQHBhcmFtIGFwaSB0aGUgc3RvcmFnZSBpbnRlcmZhY2UuXG4gKiBAcGFyYW0gaWQgdGhlIHN0b3JhZ2UgSUQgdG8gdXNlLlxuICogQHBhcmFtIG9iaiB0aGUgc3RvcmFnZSBvYmplY3QsIG51bGwgdG8gcmVtb3ZlLlxuICovXG52YXIgX3NldFN0b3JhZ2VPYmplY3QgPSBmdW5jdGlvbihhcGksIGlkLCBvYmopIHtcbiAgaWYoIWFwaSkge1xuICAgIHRocm93IG5ldyBFcnJvcignV2ViU3RvcmFnZSBub3QgYXZhaWxhYmxlLicpO1xuICB9XG5cbiAgdmFyIHJ2YWw7XG4gIGlmKG9iaiA9PT0gbnVsbCkge1xuICAgIHJ2YWwgPSBhcGkucmVtb3ZlSXRlbShpZCk7XG4gIH0gZWxzZSB7XG4gICAgLy8ganNvbi1lbmNvZGUgYW5kIGJhc2U2NC1lbmNvZGUgb2JqZWN0XG4gICAgb2JqID0gdXRpbC5lbmNvZGU2NChKU09OLnN0cmluZ2lmeShvYmopKTtcbiAgICBydmFsID0gYXBpLnNldEl0ZW0oaWQsIG9iaik7XG4gIH1cblxuICAvLyBoYW5kbGUgcG90ZW50aWFsIGZsYXNoIGVycm9yXG4gIGlmKHR5cGVvZihydmFsKSAhPT0gJ3VuZGVmaW5lZCcgJiYgcnZhbC5ydmFsICE9PSB0cnVlKSB7XG4gICAgdmFyIGVycm9yID0gbmV3IEVycm9yKHJ2YWwuZXJyb3IubWVzc2FnZSk7XG4gICAgZXJyb3IuaWQgPSBydmFsLmVycm9yLmlkO1xuICAgIGVycm9yLm5hbWUgPSBydmFsLmVycm9yLm5hbWU7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn07XG5cbi8qKlxuICogR2V0cyBhIHN0b3JhZ2Ugb2JqZWN0LlxuICpcbiAqIEBwYXJhbSBhcGkgdGhlIHN0b3JhZ2UgaW50ZXJmYWNlLlxuICogQHBhcmFtIGlkIHRoZSBzdG9yYWdlIElEIHRvIHVzZS5cbiAqXG4gKiBAcmV0dXJuIHRoZSBzdG9yYWdlIG9iamVjdCBlbnRyeSBvciBudWxsIGlmIG5vbmUgZXhpc3RzLlxuICovXG52YXIgX2dldFN0b3JhZ2VPYmplY3QgPSBmdW5jdGlvbihhcGksIGlkKSB7XG4gIGlmKCFhcGkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1dlYlN0b3JhZ2Ugbm90IGF2YWlsYWJsZS4nKTtcbiAgfVxuXG4gIC8vIGdldCB0aGUgZXhpc3RpbmcgZW50cnlcbiAgdmFyIHJ2YWwgPSBhcGkuZ2V0SXRlbShpZCk7XG5cbiAgLyogTm90ZTogV2UgY2hlY2sgYXBpLmluaXQgYmVjYXVzZSB3ZSBjYW4ndCBkbyAoYXBpID09IGxvY2FsU3RvcmFnZSlcbiAgICBvbiBJRSBiZWNhdXNlIG9mIFwiQ2xhc3MgZG9lc24ndCBzdXBwb3J0IEF1dG9tYXRpb25cIiBleGNlcHRpb24uIE9ubHlcbiAgICB0aGUgZmxhc2ggYXBpIGhhcyBhbiBpbml0IG1ldGhvZCBzbyB0aGlzIHdvcmtzIHRvbywgYnV0IHdlIG5lZWQgYVxuICAgIGJldHRlciBzb2x1dGlvbiBpbiB0aGUgZnV0dXJlLiAqL1xuXG4gIC8vIGZsYXNoIHJldHVybnMgaXRlbSB3cmFwcGVkIGluIGFuIG9iamVjdCwgaGFuZGxlIHNwZWNpYWwgY2FzZVxuICBpZihhcGkuaW5pdCkge1xuICAgIGlmKHJ2YWwucnZhbCA9PT0gbnVsbCkge1xuICAgICAgaWYocnZhbC5lcnJvcikge1xuICAgICAgICB2YXIgZXJyb3IgPSBuZXcgRXJyb3IocnZhbC5lcnJvci5tZXNzYWdlKTtcbiAgICAgICAgZXJyb3IuaWQgPSBydmFsLmVycm9yLmlkO1xuICAgICAgICBlcnJvci5uYW1lID0gcnZhbC5lcnJvci5uYW1lO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIC8vIG5vIGVycm9yLCBidXQgYWxzbyBubyBpdGVtXG4gICAgICBydmFsID0gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgcnZhbCA9IHJ2YWwucnZhbDtcbiAgICB9XG4gIH1cblxuICAvLyBoYW5kbGUgZGVjb2RpbmdcbiAgaWYocnZhbCAhPT0gbnVsbCkge1xuICAgIC8vIGJhc2U2NC1kZWNvZGUgYW5kIGpzb24tZGVjb2RlIGRhdGFcbiAgICBydmFsID0gSlNPTi5wYXJzZSh1dGlsLmRlY29kZTY0KHJ2YWwpKTtcbiAgfVxuXG4gIHJldHVybiBydmFsO1xufTtcblxuLyoqXG4gKiBTdG9yZXMgYW4gaXRlbSBpbiBsb2NhbCBzdG9yYWdlLlxuICpcbiAqIEBwYXJhbSBhcGkgdGhlIHN0b3JhZ2UgaW50ZXJmYWNlLlxuICogQHBhcmFtIGlkIHRoZSBzdG9yYWdlIElEIHRvIHVzZS5cbiAqIEBwYXJhbSBrZXkgdGhlIGtleSBmb3IgdGhlIGl0ZW0uXG4gKiBAcGFyYW0gZGF0YSB0aGUgZGF0YSBmb3IgdGhlIGl0ZW0gKGFueSBqYXZhc2NyaXB0IG9iamVjdC9wcmltaXRpdmUpLlxuICovXG52YXIgX3NldEl0ZW0gPSBmdW5jdGlvbihhcGksIGlkLCBrZXksIGRhdGEpIHtcbiAgLy8gZ2V0IHN0b3JhZ2Ugb2JqZWN0XG4gIHZhciBvYmogPSBfZ2V0U3RvcmFnZU9iamVjdChhcGksIGlkKTtcbiAgaWYob2JqID09PSBudWxsKSB7XG4gICAgLy8gY3JlYXRlIGEgbmV3IHN0b3JhZ2Ugb2JqZWN0XG4gICAgb2JqID0ge307XG4gIH1cbiAgLy8gdXBkYXRlIGtleVxuICBvYmpba2V5XSA9IGRhdGE7XG5cbiAgLy8gc2V0IHN0b3JhZ2Ugb2JqZWN0XG4gIF9zZXRTdG9yYWdlT2JqZWN0KGFwaSwgaWQsIG9iaik7XG59O1xuXG4vKipcbiAqIEdldHMgYW4gaXRlbSBmcm9tIGxvY2FsIHN0b3JhZ2UuXG4gKlxuICogQHBhcmFtIGFwaSB0aGUgc3RvcmFnZSBpbnRlcmZhY2UuXG4gKiBAcGFyYW0gaWQgdGhlIHN0b3JhZ2UgSUQgdG8gdXNlLlxuICogQHBhcmFtIGtleSB0aGUga2V5IGZvciB0aGUgaXRlbS5cbiAqXG4gKiBAcmV0dXJuIHRoZSBpdGVtLlxuICovXG52YXIgX2dldEl0ZW0gPSBmdW5jdGlvbihhcGksIGlkLCBrZXkpIHtcbiAgLy8gZ2V0IHN0b3JhZ2Ugb2JqZWN0XG4gIHZhciBydmFsID0gX2dldFN0b3JhZ2VPYmplY3QoYXBpLCBpZCk7XG4gIGlmKHJ2YWwgIT09IG51bGwpIHtcbiAgICAvLyByZXR1cm4gZGF0YSBhdCBrZXlcbiAgICBydmFsID0gKGtleSBpbiBydmFsKSA/IHJ2YWxba2V5XSA6IG51bGw7XG4gIH1cblxuICByZXR1cm4gcnZhbDtcbn07XG5cbi8qKlxuICogUmVtb3ZlcyBhbiBpdGVtIGZyb20gbG9jYWwgc3RvcmFnZS5cbiAqXG4gKiBAcGFyYW0gYXBpIHRoZSBzdG9yYWdlIGludGVyZmFjZS5cbiAqIEBwYXJhbSBpZCB0aGUgc3RvcmFnZSBJRCB0byB1c2UuXG4gKiBAcGFyYW0ga2V5IHRoZSBrZXkgZm9yIHRoZSBpdGVtLlxuICovXG52YXIgX3JlbW92ZUl0ZW0gPSBmdW5jdGlvbihhcGksIGlkLCBrZXkpIHtcbiAgLy8gZ2V0IHN0b3JhZ2Ugb2JqZWN0XG4gIHZhciBvYmogPSBfZ2V0U3RvcmFnZU9iamVjdChhcGksIGlkKTtcbiAgaWYob2JqICE9PSBudWxsICYmIGtleSBpbiBvYmopIHtcbiAgICAvLyByZW1vdmUga2V5XG4gICAgZGVsZXRlIG9ialtrZXldO1xuXG4gICAgLy8gc2VlIGlmIGVudHJ5IGhhcyBubyBrZXlzIHJlbWFpbmluZ1xuICAgIHZhciBlbXB0eSA9IHRydWU7XG4gICAgZm9yKHZhciBwcm9wIGluIG9iaikge1xuICAgICAgZW1wdHkgPSBmYWxzZTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBpZihlbXB0eSkge1xuICAgICAgLy8gcmVtb3ZlIGVudHJ5IGVudGlyZWx5IGlmIG5vIGtleXMgYXJlIGxlZnRcbiAgICAgIG9iaiA9IG51bGw7XG4gICAgfVxuXG4gICAgLy8gc2V0IHN0b3JhZ2Ugb2JqZWN0XG4gICAgX3NldFN0b3JhZ2VPYmplY3QoYXBpLCBpZCwgb2JqKTtcbiAgfVxufTtcblxuLyoqXG4gKiBDbGVhcnMgdGhlIGxvY2FsIGRpc2sgc3RvcmFnZSBpZGVudGlmaWVkIGJ5IHRoZSBnaXZlbiBJRC5cbiAqXG4gKiBAcGFyYW0gYXBpIHRoZSBzdG9yYWdlIGludGVyZmFjZS5cbiAqIEBwYXJhbSBpZCB0aGUgc3RvcmFnZSBJRCB0byB1c2UuXG4gKi9cbnZhciBfY2xlYXJJdGVtcyA9IGZ1bmN0aW9uKGFwaSwgaWQpIHtcbiAgX3NldFN0b3JhZ2VPYmplY3QoYXBpLCBpZCwgbnVsbCk7XG59O1xuXG4vKipcbiAqIENhbGxzIGEgc3RvcmFnZSBmdW5jdGlvbi5cbiAqXG4gKiBAcGFyYW0gZnVuYyB0aGUgZnVuY3Rpb24gdG8gY2FsbC5cbiAqIEBwYXJhbSBhcmdzIHRoZSBhcmd1bWVudHMgZm9yIHRoZSBmdW5jdGlvbi5cbiAqIEBwYXJhbSBsb2NhdGlvbiB0aGUgbG9jYXRpb24gYXJndW1lbnQuXG4gKlxuICogQHJldHVybiB0aGUgcmV0dXJuIHZhbHVlIGZyb20gdGhlIGZ1bmN0aW9uLlxuICovXG52YXIgX2NhbGxTdG9yYWdlRnVuY3Rpb24gPSBmdW5jdGlvbihmdW5jLCBhcmdzLCBsb2NhdGlvbikge1xuICB2YXIgcnZhbCA9IG51bGw7XG5cbiAgLy8gZGVmYXVsdCBzdG9yYWdlIHR5cGVzXG4gIGlmKHR5cGVvZihsb2NhdGlvbikgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgbG9jYXRpb24gPSBbJ3dlYicsICdmbGFzaCddO1xuICB9XG5cbiAgLy8gYXBwbHkgc3RvcmFnZSB0eXBlcyBpbiBvcmRlciBvZiBwcmVmZXJlbmNlXG4gIHZhciB0eXBlO1xuICB2YXIgZG9uZSA9IGZhbHNlO1xuICB2YXIgZXhjZXB0aW9uID0gbnVsbDtcbiAgZm9yKHZhciBpZHggaW4gbG9jYXRpb24pIHtcbiAgICB0eXBlID0gbG9jYXRpb25baWR4XTtcbiAgICB0cnkge1xuICAgICAgaWYodHlwZSA9PT0gJ2ZsYXNoJyB8fCB0eXBlID09PSAnYm90aCcpIHtcbiAgICAgICAgaWYoYXJnc1swXSA9PT0gbnVsbCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRmxhc2ggbG9jYWwgc3RvcmFnZSBub3QgYXZhaWxhYmxlLicpO1xuICAgICAgICB9XG4gICAgICAgIHJ2YWwgPSBmdW5jLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgICAgICBkb25lID0gKHR5cGUgPT09ICdmbGFzaCcpO1xuICAgICAgfVxuICAgICAgaWYodHlwZSA9PT0gJ3dlYicgfHwgdHlwZSA9PT0gJ2JvdGgnKSB7XG4gICAgICAgIGFyZ3NbMF0gPSBsb2NhbFN0b3JhZ2U7XG4gICAgICAgIHJ2YWwgPSBmdW5jLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgICAgICBkb25lID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IGNhdGNoKGV4KSB7XG4gICAgICBleGNlcHRpb24gPSBleDtcbiAgICB9XG4gICAgaWYoZG9uZSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgaWYoIWRvbmUpIHtcbiAgICB0aHJvdyBleGNlcHRpb247XG4gIH1cblxuICByZXR1cm4gcnZhbDtcbn07XG5cbi8qKlxuICogU3RvcmVzIGFuIGl0ZW0gb24gbG9jYWwgZGlzay5cbiAqXG4gKiBUaGUgYXZhaWxhYmxlIHR5cGVzIG9mIGxvY2FsIHN0b3JhZ2UgaW5jbHVkZSAnZmxhc2gnLCAnd2ViJywgYW5kICdib3RoJy5cbiAqXG4gKiBUaGUgdHlwZSAnZmxhc2gnIHJlZmVycyB0byBmbGFzaCBsb2NhbCBzdG9yYWdlIChTaGFyZWRPYmplY3QpLiBJbiBvcmRlclxuICogdG8gdXNlIGZsYXNoIGxvY2FsIHN0b3JhZ2UsIHRoZSAnYXBpJyBwYXJhbWV0ZXIgbXVzdCBiZSB2YWxpZC4gVGhlIHR5cGVcbiAqICd3ZWInIHJlZmVycyB0byBXZWJTdG9yYWdlLCBpZiBzdXBwb3J0ZWQgYnkgdGhlIGJyb3dzZXIuIFRoZSB0eXBlICdib3RoJ1xuICogcmVmZXJzIHRvIHN0b3JpbmcgdXNpbmcgYm90aCAnZmxhc2gnIGFuZCAnd2ViJywgbm90IGp1c3Qgb25lIG9yIHRoZVxuICogb3RoZXIuXG4gKlxuICogVGhlIGxvY2F0aW9uIGFycmF5IHNob3VsZCBsaXN0IHRoZSBzdG9yYWdlIHR5cGVzIHRvIHVzZSBpbiBvcmRlciBvZlxuICogcHJlZmVyZW5jZTpcbiAqXG4gKiBbJ2ZsYXNoJ106IGZsYXNoIG9ubHkgc3RvcmFnZVxuICogWyd3ZWInXTogd2ViIG9ubHkgc3RvcmFnZVxuICogWydib3RoJ106IHRyeSB0byBzdG9yZSBpbiBib3RoXG4gKiBbJ2ZsYXNoJywnd2ViJ106IHN0b3JlIGluIGZsYXNoIGZpcnN0LCBidXQgaWYgbm90IGF2YWlsYWJsZSwgJ3dlYidcbiAqIFsnd2ViJywnZmxhc2gnXTogc3RvcmUgaW4gd2ViIGZpcnN0LCBidXQgaWYgbm90IGF2YWlsYWJsZSwgJ2ZsYXNoJ1xuICpcbiAqIFRoZSBsb2NhdGlvbiBhcnJheSBkZWZhdWx0cyB0bzogWyd3ZWInLCAnZmxhc2gnXVxuICpcbiAqIEBwYXJhbSBhcGkgdGhlIGZsYXNoIGludGVyZmFjZSwgbnVsbCB0byB1c2Ugb25seSBXZWJTdG9yYWdlLlxuICogQHBhcmFtIGlkIHRoZSBzdG9yYWdlIElEIHRvIHVzZS5cbiAqIEBwYXJhbSBrZXkgdGhlIGtleSBmb3IgdGhlIGl0ZW0uXG4gKiBAcGFyYW0gZGF0YSB0aGUgZGF0YSBmb3IgdGhlIGl0ZW0gKGFueSBqYXZhc2NyaXB0IG9iamVjdC9wcmltaXRpdmUpLlxuICogQHBhcmFtIGxvY2F0aW9uIGFuIGFycmF5IHdpdGggdGhlIHByZWZlcnJlZCB0eXBlcyBvZiBzdG9yYWdlIHRvIHVzZS5cbiAqL1xudXRpbC5zZXRJdGVtID0gZnVuY3Rpb24oYXBpLCBpZCwga2V5LCBkYXRhLCBsb2NhdGlvbikge1xuICBfY2FsbFN0b3JhZ2VGdW5jdGlvbihfc2V0SXRlbSwgYXJndW1lbnRzLCBsb2NhdGlvbik7XG59O1xuXG4vKipcbiAqIEdldHMgYW4gaXRlbSBvbiBsb2NhbCBkaXNrLlxuICpcbiAqIFNldCBzZXRJdGVtKCkgZm9yIGRldGFpbHMgb24gc3RvcmFnZSB0eXBlcy5cbiAqXG4gKiBAcGFyYW0gYXBpIHRoZSBmbGFzaCBpbnRlcmZhY2UsIG51bGwgdG8gdXNlIG9ubHkgV2ViU3RvcmFnZS5cbiAqIEBwYXJhbSBpZCB0aGUgc3RvcmFnZSBJRCB0byB1c2UuXG4gKiBAcGFyYW0ga2V5IHRoZSBrZXkgZm9yIHRoZSBpdGVtLlxuICogQHBhcmFtIGxvY2F0aW9uIGFuIGFycmF5IHdpdGggdGhlIHByZWZlcnJlZCB0eXBlcyBvZiBzdG9yYWdlIHRvIHVzZS5cbiAqXG4gKiBAcmV0dXJuIHRoZSBpdGVtLlxuICovXG51dGlsLmdldEl0ZW0gPSBmdW5jdGlvbihhcGksIGlkLCBrZXksIGxvY2F0aW9uKSB7XG4gIHJldHVybiBfY2FsbFN0b3JhZ2VGdW5jdGlvbihfZ2V0SXRlbSwgYXJndW1lbnRzLCBsb2NhdGlvbik7XG59O1xuXG4vKipcbiAqIFJlbW92ZXMgYW4gaXRlbSBvbiBsb2NhbCBkaXNrLlxuICpcbiAqIFNldCBzZXRJdGVtKCkgZm9yIGRldGFpbHMgb24gc3RvcmFnZSB0eXBlcy5cbiAqXG4gKiBAcGFyYW0gYXBpIHRoZSBmbGFzaCBpbnRlcmZhY2UuXG4gKiBAcGFyYW0gaWQgdGhlIHN0b3JhZ2UgSUQgdG8gdXNlLlxuICogQHBhcmFtIGtleSB0aGUga2V5IGZvciB0aGUgaXRlbS5cbiAqIEBwYXJhbSBsb2NhdGlvbiBhbiBhcnJheSB3aXRoIHRoZSBwcmVmZXJyZWQgdHlwZXMgb2Ygc3RvcmFnZSB0byB1c2UuXG4gKi9cbnV0aWwucmVtb3ZlSXRlbSA9IGZ1bmN0aW9uKGFwaSwgaWQsIGtleSwgbG9jYXRpb24pIHtcbiAgX2NhbGxTdG9yYWdlRnVuY3Rpb24oX3JlbW92ZUl0ZW0sIGFyZ3VtZW50cywgbG9jYXRpb24pO1xufTtcblxuLyoqXG4gKiBDbGVhcnMgdGhlIGxvY2FsIGRpc2sgc3RvcmFnZSBpZGVudGlmaWVkIGJ5IHRoZSBnaXZlbiBJRC5cbiAqXG4gKiBTZXQgc2V0SXRlbSgpIGZvciBkZXRhaWxzIG9uIHN0b3JhZ2UgdHlwZXMuXG4gKlxuICogQHBhcmFtIGFwaSB0aGUgZmxhc2ggaW50ZXJmYWNlIGlmIGZsYXNoIGlzIGF2YWlsYWJsZS5cbiAqIEBwYXJhbSBpZCB0aGUgc3RvcmFnZSBJRCB0byB1c2UuXG4gKiBAcGFyYW0gbG9jYXRpb24gYW4gYXJyYXkgd2l0aCB0aGUgcHJlZmVycmVkIHR5cGVzIG9mIHN0b3JhZ2UgdG8gdXNlLlxuICovXG51dGlsLmNsZWFySXRlbXMgPSBmdW5jdGlvbihhcGksIGlkLCBsb2NhdGlvbikge1xuICBfY2FsbFN0b3JhZ2VGdW5jdGlvbihfY2xlYXJJdGVtcywgYXJndW1lbnRzLCBsb2NhdGlvbik7XG59O1xuXG4vKipcbiAqIENoZWNrIGlmIGFuIG9iamVjdCBpcyBlbXB0eS5cbiAqXG4gKiBUYWtlbiBmcm9tOlxuICogaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy82Nzk5MTUvaG93LWRvLWktdGVzdC1mb3ItYW4tZW1wdHktamF2YXNjcmlwdC1vYmplY3QtZnJvbS1qc29uLzY3OTkzNyM2Nzk5MzdcbiAqXG4gKiBAcGFyYW0gb2JqZWN0IHRoZSBvYmplY3QgdG8gY2hlY2suXG4gKi9cbnV0aWwuaXNFbXB0eSA9IGZ1bmN0aW9uKG9iaikge1xuICBmb3IodmFyIHByb3AgaW4gb2JqKSB7XG4gICAgaWYob2JqLmhhc093blByb3BlcnR5KHByb3ApKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufTtcblxuLyoqXG4gKiBGb3JtYXQgd2l0aCBzaW1wbGUgcHJpbnRmLXN0eWxlIGludGVycG9sYXRpb24uXG4gKlxuICogJSU6IGxpdGVyYWwgJyUnXG4gKiAlcywlbzogY29udmVydCBuZXh0IGFyZ3VtZW50IGludG8gYSBzdHJpbmcuXG4gKlxuICogQHBhcmFtIGZvcm1hdCB0aGUgc3RyaW5nIHRvIGZvcm1hdC5cbiAqIEBwYXJhbSAuLi4gYXJndW1lbnRzIHRvIGludGVycG9sYXRlIGludG8gdGhlIGZvcm1hdCBzdHJpbmcuXG4gKi9cbnV0aWwuZm9ybWF0ID0gZnVuY3Rpb24oZm9ybWF0KSB7XG4gIHZhciByZSA9IC8lLi9nO1xuICAvLyBjdXJyZW50IG1hdGNoXG4gIHZhciBtYXRjaDtcbiAgLy8gY3VycmVudCBwYXJ0XG4gIHZhciBwYXJ0O1xuICAvLyBjdXJyZW50IGFyZyBpbmRleFxuICB2YXIgYXJnaSA9IDA7XG4gIC8vIGNvbGxlY3RlZCBwYXJ0cyB0byByZWNvbWJpbmUgbGF0ZXJcbiAgdmFyIHBhcnRzID0gW107XG4gIC8vIGxhc3QgaW5kZXggZm91bmRcbiAgdmFyIGxhc3QgPSAwO1xuICAvLyBsb29wIHdoaWxlIG1hdGNoZXMgcmVtYWluXG4gIHdoaWxlKChtYXRjaCA9IHJlLmV4ZWMoZm9ybWF0KSkpIHtcbiAgICBwYXJ0ID0gZm9ybWF0LnN1YnN0cmluZyhsYXN0LCByZS5sYXN0SW5kZXggLSAyKTtcbiAgICAvLyBkb24ndCBhZGQgZW1wdHkgc3RyaW5ncyAoaWUsIHBhcnRzIGJldHdlZW4gJXMlcylcbiAgICBpZihwYXJ0Lmxlbmd0aCA+IDApIHtcbiAgICAgIHBhcnRzLnB1c2gocGFydCk7XG4gICAgfVxuICAgIGxhc3QgPSByZS5sYXN0SW5kZXg7XG4gICAgLy8gc3dpdGNoIG9uICUgY29kZVxuICAgIHZhciBjb2RlID0gbWF0Y2hbMF1bMV07XG4gICAgc3dpdGNoKGNvZGUpIHtcbiAgICBjYXNlICdzJzpcbiAgICBjYXNlICdvJzpcbiAgICAgIC8vIGNoZWNrIGlmIGVub3VnaCBhcmd1bWVudHMgd2VyZSBnaXZlblxuICAgICAgaWYoYXJnaSA8IGFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgcGFydHMucHVzaChhcmd1bWVudHNbYXJnaSsrICsgMV0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGFydHMucHVzaCgnPD8+Jyk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICAvLyBGSVhNRTogZG8gcHJvcGVyIGZvcm1hdGluZyBmb3IgbnVtYmVycywgZXRjXG4gICAgLy9jYXNlICdmJzpcbiAgICAvL2Nhc2UgJ2QnOlxuICAgIGNhc2UgJyUnOlxuICAgICAgcGFydHMucHVzaCgnJScpO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHBhcnRzLnB1c2goJzwlJyArIGNvZGUgKyAnPz4nKTtcbiAgICB9XG4gIH1cbiAgLy8gYWRkIHRyYWlsaW5nIHBhcnQgb2YgZm9ybWF0IHN0cmluZ1xuICBwYXJ0cy5wdXNoKGZvcm1hdC5zdWJzdHJpbmcobGFzdCkpO1xuICByZXR1cm4gcGFydHMuam9pbignJyk7XG59O1xuXG4vKipcbiAqIEZvcm1hdHMgYSBudW1iZXIuXG4gKlxuICogaHR0cDovL3NuaXBwbHIuY29tL3ZpZXcvNTk0NS9qYXZhc2NyaXB0LW51bWJlcmZvcm1hdC0tcG9ydGVkLWZyb20tcGhwL1xuICovXG51dGlsLmZvcm1hdE51bWJlciA9IGZ1bmN0aW9uKG51bWJlciwgZGVjaW1hbHMsIGRlY19wb2ludCwgdGhvdXNhbmRzX3NlcCkge1xuICAvLyBodHRwOi8va2V2aW4udmFuem9ubmV2ZWxkLm5ldFxuICAvLyArICAgb3JpZ2luYWwgYnk6IEpvbmFzIFJhb25pIFNvYXJlcyBTaWx2YSAoaHR0cDovL3d3dy5qc2Zyb21oZWxsLmNvbSlcbiAgLy8gKyAgIGltcHJvdmVkIGJ5OiBLZXZpbiB2YW4gWm9ubmV2ZWxkIChodHRwOi8va2V2aW4udmFuem9ubmV2ZWxkLm5ldClcbiAgLy8gKyAgICAgYnVnZml4IGJ5OiBNaWNoYWVsIFdoaXRlIChodHRwOi8vY3Jlc3RpZGcuY29tKVxuICAvLyArICAgICBidWdmaXggYnk6IEJlbmphbWluIEx1cHRvblxuICAvLyArICAgICBidWdmaXggYnk6IEFsbGFuIEplbnNlbiAoaHR0cDovL3d3dy53aW50ZXJuZXQubm8pXG4gIC8vICsgICAgcmV2aXNlZCBieTogSm9uYXMgUmFvbmkgU29hcmVzIFNpbHZhIChodHRwOi8vd3d3LmpzZnJvbWhlbGwuY29tKVxuICAvLyAqICAgICBleGFtcGxlIDE6IG51bWJlcl9mb3JtYXQoMTIzNC41Njc4LCAyLCAnLicsICcnKTtcbiAgLy8gKiAgICAgcmV0dXJucyAxOiAxMjM0LjU3XG5cbiAgdmFyIG4gPSBudW1iZXIsIGMgPSBpc05hTihkZWNpbWFscyA9IE1hdGguYWJzKGRlY2ltYWxzKSkgPyAyIDogZGVjaW1hbHM7XG4gIHZhciBkID0gZGVjX3BvaW50ID09PSB1bmRlZmluZWQgPyAnLCcgOiBkZWNfcG9pbnQ7XG4gIHZhciB0ID0gdGhvdXNhbmRzX3NlcCA9PT0gdW5kZWZpbmVkID9cbiAgICcuJyA6IHRob3VzYW5kc19zZXAsIHMgPSBuIDwgMCA/ICctJyA6ICcnO1xuICB2YXIgaSA9IHBhcnNlSW50KChuID0gTWF0aC5hYnMoK24gfHwgMCkudG9GaXhlZChjKSksIDEwKSArICcnO1xuICB2YXIgaiA9IChpLmxlbmd0aCA+IDMpID8gaS5sZW5ndGggJSAzIDogMDtcbiAgcmV0dXJuIHMgKyAoaiA/IGkuc3Vic3RyKDAsIGopICsgdCA6ICcnKSArXG4gICAgaS5zdWJzdHIoaikucmVwbGFjZSgvKFxcZHszfSkoPz1cXGQpL2csICckMScgKyB0KSArXG4gICAgKGMgPyBkICsgTWF0aC5hYnMobiAtIGkpLnRvRml4ZWQoYykuc2xpY2UoMikgOiAnJyk7XG59O1xuXG4vKipcbiAqIEZvcm1hdHMgYSBieXRlIHNpemUuXG4gKlxuICogaHR0cDovL3NuaXBwbHIuY29tL3ZpZXcvNTk0OS9mb3JtYXQtaHVtYW5pemUtZmlsZS1ieXRlLXNpemUtcHJlc2VudGF0aW9uLWluLWphdmFzY3JpcHQvXG4gKi9cbnV0aWwuZm9ybWF0U2l6ZSA9IGZ1bmN0aW9uKHNpemUpIHtcbiAgaWYoc2l6ZSA+PSAxMDczNzQxODI0KSB7XG4gICAgc2l6ZSA9IHV0aWwuZm9ybWF0TnVtYmVyKHNpemUgLyAxMDczNzQxODI0LCAyLCAnLicsICcnKSArICcgR2lCJztcbiAgfSBlbHNlIGlmKHNpemUgPj0gMTA0ODU3Nikge1xuICAgIHNpemUgPSB1dGlsLmZvcm1hdE51bWJlcihzaXplIC8gMTA0ODU3NiwgMiwgJy4nLCAnJykgKyAnIE1pQic7XG4gIH0gZWxzZSBpZihzaXplID49IDEwMjQpIHtcbiAgICBzaXplID0gdXRpbC5mb3JtYXROdW1iZXIoc2l6ZSAvIDEwMjQsIDApICsgJyBLaUInO1xuICB9IGVsc2Uge1xuICAgIHNpemUgPSB1dGlsLmZvcm1hdE51bWJlcihzaXplLCAwKSArICcgYnl0ZXMnO1xuICB9XG4gIHJldHVybiBzaXplO1xufTtcblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBJUHY0IG9yIElQdjYgc3RyaW5nIHJlcHJlc2VudGF0aW9uIGludG8gYnl0ZXMgKGluIG5ldHdvcmsgb3JkZXIpLlxuICpcbiAqIEBwYXJhbSBpcCB0aGUgSVB2NCBvciBJUHY2IGFkZHJlc3MgdG8gY29udmVydC5cbiAqXG4gKiBAcmV0dXJuIHRoZSA0LWJ5dGUgSVB2NiBvciAxNi1ieXRlIElQdjYgYWRkcmVzcyBvciBudWxsIGlmIHRoZSBhZGRyZXNzIGNhbid0XG4gKiAgICAgICAgIGJlIHBhcnNlZC5cbiAqL1xudXRpbC5ieXRlc0Zyb21JUCA9IGZ1bmN0aW9uKGlwKSB7XG4gIGlmKGlwLmluZGV4T2YoJy4nKSAhPT0gLTEpIHtcbiAgICByZXR1cm4gdXRpbC5ieXRlc0Zyb21JUHY0KGlwKTtcbiAgfVxuICBpZihpcC5pbmRleE9mKCc6JykgIT09IC0xKSB7XG4gICAgcmV0dXJuIHV0aWwuYnl0ZXNGcm9tSVB2NihpcCk7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59O1xuXG4vKipcbiAqIENvbnZlcnRzIGFuIElQdjQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIGludG8gYnl0ZXMgKGluIG5ldHdvcmsgb3JkZXIpLlxuICpcbiAqIEBwYXJhbSBpcCB0aGUgSVB2NCBhZGRyZXNzIHRvIGNvbnZlcnQuXG4gKlxuICogQHJldHVybiB0aGUgNC1ieXRlIGFkZHJlc3Mgb3IgbnVsbCBpZiB0aGUgYWRkcmVzcyBjYW4ndCBiZSBwYXJzZWQuXG4gKi9cbnV0aWwuYnl0ZXNGcm9tSVB2NCA9IGZ1bmN0aW9uKGlwKSB7XG4gIGlwID0gaXAuc3BsaXQoJy4nKTtcbiAgaWYoaXAubGVuZ3RoICE9PSA0KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgdmFyIGIgPSB1dGlsLmNyZWF0ZUJ1ZmZlcigpO1xuICBmb3IodmFyIGkgPSAwOyBpIDwgaXAubGVuZ3RoOyArK2kpIHtcbiAgICB2YXIgbnVtID0gcGFyc2VJbnQoaXBbaV0sIDEwKTtcbiAgICBpZihpc05hTihudW0pKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgYi5wdXRCeXRlKG51bSk7XG4gIH1cbiAgcmV0dXJuIGIuZ2V0Qnl0ZXMoKTtcbn07XG5cbi8qKlxuICogQ29udmVydHMgYW4gSVB2NiBzdHJpbmcgcmVwcmVzZW50YXRpb24gaW50byBieXRlcyAoaW4gbmV0d29yayBvcmRlcikuXG4gKlxuICogQHBhcmFtIGlwIHRoZSBJUHY2IGFkZHJlc3MgdG8gY29udmVydC5cbiAqXG4gKiBAcmV0dXJuIHRoZSAxNi1ieXRlIGFkZHJlc3Mgb3IgbnVsbCBpZiB0aGUgYWRkcmVzcyBjYW4ndCBiZSBwYXJzZWQuXG4gKi9cbnV0aWwuYnl0ZXNGcm9tSVB2NiA9IGZ1bmN0aW9uKGlwKSB7XG4gIHZhciBibGFua3MgPSAwO1xuICBpcCA9IGlwLnNwbGl0KCc6JykuZmlsdGVyKGZ1bmN0aW9uKGUpIHtcbiAgICBpZihlLmxlbmd0aCA9PT0gMCkgKytibGFua3M7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0pO1xuICB2YXIgemVyb3MgPSAoOCAtIGlwLmxlbmd0aCArIGJsYW5rcykgKiAyO1xuICB2YXIgYiA9IHV0aWwuY3JlYXRlQnVmZmVyKCk7XG4gIGZvcih2YXIgaSA9IDA7IGkgPCA4OyArK2kpIHtcbiAgICBpZighaXBbaV0gfHwgaXBbaV0ubGVuZ3RoID09PSAwKSB7XG4gICAgICBiLmZpbGxXaXRoQnl0ZSgwLCB6ZXJvcyk7XG4gICAgICB6ZXJvcyA9IDA7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgdmFyIGJ5dGVzID0gdXRpbC5oZXhUb0J5dGVzKGlwW2ldKTtcbiAgICBpZihieXRlcy5sZW5ndGggPCAyKSB7XG4gICAgICBiLnB1dEJ5dGUoMCk7XG4gICAgfVxuICAgIGIucHV0Qnl0ZXMoYnl0ZXMpO1xuICB9XG4gIHJldHVybiBiLmdldEJ5dGVzKCk7XG59O1xuXG4vKipcbiAqIENvbnZlcnRzIDQtYnl0ZXMgaW50byBhbiBJUHY0IHN0cmluZyByZXByZXNlbnRhdGlvbiBvciAxNi1ieXRlcyBpbnRvXG4gKiBhbiBJUHY2IHN0cmluZyByZXByZXNlbnRhdGlvbi4gVGhlIGJ5dGVzIG11c3QgYmUgaW4gbmV0d29yayBvcmRlci5cbiAqXG4gKiBAcGFyYW0gYnl0ZXMgdGhlIGJ5dGVzIHRvIGNvbnZlcnQuXG4gKlxuICogQHJldHVybiB0aGUgSVB2NCBvciBJUHY2IHN0cmluZyByZXByZXNlbnRhdGlvbiBpZiA0IG9yIDE2IGJ5dGVzLFxuICogICAgICAgICByZXNwZWN0aXZlbHksIGFyZSBnaXZlbiwgb3RoZXJ3aXNlIG51bGwuXG4gKi9cbnV0aWwuYnl0ZXNUb0lQID0gZnVuY3Rpb24oYnl0ZXMpIHtcbiAgaWYoYnl0ZXMubGVuZ3RoID09PSA0KSB7XG4gICAgcmV0dXJuIHV0aWwuYnl0ZXNUb0lQdjQoYnl0ZXMpO1xuICB9XG4gIGlmKGJ5dGVzLmxlbmd0aCA9PT0gMTYpIHtcbiAgICByZXR1cm4gdXRpbC5ieXRlc1RvSVB2NihieXRlcyk7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59O1xuXG4vKipcbiAqIENvbnZlcnRzIDQtYnl0ZXMgaW50byBhbiBJUHY0IHN0cmluZyByZXByZXNlbnRhdGlvbi4gVGhlIGJ5dGVzIG11c3QgYmVcbiAqIGluIG5ldHdvcmsgb3JkZXIuXG4gKlxuICogQHBhcmFtIGJ5dGVzIHRoZSBieXRlcyB0byBjb252ZXJ0LlxuICpcbiAqIEByZXR1cm4gdGhlIElQdjQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9yIG51bGwgZm9yIGFuIGludmFsaWQgIyBvZiBieXRlcy5cbiAqL1xudXRpbC5ieXRlc1RvSVB2NCA9IGZ1bmN0aW9uKGJ5dGVzKSB7XG4gIGlmKGJ5dGVzLmxlbmd0aCAhPT0gNCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHZhciBpcCA9IFtdO1xuICBmb3IodmFyIGkgPSAwOyBpIDwgYnl0ZXMubGVuZ3RoOyArK2kpIHtcbiAgICBpcC5wdXNoKGJ5dGVzLmNoYXJDb2RlQXQoaSkpO1xuICB9XG4gIHJldHVybiBpcC5qb2luKCcuJyk7XG59O1xuXG4vKipcbiAqIENvbnZlcnRzIDE2LWJ5dGVzIGludG8gYW4gSVB2MTYgc3RyaW5nIHJlcHJlc2VudGF0aW9uLiBUaGUgYnl0ZXMgbXVzdCBiZVxuICogaW4gbmV0d29yayBvcmRlci5cbiAqXG4gKiBAcGFyYW0gYnl0ZXMgdGhlIGJ5dGVzIHRvIGNvbnZlcnQuXG4gKlxuICogQHJldHVybiB0aGUgSVB2MTYgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9yIG51bGwgZm9yIGFuIGludmFsaWQgIyBvZiBieXRlcy5cbiAqL1xudXRpbC5ieXRlc1RvSVB2NiA9IGZ1bmN0aW9uKGJ5dGVzKSB7XG4gIGlmKGJ5dGVzLmxlbmd0aCAhPT0gMTYpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICB2YXIgaXAgPSBbXTtcbiAgdmFyIHplcm9Hcm91cHMgPSBbXTtcbiAgdmFyIHplcm9NYXhHcm91cCA9IDA7XG4gIGZvcih2YXIgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGg7IGkgKz0gMikge1xuICAgIHZhciBoZXggPSB1dGlsLmJ5dGVzVG9IZXgoYnl0ZXNbaV0gKyBieXRlc1tpICsgMV0pO1xuICAgIC8vIGNhbm9uaWNhbGl6ZSB6ZXJvIHJlcHJlc2VudGF0aW9uXG4gICAgd2hpbGUoaGV4WzBdID09PSAnMCcgJiYgaGV4ICE9PSAnMCcpIHtcbiAgICAgIGhleCA9IGhleC5zdWJzdHIoMSk7XG4gICAgfVxuICAgIGlmKGhleCA9PT0gJzAnKSB7XG4gICAgICB2YXIgbGFzdCA9IHplcm9Hcm91cHNbemVyb0dyb3Vwcy5sZW5ndGggLSAxXTtcbiAgICAgIHZhciBpZHggPSBpcC5sZW5ndGg7XG4gICAgICBpZighbGFzdCB8fCBpZHggIT09IGxhc3QuZW5kICsgMSkge1xuICAgICAgICB6ZXJvR3JvdXBzLnB1c2goe3N0YXJ0OiBpZHgsIGVuZDogaWR4fSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsYXN0LmVuZCA9IGlkeDtcbiAgICAgICAgaWYoKGxhc3QuZW5kIC0gbGFzdC5zdGFydCkgPlxuICAgICAgICAgICh6ZXJvR3JvdXBzW3plcm9NYXhHcm91cF0uZW5kIC0gemVyb0dyb3Vwc1t6ZXJvTWF4R3JvdXBdLnN0YXJ0KSkge1xuICAgICAgICAgIHplcm9NYXhHcm91cCA9IHplcm9Hcm91cHMubGVuZ3RoIC0gMTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpcC5wdXNoKGhleCk7XG4gIH1cbiAgaWYoemVyb0dyb3Vwcy5sZW5ndGggPiAwKSB7XG4gICAgdmFyIGdyb3VwID0gemVyb0dyb3Vwc1t6ZXJvTWF4R3JvdXBdO1xuICAgIC8vIG9ubHkgc2hvcnRlbiBncm91cCBvZiBsZW5ndGggPiAwXG4gICAgaWYoZ3JvdXAuZW5kIC0gZ3JvdXAuc3RhcnQgPiAwKSB7XG4gICAgICBpcC5zcGxpY2UoZ3JvdXAuc3RhcnQsIGdyb3VwLmVuZCAtIGdyb3VwLnN0YXJ0ICsgMSwgJycpO1xuICAgICAgaWYoZ3JvdXAuc3RhcnQgPT09IDApIHtcbiAgICAgICAgaXAudW5zaGlmdCgnJyk7XG4gICAgICB9XG4gICAgICBpZihncm91cC5lbmQgPT09IDcpIHtcbiAgICAgICAgaXAucHVzaCgnJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBpcC5qb2luKCc6Jyk7XG59O1xuXG4vKipcbiAqIEVzdGltYXRlcyB0aGUgbnVtYmVyIG9mIHByb2Nlc3NlcyB0aGF0IGNhbiBiZSBydW4gY29uY3VycmVudGx5LiBJZlxuICogY3JlYXRpbmcgV2ViIFdvcmtlcnMsIGtlZXAgaW4gbWluZCB0aGF0IHRoZSBtYWluIEphdmFTY3JpcHQgcHJvY2VzcyBuZWVkc1xuICogaXRzIG93biBjb3JlLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIHRoZSBvcHRpb25zIHRvIHVzZTpcbiAqICAgICAgICAgIHVwZGF0ZSB0cnVlIHRvIGZvcmNlIGFuIHVwZGF0ZSAobm90IHVzZSB0aGUgY2FjaGVkIHZhbHVlKS5cbiAqIEBwYXJhbSBjYWxsYmFjayhlcnIsIG1heCkgY2FsbGVkIG9uY2UgdGhlIG9wZXJhdGlvbiBjb21wbGV0ZXMuXG4gKi9cbnV0aWwuZXN0aW1hdGVDb3JlcyA9IGZ1bmN0aW9uKG9wdGlvbnMsIGNhbGxiYWNrKSB7XG4gIGlmKHR5cGVvZiBvcHRpb25zID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2FsbGJhY2sgPSBvcHRpb25zO1xuICAgIG9wdGlvbnMgPSB7fTtcbiAgfVxuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgaWYoJ2NvcmVzJyBpbiB1dGlsICYmICFvcHRpb25zLnVwZGF0ZSkge1xuICAgIHJldHVybiBjYWxsYmFjayhudWxsLCB1dGlsLmNvcmVzKTtcbiAgfVxuICBpZih0eXBlb2YgbmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICdoYXJkd2FyZUNvbmN1cnJlbmN5JyBpbiBuYXZpZ2F0b3IgJiZcbiAgICBuYXZpZ2F0b3IuaGFyZHdhcmVDb25jdXJyZW5jeSA+IDApIHtcbiAgICB1dGlsLmNvcmVzID0gbmF2aWdhdG9yLmhhcmR3YXJlQ29uY3VycmVuY3k7XG4gICAgcmV0dXJuIGNhbGxiYWNrKG51bGwsIHV0aWwuY29yZXMpO1xuICB9XG4gIGlmKHR5cGVvZiBXb3JrZXIgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgLy8gd29ya2VycyBub3QgYXZhaWxhYmxlXG4gICAgdXRpbC5jb3JlcyA9IDE7XG4gICAgcmV0dXJuIGNhbGxiYWNrKG51bGwsIHV0aWwuY29yZXMpO1xuICB9XG4gIGlmKHR5cGVvZiBCbG9iID09PSAndW5kZWZpbmVkJykge1xuICAgIC8vIGNhbid0IGVzdGltYXRlLCBkZWZhdWx0IHRvIDJcbiAgICB1dGlsLmNvcmVzID0gMjtcbiAgICByZXR1cm4gY2FsbGJhY2sobnVsbCwgdXRpbC5jb3Jlcyk7XG4gIH1cblxuICAvLyBjcmVhdGUgd29ya2VyIGNvbmN1cnJlbmN5IGVzdGltYXRpb24gY29kZSBhcyBibG9iXG4gIHZhciBibG9iVXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChuZXcgQmxvYihbJygnLFxuICAgIGZ1bmN0aW9uKCkge1xuICAgICAgc2VsZi5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgZnVuY3Rpb24oZSkge1xuICAgICAgICAvLyBydW4gd29ya2VyIGZvciA0IG1zXG4gICAgICAgIHZhciBzdCA9IERhdGUubm93KCk7XG4gICAgICAgIHZhciBldCA9IHN0ICsgNDtcbiAgICAgICAgd2hpbGUoRGF0ZS5ub3coKSA8IGV0KTtcbiAgICAgICAgc2VsZi5wb3N0TWVzc2FnZSh7c3Q6IHN0LCBldDogZXR9KTtcbiAgICAgIH0pO1xuICAgIH0udG9TdHJpbmcoKSxcbiAgJykoKSddLCB7dHlwZTogJ2FwcGxpY2F0aW9uL2phdmFzY3JpcHQnfSkpO1xuXG4gIC8vIHRha2UgNSBzYW1wbGVzIHVzaW5nIDE2IHdvcmtlcnNcbiAgc2FtcGxlKFtdLCA1LCAxNik7XG5cbiAgZnVuY3Rpb24gc2FtcGxlKG1heCwgc2FtcGxlcywgbnVtV29ya2Vycykge1xuICAgIGlmKHNhbXBsZXMgPT09IDApIHtcbiAgICAgIC8vIGdldCBvdmVybGFwIGF2ZXJhZ2VcbiAgICAgIHZhciBhdmcgPSBNYXRoLmZsb29yKG1heC5yZWR1Y2UoZnVuY3Rpb24oYXZnLCB4KSB7XG4gICAgICAgIHJldHVybiBhdmcgKyB4O1xuICAgICAgfSwgMCkgLyBtYXgubGVuZ3RoKTtcbiAgICAgIHV0aWwuY29yZXMgPSBNYXRoLm1heCgxLCBhdmcpO1xuICAgICAgVVJMLnJldm9rZU9iamVjdFVSTChibG9iVXJsKTtcbiAgICAgIHJldHVybiBjYWxsYmFjayhudWxsLCB1dGlsLmNvcmVzKTtcbiAgICB9XG4gICAgbWFwKG51bVdvcmtlcnMsIGZ1bmN0aW9uKGVyciwgcmVzdWx0cykge1xuICAgICAgbWF4LnB1c2gocmVkdWNlKG51bVdvcmtlcnMsIHJlc3VsdHMpKTtcbiAgICAgIHNhbXBsZShtYXgsIHNhbXBsZXMgLSAxLCBudW1Xb3JrZXJzKTtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG1hcChudW1Xb3JrZXJzLCBjYWxsYmFjaykge1xuICAgIHZhciB3b3JrZXJzID0gW107XG4gICAgdmFyIHJlc3VsdHMgPSBbXTtcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgbnVtV29ya2VyczsgKytpKSB7XG4gICAgICB2YXIgd29ya2VyID0gbmV3IFdvcmtlcihibG9iVXJsKTtcbiAgICAgIHdvcmtlci5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgZnVuY3Rpb24oZSkge1xuICAgICAgICByZXN1bHRzLnB1c2goZS5kYXRhKTtcbiAgICAgICAgaWYocmVzdWx0cy5sZW5ndGggPT09IG51bVdvcmtlcnMpIHtcbiAgICAgICAgICBmb3IodmFyIGkgPSAwOyBpIDwgbnVtV29ya2VyczsgKytpKSB7XG4gICAgICAgICAgICB3b3JrZXJzW2ldLnRlcm1pbmF0ZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYWxsYmFjayhudWxsLCByZXN1bHRzKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICB3b3JrZXJzLnB1c2god29ya2VyKTtcbiAgICB9XG4gICAgZm9yKHZhciBpID0gMDsgaSA8IG51bVdvcmtlcnM7ICsraSkge1xuICAgICAgd29ya2Vyc1tpXS5wb3N0TWVzc2FnZShpKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiByZWR1Y2UobnVtV29ya2VycywgcmVzdWx0cykge1xuICAgIC8vIGZpbmQgb3ZlcmxhcHBpbmcgdGltZSB3aW5kb3dzXG4gICAgdmFyIG92ZXJsYXBzID0gW107XG4gICAgZm9yKHZhciBuID0gMDsgbiA8IG51bVdvcmtlcnM7ICsrbikge1xuICAgICAgdmFyIHIxID0gcmVzdWx0c1tuXTtcbiAgICAgIHZhciBvdmVybGFwID0gb3ZlcmxhcHNbbl0gPSBbXTtcbiAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCBudW1Xb3JrZXJzOyArK2kpIHtcbiAgICAgICAgaWYobiA9PT0gaSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHZhciByMiA9IHJlc3VsdHNbaV07XG4gICAgICAgIGlmKChyMS5zdCA+IHIyLnN0ICYmIHIxLnN0IDwgcjIuZXQpIHx8XG4gICAgICAgICAgKHIyLnN0ID4gcjEuc3QgJiYgcjIuc3QgPCByMS5ldCkpIHtcbiAgICAgICAgICBvdmVybGFwLnB1c2goaSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgLy8gZ2V0IG1heGltdW0gb3ZlcmxhcHMgLi4uIGRvbid0IGluY2x1ZGUgb3ZlcmxhcHBpbmcgd29ya2VyIGl0c2VsZlxuICAgIC8vIGFzIHRoZSBtYWluIEpTIHByb2Nlc3Mgd2FzIGFsc28gYmVpbmcgc2NoZWR1bGVkIGR1cmluZyB0aGUgd29yayBhbmRcbiAgICAvLyB3b3VsZCBoYXZlIHRvIGJlIHN1YnRyYWN0ZWQgZnJvbSB0aGUgZXN0aW1hdGUgYW55d2F5XG4gICAgcmV0dXJuIG92ZXJsYXBzLnJlZHVjZShmdW5jdGlvbihtYXgsIG92ZXJsYXApIHtcbiAgICAgIHJldHVybiBNYXRoLm1heChtYXgsIG92ZXJsYXAubGVuZ3RoKTtcbiAgICB9LCAwKTtcbiAgfVxufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///7\n")},function(module,__webpack_exports__,__webpack_require__){"use strict";eval('/* unused harmony export __extends */\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return __assign; });\n/* unused harmony export __rest */\n/* unused harmony export __decorate */\n/* unused harmony export __param */\n/* unused harmony export __esDecorate */\n/* unused harmony export __runInitializers */\n/* unused harmony export __propKey */\n/* unused harmony export __setFunctionName */\n/* unused harmony export __metadata */\n/* unused harmony export __awaiter */\n/* unused harmony export __generator */\n/* unused harmony export __createBinding */\n/* unused harmony export __exportStar */\n/* unused harmony export __values */\n/* unused harmony export __read */\n/* unused harmony export __spread */\n/* unused harmony export __spreadArrays */\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return __spreadArray; });\n/* unused harmony export __await */\n/* unused harmony export __asyncGenerator */\n/* unused harmony export __asyncDelegator */\n/* unused harmony export __asyncValues */\n/* unused harmony export __makeTemplateObject */\n/* unused harmony export __importStar */\n/* unused harmony export __importDefault */\n/* unused harmony export __classPrivateFieldGet */\n/* unused harmony export __classPrivateFieldSet */\n/* unused harmony export __classPrivateFieldIn */\n/* unused harmony export __addDisposableResource */\n/* unused harmony export __disposeResources */\n/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise, SuppressedError, Symbol */\r\n\r\nvar extendStatics = function(d, b) {\r\n    extendStatics = Object.setPrototypeOf ||\r\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n        function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n    return extendStatics(d, b);\r\n};\r\n\r\nfunction __extends(d, b) {\r\n    if (typeof b !== "function" && b !== null)\r\n        throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");\r\n    extendStatics(d, b);\r\n    function __() { this.constructor = d; }\r\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nvar __assign = function() {\r\n    __assign = Object.assign || function __assign(t) {\r\n        for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n            s = arguments[i];\r\n            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n        }\r\n        return t;\r\n    }\r\n    return __assign.apply(this, arguments);\r\n}\r\n\r\nfunction __rest(s, e) {\r\n    var t = {};\r\n    for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n        t[p] = s[p];\r\n    if (s != null && typeof Object.getOwnPropertySymbols === "function")\r\n        for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n            if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n                t[p[i]] = s[p[i]];\r\n        }\r\n    return t;\r\n}\r\n\r\nfunction __decorate(decorators, target, key, desc) {\r\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n    if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);\r\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nfunction __param(paramIndex, decorator) {\r\n    return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nfunction __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\r\n    function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }\r\n    var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";\r\n    var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;\r\n    var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\r\n    var _, done = false;\r\n    for (var i = decorators.length - 1; i >= 0; i--) {\r\n        var context = {};\r\n        for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];\r\n        for (var p in contextIn.access) context.access[p] = contextIn.access[p];\r\n        context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };\r\n        var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\r\n        if (kind === "accessor") {\r\n            if (result === void 0) continue;\r\n            if (result === null || typeof result !== "object") throw new TypeError("Object expected");\r\n            if (_ = accept(result.get)) descriptor.get = _;\r\n            if (_ = accept(result.set)) descriptor.set = _;\r\n            if (_ = accept(result.init)) initializers.unshift(_);\r\n        }\r\n        else if (_ = accept(result)) {\r\n            if (kind === "field") initializers.unshift(_);\r\n            else descriptor[key] = _;\r\n        }\r\n    }\r\n    if (target) Object.defineProperty(target, contextIn.name, descriptor);\r\n    done = true;\r\n};\r\n\r\nfunction __runInitializers(thisArg, initializers, value) {\r\n    var useValue = arguments.length > 2;\r\n    for (var i = 0; i < initializers.length; i++) {\r\n        value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\r\n    }\r\n    return useValue ? value : void 0;\r\n};\r\n\r\nfunction __propKey(x) {\r\n    return typeof x === "symbol" ? x : "".concat(x);\r\n};\r\n\r\nfunction __setFunctionName(f, name, prefix) {\r\n    if (typeof name === "symbol") name = name.description ? "[".concat(name.description, "]") : "";\r\n    return Object.defineProperty(f, "name", { configurable: true, value: prefix ? "".concat(prefix, " ", name) : name });\r\n};\r\n\r\nfunction __metadata(metadataKey, metadataValue) {\r\n    if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nfunction __awaiter(thisArg, _arguments, P, generator) {\r\n    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n    return new (P || (P = Promise))(function (resolve, reject) {\r\n        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }\r\n        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n    });\r\n}\r\n\r\nfunction __generator(thisArg, body) {\r\n    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n    return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;\r\n    function verb(n) { return function (v) { return step([n, v]); }; }\r\n    function step(op) {\r\n        if (f) throw new TypeError("Generator is already executing.");\r\n        while (g && (g = 0, op[0] && (_ = 0)), _) try {\r\n            if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n            if (y = 0, t) op = [op[0] & 2, t.value];\r\n            switch (op[0]) {\r\n                case 0: case 1: t = op; break;\r\n                case 4: _.label++; return { value: op[1], done: false };\r\n                case 5: _.label++; y = op[1]; op = [0]; continue;\r\n                case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n                default:\r\n                    if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n                    if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n                    if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n                    if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n                    if (t[2]) _.ops.pop();\r\n                    _.trys.pop(); continue;\r\n            }\r\n            op = body.call(thisArg, _);\r\n        } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n        if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n    }\r\n}\r\n\r\nvar __createBinding = Object.create ? (function(o, m, k, k2) {\r\n    if (k2 === undefined) k2 = k;\r\n    var desc = Object.getOwnPropertyDescriptor(m, k);\r\n    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n        desc = { enumerable: true, get: function() { return m[k]; } };\r\n    }\r\n    Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n    if (k2 === undefined) k2 = k;\r\n    o[k2] = m[k];\r\n});\r\n\r\nfunction __exportStar(m, o) {\r\n    for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nfunction __values(o) {\r\n    var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;\r\n    if (m) return m.call(o);\r\n    if (o && typeof o.length === "number") return {\r\n        next: function () {\r\n            if (o && i >= o.length) o = void 0;\r\n            return { value: o && o[i++], done: !o };\r\n        }\r\n    };\r\n    throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");\r\n}\r\n\r\nfunction __read(o, n) {\r\n    var m = typeof Symbol === "function" && o[Symbol.iterator];\r\n    if (!m) return o;\r\n    var i = m.call(o), r, ar = [], e;\r\n    try {\r\n        while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n    }\r\n    catch (error) { e = { error: error }; }\r\n    finally {\r\n        try {\r\n            if (r && !r.done && (m = i["return"])) m.call(i);\r\n        }\r\n        finally { if (e) throw e.error; }\r\n    }\r\n    return ar;\r\n}\r\n\r\n/** @deprecated */\r\nfunction __spread() {\r\n    for (var ar = [], i = 0; i < arguments.length; i++)\r\n        ar = ar.concat(__read(arguments[i]));\r\n    return ar;\r\n}\r\n\r\n/** @deprecated */\r\nfunction __spreadArrays() {\r\n    for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n    for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n        for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n            r[k] = a[j];\r\n    return r;\r\n}\r\n\r\nfunction __spreadArray(to, from, pack) {\r\n    if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n        if (ar || !(i in from)) {\r\n            if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n            ar[i] = from[i];\r\n        }\r\n    }\r\n    return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nfunction __await(v) {\r\n    return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nfunction __asyncGenerator(thisArg, _arguments, generator) {\r\n    if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");\r\n    var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n    return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n    function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n    function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n    function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n    function fulfill(value) { resume("next", value); }\r\n    function reject(value) { resume("throw", value); }\r\n    function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nfunction __asyncDelegator(o) {\r\n    var i, p;\r\n    return i = {}, verb("next"), verb("throw", function (e) { throw e; }), verb("return"), i[Symbol.iterator] = function () { return this; }, i;\r\n    function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nfunction __asyncValues(o) {\r\n    if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");\r\n    var m = o[Symbol.asyncIterator], i;\r\n    return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n    function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n    function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nfunction __makeTemplateObject(cooked, raw) {\r\n    if (Object.defineProperty) { Object.defineProperty(cooked, "raw", { value: raw }); } else { cooked.raw = raw; }\r\n    return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n    Object.defineProperty(o, "default", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n    o["default"] = v;\r\n};\r\n\r\nfunction __importStar(mod) {\r\n    if (mod && mod.__esModule) return mod;\r\n    var result = {};\r\n    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n    __setModuleDefault(result, mod);\r\n    return result;\r\n}\r\n\r\nfunction __importDefault(mod) {\r\n    return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nfunction __classPrivateFieldGet(receiver, state, kind, f) {\r\n    if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");\r\n    if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");\r\n    return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nfunction __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n    if (kind === "m") throw new TypeError("Private method is not writable");\r\n    if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");\r\n    if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");\r\n    return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nfunction __classPrivateFieldIn(state, receiver) {\r\n    if (receiver === null || (typeof receiver !== "object" && typeof receiver !== "function")) throw new TypeError("Cannot use \'in\' operator on non-object");\r\n    return typeof state === "function" ? receiver === state : state.has(receiver);\r\n}\r\n\r\nfunction __addDisposableResource(env, value, async) {\r\n    if (value !== null && value !== void 0) {\r\n        if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");\r\n        var dispose;\r\n        if (async) {\r\n            if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");\r\n            dispose = value[Symbol.asyncDispose];\r\n        }\r\n        if (dispose === void 0) {\r\n            if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");\r\n            dispose = value[Symbol.dispose];\r\n        }\r\n        if (typeof dispose !== "function") throw new TypeError("Object not disposable.");\r\n        env.stack.push({ value: value, dispose: dispose, async: async });\r\n    }\r\n    else if (async) {\r\n        env.stack.push({ async: true });\r\n    }\r\n    return value;\r\n}\r\n\r\nvar _SuppressedError = typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {\r\n    var e = new Error(message);\r\n    return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;\r\n};\r\n\r\nfunction __disposeResources(env) {\r\n    function fail(e) {\r\n        env.error = env.hasError ? new _SuppressedError(e, env.error, "An error was suppressed during disposal.") : e;\r\n        env.hasError = true;\r\n    }\r\n    function next() {\r\n        while (env.stack.length) {\r\n            var rec = env.stack.pop();\r\n            try {\r\n                var result = rec.dispose && rec.dispose.call(rec.value);\r\n                if (rec.async) return Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\r\n            }\r\n            catch (e) {\r\n                fail(e);\r\n            }\r\n        }\r\n        if (env.hasError) throw env.error;\r\n    }\r\n    return next();\r\n}\r\n\r\n/* unused harmony default export */ var _unused_webpack_default_export = ({\r\n    __extends: __extends,\r\n    __assign: __assign,\r\n    __rest: __rest,\r\n    __decorate: __decorate,\r\n    __param: __param,\r\n    __metadata: __metadata,\r\n    __awaiter: __awaiter,\r\n    __generator: __generator,\r\n    __createBinding: __createBinding,\r\n    __exportStar: __exportStar,\r\n    __values: __values,\r\n    __read: __read,\r\n    __spread: __spread,\r\n    __spreadArrays: __spreadArrays,\r\n    __spreadArray: __spreadArray,\r\n    __await: __await,\r\n    __asyncGenerator: __asyncGenerator,\r\n    __asyncDelegator: __asyncDelegator,\r\n    __asyncValues: __asyncValues,\r\n    __makeTemplateObject: __makeTemplateObject,\r\n    __importStar: __importStar,\r\n    __importDefault: __importDefault,\r\n    __classPrivateFieldGet: __classPrivateFieldGet,\r\n    __classPrivateFieldSet: __classPrivateFieldSet,\r\n    __classPrivateFieldIn: __classPrivateFieldIn,\r\n    __addDisposableResource: __addDisposableResource,\r\n    __disposeResources: __disposeResources,\r\n});\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOC5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy90c2xpYi90c2xpYi5lczYuanM/OWFiNCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbkNvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxyXG5cclxuUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55XHJcbnB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZC5cclxuXHJcblRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEhcclxuUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZXHJcbkFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCxcclxuSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NXHJcbkxPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SXHJcbk9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1JcclxuUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS5cclxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuLyogZ2xvYmFsIFJlZmxlY3QsIFByb21pc2UsIFN1cHByZXNzZWRFcnJvciwgU3ltYm9sICovXHJcblxyXG52YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uKGQsIGIpIHtcclxuICAgIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcclxuICAgICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XHJcbiAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIHApKSBkW3BdID0gYltwXTsgfTtcclxuICAgIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZXh0ZW5kcyhkLCBiKSB7XHJcbiAgICBpZiAodHlwZW9mIGIgIT09IFwiZnVuY3Rpb25cIiAmJiBiICE9PSBudWxsKVxyXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDbGFzcyBleHRlbmRzIHZhbHVlIFwiICsgU3RyaW5nKGIpICsgXCIgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbFwiKTtcclxuICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbiAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cclxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcclxufVxyXG5cclxuZXhwb3J0IHZhciBfX2Fzc2lnbiA9IGZ1bmN0aW9uKCkge1xyXG4gICAgX19hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIF9fYXNzaWduKHQpIHtcclxuICAgICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcclxuICAgICAgICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcclxuICAgICAgICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKSB0W3BdID0gc1twXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHQ7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVzdChzLCBlKSB7XHJcbiAgICB2YXIgdCA9IHt9O1xyXG4gICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApXHJcbiAgICAgICAgdFtwXSA9IHNbcF07XHJcbiAgICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpXHJcbiAgICAgICAgICAgICAgICB0W3BbaV1dID0gc1twW2ldXTtcclxuICAgICAgICB9XHJcbiAgICByZXR1cm4gdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpIHtcclxuICAgIHZhciBjID0gYXJndW1lbnRzLmxlbmd0aCwgciA9IGMgPCAzID8gdGFyZ2V0IDogZGVzYyA9PT0gbnVsbCA/IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KSA6IGRlc2MsIGQ7XHJcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QuZGVjb3JhdGUgPT09IFwiZnVuY3Rpb25cIikgciA9IFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpO1xyXG4gICAgZWxzZSBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgaWYgKGQgPSBkZWNvcmF0b3JzW2ldKSByID0gKGMgPCAzID8gZChyKSA6IGMgPiAzID8gZCh0YXJnZXQsIGtleSwgcikgOiBkKHRhcmdldCwga2V5KSkgfHwgcjtcclxuICAgIHJldHVybiBjID4gMyAmJiByICYmIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgciksIHI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3BhcmFtKHBhcmFtSW5kZXgsIGRlY29yYXRvcikge1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQsIGtleSkgeyBkZWNvcmF0b3IodGFyZ2V0LCBrZXksIHBhcmFtSW5kZXgpOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2VzRGVjb3JhdGUoY3RvciwgZGVzY3JpcHRvckluLCBkZWNvcmF0b3JzLCBjb250ZXh0SW4sIGluaXRpYWxpemVycywgZXh0cmFJbml0aWFsaXplcnMpIHtcclxuICAgIGZ1bmN0aW9uIGFjY2VwdChmKSB7IGlmIChmICE9PSB2b2lkIDAgJiYgdHlwZW9mIGYgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkZ1bmN0aW9uIGV4cGVjdGVkXCIpOyByZXR1cm4gZjsgfVxyXG4gICAgdmFyIGtpbmQgPSBjb250ZXh0SW4ua2luZCwga2V5ID0ga2luZCA9PT0gXCJnZXR0ZXJcIiA/IFwiZ2V0XCIgOiBraW5kID09PSBcInNldHRlclwiID8gXCJzZXRcIiA6IFwidmFsdWVcIjtcclxuICAgIHZhciB0YXJnZXQgPSAhZGVzY3JpcHRvckluICYmIGN0b3IgPyBjb250ZXh0SW5bXCJzdGF0aWNcIl0gPyBjdG9yIDogY3Rvci5wcm90b3R5cGUgOiBudWxsO1xyXG4gICAgdmFyIGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9ySW4gfHwgKHRhcmdldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSkgOiB7fSk7XHJcbiAgICB2YXIgXywgZG9uZSA9IGZhbHNlO1xyXG4gICAgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgICB2YXIgY29udGV4dCA9IHt9O1xyXG4gICAgICAgIGZvciAodmFyIHAgaW4gY29udGV4dEluKSBjb250ZXh0W3BdID0gcCA9PT0gXCJhY2Nlc3NcIiA/IHt9IDogY29udGV4dEluW3BdO1xyXG4gICAgICAgIGZvciAodmFyIHAgaW4gY29udGV4dEluLmFjY2VzcykgY29udGV4dC5hY2Nlc3NbcF0gPSBjb250ZXh0SW4uYWNjZXNzW3BdO1xyXG4gICAgICAgIGNvbnRleHQuYWRkSW5pdGlhbGl6ZXIgPSBmdW5jdGlvbiAoZikgeyBpZiAoZG9uZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBhZGQgaW5pdGlhbGl6ZXJzIGFmdGVyIGRlY29yYXRpb24gaGFzIGNvbXBsZXRlZFwiKTsgZXh0cmFJbml0aWFsaXplcnMucHVzaChhY2NlcHQoZiB8fCBudWxsKSk7IH07XHJcbiAgICAgICAgdmFyIHJlc3VsdCA9ICgwLCBkZWNvcmF0b3JzW2ldKShraW5kID09PSBcImFjY2Vzc29yXCIgPyB7IGdldDogZGVzY3JpcHRvci5nZXQsIHNldDogZGVzY3JpcHRvci5zZXQgfSA6IGRlc2NyaXB0b3Jba2V5XSwgY29udGV4dCk7XHJcbiAgICAgICAgaWYgKGtpbmQgPT09IFwiYWNjZXNzb3JcIikge1xyXG4gICAgICAgICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHR5cGVvZiByZXN1bHQgIT09IFwib2JqZWN0XCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYmplY3QgZXhwZWN0ZWRcIik7XHJcbiAgICAgICAgICAgIGlmIChfID0gYWNjZXB0KHJlc3VsdC5nZXQpKSBkZXNjcmlwdG9yLmdldCA9IF87XHJcbiAgICAgICAgICAgIGlmIChfID0gYWNjZXB0KHJlc3VsdC5zZXQpKSBkZXNjcmlwdG9yLnNldCA9IF87XHJcbiAgICAgICAgICAgIGlmIChfID0gYWNjZXB0KHJlc3VsdC5pbml0KSkgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKF8gPSBhY2NlcHQocmVzdWx0KSkge1xyXG4gICAgICAgICAgICBpZiAoa2luZCA9PT0gXCJmaWVsZFwiKSBpbml0aWFsaXplcnMudW5zaGlmdChfKTtcclxuICAgICAgICAgICAgZWxzZSBkZXNjcmlwdG9yW2tleV0gPSBfO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGlmICh0YXJnZXQpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGNvbnRleHRJbi5uYW1lLCBkZXNjcmlwdG9yKTtcclxuICAgIGRvbmUgPSB0cnVlO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcnVuSW5pdGlhbGl6ZXJzKHRoaXNBcmcsIGluaXRpYWxpemVycywgdmFsdWUpIHtcclxuICAgIHZhciB1c2VWYWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyO1xyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbml0aWFsaXplcnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICB2YWx1ZSA9IHVzZVZhbHVlID8gaW5pdGlhbGl6ZXJzW2ldLmNhbGwodGhpc0FyZywgdmFsdWUpIDogaW5pdGlhbGl6ZXJzW2ldLmNhbGwodGhpc0FyZyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdXNlVmFsdWUgPyB2YWx1ZSA6IHZvaWQgMDtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3Byb3BLZXkoeCkge1xyXG4gICAgcmV0dXJuIHR5cGVvZiB4ID09PSBcInN5bWJvbFwiID8geCA6IFwiXCIuY29uY2F0KHgpO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc2V0RnVuY3Rpb25OYW1lKGYsIG5hbWUsIHByZWZpeCkge1xyXG4gICAgaWYgKHR5cGVvZiBuYW1lID09PSBcInN5bWJvbFwiKSBuYW1lID0gbmFtZS5kZXNjcmlwdGlvbiA/IFwiW1wiLmNvbmNhdChuYW1lLmRlc2NyaXB0aW9uLCBcIl1cIikgOiBcIlwiO1xyXG4gICAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmLCBcIm5hbWVcIiwgeyBjb25maWd1cmFibGU6IHRydWUsIHZhbHVlOiBwcmVmaXggPyBcIlwiLmNvbmNhdChwcmVmaXgsIFwiIFwiLCBuYW1lKSA6IG5hbWUgfSk7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19tZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSkge1xyXG4gICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0Lm1ldGFkYXRhID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBSZWZsZWN0Lm1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXRlcih0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcclxuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxyXG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XHJcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxyXG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxyXG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XHJcbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xyXG4gICAgfSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2dlbmVyYXRvcih0aGlzQXJnLCBib2R5KSB7XHJcbiAgICB2YXIgXyA9IHsgbGFiZWw6IDAsIHNlbnQ6IGZ1bmN0aW9uKCkgeyBpZiAodFswXSAmIDEpIHRocm93IHRbMV07IHJldHVybiB0WzFdOyB9LCB0cnlzOiBbXSwgb3BzOiBbXSB9LCBmLCB5LCB0LCBnO1xyXG4gICAgcmV0dXJuIGcgPSB7IG5leHQ6IHZlcmIoMCksIFwidGhyb3dcIjogdmVyYigxKSwgXCJyZXR1cm5cIjogdmVyYigyKSB9LCB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgKGdbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpczsgfSksIGc7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgcmV0dXJuIGZ1bmN0aW9uICh2KSB7IHJldHVybiBzdGVwKFtuLCB2XSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHN0ZXAob3ApIHtcclxuICAgICAgICBpZiAoZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IGV4ZWN1dGluZy5cIik7XHJcbiAgICAgICAgd2hpbGUgKGcgJiYgKGcgPSAwLCBvcFswXSAmJiAoXyA9IDApKSwgXykgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0gb3BbMF0gJiAyID8geVtcInJldHVyblwiXSA6IG9wWzBdID8geVtcInRocm93XCJdIHx8ICgodCA9IHlbXCJyZXR1cm5cIl0pICYmIHQuY2FsbCh5KSwgMCkgOiB5Lm5leHQpICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0O1xyXG4gICAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gW29wWzBdICYgMiwgdC52YWx1ZV07XHJcbiAgICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgMDogY2FzZSAxOiB0ID0gb3A7IGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA0OiBfLmxhYmVsKys7IHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNzogb3AgPSBfLm9wcy5wb3AoKTsgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgXyA9IDA7IGNvbnRpbnVlOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCAob3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpKSB7IF8ubGFiZWwgPSBvcFsxXTsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHsgXy5sYWJlbCA9IHRbMV07IHQgPSBvcDsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTsgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkgeyBvcCA9IFs2LCBlXTsgeSA9IDA7IH0gZmluYWxseSB7IGYgPSB0ID0gMDsgfVxyXG4gICAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9O1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgdmFyIF9fY3JlYXRlQmluZGluZyA9IE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcclxuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XHJcbiAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XHJcbiAgICBpZiAoIWRlc2MgfHwgKFwiZ2V0XCIgaW4gZGVzYyA/ICFtLl9fZXNNb2R1bGUgOiBkZXNjLndyaXRhYmxlIHx8IGRlc2MuY29uZmlndXJhYmxlKSkge1xyXG4gICAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XHJcbiAgICB9XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIGRlc2MpO1xyXG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xyXG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcclxuICAgIG9bazJdID0gbVtrXTtcclxufSk7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19leHBvcnRTdGFyKG0sIG8pIHtcclxuICAgIGZvciAodmFyIHAgaW4gbSkgaWYgKHAgIT09IFwiZGVmYXVsdFwiICYmICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobywgcCkpIF9fY3JlYXRlQmluZGluZyhvLCBtLCBwKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fdmFsdWVzKG8pIHtcclxuICAgIHZhciBzID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIFN5bWJvbC5pdGVyYXRvciwgbSA9IHMgJiYgb1tzXSwgaSA9IDA7XHJcbiAgICBpZiAobSkgcmV0dXJuIG0uY2FsbChvKTtcclxuICAgIGlmIChvICYmIHR5cGVvZiBvLmxlbmd0aCA9PT0gXCJudW1iZXJcIikgcmV0dXJuIHtcclxuICAgICAgICBuZXh0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGlmIChvICYmIGkgPj0gby5sZW5ndGgpIG8gPSB2b2lkIDA7XHJcbiAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBvICYmIG9baSsrXSwgZG9uZTogIW8gfTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihzID8gXCJPYmplY3QgaXMgbm90IGl0ZXJhYmxlLlwiIDogXCJTeW1ib2wuaXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19yZWFkKG8sIG4pIHtcclxuICAgIHZhciBtID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9bU3ltYm9sLml0ZXJhdG9yXTtcclxuICAgIGlmICghbSkgcmV0dXJuIG87XHJcbiAgICB2YXIgaSA9IG0uY2FsbChvKSwgciwgYXIgPSBbXSwgZTtcclxuICAgIHRyeSB7XHJcbiAgICAgICAgd2hpbGUgKChuID09PSB2b2lkIDAgfHwgbi0tID4gMCkgJiYgIShyID0gaS5uZXh0KCkpLmRvbmUpIGFyLnB1c2goci52YWx1ZSk7XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZXJyb3IpIHsgZSA9IHsgZXJyb3I6IGVycm9yIH07IH1cclxuICAgIGZpbmFsbHkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGlmIChyICYmICFyLmRvbmUgJiYgKG0gPSBpW1wicmV0dXJuXCJdKSkgbS5jYWxsKGkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaW5hbGx5IHsgaWYgKGUpIHRocm93IGUuZXJyb3I7IH1cclxuICAgIH1cclxuICAgIHJldHVybiBhcjtcclxufVxyXG5cclxuLyoqIEBkZXByZWNhdGVkICovXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZCgpIHtcclxuICAgIGZvciAodmFyIGFyID0gW10sIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIGFyID0gYXIuY29uY2F0KF9fcmVhZChhcmd1bWVudHNbaV0pKTtcclxuICAgIHJldHVybiBhcjtcclxufVxyXG5cclxuLyoqIEBkZXByZWNhdGVkICovXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZEFycmF5cygpIHtcclxuICAgIGZvciAodmFyIHMgPSAwLCBpID0gMCwgaWwgPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgaWw7IGkrKykgcyArPSBhcmd1bWVudHNbaV0ubGVuZ3RoO1xyXG4gICAgZm9yICh2YXIgciA9IEFycmF5KHMpLCBrID0gMCwgaSA9IDA7IGkgPCBpbDsgaSsrKVxyXG4gICAgICAgIGZvciAodmFyIGEgPSBhcmd1bWVudHNbaV0sIGogPSAwLCBqbCA9IGEubGVuZ3RoOyBqIDwgamw7IGorKywgaysrKVxyXG4gICAgICAgICAgICByW2tdID0gYVtqXTtcclxuICAgIHJldHVybiByO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWRBcnJheSh0bywgZnJvbSwgcGFjaykge1xyXG4gICAgaWYgKHBhY2sgfHwgYXJndW1lbnRzLmxlbmd0aCA9PT0gMikgZm9yICh2YXIgaSA9IDAsIGwgPSBmcm9tLmxlbmd0aCwgYXI7IGkgPCBsOyBpKyspIHtcclxuICAgICAgICBpZiAoYXIgfHwgIShpIGluIGZyb20pKSB7XHJcbiAgICAgICAgICAgIGlmICghYXIpIGFyID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSwgMCwgaSk7XHJcbiAgICAgICAgICAgIGFyW2ldID0gZnJvbVtpXTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdG8uY29uY2F0KGFyIHx8IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20pKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXQodikge1xyXG4gICAgcmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBfX2F3YWl0ID8gKHRoaXMudiA9IHYsIHRoaXMpIDogbmV3IF9fYXdhaXQodik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jR2VuZXJhdG9yKHRoaXNBcmcsIF9hcmd1bWVudHMsIGdlbmVyYXRvcikge1xyXG4gICAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxuICAgIHZhciBnID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pLCBpLCBxID0gW107XHJcbiAgICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgaWYgKGdbbl0pIGlbbl0gPSBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKGEsIGIpIHsgcS5wdXNoKFtuLCB2LCBhLCBiXSkgPiAxIHx8IHJlc3VtZShuLCB2KTsgfSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHJlc3VtZShuLCB2KSB7IHRyeSB7IHN0ZXAoZ1tuXSh2KSk7IH0gY2F0Y2ggKGUpIHsgc2V0dGxlKHFbMF1bM10sIGUpOyB9IH1cclxuICAgIGZ1bmN0aW9uIHN0ZXAocikgeyByLnZhbHVlIGluc3RhbmNlb2YgX19hd2FpdCA/IFByb21pc2UucmVzb2x2ZShyLnZhbHVlLnYpLnRoZW4oZnVsZmlsbCwgcmVqZWN0KSA6IHNldHRsZShxWzBdWzJdLCByKTsgfVxyXG4gICAgZnVuY3Rpb24gZnVsZmlsbCh2YWx1ZSkgeyByZXN1bWUoXCJuZXh0XCIsIHZhbHVlKTsgfVxyXG4gICAgZnVuY3Rpb24gcmVqZWN0KHZhbHVlKSB7IHJlc3VtZShcInRocm93XCIsIHZhbHVlKTsgfVxyXG4gICAgZnVuY3Rpb24gc2V0dGxlKGYsIHYpIHsgaWYgKGYodiksIHEuc2hpZnQoKSwgcS5sZW5ndGgpIHJlc3VtZShxWzBdWzBdLCBxWzBdWzFdKTsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0RlbGVnYXRvcihvKSB7XHJcbiAgICB2YXIgaSwgcDtcclxuICAgIHJldHVybiBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiwgZnVuY3Rpb24gKGUpIHsgdGhyb3cgZTsgfSksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4sIGYpIHsgaVtuXSA9IG9bbl0gPyBmdW5jdGlvbiAodikgeyByZXR1cm4gKHAgPSAhcCkgPyB7IHZhbHVlOiBfX2F3YWl0KG9bbl0odikpLCBkb25lOiBmYWxzZSB9IDogZiA/IGYodikgOiB2OyB9IDogZjsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY1ZhbHVlcyhvKSB7XHJcbiAgICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgdmFyIG0gPSBvW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSwgaTtcclxuICAgIHJldHVybiBtID8gbS5jYWxsKG8pIDogKG8gPSB0eXBlb2YgX192YWx1ZXMgPT09IFwiZnVuY3Rpb25cIiA/IF9fdmFsdWVzKG8pIDogb1tTeW1ib2wuaXRlcmF0b3JdKCksIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpKTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyBpW25dID0gb1tuXSAmJiBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgeyB2ID0gb1tuXSh2KSwgc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgdi5kb25lLCB2LnZhbHVlKTsgfSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHNldHRsZShyZXNvbHZlLCByZWplY3QsIGQsIHYpIHsgUHJvbWlzZS5yZXNvbHZlKHYpLnRoZW4oZnVuY3Rpb24odikgeyByZXNvbHZlKHsgdmFsdWU6IHYsIGRvbmU6IGQgfSk7IH0sIHJlamVjdCk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fbWFrZVRlbXBsYXRlT2JqZWN0KGNvb2tlZCwgcmF3KSB7XHJcbiAgICBpZiAoT2JqZWN0LmRlZmluZVByb3BlcnR5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb29rZWQsIFwicmF3XCIsIHsgdmFsdWU6IHJhdyB9KTsgfSBlbHNlIHsgY29va2VkLnJhdyA9IHJhdzsgfVxyXG4gICAgcmV0dXJuIGNvb2tlZDtcclxufTtcclxuXHJcbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSBPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcclxufSkgOiBmdW5jdGlvbihvLCB2KSB7XHJcbiAgICBvW1wiZGVmYXVsdFwiXSA9IHY7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnRTdGFyKG1vZCkge1xyXG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcclxuICAgIHZhciByZXN1bHQgPSB7fTtcclxuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChrICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrKTtcclxuICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnREZWZhdWx0KG1vZCkge1xyXG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBkZWZhdWx0OiBtb2QgfTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRHZXQocmVjZWl2ZXIsIHN0YXRlLCBraW5kLCBmKSB7XHJcbiAgICBpZiAoa2luZCA9PT0gXCJhXCIgJiYgIWYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIGFjY2Vzc29yIHdhcyBkZWZpbmVkIHdpdGhvdXQgYSBnZXR0ZXJcIik7XHJcbiAgICBpZiAodHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciAhPT0gc3RhdGUgfHwgIWYgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCByZWFkIHByaXZhdGUgbWVtYmVyIGZyb20gYW4gb2JqZWN0IHdob3NlIGNsYXNzIGRpZCBub3QgZGVjbGFyZSBpdFwiKTtcclxuICAgIHJldHVybiBraW5kID09PSBcIm1cIiA/IGYgOiBraW5kID09PSBcImFcIiA/IGYuY2FsbChyZWNlaXZlcikgOiBmID8gZi52YWx1ZSA6IHN0YXRlLmdldChyZWNlaXZlcik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHJlY2VpdmVyLCBzdGF0ZSwgdmFsdWUsIGtpbmQsIGYpIHtcclxuICAgIGlmIChraW5kID09PSBcIm1cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgbWV0aG9kIGlzIG5vdCB3cml0YWJsZVwiKTtcclxuICAgIGlmIChraW5kID09PSBcImFcIiAmJiAhZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgYWNjZXNzb3Igd2FzIGRlZmluZWQgd2l0aG91dCBhIHNldHRlclwiKTtcclxuICAgIGlmICh0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyICE9PSBzdGF0ZSB8fCAhZiA6ICFzdGF0ZS5oYXMocmVjZWl2ZXIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHdyaXRlIHByaXZhdGUgbWVtYmVyIHRvIGFuIG9iamVjdCB3aG9zZSBjbGFzcyBkaWQgbm90IGRlY2xhcmUgaXRcIik7XHJcbiAgICByZXR1cm4gKGtpbmQgPT09IFwiYVwiID8gZi5jYWxsKHJlY2VpdmVyLCB2YWx1ZSkgOiBmID8gZi52YWx1ZSA9IHZhbHVlIDogc3RhdGUuc2V0KHJlY2VpdmVyLCB2YWx1ZSkpLCB2YWx1ZTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRJbihzdGF0ZSwgcmVjZWl2ZXIpIHtcclxuICAgIGlmIChyZWNlaXZlciA9PT0gbnVsbCB8fCAodHlwZW9mIHJlY2VpdmVyICE9PSBcIm9iamVjdFwiICYmIHR5cGVvZiByZWNlaXZlciAhPT0gXCJmdW5jdGlvblwiKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCB1c2UgJ2luJyBvcGVyYXRvciBvbiBub24tb2JqZWN0XCIpO1xyXG4gICAgcmV0dXJuIHR5cGVvZiBzdGF0ZSA9PT0gXCJmdW5jdGlvblwiID8gcmVjZWl2ZXIgPT09IHN0YXRlIDogc3RhdGUuaGFzKHJlY2VpdmVyKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYWRkRGlzcG9zYWJsZVJlc291cmNlKGVudiwgdmFsdWUsIGFzeW5jKSB7XHJcbiAgICBpZiAodmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHZvaWQgMCkge1xyXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYmplY3QgZXhwZWN0ZWQuXCIpO1xyXG4gICAgICAgIHZhciBkaXNwb3NlO1xyXG4gICAgICAgIGlmIChhc3luYykge1xyXG4gICAgICAgICAgICBpZiAoIVN5bWJvbC5hc3luY0Rpc3Bvc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNEaXNwb3NlIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxuICAgICAgICAgICAgZGlzcG9zZSA9IHZhbHVlW1N5bWJvbC5hc3luY0Rpc3Bvc2VdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZGlzcG9zZSA9PT0gdm9pZCAwKSB7XHJcbiAgICAgICAgICAgIGlmICghU3ltYm9sLmRpc3Bvc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuZGlzcG9zZSBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICAgICAgICAgIGRpc3Bvc2UgPSB2YWx1ZVtTeW1ib2wuZGlzcG9zZV07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0eXBlb2YgZGlzcG9zZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT2JqZWN0IG5vdCBkaXNwb3NhYmxlLlwiKTtcclxuICAgICAgICBlbnYuc3RhY2sucHVzaCh7IHZhbHVlOiB2YWx1ZSwgZGlzcG9zZTogZGlzcG9zZSwgYXN5bmM6IGFzeW5jIH0pO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoYXN5bmMpIHtcclxuICAgICAgICBlbnYuc3RhY2sucHVzaCh7IGFzeW5jOiB0cnVlIH0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHZhbHVlO1xyXG59XHJcblxyXG52YXIgX1N1cHByZXNzZWRFcnJvciA9IHR5cGVvZiBTdXBwcmVzc2VkRXJyb3IgPT09IFwiZnVuY3Rpb25cIiA/IFN1cHByZXNzZWRFcnJvciA6IGZ1bmN0aW9uIChlcnJvciwgc3VwcHJlc3NlZCwgbWVzc2FnZSkge1xyXG4gICAgdmFyIGUgPSBuZXcgRXJyb3IobWVzc2FnZSk7XHJcbiAgICByZXR1cm4gZS5uYW1lID0gXCJTdXBwcmVzc2VkRXJyb3JcIiwgZS5lcnJvciA9IGVycm9yLCBlLnN1cHByZXNzZWQgPSBzdXBwcmVzc2VkLCBlO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZGlzcG9zZVJlc291cmNlcyhlbnYpIHtcclxuICAgIGZ1bmN0aW9uIGZhaWwoZSkge1xyXG4gICAgICAgIGVudi5lcnJvciA9IGVudi5oYXNFcnJvciA/IG5ldyBfU3VwcHJlc3NlZEVycm9yKGUsIGVudi5lcnJvciwgXCJBbiBlcnJvciB3YXMgc3VwcHJlc3NlZCBkdXJpbmcgZGlzcG9zYWwuXCIpIDogZTtcclxuICAgICAgICBlbnYuaGFzRXJyb3IgPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgZnVuY3Rpb24gbmV4dCgpIHtcclxuICAgICAgICB3aGlsZSAoZW52LnN0YWNrLmxlbmd0aCkge1xyXG4gICAgICAgICAgICB2YXIgcmVjID0gZW52LnN0YWNrLnBvcCgpO1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHJlYy5kaXNwb3NlICYmIHJlYy5kaXNwb3NlLmNhbGwocmVjLnZhbHVlKTtcclxuICAgICAgICAgICAgICAgIGlmIChyZWMuYXN5bmMpIHJldHVybiBQcm9taXNlLnJlc29sdmUocmVzdWx0KS50aGVuKG5leHQsIGZ1bmN0aW9uKGUpIHsgZmFpbChlKTsgcmV0dXJuIG5leHQoKTsgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIGZhaWwoZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGVudi5oYXNFcnJvcikgdGhyb3cgZW52LmVycm9yO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5leHQoKTtcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQge1xyXG4gICAgX19leHRlbmRzOiBfX2V4dGVuZHMsXHJcbiAgICBfX2Fzc2lnbjogX19hc3NpZ24sXHJcbiAgICBfX3Jlc3Q6IF9fcmVzdCxcclxuICAgIF9fZGVjb3JhdGU6IF9fZGVjb3JhdGUsXHJcbiAgICBfX3BhcmFtOiBfX3BhcmFtLFxyXG4gICAgX19tZXRhZGF0YTogX19tZXRhZGF0YSxcclxuICAgIF9fYXdhaXRlcjogX19hd2FpdGVyLFxyXG4gICAgX19nZW5lcmF0b3I6IF9fZ2VuZXJhdG9yLFxyXG4gICAgX19jcmVhdGVCaW5kaW5nOiBfX2NyZWF0ZUJpbmRpbmcsXHJcbiAgICBfX2V4cG9ydFN0YXI6IF9fZXhwb3J0U3RhcixcclxuICAgIF9fdmFsdWVzOiBfX3ZhbHVlcyxcclxuICAgIF9fcmVhZDogX19yZWFkLFxyXG4gICAgX19zcHJlYWQ6IF9fc3ByZWFkLFxyXG4gICAgX19zcHJlYWRBcnJheXM6IF9fc3ByZWFkQXJyYXlzLFxyXG4gICAgX19zcHJlYWRBcnJheTogX19zcHJlYWRBcnJheSxcclxuICAgIF9fYXdhaXQ6IF9fYXdhaXQsXHJcbiAgICBfX2FzeW5jR2VuZXJhdG9yOiBfX2FzeW5jR2VuZXJhdG9yLFxyXG4gICAgX19hc3luY0RlbGVnYXRvcjogX19hc3luY0RlbGVnYXRvcixcclxuICAgIF9fYXN5bmNWYWx1ZXM6IF9fYXN5bmNWYWx1ZXMsXHJcbiAgICBfX21ha2VUZW1wbGF0ZU9iamVjdDogX19tYWtlVGVtcGxhdGVPYmplY3QsXHJcbiAgICBfX2ltcG9ydFN0YXI6IF9faW1wb3J0U3RhcixcclxuICAgIF9faW1wb3J0RGVmYXVsdDogX19pbXBvcnREZWZhdWx0LFxyXG4gICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldDogX19jbGFzc1ByaXZhdGVGaWVsZEdldCxcclxuICAgIF9fY2xhc3NQcml2YXRlRmllbGRTZXQ6IF9fY2xhc3NQcml2YXRlRmllbGRTZXQsXHJcbiAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkSW46IF9fY2xhc3NQcml2YXRlRmllbGRJbixcclxuICAgIF9fYWRkRGlzcG9zYWJsZVJlc291cmNlOiBfX2FkZERpc3Bvc2FibGVSZXNvdXJjZSxcclxuICAgIF9fZGlzcG9zZVJlc291cmNlczogX19kaXNwb3NlUmVzb3VyY2VzLFxyXG59O1xyXG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///8\n')},function(module,exports){eval('module.exports = require("uxp");//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOS5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy9leHRlcm5hbCBcInV4cFwiPzRhY2MiXSwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwidXhwXCIpOyJdLCJtYXBwaW5ncyI6IkFBQUEiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///9\n')},function(module,exports,__webpack_require__){eval("const debug = __webpack_require__(36)\nconst { MAX_LENGTH, MAX_SAFE_INTEGER } = __webpack_require__(35)\nconst { safeRe: re, safeSrc: src, t } = __webpack_require__(29)\n\nconst parseOptions = __webpack_require__(48)\nconst { compareIdentifiers } = __webpack_require__(65)\nclass SemVer {\n  constructor (version, options) {\n    options = parseOptions(options)\n\n    if (version instanceof SemVer) {\n      if (version.loose === !!options.loose &&\n        version.includePrerelease === !!options.includePrerelease) {\n        return version\n      } else {\n        version = version.version\n      }\n    } else if (typeof version !== 'string') {\n      throw new TypeError(`Invalid version. Must be a string. Got type \"${typeof version}\".`)\n    }\n\n    if (version.length > MAX_LENGTH) {\n      throw new TypeError(\n        `version is longer than ${MAX_LENGTH} characters`\n      )\n    }\n\n    debug('SemVer', version, options)\n    this.options = options\n    this.loose = !!options.loose\n    // this isn't actually relevant for versions, but keep it so that we\n    // don't run into trouble passing this.options around.\n    this.includePrerelease = !!options.includePrerelease\n\n    const m = version.trim().match(options.loose ? re[t.LOOSE] : re[t.FULL])\n\n    if (!m) {\n      throw new TypeError(`Invalid Version: ${version}`)\n    }\n\n    this.raw = version\n\n    // these are actually numbers\n    this.major = +m[1]\n    this.minor = +m[2]\n    this.patch = +m[3]\n\n    if (this.major > MAX_SAFE_INTEGER || this.major < 0) {\n      throw new TypeError('Invalid major version')\n    }\n\n    if (this.minor > MAX_SAFE_INTEGER || this.minor < 0) {\n      throw new TypeError('Invalid minor version')\n    }\n\n    if (this.patch > MAX_SAFE_INTEGER || this.patch < 0) {\n      throw new TypeError('Invalid patch version')\n    }\n\n    // numberify any prerelease numeric ids\n    if (!m[4]) {\n      this.prerelease = []\n    } else {\n      this.prerelease = m[4].split('.').map((id) => {\n        if (/^[0-9]+$/.test(id)) {\n          const num = +id\n          if (num >= 0 && num < MAX_SAFE_INTEGER) {\n            return num\n          }\n        }\n        return id\n      })\n    }\n\n    this.build = m[5] ? m[5].split('.') : []\n    this.format()\n  }\n\n  format () {\n    this.version = `${this.major}.${this.minor}.${this.patch}`\n    if (this.prerelease.length) {\n      this.version += `-${this.prerelease.join('.')}`\n    }\n    return this.version\n  }\n\n  toString () {\n    return this.version\n  }\n\n  compare (other) {\n    debug('SemVer.compare', this.version, this.options, other)\n    if (!(other instanceof SemVer)) {\n      if (typeof other === 'string' && other === this.version) {\n        return 0\n      }\n      other = new SemVer(other, this.options)\n    }\n\n    if (other.version === this.version) {\n      return 0\n    }\n\n    return this.compareMain(other) || this.comparePre(other)\n  }\n\n  compareMain (other) {\n    if (!(other instanceof SemVer)) {\n      other = new SemVer(other, this.options)\n    }\n\n    return (\n      compareIdentifiers(this.major, other.major) ||\n      compareIdentifiers(this.minor, other.minor) ||\n      compareIdentifiers(this.patch, other.patch)\n    )\n  }\n\n  comparePre (other) {\n    if (!(other instanceof SemVer)) {\n      other = new SemVer(other, this.options)\n    }\n\n    // NOT having a prerelease is > having one\n    if (this.prerelease.length && !other.prerelease.length) {\n      return -1\n    } else if (!this.prerelease.length && other.prerelease.length) {\n      return 1\n    } else if (!this.prerelease.length && !other.prerelease.length) {\n      return 0\n    }\n\n    let i = 0\n    do {\n      const a = this.prerelease[i]\n      const b = other.prerelease[i]\n      debug('prerelease compare', i, a, b)\n      if (a === undefined && b === undefined) {\n        return 0\n      } else if (b === undefined) {\n        return 1\n      } else if (a === undefined) {\n        return -1\n      } else if (a === b) {\n        continue\n      } else {\n        return compareIdentifiers(a, b)\n      }\n    } while (++i)\n  }\n\n  compareBuild (other) {\n    if (!(other instanceof SemVer)) {\n      other = new SemVer(other, this.options)\n    }\n\n    let i = 0\n    do {\n      const a = this.build[i]\n      const b = other.build[i]\n      debug('build compare', i, a, b)\n      if (a === undefined && b === undefined) {\n        return 0\n      } else if (b === undefined) {\n        return 1\n      } else if (a === undefined) {\n        return -1\n      } else if (a === b) {\n        continue\n      } else {\n        return compareIdentifiers(a, b)\n      }\n    } while (++i)\n  }\n\n  // preminor will bump the version up to the next minor release, and immediately\n  // down to pre-release. premajor and prepatch work the same way.\n  inc (release, identifier, identifierBase) {\n    if (release.startsWith('pre')) {\n      if (!identifier && identifierBase === false) {\n        throw new Error('invalid increment argument: identifier is empty')\n      }\n      // Avoid an invalid semver results\n      if (identifier) {\n        const r = new RegExp(`^${this.options.loose ? src[t.PRERELEASELOOSE] : src[t.PRERELEASE]}$`)\n        const match = `-${identifier}`.match(r)\n        if (!match || match[1] !== identifier) {\n          throw new Error(`invalid identifier: ${identifier}`)\n        }\n      }\n    }\n\n    switch (release) {\n      case 'premajor':\n        this.prerelease.length = 0\n        this.patch = 0\n        this.minor = 0\n        this.major++\n        this.inc('pre', identifier, identifierBase)\n        break\n      case 'preminor':\n        this.prerelease.length = 0\n        this.patch = 0\n        this.minor++\n        this.inc('pre', identifier, identifierBase)\n        break\n      case 'prepatch':\n        // If this is already a prerelease, it will bump to the next version\n        // drop any prereleases that might already exist, since they are not\n        // relevant at this point.\n        this.prerelease.length = 0\n        this.inc('patch', identifier, identifierBase)\n        this.inc('pre', identifier, identifierBase)\n        break\n      // If the input is a non-prerelease version, this acts the same as\n      // prepatch.\n      case 'prerelease':\n        if (this.prerelease.length === 0) {\n          this.inc('patch', identifier, identifierBase)\n        }\n        this.inc('pre', identifier, identifierBase)\n        break\n      case 'release':\n        if (this.prerelease.length === 0) {\n          throw new Error(`version ${this.raw} is not a prerelease`)\n        }\n        this.prerelease.length = 0\n        break\n\n      case 'major':\n        // If this is a pre-major version, bump up to the same major version.\n        // Otherwise increment major.\n        // 1.0.0-5 bumps to 1.0.0\n        // 1.1.0 bumps to 2.0.0\n        if (\n          this.minor !== 0 ||\n          this.patch !== 0 ||\n          this.prerelease.length === 0\n        ) {\n          this.major++\n        }\n        this.minor = 0\n        this.patch = 0\n        this.prerelease = []\n        break\n      case 'minor':\n        // If this is a pre-minor version, bump up to the same minor version.\n        // Otherwise increment minor.\n        // 1.2.0-5 bumps to 1.2.0\n        // 1.2.1 bumps to 1.3.0\n        if (this.patch !== 0 || this.prerelease.length === 0) {\n          this.minor++\n        }\n        this.patch = 0\n        this.prerelease = []\n        break\n      case 'patch':\n        // If this is not a pre-release version, it will increment the patch.\n        // If it is a pre-release it will bump up to the same patch version.\n        // 1.2.0-5 patches to 1.2.0\n        // 1.2.0 patches to 1.2.1\n        if (this.prerelease.length === 0) {\n          this.patch++\n        }\n        this.prerelease = []\n        break\n      // This probably shouldn't be used publicly.\n      // 1.0.0 'pre' would become 1.0.0-0 which is the wrong direction.\n      case 'pre': {\n        const base = Number(identifierBase) ? 1 : 0\n\n        if (this.prerelease.length === 0) {\n          this.prerelease = [base]\n        } else {\n          let i = this.prerelease.length\n          while (--i >= 0) {\n            if (typeof this.prerelease[i] === 'number') {\n              this.prerelease[i]++\n              i = -2\n            }\n          }\n          if (i === -1) {\n            // didn't increment anything\n            if (identifier === this.prerelease.join('.') && identifierBase === false) {\n              throw new Error('invalid increment argument: identifier already exists')\n            }\n            this.prerelease.push(base)\n          }\n        }\n        if (identifier) {\n          // 1.2.0-beta.1 bumps to 1.2.0-beta.2,\n          // 1.2.0-beta.fooblz or 1.2.0-beta bumps to 1.2.0-beta.0\n          let prerelease = [identifier, base]\n          if (identifierBase === false) {\n            prerelease = [identifier]\n          }\n          if (compareIdentifiers(this.prerelease[0], identifier) === 0) {\n            if (isNaN(this.prerelease[1])) {\n              this.prerelease = prerelease\n            }\n          } else {\n            this.prerelease = prerelease\n          }\n        }\n        break\n      }\n      default:\n        throw new Error(`invalid increment argument: ${release}`)\n    }\n    this.raw = this.format()\n    if (this.build.length) {\n      this.raw += `+${this.build.join('.')}`\n    }\n    return this\n  }\n}\n\nmodule.exports = SemVer\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTAuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRvcnEtbmF0aXZlL3JlYWN0LXNwZWN0cnVtL25vZGVfbW9kdWxlcy9zZW12ZXIvY2xhc3Nlcy9zZW12ZXIuanM/ZDA3MiJdLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBkZWJ1ZyA9IHJlcXVpcmUoJy4uL2ludGVybmFsL2RlYnVnJylcbmNvbnN0IHsgTUFYX0xFTkdUSCwgTUFYX1NBRkVfSU5URUdFUiB9ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWwvY29uc3RhbnRzJylcbmNvbnN0IHsgc2FmZVJlOiByZSwgc2FmZVNyYzogc3JjLCB0IH0gPSByZXF1aXJlKCcuLi9pbnRlcm5hbC9yZScpXG5cbmNvbnN0IHBhcnNlT3B0aW9ucyA9IHJlcXVpcmUoJy4uL2ludGVybmFsL3BhcnNlLW9wdGlvbnMnKVxuY29uc3QgeyBjb21wYXJlSWRlbnRpZmllcnMgfSA9IHJlcXVpcmUoJy4uL2ludGVybmFsL2lkZW50aWZpZXJzJylcbmNsYXNzIFNlbVZlciB7XG4gIGNvbnN0cnVjdG9yICh2ZXJzaW9uLCBvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IHBhcnNlT3B0aW9ucyhvcHRpb25zKVxuXG4gICAgaWYgKHZlcnNpb24gaW5zdGFuY2VvZiBTZW1WZXIpIHtcbiAgICAgIGlmICh2ZXJzaW9uLmxvb3NlID09PSAhIW9wdGlvbnMubG9vc2UgJiZcbiAgICAgICAgdmVyc2lvbi5pbmNsdWRlUHJlcmVsZWFzZSA9PT0gISFvcHRpb25zLmluY2x1ZGVQcmVyZWxlYXNlKSB7XG4gICAgICAgIHJldHVybiB2ZXJzaW9uXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2ZXJzaW9uID0gdmVyc2lvbi52ZXJzaW9uXG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdmVyc2lvbiAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEludmFsaWQgdmVyc2lvbi4gTXVzdCBiZSBhIHN0cmluZy4gR290IHR5cGUgXCIke3R5cGVvZiB2ZXJzaW9ufVwiLmApXG4gICAgfVxuXG4gICAgaWYgKHZlcnNpb24ubGVuZ3RoID4gTUFYX0xFTkdUSCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgYHZlcnNpb24gaXMgbG9uZ2VyIHRoYW4gJHtNQVhfTEVOR1RIfSBjaGFyYWN0ZXJzYFxuICAgICAgKVxuICAgIH1cblxuICAgIGRlYnVnKCdTZW1WZXInLCB2ZXJzaW9uLCBvcHRpb25zKVxuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnNcbiAgICB0aGlzLmxvb3NlID0gISFvcHRpb25zLmxvb3NlXG4gICAgLy8gdGhpcyBpc24ndCBhY3R1YWxseSByZWxldmFudCBmb3IgdmVyc2lvbnMsIGJ1dCBrZWVwIGl0IHNvIHRoYXQgd2VcbiAgICAvLyBkb24ndCBydW4gaW50byB0cm91YmxlIHBhc3NpbmcgdGhpcy5vcHRpb25zIGFyb3VuZC5cbiAgICB0aGlzLmluY2x1ZGVQcmVyZWxlYXNlID0gISFvcHRpb25zLmluY2x1ZGVQcmVyZWxlYXNlXG5cbiAgICBjb25zdCBtID0gdmVyc2lvbi50cmltKCkubWF0Y2gob3B0aW9ucy5sb29zZSA/IHJlW3QuTE9PU0VdIDogcmVbdC5GVUxMXSlcblxuICAgIGlmICghbSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgSW52YWxpZCBWZXJzaW9uOiAke3ZlcnNpb259YClcbiAgICB9XG5cbiAgICB0aGlzLnJhdyA9IHZlcnNpb25cblxuICAgIC8vIHRoZXNlIGFyZSBhY3R1YWxseSBudW1iZXJzXG4gICAgdGhpcy5tYWpvciA9ICttWzFdXG4gICAgdGhpcy5taW5vciA9ICttWzJdXG4gICAgdGhpcy5wYXRjaCA9ICttWzNdXG5cbiAgICBpZiAodGhpcy5tYWpvciA+IE1BWF9TQUZFX0lOVEVHRVIgfHwgdGhpcy5tYWpvciA8IDApIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgbWFqb3IgdmVyc2lvbicpXG4gICAgfVxuXG4gICAgaWYgKHRoaXMubWlub3IgPiBNQVhfU0FGRV9JTlRFR0VSIHx8IHRoaXMubWlub3IgPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIG1pbm9yIHZlcnNpb24nKVxuICAgIH1cblxuICAgIGlmICh0aGlzLnBhdGNoID4gTUFYX1NBRkVfSU5URUdFUiB8fCB0aGlzLnBhdGNoIDwgMCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBwYXRjaCB2ZXJzaW9uJylcbiAgICB9XG5cbiAgICAvLyBudW1iZXJpZnkgYW55IHByZXJlbGVhc2UgbnVtZXJpYyBpZHNcbiAgICBpZiAoIW1bNF0pIHtcbiAgICAgIHRoaXMucHJlcmVsZWFzZSA9IFtdXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucHJlcmVsZWFzZSA9IG1bNF0uc3BsaXQoJy4nKS5tYXAoKGlkKSA9PiB7XG4gICAgICAgIGlmICgvXlswLTldKyQvLnRlc3QoaWQpKSB7XG4gICAgICAgICAgY29uc3QgbnVtID0gK2lkXG4gICAgICAgICAgaWYgKG51bSA+PSAwICYmIG51bSA8IE1BWF9TQUZFX0lOVEVHRVIpIHtcbiAgICAgICAgICAgIHJldHVybiBudW1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlkXG4gICAgICB9KVxuICAgIH1cblxuICAgIHRoaXMuYnVpbGQgPSBtWzVdID8gbVs1XS5zcGxpdCgnLicpIDogW11cbiAgICB0aGlzLmZvcm1hdCgpXG4gIH1cblxuICBmb3JtYXQgKCkge1xuICAgIHRoaXMudmVyc2lvbiA9IGAke3RoaXMubWFqb3J9LiR7dGhpcy5taW5vcn0uJHt0aGlzLnBhdGNofWBcbiAgICBpZiAodGhpcy5wcmVyZWxlYXNlLmxlbmd0aCkge1xuICAgICAgdGhpcy52ZXJzaW9uICs9IGAtJHt0aGlzLnByZXJlbGVhc2Uuam9pbignLicpfWBcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMudmVyc2lvblxuICB9XG5cbiAgdG9TdHJpbmcgKCkge1xuICAgIHJldHVybiB0aGlzLnZlcnNpb25cbiAgfVxuXG4gIGNvbXBhcmUgKG90aGVyKSB7XG4gICAgZGVidWcoJ1NlbVZlci5jb21wYXJlJywgdGhpcy52ZXJzaW9uLCB0aGlzLm9wdGlvbnMsIG90aGVyKVxuICAgIGlmICghKG90aGVyIGluc3RhbmNlb2YgU2VtVmVyKSkge1xuICAgICAgaWYgKHR5cGVvZiBvdGhlciA9PT0gJ3N0cmluZycgJiYgb3RoZXIgPT09IHRoaXMudmVyc2lvbikge1xuICAgICAgICByZXR1cm4gMFxuICAgICAgfVxuICAgICAgb3RoZXIgPSBuZXcgU2VtVmVyKG90aGVyLCB0aGlzLm9wdGlvbnMpXG4gICAgfVxuXG4gICAgaWYgKG90aGVyLnZlcnNpb24gPT09IHRoaXMudmVyc2lvbikge1xuICAgICAgcmV0dXJuIDBcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5jb21wYXJlTWFpbihvdGhlcikgfHwgdGhpcy5jb21wYXJlUHJlKG90aGVyKVxuICB9XG5cbiAgY29tcGFyZU1haW4gKG90aGVyKSB7XG4gICAgaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBTZW1WZXIpKSB7XG4gICAgICBvdGhlciA9IG5ldyBTZW1WZXIob3RoZXIsIHRoaXMub3B0aW9ucylcbiAgICB9XG5cbiAgICByZXR1cm4gKFxuICAgICAgY29tcGFyZUlkZW50aWZpZXJzKHRoaXMubWFqb3IsIG90aGVyLm1ham9yKSB8fFxuICAgICAgY29tcGFyZUlkZW50aWZpZXJzKHRoaXMubWlub3IsIG90aGVyLm1pbm9yKSB8fFxuICAgICAgY29tcGFyZUlkZW50aWZpZXJzKHRoaXMucGF0Y2gsIG90aGVyLnBhdGNoKVxuICAgIClcbiAgfVxuXG4gIGNvbXBhcmVQcmUgKG90aGVyKSB7XG4gICAgaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBTZW1WZXIpKSB7XG4gICAgICBvdGhlciA9IG5ldyBTZW1WZXIob3RoZXIsIHRoaXMub3B0aW9ucylcbiAgICB9XG5cbiAgICAvLyBOT1QgaGF2aW5nIGEgcHJlcmVsZWFzZSBpcyA+IGhhdmluZyBvbmVcbiAgICBpZiAodGhpcy5wcmVyZWxlYXNlLmxlbmd0aCAmJiAhb3RoZXIucHJlcmVsZWFzZS5sZW5ndGgpIHtcbiAgICAgIHJldHVybiAtMVxuICAgIH0gZWxzZSBpZiAoIXRoaXMucHJlcmVsZWFzZS5sZW5ndGggJiYgb3RoZXIucHJlcmVsZWFzZS5sZW5ndGgpIHtcbiAgICAgIHJldHVybiAxXG4gICAgfSBlbHNlIGlmICghdGhpcy5wcmVyZWxlYXNlLmxlbmd0aCAmJiAhb3RoZXIucHJlcmVsZWFzZS5sZW5ndGgpIHtcbiAgICAgIHJldHVybiAwXG4gICAgfVxuXG4gICAgbGV0IGkgPSAwXG4gICAgZG8ge1xuICAgICAgY29uc3QgYSA9IHRoaXMucHJlcmVsZWFzZVtpXVxuICAgICAgY29uc3QgYiA9IG90aGVyLnByZXJlbGVhc2VbaV1cbiAgICAgIGRlYnVnKCdwcmVyZWxlYXNlIGNvbXBhcmUnLCBpLCBhLCBiKVxuICAgICAgaWYgKGEgPT09IHVuZGVmaW5lZCAmJiBiID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIDBcbiAgICAgIH0gZWxzZSBpZiAoYiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiAxXG4gICAgICB9IGVsc2UgaWYgKGEgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gLTFcbiAgICAgIH0gZWxzZSBpZiAoYSA9PT0gYikge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGNvbXBhcmVJZGVudGlmaWVycyhhLCBiKVxuICAgICAgfVxuICAgIH0gd2hpbGUgKCsraSlcbiAgfVxuXG4gIGNvbXBhcmVCdWlsZCAob3RoZXIpIHtcbiAgICBpZiAoIShvdGhlciBpbnN0YW5jZW9mIFNlbVZlcikpIHtcbiAgICAgIG90aGVyID0gbmV3IFNlbVZlcihvdGhlciwgdGhpcy5vcHRpb25zKVxuICAgIH1cblxuICAgIGxldCBpID0gMFxuICAgIGRvIHtcbiAgICAgIGNvbnN0IGEgPSB0aGlzLmJ1aWxkW2ldXG4gICAgICBjb25zdCBiID0gb3RoZXIuYnVpbGRbaV1cbiAgICAgIGRlYnVnKCdidWlsZCBjb21wYXJlJywgaSwgYSwgYilcbiAgICAgIGlmIChhID09PSB1bmRlZmluZWQgJiYgYiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiAwXG4gICAgICB9IGVsc2UgaWYgKGIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gMVxuICAgICAgfSBlbHNlIGlmIChhID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIC0xXG4gICAgICB9IGVsc2UgaWYgKGEgPT09IGIpIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBjb21wYXJlSWRlbnRpZmllcnMoYSwgYilcbiAgICAgIH1cbiAgICB9IHdoaWxlICgrK2kpXG4gIH1cblxuICAvLyBwcmVtaW5vciB3aWxsIGJ1bXAgdGhlIHZlcnNpb24gdXAgdG8gdGhlIG5leHQgbWlub3IgcmVsZWFzZSwgYW5kIGltbWVkaWF0ZWx5XG4gIC8vIGRvd24gdG8gcHJlLXJlbGVhc2UuIHByZW1ham9yIGFuZCBwcmVwYXRjaCB3b3JrIHRoZSBzYW1lIHdheS5cbiAgaW5jIChyZWxlYXNlLCBpZGVudGlmaWVyLCBpZGVudGlmaWVyQmFzZSkge1xuICAgIGlmIChyZWxlYXNlLnN0YXJ0c1dpdGgoJ3ByZScpKSB7XG4gICAgICBpZiAoIWlkZW50aWZpZXIgJiYgaWRlbnRpZmllckJhc2UgPT09IGZhbHNlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBpbmNyZW1lbnQgYXJndW1lbnQ6IGlkZW50aWZpZXIgaXMgZW1wdHknKVxuICAgICAgfVxuICAgICAgLy8gQXZvaWQgYW4gaW52YWxpZCBzZW12ZXIgcmVzdWx0c1xuICAgICAgaWYgKGlkZW50aWZpZXIpIHtcbiAgICAgICAgY29uc3QgciA9IG5ldyBSZWdFeHAoYF4ke3RoaXMub3B0aW9ucy5sb29zZSA/IHNyY1t0LlBSRVJFTEVBU0VMT09TRV0gOiBzcmNbdC5QUkVSRUxFQVNFXX0kYClcbiAgICAgICAgY29uc3QgbWF0Y2ggPSBgLSR7aWRlbnRpZmllcn1gLm1hdGNoKHIpXG4gICAgICAgIGlmICghbWF0Y2ggfHwgbWF0Y2hbMV0gIT09IGlkZW50aWZpZXIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgaWRlbnRpZmllcjogJHtpZGVudGlmaWVyfWApXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBzd2l0Y2ggKHJlbGVhc2UpIHtcbiAgICAgIGNhc2UgJ3ByZW1ham9yJzpcbiAgICAgICAgdGhpcy5wcmVyZWxlYXNlLmxlbmd0aCA9IDBcbiAgICAgICAgdGhpcy5wYXRjaCA9IDBcbiAgICAgICAgdGhpcy5taW5vciA9IDBcbiAgICAgICAgdGhpcy5tYWpvcisrXG4gICAgICAgIHRoaXMuaW5jKCdwcmUnLCBpZGVudGlmaWVyLCBpZGVudGlmaWVyQmFzZSlcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgJ3ByZW1pbm9yJzpcbiAgICAgICAgdGhpcy5wcmVyZWxlYXNlLmxlbmd0aCA9IDBcbiAgICAgICAgdGhpcy5wYXRjaCA9IDBcbiAgICAgICAgdGhpcy5taW5vcisrXG4gICAgICAgIHRoaXMuaW5jKCdwcmUnLCBpZGVudGlmaWVyLCBpZGVudGlmaWVyQmFzZSlcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgJ3ByZXBhdGNoJzpcbiAgICAgICAgLy8gSWYgdGhpcyBpcyBhbHJlYWR5IGEgcHJlcmVsZWFzZSwgaXQgd2lsbCBidW1wIHRvIHRoZSBuZXh0IHZlcnNpb25cbiAgICAgICAgLy8gZHJvcCBhbnkgcHJlcmVsZWFzZXMgdGhhdCBtaWdodCBhbHJlYWR5IGV4aXN0LCBzaW5jZSB0aGV5IGFyZSBub3RcbiAgICAgICAgLy8gcmVsZXZhbnQgYXQgdGhpcyBwb2ludC5cbiAgICAgICAgdGhpcy5wcmVyZWxlYXNlLmxlbmd0aCA9IDBcbiAgICAgICAgdGhpcy5pbmMoJ3BhdGNoJywgaWRlbnRpZmllciwgaWRlbnRpZmllckJhc2UpXG4gICAgICAgIHRoaXMuaW5jKCdwcmUnLCBpZGVudGlmaWVyLCBpZGVudGlmaWVyQmFzZSlcbiAgICAgICAgYnJlYWtcbiAgICAgIC8vIElmIHRoZSBpbnB1dCBpcyBhIG5vbi1wcmVyZWxlYXNlIHZlcnNpb24sIHRoaXMgYWN0cyB0aGUgc2FtZSBhc1xuICAgICAgLy8gcHJlcGF0Y2guXG4gICAgICBjYXNlICdwcmVyZWxlYXNlJzpcbiAgICAgICAgaWYgKHRoaXMucHJlcmVsZWFzZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICB0aGlzLmluYygncGF0Y2gnLCBpZGVudGlmaWVyLCBpZGVudGlmaWVyQmFzZSlcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmluYygncHJlJywgaWRlbnRpZmllciwgaWRlbnRpZmllckJhc2UpXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlICdyZWxlYXNlJzpcbiAgICAgICAgaWYgKHRoaXMucHJlcmVsZWFzZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHZlcnNpb24gJHt0aGlzLnJhd30gaXMgbm90IGEgcHJlcmVsZWFzZWApXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wcmVyZWxlYXNlLmxlbmd0aCA9IDBcbiAgICAgICAgYnJlYWtcblxuICAgICAgY2FzZSAnbWFqb3InOlxuICAgICAgICAvLyBJZiB0aGlzIGlzIGEgcHJlLW1ham9yIHZlcnNpb24sIGJ1bXAgdXAgdG8gdGhlIHNhbWUgbWFqb3IgdmVyc2lvbi5cbiAgICAgICAgLy8gT3RoZXJ3aXNlIGluY3JlbWVudCBtYWpvci5cbiAgICAgICAgLy8gMS4wLjAtNSBidW1wcyB0byAxLjAuMFxuICAgICAgICAvLyAxLjEuMCBidW1wcyB0byAyLjAuMFxuICAgICAgICBpZiAoXG4gICAgICAgICAgdGhpcy5taW5vciAhPT0gMCB8fFxuICAgICAgICAgIHRoaXMucGF0Y2ggIT09IDAgfHxcbiAgICAgICAgICB0aGlzLnByZXJlbGVhc2UubGVuZ3RoID09PSAwXG4gICAgICAgICkge1xuICAgICAgICAgIHRoaXMubWFqb3IrK1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubWlub3IgPSAwXG4gICAgICAgIHRoaXMucGF0Y2ggPSAwXG4gICAgICAgIHRoaXMucHJlcmVsZWFzZSA9IFtdXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlICdtaW5vcic6XG4gICAgICAgIC8vIElmIHRoaXMgaXMgYSBwcmUtbWlub3IgdmVyc2lvbiwgYnVtcCB1cCB0byB0aGUgc2FtZSBtaW5vciB2ZXJzaW9uLlxuICAgICAgICAvLyBPdGhlcndpc2UgaW5jcmVtZW50IG1pbm9yLlxuICAgICAgICAvLyAxLjIuMC01IGJ1bXBzIHRvIDEuMi4wXG4gICAgICAgIC8vIDEuMi4xIGJ1bXBzIHRvIDEuMy4wXG4gICAgICAgIGlmICh0aGlzLnBhdGNoICE9PSAwIHx8IHRoaXMucHJlcmVsZWFzZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICB0aGlzLm1pbm9yKytcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnBhdGNoID0gMFxuICAgICAgICB0aGlzLnByZXJlbGVhc2UgPSBbXVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSAncGF0Y2gnOlxuICAgICAgICAvLyBJZiB0aGlzIGlzIG5vdCBhIHByZS1yZWxlYXNlIHZlcnNpb24sIGl0IHdpbGwgaW5jcmVtZW50IHRoZSBwYXRjaC5cbiAgICAgICAgLy8gSWYgaXQgaXMgYSBwcmUtcmVsZWFzZSBpdCB3aWxsIGJ1bXAgdXAgdG8gdGhlIHNhbWUgcGF0Y2ggdmVyc2lvbi5cbiAgICAgICAgLy8gMS4yLjAtNSBwYXRjaGVzIHRvIDEuMi4wXG4gICAgICAgIC8vIDEuMi4wIHBhdGNoZXMgdG8gMS4yLjFcbiAgICAgICAgaWYgKHRoaXMucHJlcmVsZWFzZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICB0aGlzLnBhdGNoKytcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnByZXJlbGVhc2UgPSBbXVxuICAgICAgICBicmVha1xuICAgICAgLy8gVGhpcyBwcm9iYWJseSBzaG91bGRuJ3QgYmUgdXNlZCBwdWJsaWNseS5cbiAgICAgIC8vIDEuMC4wICdwcmUnIHdvdWxkIGJlY29tZSAxLjAuMC0wIHdoaWNoIGlzIHRoZSB3cm9uZyBkaXJlY3Rpb24uXG4gICAgICBjYXNlICdwcmUnOiB7XG4gICAgICAgIGNvbnN0IGJhc2UgPSBOdW1iZXIoaWRlbnRpZmllckJhc2UpID8gMSA6IDBcblxuICAgICAgICBpZiAodGhpcy5wcmVyZWxlYXNlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHRoaXMucHJlcmVsZWFzZSA9IFtiYXNlXVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxldCBpID0gdGhpcy5wcmVyZWxlYXNlLmxlbmd0aFxuICAgICAgICAgIHdoaWxlICgtLWkgPj0gMCkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnByZXJlbGVhc2VbaV0gPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgIHRoaXMucHJlcmVsZWFzZVtpXSsrXG4gICAgICAgICAgICAgIGkgPSAtMlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaSA9PT0gLTEpIHtcbiAgICAgICAgICAgIC8vIGRpZG4ndCBpbmNyZW1lbnQgYW55dGhpbmdcbiAgICAgICAgICAgIGlmIChpZGVudGlmaWVyID09PSB0aGlzLnByZXJlbGVhc2Uuam9pbignLicpICYmIGlkZW50aWZpZXJCYXNlID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgaW5jcmVtZW50IGFyZ3VtZW50OiBpZGVudGlmaWVyIGFscmVhZHkgZXhpc3RzJylcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucHJlcmVsZWFzZS5wdXNoKGJhc2UpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChpZGVudGlmaWVyKSB7XG4gICAgICAgICAgLy8gMS4yLjAtYmV0YS4xIGJ1bXBzIHRvIDEuMi4wLWJldGEuMixcbiAgICAgICAgICAvLyAxLjIuMC1iZXRhLmZvb2JseiBvciAxLjIuMC1iZXRhIGJ1bXBzIHRvIDEuMi4wLWJldGEuMFxuICAgICAgICAgIGxldCBwcmVyZWxlYXNlID0gW2lkZW50aWZpZXIsIGJhc2VdXG4gICAgICAgICAgaWYgKGlkZW50aWZpZXJCYXNlID09PSBmYWxzZSkge1xuICAgICAgICAgICAgcHJlcmVsZWFzZSA9IFtpZGVudGlmaWVyXVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoY29tcGFyZUlkZW50aWZpZXJzKHRoaXMucHJlcmVsZWFzZVswXSwgaWRlbnRpZmllcikgPT09IDApIHtcbiAgICAgICAgICAgIGlmIChpc05hTih0aGlzLnByZXJlbGVhc2VbMV0pKSB7XG4gICAgICAgICAgICAgIHRoaXMucHJlcmVsZWFzZSA9IHByZXJlbGVhc2VcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5wcmVyZWxlYXNlID0gcHJlcmVsZWFzZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIGluY3JlbWVudCBhcmd1bWVudDogJHtyZWxlYXNlfWApXG4gICAgfVxuICAgIHRoaXMucmF3ID0gdGhpcy5mb3JtYXQoKVxuICAgIGlmICh0aGlzLmJ1aWxkLmxlbmd0aCkge1xuICAgICAgdGhpcy5yYXcgKz0gYCske3RoaXMuYnVpbGQuam9pbignLicpfWBcbiAgICB9XG4gICAgcmV0dXJuIHRoaXNcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFNlbVZlclxuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///10\n")},function(module,exports,__webpack_require__){eval("const SemVer = __webpack_require__(10)\nconst compare = (a, b, loose) =>\n  new SemVer(a, loose).compare(new SemVer(b, loose))\n\nmodule.exports = compare\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTEuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRvcnEtbmF0aXZlL3JlYWN0LXNwZWN0cnVtL25vZGVfbW9kdWxlcy9zZW12ZXIvZnVuY3Rpb25zL2NvbXBhcmUuanM/YjA5ZSJdLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBTZW1WZXIgPSByZXF1aXJlKCcuLi9jbGFzc2VzL3NlbXZlcicpXG5jb25zdCBjb21wYXJlID0gKGEsIGIsIGxvb3NlKSA9PlxuICBuZXcgU2VtVmVyKGEsIGxvb3NlKS5jb21wYXJlKG5ldyBTZW1WZXIoYiwgbG9vc2UpKVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNvbXBhcmVcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///11\n")},function(module,exports,__webpack_require__){eval("const SPACE_CHARACTERS = /\\s+/g\n\n// hoisted class for cyclic dependency\nclass Range {\n  constructor (range, options) {\n    options = parseOptions(options)\n\n    if (range instanceof Range) {\n      if (\n        range.loose === !!options.loose &&\n        range.includePrerelease === !!options.includePrerelease\n      ) {\n        return range\n      } else {\n        return new Range(range.raw, options)\n      }\n    }\n\n    if (range instanceof Comparator) {\n      // just put it in the set and return\n      this.raw = range.value\n      this.set = [[range]]\n      this.formatted = undefined\n      return this\n    }\n\n    this.options = options\n    this.loose = !!options.loose\n    this.includePrerelease = !!options.includePrerelease\n\n    // First reduce all whitespace as much as possible so we do not have to rely\n    // on potentially slow regexes like \\s*. This is then stored and used for\n    // future error messages as well.\n    this.raw = range.trim().replace(SPACE_CHARACTERS, ' ')\n\n    // First, split on ||\n    this.set = this.raw\n      .split('||')\n      // map the range to a 2d array of comparators\n      .map(r => this.parseRange(r.trim()))\n      // throw out any comparator lists that are empty\n      // this generally means that it was not a valid range, which is allowed\n      // in loose mode, but will still throw if the WHOLE range is invalid.\n      .filter(c => c.length)\n\n    if (!this.set.length) {\n      throw new TypeError(`Invalid SemVer Range: ${this.raw}`)\n    }\n\n    // if we have any that are not the null set, throw out null sets.\n    if (this.set.length > 1) {\n      // keep the first one, in case they're all null sets\n      const first = this.set[0]\n      this.set = this.set.filter(c => !isNullSet(c[0]))\n      if (this.set.length === 0) {\n        this.set = [first]\n      } else if (this.set.length > 1) {\n        // if we have any that are *, then the range is just *\n        for (const c of this.set) {\n          if (c.length === 1 && isAny(c[0])) {\n            this.set = [c]\n            break\n          }\n        }\n      }\n    }\n\n    this.formatted = undefined\n  }\n\n  get range () {\n    if (this.formatted === undefined) {\n      this.formatted = ''\n      for (let i = 0; i < this.set.length; i++) {\n        if (i > 0) {\n          this.formatted += '||'\n        }\n        const comps = this.set[i]\n        for (let k = 0; k < comps.length; k++) {\n          if (k > 0) {\n            this.formatted += ' '\n          }\n          this.formatted += comps[k].toString().trim()\n        }\n      }\n    }\n    return this.formatted\n  }\n\n  format () {\n    return this.range\n  }\n\n  toString () {\n    return this.range\n  }\n\n  parseRange (range) {\n    // memoize range parsing for performance.\n    // this is a very hot path, and fully deterministic.\n    const memoOpts =\n      (this.options.includePrerelease && FLAG_INCLUDE_PRERELEASE) |\n      (this.options.loose && FLAG_LOOSE)\n    const memoKey = memoOpts + ':' + range\n    const cached = cache.get(memoKey)\n    if (cached) {\n      return cached\n    }\n\n    const loose = this.options.loose\n    // `1.2.3 - 1.2.4` => `>=1.2.3 <=1.2.4`\n    const hr = loose ? re[t.HYPHENRANGELOOSE] : re[t.HYPHENRANGE]\n    range = range.replace(hr, hyphenReplace(this.options.includePrerelease))\n    debug('hyphen replace', range)\n\n    // `> 1.2.3 < 1.2.5` => `>1.2.3 <1.2.5`\n    range = range.replace(re[t.COMPARATORTRIM], comparatorTrimReplace)\n    debug('comparator trim', range)\n\n    // `~ 1.2.3` => `~1.2.3`\n    range = range.replace(re[t.TILDETRIM], tildeTrimReplace)\n    debug('tilde trim', range)\n\n    // `^ 1.2.3` => `^1.2.3`\n    range = range.replace(re[t.CARETTRIM], caretTrimReplace)\n    debug('caret trim', range)\n\n    // At this point, the range is completely trimmed and\n    // ready to be split into comparators.\n\n    let rangeList = range\n      .split(' ')\n      .map(comp => parseComparator(comp, this.options))\n      .join(' ')\n      .split(/\\s+/)\n      // >=0.0.0 is equivalent to *\n      .map(comp => replaceGTE0(comp, this.options))\n\n    if (loose) {\n      // in loose mode, throw out any that are not valid comparators\n      rangeList = rangeList.filter(comp => {\n        debug('loose invalid filter', comp, this.options)\n        return !!comp.match(re[t.COMPARATORLOOSE])\n      })\n    }\n    debug('range list', rangeList)\n\n    // if any comparators are the null set, then replace with JUST null set\n    // if more than one comparator, remove any * comparators\n    // also, don't include the same comparator more than once\n    const rangeMap = new Map()\n    const comparators = rangeList.map(comp => new Comparator(comp, this.options))\n    for (const comp of comparators) {\n      if (isNullSet(comp)) {\n        return [comp]\n      }\n      rangeMap.set(comp.value, comp)\n    }\n    if (rangeMap.size > 1 && rangeMap.has('')) {\n      rangeMap.delete('')\n    }\n\n    const result = [...rangeMap.values()]\n    cache.set(memoKey, result)\n    return result\n  }\n\n  intersects (range, options) {\n    if (!(range instanceof Range)) {\n      throw new TypeError('a Range is required')\n    }\n\n    return this.set.some((thisComparators) => {\n      return (\n        isSatisfiable(thisComparators, options) &&\n        range.set.some((rangeComparators) => {\n          return (\n            isSatisfiable(rangeComparators, options) &&\n            thisComparators.every((thisComparator) => {\n              return rangeComparators.every((rangeComparator) => {\n                return thisComparator.intersects(rangeComparator, options)\n              })\n            })\n          )\n        })\n      )\n    })\n  }\n\n  // if ANY of the sets match ALL of its comparators, then pass\n  test (version) {\n    if (!version) {\n      return false\n    }\n\n    if (typeof version === 'string') {\n      try {\n        version = new SemVer(version, this.options)\n      } catch (er) {\n        return false\n      }\n    }\n\n    for (let i = 0; i < this.set.length; i++) {\n      if (testSet(this.set[i], version, this.options)) {\n        return true\n      }\n    }\n    return false\n  }\n}\n\nmodule.exports = Range\n\nconst LRU = __webpack_require__(179)\nconst cache = new LRU()\n\nconst parseOptions = __webpack_require__(48)\nconst Comparator = __webpack_require__(38)\nconst debug = __webpack_require__(36)\nconst SemVer = __webpack_require__(10)\nconst {\n  safeRe: re,\n  t,\n  comparatorTrimReplace,\n  tildeTrimReplace,\n  caretTrimReplace,\n} = __webpack_require__(29)\nconst { FLAG_INCLUDE_PRERELEASE, FLAG_LOOSE } = __webpack_require__(35)\n\nconst isNullSet = c => c.value === '<0.0.0-0'\nconst isAny = c => c.value === ''\n\n// take a set of comparators and determine whether there\n// exists a version which can satisfy it\nconst isSatisfiable = (comparators, options) => {\n  let result = true\n  const remainingComparators = comparators.slice()\n  let testComparator = remainingComparators.pop()\n\n  while (result && remainingComparators.length) {\n    result = remainingComparators.every((otherComparator) => {\n      return testComparator.intersects(otherComparator, options)\n    })\n\n    testComparator = remainingComparators.pop()\n  }\n\n  return result\n}\n\n// comprised of xranges, tildes, stars, and gtlt's at this point.\n// already replaced the hyphen ranges\n// turn into a set of JUST comparators.\nconst parseComparator = (comp, options) => {\n  debug('comp', comp, options)\n  comp = replaceCarets(comp, options)\n  debug('caret', comp)\n  comp = replaceTildes(comp, options)\n  debug('tildes', comp)\n  comp = replaceXRanges(comp, options)\n  debug('xrange', comp)\n  comp = replaceStars(comp, options)\n  debug('stars', comp)\n  return comp\n}\n\nconst isX = id => !id || id.toLowerCase() === 'x' || id === '*'\n\n// ~, ~> --\x3e * (any, kinda silly)\n// ~2, ~2.x, ~2.x.x, ~>2, ~>2.x ~>2.x.x --\x3e >=2.0.0 <3.0.0-0\n// ~2.0, ~2.0.x, ~>2.0, ~>2.0.x --\x3e >=2.0.0 <2.1.0-0\n// ~1.2, ~1.2.x, ~>1.2, ~>1.2.x --\x3e >=1.2.0 <1.3.0-0\n// ~1.2.3, ~>1.2.3 --\x3e >=1.2.3 <1.3.0-0\n// ~1.2.0, ~>1.2.0 --\x3e >=1.2.0 <1.3.0-0\n// ~0.0.1 --\x3e >=0.0.1 <0.1.0-0\nconst replaceTildes = (comp, options) => {\n  return comp\n    .trim()\n    .split(/\\s+/)\n    .map((c) => replaceTilde(c, options))\n    .join(' ')\n}\n\nconst replaceTilde = (comp, options) => {\n  const r = options.loose ? re[t.TILDELOOSE] : re[t.TILDE]\n  return comp.replace(r, (_, M, m, p, pr) => {\n    debug('tilde', comp, _, M, m, p, pr)\n    let ret\n\n    if (isX(M)) {\n      ret = ''\n    } else if (isX(m)) {\n      ret = `>=${M}.0.0 <${+M + 1}.0.0-0`\n    } else if (isX(p)) {\n      // ~1.2 == >=1.2.0 <1.3.0-0\n      ret = `>=${M}.${m}.0 <${M}.${+m + 1}.0-0`\n    } else if (pr) {\n      debug('replaceTilde pr', pr)\n      ret = `>=${M}.${m}.${p}-${pr\n      } <${M}.${+m + 1}.0-0`\n    } else {\n      // ~1.2.3 == >=1.2.3 <1.3.0-0\n      ret = `>=${M}.${m}.${p\n      } <${M}.${+m + 1}.0-0`\n    }\n\n    debug('tilde return', ret)\n    return ret\n  })\n}\n\n// ^ --\x3e * (any, kinda silly)\n// ^2, ^2.x, ^2.x.x --\x3e >=2.0.0 <3.0.0-0\n// ^2.0, ^2.0.x --\x3e >=2.0.0 <3.0.0-0\n// ^1.2, ^1.2.x --\x3e >=1.2.0 <2.0.0-0\n// ^1.2.3 --\x3e >=1.2.3 <2.0.0-0\n// ^1.2.0 --\x3e >=1.2.0 <2.0.0-0\n// ^0.0.1 --\x3e >=0.0.1 <0.0.2-0\n// ^0.1.0 --\x3e >=0.1.0 <0.2.0-0\nconst replaceCarets = (comp, options) => {\n  return comp\n    .trim()\n    .split(/\\s+/)\n    .map((c) => replaceCaret(c, options))\n    .join(' ')\n}\n\nconst replaceCaret = (comp, options) => {\n  debug('caret', comp, options)\n  const r = options.loose ? re[t.CARETLOOSE] : re[t.CARET]\n  const z = options.includePrerelease ? '-0' : ''\n  return comp.replace(r, (_, M, m, p, pr) => {\n    debug('caret', comp, _, M, m, p, pr)\n    let ret\n\n    if (isX(M)) {\n      ret = ''\n    } else if (isX(m)) {\n      ret = `>=${M}.0.0${z} <${+M + 1}.0.0-0`\n    } else if (isX(p)) {\n      if (M === '0') {\n        ret = `>=${M}.${m}.0${z} <${M}.${+m + 1}.0-0`\n      } else {\n        ret = `>=${M}.${m}.0${z} <${+M + 1}.0.0-0`\n      }\n    } else if (pr) {\n      debug('replaceCaret pr', pr)\n      if (M === '0') {\n        if (m === '0') {\n          ret = `>=${M}.${m}.${p}-${pr\n          } <${M}.${m}.${+p + 1}-0`\n        } else {\n          ret = `>=${M}.${m}.${p}-${pr\n          } <${M}.${+m + 1}.0-0`\n        }\n      } else {\n        ret = `>=${M}.${m}.${p}-${pr\n        } <${+M + 1}.0.0-0`\n      }\n    } else {\n      debug('no pr')\n      if (M === '0') {\n        if (m === '0') {\n          ret = `>=${M}.${m}.${p\n          }${z} <${M}.${m}.${+p + 1}-0`\n        } else {\n          ret = `>=${M}.${m}.${p\n          }${z} <${M}.${+m + 1}.0-0`\n        }\n      } else {\n        ret = `>=${M}.${m}.${p\n        } <${+M + 1}.0.0-0`\n      }\n    }\n\n    debug('caret return', ret)\n    return ret\n  })\n}\n\nconst replaceXRanges = (comp, options) => {\n  debug('replaceXRanges', comp, options)\n  return comp\n    .split(/\\s+/)\n    .map((c) => replaceXRange(c, options))\n    .join(' ')\n}\n\nconst replaceXRange = (comp, options) => {\n  comp = comp.trim()\n  const r = options.loose ? re[t.XRANGELOOSE] : re[t.XRANGE]\n  return comp.replace(r, (ret, gtlt, M, m, p, pr) => {\n    debug('xRange', comp, ret, gtlt, M, m, p, pr)\n    const xM = isX(M)\n    const xm = xM || isX(m)\n    const xp = xm || isX(p)\n    const anyX = xp\n\n    if (gtlt === '=' && anyX) {\n      gtlt = ''\n    }\n\n    // if we're including prereleases in the match, then we need\n    // to fix this to -0, the lowest possible prerelease value\n    pr = options.includePrerelease ? '-0' : ''\n\n    if (xM) {\n      if (gtlt === '>' || gtlt === '<') {\n        // nothing is allowed\n        ret = '<0.0.0-0'\n      } else {\n        // nothing is forbidden\n        ret = '*'\n      }\n    } else if (gtlt && anyX) {\n      // we know patch is an x, because we have any x at all.\n      // replace X with 0\n      if (xm) {\n        m = 0\n      }\n      p = 0\n\n      if (gtlt === '>') {\n        // >1 => >=2.0.0\n        // >1.2 => >=1.3.0\n        gtlt = '>='\n        if (xm) {\n          M = +M + 1\n          m = 0\n          p = 0\n        } else {\n          m = +m + 1\n          p = 0\n        }\n      } else if (gtlt === '<=') {\n        // <=0.7.x is actually <0.8.0, since any 0.7.x should\n        // pass.  Similarly, <=7.x is actually <8.0.0, etc.\n        gtlt = '<'\n        if (xm) {\n          M = +M + 1\n        } else {\n          m = +m + 1\n        }\n      }\n\n      if (gtlt === '<') {\n        pr = '-0'\n      }\n\n      ret = `${gtlt + M}.${m}.${p}${pr}`\n    } else if (xm) {\n      ret = `>=${M}.0.0${pr} <${+M + 1}.0.0-0`\n    } else if (xp) {\n      ret = `>=${M}.${m}.0${pr\n      } <${M}.${+m + 1}.0-0`\n    }\n\n    debug('xRange return', ret)\n\n    return ret\n  })\n}\n\n// Because * is AND-ed with everything else in the comparator,\n// and '' means \"any version\", just remove the *s entirely.\nconst replaceStars = (comp, options) => {\n  debug('replaceStars', comp, options)\n  // Looseness is ignored here.  star is always as loose as it gets!\n  return comp\n    .trim()\n    .replace(re[t.STAR], '')\n}\n\nconst replaceGTE0 = (comp, options) => {\n  debug('replaceGTE0', comp, options)\n  return comp\n    .trim()\n    .replace(re[options.includePrerelease ? t.GTE0PRE : t.GTE0], '')\n}\n\n// This function is passed to string.replace(re[t.HYPHENRANGE])\n// M, m, patch, prerelease, build\n// 1.2 - 3.4.5 => >=1.2.0 <=3.4.5\n// 1.2.3 - 3.4 => >=1.2.0 <3.5.0-0 Any 3.4.x will do\n// 1.2 - 3.4 => >=1.2.0 <3.5.0-0\n// TODO build?\nconst hyphenReplace = incPr => ($0,\n  from, fM, fm, fp, fpr, fb,\n  to, tM, tm, tp, tpr) => {\n  if (isX(fM)) {\n    from = ''\n  } else if (isX(fm)) {\n    from = `>=${fM}.0.0${incPr ? '-0' : ''}`\n  } else if (isX(fp)) {\n    from = `>=${fM}.${fm}.0${incPr ? '-0' : ''}`\n  } else if (fpr) {\n    from = `>=${from}`\n  } else {\n    from = `>=${from}${incPr ? '-0' : ''}`\n  }\n\n  if (isX(tM)) {\n    to = ''\n  } else if (isX(tm)) {\n    to = `<${+tM + 1}.0.0-0`\n  } else if (isX(tp)) {\n    to = `<${tM}.${+tm + 1}.0-0`\n  } else if (tpr) {\n    to = `<=${tM}.${tm}.${tp}-${tpr}`\n  } else if (incPr) {\n    to = `<${tM}.${tm}.${+tp + 1}-0`\n  } else {\n    to = `<=${to}`\n  }\n\n  return `${from} ${to}`.trim()\n}\n\nconst testSet = (set, version, options) => {\n  for (let i = 0; i < set.length; i++) {\n    if (!set[i].test(version)) {\n      return false\n    }\n  }\n\n  if (version.prerelease.length && !options.includePrerelease) {\n    // Find the set of versions that are allowed to have prereleases\n    // For example, ^1.2.3-pr.1 desugars to >=1.2.3-pr.1 <2.0.0\n    // That should allow `1.2.3-pr.2` to pass.\n    // However, `1.2.4-alpha.notready` should NOT be allowed,\n    // even though it's within the range set by the comparators.\n    for (let i = 0; i < set.length; i++) {\n      debug(set[i].semver)\n      if (set[i].semver === Comparator.ANY) {\n        continue\n      }\n\n      if (set[i].semver.prerelease.length > 0) {\n        const allowed = set[i].semver\n        if (allowed.major === version.major &&\n            allowed.minor === version.minor &&\n            allowed.patch === version.patch) {\n          return true\n        }\n      }\n    }\n\n    // Version has a -pre, but it's not one of the ones we like.\n    return false\n  }\n\n  return true\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTIuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRvcnEtbmF0aXZlL3JlYWN0LXNwZWN0cnVtL25vZGVfbW9kdWxlcy9zZW12ZXIvY2xhc3Nlcy9yYW5nZS5qcz9mZWYyIl0sInNvdXJjZXNDb250ZW50IjpbImNvbnN0IFNQQUNFX0NIQVJBQ1RFUlMgPSAvXFxzKy9nXG5cbi8vIGhvaXN0ZWQgY2xhc3MgZm9yIGN5Y2xpYyBkZXBlbmRlbmN5XG5jbGFzcyBSYW5nZSB7XG4gIGNvbnN0cnVjdG9yIChyYW5nZSwgb3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBwYXJzZU9wdGlvbnMob3B0aW9ucylcblxuICAgIGlmIChyYW5nZSBpbnN0YW5jZW9mIFJhbmdlKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHJhbmdlLmxvb3NlID09PSAhIW9wdGlvbnMubG9vc2UgJiZcbiAgICAgICAgcmFuZ2UuaW5jbHVkZVByZXJlbGVhc2UgPT09ICEhb3B0aW9ucy5pbmNsdWRlUHJlcmVsZWFzZVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiByYW5nZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIG5ldyBSYW5nZShyYW5nZS5yYXcsIG9wdGlvbnMpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHJhbmdlIGluc3RhbmNlb2YgQ29tcGFyYXRvcikge1xuICAgICAgLy8ganVzdCBwdXQgaXQgaW4gdGhlIHNldCBhbmQgcmV0dXJuXG4gICAgICB0aGlzLnJhdyA9IHJhbmdlLnZhbHVlXG4gICAgICB0aGlzLnNldCA9IFtbcmFuZ2VdXVxuICAgICAgdGhpcy5mb3JtYXR0ZWQgPSB1bmRlZmluZWRcbiAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9uc1xuICAgIHRoaXMubG9vc2UgPSAhIW9wdGlvbnMubG9vc2VcbiAgICB0aGlzLmluY2x1ZGVQcmVyZWxlYXNlID0gISFvcHRpb25zLmluY2x1ZGVQcmVyZWxlYXNlXG5cbiAgICAvLyBGaXJzdCByZWR1Y2UgYWxsIHdoaXRlc3BhY2UgYXMgbXVjaCBhcyBwb3NzaWJsZSBzbyB3ZSBkbyBub3QgaGF2ZSB0byByZWx5XG4gICAgLy8gb24gcG90ZW50aWFsbHkgc2xvdyByZWdleGVzIGxpa2UgXFxzKi4gVGhpcyBpcyB0aGVuIHN0b3JlZCBhbmQgdXNlZCBmb3JcbiAgICAvLyBmdXR1cmUgZXJyb3IgbWVzc2FnZXMgYXMgd2VsbC5cbiAgICB0aGlzLnJhdyA9IHJhbmdlLnRyaW0oKS5yZXBsYWNlKFNQQUNFX0NIQVJBQ1RFUlMsICcgJylcblxuICAgIC8vIEZpcnN0LCBzcGxpdCBvbiB8fFxuICAgIHRoaXMuc2V0ID0gdGhpcy5yYXdcbiAgICAgIC5zcGxpdCgnfHwnKVxuICAgICAgLy8gbWFwIHRoZSByYW5nZSB0byBhIDJkIGFycmF5IG9mIGNvbXBhcmF0b3JzXG4gICAgICAubWFwKHIgPT4gdGhpcy5wYXJzZVJhbmdlKHIudHJpbSgpKSlcbiAgICAgIC8vIHRocm93IG91dCBhbnkgY29tcGFyYXRvciBsaXN0cyB0aGF0IGFyZSBlbXB0eVxuICAgICAgLy8gdGhpcyBnZW5lcmFsbHkgbWVhbnMgdGhhdCBpdCB3YXMgbm90IGEgdmFsaWQgcmFuZ2UsIHdoaWNoIGlzIGFsbG93ZWRcbiAgICAgIC8vIGluIGxvb3NlIG1vZGUsIGJ1dCB3aWxsIHN0aWxsIHRocm93IGlmIHRoZSBXSE9MRSByYW5nZSBpcyBpbnZhbGlkLlxuICAgICAgLmZpbHRlcihjID0+IGMubGVuZ3RoKVxuXG4gICAgaWYgKCF0aGlzLnNldC5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEludmFsaWQgU2VtVmVyIFJhbmdlOiAke3RoaXMucmF3fWApXG4gICAgfVxuXG4gICAgLy8gaWYgd2UgaGF2ZSBhbnkgdGhhdCBhcmUgbm90IHRoZSBudWxsIHNldCwgdGhyb3cgb3V0IG51bGwgc2V0cy5cbiAgICBpZiAodGhpcy5zZXQubGVuZ3RoID4gMSkge1xuICAgICAgLy8ga2VlcCB0aGUgZmlyc3Qgb25lLCBpbiBjYXNlIHRoZXkncmUgYWxsIG51bGwgc2V0c1xuICAgICAgY29uc3QgZmlyc3QgPSB0aGlzLnNldFswXVxuICAgICAgdGhpcy5zZXQgPSB0aGlzLnNldC5maWx0ZXIoYyA9PiAhaXNOdWxsU2V0KGNbMF0pKVxuICAgICAgaWYgKHRoaXMuc2V0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aGlzLnNldCA9IFtmaXJzdF1cbiAgICAgIH0gZWxzZSBpZiAodGhpcy5zZXQubGVuZ3RoID4gMSkge1xuICAgICAgICAvLyBpZiB3ZSBoYXZlIGFueSB0aGF0IGFyZSAqLCB0aGVuIHRoZSByYW5nZSBpcyBqdXN0ICpcbiAgICAgICAgZm9yIChjb25zdCBjIG9mIHRoaXMuc2V0KSB7XG4gICAgICAgICAgaWYgKGMubGVuZ3RoID09PSAxICYmIGlzQW55KGNbMF0pKSB7XG4gICAgICAgICAgICB0aGlzLnNldCA9IFtjXVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmZvcm1hdHRlZCA9IHVuZGVmaW5lZFxuICB9XG5cbiAgZ2V0IHJhbmdlICgpIHtcbiAgICBpZiAodGhpcy5mb3JtYXR0ZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5mb3JtYXR0ZWQgPSAnJ1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNldC5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoaSA+IDApIHtcbiAgICAgICAgICB0aGlzLmZvcm1hdHRlZCArPSAnfHwnXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29tcHMgPSB0aGlzLnNldFtpXVxuICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IGNvbXBzLmxlbmd0aDsgaysrKSB7XG4gICAgICAgICAgaWYgKGsgPiAwKSB7XG4gICAgICAgICAgICB0aGlzLmZvcm1hdHRlZCArPSAnICdcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5mb3JtYXR0ZWQgKz0gY29tcHNba10udG9TdHJpbmcoKS50cmltKClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5mb3JtYXR0ZWRcbiAgfVxuXG4gIGZvcm1hdCAoKSB7XG4gICAgcmV0dXJuIHRoaXMucmFuZ2VcbiAgfVxuXG4gIHRvU3RyaW5nICgpIHtcbiAgICByZXR1cm4gdGhpcy5yYW5nZVxuICB9XG5cbiAgcGFyc2VSYW5nZSAocmFuZ2UpIHtcbiAgICAvLyBtZW1vaXplIHJhbmdlIHBhcnNpbmcgZm9yIHBlcmZvcm1hbmNlLlxuICAgIC8vIHRoaXMgaXMgYSB2ZXJ5IGhvdCBwYXRoLCBhbmQgZnVsbHkgZGV0ZXJtaW5pc3RpYy5cbiAgICBjb25zdCBtZW1vT3B0cyA9XG4gICAgICAodGhpcy5vcHRpb25zLmluY2x1ZGVQcmVyZWxlYXNlICYmIEZMQUdfSU5DTFVERV9QUkVSRUxFQVNFKSB8XG4gICAgICAodGhpcy5vcHRpb25zLmxvb3NlICYmIEZMQUdfTE9PU0UpXG4gICAgY29uc3QgbWVtb0tleSA9IG1lbW9PcHRzICsgJzonICsgcmFuZ2VcbiAgICBjb25zdCBjYWNoZWQgPSBjYWNoZS5nZXQobWVtb0tleSlcbiAgICBpZiAoY2FjaGVkKSB7XG4gICAgICByZXR1cm4gY2FjaGVkXG4gICAgfVxuXG4gICAgY29uc3QgbG9vc2UgPSB0aGlzLm9wdGlvbnMubG9vc2VcbiAgICAvLyBgMS4yLjMgLSAxLjIuNGAgPT4gYD49MS4yLjMgPD0xLjIuNGBcbiAgICBjb25zdCBociA9IGxvb3NlID8gcmVbdC5IWVBIRU5SQU5HRUxPT1NFXSA6IHJlW3QuSFlQSEVOUkFOR0VdXG4gICAgcmFuZ2UgPSByYW5nZS5yZXBsYWNlKGhyLCBoeXBoZW5SZXBsYWNlKHRoaXMub3B0aW9ucy5pbmNsdWRlUHJlcmVsZWFzZSkpXG4gICAgZGVidWcoJ2h5cGhlbiByZXBsYWNlJywgcmFuZ2UpXG5cbiAgICAvLyBgPiAxLjIuMyA8IDEuMi41YCA9PiBgPjEuMi4zIDwxLjIuNWBcbiAgICByYW5nZSA9IHJhbmdlLnJlcGxhY2UocmVbdC5DT01QQVJBVE9SVFJJTV0sIGNvbXBhcmF0b3JUcmltUmVwbGFjZSlcbiAgICBkZWJ1ZygnY29tcGFyYXRvciB0cmltJywgcmFuZ2UpXG5cbiAgICAvLyBgfiAxLjIuM2AgPT4gYH4xLjIuM2BcbiAgICByYW5nZSA9IHJhbmdlLnJlcGxhY2UocmVbdC5USUxERVRSSU1dLCB0aWxkZVRyaW1SZXBsYWNlKVxuICAgIGRlYnVnKCd0aWxkZSB0cmltJywgcmFuZ2UpXG5cbiAgICAvLyBgXiAxLjIuM2AgPT4gYF4xLjIuM2BcbiAgICByYW5nZSA9IHJhbmdlLnJlcGxhY2UocmVbdC5DQVJFVFRSSU1dLCBjYXJldFRyaW1SZXBsYWNlKVxuICAgIGRlYnVnKCdjYXJldCB0cmltJywgcmFuZ2UpXG5cbiAgICAvLyBBdCB0aGlzIHBvaW50LCB0aGUgcmFuZ2UgaXMgY29tcGxldGVseSB0cmltbWVkIGFuZFxuICAgIC8vIHJlYWR5IHRvIGJlIHNwbGl0IGludG8gY29tcGFyYXRvcnMuXG5cbiAgICBsZXQgcmFuZ2VMaXN0ID0gcmFuZ2VcbiAgICAgIC5zcGxpdCgnICcpXG4gICAgICAubWFwKGNvbXAgPT4gcGFyc2VDb21wYXJhdG9yKGNvbXAsIHRoaXMub3B0aW9ucykpXG4gICAgICAuam9pbignICcpXG4gICAgICAuc3BsaXQoL1xccysvKVxuICAgICAgLy8gPj0wLjAuMCBpcyBlcXVpdmFsZW50IHRvICpcbiAgICAgIC5tYXAoY29tcCA9PiByZXBsYWNlR1RFMChjb21wLCB0aGlzLm9wdGlvbnMpKVxuXG4gICAgaWYgKGxvb3NlKSB7XG4gICAgICAvLyBpbiBsb29zZSBtb2RlLCB0aHJvdyBvdXQgYW55IHRoYXQgYXJlIG5vdCB2YWxpZCBjb21wYXJhdG9yc1xuICAgICAgcmFuZ2VMaXN0ID0gcmFuZ2VMaXN0LmZpbHRlcihjb21wID0+IHtcbiAgICAgICAgZGVidWcoJ2xvb3NlIGludmFsaWQgZmlsdGVyJywgY29tcCwgdGhpcy5vcHRpb25zKVxuICAgICAgICByZXR1cm4gISFjb21wLm1hdGNoKHJlW3QuQ09NUEFSQVRPUkxPT1NFXSlcbiAgICAgIH0pXG4gICAgfVxuICAgIGRlYnVnKCdyYW5nZSBsaXN0JywgcmFuZ2VMaXN0KVxuXG4gICAgLy8gaWYgYW55IGNvbXBhcmF0b3JzIGFyZSB0aGUgbnVsbCBzZXQsIHRoZW4gcmVwbGFjZSB3aXRoIEpVU1QgbnVsbCBzZXRcbiAgICAvLyBpZiBtb3JlIHRoYW4gb25lIGNvbXBhcmF0b3IsIHJlbW92ZSBhbnkgKiBjb21wYXJhdG9yc1xuICAgIC8vIGFsc28sIGRvbid0IGluY2x1ZGUgdGhlIHNhbWUgY29tcGFyYXRvciBtb3JlIHRoYW4gb25jZVxuICAgIGNvbnN0IHJhbmdlTWFwID0gbmV3IE1hcCgpXG4gICAgY29uc3QgY29tcGFyYXRvcnMgPSByYW5nZUxpc3QubWFwKGNvbXAgPT4gbmV3IENvbXBhcmF0b3IoY29tcCwgdGhpcy5vcHRpb25zKSlcbiAgICBmb3IgKGNvbnN0IGNvbXAgb2YgY29tcGFyYXRvcnMpIHtcbiAgICAgIGlmIChpc051bGxTZXQoY29tcCkpIHtcbiAgICAgICAgcmV0dXJuIFtjb21wXVxuICAgICAgfVxuICAgICAgcmFuZ2VNYXAuc2V0KGNvbXAudmFsdWUsIGNvbXApXG4gICAgfVxuICAgIGlmIChyYW5nZU1hcC5zaXplID4gMSAmJiByYW5nZU1hcC5oYXMoJycpKSB7XG4gICAgICByYW5nZU1hcC5kZWxldGUoJycpXG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gWy4uLnJhbmdlTWFwLnZhbHVlcygpXVxuICAgIGNhY2hlLnNldChtZW1vS2V5LCByZXN1bHQpXG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgaW50ZXJzZWN0cyAocmFuZ2UsIG9wdGlvbnMpIHtcbiAgICBpZiAoIShyYW5nZSBpbnN0YW5jZW9mIFJhbmdlKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignYSBSYW5nZSBpcyByZXF1aXJlZCcpXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc2V0LnNvbWUoKHRoaXNDb21wYXJhdG9ycykgPT4ge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgaXNTYXRpc2ZpYWJsZSh0aGlzQ29tcGFyYXRvcnMsIG9wdGlvbnMpICYmXG4gICAgICAgIHJhbmdlLnNldC5zb21lKChyYW5nZUNvbXBhcmF0b3JzKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIGlzU2F0aXNmaWFibGUocmFuZ2VDb21wYXJhdG9ycywgb3B0aW9ucykgJiZcbiAgICAgICAgICAgIHRoaXNDb21wYXJhdG9ycy5ldmVyeSgodGhpc0NvbXBhcmF0b3IpID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIHJhbmdlQ29tcGFyYXRvcnMuZXZlcnkoKHJhbmdlQ29tcGFyYXRvcikgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzQ29tcGFyYXRvci5pbnRlcnNlY3RzKHJhbmdlQ29tcGFyYXRvciwgb3B0aW9ucylcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKVxuICAgICAgICB9KVxuICAgICAgKVxuICAgIH0pXG4gIH1cblxuICAvLyBpZiBBTlkgb2YgdGhlIHNldHMgbWF0Y2ggQUxMIG9mIGl0cyBjb21wYXJhdG9ycywgdGhlbiBwYXNzXG4gIHRlc3QgKHZlcnNpb24pIHtcbiAgICBpZiAoIXZlcnNpb24pIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdmVyc2lvbiA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHZlcnNpb24gPSBuZXcgU2VtVmVyKHZlcnNpb24sIHRoaXMub3B0aW9ucylcbiAgICAgIH0gY2F0Y2ggKGVyKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zZXQubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh0ZXN0U2V0KHRoaXMuc2V0W2ldLCB2ZXJzaW9uLCB0aGlzLm9wdGlvbnMpKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gUmFuZ2VcblxuY29uc3QgTFJVID0gcmVxdWlyZSgnLi4vaW50ZXJuYWwvbHJ1Y2FjaGUnKVxuY29uc3QgY2FjaGUgPSBuZXcgTFJVKClcblxuY29uc3QgcGFyc2VPcHRpb25zID0gcmVxdWlyZSgnLi4vaW50ZXJuYWwvcGFyc2Utb3B0aW9ucycpXG5jb25zdCBDb21wYXJhdG9yID0gcmVxdWlyZSgnLi9jb21wYXJhdG9yJylcbmNvbnN0IGRlYnVnID0gcmVxdWlyZSgnLi4vaW50ZXJuYWwvZGVidWcnKVxuY29uc3QgU2VtVmVyID0gcmVxdWlyZSgnLi9zZW12ZXInKVxuY29uc3Qge1xuICBzYWZlUmU6IHJlLFxuICB0LFxuICBjb21wYXJhdG9yVHJpbVJlcGxhY2UsXG4gIHRpbGRlVHJpbVJlcGxhY2UsXG4gIGNhcmV0VHJpbVJlcGxhY2UsXG59ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWwvcmUnKVxuY29uc3QgeyBGTEFHX0lOQ0xVREVfUFJFUkVMRUFTRSwgRkxBR19MT09TRSB9ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWwvY29uc3RhbnRzJylcblxuY29uc3QgaXNOdWxsU2V0ID0gYyA9PiBjLnZhbHVlID09PSAnPDAuMC4wLTAnXG5jb25zdCBpc0FueSA9IGMgPT4gYy52YWx1ZSA9PT0gJydcblxuLy8gdGFrZSBhIHNldCBvZiBjb21wYXJhdG9ycyBhbmQgZGV0ZXJtaW5lIHdoZXRoZXIgdGhlcmVcbi8vIGV4aXN0cyBhIHZlcnNpb24gd2hpY2ggY2FuIHNhdGlzZnkgaXRcbmNvbnN0IGlzU2F0aXNmaWFibGUgPSAoY29tcGFyYXRvcnMsIG9wdGlvbnMpID0+IHtcbiAgbGV0IHJlc3VsdCA9IHRydWVcbiAgY29uc3QgcmVtYWluaW5nQ29tcGFyYXRvcnMgPSBjb21wYXJhdG9ycy5zbGljZSgpXG4gIGxldCB0ZXN0Q29tcGFyYXRvciA9IHJlbWFpbmluZ0NvbXBhcmF0b3JzLnBvcCgpXG5cbiAgd2hpbGUgKHJlc3VsdCAmJiByZW1haW5pbmdDb21wYXJhdG9ycy5sZW5ndGgpIHtcbiAgICByZXN1bHQgPSByZW1haW5pbmdDb21wYXJhdG9ycy5ldmVyeSgob3RoZXJDb21wYXJhdG9yKSA9PiB7XG4gICAgICByZXR1cm4gdGVzdENvbXBhcmF0b3IuaW50ZXJzZWN0cyhvdGhlckNvbXBhcmF0b3IsIG9wdGlvbnMpXG4gICAgfSlcblxuICAgIHRlc3RDb21wYXJhdG9yID0gcmVtYWluaW5nQ29tcGFyYXRvcnMucG9wKClcbiAgfVxuXG4gIHJldHVybiByZXN1bHRcbn1cblxuLy8gY29tcHJpc2VkIG9mIHhyYW5nZXMsIHRpbGRlcywgc3RhcnMsIGFuZCBndGx0J3MgYXQgdGhpcyBwb2ludC5cbi8vIGFscmVhZHkgcmVwbGFjZWQgdGhlIGh5cGhlbiByYW5nZXNcbi8vIHR1cm4gaW50byBhIHNldCBvZiBKVVNUIGNvbXBhcmF0b3JzLlxuY29uc3QgcGFyc2VDb21wYXJhdG9yID0gKGNvbXAsIG9wdGlvbnMpID0+IHtcbiAgZGVidWcoJ2NvbXAnLCBjb21wLCBvcHRpb25zKVxuICBjb21wID0gcmVwbGFjZUNhcmV0cyhjb21wLCBvcHRpb25zKVxuICBkZWJ1ZygnY2FyZXQnLCBjb21wKVxuICBjb21wID0gcmVwbGFjZVRpbGRlcyhjb21wLCBvcHRpb25zKVxuICBkZWJ1ZygndGlsZGVzJywgY29tcClcbiAgY29tcCA9IHJlcGxhY2VYUmFuZ2VzKGNvbXAsIG9wdGlvbnMpXG4gIGRlYnVnKCd4cmFuZ2UnLCBjb21wKVxuICBjb21wID0gcmVwbGFjZVN0YXJzKGNvbXAsIG9wdGlvbnMpXG4gIGRlYnVnKCdzdGFycycsIGNvbXApXG4gIHJldHVybiBjb21wXG59XG5cbmNvbnN0IGlzWCA9IGlkID0+ICFpZCB8fCBpZC50b0xvd2VyQ2FzZSgpID09PSAneCcgfHwgaWQgPT09ICcqJ1xuXG4vLyB+LCB+PiAtLT4gKiAoYW55LCBraW5kYSBzaWxseSlcbi8vIH4yLCB+Mi54LCB+Mi54LngsIH4+Miwgfj4yLnggfj4yLngueCAtLT4gPj0yLjAuMCA8My4wLjAtMFxuLy8gfjIuMCwgfjIuMC54LCB+PjIuMCwgfj4yLjAueCAtLT4gPj0yLjAuMCA8Mi4xLjAtMFxuLy8gfjEuMiwgfjEuMi54LCB+PjEuMiwgfj4xLjIueCAtLT4gPj0xLjIuMCA8MS4zLjAtMFxuLy8gfjEuMi4zLCB+PjEuMi4zIC0tPiA+PTEuMi4zIDwxLjMuMC0wXG4vLyB+MS4yLjAsIH4+MS4yLjAgLS0+ID49MS4yLjAgPDEuMy4wLTBcbi8vIH4wLjAuMSAtLT4gPj0wLjAuMSA8MC4xLjAtMFxuY29uc3QgcmVwbGFjZVRpbGRlcyA9IChjb21wLCBvcHRpb25zKSA9PiB7XG4gIHJldHVybiBjb21wXG4gICAgLnRyaW0oKVxuICAgIC5zcGxpdCgvXFxzKy8pXG4gICAgLm1hcCgoYykgPT4gcmVwbGFjZVRpbGRlKGMsIG9wdGlvbnMpKVxuICAgIC5qb2luKCcgJylcbn1cblxuY29uc3QgcmVwbGFjZVRpbGRlID0gKGNvbXAsIG9wdGlvbnMpID0+IHtcbiAgY29uc3QgciA9IG9wdGlvbnMubG9vc2UgPyByZVt0LlRJTERFTE9PU0VdIDogcmVbdC5USUxERV1cbiAgcmV0dXJuIGNvbXAucmVwbGFjZShyLCAoXywgTSwgbSwgcCwgcHIpID0+IHtcbiAgICBkZWJ1ZygndGlsZGUnLCBjb21wLCBfLCBNLCBtLCBwLCBwcilcbiAgICBsZXQgcmV0XG5cbiAgICBpZiAoaXNYKE0pKSB7XG4gICAgICByZXQgPSAnJ1xuICAgIH0gZWxzZSBpZiAoaXNYKG0pKSB7XG4gICAgICByZXQgPSBgPj0ke019LjAuMCA8JHsrTSArIDF9LjAuMC0wYFxuICAgIH0gZWxzZSBpZiAoaXNYKHApKSB7XG4gICAgICAvLyB+MS4yID09ID49MS4yLjAgPDEuMy4wLTBcbiAgICAgIHJldCA9IGA+PSR7TX0uJHttfS4wIDwke019LiR7K20gKyAxfS4wLTBgXG4gICAgfSBlbHNlIGlmIChwcikge1xuICAgICAgZGVidWcoJ3JlcGxhY2VUaWxkZSBwcicsIHByKVxuICAgICAgcmV0ID0gYD49JHtNfS4ke219LiR7cH0tJHtwclxuICAgICAgfSA8JHtNfS4keyttICsgMX0uMC0wYFxuICAgIH0gZWxzZSB7XG4gICAgICAvLyB+MS4yLjMgPT0gPj0xLjIuMyA8MS4zLjAtMFxuICAgICAgcmV0ID0gYD49JHtNfS4ke219LiR7cFxuICAgICAgfSA8JHtNfS4keyttICsgMX0uMC0wYFxuICAgIH1cblxuICAgIGRlYnVnKCd0aWxkZSByZXR1cm4nLCByZXQpXG4gICAgcmV0dXJuIHJldFxuICB9KVxufVxuXG4vLyBeIC0tPiAqIChhbnksIGtpbmRhIHNpbGx5KVxuLy8gXjIsIF4yLngsIF4yLngueCAtLT4gPj0yLjAuMCA8My4wLjAtMFxuLy8gXjIuMCwgXjIuMC54IC0tPiA+PTIuMC4wIDwzLjAuMC0wXG4vLyBeMS4yLCBeMS4yLnggLS0+ID49MS4yLjAgPDIuMC4wLTBcbi8vIF4xLjIuMyAtLT4gPj0xLjIuMyA8Mi4wLjAtMFxuLy8gXjEuMi4wIC0tPiA+PTEuMi4wIDwyLjAuMC0wXG4vLyBeMC4wLjEgLS0+ID49MC4wLjEgPDAuMC4yLTBcbi8vIF4wLjEuMCAtLT4gPj0wLjEuMCA8MC4yLjAtMFxuY29uc3QgcmVwbGFjZUNhcmV0cyA9IChjb21wLCBvcHRpb25zKSA9PiB7XG4gIHJldHVybiBjb21wXG4gICAgLnRyaW0oKVxuICAgIC5zcGxpdCgvXFxzKy8pXG4gICAgLm1hcCgoYykgPT4gcmVwbGFjZUNhcmV0KGMsIG9wdGlvbnMpKVxuICAgIC5qb2luKCcgJylcbn1cblxuY29uc3QgcmVwbGFjZUNhcmV0ID0gKGNvbXAsIG9wdGlvbnMpID0+IHtcbiAgZGVidWcoJ2NhcmV0JywgY29tcCwgb3B0aW9ucylcbiAgY29uc3QgciA9IG9wdGlvbnMubG9vc2UgPyByZVt0LkNBUkVUTE9PU0VdIDogcmVbdC5DQVJFVF1cbiAgY29uc3QgeiA9IG9wdGlvbnMuaW5jbHVkZVByZXJlbGVhc2UgPyAnLTAnIDogJydcbiAgcmV0dXJuIGNvbXAucmVwbGFjZShyLCAoXywgTSwgbSwgcCwgcHIpID0+IHtcbiAgICBkZWJ1ZygnY2FyZXQnLCBjb21wLCBfLCBNLCBtLCBwLCBwcilcbiAgICBsZXQgcmV0XG5cbiAgICBpZiAoaXNYKE0pKSB7XG4gICAgICByZXQgPSAnJ1xuICAgIH0gZWxzZSBpZiAoaXNYKG0pKSB7XG4gICAgICByZXQgPSBgPj0ke019LjAuMCR7en0gPCR7K00gKyAxfS4wLjAtMGBcbiAgICB9IGVsc2UgaWYgKGlzWChwKSkge1xuICAgICAgaWYgKE0gPT09ICcwJykge1xuICAgICAgICByZXQgPSBgPj0ke019LiR7bX0uMCR7en0gPCR7TX0uJHsrbSArIDF9LjAtMGBcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldCA9IGA+PSR7TX0uJHttfS4wJHt6fSA8JHsrTSArIDF9LjAuMC0wYFxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHIpIHtcbiAgICAgIGRlYnVnKCdyZXBsYWNlQ2FyZXQgcHInLCBwcilcbiAgICAgIGlmIChNID09PSAnMCcpIHtcbiAgICAgICAgaWYgKG0gPT09ICcwJykge1xuICAgICAgICAgIHJldCA9IGA+PSR7TX0uJHttfS4ke3B9LSR7cHJcbiAgICAgICAgICB9IDwke019LiR7bX0uJHsrcCArIDF9LTBgXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0ID0gYD49JHtNfS4ke219LiR7cH0tJHtwclxuICAgICAgICAgIH0gPCR7TX0uJHsrbSArIDF9LjAtMGBcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0ID0gYD49JHtNfS4ke219LiR7cH0tJHtwclxuICAgICAgICB9IDwkeytNICsgMX0uMC4wLTBgXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlYnVnKCdubyBwcicpXG4gICAgICBpZiAoTSA9PT0gJzAnKSB7XG4gICAgICAgIGlmIChtID09PSAnMCcpIHtcbiAgICAgICAgICByZXQgPSBgPj0ke019LiR7bX0uJHtwXG4gICAgICAgICAgfSR7en0gPCR7TX0uJHttfS4keytwICsgMX0tMGBcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXQgPSBgPj0ke019LiR7bX0uJHtwXG4gICAgICAgICAgfSR7en0gPCR7TX0uJHsrbSArIDF9LjAtMGBcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0ID0gYD49JHtNfS4ke219LiR7cFxuICAgICAgICB9IDwkeytNICsgMX0uMC4wLTBgXG4gICAgICB9XG4gICAgfVxuXG4gICAgZGVidWcoJ2NhcmV0IHJldHVybicsIHJldClcbiAgICByZXR1cm4gcmV0XG4gIH0pXG59XG5cbmNvbnN0IHJlcGxhY2VYUmFuZ2VzID0gKGNvbXAsIG9wdGlvbnMpID0+IHtcbiAgZGVidWcoJ3JlcGxhY2VYUmFuZ2VzJywgY29tcCwgb3B0aW9ucylcbiAgcmV0dXJuIGNvbXBcbiAgICAuc3BsaXQoL1xccysvKVxuICAgIC5tYXAoKGMpID0+IHJlcGxhY2VYUmFuZ2UoYywgb3B0aW9ucykpXG4gICAgLmpvaW4oJyAnKVxufVxuXG5jb25zdCByZXBsYWNlWFJhbmdlID0gKGNvbXAsIG9wdGlvbnMpID0+IHtcbiAgY29tcCA9IGNvbXAudHJpbSgpXG4gIGNvbnN0IHIgPSBvcHRpb25zLmxvb3NlID8gcmVbdC5YUkFOR0VMT09TRV0gOiByZVt0LlhSQU5HRV1cbiAgcmV0dXJuIGNvbXAucmVwbGFjZShyLCAocmV0LCBndGx0LCBNLCBtLCBwLCBwcikgPT4ge1xuICAgIGRlYnVnKCd4UmFuZ2UnLCBjb21wLCByZXQsIGd0bHQsIE0sIG0sIHAsIHByKVxuICAgIGNvbnN0IHhNID0gaXNYKE0pXG4gICAgY29uc3QgeG0gPSB4TSB8fCBpc1gobSlcbiAgICBjb25zdCB4cCA9IHhtIHx8IGlzWChwKVxuICAgIGNvbnN0IGFueVggPSB4cFxuXG4gICAgaWYgKGd0bHQgPT09ICc9JyAmJiBhbnlYKSB7XG4gICAgICBndGx0ID0gJydcbiAgICB9XG5cbiAgICAvLyBpZiB3ZSdyZSBpbmNsdWRpbmcgcHJlcmVsZWFzZXMgaW4gdGhlIG1hdGNoLCB0aGVuIHdlIG5lZWRcbiAgICAvLyB0byBmaXggdGhpcyB0byAtMCwgdGhlIGxvd2VzdCBwb3NzaWJsZSBwcmVyZWxlYXNlIHZhbHVlXG4gICAgcHIgPSBvcHRpb25zLmluY2x1ZGVQcmVyZWxlYXNlID8gJy0wJyA6ICcnXG5cbiAgICBpZiAoeE0pIHtcbiAgICAgIGlmIChndGx0ID09PSAnPicgfHwgZ3RsdCA9PT0gJzwnKSB7XG4gICAgICAgIC8vIG5vdGhpbmcgaXMgYWxsb3dlZFxuICAgICAgICByZXQgPSAnPDAuMC4wLTAnXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBub3RoaW5nIGlzIGZvcmJpZGRlblxuICAgICAgICByZXQgPSAnKidcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGd0bHQgJiYgYW55WCkge1xuICAgICAgLy8gd2Uga25vdyBwYXRjaCBpcyBhbiB4LCBiZWNhdXNlIHdlIGhhdmUgYW55IHggYXQgYWxsLlxuICAgICAgLy8gcmVwbGFjZSBYIHdpdGggMFxuICAgICAgaWYgKHhtKSB7XG4gICAgICAgIG0gPSAwXG4gICAgICB9XG4gICAgICBwID0gMFxuXG4gICAgICBpZiAoZ3RsdCA9PT0gJz4nKSB7XG4gICAgICAgIC8vID4xID0+ID49Mi4wLjBcbiAgICAgICAgLy8gPjEuMiA9PiA+PTEuMy4wXG4gICAgICAgIGd0bHQgPSAnPj0nXG4gICAgICAgIGlmICh4bSkge1xuICAgICAgICAgIE0gPSArTSArIDFcbiAgICAgICAgICBtID0gMFxuICAgICAgICAgIHAgPSAwXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbSA9ICttICsgMVxuICAgICAgICAgIHAgPSAwXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZ3RsdCA9PT0gJzw9Jykge1xuICAgICAgICAvLyA8PTAuNy54IGlzIGFjdHVhbGx5IDwwLjguMCwgc2luY2UgYW55IDAuNy54IHNob3VsZFxuICAgICAgICAvLyBwYXNzLiAgU2ltaWxhcmx5LCA8PTcueCBpcyBhY3R1YWxseSA8OC4wLjAsIGV0Yy5cbiAgICAgICAgZ3RsdCA9ICc8J1xuICAgICAgICBpZiAoeG0pIHtcbiAgICAgICAgICBNID0gK00gKyAxXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbSA9ICttICsgMVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChndGx0ID09PSAnPCcpIHtcbiAgICAgICAgcHIgPSAnLTAnXG4gICAgICB9XG5cbiAgICAgIHJldCA9IGAke2d0bHQgKyBNfS4ke219LiR7cH0ke3ByfWBcbiAgICB9IGVsc2UgaWYgKHhtKSB7XG4gICAgICByZXQgPSBgPj0ke019LjAuMCR7cHJ9IDwkeytNICsgMX0uMC4wLTBgXG4gICAgfSBlbHNlIGlmICh4cCkge1xuICAgICAgcmV0ID0gYD49JHtNfS4ke219LjAke3ByXG4gICAgICB9IDwke019LiR7K20gKyAxfS4wLTBgXG4gICAgfVxuXG4gICAgZGVidWcoJ3hSYW5nZSByZXR1cm4nLCByZXQpXG5cbiAgICByZXR1cm4gcmV0XG4gIH0pXG59XG5cbi8vIEJlY2F1c2UgKiBpcyBBTkQtZWQgd2l0aCBldmVyeXRoaW5nIGVsc2UgaW4gdGhlIGNvbXBhcmF0b3IsXG4vLyBhbmQgJycgbWVhbnMgXCJhbnkgdmVyc2lvblwiLCBqdXN0IHJlbW92ZSB0aGUgKnMgZW50aXJlbHkuXG5jb25zdCByZXBsYWNlU3RhcnMgPSAoY29tcCwgb3B0aW9ucykgPT4ge1xuICBkZWJ1ZygncmVwbGFjZVN0YXJzJywgY29tcCwgb3B0aW9ucylcbiAgLy8gTG9vc2VuZXNzIGlzIGlnbm9yZWQgaGVyZS4gIHN0YXIgaXMgYWx3YXlzIGFzIGxvb3NlIGFzIGl0IGdldHMhXG4gIHJldHVybiBjb21wXG4gICAgLnRyaW0oKVxuICAgIC5yZXBsYWNlKHJlW3QuU1RBUl0sICcnKVxufVxuXG5jb25zdCByZXBsYWNlR1RFMCA9IChjb21wLCBvcHRpb25zKSA9PiB7XG4gIGRlYnVnKCdyZXBsYWNlR1RFMCcsIGNvbXAsIG9wdGlvbnMpXG4gIHJldHVybiBjb21wXG4gICAgLnRyaW0oKVxuICAgIC5yZXBsYWNlKHJlW29wdGlvbnMuaW5jbHVkZVByZXJlbGVhc2UgPyB0LkdURTBQUkUgOiB0LkdURTBdLCAnJylcbn1cblxuLy8gVGhpcyBmdW5jdGlvbiBpcyBwYXNzZWQgdG8gc3RyaW5nLnJlcGxhY2UocmVbdC5IWVBIRU5SQU5HRV0pXG4vLyBNLCBtLCBwYXRjaCwgcHJlcmVsZWFzZSwgYnVpbGRcbi8vIDEuMiAtIDMuNC41ID0+ID49MS4yLjAgPD0zLjQuNVxuLy8gMS4yLjMgLSAzLjQgPT4gPj0xLjIuMCA8My41LjAtMCBBbnkgMy40Lnggd2lsbCBkb1xuLy8gMS4yIC0gMy40ID0+ID49MS4yLjAgPDMuNS4wLTBcbi8vIFRPRE8gYnVpbGQ/XG5jb25zdCBoeXBoZW5SZXBsYWNlID0gaW5jUHIgPT4gKCQwLFxuICBmcm9tLCBmTSwgZm0sIGZwLCBmcHIsIGZiLFxuICB0bywgdE0sIHRtLCB0cCwgdHByKSA9PiB7XG4gIGlmIChpc1goZk0pKSB7XG4gICAgZnJvbSA9ICcnXG4gIH0gZWxzZSBpZiAoaXNYKGZtKSkge1xuICAgIGZyb20gPSBgPj0ke2ZNfS4wLjAke2luY1ByID8gJy0wJyA6ICcnfWBcbiAgfSBlbHNlIGlmIChpc1goZnApKSB7XG4gICAgZnJvbSA9IGA+PSR7Zk19LiR7Zm19LjAke2luY1ByID8gJy0wJyA6ICcnfWBcbiAgfSBlbHNlIGlmIChmcHIpIHtcbiAgICBmcm9tID0gYD49JHtmcm9tfWBcbiAgfSBlbHNlIHtcbiAgICBmcm9tID0gYD49JHtmcm9tfSR7aW5jUHIgPyAnLTAnIDogJyd9YFxuICB9XG5cbiAgaWYgKGlzWCh0TSkpIHtcbiAgICB0byA9ICcnXG4gIH0gZWxzZSBpZiAoaXNYKHRtKSkge1xuICAgIHRvID0gYDwkeyt0TSArIDF9LjAuMC0wYFxuICB9IGVsc2UgaWYgKGlzWCh0cCkpIHtcbiAgICB0byA9IGA8JHt0TX0uJHsrdG0gKyAxfS4wLTBgXG4gIH0gZWxzZSBpZiAodHByKSB7XG4gICAgdG8gPSBgPD0ke3RNfS4ke3RtfS4ke3RwfS0ke3Rwcn1gXG4gIH0gZWxzZSBpZiAoaW5jUHIpIHtcbiAgICB0byA9IGA8JHt0TX0uJHt0bX0uJHsrdHAgKyAxfS0wYFxuICB9IGVsc2Uge1xuICAgIHRvID0gYDw9JHt0b31gXG4gIH1cblxuICByZXR1cm4gYCR7ZnJvbX0gJHt0b31gLnRyaW0oKVxufVxuXG5jb25zdCB0ZXN0U2V0ID0gKHNldCwgdmVyc2lvbiwgb3B0aW9ucykgPT4ge1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHNldC5sZW5ndGg7IGkrKykge1xuICAgIGlmICghc2V0W2ldLnRlc3QodmVyc2lvbikpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfVxuXG4gIGlmICh2ZXJzaW9uLnByZXJlbGVhc2UubGVuZ3RoICYmICFvcHRpb25zLmluY2x1ZGVQcmVyZWxlYXNlKSB7XG4gICAgLy8gRmluZCB0aGUgc2V0IG9mIHZlcnNpb25zIHRoYXQgYXJlIGFsbG93ZWQgdG8gaGF2ZSBwcmVyZWxlYXNlc1xuICAgIC8vIEZvciBleGFtcGxlLCBeMS4yLjMtcHIuMSBkZXN1Z2FycyB0byA+PTEuMi4zLXByLjEgPDIuMC4wXG4gICAgLy8gVGhhdCBzaG91bGQgYWxsb3cgYDEuMi4zLXByLjJgIHRvIHBhc3MuXG4gICAgLy8gSG93ZXZlciwgYDEuMi40LWFscGhhLm5vdHJlYWR5YCBzaG91bGQgTk9UIGJlIGFsbG93ZWQsXG4gICAgLy8gZXZlbiB0aG91Z2ggaXQncyB3aXRoaW4gdGhlIHJhbmdlIHNldCBieSB0aGUgY29tcGFyYXRvcnMuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZXQubGVuZ3RoOyBpKyspIHtcbiAgICAgIGRlYnVnKHNldFtpXS5zZW12ZXIpXG4gICAgICBpZiAoc2V0W2ldLnNlbXZlciA9PT0gQ29tcGFyYXRvci5BTlkpIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgaWYgKHNldFtpXS5zZW12ZXIucHJlcmVsZWFzZS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IGFsbG93ZWQgPSBzZXRbaV0uc2VtdmVyXG4gICAgICAgIGlmIChhbGxvd2VkLm1ham9yID09PSB2ZXJzaW9uLm1ham9yICYmXG4gICAgICAgICAgICBhbGxvd2VkLm1pbm9yID09PSB2ZXJzaW9uLm1pbm9yICYmXG4gICAgICAgICAgICBhbGxvd2VkLnBhdGNoID09PSB2ZXJzaW9uLnBhdGNoKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFZlcnNpb24gaGFzIGEgLXByZSwgYnV0IGl0J3Mgbm90IG9uZSBvZiB0aGUgb25lcyB3ZSBsaWtlLlxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgcmV0dXJuIHRydWVcbn1cbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///12\n")},function(module,exports,__webpack_require__){eval("/**\n * An API for getting cryptographically-secure random bytes. The bytes are\n * generated using the Fortuna algorithm devised by Bruce Schneier and\n * Niels Ferguson.\n *\n * Getting strong random bytes is not yet easy to do in javascript. The only\n * truish random entropy that can be collected is from the mouse, keyboard, or\n * from timing with respect to page loads, etc. This generator makes a poor\n * attempt at providing random bytes when those sources haven't yet provided\n * enough entropy to initially seed or to reseed the PRNG.\n *\n * @author Dave Longley\n *\n * Copyright (c) 2009-2014 Digital Bazaar, Inc.\n */\nvar forge = __webpack_require__(4);\n__webpack_require__(22);\n__webpack_require__(82);\n__webpack_require__(83);\n__webpack_require__(7);\n\n(function() {\n\n// forge.random already defined\nif(forge.random && forge.random.getBytes) {\n  module.exports = forge.random;\n  return;\n}\n\n(function(jQuery) {\n\n// the default prng plugin, uses AES-128\nvar prng_aes = {};\nvar _prng_aes_output = new Array(4);\nvar _prng_aes_buffer = forge.util.createBuffer();\nprng_aes.formatKey = function(key) {\n  // convert the key into 32-bit integers\n  var tmp = forge.util.createBuffer(key);\n  key = new Array(4);\n  key[0] = tmp.getInt32();\n  key[1] = tmp.getInt32();\n  key[2] = tmp.getInt32();\n  key[3] = tmp.getInt32();\n\n  // return the expanded key\n  return forge.aes._expandKey(key, false);\n};\nprng_aes.formatSeed = function(seed) {\n  // convert seed into 32-bit integers\n  var tmp = forge.util.createBuffer(seed);\n  seed = new Array(4);\n  seed[0] = tmp.getInt32();\n  seed[1] = tmp.getInt32();\n  seed[2] = tmp.getInt32();\n  seed[3] = tmp.getInt32();\n  return seed;\n};\nprng_aes.cipher = function(key, seed) {\n  forge.aes._updateBlock(key, seed, _prng_aes_output, false);\n  _prng_aes_buffer.putInt32(_prng_aes_output[0]);\n  _prng_aes_buffer.putInt32(_prng_aes_output[1]);\n  _prng_aes_buffer.putInt32(_prng_aes_output[2]);\n  _prng_aes_buffer.putInt32(_prng_aes_output[3]);\n  return _prng_aes_buffer.getBytes();\n};\nprng_aes.increment = function(seed) {\n  // FIXME: do we care about carry or signed issues?\n  ++seed[3];\n  return seed;\n};\nprng_aes.md = forge.md.sha256;\n\n/**\n * Creates a new PRNG.\n */\nfunction spawnPrng() {\n  var ctx = forge.prng.create(prng_aes);\n\n  /**\n   * Gets random bytes. If a native secure crypto API is unavailable, this\n   * method tries to make the bytes more unpredictable by drawing from data that\n   * can be collected from the user of the browser, eg: mouse movement.\n   *\n   * If a callback is given, this method will be called asynchronously.\n   *\n   * @param count the number of random bytes to get.\n   * @param [callback(err, bytes)] called once the operation completes.\n   *\n   * @return the random bytes in a string.\n   */\n  ctx.getBytes = function(count, callback) {\n    return ctx.generate(count, callback);\n  };\n\n  /**\n   * Gets random bytes asynchronously. If a native secure crypto API is\n   * unavailable, this method tries to make the bytes more unpredictable by\n   * drawing from data that can be collected from the user of the browser,\n   * eg: mouse movement.\n   *\n   * @param count the number of random bytes to get.\n   *\n   * @return the random bytes in a string.\n   */\n  ctx.getBytesSync = function(count) {\n    return ctx.generate(count);\n  };\n\n  return ctx;\n}\n\n// create default prng context\nvar _ctx = spawnPrng();\n\n// add other sources of entropy only if window.crypto.getRandomValues is not\n// available -- otherwise this source will be automatically used by the prng\nvar getRandomValues = null;\nvar globalScope = forge.util.globalScope;\nvar _crypto = globalScope.crypto || globalScope.msCrypto;\nif(_crypto && _crypto.getRandomValues) {\n  getRandomValues = function(arr) {\n    return _crypto.getRandomValues(arr);\n  };\n}\n\nif(forge.options.usePureJavaScript ||\n  (!forge.util.isNodejs && !getRandomValues)) {\n  // if this is a web worker, do not use weak entropy, instead register to\n  // receive strong entropy asynchronously from the main thread\n  if(typeof window === 'undefined' || window.document === undefined) {\n    // FIXME:\n  }\n\n  // get load time entropy\n  _ctx.collectInt(+new Date(), 32);\n\n  // add some entropy from navigator object\n  if(typeof(navigator) !== 'undefined') {\n    var _navBytes = '';\n    for(var key in navigator) {\n      try {\n        if(typeof(navigator[key]) == 'string') {\n          _navBytes += navigator[key];\n        }\n      } catch(e) {\n        /* Some navigator keys might not be accessible, e.g. the geolocation\n          attribute throws an exception if touched in Mozilla chrome://\n          context.\n\n          Silently ignore this and just don't use this as a source of\n          entropy. */\n      }\n    }\n    _ctx.collect(_navBytes);\n    _navBytes = null;\n  }\n\n  // add mouse and keyboard collectors if jquery is available\n  if(jQuery) {\n    // set up mouse entropy capture\n    jQuery().mousemove(function(e) {\n      // add mouse coords\n      _ctx.collectInt(e.clientX, 16);\n      _ctx.collectInt(e.clientY, 16);\n    });\n\n    // set up keyboard entropy capture\n    jQuery().keypress(function(e) {\n      _ctx.collectInt(e.charCode, 8);\n    });\n  }\n}\n\n/* Random API */\nif(!forge.random) {\n  forge.random = _ctx;\n} else {\n  // extend forge.random with _ctx\n  for(var key in _ctx) {\n    forge.random[key] = _ctx[key];\n  }\n}\n\n// expose spawn PRNG\nforge.random.createInstance = spawnPrng;\n\nmodule.exports = forge.random;\n\n})(typeof(jQuery) !== 'undefined' ? jQuery : null);\n\n})();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbm9kZS1mb3JnZS9saWIvcmFuZG9tLmpzPzRhNzMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBBbiBBUEkgZm9yIGdldHRpbmcgY3J5cHRvZ3JhcGhpY2FsbHktc2VjdXJlIHJhbmRvbSBieXRlcy4gVGhlIGJ5dGVzIGFyZVxuICogZ2VuZXJhdGVkIHVzaW5nIHRoZSBGb3J0dW5hIGFsZ29yaXRobSBkZXZpc2VkIGJ5IEJydWNlIFNjaG5laWVyIGFuZFxuICogTmllbHMgRmVyZ3Vzb24uXG4gKlxuICogR2V0dGluZyBzdHJvbmcgcmFuZG9tIGJ5dGVzIGlzIG5vdCB5ZXQgZWFzeSB0byBkbyBpbiBqYXZhc2NyaXB0LiBUaGUgb25seVxuICogdHJ1aXNoIHJhbmRvbSBlbnRyb3B5IHRoYXQgY2FuIGJlIGNvbGxlY3RlZCBpcyBmcm9tIHRoZSBtb3VzZSwga2V5Ym9hcmQsIG9yXG4gKiBmcm9tIHRpbWluZyB3aXRoIHJlc3BlY3QgdG8gcGFnZSBsb2FkcywgZXRjLiBUaGlzIGdlbmVyYXRvciBtYWtlcyBhIHBvb3JcbiAqIGF0dGVtcHQgYXQgcHJvdmlkaW5nIHJhbmRvbSBieXRlcyB3aGVuIHRob3NlIHNvdXJjZXMgaGF2ZW4ndCB5ZXQgcHJvdmlkZWRcbiAqIGVub3VnaCBlbnRyb3B5IHRvIGluaXRpYWxseSBzZWVkIG9yIHRvIHJlc2VlZCB0aGUgUFJORy5cbiAqXG4gKiBAYXV0aG9yIERhdmUgTG9uZ2xleVxuICpcbiAqIENvcHlyaWdodCAoYykgMjAwOS0yMDE0IERpZ2l0YWwgQmF6YWFyLCBJbmMuXG4gKi9cbnZhciBmb3JnZSA9IHJlcXVpcmUoJy4vZm9yZ2UnKTtcbnJlcXVpcmUoJy4vYWVzJyk7XG5yZXF1aXJlKCcuL3NoYTI1NicpO1xucmVxdWlyZSgnLi9wcm5nJyk7XG5yZXF1aXJlKCcuL3V0aWwnKTtcblxuKGZ1bmN0aW9uKCkge1xuXG4vLyBmb3JnZS5yYW5kb20gYWxyZWFkeSBkZWZpbmVkXG5pZihmb3JnZS5yYW5kb20gJiYgZm9yZ2UucmFuZG9tLmdldEJ5dGVzKSB7XG4gIG1vZHVsZS5leHBvcnRzID0gZm9yZ2UucmFuZG9tO1xuICByZXR1cm47XG59XG5cbihmdW5jdGlvbihqUXVlcnkpIHtcblxuLy8gdGhlIGRlZmF1bHQgcHJuZyBwbHVnaW4sIHVzZXMgQUVTLTEyOFxudmFyIHBybmdfYWVzID0ge307XG52YXIgX3BybmdfYWVzX291dHB1dCA9IG5ldyBBcnJheSg0KTtcbnZhciBfcHJuZ19hZXNfYnVmZmVyID0gZm9yZ2UudXRpbC5jcmVhdGVCdWZmZXIoKTtcbnBybmdfYWVzLmZvcm1hdEtleSA9IGZ1bmN0aW9uKGtleSkge1xuICAvLyBjb252ZXJ0IHRoZSBrZXkgaW50byAzMi1iaXQgaW50ZWdlcnNcbiAgdmFyIHRtcCA9IGZvcmdlLnV0aWwuY3JlYXRlQnVmZmVyKGtleSk7XG4gIGtleSA9IG5ldyBBcnJheSg0KTtcbiAga2V5WzBdID0gdG1wLmdldEludDMyKCk7XG4gIGtleVsxXSA9IHRtcC5nZXRJbnQzMigpO1xuICBrZXlbMl0gPSB0bXAuZ2V0SW50MzIoKTtcbiAga2V5WzNdID0gdG1wLmdldEludDMyKCk7XG5cbiAgLy8gcmV0dXJuIHRoZSBleHBhbmRlZCBrZXlcbiAgcmV0dXJuIGZvcmdlLmFlcy5fZXhwYW5kS2V5KGtleSwgZmFsc2UpO1xufTtcbnBybmdfYWVzLmZvcm1hdFNlZWQgPSBmdW5jdGlvbihzZWVkKSB7XG4gIC8vIGNvbnZlcnQgc2VlZCBpbnRvIDMyLWJpdCBpbnRlZ2Vyc1xuICB2YXIgdG1wID0gZm9yZ2UudXRpbC5jcmVhdGVCdWZmZXIoc2VlZCk7XG4gIHNlZWQgPSBuZXcgQXJyYXkoNCk7XG4gIHNlZWRbMF0gPSB0bXAuZ2V0SW50MzIoKTtcbiAgc2VlZFsxXSA9IHRtcC5nZXRJbnQzMigpO1xuICBzZWVkWzJdID0gdG1wLmdldEludDMyKCk7XG4gIHNlZWRbM10gPSB0bXAuZ2V0SW50MzIoKTtcbiAgcmV0dXJuIHNlZWQ7XG59O1xucHJuZ19hZXMuY2lwaGVyID0gZnVuY3Rpb24oa2V5LCBzZWVkKSB7XG4gIGZvcmdlLmFlcy5fdXBkYXRlQmxvY2soa2V5LCBzZWVkLCBfcHJuZ19hZXNfb3V0cHV0LCBmYWxzZSk7XG4gIF9wcm5nX2Flc19idWZmZXIucHV0SW50MzIoX3BybmdfYWVzX291dHB1dFswXSk7XG4gIF9wcm5nX2Flc19idWZmZXIucHV0SW50MzIoX3BybmdfYWVzX291dHB1dFsxXSk7XG4gIF9wcm5nX2Flc19idWZmZXIucHV0SW50MzIoX3BybmdfYWVzX291dHB1dFsyXSk7XG4gIF9wcm5nX2Flc19idWZmZXIucHV0SW50MzIoX3BybmdfYWVzX291dHB1dFszXSk7XG4gIHJldHVybiBfcHJuZ19hZXNfYnVmZmVyLmdldEJ5dGVzKCk7XG59O1xucHJuZ19hZXMuaW5jcmVtZW50ID0gZnVuY3Rpb24oc2VlZCkge1xuICAvLyBGSVhNRTogZG8gd2UgY2FyZSBhYm91dCBjYXJyeSBvciBzaWduZWQgaXNzdWVzP1xuICArK3NlZWRbM107XG4gIHJldHVybiBzZWVkO1xufTtcbnBybmdfYWVzLm1kID0gZm9yZ2UubWQuc2hhMjU2O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgUFJORy5cbiAqL1xuZnVuY3Rpb24gc3Bhd25Qcm5nKCkge1xuICB2YXIgY3R4ID0gZm9yZ2UucHJuZy5jcmVhdGUocHJuZ19hZXMpO1xuXG4gIC8qKlxuICAgKiBHZXRzIHJhbmRvbSBieXRlcy4gSWYgYSBuYXRpdmUgc2VjdXJlIGNyeXB0byBBUEkgaXMgdW5hdmFpbGFibGUsIHRoaXNcbiAgICogbWV0aG9kIHRyaWVzIHRvIG1ha2UgdGhlIGJ5dGVzIG1vcmUgdW5wcmVkaWN0YWJsZSBieSBkcmF3aW5nIGZyb20gZGF0YSB0aGF0XG4gICAqIGNhbiBiZSBjb2xsZWN0ZWQgZnJvbSB0aGUgdXNlciBvZiB0aGUgYnJvd3NlciwgZWc6IG1vdXNlIG1vdmVtZW50LlxuICAgKlxuICAgKiBJZiBhIGNhbGxiYWNrIGlzIGdpdmVuLCB0aGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBhc3luY2hyb25vdXNseS5cbiAgICpcbiAgICogQHBhcmFtIGNvdW50IHRoZSBudW1iZXIgb2YgcmFuZG9tIGJ5dGVzIHRvIGdldC5cbiAgICogQHBhcmFtIFtjYWxsYmFjayhlcnIsIGJ5dGVzKV0gY2FsbGVkIG9uY2UgdGhlIG9wZXJhdGlvbiBjb21wbGV0ZXMuXG4gICAqXG4gICAqIEByZXR1cm4gdGhlIHJhbmRvbSBieXRlcyBpbiBhIHN0cmluZy5cbiAgICovXG4gIGN0eC5nZXRCeXRlcyA9IGZ1bmN0aW9uKGNvdW50LCBjYWxsYmFjaykge1xuICAgIHJldHVybiBjdHguZ2VuZXJhdGUoY291bnQsIGNhbGxiYWNrKTtcbiAgfTtcblxuICAvKipcbiAgICogR2V0cyByYW5kb20gYnl0ZXMgYXN5bmNocm9ub3VzbHkuIElmIGEgbmF0aXZlIHNlY3VyZSBjcnlwdG8gQVBJIGlzXG4gICAqIHVuYXZhaWxhYmxlLCB0aGlzIG1ldGhvZCB0cmllcyB0byBtYWtlIHRoZSBieXRlcyBtb3JlIHVucHJlZGljdGFibGUgYnlcbiAgICogZHJhd2luZyBmcm9tIGRhdGEgdGhhdCBjYW4gYmUgY29sbGVjdGVkIGZyb20gdGhlIHVzZXIgb2YgdGhlIGJyb3dzZXIsXG4gICAqIGVnOiBtb3VzZSBtb3ZlbWVudC5cbiAgICpcbiAgICogQHBhcmFtIGNvdW50IHRoZSBudW1iZXIgb2YgcmFuZG9tIGJ5dGVzIHRvIGdldC5cbiAgICpcbiAgICogQHJldHVybiB0aGUgcmFuZG9tIGJ5dGVzIGluIGEgc3RyaW5nLlxuICAgKi9cbiAgY3R4LmdldEJ5dGVzU3luYyA9IGZ1bmN0aW9uKGNvdW50KSB7XG4gICAgcmV0dXJuIGN0eC5nZW5lcmF0ZShjb3VudCk7XG4gIH07XG5cbiAgcmV0dXJuIGN0eDtcbn1cblxuLy8gY3JlYXRlIGRlZmF1bHQgcHJuZyBjb250ZXh0XG52YXIgX2N0eCA9IHNwYXduUHJuZygpO1xuXG4vLyBhZGQgb3RoZXIgc291cmNlcyBvZiBlbnRyb3B5IG9ubHkgaWYgd2luZG93LmNyeXB0by5nZXRSYW5kb21WYWx1ZXMgaXMgbm90XG4vLyBhdmFpbGFibGUgLS0gb3RoZXJ3aXNlIHRoaXMgc291cmNlIHdpbGwgYmUgYXV0b21hdGljYWxseSB1c2VkIGJ5IHRoZSBwcm5nXG52YXIgZ2V0UmFuZG9tVmFsdWVzID0gbnVsbDtcbnZhciBnbG9iYWxTY29wZSA9IGZvcmdlLnV0aWwuZ2xvYmFsU2NvcGU7XG52YXIgX2NyeXB0byA9IGdsb2JhbFNjb3BlLmNyeXB0byB8fCBnbG9iYWxTY29wZS5tc0NyeXB0bztcbmlmKF9jcnlwdG8gJiYgX2NyeXB0by5nZXRSYW5kb21WYWx1ZXMpIHtcbiAgZ2V0UmFuZG9tVmFsdWVzID0gZnVuY3Rpb24oYXJyKSB7XG4gICAgcmV0dXJuIF9jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKGFycik7XG4gIH07XG59XG5cbmlmKGZvcmdlLm9wdGlvbnMudXNlUHVyZUphdmFTY3JpcHQgfHxcbiAgKCFmb3JnZS51dGlsLmlzTm9kZWpzICYmICFnZXRSYW5kb21WYWx1ZXMpKSB7XG4gIC8vIGlmIHRoaXMgaXMgYSB3ZWIgd29ya2VyLCBkbyBub3QgdXNlIHdlYWsgZW50cm9weSwgaW5zdGVhZCByZWdpc3RlciB0b1xuICAvLyByZWNlaXZlIHN0cm9uZyBlbnRyb3B5IGFzeW5jaHJvbm91c2x5IGZyb20gdGhlIG1haW4gdGhyZWFkXG4gIGlmKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnIHx8IHdpbmRvdy5kb2N1bWVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgLy8gRklYTUU6XG4gIH1cblxuICAvLyBnZXQgbG9hZCB0aW1lIGVudHJvcHlcbiAgX2N0eC5jb2xsZWN0SW50KCtuZXcgRGF0ZSgpLCAzMik7XG5cbiAgLy8gYWRkIHNvbWUgZW50cm9weSBmcm9tIG5hdmlnYXRvciBvYmplY3RcbiAgaWYodHlwZW9mKG5hdmlnYXRvcikgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgdmFyIF9uYXZCeXRlcyA9ICcnO1xuICAgIGZvcih2YXIga2V5IGluIG5hdmlnYXRvcikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYodHlwZW9mKG5hdmlnYXRvcltrZXldKSA9PSAnc3RyaW5nJykge1xuICAgICAgICAgIF9uYXZCeXRlcyArPSBuYXZpZ2F0b3Jba2V5XTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaChlKSB7XG4gICAgICAgIC8qIFNvbWUgbmF2aWdhdG9yIGtleXMgbWlnaHQgbm90IGJlIGFjY2Vzc2libGUsIGUuZy4gdGhlIGdlb2xvY2F0aW9uXG4gICAgICAgICAgYXR0cmlidXRlIHRocm93cyBhbiBleGNlcHRpb24gaWYgdG91Y2hlZCBpbiBNb3ppbGxhIGNocm9tZTovL1xuICAgICAgICAgIGNvbnRleHQuXG5cbiAgICAgICAgICBTaWxlbnRseSBpZ25vcmUgdGhpcyBhbmQganVzdCBkb24ndCB1c2UgdGhpcyBhcyBhIHNvdXJjZSBvZlxuICAgICAgICAgIGVudHJvcHkuICovXG4gICAgICB9XG4gICAgfVxuICAgIF9jdHguY29sbGVjdChfbmF2Qnl0ZXMpO1xuICAgIF9uYXZCeXRlcyA9IG51bGw7XG4gIH1cblxuICAvLyBhZGQgbW91c2UgYW5kIGtleWJvYXJkIGNvbGxlY3RvcnMgaWYganF1ZXJ5IGlzIGF2YWlsYWJsZVxuICBpZihqUXVlcnkpIHtcbiAgICAvLyBzZXQgdXAgbW91c2UgZW50cm9weSBjYXB0dXJlXG4gICAgalF1ZXJ5KCkubW91c2Vtb3ZlKGZ1bmN0aW9uKGUpIHtcbiAgICAgIC8vIGFkZCBtb3VzZSBjb29yZHNcbiAgICAgIF9jdHguY29sbGVjdEludChlLmNsaWVudFgsIDE2KTtcbiAgICAgIF9jdHguY29sbGVjdEludChlLmNsaWVudFksIDE2KTtcbiAgICB9KTtcblxuICAgIC8vIHNldCB1cCBrZXlib2FyZCBlbnRyb3B5IGNhcHR1cmVcbiAgICBqUXVlcnkoKS5rZXlwcmVzcyhmdW5jdGlvbihlKSB7XG4gICAgICBfY3R4LmNvbGxlY3RJbnQoZS5jaGFyQ29kZSwgOCk7XG4gICAgfSk7XG4gIH1cbn1cblxuLyogUmFuZG9tIEFQSSAqL1xuaWYoIWZvcmdlLnJhbmRvbSkge1xuICBmb3JnZS5yYW5kb20gPSBfY3R4O1xufSBlbHNlIHtcbiAgLy8gZXh0ZW5kIGZvcmdlLnJhbmRvbSB3aXRoIF9jdHhcbiAgZm9yKHZhciBrZXkgaW4gX2N0eCkge1xuICAgIGZvcmdlLnJhbmRvbVtrZXldID0gX2N0eFtrZXldO1xuICB9XG59XG5cbi8vIGV4cG9zZSBzcGF3biBQUk5HXG5mb3JnZS5yYW5kb20uY3JlYXRlSW5zdGFuY2UgPSBzcGF3blBybmc7XG5cbm1vZHVsZS5leHBvcnRzID0gZm9yZ2UucmFuZG9tO1xuXG59KSh0eXBlb2YoalF1ZXJ5KSAhPT0gJ3VuZGVmaW5lZCcgPyBqUXVlcnkgOiBudWxsKTtcblxufSkoKTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///13\n")},function(module,exports,__webpack_require__){eval("/**\n * Javascript implementation of Abstract Syntax Notation Number One.\n *\n * @author Dave Longley\n *\n * Copyright (c) 2010-2015 Digital Bazaar, Inc.\n *\n * An API for storing data using the Abstract Syntax Notation Number One\n * format using DER (Distinguished Encoding Rules) encoding. This encoding is\n * commonly used to store data for PKI, i.e. X.509 Certificates, and this\n * implementation exists for that purpose.\n *\n * Abstract Syntax Notation Number One (ASN.1) is used to define the abstract\n * syntax of information without restricting the way the information is encoded\n * for transmission. It provides a standard that allows for open systems\n * communication. ASN.1 defines the syntax of information data and a number of\n * simple data types as well as a notation for describing them and specifying\n * values for them.\n *\n * The RSA algorithm creates public and private keys that are often stored in\n * X.509 or PKCS#X formats -- which use ASN.1 (encoded in DER format). This\n * class provides the most basic functionality required to store and load DSA\n * keys that are encoded according to ASN.1.\n *\n * The most common binary encodings for ASN.1 are BER (Basic Encoding Rules)\n * and DER (Distinguished Encoding Rules). DER is just a subset of BER that\n * has stricter requirements for how data must be encoded.\n *\n * Each ASN.1 structure has a tag (a byte identifying the ASN.1 structure type)\n * and a byte array for the value of this ASN1 structure which may be data or a\n * list of ASN.1 structures.\n *\n * Each ASN.1 structure using BER is (Tag-Length-Value):\n *\n * | byte 0 | bytes X | bytes Y |\n * |--------|---------|----------\n * |  tag   | length  |  value  |\n *\n * ASN.1 allows for tags to be of \"High-tag-number form\" which allows a tag to\n * be two or more octets, but that is not supported by this class. A tag is\n * only 1 byte. Bits 1-5 give the tag number (ie the data type within a\n * particular 'class'), 6 indicates whether or not the ASN.1 value is\n * constructed from other ASN.1 values, and bits 7 and 8 give the 'class'. If\n * bits 7 and 8 are both zero, the class is UNIVERSAL. If only bit 7 is set,\n * then the class is APPLICATION. If only bit 8 is set, then the class is\n * CONTEXT_SPECIFIC. If both bits 7 and 8 are set, then the class is PRIVATE.\n * The tag numbers for the data types for the class UNIVERSAL are listed below:\n *\n * UNIVERSAL 0 Reserved for use by the encoding rules\n * UNIVERSAL 1 Boolean type\n * UNIVERSAL 2 Integer type\n * UNIVERSAL 3 Bitstring type\n * UNIVERSAL 4 Octetstring type\n * UNIVERSAL 5 Null type\n * UNIVERSAL 6 Object identifier type\n * UNIVERSAL 7 Object descriptor type\n * UNIVERSAL 8 External type and Instance-of type\n * UNIVERSAL 9 Real type\n * UNIVERSAL 10 Enumerated type\n * UNIVERSAL 11 Embedded-pdv type\n * UNIVERSAL 12 UTF8String type\n * UNIVERSAL 13 Relative object identifier type\n * UNIVERSAL 14-15 Reserved for future editions\n * UNIVERSAL 16 Sequence and Sequence-of types\n * UNIVERSAL 17 Set and Set-of types\n * UNIVERSAL 18-22, 25-30 Character string types\n * UNIVERSAL 23-24 Time types\n *\n * The length of an ASN.1 structure is specified after the tag identifier.\n * There is a definite form and an indefinite form. The indefinite form may\n * be used if the encoding is constructed and not all immediately available.\n * The indefinite form is encoded using a length byte with only the 8th bit\n * set. The end of the constructed object is marked using end-of-contents\n * octets (two zero bytes).\n *\n * The definite form looks like this:\n *\n * The length may take up 1 or more bytes, it depends on the length of the\n * value of the ASN.1 structure. DER encoding requires that if the ASN.1\n * structure has a value that has a length greater than 127, more than 1 byte\n * will be used to store its length, otherwise just one byte will be used.\n * This is strict.\n *\n * In the case that the length of the ASN.1 value is less than 127, 1 octet\n * (byte) is used to store the \"short form\" length. The 8th bit has a value of\n * 0 indicating the length is \"short form\" and not \"long form\" and bits 7-1\n * give the length of the data. (The 8th bit is the left-most, most significant\n * bit: also known as big endian or network format).\n *\n * In the case that the length of the ASN.1 value is greater than 127, 2 to\n * 127 octets (bytes) are used to store the \"long form\" length. The first\n * byte's 8th bit is set to 1 to indicate the length is \"long form.\" Bits 7-1\n * give the number of additional octets. All following octets are in base 256\n * with the most significant digit first (typical big-endian binary unsigned\n * integer storage). So, for instance, if the length of a value was 257, the\n * first byte would be set to:\n *\n * 10000010 = 130 = 0x82.\n *\n * This indicates there are 2 octets (base 256) for the length. The second and\n * third bytes (the octets just mentioned) would store the length in base 256:\n *\n * octet 2: 00000001 = 1 * 256^1 = 256\n * octet 3: 00000001 = 1 * 256^0 = 1\n * total = 257\n *\n * The algorithm for converting a js integer value of 257 to base-256 is:\n *\n * var value = 257;\n * var bytes = [];\n * bytes[0] = (value >>> 8) & 0xFF; // most significant byte first\n * bytes[1] = value & 0xFF;        // least significant byte last\n *\n * On the ASN.1 UNIVERSAL Object Identifier (OID) type:\n *\n * An OID can be written like: \"value1.value2.value3...valueN\"\n *\n * The DER encoding rules:\n *\n * The first byte has the value 40 * value1 + value2.\n * The following bytes, if any, encode the remaining values. Each value is\n * encoded in base 128, most significant digit first (big endian), with as\n * few digits as possible, and the most significant bit of each byte set\n * to 1 except the last in each value's encoding. For example: Given the\n * OID \"1.2.840.113549\", its DER encoding is (remember each byte except the\n * last one in each encoding is OR'd with 0x80):\n *\n * byte 1: 40 * 1 + 2 = 42 = 0x2A.\n * bytes 2-3: 128 * 6 + 72 = 840 = 6 72 = 6 72 = 0x0648 = 0x8648\n * bytes 4-6: 16384 * 6 + 128 * 119 + 13 = 6 119 13 = 0x06770D = 0x86F70D\n *\n * The final value is: 0x2A864886F70D.\n * The full OID (including ASN.1 tag and length of 6 bytes) is:\n * 0x06062A864886F70D\n */\nvar forge = __webpack_require__(4);\n__webpack_require__(7);\n__webpack_require__(23);\n\n/* ASN.1 API */\nvar asn1 = module.exports = forge.asn1 = forge.asn1 || {};\n\n/**\n * ASN.1 classes.\n */\nasn1.Class = {\n  UNIVERSAL:        0x00,\n  APPLICATION:      0x40,\n  CONTEXT_SPECIFIC: 0x80,\n  PRIVATE:          0xC0\n};\n\n/**\n * ASN.1 types. Not all types are supported by this implementation, only\n * those necessary to implement a simple PKI are implemented.\n */\nasn1.Type = {\n  NONE:             0,\n  BOOLEAN:          1,\n  INTEGER:          2,\n  BITSTRING:        3,\n  OCTETSTRING:      4,\n  NULL:             5,\n  OID:              6,\n  ODESC:            7,\n  EXTERNAL:         8,\n  REAL:             9,\n  ENUMERATED:      10,\n  EMBEDDED:        11,\n  UTF8:            12,\n  ROID:            13,\n  SEQUENCE:        16,\n  SET:             17,\n  PRINTABLESTRING: 19,\n  IA5STRING:       22,\n  UTCTIME:         23,\n  GENERALIZEDTIME: 24,\n  BMPSTRING:       30\n};\n\n/**\n * Creates a new asn1 object.\n *\n * @param tagClass the tag class for the object.\n * @param type the data type (tag number) for the object.\n * @param constructed true if the asn1 object is in constructed form.\n * @param value the value for the object, if it is not constructed.\n * @param [options] the options to use:\n *          [bitStringContents] the plain BIT STRING content including padding\n *            byte.\n *\n * @return the asn1 object.\n */\nasn1.create = function(tagClass, type, constructed, value, options) {\n  /* An asn1 object has a tagClass, a type, a constructed flag, and a\n    value. The value's type depends on the constructed flag. If\n    constructed, it will contain a list of other asn1 objects. If not,\n    it will contain the ASN.1 value as an array of bytes formatted\n    according to the ASN.1 data type. */\n\n  // remove undefined values\n  if(forge.util.isArray(value)) {\n    var tmp = [];\n    for(var i = 0; i < value.length; ++i) {\n      if(value[i] !== undefined) {\n        tmp.push(value[i]);\n      }\n    }\n    value = tmp;\n  }\n\n  var obj = {\n    tagClass: tagClass,\n    type: type,\n    constructed: constructed,\n    composed: constructed || forge.util.isArray(value),\n    value: value\n  };\n  if(options && 'bitStringContents' in options) {\n    // TODO: copy byte buffer if it's a buffer not a string\n    obj.bitStringContents = options.bitStringContents;\n    // TODO: add readonly flag to avoid this overhead\n    // save copy to detect changes\n    obj.original = asn1.copy(obj);\n  }\n  return obj;\n};\n\n/**\n * Copies an asn1 object.\n *\n * @param obj the asn1 object.\n * @param [options] copy options:\n *          [excludeBitStringContents] true to not copy bitStringContents\n *\n * @return the a copy of the asn1 object.\n */\nasn1.copy = function(obj, options) {\n  var copy;\n\n  if(forge.util.isArray(obj)) {\n    copy = [];\n    for(var i = 0; i < obj.length; ++i) {\n      copy.push(asn1.copy(obj[i], options));\n    }\n    return copy;\n  }\n\n  if(typeof obj === 'string') {\n    // TODO: copy byte buffer if it's a buffer not a string\n    return obj;\n  }\n\n  copy = {\n    tagClass: obj.tagClass,\n    type: obj.type,\n    constructed: obj.constructed,\n    composed: obj.composed,\n    value: asn1.copy(obj.value, options)\n  };\n  if(options && !options.excludeBitStringContents) {\n    // TODO: copy byte buffer if it's a buffer not a string\n    copy.bitStringContents = obj.bitStringContents;\n  }\n  return copy;\n};\n\n/**\n * Compares asn1 objects for equality.\n *\n * Note this function does not run in constant time.\n *\n * @param obj1 the first asn1 object.\n * @param obj2 the second asn1 object.\n * @param [options] compare options:\n *          [includeBitStringContents] true to compare bitStringContents\n *\n * @return true if the asn1 objects are equal.\n */\nasn1.equals = function(obj1, obj2, options) {\n  if(forge.util.isArray(obj1)) {\n    if(!forge.util.isArray(obj2)) {\n      return false;\n    }\n    if(obj1.length !== obj2.length) {\n      return false;\n    }\n    for(var i = 0; i < obj1.length; ++i) {\n      if(!asn1.equals(obj1[i], obj2[i])) {\n        return false;\n      }\n    }\n    return true;\n  }\n\n  if(typeof obj1 !== typeof obj2) {\n    return false;\n  }\n\n  if(typeof obj1 === 'string') {\n    return obj1 === obj2;\n  }\n\n  var equal = obj1.tagClass === obj2.tagClass &&\n    obj1.type === obj2.type &&\n    obj1.constructed === obj2.constructed &&\n    obj1.composed === obj2.composed &&\n    asn1.equals(obj1.value, obj2.value);\n  if(options && options.includeBitStringContents) {\n    equal = equal && (obj1.bitStringContents === obj2.bitStringContents);\n  }\n\n  return equal;\n};\n\n/**\n * Gets the length of a BER-encoded ASN.1 value.\n *\n * In case the length is not specified, undefined is returned.\n *\n * @param b the BER-encoded ASN.1 byte buffer, starting with the first\n *          length byte.\n *\n * @return the length of the BER-encoded ASN.1 value or undefined.\n */\nasn1.getBerValueLength = function(b) {\n  // TODO: move this function and related DER/BER functions to a der.js\n  // file; better abstract ASN.1 away from der/ber.\n  var b2 = b.getByte();\n  if(b2 === 0x80) {\n    return undefined;\n  }\n\n  // see if the length is \"short form\" or \"long form\" (bit 8 set)\n  var length;\n  var longForm = b2 & 0x80;\n  if(!longForm) {\n    // length is just the first byte\n    length = b2;\n  } else {\n    // the number of bytes the length is specified in bits 7 through 1\n    // and each length byte is in big-endian base-256\n    length = b.getInt((b2 & 0x7F) << 3);\n  }\n  return length;\n};\n\n/**\n * Check if the byte buffer has enough bytes. Throws an Error if not.\n *\n * @param bytes the byte buffer to parse from.\n * @param remaining the bytes remaining in the current parsing state.\n * @param n the number of bytes the buffer must have.\n */\nfunction _checkBufferLength(bytes, remaining, n) {\n  if(n > remaining) {\n    var error = new Error('Too few bytes to parse DER.');\n    error.available = bytes.length();\n    error.remaining = remaining;\n    error.requested = n;\n    throw error;\n  }\n}\n\n/**\n * Gets the length of a BER-encoded ASN.1 value.\n *\n * In case the length is not specified, undefined is returned.\n *\n * @param bytes the byte buffer to parse from.\n * @param remaining the bytes remaining in the current parsing state.\n *\n * @return the length of the BER-encoded ASN.1 value or undefined.\n */\nvar _getValueLength = function(bytes, remaining) {\n  // TODO: move this function and related DER/BER functions to a der.js\n  // file; better abstract ASN.1 away from der/ber.\n  // fromDer already checked that this byte exists\n  var b2 = bytes.getByte();\n  remaining--;\n  if(b2 === 0x80) {\n    return undefined;\n  }\n\n  // see if the length is \"short form\" or \"long form\" (bit 8 set)\n  var length;\n  var longForm = b2 & 0x80;\n  if(!longForm) {\n    // length is just the first byte\n    length = b2;\n  } else {\n    // the number of bytes the length is specified in bits 7 through 1\n    // and each length byte is in big-endian base-256\n    var longFormBytes = b2 & 0x7F;\n    _checkBufferLength(bytes, remaining, longFormBytes);\n    length = bytes.getInt(longFormBytes << 3);\n  }\n  // FIXME: this will only happen for 32 bit getInt with high bit set\n  if(length < 0) {\n    throw new Error('Negative length: ' + length);\n  }\n  return length;\n};\n\n/**\n * Parses an asn1 object from a byte buffer in DER format.\n *\n * @param bytes the byte buffer to parse from.\n * @param [strict] true to be strict when checking value lengths, false to\n *          allow truncated values (default: true).\n * @param [options] object with options or boolean strict flag\n *          [strict] true to be strict when checking value lengths, false to\n *            allow truncated values (default: true).\n *          [parseAllBytes] true to ensure all bytes are parsed\n *            (default: true)\n *          [decodeBitStrings] true to attempt to decode the content of\n *            BIT STRINGs (not OCTET STRINGs) using strict mode. Note that\n *            without schema support to understand the data context this can\n *            erroneously decode values that happen to be valid ASN.1. This\n *            flag will be deprecated or removed as soon as schema support is\n *            available. (default: true)\n *\n * @throws Will throw an error for various malformed input conditions.\n *\n * @return the parsed asn1 object.\n */\nasn1.fromDer = function(bytes, options) {\n  if(options === undefined) {\n    options = {\n      strict: true,\n      parseAllBytes: true,\n      decodeBitStrings: true\n    };\n  }\n  if(typeof options === 'boolean') {\n    options = {\n      strict: options,\n      parseAllBytes: true,\n      decodeBitStrings: true\n    };\n  }\n  if(!('strict' in options)) {\n    options.strict = true;\n  }\n  if(!('parseAllBytes' in options)) {\n    options.parseAllBytes = true;\n  }\n  if(!('decodeBitStrings' in options)) {\n    options.decodeBitStrings = true;\n  }\n\n  // wrap in buffer if needed\n  if(typeof bytes === 'string') {\n    bytes = forge.util.createBuffer(bytes);\n  }\n\n  var byteCount = bytes.length();\n  var value = _fromDer(bytes, bytes.length(), 0, options);\n  if(options.parseAllBytes && bytes.length() !== 0) {\n    var error = new Error('Unparsed DER bytes remain after ASN.1 parsing.');\n    error.byteCount = byteCount;\n    error.remaining = bytes.length();\n    throw error;\n  }\n  return value;\n};\n\n/**\n * Internal function to parse an asn1 object from a byte buffer in DER format.\n *\n * @param bytes the byte buffer to parse from.\n * @param remaining the number of bytes remaining for this chunk.\n * @param depth the current parsing depth.\n * @param options object with same options as fromDer().\n *\n * @return the parsed asn1 object.\n */\nfunction _fromDer(bytes, remaining, depth, options) {\n  // temporary storage for consumption calculations\n  var start;\n\n  // minimum length for ASN.1 DER structure is 2\n  _checkBufferLength(bytes, remaining, 2);\n\n  // get the first byte\n  var b1 = bytes.getByte();\n  // consumed one byte\n  remaining--;\n\n  // get the tag class\n  var tagClass = (b1 & 0xC0);\n\n  // get the type (bits 1-5)\n  var type = b1 & 0x1F;\n\n  // get the variable value length and adjust remaining bytes\n  start = bytes.length();\n  var length = _getValueLength(bytes, remaining);\n  remaining -= start - bytes.length();\n\n  // ensure there are enough bytes to get the value\n  if(length !== undefined && length > remaining) {\n    if(options.strict) {\n      var error = new Error('Too few bytes to read ASN.1 value.');\n      error.available = bytes.length();\n      error.remaining = remaining;\n      error.requested = length;\n      throw error;\n    }\n    // Note: be lenient with truncated values and use remaining state bytes\n    length = remaining;\n  }\n\n  // value storage\n  var value;\n  // possible BIT STRING contents storage\n  var bitStringContents;\n\n  // constructed flag is bit 6 (32 = 0x20) of the first byte\n  var constructed = ((b1 & 0x20) === 0x20);\n  if(constructed) {\n    // parse child asn1 objects from the value\n    value = [];\n    if(length === undefined) {\n      // asn1 object of indefinite length, read until end tag\n      for(;;) {\n        _checkBufferLength(bytes, remaining, 2);\n        if(bytes.bytes(2) === String.fromCharCode(0, 0)) {\n          bytes.getBytes(2);\n          remaining -= 2;\n          break;\n        }\n        start = bytes.length();\n        value.push(_fromDer(bytes, remaining, depth + 1, options));\n        remaining -= start - bytes.length();\n      }\n    } else {\n      // parsing asn1 object of definite length\n      while(length > 0) {\n        start = bytes.length();\n        value.push(_fromDer(bytes, length, depth + 1, options));\n        remaining -= start - bytes.length();\n        length -= start - bytes.length();\n      }\n    }\n  }\n\n  // if a BIT STRING, save the contents including padding\n  if(value === undefined && tagClass === asn1.Class.UNIVERSAL &&\n    type === asn1.Type.BITSTRING) {\n    bitStringContents = bytes.bytes(length);\n  }\n\n  // determine if a non-constructed value should be decoded as a composed\n  // value that contains other ASN.1 objects. BIT STRINGs (and OCTET STRINGs)\n  // can be used this way.\n  if(value === undefined && options.decodeBitStrings &&\n    tagClass === asn1.Class.UNIVERSAL &&\n    // FIXME: OCTET STRINGs not yet supported here\n    // .. other parts of forge expect to decode OCTET STRINGs manually\n    (type === asn1.Type.BITSTRING /*|| type === asn1.Type.OCTETSTRING*/) &&\n    length > 1) {\n    // save read position\n    var savedRead = bytes.read;\n    var savedRemaining = remaining;\n    var unused = 0;\n    if(type === asn1.Type.BITSTRING) {\n      /* The first octet gives the number of bits by which the length of the\n        bit string is less than the next multiple of eight (this is called\n        the \"number of unused bits\").\n\n        The second and following octets give the value of the bit string\n        converted to an octet string. */\n      _checkBufferLength(bytes, remaining, 1);\n      unused = bytes.getByte();\n      remaining--;\n    }\n    // if all bits are used, maybe the BIT/OCTET STRING holds ASN.1 objs\n    if(unused === 0) {\n      try {\n        // attempt to parse child asn1 object from the value\n        // (stored in array to signal composed value)\n        start = bytes.length();\n        var subOptions = {\n          // enforce strict mode to avoid parsing ASN.1 from plain data\n          strict: true,\n          decodeBitStrings: true\n        };\n        var composed = _fromDer(bytes, remaining, depth + 1, subOptions);\n        var used = start - bytes.length();\n        remaining -= used;\n        if(type == asn1.Type.BITSTRING) {\n          used++;\n        }\n\n        // if the data all decoded and the class indicates UNIVERSAL or\n        // CONTEXT_SPECIFIC then assume we've got an encapsulated ASN.1 object\n        var tc = composed.tagClass;\n        if(used === length &&\n          (tc === asn1.Class.UNIVERSAL || tc === asn1.Class.CONTEXT_SPECIFIC)) {\n          value = [composed];\n        }\n      } catch(ex) {\n      }\n    }\n    if(value === undefined) {\n      // restore read position\n      bytes.read = savedRead;\n      remaining = savedRemaining;\n    }\n  }\n\n  if(value === undefined) {\n    // asn1 not constructed or composed, get raw value\n    // TODO: do DER to OID conversion and vice-versa in .toDer?\n\n    if(length === undefined) {\n      if(options.strict) {\n        throw new Error('Non-constructed ASN.1 object of indefinite length.');\n      }\n      // be lenient and use remaining state bytes\n      length = remaining;\n    }\n\n    if(type === asn1.Type.BMPSTRING) {\n      value = '';\n      for(; length > 0; length -= 2) {\n        _checkBufferLength(bytes, remaining, 2);\n        value += String.fromCharCode(bytes.getInt16());\n        remaining -= 2;\n      }\n    } else {\n      value = bytes.getBytes(length);\n      remaining -= length;\n    }\n  }\n\n  // add BIT STRING contents if available\n  var asn1Options = bitStringContents === undefined ? null : {\n    bitStringContents: bitStringContents\n  };\n\n  // create and return asn1 object\n  return asn1.create(tagClass, type, constructed, value, asn1Options);\n}\n\n/**\n * Converts the given asn1 object to a buffer of bytes in DER format.\n *\n * @param asn1 the asn1 object to convert to bytes.\n *\n * @return the buffer of bytes.\n */\nasn1.toDer = function(obj) {\n  var bytes = forge.util.createBuffer();\n\n  // build the first byte\n  var b1 = obj.tagClass | obj.type;\n\n  // for storing the ASN.1 value\n  var value = forge.util.createBuffer();\n\n  // use BIT STRING contents if available and data not changed\n  var useBitStringContents = false;\n  if('bitStringContents' in obj) {\n    useBitStringContents = true;\n    if(obj.original) {\n      useBitStringContents = asn1.equals(obj, obj.original);\n    }\n  }\n\n  if(useBitStringContents) {\n    value.putBytes(obj.bitStringContents);\n  } else if(obj.composed) {\n    // if composed, use each child asn1 object's DER bytes as value\n    // turn on 6th bit (0x20 = 32) to indicate asn1 is constructed\n    // from other asn1 objects\n    if(obj.constructed) {\n      b1 |= 0x20;\n    } else {\n      // type is a bit string, add unused bits of 0x00\n      value.putByte(0x00);\n    }\n\n    // add all of the child DER bytes together\n    for(var i = 0; i < obj.value.length; ++i) {\n      if(obj.value[i] !== undefined) {\n        value.putBuffer(asn1.toDer(obj.value[i]));\n      }\n    }\n  } else {\n    // use asn1.value directly\n    if(obj.type === asn1.Type.BMPSTRING) {\n      for(var i = 0; i < obj.value.length; ++i) {\n        value.putInt16(obj.value.charCodeAt(i));\n      }\n    } else {\n      // ensure integer is minimally-encoded\n      // TODO: should all leading bytes be stripped vs just one?\n      // .. ex '00 00 01' => '01'?\n      if(obj.type === asn1.Type.INTEGER &&\n        obj.value.length > 1 &&\n        // leading 0x00 for positive integer\n        ((obj.value.charCodeAt(0) === 0 &&\n        (obj.value.charCodeAt(1) & 0x80) === 0) ||\n        // leading 0xFF for negative integer\n        (obj.value.charCodeAt(0) === 0xFF &&\n        (obj.value.charCodeAt(1) & 0x80) === 0x80))) {\n        value.putBytes(obj.value.substr(1));\n      } else {\n        value.putBytes(obj.value);\n      }\n    }\n  }\n\n  // add tag byte\n  bytes.putByte(b1);\n\n  // use \"short form\" encoding\n  if(value.length() <= 127) {\n    // one byte describes the length\n    // bit 8 = 0 and bits 7-1 = length\n    bytes.putByte(value.length() & 0x7F);\n  } else {\n    // use \"long form\" encoding\n    // 2 to 127 bytes describe the length\n    // first byte: bit 8 = 1 and bits 7-1 = # of additional bytes\n    // other bytes: length in base 256, big-endian\n    var len = value.length();\n    var lenBytes = '';\n    do {\n      lenBytes += String.fromCharCode(len & 0xFF);\n      len = len >>> 8;\n    } while(len > 0);\n\n    // set first byte to # bytes used to store the length and turn on\n    // bit 8 to indicate long-form length is used\n    bytes.putByte(lenBytes.length | 0x80);\n\n    // concatenate length bytes in reverse since they were generated\n    // little endian and we need big endian\n    for(var i = lenBytes.length - 1; i >= 0; --i) {\n      bytes.putByte(lenBytes.charCodeAt(i));\n    }\n  }\n\n  // concatenate value bytes\n  bytes.putBuffer(value);\n  return bytes;\n};\n\n/**\n * Converts an OID dot-separated string to a byte buffer. The byte buffer\n * contains only the DER-encoded value, not any tag or length bytes.\n *\n * @param oid the OID dot-separated string.\n *\n * @return the byte buffer.\n */\nasn1.oidToDer = function(oid) {\n  // split OID into individual values\n  var values = oid.split('.');\n  var bytes = forge.util.createBuffer();\n\n  // first byte is 40 * value1 + value2\n  bytes.putByte(40 * parseInt(values[0], 10) + parseInt(values[1], 10));\n  // other bytes are each value in base 128 with 8th bit set except for\n  // the last byte for each value\n  var last, valueBytes, value, b;\n  for(var i = 2; i < values.length; ++i) {\n    // produce value bytes in reverse because we don't know how many\n    // bytes it will take to store the value\n    last = true;\n    valueBytes = [];\n    value = parseInt(values[i], 10);\n    do {\n      b = value & 0x7F;\n      value = value >>> 7;\n      // if value is not last, then turn on 8th bit\n      if(!last) {\n        b |= 0x80;\n      }\n      valueBytes.push(b);\n      last = false;\n    } while(value > 0);\n\n    // add value bytes in reverse (needs to be in big endian)\n    for(var n = valueBytes.length - 1; n >= 0; --n) {\n      bytes.putByte(valueBytes[n]);\n    }\n  }\n\n  return bytes;\n};\n\n/**\n * Converts a DER-encoded byte buffer to an OID dot-separated string. The\n * byte buffer should contain only the DER-encoded value, not any tag or\n * length bytes.\n *\n * @param bytes the byte buffer.\n *\n * @return the OID dot-separated string.\n */\nasn1.derToOid = function(bytes) {\n  var oid;\n\n  // wrap in buffer if needed\n  if(typeof bytes === 'string') {\n    bytes = forge.util.createBuffer(bytes);\n  }\n\n  // first byte is 40 * value1 + value2\n  var b = bytes.getByte();\n  oid = Math.floor(b / 40) + '.' + (b % 40);\n\n  // other bytes are each value in base 128 with 8th bit set except for\n  // the last byte for each value\n  var value = 0;\n  while(bytes.length() > 0) {\n    b = bytes.getByte();\n    value = value << 7;\n    // not the last byte for the value\n    if(b & 0x80) {\n      value += b & 0x7F;\n    } else {\n      // last byte\n      oid += '.' + (value + b);\n      value = 0;\n    }\n  }\n\n  return oid;\n};\n\n/**\n * Converts a UTCTime value to a date.\n *\n * Note: GeneralizedTime has 4 digits for the year and is used for X.509\n * dates past 2049. Parsing that structure hasn't been implemented yet.\n *\n * @param utc the UTCTime value to convert.\n *\n * @return the date.\n */\nasn1.utcTimeToDate = function(utc) {\n  /* The following formats can be used:\n\n    YYMMDDhhmmZ\n    YYMMDDhhmm+hh'mm'\n    YYMMDDhhmm-hh'mm'\n    YYMMDDhhmmssZ\n    YYMMDDhhmmss+hh'mm'\n    YYMMDDhhmmss-hh'mm'\n\n    Where:\n\n    YY is the least significant two digits of the year\n    MM is the month (01 to 12)\n    DD is the day (01 to 31)\n    hh is the hour (00 to 23)\n    mm are the minutes (00 to 59)\n    ss are the seconds (00 to 59)\n    Z indicates that local time is GMT, + indicates that local time is\n    later than GMT, and - indicates that local time is earlier than GMT\n    hh' is the absolute value of the offset from GMT in hours\n    mm' is the absolute value of the offset from GMT in minutes */\n  var date = new Date();\n\n  // if YY >= 50 use 19xx, if YY < 50 use 20xx\n  var year = parseInt(utc.substr(0, 2), 10);\n  year = (year >= 50) ? 1900 + year : 2000 + year;\n  var MM = parseInt(utc.substr(2, 2), 10) - 1; // use 0-11 for month\n  var DD = parseInt(utc.substr(4, 2), 10);\n  var hh = parseInt(utc.substr(6, 2), 10);\n  var mm = parseInt(utc.substr(8, 2), 10);\n  var ss = 0;\n\n  // not just YYMMDDhhmmZ\n  if(utc.length > 11) {\n    // get character after minutes\n    var c = utc.charAt(10);\n    var end = 10;\n\n    // see if seconds are present\n    if(c !== '+' && c !== '-') {\n      // get seconds\n      ss = parseInt(utc.substr(10, 2), 10);\n      end += 2;\n    }\n  }\n\n  // update date\n  date.setUTCFullYear(year, MM, DD);\n  date.setUTCHours(hh, mm, ss, 0);\n\n  if(end) {\n    // get +/- after end of time\n    c = utc.charAt(end);\n    if(c === '+' || c === '-') {\n      // get hours+minutes offset\n      var hhoffset = parseInt(utc.substr(end + 1, 2), 10);\n      var mmoffset = parseInt(utc.substr(end + 4, 2), 10);\n\n      // calculate offset in milliseconds\n      var offset = hhoffset * 60 + mmoffset;\n      offset *= 60000;\n\n      // apply offset\n      if(c === '+') {\n        date.setTime(+date - offset);\n      } else {\n        date.setTime(+date + offset);\n      }\n    }\n  }\n\n  return date;\n};\n\n/**\n * Converts a GeneralizedTime value to a date.\n *\n * @param gentime the GeneralizedTime value to convert.\n *\n * @return the date.\n */\nasn1.generalizedTimeToDate = function(gentime) {\n  /* The following formats can be used:\n\n    YYYYMMDDHHMMSS\n    YYYYMMDDHHMMSS.fff\n    YYYYMMDDHHMMSSZ\n    YYYYMMDDHHMMSS.fffZ\n    YYYYMMDDHHMMSS+hh'mm'\n    YYYYMMDDHHMMSS.fff+hh'mm'\n    YYYYMMDDHHMMSS-hh'mm'\n    YYYYMMDDHHMMSS.fff-hh'mm'\n\n    Where:\n\n    YYYY is the year\n    MM is the month (01 to 12)\n    DD is the day (01 to 31)\n    hh is the hour (00 to 23)\n    mm are the minutes (00 to 59)\n    ss are the seconds (00 to 59)\n    .fff is the second fraction, accurate to three decimal places\n    Z indicates that local time is GMT, + indicates that local time is\n    later than GMT, and - indicates that local time is earlier than GMT\n    hh' is the absolute value of the offset from GMT in hours\n    mm' is the absolute value of the offset from GMT in minutes */\n  var date = new Date();\n\n  var YYYY = parseInt(gentime.substr(0, 4), 10);\n  var MM = parseInt(gentime.substr(4, 2), 10) - 1; // use 0-11 for month\n  var DD = parseInt(gentime.substr(6, 2), 10);\n  var hh = parseInt(gentime.substr(8, 2), 10);\n  var mm = parseInt(gentime.substr(10, 2), 10);\n  var ss = parseInt(gentime.substr(12, 2), 10);\n  var fff = 0;\n  var offset = 0;\n  var isUTC = false;\n\n  if(gentime.charAt(gentime.length - 1) === 'Z') {\n    isUTC = true;\n  }\n\n  var end = gentime.length - 5, c = gentime.charAt(end);\n  if(c === '+' || c === '-') {\n    // get hours+minutes offset\n    var hhoffset = parseInt(gentime.substr(end + 1, 2), 10);\n    var mmoffset = parseInt(gentime.substr(end + 4, 2), 10);\n\n    // calculate offset in milliseconds\n    offset = hhoffset * 60 + mmoffset;\n    offset *= 60000;\n\n    // apply offset\n    if(c === '+') {\n      offset *= -1;\n    }\n\n    isUTC = true;\n  }\n\n  // check for second fraction\n  if(gentime.charAt(14) === '.') {\n    fff = parseFloat(gentime.substr(14), 10) * 1000;\n  }\n\n  if(isUTC) {\n    date.setUTCFullYear(YYYY, MM, DD);\n    date.setUTCHours(hh, mm, ss, fff);\n\n    // apply offset\n    date.setTime(+date + offset);\n  } else {\n    date.setFullYear(YYYY, MM, DD);\n    date.setHours(hh, mm, ss, fff);\n  }\n\n  return date;\n};\n\n/**\n * Converts a date to a UTCTime value.\n *\n * Note: GeneralizedTime has 4 digits for the year and is used for X.509\n * dates past 2049. Converting to a GeneralizedTime hasn't been\n * implemented yet.\n *\n * @param date the date to convert.\n *\n * @return the UTCTime value.\n */\nasn1.dateToUtcTime = function(date) {\n  // TODO: validate; currently assumes proper format\n  if(typeof date === 'string') {\n    return date;\n  }\n\n  var rval = '';\n\n  // create format YYMMDDhhmmssZ\n  var format = [];\n  format.push(('' + date.getUTCFullYear()).substr(2));\n  format.push('' + (date.getUTCMonth() + 1));\n  format.push('' + date.getUTCDate());\n  format.push('' + date.getUTCHours());\n  format.push('' + date.getUTCMinutes());\n  format.push('' + date.getUTCSeconds());\n\n  // ensure 2 digits are used for each format entry\n  for(var i = 0; i < format.length; ++i) {\n    if(format[i].length < 2) {\n      rval += '0';\n    }\n    rval += format[i];\n  }\n  rval += 'Z';\n\n  return rval;\n};\n\n/**\n * Converts a date to a GeneralizedTime value.\n *\n * @param date the date to convert.\n *\n * @return the GeneralizedTime value as a string.\n */\nasn1.dateToGeneralizedTime = function(date) {\n  // TODO: validate; currently assumes proper format\n  if(typeof date === 'string') {\n    return date;\n  }\n\n  var rval = '';\n\n  // create format YYYYMMDDHHMMSSZ\n  var format = [];\n  format.push('' + date.getUTCFullYear());\n  format.push('' + (date.getUTCMonth() + 1));\n  format.push('' + date.getUTCDate());\n  format.push('' + date.getUTCHours());\n  format.push('' + date.getUTCMinutes());\n  format.push('' + date.getUTCSeconds());\n\n  // ensure 2 digits are used for each format entry\n  for(var i = 0; i < format.length; ++i) {\n    if(format[i].length < 2) {\n      rval += '0';\n    }\n    rval += format[i];\n  }\n  rval += 'Z';\n\n  return rval;\n};\n\n/**\n * Converts a javascript integer to a DER-encoded byte buffer to be used\n * as the value for an INTEGER type.\n *\n * @param x the integer.\n *\n * @return the byte buffer.\n */\nasn1.integerToDer = function(x) {\n  var rval = forge.util.createBuffer();\n  if(x >= -0x80 && x < 0x80) {\n    return rval.putSignedInt(x, 8);\n  }\n  if(x >= -0x8000 && x < 0x8000) {\n    return rval.putSignedInt(x, 16);\n  }\n  if(x >= -0x800000 && x < 0x800000) {\n    return rval.putSignedInt(x, 24);\n  }\n  if(x >= -0x80000000 && x < 0x80000000) {\n    return rval.putSignedInt(x, 32);\n  }\n  var error = new Error('Integer too large; max is 32-bits.');\n  error.integer = x;\n  throw error;\n};\n\n/**\n * Converts a DER-encoded byte buffer to a javascript integer. This is\n * typically used to decode the value of an INTEGER type.\n *\n * @param bytes the byte buffer.\n *\n * @return the integer.\n */\nasn1.derToInteger = function(bytes) {\n  // wrap in buffer if needed\n  if(typeof bytes === 'string') {\n    bytes = forge.util.createBuffer(bytes);\n  }\n\n  var n = bytes.length() * 8;\n  if(n > 32) {\n    throw new Error('Integer too large; max is 32-bits.');\n  }\n  return bytes.getSignedInt(n);\n};\n\n/**\n * Validates that the given ASN.1 object is at least a super set of the\n * given ASN.1 structure. Only tag classes and types are checked. An\n * optional map may also be provided to capture ASN.1 values while the\n * structure is checked.\n *\n * To capture an ASN.1 value, set an object in the validator's 'capture'\n * parameter to the key to use in the capture map. To capture the full\n * ASN.1 object, specify 'captureAsn1'. To capture BIT STRING bytes, including\n * the leading unused bits counter byte, specify 'captureBitStringContents'.\n * To capture BIT STRING bytes, without the leading unused bits counter byte,\n * specify 'captureBitStringValue'.\n *\n * Objects in the validator may set a field 'optional' to true to indicate\n * that it isn't necessary to pass validation.\n *\n * @param obj the ASN.1 object to validate.\n * @param v the ASN.1 structure validator.\n * @param capture an optional map to capture values in.\n * @param errors an optional array for storing validation errors.\n *\n * @return true on success, false on failure.\n */\nasn1.validate = function(obj, v, capture, errors) {\n  var rval = false;\n\n  // ensure tag class and type are the same if specified\n  if((obj.tagClass === v.tagClass || typeof(v.tagClass) === 'undefined') &&\n    (obj.type === v.type || typeof(v.type) === 'undefined')) {\n    // ensure constructed flag is the same if specified\n    if(obj.constructed === v.constructed ||\n      typeof(v.constructed) === 'undefined') {\n      rval = true;\n\n      // handle sub values\n      if(v.value && forge.util.isArray(v.value)) {\n        var j = 0;\n        for(var i = 0; rval && i < v.value.length; ++i) {\n          rval = v.value[i].optional || false;\n          if(obj.value[j]) {\n            rval = asn1.validate(obj.value[j], v.value[i], capture, errors);\n            if(rval) {\n              ++j;\n            } else if(v.value[i].optional) {\n              rval = true;\n            }\n          }\n          if(!rval && errors) {\n            errors.push(\n              '[' + v.name + '] ' +\n              'Tag class \"' + v.tagClass + '\", type \"' +\n              v.type + '\" expected value length \"' +\n              v.value.length + '\", got \"' +\n              obj.value.length + '\"');\n          }\n        }\n      }\n\n      if(rval && capture) {\n        if(v.capture) {\n          capture[v.capture] = obj.value;\n        }\n        if(v.captureAsn1) {\n          capture[v.captureAsn1] = obj;\n        }\n        if(v.captureBitStringContents && 'bitStringContents' in obj) {\n          capture[v.captureBitStringContents] = obj.bitStringContents;\n        }\n        if(v.captureBitStringValue && 'bitStringContents' in obj) {\n          var value;\n          if(obj.bitStringContents.length < 2) {\n            capture[v.captureBitStringValue] = '';\n          } else {\n            // FIXME: support unused bits with data shifting\n            var unused = obj.bitStringContents.charCodeAt(0);\n            if(unused !== 0) {\n              throw new Error(\n                'captureBitStringValue only supported for zero unused bits');\n            }\n            capture[v.captureBitStringValue] = obj.bitStringContents.slice(1);\n          }\n        }\n      }\n    } else if(errors) {\n      errors.push(\n        '[' + v.name + '] ' +\n        'Expected constructed \"' + v.constructed + '\", got \"' +\n        obj.constructed + '\"');\n    }\n  } else if(errors) {\n    if(obj.tagClass !== v.tagClass) {\n      errors.push(\n        '[' + v.name + '] ' +\n        'Expected tag class \"' + v.tagClass + '\", got \"' +\n        obj.tagClass + '\"');\n    }\n    if(obj.type !== v.type) {\n      errors.push(\n        '[' + v.name + '] ' +\n        'Expected type \"' + v.type + '\", got \"' + obj.type + '\"');\n    }\n  }\n  return rval;\n};\n\n// regex for testing for non-latin characters\nvar _nonLatinRegex = /[^\\\\u0000-\\\\u00ff]/;\n\n/**\n * Pretty prints an ASN.1 object to a string.\n *\n * @param obj the object to write out.\n * @param level the level in the tree.\n * @param indentation the indentation to use.\n *\n * @return the string.\n */\nasn1.prettyPrint = function(obj, level, indentation) {\n  var rval = '';\n\n  // set default level and indentation\n  level = level || 0;\n  indentation = indentation || 2;\n\n  // start new line for deep levels\n  if(level > 0) {\n    rval += '\\n';\n  }\n\n  // create indent\n  var indent = '';\n  for(var i = 0; i < level * indentation; ++i) {\n    indent += ' ';\n  }\n\n  // print class:type\n  rval += indent + 'Tag: ';\n  switch(obj.tagClass) {\n  case asn1.Class.UNIVERSAL:\n    rval += 'Universal:';\n    break;\n  case asn1.Class.APPLICATION:\n    rval += 'Application:';\n    break;\n  case asn1.Class.CONTEXT_SPECIFIC:\n    rval += 'Context-Specific:';\n    break;\n  case asn1.Class.PRIVATE:\n    rval += 'Private:';\n    break;\n  }\n\n  if(obj.tagClass === asn1.Class.UNIVERSAL) {\n    rval += obj.type;\n\n    // known types\n    switch(obj.type) {\n    case asn1.Type.NONE:\n      rval += ' (None)';\n      break;\n    case asn1.Type.BOOLEAN:\n      rval += ' (Boolean)';\n      break;\n    case asn1.Type.INTEGER:\n      rval += ' (Integer)';\n      break;\n    case asn1.Type.BITSTRING:\n      rval += ' (Bit string)';\n      break;\n    case asn1.Type.OCTETSTRING:\n      rval += ' (Octet string)';\n      break;\n    case asn1.Type.NULL:\n      rval += ' (Null)';\n      break;\n    case asn1.Type.OID:\n      rval += ' (Object Identifier)';\n      break;\n    case asn1.Type.ODESC:\n      rval += ' (Object Descriptor)';\n      break;\n    case asn1.Type.EXTERNAL:\n      rval += ' (External or Instance of)';\n      break;\n    case asn1.Type.REAL:\n      rval += ' (Real)';\n      break;\n    case asn1.Type.ENUMERATED:\n      rval += ' (Enumerated)';\n      break;\n    case asn1.Type.EMBEDDED:\n      rval += ' (Embedded PDV)';\n      break;\n    case asn1.Type.UTF8:\n      rval += ' (UTF8)';\n      break;\n    case asn1.Type.ROID:\n      rval += ' (Relative Object Identifier)';\n      break;\n    case asn1.Type.SEQUENCE:\n      rval += ' (Sequence)';\n      break;\n    case asn1.Type.SET:\n      rval += ' (Set)';\n      break;\n    case asn1.Type.PRINTABLESTRING:\n      rval += ' (Printable String)';\n      break;\n    case asn1.Type.IA5String:\n      rval += ' (IA5String (ASCII))';\n      break;\n    case asn1.Type.UTCTIME:\n      rval += ' (UTC time)';\n      break;\n    case asn1.Type.GENERALIZEDTIME:\n      rval += ' (Generalized time)';\n      break;\n    case asn1.Type.BMPSTRING:\n      rval += ' (BMP String)';\n      break;\n    }\n  } else {\n    rval += obj.type;\n  }\n\n  rval += '\\n';\n  rval += indent + 'Constructed: ' + obj.constructed + '\\n';\n\n  if(obj.composed) {\n    var subvalues = 0;\n    var sub = '';\n    for(var i = 0; i < obj.value.length; ++i) {\n      if(obj.value[i] !== undefined) {\n        subvalues += 1;\n        sub += asn1.prettyPrint(obj.value[i], level + 1, indentation);\n        if((i + 1) < obj.value.length) {\n          sub += ',';\n        }\n      }\n    }\n    rval += indent + 'Sub values: ' + subvalues + sub;\n  } else {\n    rval += indent + 'Value: ';\n    if(obj.type === asn1.Type.OID) {\n      var oid = asn1.derToOid(obj.value);\n      rval += oid;\n      if(forge.pki && forge.pki.oids) {\n        if(oid in forge.pki.oids) {\n          rval += ' (' + forge.pki.oids[oid] + ') ';\n        }\n      }\n    }\n    if(obj.type === asn1.Type.INTEGER) {\n      try {\n        rval += asn1.derToInteger(obj.value);\n      } catch(ex) {\n        rval += '0x' + forge.util.bytesToHex(obj.value);\n      }\n    } else if(obj.type === asn1.Type.BITSTRING) {\n      // TODO: shift bits as needed to display without padding\n      if(obj.value.length > 1) {\n        // remove unused bits field\n        rval += '0x' + forge.util.bytesToHex(obj.value.slice(1));\n      } else {\n        rval += '(none)';\n      }\n      // show unused bit count\n      if(obj.value.length > 0) {\n        var unused = obj.value.charCodeAt(0);\n        if(unused == 1) {\n          rval += ' (1 unused bit shown)';\n        } else if(unused > 1) {\n          rval += ' (' + unused + ' unused bits shown)';\n        }\n      }\n    } else if(obj.type === asn1.Type.OCTETSTRING) {\n      if(!_nonLatinRegex.test(obj.value)) {\n        rval += '(' + obj.value + ') ';\n      }\n      rval += '0x' + forge.util.bytesToHex(obj.value);\n    } else if(obj.type === asn1.Type.UTF8) {\n      try {\n        rval += forge.util.decodeUtf8(obj.value);\n      } catch(e) {\n        if(e.message === 'URI malformed') {\n          rval +=\n            '0x' + forge.util.bytesToHex(obj.value) + ' (malformed UTF8)';\n        } else {\n          throw e;\n        }\n      }\n    } else if(obj.type === asn1.Type.PRINTABLESTRING ||\n      obj.type === asn1.Type.IA5String) {\n      rval += obj.value;\n    } else if(_nonLatinRegex.test(obj.value)) {\n      rval += '0x' + forge.util.bytesToHex(obj.value);\n    } else if(obj.value.length === 0) {\n      rval += '[null]';\n    } else {\n      rval += obj.value;\n    }\n  }\n\n  return rval;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTQuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbm9kZS1mb3JnZS9saWIvYXNuMS5qcz84MjcyIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogSmF2YXNjcmlwdCBpbXBsZW1lbnRhdGlvbiBvZiBBYnN0cmFjdCBTeW50YXggTm90YXRpb24gTnVtYmVyIE9uZS5cbiAqXG4gKiBAYXV0aG9yIERhdmUgTG9uZ2xleVxuICpcbiAqIENvcHlyaWdodCAoYykgMjAxMC0yMDE1IERpZ2l0YWwgQmF6YWFyLCBJbmMuXG4gKlxuICogQW4gQVBJIGZvciBzdG9yaW5nIGRhdGEgdXNpbmcgdGhlIEFic3RyYWN0IFN5bnRheCBOb3RhdGlvbiBOdW1iZXIgT25lXG4gKiBmb3JtYXQgdXNpbmcgREVSIChEaXN0aW5ndWlzaGVkIEVuY29kaW5nIFJ1bGVzKSBlbmNvZGluZy4gVGhpcyBlbmNvZGluZyBpc1xuICogY29tbW9ubHkgdXNlZCB0byBzdG9yZSBkYXRhIGZvciBQS0ksIGkuZS4gWC41MDkgQ2VydGlmaWNhdGVzLCBhbmQgdGhpc1xuICogaW1wbGVtZW50YXRpb24gZXhpc3RzIGZvciB0aGF0IHB1cnBvc2UuXG4gKlxuICogQWJzdHJhY3QgU3ludGF4IE5vdGF0aW9uIE51bWJlciBPbmUgKEFTTi4xKSBpcyB1c2VkIHRvIGRlZmluZSB0aGUgYWJzdHJhY3RcbiAqIHN5bnRheCBvZiBpbmZvcm1hdGlvbiB3aXRob3V0IHJlc3RyaWN0aW5nIHRoZSB3YXkgdGhlIGluZm9ybWF0aW9uIGlzIGVuY29kZWRcbiAqIGZvciB0cmFuc21pc3Npb24uIEl0IHByb3ZpZGVzIGEgc3RhbmRhcmQgdGhhdCBhbGxvd3MgZm9yIG9wZW4gc3lzdGVtc1xuICogY29tbXVuaWNhdGlvbi4gQVNOLjEgZGVmaW5lcyB0aGUgc3ludGF4IG9mIGluZm9ybWF0aW9uIGRhdGEgYW5kIGEgbnVtYmVyIG9mXG4gKiBzaW1wbGUgZGF0YSB0eXBlcyBhcyB3ZWxsIGFzIGEgbm90YXRpb24gZm9yIGRlc2NyaWJpbmcgdGhlbSBhbmQgc3BlY2lmeWluZ1xuICogdmFsdWVzIGZvciB0aGVtLlxuICpcbiAqIFRoZSBSU0EgYWxnb3JpdGhtIGNyZWF0ZXMgcHVibGljIGFuZCBwcml2YXRlIGtleXMgdGhhdCBhcmUgb2Z0ZW4gc3RvcmVkIGluXG4gKiBYLjUwOSBvciBQS0NTI1ggZm9ybWF0cyAtLSB3aGljaCB1c2UgQVNOLjEgKGVuY29kZWQgaW4gREVSIGZvcm1hdCkuIFRoaXNcbiAqIGNsYXNzIHByb3ZpZGVzIHRoZSBtb3N0IGJhc2ljIGZ1bmN0aW9uYWxpdHkgcmVxdWlyZWQgdG8gc3RvcmUgYW5kIGxvYWQgRFNBXG4gKiBrZXlzIHRoYXQgYXJlIGVuY29kZWQgYWNjb3JkaW5nIHRvIEFTTi4xLlxuICpcbiAqIFRoZSBtb3N0IGNvbW1vbiBiaW5hcnkgZW5jb2RpbmdzIGZvciBBU04uMSBhcmUgQkVSIChCYXNpYyBFbmNvZGluZyBSdWxlcylcbiAqIGFuZCBERVIgKERpc3Rpbmd1aXNoZWQgRW5jb2RpbmcgUnVsZXMpLiBERVIgaXMganVzdCBhIHN1YnNldCBvZiBCRVIgdGhhdFxuICogaGFzIHN0cmljdGVyIHJlcXVpcmVtZW50cyBmb3IgaG93IGRhdGEgbXVzdCBiZSBlbmNvZGVkLlxuICpcbiAqIEVhY2ggQVNOLjEgc3RydWN0dXJlIGhhcyBhIHRhZyAoYSBieXRlIGlkZW50aWZ5aW5nIHRoZSBBU04uMSBzdHJ1Y3R1cmUgdHlwZSlcbiAqIGFuZCBhIGJ5dGUgYXJyYXkgZm9yIHRoZSB2YWx1ZSBvZiB0aGlzIEFTTjEgc3RydWN0dXJlIHdoaWNoIG1heSBiZSBkYXRhIG9yIGFcbiAqIGxpc3Qgb2YgQVNOLjEgc3RydWN0dXJlcy5cbiAqXG4gKiBFYWNoIEFTTi4xIHN0cnVjdHVyZSB1c2luZyBCRVIgaXMgKFRhZy1MZW5ndGgtVmFsdWUpOlxuICpcbiAqIHwgYnl0ZSAwIHwgYnl0ZXMgWCB8IGJ5dGVzIFkgfFxuICogfC0tLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS0tXG4gKiB8ICB0YWcgICB8IGxlbmd0aCAgfCAgdmFsdWUgIHxcbiAqXG4gKiBBU04uMSBhbGxvd3MgZm9yIHRhZ3MgdG8gYmUgb2YgXCJIaWdoLXRhZy1udW1iZXIgZm9ybVwiIHdoaWNoIGFsbG93cyBhIHRhZyB0b1xuICogYmUgdHdvIG9yIG1vcmUgb2N0ZXRzLCBidXQgdGhhdCBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgY2xhc3MuIEEgdGFnIGlzXG4gKiBvbmx5IDEgYnl0ZS4gQml0cyAxLTUgZ2l2ZSB0aGUgdGFnIG51bWJlciAoaWUgdGhlIGRhdGEgdHlwZSB3aXRoaW4gYVxuICogcGFydGljdWxhciAnY2xhc3MnKSwgNiBpbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdGhlIEFTTi4xIHZhbHVlIGlzXG4gKiBjb25zdHJ1Y3RlZCBmcm9tIG90aGVyIEFTTi4xIHZhbHVlcywgYW5kIGJpdHMgNyBhbmQgOCBnaXZlIHRoZSAnY2xhc3MnLiBJZlxuICogYml0cyA3IGFuZCA4IGFyZSBib3RoIHplcm8sIHRoZSBjbGFzcyBpcyBVTklWRVJTQUwuIElmIG9ubHkgYml0IDcgaXMgc2V0LFxuICogdGhlbiB0aGUgY2xhc3MgaXMgQVBQTElDQVRJT04uIElmIG9ubHkgYml0IDggaXMgc2V0LCB0aGVuIHRoZSBjbGFzcyBpc1xuICogQ09OVEVYVF9TUEVDSUZJQy4gSWYgYm90aCBiaXRzIDcgYW5kIDggYXJlIHNldCwgdGhlbiB0aGUgY2xhc3MgaXMgUFJJVkFURS5cbiAqIFRoZSB0YWcgbnVtYmVycyBmb3IgdGhlIGRhdGEgdHlwZXMgZm9yIHRoZSBjbGFzcyBVTklWRVJTQUwgYXJlIGxpc3RlZCBiZWxvdzpcbiAqXG4gKiBVTklWRVJTQUwgMCBSZXNlcnZlZCBmb3IgdXNlIGJ5IHRoZSBlbmNvZGluZyBydWxlc1xuICogVU5JVkVSU0FMIDEgQm9vbGVhbiB0eXBlXG4gKiBVTklWRVJTQUwgMiBJbnRlZ2VyIHR5cGVcbiAqIFVOSVZFUlNBTCAzIEJpdHN0cmluZyB0eXBlXG4gKiBVTklWRVJTQUwgNCBPY3RldHN0cmluZyB0eXBlXG4gKiBVTklWRVJTQUwgNSBOdWxsIHR5cGVcbiAqIFVOSVZFUlNBTCA2IE9iamVjdCBpZGVudGlmaWVyIHR5cGVcbiAqIFVOSVZFUlNBTCA3IE9iamVjdCBkZXNjcmlwdG9yIHR5cGVcbiAqIFVOSVZFUlNBTCA4IEV4dGVybmFsIHR5cGUgYW5kIEluc3RhbmNlLW9mIHR5cGVcbiAqIFVOSVZFUlNBTCA5IFJlYWwgdHlwZVxuICogVU5JVkVSU0FMIDEwIEVudW1lcmF0ZWQgdHlwZVxuICogVU5JVkVSU0FMIDExIEVtYmVkZGVkLXBkdiB0eXBlXG4gKiBVTklWRVJTQUwgMTIgVVRGOFN0cmluZyB0eXBlXG4gKiBVTklWRVJTQUwgMTMgUmVsYXRpdmUgb2JqZWN0IGlkZW50aWZpZXIgdHlwZVxuICogVU5JVkVSU0FMIDE0LTE1IFJlc2VydmVkIGZvciBmdXR1cmUgZWRpdGlvbnNcbiAqIFVOSVZFUlNBTCAxNiBTZXF1ZW5jZSBhbmQgU2VxdWVuY2Utb2YgdHlwZXNcbiAqIFVOSVZFUlNBTCAxNyBTZXQgYW5kIFNldC1vZiB0eXBlc1xuICogVU5JVkVSU0FMIDE4LTIyLCAyNS0zMCBDaGFyYWN0ZXIgc3RyaW5nIHR5cGVzXG4gKiBVTklWRVJTQUwgMjMtMjQgVGltZSB0eXBlc1xuICpcbiAqIFRoZSBsZW5ndGggb2YgYW4gQVNOLjEgc3RydWN0dXJlIGlzIHNwZWNpZmllZCBhZnRlciB0aGUgdGFnIGlkZW50aWZpZXIuXG4gKiBUaGVyZSBpcyBhIGRlZmluaXRlIGZvcm0gYW5kIGFuIGluZGVmaW5pdGUgZm9ybS4gVGhlIGluZGVmaW5pdGUgZm9ybSBtYXlcbiAqIGJlIHVzZWQgaWYgdGhlIGVuY29kaW5nIGlzIGNvbnN0cnVjdGVkIGFuZCBub3QgYWxsIGltbWVkaWF0ZWx5IGF2YWlsYWJsZS5cbiAqIFRoZSBpbmRlZmluaXRlIGZvcm0gaXMgZW5jb2RlZCB1c2luZyBhIGxlbmd0aCBieXRlIHdpdGggb25seSB0aGUgOHRoIGJpdFxuICogc2V0LiBUaGUgZW5kIG9mIHRoZSBjb25zdHJ1Y3RlZCBvYmplY3QgaXMgbWFya2VkIHVzaW5nIGVuZC1vZi1jb250ZW50c1xuICogb2N0ZXRzICh0d28gemVybyBieXRlcykuXG4gKlxuICogVGhlIGRlZmluaXRlIGZvcm0gbG9va3MgbGlrZSB0aGlzOlxuICpcbiAqIFRoZSBsZW5ndGggbWF5IHRha2UgdXAgMSBvciBtb3JlIGJ5dGVzLCBpdCBkZXBlbmRzIG9uIHRoZSBsZW5ndGggb2YgdGhlXG4gKiB2YWx1ZSBvZiB0aGUgQVNOLjEgc3RydWN0dXJlLiBERVIgZW5jb2RpbmcgcmVxdWlyZXMgdGhhdCBpZiB0aGUgQVNOLjFcbiAqIHN0cnVjdHVyZSBoYXMgYSB2YWx1ZSB0aGF0IGhhcyBhIGxlbmd0aCBncmVhdGVyIHRoYW4gMTI3LCBtb3JlIHRoYW4gMSBieXRlXG4gKiB3aWxsIGJlIHVzZWQgdG8gc3RvcmUgaXRzIGxlbmd0aCwgb3RoZXJ3aXNlIGp1c3Qgb25lIGJ5dGUgd2lsbCBiZSB1c2VkLlxuICogVGhpcyBpcyBzdHJpY3QuXG4gKlxuICogSW4gdGhlIGNhc2UgdGhhdCB0aGUgbGVuZ3RoIG9mIHRoZSBBU04uMSB2YWx1ZSBpcyBsZXNzIHRoYW4gMTI3LCAxIG9jdGV0XG4gKiAoYnl0ZSkgaXMgdXNlZCB0byBzdG9yZSB0aGUgXCJzaG9ydCBmb3JtXCIgbGVuZ3RoLiBUaGUgOHRoIGJpdCBoYXMgYSB2YWx1ZSBvZlxuICogMCBpbmRpY2F0aW5nIHRoZSBsZW5ndGggaXMgXCJzaG9ydCBmb3JtXCIgYW5kIG5vdCBcImxvbmcgZm9ybVwiIGFuZCBiaXRzIDctMVxuICogZ2l2ZSB0aGUgbGVuZ3RoIG9mIHRoZSBkYXRhLiAoVGhlIDh0aCBiaXQgaXMgdGhlIGxlZnQtbW9zdCwgbW9zdCBzaWduaWZpY2FudFxuICogYml0OiBhbHNvIGtub3duIGFzIGJpZyBlbmRpYW4gb3IgbmV0d29yayBmb3JtYXQpLlxuICpcbiAqIEluIHRoZSBjYXNlIHRoYXQgdGhlIGxlbmd0aCBvZiB0aGUgQVNOLjEgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIDEyNywgMiB0b1xuICogMTI3IG9jdGV0cyAoYnl0ZXMpIGFyZSB1c2VkIHRvIHN0b3JlIHRoZSBcImxvbmcgZm9ybVwiIGxlbmd0aC4gVGhlIGZpcnN0XG4gKiBieXRlJ3MgOHRoIGJpdCBpcyBzZXQgdG8gMSB0byBpbmRpY2F0ZSB0aGUgbGVuZ3RoIGlzIFwibG9uZyBmb3JtLlwiIEJpdHMgNy0xXG4gKiBnaXZlIHRoZSBudW1iZXIgb2YgYWRkaXRpb25hbCBvY3RldHMuIEFsbCBmb2xsb3dpbmcgb2N0ZXRzIGFyZSBpbiBiYXNlIDI1NlxuICogd2l0aCB0aGUgbW9zdCBzaWduaWZpY2FudCBkaWdpdCBmaXJzdCAodHlwaWNhbCBiaWctZW5kaWFuIGJpbmFyeSB1bnNpZ25lZFxuICogaW50ZWdlciBzdG9yYWdlKS4gU28sIGZvciBpbnN0YW5jZSwgaWYgdGhlIGxlbmd0aCBvZiBhIHZhbHVlIHdhcyAyNTcsIHRoZVxuICogZmlyc3QgYnl0ZSB3b3VsZCBiZSBzZXQgdG86XG4gKlxuICogMTAwMDAwMTAgPSAxMzAgPSAweDgyLlxuICpcbiAqIFRoaXMgaW5kaWNhdGVzIHRoZXJlIGFyZSAyIG9jdGV0cyAoYmFzZSAyNTYpIGZvciB0aGUgbGVuZ3RoLiBUaGUgc2Vjb25kIGFuZFxuICogdGhpcmQgYnl0ZXMgKHRoZSBvY3RldHMganVzdCBtZW50aW9uZWQpIHdvdWxkIHN0b3JlIHRoZSBsZW5ndGggaW4gYmFzZSAyNTY6XG4gKlxuICogb2N0ZXQgMjogMDAwMDAwMDEgPSAxICogMjU2XjEgPSAyNTZcbiAqIG9jdGV0IDM6IDAwMDAwMDAxID0gMSAqIDI1Nl4wID0gMVxuICogdG90YWwgPSAyNTdcbiAqXG4gKiBUaGUgYWxnb3JpdGhtIGZvciBjb252ZXJ0aW5nIGEganMgaW50ZWdlciB2YWx1ZSBvZiAyNTcgdG8gYmFzZS0yNTYgaXM6XG4gKlxuICogdmFyIHZhbHVlID0gMjU3O1xuICogdmFyIGJ5dGVzID0gW107XG4gKiBieXRlc1swXSA9ICh2YWx1ZSA+Pj4gOCkgJiAweEZGOyAvLyBtb3N0IHNpZ25pZmljYW50IGJ5dGUgZmlyc3RcbiAqIGJ5dGVzWzFdID0gdmFsdWUgJiAweEZGOyAgICAgICAgLy8gbGVhc3Qgc2lnbmlmaWNhbnQgYnl0ZSBsYXN0XG4gKlxuICogT24gdGhlIEFTTi4xIFVOSVZFUlNBTCBPYmplY3QgSWRlbnRpZmllciAoT0lEKSB0eXBlOlxuICpcbiAqIEFuIE9JRCBjYW4gYmUgd3JpdHRlbiBsaWtlOiBcInZhbHVlMS52YWx1ZTIudmFsdWUzLi4udmFsdWVOXCJcbiAqXG4gKiBUaGUgREVSIGVuY29kaW5nIHJ1bGVzOlxuICpcbiAqIFRoZSBmaXJzdCBieXRlIGhhcyB0aGUgdmFsdWUgNDAgKiB2YWx1ZTEgKyB2YWx1ZTIuXG4gKiBUaGUgZm9sbG93aW5nIGJ5dGVzLCBpZiBhbnksIGVuY29kZSB0aGUgcmVtYWluaW5nIHZhbHVlcy4gRWFjaCB2YWx1ZSBpc1xuICogZW5jb2RlZCBpbiBiYXNlIDEyOCwgbW9zdCBzaWduaWZpY2FudCBkaWdpdCBmaXJzdCAoYmlnIGVuZGlhbiksIHdpdGggYXNcbiAqIGZldyBkaWdpdHMgYXMgcG9zc2libGUsIGFuZCB0aGUgbW9zdCBzaWduaWZpY2FudCBiaXQgb2YgZWFjaCBieXRlIHNldFxuICogdG8gMSBleGNlcHQgdGhlIGxhc3QgaW4gZWFjaCB2YWx1ZSdzIGVuY29kaW5nLiBGb3IgZXhhbXBsZTogR2l2ZW4gdGhlXG4gKiBPSUQgXCIxLjIuODQwLjExMzU0OVwiLCBpdHMgREVSIGVuY29kaW5nIGlzIChyZW1lbWJlciBlYWNoIGJ5dGUgZXhjZXB0IHRoZVxuICogbGFzdCBvbmUgaW4gZWFjaCBlbmNvZGluZyBpcyBPUidkIHdpdGggMHg4MCk6XG4gKlxuICogYnl0ZSAxOiA0MCAqIDEgKyAyID0gNDIgPSAweDJBLlxuICogYnl0ZXMgMi0zOiAxMjggKiA2ICsgNzIgPSA4NDAgPSA2IDcyID0gNiA3MiA9IDB4MDY0OCA9IDB4ODY0OFxuICogYnl0ZXMgNC02OiAxNjM4NCAqIDYgKyAxMjggKiAxMTkgKyAxMyA9IDYgMTE5IDEzID0gMHgwNjc3MEQgPSAweDg2RjcwRFxuICpcbiAqIFRoZSBmaW5hbCB2YWx1ZSBpczogMHgyQTg2NDg4NkY3MEQuXG4gKiBUaGUgZnVsbCBPSUQgKGluY2x1ZGluZyBBU04uMSB0YWcgYW5kIGxlbmd0aCBvZiA2IGJ5dGVzKSBpczpcbiAqIDB4MDYwNjJBODY0ODg2RjcwRFxuICovXG52YXIgZm9yZ2UgPSByZXF1aXJlKCcuL2ZvcmdlJyk7XG5yZXF1aXJlKCcuL3V0aWwnKTtcbnJlcXVpcmUoJy4vb2lkcycpO1xuXG4vKiBBU04uMSBBUEkgKi9cbnZhciBhc24xID0gbW9kdWxlLmV4cG9ydHMgPSBmb3JnZS5hc24xID0gZm9yZ2UuYXNuMSB8fCB7fTtcblxuLyoqXG4gKiBBU04uMSBjbGFzc2VzLlxuICovXG5hc24xLkNsYXNzID0ge1xuICBVTklWRVJTQUw6ICAgICAgICAweDAwLFxuICBBUFBMSUNBVElPTjogICAgICAweDQwLFxuICBDT05URVhUX1NQRUNJRklDOiAweDgwLFxuICBQUklWQVRFOiAgICAgICAgICAweEMwXG59O1xuXG4vKipcbiAqIEFTTi4xIHR5cGVzLiBOb3QgYWxsIHR5cGVzIGFyZSBzdXBwb3J0ZWQgYnkgdGhpcyBpbXBsZW1lbnRhdGlvbiwgb25seVxuICogdGhvc2UgbmVjZXNzYXJ5IHRvIGltcGxlbWVudCBhIHNpbXBsZSBQS0kgYXJlIGltcGxlbWVudGVkLlxuICovXG5hc24xLlR5cGUgPSB7XG4gIE5PTkU6ICAgICAgICAgICAgIDAsXG4gIEJPT0xFQU46ICAgICAgICAgIDEsXG4gIElOVEVHRVI6ICAgICAgICAgIDIsXG4gIEJJVFNUUklORzogICAgICAgIDMsXG4gIE9DVEVUU1RSSU5HOiAgICAgIDQsXG4gIE5VTEw6ICAgICAgICAgICAgIDUsXG4gIE9JRDogICAgICAgICAgICAgIDYsXG4gIE9ERVNDOiAgICAgICAgICAgIDcsXG4gIEVYVEVSTkFMOiAgICAgICAgIDgsXG4gIFJFQUw6ICAgICAgICAgICAgIDksXG4gIEVOVU1FUkFURUQ6ICAgICAgMTAsXG4gIEVNQkVEREVEOiAgICAgICAgMTEsXG4gIFVURjg6ICAgICAgICAgICAgMTIsXG4gIFJPSUQ6ICAgICAgICAgICAgMTMsXG4gIFNFUVVFTkNFOiAgICAgICAgMTYsXG4gIFNFVDogICAgICAgICAgICAgMTcsXG4gIFBSSU5UQUJMRVNUUklORzogMTksXG4gIElBNVNUUklORzogICAgICAgMjIsXG4gIFVUQ1RJTUU6ICAgICAgICAgMjMsXG4gIEdFTkVSQUxJWkVEVElNRTogMjQsXG4gIEJNUFNUUklORzogICAgICAgMzBcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBhc24xIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0gdGFnQ2xhc3MgdGhlIHRhZyBjbGFzcyBmb3IgdGhlIG9iamVjdC5cbiAqIEBwYXJhbSB0eXBlIHRoZSBkYXRhIHR5cGUgKHRhZyBudW1iZXIpIGZvciB0aGUgb2JqZWN0LlxuICogQHBhcmFtIGNvbnN0cnVjdGVkIHRydWUgaWYgdGhlIGFzbjEgb2JqZWN0IGlzIGluIGNvbnN0cnVjdGVkIGZvcm0uXG4gKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIGZvciB0aGUgb2JqZWN0LCBpZiBpdCBpcyBub3QgY29uc3RydWN0ZWQuXG4gKiBAcGFyYW0gW29wdGlvbnNdIHRoZSBvcHRpb25zIHRvIHVzZTpcbiAqICAgICAgICAgIFtiaXRTdHJpbmdDb250ZW50c10gdGhlIHBsYWluIEJJVCBTVFJJTkcgY29udGVudCBpbmNsdWRpbmcgcGFkZGluZ1xuICogICAgICAgICAgICBieXRlLlxuICpcbiAqIEByZXR1cm4gdGhlIGFzbjEgb2JqZWN0LlxuICovXG5hc24xLmNyZWF0ZSA9IGZ1bmN0aW9uKHRhZ0NsYXNzLCB0eXBlLCBjb25zdHJ1Y3RlZCwgdmFsdWUsIG9wdGlvbnMpIHtcbiAgLyogQW4gYXNuMSBvYmplY3QgaGFzIGEgdGFnQ2xhc3MsIGEgdHlwZSwgYSBjb25zdHJ1Y3RlZCBmbGFnLCBhbmQgYVxuICAgIHZhbHVlLiBUaGUgdmFsdWUncyB0eXBlIGRlcGVuZHMgb24gdGhlIGNvbnN0cnVjdGVkIGZsYWcuIElmXG4gICAgY29uc3RydWN0ZWQsIGl0IHdpbGwgY29udGFpbiBhIGxpc3Qgb2Ygb3RoZXIgYXNuMSBvYmplY3RzLiBJZiBub3QsXG4gICAgaXQgd2lsbCBjb250YWluIHRoZSBBU04uMSB2YWx1ZSBhcyBhbiBhcnJheSBvZiBieXRlcyBmb3JtYXR0ZWRcbiAgICBhY2NvcmRpbmcgdG8gdGhlIEFTTi4xIGRhdGEgdHlwZS4gKi9cblxuICAvLyByZW1vdmUgdW5kZWZpbmVkIHZhbHVlc1xuICBpZihmb3JnZS51dGlsLmlzQXJyYXkodmFsdWUpKSB7XG4gICAgdmFyIHRtcCA9IFtdO1xuICAgIGZvcih2YXIgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7ICsraSkge1xuICAgICAgaWYodmFsdWVbaV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0bXAucHVzaCh2YWx1ZVtpXSk7XG4gICAgICB9XG4gICAgfVxuICAgIHZhbHVlID0gdG1wO1xuICB9XG5cbiAgdmFyIG9iaiA9IHtcbiAgICB0YWdDbGFzczogdGFnQ2xhc3MsXG4gICAgdHlwZTogdHlwZSxcbiAgICBjb25zdHJ1Y3RlZDogY29uc3RydWN0ZWQsXG4gICAgY29tcG9zZWQ6IGNvbnN0cnVjdGVkIHx8IGZvcmdlLnV0aWwuaXNBcnJheSh2YWx1ZSksXG4gICAgdmFsdWU6IHZhbHVlXG4gIH07XG4gIGlmKG9wdGlvbnMgJiYgJ2JpdFN0cmluZ0NvbnRlbnRzJyBpbiBvcHRpb25zKSB7XG4gICAgLy8gVE9ETzogY29weSBieXRlIGJ1ZmZlciBpZiBpdCdzIGEgYnVmZmVyIG5vdCBhIHN0cmluZ1xuICAgIG9iai5iaXRTdHJpbmdDb250ZW50cyA9IG9wdGlvbnMuYml0U3RyaW5nQ29udGVudHM7XG4gICAgLy8gVE9ETzogYWRkIHJlYWRvbmx5IGZsYWcgdG8gYXZvaWQgdGhpcyBvdmVyaGVhZFxuICAgIC8vIHNhdmUgY29weSB0byBkZXRlY3QgY2hhbmdlc1xuICAgIG9iai5vcmlnaW5hbCA9IGFzbjEuY29weShvYmopO1xuICB9XG4gIHJldHVybiBvYmo7XG59O1xuXG4vKipcbiAqIENvcGllcyBhbiBhc24xIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0gb2JqIHRoZSBhc24xIG9iamVjdC5cbiAqIEBwYXJhbSBbb3B0aW9uc10gY29weSBvcHRpb25zOlxuICogICAgICAgICAgW2V4Y2x1ZGVCaXRTdHJpbmdDb250ZW50c10gdHJ1ZSB0byBub3QgY29weSBiaXRTdHJpbmdDb250ZW50c1xuICpcbiAqIEByZXR1cm4gdGhlIGEgY29weSBvZiB0aGUgYXNuMSBvYmplY3QuXG4gKi9cbmFzbjEuY29weSA9IGZ1bmN0aW9uKG9iaiwgb3B0aW9ucykge1xuICB2YXIgY29weTtcblxuICBpZihmb3JnZS51dGlsLmlzQXJyYXkob2JqKSkge1xuICAgIGNvcHkgPSBbXTtcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgb2JqLmxlbmd0aDsgKytpKSB7XG4gICAgICBjb3B5LnB1c2goYXNuMS5jb3B5KG9ialtpXSwgb3B0aW9ucykpO1xuICAgIH1cbiAgICByZXR1cm4gY29weTtcbiAgfVxuXG4gIGlmKHR5cGVvZiBvYmogPT09ICdzdHJpbmcnKSB7XG4gICAgLy8gVE9ETzogY29weSBieXRlIGJ1ZmZlciBpZiBpdCdzIGEgYnVmZmVyIG5vdCBhIHN0cmluZ1xuICAgIHJldHVybiBvYmo7XG4gIH1cblxuICBjb3B5ID0ge1xuICAgIHRhZ0NsYXNzOiBvYmoudGFnQ2xhc3MsXG4gICAgdHlwZTogb2JqLnR5cGUsXG4gICAgY29uc3RydWN0ZWQ6IG9iai5jb25zdHJ1Y3RlZCxcbiAgICBjb21wb3NlZDogb2JqLmNvbXBvc2VkLFxuICAgIHZhbHVlOiBhc24xLmNvcHkob2JqLnZhbHVlLCBvcHRpb25zKVxuICB9O1xuICBpZihvcHRpb25zICYmICFvcHRpb25zLmV4Y2x1ZGVCaXRTdHJpbmdDb250ZW50cykge1xuICAgIC8vIFRPRE86IGNvcHkgYnl0ZSBidWZmZXIgaWYgaXQncyBhIGJ1ZmZlciBub3QgYSBzdHJpbmdcbiAgICBjb3B5LmJpdFN0cmluZ0NvbnRlbnRzID0gb2JqLmJpdFN0cmluZ0NvbnRlbnRzO1xuICB9XG4gIHJldHVybiBjb3B5O1xufTtcblxuLyoqXG4gKiBDb21wYXJlcyBhc24xIG9iamVjdHMgZm9yIGVxdWFsaXR5LlxuICpcbiAqIE5vdGUgdGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBydW4gaW4gY29uc3RhbnQgdGltZS5cbiAqXG4gKiBAcGFyYW0gb2JqMSB0aGUgZmlyc3QgYXNuMSBvYmplY3QuXG4gKiBAcGFyYW0gb2JqMiB0aGUgc2Vjb25kIGFzbjEgb2JqZWN0LlxuICogQHBhcmFtIFtvcHRpb25zXSBjb21wYXJlIG9wdGlvbnM6XG4gKiAgICAgICAgICBbaW5jbHVkZUJpdFN0cmluZ0NvbnRlbnRzXSB0cnVlIHRvIGNvbXBhcmUgYml0U3RyaW5nQ29udGVudHNcbiAqXG4gKiBAcmV0dXJuIHRydWUgaWYgdGhlIGFzbjEgb2JqZWN0cyBhcmUgZXF1YWwuXG4gKi9cbmFzbjEuZXF1YWxzID0gZnVuY3Rpb24ob2JqMSwgb2JqMiwgb3B0aW9ucykge1xuICBpZihmb3JnZS51dGlsLmlzQXJyYXkob2JqMSkpIHtcbiAgICBpZighZm9yZ2UudXRpbC5pc0FycmF5KG9iajIpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmKG9iajEubGVuZ3RoICE9PSBvYmoyLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgb2JqMS5sZW5ndGg7ICsraSkge1xuICAgICAgaWYoIWFzbjEuZXF1YWxzKG9iajFbaV0sIG9iajJbaV0pKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZih0eXBlb2Ygb2JqMSAhPT0gdHlwZW9mIG9iajIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZih0eXBlb2Ygb2JqMSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gb2JqMSA9PT0gb2JqMjtcbiAgfVxuXG4gIHZhciBlcXVhbCA9IG9iajEudGFnQ2xhc3MgPT09IG9iajIudGFnQ2xhc3MgJiZcbiAgICBvYmoxLnR5cGUgPT09IG9iajIudHlwZSAmJlxuICAgIG9iajEuY29uc3RydWN0ZWQgPT09IG9iajIuY29uc3RydWN0ZWQgJiZcbiAgICBvYmoxLmNvbXBvc2VkID09PSBvYmoyLmNvbXBvc2VkICYmXG4gICAgYXNuMS5lcXVhbHMob2JqMS52YWx1ZSwgb2JqMi52YWx1ZSk7XG4gIGlmKG9wdGlvbnMgJiYgb3B0aW9ucy5pbmNsdWRlQml0U3RyaW5nQ29udGVudHMpIHtcbiAgICBlcXVhbCA9IGVxdWFsICYmIChvYmoxLmJpdFN0cmluZ0NvbnRlbnRzID09PSBvYmoyLmJpdFN0cmluZ0NvbnRlbnRzKTtcbiAgfVxuXG4gIHJldHVybiBlcXVhbDtcbn07XG5cbi8qKlxuICogR2V0cyB0aGUgbGVuZ3RoIG9mIGEgQkVSLWVuY29kZWQgQVNOLjEgdmFsdWUuXG4gKlxuICogSW4gY2FzZSB0aGUgbGVuZ3RoIGlzIG5vdCBzcGVjaWZpZWQsIHVuZGVmaW5lZCBpcyByZXR1cm5lZC5cbiAqXG4gKiBAcGFyYW0gYiB0aGUgQkVSLWVuY29kZWQgQVNOLjEgYnl0ZSBidWZmZXIsIHN0YXJ0aW5nIHdpdGggdGhlIGZpcnN0XG4gKiAgICAgICAgICBsZW5ndGggYnl0ZS5cbiAqXG4gKiBAcmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIEJFUi1lbmNvZGVkIEFTTi4xIHZhbHVlIG9yIHVuZGVmaW5lZC5cbiAqL1xuYXNuMS5nZXRCZXJWYWx1ZUxlbmd0aCA9IGZ1bmN0aW9uKGIpIHtcbiAgLy8gVE9ETzogbW92ZSB0aGlzIGZ1bmN0aW9uIGFuZCByZWxhdGVkIERFUi9CRVIgZnVuY3Rpb25zIHRvIGEgZGVyLmpzXG4gIC8vIGZpbGU7IGJldHRlciBhYnN0cmFjdCBBU04uMSBhd2F5IGZyb20gZGVyL2Jlci5cbiAgdmFyIGIyID0gYi5nZXRCeXRlKCk7XG4gIGlmKGIyID09PSAweDgwKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8vIHNlZSBpZiB0aGUgbGVuZ3RoIGlzIFwic2hvcnQgZm9ybVwiIG9yIFwibG9uZyBmb3JtXCIgKGJpdCA4IHNldClcbiAgdmFyIGxlbmd0aDtcbiAgdmFyIGxvbmdGb3JtID0gYjIgJiAweDgwO1xuICBpZighbG9uZ0Zvcm0pIHtcbiAgICAvLyBsZW5ndGggaXMganVzdCB0aGUgZmlyc3QgYnl0ZVxuICAgIGxlbmd0aCA9IGIyO1xuICB9IGVsc2Uge1xuICAgIC8vIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhlIGxlbmd0aCBpcyBzcGVjaWZpZWQgaW4gYml0cyA3IHRocm91Z2ggMVxuICAgIC8vIGFuZCBlYWNoIGxlbmd0aCBieXRlIGlzIGluIGJpZy1lbmRpYW4gYmFzZS0yNTZcbiAgICBsZW5ndGggPSBiLmdldEludCgoYjIgJiAweDdGKSA8PCAzKTtcbiAgfVxuICByZXR1cm4gbGVuZ3RoO1xufTtcblxuLyoqXG4gKiBDaGVjayBpZiB0aGUgYnl0ZSBidWZmZXIgaGFzIGVub3VnaCBieXRlcy4gVGhyb3dzIGFuIEVycm9yIGlmIG5vdC5cbiAqXG4gKiBAcGFyYW0gYnl0ZXMgdGhlIGJ5dGUgYnVmZmVyIHRvIHBhcnNlIGZyb20uXG4gKiBAcGFyYW0gcmVtYWluaW5nIHRoZSBieXRlcyByZW1haW5pbmcgaW4gdGhlIGN1cnJlbnQgcGFyc2luZyBzdGF0ZS5cbiAqIEBwYXJhbSBuIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhlIGJ1ZmZlciBtdXN0IGhhdmUuXG4gKi9cbmZ1bmN0aW9uIF9jaGVja0J1ZmZlckxlbmd0aChieXRlcywgcmVtYWluaW5nLCBuKSB7XG4gIGlmKG4gPiByZW1haW5pbmcpIHtcbiAgICB2YXIgZXJyb3IgPSBuZXcgRXJyb3IoJ1RvbyBmZXcgYnl0ZXMgdG8gcGFyc2UgREVSLicpO1xuICAgIGVycm9yLmF2YWlsYWJsZSA9IGJ5dGVzLmxlbmd0aCgpO1xuICAgIGVycm9yLnJlbWFpbmluZyA9IHJlbWFpbmluZztcbiAgICBlcnJvci5yZXF1ZXN0ZWQgPSBuO1xuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbi8qKlxuICogR2V0cyB0aGUgbGVuZ3RoIG9mIGEgQkVSLWVuY29kZWQgQVNOLjEgdmFsdWUuXG4gKlxuICogSW4gY2FzZSB0aGUgbGVuZ3RoIGlzIG5vdCBzcGVjaWZpZWQsIHVuZGVmaW5lZCBpcyByZXR1cm5lZC5cbiAqXG4gKiBAcGFyYW0gYnl0ZXMgdGhlIGJ5dGUgYnVmZmVyIHRvIHBhcnNlIGZyb20uXG4gKiBAcGFyYW0gcmVtYWluaW5nIHRoZSBieXRlcyByZW1haW5pbmcgaW4gdGhlIGN1cnJlbnQgcGFyc2luZyBzdGF0ZS5cbiAqXG4gKiBAcmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIEJFUi1lbmNvZGVkIEFTTi4xIHZhbHVlIG9yIHVuZGVmaW5lZC5cbiAqL1xudmFyIF9nZXRWYWx1ZUxlbmd0aCA9IGZ1bmN0aW9uKGJ5dGVzLCByZW1haW5pbmcpIHtcbiAgLy8gVE9ETzogbW92ZSB0aGlzIGZ1bmN0aW9uIGFuZCByZWxhdGVkIERFUi9CRVIgZnVuY3Rpb25zIHRvIGEgZGVyLmpzXG4gIC8vIGZpbGU7IGJldHRlciBhYnN0cmFjdCBBU04uMSBhd2F5IGZyb20gZGVyL2Jlci5cbiAgLy8gZnJvbURlciBhbHJlYWR5IGNoZWNrZWQgdGhhdCB0aGlzIGJ5dGUgZXhpc3RzXG4gIHZhciBiMiA9IGJ5dGVzLmdldEJ5dGUoKTtcbiAgcmVtYWluaW5nLS07XG4gIGlmKGIyID09PSAweDgwKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8vIHNlZSBpZiB0aGUgbGVuZ3RoIGlzIFwic2hvcnQgZm9ybVwiIG9yIFwibG9uZyBmb3JtXCIgKGJpdCA4IHNldClcbiAgdmFyIGxlbmd0aDtcbiAgdmFyIGxvbmdGb3JtID0gYjIgJiAweDgwO1xuICBpZighbG9uZ0Zvcm0pIHtcbiAgICAvLyBsZW5ndGggaXMganVzdCB0aGUgZmlyc3QgYnl0ZVxuICAgIGxlbmd0aCA9IGIyO1xuICB9IGVsc2Uge1xuICAgIC8vIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhlIGxlbmd0aCBpcyBzcGVjaWZpZWQgaW4gYml0cyA3IHRocm91Z2ggMVxuICAgIC8vIGFuZCBlYWNoIGxlbmd0aCBieXRlIGlzIGluIGJpZy1lbmRpYW4gYmFzZS0yNTZcbiAgICB2YXIgbG9uZ0Zvcm1CeXRlcyA9IGIyICYgMHg3RjtcbiAgICBfY2hlY2tCdWZmZXJMZW5ndGgoYnl0ZXMsIHJlbWFpbmluZywgbG9uZ0Zvcm1CeXRlcyk7XG4gICAgbGVuZ3RoID0gYnl0ZXMuZ2V0SW50KGxvbmdGb3JtQnl0ZXMgPDwgMyk7XG4gIH1cbiAgLy8gRklYTUU6IHRoaXMgd2lsbCBvbmx5IGhhcHBlbiBmb3IgMzIgYml0IGdldEludCB3aXRoIGhpZ2ggYml0IHNldFxuICBpZihsZW5ndGggPCAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdOZWdhdGl2ZSBsZW5ndGg6ICcgKyBsZW5ndGgpO1xuICB9XG4gIHJldHVybiBsZW5ndGg7XG59O1xuXG4vKipcbiAqIFBhcnNlcyBhbiBhc24xIG9iamVjdCBmcm9tIGEgYnl0ZSBidWZmZXIgaW4gREVSIGZvcm1hdC5cbiAqXG4gKiBAcGFyYW0gYnl0ZXMgdGhlIGJ5dGUgYnVmZmVyIHRvIHBhcnNlIGZyb20uXG4gKiBAcGFyYW0gW3N0cmljdF0gdHJ1ZSB0byBiZSBzdHJpY3Qgd2hlbiBjaGVja2luZyB2YWx1ZSBsZW5ndGhzLCBmYWxzZSB0b1xuICogICAgICAgICAgYWxsb3cgdHJ1bmNhdGVkIHZhbHVlcyAoZGVmYXVsdDogdHJ1ZSkuXG4gKiBAcGFyYW0gW29wdGlvbnNdIG9iamVjdCB3aXRoIG9wdGlvbnMgb3IgYm9vbGVhbiBzdHJpY3QgZmxhZ1xuICogICAgICAgICAgW3N0cmljdF0gdHJ1ZSB0byBiZSBzdHJpY3Qgd2hlbiBjaGVja2luZyB2YWx1ZSBsZW5ndGhzLCBmYWxzZSB0b1xuICogICAgICAgICAgICBhbGxvdyB0cnVuY2F0ZWQgdmFsdWVzIChkZWZhdWx0OiB0cnVlKS5cbiAqICAgICAgICAgIFtwYXJzZUFsbEJ5dGVzXSB0cnVlIHRvIGVuc3VyZSBhbGwgYnl0ZXMgYXJlIHBhcnNlZFxuICogICAgICAgICAgICAoZGVmYXVsdDogdHJ1ZSlcbiAqICAgICAgICAgIFtkZWNvZGVCaXRTdHJpbmdzXSB0cnVlIHRvIGF0dGVtcHQgdG8gZGVjb2RlIHRoZSBjb250ZW50IG9mXG4gKiAgICAgICAgICAgIEJJVCBTVFJJTkdzIChub3QgT0NURVQgU1RSSU5HcykgdXNpbmcgc3RyaWN0IG1vZGUuIE5vdGUgdGhhdFxuICogICAgICAgICAgICB3aXRob3V0IHNjaGVtYSBzdXBwb3J0IHRvIHVuZGVyc3RhbmQgdGhlIGRhdGEgY29udGV4dCB0aGlzIGNhblxuICogICAgICAgICAgICBlcnJvbmVvdXNseSBkZWNvZGUgdmFsdWVzIHRoYXQgaGFwcGVuIHRvIGJlIHZhbGlkIEFTTi4xLiBUaGlzXG4gKiAgICAgICAgICAgIGZsYWcgd2lsbCBiZSBkZXByZWNhdGVkIG9yIHJlbW92ZWQgYXMgc29vbiBhcyBzY2hlbWEgc3VwcG9ydCBpc1xuICogICAgICAgICAgICBhdmFpbGFibGUuIChkZWZhdWx0OiB0cnVlKVxuICpcbiAqIEB0aHJvd3MgV2lsbCB0aHJvdyBhbiBlcnJvciBmb3IgdmFyaW91cyBtYWxmb3JtZWQgaW5wdXQgY29uZGl0aW9ucy5cbiAqXG4gKiBAcmV0dXJuIHRoZSBwYXJzZWQgYXNuMSBvYmplY3QuXG4gKi9cbmFzbjEuZnJvbURlciA9IGZ1bmN0aW9uKGJ5dGVzLCBvcHRpb25zKSB7XG4gIGlmKG9wdGlvbnMgPT09IHVuZGVmaW5lZCkge1xuICAgIG9wdGlvbnMgPSB7XG4gICAgICBzdHJpY3Q6IHRydWUsXG4gICAgICBwYXJzZUFsbEJ5dGVzOiB0cnVlLFxuICAgICAgZGVjb2RlQml0U3RyaW5nczogdHJ1ZVxuICAgIH07XG4gIH1cbiAgaWYodHlwZW9mIG9wdGlvbnMgPT09ICdib29sZWFuJykge1xuICAgIG9wdGlvbnMgPSB7XG4gICAgICBzdHJpY3Q6IG9wdGlvbnMsXG4gICAgICBwYXJzZUFsbEJ5dGVzOiB0cnVlLFxuICAgICAgZGVjb2RlQml0U3RyaW5nczogdHJ1ZVxuICAgIH07XG4gIH1cbiAgaWYoISgnc3RyaWN0JyBpbiBvcHRpb25zKSkge1xuICAgIG9wdGlvbnMuc3RyaWN0ID0gdHJ1ZTtcbiAgfVxuICBpZighKCdwYXJzZUFsbEJ5dGVzJyBpbiBvcHRpb25zKSkge1xuICAgIG9wdGlvbnMucGFyc2VBbGxCeXRlcyA9IHRydWU7XG4gIH1cbiAgaWYoISgnZGVjb2RlQml0U3RyaW5ncycgaW4gb3B0aW9ucykpIHtcbiAgICBvcHRpb25zLmRlY29kZUJpdFN0cmluZ3MgPSB0cnVlO1xuICB9XG5cbiAgLy8gd3JhcCBpbiBidWZmZXIgaWYgbmVlZGVkXG4gIGlmKHR5cGVvZiBieXRlcyA9PT0gJ3N0cmluZycpIHtcbiAgICBieXRlcyA9IGZvcmdlLnV0aWwuY3JlYXRlQnVmZmVyKGJ5dGVzKTtcbiAgfVxuXG4gIHZhciBieXRlQ291bnQgPSBieXRlcy5sZW5ndGgoKTtcbiAgdmFyIHZhbHVlID0gX2Zyb21EZXIoYnl0ZXMsIGJ5dGVzLmxlbmd0aCgpLCAwLCBvcHRpb25zKTtcbiAgaWYob3B0aW9ucy5wYXJzZUFsbEJ5dGVzICYmIGJ5dGVzLmxlbmd0aCgpICE9PSAwKSB7XG4gICAgdmFyIGVycm9yID0gbmV3IEVycm9yKCdVbnBhcnNlZCBERVIgYnl0ZXMgcmVtYWluIGFmdGVyIEFTTi4xIHBhcnNpbmcuJyk7XG4gICAgZXJyb3IuYnl0ZUNvdW50ID0gYnl0ZUNvdW50O1xuICAgIGVycm9yLnJlbWFpbmluZyA9IGJ5dGVzLmxlbmd0aCgpO1xuICAgIHRocm93IGVycm9yO1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn07XG5cbi8qKlxuICogSW50ZXJuYWwgZnVuY3Rpb24gdG8gcGFyc2UgYW4gYXNuMSBvYmplY3QgZnJvbSBhIGJ5dGUgYnVmZmVyIGluIERFUiBmb3JtYXQuXG4gKlxuICogQHBhcmFtIGJ5dGVzIHRoZSBieXRlIGJ1ZmZlciB0byBwYXJzZSBmcm9tLlxuICogQHBhcmFtIHJlbWFpbmluZyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlbWFpbmluZyBmb3IgdGhpcyBjaHVuay5cbiAqIEBwYXJhbSBkZXB0aCB0aGUgY3VycmVudCBwYXJzaW5nIGRlcHRoLlxuICogQHBhcmFtIG9wdGlvbnMgb2JqZWN0IHdpdGggc2FtZSBvcHRpb25zIGFzIGZyb21EZXIoKS5cbiAqXG4gKiBAcmV0dXJuIHRoZSBwYXJzZWQgYXNuMSBvYmplY3QuXG4gKi9cbmZ1bmN0aW9uIF9mcm9tRGVyKGJ5dGVzLCByZW1haW5pbmcsIGRlcHRoLCBvcHRpb25zKSB7XG4gIC8vIHRlbXBvcmFyeSBzdG9yYWdlIGZvciBjb25zdW1wdGlvbiBjYWxjdWxhdGlvbnNcbiAgdmFyIHN0YXJ0O1xuXG4gIC8vIG1pbmltdW0gbGVuZ3RoIGZvciBBU04uMSBERVIgc3RydWN0dXJlIGlzIDJcbiAgX2NoZWNrQnVmZmVyTGVuZ3RoKGJ5dGVzLCByZW1haW5pbmcsIDIpO1xuXG4gIC8vIGdldCB0aGUgZmlyc3QgYnl0ZVxuICB2YXIgYjEgPSBieXRlcy5nZXRCeXRlKCk7XG4gIC8vIGNvbnN1bWVkIG9uZSBieXRlXG4gIHJlbWFpbmluZy0tO1xuXG4gIC8vIGdldCB0aGUgdGFnIGNsYXNzXG4gIHZhciB0YWdDbGFzcyA9IChiMSAmIDB4QzApO1xuXG4gIC8vIGdldCB0aGUgdHlwZSAoYml0cyAxLTUpXG4gIHZhciB0eXBlID0gYjEgJiAweDFGO1xuXG4gIC8vIGdldCB0aGUgdmFyaWFibGUgdmFsdWUgbGVuZ3RoIGFuZCBhZGp1c3QgcmVtYWluaW5nIGJ5dGVzXG4gIHN0YXJ0ID0gYnl0ZXMubGVuZ3RoKCk7XG4gIHZhciBsZW5ndGggPSBfZ2V0VmFsdWVMZW5ndGgoYnl0ZXMsIHJlbWFpbmluZyk7XG4gIHJlbWFpbmluZyAtPSBzdGFydCAtIGJ5dGVzLmxlbmd0aCgpO1xuXG4gIC8vIGVuc3VyZSB0aGVyZSBhcmUgZW5vdWdoIGJ5dGVzIHRvIGdldCB0aGUgdmFsdWVcbiAgaWYobGVuZ3RoICE9PSB1bmRlZmluZWQgJiYgbGVuZ3RoID4gcmVtYWluaW5nKSB7XG4gICAgaWYob3B0aW9ucy5zdHJpY3QpIHtcbiAgICAgIHZhciBlcnJvciA9IG5ldyBFcnJvcignVG9vIGZldyBieXRlcyB0byByZWFkIEFTTi4xIHZhbHVlLicpO1xuICAgICAgZXJyb3IuYXZhaWxhYmxlID0gYnl0ZXMubGVuZ3RoKCk7XG4gICAgICBlcnJvci5yZW1haW5pbmcgPSByZW1haW5pbmc7XG4gICAgICBlcnJvci5yZXF1ZXN0ZWQgPSBsZW5ndGg7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gICAgLy8gTm90ZTogYmUgbGVuaWVudCB3aXRoIHRydW5jYXRlZCB2YWx1ZXMgYW5kIHVzZSByZW1haW5pbmcgc3RhdGUgYnl0ZXNcbiAgICBsZW5ndGggPSByZW1haW5pbmc7XG4gIH1cblxuICAvLyB2YWx1ZSBzdG9yYWdlXG4gIHZhciB2YWx1ZTtcbiAgLy8gcG9zc2libGUgQklUIFNUUklORyBjb250ZW50cyBzdG9yYWdlXG4gIHZhciBiaXRTdHJpbmdDb250ZW50cztcblxuICAvLyBjb25zdHJ1Y3RlZCBmbGFnIGlzIGJpdCA2ICgzMiA9IDB4MjApIG9mIHRoZSBmaXJzdCBieXRlXG4gIHZhciBjb25zdHJ1Y3RlZCA9ICgoYjEgJiAweDIwKSA9PT0gMHgyMCk7XG4gIGlmKGNvbnN0cnVjdGVkKSB7XG4gICAgLy8gcGFyc2UgY2hpbGQgYXNuMSBvYmplY3RzIGZyb20gdGhlIHZhbHVlXG4gICAgdmFsdWUgPSBbXTtcbiAgICBpZihsZW5ndGggPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gYXNuMSBvYmplY3Qgb2YgaW5kZWZpbml0ZSBsZW5ndGgsIHJlYWQgdW50aWwgZW5kIHRhZ1xuICAgICAgZm9yKDs7KSB7XG4gICAgICAgIF9jaGVja0J1ZmZlckxlbmd0aChieXRlcywgcmVtYWluaW5nLCAyKTtcbiAgICAgICAgaWYoYnl0ZXMuYnl0ZXMoMikgPT09IFN0cmluZy5mcm9tQ2hhckNvZGUoMCwgMCkpIHtcbiAgICAgICAgICBieXRlcy5nZXRCeXRlcygyKTtcbiAgICAgICAgICByZW1haW5pbmcgLT0gMjtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBzdGFydCA9IGJ5dGVzLmxlbmd0aCgpO1xuICAgICAgICB2YWx1ZS5wdXNoKF9mcm9tRGVyKGJ5dGVzLCByZW1haW5pbmcsIGRlcHRoICsgMSwgb3B0aW9ucykpO1xuICAgICAgICByZW1haW5pbmcgLT0gc3RhcnQgLSBieXRlcy5sZW5ndGgoKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gcGFyc2luZyBhc24xIG9iamVjdCBvZiBkZWZpbml0ZSBsZW5ndGhcbiAgICAgIHdoaWxlKGxlbmd0aCA+IDApIHtcbiAgICAgICAgc3RhcnQgPSBieXRlcy5sZW5ndGgoKTtcbiAgICAgICAgdmFsdWUucHVzaChfZnJvbURlcihieXRlcywgbGVuZ3RoLCBkZXB0aCArIDEsIG9wdGlvbnMpKTtcbiAgICAgICAgcmVtYWluaW5nIC09IHN0YXJ0IC0gYnl0ZXMubGVuZ3RoKCk7XG4gICAgICAgIGxlbmd0aCAtPSBzdGFydCAtIGJ5dGVzLmxlbmd0aCgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIGlmIGEgQklUIFNUUklORywgc2F2ZSB0aGUgY29udGVudHMgaW5jbHVkaW5nIHBhZGRpbmdcbiAgaWYodmFsdWUgPT09IHVuZGVmaW5lZCAmJiB0YWdDbGFzcyA9PT0gYXNuMS5DbGFzcy5VTklWRVJTQUwgJiZcbiAgICB0eXBlID09PSBhc24xLlR5cGUuQklUU1RSSU5HKSB7XG4gICAgYml0U3RyaW5nQ29udGVudHMgPSBieXRlcy5ieXRlcyhsZW5ndGgpO1xuICB9XG5cbiAgLy8gZGV0ZXJtaW5lIGlmIGEgbm9uLWNvbnN0cnVjdGVkIHZhbHVlIHNob3VsZCBiZSBkZWNvZGVkIGFzIGEgY29tcG9zZWRcbiAgLy8gdmFsdWUgdGhhdCBjb250YWlucyBvdGhlciBBU04uMSBvYmplY3RzLiBCSVQgU1RSSU5HcyAoYW5kIE9DVEVUIFNUUklOR3MpXG4gIC8vIGNhbiBiZSB1c2VkIHRoaXMgd2F5LlxuICBpZih2YWx1ZSA9PT0gdW5kZWZpbmVkICYmIG9wdGlvbnMuZGVjb2RlQml0U3RyaW5ncyAmJlxuICAgIHRhZ0NsYXNzID09PSBhc24xLkNsYXNzLlVOSVZFUlNBTCAmJlxuICAgIC8vIEZJWE1FOiBPQ1RFVCBTVFJJTkdzIG5vdCB5ZXQgc3VwcG9ydGVkIGhlcmVcbiAgICAvLyAuLiBvdGhlciBwYXJ0cyBvZiBmb3JnZSBleHBlY3QgdG8gZGVjb2RlIE9DVEVUIFNUUklOR3MgbWFudWFsbHlcbiAgICAodHlwZSA9PT0gYXNuMS5UeXBlLkJJVFNUUklORyAvKnx8IHR5cGUgPT09IGFzbjEuVHlwZS5PQ1RFVFNUUklORyovKSAmJlxuICAgIGxlbmd0aCA+IDEpIHtcbiAgICAvLyBzYXZlIHJlYWQgcG9zaXRpb25cbiAgICB2YXIgc2F2ZWRSZWFkID0gYnl0ZXMucmVhZDtcbiAgICB2YXIgc2F2ZWRSZW1haW5pbmcgPSByZW1haW5pbmc7XG4gICAgdmFyIHVudXNlZCA9IDA7XG4gICAgaWYodHlwZSA9PT0gYXNuMS5UeXBlLkJJVFNUUklORykge1xuICAgICAgLyogVGhlIGZpcnN0IG9jdGV0IGdpdmVzIHRoZSBudW1iZXIgb2YgYml0cyBieSB3aGljaCB0aGUgbGVuZ3RoIG9mIHRoZVxuICAgICAgICBiaXQgc3RyaW5nIGlzIGxlc3MgdGhhbiB0aGUgbmV4dCBtdWx0aXBsZSBvZiBlaWdodCAodGhpcyBpcyBjYWxsZWRcbiAgICAgICAgdGhlIFwibnVtYmVyIG9mIHVudXNlZCBiaXRzXCIpLlxuXG4gICAgICAgIFRoZSBzZWNvbmQgYW5kIGZvbGxvd2luZyBvY3RldHMgZ2l2ZSB0aGUgdmFsdWUgb2YgdGhlIGJpdCBzdHJpbmdcbiAgICAgICAgY29udmVydGVkIHRvIGFuIG9jdGV0IHN0cmluZy4gKi9cbiAgICAgIF9jaGVja0J1ZmZlckxlbmd0aChieXRlcywgcmVtYWluaW5nLCAxKTtcbiAgICAgIHVudXNlZCA9IGJ5dGVzLmdldEJ5dGUoKTtcbiAgICAgIHJlbWFpbmluZy0tO1xuICAgIH1cbiAgICAvLyBpZiBhbGwgYml0cyBhcmUgdXNlZCwgbWF5YmUgdGhlIEJJVC9PQ1RFVCBTVFJJTkcgaG9sZHMgQVNOLjEgb2Jqc1xuICAgIGlmKHVudXNlZCA9PT0gMCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gYXR0ZW1wdCB0byBwYXJzZSBjaGlsZCBhc24xIG9iamVjdCBmcm9tIHRoZSB2YWx1ZVxuICAgICAgICAvLyAoc3RvcmVkIGluIGFycmF5IHRvIHNpZ25hbCBjb21wb3NlZCB2YWx1ZSlcbiAgICAgICAgc3RhcnQgPSBieXRlcy5sZW5ndGgoKTtcbiAgICAgICAgdmFyIHN1Yk9wdGlvbnMgPSB7XG4gICAgICAgICAgLy8gZW5mb3JjZSBzdHJpY3QgbW9kZSB0byBhdm9pZCBwYXJzaW5nIEFTTi4xIGZyb20gcGxhaW4gZGF0YVxuICAgICAgICAgIHN0cmljdDogdHJ1ZSxcbiAgICAgICAgICBkZWNvZGVCaXRTdHJpbmdzOiB0cnVlXG4gICAgICAgIH07XG4gICAgICAgIHZhciBjb21wb3NlZCA9IF9mcm9tRGVyKGJ5dGVzLCByZW1haW5pbmcsIGRlcHRoICsgMSwgc3ViT3B0aW9ucyk7XG4gICAgICAgIHZhciB1c2VkID0gc3RhcnQgLSBieXRlcy5sZW5ndGgoKTtcbiAgICAgICAgcmVtYWluaW5nIC09IHVzZWQ7XG4gICAgICAgIGlmKHR5cGUgPT0gYXNuMS5UeXBlLkJJVFNUUklORykge1xuICAgICAgICAgIHVzZWQrKztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGlmIHRoZSBkYXRhIGFsbCBkZWNvZGVkIGFuZCB0aGUgY2xhc3MgaW5kaWNhdGVzIFVOSVZFUlNBTCBvclxuICAgICAgICAvLyBDT05URVhUX1NQRUNJRklDIHRoZW4gYXNzdW1lIHdlJ3ZlIGdvdCBhbiBlbmNhcHN1bGF0ZWQgQVNOLjEgb2JqZWN0XG4gICAgICAgIHZhciB0YyA9IGNvbXBvc2VkLnRhZ0NsYXNzO1xuICAgICAgICBpZih1c2VkID09PSBsZW5ndGggJiZcbiAgICAgICAgICAodGMgPT09IGFzbjEuQ2xhc3MuVU5JVkVSU0FMIHx8IHRjID09PSBhc24xLkNsYXNzLkNPTlRFWFRfU1BFQ0lGSUMpKSB7XG4gICAgICAgICAgdmFsdWUgPSBbY29tcG9zZWRdO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoKGV4KSB7XG4gICAgICB9XG4gICAgfVxuICAgIGlmKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIHJlc3RvcmUgcmVhZCBwb3NpdGlvblxuICAgICAgYnl0ZXMucmVhZCA9IHNhdmVkUmVhZDtcbiAgICAgIHJlbWFpbmluZyA9IHNhdmVkUmVtYWluaW5nO1xuICAgIH1cbiAgfVxuXG4gIGlmKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAvLyBhc24xIG5vdCBjb25zdHJ1Y3RlZCBvciBjb21wb3NlZCwgZ2V0IHJhdyB2YWx1ZVxuICAgIC8vIFRPRE86IGRvIERFUiB0byBPSUQgY29udmVyc2lvbiBhbmQgdmljZS12ZXJzYSBpbiAudG9EZXI/XG5cbiAgICBpZihsZW5ndGggPT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYob3B0aW9ucy5zdHJpY3QpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOb24tY29uc3RydWN0ZWQgQVNOLjEgb2JqZWN0IG9mIGluZGVmaW5pdGUgbGVuZ3RoLicpO1xuICAgICAgfVxuICAgICAgLy8gYmUgbGVuaWVudCBhbmQgdXNlIHJlbWFpbmluZyBzdGF0ZSBieXRlc1xuICAgICAgbGVuZ3RoID0gcmVtYWluaW5nO1xuICAgIH1cblxuICAgIGlmKHR5cGUgPT09IGFzbjEuVHlwZS5CTVBTVFJJTkcpIHtcbiAgICAgIHZhbHVlID0gJyc7XG4gICAgICBmb3IoOyBsZW5ndGggPiAwOyBsZW5ndGggLT0gMikge1xuICAgICAgICBfY2hlY2tCdWZmZXJMZW5ndGgoYnl0ZXMsIHJlbWFpbmluZywgMik7XG4gICAgICAgIHZhbHVlICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnl0ZXMuZ2V0SW50MTYoKSk7XG4gICAgICAgIHJlbWFpbmluZyAtPSAyO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB2YWx1ZSA9IGJ5dGVzLmdldEJ5dGVzKGxlbmd0aCk7XG4gICAgICByZW1haW5pbmcgLT0gbGVuZ3RoO1xuICAgIH1cbiAgfVxuXG4gIC8vIGFkZCBCSVQgU1RSSU5HIGNvbnRlbnRzIGlmIGF2YWlsYWJsZVxuICB2YXIgYXNuMU9wdGlvbnMgPSBiaXRTdHJpbmdDb250ZW50cyA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IHtcbiAgICBiaXRTdHJpbmdDb250ZW50czogYml0U3RyaW5nQ29udGVudHNcbiAgfTtcblxuICAvLyBjcmVhdGUgYW5kIHJldHVybiBhc24xIG9iamVjdFxuICByZXR1cm4gYXNuMS5jcmVhdGUodGFnQ2xhc3MsIHR5cGUsIGNvbnN0cnVjdGVkLCB2YWx1ZSwgYXNuMU9wdGlvbnMpO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIHRoZSBnaXZlbiBhc24xIG9iamVjdCB0byBhIGJ1ZmZlciBvZiBieXRlcyBpbiBERVIgZm9ybWF0LlxuICpcbiAqIEBwYXJhbSBhc24xIHRoZSBhc24xIG9iamVjdCB0byBjb252ZXJ0IHRvIGJ5dGVzLlxuICpcbiAqIEByZXR1cm4gdGhlIGJ1ZmZlciBvZiBieXRlcy5cbiAqL1xuYXNuMS50b0RlciA9IGZ1bmN0aW9uKG9iaikge1xuICB2YXIgYnl0ZXMgPSBmb3JnZS51dGlsLmNyZWF0ZUJ1ZmZlcigpO1xuXG4gIC8vIGJ1aWxkIHRoZSBmaXJzdCBieXRlXG4gIHZhciBiMSA9IG9iai50YWdDbGFzcyB8IG9iai50eXBlO1xuXG4gIC8vIGZvciBzdG9yaW5nIHRoZSBBU04uMSB2YWx1ZVxuICB2YXIgdmFsdWUgPSBmb3JnZS51dGlsLmNyZWF0ZUJ1ZmZlcigpO1xuXG4gIC8vIHVzZSBCSVQgU1RSSU5HIGNvbnRlbnRzIGlmIGF2YWlsYWJsZSBhbmQgZGF0YSBub3QgY2hhbmdlZFxuICB2YXIgdXNlQml0U3RyaW5nQ29udGVudHMgPSBmYWxzZTtcbiAgaWYoJ2JpdFN0cmluZ0NvbnRlbnRzJyBpbiBvYmopIHtcbiAgICB1c2VCaXRTdHJpbmdDb250ZW50cyA9IHRydWU7XG4gICAgaWYob2JqLm9yaWdpbmFsKSB7XG4gICAgICB1c2VCaXRTdHJpbmdDb250ZW50cyA9IGFzbjEuZXF1YWxzKG9iaiwgb2JqLm9yaWdpbmFsKTtcbiAgICB9XG4gIH1cblxuICBpZih1c2VCaXRTdHJpbmdDb250ZW50cykge1xuICAgIHZhbHVlLnB1dEJ5dGVzKG9iai5iaXRTdHJpbmdDb250ZW50cyk7XG4gIH0gZWxzZSBpZihvYmouY29tcG9zZWQpIHtcbiAgICAvLyBpZiBjb21wb3NlZCwgdXNlIGVhY2ggY2hpbGQgYXNuMSBvYmplY3QncyBERVIgYnl0ZXMgYXMgdmFsdWVcbiAgICAvLyB0dXJuIG9uIDZ0aCBiaXQgKDB4MjAgPSAzMikgdG8gaW5kaWNhdGUgYXNuMSBpcyBjb25zdHJ1Y3RlZFxuICAgIC8vIGZyb20gb3RoZXIgYXNuMSBvYmplY3RzXG4gICAgaWYob2JqLmNvbnN0cnVjdGVkKSB7XG4gICAgICBiMSB8PSAweDIwO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyB0eXBlIGlzIGEgYml0IHN0cmluZywgYWRkIHVudXNlZCBiaXRzIG9mIDB4MDBcbiAgICAgIHZhbHVlLnB1dEJ5dGUoMHgwMCk7XG4gICAgfVxuXG4gICAgLy8gYWRkIGFsbCBvZiB0aGUgY2hpbGQgREVSIGJ5dGVzIHRvZ2V0aGVyXG4gICAgZm9yKHZhciBpID0gMDsgaSA8IG9iai52YWx1ZS5sZW5ndGg7ICsraSkge1xuICAgICAgaWYob2JqLnZhbHVlW2ldICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdmFsdWUucHV0QnVmZmVyKGFzbjEudG9EZXIob2JqLnZhbHVlW2ldKSk7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIHVzZSBhc24xLnZhbHVlIGRpcmVjdGx5XG4gICAgaWYob2JqLnR5cGUgPT09IGFzbjEuVHlwZS5CTVBTVFJJTkcpIHtcbiAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCBvYmoudmFsdWUubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgdmFsdWUucHV0SW50MTYob2JqLnZhbHVlLmNoYXJDb2RlQXQoaSkpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBlbnN1cmUgaW50ZWdlciBpcyBtaW5pbWFsbHktZW5jb2RlZFxuICAgICAgLy8gVE9ETzogc2hvdWxkIGFsbCBsZWFkaW5nIGJ5dGVzIGJlIHN0cmlwcGVkIHZzIGp1c3Qgb25lP1xuICAgICAgLy8gLi4gZXggJzAwIDAwIDAxJyA9PiAnMDEnP1xuICAgICAgaWYob2JqLnR5cGUgPT09IGFzbjEuVHlwZS5JTlRFR0VSICYmXG4gICAgICAgIG9iai52YWx1ZS5sZW5ndGggPiAxICYmXG4gICAgICAgIC8vIGxlYWRpbmcgMHgwMCBmb3IgcG9zaXRpdmUgaW50ZWdlclxuICAgICAgICAoKG9iai52YWx1ZS5jaGFyQ29kZUF0KDApID09PSAwICYmXG4gICAgICAgIChvYmoudmFsdWUuY2hhckNvZGVBdCgxKSAmIDB4ODApID09PSAwKSB8fFxuICAgICAgICAvLyBsZWFkaW5nIDB4RkYgZm9yIG5lZ2F0aXZlIGludGVnZXJcbiAgICAgICAgKG9iai52YWx1ZS5jaGFyQ29kZUF0KDApID09PSAweEZGICYmXG4gICAgICAgIChvYmoudmFsdWUuY2hhckNvZGVBdCgxKSAmIDB4ODApID09PSAweDgwKSkpIHtcbiAgICAgICAgdmFsdWUucHV0Qnl0ZXMob2JqLnZhbHVlLnN1YnN0cigxKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWx1ZS5wdXRCeXRlcyhvYmoudmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIGFkZCB0YWcgYnl0ZVxuICBieXRlcy5wdXRCeXRlKGIxKTtcblxuICAvLyB1c2UgXCJzaG9ydCBmb3JtXCIgZW5jb2RpbmdcbiAgaWYodmFsdWUubGVuZ3RoKCkgPD0gMTI3KSB7XG4gICAgLy8gb25lIGJ5dGUgZGVzY3JpYmVzIHRoZSBsZW5ndGhcbiAgICAvLyBiaXQgOCA9IDAgYW5kIGJpdHMgNy0xID0gbGVuZ3RoXG4gICAgYnl0ZXMucHV0Qnl0ZSh2YWx1ZS5sZW5ndGgoKSAmIDB4N0YpO1xuICB9IGVsc2Uge1xuICAgIC8vIHVzZSBcImxvbmcgZm9ybVwiIGVuY29kaW5nXG4gICAgLy8gMiB0byAxMjcgYnl0ZXMgZGVzY3JpYmUgdGhlIGxlbmd0aFxuICAgIC8vIGZpcnN0IGJ5dGU6IGJpdCA4ID0gMSBhbmQgYml0cyA3LTEgPSAjIG9mIGFkZGl0aW9uYWwgYnl0ZXNcbiAgICAvLyBvdGhlciBieXRlczogbGVuZ3RoIGluIGJhc2UgMjU2LCBiaWctZW5kaWFuXG4gICAgdmFyIGxlbiA9IHZhbHVlLmxlbmd0aCgpO1xuICAgIHZhciBsZW5CeXRlcyA9ICcnO1xuICAgIGRvIHtcbiAgICAgIGxlbkJ5dGVzICs9IFN0cmluZy5mcm9tQ2hhckNvZGUobGVuICYgMHhGRik7XG4gICAgICBsZW4gPSBsZW4gPj4+IDg7XG4gICAgfSB3aGlsZShsZW4gPiAwKTtcblxuICAgIC8vIHNldCBmaXJzdCBieXRlIHRvICMgYnl0ZXMgdXNlZCB0byBzdG9yZSB0aGUgbGVuZ3RoIGFuZCB0dXJuIG9uXG4gICAgLy8gYml0IDggdG8gaW5kaWNhdGUgbG9uZy1mb3JtIGxlbmd0aCBpcyB1c2VkXG4gICAgYnl0ZXMucHV0Qnl0ZShsZW5CeXRlcy5sZW5ndGggfCAweDgwKTtcblxuICAgIC8vIGNvbmNhdGVuYXRlIGxlbmd0aCBieXRlcyBpbiByZXZlcnNlIHNpbmNlIHRoZXkgd2VyZSBnZW5lcmF0ZWRcbiAgICAvLyBsaXR0bGUgZW5kaWFuIGFuZCB3ZSBuZWVkIGJpZyBlbmRpYW5cbiAgICBmb3IodmFyIGkgPSBsZW5CeXRlcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgYnl0ZXMucHV0Qnl0ZShsZW5CeXRlcy5jaGFyQ29kZUF0KGkpKTtcbiAgICB9XG4gIH1cblxuICAvLyBjb25jYXRlbmF0ZSB2YWx1ZSBieXRlc1xuICBieXRlcy5wdXRCdWZmZXIodmFsdWUpO1xuICByZXR1cm4gYnl0ZXM7XG59O1xuXG4vKipcbiAqIENvbnZlcnRzIGFuIE9JRCBkb3Qtc2VwYXJhdGVkIHN0cmluZyB0byBhIGJ5dGUgYnVmZmVyLiBUaGUgYnl0ZSBidWZmZXJcbiAqIGNvbnRhaW5zIG9ubHkgdGhlIERFUi1lbmNvZGVkIHZhbHVlLCBub3QgYW55IHRhZyBvciBsZW5ndGggYnl0ZXMuXG4gKlxuICogQHBhcmFtIG9pZCB0aGUgT0lEIGRvdC1zZXBhcmF0ZWQgc3RyaW5nLlxuICpcbiAqIEByZXR1cm4gdGhlIGJ5dGUgYnVmZmVyLlxuICovXG5hc24xLm9pZFRvRGVyID0gZnVuY3Rpb24ob2lkKSB7XG4gIC8vIHNwbGl0IE9JRCBpbnRvIGluZGl2aWR1YWwgdmFsdWVzXG4gIHZhciB2YWx1ZXMgPSBvaWQuc3BsaXQoJy4nKTtcbiAgdmFyIGJ5dGVzID0gZm9yZ2UudXRpbC5jcmVhdGVCdWZmZXIoKTtcblxuICAvLyBmaXJzdCBieXRlIGlzIDQwICogdmFsdWUxICsgdmFsdWUyXG4gIGJ5dGVzLnB1dEJ5dGUoNDAgKiBwYXJzZUludCh2YWx1ZXNbMF0sIDEwKSArIHBhcnNlSW50KHZhbHVlc1sxXSwgMTApKTtcbiAgLy8gb3RoZXIgYnl0ZXMgYXJlIGVhY2ggdmFsdWUgaW4gYmFzZSAxMjggd2l0aCA4dGggYml0IHNldCBleGNlcHQgZm9yXG4gIC8vIHRoZSBsYXN0IGJ5dGUgZm9yIGVhY2ggdmFsdWVcbiAgdmFyIGxhc3QsIHZhbHVlQnl0ZXMsIHZhbHVlLCBiO1xuICBmb3IodmFyIGkgPSAyOyBpIDwgdmFsdWVzLmxlbmd0aDsgKytpKSB7XG4gICAgLy8gcHJvZHVjZSB2YWx1ZSBieXRlcyBpbiByZXZlcnNlIGJlY2F1c2Ugd2UgZG9uJ3Qga25vdyBob3cgbWFueVxuICAgIC8vIGJ5dGVzIGl0IHdpbGwgdGFrZSB0byBzdG9yZSB0aGUgdmFsdWVcbiAgICBsYXN0ID0gdHJ1ZTtcbiAgICB2YWx1ZUJ5dGVzID0gW107XG4gICAgdmFsdWUgPSBwYXJzZUludCh2YWx1ZXNbaV0sIDEwKTtcbiAgICBkbyB7XG4gICAgICBiID0gdmFsdWUgJiAweDdGO1xuICAgICAgdmFsdWUgPSB2YWx1ZSA+Pj4gNztcbiAgICAgIC8vIGlmIHZhbHVlIGlzIG5vdCBsYXN0LCB0aGVuIHR1cm4gb24gOHRoIGJpdFxuICAgICAgaWYoIWxhc3QpIHtcbiAgICAgICAgYiB8PSAweDgwO1xuICAgICAgfVxuICAgICAgdmFsdWVCeXRlcy5wdXNoKGIpO1xuICAgICAgbGFzdCA9IGZhbHNlO1xuICAgIH0gd2hpbGUodmFsdWUgPiAwKTtcblxuICAgIC8vIGFkZCB2YWx1ZSBieXRlcyBpbiByZXZlcnNlIChuZWVkcyB0byBiZSBpbiBiaWcgZW5kaWFuKVxuICAgIGZvcih2YXIgbiA9IHZhbHVlQnl0ZXMubGVuZ3RoIC0gMTsgbiA+PSAwOyAtLW4pIHtcbiAgICAgIGJ5dGVzLnB1dEJ5dGUodmFsdWVCeXRlc1tuXSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGJ5dGVzO1xufTtcblxuLyoqXG4gKiBDb252ZXJ0cyBhIERFUi1lbmNvZGVkIGJ5dGUgYnVmZmVyIHRvIGFuIE9JRCBkb3Qtc2VwYXJhdGVkIHN0cmluZy4gVGhlXG4gKiBieXRlIGJ1ZmZlciBzaG91bGQgY29udGFpbiBvbmx5IHRoZSBERVItZW5jb2RlZCB2YWx1ZSwgbm90IGFueSB0YWcgb3JcbiAqIGxlbmd0aCBieXRlcy5cbiAqXG4gKiBAcGFyYW0gYnl0ZXMgdGhlIGJ5dGUgYnVmZmVyLlxuICpcbiAqIEByZXR1cm4gdGhlIE9JRCBkb3Qtc2VwYXJhdGVkIHN0cmluZy5cbiAqL1xuYXNuMS5kZXJUb09pZCA9IGZ1bmN0aW9uKGJ5dGVzKSB7XG4gIHZhciBvaWQ7XG5cbiAgLy8gd3JhcCBpbiBidWZmZXIgaWYgbmVlZGVkXG4gIGlmKHR5cGVvZiBieXRlcyA9PT0gJ3N0cmluZycpIHtcbiAgICBieXRlcyA9IGZvcmdlLnV0aWwuY3JlYXRlQnVmZmVyKGJ5dGVzKTtcbiAgfVxuXG4gIC8vIGZpcnN0IGJ5dGUgaXMgNDAgKiB2YWx1ZTEgKyB2YWx1ZTJcbiAgdmFyIGIgPSBieXRlcy5nZXRCeXRlKCk7XG4gIG9pZCA9IE1hdGguZmxvb3IoYiAvIDQwKSArICcuJyArIChiICUgNDApO1xuXG4gIC8vIG90aGVyIGJ5dGVzIGFyZSBlYWNoIHZhbHVlIGluIGJhc2UgMTI4IHdpdGggOHRoIGJpdCBzZXQgZXhjZXB0IGZvclxuICAvLyB0aGUgbGFzdCBieXRlIGZvciBlYWNoIHZhbHVlXG4gIHZhciB2YWx1ZSA9IDA7XG4gIHdoaWxlKGJ5dGVzLmxlbmd0aCgpID4gMCkge1xuICAgIGIgPSBieXRlcy5nZXRCeXRlKCk7XG4gICAgdmFsdWUgPSB2YWx1ZSA8PCA3O1xuICAgIC8vIG5vdCB0aGUgbGFzdCBieXRlIGZvciB0aGUgdmFsdWVcbiAgICBpZihiICYgMHg4MCkge1xuICAgICAgdmFsdWUgKz0gYiAmIDB4N0Y7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGxhc3QgYnl0ZVxuICAgICAgb2lkICs9ICcuJyArICh2YWx1ZSArIGIpO1xuICAgICAgdmFsdWUgPSAwO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBvaWQ7XG59O1xuXG4vKipcbiAqIENvbnZlcnRzIGEgVVRDVGltZSB2YWx1ZSB0byBhIGRhdGUuXG4gKlxuICogTm90ZTogR2VuZXJhbGl6ZWRUaW1lIGhhcyA0IGRpZ2l0cyBmb3IgdGhlIHllYXIgYW5kIGlzIHVzZWQgZm9yIFguNTA5XG4gKiBkYXRlcyBwYXN0IDIwNDkuIFBhcnNpbmcgdGhhdCBzdHJ1Y3R1cmUgaGFzbid0IGJlZW4gaW1wbGVtZW50ZWQgeWV0LlxuICpcbiAqIEBwYXJhbSB1dGMgdGhlIFVUQ1RpbWUgdmFsdWUgdG8gY29udmVydC5cbiAqXG4gKiBAcmV0dXJuIHRoZSBkYXRlLlxuICovXG5hc24xLnV0Y1RpbWVUb0RhdGUgPSBmdW5jdGlvbih1dGMpIHtcbiAgLyogVGhlIGZvbGxvd2luZyBmb3JtYXRzIGNhbiBiZSB1c2VkOlxuXG4gICAgWVlNTUREaGhtbVpcbiAgICBZWU1NRERoaG1tK2hoJ21tJ1xuICAgIFlZTU1ERGhobW0taGgnbW0nXG4gICAgWVlNTUREaGhtbXNzWlxuICAgIFlZTU1ERGhobW1zcytoaCdtbSdcbiAgICBZWU1NRERoaG1tc3MtaGgnbW0nXG5cbiAgICBXaGVyZTpcblxuICAgIFlZIGlzIHRoZSBsZWFzdCBzaWduaWZpY2FudCB0d28gZGlnaXRzIG9mIHRoZSB5ZWFyXG4gICAgTU0gaXMgdGhlIG1vbnRoICgwMSB0byAxMilcbiAgICBERCBpcyB0aGUgZGF5ICgwMSB0byAzMSlcbiAgICBoaCBpcyB0aGUgaG91ciAoMDAgdG8gMjMpXG4gICAgbW0gYXJlIHRoZSBtaW51dGVzICgwMCB0byA1OSlcbiAgICBzcyBhcmUgdGhlIHNlY29uZHMgKDAwIHRvIDU5KVxuICAgIFogaW5kaWNhdGVzIHRoYXQgbG9jYWwgdGltZSBpcyBHTVQsICsgaW5kaWNhdGVzIHRoYXQgbG9jYWwgdGltZSBpc1xuICAgIGxhdGVyIHRoYW4gR01ULCBhbmQgLSBpbmRpY2F0ZXMgdGhhdCBsb2NhbCB0aW1lIGlzIGVhcmxpZXIgdGhhbiBHTVRcbiAgICBoaCcgaXMgdGhlIGFic29sdXRlIHZhbHVlIG9mIHRoZSBvZmZzZXQgZnJvbSBHTVQgaW4gaG91cnNcbiAgICBtbScgaXMgdGhlIGFic29sdXRlIHZhbHVlIG9mIHRoZSBvZmZzZXQgZnJvbSBHTVQgaW4gbWludXRlcyAqL1xuICB2YXIgZGF0ZSA9IG5ldyBEYXRlKCk7XG5cbiAgLy8gaWYgWVkgPj0gNTAgdXNlIDE5eHgsIGlmIFlZIDwgNTAgdXNlIDIweHhcbiAgdmFyIHllYXIgPSBwYXJzZUludCh1dGMuc3Vic3RyKDAsIDIpLCAxMCk7XG4gIHllYXIgPSAoeWVhciA+PSA1MCkgPyAxOTAwICsgeWVhciA6IDIwMDAgKyB5ZWFyO1xuICB2YXIgTU0gPSBwYXJzZUludCh1dGMuc3Vic3RyKDIsIDIpLCAxMCkgLSAxOyAvLyB1c2UgMC0xMSBmb3IgbW9udGhcbiAgdmFyIEREID0gcGFyc2VJbnQodXRjLnN1YnN0cig0LCAyKSwgMTApO1xuICB2YXIgaGggPSBwYXJzZUludCh1dGMuc3Vic3RyKDYsIDIpLCAxMCk7XG4gIHZhciBtbSA9IHBhcnNlSW50KHV0Yy5zdWJzdHIoOCwgMiksIDEwKTtcbiAgdmFyIHNzID0gMDtcblxuICAvLyBub3QganVzdCBZWU1NRERoaG1tWlxuICBpZih1dGMubGVuZ3RoID4gMTEpIHtcbiAgICAvLyBnZXQgY2hhcmFjdGVyIGFmdGVyIG1pbnV0ZXNcbiAgICB2YXIgYyA9IHV0Yy5jaGFyQXQoMTApO1xuICAgIHZhciBlbmQgPSAxMDtcblxuICAgIC8vIHNlZSBpZiBzZWNvbmRzIGFyZSBwcmVzZW50XG4gICAgaWYoYyAhPT0gJysnICYmIGMgIT09ICctJykge1xuICAgICAgLy8gZ2V0IHNlY29uZHNcbiAgICAgIHNzID0gcGFyc2VJbnQodXRjLnN1YnN0cigxMCwgMiksIDEwKTtcbiAgICAgIGVuZCArPSAyO1xuICAgIH1cbiAgfVxuXG4gIC8vIHVwZGF0ZSBkYXRlXG4gIGRhdGUuc2V0VVRDRnVsbFllYXIoeWVhciwgTU0sIEREKTtcbiAgZGF0ZS5zZXRVVENIb3VycyhoaCwgbW0sIHNzLCAwKTtcblxuICBpZihlbmQpIHtcbiAgICAvLyBnZXQgKy8tIGFmdGVyIGVuZCBvZiB0aW1lXG4gICAgYyA9IHV0Yy5jaGFyQXQoZW5kKTtcbiAgICBpZihjID09PSAnKycgfHwgYyA9PT0gJy0nKSB7XG4gICAgICAvLyBnZXQgaG91cnMrbWludXRlcyBvZmZzZXRcbiAgICAgIHZhciBoaG9mZnNldCA9IHBhcnNlSW50KHV0Yy5zdWJzdHIoZW5kICsgMSwgMiksIDEwKTtcbiAgICAgIHZhciBtbW9mZnNldCA9IHBhcnNlSW50KHV0Yy5zdWJzdHIoZW5kICsgNCwgMiksIDEwKTtcblxuICAgICAgLy8gY2FsY3VsYXRlIG9mZnNldCBpbiBtaWxsaXNlY29uZHNcbiAgICAgIHZhciBvZmZzZXQgPSBoaG9mZnNldCAqIDYwICsgbW1vZmZzZXQ7XG4gICAgICBvZmZzZXQgKj0gNjAwMDA7XG5cbiAgICAgIC8vIGFwcGx5IG9mZnNldFxuICAgICAgaWYoYyA9PT0gJysnKSB7XG4gICAgICAgIGRhdGUuc2V0VGltZSgrZGF0ZSAtIG9mZnNldCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkYXRlLnNldFRpbWUoK2RhdGUgKyBvZmZzZXQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBkYXRlO1xufTtcblxuLyoqXG4gKiBDb252ZXJ0cyBhIEdlbmVyYWxpemVkVGltZSB2YWx1ZSB0byBhIGRhdGUuXG4gKlxuICogQHBhcmFtIGdlbnRpbWUgdGhlIEdlbmVyYWxpemVkVGltZSB2YWx1ZSB0byBjb252ZXJ0LlxuICpcbiAqIEByZXR1cm4gdGhlIGRhdGUuXG4gKi9cbmFzbjEuZ2VuZXJhbGl6ZWRUaW1lVG9EYXRlID0gZnVuY3Rpb24oZ2VudGltZSkge1xuICAvKiBUaGUgZm9sbG93aW5nIGZvcm1hdHMgY2FuIGJlIHVzZWQ6XG5cbiAgICBZWVlZTU1EREhITU1TU1xuICAgIFlZWVlNTURESEhNTVNTLmZmZlxuICAgIFlZWVlNTURESEhNTVNTWlxuICAgIFlZWVlNTURESEhNTVNTLmZmZlpcbiAgICBZWVlZTU1EREhITU1TUytoaCdtbSdcbiAgICBZWVlZTU1EREhITU1TUy5mZmYraGgnbW0nXG4gICAgWVlZWU1NRERISE1NU1MtaGgnbW0nXG4gICAgWVlZWU1NRERISE1NU1MuZmZmLWhoJ21tJ1xuXG4gICAgV2hlcmU6XG5cbiAgICBZWVlZIGlzIHRoZSB5ZWFyXG4gICAgTU0gaXMgdGhlIG1vbnRoICgwMSB0byAxMilcbiAgICBERCBpcyB0aGUgZGF5ICgwMSB0byAzMSlcbiAgICBoaCBpcyB0aGUgaG91ciAoMDAgdG8gMjMpXG4gICAgbW0gYXJlIHRoZSBtaW51dGVzICgwMCB0byA1OSlcbiAgICBzcyBhcmUgdGhlIHNlY29uZHMgKDAwIHRvIDU5KVxuICAgIC5mZmYgaXMgdGhlIHNlY29uZCBmcmFjdGlvbiwgYWNjdXJhdGUgdG8gdGhyZWUgZGVjaW1hbCBwbGFjZXNcbiAgICBaIGluZGljYXRlcyB0aGF0IGxvY2FsIHRpbWUgaXMgR01ULCArIGluZGljYXRlcyB0aGF0IGxvY2FsIHRpbWUgaXNcbiAgICBsYXRlciB0aGFuIEdNVCwgYW5kIC0gaW5kaWNhdGVzIHRoYXQgbG9jYWwgdGltZSBpcyBlYXJsaWVyIHRoYW4gR01UXG4gICAgaGgnIGlzIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB0aGUgb2Zmc2V0IGZyb20gR01UIGluIGhvdXJzXG4gICAgbW0nIGlzIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB0aGUgb2Zmc2V0IGZyb20gR01UIGluIG1pbnV0ZXMgKi9cbiAgdmFyIGRhdGUgPSBuZXcgRGF0ZSgpO1xuXG4gIHZhciBZWVlZID0gcGFyc2VJbnQoZ2VudGltZS5zdWJzdHIoMCwgNCksIDEwKTtcbiAgdmFyIE1NID0gcGFyc2VJbnQoZ2VudGltZS5zdWJzdHIoNCwgMiksIDEwKSAtIDE7IC8vIHVzZSAwLTExIGZvciBtb250aFxuICB2YXIgREQgPSBwYXJzZUludChnZW50aW1lLnN1YnN0cig2LCAyKSwgMTApO1xuICB2YXIgaGggPSBwYXJzZUludChnZW50aW1lLnN1YnN0cig4LCAyKSwgMTApO1xuICB2YXIgbW0gPSBwYXJzZUludChnZW50aW1lLnN1YnN0cigxMCwgMiksIDEwKTtcbiAgdmFyIHNzID0gcGFyc2VJbnQoZ2VudGltZS5zdWJzdHIoMTIsIDIpLCAxMCk7XG4gIHZhciBmZmYgPSAwO1xuICB2YXIgb2Zmc2V0ID0gMDtcbiAgdmFyIGlzVVRDID0gZmFsc2U7XG5cbiAgaWYoZ2VudGltZS5jaGFyQXQoZ2VudGltZS5sZW5ndGggLSAxKSA9PT0gJ1onKSB7XG4gICAgaXNVVEMgPSB0cnVlO1xuICB9XG5cbiAgdmFyIGVuZCA9IGdlbnRpbWUubGVuZ3RoIC0gNSwgYyA9IGdlbnRpbWUuY2hhckF0KGVuZCk7XG4gIGlmKGMgPT09ICcrJyB8fCBjID09PSAnLScpIHtcbiAgICAvLyBnZXQgaG91cnMrbWludXRlcyBvZmZzZXRcbiAgICB2YXIgaGhvZmZzZXQgPSBwYXJzZUludChnZW50aW1lLnN1YnN0cihlbmQgKyAxLCAyKSwgMTApO1xuICAgIHZhciBtbW9mZnNldCA9IHBhcnNlSW50KGdlbnRpbWUuc3Vic3RyKGVuZCArIDQsIDIpLCAxMCk7XG5cbiAgICAvLyBjYWxjdWxhdGUgb2Zmc2V0IGluIG1pbGxpc2Vjb25kc1xuICAgIG9mZnNldCA9IGhob2Zmc2V0ICogNjAgKyBtbW9mZnNldDtcbiAgICBvZmZzZXQgKj0gNjAwMDA7XG5cbiAgICAvLyBhcHBseSBvZmZzZXRcbiAgICBpZihjID09PSAnKycpIHtcbiAgICAgIG9mZnNldCAqPSAtMTtcbiAgICB9XG5cbiAgICBpc1VUQyA9IHRydWU7XG4gIH1cblxuICAvLyBjaGVjayBmb3Igc2Vjb25kIGZyYWN0aW9uXG4gIGlmKGdlbnRpbWUuY2hhckF0KDE0KSA9PT0gJy4nKSB7XG4gICAgZmZmID0gcGFyc2VGbG9hdChnZW50aW1lLnN1YnN0cigxNCksIDEwKSAqIDEwMDA7XG4gIH1cblxuICBpZihpc1VUQykge1xuICAgIGRhdGUuc2V0VVRDRnVsbFllYXIoWVlZWSwgTU0sIEREKTtcbiAgICBkYXRlLnNldFVUQ0hvdXJzKGhoLCBtbSwgc3MsIGZmZik7XG5cbiAgICAvLyBhcHBseSBvZmZzZXRcbiAgICBkYXRlLnNldFRpbWUoK2RhdGUgKyBvZmZzZXQpO1xuICB9IGVsc2Uge1xuICAgIGRhdGUuc2V0RnVsbFllYXIoWVlZWSwgTU0sIEREKTtcbiAgICBkYXRlLnNldEhvdXJzKGhoLCBtbSwgc3MsIGZmZik7XG4gIH1cblxuICByZXR1cm4gZGF0ZTtcbn07XG5cbi8qKlxuICogQ29udmVydHMgYSBkYXRlIHRvIGEgVVRDVGltZSB2YWx1ZS5cbiAqXG4gKiBOb3RlOiBHZW5lcmFsaXplZFRpbWUgaGFzIDQgZGlnaXRzIGZvciB0aGUgeWVhciBhbmQgaXMgdXNlZCBmb3IgWC41MDlcbiAqIGRhdGVzIHBhc3QgMjA0OS4gQ29udmVydGluZyB0byBhIEdlbmVyYWxpemVkVGltZSBoYXNuJ3QgYmVlblxuICogaW1wbGVtZW50ZWQgeWV0LlxuICpcbiAqIEBwYXJhbSBkYXRlIHRoZSBkYXRlIHRvIGNvbnZlcnQuXG4gKlxuICogQHJldHVybiB0aGUgVVRDVGltZSB2YWx1ZS5cbiAqL1xuYXNuMS5kYXRlVG9VdGNUaW1lID0gZnVuY3Rpb24oZGF0ZSkge1xuICAvLyBUT0RPOiB2YWxpZGF0ZTsgY3VycmVudGx5IGFzc3VtZXMgcHJvcGVyIGZvcm1hdFxuICBpZih0eXBlb2YgZGF0ZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZGF0ZTtcbiAgfVxuXG4gIHZhciBydmFsID0gJyc7XG5cbiAgLy8gY3JlYXRlIGZvcm1hdCBZWU1NRERoaG1tc3NaXG4gIHZhciBmb3JtYXQgPSBbXTtcbiAgZm9ybWF0LnB1c2goKCcnICsgZGF0ZS5nZXRVVENGdWxsWWVhcigpKS5zdWJzdHIoMikpO1xuICBmb3JtYXQucHVzaCgnJyArIChkYXRlLmdldFVUQ01vbnRoKCkgKyAxKSk7XG4gIGZvcm1hdC5wdXNoKCcnICsgZGF0ZS5nZXRVVENEYXRlKCkpO1xuICBmb3JtYXQucHVzaCgnJyArIGRhdGUuZ2V0VVRDSG91cnMoKSk7XG4gIGZvcm1hdC5wdXNoKCcnICsgZGF0ZS5nZXRVVENNaW51dGVzKCkpO1xuICBmb3JtYXQucHVzaCgnJyArIGRhdGUuZ2V0VVRDU2Vjb25kcygpKTtcblxuICAvLyBlbnN1cmUgMiBkaWdpdHMgYXJlIHVzZWQgZm9yIGVhY2ggZm9ybWF0IGVudHJ5XG4gIGZvcih2YXIgaSA9IDA7IGkgPCBmb3JtYXQubGVuZ3RoOyArK2kpIHtcbiAgICBpZihmb3JtYXRbaV0ubGVuZ3RoIDwgMikge1xuICAgICAgcnZhbCArPSAnMCc7XG4gICAgfVxuICAgIHJ2YWwgKz0gZm9ybWF0W2ldO1xuICB9XG4gIHJ2YWwgKz0gJ1onO1xuXG4gIHJldHVybiBydmFsO1xufTtcblxuLyoqXG4gKiBDb252ZXJ0cyBhIGRhdGUgdG8gYSBHZW5lcmFsaXplZFRpbWUgdmFsdWUuXG4gKlxuICogQHBhcmFtIGRhdGUgdGhlIGRhdGUgdG8gY29udmVydC5cbiAqXG4gKiBAcmV0dXJuIHRoZSBHZW5lcmFsaXplZFRpbWUgdmFsdWUgYXMgYSBzdHJpbmcuXG4gKi9cbmFzbjEuZGF0ZVRvR2VuZXJhbGl6ZWRUaW1lID0gZnVuY3Rpb24oZGF0ZSkge1xuICAvLyBUT0RPOiB2YWxpZGF0ZTsgY3VycmVudGx5IGFzc3VtZXMgcHJvcGVyIGZvcm1hdFxuICBpZih0eXBlb2YgZGF0ZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZGF0ZTtcbiAgfVxuXG4gIHZhciBydmFsID0gJyc7XG5cbiAgLy8gY3JlYXRlIGZvcm1hdCBZWVlZTU1EREhITU1TU1pcbiAgdmFyIGZvcm1hdCA9IFtdO1xuICBmb3JtYXQucHVzaCgnJyArIGRhdGUuZ2V0VVRDRnVsbFllYXIoKSk7XG4gIGZvcm1hdC5wdXNoKCcnICsgKGRhdGUuZ2V0VVRDTW9udGgoKSArIDEpKTtcbiAgZm9ybWF0LnB1c2goJycgKyBkYXRlLmdldFVUQ0RhdGUoKSk7XG4gIGZvcm1hdC5wdXNoKCcnICsgZGF0ZS5nZXRVVENIb3VycygpKTtcbiAgZm9ybWF0LnB1c2goJycgKyBkYXRlLmdldFVUQ01pbnV0ZXMoKSk7XG4gIGZvcm1hdC5wdXNoKCcnICsgZGF0ZS5nZXRVVENTZWNvbmRzKCkpO1xuXG4gIC8vIGVuc3VyZSAyIGRpZ2l0cyBhcmUgdXNlZCBmb3IgZWFjaCBmb3JtYXQgZW50cnlcbiAgZm9yKHZhciBpID0gMDsgaSA8IGZvcm1hdC5sZW5ndGg7ICsraSkge1xuICAgIGlmKGZvcm1hdFtpXS5sZW5ndGggPCAyKSB7XG4gICAgICBydmFsICs9ICcwJztcbiAgICB9XG4gICAgcnZhbCArPSBmb3JtYXRbaV07XG4gIH1cbiAgcnZhbCArPSAnWic7XG5cbiAgcmV0dXJuIHJ2YWw7XG59O1xuXG4vKipcbiAqIENvbnZlcnRzIGEgamF2YXNjcmlwdCBpbnRlZ2VyIHRvIGEgREVSLWVuY29kZWQgYnl0ZSBidWZmZXIgdG8gYmUgdXNlZFxuICogYXMgdGhlIHZhbHVlIGZvciBhbiBJTlRFR0VSIHR5cGUuXG4gKlxuICogQHBhcmFtIHggdGhlIGludGVnZXIuXG4gKlxuICogQHJldHVybiB0aGUgYnl0ZSBidWZmZXIuXG4gKi9cbmFzbjEuaW50ZWdlclRvRGVyID0gZnVuY3Rpb24oeCkge1xuICB2YXIgcnZhbCA9IGZvcmdlLnV0aWwuY3JlYXRlQnVmZmVyKCk7XG4gIGlmKHggPj0gLTB4ODAgJiYgeCA8IDB4ODApIHtcbiAgICByZXR1cm4gcnZhbC5wdXRTaWduZWRJbnQoeCwgOCk7XG4gIH1cbiAgaWYoeCA+PSAtMHg4MDAwICYmIHggPCAweDgwMDApIHtcbiAgICByZXR1cm4gcnZhbC5wdXRTaWduZWRJbnQoeCwgMTYpO1xuICB9XG4gIGlmKHggPj0gLTB4ODAwMDAwICYmIHggPCAweDgwMDAwMCkge1xuICAgIHJldHVybiBydmFsLnB1dFNpZ25lZEludCh4LCAyNCk7XG4gIH1cbiAgaWYoeCA+PSAtMHg4MDAwMDAwMCAmJiB4IDwgMHg4MDAwMDAwMCkge1xuICAgIHJldHVybiBydmFsLnB1dFNpZ25lZEludCh4LCAzMik7XG4gIH1cbiAgdmFyIGVycm9yID0gbmV3IEVycm9yKCdJbnRlZ2VyIHRvbyBsYXJnZTsgbWF4IGlzIDMyLWJpdHMuJyk7XG4gIGVycm9yLmludGVnZXIgPSB4O1xuICB0aHJvdyBlcnJvcjtcbn07XG5cbi8qKlxuICogQ29udmVydHMgYSBERVItZW5jb2RlZCBieXRlIGJ1ZmZlciB0byBhIGphdmFzY3JpcHQgaW50ZWdlci4gVGhpcyBpc1xuICogdHlwaWNhbGx5IHVzZWQgdG8gZGVjb2RlIHRoZSB2YWx1ZSBvZiBhbiBJTlRFR0VSIHR5cGUuXG4gKlxuICogQHBhcmFtIGJ5dGVzIHRoZSBieXRlIGJ1ZmZlci5cbiAqXG4gKiBAcmV0dXJuIHRoZSBpbnRlZ2VyLlxuICovXG5hc24xLmRlclRvSW50ZWdlciA9IGZ1bmN0aW9uKGJ5dGVzKSB7XG4gIC8vIHdyYXAgaW4gYnVmZmVyIGlmIG5lZWRlZFxuICBpZih0eXBlb2YgYnl0ZXMgPT09ICdzdHJpbmcnKSB7XG4gICAgYnl0ZXMgPSBmb3JnZS51dGlsLmNyZWF0ZUJ1ZmZlcihieXRlcyk7XG4gIH1cblxuICB2YXIgbiA9IGJ5dGVzLmxlbmd0aCgpICogODtcbiAgaWYobiA+IDMyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnRlZ2VyIHRvbyBsYXJnZTsgbWF4IGlzIDMyLWJpdHMuJyk7XG4gIH1cbiAgcmV0dXJuIGJ5dGVzLmdldFNpZ25lZEludChuKTtcbn07XG5cbi8qKlxuICogVmFsaWRhdGVzIHRoYXQgdGhlIGdpdmVuIEFTTi4xIG9iamVjdCBpcyBhdCBsZWFzdCBhIHN1cGVyIHNldCBvZiB0aGVcbiAqIGdpdmVuIEFTTi4xIHN0cnVjdHVyZS4gT25seSB0YWcgY2xhc3NlcyBhbmQgdHlwZXMgYXJlIGNoZWNrZWQuIEFuXG4gKiBvcHRpb25hbCBtYXAgbWF5IGFsc28gYmUgcHJvdmlkZWQgdG8gY2FwdHVyZSBBU04uMSB2YWx1ZXMgd2hpbGUgdGhlXG4gKiBzdHJ1Y3R1cmUgaXMgY2hlY2tlZC5cbiAqXG4gKiBUbyBjYXB0dXJlIGFuIEFTTi4xIHZhbHVlLCBzZXQgYW4gb2JqZWN0IGluIHRoZSB2YWxpZGF0b3IncyAnY2FwdHVyZSdcbiAqIHBhcmFtZXRlciB0byB0aGUga2V5IHRvIHVzZSBpbiB0aGUgY2FwdHVyZSBtYXAuIFRvIGNhcHR1cmUgdGhlIGZ1bGxcbiAqIEFTTi4xIG9iamVjdCwgc3BlY2lmeSAnY2FwdHVyZUFzbjEnLiBUbyBjYXB0dXJlIEJJVCBTVFJJTkcgYnl0ZXMsIGluY2x1ZGluZ1xuICogdGhlIGxlYWRpbmcgdW51c2VkIGJpdHMgY291bnRlciBieXRlLCBzcGVjaWZ5ICdjYXB0dXJlQml0U3RyaW5nQ29udGVudHMnLlxuICogVG8gY2FwdHVyZSBCSVQgU1RSSU5HIGJ5dGVzLCB3aXRob3V0IHRoZSBsZWFkaW5nIHVudXNlZCBiaXRzIGNvdW50ZXIgYnl0ZSxcbiAqIHNwZWNpZnkgJ2NhcHR1cmVCaXRTdHJpbmdWYWx1ZScuXG4gKlxuICogT2JqZWN0cyBpbiB0aGUgdmFsaWRhdG9yIG1heSBzZXQgYSBmaWVsZCAnb3B0aW9uYWwnIHRvIHRydWUgdG8gaW5kaWNhdGVcbiAqIHRoYXQgaXQgaXNuJ3QgbmVjZXNzYXJ5IHRvIHBhc3MgdmFsaWRhdGlvbi5cbiAqXG4gKiBAcGFyYW0gb2JqIHRoZSBBU04uMSBvYmplY3QgdG8gdmFsaWRhdGUuXG4gKiBAcGFyYW0gdiB0aGUgQVNOLjEgc3RydWN0dXJlIHZhbGlkYXRvci5cbiAqIEBwYXJhbSBjYXB0dXJlIGFuIG9wdGlvbmFsIG1hcCB0byBjYXB0dXJlIHZhbHVlcyBpbi5cbiAqIEBwYXJhbSBlcnJvcnMgYW4gb3B0aW9uYWwgYXJyYXkgZm9yIHN0b3JpbmcgdmFsaWRhdGlvbiBlcnJvcnMuXG4gKlxuICogQHJldHVybiB0cnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIG9uIGZhaWx1cmUuXG4gKi9cbmFzbjEudmFsaWRhdGUgPSBmdW5jdGlvbihvYmosIHYsIGNhcHR1cmUsIGVycm9ycykge1xuICB2YXIgcnZhbCA9IGZhbHNlO1xuXG4gIC8vIGVuc3VyZSB0YWcgY2xhc3MgYW5kIHR5cGUgYXJlIHRoZSBzYW1lIGlmIHNwZWNpZmllZFxuICBpZigob2JqLnRhZ0NsYXNzID09PSB2LnRhZ0NsYXNzIHx8IHR5cGVvZih2LnRhZ0NsYXNzKSA9PT0gJ3VuZGVmaW5lZCcpICYmXG4gICAgKG9iai50eXBlID09PSB2LnR5cGUgfHwgdHlwZW9mKHYudHlwZSkgPT09ICd1bmRlZmluZWQnKSkge1xuICAgIC8vIGVuc3VyZSBjb25zdHJ1Y3RlZCBmbGFnIGlzIHRoZSBzYW1lIGlmIHNwZWNpZmllZFxuICAgIGlmKG9iai5jb25zdHJ1Y3RlZCA9PT0gdi5jb25zdHJ1Y3RlZCB8fFxuICAgICAgdHlwZW9mKHYuY29uc3RydWN0ZWQpID09PSAndW5kZWZpbmVkJykge1xuICAgICAgcnZhbCA9IHRydWU7XG5cbiAgICAgIC8vIGhhbmRsZSBzdWIgdmFsdWVzXG4gICAgICBpZih2LnZhbHVlICYmIGZvcmdlLnV0aWwuaXNBcnJheSh2LnZhbHVlKSkge1xuICAgICAgICB2YXIgaiA9IDA7XG4gICAgICAgIGZvcih2YXIgaSA9IDA7IHJ2YWwgJiYgaSA8IHYudmFsdWUubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICBydmFsID0gdi52YWx1ZVtpXS5vcHRpb25hbCB8fCBmYWxzZTtcbiAgICAgICAgICBpZihvYmoudmFsdWVbal0pIHtcbiAgICAgICAgICAgIHJ2YWwgPSBhc24xLnZhbGlkYXRlKG9iai52YWx1ZVtqXSwgdi52YWx1ZVtpXSwgY2FwdHVyZSwgZXJyb3JzKTtcbiAgICAgICAgICAgIGlmKHJ2YWwpIHtcbiAgICAgICAgICAgICAgKytqO1xuICAgICAgICAgICAgfSBlbHNlIGlmKHYudmFsdWVbaV0ub3B0aW9uYWwpIHtcbiAgICAgICAgICAgICAgcnZhbCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmKCFydmFsICYmIGVycm9ycykge1xuICAgICAgICAgICAgZXJyb3JzLnB1c2goXG4gICAgICAgICAgICAgICdbJyArIHYubmFtZSArICddICcgK1xuICAgICAgICAgICAgICAnVGFnIGNsYXNzIFwiJyArIHYudGFnQ2xhc3MgKyAnXCIsIHR5cGUgXCInICtcbiAgICAgICAgICAgICAgdi50eXBlICsgJ1wiIGV4cGVjdGVkIHZhbHVlIGxlbmd0aCBcIicgK1xuICAgICAgICAgICAgICB2LnZhbHVlLmxlbmd0aCArICdcIiwgZ290IFwiJyArXG4gICAgICAgICAgICAgIG9iai52YWx1ZS5sZW5ndGggKyAnXCInKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYocnZhbCAmJiBjYXB0dXJlKSB7XG4gICAgICAgIGlmKHYuY2FwdHVyZSkge1xuICAgICAgICAgIGNhcHR1cmVbdi5jYXB0dXJlXSA9IG9iai52YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZih2LmNhcHR1cmVBc24xKSB7XG4gICAgICAgICAgY2FwdHVyZVt2LmNhcHR1cmVBc24xXSA9IG9iajtcbiAgICAgICAgfVxuICAgICAgICBpZih2LmNhcHR1cmVCaXRTdHJpbmdDb250ZW50cyAmJiAnYml0U3RyaW5nQ29udGVudHMnIGluIG9iaikge1xuICAgICAgICAgIGNhcHR1cmVbdi5jYXB0dXJlQml0U3RyaW5nQ29udGVudHNdID0gb2JqLmJpdFN0cmluZ0NvbnRlbnRzO1xuICAgICAgICB9XG4gICAgICAgIGlmKHYuY2FwdHVyZUJpdFN0cmluZ1ZhbHVlICYmICdiaXRTdHJpbmdDb250ZW50cycgaW4gb2JqKSB7XG4gICAgICAgICAgdmFyIHZhbHVlO1xuICAgICAgICAgIGlmKG9iai5iaXRTdHJpbmdDb250ZW50cy5sZW5ndGggPCAyKSB7XG4gICAgICAgICAgICBjYXB0dXJlW3YuY2FwdHVyZUJpdFN0cmluZ1ZhbHVlXSA9ICcnO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBGSVhNRTogc3VwcG9ydCB1bnVzZWQgYml0cyB3aXRoIGRhdGEgc2hpZnRpbmdcbiAgICAgICAgICAgIHZhciB1bnVzZWQgPSBvYmouYml0U3RyaW5nQ29udGVudHMuY2hhckNvZGVBdCgwKTtcbiAgICAgICAgICAgIGlmKHVudXNlZCAhPT0gMCkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgJ2NhcHR1cmVCaXRTdHJpbmdWYWx1ZSBvbmx5IHN1cHBvcnRlZCBmb3IgemVybyB1bnVzZWQgYml0cycpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FwdHVyZVt2LmNhcHR1cmVCaXRTdHJpbmdWYWx1ZV0gPSBvYmouYml0U3RyaW5nQ29udGVudHMuc2xpY2UoMSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmKGVycm9ycykge1xuICAgICAgZXJyb3JzLnB1c2goXG4gICAgICAgICdbJyArIHYubmFtZSArICddICcgK1xuICAgICAgICAnRXhwZWN0ZWQgY29uc3RydWN0ZWQgXCInICsgdi5jb25zdHJ1Y3RlZCArICdcIiwgZ290IFwiJyArXG4gICAgICAgIG9iai5jb25zdHJ1Y3RlZCArICdcIicpO1xuICAgIH1cbiAgfSBlbHNlIGlmKGVycm9ycykge1xuICAgIGlmKG9iai50YWdDbGFzcyAhPT0gdi50YWdDbGFzcykge1xuICAgICAgZXJyb3JzLnB1c2goXG4gICAgICAgICdbJyArIHYubmFtZSArICddICcgK1xuICAgICAgICAnRXhwZWN0ZWQgdGFnIGNsYXNzIFwiJyArIHYudGFnQ2xhc3MgKyAnXCIsIGdvdCBcIicgK1xuICAgICAgICBvYmoudGFnQ2xhc3MgKyAnXCInKTtcbiAgICB9XG4gICAgaWYob2JqLnR5cGUgIT09IHYudHlwZSkge1xuICAgICAgZXJyb3JzLnB1c2goXG4gICAgICAgICdbJyArIHYubmFtZSArICddICcgK1xuICAgICAgICAnRXhwZWN0ZWQgdHlwZSBcIicgKyB2LnR5cGUgKyAnXCIsIGdvdCBcIicgKyBvYmoudHlwZSArICdcIicpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcnZhbDtcbn07XG5cbi8vIHJlZ2V4IGZvciB0ZXN0aW5nIGZvciBub24tbGF0aW4gY2hhcmFjdGVyc1xudmFyIF9ub25MYXRpblJlZ2V4ID0gL1teXFxcXHUwMDAwLVxcXFx1MDBmZl0vO1xuXG4vKipcbiAqIFByZXR0eSBwcmludHMgYW4gQVNOLjEgb2JqZWN0IHRvIGEgc3RyaW5nLlxuICpcbiAqIEBwYXJhbSBvYmogdGhlIG9iamVjdCB0byB3cml0ZSBvdXQuXG4gKiBAcGFyYW0gbGV2ZWwgdGhlIGxldmVsIGluIHRoZSB0cmVlLlxuICogQHBhcmFtIGluZGVudGF0aW9uIHRoZSBpbmRlbnRhdGlvbiB0byB1c2UuXG4gKlxuICogQHJldHVybiB0aGUgc3RyaW5nLlxuICovXG5hc24xLnByZXR0eVByaW50ID0gZnVuY3Rpb24ob2JqLCBsZXZlbCwgaW5kZW50YXRpb24pIHtcbiAgdmFyIHJ2YWwgPSAnJztcblxuICAvLyBzZXQgZGVmYXVsdCBsZXZlbCBhbmQgaW5kZW50YXRpb25cbiAgbGV2ZWwgPSBsZXZlbCB8fCAwO1xuICBpbmRlbnRhdGlvbiA9IGluZGVudGF0aW9uIHx8IDI7XG5cbiAgLy8gc3RhcnQgbmV3IGxpbmUgZm9yIGRlZXAgbGV2ZWxzXG4gIGlmKGxldmVsID4gMCkge1xuICAgIHJ2YWwgKz0gJ1xcbic7XG4gIH1cblxuICAvLyBjcmVhdGUgaW5kZW50XG4gIHZhciBpbmRlbnQgPSAnJztcbiAgZm9yKHZhciBpID0gMDsgaSA8IGxldmVsICogaW5kZW50YXRpb247ICsraSkge1xuICAgIGluZGVudCArPSAnICc7XG4gIH1cblxuICAvLyBwcmludCBjbGFzczp0eXBlXG4gIHJ2YWwgKz0gaW5kZW50ICsgJ1RhZzogJztcbiAgc3dpdGNoKG9iai50YWdDbGFzcykge1xuICBjYXNlIGFzbjEuQ2xhc3MuVU5JVkVSU0FMOlxuICAgIHJ2YWwgKz0gJ1VuaXZlcnNhbDonO1xuICAgIGJyZWFrO1xuICBjYXNlIGFzbjEuQ2xhc3MuQVBQTElDQVRJT046XG4gICAgcnZhbCArPSAnQXBwbGljYXRpb246JztcbiAgICBicmVhaztcbiAgY2FzZSBhc24xLkNsYXNzLkNPTlRFWFRfU1BFQ0lGSUM6XG4gICAgcnZhbCArPSAnQ29udGV4dC1TcGVjaWZpYzonO1xuICAgIGJyZWFrO1xuICBjYXNlIGFzbjEuQ2xhc3MuUFJJVkFURTpcbiAgICBydmFsICs9ICdQcml2YXRlOic7XG4gICAgYnJlYWs7XG4gIH1cblxuICBpZihvYmoudGFnQ2xhc3MgPT09IGFzbjEuQ2xhc3MuVU5JVkVSU0FMKSB7XG4gICAgcnZhbCArPSBvYmoudHlwZTtcblxuICAgIC8vIGtub3duIHR5cGVzXG4gICAgc3dpdGNoKG9iai50eXBlKSB7XG4gICAgY2FzZSBhc24xLlR5cGUuTk9ORTpcbiAgICAgIHJ2YWwgKz0gJyAoTm9uZSknO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBhc24xLlR5cGUuQk9PTEVBTjpcbiAgICAgIHJ2YWwgKz0gJyAoQm9vbGVhbiknO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBhc24xLlR5cGUuSU5URUdFUjpcbiAgICAgIHJ2YWwgKz0gJyAoSW50ZWdlciknO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBhc24xLlR5cGUuQklUU1RSSU5HOlxuICAgICAgcnZhbCArPSAnIChCaXQgc3RyaW5nKSc7XG4gICAgICBicmVhaztcbiAgICBjYXNlIGFzbjEuVHlwZS5PQ1RFVFNUUklORzpcbiAgICAgIHJ2YWwgKz0gJyAoT2N0ZXQgc3RyaW5nKSc7XG4gICAgICBicmVhaztcbiAgICBjYXNlIGFzbjEuVHlwZS5OVUxMOlxuICAgICAgcnZhbCArPSAnIChOdWxsKSc7XG4gICAgICBicmVhaztcbiAgICBjYXNlIGFzbjEuVHlwZS5PSUQ6XG4gICAgICBydmFsICs9ICcgKE9iamVjdCBJZGVudGlmaWVyKSc7XG4gICAgICBicmVhaztcbiAgICBjYXNlIGFzbjEuVHlwZS5PREVTQzpcbiAgICAgIHJ2YWwgKz0gJyAoT2JqZWN0IERlc2NyaXB0b3IpJztcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgYXNuMS5UeXBlLkVYVEVSTkFMOlxuICAgICAgcnZhbCArPSAnIChFeHRlcm5hbCBvciBJbnN0YW5jZSBvZiknO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBhc24xLlR5cGUuUkVBTDpcbiAgICAgIHJ2YWwgKz0gJyAoUmVhbCknO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBhc24xLlR5cGUuRU5VTUVSQVRFRDpcbiAgICAgIHJ2YWwgKz0gJyAoRW51bWVyYXRlZCknO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBhc24xLlR5cGUuRU1CRURERUQ6XG4gICAgICBydmFsICs9ICcgKEVtYmVkZGVkIFBEViknO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBhc24xLlR5cGUuVVRGODpcbiAgICAgIHJ2YWwgKz0gJyAoVVRGOCknO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBhc24xLlR5cGUuUk9JRDpcbiAgICAgIHJ2YWwgKz0gJyAoUmVsYXRpdmUgT2JqZWN0IElkZW50aWZpZXIpJztcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgYXNuMS5UeXBlLlNFUVVFTkNFOlxuICAgICAgcnZhbCArPSAnIChTZXF1ZW5jZSknO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBhc24xLlR5cGUuU0VUOlxuICAgICAgcnZhbCArPSAnIChTZXQpJztcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgYXNuMS5UeXBlLlBSSU5UQUJMRVNUUklORzpcbiAgICAgIHJ2YWwgKz0gJyAoUHJpbnRhYmxlIFN0cmluZyknO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBhc24xLlR5cGUuSUE1U3RyaW5nOlxuICAgICAgcnZhbCArPSAnIChJQTVTdHJpbmcgKEFTQ0lJKSknO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBhc24xLlR5cGUuVVRDVElNRTpcbiAgICAgIHJ2YWwgKz0gJyAoVVRDIHRpbWUpJztcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgYXNuMS5UeXBlLkdFTkVSQUxJWkVEVElNRTpcbiAgICAgIHJ2YWwgKz0gJyAoR2VuZXJhbGl6ZWQgdGltZSknO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBhc24xLlR5cGUuQk1QU1RSSU5HOlxuICAgICAgcnZhbCArPSAnIChCTVAgU3RyaW5nKSc7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgcnZhbCArPSBvYmoudHlwZTtcbiAgfVxuXG4gIHJ2YWwgKz0gJ1xcbic7XG4gIHJ2YWwgKz0gaW5kZW50ICsgJ0NvbnN0cnVjdGVkOiAnICsgb2JqLmNvbnN0cnVjdGVkICsgJ1xcbic7XG5cbiAgaWYob2JqLmNvbXBvc2VkKSB7XG4gICAgdmFyIHN1YnZhbHVlcyA9IDA7XG4gICAgdmFyIHN1YiA9ICcnO1xuICAgIGZvcih2YXIgaSA9IDA7IGkgPCBvYmoudmFsdWUubGVuZ3RoOyArK2kpIHtcbiAgICAgIGlmKG9iai52YWx1ZVtpXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHN1YnZhbHVlcyArPSAxO1xuICAgICAgICBzdWIgKz0gYXNuMS5wcmV0dHlQcmludChvYmoudmFsdWVbaV0sIGxldmVsICsgMSwgaW5kZW50YXRpb24pO1xuICAgICAgICBpZigoaSArIDEpIDwgb2JqLnZhbHVlLmxlbmd0aCkge1xuICAgICAgICAgIHN1YiArPSAnLCc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcnZhbCArPSBpbmRlbnQgKyAnU3ViIHZhbHVlczogJyArIHN1YnZhbHVlcyArIHN1YjtcbiAgfSBlbHNlIHtcbiAgICBydmFsICs9IGluZGVudCArICdWYWx1ZTogJztcbiAgICBpZihvYmoudHlwZSA9PT0gYXNuMS5UeXBlLk9JRCkge1xuICAgICAgdmFyIG9pZCA9IGFzbjEuZGVyVG9PaWQob2JqLnZhbHVlKTtcbiAgICAgIHJ2YWwgKz0gb2lkO1xuICAgICAgaWYoZm9yZ2UucGtpICYmIGZvcmdlLnBraS5vaWRzKSB7XG4gICAgICAgIGlmKG9pZCBpbiBmb3JnZS5wa2kub2lkcykge1xuICAgICAgICAgIHJ2YWwgKz0gJyAoJyArIGZvcmdlLnBraS5vaWRzW29pZF0gKyAnKSAnO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmKG9iai50eXBlID09PSBhc24xLlR5cGUuSU5URUdFUikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcnZhbCArPSBhc24xLmRlclRvSW50ZWdlcihvYmoudmFsdWUpO1xuICAgICAgfSBjYXRjaChleCkge1xuICAgICAgICBydmFsICs9ICcweCcgKyBmb3JnZS51dGlsLmJ5dGVzVG9IZXgob2JqLnZhbHVlKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYob2JqLnR5cGUgPT09IGFzbjEuVHlwZS5CSVRTVFJJTkcpIHtcbiAgICAgIC8vIFRPRE86IHNoaWZ0IGJpdHMgYXMgbmVlZGVkIHRvIGRpc3BsYXkgd2l0aG91dCBwYWRkaW5nXG4gICAgICBpZihvYmoudmFsdWUubGVuZ3RoID4gMSkge1xuICAgICAgICAvLyByZW1vdmUgdW51c2VkIGJpdHMgZmllbGRcbiAgICAgICAgcnZhbCArPSAnMHgnICsgZm9yZ2UudXRpbC5ieXRlc1RvSGV4KG9iai52YWx1ZS5zbGljZSgxKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBydmFsICs9ICcobm9uZSknO1xuICAgICAgfVxuICAgICAgLy8gc2hvdyB1bnVzZWQgYml0IGNvdW50XG4gICAgICBpZihvYmoudmFsdWUubGVuZ3RoID4gMCkge1xuICAgICAgICB2YXIgdW51c2VkID0gb2JqLnZhbHVlLmNoYXJDb2RlQXQoMCk7XG4gICAgICAgIGlmKHVudXNlZCA9PSAxKSB7XG4gICAgICAgICAgcnZhbCArPSAnICgxIHVudXNlZCBiaXQgc2hvd24pJztcbiAgICAgICAgfSBlbHNlIGlmKHVudXNlZCA+IDEpIHtcbiAgICAgICAgICBydmFsICs9ICcgKCcgKyB1bnVzZWQgKyAnIHVudXNlZCBiaXRzIHNob3duKSc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYob2JqLnR5cGUgPT09IGFzbjEuVHlwZS5PQ1RFVFNUUklORykge1xuICAgICAgaWYoIV9ub25MYXRpblJlZ2V4LnRlc3Qob2JqLnZhbHVlKSkge1xuICAgICAgICBydmFsICs9ICcoJyArIG9iai52YWx1ZSArICcpICc7XG4gICAgICB9XG4gICAgICBydmFsICs9ICcweCcgKyBmb3JnZS51dGlsLmJ5dGVzVG9IZXgob2JqLnZhbHVlKTtcbiAgICB9IGVsc2UgaWYob2JqLnR5cGUgPT09IGFzbjEuVHlwZS5VVEY4KSB7XG4gICAgICB0cnkge1xuICAgICAgICBydmFsICs9IGZvcmdlLnV0aWwuZGVjb2RlVXRmOChvYmoudmFsdWUpO1xuICAgICAgfSBjYXRjaChlKSB7XG4gICAgICAgIGlmKGUubWVzc2FnZSA9PT0gJ1VSSSBtYWxmb3JtZWQnKSB7XG4gICAgICAgICAgcnZhbCArPVxuICAgICAgICAgICAgJzB4JyArIGZvcmdlLnV0aWwuYnl0ZXNUb0hleChvYmoudmFsdWUpICsgJyAobWFsZm9ybWVkIFVURjgpJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmKG9iai50eXBlID09PSBhc24xLlR5cGUuUFJJTlRBQkxFU1RSSU5HIHx8XG4gICAgICBvYmoudHlwZSA9PT0gYXNuMS5UeXBlLklBNVN0cmluZykge1xuICAgICAgcnZhbCArPSBvYmoudmFsdWU7XG4gICAgfSBlbHNlIGlmKF9ub25MYXRpblJlZ2V4LnRlc3Qob2JqLnZhbHVlKSkge1xuICAgICAgcnZhbCArPSAnMHgnICsgZm9yZ2UudXRpbC5ieXRlc1RvSGV4KG9iai52YWx1ZSk7XG4gICAgfSBlbHNlIGlmKG9iai52YWx1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgIHJ2YWwgKz0gJ1tudWxsXSc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJ2YWwgKz0gb2JqLnZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBydmFsO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///14\n")},function(module,exports,__webpack_require__){"use strict";eval("\n\nfunction checkDCE() {\n  /* global __REACT_DEVTOOLS_GLOBAL_HOOK__ */\n  if (\n    typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ === 'undefined' ||\n    typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE !== 'function'\n  ) {\n    return;\n  }\n  if (false) {}\n  try {\n    // Verify that the code above has been dead code eliminated (DCE'd).\n    __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(checkDCE);\n  } catch (err) {\n    // DevTools shouldn't crash React, no matter what.\n    // We should still report in case we break this code.\n    console.error(err);\n  }\n}\n\nif (true) {\n  // DCE check should happen before ReactDOM bundle executes so that\n  // DevTools can report bad minification during injection.\n  checkDCE();\n  module.exports = __webpack_require__(98);\n} else {}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTUuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtZG9tL2luZGV4LmpzPzhiYzgiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5mdW5jdGlvbiBjaGVja0RDRSgpIHtcbiAgLyogZ2xvYmFsIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyAqL1xuICBpZiAoXG4gICAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyA9PT0gJ3VuZGVmaW5lZCcgfHxcbiAgICB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLmNoZWNrRENFICE9PSAnZnVuY3Rpb24nXG4gICkge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIC8vIFRoaXMgYnJhbmNoIGlzIHVucmVhY2hhYmxlIGJlY2F1c2UgdGhpcyBmdW5jdGlvbiBpcyBvbmx5IGNhbGxlZFxuICAgIC8vIGluIHByb2R1Y3Rpb24sIGJ1dCB0aGUgY29uZGl0aW9uIGlzIHRydWUgb25seSBpbiBkZXZlbG9wbWVudC5cbiAgICAvLyBUaGVyZWZvcmUgaWYgdGhlIGJyYW5jaCBpcyBzdGlsbCBoZXJlLCBkZWFkIGNvZGUgZWxpbWluYXRpb24gd2Fzbid0XG4gICAgLy8gcHJvcGVybHkgYXBwbGllZC5cbiAgICAvLyBEb24ndCBjaGFuZ2UgdGhlIG1lc3NhZ2UuIFJlYWN0IERldlRvb2xzIHJlbGllcyBvbiBpdC4gQWxzbyBtYWtlIHN1cmVcbiAgICAvLyB0aGlzIG1lc3NhZ2UgZG9lc24ndCBvY2N1ciBlbHNld2hlcmUgaW4gdGhpcyBmdW5jdGlvbiwgb3IgaXQgd2lsbCBjYXVzZVxuICAgIC8vIGEgZmFsc2UgcG9zaXRpdmUuXG4gICAgdGhyb3cgbmV3IEVycm9yKCdeX14nKTtcbiAgfVxuICB0cnkge1xuICAgIC8vIFZlcmlmeSB0aGF0IHRoZSBjb2RlIGFib3ZlIGhhcyBiZWVuIGRlYWQgY29kZSBlbGltaW5hdGVkIChEQ0UnZCkuXG4gICAgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLmNoZWNrRENFKGNoZWNrRENFKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgLy8gRGV2VG9vbHMgc2hvdWxkbid0IGNyYXNoIFJlYWN0LCBubyBtYXR0ZXIgd2hhdC5cbiAgICAvLyBXZSBzaG91bGQgc3RpbGwgcmVwb3J0IGluIGNhc2Ugd2UgYnJlYWsgdGhpcyBjb2RlLlxuICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgfVxufVxuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJykge1xuICAvLyBEQ0UgY2hlY2sgc2hvdWxkIGhhcHBlbiBiZWZvcmUgUmVhY3RET00gYnVuZGxlIGV4ZWN1dGVzIHNvIHRoYXRcbiAgLy8gRGV2VG9vbHMgY2FuIHJlcG9ydCBiYWQgbWluaWZpY2F0aW9uIGR1cmluZyBpbmplY3Rpb24uXG4gIGNoZWNrRENFKCk7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvcmVhY3QtZG9tLnByb2R1Y3Rpb24ubWluLmpzJyk7XG59IGVsc2Uge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3JlYWN0LWRvbS5kZXZlbG9wbWVudC5qcycpO1xufVxuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBU0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUVBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///15\n")},function(module,exports){eval("// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things.  But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals.  It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n    throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n    throw new Error('clearTimeout has not been defined');\n}\n(function () {\n    try {\n        if (typeof setTimeout === 'function') {\n            cachedSetTimeout = setTimeout;\n        } else {\n            cachedSetTimeout = defaultSetTimout;\n        }\n    } catch (e) {\n        cachedSetTimeout = defaultSetTimout;\n    }\n    try {\n        if (typeof clearTimeout === 'function') {\n            cachedClearTimeout = clearTimeout;\n        } else {\n            cachedClearTimeout = defaultClearTimeout;\n        }\n    } catch (e) {\n        cachedClearTimeout = defaultClearTimeout;\n    }\n} ())\nfunction runTimeout(fun) {\n    if (cachedSetTimeout === setTimeout) {\n        //normal enviroments in sane situations\n        return setTimeout(fun, 0);\n    }\n    // if setTimeout wasn't available but was latter defined\n    if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n        cachedSetTimeout = setTimeout;\n        return setTimeout(fun, 0);\n    }\n    try {\n        // when when somebody has screwed with setTimeout but no I.E. maddness\n        return cachedSetTimeout(fun, 0);\n    } catch(e){\n        try {\n            // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n            return cachedSetTimeout.call(null, fun, 0);\n        } catch(e){\n            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n            return cachedSetTimeout.call(this, fun, 0);\n        }\n    }\n\n\n}\nfunction runClearTimeout(marker) {\n    if (cachedClearTimeout === clearTimeout) {\n        //normal enviroments in sane situations\n        return clearTimeout(marker);\n    }\n    // if clearTimeout wasn't available but was latter defined\n    if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n        cachedClearTimeout = clearTimeout;\n        return clearTimeout(marker);\n    }\n    try {\n        // when when somebody has screwed with setTimeout but no I.E. maddness\n        return cachedClearTimeout(marker);\n    } catch (e){\n        try {\n            // When we are in I.E. but the script has been evaled so I.E. doesn't  trust the global object when called normally\n            return cachedClearTimeout.call(null, marker);\n        } catch (e){\n            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n            // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n            return cachedClearTimeout.call(this, marker);\n        }\n    }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n    if (!draining || !currentQueue) {\n        return;\n    }\n    draining = false;\n    if (currentQueue.length) {\n        queue = currentQueue.concat(queue);\n    } else {\n        queueIndex = -1;\n    }\n    if (queue.length) {\n        drainQueue();\n    }\n}\n\nfunction drainQueue() {\n    if (draining) {\n        return;\n    }\n    var timeout = runTimeout(cleanUpNextTick);\n    draining = true;\n\n    var len = queue.length;\n    while(len) {\n        currentQueue = queue;\n        queue = [];\n        while (++queueIndex < len) {\n            if (currentQueue) {\n                currentQueue[queueIndex].run();\n            }\n        }\n        queueIndex = -1;\n        len = queue.length;\n    }\n    currentQueue = null;\n    draining = false;\n    runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n    var args = new Array(arguments.length - 1);\n    if (arguments.length > 1) {\n        for (var i = 1; i < arguments.length; i++) {\n            args[i - 1] = arguments[i];\n        }\n    }\n    queue.push(new Item(fun, args));\n    if (queue.length === 1 && !draining) {\n        runTimeout(drainQueue);\n    }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n    this.fun = fun;\n    this.array = array;\n}\nItem.prototype.run = function () {\n    this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\nprocess.prependListener = noop;\nprocess.prependOnceListener = noop;\n\nprocess.listeners = function (name) { return [] }\n\nprocess.binding = function (name) {\n    throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n    throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTYuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcHJvY2Vzcy9icm93c2VyLmpzP2YyOGMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gc2hpbSBmb3IgdXNpbmcgcHJvY2VzcyBpbiBicm93c2VyXG52YXIgcHJvY2VzcyA9IG1vZHVsZS5leHBvcnRzID0ge307XG5cbi8vIGNhY2hlZCBmcm9tIHdoYXRldmVyIGdsb2JhbCBpcyBwcmVzZW50IHNvIHRoYXQgdGVzdCBydW5uZXJzIHRoYXQgc3R1YiBpdFxuLy8gZG9uJ3QgYnJlYWsgdGhpbmdzLiAgQnV0IHdlIG5lZWQgdG8gd3JhcCBpdCBpbiBhIHRyeSBjYXRjaCBpbiBjYXNlIGl0IGlzXG4vLyB3cmFwcGVkIGluIHN0cmljdCBtb2RlIGNvZGUgd2hpY2ggZG9lc24ndCBkZWZpbmUgYW55IGdsb2JhbHMuICBJdCdzIGluc2lkZSBhXG4vLyBmdW5jdGlvbiBiZWNhdXNlIHRyeS9jYXRjaGVzIGRlb3B0aW1pemUgaW4gY2VydGFpbiBlbmdpbmVzLlxuXG52YXIgY2FjaGVkU2V0VGltZW91dDtcbnZhciBjYWNoZWRDbGVhclRpbWVvdXQ7XG5cbmZ1bmN0aW9uIGRlZmF1bHRTZXRUaW1vdXQoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdzZXRUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG59XG5mdW5jdGlvbiBkZWZhdWx0Q2xlYXJUaW1lb3V0ICgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2NsZWFyVGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCcpO1xufVxuKGZ1bmN0aW9uICgpIHtcbiAgICB0cnkge1xuICAgICAgICBpZiAodHlwZW9mIHNldFRpbWVvdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBzZXRUaW1lb3V0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IGRlZmF1bHRTZXRUaW1vdXQ7XG4gICAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBkZWZhdWx0U2V0VGltb3V0O1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICBpZiAodHlwZW9mIGNsZWFyVGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gY2xlYXJUaW1lb3V0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gZGVmYXVsdENsZWFyVGltZW91dDtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gZGVmYXVsdENsZWFyVGltZW91dDtcbiAgICB9XG59ICgpKVxuZnVuY3Rpb24gcnVuVGltZW91dChmdW4pIHtcbiAgICBpZiAoY2FjaGVkU2V0VGltZW91dCA9PT0gc2V0VGltZW91dCkge1xuICAgICAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9XG4gICAgLy8gaWYgc2V0VGltZW91dCB3YXNuJ3QgYXZhaWxhYmxlIGJ1dCB3YXMgbGF0dGVyIGRlZmluZWRcbiAgICBpZiAoKGNhY2hlZFNldFRpbWVvdXQgPT09IGRlZmF1bHRTZXRUaW1vdXQgfHwgIWNhY2hlZFNldFRpbWVvdXQpICYmIHNldFRpbWVvdXQpIHtcbiAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG4gICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIC8vIHdoZW4gd2hlbiBzb21lYm9keSBoYXMgc2NyZXdlZCB3aXRoIHNldFRpbWVvdXQgYnV0IG5vIEkuRS4gbWFkZG5lc3NcbiAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9IGNhdGNoKGUpe1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gV2hlbiB3ZSBhcmUgaW4gSS5FLiBidXQgdGhlIHNjcmlwdCBoYXMgYmVlbiBldmFsZWQgc28gSS5FLiBkb2Vzbid0IHRydXN0IHRoZSBnbG9iYWwgb2JqZWN0IHdoZW4gY2FsbGVkIG5vcm1hbGx5XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKG51bGwsIGZ1biwgMCk7XG4gICAgICAgIH0gY2F0Y2goZSl7XG4gICAgICAgICAgICAvLyBzYW1lIGFzIGFib3ZlIGJ1dCB3aGVuIGl0J3MgYSB2ZXJzaW9uIG9mIEkuRS4gdGhhdCBtdXN0IGhhdmUgdGhlIGdsb2JhbCBvYmplY3QgZm9yICd0aGlzJywgaG9wZnVsbHkgb3VyIGNvbnRleHQgY29ycmVjdCBvdGhlcndpc2UgaXQgd2lsbCB0aHJvdyBhIGdsb2JhbCBlcnJvclxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQuY2FsbCh0aGlzLCBmdW4sIDApO1xuICAgICAgICB9XG4gICAgfVxuXG5cbn1cbmZ1bmN0aW9uIHJ1bkNsZWFyVGltZW91dChtYXJrZXIpIHtcbiAgICBpZiAoY2FjaGVkQ2xlYXJUaW1lb3V0ID09PSBjbGVhclRpbWVvdXQpIHtcbiAgICAgICAgLy9ub3JtYWwgZW52aXJvbWVudHMgaW4gc2FuZSBzaXR1YXRpb25zXG4gICAgICAgIHJldHVybiBjbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9XG4gICAgLy8gaWYgY2xlYXJUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuICAgIGlmICgoY2FjaGVkQ2xlYXJUaW1lb3V0ID09PSBkZWZhdWx0Q2xlYXJUaW1lb3V0IHx8ICFjYWNoZWRDbGVhclRpbWVvdXQpICYmIGNsZWFyVGltZW91dCkge1xuICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG4gICAgICAgIHJldHVybiBjbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfSBjYXRjaCAoZSl7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgIHRydXN0IHRoZSBnbG9iYWwgb2JqZWN0IHdoZW4gY2FsbGVkIG5vcm1hbGx5XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0LmNhbGwobnVsbCwgbWFya2VyKTtcbiAgICAgICAgfSBjYXRjaCAoZSl7XG4gICAgICAgICAgICAvLyBzYW1lIGFzIGFib3ZlIGJ1dCB3aGVuIGl0J3MgYSB2ZXJzaW9uIG9mIEkuRS4gdGhhdCBtdXN0IGhhdmUgdGhlIGdsb2JhbCBvYmplY3QgZm9yICd0aGlzJywgaG9wZnVsbHkgb3VyIGNvbnRleHQgY29ycmVjdCBvdGhlcndpc2UgaXQgd2lsbCB0aHJvdyBhIGdsb2JhbCBlcnJvci5cbiAgICAgICAgICAgIC8vIFNvbWUgdmVyc2lvbnMgb2YgSS5FLiBoYXZlIGRpZmZlcmVudCBydWxlcyBmb3IgY2xlYXJUaW1lb3V0IHZzIHNldFRpbWVvdXRcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbCh0aGlzLCBtYXJrZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG5cblxufVxudmFyIHF1ZXVlID0gW107XG52YXIgZHJhaW5pbmcgPSBmYWxzZTtcbnZhciBjdXJyZW50UXVldWU7XG52YXIgcXVldWVJbmRleCA9IC0xO1xuXG5mdW5jdGlvbiBjbGVhblVwTmV4dFRpY2soKSB7XG4gICAgaWYgKCFkcmFpbmluZyB8fCAhY3VycmVudFF1ZXVlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBpZiAoY3VycmVudFF1ZXVlLmxlbmd0aCkge1xuICAgICAgICBxdWV1ZSA9IGN1cnJlbnRRdWV1ZS5jb25jYXQocXVldWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHF1ZXVlSW5kZXggPSAtMTtcbiAgICB9XG4gICAgaWYgKHF1ZXVlLmxlbmd0aCkge1xuICAgICAgICBkcmFpblF1ZXVlKCk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBkcmFpblF1ZXVlKCkge1xuICAgIGlmIChkcmFpbmluZykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciB0aW1lb3V0ID0gcnVuVGltZW91dChjbGVhblVwTmV4dFRpY2spO1xuICAgIGRyYWluaW5nID0gdHJ1ZTtcblxuICAgIHZhciBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgd2hpbGUobGVuKSB7XG4gICAgICAgIGN1cnJlbnRRdWV1ZSA9IHF1ZXVlO1xuICAgICAgICBxdWV1ZSA9IFtdO1xuICAgICAgICB3aGlsZSAoKytxdWV1ZUluZGV4IDwgbGVuKSB7XG4gICAgICAgICAgICBpZiAoY3VycmVudFF1ZXVlKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudFF1ZXVlW3F1ZXVlSW5kZXhdLnJ1bigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHF1ZXVlSW5kZXggPSAtMTtcbiAgICAgICAgbGVuID0gcXVldWUubGVuZ3RoO1xuICAgIH1cbiAgICBjdXJyZW50UXVldWUgPSBudWxsO1xuICAgIGRyYWluaW5nID0gZmFsc2U7XG4gICAgcnVuQ2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xufVxuXG5wcm9jZXNzLm5leHRUaWNrID0gZnVuY3Rpb24gKGZ1bikge1xuICAgIHZhciBhcmdzID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGggLSAxKTtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGFyZ3NbaSAtIDFdID0gYXJndW1lbnRzW2ldO1xuICAgICAgICB9XG4gICAgfVxuICAgIHF1ZXVlLnB1c2gobmV3IEl0ZW0oZnVuLCBhcmdzKSk7XG4gICAgaWYgKHF1ZXVlLmxlbmd0aCA9PT0gMSAmJiAhZHJhaW5pbmcpIHtcbiAgICAgICAgcnVuVGltZW91dChkcmFpblF1ZXVlKTtcbiAgICB9XG59O1xuXG4vLyB2OCBsaWtlcyBwcmVkaWN0aWJsZSBvYmplY3RzXG5mdW5jdGlvbiBJdGVtKGZ1biwgYXJyYXkpIHtcbiAgICB0aGlzLmZ1biA9IGZ1bjtcbiAgICB0aGlzLmFycmF5ID0gYXJyYXk7XG59XG5JdGVtLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5mdW4uYXBwbHkobnVsbCwgdGhpcy5hcnJheSk7XG59O1xucHJvY2Vzcy50aXRsZSA9ICdicm93c2VyJztcbnByb2Nlc3MuYnJvd3NlciA9IHRydWU7XG5wcm9jZXNzLmVudiA9IHt9O1xucHJvY2Vzcy5hcmd2ID0gW107XG5wcm9jZXNzLnZlcnNpb24gPSAnJzsgLy8gZW1wdHkgc3RyaW5nIHRvIGF2b2lkIHJlZ2V4cCBpc3N1ZXNcbnByb2Nlc3MudmVyc2lvbnMgPSB7fTtcblxuZnVuY3Rpb24gbm9vcCgpIHt9XG5cbnByb2Nlc3Mub24gPSBub29wO1xucHJvY2Vzcy5hZGRMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLm9uY2UgPSBub29wO1xucHJvY2Vzcy5vZmYgPSBub29wO1xucHJvY2Vzcy5yZW1vdmVMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUFsbExpc3RlbmVycyA9IG5vb3A7XG5wcm9jZXNzLmVtaXQgPSBub29wO1xucHJvY2Vzcy5wcmVwZW5kTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5wcmVwZW5kT25jZUxpc3RlbmVyID0gbm9vcDtcblxucHJvY2Vzcy5saXN0ZW5lcnMgPSBmdW5jdGlvbiAobmFtZSkgeyByZXR1cm4gW10gfVxuXG5wcm9jZXNzLmJpbmRpbmcgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5iaW5kaW5nIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5cbnByb2Nlc3MuY3dkID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gJy8nIH07XG5wcm9jZXNzLmNoZGlyID0gZnVuY3Rpb24gKGRpcikge1xuICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5jaGRpciBpcyBub3Qgc3VwcG9ydGVkJyk7XG59O1xucHJvY2Vzcy51bWFzayA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gMDsgfTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///16\n")},function(module,exports,__webpack_require__){eval("/**\n * Node.js module for Forge message digests.\n *\n * @author Dave Longley\n *\n * Copyright 2011-2017 Digital Bazaar, Inc.\n */\nvar forge = __webpack_require__(4);\n\nmodule.exports = forge.md = forge.md || {};\nforge.md.algorithms = forge.md.algorithms || {};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTcuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbm9kZS1mb3JnZS9saWIvbWQuanM/ZWI5ZCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIE5vZGUuanMgbW9kdWxlIGZvciBGb3JnZSBtZXNzYWdlIGRpZ2VzdHMuXG4gKlxuICogQGF1dGhvciBEYXZlIExvbmdsZXlcbiAqXG4gKiBDb3B5cmlnaHQgMjAxMS0yMDE3IERpZ2l0YWwgQmF6YWFyLCBJbmMuXG4gKi9cbnZhciBmb3JnZSA9IHJlcXVpcmUoJy4vZm9yZ2UnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmb3JnZS5tZCA9IGZvcmdlLm1kIHx8IHt9O1xuZm9yZ2UubWQuYWxnb3JpdGhtcyA9IGZvcmdlLm1kLmFsZ29yaXRobXMgfHwge307XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///17\n")},function(module,exports){eval('module.exports = require("photoshop");//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTguanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJwaG90b3Nob3BcIj83YzZmIl0sInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInBob3Rvc2hvcFwiKTsiXSwibWFwcGluZ3MiOiJBQUFBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///18\n')},function(module,__webpack_exports__,__webpack_require__){"use strict";eval('/* WEBPACK VAR INJECTION */(function(Buffer) {/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1);\n/* harmony import */ var _core_AxiosError_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(3);\n/* harmony import */ var _platform_node_classes_FormData_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(45);\n\n\n\n\n// temporary hotfix to avoid circular references until AxiosURLSearchParams is refactored\n\n\n/**\n * Determines if the given thing is a array or js object.\n *\n * @param {string} thing - The object or array to be visited.\n *\n * @returns {boolean}\n */\nfunction isVisitable(thing) {\n  return _utils_js__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"].isPlainObject(thing) || _utils_js__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"].isArray(thing);\n}\n\n/**\n * It removes the brackets from the end of a string\n *\n * @param {string} key - The key of the parameter.\n *\n * @returns {string} the key without the brackets.\n */\nfunction removeBrackets(key) {\n  return _utils_js__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"].endsWith(key, \'[]\') ? key.slice(0, -2) : key;\n}\n\n/**\n * It takes a path, a key, and a boolean, and returns a string\n *\n * @param {string} path - The path to the current key.\n * @param {string} key - The key of the current object being iterated over.\n * @param {string} dots - If true, the key will be rendered with dots instead of brackets.\n *\n * @returns {string} The path to the current key.\n */\nfunction renderKey(path, key, dots) {\n  if (!path) return key;\n  return path.concat(key).map(function each(token, i) {\n    // eslint-disable-next-line no-param-reassign\n    token = removeBrackets(token);\n    return !dots && i ? \'[\' + token + \']\' : token;\n  }).join(dots ? \'.\' : \'\');\n}\n\n/**\n * If the array is an array and none of its elements are visitable, then it\'s a flat array.\n *\n * @param {Array<any>} arr - The array to check\n *\n * @returns {boolean}\n */\nfunction isFlatArray(arr) {\n  return _utils_js__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"].isArray(arr) && !arr.some(isVisitable);\n}\n\nconst predicates = _utils_js__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"].toFlatObject(_utils_js__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"], {}, null, function filter(prop) {\n  return /^is[A-Z]/.test(prop);\n});\n\n/**\n * Convert a data object to FormData\n *\n * @param {Object} obj\n * @param {?Object} [formData]\n * @param {?Object} [options]\n * @param {Function} [options.visitor]\n * @param {Boolean} [options.metaTokens = true]\n * @param {Boolean} [options.dots = false]\n * @param {?Boolean} [options.indexes = false]\n *\n * @returns {Object}\n **/\n\n/**\n * It converts an object into a FormData object\n *\n * @param {Object<any, any>} obj - The object to convert to form data.\n * @param {string} formData - The FormData object to append to.\n * @param {Object<string, any>} options\n *\n * @returns\n */\nfunction toFormData(obj, formData, options) {\n  if (!_utils_js__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"].isObject(obj)) {\n    throw new TypeError(\'target must be an object\');\n  }\n\n  // eslint-disable-next-line no-param-reassign\n  formData = formData || new (_platform_node_classes_FormData_js__WEBPACK_IMPORTED_MODULE_2__[/* default */ "a"] || FormData)();\n\n  // eslint-disable-next-line no-param-reassign\n  options = _utils_js__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"].toFlatObject(options, {\n    metaTokens: true,\n    dots: false,\n    indexes: false\n  }, false, function defined(option, source) {\n    // eslint-disable-next-line no-eq-null,eqeqeq\n    return !_utils_js__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"].isUndefined(source[option]);\n  });\n\n  const metaTokens = options.metaTokens;\n  // eslint-disable-next-line no-use-before-define\n  const visitor = options.visitor || defaultVisitor;\n  const dots = options.dots;\n  const indexes = options.indexes;\n  const _Blob = options.Blob || typeof Blob !== \'undefined\' && Blob;\n  const useBlob = _Blob && _utils_js__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"].isSpecCompliantForm(formData);\n\n  if (!_utils_js__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"].isFunction(visitor)) {\n    throw new TypeError(\'visitor must be a function\');\n  }\n\n  function convertValue(value) {\n    if (value === null) return \'\';\n\n    if (_utils_js__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"].isDate(value)) {\n      return value.toISOString();\n    }\n\n    if (!useBlob && _utils_js__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"].isBlob(value)) {\n      throw new _core_AxiosError_js__WEBPACK_IMPORTED_MODULE_1__[/* default */ "a"](\'Blob is not supported. Use a Buffer instead.\');\n    }\n\n    if (_utils_js__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"].isArrayBuffer(value) || _utils_js__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"].isTypedArray(value)) {\n      return useBlob && typeof Blob === \'function\' ? new Blob([value]) : Buffer.from(value);\n    }\n\n    return value;\n  }\n\n  /**\n   * Default visitor.\n   *\n   * @param {*} value\n   * @param {String|Number} key\n   * @param {Array<String|Number>} path\n   * @this {FormData}\n   *\n   * @returns {boolean} return true to visit the each prop of the value recursively\n   */\n  function defaultVisitor(value, key, path) {\n    let arr = value;\n\n    if (value && !path && typeof value === \'object\') {\n      if (_utils_js__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"].endsWith(key, \'{}\')) {\n        // eslint-disable-next-line no-param-reassign\n        key = metaTokens ? key : key.slice(0, -2);\n        // eslint-disable-next-line no-param-reassign\n        value = JSON.stringify(value);\n      } else if (\n        (_utils_js__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"].isArray(value) && isFlatArray(value)) ||\n        ((_utils_js__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"].isFileList(value) || _utils_js__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"].endsWith(key, \'[]\')) && (arr = _utils_js__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"].toArray(value))\n        )) {\n        // eslint-disable-next-line no-param-reassign\n        key = removeBrackets(key);\n\n        arr.forEach(function each(el, index) {\n          !(_utils_js__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"].isUndefined(el) || el === null) && formData.append(\n            // eslint-disable-next-line no-nested-ternary\n            indexes === true ? renderKey([key], index, dots) : (indexes === null ? key : key + \'[]\'),\n            convertValue(el)\n          );\n        });\n        return false;\n      }\n    }\n\n    if (isVisitable(value)) {\n      return true;\n    }\n\n    formData.append(renderKey(path, key, dots), convertValue(value));\n\n    return false;\n  }\n\n  const stack = [];\n\n  const exposedHelpers = Object.assign(predicates, {\n    defaultVisitor,\n    convertValue,\n    isVisitable\n  });\n\n  function build(value, path) {\n    if (_utils_js__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"].isUndefined(value)) return;\n\n    if (stack.indexOf(value) !== -1) {\n      throw Error(\'Circular reference detected in \' + path.join(\'.\'));\n    }\n\n    stack.push(value);\n\n    _utils_js__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"].forEach(value, function each(el, key) {\n      const result = !(_utils_js__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"].isUndefined(el) || el === null) && visitor.call(\n        formData, el, _utils_js__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"].isString(key) ? key.trim() : key, path, exposedHelpers\n      );\n\n      if (result === true) {\n        build(el, path ? path.concat(key) : [key]);\n      }\n    });\n\n    stack.pop();\n  }\n\n  if (!_utils_js__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"].isObject(obj)) {\n    throw new TypeError(\'data must be an object\');\n  }\n\n  build(obj);\n\n  return formData;\n}\n\n/* harmony default export */ __webpack_exports__["a"] = (toFormData);\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(30).Buffer))//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTkuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvdG9Gb3JtRGF0YS5qcz9lNDY3Il0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IHV0aWxzIGZyb20gJy4uL3V0aWxzLmpzJztcbmltcG9ydCBBeGlvc0Vycm9yIGZyb20gJy4uL2NvcmUvQXhpb3NFcnJvci5qcyc7XG4vLyB0ZW1wb3JhcnkgaG90Zml4IHRvIGF2b2lkIGNpcmN1bGFyIHJlZmVyZW5jZXMgdW50aWwgQXhpb3NVUkxTZWFyY2hQYXJhbXMgaXMgcmVmYWN0b3JlZFxuaW1wb3J0IFBsYXRmb3JtRm9ybURhdGEgZnJvbSAnLi4vcGxhdGZvcm0vbm9kZS9jbGFzc2VzL0Zvcm1EYXRhLmpzJztcblxuLyoqXG4gKiBEZXRlcm1pbmVzIGlmIHRoZSBnaXZlbiB0aGluZyBpcyBhIGFycmF5IG9yIGpzIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdGhpbmcgLSBUaGUgb2JqZWN0IG9yIGFycmF5IHRvIGJlIHZpc2l0ZWQuXG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGlzVmlzaXRhYmxlKHRoaW5nKSB7XG4gIHJldHVybiB1dGlscy5pc1BsYWluT2JqZWN0KHRoaW5nKSB8fCB1dGlscy5pc0FycmF5KHRoaW5nKTtcbn1cblxuLyoqXG4gKiBJdCByZW1vdmVzIHRoZSBicmFja2V0cyBmcm9tIHRoZSBlbmQgb2YgYSBzdHJpbmdcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIGtleSBvZiB0aGUgcGFyYW1ldGVyLlxuICpcbiAqIEByZXR1cm5zIHtzdHJpbmd9IHRoZSBrZXkgd2l0aG91dCB0aGUgYnJhY2tldHMuXG4gKi9cbmZ1bmN0aW9uIHJlbW92ZUJyYWNrZXRzKGtleSkge1xuICByZXR1cm4gdXRpbHMuZW5kc1dpdGgoa2V5LCAnW10nKSA/IGtleS5zbGljZSgwLCAtMikgOiBrZXk7XG59XG5cbi8qKlxuICogSXQgdGFrZXMgYSBwYXRoLCBhIGtleSwgYW5kIGEgYm9vbGVhbiwgYW5kIHJldHVybnMgYSBzdHJpbmdcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aCAtIFRoZSBwYXRoIHRvIHRoZSBjdXJyZW50IGtleS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUga2V5IG9mIHRoZSBjdXJyZW50IG9iamVjdCBiZWluZyBpdGVyYXRlZCBvdmVyLlxuICogQHBhcmFtIHtzdHJpbmd9IGRvdHMgLSBJZiB0cnVlLCB0aGUga2V5IHdpbGwgYmUgcmVuZGVyZWQgd2l0aCBkb3RzIGluc3RlYWQgb2YgYnJhY2tldHMuXG4gKlxuICogQHJldHVybnMge3N0cmluZ30gVGhlIHBhdGggdG8gdGhlIGN1cnJlbnQga2V5LlxuICovXG5mdW5jdGlvbiByZW5kZXJLZXkocGF0aCwga2V5LCBkb3RzKSB7XG4gIGlmICghcGF0aCkgcmV0dXJuIGtleTtcbiAgcmV0dXJuIHBhdGguY29uY2F0KGtleSkubWFwKGZ1bmN0aW9uIGVhY2godG9rZW4sIGkpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICB0b2tlbiA9IHJlbW92ZUJyYWNrZXRzKHRva2VuKTtcbiAgICByZXR1cm4gIWRvdHMgJiYgaSA/ICdbJyArIHRva2VuICsgJ10nIDogdG9rZW47XG4gIH0pLmpvaW4oZG90cyA/ICcuJyA6ICcnKTtcbn1cblxuLyoqXG4gKiBJZiB0aGUgYXJyYXkgaXMgYW4gYXJyYXkgYW5kIG5vbmUgb2YgaXRzIGVsZW1lbnRzIGFyZSB2aXNpdGFibGUsIHRoZW4gaXQncyBhIGZsYXQgYXJyYXkuXG4gKlxuICogQHBhcmFtIHtBcnJheTxhbnk+fSBhcnIgLSBUaGUgYXJyYXkgdG8gY2hlY2tcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaXNGbGF0QXJyYXkoYXJyKSB7XG4gIHJldHVybiB1dGlscy5pc0FycmF5KGFycikgJiYgIWFyci5zb21lKGlzVmlzaXRhYmxlKTtcbn1cblxuY29uc3QgcHJlZGljYXRlcyA9IHV0aWxzLnRvRmxhdE9iamVjdCh1dGlscywge30sIG51bGwsIGZ1bmN0aW9uIGZpbHRlcihwcm9wKSB7XG4gIHJldHVybiAvXmlzW0EtWl0vLnRlc3QocHJvcCk7XG59KTtcblxuLyoqXG4gKiBDb252ZXJ0IGEgZGF0YSBvYmplY3QgdG8gRm9ybURhdGFcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqXG4gKiBAcGFyYW0gez9PYmplY3R9IFtmb3JtRGF0YV1cbiAqIEBwYXJhbSB7P09iamVjdH0gW29wdGlvbnNdXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0aW9ucy52aXNpdG9yXVxuICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5tZXRhVG9rZW5zID0gdHJ1ZV1cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuZG90cyA9IGZhbHNlXVxuICogQHBhcmFtIHs/Qm9vbGVhbn0gW29wdGlvbnMuaW5kZXhlcyA9IGZhbHNlXVxuICpcbiAqIEByZXR1cm5zIHtPYmplY3R9XG4gKiovXG5cbi8qKlxuICogSXQgY29udmVydHMgYW4gb2JqZWN0IGludG8gYSBGb3JtRGF0YSBvYmplY3RcbiAqXG4gKiBAcGFyYW0ge09iamVjdDxhbnksIGFueT59IG9iaiAtIFRoZSBvYmplY3QgdG8gY29udmVydCB0byBmb3JtIGRhdGEuXG4gKiBAcGFyYW0ge3N0cmluZ30gZm9ybURhdGEgLSBUaGUgRm9ybURhdGEgb2JqZWN0IHRvIGFwcGVuZCB0by5cbiAqIEBwYXJhbSB7T2JqZWN0PHN0cmluZywgYW55Pn0gb3B0aW9uc1xuICpcbiAqIEByZXR1cm5zXG4gKi9cbmZ1bmN0aW9uIHRvRm9ybURhdGEob2JqLCBmb3JtRGF0YSwgb3B0aW9ucykge1xuICBpZiAoIXV0aWxzLmlzT2JqZWN0KG9iaikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCd0YXJnZXQgbXVzdCBiZSBhbiBvYmplY3QnKTtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICBmb3JtRGF0YSA9IGZvcm1EYXRhIHx8IG5ldyAoUGxhdGZvcm1Gb3JtRGF0YSB8fCBGb3JtRGF0YSkoKTtcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgb3B0aW9ucyA9IHV0aWxzLnRvRmxhdE9iamVjdChvcHRpb25zLCB7XG4gICAgbWV0YVRva2VuczogdHJ1ZSxcbiAgICBkb3RzOiBmYWxzZSxcbiAgICBpbmRleGVzOiBmYWxzZVxuICB9LCBmYWxzZSwgZnVuY3Rpb24gZGVmaW5lZChvcHRpb24sIHNvdXJjZSkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1lcS1udWxsLGVxZXFlcVxuICAgIHJldHVybiAhdXRpbHMuaXNVbmRlZmluZWQoc291cmNlW29wdGlvbl0pO1xuICB9KTtcblxuICBjb25zdCBtZXRhVG9rZW5zID0gb3B0aW9ucy5tZXRhVG9rZW5zO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmVcbiAgY29uc3QgdmlzaXRvciA9IG9wdGlvbnMudmlzaXRvciB8fCBkZWZhdWx0VmlzaXRvcjtcbiAgY29uc3QgZG90cyA9IG9wdGlvbnMuZG90cztcbiAgY29uc3QgaW5kZXhlcyA9IG9wdGlvbnMuaW5kZXhlcztcbiAgY29uc3QgX0Jsb2IgPSBvcHRpb25zLkJsb2IgfHwgdHlwZW9mIEJsb2IgIT09ICd1bmRlZmluZWQnICYmIEJsb2I7XG4gIGNvbnN0IHVzZUJsb2IgPSBfQmxvYiAmJiB1dGlscy5pc1NwZWNDb21wbGlhbnRGb3JtKGZvcm1EYXRhKTtcblxuICBpZiAoIXV0aWxzLmlzRnVuY3Rpb24odmlzaXRvcikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCd2aXNpdG9yIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICB9XG5cbiAgZnVuY3Rpb24gY29udmVydFZhbHVlKHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlID09PSBudWxsKSByZXR1cm4gJyc7XG5cbiAgICBpZiAodXRpbHMuaXNEYXRlKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHZhbHVlLnRvSVNPU3RyaW5nKCk7XG4gICAgfVxuXG4gICAgaWYgKCF1c2VCbG9iICYmIHV0aWxzLmlzQmxvYih2YWx1ZSkpIHtcbiAgICAgIHRocm93IG5ldyBBeGlvc0Vycm9yKCdCbG9iIGlzIG5vdCBzdXBwb3J0ZWQuIFVzZSBhIEJ1ZmZlciBpbnN0ZWFkLicpO1xuICAgIH1cblxuICAgIGlmICh1dGlscy5pc0FycmF5QnVmZmVyKHZhbHVlKSB8fCB1dGlscy5pc1R5cGVkQXJyYXkodmFsdWUpKSB7XG4gICAgICByZXR1cm4gdXNlQmxvYiAmJiB0eXBlb2YgQmxvYiA9PT0gJ2Z1bmN0aW9uJyA/IG5ldyBCbG9iKFt2YWx1ZV0pIDogQnVmZmVyLmZyb20odmFsdWUpO1xuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWZhdWx0IHZpc2l0b3IuXG4gICAqXG4gICAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAgICogQHBhcmFtIHtTdHJpbmd8TnVtYmVyfSBrZXlcbiAgICogQHBhcmFtIHtBcnJheTxTdHJpbmd8TnVtYmVyPn0gcGF0aFxuICAgKiBAdGhpcyB7Rm9ybURhdGF9XG4gICAqXG4gICAqIEByZXR1cm5zIHtib29sZWFufSByZXR1cm4gdHJ1ZSB0byB2aXNpdCB0aGUgZWFjaCBwcm9wIG9mIHRoZSB2YWx1ZSByZWN1cnNpdmVseVxuICAgKi9cbiAgZnVuY3Rpb24gZGVmYXVsdFZpc2l0b3IodmFsdWUsIGtleSwgcGF0aCkge1xuICAgIGxldCBhcnIgPSB2YWx1ZTtcblxuICAgIGlmICh2YWx1ZSAmJiAhcGF0aCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICBpZiAodXRpbHMuZW5kc1dpdGgoa2V5LCAne30nKSkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgICAga2V5ID0gbWV0YVRva2VucyA/IGtleSA6IGtleS5zbGljZSgwLCAtMik7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICB2YWx1ZSA9IEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICh1dGlscy5pc0FycmF5KHZhbHVlKSAmJiBpc0ZsYXRBcnJheSh2YWx1ZSkpIHx8XG4gICAgICAgICgodXRpbHMuaXNGaWxlTGlzdCh2YWx1ZSkgfHwgdXRpbHMuZW5kc1dpdGgoa2V5LCAnW10nKSkgJiYgKGFyciA9IHV0aWxzLnRvQXJyYXkodmFsdWUpKVxuICAgICAgICApKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICBrZXkgPSByZW1vdmVCcmFja2V0cyhrZXkpO1xuXG4gICAgICAgIGFyci5mb3JFYWNoKGZ1bmN0aW9uIGVhY2goZWwsIGluZGV4KSB7XG4gICAgICAgICAgISh1dGlscy5pc1VuZGVmaW5lZChlbCkgfHwgZWwgPT09IG51bGwpICYmIGZvcm1EYXRhLmFwcGVuZChcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXN0ZWQtdGVybmFyeVxuICAgICAgICAgICAgaW5kZXhlcyA9PT0gdHJ1ZSA/IHJlbmRlcktleShba2V5XSwgaW5kZXgsIGRvdHMpIDogKGluZGV4ZXMgPT09IG51bGwgPyBrZXkgOiBrZXkgKyAnW10nKSxcbiAgICAgICAgICAgIGNvbnZlcnRWYWx1ZShlbClcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChpc1Zpc2l0YWJsZSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGZvcm1EYXRhLmFwcGVuZChyZW5kZXJLZXkocGF0aCwga2V5LCBkb3RzKSwgY29udmVydFZhbHVlKHZhbHVlKSk7XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBzdGFjayA9IFtdO1xuXG4gIGNvbnN0IGV4cG9zZWRIZWxwZXJzID0gT2JqZWN0LmFzc2lnbihwcmVkaWNhdGVzLCB7XG4gICAgZGVmYXVsdFZpc2l0b3IsXG4gICAgY29udmVydFZhbHVlLFxuICAgIGlzVmlzaXRhYmxlXG4gIH0pO1xuXG4gIGZ1bmN0aW9uIGJ1aWxkKHZhbHVlLCBwYXRoKSB7XG4gICAgaWYgKHV0aWxzLmlzVW5kZWZpbmVkKHZhbHVlKSkgcmV0dXJuO1xuXG4gICAgaWYgKHN0YWNrLmluZGV4T2YodmFsdWUpICE9PSAtMSkge1xuICAgICAgdGhyb3cgRXJyb3IoJ0NpcmN1bGFyIHJlZmVyZW5jZSBkZXRlY3RlZCBpbiAnICsgcGF0aC5qb2luKCcuJykpO1xuICAgIH1cblxuICAgIHN0YWNrLnB1c2godmFsdWUpO1xuXG4gICAgdXRpbHMuZm9yRWFjaCh2YWx1ZSwgZnVuY3Rpb24gZWFjaChlbCwga2V5KSB7XG4gICAgICBjb25zdCByZXN1bHQgPSAhKHV0aWxzLmlzVW5kZWZpbmVkKGVsKSB8fCBlbCA9PT0gbnVsbCkgJiYgdmlzaXRvci5jYWxsKFxuICAgICAgICBmb3JtRGF0YSwgZWwsIHV0aWxzLmlzU3RyaW5nKGtleSkgPyBrZXkudHJpbSgpIDoga2V5LCBwYXRoLCBleHBvc2VkSGVscGVyc1xuICAgICAgKTtcblxuICAgICAgaWYgKHJlc3VsdCA9PT0gdHJ1ZSkge1xuICAgICAgICBidWlsZChlbCwgcGF0aCA/IHBhdGguY29uY2F0KGtleSkgOiBba2V5XSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBzdGFjay5wb3AoKTtcbiAgfVxuXG4gIGlmICghdXRpbHMuaXNPYmplY3Qob2JqKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2RhdGEgbXVzdCBiZSBhbiBvYmplY3QnKTtcbiAgfVxuXG4gIGJ1aWxkKG9iaik7XG5cbiAgcmV0dXJuIGZvcm1EYXRhO1xufVxuXG5leHBvcnQgZGVmYXVsdCB0b0Zvcm1EYXRhO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///19\n')},function(__webpack_module__,__webpack_exports__,__webpack_require__){"use strict";eval('/* unused harmony export CHARSET */\n/* unused harmony export COMMENT */\n/* unused harmony export COUNTER_STYLE */\n/* unused harmony export DECLARATION */\n/* unused harmony export DOCUMENT */\n/* unused harmony export FONT_FACE */\n/* unused harmony export FONT_FEATURE_VALUES */\n/* unused harmony export IMPORT */\n/* unused harmony export KEYFRAMES */\n/* unused harmony export LAYER */\n/* unused harmony export MEDIA */\n/* unused harmony export MOZ */\n/* unused harmony export MS */\n/* unused harmony export NAMESPACE */\n/* unused harmony export PAGE */\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return c; });\n/* unused harmony export SCOPE */\n/* unused harmony export SUPPORTS */\n/* unused harmony export VIEWPORT */\n/* unused harmony export WEBKIT */\n/* unused harmony export abs */\n/* unused harmony export alloc */\n/* unused harmony export append */\n/* unused harmony export assign */\n/* unused harmony export caret */\n/* unused harmony export char */\n/* unused harmony export character */\n/* unused harmony export characters */\n/* unused harmony export charat */\n/* unused harmony export column */\n/* unused harmony export combine */\n/* unused harmony export comment */\n/* unused harmony export commenter */\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return ue; });\n/* unused harmony export copy */\n/* unused harmony export dealloc */\n/* unused harmony export declaration */\n/* unused harmony export delimit */\n/* unused harmony export delimiter */\n/* unused harmony export escaping */\n/* unused harmony export filter */\n/* unused harmony export from */\n/* unused harmony export hash */\n/* unused harmony export identifier */\n/* unused harmony export indexof */\n/* unused harmony export length */\n/* unused harmony export lift */\n/* unused harmony export line */\n/* unused harmony export match */\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "c", function() { return be; });\n/* unused harmony export namespace */\n/* unused harmony export next */\n/* unused harmony export node */\n/* unused harmony export parse */\n/* unused harmony export peek */\n/* unused harmony export position */\n/* unused harmony export prefix */\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "d", function() { return de; });\n/* unused harmony export prev */\n/* unused harmony export replace */\n/* unused harmony export ruleset */\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "e", function() { return we; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "f", function() { return pe; });\n/* unused harmony export sizeof */\n/* unused harmony export slice */\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "g", function() { return he; });\n/* unused harmony export strlen */\n/* unused harmony export substr */\n/* unused harmony export token */\n/* unused harmony export tokenize */\n/* unused harmony export tokenizer */\n/* unused harmony export trim */\n/* unused harmony export whitespace */\nvar e="-ms-";var r="-moz-";var a="-webkit-";var n="comm";var c="rule";var s="decl";var t="@page";var u="@media";var i="@import";var f="@charset";var o="@viewport";var l="@supports";var v="@document";var p="@namespace";var h="@keyframes";var b="@font-face";var w="@counter-style";var d="@font-feature-values";var g="@layer";var k="@scope";var $=Math.abs;var m=String.fromCharCode;var x=Object.assign;function y(e,r){return A(e,0)^45?(((r<<2^A(e,0))<<2^A(e,1))<<2^A(e,2))<<2^A(e,3):0}function j(e){return e.trim()}function z(e,r){return(e=r.exec(e))?e[0]:e}function C(e,r,a){return e.replace(r,a)}function O(e,r,a){return e.indexOf(r,a)}function A(e,r){return e.charCodeAt(r)|0}function M(e,r,a){return e.slice(r,a)}function S(e){return e.length}function q(e){return e.length}function B(e,r){return r.push(e),e}function D(e,r){return e.map(r).join("")}function E(e,r){return e.filter((function(e){return!z(e,r)}))}var F=1;var G=1;var H=0;var I=0;var J=0;var K="";function L(e,r,a,n,c,s,t,u){return{value:e,root:r,parent:a,type:n,props:c,children:s,line:F,column:G,length:t,return:"",siblings:u}}function N(e,r){return x(L("",null,null,"",null,null,0,e.siblings),e,{length:-e.length},r)}function P(e){while(e.root)e=N(e.root,{children:[e]});B(e,e.siblings)}function Q(){return J}function R(){J=I>0?A(K,--I):0;if(G--,J===10)G=1,F--;return J}function T(){J=I<H?A(K,I++):0;if(G++,J===10)G=1,F++;return J}function U(){return A(K,I)}function V(){return I}function W(e,r){return M(K,e,r)}function X(e){switch(e){case 0:case 9:case 10:case 13:case 32:return 5;case 33:case 43:case 44:case 47:case 62:case 64:case 126:case 59:case 123:case 125:return 4;case 58:return 3;case 34:case 39:case 40:case 91:return 2;case 41:case 93:return 1}return 0}function Y(e){return F=G=1,H=S(K=e),I=0,[]}function Z(e){return K="",e}function _(e){return j(W(I-1,ce(e===91?e+2:e===40?e+1:e)))}function ee(e){return Z(ae(Y(e)))}function re(e){while(J=U())if(J<33)T();else break;return X(e)>2||X(J)>3?"":" "}function ae(e){while(T())switch(X(J)){case 0:B(te(I-1),e);break;case 2:B(_(J),e);break;default:B(m(J),e)}return e}function ne(e,r){while(--r&&T())if(J<48||J>102||J>57&&J<65||J>70&&J<97)break;return W(e,V()+(r<6&&U()==32&&T()==32))}function ce(e){while(T())switch(J){case e:return I;case 34:case 39:if(e!==34&&e!==39)ce(J);break;case 40:if(e===41)ce(e);break;case 92:T();break}return I}function se(e,r){while(T())if(e+J===47+10)break;else if(e+J===42+42&&U()===47)break;return"/*"+W(r,I-1)+"*"+m(e===47?e:T())}function te(e){while(!X(U()))T();return W(e,I)}function ue(e){return Z(ie("",null,null,null,[""],e=Y(e),0,[0],e))}function ie(e,r,a,n,c,s,t,u,i){var f=0;var o=0;var l=t;var v=0;var p=0;var h=0;var b=1;var w=1;var d=1;var g=0;var k="";var x=c;var y=s;var j=n;var z=k;while(w)switch(h=g,g=T()){case 40:if(h!=108&&A(z,l-1)==58){if(O(z+=C(_(g),"&","&\\f"),"&\\f",$(f?u[f-1]:0))!=-1)d=-1;break}case 34:case 39:case 91:z+=_(g);break;case 9:case 10:case 13:case 32:z+=re(h);break;case 92:z+=ne(V()-1,7);continue;case 47:switch(U()){case 42:case 47:B(oe(se(T(),V()),r,a,i),i);break;default:z+="/"}break;case 123*b:u[f++]=S(z)*d;case 125*b:case 59:case 0:switch(g){case 0:case 125:w=0;case 59+o:if(d==-1)z=C(z,/\\f/g,"");if(p>0&&S(z)-l)B(p>32?le(z+";",n,a,l-1,i):le(C(z," ","")+";",n,a,l-2,i),i);break;case 59:z+=";";default:B(j=fe(z,r,a,f,o,c,u,k,x=[],y=[],l,s),s);if(g===123)if(o===0)ie(z,r,j,j,x,s,l,u,y);else switch(v===99&&A(z,3)===110?100:v){case 100:case 108:case 109:case 115:ie(e,j,j,n&&B(fe(e,j,j,0,0,c,u,k,c,x=[],l,y),y),c,y,l,u,n?x:y);break;default:ie(z,j,j,j,[""],y,0,u,y)}}f=o=p=0,b=d=1,k=z="",l=t;break;case 58:l=1+S(z),p=h;default:if(b<1)if(g==123)--b;else if(g==125&&b++==0&&R()==125)continue;switch(z+=m(g),g*b){case 38:d=o>0?1:(z+="\\f",-1);break;case 44:u[f++]=(S(z)-1)*d,d=1;break;case 64:if(U()===45)z+=_(T());v=U(),o=l=S(k=z+=te(V())),g++;break;case 45:if(h===45&&S(z)==2)b=0}}return s}function fe(e,r,a,n,s,t,u,i,f,o,l,v){var p=s-1;var h=s===0?t:[""];var b=q(h);for(var w=0,d=0,g=0;w<n;++w)for(var k=0,m=M(e,p+1,p=$(d=u[w])),x=e;k<b;++k)if(x=j(d>0?h[k]+" "+m:C(m,/&\\f/g,h[k])))f[g++]=x;return L(e,r,a,s===0?c:i,f,o,l,v)}function oe(e,r,a,c){return L(e,r,a,n,m(Q()),M(e,2,-2),0,c)}function le(e,r,a,n,c){return L(e,r,a,s,M(e,0,n),M(e,n+1,-1),n,c)}function ve(n,c,s){switch(y(n,c)){case 5103:return a+"print-"+n+n;case 5737:case 4201:case 3177:case 3433:case 1641:case 4457:case 2921:case 5572:case 6356:case 5844:case 3191:case 6645:case 3005:case 6391:case 5879:case 5623:case 6135:case 4599:case 4855:case 4215:case 6389:case 5109:case 5365:case 5621:case 3829:return a+n+n;case 4789:return r+n+n;case 5349:case 4246:case 4810:case 6968:case 2756:return a+n+r+n+e+n+n;case 5936:switch(A(n,c+11)){case 114:return a+n+e+C(n,/[svh]\\w+-[tblr]{2}/,"tb")+n;case 108:return a+n+e+C(n,/[svh]\\w+-[tblr]{2}/,"tb-rl")+n;case 45:return a+n+e+C(n,/[svh]\\w+-[tblr]{2}/,"lr")+n}case 6828:case 4268:case 2903:return a+n+e+n+n;case 6165:return a+n+e+"flex-"+n+n;case 5187:return a+n+C(n,/(\\w+).+(:[^]+)/,a+"box-$1$2"+e+"flex-$1$2")+n;case 5443:return a+n+e+"flex-item-"+C(n,/flex-|-self/g,"")+(!z(n,/flex-|baseline/)?e+"grid-row-"+C(n,/flex-|-self/g,""):"")+n;case 4675:return a+n+e+"flex-line-pack"+C(n,/align-content|flex-|-self/g,"")+n;case 5548:return a+n+e+C(n,"shrink","negative")+n;case 5292:return a+n+e+C(n,"basis","preferred-size")+n;case 6060:return a+"box-"+C(n,"-grow","")+a+n+e+C(n,"grow","positive")+n;case 4554:return a+C(n,/([^-])(transform)/g,"$1"+a+"$2")+n;case 6187:return C(C(C(n,/(zoom-|grab)/,a+"$1"),/(image-set)/,a+"$1"),n,"")+n;case 5495:case 3959:return C(n,/(image-set\\([^]*)/,a+"$1"+"$`$1");case 4968:return C(C(n,/(.+:)(flex-)?(.*)/,a+"box-pack:$3"+e+"flex-pack:$3"),/s.+-b[^;]+/,"justify")+a+n+n;case 4200:if(!z(n,/flex-|baseline/))return e+"grid-column-align"+M(n,c)+n;break;case 2592:case 3360:return e+C(n,"template-","")+n;case 4384:case 3616:if(s&&s.some((function(e,r){return c=r,z(e.props,/grid-\\w+-end/)}))){return~O(n+(s=s[c].value),"span",0)?n:e+C(n,"-start","")+n+e+"grid-row-span:"+(~O(s,"span",0)?z(s,/\\d+/):+z(s,/\\d+/)-+z(n,/\\d+/))+";"}return e+C(n,"-start","")+n;case 4896:case 4128:return s&&s.some((function(e){return z(e.props,/grid-\\w+-start/)}))?n:e+C(C(n,"-end","-span"),"span ","")+n;case 4095:case 3583:case 4068:case 2532:return C(n,/(.+)-inline(.+)/,a+"$1$2")+n;case 8116:case 7059:case 5753:case 5535:case 5445:case 5701:case 4933:case 4677:case 5533:case 5789:case 5021:case 4765:if(S(n)-1-c>6)switch(A(n,c+1)){case 109:if(A(n,c+4)!==45)break;case 102:return C(n,/(.+:)(.+)-([^]+)/,"$1"+a+"$2-$3"+"$1"+r+(A(n,c+3)==108?"$3":"$2-$3"))+n;case 115:return~O(n,"stretch",0)?ve(C(n,"stretch","fill-available"),c,s)+n:n}break;case 5152:case 5920:return C(n,/(.+?):(\\d+)(\\s*\\/\\s*(span)?\\s*(\\d+))?(.*)/,(function(r,a,c,s,t,u,i){return e+a+":"+c+i+(s?e+a+"-span:"+(t?u:+u-+c)+i:"")+n}));case 4949:if(A(n,c+6)===121)return C(n,":",":"+a)+n;break;case 6444:switch(A(n,A(n,14)===45?18:11)){case 120:return C(n,/(.+:)([^;\\s!]+)(;|(\\s+)?!.+)?/,"$1"+a+(A(n,14)===45?"inline-":"")+"box$3"+"$1"+a+"$2$3"+"$1"+e+"$2box$3")+n;case 100:return C(n,":",":"+e)+n}break;case 5719:case 2647:case 2135:case 3927:case 2391:return C(n,"scroll-","scroll-snap-")+n}return n}function pe(e,r){var a="";for(var n=0;n<e.length;n++)a+=r(e[n],n,e,r)||"";return a}function he(e,r,a,t){switch(e.type){case g:if(e.children.length)break;case i:case s:return e.return=e.return||e.value;case n:return"";case h:return e.return=e.value+"{"+pe(e.children,t)+"}";case c:if(!S(e.value=e.props.join(",")))return""}return S(a=pe(e.children,t))?e.return=e.value+"{"+a+"}":""}function be(e){var r=q(e);return function(a,n,c,s){var t="";for(var u=0;u<r;u++)t+=e[u](a,n,c,s)||"";return t}}function we(e){return function(r){if(!r.root)if(r=r.return)e(r)}}function de(n,t,u,i){if(n.length>-1)if(!n.return)switch(n.type){case s:n.return=ve(n.value,n.length,u);return;case h:return pe([N(n,{value:C(n.value,"@","@"+a)})],i);case c:if(n.length)return D(u=n.props,(function(c){switch(z(c,i=/(::plac\\w+|:read-\\w+)/)){case":read-only":case":read-write":P(N(n,{props:[C(c,/:(read-\\w+)/,":"+r+"$1")]}));P(N(n,{props:[c]}));x(n,{props:E(u,i)});break;case"::placeholder":P(N(n,{props:[C(c,/:(plac\\w+)/,":"+a+"input-$1")]}));P(N(n,{props:[C(c,/:(plac\\w+)/,":"+r+"$1")]}));P(N(n,{props:[C(c,/:(plac\\w+)/,e+"input-$1")]}));P(N(n,{props:[c]}));x(n,{props:E(u,i)});break}return""}))}}function ge(e){switch(e.type){case c:e.props=e.props.map((function(r){return D(ee(r),(function(r,a,n){switch(A(r,0)){case 12:return M(r,1,S(r));case 0:case 40:case 43:case 62:case 126:return r;case 58:if(n[++a]==="global")n[a]="",n[++a]="\\f"+M(n[a],a=1,-1);case 32:return a===1?"":r;default:switch(a){case 0:e=r;return q(n)>1?"":r;case a=q(n)-1:case 2:return a===2?r+e+e:r+e;default:return r}}}))}))}}\n//# sourceMappingURL=stylis.mjs.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjAuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvc3R5bGlzL2Rpc3Qvc3R5bGlzLm1qcz84ZTMyIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBlPVwiLW1zLVwiO3ZhciByPVwiLW1vei1cIjt2YXIgYT1cIi13ZWJraXQtXCI7dmFyIG49XCJjb21tXCI7dmFyIGM9XCJydWxlXCI7dmFyIHM9XCJkZWNsXCI7dmFyIHQ9XCJAcGFnZVwiO3ZhciB1PVwiQG1lZGlhXCI7dmFyIGk9XCJAaW1wb3J0XCI7dmFyIGY9XCJAY2hhcnNldFwiO3ZhciBvPVwiQHZpZXdwb3J0XCI7dmFyIGw9XCJAc3VwcG9ydHNcIjt2YXIgdj1cIkBkb2N1bWVudFwiO3ZhciBwPVwiQG5hbWVzcGFjZVwiO3ZhciBoPVwiQGtleWZyYW1lc1wiO3ZhciBiPVwiQGZvbnQtZmFjZVwiO3ZhciB3PVwiQGNvdW50ZXItc3R5bGVcIjt2YXIgZD1cIkBmb250LWZlYXR1cmUtdmFsdWVzXCI7dmFyIGc9XCJAbGF5ZXJcIjt2YXIgaz1cIkBzY29wZVwiO3ZhciAkPU1hdGguYWJzO3ZhciBtPVN0cmluZy5mcm9tQ2hhckNvZGU7dmFyIHg9T2JqZWN0LmFzc2lnbjtmdW5jdGlvbiB5KGUscil7cmV0dXJuIEEoZSwwKV40NT8oKChyPDwyXkEoZSwwKSk8PDJeQShlLDEpKTw8Ml5BKGUsMikpPDwyXkEoZSwzKTowfWZ1bmN0aW9uIGooZSl7cmV0dXJuIGUudHJpbSgpfWZ1bmN0aW9uIHooZSxyKXtyZXR1cm4oZT1yLmV4ZWMoZSkpP2VbMF06ZX1mdW5jdGlvbiBDKGUscixhKXtyZXR1cm4gZS5yZXBsYWNlKHIsYSl9ZnVuY3Rpb24gTyhlLHIsYSl7cmV0dXJuIGUuaW5kZXhPZihyLGEpfWZ1bmN0aW9uIEEoZSxyKXtyZXR1cm4gZS5jaGFyQ29kZUF0KHIpfDB9ZnVuY3Rpb24gTShlLHIsYSl7cmV0dXJuIGUuc2xpY2UocixhKX1mdW5jdGlvbiBTKGUpe3JldHVybiBlLmxlbmd0aH1mdW5jdGlvbiBxKGUpe3JldHVybiBlLmxlbmd0aH1mdW5jdGlvbiBCKGUscil7cmV0dXJuIHIucHVzaChlKSxlfWZ1bmN0aW9uIEQoZSxyKXtyZXR1cm4gZS5tYXAocikuam9pbihcIlwiKX1mdW5jdGlvbiBFKGUscil7cmV0dXJuIGUuZmlsdGVyKChmdW5jdGlvbihlKXtyZXR1cm4heihlLHIpfSkpfXZhciBGPTE7dmFyIEc9MTt2YXIgSD0wO3ZhciBJPTA7dmFyIEo9MDt2YXIgSz1cIlwiO2Z1bmN0aW9uIEwoZSxyLGEsbixjLHMsdCx1KXtyZXR1cm57dmFsdWU6ZSxyb290OnIscGFyZW50OmEsdHlwZTpuLHByb3BzOmMsY2hpbGRyZW46cyxsaW5lOkYsY29sdW1uOkcsbGVuZ3RoOnQscmV0dXJuOlwiXCIsc2libGluZ3M6dX19ZnVuY3Rpb24gTihlLHIpe3JldHVybiB4KEwoXCJcIixudWxsLG51bGwsXCJcIixudWxsLG51bGwsMCxlLnNpYmxpbmdzKSxlLHtsZW5ndGg6LWUubGVuZ3RofSxyKX1mdW5jdGlvbiBQKGUpe3doaWxlKGUucm9vdCllPU4oZS5yb290LHtjaGlsZHJlbjpbZV19KTtCKGUsZS5zaWJsaW5ncyl9ZnVuY3Rpb24gUSgpe3JldHVybiBKfWZ1bmN0aW9uIFIoKXtKPUk+MD9BKEssLS1JKTowO2lmKEctLSxKPT09MTApRz0xLEYtLTtyZXR1cm4gSn1mdW5jdGlvbiBUKCl7Sj1JPEg/QShLLEkrKyk6MDtpZihHKyssSj09PTEwKUc9MSxGKys7cmV0dXJuIEp9ZnVuY3Rpb24gVSgpe3JldHVybiBBKEssSSl9ZnVuY3Rpb24gVigpe3JldHVybiBJfWZ1bmN0aW9uIFcoZSxyKXtyZXR1cm4gTShLLGUscil9ZnVuY3Rpb24gWChlKXtzd2l0Y2goZSl7Y2FzZSAwOmNhc2UgOTpjYXNlIDEwOmNhc2UgMTM6Y2FzZSAzMjpyZXR1cm4gNTtjYXNlIDMzOmNhc2UgNDM6Y2FzZSA0NDpjYXNlIDQ3OmNhc2UgNjI6Y2FzZSA2NDpjYXNlIDEyNjpjYXNlIDU5OmNhc2UgMTIzOmNhc2UgMTI1OnJldHVybiA0O2Nhc2UgNTg6cmV0dXJuIDM7Y2FzZSAzNDpjYXNlIDM5OmNhc2UgNDA6Y2FzZSA5MTpyZXR1cm4gMjtjYXNlIDQxOmNhc2UgOTM6cmV0dXJuIDF9cmV0dXJuIDB9ZnVuY3Rpb24gWShlKXtyZXR1cm4gRj1HPTEsSD1TKEs9ZSksST0wLFtdfWZ1bmN0aW9uIFooZSl7cmV0dXJuIEs9XCJcIixlfWZ1bmN0aW9uIF8oZSl7cmV0dXJuIGooVyhJLTEsY2UoZT09PTkxP2UrMjplPT09NDA/ZSsxOmUpKSl9ZnVuY3Rpb24gZWUoZSl7cmV0dXJuIFooYWUoWShlKSkpfWZ1bmN0aW9uIHJlKGUpe3doaWxlKEo9VSgpKWlmKEo8MzMpVCgpO2Vsc2UgYnJlYWs7cmV0dXJuIFgoZSk+Mnx8WChKKT4zP1wiXCI6XCIgXCJ9ZnVuY3Rpb24gYWUoZSl7d2hpbGUoVCgpKXN3aXRjaChYKEopKXtjYXNlIDA6Qih0ZShJLTEpLGUpO2JyZWFrO2Nhc2UgMjpCKF8oSiksZSk7YnJlYWs7ZGVmYXVsdDpCKG0oSiksZSl9cmV0dXJuIGV9ZnVuY3Rpb24gbmUoZSxyKXt3aGlsZSgtLXImJlQoKSlpZihKPDQ4fHxKPjEwMnx8Sj41NyYmSjw2NXx8Sj43MCYmSjw5NylicmVhaztyZXR1cm4gVyhlLFYoKSsocjw2JiZVKCk9PTMyJiZUKCk9PTMyKSl9ZnVuY3Rpb24gY2UoZSl7d2hpbGUoVCgpKXN3aXRjaChKKXtjYXNlIGU6cmV0dXJuIEk7Y2FzZSAzNDpjYXNlIDM5OmlmKGUhPT0zNCYmZSE9PTM5KWNlKEopO2JyZWFrO2Nhc2UgNDA6aWYoZT09PTQxKWNlKGUpO2JyZWFrO2Nhc2UgOTI6VCgpO2JyZWFrfXJldHVybiBJfWZ1bmN0aW9uIHNlKGUscil7d2hpbGUoVCgpKWlmKGUrSj09PTQ3KzEwKWJyZWFrO2Vsc2UgaWYoZStKPT09NDIrNDImJlUoKT09PTQ3KWJyZWFrO3JldHVyblwiLypcIitXKHIsSS0xKStcIipcIittKGU9PT00Nz9lOlQoKSl9ZnVuY3Rpb24gdGUoZSl7d2hpbGUoIVgoVSgpKSlUKCk7cmV0dXJuIFcoZSxJKX1mdW5jdGlvbiB1ZShlKXtyZXR1cm4gWihpZShcIlwiLG51bGwsbnVsbCxudWxsLFtcIlwiXSxlPVkoZSksMCxbMF0sZSkpfWZ1bmN0aW9uIGllKGUscixhLG4sYyxzLHQsdSxpKXt2YXIgZj0wO3ZhciBvPTA7dmFyIGw9dDt2YXIgdj0wO3ZhciBwPTA7dmFyIGg9MDt2YXIgYj0xO3ZhciB3PTE7dmFyIGQ9MTt2YXIgZz0wO3ZhciBrPVwiXCI7dmFyIHg9Yzt2YXIgeT1zO3ZhciBqPW47dmFyIHo9azt3aGlsZSh3KXN3aXRjaChoPWcsZz1UKCkpe2Nhc2UgNDA6aWYoaCE9MTA4JiZBKHosbC0xKT09NTgpe2lmKE8oeis9QyhfKGcpLFwiJlwiLFwiJlxcZlwiKSxcIiZcXGZcIiwkKGY/dVtmLTFdOjApKSE9LTEpZD0tMTticmVha31jYXNlIDM0OmNhc2UgMzk6Y2FzZSA5MTp6Kz1fKGcpO2JyZWFrO2Nhc2UgOTpjYXNlIDEwOmNhc2UgMTM6Y2FzZSAzMjp6Kz1yZShoKTticmVhaztjYXNlIDkyOnorPW5lKFYoKS0xLDcpO2NvbnRpbnVlO2Nhc2UgNDc6c3dpdGNoKFUoKSl7Y2FzZSA0MjpjYXNlIDQ3OkIob2Uoc2UoVCgpLFYoKSkscixhLGkpLGkpO2JyZWFrO2RlZmF1bHQ6eis9XCIvXCJ9YnJlYWs7Y2FzZSAxMjMqYjp1W2YrK109Uyh6KSpkO2Nhc2UgMTI1KmI6Y2FzZSA1OTpjYXNlIDA6c3dpdGNoKGcpe2Nhc2UgMDpjYXNlIDEyNTp3PTA7Y2FzZSA1OStvOmlmKGQ9PS0xKXo9Qyh6LC9cXGYvZyxcIlwiKTtpZihwPjAmJlMoeiktbClCKHA+MzI/bGUoeitcIjtcIixuLGEsbC0xLGkpOmxlKEMoeixcIiBcIixcIlwiKStcIjtcIixuLGEsbC0yLGkpLGkpO2JyZWFrO2Nhc2UgNTk6eis9XCI7XCI7ZGVmYXVsdDpCKGo9ZmUoeixyLGEsZixvLGMsdSxrLHg9W10seT1bXSxsLHMpLHMpO2lmKGc9PT0xMjMpaWYobz09PTApaWUoeixyLGosaix4LHMsbCx1LHkpO2Vsc2Ugc3dpdGNoKHY9PT05OSYmQSh6LDMpPT09MTEwPzEwMDp2KXtjYXNlIDEwMDpjYXNlIDEwODpjYXNlIDEwOTpjYXNlIDExNTppZShlLGosaixuJiZCKGZlKGUsaixqLDAsMCxjLHUsayxjLHg9W10sbCx5KSx5KSxjLHksbCx1LG4/eDp5KTticmVhaztkZWZhdWx0OmllKHosaixqLGosW1wiXCJdLHksMCx1LHkpfX1mPW89cD0wLGI9ZD0xLGs9ej1cIlwiLGw9dDticmVhaztjYXNlIDU4Omw9MStTKHopLHA9aDtkZWZhdWx0OmlmKGI8MSlpZihnPT0xMjMpLS1iO2Vsc2UgaWYoZz09MTI1JiZiKys9PTAmJlIoKT09MTI1KWNvbnRpbnVlO3N3aXRjaCh6Kz1tKGcpLGcqYil7Y2FzZSAzODpkPW8+MD8xOih6Kz1cIlxcZlwiLC0xKTticmVhaztjYXNlIDQ0OnVbZisrXT0oUyh6KS0xKSpkLGQ9MTticmVhaztjYXNlIDY0OmlmKFUoKT09PTQ1KXorPV8oVCgpKTt2PVUoKSxvPWw9UyhrPXorPXRlKFYoKSkpLGcrKzticmVhaztjYXNlIDQ1OmlmKGg9PT00NSYmUyh6KT09MiliPTB9fXJldHVybiBzfWZ1bmN0aW9uIGZlKGUscixhLG4scyx0LHUsaSxmLG8sbCx2KXt2YXIgcD1zLTE7dmFyIGg9cz09PTA/dDpbXCJcIl07dmFyIGI9cShoKTtmb3IodmFyIHc9MCxkPTAsZz0wO3c8bjsrK3cpZm9yKHZhciBrPTAsbT1NKGUscCsxLHA9JChkPXVbd10pKSx4PWU7azxiOysraylpZih4PWooZD4wP2hba10rXCIgXCIrbTpDKG0sLyZcXGYvZyxoW2tdKSkpZltnKytdPXg7cmV0dXJuIEwoZSxyLGEscz09PTA/YzppLGYsbyxsLHYpfWZ1bmN0aW9uIG9lKGUscixhLGMpe3JldHVybiBMKGUscixhLG4sbShRKCkpLE0oZSwyLC0yKSwwLGMpfWZ1bmN0aW9uIGxlKGUscixhLG4sYyl7cmV0dXJuIEwoZSxyLGEscyxNKGUsMCxuKSxNKGUsbisxLC0xKSxuLGMpfWZ1bmN0aW9uIHZlKG4sYyxzKXtzd2l0Y2goeShuLGMpKXtjYXNlIDUxMDM6cmV0dXJuIGErXCJwcmludC1cIituK247Y2FzZSA1NzM3OmNhc2UgNDIwMTpjYXNlIDMxNzc6Y2FzZSAzNDMzOmNhc2UgMTY0MTpjYXNlIDQ0NTc6Y2FzZSAyOTIxOmNhc2UgNTU3MjpjYXNlIDYzNTY6Y2FzZSA1ODQ0OmNhc2UgMzE5MTpjYXNlIDY2NDU6Y2FzZSAzMDA1OmNhc2UgNjM5MTpjYXNlIDU4Nzk6Y2FzZSA1NjIzOmNhc2UgNjEzNTpjYXNlIDQ1OTk6Y2FzZSA0ODU1OmNhc2UgNDIxNTpjYXNlIDYzODk6Y2FzZSA1MTA5OmNhc2UgNTM2NTpjYXNlIDU2MjE6Y2FzZSAzODI5OnJldHVybiBhK24rbjtjYXNlIDQ3ODk6cmV0dXJuIHIrbituO2Nhc2UgNTM0OTpjYXNlIDQyNDY6Y2FzZSA0ODEwOmNhc2UgNjk2ODpjYXNlIDI3NTY6cmV0dXJuIGErbityK24rZStuK247Y2FzZSA1OTM2OnN3aXRjaChBKG4sYysxMSkpe2Nhc2UgMTE0OnJldHVybiBhK24rZStDKG4sL1tzdmhdXFx3Ky1bdGJscl17Mn0vLFwidGJcIikrbjtjYXNlIDEwODpyZXR1cm4gYStuK2UrQyhuLC9bc3ZoXVxcdystW3RibHJdezJ9LyxcInRiLXJsXCIpK247Y2FzZSA0NTpyZXR1cm4gYStuK2UrQyhuLC9bc3ZoXVxcdystW3RibHJdezJ9LyxcImxyXCIpK259Y2FzZSA2ODI4OmNhc2UgNDI2ODpjYXNlIDI5MDM6cmV0dXJuIGErbitlK24rbjtjYXNlIDYxNjU6cmV0dXJuIGErbitlK1wiZmxleC1cIituK247Y2FzZSA1MTg3OnJldHVybiBhK24rQyhuLC8oXFx3KykuKyg6W15dKykvLGErXCJib3gtJDEkMlwiK2UrXCJmbGV4LSQxJDJcIikrbjtjYXNlIDU0NDM6cmV0dXJuIGErbitlK1wiZmxleC1pdGVtLVwiK0MobiwvZmxleC18LXNlbGYvZyxcIlwiKSsoIXoobiwvZmxleC18YmFzZWxpbmUvKT9lK1wiZ3JpZC1yb3ctXCIrQyhuLC9mbGV4LXwtc2VsZi9nLFwiXCIpOlwiXCIpK247Y2FzZSA0Njc1OnJldHVybiBhK24rZStcImZsZXgtbGluZS1wYWNrXCIrQyhuLC9hbGlnbi1jb250ZW50fGZsZXgtfC1zZWxmL2csXCJcIikrbjtjYXNlIDU1NDg6cmV0dXJuIGErbitlK0MobixcInNocmlua1wiLFwibmVnYXRpdmVcIikrbjtjYXNlIDUyOTI6cmV0dXJuIGErbitlK0MobixcImJhc2lzXCIsXCJwcmVmZXJyZWQtc2l6ZVwiKStuO2Nhc2UgNjA2MDpyZXR1cm4gYStcImJveC1cIitDKG4sXCItZ3Jvd1wiLFwiXCIpK2ErbitlK0MobixcImdyb3dcIixcInBvc2l0aXZlXCIpK247Y2FzZSA0NTU0OnJldHVybiBhK0MobiwvKFteLV0pKHRyYW5zZm9ybSkvZyxcIiQxXCIrYStcIiQyXCIpK247Y2FzZSA2MTg3OnJldHVybiBDKEMoQyhuLC8oem9vbS18Z3JhYikvLGErXCIkMVwiKSwvKGltYWdlLXNldCkvLGErXCIkMVwiKSxuLFwiXCIpK247Y2FzZSA1NDk1OmNhc2UgMzk1OTpyZXR1cm4gQyhuLC8oaW1hZ2Utc2V0XFwoW15dKikvLGErXCIkMVwiK1wiJGAkMVwiKTtjYXNlIDQ5Njg6cmV0dXJuIEMoQyhuLC8oLis6KShmbGV4LSk/KC4qKS8sYStcImJveC1wYWNrOiQzXCIrZStcImZsZXgtcGFjazokM1wiKSwvcy4rLWJbXjtdKy8sXCJqdXN0aWZ5XCIpK2ErbituO2Nhc2UgNDIwMDppZigheihuLC9mbGV4LXxiYXNlbGluZS8pKXJldHVybiBlK1wiZ3JpZC1jb2x1bW4tYWxpZ25cIitNKG4sYykrbjticmVhaztjYXNlIDI1OTI6Y2FzZSAzMzYwOnJldHVybiBlK0MobixcInRlbXBsYXRlLVwiLFwiXCIpK247Y2FzZSA0Mzg0OmNhc2UgMzYxNjppZihzJiZzLnNvbWUoKGZ1bmN0aW9uKGUscil7cmV0dXJuIGM9cix6KGUucHJvcHMsL2dyaWQtXFx3Ky1lbmQvKX0pKSl7cmV0dXJufk8obisocz1zW2NdLnZhbHVlKSxcInNwYW5cIiwwKT9uOmUrQyhuLFwiLXN0YXJ0XCIsXCJcIikrbitlK1wiZ3JpZC1yb3ctc3BhbjpcIisofk8ocyxcInNwYW5cIiwwKT96KHMsL1xcZCsvKToreihzLC9cXGQrLyktK3oobiwvXFxkKy8pKStcIjtcIn1yZXR1cm4gZStDKG4sXCItc3RhcnRcIixcIlwiKStuO2Nhc2UgNDg5NjpjYXNlIDQxMjg6cmV0dXJuIHMmJnMuc29tZSgoZnVuY3Rpb24oZSl7cmV0dXJuIHooZS5wcm9wcywvZ3JpZC1cXHcrLXN0YXJ0Lyl9KSk/bjplK0MoQyhuLFwiLWVuZFwiLFwiLXNwYW5cIiksXCJzcGFuIFwiLFwiXCIpK247Y2FzZSA0MDk1OmNhc2UgMzU4MzpjYXNlIDQwNjg6Y2FzZSAyNTMyOnJldHVybiBDKG4sLyguKyktaW5saW5lKC4rKS8sYStcIiQxJDJcIikrbjtjYXNlIDgxMTY6Y2FzZSA3MDU5OmNhc2UgNTc1MzpjYXNlIDU1MzU6Y2FzZSA1NDQ1OmNhc2UgNTcwMTpjYXNlIDQ5MzM6Y2FzZSA0Njc3OmNhc2UgNTUzMzpjYXNlIDU3ODk6Y2FzZSA1MDIxOmNhc2UgNDc2NTppZihTKG4pLTEtYz42KXN3aXRjaChBKG4sYysxKSl7Y2FzZSAxMDk6aWYoQShuLGMrNCkhPT00NSlicmVhaztjYXNlIDEwMjpyZXR1cm4gQyhuLC8oLis6KSguKyktKFteXSspLyxcIiQxXCIrYStcIiQyLSQzXCIrXCIkMVwiK3IrKEEobixjKzMpPT0xMDg/XCIkM1wiOlwiJDItJDNcIikpK247Y2FzZSAxMTU6cmV0dXJufk8obixcInN0cmV0Y2hcIiwwKT92ZShDKG4sXCJzdHJldGNoXCIsXCJmaWxsLWF2YWlsYWJsZVwiKSxjLHMpK246bn1icmVhaztjYXNlIDUxNTI6Y2FzZSA1OTIwOnJldHVybiBDKG4sLyguKz8pOihcXGQrKShcXHMqXFwvXFxzKihzcGFuKT9cXHMqKFxcZCspKT8oLiopLywoZnVuY3Rpb24ocixhLGMscyx0LHUsaSl7cmV0dXJuIGUrYStcIjpcIitjK2krKHM/ZSthK1wiLXNwYW46XCIrKHQ/dTordS0rYykraTpcIlwiKStufSkpO2Nhc2UgNDk0OTppZihBKG4sYys2KT09PTEyMSlyZXR1cm4gQyhuLFwiOlwiLFwiOlwiK2EpK247YnJlYWs7Y2FzZSA2NDQ0OnN3aXRjaChBKG4sQShuLDE0KT09PTQ1PzE4OjExKSl7Y2FzZSAxMjA6cmV0dXJuIEMobiwvKC4rOikoW147XFxzIV0rKSg7fChcXHMrKT8hLispPy8sXCIkMVwiK2ErKEEobiwxNCk9PT00NT9cImlubGluZS1cIjpcIlwiKStcImJveCQzXCIrXCIkMVwiK2ErXCIkMiQzXCIrXCIkMVwiK2UrXCIkMmJveCQzXCIpK247Y2FzZSAxMDA6cmV0dXJuIEMobixcIjpcIixcIjpcIitlKStufWJyZWFrO2Nhc2UgNTcxOTpjYXNlIDI2NDc6Y2FzZSAyMTM1OmNhc2UgMzkyNzpjYXNlIDIzOTE6cmV0dXJuIEMobixcInNjcm9sbC1cIixcInNjcm9sbC1zbmFwLVwiKStufXJldHVybiBufWZ1bmN0aW9uIHBlKGUscil7dmFyIGE9XCJcIjtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKylhKz1yKGVbbl0sbixlLHIpfHxcIlwiO3JldHVybiBhfWZ1bmN0aW9uIGhlKGUscixhLHQpe3N3aXRjaChlLnR5cGUpe2Nhc2UgZzppZihlLmNoaWxkcmVuLmxlbmd0aClicmVhaztjYXNlIGk6Y2FzZSBzOnJldHVybiBlLnJldHVybj1lLnJldHVybnx8ZS52YWx1ZTtjYXNlIG46cmV0dXJuXCJcIjtjYXNlIGg6cmV0dXJuIGUucmV0dXJuPWUudmFsdWUrXCJ7XCIrcGUoZS5jaGlsZHJlbix0KStcIn1cIjtjYXNlIGM6aWYoIVMoZS52YWx1ZT1lLnByb3BzLmpvaW4oXCIsXCIpKSlyZXR1cm5cIlwifXJldHVybiBTKGE9cGUoZS5jaGlsZHJlbix0KSk/ZS5yZXR1cm49ZS52YWx1ZStcIntcIithK1wifVwiOlwiXCJ9ZnVuY3Rpb24gYmUoZSl7dmFyIHI9cShlKTtyZXR1cm4gZnVuY3Rpb24oYSxuLGMscyl7dmFyIHQ9XCJcIjtmb3IodmFyIHU9MDt1PHI7dSsrKXQrPWVbdV0oYSxuLGMscyl8fFwiXCI7cmV0dXJuIHR9fWZ1bmN0aW9uIHdlKGUpe3JldHVybiBmdW5jdGlvbihyKXtpZighci5yb290KWlmKHI9ci5yZXR1cm4pZShyKX19ZnVuY3Rpb24gZGUobix0LHUsaSl7aWYobi5sZW5ndGg+LTEpaWYoIW4ucmV0dXJuKXN3aXRjaChuLnR5cGUpe2Nhc2UgczpuLnJldHVybj12ZShuLnZhbHVlLG4ubGVuZ3RoLHUpO3JldHVybjtjYXNlIGg6cmV0dXJuIHBlKFtOKG4se3ZhbHVlOkMobi52YWx1ZSxcIkBcIixcIkBcIithKX0pXSxpKTtjYXNlIGM6aWYobi5sZW5ndGgpcmV0dXJuIEQodT1uLnByb3BzLChmdW5jdGlvbihjKXtzd2l0Y2goeihjLGk9Lyg6OnBsYWNcXHcrfDpyZWFkLVxcdyspLykpe2Nhc2VcIjpyZWFkLW9ubHlcIjpjYXNlXCI6cmVhZC13cml0ZVwiOlAoTihuLHtwcm9wczpbQyhjLC86KHJlYWQtXFx3KykvLFwiOlwiK3IrXCIkMVwiKV19KSk7UChOKG4se3Byb3BzOltjXX0pKTt4KG4se3Byb3BzOkUodSxpKX0pO2JyZWFrO2Nhc2VcIjo6cGxhY2Vob2xkZXJcIjpQKE4obix7cHJvcHM6W0MoYywvOihwbGFjXFx3KykvLFwiOlwiK2ErXCJpbnB1dC0kMVwiKV19KSk7UChOKG4se3Byb3BzOltDKGMsLzoocGxhY1xcdyspLyxcIjpcIityK1wiJDFcIildfSkpO1AoTihuLHtwcm9wczpbQyhjLC86KHBsYWNcXHcrKS8sZStcImlucHV0LSQxXCIpXX0pKTtQKE4obix7cHJvcHM6W2NdfSkpO3gobix7cHJvcHM6RSh1LGkpfSk7YnJlYWt9cmV0dXJuXCJcIn0pKX19ZnVuY3Rpb24gZ2UoZSl7c3dpdGNoKGUudHlwZSl7Y2FzZSBjOmUucHJvcHM9ZS5wcm9wcy5tYXAoKGZ1bmN0aW9uKHIpe3JldHVybiBEKGVlKHIpLChmdW5jdGlvbihyLGEsbil7c3dpdGNoKEEociwwKSl7Y2FzZSAxMjpyZXR1cm4gTShyLDEsUyhyKSk7Y2FzZSAwOmNhc2UgNDA6Y2FzZSA0MzpjYXNlIDYyOmNhc2UgMTI2OnJldHVybiByO2Nhc2UgNTg6aWYoblsrK2FdPT09XCJnbG9iYWxcIiluW2FdPVwiXCIsblsrK2FdPVwiXFxmXCIrTShuW2FdLGE9MSwtMSk7Y2FzZSAzMjpyZXR1cm4gYT09PTE/XCJcIjpyO2RlZmF1bHQ6c3dpdGNoKGEpe2Nhc2UgMDplPXI7cmV0dXJuIHEobik+MT9cIlwiOnI7Y2FzZSBhPXEobiktMTpjYXNlIDI6cmV0dXJuIGE9PT0yP3IrZStlOnIrZTtkZWZhdWx0OnJldHVybiByfX19KSl9KSl9fWV4cG9ydHtmIGFzIENIQVJTRVQsbiBhcyBDT01NRU5ULHcgYXMgQ09VTlRFUl9TVFlMRSxzIGFzIERFQ0xBUkFUSU9OLHYgYXMgRE9DVU1FTlQsYiBhcyBGT05UX0ZBQ0UsZCBhcyBGT05UX0ZFQVRVUkVfVkFMVUVTLGkgYXMgSU1QT1JULGggYXMgS0VZRlJBTUVTLGcgYXMgTEFZRVIsdSBhcyBNRURJQSxyIGFzIE1PWixlIGFzIE1TLHAgYXMgTkFNRVNQQUNFLHQgYXMgUEFHRSxjIGFzIFJVTEVTRVQsayBhcyBTQ09QRSxsIGFzIFNVUFBPUlRTLG8gYXMgVklFV1BPUlQsYSBhcyBXRUJLSVQsJCBhcyBhYnMsWSBhcyBhbGxvYyxCIGFzIGFwcGVuZCx4IGFzIGFzc2lnbixWIGFzIGNhcmV0LFEgYXMgY2hhcixKIGFzIGNoYXJhY3RlcixLIGFzIGNoYXJhY3RlcnMsQSBhcyBjaGFyYXQsRyBhcyBjb2x1bW4sRCBhcyBjb21iaW5lLG9lIGFzIGNvbW1lbnQsc2UgYXMgY29tbWVudGVyLHVlIGFzIGNvbXBpbGUsTiBhcyBjb3B5LFogYXMgZGVhbGxvYyxsZSBhcyBkZWNsYXJhdGlvbixfIGFzIGRlbGltaXQsY2UgYXMgZGVsaW1pdGVyLG5lIGFzIGVzY2FwaW5nLEUgYXMgZmlsdGVyLG0gYXMgZnJvbSx5IGFzIGhhc2gsdGUgYXMgaWRlbnRpZmllcixPIGFzIGluZGV4b2YsSCBhcyBsZW5ndGgsUCBhcyBsaWZ0LEYgYXMgbGluZSx6IGFzIG1hdGNoLGJlIGFzIG1pZGRsZXdhcmUsZ2UgYXMgbmFtZXNwYWNlLFQgYXMgbmV4dCxMIGFzIG5vZGUsaWUgYXMgcGFyc2UsVSBhcyBwZWVrLEkgYXMgcG9zaXRpb24sdmUgYXMgcHJlZml4LGRlIGFzIHByZWZpeGVyLFIgYXMgcHJldixDIGFzIHJlcGxhY2UsZmUgYXMgcnVsZXNldCx3ZSBhcyBydWxlc2hlZXQscGUgYXMgc2VyaWFsaXplLHEgYXMgc2l6ZW9mLFcgYXMgc2xpY2UsaGUgYXMgc3RyaW5naWZ5LFMgYXMgc3RybGVuLE0gYXMgc3Vic3RyLFggYXMgdG9rZW4sZWUgYXMgdG9rZW5pemUsYWUgYXMgdG9rZW5pemVyLGogYXMgdHJpbSxyZSBhcyB3aGl0ZXNwYWNlfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXN0eWxpcy5tanMubWFwXG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///20\n')},function(module,exports){eval('var g;\n\n// This works in non-strict mode\ng = (function() {\n\treturn this;\n})();\n\ntry {\n\t// This works if eval is allowed (see CSP)\n\tg = g || new Function("return this")();\n} catch (e) {\n\t// This works if the window reference is available\n\tif (typeof window === "object") g = window;\n}\n\n// g can still be undefined, but nothing to do about it...\n// We return undefined, instead of nothing here, so it\'s\n// easier to handle this case. if(!global) { ...}\n\nmodule.exports = g;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjEuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vKHdlYnBhY2spL2J1aWxkaW4vZ2xvYmFsLmpzP2NkMDAiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGc7XG5cbi8vIFRoaXMgd29ya3MgaW4gbm9uLXN0cmljdCBtb2RlXG5nID0gKGZ1bmN0aW9uKCkge1xuXHRyZXR1cm4gdGhpcztcbn0pKCk7XG5cbnRyeSB7XG5cdC8vIFRoaXMgd29ya3MgaWYgZXZhbCBpcyBhbGxvd2VkIChzZWUgQ1NQKVxuXHRnID0gZyB8fCBuZXcgRnVuY3Rpb24oXCJyZXR1cm4gdGhpc1wiKSgpO1xufSBjYXRjaCAoZSkge1xuXHQvLyBUaGlzIHdvcmtzIGlmIHRoZSB3aW5kb3cgcmVmZXJlbmNlIGlzIGF2YWlsYWJsZVxuXHRpZiAodHlwZW9mIHdpbmRvdyA9PT0gXCJvYmplY3RcIikgZyA9IHdpbmRvdztcbn1cblxuLy8gZyBjYW4gc3RpbGwgYmUgdW5kZWZpbmVkLCBidXQgbm90aGluZyB0byBkbyBhYm91dCBpdC4uLlxuLy8gV2UgcmV0dXJuIHVuZGVmaW5lZCwgaW5zdGVhZCBvZiBub3RoaW5nIGhlcmUsIHNvIGl0J3Ncbi8vIGVhc2llciB0byBoYW5kbGUgdGhpcyBjYXNlLiBpZighZ2xvYmFsKSB7IC4uLn1cblxubW9kdWxlLmV4cG9ydHMgPSBnO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///21\n')},function(module,exports,__webpack_require__){eval("/**\n * Advanced Encryption Standard (AES) implementation.\n *\n * This implementation is based on the public domain library 'jscrypto' which\n * was written by:\n *\n * Emily Stark (estark@stanford.edu)\n * Mike Hamburg (mhamburg@stanford.edu)\n * Dan Boneh (dabo@cs.stanford.edu)\n *\n * Parts of this code are based on the OpenSSL implementation of AES:\n * http://www.openssl.org\n *\n * @author Dave Longley\n *\n * Copyright (c) 2010-2014 Digital Bazaar, Inc.\n */\nvar forge = __webpack_require__(4);\n__webpack_require__(54);\n__webpack_require__(78);\n__webpack_require__(7);\n\n/* AES API */\nmodule.exports = forge.aes = forge.aes || {};\n\n/**\n * Deprecated. Instead, use:\n *\n * var cipher = forge.cipher.createCipher('AES-<mode>', key);\n * cipher.start({iv: iv});\n *\n * Creates an AES cipher object to encrypt data using the given symmetric key.\n * The output will be stored in the 'output' member of the returned cipher.\n *\n * The key and iv may be given as a string of bytes, an array of bytes,\n * a byte buffer, or an array of 32-bit words.\n *\n * @param key the symmetric key to use.\n * @param iv the initialization vector to use.\n * @param output the buffer to write to, null to create one.\n * @param mode the cipher mode to use (default: 'CBC').\n *\n * @return the cipher.\n */\nforge.aes.startEncrypting = function(key, iv, output, mode) {\n  var cipher = _createCipher({\n    key: key,\n    output: output,\n    decrypt: false,\n    mode: mode\n  });\n  cipher.start(iv);\n  return cipher;\n};\n\n/**\n * Deprecated. Instead, use:\n *\n * var cipher = forge.cipher.createCipher('AES-<mode>', key);\n *\n * Creates an AES cipher object to encrypt data using the given symmetric key.\n *\n * The key may be given as a string of bytes, an array of bytes, a\n * byte buffer, or an array of 32-bit words.\n *\n * @param key the symmetric key to use.\n * @param mode the cipher mode to use (default: 'CBC').\n *\n * @return the cipher.\n */\nforge.aes.createEncryptionCipher = function(key, mode) {\n  return _createCipher({\n    key: key,\n    output: null,\n    decrypt: false,\n    mode: mode\n  });\n};\n\n/**\n * Deprecated. Instead, use:\n *\n * var decipher = forge.cipher.createDecipher('AES-<mode>', key);\n * decipher.start({iv: iv});\n *\n * Creates an AES cipher object to decrypt data using the given symmetric key.\n * The output will be stored in the 'output' member of the returned cipher.\n *\n * The key and iv may be given as a string of bytes, an array of bytes,\n * a byte buffer, or an array of 32-bit words.\n *\n * @param key the symmetric key to use.\n * @param iv the initialization vector to use.\n * @param output the buffer to write to, null to create one.\n * @param mode the cipher mode to use (default: 'CBC').\n *\n * @return the cipher.\n */\nforge.aes.startDecrypting = function(key, iv, output, mode) {\n  var cipher = _createCipher({\n    key: key,\n    output: output,\n    decrypt: true,\n    mode: mode\n  });\n  cipher.start(iv);\n  return cipher;\n};\n\n/**\n * Deprecated. Instead, use:\n *\n * var decipher = forge.cipher.createDecipher('AES-<mode>', key);\n *\n * Creates an AES cipher object to decrypt data using the given symmetric key.\n *\n * The key may be given as a string of bytes, an array of bytes, a\n * byte buffer, or an array of 32-bit words.\n *\n * @param key the symmetric key to use.\n * @param mode the cipher mode to use (default: 'CBC').\n *\n * @return the cipher.\n */\nforge.aes.createDecryptionCipher = function(key, mode) {\n  return _createCipher({\n    key: key,\n    output: null,\n    decrypt: true,\n    mode: mode\n  });\n};\n\n/**\n * Creates a new AES cipher algorithm object.\n *\n * @param name the name of the algorithm.\n * @param mode the mode factory function.\n *\n * @return the AES algorithm object.\n */\nforge.aes.Algorithm = function(name, mode) {\n  if(!init) {\n    initialize();\n  }\n  var self = this;\n  self.name = name;\n  self.mode = new mode({\n    blockSize: 16,\n    cipher: {\n      encrypt: function(inBlock, outBlock) {\n        return _updateBlock(self._w, inBlock, outBlock, false);\n      },\n      decrypt: function(inBlock, outBlock) {\n        return _updateBlock(self._w, inBlock, outBlock, true);\n      }\n    }\n  });\n  self._init = false;\n};\n\n/**\n * Initializes this AES algorithm by expanding its key.\n *\n * @param options the options to use.\n *          key the key to use with this algorithm.\n *          decrypt true if the algorithm should be initialized for decryption,\n *            false for encryption.\n */\nforge.aes.Algorithm.prototype.initialize = function(options) {\n  if(this._init) {\n    return;\n  }\n\n  var key = options.key;\n  var tmp;\n\n  /* Note: The key may be a string of bytes, an array of bytes, a byte\n    buffer, or an array of 32-bit integers. If the key is in bytes, then\n    it must be 16, 24, or 32 bytes in length. If it is in 32-bit\n    integers, it must be 4, 6, or 8 integers long. */\n\n  if(typeof key === 'string' &&\n    (key.length === 16 || key.length === 24 || key.length === 32)) {\n    // convert key string into byte buffer\n    key = forge.util.createBuffer(key);\n  } else if(forge.util.isArray(key) &&\n    (key.length === 16 || key.length === 24 || key.length === 32)) {\n    // convert key integer array into byte buffer\n    tmp = key;\n    key = forge.util.createBuffer();\n    for(var i = 0; i < tmp.length; ++i) {\n      key.putByte(tmp[i]);\n    }\n  }\n\n  // convert key byte buffer into 32-bit integer array\n  if(!forge.util.isArray(key)) {\n    tmp = key;\n    key = [];\n\n    // key lengths of 16, 24, 32 bytes allowed\n    var len = tmp.length();\n    if(len === 16 || len === 24 || len === 32) {\n      len = len >>> 2;\n      for(var i = 0; i < len; ++i) {\n        key.push(tmp.getInt32());\n      }\n    }\n  }\n\n  // key must be an array of 32-bit integers by now\n  if(!forge.util.isArray(key) ||\n    !(key.length === 4 || key.length === 6 || key.length === 8)) {\n    throw new Error('Invalid key parameter.');\n  }\n\n  // encryption operation is always used for these modes\n  var mode = this.mode.name;\n  var encryptOp = (['CFB', 'OFB', 'CTR', 'GCM'].indexOf(mode) !== -1);\n\n  // do key expansion\n  this._w = _expandKey(key, options.decrypt && !encryptOp);\n  this._init = true;\n};\n\n/**\n * Expands a key. Typically only used for testing.\n *\n * @param key the symmetric key to expand, as an array of 32-bit words.\n * @param decrypt true to expand for decryption, false for encryption.\n *\n * @return the expanded key.\n */\nforge.aes._expandKey = function(key, decrypt) {\n  if(!init) {\n    initialize();\n  }\n  return _expandKey(key, decrypt);\n};\n\n/**\n * Updates a single block. Typically only used for testing.\n *\n * @param w the expanded key to use.\n * @param input an array of block-size 32-bit words.\n * @param output an array of block-size 32-bit words.\n * @param decrypt true to decrypt, false to encrypt.\n */\nforge.aes._updateBlock = _updateBlock;\n\n/** Register AES algorithms **/\n\nregisterAlgorithm('AES-ECB', forge.cipher.modes.ecb);\nregisterAlgorithm('AES-CBC', forge.cipher.modes.cbc);\nregisterAlgorithm('AES-CFB', forge.cipher.modes.cfb);\nregisterAlgorithm('AES-OFB', forge.cipher.modes.ofb);\nregisterAlgorithm('AES-CTR', forge.cipher.modes.ctr);\nregisterAlgorithm('AES-GCM', forge.cipher.modes.gcm);\n\nfunction registerAlgorithm(name, mode) {\n  var factory = function() {\n    return new forge.aes.Algorithm(name, mode);\n  };\n  forge.cipher.registerAlgorithm(name, factory);\n}\n\n/** AES implementation **/\n\nvar init = false; // not yet initialized\nvar Nb = 4;       // number of words comprising the state (AES = 4)\nvar sbox;         // non-linear substitution table used in key expansion\nvar isbox;        // inversion of sbox\nvar rcon;         // round constant word array\nvar mix;          // mix-columns table\nvar imix;         // inverse mix-columns table\n\n/**\n * Performs initialization, ie: precomputes tables to optimize for speed.\n *\n * One way to understand how AES works is to imagine that 'addition' and\n * 'multiplication' are interfaces that require certain mathematical\n * properties to hold true (ie: they are associative) but they might have\n * different implementations and produce different kinds of results ...\n * provided that their mathematical properties remain true. AES defines\n * its own methods of addition and multiplication but keeps some important\n * properties the same, ie: associativity and distributivity. The\n * explanation below tries to shed some light on how AES defines addition\n * and multiplication of bytes and 32-bit words in order to perform its\n * encryption and decryption algorithms.\n *\n * The basics:\n *\n * The AES algorithm views bytes as binary representations of polynomials\n * that have either 1 or 0 as the coefficients. It defines the addition\n * or subtraction of two bytes as the XOR operation. It also defines the\n * multiplication of two bytes as a finite field referred to as GF(2^8)\n * (Note: 'GF' means \"Galois Field\" which is a field that contains a finite\n * number of elements so GF(2^8) has 256 elements).\n *\n * This means that any two bytes can be represented as binary polynomials;\n * when they multiplied together and modularly reduced by an irreducible\n * polynomial of the 8th degree, the results are the field GF(2^8). The\n * specific irreducible polynomial that AES uses in hexadecimal is 0x11b.\n * This multiplication is associative with 0x01 as the identity:\n *\n * (b * 0x01 = GF(b, 0x01) = b).\n *\n * The operation GF(b, 0x02) can be performed at the byte level by left\n * shifting b once and then XOR'ing it (to perform the modular reduction)\n * with 0x11b if b is >= 128. Repeated application of the multiplication\n * of 0x02 can be used to implement the multiplication of any two bytes.\n *\n * For instance, multiplying 0x57 and 0x13, denoted as GF(0x57, 0x13), can\n * be performed by factoring 0x13 into 0x01, 0x02, and 0x10. Then these\n * factors can each be multiplied by 0x57 and then added together. To do\n * the multiplication, values for 0x57 multiplied by each of these 3 factors\n * can be precomputed and stored in a table. To add them, the values from\n * the table are XOR'd together.\n *\n * AES also defines addition and multiplication of words, that is 4-byte\n * numbers represented as polynomials of 3 degrees where the coefficients\n * are the values of the bytes.\n *\n * The word [a0, a1, a2, a3] is a polynomial a3x^3 + a2x^2 + a1x + a0.\n *\n * Addition is performed by XOR'ing like powers of x. Multiplication\n * is performed in two steps, the first is an algebriac expansion as\n * you would do normally (where addition is XOR). But the result is\n * a polynomial larger than 3 degrees and thus it cannot fit in a word. So\n * next the result is modularly reduced by an AES-specific polynomial of\n * degree 4 which will always produce a polynomial of less than 4 degrees\n * such that it will fit in a word. In AES, this polynomial is x^4 + 1.\n *\n * The modular product of two polynomials 'a' and 'b' is thus:\n *\n * d(x) = d3x^3 + d2x^2 + d1x + d0\n * with\n * d0 = GF(a0, b0) ^ GF(a3, b1) ^ GF(a2, b2) ^ GF(a1, b3)\n * d1 = GF(a1, b0) ^ GF(a0, b1) ^ GF(a3, b2) ^ GF(a2, b3)\n * d2 = GF(a2, b0) ^ GF(a1, b1) ^ GF(a0, b2) ^ GF(a3, b3)\n * d3 = GF(a3, b0) ^ GF(a2, b1) ^ GF(a1, b2) ^ GF(a0, b3)\n *\n * As a matrix:\n *\n * [d0] = [a0 a3 a2 a1][b0]\n * [d1]   [a1 a0 a3 a2][b1]\n * [d2]   [a2 a1 a0 a3][b2]\n * [d3]   [a3 a2 a1 a0][b3]\n *\n * Special polynomials defined by AES (0x02 == {02}):\n * a(x)    = {03}x^3 + {01}x^2 + {01}x + {02}\n * a^-1(x) = {0b}x^3 + {0d}x^2 + {09}x + {0e}.\n *\n * These polynomials are used in the MixColumns() and InverseMixColumns()\n * operations, respectively, to cause each element in the state to affect\n * the output (referred to as diffusing).\n *\n * RotWord() uses: a0 = a1 = a2 = {00} and a3 = {01}, which is the\n * polynomial x3.\n *\n * The ShiftRows() method modifies the last 3 rows in the state (where\n * the state is 4 words with 4 bytes per word) by shifting bytes cyclically.\n * The 1st byte in the second row is moved to the end of the row. The 1st\n * and 2nd bytes in the third row are moved to the end of the row. The 1st,\n * 2nd, and 3rd bytes are moved in the fourth row.\n *\n * More details on how AES arithmetic works:\n *\n * In the polynomial representation of binary numbers, XOR performs addition\n * and subtraction and multiplication in GF(2^8) denoted as GF(a, b)\n * corresponds with the multiplication of polynomials modulo an irreducible\n * polynomial of degree 8. In other words, for AES, GF(a, b) will multiply\n * polynomial 'a' with polynomial 'b' and then do a modular reduction by\n * an AES-specific irreducible polynomial of degree 8.\n *\n * A polynomial is irreducible if its only divisors are one and itself. For\n * the AES algorithm, this irreducible polynomial is:\n *\n * m(x) = x^8 + x^4 + x^3 + x + 1,\n *\n * or {01}{1b} in hexadecimal notation, where each coefficient is a bit:\n * 100011011 = 283 = 0x11b.\n *\n * For example, GF(0x57, 0x83) = 0xc1 because\n *\n * 0x57 = 87  = 01010111 = x^6 + x^4 + x^2 + x + 1\n * 0x85 = 131 = 10000101 = x^7 + x + 1\n *\n * (x^6 + x^4 + x^2 + x + 1) * (x^7 + x + 1)\n * =  x^13 + x^11 + x^9 + x^8 + x^7 +\n *    x^7 + x^5 + x^3 + x^2 + x +\n *    x^6 + x^4 + x^2 + x + 1\n * =  x^13 + x^11 + x^9 + x^8 + x^6 + x^5 + x^4 + x^3 + 1 = y\n *    y modulo (x^8 + x^4 + x^3 + x + 1)\n * =  x^7 + x^6 + 1.\n *\n * The modular reduction by m(x) guarantees the result will be a binary\n * polynomial of less than degree 8, so that it can fit in a byte.\n *\n * The operation to multiply a binary polynomial b with x (the polynomial\n * x in binary representation is 00000010) is:\n *\n * b_7x^8 + b_6x^7 + b_5x^6 + b_4x^5 + b_3x^4 + b_2x^3 + b_1x^2 + b_0x^1\n *\n * To get GF(b, x) we must reduce that by m(x). If b_7 is 0 (that is the\n * most significant bit is 0 in b) then the result is already reduced. If\n * it is 1, then we can reduce it by subtracting m(x) via an XOR.\n *\n * It follows that multiplication by x (00000010 or 0x02) can be implemented\n * by performing a left shift followed by a conditional bitwise XOR with\n * 0x1b. This operation on bytes is denoted by xtime(). Multiplication by\n * higher powers of x can be implemented by repeated application of xtime().\n *\n * By adding intermediate results, multiplication by any constant can be\n * implemented. For instance:\n *\n * GF(0x57, 0x13) = 0xfe because:\n *\n * xtime(b) = (b & 128) ? (b << 1 ^ 0x11b) : (b << 1)\n *\n * Note: We XOR with 0x11b instead of 0x1b because in javascript our\n * datatype for b can be larger than 1 byte, so a left shift will not\n * automatically eliminate bits that overflow a byte ... by XOR'ing the\n * overflow bit with 1 (the extra one from 0x11b) we zero it out.\n *\n * GF(0x57, 0x02) = xtime(0x57) = 0xae\n * GF(0x57, 0x04) = xtime(0xae) = 0x47\n * GF(0x57, 0x08) = xtime(0x47) = 0x8e\n * GF(0x57, 0x10) = xtime(0x8e) = 0x07\n *\n * GF(0x57, 0x13) = GF(0x57, (0x01 ^ 0x02 ^ 0x10))\n *\n * And by the distributive property (since XOR is addition and GF() is\n * multiplication):\n *\n * = GF(0x57, 0x01) ^ GF(0x57, 0x02) ^ GF(0x57, 0x10)\n * = 0x57 ^ 0xae ^ 0x07\n * = 0xfe.\n */\nfunction initialize() {\n  init = true;\n\n  /* Populate the Rcon table. These are the values given by\n    [x^(i-1),{00},{00},{00}] where x^(i-1) are powers of x (and x = 0x02)\n    in the field of GF(2^8), where i starts at 1.\n\n    rcon[0] = [0x00, 0x00, 0x00, 0x00]\n    rcon[1] = [0x01, 0x00, 0x00, 0x00] 2^(1-1) = 2^0 = 1\n    rcon[2] = [0x02, 0x00, 0x00, 0x00] 2^(2-1) = 2^1 = 2\n    ...\n    rcon[9]  = [0x1B, 0x00, 0x00, 0x00] 2^(9-1)  = 2^8 = 0x1B\n    rcon[10] = [0x36, 0x00, 0x00, 0x00] 2^(10-1) = 2^9 = 0x36\n\n    We only store the first byte because it is the only one used.\n  */\n  rcon = [0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1B, 0x36];\n\n  // compute xtime table which maps i onto GF(i, 0x02)\n  var xtime = new Array(256);\n  for(var i = 0; i < 128; ++i) {\n    xtime[i] = i << 1;\n    xtime[i + 128] = (i + 128) << 1 ^ 0x11B;\n  }\n\n  // compute all other tables\n  sbox = new Array(256);\n  isbox = new Array(256);\n  mix = new Array(4);\n  imix = new Array(4);\n  for(var i = 0; i < 4; ++i) {\n    mix[i] = new Array(256);\n    imix[i] = new Array(256);\n  }\n  var e = 0, ei = 0, e2, e4, e8, sx, sx2, me, ime;\n  for(var i = 0; i < 256; ++i) {\n    /* We need to generate the SubBytes() sbox and isbox tables so that\n      we can perform byte substitutions. This requires us to traverse\n      all of the elements in GF, find their multiplicative inverses,\n      and apply to each the following affine transformation:\n\n      bi' = bi ^ b(i + 4) mod 8 ^ b(i + 5) mod 8 ^ b(i + 6) mod 8 ^\n            b(i + 7) mod 8 ^ ci\n      for 0 <= i < 8, where bi is the ith bit of the byte, and ci is the\n      ith bit of a byte c with the value {63} or {01100011}.\n\n      It is possible to traverse every possible value in a Galois field\n      using what is referred to as a 'generator'. There are many\n      generators (128 out of 256): 3,5,6,9,11,82 to name a few. To fully\n      traverse GF we iterate 255 times, multiplying by our generator\n      each time.\n\n      On each iteration we can determine the multiplicative inverse for\n      the current element.\n\n      Suppose there is an element in GF 'e'. For a given generator 'g',\n      e = g^x. The multiplicative inverse of e is g^(255 - x). It turns\n      out that if use the inverse of a generator as another generator\n      it will produce all of the corresponding multiplicative inverses\n      at the same time. For this reason, we choose 5 as our inverse\n      generator because it only requires 2 multiplies and 1 add and its\n      inverse, 82, requires relatively few operations as well.\n\n      In order to apply the affine transformation, the multiplicative\n      inverse 'ei' of 'e' can be repeatedly XOR'd (4 times) with a\n      bit-cycling of 'ei'. To do this 'ei' is first stored in 's' and\n      'x'. Then 's' is left shifted and the high bit of 's' is made the\n      low bit. The resulting value is stored in 's'. Then 'x' is XOR'd\n      with 's' and stored in 'x'. On each subsequent iteration the same\n      operation is performed. When 4 iterations are complete, 'x' is\n      XOR'd with 'c' (0x63) and the transformed value is stored in 'x'.\n      For example:\n\n      s = 01000001\n      x = 01000001\n\n      iteration 1: s = 10000010, x ^= s\n      iteration 2: s = 00000101, x ^= s\n      iteration 3: s = 00001010, x ^= s\n      iteration 4: s = 00010100, x ^= s\n      x ^= 0x63\n\n      This can be done with a loop where s = (s << 1) | (s >> 7). However,\n      it can also be done by using a single 16-bit (in this case 32-bit)\n      number 'sx'. Since XOR is an associative operation, we can set 'sx'\n      to 'ei' and then XOR it with 'sx' left-shifted 1,2,3, and 4 times.\n      The most significant bits will flow into the high 8 bit positions\n      and be correctly XOR'd with one another. All that remains will be\n      to cycle the high 8 bits by XOR'ing them all with the lower 8 bits\n      afterwards.\n\n      At the same time we're populating sbox and isbox we can precompute\n      the multiplication we'll need to do to do MixColumns() later.\n    */\n\n    // apply affine transformation\n    sx = ei ^ (ei << 1) ^ (ei << 2) ^ (ei << 3) ^ (ei << 4);\n    sx = (sx >> 8) ^ (sx & 255) ^ 0x63;\n\n    // update tables\n    sbox[e] = sx;\n    isbox[sx] = e;\n\n    /* Mixing columns is done using matrix multiplication. The columns\n      that are to be mixed are each a single word in the current state.\n      The state has Nb columns (4 columns). Therefore each column is a\n      4 byte word. So to mix the columns in a single column 'c' where\n      its rows are r0, r1, r2, and r3, we use the following matrix\n      multiplication:\n\n      [2 3 1 1]*[r0,c]=[r'0,c]\n      [1 2 3 1] [r1,c] [r'1,c]\n      [1 1 2 3] [r2,c] [r'2,c]\n      [3 1 1 2] [r3,c] [r'3,c]\n\n      r0, r1, r2, and r3 are each 1 byte of one of the words in the\n      state (a column). To do matrix multiplication for each mixed\n      column c' we multiply the corresponding row from the left matrix\n      with the corresponding column from the right matrix. In total, we\n      get 4 equations:\n\n      r0,c' = 2*r0,c + 3*r1,c + 1*r2,c + 1*r3,c\n      r1,c' = 1*r0,c + 2*r1,c + 3*r2,c + 1*r3,c\n      r2,c' = 1*r0,c + 1*r1,c + 2*r2,c + 3*r3,c\n      r3,c' = 3*r0,c + 1*r1,c + 1*r2,c + 2*r3,c\n\n      As usual, the multiplication is as previously defined and the\n      addition is XOR. In order to optimize mixing columns we can store\n      the multiplication results in tables. If you think of the whole\n      column as a word (it might help to visualize by mentally rotating\n      the equations above by counterclockwise 90 degrees) then you can\n      see that it would be useful to map the multiplications performed on\n      each byte (r0, r1, r2, r3) onto a word as well. For instance, we\n      could map 2*r0,1*r0,1*r0,3*r0 onto a word by storing 2*r0 in the\n      highest 8 bits and 3*r0 in the lowest 8 bits (with the other two\n      respectively in the middle). This means that a table can be\n      constructed that uses r0 as an index to the word. We can do the\n      same with r1, r2, and r3, creating a total of 4 tables.\n\n      To construct a full c', we can just look up each byte of c in\n      their respective tables and XOR the results together.\n\n      Also, to build each table we only have to calculate the word\n      for 2,1,1,3 for every byte ... which we can do on each iteration\n      of this loop since we will iterate over every byte. After we have\n      calculated 2,1,1,3 we can get the results for the other tables\n      by cycling the byte at the end to the beginning. For instance\n      we can take the result of table 2,1,1,3 and produce table 3,2,1,1\n      by moving the right most byte to the left most position just like\n      how you can imagine the 3 moved out of 2,1,1,3 and to the front\n      to produce 3,2,1,1.\n\n      There is another optimization in that the same multiples of\n      the current element we need in order to advance our generator\n      to the next iteration can be reused in performing the 2,1,1,3\n      calculation. We also calculate the inverse mix column tables,\n      with e,9,d,b being the inverse of 2,1,1,3.\n\n      When we're done, and we need to actually mix columns, the first\n      byte of each state word should be put through mix[0] (2,1,1,3),\n      the second through mix[1] (3,2,1,1) and so forth. Then they should\n      be XOR'd together to produce the fully mixed column.\n    */\n\n    // calculate mix and imix table values\n    sx2 = xtime[sx];\n    e2 = xtime[e];\n    e4 = xtime[e2];\n    e8 = xtime[e4];\n    me =\n      (sx2 << 24) ^  // 2\n      (sx << 16) ^   // 1\n      (sx << 8) ^    // 1\n      (sx ^ sx2);    // 3\n    ime =\n      (e2 ^ e4 ^ e8) << 24 ^  // E (14)\n      (e ^ e8) << 16 ^        // 9\n      (e ^ e4 ^ e8) << 8 ^    // D (13)\n      (e ^ e2 ^ e8);          // B (11)\n    // produce each of the mix tables by rotating the 2,1,1,3 value\n    for(var n = 0; n < 4; ++n) {\n      mix[n][e] = me;\n      imix[n][sx] = ime;\n      // cycle the right most byte to the left most position\n      // ie: 2,1,1,3 becomes 3,2,1,1\n      me = me << 24 | me >>> 8;\n      ime = ime << 24 | ime >>> 8;\n    }\n\n    // get next element and inverse\n    if(e === 0) {\n      // 1 is the inverse of 1\n      e = ei = 1;\n    } else {\n      // e = 2e + 2*2*2*(10e)) = multiply e by 82 (chosen generator)\n      // ei = ei + 2*2*ei = multiply ei by 5 (inverse generator)\n      e = e2 ^ xtime[xtime[xtime[e2 ^ e8]]];\n      ei ^= xtime[xtime[ei]];\n    }\n  }\n}\n\n/**\n * Generates a key schedule using the AES key expansion algorithm.\n *\n * The AES algorithm takes the Cipher Key, K, and performs a Key Expansion\n * routine to generate a key schedule. The Key Expansion generates a total\n * of Nb*(Nr + 1) words: the algorithm requires an initial set of Nb words,\n * and each of the Nr rounds requires Nb words of key data. The resulting\n * key schedule consists of a linear array of 4-byte words, denoted [wi ],\n * with i in the range 0 <= i < Nb(Nr + 1).\n *\n * KeyExpansion(byte key[4*Nk], word w[Nb*(Nr+1)], Nk)\n * AES-128 (Nb=4, Nk=4, Nr=10)\n * AES-192 (Nb=4, Nk=6, Nr=12)\n * AES-256 (Nb=4, Nk=8, Nr=14)\n * Note: Nr=Nk+6.\n *\n * Nb is the number of columns (32-bit words) comprising the State (or\n * number of bytes in a block). For AES, Nb=4.\n *\n * @param key the key to schedule (as an array of 32-bit words).\n * @param decrypt true to modify the key schedule to decrypt, false not to.\n *\n * @return the generated key schedule.\n */\nfunction _expandKey(key, decrypt) {\n  // copy the key's words to initialize the key schedule\n  var w = key.slice(0);\n\n  /* RotWord() will rotate a word, moving the first byte to the last\n    byte's position (shifting the other bytes left).\n\n    We will be getting the value of Rcon at i / Nk. 'i' will iterate\n    from Nk to (Nb * Nr+1). Nk = 4 (4 byte key), Nb = 4 (4 words in\n    a block), Nr = Nk + 6 (10). Therefore 'i' will iterate from\n    4 to 44 (exclusive). Each time we iterate 4 times, i / Nk will\n    increase by 1. We use a counter iNk to keep track of this.\n   */\n\n  // go through the rounds expanding the key\n  var temp, iNk = 1;\n  var Nk = w.length;\n  var Nr1 = Nk + 6 + 1;\n  var end = Nb * Nr1;\n  for(var i = Nk; i < end; ++i) {\n    temp = w[i - 1];\n    if(i % Nk === 0) {\n      // temp = SubWord(RotWord(temp)) ^ Rcon[i / Nk]\n      temp =\n        sbox[temp >>> 16 & 255] << 24 ^\n        sbox[temp >>> 8 & 255] << 16 ^\n        sbox[temp & 255] << 8 ^\n        sbox[temp >>> 24] ^ (rcon[iNk] << 24);\n      iNk++;\n    } else if(Nk > 6 && (i % Nk === 4)) {\n      // temp = SubWord(temp)\n      temp =\n        sbox[temp >>> 24] << 24 ^\n        sbox[temp >>> 16 & 255] << 16 ^\n        sbox[temp >>> 8 & 255] << 8 ^\n        sbox[temp & 255];\n    }\n    w[i] = w[i - Nk] ^ temp;\n  }\n\n  /* When we are updating a cipher block we always use the code path for\n     encryption whether we are decrypting or not (to shorten code and\n     simplify the generation of look up tables). However, because there\n     are differences in the decryption algorithm, other than just swapping\n     in different look up tables, we must transform our key schedule to\n     account for these changes:\n\n     1. The decryption algorithm gets its key rounds in reverse order.\n     2. The decryption algorithm adds the round key before mixing columns\n       instead of afterwards.\n\n     We don't need to modify our key schedule to handle the first case,\n     we can just traverse the key schedule in reverse order when decrypting.\n\n     The second case requires a little work.\n\n     The tables we built for performing rounds will take an input and then\n     perform SubBytes() and MixColumns() or, for the decrypt version,\n     InvSubBytes() and InvMixColumns(). But the decrypt algorithm requires\n     us to AddRoundKey() before InvMixColumns(). This means we'll need to\n     apply some transformations to the round key to inverse-mix its columns\n     so they'll be correct for moving AddRoundKey() to after the state has\n     had its columns inverse-mixed.\n\n     To inverse-mix the columns of the state when we're decrypting we use a\n     lookup table that will apply InvSubBytes() and InvMixColumns() at the\n     same time. However, the round key's bytes are not inverse-substituted\n     in the decryption algorithm. To get around this problem, we can first\n     substitute the bytes in the round key so that when we apply the\n     transformation via the InvSubBytes()+InvMixColumns() table, it will\n     undo our substitution leaving us with the original value that we\n     want -- and then inverse-mix that value.\n\n     This change will correctly alter our key schedule so that we can XOR\n     each round key with our already transformed decryption state. This\n     allows us to use the same code path as the encryption algorithm.\n\n     We make one more change to the decryption key. Since the decryption\n     algorithm runs in reverse from the encryption algorithm, we reverse\n     the order of the round keys to avoid having to iterate over the key\n     schedule backwards when running the encryption algorithm later in\n     decryption mode. In addition to reversing the order of the round keys,\n     we also swap each round key's 2nd and 4th rows. See the comments\n     section where rounds are performed for more details about why this is\n     done. These changes are done inline with the other substitution\n     described above.\n  */\n  if(decrypt) {\n    var tmp;\n    var m0 = imix[0];\n    var m1 = imix[1];\n    var m2 = imix[2];\n    var m3 = imix[3];\n    var wnew = w.slice(0);\n    end = w.length;\n    for(var i = 0, wi = end - Nb; i < end; i += Nb, wi -= Nb) {\n      // do not sub the first or last round key (round keys are Nb\n      // words) as no column mixing is performed before they are added,\n      // but do change the key order\n      if(i === 0 || i === (end - Nb)) {\n        wnew[i] = w[wi];\n        wnew[i + 1] = w[wi + 3];\n        wnew[i + 2] = w[wi + 2];\n        wnew[i + 3] = w[wi + 1];\n      } else {\n        // substitute each round key byte because the inverse-mix\n        // table will inverse-substitute it (effectively cancel the\n        // substitution because round key bytes aren't sub'd in\n        // decryption mode) and swap indexes 3 and 1\n        for(var n = 0; n < Nb; ++n) {\n          tmp = w[wi + n];\n          wnew[i + (3&-n)] =\n            m0[sbox[tmp >>> 24]] ^\n            m1[sbox[tmp >>> 16 & 255]] ^\n            m2[sbox[tmp >>> 8 & 255]] ^\n            m3[sbox[tmp & 255]];\n        }\n      }\n    }\n    w = wnew;\n  }\n\n  return w;\n}\n\n/**\n * Updates a single block (16 bytes) using AES. The update will either\n * encrypt or decrypt the block.\n *\n * @param w the key schedule.\n * @param input the input block (an array of 32-bit words).\n * @param output the updated output block.\n * @param decrypt true to decrypt the block, false to encrypt it.\n */\nfunction _updateBlock(w, input, output, decrypt) {\n  /*\n  Cipher(byte in[4*Nb], byte out[4*Nb], word w[Nb*(Nr+1)])\n  begin\n    byte state[4,Nb]\n    state = in\n    AddRoundKey(state, w[0, Nb-1])\n    for round = 1 step 1 to Nr-1\n      SubBytes(state)\n      ShiftRows(state)\n      MixColumns(state)\n      AddRoundKey(state, w[round*Nb, (round+1)*Nb-1])\n    end for\n    SubBytes(state)\n    ShiftRows(state)\n    AddRoundKey(state, w[Nr*Nb, (Nr+1)*Nb-1])\n    out = state\n  end\n\n  InvCipher(byte in[4*Nb], byte out[4*Nb], word w[Nb*(Nr+1)])\n  begin\n    byte state[4,Nb]\n    state = in\n    AddRoundKey(state, w[Nr*Nb, (Nr+1)*Nb-1])\n    for round = Nr-1 step -1 downto 1\n      InvShiftRows(state)\n      InvSubBytes(state)\n      AddRoundKey(state, w[round*Nb, (round+1)*Nb-1])\n      InvMixColumns(state)\n    end for\n    InvShiftRows(state)\n    InvSubBytes(state)\n    AddRoundKey(state, w[0, Nb-1])\n    out = state\n  end\n  */\n\n  // Encrypt: AddRoundKey(state, w[0, Nb-1])\n  // Decrypt: AddRoundKey(state, w[Nr*Nb, (Nr+1)*Nb-1])\n  var Nr = w.length / 4 - 1;\n  var m0, m1, m2, m3, sub;\n  if(decrypt) {\n    m0 = imix[0];\n    m1 = imix[1];\n    m2 = imix[2];\n    m3 = imix[3];\n    sub = isbox;\n  } else {\n    m0 = mix[0];\n    m1 = mix[1];\n    m2 = mix[2];\n    m3 = mix[3];\n    sub = sbox;\n  }\n  var a, b, c, d, a2, b2, c2;\n  a = input[0] ^ w[0];\n  b = input[decrypt ? 3 : 1] ^ w[1];\n  c = input[2] ^ w[2];\n  d = input[decrypt ? 1 : 3] ^ w[3];\n  var i = 3;\n\n  /* In order to share code we follow the encryption algorithm when both\n    encrypting and decrypting. To account for the changes required in the\n    decryption algorithm, we use different lookup tables when decrypting\n    and use a modified key schedule to account for the difference in the\n    order of transformations applied when performing rounds. We also get\n    key rounds in reverse order (relative to encryption). */\n  for(var round = 1; round < Nr; ++round) {\n    /* As described above, we'll be using table lookups to perform the\n      column mixing. Each column is stored as a word in the state (the\n      array 'input' has one column as a word at each index). In order to\n      mix a column, we perform these transformations on each row in c,\n      which is 1 byte in each word. The new column for c0 is c'0:\n\n               m0      m1      m2      m3\n      r0,c'0 = 2*r0,c0 + 3*r1,c0 + 1*r2,c0 + 1*r3,c0\n      r1,c'0 = 1*r0,c0 + 2*r1,c0 + 3*r2,c0 + 1*r3,c0\n      r2,c'0 = 1*r0,c0 + 1*r1,c0 + 2*r2,c0 + 3*r3,c0\n      r3,c'0 = 3*r0,c0 + 1*r1,c0 + 1*r2,c0 + 2*r3,c0\n\n      So using mix tables where c0 is a word with r0 being its upper\n      8 bits and r3 being its lower 8 bits:\n\n      m0[c0 >> 24] will yield this word: [2*r0,1*r0,1*r0,3*r0]\n      ...\n      m3[c0 & 255] will yield this word: [1*r3,1*r3,3*r3,2*r3]\n\n      Therefore to mix the columns in each word in the state we\n      do the following (& 255 omitted for brevity):\n      c'0,r0 = m0[c0 >> 24] ^ m1[c1 >> 16] ^ m2[c2 >> 8] ^ m3[c3]\n      c'0,r1 = m0[c0 >> 24] ^ m1[c1 >> 16] ^ m2[c2 >> 8] ^ m3[c3]\n      c'0,r2 = m0[c0 >> 24] ^ m1[c1 >> 16] ^ m2[c2 >> 8] ^ m3[c3]\n      c'0,r3 = m0[c0 >> 24] ^ m1[c1 >> 16] ^ m2[c2 >> 8] ^ m3[c3]\n\n      However, before mixing, the algorithm requires us to perform\n      ShiftRows(). The ShiftRows() transformation cyclically shifts the\n      last 3 rows of the state over different offsets. The first row\n      (r = 0) is not shifted.\n\n      s'_r,c = s_r,(c + shift(r, Nb) mod Nb\n      for 0 < r < 4 and 0 <= c < Nb and\n      shift(1, 4) = 1\n      shift(2, 4) = 2\n      shift(3, 4) = 3.\n\n      This causes the first byte in r = 1 to be moved to the end of\n      the row, the first 2 bytes in r = 2 to be moved to the end of\n      the row, the first 3 bytes in r = 3 to be moved to the end of\n      the row:\n\n      r1: [c0 c1 c2 c3] => [c1 c2 c3 c0]\n      r2: [c0 c1 c2 c3]    [c2 c3 c0 c1]\n      r3: [c0 c1 c2 c3]    [c3 c0 c1 c2]\n\n      We can make these substitutions inline with our column mixing to\n      generate an updated set of equations to produce each word in the\n      state (note the columns have changed positions):\n\n      c0 c1 c2 c3 => c0 c1 c2 c3\n      c0 c1 c2 c3    c1 c2 c3 c0  (cycled 1 byte)\n      c0 c1 c2 c3    c2 c3 c0 c1  (cycled 2 bytes)\n      c0 c1 c2 c3    c3 c0 c1 c2  (cycled 3 bytes)\n\n      Therefore:\n\n      c'0 = 2*r0,c0 + 3*r1,c1 + 1*r2,c2 + 1*r3,c3\n      c'0 = 1*r0,c0 + 2*r1,c1 + 3*r2,c2 + 1*r3,c3\n      c'0 = 1*r0,c0 + 1*r1,c1 + 2*r2,c2 + 3*r3,c3\n      c'0 = 3*r0,c0 + 1*r1,c1 + 1*r2,c2 + 2*r3,c3\n\n      c'1 = 2*r0,c1 + 3*r1,c2 + 1*r2,c3 + 1*r3,c0\n      c'1 = 1*r0,c1 + 2*r1,c2 + 3*r2,c3 + 1*r3,c0\n      c'1 = 1*r0,c1 + 1*r1,c2 + 2*r2,c3 + 3*r3,c0\n      c'1 = 3*r0,c1 + 1*r1,c2 + 1*r2,c3 + 2*r3,c0\n\n      ... and so forth for c'2 and c'3. The important distinction is\n      that the columns are cycling, with c0 being used with the m0\n      map when calculating c0, but c1 being used with the m0 map when\n      calculating c1 ... and so forth.\n\n      When performing the inverse we transform the mirror image and\n      skip the bottom row, instead of the top one, and move upwards:\n\n      c3 c2 c1 c0 => c0 c3 c2 c1  (cycled 3 bytes) *same as encryption\n      c3 c2 c1 c0    c1 c0 c3 c2  (cycled 2 bytes)\n      c3 c2 c1 c0    c2 c1 c0 c3  (cycled 1 byte)  *same as encryption\n      c3 c2 c1 c0    c3 c2 c1 c0\n\n      If you compare the resulting matrices for ShiftRows()+MixColumns()\n      and for InvShiftRows()+InvMixColumns() the 2nd and 4th columns are\n      different (in encrypt mode vs. decrypt mode). So in order to use\n      the same code to handle both encryption and decryption, we will\n      need to do some mapping.\n\n      If in encryption mode we let a=c0, b=c1, c=c2, d=c3, and r<N> be\n      a row number in the state, then the resulting matrix in encryption\n      mode for applying the above transformations would be:\n\n      r1: a b c d\n      r2: b c d a\n      r3: c d a b\n      r4: d a b c\n\n      If we did the same in decryption mode we would get:\n\n      r1: a d c b\n      r2: b a d c\n      r3: c b a d\n      r4: d c b a\n\n      If instead we swap d and b (set b=c3 and d=c1), then we get:\n\n      r1: a b c d\n      r2: d a b c\n      r3: c d a b\n      r4: b c d a\n\n      Now the 1st and 3rd rows are the same as the encryption matrix. All\n      we need to do then to make the mapping exactly the same is to swap\n      the 2nd and 4th rows when in decryption mode. To do this without\n      having to do it on each iteration, we swapped the 2nd and 4th rows\n      in the decryption key schedule. We also have to do the swap above\n      when we first pull in the input and when we set the final output. */\n    a2 =\n      m0[a >>> 24] ^\n      m1[b >>> 16 & 255] ^\n      m2[c >>> 8 & 255] ^\n      m3[d & 255] ^ w[++i];\n    b2 =\n      m0[b >>> 24] ^\n      m1[c >>> 16 & 255] ^\n      m2[d >>> 8 & 255] ^\n      m3[a & 255] ^ w[++i];\n    c2 =\n      m0[c >>> 24] ^\n      m1[d >>> 16 & 255] ^\n      m2[a >>> 8 & 255] ^\n      m3[b & 255] ^ w[++i];\n    d =\n      m0[d >>> 24] ^\n      m1[a >>> 16 & 255] ^\n      m2[b >>> 8 & 255] ^\n      m3[c & 255] ^ w[++i];\n    a = a2;\n    b = b2;\n    c = c2;\n  }\n\n  /*\n    Encrypt:\n    SubBytes(state)\n    ShiftRows(state)\n    AddRoundKey(state, w[Nr*Nb, (Nr+1)*Nb-1])\n\n    Decrypt:\n    InvShiftRows(state)\n    InvSubBytes(state)\n    AddRoundKey(state, w[0, Nb-1])\n   */\n  // Note: rows are shifted inline\n  output[0] =\n    (sub[a >>> 24] << 24) ^\n    (sub[b >>> 16 & 255] << 16) ^\n    (sub[c >>> 8 & 255] << 8) ^\n    (sub[d & 255]) ^ w[++i];\n  output[decrypt ? 3 : 1] =\n    (sub[b >>> 24] << 24) ^\n    (sub[c >>> 16 & 255] << 16) ^\n    (sub[d >>> 8 & 255] << 8) ^\n    (sub[a & 255]) ^ w[++i];\n  output[2] =\n    (sub[c >>> 24] << 24) ^\n    (sub[d >>> 16 & 255] << 16) ^\n    (sub[a >>> 8 & 255] << 8) ^\n    (sub[b & 255]) ^ w[++i];\n  output[decrypt ? 1 : 3] =\n    (sub[d >>> 24] << 24) ^\n    (sub[a >>> 16 & 255] << 16) ^\n    (sub[b >>> 8 & 255] << 8) ^\n    (sub[c & 255]) ^ w[++i];\n}\n\n/**\n * Deprecated. Instead, use:\n *\n * forge.cipher.createCipher('AES-<mode>', key);\n * forge.cipher.createDecipher('AES-<mode>', key);\n *\n * Creates a deprecated AES cipher object. This object's mode will default to\n * CBC (cipher-block-chaining).\n *\n * The key and iv may be given as a string of bytes, an array of bytes, a\n * byte buffer, or an array of 32-bit words.\n *\n * @param options the options to use.\n *          key the symmetric key to use.\n *          output the buffer to write to.\n *          decrypt true for decryption, false for encryption.\n *          mode the cipher mode to use (default: 'CBC').\n *\n * @return the cipher.\n */\nfunction _createCipher(options) {\n  options = options || {};\n  var mode = (options.mode || 'CBC').toUpperCase();\n  var algorithm = 'AES-' + mode;\n\n  var cipher;\n  if(options.decrypt) {\n    cipher = forge.cipher.createDecipher(algorithm, options.key);\n  } else {\n    cipher = forge.cipher.createCipher(algorithm, options.key);\n  }\n\n  // backwards compatible start API\n  var start = cipher.start;\n  cipher.start = function(iv, options) {\n    // backwards compatibility: support second arg as output buffer\n    var output = null;\n    if(options instanceof forge.util.ByteBuffer) {\n      output = options;\n      options = {};\n    }\n    options = options || {};\n    options.output = output;\n    options.iv = iv;\n    start.call(cipher, options);\n  };\n\n  return cipher;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjIuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbm9kZS1mb3JnZS9saWIvYWVzLmpzPzAwNjkiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBBZHZhbmNlZCBFbmNyeXB0aW9uIFN0YW5kYXJkIChBRVMpIGltcGxlbWVudGF0aW9uLlxuICpcbiAqIFRoaXMgaW1wbGVtZW50YXRpb24gaXMgYmFzZWQgb24gdGhlIHB1YmxpYyBkb21haW4gbGlicmFyeSAnanNjcnlwdG8nIHdoaWNoXG4gKiB3YXMgd3JpdHRlbiBieTpcbiAqXG4gKiBFbWlseSBTdGFyayAoZXN0YXJrQHN0YW5mb3JkLmVkdSlcbiAqIE1pa2UgSGFtYnVyZyAobWhhbWJ1cmdAc3RhbmZvcmQuZWR1KVxuICogRGFuIEJvbmVoIChkYWJvQGNzLnN0YW5mb3JkLmVkdSlcbiAqXG4gKiBQYXJ0cyBvZiB0aGlzIGNvZGUgYXJlIGJhc2VkIG9uIHRoZSBPcGVuU1NMIGltcGxlbWVudGF0aW9uIG9mIEFFUzpcbiAqIGh0dHA6Ly93d3cub3BlbnNzbC5vcmdcbiAqXG4gKiBAYXV0aG9yIERhdmUgTG9uZ2xleVxuICpcbiAqIENvcHlyaWdodCAoYykgMjAxMC0yMDE0IERpZ2l0YWwgQmF6YWFyLCBJbmMuXG4gKi9cbnZhciBmb3JnZSA9IHJlcXVpcmUoJy4vZm9yZ2UnKTtcbnJlcXVpcmUoJy4vY2lwaGVyJyk7XG5yZXF1aXJlKCcuL2NpcGhlck1vZGVzJyk7XG5yZXF1aXJlKCcuL3V0aWwnKTtcblxuLyogQUVTIEFQSSAqL1xubW9kdWxlLmV4cG9ydHMgPSBmb3JnZS5hZXMgPSBmb3JnZS5hZXMgfHwge307XG5cbi8qKlxuICogRGVwcmVjYXRlZC4gSW5zdGVhZCwgdXNlOlxuICpcbiAqIHZhciBjaXBoZXIgPSBmb3JnZS5jaXBoZXIuY3JlYXRlQ2lwaGVyKCdBRVMtPG1vZGU+Jywga2V5KTtcbiAqIGNpcGhlci5zdGFydCh7aXY6IGl2fSk7XG4gKlxuICogQ3JlYXRlcyBhbiBBRVMgY2lwaGVyIG9iamVjdCB0byBlbmNyeXB0IGRhdGEgdXNpbmcgdGhlIGdpdmVuIHN5bW1ldHJpYyBrZXkuXG4gKiBUaGUgb3V0cHV0IHdpbGwgYmUgc3RvcmVkIGluIHRoZSAnb3V0cHV0JyBtZW1iZXIgb2YgdGhlIHJldHVybmVkIGNpcGhlci5cbiAqXG4gKiBUaGUga2V5IGFuZCBpdiBtYXkgYmUgZ2l2ZW4gYXMgYSBzdHJpbmcgb2YgYnl0ZXMsIGFuIGFycmF5IG9mIGJ5dGVzLFxuICogYSBieXRlIGJ1ZmZlciwgb3IgYW4gYXJyYXkgb2YgMzItYml0IHdvcmRzLlxuICpcbiAqIEBwYXJhbSBrZXkgdGhlIHN5bW1ldHJpYyBrZXkgdG8gdXNlLlxuICogQHBhcmFtIGl2IHRoZSBpbml0aWFsaXphdGlvbiB2ZWN0b3IgdG8gdXNlLlxuICogQHBhcmFtIG91dHB1dCB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvLCBudWxsIHRvIGNyZWF0ZSBvbmUuXG4gKiBAcGFyYW0gbW9kZSB0aGUgY2lwaGVyIG1vZGUgdG8gdXNlIChkZWZhdWx0OiAnQ0JDJykuXG4gKlxuICogQHJldHVybiB0aGUgY2lwaGVyLlxuICovXG5mb3JnZS5hZXMuc3RhcnRFbmNyeXB0aW5nID0gZnVuY3Rpb24oa2V5LCBpdiwgb3V0cHV0LCBtb2RlKSB7XG4gIHZhciBjaXBoZXIgPSBfY3JlYXRlQ2lwaGVyKHtcbiAgICBrZXk6IGtleSxcbiAgICBvdXRwdXQ6IG91dHB1dCxcbiAgICBkZWNyeXB0OiBmYWxzZSxcbiAgICBtb2RlOiBtb2RlXG4gIH0pO1xuICBjaXBoZXIuc3RhcnQoaXYpO1xuICByZXR1cm4gY2lwaGVyO1xufTtcblxuLyoqXG4gKiBEZXByZWNhdGVkLiBJbnN0ZWFkLCB1c2U6XG4gKlxuICogdmFyIGNpcGhlciA9IGZvcmdlLmNpcGhlci5jcmVhdGVDaXBoZXIoJ0FFUy08bW9kZT4nLCBrZXkpO1xuICpcbiAqIENyZWF0ZXMgYW4gQUVTIGNpcGhlciBvYmplY3QgdG8gZW5jcnlwdCBkYXRhIHVzaW5nIHRoZSBnaXZlbiBzeW1tZXRyaWMga2V5LlxuICpcbiAqIFRoZSBrZXkgbWF5IGJlIGdpdmVuIGFzIGEgc3RyaW5nIG9mIGJ5dGVzLCBhbiBhcnJheSBvZiBieXRlcywgYVxuICogYnl0ZSBidWZmZXIsIG9yIGFuIGFycmF5IG9mIDMyLWJpdCB3b3Jkcy5cbiAqXG4gKiBAcGFyYW0ga2V5IHRoZSBzeW1tZXRyaWMga2V5IHRvIHVzZS5cbiAqIEBwYXJhbSBtb2RlIHRoZSBjaXBoZXIgbW9kZSB0byB1c2UgKGRlZmF1bHQ6ICdDQkMnKS5cbiAqXG4gKiBAcmV0dXJuIHRoZSBjaXBoZXIuXG4gKi9cbmZvcmdlLmFlcy5jcmVhdGVFbmNyeXB0aW9uQ2lwaGVyID0gZnVuY3Rpb24oa2V5LCBtb2RlKSB7XG4gIHJldHVybiBfY3JlYXRlQ2lwaGVyKHtcbiAgICBrZXk6IGtleSxcbiAgICBvdXRwdXQ6IG51bGwsXG4gICAgZGVjcnlwdDogZmFsc2UsXG4gICAgbW9kZTogbW9kZVxuICB9KTtcbn07XG5cbi8qKlxuICogRGVwcmVjYXRlZC4gSW5zdGVhZCwgdXNlOlxuICpcbiAqIHZhciBkZWNpcGhlciA9IGZvcmdlLmNpcGhlci5jcmVhdGVEZWNpcGhlcignQUVTLTxtb2RlPicsIGtleSk7XG4gKiBkZWNpcGhlci5zdGFydCh7aXY6IGl2fSk7XG4gKlxuICogQ3JlYXRlcyBhbiBBRVMgY2lwaGVyIG9iamVjdCB0byBkZWNyeXB0IGRhdGEgdXNpbmcgdGhlIGdpdmVuIHN5bW1ldHJpYyBrZXkuXG4gKiBUaGUgb3V0cHV0IHdpbGwgYmUgc3RvcmVkIGluIHRoZSAnb3V0cHV0JyBtZW1iZXIgb2YgdGhlIHJldHVybmVkIGNpcGhlci5cbiAqXG4gKiBUaGUga2V5IGFuZCBpdiBtYXkgYmUgZ2l2ZW4gYXMgYSBzdHJpbmcgb2YgYnl0ZXMsIGFuIGFycmF5IG9mIGJ5dGVzLFxuICogYSBieXRlIGJ1ZmZlciwgb3IgYW4gYXJyYXkgb2YgMzItYml0IHdvcmRzLlxuICpcbiAqIEBwYXJhbSBrZXkgdGhlIHN5bW1ldHJpYyBrZXkgdG8gdXNlLlxuICogQHBhcmFtIGl2IHRoZSBpbml0aWFsaXphdGlvbiB2ZWN0b3IgdG8gdXNlLlxuICogQHBhcmFtIG91dHB1dCB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvLCBudWxsIHRvIGNyZWF0ZSBvbmUuXG4gKiBAcGFyYW0gbW9kZSB0aGUgY2lwaGVyIG1vZGUgdG8gdXNlIChkZWZhdWx0OiAnQ0JDJykuXG4gKlxuICogQHJldHVybiB0aGUgY2lwaGVyLlxuICovXG5mb3JnZS5hZXMuc3RhcnREZWNyeXB0aW5nID0gZnVuY3Rpb24oa2V5LCBpdiwgb3V0cHV0LCBtb2RlKSB7XG4gIHZhciBjaXBoZXIgPSBfY3JlYXRlQ2lwaGVyKHtcbiAgICBrZXk6IGtleSxcbiAgICBvdXRwdXQ6IG91dHB1dCxcbiAgICBkZWNyeXB0OiB0cnVlLFxuICAgIG1vZGU6IG1vZGVcbiAgfSk7XG4gIGNpcGhlci5zdGFydChpdik7XG4gIHJldHVybiBjaXBoZXI7XG59O1xuXG4vKipcbiAqIERlcHJlY2F0ZWQuIEluc3RlYWQsIHVzZTpcbiAqXG4gKiB2YXIgZGVjaXBoZXIgPSBmb3JnZS5jaXBoZXIuY3JlYXRlRGVjaXBoZXIoJ0FFUy08bW9kZT4nLCBrZXkpO1xuICpcbiAqIENyZWF0ZXMgYW4gQUVTIGNpcGhlciBvYmplY3QgdG8gZGVjcnlwdCBkYXRhIHVzaW5nIHRoZSBnaXZlbiBzeW1tZXRyaWMga2V5LlxuICpcbiAqIFRoZSBrZXkgbWF5IGJlIGdpdmVuIGFzIGEgc3RyaW5nIG9mIGJ5dGVzLCBhbiBhcnJheSBvZiBieXRlcywgYVxuICogYnl0ZSBidWZmZXIsIG9yIGFuIGFycmF5IG9mIDMyLWJpdCB3b3Jkcy5cbiAqXG4gKiBAcGFyYW0ga2V5IHRoZSBzeW1tZXRyaWMga2V5IHRvIHVzZS5cbiAqIEBwYXJhbSBtb2RlIHRoZSBjaXBoZXIgbW9kZSB0byB1c2UgKGRlZmF1bHQ6ICdDQkMnKS5cbiAqXG4gKiBAcmV0dXJuIHRoZSBjaXBoZXIuXG4gKi9cbmZvcmdlLmFlcy5jcmVhdGVEZWNyeXB0aW9uQ2lwaGVyID0gZnVuY3Rpb24oa2V5LCBtb2RlKSB7XG4gIHJldHVybiBfY3JlYXRlQ2lwaGVyKHtcbiAgICBrZXk6IGtleSxcbiAgICBvdXRwdXQ6IG51bGwsXG4gICAgZGVjcnlwdDogdHJ1ZSxcbiAgICBtb2RlOiBtb2RlXG4gIH0pO1xufTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IEFFUyBjaXBoZXIgYWxnb3JpdGhtIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgYWxnb3JpdGhtLlxuICogQHBhcmFtIG1vZGUgdGhlIG1vZGUgZmFjdG9yeSBmdW5jdGlvbi5cbiAqXG4gKiBAcmV0dXJuIHRoZSBBRVMgYWxnb3JpdGhtIG9iamVjdC5cbiAqL1xuZm9yZ2UuYWVzLkFsZ29yaXRobSA9IGZ1bmN0aW9uKG5hbWUsIG1vZGUpIHtcbiAgaWYoIWluaXQpIHtcbiAgICBpbml0aWFsaXplKCk7XG4gIH1cbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBzZWxmLm5hbWUgPSBuYW1lO1xuICBzZWxmLm1vZGUgPSBuZXcgbW9kZSh7XG4gICAgYmxvY2tTaXplOiAxNixcbiAgICBjaXBoZXI6IHtcbiAgICAgIGVuY3J5cHQ6IGZ1bmN0aW9uKGluQmxvY2ssIG91dEJsb2NrKSB7XG4gICAgICAgIHJldHVybiBfdXBkYXRlQmxvY2soc2VsZi5fdywgaW5CbG9jaywgb3V0QmxvY2ssIGZhbHNlKTtcbiAgICAgIH0sXG4gICAgICBkZWNyeXB0OiBmdW5jdGlvbihpbkJsb2NrLCBvdXRCbG9jaykge1xuICAgICAgICByZXR1cm4gX3VwZGF0ZUJsb2NrKHNlbGYuX3csIGluQmxvY2ssIG91dEJsb2NrLCB0cnVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuICBzZWxmLl9pbml0ID0gZmFsc2U7XG59O1xuXG4vKipcbiAqIEluaXRpYWxpemVzIHRoaXMgQUVTIGFsZ29yaXRobSBieSBleHBhbmRpbmcgaXRzIGtleS5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyB0aGUgb3B0aW9ucyB0byB1c2UuXG4gKiAgICAgICAgICBrZXkgdGhlIGtleSB0byB1c2Ugd2l0aCB0aGlzIGFsZ29yaXRobS5cbiAqICAgICAgICAgIGRlY3J5cHQgdHJ1ZSBpZiB0aGUgYWxnb3JpdGhtIHNob3VsZCBiZSBpbml0aWFsaXplZCBmb3IgZGVjcnlwdGlvbixcbiAqICAgICAgICAgICAgZmFsc2UgZm9yIGVuY3J5cHRpb24uXG4gKi9cbmZvcmdlLmFlcy5BbGdvcml0aG0ucHJvdG90eXBlLmluaXRpYWxpemUgPSBmdW5jdGlvbihvcHRpb25zKSB7XG4gIGlmKHRoaXMuX2luaXQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIga2V5ID0gb3B0aW9ucy5rZXk7XG4gIHZhciB0bXA7XG5cbiAgLyogTm90ZTogVGhlIGtleSBtYXkgYmUgYSBzdHJpbmcgb2YgYnl0ZXMsIGFuIGFycmF5IG9mIGJ5dGVzLCBhIGJ5dGVcbiAgICBidWZmZXIsIG9yIGFuIGFycmF5IG9mIDMyLWJpdCBpbnRlZ2Vycy4gSWYgdGhlIGtleSBpcyBpbiBieXRlcywgdGhlblxuICAgIGl0IG11c3QgYmUgMTYsIDI0LCBvciAzMiBieXRlcyBpbiBsZW5ndGguIElmIGl0IGlzIGluIDMyLWJpdFxuICAgIGludGVnZXJzLCBpdCBtdXN0IGJlIDQsIDYsIG9yIDggaW50ZWdlcnMgbG9uZy4gKi9cblxuICBpZih0eXBlb2Yga2V5ID09PSAnc3RyaW5nJyAmJlxuICAgIChrZXkubGVuZ3RoID09PSAxNiB8fCBrZXkubGVuZ3RoID09PSAyNCB8fCBrZXkubGVuZ3RoID09PSAzMikpIHtcbiAgICAvLyBjb252ZXJ0IGtleSBzdHJpbmcgaW50byBieXRlIGJ1ZmZlclxuICAgIGtleSA9IGZvcmdlLnV0aWwuY3JlYXRlQnVmZmVyKGtleSk7XG4gIH0gZWxzZSBpZihmb3JnZS51dGlsLmlzQXJyYXkoa2V5KSAmJlxuICAgIChrZXkubGVuZ3RoID09PSAxNiB8fCBrZXkubGVuZ3RoID09PSAyNCB8fCBrZXkubGVuZ3RoID09PSAzMikpIHtcbiAgICAvLyBjb252ZXJ0IGtleSBpbnRlZ2VyIGFycmF5IGludG8gYnl0ZSBidWZmZXJcbiAgICB0bXAgPSBrZXk7XG4gICAga2V5ID0gZm9yZ2UudXRpbC5jcmVhdGVCdWZmZXIoKTtcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgdG1wLmxlbmd0aDsgKytpKSB7XG4gICAgICBrZXkucHV0Qnl0ZSh0bXBbaV0pO1xuICAgIH1cbiAgfVxuXG4gIC8vIGNvbnZlcnQga2V5IGJ5dGUgYnVmZmVyIGludG8gMzItYml0IGludGVnZXIgYXJyYXlcbiAgaWYoIWZvcmdlLnV0aWwuaXNBcnJheShrZXkpKSB7XG4gICAgdG1wID0ga2V5O1xuICAgIGtleSA9IFtdO1xuXG4gICAgLy8ga2V5IGxlbmd0aHMgb2YgMTYsIDI0LCAzMiBieXRlcyBhbGxvd2VkXG4gICAgdmFyIGxlbiA9IHRtcC5sZW5ndGgoKTtcbiAgICBpZihsZW4gPT09IDE2IHx8IGxlbiA9PT0gMjQgfHwgbGVuID09PSAzMikge1xuICAgICAgbGVuID0gbGVuID4+PiAyO1xuICAgICAgZm9yKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKSB7XG4gICAgICAgIGtleS5wdXNoKHRtcC5nZXRJbnQzMigpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBrZXkgbXVzdCBiZSBhbiBhcnJheSBvZiAzMi1iaXQgaW50ZWdlcnMgYnkgbm93XG4gIGlmKCFmb3JnZS51dGlsLmlzQXJyYXkoa2V5KSB8fFxuICAgICEoa2V5Lmxlbmd0aCA9PT0gNCB8fCBrZXkubGVuZ3RoID09PSA2IHx8IGtleS5sZW5ndGggPT09IDgpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGtleSBwYXJhbWV0ZXIuJyk7XG4gIH1cblxuICAvLyBlbmNyeXB0aW9uIG9wZXJhdGlvbiBpcyBhbHdheXMgdXNlZCBmb3IgdGhlc2UgbW9kZXNcbiAgdmFyIG1vZGUgPSB0aGlzLm1vZGUubmFtZTtcbiAgdmFyIGVuY3J5cHRPcCA9IChbJ0NGQicsICdPRkInLCAnQ1RSJywgJ0dDTSddLmluZGV4T2YobW9kZSkgIT09IC0xKTtcblxuICAvLyBkbyBrZXkgZXhwYW5zaW9uXG4gIHRoaXMuX3cgPSBfZXhwYW5kS2V5KGtleSwgb3B0aW9ucy5kZWNyeXB0ICYmICFlbmNyeXB0T3ApO1xuICB0aGlzLl9pbml0ID0gdHJ1ZTtcbn07XG5cbi8qKlxuICogRXhwYW5kcyBhIGtleS4gVHlwaWNhbGx5IG9ubHkgdXNlZCBmb3IgdGVzdGluZy5cbiAqXG4gKiBAcGFyYW0ga2V5IHRoZSBzeW1tZXRyaWMga2V5IHRvIGV4cGFuZCwgYXMgYW4gYXJyYXkgb2YgMzItYml0IHdvcmRzLlxuICogQHBhcmFtIGRlY3J5cHQgdHJ1ZSB0byBleHBhbmQgZm9yIGRlY3J5cHRpb24sIGZhbHNlIGZvciBlbmNyeXB0aW9uLlxuICpcbiAqIEByZXR1cm4gdGhlIGV4cGFuZGVkIGtleS5cbiAqL1xuZm9yZ2UuYWVzLl9leHBhbmRLZXkgPSBmdW5jdGlvbihrZXksIGRlY3J5cHQpIHtcbiAgaWYoIWluaXQpIHtcbiAgICBpbml0aWFsaXplKCk7XG4gIH1cbiAgcmV0dXJuIF9leHBhbmRLZXkoa2V5LCBkZWNyeXB0KTtcbn07XG5cbi8qKlxuICogVXBkYXRlcyBhIHNpbmdsZSBibG9jay4gVHlwaWNhbGx5IG9ubHkgdXNlZCBmb3IgdGVzdGluZy5cbiAqXG4gKiBAcGFyYW0gdyB0aGUgZXhwYW5kZWQga2V5IHRvIHVzZS5cbiAqIEBwYXJhbSBpbnB1dCBhbiBhcnJheSBvZiBibG9jay1zaXplIDMyLWJpdCB3b3Jkcy5cbiAqIEBwYXJhbSBvdXRwdXQgYW4gYXJyYXkgb2YgYmxvY2stc2l6ZSAzMi1iaXQgd29yZHMuXG4gKiBAcGFyYW0gZGVjcnlwdCB0cnVlIHRvIGRlY3J5cHQsIGZhbHNlIHRvIGVuY3J5cHQuXG4gKi9cbmZvcmdlLmFlcy5fdXBkYXRlQmxvY2sgPSBfdXBkYXRlQmxvY2s7XG5cbi8qKiBSZWdpc3RlciBBRVMgYWxnb3JpdGhtcyAqKi9cblxucmVnaXN0ZXJBbGdvcml0aG0oJ0FFUy1FQ0InLCBmb3JnZS5jaXBoZXIubW9kZXMuZWNiKTtcbnJlZ2lzdGVyQWxnb3JpdGhtKCdBRVMtQ0JDJywgZm9yZ2UuY2lwaGVyLm1vZGVzLmNiYyk7XG5yZWdpc3RlckFsZ29yaXRobSgnQUVTLUNGQicsIGZvcmdlLmNpcGhlci5tb2Rlcy5jZmIpO1xucmVnaXN0ZXJBbGdvcml0aG0oJ0FFUy1PRkInLCBmb3JnZS5jaXBoZXIubW9kZXMub2ZiKTtcbnJlZ2lzdGVyQWxnb3JpdGhtKCdBRVMtQ1RSJywgZm9yZ2UuY2lwaGVyLm1vZGVzLmN0cik7XG5yZWdpc3RlckFsZ29yaXRobSgnQUVTLUdDTScsIGZvcmdlLmNpcGhlci5tb2Rlcy5nY20pO1xuXG5mdW5jdGlvbiByZWdpc3RlckFsZ29yaXRobShuYW1lLCBtb2RlKSB7XG4gIHZhciBmYWN0b3J5ID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIG5ldyBmb3JnZS5hZXMuQWxnb3JpdGhtKG5hbWUsIG1vZGUpO1xuICB9O1xuICBmb3JnZS5jaXBoZXIucmVnaXN0ZXJBbGdvcml0aG0obmFtZSwgZmFjdG9yeSk7XG59XG5cbi8qKiBBRVMgaW1wbGVtZW50YXRpb24gKiovXG5cbnZhciBpbml0ID0gZmFsc2U7IC8vIG5vdCB5ZXQgaW5pdGlhbGl6ZWRcbnZhciBOYiA9IDQ7ICAgICAgIC8vIG51bWJlciBvZiB3b3JkcyBjb21wcmlzaW5nIHRoZSBzdGF0ZSAoQUVTID0gNClcbnZhciBzYm94OyAgICAgICAgIC8vIG5vbi1saW5lYXIgc3Vic3RpdHV0aW9uIHRhYmxlIHVzZWQgaW4ga2V5IGV4cGFuc2lvblxudmFyIGlzYm94OyAgICAgICAgLy8gaW52ZXJzaW9uIG9mIHNib3hcbnZhciByY29uOyAgICAgICAgIC8vIHJvdW5kIGNvbnN0YW50IHdvcmQgYXJyYXlcbnZhciBtaXg7ICAgICAgICAgIC8vIG1peC1jb2x1bW5zIHRhYmxlXG52YXIgaW1peDsgICAgICAgICAvLyBpbnZlcnNlIG1peC1jb2x1bW5zIHRhYmxlXG5cbi8qKlxuICogUGVyZm9ybXMgaW5pdGlhbGl6YXRpb24sIGllOiBwcmVjb21wdXRlcyB0YWJsZXMgdG8gb3B0aW1pemUgZm9yIHNwZWVkLlxuICpcbiAqIE9uZSB3YXkgdG8gdW5kZXJzdGFuZCBob3cgQUVTIHdvcmtzIGlzIHRvIGltYWdpbmUgdGhhdCAnYWRkaXRpb24nIGFuZFxuICogJ211bHRpcGxpY2F0aW9uJyBhcmUgaW50ZXJmYWNlcyB0aGF0IHJlcXVpcmUgY2VydGFpbiBtYXRoZW1hdGljYWxcbiAqIHByb3BlcnRpZXMgdG8gaG9sZCB0cnVlIChpZTogdGhleSBhcmUgYXNzb2NpYXRpdmUpIGJ1dCB0aGV5IG1pZ2h0IGhhdmVcbiAqIGRpZmZlcmVudCBpbXBsZW1lbnRhdGlvbnMgYW5kIHByb2R1Y2UgZGlmZmVyZW50IGtpbmRzIG9mIHJlc3VsdHMgLi4uXG4gKiBwcm92aWRlZCB0aGF0IHRoZWlyIG1hdGhlbWF0aWNhbCBwcm9wZXJ0aWVzIHJlbWFpbiB0cnVlLiBBRVMgZGVmaW5lc1xuICogaXRzIG93biBtZXRob2RzIG9mIGFkZGl0aW9uIGFuZCBtdWx0aXBsaWNhdGlvbiBidXQga2VlcHMgc29tZSBpbXBvcnRhbnRcbiAqIHByb3BlcnRpZXMgdGhlIHNhbWUsIGllOiBhc3NvY2lhdGl2aXR5IGFuZCBkaXN0cmlidXRpdml0eS4gVGhlXG4gKiBleHBsYW5hdGlvbiBiZWxvdyB0cmllcyB0byBzaGVkIHNvbWUgbGlnaHQgb24gaG93IEFFUyBkZWZpbmVzIGFkZGl0aW9uXG4gKiBhbmQgbXVsdGlwbGljYXRpb24gb2YgYnl0ZXMgYW5kIDMyLWJpdCB3b3JkcyBpbiBvcmRlciB0byBwZXJmb3JtIGl0c1xuICogZW5jcnlwdGlvbiBhbmQgZGVjcnlwdGlvbiBhbGdvcml0aG1zLlxuICpcbiAqIFRoZSBiYXNpY3M6XG4gKlxuICogVGhlIEFFUyBhbGdvcml0aG0gdmlld3MgYnl0ZXMgYXMgYmluYXJ5IHJlcHJlc2VudGF0aW9ucyBvZiBwb2x5bm9taWFsc1xuICogdGhhdCBoYXZlIGVpdGhlciAxIG9yIDAgYXMgdGhlIGNvZWZmaWNpZW50cy4gSXQgZGVmaW5lcyB0aGUgYWRkaXRpb25cbiAqIG9yIHN1YnRyYWN0aW9uIG9mIHR3byBieXRlcyBhcyB0aGUgWE9SIG9wZXJhdGlvbi4gSXQgYWxzbyBkZWZpbmVzIHRoZVxuICogbXVsdGlwbGljYXRpb24gb2YgdHdvIGJ5dGVzIGFzIGEgZmluaXRlIGZpZWxkIHJlZmVycmVkIHRvIGFzIEdGKDJeOClcbiAqIChOb3RlOiAnR0YnIG1lYW5zIFwiR2Fsb2lzIEZpZWxkXCIgd2hpY2ggaXMgYSBmaWVsZCB0aGF0IGNvbnRhaW5zIGEgZmluaXRlXG4gKiBudW1iZXIgb2YgZWxlbWVudHMgc28gR0YoMl44KSBoYXMgMjU2IGVsZW1lbnRzKS5cbiAqXG4gKiBUaGlzIG1lYW5zIHRoYXQgYW55IHR3byBieXRlcyBjYW4gYmUgcmVwcmVzZW50ZWQgYXMgYmluYXJ5IHBvbHlub21pYWxzO1xuICogd2hlbiB0aGV5IG11bHRpcGxpZWQgdG9nZXRoZXIgYW5kIG1vZHVsYXJseSByZWR1Y2VkIGJ5IGFuIGlycmVkdWNpYmxlXG4gKiBwb2x5bm9taWFsIG9mIHRoZSA4dGggZGVncmVlLCB0aGUgcmVzdWx0cyBhcmUgdGhlIGZpZWxkIEdGKDJeOCkuIFRoZVxuICogc3BlY2lmaWMgaXJyZWR1Y2libGUgcG9seW5vbWlhbCB0aGF0IEFFUyB1c2VzIGluIGhleGFkZWNpbWFsIGlzIDB4MTFiLlxuICogVGhpcyBtdWx0aXBsaWNhdGlvbiBpcyBhc3NvY2lhdGl2ZSB3aXRoIDB4MDEgYXMgdGhlIGlkZW50aXR5OlxuICpcbiAqIChiICogMHgwMSA9IEdGKGIsIDB4MDEpID0gYikuXG4gKlxuICogVGhlIG9wZXJhdGlvbiBHRihiLCAweDAyKSBjYW4gYmUgcGVyZm9ybWVkIGF0IHRoZSBieXRlIGxldmVsIGJ5IGxlZnRcbiAqIHNoaWZ0aW5nIGIgb25jZSBhbmQgdGhlbiBYT1InaW5nIGl0ICh0byBwZXJmb3JtIHRoZSBtb2R1bGFyIHJlZHVjdGlvbilcbiAqIHdpdGggMHgxMWIgaWYgYiBpcyA+PSAxMjguIFJlcGVhdGVkIGFwcGxpY2F0aW9uIG9mIHRoZSBtdWx0aXBsaWNhdGlvblxuICogb2YgMHgwMiBjYW4gYmUgdXNlZCB0byBpbXBsZW1lbnQgdGhlIG11bHRpcGxpY2F0aW9uIG9mIGFueSB0d28gYnl0ZXMuXG4gKlxuICogRm9yIGluc3RhbmNlLCBtdWx0aXBseWluZyAweDU3IGFuZCAweDEzLCBkZW5vdGVkIGFzIEdGKDB4NTcsIDB4MTMpLCBjYW5cbiAqIGJlIHBlcmZvcm1lZCBieSBmYWN0b3JpbmcgMHgxMyBpbnRvIDB4MDEsIDB4MDIsIGFuZCAweDEwLiBUaGVuIHRoZXNlXG4gKiBmYWN0b3JzIGNhbiBlYWNoIGJlIG11bHRpcGxpZWQgYnkgMHg1NyBhbmQgdGhlbiBhZGRlZCB0b2dldGhlci4gVG8gZG9cbiAqIHRoZSBtdWx0aXBsaWNhdGlvbiwgdmFsdWVzIGZvciAweDU3IG11bHRpcGxpZWQgYnkgZWFjaCBvZiB0aGVzZSAzIGZhY3RvcnNcbiAqIGNhbiBiZSBwcmVjb21wdXRlZCBhbmQgc3RvcmVkIGluIGEgdGFibGUuIFRvIGFkZCB0aGVtLCB0aGUgdmFsdWVzIGZyb21cbiAqIHRoZSB0YWJsZSBhcmUgWE9SJ2QgdG9nZXRoZXIuXG4gKlxuICogQUVTIGFsc28gZGVmaW5lcyBhZGRpdGlvbiBhbmQgbXVsdGlwbGljYXRpb24gb2Ygd29yZHMsIHRoYXQgaXMgNC1ieXRlXG4gKiBudW1iZXJzIHJlcHJlc2VudGVkIGFzIHBvbHlub21pYWxzIG9mIDMgZGVncmVlcyB3aGVyZSB0aGUgY29lZmZpY2llbnRzXG4gKiBhcmUgdGhlIHZhbHVlcyBvZiB0aGUgYnl0ZXMuXG4gKlxuICogVGhlIHdvcmQgW2EwLCBhMSwgYTIsIGEzXSBpcyBhIHBvbHlub21pYWwgYTN4XjMgKyBhMnheMiArIGExeCArIGEwLlxuICpcbiAqIEFkZGl0aW9uIGlzIHBlcmZvcm1lZCBieSBYT1InaW5nIGxpa2UgcG93ZXJzIG9mIHguIE11bHRpcGxpY2F0aW9uXG4gKiBpcyBwZXJmb3JtZWQgaW4gdHdvIHN0ZXBzLCB0aGUgZmlyc3QgaXMgYW4gYWxnZWJyaWFjIGV4cGFuc2lvbiBhc1xuICogeW91IHdvdWxkIGRvIG5vcm1hbGx5ICh3aGVyZSBhZGRpdGlvbiBpcyBYT1IpLiBCdXQgdGhlIHJlc3VsdCBpc1xuICogYSBwb2x5bm9taWFsIGxhcmdlciB0aGFuIDMgZGVncmVlcyBhbmQgdGh1cyBpdCBjYW5ub3QgZml0IGluIGEgd29yZC4gU29cbiAqIG5leHQgdGhlIHJlc3VsdCBpcyBtb2R1bGFybHkgcmVkdWNlZCBieSBhbiBBRVMtc3BlY2lmaWMgcG9seW5vbWlhbCBvZlxuICogZGVncmVlIDQgd2hpY2ggd2lsbCBhbHdheXMgcHJvZHVjZSBhIHBvbHlub21pYWwgb2YgbGVzcyB0aGFuIDQgZGVncmVlc1xuICogc3VjaCB0aGF0IGl0IHdpbGwgZml0IGluIGEgd29yZC4gSW4gQUVTLCB0aGlzIHBvbHlub21pYWwgaXMgeF40ICsgMS5cbiAqXG4gKiBUaGUgbW9kdWxhciBwcm9kdWN0IG9mIHR3byBwb2x5bm9taWFscyAnYScgYW5kICdiJyBpcyB0aHVzOlxuICpcbiAqIGQoeCkgPSBkM3heMyArIGQyeF4yICsgZDF4ICsgZDBcbiAqIHdpdGhcbiAqIGQwID0gR0YoYTAsIGIwKSBeIEdGKGEzLCBiMSkgXiBHRihhMiwgYjIpIF4gR0YoYTEsIGIzKVxuICogZDEgPSBHRihhMSwgYjApIF4gR0YoYTAsIGIxKSBeIEdGKGEzLCBiMikgXiBHRihhMiwgYjMpXG4gKiBkMiA9IEdGKGEyLCBiMCkgXiBHRihhMSwgYjEpIF4gR0YoYTAsIGIyKSBeIEdGKGEzLCBiMylcbiAqIGQzID0gR0YoYTMsIGIwKSBeIEdGKGEyLCBiMSkgXiBHRihhMSwgYjIpIF4gR0YoYTAsIGIzKVxuICpcbiAqIEFzIGEgbWF0cml4OlxuICpcbiAqIFtkMF0gPSBbYTAgYTMgYTIgYTFdW2IwXVxuICogW2QxXSAgIFthMSBhMCBhMyBhMl1bYjFdXG4gKiBbZDJdICAgW2EyIGExIGEwIGEzXVtiMl1cbiAqIFtkM10gICBbYTMgYTIgYTEgYTBdW2IzXVxuICpcbiAqIFNwZWNpYWwgcG9seW5vbWlhbHMgZGVmaW5lZCBieSBBRVMgKDB4MDIgPT0gezAyfSk6XG4gKiBhKHgpICAgID0gezAzfXheMyArIHswMX14XjIgKyB7MDF9eCArIHswMn1cbiAqIGFeLTEoeCkgPSB7MGJ9eF4zICsgezBkfXheMiArIHswOX14ICsgezBlfS5cbiAqXG4gKiBUaGVzZSBwb2x5bm9taWFscyBhcmUgdXNlZCBpbiB0aGUgTWl4Q29sdW1ucygpIGFuZCBJbnZlcnNlTWl4Q29sdW1ucygpXG4gKiBvcGVyYXRpb25zLCByZXNwZWN0aXZlbHksIHRvIGNhdXNlIGVhY2ggZWxlbWVudCBpbiB0aGUgc3RhdGUgdG8gYWZmZWN0XG4gKiB0aGUgb3V0cHV0IChyZWZlcnJlZCB0byBhcyBkaWZmdXNpbmcpLlxuICpcbiAqIFJvdFdvcmQoKSB1c2VzOiBhMCA9IGExID0gYTIgPSB7MDB9IGFuZCBhMyA9IHswMX0sIHdoaWNoIGlzIHRoZVxuICogcG9seW5vbWlhbCB4My5cbiAqXG4gKiBUaGUgU2hpZnRSb3dzKCkgbWV0aG9kIG1vZGlmaWVzIHRoZSBsYXN0IDMgcm93cyBpbiB0aGUgc3RhdGUgKHdoZXJlXG4gKiB0aGUgc3RhdGUgaXMgNCB3b3JkcyB3aXRoIDQgYnl0ZXMgcGVyIHdvcmQpIGJ5IHNoaWZ0aW5nIGJ5dGVzIGN5Y2xpY2FsbHkuXG4gKiBUaGUgMXN0IGJ5dGUgaW4gdGhlIHNlY29uZCByb3cgaXMgbW92ZWQgdG8gdGhlIGVuZCBvZiB0aGUgcm93LiBUaGUgMXN0XG4gKiBhbmQgMm5kIGJ5dGVzIGluIHRoZSB0aGlyZCByb3cgYXJlIG1vdmVkIHRvIHRoZSBlbmQgb2YgdGhlIHJvdy4gVGhlIDFzdCxcbiAqIDJuZCwgYW5kIDNyZCBieXRlcyBhcmUgbW92ZWQgaW4gdGhlIGZvdXJ0aCByb3cuXG4gKlxuICogTW9yZSBkZXRhaWxzIG9uIGhvdyBBRVMgYXJpdGhtZXRpYyB3b3JrczpcbiAqXG4gKiBJbiB0aGUgcG9seW5vbWlhbCByZXByZXNlbnRhdGlvbiBvZiBiaW5hcnkgbnVtYmVycywgWE9SIHBlcmZvcm1zIGFkZGl0aW9uXG4gKiBhbmQgc3VidHJhY3Rpb24gYW5kIG11bHRpcGxpY2F0aW9uIGluIEdGKDJeOCkgZGVub3RlZCBhcyBHRihhLCBiKVxuICogY29ycmVzcG9uZHMgd2l0aCB0aGUgbXVsdGlwbGljYXRpb24gb2YgcG9seW5vbWlhbHMgbW9kdWxvIGFuIGlycmVkdWNpYmxlXG4gKiBwb2x5bm9taWFsIG9mIGRlZ3JlZSA4LiBJbiBvdGhlciB3b3JkcywgZm9yIEFFUywgR0YoYSwgYikgd2lsbCBtdWx0aXBseVxuICogcG9seW5vbWlhbCAnYScgd2l0aCBwb2x5bm9taWFsICdiJyBhbmQgdGhlbiBkbyBhIG1vZHVsYXIgcmVkdWN0aW9uIGJ5XG4gKiBhbiBBRVMtc3BlY2lmaWMgaXJyZWR1Y2libGUgcG9seW5vbWlhbCBvZiBkZWdyZWUgOC5cbiAqXG4gKiBBIHBvbHlub21pYWwgaXMgaXJyZWR1Y2libGUgaWYgaXRzIG9ubHkgZGl2aXNvcnMgYXJlIG9uZSBhbmQgaXRzZWxmLiBGb3JcbiAqIHRoZSBBRVMgYWxnb3JpdGhtLCB0aGlzIGlycmVkdWNpYmxlIHBvbHlub21pYWwgaXM6XG4gKlxuICogbSh4KSA9IHheOCArIHheNCArIHheMyArIHggKyAxLFxuICpcbiAqIG9yIHswMX17MWJ9IGluIGhleGFkZWNpbWFsIG5vdGF0aW9uLCB3aGVyZSBlYWNoIGNvZWZmaWNpZW50IGlzIGEgYml0OlxuICogMTAwMDExMDExID0gMjgzID0gMHgxMWIuXG4gKlxuICogRm9yIGV4YW1wbGUsIEdGKDB4NTcsIDB4ODMpID0gMHhjMSBiZWNhdXNlXG4gKlxuICogMHg1NyA9IDg3ICA9IDAxMDEwMTExID0geF42ICsgeF40ICsgeF4yICsgeCArIDFcbiAqIDB4ODUgPSAxMzEgPSAxMDAwMDEwMSA9IHheNyArIHggKyAxXG4gKlxuICogKHheNiArIHheNCArIHheMiArIHggKyAxKSAqICh4XjcgKyB4ICsgMSlcbiAqID0gIHheMTMgKyB4XjExICsgeF45ICsgeF44ICsgeF43ICtcbiAqICAgIHheNyArIHheNSArIHheMyArIHheMiArIHggK1xuICogICAgeF42ICsgeF40ICsgeF4yICsgeCArIDFcbiAqID0gIHheMTMgKyB4XjExICsgeF45ICsgeF44ICsgeF42ICsgeF41ICsgeF40ICsgeF4zICsgMSA9IHlcbiAqICAgIHkgbW9kdWxvICh4XjggKyB4XjQgKyB4XjMgKyB4ICsgMSlcbiAqID0gIHheNyArIHheNiArIDEuXG4gKlxuICogVGhlIG1vZHVsYXIgcmVkdWN0aW9uIGJ5IG0oeCkgZ3VhcmFudGVlcyB0aGUgcmVzdWx0IHdpbGwgYmUgYSBiaW5hcnlcbiAqIHBvbHlub21pYWwgb2YgbGVzcyB0aGFuIGRlZ3JlZSA4LCBzbyB0aGF0IGl0IGNhbiBmaXQgaW4gYSBieXRlLlxuICpcbiAqIFRoZSBvcGVyYXRpb24gdG8gbXVsdGlwbHkgYSBiaW5hcnkgcG9seW5vbWlhbCBiIHdpdGggeCAodGhlIHBvbHlub21pYWxcbiAqIHggaW4gYmluYXJ5IHJlcHJlc2VudGF0aW9uIGlzIDAwMDAwMDEwKSBpczpcbiAqXG4gKiBiXzd4XjggKyBiXzZ4XjcgKyBiXzV4XjYgKyBiXzR4XjUgKyBiXzN4XjQgKyBiXzJ4XjMgKyBiXzF4XjIgKyBiXzB4XjFcbiAqXG4gKiBUbyBnZXQgR0YoYiwgeCkgd2UgbXVzdCByZWR1Y2UgdGhhdCBieSBtKHgpLiBJZiBiXzcgaXMgMCAodGhhdCBpcyB0aGVcbiAqIG1vc3Qgc2lnbmlmaWNhbnQgYml0IGlzIDAgaW4gYikgdGhlbiB0aGUgcmVzdWx0IGlzIGFscmVhZHkgcmVkdWNlZC4gSWZcbiAqIGl0IGlzIDEsIHRoZW4gd2UgY2FuIHJlZHVjZSBpdCBieSBzdWJ0cmFjdGluZyBtKHgpIHZpYSBhbiBYT1IuXG4gKlxuICogSXQgZm9sbG93cyB0aGF0IG11bHRpcGxpY2F0aW9uIGJ5IHggKDAwMDAwMDEwIG9yIDB4MDIpIGNhbiBiZSBpbXBsZW1lbnRlZFxuICogYnkgcGVyZm9ybWluZyBhIGxlZnQgc2hpZnQgZm9sbG93ZWQgYnkgYSBjb25kaXRpb25hbCBiaXR3aXNlIFhPUiB3aXRoXG4gKiAweDFiLiBUaGlzIG9wZXJhdGlvbiBvbiBieXRlcyBpcyBkZW5vdGVkIGJ5IHh0aW1lKCkuIE11bHRpcGxpY2F0aW9uIGJ5XG4gKiBoaWdoZXIgcG93ZXJzIG9mIHggY2FuIGJlIGltcGxlbWVudGVkIGJ5IHJlcGVhdGVkIGFwcGxpY2F0aW9uIG9mIHh0aW1lKCkuXG4gKlxuICogQnkgYWRkaW5nIGludGVybWVkaWF0ZSByZXN1bHRzLCBtdWx0aXBsaWNhdGlvbiBieSBhbnkgY29uc3RhbnQgY2FuIGJlXG4gKiBpbXBsZW1lbnRlZC4gRm9yIGluc3RhbmNlOlxuICpcbiAqIEdGKDB4NTcsIDB4MTMpID0gMHhmZSBiZWNhdXNlOlxuICpcbiAqIHh0aW1lKGIpID0gKGIgJiAxMjgpID8gKGIgPDwgMSBeIDB4MTFiKSA6IChiIDw8IDEpXG4gKlxuICogTm90ZTogV2UgWE9SIHdpdGggMHgxMWIgaW5zdGVhZCBvZiAweDFiIGJlY2F1c2UgaW4gamF2YXNjcmlwdCBvdXJcbiAqIGRhdGF0eXBlIGZvciBiIGNhbiBiZSBsYXJnZXIgdGhhbiAxIGJ5dGUsIHNvIGEgbGVmdCBzaGlmdCB3aWxsIG5vdFxuICogYXV0b21hdGljYWxseSBlbGltaW5hdGUgYml0cyB0aGF0IG92ZXJmbG93IGEgYnl0ZSAuLi4gYnkgWE9SJ2luZyB0aGVcbiAqIG92ZXJmbG93IGJpdCB3aXRoIDEgKHRoZSBleHRyYSBvbmUgZnJvbSAweDExYikgd2UgemVybyBpdCBvdXQuXG4gKlxuICogR0YoMHg1NywgMHgwMikgPSB4dGltZSgweDU3KSA9IDB4YWVcbiAqIEdGKDB4NTcsIDB4MDQpID0geHRpbWUoMHhhZSkgPSAweDQ3XG4gKiBHRigweDU3LCAweDA4KSA9IHh0aW1lKDB4NDcpID0gMHg4ZVxuICogR0YoMHg1NywgMHgxMCkgPSB4dGltZSgweDhlKSA9IDB4MDdcbiAqXG4gKiBHRigweDU3LCAweDEzKSA9IEdGKDB4NTcsICgweDAxIF4gMHgwMiBeIDB4MTApKVxuICpcbiAqIEFuZCBieSB0aGUgZGlzdHJpYnV0aXZlIHByb3BlcnR5IChzaW5jZSBYT1IgaXMgYWRkaXRpb24gYW5kIEdGKCkgaXNcbiAqIG11bHRpcGxpY2F0aW9uKTpcbiAqXG4gKiA9IEdGKDB4NTcsIDB4MDEpIF4gR0YoMHg1NywgMHgwMikgXiBHRigweDU3LCAweDEwKVxuICogPSAweDU3IF4gMHhhZSBeIDB4MDdcbiAqID0gMHhmZS5cbiAqL1xuZnVuY3Rpb24gaW5pdGlhbGl6ZSgpIHtcbiAgaW5pdCA9IHRydWU7XG5cbiAgLyogUG9wdWxhdGUgdGhlIFJjb24gdGFibGUuIFRoZXNlIGFyZSB0aGUgdmFsdWVzIGdpdmVuIGJ5XG4gICAgW3heKGktMSksezAwfSx7MDB9LHswMH1dIHdoZXJlIHheKGktMSkgYXJlIHBvd2VycyBvZiB4IChhbmQgeCA9IDB4MDIpXG4gICAgaW4gdGhlIGZpZWxkIG9mIEdGKDJeOCksIHdoZXJlIGkgc3RhcnRzIGF0IDEuXG5cbiAgICByY29uWzBdID0gWzB4MDAsIDB4MDAsIDB4MDAsIDB4MDBdXG4gICAgcmNvblsxXSA9IFsweDAxLCAweDAwLCAweDAwLCAweDAwXSAyXigxLTEpID0gMl4wID0gMVxuICAgIHJjb25bMl0gPSBbMHgwMiwgMHgwMCwgMHgwMCwgMHgwMF0gMl4oMi0xKSA9IDJeMSA9IDJcbiAgICAuLi5cbiAgICByY29uWzldICA9IFsweDFCLCAweDAwLCAweDAwLCAweDAwXSAyXig5LTEpICA9IDJeOCA9IDB4MUJcbiAgICByY29uWzEwXSA9IFsweDM2LCAweDAwLCAweDAwLCAweDAwXSAyXigxMC0xKSA9IDJeOSA9IDB4MzZcblxuICAgIFdlIG9ubHkgc3RvcmUgdGhlIGZpcnN0IGJ5dGUgYmVjYXVzZSBpdCBpcyB0aGUgb25seSBvbmUgdXNlZC5cbiAgKi9cbiAgcmNvbiA9IFsweDAwLCAweDAxLCAweDAyLCAweDA0LCAweDA4LCAweDEwLCAweDIwLCAweDQwLCAweDgwLCAweDFCLCAweDM2XTtcblxuICAvLyBjb21wdXRlIHh0aW1lIHRhYmxlIHdoaWNoIG1hcHMgaSBvbnRvIEdGKGksIDB4MDIpXG4gIHZhciB4dGltZSA9IG5ldyBBcnJheSgyNTYpO1xuICBmb3IodmFyIGkgPSAwOyBpIDwgMTI4OyArK2kpIHtcbiAgICB4dGltZVtpXSA9IGkgPDwgMTtcbiAgICB4dGltZVtpICsgMTI4XSA9IChpICsgMTI4KSA8PCAxIF4gMHgxMUI7XG4gIH1cblxuICAvLyBjb21wdXRlIGFsbCBvdGhlciB0YWJsZXNcbiAgc2JveCA9IG5ldyBBcnJheSgyNTYpO1xuICBpc2JveCA9IG5ldyBBcnJheSgyNTYpO1xuICBtaXggPSBuZXcgQXJyYXkoNCk7XG4gIGltaXggPSBuZXcgQXJyYXkoNCk7XG4gIGZvcih2YXIgaSA9IDA7IGkgPCA0OyArK2kpIHtcbiAgICBtaXhbaV0gPSBuZXcgQXJyYXkoMjU2KTtcbiAgICBpbWl4W2ldID0gbmV3IEFycmF5KDI1Nik7XG4gIH1cbiAgdmFyIGUgPSAwLCBlaSA9IDAsIGUyLCBlNCwgZTgsIHN4LCBzeDIsIG1lLCBpbWU7XG4gIGZvcih2YXIgaSA9IDA7IGkgPCAyNTY7ICsraSkge1xuICAgIC8qIFdlIG5lZWQgdG8gZ2VuZXJhdGUgdGhlIFN1YkJ5dGVzKCkgc2JveCBhbmQgaXNib3ggdGFibGVzIHNvIHRoYXRcbiAgICAgIHdlIGNhbiBwZXJmb3JtIGJ5dGUgc3Vic3RpdHV0aW9ucy4gVGhpcyByZXF1aXJlcyB1cyB0byB0cmF2ZXJzZVxuICAgICAgYWxsIG9mIHRoZSBlbGVtZW50cyBpbiBHRiwgZmluZCB0aGVpciBtdWx0aXBsaWNhdGl2ZSBpbnZlcnNlcyxcbiAgICAgIGFuZCBhcHBseSB0byBlYWNoIHRoZSBmb2xsb3dpbmcgYWZmaW5lIHRyYW5zZm9ybWF0aW9uOlxuXG4gICAgICBiaScgPSBiaSBeIGIoaSArIDQpIG1vZCA4IF4gYihpICsgNSkgbW9kIDggXiBiKGkgKyA2KSBtb2QgOCBeXG4gICAgICAgICAgICBiKGkgKyA3KSBtb2QgOCBeIGNpXG4gICAgICBmb3IgMCA8PSBpIDwgOCwgd2hlcmUgYmkgaXMgdGhlIGl0aCBiaXQgb2YgdGhlIGJ5dGUsIGFuZCBjaSBpcyB0aGVcbiAgICAgIGl0aCBiaXQgb2YgYSBieXRlIGMgd2l0aCB0aGUgdmFsdWUgezYzfSBvciB7MDExMDAwMTF9LlxuXG4gICAgICBJdCBpcyBwb3NzaWJsZSB0byB0cmF2ZXJzZSBldmVyeSBwb3NzaWJsZSB2YWx1ZSBpbiBhIEdhbG9pcyBmaWVsZFxuICAgICAgdXNpbmcgd2hhdCBpcyByZWZlcnJlZCB0byBhcyBhICdnZW5lcmF0b3InLiBUaGVyZSBhcmUgbWFueVxuICAgICAgZ2VuZXJhdG9ycyAoMTI4IG91dCBvZiAyNTYpOiAzLDUsNiw5LDExLDgyIHRvIG5hbWUgYSBmZXcuIFRvIGZ1bGx5XG4gICAgICB0cmF2ZXJzZSBHRiB3ZSBpdGVyYXRlIDI1NSB0aW1lcywgbXVsdGlwbHlpbmcgYnkgb3VyIGdlbmVyYXRvclxuICAgICAgZWFjaCB0aW1lLlxuXG4gICAgICBPbiBlYWNoIGl0ZXJhdGlvbiB3ZSBjYW4gZGV0ZXJtaW5lIHRoZSBtdWx0aXBsaWNhdGl2ZSBpbnZlcnNlIGZvclxuICAgICAgdGhlIGN1cnJlbnQgZWxlbWVudC5cblxuICAgICAgU3VwcG9zZSB0aGVyZSBpcyBhbiBlbGVtZW50IGluIEdGICdlJy4gRm9yIGEgZ2l2ZW4gZ2VuZXJhdG9yICdnJyxcbiAgICAgIGUgPSBnXnguIFRoZSBtdWx0aXBsaWNhdGl2ZSBpbnZlcnNlIG9mIGUgaXMgZ14oMjU1IC0geCkuIEl0IHR1cm5zXG4gICAgICBvdXQgdGhhdCBpZiB1c2UgdGhlIGludmVyc2Ugb2YgYSBnZW5lcmF0b3IgYXMgYW5vdGhlciBnZW5lcmF0b3JcbiAgICAgIGl0IHdpbGwgcHJvZHVjZSBhbGwgb2YgdGhlIGNvcnJlc3BvbmRpbmcgbXVsdGlwbGljYXRpdmUgaW52ZXJzZXNcbiAgICAgIGF0IHRoZSBzYW1lIHRpbWUuIEZvciB0aGlzIHJlYXNvbiwgd2UgY2hvb3NlIDUgYXMgb3VyIGludmVyc2VcbiAgICAgIGdlbmVyYXRvciBiZWNhdXNlIGl0IG9ubHkgcmVxdWlyZXMgMiBtdWx0aXBsaWVzIGFuZCAxIGFkZCBhbmQgaXRzXG4gICAgICBpbnZlcnNlLCA4MiwgcmVxdWlyZXMgcmVsYXRpdmVseSBmZXcgb3BlcmF0aW9ucyBhcyB3ZWxsLlxuXG4gICAgICBJbiBvcmRlciB0byBhcHBseSB0aGUgYWZmaW5lIHRyYW5zZm9ybWF0aW9uLCB0aGUgbXVsdGlwbGljYXRpdmVcbiAgICAgIGludmVyc2UgJ2VpJyBvZiAnZScgY2FuIGJlIHJlcGVhdGVkbHkgWE9SJ2QgKDQgdGltZXMpIHdpdGggYVxuICAgICAgYml0LWN5Y2xpbmcgb2YgJ2VpJy4gVG8gZG8gdGhpcyAnZWknIGlzIGZpcnN0IHN0b3JlZCBpbiAncycgYW5kXG4gICAgICAneCcuIFRoZW4gJ3MnIGlzIGxlZnQgc2hpZnRlZCBhbmQgdGhlIGhpZ2ggYml0IG9mICdzJyBpcyBtYWRlIHRoZVxuICAgICAgbG93IGJpdC4gVGhlIHJlc3VsdGluZyB2YWx1ZSBpcyBzdG9yZWQgaW4gJ3MnLiBUaGVuICd4JyBpcyBYT1InZFxuICAgICAgd2l0aCAncycgYW5kIHN0b3JlZCBpbiAneCcuIE9uIGVhY2ggc3Vic2VxdWVudCBpdGVyYXRpb24gdGhlIHNhbWVcbiAgICAgIG9wZXJhdGlvbiBpcyBwZXJmb3JtZWQuIFdoZW4gNCBpdGVyYXRpb25zIGFyZSBjb21wbGV0ZSwgJ3gnIGlzXG4gICAgICBYT1InZCB3aXRoICdjJyAoMHg2MykgYW5kIHRoZSB0cmFuc2Zvcm1lZCB2YWx1ZSBpcyBzdG9yZWQgaW4gJ3gnLlxuICAgICAgRm9yIGV4YW1wbGU6XG5cbiAgICAgIHMgPSAwMTAwMDAwMVxuICAgICAgeCA9IDAxMDAwMDAxXG5cbiAgICAgIGl0ZXJhdGlvbiAxOiBzID0gMTAwMDAwMTAsIHggXj0gc1xuICAgICAgaXRlcmF0aW9uIDI6IHMgPSAwMDAwMDEwMSwgeCBePSBzXG4gICAgICBpdGVyYXRpb24gMzogcyA9IDAwMDAxMDEwLCB4IF49IHNcbiAgICAgIGl0ZXJhdGlvbiA0OiBzID0gMDAwMTAxMDAsIHggXj0gc1xuICAgICAgeCBePSAweDYzXG5cbiAgICAgIFRoaXMgY2FuIGJlIGRvbmUgd2l0aCBhIGxvb3Agd2hlcmUgcyA9IChzIDw8IDEpIHwgKHMgPj4gNykuIEhvd2V2ZXIsXG4gICAgICBpdCBjYW4gYWxzbyBiZSBkb25lIGJ5IHVzaW5nIGEgc2luZ2xlIDE2LWJpdCAoaW4gdGhpcyBjYXNlIDMyLWJpdClcbiAgICAgIG51bWJlciAnc3gnLiBTaW5jZSBYT1IgaXMgYW4gYXNzb2NpYXRpdmUgb3BlcmF0aW9uLCB3ZSBjYW4gc2V0ICdzeCdcbiAgICAgIHRvICdlaScgYW5kIHRoZW4gWE9SIGl0IHdpdGggJ3N4JyBsZWZ0LXNoaWZ0ZWQgMSwyLDMsIGFuZCA0IHRpbWVzLlxuICAgICAgVGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0cyB3aWxsIGZsb3cgaW50byB0aGUgaGlnaCA4IGJpdCBwb3NpdGlvbnNcbiAgICAgIGFuZCBiZSBjb3JyZWN0bHkgWE9SJ2Qgd2l0aCBvbmUgYW5vdGhlci4gQWxsIHRoYXQgcmVtYWlucyB3aWxsIGJlXG4gICAgICB0byBjeWNsZSB0aGUgaGlnaCA4IGJpdHMgYnkgWE9SJ2luZyB0aGVtIGFsbCB3aXRoIHRoZSBsb3dlciA4IGJpdHNcbiAgICAgIGFmdGVyd2FyZHMuXG5cbiAgICAgIEF0IHRoZSBzYW1lIHRpbWUgd2UncmUgcG9wdWxhdGluZyBzYm94IGFuZCBpc2JveCB3ZSBjYW4gcHJlY29tcHV0ZVxuICAgICAgdGhlIG11bHRpcGxpY2F0aW9uIHdlJ2xsIG5lZWQgdG8gZG8gdG8gZG8gTWl4Q29sdW1ucygpIGxhdGVyLlxuICAgICovXG5cbiAgICAvLyBhcHBseSBhZmZpbmUgdHJhbnNmb3JtYXRpb25cbiAgICBzeCA9IGVpIF4gKGVpIDw8IDEpIF4gKGVpIDw8IDIpIF4gKGVpIDw8IDMpIF4gKGVpIDw8IDQpO1xuICAgIHN4ID0gKHN4ID4+IDgpIF4gKHN4ICYgMjU1KSBeIDB4NjM7XG5cbiAgICAvLyB1cGRhdGUgdGFibGVzXG4gICAgc2JveFtlXSA9IHN4O1xuICAgIGlzYm94W3N4XSA9IGU7XG5cbiAgICAvKiBNaXhpbmcgY29sdW1ucyBpcyBkb25lIHVzaW5nIG1hdHJpeCBtdWx0aXBsaWNhdGlvbi4gVGhlIGNvbHVtbnNcbiAgICAgIHRoYXQgYXJlIHRvIGJlIG1peGVkIGFyZSBlYWNoIGEgc2luZ2xlIHdvcmQgaW4gdGhlIGN1cnJlbnQgc3RhdGUuXG4gICAgICBUaGUgc3RhdGUgaGFzIE5iIGNvbHVtbnMgKDQgY29sdW1ucykuIFRoZXJlZm9yZSBlYWNoIGNvbHVtbiBpcyBhXG4gICAgICA0IGJ5dGUgd29yZC4gU28gdG8gbWl4IHRoZSBjb2x1bW5zIGluIGEgc2luZ2xlIGNvbHVtbiAnYycgd2hlcmVcbiAgICAgIGl0cyByb3dzIGFyZSByMCwgcjEsIHIyLCBhbmQgcjMsIHdlIHVzZSB0aGUgZm9sbG93aW5nIG1hdHJpeFxuICAgICAgbXVsdGlwbGljYXRpb246XG5cbiAgICAgIFsyIDMgMSAxXSpbcjAsY109W3InMCxjXVxuICAgICAgWzEgMiAzIDFdIFtyMSxjXSBbcicxLGNdXG4gICAgICBbMSAxIDIgM10gW3IyLGNdIFtyJzIsY11cbiAgICAgIFszIDEgMSAyXSBbcjMsY10gW3InMyxjXVxuXG4gICAgICByMCwgcjEsIHIyLCBhbmQgcjMgYXJlIGVhY2ggMSBieXRlIG9mIG9uZSBvZiB0aGUgd29yZHMgaW4gdGhlXG4gICAgICBzdGF0ZSAoYSBjb2x1bW4pLiBUbyBkbyBtYXRyaXggbXVsdGlwbGljYXRpb24gZm9yIGVhY2ggbWl4ZWRcbiAgICAgIGNvbHVtbiBjJyB3ZSBtdWx0aXBseSB0aGUgY29ycmVzcG9uZGluZyByb3cgZnJvbSB0aGUgbGVmdCBtYXRyaXhcbiAgICAgIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgY29sdW1uIGZyb20gdGhlIHJpZ2h0IG1hdHJpeC4gSW4gdG90YWwsIHdlXG4gICAgICBnZXQgNCBlcXVhdGlvbnM6XG5cbiAgICAgIHIwLGMnID0gMipyMCxjICsgMypyMSxjICsgMSpyMixjICsgMSpyMyxjXG4gICAgICByMSxjJyA9IDEqcjAsYyArIDIqcjEsYyArIDMqcjIsYyArIDEqcjMsY1xuICAgICAgcjIsYycgPSAxKnIwLGMgKyAxKnIxLGMgKyAyKnIyLGMgKyAzKnIzLGNcbiAgICAgIHIzLGMnID0gMypyMCxjICsgMSpyMSxjICsgMSpyMixjICsgMipyMyxjXG5cbiAgICAgIEFzIHVzdWFsLCB0aGUgbXVsdGlwbGljYXRpb24gaXMgYXMgcHJldmlvdXNseSBkZWZpbmVkIGFuZCB0aGVcbiAgICAgIGFkZGl0aW9uIGlzIFhPUi4gSW4gb3JkZXIgdG8gb3B0aW1pemUgbWl4aW5nIGNvbHVtbnMgd2UgY2FuIHN0b3JlXG4gICAgICB0aGUgbXVsdGlwbGljYXRpb24gcmVzdWx0cyBpbiB0YWJsZXMuIElmIHlvdSB0aGluayBvZiB0aGUgd2hvbGVcbiAgICAgIGNvbHVtbiBhcyBhIHdvcmQgKGl0IG1pZ2h0IGhlbHAgdG8gdmlzdWFsaXplIGJ5IG1lbnRhbGx5IHJvdGF0aW5nXG4gICAgICB0aGUgZXF1YXRpb25zIGFib3ZlIGJ5IGNvdW50ZXJjbG9ja3dpc2UgOTAgZGVncmVlcykgdGhlbiB5b3UgY2FuXG4gICAgICBzZWUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwgdG8gbWFwIHRoZSBtdWx0aXBsaWNhdGlvbnMgcGVyZm9ybWVkIG9uXG4gICAgICBlYWNoIGJ5dGUgKHIwLCByMSwgcjIsIHIzKSBvbnRvIGEgd29yZCBhcyB3ZWxsLiBGb3IgaW5zdGFuY2UsIHdlXG4gICAgICBjb3VsZCBtYXAgMipyMCwxKnIwLDEqcjAsMypyMCBvbnRvIGEgd29yZCBieSBzdG9yaW5nIDIqcjAgaW4gdGhlXG4gICAgICBoaWdoZXN0IDggYml0cyBhbmQgMypyMCBpbiB0aGUgbG93ZXN0IDggYml0cyAod2l0aCB0aGUgb3RoZXIgdHdvXG4gICAgICByZXNwZWN0aXZlbHkgaW4gdGhlIG1pZGRsZSkuIFRoaXMgbWVhbnMgdGhhdCBhIHRhYmxlIGNhbiBiZVxuICAgICAgY29uc3RydWN0ZWQgdGhhdCB1c2VzIHIwIGFzIGFuIGluZGV4IHRvIHRoZSB3b3JkLiBXZSBjYW4gZG8gdGhlXG4gICAgICBzYW1lIHdpdGggcjEsIHIyLCBhbmQgcjMsIGNyZWF0aW5nIGEgdG90YWwgb2YgNCB0YWJsZXMuXG5cbiAgICAgIFRvIGNvbnN0cnVjdCBhIGZ1bGwgYycsIHdlIGNhbiBqdXN0IGxvb2sgdXAgZWFjaCBieXRlIG9mIGMgaW5cbiAgICAgIHRoZWlyIHJlc3BlY3RpdmUgdGFibGVzIGFuZCBYT1IgdGhlIHJlc3VsdHMgdG9nZXRoZXIuXG5cbiAgICAgIEFsc28sIHRvIGJ1aWxkIGVhY2ggdGFibGUgd2Ugb25seSBoYXZlIHRvIGNhbGN1bGF0ZSB0aGUgd29yZFxuICAgICAgZm9yIDIsMSwxLDMgZm9yIGV2ZXJ5IGJ5dGUgLi4uIHdoaWNoIHdlIGNhbiBkbyBvbiBlYWNoIGl0ZXJhdGlvblxuICAgICAgb2YgdGhpcyBsb29wIHNpbmNlIHdlIHdpbGwgaXRlcmF0ZSBvdmVyIGV2ZXJ5IGJ5dGUuIEFmdGVyIHdlIGhhdmVcbiAgICAgIGNhbGN1bGF0ZWQgMiwxLDEsMyB3ZSBjYW4gZ2V0IHRoZSByZXN1bHRzIGZvciB0aGUgb3RoZXIgdGFibGVzXG4gICAgICBieSBjeWNsaW5nIHRoZSBieXRlIGF0IHRoZSBlbmQgdG8gdGhlIGJlZ2lubmluZy4gRm9yIGluc3RhbmNlXG4gICAgICB3ZSBjYW4gdGFrZSB0aGUgcmVzdWx0IG9mIHRhYmxlIDIsMSwxLDMgYW5kIHByb2R1Y2UgdGFibGUgMywyLDEsMVxuICAgICAgYnkgbW92aW5nIHRoZSByaWdodCBtb3N0IGJ5dGUgdG8gdGhlIGxlZnQgbW9zdCBwb3NpdGlvbiBqdXN0IGxpa2VcbiAgICAgIGhvdyB5b3UgY2FuIGltYWdpbmUgdGhlIDMgbW92ZWQgb3V0IG9mIDIsMSwxLDMgYW5kIHRvIHRoZSBmcm9udFxuICAgICAgdG8gcHJvZHVjZSAzLDIsMSwxLlxuXG4gICAgICBUaGVyZSBpcyBhbm90aGVyIG9wdGltaXphdGlvbiBpbiB0aGF0IHRoZSBzYW1lIG11bHRpcGxlcyBvZlxuICAgICAgdGhlIGN1cnJlbnQgZWxlbWVudCB3ZSBuZWVkIGluIG9yZGVyIHRvIGFkdmFuY2Ugb3VyIGdlbmVyYXRvclxuICAgICAgdG8gdGhlIG5leHQgaXRlcmF0aW9uIGNhbiBiZSByZXVzZWQgaW4gcGVyZm9ybWluZyB0aGUgMiwxLDEsM1xuICAgICAgY2FsY3VsYXRpb24uIFdlIGFsc28gY2FsY3VsYXRlIHRoZSBpbnZlcnNlIG1peCBjb2x1bW4gdGFibGVzLFxuICAgICAgd2l0aCBlLDksZCxiIGJlaW5nIHRoZSBpbnZlcnNlIG9mIDIsMSwxLDMuXG5cbiAgICAgIFdoZW4gd2UncmUgZG9uZSwgYW5kIHdlIG5lZWQgdG8gYWN0dWFsbHkgbWl4IGNvbHVtbnMsIHRoZSBmaXJzdFxuICAgICAgYnl0ZSBvZiBlYWNoIHN0YXRlIHdvcmQgc2hvdWxkIGJlIHB1dCB0aHJvdWdoIG1peFswXSAoMiwxLDEsMyksXG4gICAgICB0aGUgc2Vjb25kIHRocm91Z2ggbWl4WzFdICgzLDIsMSwxKSBhbmQgc28gZm9ydGguIFRoZW4gdGhleSBzaG91bGRcbiAgICAgIGJlIFhPUidkIHRvZ2V0aGVyIHRvIHByb2R1Y2UgdGhlIGZ1bGx5IG1peGVkIGNvbHVtbi5cbiAgICAqL1xuXG4gICAgLy8gY2FsY3VsYXRlIG1peCBhbmQgaW1peCB0YWJsZSB2YWx1ZXNcbiAgICBzeDIgPSB4dGltZVtzeF07XG4gICAgZTIgPSB4dGltZVtlXTtcbiAgICBlNCA9IHh0aW1lW2UyXTtcbiAgICBlOCA9IHh0aW1lW2U0XTtcbiAgICBtZSA9XG4gICAgICAoc3gyIDw8IDI0KSBeICAvLyAyXG4gICAgICAoc3ggPDwgMTYpIF4gICAvLyAxXG4gICAgICAoc3ggPDwgOCkgXiAgICAvLyAxXG4gICAgICAoc3ggXiBzeDIpOyAgICAvLyAzXG4gICAgaW1lID1cbiAgICAgIChlMiBeIGU0IF4gZTgpIDw8IDI0IF4gIC8vIEUgKDE0KVxuICAgICAgKGUgXiBlOCkgPDwgMTYgXiAgICAgICAgLy8gOVxuICAgICAgKGUgXiBlNCBeIGU4KSA8PCA4IF4gICAgLy8gRCAoMTMpXG4gICAgICAoZSBeIGUyIF4gZTgpOyAgICAgICAgICAvLyBCICgxMSlcbiAgICAvLyBwcm9kdWNlIGVhY2ggb2YgdGhlIG1peCB0YWJsZXMgYnkgcm90YXRpbmcgdGhlIDIsMSwxLDMgdmFsdWVcbiAgICBmb3IodmFyIG4gPSAwOyBuIDwgNDsgKytuKSB7XG4gICAgICBtaXhbbl1bZV0gPSBtZTtcbiAgICAgIGltaXhbbl1bc3hdID0gaW1lO1xuICAgICAgLy8gY3ljbGUgdGhlIHJpZ2h0IG1vc3QgYnl0ZSB0byB0aGUgbGVmdCBtb3N0IHBvc2l0aW9uXG4gICAgICAvLyBpZTogMiwxLDEsMyBiZWNvbWVzIDMsMiwxLDFcbiAgICAgIG1lID0gbWUgPDwgMjQgfCBtZSA+Pj4gODtcbiAgICAgIGltZSA9IGltZSA8PCAyNCB8IGltZSA+Pj4gODtcbiAgICB9XG5cbiAgICAvLyBnZXQgbmV4dCBlbGVtZW50IGFuZCBpbnZlcnNlXG4gICAgaWYoZSA9PT0gMCkge1xuICAgICAgLy8gMSBpcyB0aGUgaW52ZXJzZSBvZiAxXG4gICAgICBlID0gZWkgPSAxO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBlID0gMmUgKyAyKjIqMiooMTBlKSkgPSBtdWx0aXBseSBlIGJ5IDgyIChjaG9zZW4gZ2VuZXJhdG9yKVxuICAgICAgLy8gZWkgPSBlaSArIDIqMiplaSA9IG11bHRpcGx5IGVpIGJ5IDUgKGludmVyc2UgZ2VuZXJhdG9yKVxuICAgICAgZSA9IGUyIF4geHRpbWVbeHRpbWVbeHRpbWVbZTIgXiBlOF1dXTtcbiAgICAgIGVpIF49IHh0aW1lW3h0aW1lW2VpXV07XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogR2VuZXJhdGVzIGEga2V5IHNjaGVkdWxlIHVzaW5nIHRoZSBBRVMga2V5IGV4cGFuc2lvbiBhbGdvcml0aG0uXG4gKlxuICogVGhlIEFFUyBhbGdvcml0aG0gdGFrZXMgdGhlIENpcGhlciBLZXksIEssIGFuZCBwZXJmb3JtcyBhIEtleSBFeHBhbnNpb25cbiAqIHJvdXRpbmUgdG8gZ2VuZXJhdGUgYSBrZXkgc2NoZWR1bGUuIFRoZSBLZXkgRXhwYW5zaW9uIGdlbmVyYXRlcyBhIHRvdGFsXG4gKiBvZiBOYiooTnIgKyAxKSB3b3JkczogdGhlIGFsZ29yaXRobSByZXF1aXJlcyBhbiBpbml0aWFsIHNldCBvZiBOYiB3b3JkcyxcbiAqIGFuZCBlYWNoIG9mIHRoZSBOciByb3VuZHMgcmVxdWlyZXMgTmIgd29yZHMgb2Yga2V5IGRhdGEuIFRoZSByZXN1bHRpbmdcbiAqIGtleSBzY2hlZHVsZSBjb25zaXN0cyBvZiBhIGxpbmVhciBhcnJheSBvZiA0LWJ5dGUgd29yZHMsIGRlbm90ZWQgW3dpIF0sXG4gKiB3aXRoIGkgaW4gdGhlIHJhbmdlIDAgPD0gaSA8IE5iKE5yICsgMSkuXG4gKlxuICogS2V5RXhwYW5zaW9uKGJ5dGUga2V5WzQqTmtdLCB3b3JkIHdbTmIqKE5yKzEpXSwgTmspXG4gKiBBRVMtMTI4IChOYj00LCBOaz00LCBOcj0xMClcbiAqIEFFUy0xOTIgKE5iPTQsIE5rPTYsIE5yPTEyKVxuICogQUVTLTI1NiAoTmI9NCwgTms9OCwgTnI9MTQpXG4gKiBOb3RlOiBOcj1Oays2LlxuICpcbiAqIE5iIGlzIHRoZSBudW1iZXIgb2YgY29sdW1ucyAoMzItYml0IHdvcmRzKSBjb21wcmlzaW5nIHRoZSBTdGF0ZSAob3JcbiAqIG51bWJlciBvZiBieXRlcyBpbiBhIGJsb2NrKS4gRm9yIEFFUywgTmI9NC5cbiAqXG4gKiBAcGFyYW0ga2V5IHRoZSBrZXkgdG8gc2NoZWR1bGUgKGFzIGFuIGFycmF5IG9mIDMyLWJpdCB3b3JkcykuXG4gKiBAcGFyYW0gZGVjcnlwdCB0cnVlIHRvIG1vZGlmeSB0aGUga2V5IHNjaGVkdWxlIHRvIGRlY3J5cHQsIGZhbHNlIG5vdCB0by5cbiAqXG4gKiBAcmV0dXJuIHRoZSBnZW5lcmF0ZWQga2V5IHNjaGVkdWxlLlxuICovXG5mdW5jdGlvbiBfZXhwYW5kS2V5KGtleSwgZGVjcnlwdCkge1xuICAvLyBjb3B5IHRoZSBrZXkncyB3b3JkcyB0byBpbml0aWFsaXplIHRoZSBrZXkgc2NoZWR1bGVcbiAgdmFyIHcgPSBrZXkuc2xpY2UoMCk7XG5cbiAgLyogUm90V29yZCgpIHdpbGwgcm90YXRlIGEgd29yZCwgbW92aW5nIHRoZSBmaXJzdCBieXRlIHRvIHRoZSBsYXN0XG4gICAgYnl0ZSdzIHBvc2l0aW9uIChzaGlmdGluZyB0aGUgb3RoZXIgYnl0ZXMgbGVmdCkuXG5cbiAgICBXZSB3aWxsIGJlIGdldHRpbmcgdGhlIHZhbHVlIG9mIFJjb24gYXQgaSAvIE5rLiAnaScgd2lsbCBpdGVyYXRlXG4gICAgZnJvbSBOayB0byAoTmIgKiBOcisxKS4gTmsgPSA0ICg0IGJ5dGUga2V5KSwgTmIgPSA0ICg0IHdvcmRzIGluXG4gICAgYSBibG9jayksIE5yID0gTmsgKyA2ICgxMCkuIFRoZXJlZm9yZSAnaScgd2lsbCBpdGVyYXRlIGZyb21cbiAgICA0IHRvIDQ0IChleGNsdXNpdmUpLiBFYWNoIHRpbWUgd2UgaXRlcmF0ZSA0IHRpbWVzLCBpIC8gTmsgd2lsbFxuICAgIGluY3JlYXNlIGJ5IDEuIFdlIHVzZSBhIGNvdW50ZXIgaU5rIHRvIGtlZXAgdHJhY2sgb2YgdGhpcy5cbiAgICovXG5cbiAgLy8gZ28gdGhyb3VnaCB0aGUgcm91bmRzIGV4cGFuZGluZyB0aGUga2V5XG4gIHZhciB0ZW1wLCBpTmsgPSAxO1xuICB2YXIgTmsgPSB3Lmxlbmd0aDtcbiAgdmFyIE5yMSA9IE5rICsgNiArIDE7XG4gIHZhciBlbmQgPSBOYiAqIE5yMTtcbiAgZm9yKHZhciBpID0gTms7IGkgPCBlbmQ7ICsraSkge1xuICAgIHRlbXAgPSB3W2kgLSAxXTtcbiAgICBpZihpICUgTmsgPT09IDApIHtcbiAgICAgIC8vIHRlbXAgPSBTdWJXb3JkKFJvdFdvcmQodGVtcCkpIF4gUmNvbltpIC8gTmtdXG4gICAgICB0ZW1wID1cbiAgICAgICAgc2JveFt0ZW1wID4+PiAxNiAmIDI1NV0gPDwgMjQgXlxuICAgICAgICBzYm94W3RlbXAgPj4+IDggJiAyNTVdIDw8IDE2IF5cbiAgICAgICAgc2JveFt0ZW1wICYgMjU1XSA8PCA4IF5cbiAgICAgICAgc2JveFt0ZW1wID4+PiAyNF0gXiAocmNvbltpTmtdIDw8IDI0KTtcbiAgICAgIGlOaysrO1xuICAgIH0gZWxzZSBpZihOayA+IDYgJiYgKGkgJSBOayA9PT0gNCkpIHtcbiAgICAgIC8vIHRlbXAgPSBTdWJXb3JkKHRlbXApXG4gICAgICB0ZW1wID1cbiAgICAgICAgc2JveFt0ZW1wID4+PiAyNF0gPDwgMjQgXlxuICAgICAgICBzYm94W3RlbXAgPj4+IDE2ICYgMjU1XSA8PCAxNiBeXG4gICAgICAgIHNib3hbdGVtcCA+Pj4gOCAmIDI1NV0gPDwgOCBeXG4gICAgICAgIHNib3hbdGVtcCAmIDI1NV07XG4gICAgfVxuICAgIHdbaV0gPSB3W2kgLSBOa10gXiB0ZW1wO1xuICB9XG5cbiAgLyogV2hlbiB3ZSBhcmUgdXBkYXRpbmcgYSBjaXBoZXIgYmxvY2sgd2UgYWx3YXlzIHVzZSB0aGUgY29kZSBwYXRoIGZvclxuICAgICBlbmNyeXB0aW9uIHdoZXRoZXIgd2UgYXJlIGRlY3J5cHRpbmcgb3Igbm90ICh0byBzaG9ydGVuIGNvZGUgYW5kXG4gICAgIHNpbXBsaWZ5IHRoZSBnZW5lcmF0aW9uIG9mIGxvb2sgdXAgdGFibGVzKS4gSG93ZXZlciwgYmVjYXVzZSB0aGVyZVxuICAgICBhcmUgZGlmZmVyZW5jZXMgaW4gdGhlIGRlY3J5cHRpb24gYWxnb3JpdGhtLCBvdGhlciB0aGFuIGp1c3Qgc3dhcHBpbmdcbiAgICAgaW4gZGlmZmVyZW50IGxvb2sgdXAgdGFibGVzLCB3ZSBtdXN0IHRyYW5zZm9ybSBvdXIga2V5IHNjaGVkdWxlIHRvXG4gICAgIGFjY291bnQgZm9yIHRoZXNlIGNoYW5nZXM6XG5cbiAgICAgMS4gVGhlIGRlY3J5cHRpb24gYWxnb3JpdGhtIGdldHMgaXRzIGtleSByb3VuZHMgaW4gcmV2ZXJzZSBvcmRlci5cbiAgICAgMi4gVGhlIGRlY3J5cHRpb24gYWxnb3JpdGhtIGFkZHMgdGhlIHJvdW5kIGtleSBiZWZvcmUgbWl4aW5nIGNvbHVtbnNcbiAgICAgICBpbnN0ZWFkIG9mIGFmdGVyd2FyZHMuXG5cbiAgICAgV2UgZG9uJ3QgbmVlZCB0byBtb2RpZnkgb3VyIGtleSBzY2hlZHVsZSB0byBoYW5kbGUgdGhlIGZpcnN0IGNhc2UsXG4gICAgIHdlIGNhbiBqdXN0IHRyYXZlcnNlIHRoZSBrZXkgc2NoZWR1bGUgaW4gcmV2ZXJzZSBvcmRlciB3aGVuIGRlY3J5cHRpbmcuXG5cbiAgICAgVGhlIHNlY29uZCBjYXNlIHJlcXVpcmVzIGEgbGl0dGxlIHdvcmsuXG5cbiAgICAgVGhlIHRhYmxlcyB3ZSBidWlsdCBmb3IgcGVyZm9ybWluZyByb3VuZHMgd2lsbCB0YWtlIGFuIGlucHV0IGFuZCB0aGVuXG4gICAgIHBlcmZvcm0gU3ViQnl0ZXMoKSBhbmQgTWl4Q29sdW1ucygpIG9yLCBmb3IgdGhlIGRlY3J5cHQgdmVyc2lvbixcbiAgICAgSW52U3ViQnl0ZXMoKSBhbmQgSW52TWl4Q29sdW1ucygpLiBCdXQgdGhlIGRlY3J5cHQgYWxnb3JpdGhtIHJlcXVpcmVzXG4gICAgIHVzIHRvIEFkZFJvdW5kS2V5KCkgYmVmb3JlIEludk1peENvbHVtbnMoKS4gVGhpcyBtZWFucyB3ZSdsbCBuZWVkIHRvXG4gICAgIGFwcGx5IHNvbWUgdHJhbnNmb3JtYXRpb25zIHRvIHRoZSByb3VuZCBrZXkgdG8gaW52ZXJzZS1taXggaXRzIGNvbHVtbnNcbiAgICAgc28gdGhleSdsbCBiZSBjb3JyZWN0IGZvciBtb3ZpbmcgQWRkUm91bmRLZXkoKSB0byBhZnRlciB0aGUgc3RhdGUgaGFzXG4gICAgIGhhZCBpdHMgY29sdW1ucyBpbnZlcnNlLW1peGVkLlxuXG4gICAgIFRvIGludmVyc2UtbWl4IHRoZSBjb2x1bW5zIG9mIHRoZSBzdGF0ZSB3aGVuIHdlJ3JlIGRlY3J5cHRpbmcgd2UgdXNlIGFcbiAgICAgbG9va3VwIHRhYmxlIHRoYXQgd2lsbCBhcHBseSBJbnZTdWJCeXRlcygpIGFuZCBJbnZNaXhDb2x1bW5zKCkgYXQgdGhlXG4gICAgIHNhbWUgdGltZS4gSG93ZXZlciwgdGhlIHJvdW5kIGtleSdzIGJ5dGVzIGFyZSBub3QgaW52ZXJzZS1zdWJzdGl0dXRlZFxuICAgICBpbiB0aGUgZGVjcnlwdGlvbiBhbGdvcml0aG0uIFRvIGdldCBhcm91bmQgdGhpcyBwcm9ibGVtLCB3ZSBjYW4gZmlyc3RcbiAgICAgc3Vic3RpdHV0ZSB0aGUgYnl0ZXMgaW4gdGhlIHJvdW5kIGtleSBzbyB0aGF0IHdoZW4gd2UgYXBwbHkgdGhlXG4gICAgIHRyYW5zZm9ybWF0aW9uIHZpYSB0aGUgSW52U3ViQnl0ZXMoKStJbnZNaXhDb2x1bW5zKCkgdGFibGUsIGl0IHdpbGxcbiAgICAgdW5kbyBvdXIgc3Vic3RpdHV0aW9uIGxlYXZpbmcgdXMgd2l0aCB0aGUgb3JpZ2luYWwgdmFsdWUgdGhhdCB3ZVxuICAgICB3YW50IC0tIGFuZCB0aGVuIGludmVyc2UtbWl4IHRoYXQgdmFsdWUuXG5cbiAgICAgVGhpcyBjaGFuZ2Ugd2lsbCBjb3JyZWN0bHkgYWx0ZXIgb3VyIGtleSBzY2hlZHVsZSBzbyB0aGF0IHdlIGNhbiBYT1JcbiAgICAgZWFjaCByb3VuZCBrZXkgd2l0aCBvdXIgYWxyZWFkeSB0cmFuc2Zvcm1lZCBkZWNyeXB0aW9uIHN0YXRlLiBUaGlzXG4gICAgIGFsbG93cyB1cyB0byB1c2UgdGhlIHNhbWUgY29kZSBwYXRoIGFzIHRoZSBlbmNyeXB0aW9uIGFsZ29yaXRobS5cblxuICAgICBXZSBtYWtlIG9uZSBtb3JlIGNoYW5nZSB0byB0aGUgZGVjcnlwdGlvbiBrZXkuIFNpbmNlIHRoZSBkZWNyeXB0aW9uXG4gICAgIGFsZ29yaXRobSBydW5zIGluIHJldmVyc2UgZnJvbSB0aGUgZW5jcnlwdGlvbiBhbGdvcml0aG0sIHdlIHJldmVyc2VcbiAgICAgdGhlIG9yZGVyIG9mIHRoZSByb3VuZCBrZXlzIHRvIGF2b2lkIGhhdmluZyB0byBpdGVyYXRlIG92ZXIgdGhlIGtleVxuICAgICBzY2hlZHVsZSBiYWNrd2FyZHMgd2hlbiBydW5uaW5nIHRoZSBlbmNyeXB0aW9uIGFsZ29yaXRobSBsYXRlciBpblxuICAgICBkZWNyeXB0aW9uIG1vZGUuIEluIGFkZGl0aW9uIHRvIHJldmVyc2luZyB0aGUgb3JkZXIgb2YgdGhlIHJvdW5kIGtleXMsXG4gICAgIHdlIGFsc28gc3dhcCBlYWNoIHJvdW5kIGtleSdzIDJuZCBhbmQgNHRoIHJvd3MuIFNlZSB0aGUgY29tbWVudHNcbiAgICAgc2VjdGlvbiB3aGVyZSByb3VuZHMgYXJlIHBlcmZvcm1lZCBmb3IgbW9yZSBkZXRhaWxzIGFib3V0IHdoeSB0aGlzIGlzXG4gICAgIGRvbmUuIFRoZXNlIGNoYW5nZXMgYXJlIGRvbmUgaW5saW5lIHdpdGggdGhlIG90aGVyIHN1YnN0aXR1dGlvblxuICAgICBkZXNjcmliZWQgYWJvdmUuXG4gICovXG4gIGlmKGRlY3J5cHQpIHtcbiAgICB2YXIgdG1wO1xuICAgIHZhciBtMCA9IGltaXhbMF07XG4gICAgdmFyIG0xID0gaW1peFsxXTtcbiAgICB2YXIgbTIgPSBpbWl4WzJdO1xuICAgIHZhciBtMyA9IGltaXhbM107XG4gICAgdmFyIHduZXcgPSB3LnNsaWNlKDApO1xuICAgIGVuZCA9IHcubGVuZ3RoO1xuICAgIGZvcih2YXIgaSA9IDAsIHdpID0gZW5kIC0gTmI7IGkgPCBlbmQ7IGkgKz0gTmIsIHdpIC09IE5iKSB7XG4gICAgICAvLyBkbyBub3Qgc3ViIHRoZSBmaXJzdCBvciBsYXN0IHJvdW5kIGtleSAocm91bmQga2V5cyBhcmUgTmJcbiAgICAgIC8vIHdvcmRzKSBhcyBubyBjb2x1bW4gbWl4aW5nIGlzIHBlcmZvcm1lZCBiZWZvcmUgdGhleSBhcmUgYWRkZWQsXG4gICAgICAvLyBidXQgZG8gY2hhbmdlIHRoZSBrZXkgb3JkZXJcbiAgICAgIGlmKGkgPT09IDAgfHwgaSA9PT0gKGVuZCAtIE5iKSkge1xuICAgICAgICB3bmV3W2ldID0gd1t3aV07XG4gICAgICAgIHduZXdbaSArIDFdID0gd1t3aSArIDNdO1xuICAgICAgICB3bmV3W2kgKyAyXSA9IHdbd2kgKyAyXTtcbiAgICAgICAgd25ld1tpICsgM10gPSB3W3dpICsgMV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBzdWJzdGl0dXRlIGVhY2ggcm91bmQga2V5IGJ5dGUgYmVjYXVzZSB0aGUgaW52ZXJzZS1taXhcbiAgICAgICAgLy8gdGFibGUgd2lsbCBpbnZlcnNlLXN1YnN0aXR1dGUgaXQgKGVmZmVjdGl2ZWx5IGNhbmNlbCB0aGVcbiAgICAgICAgLy8gc3Vic3RpdHV0aW9uIGJlY2F1c2Ugcm91bmQga2V5IGJ5dGVzIGFyZW4ndCBzdWInZCBpblxuICAgICAgICAvLyBkZWNyeXB0aW9uIG1vZGUpIGFuZCBzd2FwIGluZGV4ZXMgMyBhbmQgMVxuICAgICAgICBmb3IodmFyIG4gPSAwOyBuIDwgTmI7ICsrbikge1xuICAgICAgICAgIHRtcCA9IHdbd2kgKyBuXTtcbiAgICAgICAgICB3bmV3W2kgKyAoMyYtbildID1cbiAgICAgICAgICAgIG0wW3Nib3hbdG1wID4+PiAyNF1dIF5cbiAgICAgICAgICAgIG0xW3Nib3hbdG1wID4+PiAxNiAmIDI1NV1dIF5cbiAgICAgICAgICAgIG0yW3Nib3hbdG1wID4+PiA4ICYgMjU1XV0gXlxuICAgICAgICAgICAgbTNbc2JveFt0bXAgJiAyNTVdXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICB3ID0gd25ldztcbiAgfVxuXG4gIHJldHVybiB3O1xufVxuXG4vKipcbiAqIFVwZGF0ZXMgYSBzaW5nbGUgYmxvY2sgKDE2IGJ5dGVzKSB1c2luZyBBRVMuIFRoZSB1cGRhdGUgd2lsbCBlaXRoZXJcbiAqIGVuY3J5cHQgb3IgZGVjcnlwdCB0aGUgYmxvY2suXG4gKlxuICogQHBhcmFtIHcgdGhlIGtleSBzY2hlZHVsZS5cbiAqIEBwYXJhbSBpbnB1dCB0aGUgaW5wdXQgYmxvY2sgKGFuIGFycmF5IG9mIDMyLWJpdCB3b3JkcykuXG4gKiBAcGFyYW0gb3V0cHV0IHRoZSB1cGRhdGVkIG91dHB1dCBibG9jay5cbiAqIEBwYXJhbSBkZWNyeXB0IHRydWUgdG8gZGVjcnlwdCB0aGUgYmxvY2ssIGZhbHNlIHRvIGVuY3J5cHQgaXQuXG4gKi9cbmZ1bmN0aW9uIF91cGRhdGVCbG9jayh3LCBpbnB1dCwgb3V0cHV0LCBkZWNyeXB0KSB7XG4gIC8qXG4gIENpcGhlcihieXRlIGluWzQqTmJdLCBieXRlIG91dFs0Kk5iXSwgd29yZCB3W05iKihOcisxKV0pXG4gIGJlZ2luXG4gICAgYnl0ZSBzdGF0ZVs0LE5iXVxuICAgIHN0YXRlID0gaW5cbiAgICBBZGRSb3VuZEtleShzdGF0ZSwgd1swLCBOYi0xXSlcbiAgICBmb3Igcm91bmQgPSAxIHN0ZXAgMSB0byBOci0xXG4gICAgICBTdWJCeXRlcyhzdGF0ZSlcbiAgICAgIFNoaWZ0Um93cyhzdGF0ZSlcbiAgICAgIE1peENvbHVtbnMoc3RhdGUpXG4gICAgICBBZGRSb3VuZEtleShzdGF0ZSwgd1tyb3VuZCpOYiwgKHJvdW5kKzEpKk5iLTFdKVxuICAgIGVuZCBmb3JcbiAgICBTdWJCeXRlcyhzdGF0ZSlcbiAgICBTaGlmdFJvd3Moc3RhdGUpXG4gICAgQWRkUm91bmRLZXkoc3RhdGUsIHdbTnIqTmIsIChOcisxKSpOYi0xXSlcbiAgICBvdXQgPSBzdGF0ZVxuICBlbmRcblxuICBJbnZDaXBoZXIoYnl0ZSBpbls0Kk5iXSwgYnl0ZSBvdXRbNCpOYl0sIHdvcmQgd1tOYiooTnIrMSldKVxuICBiZWdpblxuICAgIGJ5dGUgc3RhdGVbNCxOYl1cbiAgICBzdGF0ZSA9IGluXG4gICAgQWRkUm91bmRLZXkoc3RhdGUsIHdbTnIqTmIsIChOcisxKSpOYi0xXSlcbiAgICBmb3Igcm91bmQgPSBOci0xIHN0ZXAgLTEgZG93bnRvIDFcbiAgICAgIEludlNoaWZ0Um93cyhzdGF0ZSlcbiAgICAgIEludlN1YkJ5dGVzKHN0YXRlKVxuICAgICAgQWRkUm91bmRLZXkoc3RhdGUsIHdbcm91bmQqTmIsIChyb3VuZCsxKSpOYi0xXSlcbiAgICAgIEludk1peENvbHVtbnMoc3RhdGUpXG4gICAgZW5kIGZvclxuICAgIEludlNoaWZ0Um93cyhzdGF0ZSlcbiAgICBJbnZTdWJCeXRlcyhzdGF0ZSlcbiAgICBBZGRSb3VuZEtleShzdGF0ZSwgd1swLCBOYi0xXSlcbiAgICBvdXQgPSBzdGF0ZVxuICBlbmRcbiAgKi9cblxuICAvLyBFbmNyeXB0OiBBZGRSb3VuZEtleShzdGF0ZSwgd1swLCBOYi0xXSlcbiAgLy8gRGVjcnlwdDogQWRkUm91bmRLZXkoc3RhdGUsIHdbTnIqTmIsIChOcisxKSpOYi0xXSlcbiAgdmFyIE5yID0gdy5sZW5ndGggLyA0IC0gMTtcbiAgdmFyIG0wLCBtMSwgbTIsIG0zLCBzdWI7XG4gIGlmKGRlY3J5cHQpIHtcbiAgICBtMCA9IGltaXhbMF07XG4gICAgbTEgPSBpbWl4WzFdO1xuICAgIG0yID0gaW1peFsyXTtcbiAgICBtMyA9IGltaXhbM107XG4gICAgc3ViID0gaXNib3g7XG4gIH0gZWxzZSB7XG4gICAgbTAgPSBtaXhbMF07XG4gICAgbTEgPSBtaXhbMV07XG4gICAgbTIgPSBtaXhbMl07XG4gICAgbTMgPSBtaXhbM107XG4gICAgc3ViID0gc2JveDtcbiAgfVxuICB2YXIgYSwgYiwgYywgZCwgYTIsIGIyLCBjMjtcbiAgYSA9IGlucHV0WzBdIF4gd1swXTtcbiAgYiA9IGlucHV0W2RlY3J5cHQgPyAzIDogMV0gXiB3WzFdO1xuICBjID0gaW5wdXRbMl0gXiB3WzJdO1xuICBkID0gaW5wdXRbZGVjcnlwdCA/IDEgOiAzXSBeIHdbM107XG4gIHZhciBpID0gMztcblxuICAvKiBJbiBvcmRlciB0byBzaGFyZSBjb2RlIHdlIGZvbGxvdyB0aGUgZW5jcnlwdGlvbiBhbGdvcml0aG0gd2hlbiBib3RoXG4gICAgZW5jcnlwdGluZyBhbmQgZGVjcnlwdGluZy4gVG8gYWNjb3VudCBmb3IgdGhlIGNoYW5nZXMgcmVxdWlyZWQgaW4gdGhlXG4gICAgZGVjcnlwdGlvbiBhbGdvcml0aG0sIHdlIHVzZSBkaWZmZXJlbnQgbG9va3VwIHRhYmxlcyB3aGVuIGRlY3J5cHRpbmdcbiAgICBhbmQgdXNlIGEgbW9kaWZpZWQga2V5IHNjaGVkdWxlIHRvIGFjY291bnQgZm9yIHRoZSBkaWZmZXJlbmNlIGluIHRoZVxuICAgIG9yZGVyIG9mIHRyYW5zZm9ybWF0aW9ucyBhcHBsaWVkIHdoZW4gcGVyZm9ybWluZyByb3VuZHMuIFdlIGFsc28gZ2V0XG4gICAga2V5IHJvdW5kcyBpbiByZXZlcnNlIG9yZGVyIChyZWxhdGl2ZSB0byBlbmNyeXB0aW9uKS4gKi9cbiAgZm9yKHZhciByb3VuZCA9IDE7IHJvdW5kIDwgTnI7ICsrcm91bmQpIHtcbiAgICAvKiBBcyBkZXNjcmliZWQgYWJvdmUsIHdlJ2xsIGJlIHVzaW5nIHRhYmxlIGxvb2t1cHMgdG8gcGVyZm9ybSB0aGVcbiAgICAgIGNvbHVtbiBtaXhpbmcuIEVhY2ggY29sdW1uIGlzIHN0b3JlZCBhcyBhIHdvcmQgaW4gdGhlIHN0YXRlICh0aGVcbiAgICAgIGFycmF5ICdpbnB1dCcgaGFzIG9uZSBjb2x1bW4gYXMgYSB3b3JkIGF0IGVhY2ggaW5kZXgpLiBJbiBvcmRlciB0b1xuICAgICAgbWl4IGEgY29sdW1uLCB3ZSBwZXJmb3JtIHRoZXNlIHRyYW5zZm9ybWF0aW9ucyBvbiBlYWNoIHJvdyBpbiBjLFxuICAgICAgd2hpY2ggaXMgMSBieXRlIGluIGVhY2ggd29yZC4gVGhlIG5ldyBjb2x1bW4gZm9yIGMwIGlzIGMnMDpcblxuICAgICAgICAgICAgICAgbTAgICAgICBtMSAgICAgIG0yICAgICAgbTNcbiAgICAgIHIwLGMnMCA9IDIqcjAsYzAgKyAzKnIxLGMwICsgMSpyMixjMCArIDEqcjMsYzBcbiAgICAgIHIxLGMnMCA9IDEqcjAsYzAgKyAyKnIxLGMwICsgMypyMixjMCArIDEqcjMsYzBcbiAgICAgIHIyLGMnMCA9IDEqcjAsYzAgKyAxKnIxLGMwICsgMipyMixjMCArIDMqcjMsYzBcbiAgICAgIHIzLGMnMCA9IDMqcjAsYzAgKyAxKnIxLGMwICsgMSpyMixjMCArIDIqcjMsYzBcblxuICAgICAgU28gdXNpbmcgbWl4IHRhYmxlcyB3aGVyZSBjMCBpcyBhIHdvcmQgd2l0aCByMCBiZWluZyBpdHMgdXBwZXJcbiAgICAgIDggYml0cyBhbmQgcjMgYmVpbmcgaXRzIGxvd2VyIDggYml0czpcblxuICAgICAgbTBbYzAgPj4gMjRdIHdpbGwgeWllbGQgdGhpcyB3b3JkOiBbMipyMCwxKnIwLDEqcjAsMypyMF1cbiAgICAgIC4uLlxuICAgICAgbTNbYzAgJiAyNTVdIHdpbGwgeWllbGQgdGhpcyB3b3JkOiBbMSpyMywxKnIzLDMqcjMsMipyM11cblxuICAgICAgVGhlcmVmb3JlIHRvIG1peCB0aGUgY29sdW1ucyBpbiBlYWNoIHdvcmQgaW4gdGhlIHN0YXRlIHdlXG4gICAgICBkbyB0aGUgZm9sbG93aW5nICgmIDI1NSBvbWl0dGVkIGZvciBicmV2aXR5KTpcbiAgICAgIGMnMCxyMCA9IG0wW2MwID4+IDI0XSBeIG0xW2MxID4+IDE2XSBeIG0yW2MyID4+IDhdIF4gbTNbYzNdXG4gICAgICBjJzAscjEgPSBtMFtjMCA+PiAyNF0gXiBtMVtjMSA+PiAxNl0gXiBtMltjMiA+PiA4XSBeIG0zW2MzXVxuICAgICAgYycwLHIyID0gbTBbYzAgPj4gMjRdIF4gbTFbYzEgPj4gMTZdIF4gbTJbYzIgPj4gOF0gXiBtM1tjM11cbiAgICAgIGMnMCxyMyA9IG0wW2MwID4+IDI0XSBeIG0xW2MxID4+IDE2XSBeIG0yW2MyID4+IDhdIF4gbTNbYzNdXG5cbiAgICAgIEhvd2V2ZXIsIGJlZm9yZSBtaXhpbmcsIHRoZSBhbGdvcml0aG0gcmVxdWlyZXMgdXMgdG8gcGVyZm9ybVxuICAgICAgU2hpZnRSb3dzKCkuIFRoZSBTaGlmdFJvd3MoKSB0cmFuc2Zvcm1hdGlvbiBjeWNsaWNhbGx5IHNoaWZ0cyB0aGVcbiAgICAgIGxhc3QgMyByb3dzIG9mIHRoZSBzdGF0ZSBvdmVyIGRpZmZlcmVudCBvZmZzZXRzLiBUaGUgZmlyc3Qgcm93XG4gICAgICAociA9IDApIGlzIG5vdCBzaGlmdGVkLlxuXG4gICAgICBzJ19yLGMgPSBzX3IsKGMgKyBzaGlmdChyLCBOYikgbW9kIE5iXG4gICAgICBmb3IgMCA8IHIgPCA0IGFuZCAwIDw9IGMgPCBOYiBhbmRcbiAgICAgIHNoaWZ0KDEsIDQpID0gMVxuICAgICAgc2hpZnQoMiwgNCkgPSAyXG4gICAgICBzaGlmdCgzLCA0KSA9IDMuXG5cbiAgICAgIFRoaXMgY2F1c2VzIHRoZSBmaXJzdCBieXRlIGluIHIgPSAxIHRvIGJlIG1vdmVkIHRvIHRoZSBlbmQgb2ZcbiAgICAgIHRoZSByb3csIHRoZSBmaXJzdCAyIGJ5dGVzIGluIHIgPSAyIHRvIGJlIG1vdmVkIHRvIHRoZSBlbmQgb2ZcbiAgICAgIHRoZSByb3csIHRoZSBmaXJzdCAzIGJ5dGVzIGluIHIgPSAzIHRvIGJlIG1vdmVkIHRvIHRoZSBlbmQgb2ZcbiAgICAgIHRoZSByb3c6XG5cbiAgICAgIHIxOiBbYzAgYzEgYzIgYzNdID0+IFtjMSBjMiBjMyBjMF1cbiAgICAgIHIyOiBbYzAgYzEgYzIgYzNdICAgIFtjMiBjMyBjMCBjMV1cbiAgICAgIHIzOiBbYzAgYzEgYzIgYzNdICAgIFtjMyBjMCBjMSBjMl1cblxuICAgICAgV2UgY2FuIG1ha2UgdGhlc2Ugc3Vic3RpdHV0aW9ucyBpbmxpbmUgd2l0aCBvdXIgY29sdW1uIG1peGluZyB0b1xuICAgICAgZ2VuZXJhdGUgYW4gdXBkYXRlZCBzZXQgb2YgZXF1YXRpb25zIHRvIHByb2R1Y2UgZWFjaCB3b3JkIGluIHRoZVxuICAgICAgc3RhdGUgKG5vdGUgdGhlIGNvbHVtbnMgaGF2ZSBjaGFuZ2VkIHBvc2l0aW9ucyk6XG5cbiAgICAgIGMwIGMxIGMyIGMzID0+IGMwIGMxIGMyIGMzXG4gICAgICBjMCBjMSBjMiBjMyAgICBjMSBjMiBjMyBjMCAgKGN5Y2xlZCAxIGJ5dGUpXG4gICAgICBjMCBjMSBjMiBjMyAgICBjMiBjMyBjMCBjMSAgKGN5Y2xlZCAyIGJ5dGVzKVxuICAgICAgYzAgYzEgYzIgYzMgICAgYzMgYzAgYzEgYzIgIChjeWNsZWQgMyBieXRlcylcblxuICAgICAgVGhlcmVmb3JlOlxuXG4gICAgICBjJzAgPSAyKnIwLGMwICsgMypyMSxjMSArIDEqcjIsYzIgKyAxKnIzLGMzXG4gICAgICBjJzAgPSAxKnIwLGMwICsgMipyMSxjMSArIDMqcjIsYzIgKyAxKnIzLGMzXG4gICAgICBjJzAgPSAxKnIwLGMwICsgMSpyMSxjMSArIDIqcjIsYzIgKyAzKnIzLGMzXG4gICAgICBjJzAgPSAzKnIwLGMwICsgMSpyMSxjMSArIDEqcjIsYzIgKyAyKnIzLGMzXG5cbiAgICAgIGMnMSA9IDIqcjAsYzEgKyAzKnIxLGMyICsgMSpyMixjMyArIDEqcjMsYzBcbiAgICAgIGMnMSA9IDEqcjAsYzEgKyAyKnIxLGMyICsgMypyMixjMyArIDEqcjMsYzBcbiAgICAgIGMnMSA9IDEqcjAsYzEgKyAxKnIxLGMyICsgMipyMixjMyArIDMqcjMsYzBcbiAgICAgIGMnMSA9IDMqcjAsYzEgKyAxKnIxLGMyICsgMSpyMixjMyArIDIqcjMsYzBcblxuICAgICAgLi4uIGFuZCBzbyBmb3J0aCBmb3IgYycyIGFuZCBjJzMuIFRoZSBpbXBvcnRhbnQgZGlzdGluY3Rpb24gaXNcbiAgICAgIHRoYXQgdGhlIGNvbHVtbnMgYXJlIGN5Y2xpbmcsIHdpdGggYzAgYmVpbmcgdXNlZCB3aXRoIHRoZSBtMFxuICAgICAgbWFwIHdoZW4gY2FsY3VsYXRpbmcgYzAsIGJ1dCBjMSBiZWluZyB1c2VkIHdpdGggdGhlIG0wIG1hcCB3aGVuXG4gICAgICBjYWxjdWxhdGluZyBjMSAuLi4gYW5kIHNvIGZvcnRoLlxuXG4gICAgICBXaGVuIHBlcmZvcm1pbmcgdGhlIGludmVyc2Ugd2UgdHJhbnNmb3JtIHRoZSBtaXJyb3IgaW1hZ2UgYW5kXG4gICAgICBza2lwIHRoZSBib3R0b20gcm93LCBpbnN0ZWFkIG9mIHRoZSB0b3Agb25lLCBhbmQgbW92ZSB1cHdhcmRzOlxuXG4gICAgICBjMyBjMiBjMSBjMCA9PiBjMCBjMyBjMiBjMSAgKGN5Y2xlZCAzIGJ5dGVzKSAqc2FtZSBhcyBlbmNyeXB0aW9uXG4gICAgICBjMyBjMiBjMSBjMCAgICBjMSBjMCBjMyBjMiAgKGN5Y2xlZCAyIGJ5dGVzKVxuICAgICAgYzMgYzIgYzEgYzAgICAgYzIgYzEgYzAgYzMgIChjeWNsZWQgMSBieXRlKSAgKnNhbWUgYXMgZW5jcnlwdGlvblxuICAgICAgYzMgYzIgYzEgYzAgICAgYzMgYzIgYzEgYzBcblxuICAgICAgSWYgeW91IGNvbXBhcmUgdGhlIHJlc3VsdGluZyBtYXRyaWNlcyBmb3IgU2hpZnRSb3dzKCkrTWl4Q29sdW1ucygpXG4gICAgICBhbmQgZm9yIEludlNoaWZ0Um93cygpK0ludk1peENvbHVtbnMoKSB0aGUgMm5kIGFuZCA0dGggY29sdW1ucyBhcmVcbiAgICAgIGRpZmZlcmVudCAoaW4gZW5jcnlwdCBtb2RlIHZzLiBkZWNyeXB0IG1vZGUpLiBTbyBpbiBvcmRlciB0byB1c2VcbiAgICAgIHRoZSBzYW1lIGNvZGUgdG8gaGFuZGxlIGJvdGggZW5jcnlwdGlvbiBhbmQgZGVjcnlwdGlvbiwgd2Ugd2lsbFxuICAgICAgbmVlZCB0byBkbyBzb21lIG1hcHBpbmcuXG5cbiAgICAgIElmIGluIGVuY3J5cHRpb24gbW9kZSB3ZSBsZXQgYT1jMCwgYj1jMSwgYz1jMiwgZD1jMywgYW5kIHI8Tj4gYmVcbiAgICAgIGEgcm93IG51bWJlciBpbiB0aGUgc3RhdGUsIHRoZW4gdGhlIHJlc3VsdGluZyBtYXRyaXggaW4gZW5jcnlwdGlvblxuICAgICAgbW9kZSBmb3IgYXBwbHlpbmcgdGhlIGFib3ZlIHRyYW5zZm9ybWF0aW9ucyB3b3VsZCBiZTpcblxuICAgICAgcjE6IGEgYiBjIGRcbiAgICAgIHIyOiBiIGMgZCBhXG4gICAgICByMzogYyBkIGEgYlxuICAgICAgcjQ6IGQgYSBiIGNcblxuICAgICAgSWYgd2UgZGlkIHRoZSBzYW1lIGluIGRlY3J5cHRpb24gbW9kZSB3ZSB3b3VsZCBnZXQ6XG5cbiAgICAgIHIxOiBhIGQgYyBiXG4gICAgICByMjogYiBhIGQgY1xuICAgICAgcjM6IGMgYiBhIGRcbiAgICAgIHI0OiBkIGMgYiBhXG5cbiAgICAgIElmIGluc3RlYWQgd2Ugc3dhcCBkIGFuZCBiIChzZXQgYj1jMyBhbmQgZD1jMSksIHRoZW4gd2UgZ2V0OlxuXG4gICAgICByMTogYSBiIGMgZFxuICAgICAgcjI6IGQgYSBiIGNcbiAgICAgIHIzOiBjIGQgYSBiXG4gICAgICByNDogYiBjIGQgYVxuXG4gICAgICBOb3cgdGhlIDFzdCBhbmQgM3JkIHJvd3MgYXJlIHRoZSBzYW1lIGFzIHRoZSBlbmNyeXB0aW9uIG1hdHJpeC4gQWxsXG4gICAgICB3ZSBuZWVkIHRvIGRvIHRoZW4gdG8gbWFrZSB0aGUgbWFwcGluZyBleGFjdGx5IHRoZSBzYW1lIGlzIHRvIHN3YXBcbiAgICAgIHRoZSAybmQgYW5kIDR0aCByb3dzIHdoZW4gaW4gZGVjcnlwdGlvbiBtb2RlLiBUbyBkbyB0aGlzIHdpdGhvdXRcbiAgICAgIGhhdmluZyB0byBkbyBpdCBvbiBlYWNoIGl0ZXJhdGlvbiwgd2Ugc3dhcHBlZCB0aGUgMm5kIGFuZCA0dGggcm93c1xuICAgICAgaW4gdGhlIGRlY3J5cHRpb24ga2V5IHNjaGVkdWxlLiBXZSBhbHNvIGhhdmUgdG8gZG8gdGhlIHN3YXAgYWJvdmVcbiAgICAgIHdoZW4gd2UgZmlyc3QgcHVsbCBpbiB0aGUgaW5wdXQgYW5kIHdoZW4gd2Ugc2V0IHRoZSBmaW5hbCBvdXRwdXQuICovXG4gICAgYTIgPVxuICAgICAgbTBbYSA+Pj4gMjRdIF5cbiAgICAgIG0xW2IgPj4+IDE2ICYgMjU1XSBeXG4gICAgICBtMltjID4+PiA4ICYgMjU1XSBeXG4gICAgICBtM1tkICYgMjU1XSBeIHdbKytpXTtcbiAgICBiMiA9XG4gICAgICBtMFtiID4+PiAyNF0gXlxuICAgICAgbTFbYyA+Pj4gMTYgJiAyNTVdIF5cbiAgICAgIG0yW2QgPj4+IDggJiAyNTVdIF5cbiAgICAgIG0zW2EgJiAyNTVdIF4gd1srK2ldO1xuICAgIGMyID1cbiAgICAgIG0wW2MgPj4+IDI0XSBeXG4gICAgICBtMVtkID4+PiAxNiAmIDI1NV0gXlxuICAgICAgbTJbYSA+Pj4gOCAmIDI1NV0gXlxuICAgICAgbTNbYiAmIDI1NV0gXiB3WysraV07XG4gICAgZCA9XG4gICAgICBtMFtkID4+PiAyNF0gXlxuICAgICAgbTFbYSA+Pj4gMTYgJiAyNTVdIF5cbiAgICAgIG0yW2IgPj4+IDggJiAyNTVdIF5cbiAgICAgIG0zW2MgJiAyNTVdIF4gd1srK2ldO1xuICAgIGEgPSBhMjtcbiAgICBiID0gYjI7XG4gICAgYyA9IGMyO1xuICB9XG5cbiAgLypcbiAgICBFbmNyeXB0OlxuICAgIFN1YkJ5dGVzKHN0YXRlKVxuICAgIFNoaWZ0Um93cyhzdGF0ZSlcbiAgICBBZGRSb3VuZEtleShzdGF0ZSwgd1tOcipOYiwgKE5yKzEpKk5iLTFdKVxuXG4gICAgRGVjcnlwdDpcbiAgICBJbnZTaGlmdFJvd3Moc3RhdGUpXG4gICAgSW52U3ViQnl0ZXMoc3RhdGUpXG4gICAgQWRkUm91bmRLZXkoc3RhdGUsIHdbMCwgTmItMV0pXG4gICAqL1xuICAvLyBOb3RlOiByb3dzIGFyZSBzaGlmdGVkIGlubGluZVxuICBvdXRwdXRbMF0gPVxuICAgIChzdWJbYSA+Pj4gMjRdIDw8IDI0KSBeXG4gICAgKHN1YltiID4+PiAxNiAmIDI1NV0gPDwgMTYpIF5cbiAgICAoc3ViW2MgPj4+IDggJiAyNTVdIDw8IDgpIF5cbiAgICAoc3ViW2QgJiAyNTVdKSBeIHdbKytpXTtcbiAgb3V0cHV0W2RlY3J5cHQgPyAzIDogMV0gPVxuICAgIChzdWJbYiA+Pj4gMjRdIDw8IDI0KSBeXG4gICAgKHN1YltjID4+PiAxNiAmIDI1NV0gPDwgMTYpIF5cbiAgICAoc3ViW2QgPj4+IDggJiAyNTVdIDw8IDgpIF5cbiAgICAoc3ViW2EgJiAyNTVdKSBeIHdbKytpXTtcbiAgb3V0cHV0WzJdID1cbiAgICAoc3ViW2MgPj4+IDI0XSA8PCAyNCkgXlxuICAgIChzdWJbZCA+Pj4gMTYgJiAyNTVdIDw8IDE2KSBeXG4gICAgKHN1YlthID4+PiA4ICYgMjU1XSA8PCA4KSBeXG4gICAgKHN1YltiICYgMjU1XSkgXiB3WysraV07XG4gIG91dHB1dFtkZWNyeXB0ID8gMSA6IDNdID1cbiAgICAoc3ViW2QgPj4+IDI0XSA8PCAyNCkgXlxuICAgIChzdWJbYSA+Pj4gMTYgJiAyNTVdIDw8IDE2KSBeXG4gICAgKHN1YltiID4+PiA4ICYgMjU1XSA8PCA4KSBeXG4gICAgKHN1YltjICYgMjU1XSkgXiB3WysraV07XG59XG5cbi8qKlxuICogRGVwcmVjYXRlZC4gSW5zdGVhZCwgdXNlOlxuICpcbiAqIGZvcmdlLmNpcGhlci5jcmVhdGVDaXBoZXIoJ0FFUy08bW9kZT4nLCBrZXkpO1xuICogZm9yZ2UuY2lwaGVyLmNyZWF0ZURlY2lwaGVyKCdBRVMtPG1vZGU+Jywga2V5KTtcbiAqXG4gKiBDcmVhdGVzIGEgZGVwcmVjYXRlZCBBRVMgY2lwaGVyIG9iamVjdC4gVGhpcyBvYmplY3QncyBtb2RlIHdpbGwgZGVmYXVsdCB0b1xuICogQ0JDIChjaXBoZXItYmxvY2stY2hhaW5pbmcpLlxuICpcbiAqIFRoZSBrZXkgYW5kIGl2IG1heSBiZSBnaXZlbiBhcyBhIHN0cmluZyBvZiBieXRlcywgYW4gYXJyYXkgb2YgYnl0ZXMsIGFcbiAqIGJ5dGUgYnVmZmVyLCBvciBhbiBhcnJheSBvZiAzMi1iaXQgd29yZHMuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgdGhlIG9wdGlvbnMgdG8gdXNlLlxuICogICAgICAgICAga2V5IHRoZSBzeW1tZXRyaWMga2V5IHRvIHVzZS5cbiAqICAgICAgICAgIG91dHB1dCB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvLlxuICogICAgICAgICAgZGVjcnlwdCB0cnVlIGZvciBkZWNyeXB0aW9uLCBmYWxzZSBmb3IgZW5jcnlwdGlvbi5cbiAqICAgICAgICAgIG1vZGUgdGhlIGNpcGhlciBtb2RlIHRvIHVzZSAoZGVmYXVsdDogJ0NCQycpLlxuICpcbiAqIEByZXR1cm4gdGhlIGNpcGhlci5cbiAqL1xuZnVuY3Rpb24gX2NyZWF0ZUNpcGhlcihvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICB2YXIgbW9kZSA9IChvcHRpb25zLm1vZGUgfHwgJ0NCQycpLnRvVXBwZXJDYXNlKCk7XG4gIHZhciBhbGdvcml0aG0gPSAnQUVTLScgKyBtb2RlO1xuXG4gIHZhciBjaXBoZXI7XG4gIGlmKG9wdGlvbnMuZGVjcnlwdCkge1xuICAgIGNpcGhlciA9IGZvcmdlLmNpcGhlci5jcmVhdGVEZWNpcGhlcihhbGdvcml0aG0sIG9wdGlvbnMua2V5KTtcbiAgfSBlbHNlIHtcbiAgICBjaXBoZXIgPSBmb3JnZS5jaXBoZXIuY3JlYXRlQ2lwaGVyKGFsZ29yaXRobSwgb3B0aW9ucy5rZXkpO1xuICB9XG5cbiAgLy8gYmFja3dhcmRzIGNvbXBhdGlibGUgc3RhcnQgQVBJXG4gIHZhciBzdGFydCA9IGNpcGhlci5zdGFydDtcbiAgY2lwaGVyLnN0YXJ0ID0gZnVuY3Rpb24oaXYsIG9wdGlvbnMpIHtcbiAgICAvLyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eTogc3VwcG9ydCBzZWNvbmQgYXJnIGFzIG91dHB1dCBidWZmZXJcbiAgICB2YXIgb3V0cHV0ID0gbnVsbDtcbiAgICBpZihvcHRpb25zIGluc3RhbmNlb2YgZm9yZ2UudXRpbC5CeXRlQnVmZmVyKSB7XG4gICAgICBvdXRwdXQgPSBvcHRpb25zO1xuICAgICAgb3B0aW9ucyA9IHt9O1xuICAgIH1cbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICBvcHRpb25zLm91dHB1dCA9IG91dHB1dDtcbiAgICBvcHRpb25zLml2ID0gaXY7XG4gICAgc3RhcnQuY2FsbChjaXBoZXIsIG9wdGlvbnMpO1xuICB9O1xuXG4gIHJldHVybiBjaXBoZXI7XG59XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///22\n")},function(module,exports,__webpack_require__){eval("/**\n * Object IDs for ASN.1.\n *\n * @author Dave Longley\n *\n * Copyright (c) 2010-2013 Digital Bazaar, Inc.\n */\nvar forge = __webpack_require__(4);\n\nforge.pki = forge.pki || {};\nvar oids = module.exports = forge.pki.oids = forge.oids = forge.oids || {};\n\n// set id to name mapping and name to id mapping\nfunction _IN(id, name) {\n  oids[id] = name;\n  oids[name] = id;\n}\n// set id to name mapping only\nfunction _I_(id, name) {\n  oids[id] = name;\n}\n\n// algorithm OIDs\n_IN('1.2.840.113549.1.1.1', 'rsaEncryption');\n// Note: md2 & md4 not implemented\n//_IN('1.2.840.113549.1.1.2', 'md2WithRSAEncryption');\n//_IN('1.2.840.113549.1.1.3', 'md4WithRSAEncryption');\n_IN('1.2.840.113549.1.1.4', 'md5WithRSAEncryption');\n_IN('1.2.840.113549.1.1.5', 'sha1WithRSAEncryption');\n_IN('1.2.840.113549.1.1.7', 'RSAES-OAEP');\n_IN('1.2.840.113549.1.1.8', 'mgf1');\n_IN('1.2.840.113549.1.1.9', 'pSpecified');\n_IN('1.2.840.113549.1.1.10', 'RSASSA-PSS');\n_IN('1.2.840.113549.1.1.11', 'sha256WithRSAEncryption');\n_IN('1.2.840.113549.1.1.12', 'sha384WithRSAEncryption');\n_IN('1.2.840.113549.1.1.13', 'sha512WithRSAEncryption');\n// Edwards-curve Digital Signature Algorithm (EdDSA) Ed25519\n_IN('1.3.101.112', 'EdDSA25519');\n\n_IN('1.2.840.10040.4.3', 'dsa-with-sha1');\n\n_IN('1.3.14.3.2.7', 'desCBC');\n\n_IN('1.3.14.3.2.26', 'sha1');\n// Deprecated equivalent of sha1WithRSAEncryption\n_IN('1.3.14.3.2.29', 'sha1WithRSASignature');\n_IN('2.16.840.1.101.3.4.2.1', 'sha256');\n_IN('2.16.840.1.101.3.4.2.2', 'sha384');\n_IN('2.16.840.1.101.3.4.2.3', 'sha512');\n_IN('2.16.840.1.101.3.4.2.4', 'sha224');\n_IN('2.16.840.1.101.3.4.2.5', 'sha512-224');\n_IN('2.16.840.1.101.3.4.2.6', 'sha512-256');\n_IN('1.2.840.113549.2.2', 'md2');\n_IN('1.2.840.113549.2.5', 'md5');\n\n// pkcs#7 content types\n_IN('1.2.840.113549.1.7.1', 'data');\n_IN('1.2.840.113549.1.7.2', 'signedData');\n_IN('1.2.840.113549.1.7.3', 'envelopedData');\n_IN('1.2.840.113549.1.7.4', 'signedAndEnvelopedData');\n_IN('1.2.840.113549.1.7.5', 'digestedData');\n_IN('1.2.840.113549.1.7.6', 'encryptedData');\n\n// pkcs#9 oids\n_IN('1.2.840.113549.1.9.1', 'emailAddress');\n_IN('1.2.840.113549.1.9.2', 'unstructuredName');\n_IN('1.2.840.113549.1.9.3', 'contentType');\n_IN('1.2.840.113549.1.9.4', 'messageDigest');\n_IN('1.2.840.113549.1.9.5', 'signingTime');\n_IN('1.2.840.113549.1.9.6', 'counterSignature');\n_IN('1.2.840.113549.1.9.7', 'challengePassword');\n_IN('1.2.840.113549.1.9.8', 'unstructuredAddress');\n_IN('1.2.840.113549.1.9.14', 'extensionRequest');\n\n_IN('1.2.840.113549.1.9.20', 'friendlyName');\n_IN('1.2.840.113549.1.9.21', 'localKeyId');\n_IN('1.2.840.113549.1.9.22.1', 'x509Certificate');\n\n// pkcs#12 safe bags\n_IN('1.2.840.113549.1.12.10.1.1', 'keyBag');\n_IN('1.2.840.113549.1.12.10.1.2', 'pkcs8ShroudedKeyBag');\n_IN('1.2.840.113549.1.12.10.1.3', 'certBag');\n_IN('1.2.840.113549.1.12.10.1.4', 'crlBag');\n_IN('1.2.840.113549.1.12.10.1.5', 'secretBag');\n_IN('1.2.840.113549.1.12.10.1.6', 'safeContentsBag');\n\n// password-based-encryption for pkcs#12\n_IN('1.2.840.113549.1.5.13', 'pkcs5PBES2');\n_IN('1.2.840.113549.1.5.12', 'pkcs5PBKDF2');\n\n_IN('1.2.840.113549.1.12.1.1', 'pbeWithSHAAnd128BitRC4');\n_IN('1.2.840.113549.1.12.1.2', 'pbeWithSHAAnd40BitRC4');\n_IN('1.2.840.113549.1.12.1.3', 'pbeWithSHAAnd3-KeyTripleDES-CBC');\n_IN('1.2.840.113549.1.12.1.4', 'pbeWithSHAAnd2-KeyTripleDES-CBC');\n_IN('1.2.840.113549.1.12.1.5', 'pbeWithSHAAnd128BitRC2-CBC');\n_IN('1.2.840.113549.1.12.1.6', 'pbewithSHAAnd40BitRC2-CBC');\n\n// hmac OIDs\n_IN('1.2.840.113549.2.7', 'hmacWithSHA1');\n_IN('1.2.840.113549.2.8', 'hmacWithSHA224');\n_IN('1.2.840.113549.2.9', 'hmacWithSHA256');\n_IN('1.2.840.113549.2.10', 'hmacWithSHA384');\n_IN('1.2.840.113549.2.11', 'hmacWithSHA512');\n\n// symmetric key algorithm oids\n_IN('1.2.840.113549.3.7', 'des-EDE3-CBC');\n_IN('2.16.840.1.101.3.4.1.2', 'aes128-CBC');\n_IN('2.16.840.1.101.3.4.1.22', 'aes192-CBC');\n_IN('2.16.840.1.101.3.4.1.42', 'aes256-CBC');\n\n// certificate issuer/subject OIDs\n_IN('2.5.4.3', 'commonName');\n_IN('2.5.4.4', 'surname');\n_IN('2.5.4.5', 'serialNumber');\n_IN('2.5.4.6', 'countryName');\n_IN('2.5.4.7', 'localityName');\n_IN('2.5.4.8', 'stateOrProvinceName');\n_IN('2.5.4.9', 'streetAddress');\n_IN('2.5.4.10', 'organizationName');\n_IN('2.5.4.11', 'organizationalUnitName');\n_IN('2.5.4.12', 'title');\n_IN('2.5.4.13', 'description');\n_IN('2.5.4.15', 'businessCategory');\n_IN('2.5.4.17', 'postalCode');\n_IN('2.5.4.42', 'givenName');\n_IN('1.3.6.1.4.1.311.60.2.1.2', 'jurisdictionOfIncorporationStateOrProvinceName');\n_IN('1.3.6.1.4.1.311.60.2.1.3', 'jurisdictionOfIncorporationCountryName');\n\n// X.509 extension OIDs\n_IN('2.16.840.1.113730.1.1', 'nsCertType');\n_IN('2.16.840.1.113730.1.13', 'nsComment'); // deprecated in theory; still widely used\n_I_('2.5.29.1', 'authorityKeyIdentifier'); // deprecated, use .35\n_I_('2.5.29.2', 'keyAttributes'); // obsolete use .37 or .15\n_I_('2.5.29.3', 'certificatePolicies'); // deprecated, use .32\n_I_('2.5.29.4', 'keyUsageRestriction'); // obsolete use .37 or .15\n_I_('2.5.29.5', 'policyMapping'); // deprecated use .33\n_I_('2.5.29.6', 'subtreesConstraint'); // obsolete use .30\n_I_('2.5.29.7', 'subjectAltName'); // deprecated use .17\n_I_('2.5.29.8', 'issuerAltName'); // deprecated use .18\n_I_('2.5.29.9', 'subjectDirectoryAttributes');\n_I_('2.5.29.10', 'basicConstraints'); // deprecated use .19\n_I_('2.5.29.11', 'nameConstraints'); // deprecated use .30\n_I_('2.5.29.12', 'policyConstraints'); // deprecated use .36\n_I_('2.5.29.13', 'basicConstraints'); // deprecated use .19\n_IN('2.5.29.14', 'subjectKeyIdentifier');\n_IN('2.5.29.15', 'keyUsage');\n_I_('2.5.29.16', 'privateKeyUsagePeriod');\n_IN('2.5.29.17', 'subjectAltName');\n_IN('2.5.29.18', 'issuerAltName');\n_IN('2.5.29.19', 'basicConstraints');\n_I_('2.5.29.20', 'cRLNumber');\n_I_('2.5.29.21', 'cRLReason');\n_I_('2.5.29.22', 'expirationDate');\n_I_('2.5.29.23', 'instructionCode');\n_I_('2.5.29.24', 'invalidityDate');\n_I_('2.5.29.25', 'cRLDistributionPoints'); // deprecated use .31\n_I_('2.5.29.26', 'issuingDistributionPoint'); // deprecated use .28\n_I_('2.5.29.27', 'deltaCRLIndicator');\n_I_('2.5.29.28', 'issuingDistributionPoint');\n_I_('2.5.29.29', 'certificateIssuer');\n_I_('2.5.29.30', 'nameConstraints');\n_IN('2.5.29.31', 'cRLDistributionPoints');\n_IN('2.5.29.32', 'certificatePolicies');\n_I_('2.5.29.33', 'policyMappings');\n_I_('2.5.29.34', 'policyConstraints'); // deprecated use .36\n_IN('2.5.29.35', 'authorityKeyIdentifier');\n_I_('2.5.29.36', 'policyConstraints');\n_IN('2.5.29.37', 'extKeyUsage');\n_I_('2.5.29.46', 'freshestCRL');\n_I_('2.5.29.54', 'inhibitAnyPolicy');\n\n// extKeyUsage purposes\n_IN('1.3.6.1.4.1.11129.2.4.2', 'timestampList');\n_IN('1.3.6.1.5.5.7.1.1', 'authorityInfoAccess');\n_IN('1.3.6.1.5.5.7.3.1', 'serverAuth');\n_IN('1.3.6.1.5.5.7.3.2', 'clientAuth');\n_IN('1.3.6.1.5.5.7.3.3', 'codeSigning');\n_IN('1.3.6.1.5.5.7.3.4', 'emailProtection');\n_IN('1.3.6.1.5.5.7.3.8', 'timeStamping');\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbm9kZS1mb3JnZS9saWIvb2lkcy5qcz9mNzZmIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogT2JqZWN0IElEcyBmb3IgQVNOLjEuXG4gKlxuICogQGF1dGhvciBEYXZlIExvbmdsZXlcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMyBEaWdpdGFsIEJhemFhciwgSW5jLlxuICovXG52YXIgZm9yZ2UgPSByZXF1aXJlKCcuL2ZvcmdlJyk7XG5cbmZvcmdlLnBraSA9IGZvcmdlLnBraSB8fCB7fTtcbnZhciBvaWRzID0gbW9kdWxlLmV4cG9ydHMgPSBmb3JnZS5wa2kub2lkcyA9IGZvcmdlLm9pZHMgPSBmb3JnZS5vaWRzIHx8IHt9O1xuXG4vLyBzZXQgaWQgdG8gbmFtZSBtYXBwaW5nIGFuZCBuYW1lIHRvIGlkIG1hcHBpbmdcbmZ1bmN0aW9uIF9JTihpZCwgbmFtZSkge1xuICBvaWRzW2lkXSA9IG5hbWU7XG4gIG9pZHNbbmFtZV0gPSBpZDtcbn1cbi8vIHNldCBpZCB0byBuYW1lIG1hcHBpbmcgb25seVxuZnVuY3Rpb24gX0lfKGlkLCBuYW1lKSB7XG4gIG9pZHNbaWRdID0gbmFtZTtcbn1cblxuLy8gYWxnb3JpdGhtIE9JRHNcbl9JTignMS4yLjg0MC4xMTM1NDkuMS4xLjEnLCAncnNhRW5jcnlwdGlvbicpO1xuLy8gTm90ZTogbWQyICYgbWQ0IG5vdCBpbXBsZW1lbnRlZFxuLy9fSU4oJzEuMi44NDAuMTEzNTQ5LjEuMS4yJywgJ21kMldpdGhSU0FFbmNyeXB0aW9uJyk7XG4vL19JTignMS4yLjg0MC4xMTM1NDkuMS4xLjMnLCAnbWQ0V2l0aFJTQUVuY3J5cHRpb24nKTtcbl9JTignMS4yLjg0MC4xMTM1NDkuMS4xLjQnLCAnbWQ1V2l0aFJTQUVuY3J5cHRpb24nKTtcbl9JTignMS4yLjg0MC4xMTM1NDkuMS4xLjUnLCAnc2hhMVdpdGhSU0FFbmNyeXB0aW9uJyk7XG5fSU4oJzEuMi44NDAuMTEzNTQ5LjEuMS43JywgJ1JTQUVTLU9BRVAnKTtcbl9JTignMS4yLjg0MC4xMTM1NDkuMS4xLjgnLCAnbWdmMScpO1xuX0lOKCcxLjIuODQwLjExMzU0OS4xLjEuOScsICdwU3BlY2lmaWVkJyk7XG5fSU4oJzEuMi44NDAuMTEzNTQ5LjEuMS4xMCcsICdSU0FTU0EtUFNTJyk7XG5fSU4oJzEuMi44NDAuMTEzNTQ5LjEuMS4xMScsICdzaGEyNTZXaXRoUlNBRW5jcnlwdGlvbicpO1xuX0lOKCcxLjIuODQwLjExMzU0OS4xLjEuMTInLCAnc2hhMzg0V2l0aFJTQUVuY3J5cHRpb24nKTtcbl9JTignMS4yLjg0MC4xMTM1NDkuMS4xLjEzJywgJ3NoYTUxMldpdGhSU0FFbmNyeXB0aW9uJyk7XG4vLyBFZHdhcmRzLWN1cnZlIERpZ2l0YWwgU2lnbmF0dXJlIEFsZ29yaXRobSAoRWREU0EpIEVkMjU1MTlcbl9JTignMS4zLjEwMS4xMTInLCAnRWREU0EyNTUxOScpO1xuXG5fSU4oJzEuMi44NDAuMTAwNDAuNC4zJywgJ2RzYS13aXRoLXNoYTEnKTtcblxuX0lOKCcxLjMuMTQuMy4yLjcnLCAnZGVzQ0JDJyk7XG5cbl9JTignMS4zLjE0LjMuMi4yNicsICdzaGExJyk7XG4vLyBEZXByZWNhdGVkIGVxdWl2YWxlbnQgb2Ygc2hhMVdpdGhSU0FFbmNyeXB0aW9uXG5fSU4oJzEuMy4xNC4zLjIuMjknLCAnc2hhMVdpdGhSU0FTaWduYXR1cmUnKTtcbl9JTignMi4xNi44NDAuMS4xMDEuMy40LjIuMScsICdzaGEyNTYnKTtcbl9JTignMi4xNi44NDAuMS4xMDEuMy40LjIuMicsICdzaGEzODQnKTtcbl9JTignMi4xNi44NDAuMS4xMDEuMy40LjIuMycsICdzaGE1MTInKTtcbl9JTignMi4xNi44NDAuMS4xMDEuMy40LjIuNCcsICdzaGEyMjQnKTtcbl9JTignMi4xNi44NDAuMS4xMDEuMy40LjIuNScsICdzaGE1MTItMjI0Jyk7XG5fSU4oJzIuMTYuODQwLjEuMTAxLjMuNC4yLjYnLCAnc2hhNTEyLTI1NicpO1xuX0lOKCcxLjIuODQwLjExMzU0OS4yLjInLCAnbWQyJyk7XG5fSU4oJzEuMi44NDAuMTEzNTQ5LjIuNScsICdtZDUnKTtcblxuLy8gcGtjcyM3IGNvbnRlbnQgdHlwZXNcbl9JTignMS4yLjg0MC4xMTM1NDkuMS43LjEnLCAnZGF0YScpO1xuX0lOKCcxLjIuODQwLjExMzU0OS4xLjcuMicsICdzaWduZWREYXRhJyk7XG5fSU4oJzEuMi44NDAuMTEzNTQ5LjEuNy4zJywgJ2VudmVsb3BlZERhdGEnKTtcbl9JTignMS4yLjg0MC4xMTM1NDkuMS43LjQnLCAnc2lnbmVkQW5kRW52ZWxvcGVkRGF0YScpO1xuX0lOKCcxLjIuODQwLjExMzU0OS4xLjcuNScsICdkaWdlc3RlZERhdGEnKTtcbl9JTignMS4yLjg0MC4xMTM1NDkuMS43LjYnLCAnZW5jcnlwdGVkRGF0YScpO1xuXG4vLyBwa2NzIzkgb2lkc1xuX0lOKCcxLjIuODQwLjExMzU0OS4xLjkuMScsICdlbWFpbEFkZHJlc3MnKTtcbl9JTignMS4yLjg0MC4xMTM1NDkuMS45LjInLCAndW5zdHJ1Y3R1cmVkTmFtZScpO1xuX0lOKCcxLjIuODQwLjExMzU0OS4xLjkuMycsICdjb250ZW50VHlwZScpO1xuX0lOKCcxLjIuODQwLjExMzU0OS4xLjkuNCcsICdtZXNzYWdlRGlnZXN0Jyk7XG5fSU4oJzEuMi44NDAuMTEzNTQ5LjEuOS41JywgJ3NpZ25pbmdUaW1lJyk7XG5fSU4oJzEuMi44NDAuMTEzNTQ5LjEuOS42JywgJ2NvdW50ZXJTaWduYXR1cmUnKTtcbl9JTignMS4yLjg0MC4xMTM1NDkuMS45LjcnLCAnY2hhbGxlbmdlUGFzc3dvcmQnKTtcbl9JTignMS4yLjg0MC4xMTM1NDkuMS45LjgnLCAndW5zdHJ1Y3R1cmVkQWRkcmVzcycpO1xuX0lOKCcxLjIuODQwLjExMzU0OS4xLjkuMTQnLCAnZXh0ZW5zaW9uUmVxdWVzdCcpO1xuXG5fSU4oJzEuMi44NDAuMTEzNTQ5LjEuOS4yMCcsICdmcmllbmRseU5hbWUnKTtcbl9JTignMS4yLjg0MC4xMTM1NDkuMS45LjIxJywgJ2xvY2FsS2V5SWQnKTtcbl9JTignMS4yLjg0MC4xMTM1NDkuMS45LjIyLjEnLCAneDUwOUNlcnRpZmljYXRlJyk7XG5cbi8vIHBrY3MjMTIgc2FmZSBiYWdzXG5fSU4oJzEuMi44NDAuMTEzNTQ5LjEuMTIuMTAuMS4xJywgJ2tleUJhZycpO1xuX0lOKCcxLjIuODQwLjExMzU0OS4xLjEyLjEwLjEuMicsICdwa2NzOFNocm91ZGVkS2V5QmFnJyk7XG5fSU4oJzEuMi44NDAuMTEzNTQ5LjEuMTIuMTAuMS4zJywgJ2NlcnRCYWcnKTtcbl9JTignMS4yLjg0MC4xMTM1NDkuMS4xMi4xMC4xLjQnLCAnY3JsQmFnJyk7XG5fSU4oJzEuMi44NDAuMTEzNTQ5LjEuMTIuMTAuMS41JywgJ3NlY3JldEJhZycpO1xuX0lOKCcxLjIuODQwLjExMzU0OS4xLjEyLjEwLjEuNicsICdzYWZlQ29udGVudHNCYWcnKTtcblxuLy8gcGFzc3dvcmQtYmFzZWQtZW5jcnlwdGlvbiBmb3IgcGtjcyMxMlxuX0lOKCcxLjIuODQwLjExMzU0OS4xLjUuMTMnLCAncGtjczVQQkVTMicpO1xuX0lOKCcxLjIuODQwLjExMzU0OS4xLjUuMTInLCAncGtjczVQQktERjInKTtcblxuX0lOKCcxLjIuODQwLjExMzU0OS4xLjEyLjEuMScsICdwYmVXaXRoU0hBQW5kMTI4Qml0UkM0Jyk7XG5fSU4oJzEuMi44NDAuMTEzNTQ5LjEuMTIuMS4yJywgJ3BiZVdpdGhTSEFBbmQ0MEJpdFJDNCcpO1xuX0lOKCcxLjIuODQwLjExMzU0OS4xLjEyLjEuMycsICdwYmVXaXRoU0hBQW5kMy1LZXlUcmlwbGVERVMtQ0JDJyk7XG5fSU4oJzEuMi44NDAuMTEzNTQ5LjEuMTIuMS40JywgJ3BiZVdpdGhTSEFBbmQyLUtleVRyaXBsZURFUy1DQkMnKTtcbl9JTignMS4yLjg0MC4xMTM1NDkuMS4xMi4xLjUnLCAncGJlV2l0aFNIQUFuZDEyOEJpdFJDMi1DQkMnKTtcbl9JTignMS4yLjg0MC4xMTM1NDkuMS4xMi4xLjYnLCAncGJld2l0aFNIQUFuZDQwQml0UkMyLUNCQycpO1xuXG4vLyBobWFjIE9JRHNcbl9JTignMS4yLjg0MC4xMTM1NDkuMi43JywgJ2htYWNXaXRoU0hBMScpO1xuX0lOKCcxLjIuODQwLjExMzU0OS4yLjgnLCAnaG1hY1dpdGhTSEEyMjQnKTtcbl9JTignMS4yLjg0MC4xMTM1NDkuMi45JywgJ2htYWNXaXRoU0hBMjU2Jyk7XG5fSU4oJzEuMi44NDAuMTEzNTQ5LjIuMTAnLCAnaG1hY1dpdGhTSEEzODQnKTtcbl9JTignMS4yLjg0MC4xMTM1NDkuMi4xMScsICdobWFjV2l0aFNIQTUxMicpO1xuXG4vLyBzeW1tZXRyaWMga2V5IGFsZ29yaXRobSBvaWRzXG5fSU4oJzEuMi44NDAuMTEzNTQ5LjMuNycsICdkZXMtRURFMy1DQkMnKTtcbl9JTignMi4xNi44NDAuMS4xMDEuMy40LjEuMicsICdhZXMxMjgtQ0JDJyk7XG5fSU4oJzIuMTYuODQwLjEuMTAxLjMuNC4xLjIyJywgJ2FlczE5Mi1DQkMnKTtcbl9JTignMi4xNi44NDAuMS4xMDEuMy40LjEuNDInLCAnYWVzMjU2LUNCQycpO1xuXG4vLyBjZXJ0aWZpY2F0ZSBpc3N1ZXIvc3ViamVjdCBPSURzXG5fSU4oJzIuNS40LjMnLCAnY29tbW9uTmFtZScpO1xuX0lOKCcyLjUuNC40JywgJ3N1cm5hbWUnKTtcbl9JTignMi41LjQuNScsICdzZXJpYWxOdW1iZXInKTtcbl9JTignMi41LjQuNicsICdjb3VudHJ5TmFtZScpO1xuX0lOKCcyLjUuNC43JywgJ2xvY2FsaXR5TmFtZScpO1xuX0lOKCcyLjUuNC44JywgJ3N0YXRlT3JQcm92aW5jZU5hbWUnKTtcbl9JTignMi41LjQuOScsICdzdHJlZXRBZGRyZXNzJyk7XG5fSU4oJzIuNS40LjEwJywgJ29yZ2FuaXphdGlvbk5hbWUnKTtcbl9JTignMi41LjQuMTEnLCAnb3JnYW5pemF0aW9uYWxVbml0TmFtZScpO1xuX0lOKCcyLjUuNC4xMicsICd0aXRsZScpO1xuX0lOKCcyLjUuNC4xMycsICdkZXNjcmlwdGlvbicpO1xuX0lOKCcyLjUuNC4xNScsICdidXNpbmVzc0NhdGVnb3J5Jyk7XG5fSU4oJzIuNS40LjE3JywgJ3Bvc3RhbENvZGUnKTtcbl9JTignMi41LjQuNDInLCAnZ2l2ZW5OYW1lJyk7XG5fSU4oJzEuMy42LjEuNC4xLjMxMS42MC4yLjEuMicsICdqdXJpc2RpY3Rpb25PZkluY29ycG9yYXRpb25TdGF0ZU9yUHJvdmluY2VOYW1lJyk7XG5fSU4oJzEuMy42LjEuNC4xLjMxMS42MC4yLjEuMycsICdqdXJpc2RpY3Rpb25PZkluY29ycG9yYXRpb25Db3VudHJ5TmFtZScpO1xuXG4vLyBYLjUwOSBleHRlbnNpb24gT0lEc1xuX0lOKCcyLjE2Ljg0MC4xLjExMzczMC4xLjEnLCAnbnNDZXJ0VHlwZScpO1xuX0lOKCcyLjE2Ljg0MC4xLjExMzczMC4xLjEzJywgJ25zQ29tbWVudCcpOyAvLyBkZXByZWNhdGVkIGluIHRoZW9yeTsgc3RpbGwgd2lkZWx5IHVzZWRcbl9JXygnMi41LjI5LjEnLCAnYXV0aG9yaXR5S2V5SWRlbnRpZmllcicpOyAvLyBkZXByZWNhdGVkLCB1c2UgLjM1XG5fSV8oJzIuNS4yOS4yJywgJ2tleUF0dHJpYnV0ZXMnKTsgLy8gb2Jzb2xldGUgdXNlIC4zNyBvciAuMTVcbl9JXygnMi41LjI5LjMnLCAnY2VydGlmaWNhdGVQb2xpY2llcycpOyAvLyBkZXByZWNhdGVkLCB1c2UgLjMyXG5fSV8oJzIuNS4yOS40JywgJ2tleVVzYWdlUmVzdHJpY3Rpb24nKTsgLy8gb2Jzb2xldGUgdXNlIC4zNyBvciAuMTVcbl9JXygnMi41LjI5LjUnLCAncG9saWN5TWFwcGluZycpOyAvLyBkZXByZWNhdGVkIHVzZSAuMzNcbl9JXygnMi41LjI5LjYnLCAnc3VidHJlZXNDb25zdHJhaW50Jyk7IC8vIG9ic29sZXRlIHVzZSAuMzBcbl9JXygnMi41LjI5LjcnLCAnc3ViamVjdEFsdE5hbWUnKTsgLy8gZGVwcmVjYXRlZCB1c2UgLjE3XG5fSV8oJzIuNS4yOS44JywgJ2lzc3VlckFsdE5hbWUnKTsgLy8gZGVwcmVjYXRlZCB1c2UgLjE4XG5fSV8oJzIuNS4yOS45JywgJ3N1YmplY3REaXJlY3RvcnlBdHRyaWJ1dGVzJyk7XG5fSV8oJzIuNS4yOS4xMCcsICdiYXNpY0NvbnN0cmFpbnRzJyk7IC8vIGRlcHJlY2F0ZWQgdXNlIC4xOVxuX0lfKCcyLjUuMjkuMTEnLCAnbmFtZUNvbnN0cmFpbnRzJyk7IC8vIGRlcHJlY2F0ZWQgdXNlIC4zMFxuX0lfKCcyLjUuMjkuMTInLCAncG9saWN5Q29uc3RyYWludHMnKTsgLy8gZGVwcmVjYXRlZCB1c2UgLjM2XG5fSV8oJzIuNS4yOS4xMycsICdiYXNpY0NvbnN0cmFpbnRzJyk7IC8vIGRlcHJlY2F0ZWQgdXNlIC4xOVxuX0lOKCcyLjUuMjkuMTQnLCAnc3ViamVjdEtleUlkZW50aWZpZXInKTtcbl9JTignMi41LjI5LjE1JywgJ2tleVVzYWdlJyk7XG5fSV8oJzIuNS4yOS4xNicsICdwcml2YXRlS2V5VXNhZ2VQZXJpb2QnKTtcbl9JTignMi41LjI5LjE3JywgJ3N1YmplY3RBbHROYW1lJyk7XG5fSU4oJzIuNS4yOS4xOCcsICdpc3N1ZXJBbHROYW1lJyk7XG5fSU4oJzIuNS4yOS4xOScsICdiYXNpY0NvbnN0cmFpbnRzJyk7XG5fSV8oJzIuNS4yOS4yMCcsICdjUkxOdW1iZXInKTtcbl9JXygnMi41LjI5LjIxJywgJ2NSTFJlYXNvbicpO1xuX0lfKCcyLjUuMjkuMjInLCAnZXhwaXJhdGlvbkRhdGUnKTtcbl9JXygnMi41LjI5LjIzJywgJ2luc3RydWN0aW9uQ29kZScpO1xuX0lfKCcyLjUuMjkuMjQnLCAnaW52YWxpZGl0eURhdGUnKTtcbl9JXygnMi41LjI5LjI1JywgJ2NSTERpc3RyaWJ1dGlvblBvaW50cycpOyAvLyBkZXByZWNhdGVkIHVzZSAuMzFcbl9JXygnMi41LjI5LjI2JywgJ2lzc3VpbmdEaXN0cmlidXRpb25Qb2ludCcpOyAvLyBkZXByZWNhdGVkIHVzZSAuMjhcbl9JXygnMi41LjI5LjI3JywgJ2RlbHRhQ1JMSW5kaWNhdG9yJyk7XG5fSV8oJzIuNS4yOS4yOCcsICdpc3N1aW5nRGlzdHJpYnV0aW9uUG9pbnQnKTtcbl9JXygnMi41LjI5LjI5JywgJ2NlcnRpZmljYXRlSXNzdWVyJyk7XG5fSV8oJzIuNS4yOS4zMCcsICduYW1lQ29uc3RyYWludHMnKTtcbl9JTignMi41LjI5LjMxJywgJ2NSTERpc3RyaWJ1dGlvblBvaW50cycpO1xuX0lOKCcyLjUuMjkuMzInLCAnY2VydGlmaWNhdGVQb2xpY2llcycpO1xuX0lfKCcyLjUuMjkuMzMnLCAncG9saWN5TWFwcGluZ3MnKTtcbl9JXygnMi41LjI5LjM0JywgJ3BvbGljeUNvbnN0cmFpbnRzJyk7IC8vIGRlcHJlY2F0ZWQgdXNlIC4zNlxuX0lOKCcyLjUuMjkuMzUnLCAnYXV0aG9yaXR5S2V5SWRlbnRpZmllcicpO1xuX0lfKCcyLjUuMjkuMzYnLCAncG9saWN5Q29uc3RyYWludHMnKTtcbl9JTignMi41LjI5LjM3JywgJ2V4dEtleVVzYWdlJyk7XG5fSV8oJzIuNS4yOS40NicsICdmcmVzaGVzdENSTCcpO1xuX0lfKCcyLjUuMjkuNTQnLCAnaW5oaWJpdEFueVBvbGljeScpO1xuXG4vLyBleHRLZXlVc2FnZSBwdXJwb3Nlc1xuX0lOKCcxLjMuNi4xLjQuMS4xMTEyOS4yLjQuMicsICd0aW1lc3RhbXBMaXN0Jyk7XG5fSU4oJzEuMy42LjEuNS41LjcuMS4xJywgJ2F1dGhvcml0eUluZm9BY2Nlc3MnKTtcbl9JTignMS4zLjYuMS41LjUuNy4zLjEnLCAnc2VydmVyQXV0aCcpO1xuX0lOKCcxLjMuNi4xLjUuNS43LjMuMicsICdjbGllbnRBdXRoJyk7XG5fSU4oJzEuMy42LjEuNS41LjcuMy4zJywgJ2NvZGVTaWduaW5nJyk7XG5fSU4oJzEuMy42LjEuNS41LjcuMy40JywgJ2VtYWlsUHJvdGVjdGlvbicpO1xuX0lOKCcxLjMuNi4xLjUuNS43LjMuOCcsICd0aW1lU3RhbXBpbmcnKTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///23\n")},function(module,exports,__webpack_require__){"use strict";eval("\n\nvar _UxpOptions = _interopRequireDefault(__webpack_require__(62));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/*************************************************************************\n* ADOBE CONFIDENTIAL\n* ___________________\n*\n* Copyright 2019 Adobe\n* All Rights Reserved.\n*\n* NOTICE: All information contained herein is, and remains\n* the property of Adobe and its suppliers, if any. The intellectual\n* and technical concepts contained herein are proprietary to Adobe\n* and its suppliers and are protected by all applicable intellectual\n* property laws, including trade secret and copyright laws.\n* Dissemination of this information or reproduction of this material\n* is strictly forbidden unless prior written permission is obtained\n* from Adobe.\n**************************************************************************/\nmodule.exports = _UxpOptions.default.select('Wait', () => __webpack_require__(143), () => __webpack_require__(63));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjQuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRvcnEtbmF0aXZlL3JlYWN0LXNwZWN0cnVtL1dhaXQvaW5kZXguanM/N2M0ZSJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9VeHBPcHRpb25zID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vdXRpbHMvVXhwT3B0aW9uc1wiKSk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4qIEFET0JFIENPTkZJREVOVElBTFxuKiBfX19fX19fX19fX19fX19fX19fXG4qXG4qIENvcHlyaWdodCAyMDE5IEFkb2JlXG4qIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4qXG4qIE5PVElDRTogQWxsIGluZm9ybWF0aW9uIGNvbnRhaW5lZCBoZXJlaW4gaXMsIGFuZCByZW1haW5zXG4qIHRoZSBwcm9wZXJ0eSBvZiBBZG9iZSBhbmQgaXRzIHN1cHBsaWVycywgaWYgYW55LiBUaGUgaW50ZWxsZWN0dWFsXG4qIGFuZCB0ZWNobmljYWwgY29uY2VwdHMgY29udGFpbmVkIGhlcmVpbiBhcmUgcHJvcHJpZXRhcnkgdG8gQWRvYmVcbiogYW5kIGl0cyBzdXBwbGllcnMgYW5kIGFyZSBwcm90ZWN0ZWQgYnkgYWxsIGFwcGxpY2FibGUgaW50ZWxsZWN0dWFsXG4qIHByb3BlcnR5IGxhd3MsIGluY2x1ZGluZyB0cmFkZSBzZWNyZXQgYW5kIGNvcHlyaWdodCBsYXdzLlxuKiBEaXNzZW1pbmF0aW9uIG9mIHRoaXMgaW5mb3JtYXRpb24gb3IgcmVwcm9kdWN0aW9uIG9mIHRoaXMgbWF0ZXJpYWxcbiogaXMgc3RyaWN0bHkgZm9yYmlkZGVuIHVubGVzcyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gaXMgb2J0YWluZWRcbiogZnJvbSBBZG9iZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xubW9kdWxlLmV4cG9ydHMgPSBfVXhwT3B0aW9ucy5kZWZhdWx0LnNlbGVjdCgnV2FpdCcsICgpID0+IHJlcXVpcmUoJy4vanMvVXhwV2FpdCcpLCAoKSA9PiByZXF1aXJlKCcuL2pzL1dhaXQnKSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///24\n")},function(module,exports,__webpack_require__){eval("var api = __webpack_require__(5);\n            var content = __webpack_require__(141);\n\n            content = content.__esModule ? content.default : content;\n\n            if (typeof content === 'string') {\n              content = [[module.i, content, '']];\n            }\n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = api(content, options);\n\n\n\nmodule.exports = content.locals || {};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjUuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvY29tcG9uZW50cy9jc3Mvc3R5bGUuY3NzPzM5ZDUiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGFwaSA9IHJlcXVpcmUoXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzXCIpO1xuICAgICAgICAgICAgdmFyIGNvbnRlbnQgPSByZXF1aXJlKFwiISEuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL3N0eWxlLmNzc1wiKTtcblxuICAgICAgICAgICAgY29udGVudCA9IGNvbnRlbnQuX19lc01vZHVsZSA/IGNvbnRlbnQuZGVmYXVsdCA6IGNvbnRlbnQ7XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgY29udGVudCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgY29udGVudCA9IFtbbW9kdWxlLmlkLCBjb250ZW50LCAnJ11dO1xuICAgICAgICAgICAgfVxuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLmluc2VydCA9IFwiaGVhZFwiO1xub3B0aW9ucy5zaW5nbGV0b24gPSBmYWxzZTtcblxudmFyIHVwZGF0ZSA9IGFwaShjb250ZW50LCBvcHRpb25zKTtcblxuXG5cbm1vZHVsZS5leHBvcnRzID0gY29udGVudC5sb2NhbHMgfHwge307Il0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///25\n")},function(module,exports,__webpack_require__){eval("const SemVer = __webpack_require__(10)\nconst parse = (version, options, throwErrors = false) => {\n  if (version instanceof SemVer) {\n    return version\n  }\n  try {\n    return new SemVer(version, options)\n  } catch (er) {\n    if (!throwErrors) {\n      return null\n    }\n    throw er\n  }\n}\n\nmodule.exports = parse\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjYuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRvcnEtbmF0aXZlL3JlYWN0LXNwZWN0cnVtL25vZGVfbW9kdWxlcy9zZW12ZXIvZnVuY3Rpb25zL3BhcnNlLmpzP2JkYTYiXSwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgU2VtVmVyID0gcmVxdWlyZSgnLi4vY2xhc3Nlcy9zZW12ZXInKVxuY29uc3QgcGFyc2UgPSAodmVyc2lvbiwgb3B0aW9ucywgdGhyb3dFcnJvcnMgPSBmYWxzZSkgPT4ge1xuICBpZiAodmVyc2lvbiBpbnN0YW5jZW9mIFNlbVZlcikge1xuICAgIHJldHVybiB2ZXJzaW9uXG4gIH1cbiAgdHJ5IHtcbiAgICByZXR1cm4gbmV3IFNlbVZlcih2ZXJzaW9uLCBvcHRpb25zKVxuICB9IGNhdGNoIChlcikge1xuICAgIGlmICghdGhyb3dFcnJvcnMpIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuICAgIHRocm93IGVyXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBwYXJzZVxuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///26\n")},function(module,exports,__webpack_require__){eval("/**\n * Javascript implementation of basic PEM (Privacy Enhanced Mail) algorithms.\n *\n * See: RFC 1421.\n *\n * @author Dave Longley\n *\n * Copyright (c) 2013-2014 Digital Bazaar, Inc.\n *\n * A Forge PEM object has the following fields:\n *\n * type: identifies the type of message (eg: \"RSA PRIVATE KEY\").\n *\n * procType: identifies the type of processing performed on the message,\n *   it has two subfields: version and type, eg: 4,ENCRYPTED.\n *\n * contentDomain: identifies the type of content in the message, typically\n *   only uses the value: \"RFC822\".\n *\n * dekInfo: identifies the message encryption algorithm and mode and includes\n *   any parameters for the algorithm, it has two subfields: algorithm and\n *   parameters, eg: DES-CBC,F8143EDE5960C597.\n *\n * headers: contains all other PEM encapsulated headers -- where order is\n *   significant (for pairing data like recipient ID + key info).\n *\n * body: the binary-encoded body.\n */\nvar forge = __webpack_require__(4);\n__webpack_require__(7);\n\n// shortcut for pem API\nvar pem = module.exports = forge.pem = forge.pem || {};\n\n/**\n * Encodes (serializes) the given PEM object.\n *\n * @param msg the PEM message object to encode.\n * @param options the options to use:\n *          maxline the maximum characters per line for the body, (default: 64).\n *\n * @return the PEM-formatted string.\n */\npem.encode = function(msg, options) {\n  options = options || {};\n  var rval = '-----BEGIN ' + msg.type + '-----\\r\\n';\n\n  // encode special headers\n  var header;\n  if(msg.procType) {\n    header = {\n      name: 'Proc-Type',\n      values: [String(msg.procType.version), msg.procType.type]\n    };\n    rval += foldHeader(header);\n  }\n  if(msg.contentDomain) {\n    header = {name: 'Content-Domain', values: [msg.contentDomain]};\n    rval += foldHeader(header);\n  }\n  if(msg.dekInfo) {\n    header = {name: 'DEK-Info', values: [msg.dekInfo.algorithm]};\n    if(msg.dekInfo.parameters) {\n      header.values.push(msg.dekInfo.parameters);\n    }\n    rval += foldHeader(header);\n  }\n\n  if(msg.headers) {\n    // encode all other headers\n    for(var i = 0; i < msg.headers.length; ++i) {\n      rval += foldHeader(msg.headers[i]);\n    }\n  }\n\n  // terminate header\n  if(msg.procType) {\n    rval += '\\r\\n';\n  }\n\n  // add body\n  rval += forge.util.encode64(msg.body, options.maxline || 64) + '\\r\\n';\n\n  rval += '-----END ' + msg.type + '-----\\r\\n';\n  return rval;\n};\n\n/**\n * Decodes (deserializes) all PEM messages found in the given string.\n *\n * @param str the PEM-formatted string to decode.\n *\n * @return the PEM message objects in an array.\n */\npem.decode = function(str) {\n  var rval = [];\n\n  // split string into PEM messages (be lenient w/EOF on BEGIN line)\n  var rMessage = /\\s*-----BEGIN ([A-Z0-9- ]+)-----\\r?\\n?([\\x21-\\x7e\\s]+?(?:\\r?\\n\\r?\\n))?([:A-Za-z0-9+\\/=\\s]+?)-----END \\1-----/g;\n  var rHeader = /([\\x21-\\x7e]+):\\s*([\\x21-\\x7e\\s^:]+)/;\n  var rCRLF = /\\r?\\n/;\n  var match;\n  while(true) {\n    match = rMessage.exec(str);\n    if(!match) {\n      break;\n    }\n\n    // accept \"NEW CERTIFICATE REQUEST\" as \"CERTIFICATE REQUEST\"\n    // https://datatracker.ietf.org/doc/html/rfc7468#section-7\n    var type = match[1];\n    if(type === 'NEW CERTIFICATE REQUEST') {\n      type = 'CERTIFICATE REQUEST';\n    }\n\n    var msg = {\n      type: type,\n      procType: null,\n      contentDomain: null,\n      dekInfo: null,\n      headers: [],\n      body: forge.util.decode64(match[3])\n    };\n    rval.push(msg);\n\n    // no headers\n    if(!match[2]) {\n      continue;\n    }\n\n    // parse headers\n    var lines = match[2].split(rCRLF);\n    var li = 0;\n    while(match && li < lines.length) {\n      // get line, trim any rhs whitespace\n      var line = lines[li].replace(/\\s+$/, '');\n\n      // RFC2822 unfold any following folded lines\n      for(var nl = li + 1; nl < lines.length; ++nl) {\n        var next = lines[nl];\n        if(!/\\s/.test(next[0])) {\n          break;\n        }\n        line += next;\n        li = nl;\n      }\n\n      // parse header\n      match = line.match(rHeader);\n      if(match) {\n        var header = {name: match[1], values: []};\n        var values = match[2].split(',');\n        for(var vi = 0; vi < values.length; ++vi) {\n          header.values.push(ltrim(values[vi]));\n        }\n\n        // Proc-Type must be the first header\n        if(!msg.procType) {\n          if(header.name !== 'Proc-Type') {\n            throw new Error('Invalid PEM formatted message. The first ' +\n              'encapsulated header must be \"Proc-Type\".');\n          } else if(header.values.length !== 2) {\n            throw new Error('Invalid PEM formatted message. The \"Proc-Type\" ' +\n              'header must have two subfields.');\n          }\n          msg.procType = {version: values[0], type: values[1]};\n        } else if(!msg.contentDomain && header.name === 'Content-Domain') {\n          // special-case Content-Domain\n          msg.contentDomain = values[0] || '';\n        } else if(!msg.dekInfo && header.name === 'DEK-Info') {\n          // special-case DEK-Info\n          if(header.values.length === 0) {\n            throw new Error('Invalid PEM formatted message. The \"DEK-Info\" ' +\n              'header must have at least one subfield.');\n          }\n          msg.dekInfo = {algorithm: values[0], parameters: values[1] || null};\n        } else {\n          msg.headers.push(header);\n        }\n      }\n\n      ++li;\n    }\n\n    if(msg.procType === 'ENCRYPTED' && !msg.dekInfo) {\n      throw new Error('Invalid PEM formatted message. The \"DEK-Info\" ' +\n        'header must be present if \"Proc-Type\" is \"ENCRYPTED\".');\n    }\n  }\n\n  if(rval.length === 0) {\n    throw new Error('Invalid PEM formatted message.');\n  }\n\n  return rval;\n};\n\nfunction foldHeader(header) {\n  var rval = header.name + ': ';\n\n  // ensure values with CRLF are folded\n  var values = [];\n  var insertSpace = function(match, $1) {\n    return ' ' + $1;\n  };\n  for(var i = 0; i < header.values.length; ++i) {\n    values.push(header.values[i].replace(/^(\\S+\\r\\n)/, insertSpace));\n  }\n  rval += values.join(',') + '\\r\\n';\n\n  // do folding\n  var length = 0;\n  var candidate = -1;\n  for(var i = 0; i < rval.length; ++i, ++length) {\n    if(length > 65 && candidate !== -1) {\n      var insert = rval[candidate];\n      if(insert === ',') {\n        ++candidate;\n        rval = rval.substr(0, candidate) + '\\r\\n ' + rval.substr(candidate);\n      } else {\n        rval = rval.substr(0, candidate) +\n          '\\r\\n' + insert + rval.substr(candidate + 1);\n      }\n      length = (i - candidate - 1);\n      candidate = -1;\n      ++i;\n    } else if(rval[i] === ' ' || rval[i] === '\\t' || rval[i] === ',') {\n      candidate = i;\n    }\n  }\n\n  return rval;\n}\n\nfunction ltrim(str) {\n  return str.replace(/^\\s+/, '');\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjcuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbm9kZS1mb3JnZS9saWIvcGVtLmpzP2IxYWIiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBKYXZhc2NyaXB0IGltcGxlbWVudGF0aW9uIG9mIGJhc2ljIFBFTSAoUHJpdmFjeSBFbmhhbmNlZCBNYWlsKSBhbGdvcml0aG1zLlxuICpcbiAqIFNlZTogUkZDIDE0MjEuXG4gKlxuICogQGF1dGhvciBEYXZlIExvbmdsZXlcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNCBEaWdpdGFsIEJhemFhciwgSW5jLlxuICpcbiAqIEEgRm9yZ2UgUEVNIG9iamVjdCBoYXMgdGhlIGZvbGxvd2luZyBmaWVsZHM6XG4gKlxuICogdHlwZTogaWRlbnRpZmllcyB0aGUgdHlwZSBvZiBtZXNzYWdlIChlZzogXCJSU0EgUFJJVkFURSBLRVlcIikuXG4gKlxuICogcHJvY1R5cGU6IGlkZW50aWZpZXMgdGhlIHR5cGUgb2YgcHJvY2Vzc2luZyBwZXJmb3JtZWQgb24gdGhlIG1lc3NhZ2UsXG4gKiAgIGl0IGhhcyB0d28gc3ViZmllbGRzOiB2ZXJzaW9uIGFuZCB0eXBlLCBlZzogNCxFTkNSWVBURUQuXG4gKlxuICogY29udGVudERvbWFpbjogaWRlbnRpZmllcyB0aGUgdHlwZSBvZiBjb250ZW50IGluIHRoZSBtZXNzYWdlLCB0eXBpY2FsbHlcbiAqICAgb25seSB1c2VzIHRoZSB2YWx1ZTogXCJSRkM4MjJcIi5cbiAqXG4gKiBkZWtJbmZvOiBpZGVudGlmaWVzIHRoZSBtZXNzYWdlIGVuY3J5cHRpb24gYWxnb3JpdGhtIGFuZCBtb2RlIGFuZCBpbmNsdWRlc1xuICogICBhbnkgcGFyYW1ldGVycyBmb3IgdGhlIGFsZ29yaXRobSwgaXQgaGFzIHR3byBzdWJmaWVsZHM6IGFsZ29yaXRobSBhbmRcbiAqICAgcGFyYW1ldGVycywgZWc6IERFUy1DQkMsRjgxNDNFREU1OTYwQzU5Ny5cbiAqXG4gKiBoZWFkZXJzOiBjb250YWlucyBhbGwgb3RoZXIgUEVNIGVuY2Fwc3VsYXRlZCBoZWFkZXJzIC0tIHdoZXJlIG9yZGVyIGlzXG4gKiAgIHNpZ25pZmljYW50IChmb3IgcGFpcmluZyBkYXRhIGxpa2UgcmVjaXBpZW50IElEICsga2V5IGluZm8pLlxuICpcbiAqIGJvZHk6IHRoZSBiaW5hcnktZW5jb2RlZCBib2R5LlxuICovXG52YXIgZm9yZ2UgPSByZXF1aXJlKCcuL2ZvcmdlJyk7XG5yZXF1aXJlKCcuL3V0aWwnKTtcblxuLy8gc2hvcnRjdXQgZm9yIHBlbSBBUElcbnZhciBwZW0gPSBtb2R1bGUuZXhwb3J0cyA9IGZvcmdlLnBlbSA9IGZvcmdlLnBlbSB8fCB7fTtcblxuLyoqXG4gKiBFbmNvZGVzIChzZXJpYWxpemVzKSB0aGUgZ2l2ZW4gUEVNIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0gbXNnIHRoZSBQRU0gbWVzc2FnZSBvYmplY3QgdG8gZW5jb2RlLlxuICogQHBhcmFtIG9wdGlvbnMgdGhlIG9wdGlvbnMgdG8gdXNlOlxuICogICAgICAgICAgbWF4bGluZSB0aGUgbWF4aW11bSBjaGFyYWN0ZXJzIHBlciBsaW5lIGZvciB0aGUgYm9keSwgKGRlZmF1bHQ6IDY0KS5cbiAqXG4gKiBAcmV0dXJuIHRoZSBQRU0tZm9ybWF0dGVkIHN0cmluZy5cbiAqL1xucGVtLmVuY29kZSA9IGZ1bmN0aW9uKG1zZywgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgdmFyIHJ2YWwgPSAnLS0tLS1CRUdJTiAnICsgbXNnLnR5cGUgKyAnLS0tLS1cXHJcXG4nO1xuXG4gIC8vIGVuY29kZSBzcGVjaWFsIGhlYWRlcnNcbiAgdmFyIGhlYWRlcjtcbiAgaWYobXNnLnByb2NUeXBlKSB7XG4gICAgaGVhZGVyID0ge1xuICAgICAgbmFtZTogJ1Byb2MtVHlwZScsXG4gICAgICB2YWx1ZXM6IFtTdHJpbmcobXNnLnByb2NUeXBlLnZlcnNpb24pLCBtc2cucHJvY1R5cGUudHlwZV1cbiAgICB9O1xuICAgIHJ2YWwgKz0gZm9sZEhlYWRlcihoZWFkZXIpO1xuICB9XG4gIGlmKG1zZy5jb250ZW50RG9tYWluKSB7XG4gICAgaGVhZGVyID0ge25hbWU6ICdDb250ZW50LURvbWFpbicsIHZhbHVlczogW21zZy5jb250ZW50RG9tYWluXX07XG4gICAgcnZhbCArPSBmb2xkSGVhZGVyKGhlYWRlcik7XG4gIH1cbiAgaWYobXNnLmRla0luZm8pIHtcbiAgICBoZWFkZXIgPSB7bmFtZTogJ0RFSy1JbmZvJywgdmFsdWVzOiBbbXNnLmRla0luZm8uYWxnb3JpdGhtXX07XG4gICAgaWYobXNnLmRla0luZm8ucGFyYW1ldGVycykge1xuICAgICAgaGVhZGVyLnZhbHVlcy5wdXNoKG1zZy5kZWtJbmZvLnBhcmFtZXRlcnMpO1xuICAgIH1cbiAgICBydmFsICs9IGZvbGRIZWFkZXIoaGVhZGVyKTtcbiAgfVxuXG4gIGlmKG1zZy5oZWFkZXJzKSB7XG4gICAgLy8gZW5jb2RlIGFsbCBvdGhlciBoZWFkZXJzXG4gICAgZm9yKHZhciBpID0gMDsgaSA8IG1zZy5oZWFkZXJzLmxlbmd0aDsgKytpKSB7XG4gICAgICBydmFsICs9IGZvbGRIZWFkZXIobXNnLmhlYWRlcnNbaV0pO1xuICAgIH1cbiAgfVxuXG4gIC8vIHRlcm1pbmF0ZSBoZWFkZXJcbiAgaWYobXNnLnByb2NUeXBlKSB7XG4gICAgcnZhbCArPSAnXFxyXFxuJztcbiAgfVxuXG4gIC8vIGFkZCBib2R5XG4gIHJ2YWwgKz0gZm9yZ2UudXRpbC5lbmNvZGU2NChtc2cuYm9keSwgb3B0aW9ucy5tYXhsaW5lIHx8IDY0KSArICdcXHJcXG4nO1xuXG4gIHJ2YWwgKz0gJy0tLS0tRU5EICcgKyBtc2cudHlwZSArICctLS0tLVxcclxcbic7XG4gIHJldHVybiBydmFsO1xufTtcblxuLyoqXG4gKiBEZWNvZGVzIChkZXNlcmlhbGl6ZXMpIGFsbCBQRU0gbWVzc2FnZXMgZm91bmQgaW4gdGhlIGdpdmVuIHN0cmluZy5cbiAqXG4gKiBAcGFyYW0gc3RyIHRoZSBQRU0tZm9ybWF0dGVkIHN0cmluZyB0byBkZWNvZGUuXG4gKlxuICogQHJldHVybiB0aGUgUEVNIG1lc3NhZ2Ugb2JqZWN0cyBpbiBhbiBhcnJheS5cbiAqL1xucGVtLmRlY29kZSA9IGZ1bmN0aW9uKHN0cikge1xuICB2YXIgcnZhbCA9IFtdO1xuXG4gIC8vIHNwbGl0IHN0cmluZyBpbnRvIFBFTSBtZXNzYWdlcyAoYmUgbGVuaWVudCB3L0VPRiBvbiBCRUdJTiBsaW5lKVxuICB2YXIgck1lc3NhZ2UgPSAvXFxzKi0tLS0tQkVHSU4gKFtBLVowLTktIF0rKS0tLS0tXFxyP1xcbj8oW1xceDIxLVxceDdlXFxzXSs/KD86XFxyP1xcblxccj9cXG4pKT8oWzpBLVphLXowLTkrXFwvPVxcc10rPyktLS0tLUVORCBcXDEtLS0tLS9nO1xuICB2YXIgckhlYWRlciA9IC8oW1xceDIxLVxceDdlXSspOlxccyooW1xceDIxLVxceDdlXFxzXjpdKykvO1xuICB2YXIgckNSTEYgPSAvXFxyP1xcbi87XG4gIHZhciBtYXRjaDtcbiAgd2hpbGUodHJ1ZSkge1xuICAgIG1hdGNoID0gck1lc3NhZ2UuZXhlYyhzdHIpO1xuICAgIGlmKCFtYXRjaCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgLy8gYWNjZXB0IFwiTkVXIENFUlRJRklDQVRFIFJFUVVFU1RcIiBhcyBcIkNFUlRJRklDQVRFIFJFUVVFU1RcIlxuICAgIC8vIGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvcmZjNzQ2OCNzZWN0aW9uLTdcbiAgICB2YXIgdHlwZSA9IG1hdGNoWzFdO1xuICAgIGlmKHR5cGUgPT09ICdORVcgQ0VSVElGSUNBVEUgUkVRVUVTVCcpIHtcbiAgICAgIHR5cGUgPSAnQ0VSVElGSUNBVEUgUkVRVUVTVCc7XG4gICAgfVxuXG4gICAgdmFyIG1zZyA9IHtcbiAgICAgIHR5cGU6IHR5cGUsXG4gICAgICBwcm9jVHlwZTogbnVsbCxcbiAgICAgIGNvbnRlbnREb21haW46IG51bGwsXG4gICAgICBkZWtJbmZvOiBudWxsLFxuICAgICAgaGVhZGVyczogW10sXG4gICAgICBib2R5OiBmb3JnZS51dGlsLmRlY29kZTY0KG1hdGNoWzNdKVxuICAgIH07XG4gICAgcnZhbC5wdXNoKG1zZyk7XG5cbiAgICAvLyBubyBoZWFkZXJzXG4gICAgaWYoIW1hdGNoWzJdKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBwYXJzZSBoZWFkZXJzXG4gICAgdmFyIGxpbmVzID0gbWF0Y2hbMl0uc3BsaXQockNSTEYpO1xuICAgIHZhciBsaSA9IDA7XG4gICAgd2hpbGUobWF0Y2ggJiYgbGkgPCBsaW5lcy5sZW5ndGgpIHtcbiAgICAgIC8vIGdldCBsaW5lLCB0cmltIGFueSByaHMgd2hpdGVzcGFjZVxuICAgICAgdmFyIGxpbmUgPSBsaW5lc1tsaV0ucmVwbGFjZSgvXFxzKyQvLCAnJyk7XG5cbiAgICAgIC8vIFJGQzI4MjIgdW5mb2xkIGFueSBmb2xsb3dpbmcgZm9sZGVkIGxpbmVzXG4gICAgICBmb3IodmFyIG5sID0gbGkgKyAxOyBubCA8IGxpbmVzLmxlbmd0aDsgKytubCkge1xuICAgICAgICB2YXIgbmV4dCA9IGxpbmVzW25sXTtcbiAgICAgICAgaWYoIS9cXHMvLnRlc3QobmV4dFswXSkpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBsaW5lICs9IG5leHQ7XG4gICAgICAgIGxpID0gbmw7XG4gICAgICB9XG5cbiAgICAgIC8vIHBhcnNlIGhlYWRlclxuICAgICAgbWF0Y2ggPSBsaW5lLm1hdGNoKHJIZWFkZXIpO1xuICAgICAgaWYobWF0Y2gpIHtcbiAgICAgICAgdmFyIGhlYWRlciA9IHtuYW1lOiBtYXRjaFsxXSwgdmFsdWVzOiBbXX07XG4gICAgICAgIHZhciB2YWx1ZXMgPSBtYXRjaFsyXS5zcGxpdCgnLCcpO1xuICAgICAgICBmb3IodmFyIHZpID0gMDsgdmkgPCB2YWx1ZXMubGVuZ3RoOyArK3ZpKSB7XG4gICAgICAgICAgaGVhZGVyLnZhbHVlcy5wdXNoKGx0cmltKHZhbHVlc1t2aV0pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFByb2MtVHlwZSBtdXN0IGJlIHRoZSBmaXJzdCBoZWFkZXJcbiAgICAgICAgaWYoIW1zZy5wcm9jVHlwZSkge1xuICAgICAgICAgIGlmKGhlYWRlci5uYW1lICE9PSAnUHJvYy1UeXBlJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIFBFTSBmb3JtYXR0ZWQgbWVzc2FnZS4gVGhlIGZpcnN0ICcgK1xuICAgICAgICAgICAgICAnZW5jYXBzdWxhdGVkIGhlYWRlciBtdXN0IGJlIFwiUHJvYy1UeXBlXCIuJyk7XG4gICAgICAgICAgfSBlbHNlIGlmKGhlYWRlci52YWx1ZXMubGVuZ3RoICE9PSAyKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgUEVNIGZvcm1hdHRlZCBtZXNzYWdlLiBUaGUgXCJQcm9jLVR5cGVcIiAnICtcbiAgICAgICAgICAgICAgJ2hlYWRlciBtdXN0IGhhdmUgdHdvIHN1YmZpZWxkcy4nKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbXNnLnByb2NUeXBlID0ge3ZlcnNpb246IHZhbHVlc1swXSwgdHlwZTogdmFsdWVzWzFdfTtcbiAgICAgICAgfSBlbHNlIGlmKCFtc2cuY29udGVudERvbWFpbiAmJiBoZWFkZXIubmFtZSA9PT0gJ0NvbnRlbnQtRG9tYWluJykge1xuICAgICAgICAgIC8vIHNwZWNpYWwtY2FzZSBDb250ZW50LURvbWFpblxuICAgICAgICAgIG1zZy5jb250ZW50RG9tYWluID0gdmFsdWVzWzBdIHx8ICcnO1xuICAgICAgICB9IGVsc2UgaWYoIW1zZy5kZWtJbmZvICYmIGhlYWRlci5uYW1lID09PSAnREVLLUluZm8nKSB7XG4gICAgICAgICAgLy8gc3BlY2lhbC1jYXNlIERFSy1JbmZvXG4gICAgICAgICAgaWYoaGVhZGVyLnZhbHVlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBQRU0gZm9ybWF0dGVkIG1lc3NhZ2UuIFRoZSBcIkRFSy1JbmZvXCIgJyArXG4gICAgICAgICAgICAgICdoZWFkZXIgbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBzdWJmaWVsZC4nKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbXNnLmRla0luZm8gPSB7YWxnb3JpdGhtOiB2YWx1ZXNbMF0sIHBhcmFtZXRlcnM6IHZhbHVlc1sxXSB8fCBudWxsfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBtc2cuaGVhZGVycy5wdXNoKGhlYWRlcik7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgKytsaTtcbiAgICB9XG5cbiAgICBpZihtc2cucHJvY1R5cGUgPT09ICdFTkNSWVBURUQnICYmICFtc2cuZGVrSW5mbykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIFBFTSBmb3JtYXR0ZWQgbWVzc2FnZS4gVGhlIFwiREVLLUluZm9cIiAnICtcbiAgICAgICAgJ2hlYWRlciBtdXN0IGJlIHByZXNlbnQgaWYgXCJQcm9jLVR5cGVcIiBpcyBcIkVOQ1JZUFRFRFwiLicpO1xuICAgIH1cbiAgfVxuXG4gIGlmKHJ2YWwubGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIFBFTSBmb3JtYXR0ZWQgbWVzc2FnZS4nKTtcbiAgfVxuXG4gIHJldHVybiBydmFsO1xufTtcblxuZnVuY3Rpb24gZm9sZEhlYWRlcihoZWFkZXIpIHtcbiAgdmFyIHJ2YWwgPSBoZWFkZXIubmFtZSArICc6ICc7XG5cbiAgLy8gZW5zdXJlIHZhbHVlcyB3aXRoIENSTEYgYXJlIGZvbGRlZFxuICB2YXIgdmFsdWVzID0gW107XG4gIHZhciBpbnNlcnRTcGFjZSA9IGZ1bmN0aW9uKG1hdGNoLCAkMSkge1xuICAgIHJldHVybiAnICcgKyAkMTtcbiAgfTtcbiAgZm9yKHZhciBpID0gMDsgaSA8IGhlYWRlci52YWx1ZXMubGVuZ3RoOyArK2kpIHtcbiAgICB2YWx1ZXMucHVzaChoZWFkZXIudmFsdWVzW2ldLnJlcGxhY2UoL14oXFxTK1xcclxcbikvLCBpbnNlcnRTcGFjZSkpO1xuICB9XG4gIHJ2YWwgKz0gdmFsdWVzLmpvaW4oJywnKSArICdcXHJcXG4nO1xuXG4gIC8vIGRvIGZvbGRpbmdcbiAgdmFyIGxlbmd0aCA9IDA7XG4gIHZhciBjYW5kaWRhdGUgPSAtMTtcbiAgZm9yKHZhciBpID0gMDsgaSA8IHJ2YWwubGVuZ3RoOyArK2ksICsrbGVuZ3RoKSB7XG4gICAgaWYobGVuZ3RoID4gNjUgJiYgY2FuZGlkYXRlICE9PSAtMSkge1xuICAgICAgdmFyIGluc2VydCA9IHJ2YWxbY2FuZGlkYXRlXTtcbiAgICAgIGlmKGluc2VydCA9PT0gJywnKSB7XG4gICAgICAgICsrY2FuZGlkYXRlO1xuICAgICAgICBydmFsID0gcnZhbC5zdWJzdHIoMCwgY2FuZGlkYXRlKSArICdcXHJcXG4gJyArIHJ2YWwuc3Vic3RyKGNhbmRpZGF0ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBydmFsID0gcnZhbC5zdWJzdHIoMCwgY2FuZGlkYXRlKSArXG4gICAgICAgICAgJ1xcclxcbicgKyBpbnNlcnQgKyBydmFsLnN1YnN0cihjYW5kaWRhdGUgKyAxKTtcbiAgICAgIH1cbiAgICAgIGxlbmd0aCA9IChpIC0gY2FuZGlkYXRlIC0gMSk7XG4gICAgICBjYW5kaWRhdGUgPSAtMTtcbiAgICAgICsraTtcbiAgICB9IGVsc2UgaWYocnZhbFtpXSA9PT0gJyAnIHx8IHJ2YWxbaV0gPT09ICdcXHQnIHx8IHJ2YWxbaV0gPT09ICcsJykge1xuICAgICAgY2FuZGlkYXRlID0gaTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcnZhbDtcbn1cblxuZnVuY3Rpb24gbHRyaW0oc3RyKSB7XG4gIHJldHVybiBzdHIucmVwbGFjZSgvXlxccysvLCAnJyk7XG59XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///27\n")},function(module,exports,__webpack_require__){eval("/**\n * Node.js module for Forge.\n *\n * @author Dave Longley\n *\n * Copyright 2011-2016 Digital Bazaar, Inc.\n */\nmodule.exports = __webpack_require__(4);\n__webpack_require__(22);\n__webpack_require__(238);\n__webpack_require__(14);\n__webpack_require__(54);\n__webpack_require__(41);\n__webpack_require__(240);\n__webpack_require__(31);\n__webpack_require__(242);\n__webpack_require__(243);\n__webpack_require__(244);\n__webpack_require__(89);\n__webpack_require__(56);\n__webpack_require__(27);\n__webpack_require__(85);\n__webpack_require__(87);\n__webpack_require__(245);\n__webpack_require__(80);\n__webpack_require__(86);\n__webpack_require__(83);\n__webpack_require__(59);\n__webpack_require__(13);\n__webpack_require__(84);\n__webpack_require__(246);\n__webpack_require__(79);\n__webpack_require__(7);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjguanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbm9kZS1mb3JnZS9saWIvaW5kZXguanM/NWMxYSJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIE5vZGUuanMgbW9kdWxlIGZvciBGb3JnZS5cbiAqXG4gKiBAYXV0aG9yIERhdmUgTG9uZ2xleVxuICpcbiAqIENvcHlyaWdodCAyMDExLTIwMTYgRGlnaXRhbCBCYXphYXIsIEluYy5cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2ZvcmdlJyk7XG5yZXF1aXJlKCcuL2FlcycpO1xucmVxdWlyZSgnLi9hZXNDaXBoZXJTdWl0ZXMnKTtcbnJlcXVpcmUoJy4vYXNuMScpO1xucmVxdWlyZSgnLi9jaXBoZXInKTtcbnJlcXVpcmUoJy4vZGVzJyk7XG5yZXF1aXJlKCcuL2VkMjU1MTknKTtcbnJlcXVpcmUoJy4vaG1hYycpO1xucmVxdWlyZSgnLi9rZW0nKTtcbnJlcXVpcmUoJy4vbG9nJyk7XG5yZXF1aXJlKCcuL21kLmFsbCcpO1xucmVxdWlyZSgnLi9tZ2YxJyk7XG5yZXF1aXJlKCcuL3Bia2RmMicpO1xucmVxdWlyZSgnLi9wZW0nKTtcbnJlcXVpcmUoJy4vcGtjczEnKTtcbnJlcXVpcmUoJy4vcGtjczEyJyk7XG5yZXF1aXJlKCcuL3BrY3M3Jyk7XG5yZXF1aXJlKCcuL3BraScpO1xucmVxdWlyZSgnLi9wcmltZScpO1xucmVxdWlyZSgnLi9wcm5nJyk7XG5yZXF1aXJlKCcuL3BzcycpO1xucmVxdWlyZSgnLi9yYW5kb20nKTtcbnJlcXVpcmUoJy4vcmMyJyk7XG5yZXF1aXJlKCcuL3NzaCcpO1xucmVxdWlyZSgnLi90bHMnKTtcbnJlcXVpcmUoJy4vdXRpbCcpO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///28\n")},function(module,exports,__webpack_require__){eval("const {\n  MAX_SAFE_COMPONENT_LENGTH,\n  MAX_SAFE_BUILD_LENGTH,\n  MAX_LENGTH,\n} = __webpack_require__(35)\nconst debug = __webpack_require__(36)\nexports = module.exports = {}\n\n// The actual regexps go on exports.re\nconst re = exports.re = []\nconst safeRe = exports.safeRe = []\nconst src = exports.src = []\nconst safeSrc = exports.safeSrc = []\nconst t = exports.t = {}\nlet R = 0\n\nconst LETTERDASHNUMBER = '[a-zA-Z0-9-]'\n\n// Replace some greedy regex tokens to prevent regex dos issues. These regex are\n// used internally via the safeRe object since all inputs in this library get\n// normalized first to trim and collapse all extra whitespace. The original\n// regexes are exported for userland consumption and lower level usage. A\n// future breaking change could export the safer regex only with a note that\n// all input should have extra whitespace removed.\nconst safeRegexReplacements = [\n  ['\\\\s', 1],\n  ['\\\\d', MAX_LENGTH],\n  [LETTERDASHNUMBER, MAX_SAFE_BUILD_LENGTH],\n]\n\nconst makeSafeRegex = (value) => {\n  for (const [token, max] of safeRegexReplacements) {\n    value = value\n      .split(`${token}*`).join(`${token}{0,${max}}`)\n      .split(`${token}+`).join(`${token}{1,${max}}`)\n  }\n  return value\n}\n\nconst createToken = (name, value, isGlobal) => {\n  const safe = makeSafeRegex(value)\n  const index = R++\n  debug(name, index, value)\n  t[name] = index\n  src[index] = value\n  safeSrc[index] = safe\n  re[index] = new RegExp(value, isGlobal ? 'g' : undefined)\n  safeRe[index] = new RegExp(safe, isGlobal ? 'g' : undefined)\n}\n\n// The following Regular Expressions can be used for tokenizing,\n// validating, and parsing SemVer version strings.\n\n// ## Numeric Identifier\n// A single `0`, or a non-zero digit followed by zero or more digits.\n\ncreateToken('NUMERICIDENTIFIER', '0|[1-9]\\\\d*')\ncreateToken('NUMERICIDENTIFIERLOOSE', '\\\\d+')\n\n// ## Non-numeric Identifier\n// Zero or more digits, followed by a letter or hyphen, and then zero or\n// more letters, digits, or hyphens.\n\ncreateToken('NONNUMERICIDENTIFIER', `\\\\d*[a-zA-Z-]${LETTERDASHNUMBER}*`)\n\n// ## Main Version\n// Three dot-separated numeric identifiers.\n\ncreateToken('MAINVERSION', `(${src[t.NUMERICIDENTIFIER]})\\\\.` +\n                   `(${src[t.NUMERICIDENTIFIER]})\\\\.` +\n                   `(${src[t.NUMERICIDENTIFIER]})`)\n\ncreateToken('MAINVERSIONLOOSE', `(${src[t.NUMERICIDENTIFIERLOOSE]})\\\\.` +\n                        `(${src[t.NUMERICIDENTIFIERLOOSE]})\\\\.` +\n                        `(${src[t.NUMERICIDENTIFIERLOOSE]})`)\n\n// ## Pre-release Version Identifier\n// A numeric identifier, or a non-numeric identifier.\n\ncreateToken('PRERELEASEIDENTIFIER', `(?:${src[t.NUMERICIDENTIFIER]\n}|${src[t.NONNUMERICIDENTIFIER]})`)\n\ncreateToken('PRERELEASEIDENTIFIERLOOSE', `(?:${src[t.NUMERICIDENTIFIERLOOSE]\n}|${src[t.NONNUMERICIDENTIFIER]})`)\n\n// ## Pre-release Version\n// Hyphen, followed by one or more dot-separated pre-release version\n// identifiers.\n\ncreateToken('PRERELEASE', `(?:-(${src[t.PRERELEASEIDENTIFIER]\n}(?:\\\\.${src[t.PRERELEASEIDENTIFIER]})*))`)\n\ncreateToken('PRERELEASELOOSE', `(?:-?(${src[t.PRERELEASEIDENTIFIERLOOSE]\n}(?:\\\\.${src[t.PRERELEASEIDENTIFIERLOOSE]})*))`)\n\n// ## Build Metadata Identifier\n// Any combination of digits, letters, or hyphens.\n\ncreateToken('BUILDIDENTIFIER', `${LETTERDASHNUMBER}+`)\n\n// ## Build Metadata\n// Plus sign, followed by one or more period-separated build metadata\n// identifiers.\n\ncreateToken('BUILD', `(?:\\\\+(${src[t.BUILDIDENTIFIER]\n}(?:\\\\.${src[t.BUILDIDENTIFIER]})*))`)\n\n// ## Full Version String\n// A main version, followed optionally by a pre-release version and\n// build metadata.\n\n// Note that the only major, minor, patch, and pre-release sections of\n// the version string are capturing groups.  The build metadata is not a\n// capturing group, because it should not ever be used in version\n// comparison.\n\ncreateToken('FULLPLAIN', `v?${src[t.MAINVERSION]\n}${src[t.PRERELEASE]}?${\n  src[t.BUILD]}?`)\n\ncreateToken('FULL', `^${src[t.FULLPLAIN]}$`)\n\n// like full, but allows v1.2.3 and =1.2.3, which people do sometimes.\n// also, 1.0.0alpha1 (prerelease without the hyphen) which is pretty\n// common in the npm registry.\ncreateToken('LOOSEPLAIN', `[v=\\\\s]*${src[t.MAINVERSIONLOOSE]\n}${src[t.PRERELEASELOOSE]}?${\n  src[t.BUILD]}?`)\n\ncreateToken('LOOSE', `^${src[t.LOOSEPLAIN]}$`)\n\ncreateToken('GTLT', '((?:<|>)?=?)')\n\n// Something like \"2.*\" or \"1.2.x\".\n// Note that \"x.x\" is a valid xRange identifer, meaning \"any version\"\n// Only the first item is strictly required.\ncreateToken('XRANGEIDENTIFIERLOOSE', `${src[t.NUMERICIDENTIFIERLOOSE]}|x|X|\\\\*`)\ncreateToken('XRANGEIDENTIFIER', `${src[t.NUMERICIDENTIFIER]}|x|X|\\\\*`)\n\ncreateToken('XRANGEPLAIN', `[v=\\\\s]*(${src[t.XRANGEIDENTIFIER]})` +\n                   `(?:\\\\.(${src[t.XRANGEIDENTIFIER]})` +\n                   `(?:\\\\.(${src[t.XRANGEIDENTIFIER]})` +\n                   `(?:${src[t.PRERELEASE]})?${\n                     src[t.BUILD]}?` +\n                   `)?)?`)\n\ncreateToken('XRANGEPLAINLOOSE', `[v=\\\\s]*(${src[t.XRANGEIDENTIFIERLOOSE]})` +\n                        `(?:\\\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` +\n                        `(?:\\\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` +\n                        `(?:${src[t.PRERELEASELOOSE]})?${\n                          src[t.BUILD]}?` +\n                        `)?)?`)\n\ncreateToken('XRANGE', `^${src[t.GTLT]}\\\\s*${src[t.XRANGEPLAIN]}$`)\ncreateToken('XRANGELOOSE', `^${src[t.GTLT]}\\\\s*${src[t.XRANGEPLAINLOOSE]}$`)\n\n// Coercion.\n// Extract anything that could conceivably be a part of a valid semver\ncreateToken('COERCEPLAIN', `${'(^|[^\\\\d])' +\n              '(\\\\d{1,'}${MAX_SAFE_COMPONENT_LENGTH}})` +\n              `(?:\\\\.(\\\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?` +\n              `(?:\\\\.(\\\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?`)\ncreateToken('COERCE', `${src[t.COERCEPLAIN]}(?:$|[^\\\\d])`)\ncreateToken('COERCEFULL', src[t.COERCEPLAIN] +\n              `(?:${src[t.PRERELEASE]})?` +\n              `(?:${src[t.BUILD]})?` +\n              `(?:$|[^\\\\d])`)\ncreateToken('COERCERTL', src[t.COERCE], true)\ncreateToken('COERCERTLFULL', src[t.COERCEFULL], true)\n\n// Tilde ranges.\n// Meaning is \"reasonably at or greater than\"\ncreateToken('LONETILDE', '(?:~>?)')\n\ncreateToken('TILDETRIM', `(\\\\s*)${src[t.LONETILDE]}\\\\s+`, true)\nexports.tildeTrimReplace = '$1~'\n\ncreateToken('TILDE', `^${src[t.LONETILDE]}${src[t.XRANGEPLAIN]}$`)\ncreateToken('TILDELOOSE', `^${src[t.LONETILDE]}${src[t.XRANGEPLAINLOOSE]}$`)\n\n// Caret ranges.\n// Meaning is \"at least and backwards compatible with\"\ncreateToken('LONECARET', '(?:\\\\^)')\n\ncreateToken('CARETTRIM', `(\\\\s*)${src[t.LONECARET]}\\\\s+`, true)\nexports.caretTrimReplace = '$1^'\n\ncreateToken('CARET', `^${src[t.LONECARET]}${src[t.XRANGEPLAIN]}$`)\ncreateToken('CARETLOOSE', `^${src[t.LONECARET]}${src[t.XRANGEPLAINLOOSE]}$`)\n\n// A simple gt/lt/eq thing, or just \"\" to indicate \"any version\"\ncreateToken('COMPARATORLOOSE', `^${src[t.GTLT]}\\\\s*(${src[t.LOOSEPLAIN]})$|^$`)\ncreateToken('COMPARATOR', `^${src[t.GTLT]}\\\\s*(${src[t.FULLPLAIN]})$|^$`)\n\n// An expression to strip any whitespace between the gtlt and the thing\n// it modifies, so that `> 1.2.3` ==> `>1.2.3`\ncreateToken('COMPARATORTRIM', `(\\\\s*)${src[t.GTLT]\n}\\\\s*(${src[t.LOOSEPLAIN]}|${src[t.XRANGEPLAIN]})`, true)\nexports.comparatorTrimReplace = '$1$2$3'\n\n// Something like `1.2.3 - 1.2.4`\n// Note that these all use the loose form, because they'll be\n// checked against either the strict or loose comparator form\n// later.\ncreateToken('HYPHENRANGE', `^\\\\s*(${src[t.XRANGEPLAIN]})` +\n                   `\\\\s+-\\\\s+` +\n                   `(${src[t.XRANGEPLAIN]})` +\n                   `\\\\s*$`)\n\ncreateToken('HYPHENRANGELOOSE', `^\\\\s*(${src[t.XRANGEPLAINLOOSE]})` +\n                        `\\\\s+-\\\\s+` +\n                        `(${src[t.XRANGEPLAINLOOSE]})` +\n                        `\\\\s*$`)\n\n// Star ranges basically just allow anything at all.\ncreateToken('STAR', '(<|>)?=?\\\\s*\\\\*')\n// >=0.0.0 is like a star\ncreateToken('GTE0', '^\\\\s*>=\\\\s*0\\\\.0\\\\.0\\\\s*$')\ncreateToken('GTE0PRE', '^\\\\s*>=\\\\s*0\\\\.0\\\\.0-0\\\\s*$')\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjkuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRvcnEtbmF0aXZlL3JlYWN0LXNwZWN0cnVtL25vZGVfbW9kdWxlcy9zZW12ZXIvaW50ZXJuYWwvcmUuanM/NDk3YyJdLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCB7XG4gIE1BWF9TQUZFX0NPTVBPTkVOVF9MRU5HVEgsXG4gIE1BWF9TQUZFX0JVSUxEX0xFTkdUSCxcbiAgTUFYX0xFTkdUSCxcbn0gPSByZXF1aXJlKCcuL2NvbnN0YW50cycpXG5jb25zdCBkZWJ1ZyA9IHJlcXVpcmUoJy4vZGVidWcnKVxuZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0ge31cblxuLy8gVGhlIGFjdHVhbCByZWdleHBzIGdvIG9uIGV4cG9ydHMucmVcbmNvbnN0IHJlID0gZXhwb3J0cy5yZSA9IFtdXG5jb25zdCBzYWZlUmUgPSBleHBvcnRzLnNhZmVSZSA9IFtdXG5jb25zdCBzcmMgPSBleHBvcnRzLnNyYyA9IFtdXG5jb25zdCBzYWZlU3JjID0gZXhwb3J0cy5zYWZlU3JjID0gW11cbmNvbnN0IHQgPSBleHBvcnRzLnQgPSB7fVxubGV0IFIgPSAwXG5cbmNvbnN0IExFVFRFUkRBU0hOVU1CRVIgPSAnW2EtekEtWjAtOS1dJ1xuXG4vLyBSZXBsYWNlIHNvbWUgZ3JlZWR5IHJlZ2V4IHRva2VucyB0byBwcmV2ZW50IHJlZ2V4IGRvcyBpc3N1ZXMuIFRoZXNlIHJlZ2V4IGFyZVxuLy8gdXNlZCBpbnRlcm5hbGx5IHZpYSB0aGUgc2FmZVJlIG9iamVjdCBzaW5jZSBhbGwgaW5wdXRzIGluIHRoaXMgbGlicmFyeSBnZXRcbi8vIG5vcm1hbGl6ZWQgZmlyc3QgdG8gdHJpbSBhbmQgY29sbGFwc2UgYWxsIGV4dHJhIHdoaXRlc3BhY2UuIFRoZSBvcmlnaW5hbFxuLy8gcmVnZXhlcyBhcmUgZXhwb3J0ZWQgZm9yIHVzZXJsYW5kIGNvbnN1bXB0aW9uIGFuZCBsb3dlciBsZXZlbCB1c2FnZS4gQVxuLy8gZnV0dXJlIGJyZWFraW5nIGNoYW5nZSBjb3VsZCBleHBvcnQgdGhlIHNhZmVyIHJlZ2V4IG9ubHkgd2l0aCBhIG5vdGUgdGhhdFxuLy8gYWxsIGlucHV0IHNob3VsZCBoYXZlIGV4dHJhIHdoaXRlc3BhY2UgcmVtb3ZlZC5cbmNvbnN0IHNhZmVSZWdleFJlcGxhY2VtZW50cyA9IFtcbiAgWydcXFxccycsIDFdLFxuICBbJ1xcXFxkJywgTUFYX0xFTkdUSF0sXG4gIFtMRVRURVJEQVNITlVNQkVSLCBNQVhfU0FGRV9CVUlMRF9MRU5HVEhdLFxuXVxuXG5jb25zdCBtYWtlU2FmZVJlZ2V4ID0gKHZhbHVlKSA9PiB7XG4gIGZvciAoY29uc3QgW3Rva2VuLCBtYXhdIG9mIHNhZmVSZWdleFJlcGxhY2VtZW50cykge1xuICAgIHZhbHVlID0gdmFsdWVcbiAgICAgIC5zcGxpdChgJHt0b2tlbn0qYCkuam9pbihgJHt0b2tlbn17MCwke21heH19YClcbiAgICAgIC5zcGxpdChgJHt0b2tlbn0rYCkuam9pbihgJHt0b2tlbn17MSwke21heH19YClcbiAgfVxuICByZXR1cm4gdmFsdWVcbn1cblxuY29uc3QgY3JlYXRlVG9rZW4gPSAobmFtZSwgdmFsdWUsIGlzR2xvYmFsKSA9PiB7XG4gIGNvbnN0IHNhZmUgPSBtYWtlU2FmZVJlZ2V4KHZhbHVlKVxuICBjb25zdCBpbmRleCA9IFIrK1xuICBkZWJ1ZyhuYW1lLCBpbmRleCwgdmFsdWUpXG4gIHRbbmFtZV0gPSBpbmRleFxuICBzcmNbaW5kZXhdID0gdmFsdWVcbiAgc2FmZVNyY1tpbmRleF0gPSBzYWZlXG4gIHJlW2luZGV4XSA9IG5ldyBSZWdFeHAodmFsdWUsIGlzR2xvYmFsID8gJ2cnIDogdW5kZWZpbmVkKVxuICBzYWZlUmVbaW5kZXhdID0gbmV3IFJlZ0V4cChzYWZlLCBpc0dsb2JhbCA/ICdnJyA6IHVuZGVmaW5lZClcbn1cblxuLy8gVGhlIGZvbGxvd2luZyBSZWd1bGFyIEV4cHJlc3Npb25zIGNhbiBiZSB1c2VkIGZvciB0b2tlbml6aW5nLFxuLy8gdmFsaWRhdGluZywgYW5kIHBhcnNpbmcgU2VtVmVyIHZlcnNpb24gc3RyaW5ncy5cblxuLy8gIyMgTnVtZXJpYyBJZGVudGlmaWVyXG4vLyBBIHNpbmdsZSBgMGAsIG9yIGEgbm9uLXplcm8gZGlnaXQgZm9sbG93ZWQgYnkgemVybyBvciBtb3JlIGRpZ2l0cy5cblxuY3JlYXRlVG9rZW4oJ05VTUVSSUNJREVOVElGSUVSJywgJzB8WzEtOV1cXFxcZConKVxuY3JlYXRlVG9rZW4oJ05VTUVSSUNJREVOVElGSUVSTE9PU0UnLCAnXFxcXGQrJylcblxuLy8gIyMgTm9uLW51bWVyaWMgSWRlbnRpZmllclxuLy8gWmVybyBvciBtb3JlIGRpZ2l0cywgZm9sbG93ZWQgYnkgYSBsZXR0ZXIgb3IgaHlwaGVuLCBhbmQgdGhlbiB6ZXJvIG9yXG4vLyBtb3JlIGxldHRlcnMsIGRpZ2l0cywgb3IgaHlwaGVucy5cblxuY3JlYXRlVG9rZW4oJ05PTk5VTUVSSUNJREVOVElGSUVSJywgYFxcXFxkKlthLXpBLVotXSR7TEVUVEVSREFTSE5VTUJFUn0qYClcblxuLy8gIyMgTWFpbiBWZXJzaW9uXG4vLyBUaHJlZSBkb3Qtc2VwYXJhdGVkIG51bWVyaWMgaWRlbnRpZmllcnMuXG5cbmNyZWF0ZVRva2VuKCdNQUlOVkVSU0lPTicsIGAoJHtzcmNbdC5OVU1FUklDSURFTlRJRklFUl19KVxcXFwuYCArXG4gICAgICAgICAgICAgICAgICAgYCgke3NyY1t0Lk5VTUVSSUNJREVOVElGSUVSXX0pXFxcXC5gICtcbiAgICAgICAgICAgICAgICAgICBgKCR7c3JjW3QuTlVNRVJJQ0lERU5USUZJRVJdfSlgKVxuXG5jcmVhdGVUb2tlbignTUFJTlZFUlNJT05MT09TRScsIGAoJHtzcmNbdC5OVU1FUklDSURFTlRJRklFUkxPT1NFXX0pXFxcXC5gICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGAoJHtzcmNbdC5OVU1FUklDSURFTlRJRklFUkxPT1NFXX0pXFxcXC5gICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGAoJHtzcmNbdC5OVU1FUklDSURFTlRJRklFUkxPT1NFXX0pYClcblxuLy8gIyMgUHJlLXJlbGVhc2UgVmVyc2lvbiBJZGVudGlmaWVyXG4vLyBBIG51bWVyaWMgaWRlbnRpZmllciwgb3IgYSBub24tbnVtZXJpYyBpZGVudGlmaWVyLlxuXG5jcmVhdGVUb2tlbignUFJFUkVMRUFTRUlERU5USUZJRVInLCBgKD86JHtzcmNbdC5OVU1FUklDSURFTlRJRklFUl1cbn18JHtzcmNbdC5OT05OVU1FUklDSURFTlRJRklFUl19KWApXG5cbmNyZWF0ZVRva2VuKCdQUkVSRUxFQVNFSURFTlRJRklFUkxPT1NFJywgYCg/OiR7c3JjW3QuTlVNRVJJQ0lERU5USUZJRVJMT09TRV1cbn18JHtzcmNbdC5OT05OVU1FUklDSURFTlRJRklFUl19KWApXG5cbi8vICMjIFByZS1yZWxlYXNlIFZlcnNpb25cbi8vIEh5cGhlbiwgZm9sbG93ZWQgYnkgb25lIG9yIG1vcmUgZG90LXNlcGFyYXRlZCBwcmUtcmVsZWFzZSB2ZXJzaW9uXG4vLyBpZGVudGlmaWVycy5cblxuY3JlYXRlVG9rZW4oJ1BSRVJFTEVBU0UnLCBgKD86LSgke3NyY1t0LlBSRVJFTEVBU0VJREVOVElGSUVSXVxufSg/OlxcXFwuJHtzcmNbdC5QUkVSRUxFQVNFSURFTlRJRklFUl19KSopKWApXG5cbmNyZWF0ZVRva2VuKCdQUkVSRUxFQVNFTE9PU0UnLCBgKD86LT8oJHtzcmNbdC5QUkVSRUxFQVNFSURFTlRJRklFUkxPT1NFXVxufSg/OlxcXFwuJHtzcmNbdC5QUkVSRUxFQVNFSURFTlRJRklFUkxPT1NFXX0pKikpYClcblxuLy8gIyMgQnVpbGQgTWV0YWRhdGEgSWRlbnRpZmllclxuLy8gQW55IGNvbWJpbmF0aW9uIG9mIGRpZ2l0cywgbGV0dGVycywgb3IgaHlwaGVucy5cblxuY3JlYXRlVG9rZW4oJ0JVSUxESURFTlRJRklFUicsIGAke0xFVFRFUkRBU0hOVU1CRVJ9K2ApXG5cbi8vICMjIEJ1aWxkIE1ldGFkYXRhXG4vLyBQbHVzIHNpZ24sIGZvbGxvd2VkIGJ5IG9uZSBvciBtb3JlIHBlcmlvZC1zZXBhcmF0ZWQgYnVpbGQgbWV0YWRhdGFcbi8vIGlkZW50aWZpZXJzLlxuXG5jcmVhdGVUb2tlbignQlVJTEQnLCBgKD86XFxcXCsoJHtzcmNbdC5CVUlMRElERU5USUZJRVJdXG59KD86XFxcXC4ke3NyY1t0LkJVSUxESURFTlRJRklFUl19KSopKWApXG5cbi8vICMjIEZ1bGwgVmVyc2lvbiBTdHJpbmdcbi8vIEEgbWFpbiB2ZXJzaW9uLCBmb2xsb3dlZCBvcHRpb25hbGx5IGJ5IGEgcHJlLXJlbGVhc2UgdmVyc2lvbiBhbmRcbi8vIGJ1aWxkIG1ldGFkYXRhLlxuXG4vLyBOb3RlIHRoYXQgdGhlIG9ubHkgbWFqb3IsIG1pbm9yLCBwYXRjaCwgYW5kIHByZS1yZWxlYXNlIHNlY3Rpb25zIG9mXG4vLyB0aGUgdmVyc2lvbiBzdHJpbmcgYXJlIGNhcHR1cmluZyBncm91cHMuICBUaGUgYnVpbGQgbWV0YWRhdGEgaXMgbm90IGFcbi8vIGNhcHR1cmluZyBncm91cCwgYmVjYXVzZSBpdCBzaG91bGQgbm90IGV2ZXIgYmUgdXNlZCBpbiB2ZXJzaW9uXG4vLyBjb21wYXJpc29uLlxuXG5jcmVhdGVUb2tlbignRlVMTFBMQUlOJywgYHY/JHtzcmNbdC5NQUlOVkVSU0lPTl1cbn0ke3NyY1t0LlBSRVJFTEVBU0VdfT8ke1xuICBzcmNbdC5CVUlMRF19P2ApXG5cbmNyZWF0ZVRva2VuKCdGVUxMJywgYF4ke3NyY1t0LkZVTExQTEFJTl19JGApXG5cbi8vIGxpa2UgZnVsbCwgYnV0IGFsbG93cyB2MS4yLjMgYW5kID0xLjIuMywgd2hpY2ggcGVvcGxlIGRvIHNvbWV0aW1lcy5cbi8vIGFsc28sIDEuMC4wYWxwaGExIChwcmVyZWxlYXNlIHdpdGhvdXQgdGhlIGh5cGhlbikgd2hpY2ggaXMgcHJldHR5XG4vLyBjb21tb24gaW4gdGhlIG5wbSByZWdpc3RyeS5cbmNyZWF0ZVRva2VuKCdMT09TRVBMQUlOJywgYFt2PVxcXFxzXSoke3NyY1t0Lk1BSU5WRVJTSU9OTE9PU0VdXG59JHtzcmNbdC5QUkVSRUxFQVNFTE9PU0VdfT8ke1xuICBzcmNbdC5CVUlMRF19P2ApXG5cbmNyZWF0ZVRva2VuKCdMT09TRScsIGBeJHtzcmNbdC5MT09TRVBMQUlOXX0kYClcblxuY3JlYXRlVG9rZW4oJ0dUTFQnLCAnKCg/Ojx8Pik/PT8pJylcblxuLy8gU29tZXRoaW5nIGxpa2UgXCIyLipcIiBvciBcIjEuMi54XCIuXG4vLyBOb3RlIHRoYXQgXCJ4LnhcIiBpcyBhIHZhbGlkIHhSYW5nZSBpZGVudGlmZXIsIG1lYW5pbmcgXCJhbnkgdmVyc2lvblwiXG4vLyBPbmx5IHRoZSBmaXJzdCBpdGVtIGlzIHN0cmljdGx5IHJlcXVpcmVkLlxuY3JlYXRlVG9rZW4oJ1hSQU5HRUlERU5USUZJRVJMT09TRScsIGAke3NyY1t0Lk5VTUVSSUNJREVOVElGSUVSTE9PU0VdfXx4fFh8XFxcXCpgKVxuY3JlYXRlVG9rZW4oJ1hSQU5HRUlERU5USUZJRVInLCBgJHtzcmNbdC5OVU1FUklDSURFTlRJRklFUl19fHh8WHxcXFxcKmApXG5cbmNyZWF0ZVRva2VuKCdYUkFOR0VQTEFJTicsIGBbdj1cXFxcc10qKCR7c3JjW3QuWFJBTkdFSURFTlRJRklFUl19KWAgK1xuICAgICAgICAgICAgICAgICAgIGAoPzpcXFxcLigke3NyY1t0LlhSQU5HRUlERU5USUZJRVJdfSlgICtcbiAgICAgICAgICAgICAgICAgICBgKD86XFxcXC4oJHtzcmNbdC5YUkFOR0VJREVOVElGSUVSXX0pYCArXG4gICAgICAgICAgICAgICAgICAgYCg/OiR7c3JjW3QuUFJFUkVMRUFTRV19KT8ke1xuICAgICAgICAgICAgICAgICAgICAgc3JjW3QuQlVJTERdfT9gICtcbiAgICAgICAgICAgICAgICAgICBgKT8pP2ApXG5cbmNyZWF0ZVRva2VuKCdYUkFOR0VQTEFJTkxPT1NFJywgYFt2PVxcXFxzXSooJHtzcmNbdC5YUkFOR0VJREVOVElGSUVSTE9PU0VdfSlgICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGAoPzpcXFxcLigke3NyY1t0LlhSQU5HRUlERU5USUZJRVJMT09TRV19KWAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYCg/OlxcXFwuKCR7c3JjW3QuWFJBTkdFSURFTlRJRklFUkxPT1NFXX0pYCArXG4gICAgICAgICAgICAgICAgICAgICAgICBgKD86JHtzcmNbdC5QUkVSRUxFQVNFTE9PU0VdfSk/JHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjW3QuQlVJTERdfT9gICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGApPyk/YClcblxuY3JlYXRlVG9rZW4oJ1hSQU5HRScsIGBeJHtzcmNbdC5HVExUXX1cXFxccyoke3NyY1t0LlhSQU5HRVBMQUlOXX0kYClcbmNyZWF0ZVRva2VuKCdYUkFOR0VMT09TRScsIGBeJHtzcmNbdC5HVExUXX1cXFxccyoke3NyY1t0LlhSQU5HRVBMQUlOTE9PU0VdfSRgKVxuXG4vLyBDb2VyY2lvbi5cbi8vIEV4dHJhY3QgYW55dGhpbmcgdGhhdCBjb3VsZCBjb25jZWl2YWJseSBiZSBhIHBhcnQgb2YgYSB2YWxpZCBzZW12ZXJcbmNyZWF0ZVRva2VuKCdDT0VSQ0VQTEFJTicsIGAkeycoXnxbXlxcXFxkXSknICtcbiAgICAgICAgICAgICAgJyhcXFxcZHsxLCd9JHtNQVhfU0FGRV9DT01QT05FTlRfTEVOR1RIfX0pYCArXG4gICAgICAgICAgICAgIGAoPzpcXFxcLihcXFxcZHsxLCR7TUFYX1NBRkVfQ09NUE9ORU5UX0xFTkdUSH19KSk/YCArXG4gICAgICAgICAgICAgIGAoPzpcXFxcLihcXFxcZHsxLCR7TUFYX1NBRkVfQ09NUE9ORU5UX0xFTkdUSH19KSk/YClcbmNyZWF0ZVRva2VuKCdDT0VSQ0UnLCBgJHtzcmNbdC5DT0VSQ0VQTEFJTl19KD86JHxbXlxcXFxkXSlgKVxuY3JlYXRlVG9rZW4oJ0NPRVJDRUZVTEwnLCBzcmNbdC5DT0VSQ0VQTEFJTl0gK1xuICAgICAgICAgICAgICBgKD86JHtzcmNbdC5QUkVSRUxFQVNFXX0pP2AgK1xuICAgICAgICAgICAgICBgKD86JHtzcmNbdC5CVUlMRF19KT9gICtcbiAgICAgICAgICAgICAgYCg/OiR8W15cXFxcZF0pYClcbmNyZWF0ZVRva2VuKCdDT0VSQ0VSVEwnLCBzcmNbdC5DT0VSQ0VdLCB0cnVlKVxuY3JlYXRlVG9rZW4oJ0NPRVJDRVJUTEZVTEwnLCBzcmNbdC5DT0VSQ0VGVUxMXSwgdHJ1ZSlcblxuLy8gVGlsZGUgcmFuZ2VzLlxuLy8gTWVhbmluZyBpcyBcInJlYXNvbmFibHkgYXQgb3IgZ3JlYXRlciB0aGFuXCJcbmNyZWF0ZVRva2VuKCdMT05FVElMREUnLCAnKD86fj4/KScpXG5cbmNyZWF0ZVRva2VuKCdUSUxERVRSSU0nLCBgKFxcXFxzKikke3NyY1t0LkxPTkVUSUxERV19XFxcXHMrYCwgdHJ1ZSlcbmV4cG9ydHMudGlsZGVUcmltUmVwbGFjZSA9ICckMX4nXG5cbmNyZWF0ZVRva2VuKCdUSUxERScsIGBeJHtzcmNbdC5MT05FVElMREVdfSR7c3JjW3QuWFJBTkdFUExBSU5dfSRgKVxuY3JlYXRlVG9rZW4oJ1RJTERFTE9PU0UnLCBgXiR7c3JjW3QuTE9ORVRJTERFXX0ke3NyY1t0LlhSQU5HRVBMQUlOTE9PU0VdfSRgKVxuXG4vLyBDYXJldCByYW5nZXMuXG4vLyBNZWFuaW5nIGlzIFwiYXQgbGVhc3QgYW5kIGJhY2t3YXJkcyBjb21wYXRpYmxlIHdpdGhcIlxuY3JlYXRlVG9rZW4oJ0xPTkVDQVJFVCcsICcoPzpcXFxcXiknKVxuXG5jcmVhdGVUb2tlbignQ0FSRVRUUklNJywgYChcXFxccyopJHtzcmNbdC5MT05FQ0FSRVRdfVxcXFxzK2AsIHRydWUpXG5leHBvcnRzLmNhcmV0VHJpbVJlcGxhY2UgPSAnJDFeJ1xuXG5jcmVhdGVUb2tlbignQ0FSRVQnLCBgXiR7c3JjW3QuTE9ORUNBUkVUXX0ke3NyY1t0LlhSQU5HRVBMQUlOXX0kYClcbmNyZWF0ZVRva2VuKCdDQVJFVExPT1NFJywgYF4ke3NyY1t0LkxPTkVDQVJFVF19JHtzcmNbdC5YUkFOR0VQTEFJTkxPT1NFXX0kYClcblxuLy8gQSBzaW1wbGUgZ3QvbHQvZXEgdGhpbmcsIG9yIGp1c3QgXCJcIiB0byBpbmRpY2F0ZSBcImFueSB2ZXJzaW9uXCJcbmNyZWF0ZVRva2VuKCdDT01QQVJBVE9STE9PU0UnLCBgXiR7c3JjW3QuR1RMVF19XFxcXHMqKCR7c3JjW3QuTE9PU0VQTEFJTl19KSR8XiRgKVxuY3JlYXRlVG9rZW4oJ0NPTVBBUkFUT1InLCBgXiR7c3JjW3QuR1RMVF19XFxcXHMqKCR7c3JjW3QuRlVMTFBMQUlOXX0pJHxeJGApXG5cbi8vIEFuIGV4cHJlc3Npb24gdG8gc3RyaXAgYW55IHdoaXRlc3BhY2UgYmV0d2VlbiB0aGUgZ3RsdCBhbmQgdGhlIHRoaW5nXG4vLyBpdCBtb2RpZmllcywgc28gdGhhdCBgPiAxLjIuM2AgPT0+IGA+MS4yLjNgXG5jcmVhdGVUb2tlbignQ09NUEFSQVRPUlRSSU0nLCBgKFxcXFxzKikke3NyY1t0LkdUTFRdXG59XFxcXHMqKCR7c3JjW3QuTE9PU0VQTEFJTl19fCR7c3JjW3QuWFJBTkdFUExBSU5dfSlgLCB0cnVlKVxuZXhwb3J0cy5jb21wYXJhdG9yVHJpbVJlcGxhY2UgPSAnJDEkMiQzJ1xuXG4vLyBTb21ldGhpbmcgbGlrZSBgMS4yLjMgLSAxLjIuNGBcbi8vIE5vdGUgdGhhdCB0aGVzZSBhbGwgdXNlIHRoZSBsb29zZSBmb3JtLCBiZWNhdXNlIHRoZXknbGwgYmVcbi8vIGNoZWNrZWQgYWdhaW5zdCBlaXRoZXIgdGhlIHN0cmljdCBvciBsb29zZSBjb21wYXJhdG9yIGZvcm1cbi8vIGxhdGVyLlxuY3JlYXRlVG9rZW4oJ0hZUEhFTlJBTkdFJywgYF5cXFxccyooJHtzcmNbdC5YUkFOR0VQTEFJTl19KWAgK1xuICAgICAgICAgICAgICAgICAgIGBcXFxccystXFxcXHMrYCArXG4gICAgICAgICAgICAgICAgICAgYCgke3NyY1t0LlhSQU5HRVBMQUlOXX0pYCArXG4gICAgICAgICAgICAgICAgICAgYFxcXFxzKiRgKVxuXG5jcmVhdGVUb2tlbignSFlQSEVOUkFOR0VMT09TRScsIGBeXFxcXHMqKCR7c3JjW3QuWFJBTkdFUExBSU5MT09TRV19KWAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYFxcXFxzKy1cXFxccytgICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGAoJHtzcmNbdC5YUkFOR0VQTEFJTkxPT1NFXX0pYCArXG4gICAgICAgICAgICAgICAgICAgICAgICBgXFxcXHMqJGApXG5cbi8vIFN0YXIgcmFuZ2VzIGJhc2ljYWxseSBqdXN0IGFsbG93IGFueXRoaW5nIGF0IGFsbC5cbmNyZWF0ZVRva2VuKCdTVEFSJywgJyg8fD4pPz0/XFxcXHMqXFxcXConKVxuLy8gPj0wLjAuMCBpcyBsaWtlIGEgc3RhclxuY3JlYXRlVG9rZW4oJ0dURTAnLCAnXlxcXFxzKj49XFxcXHMqMFxcXFwuMFxcXFwuMFxcXFxzKiQnKVxuY3JlYXRlVG9rZW4oJ0dURTBQUkUnLCAnXlxcXFxzKj49XFxcXHMqMFxcXFwuMFxcXFwuMC0wXFxcXHMqJCcpXG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///29\n")},function(module,exports,__webpack_require__){"use strict";eval("/* WEBPACK VAR INJECTION */(function(global) {/*!\n * The buffer module from node.js, for the browser.\n *\n * @author   Feross Aboukhadijeh <http://feross.org>\n * @license  MIT\n */\n/* eslint-disable no-proto */\n\n\n\nvar base64 = __webpack_require__(234)\nvar ieee754 = __webpack_require__(235)\nvar isArray = __webpack_require__(236)\n\nexports.Buffer = Buffer\nexports.SlowBuffer = SlowBuffer\nexports.INSPECT_MAX_BYTES = 50\n\n/**\n * If `Buffer.TYPED_ARRAY_SUPPORT`:\n *   === true    Use Uint8Array implementation (fastest)\n *   === false   Use Object implementation (most compatible, even IE6)\n *\n * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,\n * Opera 11.6+, iOS 4.2+.\n *\n * Due to various browser bugs, sometimes the Object implementation will be used even\n * when the browser supports typed arrays.\n *\n * Note:\n *\n *   - Firefox 4-29 lacks support for adding new properties to `Uint8Array` instances,\n *     See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438.\n *\n *   - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function.\n *\n *   - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of\n *     incorrect length in some situations.\n\n * We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they\n * get the Object implementation, which is slower but behaves correctly.\n */\nBuffer.TYPED_ARRAY_SUPPORT = global.TYPED_ARRAY_SUPPORT !== undefined\n  ? global.TYPED_ARRAY_SUPPORT\n  : typedArraySupport()\n\n/*\n * Export kMaxLength after typed array support is determined.\n */\nexports.kMaxLength = kMaxLength()\n\nfunction typedArraySupport () {\n  try {\n    var arr = new Uint8Array(1)\n    arr.__proto__ = {__proto__: Uint8Array.prototype, foo: function () { return 42 }}\n    return arr.foo() === 42 && // typed array instances can be augmented\n        typeof arr.subarray === 'function' && // chrome 9-10 lack `subarray`\n        arr.subarray(1, 1).byteLength === 0 // ie10 has broken `subarray`\n  } catch (e) {\n    return false\n  }\n}\n\nfunction kMaxLength () {\n  return Buffer.TYPED_ARRAY_SUPPORT\n    ? 0x7fffffff\n    : 0x3fffffff\n}\n\nfunction createBuffer (that, length) {\n  if (kMaxLength() < length) {\n    throw new RangeError('Invalid typed array length')\n  }\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    // Return an augmented `Uint8Array` instance, for best performance\n    that = new Uint8Array(length)\n    that.__proto__ = Buffer.prototype\n  } else {\n    // Fallback: Return an object instance of the Buffer class\n    if (that === null) {\n      that = new Buffer(length)\n    }\n    that.length = length\n  }\n\n  return that\n}\n\n/**\n * The Buffer constructor returns instances of `Uint8Array` that have their\n * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of\n * `Uint8Array`, so the returned instances will have all the node `Buffer` methods\n * and the `Uint8Array` methods. Square bracket notation works as expected -- it\n * returns a single octet.\n *\n * The `Uint8Array` prototype remains unmodified.\n */\n\nfunction Buffer (arg, encodingOrOffset, length) {\n  if (!Buffer.TYPED_ARRAY_SUPPORT && !(this instanceof Buffer)) {\n    return new Buffer(arg, encodingOrOffset, length)\n  }\n\n  // Common case.\n  if (typeof arg === 'number') {\n    if (typeof encodingOrOffset === 'string') {\n      throw new Error(\n        'If encoding is specified then the first argument must be a string'\n      )\n    }\n    return allocUnsafe(this, arg)\n  }\n  return from(this, arg, encodingOrOffset, length)\n}\n\nBuffer.poolSize = 8192 // not used by this implementation\n\n// TODO: Legacy, not needed anymore. Remove in next major version.\nBuffer._augment = function (arr) {\n  arr.__proto__ = Buffer.prototype\n  return arr\n}\n\nfunction from (that, value, encodingOrOffset, length) {\n  if (typeof value === 'number') {\n    throw new TypeError('\"value\" argument must not be a number')\n  }\n\n  if (typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer) {\n    return fromArrayBuffer(that, value, encodingOrOffset, length)\n  }\n\n  if (typeof value === 'string') {\n    return fromString(that, value, encodingOrOffset)\n  }\n\n  return fromObject(that, value)\n}\n\n/**\n * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError\n * if value is a number.\n * Buffer.from(str[, encoding])\n * Buffer.from(array)\n * Buffer.from(buffer)\n * Buffer.from(arrayBuffer[, byteOffset[, length]])\n **/\nBuffer.from = function (value, encodingOrOffset, length) {\n  return from(null, value, encodingOrOffset, length)\n}\n\nif (Buffer.TYPED_ARRAY_SUPPORT) {\n  Buffer.prototype.__proto__ = Uint8Array.prototype\n  Buffer.__proto__ = Uint8Array\n  if (typeof Symbol !== 'undefined' && Symbol.species &&\n      Buffer[Symbol.species] === Buffer) {\n    // Fix subarray() in ES2016. See: https://github.com/feross/buffer/pull/97\n    Object.defineProperty(Buffer, Symbol.species, {\n      value: null,\n      configurable: true\n    })\n  }\n}\n\nfunction assertSize (size) {\n  if (typeof size !== 'number') {\n    throw new TypeError('\"size\" argument must be a number')\n  } else if (size < 0) {\n    throw new RangeError('\"size\" argument must not be negative')\n  }\n}\n\nfunction alloc (that, size, fill, encoding) {\n  assertSize(size)\n  if (size <= 0) {\n    return createBuffer(that, size)\n  }\n  if (fill !== undefined) {\n    // Only pay attention to encoding if it's a string. This\n    // prevents accidentally sending in a number that would\n    // be interpretted as a start offset.\n    return typeof encoding === 'string'\n      ? createBuffer(that, size).fill(fill, encoding)\n      : createBuffer(that, size).fill(fill)\n  }\n  return createBuffer(that, size)\n}\n\n/**\n * Creates a new filled Buffer instance.\n * alloc(size[, fill[, encoding]])\n **/\nBuffer.alloc = function (size, fill, encoding) {\n  return alloc(null, size, fill, encoding)\n}\n\nfunction allocUnsafe (that, size) {\n  assertSize(size)\n  that = createBuffer(that, size < 0 ? 0 : checked(size) | 0)\n  if (!Buffer.TYPED_ARRAY_SUPPORT) {\n    for (var i = 0; i < size; ++i) {\n      that[i] = 0\n    }\n  }\n  return that\n}\n\n/**\n * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance.\n * */\nBuffer.allocUnsafe = function (size) {\n  return allocUnsafe(null, size)\n}\n/**\n * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance.\n */\nBuffer.allocUnsafeSlow = function (size) {\n  return allocUnsafe(null, size)\n}\n\nfunction fromString (that, string, encoding) {\n  if (typeof encoding !== 'string' || encoding === '') {\n    encoding = 'utf8'\n  }\n\n  if (!Buffer.isEncoding(encoding)) {\n    throw new TypeError('\"encoding\" must be a valid string encoding')\n  }\n\n  var length = byteLength(string, encoding) | 0\n  that = createBuffer(that, length)\n\n  var actual = that.write(string, encoding)\n\n  if (actual !== length) {\n    // Writing a hex string, for example, that contains invalid characters will\n    // cause everything after the first invalid character to be ignored. (e.g.\n    // 'abxxcd' will be treated as 'ab')\n    that = that.slice(0, actual)\n  }\n\n  return that\n}\n\nfunction fromArrayLike (that, array) {\n  var length = array.length < 0 ? 0 : checked(array.length) | 0\n  that = createBuffer(that, length)\n  for (var i = 0; i < length; i += 1) {\n    that[i] = array[i] & 255\n  }\n  return that\n}\n\nfunction fromArrayBuffer (that, array, byteOffset, length) {\n  array.byteLength // this throws if `array` is not a valid ArrayBuffer\n\n  if (byteOffset < 0 || array.byteLength < byteOffset) {\n    throw new RangeError('\\'offset\\' is out of bounds')\n  }\n\n  if (array.byteLength < byteOffset + (length || 0)) {\n    throw new RangeError('\\'length\\' is out of bounds')\n  }\n\n  if (byteOffset === undefined && length === undefined) {\n    array = new Uint8Array(array)\n  } else if (length === undefined) {\n    array = new Uint8Array(array, byteOffset)\n  } else {\n    array = new Uint8Array(array, byteOffset, length)\n  }\n\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    // Return an augmented `Uint8Array` instance, for best performance\n    that = array\n    that.__proto__ = Buffer.prototype\n  } else {\n    // Fallback: Return an object instance of the Buffer class\n    that = fromArrayLike(that, array)\n  }\n  return that\n}\n\nfunction fromObject (that, obj) {\n  if (Buffer.isBuffer(obj)) {\n    var len = checked(obj.length) | 0\n    that = createBuffer(that, len)\n\n    if (that.length === 0) {\n      return that\n    }\n\n    obj.copy(that, 0, 0, len)\n    return that\n  }\n\n  if (obj) {\n    if ((typeof ArrayBuffer !== 'undefined' &&\n        obj.buffer instanceof ArrayBuffer) || 'length' in obj) {\n      if (typeof obj.length !== 'number' || isnan(obj.length)) {\n        return createBuffer(that, 0)\n      }\n      return fromArrayLike(that, obj)\n    }\n\n    if (obj.type === 'Buffer' && isArray(obj.data)) {\n      return fromArrayLike(that, obj.data)\n    }\n  }\n\n  throw new TypeError('First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.')\n}\n\nfunction checked (length) {\n  // Note: cannot use `length < kMaxLength()` here because that fails when\n  // length is NaN (which is otherwise coerced to zero.)\n  if (length >= kMaxLength()) {\n    throw new RangeError('Attempt to allocate Buffer larger than maximum ' +\n                         'size: 0x' + kMaxLength().toString(16) + ' bytes')\n  }\n  return length | 0\n}\n\nfunction SlowBuffer (length) {\n  if (+length != length) { // eslint-disable-line eqeqeq\n    length = 0\n  }\n  return Buffer.alloc(+length)\n}\n\nBuffer.isBuffer = function isBuffer (b) {\n  return !!(b != null && b._isBuffer)\n}\n\nBuffer.compare = function compare (a, b) {\n  if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {\n    throw new TypeError('Arguments must be Buffers')\n  }\n\n  if (a === b) return 0\n\n  var x = a.length\n  var y = b.length\n\n  for (var i = 0, len = Math.min(x, y); i < len; ++i) {\n    if (a[i] !== b[i]) {\n      x = a[i]\n      y = b[i]\n      break\n    }\n  }\n\n  if (x < y) return -1\n  if (y < x) return 1\n  return 0\n}\n\nBuffer.isEncoding = function isEncoding (encoding) {\n  switch (String(encoding).toLowerCase()) {\n    case 'hex':\n    case 'utf8':\n    case 'utf-8':\n    case 'ascii':\n    case 'latin1':\n    case 'binary':\n    case 'base64':\n    case 'ucs2':\n    case 'ucs-2':\n    case 'utf16le':\n    case 'utf-16le':\n      return true\n    default:\n      return false\n  }\n}\n\nBuffer.concat = function concat (list, length) {\n  if (!isArray(list)) {\n    throw new TypeError('\"list\" argument must be an Array of Buffers')\n  }\n\n  if (list.length === 0) {\n    return Buffer.alloc(0)\n  }\n\n  var i\n  if (length === undefined) {\n    length = 0\n    for (i = 0; i < list.length; ++i) {\n      length += list[i].length\n    }\n  }\n\n  var buffer = Buffer.allocUnsafe(length)\n  var pos = 0\n  for (i = 0; i < list.length; ++i) {\n    var buf = list[i]\n    if (!Buffer.isBuffer(buf)) {\n      throw new TypeError('\"list\" argument must be an Array of Buffers')\n    }\n    buf.copy(buffer, pos)\n    pos += buf.length\n  }\n  return buffer\n}\n\nfunction byteLength (string, encoding) {\n  if (Buffer.isBuffer(string)) {\n    return string.length\n  }\n  if (typeof ArrayBuffer !== 'undefined' && typeof ArrayBuffer.isView === 'function' &&\n      (ArrayBuffer.isView(string) || string instanceof ArrayBuffer)) {\n    return string.byteLength\n  }\n  if (typeof string !== 'string') {\n    string = '' + string\n  }\n\n  var len = string.length\n  if (len === 0) return 0\n\n  // Use a for loop to avoid recursion\n  var loweredCase = false\n  for (;;) {\n    switch (encoding) {\n      case 'ascii':\n      case 'latin1':\n      case 'binary':\n        return len\n      case 'utf8':\n      case 'utf-8':\n      case undefined:\n        return utf8ToBytes(string).length\n      case 'ucs2':\n      case 'ucs-2':\n      case 'utf16le':\n      case 'utf-16le':\n        return len * 2\n      case 'hex':\n        return len >>> 1\n      case 'base64':\n        return base64ToBytes(string).length\n      default:\n        if (loweredCase) return utf8ToBytes(string).length // assume utf8\n        encoding = ('' + encoding).toLowerCase()\n        loweredCase = true\n    }\n  }\n}\nBuffer.byteLength = byteLength\n\nfunction slowToString (encoding, start, end) {\n  var loweredCase = false\n\n  // No need to verify that \"this.length <= MAX_UINT32\" since it's a read-only\n  // property of a typed array.\n\n  // This behaves neither like String nor Uint8Array in that we set start/end\n  // to their upper/lower bounds if the value passed is out of range.\n  // undefined is handled specially as per ECMA-262 6th Edition,\n  // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization.\n  if (start === undefined || start < 0) {\n    start = 0\n  }\n  // Return early if start > this.length. Done here to prevent potential uint32\n  // coercion fail below.\n  if (start > this.length) {\n    return ''\n  }\n\n  if (end === undefined || end > this.length) {\n    end = this.length\n  }\n\n  if (end <= 0) {\n    return ''\n  }\n\n  // Force coersion to uint32. This will also coerce falsey/NaN values to 0.\n  end >>>= 0\n  start >>>= 0\n\n  if (end <= start) {\n    return ''\n  }\n\n  if (!encoding) encoding = 'utf8'\n\n  while (true) {\n    switch (encoding) {\n      case 'hex':\n        return hexSlice(this, start, end)\n\n      case 'utf8':\n      case 'utf-8':\n        return utf8Slice(this, start, end)\n\n      case 'ascii':\n        return asciiSlice(this, start, end)\n\n      case 'latin1':\n      case 'binary':\n        return latin1Slice(this, start, end)\n\n      case 'base64':\n        return base64Slice(this, start, end)\n\n      case 'ucs2':\n      case 'ucs-2':\n      case 'utf16le':\n      case 'utf-16le':\n        return utf16leSlice(this, start, end)\n\n      default:\n        if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n        encoding = (encoding + '').toLowerCase()\n        loweredCase = true\n    }\n  }\n}\n\n// The property is used by `Buffer.isBuffer` and `is-buffer` (in Safari 5-7) to detect\n// Buffer instances.\nBuffer.prototype._isBuffer = true\n\nfunction swap (b, n, m) {\n  var i = b[n]\n  b[n] = b[m]\n  b[m] = i\n}\n\nBuffer.prototype.swap16 = function swap16 () {\n  var len = this.length\n  if (len % 2 !== 0) {\n    throw new RangeError('Buffer size must be a multiple of 16-bits')\n  }\n  for (var i = 0; i < len; i += 2) {\n    swap(this, i, i + 1)\n  }\n  return this\n}\n\nBuffer.prototype.swap32 = function swap32 () {\n  var len = this.length\n  if (len % 4 !== 0) {\n    throw new RangeError('Buffer size must be a multiple of 32-bits')\n  }\n  for (var i = 0; i < len; i += 4) {\n    swap(this, i, i + 3)\n    swap(this, i + 1, i + 2)\n  }\n  return this\n}\n\nBuffer.prototype.swap64 = function swap64 () {\n  var len = this.length\n  if (len % 8 !== 0) {\n    throw new RangeError('Buffer size must be a multiple of 64-bits')\n  }\n  for (var i = 0; i < len; i += 8) {\n    swap(this, i, i + 7)\n    swap(this, i + 1, i + 6)\n    swap(this, i + 2, i + 5)\n    swap(this, i + 3, i + 4)\n  }\n  return this\n}\n\nBuffer.prototype.toString = function toString () {\n  var length = this.length | 0\n  if (length === 0) return ''\n  if (arguments.length === 0) return utf8Slice(this, 0, length)\n  return slowToString.apply(this, arguments)\n}\n\nBuffer.prototype.equals = function equals (b) {\n  if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')\n  if (this === b) return true\n  return Buffer.compare(this, b) === 0\n}\n\nBuffer.prototype.inspect = function inspect () {\n  var str = ''\n  var max = exports.INSPECT_MAX_BYTES\n  if (this.length > 0) {\n    str = this.toString('hex', 0, max).match(/.{2}/g).join(' ')\n    if (this.length > max) str += ' ... '\n  }\n  return '<Buffer ' + str + '>'\n}\n\nBuffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) {\n  if (!Buffer.isBuffer(target)) {\n    throw new TypeError('Argument must be a Buffer')\n  }\n\n  if (start === undefined) {\n    start = 0\n  }\n  if (end === undefined) {\n    end = target ? target.length : 0\n  }\n  if (thisStart === undefined) {\n    thisStart = 0\n  }\n  if (thisEnd === undefined) {\n    thisEnd = this.length\n  }\n\n  if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) {\n    throw new RangeError('out of range index')\n  }\n\n  if (thisStart >= thisEnd && start >= end) {\n    return 0\n  }\n  if (thisStart >= thisEnd) {\n    return -1\n  }\n  if (start >= end) {\n    return 1\n  }\n\n  start >>>= 0\n  end >>>= 0\n  thisStart >>>= 0\n  thisEnd >>>= 0\n\n  if (this === target) return 0\n\n  var x = thisEnd - thisStart\n  var y = end - start\n  var len = Math.min(x, y)\n\n  var thisCopy = this.slice(thisStart, thisEnd)\n  var targetCopy = target.slice(start, end)\n\n  for (var i = 0; i < len; ++i) {\n    if (thisCopy[i] !== targetCopy[i]) {\n      x = thisCopy[i]\n      y = targetCopy[i]\n      break\n    }\n  }\n\n  if (x < y) return -1\n  if (y < x) return 1\n  return 0\n}\n\n// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`,\n// OR the last index of `val` in `buffer` at offset <= `byteOffset`.\n//\n// Arguments:\n// - buffer - a Buffer to search\n// - val - a string, Buffer, or number\n// - byteOffset - an index into `buffer`; will be clamped to an int32\n// - encoding - an optional encoding, relevant is val is a string\n// - dir - true for indexOf, false for lastIndexOf\nfunction bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) {\n  // Empty buffer means no match\n  if (buffer.length === 0) return -1\n\n  // Normalize byteOffset\n  if (typeof byteOffset === 'string') {\n    encoding = byteOffset\n    byteOffset = 0\n  } else if (byteOffset > 0x7fffffff) {\n    byteOffset = 0x7fffffff\n  } else if (byteOffset < -0x80000000) {\n    byteOffset = -0x80000000\n  }\n  byteOffset = +byteOffset  // Coerce to Number.\n  if (isNaN(byteOffset)) {\n    // byteOffset: it it's undefined, null, NaN, \"foo\", etc, search whole buffer\n    byteOffset = dir ? 0 : (buffer.length - 1)\n  }\n\n  // Normalize byteOffset: negative offsets start from the end of the buffer\n  if (byteOffset < 0) byteOffset = buffer.length + byteOffset\n  if (byteOffset >= buffer.length) {\n    if (dir) return -1\n    else byteOffset = buffer.length - 1\n  } else if (byteOffset < 0) {\n    if (dir) byteOffset = 0\n    else return -1\n  }\n\n  // Normalize val\n  if (typeof val === 'string') {\n    val = Buffer.from(val, encoding)\n  }\n\n  // Finally, search either indexOf (if dir is true) or lastIndexOf\n  if (Buffer.isBuffer(val)) {\n    // Special case: looking for empty string/buffer always fails\n    if (val.length === 0) {\n      return -1\n    }\n    return arrayIndexOf(buffer, val, byteOffset, encoding, dir)\n  } else if (typeof val === 'number') {\n    val = val & 0xFF // Search for a byte value [0-255]\n    if (Buffer.TYPED_ARRAY_SUPPORT &&\n        typeof Uint8Array.prototype.indexOf === 'function') {\n      if (dir) {\n        return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset)\n      } else {\n        return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset)\n      }\n    }\n    return arrayIndexOf(buffer, [ val ], byteOffset, encoding, dir)\n  }\n\n  throw new TypeError('val must be string, number or Buffer')\n}\n\nfunction arrayIndexOf (arr, val, byteOffset, encoding, dir) {\n  var indexSize = 1\n  var arrLength = arr.length\n  var valLength = val.length\n\n  if (encoding !== undefined) {\n    encoding = String(encoding).toLowerCase()\n    if (encoding === 'ucs2' || encoding === 'ucs-2' ||\n        encoding === 'utf16le' || encoding === 'utf-16le') {\n      if (arr.length < 2 || val.length < 2) {\n        return -1\n      }\n      indexSize = 2\n      arrLength /= 2\n      valLength /= 2\n      byteOffset /= 2\n    }\n  }\n\n  function read (buf, i) {\n    if (indexSize === 1) {\n      return buf[i]\n    } else {\n      return buf.readUInt16BE(i * indexSize)\n    }\n  }\n\n  var i\n  if (dir) {\n    var foundIndex = -1\n    for (i = byteOffset; i < arrLength; i++) {\n      if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) {\n        if (foundIndex === -1) foundIndex = i\n        if (i - foundIndex + 1 === valLength) return foundIndex * indexSize\n      } else {\n        if (foundIndex !== -1) i -= i - foundIndex\n        foundIndex = -1\n      }\n    }\n  } else {\n    if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength\n    for (i = byteOffset; i >= 0; i--) {\n      var found = true\n      for (var j = 0; j < valLength; j++) {\n        if (read(arr, i + j) !== read(val, j)) {\n          found = false\n          break\n        }\n      }\n      if (found) return i\n    }\n  }\n\n  return -1\n}\n\nBuffer.prototype.includes = function includes (val, byteOffset, encoding) {\n  return this.indexOf(val, byteOffset, encoding) !== -1\n}\n\nBuffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) {\n  return bidirectionalIndexOf(this, val, byteOffset, encoding, true)\n}\n\nBuffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) {\n  return bidirectionalIndexOf(this, val, byteOffset, encoding, false)\n}\n\nfunction hexWrite (buf, string, offset, length) {\n  offset = Number(offset) || 0\n  var remaining = buf.length - offset\n  if (!length) {\n    length = remaining\n  } else {\n    length = Number(length)\n    if (length > remaining) {\n      length = remaining\n    }\n  }\n\n  // must be an even number of digits\n  var strLen = string.length\n  if (strLen % 2 !== 0) throw new TypeError('Invalid hex string')\n\n  if (length > strLen / 2) {\n    length = strLen / 2\n  }\n  for (var i = 0; i < length; ++i) {\n    var parsed = parseInt(string.substr(i * 2, 2), 16)\n    if (isNaN(parsed)) return i\n    buf[offset + i] = parsed\n  }\n  return i\n}\n\nfunction utf8Write (buf, string, offset, length) {\n  return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nfunction asciiWrite (buf, string, offset, length) {\n  return blitBuffer(asciiToBytes(string), buf, offset, length)\n}\n\nfunction latin1Write (buf, string, offset, length) {\n  return asciiWrite(buf, string, offset, length)\n}\n\nfunction base64Write (buf, string, offset, length) {\n  return blitBuffer(base64ToBytes(string), buf, offset, length)\n}\n\nfunction ucs2Write (buf, string, offset, length) {\n  return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nBuffer.prototype.write = function write (string, offset, length, encoding) {\n  // Buffer#write(string)\n  if (offset === undefined) {\n    encoding = 'utf8'\n    length = this.length\n    offset = 0\n  // Buffer#write(string, encoding)\n  } else if (length === undefined && typeof offset === 'string') {\n    encoding = offset\n    length = this.length\n    offset = 0\n  // Buffer#write(string, offset[, length][, encoding])\n  } else if (isFinite(offset)) {\n    offset = offset | 0\n    if (isFinite(length)) {\n      length = length | 0\n      if (encoding === undefined) encoding = 'utf8'\n    } else {\n      encoding = length\n      length = undefined\n    }\n  // legacy write(string, encoding, offset, length) - remove in v0.13\n  } else {\n    throw new Error(\n      'Buffer.write(string, encoding, offset[, length]) is no longer supported'\n    )\n  }\n\n  var remaining = this.length - offset\n  if (length === undefined || length > remaining) length = remaining\n\n  if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) {\n    throw new RangeError('Attempt to write outside buffer bounds')\n  }\n\n  if (!encoding) encoding = 'utf8'\n\n  var loweredCase = false\n  for (;;) {\n    switch (encoding) {\n      case 'hex':\n        return hexWrite(this, string, offset, length)\n\n      case 'utf8':\n      case 'utf-8':\n        return utf8Write(this, string, offset, length)\n\n      case 'ascii':\n        return asciiWrite(this, string, offset, length)\n\n      case 'latin1':\n      case 'binary':\n        return latin1Write(this, string, offset, length)\n\n      case 'base64':\n        // Warning: maxLength not taken into account in base64Write\n        return base64Write(this, string, offset, length)\n\n      case 'ucs2':\n      case 'ucs-2':\n      case 'utf16le':\n      case 'utf-16le':\n        return ucs2Write(this, string, offset, length)\n\n      default:\n        if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n        encoding = ('' + encoding).toLowerCase()\n        loweredCase = true\n    }\n  }\n}\n\nBuffer.prototype.toJSON = function toJSON () {\n  return {\n    type: 'Buffer',\n    data: Array.prototype.slice.call(this._arr || this, 0)\n  }\n}\n\nfunction base64Slice (buf, start, end) {\n  if (start === 0 && end === buf.length) {\n    return base64.fromByteArray(buf)\n  } else {\n    return base64.fromByteArray(buf.slice(start, end))\n  }\n}\n\nfunction utf8Slice (buf, start, end) {\n  end = Math.min(buf.length, end)\n  var res = []\n\n  var i = start\n  while (i < end) {\n    var firstByte = buf[i]\n    var codePoint = null\n    var bytesPerSequence = (firstByte > 0xEF) ? 4\n      : (firstByte > 0xDF) ? 3\n      : (firstByte > 0xBF) ? 2\n      : 1\n\n    if (i + bytesPerSequence <= end) {\n      var secondByte, thirdByte, fourthByte, tempCodePoint\n\n      switch (bytesPerSequence) {\n        case 1:\n          if (firstByte < 0x80) {\n            codePoint = firstByte\n          }\n          break\n        case 2:\n          secondByte = buf[i + 1]\n          if ((secondByte & 0xC0) === 0x80) {\n            tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F)\n            if (tempCodePoint > 0x7F) {\n              codePoint = tempCodePoint\n            }\n          }\n          break\n        case 3:\n          secondByte = buf[i + 1]\n          thirdByte = buf[i + 2]\n          if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {\n            tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F)\n            if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {\n              codePoint = tempCodePoint\n            }\n          }\n          break\n        case 4:\n          secondByte = buf[i + 1]\n          thirdByte = buf[i + 2]\n          fourthByte = buf[i + 3]\n          if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {\n            tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F)\n            if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {\n              codePoint = tempCodePoint\n            }\n          }\n      }\n    }\n\n    if (codePoint === null) {\n      // we did not generate a valid codePoint so insert a\n      // replacement char (U+FFFD) and advance only 1 byte\n      codePoint = 0xFFFD\n      bytesPerSequence = 1\n    } else if (codePoint > 0xFFFF) {\n      // encode to utf16 (surrogate pair dance)\n      codePoint -= 0x10000\n      res.push(codePoint >>> 10 & 0x3FF | 0xD800)\n      codePoint = 0xDC00 | codePoint & 0x3FF\n    }\n\n    res.push(codePoint)\n    i += bytesPerSequence\n  }\n\n  return decodeCodePointsArray(res)\n}\n\n// Based on http://stackoverflow.com/a/22747272/680742, the browser with\n// the lowest limit is Chrome, with 0x10000 args.\n// We go 1 magnitude less, for safety\nvar MAX_ARGUMENTS_LENGTH = 0x1000\n\nfunction decodeCodePointsArray (codePoints) {\n  var len = codePoints.length\n  if (len <= MAX_ARGUMENTS_LENGTH) {\n    return String.fromCharCode.apply(String, codePoints) // avoid extra slice()\n  }\n\n  // Decode in chunks to avoid \"call stack size exceeded\".\n  var res = ''\n  var i = 0\n  while (i < len) {\n    res += String.fromCharCode.apply(\n      String,\n      codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)\n    )\n  }\n  return res\n}\n\nfunction asciiSlice (buf, start, end) {\n  var ret = ''\n  end = Math.min(buf.length, end)\n\n  for (var i = start; i < end; ++i) {\n    ret += String.fromCharCode(buf[i] & 0x7F)\n  }\n  return ret\n}\n\nfunction latin1Slice (buf, start, end) {\n  var ret = ''\n  end = Math.min(buf.length, end)\n\n  for (var i = start; i < end; ++i) {\n    ret += String.fromCharCode(buf[i])\n  }\n  return ret\n}\n\nfunction hexSlice (buf, start, end) {\n  var len = buf.length\n\n  if (!start || start < 0) start = 0\n  if (!end || end < 0 || end > len) end = len\n\n  var out = ''\n  for (var i = start; i < end; ++i) {\n    out += toHex(buf[i])\n  }\n  return out\n}\n\nfunction utf16leSlice (buf, start, end) {\n  var bytes = buf.slice(start, end)\n  var res = ''\n  for (var i = 0; i < bytes.length; i += 2) {\n    res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256)\n  }\n  return res\n}\n\nBuffer.prototype.slice = function slice (start, end) {\n  var len = this.length\n  start = ~~start\n  end = end === undefined ? len : ~~end\n\n  if (start < 0) {\n    start += len\n    if (start < 0) start = 0\n  } else if (start > len) {\n    start = len\n  }\n\n  if (end < 0) {\n    end += len\n    if (end < 0) end = 0\n  } else if (end > len) {\n    end = len\n  }\n\n  if (end < start) end = start\n\n  var newBuf\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    newBuf = this.subarray(start, end)\n    newBuf.__proto__ = Buffer.prototype\n  } else {\n    var sliceLen = end - start\n    newBuf = new Buffer(sliceLen, undefined)\n    for (var i = 0; i < sliceLen; ++i) {\n      newBuf[i] = this[i + start]\n    }\n  }\n\n  return newBuf\n}\n\n/*\n * Need to make sure that buffer isn't trying to write out of bounds.\n */\nfunction checkOffset (offset, ext, length) {\n  if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint')\n  if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length')\n}\n\nBuffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) {\n  offset = offset | 0\n  byteLength = byteLength | 0\n  if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n  var val = this[offset]\n  var mul = 1\n  var i = 0\n  while (++i < byteLength && (mul *= 0x100)) {\n    val += this[offset + i] * mul\n  }\n\n  return val\n}\n\nBuffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) {\n  offset = offset | 0\n  byteLength = byteLength | 0\n  if (!noAssert) {\n    checkOffset(offset, byteLength, this.length)\n  }\n\n  var val = this[offset + --byteLength]\n  var mul = 1\n  while (byteLength > 0 && (mul *= 0x100)) {\n    val += this[offset + --byteLength] * mul\n  }\n\n  return val\n}\n\nBuffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 1, this.length)\n  return this[offset]\n}\n\nBuffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 2, this.length)\n  return this[offset] | (this[offset + 1] << 8)\n}\n\nBuffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 2, this.length)\n  return (this[offset] << 8) | this[offset + 1]\n}\n\nBuffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 4, this.length)\n\n  return ((this[offset]) |\n      (this[offset + 1] << 8) |\n      (this[offset + 2] << 16)) +\n      (this[offset + 3] * 0x1000000)\n}\n\nBuffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 4, this.length)\n\n  return (this[offset] * 0x1000000) +\n    ((this[offset + 1] << 16) |\n    (this[offset + 2] << 8) |\n    this[offset + 3])\n}\n\nBuffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {\n  offset = offset | 0\n  byteLength = byteLength | 0\n  if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n  var val = this[offset]\n  var mul = 1\n  var i = 0\n  while (++i < byteLength && (mul *= 0x100)) {\n    val += this[offset + i] * mul\n  }\n  mul *= 0x80\n\n  if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n  return val\n}\n\nBuffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {\n  offset = offset | 0\n  byteLength = byteLength | 0\n  if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n  var i = byteLength\n  var mul = 1\n  var val = this[offset + --i]\n  while (i > 0 && (mul *= 0x100)) {\n    val += this[offset + --i] * mul\n  }\n  mul *= 0x80\n\n  if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n  return val\n}\n\nBuffer.prototype.readInt8 = function readInt8 (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 1, this.length)\n  if (!(this[offset] & 0x80)) return (this[offset])\n  return ((0xff - this[offset] + 1) * -1)\n}\n\nBuffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 2, this.length)\n  var val = this[offset] | (this[offset + 1] << 8)\n  return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 2, this.length)\n  var val = this[offset + 1] | (this[offset] << 8)\n  return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 4, this.length)\n\n  return (this[offset]) |\n    (this[offset + 1] << 8) |\n    (this[offset + 2] << 16) |\n    (this[offset + 3] << 24)\n}\n\nBuffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 4, this.length)\n\n  return (this[offset] << 24) |\n    (this[offset + 1] << 16) |\n    (this[offset + 2] << 8) |\n    (this[offset + 3])\n}\n\nBuffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 4, this.length)\n  return ieee754.read(this, offset, true, 23, 4)\n}\n\nBuffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 4, this.length)\n  return ieee754.read(this, offset, false, 23, 4)\n}\n\nBuffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 8, this.length)\n  return ieee754.read(this, offset, true, 52, 8)\n}\n\nBuffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 8, this.length)\n  return ieee754.read(this, offset, false, 52, 8)\n}\n\nfunction checkInt (buf, value, offset, ext, max, min) {\n  if (!Buffer.isBuffer(buf)) throw new TypeError('\"buffer\" argument must be a Buffer instance')\n  if (value > max || value < min) throw new RangeError('\"value\" argument is out of bounds')\n  if (offset + ext > buf.length) throw new RangeError('Index out of range')\n}\n\nBuffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {\n  value = +value\n  offset = offset | 0\n  byteLength = byteLength | 0\n  if (!noAssert) {\n    var maxBytes = Math.pow(2, 8 * byteLength) - 1\n    checkInt(this, value, offset, byteLength, maxBytes, 0)\n  }\n\n  var mul = 1\n  var i = 0\n  this[offset] = value & 0xFF\n  while (++i < byteLength && (mul *= 0x100)) {\n    this[offset + i] = (value / mul) & 0xFF\n  }\n\n  return offset + byteLength\n}\n\nBuffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {\n  value = +value\n  offset = offset | 0\n  byteLength = byteLength | 0\n  if (!noAssert) {\n    var maxBytes = Math.pow(2, 8 * byteLength) - 1\n    checkInt(this, value, offset, byteLength, maxBytes, 0)\n  }\n\n  var i = byteLength - 1\n  var mul = 1\n  this[offset + i] = value & 0xFF\n  while (--i >= 0 && (mul *= 0x100)) {\n    this[offset + i] = (value / mul) & 0xFF\n  }\n\n  return offset + byteLength\n}\n\nBuffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0)\n  if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)\n  this[offset] = (value & 0xff)\n  return offset + 1\n}\n\nfunction objectWriteUInt16 (buf, value, offset, littleEndian) {\n  if (value < 0) value = 0xffff + value + 1\n  for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; ++i) {\n    buf[offset + i] = (value & (0xff << (8 * (littleEndian ? i : 1 - i)))) >>>\n      (littleEndian ? i : 1 - i) * 8\n  }\n}\n\nBuffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = (value & 0xff)\n    this[offset + 1] = (value >>> 8)\n  } else {\n    objectWriteUInt16(this, value, offset, true)\n  }\n  return offset + 2\n}\n\nBuffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = (value >>> 8)\n    this[offset + 1] = (value & 0xff)\n  } else {\n    objectWriteUInt16(this, value, offset, false)\n  }\n  return offset + 2\n}\n\nfunction objectWriteUInt32 (buf, value, offset, littleEndian) {\n  if (value < 0) value = 0xffffffff + value + 1\n  for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; ++i) {\n    buf[offset + i] = (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff\n  }\n}\n\nBuffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset + 3] = (value >>> 24)\n    this[offset + 2] = (value >>> 16)\n    this[offset + 1] = (value >>> 8)\n    this[offset] = (value & 0xff)\n  } else {\n    objectWriteUInt32(this, value, offset, true)\n  }\n  return offset + 4\n}\n\nBuffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = (value >>> 24)\n    this[offset + 1] = (value >>> 16)\n    this[offset + 2] = (value >>> 8)\n    this[offset + 3] = (value & 0xff)\n  } else {\n    objectWriteUInt32(this, value, offset, false)\n  }\n  return offset + 4\n}\n\nBuffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) {\n    var limit = Math.pow(2, 8 * byteLength - 1)\n\n    checkInt(this, value, offset, byteLength, limit - 1, -limit)\n  }\n\n  var i = 0\n  var mul = 1\n  var sub = 0\n  this[offset] = value & 0xFF\n  while (++i < byteLength && (mul *= 0x100)) {\n    if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) {\n      sub = 1\n    }\n    this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n  }\n\n  return offset + byteLength\n}\n\nBuffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) {\n    var limit = Math.pow(2, 8 * byteLength - 1)\n\n    checkInt(this, value, offset, byteLength, limit - 1, -limit)\n  }\n\n  var i = byteLength - 1\n  var mul = 1\n  var sub = 0\n  this[offset + i] = value & 0xFF\n  while (--i >= 0 && (mul *= 0x100)) {\n    if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) {\n      sub = 1\n    }\n    this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n  }\n\n  return offset + byteLength\n}\n\nBuffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80)\n  if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)\n  if (value < 0) value = 0xff + value + 1\n  this[offset] = (value & 0xff)\n  return offset + 1\n}\n\nBuffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = (value & 0xff)\n    this[offset + 1] = (value >>> 8)\n  } else {\n    objectWriteUInt16(this, value, offset, true)\n  }\n  return offset + 2\n}\n\nBuffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = (value >>> 8)\n    this[offset + 1] = (value & 0xff)\n  } else {\n    objectWriteUInt16(this, value, offset, false)\n  }\n  return offset + 2\n}\n\nBuffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = (value & 0xff)\n    this[offset + 1] = (value >>> 8)\n    this[offset + 2] = (value >>> 16)\n    this[offset + 3] = (value >>> 24)\n  } else {\n    objectWriteUInt32(this, value, offset, true)\n  }\n  return offset + 4\n}\n\nBuffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n  if (value < 0) value = 0xffffffff + value + 1\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = (value >>> 24)\n    this[offset + 1] = (value >>> 16)\n    this[offset + 2] = (value >>> 8)\n    this[offset + 3] = (value & 0xff)\n  } else {\n    objectWriteUInt32(this, value, offset, false)\n  }\n  return offset + 4\n}\n\nfunction checkIEEE754 (buf, value, offset, ext, max, min) {\n  if (offset + ext > buf.length) throw new RangeError('Index out of range')\n  if (offset < 0) throw new RangeError('Index out of range')\n}\n\nfunction writeFloat (buf, value, offset, littleEndian, noAssert) {\n  if (!noAssert) {\n    checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38)\n  }\n  ieee754.write(buf, value, offset, littleEndian, 23, 4)\n  return offset + 4\n}\n\nBuffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) {\n  return writeFloat(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) {\n  return writeFloat(this, value, offset, false, noAssert)\n}\n\nfunction writeDouble (buf, value, offset, littleEndian, noAssert) {\n  if (!noAssert) {\n    checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308)\n  }\n  ieee754.write(buf, value, offset, littleEndian, 52, 8)\n  return offset + 8\n}\n\nBuffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) {\n  return writeDouble(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) {\n  return writeDouble(this, value, offset, false, noAssert)\n}\n\n// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)\nBuffer.prototype.copy = function copy (target, targetStart, start, end) {\n  if (!start) start = 0\n  if (!end && end !== 0) end = this.length\n  if (targetStart >= target.length) targetStart = target.length\n  if (!targetStart) targetStart = 0\n  if (end > 0 && end < start) end = start\n\n  // Copy 0 bytes; we're done\n  if (end === start) return 0\n  if (target.length === 0 || this.length === 0) return 0\n\n  // Fatal error conditions\n  if (targetStart < 0) {\n    throw new RangeError('targetStart out of bounds')\n  }\n  if (start < 0 || start >= this.length) throw new RangeError('sourceStart out of bounds')\n  if (end < 0) throw new RangeError('sourceEnd out of bounds')\n\n  // Are we oob?\n  if (end > this.length) end = this.length\n  if (target.length - targetStart < end - start) {\n    end = target.length - targetStart + start\n  }\n\n  var len = end - start\n  var i\n\n  if (this === target && start < targetStart && targetStart < end) {\n    // descending copy from end\n    for (i = len - 1; i >= 0; --i) {\n      target[i + targetStart] = this[i + start]\n    }\n  } else if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) {\n    // ascending copy from start\n    for (i = 0; i < len; ++i) {\n      target[i + targetStart] = this[i + start]\n    }\n  } else {\n    Uint8Array.prototype.set.call(\n      target,\n      this.subarray(start, start + len),\n      targetStart\n    )\n  }\n\n  return len\n}\n\n// Usage:\n//    buffer.fill(number[, offset[, end]])\n//    buffer.fill(buffer[, offset[, end]])\n//    buffer.fill(string[, offset[, end]][, encoding])\nBuffer.prototype.fill = function fill (val, start, end, encoding) {\n  // Handle string cases:\n  if (typeof val === 'string') {\n    if (typeof start === 'string') {\n      encoding = start\n      start = 0\n      end = this.length\n    } else if (typeof end === 'string') {\n      encoding = end\n      end = this.length\n    }\n    if (val.length === 1) {\n      var code = val.charCodeAt(0)\n      if (code < 256) {\n        val = code\n      }\n    }\n    if (encoding !== undefined && typeof encoding !== 'string') {\n      throw new TypeError('encoding must be a string')\n    }\n    if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) {\n      throw new TypeError('Unknown encoding: ' + encoding)\n    }\n  } else if (typeof val === 'number') {\n    val = val & 255\n  }\n\n  // Invalid ranges are not set to a default, so can range check early.\n  if (start < 0 || this.length < start || this.length < end) {\n    throw new RangeError('Out of range index')\n  }\n\n  if (end <= start) {\n    return this\n  }\n\n  start = start >>> 0\n  end = end === undefined ? this.length : end >>> 0\n\n  if (!val) val = 0\n\n  var i\n  if (typeof val === 'number') {\n    for (i = start; i < end; ++i) {\n      this[i] = val\n    }\n  } else {\n    var bytes = Buffer.isBuffer(val)\n      ? val\n      : utf8ToBytes(new Buffer(val, encoding).toString())\n    var len = bytes.length\n    for (i = 0; i < end - start; ++i) {\n      this[i + start] = bytes[i % len]\n    }\n  }\n\n  return this\n}\n\n// HELPER FUNCTIONS\n// ================\n\nvar INVALID_BASE64_RE = /[^+\\/0-9A-Za-z-_]/g\n\nfunction base64clean (str) {\n  // Node strips out invalid characters like \\n and \\t from the string, base64-js does not\n  str = stringtrim(str).replace(INVALID_BASE64_RE, '')\n  // Node converts strings with length < 2 to ''\n  if (str.length < 2) return ''\n  // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not\n  while (str.length % 4 !== 0) {\n    str = str + '='\n  }\n  return str\n}\n\nfunction stringtrim (str) {\n  if (str.trim) return str.trim()\n  return str.replace(/^\\s+|\\s+$/g, '')\n}\n\nfunction toHex (n) {\n  if (n < 16) return '0' + n.toString(16)\n  return n.toString(16)\n}\n\nfunction utf8ToBytes (string, units) {\n  units = units || Infinity\n  var codePoint\n  var length = string.length\n  var leadSurrogate = null\n  var bytes = []\n\n  for (var i = 0; i < length; ++i) {\n    codePoint = string.charCodeAt(i)\n\n    // is surrogate component\n    if (codePoint > 0xD7FF && codePoint < 0xE000) {\n      // last char was a lead\n      if (!leadSurrogate) {\n        // no lead yet\n        if (codePoint > 0xDBFF) {\n          // unexpected trail\n          if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n          continue\n        } else if (i + 1 === length) {\n          // unpaired lead\n          if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n          continue\n        }\n\n        // valid lead\n        leadSurrogate = codePoint\n\n        continue\n      }\n\n      // 2 leads in a row\n      if (codePoint < 0xDC00) {\n        if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n        leadSurrogate = codePoint\n        continue\n      }\n\n      // valid surrogate pair\n      codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000\n    } else if (leadSurrogate) {\n      // valid bmp char, but last char was a lead\n      if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n    }\n\n    leadSurrogate = null\n\n    // encode utf8\n    if (codePoint < 0x80) {\n      if ((units -= 1) < 0) break\n      bytes.push(codePoint)\n    } else if (codePoint < 0x800) {\n      if ((units -= 2) < 0) break\n      bytes.push(\n        codePoint >> 0x6 | 0xC0,\n        codePoint & 0x3F | 0x80\n      )\n    } else if (codePoint < 0x10000) {\n      if ((units -= 3) < 0) break\n      bytes.push(\n        codePoint >> 0xC | 0xE0,\n        codePoint >> 0x6 & 0x3F | 0x80,\n        codePoint & 0x3F | 0x80\n      )\n    } else if (codePoint < 0x110000) {\n      if ((units -= 4) < 0) break\n      bytes.push(\n        codePoint >> 0x12 | 0xF0,\n        codePoint >> 0xC & 0x3F | 0x80,\n        codePoint >> 0x6 & 0x3F | 0x80,\n        codePoint & 0x3F | 0x80\n      )\n    } else {\n      throw new Error('Invalid code point')\n    }\n  }\n\n  return bytes\n}\n\nfunction asciiToBytes (str) {\n  var byteArray = []\n  for (var i = 0; i < str.length; ++i) {\n    // Node's code seems to be doing this and not & 0x7F..\n    byteArray.push(str.charCodeAt(i) & 0xFF)\n  }\n  return byteArray\n}\n\nfunction utf16leToBytes (str, units) {\n  var c, hi, lo\n  var byteArray = []\n  for (var i = 0; i < str.length; ++i) {\n    if ((units -= 2) < 0) break\n\n    c = str.charCodeAt(i)\n    hi = c >> 8\n    lo = c % 256\n    byteArray.push(lo)\n    byteArray.push(hi)\n  }\n\n  return byteArray\n}\n\nfunction base64ToBytes (str) {\n  return base64.toByteArray(base64clean(str))\n}\n\nfunction blitBuffer (src, dst, offset, length) {\n  for (var i = 0; i < length; ++i) {\n    if ((i + offset >= dst.length) || (i >= src.length)) break\n    dst[i + offset] = src[i]\n  }\n  return i\n}\n\nfunction isnan (val) {\n  return val !== val // eslint-disable-line no-self-compare\n}\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(21)))//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzAuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYnVmZmVyL2luZGV4LmpzP2I2MzkiXSwic291cmNlc0NvbnRlbnQiOlsiLyohXG4gKiBUaGUgYnVmZmVyIG1vZHVsZSBmcm9tIG5vZGUuanMsIGZvciB0aGUgYnJvd3Nlci5cbiAqXG4gKiBAYXV0aG9yICAgRmVyb3NzIEFib3VraGFkaWplaCA8aHR0cDovL2Zlcm9zcy5vcmc+XG4gKiBAbGljZW5zZSAgTUlUXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG5vLXByb3RvICovXG5cbid1c2Ugc3RyaWN0J1xuXG52YXIgYmFzZTY0ID0gcmVxdWlyZSgnYmFzZTY0LWpzJylcbnZhciBpZWVlNzU0ID0gcmVxdWlyZSgnaWVlZTc1NCcpXG52YXIgaXNBcnJheSA9IHJlcXVpcmUoJ2lzYXJyYXknKVxuXG5leHBvcnRzLkJ1ZmZlciA9IEJ1ZmZlclxuZXhwb3J0cy5TbG93QnVmZmVyID0gU2xvd0J1ZmZlclxuZXhwb3J0cy5JTlNQRUNUX01BWF9CWVRFUyA9IDUwXG5cbi8qKlxuICogSWYgYEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUYDpcbiAqICAgPT09IHRydWUgICAgVXNlIFVpbnQ4QXJyYXkgaW1wbGVtZW50YXRpb24gKGZhc3Rlc3QpXG4gKiAgID09PSBmYWxzZSAgIFVzZSBPYmplY3QgaW1wbGVtZW50YXRpb24gKG1vc3QgY29tcGF0aWJsZSwgZXZlbiBJRTYpXG4gKlxuICogQnJvd3NlcnMgdGhhdCBzdXBwb3J0IHR5cGVkIGFycmF5cyBhcmUgSUUgMTArLCBGaXJlZm94IDQrLCBDaHJvbWUgNyssIFNhZmFyaSA1LjErLFxuICogT3BlcmEgMTEuNissIGlPUyA0LjIrLlxuICpcbiAqIER1ZSB0byB2YXJpb3VzIGJyb3dzZXIgYnVncywgc29tZXRpbWVzIHRoZSBPYmplY3QgaW1wbGVtZW50YXRpb24gd2lsbCBiZSB1c2VkIGV2ZW5cbiAqIHdoZW4gdGhlIGJyb3dzZXIgc3VwcG9ydHMgdHlwZWQgYXJyYXlzLlxuICpcbiAqIE5vdGU6XG4gKlxuICogICAtIEZpcmVmb3ggNC0yOSBsYWNrcyBzdXBwb3J0IGZvciBhZGRpbmcgbmV3IHByb3BlcnRpZXMgdG8gYFVpbnQ4QXJyYXlgIGluc3RhbmNlcyxcbiAqICAgICBTZWU6IGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTY5NTQzOC5cbiAqXG4gKiAgIC0gQ2hyb21lIDktMTAgaXMgbWlzc2luZyB0aGUgYFR5cGVkQXJyYXkucHJvdG90eXBlLnN1YmFycmF5YCBmdW5jdGlvbi5cbiAqXG4gKiAgIC0gSUUxMCBoYXMgYSBicm9rZW4gYFR5cGVkQXJyYXkucHJvdG90eXBlLnN1YmFycmF5YCBmdW5jdGlvbiB3aGljaCByZXR1cm5zIGFycmF5cyBvZlxuICogICAgIGluY29ycmVjdCBsZW5ndGggaW4gc29tZSBzaXR1YXRpb25zLlxuXG4gKiBXZSBkZXRlY3QgdGhlc2UgYnVnZ3kgYnJvd3NlcnMgYW5kIHNldCBgQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlRgIHRvIGBmYWxzZWAgc28gdGhleVxuICogZ2V0IHRoZSBPYmplY3QgaW1wbGVtZW50YXRpb24sIHdoaWNoIGlzIHNsb3dlciBidXQgYmVoYXZlcyBjb3JyZWN0bHkuXG4gKi9cbkJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUID0gZ2xvYmFsLlRZUEVEX0FSUkFZX1NVUFBPUlQgIT09IHVuZGVmaW5lZFxuICA/IGdsb2JhbC5UWVBFRF9BUlJBWV9TVVBQT1JUXG4gIDogdHlwZWRBcnJheVN1cHBvcnQoKVxuXG4vKlxuICogRXhwb3J0IGtNYXhMZW5ndGggYWZ0ZXIgdHlwZWQgYXJyYXkgc3VwcG9ydCBpcyBkZXRlcm1pbmVkLlxuICovXG5leHBvcnRzLmtNYXhMZW5ndGggPSBrTWF4TGVuZ3RoKClcblxuZnVuY3Rpb24gdHlwZWRBcnJheVN1cHBvcnQgKCkge1xuICB0cnkge1xuICAgIHZhciBhcnIgPSBuZXcgVWludDhBcnJheSgxKVxuICAgIGFyci5fX3Byb3RvX18gPSB7X19wcm90b19fOiBVaW50OEFycmF5LnByb3RvdHlwZSwgZm9vOiBmdW5jdGlvbiAoKSB7IHJldHVybiA0MiB9fVxuICAgIHJldHVybiBhcnIuZm9vKCkgPT09IDQyICYmIC8vIHR5cGVkIGFycmF5IGluc3RhbmNlcyBjYW4gYmUgYXVnbWVudGVkXG4gICAgICAgIHR5cGVvZiBhcnIuc3ViYXJyYXkgPT09ICdmdW5jdGlvbicgJiYgLy8gY2hyb21lIDktMTAgbGFjayBgc3ViYXJyYXlgXG4gICAgICAgIGFyci5zdWJhcnJheSgxLCAxKS5ieXRlTGVuZ3RoID09PSAwIC8vIGllMTAgaGFzIGJyb2tlbiBgc3ViYXJyYXlgXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG5mdW5jdGlvbiBrTWF4TGVuZ3RoICgpIHtcbiAgcmV0dXJuIEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUXG4gICAgPyAweDdmZmZmZmZmXG4gICAgOiAweDNmZmZmZmZmXG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUJ1ZmZlciAodGhhdCwgbGVuZ3RoKSB7XG4gIGlmIChrTWF4TGVuZ3RoKCkgPCBsZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW52YWxpZCB0eXBlZCBhcnJheSBsZW5ndGgnKVxuICB9XG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIC8vIFJldHVybiBhbiBhdWdtZW50ZWQgYFVpbnQ4QXJyYXlgIGluc3RhbmNlLCBmb3IgYmVzdCBwZXJmb3JtYW5jZVxuICAgIHRoYXQgPSBuZXcgVWludDhBcnJheShsZW5ndGgpXG4gICAgdGhhdC5fX3Byb3RvX18gPSBCdWZmZXIucHJvdG90eXBlXG4gIH0gZWxzZSB7XG4gICAgLy8gRmFsbGJhY2s6IFJldHVybiBhbiBvYmplY3QgaW5zdGFuY2Ugb2YgdGhlIEJ1ZmZlciBjbGFzc1xuICAgIGlmICh0aGF0ID09PSBudWxsKSB7XG4gICAgICB0aGF0ID0gbmV3IEJ1ZmZlcihsZW5ndGgpXG4gICAgfVxuICAgIHRoYXQubGVuZ3RoID0gbGVuZ3RoXG4gIH1cblxuICByZXR1cm4gdGhhdFxufVxuXG4vKipcbiAqIFRoZSBCdWZmZXIgY29uc3RydWN0b3IgcmV0dXJucyBpbnN0YW5jZXMgb2YgYFVpbnQ4QXJyYXlgIHRoYXQgaGF2ZSB0aGVpclxuICogcHJvdG90eXBlIGNoYW5nZWQgdG8gYEJ1ZmZlci5wcm90b3R5cGVgLiBGdXJ0aGVybW9yZSwgYEJ1ZmZlcmAgaXMgYSBzdWJjbGFzcyBvZlxuICogYFVpbnQ4QXJyYXlgLCBzbyB0aGUgcmV0dXJuZWQgaW5zdGFuY2VzIHdpbGwgaGF2ZSBhbGwgdGhlIG5vZGUgYEJ1ZmZlcmAgbWV0aG9kc1xuICogYW5kIHRoZSBgVWludDhBcnJheWAgbWV0aG9kcy4gU3F1YXJlIGJyYWNrZXQgbm90YXRpb24gd29ya3MgYXMgZXhwZWN0ZWQgLS0gaXRcbiAqIHJldHVybnMgYSBzaW5nbGUgb2N0ZXQuXG4gKlxuICogVGhlIGBVaW50OEFycmF5YCBwcm90b3R5cGUgcmVtYWlucyB1bm1vZGlmaWVkLlxuICovXG5cbmZ1bmN0aW9uIEJ1ZmZlciAoYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgaWYgKCFCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCAmJiAhKHRoaXMgaW5zdGFuY2VvZiBCdWZmZXIpKSB7XG4gICAgcmV0dXJuIG5ldyBCdWZmZXIoYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG4gIH1cblxuICAvLyBDb21tb24gY2FzZS5cbiAgaWYgKHR5cGVvZiBhcmcgPT09ICdudW1iZXInKSB7XG4gICAgaWYgKHR5cGVvZiBlbmNvZGluZ09yT2Zmc2V0ID09PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnSWYgZW5jb2RpbmcgaXMgc3BlY2lmaWVkIHRoZW4gdGhlIGZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmcnXG4gICAgICApXG4gICAgfVxuICAgIHJldHVybiBhbGxvY1Vuc2FmZSh0aGlzLCBhcmcpXG4gIH1cbiAgcmV0dXJuIGZyb20odGhpcywgYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG59XG5cbkJ1ZmZlci5wb29sU2l6ZSA9IDgxOTIgLy8gbm90IHVzZWQgYnkgdGhpcyBpbXBsZW1lbnRhdGlvblxuXG4vLyBUT0RPOiBMZWdhY3ksIG5vdCBuZWVkZWQgYW55bW9yZS4gUmVtb3ZlIGluIG5leHQgbWFqb3IgdmVyc2lvbi5cbkJ1ZmZlci5fYXVnbWVudCA9IGZ1bmN0aW9uIChhcnIpIHtcbiAgYXJyLl9fcHJvdG9fXyA9IEJ1ZmZlci5wcm90b3R5cGVcbiAgcmV0dXJuIGFyclxufVxuXG5mdW5jdGlvbiBmcm9tICh0aGF0LCB2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJ2YWx1ZVwiIGFyZ3VtZW50IG11c3Qgbm90IGJlIGEgbnVtYmVyJylcbiAgfVxuXG4gIGlmICh0eXBlb2YgQXJyYXlCdWZmZXIgIT09ICd1bmRlZmluZWQnICYmIHZhbHVlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHtcbiAgICByZXR1cm4gZnJvbUFycmF5QnVmZmVyKHRoYXQsIHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG4gIH1cblxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBmcm9tU3RyaW5nKHRoYXQsIHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0KVxuICB9XG5cbiAgcmV0dXJuIGZyb21PYmplY3QodGhhdCwgdmFsdWUpXG59XG5cbi8qKlxuICogRnVuY3Rpb25hbGx5IGVxdWl2YWxlbnQgdG8gQnVmZmVyKGFyZywgZW5jb2RpbmcpIGJ1dCB0aHJvd3MgYSBUeXBlRXJyb3JcbiAqIGlmIHZhbHVlIGlzIGEgbnVtYmVyLlxuICogQnVmZmVyLmZyb20oc3RyWywgZW5jb2RpbmddKVxuICogQnVmZmVyLmZyb20oYXJyYXkpXG4gKiBCdWZmZXIuZnJvbShidWZmZXIpXG4gKiBCdWZmZXIuZnJvbShhcnJheUJ1ZmZlclssIGJ5dGVPZmZzZXRbLCBsZW5ndGhdXSlcbiAqKi9cbkJ1ZmZlci5mcm9tID0gZnVuY3Rpb24gKHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGZyb20obnVsbCwgdmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbn1cblxuaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gIEJ1ZmZlci5wcm90b3R5cGUuX19wcm90b19fID0gVWludDhBcnJheS5wcm90b3R5cGVcbiAgQnVmZmVyLl9fcHJvdG9fXyA9IFVpbnQ4QXJyYXlcbiAgaWYgKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC5zcGVjaWVzICYmXG4gICAgICBCdWZmZXJbU3ltYm9sLnNwZWNpZXNdID09PSBCdWZmZXIpIHtcbiAgICAvLyBGaXggc3ViYXJyYXkoKSBpbiBFUzIwMTYuIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2Zlcm9zcy9idWZmZXIvcHVsbC85N1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShCdWZmZXIsIFN5bWJvbC5zcGVjaWVzLCB7XG4gICAgICB2YWx1ZTogbnVsbCxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pXG4gIH1cbn1cblxuZnVuY3Rpb24gYXNzZXJ0U2l6ZSAoc2l6ZSkge1xuICBpZiAodHlwZW9mIHNpemUgIT09ICdudW1iZXInKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJzaXplXCIgYXJndW1lbnQgbXVzdCBiZSBhIG51bWJlcicpXG4gIH0gZWxzZSBpZiAoc2l6ZSA8IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignXCJzaXplXCIgYXJndW1lbnQgbXVzdCBub3QgYmUgbmVnYXRpdmUnKVxuICB9XG59XG5cbmZ1bmN0aW9uIGFsbG9jICh0aGF0LCBzaXplLCBmaWxsLCBlbmNvZGluZykge1xuICBhc3NlcnRTaXplKHNpemUpXG4gIGlmIChzaXplIDw9IDApIHtcbiAgICByZXR1cm4gY3JlYXRlQnVmZmVyKHRoYXQsIHNpemUpXG4gIH1cbiAgaWYgKGZpbGwgIT09IHVuZGVmaW5lZCkge1xuICAgIC8vIE9ubHkgcGF5IGF0dGVudGlvbiB0byBlbmNvZGluZyBpZiBpdCdzIGEgc3RyaW5nLiBUaGlzXG4gICAgLy8gcHJldmVudHMgYWNjaWRlbnRhbGx5IHNlbmRpbmcgaW4gYSBudW1iZXIgdGhhdCB3b3VsZFxuICAgIC8vIGJlIGludGVycHJldHRlZCBhcyBhIHN0YXJ0IG9mZnNldC5cbiAgICByZXR1cm4gdHlwZW9mIGVuY29kaW5nID09PSAnc3RyaW5nJ1xuICAgICAgPyBjcmVhdGVCdWZmZXIodGhhdCwgc2l6ZSkuZmlsbChmaWxsLCBlbmNvZGluZylcbiAgICAgIDogY3JlYXRlQnVmZmVyKHRoYXQsIHNpemUpLmZpbGwoZmlsbClcbiAgfVxuICByZXR1cm4gY3JlYXRlQnVmZmVyKHRoYXQsIHNpemUpXG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBmaWxsZWQgQnVmZmVyIGluc3RhbmNlLlxuICogYWxsb2Moc2l6ZVssIGZpbGxbLCBlbmNvZGluZ11dKVxuICoqL1xuQnVmZmVyLmFsbG9jID0gZnVuY3Rpb24gKHNpemUsIGZpbGwsIGVuY29kaW5nKSB7XG4gIHJldHVybiBhbGxvYyhudWxsLCBzaXplLCBmaWxsLCBlbmNvZGluZylcbn1cblxuZnVuY3Rpb24gYWxsb2NVbnNhZmUgKHRoYXQsIHNpemUpIHtcbiAgYXNzZXJ0U2l6ZShzaXplKVxuICB0aGF0ID0gY3JlYXRlQnVmZmVyKHRoYXQsIHNpemUgPCAwID8gMCA6IGNoZWNrZWQoc2l6ZSkgfCAwKVxuICBpZiAoIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaXplOyArK2kpIHtcbiAgICAgIHRoYXRbaV0gPSAwXG4gICAgfVxuICB9XG4gIHJldHVybiB0aGF0XG59XG5cbi8qKlxuICogRXF1aXZhbGVudCB0byBCdWZmZXIobnVtKSwgYnkgZGVmYXVsdCBjcmVhdGVzIGEgbm9uLXplcm8tZmlsbGVkIEJ1ZmZlciBpbnN0YW5jZS5cbiAqICovXG5CdWZmZXIuYWxsb2NVbnNhZmUgPSBmdW5jdGlvbiAoc2l6ZSkge1xuICByZXR1cm4gYWxsb2NVbnNhZmUobnVsbCwgc2l6ZSlcbn1cbi8qKlxuICogRXF1aXZhbGVudCB0byBTbG93QnVmZmVyKG51bSksIGJ5IGRlZmF1bHQgY3JlYXRlcyBhIG5vbi16ZXJvLWZpbGxlZCBCdWZmZXIgaW5zdGFuY2UuXG4gKi9cbkJ1ZmZlci5hbGxvY1Vuc2FmZVNsb3cgPSBmdW5jdGlvbiAoc2l6ZSkge1xuICByZXR1cm4gYWxsb2NVbnNhZmUobnVsbCwgc2l6ZSlcbn1cblxuZnVuY3Rpb24gZnJvbVN0cmluZyAodGhhdCwgc3RyaW5nLCBlbmNvZGluZykge1xuICBpZiAodHlwZW9mIGVuY29kaW5nICE9PSAnc3RyaW5nJyB8fCBlbmNvZGluZyA9PT0gJycpIHtcbiAgICBlbmNvZGluZyA9ICd1dGY4J1xuICB9XG5cbiAgaWYgKCFCdWZmZXIuaXNFbmNvZGluZyhlbmNvZGluZykpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImVuY29kaW5nXCIgbXVzdCBiZSBhIHZhbGlkIHN0cmluZyBlbmNvZGluZycpXG4gIH1cblxuICB2YXIgbGVuZ3RoID0gYnl0ZUxlbmd0aChzdHJpbmcsIGVuY29kaW5nKSB8IDBcbiAgdGhhdCA9IGNyZWF0ZUJ1ZmZlcih0aGF0LCBsZW5ndGgpXG5cbiAgdmFyIGFjdHVhbCA9IHRoYXQud3JpdGUoc3RyaW5nLCBlbmNvZGluZylcblxuICBpZiAoYWN0dWFsICE9PSBsZW5ndGgpIHtcbiAgICAvLyBXcml0aW5nIGEgaGV4IHN0cmluZywgZm9yIGV4YW1wbGUsIHRoYXQgY29udGFpbnMgaW52YWxpZCBjaGFyYWN0ZXJzIHdpbGxcbiAgICAvLyBjYXVzZSBldmVyeXRoaW5nIGFmdGVyIHRoZSBmaXJzdCBpbnZhbGlkIGNoYXJhY3RlciB0byBiZSBpZ25vcmVkLiAoZS5nLlxuICAgIC8vICdhYnh4Y2QnIHdpbGwgYmUgdHJlYXRlZCBhcyAnYWInKVxuICAgIHRoYXQgPSB0aGF0LnNsaWNlKDAsIGFjdHVhbClcbiAgfVxuXG4gIHJldHVybiB0aGF0XG59XG5cbmZ1bmN0aW9uIGZyb21BcnJheUxpa2UgKHRoYXQsIGFycmF5KSB7XG4gIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGggPCAwID8gMCA6IGNoZWNrZWQoYXJyYXkubGVuZ3RoKSB8IDBcbiAgdGhhdCA9IGNyZWF0ZUJ1ZmZlcih0aGF0LCBsZW5ndGgpXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IDEpIHtcbiAgICB0aGF0W2ldID0gYXJyYXlbaV0gJiAyNTVcbiAgfVxuICByZXR1cm4gdGhhdFxufVxuXG5mdW5jdGlvbiBmcm9tQXJyYXlCdWZmZXIgKHRoYXQsIGFycmF5LCBieXRlT2Zmc2V0LCBsZW5ndGgpIHtcbiAgYXJyYXkuYnl0ZUxlbmd0aCAvLyB0aGlzIHRocm93cyBpZiBgYXJyYXlgIGlzIG5vdCBhIHZhbGlkIEFycmF5QnVmZmVyXG5cbiAgaWYgKGJ5dGVPZmZzZXQgPCAwIHx8IGFycmF5LmJ5dGVMZW5ndGggPCBieXRlT2Zmc2V0KSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1xcJ29mZnNldFxcJyBpcyBvdXQgb2YgYm91bmRzJylcbiAgfVxuXG4gIGlmIChhcnJheS5ieXRlTGVuZ3RoIDwgYnl0ZU9mZnNldCArIChsZW5ndGggfHwgMCkpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignXFwnbGVuZ3RoXFwnIGlzIG91dCBvZiBib3VuZHMnKVxuICB9XG5cbiAgaWYgKGJ5dGVPZmZzZXQgPT09IHVuZGVmaW5lZCAmJiBsZW5ndGggPT09IHVuZGVmaW5lZCkge1xuICAgIGFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXkpXG4gIH0gZWxzZSBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQpIHtcbiAgICBhcnJheSA9IG5ldyBVaW50OEFycmF5KGFycmF5LCBieXRlT2Zmc2V0KVxuICB9IGVsc2Uge1xuICAgIGFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXksIGJ5dGVPZmZzZXQsIGxlbmd0aClcbiAgfVxuXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIC8vIFJldHVybiBhbiBhdWdtZW50ZWQgYFVpbnQ4QXJyYXlgIGluc3RhbmNlLCBmb3IgYmVzdCBwZXJmb3JtYW5jZVxuICAgIHRoYXQgPSBhcnJheVxuICAgIHRoYXQuX19wcm90b19fID0gQnVmZmVyLnByb3RvdHlwZVxuICB9IGVsc2Uge1xuICAgIC8vIEZhbGxiYWNrOiBSZXR1cm4gYW4gb2JqZWN0IGluc3RhbmNlIG9mIHRoZSBCdWZmZXIgY2xhc3NcbiAgICB0aGF0ID0gZnJvbUFycmF5TGlrZSh0aGF0LCBhcnJheSlcbiAgfVxuICByZXR1cm4gdGhhdFxufVxuXG5mdW5jdGlvbiBmcm9tT2JqZWN0ICh0aGF0LCBvYmopIHtcbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihvYmopKSB7XG4gICAgdmFyIGxlbiA9IGNoZWNrZWQob2JqLmxlbmd0aCkgfCAwXG4gICAgdGhhdCA9IGNyZWF0ZUJ1ZmZlcih0aGF0LCBsZW4pXG5cbiAgICBpZiAodGhhdC5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB0aGF0XG4gICAgfVxuXG4gICAgb2JqLmNvcHkodGhhdCwgMCwgMCwgbGVuKVxuICAgIHJldHVybiB0aGF0XG4gIH1cblxuICBpZiAob2JqKSB7XG4gICAgaWYgKCh0eXBlb2YgQXJyYXlCdWZmZXIgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgIG9iai5idWZmZXIgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikgfHwgJ2xlbmd0aCcgaW4gb2JqKSB7XG4gICAgICBpZiAodHlwZW9mIG9iai5sZW5ndGggIT09ICdudW1iZXInIHx8IGlzbmFuKG9iai5sZW5ndGgpKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVCdWZmZXIodGhhdCwgMClcbiAgICAgIH1cbiAgICAgIHJldHVybiBmcm9tQXJyYXlMaWtlKHRoYXQsIG9iailcbiAgICB9XG5cbiAgICBpZiAob2JqLnR5cGUgPT09ICdCdWZmZXInICYmIGlzQXJyYXkob2JqLmRhdGEpKSB7XG4gICAgICByZXR1cm4gZnJvbUFycmF5TGlrZSh0aGF0LCBvYmouZGF0YSlcbiAgICB9XG4gIH1cblxuICB0aHJvdyBuZXcgVHlwZUVycm9yKCdGaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgc3RyaW5nLCBCdWZmZXIsIEFycmF5QnVmZmVyLCBBcnJheSwgb3IgYXJyYXktbGlrZSBvYmplY3QuJylcbn1cblxuZnVuY3Rpb24gY2hlY2tlZCAobGVuZ3RoKSB7XG4gIC8vIE5vdGU6IGNhbm5vdCB1c2UgYGxlbmd0aCA8IGtNYXhMZW5ndGgoKWAgaGVyZSBiZWNhdXNlIHRoYXQgZmFpbHMgd2hlblxuICAvLyBsZW5ndGggaXMgTmFOICh3aGljaCBpcyBvdGhlcndpc2UgY29lcmNlZCB0byB6ZXJvLilcbiAgaWYgKGxlbmd0aCA+PSBrTWF4TGVuZ3RoKCkpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQXR0ZW1wdCB0byBhbGxvY2F0ZSBCdWZmZXIgbGFyZ2VyIHRoYW4gbWF4aW11bSAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAnc2l6ZTogMHgnICsga01heExlbmd0aCgpLnRvU3RyaW5nKDE2KSArICcgYnl0ZXMnKVxuICB9XG4gIHJldHVybiBsZW5ndGggfCAwXG59XG5cbmZ1bmN0aW9uIFNsb3dCdWZmZXIgKGxlbmd0aCkge1xuICBpZiAoK2xlbmd0aCAhPSBsZW5ndGgpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBlcWVxZXFcbiAgICBsZW5ndGggPSAwXG4gIH1cbiAgcmV0dXJuIEJ1ZmZlci5hbGxvYygrbGVuZ3RoKVxufVxuXG5CdWZmZXIuaXNCdWZmZXIgPSBmdW5jdGlvbiBpc0J1ZmZlciAoYikge1xuICByZXR1cm4gISEoYiAhPSBudWxsICYmIGIuX2lzQnVmZmVyKVxufVxuXG5CdWZmZXIuY29tcGFyZSA9IGZ1bmN0aW9uIGNvbXBhcmUgKGEsIGIpIHtcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYSkgfHwgIUJ1ZmZlci5pc0J1ZmZlcihiKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50cyBtdXN0IGJlIEJ1ZmZlcnMnKVxuICB9XG5cbiAgaWYgKGEgPT09IGIpIHJldHVybiAwXG5cbiAgdmFyIHggPSBhLmxlbmd0aFxuICB2YXIgeSA9IGIubGVuZ3RoXG5cbiAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IE1hdGgubWluKHgsIHkpOyBpIDwgbGVuOyArK2kpIHtcbiAgICBpZiAoYVtpXSAhPT0gYltpXSkge1xuICAgICAgeCA9IGFbaV1cbiAgICAgIHkgPSBiW2ldXG4gICAgICBicmVha1xuICAgIH1cbiAgfVxuXG4gIGlmICh4IDwgeSkgcmV0dXJuIC0xXG4gIGlmICh5IDwgeCkgcmV0dXJuIDFcbiAgcmV0dXJuIDBcbn1cblxuQnVmZmVyLmlzRW5jb2RpbmcgPSBmdW5jdGlvbiBpc0VuY29kaW5nIChlbmNvZGluZykge1xuICBzd2l0Y2ggKFN0cmluZyhlbmNvZGluZykudG9Mb3dlckNhc2UoKSkge1xuICAgIGNhc2UgJ2hleCc6XG4gICAgY2FzZSAndXRmOCc6XG4gICAgY2FzZSAndXRmLTgnOlxuICAgIGNhc2UgJ2FzY2lpJzpcbiAgICBjYXNlICdsYXRpbjEnOlxuICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgY2FzZSAnYmFzZTY0JzpcbiAgICBjYXNlICd1Y3MyJzpcbiAgICBjYXNlICd1Y3MtMic6XG4gICAgY2FzZSAndXRmMTZsZSc6XG4gICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgcmV0dXJuIHRydWVcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cblxuQnVmZmVyLmNvbmNhdCA9IGZ1bmN0aW9uIGNvbmNhdCAobGlzdCwgbGVuZ3RoKSB7XG4gIGlmICghaXNBcnJheShsaXN0KSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wibGlzdFwiIGFyZ3VtZW50IG11c3QgYmUgYW4gQXJyYXkgb2YgQnVmZmVycycpXG4gIH1cblxuICBpZiAobGlzdC5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gQnVmZmVyLmFsbG9jKDApXG4gIH1cblxuICB2YXIgaVxuICBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQpIHtcbiAgICBsZW5ndGggPSAwXG4gICAgZm9yIChpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyArK2kpIHtcbiAgICAgIGxlbmd0aCArPSBsaXN0W2ldLmxlbmd0aFxuICAgIH1cbiAgfVxuXG4gIHZhciBidWZmZXIgPSBCdWZmZXIuYWxsb2NVbnNhZmUobGVuZ3RoKVxuICB2YXIgcG9zID0gMFxuICBmb3IgKGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7ICsraSkge1xuICAgIHZhciBidWYgPSBsaXN0W2ldXG4gICAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYnVmKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJsaXN0XCIgYXJndW1lbnQgbXVzdCBiZSBhbiBBcnJheSBvZiBCdWZmZXJzJylcbiAgICB9XG4gICAgYnVmLmNvcHkoYnVmZmVyLCBwb3MpXG4gICAgcG9zICs9IGJ1Zi5sZW5ndGhcbiAgfVxuICByZXR1cm4gYnVmZmVyXG59XG5cbmZ1bmN0aW9uIGJ5dGVMZW5ndGggKHN0cmluZywgZW5jb2RpbmcpIHtcbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihzdHJpbmcpKSB7XG4gICAgcmV0dXJuIHN0cmluZy5sZW5ndGhcbiAgfVxuICBpZiAodHlwZW9mIEFycmF5QnVmZmVyICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgQXJyYXlCdWZmZXIuaXNWaWV3ID09PSAnZnVuY3Rpb24nICYmXG4gICAgICAoQXJyYXlCdWZmZXIuaXNWaWV3KHN0cmluZykgfHwgc3RyaW5nIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpKSB7XG4gICAgcmV0dXJuIHN0cmluZy5ieXRlTGVuZ3RoXG4gIH1cbiAgaWYgKHR5cGVvZiBzdHJpbmcgIT09ICdzdHJpbmcnKSB7XG4gICAgc3RyaW5nID0gJycgKyBzdHJpbmdcbiAgfVxuXG4gIHZhciBsZW4gPSBzdHJpbmcubGVuZ3RoXG4gIGlmIChsZW4gPT09IDApIHJldHVybiAwXG5cbiAgLy8gVXNlIGEgZm9yIGxvb3AgdG8gYXZvaWQgcmVjdXJzaW9uXG4gIHZhciBsb3dlcmVkQ2FzZSA9IGZhbHNlXG4gIGZvciAoOzspIHtcbiAgICBzd2l0Y2ggKGVuY29kaW5nKSB7XG4gICAgICBjYXNlICdhc2NpaSc6XG4gICAgICBjYXNlICdsYXRpbjEnOlxuICAgICAgY2FzZSAnYmluYXJ5JzpcbiAgICAgICAgcmV0dXJuIGxlblxuICAgICAgY2FzZSAndXRmOCc6XG4gICAgICBjYXNlICd1dGYtOCc6XG4gICAgICBjYXNlIHVuZGVmaW5lZDpcbiAgICAgICAgcmV0dXJuIHV0ZjhUb0J5dGVzKHN0cmluZykubGVuZ3RoXG4gICAgICBjYXNlICd1Y3MyJzpcbiAgICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgICByZXR1cm4gbGVuICogMlxuICAgICAgY2FzZSAnaGV4JzpcbiAgICAgICAgcmV0dXJuIGxlbiA+Pj4gMVxuICAgICAgY2FzZSAnYmFzZTY0JzpcbiAgICAgICAgcmV0dXJuIGJhc2U2NFRvQnl0ZXMoc3RyaW5nKS5sZW5ndGhcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChsb3dlcmVkQ2FzZSkgcmV0dXJuIHV0ZjhUb0J5dGVzKHN0cmluZykubGVuZ3RoIC8vIGFzc3VtZSB1dGY4XG4gICAgICAgIGVuY29kaW5nID0gKCcnICsgZW5jb2RpbmcpLnRvTG93ZXJDYXNlKClcbiAgICAgICAgbG93ZXJlZENhc2UgPSB0cnVlXG4gICAgfVxuICB9XG59XG5CdWZmZXIuYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGhcblxuZnVuY3Rpb24gc2xvd1RvU3RyaW5nIChlbmNvZGluZywgc3RhcnQsIGVuZCkge1xuICB2YXIgbG93ZXJlZENhc2UgPSBmYWxzZVxuXG4gIC8vIE5vIG5lZWQgdG8gdmVyaWZ5IHRoYXQgXCJ0aGlzLmxlbmd0aCA8PSBNQVhfVUlOVDMyXCIgc2luY2UgaXQncyBhIHJlYWQtb25seVxuICAvLyBwcm9wZXJ0eSBvZiBhIHR5cGVkIGFycmF5LlxuXG4gIC8vIFRoaXMgYmVoYXZlcyBuZWl0aGVyIGxpa2UgU3RyaW5nIG5vciBVaW50OEFycmF5IGluIHRoYXQgd2Ugc2V0IHN0YXJ0L2VuZFxuICAvLyB0byB0aGVpciB1cHBlci9sb3dlciBib3VuZHMgaWYgdGhlIHZhbHVlIHBhc3NlZCBpcyBvdXQgb2YgcmFuZ2UuXG4gIC8vIHVuZGVmaW5lZCBpcyBoYW5kbGVkIHNwZWNpYWxseSBhcyBwZXIgRUNNQS0yNjIgNnRoIEVkaXRpb24sXG4gIC8vIFNlY3Rpb24gMTMuMy4zLjcgUnVudGltZSBTZW1hbnRpY3M6IEtleWVkQmluZGluZ0luaXRpYWxpemF0aW9uLlxuICBpZiAoc3RhcnQgPT09IHVuZGVmaW5lZCB8fCBzdGFydCA8IDApIHtcbiAgICBzdGFydCA9IDBcbiAgfVxuICAvLyBSZXR1cm4gZWFybHkgaWYgc3RhcnQgPiB0aGlzLmxlbmd0aC4gRG9uZSBoZXJlIHRvIHByZXZlbnQgcG90ZW50aWFsIHVpbnQzMlxuICAvLyBjb2VyY2lvbiBmYWlsIGJlbG93LlxuICBpZiAoc3RhcnQgPiB0aGlzLmxlbmd0aCkge1xuICAgIHJldHVybiAnJ1xuICB9XG5cbiAgaWYgKGVuZCA9PT0gdW5kZWZpbmVkIHx8IGVuZCA+IHRoaXMubGVuZ3RoKSB7XG4gICAgZW5kID0gdGhpcy5sZW5ndGhcbiAgfVxuXG4gIGlmIChlbmQgPD0gMCkge1xuICAgIHJldHVybiAnJ1xuICB9XG5cbiAgLy8gRm9yY2UgY29lcnNpb24gdG8gdWludDMyLiBUaGlzIHdpbGwgYWxzbyBjb2VyY2UgZmFsc2V5L05hTiB2YWx1ZXMgdG8gMC5cbiAgZW5kID4+Pj0gMFxuICBzdGFydCA+Pj49IDBcblxuICBpZiAoZW5kIDw9IHN0YXJ0KSB7XG4gICAgcmV0dXJuICcnXG4gIH1cblxuICBpZiAoIWVuY29kaW5nKSBlbmNvZGluZyA9ICd1dGY4J1xuXG4gIHdoaWxlICh0cnVlKSB7XG4gICAgc3dpdGNoIChlbmNvZGluZykge1xuICAgICAgY2FzZSAnaGV4JzpcbiAgICAgICAgcmV0dXJuIGhleFNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgY2FzZSAndXRmLTgnOlxuICAgICAgICByZXR1cm4gdXRmOFNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ2FzY2lpJzpcbiAgICAgICAgcmV0dXJuIGFzY2lpU2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAnbGF0aW4xJzpcbiAgICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgICAgIHJldHVybiBsYXRpbjFTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgICByZXR1cm4gYmFzZTY0U2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAndWNzMic6XG4gICAgICBjYXNlICd1Y3MtMic6XG4gICAgICBjYXNlICd1dGYxNmxlJzpcbiAgICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgICAgcmV0dXJuIHV0ZjE2bGVTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAobG93ZXJlZENhc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZylcbiAgICAgICAgZW5jb2RpbmcgPSAoZW5jb2RpbmcgKyAnJykudG9Mb3dlckNhc2UoKVxuICAgICAgICBsb3dlcmVkQ2FzZSA9IHRydWVcbiAgICB9XG4gIH1cbn1cblxuLy8gVGhlIHByb3BlcnR5IGlzIHVzZWQgYnkgYEJ1ZmZlci5pc0J1ZmZlcmAgYW5kIGBpcy1idWZmZXJgIChpbiBTYWZhcmkgNS03KSB0byBkZXRlY3Rcbi8vIEJ1ZmZlciBpbnN0YW5jZXMuXG5CdWZmZXIucHJvdG90eXBlLl9pc0J1ZmZlciA9IHRydWVcblxuZnVuY3Rpb24gc3dhcCAoYiwgbiwgbSkge1xuICB2YXIgaSA9IGJbbl1cbiAgYltuXSA9IGJbbV1cbiAgYlttXSA9IGlcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5zd2FwMTYgPSBmdW5jdGlvbiBzd2FwMTYgKCkge1xuICB2YXIgbGVuID0gdGhpcy5sZW5ndGhcbiAgaWYgKGxlbiAlIDIgIT09IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LWJpdHMnKVxuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpICs9IDIpIHtcbiAgICBzd2FwKHRoaXMsIGksIGkgKyAxKVxuICB9XG4gIHJldHVybiB0aGlzXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuc3dhcDMyID0gZnVuY3Rpb24gc3dhcDMyICgpIHtcbiAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoXG4gIGlmIChsZW4gJSA0ICE9PSAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0J1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAzMi1iaXRzJylcbiAgfVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSArPSA0KSB7XG4gICAgc3dhcCh0aGlzLCBpLCBpICsgMylcbiAgICBzd2FwKHRoaXMsIGkgKyAxLCBpICsgMilcbiAgfVxuICByZXR1cm4gdGhpc1xufVxuXG5CdWZmZXIucHJvdG90eXBlLnN3YXA2NCA9IGZ1bmN0aW9uIHN3YXA2NCAoKSB7XG4gIHZhciBsZW4gPSB0aGlzLmxlbmd0aFxuICBpZiAobGVuICUgOCAhPT0gMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNjQtYml0cycpXG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkgKz0gOCkge1xuICAgIHN3YXAodGhpcywgaSwgaSArIDcpXG4gICAgc3dhcCh0aGlzLCBpICsgMSwgaSArIDYpXG4gICAgc3dhcCh0aGlzLCBpICsgMiwgaSArIDUpXG4gICAgc3dhcCh0aGlzLCBpICsgMywgaSArIDQpXG4gIH1cbiAgcmV0dXJuIHRoaXNcbn1cblxuQnVmZmVyLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nICgpIHtcbiAgdmFyIGxlbmd0aCA9IHRoaXMubGVuZ3RoIHwgMFxuICBpZiAobGVuZ3RoID09PSAwKSByZXR1cm4gJydcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHJldHVybiB1dGY4U2xpY2UodGhpcywgMCwgbGVuZ3RoKVxuICByZXR1cm4gc2xvd1RvU3RyaW5nLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5lcXVhbHMgPSBmdW5jdGlvbiBlcXVhbHMgKGIpIHtcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYikpIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXInKVxuICBpZiAodGhpcyA9PT0gYikgcmV0dXJuIHRydWVcbiAgcmV0dXJuIEJ1ZmZlci5jb21wYXJlKHRoaXMsIGIpID09PSAwXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuaW5zcGVjdCA9IGZ1bmN0aW9uIGluc3BlY3QgKCkge1xuICB2YXIgc3RyID0gJydcbiAgdmFyIG1heCA9IGV4cG9ydHMuSU5TUEVDVF9NQVhfQllURVNcbiAgaWYgKHRoaXMubGVuZ3RoID4gMCkge1xuICAgIHN0ciA9IHRoaXMudG9TdHJpbmcoJ2hleCcsIDAsIG1heCkubWF0Y2goLy57Mn0vZykuam9pbignICcpXG4gICAgaWYgKHRoaXMubGVuZ3RoID4gbWF4KSBzdHIgKz0gJyAuLi4gJ1xuICB9XG4gIHJldHVybiAnPEJ1ZmZlciAnICsgc3RyICsgJz4nXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuY29tcGFyZSA9IGZ1bmN0aW9uIGNvbXBhcmUgKHRhcmdldCwgc3RhcnQsIGVuZCwgdGhpc1N0YXJ0LCB0aGlzRW5kKSB7XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKHRhcmdldCkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyJylcbiAgfVxuXG4gIGlmIChzdGFydCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgc3RhcnQgPSAwXG4gIH1cbiAgaWYgKGVuZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZW5kID0gdGFyZ2V0ID8gdGFyZ2V0Lmxlbmd0aCA6IDBcbiAgfVxuICBpZiAodGhpc1N0YXJ0ID09PSB1bmRlZmluZWQpIHtcbiAgICB0aGlzU3RhcnQgPSAwXG4gIH1cbiAgaWYgKHRoaXNFbmQgPT09IHVuZGVmaW5lZCkge1xuICAgIHRoaXNFbmQgPSB0aGlzLmxlbmd0aFxuICB9XG5cbiAgaWYgKHN0YXJ0IDwgMCB8fCBlbmQgPiB0YXJnZXQubGVuZ3RoIHx8IHRoaXNTdGFydCA8IDAgfHwgdGhpc0VuZCA+IHRoaXMubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ291dCBvZiByYW5nZSBpbmRleCcpXG4gIH1cblxuICBpZiAodGhpc1N0YXJ0ID49IHRoaXNFbmQgJiYgc3RhcnQgPj0gZW5kKSB7XG4gICAgcmV0dXJuIDBcbiAgfVxuICBpZiAodGhpc1N0YXJ0ID49IHRoaXNFbmQpIHtcbiAgICByZXR1cm4gLTFcbiAgfVxuICBpZiAoc3RhcnQgPj0gZW5kKSB7XG4gICAgcmV0dXJuIDFcbiAgfVxuXG4gIHN0YXJ0ID4+Pj0gMFxuICBlbmQgPj4+PSAwXG4gIHRoaXNTdGFydCA+Pj49IDBcbiAgdGhpc0VuZCA+Pj49IDBcblxuICBpZiAodGhpcyA9PT0gdGFyZ2V0KSByZXR1cm4gMFxuXG4gIHZhciB4ID0gdGhpc0VuZCAtIHRoaXNTdGFydFxuICB2YXIgeSA9IGVuZCAtIHN0YXJ0XG4gIHZhciBsZW4gPSBNYXRoLm1pbih4LCB5KVxuXG4gIHZhciB0aGlzQ29weSA9IHRoaXMuc2xpY2UodGhpc1N0YXJ0LCB0aGlzRW5kKVxuICB2YXIgdGFyZ2V0Q29weSA9IHRhcmdldC5zbGljZShzdGFydCwgZW5kKVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyArK2kpIHtcbiAgICBpZiAodGhpc0NvcHlbaV0gIT09IHRhcmdldENvcHlbaV0pIHtcbiAgICAgIHggPSB0aGlzQ29weVtpXVxuICAgICAgeSA9IHRhcmdldENvcHlbaV1cbiAgICAgIGJyZWFrXG4gICAgfVxuICB9XG5cbiAgaWYgKHggPCB5KSByZXR1cm4gLTFcbiAgaWYgKHkgPCB4KSByZXR1cm4gMVxuICByZXR1cm4gMFxufVxuXG4vLyBGaW5kcyBlaXRoZXIgdGhlIGZpcnN0IGluZGV4IG9mIGB2YWxgIGluIGBidWZmZXJgIGF0IG9mZnNldCA+PSBgYnl0ZU9mZnNldGAsXG4vLyBPUiB0aGUgbGFzdCBpbmRleCBvZiBgdmFsYCBpbiBgYnVmZmVyYCBhdCBvZmZzZXQgPD0gYGJ5dGVPZmZzZXRgLlxuLy9cbi8vIEFyZ3VtZW50czpcbi8vIC0gYnVmZmVyIC0gYSBCdWZmZXIgdG8gc2VhcmNoXG4vLyAtIHZhbCAtIGEgc3RyaW5nLCBCdWZmZXIsIG9yIG51bWJlclxuLy8gLSBieXRlT2Zmc2V0IC0gYW4gaW5kZXggaW50byBgYnVmZmVyYDsgd2lsbCBiZSBjbGFtcGVkIHRvIGFuIGludDMyXG4vLyAtIGVuY29kaW5nIC0gYW4gb3B0aW9uYWwgZW5jb2RpbmcsIHJlbGV2YW50IGlzIHZhbCBpcyBhIHN0cmluZ1xuLy8gLSBkaXIgLSB0cnVlIGZvciBpbmRleE9mLCBmYWxzZSBmb3IgbGFzdEluZGV4T2ZcbmZ1bmN0aW9uIGJpZGlyZWN0aW9uYWxJbmRleE9mIChidWZmZXIsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGRpcikge1xuICAvLyBFbXB0eSBidWZmZXIgbWVhbnMgbm8gbWF0Y2hcbiAgaWYgKGJ1ZmZlci5sZW5ndGggPT09IDApIHJldHVybiAtMVxuXG4gIC8vIE5vcm1hbGl6ZSBieXRlT2Zmc2V0XG4gIGlmICh0eXBlb2YgYnl0ZU9mZnNldCA9PT0gJ3N0cmluZycpIHtcbiAgICBlbmNvZGluZyA9IGJ5dGVPZmZzZXRcbiAgICBieXRlT2Zmc2V0ID0gMFxuICB9IGVsc2UgaWYgKGJ5dGVPZmZzZXQgPiAweDdmZmZmZmZmKSB7XG4gICAgYnl0ZU9mZnNldCA9IDB4N2ZmZmZmZmZcbiAgfSBlbHNlIGlmIChieXRlT2Zmc2V0IDwgLTB4ODAwMDAwMDApIHtcbiAgICBieXRlT2Zmc2V0ID0gLTB4ODAwMDAwMDBcbiAgfVxuICBieXRlT2Zmc2V0ID0gK2J5dGVPZmZzZXQgIC8vIENvZXJjZSB0byBOdW1iZXIuXG4gIGlmIChpc05hTihieXRlT2Zmc2V0KSkge1xuICAgIC8vIGJ5dGVPZmZzZXQ6IGl0IGl0J3MgdW5kZWZpbmVkLCBudWxsLCBOYU4sIFwiZm9vXCIsIGV0Yywgc2VhcmNoIHdob2xlIGJ1ZmZlclxuICAgIGJ5dGVPZmZzZXQgPSBkaXIgPyAwIDogKGJ1ZmZlci5sZW5ndGggLSAxKVxuICB9XG5cbiAgLy8gTm9ybWFsaXplIGJ5dGVPZmZzZXQ6IG5lZ2F0aXZlIG9mZnNldHMgc3RhcnQgZnJvbSB0aGUgZW5kIG9mIHRoZSBidWZmZXJcbiAgaWYgKGJ5dGVPZmZzZXQgPCAwKSBieXRlT2Zmc2V0ID0gYnVmZmVyLmxlbmd0aCArIGJ5dGVPZmZzZXRcbiAgaWYgKGJ5dGVPZmZzZXQgPj0gYnVmZmVyLmxlbmd0aCkge1xuICAgIGlmIChkaXIpIHJldHVybiAtMVxuICAgIGVsc2UgYnl0ZU9mZnNldCA9IGJ1ZmZlci5sZW5ndGggLSAxXG4gIH0gZWxzZSBpZiAoYnl0ZU9mZnNldCA8IDApIHtcbiAgICBpZiAoZGlyKSBieXRlT2Zmc2V0ID0gMFxuICAgIGVsc2UgcmV0dXJuIC0xXG4gIH1cblxuICAvLyBOb3JtYWxpemUgdmFsXG4gIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgIHZhbCA9IEJ1ZmZlci5mcm9tKHZhbCwgZW5jb2RpbmcpXG4gIH1cblxuICAvLyBGaW5hbGx5LCBzZWFyY2ggZWl0aGVyIGluZGV4T2YgKGlmIGRpciBpcyB0cnVlKSBvciBsYXN0SW5kZXhPZlxuICBpZiAoQnVmZmVyLmlzQnVmZmVyKHZhbCkpIHtcbiAgICAvLyBTcGVjaWFsIGNhc2U6IGxvb2tpbmcgZm9yIGVtcHR5IHN0cmluZy9idWZmZXIgYWx3YXlzIGZhaWxzXG4gICAgaWYgKHZhbC5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiAtMVxuICAgIH1cbiAgICByZXR1cm4gYXJyYXlJbmRleE9mKGJ1ZmZlciwgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZGlyKVxuICB9IGVsc2UgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInKSB7XG4gICAgdmFsID0gdmFsICYgMHhGRiAvLyBTZWFyY2ggZm9yIGEgYnl0ZSB2YWx1ZSBbMC0yNTVdXG4gICAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUICYmXG4gICAgICAgIHR5cGVvZiBVaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpZiAoZGlyKSB7XG4gICAgICAgIHJldHVybiBVaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mLmNhbGwoYnVmZmVyLCB2YWwsIGJ5dGVPZmZzZXQpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gVWludDhBcnJheS5wcm90b3R5cGUubGFzdEluZGV4T2YuY2FsbChidWZmZXIsIHZhbCwgYnl0ZU9mZnNldClcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGFycmF5SW5kZXhPZihidWZmZXIsIFsgdmFsIF0sIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBkaXIpXG4gIH1cblxuICB0aHJvdyBuZXcgVHlwZUVycm9yKCd2YWwgbXVzdCBiZSBzdHJpbmcsIG51bWJlciBvciBCdWZmZXInKVxufVxuXG5mdW5jdGlvbiBhcnJheUluZGV4T2YgKGFyciwgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZGlyKSB7XG4gIHZhciBpbmRleFNpemUgPSAxXG4gIHZhciBhcnJMZW5ndGggPSBhcnIubGVuZ3RoXG4gIHZhciB2YWxMZW5ndGggPSB2YWwubGVuZ3RoXG5cbiAgaWYgKGVuY29kaW5nICE9PSB1bmRlZmluZWQpIHtcbiAgICBlbmNvZGluZyA9IFN0cmluZyhlbmNvZGluZykudG9Mb3dlckNhc2UoKVxuICAgIGlmIChlbmNvZGluZyA9PT0gJ3VjczInIHx8IGVuY29kaW5nID09PSAndWNzLTInIHx8XG4gICAgICAgIGVuY29kaW5nID09PSAndXRmMTZsZScgfHwgZW5jb2RpbmcgPT09ICd1dGYtMTZsZScpIHtcbiAgICAgIGlmIChhcnIubGVuZ3RoIDwgMiB8fCB2YWwubGVuZ3RoIDwgMikge1xuICAgICAgICByZXR1cm4gLTFcbiAgICAgIH1cbiAgICAgIGluZGV4U2l6ZSA9IDJcbiAgICAgIGFyckxlbmd0aCAvPSAyXG4gICAgICB2YWxMZW5ndGggLz0gMlxuICAgICAgYnl0ZU9mZnNldCAvPSAyXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcmVhZCAoYnVmLCBpKSB7XG4gICAgaWYgKGluZGV4U2l6ZSA9PT0gMSkge1xuICAgICAgcmV0dXJuIGJ1ZltpXVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gYnVmLnJlYWRVSW50MTZCRShpICogaW5kZXhTaXplKVxuICAgIH1cbiAgfVxuXG4gIHZhciBpXG4gIGlmIChkaXIpIHtcbiAgICB2YXIgZm91bmRJbmRleCA9IC0xXG4gICAgZm9yIChpID0gYnl0ZU9mZnNldDsgaSA8IGFyckxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAocmVhZChhcnIsIGkpID09PSByZWFkKHZhbCwgZm91bmRJbmRleCA9PT0gLTEgPyAwIDogaSAtIGZvdW5kSW5kZXgpKSB7XG4gICAgICAgIGlmIChmb3VuZEluZGV4ID09PSAtMSkgZm91bmRJbmRleCA9IGlcbiAgICAgICAgaWYgKGkgLSBmb3VuZEluZGV4ICsgMSA9PT0gdmFsTGVuZ3RoKSByZXR1cm4gZm91bmRJbmRleCAqIGluZGV4U2l6ZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGZvdW5kSW5kZXggIT09IC0xKSBpIC09IGkgLSBmb3VuZEluZGV4XG4gICAgICAgIGZvdW5kSW5kZXggPSAtMVxuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoYnl0ZU9mZnNldCArIHZhbExlbmd0aCA+IGFyckxlbmd0aCkgYnl0ZU9mZnNldCA9IGFyckxlbmd0aCAtIHZhbExlbmd0aFxuICAgIGZvciAoaSA9IGJ5dGVPZmZzZXQ7IGkgPj0gMDsgaS0tKSB7XG4gICAgICB2YXIgZm91bmQgPSB0cnVlXG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHZhbExlbmd0aDsgaisrKSB7XG4gICAgICAgIGlmIChyZWFkKGFyciwgaSArIGopICE9PSByZWFkKHZhbCwgaikpIHtcbiAgICAgICAgICBmb3VuZCA9IGZhbHNlXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGZvdW5kKSByZXR1cm4gaVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiAtMVxufVxuXG5CdWZmZXIucHJvdG90eXBlLmluY2x1ZGVzID0gZnVuY3Rpb24gaW5jbHVkZXMgKHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIHRoaXMuaW5kZXhPZih2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSAhPT0gLTFcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5pbmRleE9mID0gZnVuY3Rpb24gaW5kZXhPZiAodmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZykge1xuICByZXR1cm4gYmlkaXJlY3Rpb25hbEluZGV4T2YodGhpcywgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgdHJ1ZSlcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5sYXN0SW5kZXhPZiA9IGZ1bmN0aW9uIGxhc3RJbmRleE9mICh2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSB7XG4gIHJldHVybiBiaWRpcmVjdGlvbmFsSW5kZXhPZih0aGlzLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBmYWxzZSlcbn1cblxuZnVuY3Rpb24gaGV4V3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICBvZmZzZXQgPSBOdW1iZXIob2Zmc2V0KSB8fCAwXG4gIHZhciByZW1haW5pbmcgPSBidWYubGVuZ3RoIC0gb2Zmc2V0XG4gIGlmICghbGVuZ3RoKSB7XG4gICAgbGVuZ3RoID0gcmVtYWluaW5nXG4gIH0gZWxzZSB7XG4gICAgbGVuZ3RoID0gTnVtYmVyKGxlbmd0aClcbiAgICBpZiAobGVuZ3RoID4gcmVtYWluaW5nKSB7XG4gICAgICBsZW5ndGggPSByZW1haW5pbmdcbiAgICB9XG4gIH1cblxuICAvLyBtdXN0IGJlIGFuIGV2ZW4gbnVtYmVyIG9mIGRpZ2l0c1xuICB2YXIgc3RyTGVuID0gc3RyaW5nLmxlbmd0aFxuICBpZiAoc3RyTGVuICUgMiAhPT0gMCkgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBoZXggc3RyaW5nJylcblxuICBpZiAobGVuZ3RoID4gc3RyTGVuIC8gMikge1xuICAgIGxlbmd0aCA9IHN0ckxlbiAvIDJcbiAgfVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgdmFyIHBhcnNlZCA9IHBhcnNlSW50KHN0cmluZy5zdWJzdHIoaSAqIDIsIDIpLCAxNilcbiAgICBpZiAoaXNOYU4ocGFyc2VkKSkgcmV0dXJuIGlcbiAgICBidWZbb2Zmc2V0ICsgaV0gPSBwYXJzZWRcbiAgfVxuICByZXR1cm4gaVxufVxuXG5mdW5jdGlvbiB1dGY4V3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYmxpdEJ1ZmZlcih1dGY4VG9CeXRlcyhzdHJpbmcsIGJ1Zi5sZW5ndGggLSBvZmZzZXQpLCBidWYsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5mdW5jdGlvbiBhc2NpaVdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGJsaXRCdWZmZXIoYXNjaWlUb0J5dGVzKHN0cmluZyksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIGxhdGluMVdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGFzY2lpV3JpdGUoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5mdW5jdGlvbiBiYXNlNjRXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKGJhc2U2NFRvQnl0ZXMoc3RyaW5nKSwgYnVmLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gdWNzMldyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGJsaXRCdWZmZXIodXRmMTZsZVRvQnl0ZXMoc3RyaW5nLCBidWYubGVuZ3RoIC0gb2Zmc2V0KSwgYnVmLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uIHdyaXRlIChzdHJpbmcsIG9mZnNldCwgbGVuZ3RoLCBlbmNvZGluZykge1xuICAvLyBCdWZmZXIjd3JpdGUoc3RyaW5nKVxuICBpZiAob2Zmc2V0ID09PSB1bmRlZmluZWQpIHtcbiAgICBlbmNvZGluZyA9ICd1dGY4J1xuICAgIGxlbmd0aCA9IHRoaXMubGVuZ3RoXG4gICAgb2Zmc2V0ID0gMFxuICAvLyBCdWZmZXIjd3JpdGUoc3RyaW5nLCBlbmNvZGluZylcbiAgfSBlbHNlIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCAmJiB0eXBlb2Ygb2Zmc2V0ID09PSAnc3RyaW5nJykge1xuICAgIGVuY29kaW5nID0gb2Zmc2V0XG4gICAgbGVuZ3RoID0gdGhpcy5sZW5ndGhcbiAgICBvZmZzZXQgPSAwXG4gIC8vIEJ1ZmZlciN3cml0ZShzdHJpbmcsIG9mZnNldFssIGxlbmd0aF1bLCBlbmNvZGluZ10pXG4gIH0gZWxzZSBpZiAoaXNGaW5pdGUob2Zmc2V0KSkge1xuICAgIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgICBpZiAoaXNGaW5pdGUobGVuZ3RoKSkge1xuICAgICAgbGVuZ3RoID0gbGVuZ3RoIHwgMFxuICAgICAgaWYgKGVuY29kaW5nID09PSB1bmRlZmluZWQpIGVuY29kaW5nID0gJ3V0ZjgnXG4gICAgfSBlbHNlIHtcbiAgICAgIGVuY29kaW5nID0gbGVuZ3RoXG4gICAgICBsZW5ndGggPSB1bmRlZmluZWRcbiAgICB9XG4gIC8vIGxlZ2FjeSB3cml0ZShzdHJpbmcsIGVuY29kaW5nLCBvZmZzZXQsIGxlbmd0aCkgLSByZW1vdmUgaW4gdjAuMTNcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAnQnVmZmVyLndyaXRlKHN0cmluZywgZW5jb2RpbmcsIG9mZnNldFssIGxlbmd0aF0pIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQnXG4gICAgKVxuICB9XG5cbiAgdmFyIHJlbWFpbmluZyA9IHRoaXMubGVuZ3RoIC0gb2Zmc2V0XG4gIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCB8fCBsZW5ndGggPiByZW1haW5pbmcpIGxlbmd0aCA9IHJlbWFpbmluZ1xuXG4gIGlmICgoc3RyaW5nLmxlbmd0aCA+IDAgJiYgKGxlbmd0aCA8IDAgfHwgb2Zmc2V0IDwgMCkpIHx8IG9mZnNldCA+IHRoaXMubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0F0dGVtcHQgdG8gd3JpdGUgb3V0c2lkZSBidWZmZXIgYm91bmRzJylcbiAgfVxuXG4gIGlmICghZW5jb2RpbmcpIGVuY29kaW5nID0gJ3V0ZjgnXG5cbiAgdmFyIGxvd2VyZWRDYXNlID0gZmFsc2VcbiAgZm9yICg7Oykge1xuICAgIHN3aXRjaCAoZW5jb2RpbmcpIHtcbiAgICAgIGNhc2UgJ2hleCc6XG4gICAgICAgIHJldHVybiBoZXhXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICd1dGY4JzpcbiAgICAgIGNhc2UgJ3V0Zi04JzpcbiAgICAgICAgcmV0dXJuIHV0ZjhXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICdhc2NpaSc6XG4gICAgICAgIHJldHVybiBhc2NpaVdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgICBjYXNlICdiaW5hcnknOlxuICAgICAgICByZXR1cm4gbGF0aW4xV3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAnYmFzZTY0JzpcbiAgICAgICAgLy8gV2FybmluZzogbWF4TGVuZ3RoIG5vdCB0YWtlbiBpbnRvIGFjY291bnQgaW4gYmFzZTY0V3JpdGVcbiAgICAgICAgcmV0dXJuIGJhc2U2NFdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ3VjczInOlxuICAgICAgY2FzZSAndWNzLTInOlxuICAgICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICAgIHJldHVybiB1Y3MyV3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKGxvd2VyZWRDYXNlKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgZW5jb2RpbmcpXG4gICAgICAgIGVuY29kaW5nID0gKCcnICsgZW5jb2RpbmcpLnRvTG93ZXJDYXNlKClcbiAgICAgICAgbG93ZXJlZENhc2UgPSB0cnVlXG4gICAgfVxuICB9XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gdG9KU09OICgpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnQnVmZmVyJyxcbiAgICBkYXRhOiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0aGlzLl9hcnIgfHwgdGhpcywgMClcbiAgfVxufVxuXG5mdW5jdGlvbiBiYXNlNjRTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIGlmIChzdGFydCA9PT0gMCAmJiBlbmQgPT09IGJ1Zi5sZW5ndGgpIHtcbiAgICByZXR1cm4gYmFzZTY0LmZyb21CeXRlQXJyYXkoYnVmKVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBiYXNlNjQuZnJvbUJ5dGVBcnJheShidWYuc2xpY2Uoc3RhcnQsIGVuZCkpXG4gIH1cbn1cblxuZnVuY3Rpb24gdXRmOFNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgZW5kID0gTWF0aC5taW4oYnVmLmxlbmd0aCwgZW5kKVxuICB2YXIgcmVzID0gW11cblxuICB2YXIgaSA9IHN0YXJ0XG4gIHdoaWxlIChpIDwgZW5kKSB7XG4gICAgdmFyIGZpcnN0Qnl0ZSA9IGJ1ZltpXVxuICAgIHZhciBjb2RlUG9pbnQgPSBudWxsXG4gICAgdmFyIGJ5dGVzUGVyU2VxdWVuY2UgPSAoZmlyc3RCeXRlID4gMHhFRikgPyA0XG4gICAgICA6IChmaXJzdEJ5dGUgPiAweERGKSA/IDNcbiAgICAgIDogKGZpcnN0Qnl0ZSA+IDB4QkYpID8gMlxuICAgICAgOiAxXG5cbiAgICBpZiAoaSArIGJ5dGVzUGVyU2VxdWVuY2UgPD0gZW5kKSB7XG4gICAgICB2YXIgc2Vjb25kQnl0ZSwgdGhpcmRCeXRlLCBmb3VydGhCeXRlLCB0ZW1wQ29kZVBvaW50XG5cbiAgICAgIHN3aXRjaCAoYnl0ZXNQZXJTZXF1ZW5jZSkge1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgaWYgKGZpcnN0Qnl0ZSA8IDB4ODApIHtcbiAgICAgICAgICAgIGNvZGVQb2ludCA9IGZpcnN0Qnl0ZVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgc2Vjb25kQnl0ZSA9IGJ1ZltpICsgMV1cbiAgICAgICAgICBpZiAoKHNlY29uZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCkge1xuICAgICAgICAgICAgdGVtcENvZGVQb2ludCA9IChmaXJzdEJ5dGUgJiAweDFGKSA8PCAweDYgfCAoc2Vjb25kQnl0ZSAmIDB4M0YpXG4gICAgICAgICAgICBpZiAodGVtcENvZGVQb2ludCA+IDB4N0YpIHtcbiAgICAgICAgICAgICAgY29kZVBvaW50ID0gdGVtcENvZGVQb2ludFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgc2Vjb25kQnl0ZSA9IGJ1ZltpICsgMV1cbiAgICAgICAgICB0aGlyZEJ5dGUgPSBidWZbaSArIDJdXG4gICAgICAgICAgaWYgKChzZWNvbmRCeXRlICYgMHhDMCkgPT09IDB4ODAgJiYgKHRoaXJkQnl0ZSAmIDB4QzApID09PSAweDgwKSB7XG4gICAgICAgICAgICB0ZW1wQ29kZVBvaW50ID0gKGZpcnN0Qnl0ZSAmIDB4RikgPDwgMHhDIHwgKHNlY29uZEJ5dGUgJiAweDNGKSA8PCAweDYgfCAodGhpcmRCeXRlICYgMHgzRilcbiAgICAgICAgICAgIGlmICh0ZW1wQ29kZVBvaW50ID4gMHg3RkYgJiYgKHRlbXBDb2RlUG9pbnQgPCAweEQ4MDAgfHwgdGVtcENvZGVQb2ludCA+IDB4REZGRikpIHtcbiAgICAgICAgICAgICAgY29kZVBvaW50ID0gdGVtcENvZGVQb2ludFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgc2Vjb25kQnl0ZSA9IGJ1ZltpICsgMV1cbiAgICAgICAgICB0aGlyZEJ5dGUgPSBidWZbaSArIDJdXG4gICAgICAgICAgZm91cnRoQnl0ZSA9IGJ1ZltpICsgM11cbiAgICAgICAgICBpZiAoKHNlY29uZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCAmJiAodGhpcmRCeXRlICYgMHhDMCkgPT09IDB4ODAgJiYgKGZvdXJ0aEJ5dGUgJiAweEMwKSA9PT0gMHg4MCkge1xuICAgICAgICAgICAgdGVtcENvZGVQb2ludCA9IChmaXJzdEJ5dGUgJiAweEYpIDw8IDB4MTIgfCAoc2Vjb25kQnl0ZSAmIDB4M0YpIDw8IDB4QyB8ICh0aGlyZEJ5dGUgJiAweDNGKSA8PCAweDYgfCAoZm91cnRoQnl0ZSAmIDB4M0YpXG4gICAgICAgICAgICBpZiAodGVtcENvZGVQb2ludCA+IDB4RkZGRiAmJiB0ZW1wQ29kZVBvaW50IDwgMHgxMTAwMDApIHtcbiAgICAgICAgICAgICAgY29kZVBvaW50ID0gdGVtcENvZGVQb2ludFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY29kZVBvaW50ID09PSBudWxsKSB7XG4gICAgICAvLyB3ZSBkaWQgbm90IGdlbmVyYXRlIGEgdmFsaWQgY29kZVBvaW50IHNvIGluc2VydCBhXG4gICAgICAvLyByZXBsYWNlbWVudCBjaGFyIChVK0ZGRkQpIGFuZCBhZHZhbmNlIG9ubHkgMSBieXRlXG4gICAgICBjb2RlUG9pbnQgPSAweEZGRkRcbiAgICAgIGJ5dGVzUGVyU2VxdWVuY2UgPSAxXG4gICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPiAweEZGRkYpIHtcbiAgICAgIC8vIGVuY29kZSB0byB1dGYxNiAoc3Vycm9nYXRlIHBhaXIgZGFuY2UpXG4gICAgICBjb2RlUG9pbnQgLT0gMHgxMDAwMFxuICAgICAgcmVzLnB1c2goY29kZVBvaW50ID4+PiAxMCAmIDB4M0ZGIHwgMHhEODAwKVxuICAgICAgY29kZVBvaW50ID0gMHhEQzAwIHwgY29kZVBvaW50ICYgMHgzRkZcbiAgICB9XG5cbiAgICByZXMucHVzaChjb2RlUG9pbnQpXG4gICAgaSArPSBieXRlc1BlclNlcXVlbmNlXG4gIH1cblxuICByZXR1cm4gZGVjb2RlQ29kZVBvaW50c0FycmF5KHJlcylcbn1cblxuLy8gQmFzZWQgb24gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMjI3NDcyNzIvNjgwNzQyLCB0aGUgYnJvd3NlciB3aXRoXG4vLyB0aGUgbG93ZXN0IGxpbWl0IGlzIENocm9tZSwgd2l0aCAweDEwMDAwIGFyZ3MuXG4vLyBXZSBnbyAxIG1hZ25pdHVkZSBsZXNzLCBmb3Igc2FmZXR5XG52YXIgTUFYX0FSR1VNRU5UU19MRU5HVEggPSAweDEwMDBcblxuZnVuY3Rpb24gZGVjb2RlQ29kZVBvaW50c0FycmF5IChjb2RlUG9pbnRzKSB7XG4gIHZhciBsZW4gPSBjb2RlUG9pbnRzLmxlbmd0aFxuICBpZiAobGVuIDw9IE1BWF9BUkdVTUVOVFNfTEVOR1RIKSB7XG4gICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLCBjb2RlUG9pbnRzKSAvLyBhdm9pZCBleHRyYSBzbGljZSgpXG4gIH1cblxuICAvLyBEZWNvZGUgaW4gY2h1bmtzIHRvIGF2b2lkIFwiY2FsbCBzdGFjayBzaXplIGV4Y2VlZGVkXCIuXG4gIHZhciByZXMgPSAnJ1xuICB2YXIgaSA9IDBcbiAgd2hpbGUgKGkgPCBsZW4pIHtcbiAgICByZXMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShcbiAgICAgIFN0cmluZyxcbiAgICAgIGNvZGVQb2ludHMuc2xpY2UoaSwgaSArPSBNQVhfQVJHVU1FTlRTX0xFTkdUSClcbiAgICApXG4gIH1cbiAgcmV0dXJuIHJlc1xufVxuXG5mdW5jdGlvbiBhc2NpaVNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIHJldCA9ICcnXG4gIGVuZCA9IE1hdGgubWluKGJ1Zi5sZW5ndGgsIGVuZClcblxuICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkge1xuICAgIHJldCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ1ZltpXSAmIDB4N0YpXG4gIH1cbiAgcmV0dXJuIHJldFxufVxuXG5mdW5jdGlvbiBsYXRpbjFTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIHZhciByZXQgPSAnJ1xuICBlbmQgPSBNYXRoLm1pbihidWYubGVuZ3RoLCBlbmQpXG5cbiAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHtcbiAgICByZXQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShidWZbaV0pXG4gIH1cbiAgcmV0dXJuIHJldFxufVxuXG5mdW5jdGlvbiBoZXhTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIHZhciBsZW4gPSBidWYubGVuZ3RoXG5cbiAgaWYgKCFzdGFydCB8fCBzdGFydCA8IDApIHN0YXJ0ID0gMFxuICBpZiAoIWVuZCB8fCBlbmQgPCAwIHx8IGVuZCA+IGxlbikgZW5kID0gbGVuXG5cbiAgdmFyIG91dCA9ICcnXG4gIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7XG4gICAgb3V0ICs9IHRvSGV4KGJ1ZltpXSlcbiAgfVxuICByZXR1cm4gb3V0XG59XG5cbmZ1bmN0aW9uIHV0ZjE2bGVTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIHZhciBieXRlcyA9IGJ1Zi5zbGljZShzdGFydCwgZW5kKVxuICB2YXIgcmVzID0gJydcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGg7IGkgKz0gMikge1xuICAgIHJlcyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ5dGVzW2ldICsgYnl0ZXNbaSArIDFdICogMjU2KVxuICB9XG4gIHJldHVybiByZXNcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5zbGljZSA9IGZ1bmN0aW9uIHNsaWNlIChzdGFydCwgZW5kKSB7XG4gIHZhciBsZW4gPSB0aGlzLmxlbmd0aFxuICBzdGFydCA9IH5+c3RhcnRcbiAgZW5kID0gZW5kID09PSB1bmRlZmluZWQgPyBsZW4gOiB+fmVuZFxuXG4gIGlmIChzdGFydCA8IDApIHtcbiAgICBzdGFydCArPSBsZW5cbiAgICBpZiAoc3RhcnQgPCAwKSBzdGFydCA9IDBcbiAgfSBlbHNlIGlmIChzdGFydCA+IGxlbikge1xuICAgIHN0YXJ0ID0gbGVuXG4gIH1cblxuICBpZiAoZW5kIDwgMCkge1xuICAgIGVuZCArPSBsZW5cbiAgICBpZiAoZW5kIDwgMCkgZW5kID0gMFxuICB9IGVsc2UgaWYgKGVuZCA+IGxlbikge1xuICAgIGVuZCA9IGxlblxuICB9XG5cbiAgaWYgKGVuZCA8IHN0YXJ0KSBlbmQgPSBzdGFydFxuXG4gIHZhciBuZXdCdWZcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgbmV3QnVmID0gdGhpcy5zdWJhcnJheShzdGFydCwgZW5kKVxuICAgIG5ld0J1Zi5fX3Byb3RvX18gPSBCdWZmZXIucHJvdG90eXBlXG4gIH0gZWxzZSB7XG4gICAgdmFyIHNsaWNlTGVuID0gZW5kIC0gc3RhcnRcbiAgICBuZXdCdWYgPSBuZXcgQnVmZmVyKHNsaWNlTGVuLCB1bmRlZmluZWQpXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzbGljZUxlbjsgKytpKSB7XG4gICAgICBuZXdCdWZbaV0gPSB0aGlzW2kgKyBzdGFydF1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3QnVmXG59XG5cbi8qXG4gKiBOZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IGJ1ZmZlciBpc24ndCB0cnlpbmcgdG8gd3JpdGUgb3V0IG9mIGJvdW5kcy5cbiAqL1xuZnVuY3Rpb24gY2hlY2tPZmZzZXQgKG9mZnNldCwgZXh0LCBsZW5ndGgpIHtcbiAgaWYgKChvZmZzZXQgJSAxKSAhPT0gMCB8fCBvZmZzZXQgPCAwKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignb2Zmc2V0IGlzIG5vdCB1aW50JylcbiAgaWYgKG9mZnNldCArIGV4dCA+IGxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RyeWluZyB0byBhY2Nlc3MgYmV5b25kIGJ1ZmZlciBsZW5ndGgnKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50TEUgPSBmdW5jdGlvbiByZWFkVUludExFIChvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG5cbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0XVxuICB2YXIgbXVsID0gMVxuICB2YXIgaSA9IDBcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyBpXSAqIG11bFxuICB9XG5cbiAgcmV0dXJuIHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50QkUgPSBmdW5jdGlvbiByZWFkVUludEJFIChvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgsIHRoaXMubGVuZ3RoKVxuICB9XG5cbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0ICsgLS1ieXRlTGVuZ3RoXVxuICB2YXIgbXVsID0gMVxuICB3aGlsZSAoYnl0ZUxlbmd0aCA+IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyAtLWJ5dGVMZW5ndGhdICogbXVsXG4gIH1cblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQ4ID0gZnVuY3Rpb24gcmVhZFVJbnQ4IChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMSwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiB0aGlzW29mZnNldF1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDE2TEUgPSBmdW5jdGlvbiByZWFkVUludDE2TEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIHRoaXNbb2Zmc2V0XSB8ICh0aGlzW29mZnNldCArIDFdIDw8IDgpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQxNkJFID0gZnVuY3Rpb24gcmVhZFVJbnQxNkJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiAodGhpc1tvZmZzZXRdIDw8IDgpIHwgdGhpc1tvZmZzZXQgKyAxXVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MzJMRSA9IGZ1bmN0aW9uIHJlYWRVSW50MzJMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAoKHRoaXNbb2Zmc2V0XSkgfFxuICAgICAgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgOCkgfFxuICAgICAgKHRoaXNbb2Zmc2V0ICsgMl0gPDwgMTYpKSArXG4gICAgICAodGhpc1tvZmZzZXQgKyAzXSAqIDB4MTAwMDAwMClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDMyQkUgPSBmdW5jdGlvbiByZWFkVUludDMyQkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcblxuICByZXR1cm4gKHRoaXNbb2Zmc2V0XSAqIDB4MTAwMDAwMCkgK1xuICAgICgodGhpc1tvZmZzZXQgKyAxXSA8PCAxNikgfFxuICAgICh0aGlzW29mZnNldCArIDJdIDw8IDgpIHxcbiAgICB0aGlzW29mZnNldCArIDNdKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnRMRSA9IGZ1bmN0aW9uIHJlYWRJbnRMRSAob2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgsIHRoaXMubGVuZ3RoKVxuXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldF1cbiAgdmFyIG11bCA9IDFcbiAgdmFyIGkgPSAwXG4gIHdoaWxlICgrK2kgPCBieXRlTGVuZ3RoICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgaV0gKiBtdWxcbiAgfVxuICBtdWwgKj0gMHg4MFxuXG4gIGlmICh2YWwgPj0gbXVsKSB2YWwgLT0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGgpXG5cbiAgcmV0dXJuIHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnRCRSA9IGZ1bmN0aW9uIHJlYWRJbnRCRSAob2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgsIHRoaXMubGVuZ3RoKVxuXG4gIHZhciBpID0gYnl0ZUxlbmd0aFxuICB2YXIgbXVsID0gMVxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXQgKyAtLWldXG4gIHdoaWxlIChpID4gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHZhbCArPSB0aGlzW29mZnNldCArIC0taV0gKiBtdWxcbiAgfVxuICBtdWwgKj0gMHg4MFxuXG4gIGlmICh2YWwgPj0gbXVsKSB2YWwgLT0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGgpXG5cbiAgcmV0dXJuIHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQ4ID0gZnVuY3Rpb24gcmVhZEludDggKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAxLCB0aGlzLmxlbmd0aClcbiAgaWYgKCEodGhpc1tvZmZzZXRdICYgMHg4MCkpIHJldHVybiAodGhpc1tvZmZzZXRdKVxuICByZXR1cm4gKCgweGZmIC0gdGhpc1tvZmZzZXRdICsgMSkgKiAtMSlcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MTZMRSA9IGZ1bmN0aW9uIHJlYWRJbnQxNkxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldF0gfCAodGhpc1tvZmZzZXQgKyAxXSA8PCA4KVxuICByZXR1cm4gKHZhbCAmIDB4ODAwMCkgPyB2YWwgfCAweEZGRkYwMDAwIDogdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDE2QkUgPSBmdW5jdGlvbiByZWFkSW50MTZCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKVxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXQgKyAxXSB8ICh0aGlzW29mZnNldF0gPDwgOClcbiAgcmV0dXJuICh2YWwgJiAweDgwMDApID8gdmFsIHwgMHhGRkZGMDAwMCA6IHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQzMkxFID0gZnVuY3Rpb24gcmVhZEludDMyTEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcblxuICByZXR1cm4gKHRoaXNbb2Zmc2V0XSkgfFxuICAgICh0aGlzW29mZnNldCArIDFdIDw8IDgpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAyXSA8PCAxNikgfFxuICAgICh0aGlzW29mZnNldCArIDNdIDw8IDI0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQzMkJFID0gZnVuY3Rpb24gcmVhZEludDMyQkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcblxuICByZXR1cm4gKHRoaXNbb2Zmc2V0XSA8PCAyNCkgfFxuICAgICh0aGlzW29mZnNldCArIDFdIDw8IDE2KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMl0gPDwgOCkgfFxuICAgICh0aGlzW29mZnNldCArIDNdKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRGbG9hdExFID0gZnVuY3Rpb24gcmVhZEZsb2F0TEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBvZmZzZXQsIHRydWUsIDIzLCA0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRGbG9hdEJFID0gZnVuY3Rpb24gcmVhZEZsb2F0QkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBvZmZzZXQsIGZhbHNlLCAyMywgNClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRG91YmxlTEUgPSBmdW5jdGlvbiByZWFkRG91YmxlTEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA4LCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBvZmZzZXQsIHRydWUsIDUyLCA4KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWREb3VibGVCRSA9IGZ1bmN0aW9uIHJlYWREb3VibGVCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDgsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgZmFsc2UsIDUyLCA4KVxufVxuXG5mdW5jdGlvbiBjaGVja0ludCAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBleHQsIG1heCwgbWluKSB7XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKGJ1ZikpIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wiYnVmZmVyXCIgYXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlciBpbnN0YW5jZScpXG4gIGlmICh2YWx1ZSA+IG1heCB8fCB2YWx1ZSA8IG1pbikgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1widmFsdWVcIiBhcmd1bWVudCBpcyBvdXQgb2YgYm91bmRzJylcbiAgaWYgKG9mZnNldCArIGV4dCA+IGJ1Zi5sZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbmRleCBvdXQgb2YgcmFuZ2UnKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludExFID0gZnVuY3Rpb24gd3JpdGVVSW50TEUgKHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICB2YXIgbWF4Qnl0ZXMgPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCkgLSAxXG4gICAgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbWF4Qnl0ZXMsIDApXG4gIH1cblxuICB2YXIgbXVsID0gMVxuICB2YXIgaSA9IDBcbiAgdGhpc1tvZmZzZXRdID0gdmFsdWUgJiAweEZGXG4gIHdoaWxlICgrK2kgPCBieXRlTGVuZ3RoICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdGhpc1tvZmZzZXQgKyBpXSA9ICh2YWx1ZSAvIG11bCkgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludEJFID0gZnVuY3Rpb24gd3JpdGVVSW50QkUgKHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICB2YXIgbWF4Qnl0ZXMgPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCkgLSAxXG4gICAgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbWF4Qnl0ZXMsIDApXG4gIH1cblxuICB2YXIgaSA9IGJ5dGVMZW5ndGggLSAxXG4gIHZhciBtdWwgPSAxXG4gIHRoaXNbb2Zmc2V0ICsgaV0gPSB2YWx1ZSAmIDB4RkZcbiAgd2hpbGUgKC0taSA+PSAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdGhpc1tvZmZzZXQgKyBpXSA9ICh2YWx1ZSAvIG11bCkgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDggPSBmdW5jdGlvbiB3cml0ZVVJbnQ4ICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDEsIDB4ZmYsIDApXG4gIGlmICghQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHZhbHVlID0gTWF0aC5mbG9vcih2YWx1ZSlcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgcmV0dXJuIG9mZnNldCArIDFcbn1cblxuZnVuY3Rpb24gb2JqZWN0V3JpdGVVSW50MTYgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuKSB7XG4gIGlmICh2YWx1ZSA8IDApIHZhbHVlID0gMHhmZmZmICsgdmFsdWUgKyAxXG4gIGZvciAodmFyIGkgPSAwLCBqID0gTWF0aC5taW4oYnVmLmxlbmd0aCAtIG9mZnNldCwgMik7IGkgPCBqOyArK2kpIHtcbiAgICBidWZbb2Zmc2V0ICsgaV0gPSAodmFsdWUgJiAoMHhmZiA8PCAoOCAqIChsaXR0bGVFbmRpYW4gPyBpIDogMSAtIGkpKSkpID4+PlxuICAgICAgKGxpdHRsZUVuZGlhbiA/IGkgOiAxIC0gaSkgKiA4XG4gIH1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQxNkxFID0gZnVuY3Rpb24gd3JpdGVVSW50MTZMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweGZmZmYsIDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gOClcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQxNih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyAyXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MTZCRSA9IGZ1bmN0aW9uIHdyaXRlVUludDE2QkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHhmZmZmLCAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDgpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MTYodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDJcbn1cblxuZnVuY3Rpb24gb2JqZWN0V3JpdGVVSW50MzIgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuKSB7XG4gIGlmICh2YWx1ZSA8IDApIHZhbHVlID0gMHhmZmZmZmZmZiArIHZhbHVlICsgMVxuICBmb3IgKHZhciBpID0gMCwgaiA9IE1hdGgubWluKGJ1Zi5sZW5ndGggLSBvZmZzZXQsIDQpOyBpIDwgajsgKytpKSB7XG4gICAgYnVmW29mZnNldCArIGldID0gKHZhbHVlID4+PiAobGl0dGxlRW5kaWFuID8gaSA6IDMgLSBpKSAqIDgpICYgMHhmZlxuICB9XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MzJMRSA9IGZ1bmN0aW9uIHdyaXRlVUludDMyTEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHhmZmZmZmZmZiwgMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSA+Pj4gMjQpXG4gICAgdGhpc1tvZmZzZXQgKyAyXSA9ICh2YWx1ZSA+Pj4gMTYpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gOClcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDMyKHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQzMkJFID0gZnVuY3Rpb24gd3JpdGVVSW50MzJCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweGZmZmZmZmZmLCAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDI0KVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDE2KVxuICAgIHRoaXNbb2Zmc2V0ICsgMl0gPSAodmFsdWUgPj4+IDgpXG4gICAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MzIodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludExFID0gZnVuY3Rpb24gd3JpdGVJbnRMRSAodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgdmFyIGxpbWl0ID0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGggLSAxKVxuXG4gICAgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbGltaXQgLSAxLCAtbGltaXQpXG4gIH1cblxuICB2YXIgaSA9IDBcbiAgdmFyIG11bCA9IDFcbiAgdmFyIHN1YiA9IDBcbiAgdGhpc1tvZmZzZXRdID0gdmFsdWUgJiAweEZGXG4gIHdoaWxlICgrK2kgPCBieXRlTGVuZ3RoICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgaWYgKHZhbHVlIDwgMCAmJiBzdWIgPT09IDAgJiYgdGhpc1tvZmZzZXQgKyBpIC0gMV0gIT09IDApIHtcbiAgICAgIHN1YiA9IDFcbiAgICB9XG4gICAgdGhpc1tvZmZzZXQgKyBpXSA9ICgodmFsdWUgLyBtdWwpID4+IDApIC0gc3ViICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludEJFID0gZnVuY3Rpb24gd3JpdGVJbnRCRSAodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgdmFyIGxpbWl0ID0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGggLSAxKVxuXG4gICAgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbGltaXQgLSAxLCAtbGltaXQpXG4gIH1cblxuICB2YXIgaSA9IGJ5dGVMZW5ndGggLSAxXG4gIHZhciBtdWwgPSAxXG4gIHZhciBzdWIgPSAwXG4gIHRoaXNbb2Zmc2V0ICsgaV0gPSB2YWx1ZSAmIDB4RkZcbiAgd2hpbGUgKC0taSA+PSAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgaWYgKHZhbHVlIDwgMCAmJiBzdWIgPT09IDAgJiYgdGhpc1tvZmZzZXQgKyBpICsgMV0gIT09IDApIHtcbiAgICAgIHN1YiA9IDFcbiAgICB9XG4gICAgdGhpc1tvZmZzZXQgKyBpXSA9ICgodmFsdWUgLyBtdWwpID4+IDApIC0gc3ViICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDggPSBmdW5jdGlvbiB3cml0ZUludDggKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMSwgMHg3ZiwgLTB4ODApXG4gIGlmICghQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHZhbHVlID0gTWF0aC5mbG9vcih2YWx1ZSlcbiAgaWYgKHZhbHVlIDwgMCkgdmFsdWUgPSAweGZmICsgdmFsdWUgKyAxXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHJldHVybiBvZmZzZXQgKyAxXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQxNkxFID0gZnVuY3Rpb24gd3JpdGVJbnQxNkxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4N2ZmZiwgLTB4ODAwMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDE2KHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDJcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDE2QkUgPSBmdW5jdGlvbiB3cml0ZUludDE2QkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHg3ZmZmLCAtMHg4MDAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDgpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MTYodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDJcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDMyTEUgPSBmdW5jdGlvbiB3cml0ZUludDMyTEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHg3ZmZmZmZmZiwgLTB4ODAwMDAwMDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gOClcbiAgICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiAxNilcbiAgICB0aGlzW29mZnNldCArIDNdID0gKHZhbHVlID4+PiAyNClcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQzMih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQzMkJFID0gZnVuY3Rpb24gd3JpdGVJbnQzMkJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4N2ZmZmZmZmYsIC0weDgwMDAwMDAwKVxuICBpZiAodmFsdWUgPCAwKSB2YWx1ZSA9IDB4ZmZmZmZmZmYgKyB2YWx1ZSArIDFcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlID4+PiAyNClcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiAxNilcbiAgICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiA4KVxuICAgIHRoaXNbb2Zmc2V0ICsgM10gPSAodmFsdWUgJiAweGZmKVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDMyKHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbmZ1bmN0aW9uIGNoZWNrSUVFRTc1NCAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBleHQsIG1heCwgbWluKSB7XG4gIGlmIChvZmZzZXQgKyBleHQgPiBidWYubGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW5kZXggb3V0IG9mIHJhbmdlJylcbiAgaWYgKG9mZnNldCA8IDApIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbmRleCBvdXQgb2YgcmFuZ2UnKVxufVxuXG5mdW5jdGlvbiB3cml0ZUZsb2F0IChidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIGNoZWNrSUVFRTc1NChidWYsIHZhbHVlLCBvZmZzZXQsIDQsIDMuNDAyODIzNDY2Mzg1Mjg4NmUrMzgsIC0zLjQwMjgyMzQ2NjM4NTI4ODZlKzM4KVxuICB9XG4gIGllZWU3NTQud3JpdGUoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIDIzLCA0KVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlRmxvYXRMRSA9IGZ1bmN0aW9uIHdyaXRlRmxvYXRMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIHdyaXRlRmxvYXQodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSwgbm9Bc3NlcnQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVGbG9hdEJFID0gZnVuY3Rpb24gd3JpdGVGbG9hdEJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gd3JpdGVGbG9hdCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSwgbm9Bc3NlcnQpXG59XG5cbmZ1bmN0aW9uIHdyaXRlRG91YmxlIChidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIGNoZWNrSUVFRTc1NChidWYsIHZhbHVlLCBvZmZzZXQsIDgsIDEuNzk3NjkzMTM0ODYyMzE1N0UrMzA4LCAtMS43OTc2OTMxMzQ4NjIzMTU3RSszMDgpXG4gIH1cbiAgaWVlZTc1NC53cml0ZShidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgNTIsIDgpXG4gIHJldHVybiBvZmZzZXQgKyA4XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVEb3VibGVMRSA9IGZ1bmN0aW9uIHdyaXRlRG91YmxlTEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZURvdWJsZSh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlLCBub0Fzc2VydClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZURvdWJsZUJFID0gZnVuY3Rpb24gd3JpdGVEb3VibGVCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIHdyaXRlRG91YmxlKHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlLCBub0Fzc2VydClcbn1cblxuLy8gY29weSh0YXJnZXRCdWZmZXIsIHRhcmdldFN0YXJ0PTAsIHNvdXJjZVN0YXJ0PTAsIHNvdXJjZUVuZD1idWZmZXIubGVuZ3RoKVxuQnVmZmVyLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gY29weSAodGFyZ2V0LCB0YXJnZXRTdGFydCwgc3RhcnQsIGVuZCkge1xuICBpZiAoIXN0YXJ0KSBzdGFydCA9IDBcbiAgaWYgKCFlbmQgJiYgZW5kICE9PSAwKSBlbmQgPSB0aGlzLmxlbmd0aFxuICBpZiAodGFyZ2V0U3RhcnQgPj0gdGFyZ2V0Lmxlbmd0aCkgdGFyZ2V0U3RhcnQgPSB0YXJnZXQubGVuZ3RoXG4gIGlmICghdGFyZ2V0U3RhcnQpIHRhcmdldFN0YXJ0ID0gMFxuICBpZiAoZW5kID4gMCAmJiBlbmQgPCBzdGFydCkgZW5kID0gc3RhcnRcblxuICAvLyBDb3B5IDAgYnl0ZXM7IHdlJ3JlIGRvbmVcbiAgaWYgKGVuZCA9PT0gc3RhcnQpIHJldHVybiAwXG4gIGlmICh0YXJnZXQubGVuZ3RoID09PSAwIHx8IHRoaXMubGVuZ3RoID09PSAwKSByZXR1cm4gMFxuXG4gIC8vIEZhdGFsIGVycm9yIGNvbmRpdGlvbnNcbiAgaWYgKHRhcmdldFN0YXJ0IDwgMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCd0YXJnZXRTdGFydCBvdXQgb2YgYm91bmRzJylcbiAgfVxuICBpZiAoc3RhcnQgPCAwIHx8IHN0YXJ0ID49IHRoaXMubGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignc291cmNlU3RhcnQgb3V0IG9mIGJvdW5kcycpXG4gIGlmIChlbmQgPCAwKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignc291cmNlRW5kIG91dCBvZiBib3VuZHMnKVxuXG4gIC8vIEFyZSB3ZSBvb2I/XG4gIGlmIChlbmQgPiB0aGlzLmxlbmd0aCkgZW5kID0gdGhpcy5sZW5ndGhcbiAgaWYgKHRhcmdldC5sZW5ndGggLSB0YXJnZXRTdGFydCA8IGVuZCAtIHN0YXJ0KSB7XG4gICAgZW5kID0gdGFyZ2V0Lmxlbmd0aCAtIHRhcmdldFN0YXJ0ICsgc3RhcnRcbiAgfVxuXG4gIHZhciBsZW4gPSBlbmQgLSBzdGFydFxuICB2YXIgaVxuXG4gIGlmICh0aGlzID09PSB0YXJnZXQgJiYgc3RhcnQgPCB0YXJnZXRTdGFydCAmJiB0YXJnZXRTdGFydCA8IGVuZCkge1xuICAgIC8vIGRlc2NlbmRpbmcgY29weSBmcm9tIGVuZFxuICAgIGZvciAoaSA9IGxlbiAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICB0YXJnZXRbaSArIHRhcmdldFN0YXJ0XSA9IHRoaXNbaSArIHN0YXJ0XVxuICAgIH1cbiAgfSBlbHNlIGlmIChsZW4gPCAxMDAwIHx8ICFCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIC8vIGFzY2VuZGluZyBjb3B5IGZyb20gc3RhcnRcbiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyArK2kpIHtcbiAgICAgIHRhcmdldFtpICsgdGFyZ2V0U3RhcnRdID0gdGhpc1tpICsgc3RhcnRdXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIFVpbnQ4QXJyYXkucHJvdG90eXBlLnNldC5jYWxsKFxuICAgICAgdGFyZ2V0LFxuICAgICAgdGhpcy5zdWJhcnJheShzdGFydCwgc3RhcnQgKyBsZW4pLFxuICAgICAgdGFyZ2V0U3RhcnRcbiAgICApXG4gIH1cblxuICByZXR1cm4gbGVuXG59XG5cbi8vIFVzYWdlOlxuLy8gICAgYnVmZmVyLmZpbGwobnVtYmVyWywgb2Zmc2V0WywgZW5kXV0pXG4vLyAgICBidWZmZXIuZmlsbChidWZmZXJbLCBvZmZzZXRbLCBlbmRdXSlcbi8vICAgIGJ1ZmZlci5maWxsKHN0cmluZ1ssIG9mZnNldFssIGVuZF1dWywgZW5jb2RpbmddKVxuQnVmZmVyLnByb3RvdHlwZS5maWxsID0gZnVuY3Rpb24gZmlsbCAodmFsLCBzdGFydCwgZW5kLCBlbmNvZGluZykge1xuICAvLyBIYW5kbGUgc3RyaW5nIGNhc2VzOlxuICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpIHtcbiAgICBpZiAodHlwZW9mIHN0YXJ0ID09PSAnc3RyaW5nJykge1xuICAgICAgZW5jb2RpbmcgPSBzdGFydFxuICAgICAgc3RhcnQgPSAwXG4gICAgICBlbmQgPSB0aGlzLmxlbmd0aFxuICAgIH0gZWxzZSBpZiAodHlwZW9mIGVuZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGVuY29kaW5nID0gZW5kXG4gICAgICBlbmQgPSB0aGlzLmxlbmd0aFxuICAgIH1cbiAgICBpZiAodmFsLmxlbmd0aCA9PT0gMSkge1xuICAgICAgdmFyIGNvZGUgPSB2YWwuY2hhckNvZGVBdCgwKVxuICAgICAgaWYgKGNvZGUgPCAyNTYpIHtcbiAgICAgICAgdmFsID0gY29kZVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZW5jb2RpbmcgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgZW5jb2RpbmcgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdlbmNvZGluZyBtdXN0IGJlIGEgc3RyaW5nJylcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ3N0cmluZycgJiYgIUJ1ZmZlci5pc0VuY29kaW5nKGVuY29kaW5nKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKVxuICAgIH1cbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJykge1xuICAgIHZhbCA9IHZhbCAmIDI1NVxuICB9XG5cbiAgLy8gSW52YWxpZCByYW5nZXMgYXJlIG5vdCBzZXQgdG8gYSBkZWZhdWx0LCBzbyBjYW4gcmFuZ2UgY2hlY2sgZWFybHkuXG4gIGlmIChzdGFydCA8IDAgfHwgdGhpcy5sZW5ndGggPCBzdGFydCB8fCB0aGlzLmxlbmd0aCA8IGVuZCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdPdXQgb2YgcmFuZ2UgaW5kZXgnKVxuICB9XG5cbiAgaWYgKGVuZCA8PSBzdGFydCkge1xuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICBzdGFydCA9IHN0YXJ0ID4+PiAwXG4gIGVuZCA9IGVuZCA9PT0gdW5kZWZpbmVkID8gdGhpcy5sZW5ndGggOiBlbmQgPj4+IDBcblxuICBpZiAoIXZhbCkgdmFsID0gMFxuXG4gIHZhciBpXG4gIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJykge1xuICAgIGZvciAoaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHtcbiAgICAgIHRoaXNbaV0gPSB2YWxcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdmFyIGJ5dGVzID0gQnVmZmVyLmlzQnVmZmVyKHZhbClcbiAgICAgID8gdmFsXG4gICAgICA6IHV0ZjhUb0J5dGVzKG5ldyBCdWZmZXIodmFsLCBlbmNvZGluZykudG9TdHJpbmcoKSlcbiAgICB2YXIgbGVuID0gYnl0ZXMubGVuZ3RoXG4gICAgZm9yIChpID0gMDsgaSA8IGVuZCAtIHN0YXJ0OyArK2kpIHtcbiAgICAgIHRoaXNbaSArIHN0YXJ0XSA9IGJ5dGVzW2kgJSBsZW5dXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRoaXNcbn1cblxuLy8gSEVMUEVSIEZVTkNUSU9OU1xuLy8gPT09PT09PT09PT09PT09PVxuXG52YXIgSU5WQUxJRF9CQVNFNjRfUkUgPSAvW14rXFwvMC05QS1aYS16LV9dL2dcblxuZnVuY3Rpb24gYmFzZTY0Y2xlYW4gKHN0cikge1xuICAvLyBOb2RlIHN0cmlwcyBvdXQgaW52YWxpZCBjaGFyYWN0ZXJzIGxpa2UgXFxuIGFuZCBcXHQgZnJvbSB0aGUgc3RyaW5nLCBiYXNlNjQtanMgZG9lcyBub3RcbiAgc3RyID0gc3RyaW5ndHJpbShzdHIpLnJlcGxhY2UoSU5WQUxJRF9CQVNFNjRfUkUsICcnKVxuICAvLyBOb2RlIGNvbnZlcnRzIHN0cmluZ3Mgd2l0aCBsZW5ndGggPCAyIHRvICcnXG4gIGlmIChzdHIubGVuZ3RoIDwgMikgcmV0dXJuICcnXG4gIC8vIE5vZGUgYWxsb3dzIGZvciBub24tcGFkZGVkIGJhc2U2NCBzdHJpbmdzIChtaXNzaW5nIHRyYWlsaW5nID09PSksIGJhc2U2NC1qcyBkb2VzIG5vdFxuICB3aGlsZSAoc3RyLmxlbmd0aCAlIDQgIT09IDApIHtcbiAgICBzdHIgPSBzdHIgKyAnPSdcbiAgfVxuICByZXR1cm4gc3RyXG59XG5cbmZ1bmN0aW9uIHN0cmluZ3RyaW0gKHN0cikge1xuICBpZiAoc3RyLnRyaW0pIHJldHVybiBzdHIudHJpbSgpXG4gIHJldHVybiBzdHIucmVwbGFjZSgvXlxccyt8XFxzKyQvZywgJycpXG59XG5cbmZ1bmN0aW9uIHRvSGV4IChuKSB7XG4gIGlmIChuIDwgMTYpIHJldHVybiAnMCcgKyBuLnRvU3RyaW5nKDE2KVxuICByZXR1cm4gbi50b1N0cmluZygxNilcbn1cblxuZnVuY3Rpb24gdXRmOFRvQnl0ZXMgKHN0cmluZywgdW5pdHMpIHtcbiAgdW5pdHMgPSB1bml0cyB8fCBJbmZpbml0eVxuICB2YXIgY29kZVBvaW50XG4gIHZhciBsZW5ndGggPSBzdHJpbmcubGVuZ3RoXG4gIHZhciBsZWFkU3Vycm9nYXRlID0gbnVsbFxuICB2YXIgYnl0ZXMgPSBbXVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICBjb2RlUG9pbnQgPSBzdHJpbmcuY2hhckNvZGVBdChpKVxuXG4gICAgLy8gaXMgc3Vycm9nYXRlIGNvbXBvbmVudFxuICAgIGlmIChjb2RlUG9pbnQgPiAweEQ3RkYgJiYgY29kZVBvaW50IDwgMHhFMDAwKSB7XG4gICAgICAvLyBsYXN0IGNoYXIgd2FzIGEgbGVhZFxuICAgICAgaWYgKCFsZWFkU3Vycm9nYXRlKSB7XG4gICAgICAgIC8vIG5vIGxlYWQgeWV0XG4gICAgICAgIGlmIChjb2RlUG9pbnQgPiAweERCRkYpIHtcbiAgICAgICAgICAvLyB1bmV4cGVjdGVkIHRyYWlsXG4gICAgICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfSBlbHNlIGlmIChpICsgMSA9PT0gbGVuZ3RoKSB7XG4gICAgICAgICAgLy8gdW5wYWlyZWQgbGVhZFxuICAgICAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKVxuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cblxuICAgICAgICAvLyB2YWxpZCBsZWFkXG4gICAgICAgIGxlYWRTdXJyb2dhdGUgPSBjb2RlUG9pbnRcblxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICAvLyAyIGxlYWRzIGluIGEgcm93XG4gICAgICBpZiAoY29kZVBvaW50IDwgMHhEQzAwKSB7XG4gICAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKVxuICAgICAgICBsZWFkU3Vycm9nYXRlID0gY29kZVBvaW50XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIC8vIHZhbGlkIHN1cnJvZ2F0ZSBwYWlyXG4gICAgICBjb2RlUG9pbnQgPSAobGVhZFN1cnJvZ2F0ZSAtIDB4RDgwMCA8PCAxMCB8IGNvZGVQb2ludCAtIDB4REMwMCkgKyAweDEwMDAwXG4gICAgfSBlbHNlIGlmIChsZWFkU3Vycm9nYXRlKSB7XG4gICAgICAvLyB2YWxpZCBibXAgY2hhciwgYnV0IGxhc3QgY2hhciB3YXMgYSBsZWFkXG4gICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRClcbiAgICB9XG5cbiAgICBsZWFkU3Vycm9nYXRlID0gbnVsbFxuXG4gICAgLy8gZW5jb2RlIHV0ZjhcbiAgICBpZiAoY29kZVBvaW50IDwgMHg4MCkge1xuICAgICAgaWYgKCh1bml0cyAtPSAxKSA8IDApIGJyZWFrXG4gICAgICBieXRlcy5wdXNoKGNvZGVQb2ludClcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA8IDB4ODAwKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDIpIDwgMCkgYnJlYWtcbiAgICAgIGJ5dGVzLnB1c2goXG4gICAgICAgIGNvZGVQb2ludCA+PiAweDYgfCAweEMwLFxuICAgICAgICBjb2RlUG9pbnQgJiAweDNGIHwgMHg4MFxuICAgICAgKVxuICAgIH0gZWxzZSBpZiAoY29kZVBvaW50IDwgMHgxMDAwMCkge1xuICAgICAgaWYgKCh1bml0cyAtPSAzKSA8IDApIGJyZWFrXG4gICAgICBieXRlcy5wdXNoKFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHhDIHwgMHhFMCxcbiAgICAgICAgY29kZVBvaW50ID4+IDB4NiAmIDB4M0YgfCAweDgwLFxuICAgICAgICBjb2RlUG9pbnQgJiAweDNGIHwgMHg4MFxuICAgICAgKVxuICAgIH0gZWxzZSBpZiAoY29kZVBvaW50IDwgMHgxMTAwMDApIHtcbiAgICAgIGlmICgodW5pdHMgLT0gNCkgPCAwKSBicmVha1xuICAgICAgYnl0ZXMucHVzaChcbiAgICAgICAgY29kZVBvaW50ID4+IDB4MTIgfCAweEYwLFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHhDICYgMHgzRiB8IDB4ODAsXG4gICAgICAgIGNvZGVQb2ludCA+PiAweDYgJiAweDNGIHwgMHg4MCxcbiAgICAgICAgY29kZVBvaW50ICYgMHgzRiB8IDB4ODBcbiAgICAgIClcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGNvZGUgcG9pbnQnKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBieXRlc1xufVxuXG5mdW5jdGlvbiBhc2NpaVRvQnl0ZXMgKHN0cikge1xuICB2YXIgYnl0ZUFycmF5ID0gW11cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyArK2kpIHtcbiAgICAvLyBOb2RlJ3MgY29kZSBzZWVtcyB0byBiZSBkb2luZyB0aGlzIGFuZCBub3QgJiAweDdGLi5cbiAgICBieXRlQXJyYXkucHVzaChzdHIuY2hhckNvZGVBdChpKSAmIDB4RkYpXG4gIH1cbiAgcmV0dXJuIGJ5dGVBcnJheVxufVxuXG5mdW5jdGlvbiB1dGYxNmxlVG9CeXRlcyAoc3RyLCB1bml0cykge1xuICB2YXIgYywgaGksIGxvXG4gIHZhciBieXRlQXJyYXkgPSBbXVxuICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7ICsraSkge1xuICAgIGlmICgodW5pdHMgLT0gMikgPCAwKSBicmVha1xuXG4gICAgYyA9IHN0ci5jaGFyQ29kZUF0KGkpXG4gICAgaGkgPSBjID4+IDhcbiAgICBsbyA9IGMgJSAyNTZcbiAgICBieXRlQXJyYXkucHVzaChsbylcbiAgICBieXRlQXJyYXkucHVzaChoaSlcbiAgfVxuXG4gIHJldHVybiBieXRlQXJyYXlcbn1cblxuZnVuY3Rpb24gYmFzZTY0VG9CeXRlcyAoc3RyKSB7XG4gIHJldHVybiBiYXNlNjQudG9CeXRlQXJyYXkoYmFzZTY0Y2xlYW4oc3RyKSlcbn1cblxuZnVuY3Rpb24gYmxpdEJ1ZmZlciAoc3JjLCBkc3QsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICBpZiAoKGkgKyBvZmZzZXQgPj0gZHN0Lmxlbmd0aCkgfHwgKGkgPj0gc3JjLmxlbmd0aCkpIGJyZWFrXG4gICAgZHN0W2kgKyBvZmZzZXRdID0gc3JjW2ldXG4gIH1cbiAgcmV0dXJuIGlcbn1cblxuZnVuY3Rpb24gaXNuYW4gKHZhbCkge1xuICByZXR1cm4gdmFsICE9PSB2YWwgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1zZWxmLWNvbXBhcmVcbn1cbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///30\n")},function(module,exports,__webpack_require__){eval("/**\n * Hash-based Message Authentication Code implementation. Requires a message\n * digest object that can be obtained, for example, from forge.md.sha1 or\n * forge.md.md5.\n *\n * @author Dave Longley\n *\n * Copyright (c) 2010-2012 Digital Bazaar, Inc. All rights reserved.\n */\nvar forge = __webpack_require__(4);\n__webpack_require__(17);\n__webpack_require__(7);\n\n/* HMAC API */\nvar hmac = module.exports = forge.hmac = forge.hmac || {};\n\n/**\n * Creates an HMAC object that uses the given message digest object.\n *\n * @return an HMAC object.\n */\nhmac.create = function() {\n  // the hmac key to use\n  var _key = null;\n\n  // the message digest to use\n  var _md = null;\n\n  // the inner padding\n  var _ipadding = null;\n\n  // the outer padding\n  var _opadding = null;\n\n  // hmac context\n  var ctx = {};\n\n  /**\n   * Starts or restarts the HMAC with the given key and message digest.\n   *\n   * @param md the message digest to use, null to reuse the previous one,\n   *           a string to use builtin 'sha1', 'md5', 'sha256'.\n   * @param key the key to use as a string, array of bytes, byte buffer,\n   *           or null to reuse the previous key.\n   */\n  ctx.start = function(md, key) {\n    if(md !== null) {\n      if(typeof md === 'string') {\n        // create builtin message digest\n        md = md.toLowerCase();\n        if(md in forge.md.algorithms) {\n          _md = forge.md.algorithms[md].create();\n        } else {\n          throw new Error('Unknown hash algorithm \"' + md + '\"');\n        }\n      } else {\n        // store message digest\n        _md = md;\n      }\n    }\n\n    if(key === null) {\n      // reuse previous key\n      key = _key;\n    } else {\n      if(typeof key === 'string') {\n        // convert string into byte buffer\n        key = forge.util.createBuffer(key);\n      } else if(forge.util.isArray(key)) {\n        // convert byte array into byte buffer\n        var tmp = key;\n        key = forge.util.createBuffer();\n        for(var i = 0; i < tmp.length; ++i) {\n          key.putByte(tmp[i]);\n        }\n      }\n\n      // if key is longer than blocksize, hash it\n      var keylen = key.length();\n      if(keylen > _md.blockLength) {\n        _md.start();\n        _md.update(key.bytes());\n        key = _md.digest();\n      }\n\n      // mix key into inner and outer padding\n      // ipadding = [0x36 * blocksize] ^ key\n      // opadding = [0x5C * blocksize] ^ key\n      _ipadding = forge.util.createBuffer();\n      _opadding = forge.util.createBuffer();\n      keylen = key.length();\n      for(var i = 0; i < keylen; ++i) {\n        var tmp = key.at(i);\n        _ipadding.putByte(0x36 ^ tmp);\n        _opadding.putByte(0x5C ^ tmp);\n      }\n\n      // if key is shorter than blocksize, add additional padding\n      if(keylen < _md.blockLength) {\n        var tmp = _md.blockLength - keylen;\n        for(var i = 0; i < tmp; ++i) {\n          _ipadding.putByte(0x36);\n          _opadding.putByte(0x5C);\n        }\n      }\n      _key = key;\n      _ipadding = _ipadding.bytes();\n      _opadding = _opadding.bytes();\n    }\n\n    // digest is done like so: hash(opadding | hash(ipadding | message))\n\n    // prepare to do inner hash\n    // hash(ipadding | message)\n    _md.start();\n    _md.update(_ipadding);\n  };\n\n  /**\n   * Updates the HMAC with the given message bytes.\n   *\n   * @param bytes the bytes to update with.\n   */\n  ctx.update = function(bytes) {\n    _md.update(bytes);\n  };\n\n  /**\n   * Produces the Message Authentication Code (MAC).\n   *\n   * @return a byte buffer containing the digest value.\n   */\n  ctx.getMac = function() {\n    // digest is done like so: hash(opadding | hash(ipadding | message))\n    // here we do the outer hashing\n    var inner = _md.digest().bytes();\n    _md.start();\n    _md.update(_opadding);\n    _md.update(inner);\n    return _md.digest();\n  };\n  // alias for getMac\n  ctx.digest = ctx.getMac;\n\n  return ctx;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzEuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbm9kZS1mb3JnZS9saWIvaG1hYy5qcz8wM2M4Il0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogSGFzaC1iYXNlZCBNZXNzYWdlIEF1dGhlbnRpY2F0aW9uIENvZGUgaW1wbGVtZW50YXRpb24uIFJlcXVpcmVzIGEgbWVzc2FnZVxuICogZGlnZXN0IG9iamVjdCB0aGF0IGNhbiBiZSBvYnRhaW5lZCwgZm9yIGV4YW1wbGUsIGZyb20gZm9yZ2UubWQuc2hhMSBvclxuICogZm9yZ2UubWQubWQ1LlxuICpcbiAqIEBhdXRob3IgRGF2ZSBMb25nbGV5XG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTIgRGlnaXRhbCBCYXphYXIsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqL1xudmFyIGZvcmdlID0gcmVxdWlyZSgnLi9mb3JnZScpO1xucmVxdWlyZSgnLi9tZCcpO1xucmVxdWlyZSgnLi91dGlsJyk7XG5cbi8qIEhNQUMgQVBJICovXG52YXIgaG1hYyA9IG1vZHVsZS5leHBvcnRzID0gZm9yZ2UuaG1hYyA9IGZvcmdlLmhtYWMgfHwge307XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBITUFDIG9iamVjdCB0aGF0IHVzZXMgdGhlIGdpdmVuIG1lc3NhZ2UgZGlnZXN0IG9iamVjdC5cbiAqXG4gKiBAcmV0dXJuIGFuIEhNQUMgb2JqZWN0LlxuICovXG5obWFjLmNyZWF0ZSA9IGZ1bmN0aW9uKCkge1xuICAvLyB0aGUgaG1hYyBrZXkgdG8gdXNlXG4gIHZhciBfa2V5ID0gbnVsbDtcblxuICAvLyB0aGUgbWVzc2FnZSBkaWdlc3QgdG8gdXNlXG4gIHZhciBfbWQgPSBudWxsO1xuXG4gIC8vIHRoZSBpbm5lciBwYWRkaW5nXG4gIHZhciBfaXBhZGRpbmcgPSBudWxsO1xuXG4gIC8vIHRoZSBvdXRlciBwYWRkaW5nXG4gIHZhciBfb3BhZGRpbmcgPSBudWxsO1xuXG4gIC8vIGhtYWMgY29udGV4dFxuICB2YXIgY3R4ID0ge307XG5cbiAgLyoqXG4gICAqIFN0YXJ0cyBvciByZXN0YXJ0cyB0aGUgSE1BQyB3aXRoIHRoZSBnaXZlbiBrZXkgYW5kIG1lc3NhZ2UgZGlnZXN0LlxuICAgKlxuICAgKiBAcGFyYW0gbWQgdGhlIG1lc3NhZ2UgZGlnZXN0IHRvIHVzZSwgbnVsbCB0byByZXVzZSB0aGUgcHJldmlvdXMgb25lLFxuICAgKiAgICAgICAgICAgYSBzdHJpbmcgdG8gdXNlIGJ1aWx0aW4gJ3NoYTEnLCAnbWQ1JywgJ3NoYTI1NicuXG4gICAqIEBwYXJhbSBrZXkgdGhlIGtleSB0byB1c2UgYXMgYSBzdHJpbmcsIGFycmF5IG9mIGJ5dGVzLCBieXRlIGJ1ZmZlcixcbiAgICogICAgICAgICAgIG9yIG51bGwgdG8gcmV1c2UgdGhlIHByZXZpb3VzIGtleS5cbiAgICovXG4gIGN0eC5zdGFydCA9IGZ1bmN0aW9uKG1kLCBrZXkpIHtcbiAgICBpZihtZCAhPT0gbnVsbCkge1xuICAgICAgaWYodHlwZW9mIG1kID09PSAnc3RyaW5nJykge1xuICAgICAgICAvLyBjcmVhdGUgYnVpbHRpbiBtZXNzYWdlIGRpZ2VzdFxuICAgICAgICBtZCA9IG1kLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmKG1kIGluIGZvcmdlLm1kLmFsZ29yaXRobXMpIHtcbiAgICAgICAgICBfbWQgPSBmb3JnZS5tZC5hbGdvcml0aG1zW21kXS5jcmVhdGUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gaGFzaCBhbGdvcml0aG0gXCInICsgbWQgKyAnXCInKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gc3RvcmUgbWVzc2FnZSBkaWdlc3RcbiAgICAgICAgX21kID0gbWQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYoa2V5ID09PSBudWxsKSB7XG4gICAgICAvLyByZXVzZSBwcmV2aW91cyBrZXlcbiAgICAgIGtleSA9IF9rZXk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmKHR5cGVvZiBrZXkgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIC8vIGNvbnZlcnQgc3RyaW5nIGludG8gYnl0ZSBidWZmZXJcbiAgICAgICAga2V5ID0gZm9yZ2UudXRpbC5jcmVhdGVCdWZmZXIoa2V5KTtcbiAgICAgIH0gZWxzZSBpZihmb3JnZS51dGlsLmlzQXJyYXkoa2V5KSkge1xuICAgICAgICAvLyBjb252ZXJ0IGJ5dGUgYXJyYXkgaW50byBieXRlIGJ1ZmZlclxuICAgICAgICB2YXIgdG1wID0ga2V5O1xuICAgICAgICBrZXkgPSBmb3JnZS51dGlsLmNyZWF0ZUJ1ZmZlcigpO1xuICAgICAgICBmb3IodmFyIGkgPSAwOyBpIDwgdG1wLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAga2V5LnB1dEJ5dGUodG1wW2ldKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBpZiBrZXkgaXMgbG9uZ2VyIHRoYW4gYmxvY2tzaXplLCBoYXNoIGl0XG4gICAgICB2YXIga2V5bGVuID0ga2V5Lmxlbmd0aCgpO1xuICAgICAgaWYoa2V5bGVuID4gX21kLmJsb2NrTGVuZ3RoKSB7XG4gICAgICAgIF9tZC5zdGFydCgpO1xuICAgICAgICBfbWQudXBkYXRlKGtleS5ieXRlcygpKTtcbiAgICAgICAga2V5ID0gX21kLmRpZ2VzdCgpO1xuICAgICAgfVxuXG4gICAgICAvLyBtaXgga2V5IGludG8gaW5uZXIgYW5kIG91dGVyIHBhZGRpbmdcbiAgICAgIC8vIGlwYWRkaW5nID0gWzB4MzYgKiBibG9ja3NpemVdIF4ga2V5XG4gICAgICAvLyBvcGFkZGluZyA9IFsweDVDICogYmxvY2tzaXplXSBeIGtleVxuICAgICAgX2lwYWRkaW5nID0gZm9yZ2UudXRpbC5jcmVhdGVCdWZmZXIoKTtcbiAgICAgIF9vcGFkZGluZyA9IGZvcmdlLnV0aWwuY3JlYXRlQnVmZmVyKCk7XG4gICAgICBrZXlsZW4gPSBrZXkubGVuZ3RoKCk7XG4gICAgICBmb3IodmFyIGkgPSAwOyBpIDwga2V5bGVuOyArK2kpIHtcbiAgICAgICAgdmFyIHRtcCA9IGtleS5hdChpKTtcbiAgICAgICAgX2lwYWRkaW5nLnB1dEJ5dGUoMHgzNiBeIHRtcCk7XG4gICAgICAgIF9vcGFkZGluZy5wdXRCeXRlKDB4NUMgXiB0bXApO1xuICAgICAgfVxuXG4gICAgICAvLyBpZiBrZXkgaXMgc2hvcnRlciB0aGFuIGJsb2Nrc2l6ZSwgYWRkIGFkZGl0aW9uYWwgcGFkZGluZ1xuICAgICAgaWYoa2V5bGVuIDwgX21kLmJsb2NrTGVuZ3RoKSB7XG4gICAgICAgIHZhciB0bXAgPSBfbWQuYmxvY2tMZW5ndGggLSBrZXlsZW47XG4gICAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCB0bXA7ICsraSkge1xuICAgICAgICAgIF9pcGFkZGluZy5wdXRCeXRlKDB4MzYpO1xuICAgICAgICAgIF9vcGFkZGluZy5wdXRCeXRlKDB4NUMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBfa2V5ID0ga2V5O1xuICAgICAgX2lwYWRkaW5nID0gX2lwYWRkaW5nLmJ5dGVzKCk7XG4gICAgICBfb3BhZGRpbmcgPSBfb3BhZGRpbmcuYnl0ZXMoKTtcbiAgICB9XG5cbiAgICAvLyBkaWdlc3QgaXMgZG9uZSBsaWtlIHNvOiBoYXNoKG9wYWRkaW5nIHwgaGFzaChpcGFkZGluZyB8IG1lc3NhZ2UpKVxuXG4gICAgLy8gcHJlcGFyZSB0byBkbyBpbm5lciBoYXNoXG4gICAgLy8gaGFzaChpcGFkZGluZyB8IG1lc3NhZ2UpXG4gICAgX21kLnN0YXJ0KCk7XG4gICAgX21kLnVwZGF0ZShfaXBhZGRpbmcpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBVcGRhdGVzIHRoZSBITUFDIHdpdGggdGhlIGdpdmVuIG1lc3NhZ2UgYnl0ZXMuXG4gICAqXG4gICAqIEBwYXJhbSBieXRlcyB0aGUgYnl0ZXMgdG8gdXBkYXRlIHdpdGguXG4gICAqL1xuICBjdHgudXBkYXRlID0gZnVuY3Rpb24oYnl0ZXMpIHtcbiAgICBfbWQudXBkYXRlKGJ5dGVzKTtcbiAgfTtcblxuICAvKipcbiAgICogUHJvZHVjZXMgdGhlIE1lc3NhZ2UgQXV0aGVudGljYXRpb24gQ29kZSAoTUFDKS5cbiAgICpcbiAgICogQHJldHVybiBhIGJ5dGUgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIGRpZ2VzdCB2YWx1ZS5cbiAgICovXG4gIGN0eC5nZXRNYWMgPSBmdW5jdGlvbigpIHtcbiAgICAvLyBkaWdlc3QgaXMgZG9uZSBsaWtlIHNvOiBoYXNoKG9wYWRkaW5nIHwgaGFzaChpcGFkZGluZyB8IG1lc3NhZ2UpKVxuICAgIC8vIGhlcmUgd2UgZG8gdGhlIG91dGVyIGhhc2hpbmdcbiAgICB2YXIgaW5uZXIgPSBfbWQuZGlnZXN0KCkuYnl0ZXMoKTtcbiAgICBfbWQuc3RhcnQoKTtcbiAgICBfbWQudXBkYXRlKF9vcGFkZGluZyk7XG4gICAgX21kLnVwZGF0ZShpbm5lcik7XG4gICAgcmV0dXJuIF9tZC5kaWdlc3QoKTtcbiAgfTtcbiAgLy8gYWxpYXMgZm9yIGdldE1hY1xuICBjdHguZGlnZXN0ID0gY3R4LmdldE1hYztcblxuICByZXR1cm4gY3R4O1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///31\n")},function(module,exports,__webpack_require__){eval("/**\n * Secure Hash Algorithm with 160-bit digest (SHA-1) implementation.\n *\n * @author Dave Longley\n *\n * Copyright (c) 2010-2015 Digital Bazaar, Inc.\n */\nvar forge = __webpack_require__(4);\n__webpack_require__(17);\n__webpack_require__(7);\n\nvar sha1 = module.exports = forge.sha1 = forge.sha1 || {};\nforge.md.sha1 = forge.md.algorithms.sha1 = sha1;\n\n/**\n * Creates a SHA-1 message digest object.\n *\n * @return a message digest object.\n */\nsha1.create = function() {\n  // do initialization as necessary\n  if(!_initialized) {\n    _init();\n  }\n\n  // SHA-1 state contains five 32-bit integers\n  var _state = null;\n\n  // input buffer\n  var _input = forge.util.createBuffer();\n\n  // used for word storage\n  var _w = new Array(80);\n\n  // message digest object\n  var md = {\n    algorithm: 'sha1',\n    blockLength: 64,\n    digestLength: 20,\n    // 56-bit length of message so far (does not including padding)\n    messageLength: 0,\n    // true message length\n    fullMessageLength: null,\n    // size of message length in bytes\n    messageLengthSize: 8\n  };\n\n  /**\n   * Starts the digest.\n   *\n   * @return this digest object.\n   */\n  md.start = function() {\n    // up to 56-bit message length for convenience\n    md.messageLength = 0;\n\n    // full message length (set md.messageLength64 for backwards-compatibility)\n    md.fullMessageLength = md.messageLength64 = [];\n    var int32s = md.messageLengthSize / 4;\n    for(var i = 0; i < int32s; ++i) {\n      md.fullMessageLength.push(0);\n    }\n    _input = forge.util.createBuffer();\n    _state = {\n      h0: 0x67452301,\n      h1: 0xEFCDAB89,\n      h2: 0x98BADCFE,\n      h3: 0x10325476,\n      h4: 0xC3D2E1F0\n    };\n    return md;\n  };\n  // start digest automatically for first time\n  md.start();\n\n  /**\n   * Updates the digest with the given message input. The given input can\n   * treated as raw input (no encoding will be applied) or an encoding of\n   * 'utf8' maybe given to encode the input using UTF-8.\n   *\n   * @param msg the message input to update with.\n   * @param encoding the encoding to use (default: 'raw', other: 'utf8').\n   *\n   * @return this digest object.\n   */\n  md.update = function(msg, encoding) {\n    if(encoding === 'utf8') {\n      msg = forge.util.encodeUtf8(msg);\n    }\n\n    // update message length\n    var len = msg.length;\n    md.messageLength += len;\n    len = [(len / 0x100000000) >>> 0, len >>> 0];\n    for(var i = md.fullMessageLength.length - 1; i >= 0; --i) {\n      md.fullMessageLength[i] += len[1];\n      len[1] = len[0] + ((md.fullMessageLength[i] / 0x100000000) >>> 0);\n      md.fullMessageLength[i] = md.fullMessageLength[i] >>> 0;\n      len[0] = ((len[1] / 0x100000000) >>> 0);\n    }\n\n    // add bytes to input buffer\n    _input.putBytes(msg);\n\n    // process bytes\n    _update(_state, _w, _input);\n\n    // compact input buffer every 2K or if empty\n    if(_input.read > 2048 || _input.length() === 0) {\n      _input.compact();\n    }\n\n    return md;\n  };\n\n  /**\n   * Produces the digest.\n   *\n   * @return a byte buffer containing the digest value.\n   */\n  md.digest = function() {\n    /* Note: Here we copy the remaining bytes in the input buffer and\n    add the appropriate SHA-1 padding. Then we do the final update\n    on a copy of the state so that if the user wants to get\n    intermediate digests they can do so. */\n\n    /* Determine the number of bytes that must be added to the message\n    to ensure its length is congruent to 448 mod 512. In other words,\n    the data to be digested must be a multiple of 512 bits (or 128 bytes).\n    This data includes the message, some padding, and the length of the\n    message. Since the length of the message will be encoded as 8 bytes (64\n    bits), that means that the last segment of the data must have 56 bytes\n    (448 bits) of message and padding. Therefore, the length of the message\n    plus the padding must be congruent to 448 mod 512 because\n    512 - 128 = 448.\n\n    In order to fill up the message length it must be filled with\n    padding that begins with 1 bit followed by all 0 bits. Padding\n    must *always* be present, so if the message length is already\n    congruent to 448 mod 512, then 512 padding bits must be added. */\n\n    var finalBlock = forge.util.createBuffer();\n    finalBlock.putBytes(_input.bytes());\n\n    // compute remaining size to be digested (include message length size)\n    var remaining = (\n      md.fullMessageLength[md.fullMessageLength.length - 1] +\n      md.messageLengthSize);\n\n    // add padding for overflow blockSize - overflow\n    // _padding starts with 1 byte with first bit is set (byte value 128), then\n    // there may be up to (blockSize - 1) other pad bytes\n    var overflow = remaining & (md.blockLength - 1);\n    finalBlock.putBytes(_padding.substr(0, md.blockLength - overflow));\n\n    // serialize message length in bits in big-endian order; since length\n    // is stored in bytes we multiply by 8 and add carry from next int\n    var next, carry;\n    var bits = md.fullMessageLength[0] * 8;\n    for(var i = 0; i < md.fullMessageLength.length - 1; ++i) {\n      next = md.fullMessageLength[i + 1] * 8;\n      carry = (next / 0x100000000) >>> 0;\n      bits += carry;\n      finalBlock.putInt32(bits >>> 0);\n      bits = next >>> 0;\n    }\n    finalBlock.putInt32(bits);\n\n    var s2 = {\n      h0: _state.h0,\n      h1: _state.h1,\n      h2: _state.h2,\n      h3: _state.h3,\n      h4: _state.h4\n    };\n    _update(s2, _w, finalBlock);\n    var rval = forge.util.createBuffer();\n    rval.putInt32(s2.h0);\n    rval.putInt32(s2.h1);\n    rval.putInt32(s2.h2);\n    rval.putInt32(s2.h3);\n    rval.putInt32(s2.h4);\n    return rval;\n  };\n\n  return md;\n};\n\n// sha-1 padding bytes not initialized yet\nvar _padding = null;\nvar _initialized = false;\n\n/**\n * Initializes the constant tables.\n */\nfunction _init() {\n  // create padding\n  _padding = String.fromCharCode(128);\n  _padding += forge.util.fillString(String.fromCharCode(0x00), 64);\n\n  // now initialized\n  _initialized = true;\n}\n\n/**\n * Updates a SHA-1 state with the given byte buffer.\n *\n * @param s the SHA-1 state to update.\n * @param w the array to use to store words.\n * @param bytes the byte buffer to update with.\n */\nfunction _update(s, w, bytes) {\n  // consume 512 bit (64 byte) chunks\n  var t, a, b, c, d, e, f, i;\n  var len = bytes.length();\n  while(len >= 64) {\n    // the w array will be populated with sixteen 32-bit big-endian words\n    // and then extended into 80 32-bit words according to SHA-1 algorithm\n    // and for 32-79 using Max Locktyukhin's optimization\n\n    // initialize hash value for this chunk\n    a = s.h0;\n    b = s.h1;\n    c = s.h2;\n    d = s.h3;\n    e = s.h4;\n\n    // round 1\n    for(i = 0; i < 16; ++i) {\n      t = bytes.getInt32();\n      w[i] = t;\n      f = d ^ (b & (c ^ d));\n      t = ((a << 5) | (a >>> 27)) + f + e + 0x5A827999 + t;\n      e = d;\n      d = c;\n      // `>>> 0` necessary to avoid iOS/Safari 10 optimization bug\n      c = ((b << 30) | (b >>> 2)) >>> 0;\n      b = a;\n      a = t;\n    }\n    for(; i < 20; ++i) {\n      t = (w[i - 3] ^ w[i - 8] ^ w[i - 14] ^ w[i - 16]);\n      t = (t << 1) | (t >>> 31);\n      w[i] = t;\n      f = d ^ (b & (c ^ d));\n      t = ((a << 5) | (a >>> 27)) + f + e + 0x5A827999 + t;\n      e = d;\n      d = c;\n      // `>>> 0` necessary to avoid iOS/Safari 10 optimization bug\n      c = ((b << 30) | (b >>> 2)) >>> 0;\n      b = a;\n      a = t;\n    }\n    // round 2\n    for(; i < 32; ++i) {\n      t = (w[i - 3] ^ w[i - 8] ^ w[i - 14] ^ w[i - 16]);\n      t = (t << 1) | (t >>> 31);\n      w[i] = t;\n      f = b ^ c ^ d;\n      t = ((a << 5) | (a >>> 27)) + f + e + 0x6ED9EBA1 + t;\n      e = d;\n      d = c;\n      // `>>> 0` necessary to avoid iOS/Safari 10 optimization bug\n      c = ((b << 30) | (b >>> 2)) >>> 0;\n      b = a;\n      a = t;\n    }\n    for(; i < 40; ++i) {\n      t = (w[i - 6] ^ w[i - 16] ^ w[i - 28] ^ w[i - 32]);\n      t = (t << 2) | (t >>> 30);\n      w[i] = t;\n      f = b ^ c ^ d;\n      t = ((a << 5) | (a >>> 27)) + f + e + 0x6ED9EBA1 + t;\n      e = d;\n      d = c;\n      // `>>> 0` necessary to avoid iOS/Safari 10 optimization bug\n      c = ((b << 30) | (b >>> 2)) >>> 0;\n      b = a;\n      a = t;\n    }\n    // round 3\n    for(; i < 60; ++i) {\n      t = (w[i - 6] ^ w[i - 16] ^ w[i - 28] ^ w[i - 32]);\n      t = (t << 2) | (t >>> 30);\n      w[i] = t;\n      f = (b & c) | (d & (b ^ c));\n      t = ((a << 5) | (a >>> 27)) + f + e + 0x8F1BBCDC + t;\n      e = d;\n      d = c;\n      // `>>> 0` necessary to avoid iOS/Safari 10 optimization bug\n      c = ((b << 30) | (b >>> 2)) >>> 0;\n      b = a;\n      a = t;\n    }\n    // round 4\n    for(; i < 80; ++i) {\n      t = (w[i - 6] ^ w[i - 16] ^ w[i - 28] ^ w[i - 32]);\n      t = (t << 2) | (t >>> 30);\n      w[i] = t;\n      f = b ^ c ^ d;\n      t = ((a << 5) | (a >>> 27)) + f + e + 0xCA62C1D6 + t;\n      e = d;\n      d = c;\n      // `>>> 0` necessary to avoid iOS/Safari 10 optimization bug\n      c = ((b << 30) | (b >>> 2)) >>> 0;\n      b = a;\n      a = t;\n    }\n\n    // update hash state\n    s.h0 = (s.h0 + a) | 0;\n    s.h1 = (s.h1 + b) | 0;\n    s.h2 = (s.h2 + c) | 0;\n    s.h3 = (s.h3 + d) | 0;\n    s.h4 = (s.h4 + e) | 0;\n\n    len -= 64;\n  }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzIuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbm9kZS1mb3JnZS9saWIvc2hhMS5qcz9hNzU0Il0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogU2VjdXJlIEhhc2ggQWxnb3JpdGhtIHdpdGggMTYwLWJpdCBkaWdlc3QgKFNIQS0xKSBpbXBsZW1lbnRhdGlvbi5cbiAqXG4gKiBAYXV0aG9yIERhdmUgTG9uZ2xleVxuICpcbiAqIENvcHlyaWdodCAoYykgMjAxMC0yMDE1IERpZ2l0YWwgQmF6YWFyLCBJbmMuXG4gKi9cbnZhciBmb3JnZSA9IHJlcXVpcmUoJy4vZm9yZ2UnKTtcbnJlcXVpcmUoJy4vbWQnKTtcbnJlcXVpcmUoJy4vdXRpbCcpO1xuXG52YXIgc2hhMSA9IG1vZHVsZS5leHBvcnRzID0gZm9yZ2Uuc2hhMSA9IGZvcmdlLnNoYTEgfHwge307XG5mb3JnZS5tZC5zaGExID0gZm9yZ2UubWQuYWxnb3JpdGhtcy5zaGExID0gc2hhMTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgU0hBLTEgbWVzc2FnZSBkaWdlc3Qgb2JqZWN0LlxuICpcbiAqIEByZXR1cm4gYSBtZXNzYWdlIGRpZ2VzdCBvYmplY3QuXG4gKi9cbnNoYTEuY3JlYXRlID0gZnVuY3Rpb24oKSB7XG4gIC8vIGRvIGluaXRpYWxpemF0aW9uIGFzIG5lY2Vzc2FyeVxuICBpZighX2luaXRpYWxpemVkKSB7XG4gICAgX2luaXQoKTtcbiAgfVxuXG4gIC8vIFNIQS0xIHN0YXRlIGNvbnRhaW5zIGZpdmUgMzItYml0IGludGVnZXJzXG4gIHZhciBfc3RhdGUgPSBudWxsO1xuXG4gIC8vIGlucHV0IGJ1ZmZlclxuICB2YXIgX2lucHV0ID0gZm9yZ2UudXRpbC5jcmVhdGVCdWZmZXIoKTtcblxuICAvLyB1c2VkIGZvciB3b3JkIHN0b3JhZ2VcbiAgdmFyIF93ID0gbmV3IEFycmF5KDgwKTtcblxuICAvLyBtZXNzYWdlIGRpZ2VzdCBvYmplY3RcbiAgdmFyIG1kID0ge1xuICAgIGFsZ29yaXRobTogJ3NoYTEnLFxuICAgIGJsb2NrTGVuZ3RoOiA2NCxcbiAgICBkaWdlc3RMZW5ndGg6IDIwLFxuICAgIC8vIDU2LWJpdCBsZW5ndGggb2YgbWVzc2FnZSBzbyBmYXIgKGRvZXMgbm90IGluY2x1ZGluZyBwYWRkaW5nKVxuICAgIG1lc3NhZ2VMZW5ndGg6IDAsXG4gICAgLy8gdHJ1ZSBtZXNzYWdlIGxlbmd0aFxuICAgIGZ1bGxNZXNzYWdlTGVuZ3RoOiBudWxsLFxuICAgIC8vIHNpemUgb2YgbWVzc2FnZSBsZW5ndGggaW4gYnl0ZXNcbiAgICBtZXNzYWdlTGVuZ3RoU2l6ZTogOFxuICB9O1xuXG4gIC8qKlxuICAgKiBTdGFydHMgdGhlIGRpZ2VzdC5cbiAgICpcbiAgICogQHJldHVybiB0aGlzIGRpZ2VzdCBvYmplY3QuXG4gICAqL1xuICBtZC5zdGFydCA9IGZ1bmN0aW9uKCkge1xuICAgIC8vIHVwIHRvIDU2LWJpdCBtZXNzYWdlIGxlbmd0aCBmb3IgY29udmVuaWVuY2VcbiAgICBtZC5tZXNzYWdlTGVuZ3RoID0gMDtcblxuICAgIC8vIGZ1bGwgbWVzc2FnZSBsZW5ndGggKHNldCBtZC5tZXNzYWdlTGVuZ3RoNjQgZm9yIGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5KVxuICAgIG1kLmZ1bGxNZXNzYWdlTGVuZ3RoID0gbWQubWVzc2FnZUxlbmd0aDY0ID0gW107XG4gICAgdmFyIGludDMycyA9IG1kLm1lc3NhZ2VMZW5ndGhTaXplIC8gNDtcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgaW50MzJzOyArK2kpIHtcbiAgICAgIG1kLmZ1bGxNZXNzYWdlTGVuZ3RoLnB1c2goMCk7XG4gICAgfVxuICAgIF9pbnB1dCA9IGZvcmdlLnV0aWwuY3JlYXRlQnVmZmVyKCk7XG4gICAgX3N0YXRlID0ge1xuICAgICAgaDA6IDB4Njc0NTIzMDEsXG4gICAgICBoMTogMHhFRkNEQUI4OSxcbiAgICAgIGgyOiAweDk4QkFEQ0ZFLFxuICAgICAgaDM6IDB4MTAzMjU0NzYsXG4gICAgICBoNDogMHhDM0QyRTFGMFxuICAgIH07XG4gICAgcmV0dXJuIG1kO1xuICB9O1xuICAvLyBzdGFydCBkaWdlc3QgYXV0b21hdGljYWxseSBmb3IgZmlyc3QgdGltZVxuICBtZC5zdGFydCgpO1xuXG4gIC8qKlxuICAgKiBVcGRhdGVzIHRoZSBkaWdlc3Qgd2l0aCB0aGUgZ2l2ZW4gbWVzc2FnZSBpbnB1dC4gVGhlIGdpdmVuIGlucHV0IGNhblxuICAgKiB0cmVhdGVkIGFzIHJhdyBpbnB1dCAobm8gZW5jb2Rpbmcgd2lsbCBiZSBhcHBsaWVkKSBvciBhbiBlbmNvZGluZyBvZlxuICAgKiAndXRmOCcgbWF5YmUgZ2l2ZW4gdG8gZW5jb2RlIHRoZSBpbnB1dCB1c2luZyBVVEYtOC5cbiAgICpcbiAgICogQHBhcmFtIG1zZyB0aGUgbWVzc2FnZSBpbnB1dCB0byB1cGRhdGUgd2l0aC5cbiAgICogQHBhcmFtIGVuY29kaW5nIHRoZSBlbmNvZGluZyB0byB1c2UgKGRlZmF1bHQ6ICdyYXcnLCBvdGhlcjogJ3V0ZjgnKS5cbiAgICpcbiAgICogQHJldHVybiB0aGlzIGRpZ2VzdCBvYmplY3QuXG4gICAqL1xuICBtZC51cGRhdGUgPSBmdW5jdGlvbihtc2csIGVuY29kaW5nKSB7XG4gICAgaWYoZW5jb2RpbmcgPT09ICd1dGY4Jykge1xuICAgICAgbXNnID0gZm9yZ2UudXRpbC5lbmNvZGVVdGY4KG1zZyk7XG4gICAgfVxuXG4gICAgLy8gdXBkYXRlIG1lc3NhZ2UgbGVuZ3RoXG4gICAgdmFyIGxlbiA9IG1zZy5sZW5ndGg7XG4gICAgbWQubWVzc2FnZUxlbmd0aCArPSBsZW47XG4gICAgbGVuID0gWyhsZW4gLyAweDEwMDAwMDAwMCkgPj4+IDAsIGxlbiA+Pj4gMF07XG4gICAgZm9yKHZhciBpID0gbWQuZnVsbE1lc3NhZ2VMZW5ndGgubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgIG1kLmZ1bGxNZXNzYWdlTGVuZ3RoW2ldICs9IGxlblsxXTtcbiAgICAgIGxlblsxXSA9IGxlblswXSArICgobWQuZnVsbE1lc3NhZ2VMZW5ndGhbaV0gLyAweDEwMDAwMDAwMCkgPj4+IDApO1xuICAgICAgbWQuZnVsbE1lc3NhZ2VMZW5ndGhbaV0gPSBtZC5mdWxsTWVzc2FnZUxlbmd0aFtpXSA+Pj4gMDtcbiAgICAgIGxlblswXSA9ICgobGVuWzFdIC8gMHgxMDAwMDAwMDApID4+PiAwKTtcbiAgICB9XG5cbiAgICAvLyBhZGQgYnl0ZXMgdG8gaW5wdXQgYnVmZmVyXG4gICAgX2lucHV0LnB1dEJ5dGVzKG1zZyk7XG5cbiAgICAvLyBwcm9jZXNzIGJ5dGVzXG4gICAgX3VwZGF0ZShfc3RhdGUsIF93LCBfaW5wdXQpO1xuXG4gICAgLy8gY29tcGFjdCBpbnB1dCBidWZmZXIgZXZlcnkgMksgb3IgaWYgZW1wdHlcbiAgICBpZihfaW5wdXQucmVhZCA+IDIwNDggfHwgX2lucHV0Lmxlbmd0aCgpID09PSAwKSB7XG4gICAgICBfaW5wdXQuY29tcGFjdCgpO1xuICAgIH1cblxuICAgIHJldHVybiBtZDtcbiAgfTtcblxuICAvKipcbiAgICogUHJvZHVjZXMgdGhlIGRpZ2VzdC5cbiAgICpcbiAgICogQHJldHVybiBhIGJ5dGUgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIGRpZ2VzdCB2YWx1ZS5cbiAgICovXG4gIG1kLmRpZ2VzdCA9IGZ1bmN0aW9uKCkge1xuICAgIC8qIE5vdGU6IEhlcmUgd2UgY29weSB0aGUgcmVtYWluaW5nIGJ5dGVzIGluIHRoZSBpbnB1dCBidWZmZXIgYW5kXG4gICAgYWRkIHRoZSBhcHByb3ByaWF0ZSBTSEEtMSBwYWRkaW5nLiBUaGVuIHdlIGRvIHRoZSBmaW5hbCB1cGRhdGVcbiAgICBvbiBhIGNvcHkgb2YgdGhlIHN0YXRlIHNvIHRoYXQgaWYgdGhlIHVzZXIgd2FudHMgdG8gZ2V0XG4gICAgaW50ZXJtZWRpYXRlIGRpZ2VzdHMgdGhleSBjYW4gZG8gc28uICovXG5cbiAgICAvKiBEZXRlcm1pbmUgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IG11c3QgYmUgYWRkZWQgdG8gdGhlIG1lc3NhZ2VcbiAgICB0byBlbnN1cmUgaXRzIGxlbmd0aCBpcyBjb25ncnVlbnQgdG8gNDQ4IG1vZCA1MTIuIEluIG90aGVyIHdvcmRzLFxuICAgIHRoZSBkYXRhIHRvIGJlIGRpZ2VzdGVkIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA1MTIgYml0cyAob3IgMTI4IGJ5dGVzKS5cbiAgICBUaGlzIGRhdGEgaW5jbHVkZXMgdGhlIG1lc3NhZ2UsIHNvbWUgcGFkZGluZywgYW5kIHRoZSBsZW5ndGggb2YgdGhlXG4gICAgbWVzc2FnZS4gU2luY2UgdGhlIGxlbmd0aCBvZiB0aGUgbWVzc2FnZSB3aWxsIGJlIGVuY29kZWQgYXMgOCBieXRlcyAoNjRcbiAgICBiaXRzKSwgdGhhdCBtZWFucyB0aGF0IHRoZSBsYXN0IHNlZ21lbnQgb2YgdGhlIGRhdGEgbXVzdCBoYXZlIDU2IGJ5dGVzXG4gICAgKDQ0OCBiaXRzKSBvZiBtZXNzYWdlIGFuZCBwYWRkaW5nLiBUaGVyZWZvcmUsIHRoZSBsZW5ndGggb2YgdGhlIG1lc3NhZ2VcbiAgICBwbHVzIHRoZSBwYWRkaW5nIG11c3QgYmUgY29uZ3J1ZW50IHRvIDQ0OCBtb2QgNTEyIGJlY2F1c2VcbiAgICA1MTIgLSAxMjggPSA0NDguXG5cbiAgICBJbiBvcmRlciB0byBmaWxsIHVwIHRoZSBtZXNzYWdlIGxlbmd0aCBpdCBtdXN0IGJlIGZpbGxlZCB3aXRoXG4gICAgcGFkZGluZyB0aGF0IGJlZ2lucyB3aXRoIDEgYml0IGZvbGxvd2VkIGJ5IGFsbCAwIGJpdHMuIFBhZGRpbmdcbiAgICBtdXN0ICphbHdheXMqIGJlIHByZXNlbnQsIHNvIGlmIHRoZSBtZXNzYWdlIGxlbmd0aCBpcyBhbHJlYWR5XG4gICAgY29uZ3J1ZW50IHRvIDQ0OCBtb2QgNTEyLCB0aGVuIDUxMiBwYWRkaW5nIGJpdHMgbXVzdCBiZSBhZGRlZC4gKi9cblxuICAgIHZhciBmaW5hbEJsb2NrID0gZm9yZ2UudXRpbC5jcmVhdGVCdWZmZXIoKTtcbiAgICBmaW5hbEJsb2NrLnB1dEJ5dGVzKF9pbnB1dC5ieXRlcygpKTtcblxuICAgIC8vIGNvbXB1dGUgcmVtYWluaW5nIHNpemUgdG8gYmUgZGlnZXN0ZWQgKGluY2x1ZGUgbWVzc2FnZSBsZW5ndGggc2l6ZSlcbiAgICB2YXIgcmVtYWluaW5nID0gKFxuICAgICAgbWQuZnVsbE1lc3NhZ2VMZW5ndGhbbWQuZnVsbE1lc3NhZ2VMZW5ndGgubGVuZ3RoIC0gMV0gK1xuICAgICAgbWQubWVzc2FnZUxlbmd0aFNpemUpO1xuXG4gICAgLy8gYWRkIHBhZGRpbmcgZm9yIG92ZXJmbG93IGJsb2NrU2l6ZSAtIG92ZXJmbG93XG4gICAgLy8gX3BhZGRpbmcgc3RhcnRzIHdpdGggMSBieXRlIHdpdGggZmlyc3QgYml0IGlzIHNldCAoYnl0ZSB2YWx1ZSAxMjgpLCB0aGVuXG4gICAgLy8gdGhlcmUgbWF5IGJlIHVwIHRvIChibG9ja1NpemUgLSAxKSBvdGhlciBwYWQgYnl0ZXNcbiAgICB2YXIgb3ZlcmZsb3cgPSByZW1haW5pbmcgJiAobWQuYmxvY2tMZW5ndGggLSAxKTtcbiAgICBmaW5hbEJsb2NrLnB1dEJ5dGVzKF9wYWRkaW5nLnN1YnN0cigwLCBtZC5ibG9ja0xlbmd0aCAtIG92ZXJmbG93KSk7XG5cbiAgICAvLyBzZXJpYWxpemUgbWVzc2FnZSBsZW5ndGggaW4gYml0cyBpbiBiaWctZW5kaWFuIG9yZGVyOyBzaW5jZSBsZW5ndGhcbiAgICAvLyBpcyBzdG9yZWQgaW4gYnl0ZXMgd2UgbXVsdGlwbHkgYnkgOCBhbmQgYWRkIGNhcnJ5IGZyb20gbmV4dCBpbnRcbiAgICB2YXIgbmV4dCwgY2Fycnk7XG4gICAgdmFyIGJpdHMgPSBtZC5mdWxsTWVzc2FnZUxlbmd0aFswXSAqIDg7XG4gICAgZm9yKHZhciBpID0gMDsgaSA8IG1kLmZ1bGxNZXNzYWdlTGVuZ3RoLmxlbmd0aCAtIDE7ICsraSkge1xuICAgICAgbmV4dCA9IG1kLmZ1bGxNZXNzYWdlTGVuZ3RoW2kgKyAxXSAqIDg7XG4gICAgICBjYXJyeSA9IChuZXh0IC8gMHgxMDAwMDAwMDApID4+PiAwO1xuICAgICAgYml0cyArPSBjYXJyeTtcbiAgICAgIGZpbmFsQmxvY2sucHV0SW50MzIoYml0cyA+Pj4gMCk7XG4gICAgICBiaXRzID0gbmV4dCA+Pj4gMDtcbiAgICB9XG4gICAgZmluYWxCbG9jay5wdXRJbnQzMihiaXRzKTtcblxuICAgIHZhciBzMiA9IHtcbiAgICAgIGgwOiBfc3RhdGUuaDAsXG4gICAgICBoMTogX3N0YXRlLmgxLFxuICAgICAgaDI6IF9zdGF0ZS5oMixcbiAgICAgIGgzOiBfc3RhdGUuaDMsXG4gICAgICBoNDogX3N0YXRlLmg0XG4gICAgfTtcbiAgICBfdXBkYXRlKHMyLCBfdywgZmluYWxCbG9jayk7XG4gICAgdmFyIHJ2YWwgPSBmb3JnZS51dGlsLmNyZWF0ZUJ1ZmZlcigpO1xuICAgIHJ2YWwucHV0SW50MzIoczIuaDApO1xuICAgIHJ2YWwucHV0SW50MzIoczIuaDEpO1xuICAgIHJ2YWwucHV0SW50MzIoczIuaDIpO1xuICAgIHJ2YWwucHV0SW50MzIoczIuaDMpO1xuICAgIHJ2YWwucHV0SW50MzIoczIuaDQpO1xuICAgIHJldHVybiBydmFsO1xuICB9O1xuXG4gIHJldHVybiBtZDtcbn07XG5cbi8vIHNoYS0xIHBhZGRpbmcgYnl0ZXMgbm90IGluaXRpYWxpemVkIHlldFxudmFyIF9wYWRkaW5nID0gbnVsbDtcbnZhciBfaW5pdGlhbGl6ZWQgPSBmYWxzZTtcblxuLyoqXG4gKiBJbml0aWFsaXplcyB0aGUgY29uc3RhbnQgdGFibGVzLlxuICovXG5mdW5jdGlvbiBfaW5pdCgpIHtcbiAgLy8gY3JlYXRlIHBhZGRpbmdcbiAgX3BhZGRpbmcgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKDEyOCk7XG4gIF9wYWRkaW5nICs9IGZvcmdlLnV0aWwuZmlsbFN0cmluZyhTdHJpbmcuZnJvbUNoYXJDb2RlKDB4MDApLCA2NCk7XG5cbiAgLy8gbm93IGluaXRpYWxpemVkXG4gIF9pbml0aWFsaXplZCA9IHRydWU7XG59XG5cbi8qKlxuICogVXBkYXRlcyBhIFNIQS0xIHN0YXRlIHdpdGggdGhlIGdpdmVuIGJ5dGUgYnVmZmVyLlxuICpcbiAqIEBwYXJhbSBzIHRoZSBTSEEtMSBzdGF0ZSB0byB1cGRhdGUuXG4gKiBAcGFyYW0gdyB0aGUgYXJyYXkgdG8gdXNlIHRvIHN0b3JlIHdvcmRzLlxuICogQHBhcmFtIGJ5dGVzIHRoZSBieXRlIGJ1ZmZlciB0byB1cGRhdGUgd2l0aC5cbiAqL1xuZnVuY3Rpb24gX3VwZGF0ZShzLCB3LCBieXRlcykge1xuICAvLyBjb25zdW1lIDUxMiBiaXQgKDY0IGJ5dGUpIGNodW5rc1xuICB2YXIgdCwgYSwgYiwgYywgZCwgZSwgZiwgaTtcbiAgdmFyIGxlbiA9IGJ5dGVzLmxlbmd0aCgpO1xuICB3aGlsZShsZW4gPj0gNjQpIHtcbiAgICAvLyB0aGUgdyBhcnJheSB3aWxsIGJlIHBvcHVsYXRlZCB3aXRoIHNpeHRlZW4gMzItYml0IGJpZy1lbmRpYW4gd29yZHNcbiAgICAvLyBhbmQgdGhlbiBleHRlbmRlZCBpbnRvIDgwIDMyLWJpdCB3b3JkcyBhY2NvcmRpbmcgdG8gU0hBLTEgYWxnb3JpdGhtXG4gICAgLy8gYW5kIGZvciAzMi03OSB1c2luZyBNYXggTG9ja3R5dWtoaW4ncyBvcHRpbWl6YXRpb25cblxuICAgIC8vIGluaXRpYWxpemUgaGFzaCB2YWx1ZSBmb3IgdGhpcyBjaHVua1xuICAgIGEgPSBzLmgwO1xuICAgIGIgPSBzLmgxO1xuICAgIGMgPSBzLmgyO1xuICAgIGQgPSBzLmgzO1xuICAgIGUgPSBzLmg0O1xuXG4gICAgLy8gcm91bmQgMVxuICAgIGZvcihpID0gMDsgaSA8IDE2OyArK2kpIHtcbiAgICAgIHQgPSBieXRlcy5nZXRJbnQzMigpO1xuICAgICAgd1tpXSA9IHQ7XG4gICAgICBmID0gZCBeIChiICYgKGMgXiBkKSk7XG4gICAgICB0ID0gKChhIDw8IDUpIHwgKGEgPj4+IDI3KSkgKyBmICsgZSArIDB4NUE4Mjc5OTkgKyB0O1xuICAgICAgZSA9IGQ7XG4gICAgICBkID0gYztcbiAgICAgIC8vIGA+Pj4gMGAgbmVjZXNzYXJ5IHRvIGF2b2lkIGlPUy9TYWZhcmkgMTAgb3B0aW1pemF0aW9uIGJ1Z1xuICAgICAgYyA9ICgoYiA8PCAzMCkgfCAoYiA+Pj4gMikpID4+PiAwO1xuICAgICAgYiA9IGE7XG4gICAgICBhID0gdDtcbiAgICB9XG4gICAgZm9yKDsgaSA8IDIwOyArK2kpIHtcbiAgICAgIHQgPSAod1tpIC0gM10gXiB3W2kgLSA4XSBeIHdbaSAtIDE0XSBeIHdbaSAtIDE2XSk7XG4gICAgICB0ID0gKHQgPDwgMSkgfCAodCA+Pj4gMzEpO1xuICAgICAgd1tpXSA9IHQ7XG4gICAgICBmID0gZCBeIChiICYgKGMgXiBkKSk7XG4gICAgICB0ID0gKChhIDw8IDUpIHwgKGEgPj4+IDI3KSkgKyBmICsgZSArIDB4NUE4Mjc5OTkgKyB0O1xuICAgICAgZSA9IGQ7XG4gICAgICBkID0gYztcbiAgICAgIC8vIGA+Pj4gMGAgbmVjZXNzYXJ5IHRvIGF2b2lkIGlPUy9TYWZhcmkgMTAgb3B0aW1pemF0aW9uIGJ1Z1xuICAgICAgYyA9ICgoYiA8PCAzMCkgfCAoYiA+Pj4gMikpID4+PiAwO1xuICAgICAgYiA9IGE7XG4gICAgICBhID0gdDtcbiAgICB9XG4gICAgLy8gcm91bmQgMlxuICAgIGZvcig7IGkgPCAzMjsgKytpKSB7XG4gICAgICB0ID0gKHdbaSAtIDNdIF4gd1tpIC0gOF0gXiB3W2kgLSAxNF0gXiB3W2kgLSAxNl0pO1xuICAgICAgdCA9ICh0IDw8IDEpIHwgKHQgPj4+IDMxKTtcbiAgICAgIHdbaV0gPSB0O1xuICAgICAgZiA9IGIgXiBjIF4gZDtcbiAgICAgIHQgPSAoKGEgPDwgNSkgfCAoYSA+Pj4gMjcpKSArIGYgKyBlICsgMHg2RUQ5RUJBMSArIHQ7XG4gICAgICBlID0gZDtcbiAgICAgIGQgPSBjO1xuICAgICAgLy8gYD4+PiAwYCBuZWNlc3NhcnkgdG8gYXZvaWQgaU9TL1NhZmFyaSAxMCBvcHRpbWl6YXRpb24gYnVnXG4gICAgICBjID0gKChiIDw8IDMwKSB8IChiID4+PiAyKSkgPj4+IDA7XG4gICAgICBiID0gYTtcbiAgICAgIGEgPSB0O1xuICAgIH1cbiAgICBmb3IoOyBpIDwgNDA7ICsraSkge1xuICAgICAgdCA9ICh3W2kgLSA2XSBeIHdbaSAtIDE2XSBeIHdbaSAtIDI4XSBeIHdbaSAtIDMyXSk7XG4gICAgICB0ID0gKHQgPDwgMikgfCAodCA+Pj4gMzApO1xuICAgICAgd1tpXSA9IHQ7XG4gICAgICBmID0gYiBeIGMgXiBkO1xuICAgICAgdCA9ICgoYSA8PCA1KSB8IChhID4+PiAyNykpICsgZiArIGUgKyAweDZFRDlFQkExICsgdDtcbiAgICAgIGUgPSBkO1xuICAgICAgZCA9IGM7XG4gICAgICAvLyBgPj4+IDBgIG5lY2Vzc2FyeSB0byBhdm9pZCBpT1MvU2FmYXJpIDEwIG9wdGltaXphdGlvbiBidWdcbiAgICAgIGMgPSAoKGIgPDwgMzApIHwgKGIgPj4+IDIpKSA+Pj4gMDtcbiAgICAgIGIgPSBhO1xuICAgICAgYSA9IHQ7XG4gICAgfVxuICAgIC8vIHJvdW5kIDNcbiAgICBmb3IoOyBpIDwgNjA7ICsraSkge1xuICAgICAgdCA9ICh3W2kgLSA2XSBeIHdbaSAtIDE2XSBeIHdbaSAtIDI4XSBeIHdbaSAtIDMyXSk7XG4gICAgICB0ID0gKHQgPDwgMikgfCAodCA+Pj4gMzApO1xuICAgICAgd1tpXSA9IHQ7XG4gICAgICBmID0gKGIgJiBjKSB8IChkICYgKGIgXiBjKSk7XG4gICAgICB0ID0gKChhIDw8IDUpIHwgKGEgPj4+IDI3KSkgKyBmICsgZSArIDB4OEYxQkJDREMgKyB0O1xuICAgICAgZSA9IGQ7XG4gICAgICBkID0gYztcbiAgICAgIC8vIGA+Pj4gMGAgbmVjZXNzYXJ5IHRvIGF2b2lkIGlPUy9TYWZhcmkgMTAgb3B0aW1pemF0aW9uIGJ1Z1xuICAgICAgYyA9ICgoYiA8PCAzMCkgfCAoYiA+Pj4gMikpID4+PiAwO1xuICAgICAgYiA9IGE7XG4gICAgICBhID0gdDtcbiAgICB9XG4gICAgLy8gcm91bmQgNFxuICAgIGZvcig7IGkgPCA4MDsgKytpKSB7XG4gICAgICB0ID0gKHdbaSAtIDZdIF4gd1tpIC0gMTZdIF4gd1tpIC0gMjhdIF4gd1tpIC0gMzJdKTtcbiAgICAgIHQgPSAodCA8PCAyKSB8ICh0ID4+PiAzMCk7XG4gICAgICB3W2ldID0gdDtcbiAgICAgIGYgPSBiIF4gYyBeIGQ7XG4gICAgICB0ID0gKChhIDw8IDUpIHwgKGEgPj4+IDI3KSkgKyBmICsgZSArIDB4Q0E2MkMxRDYgKyB0O1xuICAgICAgZSA9IGQ7XG4gICAgICBkID0gYztcbiAgICAgIC8vIGA+Pj4gMGAgbmVjZXNzYXJ5IHRvIGF2b2lkIGlPUy9TYWZhcmkgMTAgb3B0aW1pemF0aW9uIGJ1Z1xuICAgICAgYyA9ICgoYiA8PCAzMCkgfCAoYiA+Pj4gMikpID4+PiAwO1xuICAgICAgYiA9IGE7XG4gICAgICBhID0gdDtcbiAgICB9XG5cbiAgICAvLyB1cGRhdGUgaGFzaCBzdGF0ZVxuICAgIHMuaDAgPSAocy5oMCArIGEpIHwgMDtcbiAgICBzLmgxID0gKHMuaDEgKyBiKSB8IDA7XG4gICAgcy5oMiA9IChzLmgyICsgYykgfCAwO1xuICAgIHMuaDMgPSAocy5oMyArIGQpIHwgMDtcbiAgICBzLmg0ID0gKHMuaDQgKyBlKSB8IDA7XG5cbiAgICBsZW4gLT0gNjQ7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///32\n")},function(module){eval('module.exports = JSON.parse("{\\"slack_panel\\":{\\"click\\":{\\"event.workflow\\":\\"COLLABORATION\\",\\"event.subcategory\\":\\"Send To Apps\\",\\"event.type\\":\\"click\\",\\"event.subtype\\":\\"send-to-apps\\",\\"ui.view_type\\":\\"share-button:send-to-apps:slack\\"},\\"signIn\\":{\\"event.workflow\\":\\"COLLABORATION\\",\\"event.subcategory\\":\\"Send To Apps\\",\\"event.type\\":\\"click\\",\\"event.subtype\\":\\"slack-sign-in\\",\\"ui.view_type\\":\\"share-to-slack-dialog\\"},\\"signInSuccess\\":{\\"event.workflow\\":\\"COLLABORATION\\",\\"event.subcategory\\":\\"Send To Apps\\",\\"event.type\\":\\"success\\",\\"event.subtype\\":\\"share-to-slack\\",\\"ui.view_type\\":\\"share-to-slack-dialog\\"},\\"signInCancel\\":{\\"event.workflow\\":\\"COLLABORATION\\",\\"event.subcategory\\":\\"Send To Apps\\",\\"event.type\\":\\"click\\",\\"event.subtype\\":\\"share-to-slack\\",\\"event.value\\":\\"cancel\\",\\"ui.view_type\\":\\"share-to-slack-dialog\\"},\\"signInError\\":{\\"event.workflow\\":\\"COLLABORATION\\",\\"event.subcategory\\":\\"Send To Apps\\",\\"event.type\\":\\"error\\",\\"event.subtype\\":\\"share-to-slack\\",\\"event.value\\":\\"fail\\",\\"ui.view_type\\":\\"share-to-slack-dialog\\"},\\"destinationClick\\":{\\"event.workflow\\":\\"COLLABORATION\\",\\"event.subcategory\\":\\"Send To Apps\\",\\"event.type\\":\\"click\\",\\"event.subtype\\":\\"slack-destination\\",\\"ui.view_type\\":\\"share-to-slack-dialog\\"},\\"slackMessage\\":{\\"event.workflow\\":\\"COLLABORATION\\",\\"event.subcategory\\":\\"Send To Apps\\",\\"event.type\\":\\"click\\",\\"event.subtype\\":\\"slack-message\\",\\"ui.view_type\\":\\"share-to-slack-dialog\\"},\\"slackShareFileType\\":{\\"event.workflow\\":\\"COLLABORATION\\",\\"event.subcategory\\":\\"Send To Apps\\",\\"event.type\\":\\"click\\",\\"event.subtype\\":\\"share-to-slack\\",\\"ui.view_type\\":\\"share-to-slack-dialog\\"},\\"slackShareSuccess\\":{\\"event.workflow\\":\\"COLLABORATION\\",\\"event.subcategory\\":\\"Send To Apps\\",\\"event.type\\":\\"success\\",\\"event.subtype\\":\\"share-to-slack\\",\\"ui.view_type\\":\\"share-to-slack-dialog\\"},\\"slackShareError\\":{\\"event.workflow\\":\\"COLLABORATION\\",\\"event.subcategory\\":\\"Send To Apps\\",\\"event.type\\":\\"error\\",\\"event.subtype\\":\\"share-to-slack\\",\\"ui.view_type\\":\\"share-to-slack-dialog\\"}},\\"local_sharing\\":{\\"show\\":{\\"event.workflow\\":\\"COLLABORATION\\",\\"event.subcategory\\":\\"Send To Apps\\",\\"event.type\\":\\"click\\",\\"event.subtype\\":\\"send-to-apps\\",\\"event.value\\":\\"\\",\\"ui.view_type\\":\\"share-button\\"},\\"otherApps\\":{\\"event.workflow\\":\\"COLLABORATION\\",\\"event.subcategory\\":\\"Send To Apps\\",\\"event.type\\":\\"click\\",\\"event.subtype\\":\\"other-apps\\",\\"event.value\\":\\"\\",\\"ui.view_type\\":\\"share-button\\"}},\\"animate_in_firefly\\":{\\"click\\":{\\"event.workflow\\":\\"COLLABORATION\\",\\"event.subcategory\\":\\"Animate\\",\\"event.type\\":\\"click\\",\\"event.subtype\\":\\"animate-in-firefly\\",\\"ui.view_type\\":\\"share-button\\"}}}");//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzMuanMiLCJzb3VyY2VzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///33\n')},function(module,exports,__webpack_require__){"use strict";eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = filterReactDomProps;\n\n/*************************************************************************\n* ADOBE CONFIDENTIAL\n* ___________________\n*\n* Copyright 2019 Adobe\n* All Rights Reserved.\n*\n* NOTICE: All information contained herein is, and remains\n* the property of Adobe and its suppliers, if any. The intellectual\n* and technical concepts contained herein are proprietary to Adobe\n* and its suppliers and are protected by all applicable intellectual\n* property laws, including trade secret and copyright laws.\n* Dissemination of this information or reproduction of this material\n* is strictly forbidden unless prior written permission is obtained\n* from Adobe.\n**************************************************************************/\nconst DOMProps = {\n  'abbr': 1,\n  'accept': 1,\n  'acceptCharset': 1,\n  'accessKey': 1,\n  'action': 1,\n  'allowFullScreen': 1,\n  'allowTransparency': 1,\n  'alt': 1,\n  'async': 1,\n  'autoComplete': 1,\n  'autoFocus': 1,\n  'autoPlay': 1,\n  'boundariesElement': 1,\n  'cellPadding': 1,\n  'cellSpacing': 1,\n  'challenge': 1,\n  'charset': 1,\n  'checked': 1,\n  'cite': 1,\n  'class': 1,\n  'className': 1,\n  'cols': 1,\n  'colSpan': 1,\n  'command': 1,\n  'content': 1,\n  'contentEditable': 1,\n  'contextMenu': 1,\n  'controls': 1,\n  'coords': 1,\n  'crossOrigin': 1,\n  'data': 1,\n  'dateTime': 1,\n  'default': 1,\n  'defaultPreventedKeys': 1,\n  'defaultpreventedkeys': 1,\n  'defaultPreventedEvents': 1,\n  'defaultpreventedevents': 1,\n  'defer': 1,\n  'dir': 1,\n  'disabled': 1,\n  'download': 1,\n  'draggable': 1,\n  'dropzone': 1,\n  'encType': 1,\n  'for': 1,\n  'form': 1,\n  'formAction': 1,\n  'formEncType': 1,\n  'formMethod': 1,\n  'formNoValidate': 1,\n  'formTarget': 1,\n  'frameBorder': 1,\n  'headers': 1,\n  'height': 1,\n  'hidden': 1,\n  'high': 1,\n  'href': 1,\n  'hrefLang': 1,\n  'htmlFor': 1,\n  'httpEquiv': 1,\n  'icon': 1,\n  'id': 1,\n  'inputMode': 1,\n  'isMap': 1,\n  'itemId': 1,\n  'itemProp': 1,\n  'itemRef': 1,\n  'itemScope': 1,\n  'itemType': 1,\n  'kind': 1,\n  'label': 1,\n  'lang': 1,\n  'list': 1,\n  'loop': 1,\n  'manifest': 1,\n  'max': 1,\n  'maxLength': 1,\n  'media': 1,\n  'mediaGroup': 1,\n  'method': 1,\n  'min': 1,\n  'minLength': 1,\n  'multiple': 1,\n  'muted': 1,\n  'name': 1,\n  'noValidate': 1,\n  'open': 1,\n  'optimum': 1,\n  'pattern': 1,\n  'ping': 1,\n  'placeholder': 1,\n  'poster': 1,\n  'preload': 1,\n  'radioGroup': 1,\n  'readOnly': 1,\n  'rel': 1,\n  'required': 1,\n  'role': 1,\n  'rows': 1,\n  'rowSpan': 1,\n  'sandbox': 1,\n  'scope': 1,\n  'scoped': 1,\n  'scrolling': 1,\n  'seamless': 1,\n  'selected': 1,\n  'shape': 1,\n  'size': 1,\n  'sizes': 1,\n  'sortable': 1,\n  'span': 1,\n  'spellCheck': 1,\n  'src': 1,\n  'srcDoc': 1,\n  'srcSet': 1,\n  'start': 1,\n  'step': 1,\n  'style': 1,\n  'tabIndex': 1,\n  'target': 1,\n  'title': 1,\n  'translate': 1,\n  'type': 1,\n  'typeMustMatch': 1,\n  'useMap': 1,\n  'value': 1,\n  'width': 1,\n  'wmode': 1,\n  'wrap': 1,\n  'onCopy': 1,\n  'onCut': 1,\n  'onPaste': 1,\n  'onLoad': 1,\n  'onError': 1,\n  'onWheel': 1,\n  'onScroll': 1,\n  'onCompositionEnd': 1,\n  'onCompositionStart': 1,\n  'onCompositionUpdate': 1,\n  'onKeyDown': 1,\n  'onKeyPress': 1,\n  'onKeyUp': 1,\n  'onFocus': 1,\n  'onBlur': 1,\n  'onChange': 1,\n  'onInput': 1,\n  'onSubmit': 1,\n  'onClick': 1,\n  'onContextMenu': 1,\n  'onDoubleClick': 1,\n  'onDrag': 1,\n  'onDragEnd': 1,\n  'onDragEnter': 1,\n  'onDragExit': 1,\n  'onDragLeave': 1,\n  'onDragOver': 1,\n  'onDragStart': 1,\n  'onDrop': 1,\n  'onMouseDown': 1,\n  'onMouseEnter': 1,\n  'onMouseLeave': 1,\n  'onMouseMove': 1,\n  'onMouseOut': 1,\n  'onMouseOver': 1,\n  'onMouseUp': 1,\n  'onSelect': 1,\n  'onTouchCancel': 1,\n  'onTouchEnd': 1,\n  'onTouchMove': 1,\n  'onTouchStart': 1,\n  'onAnimationStart': 1,\n  'onAnimationEnd': 1,\n  'onAnimationIteration': 1,\n  'onTransitionEnd': 1\n};\n/**\n * Checking for aria-* and data-* props\n */\n\nconst propRe = /^((data|aria)-.*)$/;\n\nfunction filterReactDomProps(props) {\n  const filterProps = {};\n\n  for (const prop in props) {\n    if (props.hasOwnProperty(prop) && (DOMProps[prop] || propRe.test(prop))) {\n      filterProps[prop] = props[prop];\n    }\n  }\n\n  return filterProps;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzQuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRvcnEtbmF0aXZlL3JlYWN0LXNwZWN0cnVtL3V0aWxzL2ZpbHRlckRPTVByb3BzLmpzPzU0NjQiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSBmaWx0ZXJSZWFjdERvbVByb3BzO1xuXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuKiBBRE9CRSBDT05GSURFTlRJQUxcbiogX19fX19fX19fX19fX19fX19fX1xuKlxuKiBDb3B5cmlnaHQgMjAxOSBBZG9iZVxuKiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuKlxuKiBOT1RJQ0U6IEFsbCBpbmZvcm1hdGlvbiBjb250YWluZWQgaGVyZWluIGlzLCBhbmQgcmVtYWluc1xuKiB0aGUgcHJvcGVydHkgb2YgQWRvYmUgYW5kIGl0cyBzdXBwbGllcnMsIGlmIGFueS4gVGhlIGludGVsbGVjdHVhbFxuKiBhbmQgdGVjaG5pY2FsIGNvbmNlcHRzIGNvbnRhaW5lZCBoZXJlaW4gYXJlIHByb3ByaWV0YXJ5IHRvIEFkb2JlXG4qIGFuZCBpdHMgc3VwcGxpZXJzIGFuZCBhcmUgcHJvdGVjdGVkIGJ5IGFsbCBhcHBsaWNhYmxlIGludGVsbGVjdHVhbFxuKiBwcm9wZXJ0eSBsYXdzLCBpbmNsdWRpbmcgdHJhZGUgc2VjcmV0IGFuZCBjb3B5cmlnaHQgbGF3cy5cbiogRGlzc2VtaW5hdGlvbiBvZiB0aGlzIGluZm9ybWF0aW9uIG9yIHJlcHJvZHVjdGlvbiBvZiB0aGlzIG1hdGVyaWFsXG4qIGlzIHN0cmljdGx5IGZvcmJpZGRlbiB1bmxlc3MgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIGlzIG9idGFpbmVkXG4qIGZyb20gQWRvYmUuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbmNvbnN0IERPTVByb3BzID0ge1xuICAnYWJicic6IDEsXG4gICdhY2NlcHQnOiAxLFxuICAnYWNjZXB0Q2hhcnNldCc6IDEsXG4gICdhY2Nlc3NLZXknOiAxLFxuICAnYWN0aW9uJzogMSxcbiAgJ2FsbG93RnVsbFNjcmVlbic6IDEsXG4gICdhbGxvd1RyYW5zcGFyZW5jeSc6IDEsXG4gICdhbHQnOiAxLFxuICAnYXN5bmMnOiAxLFxuICAnYXV0b0NvbXBsZXRlJzogMSxcbiAgJ2F1dG9Gb2N1cyc6IDEsXG4gICdhdXRvUGxheSc6IDEsXG4gICdib3VuZGFyaWVzRWxlbWVudCc6IDEsXG4gICdjZWxsUGFkZGluZyc6IDEsXG4gICdjZWxsU3BhY2luZyc6IDEsXG4gICdjaGFsbGVuZ2UnOiAxLFxuICAnY2hhcnNldCc6IDEsXG4gICdjaGVja2VkJzogMSxcbiAgJ2NpdGUnOiAxLFxuICAnY2xhc3MnOiAxLFxuICAnY2xhc3NOYW1lJzogMSxcbiAgJ2NvbHMnOiAxLFxuICAnY29sU3Bhbic6IDEsXG4gICdjb21tYW5kJzogMSxcbiAgJ2NvbnRlbnQnOiAxLFxuICAnY29udGVudEVkaXRhYmxlJzogMSxcbiAgJ2NvbnRleHRNZW51JzogMSxcbiAgJ2NvbnRyb2xzJzogMSxcbiAgJ2Nvb3Jkcyc6IDEsXG4gICdjcm9zc09yaWdpbic6IDEsXG4gICdkYXRhJzogMSxcbiAgJ2RhdGVUaW1lJzogMSxcbiAgJ2RlZmF1bHQnOiAxLFxuICAnZGVmYXVsdFByZXZlbnRlZEtleXMnOiAxLFxuICAnZGVmYXVsdHByZXZlbnRlZGtleXMnOiAxLFxuICAnZGVmYXVsdFByZXZlbnRlZEV2ZW50cyc6IDEsXG4gICdkZWZhdWx0cHJldmVudGVkZXZlbnRzJzogMSxcbiAgJ2RlZmVyJzogMSxcbiAgJ2Rpcic6IDEsXG4gICdkaXNhYmxlZCc6IDEsXG4gICdkb3dubG9hZCc6IDEsXG4gICdkcmFnZ2FibGUnOiAxLFxuICAnZHJvcHpvbmUnOiAxLFxuICAnZW5jVHlwZSc6IDEsXG4gICdmb3InOiAxLFxuICAnZm9ybSc6IDEsXG4gICdmb3JtQWN0aW9uJzogMSxcbiAgJ2Zvcm1FbmNUeXBlJzogMSxcbiAgJ2Zvcm1NZXRob2QnOiAxLFxuICAnZm9ybU5vVmFsaWRhdGUnOiAxLFxuICAnZm9ybVRhcmdldCc6IDEsXG4gICdmcmFtZUJvcmRlcic6IDEsXG4gICdoZWFkZXJzJzogMSxcbiAgJ2hlaWdodCc6IDEsXG4gICdoaWRkZW4nOiAxLFxuICAnaGlnaCc6IDEsXG4gICdocmVmJzogMSxcbiAgJ2hyZWZMYW5nJzogMSxcbiAgJ2h0bWxGb3InOiAxLFxuICAnaHR0cEVxdWl2JzogMSxcbiAgJ2ljb24nOiAxLFxuICAnaWQnOiAxLFxuICAnaW5wdXRNb2RlJzogMSxcbiAgJ2lzTWFwJzogMSxcbiAgJ2l0ZW1JZCc6IDEsXG4gICdpdGVtUHJvcCc6IDEsXG4gICdpdGVtUmVmJzogMSxcbiAgJ2l0ZW1TY29wZSc6IDEsXG4gICdpdGVtVHlwZSc6IDEsXG4gICdraW5kJzogMSxcbiAgJ2xhYmVsJzogMSxcbiAgJ2xhbmcnOiAxLFxuICAnbGlzdCc6IDEsXG4gICdsb29wJzogMSxcbiAgJ21hbmlmZXN0JzogMSxcbiAgJ21heCc6IDEsXG4gICdtYXhMZW5ndGgnOiAxLFxuICAnbWVkaWEnOiAxLFxuICAnbWVkaWFHcm91cCc6IDEsXG4gICdtZXRob2QnOiAxLFxuICAnbWluJzogMSxcbiAgJ21pbkxlbmd0aCc6IDEsXG4gICdtdWx0aXBsZSc6IDEsXG4gICdtdXRlZCc6IDEsXG4gICduYW1lJzogMSxcbiAgJ25vVmFsaWRhdGUnOiAxLFxuICAnb3Blbic6IDEsXG4gICdvcHRpbXVtJzogMSxcbiAgJ3BhdHRlcm4nOiAxLFxuICAncGluZyc6IDEsXG4gICdwbGFjZWhvbGRlcic6IDEsXG4gICdwb3N0ZXInOiAxLFxuICAncHJlbG9hZCc6IDEsXG4gICdyYWRpb0dyb3VwJzogMSxcbiAgJ3JlYWRPbmx5JzogMSxcbiAgJ3JlbCc6IDEsXG4gICdyZXF1aXJlZCc6IDEsXG4gICdyb2xlJzogMSxcbiAgJ3Jvd3MnOiAxLFxuICAncm93U3Bhbic6IDEsXG4gICdzYW5kYm94JzogMSxcbiAgJ3Njb3BlJzogMSxcbiAgJ3Njb3BlZCc6IDEsXG4gICdzY3JvbGxpbmcnOiAxLFxuICAnc2VhbWxlc3MnOiAxLFxuICAnc2VsZWN0ZWQnOiAxLFxuICAnc2hhcGUnOiAxLFxuICAnc2l6ZSc6IDEsXG4gICdzaXplcyc6IDEsXG4gICdzb3J0YWJsZSc6IDEsXG4gICdzcGFuJzogMSxcbiAgJ3NwZWxsQ2hlY2snOiAxLFxuICAnc3JjJzogMSxcbiAgJ3NyY0RvYyc6IDEsXG4gICdzcmNTZXQnOiAxLFxuICAnc3RhcnQnOiAxLFxuICAnc3RlcCc6IDEsXG4gICdzdHlsZSc6IDEsXG4gICd0YWJJbmRleCc6IDEsXG4gICd0YXJnZXQnOiAxLFxuICAndGl0bGUnOiAxLFxuICAndHJhbnNsYXRlJzogMSxcbiAgJ3R5cGUnOiAxLFxuICAndHlwZU11c3RNYXRjaCc6IDEsXG4gICd1c2VNYXAnOiAxLFxuICAndmFsdWUnOiAxLFxuICAnd2lkdGgnOiAxLFxuICAnd21vZGUnOiAxLFxuICAnd3JhcCc6IDEsXG4gICdvbkNvcHknOiAxLFxuICAnb25DdXQnOiAxLFxuICAnb25QYXN0ZSc6IDEsXG4gICdvbkxvYWQnOiAxLFxuICAnb25FcnJvcic6IDEsXG4gICdvbldoZWVsJzogMSxcbiAgJ29uU2Nyb2xsJzogMSxcbiAgJ29uQ29tcG9zaXRpb25FbmQnOiAxLFxuICAnb25Db21wb3NpdGlvblN0YXJ0JzogMSxcbiAgJ29uQ29tcG9zaXRpb25VcGRhdGUnOiAxLFxuICAnb25LZXlEb3duJzogMSxcbiAgJ29uS2V5UHJlc3MnOiAxLFxuICAnb25LZXlVcCc6IDEsXG4gICdvbkZvY3VzJzogMSxcbiAgJ29uQmx1cic6IDEsXG4gICdvbkNoYW5nZSc6IDEsXG4gICdvbklucHV0JzogMSxcbiAgJ29uU3VibWl0JzogMSxcbiAgJ29uQ2xpY2snOiAxLFxuICAnb25Db250ZXh0TWVudSc6IDEsXG4gICdvbkRvdWJsZUNsaWNrJzogMSxcbiAgJ29uRHJhZyc6IDEsXG4gICdvbkRyYWdFbmQnOiAxLFxuICAnb25EcmFnRW50ZXInOiAxLFxuICAnb25EcmFnRXhpdCc6IDEsXG4gICdvbkRyYWdMZWF2ZSc6IDEsXG4gICdvbkRyYWdPdmVyJzogMSxcbiAgJ29uRHJhZ1N0YXJ0JzogMSxcbiAgJ29uRHJvcCc6IDEsXG4gICdvbk1vdXNlRG93bic6IDEsXG4gICdvbk1vdXNlRW50ZXInOiAxLFxuICAnb25Nb3VzZUxlYXZlJzogMSxcbiAgJ29uTW91c2VNb3ZlJzogMSxcbiAgJ29uTW91c2VPdXQnOiAxLFxuICAnb25Nb3VzZU92ZXInOiAxLFxuICAnb25Nb3VzZVVwJzogMSxcbiAgJ29uU2VsZWN0JzogMSxcbiAgJ29uVG91Y2hDYW5jZWwnOiAxLFxuICAnb25Ub3VjaEVuZCc6IDEsXG4gICdvblRvdWNoTW92ZSc6IDEsXG4gICdvblRvdWNoU3RhcnQnOiAxLFxuICAnb25BbmltYXRpb25TdGFydCc6IDEsXG4gICdvbkFuaW1hdGlvbkVuZCc6IDEsXG4gICdvbkFuaW1hdGlvbkl0ZXJhdGlvbic6IDEsXG4gICdvblRyYW5zaXRpb25FbmQnOiAxXG59O1xuLyoqXG4gKiBDaGVja2luZyBmb3IgYXJpYS0qIGFuZCBkYXRhLSogcHJvcHNcbiAqL1xuXG5jb25zdCBwcm9wUmUgPSAvXigoZGF0YXxhcmlhKS0uKikkLztcblxuZnVuY3Rpb24gZmlsdGVyUmVhY3REb21Qcm9wcyhwcm9wcykge1xuICBjb25zdCBmaWx0ZXJQcm9wcyA9IHt9O1xuXG4gIGZvciAoY29uc3QgcHJvcCBpbiBwcm9wcykge1xuICAgIGlmIChwcm9wcy5oYXNPd25Qcm9wZXJ0eShwcm9wKSAmJiAoRE9NUHJvcHNbcHJvcF0gfHwgcHJvcFJlLnRlc3QocHJvcCkpKSB7XG4gICAgICBmaWx0ZXJQcm9wc1twcm9wXSA9IHByb3BzW3Byb3BdO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmaWx0ZXJQcm9wcztcbn1cbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///34\n")},function(module,exports){eval("// Note: this is the semver.org version of the spec that it implements\n// Not necessarily the package version of this code.\nconst SEMVER_SPEC_VERSION = '2.0.0'\n\nconst MAX_LENGTH = 256\nconst MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER ||\n/* istanbul ignore next */ 9007199254740991\n\n// Max safe segment length for coercion.\nconst MAX_SAFE_COMPONENT_LENGTH = 16\n\n// Max safe length for a build identifier. The max length minus 6 characters for\n// the shortest version with a build 0.0.0+BUILD.\nconst MAX_SAFE_BUILD_LENGTH = MAX_LENGTH - 6\n\nconst RELEASE_TYPES = [\n  'major',\n  'premajor',\n  'minor',\n  'preminor',\n  'patch',\n  'prepatch',\n  'prerelease',\n]\n\nmodule.exports = {\n  MAX_LENGTH,\n  MAX_SAFE_COMPONENT_LENGTH,\n  MAX_SAFE_BUILD_LENGTH,\n  MAX_SAFE_INTEGER,\n  RELEASE_TYPES,\n  SEMVER_SPEC_VERSION,\n  FLAG_INCLUDE_PRERELEASE: 0b001,\n  FLAG_LOOSE: 0b010,\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzUuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRvcnEtbmF0aXZlL3JlYWN0LXNwZWN0cnVtL25vZGVfbW9kdWxlcy9zZW12ZXIvaW50ZXJuYWwvY29uc3RhbnRzLmpzP2M4MTQiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gTm90ZTogdGhpcyBpcyB0aGUgc2VtdmVyLm9yZyB2ZXJzaW9uIG9mIHRoZSBzcGVjIHRoYXQgaXQgaW1wbGVtZW50c1xuLy8gTm90IG5lY2Vzc2FyaWx5IHRoZSBwYWNrYWdlIHZlcnNpb24gb2YgdGhpcyBjb2RlLlxuY29uc3QgU0VNVkVSX1NQRUNfVkVSU0lPTiA9ICcyLjAuMCdcblxuY29uc3QgTUFYX0xFTkdUSCA9IDI1NlxuY29uc3QgTUFYX1NBRkVfSU5URUdFUiA9IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSIHx8XG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqLyA5MDA3MTk5MjU0NzQwOTkxXG5cbi8vIE1heCBzYWZlIHNlZ21lbnQgbGVuZ3RoIGZvciBjb2VyY2lvbi5cbmNvbnN0IE1BWF9TQUZFX0NPTVBPTkVOVF9MRU5HVEggPSAxNlxuXG4vLyBNYXggc2FmZSBsZW5ndGggZm9yIGEgYnVpbGQgaWRlbnRpZmllci4gVGhlIG1heCBsZW5ndGggbWludXMgNiBjaGFyYWN0ZXJzIGZvclxuLy8gdGhlIHNob3J0ZXN0IHZlcnNpb24gd2l0aCBhIGJ1aWxkIDAuMC4wK0JVSUxELlxuY29uc3QgTUFYX1NBRkVfQlVJTERfTEVOR1RIID0gTUFYX0xFTkdUSCAtIDZcblxuY29uc3QgUkVMRUFTRV9UWVBFUyA9IFtcbiAgJ21ham9yJyxcbiAgJ3ByZW1ham9yJyxcbiAgJ21pbm9yJyxcbiAgJ3ByZW1pbm9yJyxcbiAgJ3BhdGNoJyxcbiAgJ3ByZXBhdGNoJyxcbiAgJ3ByZXJlbGVhc2UnLFxuXVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgTUFYX0xFTkdUSCxcbiAgTUFYX1NBRkVfQ09NUE9ORU5UX0xFTkdUSCxcbiAgTUFYX1NBRkVfQlVJTERfTEVOR1RILFxuICBNQVhfU0FGRV9JTlRFR0VSLFxuICBSRUxFQVNFX1RZUEVTLFxuICBTRU1WRVJfU1BFQ19WRVJTSU9OLFxuICBGTEFHX0lOQ0xVREVfUFJFUkVMRUFTRTogMGIwMDEsXG4gIEZMQUdfTE9PU0U6IDBiMDEwLFxufVxuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///35\n")},function(module,exports,__webpack_require__){eval("/* WEBPACK VAR INJECTION */(function(process) {const debug = (\n  typeof process === 'object' &&\n  process.env &&\n  process.env.NODE_DEBUG &&\n  /\\bsemver\\b/i.test(process.env.NODE_DEBUG)\n) ? (...args) => console.error('SEMVER', ...args)\n  : () => {}\n\nmodule.exports = debug\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(16)))//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzYuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRvcnEtbmF0aXZlL3JlYWN0LXNwZWN0cnVtL25vZGVfbW9kdWxlcy9zZW12ZXIvaW50ZXJuYWwvZGVidWcuanM/NTRjYiJdLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBkZWJ1ZyA9IChcbiAgdHlwZW9mIHByb2Nlc3MgPT09ICdvYmplY3QnICYmXG4gIHByb2Nlc3MuZW52ICYmXG4gIHByb2Nlc3MuZW52Lk5PREVfREVCVUcgJiZcbiAgL1xcYnNlbXZlclxcYi9pLnRlc3QocHJvY2Vzcy5lbnYuTk9ERV9ERUJVRylcbikgPyAoLi4uYXJncykgPT4gY29uc29sZS5lcnJvcignU0VNVkVSJywgLi4uYXJncylcbiAgOiAoKSA9PiB7fVxuXG5tb2R1bGUuZXhwb3J0cyA9IGRlYnVnXG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///36\n")},function(module,exports,__webpack_require__){eval("const compare = __webpack_require__(11)\nconst gt = (a, b, loose) => compare(a, b, loose) > 0\nmodule.exports = gt\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzcuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRvcnEtbmF0aXZlL3JlYWN0LXNwZWN0cnVtL25vZGVfbW9kdWxlcy9zZW12ZXIvZnVuY3Rpb25zL2d0LmpzPzY4ZmQiXSwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgY29tcGFyZSA9IHJlcXVpcmUoJy4vY29tcGFyZScpXG5jb25zdCBndCA9IChhLCBiLCBsb29zZSkgPT4gY29tcGFyZShhLCBiLCBsb29zZSkgPiAwXG5tb2R1bGUuZXhwb3J0cyA9IGd0XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///37\n")},function(module,exports,__webpack_require__){eval("const ANY = Symbol('SemVer ANY')\n// hoisted class for cyclic dependency\nclass Comparator {\n  static get ANY () {\n    return ANY\n  }\n\n  constructor (comp, options) {\n    options = parseOptions(options)\n\n    if (comp instanceof Comparator) {\n      if (comp.loose === !!options.loose) {\n        return comp\n      } else {\n        comp = comp.value\n      }\n    }\n\n    comp = comp.trim().split(/\\s+/).join(' ')\n    debug('comparator', comp, options)\n    this.options = options\n    this.loose = !!options.loose\n    this.parse(comp)\n\n    if (this.semver === ANY) {\n      this.value = ''\n    } else {\n      this.value = this.operator + this.semver.version\n    }\n\n    debug('comp', this)\n  }\n\n  parse (comp) {\n    const r = this.options.loose ? re[t.COMPARATORLOOSE] : re[t.COMPARATOR]\n    const m = comp.match(r)\n\n    if (!m) {\n      throw new TypeError(`Invalid comparator: ${comp}`)\n    }\n\n    this.operator = m[1] !== undefined ? m[1] : ''\n    if (this.operator === '=') {\n      this.operator = ''\n    }\n\n    // if it literally is just '>' or '' then allow anything.\n    if (!m[2]) {\n      this.semver = ANY\n    } else {\n      this.semver = new SemVer(m[2], this.options.loose)\n    }\n  }\n\n  toString () {\n    return this.value\n  }\n\n  test (version) {\n    debug('Comparator.test', version, this.options.loose)\n\n    if (this.semver === ANY || version === ANY) {\n      return true\n    }\n\n    if (typeof version === 'string') {\n      try {\n        version = new SemVer(version, this.options)\n      } catch (er) {\n        return false\n      }\n    }\n\n    return cmp(version, this.operator, this.semver, this.options)\n  }\n\n  intersects (comp, options) {\n    if (!(comp instanceof Comparator)) {\n      throw new TypeError('a Comparator is required')\n    }\n\n    if (this.operator === '') {\n      if (this.value === '') {\n        return true\n      }\n      return new Range(comp.value, options).test(this.value)\n    } else if (comp.operator === '') {\n      if (comp.value === '') {\n        return true\n      }\n      return new Range(this.value, options).test(comp.semver)\n    }\n\n    options = parseOptions(options)\n\n    // Special cases where nothing can possibly be lower\n    if (options.includePrerelease &&\n      (this.value === '<0.0.0-0' || comp.value === '<0.0.0-0')) {\n      return false\n    }\n    if (!options.includePrerelease &&\n      (this.value.startsWith('<0.0.0') || comp.value.startsWith('<0.0.0'))) {\n      return false\n    }\n\n    // Same direction increasing (> or >=)\n    if (this.operator.startsWith('>') && comp.operator.startsWith('>')) {\n      return true\n    }\n    // Same direction decreasing (< or <=)\n    if (this.operator.startsWith('<') && comp.operator.startsWith('<')) {\n      return true\n    }\n    // same SemVer and both sides are inclusive (<= or >=)\n    if (\n      (this.semver.version === comp.semver.version) &&\n      this.operator.includes('=') && comp.operator.includes('=')) {\n      return true\n    }\n    // opposite directions less than\n    if (cmp(this.semver, '<', comp.semver, options) &&\n      this.operator.startsWith('>') && comp.operator.startsWith('<')) {\n      return true\n    }\n    // opposite directions greater than\n    if (cmp(this.semver, '>', comp.semver, options) &&\n      this.operator.startsWith('<') && comp.operator.startsWith('>')) {\n      return true\n    }\n    return false\n  }\n}\n\nmodule.exports = Comparator\n\nconst parseOptions = __webpack_require__(48)\nconst { safeRe: re, t } = __webpack_require__(29)\nconst cmp = __webpack_require__(68)\nconst debug = __webpack_require__(36)\nconst SemVer = __webpack_require__(10)\nconst Range = __webpack_require__(12)\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzguanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRvcnEtbmF0aXZlL3JlYWN0LXNwZWN0cnVtL25vZGVfbW9kdWxlcy9zZW12ZXIvY2xhc3Nlcy9jb21wYXJhdG9yLmpzP2YzMjYiXSwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgQU5ZID0gU3ltYm9sKCdTZW1WZXIgQU5ZJylcbi8vIGhvaXN0ZWQgY2xhc3MgZm9yIGN5Y2xpYyBkZXBlbmRlbmN5XG5jbGFzcyBDb21wYXJhdG9yIHtcbiAgc3RhdGljIGdldCBBTlkgKCkge1xuICAgIHJldHVybiBBTllcbiAgfVxuXG4gIGNvbnN0cnVjdG9yIChjb21wLCBvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IHBhcnNlT3B0aW9ucyhvcHRpb25zKVxuXG4gICAgaWYgKGNvbXAgaW5zdGFuY2VvZiBDb21wYXJhdG9yKSB7XG4gICAgICBpZiAoY29tcC5sb29zZSA9PT0gISFvcHRpb25zLmxvb3NlKSB7XG4gICAgICAgIHJldHVybiBjb21wXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb21wID0gY29tcC52YWx1ZVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbXAgPSBjb21wLnRyaW0oKS5zcGxpdCgvXFxzKy8pLmpvaW4oJyAnKVxuICAgIGRlYnVnKCdjb21wYXJhdG9yJywgY29tcCwgb3B0aW9ucylcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zXG4gICAgdGhpcy5sb29zZSA9ICEhb3B0aW9ucy5sb29zZVxuICAgIHRoaXMucGFyc2UoY29tcClcblxuICAgIGlmICh0aGlzLnNlbXZlciA9PT0gQU5ZKSB7XG4gICAgICB0aGlzLnZhbHVlID0gJydcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy52YWx1ZSA9IHRoaXMub3BlcmF0b3IgKyB0aGlzLnNlbXZlci52ZXJzaW9uXG4gICAgfVxuXG4gICAgZGVidWcoJ2NvbXAnLCB0aGlzKVxuICB9XG5cbiAgcGFyc2UgKGNvbXApIHtcbiAgICBjb25zdCByID0gdGhpcy5vcHRpb25zLmxvb3NlID8gcmVbdC5DT01QQVJBVE9STE9PU0VdIDogcmVbdC5DT01QQVJBVE9SXVxuICAgIGNvbnN0IG0gPSBjb21wLm1hdGNoKHIpXG5cbiAgICBpZiAoIW0pIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEludmFsaWQgY29tcGFyYXRvcjogJHtjb21wfWApXG4gICAgfVxuXG4gICAgdGhpcy5vcGVyYXRvciA9IG1bMV0gIT09IHVuZGVmaW5lZCA/IG1bMV0gOiAnJ1xuICAgIGlmICh0aGlzLm9wZXJhdG9yID09PSAnPScpIHtcbiAgICAgIHRoaXMub3BlcmF0b3IgPSAnJ1xuICAgIH1cblxuICAgIC8vIGlmIGl0IGxpdGVyYWxseSBpcyBqdXN0ICc+JyBvciAnJyB0aGVuIGFsbG93IGFueXRoaW5nLlxuICAgIGlmICghbVsyXSkge1xuICAgICAgdGhpcy5zZW12ZXIgPSBBTllcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZW12ZXIgPSBuZXcgU2VtVmVyKG1bMl0sIHRoaXMub3B0aW9ucy5sb29zZSlcbiAgICB9XG4gIH1cblxuICB0b1N0cmluZyAoKSB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWVcbiAgfVxuXG4gIHRlc3QgKHZlcnNpb24pIHtcbiAgICBkZWJ1ZygnQ29tcGFyYXRvci50ZXN0JywgdmVyc2lvbiwgdGhpcy5vcHRpb25zLmxvb3NlKVxuXG4gICAgaWYgKHRoaXMuc2VtdmVyID09PSBBTlkgfHwgdmVyc2lvbiA9PT0gQU5ZKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdmVyc2lvbiA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHZlcnNpb24gPSBuZXcgU2VtVmVyKHZlcnNpb24sIHRoaXMub3B0aW9ucylcbiAgICAgIH0gY2F0Y2ggKGVyKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjbXAodmVyc2lvbiwgdGhpcy5vcGVyYXRvciwgdGhpcy5zZW12ZXIsIHRoaXMub3B0aW9ucylcbiAgfVxuXG4gIGludGVyc2VjdHMgKGNvbXAsIG9wdGlvbnMpIHtcbiAgICBpZiAoIShjb21wIGluc3RhbmNlb2YgQ29tcGFyYXRvcikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2EgQ29tcGFyYXRvciBpcyByZXF1aXJlZCcpXG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3BlcmF0b3IgPT09ICcnKSB7XG4gICAgICBpZiAodGhpcy52YWx1ZSA9PT0gJycpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXcgUmFuZ2UoY29tcC52YWx1ZSwgb3B0aW9ucykudGVzdCh0aGlzLnZhbHVlKVxuICAgIH0gZWxzZSBpZiAoY29tcC5vcGVyYXRvciA9PT0gJycpIHtcbiAgICAgIGlmIChjb21wLnZhbHVlID09PSAnJykge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyBSYW5nZSh0aGlzLnZhbHVlLCBvcHRpb25zKS50ZXN0KGNvbXAuc2VtdmVyKVxuICAgIH1cblxuICAgIG9wdGlvbnMgPSBwYXJzZU9wdGlvbnMob3B0aW9ucylcblxuICAgIC8vIFNwZWNpYWwgY2FzZXMgd2hlcmUgbm90aGluZyBjYW4gcG9zc2libHkgYmUgbG93ZXJcbiAgICBpZiAob3B0aW9ucy5pbmNsdWRlUHJlcmVsZWFzZSAmJlxuICAgICAgKHRoaXMudmFsdWUgPT09ICc8MC4wLjAtMCcgfHwgY29tcC52YWx1ZSA9PT0gJzwwLjAuMC0wJykpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICBpZiAoIW9wdGlvbnMuaW5jbHVkZVByZXJlbGVhc2UgJiZcbiAgICAgICh0aGlzLnZhbHVlLnN0YXJ0c1dpdGgoJzwwLjAuMCcpIHx8IGNvbXAudmFsdWUuc3RhcnRzV2l0aCgnPDAuMC4wJykpKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICAvLyBTYW1lIGRpcmVjdGlvbiBpbmNyZWFzaW5nICg+IG9yID49KVxuICAgIGlmICh0aGlzLm9wZXJhdG9yLnN0YXJ0c1dpdGgoJz4nKSAmJiBjb21wLm9wZXJhdG9yLnN0YXJ0c1dpdGgoJz4nKSkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gICAgLy8gU2FtZSBkaXJlY3Rpb24gZGVjcmVhc2luZyAoPCBvciA8PSlcbiAgICBpZiAodGhpcy5vcGVyYXRvci5zdGFydHNXaXRoKCc8JykgJiYgY29tcC5vcGVyYXRvci5zdGFydHNXaXRoKCc8JykpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIC8vIHNhbWUgU2VtVmVyIGFuZCBib3RoIHNpZGVzIGFyZSBpbmNsdXNpdmUgKDw9IG9yID49KVxuICAgIGlmIChcbiAgICAgICh0aGlzLnNlbXZlci52ZXJzaW9uID09PSBjb21wLnNlbXZlci52ZXJzaW9uKSAmJlxuICAgICAgdGhpcy5vcGVyYXRvci5pbmNsdWRlcygnPScpICYmIGNvbXAub3BlcmF0b3IuaW5jbHVkZXMoJz0nKSkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gICAgLy8gb3Bwb3NpdGUgZGlyZWN0aW9ucyBsZXNzIHRoYW5cbiAgICBpZiAoY21wKHRoaXMuc2VtdmVyLCAnPCcsIGNvbXAuc2VtdmVyLCBvcHRpb25zKSAmJlxuICAgICAgdGhpcy5vcGVyYXRvci5zdGFydHNXaXRoKCc+JykgJiYgY29tcC5vcGVyYXRvci5zdGFydHNXaXRoKCc8JykpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIC8vIG9wcG9zaXRlIGRpcmVjdGlvbnMgZ3JlYXRlciB0aGFuXG4gICAgaWYgKGNtcCh0aGlzLnNlbXZlciwgJz4nLCBjb21wLnNlbXZlciwgb3B0aW9ucykgJiZcbiAgICAgIHRoaXMub3BlcmF0b3Iuc3RhcnRzV2l0aCgnPCcpICYmIGNvbXAub3BlcmF0b3Iuc3RhcnRzV2l0aCgnPicpKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IENvbXBhcmF0b3JcblxuY29uc3QgcGFyc2VPcHRpb25zID0gcmVxdWlyZSgnLi4vaW50ZXJuYWwvcGFyc2Utb3B0aW9ucycpXG5jb25zdCB7IHNhZmVSZTogcmUsIHQgfSA9IHJlcXVpcmUoJy4uL2ludGVybmFsL3JlJylcbmNvbnN0IGNtcCA9IHJlcXVpcmUoJy4uL2Z1bmN0aW9ucy9jbXAnKVxuY29uc3QgZGVidWcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbC9kZWJ1ZycpXG5jb25zdCBTZW1WZXIgPSByZXF1aXJlKCcuL3NlbXZlcicpXG5jb25zdCBSYW5nZSA9IHJlcXVpcmUoJy4vcmFuZ2UnKVxuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///38\n")},function(module,exports,__webpack_require__){eval("const Range = __webpack_require__(12)\nconst satisfies = (version, range, options) => {\n  try {\n    range = new Range(range, options)\n  } catch (er) {\n    return false\n  }\n  return range.test(version)\n}\nmodule.exports = satisfies\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzkuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRvcnEtbmF0aXZlL3JlYWN0LXNwZWN0cnVtL25vZGVfbW9kdWxlcy9zZW12ZXIvZnVuY3Rpb25zL3NhdGlzZmllcy5qcz8yMjY4Il0sInNvdXJjZXNDb250ZW50IjpbImNvbnN0IFJhbmdlID0gcmVxdWlyZSgnLi4vY2xhc3Nlcy9yYW5nZScpXG5jb25zdCBzYXRpc2ZpZXMgPSAodmVyc2lvbiwgcmFuZ2UsIG9wdGlvbnMpID0+IHtcbiAgdHJ5IHtcbiAgICByYW5nZSA9IG5ldyBSYW5nZShyYW5nZSwgb3B0aW9ucylcbiAgfSBjYXRjaCAoZXIpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuICByZXR1cm4gcmFuZ2UudGVzdCh2ZXJzaW9uKVxufVxubW9kdWxlLmV4cG9ydHMgPSBzYXRpc2ZpZXNcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///39\n")},function(module,exports,__webpack_require__){eval("var api = __webpack_require__(5);\n            var content = __webpack_require__(224);\n\n            content = content.__esModule ? content.default : content;\n\n            if (typeof content === 'string') {\n              content = [[module.i, content, '']];\n            }\n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = api(content, options);\n\n\n\nmodule.exports = content.locals || {};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDAuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRvcnEtbmF0aXZlL3JlYWN0LXNwZWN0cnVtL3NwZWN0cnVtLWNzcy1vdmVycmlkZXMvdHlwb2dyYXBoeS9pbmRleC5jc3M/NDA5MCJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgYXBpID0gcmVxdWlyZShcIiEuLi8uLi8uLi8uLi9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luamVjdFN0eWxlc0ludG9TdHlsZVRhZy5qc1wiKTtcbiAgICAgICAgICAgIHZhciBjb250ZW50ID0gcmVxdWlyZShcIiEhLi4vLi4vLi4vLi4vY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL2luZGV4LmNzc1wiKTtcblxuICAgICAgICAgICAgY29udGVudCA9IGNvbnRlbnQuX19lc01vZHVsZSA/IGNvbnRlbnQuZGVmYXVsdCA6IGNvbnRlbnQ7XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgY29udGVudCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgY29udGVudCA9IFtbbW9kdWxlLmlkLCBjb250ZW50LCAnJ11dO1xuICAgICAgICAgICAgfVxuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLmluc2VydCA9IFwiaGVhZFwiO1xub3B0aW9ucy5zaW5nbGV0b24gPSBmYWxzZTtcblxudmFyIHVwZGF0ZSA9IGFwaShjb250ZW50LCBvcHRpb25zKTtcblxuXG5cbm1vZHVsZS5leHBvcnRzID0gY29udGVudC5sb2NhbHMgfHwge307Il0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///40\n")},function(module,exports,__webpack_require__){eval("/**\n * DES (Data Encryption Standard) implementation.\n *\n * This implementation supports DES as well as 3DES-EDE in ECB and CBC mode.\n * It is based on the BSD-licensed implementation by Paul Tero:\n *\n * Paul Tero, July 2001\n * http://www.tero.co.uk/des/\n *\n * Optimised for performance with large blocks by\n * Michael Hayworth, November 2001\n * http://www.netdealing.com\n *\n * THIS SOFTWARE IS PROVIDED \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n *\n * @author Stefan Siegl\n * @author Dave Longley\n *\n * Copyright (c) 2012 Stefan Siegl <stesie@brokenpipe.de>\n * Copyright (c) 2012-2014 Digital Bazaar, Inc.\n */\nvar forge = __webpack_require__(4);\n__webpack_require__(54);\n__webpack_require__(78);\n__webpack_require__(7);\n\n/* DES API */\nmodule.exports = forge.des = forge.des || {};\n\n/**\n * Deprecated. Instead, use:\n *\n * var cipher = forge.cipher.createCipher('DES-<mode>', key);\n * cipher.start({iv: iv});\n *\n * Creates an DES cipher object to encrypt data using the given symmetric key.\n * The output will be stored in the 'output' member of the returned cipher.\n *\n * The key and iv may be given as binary-encoded strings of bytes or\n * byte buffers.\n *\n * @param key the symmetric key to use (64 or 192 bits).\n * @param iv the initialization vector to use.\n * @param output the buffer to write to, null to create one.\n * @param mode the cipher mode to use (default: 'CBC' if IV is\n *          given, 'ECB' if null).\n *\n * @return the cipher.\n */\nforge.des.startEncrypting = function(key, iv, output, mode) {\n  var cipher = _createCipher({\n    key: key,\n    output: output,\n    decrypt: false,\n    mode: mode || (iv === null ? 'ECB' : 'CBC')\n  });\n  cipher.start(iv);\n  return cipher;\n};\n\n/**\n * Deprecated. Instead, use:\n *\n * var cipher = forge.cipher.createCipher('DES-<mode>', key);\n *\n * Creates an DES cipher object to encrypt data using the given symmetric key.\n *\n * The key may be given as a binary-encoded string of bytes or a byte buffer.\n *\n * @param key the symmetric key to use (64 or 192 bits).\n * @param mode the cipher mode to use (default: 'CBC').\n *\n * @return the cipher.\n */\nforge.des.createEncryptionCipher = function(key, mode) {\n  return _createCipher({\n    key: key,\n    output: null,\n    decrypt: false,\n    mode: mode\n  });\n};\n\n/**\n * Deprecated. Instead, use:\n *\n * var decipher = forge.cipher.createDecipher('DES-<mode>', key);\n * decipher.start({iv: iv});\n *\n * Creates an DES cipher object to decrypt data using the given symmetric key.\n * The output will be stored in the 'output' member of the returned cipher.\n *\n * The key and iv may be given as binary-encoded strings of bytes or\n * byte buffers.\n *\n * @param key the symmetric key to use (64 or 192 bits).\n * @param iv the initialization vector to use.\n * @param output the buffer to write to, null to create one.\n * @param mode the cipher mode to use (default: 'CBC' if IV is\n *          given, 'ECB' if null).\n *\n * @return the cipher.\n */\nforge.des.startDecrypting = function(key, iv, output, mode) {\n  var cipher = _createCipher({\n    key: key,\n    output: output,\n    decrypt: true,\n    mode: mode || (iv === null ? 'ECB' : 'CBC')\n  });\n  cipher.start(iv);\n  return cipher;\n};\n\n/**\n * Deprecated. Instead, use:\n *\n * var decipher = forge.cipher.createDecipher('DES-<mode>', key);\n *\n * Creates an DES cipher object to decrypt data using the given symmetric key.\n *\n * The key may be given as a binary-encoded string of bytes or a byte buffer.\n *\n * @param key the symmetric key to use (64 or 192 bits).\n * @param mode the cipher mode to use (default: 'CBC').\n *\n * @return the cipher.\n */\nforge.des.createDecryptionCipher = function(key, mode) {\n  return _createCipher({\n    key: key,\n    output: null,\n    decrypt: true,\n    mode: mode\n  });\n};\n\n/**\n * Creates a new DES cipher algorithm object.\n *\n * @param name the name of the algorithm.\n * @param mode the mode factory function.\n *\n * @return the DES algorithm object.\n */\nforge.des.Algorithm = function(name, mode) {\n  var self = this;\n  self.name = name;\n  self.mode = new mode({\n    blockSize: 8,\n    cipher: {\n      encrypt: function(inBlock, outBlock) {\n        return _updateBlock(self._keys, inBlock, outBlock, false);\n      },\n      decrypt: function(inBlock, outBlock) {\n        return _updateBlock(self._keys, inBlock, outBlock, true);\n      }\n    }\n  });\n  self._init = false;\n};\n\n/**\n * Initializes this DES algorithm by expanding its key.\n *\n * @param options the options to use.\n *          key the key to use with this algorithm.\n *          decrypt true if the algorithm should be initialized for decryption,\n *            false for encryption.\n */\nforge.des.Algorithm.prototype.initialize = function(options) {\n  if(this._init) {\n    return;\n  }\n\n  var key = forge.util.createBuffer(options.key);\n  if(this.name.indexOf('3DES') === 0) {\n    if(key.length() !== 24) {\n      throw new Error('Invalid Triple-DES key size: ' + key.length() * 8);\n    }\n  }\n\n  // do key expansion to 16 or 48 subkeys (single or triple DES)\n  this._keys = _createKeys(key);\n  this._init = true;\n};\n\n/** Register DES algorithms **/\n\nregisterAlgorithm('DES-ECB', forge.cipher.modes.ecb);\nregisterAlgorithm('DES-CBC', forge.cipher.modes.cbc);\nregisterAlgorithm('DES-CFB', forge.cipher.modes.cfb);\nregisterAlgorithm('DES-OFB', forge.cipher.modes.ofb);\nregisterAlgorithm('DES-CTR', forge.cipher.modes.ctr);\n\nregisterAlgorithm('3DES-ECB', forge.cipher.modes.ecb);\nregisterAlgorithm('3DES-CBC', forge.cipher.modes.cbc);\nregisterAlgorithm('3DES-CFB', forge.cipher.modes.cfb);\nregisterAlgorithm('3DES-OFB', forge.cipher.modes.ofb);\nregisterAlgorithm('3DES-CTR', forge.cipher.modes.ctr);\n\nfunction registerAlgorithm(name, mode) {\n  var factory = function() {\n    return new forge.des.Algorithm(name, mode);\n  };\n  forge.cipher.registerAlgorithm(name, factory);\n}\n\n/** DES implementation **/\n\nvar spfunction1 = [0x1010400,0,0x10000,0x1010404,0x1010004,0x10404,0x4,0x10000,0x400,0x1010400,0x1010404,0x400,0x1000404,0x1010004,0x1000000,0x4,0x404,0x1000400,0x1000400,0x10400,0x10400,0x1010000,0x1010000,0x1000404,0x10004,0x1000004,0x1000004,0x10004,0,0x404,0x10404,0x1000000,0x10000,0x1010404,0x4,0x1010000,0x1010400,0x1000000,0x1000000,0x400,0x1010004,0x10000,0x10400,0x1000004,0x400,0x4,0x1000404,0x10404,0x1010404,0x10004,0x1010000,0x1000404,0x1000004,0x404,0x10404,0x1010400,0x404,0x1000400,0x1000400,0,0x10004,0x10400,0,0x1010004];\nvar spfunction2 = [-0x7fef7fe0,-0x7fff8000,0x8000,0x108020,0x100000,0x20,-0x7fefffe0,-0x7fff7fe0,-0x7fffffe0,-0x7fef7fe0,-0x7fef8000,-0x80000000,-0x7fff8000,0x100000,0x20,-0x7fefffe0,0x108000,0x100020,-0x7fff7fe0,0,-0x80000000,0x8000,0x108020,-0x7ff00000,0x100020,-0x7fffffe0,0,0x108000,0x8020,-0x7fef8000,-0x7ff00000,0x8020,0,0x108020,-0x7fefffe0,0x100000,-0x7fff7fe0,-0x7ff00000,-0x7fef8000,0x8000,-0x7ff00000,-0x7fff8000,0x20,-0x7fef7fe0,0x108020,0x20,0x8000,-0x80000000,0x8020,-0x7fef8000,0x100000,-0x7fffffe0,0x100020,-0x7fff7fe0,-0x7fffffe0,0x100020,0x108000,0,-0x7fff8000,0x8020,-0x80000000,-0x7fefffe0,-0x7fef7fe0,0x108000];\nvar spfunction3 = [0x208,0x8020200,0,0x8020008,0x8000200,0,0x20208,0x8000200,0x20008,0x8000008,0x8000008,0x20000,0x8020208,0x20008,0x8020000,0x208,0x8000000,0x8,0x8020200,0x200,0x20200,0x8020000,0x8020008,0x20208,0x8000208,0x20200,0x20000,0x8000208,0x8,0x8020208,0x200,0x8000000,0x8020200,0x8000000,0x20008,0x208,0x20000,0x8020200,0x8000200,0,0x200,0x20008,0x8020208,0x8000200,0x8000008,0x200,0,0x8020008,0x8000208,0x20000,0x8000000,0x8020208,0x8,0x20208,0x20200,0x8000008,0x8020000,0x8000208,0x208,0x8020000,0x20208,0x8,0x8020008,0x20200];\nvar spfunction4 = [0x802001,0x2081,0x2081,0x80,0x802080,0x800081,0x800001,0x2001,0,0x802000,0x802000,0x802081,0x81,0,0x800080,0x800001,0x1,0x2000,0x800000,0x802001,0x80,0x800000,0x2001,0x2080,0x800081,0x1,0x2080,0x800080,0x2000,0x802080,0x802081,0x81,0x800080,0x800001,0x802000,0x802081,0x81,0,0,0x802000,0x2080,0x800080,0x800081,0x1,0x802001,0x2081,0x2081,0x80,0x802081,0x81,0x1,0x2000,0x800001,0x2001,0x802080,0x800081,0x2001,0x2080,0x800000,0x802001,0x80,0x800000,0x2000,0x802080];\nvar spfunction5 = [0x100,0x2080100,0x2080000,0x42000100,0x80000,0x100,0x40000000,0x2080000,0x40080100,0x80000,0x2000100,0x40080100,0x42000100,0x42080000,0x80100,0x40000000,0x2000000,0x40080000,0x40080000,0,0x40000100,0x42080100,0x42080100,0x2000100,0x42080000,0x40000100,0,0x42000000,0x2080100,0x2000000,0x42000000,0x80100,0x80000,0x42000100,0x100,0x2000000,0x40000000,0x2080000,0x42000100,0x40080100,0x2000100,0x40000000,0x42080000,0x2080100,0x40080100,0x100,0x2000000,0x42080000,0x42080100,0x80100,0x42000000,0x42080100,0x2080000,0,0x40080000,0x42000000,0x80100,0x2000100,0x40000100,0x80000,0,0x40080000,0x2080100,0x40000100];\nvar spfunction6 = [0x20000010,0x20400000,0x4000,0x20404010,0x20400000,0x10,0x20404010,0x400000,0x20004000,0x404010,0x400000,0x20000010,0x400010,0x20004000,0x20000000,0x4010,0,0x400010,0x20004010,0x4000,0x404000,0x20004010,0x10,0x20400010,0x20400010,0,0x404010,0x20404000,0x4010,0x404000,0x20404000,0x20000000,0x20004000,0x10,0x20400010,0x404000,0x20404010,0x400000,0x4010,0x20000010,0x400000,0x20004000,0x20000000,0x4010,0x20000010,0x20404010,0x404000,0x20400000,0x404010,0x20404000,0,0x20400010,0x10,0x4000,0x20400000,0x404010,0x4000,0x400010,0x20004010,0,0x20404000,0x20000000,0x400010,0x20004010];\nvar spfunction7 = [0x200000,0x4200002,0x4000802,0,0x800,0x4000802,0x200802,0x4200800,0x4200802,0x200000,0,0x4000002,0x2,0x4000000,0x4200002,0x802,0x4000800,0x200802,0x200002,0x4000800,0x4000002,0x4200000,0x4200800,0x200002,0x4200000,0x800,0x802,0x4200802,0x200800,0x2,0x4000000,0x200800,0x4000000,0x200800,0x200000,0x4000802,0x4000802,0x4200002,0x4200002,0x2,0x200002,0x4000000,0x4000800,0x200000,0x4200800,0x802,0x200802,0x4200800,0x802,0x4000002,0x4200802,0x4200000,0x200800,0,0x2,0x4200802,0,0x200802,0x4200000,0x800,0x4000002,0x4000800,0x800,0x200002];\nvar spfunction8 = [0x10001040,0x1000,0x40000,0x10041040,0x10000000,0x10001040,0x40,0x10000000,0x40040,0x10040000,0x10041040,0x41000,0x10041000,0x41040,0x1000,0x40,0x10040000,0x10000040,0x10001000,0x1040,0x41000,0x40040,0x10040040,0x10041000,0x1040,0,0,0x10040040,0x10000040,0x10001000,0x41040,0x40000,0x41040,0x40000,0x10041000,0x1000,0x40,0x10040040,0x1000,0x41040,0x10001000,0x40,0x10000040,0x10040000,0x10040040,0x10000000,0x40000,0x10001040,0,0x10041040,0x40040,0x10000040,0x10040000,0x10001000,0x10001040,0,0x10041040,0x41000,0x41000,0x1040,0x1040,0x40040,0x10000000,0x10041000];\n\n/**\n * Create necessary sub keys.\n *\n * @param key the 64-bit or 192-bit key.\n *\n * @return the expanded keys.\n */\nfunction _createKeys(key) {\n  var pc2bytes0  = [0,0x4,0x20000000,0x20000004,0x10000,0x10004,0x20010000,0x20010004,0x200,0x204,0x20000200,0x20000204,0x10200,0x10204,0x20010200,0x20010204],\n      pc2bytes1  = [0,0x1,0x100000,0x100001,0x4000000,0x4000001,0x4100000,0x4100001,0x100,0x101,0x100100,0x100101,0x4000100,0x4000101,0x4100100,0x4100101],\n      pc2bytes2  = [0,0x8,0x800,0x808,0x1000000,0x1000008,0x1000800,0x1000808,0,0x8,0x800,0x808,0x1000000,0x1000008,0x1000800,0x1000808],\n      pc2bytes3  = [0,0x200000,0x8000000,0x8200000,0x2000,0x202000,0x8002000,0x8202000,0x20000,0x220000,0x8020000,0x8220000,0x22000,0x222000,0x8022000,0x8222000],\n      pc2bytes4  = [0,0x40000,0x10,0x40010,0,0x40000,0x10,0x40010,0x1000,0x41000,0x1010,0x41010,0x1000,0x41000,0x1010,0x41010],\n      pc2bytes5  = [0,0x400,0x20,0x420,0,0x400,0x20,0x420,0x2000000,0x2000400,0x2000020,0x2000420,0x2000000,0x2000400,0x2000020,0x2000420],\n      pc2bytes6  = [0,0x10000000,0x80000,0x10080000,0x2,0x10000002,0x80002,0x10080002,0,0x10000000,0x80000,0x10080000,0x2,0x10000002,0x80002,0x10080002],\n      pc2bytes7  = [0,0x10000,0x800,0x10800,0x20000000,0x20010000,0x20000800,0x20010800,0x20000,0x30000,0x20800,0x30800,0x20020000,0x20030000,0x20020800,0x20030800],\n      pc2bytes8  = [0,0x40000,0,0x40000,0x2,0x40002,0x2,0x40002,0x2000000,0x2040000,0x2000000,0x2040000,0x2000002,0x2040002,0x2000002,0x2040002],\n      pc2bytes9  = [0,0x10000000,0x8,0x10000008,0,0x10000000,0x8,0x10000008,0x400,0x10000400,0x408,0x10000408,0x400,0x10000400,0x408,0x10000408],\n      pc2bytes10 = [0,0x20,0,0x20,0x100000,0x100020,0x100000,0x100020,0x2000,0x2020,0x2000,0x2020,0x102000,0x102020,0x102000,0x102020],\n      pc2bytes11 = [0,0x1000000,0x200,0x1000200,0x200000,0x1200000,0x200200,0x1200200,0x4000000,0x5000000,0x4000200,0x5000200,0x4200000,0x5200000,0x4200200,0x5200200],\n      pc2bytes12 = [0,0x1000,0x8000000,0x8001000,0x80000,0x81000,0x8080000,0x8081000,0x10,0x1010,0x8000010,0x8001010,0x80010,0x81010,0x8080010,0x8081010],\n      pc2bytes13 = [0,0x4,0x100,0x104,0,0x4,0x100,0x104,0x1,0x5,0x101,0x105,0x1,0x5,0x101,0x105];\n\n  // how many iterations (1 for des, 3 for triple des)\n  // changed by Paul 16/6/2007 to use Triple DES for 9+ byte keys\n  var iterations = key.length() > 8 ? 3 : 1;\n\n  // stores the return keys\n  var keys = [];\n\n  // now define the left shifts which need to be done\n  var shifts = [0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0];\n\n  var n = 0, tmp;\n  for(var j = 0; j < iterations; j++) {\n    var left = key.getInt32();\n    var right = key.getInt32();\n\n    tmp = ((left >>> 4) ^ right) & 0x0f0f0f0f;\n    right ^= tmp;\n    left ^= (tmp << 4);\n\n    tmp = ((right >>> -16) ^ left) & 0x0000ffff;\n    left ^= tmp;\n    right ^= (tmp << -16);\n\n    tmp = ((left >>> 2) ^ right) & 0x33333333;\n    right ^= tmp;\n    left ^= (tmp << 2);\n\n    tmp = ((right >>> -16) ^ left) & 0x0000ffff;\n    left ^= tmp;\n    right ^= (tmp << -16);\n\n    tmp = ((left >>> 1) ^ right) & 0x55555555;\n    right ^= tmp;\n    left ^= (tmp << 1);\n\n    tmp = ((right >>> 8) ^ left) & 0x00ff00ff;\n    left ^= tmp;\n    right ^= (tmp << 8);\n\n    tmp = ((left >>> 1) ^ right) & 0x55555555;\n    right ^= tmp;\n    left ^= (tmp << 1);\n\n    // right needs to be shifted and OR'd with last four bits of left\n    tmp = (left << 8) | ((right >>> 20) & 0x000000f0);\n\n    // left needs to be put upside down\n    left = ((right << 24) | ((right << 8) & 0xff0000) |\n      ((right >>> 8) & 0xff00) | ((right >>> 24) & 0xf0));\n    right = tmp;\n\n    // now go through and perform these shifts on the left and right keys\n    for(var i = 0; i < shifts.length; ++i) {\n      //shift the keys either one or two bits to the left\n      if(shifts[i]) {\n        left = (left << 2) | (left >>> 26);\n        right = (right << 2) | (right >>> 26);\n      } else {\n        left = (left << 1) | (left >>> 27);\n        right = (right << 1) | (right >>> 27);\n      }\n      left &= -0xf;\n      right &= -0xf;\n\n      // now apply PC-2, in such a way that E is easier when encrypting or\n      // decrypting this conversion will look like PC-2 except only the last 6\n      // bits of each byte are used rather than 48 consecutive bits and the\n      // order of lines will be according to how the S selection functions will\n      // be applied: S2, S4, S6, S8, S1, S3, S5, S7\n      var lefttmp = (\n        pc2bytes0[left >>> 28] | pc2bytes1[(left >>> 24) & 0xf] |\n        pc2bytes2[(left >>> 20) & 0xf] | pc2bytes3[(left >>> 16) & 0xf] |\n        pc2bytes4[(left >>> 12) & 0xf] | pc2bytes5[(left >>> 8) & 0xf] |\n        pc2bytes6[(left >>> 4) & 0xf]);\n      var righttmp = (\n        pc2bytes7[right >>> 28] | pc2bytes8[(right >>> 24) & 0xf] |\n        pc2bytes9[(right >>> 20) & 0xf] | pc2bytes10[(right >>> 16) & 0xf] |\n        pc2bytes11[(right >>> 12) & 0xf] | pc2bytes12[(right >>> 8) & 0xf] |\n        pc2bytes13[(right >>> 4) & 0xf]);\n      tmp = ((righttmp >>> 16) ^ lefttmp) & 0x0000ffff;\n      keys[n++] = lefttmp ^ tmp;\n      keys[n++] = righttmp ^ (tmp << 16);\n    }\n  }\n\n  return keys;\n}\n\n/**\n * Updates a single block (1 byte) using DES. The update will either\n * encrypt or decrypt the block.\n *\n * @param keys the expanded keys.\n * @param input the input block (an array of 32-bit words).\n * @param output the updated output block.\n * @param decrypt true to decrypt the block, false to encrypt it.\n */\nfunction _updateBlock(keys, input, output, decrypt) {\n  // set up loops for single or triple DES\n  var iterations = keys.length === 32 ? 3 : 9;\n  var looping;\n  if(iterations === 3) {\n    looping = decrypt ? [30, -2, -2] : [0, 32, 2];\n  } else {\n    looping = (decrypt ?\n      [94, 62, -2, 32, 64, 2, 30, -2, -2] :\n      [0, 32, 2, 62, 30, -2, 64, 96, 2]);\n  }\n\n  var tmp;\n\n  var left = input[0];\n  var right = input[1];\n\n  // first each 64 bit chunk of the message must be permuted according to IP\n  tmp = ((left >>> 4) ^ right) & 0x0f0f0f0f;\n  right ^= tmp;\n  left ^= (tmp << 4);\n\n  tmp = ((left >>> 16) ^ right) & 0x0000ffff;\n  right ^= tmp;\n  left ^= (tmp << 16);\n\n  tmp = ((right >>> 2) ^ left) & 0x33333333;\n  left ^= tmp;\n  right ^= (tmp << 2);\n\n  tmp = ((right >>> 8) ^ left) & 0x00ff00ff;\n  left ^= tmp;\n  right ^= (tmp << 8);\n\n  tmp = ((left >>> 1) ^ right) & 0x55555555;\n  right ^= tmp;\n  left ^= (tmp << 1);\n\n  // rotate left 1 bit\n  left = ((left << 1) | (left >>> 31));\n  right = ((right << 1) | (right >>> 31));\n\n  for(var j = 0; j < iterations; j += 3) {\n    var endloop = looping[j + 1];\n    var loopinc = looping[j + 2];\n\n    // now go through and perform the encryption or decryption\n    for(var i = looping[j]; i != endloop; i += loopinc) {\n      var right1 = right ^ keys[i];\n      var right2 = ((right >>> 4) | (right << 28)) ^ keys[i + 1];\n\n      // passing these bytes through the S selection functions\n      tmp = left;\n      left = right;\n      right = tmp ^ (\n        spfunction2[(right1 >>> 24) & 0x3f] |\n        spfunction4[(right1 >>> 16) & 0x3f] |\n        spfunction6[(right1 >>>  8) & 0x3f] |\n        spfunction8[right1 & 0x3f] |\n        spfunction1[(right2 >>> 24) & 0x3f] |\n        spfunction3[(right2 >>> 16) & 0x3f] |\n        spfunction5[(right2 >>>  8) & 0x3f] |\n        spfunction7[right2 & 0x3f]);\n    }\n    // unreverse left and right\n    tmp = left;\n    left = right;\n    right = tmp;\n  }\n\n  // rotate right 1 bit\n  left = ((left >>> 1) | (left << 31));\n  right = ((right >>> 1) | (right << 31));\n\n  // now perform IP-1, which is IP in the opposite direction\n  tmp = ((left >>> 1) ^ right) & 0x55555555;\n  right ^= tmp;\n  left ^= (tmp << 1);\n\n  tmp = ((right >>> 8) ^ left) & 0x00ff00ff;\n  left ^= tmp;\n  right ^= (tmp << 8);\n\n  tmp = ((right >>> 2) ^ left) & 0x33333333;\n  left ^= tmp;\n  right ^= (tmp << 2);\n\n  tmp = ((left >>> 16) ^ right) & 0x0000ffff;\n  right ^= tmp;\n  left ^= (tmp << 16);\n\n  tmp = ((left >>> 4) ^ right) & 0x0f0f0f0f;\n  right ^= tmp;\n  left ^= (tmp << 4);\n\n  output[0] = left;\n  output[1] = right;\n}\n\n/**\n * Deprecated. Instead, use:\n *\n * forge.cipher.createCipher('DES-<mode>', key);\n * forge.cipher.createDecipher('DES-<mode>', key);\n *\n * Creates a deprecated DES cipher object. This object's mode will default to\n * CBC (cipher-block-chaining).\n *\n * The key may be given as a binary-encoded string of bytes or a byte buffer.\n *\n * @param options the options to use.\n *          key the symmetric key to use (64 or 192 bits).\n *          output the buffer to write to.\n *          decrypt true for decryption, false for encryption.\n *          mode the cipher mode to use (default: 'CBC').\n *\n * @return the cipher.\n */\nfunction _createCipher(options) {\n  options = options || {};\n  var mode = (options.mode || 'CBC').toUpperCase();\n  var algorithm = 'DES-' + mode;\n\n  var cipher;\n  if(options.decrypt) {\n    cipher = forge.cipher.createDecipher(algorithm, options.key);\n  } else {\n    cipher = forge.cipher.createCipher(algorithm, options.key);\n  }\n\n  // backwards compatible start API\n  var start = cipher.start;\n  cipher.start = function(iv, options) {\n    // backwards compatibility: support second arg as output buffer\n    var output = null;\n    if(options instanceof forge.util.ByteBuffer) {\n      output = options;\n      options = {};\n    }\n    options = options || {};\n    options.output = output;\n    options.iv = iv;\n    start.call(cipher, options);\n  };\n\n  return cipher;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDEuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbm9kZS1mb3JnZS9saWIvZGVzLmpzPzJjZjciXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBERVMgKERhdGEgRW5jcnlwdGlvbiBTdGFuZGFyZCkgaW1wbGVtZW50YXRpb24uXG4gKlxuICogVGhpcyBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyBERVMgYXMgd2VsbCBhcyAzREVTLUVERSBpbiBFQ0IgYW5kIENCQyBtb2RlLlxuICogSXQgaXMgYmFzZWQgb24gdGhlIEJTRC1saWNlbnNlZCBpbXBsZW1lbnRhdGlvbiBieSBQYXVsIFRlcm86XG4gKlxuICogUGF1bCBUZXJvLCBKdWx5IDIwMDFcbiAqIGh0dHA6Ly93d3cudGVyby5jby51ay9kZXMvXG4gKlxuICogT3B0aW1pc2VkIGZvciBwZXJmb3JtYW5jZSB3aXRoIGxhcmdlIGJsb2NrcyBieVxuICogTWljaGFlbCBIYXl3b3J0aCwgTm92ZW1iZXIgMjAwMVxuICogaHR0cDovL3d3dy5uZXRkZWFsaW5nLmNvbVxuICpcbiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiIEFORFxuICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEVcbiAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMXG4gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EU1xuICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pXG4gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVFxuICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWVxuICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRlxuICogU1VDSCBEQU1BR0UuXG4gKlxuICogQGF1dGhvciBTdGVmYW4gU2llZ2xcbiAqIEBhdXRob3IgRGF2ZSBMb25nbGV5XG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDEyIFN0ZWZhbiBTaWVnbCA8c3Rlc2llQGJyb2tlbnBpcGUuZGU+XG4gKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNCBEaWdpdGFsIEJhemFhciwgSW5jLlxuICovXG52YXIgZm9yZ2UgPSByZXF1aXJlKCcuL2ZvcmdlJyk7XG5yZXF1aXJlKCcuL2NpcGhlcicpO1xucmVxdWlyZSgnLi9jaXBoZXJNb2RlcycpO1xucmVxdWlyZSgnLi91dGlsJyk7XG5cbi8qIERFUyBBUEkgKi9cbm1vZHVsZS5leHBvcnRzID0gZm9yZ2UuZGVzID0gZm9yZ2UuZGVzIHx8IHt9O1xuXG4vKipcbiAqIERlcHJlY2F0ZWQuIEluc3RlYWQsIHVzZTpcbiAqXG4gKiB2YXIgY2lwaGVyID0gZm9yZ2UuY2lwaGVyLmNyZWF0ZUNpcGhlcignREVTLTxtb2RlPicsIGtleSk7XG4gKiBjaXBoZXIuc3RhcnQoe2l2OiBpdn0pO1xuICpcbiAqIENyZWF0ZXMgYW4gREVTIGNpcGhlciBvYmplY3QgdG8gZW5jcnlwdCBkYXRhIHVzaW5nIHRoZSBnaXZlbiBzeW1tZXRyaWMga2V5LlxuICogVGhlIG91dHB1dCB3aWxsIGJlIHN0b3JlZCBpbiB0aGUgJ291dHB1dCcgbWVtYmVyIG9mIHRoZSByZXR1cm5lZCBjaXBoZXIuXG4gKlxuICogVGhlIGtleSBhbmQgaXYgbWF5IGJlIGdpdmVuIGFzIGJpbmFyeS1lbmNvZGVkIHN0cmluZ3Mgb2YgYnl0ZXMgb3JcbiAqIGJ5dGUgYnVmZmVycy5cbiAqXG4gKiBAcGFyYW0ga2V5IHRoZSBzeW1tZXRyaWMga2V5IHRvIHVzZSAoNjQgb3IgMTkyIGJpdHMpLlxuICogQHBhcmFtIGl2IHRoZSBpbml0aWFsaXphdGlvbiB2ZWN0b3IgdG8gdXNlLlxuICogQHBhcmFtIG91dHB1dCB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvLCBudWxsIHRvIGNyZWF0ZSBvbmUuXG4gKiBAcGFyYW0gbW9kZSB0aGUgY2lwaGVyIG1vZGUgdG8gdXNlIChkZWZhdWx0OiAnQ0JDJyBpZiBJViBpc1xuICogICAgICAgICAgZ2l2ZW4sICdFQ0InIGlmIG51bGwpLlxuICpcbiAqIEByZXR1cm4gdGhlIGNpcGhlci5cbiAqL1xuZm9yZ2UuZGVzLnN0YXJ0RW5jcnlwdGluZyA9IGZ1bmN0aW9uKGtleSwgaXYsIG91dHB1dCwgbW9kZSkge1xuICB2YXIgY2lwaGVyID0gX2NyZWF0ZUNpcGhlcih7XG4gICAga2V5OiBrZXksXG4gICAgb3V0cHV0OiBvdXRwdXQsXG4gICAgZGVjcnlwdDogZmFsc2UsXG4gICAgbW9kZTogbW9kZSB8fCAoaXYgPT09IG51bGwgPyAnRUNCJyA6ICdDQkMnKVxuICB9KTtcbiAgY2lwaGVyLnN0YXJ0KGl2KTtcbiAgcmV0dXJuIGNpcGhlcjtcbn07XG5cbi8qKlxuICogRGVwcmVjYXRlZC4gSW5zdGVhZCwgdXNlOlxuICpcbiAqIHZhciBjaXBoZXIgPSBmb3JnZS5jaXBoZXIuY3JlYXRlQ2lwaGVyKCdERVMtPG1vZGU+Jywga2V5KTtcbiAqXG4gKiBDcmVhdGVzIGFuIERFUyBjaXBoZXIgb2JqZWN0IHRvIGVuY3J5cHQgZGF0YSB1c2luZyB0aGUgZ2l2ZW4gc3ltbWV0cmljIGtleS5cbiAqXG4gKiBUaGUga2V5IG1heSBiZSBnaXZlbiBhcyBhIGJpbmFyeS1lbmNvZGVkIHN0cmluZyBvZiBieXRlcyBvciBhIGJ5dGUgYnVmZmVyLlxuICpcbiAqIEBwYXJhbSBrZXkgdGhlIHN5bW1ldHJpYyBrZXkgdG8gdXNlICg2NCBvciAxOTIgYml0cykuXG4gKiBAcGFyYW0gbW9kZSB0aGUgY2lwaGVyIG1vZGUgdG8gdXNlIChkZWZhdWx0OiAnQ0JDJykuXG4gKlxuICogQHJldHVybiB0aGUgY2lwaGVyLlxuICovXG5mb3JnZS5kZXMuY3JlYXRlRW5jcnlwdGlvbkNpcGhlciA9IGZ1bmN0aW9uKGtleSwgbW9kZSkge1xuICByZXR1cm4gX2NyZWF0ZUNpcGhlcih7XG4gICAga2V5OiBrZXksXG4gICAgb3V0cHV0OiBudWxsLFxuICAgIGRlY3J5cHQ6IGZhbHNlLFxuICAgIG1vZGU6IG1vZGVcbiAgfSk7XG59O1xuXG4vKipcbiAqIERlcHJlY2F0ZWQuIEluc3RlYWQsIHVzZTpcbiAqXG4gKiB2YXIgZGVjaXBoZXIgPSBmb3JnZS5jaXBoZXIuY3JlYXRlRGVjaXBoZXIoJ0RFUy08bW9kZT4nLCBrZXkpO1xuICogZGVjaXBoZXIuc3RhcnQoe2l2OiBpdn0pO1xuICpcbiAqIENyZWF0ZXMgYW4gREVTIGNpcGhlciBvYmplY3QgdG8gZGVjcnlwdCBkYXRhIHVzaW5nIHRoZSBnaXZlbiBzeW1tZXRyaWMga2V5LlxuICogVGhlIG91dHB1dCB3aWxsIGJlIHN0b3JlZCBpbiB0aGUgJ291dHB1dCcgbWVtYmVyIG9mIHRoZSByZXR1cm5lZCBjaXBoZXIuXG4gKlxuICogVGhlIGtleSBhbmQgaXYgbWF5IGJlIGdpdmVuIGFzIGJpbmFyeS1lbmNvZGVkIHN0cmluZ3Mgb2YgYnl0ZXMgb3JcbiAqIGJ5dGUgYnVmZmVycy5cbiAqXG4gKiBAcGFyYW0ga2V5IHRoZSBzeW1tZXRyaWMga2V5IHRvIHVzZSAoNjQgb3IgMTkyIGJpdHMpLlxuICogQHBhcmFtIGl2IHRoZSBpbml0aWFsaXphdGlvbiB2ZWN0b3IgdG8gdXNlLlxuICogQHBhcmFtIG91dHB1dCB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvLCBudWxsIHRvIGNyZWF0ZSBvbmUuXG4gKiBAcGFyYW0gbW9kZSB0aGUgY2lwaGVyIG1vZGUgdG8gdXNlIChkZWZhdWx0OiAnQ0JDJyBpZiBJViBpc1xuICogICAgICAgICAgZ2l2ZW4sICdFQ0InIGlmIG51bGwpLlxuICpcbiAqIEByZXR1cm4gdGhlIGNpcGhlci5cbiAqL1xuZm9yZ2UuZGVzLnN0YXJ0RGVjcnlwdGluZyA9IGZ1bmN0aW9uKGtleSwgaXYsIG91dHB1dCwgbW9kZSkge1xuICB2YXIgY2lwaGVyID0gX2NyZWF0ZUNpcGhlcih7XG4gICAga2V5OiBrZXksXG4gICAgb3V0cHV0OiBvdXRwdXQsXG4gICAgZGVjcnlwdDogdHJ1ZSxcbiAgICBtb2RlOiBtb2RlIHx8IChpdiA9PT0gbnVsbCA/ICdFQ0InIDogJ0NCQycpXG4gIH0pO1xuICBjaXBoZXIuc3RhcnQoaXYpO1xuICByZXR1cm4gY2lwaGVyO1xufTtcblxuLyoqXG4gKiBEZXByZWNhdGVkLiBJbnN0ZWFkLCB1c2U6XG4gKlxuICogdmFyIGRlY2lwaGVyID0gZm9yZ2UuY2lwaGVyLmNyZWF0ZURlY2lwaGVyKCdERVMtPG1vZGU+Jywga2V5KTtcbiAqXG4gKiBDcmVhdGVzIGFuIERFUyBjaXBoZXIgb2JqZWN0IHRvIGRlY3J5cHQgZGF0YSB1c2luZyB0aGUgZ2l2ZW4gc3ltbWV0cmljIGtleS5cbiAqXG4gKiBUaGUga2V5IG1heSBiZSBnaXZlbiBhcyBhIGJpbmFyeS1lbmNvZGVkIHN0cmluZyBvZiBieXRlcyBvciBhIGJ5dGUgYnVmZmVyLlxuICpcbiAqIEBwYXJhbSBrZXkgdGhlIHN5bW1ldHJpYyBrZXkgdG8gdXNlICg2NCBvciAxOTIgYml0cykuXG4gKiBAcGFyYW0gbW9kZSB0aGUgY2lwaGVyIG1vZGUgdG8gdXNlIChkZWZhdWx0OiAnQ0JDJykuXG4gKlxuICogQHJldHVybiB0aGUgY2lwaGVyLlxuICovXG5mb3JnZS5kZXMuY3JlYXRlRGVjcnlwdGlvbkNpcGhlciA9IGZ1bmN0aW9uKGtleSwgbW9kZSkge1xuICByZXR1cm4gX2NyZWF0ZUNpcGhlcih7XG4gICAga2V5OiBrZXksXG4gICAgb3V0cHV0OiBudWxsLFxuICAgIGRlY3J5cHQ6IHRydWUsXG4gICAgbW9kZTogbW9kZVxuICB9KTtcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBERVMgY2lwaGVyIGFsZ29yaXRobSBvYmplY3QuXG4gKlxuICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGFsZ29yaXRobS5cbiAqIEBwYXJhbSBtb2RlIHRoZSBtb2RlIGZhY3RvcnkgZnVuY3Rpb24uXG4gKlxuICogQHJldHVybiB0aGUgREVTIGFsZ29yaXRobSBvYmplY3QuXG4gKi9cbmZvcmdlLmRlcy5BbGdvcml0aG0gPSBmdW5jdGlvbihuYW1lLCBtb2RlKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgc2VsZi5uYW1lID0gbmFtZTtcbiAgc2VsZi5tb2RlID0gbmV3IG1vZGUoe1xuICAgIGJsb2NrU2l6ZTogOCxcbiAgICBjaXBoZXI6IHtcbiAgICAgIGVuY3J5cHQ6IGZ1bmN0aW9uKGluQmxvY2ssIG91dEJsb2NrKSB7XG4gICAgICAgIHJldHVybiBfdXBkYXRlQmxvY2soc2VsZi5fa2V5cywgaW5CbG9jaywgb3V0QmxvY2ssIGZhbHNlKTtcbiAgICAgIH0sXG4gICAgICBkZWNyeXB0OiBmdW5jdGlvbihpbkJsb2NrLCBvdXRCbG9jaykge1xuICAgICAgICByZXR1cm4gX3VwZGF0ZUJsb2NrKHNlbGYuX2tleXMsIGluQmxvY2ssIG91dEJsb2NrLCB0cnVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuICBzZWxmLl9pbml0ID0gZmFsc2U7XG59O1xuXG4vKipcbiAqIEluaXRpYWxpemVzIHRoaXMgREVTIGFsZ29yaXRobSBieSBleHBhbmRpbmcgaXRzIGtleS5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyB0aGUgb3B0aW9ucyB0byB1c2UuXG4gKiAgICAgICAgICBrZXkgdGhlIGtleSB0byB1c2Ugd2l0aCB0aGlzIGFsZ29yaXRobS5cbiAqICAgICAgICAgIGRlY3J5cHQgdHJ1ZSBpZiB0aGUgYWxnb3JpdGhtIHNob3VsZCBiZSBpbml0aWFsaXplZCBmb3IgZGVjcnlwdGlvbixcbiAqICAgICAgICAgICAgZmFsc2UgZm9yIGVuY3J5cHRpb24uXG4gKi9cbmZvcmdlLmRlcy5BbGdvcml0aG0ucHJvdG90eXBlLmluaXRpYWxpemUgPSBmdW5jdGlvbihvcHRpb25zKSB7XG4gIGlmKHRoaXMuX2luaXQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIga2V5ID0gZm9yZ2UudXRpbC5jcmVhdGVCdWZmZXIob3B0aW9ucy5rZXkpO1xuICBpZih0aGlzLm5hbWUuaW5kZXhPZignM0RFUycpID09PSAwKSB7XG4gICAgaWYoa2V5Lmxlbmd0aCgpICE9PSAyNCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIFRyaXBsZS1ERVMga2V5IHNpemU6ICcgKyBrZXkubGVuZ3RoKCkgKiA4KTtcbiAgICB9XG4gIH1cblxuICAvLyBkbyBrZXkgZXhwYW5zaW9uIHRvIDE2IG9yIDQ4IHN1YmtleXMgKHNpbmdsZSBvciB0cmlwbGUgREVTKVxuICB0aGlzLl9rZXlzID0gX2NyZWF0ZUtleXMoa2V5KTtcbiAgdGhpcy5faW5pdCA9IHRydWU7XG59O1xuXG4vKiogUmVnaXN0ZXIgREVTIGFsZ29yaXRobXMgKiovXG5cbnJlZ2lzdGVyQWxnb3JpdGhtKCdERVMtRUNCJywgZm9yZ2UuY2lwaGVyLm1vZGVzLmVjYik7XG5yZWdpc3RlckFsZ29yaXRobSgnREVTLUNCQycsIGZvcmdlLmNpcGhlci5tb2Rlcy5jYmMpO1xucmVnaXN0ZXJBbGdvcml0aG0oJ0RFUy1DRkInLCBmb3JnZS5jaXBoZXIubW9kZXMuY2ZiKTtcbnJlZ2lzdGVyQWxnb3JpdGhtKCdERVMtT0ZCJywgZm9yZ2UuY2lwaGVyLm1vZGVzLm9mYik7XG5yZWdpc3RlckFsZ29yaXRobSgnREVTLUNUUicsIGZvcmdlLmNpcGhlci5tb2Rlcy5jdHIpO1xuXG5yZWdpc3RlckFsZ29yaXRobSgnM0RFUy1FQ0InLCBmb3JnZS5jaXBoZXIubW9kZXMuZWNiKTtcbnJlZ2lzdGVyQWxnb3JpdGhtKCczREVTLUNCQycsIGZvcmdlLmNpcGhlci5tb2Rlcy5jYmMpO1xucmVnaXN0ZXJBbGdvcml0aG0oJzNERVMtQ0ZCJywgZm9yZ2UuY2lwaGVyLm1vZGVzLmNmYik7XG5yZWdpc3RlckFsZ29yaXRobSgnM0RFUy1PRkInLCBmb3JnZS5jaXBoZXIubW9kZXMub2ZiKTtcbnJlZ2lzdGVyQWxnb3JpdGhtKCczREVTLUNUUicsIGZvcmdlLmNpcGhlci5tb2Rlcy5jdHIpO1xuXG5mdW5jdGlvbiByZWdpc3RlckFsZ29yaXRobShuYW1lLCBtb2RlKSB7XG4gIHZhciBmYWN0b3J5ID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIG5ldyBmb3JnZS5kZXMuQWxnb3JpdGhtKG5hbWUsIG1vZGUpO1xuICB9O1xuICBmb3JnZS5jaXBoZXIucmVnaXN0ZXJBbGdvcml0aG0obmFtZSwgZmFjdG9yeSk7XG59XG5cbi8qKiBERVMgaW1wbGVtZW50YXRpb24gKiovXG5cbnZhciBzcGZ1bmN0aW9uMSA9IFsweDEwMTA0MDAsMCwweDEwMDAwLDB4MTAxMDQwNCwweDEwMTAwMDQsMHgxMDQwNCwweDQsMHgxMDAwMCwweDQwMCwweDEwMTA0MDAsMHgxMDEwNDA0LDB4NDAwLDB4MTAwMDQwNCwweDEwMTAwMDQsMHgxMDAwMDAwLDB4NCwweDQwNCwweDEwMDA0MDAsMHgxMDAwNDAwLDB4MTA0MDAsMHgxMDQwMCwweDEwMTAwMDAsMHgxMDEwMDAwLDB4MTAwMDQwNCwweDEwMDA0LDB4MTAwMDAwNCwweDEwMDAwMDQsMHgxMDAwNCwwLDB4NDA0LDB4MTA0MDQsMHgxMDAwMDAwLDB4MTAwMDAsMHgxMDEwNDA0LDB4NCwweDEwMTAwMDAsMHgxMDEwNDAwLDB4MTAwMDAwMCwweDEwMDAwMDAsMHg0MDAsMHgxMDEwMDA0LDB4MTAwMDAsMHgxMDQwMCwweDEwMDAwMDQsMHg0MDAsMHg0LDB4MTAwMDQwNCwweDEwNDA0LDB4MTAxMDQwNCwweDEwMDA0LDB4MTAxMDAwMCwweDEwMDA0MDQsMHgxMDAwMDA0LDB4NDA0LDB4MTA0MDQsMHgxMDEwNDAwLDB4NDA0LDB4MTAwMDQwMCwweDEwMDA0MDAsMCwweDEwMDA0LDB4MTA0MDAsMCwweDEwMTAwMDRdO1xudmFyIHNwZnVuY3Rpb24yID0gWy0weDdmZWY3ZmUwLC0weDdmZmY4MDAwLDB4ODAwMCwweDEwODAyMCwweDEwMDAwMCwweDIwLC0weDdmZWZmZmUwLC0weDdmZmY3ZmUwLC0weDdmZmZmZmUwLC0weDdmZWY3ZmUwLC0weDdmZWY4MDAwLC0weDgwMDAwMDAwLC0weDdmZmY4MDAwLDB4MTAwMDAwLDB4MjAsLTB4N2ZlZmZmZTAsMHgxMDgwMDAsMHgxMDAwMjAsLTB4N2ZmZjdmZTAsMCwtMHg4MDAwMDAwMCwweDgwMDAsMHgxMDgwMjAsLTB4N2ZmMDAwMDAsMHgxMDAwMjAsLTB4N2ZmZmZmZTAsMCwweDEwODAwMCwweDgwMjAsLTB4N2ZlZjgwMDAsLTB4N2ZmMDAwMDAsMHg4MDIwLDAsMHgxMDgwMjAsLTB4N2ZlZmZmZTAsMHgxMDAwMDAsLTB4N2ZmZjdmZTAsLTB4N2ZmMDAwMDAsLTB4N2ZlZjgwMDAsMHg4MDAwLC0weDdmZjAwMDAwLC0weDdmZmY4MDAwLDB4MjAsLTB4N2ZlZjdmZTAsMHgxMDgwMjAsMHgyMCwweDgwMDAsLTB4ODAwMDAwMDAsMHg4MDIwLC0weDdmZWY4MDAwLDB4MTAwMDAwLC0weDdmZmZmZmUwLDB4MTAwMDIwLC0weDdmZmY3ZmUwLC0weDdmZmZmZmUwLDB4MTAwMDIwLDB4MTA4MDAwLDAsLTB4N2ZmZjgwMDAsMHg4MDIwLC0weDgwMDAwMDAwLC0weDdmZWZmZmUwLC0weDdmZWY3ZmUwLDB4MTA4MDAwXTtcbnZhciBzcGZ1bmN0aW9uMyA9IFsweDIwOCwweDgwMjAyMDAsMCwweDgwMjAwMDgsMHg4MDAwMjAwLDAsMHgyMDIwOCwweDgwMDAyMDAsMHgyMDAwOCwweDgwMDAwMDgsMHg4MDAwMDA4LDB4MjAwMDAsMHg4MDIwMjA4LDB4MjAwMDgsMHg4MDIwMDAwLDB4MjA4LDB4ODAwMDAwMCwweDgsMHg4MDIwMjAwLDB4MjAwLDB4MjAyMDAsMHg4MDIwMDAwLDB4ODAyMDAwOCwweDIwMjA4LDB4ODAwMDIwOCwweDIwMjAwLDB4MjAwMDAsMHg4MDAwMjA4LDB4OCwweDgwMjAyMDgsMHgyMDAsMHg4MDAwMDAwLDB4ODAyMDIwMCwweDgwMDAwMDAsMHgyMDAwOCwweDIwOCwweDIwMDAwLDB4ODAyMDIwMCwweDgwMDAyMDAsMCwweDIwMCwweDIwMDA4LDB4ODAyMDIwOCwweDgwMDAyMDAsMHg4MDAwMDA4LDB4MjAwLDAsMHg4MDIwMDA4LDB4ODAwMDIwOCwweDIwMDAwLDB4ODAwMDAwMCwweDgwMjAyMDgsMHg4LDB4MjAyMDgsMHgyMDIwMCwweDgwMDAwMDgsMHg4MDIwMDAwLDB4ODAwMDIwOCwweDIwOCwweDgwMjAwMDAsMHgyMDIwOCwweDgsMHg4MDIwMDA4LDB4MjAyMDBdO1xudmFyIHNwZnVuY3Rpb240ID0gWzB4ODAyMDAxLDB4MjA4MSwweDIwODEsMHg4MCwweDgwMjA4MCwweDgwMDA4MSwweDgwMDAwMSwweDIwMDEsMCwweDgwMjAwMCwweDgwMjAwMCwweDgwMjA4MSwweDgxLDAsMHg4MDAwODAsMHg4MDAwMDEsMHgxLDB4MjAwMCwweDgwMDAwMCwweDgwMjAwMSwweDgwLDB4ODAwMDAwLDB4MjAwMSwweDIwODAsMHg4MDAwODEsMHgxLDB4MjA4MCwweDgwMDA4MCwweDIwMDAsMHg4MDIwODAsMHg4MDIwODEsMHg4MSwweDgwMDA4MCwweDgwMDAwMSwweDgwMjAwMCwweDgwMjA4MSwweDgxLDAsMCwweDgwMjAwMCwweDIwODAsMHg4MDAwODAsMHg4MDAwODEsMHgxLDB4ODAyMDAxLDB4MjA4MSwweDIwODEsMHg4MCwweDgwMjA4MSwweDgxLDB4MSwweDIwMDAsMHg4MDAwMDEsMHgyMDAxLDB4ODAyMDgwLDB4ODAwMDgxLDB4MjAwMSwweDIwODAsMHg4MDAwMDAsMHg4MDIwMDEsMHg4MCwweDgwMDAwMCwweDIwMDAsMHg4MDIwODBdO1xudmFyIHNwZnVuY3Rpb241ID0gWzB4MTAwLDB4MjA4MDEwMCwweDIwODAwMDAsMHg0MjAwMDEwMCwweDgwMDAwLDB4MTAwLDB4NDAwMDAwMDAsMHgyMDgwMDAwLDB4NDAwODAxMDAsMHg4MDAwMCwweDIwMDAxMDAsMHg0MDA4MDEwMCwweDQyMDAwMTAwLDB4NDIwODAwMDAsMHg4MDEwMCwweDQwMDAwMDAwLDB4MjAwMDAwMCwweDQwMDgwMDAwLDB4NDAwODAwMDAsMCwweDQwMDAwMTAwLDB4NDIwODAxMDAsMHg0MjA4MDEwMCwweDIwMDAxMDAsMHg0MjA4MDAwMCwweDQwMDAwMTAwLDAsMHg0MjAwMDAwMCwweDIwODAxMDAsMHgyMDAwMDAwLDB4NDIwMDAwMDAsMHg4MDEwMCwweDgwMDAwLDB4NDIwMDAxMDAsMHgxMDAsMHgyMDAwMDAwLDB4NDAwMDAwMDAsMHgyMDgwMDAwLDB4NDIwMDAxMDAsMHg0MDA4MDEwMCwweDIwMDAxMDAsMHg0MDAwMDAwMCwweDQyMDgwMDAwLDB4MjA4MDEwMCwweDQwMDgwMTAwLDB4MTAwLDB4MjAwMDAwMCwweDQyMDgwMDAwLDB4NDIwODAxMDAsMHg4MDEwMCwweDQyMDAwMDAwLDB4NDIwODAxMDAsMHgyMDgwMDAwLDAsMHg0MDA4MDAwMCwweDQyMDAwMDAwLDB4ODAxMDAsMHgyMDAwMTAwLDB4NDAwMDAxMDAsMHg4MDAwMCwwLDB4NDAwODAwMDAsMHgyMDgwMTAwLDB4NDAwMDAxMDBdO1xudmFyIHNwZnVuY3Rpb242ID0gWzB4MjAwMDAwMTAsMHgyMDQwMDAwMCwweDQwMDAsMHgyMDQwNDAxMCwweDIwNDAwMDAwLDB4MTAsMHgyMDQwNDAxMCwweDQwMDAwMCwweDIwMDA0MDAwLDB4NDA0MDEwLDB4NDAwMDAwLDB4MjAwMDAwMTAsMHg0MDAwMTAsMHgyMDAwNDAwMCwweDIwMDAwMDAwLDB4NDAxMCwwLDB4NDAwMDEwLDB4MjAwMDQwMTAsMHg0MDAwLDB4NDA0MDAwLDB4MjAwMDQwMTAsMHgxMCwweDIwNDAwMDEwLDB4MjA0MDAwMTAsMCwweDQwNDAxMCwweDIwNDA0MDAwLDB4NDAxMCwweDQwNDAwMCwweDIwNDA0MDAwLDB4MjAwMDAwMDAsMHgyMDAwNDAwMCwweDEwLDB4MjA0MDAwMTAsMHg0MDQwMDAsMHgyMDQwNDAxMCwweDQwMDAwMCwweDQwMTAsMHgyMDAwMDAxMCwweDQwMDAwMCwweDIwMDA0MDAwLDB4MjAwMDAwMDAsMHg0MDEwLDB4MjAwMDAwMTAsMHgyMDQwNDAxMCwweDQwNDAwMCwweDIwNDAwMDAwLDB4NDA0MDEwLDB4MjA0MDQwMDAsMCwweDIwNDAwMDEwLDB4MTAsMHg0MDAwLDB4MjA0MDAwMDAsMHg0MDQwMTAsMHg0MDAwLDB4NDAwMDEwLDB4MjAwMDQwMTAsMCwweDIwNDA0MDAwLDB4MjAwMDAwMDAsMHg0MDAwMTAsMHgyMDAwNDAxMF07XG52YXIgc3BmdW5jdGlvbjcgPSBbMHgyMDAwMDAsMHg0MjAwMDAyLDB4NDAwMDgwMiwwLDB4ODAwLDB4NDAwMDgwMiwweDIwMDgwMiwweDQyMDA4MDAsMHg0MjAwODAyLDB4MjAwMDAwLDAsMHg0MDAwMDAyLDB4MiwweDQwMDAwMDAsMHg0MjAwMDAyLDB4ODAyLDB4NDAwMDgwMCwweDIwMDgwMiwweDIwMDAwMiwweDQwMDA4MDAsMHg0MDAwMDAyLDB4NDIwMDAwMCwweDQyMDA4MDAsMHgyMDAwMDIsMHg0MjAwMDAwLDB4ODAwLDB4ODAyLDB4NDIwMDgwMiwweDIwMDgwMCwweDIsMHg0MDAwMDAwLDB4MjAwODAwLDB4NDAwMDAwMCwweDIwMDgwMCwweDIwMDAwMCwweDQwMDA4MDIsMHg0MDAwODAyLDB4NDIwMDAwMiwweDQyMDAwMDIsMHgyLDB4MjAwMDAyLDB4NDAwMDAwMCwweDQwMDA4MDAsMHgyMDAwMDAsMHg0MjAwODAwLDB4ODAyLDB4MjAwODAyLDB4NDIwMDgwMCwweDgwMiwweDQwMDAwMDIsMHg0MjAwODAyLDB4NDIwMDAwMCwweDIwMDgwMCwwLDB4MiwweDQyMDA4MDIsMCwweDIwMDgwMiwweDQyMDAwMDAsMHg4MDAsMHg0MDAwMDAyLDB4NDAwMDgwMCwweDgwMCwweDIwMDAwMl07XG52YXIgc3BmdW5jdGlvbjggPSBbMHgxMDAwMTA0MCwweDEwMDAsMHg0MDAwMCwweDEwMDQxMDQwLDB4MTAwMDAwMDAsMHgxMDAwMTA0MCwweDQwLDB4MTAwMDAwMDAsMHg0MDA0MCwweDEwMDQwMDAwLDB4MTAwNDEwNDAsMHg0MTAwMCwweDEwMDQxMDAwLDB4NDEwNDAsMHgxMDAwLDB4NDAsMHgxMDA0MDAwMCwweDEwMDAwMDQwLDB4MTAwMDEwMDAsMHgxMDQwLDB4NDEwMDAsMHg0MDA0MCwweDEwMDQwMDQwLDB4MTAwNDEwMDAsMHgxMDQwLDAsMCwweDEwMDQwMDQwLDB4MTAwMDAwNDAsMHgxMDAwMTAwMCwweDQxMDQwLDB4NDAwMDAsMHg0MTA0MCwweDQwMDAwLDB4MTAwNDEwMDAsMHgxMDAwLDB4NDAsMHgxMDA0MDA0MCwweDEwMDAsMHg0MTA0MCwweDEwMDAxMDAwLDB4NDAsMHgxMDAwMDA0MCwweDEwMDQwMDAwLDB4MTAwNDAwNDAsMHgxMDAwMDAwMCwweDQwMDAwLDB4MTAwMDEwNDAsMCwweDEwMDQxMDQwLDB4NDAwNDAsMHgxMDAwMDA0MCwweDEwMDQwMDAwLDB4MTAwMDEwMDAsMHgxMDAwMTA0MCwwLDB4MTAwNDEwNDAsMHg0MTAwMCwweDQxMDAwLDB4MTA0MCwweDEwNDAsMHg0MDA0MCwweDEwMDAwMDAwLDB4MTAwNDEwMDBdO1xuXG4vKipcbiAqIENyZWF0ZSBuZWNlc3Nhcnkgc3ViIGtleXMuXG4gKlxuICogQHBhcmFtIGtleSB0aGUgNjQtYml0IG9yIDE5Mi1iaXQga2V5LlxuICpcbiAqIEByZXR1cm4gdGhlIGV4cGFuZGVkIGtleXMuXG4gKi9cbmZ1bmN0aW9uIF9jcmVhdGVLZXlzKGtleSkge1xuICB2YXIgcGMyYnl0ZXMwICA9IFswLDB4NCwweDIwMDAwMDAwLDB4MjAwMDAwMDQsMHgxMDAwMCwweDEwMDA0LDB4MjAwMTAwMDAsMHgyMDAxMDAwNCwweDIwMCwweDIwNCwweDIwMDAwMjAwLDB4MjAwMDAyMDQsMHgxMDIwMCwweDEwMjA0LDB4MjAwMTAyMDAsMHgyMDAxMDIwNF0sXG4gICAgICBwYzJieXRlczEgID0gWzAsMHgxLDB4MTAwMDAwLDB4MTAwMDAxLDB4NDAwMDAwMCwweDQwMDAwMDEsMHg0MTAwMDAwLDB4NDEwMDAwMSwweDEwMCwweDEwMSwweDEwMDEwMCwweDEwMDEwMSwweDQwMDAxMDAsMHg0MDAwMTAxLDB4NDEwMDEwMCwweDQxMDAxMDFdLFxuICAgICAgcGMyYnl0ZXMyICA9IFswLDB4OCwweDgwMCwweDgwOCwweDEwMDAwMDAsMHgxMDAwMDA4LDB4MTAwMDgwMCwweDEwMDA4MDgsMCwweDgsMHg4MDAsMHg4MDgsMHgxMDAwMDAwLDB4MTAwMDAwOCwweDEwMDA4MDAsMHgxMDAwODA4XSxcbiAgICAgIHBjMmJ5dGVzMyAgPSBbMCwweDIwMDAwMCwweDgwMDAwMDAsMHg4MjAwMDAwLDB4MjAwMCwweDIwMjAwMCwweDgwMDIwMDAsMHg4MjAyMDAwLDB4MjAwMDAsMHgyMjAwMDAsMHg4MDIwMDAwLDB4ODIyMDAwMCwweDIyMDAwLDB4MjIyMDAwLDB4ODAyMjAwMCwweDgyMjIwMDBdLFxuICAgICAgcGMyYnl0ZXM0ICA9IFswLDB4NDAwMDAsMHgxMCwweDQwMDEwLDAsMHg0MDAwMCwweDEwLDB4NDAwMTAsMHgxMDAwLDB4NDEwMDAsMHgxMDEwLDB4NDEwMTAsMHgxMDAwLDB4NDEwMDAsMHgxMDEwLDB4NDEwMTBdLFxuICAgICAgcGMyYnl0ZXM1ICA9IFswLDB4NDAwLDB4MjAsMHg0MjAsMCwweDQwMCwweDIwLDB4NDIwLDB4MjAwMDAwMCwweDIwMDA0MDAsMHgyMDAwMDIwLDB4MjAwMDQyMCwweDIwMDAwMDAsMHgyMDAwNDAwLDB4MjAwMDAyMCwweDIwMDA0MjBdLFxuICAgICAgcGMyYnl0ZXM2ICA9IFswLDB4MTAwMDAwMDAsMHg4MDAwMCwweDEwMDgwMDAwLDB4MiwweDEwMDAwMDAyLDB4ODAwMDIsMHgxMDA4MDAwMiwwLDB4MTAwMDAwMDAsMHg4MDAwMCwweDEwMDgwMDAwLDB4MiwweDEwMDAwMDAyLDB4ODAwMDIsMHgxMDA4MDAwMl0sXG4gICAgICBwYzJieXRlczcgID0gWzAsMHgxMDAwMCwweDgwMCwweDEwODAwLDB4MjAwMDAwMDAsMHgyMDAxMDAwMCwweDIwMDAwODAwLDB4MjAwMTA4MDAsMHgyMDAwMCwweDMwMDAwLDB4MjA4MDAsMHgzMDgwMCwweDIwMDIwMDAwLDB4MjAwMzAwMDAsMHgyMDAyMDgwMCwweDIwMDMwODAwXSxcbiAgICAgIHBjMmJ5dGVzOCAgPSBbMCwweDQwMDAwLDAsMHg0MDAwMCwweDIsMHg0MDAwMiwweDIsMHg0MDAwMiwweDIwMDAwMDAsMHgyMDQwMDAwLDB4MjAwMDAwMCwweDIwNDAwMDAsMHgyMDAwMDAyLDB4MjA0MDAwMiwweDIwMDAwMDIsMHgyMDQwMDAyXSxcbiAgICAgIHBjMmJ5dGVzOSAgPSBbMCwweDEwMDAwMDAwLDB4OCwweDEwMDAwMDA4LDAsMHgxMDAwMDAwMCwweDgsMHgxMDAwMDAwOCwweDQwMCwweDEwMDAwNDAwLDB4NDA4LDB4MTAwMDA0MDgsMHg0MDAsMHgxMDAwMDQwMCwweDQwOCwweDEwMDAwNDA4XSxcbiAgICAgIHBjMmJ5dGVzMTAgPSBbMCwweDIwLDAsMHgyMCwweDEwMDAwMCwweDEwMDAyMCwweDEwMDAwMCwweDEwMDAyMCwweDIwMDAsMHgyMDIwLDB4MjAwMCwweDIwMjAsMHgxMDIwMDAsMHgxMDIwMjAsMHgxMDIwMDAsMHgxMDIwMjBdLFxuICAgICAgcGMyYnl0ZXMxMSA9IFswLDB4MTAwMDAwMCwweDIwMCwweDEwMDAyMDAsMHgyMDAwMDAsMHgxMjAwMDAwLDB4MjAwMjAwLDB4MTIwMDIwMCwweDQwMDAwMDAsMHg1MDAwMDAwLDB4NDAwMDIwMCwweDUwMDAyMDAsMHg0MjAwMDAwLDB4NTIwMDAwMCwweDQyMDAyMDAsMHg1MjAwMjAwXSxcbiAgICAgIHBjMmJ5dGVzMTIgPSBbMCwweDEwMDAsMHg4MDAwMDAwLDB4ODAwMTAwMCwweDgwMDAwLDB4ODEwMDAsMHg4MDgwMDAwLDB4ODA4MTAwMCwweDEwLDB4MTAxMCwweDgwMDAwMTAsMHg4MDAxMDEwLDB4ODAwMTAsMHg4MTAxMCwweDgwODAwMTAsMHg4MDgxMDEwXSxcbiAgICAgIHBjMmJ5dGVzMTMgPSBbMCwweDQsMHgxMDAsMHgxMDQsMCwweDQsMHgxMDAsMHgxMDQsMHgxLDB4NSwweDEwMSwweDEwNSwweDEsMHg1LDB4MTAxLDB4MTA1XTtcblxuICAvLyBob3cgbWFueSBpdGVyYXRpb25zICgxIGZvciBkZXMsIDMgZm9yIHRyaXBsZSBkZXMpXG4gIC8vIGNoYW5nZWQgYnkgUGF1bCAxNi82LzIwMDcgdG8gdXNlIFRyaXBsZSBERVMgZm9yIDkrIGJ5dGUga2V5c1xuICB2YXIgaXRlcmF0aW9ucyA9IGtleS5sZW5ndGgoKSA+IDggPyAzIDogMTtcblxuICAvLyBzdG9yZXMgdGhlIHJldHVybiBrZXlzXG4gIHZhciBrZXlzID0gW107XG5cbiAgLy8gbm93IGRlZmluZSB0aGUgbGVmdCBzaGlmdHMgd2hpY2ggbmVlZCB0byBiZSBkb25lXG4gIHZhciBzaGlmdHMgPSBbMCwgMCwgMSwgMSwgMSwgMSwgMSwgMSwgMCwgMSwgMSwgMSwgMSwgMSwgMSwgMF07XG5cbiAgdmFyIG4gPSAwLCB0bXA7XG4gIGZvcih2YXIgaiA9IDA7IGogPCBpdGVyYXRpb25zOyBqKyspIHtcbiAgICB2YXIgbGVmdCA9IGtleS5nZXRJbnQzMigpO1xuICAgIHZhciByaWdodCA9IGtleS5nZXRJbnQzMigpO1xuXG4gICAgdG1wID0gKChsZWZ0ID4+PiA0KSBeIHJpZ2h0KSAmIDB4MGYwZjBmMGY7XG4gICAgcmlnaHQgXj0gdG1wO1xuICAgIGxlZnQgXj0gKHRtcCA8PCA0KTtcblxuICAgIHRtcCA9ICgocmlnaHQgPj4+IC0xNikgXiBsZWZ0KSAmIDB4MDAwMGZmZmY7XG4gICAgbGVmdCBePSB0bXA7XG4gICAgcmlnaHQgXj0gKHRtcCA8PCAtMTYpO1xuXG4gICAgdG1wID0gKChsZWZ0ID4+PiAyKSBeIHJpZ2h0KSAmIDB4MzMzMzMzMzM7XG4gICAgcmlnaHQgXj0gdG1wO1xuICAgIGxlZnQgXj0gKHRtcCA8PCAyKTtcblxuICAgIHRtcCA9ICgocmlnaHQgPj4+IC0xNikgXiBsZWZ0KSAmIDB4MDAwMGZmZmY7XG4gICAgbGVmdCBePSB0bXA7XG4gICAgcmlnaHQgXj0gKHRtcCA8PCAtMTYpO1xuXG4gICAgdG1wID0gKChsZWZ0ID4+PiAxKSBeIHJpZ2h0KSAmIDB4NTU1NTU1NTU7XG4gICAgcmlnaHQgXj0gdG1wO1xuICAgIGxlZnQgXj0gKHRtcCA8PCAxKTtcblxuICAgIHRtcCA9ICgocmlnaHQgPj4+IDgpIF4gbGVmdCkgJiAweDAwZmYwMGZmO1xuICAgIGxlZnQgXj0gdG1wO1xuICAgIHJpZ2h0IF49ICh0bXAgPDwgOCk7XG5cbiAgICB0bXAgPSAoKGxlZnQgPj4+IDEpIF4gcmlnaHQpICYgMHg1NTU1NTU1NTtcbiAgICByaWdodCBePSB0bXA7XG4gICAgbGVmdCBePSAodG1wIDw8IDEpO1xuXG4gICAgLy8gcmlnaHQgbmVlZHMgdG8gYmUgc2hpZnRlZCBhbmQgT1InZCB3aXRoIGxhc3QgZm91ciBiaXRzIG9mIGxlZnRcbiAgICB0bXAgPSAobGVmdCA8PCA4KSB8ICgocmlnaHQgPj4+IDIwKSAmIDB4MDAwMDAwZjApO1xuXG4gICAgLy8gbGVmdCBuZWVkcyB0byBiZSBwdXQgdXBzaWRlIGRvd25cbiAgICBsZWZ0ID0gKChyaWdodCA8PCAyNCkgfCAoKHJpZ2h0IDw8IDgpICYgMHhmZjAwMDApIHxcbiAgICAgICgocmlnaHQgPj4+IDgpICYgMHhmZjAwKSB8ICgocmlnaHQgPj4+IDI0KSAmIDB4ZjApKTtcbiAgICByaWdodCA9IHRtcDtcblxuICAgIC8vIG5vdyBnbyB0aHJvdWdoIGFuZCBwZXJmb3JtIHRoZXNlIHNoaWZ0cyBvbiB0aGUgbGVmdCBhbmQgcmlnaHQga2V5c1xuICAgIGZvcih2YXIgaSA9IDA7IGkgPCBzaGlmdHMubGVuZ3RoOyArK2kpIHtcbiAgICAgIC8vc2hpZnQgdGhlIGtleXMgZWl0aGVyIG9uZSBvciB0d28gYml0cyB0byB0aGUgbGVmdFxuICAgICAgaWYoc2hpZnRzW2ldKSB7XG4gICAgICAgIGxlZnQgPSAobGVmdCA8PCAyKSB8IChsZWZ0ID4+PiAyNik7XG4gICAgICAgIHJpZ2h0ID0gKHJpZ2h0IDw8IDIpIHwgKHJpZ2h0ID4+PiAyNik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsZWZ0ID0gKGxlZnQgPDwgMSkgfCAobGVmdCA+Pj4gMjcpO1xuICAgICAgICByaWdodCA9IChyaWdodCA8PCAxKSB8IChyaWdodCA+Pj4gMjcpO1xuICAgICAgfVxuICAgICAgbGVmdCAmPSAtMHhmO1xuICAgICAgcmlnaHQgJj0gLTB4ZjtcblxuICAgICAgLy8gbm93IGFwcGx5IFBDLTIsIGluIHN1Y2ggYSB3YXkgdGhhdCBFIGlzIGVhc2llciB3aGVuIGVuY3J5cHRpbmcgb3JcbiAgICAgIC8vIGRlY3J5cHRpbmcgdGhpcyBjb252ZXJzaW9uIHdpbGwgbG9vayBsaWtlIFBDLTIgZXhjZXB0IG9ubHkgdGhlIGxhc3QgNlxuICAgICAgLy8gYml0cyBvZiBlYWNoIGJ5dGUgYXJlIHVzZWQgcmF0aGVyIHRoYW4gNDggY29uc2VjdXRpdmUgYml0cyBhbmQgdGhlXG4gICAgICAvLyBvcmRlciBvZiBsaW5lcyB3aWxsIGJlIGFjY29yZGluZyB0byBob3cgdGhlIFMgc2VsZWN0aW9uIGZ1bmN0aW9ucyB3aWxsXG4gICAgICAvLyBiZSBhcHBsaWVkOiBTMiwgUzQsIFM2LCBTOCwgUzEsIFMzLCBTNSwgUzdcbiAgICAgIHZhciBsZWZ0dG1wID0gKFxuICAgICAgICBwYzJieXRlczBbbGVmdCA+Pj4gMjhdIHwgcGMyYnl0ZXMxWyhsZWZ0ID4+PiAyNCkgJiAweGZdIHxcbiAgICAgICAgcGMyYnl0ZXMyWyhsZWZ0ID4+PiAyMCkgJiAweGZdIHwgcGMyYnl0ZXMzWyhsZWZ0ID4+PiAxNikgJiAweGZdIHxcbiAgICAgICAgcGMyYnl0ZXM0WyhsZWZ0ID4+PiAxMikgJiAweGZdIHwgcGMyYnl0ZXM1WyhsZWZ0ID4+PiA4KSAmIDB4Zl0gfFxuICAgICAgICBwYzJieXRlczZbKGxlZnQgPj4+IDQpICYgMHhmXSk7XG4gICAgICB2YXIgcmlnaHR0bXAgPSAoXG4gICAgICAgIHBjMmJ5dGVzN1tyaWdodCA+Pj4gMjhdIHwgcGMyYnl0ZXM4WyhyaWdodCA+Pj4gMjQpICYgMHhmXSB8XG4gICAgICAgIHBjMmJ5dGVzOVsocmlnaHQgPj4+IDIwKSAmIDB4Zl0gfCBwYzJieXRlczEwWyhyaWdodCA+Pj4gMTYpICYgMHhmXSB8XG4gICAgICAgIHBjMmJ5dGVzMTFbKHJpZ2h0ID4+PiAxMikgJiAweGZdIHwgcGMyYnl0ZXMxMlsocmlnaHQgPj4+IDgpICYgMHhmXSB8XG4gICAgICAgIHBjMmJ5dGVzMTNbKHJpZ2h0ID4+PiA0KSAmIDB4Zl0pO1xuICAgICAgdG1wID0gKChyaWdodHRtcCA+Pj4gMTYpIF4gbGVmdHRtcCkgJiAweDAwMDBmZmZmO1xuICAgICAga2V5c1tuKytdID0gbGVmdHRtcCBeIHRtcDtcbiAgICAgIGtleXNbbisrXSA9IHJpZ2h0dG1wIF4gKHRtcCA8PCAxNik7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGtleXM7XG59XG5cbi8qKlxuICogVXBkYXRlcyBhIHNpbmdsZSBibG9jayAoMSBieXRlKSB1c2luZyBERVMuIFRoZSB1cGRhdGUgd2lsbCBlaXRoZXJcbiAqIGVuY3J5cHQgb3IgZGVjcnlwdCB0aGUgYmxvY2suXG4gKlxuICogQHBhcmFtIGtleXMgdGhlIGV4cGFuZGVkIGtleXMuXG4gKiBAcGFyYW0gaW5wdXQgdGhlIGlucHV0IGJsb2NrIChhbiBhcnJheSBvZiAzMi1iaXQgd29yZHMpLlxuICogQHBhcmFtIG91dHB1dCB0aGUgdXBkYXRlZCBvdXRwdXQgYmxvY2suXG4gKiBAcGFyYW0gZGVjcnlwdCB0cnVlIHRvIGRlY3J5cHQgdGhlIGJsb2NrLCBmYWxzZSB0byBlbmNyeXB0IGl0LlxuICovXG5mdW5jdGlvbiBfdXBkYXRlQmxvY2soa2V5cywgaW5wdXQsIG91dHB1dCwgZGVjcnlwdCkge1xuICAvLyBzZXQgdXAgbG9vcHMgZm9yIHNpbmdsZSBvciB0cmlwbGUgREVTXG4gIHZhciBpdGVyYXRpb25zID0ga2V5cy5sZW5ndGggPT09IDMyID8gMyA6IDk7XG4gIHZhciBsb29waW5nO1xuICBpZihpdGVyYXRpb25zID09PSAzKSB7XG4gICAgbG9vcGluZyA9IGRlY3J5cHQgPyBbMzAsIC0yLCAtMl0gOiBbMCwgMzIsIDJdO1xuICB9IGVsc2Uge1xuICAgIGxvb3BpbmcgPSAoZGVjcnlwdCA/XG4gICAgICBbOTQsIDYyLCAtMiwgMzIsIDY0LCAyLCAzMCwgLTIsIC0yXSA6XG4gICAgICBbMCwgMzIsIDIsIDYyLCAzMCwgLTIsIDY0LCA5NiwgMl0pO1xuICB9XG5cbiAgdmFyIHRtcDtcblxuICB2YXIgbGVmdCA9IGlucHV0WzBdO1xuICB2YXIgcmlnaHQgPSBpbnB1dFsxXTtcblxuICAvLyBmaXJzdCBlYWNoIDY0IGJpdCBjaHVuayBvZiB0aGUgbWVzc2FnZSBtdXN0IGJlIHBlcm11dGVkIGFjY29yZGluZyB0byBJUFxuICB0bXAgPSAoKGxlZnQgPj4+IDQpIF4gcmlnaHQpICYgMHgwZjBmMGYwZjtcbiAgcmlnaHQgXj0gdG1wO1xuICBsZWZ0IF49ICh0bXAgPDwgNCk7XG5cbiAgdG1wID0gKChsZWZ0ID4+PiAxNikgXiByaWdodCkgJiAweDAwMDBmZmZmO1xuICByaWdodCBePSB0bXA7XG4gIGxlZnQgXj0gKHRtcCA8PCAxNik7XG5cbiAgdG1wID0gKChyaWdodCA+Pj4gMikgXiBsZWZ0KSAmIDB4MzMzMzMzMzM7XG4gIGxlZnQgXj0gdG1wO1xuICByaWdodCBePSAodG1wIDw8IDIpO1xuXG4gIHRtcCA9ICgocmlnaHQgPj4+IDgpIF4gbGVmdCkgJiAweDAwZmYwMGZmO1xuICBsZWZ0IF49IHRtcDtcbiAgcmlnaHQgXj0gKHRtcCA8PCA4KTtcblxuICB0bXAgPSAoKGxlZnQgPj4+IDEpIF4gcmlnaHQpICYgMHg1NTU1NTU1NTtcbiAgcmlnaHQgXj0gdG1wO1xuICBsZWZ0IF49ICh0bXAgPDwgMSk7XG5cbiAgLy8gcm90YXRlIGxlZnQgMSBiaXRcbiAgbGVmdCA9ICgobGVmdCA8PCAxKSB8IChsZWZ0ID4+PiAzMSkpO1xuICByaWdodCA9ICgocmlnaHQgPDwgMSkgfCAocmlnaHQgPj4+IDMxKSk7XG5cbiAgZm9yKHZhciBqID0gMDsgaiA8IGl0ZXJhdGlvbnM7IGogKz0gMykge1xuICAgIHZhciBlbmRsb29wID0gbG9vcGluZ1tqICsgMV07XG4gICAgdmFyIGxvb3BpbmMgPSBsb29waW5nW2ogKyAyXTtcblxuICAgIC8vIG5vdyBnbyB0aHJvdWdoIGFuZCBwZXJmb3JtIHRoZSBlbmNyeXB0aW9uIG9yIGRlY3J5cHRpb25cbiAgICBmb3IodmFyIGkgPSBsb29waW5nW2pdOyBpICE9IGVuZGxvb3A7IGkgKz0gbG9vcGluYykge1xuICAgICAgdmFyIHJpZ2h0MSA9IHJpZ2h0IF4ga2V5c1tpXTtcbiAgICAgIHZhciByaWdodDIgPSAoKHJpZ2h0ID4+PiA0KSB8IChyaWdodCA8PCAyOCkpIF4ga2V5c1tpICsgMV07XG5cbiAgICAgIC8vIHBhc3NpbmcgdGhlc2UgYnl0ZXMgdGhyb3VnaCB0aGUgUyBzZWxlY3Rpb24gZnVuY3Rpb25zXG4gICAgICB0bXAgPSBsZWZ0O1xuICAgICAgbGVmdCA9IHJpZ2h0O1xuICAgICAgcmlnaHQgPSB0bXAgXiAoXG4gICAgICAgIHNwZnVuY3Rpb24yWyhyaWdodDEgPj4+IDI0KSAmIDB4M2ZdIHxcbiAgICAgICAgc3BmdW5jdGlvbjRbKHJpZ2h0MSA+Pj4gMTYpICYgMHgzZl0gfFxuICAgICAgICBzcGZ1bmN0aW9uNlsocmlnaHQxID4+PiAgOCkgJiAweDNmXSB8XG4gICAgICAgIHNwZnVuY3Rpb244W3JpZ2h0MSAmIDB4M2ZdIHxcbiAgICAgICAgc3BmdW5jdGlvbjFbKHJpZ2h0MiA+Pj4gMjQpICYgMHgzZl0gfFxuICAgICAgICBzcGZ1bmN0aW9uM1socmlnaHQyID4+PiAxNikgJiAweDNmXSB8XG4gICAgICAgIHNwZnVuY3Rpb241WyhyaWdodDIgPj4+ICA4KSAmIDB4M2ZdIHxcbiAgICAgICAgc3BmdW5jdGlvbjdbcmlnaHQyICYgMHgzZl0pO1xuICAgIH1cbiAgICAvLyB1bnJldmVyc2UgbGVmdCBhbmQgcmlnaHRcbiAgICB0bXAgPSBsZWZ0O1xuICAgIGxlZnQgPSByaWdodDtcbiAgICByaWdodCA9IHRtcDtcbiAgfVxuXG4gIC8vIHJvdGF0ZSByaWdodCAxIGJpdFxuICBsZWZ0ID0gKChsZWZ0ID4+PiAxKSB8IChsZWZ0IDw8IDMxKSk7XG4gIHJpZ2h0ID0gKChyaWdodCA+Pj4gMSkgfCAocmlnaHQgPDwgMzEpKTtcblxuICAvLyBub3cgcGVyZm9ybSBJUC0xLCB3aGljaCBpcyBJUCBpbiB0aGUgb3Bwb3NpdGUgZGlyZWN0aW9uXG4gIHRtcCA9ICgobGVmdCA+Pj4gMSkgXiByaWdodCkgJiAweDU1NTU1NTU1O1xuICByaWdodCBePSB0bXA7XG4gIGxlZnQgXj0gKHRtcCA8PCAxKTtcblxuICB0bXAgPSAoKHJpZ2h0ID4+PiA4KSBeIGxlZnQpICYgMHgwMGZmMDBmZjtcbiAgbGVmdCBePSB0bXA7XG4gIHJpZ2h0IF49ICh0bXAgPDwgOCk7XG5cbiAgdG1wID0gKChyaWdodCA+Pj4gMikgXiBsZWZ0KSAmIDB4MzMzMzMzMzM7XG4gIGxlZnQgXj0gdG1wO1xuICByaWdodCBePSAodG1wIDw8IDIpO1xuXG4gIHRtcCA9ICgobGVmdCA+Pj4gMTYpIF4gcmlnaHQpICYgMHgwMDAwZmZmZjtcbiAgcmlnaHQgXj0gdG1wO1xuICBsZWZ0IF49ICh0bXAgPDwgMTYpO1xuXG4gIHRtcCA9ICgobGVmdCA+Pj4gNCkgXiByaWdodCkgJiAweDBmMGYwZjBmO1xuICByaWdodCBePSB0bXA7XG4gIGxlZnQgXj0gKHRtcCA8PCA0KTtcblxuICBvdXRwdXRbMF0gPSBsZWZ0O1xuICBvdXRwdXRbMV0gPSByaWdodDtcbn1cblxuLyoqXG4gKiBEZXByZWNhdGVkLiBJbnN0ZWFkLCB1c2U6XG4gKlxuICogZm9yZ2UuY2lwaGVyLmNyZWF0ZUNpcGhlcignREVTLTxtb2RlPicsIGtleSk7XG4gKiBmb3JnZS5jaXBoZXIuY3JlYXRlRGVjaXBoZXIoJ0RFUy08bW9kZT4nLCBrZXkpO1xuICpcbiAqIENyZWF0ZXMgYSBkZXByZWNhdGVkIERFUyBjaXBoZXIgb2JqZWN0LiBUaGlzIG9iamVjdCdzIG1vZGUgd2lsbCBkZWZhdWx0IHRvXG4gKiBDQkMgKGNpcGhlci1ibG9jay1jaGFpbmluZykuXG4gKlxuICogVGhlIGtleSBtYXkgYmUgZ2l2ZW4gYXMgYSBiaW5hcnktZW5jb2RlZCBzdHJpbmcgb2YgYnl0ZXMgb3IgYSBieXRlIGJ1ZmZlci5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyB0aGUgb3B0aW9ucyB0byB1c2UuXG4gKiAgICAgICAgICBrZXkgdGhlIHN5bW1ldHJpYyBrZXkgdG8gdXNlICg2NCBvciAxOTIgYml0cykuXG4gKiAgICAgICAgICBvdXRwdXQgdGhlIGJ1ZmZlciB0byB3cml0ZSB0by5cbiAqICAgICAgICAgIGRlY3J5cHQgdHJ1ZSBmb3IgZGVjcnlwdGlvbiwgZmFsc2UgZm9yIGVuY3J5cHRpb24uXG4gKiAgICAgICAgICBtb2RlIHRoZSBjaXBoZXIgbW9kZSB0byB1c2UgKGRlZmF1bHQ6ICdDQkMnKS5cbiAqXG4gKiBAcmV0dXJuIHRoZSBjaXBoZXIuXG4gKi9cbmZ1bmN0aW9uIF9jcmVhdGVDaXBoZXIob3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgdmFyIG1vZGUgPSAob3B0aW9ucy5tb2RlIHx8ICdDQkMnKS50b1VwcGVyQ2FzZSgpO1xuICB2YXIgYWxnb3JpdGhtID0gJ0RFUy0nICsgbW9kZTtcblxuICB2YXIgY2lwaGVyO1xuICBpZihvcHRpb25zLmRlY3J5cHQpIHtcbiAgICBjaXBoZXIgPSBmb3JnZS5jaXBoZXIuY3JlYXRlRGVjaXBoZXIoYWxnb3JpdGhtLCBvcHRpb25zLmtleSk7XG4gIH0gZWxzZSB7XG4gICAgY2lwaGVyID0gZm9yZ2UuY2lwaGVyLmNyZWF0ZUNpcGhlcihhbGdvcml0aG0sIG9wdGlvbnMua2V5KTtcbiAgfVxuXG4gIC8vIGJhY2t3YXJkcyBjb21wYXRpYmxlIHN0YXJ0IEFQSVxuICB2YXIgc3RhcnQgPSBjaXBoZXIuc3RhcnQ7XG4gIGNpcGhlci5zdGFydCA9IGZ1bmN0aW9uKGl2LCBvcHRpb25zKSB7XG4gICAgLy8gYmFja3dhcmRzIGNvbXBhdGliaWxpdHk6IHN1cHBvcnQgc2Vjb25kIGFyZyBhcyBvdXRwdXQgYnVmZmVyXG4gICAgdmFyIG91dHB1dCA9IG51bGw7XG4gICAgaWYob3B0aW9ucyBpbnN0YW5jZW9mIGZvcmdlLnV0aWwuQnl0ZUJ1ZmZlcikge1xuICAgICAgb3V0cHV0ID0gb3B0aW9ucztcbiAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICB9XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgb3B0aW9ucy5vdXRwdXQgPSBvdXRwdXQ7XG4gICAgb3B0aW9ucy5pdiA9IGl2O1xuICAgIHN0YXJ0LmNhbGwoY2lwaGVyLCBvcHRpb25zKTtcbiAgfTtcblxuICByZXR1cm4gY2lwaGVyO1xufVxuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///41\n")},function(module,exports,__webpack_require__){eval("/**\n * Javascript implementation of basic RSA algorithms.\n *\n * @author Dave Longley\n *\n * Copyright (c) 2010-2014 Digital Bazaar, Inc.\n *\n * The only algorithm currently supported for PKI is RSA.\n *\n * An RSA key is often stored in ASN.1 DER format. The SubjectPublicKeyInfo\n * ASN.1 structure is composed of an algorithm of type AlgorithmIdentifier\n * and a subjectPublicKey of type bit string.\n *\n * The AlgorithmIdentifier contains an Object Identifier (OID) and parameters\n * for the algorithm, if any. In the case of RSA, there aren't any.\n *\n * SubjectPublicKeyInfo ::= SEQUENCE {\n *   algorithm AlgorithmIdentifier,\n *   subjectPublicKey BIT STRING\n * }\n *\n * AlgorithmIdentifer ::= SEQUENCE {\n *   algorithm OBJECT IDENTIFIER,\n *   parameters ANY DEFINED BY algorithm OPTIONAL\n * }\n *\n * For an RSA public key, the subjectPublicKey is:\n *\n * RSAPublicKey ::= SEQUENCE {\n *   modulus            INTEGER,    -- n\n *   publicExponent     INTEGER     -- e\n * }\n *\n * PrivateKeyInfo ::= SEQUENCE {\n *   version                   Version,\n *   privateKeyAlgorithm       PrivateKeyAlgorithmIdentifier,\n *   privateKey                PrivateKey,\n *   attributes           [0]  IMPLICIT Attributes OPTIONAL\n * }\n *\n * Version ::= INTEGER\n * PrivateKeyAlgorithmIdentifier ::= AlgorithmIdentifier\n * PrivateKey ::= OCTET STRING\n * Attributes ::= SET OF Attribute\n *\n * An RSA private key as the following structure:\n *\n * RSAPrivateKey ::= SEQUENCE {\n *   version Version,\n *   modulus INTEGER, -- n\n *   publicExponent INTEGER, -- e\n *   privateExponent INTEGER, -- d\n *   prime1 INTEGER, -- p\n *   prime2 INTEGER, -- q\n *   exponent1 INTEGER, -- d mod (p-1)\n *   exponent2 INTEGER, -- d mod (q-1)\n *   coefficient INTEGER -- (inverse of q) mod p\n * }\n *\n * Version ::= INTEGER\n *\n * The OID for the RSA key algorithm is: 1.2.840.113549.1.1.1\n */\nvar forge = __webpack_require__(4);\n__webpack_require__(14);\n__webpack_require__(43);\n__webpack_require__(23);\n__webpack_require__(85);\n__webpack_require__(86);\n__webpack_require__(13);\n__webpack_require__(7);\n\nif(typeof BigInteger === 'undefined') {\n  var BigInteger = forge.jsbn.BigInteger;\n}\n\nvar _crypto = forge.util.isNodejs ? __webpack_require__(57) : null;\n\n// shortcut for asn.1 API\nvar asn1 = forge.asn1;\n\n// shortcut for util API\nvar util = forge.util;\n\n/*\n * RSA encryption and decryption, see RFC 2313.\n */\nforge.pki = forge.pki || {};\nmodule.exports = forge.pki.rsa = forge.rsa = forge.rsa || {};\nvar pki = forge.pki;\n\n// for finding primes, which are 30k+i for i = 1, 7, 11, 13, 17, 19, 23, 29\nvar GCD_30_DELTA = [6, 4, 2, 4, 2, 4, 6, 2];\n\n// validator for a PrivateKeyInfo structure\nvar privateKeyValidator = {\n  // PrivateKeyInfo\n  name: 'PrivateKeyInfo',\n  tagClass: asn1.Class.UNIVERSAL,\n  type: asn1.Type.SEQUENCE,\n  constructed: true,\n  value: [{\n    // Version (INTEGER)\n    name: 'PrivateKeyInfo.version',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.INTEGER,\n    constructed: false,\n    capture: 'privateKeyVersion'\n  }, {\n    // privateKeyAlgorithm\n    name: 'PrivateKeyInfo.privateKeyAlgorithm',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.SEQUENCE,\n    constructed: true,\n    value: [{\n      name: 'AlgorithmIdentifier.algorithm',\n      tagClass: asn1.Class.UNIVERSAL,\n      type: asn1.Type.OID,\n      constructed: false,\n      capture: 'privateKeyOid'\n    }]\n  }, {\n    // PrivateKey\n    name: 'PrivateKeyInfo',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.OCTETSTRING,\n    constructed: false,\n    capture: 'privateKey'\n  }]\n};\n\n// validator for an RSA private key\nvar rsaPrivateKeyValidator = {\n  // RSAPrivateKey\n  name: 'RSAPrivateKey',\n  tagClass: asn1.Class.UNIVERSAL,\n  type: asn1.Type.SEQUENCE,\n  constructed: true,\n  value: [{\n    // Version (INTEGER)\n    name: 'RSAPrivateKey.version',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.INTEGER,\n    constructed: false,\n    capture: 'privateKeyVersion'\n  }, {\n    // modulus (n)\n    name: 'RSAPrivateKey.modulus',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.INTEGER,\n    constructed: false,\n    capture: 'privateKeyModulus'\n  }, {\n    // publicExponent (e)\n    name: 'RSAPrivateKey.publicExponent',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.INTEGER,\n    constructed: false,\n    capture: 'privateKeyPublicExponent'\n  }, {\n    // privateExponent (d)\n    name: 'RSAPrivateKey.privateExponent',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.INTEGER,\n    constructed: false,\n    capture: 'privateKeyPrivateExponent'\n  }, {\n    // prime1 (p)\n    name: 'RSAPrivateKey.prime1',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.INTEGER,\n    constructed: false,\n    capture: 'privateKeyPrime1'\n  }, {\n    // prime2 (q)\n    name: 'RSAPrivateKey.prime2',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.INTEGER,\n    constructed: false,\n    capture: 'privateKeyPrime2'\n  }, {\n    // exponent1 (d mod (p-1))\n    name: 'RSAPrivateKey.exponent1',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.INTEGER,\n    constructed: false,\n    capture: 'privateKeyExponent1'\n  }, {\n    // exponent2 (d mod (q-1))\n    name: 'RSAPrivateKey.exponent2',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.INTEGER,\n    constructed: false,\n    capture: 'privateKeyExponent2'\n  }, {\n    // coefficient ((inverse of q) mod p)\n    name: 'RSAPrivateKey.coefficient',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.INTEGER,\n    constructed: false,\n    capture: 'privateKeyCoefficient'\n  }]\n};\n\n// validator for an RSA public key\nvar rsaPublicKeyValidator = {\n  // RSAPublicKey\n  name: 'RSAPublicKey',\n  tagClass: asn1.Class.UNIVERSAL,\n  type: asn1.Type.SEQUENCE,\n  constructed: true,\n  value: [{\n    // modulus (n)\n    name: 'RSAPublicKey.modulus',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.INTEGER,\n    constructed: false,\n    capture: 'publicKeyModulus'\n  }, {\n    // publicExponent (e)\n    name: 'RSAPublicKey.exponent',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.INTEGER,\n    constructed: false,\n    capture: 'publicKeyExponent'\n  }]\n};\n\n// validator for an SubjectPublicKeyInfo structure\n// Note: Currently only works with an RSA public key\nvar publicKeyValidator = forge.pki.rsa.publicKeyValidator = {\n  name: 'SubjectPublicKeyInfo',\n  tagClass: asn1.Class.UNIVERSAL,\n  type: asn1.Type.SEQUENCE,\n  constructed: true,\n  captureAsn1: 'subjectPublicKeyInfo',\n  value: [{\n    name: 'SubjectPublicKeyInfo.AlgorithmIdentifier',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.SEQUENCE,\n    constructed: true,\n    value: [{\n      name: 'AlgorithmIdentifier.algorithm',\n      tagClass: asn1.Class.UNIVERSAL,\n      type: asn1.Type.OID,\n      constructed: false,\n      capture: 'publicKeyOid'\n    }]\n  }, {\n    // subjectPublicKey\n    name: 'SubjectPublicKeyInfo.subjectPublicKey',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.BITSTRING,\n    constructed: false,\n    value: [{\n      // RSAPublicKey\n      name: 'SubjectPublicKeyInfo.subjectPublicKey.RSAPublicKey',\n      tagClass: asn1.Class.UNIVERSAL,\n      type: asn1.Type.SEQUENCE,\n      constructed: true,\n      optional: true,\n      captureAsn1: 'rsaPublicKey'\n    }]\n  }]\n};\n\n// validator for a DigestInfo structure\nvar digestInfoValidator = {\n  name: 'DigestInfo',\n  tagClass: asn1.Class.UNIVERSAL,\n  type: asn1.Type.SEQUENCE,\n  constructed: true,\n  value: [{\n    name: 'DigestInfo.DigestAlgorithm',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.SEQUENCE,\n    constructed: true,\n    value: [{\n      name: 'DigestInfo.DigestAlgorithm.algorithmIdentifier',\n      tagClass: asn1.Class.UNIVERSAL,\n      type: asn1.Type.OID,\n      constructed: false,\n      capture: 'algorithmIdentifier'\n    }, {\n      // NULL paramters\n      name: 'DigestInfo.DigestAlgorithm.parameters',\n      tagClass: asn1.Class.UNIVERSAL,\n      type: asn1.Type.NULL,\n      // captured only to check existence for md2 and md5\n      capture: 'parameters',\n      optional: true,\n      constructed: false\n    }]\n  }, {\n    // digest\n    name: 'DigestInfo.digest',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.OCTETSTRING,\n    constructed: false,\n    capture: 'digest'\n  }]\n};\n\n/**\n * Wrap digest in DigestInfo object.\n *\n * This function implements EMSA-PKCS1-v1_5-ENCODE as per RFC 3447.\n *\n * DigestInfo ::= SEQUENCE {\n *   digestAlgorithm DigestAlgorithmIdentifier,\n *   digest Digest\n * }\n *\n * DigestAlgorithmIdentifier ::= AlgorithmIdentifier\n * Digest ::= OCTET STRING\n *\n * @param md the message digest object with the hash to sign.\n *\n * @return the encoded message (ready for RSA encrytion)\n */\nvar emsaPkcs1v15encode = function(md) {\n  // get the oid for the algorithm\n  var oid;\n  if(md.algorithm in pki.oids) {\n    oid = pki.oids[md.algorithm];\n  } else {\n    var error = new Error('Unknown message digest algorithm.');\n    error.algorithm = md.algorithm;\n    throw error;\n  }\n  var oidBytes = asn1.oidToDer(oid).getBytes();\n\n  // create the digest info\n  var digestInfo = asn1.create(\n    asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, []);\n  var digestAlgorithm = asn1.create(\n    asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, []);\n  digestAlgorithm.value.push(asn1.create(\n    asn1.Class.UNIVERSAL, asn1.Type.OID, false, oidBytes));\n  digestAlgorithm.value.push(asn1.create(\n    asn1.Class.UNIVERSAL, asn1.Type.NULL, false, ''));\n  var digest = asn1.create(\n    asn1.Class.UNIVERSAL, asn1.Type.OCTETSTRING,\n    false, md.digest().getBytes());\n  digestInfo.value.push(digestAlgorithm);\n  digestInfo.value.push(digest);\n\n  // encode digest info\n  return asn1.toDer(digestInfo).getBytes();\n};\n\n/**\n * Performs x^c mod n (RSA encryption or decryption operation).\n *\n * @param x the number to raise and mod.\n * @param key the key to use.\n * @param pub true if the key is public, false if private.\n *\n * @return the result of x^c mod n.\n */\nvar _modPow = function(x, key, pub) {\n  if(pub) {\n    return x.modPow(key.e, key.n);\n  }\n\n  if(!key.p || !key.q) {\n    // allow calculation without CRT params (slow)\n    return x.modPow(key.d, key.n);\n  }\n\n  // pre-compute dP, dQ, and qInv if necessary\n  if(!key.dP) {\n    key.dP = key.d.mod(key.p.subtract(BigInteger.ONE));\n  }\n  if(!key.dQ) {\n    key.dQ = key.d.mod(key.q.subtract(BigInteger.ONE));\n  }\n  if(!key.qInv) {\n    key.qInv = key.q.modInverse(key.p);\n  }\n\n  /* Chinese remainder theorem (CRT) states:\n\n    Suppose n1, n2, ..., nk are positive integers which are pairwise\n    coprime (n1 and n2 have no common factors other than 1). For any\n    integers x1, x2, ..., xk there exists an integer x solving the\n    system of simultaneous congruences (where ~= means modularly\n    congruent so a ~= b mod n means a mod n = b mod n):\n\n    x ~= x1 mod n1\n    x ~= x2 mod n2\n    ...\n    x ~= xk mod nk\n\n    This system of congruences has a single simultaneous solution x\n    between 0 and n - 1. Furthermore, each xk solution and x itself\n    is congruent modulo the product n = n1*n2*...*nk.\n    So x1 mod n = x2 mod n = xk mod n = x mod n.\n\n    The single simultaneous solution x can be solved with the following\n    equation:\n\n    x = sum(xi*ri*si) mod n where ri = n/ni and si = ri^-1 mod ni.\n\n    Where x is less than n, xi = x mod ni.\n\n    For RSA we are only concerned with k = 2. The modulus n = pq, where\n    p and q are coprime. The RSA decryption algorithm is:\n\n    y = x^d mod n\n\n    Given the above:\n\n    x1 = x^d mod p\n    r1 = n/p = q\n    s1 = q^-1 mod p\n    x2 = x^d mod q\n    r2 = n/q = p\n    s2 = p^-1 mod q\n\n    So y = (x1r1s1 + x2r2s2) mod n\n         = ((x^d mod p)q(q^-1 mod p) + (x^d mod q)p(p^-1 mod q)) mod n\n\n    According to Fermat's Little Theorem, if the modulus P is prime,\n    for any integer A not evenly divisible by P, A^(P-1) ~= 1 mod P.\n    Since A is not divisible by P it follows that if:\n    N ~= M mod (P - 1), then A^N mod P = A^M mod P. Therefore:\n\n    A^N mod P = A^(M mod (P - 1)) mod P. (The latter takes less effort\n    to calculate). In order to calculate x^d mod p more quickly the\n    exponent d mod (p - 1) is stored in the RSA private key (the same\n    is done for x^d mod q). These values are referred to as dP and dQ\n    respectively. Therefore we now have:\n\n    y = ((x^dP mod p)q(q^-1 mod p) + (x^dQ mod q)p(p^-1 mod q)) mod n\n\n    Since we'll be reducing x^dP by modulo p (same for q) we can also\n    reduce x by p (and q respectively) before hand. Therefore, let\n\n    xp = ((x mod p)^dP mod p), and\n    xq = ((x mod q)^dQ mod q), yielding:\n\n    y = (xp*q*(q^-1 mod p) + xq*p*(p^-1 mod q)) mod n\n\n    This can be further reduced to a simple algorithm that only\n    requires 1 inverse (the q inverse is used) to be used and stored.\n    The algorithm is called Garner's algorithm. If qInv is the\n    inverse of q, we simply calculate:\n\n    y = (qInv*(xp - xq) mod p) * q + xq\n\n    However, there are two further complications. First, we need to\n    ensure that xp > xq to prevent signed BigIntegers from being used\n    so we add p until this is true (since we will be mod'ing with\n    p anyway). Then, there is a known timing attack on algorithms\n    using the CRT. To mitigate this risk, \"cryptographic blinding\"\n    should be used. This requires simply generating a random number r\n    between 0 and n-1 and its inverse and multiplying x by r^e before\n    calculating y and then multiplying y by r^-1 afterwards. Note that\n    r must be coprime with n (gcd(r, n) === 1) in order to have an\n    inverse.\n  */\n\n  // cryptographic blinding\n  var r;\n  do {\n    r = new BigInteger(\n      forge.util.bytesToHex(forge.random.getBytes(key.n.bitLength() / 8)),\n      16);\n  } while(r.compareTo(key.n) >= 0 || !r.gcd(key.n).equals(BigInteger.ONE));\n  x = x.multiply(r.modPow(key.e, key.n)).mod(key.n);\n\n  // calculate xp and xq\n  var xp = x.mod(key.p).modPow(key.dP, key.p);\n  var xq = x.mod(key.q).modPow(key.dQ, key.q);\n\n  // xp must be larger than xq to avoid signed bit usage\n  while(xp.compareTo(xq) < 0) {\n    xp = xp.add(key.p);\n  }\n\n  // do last step\n  var y = xp.subtract(xq)\n    .multiply(key.qInv).mod(key.p)\n    .multiply(key.q).add(xq);\n\n  // remove effect of random for cryptographic blinding\n  y = y.multiply(r.modInverse(key.n)).mod(key.n);\n\n  return y;\n};\n\n/**\n * NOTE: THIS METHOD IS DEPRECATED, use 'sign' on a private key object or\n * 'encrypt' on a public key object instead.\n *\n * Performs RSA encryption.\n *\n * The parameter bt controls whether to put padding bytes before the\n * message passed in. Set bt to either true or false to disable padding\n * completely (in order to handle e.g. EMSA-PSS encoding seperately before),\n * signaling whether the encryption operation is a public key operation\n * (i.e. encrypting data) or not, i.e. private key operation (data signing).\n *\n * For PKCS#1 v1.5 padding pass in the block type to use, i.e. either 0x01\n * (for signing) or 0x02 (for encryption). The key operation mode (private\n * or public) is derived from this flag in that case).\n *\n * @param m the message to encrypt as a byte string.\n * @param key the RSA key to use.\n * @param bt for PKCS#1 v1.5 padding, the block type to use\n *   (0x01 for private key, 0x02 for public),\n *   to disable padding: true = public key, false = private key.\n *\n * @return the encrypted bytes as a string.\n */\npki.rsa.encrypt = function(m, key, bt) {\n  var pub = bt;\n  var eb;\n\n  // get the length of the modulus in bytes\n  var k = Math.ceil(key.n.bitLength() / 8);\n\n  if(bt !== false && bt !== true) {\n    // legacy, default to PKCS#1 v1.5 padding\n    pub = (bt === 0x02);\n    eb = _encodePkcs1_v1_5(m, key, bt);\n  } else {\n    eb = forge.util.createBuffer();\n    eb.putBytes(m);\n  }\n\n  // load encryption block as big integer 'x'\n  // FIXME: hex conversion inefficient, get BigInteger w/byte strings\n  var x = new BigInteger(eb.toHex(), 16);\n\n  // do RSA encryption\n  var y = _modPow(x, key, pub);\n\n  // convert y into the encrypted data byte string, if y is shorter in\n  // bytes than k, then prepend zero bytes to fill up ed\n  // FIXME: hex conversion inefficient, get BigInteger w/byte strings\n  var yhex = y.toString(16);\n  var ed = forge.util.createBuffer();\n  var zeros = k - Math.ceil(yhex.length / 2);\n  while(zeros > 0) {\n    ed.putByte(0x00);\n    --zeros;\n  }\n  ed.putBytes(forge.util.hexToBytes(yhex));\n  return ed.getBytes();\n};\n\n/**\n * NOTE: THIS METHOD IS DEPRECATED, use 'decrypt' on a private key object or\n * 'verify' on a public key object instead.\n *\n * Performs RSA decryption.\n *\n * The parameter ml controls whether to apply PKCS#1 v1.5 padding\n * or not.  Set ml = false to disable padding removal completely\n * (in order to handle e.g. EMSA-PSS later on) and simply pass back\n * the RSA encryption block.\n *\n * @param ed the encrypted data to decrypt in as a byte string.\n * @param key the RSA key to use.\n * @param pub true for a public key operation, false for private.\n * @param ml the message length, if known, false to disable padding.\n *\n * @return the decrypted message as a byte string.\n */\npki.rsa.decrypt = function(ed, key, pub, ml) {\n  // get the length of the modulus in bytes\n  var k = Math.ceil(key.n.bitLength() / 8);\n\n  // error if the length of the encrypted data ED is not k\n  if(ed.length !== k) {\n    var error = new Error('Encrypted message length is invalid.');\n    error.length = ed.length;\n    error.expected = k;\n    throw error;\n  }\n\n  // convert encrypted data into a big integer\n  // FIXME: hex conversion inefficient, get BigInteger w/byte strings\n  var y = new BigInteger(forge.util.createBuffer(ed).toHex(), 16);\n\n  // y must be less than the modulus or it wasn't the result of\n  // a previous mod operation (encryption) using that modulus\n  if(y.compareTo(key.n) >= 0) {\n    throw new Error('Encrypted message is invalid.');\n  }\n\n  // do RSA decryption\n  var x = _modPow(y, key, pub);\n\n  // create the encryption block, if x is shorter in bytes than k, then\n  // prepend zero bytes to fill up eb\n  // FIXME: hex conversion inefficient, get BigInteger w/byte strings\n  var xhex = x.toString(16);\n  var eb = forge.util.createBuffer();\n  var zeros = k - Math.ceil(xhex.length / 2);\n  while(zeros > 0) {\n    eb.putByte(0x00);\n    --zeros;\n  }\n  eb.putBytes(forge.util.hexToBytes(xhex));\n\n  if(ml !== false) {\n    // legacy, default to PKCS#1 v1.5 padding\n    return _decodePkcs1_v1_5(eb.getBytes(), key, pub);\n  }\n\n  // return message\n  return eb.getBytes();\n};\n\n/**\n * Creates an RSA key-pair generation state object. It is used to allow\n * key-generation to be performed in steps. It also allows for a UI to\n * display progress updates.\n *\n * @param bits the size for the private key in bits, defaults to 2048.\n * @param e the public exponent to use, defaults to 65537 (0x10001).\n * @param [options] the options to use.\n *          prng a custom crypto-secure pseudo-random number generator to use,\n *            that must define \"getBytesSync\".\n *          algorithm the algorithm to use (default: 'PRIMEINC').\n *\n * @return the state object to use to generate the key-pair.\n */\npki.rsa.createKeyPairGenerationState = function(bits, e, options) {\n  // TODO: migrate step-based prime generation code to forge.prime\n\n  // set default bits\n  if(typeof(bits) === 'string') {\n    bits = parseInt(bits, 10);\n  }\n  bits = bits || 2048;\n\n  // create prng with api that matches BigInteger secure random\n  options = options || {};\n  var prng = options.prng || forge.random;\n  var rng = {\n    // x is an array to fill with bytes\n    nextBytes: function(x) {\n      var b = prng.getBytesSync(x.length);\n      for(var i = 0; i < x.length; ++i) {\n        x[i] = b.charCodeAt(i);\n      }\n    }\n  };\n\n  var algorithm = options.algorithm || 'PRIMEINC';\n\n  // create PRIMEINC algorithm state\n  var rval;\n  if(algorithm === 'PRIMEINC') {\n    rval = {\n      algorithm: algorithm,\n      state: 0,\n      bits: bits,\n      rng: rng,\n      eInt: e || 65537,\n      e: new BigInteger(null),\n      p: null,\n      q: null,\n      qBits: bits >> 1,\n      pBits: bits - (bits >> 1),\n      pqState: 0,\n      num: null,\n      keys: null\n    };\n    rval.e.fromInt(rval.eInt);\n  } else {\n    throw new Error('Invalid key generation algorithm: ' + algorithm);\n  }\n\n  return rval;\n};\n\n/**\n * Attempts to runs the key-generation algorithm for at most n seconds\n * (approximately) using the given state. When key-generation has completed,\n * the keys will be stored in state.keys.\n *\n * To use this function to update a UI while generating a key or to prevent\n * causing browser lockups/warnings, set \"n\" to a value other than 0. A\n * simple pattern for generating a key and showing a progress indicator is:\n *\n * var state = pki.rsa.createKeyPairGenerationState(2048);\n * var step = function() {\n *   // step key-generation, run algorithm for 100 ms, repeat\n *   if(!forge.pki.rsa.stepKeyPairGenerationState(state, 100)) {\n *     setTimeout(step, 1);\n *   } else {\n *     // key-generation complete\n *     // TODO: turn off progress indicator here\n *     // TODO: use the generated key-pair in \"state.keys\"\n *   }\n * };\n * // TODO: turn on progress indicator here\n * setTimeout(step, 0);\n *\n * @param state the state to use.\n * @param n the maximum number of milliseconds to run the algorithm for, 0\n *          to run the algorithm to completion.\n *\n * @return true if the key-generation completed, false if not.\n */\npki.rsa.stepKeyPairGenerationState = function(state, n) {\n  // set default algorithm if not set\n  if(!('algorithm' in state)) {\n    state.algorithm = 'PRIMEINC';\n  }\n\n  // TODO: migrate step-based prime generation code to forge.prime\n  // TODO: abstract as PRIMEINC algorithm\n\n  // do key generation (based on Tom Wu's rsa.js, see jsbn.js license)\n  // with some minor optimizations and designed to run in steps\n\n  // local state vars\n  var THIRTY = new BigInteger(null);\n  THIRTY.fromInt(30);\n  var deltaIdx = 0;\n  var op_or = function(x, y) {return x | y;};\n\n  // keep stepping until time limit is reached or done\n  var t1 = +new Date();\n  var t2;\n  var total = 0;\n  while(state.keys === null && (n <= 0 || total < n)) {\n    // generate p or q\n    if(state.state === 0) {\n      /* Note: All primes are of the form:\n\n        30k+i, for i < 30 and gcd(30, i)=1, where there are 8 values for i\n\n        When we generate a random number, we always align it at 30k + 1. Each\n        time the number is determined not to be prime we add to get to the\n        next 'i', eg: if the number was at 30k + 1 we add 6. */\n      var bits = (state.p === null) ? state.pBits : state.qBits;\n      var bits1 = bits - 1;\n\n      // get a random number\n      if(state.pqState === 0) {\n        state.num = new BigInteger(bits, state.rng);\n        // force MSB set\n        if(!state.num.testBit(bits1)) {\n          state.num.bitwiseTo(\n            BigInteger.ONE.shiftLeft(bits1), op_or, state.num);\n        }\n        // align number on 30k+1 boundary\n        state.num.dAddOffset(31 - state.num.mod(THIRTY).byteValue(), 0);\n        deltaIdx = 0;\n\n        ++state.pqState;\n      } else if(state.pqState === 1) {\n        // try to make the number a prime\n        if(state.num.bitLength() > bits) {\n          // overflow, try again\n          state.pqState = 0;\n          // do primality test\n        } else if(state.num.isProbablePrime(\n          _getMillerRabinTests(state.num.bitLength()))) {\n          ++state.pqState;\n        } else {\n          // get next potential prime\n          state.num.dAddOffset(GCD_30_DELTA[deltaIdx++ % 8], 0);\n        }\n      } else if(state.pqState === 2) {\n        // ensure number is coprime with e\n        state.pqState =\n          (state.num.subtract(BigInteger.ONE).gcd(state.e)\n            .compareTo(BigInteger.ONE) === 0) ? 3 : 0;\n      } else if(state.pqState === 3) {\n        // store p or q\n        state.pqState = 0;\n        if(state.p === null) {\n          state.p = state.num;\n        } else {\n          state.q = state.num;\n        }\n\n        // advance state if both p and q are ready\n        if(state.p !== null && state.q !== null) {\n          ++state.state;\n        }\n        state.num = null;\n      }\n    } else if(state.state === 1) {\n      // ensure p is larger than q (swap them if not)\n      if(state.p.compareTo(state.q) < 0) {\n        state.num = state.p;\n        state.p = state.q;\n        state.q = state.num;\n      }\n      ++state.state;\n    } else if(state.state === 2) {\n      // compute phi: (p - 1)(q - 1) (Euler's totient function)\n      state.p1 = state.p.subtract(BigInteger.ONE);\n      state.q1 = state.q.subtract(BigInteger.ONE);\n      state.phi = state.p1.multiply(state.q1);\n      ++state.state;\n    } else if(state.state === 3) {\n      // ensure e and phi are coprime\n      if(state.phi.gcd(state.e).compareTo(BigInteger.ONE) === 0) {\n        // phi and e are coprime, advance\n        ++state.state;\n      } else {\n        // phi and e aren't coprime, so generate a new p and q\n        state.p = null;\n        state.q = null;\n        state.state = 0;\n      }\n    } else if(state.state === 4) {\n      // create n, ensure n is has the right number of bits\n      state.n = state.p.multiply(state.q);\n\n      // ensure n is right number of bits\n      if(state.n.bitLength() === state.bits) {\n        // success, advance\n        ++state.state;\n      } else {\n        // failed, get new q\n        state.q = null;\n        state.state = 0;\n      }\n    } else if(state.state === 5) {\n      // set keys\n      var d = state.e.modInverse(state.phi);\n      state.keys = {\n        privateKey: pki.rsa.setPrivateKey(\n          state.n, state.e, d, state.p, state.q,\n          d.mod(state.p1), d.mod(state.q1),\n          state.q.modInverse(state.p)),\n        publicKey: pki.rsa.setPublicKey(state.n, state.e)\n      };\n    }\n\n    // update timing\n    t2 = +new Date();\n    total += t2 - t1;\n    t1 = t2;\n  }\n\n  return state.keys !== null;\n};\n\n/**\n * Generates an RSA public-private key pair in a single call.\n *\n * To generate a key-pair in steps (to allow for progress updates and to\n * prevent blocking or warnings in slow browsers) then use the key-pair\n * generation state functions.\n *\n * To generate a key-pair asynchronously (either through web-workers, if\n * available, or by breaking up the work on the main thread), pass a\n * callback function.\n *\n * @param [bits] the size for the private key in bits, defaults to 2048.\n * @param [e] the public exponent to use, defaults to 65537.\n * @param [options] options for key-pair generation, if given then 'bits'\n *            and 'e' must *not* be given:\n *          bits the size for the private key in bits, (default: 2048).\n *          e the public exponent to use, (default: 65537 (0x10001)).\n *          workerScript the worker script URL.\n *          workers the number of web workers (if supported) to use,\n *            (default: 2).\n *          workLoad the size of the work load, ie: number of possible prime\n *            numbers for each web worker to check per work assignment,\n *            (default: 100).\n *          prng a custom crypto-secure pseudo-random number generator to use,\n *            that must define \"getBytesSync\". Disables use of native APIs.\n *          algorithm the algorithm to use (default: 'PRIMEINC').\n * @param [callback(err, keypair)] called once the operation completes.\n *\n * @return an object with privateKey and publicKey properties.\n */\npki.rsa.generateKeyPair = function(bits, e, options, callback) {\n  // (bits), (options), (callback)\n  if(arguments.length === 1) {\n    if(typeof bits === 'object') {\n      options = bits;\n      bits = undefined;\n    } else if(typeof bits === 'function') {\n      callback = bits;\n      bits = undefined;\n    }\n  } else if(arguments.length === 2) {\n    // (bits, e), (bits, options), (bits, callback), (options, callback)\n    if(typeof bits === 'number') {\n      if(typeof e === 'function') {\n        callback = e;\n        e = undefined;\n      } else if(typeof e !== 'number') {\n        options = e;\n        e = undefined;\n      }\n    } else {\n      options = bits;\n      callback = e;\n      bits = undefined;\n      e = undefined;\n    }\n  } else if(arguments.length === 3) {\n    // (bits, e, options), (bits, e, callback), (bits, options, callback)\n    if(typeof e === 'number') {\n      if(typeof options === 'function') {\n        callback = options;\n        options = undefined;\n      }\n    } else {\n      callback = options;\n      options = e;\n      e = undefined;\n    }\n  }\n  options = options || {};\n  if(bits === undefined) {\n    bits = options.bits || 2048;\n  }\n  if(e === undefined) {\n    e = options.e || 0x10001;\n  }\n\n  // use native code if permitted, available, and parameters are acceptable\n  if(!forge.options.usePureJavaScript && !options.prng &&\n    bits >= 256 && bits <= 16384 && (e === 0x10001 || e === 3)) {\n    if(callback) {\n      // try native async\n      if(_detectNodeCrypto('generateKeyPair')) {\n        return _crypto.generateKeyPair('rsa', {\n          modulusLength: bits,\n          publicExponent: e,\n          publicKeyEncoding: {\n            type: 'spki',\n            format: 'pem'\n          },\n          privateKeyEncoding: {\n            type: 'pkcs8',\n            format: 'pem'\n          }\n        }, function(err, pub, priv) {\n          if(err) {\n            return callback(err);\n          }\n          callback(null, {\n            privateKey: pki.privateKeyFromPem(priv),\n            publicKey: pki.publicKeyFromPem(pub)\n          });\n        });\n      }\n      if(_detectSubtleCrypto('generateKey') &&\n        _detectSubtleCrypto('exportKey')) {\n        // use standard native generateKey\n        return util.globalScope.crypto.subtle.generateKey({\n          name: 'RSASSA-PKCS1-v1_5',\n          modulusLength: bits,\n          publicExponent: _intToUint8Array(e),\n          hash: {name: 'SHA-256'}\n        }, true /* key can be exported*/, ['sign', 'verify'])\n        .then(function(pair) {\n          return util.globalScope.crypto.subtle.exportKey(\n            'pkcs8', pair.privateKey);\n        // avoiding catch(function(err) {...}) to support IE <= 8\n        }).then(undefined, function(err) {\n          callback(err);\n        }).then(function(pkcs8) {\n          if(pkcs8) {\n            var privateKey = pki.privateKeyFromAsn1(\n              asn1.fromDer(forge.util.createBuffer(pkcs8)));\n            callback(null, {\n              privateKey: privateKey,\n              publicKey: pki.setRsaPublicKey(privateKey.n, privateKey.e)\n            });\n          }\n        });\n      }\n      if(_detectSubtleMsCrypto('generateKey') &&\n        _detectSubtleMsCrypto('exportKey')) {\n        var genOp = util.globalScope.msCrypto.subtle.generateKey({\n          name: 'RSASSA-PKCS1-v1_5',\n          modulusLength: bits,\n          publicExponent: _intToUint8Array(e),\n          hash: {name: 'SHA-256'}\n        }, true /* key can be exported*/, ['sign', 'verify']);\n        genOp.oncomplete = function(e) {\n          var pair = e.target.result;\n          var exportOp = util.globalScope.msCrypto.subtle.exportKey(\n            'pkcs8', pair.privateKey);\n          exportOp.oncomplete = function(e) {\n            var pkcs8 = e.target.result;\n            var privateKey = pki.privateKeyFromAsn1(\n              asn1.fromDer(forge.util.createBuffer(pkcs8)));\n            callback(null, {\n              privateKey: privateKey,\n              publicKey: pki.setRsaPublicKey(privateKey.n, privateKey.e)\n            });\n          };\n          exportOp.onerror = function(err) {\n            callback(err);\n          };\n        };\n        genOp.onerror = function(err) {\n          callback(err);\n        };\n        return;\n      }\n    } else {\n      // try native sync\n      if(_detectNodeCrypto('generateKeyPairSync')) {\n        var keypair = _crypto.generateKeyPairSync('rsa', {\n          modulusLength: bits,\n          publicExponent: e,\n          publicKeyEncoding: {\n            type: 'spki',\n            format: 'pem'\n          },\n          privateKeyEncoding: {\n            type: 'pkcs8',\n            format: 'pem'\n          }\n        });\n        return {\n          privateKey: pki.privateKeyFromPem(keypair.privateKey),\n          publicKey: pki.publicKeyFromPem(keypair.publicKey)\n        };\n      }\n    }\n  }\n\n  // use JavaScript implementation\n  var state = pki.rsa.createKeyPairGenerationState(bits, e, options);\n  if(!callback) {\n    pki.rsa.stepKeyPairGenerationState(state, 0);\n    return state.keys;\n  }\n  _generateKeyPair(state, options, callback);\n};\n\n/**\n * Sets an RSA public key from BigIntegers modulus and exponent.\n *\n * @param n the modulus.\n * @param e the exponent.\n *\n * @return the public key.\n */\npki.setRsaPublicKey = pki.rsa.setPublicKey = function(n, e) {\n  var key = {\n    n: n,\n    e: e\n  };\n\n  /**\n   * Encrypts the given data with this public key. Newer applications\n   * should use the 'RSA-OAEP' decryption scheme, 'RSAES-PKCS1-V1_5' is for\n   * legacy applications.\n   *\n   * @param data the byte string to encrypt.\n   * @param scheme the encryption scheme to use:\n   *          'RSAES-PKCS1-V1_5' (default),\n   *          'RSA-OAEP',\n   *          'RAW', 'NONE', or null to perform raw RSA encryption,\n   *          an object with an 'encode' property set to a function\n   *          with the signature 'function(data, key)' that returns\n   *          a binary-encoded string representing the encoded data.\n   * @param schemeOptions any scheme-specific options.\n   *\n   * @return the encrypted byte string.\n   */\n  key.encrypt = function(data, scheme, schemeOptions) {\n    if(typeof scheme === 'string') {\n      scheme = scheme.toUpperCase();\n    } else if(scheme === undefined) {\n      scheme = 'RSAES-PKCS1-V1_5';\n    }\n\n    if(scheme === 'RSAES-PKCS1-V1_5') {\n      scheme = {\n        encode: function(m, key, pub) {\n          return _encodePkcs1_v1_5(m, key, 0x02).getBytes();\n        }\n      };\n    } else if(scheme === 'RSA-OAEP' || scheme === 'RSAES-OAEP') {\n      scheme = {\n        encode: function(m, key) {\n          return forge.pkcs1.encode_rsa_oaep(key, m, schemeOptions);\n        }\n      };\n    } else if(['RAW', 'NONE', 'NULL', null].indexOf(scheme) !== -1) {\n      scheme = {encode: function(e) {return e;}};\n    } else if(typeof scheme === 'string') {\n      throw new Error('Unsupported encryption scheme: \"' + scheme + '\".');\n    }\n\n    // do scheme-based encoding then rsa encryption\n    var e = scheme.encode(data, key, true);\n    return pki.rsa.encrypt(e, key, true);\n  };\n\n  /**\n   * Verifies the given signature against the given digest.\n   *\n   * PKCS#1 supports multiple (currently two) signature schemes:\n   * RSASSA-PKCS1-V1_5 and RSASSA-PSS.\n   *\n   * By default this implementation uses the \"old scheme\", i.e.\n   * RSASSA-PKCS1-V1_5, in which case once RSA-decrypted, the\n   * signature is an OCTET STRING that holds a DigestInfo.\n   *\n   * DigestInfo ::= SEQUENCE {\n   *   digestAlgorithm DigestAlgorithmIdentifier,\n   *   digest Digest\n   * }\n   * DigestAlgorithmIdentifier ::= AlgorithmIdentifier\n   * Digest ::= OCTET STRING\n   *\n   * To perform PSS signature verification, provide an instance\n   * of Forge PSS object as the scheme parameter.\n   *\n   * @param digest the message digest hash to compare against the signature,\n   *          as a binary-encoded string.\n   * @param signature the signature to verify, as a binary-encoded string.\n   * @param scheme signature verification scheme to use:\n   *          'RSASSA-PKCS1-V1_5' or undefined for RSASSA PKCS#1 v1.5,\n   *          a Forge PSS object for RSASSA-PSS,\n   *          'NONE' or null for none, DigestInfo will not be expected, but\n   *            PKCS#1 v1.5 padding will still be used.\n   * @param options optional verify options\n   *          _parseAllDigestBytes testing flag to control parsing of all\n   *            digest bytes. Unsupported and not for general usage.\n   *            (default: true)\n   *\n   * @return true if the signature was verified, false if not.\n   */\n  key.verify = function(digest, signature, scheme, options) {\n    if(typeof scheme === 'string') {\n      scheme = scheme.toUpperCase();\n    } else if(scheme === undefined) {\n      scheme = 'RSASSA-PKCS1-V1_5';\n    }\n    if(options === undefined) {\n      options = {\n        _parseAllDigestBytes: true\n      };\n    }\n    if(!('_parseAllDigestBytes' in options)) {\n      options._parseAllDigestBytes = true;\n    }\n\n    if(scheme === 'RSASSA-PKCS1-V1_5') {\n      scheme = {\n        verify: function(digest, d) {\n          // remove padding\n          d = _decodePkcs1_v1_5(d, key, true);\n          // d is ASN.1 BER-encoded DigestInfo\n          var obj = asn1.fromDer(d, {\n            parseAllBytes: options._parseAllDigestBytes\n          });\n\n          // validate DigestInfo\n          var capture = {};\n          var errors = [];\n          if(!asn1.validate(obj, digestInfoValidator, capture, errors)) {\n            var error = new Error(\n              'ASN.1 object does not contain a valid RSASSA-PKCS1-v1_5 ' +\n              'DigestInfo value.');\n            error.errors = errors;\n            throw error;\n          }\n          // check hash algorithm identifier\n          // see PKCS1-v1-5DigestAlgorithms in RFC 8017\n          // FIXME: add support to vaidator for strict value choices\n          var oid = asn1.derToOid(capture.algorithmIdentifier);\n          if(!(oid === forge.oids.md2 ||\n            oid === forge.oids.md5 ||\n            oid === forge.oids.sha1 ||\n            oid === forge.oids.sha224 ||\n            oid === forge.oids.sha256 ||\n            oid === forge.oids.sha384 ||\n            oid === forge.oids.sha512 ||\n            oid === forge.oids['sha512-224'] ||\n            oid === forge.oids['sha512-256'])) {\n            var error = new Error(\n              'Unknown RSASSA-PKCS1-v1_5 DigestAlgorithm identifier.');\n            error.oid = oid;\n            throw error;\n          }\n\n          // special check for md2 and md5 that NULL parameters exist\n          if(oid === forge.oids.md2 || oid === forge.oids.md5) {\n            if(!('parameters' in capture)) {\n              throw new Error(\n                'ASN.1 object does not contain a valid RSASSA-PKCS1-v1_5 ' +\n                'DigestInfo value. ' +\n                'Missing algorithm identifer NULL parameters.');\n            }\n          }\n\n          // compare the given digest to the decrypted one\n          return digest === capture.digest;\n        }\n      };\n    } else if(scheme === 'NONE' || scheme === 'NULL' || scheme === null) {\n      scheme = {\n        verify: function(digest, d) {\n          // remove padding\n          d = _decodePkcs1_v1_5(d, key, true);\n          return digest === d;\n        }\n      };\n    }\n\n    // do rsa decryption w/o any decoding, then verify -- which does decoding\n    var d = pki.rsa.decrypt(signature, key, true, false);\n    return scheme.verify(digest, d, key.n.bitLength());\n  };\n\n  return key;\n};\n\n/**\n * Sets an RSA private key from BigIntegers modulus, exponent, primes,\n * prime exponents, and modular multiplicative inverse.\n *\n * @param n the modulus.\n * @param e the public exponent.\n * @param d the private exponent ((inverse of e) mod n).\n * @param p the first prime.\n * @param q the second prime.\n * @param dP exponent1 (d mod (p-1)).\n * @param dQ exponent2 (d mod (q-1)).\n * @param qInv ((inverse of q) mod p)\n *\n * @return the private key.\n */\npki.setRsaPrivateKey = pki.rsa.setPrivateKey = function(\n  n, e, d, p, q, dP, dQ, qInv) {\n  var key = {\n    n: n,\n    e: e,\n    d: d,\n    p: p,\n    q: q,\n    dP: dP,\n    dQ: dQ,\n    qInv: qInv\n  };\n\n  /**\n   * Decrypts the given data with this private key. The decryption scheme\n   * must match the one used to encrypt the data.\n   *\n   * @param data the byte string to decrypt.\n   * @param scheme the decryption scheme to use:\n   *          'RSAES-PKCS1-V1_5' (default),\n   *          'RSA-OAEP',\n   *          'RAW', 'NONE', or null to perform raw RSA decryption.\n   * @param schemeOptions any scheme-specific options.\n   *\n   * @return the decrypted byte string.\n   */\n  key.decrypt = function(data, scheme, schemeOptions) {\n    if(typeof scheme === 'string') {\n      scheme = scheme.toUpperCase();\n    } else if(scheme === undefined) {\n      scheme = 'RSAES-PKCS1-V1_5';\n    }\n\n    // do rsa decryption w/o any decoding\n    var d = pki.rsa.decrypt(data, key, false, false);\n\n    if(scheme === 'RSAES-PKCS1-V1_5') {\n      scheme = {decode: _decodePkcs1_v1_5};\n    } else if(scheme === 'RSA-OAEP' || scheme === 'RSAES-OAEP') {\n      scheme = {\n        decode: function(d, key) {\n          return forge.pkcs1.decode_rsa_oaep(key, d, schemeOptions);\n        }\n      };\n    } else if(['RAW', 'NONE', 'NULL', null].indexOf(scheme) !== -1) {\n      scheme = {decode: function(d) {return d;}};\n    } else {\n      throw new Error('Unsupported encryption scheme: \"' + scheme + '\".');\n    }\n\n    // decode according to scheme\n    return scheme.decode(d, key, false);\n  };\n\n  /**\n   * Signs the given digest, producing a signature.\n   *\n   * PKCS#1 supports multiple (currently two) signature schemes:\n   * RSASSA-PKCS1-V1_5 and RSASSA-PSS.\n   *\n   * By default this implementation uses the \"old scheme\", i.e.\n   * RSASSA-PKCS1-V1_5. In order to generate a PSS signature, provide\n   * an instance of Forge PSS object as the scheme parameter.\n   *\n   * @param md the message digest object with the hash to sign.\n   * @param scheme the signature scheme to use:\n   *          'RSASSA-PKCS1-V1_5' or undefined for RSASSA PKCS#1 v1.5,\n   *          a Forge PSS object for RSASSA-PSS,\n   *          'NONE' or null for none, DigestInfo will not be used but\n   *            PKCS#1 v1.5 padding will still be used.\n   *\n   * @return the signature as a byte string.\n   */\n  key.sign = function(md, scheme) {\n    /* Note: The internal implementation of RSA operations is being\n      transitioned away from a PKCS#1 v1.5 hard-coded scheme. Some legacy\n      code like the use of an encoding block identifier 'bt' will eventually\n      be removed. */\n\n    // private key operation\n    var bt = false;\n\n    if(typeof scheme === 'string') {\n      scheme = scheme.toUpperCase();\n    }\n\n    if(scheme === undefined || scheme === 'RSASSA-PKCS1-V1_5') {\n      scheme = {encode: emsaPkcs1v15encode};\n      bt = 0x01;\n    } else if(scheme === 'NONE' || scheme === 'NULL' || scheme === null) {\n      scheme = {encode: function() {return md;}};\n      bt = 0x01;\n    }\n\n    // encode and then encrypt\n    var d = scheme.encode(md, key.n.bitLength());\n    return pki.rsa.encrypt(d, key, bt);\n  };\n\n  return key;\n};\n\n/**\n * Wraps an RSAPrivateKey ASN.1 object in an ASN.1 PrivateKeyInfo object.\n *\n * @param rsaKey the ASN.1 RSAPrivateKey.\n *\n * @return the ASN.1 PrivateKeyInfo.\n */\npki.wrapRsaPrivateKey = function(rsaKey) {\n  // PrivateKeyInfo\n  return asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [\n    // version (0)\n    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.INTEGER, false,\n      asn1.integerToDer(0).getBytes()),\n    // privateKeyAlgorithm\n    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [\n      asn1.create(\n        asn1.Class.UNIVERSAL, asn1.Type.OID, false,\n        asn1.oidToDer(pki.oids.rsaEncryption).getBytes()),\n      asn1.create(asn1.Class.UNIVERSAL, asn1.Type.NULL, false, '')\n    ]),\n    // PrivateKey\n    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OCTETSTRING, false,\n      asn1.toDer(rsaKey).getBytes())\n  ]);\n};\n\n/**\n * Converts a private key from an ASN.1 object.\n *\n * @param obj the ASN.1 representation of a PrivateKeyInfo containing an\n *          RSAPrivateKey or an RSAPrivateKey.\n *\n * @return the private key.\n */\npki.privateKeyFromAsn1 = function(obj) {\n  // get PrivateKeyInfo\n  var capture = {};\n  var errors = [];\n  if(asn1.validate(obj, privateKeyValidator, capture, errors)) {\n    obj = asn1.fromDer(forge.util.createBuffer(capture.privateKey));\n  }\n\n  // get RSAPrivateKey\n  capture = {};\n  errors = [];\n  if(!asn1.validate(obj, rsaPrivateKeyValidator, capture, errors)) {\n    var error = new Error('Cannot read private key. ' +\n      'ASN.1 object does not contain an RSAPrivateKey.');\n    error.errors = errors;\n    throw error;\n  }\n\n  // Note: Version is currently ignored.\n  // capture.privateKeyVersion\n  // FIXME: inefficient, get a BigInteger that uses byte strings\n  var n, e, d, p, q, dP, dQ, qInv;\n  n = forge.util.createBuffer(capture.privateKeyModulus).toHex();\n  e = forge.util.createBuffer(capture.privateKeyPublicExponent).toHex();\n  d = forge.util.createBuffer(capture.privateKeyPrivateExponent).toHex();\n  p = forge.util.createBuffer(capture.privateKeyPrime1).toHex();\n  q = forge.util.createBuffer(capture.privateKeyPrime2).toHex();\n  dP = forge.util.createBuffer(capture.privateKeyExponent1).toHex();\n  dQ = forge.util.createBuffer(capture.privateKeyExponent2).toHex();\n  qInv = forge.util.createBuffer(capture.privateKeyCoefficient).toHex();\n\n  // set private key\n  return pki.setRsaPrivateKey(\n    new BigInteger(n, 16),\n    new BigInteger(e, 16),\n    new BigInteger(d, 16),\n    new BigInteger(p, 16),\n    new BigInteger(q, 16),\n    new BigInteger(dP, 16),\n    new BigInteger(dQ, 16),\n    new BigInteger(qInv, 16));\n};\n\n/**\n * Converts a private key to an ASN.1 RSAPrivateKey.\n *\n * @param key the private key.\n *\n * @return the ASN.1 representation of an RSAPrivateKey.\n */\npki.privateKeyToAsn1 = pki.privateKeyToRSAPrivateKey = function(key) {\n  // RSAPrivateKey\n  return asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [\n    // version (0 = only 2 primes, 1 multiple primes)\n    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.INTEGER, false,\n      asn1.integerToDer(0).getBytes()),\n    // modulus (n)\n    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.INTEGER, false,\n      _bnToBytes(key.n)),\n    // publicExponent (e)\n    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.INTEGER, false,\n      _bnToBytes(key.e)),\n    // privateExponent (d)\n    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.INTEGER, false,\n      _bnToBytes(key.d)),\n    // privateKeyPrime1 (p)\n    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.INTEGER, false,\n      _bnToBytes(key.p)),\n    // privateKeyPrime2 (q)\n    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.INTEGER, false,\n      _bnToBytes(key.q)),\n    // privateKeyExponent1 (dP)\n    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.INTEGER, false,\n      _bnToBytes(key.dP)),\n    // privateKeyExponent2 (dQ)\n    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.INTEGER, false,\n      _bnToBytes(key.dQ)),\n    // coefficient (qInv)\n    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.INTEGER, false,\n      _bnToBytes(key.qInv))\n  ]);\n};\n\n/**\n * Converts a public key from an ASN.1 SubjectPublicKeyInfo or RSAPublicKey.\n *\n * @param obj the asn1 representation of a SubjectPublicKeyInfo or RSAPublicKey.\n *\n * @return the public key.\n */\npki.publicKeyFromAsn1 = function(obj) {\n  // get SubjectPublicKeyInfo\n  var capture = {};\n  var errors = [];\n  if(asn1.validate(obj, publicKeyValidator, capture, errors)) {\n    // get oid\n    var oid = asn1.derToOid(capture.publicKeyOid);\n    if(oid !== pki.oids.rsaEncryption) {\n      var error = new Error('Cannot read public key. Unknown OID.');\n      error.oid = oid;\n      throw error;\n    }\n    obj = capture.rsaPublicKey;\n  }\n\n  // get RSA params\n  errors = [];\n  if(!asn1.validate(obj, rsaPublicKeyValidator, capture, errors)) {\n    var error = new Error('Cannot read public key. ' +\n      'ASN.1 object does not contain an RSAPublicKey.');\n    error.errors = errors;\n    throw error;\n  }\n\n  // FIXME: inefficient, get a BigInteger that uses byte strings\n  var n = forge.util.createBuffer(capture.publicKeyModulus).toHex();\n  var e = forge.util.createBuffer(capture.publicKeyExponent).toHex();\n\n  // set public key\n  return pki.setRsaPublicKey(\n    new BigInteger(n, 16),\n    new BigInteger(e, 16));\n};\n\n/**\n * Converts a public key to an ASN.1 SubjectPublicKeyInfo.\n *\n * @param key the public key.\n *\n * @return the asn1 representation of a SubjectPublicKeyInfo.\n */\npki.publicKeyToAsn1 = pki.publicKeyToSubjectPublicKeyInfo = function(key) {\n  // SubjectPublicKeyInfo\n  return asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [\n    // AlgorithmIdentifier\n    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [\n      // algorithm\n      asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OID, false,\n        asn1.oidToDer(pki.oids.rsaEncryption).getBytes()),\n      // parameters (null)\n      asn1.create(asn1.Class.UNIVERSAL, asn1.Type.NULL, false, '')\n    ]),\n    // subjectPublicKey\n    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.BITSTRING, false, [\n      pki.publicKeyToRSAPublicKey(key)\n    ])\n  ]);\n};\n\n/**\n * Converts a public key to an ASN.1 RSAPublicKey.\n *\n * @param key the public key.\n *\n * @return the asn1 representation of a RSAPublicKey.\n */\npki.publicKeyToRSAPublicKey = function(key) {\n  // RSAPublicKey\n  return asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [\n    // modulus (n)\n    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.INTEGER, false,\n      _bnToBytes(key.n)),\n    // publicExponent (e)\n    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.INTEGER, false,\n      _bnToBytes(key.e))\n  ]);\n};\n\n/**\n * Encodes a message using PKCS#1 v1.5 padding.\n *\n * @param m the message to encode.\n * @param key the RSA key to use.\n * @param bt the block type to use, i.e. either 0x01 (for signing) or 0x02\n *          (for encryption).\n *\n * @return the padded byte buffer.\n */\nfunction _encodePkcs1_v1_5(m, key, bt) {\n  var eb = forge.util.createBuffer();\n\n  // get the length of the modulus in bytes\n  var k = Math.ceil(key.n.bitLength() / 8);\n\n  /* use PKCS#1 v1.5 padding */\n  if(m.length > (k - 11)) {\n    var error = new Error('Message is too long for PKCS#1 v1.5 padding.');\n    error.length = m.length;\n    error.max = k - 11;\n    throw error;\n  }\n\n  /* A block type BT, a padding string PS, and the data D shall be\n    formatted into an octet string EB, the encryption block:\n\n    EB = 00 || BT || PS || 00 || D\n\n    The block type BT shall be a single octet indicating the structure of\n    the encryption block. For this version of the document it shall have\n    value 00, 01, or 02. For a private-key operation, the block type\n    shall be 00 or 01. For a public-key operation, it shall be 02.\n\n    The padding string PS shall consist of k-3-||D|| octets. For block\n    type 00, the octets shall have value 00; for block type 01, they\n    shall have value FF; and for block type 02, they shall be\n    pseudorandomly generated and nonzero. This makes the length of the\n    encryption block EB equal to k. */\n\n  // build the encryption block\n  eb.putByte(0x00);\n  eb.putByte(bt);\n\n  // create the padding\n  var padNum = k - 3 - m.length;\n  var padByte;\n  // private key op\n  if(bt === 0x00 || bt === 0x01) {\n    padByte = (bt === 0x00) ? 0x00 : 0xFF;\n    for(var i = 0; i < padNum; ++i) {\n      eb.putByte(padByte);\n    }\n  } else {\n    // public key op\n    // pad with random non-zero values\n    while(padNum > 0) {\n      var numZeros = 0;\n      var padBytes = forge.random.getBytes(padNum);\n      for(var i = 0; i < padNum; ++i) {\n        padByte = padBytes.charCodeAt(i);\n        if(padByte === 0) {\n          ++numZeros;\n        } else {\n          eb.putByte(padByte);\n        }\n      }\n      padNum = numZeros;\n    }\n  }\n\n  // zero followed by message\n  eb.putByte(0x00);\n  eb.putBytes(m);\n\n  return eb;\n}\n\n/**\n * Decodes a message using PKCS#1 v1.5 padding.\n *\n * @param em the message to decode.\n * @param key the RSA key to use.\n * @param pub true if the key is a public key, false if it is private.\n * @param ml the message length, if specified.\n *\n * @return the decoded bytes.\n */\nfunction _decodePkcs1_v1_5(em, key, pub, ml) {\n  // get the length of the modulus in bytes\n  var k = Math.ceil(key.n.bitLength() / 8);\n\n  /* It is an error if any of the following conditions occurs:\n\n    1. The encryption block EB cannot be parsed unambiguously.\n    2. The padding string PS consists of fewer than eight octets\n      or is inconsisent with the block type BT.\n    3. The decryption process is a public-key operation and the block\n      type BT is not 00 or 01, or the decryption process is a\n      private-key operation and the block type is not 02.\n   */\n\n  // parse the encryption block\n  var eb = forge.util.createBuffer(em);\n  var first = eb.getByte();\n  var bt = eb.getByte();\n  if(first !== 0x00 ||\n    (pub && bt !== 0x00 && bt !== 0x01) ||\n    (!pub && bt != 0x02) ||\n    (pub && bt === 0x00 && typeof(ml) === 'undefined')) {\n    throw new Error('Encryption block is invalid.');\n  }\n\n  var padNum = 0;\n  if(bt === 0x00) {\n    // check all padding bytes for 0x00\n    padNum = k - 3 - ml;\n    for(var i = 0; i < padNum; ++i) {\n      if(eb.getByte() !== 0x00) {\n        throw new Error('Encryption block is invalid.');\n      }\n    }\n  } else if(bt === 0x01) {\n    // find the first byte that isn't 0xFF, should be after all padding\n    padNum = 0;\n    while(eb.length() > 1) {\n      if(eb.getByte() !== 0xFF) {\n        --eb.read;\n        break;\n      }\n      ++padNum;\n    }\n  } else if(bt === 0x02) {\n    // look for 0x00 byte\n    padNum = 0;\n    while(eb.length() > 1) {\n      if(eb.getByte() === 0x00) {\n        --eb.read;\n        break;\n      }\n      ++padNum;\n    }\n  }\n\n  // zero must be 0x00 and padNum must be (k - 3 - message length)\n  var zero = eb.getByte();\n  if(zero !== 0x00 || padNum !== (k - 3 - eb.length())) {\n    throw new Error('Encryption block is invalid.');\n  }\n\n  return eb.getBytes();\n}\n\n/**\n * Runs the key-generation algorithm asynchronously, either in the background\n * via Web Workers, or using the main thread and setImmediate.\n *\n * @param state the key-pair generation state.\n * @param [options] options for key-pair generation:\n *          workerScript the worker script URL.\n *          workers the number of web workers (if supported) to use,\n *            (default: 2, -1 to use estimated cores minus one).\n *          workLoad the size of the work load, ie: number of possible prime\n *            numbers for each web worker to check per work assignment,\n *            (default: 100).\n * @param callback(err, keypair) called once the operation completes.\n */\nfunction _generateKeyPair(state, options, callback) {\n  if(typeof options === 'function') {\n    callback = options;\n    options = {};\n  }\n  options = options || {};\n\n  var opts = {\n    algorithm: {\n      name: options.algorithm || 'PRIMEINC',\n      options: {\n        workers: options.workers || 2,\n        workLoad: options.workLoad || 100,\n        workerScript: options.workerScript\n      }\n    }\n  };\n  if('prng' in options) {\n    opts.prng = options.prng;\n  }\n\n  generate();\n\n  function generate() {\n    // find p and then q (done in series to simplify)\n    getPrime(state.pBits, function(err, num) {\n      if(err) {\n        return callback(err);\n      }\n      state.p = num;\n      if(state.q !== null) {\n        return finish(err, state.q);\n      }\n      getPrime(state.qBits, finish);\n    });\n  }\n\n  function getPrime(bits, callback) {\n    forge.prime.generateProbablePrime(bits, opts, callback);\n  }\n\n  function finish(err, num) {\n    if(err) {\n      return callback(err);\n    }\n\n    // set q\n    state.q = num;\n\n    // ensure p is larger than q (swap them if not)\n    if(state.p.compareTo(state.q) < 0) {\n      var tmp = state.p;\n      state.p = state.q;\n      state.q = tmp;\n    }\n\n    // ensure p is coprime with e\n    if(state.p.subtract(BigInteger.ONE).gcd(state.e)\n      .compareTo(BigInteger.ONE) !== 0) {\n      state.p = null;\n      generate();\n      return;\n    }\n\n    // ensure q is coprime with e\n    if(state.q.subtract(BigInteger.ONE).gcd(state.e)\n      .compareTo(BigInteger.ONE) !== 0) {\n      state.q = null;\n      getPrime(state.qBits, finish);\n      return;\n    }\n\n    // compute phi: (p - 1)(q - 1) (Euler's totient function)\n    state.p1 = state.p.subtract(BigInteger.ONE);\n    state.q1 = state.q.subtract(BigInteger.ONE);\n    state.phi = state.p1.multiply(state.q1);\n\n    // ensure e and phi are coprime\n    if(state.phi.gcd(state.e).compareTo(BigInteger.ONE) !== 0) {\n      // phi and e aren't coprime, so generate a new p and q\n      state.p = state.q = null;\n      generate();\n      return;\n    }\n\n    // create n, ensure n is has the right number of bits\n    state.n = state.p.multiply(state.q);\n    if(state.n.bitLength() !== state.bits) {\n      // failed, get new q\n      state.q = null;\n      getPrime(state.qBits, finish);\n      return;\n    }\n\n    // set keys\n    var d = state.e.modInverse(state.phi);\n    state.keys = {\n      privateKey: pki.rsa.setPrivateKey(\n        state.n, state.e, d, state.p, state.q,\n        d.mod(state.p1), d.mod(state.q1),\n        state.q.modInverse(state.p)),\n      publicKey: pki.rsa.setPublicKey(state.n, state.e)\n    };\n\n    callback(null, state.keys);\n  }\n}\n\n/**\n * Converts a positive BigInteger into 2's-complement big-endian bytes.\n *\n * @param b the big integer to convert.\n *\n * @return the bytes.\n */\nfunction _bnToBytes(b) {\n  // prepend 0x00 if first byte >= 0x80\n  var hex = b.toString(16);\n  if(hex[0] >= '8') {\n    hex = '00' + hex;\n  }\n  var bytes = forge.util.hexToBytes(hex);\n\n  // ensure integer is minimally-encoded\n  if(bytes.length > 1 &&\n    // leading 0x00 for positive integer\n    ((bytes.charCodeAt(0) === 0 &&\n    (bytes.charCodeAt(1) & 0x80) === 0) ||\n    // leading 0xFF for negative integer\n    (bytes.charCodeAt(0) === 0xFF &&\n    (bytes.charCodeAt(1) & 0x80) === 0x80))) {\n    return bytes.substr(1);\n  }\n  return bytes;\n}\n\n/**\n * Returns the required number of Miller-Rabin tests to generate a\n * prime with an error probability of (1/2)^80.\n *\n * See Handbook of Applied Cryptography Chapter 4, Table 4.4.\n *\n * @param bits the bit size.\n *\n * @return the required number of iterations.\n */\nfunction _getMillerRabinTests(bits) {\n  if(bits <= 100) return 27;\n  if(bits <= 150) return 18;\n  if(bits <= 200) return 15;\n  if(bits <= 250) return 12;\n  if(bits <= 300) return 9;\n  if(bits <= 350) return 8;\n  if(bits <= 400) return 7;\n  if(bits <= 500) return 6;\n  if(bits <= 600) return 5;\n  if(bits <= 800) return 4;\n  if(bits <= 1250) return 3;\n  return 2;\n}\n\n/**\n * Performs feature detection on the Node crypto interface.\n *\n * @param fn the feature (function) to detect.\n *\n * @return true if detected, false if not.\n */\nfunction _detectNodeCrypto(fn) {\n  return forge.util.isNodejs && typeof _crypto[fn] === 'function';\n}\n\n/**\n * Performs feature detection on the SubtleCrypto interface.\n *\n * @param fn the feature (function) to detect.\n *\n * @return true if detected, false if not.\n */\nfunction _detectSubtleCrypto(fn) {\n  return (typeof util.globalScope !== 'undefined' &&\n    typeof util.globalScope.crypto === 'object' &&\n    typeof util.globalScope.crypto.subtle === 'object' &&\n    typeof util.globalScope.crypto.subtle[fn] === 'function');\n}\n\n/**\n * Performs feature detection on the deprecated Microsoft Internet Explorer\n * outdated SubtleCrypto interface. This function should only be used after\n * checking for the modern, standard SubtleCrypto interface.\n *\n * @param fn the feature (function) to detect.\n *\n * @return true if detected, false if not.\n */\nfunction _detectSubtleMsCrypto(fn) {\n  return (typeof util.globalScope !== 'undefined' &&\n    typeof util.globalScope.msCrypto === 'object' &&\n    typeof util.globalScope.msCrypto.subtle === 'object' &&\n    typeof util.globalScope.msCrypto.subtle[fn] === 'function');\n}\n\nfunction _intToUint8Array(x) {\n  var bytes = forge.util.hexToBytes(x.toString(16));\n  var buffer = new Uint8Array(bytes.length);\n  for(var i = 0; i < bytes.length; ++i) {\n    buffer[i] = bytes.charCodeAt(i);\n  }\n  return buffer;\n}\n\nfunction _privateKeyFromJwk(jwk) {\n  if(jwk.kty !== 'RSA') {\n    throw new Error(\n      'Unsupported key algorithm \"' + jwk.kty + '\"; algorithm must be \"RSA\".');\n  }\n  return pki.setRsaPrivateKey(\n    _base64ToBigInt(jwk.n),\n    _base64ToBigInt(jwk.e),\n    _base64ToBigInt(jwk.d),\n    _base64ToBigInt(jwk.p),\n    _base64ToBigInt(jwk.q),\n    _base64ToBigInt(jwk.dp),\n    _base64ToBigInt(jwk.dq),\n    _base64ToBigInt(jwk.qi));\n}\n\nfunction _publicKeyFromJwk(jwk) {\n  if(jwk.kty !== 'RSA') {\n    throw new Error('Key algorithm must be \"RSA\".');\n  }\n  return pki.setRsaPublicKey(\n    _base64ToBigInt(jwk.n),\n    _base64ToBigInt(jwk.e));\n}\n\nfunction _base64ToBigInt(b64) {\n  return new BigInteger(forge.util.bytesToHex(forge.util.decode64(b64)), 16);\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDIuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbm9kZS1mb3JnZS9saWIvcnNhLmpzP2E4NDIiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBKYXZhc2NyaXB0IGltcGxlbWVudGF0aW9uIG9mIGJhc2ljIFJTQSBhbGdvcml0aG1zLlxuICpcbiAqIEBhdXRob3IgRGF2ZSBMb25nbGV5XG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTQgRGlnaXRhbCBCYXphYXIsIEluYy5cbiAqXG4gKiBUaGUgb25seSBhbGdvcml0aG0gY3VycmVudGx5IHN1cHBvcnRlZCBmb3IgUEtJIGlzIFJTQS5cbiAqXG4gKiBBbiBSU0Ega2V5IGlzIG9mdGVuIHN0b3JlZCBpbiBBU04uMSBERVIgZm9ybWF0LiBUaGUgU3ViamVjdFB1YmxpY0tleUluZm9cbiAqIEFTTi4xIHN0cnVjdHVyZSBpcyBjb21wb3NlZCBvZiBhbiBhbGdvcml0aG0gb2YgdHlwZSBBbGdvcml0aG1JZGVudGlmaWVyXG4gKiBhbmQgYSBzdWJqZWN0UHVibGljS2V5IG9mIHR5cGUgYml0IHN0cmluZy5cbiAqXG4gKiBUaGUgQWxnb3JpdGhtSWRlbnRpZmllciBjb250YWlucyBhbiBPYmplY3QgSWRlbnRpZmllciAoT0lEKSBhbmQgcGFyYW1ldGVyc1xuICogZm9yIHRoZSBhbGdvcml0aG0sIGlmIGFueS4gSW4gdGhlIGNhc2Ugb2YgUlNBLCB0aGVyZSBhcmVuJ3QgYW55LlxuICpcbiAqIFN1YmplY3RQdWJsaWNLZXlJbmZvIDo6PSBTRVFVRU5DRSB7XG4gKiAgIGFsZ29yaXRobSBBbGdvcml0aG1JZGVudGlmaWVyLFxuICogICBzdWJqZWN0UHVibGljS2V5IEJJVCBTVFJJTkdcbiAqIH1cbiAqXG4gKiBBbGdvcml0aG1JZGVudGlmZXIgOjo9IFNFUVVFTkNFIHtcbiAqICAgYWxnb3JpdGhtIE9CSkVDVCBJREVOVElGSUVSLFxuICogICBwYXJhbWV0ZXJzIEFOWSBERUZJTkVEIEJZIGFsZ29yaXRobSBPUFRJT05BTFxuICogfVxuICpcbiAqIEZvciBhbiBSU0EgcHVibGljIGtleSwgdGhlIHN1YmplY3RQdWJsaWNLZXkgaXM6XG4gKlxuICogUlNBUHVibGljS2V5IDo6PSBTRVFVRU5DRSB7XG4gKiAgIG1vZHVsdXMgICAgICAgICAgICBJTlRFR0VSLCAgICAtLSBuXG4gKiAgIHB1YmxpY0V4cG9uZW50ICAgICBJTlRFR0VSICAgICAtLSBlXG4gKiB9XG4gKlxuICogUHJpdmF0ZUtleUluZm8gOjo9IFNFUVVFTkNFIHtcbiAqICAgdmVyc2lvbiAgICAgICAgICAgICAgICAgICBWZXJzaW9uLFxuICogICBwcml2YXRlS2V5QWxnb3JpdGhtICAgICAgIFByaXZhdGVLZXlBbGdvcml0aG1JZGVudGlmaWVyLFxuICogICBwcml2YXRlS2V5ICAgICAgICAgICAgICAgIFByaXZhdGVLZXksXG4gKiAgIGF0dHJpYnV0ZXMgICAgICAgICAgIFswXSAgSU1QTElDSVQgQXR0cmlidXRlcyBPUFRJT05BTFxuICogfVxuICpcbiAqIFZlcnNpb24gOjo9IElOVEVHRVJcbiAqIFByaXZhdGVLZXlBbGdvcml0aG1JZGVudGlmaWVyIDo6PSBBbGdvcml0aG1JZGVudGlmaWVyXG4gKiBQcml2YXRlS2V5IDo6PSBPQ1RFVCBTVFJJTkdcbiAqIEF0dHJpYnV0ZXMgOjo9IFNFVCBPRiBBdHRyaWJ1dGVcbiAqXG4gKiBBbiBSU0EgcHJpdmF0ZSBrZXkgYXMgdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmU6XG4gKlxuICogUlNBUHJpdmF0ZUtleSA6Oj0gU0VRVUVOQ0Uge1xuICogICB2ZXJzaW9uIFZlcnNpb24sXG4gKiAgIG1vZHVsdXMgSU5URUdFUiwgLS0gblxuICogICBwdWJsaWNFeHBvbmVudCBJTlRFR0VSLCAtLSBlXG4gKiAgIHByaXZhdGVFeHBvbmVudCBJTlRFR0VSLCAtLSBkXG4gKiAgIHByaW1lMSBJTlRFR0VSLCAtLSBwXG4gKiAgIHByaW1lMiBJTlRFR0VSLCAtLSBxXG4gKiAgIGV4cG9uZW50MSBJTlRFR0VSLCAtLSBkIG1vZCAocC0xKVxuICogICBleHBvbmVudDIgSU5URUdFUiwgLS0gZCBtb2QgKHEtMSlcbiAqICAgY29lZmZpY2llbnQgSU5URUdFUiAtLSAoaW52ZXJzZSBvZiBxKSBtb2QgcFxuICogfVxuICpcbiAqIFZlcnNpb24gOjo9IElOVEVHRVJcbiAqXG4gKiBUaGUgT0lEIGZvciB0aGUgUlNBIGtleSBhbGdvcml0aG0gaXM6IDEuMi44NDAuMTEzNTQ5LjEuMS4xXG4gKi9cbnZhciBmb3JnZSA9IHJlcXVpcmUoJy4vZm9yZ2UnKTtcbnJlcXVpcmUoJy4vYXNuMScpO1xucmVxdWlyZSgnLi9qc2JuJyk7XG5yZXF1aXJlKCcuL29pZHMnKTtcbnJlcXVpcmUoJy4vcGtjczEnKTtcbnJlcXVpcmUoJy4vcHJpbWUnKTtcbnJlcXVpcmUoJy4vcmFuZG9tJyk7XG5yZXF1aXJlKCcuL3V0aWwnKTtcblxuaWYodHlwZW9mIEJpZ0ludGVnZXIgPT09ICd1bmRlZmluZWQnKSB7XG4gIHZhciBCaWdJbnRlZ2VyID0gZm9yZ2UuanNibi5CaWdJbnRlZ2VyO1xufVxuXG52YXIgX2NyeXB0byA9IGZvcmdlLnV0aWwuaXNOb2RlanMgPyByZXF1aXJlKCdjcnlwdG8nKSA6IG51bGw7XG5cbi8vIHNob3J0Y3V0IGZvciBhc24uMSBBUElcbnZhciBhc24xID0gZm9yZ2UuYXNuMTtcblxuLy8gc2hvcnRjdXQgZm9yIHV0aWwgQVBJXG52YXIgdXRpbCA9IGZvcmdlLnV0aWw7XG5cbi8qXG4gKiBSU0EgZW5jcnlwdGlvbiBhbmQgZGVjcnlwdGlvbiwgc2VlIFJGQyAyMzEzLlxuICovXG5mb3JnZS5wa2kgPSBmb3JnZS5wa2kgfHwge307XG5tb2R1bGUuZXhwb3J0cyA9IGZvcmdlLnBraS5yc2EgPSBmb3JnZS5yc2EgPSBmb3JnZS5yc2EgfHwge307XG52YXIgcGtpID0gZm9yZ2UucGtpO1xuXG4vLyBmb3IgZmluZGluZyBwcmltZXMsIHdoaWNoIGFyZSAzMGsraSBmb3IgaSA9IDEsIDcsIDExLCAxMywgMTcsIDE5LCAyMywgMjlcbnZhciBHQ0RfMzBfREVMVEEgPSBbNiwgNCwgMiwgNCwgMiwgNCwgNiwgMl07XG5cbi8vIHZhbGlkYXRvciBmb3IgYSBQcml2YXRlS2V5SW5mbyBzdHJ1Y3R1cmVcbnZhciBwcml2YXRlS2V5VmFsaWRhdG9yID0ge1xuICAvLyBQcml2YXRlS2V5SW5mb1xuICBuYW1lOiAnUHJpdmF0ZUtleUluZm8nLFxuICB0YWdDbGFzczogYXNuMS5DbGFzcy5VTklWRVJTQUwsXG4gIHR5cGU6IGFzbjEuVHlwZS5TRVFVRU5DRSxcbiAgY29uc3RydWN0ZWQ6IHRydWUsXG4gIHZhbHVlOiBbe1xuICAgIC8vIFZlcnNpb24gKElOVEVHRVIpXG4gICAgbmFtZTogJ1ByaXZhdGVLZXlJbmZvLnZlcnNpb24nLFxuICAgIHRhZ0NsYXNzOiBhc24xLkNsYXNzLlVOSVZFUlNBTCxcbiAgICB0eXBlOiBhc24xLlR5cGUuSU5URUdFUixcbiAgICBjb25zdHJ1Y3RlZDogZmFsc2UsXG4gICAgY2FwdHVyZTogJ3ByaXZhdGVLZXlWZXJzaW9uJ1xuICB9LCB7XG4gICAgLy8gcHJpdmF0ZUtleUFsZ29yaXRobVxuICAgIG5hbWU6ICdQcml2YXRlS2V5SW5mby5wcml2YXRlS2V5QWxnb3JpdGhtJyxcbiAgICB0YWdDbGFzczogYXNuMS5DbGFzcy5VTklWRVJTQUwsXG4gICAgdHlwZTogYXNuMS5UeXBlLlNFUVVFTkNFLFxuICAgIGNvbnN0cnVjdGVkOiB0cnVlLFxuICAgIHZhbHVlOiBbe1xuICAgICAgbmFtZTogJ0FsZ29yaXRobUlkZW50aWZpZXIuYWxnb3JpdGhtJyxcbiAgICAgIHRhZ0NsYXNzOiBhc24xLkNsYXNzLlVOSVZFUlNBTCxcbiAgICAgIHR5cGU6IGFzbjEuVHlwZS5PSUQsXG4gICAgICBjb25zdHJ1Y3RlZDogZmFsc2UsXG4gICAgICBjYXB0dXJlOiAncHJpdmF0ZUtleU9pZCdcbiAgICB9XVxuICB9LCB7XG4gICAgLy8gUHJpdmF0ZUtleVxuICAgIG5hbWU6ICdQcml2YXRlS2V5SW5mbycsXG4gICAgdGFnQ2xhc3M6IGFzbjEuQ2xhc3MuVU5JVkVSU0FMLFxuICAgIHR5cGU6IGFzbjEuVHlwZS5PQ1RFVFNUUklORyxcbiAgICBjb25zdHJ1Y3RlZDogZmFsc2UsXG4gICAgY2FwdHVyZTogJ3ByaXZhdGVLZXknXG4gIH1dXG59O1xuXG4vLyB2YWxpZGF0b3IgZm9yIGFuIFJTQSBwcml2YXRlIGtleVxudmFyIHJzYVByaXZhdGVLZXlWYWxpZGF0b3IgPSB7XG4gIC8vIFJTQVByaXZhdGVLZXlcbiAgbmFtZTogJ1JTQVByaXZhdGVLZXknLFxuICB0YWdDbGFzczogYXNuMS5DbGFzcy5VTklWRVJTQUwsXG4gIHR5cGU6IGFzbjEuVHlwZS5TRVFVRU5DRSxcbiAgY29uc3RydWN0ZWQ6IHRydWUsXG4gIHZhbHVlOiBbe1xuICAgIC8vIFZlcnNpb24gKElOVEVHRVIpXG4gICAgbmFtZTogJ1JTQVByaXZhdGVLZXkudmVyc2lvbicsXG4gICAgdGFnQ2xhc3M6IGFzbjEuQ2xhc3MuVU5JVkVSU0FMLFxuICAgIHR5cGU6IGFzbjEuVHlwZS5JTlRFR0VSLFxuICAgIGNvbnN0cnVjdGVkOiBmYWxzZSxcbiAgICBjYXB0dXJlOiAncHJpdmF0ZUtleVZlcnNpb24nXG4gIH0sIHtcbiAgICAvLyBtb2R1bHVzIChuKVxuICAgIG5hbWU6ICdSU0FQcml2YXRlS2V5Lm1vZHVsdXMnLFxuICAgIHRhZ0NsYXNzOiBhc24xLkNsYXNzLlVOSVZFUlNBTCxcbiAgICB0eXBlOiBhc24xLlR5cGUuSU5URUdFUixcbiAgICBjb25zdHJ1Y3RlZDogZmFsc2UsXG4gICAgY2FwdHVyZTogJ3ByaXZhdGVLZXlNb2R1bHVzJ1xuICB9LCB7XG4gICAgLy8gcHVibGljRXhwb25lbnQgKGUpXG4gICAgbmFtZTogJ1JTQVByaXZhdGVLZXkucHVibGljRXhwb25lbnQnLFxuICAgIHRhZ0NsYXNzOiBhc24xLkNsYXNzLlVOSVZFUlNBTCxcbiAgICB0eXBlOiBhc24xLlR5cGUuSU5URUdFUixcbiAgICBjb25zdHJ1Y3RlZDogZmFsc2UsXG4gICAgY2FwdHVyZTogJ3ByaXZhdGVLZXlQdWJsaWNFeHBvbmVudCdcbiAgfSwge1xuICAgIC8vIHByaXZhdGVFeHBvbmVudCAoZClcbiAgICBuYW1lOiAnUlNBUHJpdmF0ZUtleS5wcml2YXRlRXhwb25lbnQnLFxuICAgIHRhZ0NsYXNzOiBhc24xLkNsYXNzLlVOSVZFUlNBTCxcbiAgICB0eXBlOiBhc24xLlR5cGUuSU5URUdFUixcbiAgICBjb25zdHJ1Y3RlZDogZmFsc2UsXG4gICAgY2FwdHVyZTogJ3ByaXZhdGVLZXlQcml2YXRlRXhwb25lbnQnXG4gIH0sIHtcbiAgICAvLyBwcmltZTEgKHApXG4gICAgbmFtZTogJ1JTQVByaXZhdGVLZXkucHJpbWUxJyxcbiAgICB0YWdDbGFzczogYXNuMS5DbGFzcy5VTklWRVJTQUwsXG4gICAgdHlwZTogYXNuMS5UeXBlLklOVEVHRVIsXG4gICAgY29uc3RydWN0ZWQ6IGZhbHNlLFxuICAgIGNhcHR1cmU6ICdwcml2YXRlS2V5UHJpbWUxJ1xuICB9LCB7XG4gICAgLy8gcHJpbWUyIChxKVxuICAgIG5hbWU6ICdSU0FQcml2YXRlS2V5LnByaW1lMicsXG4gICAgdGFnQ2xhc3M6IGFzbjEuQ2xhc3MuVU5JVkVSU0FMLFxuICAgIHR5cGU6IGFzbjEuVHlwZS5JTlRFR0VSLFxuICAgIGNvbnN0cnVjdGVkOiBmYWxzZSxcbiAgICBjYXB0dXJlOiAncHJpdmF0ZUtleVByaW1lMidcbiAgfSwge1xuICAgIC8vIGV4cG9uZW50MSAoZCBtb2QgKHAtMSkpXG4gICAgbmFtZTogJ1JTQVByaXZhdGVLZXkuZXhwb25lbnQxJyxcbiAgICB0YWdDbGFzczogYXNuMS5DbGFzcy5VTklWRVJTQUwsXG4gICAgdHlwZTogYXNuMS5UeXBlLklOVEVHRVIsXG4gICAgY29uc3RydWN0ZWQ6IGZhbHNlLFxuICAgIGNhcHR1cmU6ICdwcml2YXRlS2V5RXhwb25lbnQxJ1xuICB9LCB7XG4gICAgLy8gZXhwb25lbnQyIChkIG1vZCAocS0xKSlcbiAgICBuYW1lOiAnUlNBUHJpdmF0ZUtleS5leHBvbmVudDInLFxuICAgIHRhZ0NsYXNzOiBhc24xLkNsYXNzLlVOSVZFUlNBTCxcbiAgICB0eXBlOiBhc24xLlR5cGUuSU5URUdFUixcbiAgICBjb25zdHJ1Y3RlZDogZmFsc2UsXG4gICAgY2FwdHVyZTogJ3ByaXZhdGVLZXlFeHBvbmVudDInXG4gIH0sIHtcbiAgICAvLyBjb2VmZmljaWVudCAoKGludmVyc2Ugb2YgcSkgbW9kIHApXG4gICAgbmFtZTogJ1JTQVByaXZhdGVLZXkuY29lZmZpY2llbnQnLFxuICAgIHRhZ0NsYXNzOiBhc24xLkNsYXNzLlVOSVZFUlNBTCxcbiAgICB0eXBlOiBhc24xLlR5cGUuSU5URUdFUixcbiAgICBjb25zdHJ1Y3RlZDogZmFsc2UsXG4gICAgY2FwdHVyZTogJ3ByaXZhdGVLZXlDb2VmZmljaWVudCdcbiAgfV1cbn07XG5cbi8vIHZhbGlkYXRvciBmb3IgYW4gUlNBIHB1YmxpYyBrZXlcbnZhciByc2FQdWJsaWNLZXlWYWxpZGF0b3IgPSB7XG4gIC8vIFJTQVB1YmxpY0tleVxuICBuYW1lOiAnUlNBUHVibGljS2V5JyxcbiAgdGFnQ2xhc3M6IGFzbjEuQ2xhc3MuVU5JVkVSU0FMLFxuICB0eXBlOiBhc24xLlR5cGUuU0VRVUVOQ0UsXG4gIGNvbnN0cnVjdGVkOiB0cnVlLFxuICB2YWx1ZTogW3tcbiAgICAvLyBtb2R1bHVzIChuKVxuICAgIG5hbWU6ICdSU0FQdWJsaWNLZXkubW9kdWx1cycsXG4gICAgdGFnQ2xhc3M6IGFzbjEuQ2xhc3MuVU5JVkVSU0FMLFxuICAgIHR5cGU6IGFzbjEuVHlwZS5JTlRFR0VSLFxuICAgIGNvbnN0cnVjdGVkOiBmYWxzZSxcbiAgICBjYXB0dXJlOiAncHVibGljS2V5TW9kdWx1cydcbiAgfSwge1xuICAgIC8vIHB1YmxpY0V4cG9uZW50IChlKVxuICAgIG5hbWU6ICdSU0FQdWJsaWNLZXkuZXhwb25lbnQnLFxuICAgIHRhZ0NsYXNzOiBhc24xLkNsYXNzLlVOSVZFUlNBTCxcbiAgICB0eXBlOiBhc24xLlR5cGUuSU5URUdFUixcbiAgICBjb25zdHJ1Y3RlZDogZmFsc2UsXG4gICAgY2FwdHVyZTogJ3B1YmxpY0tleUV4cG9uZW50J1xuICB9XVxufTtcblxuLy8gdmFsaWRhdG9yIGZvciBhbiBTdWJqZWN0UHVibGljS2V5SW5mbyBzdHJ1Y3R1cmVcbi8vIE5vdGU6IEN1cnJlbnRseSBvbmx5IHdvcmtzIHdpdGggYW4gUlNBIHB1YmxpYyBrZXlcbnZhciBwdWJsaWNLZXlWYWxpZGF0b3IgPSBmb3JnZS5wa2kucnNhLnB1YmxpY0tleVZhbGlkYXRvciA9IHtcbiAgbmFtZTogJ1N1YmplY3RQdWJsaWNLZXlJbmZvJyxcbiAgdGFnQ2xhc3M6IGFzbjEuQ2xhc3MuVU5JVkVSU0FMLFxuICB0eXBlOiBhc24xLlR5cGUuU0VRVUVOQ0UsXG4gIGNvbnN0cnVjdGVkOiB0cnVlLFxuICBjYXB0dXJlQXNuMTogJ3N1YmplY3RQdWJsaWNLZXlJbmZvJyxcbiAgdmFsdWU6IFt7XG4gICAgbmFtZTogJ1N1YmplY3RQdWJsaWNLZXlJbmZvLkFsZ29yaXRobUlkZW50aWZpZXInLFxuICAgIHRhZ0NsYXNzOiBhc24xLkNsYXNzLlVOSVZFUlNBTCxcbiAgICB0eXBlOiBhc24xLlR5cGUuU0VRVUVOQ0UsXG4gICAgY29uc3RydWN0ZWQ6IHRydWUsXG4gICAgdmFsdWU6IFt7XG4gICAgICBuYW1lOiAnQWxnb3JpdGhtSWRlbnRpZmllci5hbGdvcml0aG0nLFxuICAgICAgdGFnQ2xhc3M6IGFzbjEuQ2xhc3MuVU5JVkVSU0FMLFxuICAgICAgdHlwZTogYXNuMS5UeXBlLk9JRCxcbiAgICAgIGNvbnN0cnVjdGVkOiBmYWxzZSxcbiAgICAgIGNhcHR1cmU6ICdwdWJsaWNLZXlPaWQnXG4gICAgfV1cbiAgfSwge1xuICAgIC8vIHN1YmplY3RQdWJsaWNLZXlcbiAgICBuYW1lOiAnU3ViamVjdFB1YmxpY0tleUluZm8uc3ViamVjdFB1YmxpY0tleScsXG4gICAgdGFnQ2xhc3M6IGFzbjEuQ2xhc3MuVU5JVkVSU0FMLFxuICAgIHR5cGU6IGFzbjEuVHlwZS5CSVRTVFJJTkcsXG4gICAgY29uc3RydWN0ZWQ6IGZhbHNlLFxuICAgIHZhbHVlOiBbe1xuICAgICAgLy8gUlNBUHVibGljS2V5XG4gICAgICBuYW1lOiAnU3ViamVjdFB1YmxpY0tleUluZm8uc3ViamVjdFB1YmxpY0tleS5SU0FQdWJsaWNLZXknLFxuICAgICAgdGFnQ2xhc3M6IGFzbjEuQ2xhc3MuVU5JVkVSU0FMLFxuICAgICAgdHlwZTogYXNuMS5UeXBlLlNFUVVFTkNFLFxuICAgICAgY29uc3RydWN0ZWQ6IHRydWUsXG4gICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICAgIGNhcHR1cmVBc24xOiAncnNhUHVibGljS2V5J1xuICAgIH1dXG4gIH1dXG59O1xuXG4vLyB2YWxpZGF0b3IgZm9yIGEgRGlnZXN0SW5mbyBzdHJ1Y3R1cmVcbnZhciBkaWdlc3RJbmZvVmFsaWRhdG9yID0ge1xuICBuYW1lOiAnRGlnZXN0SW5mbycsXG4gIHRhZ0NsYXNzOiBhc24xLkNsYXNzLlVOSVZFUlNBTCxcbiAgdHlwZTogYXNuMS5UeXBlLlNFUVVFTkNFLFxuICBjb25zdHJ1Y3RlZDogdHJ1ZSxcbiAgdmFsdWU6IFt7XG4gICAgbmFtZTogJ0RpZ2VzdEluZm8uRGlnZXN0QWxnb3JpdGhtJyxcbiAgICB0YWdDbGFzczogYXNuMS5DbGFzcy5VTklWRVJTQUwsXG4gICAgdHlwZTogYXNuMS5UeXBlLlNFUVVFTkNFLFxuICAgIGNvbnN0cnVjdGVkOiB0cnVlLFxuICAgIHZhbHVlOiBbe1xuICAgICAgbmFtZTogJ0RpZ2VzdEluZm8uRGlnZXN0QWxnb3JpdGhtLmFsZ29yaXRobUlkZW50aWZpZXInLFxuICAgICAgdGFnQ2xhc3M6IGFzbjEuQ2xhc3MuVU5JVkVSU0FMLFxuICAgICAgdHlwZTogYXNuMS5UeXBlLk9JRCxcbiAgICAgIGNvbnN0cnVjdGVkOiBmYWxzZSxcbiAgICAgIGNhcHR1cmU6ICdhbGdvcml0aG1JZGVudGlmaWVyJ1xuICAgIH0sIHtcbiAgICAgIC8vIE5VTEwgcGFyYW10ZXJzXG4gICAgICBuYW1lOiAnRGlnZXN0SW5mby5EaWdlc3RBbGdvcml0aG0ucGFyYW1ldGVycycsXG4gICAgICB0YWdDbGFzczogYXNuMS5DbGFzcy5VTklWRVJTQUwsXG4gICAgICB0eXBlOiBhc24xLlR5cGUuTlVMTCxcbiAgICAgIC8vIGNhcHR1cmVkIG9ubHkgdG8gY2hlY2sgZXhpc3RlbmNlIGZvciBtZDIgYW5kIG1kNVxuICAgICAgY2FwdHVyZTogJ3BhcmFtZXRlcnMnLFxuICAgICAgb3B0aW9uYWw6IHRydWUsXG4gICAgICBjb25zdHJ1Y3RlZDogZmFsc2VcbiAgICB9XVxuICB9LCB7XG4gICAgLy8gZGlnZXN0XG4gICAgbmFtZTogJ0RpZ2VzdEluZm8uZGlnZXN0JyxcbiAgICB0YWdDbGFzczogYXNuMS5DbGFzcy5VTklWRVJTQUwsXG4gICAgdHlwZTogYXNuMS5UeXBlLk9DVEVUU1RSSU5HLFxuICAgIGNvbnN0cnVjdGVkOiBmYWxzZSxcbiAgICBjYXB0dXJlOiAnZGlnZXN0J1xuICB9XVxufTtcblxuLyoqXG4gKiBXcmFwIGRpZ2VzdCBpbiBEaWdlc3RJbmZvIG9iamVjdC5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIGltcGxlbWVudHMgRU1TQS1QS0NTMS12MV81LUVOQ09ERSBhcyBwZXIgUkZDIDM0NDcuXG4gKlxuICogRGlnZXN0SW5mbyA6Oj0gU0VRVUVOQ0Uge1xuICogICBkaWdlc3RBbGdvcml0aG0gRGlnZXN0QWxnb3JpdGhtSWRlbnRpZmllcixcbiAqICAgZGlnZXN0IERpZ2VzdFxuICogfVxuICpcbiAqIERpZ2VzdEFsZ29yaXRobUlkZW50aWZpZXIgOjo9IEFsZ29yaXRobUlkZW50aWZpZXJcbiAqIERpZ2VzdCA6Oj0gT0NURVQgU1RSSU5HXG4gKlxuICogQHBhcmFtIG1kIHRoZSBtZXNzYWdlIGRpZ2VzdCBvYmplY3Qgd2l0aCB0aGUgaGFzaCB0byBzaWduLlxuICpcbiAqIEByZXR1cm4gdGhlIGVuY29kZWQgbWVzc2FnZSAocmVhZHkgZm9yIFJTQSBlbmNyeXRpb24pXG4gKi9cbnZhciBlbXNhUGtjczF2MTVlbmNvZGUgPSBmdW5jdGlvbihtZCkge1xuICAvLyBnZXQgdGhlIG9pZCBmb3IgdGhlIGFsZ29yaXRobVxuICB2YXIgb2lkO1xuICBpZihtZC5hbGdvcml0aG0gaW4gcGtpLm9pZHMpIHtcbiAgICBvaWQgPSBwa2kub2lkc1ttZC5hbGdvcml0aG1dO1xuICB9IGVsc2Uge1xuICAgIHZhciBlcnJvciA9IG5ldyBFcnJvcignVW5rbm93biBtZXNzYWdlIGRpZ2VzdCBhbGdvcml0aG0uJyk7XG4gICAgZXJyb3IuYWxnb3JpdGhtID0gbWQuYWxnb3JpdGhtO1xuICAgIHRocm93IGVycm9yO1xuICB9XG4gIHZhciBvaWRCeXRlcyA9IGFzbjEub2lkVG9EZXIob2lkKS5nZXRCeXRlcygpO1xuXG4gIC8vIGNyZWF0ZSB0aGUgZGlnZXN0IGluZm9cbiAgdmFyIGRpZ2VzdEluZm8gPSBhc24xLmNyZWF0ZShcbiAgICBhc24xLkNsYXNzLlVOSVZFUlNBTCwgYXNuMS5UeXBlLlNFUVVFTkNFLCB0cnVlLCBbXSk7XG4gIHZhciBkaWdlc3RBbGdvcml0aG0gPSBhc24xLmNyZWF0ZShcbiAgICBhc24xLkNsYXNzLlVOSVZFUlNBTCwgYXNuMS5UeXBlLlNFUVVFTkNFLCB0cnVlLCBbXSk7XG4gIGRpZ2VzdEFsZ29yaXRobS52YWx1ZS5wdXNoKGFzbjEuY3JlYXRlKFxuICAgIGFzbjEuQ2xhc3MuVU5JVkVSU0FMLCBhc24xLlR5cGUuT0lELCBmYWxzZSwgb2lkQnl0ZXMpKTtcbiAgZGlnZXN0QWxnb3JpdGhtLnZhbHVlLnB1c2goYXNuMS5jcmVhdGUoXG4gICAgYXNuMS5DbGFzcy5VTklWRVJTQUwsIGFzbjEuVHlwZS5OVUxMLCBmYWxzZSwgJycpKTtcbiAgdmFyIGRpZ2VzdCA9IGFzbjEuY3JlYXRlKFxuICAgIGFzbjEuQ2xhc3MuVU5JVkVSU0FMLCBhc24xLlR5cGUuT0NURVRTVFJJTkcsXG4gICAgZmFsc2UsIG1kLmRpZ2VzdCgpLmdldEJ5dGVzKCkpO1xuICBkaWdlc3RJbmZvLnZhbHVlLnB1c2goZGlnZXN0QWxnb3JpdGhtKTtcbiAgZGlnZXN0SW5mby52YWx1ZS5wdXNoKGRpZ2VzdCk7XG5cbiAgLy8gZW5jb2RlIGRpZ2VzdCBpbmZvXG4gIHJldHVybiBhc24xLnRvRGVyKGRpZ2VzdEluZm8pLmdldEJ5dGVzKCk7XG59O1xuXG4vKipcbiAqIFBlcmZvcm1zIHheYyBtb2QgbiAoUlNBIGVuY3J5cHRpb24gb3IgZGVjcnlwdGlvbiBvcGVyYXRpb24pLlxuICpcbiAqIEBwYXJhbSB4IHRoZSBudW1iZXIgdG8gcmFpc2UgYW5kIG1vZC5cbiAqIEBwYXJhbSBrZXkgdGhlIGtleSB0byB1c2UuXG4gKiBAcGFyYW0gcHViIHRydWUgaWYgdGhlIGtleSBpcyBwdWJsaWMsIGZhbHNlIGlmIHByaXZhdGUuXG4gKlxuICogQHJldHVybiB0aGUgcmVzdWx0IG9mIHheYyBtb2Qgbi5cbiAqL1xudmFyIF9tb2RQb3cgPSBmdW5jdGlvbih4LCBrZXksIHB1Yikge1xuICBpZihwdWIpIHtcbiAgICByZXR1cm4geC5tb2RQb3coa2V5LmUsIGtleS5uKTtcbiAgfVxuXG4gIGlmKCFrZXkucCB8fCAha2V5LnEpIHtcbiAgICAvLyBhbGxvdyBjYWxjdWxhdGlvbiB3aXRob3V0IENSVCBwYXJhbXMgKHNsb3cpXG4gICAgcmV0dXJuIHgubW9kUG93KGtleS5kLCBrZXkubik7XG4gIH1cblxuICAvLyBwcmUtY29tcHV0ZSBkUCwgZFEsIGFuZCBxSW52IGlmIG5lY2Vzc2FyeVxuICBpZigha2V5LmRQKSB7XG4gICAga2V5LmRQID0ga2V5LmQubW9kKGtleS5wLnN1YnRyYWN0KEJpZ0ludGVnZXIuT05FKSk7XG4gIH1cbiAgaWYoIWtleS5kUSkge1xuICAgIGtleS5kUSA9IGtleS5kLm1vZChrZXkucS5zdWJ0cmFjdChCaWdJbnRlZ2VyLk9ORSkpO1xuICB9XG4gIGlmKCFrZXkucUludikge1xuICAgIGtleS5xSW52ID0ga2V5LnEubW9kSW52ZXJzZShrZXkucCk7XG4gIH1cblxuICAvKiBDaGluZXNlIHJlbWFpbmRlciB0aGVvcmVtIChDUlQpIHN0YXRlczpcblxuICAgIFN1cHBvc2UgbjEsIG4yLCAuLi4sIG5rIGFyZSBwb3NpdGl2ZSBpbnRlZ2VycyB3aGljaCBhcmUgcGFpcndpc2VcbiAgICBjb3ByaW1lIChuMSBhbmQgbjIgaGF2ZSBubyBjb21tb24gZmFjdG9ycyBvdGhlciB0aGFuIDEpLiBGb3IgYW55XG4gICAgaW50ZWdlcnMgeDEsIHgyLCAuLi4sIHhrIHRoZXJlIGV4aXN0cyBhbiBpbnRlZ2VyIHggc29sdmluZyB0aGVcbiAgICBzeXN0ZW0gb2Ygc2ltdWx0YW5lb3VzIGNvbmdydWVuY2VzICh3aGVyZSB+PSBtZWFucyBtb2R1bGFybHlcbiAgICBjb25ncnVlbnQgc28gYSB+PSBiIG1vZCBuIG1lYW5zIGEgbW9kIG4gPSBiIG1vZCBuKTpcblxuICAgIHggfj0geDEgbW9kIG4xXG4gICAgeCB+PSB4MiBtb2QgbjJcbiAgICAuLi5cbiAgICB4IH49IHhrIG1vZCBua1xuXG4gICAgVGhpcyBzeXN0ZW0gb2YgY29uZ3J1ZW5jZXMgaGFzIGEgc2luZ2xlIHNpbXVsdGFuZW91cyBzb2x1dGlvbiB4XG4gICAgYmV0d2VlbiAwIGFuZCBuIC0gMS4gRnVydGhlcm1vcmUsIGVhY2ggeGsgc29sdXRpb24gYW5kIHggaXRzZWxmXG4gICAgaXMgY29uZ3J1ZW50IG1vZHVsbyB0aGUgcHJvZHVjdCBuID0gbjEqbjIqLi4uKm5rLlxuICAgIFNvIHgxIG1vZCBuID0geDIgbW9kIG4gPSB4ayBtb2QgbiA9IHggbW9kIG4uXG5cbiAgICBUaGUgc2luZ2xlIHNpbXVsdGFuZW91cyBzb2x1dGlvbiB4IGNhbiBiZSBzb2x2ZWQgd2l0aCB0aGUgZm9sbG93aW5nXG4gICAgZXF1YXRpb246XG5cbiAgICB4ID0gc3VtKHhpKnJpKnNpKSBtb2QgbiB3aGVyZSByaSA9IG4vbmkgYW5kIHNpID0gcmleLTEgbW9kIG5pLlxuXG4gICAgV2hlcmUgeCBpcyBsZXNzIHRoYW4gbiwgeGkgPSB4IG1vZCBuaS5cblxuICAgIEZvciBSU0Egd2UgYXJlIG9ubHkgY29uY2VybmVkIHdpdGggayA9IDIuIFRoZSBtb2R1bHVzIG4gPSBwcSwgd2hlcmVcbiAgICBwIGFuZCBxIGFyZSBjb3ByaW1lLiBUaGUgUlNBIGRlY3J5cHRpb24gYWxnb3JpdGhtIGlzOlxuXG4gICAgeSA9IHheZCBtb2QgblxuXG4gICAgR2l2ZW4gdGhlIGFib3ZlOlxuXG4gICAgeDEgPSB4XmQgbW9kIHBcbiAgICByMSA9IG4vcCA9IHFcbiAgICBzMSA9IHFeLTEgbW9kIHBcbiAgICB4MiA9IHheZCBtb2QgcVxuICAgIHIyID0gbi9xID0gcFxuICAgIHMyID0gcF4tMSBtb2QgcVxuXG4gICAgU28geSA9ICh4MXIxczEgKyB4MnIyczIpIG1vZCBuXG4gICAgICAgICA9ICgoeF5kIG1vZCBwKXEocV4tMSBtb2QgcCkgKyAoeF5kIG1vZCBxKXAocF4tMSBtb2QgcSkpIG1vZCBuXG5cbiAgICBBY2NvcmRpbmcgdG8gRmVybWF0J3MgTGl0dGxlIFRoZW9yZW0sIGlmIHRoZSBtb2R1bHVzIFAgaXMgcHJpbWUsXG4gICAgZm9yIGFueSBpbnRlZ2VyIEEgbm90IGV2ZW5seSBkaXZpc2libGUgYnkgUCwgQV4oUC0xKSB+PSAxIG1vZCBQLlxuICAgIFNpbmNlIEEgaXMgbm90IGRpdmlzaWJsZSBieSBQIGl0IGZvbGxvd3MgdGhhdCBpZjpcbiAgICBOIH49IE0gbW9kIChQIC0gMSksIHRoZW4gQV5OIG1vZCBQID0gQV5NIG1vZCBQLiBUaGVyZWZvcmU6XG5cbiAgICBBXk4gbW9kIFAgPSBBXihNIG1vZCAoUCAtIDEpKSBtb2QgUC4gKFRoZSBsYXR0ZXIgdGFrZXMgbGVzcyBlZmZvcnRcbiAgICB0byBjYWxjdWxhdGUpLiBJbiBvcmRlciB0byBjYWxjdWxhdGUgeF5kIG1vZCBwIG1vcmUgcXVpY2tseSB0aGVcbiAgICBleHBvbmVudCBkIG1vZCAocCAtIDEpIGlzIHN0b3JlZCBpbiB0aGUgUlNBIHByaXZhdGUga2V5ICh0aGUgc2FtZVxuICAgIGlzIGRvbmUgZm9yIHheZCBtb2QgcSkuIFRoZXNlIHZhbHVlcyBhcmUgcmVmZXJyZWQgdG8gYXMgZFAgYW5kIGRRXG4gICAgcmVzcGVjdGl2ZWx5LiBUaGVyZWZvcmUgd2Ugbm93IGhhdmU6XG5cbiAgICB5ID0gKCh4XmRQIG1vZCBwKXEocV4tMSBtb2QgcCkgKyAoeF5kUSBtb2QgcSlwKHBeLTEgbW9kIHEpKSBtb2QgblxuXG4gICAgU2luY2Ugd2UnbGwgYmUgcmVkdWNpbmcgeF5kUCBieSBtb2R1bG8gcCAoc2FtZSBmb3IgcSkgd2UgY2FuIGFsc29cbiAgICByZWR1Y2UgeCBieSBwIChhbmQgcSByZXNwZWN0aXZlbHkpIGJlZm9yZSBoYW5kLiBUaGVyZWZvcmUsIGxldFxuXG4gICAgeHAgPSAoKHggbW9kIHApXmRQIG1vZCBwKSwgYW5kXG4gICAgeHEgPSAoKHggbW9kIHEpXmRRIG1vZCBxKSwgeWllbGRpbmc6XG5cbiAgICB5ID0gKHhwKnEqKHFeLTEgbW9kIHApICsgeHEqcCoocF4tMSBtb2QgcSkpIG1vZCBuXG5cbiAgICBUaGlzIGNhbiBiZSBmdXJ0aGVyIHJlZHVjZWQgdG8gYSBzaW1wbGUgYWxnb3JpdGhtIHRoYXQgb25seVxuICAgIHJlcXVpcmVzIDEgaW52ZXJzZSAodGhlIHEgaW52ZXJzZSBpcyB1c2VkKSB0byBiZSB1c2VkIGFuZCBzdG9yZWQuXG4gICAgVGhlIGFsZ29yaXRobSBpcyBjYWxsZWQgR2FybmVyJ3MgYWxnb3JpdGhtLiBJZiBxSW52IGlzIHRoZVxuICAgIGludmVyc2Ugb2YgcSwgd2Ugc2ltcGx5IGNhbGN1bGF0ZTpcblxuICAgIHkgPSAocUludiooeHAgLSB4cSkgbW9kIHApICogcSArIHhxXG5cbiAgICBIb3dldmVyLCB0aGVyZSBhcmUgdHdvIGZ1cnRoZXIgY29tcGxpY2F0aW9ucy4gRmlyc3QsIHdlIG5lZWQgdG9cbiAgICBlbnN1cmUgdGhhdCB4cCA+IHhxIHRvIHByZXZlbnQgc2lnbmVkIEJpZ0ludGVnZXJzIGZyb20gYmVpbmcgdXNlZFxuICAgIHNvIHdlIGFkZCBwIHVudGlsIHRoaXMgaXMgdHJ1ZSAoc2luY2Ugd2Ugd2lsbCBiZSBtb2QnaW5nIHdpdGhcbiAgICBwIGFueXdheSkuIFRoZW4sIHRoZXJlIGlzIGEga25vd24gdGltaW5nIGF0dGFjayBvbiBhbGdvcml0aG1zXG4gICAgdXNpbmcgdGhlIENSVC4gVG8gbWl0aWdhdGUgdGhpcyByaXNrLCBcImNyeXB0b2dyYXBoaWMgYmxpbmRpbmdcIlxuICAgIHNob3VsZCBiZSB1c2VkLiBUaGlzIHJlcXVpcmVzIHNpbXBseSBnZW5lcmF0aW5nIGEgcmFuZG9tIG51bWJlciByXG4gICAgYmV0d2VlbiAwIGFuZCBuLTEgYW5kIGl0cyBpbnZlcnNlIGFuZCBtdWx0aXBseWluZyB4IGJ5IHJeZSBiZWZvcmVcbiAgICBjYWxjdWxhdGluZyB5IGFuZCB0aGVuIG11bHRpcGx5aW5nIHkgYnkgcl4tMSBhZnRlcndhcmRzLiBOb3RlIHRoYXRcbiAgICByIG11c3QgYmUgY29wcmltZSB3aXRoIG4gKGdjZChyLCBuKSA9PT0gMSkgaW4gb3JkZXIgdG8gaGF2ZSBhblxuICAgIGludmVyc2UuXG4gICovXG5cbiAgLy8gY3J5cHRvZ3JhcGhpYyBibGluZGluZ1xuICB2YXIgcjtcbiAgZG8ge1xuICAgIHIgPSBuZXcgQmlnSW50ZWdlcihcbiAgICAgIGZvcmdlLnV0aWwuYnl0ZXNUb0hleChmb3JnZS5yYW5kb20uZ2V0Qnl0ZXMoa2V5Lm4uYml0TGVuZ3RoKCkgLyA4KSksXG4gICAgICAxNik7XG4gIH0gd2hpbGUoci5jb21wYXJlVG8oa2V5Lm4pID49IDAgfHwgIXIuZ2NkKGtleS5uKS5lcXVhbHMoQmlnSW50ZWdlci5PTkUpKTtcbiAgeCA9IHgubXVsdGlwbHkoci5tb2RQb3coa2V5LmUsIGtleS5uKSkubW9kKGtleS5uKTtcblxuICAvLyBjYWxjdWxhdGUgeHAgYW5kIHhxXG4gIHZhciB4cCA9IHgubW9kKGtleS5wKS5tb2RQb3coa2V5LmRQLCBrZXkucCk7XG4gIHZhciB4cSA9IHgubW9kKGtleS5xKS5tb2RQb3coa2V5LmRRLCBrZXkucSk7XG5cbiAgLy8geHAgbXVzdCBiZSBsYXJnZXIgdGhhbiB4cSB0byBhdm9pZCBzaWduZWQgYml0IHVzYWdlXG4gIHdoaWxlKHhwLmNvbXBhcmVUbyh4cSkgPCAwKSB7XG4gICAgeHAgPSB4cC5hZGQoa2V5LnApO1xuICB9XG5cbiAgLy8gZG8gbGFzdCBzdGVwXG4gIHZhciB5ID0geHAuc3VidHJhY3QoeHEpXG4gICAgLm11bHRpcGx5KGtleS5xSW52KS5tb2Qoa2V5LnApXG4gICAgLm11bHRpcGx5KGtleS5xKS5hZGQoeHEpO1xuXG4gIC8vIHJlbW92ZSBlZmZlY3Qgb2YgcmFuZG9tIGZvciBjcnlwdG9ncmFwaGljIGJsaW5kaW5nXG4gIHkgPSB5Lm11bHRpcGx5KHIubW9kSW52ZXJzZShrZXkubikpLm1vZChrZXkubik7XG5cbiAgcmV0dXJuIHk7XG59O1xuXG4vKipcbiAqIE5PVEU6IFRISVMgTUVUSE9EIElTIERFUFJFQ0FURUQsIHVzZSAnc2lnbicgb24gYSBwcml2YXRlIGtleSBvYmplY3Qgb3JcbiAqICdlbmNyeXB0JyBvbiBhIHB1YmxpYyBrZXkgb2JqZWN0IGluc3RlYWQuXG4gKlxuICogUGVyZm9ybXMgUlNBIGVuY3J5cHRpb24uXG4gKlxuICogVGhlIHBhcmFtZXRlciBidCBjb250cm9scyB3aGV0aGVyIHRvIHB1dCBwYWRkaW5nIGJ5dGVzIGJlZm9yZSB0aGVcbiAqIG1lc3NhZ2UgcGFzc2VkIGluLiBTZXQgYnQgdG8gZWl0aGVyIHRydWUgb3IgZmFsc2UgdG8gZGlzYWJsZSBwYWRkaW5nXG4gKiBjb21wbGV0ZWx5IChpbiBvcmRlciB0byBoYW5kbGUgZS5nLiBFTVNBLVBTUyBlbmNvZGluZyBzZXBlcmF0ZWx5IGJlZm9yZSksXG4gKiBzaWduYWxpbmcgd2hldGhlciB0aGUgZW5jcnlwdGlvbiBvcGVyYXRpb24gaXMgYSBwdWJsaWMga2V5IG9wZXJhdGlvblxuICogKGkuZS4gZW5jcnlwdGluZyBkYXRhKSBvciBub3QsIGkuZS4gcHJpdmF0ZSBrZXkgb3BlcmF0aW9uIChkYXRhIHNpZ25pbmcpLlxuICpcbiAqIEZvciBQS0NTIzEgdjEuNSBwYWRkaW5nIHBhc3MgaW4gdGhlIGJsb2NrIHR5cGUgdG8gdXNlLCBpLmUuIGVpdGhlciAweDAxXG4gKiAoZm9yIHNpZ25pbmcpIG9yIDB4MDIgKGZvciBlbmNyeXB0aW9uKS4gVGhlIGtleSBvcGVyYXRpb24gbW9kZSAocHJpdmF0ZVxuICogb3IgcHVibGljKSBpcyBkZXJpdmVkIGZyb20gdGhpcyBmbGFnIGluIHRoYXQgY2FzZSkuXG4gKlxuICogQHBhcmFtIG0gdGhlIG1lc3NhZ2UgdG8gZW5jcnlwdCBhcyBhIGJ5dGUgc3RyaW5nLlxuICogQHBhcmFtIGtleSB0aGUgUlNBIGtleSB0byB1c2UuXG4gKiBAcGFyYW0gYnQgZm9yIFBLQ1MjMSB2MS41IHBhZGRpbmcsIHRoZSBibG9jayB0eXBlIHRvIHVzZVxuICogICAoMHgwMSBmb3IgcHJpdmF0ZSBrZXksIDB4MDIgZm9yIHB1YmxpYyksXG4gKiAgIHRvIGRpc2FibGUgcGFkZGluZzogdHJ1ZSA9IHB1YmxpYyBrZXksIGZhbHNlID0gcHJpdmF0ZSBrZXkuXG4gKlxuICogQHJldHVybiB0aGUgZW5jcnlwdGVkIGJ5dGVzIGFzIGEgc3RyaW5nLlxuICovXG5wa2kucnNhLmVuY3J5cHQgPSBmdW5jdGlvbihtLCBrZXksIGJ0KSB7XG4gIHZhciBwdWIgPSBidDtcbiAgdmFyIGViO1xuXG4gIC8vIGdldCB0aGUgbGVuZ3RoIG9mIHRoZSBtb2R1bHVzIGluIGJ5dGVzXG4gIHZhciBrID0gTWF0aC5jZWlsKGtleS5uLmJpdExlbmd0aCgpIC8gOCk7XG5cbiAgaWYoYnQgIT09IGZhbHNlICYmIGJ0ICE9PSB0cnVlKSB7XG4gICAgLy8gbGVnYWN5LCBkZWZhdWx0IHRvIFBLQ1MjMSB2MS41IHBhZGRpbmdcbiAgICBwdWIgPSAoYnQgPT09IDB4MDIpO1xuICAgIGViID0gX2VuY29kZVBrY3MxX3YxXzUobSwga2V5LCBidCk7XG4gIH0gZWxzZSB7XG4gICAgZWIgPSBmb3JnZS51dGlsLmNyZWF0ZUJ1ZmZlcigpO1xuICAgIGViLnB1dEJ5dGVzKG0pO1xuICB9XG5cbiAgLy8gbG9hZCBlbmNyeXB0aW9uIGJsb2NrIGFzIGJpZyBpbnRlZ2VyICd4J1xuICAvLyBGSVhNRTogaGV4IGNvbnZlcnNpb24gaW5lZmZpY2llbnQsIGdldCBCaWdJbnRlZ2VyIHcvYnl0ZSBzdHJpbmdzXG4gIHZhciB4ID0gbmV3IEJpZ0ludGVnZXIoZWIudG9IZXgoKSwgMTYpO1xuXG4gIC8vIGRvIFJTQSBlbmNyeXB0aW9uXG4gIHZhciB5ID0gX21vZFBvdyh4LCBrZXksIHB1Yik7XG5cbiAgLy8gY29udmVydCB5IGludG8gdGhlIGVuY3J5cHRlZCBkYXRhIGJ5dGUgc3RyaW5nLCBpZiB5IGlzIHNob3J0ZXIgaW5cbiAgLy8gYnl0ZXMgdGhhbiBrLCB0aGVuIHByZXBlbmQgemVybyBieXRlcyB0byBmaWxsIHVwIGVkXG4gIC8vIEZJWE1FOiBoZXggY29udmVyc2lvbiBpbmVmZmljaWVudCwgZ2V0IEJpZ0ludGVnZXIgdy9ieXRlIHN0cmluZ3NcbiAgdmFyIHloZXggPSB5LnRvU3RyaW5nKDE2KTtcbiAgdmFyIGVkID0gZm9yZ2UudXRpbC5jcmVhdGVCdWZmZXIoKTtcbiAgdmFyIHplcm9zID0gayAtIE1hdGguY2VpbCh5aGV4Lmxlbmd0aCAvIDIpO1xuICB3aGlsZSh6ZXJvcyA+IDApIHtcbiAgICBlZC5wdXRCeXRlKDB4MDApO1xuICAgIC0temVyb3M7XG4gIH1cbiAgZWQucHV0Qnl0ZXMoZm9yZ2UudXRpbC5oZXhUb0J5dGVzKHloZXgpKTtcbiAgcmV0dXJuIGVkLmdldEJ5dGVzKCk7XG59O1xuXG4vKipcbiAqIE5PVEU6IFRISVMgTUVUSE9EIElTIERFUFJFQ0FURUQsIHVzZSAnZGVjcnlwdCcgb24gYSBwcml2YXRlIGtleSBvYmplY3Qgb3JcbiAqICd2ZXJpZnknIG9uIGEgcHVibGljIGtleSBvYmplY3QgaW5zdGVhZC5cbiAqXG4gKiBQZXJmb3JtcyBSU0EgZGVjcnlwdGlvbi5cbiAqXG4gKiBUaGUgcGFyYW1ldGVyIG1sIGNvbnRyb2xzIHdoZXRoZXIgdG8gYXBwbHkgUEtDUyMxIHYxLjUgcGFkZGluZ1xuICogb3Igbm90LiAgU2V0IG1sID0gZmFsc2UgdG8gZGlzYWJsZSBwYWRkaW5nIHJlbW92YWwgY29tcGxldGVseVxuICogKGluIG9yZGVyIHRvIGhhbmRsZSBlLmcuIEVNU0EtUFNTIGxhdGVyIG9uKSBhbmQgc2ltcGx5IHBhc3MgYmFja1xuICogdGhlIFJTQSBlbmNyeXB0aW9uIGJsb2NrLlxuICpcbiAqIEBwYXJhbSBlZCB0aGUgZW5jcnlwdGVkIGRhdGEgdG8gZGVjcnlwdCBpbiBhcyBhIGJ5dGUgc3RyaW5nLlxuICogQHBhcmFtIGtleSB0aGUgUlNBIGtleSB0byB1c2UuXG4gKiBAcGFyYW0gcHViIHRydWUgZm9yIGEgcHVibGljIGtleSBvcGVyYXRpb24sIGZhbHNlIGZvciBwcml2YXRlLlxuICogQHBhcmFtIG1sIHRoZSBtZXNzYWdlIGxlbmd0aCwgaWYga25vd24sIGZhbHNlIHRvIGRpc2FibGUgcGFkZGluZy5cbiAqXG4gKiBAcmV0dXJuIHRoZSBkZWNyeXB0ZWQgbWVzc2FnZSBhcyBhIGJ5dGUgc3RyaW5nLlxuICovXG5wa2kucnNhLmRlY3J5cHQgPSBmdW5jdGlvbihlZCwga2V5LCBwdWIsIG1sKSB7XG4gIC8vIGdldCB0aGUgbGVuZ3RoIG9mIHRoZSBtb2R1bHVzIGluIGJ5dGVzXG4gIHZhciBrID0gTWF0aC5jZWlsKGtleS5uLmJpdExlbmd0aCgpIC8gOCk7XG5cbiAgLy8gZXJyb3IgaWYgdGhlIGxlbmd0aCBvZiB0aGUgZW5jcnlwdGVkIGRhdGEgRUQgaXMgbm90IGtcbiAgaWYoZWQubGVuZ3RoICE9PSBrKSB7XG4gICAgdmFyIGVycm9yID0gbmV3IEVycm9yKCdFbmNyeXB0ZWQgbWVzc2FnZSBsZW5ndGggaXMgaW52YWxpZC4nKTtcbiAgICBlcnJvci5sZW5ndGggPSBlZC5sZW5ndGg7XG4gICAgZXJyb3IuZXhwZWN0ZWQgPSBrO1xuICAgIHRocm93IGVycm9yO1xuICB9XG5cbiAgLy8gY29udmVydCBlbmNyeXB0ZWQgZGF0YSBpbnRvIGEgYmlnIGludGVnZXJcbiAgLy8gRklYTUU6IGhleCBjb252ZXJzaW9uIGluZWZmaWNpZW50LCBnZXQgQmlnSW50ZWdlciB3L2J5dGUgc3RyaW5nc1xuICB2YXIgeSA9IG5ldyBCaWdJbnRlZ2VyKGZvcmdlLnV0aWwuY3JlYXRlQnVmZmVyKGVkKS50b0hleCgpLCAxNik7XG5cbiAgLy8geSBtdXN0IGJlIGxlc3MgdGhhbiB0aGUgbW9kdWx1cyBvciBpdCB3YXNuJ3QgdGhlIHJlc3VsdCBvZlxuICAvLyBhIHByZXZpb3VzIG1vZCBvcGVyYXRpb24gKGVuY3J5cHRpb24pIHVzaW5nIHRoYXQgbW9kdWx1c1xuICBpZih5LmNvbXBhcmVUbyhrZXkubikgPj0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcignRW5jcnlwdGVkIG1lc3NhZ2UgaXMgaW52YWxpZC4nKTtcbiAgfVxuXG4gIC8vIGRvIFJTQSBkZWNyeXB0aW9uXG4gIHZhciB4ID0gX21vZFBvdyh5LCBrZXksIHB1Yik7XG5cbiAgLy8gY3JlYXRlIHRoZSBlbmNyeXB0aW9uIGJsb2NrLCBpZiB4IGlzIHNob3J0ZXIgaW4gYnl0ZXMgdGhhbiBrLCB0aGVuXG4gIC8vIHByZXBlbmQgemVybyBieXRlcyB0byBmaWxsIHVwIGViXG4gIC8vIEZJWE1FOiBoZXggY29udmVyc2lvbiBpbmVmZmljaWVudCwgZ2V0IEJpZ0ludGVnZXIgdy9ieXRlIHN0cmluZ3NcbiAgdmFyIHhoZXggPSB4LnRvU3RyaW5nKDE2KTtcbiAgdmFyIGViID0gZm9yZ2UudXRpbC5jcmVhdGVCdWZmZXIoKTtcbiAgdmFyIHplcm9zID0gayAtIE1hdGguY2VpbCh4aGV4Lmxlbmd0aCAvIDIpO1xuICB3aGlsZSh6ZXJvcyA+IDApIHtcbiAgICBlYi5wdXRCeXRlKDB4MDApO1xuICAgIC0temVyb3M7XG4gIH1cbiAgZWIucHV0Qnl0ZXMoZm9yZ2UudXRpbC5oZXhUb0J5dGVzKHhoZXgpKTtcblxuICBpZihtbCAhPT0gZmFsc2UpIHtcbiAgICAvLyBsZWdhY3ksIGRlZmF1bHQgdG8gUEtDUyMxIHYxLjUgcGFkZGluZ1xuICAgIHJldHVybiBfZGVjb2RlUGtjczFfdjFfNShlYi5nZXRCeXRlcygpLCBrZXksIHB1Yik7XG4gIH1cblxuICAvLyByZXR1cm4gbWVzc2FnZVxuICByZXR1cm4gZWIuZ2V0Qnl0ZXMoKTtcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBSU0Ega2V5LXBhaXIgZ2VuZXJhdGlvbiBzdGF0ZSBvYmplY3QuIEl0IGlzIHVzZWQgdG8gYWxsb3dcbiAqIGtleS1nZW5lcmF0aW9uIHRvIGJlIHBlcmZvcm1lZCBpbiBzdGVwcy4gSXQgYWxzbyBhbGxvd3MgZm9yIGEgVUkgdG9cbiAqIGRpc3BsYXkgcHJvZ3Jlc3MgdXBkYXRlcy5cbiAqXG4gKiBAcGFyYW0gYml0cyB0aGUgc2l6ZSBmb3IgdGhlIHByaXZhdGUga2V5IGluIGJpdHMsIGRlZmF1bHRzIHRvIDIwNDguXG4gKiBAcGFyYW0gZSB0aGUgcHVibGljIGV4cG9uZW50IHRvIHVzZSwgZGVmYXVsdHMgdG8gNjU1MzcgKDB4MTAwMDEpLlxuICogQHBhcmFtIFtvcHRpb25zXSB0aGUgb3B0aW9ucyB0byB1c2UuXG4gKiAgICAgICAgICBwcm5nIGEgY3VzdG9tIGNyeXB0by1zZWN1cmUgcHNldWRvLXJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIHRvIHVzZSxcbiAqICAgICAgICAgICAgdGhhdCBtdXN0IGRlZmluZSBcImdldEJ5dGVzU3luY1wiLlxuICogICAgICAgICAgYWxnb3JpdGhtIHRoZSBhbGdvcml0aG0gdG8gdXNlIChkZWZhdWx0OiAnUFJJTUVJTkMnKS5cbiAqXG4gKiBAcmV0dXJuIHRoZSBzdGF0ZSBvYmplY3QgdG8gdXNlIHRvIGdlbmVyYXRlIHRoZSBrZXktcGFpci5cbiAqL1xucGtpLnJzYS5jcmVhdGVLZXlQYWlyR2VuZXJhdGlvblN0YXRlID0gZnVuY3Rpb24oYml0cywgZSwgb3B0aW9ucykge1xuICAvLyBUT0RPOiBtaWdyYXRlIHN0ZXAtYmFzZWQgcHJpbWUgZ2VuZXJhdGlvbiBjb2RlIHRvIGZvcmdlLnByaW1lXG5cbiAgLy8gc2V0IGRlZmF1bHQgYml0c1xuICBpZih0eXBlb2YoYml0cykgPT09ICdzdHJpbmcnKSB7XG4gICAgYml0cyA9IHBhcnNlSW50KGJpdHMsIDEwKTtcbiAgfVxuICBiaXRzID0gYml0cyB8fCAyMDQ4O1xuXG4gIC8vIGNyZWF0ZSBwcm5nIHdpdGggYXBpIHRoYXQgbWF0Y2hlcyBCaWdJbnRlZ2VyIHNlY3VyZSByYW5kb21cbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIHZhciBwcm5nID0gb3B0aW9ucy5wcm5nIHx8IGZvcmdlLnJhbmRvbTtcbiAgdmFyIHJuZyA9IHtcbiAgICAvLyB4IGlzIGFuIGFycmF5IHRvIGZpbGwgd2l0aCBieXRlc1xuICAgIG5leHRCeXRlczogZnVuY3Rpb24oeCkge1xuICAgICAgdmFyIGIgPSBwcm5nLmdldEJ5dGVzU3luYyh4Lmxlbmd0aCk7XG4gICAgICBmb3IodmFyIGkgPSAwOyBpIDwgeC5sZW5ndGg7ICsraSkge1xuICAgICAgICB4W2ldID0gYi5jaGFyQ29kZUF0KGkpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICB2YXIgYWxnb3JpdGhtID0gb3B0aW9ucy5hbGdvcml0aG0gfHwgJ1BSSU1FSU5DJztcblxuICAvLyBjcmVhdGUgUFJJTUVJTkMgYWxnb3JpdGhtIHN0YXRlXG4gIHZhciBydmFsO1xuICBpZihhbGdvcml0aG0gPT09ICdQUklNRUlOQycpIHtcbiAgICBydmFsID0ge1xuICAgICAgYWxnb3JpdGhtOiBhbGdvcml0aG0sXG4gICAgICBzdGF0ZTogMCxcbiAgICAgIGJpdHM6IGJpdHMsXG4gICAgICBybmc6IHJuZyxcbiAgICAgIGVJbnQ6IGUgfHwgNjU1MzcsXG4gICAgICBlOiBuZXcgQmlnSW50ZWdlcihudWxsKSxcbiAgICAgIHA6IG51bGwsXG4gICAgICBxOiBudWxsLFxuICAgICAgcUJpdHM6IGJpdHMgPj4gMSxcbiAgICAgIHBCaXRzOiBiaXRzIC0gKGJpdHMgPj4gMSksXG4gICAgICBwcVN0YXRlOiAwLFxuICAgICAgbnVtOiBudWxsLFxuICAgICAga2V5czogbnVsbFxuICAgIH07XG4gICAgcnZhbC5lLmZyb21JbnQocnZhbC5lSW50KTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQga2V5IGdlbmVyYXRpb24gYWxnb3JpdGhtOiAnICsgYWxnb3JpdGhtKTtcbiAgfVxuXG4gIHJldHVybiBydmFsO1xufTtcblxuLyoqXG4gKiBBdHRlbXB0cyB0byBydW5zIHRoZSBrZXktZ2VuZXJhdGlvbiBhbGdvcml0aG0gZm9yIGF0IG1vc3QgbiBzZWNvbmRzXG4gKiAoYXBwcm94aW1hdGVseSkgdXNpbmcgdGhlIGdpdmVuIHN0YXRlLiBXaGVuIGtleS1nZW5lcmF0aW9uIGhhcyBjb21wbGV0ZWQsXG4gKiB0aGUga2V5cyB3aWxsIGJlIHN0b3JlZCBpbiBzdGF0ZS5rZXlzLlxuICpcbiAqIFRvIHVzZSB0aGlzIGZ1bmN0aW9uIHRvIHVwZGF0ZSBhIFVJIHdoaWxlIGdlbmVyYXRpbmcgYSBrZXkgb3IgdG8gcHJldmVudFxuICogY2F1c2luZyBicm93c2VyIGxvY2t1cHMvd2FybmluZ3MsIHNldCBcIm5cIiB0byBhIHZhbHVlIG90aGVyIHRoYW4gMC4gQVxuICogc2ltcGxlIHBhdHRlcm4gZm9yIGdlbmVyYXRpbmcgYSBrZXkgYW5kIHNob3dpbmcgYSBwcm9ncmVzcyBpbmRpY2F0b3IgaXM6XG4gKlxuICogdmFyIHN0YXRlID0gcGtpLnJzYS5jcmVhdGVLZXlQYWlyR2VuZXJhdGlvblN0YXRlKDIwNDgpO1xuICogdmFyIHN0ZXAgPSBmdW5jdGlvbigpIHtcbiAqICAgLy8gc3RlcCBrZXktZ2VuZXJhdGlvbiwgcnVuIGFsZ29yaXRobSBmb3IgMTAwIG1zLCByZXBlYXRcbiAqICAgaWYoIWZvcmdlLnBraS5yc2Euc3RlcEtleVBhaXJHZW5lcmF0aW9uU3RhdGUoc3RhdGUsIDEwMCkpIHtcbiAqICAgICBzZXRUaW1lb3V0KHN0ZXAsIDEpO1xuICogICB9IGVsc2Uge1xuICogICAgIC8vIGtleS1nZW5lcmF0aW9uIGNvbXBsZXRlXG4gKiAgICAgLy8gVE9ETzogdHVybiBvZmYgcHJvZ3Jlc3MgaW5kaWNhdG9yIGhlcmVcbiAqICAgICAvLyBUT0RPOiB1c2UgdGhlIGdlbmVyYXRlZCBrZXktcGFpciBpbiBcInN0YXRlLmtleXNcIlxuICogICB9XG4gKiB9O1xuICogLy8gVE9ETzogdHVybiBvbiBwcm9ncmVzcyBpbmRpY2F0b3IgaGVyZVxuICogc2V0VGltZW91dChzdGVwLCAwKTtcbiAqXG4gKiBAcGFyYW0gc3RhdGUgdGhlIHN0YXRlIHRvIHVzZS5cbiAqIEBwYXJhbSBuIHRoZSBtYXhpbXVtIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gcnVuIHRoZSBhbGdvcml0aG0gZm9yLCAwXG4gKiAgICAgICAgICB0byBydW4gdGhlIGFsZ29yaXRobSB0byBjb21wbGV0aW9uLlxuICpcbiAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUga2V5LWdlbmVyYXRpb24gY29tcGxldGVkLCBmYWxzZSBpZiBub3QuXG4gKi9cbnBraS5yc2Euc3RlcEtleVBhaXJHZW5lcmF0aW9uU3RhdGUgPSBmdW5jdGlvbihzdGF0ZSwgbikge1xuICAvLyBzZXQgZGVmYXVsdCBhbGdvcml0aG0gaWYgbm90IHNldFxuICBpZighKCdhbGdvcml0aG0nIGluIHN0YXRlKSkge1xuICAgIHN0YXRlLmFsZ29yaXRobSA9ICdQUklNRUlOQyc7XG4gIH1cblxuICAvLyBUT0RPOiBtaWdyYXRlIHN0ZXAtYmFzZWQgcHJpbWUgZ2VuZXJhdGlvbiBjb2RlIHRvIGZvcmdlLnByaW1lXG4gIC8vIFRPRE86IGFic3RyYWN0IGFzIFBSSU1FSU5DIGFsZ29yaXRobVxuXG4gIC8vIGRvIGtleSBnZW5lcmF0aW9uIChiYXNlZCBvbiBUb20gV3UncyByc2EuanMsIHNlZSBqc2JuLmpzIGxpY2Vuc2UpXG4gIC8vIHdpdGggc29tZSBtaW5vciBvcHRpbWl6YXRpb25zIGFuZCBkZXNpZ25lZCB0byBydW4gaW4gc3RlcHNcblxuICAvLyBsb2NhbCBzdGF0ZSB2YXJzXG4gIHZhciBUSElSVFkgPSBuZXcgQmlnSW50ZWdlcihudWxsKTtcbiAgVEhJUlRZLmZyb21JbnQoMzApO1xuICB2YXIgZGVsdGFJZHggPSAwO1xuICB2YXIgb3Bfb3IgPSBmdW5jdGlvbih4LCB5KSB7cmV0dXJuIHggfCB5O307XG5cbiAgLy8ga2VlcCBzdGVwcGluZyB1bnRpbCB0aW1lIGxpbWl0IGlzIHJlYWNoZWQgb3IgZG9uZVxuICB2YXIgdDEgPSArbmV3IERhdGUoKTtcbiAgdmFyIHQyO1xuICB2YXIgdG90YWwgPSAwO1xuICB3aGlsZShzdGF0ZS5rZXlzID09PSBudWxsICYmIChuIDw9IDAgfHwgdG90YWwgPCBuKSkge1xuICAgIC8vIGdlbmVyYXRlIHAgb3IgcVxuICAgIGlmKHN0YXRlLnN0YXRlID09PSAwKSB7XG4gICAgICAvKiBOb3RlOiBBbGwgcHJpbWVzIGFyZSBvZiB0aGUgZm9ybTpcblxuICAgICAgICAzMGsraSwgZm9yIGkgPCAzMCBhbmQgZ2NkKDMwLCBpKT0xLCB3aGVyZSB0aGVyZSBhcmUgOCB2YWx1ZXMgZm9yIGlcblxuICAgICAgICBXaGVuIHdlIGdlbmVyYXRlIGEgcmFuZG9tIG51bWJlciwgd2UgYWx3YXlzIGFsaWduIGl0IGF0IDMwayArIDEuIEVhY2hcbiAgICAgICAgdGltZSB0aGUgbnVtYmVyIGlzIGRldGVybWluZWQgbm90IHRvIGJlIHByaW1lIHdlIGFkZCB0byBnZXQgdG8gdGhlXG4gICAgICAgIG5leHQgJ2knLCBlZzogaWYgdGhlIG51bWJlciB3YXMgYXQgMzBrICsgMSB3ZSBhZGQgNi4gKi9cbiAgICAgIHZhciBiaXRzID0gKHN0YXRlLnAgPT09IG51bGwpID8gc3RhdGUucEJpdHMgOiBzdGF0ZS5xQml0cztcbiAgICAgIHZhciBiaXRzMSA9IGJpdHMgLSAxO1xuXG4gICAgICAvLyBnZXQgYSByYW5kb20gbnVtYmVyXG4gICAgICBpZihzdGF0ZS5wcVN0YXRlID09PSAwKSB7XG4gICAgICAgIHN0YXRlLm51bSA9IG5ldyBCaWdJbnRlZ2VyKGJpdHMsIHN0YXRlLnJuZyk7XG4gICAgICAgIC8vIGZvcmNlIE1TQiBzZXRcbiAgICAgICAgaWYoIXN0YXRlLm51bS50ZXN0Qml0KGJpdHMxKSkge1xuICAgICAgICAgIHN0YXRlLm51bS5iaXR3aXNlVG8oXG4gICAgICAgICAgICBCaWdJbnRlZ2VyLk9ORS5zaGlmdExlZnQoYml0czEpLCBvcF9vciwgc3RhdGUubnVtKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBhbGlnbiBudW1iZXIgb24gMzBrKzEgYm91bmRhcnlcbiAgICAgICAgc3RhdGUubnVtLmRBZGRPZmZzZXQoMzEgLSBzdGF0ZS5udW0ubW9kKFRISVJUWSkuYnl0ZVZhbHVlKCksIDApO1xuICAgICAgICBkZWx0YUlkeCA9IDA7XG5cbiAgICAgICAgKytzdGF0ZS5wcVN0YXRlO1xuICAgICAgfSBlbHNlIGlmKHN0YXRlLnBxU3RhdGUgPT09IDEpIHtcbiAgICAgICAgLy8gdHJ5IHRvIG1ha2UgdGhlIG51bWJlciBhIHByaW1lXG4gICAgICAgIGlmKHN0YXRlLm51bS5iaXRMZW5ndGgoKSA+IGJpdHMpIHtcbiAgICAgICAgICAvLyBvdmVyZmxvdywgdHJ5IGFnYWluXG4gICAgICAgICAgc3RhdGUucHFTdGF0ZSA9IDA7XG4gICAgICAgICAgLy8gZG8gcHJpbWFsaXR5IHRlc3RcbiAgICAgICAgfSBlbHNlIGlmKHN0YXRlLm51bS5pc1Byb2JhYmxlUHJpbWUoXG4gICAgICAgICAgX2dldE1pbGxlclJhYmluVGVzdHMoc3RhdGUubnVtLmJpdExlbmd0aCgpKSkpIHtcbiAgICAgICAgICArK3N0YXRlLnBxU3RhdGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gZ2V0IG5leHQgcG90ZW50aWFsIHByaW1lXG4gICAgICAgICAgc3RhdGUubnVtLmRBZGRPZmZzZXQoR0NEXzMwX0RFTFRBW2RlbHRhSWR4KysgJSA4XSwgMCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZihzdGF0ZS5wcVN0YXRlID09PSAyKSB7XG4gICAgICAgIC8vIGVuc3VyZSBudW1iZXIgaXMgY29wcmltZSB3aXRoIGVcbiAgICAgICAgc3RhdGUucHFTdGF0ZSA9XG4gICAgICAgICAgKHN0YXRlLm51bS5zdWJ0cmFjdChCaWdJbnRlZ2VyLk9ORSkuZ2NkKHN0YXRlLmUpXG4gICAgICAgICAgICAuY29tcGFyZVRvKEJpZ0ludGVnZXIuT05FKSA9PT0gMCkgPyAzIDogMDtcbiAgICAgIH0gZWxzZSBpZihzdGF0ZS5wcVN0YXRlID09PSAzKSB7XG4gICAgICAgIC8vIHN0b3JlIHAgb3IgcVxuICAgICAgICBzdGF0ZS5wcVN0YXRlID0gMDtcbiAgICAgICAgaWYoc3RhdGUucCA9PT0gbnVsbCkge1xuICAgICAgICAgIHN0YXRlLnAgPSBzdGF0ZS5udW07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3RhdGUucSA9IHN0YXRlLm51bTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGFkdmFuY2Ugc3RhdGUgaWYgYm90aCBwIGFuZCBxIGFyZSByZWFkeVxuICAgICAgICBpZihzdGF0ZS5wICE9PSBudWxsICYmIHN0YXRlLnEgIT09IG51bGwpIHtcbiAgICAgICAgICArK3N0YXRlLnN0YXRlO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRlLm51bSA9IG51bGw7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmKHN0YXRlLnN0YXRlID09PSAxKSB7XG4gICAgICAvLyBlbnN1cmUgcCBpcyBsYXJnZXIgdGhhbiBxIChzd2FwIHRoZW0gaWYgbm90KVxuICAgICAgaWYoc3RhdGUucC5jb21wYXJlVG8oc3RhdGUucSkgPCAwKSB7XG4gICAgICAgIHN0YXRlLm51bSA9IHN0YXRlLnA7XG4gICAgICAgIHN0YXRlLnAgPSBzdGF0ZS5xO1xuICAgICAgICBzdGF0ZS5xID0gc3RhdGUubnVtO1xuICAgICAgfVxuICAgICAgKytzdGF0ZS5zdGF0ZTtcbiAgICB9IGVsc2UgaWYoc3RhdGUuc3RhdGUgPT09IDIpIHtcbiAgICAgIC8vIGNvbXB1dGUgcGhpOiAocCAtIDEpKHEgLSAxKSAoRXVsZXIncyB0b3RpZW50IGZ1bmN0aW9uKVxuICAgICAgc3RhdGUucDEgPSBzdGF0ZS5wLnN1YnRyYWN0KEJpZ0ludGVnZXIuT05FKTtcbiAgICAgIHN0YXRlLnExID0gc3RhdGUucS5zdWJ0cmFjdChCaWdJbnRlZ2VyLk9ORSk7XG4gICAgICBzdGF0ZS5waGkgPSBzdGF0ZS5wMS5tdWx0aXBseShzdGF0ZS5xMSk7XG4gICAgICArK3N0YXRlLnN0YXRlO1xuICAgIH0gZWxzZSBpZihzdGF0ZS5zdGF0ZSA9PT0gMykge1xuICAgICAgLy8gZW5zdXJlIGUgYW5kIHBoaSBhcmUgY29wcmltZVxuICAgICAgaWYoc3RhdGUucGhpLmdjZChzdGF0ZS5lKS5jb21wYXJlVG8oQmlnSW50ZWdlci5PTkUpID09PSAwKSB7XG4gICAgICAgIC8vIHBoaSBhbmQgZSBhcmUgY29wcmltZSwgYWR2YW5jZVxuICAgICAgICArK3N0YXRlLnN0YXRlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gcGhpIGFuZCBlIGFyZW4ndCBjb3ByaW1lLCBzbyBnZW5lcmF0ZSBhIG5ldyBwIGFuZCBxXG4gICAgICAgIHN0YXRlLnAgPSBudWxsO1xuICAgICAgICBzdGF0ZS5xID0gbnVsbDtcbiAgICAgICAgc3RhdGUuc3RhdGUgPSAwO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZihzdGF0ZS5zdGF0ZSA9PT0gNCkge1xuICAgICAgLy8gY3JlYXRlIG4sIGVuc3VyZSBuIGlzIGhhcyB0aGUgcmlnaHQgbnVtYmVyIG9mIGJpdHNcbiAgICAgIHN0YXRlLm4gPSBzdGF0ZS5wLm11bHRpcGx5KHN0YXRlLnEpO1xuXG4gICAgICAvLyBlbnN1cmUgbiBpcyByaWdodCBudW1iZXIgb2YgYml0c1xuICAgICAgaWYoc3RhdGUubi5iaXRMZW5ndGgoKSA9PT0gc3RhdGUuYml0cykge1xuICAgICAgICAvLyBzdWNjZXNzLCBhZHZhbmNlXG4gICAgICAgICsrc3RhdGUuc3RhdGU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBmYWlsZWQsIGdldCBuZXcgcVxuICAgICAgICBzdGF0ZS5xID0gbnVsbDtcbiAgICAgICAgc3RhdGUuc3RhdGUgPSAwO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZihzdGF0ZS5zdGF0ZSA9PT0gNSkge1xuICAgICAgLy8gc2V0IGtleXNcbiAgICAgIHZhciBkID0gc3RhdGUuZS5tb2RJbnZlcnNlKHN0YXRlLnBoaSk7XG4gICAgICBzdGF0ZS5rZXlzID0ge1xuICAgICAgICBwcml2YXRlS2V5OiBwa2kucnNhLnNldFByaXZhdGVLZXkoXG4gICAgICAgICAgc3RhdGUubiwgc3RhdGUuZSwgZCwgc3RhdGUucCwgc3RhdGUucSxcbiAgICAgICAgICBkLm1vZChzdGF0ZS5wMSksIGQubW9kKHN0YXRlLnExKSxcbiAgICAgICAgICBzdGF0ZS5xLm1vZEludmVyc2Uoc3RhdGUucCkpLFxuICAgICAgICBwdWJsaWNLZXk6IHBraS5yc2Euc2V0UHVibGljS2V5KHN0YXRlLm4sIHN0YXRlLmUpXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIHVwZGF0ZSB0aW1pbmdcbiAgICB0MiA9ICtuZXcgRGF0ZSgpO1xuICAgIHRvdGFsICs9IHQyIC0gdDE7XG4gICAgdDEgPSB0MjtcbiAgfVxuXG4gIHJldHVybiBzdGF0ZS5rZXlzICE9PSBudWxsO1xufTtcblxuLyoqXG4gKiBHZW5lcmF0ZXMgYW4gUlNBIHB1YmxpYy1wcml2YXRlIGtleSBwYWlyIGluIGEgc2luZ2xlIGNhbGwuXG4gKlxuICogVG8gZ2VuZXJhdGUgYSBrZXktcGFpciBpbiBzdGVwcyAodG8gYWxsb3cgZm9yIHByb2dyZXNzIHVwZGF0ZXMgYW5kIHRvXG4gKiBwcmV2ZW50IGJsb2NraW5nIG9yIHdhcm5pbmdzIGluIHNsb3cgYnJvd3NlcnMpIHRoZW4gdXNlIHRoZSBrZXktcGFpclxuICogZ2VuZXJhdGlvbiBzdGF0ZSBmdW5jdGlvbnMuXG4gKlxuICogVG8gZ2VuZXJhdGUgYSBrZXktcGFpciBhc3luY2hyb25vdXNseSAoZWl0aGVyIHRocm91Z2ggd2ViLXdvcmtlcnMsIGlmXG4gKiBhdmFpbGFibGUsIG9yIGJ5IGJyZWFraW5nIHVwIHRoZSB3b3JrIG9uIHRoZSBtYWluIHRocmVhZCksIHBhc3MgYVxuICogY2FsbGJhY2sgZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtIFtiaXRzXSB0aGUgc2l6ZSBmb3IgdGhlIHByaXZhdGUga2V5IGluIGJpdHMsIGRlZmF1bHRzIHRvIDIwNDguXG4gKiBAcGFyYW0gW2VdIHRoZSBwdWJsaWMgZXhwb25lbnQgdG8gdXNlLCBkZWZhdWx0cyB0byA2NTUzNy5cbiAqIEBwYXJhbSBbb3B0aW9uc10gb3B0aW9ucyBmb3Iga2V5LXBhaXIgZ2VuZXJhdGlvbiwgaWYgZ2l2ZW4gdGhlbiAnYml0cydcbiAqICAgICAgICAgICAgYW5kICdlJyBtdXN0ICpub3QqIGJlIGdpdmVuOlxuICogICAgICAgICAgYml0cyB0aGUgc2l6ZSBmb3IgdGhlIHByaXZhdGUga2V5IGluIGJpdHMsIChkZWZhdWx0OiAyMDQ4KS5cbiAqICAgICAgICAgIGUgdGhlIHB1YmxpYyBleHBvbmVudCB0byB1c2UsIChkZWZhdWx0OiA2NTUzNyAoMHgxMDAwMSkpLlxuICogICAgICAgICAgd29ya2VyU2NyaXB0IHRoZSB3b3JrZXIgc2NyaXB0IFVSTC5cbiAqICAgICAgICAgIHdvcmtlcnMgdGhlIG51bWJlciBvZiB3ZWIgd29ya2VycyAoaWYgc3VwcG9ydGVkKSB0byB1c2UsXG4gKiAgICAgICAgICAgIChkZWZhdWx0OiAyKS5cbiAqICAgICAgICAgIHdvcmtMb2FkIHRoZSBzaXplIG9mIHRoZSB3b3JrIGxvYWQsIGllOiBudW1iZXIgb2YgcG9zc2libGUgcHJpbWVcbiAqICAgICAgICAgICAgbnVtYmVycyBmb3IgZWFjaCB3ZWIgd29ya2VyIHRvIGNoZWNrIHBlciB3b3JrIGFzc2lnbm1lbnQsXG4gKiAgICAgICAgICAgIChkZWZhdWx0OiAxMDApLlxuICogICAgICAgICAgcHJuZyBhIGN1c3RvbSBjcnlwdG8tc2VjdXJlIHBzZXVkby1yYW5kb20gbnVtYmVyIGdlbmVyYXRvciB0byB1c2UsXG4gKiAgICAgICAgICAgIHRoYXQgbXVzdCBkZWZpbmUgXCJnZXRCeXRlc1N5bmNcIi4gRGlzYWJsZXMgdXNlIG9mIG5hdGl2ZSBBUElzLlxuICogICAgICAgICAgYWxnb3JpdGhtIHRoZSBhbGdvcml0aG0gdG8gdXNlIChkZWZhdWx0OiAnUFJJTUVJTkMnKS5cbiAqIEBwYXJhbSBbY2FsbGJhY2soZXJyLCBrZXlwYWlyKV0gY2FsbGVkIG9uY2UgdGhlIG9wZXJhdGlvbiBjb21wbGV0ZXMuXG4gKlxuICogQHJldHVybiBhbiBvYmplY3Qgd2l0aCBwcml2YXRlS2V5IGFuZCBwdWJsaWNLZXkgcHJvcGVydGllcy5cbiAqL1xucGtpLnJzYS5nZW5lcmF0ZUtleVBhaXIgPSBmdW5jdGlvbihiaXRzLCBlLCBvcHRpb25zLCBjYWxsYmFjaykge1xuICAvLyAoYml0cyksIChvcHRpb25zKSwgKGNhbGxiYWNrKVxuICBpZihhcmd1bWVudHMubGVuZ3RoID09PSAxKSB7XG4gICAgaWYodHlwZW9mIGJpdHMgPT09ICdvYmplY3QnKSB7XG4gICAgICBvcHRpb25zID0gYml0cztcbiAgICAgIGJpdHMgPSB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIGlmKHR5cGVvZiBiaXRzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjYWxsYmFjayA9IGJpdHM7XG4gICAgICBiaXRzID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfSBlbHNlIGlmKGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIHtcbiAgICAvLyAoYml0cywgZSksIChiaXRzLCBvcHRpb25zKSwgKGJpdHMsIGNhbGxiYWNrKSwgKG9wdGlvbnMsIGNhbGxiYWNrKVxuICAgIGlmKHR5cGVvZiBiaXRzID09PSAnbnVtYmVyJykge1xuICAgICAgaWYodHlwZW9mIGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgY2FsbGJhY2sgPSBlO1xuICAgICAgICBlID0gdW5kZWZpbmVkO1xuICAgICAgfSBlbHNlIGlmKHR5cGVvZiBlICE9PSAnbnVtYmVyJykge1xuICAgICAgICBvcHRpb25zID0gZTtcbiAgICAgICAgZSA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgb3B0aW9ucyA9IGJpdHM7XG4gICAgICBjYWxsYmFjayA9IGU7XG4gICAgICBiaXRzID0gdW5kZWZpbmVkO1xuICAgICAgZSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH0gZWxzZSBpZihhcmd1bWVudHMubGVuZ3RoID09PSAzKSB7XG4gICAgLy8gKGJpdHMsIGUsIG9wdGlvbnMpLCAoYml0cywgZSwgY2FsbGJhY2spLCAoYml0cywgb3B0aW9ucywgY2FsbGJhY2spXG4gICAgaWYodHlwZW9mIGUgPT09ICdudW1iZXInKSB7XG4gICAgICBpZih0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBjYWxsYmFjayA9IG9wdGlvbnM7XG4gICAgICAgIG9wdGlvbnMgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNhbGxiYWNrID0gb3B0aW9ucztcbiAgICAgIG9wdGlvbnMgPSBlO1xuICAgICAgZSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIGlmKGJpdHMgPT09IHVuZGVmaW5lZCkge1xuICAgIGJpdHMgPSBvcHRpb25zLmJpdHMgfHwgMjA0ODtcbiAgfVxuICBpZihlID09PSB1bmRlZmluZWQpIHtcbiAgICBlID0gb3B0aW9ucy5lIHx8IDB4MTAwMDE7XG4gIH1cblxuICAvLyB1c2UgbmF0aXZlIGNvZGUgaWYgcGVybWl0dGVkLCBhdmFpbGFibGUsIGFuZCBwYXJhbWV0ZXJzIGFyZSBhY2NlcHRhYmxlXG4gIGlmKCFmb3JnZS5vcHRpb25zLnVzZVB1cmVKYXZhU2NyaXB0ICYmICFvcHRpb25zLnBybmcgJiZcbiAgICBiaXRzID49IDI1NiAmJiBiaXRzIDw9IDE2Mzg0ICYmIChlID09PSAweDEwMDAxIHx8IGUgPT09IDMpKSB7XG4gICAgaWYoY2FsbGJhY2spIHtcbiAgICAgIC8vIHRyeSBuYXRpdmUgYXN5bmNcbiAgICAgIGlmKF9kZXRlY3ROb2RlQ3J5cHRvKCdnZW5lcmF0ZUtleVBhaXInKSkge1xuICAgICAgICByZXR1cm4gX2NyeXB0by5nZW5lcmF0ZUtleVBhaXIoJ3JzYScsIHtcbiAgICAgICAgICBtb2R1bHVzTGVuZ3RoOiBiaXRzLFxuICAgICAgICAgIHB1YmxpY0V4cG9uZW50OiBlLFxuICAgICAgICAgIHB1YmxpY0tleUVuY29kaW5nOiB7XG4gICAgICAgICAgICB0eXBlOiAnc3BraScsXG4gICAgICAgICAgICBmb3JtYXQ6ICdwZW0nXG4gICAgICAgICAgfSxcbiAgICAgICAgICBwcml2YXRlS2V5RW5jb2Rpbmc6IHtcbiAgICAgICAgICAgIHR5cGU6ICdwa2NzOCcsXG4gICAgICAgICAgICBmb3JtYXQ6ICdwZW0nXG4gICAgICAgICAgfVxuICAgICAgICB9LCBmdW5jdGlvbihlcnIsIHB1YiwgcHJpdikge1xuICAgICAgICAgIGlmKGVycikge1xuICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHtcbiAgICAgICAgICAgIHByaXZhdGVLZXk6IHBraS5wcml2YXRlS2V5RnJvbVBlbShwcml2KSxcbiAgICAgICAgICAgIHB1YmxpY0tleTogcGtpLnB1YmxpY0tleUZyb21QZW0ocHViKVxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmKF9kZXRlY3RTdWJ0bGVDcnlwdG8oJ2dlbmVyYXRlS2V5JykgJiZcbiAgICAgICAgX2RldGVjdFN1YnRsZUNyeXB0bygnZXhwb3J0S2V5JykpIHtcbiAgICAgICAgLy8gdXNlIHN0YW5kYXJkIG5hdGl2ZSBnZW5lcmF0ZUtleVxuICAgICAgICByZXR1cm4gdXRpbC5nbG9iYWxTY29wZS5jcnlwdG8uc3VidGxlLmdlbmVyYXRlS2V5KHtcbiAgICAgICAgICBuYW1lOiAnUlNBU1NBLVBLQ1MxLXYxXzUnLFxuICAgICAgICAgIG1vZHVsdXNMZW5ndGg6IGJpdHMsXG4gICAgICAgICAgcHVibGljRXhwb25lbnQ6IF9pbnRUb1VpbnQ4QXJyYXkoZSksXG4gICAgICAgICAgaGFzaDoge25hbWU6ICdTSEEtMjU2J31cbiAgICAgICAgfSwgdHJ1ZSAvKiBrZXkgY2FuIGJlIGV4cG9ydGVkKi8sIFsnc2lnbicsICd2ZXJpZnknXSlcbiAgICAgICAgLnRoZW4oZnVuY3Rpb24ocGFpcikge1xuICAgICAgICAgIHJldHVybiB1dGlsLmdsb2JhbFNjb3BlLmNyeXB0by5zdWJ0bGUuZXhwb3J0S2V5KFxuICAgICAgICAgICAgJ3BrY3M4JywgcGFpci5wcml2YXRlS2V5KTtcbiAgICAgICAgLy8gYXZvaWRpbmcgY2F0Y2goZnVuY3Rpb24oZXJyKSB7Li4ufSkgdG8gc3VwcG9ydCBJRSA8PSA4XG4gICAgICAgIH0pLnRoZW4odW5kZWZpbmVkLCBmdW5jdGlvbihlcnIpIHtcbiAgICAgICAgICBjYWxsYmFjayhlcnIpO1xuICAgICAgICB9KS50aGVuKGZ1bmN0aW9uKHBrY3M4KSB7XG4gICAgICAgICAgaWYocGtjczgpIHtcbiAgICAgICAgICAgIHZhciBwcml2YXRlS2V5ID0gcGtpLnByaXZhdGVLZXlGcm9tQXNuMShcbiAgICAgICAgICAgICAgYXNuMS5mcm9tRGVyKGZvcmdlLnV0aWwuY3JlYXRlQnVmZmVyKHBrY3M4KSkpO1xuICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwge1xuICAgICAgICAgICAgICBwcml2YXRlS2V5OiBwcml2YXRlS2V5LFxuICAgICAgICAgICAgICBwdWJsaWNLZXk6IHBraS5zZXRSc2FQdWJsaWNLZXkocHJpdmF0ZUtleS5uLCBwcml2YXRlS2V5LmUpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYoX2RldGVjdFN1YnRsZU1zQ3J5cHRvKCdnZW5lcmF0ZUtleScpICYmXG4gICAgICAgIF9kZXRlY3RTdWJ0bGVNc0NyeXB0bygnZXhwb3J0S2V5JykpIHtcbiAgICAgICAgdmFyIGdlbk9wID0gdXRpbC5nbG9iYWxTY29wZS5tc0NyeXB0by5zdWJ0bGUuZ2VuZXJhdGVLZXkoe1xuICAgICAgICAgIG5hbWU6ICdSU0FTU0EtUEtDUzEtdjFfNScsXG4gICAgICAgICAgbW9kdWx1c0xlbmd0aDogYml0cyxcbiAgICAgICAgICBwdWJsaWNFeHBvbmVudDogX2ludFRvVWludDhBcnJheShlKSxcbiAgICAgICAgICBoYXNoOiB7bmFtZTogJ1NIQS0yNTYnfVxuICAgICAgICB9LCB0cnVlIC8qIGtleSBjYW4gYmUgZXhwb3J0ZWQqLywgWydzaWduJywgJ3ZlcmlmeSddKTtcbiAgICAgICAgZ2VuT3Aub25jb21wbGV0ZSA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICB2YXIgcGFpciA9IGUudGFyZ2V0LnJlc3VsdDtcbiAgICAgICAgICB2YXIgZXhwb3J0T3AgPSB1dGlsLmdsb2JhbFNjb3BlLm1zQ3J5cHRvLnN1YnRsZS5leHBvcnRLZXkoXG4gICAgICAgICAgICAncGtjczgnLCBwYWlyLnByaXZhdGVLZXkpO1xuICAgICAgICAgIGV4cG9ydE9wLm9uY29tcGxldGUgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICB2YXIgcGtjczggPSBlLnRhcmdldC5yZXN1bHQ7XG4gICAgICAgICAgICB2YXIgcHJpdmF0ZUtleSA9IHBraS5wcml2YXRlS2V5RnJvbUFzbjEoXG4gICAgICAgICAgICAgIGFzbjEuZnJvbURlcihmb3JnZS51dGlsLmNyZWF0ZUJ1ZmZlcihwa2NzOCkpKTtcbiAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHtcbiAgICAgICAgICAgICAgcHJpdmF0ZUtleTogcHJpdmF0ZUtleSxcbiAgICAgICAgICAgICAgcHVibGljS2V5OiBwa2kuc2V0UnNhUHVibGljS2V5KHByaXZhdGVLZXkubiwgcHJpdmF0ZUtleS5lKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfTtcbiAgICAgICAgICBleHBvcnRPcC5vbmVycm9yID0gZnVuY3Rpb24oZXJyKSB7XG4gICAgICAgICAgICBjYWxsYmFjayhlcnIpO1xuICAgICAgICAgIH07XG4gICAgICAgIH07XG4gICAgICAgIGdlbk9wLm9uZXJyb3IgPSBmdW5jdGlvbihlcnIpIHtcbiAgICAgICAgICBjYWxsYmFjayhlcnIpO1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHRyeSBuYXRpdmUgc3luY1xuICAgICAgaWYoX2RldGVjdE5vZGVDcnlwdG8oJ2dlbmVyYXRlS2V5UGFpclN5bmMnKSkge1xuICAgICAgICB2YXIga2V5cGFpciA9IF9jcnlwdG8uZ2VuZXJhdGVLZXlQYWlyU3luYygncnNhJywge1xuICAgICAgICAgIG1vZHVsdXNMZW5ndGg6IGJpdHMsXG4gICAgICAgICAgcHVibGljRXhwb25lbnQ6IGUsXG4gICAgICAgICAgcHVibGljS2V5RW5jb2Rpbmc6IHtcbiAgICAgICAgICAgIHR5cGU6ICdzcGtpJyxcbiAgICAgICAgICAgIGZvcm1hdDogJ3BlbSdcbiAgICAgICAgICB9LFxuICAgICAgICAgIHByaXZhdGVLZXlFbmNvZGluZzoge1xuICAgICAgICAgICAgdHlwZTogJ3BrY3M4JyxcbiAgICAgICAgICAgIGZvcm1hdDogJ3BlbSdcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHByaXZhdGVLZXk6IHBraS5wcml2YXRlS2V5RnJvbVBlbShrZXlwYWlyLnByaXZhdGVLZXkpLFxuICAgICAgICAgIHB1YmxpY0tleTogcGtpLnB1YmxpY0tleUZyb21QZW0oa2V5cGFpci5wdWJsaWNLZXkpXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gdXNlIEphdmFTY3JpcHQgaW1wbGVtZW50YXRpb25cbiAgdmFyIHN0YXRlID0gcGtpLnJzYS5jcmVhdGVLZXlQYWlyR2VuZXJhdGlvblN0YXRlKGJpdHMsIGUsIG9wdGlvbnMpO1xuICBpZighY2FsbGJhY2spIHtcbiAgICBwa2kucnNhLnN0ZXBLZXlQYWlyR2VuZXJhdGlvblN0YXRlKHN0YXRlLCAwKTtcbiAgICByZXR1cm4gc3RhdGUua2V5cztcbiAgfVxuICBfZ2VuZXJhdGVLZXlQYWlyKHN0YXRlLCBvcHRpb25zLCBjYWxsYmFjayk7XG59O1xuXG4vKipcbiAqIFNldHMgYW4gUlNBIHB1YmxpYyBrZXkgZnJvbSBCaWdJbnRlZ2VycyBtb2R1bHVzIGFuZCBleHBvbmVudC5cbiAqXG4gKiBAcGFyYW0gbiB0aGUgbW9kdWx1cy5cbiAqIEBwYXJhbSBlIHRoZSBleHBvbmVudC5cbiAqXG4gKiBAcmV0dXJuIHRoZSBwdWJsaWMga2V5LlxuICovXG5wa2kuc2V0UnNhUHVibGljS2V5ID0gcGtpLnJzYS5zZXRQdWJsaWNLZXkgPSBmdW5jdGlvbihuLCBlKSB7XG4gIHZhciBrZXkgPSB7XG4gICAgbjogbixcbiAgICBlOiBlXG4gIH07XG5cbiAgLyoqXG4gICAqIEVuY3J5cHRzIHRoZSBnaXZlbiBkYXRhIHdpdGggdGhpcyBwdWJsaWMga2V5LiBOZXdlciBhcHBsaWNhdGlvbnNcbiAgICogc2hvdWxkIHVzZSB0aGUgJ1JTQS1PQUVQJyBkZWNyeXB0aW9uIHNjaGVtZSwgJ1JTQUVTLVBLQ1MxLVYxXzUnIGlzIGZvclxuICAgKiBsZWdhY3kgYXBwbGljYXRpb25zLlxuICAgKlxuICAgKiBAcGFyYW0gZGF0YSB0aGUgYnl0ZSBzdHJpbmcgdG8gZW5jcnlwdC5cbiAgICogQHBhcmFtIHNjaGVtZSB0aGUgZW5jcnlwdGlvbiBzY2hlbWUgdG8gdXNlOlxuICAgKiAgICAgICAgICAnUlNBRVMtUEtDUzEtVjFfNScgKGRlZmF1bHQpLFxuICAgKiAgICAgICAgICAnUlNBLU9BRVAnLFxuICAgKiAgICAgICAgICAnUkFXJywgJ05PTkUnLCBvciBudWxsIHRvIHBlcmZvcm0gcmF3IFJTQSBlbmNyeXB0aW9uLFxuICAgKiAgICAgICAgICBhbiBvYmplY3Qgd2l0aCBhbiAnZW5jb2RlJyBwcm9wZXJ0eSBzZXQgdG8gYSBmdW5jdGlvblxuICAgKiAgICAgICAgICB3aXRoIHRoZSBzaWduYXR1cmUgJ2Z1bmN0aW9uKGRhdGEsIGtleSknIHRoYXQgcmV0dXJuc1xuICAgKiAgICAgICAgICBhIGJpbmFyeS1lbmNvZGVkIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGVuY29kZWQgZGF0YS5cbiAgICogQHBhcmFtIHNjaGVtZU9wdGlvbnMgYW55IHNjaGVtZS1zcGVjaWZpYyBvcHRpb25zLlxuICAgKlxuICAgKiBAcmV0dXJuIHRoZSBlbmNyeXB0ZWQgYnl0ZSBzdHJpbmcuXG4gICAqL1xuICBrZXkuZW5jcnlwdCA9IGZ1bmN0aW9uKGRhdGEsIHNjaGVtZSwgc2NoZW1lT3B0aW9ucykge1xuICAgIGlmKHR5cGVvZiBzY2hlbWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICBzY2hlbWUgPSBzY2hlbWUudG9VcHBlckNhc2UoKTtcbiAgICB9IGVsc2UgaWYoc2NoZW1lID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHNjaGVtZSA9ICdSU0FFUy1QS0NTMS1WMV81JztcbiAgICB9XG5cbiAgICBpZihzY2hlbWUgPT09ICdSU0FFUy1QS0NTMS1WMV81Jykge1xuICAgICAgc2NoZW1lID0ge1xuICAgICAgICBlbmNvZGU6IGZ1bmN0aW9uKG0sIGtleSwgcHViKSB7XG4gICAgICAgICAgcmV0dXJuIF9lbmNvZGVQa2NzMV92MV81KG0sIGtleSwgMHgwMikuZ2V0Qnl0ZXMoKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9IGVsc2UgaWYoc2NoZW1lID09PSAnUlNBLU9BRVAnIHx8IHNjaGVtZSA9PT0gJ1JTQUVTLU9BRVAnKSB7XG4gICAgICBzY2hlbWUgPSB7XG4gICAgICAgIGVuY29kZTogZnVuY3Rpb24obSwga2V5KSB7XG4gICAgICAgICAgcmV0dXJuIGZvcmdlLnBrY3MxLmVuY29kZV9yc2Ffb2FlcChrZXksIG0sIHNjaGVtZU9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH0gZWxzZSBpZihbJ1JBVycsICdOT05FJywgJ05VTEwnLCBudWxsXS5pbmRleE9mKHNjaGVtZSkgIT09IC0xKSB7XG4gICAgICBzY2hlbWUgPSB7ZW5jb2RlOiBmdW5jdGlvbihlKSB7cmV0dXJuIGU7fX07XG4gICAgfSBlbHNlIGlmKHR5cGVvZiBzY2hlbWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vuc3VwcG9ydGVkIGVuY3J5cHRpb24gc2NoZW1lOiBcIicgKyBzY2hlbWUgKyAnXCIuJyk7XG4gICAgfVxuXG4gICAgLy8gZG8gc2NoZW1lLWJhc2VkIGVuY29kaW5nIHRoZW4gcnNhIGVuY3J5cHRpb25cbiAgICB2YXIgZSA9IHNjaGVtZS5lbmNvZGUoZGF0YSwga2V5LCB0cnVlKTtcbiAgICByZXR1cm4gcGtpLnJzYS5lbmNyeXB0KGUsIGtleSwgdHJ1ZSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIHRoZSBnaXZlbiBzaWduYXR1cmUgYWdhaW5zdCB0aGUgZ2l2ZW4gZGlnZXN0LlxuICAgKlxuICAgKiBQS0NTIzEgc3VwcG9ydHMgbXVsdGlwbGUgKGN1cnJlbnRseSB0d28pIHNpZ25hdHVyZSBzY2hlbWVzOlxuICAgKiBSU0FTU0EtUEtDUzEtVjFfNSBhbmQgUlNBU1NBLVBTUy5cbiAgICpcbiAgICogQnkgZGVmYXVsdCB0aGlzIGltcGxlbWVudGF0aW9uIHVzZXMgdGhlIFwib2xkIHNjaGVtZVwiLCBpLmUuXG4gICAqIFJTQVNTQS1QS0NTMS1WMV81LCBpbiB3aGljaCBjYXNlIG9uY2UgUlNBLWRlY3J5cHRlZCwgdGhlXG4gICAqIHNpZ25hdHVyZSBpcyBhbiBPQ1RFVCBTVFJJTkcgdGhhdCBob2xkcyBhIERpZ2VzdEluZm8uXG4gICAqXG4gICAqIERpZ2VzdEluZm8gOjo9IFNFUVVFTkNFIHtcbiAgICogICBkaWdlc3RBbGdvcml0aG0gRGlnZXN0QWxnb3JpdGhtSWRlbnRpZmllcixcbiAgICogICBkaWdlc3QgRGlnZXN0XG4gICAqIH1cbiAgICogRGlnZXN0QWxnb3JpdGhtSWRlbnRpZmllciA6Oj0gQWxnb3JpdGhtSWRlbnRpZmllclxuICAgKiBEaWdlc3QgOjo9IE9DVEVUIFNUUklOR1xuICAgKlxuICAgKiBUbyBwZXJmb3JtIFBTUyBzaWduYXR1cmUgdmVyaWZpY2F0aW9uLCBwcm92aWRlIGFuIGluc3RhbmNlXG4gICAqIG9mIEZvcmdlIFBTUyBvYmplY3QgYXMgdGhlIHNjaGVtZSBwYXJhbWV0ZXIuXG4gICAqXG4gICAqIEBwYXJhbSBkaWdlc3QgdGhlIG1lc3NhZ2UgZGlnZXN0IGhhc2ggdG8gY29tcGFyZSBhZ2FpbnN0IHRoZSBzaWduYXR1cmUsXG4gICAqICAgICAgICAgIGFzIGEgYmluYXJ5LWVuY29kZWQgc3RyaW5nLlxuICAgKiBAcGFyYW0gc2lnbmF0dXJlIHRoZSBzaWduYXR1cmUgdG8gdmVyaWZ5LCBhcyBhIGJpbmFyeS1lbmNvZGVkIHN0cmluZy5cbiAgICogQHBhcmFtIHNjaGVtZSBzaWduYXR1cmUgdmVyaWZpY2F0aW9uIHNjaGVtZSB0byB1c2U6XG4gICAqICAgICAgICAgICdSU0FTU0EtUEtDUzEtVjFfNScgb3IgdW5kZWZpbmVkIGZvciBSU0FTU0EgUEtDUyMxIHYxLjUsXG4gICAqICAgICAgICAgIGEgRm9yZ2UgUFNTIG9iamVjdCBmb3IgUlNBU1NBLVBTUyxcbiAgICogICAgICAgICAgJ05PTkUnIG9yIG51bGwgZm9yIG5vbmUsIERpZ2VzdEluZm8gd2lsbCBub3QgYmUgZXhwZWN0ZWQsIGJ1dFxuICAgKiAgICAgICAgICAgIFBLQ1MjMSB2MS41IHBhZGRpbmcgd2lsbCBzdGlsbCBiZSB1c2VkLlxuICAgKiBAcGFyYW0gb3B0aW9ucyBvcHRpb25hbCB2ZXJpZnkgb3B0aW9uc1xuICAgKiAgICAgICAgICBfcGFyc2VBbGxEaWdlc3RCeXRlcyB0ZXN0aW5nIGZsYWcgdG8gY29udHJvbCBwYXJzaW5nIG9mIGFsbFxuICAgKiAgICAgICAgICAgIGRpZ2VzdCBieXRlcy4gVW5zdXBwb3J0ZWQgYW5kIG5vdCBmb3IgZ2VuZXJhbCB1c2FnZS5cbiAgICogICAgICAgICAgICAoZGVmYXVsdDogdHJ1ZSlcbiAgICpcbiAgICogQHJldHVybiB0cnVlIGlmIHRoZSBzaWduYXR1cmUgd2FzIHZlcmlmaWVkLCBmYWxzZSBpZiBub3QuXG4gICAqL1xuICBrZXkudmVyaWZ5ID0gZnVuY3Rpb24oZGlnZXN0LCBzaWduYXR1cmUsIHNjaGVtZSwgb3B0aW9ucykge1xuICAgIGlmKHR5cGVvZiBzY2hlbWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICBzY2hlbWUgPSBzY2hlbWUudG9VcHBlckNhc2UoKTtcbiAgICB9IGVsc2UgaWYoc2NoZW1lID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHNjaGVtZSA9ICdSU0FTU0EtUEtDUzEtVjFfNSc7XG4gICAgfVxuICAgIGlmKG9wdGlvbnMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgb3B0aW9ucyA9IHtcbiAgICAgICAgX3BhcnNlQWxsRGlnZXN0Qnl0ZXM6IHRydWVcbiAgICAgIH07XG4gICAgfVxuICAgIGlmKCEoJ19wYXJzZUFsbERpZ2VzdEJ5dGVzJyBpbiBvcHRpb25zKSkge1xuICAgICAgb3B0aW9ucy5fcGFyc2VBbGxEaWdlc3RCeXRlcyA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYoc2NoZW1lID09PSAnUlNBU1NBLVBLQ1MxLVYxXzUnKSB7XG4gICAgICBzY2hlbWUgPSB7XG4gICAgICAgIHZlcmlmeTogZnVuY3Rpb24oZGlnZXN0LCBkKSB7XG4gICAgICAgICAgLy8gcmVtb3ZlIHBhZGRpbmdcbiAgICAgICAgICBkID0gX2RlY29kZVBrY3MxX3YxXzUoZCwga2V5LCB0cnVlKTtcbiAgICAgICAgICAvLyBkIGlzIEFTTi4xIEJFUi1lbmNvZGVkIERpZ2VzdEluZm9cbiAgICAgICAgICB2YXIgb2JqID0gYXNuMS5mcm9tRGVyKGQsIHtcbiAgICAgICAgICAgIHBhcnNlQWxsQnl0ZXM6IG9wdGlvbnMuX3BhcnNlQWxsRGlnZXN0Qnl0ZXNcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIC8vIHZhbGlkYXRlIERpZ2VzdEluZm9cbiAgICAgICAgICB2YXIgY2FwdHVyZSA9IHt9O1xuICAgICAgICAgIHZhciBlcnJvcnMgPSBbXTtcbiAgICAgICAgICBpZighYXNuMS52YWxpZGF0ZShvYmosIGRpZ2VzdEluZm9WYWxpZGF0b3IsIGNhcHR1cmUsIGVycm9ycykpIHtcbiAgICAgICAgICAgIHZhciBlcnJvciA9IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgJ0FTTi4xIG9iamVjdCBkb2VzIG5vdCBjb250YWluIGEgdmFsaWQgUlNBU1NBLVBLQ1MxLXYxXzUgJyArXG4gICAgICAgICAgICAgICdEaWdlc3RJbmZvIHZhbHVlLicpO1xuICAgICAgICAgICAgZXJyb3IuZXJyb3JzID0gZXJyb3JzO1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIGNoZWNrIGhhc2ggYWxnb3JpdGhtIGlkZW50aWZpZXJcbiAgICAgICAgICAvLyBzZWUgUEtDUzEtdjEtNURpZ2VzdEFsZ29yaXRobXMgaW4gUkZDIDgwMTdcbiAgICAgICAgICAvLyBGSVhNRTogYWRkIHN1cHBvcnQgdG8gdmFpZGF0b3IgZm9yIHN0cmljdCB2YWx1ZSBjaG9pY2VzXG4gICAgICAgICAgdmFyIG9pZCA9IGFzbjEuZGVyVG9PaWQoY2FwdHVyZS5hbGdvcml0aG1JZGVudGlmaWVyKTtcbiAgICAgICAgICBpZighKG9pZCA9PT0gZm9yZ2Uub2lkcy5tZDIgfHxcbiAgICAgICAgICAgIG9pZCA9PT0gZm9yZ2Uub2lkcy5tZDUgfHxcbiAgICAgICAgICAgIG9pZCA9PT0gZm9yZ2Uub2lkcy5zaGExIHx8XG4gICAgICAgICAgICBvaWQgPT09IGZvcmdlLm9pZHMuc2hhMjI0IHx8XG4gICAgICAgICAgICBvaWQgPT09IGZvcmdlLm9pZHMuc2hhMjU2IHx8XG4gICAgICAgICAgICBvaWQgPT09IGZvcmdlLm9pZHMuc2hhMzg0IHx8XG4gICAgICAgICAgICBvaWQgPT09IGZvcmdlLm9pZHMuc2hhNTEyIHx8XG4gICAgICAgICAgICBvaWQgPT09IGZvcmdlLm9pZHNbJ3NoYTUxMi0yMjQnXSB8fFxuICAgICAgICAgICAgb2lkID09PSBmb3JnZS5vaWRzWydzaGE1MTItMjU2J10pKSB7XG4gICAgICAgICAgICB2YXIgZXJyb3IgPSBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICdVbmtub3duIFJTQVNTQS1QS0NTMS12MV81IERpZ2VzdEFsZ29yaXRobSBpZGVudGlmaWVyLicpO1xuICAgICAgICAgICAgZXJyb3Iub2lkID0gb2lkO1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gc3BlY2lhbCBjaGVjayBmb3IgbWQyIGFuZCBtZDUgdGhhdCBOVUxMIHBhcmFtZXRlcnMgZXhpc3RcbiAgICAgICAgICBpZihvaWQgPT09IGZvcmdlLm9pZHMubWQyIHx8IG9pZCA9PT0gZm9yZ2Uub2lkcy5tZDUpIHtcbiAgICAgICAgICAgIGlmKCEoJ3BhcmFtZXRlcnMnIGluIGNhcHR1cmUpKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAnQVNOLjEgb2JqZWN0IGRvZXMgbm90IGNvbnRhaW4gYSB2YWxpZCBSU0FTU0EtUEtDUzEtdjFfNSAnICtcbiAgICAgICAgICAgICAgICAnRGlnZXN0SW5mbyB2YWx1ZS4gJyArXG4gICAgICAgICAgICAgICAgJ01pc3NpbmcgYWxnb3JpdGhtIGlkZW50aWZlciBOVUxMIHBhcmFtZXRlcnMuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gY29tcGFyZSB0aGUgZ2l2ZW4gZGlnZXN0IHRvIHRoZSBkZWNyeXB0ZWQgb25lXG4gICAgICAgICAgcmV0dXJuIGRpZ2VzdCA9PT0gY2FwdHVyZS5kaWdlc3Q7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSBlbHNlIGlmKHNjaGVtZSA9PT0gJ05PTkUnIHx8IHNjaGVtZSA9PT0gJ05VTEwnIHx8IHNjaGVtZSA9PT0gbnVsbCkge1xuICAgICAgc2NoZW1lID0ge1xuICAgICAgICB2ZXJpZnk6IGZ1bmN0aW9uKGRpZ2VzdCwgZCkge1xuICAgICAgICAgIC8vIHJlbW92ZSBwYWRkaW5nXG4gICAgICAgICAgZCA9IF9kZWNvZGVQa2NzMV92MV81KGQsIGtleSwgdHJ1ZSk7XG4gICAgICAgICAgcmV0dXJuIGRpZ2VzdCA9PT0gZDtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBkbyByc2EgZGVjcnlwdGlvbiB3L28gYW55IGRlY29kaW5nLCB0aGVuIHZlcmlmeSAtLSB3aGljaCBkb2VzIGRlY29kaW5nXG4gICAgdmFyIGQgPSBwa2kucnNhLmRlY3J5cHQoc2lnbmF0dXJlLCBrZXksIHRydWUsIGZhbHNlKTtcbiAgICByZXR1cm4gc2NoZW1lLnZlcmlmeShkaWdlc3QsIGQsIGtleS5uLmJpdExlbmd0aCgpKTtcbiAgfTtcblxuICByZXR1cm4ga2V5O1xufTtcblxuLyoqXG4gKiBTZXRzIGFuIFJTQSBwcml2YXRlIGtleSBmcm9tIEJpZ0ludGVnZXJzIG1vZHVsdXMsIGV4cG9uZW50LCBwcmltZXMsXG4gKiBwcmltZSBleHBvbmVudHMsIGFuZCBtb2R1bGFyIG11bHRpcGxpY2F0aXZlIGludmVyc2UuXG4gKlxuICogQHBhcmFtIG4gdGhlIG1vZHVsdXMuXG4gKiBAcGFyYW0gZSB0aGUgcHVibGljIGV4cG9uZW50LlxuICogQHBhcmFtIGQgdGhlIHByaXZhdGUgZXhwb25lbnQgKChpbnZlcnNlIG9mIGUpIG1vZCBuKS5cbiAqIEBwYXJhbSBwIHRoZSBmaXJzdCBwcmltZS5cbiAqIEBwYXJhbSBxIHRoZSBzZWNvbmQgcHJpbWUuXG4gKiBAcGFyYW0gZFAgZXhwb25lbnQxIChkIG1vZCAocC0xKSkuXG4gKiBAcGFyYW0gZFEgZXhwb25lbnQyIChkIG1vZCAocS0xKSkuXG4gKiBAcGFyYW0gcUludiAoKGludmVyc2Ugb2YgcSkgbW9kIHApXG4gKlxuICogQHJldHVybiB0aGUgcHJpdmF0ZSBrZXkuXG4gKi9cbnBraS5zZXRSc2FQcml2YXRlS2V5ID0gcGtpLnJzYS5zZXRQcml2YXRlS2V5ID0gZnVuY3Rpb24oXG4gIG4sIGUsIGQsIHAsIHEsIGRQLCBkUSwgcUludikge1xuICB2YXIga2V5ID0ge1xuICAgIG46IG4sXG4gICAgZTogZSxcbiAgICBkOiBkLFxuICAgIHA6IHAsXG4gICAgcTogcSxcbiAgICBkUDogZFAsXG4gICAgZFE6IGRRLFxuICAgIHFJbnY6IHFJbnZcbiAgfTtcblxuICAvKipcbiAgICogRGVjcnlwdHMgdGhlIGdpdmVuIGRhdGEgd2l0aCB0aGlzIHByaXZhdGUga2V5LiBUaGUgZGVjcnlwdGlvbiBzY2hlbWVcbiAgICogbXVzdCBtYXRjaCB0aGUgb25lIHVzZWQgdG8gZW5jcnlwdCB0aGUgZGF0YS5cbiAgICpcbiAgICogQHBhcmFtIGRhdGEgdGhlIGJ5dGUgc3RyaW5nIHRvIGRlY3J5cHQuXG4gICAqIEBwYXJhbSBzY2hlbWUgdGhlIGRlY3J5cHRpb24gc2NoZW1lIHRvIHVzZTpcbiAgICogICAgICAgICAgJ1JTQUVTLVBLQ1MxLVYxXzUnIChkZWZhdWx0KSxcbiAgICogICAgICAgICAgJ1JTQS1PQUVQJyxcbiAgICogICAgICAgICAgJ1JBVycsICdOT05FJywgb3IgbnVsbCB0byBwZXJmb3JtIHJhdyBSU0EgZGVjcnlwdGlvbi5cbiAgICogQHBhcmFtIHNjaGVtZU9wdGlvbnMgYW55IHNjaGVtZS1zcGVjaWZpYyBvcHRpb25zLlxuICAgKlxuICAgKiBAcmV0dXJuIHRoZSBkZWNyeXB0ZWQgYnl0ZSBzdHJpbmcuXG4gICAqL1xuICBrZXkuZGVjcnlwdCA9IGZ1bmN0aW9uKGRhdGEsIHNjaGVtZSwgc2NoZW1lT3B0aW9ucykge1xuICAgIGlmKHR5cGVvZiBzY2hlbWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICBzY2hlbWUgPSBzY2hlbWUudG9VcHBlckNhc2UoKTtcbiAgICB9IGVsc2UgaWYoc2NoZW1lID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHNjaGVtZSA9ICdSU0FFUy1QS0NTMS1WMV81JztcbiAgICB9XG5cbiAgICAvLyBkbyByc2EgZGVjcnlwdGlvbiB3L28gYW55IGRlY29kaW5nXG4gICAgdmFyIGQgPSBwa2kucnNhLmRlY3J5cHQoZGF0YSwga2V5LCBmYWxzZSwgZmFsc2UpO1xuXG4gICAgaWYoc2NoZW1lID09PSAnUlNBRVMtUEtDUzEtVjFfNScpIHtcbiAgICAgIHNjaGVtZSA9IHtkZWNvZGU6IF9kZWNvZGVQa2NzMV92MV81fTtcbiAgICB9IGVsc2UgaWYoc2NoZW1lID09PSAnUlNBLU9BRVAnIHx8IHNjaGVtZSA9PT0gJ1JTQUVTLU9BRVAnKSB7XG4gICAgICBzY2hlbWUgPSB7XG4gICAgICAgIGRlY29kZTogZnVuY3Rpb24oZCwga2V5KSB7XG4gICAgICAgICAgcmV0dXJuIGZvcmdlLnBrY3MxLmRlY29kZV9yc2Ffb2FlcChrZXksIGQsIHNjaGVtZU9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH0gZWxzZSBpZihbJ1JBVycsICdOT05FJywgJ05VTEwnLCBudWxsXS5pbmRleE9mKHNjaGVtZSkgIT09IC0xKSB7XG4gICAgICBzY2hlbWUgPSB7ZGVjb2RlOiBmdW5jdGlvbihkKSB7cmV0dXJuIGQ7fX07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgZW5jcnlwdGlvbiBzY2hlbWU6IFwiJyArIHNjaGVtZSArICdcIi4nKTtcbiAgICB9XG5cbiAgICAvLyBkZWNvZGUgYWNjb3JkaW5nIHRvIHNjaGVtZVxuICAgIHJldHVybiBzY2hlbWUuZGVjb2RlKGQsIGtleSwgZmFsc2UpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBTaWducyB0aGUgZ2l2ZW4gZGlnZXN0LCBwcm9kdWNpbmcgYSBzaWduYXR1cmUuXG4gICAqXG4gICAqIFBLQ1MjMSBzdXBwb3J0cyBtdWx0aXBsZSAoY3VycmVudGx5IHR3bykgc2lnbmF0dXJlIHNjaGVtZXM6XG4gICAqIFJTQVNTQS1QS0NTMS1WMV81IGFuZCBSU0FTU0EtUFNTLlxuICAgKlxuICAgKiBCeSBkZWZhdWx0IHRoaXMgaW1wbGVtZW50YXRpb24gdXNlcyB0aGUgXCJvbGQgc2NoZW1lXCIsIGkuZS5cbiAgICogUlNBU1NBLVBLQ1MxLVYxXzUuIEluIG9yZGVyIHRvIGdlbmVyYXRlIGEgUFNTIHNpZ25hdHVyZSwgcHJvdmlkZVxuICAgKiBhbiBpbnN0YW5jZSBvZiBGb3JnZSBQU1Mgb2JqZWN0IGFzIHRoZSBzY2hlbWUgcGFyYW1ldGVyLlxuICAgKlxuICAgKiBAcGFyYW0gbWQgdGhlIG1lc3NhZ2UgZGlnZXN0IG9iamVjdCB3aXRoIHRoZSBoYXNoIHRvIHNpZ24uXG4gICAqIEBwYXJhbSBzY2hlbWUgdGhlIHNpZ25hdHVyZSBzY2hlbWUgdG8gdXNlOlxuICAgKiAgICAgICAgICAnUlNBU1NBLVBLQ1MxLVYxXzUnIG9yIHVuZGVmaW5lZCBmb3IgUlNBU1NBIFBLQ1MjMSB2MS41LFxuICAgKiAgICAgICAgICBhIEZvcmdlIFBTUyBvYmplY3QgZm9yIFJTQVNTQS1QU1MsXG4gICAqICAgICAgICAgICdOT05FJyBvciBudWxsIGZvciBub25lLCBEaWdlc3RJbmZvIHdpbGwgbm90IGJlIHVzZWQgYnV0XG4gICAqICAgICAgICAgICAgUEtDUyMxIHYxLjUgcGFkZGluZyB3aWxsIHN0aWxsIGJlIHVzZWQuXG4gICAqXG4gICAqIEByZXR1cm4gdGhlIHNpZ25hdHVyZSBhcyBhIGJ5dGUgc3RyaW5nLlxuICAgKi9cbiAga2V5LnNpZ24gPSBmdW5jdGlvbihtZCwgc2NoZW1lKSB7XG4gICAgLyogTm90ZTogVGhlIGludGVybmFsIGltcGxlbWVudGF0aW9uIG9mIFJTQSBvcGVyYXRpb25zIGlzIGJlaW5nXG4gICAgICB0cmFuc2l0aW9uZWQgYXdheSBmcm9tIGEgUEtDUyMxIHYxLjUgaGFyZC1jb2RlZCBzY2hlbWUuIFNvbWUgbGVnYWN5XG4gICAgICBjb2RlIGxpa2UgdGhlIHVzZSBvZiBhbiBlbmNvZGluZyBibG9jayBpZGVudGlmaWVyICdidCcgd2lsbCBldmVudHVhbGx5XG4gICAgICBiZSByZW1vdmVkLiAqL1xuXG4gICAgLy8gcHJpdmF0ZSBrZXkgb3BlcmF0aW9uXG4gICAgdmFyIGJ0ID0gZmFsc2U7XG5cbiAgICBpZih0eXBlb2Ygc2NoZW1lID09PSAnc3RyaW5nJykge1xuICAgICAgc2NoZW1lID0gc2NoZW1lLnRvVXBwZXJDYXNlKCk7XG4gICAgfVxuXG4gICAgaWYoc2NoZW1lID09PSB1bmRlZmluZWQgfHwgc2NoZW1lID09PSAnUlNBU1NBLVBLQ1MxLVYxXzUnKSB7XG4gICAgICBzY2hlbWUgPSB7ZW5jb2RlOiBlbXNhUGtjczF2MTVlbmNvZGV9O1xuICAgICAgYnQgPSAweDAxO1xuICAgIH0gZWxzZSBpZihzY2hlbWUgPT09ICdOT05FJyB8fCBzY2hlbWUgPT09ICdOVUxMJyB8fCBzY2hlbWUgPT09IG51bGwpIHtcbiAgICAgIHNjaGVtZSA9IHtlbmNvZGU6IGZ1bmN0aW9uKCkge3JldHVybiBtZDt9fTtcbiAgICAgIGJ0ID0gMHgwMTtcbiAgICB9XG5cbiAgICAvLyBlbmNvZGUgYW5kIHRoZW4gZW5jcnlwdFxuICAgIHZhciBkID0gc2NoZW1lLmVuY29kZShtZCwga2V5Lm4uYml0TGVuZ3RoKCkpO1xuICAgIHJldHVybiBwa2kucnNhLmVuY3J5cHQoZCwga2V5LCBidCk7XG4gIH07XG5cbiAgcmV0dXJuIGtleTtcbn07XG5cbi8qKlxuICogV3JhcHMgYW4gUlNBUHJpdmF0ZUtleSBBU04uMSBvYmplY3QgaW4gYW4gQVNOLjEgUHJpdmF0ZUtleUluZm8gb2JqZWN0LlxuICpcbiAqIEBwYXJhbSByc2FLZXkgdGhlIEFTTi4xIFJTQVByaXZhdGVLZXkuXG4gKlxuICogQHJldHVybiB0aGUgQVNOLjEgUHJpdmF0ZUtleUluZm8uXG4gKi9cbnBraS53cmFwUnNhUHJpdmF0ZUtleSA9IGZ1bmN0aW9uKHJzYUtleSkge1xuICAvLyBQcml2YXRlS2V5SW5mb1xuICByZXR1cm4gYXNuMS5jcmVhdGUoYXNuMS5DbGFzcy5VTklWRVJTQUwsIGFzbjEuVHlwZS5TRVFVRU5DRSwgdHJ1ZSwgW1xuICAgIC8vIHZlcnNpb24gKDApXG4gICAgYXNuMS5jcmVhdGUoYXNuMS5DbGFzcy5VTklWRVJTQUwsIGFzbjEuVHlwZS5JTlRFR0VSLCBmYWxzZSxcbiAgICAgIGFzbjEuaW50ZWdlclRvRGVyKDApLmdldEJ5dGVzKCkpLFxuICAgIC8vIHByaXZhdGVLZXlBbGdvcml0aG1cbiAgICBhc24xLmNyZWF0ZShhc24xLkNsYXNzLlVOSVZFUlNBTCwgYXNuMS5UeXBlLlNFUVVFTkNFLCB0cnVlLCBbXG4gICAgICBhc24xLmNyZWF0ZShcbiAgICAgICAgYXNuMS5DbGFzcy5VTklWRVJTQUwsIGFzbjEuVHlwZS5PSUQsIGZhbHNlLFxuICAgICAgICBhc24xLm9pZFRvRGVyKHBraS5vaWRzLnJzYUVuY3J5cHRpb24pLmdldEJ5dGVzKCkpLFxuICAgICAgYXNuMS5jcmVhdGUoYXNuMS5DbGFzcy5VTklWRVJTQUwsIGFzbjEuVHlwZS5OVUxMLCBmYWxzZSwgJycpXG4gICAgXSksXG4gICAgLy8gUHJpdmF0ZUtleVxuICAgIGFzbjEuY3JlYXRlKGFzbjEuQ2xhc3MuVU5JVkVSU0FMLCBhc24xLlR5cGUuT0NURVRTVFJJTkcsIGZhbHNlLFxuICAgICAgYXNuMS50b0Rlcihyc2FLZXkpLmdldEJ5dGVzKCkpXG4gIF0pO1xufTtcblxuLyoqXG4gKiBDb252ZXJ0cyBhIHByaXZhdGUga2V5IGZyb20gYW4gQVNOLjEgb2JqZWN0LlxuICpcbiAqIEBwYXJhbSBvYmogdGhlIEFTTi4xIHJlcHJlc2VudGF0aW9uIG9mIGEgUHJpdmF0ZUtleUluZm8gY29udGFpbmluZyBhblxuICogICAgICAgICAgUlNBUHJpdmF0ZUtleSBvciBhbiBSU0FQcml2YXRlS2V5LlxuICpcbiAqIEByZXR1cm4gdGhlIHByaXZhdGUga2V5LlxuICovXG5wa2kucHJpdmF0ZUtleUZyb21Bc24xID0gZnVuY3Rpb24ob2JqKSB7XG4gIC8vIGdldCBQcml2YXRlS2V5SW5mb1xuICB2YXIgY2FwdHVyZSA9IHt9O1xuICB2YXIgZXJyb3JzID0gW107XG4gIGlmKGFzbjEudmFsaWRhdGUob2JqLCBwcml2YXRlS2V5VmFsaWRhdG9yLCBjYXB0dXJlLCBlcnJvcnMpKSB7XG4gICAgb2JqID0gYXNuMS5mcm9tRGVyKGZvcmdlLnV0aWwuY3JlYXRlQnVmZmVyKGNhcHR1cmUucHJpdmF0ZUtleSkpO1xuICB9XG5cbiAgLy8gZ2V0IFJTQVByaXZhdGVLZXlcbiAgY2FwdHVyZSA9IHt9O1xuICBlcnJvcnMgPSBbXTtcbiAgaWYoIWFzbjEudmFsaWRhdGUob2JqLCByc2FQcml2YXRlS2V5VmFsaWRhdG9yLCBjYXB0dXJlLCBlcnJvcnMpKSB7XG4gICAgdmFyIGVycm9yID0gbmV3IEVycm9yKCdDYW5ub3QgcmVhZCBwcml2YXRlIGtleS4gJyArXG4gICAgICAnQVNOLjEgb2JqZWN0IGRvZXMgbm90IGNvbnRhaW4gYW4gUlNBUHJpdmF0ZUtleS4nKTtcbiAgICBlcnJvci5lcnJvcnMgPSBlcnJvcnM7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cblxuICAvLyBOb3RlOiBWZXJzaW9uIGlzIGN1cnJlbnRseSBpZ25vcmVkLlxuICAvLyBjYXB0dXJlLnByaXZhdGVLZXlWZXJzaW9uXG4gIC8vIEZJWE1FOiBpbmVmZmljaWVudCwgZ2V0IGEgQmlnSW50ZWdlciB0aGF0IHVzZXMgYnl0ZSBzdHJpbmdzXG4gIHZhciBuLCBlLCBkLCBwLCBxLCBkUCwgZFEsIHFJbnY7XG4gIG4gPSBmb3JnZS51dGlsLmNyZWF0ZUJ1ZmZlcihjYXB0dXJlLnByaXZhdGVLZXlNb2R1bHVzKS50b0hleCgpO1xuICBlID0gZm9yZ2UudXRpbC5jcmVhdGVCdWZmZXIoY2FwdHVyZS5wcml2YXRlS2V5UHVibGljRXhwb25lbnQpLnRvSGV4KCk7XG4gIGQgPSBmb3JnZS51dGlsLmNyZWF0ZUJ1ZmZlcihjYXB0dXJlLnByaXZhdGVLZXlQcml2YXRlRXhwb25lbnQpLnRvSGV4KCk7XG4gIHAgPSBmb3JnZS51dGlsLmNyZWF0ZUJ1ZmZlcihjYXB0dXJlLnByaXZhdGVLZXlQcmltZTEpLnRvSGV4KCk7XG4gIHEgPSBmb3JnZS51dGlsLmNyZWF0ZUJ1ZmZlcihjYXB0dXJlLnByaXZhdGVLZXlQcmltZTIpLnRvSGV4KCk7XG4gIGRQID0gZm9yZ2UudXRpbC5jcmVhdGVCdWZmZXIoY2FwdHVyZS5wcml2YXRlS2V5RXhwb25lbnQxKS50b0hleCgpO1xuICBkUSA9IGZvcmdlLnV0aWwuY3JlYXRlQnVmZmVyKGNhcHR1cmUucHJpdmF0ZUtleUV4cG9uZW50MikudG9IZXgoKTtcbiAgcUludiA9IGZvcmdlLnV0aWwuY3JlYXRlQnVmZmVyKGNhcHR1cmUucHJpdmF0ZUtleUNvZWZmaWNpZW50KS50b0hleCgpO1xuXG4gIC8vIHNldCBwcml2YXRlIGtleVxuICByZXR1cm4gcGtpLnNldFJzYVByaXZhdGVLZXkoXG4gICAgbmV3IEJpZ0ludGVnZXIobiwgMTYpLFxuICAgIG5ldyBCaWdJbnRlZ2VyKGUsIDE2KSxcbiAgICBuZXcgQmlnSW50ZWdlcihkLCAxNiksXG4gICAgbmV3IEJpZ0ludGVnZXIocCwgMTYpLFxuICAgIG5ldyBCaWdJbnRlZ2VyKHEsIDE2KSxcbiAgICBuZXcgQmlnSW50ZWdlcihkUCwgMTYpLFxuICAgIG5ldyBCaWdJbnRlZ2VyKGRRLCAxNiksXG4gICAgbmV3IEJpZ0ludGVnZXIocUludiwgMTYpKTtcbn07XG5cbi8qKlxuICogQ29udmVydHMgYSBwcml2YXRlIGtleSB0byBhbiBBU04uMSBSU0FQcml2YXRlS2V5LlxuICpcbiAqIEBwYXJhbSBrZXkgdGhlIHByaXZhdGUga2V5LlxuICpcbiAqIEByZXR1cm4gdGhlIEFTTi4xIHJlcHJlc2VudGF0aW9uIG9mIGFuIFJTQVByaXZhdGVLZXkuXG4gKi9cbnBraS5wcml2YXRlS2V5VG9Bc24xID0gcGtpLnByaXZhdGVLZXlUb1JTQVByaXZhdGVLZXkgPSBmdW5jdGlvbihrZXkpIHtcbiAgLy8gUlNBUHJpdmF0ZUtleVxuICByZXR1cm4gYXNuMS5jcmVhdGUoYXNuMS5DbGFzcy5VTklWRVJTQUwsIGFzbjEuVHlwZS5TRVFVRU5DRSwgdHJ1ZSwgW1xuICAgIC8vIHZlcnNpb24gKDAgPSBvbmx5IDIgcHJpbWVzLCAxIG11bHRpcGxlIHByaW1lcylcbiAgICBhc24xLmNyZWF0ZShhc24xLkNsYXNzLlVOSVZFUlNBTCwgYXNuMS5UeXBlLklOVEVHRVIsIGZhbHNlLFxuICAgICAgYXNuMS5pbnRlZ2VyVG9EZXIoMCkuZ2V0Qnl0ZXMoKSksXG4gICAgLy8gbW9kdWx1cyAobilcbiAgICBhc24xLmNyZWF0ZShhc24xLkNsYXNzLlVOSVZFUlNBTCwgYXNuMS5UeXBlLklOVEVHRVIsIGZhbHNlLFxuICAgICAgX2JuVG9CeXRlcyhrZXkubikpLFxuICAgIC8vIHB1YmxpY0V4cG9uZW50IChlKVxuICAgIGFzbjEuY3JlYXRlKGFzbjEuQ2xhc3MuVU5JVkVSU0FMLCBhc24xLlR5cGUuSU5URUdFUiwgZmFsc2UsXG4gICAgICBfYm5Ub0J5dGVzKGtleS5lKSksXG4gICAgLy8gcHJpdmF0ZUV4cG9uZW50IChkKVxuICAgIGFzbjEuY3JlYXRlKGFzbjEuQ2xhc3MuVU5JVkVSU0FMLCBhc24xLlR5cGUuSU5URUdFUiwgZmFsc2UsXG4gICAgICBfYm5Ub0J5dGVzKGtleS5kKSksXG4gICAgLy8gcHJpdmF0ZUtleVByaW1lMSAocClcbiAgICBhc24xLmNyZWF0ZShhc24xLkNsYXNzLlVOSVZFUlNBTCwgYXNuMS5UeXBlLklOVEVHRVIsIGZhbHNlLFxuICAgICAgX2JuVG9CeXRlcyhrZXkucCkpLFxuICAgIC8vIHByaXZhdGVLZXlQcmltZTIgKHEpXG4gICAgYXNuMS5jcmVhdGUoYXNuMS5DbGFzcy5VTklWRVJTQUwsIGFzbjEuVHlwZS5JTlRFR0VSLCBmYWxzZSxcbiAgICAgIF9iblRvQnl0ZXMoa2V5LnEpKSxcbiAgICAvLyBwcml2YXRlS2V5RXhwb25lbnQxIChkUClcbiAgICBhc24xLmNyZWF0ZShhc24xLkNsYXNzLlVOSVZFUlNBTCwgYXNuMS5UeXBlLklOVEVHRVIsIGZhbHNlLFxuICAgICAgX2JuVG9CeXRlcyhrZXkuZFApKSxcbiAgICAvLyBwcml2YXRlS2V5RXhwb25lbnQyIChkUSlcbiAgICBhc24xLmNyZWF0ZShhc24xLkNsYXNzLlVOSVZFUlNBTCwgYXNuMS5UeXBlLklOVEVHRVIsIGZhbHNlLFxuICAgICAgX2JuVG9CeXRlcyhrZXkuZFEpKSxcbiAgICAvLyBjb2VmZmljaWVudCAocUludilcbiAgICBhc24xLmNyZWF0ZShhc24xLkNsYXNzLlVOSVZFUlNBTCwgYXNuMS5UeXBlLklOVEVHRVIsIGZhbHNlLFxuICAgICAgX2JuVG9CeXRlcyhrZXkucUludikpXG4gIF0pO1xufTtcblxuLyoqXG4gKiBDb252ZXJ0cyBhIHB1YmxpYyBrZXkgZnJvbSBhbiBBU04uMSBTdWJqZWN0UHVibGljS2V5SW5mbyBvciBSU0FQdWJsaWNLZXkuXG4gKlxuICogQHBhcmFtIG9iaiB0aGUgYXNuMSByZXByZXNlbnRhdGlvbiBvZiBhIFN1YmplY3RQdWJsaWNLZXlJbmZvIG9yIFJTQVB1YmxpY0tleS5cbiAqXG4gKiBAcmV0dXJuIHRoZSBwdWJsaWMga2V5LlxuICovXG5wa2kucHVibGljS2V5RnJvbUFzbjEgPSBmdW5jdGlvbihvYmopIHtcbiAgLy8gZ2V0IFN1YmplY3RQdWJsaWNLZXlJbmZvXG4gIHZhciBjYXB0dXJlID0ge307XG4gIHZhciBlcnJvcnMgPSBbXTtcbiAgaWYoYXNuMS52YWxpZGF0ZShvYmosIHB1YmxpY0tleVZhbGlkYXRvciwgY2FwdHVyZSwgZXJyb3JzKSkge1xuICAgIC8vIGdldCBvaWRcbiAgICB2YXIgb2lkID0gYXNuMS5kZXJUb09pZChjYXB0dXJlLnB1YmxpY0tleU9pZCk7XG4gICAgaWYob2lkICE9PSBwa2kub2lkcy5yc2FFbmNyeXB0aW9uKSB7XG4gICAgICB2YXIgZXJyb3IgPSBuZXcgRXJyb3IoJ0Nhbm5vdCByZWFkIHB1YmxpYyBrZXkuIFVua25vd24gT0lELicpO1xuICAgICAgZXJyb3Iub2lkID0gb2lkO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICAgIG9iaiA9IGNhcHR1cmUucnNhUHVibGljS2V5O1xuICB9XG5cbiAgLy8gZ2V0IFJTQSBwYXJhbXNcbiAgZXJyb3JzID0gW107XG4gIGlmKCFhc24xLnZhbGlkYXRlKG9iaiwgcnNhUHVibGljS2V5VmFsaWRhdG9yLCBjYXB0dXJlLCBlcnJvcnMpKSB7XG4gICAgdmFyIGVycm9yID0gbmV3IEVycm9yKCdDYW5ub3QgcmVhZCBwdWJsaWMga2V5LiAnICtcbiAgICAgICdBU04uMSBvYmplY3QgZG9lcyBub3QgY29udGFpbiBhbiBSU0FQdWJsaWNLZXkuJyk7XG4gICAgZXJyb3IuZXJyb3JzID0gZXJyb3JzO1xuICAgIHRocm93IGVycm9yO1xuICB9XG5cbiAgLy8gRklYTUU6IGluZWZmaWNpZW50LCBnZXQgYSBCaWdJbnRlZ2VyIHRoYXQgdXNlcyBieXRlIHN0cmluZ3NcbiAgdmFyIG4gPSBmb3JnZS51dGlsLmNyZWF0ZUJ1ZmZlcihjYXB0dXJlLnB1YmxpY0tleU1vZHVsdXMpLnRvSGV4KCk7XG4gIHZhciBlID0gZm9yZ2UudXRpbC5jcmVhdGVCdWZmZXIoY2FwdHVyZS5wdWJsaWNLZXlFeHBvbmVudCkudG9IZXgoKTtcblxuICAvLyBzZXQgcHVibGljIGtleVxuICByZXR1cm4gcGtpLnNldFJzYVB1YmxpY0tleShcbiAgICBuZXcgQmlnSW50ZWdlcihuLCAxNiksXG4gICAgbmV3IEJpZ0ludGVnZXIoZSwgMTYpKTtcbn07XG5cbi8qKlxuICogQ29udmVydHMgYSBwdWJsaWMga2V5IHRvIGFuIEFTTi4xIFN1YmplY3RQdWJsaWNLZXlJbmZvLlxuICpcbiAqIEBwYXJhbSBrZXkgdGhlIHB1YmxpYyBrZXkuXG4gKlxuICogQHJldHVybiB0aGUgYXNuMSByZXByZXNlbnRhdGlvbiBvZiBhIFN1YmplY3RQdWJsaWNLZXlJbmZvLlxuICovXG5wa2kucHVibGljS2V5VG9Bc24xID0gcGtpLnB1YmxpY0tleVRvU3ViamVjdFB1YmxpY0tleUluZm8gPSBmdW5jdGlvbihrZXkpIHtcbiAgLy8gU3ViamVjdFB1YmxpY0tleUluZm9cbiAgcmV0dXJuIGFzbjEuY3JlYXRlKGFzbjEuQ2xhc3MuVU5JVkVSU0FMLCBhc24xLlR5cGUuU0VRVUVOQ0UsIHRydWUsIFtcbiAgICAvLyBBbGdvcml0aG1JZGVudGlmaWVyXG4gICAgYXNuMS5jcmVhdGUoYXNuMS5DbGFzcy5VTklWRVJTQUwsIGFzbjEuVHlwZS5TRVFVRU5DRSwgdHJ1ZSwgW1xuICAgICAgLy8gYWxnb3JpdGhtXG4gICAgICBhc24xLmNyZWF0ZShhc24xLkNsYXNzLlVOSVZFUlNBTCwgYXNuMS5UeXBlLk9JRCwgZmFsc2UsXG4gICAgICAgIGFzbjEub2lkVG9EZXIocGtpLm9pZHMucnNhRW5jcnlwdGlvbikuZ2V0Qnl0ZXMoKSksXG4gICAgICAvLyBwYXJhbWV0ZXJzIChudWxsKVxuICAgICAgYXNuMS5jcmVhdGUoYXNuMS5DbGFzcy5VTklWRVJTQUwsIGFzbjEuVHlwZS5OVUxMLCBmYWxzZSwgJycpXG4gICAgXSksXG4gICAgLy8gc3ViamVjdFB1YmxpY0tleVxuICAgIGFzbjEuY3JlYXRlKGFzbjEuQ2xhc3MuVU5JVkVSU0FMLCBhc24xLlR5cGUuQklUU1RSSU5HLCBmYWxzZSwgW1xuICAgICAgcGtpLnB1YmxpY0tleVRvUlNBUHVibGljS2V5KGtleSlcbiAgICBdKVxuICBdKTtcbn07XG5cbi8qKlxuICogQ29udmVydHMgYSBwdWJsaWMga2V5IHRvIGFuIEFTTi4xIFJTQVB1YmxpY0tleS5cbiAqXG4gKiBAcGFyYW0ga2V5IHRoZSBwdWJsaWMga2V5LlxuICpcbiAqIEByZXR1cm4gdGhlIGFzbjEgcmVwcmVzZW50YXRpb24gb2YgYSBSU0FQdWJsaWNLZXkuXG4gKi9cbnBraS5wdWJsaWNLZXlUb1JTQVB1YmxpY0tleSA9IGZ1bmN0aW9uKGtleSkge1xuICAvLyBSU0FQdWJsaWNLZXlcbiAgcmV0dXJuIGFzbjEuY3JlYXRlKGFzbjEuQ2xhc3MuVU5JVkVSU0FMLCBhc24xLlR5cGUuU0VRVUVOQ0UsIHRydWUsIFtcbiAgICAvLyBtb2R1bHVzIChuKVxuICAgIGFzbjEuY3JlYXRlKGFzbjEuQ2xhc3MuVU5JVkVSU0FMLCBhc24xLlR5cGUuSU5URUdFUiwgZmFsc2UsXG4gICAgICBfYm5Ub0J5dGVzKGtleS5uKSksXG4gICAgLy8gcHVibGljRXhwb25lbnQgKGUpXG4gICAgYXNuMS5jcmVhdGUoYXNuMS5DbGFzcy5VTklWRVJTQUwsIGFzbjEuVHlwZS5JTlRFR0VSLCBmYWxzZSxcbiAgICAgIF9iblRvQnl0ZXMoa2V5LmUpKVxuICBdKTtcbn07XG5cbi8qKlxuICogRW5jb2RlcyBhIG1lc3NhZ2UgdXNpbmcgUEtDUyMxIHYxLjUgcGFkZGluZy5cbiAqXG4gKiBAcGFyYW0gbSB0aGUgbWVzc2FnZSB0byBlbmNvZGUuXG4gKiBAcGFyYW0ga2V5IHRoZSBSU0Ega2V5IHRvIHVzZS5cbiAqIEBwYXJhbSBidCB0aGUgYmxvY2sgdHlwZSB0byB1c2UsIGkuZS4gZWl0aGVyIDB4MDEgKGZvciBzaWduaW5nKSBvciAweDAyXG4gKiAgICAgICAgICAoZm9yIGVuY3J5cHRpb24pLlxuICpcbiAqIEByZXR1cm4gdGhlIHBhZGRlZCBieXRlIGJ1ZmZlci5cbiAqL1xuZnVuY3Rpb24gX2VuY29kZVBrY3MxX3YxXzUobSwga2V5LCBidCkge1xuICB2YXIgZWIgPSBmb3JnZS51dGlsLmNyZWF0ZUJ1ZmZlcigpO1xuXG4gIC8vIGdldCB0aGUgbGVuZ3RoIG9mIHRoZSBtb2R1bHVzIGluIGJ5dGVzXG4gIHZhciBrID0gTWF0aC5jZWlsKGtleS5uLmJpdExlbmd0aCgpIC8gOCk7XG5cbiAgLyogdXNlIFBLQ1MjMSB2MS41IHBhZGRpbmcgKi9cbiAgaWYobS5sZW5ndGggPiAoayAtIDExKSkge1xuICAgIHZhciBlcnJvciA9IG5ldyBFcnJvcignTWVzc2FnZSBpcyB0b28gbG9uZyBmb3IgUEtDUyMxIHYxLjUgcGFkZGluZy4nKTtcbiAgICBlcnJvci5sZW5ndGggPSBtLmxlbmd0aDtcbiAgICBlcnJvci5tYXggPSBrIC0gMTE7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cblxuICAvKiBBIGJsb2NrIHR5cGUgQlQsIGEgcGFkZGluZyBzdHJpbmcgUFMsIGFuZCB0aGUgZGF0YSBEIHNoYWxsIGJlXG4gICAgZm9ybWF0dGVkIGludG8gYW4gb2N0ZXQgc3RyaW5nIEVCLCB0aGUgZW5jcnlwdGlvbiBibG9jazpcblxuICAgIEVCID0gMDAgfHwgQlQgfHwgUFMgfHwgMDAgfHwgRFxuXG4gICAgVGhlIGJsb2NrIHR5cGUgQlQgc2hhbGwgYmUgYSBzaW5nbGUgb2N0ZXQgaW5kaWNhdGluZyB0aGUgc3RydWN0dXJlIG9mXG4gICAgdGhlIGVuY3J5cHRpb24gYmxvY2suIEZvciB0aGlzIHZlcnNpb24gb2YgdGhlIGRvY3VtZW50IGl0IHNoYWxsIGhhdmVcbiAgICB2YWx1ZSAwMCwgMDEsIG9yIDAyLiBGb3IgYSBwcml2YXRlLWtleSBvcGVyYXRpb24sIHRoZSBibG9jayB0eXBlXG4gICAgc2hhbGwgYmUgMDAgb3IgMDEuIEZvciBhIHB1YmxpYy1rZXkgb3BlcmF0aW9uLCBpdCBzaGFsbCBiZSAwMi5cblxuICAgIFRoZSBwYWRkaW5nIHN0cmluZyBQUyBzaGFsbCBjb25zaXN0IG9mIGstMy18fER8fCBvY3RldHMuIEZvciBibG9ja1xuICAgIHR5cGUgMDAsIHRoZSBvY3RldHMgc2hhbGwgaGF2ZSB2YWx1ZSAwMDsgZm9yIGJsb2NrIHR5cGUgMDEsIHRoZXlcbiAgICBzaGFsbCBoYXZlIHZhbHVlIEZGOyBhbmQgZm9yIGJsb2NrIHR5cGUgMDIsIHRoZXkgc2hhbGwgYmVcbiAgICBwc2V1ZG9yYW5kb21seSBnZW5lcmF0ZWQgYW5kIG5vbnplcm8uIFRoaXMgbWFrZXMgdGhlIGxlbmd0aCBvZiB0aGVcbiAgICBlbmNyeXB0aW9uIGJsb2NrIEVCIGVxdWFsIHRvIGsuICovXG5cbiAgLy8gYnVpbGQgdGhlIGVuY3J5cHRpb24gYmxvY2tcbiAgZWIucHV0Qnl0ZSgweDAwKTtcbiAgZWIucHV0Qnl0ZShidCk7XG5cbiAgLy8gY3JlYXRlIHRoZSBwYWRkaW5nXG4gIHZhciBwYWROdW0gPSBrIC0gMyAtIG0ubGVuZ3RoO1xuICB2YXIgcGFkQnl0ZTtcbiAgLy8gcHJpdmF0ZSBrZXkgb3BcbiAgaWYoYnQgPT09IDB4MDAgfHwgYnQgPT09IDB4MDEpIHtcbiAgICBwYWRCeXRlID0gKGJ0ID09PSAweDAwKSA/IDB4MDAgOiAweEZGO1xuICAgIGZvcih2YXIgaSA9IDA7IGkgPCBwYWROdW07ICsraSkge1xuICAgICAgZWIucHV0Qnl0ZShwYWRCeXRlKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gcHVibGljIGtleSBvcFxuICAgIC8vIHBhZCB3aXRoIHJhbmRvbSBub24temVybyB2YWx1ZXNcbiAgICB3aGlsZShwYWROdW0gPiAwKSB7XG4gICAgICB2YXIgbnVtWmVyb3MgPSAwO1xuICAgICAgdmFyIHBhZEJ5dGVzID0gZm9yZ2UucmFuZG9tLmdldEJ5dGVzKHBhZE51bSk7XG4gICAgICBmb3IodmFyIGkgPSAwOyBpIDwgcGFkTnVtOyArK2kpIHtcbiAgICAgICAgcGFkQnl0ZSA9IHBhZEJ5dGVzLmNoYXJDb2RlQXQoaSk7XG4gICAgICAgIGlmKHBhZEJ5dGUgPT09IDApIHtcbiAgICAgICAgICArK251bVplcm9zO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGViLnB1dEJ5dGUocGFkQnl0ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHBhZE51bSA9IG51bVplcm9zO1xuICAgIH1cbiAgfVxuXG4gIC8vIHplcm8gZm9sbG93ZWQgYnkgbWVzc2FnZVxuICBlYi5wdXRCeXRlKDB4MDApO1xuICBlYi5wdXRCeXRlcyhtKTtcblxuICByZXR1cm4gZWI7XG59XG5cbi8qKlxuICogRGVjb2RlcyBhIG1lc3NhZ2UgdXNpbmcgUEtDUyMxIHYxLjUgcGFkZGluZy5cbiAqXG4gKiBAcGFyYW0gZW0gdGhlIG1lc3NhZ2UgdG8gZGVjb2RlLlxuICogQHBhcmFtIGtleSB0aGUgUlNBIGtleSB0byB1c2UuXG4gKiBAcGFyYW0gcHViIHRydWUgaWYgdGhlIGtleSBpcyBhIHB1YmxpYyBrZXksIGZhbHNlIGlmIGl0IGlzIHByaXZhdGUuXG4gKiBAcGFyYW0gbWwgdGhlIG1lc3NhZ2UgbGVuZ3RoLCBpZiBzcGVjaWZpZWQuXG4gKlxuICogQHJldHVybiB0aGUgZGVjb2RlZCBieXRlcy5cbiAqL1xuZnVuY3Rpb24gX2RlY29kZVBrY3MxX3YxXzUoZW0sIGtleSwgcHViLCBtbCkge1xuICAvLyBnZXQgdGhlIGxlbmd0aCBvZiB0aGUgbW9kdWx1cyBpbiBieXRlc1xuICB2YXIgayA9IE1hdGguY2VpbChrZXkubi5iaXRMZW5ndGgoKSAvIDgpO1xuXG4gIC8qIEl0IGlzIGFuIGVycm9yIGlmIGFueSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgb2NjdXJzOlxuXG4gICAgMS4gVGhlIGVuY3J5cHRpb24gYmxvY2sgRUIgY2Fubm90IGJlIHBhcnNlZCB1bmFtYmlndW91c2x5LlxuICAgIDIuIFRoZSBwYWRkaW5nIHN0cmluZyBQUyBjb25zaXN0cyBvZiBmZXdlciB0aGFuIGVpZ2h0IG9jdGV0c1xuICAgICAgb3IgaXMgaW5jb25zaXNlbnQgd2l0aCB0aGUgYmxvY2sgdHlwZSBCVC5cbiAgICAzLiBUaGUgZGVjcnlwdGlvbiBwcm9jZXNzIGlzIGEgcHVibGljLWtleSBvcGVyYXRpb24gYW5kIHRoZSBibG9ja1xuICAgICAgdHlwZSBCVCBpcyBub3QgMDAgb3IgMDEsIG9yIHRoZSBkZWNyeXB0aW9uIHByb2Nlc3MgaXMgYVxuICAgICAgcHJpdmF0ZS1rZXkgb3BlcmF0aW9uIGFuZCB0aGUgYmxvY2sgdHlwZSBpcyBub3QgMDIuXG4gICAqL1xuXG4gIC8vIHBhcnNlIHRoZSBlbmNyeXB0aW9uIGJsb2NrXG4gIHZhciBlYiA9IGZvcmdlLnV0aWwuY3JlYXRlQnVmZmVyKGVtKTtcbiAgdmFyIGZpcnN0ID0gZWIuZ2V0Qnl0ZSgpO1xuICB2YXIgYnQgPSBlYi5nZXRCeXRlKCk7XG4gIGlmKGZpcnN0ICE9PSAweDAwIHx8XG4gICAgKHB1YiAmJiBidCAhPT0gMHgwMCAmJiBidCAhPT0gMHgwMSkgfHxcbiAgICAoIXB1YiAmJiBidCAhPSAweDAyKSB8fFxuICAgIChwdWIgJiYgYnQgPT09IDB4MDAgJiYgdHlwZW9mKG1sKSA9PT0gJ3VuZGVmaW5lZCcpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdFbmNyeXB0aW9uIGJsb2NrIGlzIGludmFsaWQuJyk7XG4gIH1cblxuICB2YXIgcGFkTnVtID0gMDtcbiAgaWYoYnQgPT09IDB4MDApIHtcbiAgICAvLyBjaGVjayBhbGwgcGFkZGluZyBieXRlcyBmb3IgMHgwMFxuICAgIHBhZE51bSA9IGsgLSAzIC0gbWw7XG4gICAgZm9yKHZhciBpID0gMDsgaSA8IHBhZE51bTsgKytpKSB7XG4gICAgICBpZihlYi5nZXRCeXRlKCkgIT09IDB4MDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFbmNyeXB0aW9uIGJsb2NrIGlzIGludmFsaWQuJyk7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2UgaWYoYnQgPT09IDB4MDEpIHtcbiAgICAvLyBmaW5kIHRoZSBmaXJzdCBieXRlIHRoYXQgaXNuJ3QgMHhGRiwgc2hvdWxkIGJlIGFmdGVyIGFsbCBwYWRkaW5nXG4gICAgcGFkTnVtID0gMDtcbiAgICB3aGlsZShlYi5sZW5ndGgoKSA+IDEpIHtcbiAgICAgIGlmKGViLmdldEJ5dGUoKSAhPT0gMHhGRikge1xuICAgICAgICAtLWViLnJlYWQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgKytwYWROdW07XG4gICAgfVxuICB9IGVsc2UgaWYoYnQgPT09IDB4MDIpIHtcbiAgICAvLyBsb29rIGZvciAweDAwIGJ5dGVcbiAgICBwYWROdW0gPSAwO1xuICAgIHdoaWxlKGViLmxlbmd0aCgpID4gMSkge1xuICAgICAgaWYoZWIuZ2V0Qnl0ZSgpID09PSAweDAwKSB7XG4gICAgICAgIC0tZWIucmVhZDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICArK3BhZE51bTtcbiAgICB9XG4gIH1cblxuICAvLyB6ZXJvIG11c3QgYmUgMHgwMCBhbmQgcGFkTnVtIG11c3QgYmUgKGsgLSAzIC0gbWVzc2FnZSBsZW5ndGgpXG4gIHZhciB6ZXJvID0gZWIuZ2V0Qnl0ZSgpO1xuICBpZih6ZXJvICE9PSAweDAwIHx8IHBhZE51bSAhPT0gKGsgLSAzIC0gZWIubGVuZ3RoKCkpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdFbmNyeXB0aW9uIGJsb2NrIGlzIGludmFsaWQuJyk7XG4gIH1cblxuICByZXR1cm4gZWIuZ2V0Qnl0ZXMoKTtcbn1cblxuLyoqXG4gKiBSdW5zIHRoZSBrZXktZ2VuZXJhdGlvbiBhbGdvcml0aG0gYXN5bmNocm9ub3VzbHksIGVpdGhlciBpbiB0aGUgYmFja2dyb3VuZFxuICogdmlhIFdlYiBXb3JrZXJzLCBvciB1c2luZyB0aGUgbWFpbiB0aHJlYWQgYW5kIHNldEltbWVkaWF0ZS5cbiAqXG4gKiBAcGFyYW0gc3RhdGUgdGhlIGtleS1wYWlyIGdlbmVyYXRpb24gc3RhdGUuXG4gKiBAcGFyYW0gW29wdGlvbnNdIG9wdGlvbnMgZm9yIGtleS1wYWlyIGdlbmVyYXRpb246XG4gKiAgICAgICAgICB3b3JrZXJTY3JpcHQgdGhlIHdvcmtlciBzY3JpcHQgVVJMLlxuICogICAgICAgICAgd29ya2VycyB0aGUgbnVtYmVyIG9mIHdlYiB3b3JrZXJzIChpZiBzdXBwb3J0ZWQpIHRvIHVzZSxcbiAqICAgICAgICAgICAgKGRlZmF1bHQ6IDIsIC0xIHRvIHVzZSBlc3RpbWF0ZWQgY29yZXMgbWludXMgb25lKS5cbiAqICAgICAgICAgIHdvcmtMb2FkIHRoZSBzaXplIG9mIHRoZSB3b3JrIGxvYWQsIGllOiBudW1iZXIgb2YgcG9zc2libGUgcHJpbWVcbiAqICAgICAgICAgICAgbnVtYmVycyBmb3IgZWFjaCB3ZWIgd29ya2VyIHRvIGNoZWNrIHBlciB3b3JrIGFzc2lnbm1lbnQsXG4gKiAgICAgICAgICAgIChkZWZhdWx0OiAxMDApLlxuICogQHBhcmFtIGNhbGxiYWNrKGVyciwga2V5cGFpcikgY2FsbGVkIG9uY2UgdGhlIG9wZXJhdGlvbiBjb21wbGV0ZXMuXG4gKi9cbmZ1bmN0aW9uIF9nZW5lcmF0ZUtleVBhaXIoc3RhdGUsIG9wdGlvbnMsIGNhbGxiYWNrKSB7XG4gIGlmKHR5cGVvZiBvcHRpb25zID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2FsbGJhY2sgPSBvcHRpb25zO1xuICAgIG9wdGlvbnMgPSB7fTtcbiAgfVxuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICB2YXIgb3B0cyA9IHtcbiAgICBhbGdvcml0aG06IHtcbiAgICAgIG5hbWU6IG9wdGlvbnMuYWxnb3JpdGhtIHx8ICdQUklNRUlOQycsXG4gICAgICBvcHRpb25zOiB7XG4gICAgICAgIHdvcmtlcnM6IG9wdGlvbnMud29ya2VycyB8fCAyLFxuICAgICAgICB3b3JrTG9hZDogb3B0aW9ucy53b3JrTG9hZCB8fCAxMDAsXG4gICAgICAgIHdvcmtlclNjcmlwdDogb3B0aW9ucy53b3JrZXJTY3JpcHRcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIGlmKCdwcm5nJyBpbiBvcHRpb25zKSB7XG4gICAgb3B0cy5wcm5nID0gb3B0aW9ucy5wcm5nO1xuICB9XG5cbiAgZ2VuZXJhdGUoKTtcblxuICBmdW5jdGlvbiBnZW5lcmF0ZSgpIHtcbiAgICAvLyBmaW5kIHAgYW5kIHRoZW4gcSAoZG9uZSBpbiBzZXJpZXMgdG8gc2ltcGxpZnkpXG4gICAgZ2V0UHJpbWUoc3RhdGUucEJpdHMsIGZ1bmN0aW9uKGVyciwgbnVtKSB7XG4gICAgICBpZihlcnIpIHtcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgICB9XG4gICAgICBzdGF0ZS5wID0gbnVtO1xuICAgICAgaWYoc3RhdGUucSAhPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gZmluaXNoKGVyciwgc3RhdGUucSk7XG4gICAgICB9XG4gICAgICBnZXRQcmltZShzdGF0ZS5xQml0cywgZmluaXNoKTtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldFByaW1lKGJpdHMsIGNhbGxiYWNrKSB7XG4gICAgZm9yZ2UucHJpbWUuZ2VuZXJhdGVQcm9iYWJsZVByaW1lKGJpdHMsIG9wdHMsIGNhbGxiYWNrKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZpbmlzaChlcnIsIG51bSkge1xuICAgIGlmKGVycikge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgfVxuXG4gICAgLy8gc2V0IHFcbiAgICBzdGF0ZS5xID0gbnVtO1xuXG4gICAgLy8gZW5zdXJlIHAgaXMgbGFyZ2VyIHRoYW4gcSAoc3dhcCB0aGVtIGlmIG5vdClcbiAgICBpZihzdGF0ZS5wLmNvbXBhcmVUbyhzdGF0ZS5xKSA8IDApIHtcbiAgICAgIHZhciB0bXAgPSBzdGF0ZS5wO1xuICAgICAgc3RhdGUucCA9IHN0YXRlLnE7XG4gICAgICBzdGF0ZS5xID0gdG1wO1xuICAgIH1cblxuICAgIC8vIGVuc3VyZSBwIGlzIGNvcHJpbWUgd2l0aCBlXG4gICAgaWYoc3RhdGUucC5zdWJ0cmFjdChCaWdJbnRlZ2VyLk9ORSkuZ2NkKHN0YXRlLmUpXG4gICAgICAuY29tcGFyZVRvKEJpZ0ludGVnZXIuT05FKSAhPT0gMCkge1xuICAgICAgc3RhdGUucCA9IG51bGw7XG4gICAgICBnZW5lcmF0ZSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGVuc3VyZSBxIGlzIGNvcHJpbWUgd2l0aCBlXG4gICAgaWYoc3RhdGUucS5zdWJ0cmFjdChCaWdJbnRlZ2VyLk9ORSkuZ2NkKHN0YXRlLmUpXG4gICAgICAuY29tcGFyZVRvKEJpZ0ludGVnZXIuT05FKSAhPT0gMCkge1xuICAgICAgc3RhdGUucSA9IG51bGw7XG4gICAgICBnZXRQcmltZShzdGF0ZS5xQml0cywgZmluaXNoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBjb21wdXRlIHBoaTogKHAgLSAxKShxIC0gMSkgKEV1bGVyJ3MgdG90aWVudCBmdW5jdGlvbilcbiAgICBzdGF0ZS5wMSA9IHN0YXRlLnAuc3VidHJhY3QoQmlnSW50ZWdlci5PTkUpO1xuICAgIHN0YXRlLnExID0gc3RhdGUucS5zdWJ0cmFjdChCaWdJbnRlZ2VyLk9ORSk7XG4gICAgc3RhdGUucGhpID0gc3RhdGUucDEubXVsdGlwbHkoc3RhdGUucTEpO1xuXG4gICAgLy8gZW5zdXJlIGUgYW5kIHBoaSBhcmUgY29wcmltZVxuICAgIGlmKHN0YXRlLnBoaS5nY2Qoc3RhdGUuZSkuY29tcGFyZVRvKEJpZ0ludGVnZXIuT05FKSAhPT0gMCkge1xuICAgICAgLy8gcGhpIGFuZCBlIGFyZW4ndCBjb3ByaW1lLCBzbyBnZW5lcmF0ZSBhIG5ldyBwIGFuZCBxXG4gICAgICBzdGF0ZS5wID0gc3RhdGUucSA9IG51bGw7XG4gICAgICBnZW5lcmF0ZSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGNyZWF0ZSBuLCBlbnN1cmUgbiBpcyBoYXMgdGhlIHJpZ2h0IG51bWJlciBvZiBiaXRzXG4gICAgc3RhdGUubiA9IHN0YXRlLnAubXVsdGlwbHkoc3RhdGUucSk7XG4gICAgaWYoc3RhdGUubi5iaXRMZW5ndGgoKSAhPT0gc3RhdGUuYml0cykge1xuICAgICAgLy8gZmFpbGVkLCBnZXQgbmV3IHFcbiAgICAgIHN0YXRlLnEgPSBudWxsO1xuICAgICAgZ2V0UHJpbWUoc3RhdGUucUJpdHMsIGZpbmlzaCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gc2V0IGtleXNcbiAgICB2YXIgZCA9IHN0YXRlLmUubW9kSW52ZXJzZShzdGF0ZS5waGkpO1xuICAgIHN0YXRlLmtleXMgPSB7XG4gICAgICBwcml2YXRlS2V5OiBwa2kucnNhLnNldFByaXZhdGVLZXkoXG4gICAgICAgIHN0YXRlLm4sIHN0YXRlLmUsIGQsIHN0YXRlLnAsIHN0YXRlLnEsXG4gICAgICAgIGQubW9kKHN0YXRlLnAxKSwgZC5tb2Qoc3RhdGUucTEpLFxuICAgICAgICBzdGF0ZS5xLm1vZEludmVyc2Uoc3RhdGUucCkpLFxuICAgICAgcHVibGljS2V5OiBwa2kucnNhLnNldFB1YmxpY0tleShzdGF0ZS5uLCBzdGF0ZS5lKVxuICAgIH07XG5cbiAgICBjYWxsYmFjayhudWxsLCBzdGF0ZS5rZXlzKTtcbiAgfVxufVxuXG4vKipcbiAqIENvbnZlcnRzIGEgcG9zaXRpdmUgQmlnSW50ZWdlciBpbnRvIDIncy1jb21wbGVtZW50IGJpZy1lbmRpYW4gYnl0ZXMuXG4gKlxuICogQHBhcmFtIGIgdGhlIGJpZyBpbnRlZ2VyIHRvIGNvbnZlcnQuXG4gKlxuICogQHJldHVybiB0aGUgYnl0ZXMuXG4gKi9cbmZ1bmN0aW9uIF9iblRvQnl0ZXMoYikge1xuICAvLyBwcmVwZW5kIDB4MDAgaWYgZmlyc3QgYnl0ZSA+PSAweDgwXG4gIHZhciBoZXggPSBiLnRvU3RyaW5nKDE2KTtcbiAgaWYoaGV4WzBdID49ICc4Jykge1xuICAgIGhleCA9ICcwMCcgKyBoZXg7XG4gIH1cbiAgdmFyIGJ5dGVzID0gZm9yZ2UudXRpbC5oZXhUb0J5dGVzKGhleCk7XG5cbiAgLy8gZW5zdXJlIGludGVnZXIgaXMgbWluaW1hbGx5LWVuY29kZWRcbiAgaWYoYnl0ZXMubGVuZ3RoID4gMSAmJlxuICAgIC8vIGxlYWRpbmcgMHgwMCBmb3IgcG9zaXRpdmUgaW50ZWdlclxuICAgICgoYnl0ZXMuY2hhckNvZGVBdCgwKSA9PT0gMCAmJlxuICAgIChieXRlcy5jaGFyQ29kZUF0KDEpICYgMHg4MCkgPT09IDApIHx8XG4gICAgLy8gbGVhZGluZyAweEZGIGZvciBuZWdhdGl2ZSBpbnRlZ2VyXG4gICAgKGJ5dGVzLmNoYXJDb2RlQXQoMCkgPT09IDB4RkYgJiZcbiAgICAoYnl0ZXMuY2hhckNvZGVBdCgxKSAmIDB4ODApID09PSAweDgwKSkpIHtcbiAgICByZXR1cm4gYnl0ZXMuc3Vic3RyKDEpO1xuICB9XG4gIHJldHVybiBieXRlcztcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSByZXF1aXJlZCBudW1iZXIgb2YgTWlsbGVyLVJhYmluIHRlc3RzIHRvIGdlbmVyYXRlIGFcbiAqIHByaW1lIHdpdGggYW4gZXJyb3IgcHJvYmFiaWxpdHkgb2YgKDEvMileODAuXG4gKlxuICogU2VlIEhhbmRib29rIG9mIEFwcGxpZWQgQ3J5cHRvZ3JhcGh5IENoYXB0ZXIgNCwgVGFibGUgNC40LlxuICpcbiAqIEBwYXJhbSBiaXRzIHRoZSBiaXQgc2l6ZS5cbiAqXG4gKiBAcmV0dXJuIHRoZSByZXF1aXJlZCBudW1iZXIgb2YgaXRlcmF0aW9ucy5cbiAqL1xuZnVuY3Rpb24gX2dldE1pbGxlclJhYmluVGVzdHMoYml0cykge1xuICBpZihiaXRzIDw9IDEwMCkgcmV0dXJuIDI3O1xuICBpZihiaXRzIDw9IDE1MCkgcmV0dXJuIDE4O1xuICBpZihiaXRzIDw9IDIwMCkgcmV0dXJuIDE1O1xuICBpZihiaXRzIDw9IDI1MCkgcmV0dXJuIDEyO1xuICBpZihiaXRzIDw9IDMwMCkgcmV0dXJuIDk7XG4gIGlmKGJpdHMgPD0gMzUwKSByZXR1cm4gODtcbiAgaWYoYml0cyA8PSA0MDApIHJldHVybiA3O1xuICBpZihiaXRzIDw9IDUwMCkgcmV0dXJuIDY7XG4gIGlmKGJpdHMgPD0gNjAwKSByZXR1cm4gNTtcbiAgaWYoYml0cyA8PSA4MDApIHJldHVybiA0O1xuICBpZihiaXRzIDw9IDEyNTApIHJldHVybiAzO1xuICByZXR1cm4gMjtcbn1cblxuLyoqXG4gKiBQZXJmb3JtcyBmZWF0dXJlIGRldGVjdGlvbiBvbiB0aGUgTm9kZSBjcnlwdG8gaW50ZXJmYWNlLlxuICpcbiAqIEBwYXJhbSBmbiB0aGUgZmVhdHVyZSAoZnVuY3Rpb24pIHRvIGRldGVjdC5cbiAqXG4gKiBAcmV0dXJuIHRydWUgaWYgZGV0ZWN0ZWQsIGZhbHNlIGlmIG5vdC5cbiAqL1xuZnVuY3Rpb24gX2RldGVjdE5vZGVDcnlwdG8oZm4pIHtcbiAgcmV0dXJuIGZvcmdlLnV0aWwuaXNOb2RlanMgJiYgdHlwZW9mIF9jcnlwdG9bZm5dID09PSAnZnVuY3Rpb24nO1xufVxuXG4vKipcbiAqIFBlcmZvcm1zIGZlYXR1cmUgZGV0ZWN0aW9uIG9uIHRoZSBTdWJ0bGVDcnlwdG8gaW50ZXJmYWNlLlxuICpcbiAqIEBwYXJhbSBmbiB0aGUgZmVhdHVyZSAoZnVuY3Rpb24pIHRvIGRldGVjdC5cbiAqXG4gKiBAcmV0dXJuIHRydWUgaWYgZGV0ZWN0ZWQsIGZhbHNlIGlmIG5vdC5cbiAqL1xuZnVuY3Rpb24gX2RldGVjdFN1YnRsZUNyeXB0byhmbikge1xuICByZXR1cm4gKHR5cGVvZiB1dGlsLmdsb2JhbFNjb3BlICE9PSAndW5kZWZpbmVkJyAmJlxuICAgIHR5cGVvZiB1dGlsLmdsb2JhbFNjb3BlLmNyeXB0byA9PT0gJ29iamVjdCcgJiZcbiAgICB0eXBlb2YgdXRpbC5nbG9iYWxTY29wZS5jcnlwdG8uc3VidGxlID09PSAnb2JqZWN0JyAmJlxuICAgIHR5cGVvZiB1dGlsLmdsb2JhbFNjb3BlLmNyeXB0by5zdWJ0bGVbZm5dID09PSAnZnVuY3Rpb24nKTtcbn1cblxuLyoqXG4gKiBQZXJmb3JtcyBmZWF0dXJlIGRldGVjdGlvbiBvbiB0aGUgZGVwcmVjYXRlZCBNaWNyb3NvZnQgSW50ZXJuZXQgRXhwbG9yZXJcbiAqIG91dGRhdGVkIFN1YnRsZUNyeXB0byBpbnRlcmZhY2UuIFRoaXMgZnVuY3Rpb24gc2hvdWxkIG9ubHkgYmUgdXNlZCBhZnRlclxuICogY2hlY2tpbmcgZm9yIHRoZSBtb2Rlcm4sIHN0YW5kYXJkIFN1YnRsZUNyeXB0byBpbnRlcmZhY2UuXG4gKlxuICogQHBhcmFtIGZuIHRoZSBmZWF0dXJlIChmdW5jdGlvbikgdG8gZGV0ZWN0LlxuICpcbiAqIEByZXR1cm4gdHJ1ZSBpZiBkZXRlY3RlZCwgZmFsc2UgaWYgbm90LlxuICovXG5mdW5jdGlvbiBfZGV0ZWN0U3VidGxlTXNDcnlwdG8oZm4pIHtcbiAgcmV0dXJuICh0eXBlb2YgdXRpbC5nbG9iYWxTY29wZSAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICB0eXBlb2YgdXRpbC5nbG9iYWxTY29wZS5tc0NyeXB0byA9PT0gJ29iamVjdCcgJiZcbiAgICB0eXBlb2YgdXRpbC5nbG9iYWxTY29wZS5tc0NyeXB0by5zdWJ0bGUgPT09ICdvYmplY3QnICYmXG4gICAgdHlwZW9mIHV0aWwuZ2xvYmFsU2NvcGUubXNDcnlwdG8uc3VidGxlW2ZuXSA9PT0gJ2Z1bmN0aW9uJyk7XG59XG5cbmZ1bmN0aW9uIF9pbnRUb1VpbnQ4QXJyYXkoeCkge1xuICB2YXIgYnl0ZXMgPSBmb3JnZS51dGlsLmhleFRvQnl0ZXMoeC50b1N0cmluZygxNikpO1xuICB2YXIgYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoYnl0ZXMubGVuZ3RoKTtcbiAgZm9yKHZhciBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgKytpKSB7XG4gICAgYnVmZmVyW2ldID0gYnl0ZXMuY2hhckNvZGVBdChpKTtcbiAgfVxuICByZXR1cm4gYnVmZmVyO1xufVxuXG5mdW5jdGlvbiBfcHJpdmF0ZUtleUZyb21Kd2soandrKSB7XG4gIGlmKGp3ay5rdHkgIT09ICdSU0EnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgJ1Vuc3VwcG9ydGVkIGtleSBhbGdvcml0aG0gXCInICsgandrLmt0eSArICdcIjsgYWxnb3JpdGhtIG11c3QgYmUgXCJSU0FcIi4nKTtcbiAgfVxuICByZXR1cm4gcGtpLnNldFJzYVByaXZhdGVLZXkoXG4gICAgX2Jhc2U2NFRvQmlnSW50KGp3ay5uKSxcbiAgICBfYmFzZTY0VG9CaWdJbnQoandrLmUpLFxuICAgIF9iYXNlNjRUb0JpZ0ludChqd2suZCksXG4gICAgX2Jhc2U2NFRvQmlnSW50KGp3ay5wKSxcbiAgICBfYmFzZTY0VG9CaWdJbnQoandrLnEpLFxuICAgIF9iYXNlNjRUb0JpZ0ludChqd2suZHApLFxuICAgIF9iYXNlNjRUb0JpZ0ludChqd2suZHEpLFxuICAgIF9iYXNlNjRUb0JpZ0ludChqd2sucWkpKTtcbn1cblxuZnVuY3Rpb24gX3B1YmxpY0tleUZyb21Kd2soandrKSB7XG4gIGlmKGp3ay5rdHkgIT09ICdSU0EnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdLZXkgYWxnb3JpdGhtIG11c3QgYmUgXCJSU0FcIi4nKTtcbiAgfVxuICByZXR1cm4gcGtpLnNldFJzYVB1YmxpY0tleShcbiAgICBfYmFzZTY0VG9CaWdJbnQoandrLm4pLFxuICAgIF9iYXNlNjRUb0JpZ0ludChqd2suZSkpO1xufVxuXG5mdW5jdGlvbiBfYmFzZTY0VG9CaWdJbnQoYjY0KSB7XG4gIHJldHVybiBuZXcgQmlnSW50ZWdlcihmb3JnZS51dGlsLmJ5dGVzVG9IZXgoZm9yZ2UudXRpbC5kZWNvZGU2NChiNjQpKSwgMTYpO1xufVxuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///42\n")},function(module,exports,__webpack_require__){eval('// Copyright (c) 2005  Tom Wu\n// All Rights Reserved.\n// See "LICENSE" for details.\n\n// Basic JavaScript BN library - subset useful for RSA encryption.\n\n/*\nLicensing (LICENSE)\n-------------------\n\nThis software is covered under the following copyright:\n*/\n/*\n * Copyright (c) 2003-2005  Tom Wu\n * All Rights Reserved.\n *\n * Permission is hereby granted, free of charge, to any person obtaining\n * a copy of this software and associated documentation files (the\n * "Software"), to deal in the Software without restriction, including\n * without limitation the rights to use, copy, modify, merge, publish,\n * distribute, sublicense, and/or sell copies of the Software, and to\n * permit persons to whom the Software is furnished to do so, subject to\n * the following conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY\n * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.\n *\n * IN NO EVENT SHALL TOM WU BE LIABLE FOR ANY SPECIAL, INCIDENTAL,\n * INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES WHATSOEVER\n * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR NOT ADVISED OF\n * THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF LIABILITY, ARISING OUT\n * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n *\n * In addition, the following condition applies:\n *\n * All redistributions must retain an intact copy of this copyright notice\n * and disclaimer.\n */\n/*\nAddress all questions regarding this license to:\n\n  Tom Wu\n  tjw@cs.Stanford.EDU\n*/\nvar forge = __webpack_require__(4);\n\nmodule.exports = forge.jsbn = forge.jsbn || {};\n\n// Bits per digit\nvar dbits;\n\n// JavaScript engine analysis\nvar canary = 0xdeadbeefcafe;\nvar j_lm = ((canary&0xffffff)==0xefcafe);\n\n// (public) Constructor\nfunction BigInteger(a,b,c) {\n  this.data = [];\n  if(a != null)\n    if("number" == typeof a) this.fromNumber(a,b,c);\n    else if(b == null && "string" != typeof a) this.fromString(a,256);\n    else this.fromString(a,b);\n}\nforge.jsbn.BigInteger = BigInteger;\n\n// return new, unset BigInteger\nfunction nbi() { return new BigInteger(null); }\n\n// am: Compute w_j += (x*this_i), propagate carries,\n// c is initial carry, returns final carry.\n// c < 3*dvalue, x < 2*dvalue, this_i < dvalue\n// We need to select the fastest one that works in this environment.\n\n// am1: use a single mult and divide to get the high bits,\n// max digit bits should be 26 because\n// max internal value = 2*dvalue^2-2*dvalue (< 2^53)\nfunction am1(i,x,w,j,c,n) {\n  while(--n >= 0) {\n    var v = x*this.data[i++]+w.data[j]+c;\n    c = Math.floor(v/0x4000000);\n    w.data[j++] = v&0x3ffffff;\n  }\n  return c;\n}\n// am2 avoids a big mult-and-extract completely.\n// Max digit bits should be <= 30 because we do bitwise ops\n// on values up to 2*hdvalue^2-hdvalue-1 (< 2^31)\nfunction am2(i,x,w,j,c,n) {\n  var xl = x&0x7fff, xh = x>>15;\n  while(--n >= 0) {\n    var l = this.data[i]&0x7fff;\n    var h = this.data[i++]>>15;\n    var m = xh*l+h*xl;\n    l = xl*l+((m&0x7fff)<<15)+w.data[j]+(c&0x3fffffff);\n    c = (l>>>30)+(m>>>15)+xh*h+(c>>>30);\n    w.data[j++] = l&0x3fffffff;\n  }\n  return c;\n}\n// Alternately, set max digit bits to 28 since some\n// browsers slow down when dealing with 32-bit numbers.\nfunction am3(i,x,w,j,c,n) {\n  var xl = x&0x3fff, xh = x>>14;\n  while(--n >= 0) {\n    var l = this.data[i]&0x3fff;\n    var h = this.data[i++]>>14;\n    var m = xh*l+h*xl;\n    l = xl*l+((m&0x3fff)<<14)+w.data[j]+c;\n    c = (l>>28)+(m>>14)+xh*h;\n    w.data[j++] = l&0xfffffff;\n  }\n  return c;\n}\n\n// node.js (no browser)\nif(typeof(navigator) === \'undefined\')\n{\n   BigInteger.prototype.am = am3;\n   dbits = 28;\n} else if(j_lm && (navigator.appName == "Microsoft Internet Explorer")) {\n  BigInteger.prototype.am = am2;\n  dbits = 30;\n} else if(j_lm && (navigator.appName != "Netscape")) {\n  BigInteger.prototype.am = am1;\n  dbits = 26;\n} else { // Mozilla/Netscape seems to prefer am3\n  BigInteger.prototype.am = am3;\n  dbits = 28;\n}\n\nBigInteger.prototype.DB = dbits;\nBigInteger.prototype.DM = ((1<<dbits)-1);\nBigInteger.prototype.DV = (1<<dbits);\n\nvar BI_FP = 52;\nBigInteger.prototype.FV = Math.pow(2,BI_FP);\nBigInteger.prototype.F1 = BI_FP-dbits;\nBigInteger.prototype.F2 = 2*dbits-BI_FP;\n\n// Digit conversions\nvar BI_RM = "0123456789abcdefghijklmnopqrstuvwxyz";\nvar BI_RC = new Array();\nvar rr,vv;\nrr = "0".charCodeAt(0);\nfor(vv = 0; vv <= 9; ++vv) BI_RC[rr++] = vv;\nrr = "a".charCodeAt(0);\nfor(vv = 10; vv < 36; ++vv) BI_RC[rr++] = vv;\nrr = "A".charCodeAt(0);\nfor(vv = 10; vv < 36; ++vv) BI_RC[rr++] = vv;\n\nfunction int2char(n) { return BI_RM.charAt(n); }\nfunction intAt(s,i) {\n  var c = BI_RC[s.charCodeAt(i)];\n  return (c==null)?-1:c;\n}\n\n// (protected) copy this to r\nfunction bnpCopyTo(r) {\n  for(var i = this.t-1; i >= 0; --i) r.data[i] = this.data[i];\n  r.t = this.t;\n  r.s = this.s;\n}\n\n// (protected) set from integer value x, -DV <= x < DV\nfunction bnpFromInt(x) {\n  this.t = 1;\n  this.s = (x<0)?-1:0;\n  if(x > 0) this.data[0] = x;\n  else if(x < -1) this.data[0] = x+this.DV;\n  else this.t = 0;\n}\n\n// return bigint initialized to value\nfunction nbv(i) { var r = nbi(); r.fromInt(i); return r; }\n\n// (protected) set from string and radix\nfunction bnpFromString(s,b) {\n  var k;\n  if(b == 16) k = 4;\n  else if(b == 8) k = 3;\n  else if(b == 256) k = 8; // byte array\n  else if(b == 2) k = 1;\n  else if(b == 32) k = 5;\n  else if(b == 4) k = 2;\n  else { this.fromRadix(s,b); return; }\n  this.t = 0;\n  this.s = 0;\n  var i = s.length, mi = false, sh = 0;\n  while(--i >= 0) {\n    var x = (k==8)?s[i]&0xff:intAt(s,i);\n    if(x < 0) {\n      if(s.charAt(i) == "-") mi = true;\n      continue;\n    }\n    mi = false;\n    if(sh == 0)\n      this.data[this.t++] = x;\n    else if(sh+k > this.DB) {\n      this.data[this.t-1] |= (x&((1<<(this.DB-sh))-1))<<sh;\n      this.data[this.t++] = (x>>(this.DB-sh));\n    } else\n      this.data[this.t-1] |= x<<sh;\n    sh += k;\n    if(sh >= this.DB) sh -= this.DB;\n  }\n  if(k == 8 && (s[0]&0x80) != 0) {\n    this.s = -1;\n    if(sh > 0) this.data[this.t-1] |= ((1<<(this.DB-sh))-1)<<sh;\n  }\n  this.clamp();\n  if(mi) BigInteger.ZERO.subTo(this,this);\n}\n\n// (protected) clamp off excess high words\nfunction bnpClamp() {\n  var c = this.s&this.DM;\n  while(this.t > 0 && this.data[this.t-1] == c) --this.t;\n}\n\n// (public) return string representation in given radix\nfunction bnToString(b) {\n  if(this.s < 0) return "-"+this.negate().toString(b);\n  var k;\n  if(b == 16) k = 4;\n  else if(b == 8) k = 3;\n  else if(b == 2) k = 1;\n  else if(b == 32) k = 5;\n  else if(b == 4) k = 2;\n  else return this.toRadix(b);\n  var km = (1<<k)-1, d, m = false, r = "", i = this.t;\n  var p = this.DB-(i*this.DB)%k;\n  if(i-- > 0) {\n    if(p < this.DB && (d = this.data[i]>>p) > 0) { m = true; r = int2char(d); }\n    while(i >= 0) {\n      if(p < k) {\n        d = (this.data[i]&((1<<p)-1))<<(k-p);\n        d |= this.data[--i]>>(p+=this.DB-k);\n      } else {\n        d = (this.data[i]>>(p-=k))&km;\n        if(p <= 0) { p += this.DB; --i; }\n      }\n      if(d > 0) m = true;\n      if(m) r += int2char(d);\n    }\n  }\n  return m?r:"0";\n}\n\n// (public) -this\nfunction bnNegate() { var r = nbi(); BigInteger.ZERO.subTo(this,r); return r; }\n\n// (public) |this|\nfunction bnAbs() { return (this.s<0)?this.negate():this; }\n\n// (public) return + if this > a, - if this < a, 0 if equal\nfunction bnCompareTo(a) {\n  var r = this.s-a.s;\n  if(r != 0) return r;\n  var i = this.t;\n  r = i-a.t;\n  if(r != 0) return (this.s<0)?-r:r;\n  while(--i >= 0) if((r=this.data[i]-a.data[i]) != 0) return r;\n  return 0;\n}\n\n// returns bit length of the integer x\nfunction nbits(x) {\n  var r = 1, t;\n  if((t=x>>>16) != 0) { x = t; r += 16; }\n  if((t=x>>8) != 0) { x = t; r += 8; }\n  if((t=x>>4) != 0) { x = t; r += 4; }\n  if((t=x>>2) != 0) { x = t; r += 2; }\n  if((t=x>>1) != 0) { x = t; r += 1; }\n  return r;\n}\n\n// (public) return the number of bits in "this"\nfunction bnBitLength() {\n  if(this.t <= 0) return 0;\n  return this.DB*(this.t-1)+nbits(this.data[this.t-1]^(this.s&this.DM));\n}\n\n// (protected) r = this << n*DB\nfunction bnpDLShiftTo(n,r) {\n  var i;\n  for(i = this.t-1; i >= 0; --i) r.data[i+n] = this.data[i];\n  for(i = n-1; i >= 0; --i) r.data[i] = 0;\n  r.t = this.t+n;\n  r.s = this.s;\n}\n\n// (protected) r = this >> n*DB\nfunction bnpDRShiftTo(n,r) {\n  for(var i = n; i < this.t; ++i) r.data[i-n] = this.data[i];\n  r.t = Math.max(this.t-n,0);\n  r.s = this.s;\n}\n\n// (protected) r = this << n\nfunction bnpLShiftTo(n,r) {\n  var bs = n%this.DB;\n  var cbs = this.DB-bs;\n  var bm = (1<<cbs)-1;\n  var ds = Math.floor(n/this.DB), c = (this.s<<bs)&this.DM, i;\n  for(i = this.t-1; i >= 0; --i) {\n    r.data[i+ds+1] = (this.data[i]>>cbs)|c;\n    c = (this.data[i]&bm)<<bs;\n  }\n  for(i = ds-1; i >= 0; --i) r.data[i] = 0;\n  r.data[ds] = c;\n  r.t = this.t+ds+1;\n  r.s = this.s;\n  r.clamp();\n}\n\n// (protected) r = this >> n\nfunction bnpRShiftTo(n,r) {\n  r.s = this.s;\n  var ds = Math.floor(n/this.DB);\n  if(ds >= this.t) { r.t = 0; return; }\n  var bs = n%this.DB;\n  var cbs = this.DB-bs;\n  var bm = (1<<bs)-1;\n  r.data[0] = this.data[ds]>>bs;\n  for(var i = ds+1; i < this.t; ++i) {\n    r.data[i-ds-1] |= (this.data[i]&bm)<<cbs;\n    r.data[i-ds] = this.data[i]>>bs;\n  }\n  if(bs > 0) r.data[this.t-ds-1] |= (this.s&bm)<<cbs;\n  r.t = this.t-ds;\n  r.clamp();\n}\n\n// (protected) r = this - a\nfunction bnpSubTo(a,r) {\n  var i = 0, c = 0, m = Math.min(a.t,this.t);\n  while(i < m) {\n    c += this.data[i]-a.data[i];\n    r.data[i++] = c&this.DM;\n    c >>= this.DB;\n  }\n  if(a.t < this.t) {\n    c -= a.s;\n    while(i < this.t) {\n      c += this.data[i];\n      r.data[i++] = c&this.DM;\n      c >>= this.DB;\n    }\n    c += this.s;\n  } else {\n    c += this.s;\n    while(i < a.t) {\n      c -= a.data[i];\n      r.data[i++] = c&this.DM;\n      c >>= this.DB;\n    }\n    c -= a.s;\n  }\n  r.s = (c<0)?-1:0;\n  if(c < -1) r.data[i++] = this.DV+c;\n  else if(c > 0) r.data[i++] = c;\n  r.t = i;\n  r.clamp();\n}\n\n// (protected) r = this * a, r != this,a (HAC 14.12)\n// "this" should be the larger one if appropriate.\nfunction bnpMultiplyTo(a,r) {\n  var x = this.abs(), y = a.abs();\n  var i = x.t;\n  r.t = i+y.t;\n  while(--i >= 0) r.data[i] = 0;\n  for(i = 0; i < y.t; ++i) r.data[i+x.t] = x.am(0,y.data[i],r,i,0,x.t);\n  r.s = 0;\n  r.clamp();\n  if(this.s != a.s) BigInteger.ZERO.subTo(r,r);\n}\n\n// (protected) r = this^2, r != this (HAC 14.16)\nfunction bnpSquareTo(r) {\n  var x = this.abs();\n  var i = r.t = 2*x.t;\n  while(--i >= 0) r.data[i] = 0;\n  for(i = 0; i < x.t-1; ++i) {\n    var c = x.am(i,x.data[i],r,2*i,0,1);\n    if((r.data[i+x.t]+=x.am(i+1,2*x.data[i],r,2*i+1,c,x.t-i-1)) >= x.DV) {\n      r.data[i+x.t] -= x.DV;\n      r.data[i+x.t+1] = 1;\n    }\n  }\n  if(r.t > 0) r.data[r.t-1] += x.am(i,x.data[i],r,2*i,0,1);\n  r.s = 0;\n  r.clamp();\n}\n\n// (protected) divide this by m, quotient and remainder to q, r (HAC 14.20)\n// r != q, this != m.  q or r may be null.\nfunction bnpDivRemTo(m,q,r) {\n  var pm = m.abs();\n  if(pm.t <= 0) return;\n  var pt = this.abs();\n  if(pt.t < pm.t) {\n    if(q != null) q.fromInt(0);\n    if(r != null) this.copyTo(r);\n    return;\n  }\n  if(r == null) r = nbi();\n  var y = nbi(), ts = this.s, ms = m.s;\n  var nsh = this.DB-nbits(pm.data[pm.t-1]);\t// normalize modulus\n  if(nsh > 0) { pm.lShiftTo(nsh,y); pt.lShiftTo(nsh,r); } else { pm.copyTo(y); pt.copyTo(r); }\n  var ys = y.t;\n  var y0 = y.data[ys-1];\n  if(y0 == 0) return;\n  var yt = y0*(1<<this.F1)+((ys>1)?y.data[ys-2]>>this.F2:0);\n  var d1 = this.FV/yt, d2 = (1<<this.F1)/yt, e = 1<<this.F2;\n  var i = r.t, j = i-ys, t = (q==null)?nbi():q;\n  y.dlShiftTo(j,t);\n  if(r.compareTo(t) >= 0) {\n    r.data[r.t++] = 1;\n    r.subTo(t,r);\n  }\n  BigInteger.ONE.dlShiftTo(ys,t);\n  t.subTo(y,y);\t// "negative" y so we can replace sub with am later\n  while(y.t < ys) y.data[y.t++] = 0;\n  while(--j >= 0) {\n    // Estimate quotient digit\n    var qd = (r.data[--i]==y0)?this.DM:Math.floor(r.data[i]*d1+(r.data[i-1]+e)*d2);\n    if((r.data[i]+=y.am(0,qd,r,j,0,ys)) < qd) {\t// Try it out\n      y.dlShiftTo(j,t);\n      r.subTo(t,r);\n      while(r.data[i] < --qd) r.subTo(t,r);\n    }\n  }\n  if(q != null) {\n    r.drShiftTo(ys,q);\n    if(ts != ms) BigInteger.ZERO.subTo(q,q);\n  }\n  r.t = ys;\n  r.clamp();\n  if(nsh > 0) r.rShiftTo(nsh,r);\t// Denormalize remainder\n  if(ts < 0) BigInteger.ZERO.subTo(r,r);\n}\n\n// (public) this mod a\nfunction bnMod(a) {\n  var r = nbi();\n  this.abs().divRemTo(a,null,r);\n  if(this.s < 0 && r.compareTo(BigInteger.ZERO) > 0) a.subTo(r,r);\n  return r;\n}\n\n// Modular reduction using "classic" algorithm\nfunction Classic(m) { this.m = m; }\nfunction cConvert(x) {\n  if(x.s < 0 || x.compareTo(this.m) >= 0) return x.mod(this.m);\n  else return x;\n}\nfunction cRevert(x) { return x; }\nfunction cReduce(x) { x.divRemTo(this.m,null,x); }\nfunction cMulTo(x,y,r) { x.multiplyTo(y,r); this.reduce(r); }\nfunction cSqrTo(x,r) { x.squareTo(r); this.reduce(r); }\n\nClassic.prototype.convert = cConvert;\nClassic.prototype.revert = cRevert;\nClassic.prototype.reduce = cReduce;\nClassic.prototype.mulTo = cMulTo;\nClassic.prototype.sqrTo = cSqrTo;\n\n// (protected) return "-1/this % 2^DB"; useful for Mont. reduction\n// justification:\n//         xy == 1 (mod m)\n//         xy =  1+km\n//   xy(2-xy) = (1+km)(1-km)\n// x[y(2-xy)] = 1-k^2m^2\n// x[y(2-xy)] == 1 (mod m^2)\n// if y is 1/x mod m, then y(2-xy) is 1/x mod m^2\n// should reduce x and y(2-xy) by m^2 at each step to keep size bounded.\n// JS multiply "overflows" differently from C/C++, so care is needed here.\nfunction bnpInvDigit() {\n  if(this.t < 1) return 0;\n  var x = this.data[0];\n  if((x&1) == 0) return 0;\n  var y = x&3;\t\t// y == 1/x mod 2^2\n  y = (y*(2-(x&0xf)*y))&0xf;\t// y == 1/x mod 2^4\n  y = (y*(2-(x&0xff)*y))&0xff;\t// y == 1/x mod 2^8\n  y = (y*(2-(((x&0xffff)*y)&0xffff)))&0xffff;\t// y == 1/x mod 2^16\n  // last step - calculate inverse mod DV directly;\n  // assumes 16 < DB <= 32 and assumes ability to handle 48-bit ints\n  y = (y*(2-x*y%this.DV))%this.DV;\t\t// y == 1/x mod 2^dbits\n  // we really want the negative inverse, and -DV < y < DV\n  return (y>0)?this.DV-y:-y;\n}\n\n// Montgomery reduction\nfunction Montgomery(m) {\n  this.m = m;\n  this.mp = m.invDigit();\n  this.mpl = this.mp&0x7fff;\n  this.mph = this.mp>>15;\n  this.um = (1<<(m.DB-15))-1;\n  this.mt2 = 2*m.t;\n}\n\n// xR mod m\nfunction montConvert(x) {\n  var r = nbi();\n  x.abs().dlShiftTo(this.m.t,r);\n  r.divRemTo(this.m,null,r);\n  if(x.s < 0 && r.compareTo(BigInteger.ZERO) > 0) this.m.subTo(r,r);\n  return r;\n}\n\n// x/R mod m\nfunction montRevert(x) {\n  var r = nbi();\n  x.copyTo(r);\n  this.reduce(r);\n  return r;\n}\n\n// x = x/R mod m (HAC 14.32)\nfunction montReduce(x) {\n  while(x.t <= this.mt2)\t// pad x so am has enough room later\n    x.data[x.t++] = 0;\n  for(var i = 0; i < this.m.t; ++i) {\n    // faster way of calculating u0 = x.data[i]*mp mod DV\n    var j = x.data[i]&0x7fff;\n    var u0 = (j*this.mpl+(((j*this.mph+(x.data[i]>>15)*this.mpl)&this.um)<<15))&x.DM;\n    // use am to combine the multiply-shift-add into one call\n    j = i+this.m.t;\n    x.data[j] += this.m.am(0,u0,x,i,0,this.m.t);\n    // propagate carry\n    while(x.data[j] >= x.DV) { x.data[j] -= x.DV; x.data[++j]++; }\n  }\n  x.clamp();\n  x.drShiftTo(this.m.t,x);\n  if(x.compareTo(this.m) >= 0) x.subTo(this.m,x);\n}\n\n// r = "x^2/R mod m"; x != r\nfunction montSqrTo(x,r) { x.squareTo(r); this.reduce(r); }\n\n// r = "xy/R mod m"; x,y != r\nfunction montMulTo(x,y,r) { x.multiplyTo(y,r); this.reduce(r); }\n\nMontgomery.prototype.convert = montConvert;\nMontgomery.prototype.revert = montRevert;\nMontgomery.prototype.reduce = montReduce;\nMontgomery.prototype.mulTo = montMulTo;\nMontgomery.prototype.sqrTo = montSqrTo;\n\n// (protected) true iff this is even\nfunction bnpIsEven() { return ((this.t>0)?(this.data[0]&1):this.s) == 0; }\n\n// (protected) this^e, e < 2^32, doing sqr and mul with "r" (HAC 14.79)\nfunction bnpExp(e,z) {\n  if(e > 0xffffffff || e < 1) return BigInteger.ONE;\n  var r = nbi(), r2 = nbi(), g = z.convert(this), i = nbits(e)-1;\n  g.copyTo(r);\n  while(--i >= 0) {\n    z.sqrTo(r,r2);\n    if((e&(1<<i)) > 0) z.mulTo(r2,g,r);\n    else { var t = r; r = r2; r2 = t; }\n  }\n  return z.revert(r);\n}\n\n// (public) this^e % m, 0 <= e < 2^32\nfunction bnModPowInt(e,m) {\n  var z;\n  if(e < 256 || m.isEven()) z = new Classic(m); else z = new Montgomery(m);\n  return this.exp(e,z);\n}\n\n// protected\nBigInteger.prototype.copyTo = bnpCopyTo;\nBigInteger.prototype.fromInt = bnpFromInt;\nBigInteger.prototype.fromString = bnpFromString;\nBigInteger.prototype.clamp = bnpClamp;\nBigInteger.prototype.dlShiftTo = bnpDLShiftTo;\nBigInteger.prototype.drShiftTo = bnpDRShiftTo;\nBigInteger.prototype.lShiftTo = bnpLShiftTo;\nBigInteger.prototype.rShiftTo = bnpRShiftTo;\nBigInteger.prototype.subTo = bnpSubTo;\nBigInteger.prototype.multiplyTo = bnpMultiplyTo;\nBigInteger.prototype.squareTo = bnpSquareTo;\nBigInteger.prototype.divRemTo = bnpDivRemTo;\nBigInteger.prototype.invDigit = bnpInvDigit;\nBigInteger.prototype.isEven = bnpIsEven;\nBigInteger.prototype.exp = bnpExp;\n\n// public\nBigInteger.prototype.toString = bnToString;\nBigInteger.prototype.negate = bnNegate;\nBigInteger.prototype.abs = bnAbs;\nBigInteger.prototype.compareTo = bnCompareTo;\nBigInteger.prototype.bitLength = bnBitLength;\nBigInteger.prototype.mod = bnMod;\nBigInteger.prototype.modPowInt = bnModPowInt;\n\n// "constants"\nBigInteger.ZERO = nbv(0);\nBigInteger.ONE = nbv(1);\n\n// jsbn2 lib\n\n//Copyright (c) 2005-2009  Tom Wu\n//All Rights Reserved.\n//See "LICENSE" for details (See jsbn.js for LICENSE).\n\n//Extended JavaScript BN functions, required for RSA private ops.\n\n//Version 1.1: new BigInteger("0", 10) returns "proper" zero\n\n//(public)\nfunction bnClone() { var r = nbi(); this.copyTo(r); return r; }\n\n//(public) return value as integer\nfunction bnIntValue() {\nif(this.s < 0) {\n if(this.t == 1) return this.data[0]-this.DV;\n else if(this.t == 0) return -1;\n} else if(this.t == 1) return this.data[0];\nelse if(this.t == 0) return 0;\n// assumes 16 < DB < 32\nreturn ((this.data[1]&((1<<(32-this.DB))-1))<<this.DB)|this.data[0];\n}\n\n//(public) return value as byte\nfunction bnByteValue() { return (this.t==0)?this.s:(this.data[0]<<24)>>24; }\n\n//(public) return value as short (assumes DB>=16)\nfunction bnShortValue() { return (this.t==0)?this.s:(this.data[0]<<16)>>16; }\n\n//(protected) return x s.t. r^x < DV\nfunction bnpChunkSize(r) { return Math.floor(Math.LN2*this.DB/Math.log(r)); }\n\n//(public) 0 if this == 0, 1 if this > 0\nfunction bnSigNum() {\nif(this.s < 0) return -1;\nelse if(this.t <= 0 || (this.t == 1 && this.data[0] <= 0)) return 0;\nelse return 1;\n}\n\n//(protected) convert to radix string\nfunction bnpToRadix(b) {\nif(b == null) b = 10;\nif(this.signum() == 0 || b < 2 || b > 36) return "0";\nvar cs = this.chunkSize(b);\nvar a = Math.pow(b,cs);\nvar d = nbv(a), y = nbi(), z = nbi(), r = "";\nthis.divRemTo(d,y,z);\nwhile(y.signum() > 0) {\n r = (a+z.intValue()).toString(b).substr(1) + r;\n y.divRemTo(d,y,z);\n}\nreturn z.intValue().toString(b) + r;\n}\n\n//(protected) convert from radix string\nfunction bnpFromRadix(s,b) {\nthis.fromInt(0);\nif(b == null) b = 10;\nvar cs = this.chunkSize(b);\nvar d = Math.pow(b,cs), mi = false, j = 0, w = 0;\nfor(var i = 0; i < s.length; ++i) {\n var x = intAt(s,i);\n if(x < 0) {\n   if(s.charAt(i) == "-" && this.signum() == 0) mi = true;\n   continue;\n }\n w = b*w+x;\n if(++j >= cs) {\n   this.dMultiply(d);\n   this.dAddOffset(w,0);\n   j = 0;\n   w = 0;\n }\n}\nif(j > 0) {\n this.dMultiply(Math.pow(b,j));\n this.dAddOffset(w,0);\n}\nif(mi) BigInteger.ZERO.subTo(this,this);\n}\n\n//(protected) alternate constructor\nfunction bnpFromNumber(a,b,c) {\nif("number" == typeof b) {\n // new BigInteger(int,int,RNG)\n if(a < 2) this.fromInt(1);\n else {\n   this.fromNumber(a,c);\n   if(!this.testBit(a-1))  // force MSB set\n     this.bitwiseTo(BigInteger.ONE.shiftLeft(a-1),op_or,this);\n   if(this.isEven()) this.dAddOffset(1,0); // force odd\n   while(!this.isProbablePrime(b)) {\n     this.dAddOffset(2,0);\n     if(this.bitLength() > a) this.subTo(BigInteger.ONE.shiftLeft(a-1),this);\n   }\n }\n} else {\n // new BigInteger(int,RNG)\n var x = new Array(), t = a&7;\n x.length = (a>>3)+1;\n b.nextBytes(x);\n if(t > 0) x[0] &= ((1<<t)-1); else x[0] = 0;\n this.fromString(x,256);\n}\n}\n\n//(public) convert to bigendian byte array\nfunction bnToByteArray() {\nvar i = this.t, r = new Array();\nr[0] = this.s;\nvar p = this.DB-(i*this.DB)%8, d, k = 0;\nif(i-- > 0) {\n if(p < this.DB && (d = this.data[i]>>p) != (this.s&this.DM)>>p)\n   r[k++] = d|(this.s<<(this.DB-p));\n while(i >= 0) {\n   if(p < 8) {\n     d = (this.data[i]&((1<<p)-1))<<(8-p);\n     d |= this.data[--i]>>(p+=this.DB-8);\n   } else {\n     d = (this.data[i]>>(p-=8))&0xff;\n     if(p <= 0) { p += this.DB; --i; }\n   }\n   if((d&0x80) != 0) d |= -256;\n   if(k == 0 && (this.s&0x80) != (d&0x80)) ++k;\n   if(k > 0 || d != this.s) r[k++] = d;\n }\n}\nreturn r;\n}\n\nfunction bnEquals(a) { return(this.compareTo(a)==0); }\nfunction bnMin(a) { return(this.compareTo(a)<0)?this:a; }\nfunction bnMax(a) { return(this.compareTo(a)>0)?this:a; }\n\n//(protected) r = this op a (bitwise)\nfunction bnpBitwiseTo(a,op,r) {\nvar i, f, m = Math.min(a.t,this.t);\nfor(i = 0; i < m; ++i) r.data[i] = op(this.data[i],a.data[i]);\nif(a.t < this.t) {\n f = a.s&this.DM;\n for(i = m; i < this.t; ++i) r.data[i] = op(this.data[i],f);\n r.t = this.t;\n} else {\n f = this.s&this.DM;\n for(i = m; i < a.t; ++i) r.data[i] = op(f,a.data[i]);\n r.t = a.t;\n}\nr.s = op(this.s,a.s);\nr.clamp();\n}\n\n//(public) this & a\nfunction op_and(x,y) { return x&y; }\nfunction bnAnd(a) { var r = nbi(); this.bitwiseTo(a,op_and,r); return r; }\n\n//(public) this | a\nfunction op_or(x,y) { return x|y; }\nfunction bnOr(a) { var r = nbi(); this.bitwiseTo(a,op_or,r); return r; }\n\n//(public) this ^ a\nfunction op_xor(x,y) { return x^y; }\nfunction bnXor(a) { var r = nbi(); this.bitwiseTo(a,op_xor,r); return r; }\n\n//(public) this & ~a\nfunction op_andnot(x,y) { return x&~y; }\nfunction bnAndNot(a) { var r = nbi(); this.bitwiseTo(a,op_andnot,r); return r; }\n\n//(public) ~this\nfunction bnNot() {\nvar r = nbi();\nfor(var i = 0; i < this.t; ++i) r.data[i] = this.DM&~this.data[i];\nr.t = this.t;\nr.s = ~this.s;\nreturn r;\n}\n\n//(public) this << n\nfunction bnShiftLeft(n) {\nvar r = nbi();\nif(n < 0) this.rShiftTo(-n,r); else this.lShiftTo(n,r);\nreturn r;\n}\n\n//(public) this >> n\nfunction bnShiftRight(n) {\nvar r = nbi();\nif(n < 0) this.lShiftTo(-n,r); else this.rShiftTo(n,r);\nreturn r;\n}\n\n//return index of lowest 1-bit in x, x < 2^31\nfunction lbit(x) {\nif(x == 0) return -1;\nvar r = 0;\nif((x&0xffff) == 0) { x >>= 16; r += 16; }\nif((x&0xff) == 0) { x >>= 8; r += 8; }\nif((x&0xf) == 0) { x >>= 4; r += 4; }\nif((x&3) == 0) { x >>= 2; r += 2; }\nif((x&1) == 0) ++r;\nreturn r;\n}\n\n//(public) returns index of lowest 1-bit (or -1 if none)\nfunction bnGetLowestSetBit() {\nfor(var i = 0; i < this.t; ++i)\n if(this.data[i] != 0) return i*this.DB+lbit(this.data[i]);\nif(this.s < 0) return this.t*this.DB;\nreturn -1;\n}\n\n//return number of 1 bits in x\nfunction cbit(x) {\nvar r = 0;\nwhile(x != 0) { x &= x-1; ++r; }\nreturn r;\n}\n\n//(public) return number of set bits\nfunction bnBitCount() {\nvar r = 0, x = this.s&this.DM;\nfor(var i = 0; i < this.t; ++i) r += cbit(this.data[i]^x);\nreturn r;\n}\n\n//(public) true iff nth bit is set\nfunction bnTestBit(n) {\nvar j = Math.floor(n/this.DB);\nif(j >= this.t) return(this.s!=0);\nreturn((this.data[j]&(1<<(n%this.DB)))!=0);\n}\n\n//(protected) this op (1<<n)\nfunction bnpChangeBit(n,op) {\nvar r = BigInteger.ONE.shiftLeft(n);\nthis.bitwiseTo(r,op,r);\nreturn r;\n}\n\n//(public) this | (1<<n)\nfunction bnSetBit(n) { return this.changeBit(n,op_or); }\n\n//(public) this & ~(1<<n)\nfunction bnClearBit(n) { return this.changeBit(n,op_andnot); }\n\n//(public) this ^ (1<<n)\nfunction bnFlipBit(n) { return this.changeBit(n,op_xor); }\n\n//(protected) r = this + a\nfunction bnpAddTo(a,r) {\nvar i = 0, c = 0, m = Math.min(a.t,this.t);\nwhile(i < m) {\n c += this.data[i]+a.data[i];\n r.data[i++] = c&this.DM;\n c >>= this.DB;\n}\nif(a.t < this.t) {\n c += a.s;\n while(i < this.t) {\n   c += this.data[i];\n   r.data[i++] = c&this.DM;\n   c >>= this.DB;\n }\n c += this.s;\n} else {\n c += this.s;\n while(i < a.t) {\n   c += a.data[i];\n   r.data[i++] = c&this.DM;\n   c >>= this.DB;\n }\n c += a.s;\n}\nr.s = (c<0)?-1:0;\nif(c > 0) r.data[i++] = c;\nelse if(c < -1) r.data[i++] = this.DV+c;\nr.t = i;\nr.clamp();\n}\n\n//(public) this + a\nfunction bnAdd(a) { var r = nbi(); this.addTo(a,r); return r; }\n\n//(public) this - a\nfunction bnSubtract(a) { var r = nbi(); this.subTo(a,r); return r; }\n\n//(public) this * a\nfunction bnMultiply(a) { var r = nbi(); this.multiplyTo(a,r); return r; }\n\n//(public) this / a\nfunction bnDivide(a) { var r = nbi(); this.divRemTo(a,r,null); return r; }\n\n//(public) this % a\nfunction bnRemainder(a) { var r = nbi(); this.divRemTo(a,null,r); return r; }\n\n//(public) [this/a,this%a]\nfunction bnDivideAndRemainder(a) {\nvar q = nbi(), r = nbi();\nthis.divRemTo(a,q,r);\nreturn new Array(q,r);\n}\n\n//(protected) this *= n, this >= 0, 1 < n < DV\nfunction bnpDMultiply(n) {\nthis.data[this.t] = this.am(0,n-1,this,0,0,this.t);\n++this.t;\nthis.clamp();\n}\n\n//(protected) this += n << w words, this >= 0\nfunction bnpDAddOffset(n,w) {\nif(n == 0) return;\nwhile(this.t <= w) this.data[this.t++] = 0;\nthis.data[w] += n;\nwhile(this.data[w] >= this.DV) {\n this.data[w] -= this.DV;\n if(++w >= this.t) this.data[this.t++] = 0;\n ++this.data[w];\n}\n}\n\n//A "null" reducer\nfunction NullExp() {}\nfunction nNop(x) { return x; }\nfunction nMulTo(x,y,r) { x.multiplyTo(y,r); }\nfunction nSqrTo(x,r) { x.squareTo(r); }\n\nNullExp.prototype.convert = nNop;\nNullExp.prototype.revert = nNop;\nNullExp.prototype.mulTo = nMulTo;\nNullExp.prototype.sqrTo = nSqrTo;\n\n//(public) this^e\nfunction bnPow(e) { return this.exp(e,new NullExp()); }\n\n//(protected) r = lower n words of "this * a", a.t <= n\n//"this" should be the larger one if appropriate.\nfunction bnpMultiplyLowerTo(a,n,r) {\nvar i = Math.min(this.t+a.t,n);\nr.s = 0; // assumes a,this >= 0\nr.t = i;\nwhile(i > 0) r.data[--i] = 0;\nvar j;\nfor(j = r.t-this.t; i < j; ++i) r.data[i+this.t] = this.am(0,a.data[i],r,i,0,this.t);\nfor(j = Math.min(a.t,n); i < j; ++i) this.am(0,a.data[i],r,i,0,n-i);\nr.clamp();\n}\n\n//(protected) r = "this * a" without lower n words, n > 0\n//"this" should be the larger one if appropriate.\nfunction bnpMultiplyUpperTo(a,n,r) {\n--n;\nvar i = r.t = this.t+a.t-n;\nr.s = 0; // assumes a,this >= 0\nwhile(--i >= 0) r.data[i] = 0;\nfor(i = Math.max(n-this.t,0); i < a.t; ++i)\n r.data[this.t+i-n] = this.am(n-i,a.data[i],r,0,0,this.t+i-n);\nr.clamp();\nr.drShiftTo(1,r);\n}\n\n//Barrett modular reduction\nfunction Barrett(m) {\n// setup Barrett\nthis.r2 = nbi();\nthis.q3 = nbi();\nBigInteger.ONE.dlShiftTo(2*m.t,this.r2);\nthis.mu = this.r2.divide(m);\nthis.m = m;\n}\n\nfunction barrettConvert(x) {\nif(x.s < 0 || x.t > 2*this.m.t) return x.mod(this.m);\nelse if(x.compareTo(this.m) < 0) return x;\nelse { var r = nbi(); x.copyTo(r); this.reduce(r); return r; }\n}\n\nfunction barrettRevert(x) { return x; }\n\n//x = x mod m (HAC 14.42)\nfunction barrettReduce(x) {\nx.drShiftTo(this.m.t-1,this.r2);\nif(x.t > this.m.t+1) { x.t = this.m.t+1; x.clamp(); }\nthis.mu.multiplyUpperTo(this.r2,this.m.t+1,this.q3);\nthis.m.multiplyLowerTo(this.q3,this.m.t+1,this.r2);\nwhile(x.compareTo(this.r2) < 0) x.dAddOffset(1,this.m.t+1);\nx.subTo(this.r2,x);\nwhile(x.compareTo(this.m) >= 0) x.subTo(this.m,x);\n}\n\n//r = x^2 mod m; x != r\nfunction barrettSqrTo(x,r) { x.squareTo(r); this.reduce(r); }\n\n//r = x*y mod m; x,y != r\nfunction barrettMulTo(x,y,r) { x.multiplyTo(y,r); this.reduce(r); }\n\nBarrett.prototype.convert = barrettConvert;\nBarrett.prototype.revert = barrettRevert;\nBarrett.prototype.reduce = barrettReduce;\nBarrett.prototype.mulTo = barrettMulTo;\nBarrett.prototype.sqrTo = barrettSqrTo;\n\n//(public) this^e % m (HAC 14.85)\nfunction bnModPow(e,m) {\nvar i = e.bitLength(), k, r = nbv(1), z;\nif(i <= 0) return r;\nelse if(i < 18) k = 1;\nelse if(i < 48) k = 3;\nelse if(i < 144) k = 4;\nelse if(i < 768) k = 5;\nelse k = 6;\nif(i < 8)\n z = new Classic(m);\nelse if(m.isEven())\n z = new Barrett(m);\nelse\n z = new Montgomery(m);\n\n// precomputation\nvar g = new Array(), n = 3, k1 = k-1, km = (1<<k)-1;\ng[1] = z.convert(this);\nif(k > 1) {\n var g2 = nbi();\n z.sqrTo(g[1],g2);\n while(n <= km) {\n   g[n] = nbi();\n   z.mulTo(g2,g[n-2],g[n]);\n   n += 2;\n }\n}\n\nvar j = e.t-1, w, is1 = true, r2 = nbi(), t;\ni = nbits(e.data[j])-1;\nwhile(j >= 0) {\n if(i >= k1) w = (e.data[j]>>(i-k1))&km;\n else {\n   w = (e.data[j]&((1<<(i+1))-1))<<(k1-i);\n   if(j > 0) w |= e.data[j-1]>>(this.DB+i-k1);\n }\n\n n = k;\n while((w&1) == 0) { w >>= 1; --n; }\n if((i -= n) < 0) { i += this.DB; --j; }\n if(is1) {  // ret == 1, don\'t bother squaring or multiplying it\n   g[w].copyTo(r);\n   is1 = false;\n } else {\n   while(n > 1) { z.sqrTo(r,r2); z.sqrTo(r2,r); n -= 2; }\n   if(n > 0) z.sqrTo(r,r2); else { t = r; r = r2; r2 = t; }\n   z.mulTo(r2,g[w],r);\n }\n\n while(j >= 0 && (e.data[j]&(1<<i)) == 0) {\n   z.sqrTo(r,r2); t = r; r = r2; r2 = t;\n   if(--i < 0) { i = this.DB-1; --j; }\n }\n}\nreturn z.revert(r);\n}\n\n//(public) gcd(this,a) (HAC 14.54)\nfunction bnGCD(a) {\nvar x = (this.s<0)?this.negate():this.clone();\nvar y = (a.s<0)?a.negate():a.clone();\nif(x.compareTo(y) < 0) { var t = x; x = y; y = t; }\nvar i = x.getLowestSetBit(), g = y.getLowestSetBit();\nif(g < 0) return x;\nif(i < g) g = i;\nif(g > 0) {\n x.rShiftTo(g,x);\n y.rShiftTo(g,y);\n}\nwhile(x.signum() > 0) {\n if((i = x.getLowestSetBit()) > 0) x.rShiftTo(i,x);\n if((i = y.getLowestSetBit()) > 0) y.rShiftTo(i,y);\n if(x.compareTo(y) >= 0) {\n   x.subTo(y,x);\n   x.rShiftTo(1,x);\n } else {\n   y.subTo(x,y);\n   y.rShiftTo(1,y);\n }\n}\nif(g > 0) y.lShiftTo(g,y);\nreturn y;\n}\n\n//(protected) this % n, n < 2^26\nfunction bnpModInt(n) {\nif(n <= 0) return 0;\nvar d = this.DV%n, r = (this.s<0)?n-1:0;\nif(this.t > 0)\n if(d == 0) r = this.data[0]%n;\n else for(var i = this.t-1; i >= 0; --i) r = (d*r+this.data[i])%n;\nreturn r;\n}\n\n//(public) 1/this % m (HAC 14.61)\nfunction bnModInverse(m) {\nvar ac = m.isEven();\nif((this.isEven() && ac) || m.signum() == 0) return BigInteger.ZERO;\nvar u = m.clone(), v = this.clone();\nvar a = nbv(1), b = nbv(0), c = nbv(0), d = nbv(1);\nwhile(u.signum() != 0) {\n while(u.isEven()) {\n   u.rShiftTo(1,u);\n   if(ac) {\n     if(!a.isEven() || !b.isEven()) { a.addTo(this,a); b.subTo(m,b); }\n     a.rShiftTo(1,a);\n   } else if(!b.isEven()) b.subTo(m,b);\n   b.rShiftTo(1,b);\n }\n while(v.isEven()) {\n   v.rShiftTo(1,v);\n   if(ac) {\n     if(!c.isEven() || !d.isEven()) { c.addTo(this,c); d.subTo(m,d); }\n     c.rShiftTo(1,c);\n   } else if(!d.isEven()) d.subTo(m,d);\n   d.rShiftTo(1,d);\n }\n if(u.compareTo(v) >= 0) {\n   u.subTo(v,u);\n   if(ac) a.subTo(c,a);\n   b.subTo(d,b);\n } else {\n   v.subTo(u,v);\n   if(ac) c.subTo(a,c);\n   d.subTo(b,d);\n }\n}\nif(v.compareTo(BigInteger.ONE) != 0) return BigInteger.ZERO;\nif(d.compareTo(m) >= 0) return d.subtract(m);\nif(d.signum() < 0) d.addTo(m,d); else return d;\nif(d.signum() < 0) return d.add(m); else return d;\n}\n\nvar lowprimes = [2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199,211,223,227,229,233,239,241,251,257,263,269,271,277,281,283,293,307,311,313,317,331,337,347,349,353,359,367,373,379,383,389,397,401,409,419,421,431,433,439,443,449,457,461,463,467,479,487,491,499,503,509];\nvar lplim = (1<<26)/lowprimes[lowprimes.length-1];\n\n//(public) test primality with certainty >= 1-.5^t\nfunction bnIsProbablePrime(t) {\nvar i, x = this.abs();\nif(x.t == 1 && x.data[0] <= lowprimes[lowprimes.length-1]) {\n for(i = 0; i < lowprimes.length; ++i)\n   if(x.data[0] == lowprimes[i]) return true;\n return false;\n}\nif(x.isEven()) return false;\ni = 1;\nwhile(i < lowprimes.length) {\n var m = lowprimes[i], j = i+1;\n while(j < lowprimes.length && m < lplim) m *= lowprimes[j++];\n m = x.modInt(m);\n while(i < j) if(m%lowprimes[i++] == 0) return false;\n}\nreturn x.millerRabin(t);\n}\n\n//(protected) true if probably prime (HAC 4.24, Miller-Rabin)\nfunction bnpMillerRabin(t) {\nvar n1 = this.subtract(BigInteger.ONE);\nvar k = n1.getLowestSetBit();\nif(k <= 0) return false;\nvar r = n1.shiftRight(k);\nvar prng = bnGetPrng();\nvar a;\nfor(var i = 0; i < t; ++i) {\n // select witness \'a\' at random from between 1 and n1\n do {\n   a = new BigInteger(this.bitLength(), prng);\n }\n while(a.compareTo(BigInteger.ONE) <= 0 || a.compareTo(n1) >= 0);\n var y = a.modPow(r,this);\n if(y.compareTo(BigInteger.ONE) != 0 && y.compareTo(n1) != 0) {\n   var j = 1;\n   while(j++ < k && y.compareTo(n1) != 0) {\n     y = y.modPowInt(2,this);\n     if(y.compareTo(BigInteger.ONE) == 0) return false;\n   }\n   if(y.compareTo(n1) != 0) return false;\n }\n}\nreturn true;\n}\n\n// get pseudo random number generator\nfunction bnGetPrng() {\n  // create prng with api that matches BigInteger secure random\n  return {\n    // x is an array to fill with bytes\n    nextBytes: function(x) {\n      for(var i = 0; i < x.length; ++i) {\n        x[i] = Math.floor(Math.random() * 0x0100);\n      }\n    }\n  };\n}\n\n//protected\nBigInteger.prototype.chunkSize = bnpChunkSize;\nBigInteger.prototype.toRadix = bnpToRadix;\nBigInteger.prototype.fromRadix = bnpFromRadix;\nBigInteger.prototype.fromNumber = bnpFromNumber;\nBigInteger.prototype.bitwiseTo = bnpBitwiseTo;\nBigInteger.prototype.changeBit = bnpChangeBit;\nBigInteger.prototype.addTo = bnpAddTo;\nBigInteger.prototype.dMultiply = bnpDMultiply;\nBigInteger.prototype.dAddOffset = bnpDAddOffset;\nBigInteger.prototype.multiplyLowerTo = bnpMultiplyLowerTo;\nBigInteger.prototype.multiplyUpperTo = bnpMultiplyUpperTo;\nBigInteger.prototype.modInt = bnpModInt;\nBigInteger.prototype.millerRabin = bnpMillerRabin;\n\n//public\nBigInteger.prototype.clone = bnClone;\nBigInteger.prototype.intValue = bnIntValue;\nBigInteger.prototype.byteValue = bnByteValue;\nBigInteger.prototype.shortValue = bnShortValue;\nBigInteger.prototype.signum = bnSigNum;\nBigInteger.prototype.toByteArray = bnToByteArray;\nBigInteger.prototype.equals = bnEquals;\nBigInteger.prototype.min = bnMin;\nBigInteger.prototype.max = bnMax;\nBigInteger.prototype.and = bnAnd;\nBigInteger.prototype.or = bnOr;\nBigInteger.prototype.xor = bnXor;\nBigInteger.prototype.andNot = bnAndNot;\nBigInteger.prototype.not = bnNot;\nBigInteger.prototype.shiftLeft = bnShiftLeft;\nBigInteger.prototype.shiftRight = bnShiftRight;\nBigInteger.prototype.getLowestSetBit = bnGetLowestSetBit;\nBigInteger.prototype.bitCount = bnBitCount;\nBigInteger.prototype.testBit = bnTestBit;\nBigInteger.prototype.setBit = bnSetBit;\nBigInteger.prototype.clearBit = bnClearBit;\nBigInteger.prototype.flipBit = bnFlipBit;\nBigInteger.prototype.add = bnAdd;\nBigInteger.prototype.subtract = bnSubtract;\nBigInteger.prototype.multiply = bnMultiply;\nBigInteger.prototype.divide = bnDivide;\nBigInteger.prototype.remainder = bnRemainder;\nBigInteger.prototype.divideAndRemainder = bnDivideAndRemainder;\nBigInteger.prototype.modPow = bnModPow;\nBigInteger.prototype.modInverse = bnModInverse;\nBigInteger.prototype.pow = bnPow;\nBigInteger.prototype.gcd = bnGCD;\nBigInteger.prototype.isProbablePrime = bnIsProbablePrime;\n\n//BigInteger interfaces not implemented in jsbn:\n\n//BigInteger(int signum, byte[] magnitude)\n//double doubleValue()\n//float floatValue()\n//int hashCode()\n//long longValue()\n//static BigInteger valueOf(long val)\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbm9kZS1mb3JnZS9saWIvanNibi5qcz9jMWI5Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAoYykgMjAwNSAgVG9tIFd1XG4vLyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuLy8gU2VlIFwiTElDRU5TRVwiIGZvciBkZXRhaWxzLlxuXG4vLyBCYXNpYyBKYXZhU2NyaXB0IEJOIGxpYnJhcnkgLSBzdWJzZXQgdXNlZnVsIGZvciBSU0EgZW5jcnlwdGlvbi5cblxuLypcbkxpY2Vuc2luZyAoTElDRU5TRSlcbi0tLS0tLS0tLS0tLS0tLS0tLS1cblxuVGhpcyBzb2Z0d2FyZSBpcyBjb3ZlcmVkIHVuZGVyIHRoZSBmb2xsb3dpbmcgY29weXJpZ2h0OlxuKi9cbi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNSAgVG9tIFd1XG4gKiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZ1xuICogYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4gKiBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbiAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbiAqIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0b1xuICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvXG4gKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gKlxuICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmVcbiAqIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuICpcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTLUlTXCIgQU5EIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsXG4gKiBFWFBSRVNTLCBJTVBMSUVEIE9SIE9USEVSV0lTRSwgSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiwgQU5ZXG4gKiBXQVJSQU5UWSBPRiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuXG4gKlxuICogSU4gTk8gRVZFTlQgU0hBTEwgVE9NIFdVIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElOQ0lERU5UQUwsXG4gKiBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT0YgQU5ZIEtJTkQsIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVJcbiAqIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgT1IgTk9UIEFEVklTRUQgT0ZcbiAqIFRIRSBQT1NTSUJJTElUWSBPRiBEQU1BR0UsIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgQVJJU0lORyBPVVRcbiAqIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuXG4gKlxuICogSW4gYWRkaXRpb24sIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uIGFwcGxpZXM6XG4gKlxuICogQWxsIHJlZGlzdHJpYnV0aW9ucyBtdXN0IHJldGFpbiBhbiBpbnRhY3QgY29weSBvZiB0aGlzIGNvcHlyaWdodCBub3RpY2VcbiAqIGFuZCBkaXNjbGFpbWVyLlxuICovXG4vKlxuQWRkcmVzcyBhbGwgcXVlc3Rpb25zIHJlZ2FyZGluZyB0aGlzIGxpY2Vuc2UgdG86XG5cbiAgVG9tIFd1XG4gIHRqd0Bjcy5TdGFuZm9yZC5FRFVcbiovXG52YXIgZm9yZ2UgPSByZXF1aXJlKCcuL2ZvcmdlJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZm9yZ2UuanNibiA9IGZvcmdlLmpzYm4gfHwge307XG5cbi8vIEJpdHMgcGVyIGRpZ2l0XG52YXIgZGJpdHM7XG5cbi8vIEphdmFTY3JpcHQgZW5naW5lIGFuYWx5c2lzXG52YXIgY2FuYXJ5ID0gMHhkZWFkYmVlZmNhZmU7XG52YXIgal9sbSA9ICgoY2FuYXJ5JjB4ZmZmZmZmKT09MHhlZmNhZmUpO1xuXG4vLyAocHVibGljKSBDb25zdHJ1Y3RvclxuZnVuY3Rpb24gQmlnSW50ZWdlcihhLGIsYykge1xuICB0aGlzLmRhdGEgPSBbXTtcbiAgaWYoYSAhPSBudWxsKVxuICAgIGlmKFwibnVtYmVyXCIgPT0gdHlwZW9mIGEpIHRoaXMuZnJvbU51bWJlcihhLGIsYyk7XG4gICAgZWxzZSBpZihiID09IG51bGwgJiYgXCJzdHJpbmdcIiAhPSB0eXBlb2YgYSkgdGhpcy5mcm9tU3RyaW5nKGEsMjU2KTtcbiAgICBlbHNlIHRoaXMuZnJvbVN0cmluZyhhLGIpO1xufVxuZm9yZ2UuanNibi5CaWdJbnRlZ2VyID0gQmlnSW50ZWdlcjtcblxuLy8gcmV0dXJuIG5ldywgdW5zZXQgQmlnSW50ZWdlclxuZnVuY3Rpb24gbmJpKCkgeyByZXR1cm4gbmV3IEJpZ0ludGVnZXIobnVsbCk7IH1cblxuLy8gYW06IENvbXB1dGUgd19qICs9ICh4KnRoaXNfaSksIHByb3BhZ2F0ZSBjYXJyaWVzLFxuLy8gYyBpcyBpbml0aWFsIGNhcnJ5LCByZXR1cm5zIGZpbmFsIGNhcnJ5LlxuLy8gYyA8IDMqZHZhbHVlLCB4IDwgMipkdmFsdWUsIHRoaXNfaSA8IGR2YWx1ZVxuLy8gV2UgbmVlZCB0byBzZWxlY3QgdGhlIGZhc3Rlc3Qgb25lIHRoYXQgd29ya3MgaW4gdGhpcyBlbnZpcm9ubWVudC5cblxuLy8gYW0xOiB1c2UgYSBzaW5nbGUgbXVsdCBhbmQgZGl2aWRlIHRvIGdldCB0aGUgaGlnaCBiaXRzLFxuLy8gbWF4IGRpZ2l0IGJpdHMgc2hvdWxkIGJlIDI2IGJlY2F1c2Vcbi8vIG1heCBpbnRlcm5hbCB2YWx1ZSA9IDIqZHZhbHVlXjItMipkdmFsdWUgKDwgMl41MylcbmZ1bmN0aW9uIGFtMShpLHgsdyxqLGMsbikge1xuICB3aGlsZSgtLW4gPj0gMCkge1xuICAgIHZhciB2ID0geCp0aGlzLmRhdGFbaSsrXSt3LmRhdGFbal0rYztcbiAgICBjID0gTWF0aC5mbG9vcih2LzB4NDAwMDAwMCk7XG4gICAgdy5kYXRhW2orK10gPSB2JjB4M2ZmZmZmZjtcbiAgfVxuICByZXR1cm4gYztcbn1cbi8vIGFtMiBhdm9pZHMgYSBiaWcgbXVsdC1hbmQtZXh0cmFjdCBjb21wbGV0ZWx5LlxuLy8gTWF4IGRpZ2l0IGJpdHMgc2hvdWxkIGJlIDw9IDMwIGJlY2F1c2Ugd2UgZG8gYml0d2lzZSBvcHNcbi8vIG9uIHZhbHVlcyB1cCB0byAyKmhkdmFsdWVeMi1oZHZhbHVlLTEgKDwgMl4zMSlcbmZ1bmN0aW9uIGFtMihpLHgsdyxqLGMsbikge1xuICB2YXIgeGwgPSB4JjB4N2ZmZiwgeGggPSB4Pj4xNTtcbiAgd2hpbGUoLS1uID49IDApIHtcbiAgICB2YXIgbCA9IHRoaXMuZGF0YVtpXSYweDdmZmY7XG4gICAgdmFyIGggPSB0aGlzLmRhdGFbaSsrXT4+MTU7XG4gICAgdmFyIG0gPSB4aCpsK2gqeGw7XG4gICAgbCA9IHhsKmwrKChtJjB4N2ZmZik8PDE1KSt3LmRhdGFbal0rKGMmMHgzZmZmZmZmZik7XG4gICAgYyA9IChsPj4+MzApKyhtPj4+MTUpK3hoKmgrKGM+Pj4zMCk7XG4gICAgdy5kYXRhW2orK10gPSBsJjB4M2ZmZmZmZmY7XG4gIH1cbiAgcmV0dXJuIGM7XG59XG4vLyBBbHRlcm5hdGVseSwgc2V0IG1heCBkaWdpdCBiaXRzIHRvIDI4IHNpbmNlIHNvbWVcbi8vIGJyb3dzZXJzIHNsb3cgZG93biB3aGVuIGRlYWxpbmcgd2l0aCAzMi1iaXQgbnVtYmVycy5cbmZ1bmN0aW9uIGFtMyhpLHgsdyxqLGMsbikge1xuICB2YXIgeGwgPSB4JjB4M2ZmZiwgeGggPSB4Pj4xNDtcbiAgd2hpbGUoLS1uID49IDApIHtcbiAgICB2YXIgbCA9IHRoaXMuZGF0YVtpXSYweDNmZmY7XG4gICAgdmFyIGggPSB0aGlzLmRhdGFbaSsrXT4+MTQ7XG4gICAgdmFyIG0gPSB4aCpsK2gqeGw7XG4gICAgbCA9IHhsKmwrKChtJjB4M2ZmZik8PDE0KSt3LmRhdGFbal0rYztcbiAgICBjID0gKGw+PjI4KSsobT4+MTQpK3hoKmg7XG4gICAgdy5kYXRhW2orK10gPSBsJjB4ZmZmZmZmZjtcbiAgfVxuICByZXR1cm4gYztcbn1cblxuLy8gbm9kZS5qcyAobm8gYnJvd3NlcilcbmlmKHR5cGVvZihuYXZpZ2F0b3IpID09PSAndW5kZWZpbmVkJylcbntcbiAgIEJpZ0ludGVnZXIucHJvdG90eXBlLmFtID0gYW0zO1xuICAgZGJpdHMgPSAyODtcbn0gZWxzZSBpZihqX2xtICYmIChuYXZpZ2F0b3IuYXBwTmFtZSA9PSBcIk1pY3Jvc29mdCBJbnRlcm5ldCBFeHBsb3JlclwiKSkge1xuICBCaWdJbnRlZ2VyLnByb3RvdHlwZS5hbSA9IGFtMjtcbiAgZGJpdHMgPSAzMDtcbn0gZWxzZSBpZihqX2xtICYmIChuYXZpZ2F0b3IuYXBwTmFtZSAhPSBcIk5ldHNjYXBlXCIpKSB7XG4gIEJpZ0ludGVnZXIucHJvdG90eXBlLmFtID0gYW0xO1xuICBkYml0cyA9IDI2O1xufSBlbHNlIHsgLy8gTW96aWxsYS9OZXRzY2FwZSBzZWVtcyB0byBwcmVmZXIgYW0zXG4gIEJpZ0ludGVnZXIucHJvdG90eXBlLmFtID0gYW0zO1xuICBkYml0cyA9IDI4O1xufVxuXG5CaWdJbnRlZ2VyLnByb3RvdHlwZS5EQiA9IGRiaXRzO1xuQmlnSW50ZWdlci5wcm90b3R5cGUuRE0gPSAoKDE8PGRiaXRzKS0xKTtcbkJpZ0ludGVnZXIucHJvdG90eXBlLkRWID0gKDE8PGRiaXRzKTtcblxudmFyIEJJX0ZQID0gNTI7XG5CaWdJbnRlZ2VyLnByb3RvdHlwZS5GViA9IE1hdGgucG93KDIsQklfRlApO1xuQmlnSW50ZWdlci5wcm90b3R5cGUuRjEgPSBCSV9GUC1kYml0cztcbkJpZ0ludGVnZXIucHJvdG90eXBlLkYyID0gMipkYml0cy1CSV9GUDtcblxuLy8gRGlnaXQgY29udmVyc2lvbnNcbnZhciBCSV9STSA9IFwiMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6XCI7XG52YXIgQklfUkMgPSBuZXcgQXJyYXkoKTtcbnZhciBycix2djtcbnJyID0gXCIwXCIuY2hhckNvZGVBdCgwKTtcbmZvcih2diA9IDA7IHZ2IDw9IDk7ICsrdnYpIEJJX1JDW3JyKytdID0gdnY7XG5yciA9IFwiYVwiLmNoYXJDb2RlQXQoMCk7XG5mb3IodnYgPSAxMDsgdnYgPCAzNjsgKyt2dikgQklfUkNbcnIrK10gPSB2djtcbnJyID0gXCJBXCIuY2hhckNvZGVBdCgwKTtcbmZvcih2diA9IDEwOyB2diA8IDM2OyArK3Z2KSBCSV9SQ1tycisrXSA9IHZ2O1xuXG5mdW5jdGlvbiBpbnQyY2hhcihuKSB7IHJldHVybiBCSV9STS5jaGFyQXQobik7IH1cbmZ1bmN0aW9uIGludEF0KHMsaSkge1xuICB2YXIgYyA9IEJJX1JDW3MuY2hhckNvZGVBdChpKV07XG4gIHJldHVybiAoYz09bnVsbCk/LTE6Yztcbn1cblxuLy8gKHByb3RlY3RlZCkgY29weSB0aGlzIHRvIHJcbmZ1bmN0aW9uIGJucENvcHlUbyhyKSB7XG4gIGZvcih2YXIgaSA9IHRoaXMudC0xOyBpID49IDA7IC0taSkgci5kYXRhW2ldID0gdGhpcy5kYXRhW2ldO1xuICByLnQgPSB0aGlzLnQ7XG4gIHIucyA9IHRoaXMucztcbn1cblxuLy8gKHByb3RlY3RlZCkgc2V0IGZyb20gaW50ZWdlciB2YWx1ZSB4LCAtRFYgPD0geCA8IERWXG5mdW5jdGlvbiBibnBGcm9tSW50KHgpIHtcbiAgdGhpcy50ID0gMTtcbiAgdGhpcy5zID0gKHg8MCk/LTE6MDtcbiAgaWYoeCA+IDApIHRoaXMuZGF0YVswXSA9IHg7XG4gIGVsc2UgaWYoeCA8IC0xKSB0aGlzLmRhdGFbMF0gPSB4K3RoaXMuRFY7XG4gIGVsc2UgdGhpcy50ID0gMDtcbn1cblxuLy8gcmV0dXJuIGJpZ2ludCBpbml0aWFsaXplZCB0byB2YWx1ZVxuZnVuY3Rpb24gbmJ2KGkpIHsgdmFyIHIgPSBuYmkoKTsgci5mcm9tSW50KGkpOyByZXR1cm4gcjsgfVxuXG4vLyAocHJvdGVjdGVkKSBzZXQgZnJvbSBzdHJpbmcgYW5kIHJhZGl4XG5mdW5jdGlvbiBibnBGcm9tU3RyaW5nKHMsYikge1xuICB2YXIgaztcbiAgaWYoYiA9PSAxNikgayA9IDQ7XG4gIGVsc2UgaWYoYiA9PSA4KSBrID0gMztcbiAgZWxzZSBpZihiID09IDI1NikgayA9IDg7IC8vIGJ5dGUgYXJyYXlcbiAgZWxzZSBpZihiID09IDIpIGsgPSAxO1xuICBlbHNlIGlmKGIgPT0gMzIpIGsgPSA1O1xuICBlbHNlIGlmKGIgPT0gNCkgayA9IDI7XG4gIGVsc2UgeyB0aGlzLmZyb21SYWRpeChzLGIpOyByZXR1cm47IH1cbiAgdGhpcy50ID0gMDtcbiAgdGhpcy5zID0gMDtcbiAgdmFyIGkgPSBzLmxlbmd0aCwgbWkgPSBmYWxzZSwgc2ggPSAwO1xuICB3aGlsZSgtLWkgPj0gMCkge1xuICAgIHZhciB4ID0gKGs9PTgpP3NbaV0mMHhmZjppbnRBdChzLGkpO1xuICAgIGlmKHggPCAwKSB7XG4gICAgICBpZihzLmNoYXJBdChpKSA9PSBcIi1cIikgbWkgPSB0cnVlO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIG1pID0gZmFsc2U7XG4gICAgaWYoc2ggPT0gMClcbiAgICAgIHRoaXMuZGF0YVt0aGlzLnQrK10gPSB4O1xuICAgIGVsc2UgaWYoc2grayA+IHRoaXMuREIpIHtcbiAgICAgIHRoaXMuZGF0YVt0aGlzLnQtMV0gfD0gKHgmKCgxPDwodGhpcy5EQi1zaCkpLTEpKTw8c2g7XG4gICAgICB0aGlzLmRhdGFbdGhpcy50KytdID0gKHg+Pih0aGlzLkRCLXNoKSk7XG4gICAgfSBlbHNlXG4gICAgICB0aGlzLmRhdGFbdGhpcy50LTFdIHw9IHg8PHNoO1xuICAgIHNoICs9IGs7XG4gICAgaWYoc2ggPj0gdGhpcy5EQikgc2ggLT0gdGhpcy5EQjtcbiAgfVxuICBpZihrID09IDggJiYgKHNbMF0mMHg4MCkgIT0gMCkge1xuICAgIHRoaXMucyA9IC0xO1xuICAgIGlmKHNoID4gMCkgdGhpcy5kYXRhW3RoaXMudC0xXSB8PSAoKDE8PCh0aGlzLkRCLXNoKSktMSk8PHNoO1xuICB9XG4gIHRoaXMuY2xhbXAoKTtcbiAgaWYobWkpIEJpZ0ludGVnZXIuWkVSTy5zdWJUbyh0aGlzLHRoaXMpO1xufVxuXG4vLyAocHJvdGVjdGVkKSBjbGFtcCBvZmYgZXhjZXNzIGhpZ2ggd29yZHNcbmZ1bmN0aW9uIGJucENsYW1wKCkge1xuICB2YXIgYyA9IHRoaXMucyZ0aGlzLkRNO1xuICB3aGlsZSh0aGlzLnQgPiAwICYmIHRoaXMuZGF0YVt0aGlzLnQtMV0gPT0gYykgLS10aGlzLnQ7XG59XG5cbi8vIChwdWJsaWMpIHJldHVybiBzdHJpbmcgcmVwcmVzZW50YXRpb24gaW4gZ2l2ZW4gcmFkaXhcbmZ1bmN0aW9uIGJuVG9TdHJpbmcoYikge1xuICBpZih0aGlzLnMgPCAwKSByZXR1cm4gXCItXCIrdGhpcy5uZWdhdGUoKS50b1N0cmluZyhiKTtcbiAgdmFyIGs7XG4gIGlmKGIgPT0gMTYpIGsgPSA0O1xuICBlbHNlIGlmKGIgPT0gOCkgayA9IDM7XG4gIGVsc2UgaWYoYiA9PSAyKSBrID0gMTtcbiAgZWxzZSBpZihiID09IDMyKSBrID0gNTtcbiAgZWxzZSBpZihiID09IDQpIGsgPSAyO1xuICBlbHNlIHJldHVybiB0aGlzLnRvUmFkaXgoYik7XG4gIHZhciBrbSA9ICgxPDxrKS0xLCBkLCBtID0gZmFsc2UsIHIgPSBcIlwiLCBpID0gdGhpcy50O1xuICB2YXIgcCA9IHRoaXMuREItKGkqdGhpcy5EQiklaztcbiAgaWYoaS0tID4gMCkge1xuICAgIGlmKHAgPCB0aGlzLkRCICYmIChkID0gdGhpcy5kYXRhW2ldPj5wKSA+IDApIHsgbSA9IHRydWU7IHIgPSBpbnQyY2hhcihkKTsgfVxuICAgIHdoaWxlKGkgPj0gMCkge1xuICAgICAgaWYocCA8IGspIHtcbiAgICAgICAgZCA9ICh0aGlzLmRhdGFbaV0mKCgxPDxwKS0xKSk8PChrLXApO1xuICAgICAgICBkIHw9IHRoaXMuZGF0YVstLWldPj4ocCs9dGhpcy5EQi1rKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGQgPSAodGhpcy5kYXRhW2ldPj4ocC09aykpJmttO1xuICAgICAgICBpZihwIDw9IDApIHsgcCArPSB0aGlzLkRCOyAtLWk7IH1cbiAgICAgIH1cbiAgICAgIGlmKGQgPiAwKSBtID0gdHJ1ZTtcbiAgICAgIGlmKG0pIHIgKz0gaW50MmNoYXIoZCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBtP3I6XCIwXCI7XG59XG5cbi8vIChwdWJsaWMpIC10aGlzXG5mdW5jdGlvbiBibk5lZ2F0ZSgpIHsgdmFyIHIgPSBuYmkoKTsgQmlnSW50ZWdlci5aRVJPLnN1YlRvKHRoaXMscik7IHJldHVybiByOyB9XG5cbi8vIChwdWJsaWMpIHx0aGlzfFxuZnVuY3Rpb24gYm5BYnMoKSB7IHJldHVybiAodGhpcy5zPDApP3RoaXMubmVnYXRlKCk6dGhpczsgfVxuXG4vLyAocHVibGljKSByZXR1cm4gKyBpZiB0aGlzID4gYSwgLSBpZiB0aGlzIDwgYSwgMCBpZiBlcXVhbFxuZnVuY3Rpb24gYm5Db21wYXJlVG8oYSkge1xuICB2YXIgciA9IHRoaXMucy1hLnM7XG4gIGlmKHIgIT0gMCkgcmV0dXJuIHI7XG4gIHZhciBpID0gdGhpcy50O1xuICByID0gaS1hLnQ7XG4gIGlmKHIgIT0gMCkgcmV0dXJuICh0aGlzLnM8MCk/LXI6cjtcbiAgd2hpbGUoLS1pID49IDApIGlmKChyPXRoaXMuZGF0YVtpXS1hLmRhdGFbaV0pICE9IDApIHJldHVybiByO1xuICByZXR1cm4gMDtcbn1cblxuLy8gcmV0dXJucyBiaXQgbGVuZ3RoIG9mIHRoZSBpbnRlZ2VyIHhcbmZ1bmN0aW9uIG5iaXRzKHgpIHtcbiAgdmFyIHIgPSAxLCB0O1xuICBpZigodD14Pj4+MTYpICE9IDApIHsgeCA9IHQ7IHIgKz0gMTY7IH1cbiAgaWYoKHQ9eD4+OCkgIT0gMCkgeyB4ID0gdDsgciArPSA4OyB9XG4gIGlmKCh0PXg+PjQpICE9IDApIHsgeCA9IHQ7IHIgKz0gNDsgfVxuICBpZigodD14Pj4yKSAhPSAwKSB7IHggPSB0OyByICs9IDI7IH1cbiAgaWYoKHQ9eD4+MSkgIT0gMCkgeyB4ID0gdDsgciArPSAxOyB9XG4gIHJldHVybiByO1xufVxuXG4vLyAocHVibGljKSByZXR1cm4gdGhlIG51bWJlciBvZiBiaXRzIGluIFwidGhpc1wiXG5mdW5jdGlvbiBibkJpdExlbmd0aCgpIHtcbiAgaWYodGhpcy50IDw9IDApIHJldHVybiAwO1xuICByZXR1cm4gdGhpcy5EQioodGhpcy50LTEpK25iaXRzKHRoaXMuZGF0YVt0aGlzLnQtMV1eKHRoaXMucyZ0aGlzLkRNKSk7XG59XG5cbi8vIChwcm90ZWN0ZWQpIHIgPSB0aGlzIDw8IG4qREJcbmZ1bmN0aW9uIGJucERMU2hpZnRUbyhuLHIpIHtcbiAgdmFyIGk7XG4gIGZvcihpID0gdGhpcy50LTE7IGkgPj0gMDsgLS1pKSByLmRhdGFbaStuXSA9IHRoaXMuZGF0YVtpXTtcbiAgZm9yKGkgPSBuLTE7IGkgPj0gMDsgLS1pKSByLmRhdGFbaV0gPSAwO1xuICByLnQgPSB0aGlzLnQrbjtcbiAgci5zID0gdGhpcy5zO1xufVxuXG4vLyAocHJvdGVjdGVkKSByID0gdGhpcyA+PiBuKkRCXG5mdW5jdGlvbiBibnBEUlNoaWZ0VG8obixyKSB7XG4gIGZvcih2YXIgaSA9IG47IGkgPCB0aGlzLnQ7ICsraSkgci5kYXRhW2ktbl0gPSB0aGlzLmRhdGFbaV07XG4gIHIudCA9IE1hdGgubWF4KHRoaXMudC1uLDApO1xuICByLnMgPSB0aGlzLnM7XG59XG5cbi8vIChwcm90ZWN0ZWQpIHIgPSB0aGlzIDw8IG5cbmZ1bmN0aW9uIGJucExTaGlmdFRvKG4scikge1xuICB2YXIgYnMgPSBuJXRoaXMuREI7XG4gIHZhciBjYnMgPSB0aGlzLkRCLWJzO1xuICB2YXIgYm0gPSAoMTw8Y2JzKS0xO1xuICB2YXIgZHMgPSBNYXRoLmZsb29yKG4vdGhpcy5EQiksIGMgPSAodGhpcy5zPDxicykmdGhpcy5ETSwgaTtcbiAgZm9yKGkgPSB0aGlzLnQtMTsgaSA+PSAwOyAtLWkpIHtcbiAgICByLmRhdGFbaStkcysxXSA9ICh0aGlzLmRhdGFbaV0+PmNicyl8YztcbiAgICBjID0gKHRoaXMuZGF0YVtpXSZibSk8PGJzO1xuICB9XG4gIGZvcihpID0gZHMtMTsgaSA+PSAwOyAtLWkpIHIuZGF0YVtpXSA9IDA7XG4gIHIuZGF0YVtkc10gPSBjO1xuICByLnQgPSB0aGlzLnQrZHMrMTtcbiAgci5zID0gdGhpcy5zO1xuICByLmNsYW1wKCk7XG59XG5cbi8vIChwcm90ZWN0ZWQpIHIgPSB0aGlzID4+IG5cbmZ1bmN0aW9uIGJucFJTaGlmdFRvKG4scikge1xuICByLnMgPSB0aGlzLnM7XG4gIHZhciBkcyA9IE1hdGguZmxvb3Iobi90aGlzLkRCKTtcbiAgaWYoZHMgPj0gdGhpcy50KSB7IHIudCA9IDA7IHJldHVybjsgfVxuICB2YXIgYnMgPSBuJXRoaXMuREI7XG4gIHZhciBjYnMgPSB0aGlzLkRCLWJzO1xuICB2YXIgYm0gPSAoMTw8YnMpLTE7XG4gIHIuZGF0YVswXSA9IHRoaXMuZGF0YVtkc10+PmJzO1xuICBmb3IodmFyIGkgPSBkcysxOyBpIDwgdGhpcy50OyArK2kpIHtcbiAgICByLmRhdGFbaS1kcy0xXSB8PSAodGhpcy5kYXRhW2ldJmJtKTw8Y2JzO1xuICAgIHIuZGF0YVtpLWRzXSA9IHRoaXMuZGF0YVtpXT4+YnM7XG4gIH1cbiAgaWYoYnMgPiAwKSByLmRhdGFbdGhpcy50LWRzLTFdIHw9ICh0aGlzLnMmYm0pPDxjYnM7XG4gIHIudCA9IHRoaXMudC1kcztcbiAgci5jbGFtcCgpO1xufVxuXG4vLyAocHJvdGVjdGVkKSByID0gdGhpcyAtIGFcbmZ1bmN0aW9uIGJucFN1YlRvKGEscikge1xuICB2YXIgaSA9IDAsIGMgPSAwLCBtID0gTWF0aC5taW4oYS50LHRoaXMudCk7XG4gIHdoaWxlKGkgPCBtKSB7XG4gICAgYyArPSB0aGlzLmRhdGFbaV0tYS5kYXRhW2ldO1xuICAgIHIuZGF0YVtpKytdID0gYyZ0aGlzLkRNO1xuICAgIGMgPj49IHRoaXMuREI7XG4gIH1cbiAgaWYoYS50IDwgdGhpcy50KSB7XG4gICAgYyAtPSBhLnM7XG4gICAgd2hpbGUoaSA8IHRoaXMudCkge1xuICAgICAgYyArPSB0aGlzLmRhdGFbaV07XG4gICAgICByLmRhdGFbaSsrXSA9IGMmdGhpcy5ETTtcbiAgICAgIGMgPj49IHRoaXMuREI7XG4gICAgfVxuICAgIGMgKz0gdGhpcy5zO1xuICB9IGVsc2Uge1xuICAgIGMgKz0gdGhpcy5zO1xuICAgIHdoaWxlKGkgPCBhLnQpIHtcbiAgICAgIGMgLT0gYS5kYXRhW2ldO1xuICAgICAgci5kYXRhW2krK10gPSBjJnRoaXMuRE07XG4gICAgICBjID4+PSB0aGlzLkRCO1xuICAgIH1cbiAgICBjIC09IGEucztcbiAgfVxuICByLnMgPSAoYzwwKT8tMTowO1xuICBpZihjIDwgLTEpIHIuZGF0YVtpKytdID0gdGhpcy5EVitjO1xuICBlbHNlIGlmKGMgPiAwKSByLmRhdGFbaSsrXSA9IGM7XG4gIHIudCA9IGk7XG4gIHIuY2xhbXAoKTtcbn1cblxuLy8gKHByb3RlY3RlZCkgciA9IHRoaXMgKiBhLCByICE9IHRoaXMsYSAoSEFDIDE0LjEyKVxuLy8gXCJ0aGlzXCIgc2hvdWxkIGJlIHRoZSBsYXJnZXIgb25lIGlmIGFwcHJvcHJpYXRlLlxuZnVuY3Rpb24gYm5wTXVsdGlwbHlUbyhhLHIpIHtcbiAgdmFyIHggPSB0aGlzLmFicygpLCB5ID0gYS5hYnMoKTtcbiAgdmFyIGkgPSB4LnQ7XG4gIHIudCA9IGkreS50O1xuICB3aGlsZSgtLWkgPj0gMCkgci5kYXRhW2ldID0gMDtcbiAgZm9yKGkgPSAwOyBpIDwgeS50OyArK2kpIHIuZGF0YVtpK3gudF0gPSB4LmFtKDAseS5kYXRhW2ldLHIsaSwwLHgudCk7XG4gIHIucyA9IDA7XG4gIHIuY2xhbXAoKTtcbiAgaWYodGhpcy5zICE9IGEucykgQmlnSW50ZWdlci5aRVJPLnN1YlRvKHIscik7XG59XG5cbi8vIChwcm90ZWN0ZWQpIHIgPSB0aGlzXjIsIHIgIT0gdGhpcyAoSEFDIDE0LjE2KVxuZnVuY3Rpb24gYm5wU3F1YXJlVG8ocikge1xuICB2YXIgeCA9IHRoaXMuYWJzKCk7XG4gIHZhciBpID0gci50ID0gMip4LnQ7XG4gIHdoaWxlKC0taSA+PSAwKSByLmRhdGFbaV0gPSAwO1xuICBmb3IoaSA9IDA7IGkgPCB4LnQtMTsgKytpKSB7XG4gICAgdmFyIGMgPSB4LmFtKGkseC5kYXRhW2ldLHIsMippLDAsMSk7XG4gICAgaWYoKHIuZGF0YVtpK3gudF0rPXguYW0oaSsxLDIqeC5kYXRhW2ldLHIsMippKzEsYyx4LnQtaS0xKSkgPj0geC5EVikge1xuICAgICAgci5kYXRhW2kreC50XSAtPSB4LkRWO1xuICAgICAgci5kYXRhW2kreC50KzFdID0gMTtcbiAgICB9XG4gIH1cbiAgaWYoci50ID4gMCkgci5kYXRhW3IudC0xXSArPSB4LmFtKGkseC5kYXRhW2ldLHIsMippLDAsMSk7XG4gIHIucyA9IDA7XG4gIHIuY2xhbXAoKTtcbn1cblxuLy8gKHByb3RlY3RlZCkgZGl2aWRlIHRoaXMgYnkgbSwgcXVvdGllbnQgYW5kIHJlbWFpbmRlciB0byBxLCByIChIQUMgMTQuMjApXG4vLyByICE9IHEsIHRoaXMgIT0gbS4gIHEgb3IgciBtYXkgYmUgbnVsbC5cbmZ1bmN0aW9uIGJucERpdlJlbVRvKG0scSxyKSB7XG4gIHZhciBwbSA9IG0uYWJzKCk7XG4gIGlmKHBtLnQgPD0gMCkgcmV0dXJuO1xuICB2YXIgcHQgPSB0aGlzLmFicygpO1xuICBpZihwdC50IDwgcG0udCkge1xuICAgIGlmKHEgIT0gbnVsbCkgcS5mcm9tSW50KDApO1xuICAgIGlmKHIgIT0gbnVsbCkgdGhpcy5jb3B5VG8ocik7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmKHIgPT0gbnVsbCkgciA9IG5iaSgpO1xuICB2YXIgeSA9IG5iaSgpLCB0cyA9IHRoaXMucywgbXMgPSBtLnM7XG4gIHZhciBuc2ggPSB0aGlzLkRCLW5iaXRzKHBtLmRhdGFbcG0udC0xXSk7XHQvLyBub3JtYWxpemUgbW9kdWx1c1xuICBpZihuc2ggPiAwKSB7IHBtLmxTaGlmdFRvKG5zaCx5KTsgcHQubFNoaWZ0VG8obnNoLHIpOyB9IGVsc2UgeyBwbS5jb3B5VG8oeSk7IHB0LmNvcHlUbyhyKTsgfVxuICB2YXIgeXMgPSB5LnQ7XG4gIHZhciB5MCA9IHkuZGF0YVt5cy0xXTtcbiAgaWYoeTAgPT0gMCkgcmV0dXJuO1xuICB2YXIgeXQgPSB5MCooMTw8dGhpcy5GMSkrKCh5cz4xKT95LmRhdGFbeXMtMl0+PnRoaXMuRjI6MCk7XG4gIHZhciBkMSA9IHRoaXMuRlYveXQsIGQyID0gKDE8PHRoaXMuRjEpL3l0LCBlID0gMTw8dGhpcy5GMjtcbiAgdmFyIGkgPSByLnQsIGogPSBpLXlzLCB0ID0gKHE9PW51bGwpP25iaSgpOnE7XG4gIHkuZGxTaGlmdFRvKGosdCk7XG4gIGlmKHIuY29tcGFyZVRvKHQpID49IDApIHtcbiAgICByLmRhdGFbci50KytdID0gMTtcbiAgICByLnN1YlRvKHQscik7XG4gIH1cbiAgQmlnSW50ZWdlci5PTkUuZGxTaGlmdFRvKHlzLHQpO1xuICB0LnN1YlRvKHkseSk7XHQvLyBcIm5lZ2F0aXZlXCIgeSBzbyB3ZSBjYW4gcmVwbGFjZSBzdWIgd2l0aCBhbSBsYXRlclxuICB3aGlsZSh5LnQgPCB5cykgeS5kYXRhW3kudCsrXSA9IDA7XG4gIHdoaWxlKC0taiA+PSAwKSB7XG4gICAgLy8gRXN0aW1hdGUgcXVvdGllbnQgZGlnaXRcbiAgICB2YXIgcWQgPSAoci5kYXRhWy0taV09PXkwKT90aGlzLkRNOk1hdGguZmxvb3Ioci5kYXRhW2ldKmQxKyhyLmRhdGFbaS0xXStlKSpkMik7XG4gICAgaWYoKHIuZGF0YVtpXSs9eS5hbSgwLHFkLHIsaiwwLHlzKSkgPCBxZCkge1x0Ly8gVHJ5IGl0IG91dFxuICAgICAgeS5kbFNoaWZ0VG8oaix0KTtcbiAgICAgIHIuc3ViVG8odCxyKTtcbiAgICAgIHdoaWxlKHIuZGF0YVtpXSA8IC0tcWQpIHIuc3ViVG8odCxyKTtcbiAgICB9XG4gIH1cbiAgaWYocSAhPSBudWxsKSB7XG4gICAgci5kclNoaWZ0VG8oeXMscSk7XG4gICAgaWYodHMgIT0gbXMpIEJpZ0ludGVnZXIuWkVSTy5zdWJUbyhxLHEpO1xuICB9XG4gIHIudCA9IHlzO1xuICByLmNsYW1wKCk7XG4gIGlmKG5zaCA+IDApIHIuclNoaWZ0VG8obnNoLHIpO1x0Ly8gRGVub3JtYWxpemUgcmVtYWluZGVyXG4gIGlmKHRzIDwgMCkgQmlnSW50ZWdlci5aRVJPLnN1YlRvKHIscik7XG59XG5cbi8vIChwdWJsaWMpIHRoaXMgbW9kIGFcbmZ1bmN0aW9uIGJuTW9kKGEpIHtcbiAgdmFyIHIgPSBuYmkoKTtcbiAgdGhpcy5hYnMoKS5kaXZSZW1UbyhhLG51bGwscik7XG4gIGlmKHRoaXMucyA8IDAgJiYgci5jb21wYXJlVG8oQmlnSW50ZWdlci5aRVJPKSA+IDApIGEuc3ViVG8ocixyKTtcbiAgcmV0dXJuIHI7XG59XG5cbi8vIE1vZHVsYXIgcmVkdWN0aW9uIHVzaW5nIFwiY2xhc3NpY1wiIGFsZ29yaXRobVxuZnVuY3Rpb24gQ2xhc3NpYyhtKSB7IHRoaXMubSA9IG07IH1cbmZ1bmN0aW9uIGNDb252ZXJ0KHgpIHtcbiAgaWYoeC5zIDwgMCB8fCB4LmNvbXBhcmVUbyh0aGlzLm0pID49IDApIHJldHVybiB4Lm1vZCh0aGlzLm0pO1xuICBlbHNlIHJldHVybiB4O1xufVxuZnVuY3Rpb24gY1JldmVydCh4KSB7IHJldHVybiB4OyB9XG5mdW5jdGlvbiBjUmVkdWNlKHgpIHsgeC5kaXZSZW1Ubyh0aGlzLm0sbnVsbCx4KTsgfVxuZnVuY3Rpb24gY011bFRvKHgseSxyKSB7IHgubXVsdGlwbHlUbyh5LHIpOyB0aGlzLnJlZHVjZShyKTsgfVxuZnVuY3Rpb24gY1NxclRvKHgscikgeyB4LnNxdWFyZVRvKHIpOyB0aGlzLnJlZHVjZShyKTsgfVxuXG5DbGFzc2ljLnByb3RvdHlwZS5jb252ZXJ0ID0gY0NvbnZlcnQ7XG5DbGFzc2ljLnByb3RvdHlwZS5yZXZlcnQgPSBjUmV2ZXJ0O1xuQ2xhc3NpYy5wcm90b3R5cGUucmVkdWNlID0gY1JlZHVjZTtcbkNsYXNzaWMucHJvdG90eXBlLm11bFRvID0gY011bFRvO1xuQ2xhc3NpYy5wcm90b3R5cGUuc3FyVG8gPSBjU3FyVG87XG5cbi8vIChwcm90ZWN0ZWQpIHJldHVybiBcIi0xL3RoaXMgJSAyXkRCXCI7IHVzZWZ1bCBmb3IgTW9udC4gcmVkdWN0aW9uXG4vLyBqdXN0aWZpY2F0aW9uOlxuLy8gICAgICAgICB4eSA9PSAxIChtb2QgbSlcbi8vICAgICAgICAgeHkgPSAgMStrbVxuLy8gICB4eSgyLXh5KSA9ICgxK2ttKSgxLWttKVxuLy8geFt5KDIteHkpXSA9IDEta14ybV4yXG4vLyB4W3koMi14eSldID09IDEgKG1vZCBtXjIpXG4vLyBpZiB5IGlzIDEveCBtb2QgbSwgdGhlbiB5KDIteHkpIGlzIDEveCBtb2QgbV4yXG4vLyBzaG91bGQgcmVkdWNlIHggYW5kIHkoMi14eSkgYnkgbV4yIGF0IGVhY2ggc3RlcCB0byBrZWVwIHNpemUgYm91bmRlZC5cbi8vIEpTIG11bHRpcGx5IFwib3ZlcmZsb3dzXCIgZGlmZmVyZW50bHkgZnJvbSBDL0MrKywgc28gY2FyZSBpcyBuZWVkZWQgaGVyZS5cbmZ1bmN0aW9uIGJucEludkRpZ2l0KCkge1xuICBpZih0aGlzLnQgPCAxKSByZXR1cm4gMDtcbiAgdmFyIHggPSB0aGlzLmRhdGFbMF07XG4gIGlmKCh4JjEpID09IDApIHJldHVybiAwO1xuICB2YXIgeSA9IHgmMztcdFx0Ly8geSA9PSAxL3ggbW9kIDJeMlxuICB5ID0gKHkqKDItKHgmMHhmKSp5KSkmMHhmO1x0Ly8geSA9PSAxL3ggbW9kIDJeNFxuICB5ID0gKHkqKDItKHgmMHhmZikqeSkpJjB4ZmY7XHQvLyB5ID09IDEveCBtb2QgMl44XG4gIHkgPSAoeSooMi0oKCh4JjB4ZmZmZikqeSkmMHhmZmZmKSkpJjB4ZmZmZjtcdC8vIHkgPT0gMS94IG1vZCAyXjE2XG4gIC8vIGxhc3Qgc3RlcCAtIGNhbGN1bGF0ZSBpbnZlcnNlIG1vZCBEViBkaXJlY3RseTtcbiAgLy8gYXNzdW1lcyAxNiA8IERCIDw9IDMyIGFuZCBhc3N1bWVzIGFiaWxpdHkgdG8gaGFuZGxlIDQ4LWJpdCBpbnRzXG4gIHkgPSAoeSooMi14KnkldGhpcy5EVikpJXRoaXMuRFY7XHRcdC8vIHkgPT0gMS94IG1vZCAyXmRiaXRzXG4gIC8vIHdlIHJlYWxseSB3YW50IHRoZSBuZWdhdGl2ZSBpbnZlcnNlLCBhbmQgLURWIDwgeSA8IERWXG4gIHJldHVybiAoeT4wKT90aGlzLkRWLXk6LXk7XG59XG5cbi8vIE1vbnRnb21lcnkgcmVkdWN0aW9uXG5mdW5jdGlvbiBNb250Z29tZXJ5KG0pIHtcbiAgdGhpcy5tID0gbTtcbiAgdGhpcy5tcCA9IG0uaW52RGlnaXQoKTtcbiAgdGhpcy5tcGwgPSB0aGlzLm1wJjB4N2ZmZjtcbiAgdGhpcy5tcGggPSB0aGlzLm1wPj4xNTtcbiAgdGhpcy51bSA9ICgxPDwobS5EQi0xNSkpLTE7XG4gIHRoaXMubXQyID0gMiptLnQ7XG59XG5cbi8vIHhSIG1vZCBtXG5mdW5jdGlvbiBtb250Q29udmVydCh4KSB7XG4gIHZhciByID0gbmJpKCk7XG4gIHguYWJzKCkuZGxTaGlmdFRvKHRoaXMubS50LHIpO1xuICByLmRpdlJlbVRvKHRoaXMubSxudWxsLHIpO1xuICBpZih4LnMgPCAwICYmIHIuY29tcGFyZVRvKEJpZ0ludGVnZXIuWkVSTykgPiAwKSB0aGlzLm0uc3ViVG8ocixyKTtcbiAgcmV0dXJuIHI7XG59XG5cbi8vIHgvUiBtb2QgbVxuZnVuY3Rpb24gbW9udFJldmVydCh4KSB7XG4gIHZhciByID0gbmJpKCk7XG4gIHguY29weVRvKHIpO1xuICB0aGlzLnJlZHVjZShyKTtcbiAgcmV0dXJuIHI7XG59XG5cbi8vIHggPSB4L1IgbW9kIG0gKEhBQyAxNC4zMilcbmZ1bmN0aW9uIG1vbnRSZWR1Y2UoeCkge1xuICB3aGlsZSh4LnQgPD0gdGhpcy5tdDIpXHQvLyBwYWQgeCBzbyBhbSBoYXMgZW5vdWdoIHJvb20gbGF0ZXJcbiAgICB4LmRhdGFbeC50KytdID0gMDtcbiAgZm9yKHZhciBpID0gMDsgaSA8IHRoaXMubS50OyArK2kpIHtcbiAgICAvLyBmYXN0ZXIgd2F5IG9mIGNhbGN1bGF0aW5nIHUwID0geC5kYXRhW2ldKm1wIG1vZCBEVlxuICAgIHZhciBqID0geC5kYXRhW2ldJjB4N2ZmZjtcbiAgICB2YXIgdTAgPSAoaip0aGlzLm1wbCsoKChqKnRoaXMubXBoKyh4LmRhdGFbaV0+PjE1KSp0aGlzLm1wbCkmdGhpcy51bSk8PDE1KSkmeC5ETTtcbiAgICAvLyB1c2UgYW0gdG8gY29tYmluZSB0aGUgbXVsdGlwbHktc2hpZnQtYWRkIGludG8gb25lIGNhbGxcbiAgICBqID0gaSt0aGlzLm0udDtcbiAgICB4LmRhdGFbal0gKz0gdGhpcy5tLmFtKDAsdTAseCxpLDAsdGhpcy5tLnQpO1xuICAgIC8vIHByb3BhZ2F0ZSBjYXJyeVxuICAgIHdoaWxlKHguZGF0YVtqXSA+PSB4LkRWKSB7IHguZGF0YVtqXSAtPSB4LkRWOyB4LmRhdGFbKytqXSsrOyB9XG4gIH1cbiAgeC5jbGFtcCgpO1xuICB4LmRyU2hpZnRUbyh0aGlzLm0udCx4KTtcbiAgaWYoeC5jb21wYXJlVG8odGhpcy5tKSA+PSAwKSB4LnN1YlRvKHRoaXMubSx4KTtcbn1cblxuLy8gciA9IFwieF4yL1IgbW9kIG1cIjsgeCAhPSByXG5mdW5jdGlvbiBtb250U3FyVG8oeCxyKSB7IHguc3F1YXJlVG8ocik7IHRoaXMucmVkdWNlKHIpOyB9XG5cbi8vIHIgPSBcInh5L1IgbW9kIG1cIjsgeCx5ICE9IHJcbmZ1bmN0aW9uIG1vbnRNdWxUbyh4LHkscikgeyB4Lm11bHRpcGx5VG8oeSxyKTsgdGhpcy5yZWR1Y2Uocik7IH1cblxuTW9udGdvbWVyeS5wcm90b3R5cGUuY29udmVydCA9IG1vbnRDb252ZXJ0O1xuTW9udGdvbWVyeS5wcm90b3R5cGUucmV2ZXJ0ID0gbW9udFJldmVydDtcbk1vbnRnb21lcnkucHJvdG90eXBlLnJlZHVjZSA9IG1vbnRSZWR1Y2U7XG5Nb250Z29tZXJ5LnByb3RvdHlwZS5tdWxUbyA9IG1vbnRNdWxUbztcbk1vbnRnb21lcnkucHJvdG90eXBlLnNxclRvID0gbW9udFNxclRvO1xuXG4vLyAocHJvdGVjdGVkKSB0cnVlIGlmZiB0aGlzIGlzIGV2ZW5cbmZ1bmN0aW9uIGJucElzRXZlbigpIHsgcmV0dXJuICgodGhpcy50PjApPyh0aGlzLmRhdGFbMF0mMSk6dGhpcy5zKSA9PSAwOyB9XG5cbi8vIChwcm90ZWN0ZWQpIHRoaXNeZSwgZSA8IDJeMzIsIGRvaW5nIHNxciBhbmQgbXVsIHdpdGggXCJyXCIgKEhBQyAxNC43OSlcbmZ1bmN0aW9uIGJucEV4cChlLHopIHtcbiAgaWYoZSA+IDB4ZmZmZmZmZmYgfHwgZSA8IDEpIHJldHVybiBCaWdJbnRlZ2VyLk9ORTtcbiAgdmFyIHIgPSBuYmkoKSwgcjIgPSBuYmkoKSwgZyA9IHouY29udmVydCh0aGlzKSwgaSA9IG5iaXRzKGUpLTE7XG4gIGcuY29weVRvKHIpO1xuICB3aGlsZSgtLWkgPj0gMCkge1xuICAgIHouc3FyVG8ocixyMik7XG4gICAgaWYoKGUmKDE8PGkpKSA+IDApIHoubXVsVG8ocjIsZyxyKTtcbiAgICBlbHNlIHsgdmFyIHQgPSByOyByID0gcjI7IHIyID0gdDsgfVxuICB9XG4gIHJldHVybiB6LnJldmVydChyKTtcbn1cblxuLy8gKHB1YmxpYykgdGhpc15lICUgbSwgMCA8PSBlIDwgMl4zMlxuZnVuY3Rpb24gYm5Nb2RQb3dJbnQoZSxtKSB7XG4gIHZhciB6O1xuICBpZihlIDwgMjU2IHx8IG0uaXNFdmVuKCkpIHogPSBuZXcgQ2xhc3NpYyhtKTsgZWxzZSB6ID0gbmV3IE1vbnRnb21lcnkobSk7XG4gIHJldHVybiB0aGlzLmV4cChlLHopO1xufVxuXG4vLyBwcm90ZWN0ZWRcbkJpZ0ludGVnZXIucHJvdG90eXBlLmNvcHlUbyA9IGJucENvcHlUbztcbkJpZ0ludGVnZXIucHJvdG90eXBlLmZyb21JbnQgPSBibnBGcm9tSW50O1xuQmlnSW50ZWdlci5wcm90b3R5cGUuZnJvbVN0cmluZyA9IGJucEZyb21TdHJpbmc7XG5CaWdJbnRlZ2VyLnByb3RvdHlwZS5jbGFtcCA9IGJucENsYW1wO1xuQmlnSW50ZWdlci5wcm90b3R5cGUuZGxTaGlmdFRvID0gYm5wRExTaGlmdFRvO1xuQmlnSW50ZWdlci5wcm90b3R5cGUuZHJTaGlmdFRvID0gYm5wRFJTaGlmdFRvO1xuQmlnSW50ZWdlci5wcm90b3R5cGUubFNoaWZ0VG8gPSBibnBMU2hpZnRUbztcbkJpZ0ludGVnZXIucHJvdG90eXBlLnJTaGlmdFRvID0gYm5wUlNoaWZ0VG87XG5CaWdJbnRlZ2VyLnByb3RvdHlwZS5zdWJUbyA9IGJucFN1YlRvO1xuQmlnSW50ZWdlci5wcm90b3R5cGUubXVsdGlwbHlUbyA9IGJucE11bHRpcGx5VG87XG5CaWdJbnRlZ2VyLnByb3RvdHlwZS5zcXVhcmVUbyA9IGJucFNxdWFyZVRvO1xuQmlnSW50ZWdlci5wcm90b3R5cGUuZGl2UmVtVG8gPSBibnBEaXZSZW1UbztcbkJpZ0ludGVnZXIucHJvdG90eXBlLmludkRpZ2l0ID0gYm5wSW52RGlnaXQ7XG5CaWdJbnRlZ2VyLnByb3RvdHlwZS5pc0V2ZW4gPSBibnBJc0V2ZW47XG5CaWdJbnRlZ2VyLnByb3RvdHlwZS5leHAgPSBibnBFeHA7XG5cbi8vIHB1YmxpY1xuQmlnSW50ZWdlci5wcm90b3R5cGUudG9TdHJpbmcgPSBiblRvU3RyaW5nO1xuQmlnSW50ZWdlci5wcm90b3R5cGUubmVnYXRlID0gYm5OZWdhdGU7XG5CaWdJbnRlZ2VyLnByb3RvdHlwZS5hYnMgPSBibkFicztcbkJpZ0ludGVnZXIucHJvdG90eXBlLmNvbXBhcmVUbyA9IGJuQ29tcGFyZVRvO1xuQmlnSW50ZWdlci5wcm90b3R5cGUuYml0TGVuZ3RoID0gYm5CaXRMZW5ndGg7XG5CaWdJbnRlZ2VyLnByb3RvdHlwZS5tb2QgPSBibk1vZDtcbkJpZ0ludGVnZXIucHJvdG90eXBlLm1vZFBvd0ludCA9IGJuTW9kUG93SW50O1xuXG4vLyBcImNvbnN0YW50c1wiXG5CaWdJbnRlZ2VyLlpFUk8gPSBuYnYoMCk7XG5CaWdJbnRlZ2VyLk9ORSA9IG5idigxKTtcblxuLy8ganNibjIgbGliXG5cbi8vQ29weXJpZ2h0IChjKSAyMDA1LTIwMDkgIFRvbSBXdVxuLy9BbGwgUmlnaHRzIFJlc2VydmVkLlxuLy9TZWUgXCJMSUNFTlNFXCIgZm9yIGRldGFpbHMgKFNlZSBqc2JuLmpzIGZvciBMSUNFTlNFKS5cblxuLy9FeHRlbmRlZCBKYXZhU2NyaXB0IEJOIGZ1bmN0aW9ucywgcmVxdWlyZWQgZm9yIFJTQSBwcml2YXRlIG9wcy5cblxuLy9WZXJzaW9uIDEuMTogbmV3IEJpZ0ludGVnZXIoXCIwXCIsIDEwKSByZXR1cm5zIFwicHJvcGVyXCIgemVyb1xuXG4vLyhwdWJsaWMpXG5mdW5jdGlvbiBibkNsb25lKCkgeyB2YXIgciA9IG5iaSgpOyB0aGlzLmNvcHlUbyhyKTsgcmV0dXJuIHI7IH1cblxuLy8ocHVibGljKSByZXR1cm4gdmFsdWUgYXMgaW50ZWdlclxuZnVuY3Rpb24gYm5JbnRWYWx1ZSgpIHtcbmlmKHRoaXMucyA8IDApIHtcbiBpZih0aGlzLnQgPT0gMSkgcmV0dXJuIHRoaXMuZGF0YVswXS10aGlzLkRWO1xuIGVsc2UgaWYodGhpcy50ID09IDApIHJldHVybiAtMTtcbn0gZWxzZSBpZih0aGlzLnQgPT0gMSkgcmV0dXJuIHRoaXMuZGF0YVswXTtcbmVsc2UgaWYodGhpcy50ID09IDApIHJldHVybiAwO1xuLy8gYXNzdW1lcyAxNiA8IERCIDwgMzJcbnJldHVybiAoKHRoaXMuZGF0YVsxXSYoKDE8PCgzMi10aGlzLkRCKSktMSkpPDx0aGlzLkRCKXx0aGlzLmRhdGFbMF07XG59XG5cbi8vKHB1YmxpYykgcmV0dXJuIHZhbHVlIGFzIGJ5dGVcbmZ1bmN0aW9uIGJuQnl0ZVZhbHVlKCkgeyByZXR1cm4gKHRoaXMudD09MCk/dGhpcy5zOih0aGlzLmRhdGFbMF08PDI0KT4+MjQ7IH1cblxuLy8ocHVibGljKSByZXR1cm4gdmFsdWUgYXMgc2hvcnQgKGFzc3VtZXMgREI+PTE2KVxuZnVuY3Rpb24gYm5TaG9ydFZhbHVlKCkgeyByZXR1cm4gKHRoaXMudD09MCk/dGhpcy5zOih0aGlzLmRhdGFbMF08PDE2KT4+MTY7IH1cblxuLy8ocHJvdGVjdGVkKSByZXR1cm4geCBzLnQuIHJeeCA8IERWXG5mdW5jdGlvbiBibnBDaHVua1NpemUocikgeyByZXR1cm4gTWF0aC5mbG9vcihNYXRoLkxOMip0aGlzLkRCL01hdGgubG9nKHIpKTsgfVxuXG4vLyhwdWJsaWMpIDAgaWYgdGhpcyA9PSAwLCAxIGlmIHRoaXMgPiAwXG5mdW5jdGlvbiBiblNpZ051bSgpIHtcbmlmKHRoaXMucyA8IDApIHJldHVybiAtMTtcbmVsc2UgaWYodGhpcy50IDw9IDAgfHwgKHRoaXMudCA9PSAxICYmIHRoaXMuZGF0YVswXSA8PSAwKSkgcmV0dXJuIDA7XG5lbHNlIHJldHVybiAxO1xufVxuXG4vLyhwcm90ZWN0ZWQpIGNvbnZlcnQgdG8gcmFkaXggc3RyaW5nXG5mdW5jdGlvbiBibnBUb1JhZGl4KGIpIHtcbmlmKGIgPT0gbnVsbCkgYiA9IDEwO1xuaWYodGhpcy5zaWdudW0oKSA9PSAwIHx8IGIgPCAyIHx8IGIgPiAzNikgcmV0dXJuIFwiMFwiO1xudmFyIGNzID0gdGhpcy5jaHVua1NpemUoYik7XG52YXIgYSA9IE1hdGgucG93KGIsY3MpO1xudmFyIGQgPSBuYnYoYSksIHkgPSBuYmkoKSwgeiA9IG5iaSgpLCByID0gXCJcIjtcbnRoaXMuZGl2UmVtVG8oZCx5LHopO1xud2hpbGUoeS5zaWdudW0oKSA+IDApIHtcbiByID0gKGErei5pbnRWYWx1ZSgpKS50b1N0cmluZyhiKS5zdWJzdHIoMSkgKyByO1xuIHkuZGl2UmVtVG8oZCx5LHopO1xufVxucmV0dXJuIHouaW50VmFsdWUoKS50b1N0cmluZyhiKSArIHI7XG59XG5cbi8vKHByb3RlY3RlZCkgY29udmVydCBmcm9tIHJhZGl4IHN0cmluZ1xuZnVuY3Rpb24gYm5wRnJvbVJhZGl4KHMsYikge1xudGhpcy5mcm9tSW50KDApO1xuaWYoYiA9PSBudWxsKSBiID0gMTA7XG52YXIgY3MgPSB0aGlzLmNodW5rU2l6ZShiKTtcbnZhciBkID0gTWF0aC5wb3coYixjcyksIG1pID0gZmFsc2UsIGogPSAwLCB3ID0gMDtcbmZvcih2YXIgaSA9IDA7IGkgPCBzLmxlbmd0aDsgKytpKSB7XG4gdmFyIHggPSBpbnRBdChzLGkpO1xuIGlmKHggPCAwKSB7XG4gICBpZihzLmNoYXJBdChpKSA9PSBcIi1cIiAmJiB0aGlzLnNpZ251bSgpID09IDApIG1pID0gdHJ1ZTtcbiAgIGNvbnRpbnVlO1xuIH1cbiB3ID0gYip3K3g7XG4gaWYoKytqID49IGNzKSB7XG4gICB0aGlzLmRNdWx0aXBseShkKTtcbiAgIHRoaXMuZEFkZE9mZnNldCh3LDApO1xuICAgaiA9IDA7XG4gICB3ID0gMDtcbiB9XG59XG5pZihqID4gMCkge1xuIHRoaXMuZE11bHRpcGx5KE1hdGgucG93KGIsaikpO1xuIHRoaXMuZEFkZE9mZnNldCh3LDApO1xufVxuaWYobWkpIEJpZ0ludGVnZXIuWkVSTy5zdWJUbyh0aGlzLHRoaXMpO1xufVxuXG4vLyhwcm90ZWN0ZWQpIGFsdGVybmF0ZSBjb25zdHJ1Y3RvclxuZnVuY3Rpb24gYm5wRnJvbU51bWJlcihhLGIsYykge1xuaWYoXCJudW1iZXJcIiA9PSB0eXBlb2YgYikge1xuIC8vIG5ldyBCaWdJbnRlZ2VyKGludCxpbnQsUk5HKVxuIGlmKGEgPCAyKSB0aGlzLmZyb21JbnQoMSk7XG4gZWxzZSB7XG4gICB0aGlzLmZyb21OdW1iZXIoYSxjKTtcbiAgIGlmKCF0aGlzLnRlc3RCaXQoYS0xKSkgIC8vIGZvcmNlIE1TQiBzZXRcbiAgICAgdGhpcy5iaXR3aXNlVG8oQmlnSW50ZWdlci5PTkUuc2hpZnRMZWZ0KGEtMSksb3Bfb3IsdGhpcyk7XG4gICBpZih0aGlzLmlzRXZlbigpKSB0aGlzLmRBZGRPZmZzZXQoMSwwKTsgLy8gZm9yY2Ugb2RkXG4gICB3aGlsZSghdGhpcy5pc1Byb2JhYmxlUHJpbWUoYikpIHtcbiAgICAgdGhpcy5kQWRkT2Zmc2V0KDIsMCk7XG4gICAgIGlmKHRoaXMuYml0TGVuZ3RoKCkgPiBhKSB0aGlzLnN1YlRvKEJpZ0ludGVnZXIuT05FLnNoaWZ0TGVmdChhLTEpLHRoaXMpO1xuICAgfVxuIH1cbn0gZWxzZSB7XG4gLy8gbmV3IEJpZ0ludGVnZXIoaW50LFJORylcbiB2YXIgeCA9IG5ldyBBcnJheSgpLCB0ID0gYSY3O1xuIHgubGVuZ3RoID0gKGE+PjMpKzE7XG4gYi5uZXh0Qnl0ZXMoeCk7XG4gaWYodCA+IDApIHhbMF0gJj0gKCgxPDx0KS0xKTsgZWxzZSB4WzBdID0gMDtcbiB0aGlzLmZyb21TdHJpbmcoeCwyNTYpO1xufVxufVxuXG4vLyhwdWJsaWMpIGNvbnZlcnQgdG8gYmlnZW5kaWFuIGJ5dGUgYXJyYXlcbmZ1bmN0aW9uIGJuVG9CeXRlQXJyYXkoKSB7XG52YXIgaSA9IHRoaXMudCwgciA9IG5ldyBBcnJheSgpO1xuclswXSA9IHRoaXMucztcbnZhciBwID0gdGhpcy5EQi0oaSp0aGlzLkRCKSU4LCBkLCBrID0gMDtcbmlmKGktLSA+IDApIHtcbiBpZihwIDwgdGhpcy5EQiAmJiAoZCA9IHRoaXMuZGF0YVtpXT4+cCkgIT0gKHRoaXMucyZ0aGlzLkRNKT4+cClcbiAgIHJbaysrXSA9IGR8KHRoaXMuczw8KHRoaXMuREItcCkpO1xuIHdoaWxlKGkgPj0gMCkge1xuICAgaWYocCA8IDgpIHtcbiAgICAgZCA9ICh0aGlzLmRhdGFbaV0mKCgxPDxwKS0xKSk8PCg4LXApO1xuICAgICBkIHw9IHRoaXMuZGF0YVstLWldPj4ocCs9dGhpcy5EQi04KTtcbiAgIH0gZWxzZSB7XG4gICAgIGQgPSAodGhpcy5kYXRhW2ldPj4ocC09OCkpJjB4ZmY7XG4gICAgIGlmKHAgPD0gMCkgeyBwICs9IHRoaXMuREI7IC0taTsgfVxuICAgfVxuICAgaWYoKGQmMHg4MCkgIT0gMCkgZCB8PSAtMjU2O1xuICAgaWYoayA9PSAwICYmICh0aGlzLnMmMHg4MCkgIT0gKGQmMHg4MCkpICsraztcbiAgIGlmKGsgPiAwIHx8IGQgIT0gdGhpcy5zKSByW2srK10gPSBkO1xuIH1cbn1cbnJldHVybiByO1xufVxuXG5mdW5jdGlvbiBibkVxdWFscyhhKSB7IHJldHVybih0aGlzLmNvbXBhcmVUbyhhKT09MCk7IH1cbmZ1bmN0aW9uIGJuTWluKGEpIHsgcmV0dXJuKHRoaXMuY29tcGFyZVRvKGEpPDApP3RoaXM6YTsgfVxuZnVuY3Rpb24gYm5NYXgoYSkgeyByZXR1cm4odGhpcy5jb21wYXJlVG8oYSk+MCk/dGhpczphOyB9XG5cbi8vKHByb3RlY3RlZCkgciA9IHRoaXMgb3AgYSAoYml0d2lzZSlcbmZ1bmN0aW9uIGJucEJpdHdpc2VUbyhhLG9wLHIpIHtcbnZhciBpLCBmLCBtID0gTWF0aC5taW4oYS50LHRoaXMudCk7XG5mb3IoaSA9IDA7IGkgPCBtOyArK2kpIHIuZGF0YVtpXSA9IG9wKHRoaXMuZGF0YVtpXSxhLmRhdGFbaV0pO1xuaWYoYS50IDwgdGhpcy50KSB7XG4gZiA9IGEucyZ0aGlzLkRNO1xuIGZvcihpID0gbTsgaSA8IHRoaXMudDsgKytpKSByLmRhdGFbaV0gPSBvcCh0aGlzLmRhdGFbaV0sZik7XG4gci50ID0gdGhpcy50O1xufSBlbHNlIHtcbiBmID0gdGhpcy5zJnRoaXMuRE07XG4gZm9yKGkgPSBtOyBpIDwgYS50OyArK2kpIHIuZGF0YVtpXSA9IG9wKGYsYS5kYXRhW2ldKTtcbiByLnQgPSBhLnQ7XG59XG5yLnMgPSBvcCh0aGlzLnMsYS5zKTtcbnIuY2xhbXAoKTtcbn1cblxuLy8ocHVibGljKSB0aGlzICYgYVxuZnVuY3Rpb24gb3BfYW5kKHgseSkgeyByZXR1cm4geCZ5OyB9XG5mdW5jdGlvbiBibkFuZChhKSB7IHZhciByID0gbmJpKCk7IHRoaXMuYml0d2lzZVRvKGEsb3BfYW5kLHIpOyByZXR1cm4gcjsgfVxuXG4vLyhwdWJsaWMpIHRoaXMgfCBhXG5mdW5jdGlvbiBvcF9vcih4LHkpIHsgcmV0dXJuIHh8eTsgfVxuZnVuY3Rpb24gYm5PcihhKSB7IHZhciByID0gbmJpKCk7IHRoaXMuYml0d2lzZVRvKGEsb3Bfb3Iscik7IHJldHVybiByOyB9XG5cbi8vKHB1YmxpYykgdGhpcyBeIGFcbmZ1bmN0aW9uIG9wX3hvcih4LHkpIHsgcmV0dXJuIHheeTsgfVxuZnVuY3Rpb24gYm5Yb3IoYSkgeyB2YXIgciA9IG5iaSgpOyB0aGlzLmJpdHdpc2VUbyhhLG9wX3hvcixyKTsgcmV0dXJuIHI7IH1cblxuLy8ocHVibGljKSB0aGlzICYgfmFcbmZ1bmN0aW9uIG9wX2FuZG5vdCh4LHkpIHsgcmV0dXJuIHgmfnk7IH1cbmZ1bmN0aW9uIGJuQW5kTm90KGEpIHsgdmFyIHIgPSBuYmkoKTsgdGhpcy5iaXR3aXNlVG8oYSxvcF9hbmRub3Qscik7IHJldHVybiByOyB9XG5cbi8vKHB1YmxpYykgfnRoaXNcbmZ1bmN0aW9uIGJuTm90KCkge1xudmFyIHIgPSBuYmkoKTtcbmZvcih2YXIgaSA9IDA7IGkgPCB0aGlzLnQ7ICsraSkgci5kYXRhW2ldID0gdGhpcy5ETSZ+dGhpcy5kYXRhW2ldO1xuci50ID0gdGhpcy50O1xuci5zID0gfnRoaXMucztcbnJldHVybiByO1xufVxuXG4vLyhwdWJsaWMpIHRoaXMgPDwgblxuZnVuY3Rpb24gYm5TaGlmdExlZnQobikge1xudmFyIHIgPSBuYmkoKTtcbmlmKG4gPCAwKSB0aGlzLnJTaGlmdFRvKC1uLHIpOyBlbHNlIHRoaXMubFNoaWZ0VG8obixyKTtcbnJldHVybiByO1xufVxuXG4vLyhwdWJsaWMpIHRoaXMgPj4gblxuZnVuY3Rpb24gYm5TaGlmdFJpZ2h0KG4pIHtcbnZhciByID0gbmJpKCk7XG5pZihuIDwgMCkgdGhpcy5sU2hpZnRUbygtbixyKTsgZWxzZSB0aGlzLnJTaGlmdFRvKG4scik7XG5yZXR1cm4gcjtcbn1cblxuLy9yZXR1cm4gaW5kZXggb2YgbG93ZXN0IDEtYml0IGluIHgsIHggPCAyXjMxXG5mdW5jdGlvbiBsYml0KHgpIHtcbmlmKHggPT0gMCkgcmV0dXJuIC0xO1xudmFyIHIgPSAwO1xuaWYoKHgmMHhmZmZmKSA9PSAwKSB7IHggPj49IDE2OyByICs9IDE2OyB9XG5pZigoeCYweGZmKSA9PSAwKSB7IHggPj49IDg7IHIgKz0gODsgfVxuaWYoKHgmMHhmKSA9PSAwKSB7IHggPj49IDQ7IHIgKz0gNDsgfVxuaWYoKHgmMykgPT0gMCkgeyB4ID4+PSAyOyByICs9IDI7IH1cbmlmKCh4JjEpID09IDApICsrcjtcbnJldHVybiByO1xufVxuXG4vLyhwdWJsaWMpIHJldHVybnMgaW5kZXggb2YgbG93ZXN0IDEtYml0IChvciAtMSBpZiBub25lKVxuZnVuY3Rpb24gYm5HZXRMb3dlc3RTZXRCaXQoKSB7XG5mb3IodmFyIGkgPSAwOyBpIDwgdGhpcy50OyArK2kpXG4gaWYodGhpcy5kYXRhW2ldICE9IDApIHJldHVybiBpKnRoaXMuREIrbGJpdCh0aGlzLmRhdGFbaV0pO1xuaWYodGhpcy5zIDwgMCkgcmV0dXJuIHRoaXMudCp0aGlzLkRCO1xucmV0dXJuIC0xO1xufVxuXG4vL3JldHVybiBudW1iZXIgb2YgMSBiaXRzIGluIHhcbmZ1bmN0aW9uIGNiaXQoeCkge1xudmFyIHIgPSAwO1xud2hpbGUoeCAhPSAwKSB7IHggJj0geC0xOyArK3I7IH1cbnJldHVybiByO1xufVxuXG4vLyhwdWJsaWMpIHJldHVybiBudW1iZXIgb2Ygc2V0IGJpdHNcbmZ1bmN0aW9uIGJuQml0Q291bnQoKSB7XG52YXIgciA9IDAsIHggPSB0aGlzLnMmdGhpcy5ETTtcbmZvcih2YXIgaSA9IDA7IGkgPCB0aGlzLnQ7ICsraSkgciArPSBjYml0KHRoaXMuZGF0YVtpXV54KTtcbnJldHVybiByO1xufVxuXG4vLyhwdWJsaWMpIHRydWUgaWZmIG50aCBiaXQgaXMgc2V0XG5mdW5jdGlvbiBiblRlc3RCaXQobikge1xudmFyIGogPSBNYXRoLmZsb29yKG4vdGhpcy5EQik7XG5pZihqID49IHRoaXMudCkgcmV0dXJuKHRoaXMucyE9MCk7XG5yZXR1cm4oKHRoaXMuZGF0YVtqXSYoMTw8KG4ldGhpcy5EQikpKSE9MCk7XG59XG5cbi8vKHByb3RlY3RlZCkgdGhpcyBvcCAoMTw8bilcbmZ1bmN0aW9uIGJucENoYW5nZUJpdChuLG9wKSB7XG52YXIgciA9IEJpZ0ludGVnZXIuT05FLnNoaWZ0TGVmdChuKTtcbnRoaXMuYml0d2lzZVRvKHIsb3Ascik7XG5yZXR1cm4gcjtcbn1cblxuLy8ocHVibGljKSB0aGlzIHwgKDE8PG4pXG5mdW5jdGlvbiBiblNldEJpdChuKSB7IHJldHVybiB0aGlzLmNoYW5nZUJpdChuLG9wX29yKTsgfVxuXG4vLyhwdWJsaWMpIHRoaXMgJiB+KDE8PG4pXG5mdW5jdGlvbiBibkNsZWFyQml0KG4pIHsgcmV0dXJuIHRoaXMuY2hhbmdlQml0KG4sb3BfYW5kbm90KTsgfVxuXG4vLyhwdWJsaWMpIHRoaXMgXiAoMTw8bilcbmZ1bmN0aW9uIGJuRmxpcEJpdChuKSB7IHJldHVybiB0aGlzLmNoYW5nZUJpdChuLG9wX3hvcik7IH1cblxuLy8ocHJvdGVjdGVkKSByID0gdGhpcyArIGFcbmZ1bmN0aW9uIGJucEFkZFRvKGEscikge1xudmFyIGkgPSAwLCBjID0gMCwgbSA9IE1hdGgubWluKGEudCx0aGlzLnQpO1xud2hpbGUoaSA8IG0pIHtcbiBjICs9IHRoaXMuZGF0YVtpXSthLmRhdGFbaV07XG4gci5kYXRhW2krK10gPSBjJnRoaXMuRE07XG4gYyA+Pj0gdGhpcy5EQjtcbn1cbmlmKGEudCA8IHRoaXMudCkge1xuIGMgKz0gYS5zO1xuIHdoaWxlKGkgPCB0aGlzLnQpIHtcbiAgIGMgKz0gdGhpcy5kYXRhW2ldO1xuICAgci5kYXRhW2krK10gPSBjJnRoaXMuRE07XG4gICBjID4+PSB0aGlzLkRCO1xuIH1cbiBjICs9IHRoaXMucztcbn0gZWxzZSB7XG4gYyArPSB0aGlzLnM7XG4gd2hpbGUoaSA8IGEudCkge1xuICAgYyArPSBhLmRhdGFbaV07XG4gICByLmRhdGFbaSsrXSA9IGMmdGhpcy5ETTtcbiAgIGMgPj49IHRoaXMuREI7XG4gfVxuIGMgKz0gYS5zO1xufVxuci5zID0gKGM8MCk/LTE6MDtcbmlmKGMgPiAwKSByLmRhdGFbaSsrXSA9IGM7XG5lbHNlIGlmKGMgPCAtMSkgci5kYXRhW2krK10gPSB0aGlzLkRWK2M7XG5yLnQgPSBpO1xuci5jbGFtcCgpO1xufVxuXG4vLyhwdWJsaWMpIHRoaXMgKyBhXG5mdW5jdGlvbiBibkFkZChhKSB7IHZhciByID0gbmJpKCk7IHRoaXMuYWRkVG8oYSxyKTsgcmV0dXJuIHI7IH1cblxuLy8ocHVibGljKSB0aGlzIC0gYVxuZnVuY3Rpb24gYm5TdWJ0cmFjdChhKSB7IHZhciByID0gbmJpKCk7IHRoaXMuc3ViVG8oYSxyKTsgcmV0dXJuIHI7IH1cblxuLy8ocHVibGljKSB0aGlzICogYVxuZnVuY3Rpb24gYm5NdWx0aXBseShhKSB7IHZhciByID0gbmJpKCk7IHRoaXMubXVsdGlwbHlUbyhhLHIpOyByZXR1cm4gcjsgfVxuXG4vLyhwdWJsaWMpIHRoaXMgLyBhXG5mdW5jdGlvbiBibkRpdmlkZShhKSB7IHZhciByID0gbmJpKCk7IHRoaXMuZGl2UmVtVG8oYSxyLG51bGwpOyByZXR1cm4gcjsgfVxuXG4vLyhwdWJsaWMpIHRoaXMgJSBhXG5mdW5jdGlvbiBiblJlbWFpbmRlcihhKSB7IHZhciByID0gbmJpKCk7IHRoaXMuZGl2UmVtVG8oYSxudWxsLHIpOyByZXR1cm4gcjsgfVxuXG4vLyhwdWJsaWMpIFt0aGlzL2EsdGhpcyVhXVxuZnVuY3Rpb24gYm5EaXZpZGVBbmRSZW1haW5kZXIoYSkge1xudmFyIHEgPSBuYmkoKSwgciA9IG5iaSgpO1xudGhpcy5kaXZSZW1UbyhhLHEscik7XG5yZXR1cm4gbmV3IEFycmF5KHEscik7XG59XG5cbi8vKHByb3RlY3RlZCkgdGhpcyAqPSBuLCB0aGlzID49IDAsIDEgPCBuIDwgRFZcbmZ1bmN0aW9uIGJucERNdWx0aXBseShuKSB7XG50aGlzLmRhdGFbdGhpcy50XSA9IHRoaXMuYW0oMCxuLTEsdGhpcywwLDAsdGhpcy50KTtcbisrdGhpcy50O1xudGhpcy5jbGFtcCgpO1xufVxuXG4vLyhwcm90ZWN0ZWQpIHRoaXMgKz0gbiA8PCB3IHdvcmRzLCB0aGlzID49IDBcbmZ1bmN0aW9uIGJucERBZGRPZmZzZXQobix3KSB7XG5pZihuID09IDApIHJldHVybjtcbndoaWxlKHRoaXMudCA8PSB3KSB0aGlzLmRhdGFbdGhpcy50KytdID0gMDtcbnRoaXMuZGF0YVt3XSArPSBuO1xud2hpbGUodGhpcy5kYXRhW3ddID49IHRoaXMuRFYpIHtcbiB0aGlzLmRhdGFbd10gLT0gdGhpcy5EVjtcbiBpZigrK3cgPj0gdGhpcy50KSB0aGlzLmRhdGFbdGhpcy50KytdID0gMDtcbiArK3RoaXMuZGF0YVt3XTtcbn1cbn1cblxuLy9BIFwibnVsbFwiIHJlZHVjZXJcbmZ1bmN0aW9uIE51bGxFeHAoKSB7fVxuZnVuY3Rpb24gbk5vcCh4KSB7IHJldHVybiB4OyB9XG5mdW5jdGlvbiBuTXVsVG8oeCx5LHIpIHsgeC5tdWx0aXBseVRvKHkscik7IH1cbmZ1bmN0aW9uIG5TcXJUbyh4LHIpIHsgeC5zcXVhcmVUbyhyKTsgfVxuXG5OdWxsRXhwLnByb3RvdHlwZS5jb252ZXJ0ID0gbk5vcDtcbk51bGxFeHAucHJvdG90eXBlLnJldmVydCA9IG5Ob3A7XG5OdWxsRXhwLnByb3RvdHlwZS5tdWxUbyA9IG5NdWxUbztcbk51bGxFeHAucHJvdG90eXBlLnNxclRvID0gblNxclRvO1xuXG4vLyhwdWJsaWMpIHRoaXNeZVxuZnVuY3Rpb24gYm5Qb3coZSkgeyByZXR1cm4gdGhpcy5leHAoZSxuZXcgTnVsbEV4cCgpKTsgfVxuXG4vLyhwcm90ZWN0ZWQpIHIgPSBsb3dlciBuIHdvcmRzIG9mIFwidGhpcyAqIGFcIiwgYS50IDw9IG5cbi8vXCJ0aGlzXCIgc2hvdWxkIGJlIHRoZSBsYXJnZXIgb25lIGlmIGFwcHJvcHJpYXRlLlxuZnVuY3Rpb24gYm5wTXVsdGlwbHlMb3dlclRvKGEsbixyKSB7XG52YXIgaSA9IE1hdGgubWluKHRoaXMudCthLnQsbik7XG5yLnMgPSAwOyAvLyBhc3N1bWVzIGEsdGhpcyA+PSAwXG5yLnQgPSBpO1xud2hpbGUoaSA+IDApIHIuZGF0YVstLWldID0gMDtcbnZhciBqO1xuZm9yKGogPSByLnQtdGhpcy50OyBpIDwgajsgKytpKSByLmRhdGFbaSt0aGlzLnRdID0gdGhpcy5hbSgwLGEuZGF0YVtpXSxyLGksMCx0aGlzLnQpO1xuZm9yKGogPSBNYXRoLm1pbihhLnQsbik7IGkgPCBqOyArK2kpIHRoaXMuYW0oMCxhLmRhdGFbaV0scixpLDAsbi1pKTtcbnIuY2xhbXAoKTtcbn1cblxuLy8ocHJvdGVjdGVkKSByID0gXCJ0aGlzICogYVwiIHdpdGhvdXQgbG93ZXIgbiB3b3JkcywgbiA+IDBcbi8vXCJ0aGlzXCIgc2hvdWxkIGJlIHRoZSBsYXJnZXIgb25lIGlmIGFwcHJvcHJpYXRlLlxuZnVuY3Rpb24gYm5wTXVsdGlwbHlVcHBlclRvKGEsbixyKSB7XG4tLW47XG52YXIgaSA9IHIudCA9IHRoaXMudCthLnQtbjtcbnIucyA9IDA7IC8vIGFzc3VtZXMgYSx0aGlzID49IDBcbndoaWxlKC0taSA+PSAwKSByLmRhdGFbaV0gPSAwO1xuZm9yKGkgPSBNYXRoLm1heChuLXRoaXMudCwwKTsgaSA8IGEudDsgKytpKVxuIHIuZGF0YVt0aGlzLnQraS1uXSA9IHRoaXMuYW0obi1pLGEuZGF0YVtpXSxyLDAsMCx0aGlzLnQraS1uKTtcbnIuY2xhbXAoKTtcbnIuZHJTaGlmdFRvKDEscik7XG59XG5cbi8vQmFycmV0dCBtb2R1bGFyIHJlZHVjdGlvblxuZnVuY3Rpb24gQmFycmV0dChtKSB7XG4vLyBzZXR1cCBCYXJyZXR0XG50aGlzLnIyID0gbmJpKCk7XG50aGlzLnEzID0gbmJpKCk7XG5CaWdJbnRlZ2VyLk9ORS5kbFNoaWZ0VG8oMiptLnQsdGhpcy5yMik7XG50aGlzLm11ID0gdGhpcy5yMi5kaXZpZGUobSk7XG50aGlzLm0gPSBtO1xufVxuXG5mdW5jdGlvbiBiYXJyZXR0Q29udmVydCh4KSB7XG5pZih4LnMgPCAwIHx8IHgudCA+IDIqdGhpcy5tLnQpIHJldHVybiB4Lm1vZCh0aGlzLm0pO1xuZWxzZSBpZih4LmNvbXBhcmVUbyh0aGlzLm0pIDwgMCkgcmV0dXJuIHg7XG5lbHNlIHsgdmFyIHIgPSBuYmkoKTsgeC5jb3B5VG8ocik7IHRoaXMucmVkdWNlKHIpOyByZXR1cm4gcjsgfVxufVxuXG5mdW5jdGlvbiBiYXJyZXR0UmV2ZXJ0KHgpIHsgcmV0dXJuIHg7IH1cblxuLy94ID0geCBtb2QgbSAoSEFDIDE0LjQyKVxuZnVuY3Rpb24gYmFycmV0dFJlZHVjZSh4KSB7XG54LmRyU2hpZnRUbyh0aGlzLm0udC0xLHRoaXMucjIpO1xuaWYoeC50ID4gdGhpcy5tLnQrMSkgeyB4LnQgPSB0aGlzLm0udCsxOyB4LmNsYW1wKCk7IH1cbnRoaXMubXUubXVsdGlwbHlVcHBlclRvKHRoaXMucjIsdGhpcy5tLnQrMSx0aGlzLnEzKTtcbnRoaXMubS5tdWx0aXBseUxvd2VyVG8odGhpcy5xMyx0aGlzLm0udCsxLHRoaXMucjIpO1xud2hpbGUoeC5jb21wYXJlVG8odGhpcy5yMikgPCAwKSB4LmRBZGRPZmZzZXQoMSx0aGlzLm0udCsxKTtcbnguc3ViVG8odGhpcy5yMix4KTtcbndoaWxlKHguY29tcGFyZVRvKHRoaXMubSkgPj0gMCkgeC5zdWJUbyh0aGlzLm0seCk7XG59XG5cbi8vciA9IHheMiBtb2QgbTsgeCAhPSByXG5mdW5jdGlvbiBiYXJyZXR0U3FyVG8oeCxyKSB7IHguc3F1YXJlVG8ocik7IHRoaXMucmVkdWNlKHIpOyB9XG5cbi8vciA9IHgqeSBtb2QgbTsgeCx5ICE9IHJcbmZ1bmN0aW9uIGJhcnJldHRNdWxUbyh4LHkscikgeyB4Lm11bHRpcGx5VG8oeSxyKTsgdGhpcy5yZWR1Y2Uocik7IH1cblxuQmFycmV0dC5wcm90b3R5cGUuY29udmVydCA9IGJhcnJldHRDb252ZXJ0O1xuQmFycmV0dC5wcm90b3R5cGUucmV2ZXJ0ID0gYmFycmV0dFJldmVydDtcbkJhcnJldHQucHJvdG90eXBlLnJlZHVjZSA9IGJhcnJldHRSZWR1Y2U7XG5CYXJyZXR0LnByb3RvdHlwZS5tdWxUbyA9IGJhcnJldHRNdWxUbztcbkJhcnJldHQucHJvdG90eXBlLnNxclRvID0gYmFycmV0dFNxclRvO1xuXG4vLyhwdWJsaWMpIHRoaXNeZSAlIG0gKEhBQyAxNC44NSlcbmZ1bmN0aW9uIGJuTW9kUG93KGUsbSkge1xudmFyIGkgPSBlLmJpdExlbmd0aCgpLCBrLCByID0gbmJ2KDEpLCB6O1xuaWYoaSA8PSAwKSByZXR1cm4gcjtcbmVsc2UgaWYoaSA8IDE4KSBrID0gMTtcbmVsc2UgaWYoaSA8IDQ4KSBrID0gMztcbmVsc2UgaWYoaSA8IDE0NCkgayA9IDQ7XG5lbHNlIGlmKGkgPCA3NjgpIGsgPSA1O1xuZWxzZSBrID0gNjtcbmlmKGkgPCA4KVxuIHogPSBuZXcgQ2xhc3NpYyhtKTtcbmVsc2UgaWYobS5pc0V2ZW4oKSlcbiB6ID0gbmV3IEJhcnJldHQobSk7XG5lbHNlXG4geiA9IG5ldyBNb250Z29tZXJ5KG0pO1xuXG4vLyBwcmVjb21wdXRhdGlvblxudmFyIGcgPSBuZXcgQXJyYXkoKSwgbiA9IDMsIGsxID0gay0xLCBrbSA9ICgxPDxrKS0xO1xuZ1sxXSA9IHouY29udmVydCh0aGlzKTtcbmlmKGsgPiAxKSB7XG4gdmFyIGcyID0gbmJpKCk7XG4gei5zcXJUbyhnWzFdLGcyKTtcbiB3aGlsZShuIDw9IGttKSB7XG4gICBnW25dID0gbmJpKCk7XG4gICB6Lm11bFRvKGcyLGdbbi0yXSxnW25dKTtcbiAgIG4gKz0gMjtcbiB9XG59XG5cbnZhciBqID0gZS50LTEsIHcsIGlzMSA9IHRydWUsIHIyID0gbmJpKCksIHQ7XG5pID0gbmJpdHMoZS5kYXRhW2pdKS0xO1xud2hpbGUoaiA+PSAwKSB7XG4gaWYoaSA+PSBrMSkgdyA9IChlLmRhdGFbal0+PihpLWsxKSkma207XG4gZWxzZSB7XG4gICB3ID0gKGUuZGF0YVtqXSYoKDE8PChpKzEpKS0xKSk8PChrMS1pKTtcbiAgIGlmKGogPiAwKSB3IHw9IGUuZGF0YVtqLTFdPj4odGhpcy5EQitpLWsxKTtcbiB9XG5cbiBuID0gaztcbiB3aGlsZSgodyYxKSA9PSAwKSB7IHcgPj49IDE7IC0tbjsgfVxuIGlmKChpIC09IG4pIDwgMCkgeyBpICs9IHRoaXMuREI7IC0tajsgfVxuIGlmKGlzMSkgeyAgLy8gcmV0ID09IDEsIGRvbid0IGJvdGhlciBzcXVhcmluZyBvciBtdWx0aXBseWluZyBpdFxuICAgZ1t3XS5jb3B5VG8ocik7XG4gICBpczEgPSBmYWxzZTtcbiB9IGVsc2Uge1xuICAgd2hpbGUobiA+IDEpIHsgei5zcXJUbyhyLHIyKTsgei5zcXJUbyhyMixyKTsgbiAtPSAyOyB9XG4gICBpZihuID4gMCkgei5zcXJUbyhyLHIyKTsgZWxzZSB7IHQgPSByOyByID0gcjI7IHIyID0gdDsgfVxuICAgei5tdWxUbyhyMixnW3ddLHIpO1xuIH1cblxuIHdoaWxlKGogPj0gMCAmJiAoZS5kYXRhW2pdJigxPDxpKSkgPT0gMCkge1xuICAgei5zcXJUbyhyLHIyKTsgdCA9IHI7IHIgPSByMjsgcjIgPSB0O1xuICAgaWYoLS1pIDwgMCkgeyBpID0gdGhpcy5EQi0xOyAtLWo7IH1cbiB9XG59XG5yZXR1cm4gei5yZXZlcnQocik7XG59XG5cbi8vKHB1YmxpYykgZ2NkKHRoaXMsYSkgKEhBQyAxNC41NClcbmZ1bmN0aW9uIGJuR0NEKGEpIHtcbnZhciB4ID0gKHRoaXMuczwwKT90aGlzLm5lZ2F0ZSgpOnRoaXMuY2xvbmUoKTtcbnZhciB5ID0gKGEuczwwKT9hLm5lZ2F0ZSgpOmEuY2xvbmUoKTtcbmlmKHguY29tcGFyZVRvKHkpIDwgMCkgeyB2YXIgdCA9IHg7IHggPSB5OyB5ID0gdDsgfVxudmFyIGkgPSB4LmdldExvd2VzdFNldEJpdCgpLCBnID0geS5nZXRMb3dlc3RTZXRCaXQoKTtcbmlmKGcgPCAwKSByZXR1cm4geDtcbmlmKGkgPCBnKSBnID0gaTtcbmlmKGcgPiAwKSB7XG4geC5yU2hpZnRUbyhnLHgpO1xuIHkuclNoaWZ0VG8oZyx5KTtcbn1cbndoaWxlKHguc2lnbnVtKCkgPiAwKSB7XG4gaWYoKGkgPSB4LmdldExvd2VzdFNldEJpdCgpKSA+IDApIHguclNoaWZ0VG8oaSx4KTtcbiBpZigoaSA9IHkuZ2V0TG93ZXN0U2V0Qml0KCkpID4gMCkgeS5yU2hpZnRUbyhpLHkpO1xuIGlmKHguY29tcGFyZVRvKHkpID49IDApIHtcbiAgIHguc3ViVG8oeSx4KTtcbiAgIHguclNoaWZ0VG8oMSx4KTtcbiB9IGVsc2Uge1xuICAgeS5zdWJUbyh4LHkpO1xuICAgeS5yU2hpZnRUbygxLHkpO1xuIH1cbn1cbmlmKGcgPiAwKSB5LmxTaGlmdFRvKGcseSk7XG5yZXR1cm4geTtcbn1cblxuLy8ocHJvdGVjdGVkKSB0aGlzICUgbiwgbiA8IDJeMjZcbmZ1bmN0aW9uIGJucE1vZEludChuKSB7XG5pZihuIDw9IDApIHJldHVybiAwO1xudmFyIGQgPSB0aGlzLkRWJW4sIHIgPSAodGhpcy5zPDApP24tMTowO1xuaWYodGhpcy50ID4gMClcbiBpZihkID09IDApIHIgPSB0aGlzLmRhdGFbMF0lbjtcbiBlbHNlIGZvcih2YXIgaSA9IHRoaXMudC0xOyBpID49IDA7IC0taSkgciA9IChkKnIrdGhpcy5kYXRhW2ldKSVuO1xucmV0dXJuIHI7XG59XG5cbi8vKHB1YmxpYykgMS90aGlzICUgbSAoSEFDIDE0LjYxKVxuZnVuY3Rpb24gYm5Nb2RJbnZlcnNlKG0pIHtcbnZhciBhYyA9IG0uaXNFdmVuKCk7XG5pZigodGhpcy5pc0V2ZW4oKSAmJiBhYykgfHwgbS5zaWdudW0oKSA9PSAwKSByZXR1cm4gQmlnSW50ZWdlci5aRVJPO1xudmFyIHUgPSBtLmNsb25lKCksIHYgPSB0aGlzLmNsb25lKCk7XG52YXIgYSA9IG5idigxKSwgYiA9IG5idigwKSwgYyA9IG5idigwKSwgZCA9IG5idigxKTtcbndoaWxlKHUuc2lnbnVtKCkgIT0gMCkge1xuIHdoaWxlKHUuaXNFdmVuKCkpIHtcbiAgIHUuclNoaWZ0VG8oMSx1KTtcbiAgIGlmKGFjKSB7XG4gICAgIGlmKCFhLmlzRXZlbigpIHx8ICFiLmlzRXZlbigpKSB7IGEuYWRkVG8odGhpcyxhKTsgYi5zdWJUbyhtLGIpOyB9XG4gICAgIGEuclNoaWZ0VG8oMSxhKTtcbiAgIH0gZWxzZSBpZighYi5pc0V2ZW4oKSkgYi5zdWJUbyhtLGIpO1xuICAgYi5yU2hpZnRUbygxLGIpO1xuIH1cbiB3aGlsZSh2LmlzRXZlbigpKSB7XG4gICB2LnJTaGlmdFRvKDEsdik7XG4gICBpZihhYykge1xuICAgICBpZighYy5pc0V2ZW4oKSB8fCAhZC5pc0V2ZW4oKSkgeyBjLmFkZFRvKHRoaXMsYyk7IGQuc3ViVG8obSxkKTsgfVxuICAgICBjLnJTaGlmdFRvKDEsYyk7XG4gICB9IGVsc2UgaWYoIWQuaXNFdmVuKCkpIGQuc3ViVG8obSxkKTtcbiAgIGQuclNoaWZ0VG8oMSxkKTtcbiB9XG4gaWYodS5jb21wYXJlVG8odikgPj0gMCkge1xuICAgdS5zdWJUbyh2LHUpO1xuICAgaWYoYWMpIGEuc3ViVG8oYyxhKTtcbiAgIGIuc3ViVG8oZCxiKTtcbiB9IGVsc2Uge1xuICAgdi5zdWJUbyh1LHYpO1xuICAgaWYoYWMpIGMuc3ViVG8oYSxjKTtcbiAgIGQuc3ViVG8oYixkKTtcbiB9XG59XG5pZih2LmNvbXBhcmVUbyhCaWdJbnRlZ2VyLk9ORSkgIT0gMCkgcmV0dXJuIEJpZ0ludGVnZXIuWkVSTztcbmlmKGQuY29tcGFyZVRvKG0pID49IDApIHJldHVybiBkLnN1YnRyYWN0KG0pO1xuaWYoZC5zaWdudW0oKSA8IDApIGQuYWRkVG8obSxkKTsgZWxzZSByZXR1cm4gZDtcbmlmKGQuc2lnbnVtKCkgPCAwKSByZXR1cm4gZC5hZGQobSk7IGVsc2UgcmV0dXJuIGQ7XG59XG5cbnZhciBsb3dwcmltZXMgPSBbMiwzLDUsNywxMSwxMywxNywxOSwyMywyOSwzMSwzNyw0MSw0Myw0Nyw1Myw1OSw2MSw2Nyw3MSw3Myw3OSw4Myw4OSw5NywxMDEsMTAzLDEwNywxMDksMTEzLDEyNywxMzEsMTM3LDEzOSwxNDksMTUxLDE1NywxNjMsMTY3LDE3MywxNzksMTgxLDE5MSwxOTMsMTk3LDE5OSwyMTEsMjIzLDIyNywyMjksMjMzLDIzOSwyNDEsMjUxLDI1NywyNjMsMjY5LDI3MSwyNzcsMjgxLDI4MywyOTMsMzA3LDMxMSwzMTMsMzE3LDMzMSwzMzcsMzQ3LDM0OSwzNTMsMzU5LDM2NywzNzMsMzc5LDM4MywzODksMzk3LDQwMSw0MDksNDE5LDQyMSw0MzEsNDMzLDQzOSw0NDMsNDQ5LDQ1Nyw0NjEsNDYzLDQ2Nyw0NzksNDg3LDQ5MSw0OTksNTAzLDUwOV07XG52YXIgbHBsaW0gPSAoMTw8MjYpL2xvd3ByaW1lc1tsb3dwcmltZXMubGVuZ3RoLTFdO1xuXG4vLyhwdWJsaWMpIHRlc3QgcHJpbWFsaXR5IHdpdGggY2VydGFpbnR5ID49IDEtLjVedFxuZnVuY3Rpb24gYm5Jc1Byb2JhYmxlUHJpbWUodCkge1xudmFyIGksIHggPSB0aGlzLmFicygpO1xuaWYoeC50ID09IDEgJiYgeC5kYXRhWzBdIDw9IGxvd3ByaW1lc1tsb3dwcmltZXMubGVuZ3RoLTFdKSB7XG4gZm9yKGkgPSAwOyBpIDwgbG93cHJpbWVzLmxlbmd0aDsgKytpKVxuICAgaWYoeC5kYXRhWzBdID09IGxvd3ByaW1lc1tpXSkgcmV0dXJuIHRydWU7XG4gcmV0dXJuIGZhbHNlO1xufVxuaWYoeC5pc0V2ZW4oKSkgcmV0dXJuIGZhbHNlO1xuaSA9IDE7XG53aGlsZShpIDwgbG93cHJpbWVzLmxlbmd0aCkge1xuIHZhciBtID0gbG93cHJpbWVzW2ldLCBqID0gaSsxO1xuIHdoaWxlKGogPCBsb3dwcmltZXMubGVuZ3RoICYmIG0gPCBscGxpbSkgbSAqPSBsb3dwcmltZXNbaisrXTtcbiBtID0geC5tb2RJbnQobSk7XG4gd2hpbGUoaSA8IGopIGlmKG0lbG93cHJpbWVzW2krK10gPT0gMCkgcmV0dXJuIGZhbHNlO1xufVxucmV0dXJuIHgubWlsbGVyUmFiaW4odCk7XG59XG5cbi8vKHByb3RlY3RlZCkgdHJ1ZSBpZiBwcm9iYWJseSBwcmltZSAoSEFDIDQuMjQsIE1pbGxlci1SYWJpbilcbmZ1bmN0aW9uIGJucE1pbGxlclJhYmluKHQpIHtcbnZhciBuMSA9IHRoaXMuc3VidHJhY3QoQmlnSW50ZWdlci5PTkUpO1xudmFyIGsgPSBuMS5nZXRMb3dlc3RTZXRCaXQoKTtcbmlmKGsgPD0gMCkgcmV0dXJuIGZhbHNlO1xudmFyIHIgPSBuMS5zaGlmdFJpZ2h0KGspO1xudmFyIHBybmcgPSBibkdldFBybmcoKTtcbnZhciBhO1xuZm9yKHZhciBpID0gMDsgaSA8IHQ7ICsraSkge1xuIC8vIHNlbGVjdCB3aXRuZXNzICdhJyBhdCByYW5kb20gZnJvbSBiZXR3ZWVuIDEgYW5kIG4xXG4gZG8ge1xuICAgYSA9IG5ldyBCaWdJbnRlZ2VyKHRoaXMuYml0TGVuZ3RoKCksIHBybmcpO1xuIH1cbiB3aGlsZShhLmNvbXBhcmVUbyhCaWdJbnRlZ2VyLk9ORSkgPD0gMCB8fCBhLmNvbXBhcmVUbyhuMSkgPj0gMCk7XG4gdmFyIHkgPSBhLm1vZFBvdyhyLHRoaXMpO1xuIGlmKHkuY29tcGFyZVRvKEJpZ0ludGVnZXIuT05FKSAhPSAwICYmIHkuY29tcGFyZVRvKG4xKSAhPSAwKSB7XG4gICB2YXIgaiA9IDE7XG4gICB3aGlsZShqKysgPCBrICYmIHkuY29tcGFyZVRvKG4xKSAhPSAwKSB7XG4gICAgIHkgPSB5Lm1vZFBvd0ludCgyLHRoaXMpO1xuICAgICBpZih5LmNvbXBhcmVUbyhCaWdJbnRlZ2VyLk9ORSkgPT0gMCkgcmV0dXJuIGZhbHNlO1xuICAgfVxuICAgaWYoeS5jb21wYXJlVG8objEpICE9IDApIHJldHVybiBmYWxzZTtcbiB9XG59XG5yZXR1cm4gdHJ1ZTtcbn1cblxuLy8gZ2V0IHBzZXVkbyByYW5kb20gbnVtYmVyIGdlbmVyYXRvclxuZnVuY3Rpb24gYm5HZXRQcm5nKCkge1xuICAvLyBjcmVhdGUgcHJuZyB3aXRoIGFwaSB0aGF0IG1hdGNoZXMgQmlnSW50ZWdlciBzZWN1cmUgcmFuZG9tXG4gIHJldHVybiB7XG4gICAgLy8geCBpcyBhbiBhcnJheSB0byBmaWxsIHdpdGggYnl0ZXNcbiAgICBuZXh0Qnl0ZXM6IGZ1bmN0aW9uKHgpIHtcbiAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCB4Lmxlbmd0aDsgKytpKSB7XG4gICAgICAgIHhbaV0gPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAweDAxMDApO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbn1cblxuLy9wcm90ZWN0ZWRcbkJpZ0ludGVnZXIucHJvdG90eXBlLmNodW5rU2l6ZSA9IGJucENodW5rU2l6ZTtcbkJpZ0ludGVnZXIucHJvdG90eXBlLnRvUmFkaXggPSBibnBUb1JhZGl4O1xuQmlnSW50ZWdlci5wcm90b3R5cGUuZnJvbVJhZGl4ID0gYm5wRnJvbVJhZGl4O1xuQmlnSW50ZWdlci5wcm90b3R5cGUuZnJvbU51bWJlciA9IGJucEZyb21OdW1iZXI7XG5CaWdJbnRlZ2VyLnByb3RvdHlwZS5iaXR3aXNlVG8gPSBibnBCaXR3aXNlVG87XG5CaWdJbnRlZ2VyLnByb3RvdHlwZS5jaGFuZ2VCaXQgPSBibnBDaGFuZ2VCaXQ7XG5CaWdJbnRlZ2VyLnByb3RvdHlwZS5hZGRUbyA9IGJucEFkZFRvO1xuQmlnSW50ZWdlci5wcm90b3R5cGUuZE11bHRpcGx5ID0gYm5wRE11bHRpcGx5O1xuQmlnSW50ZWdlci5wcm90b3R5cGUuZEFkZE9mZnNldCA9IGJucERBZGRPZmZzZXQ7XG5CaWdJbnRlZ2VyLnByb3RvdHlwZS5tdWx0aXBseUxvd2VyVG8gPSBibnBNdWx0aXBseUxvd2VyVG87XG5CaWdJbnRlZ2VyLnByb3RvdHlwZS5tdWx0aXBseVVwcGVyVG8gPSBibnBNdWx0aXBseVVwcGVyVG87XG5CaWdJbnRlZ2VyLnByb3RvdHlwZS5tb2RJbnQgPSBibnBNb2RJbnQ7XG5CaWdJbnRlZ2VyLnByb3RvdHlwZS5taWxsZXJSYWJpbiA9IGJucE1pbGxlclJhYmluO1xuXG4vL3B1YmxpY1xuQmlnSW50ZWdlci5wcm90b3R5cGUuY2xvbmUgPSBibkNsb25lO1xuQmlnSW50ZWdlci5wcm90b3R5cGUuaW50VmFsdWUgPSBibkludFZhbHVlO1xuQmlnSW50ZWdlci5wcm90b3R5cGUuYnl0ZVZhbHVlID0gYm5CeXRlVmFsdWU7XG5CaWdJbnRlZ2VyLnByb3RvdHlwZS5zaG9ydFZhbHVlID0gYm5TaG9ydFZhbHVlO1xuQmlnSW50ZWdlci5wcm90b3R5cGUuc2lnbnVtID0gYm5TaWdOdW07XG5CaWdJbnRlZ2VyLnByb3RvdHlwZS50b0J5dGVBcnJheSA9IGJuVG9CeXRlQXJyYXk7XG5CaWdJbnRlZ2VyLnByb3RvdHlwZS5lcXVhbHMgPSBibkVxdWFscztcbkJpZ0ludGVnZXIucHJvdG90eXBlLm1pbiA9IGJuTWluO1xuQmlnSW50ZWdlci5wcm90b3R5cGUubWF4ID0gYm5NYXg7XG5CaWdJbnRlZ2VyLnByb3RvdHlwZS5hbmQgPSBibkFuZDtcbkJpZ0ludGVnZXIucHJvdG90eXBlLm9yID0gYm5PcjtcbkJpZ0ludGVnZXIucHJvdG90eXBlLnhvciA9IGJuWG9yO1xuQmlnSW50ZWdlci5wcm90b3R5cGUuYW5kTm90ID0gYm5BbmROb3Q7XG5CaWdJbnRlZ2VyLnByb3RvdHlwZS5ub3QgPSBibk5vdDtcbkJpZ0ludGVnZXIucHJvdG90eXBlLnNoaWZ0TGVmdCA9IGJuU2hpZnRMZWZ0O1xuQmlnSW50ZWdlci5wcm90b3R5cGUuc2hpZnRSaWdodCA9IGJuU2hpZnRSaWdodDtcbkJpZ0ludGVnZXIucHJvdG90eXBlLmdldExvd2VzdFNldEJpdCA9IGJuR2V0TG93ZXN0U2V0Qml0O1xuQmlnSW50ZWdlci5wcm90b3R5cGUuYml0Q291bnQgPSBibkJpdENvdW50O1xuQmlnSW50ZWdlci5wcm90b3R5cGUudGVzdEJpdCA9IGJuVGVzdEJpdDtcbkJpZ0ludGVnZXIucHJvdG90eXBlLnNldEJpdCA9IGJuU2V0Qml0O1xuQmlnSW50ZWdlci5wcm90b3R5cGUuY2xlYXJCaXQgPSBibkNsZWFyQml0O1xuQmlnSW50ZWdlci5wcm90b3R5cGUuZmxpcEJpdCA9IGJuRmxpcEJpdDtcbkJpZ0ludGVnZXIucHJvdG90eXBlLmFkZCA9IGJuQWRkO1xuQmlnSW50ZWdlci5wcm90b3R5cGUuc3VidHJhY3QgPSBiblN1YnRyYWN0O1xuQmlnSW50ZWdlci5wcm90b3R5cGUubXVsdGlwbHkgPSBibk11bHRpcGx5O1xuQmlnSW50ZWdlci5wcm90b3R5cGUuZGl2aWRlID0gYm5EaXZpZGU7XG5CaWdJbnRlZ2VyLnByb3RvdHlwZS5yZW1haW5kZXIgPSBiblJlbWFpbmRlcjtcbkJpZ0ludGVnZXIucHJvdG90eXBlLmRpdmlkZUFuZFJlbWFpbmRlciA9IGJuRGl2aWRlQW5kUmVtYWluZGVyO1xuQmlnSW50ZWdlci5wcm90b3R5cGUubW9kUG93ID0gYm5Nb2RQb3c7XG5CaWdJbnRlZ2VyLnByb3RvdHlwZS5tb2RJbnZlcnNlID0gYm5Nb2RJbnZlcnNlO1xuQmlnSW50ZWdlci5wcm90b3R5cGUucG93ID0gYm5Qb3c7XG5CaWdJbnRlZ2VyLnByb3RvdHlwZS5nY2QgPSBibkdDRDtcbkJpZ0ludGVnZXIucHJvdG90eXBlLmlzUHJvYmFibGVQcmltZSA9IGJuSXNQcm9iYWJsZVByaW1lO1xuXG4vL0JpZ0ludGVnZXIgaW50ZXJmYWNlcyBub3QgaW1wbGVtZW50ZWQgaW4ganNibjpcblxuLy9CaWdJbnRlZ2VyKGludCBzaWdudW0sIGJ5dGVbXSBtYWduaXR1ZGUpXG4vL2RvdWJsZSBkb3VibGVWYWx1ZSgpXG4vL2Zsb2F0IGZsb2F0VmFsdWUoKVxuLy9pbnQgaGFzaENvZGUoKVxuLy9sb25nIGxvbmdWYWx1ZSgpXG4vL3N0YXRpYyBCaWdJbnRlZ2VyIHZhbHVlT2YobG9uZyB2YWwpXG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///43\n')},function(module,__webpack_exports__,__webpack_require__){"use strict";eval('/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return bind; });\n\n\nfunction bind(fn, thisArg) {\n  return function wrap() {\n    return fn.apply(thisArg, arguments);\n  };\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDQuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvYmluZC5qcz8xZDJiIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYmluZChmbiwgdGhpc0FyZykge1xuICByZXR1cm4gZnVuY3Rpb24gd3JhcCgpIHtcbiAgICByZXR1cm4gZm4uYXBwbHkodGhpc0FyZywgYXJndW1lbnRzKTtcbiAgfTtcbn1cbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///44\n')},function(module,__webpack_exports__,__webpack_require__){"use strict";eval('// eslint-disable-next-line strict\n/* harmony default export */ __webpack_exports__["a"] = (null);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDUuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvbnVsbC5qcz80NTgxIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBzdHJpY3RcbmV4cG9ydCBkZWZhdWx0IG51bGw7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///45\n')},function(module,exports,__webpack_require__){eval("var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!\n\tCopyright (c) 2018 Jed Watson.\n\tLicensed under the MIT License (MIT), see\n\thttp://jedwatson.github.io/classnames\n*/\n/* global define */\n\n(function () {\n\t'use strict';\n\n\tvar hasOwn = {}.hasOwnProperty;\n\n\tfunction classNames () {\n\t\tvar classes = '';\n\n\t\tfor (var i = 0; i < arguments.length; i++) {\n\t\t\tvar arg = arguments[i];\n\t\t\tif (arg) {\n\t\t\t\tclasses = appendClass(classes, parseValue(arg));\n\t\t\t}\n\t\t}\n\n\t\treturn classes;\n\t}\n\n\tfunction parseValue (arg) {\n\t\tif (typeof arg === 'string' || typeof arg === 'number') {\n\t\t\treturn arg;\n\t\t}\n\n\t\tif (typeof arg !== 'object') {\n\t\t\treturn '';\n\t\t}\n\n\t\tif (Array.isArray(arg)) {\n\t\t\treturn classNames.apply(null, arg);\n\t\t}\n\n\t\tif (arg.toString !== Object.prototype.toString && !arg.toString.toString().includes('[native code]')) {\n\t\t\treturn arg.toString();\n\t\t}\n\n\t\tvar classes = '';\n\n\t\tfor (var key in arg) {\n\t\t\tif (hasOwn.call(arg, key) && arg[key]) {\n\t\t\t\tclasses = appendClass(classes, key);\n\t\t\t}\n\t\t}\n\n\t\treturn classes;\n\t}\n\n\tfunction appendClass (value, newClass) {\n\t\tif (!newClass) {\n\t\t\treturn value;\n\t\t}\n\t\n\t\tif (value) {\n\t\t\treturn value + ' ' + newClass;\n\t\t}\n\t\n\t\treturn value + newClass;\n\t}\n\n\tif ( true && module.exports) {\n\t\tclassNames.default = classNames;\n\t\tmodule.exports = classNames;\n\t} else if (true) {\n\t\t// register as 'classnames', consistent with npm package name\n\t\t!(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_RESULT__ = (function () {\n\t\t\treturn classNames;\n\t\t}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t} else {}\n}());\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDYuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvY2xhc3NuYW1lcy9pbmRleC5qcz80ZDI2Il0sInNvdXJjZXNDb250ZW50IjpbIi8qIVxuXHRDb3B5cmlnaHQgKGMpIDIwMTggSmVkIFdhdHNvbi5cblx0TGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlIChNSVQpLCBzZWVcblx0aHR0cDovL2plZHdhdHNvbi5naXRodWIuaW8vY2xhc3NuYW1lc1xuKi9cbi8qIGdsb2JhbCBkZWZpbmUgKi9cblxuKGZ1bmN0aW9uICgpIHtcblx0J3VzZSBzdHJpY3QnO1xuXG5cdHZhciBoYXNPd24gPSB7fS5oYXNPd25Qcm9wZXJ0eTtcblxuXHRmdW5jdGlvbiBjbGFzc05hbWVzICgpIHtcblx0XHR2YXIgY2xhc3NlcyA9ICcnO1xuXG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdHZhciBhcmcgPSBhcmd1bWVudHNbaV07XG5cdFx0XHRpZiAoYXJnKSB7XG5cdFx0XHRcdGNsYXNzZXMgPSBhcHBlbmRDbGFzcyhjbGFzc2VzLCBwYXJzZVZhbHVlKGFyZykpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBjbGFzc2VzO1xuXHR9XG5cblx0ZnVuY3Rpb24gcGFyc2VWYWx1ZSAoYXJnKSB7XG5cdFx0aWYgKHR5cGVvZiBhcmcgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBhcmcgPT09ICdudW1iZXInKSB7XG5cdFx0XHRyZXR1cm4gYXJnO1xuXHRcdH1cblxuXHRcdGlmICh0eXBlb2YgYXJnICE9PSAnb2JqZWN0Jykge1xuXHRcdFx0cmV0dXJuICcnO1xuXHRcdH1cblxuXHRcdGlmIChBcnJheS5pc0FycmF5KGFyZykpIHtcblx0XHRcdHJldHVybiBjbGFzc05hbWVzLmFwcGx5KG51bGwsIGFyZyk7XG5cdFx0fVxuXG5cdFx0aWYgKGFyZy50b1N0cmluZyAhPT0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyAmJiAhYXJnLnRvU3RyaW5nLnRvU3RyaW5nKCkuaW5jbHVkZXMoJ1tuYXRpdmUgY29kZV0nKSkge1xuXHRcdFx0cmV0dXJuIGFyZy50b1N0cmluZygpO1xuXHRcdH1cblxuXHRcdHZhciBjbGFzc2VzID0gJyc7XG5cblx0XHRmb3IgKHZhciBrZXkgaW4gYXJnKSB7XG5cdFx0XHRpZiAoaGFzT3duLmNhbGwoYXJnLCBrZXkpICYmIGFyZ1trZXldKSB7XG5cdFx0XHRcdGNsYXNzZXMgPSBhcHBlbmRDbGFzcyhjbGFzc2VzLCBrZXkpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBjbGFzc2VzO1xuXHR9XG5cblx0ZnVuY3Rpb24gYXBwZW5kQ2xhc3MgKHZhbHVlLCBuZXdDbGFzcykge1xuXHRcdGlmICghbmV3Q2xhc3MpIHtcblx0XHRcdHJldHVybiB2YWx1ZTtcblx0XHR9XG5cdFxuXHRcdGlmICh2YWx1ZSkge1xuXHRcdFx0cmV0dXJuIHZhbHVlICsgJyAnICsgbmV3Q2xhc3M7XG5cdFx0fVxuXHRcblx0XHRyZXR1cm4gdmFsdWUgKyBuZXdDbGFzcztcblx0fVxuXG5cdGlmICh0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyAmJiBtb2R1bGUuZXhwb3J0cykge1xuXHRcdGNsYXNzTmFtZXMuZGVmYXVsdCA9IGNsYXNzTmFtZXM7XG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBjbGFzc05hbWVzO1xuXHR9IGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIGRlZmluZS5hbWQgPT09ICdvYmplY3QnICYmIGRlZmluZS5hbWQpIHtcblx0XHQvLyByZWdpc3RlciBhcyAnY2xhc3NuYW1lcycsIGNvbnNpc3RlbnQgd2l0aCBucG0gcGFja2FnZSBuYW1lXG5cdFx0ZGVmaW5lKCdjbGFzc25hbWVzJywgW10sIGZ1bmN0aW9uICgpIHtcblx0XHRcdHJldHVybiBjbGFzc05hbWVzO1xuXHRcdH0pO1xuXHR9IGVsc2Uge1xuXHRcdHdpbmRvdy5jbGFzc05hbWVzID0gY2xhc3NOYW1lcztcblx0fVxufSgpKTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBLFVBRUE7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///46\n")},function(module,exports,__webpack_require__){eval("/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nif (false) { var throwOnDirectAccess, ReactIs; } else {\n  // By explicitly using `prop-types` you are opting into new production behavior.\n  // http://fb.me/prop-types-in-prod\n  module.exports = __webpack_require__(144)();\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDcuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcHJvcC10eXBlcy9pbmRleC5qcz9kN2JjIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgdmFyIFJlYWN0SXMgPSByZXF1aXJlKCdyZWFjdC1pcycpO1xuXG4gIC8vIEJ5IGV4cGxpY2l0bHkgdXNpbmcgYHByb3AtdHlwZXNgIHlvdSBhcmUgb3B0aW5nIGludG8gbmV3IGRldmVsb3BtZW50IGJlaGF2aW9yLlxuICAvLyBodHRwOi8vZmIubWUvcHJvcC10eXBlcy1pbi1wcm9kXG4gIHZhciB0aHJvd09uRGlyZWN0QWNjZXNzID0gdHJ1ZTtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2ZhY3RvcnlXaXRoVHlwZUNoZWNrZXJzJykoUmVhY3RJcy5pc0VsZW1lbnQsIHRocm93T25EaXJlY3RBY2Nlc3MpO1xufSBlbHNlIHtcbiAgLy8gQnkgZXhwbGljaXRseSB1c2luZyBgcHJvcC10eXBlc2AgeW91IGFyZSBvcHRpbmcgaW50byBuZXcgcHJvZHVjdGlvbiBiZWhhdmlvci5cbiAgLy8gaHR0cDovL2ZiLm1lL3Byb3AtdHlwZXMtaW4tcHJvZFxuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vZmFjdG9yeVdpdGhUaHJvd2luZ1NoaW1zJykoKTtcbn1cbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnREFPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///47\n")},function(module,exports){eval("// parse out just the options we care about\nconst looseOption = Object.freeze({ loose: true })\nconst emptyOpts = Object.freeze({ })\nconst parseOptions = options => {\n  if (!options) {\n    return emptyOpts\n  }\n\n  if (typeof options !== 'object') {\n    return looseOption\n  }\n\n  return options\n}\nmodule.exports = parseOptions\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDguanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRvcnEtbmF0aXZlL3JlYWN0LXNwZWN0cnVtL25vZGVfbW9kdWxlcy9zZW12ZXIvaW50ZXJuYWwvcGFyc2Utb3B0aW9ucy5qcz80ODZjIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIHBhcnNlIG91dCBqdXN0IHRoZSBvcHRpb25zIHdlIGNhcmUgYWJvdXRcbmNvbnN0IGxvb3NlT3B0aW9uID0gT2JqZWN0LmZyZWV6ZSh7IGxvb3NlOiB0cnVlIH0pXG5jb25zdCBlbXB0eU9wdHMgPSBPYmplY3QuZnJlZXplKHsgfSlcbmNvbnN0IHBhcnNlT3B0aW9ucyA9IG9wdGlvbnMgPT4ge1xuICBpZiAoIW9wdGlvbnMpIHtcbiAgICByZXR1cm4gZW1wdHlPcHRzXG4gIH1cblxuICBpZiAodHlwZW9mIG9wdGlvbnMgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIGxvb3NlT3B0aW9uXG4gIH1cblxuICByZXR1cm4gb3B0aW9uc1xufVxubW9kdWxlLmV4cG9ydHMgPSBwYXJzZU9wdGlvbnNcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///48\n")},function(module,exports,__webpack_require__){eval("const SemVer = __webpack_require__(10)\nconst compareBuild = (a, b, loose) => {\n  const versionA = new SemVer(a, loose)\n  const versionB = new SemVer(b, loose)\n  return versionA.compare(versionB) || versionA.compareBuild(versionB)\n}\nmodule.exports = compareBuild\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDkuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRvcnEtbmF0aXZlL3JlYWN0LXNwZWN0cnVtL25vZGVfbW9kdWxlcy9zZW12ZXIvZnVuY3Rpb25zL2NvbXBhcmUtYnVpbGQuanM/MzJmMyJdLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBTZW1WZXIgPSByZXF1aXJlKCcuLi9jbGFzc2VzL3NlbXZlcicpXG5jb25zdCBjb21wYXJlQnVpbGQgPSAoYSwgYiwgbG9vc2UpID0+IHtcbiAgY29uc3QgdmVyc2lvbkEgPSBuZXcgU2VtVmVyKGEsIGxvb3NlKVxuICBjb25zdCB2ZXJzaW9uQiA9IG5ldyBTZW1WZXIoYiwgbG9vc2UpXG4gIHJldHVybiB2ZXJzaW9uQS5jb21wYXJlKHZlcnNpb25CKSB8fCB2ZXJzaW9uQS5jb21wYXJlQnVpbGQodmVyc2lvbkIpXG59XG5tb2R1bGUuZXhwb3J0cyA9IGNvbXBhcmVCdWlsZFxuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///49\n")},function(module,exports,__webpack_require__){eval("const compare = __webpack_require__(11)\nconst lt = (a, b, loose) => compare(a, b, loose) < 0\nmodule.exports = lt\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTAuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRvcnEtbmF0aXZlL3JlYWN0LXNwZWN0cnVtL25vZGVfbW9kdWxlcy9zZW12ZXIvZnVuY3Rpb25zL2x0LmpzP2YyOGIiXSwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgY29tcGFyZSA9IHJlcXVpcmUoJy4vY29tcGFyZScpXG5jb25zdCBsdCA9IChhLCBiLCBsb29zZSkgPT4gY29tcGFyZShhLCBiLCBsb29zZSkgPCAwXG5tb2R1bGUuZXhwb3J0cyA9IGx0XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///50\n")},function(module,exports,__webpack_require__){eval("const compare = __webpack_require__(11)\nconst gte = (a, b, loose) => compare(a, b, loose) >= 0\nmodule.exports = gte\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTEuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRvcnEtbmF0aXZlL3JlYWN0LXNwZWN0cnVtL25vZGVfbW9kdWxlcy9zZW12ZXIvZnVuY3Rpb25zL2d0ZS5qcz8yOWRhIl0sInNvdXJjZXNDb250ZW50IjpbImNvbnN0IGNvbXBhcmUgPSByZXF1aXJlKCcuL2NvbXBhcmUnKVxuY29uc3QgZ3RlID0gKGEsIGIsIGxvb3NlKSA9PiBjb21wYXJlKGEsIGIsIGxvb3NlKSA+PSAwXG5tb2R1bGUuZXhwb3J0cyA9IGd0ZVxuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///51\n")},function(module,exports,__webpack_require__){eval("const compare = __webpack_require__(11)\nconst lte = (a, b, loose) => compare(a, b, loose) <= 0\nmodule.exports = lte\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTIuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRvcnEtbmF0aXZlL3JlYWN0LXNwZWN0cnVtL25vZGVfbW9kdWxlcy9zZW12ZXIvZnVuY3Rpb25zL2x0ZS5qcz83ZTlmIl0sInNvdXJjZXNDb250ZW50IjpbImNvbnN0IGNvbXBhcmUgPSByZXF1aXJlKCcuL2NvbXBhcmUnKVxuY29uc3QgbHRlID0gKGEsIGIsIGxvb3NlKSA9PiBjb21wYXJlKGEsIGIsIGxvb3NlKSA8PSAwXG5tb2R1bGUuZXhwb3J0cyA9IGx0ZVxuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///52\n")},function(module,exports,__webpack_require__){eval("const SemVer = __webpack_require__(10)\nconst Comparator = __webpack_require__(38)\nconst { ANY } = Comparator\nconst Range = __webpack_require__(12)\nconst satisfies = __webpack_require__(39)\nconst gt = __webpack_require__(37)\nconst lt = __webpack_require__(50)\nconst lte = __webpack_require__(52)\nconst gte = __webpack_require__(51)\n\nconst outside = (version, range, hilo, options) => {\n  version = new SemVer(version, options)\n  range = new Range(range, options)\n\n  let gtfn, ltefn, ltfn, comp, ecomp\n  switch (hilo) {\n    case '>':\n      gtfn = gt\n      ltefn = lte\n      ltfn = lt\n      comp = '>'\n      ecomp = '>='\n      break\n    case '<':\n      gtfn = lt\n      ltefn = gte\n      ltfn = gt\n      comp = '<'\n      ecomp = '<='\n      break\n    default:\n      throw new TypeError('Must provide a hilo val of \"<\" or \">\"')\n  }\n\n  // If it satisfies the range it is not outside\n  if (satisfies(version, range, options)) {\n    return false\n  }\n\n  // From now on, variable terms are as if we're in \"gtr\" mode.\n  // but note that everything is flipped for the \"ltr\" function.\n\n  for (let i = 0; i < range.set.length; ++i) {\n    const comparators = range.set[i]\n\n    let high = null\n    let low = null\n\n    comparators.forEach((comparator) => {\n      if (comparator.semver === ANY) {\n        comparator = new Comparator('>=0.0.0')\n      }\n      high = high || comparator\n      low = low || comparator\n      if (gtfn(comparator.semver, high.semver, options)) {\n        high = comparator\n      } else if (ltfn(comparator.semver, low.semver, options)) {\n        low = comparator\n      }\n    })\n\n    // If the edge version comparator has a operator then our version\n    // isn't outside it\n    if (high.operator === comp || high.operator === ecomp) {\n      return false\n    }\n\n    // If the lowest version comparator has an operator and our version\n    // is less than it then it isn't higher than the range\n    if ((!low.operator || low.operator === comp) &&\n        ltefn(version, low.semver)) {\n      return false\n    } else if (low.operator === ecomp && ltfn(version, low.semver)) {\n      return false\n    }\n  }\n  return true\n}\n\nmodule.exports = outside\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRvcnEtbmF0aXZlL3JlYWN0LXNwZWN0cnVtL25vZGVfbW9kdWxlcy9zZW12ZXIvcmFuZ2VzL291dHNpZGUuanM/NTdlYSJdLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBTZW1WZXIgPSByZXF1aXJlKCcuLi9jbGFzc2VzL3NlbXZlcicpXG5jb25zdCBDb21wYXJhdG9yID0gcmVxdWlyZSgnLi4vY2xhc3Nlcy9jb21wYXJhdG9yJylcbmNvbnN0IHsgQU5ZIH0gPSBDb21wYXJhdG9yXG5jb25zdCBSYW5nZSA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvcmFuZ2UnKVxuY29uc3Qgc2F0aXNmaWVzID0gcmVxdWlyZSgnLi4vZnVuY3Rpb25zL3NhdGlzZmllcycpXG5jb25zdCBndCA9IHJlcXVpcmUoJy4uL2Z1bmN0aW9ucy9ndCcpXG5jb25zdCBsdCA9IHJlcXVpcmUoJy4uL2Z1bmN0aW9ucy9sdCcpXG5jb25zdCBsdGUgPSByZXF1aXJlKCcuLi9mdW5jdGlvbnMvbHRlJylcbmNvbnN0IGd0ZSA9IHJlcXVpcmUoJy4uL2Z1bmN0aW9ucy9ndGUnKVxuXG5jb25zdCBvdXRzaWRlID0gKHZlcnNpb24sIHJhbmdlLCBoaWxvLCBvcHRpb25zKSA9PiB7XG4gIHZlcnNpb24gPSBuZXcgU2VtVmVyKHZlcnNpb24sIG9wdGlvbnMpXG4gIHJhbmdlID0gbmV3IFJhbmdlKHJhbmdlLCBvcHRpb25zKVxuXG4gIGxldCBndGZuLCBsdGVmbiwgbHRmbiwgY29tcCwgZWNvbXBcbiAgc3dpdGNoIChoaWxvKSB7XG4gICAgY2FzZSAnPic6XG4gICAgICBndGZuID0gZ3RcbiAgICAgIGx0ZWZuID0gbHRlXG4gICAgICBsdGZuID0gbHRcbiAgICAgIGNvbXAgPSAnPidcbiAgICAgIGVjb21wID0gJz49J1xuICAgICAgYnJlYWtcbiAgICBjYXNlICc8JzpcbiAgICAgIGd0Zm4gPSBsdFxuICAgICAgbHRlZm4gPSBndGVcbiAgICAgIGx0Zm4gPSBndFxuICAgICAgY29tcCA9ICc8J1xuICAgICAgZWNvbXAgPSAnPD0nXG4gICAgICBicmVha1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdNdXN0IHByb3ZpZGUgYSBoaWxvIHZhbCBvZiBcIjxcIiBvciBcIj5cIicpXG4gIH1cblxuICAvLyBJZiBpdCBzYXRpc2ZpZXMgdGhlIHJhbmdlIGl0IGlzIG5vdCBvdXRzaWRlXG4gIGlmIChzYXRpc2ZpZXModmVyc2lvbiwgcmFuZ2UsIG9wdGlvbnMpKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvLyBGcm9tIG5vdyBvbiwgdmFyaWFibGUgdGVybXMgYXJlIGFzIGlmIHdlJ3JlIGluIFwiZ3RyXCIgbW9kZS5cbiAgLy8gYnV0IG5vdGUgdGhhdCBldmVyeXRoaW5nIGlzIGZsaXBwZWQgZm9yIHRoZSBcImx0clwiIGZ1bmN0aW9uLlxuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcmFuZ2Uuc2V0Lmxlbmd0aDsgKytpKSB7XG4gICAgY29uc3QgY29tcGFyYXRvcnMgPSByYW5nZS5zZXRbaV1cblxuICAgIGxldCBoaWdoID0gbnVsbFxuICAgIGxldCBsb3cgPSBudWxsXG5cbiAgICBjb21wYXJhdG9ycy5mb3JFYWNoKChjb21wYXJhdG9yKSA9PiB7XG4gICAgICBpZiAoY29tcGFyYXRvci5zZW12ZXIgPT09IEFOWSkge1xuICAgICAgICBjb21wYXJhdG9yID0gbmV3IENvbXBhcmF0b3IoJz49MC4wLjAnKVxuICAgICAgfVxuICAgICAgaGlnaCA9IGhpZ2ggfHwgY29tcGFyYXRvclxuICAgICAgbG93ID0gbG93IHx8IGNvbXBhcmF0b3JcbiAgICAgIGlmIChndGZuKGNvbXBhcmF0b3Iuc2VtdmVyLCBoaWdoLnNlbXZlciwgb3B0aW9ucykpIHtcbiAgICAgICAgaGlnaCA9IGNvbXBhcmF0b3JcbiAgICAgIH0gZWxzZSBpZiAobHRmbihjb21wYXJhdG9yLnNlbXZlciwgbG93LnNlbXZlciwgb3B0aW9ucykpIHtcbiAgICAgICAgbG93ID0gY29tcGFyYXRvclxuICAgICAgfVxuICAgIH0pXG5cbiAgICAvLyBJZiB0aGUgZWRnZSB2ZXJzaW9uIGNvbXBhcmF0b3IgaGFzIGEgb3BlcmF0b3IgdGhlbiBvdXIgdmVyc2lvblxuICAgIC8vIGlzbid0IG91dHNpZGUgaXRcbiAgICBpZiAoaGlnaC5vcGVyYXRvciA9PT0gY29tcCB8fCBoaWdoLm9wZXJhdG9yID09PSBlY29tcCkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIGxvd2VzdCB2ZXJzaW9uIGNvbXBhcmF0b3IgaGFzIGFuIG9wZXJhdG9yIGFuZCBvdXIgdmVyc2lvblxuICAgIC8vIGlzIGxlc3MgdGhhbiBpdCB0aGVuIGl0IGlzbid0IGhpZ2hlciB0aGFuIHRoZSByYW5nZVxuICAgIGlmICgoIWxvdy5vcGVyYXRvciB8fCBsb3cub3BlcmF0b3IgPT09IGNvbXApICYmXG4gICAgICAgIGx0ZWZuKHZlcnNpb24sIGxvdy5zZW12ZXIpKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9IGVsc2UgaWYgKGxvdy5vcGVyYXRvciA9PT0gZWNvbXAgJiYgbHRmbih2ZXJzaW9uLCBsb3cuc2VtdmVyKSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlXG59XG5cbm1vZHVsZS5leHBvcnRzID0gb3V0c2lkZVxuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///53\n")},function(module,exports,__webpack_require__){eval("/**\n * Cipher base API.\n *\n * @author Dave Longley\n *\n * Copyright (c) 2010-2014 Digital Bazaar, Inc.\n */\nvar forge = __webpack_require__(4);\n__webpack_require__(7);\n\nmodule.exports = forge.cipher = forge.cipher || {};\n\n// registered algorithms\nforge.cipher.algorithms = forge.cipher.algorithms || {};\n\n/**\n * Creates a cipher object that can be used to encrypt data using the given\n * algorithm and key. The algorithm may be provided as a string value for a\n * previously registered algorithm or it may be given as a cipher algorithm\n * API object.\n *\n * @param algorithm the algorithm to use, either a string or an algorithm API\n *          object.\n * @param key the key to use, as a binary-encoded string of bytes or a\n *          byte buffer.\n *\n * @return the cipher.\n */\nforge.cipher.createCipher = function(algorithm, key) {\n  var api = algorithm;\n  if(typeof api === 'string') {\n    api = forge.cipher.getAlgorithm(api);\n    if(api) {\n      api = api();\n    }\n  }\n  if(!api) {\n    throw new Error('Unsupported algorithm: ' + algorithm);\n  }\n\n  // assume block cipher\n  return new forge.cipher.BlockCipher({\n    algorithm: api,\n    key: key,\n    decrypt: false\n  });\n};\n\n/**\n * Creates a decipher object that can be used to decrypt data using the given\n * algorithm and key. The algorithm may be provided as a string value for a\n * previously registered algorithm or it may be given as a cipher algorithm\n * API object.\n *\n * @param algorithm the algorithm to use, either a string or an algorithm API\n *          object.\n * @param key the key to use, as a binary-encoded string of bytes or a\n *          byte buffer.\n *\n * @return the cipher.\n */\nforge.cipher.createDecipher = function(algorithm, key) {\n  var api = algorithm;\n  if(typeof api === 'string') {\n    api = forge.cipher.getAlgorithm(api);\n    if(api) {\n      api = api();\n    }\n  }\n  if(!api) {\n    throw new Error('Unsupported algorithm: ' + algorithm);\n  }\n\n  // assume block cipher\n  return new forge.cipher.BlockCipher({\n    algorithm: api,\n    key: key,\n    decrypt: true\n  });\n};\n\n/**\n * Registers an algorithm by name. If the name was already registered, the\n * algorithm API object will be overwritten.\n *\n * @param name the name of the algorithm.\n * @param algorithm the algorithm API object.\n */\nforge.cipher.registerAlgorithm = function(name, algorithm) {\n  name = name.toUpperCase();\n  forge.cipher.algorithms[name] = algorithm;\n};\n\n/**\n * Gets a registered algorithm by name.\n *\n * @param name the name of the algorithm.\n *\n * @return the algorithm, if found, null if not.\n */\nforge.cipher.getAlgorithm = function(name) {\n  name = name.toUpperCase();\n  if(name in forge.cipher.algorithms) {\n    return forge.cipher.algorithms[name];\n  }\n  return null;\n};\n\nvar BlockCipher = forge.cipher.BlockCipher = function(options) {\n  this.algorithm = options.algorithm;\n  this.mode = this.algorithm.mode;\n  this.blockSize = this.mode.blockSize;\n  this._finish = false;\n  this._input = null;\n  this.output = null;\n  this._op = options.decrypt ? this.mode.decrypt : this.mode.encrypt;\n  this._decrypt = options.decrypt;\n  this.algorithm.initialize(options);\n};\n\n/**\n * Starts or restarts the encryption or decryption process, whichever\n * was previously configured.\n *\n * For non-GCM mode, the IV may be a binary-encoded string of bytes, an array\n * of bytes, a byte buffer, or an array of 32-bit integers. If the IV is in\n * bytes, then it must be Nb (16) bytes in length. If the IV is given in as\n * 32-bit integers, then it must be 4 integers long.\n *\n * Note: an IV is not required or used in ECB mode.\n *\n * For GCM-mode, the IV must be given as a binary-encoded string of bytes or\n * a byte buffer. The number of bytes should be 12 (96 bits) as recommended\n * by NIST SP-800-38D but another length may be given.\n *\n * @param options the options to use:\n *          iv the initialization vector to use as a binary-encoded string of\n *            bytes, null to reuse the last ciphered block from a previous\n *            update() (this \"residue\" method is for legacy support only).\n *          additionalData additional authentication data as a binary-encoded\n *            string of bytes, for 'GCM' mode, (default: none).\n *          tagLength desired length of authentication tag, in bits, for\n *            'GCM' mode (0-128, default: 128).\n *          tag the authentication tag to check if decrypting, as a\n *             binary-encoded string of bytes.\n *          output the output the buffer to write to, null to create one.\n */\nBlockCipher.prototype.start = function(options) {\n  options = options || {};\n  var opts = {};\n  for(var key in options) {\n    opts[key] = options[key];\n  }\n  opts.decrypt = this._decrypt;\n  this._finish = false;\n  this._input = forge.util.createBuffer();\n  this.output = options.output || forge.util.createBuffer();\n  this.mode.start(opts);\n};\n\n/**\n * Updates the next block according to the cipher mode.\n *\n * @param input the buffer to read from.\n */\nBlockCipher.prototype.update = function(input) {\n  if(input) {\n    // input given, so empty it into the input buffer\n    this._input.putBuffer(input);\n  }\n\n  // do cipher operation until it needs more input and not finished\n  while(!this._op.call(this.mode, this._input, this.output, this._finish) &&\n    !this._finish) {}\n\n  // free consumed memory from input buffer\n  this._input.compact();\n};\n\n/**\n * Finishes encrypting or decrypting.\n *\n * @param pad a padding function to use in CBC mode, null for default,\n *          signature(blockSize, buffer, decrypt).\n *\n * @return true if successful, false on error.\n */\nBlockCipher.prototype.finish = function(pad) {\n  // backwards-compatibility w/deprecated padding API\n  // Note: will overwrite padding functions even after another start() call\n  if(pad && (this.mode.name === 'ECB' || this.mode.name === 'CBC')) {\n    this.mode.pad = function(input) {\n      return pad(this.blockSize, input, false);\n    };\n    this.mode.unpad = function(output) {\n      return pad(this.blockSize, output, true);\n    };\n  }\n\n  // build options for padding and afterFinish functions\n  var options = {};\n  options.decrypt = this._decrypt;\n\n  // get # of bytes that won't fill a block\n  options.overflow = this._input.length() % this.blockSize;\n\n  if(!this._decrypt && this.mode.pad) {\n    if(!this.mode.pad(this._input, options)) {\n      return false;\n    }\n  }\n\n  // do final update\n  this._finish = true;\n  this.update();\n\n  if(this._decrypt && this.mode.unpad) {\n    if(!this.mode.unpad(this.output, options)) {\n      return false;\n    }\n  }\n\n  if(this.mode.afterFinish) {\n    if(!this.mode.afterFinish(this.output, options)) {\n      return false;\n    }\n  }\n\n  return true;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTQuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbm9kZS1mb3JnZS9saWIvY2lwaGVyLmpzPzI3ZTciXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDaXBoZXIgYmFzZSBBUEkuXG4gKlxuICogQGF1dGhvciBEYXZlIExvbmdsZXlcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxNCBEaWdpdGFsIEJhemFhciwgSW5jLlxuICovXG52YXIgZm9yZ2UgPSByZXF1aXJlKCcuL2ZvcmdlJyk7XG5yZXF1aXJlKCcuL3V0aWwnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmb3JnZS5jaXBoZXIgPSBmb3JnZS5jaXBoZXIgfHwge307XG5cbi8vIHJlZ2lzdGVyZWQgYWxnb3JpdGhtc1xuZm9yZ2UuY2lwaGVyLmFsZ29yaXRobXMgPSBmb3JnZS5jaXBoZXIuYWxnb3JpdGhtcyB8fCB7fTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgY2lwaGVyIG9iamVjdCB0aGF0IGNhbiBiZSB1c2VkIHRvIGVuY3J5cHQgZGF0YSB1c2luZyB0aGUgZ2l2ZW5cbiAqIGFsZ29yaXRobSBhbmQga2V5LiBUaGUgYWxnb3JpdGhtIG1heSBiZSBwcm92aWRlZCBhcyBhIHN0cmluZyB2YWx1ZSBmb3IgYVxuICogcHJldmlvdXNseSByZWdpc3RlcmVkIGFsZ29yaXRobSBvciBpdCBtYXkgYmUgZ2l2ZW4gYXMgYSBjaXBoZXIgYWxnb3JpdGhtXG4gKiBBUEkgb2JqZWN0LlxuICpcbiAqIEBwYXJhbSBhbGdvcml0aG0gdGhlIGFsZ29yaXRobSB0byB1c2UsIGVpdGhlciBhIHN0cmluZyBvciBhbiBhbGdvcml0aG0gQVBJXG4gKiAgICAgICAgICBvYmplY3QuXG4gKiBAcGFyYW0ga2V5IHRoZSBrZXkgdG8gdXNlLCBhcyBhIGJpbmFyeS1lbmNvZGVkIHN0cmluZyBvZiBieXRlcyBvciBhXG4gKiAgICAgICAgICBieXRlIGJ1ZmZlci5cbiAqXG4gKiBAcmV0dXJuIHRoZSBjaXBoZXIuXG4gKi9cbmZvcmdlLmNpcGhlci5jcmVhdGVDaXBoZXIgPSBmdW5jdGlvbihhbGdvcml0aG0sIGtleSkge1xuICB2YXIgYXBpID0gYWxnb3JpdGhtO1xuICBpZih0eXBlb2YgYXBpID09PSAnc3RyaW5nJykge1xuICAgIGFwaSA9IGZvcmdlLmNpcGhlci5nZXRBbGdvcml0aG0oYXBpKTtcbiAgICBpZihhcGkpIHtcbiAgICAgIGFwaSA9IGFwaSgpO1xuICAgIH1cbiAgfVxuICBpZighYXBpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCBhbGdvcml0aG06ICcgKyBhbGdvcml0aG0pO1xuICB9XG5cbiAgLy8gYXNzdW1lIGJsb2NrIGNpcGhlclxuICByZXR1cm4gbmV3IGZvcmdlLmNpcGhlci5CbG9ja0NpcGhlcih7XG4gICAgYWxnb3JpdGhtOiBhcGksXG4gICAga2V5OiBrZXksXG4gICAgZGVjcnlwdDogZmFsc2VcbiAgfSk7XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBkZWNpcGhlciBvYmplY3QgdGhhdCBjYW4gYmUgdXNlZCB0byBkZWNyeXB0IGRhdGEgdXNpbmcgdGhlIGdpdmVuXG4gKiBhbGdvcml0aG0gYW5kIGtleS4gVGhlIGFsZ29yaXRobSBtYXkgYmUgcHJvdmlkZWQgYXMgYSBzdHJpbmcgdmFsdWUgZm9yIGFcbiAqIHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBhbGdvcml0aG0gb3IgaXQgbWF5IGJlIGdpdmVuIGFzIGEgY2lwaGVyIGFsZ29yaXRobVxuICogQVBJIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0gYWxnb3JpdGhtIHRoZSBhbGdvcml0aG0gdG8gdXNlLCBlaXRoZXIgYSBzdHJpbmcgb3IgYW4gYWxnb3JpdGhtIEFQSVxuICogICAgICAgICAgb2JqZWN0LlxuICogQHBhcmFtIGtleSB0aGUga2V5IHRvIHVzZSwgYXMgYSBiaW5hcnktZW5jb2RlZCBzdHJpbmcgb2YgYnl0ZXMgb3IgYVxuICogICAgICAgICAgYnl0ZSBidWZmZXIuXG4gKlxuICogQHJldHVybiB0aGUgY2lwaGVyLlxuICovXG5mb3JnZS5jaXBoZXIuY3JlYXRlRGVjaXBoZXIgPSBmdW5jdGlvbihhbGdvcml0aG0sIGtleSkge1xuICB2YXIgYXBpID0gYWxnb3JpdGhtO1xuICBpZih0eXBlb2YgYXBpID09PSAnc3RyaW5nJykge1xuICAgIGFwaSA9IGZvcmdlLmNpcGhlci5nZXRBbGdvcml0aG0oYXBpKTtcbiAgICBpZihhcGkpIHtcbiAgICAgIGFwaSA9IGFwaSgpO1xuICAgIH1cbiAgfVxuICBpZighYXBpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCBhbGdvcml0aG06ICcgKyBhbGdvcml0aG0pO1xuICB9XG5cbiAgLy8gYXNzdW1lIGJsb2NrIGNpcGhlclxuICByZXR1cm4gbmV3IGZvcmdlLmNpcGhlci5CbG9ja0NpcGhlcih7XG4gICAgYWxnb3JpdGhtOiBhcGksXG4gICAga2V5OiBrZXksXG4gICAgZGVjcnlwdDogdHJ1ZVxuICB9KTtcbn07XG5cbi8qKlxuICogUmVnaXN0ZXJzIGFuIGFsZ29yaXRobSBieSBuYW1lLiBJZiB0aGUgbmFtZSB3YXMgYWxyZWFkeSByZWdpc3RlcmVkLCB0aGVcbiAqIGFsZ29yaXRobSBBUEkgb2JqZWN0IHdpbGwgYmUgb3ZlcndyaXR0ZW4uXG4gKlxuICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGFsZ29yaXRobS5cbiAqIEBwYXJhbSBhbGdvcml0aG0gdGhlIGFsZ29yaXRobSBBUEkgb2JqZWN0LlxuICovXG5mb3JnZS5jaXBoZXIucmVnaXN0ZXJBbGdvcml0aG0gPSBmdW5jdGlvbihuYW1lLCBhbGdvcml0aG0pIHtcbiAgbmFtZSA9IG5hbWUudG9VcHBlckNhc2UoKTtcbiAgZm9yZ2UuY2lwaGVyLmFsZ29yaXRobXNbbmFtZV0gPSBhbGdvcml0aG07XG59O1xuXG4vKipcbiAqIEdldHMgYSByZWdpc3RlcmVkIGFsZ29yaXRobSBieSBuYW1lLlxuICpcbiAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBhbGdvcml0aG0uXG4gKlxuICogQHJldHVybiB0aGUgYWxnb3JpdGhtLCBpZiBmb3VuZCwgbnVsbCBpZiBub3QuXG4gKi9cbmZvcmdlLmNpcGhlci5nZXRBbGdvcml0aG0gPSBmdW5jdGlvbihuYW1lKSB7XG4gIG5hbWUgPSBuYW1lLnRvVXBwZXJDYXNlKCk7XG4gIGlmKG5hbWUgaW4gZm9yZ2UuY2lwaGVyLmFsZ29yaXRobXMpIHtcbiAgICByZXR1cm4gZm9yZ2UuY2lwaGVyLmFsZ29yaXRobXNbbmFtZV07XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59O1xuXG52YXIgQmxvY2tDaXBoZXIgPSBmb3JnZS5jaXBoZXIuQmxvY2tDaXBoZXIgPSBmdW5jdGlvbihvcHRpb25zKSB7XG4gIHRoaXMuYWxnb3JpdGhtID0gb3B0aW9ucy5hbGdvcml0aG07XG4gIHRoaXMubW9kZSA9IHRoaXMuYWxnb3JpdGhtLm1vZGU7XG4gIHRoaXMuYmxvY2tTaXplID0gdGhpcy5tb2RlLmJsb2NrU2l6ZTtcbiAgdGhpcy5fZmluaXNoID0gZmFsc2U7XG4gIHRoaXMuX2lucHV0ID0gbnVsbDtcbiAgdGhpcy5vdXRwdXQgPSBudWxsO1xuICB0aGlzLl9vcCA9IG9wdGlvbnMuZGVjcnlwdCA/IHRoaXMubW9kZS5kZWNyeXB0IDogdGhpcy5tb2RlLmVuY3J5cHQ7XG4gIHRoaXMuX2RlY3J5cHQgPSBvcHRpb25zLmRlY3J5cHQ7XG4gIHRoaXMuYWxnb3JpdGhtLmluaXRpYWxpemUob3B0aW9ucyk7XG59O1xuXG4vKipcbiAqIFN0YXJ0cyBvciByZXN0YXJ0cyB0aGUgZW5jcnlwdGlvbiBvciBkZWNyeXB0aW9uIHByb2Nlc3MsIHdoaWNoZXZlclxuICogd2FzIHByZXZpb3VzbHkgY29uZmlndXJlZC5cbiAqXG4gKiBGb3Igbm9uLUdDTSBtb2RlLCB0aGUgSVYgbWF5IGJlIGEgYmluYXJ5LWVuY29kZWQgc3RyaW5nIG9mIGJ5dGVzLCBhbiBhcnJheVxuICogb2YgYnl0ZXMsIGEgYnl0ZSBidWZmZXIsIG9yIGFuIGFycmF5IG9mIDMyLWJpdCBpbnRlZ2Vycy4gSWYgdGhlIElWIGlzIGluXG4gKiBieXRlcywgdGhlbiBpdCBtdXN0IGJlIE5iICgxNikgYnl0ZXMgaW4gbGVuZ3RoLiBJZiB0aGUgSVYgaXMgZ2l2ZW4gaW4gYXNcbiAqIDMyLWJpdCBpbnRlZ2VycywgdGhlbiBpdCBtdXN0IGJlIDQgaW50ZWdlcnMgbG9uZy5cbiAqXG4gKiBOb3RlOiBhbiBJViBpcyBub3QgcmVxdWlyZWQgb3IgdXNlZCBpbiBFQ0IgbW9kZS5cbiAqXG4gKiBGb3IgR0NNLW1vZGUsIHRoZSBJViBtdXN0IGJlIGdpdmVuIGFzIGEgYmluYXJ5LWVuY29kZWQgc3RyaW5nIG9mIGJ5dGVzIG9yXG4gKiBhIGJ5dGUgYnVmZmVyLiBUaGUgbnVtYmVyIG9mIGJ5dGVzIHNob3VsZCBiZSAxMiAoOTYgYml0cykgYXMgcmVjb21tZW5kZWRcbiAqIGJ5IE5JU1QgU1AtODAwLTM4RCBidXQgYW5vdGhlciBsZW5ndGggbWF5IGJlIGdpdmVuLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIHRoZSBvcHRpb25zIHRvIHVzZTpcbiAqICAgICAgICAgIGl2IHRoZSBpbml0aWFsaXphdGlvbiB2ZWN0b3IgdG8gdXNlIGFzIGEgYmluYXJ5LWVuY29kZWQgc3RyaW5nIG9mXG4gKiAgICAgICAgICAgIGJ5dGVzLCBudWxsIHRvIHJldXNlIHRoZSBsYXN0IGNpcGhlcmVkIGJsb2NrIGZyb20gYSBwcmV2aW91c1xuICogICAgICAgICAgICB1cGRhdGUoKSAodGhpcyBcInJlc2lkdWVcIiBtZXRob2QgaXMgZm9yIGxlZ2FjeSBzdXBwb3J0IG9ubHkpLlxuICogICAgICAgICAgYWRkaXRpb25hbERhdGEgYWRkaXRpb25hbCBhdXRoZW50aWNhdGlvbiBkYXRhIGFzIGEgYmluYXJ5LWVuY29kZWRcbiAqICAgICAgICAgICAgc3RyaW5nIG9mIGJ5dGVzLCBmb3IgJ0dDTScgbW9kZSwgKGRlZmF1bHQ6IG5vbmUpLlxuICogICAgICAgICAgdGFnTGVuZ3RoIGRlc2lyZWQgbGVuZ3RoIG9mIGF1dGhlbnRpY2F0aW9uIHRhZywgaW4gYml0cywgZm9yXG4gKiAgICAgICAgICAgICdHQ00nIG1vZGUgKDAtMTI4LCBkZWZhdWx0OiAxMjgpLlxuICogICAgICAgICAgdGFnIHRoZSBhdXRoZW50aWNhdGlvbiB0YWcgdG8gY2hlY2sgaWYgZGVjcnlwdGluZywgYXMgYVxuICogICAgICAgICAgICAgYmluYXJ5LWVuY29kZWQgc3RyaW5nIG9mIGJ5dGVzLlxuICogICAgICAgICAgb3V0cHV0IHRoZSBvdXRwdXQgdGhlIGJ1ZmZlciB0byB3cml0ZSB0bywgbnVsbCB0byBjcmVhdGUgb25lLlxuICovXG5CbG9ja0NpcGhlci5wcm90b3R5cGUuc3RhcnQgPSBmdW5jdGlvbihvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICB2YXIgb3B0cyA9IHt9O1xuICBmb3IodmFyIGtleSBpbiBvcHRpb25zKSB7XG4gICAgb3B0c1trZXldID0gb3B0aW9uc1trZXldO1xuICB9XG4gIG9wdHMuZGVjcnlwdCA9IHRoaXMuX2RlY3J5cHQ7XG4gIHRoaXMuX2ZpbmlzaCA9IGZhbHNlO1xuICB0aGlzLl9pbnB1dCA9IGZvcmdlLnV0aWwuY3JlYXRlQnVmZmVyKCk7XG4gIHRoaXMub3V0cHV0ID0gb3B0aW9ucy5vdXRwdXQgfHwgZm9yZ2UudXRpbC5jcmVhdGVCdWZmZXIoKTtcbiAgdGhpcy5tb2RlLnN0YXJ0KG9wdHMpO1xufTtcblxuLyoqXG4gKiBVcGRhdGVzIHRoZSBuZXh0IGJsb2NrIGFjY29yZGluZyB0byB0aGUgY2lwaGVyIG1vZGUuXG4gKlxuICogQHBhcmFtIGlucHV0IHRoZSBidWZmZXIgdG8gcmVhZCBmcm9tLlxuICovXG5CbG9ja0NpcGhlci5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24oaW5wdXQpIHtcbiAgaWYoaW5wdXQpIHtcbiAgICAvLyBpbnB1dCBnaXZlbiwgc28gZW1wdHkgaXQgaW50byB0aGUgaW5wdXQgYnVmZmVyXG4gICAgdGhpcy5faW5wdXQucHV0QnVmZmVyKGlucHV0KTtcbiAgfVxuXG4gIC8vIGRvIGNpcGhlciBvcGVyYXRpb24gdW50aWwgaXQgbmVlZHMgbW9yZSBpbnB1dCBhbmQgbm90IGZpbmlzaGVkXG4gIHdoaWxlKCF0aGlzLl9vcC5jYWxsKHRoaXMubW9kZSwgdGhpcy5faW5wdXQsIHRoaXMub3V0cHV0LCB0aGlzLl9maW5pc2gpICYmXG4gICAgIXRoaXMuX2ZpbmlzaCkge31cblxuICAvLyBmcmVlIGNvbnN1bWVkIG1lbW9yeSBmcm9tIGlucHV0IGJ1ZmZlclxuICB0aGlzLl9pbnB1dC5jb21wYWN0KCk7XG59O1xuXG4vKipcbiAqIEZpbmlzaGVzIGVuY3J5cHRpbmcgb3IgZGVjcnlwdGluZy5cbiAqXG4gKiBAcGFyYW0gcGFkIGEgcGFkZGluZyBmdW5jdGlvbiB0byB1c2UgaW4gQ0JDIG1vZGUsIG51bGwgZm9yIGRlZmF1bHQsXG4gKiAgICAgICAgICBzaWduYXR1cmUoYmxvY2tTaXplLCBidWZmZXIsIGRlY3J5cHQpLlxuICpcbiAqIEByZXR1cm4gdHJ1ZSBpZiBzdWNjZXNzZnVsLCBmYWxzZSBvbiBlcnJvci5cbiAqL1xuQmxvY2tDaXBoZXIucHJvdG90eXBlLmZpbmlzaCA9IGZ1bmN0aW9uKHBhZCkge1xuICAvLyBiYWNrd2FyZHMtY29tcGF0aWJpbGl0eSB3L2RlcHJlY2F0ZWQgcGFkZGluZyBBUElcbiAgLy8gTm90ZTogd2lsbCBvdmVyd3JpdGUgcGFkZGluZyBmdW5jdGlvbnMgZXZlbiBhZnRlciBhbm90aGVyIHN0YXJ0KCkgY2FsbFxuICBpZihwYWQgJiYgKHRoaXMubW9kZS5uYW1lID09PSAnRUNCJyB8fCB0aGlzLm1vZGUubmFtZSA9PT0gJ0NCQycpKSB7XG4gICAgdGhpcy5tb2RlLnBhZCA9IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICByZXR1cm4gcGFkKHRoaXMuYmxvY2tTaXplLCBpbnB1dCwgZmFsc2UpO1xuICAgIH07XG4gICAgdGhpcy5tb2RlLnVucGFkID0gZnVuY3Rpb24ob3V0cHV0KSB7XG4gICAgICByZXR1cm4gcGFkKHRoaXMuYmxvY2tTaXplLCBvdXRwdXQsIHRydWUpO1xuICAgIH07XG4gIH1cblxuICAvLyBidWlsZCBvcHRpb25zIGZvciBwYWRkaW5nIGFuZCBhZnRlckZpbmlzaCBmdW5jdGlvbnNcbiAgdmFyIG9wdGlvbnMgPSB7fTtcbiAgb3B0aW9ucy5kZWNyeXB0ID0gdGhpcy5fZGVjcnlwdDtcblxuICAvLyBnZXQgIyBvZiBieXRlcyB0aGF0IHdvbid0IGZpbGwgYSBibG9ja1xuICBvcHRpb25zLm92ZXJmbG93ID0gdGhpcy5faW5wdXQubGVuZ3RoKCkgJSB0aGlzLmJsb2NrU2l6ZTtcblxuICBpZighdGhpcy5fZGVjcnlwdCAmJiB0aGlzLm1vZGUucGFkKSB7XG4gICAgaWYoIXRoaXMubW9kZS5wYWQodGhpcy5faW5wdXQsIG9wdGlvbnMpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLy8gZG8gZmluYWwgdXBkYXRlXG4gIHRoaXMuX2ZpbmlzaCA9IHRydWU7XG4gIHRoaXMudXBkYXRlKCk7XG5cbiAgaWYodGhpcy5fZGVjcnlwdCAmJiB0aGlzLm1vZGUudW5wYWQpIHtcbiAgICBpZighdGhpcy5tb2RlLnVucGFkKHRoaXMub3V0cHV0LCBvcHRpb25zKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGlmKHRoaXMubW9kZS5hZnRlckZpbmlzaCkge1xuICAgIGlmKCF0aGlzLm1vZGUuYWZ0ZXJGaW5pc2godGhpcy5vdXRwdXQsIG9wdGlvbnMpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///54\n")},function(module,exports,__webpack_require__){eval("/**\n * Message Digest Algorithm 5 with 128-bit digest (MD5) implementation.\n *\n * @author Dave Longley\n *\n * Copyright (c) 2010-2014 Digital Bazaar, Inc.\n */\nvar forge = __webpack_require__(4);\n__webpack_require__(17);\n__webpack_require__(7);\n\nvar md5 = module.exports = forge.md5 = forge.md5 || {};\nforge.md.md5 = forge.md.algorithms.md5 = md5;\n\n/**\n * Creates an MD5 message digest object.\n *\n * @return a message digest object.\n */\nmd5.create = function() {\n  // do initialization as necessary\n  if(!_initialized) {\n    _init();\n  }\n\n  // MD5 state contains four 32-bit integers\n  var _state = null;\n\n  // input buffer\n  var _input = forge.util.createBuffer();\n\n  // used for word storage\n  var _w = new Array(16);\n\n  // message digest object\n  var md = {\n    algorithm: 'md5',\n    blockLength: 64,\n    digestLength: 16,\n    // 56-bit length of message so far (does not including padding)\n    messageLength: 0,\n    // true message length\n    fullMessageLength: null,\n    // size of message length in bytes\n    messageLengthSize: 8\n  };\n\n  /**\n   * Starts the digest.\n   *\n   * @return this digest object.\n   */\n  md.start = function() {\n    // up to 56-bit message length for convenience\n    md.messageLength = 0;\n\n    // full message length (set md.messageLength64 for backwards-compatibility)\n    md.fullMessageLength = md.messageLength64 = [];\n    var int32s = md.messageLengthSize / 4;\n    for(var i = 0; i < int32s; ++i) {\n      md.fullMessageLength.push(0);\n    }\n    _input = forge.util.createBuffer();\n    _state = {\n      h0: 0x67452301,\n      h1: 0xEFCDAB89,\n      h2: 0x98BADCFE,\n      h3: 0x10325476\n    };\n    return md;\n  };\n  // start digest automatically for first time\n  md.start();\n\n  /**\n   * Updates the digest with the given message input. The given input can\n   * treated as raw input (no encoding will be applied) or an encoding of\n   * 'utf8' maybe given to encode the input using UTF-8.\n   *\n   * @param msg the message input to update with.\n   * @param encoding the encoding to use (default: 'raw', other: 'utf8').\n   *\n   * @return this digest object.\n   */\n  md.update = function(msg, encoding) {\n    if(encoding === 'utf8') {\n      msg = forge.util.encodeUtf8(msg);\n    }\n\n    // update message length\n    var len = msg.length;\n    md.messageLength += len;\n    len = [(len / 0x100000000) >>> 0, len >>> 0];\n    for(var i = md.fullMessageLength.length - 1; i >= 0; --i) {\n      md.fullMessageLength[i] += len[1];\n      len[1] = len[0] + ((md.fullMessageLength[i] / 0x100000000) >>> 0);\n      md.fullMessageLength[i] = md.fullMessageLength[i] >>> 0;\n      len[0] = (len[1] / 0x100000000) >>> 0;\n    }\n\n    // add bytes to input buffer\n    _input.putBytes(msg);\n\n    // process bytes\n    _update(_state, _w, _input);\n\n    // compact input buffer every 2K or if empty\n    if(_input.read > 2048 || _input.length() === 0) {\n      _input.compact();\n    }\n\n    return md;\n  };\n\n  /**\n   * Produces the digest.\n   *\n   * @return a byte buffer containing the digest value.\n   */\n  md.digest = function() {\n    /* Note: Here we copy the remaining bytes in the input buffer and\n    add the appropriate MD5 padding. Then we do the final update\n    on a copy of the state so that if the user wants to get\n    intermediate digests they can do so. */\n\n    /* Determine the number of bytes that must be added to the message\n    to ensure its length is congruent to 448 mod 512. In other words,\n    the data to be digested must be a multiple of 512 bits (or 128 bytes).\n    This data includes the message, some padding, and the length of the\n    message. Since the length of the message will be encoded as 8 bytes (64\n    bits), that means that the last segment of the data must have 56 bytes\n    (448 bits) of message and padding. Therefore, the length of the message\n    plus the padding must be congruent to 448 mod 512 because\n    512 - 128 = 448.\n\n    In order to fill up the message length it must be filled with\n    padding that begins with 1 bit followed by all 0 bits. Padding\n    must *always* be present, so if the message length is already\n    congruent to 448 mod 512, then 512 padding bits must be added. */\n\n    var finalBlock = forge.util.createBuffer();\n    finalBlock.putBytes(_input.bytes());\n\n    // compute remaining size to be digested (include message length size)\n    var remaining = (\n      md.fullMessageLength[md.fullMessageLength.length - 1] +\n      md.messageLengthSize);\n\n    // add padding for overflow blockSize - overflow\n    // _padding starts with 1 byte with first bit is set (byte value 128), then\n    // there may be up to (blockSize - 1) other pad bytes\n    var overflow = remaining & (md.blockLength - 1);\n    finalBlock.putBytes(_padding.substr(0, md.blockLength - overflow));\n\n    // serialize message length in bits in little-endian order; since length\n    // is stored in bytes we multiply by 8 and add carry\n    var bits, carry = 0;\n    for(var i = md.fullMessageLength.length - 1; i >= 0; --i) {\n      bits = md.fullMessageLength[i] * 8 + carry;\n      carry = (bits / 0x100000000) >>> 0;\n      finalBlock.putInt32Le(bits >>> 0);\n    }\n\n    var s2 = {\n      h0: _state.h0,\n      h1: _state.h1,\n      h2: _state.h2,\n      h3: _state.h3\n    };\n    _update(s2, _w, finalBlock);\n    var rval = forge.util.createBuffer();\n    rval.putInt32Le(s2.h0);\n    rval.putInt32Le(s2.h1);\n    rval.putInt32Le(s2.h2);\n    rval.putInt32Le(s2.h3);\n    return rval;\n  };\n\n  return md;\n};\n\n// padding, constant tables for calculating md5\nvar _padding = null;\nvar _g = null;\nvar _r = null;\nvar _k = null;\nvar _initialized = false;\n\n/**\n * Initializes the constant tables.\n */\nfunction _init() {\n  // create padding\n  _padding = String.fromCharCode(128);\n  _padding += forge.util.fillString(String.fromCharCode(0x00), 64);\n\n  // g values\n  _g = [\n    0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,\n    1, 6, 11, 0, 5, 10, 15, 4, 9, 14, 3, 8, 13, 2, 7, 12,\n    5, 8, 11, 14, 1, 4, 7, 10, 13, 0, 3, 6, 9, 12, 15, 2,\n    0, 7, 14, 5, 12, 3, 10, 1, 8, 15, 6, 13, 4, 11, 2, 9];\n\n  // rounds table\n  _r = [\n    7, 12, 17, 22,  7, 12, 17, 22,  7, 12, 17, 22,  7, 12, 17, 22,\n    5,  9, 14, 20,  5,  9, 14, 20,  5,  9, 14, 20,  5,  9, 14, 20,\n    4, 11, 16, 23,  4, 11, 16, 23,  4, 11, 16, 23,  4, 11, 16, 23,\n    6, 10, 15, 21,  6, 10, 15, 21,  6, 10, 15, 21,  6, 10, 15, 21];\n\n  // get the result of abs(sin(i + 1)) as a 32-bit integer\n  _k = new Array(64);\n  for(var i = 0; i < 64; ++i) {\n    _k[i] = Math.floor(Math.abs(Math.sin(i + 1)) * 0x100000000);\n  }\n\n  // now initialized\n  _initialized = true;\n}\n\n/**\n * Updates an MD5 state with the given byte buffer.\n *\n * @param s the MD5 state to update.\n * @param w the array to use to store words.\n * @param bytes the byte buffer to update with.\n */\nfunction _update(s, w, bytes) {\n  // consume 512 bit (64 byte) chunks\n  var t, a, b, c, d, f, r, i;\n  var len = bytes.length();\n  while(len >= 64) {\n    // initialize hash value for this chunk\n    a = s.h0;\n    b = s.h1;\n    c = s.h2;\n    d = s.h3;\n\n    // round 1\n    for(i = 0; i < 16; ++i) {\n      w[i] = bytes.getInt32Le();\n      f = d ^ (b & (c ^ d));\n      t = (a + f + _k[i] + w[i]);\n      r = _r[i];\n      a = d;\n      d = c;\n      c = b;\n      b += (t << r) | (t >>> (32 - r));\n    }\n    // round 2\n    for(; i < 32; ++i) {\n      f = c ^ (d & (b ^ c));\n      t = (a + f + _k[i] + w[_g[i]]);\n      r = _r[i];\n      a = d;\n      d = c;\n      c = b;\n      b += (t << r) | (t >>> (32 - r));\n    }\n    // round 3\n    for(; i < 48; ++i) {\n      f = b ^ c ^ d;\n      t = (a + f + _k[i] + w[_g[i]]);\n      r = _r[i];\n      a = d;\n      d = c;\n      c = b;\n      b += (t << r) | (t >>> (32 - r));\n    }\n    // round 4\n    for(; i < 64; ++i) {\n      f = c ^ (b | ~d);\n      t = (a + f + _k[i] + w[_g[i]]);\n      r = _r[i];\n      a = d;\n      d = c;\n      c = b;\n      b += (t << r) | (t >>> (32 - r));\n    }\n\n    // update hash state\n    s.h0 = (s.h0 + a) | 0;\n    s.h1 = (s.h1 + b) | 0;\n    s.h2 = (s.h2 + c) | 0;\n    s.h3 = (s.h3 + d) | 0;\n\n    len -= 64;\n  }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTUuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbm9kZS1mb3JnZS9saWIvbWQ1LmpzP2NlZmIiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBNZXNzYWdlIERpZ2VzdCBBbGdvcml0aG0gNSB3aXRoIDEyOC1iaXQgZGlnZXN0IChNRDUpIGltcGxlbWVudGF0aW9uLlxuICpcbiAqIEBhdXRob3IgRGF2ZSBMb25nbGV5XG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTQgRGlnaXRhbCBCYXphYXIsIEluYy5cbiAqL1xudmFyIGZvcmdlID0gcmVxdWlyZSgnLi9mb3JnZScpO1xucmVxdWlyZSgnLi9tZCcpO1xucmVxdWlyZSgnLi91dGlsJyk7XG5cbnZhciBtZDUgPSBtb2R1bGUuZXhwb3J0cyA9IGZvcmdlLm1kNSA9IGZvcmdlLm1kNSB8fCB7fTtcbmZvcmdlLm1kLm1kNSA9IGZvcmdlLm1kLmFsZ29yaXRobXMubWQ1ID0gbWQ1O1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gTUQ1IG1lc3NhZ2UgZGlnZXN0IG9iamVjdC5cbiAqXG4gKiBAcmV0dXJuIGEgbWVzc2FnZSBkaWdlc3Qgb2JqZWN0LlxuICovXG5tZDUuY3JlYXRlID0gZnVuY3Rpb24oKSB7XG4gIC8vIGRvIGluaXRpYWxpemF0aW9uIGFzIG5lY2Vzc2FyeVxuICBpZighX2luaXRpYWxpemVkKSB7XG4gICAgX2luaXQoKTtcbiAgfVxuXG4gIC8vIE1ENSBzdGF0ZSBjb250YWlucyBmb3VyIDMyLWJpdCBpbnRlZ2Vyc1xuICB2YXIgX3N0YXRlID0gbnVsbDtcblxuICAvLyBpbnB1dCBidWZmZXJcbiAgdmFyIF9pbnB1dCA9IGZvcmdlLnV0aWwuY3JlYXRlQnVmZmVyKCk7XG5cbiAgLy8gdXNlZCBmb3Igd29yZCBzdG9yYWdlXG4gIHZhciBfdyA9IG5ldyBBcnJheSgxNik7XG5cbiAgLy8gbWVzc2FnZSBkaWdlc3Qgb2JqZWN0XG4gIHZhciBtZCA9IHtcbiAgICBhbGdvcml0aG06ICdtZDUnLFxuICAgIGJsb2NrTGVuZ3RoOiA2NCxcbiAgICBkaWdlc3RMZW5ndGg6IDE2LFxuICAgIC8vIDU2LWJpdCBsZW5ndGggb2YgbWVzc2FnZSBzbyBmYXIgKGRvZXMgbm90IGluY2x1ZGluZyBwYWRkaW5nKVxuICAgIG1lc3NhZ2VMZW5ndGg6IDAsXG4gICAgLy8gdHJ1ZSBtZXNzYWdlIGxlbmd0aFxuICAgIGZ1bGxNZXNzYWdlTGVuZ3RoOiBudWxsLFxuICAgIC8vIHNpemUgb2YgbWVzc2FnZSBsZW5ndGggaW4gYnl0ZXNcbiAgICBtZXNzYWdlTGVuZ3RoU2l6ZTogOFxuICB9O1xuXG4gIC8qKlxuICAgKiBTdGFydHMgdGhlIGRpZ2VzdC5cbiAgICpcbiAgICogQHJldHVybiB0aGlzIGRpZ2VzdCBvYmplY3QuXG4gICAqL1xuICBtZC5zdGFydCA9IGZ1bmN0aW9uKCkge1xuICAgIC8vIHVwIHRvIDU2LWJpdCBtZXNzYWdlIGxlbmd0aCBmb3IgY29udmVuaWVuY2VcbiAgICBtZC5tZXNzYWdlTGVuZ3RoID0gMDtcblxuICAgIC8vIGZ1bGwgbWVzc2FnZSBsZW5ndGggKHNldCBtZC5tZXNzYWdlTGVuZ3RoNjQgZm9yIGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5KVxuICAgIG1kLmZ1bGxNZXNzYWdlTGVuZ3RoID0gbWQubWVzc2FnZUxlbmd0aDY0ID0gW107XG4gICAgdmFyIGludDMycyA9IG1kLm1lc3NhZ2VMZW5ndGhTaXplIC8gNDtcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgaW50MzJzOyArK2kpIHtcbiAgICAgIG1kLmZ1bGxNZXNzYWdlTGVuZ3RoLnB1c2goMCk7XG4gICAgfVxuICAgIF9pbnB1dCA9IGZvcmdlLnV0aWwuY3JlYXRlQnVmZmVyKCk7XG4gICAgX3N0YXRlID0ge1xuICAgICAgaDA6IDB4Njc0NTIzMDEsXG4gICAgICBoMTogMHhFRkNEQUI4OSxcbiAgICAgIGgyOiAweDk4QkFEQ0ZFLFxuICAgICAgaDM6IDB4MTAzMjU0NzZcbiAgICB9O1xuICAgIHJldHVybiBtZDtcbiAgfTtcbiAgLy8gc3RhcnQgZGlnZXN0IGF1dG9tYXRpY2FsbHkgZm9yIGZpcnN0IHRpbWVcbiAgbWQuc3RhcnQoKTtcblxuICAvKipcbiAgICogVXBkYXRlcyB0aGUgZGlnZXN0IHdpdGggdGhlIGdpdmVuIG1lc3NhZ2UgaW5wdXQuIFRoZSBnaXZlbiBpbnB1dCBjYW5cbiAgICogdHJlYXRlZCBhcyByYXcgaW5wdXQgKG5vIGVuY29kaW5nIHdpbGwgYmUgYXBwbGllZCkgb3IgYW4gZW5jb2Rpbmcgb2ZcbiAgICogJ3V0ZjgnIG1heWJlIGdpdmVuIHRvIGVuY29kZSB0aGUgaW5wdXQgdXNpbmcgVVRGLTguXG4gICAqXG4gICAqIEBwYXJhbSBtc2cgdGhlIG1lc3NhZ2UgaW5wdXQgdG8gdXBkYXRlIHdpdGguXG4gICAqIEBwYXJhbSBlbmNvZGluZyB0aGUgZW5jb2RpbmcgdG8gdXNlIChkZWZhdWx0OiAncmF3Jywgb3RoZXI6ICd1dGY4JykuXG4gICAqXG4gICAqIEByZXR1cm4gdGhpcyBkaWdlc3Qgb2JqZWN0LlxuICAgKi9cbiAgbWQudXBkYXRlID0gZnVuY3Rpb24obXNnLCBlbmNvZGluZykge1xuICAgIGlmKGVuY29kaW5nID09PSAndXRmOCcpIHtcbiAgICAgIG1zZyA9IGZvcmdlLnV0aWwuZW5jb2RlVXRmOChtc2cpO1xuICAgIH1cblxuICAgIC8vIHVwZGF0ZSBtZXNzYWdlIGxlbmd0aFxuICAgIHZhciBsZW4gPSBtc2cubGVuZ3RoO1xuICAgIG1kLm1lc3NhZ2VMZW5ndGggKz0gbGVuO1xuICAgIGxlbiA9IFsobGVuIC8gMHgxMDAwMDAwMDApID4+PiAwLCBsZW4gPj4+IDBdO1xuICAgIGZvcih2YXIgaSA9IG1kLmZ1bGxNZXNzYWdlTGVuZ3RoLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICBtZC5mdWxsTWVzc2FnZUxlbmd0aFtpXSArPSBsZW5bMV07XG4gICAgICBsZW5bMV0gPSBsZW5bMF0gKyAoKG1kLmZ1bGxNZXNzYWdlTGVuZ3RoW2ldIC8gMHgxMDAwMDAwMDApID4+PiAwKTtcbiAgICAgIG1kLmZ1bGxNZXNzYWdlTGVuZ3RoW2ldID0gbWQuZnVsbE1lc3NhZ2VMZW5ndGhbaV0gPj4+IDA7XG4gICAgICBsZW5bMF0gPSAobGVuWzFdIC8gMHgxMDAwMDAwMDApID4+PiAwO1xuICAgIH1cblxuICAgIC8vIGFkZCBieXRlcyB0byBpbnB1dCBidWZmZXJcbiAgICBfaW5wdXQucHV0Qnl0ZXMobXNnKTtcblxuICAgIC8vIHByb2Nlc3MgYnl0ZXNcbiAgICBfdXBkYXRlKF9zdGF0ZSwgX3csIF9pbnB1dCk7XG5cbiAgICAvLyBjb21wYWN0IGlucHV0IGJ1ZmZlciBldmVyeSAySyBvciBpZiBlbXB0eVxuICAgIGlmKF9pbnB1dC5yZWFkID4gMjA0OCB8fCBfaW5wdXQubGVuZ3RoKCkgPT09IDApIHtcbiAgICAgIF9pbnB1dC5jb21wYWN0KCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1kO1xuICB9O1xuXG4gIC8qKlxuICAgKiBQcm9kdWNlcyB0aGUgZGlnZXN0LlxuICAgKlxuICAgKiBAcmV0dXJuIGEgYnl0ZSBidWZmZXIgY29udGFpbmluZyB0aGUgZGlnZXN0IHZhbHVlLlxuICAgKi9cbiAgbWQuZGlnZXN0ID0gZnVuY3Rpb24oKSB7XG4gICAgLyogTm90ZTogSGVyZSB3ZSBjb3B5IHRoZSByZW1haW5pbmcgYnl0ZXMgaW4gdGhlIGlucHV0IGJ1ZmZlciBhbmRcbiAgICBhZGQgdGhlIGFwcHJvcHJpYXRlIE1ENSBwYWRkaW5nLiBUaGVuIHdlIGRvIHRoZSBmaW5hbCB1cGRhdGVcbiAgICBvbiBhIGNvcHkgb2YgdGhlIHN0YXRlIHNvIHRoYXQgaWYgdGhlIHVzZXIgd2FudHMgdG8gZ2V0XG4gICAgaW50ZXJtZWRpYXRlIGRpZ2VzdHMgdGhleSBjYW4gZG8gc28uICovXG5cbiAgICAvKiBEZXRlcm1pbmUgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IG11c3QgYmUgYWRkZWQgdG8gdGhlIG1lc3NhZ2VcbiAgICB0byBlbnN1cmUgaXRzIGxlbmd0aCBpcyBjb25ncnVlbnQgdG8gNDQ4IG1vZCA1MTIuIEluIG90aGVyIHdvcmRzLFxuICAgIHRoZSBkYXRhIHRvIGJlIGRpZ2VzdGVkIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA1MTIgYml0cyAob3IgMTI4IGJ5dGVzKS5cbiAgICBUaGlzIGRhdGEgaW5jbHVkZXMgdGhlIG1lc3NhZ2UsIHNvbWUgcGFkZGluZywgYW5kIHRoZSBsZW5ndGggb2YgdGhlXG4gICAgbWVzc2FnZS4gU2luY2UgdGhlIGxlbmd0aCBvZiB0aGUgbWVzc2FnZSB3aWxsIGJlIGVuY29kZWQgYXMgOCBieXRlcyAoNjRcbiAgICBiaXRzKSwgdGhhdCBtZWFucyB0aGF0IHRoZSBsYXN0IHNlZ21lbnQgb2YgdGhlIGRhdGEgbXVzdCBoYXZlIDU2IGJ5dGVzXG4gICAgKDQ0OCBiaXRzKSBvZiBtZXNzYWdlIGFuZCBwYWRkaW5nLiBUaGVyZWZvcmUsIHRoZSBsZW5ndGggb2YgdGhlIG1lc3NhZ2VcbiAgICBwbHVzIHRoZSBwYWRkaW5nIG11c3QgYmUgY29uZ3J1ZW50IHRvIDQ0OCBtb2QgNTEyIGJlY2F1c2VcbiAgICA1MTIgLSAxMjggPSA0NDguXG5cbiAgICBJbiBvcmRlciB0byBmaWxsIHVwIHRoZSBtZXNzYWdlIGxlbmd0aCBpdCBtdXN0IGJlIGZpbGxlZCB3aXRoXG4gICAgcGFkZGluZyB0aGF0IGJlZ2lucyB3aXRoIDEgYml0IGZvbGxvd2VkIGJ5IGFsbCAwIGJpdHMuIFBhZGRpbmdcbiAgICBtdXN0ICphbHdheXMqIGJlIHByZXNlbnQsIHNvIGlmIHRoZSBtZXNzYWdlIGxlbmd0aCBpcyBhbHJlYWR5XG4gICAgY29uZ3J1ZW50IHRvIDQ0OCBtb2QgNTEyLCB0aGVuIDUxMiBwYWRkaW5nIGJpdHMgbXVzdCBiZSBhZGRlZC4gKi9cblxuICAgIHZhciBmaW5hbEJsb2NrID0gZm9yZ2UudXRpbC5jcmVhdGVCdWZmZXIoKTtcbiAgICBmaW5hbEJsb2NrLnB1dEJ5dGVzKF9pbnB1dC5ieXRlcygpKTtcblxuICAgIC8vIGNvbXB1dGUgcmVtYWluaW5nIHNpemUgdG8gYmUgZGlnZXN0ZWQgKGluY2x1ZGUgbWVzc2FnZSBsZW5ndGggc2l6ZSlcbiAgICB2YXIgcmVtYWluaW5nID0gKFxuICAgICAgbWQuZnVsbE1lc3NhZ2VMZW5ndGhbbWQuZnVsbE1lc3NhZ2VMZW5ndGgubGVuZ3RoIC0gMV0gK1xuICAgICAgbWQubWVzc2FnZUxlbmd0aFNpemUpO1xuXG4gICAgLy8gYWRkIHBhZGRpbmcgZm9yIG92ZXJmbG93IGJsb2NrU2l6ZSAtIG92ZXJmbG93XG4gICAgLy8gX3BhZGRpbmcgc3RhcnRzIHdpdGggMSBieXRlIHdpdGggZmlyc3QgYml0IGlzIHNldCAoYnl0ZSB2YWx1ZSAxMjgpLCB0aGVuXG4gICAgLy8gdGhlcmUgbWF5IGJlIHVwIHRvIChibG9ja1NpemUgLSAxKSBvdGhlciBwYWQgYnl0ZXNcbiAgICB2YXIgb3ZlcmZsb3cgPSByZW1haW5pbmcgJiAobWQuYmxvY2tMZW5ndGggLSAxKTtcbiAgICBmaW5hbEJsb2NrLnB1dEJ5dGVzKF9wYWRkaW5nLnN1YnN0cigwLCBtZC5ibG9ja0xlbmd0aCAtIG92ZXJmbG93KSk7XG5cbiAgICAvLyBzZXJpYWxpemUgbWVzc2FnZSBsZW5ndGggaW4gYml0cyBpbiBsaXR0bGUtZW5kaWFuIG9yZGVyOyBzaW5jZSBsZW5ndGhcbiAgICAvLyBpcyBzdG9yZWQgaW4gYnl0ZXMgd2UgbXVsdGlwbHkgYnkgOCBhbmQgYWRkIGNhcnJ5XG4gICAgdmFyIGJpdHMsIGNhcnJ5ID0gMDtcbiAgICBmb3IodmFyIGkgPSBtZC5mdWxsTWVzc2FnZUxlbmd0aC5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgYml0cyA9IG1kLmZ1bGxNZXNzYWdlTGVuZ3RoW2ldICogOCArIGNhcnJ5O1xuICAgICAgY2FycnkgPSAoYml0cyAvIDB4MTAwMDAwMDAwKSA+Pj4gMDtcbiAgICAgIGZpbmFsQmxvY2sucHV0SW50MzJMZShiaXRzID4+PiAwKTtcbiAgICB9XG5cbiAgICB2YXIgczIgPSB7XG4gICAgICBoMDogX3N0YXRlLmgwLFxuICAgICAgaDE6IF9zdGF0ZS5oMSxcbiAgICAgIGgyOiBfc3RhdGUuaDIsXG4gICAgICBoMzogX3N0YXRlLmgzXG4gICAgfTtcbiAgICBfdXBkYXRlKHMyLCBfdywgZmluYWxCbG9jayk7XG4gICAgdmFyIHJ2YWwgPSBmb3JnZS51dGlsLmNyZWF0ZUJ1ZmZlcigpO1xuICAgIHJ2YWwucHV0SW50MzJMZShzMi5oMCk7XG4gICAgcnZhbC5wdXRJbnQzMkxlKHMyLmgxKTtcbiAgICBydmFsLnB1dEludDMyTGUoczIuaDIpO1xuICAgIHJ2YWwucHV0SW50MzJMZShzMi5oMyk7XG4gICAgcmV0dXJuIHJ2YWw7XG4gIH07XG5cbiAgcmV0dXJuIG1kO1xufTtcblxuLy8gcGFkZGluZywgY29uc3RhbnQgdGFibGVzIGZvciBjYWxjdWxhdGluZyBtZDVcbnZhciBfcGFkZGluZyA9IG51bGw7XG52YXIgX2cgPSBudWxsO1xudmFyIF9yID0gbnVsbDtcbnZhciBfayA9IG51bGw7XG52YXIgX2luaXRpYWxpemVkID0gZmFsc2U7XG5cbi8qKlxuICogSW5pdGlhbGl6ZXMgdGhlIGNvbnN0YW50IHRhYmxlcy5cbiAqL1xuZnVuY3Rpb24gX2luaXQoKSB7XG4gIC8vIGNyZWF0ZSBwYWRkaW5nXG4gIF9wYWRkaW5nID0gU3RyaW5nLmZyb21DaGFyQ29kZSgxMjgpO1xuICBfcGFkZGluZyArPSBmb3JnZS51dGlsLmZpbGxTdHJpbmcoU3RyaW5nLmZyb21DaGFyQ29kZSgweDAwKSwgNjQpO1xuXG4gIC8vIGcgdmFsdWVzXG4gIF9nID0gW1xuICAgIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsXG4gICAgMSwgNiwgMTEsIDAsIDUsIDEwLCAxNSwgNCwgOSwgMTQsIDMsIDgsIDEzLCAyLCA3LCAxMixcbiAgICA1LCA4LCAxMSwgMTQsIDEsIDQsIDcsIDEwLCAxMywgMCwgMywgNiwgOSwgMTIsIDE1LCAyLFxuICAgIDAsIDcsIDE0LCA1LCAxMiwgMywgMTAsIDEsIDgsIDE1LCA2LCAxMywgNCwgMTEsIDIsIDldO1xuXG4gIC8vIHJvdW5kcyB0YWJsZVxuICBfciA9IFtcbiAgICA3LCAxMiwgMTcsIDIyLCAgNywgMTIsIDE3LCAyMiwgIDcsIDEyLCAxNywgMjIsICA3LCAxMiwgMTcsIDIyLFxuICAgIDUsICA5LCAxNCwgMjAsICA1LCAgOSwgMTQsIDIwLCAgNSwgIDksIDE0LCAyMCwgIDUsICA5LCAxNCwgMjAsXG4gICAgNCwgMTEsIDE2LCAyMywgIDQsIDExLCAxNiwgMjMsICA0LCAxMSwgMTYsIDIzLCAgNCwgMTEsIDE2LCAyMyxcbiAgICA2LCAxMCwgMTUsIDIxLCAgNiwgMTAsIDE1LCAyMSwgIDYsIDEwLCAxNSwgMjEsICA2LCAxMCwgMTUsIDIxXTtcblxuICAvLyBnZXQgdGhlIHJlc3VsdCBvZiBhYnMoc2luKGkgKyAxKSkgYXMgYSAzMi1iaXQgaW50ZWdlclxuICBfayA9IG5ldyBBcnJheSg2NCk7XG4gIGZvcih2YXIgaSA9IDA7IGkgPCA2NDsgKytpKSB7XG4gICAgX2tbaV0gPSBNYXRoLmZsb29yKE1hdGguYWJzKE1hdGguc2luKGkgKyAxKSkgKiAweDEwMDAwMDAwMCk7XG4gIH1cblxuICAvLyBub3cgaW5pdGlhbGl6ZWRcbiAgX2luaXRpYWxpemVkID0gdHJ1ZTtcbn1cblxuLyoqXG4gKiBVcGRhdGVzIGFuIE1ENSBzdGF0ZSB3aXRoIHRoZSBnaXZlbiBieXRlIGJ1ZmZlci5cbiAqXG4gKiBAcGFyYW0gcyB0aGUgTUQ1IHN0YXRlIHRvIHVwZGF0ZS5cbiAqIEBwYXJhbSB3IHRoZSBhcnJheSB0byB1c2UgdG8gc3RvcmUgd29yZHMuXG4gKiBAcGFyYW0gYnl0ZXMgdGhlIGJ5dGUgYnVmZmVyIHRvIHVwZGF0ZSB3aXRoLlxuICovXG5mdW5jdGlvbiBfdXBkYXRlKHMsIHcsIGJ5dGVzKSB7XG4gIC8vIGNvbnN1bWUgNTEyIGJpdCAoNjQgYnl0ZSkgY2h1bmtzXG4gIHZhciB0LCBhLCBiLCBjLCBkLCBmLCByLCBpO1xuICB2YXIgbGVuID0gYnl0ZXMubGVuZ3RoKCk7XG4gIHdoaWxlKGxlbiA+PSA2NCkge1xuICAgIC8vIGluaXRpYWxpemUgaGFzaCB2YWx1ZSBmb3IgdGhpcyBjaHVua1xuICAgIGEgPSBzLmgwO1xuICAgIGIgPSBzLmgxO1xuICAgIGMgPSBzLmgyO1xuICAgIGQgPSBzLmgzO1xuXG4gICAgLy8gcm91bmQgMVxuICAgIGZvcihpID0gMDsgaSA8IDE2OyArK2kpIHtcbiAgICAgIHdbaV0gPSBieXRlcy5nZXRJbnQzMkxlKCk7XG4gICAgICBmID0gZCBeIChiICYgKGMgXiBkKSk7XG4gICAgICB0ID0gKGEgKyBmICsgX2tbaV0gKyB3W2ldKTtcbiAgICAgIHIgPSBfcltpXTtcbiAgICAgIGEgPSBkO1xuICAgICAgZCA9IGM7XG4gICAgICBjID0gYjtcbiAgICAgIGIgKz0gKHQgPDwgcikgfCAodCA+Pj4gKDMyIC0gcikpO1xuICAgIH1cbiAgICAvLyByb3VuZCAyXG4gICAgZm9yKDsgaSA8IDMyOyArK2kpIHtcbiAgICAgIGYgPSBjIF4gKGQgJiAoYiBeIGMpKTtcbiAgICAgIHQgPSAoYSArIGYgKyBfa1tpXSArIHdbX2dbaV1dKTtcbiAgICAgIHIgPSBfcltpXTtcbiAgICAgIGEgPSBkO1xuICAgICAgZCA9IGM7XG4gICAgICBjID0gYjtcbiAgICAgIGIgKz0gKHQgPDwgcikgfCAodCA+Pj4gKDMyIC0gcikpO1xuICAgIH1cbiAgICAvLyByb3VuZCAzXG4gICAgZm9yKDsgaSA8IDQ4OyArK2kpIHtcbiAgICAgIGYgPSBiIF4gYyBeIGQ7XG4gICAgICB0ID0gKGEgKyBmICsgX2tbaV0gKyB3W19nW2ldXSk7XG4gICAgICByID0gX3JbaV07XG4gICAgICBhID0gZDtcbiAgICAgIGQgPSBjO1xuICAgICAgYyA9IGI7XG4gICAgICBiICs9ICh0IDw8IHIpIHwgKHQgPj4+ICgzMiAtIHIpKTtcbiAgICB9XG4gICAgLy8gcm91bmQgNFxuICAgIGZvcig7IGkgPCA2NDsgKytpKSB7XG4gICAgICBmID0gYyBeIChiIHwgfmQpO1xuICAgICAgdCA9IChhICsgZiArIF9rW2ldICsgd1tfZ1tpXV0pO1xuICAgICAgciA9IF9yW2ldO1xuICAgICAgYSA9IGQ7XG4gICAgICBkID0gYztcbiAgICAgIGMgPSBiO1xuICAgICAgYiArPSAodCA8PCByKSB8ICh0ID4+PiAoMzIgLSByKSk7XG4gICAgfVxuXG4gICAgLy8gdXBkYXRlIGhhc2ggc3RhdGVcbiAgICBzLmgwID0gKHMuaDAgKyBhKSB8IDA7XG4gICAgcy5oMSA9IChzLmgxICsgYikgfCAwO1xuICAgIHMuaDIgPSAocy5oMiArIGMpIHwgMDtcbiAgICBzLmgzID0gKHMuaDMgKyBkKSB8IDA7XG5cbiAgICBsZW4gLT0gNjQ7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///55\n")},function(module,exports,__webpack_require__){eval("/* WEBPACK VAR INJECTION */(function(Buffer) {/**\n * Password-Based Key-Derivation Function #2 implementation.\n *\n * See RFC 2898 for details.\n *\n * @author Dave Longley\n *\n * Copyright (c) 2010-2013 Digital Bazaar, Inc.\n */\nvar forge = __webpack_require__(4);\n__webpack_require__(31);\n__webpack_require__(17);\n__webpack_require__(7);\n\nvar pkcs5 = forge.pkcs5 = forge.pkcs5 || {};\n\nvar crypto;\nif(forge.util.isNodejs && !forge.options.usePureJavaScript) {\n  crypto = __webpack_require__(57);\n}\n\n/**\n * Derives a key from a password.\n *\n * @param p the password as a binary-encoded string of bytes.\n * @param s the salt as a binary-encoded string of bytes.\n * @param c the iteration count, a positive integer.\n * @param dkLen the intended length, in bytes, of the derived key,\n *          (max: 2^32 - 1) * hash length of the PRF.\n * @param [md] the message digest (or algorithm identifier as a string) to use\n *          in the PRF, defaults to SHA-1.\n * @param [callback(err, key)] presence triggers asynchronous version, called\n *          once the operation completes.\n *\n * @return the derived key, as a binary-encoded string of bytes, for the\n *           synchronous version (if no callback is specified).\n */\nmodule.exports = forge.pbkdf2 = pkcs5.pbkdf2 = function(\n  p, s, c, dkLen, md, callback) {\n  if(typeof md === 'function') {\n    callback = md;\n    md = null;\n  }\n\n  // use native implementation if possible and not disabled, note that\n  // some node versions only support SHA-1, others allow digest to be changed\n  if(forge.util.isNodejs && !forge.options.usePureJavaScript &&\n    crypto.pbkdf2 && (md === null || typeof md !== 'object') &&\n    (crypto.pbkdf2Sync.length > 4 || (!md || md === 'sha1'))) {\n    if(typeof md !== 'string') {\n      // default prf to SHA-1\n      md = 'sha1';\n    }\n    p = Buffer.from(p, 'binary');\n    s = Buffer.from(s, 'binary');\n    if(!callback) {\n      if(crypto.pbkdf2Sync.length === 4) {\n        return crypto.pbkdf2Sync(p, s, c, dkLen).toString('binary');\n      }\n      return crypto.pbkdf2Sync(p, s, c, dkLen, md).toString('binary');\n    }\n    if(crypto.pbkdf2Sync.length === 4) {\n      return crypto.pbkdf2(p, s, c, dkLen, function(err, key) {\n        if(err) {\n          return callback(err);\n        }\n        callback(null, key.toString('binary'));\n      });\n    }\n    return crypto.pbkdf2(p, s, c, dkLen, md, function(err, key) {\n      if(err) {\n        return callback(err);\n      }\n      callback(null, key.toString('binary'));\n    });\n  }\n\n  if(typeof md === 'undefined' || md === null) {\n    // default prf to SHA-1\n    md = 'sha1';\n  }\n  if(typeof md === 'string') {\n    if(!(md in forge.md.algorithms)) {\n      throw new Error('Unknown hash algorithm: ' + md);\n    }\n    md = forge.md[md].create();\n  }\n\n  var hLen = md.digestLength;\n\n  /* 1. If dkLen > (2^32 - 1) * hLen, output \"derived key too long\" and\n    stop. */\n  if(dkLen > (0xFFFFFFFF * hLen)) {\n    var err = new Error('Derived key is too long.');\n    if(callback) {\n      return callback(err);\n    }\n    throw err;\n  }\n\n  /* 2. Let len be the number of hLen-octet blocks in the derived key,\n    rounding up, and let r be the number of octets in the last\n    block:\n\n    len = CEIL(dkLen / hLen),\n    r = dkLen - (len - 1) * hLen. */\n  var len = Math.ceil(dkLen / hLen);\n  var r = dkLen - (len - 1) * hLen;\n\n  /* 3. For each block of the derived key apply the function F defined\n    below to the password P, the salt S, the iteration count c, and\n    the block index to compute the block:\n\n    T_1 = F(P, S, c, 1),\n    T_2 = F(P, S, c, 2),\n    ...\n    T_len = F(P, S, c, len),\n\n    where the function F is defined as the exclusive-or sum of the\n    first c iterates of the underlying pseudorandom function PRF\n    applied to the password P and the concatenation of the salt S\n    and the block index i:\n\n    F(P, S, c, i) = u_1 XOR u_2 XOR ... XOR u_c\n\n    where\n\n    u_1 = PRF(P, S || INT(i)),\n    u_2 = PRF(P, u_1),\n    ...\n    u_c = PRF(P, u_{c-1}).\n\n    Here, INT(i) is a four-octet encoding of the integer i, most\n    significant octet first. */\n  var prf = forge.hmac.create();\n  prf.start(md, p);\n  var dk = '';\n  var xor, u_c, u_c1;\n\n  // sync version\n  if(!callback) {\n    for(var i = 1; i <= len; ++i) {\n      // PRF(P, S || INT(i)) (first iteration)\n      prf.start(null, null);\n      prf.update(s);\n      prf.update(forge.util.int32ToBytes(i));\n      xor = u_c1 = prf.digest().getBytes();\n\n      // PRF(P, u_{c-1}) (other iterations)\n      for(var j = 2; j <= c; ++j) {\n        prf.start(null, null);\n        prf.update(u_c1);\n        u_c = prf.digest().getBytes();\n        // F(p, s, c, i)\n        xor = forge.util.xorBytes(xor, u_c, hLen);\n        u_c1 = u_c;\n      }\n\n      /* 4. Concatenate the blocks and extract the first dkLen octets to\n        produce a derived key DK:\n\n        DK = T_1 || T_2 ||  ...  || T_len<0..r-1> */\n      dk += (i < len) ? xor : xor.substr(0, r);\n    }\n    /* 5. Output the derived key DK. */\n    return dk;\n  }\n\n  // async version\n  var i = 1, j;\n  function outer() {\n    if(i > len) {\n      // done\n      return callback(null, dk);\n    }\n\n    // PRF(P, S || INT(i)) (first iteration)\n    prf.start(null, null);\n    prf.update(s);\n    prf.update(forge.util.int32ToBytes(i));\n    xor = u_c1 = prf.digest().getBytes();\n\n    // PRF(P, u_{c-1}) (other iterations)\n    j = 2;\n    inner();\n  }\n\n  function inner() {\n    if(j <= c) {\n      prf.start(null, null);\n      prf.update(u_c1);\n      u_c = prf.digest().getBytes();\n      // F(p, s, c, i)\n      xor = forge.util.xorBytes(xor, u_c, hLen);\n      u_c1 = u_c;\n      ++j;\n      return forge.util.setImmediate(inner);\n    }\n\n    /* 4. Concatenate the blocks and extract the first dkLen octets to\n      produce a derived key DK:\n\n      DK = T_1 || T_2 ||  ...  || T_len<0..r-1> */\n    dk += (i < len) ? xor : xor.substr(0, r);\n\n    ++i;\n    outer();\n  }\n\n  outer();\n};\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(30).Buffer))//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTYuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbm9kZS1mb3JnZS9saWIvcGJrZGYyLmpzPzFhMjMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBQYXNzd29yZC1CYXNlZCBLZXktRGVyaXZhdGlvbiBGdW5jdGlvbiAjMiBpbXBsZW1lbnRhdGlvbi5cbiAqXG4gKiBTZWUgUkZDIDI4OTggZm9yIGRldGFpbHMuXG4gKlxuICogQGF1dGhvciBEYXZlIExvbmdsZXlcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMyBEaWdpdGFsIEJhemFhciwgSW5jLlxuICovXG52YXIgZm9yZ2UgPSByZXF1aXJlKCcuL2ZvcmdlJyk7XG5yZXF1aXJlKCcuL2htYWMnKTtcbnJlcXVpcmUoJy4vbWQnKTtcbnJlcXVpcmUoJy4vdXRpbCcpO1xuXG52YXIgcGtjczUgPSBmb3JnZS5wa2NzNSA9IGZvcmdlLnBrY3M1IHx8IHt9O1xuXG52YXIgY3J5cHRvO1xuaWYoZm9yZ2UudXRpbC5pc05vZGVqcyAmJiAhZm9yZ2Uub3B0aW9ucy51c2VQdXJlSmF2YVNjcmlwdCkge1xuICBjcnlwdG8gPSByZXF1aXJlKCdjcnlwdG8nKTtcbn1cblxuLyoqXG4gKiBEZXJpdmVzIGEga2V5IGZyb20gYSBwYXNzd29yZC5cbiAqXG4gKiBAcGFyYW0gcCB0aGUgcGFzc3dvcmQgYXMgYSBiaW5hcnktZW5jb2RlZCBzdHJpbmcgb2YgYnl0ZXMuXG4gKiBAcGFyYW0gcyB0aGUgc2FsdCBhcyBhIGJpbmFyeS1lbmNvZGVkIHN0cmluZyBvZiBieXRlcy5cbiAqIEBwYXJhbSBjIHRoZSBpdGVyYXRpb24gY291bnQsIGEgcG9zaXRpdmUgaW50ZWdlci5cbiAqIEBwYXJhbSBka0xlbiB0aGUgaW50ZW5kZWQgbGVuZ3RoLCBpbiBieXRlcywgb2YgdGhlIGRlcml2ZWQga2V5LFxuICogICAgICAgICAgKG1heDogMl4zMiAtIDEpICogaGFzaCBsZW5ndGggb2YgdGhlIFBSRi5cbiAqIEBwYXJhbSBbbWRdIHRoZSBtZXNzYWdlIGRpZ2VzdCAob3IgYWxnb3JpdGhtIGlkZW50aWZpZXIgYXMgYSBzdHJpbmcpIHRvIHVzZVxuICogICAgICAgICAgaW4gdGhlIFBSRiwgZGVmYXVsdHMgdG8gU0hBLTEuXG4gKiBAcGFyYW0gW2NhbGxiYWNrKGVyciwga2V5KV0gcHJlc2VuY2UgdHJpZ2dlcnMgYXN5bmNocm9ub3VzIHZlcnNpb24sIGNhbGxlZFxuICogICAgICAgICAgb25jZSB0aGUgb3BlcmF0aW9uIGNvbXBsZXRlcy5cbiAqXG4gKiBAcmV0dXJuIHRoZSBkZXJpdmVkIGtleSwgYXMgYSBiaW5hcnktZW5jb2RlZCBzdHJpbmcgb2YgYnl0ZXMsIGZvciB0aGVcbiAqICAgICAgICAgICBzeW5jaHJvbm91cyB2ZXJzaW9uIChpZiBubyBjYWxsYmFjayBpcyBzcGVjaWZpZWQpLlxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZvcmdlLnBia2RmMiA9IHBrY3M1LnBia2RmMiA9IGZ1bmN0aW9uKFxuICBwLCBzLCBjLCBka0xlbiwgbWQsIGNhbGxiYWNrKSB7XG4gIGlmKHR5cGVvZiBtZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNhbGxiYWNrID0gbWQ7XG4gICAgbWQgPSBudWxsO1xuICB9XG5cbiAgLy8gdXNlIG5hdGl2ZSBpbXBsZW1lbnRhdGlvbiBpZiBwb3NzaWJsZSBhbmQgbm90IGRpc2FibGVkLCBub3RlIHRoYXRcbiAgLy8gc29tZSBub2RlIHZlcnNpb25zIG9ubHkgc3VwcG9ydCBTSEEtMSwgb3RoZXJzIGFsbG93IGRpZ2VzdCB0byBiZSBjaGFuZ2VkXG4gIGlmKGZvcmdlLnV0aWwuaXNOb2RlanMgJiYgIWZvcmdlLm9wdGlvbnMudXNlUHVyZUphdmFTY3JpcHQgJiZcbiAgICBjcnlwdG8ucGJrZGYyICYmIChtZCA9PT0gbnVsbCB8fCB0eXBlb2YgbWQgIT09ICdvYmplY3QnKSAmJlxuICAgIChjcnlwdG8ucGJrZGYyU3luYy5sZW5ndGggPiA0IHx8ICghbWQgfHwgbWQgPT09ICdzaGExJykpKSB7XG4gICAgaWYodHlwZW9mIG1kICE9PSAnc3RyaW5nJykge1xuICAgICAgLy8gZGVmYXVsdCBwcmYgdG8gU0hBLTFcbiAgICAgIG1kID0gJ3NoYTEnO1xuICAgIH1cbiAgICBwID0gQnVmZmVyLmZyb20ocCwgJ2JpbmFyeScpO1xuICAgIHMgPSBCdWZmZXIuZnJvbShzLCAnYmluYXJ5Jyk7XG4gICAgaWYoIWNhbGxiYWNrKSB7XG4gICAgICBpZihjcnlwdG8ucGJrZGYyU3luYy5sZW5ndGggPT09IDQpIHtcbiAgICAgICAgcmV0dXJuIGNyeXB0by5wYmtkZjJTeW5jKHAsIHMsIGMsIGRrTGVuKS50b1N0cmluZygnYmluYXJ5Jyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gY3J5cHRvLnBia2RmMlN5bmMocCwgcywgYywgZGtMZW4sIG1kKS50b1N0cmluZygnYmluYXJ5Jyk7XG4gICAgfVxuICAgIGlmKGNyeXB0by5wYmtkZjJTeW5jLmxlbmd0aCA9PT0gNCkge1xuICAgICAgcmV0dXJuIGNyeXB0by5wYmtkZjIocCwgcywgYywgZGtMZW4sIGZ1bmN0aW9uKGVyciwga2V5KSB7XG4gICAgICAgIGlmKGVycikge1xuICAgICAgICAgIHJldHVybiBjYWxsYmFjayhlcnIpO1xuICAgICAgICB9XG4gICAgICAgIGNhbGxiYWNrKG51bGwsIGtleS50b1N0cmluZygnYmluYXJ5JykpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBjcnlwdG8ucGJrZGYyKHAsIHMsIGMsIGRrTGVuLCBtZCwgZnVuY3Rpb24oZXJyLCBrZXkpIHtcbiAgICAgIGlmKGVycikge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICAgIH1cbiAgICAgIGNhbGxiYWNrKG51bGwsIGtleS50b1N0cmluZygnYmluYXJ5JykpO1xuICAgIH0pO1xuICB9XG5cbiAgaWYodHlwZW9mIG1kID09PSAndW5kZWZpbmVkJyB8fCBtZCA9PT0gbnVsbCkge1xuICAgIC8vIGRlZmF1bHQgcHJmIHRvIFNIQS0xXG4gICAgbWQgPSAnc2hhMSc7XG4gIH1cbiAgaWYodHlwZW9mIG1kID09PSAnc3RyaW5nJykge1xuICAgIGlmKCEobWQgaW4gZm9yZ2UubWQuYWxnb3JpdGhtcykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVW5rbm93biBoYXNoIGFsZ29yaXRobTogJyArIG1kKTtcbiAgICB9XG4gICAgbWQgPSBmb3JnZS5tZFttZF0uY3JlYXRlKCk7XG4gIH1cblxuICB2YXIgaExlbiA9IG1kLmRpZ2VzdExlbmd0aDtcblxuICAvKiAxLiBJZiBka0xlbiA+ICgyXjMyIC0gMSkgKiBoTGVuLCBvdXRwdXQgXCJkZXJpdmVkIGtleSB0b28gbG9uZ1wiIGFuZFxuICAgIHN0b3AuICovXG4gIGlmKGRrTGVuID4gKDB4RkZGRkZGRkYgKiBoTGVuKSkge1xuICAgIHZhciBlcnIgPSBuZXcgRXJyb3IoJ0Rlcml2ZWQga2V5IGlzIHRvbyBsb25nLicpO1xuICAgIGlmKGNhbGxiYWNrKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICB9XG4gICAgdGhyb3cgZXJyO1xuICB9XG5cbiAgLyogMi4gTGV0IGxlbiBiZSB0aGUgbnVtYmVyIG9mIGhMZW4tb2N0ZXQgYmxvY2tzIGluIHRoZSBkZXJpdmVkIGtleSxcbiAgICByb3VuZGluZyB1cCwgYW5kIGxldCByIGJlIHRoZSBudW1iZXIgb2Ygb2N0ZXRzIGluIHRoZSBsYXN0XG4gICAgYmxvY2s6XG5cbiAgICBsZW4gPSBDRUlMKGRrTGVuIC8gaExlbiksXG4gICAgciA9IGRrTGVuIC0gKGxlbiAtIDEpICogaExlbi4gKi9cbiAgdmFyIGxlbiA9IE1hdGguY2VpbChka0xlbiAvIGhMZW4pO1xuICB2YXIgciA9IGRrTGVuIC0gKGxlbiAtIDEpICogaExlbjtcblxuICAvKiAzLiBGb3IgZWFjaCBibG9jayBvZiB0aGUgZGVyaXZlZCBrZXkgYXBwbHkgdGhlIGZ1bmN0aW9uIEYgZGVmaW5lZFxuICAgIGJlbG93IHRvIHRoZSBwYXNzd29yZCBQLCB0aGUgc2FsdCBTLCB0aGUgaXRlcmF0aW9uIGNvdW50IGMsIGFuZFxuICAgIHRoZSBibG9jayBpbmRleCB0byBjb21wdXRlIHRoZSBibG9jazpcblxuICAgIFRfMSA9IEYoUCwgUywgYywgMSksXG4gICAgVF8yID0gRihQLCBTLCBjLCAyKSxcbiAgICAuLi5cbiAgICBUX2xlbiA9IEYoUCwgUywgYywgbGVuKSxcblxuICAgIHdoZXJlIHRoZSBmdW5jdGlvbiBGIGlzIGRlZmluZWQgYXMgdGhlIGV4Y2x1c2l2ZS1vciBzdW0gb2YgdGhlXG4gICAgZmlyc3QgYyBpdGVyYXRlcyBvZiB0aGUgdW5kZXJseWluZyBwc2V1ZG9yYW5kb20gZnVuY3Rpb24gUFJGXG4gICAgYXBwbGllZCB0byB0aGUgcGFzc3dvcmQgUCBhbmQgdGhlIGNvbmNhdGVuYXRpb24gb2YgdGhlIHNhbHQgU1xuICAgIGFuZCB0aGUgYmxvY2sgaW5kZXggaTpcblxuICAgIEYoUCwgUywgYywgaSkgPSB1XzEgWE9SIHVfMiBYT1IgLi4uIFhPUiB1X2NcblxuICAgIHdoZXJlXG5cbiAgICB1XzEgPSBQUkYoUCwgUyB8fCBJTlQoaSkpLFxuICAgIHVfMiA9IFBSRihQLCB1XzEpLFxuICAgIC4uLlxuICAgIHVfYyA9IFBSRihQLCB1X3tjLTF9KS5cblxuICAgIEhlcmUsIElOVChpKSBpcyBhIGZvdXItb2N0ZXQgZW5jb2Rpbmcgb2YgdGhlIGludGVnZXIgaSwgbW9zdFxuICAgIHNpZ25pZmljYW50IG9jdGV0IGZpcnN0LiAqL1xuICB2YXIgcHJmID0gZm9yZ2UuaG1hYy5jcmVhdGUoKTtcbiAgcHJmLnN0YXJ0KG1kLCBwKTtcbiAgdmFyIGRrID0gJyc7XG4gIHZhciB4b3IsIHVfYywgdV9jMTtcblxuICAvLyBzeW5jIHZlcnNpb25cbiAgaWYoIWNhbGxiYWNrKSB7XG4gICAgZm9yKHZhciBpID0gMTsgaSA8PSBsZW47ICsraSkge1xuICAgICAgLy8gUFJGKFAsIFMgfHwgSU5UKGkpKSAoZmlyc3QgaXRlcmF0aW9uKVxuICAgICAgcHJmLnN0YXJ0KG51bGwsIG51bGwpO1xuICAgICAgcHJmLnVwZGF0ZShzKTtcbiAgICAgIHByZi51cGRhdGUoZm9yZ2UudXRpbC5pbnQzMlRvQnl0ZXMoaSkpO1xuICAgICAgeG9yID0gdV9jMSA9IHByZi5kaWdlc3QoKS5nZXRCeXRlcygpO1xuXG4gICAgICAvLyBQUkYoUCwgdV97Yy0xfSkgKG90aGVyIGl0ZXJhdGlvbnMpXG4gICAgICBmb3IodmFyIGogPSAyOyBqIDw9IGM7ICsraikge1xuICAgICAgICBwcmYuc3RhcnQobnVsbCwgbnVsbCk7XG4gICAgICAgIHByZi51cGRhdGUodV9jMSk7XG4gICAgICAgIHVfYyA9IHByZi5kaWdlc3QoKS5nZXRCeXRlcygpO1xuICAgICAgICAvLyBGKHAsIHMsIGMsIGkpXG4gICAgICAgIHhvciA9IGZvcmdlLnV0aWwueG9yQnl0ZXMoeG9yLCB1X2MsIGhMZW4pO1xuICAgICAgICB1X2MxID0gdV9jO1xuICAgICAgfVxuXG4gICAgICAvKiA0LiBDb25jYXRlbmF0ZSB0aGUgYmxvY2tzIGFuZCBleHRyYWN0IHRoZSBmaXJzdCBka0xlbiBvY3RldHMgdG9cbiAgICAgICAgcHJvZHVjZSBhIGRlcml2ZWQga2V5IERLOlxuXG4gICAgICAgIERLID0gVF8xIHx8IFRfMiB8fCAgLi4uICB8fCBUX2xlbjwwLi5yLTE+ICovXG4gICAgICBkayArPSAoaSA8IGxlbikgPyB4b3IgOiB4b3Iuc3Vic3RyKDAsIHIpO1xuICAgIH1cbiAgICAvKiA1LiBPdXRwdXQgdGhlIGRlcml2ZWQga2V5IERLLiAqL1xuICAgIHJldHVybiBkaztcbiAgfVxuXG4gIC8vIGFzeW5jIHZlcnNpb25cbiAgdmFyIGkgPSAxLCBqO1xuICBmdW5jdGlvbiBvdXRlcigpIHtcbiAgICBpZihpID4gbGVuKSB7XG4gICAgICAvLyBkb25lXG4gICAgICByZXR1cm4gY2FsbGJhY2sobnVsbCwgZGspO1xuICAgIH1cblxuICAgIC8vIFBSRihQLCBTIHx8IElOVChpKSkgKGZpcnN0IGl0ZXJhdGlvbilcbiAgICBwcmYuc3RhcnQobnVsbCwgbnVsbCk7XG4gICAgcHJmLnVwZGF0ZShzKTtcbiAgICBwcmYudXBkYXRlKGZvcmdlLnV0aWwuaW50MzJUb0J5dGVzKGkpKTtcbiAgICB4b3IgPSB1X2MxID0gcHJmLmRpZ2VzdCgpLmdldEJ5dGVzKCk7XG5cbiAgICAvLyBQUkYoUCwgdV97Yy0xfSkgKG90aGVyIGl0ZXJhdGlvbnMpXG4gICAgaiA9IDI7XG4gICAgaW5uZXIoKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGlubmVyKCkge1xuICAgIGlmKGogPD0gYykge1xuICAgICAgcHJmLnN0YXJ0KG51bGwsIG51bGwpO1xuICAgICAgcHJmLnVwZGF0ZSh1X2MxKTtcbiAgICAgIHVfYyA9IHByZi5kaWdlc3QoKS5nZXRCeXRlcygpO1xuICAgICAgLy8gRihwLCBzLCBjLCBpKVxuICAgICAgeG9yID0gZm9yZ2UudXRpbC54b3JCeXRlcyh4b3IsIHVfYywgaExlbik7XG4gICAgICB1X2MxID0gdV9jO1xuICAgICAgKytqO1xuICAgICAgcmV0dXJuIGZvcmdlLnV0aWwuc2V0SW1tZWRpYXRlKGlubmVyKTtcbiAgICB9XG5cbiAgICAvKiA0LiBDb25jYXRlbmF0ZSB0aGUgYmxvY2tzIGFuZCBleHRyYWN0IHRoZSBmaXJzdCBka0xlbiBvY3RldHMgdG9cbiAgICAgIHByb2R1Y2UgYSBkZXJpdmVkIGtleSBESzpcblxuICAgICAgREsgPSBUXzEgfHwgVF8yIHx8ICAuLi4gIHx8IFRfbGVuPDAuLnItMT4gKi9cbiAgICBkayArPSAoaSA8IGxlbikgPyB4b3IgOiB4b3Iuc3Vic3RyKDAsIHIpO1xuXG4gICAgKytpO1xuICAgIG91dGVyKCk7XG4gIH1cblxuICBvdXRlcigpO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///56\n")},function(module,exports){eval("/* (ignored) *///# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTcuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vY3J5cHRvIChpZ25vcmVkKT8wN2Q2Il0sInNvdXJjZXNDb250ZW50IjpbIi8qIChpZ25vcmVkKSAqLyJdLCJtYXBwaW5ncyI6IkFBQUEiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///57\n")},function(module,exports,__webpack_require__){eval("/**\n * Javascript implementation of X.509 and related components (such as\n * Certification Signing Requests) of a Public Key Infrastructure.\n *\n * @author Dave Longley\n *\n * Copyright (c) 2010-2014 Digital Bazaar, Inc.\n *\n * The ASN.1 representation of an X.509v3 certificate is as follows\n * (see RFC 2459):\n *\n * Certificate ::= SEQUENCE {\n *   tbsCertificate       TBSCertificate,\n *   signatureAlgorithm   AlgorithmIdentifier,\n *   signatureValue       BIT STRING\n * }\n *\n * TBSCertificate ::= SEQUENCE {\n *   version         [0]  EXPLICIT Version DEFAULT v1,\n *   serialNumber         CertificateSerialNumber,\n *   signature            AlgorithmIdentifier,\n *   issuer               Name,\n *   validity             Validity,\n *   subject              Name,\n *   subjectPublicKeyInfo SubjectPublicKeyInfo,\n *   issuerUniqueID  [1]  IMPLICIT UniqueIdentifier OPTIONAL,\n *                        -- If present, version shall be v2 or v3\n *   subjectUniqueID [2]  IMPLICIT UniqueIdentifier OPTIONAL,\n *                        -- If present, version shall be v2 or v3\n *   extensions      [3]  EXPLICIT Extensions OPTIONAL\n *                        -- If present, version shall be v3\n * }\n *\n * Version ::= INTEGER  { v1(0), v2(1), v3(2) }\n *\n * CertificateSerialNumber ::= INTEGER\n *\n * Name ::= CHOICE {\n *   // only one possible choice for now\n *   RDNSequence\n * }\n *\n * RDNSequence ::= SEQUENCE OF RelativeDistinguishedName\n *\n * RelativeDistinguishedName ::= SET OF AttributeTypeAndValue\n *\n * AttributeTypeAndValue ::= SEQUENCE {\n *   type     AttributeType,\n *   value    AttributeValue\n * }\n * AttributeType ::= OBJECT IDENTIFIER\n * AttributeValue ::= ANY DEFINED BY AttributeType\n *\n * Validity ::= SEQUENCE {\n *   notBefore      Time,\n *   notAfter       Time\n * }\n *\n * Time ::= CHOICE {\n *   utcTime        UTCTime,\n *   generalTime    GeneralizedTime\n * }\n *\n * UniqueIdentifier ::= BIT STRING\n *\n * SubjectPublicKeyInfo ::= SEQUENCE {\n *   algorithm            AlgorithmIdentifier,\n *   subjectPublicKey     BIT STRING\n * }\n *\n * Extensions ::= SEQUENCE SIZE (1..MAX) OF Extension\n *\n * Extension ::= SEQUENCE {\n *   extnID      OBJECT IDENTIFIER,\n *   critical    BOOLEAN DEFAULT FALSE,\n *   extnValue   OCTET STRING\n * }\n *\n * The only key algorithm currently supported for PKI is RSA.\n *\n * RSASSA-PSS signatures are described in RFC 3447 and RFC 4055.\n *\n * PKCS#10 v1.7 describes certificate signing requests:\n *\n * CertificationRequestInfo:\n *\n * CertificationRequestInfo ::= SEQUENCE {\n *   version       INTEGER { v1(0) } (v1,...),\n *   subject       Name,\n *   subjectPKInfo SubjectPublicKeyInfo{{ PKInfoAlgorithms }},\n *   attributes    [0] Attributes{{ CRIAttributes }}\n * }\n *\n * Attributes { ATTRIBUTE:IOSet } ::= SET OF Attribute{{ IOSet }}\n *\n * CRIAttributes  ATTRIBUTE  ::= {\n *   ... -- add any locally defined attributes here -- }\n *\n * Attribute { ATTRIBUTE:IOSet } ::= SEQUENCE {\n *   type   ATTRIBUTE.&id({IOSet}),\n *   values SET SIZE(1..MAX) OF ATTRIBUTE.&Type({IOSet}{@type})\n * }\n *\n * CertificationRequest ::= SEQUENCE {\n *   certificationRequestInfo CertificationRequestInfo,\n *   signatureAlgorithm AlgorithmIdentifier{{ SignatureAlgorithms }},\n *   signature          BIT STRING\n * }\n */\nvar forge = __webpack_require__(4);\n__webpack_require__(22);\n__webpack_require__(14);\n__webpack_require__(41);\n__webpack_require__(17);\n__webpack_require__(239);\n__webpack_require__(23);\n__webpack_require__(27);\n__webpack_require__(59);\n__webpack_require__(42);\n__webpack_require__(7);\n\n// shortcut for asn.1 API\nvar asn1 = forge.asn1;\n\n/* Public Key Infrastructure (PKI) implementation. */\nvar pki = module.exports = forge.pki = forge.pki || {};\nvar oids = pki.oids;\n\n// short name OID mappings\nvar _shortNames = {};\n_shortNames['CN'] = oids['commonName'];\n_shortNames['commonName'] = 'CN';\n_shortNames['C'] = oids['countryName'];\n_shortNames['countryName'] = 'C';\n_shortNames['L'] = oids['localityName'];\n_shortNames['localityName'] = 'L';\n_shortNames['ST'] = oids['stateOrProvinceName'];\n_shortNames['stateOrProvinceName'] = 'ST';\n_shortNames['O'] = oids['organizationName'];\n_shortNames['organizationName'] = 'O';\n_shortNames['OU'] = oids['organizationalUnitName'];\n_shortNames['organizationalUnitName'] = 'OU';\n_shortNames['E'] = oids['emailAddress'];\n_shortNames['emailAddress'] = 'E';\n\n// validator for an SubjectPublicKeyInfo structure\n// Note: Currently only works with an RSA public key\nvar publicKeyValidator = forge.pki.rsa.publicKeyValidator;\n\n// validator for an X.509v3 certificate\nvar x509CertificateValidator = {\n  name: 'Certificate',\n  tagClass: asn1.Class.UNIVERSAL,\n  type: asn1.Type.SEQUENCE,\n  constructed: true,\n  value: [{\n    name: 'Certificate.TBSCertificate',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.SEQUENCE,\n    constructed: true,\n    captureAsn1: 'tbsCertificate',\n    value: [{\n      name: 'Certificate.TBSCertificate.version',\n      tagClass: asn1.Class.CONTEXT_SPECIFIC,\n      type: 0,\n      constructed: true,\n      optional: true,\n      value: [{\n        name: 'Certificate.TBSCertificate.version.integer',\n        tagClass: asn1.Class.UNIVERSAL,\n        type: asn1.Type.INTEGER,\n        constructed: false,\n        capture: 'certVersion'\n      }]\n    }, {\n      name: 'Certificate.TBSCertificate.serialNumber',\n      tagClass: asn1.Class.UNIVERSAL,\n      type: asn1.Type.INTEGER,\n      constructed: false,\n      capture: 'certSerialNumber'\n    }, {\n      name: 'Certificate.TBSCertificate.signature',\n      tagClass: asn1.Class.UNIVERSAL,\n      type: asn1.Type.SEQUENCE,\n      constructed: true,\n      value: [{\n        name: 'Certificate.TBSCertificate.signature.algorithm',\n        tagClass: asn1.Class.UNIVERSAL,\n        type: asn1.Type.OID,\n        constructed: false,\n        capture: 'certinfoSignatureOid'\n      }, {\n        name: 'Certificate.TBSCertificate.signature.parameters',\n        tagClass: asn1.Class.UNIVERSAL,\n        optional: true,\n        captureAsn1: 'certinfoSignatureParams'\n      }]\n    }, {\n      name: 'Certificate.TBSCertificate.issuer',\n      tagClass: asn1.Class.UNIVERSAL,\n      type: asn1.Type.SEQUENCE,\n      constructed: true,\n      captureAsn1: 'certIssuer'\n    }, {\n      name: 'Certificate.TBSCertificate.validity',\n      tagClass: asn1.Class.UNIVERSAL,\n      type: asn1.Type.SEQUENCE,\n      constructed: true,\n      // Note: UTC and generalized times may both appear so the capture\n      // names are based on their detected order, the names used below\n      // are only for the common case, which validity time really means\n      // \"notBefore\" and which means \"notAfter\" will be determined by order\n      value: [{\n        // notBefore (Time) (UTC time case)\n        name: 'Certificate.TBSCertificate.validity.notBefore (utc)',\n        tagClass: asn1.Class.UNIVERSAL,\n        type: asn1.Type.UTCTIME,\n        constructed: false,\n        optional: true,\n        capture: 'certValidity1UTCTime'\n      }, {\n        // notBefore (Time) (generalized time case)\n        name: 'Certificate.TBSCertificate.validity.notBefore (generalized)',\n        tagClass: asn1.Class.UNIVERSAL,\n        type: asn1.Type.GENERALIZEDTIME,\n        constructed: false,\n        optional: true,\n        capture: 'certValidity2GeneralizedTime'\n      }, {\n        // notAfter (Time) (only UTC time is supported)\n        name: 'Certificate.TBSCertificate.validity.notAfter (utc)',\n        tagClass: asn1.Class.UNIVERSAL,\n        type: asn1.Type.UTCTIME,\n        constructed: false,\n        optional: true,\n        capture: 'certValidity3UTCTime'\n      }, {\n        // notAfter (Time) (only UTC time is supported)\n        name: 'Certificate.TBSCertificate.validity.notAfter (generalized)',\n        tagClass: asn1.Class.UNIVERSAL,\n        type: asn1.Type.GENERALIZEDTIME,\n        constructed: false,\n        optional: true,\n        capture: 'certValidity4GeneralizedTime'\n      }]\n    }, {\n      // Name (subject) (RDNSequence)\n      name: 'Certificate.TBSCertificate.subject',\n      tagClass: asn1.Class.UNIVERSAL,\n      type: asn1.Type.SEQUENCE,\n      constructed: true,\n      captureAsn1: 'certSubject'\n    },\n    // SubjectPublicKeyInfo\n    publicKeyValidator,\n    {\n      // issuerUniqueID (optional)\n      name: 'Certificate.TBSCertificate.issuerUniqueID',\n      tagClass: asn1.Class.CONTEXT_SPECIFIC,\n      type: 1,\n      constructed: true,\n      optional: true,\n      value: [{\n        name: 'Certificate.TBSCertificate.issuerUniqueID.id',\n        tagClass: asn1.Class.UNIVERSAL,\n        type: asn1.Type.BITSTRING,\n        constructed: false,\n        // TODO: support arbitrary bit length ids\n        captureBitStringValue: 'certIssuerUniqueId'\n      }]\n    }, {\n      // subjectUniqueID (optional)\n      name: 'Certificate.TBSCertificate.subjectUniqueID',\n      tagClass: asn1.Class.CONTEXT_SPECIFIC,\n      type: 2,\n      constructed: true,\n      optional: true,\n      value: [{\n        name: 'Certificate.TBSCertificate.subjectUniqueID.id',\n        tagClass: asn1.Class.UNIVERSAL,\n        type: asn1.Type.BITSTRING,\n        constructed: false,\n        // TODO: support arbitrary bit length ids\n        captureBitStringValue: 'certSubjectUniqueId'\n      }]\n    }, {\n      // Extensions (optional)\n      name: 'Certificate.TBSCertificate.extensions',\n      tagClass: asn1.Class.CONTEXT_SPECIFIC,\n      type: 3,\n      constructed: true,\n      captureAsn1: 'certExtensions',\n      optional: true\n    }]\n  }, {\n    // AlgorithmIdentifier (signature algorithm)\n    name: 'Certificate.signatureAlgorithm',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.SEQUENCE,\n    constructed: true,\n    value: [{\n      // algorithm\n      name: 'Certificate.signatureAlgorithm.algorithm',\n      tagClass: asn1.Class.UNIVERSAL,\n      type: asn1.Type.OID,\n      constructed: false,\n      capture: 'certSignatureOid'\n    }, {\n      name: 'Certificate.TBSCertificate.signature.parameters',\n      tagClass: asn1.Class.UNIVERSAL,\n      optional: true,\n      captureAsn1: 'certSignatureParams'\n    }]\n  }, {\n    // SignatureValue\n    name: 'Certificate.signatureValue',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.BITSTRING,\n    constructed: false,\n    captureBitStringValue: 'certSignature'\n  }]\n};\n\nvar rsassaPssParameterValidator = {\n  name: 'rsapss',\n  tagClass: asn1.Class.UNIVERSAL,\n  type: asn1.Type.SEQUENCE,\n  constructed: true,\n  value: [{\n    name: 'rsapss.hashAlgorithm',\n    tagClass: asn1.Class.CONTEXT_SPECIFIC,\n    type: 0,\n    constructed: true,\n    value: [{\n      name: 'rsapss.hashAlgorithm.AlgorithmIdentifier',\n      tagClass: asn1.Class.UNIVERSAL,\n      type: asn1.Class.SEQUENCE,\n      constructed: true,\n      optional: true,\n      value: [{\n        name: 'rsapss.hashAlgorithm.AlgorithmIdentifier.algorithm',\n        tagClass: asn1.Class.UNIVERSAL,\n        type: asn1.Type.OID,\n        constructed: false,\n        capture: 'hashOid'\n        /* parameter block omitted, for SHA1 NULL anyhow. */\n      }]\n    }]\n  }, {\n    name: 'rsapss.maskGenAlgorithm',\n    tagClass: asn1.Class.CONTEXT_SPECIFIC,\n    type: 1,\n    constructed: true,\n    value: [{\n      name: 'rsapss.maskGenAlgorithm.AlgorithmIdentifier',\n      tagClass: asn1.Class.UNIVERSAL,\n      type: asn1.Class.SEQUENCE,\n      constructed: true,\n      optional: true,\n      value: [{\n        name: 'rsapss.maskGenAlgorithm.AlgorithmIdentifier.algorithm',\n        tagClass: asn1.Class.UNIVERSAL,\n        type: asn1.Type.OID,\n        constructed: false,\n        capture: 'maskGenOid'\n      }, {\n        name: 'rsapss.maskGenAlgorithm.AlgorithmIdentifier.params',\n        tagClass: asn1.Class.UNIVERSAL,\n        type: asn1.Type.SEQUENCE,\n        constructed: true,\n        value: [{\n          name: 'rsapss.maskGenAlgorithm.AlgorithmIdentifier.params.algorithm',\n          tagClass: asn1.Class.UNIVERSAL,\n          type: asn1.Type.OID,\n          constructed: false,\n          capture: 'maskGenHashOid'\n          /* parameter block omitted, for SHA1 NULL anyhow. */\n        }]\n      }]\n    }]\n  }, {\n    name: 'rsapss.saltLength',\n    tagClass: asn1.Class.CONTEXT_SPECIFIC,\n    type: 2,\n    optional: true,\n    value: [{\n      name: 'rsapss.saltLength.saltLength',\n      tagClass: asn1.Class.UNIVERSAL,\n      type: asn1.Class.INTEGER,\n      constructed: false,\n      capture: 'saltLength'\n    }]\n  }, {\n    name: 'rsapss.trailerField',\n    tagClass: asn1.Class.CONTEXT_SPECIFIC,\n    type: 3,\n    optional: true,\n    value: [{\n      name: 'rsapss.trailer.trailer',\n      tagClass: asn1.Class.UNIVERSAL,\n      type: asn1.Class.INTEGER,\n      constructed: false,\n      capture: 'trailer'\n    }]\n  }]\n};\n\n// validator for a CertificationRequestInfo structure\nvar certificationRequestInfoValidator = {\n  name: 'CertificationRequestInfo',\n  tagClass: asn1.Class.UNIVERSAL,\n  type: asn1.Type.SEQUENCE,\n  constructed: true,\n  captureAsn1: 'certificationRequestInfo',\n  value: [{\n    name: 'CertificationRequestInfo.integer',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.INTEGER,\n    constructed: false,\n    capture: 'certificationRequestInfoVersion'\n  }, {\n    // Name (subject) (RDNSequence)\n    name: 'CertificationRequestInfo.subject',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.SEQUENCE,\n    constructed: true,\n    captureAsn1: 'certificationRequestInfoSubject'\n  },\n  // SubjectPublicKeyInfo\n  publicKeyValidator,\n  {\n    name: 'CertificationRequestInfo.attributes',\n    tagClass: asn1.Class.CONTEXT_SPECIFIC,\n    type: 0,\n    constructed: true,\n    optional: true,\n    capture: 'certificationRequestInfoAttributes',\n    value: [{\n      name: 'CertificationRequestInfo.attributes',\n      tagClass: asn1.Class.UNIVERSAL,\n      type: asn1.Type.SEQUENCE,\n      constructed: true,\n      value: [{\n        name: 'CertificationRequestInfo.attributes.type',\n        tagClass: asn1.Class.UNIVERSAL,\n        type: asn1.Type.OID,\n        constructed: false\n      }, {\n        name: 'CertificationRequestInfo.attributes.value',\n        tagClass: asn1.Class.UNIVERSAL,\n        type: asn1.Type.SET,\n        constructed: true\n      }]\n    }]\n  }]\n};\n\n// validator for a CertificationRequest structure\nvar certificationRequestValidator = {\n  name: 'CertificationRequest',\n  tagClass: asn1.Class.UNIVERSAL,\n  type: asn1.Type.SEQUENCE,\n  constructed: true,\n  captureAsn1: 'csr',\n  value: [\n    certificationRequestInfoValidator, {\n      // AlgorithmIdentifier (signature algorithm)\n      name: 'CertificationRequest.signatureAlgorithm',\n      tagClass: asn1.Class.UNIVERSAL,\n      type: asn1.Type.SEQUENCE,\n      constructed: true,\n      value: [{\n        // algorithm\n        name: 'CertificationRequest.signatureAlgorithm.algorithm',\n        tagClass: asn1.Class.UNIVERSAL,\n        type: asn1.Type.OID,\n        constructed: false,\n        capture: 'csrSignatureOid'\n      }, {\n        name: 'CertificationRequest.signatureAlgorithm.parameters',\n        tagClass: asn1.Class.UNIVERSAL,\n        optional: true,\n        captureAsn1: 'csrSignatureParams'\n      }]\n    }, {\n      // signature\n      name: 'CertificationRequest.signature',\n      tagClass: asn1.Class.UNIVERSAL,\n      type: asn1.Type.BITSTRING,\n      constructed: false,\n      captureBitStringValue: 'csrSignature'\n    }\n  ]\n};\n\n/**\n * Converts an RDNSequence of ASN.1 DER-encoded RelativeDistinguishedName\n * sets into an array with objects that have type and value properties.\n *\n * @param rdn the RDNSequence to convert.\n * @param md a message digest to append type and value to if provided.\n */\npki.RDNAttributesAsArray = function(rdn, md) {\n  var rval = [];\n\n  // each value in 'rdn' in is a SET of RelativeDistinguishedName\n  var set, attr, obj;\n  for(var si = 0; si < rdn.value.length; ++si) {\n    // get the RelativeDistinguishedName set\n    set = rdn.value[si];\n\n    // each value in the SET is an AttributeTypeAndValue sequence\n    // containing first a type (an OID) and second a value (defined by\n    // the OID)\n    for(var i = 0; i < set.value.length; ++i) {\n      obj = {};\n      attr = set.value[i];\n      obj.type = asn1.derToOid(attr.value[0].value);\n      obj.value = attr.value[1].value;\n      obj.valueTagClass = attr.value[1].type;\n      // if the OID is known, get its name and short name\n      if(obj.type in oids) {\n        obj.name = oids[obj.type];\n        if(obj.name in _shortNames) {\n          obj.shortName = _shortNames[obj.name];\n        }\n      }\n      if(md) {\n        md.update(obj.type);\n        md.update(obj.value);\n      }\n      rval.push(obj);\n    }\n  }\n\n  return rval;\n};\n\n/**\n * Converts ASN.1 CRIAttributes into an array with objects that have type and\n * value properties.\n *\n * @param attributes the CRIAttributes to convert.\n */\npki.CRIAttributesAsArray = function(attributes) {\n  var rval = [];\n\n  // each value in 'attributes' in is a SEQUENCE with an OID and a SET\n  for(var si = 0; si < attributes.length; ++si) {\n    // get the attribute sequence\n    var seq = attributes[si];\n\n    // each value in the SEQUENCE containing first a type (an OID) and\n    // second a set of values (defined by the OID)\n    var type = asn1.derToOid(seq.value[0].value);\n    var values = seq.value[1].value;\n    for(var vi = 0; vi < values.length; ++vi) {\n      var obj = {};\n      obj.type = type;\n      obj.value = values[vi].value;\n      obj.valueTagClass = values[vi].type;\n      // if the OID is known, get its name and short name\n      if(obj.type in oids) {\n        obj.name = oids[obj.type];\n        if(obj.name in _shortNames) {\n          obj.shortName = _shortNames[obj.name];\n        }\n      }\n      // parse extensions\n      if(obj.type === oids.extensionRequest) {\n        obj.extensions = [];\n        for(var ei = 0; ei < obj.value.length; ++ei) {\n          obj.extensions.push(pki.certificateExtensionFromAsn1(obj.value[ei]));\n        }\n      }\n      rval.push(obj);\n    }\n  }\n\n  return rval;\n};\n\n/**\n * Gets an issuer or subject attribute from its name, type, or short name.\n *\n * @param obj the issuer or subject object.\n * @param options a short name string or an object with:\n *          shortName the short name for the attribute.\n *          name the name for the attribute.\n *          type the type for the attribute.\n *\n * @return the attribute.\n */\nfunction _getAttribute(obj, options) {\n  if(typeof options === 'string') {\n    options = {shortName: options};\n  }\n\n  var rval = null;\n  var attr;\n  for(var i = 0; rval === null && i < obj.attributes.length; ++i) {\n    attr = obj.attributes[i];\n    if(options.type && options.type === attr.type) {\n      rval = attr;\n    } else if(options.name && options.name === attr.name) {\n      rval = attr;\n    } else if(options.shortName && options.shortName === attr.shortName) {\n      rval = attr;\n    }\n  }\n  return rval;\n}\n\n/**\n * Converts signature parameters from ASN.1 structure.\n *\n * Currently only RSASSA-PSS supported.  The PKCS#1 v1.5 signature scheme had\n * no parameters.\n *\n * RSASSA-PSS-params  ::=  SEQUENCE  {\n *   hashAlgorithm      [0] HashAlgorithm DEFAULT\n *                             sha1Identifier,\n *   maskGenAlgorithm   [1] MaskGenAlgorithm DEFAULT\n *                             mgf1SHA1Identifier,\n *   saltLength         [2] INTEGER DEFAULT 20,\n *   trailerField       [3] INTEGER DEFAULT 1\n * }\n *\n * HashAlgorithm  ::=  AlgorithmIdentifier\n *\n * MaskGenAlgorithm  ::=  AlgorithmIdentifier\n *\n * AlgorithmIdentifer ::= SEQUENCE {\n *   algorithm OBJECT IDENTIFIER,\n *   parameters ANY DEFINED BY algorithm OPTIONAL\n * }\n *\n * @param oid The OID specifying the signature algorithm\n * @param obj The ASN.1 structure holding the parameters\n * @param fillDefaults Whether to use return default values where omitted\n * @return signature parameter object\n */\nvar _readSignatureParameters = function(oid, obj, fillDefaults) {\n  var params = {};\n\n  if(oid !== oids['RSASSA-PSS']) {\n    return params;\n  }\n\n  if(fillDefaults) {\n    params = {\n      hash: {\n        algorithmOid: oids['sha1']\n      },\n      mgf: {\n        algorithmOid: oids['mgf1'],\n        hash: {\n          algorithmOid: oids['sha1']\n        }\n      },\n      saltLength: 20\n    };\n  }\n\n  var capture = {};\n  var errors = [];\n  if(!asn1.validate(obj, rsassaPssParameterValidator, capture, errors)) {\n    var error = new Error('Cannot read RSASSA-PSS parameter block.');\n    error.errors = errors;\n    throw error;\n  }\n\n  if(capture.hashOid !== undefined) {\n    params.hash = params.hash || {};\n    params.hash.algorithmOid = asn1.derToOid(capture.hashOid);\n  }\n\n  if(capture.maskGenOid !== undefined) {\n    params.mgf = params.mgf || {};\n    params.mgf.algorithmOid = asn1.derToOid(capture.maskGenOid);\n    params.mgf.hash = params.mgf.hash || {};\n    params.mgf.hash.algorithmOid = asn1.derToOid(capture.maskGenHashOid);\n  }\n\n  if(capture.saltLength !== undefined) {\n    params.saltLength = capture.saltLength.charCodeAt(0);\n  }\n\n  return params;\n};\n\n/**\n * Create signature digest for OID.\n *\n * @param options\n *   signatureOid: the OID specifying the signature algorithm.\n *   type: a human readable type for error messages\n * @return a created md instance. throws if unknown oid.\n */\nvar _createSignatureDigest = function(options) {\n  switch(oids[options.signatureOid]) {\n    case 'sha1WithRSAEncryption':\n    // deprecated alias\n    case 'sha1WithRSASignature':\n      return forge.md.sha1.create();\n    case 'md5WithRSAEncryption':\n      return forge.md.md5.create();\n    case 'sha256WithRSAEncryption':\n      return forge.md.sha256.create();\n    case 'sha384WithRSAEncryption':\n      return forge.md.sha384.create();\n    case 'sha512WithRSAEncryption':\n      return forge.md.sha512.create();\n    case 'RSASSA-PSS':\n      return forge.md.sha256.create();\n    default:\n      var error = new Error(\n        'Could not compute ' + options.type + ' digest. ' +\n        'Unknown signature OID.');\n      error.signatureOid = options.signatureOid;\n      throw error;\n  }\n};\n\n/**\n * Verify signature on certificate or CSR.\n *\n * @param options:\n *   certificate the certificate or CSR to verify.\n *   md the signature digest.\n *   signature the signature\n * @return a created md instance. throws if unknown oid.\n */\nvar _verifySignature = function(options) {\n  var cert = options.certificate;\n  var scheme;\n\n  switch(cert.signatureOid) {\n    case oids.sha1WithRSAEncryption:\n    // deprecated alias\n    case oids.sha1WithRSASignature:\n      /* use PKCS#1 v1.5 padding scheme */\n      break;\n    case oids['RSASSA-PSS']:\n      var hash, mgf;\n\n      /* initialize mgf */\n      hash = oids[cert.signatureParameters.mgf.hash.algorithmOid];\n      if(hash === undefined || forge.md[hash] === undefined) {\n        var error = new Error('Unsupported MGF hash function.');\n        error.oid = cert.signatureParameters.mgf.hash.algorithmOid;\n        error.name = hash;\n        throw error;\n      }\n\n      mgf = oids[cert.signatureParameters.mgf.algorithmOid];\n      if(mgf === undefined || forge.mgf[mgf] === undefined) {\n        var error = new Error('Unsupported MGF function.');\n        error.oid = cert.signatureParameters.mgf.algorithmOid;\n        error.name = mgf;\n        throw error;\n      }\n\n      mgf = forge.mgf[mgf].create(forge.md[hash].create());\n\n      /* initialize hash function */\n      hash = oids[cert.signatureParameters.hash.algorithmOid];\n      if(hash === undefined || forge.md[hash] === undefined) {\n        var error = new Error('Unsupported RSASSA-PSS hash function.');\n        error.oid = cert.signatureParameters.hash.algorithmOid;\n        error.name = hash;\n        throw error;\n      }\n\n      scheme = forge.pss.create(\n        forge.md[hash].create(), mgf, cert.signatureParameters.saltLength\n      );\n      break;\n  }\n\n  // verify signature on cert using public key\n  return cert.publicKey.verify(\n    options.md.digest().getBytes(), options.signature, scheme\n  );\n};\n\n/**\n * Converts an X.509 certificate from PEM format.\n *\n * Note: If the certificate is to be verified then compute hash should\n * be set to true. This will scan the TBSCertificate part of the ASN.1\n * object while it is converted so it doesn't need to be converted back\n * to ASN.1-DER-encoding later.\n *\n * @param pem the PEM-formatted certificate.\n * @param computeHash true to compute the hash for verification.\n * @param strict true to be strict when checking ASN.1 value lengths, false to\n *          allow truncated values (default: true).\n *\n * @return the certificate.\n */\npki.certificateFromPem = function(pem, computeHash, strict) {\n  var msg = forge.pem.decode(pem)[0];\n\n  if(msg.type !== 'CERTIFICATE' &&\n    msg.type !== 'X509 CERTIFICATE' &&\n    msg.type !== 'TRUSTED CERTIFICATE') {\n    var error = new Error(\n      'Could not convert certificate from PEM; PEM header type ' +\n      'is not \"CERTIFICATE\", \"X509 CERTIFICATE\", or \"TRUSTED CERTIFICATE\".');\n    error.headerType = msg.type;\n    throw error;\n  }\n  if(msg.procType && msg.procType.type === 'ENCRYPTED') {\n    throw new Error(\n      'Could not convert certificate from PEM; PEM is encrypted.');\n  }\n\n  // convert DER to ASN.1 object\n  var obj = asn1.fromDer(msg.body, strict);\n\n  return pki.certificateFromAsn1(obj, computeHash);\n};\n\n/**\n * Converts an X.509 certificate to PEM format.\n *\n * @param cert the certificate.\n * @param maxline the maximum characters per line, defaults to 64.\n *\n * @return the PEM-formatted certificate.\n */\npki.certificateToPem = function(cert, maxline) {\n  // convert to ASN.1, then DER, then PEM-encode\n  var msg = {\n    type: 'CERTIFICATE',\n    body: asn1.toDer(pki.certificateToAsn1(cert)).getBytes()\n  };\n  return forge.pem.encode(msg, {maxline: maxline});\n};\n\n/**\n * Converts an RSA public key from PEM format.\n *\n * @param pem the PEM-formatted public key.\n *\n * @return the public key.\n */\npki.publicKeyFromPem = function(pem) {\n  var msg = forge.pem.decode(pem)[0];\n\n  if(msg.type !== 'PUBLIC KEY' && msg.type !== 'RSA PUBLIC KEY') {\n    var error = new Error('Could not convert public key from PEM; PEM header ' +\n      'type is not \"PUBLIC KEY\" or \"RSA PUBLIC KEY\".');\n    error.headerType = msg.type;\n    throw error;\n  }\n  if(msg.procType && msg.procType.type === 'ENCRYPTED') {\n    throw new Error('Could not convert public key from PEM; PEM is encrypted.');\n  }\n\n  // convert DER to ASN.1 object\n  var obj = asn1.fromDer(msg.body);\n\n  return pki.publicKeyFromAsn1(obj);\n};\n\n/**\n * Converts an RSA public key to PEM format (using a SubjectPublicKeyInfo).\n *\n * @param key the public key.\n * @param maxline the maximum characters per line, defaults to 64.\n *\n * @return the PEM-formatted public key.\n */\npki.publicKeyToPem = function(key, maxline) {\n  // convert to ASN.1, then DER, then PEM-encode\n  var msg = {\n    type: 'PUBLIC KEY',\n    body: asn1.toDer(pki.publicKeyToAsn1(key)).getBytes()\n  };\n  return forge.pem.encode(msg, {maxline: maxline});\n};\n\n/**\n * Converts an RSA public key to PEM format (using an RSAPublicKey).\n *\n * @param key the public key.\n * @param maxline the maximum characters per line, defaults to 64.\n *\n * @return the PEM-formatted public key.\n */\npki.publicKeyToRSAPublicKeyPem = function(key, maxline) {\n  // convert to ASN.1, then DER, then PEM-encode\n  var msg = {\n    type: 'RSA PUBLIC KEY',\n    body: asn1.toDer(pki.publicKeyToRSAPublicKey(key)).getBytes()\n  };\n  return forge.pem.encode(msg, {maxline: maxline});\n};\n\n/**\n * Gets a fingerprint for the given public key.\n *\n * @param options the options to use.\n *          [md] the message digest object to use (defaults to forge.md.sha1).\n *          [type] the type of fingerprint, such as 'RSAPublicKey',\n *            'SubjectPublicKeyInfo' (defaults to 'RSAPublicKey').\n *          [encoding] an alternative output encoding, such as 'hex'\n *            (defaults to none, outputs a byte buffer).\n *          [delimiter] the delimiter to use between bytes for 'hex' encoded\n *            output, eg: ':' (defaults to none).\n *\n * @return the fingerprint as a byte buffer or other encoding based on options.\n */\npki.getPublicKeyFingerprint = function(key, options) {\n  options = options || {};\n  var md = options.md || forge.md.sha1.create();\n  var type = options.type || 'RSAPublicKey';\n\n  var bytes;\n  switch(type) {\n    case 'RSAPublicKey':\n      bytes = asn1.toDer(pki.publicKeyToRSAPublicKey(key)).getBytes();\n      break;\n    case 'SubjectPublicKeyInfo':\n      bytes = asn1.toDer(pki.publicKeyToAsn1(key)).getBytes();\n      break;\n    default:\n      throw new Error('Unknown fingerprint type \"' + options.type + '\".');\n  }\n\n  // hash public key bytes\n  md.start();\n  md.update(bytes);\n  var digest = md.digest();\n  if(options.encoding === 'hex') {\n    var hex = digest.toHex();\n    if(options.delimiter) {\n      return hex.match(/.{2}/g).join(options.delimiter);\n    }\n    return hex;\n  } else if(options.encoding === 'binary') {\n    return digest.getBytes();\n  } else if(options.encoding) {\n    throw new Error('Unknown encoding \"' + options.encoding + '\".');\n  }\n  return digest;\n};\n\n/**\n * Converts a PKCS#10 certification request (CSR) from PEM format.\n *\n * Note: If the certification request is to be verified then compute hash\n * should be set to true. This will scan the CertificationRequestInfo part of\n * the ASN.1 object while it is converted so it doesn't need to be converted\n * back to ASN.1-DER-encoding later.\n *\n * @param pem the PEM-formatted certificate.\n * @param computeHash true to compute the hash for verification.\n * @param strict true to be strict when checking ASN.1 value lengths, false to\n *          allow truncated values (default: true).\n *\n * @return the certification request (CSR).\n */\npki.certificationRequestFromPem = function(pem, computeHash, strict) {\n  var msg = forge.pem.decode(pem)[0];\n\n  if(msg.type !== 'CERTIFICATE REQUEST') {\n    var error = new Error('Could not convert certification request from PEM; ' +\n      'PEM header type is not \"CERTIFICATE REQUEST\".');\n    error.headerType = msg.type;\n    throw error;\n  }\n  if(msg.procType && msg.procType.type === 'ENCRYPTED') {\n    throw new Error('Could not convert certification request from PEM; ' +\n      'PEM is encrypted.');\n  }\n\n  // convert DER to ASN.1 object\n  var obj = asn1.fromDer(msg.body, strict);\n\n  return pki.certificationRequestFromAsn1(obj, computeHash);\n};\n\n/**\n * Converts a PKCS#10 certification request (CSR) to PEM format.\n *\n * @param csr the certification request.\n * @param maxline the maximum characters per line, defaults to 64.\n *\n * @return the PEM-formatted certification request.\n */\npki.certificationRequestToPem = function(csr, maxline) {\n  // convert to ASN.1, then DER, then PEM-encode\n  var msg = {\n    type: 'CERTIFICATE REQUEST',\n    body: asn1.toDer(pki.certificationRequestToAsn1(csr)).getBytes()\n  };\n  return forge.pem.encode(msg, {maxline: maxline});\n};\n\n/**\n * Creates an empty X.509v3 RSA certificate.\n *\n * @return the certificate.\n */\npki.createCertificate = function() {\n  var cert = {};\n  cert.version = 0x02;\n  cert.serialNumber = '00';\n  cert.signatureOid = null;\n  cert.signature = null;\n  cert.siginfo = {};\n  cert.siginfo.algorithmOid = null;\n  cert.validity = {};\n  cert.validity.notBefore = new Date();\n  cert.validity.notAfter = new Date();\n\n  cert.issuer = {};\n  cert.issuer.getField = function(sn) {\n    return _getAttribute(cert.issuer, sn);\n  };\n  cert.issuer.addField = function(attr) {\n    _fillMissingFields([attr]);\n    cert.issuer.attributes.push(attr);\n  };\n  cert.issuer.attributes = [];\n  cert.issuer.hash = null;\n\n  cert.subject = {};\n  cert.subject.getField = function(sn) {\n    return _getAttribute(cert.subject, sn);\n  };\n  cert.subject.addField = function(attr) {\n    _fillMissingFields([attr]);\n    cert.subject.attributes.push(attr);\n  };\n  cert.subject.attributes = [];\n  cert.subject.hash = null;\n\n  cert.extensions = [];\n  cert.publicKey = null;\n  cert.md = null;\n\n  /**\n   * Sets the subject of this certificate.\n   *\n   * @param attrs the array of subject attributes to use.\n   * @param uniqueId an optional a unique ID to use.\n   */\n  cert.setSubject = function(attrs, uniqueId) {\n    // set new attributes, clear hash\n    _fillMissingFields(attrs);\n    cert.subject.attributes = attrs;\n    delete cert.subject.uniqueId;\n    if(uniqueId) {\n      // TODO: support arbitrary bit length ids\n      cert.subject.uniqueId = uniqueId;\n    }\n    cert.subject.hash = null;\n  };\n\n  /**\n   * Sets the issuer of this certificate.\n   *\n   * @param attrs the array of issuer attributes to use.\n   * @param uniqueId an optional a unique ID to use.\n   */\n  cert.setIssuer = function(attrs, uniqueId) {\n    // set new attributes, clear hash\n    _fillMissingFields(attrs);\n    cert.issuer.attributes = attrs;\n    delete cert.issuer.uniqueId;\n    if(uniqueId) {\n      // TODO: support arbitrary bit length ids\n      cert.issuer.uniqueId = uniqueId;\n    }\n    cert.issuer.hash = null;\n  };\n\n  /**\n   * Sets the extensions of this certificate.\n   *\n   * @param exts the array of extensions to use.\n   */\n  cert.setExtensions = function(exts) {\n    for(var i = 0; i < exts.length; ++i) {\n      _fillMissingExtensionFields(exts[i], {cert: cert});\n    }\n    // set new extensions\n    cert.extensions = exts;\n  };\n\n  /**\n   * Gets an extension by its name or id.\n   *\n   * @param options the name to use or an object with:\n   *          name the name to use.\n   *          id the id to use.\n   *\n   * @return the extension or null if not found.\n   */\n  cert.getExtension = function(options) {\n    if(typeof options === 'string') {\n      options = {name: options};\n    }\n\n    var rval = null;\n    var ext;\n    for(var i = 0; rval === null && i < cert.extensions.length; ++i) {\n      ext = cert.extensions[i];\n      if(options.id && ext.id === options.id) {\n        rval = ext;\n      } else if(options.name && ext.name === options.name) {\n        rval = ext;\n      }\n    }\n    return rval;\n  };\n\n  /**\n   * Signs this certificate using the given private key.\n   *\n   * @param key the private key to sign with.\n   * @param md the message digest object to use (defaults to forge.md.sha1).\n   */\n  cert.sign = function(key, md) {\n    // TODO: get signature OID from private key\n    cert.md = md || forge.md.sha1.create();\n    var algorithmOid = oids[cert.md.algorithm + 'WithRSAEncryption'];\n    if(!algorithmOid) {\n      var error = new Error('Could not compute certificate digest. ' +\n        'Unknown message digest algorithm OID.');\n      error.algorithm = cert.md.algorithm;\n      throw error;\n    }\n    cert.signatureOid = cert.siginfo.algorithmOid = algorithmOid;\n\n    // get TBSCertificate, convert to DER\n    cert.tbsCertificate = pki.getTBSCertificate(cert);\n    var bytes = asn1.toDer(cert.tbsCertificate);\n\n    // digest and sign\n    cert.md.update(bytes.getBytes());\n    cert.signature = key.sign(cert.md);\n  };\n\n  /**\n   * Attempts verify the signature on the passed certificate using this\n   * certificate's public key.\n   *\n   * @param child the certificate to verify.\n   *\n   * @return true if verified, false if not.\n   */\n  cert.verify = function(child) {\n    var rval = false;\n\n    if(!cert.issued(child)) {\n      var issuer = child.issuer;\n      var subject = cert.subject;\n      var error = new Error(\n        'The parent certificate did not issue the given child ' +\n        'certificate; the child certificate\\'s issuer does not match the ' +\n        'parent\\'s subject.');\n      error.expectedIssuer = subject.attributes;\n      error.actualIssuer = issuer.attributes;\n      throw error;\n    }\n\n    var md = child.md;\n    if(md === null) {\n      // create digest for OID signature types\n      md = _createSignatureDigest({\n        signatureOid: child.signatureOid,\n        type: 'certificate'\n      });\n\n      // produce DER formatted TBSCertificate and digest it\n      var tbsCertificate = child.tbsCertificate || pki.getTBSCertificate(child);\n      var bytes = asn1.toDer(tbsCertificate);\n      md.update(bytes.getBytes());\n    }\n\n    if(md !== null) {\n      rval = _verifySignature({\n        certificate: cert, md: md, signature: child.signature\n      });\n    }\n\n    return rval;\n  };\n\n  /**\n   * Returns true if this certificate's issuer matches the passed\n   * certificate's subject. Note that no signature check is performed.\n   *\n   * @param parent the certificate to check.\n   *\n   * @return true if this certificate's issuer matches the passed certificate's\n   *         subject.\n   */\n  cert.isIssuer = function(parent) {\n    var rval = false;\n\n    var i = cert.issuer;\n    var s = parent.subject;\n\n    // compare hashes if present\n    if(i.hash && s.hash) {\n      rval = (i.hash === s.hash);\n    } else if(i.attributes.length === s.attributes.length) {\n      // all attributes are the same so issuer matches subject\n      rval = true;\n      var iattr, sattr;\n      for(var n = 0; rval && n < i.attributes.length; ++n) {\n        iattr = i.attributes[n];\n        sattr = s.attributes[n];\n        if(iattr.type !== sattr.type || iattr.value !== sattr.value) {\n          // attribute mismatch\n          rval = false;\n        }\n      }\n    }\n\n    return rval;\n  };\n\n  /**\n   * Returns true if this certificate's subject matches the issuer of the\n   * given certificate). Note that not signature check is performed.\n   *\n   * @param child the certificate to check.\n   *\n   * @return true if this certificate's subject matches the passed\n   *         certificate's issuer.\n   */\n  cert.issued = function(child) {\n    return child.isIssuer(cert);\n  };\n\n  /**\n   * Generates the subjectKeyIdentifier for this certificate as byte buffer.\n   *\n   * @return the subjectKeyIdentifier for this certificate as byte buffer.\n   */\n  cert.generateSubjectKeyIdentifier = function() {\n    /* See: 4.2.1.2 section of the the RFC3280, keyIdentifier is either:\n\n      (1) The keyIdentifier is composed of the 160-bit SHA-1 hash of the\n        value of the BIT STRING subjectPublicKey (excluding the tag,\n        length, and number of unused bits).\n\n      (2) The keyIdentifier is composed of a four bit type field with\n        the value 0100 followed by the least significant 60 bits of the\n        SHA-1 hash of the value of the BIT STRING subjectPublicKey\n        (excluding the tag, length, and number of unused bit string bits).\n    */\n\n    // skipping the tag, length, and number of unused bits is the same\n    // as just using the RSAPublicKey (for RSA keys, which are the\n    // only ones supported)\n    return pki.getPublicKeyFingerprint(cert.publicKey, {type: 'RSAPublicKey'});\n  };\n\n  /**\n   * Verifies the subjectKeyIdentifier extension value for this certificate\n   * against its public key. If no extension is found, false will be\n   * returned.\n   *\n   * @return true if verified, false if not.\n   */\n  cert.verifySubjectKeyIdentifier = function() {\n    var oid = oids['subjectKeyIdentifier'];\n    for(var i = 0; i < cert.extensions.length; ++i) {\n      var ext = cert.extensions[i];\n      if(ext.id === oid) {\n        var ski = cert.generateSubjectKeyIdentifier().getBytes();\n        return (forge.util.hexToBytes(ext.subjectKeyIdentifier) === ski);\n      }\n    }\n    return false;\n  };\n\n  return cert;\n};\n\n/**\n * Converts an X.509v3 RSA certificate from an ASN.1 object.\n *\n * Note: If the certificate is to be verified then compute hash should\n * be set to true. There is currently no implementation for converting\n * a certificate back to ASN.1 so the TBSCertificate part of the ASN.1\n * object needs to be scanned before the cert object is created.\n *\n * @param obj the asn1 representation of an X.509v3 RSA certificate.\n * @param computeHash true to compute the hash for verification.\n *\n * @return the certificate.\n */\npki.certificateFromAsn1 = function(obj, computeHash) {\n  // validate certificate and capture data\n  var capture = {};\n  var errors = [];\n  if(!asn1.validate(obj, x509CertificateValidator, capture, errors)) {\n    var error = new Error('Cannot read X.509 certificate. ' +\n      'ASN.1 object is not an X509v3 Certificate.');\n    error.errors = errors;\n    throw error;\n  }\n\n  // get oid\n  var oid = asn1.derToOid(capture.publicKeyOid);\n  if(oid !== pki.oids.rsaEncryption) {\n    throw new Error('Cannot read public key. OID is not RSA.');\n  }\n\n  // create certificate\n  var cert = pki.createCertificate();\n  cert.version = capture.certVersion ?\n    capture.certVersion.charCodeAt(0) : 0;\n  var serial = forge.util.createBuffer(capture.certSerialNumber);\n  cert.serialNumber = serial.toHex();\n  cert.signatureOid = forge.asn1.derToOid(capture.certSignatureOid);\n  cert.signatureParameters = _readSignatureParameters(\n    cert.signatureOid, capture.certSignatureParams, true);\n  cert.siginfo.algorithmOid = forge.asn1.derToOid(capture.certinfoSignatureOid);\n  cert.siginfo.parameters = _readSignatureParameters(cert.siginfo.algorithmOid,\n    capture.certinfoSignatureParams, false);\n  cert.signature = capture.certSignature;\n\n  var validity = [];\n  if(capture.certValidity1UTCTime !== undefined) {\n    validity.push(asn1.utcTimeToDate(capture.certValidity1UTCTime));\n  }\n  if(capture.certValidity2GeneralizedTime !== undefined) {\n    validity.push(asn1.generalizedTimeToDate(\n      capture.certValidity2GeneralizedTime));\n  }\n  if(capture.certValidity3UTCTime !== undefined) {\n    validity.push(asn1.utcTimeToDate(capture.certValidity3UTCTime));\n  }\n  if(capture.certValidity4GeneralizedTime !== undefined) {\n    validity.push(asn1.generalizedTimeToDate(\n      capture.certValidity4GeneralizedTime));\n  }\n  if(validity.length > 2) {\n    throw new Error('Cannot read notBefore/notAfter validity times; more ' +\n      'than two times were provided in the certificate.');\n  }\n  if(validity.length < 2) {\n    throw new Error('Cannot read notBefore/notAfter validity times; they ' +\n      'were not provided as either UTCTime or GeneralizedTime.');\n  }\n  cert.validity.notBefore = validity[0];\n  cert.validity.notAfter = validity[1];\n\n  // keep TBSCertificate to preserve signature when exporting\n  cert.tbsCertificate = capture.tbsCertificate;\n\n  if(computeHash) {\n    // create digest for OID signature type\n    cert.md = _createSignatureDigest({\n      signatureOid: cert.signatureOid,\n      type: 'certificate'\n    });\n\n    // produce DER formatted TBSCertificate and digest it\n    var bytes = asn1.toDer(cert.tbsCertificate);\n    cert.md.update(bytes.getBytes());\n  }\n\n  // handle issuer, build issuer message digest\n  var imd = forge.md.sha1.create();\n  var ibytes = asn1.toDer(capture.certIssuer);\n  imd.update(ibytes.getBytes());\n  cert.issuer.getField = function(sn) {\n    return _getAttribute(cert.issuer, sn);\n  };\n  cert.issuer.addField = function(attr) {\n    _fillMissingFields([attr]);\n    cert.issuer.attributes.push(attr);\n  };\n  cert.issuer.attributes = pki.RDNAttributesAsArray(capture.certIssuer);\n  if(capture.certIssuerUniqueId) {\n    cert.issuer.uniqueId = capture.certIssuerUniqueId;\n  }\n  cert.issuer.hash = imd.digest().toHex();\n\n  // handle subject, build subject message digest\n  var smd = forge.md.sha1.create();\n  var sbytes = asn1.toDer(capture.certSubject);\n  smd.update(sbytes.getBytes());\n  cert.subject.getField = function(sn) {\n    return _getAttribute(cert.subject, sn);\n  };\n  cert.subject.addField = function(attr) {\n    _fillMissingFields([attr]);\n    cert.subject.attributes.push(attr);\n  };\n  cert.subject.attributes = pki.RDNAttributesAsArray(capture.certSubject);\n  if(capture.certSubjectUniqueId) {\n    cert.subject.uniqueId = capture.certSubjectUniqueId;\n  }\n  cert.subject.hash = smd.digest().toHex();\n\n  // handle extensions\n  if(capture.certExtensions) {\n    cert.extensions = pki.certificateExtensionsFromAsn1(capture.certExtensions);\n  } else {\n    cert.extensions = [];\n  }\n\n  // convert RSA public key from ASN.1\n  cert.publicKey = pki.publicKeyFromAsn1(capture.subjectPublicKeyInfo);\n\n  return cert;\n};\n\n/**\n * Converts an ASN.1 extensions object (with extension sequences as its\n * values) into an array of extension objects with types and values.\n *\n * Supported extensions:\n *\n * id-ce-keyUsage OBJECT IDENTIFIER ::=  { id-ce 15 }\n * KeyUsage ::= BIT STRING {\n *   digitalSignature        (0),\n *   nonRepudiation          (1),\n *   keyEncipherment         (2),\n *   dataEncipherment        (3),\n *   keyAgreement            (4),\n *   keyCertSign             (5),\n *   cRLSign                 (6),\n *   encipherOnly            (7),\n *   decipherOnly            (8)\n * }\n *\n * id-ce-basicConstraints OBJECT IDENTIFIER ::=  { id-ce 19 }\n * BasicConstraints ::= SEQUENCE {\n *   cA                      BOOLEAN DEFAULT FALSE,\n *   pathLenConstraint       INTEGER (0..MAX) OPTIONAL\n * }\n *\n * subjectAltName EXTENSION ::= {\n *   SYNTAX GeneralNames\n *   IDENTIFIED BY id-ce-subjectAltName\n * }\n *\n * GeneralNames ::= SEQUENCE SIZE (1..MAX) OF GeneralName\n *\n * GeneralName ::= CHOICE {\n *   otherName      [0] INSTANCE OF OTHER-NAME,\n *   rfc822Name     [1] IA5String,\n *   dNSName        [2] IA5String,\n *   x400Address    [3] ORAddress,\n *   directoryName  [4] Name,\n *   ediPartyName   [5] EDIPartyName,\n *   uniformResourceIdentifier [6] IA5String,\n *   IPAddress      [7] OCTET STRING,\n *   registeredID   [8] OBJECT IDENTIFIER\n * }\n *\n * OTHER-NAME ::= TYPE-IDENTIFIER\n *\n * EDIPartyName ::= SEQUENCE {\n *   nameAssigner [0] DirectoryString {ub-name} OPTIONAL,\n *   partyName    [1] DirectoryString {ub-name}\n * }\n *\n * @param exts the extensions ASN.1 with extension sequences to parse.\n *\n * @return the array.\n */\npki.certificateExtensionsFromAsn1 = function(exts) {\n  var rval = [];\n  for(var i = 0; i < exts.value.length; ++i) {\n    // get extension sequence\n    var extseq = exts.value[i];\n    for(var ei = 0; ei < extseq.value.length; ++ei) {\n      rval.push(pki.certificateExtensionFromAsn1(extseq.value[ei]));\n    }\n  }\n\n  return rval;\n};\n\n/**\n * Parses a single certificate extension from ASN.1.\n *\n * @param ext the extension in ASN.1 format.\n *\n * @return the parsed extension as an object.\n */\npki.certificateExtensionFromAsn1 = function(ext) {\n  // an extension has:\n  // [0] extnID      OBJECT IDENTIFIER\n  // [1] critical    BOOLEAN DEFAULT FALSE\n  // [2] extnValue   OCTET STRING\n  var e = {};\n  e.id = asn1.derToOid(ext.value[0].value);\n  e.critical = false;\n  if(ext.value[1].type === asn1.Type.BOOLEAN) {\n    e.critical = (ext.value[1].value.charCodeAt(0) !== 0x00);\n    e.value = ext.value[2].value;\n  } else {\n    e.value = ext.value[1].value;\n  }\n  // if the oid is known, get its name\n  if(e.id in oids) {\n    e.name = oids[e.id];\n\n    // handle key usage\n    if(e.name === 'keyUsage') {\n      // get value as BIT STRING\n      var ev = asn1.fromDer(e.value);\n      var b2 = 0x00;\n      var b3 = 0x00;\n      if(ev.value.length > 1) {\n        // skip first byte, just indicates unused bits which\n        // will be padded with 0s anyway\n        // get bytes with flag bits\n        b2 = ev.value.charCodeAt(1);\n        b3 = ev.value.length > 2 ? ev.value.charCodeAt(2) : 0;\n      }\n      // set flags\n      e.digitalSignature = (b2 & 0x80) === 0x80;\n      e.nonRepudiation = (b2 & 0x40) === 0x40;\n      e.keyEncipherment = (b2 & 0x20) === 0x20;\n      e.dataEncipherment = (b2 & 0x10) === 0x10;\n      e.keyAgreement = (b2 & 0x08) === 0x08;\n      e.keyCertSign = (b2 & 0x04) === 0x04;\n      e.cRLSign = (b2 & 0x02) === 0x02;\n      e.encipherOnly = (b2 & 0x01) === 0x01;\n      e.decipherOnly = (b3 & 0x80) === 0x80;\n    } else if(e.name === 'basicConstraints') {\n      // handle basic constraints\n      // get value as SEQUENCE\n      var ev = asn1.fromDer(e.value);\n      // get cA BOOLEAN flag (defaults to false)\n      if(ev.value.length > 0 && ev.value[0].type === asn1.Type.BOOLEAN) {\n        e.cA = (ev.value[0].value.charCodeAt(0) !== 0x00);\n      } else {\n        e.cA = false;\n      }\n      // get path length constraint\n      var value = null;\n      if(ev.value.length > 0 && ev.value[0].type === asn1.Type.INTEGER) {\n        value = ev.value[0].value;\n      } else if(ev.value.length > 1) {\n        value = ev.value[1].value;\n      }\n      if(value !== null) {\n        e.pathLenConstraint = asn1.derToInteger(value);\n      }\n    } else if(e.name === 'extKeyUsage') {\n      // handle extKeyUsage\n      // value is a SEQUENCE of OIDs\n      var ev = asn1.fromDer(e.value);\n      for(var vi = 0; vi < ev.value.length; ++vi) {\n        var oid = asn1.derToOid(ev.value[vi].value);\n        if(oid in oids) {\n          e[oids[oid]] = true;\n        } else {\n          e[oid] = true;\n        }\n      }\n    } else if(e.name === 'nsCertType') {\n      // handle nsCertType\n      // get value as BIT STRING\n      var ev = asn1.fromDer(e.value);\n      var b2 = 0x00;\n      if(ev.value.length > 1) {\n        // skip first byte, just indicates unused bits which\n        // will be padded with 0s anyway\n        // get bytes with flag bits\n        b2 = ev.value.charCodeAt(1);\n      }\n      // set flags\n      e.client = (b2 & 0x80) === 0x80;\n      e.server = (b2 & 0x40) === 0x40;\n      e.email = (b2 & 0x20) === 0x20;\n      e.objsign = (b2 & 0x10) === 0x10;\n      e.reserved = (b2 & 0x08) === 0x08;\n      e.sslCA = (b2 & 0x04) === 0x04;\n      e.emailCA = (b2 & 0x02) === 0x02;\n      e.objCA = (b2 & 0x01) === 0x01;\n    } else if(\n      e.name === 'subjectAltName' ||\n      e.name === 'issuerAltName') {\n      // handle subjectAltName/issuerAltName\n      e.altNames = [];\n\n      // ev is a SYNTAX SEQUENCE\n      var gn;\n      var ev = asn1.fromDer(e.value);\n      for(var n = 0; n < ev.value.length; ++n) {\n        // get GeneralName\n        gn = ev.value[n];\n\n        var altName = {\n          type: gn.type,\n          value: gn.value\n        };\n        e.altNames.push(altName);\n\n        // Note: Support for types 1,2,6,7,8\n        switch(gn.type) {\n          // rfc822Name\n          case 1:\n          // dNSName\n          case 2:\n          // uniformResourceIdentifier (URI)\n          case 6:\n            break;\n          // IPAddress\n          case 7:\n            // convert to IPv4/IPv6 string representation\n            altName.ip = forge.util.bytesToIP(gn.value);\n            break;\n          // registeredID\n          case 8:\n            altName.oid = asn1.derToOid(gn.value);\n            break;\n          default:\n            // unsupported\n        }\n      }\n    } else if(e.name === 'subjectKeyIdentifier') {\n      // value is an OCTETSTRING w/the hash of the key-type specific\n      // public key structure (eg: RSAPublicKey)\n      var ev = asn1.fromDer(e.value);\n      e.subjectKeyIdentifier = forge.util.bytesToHex(ev.value);\n    }\n  }\n  return e;\n};\n\n/**\n * Converts a PKCS#10 certification request (CSR) from an ASN.1 object.\n *\n * Note: If the certification request is to be verified then compute hash\n * should be set to true. There is currently no implementation for converting\n * a certificate back to ASN.1 so the CertificationRequestInfo part of the\n * ASN.1 object needs to be scanned before the csr object is created.\n *\n * @param obj the asn1 representation of a PKCS#10 certification request (CSR).\n * @param computeHash true to compute the hash for verification.\n *\n * @return the certification request (CSR).\n */\npki.certificationRequestFromAsn1 = function(obj, computeHash) {\n  // validate certification request and capture data\n  var capture = {};\n  var errors = [];\n  if(!asn1.validate(obj, certificationRequestValidator, capture, errors)) {\n    var error = new Error('Cannot read PKCS#10 certificate request. ' +\n      'ASN.1 object is not a PKCS#10 CertificationRequest.');\n    error.errors = errors;\n    throw error;\n  }\n\n  // get oid\n  var oid = asn1.derToOid(capture.publicKeyOid);\n  if(oid !== pki.oids.rsaEncryption) {\n    throw new Error('Cannot read public key. OID is not RSA.');\n  }\n\n  // create certification request\n  var csr = pki.createCertificationRequest();\n  csr.version = capture.csrVersion ? capture.csrVersion.charCodeAt(0) : 0;\n  csr.signatureOid = forge.asn1.derToOid(capture.csrSignatureOid);\n  csr.signatureParameters = _readSignatureParameters(\n    csr.signatureOid, capture.csrSignatureParams, true);\n  csr.siginfo.algorithmOid = forge.asn1.derToOid(capture.csrSignatureOid);\n  csr.siginfo.parameters = _readSignatureParameters(\n    csr.siginfo.algorithmOid, capture.csrSignatureParams, false);\n  csr.signature = capture.csrSignature;\n\n  // keep CertificationRequestInfo to preserve signature when exporting\n  csr.certificationRequestInfo = capture.certificationRequestInfo;\n\n  if(computeHash) {\n    // create digest for OID signature type\n    csr.md = _createSignatureDigest({\n      signatureOid: csr.signatureOid,\n      type: 'certification request'\n    });\n\n    // produce DER formatted CertificationRequestInfo and digest it\n    var bytes = asn1.toDer(csr.certificationRequestInfo);\n    csr.md.update(bytes.getBytes());\n  }\n\n  // handle subject, build subject message digest\n  var smd = forge.md.sha1.create();\n  csr.subject.getField = function(sn) {\n    return _getAttribute(csr.subject, sn);\n  };\n  csr.subject.addField = function(attr) {\n    _fillMissingFields([attr]);\n    csr.subject.attributes.push(attr);\n  };\n  csr.subject.attributes = pki.RDNAttributesAsArray(\n    capture.certificationRequestInfoSubject, smd);\n  csr.subject.hash = smd.digest().toHex();\n\n  // convert RSA public key from ASN.1\n  csr.publicKey = pki.publicKeyFromAsn1(capture.subjectPublicKeyInfo);\n\n  // convert attributes from ASN.1\n  csr.getAttribute = function(sn) {\n    return _getAttribute(csr, sn);\n  };\n  csr.addAttribute = function(attr) {\n    _fillMissingFields([attr]);\n    csr.attributes.push(attr);\n  };\n  csr.attributes = pki.CRIAttributesAsArray(\n    capture.certificationRequestInfoAttributes || []);\n\n  return csr;\n};\n\n/**\n * Creates an empty certification request (a CSR or certificate signing\n * request). Once created, its public key and attributes can be set and then\n * it can be signed.\n *\n * @return the empty certification request.\n */\npki.createCertificationRequest = function() {\n  var csr = {};\n  csr.version = 0x00;\n  csr.signatureOid = null;\n  csr.signature = null;\n  csr.siginfo = {};\n  csr.siginfo.algorithmOid = null;\n\n  csr.subject = {};\n  csr.subject.getField = function(sn) {\n    return _getAttribute(csr.subject, sn);\n  };\n  csr.subject.addField = function(attr) {\n    _fillMissingFields([attr]);\n    csr.subject.attributes.push(attr);\n  };\n  csr.subject.attributes = [];\n  csr.subject.hash = null;\n\n  csr.publicKey = null;\n  csr.attributes = [];\n  csr.getAttribute = function(sn) {\n    return _getAttribute(csr, sn);\n  };\n  csr.addAttribute = function(attr) {\n    _fillMissingFields([attr]);\n    csr.attributes.push(attr);\n  };\n  csr.md = null;\n\n  /**\n   * Sets the subject of this certification request.\n   *\n   * @param attrs the array of subject attributes to use.\n   */\n  csr.setSubject = function(attrs) {\n    // set new attributes\n    _fillMissingFields(attrs);\n    csr.subject.attributes = attrs;\n    csr.subject.hash = null;\n  };\n\n  /**\n   * Sets the attributes of this certification request.\n   *\n   * @param attrs the array of attributes to use.\n   */\n  csr.setAttributes = function(attrs) {\n    // set new attributes\n    _fillMissingFields(attrs);\n    csr.attributes = attrs;\n  };\n\n  /**\n   * Signs this certification request using the given private key.\n   *\n   * @param key the private key to sign with.\n   * @param md the message digest object to use (defaults to forge.md.sha1).\n   */\n  csr.sign = function(key, md) {\n    // TODO: get signature OID from private key\n    csr.md = md || forge.md.sha1.create();\n    var algorithmOid = oids[csr.md.algorithm + 'WithRSAEncryption'];\n    if(!algorithmOid) {\n      var error = new Error('Could not compute certification request digest. ' +\n        'Unknown message digest algorithm OID.');\n      error.algorithm = csr.md.algorithm;\n      throw error;\n    }\n    csr.signatureOid = csr.siginfo.algorithmOid = algorithmOid;\n\n    // get CertificationRequestInfo, convert to DER\n    csr.certificationRequestInfo = pki.getCertificationRequestInfo(csr);\n    var bytes = asn1.toDer(csr.certificationRequestInfo);\n\n    // digest and sign\n    csr.md.update(bytes.getBytes());\n    csr.signature = key.sign(csr.md);\n  };\n\n  /**\n   * Attempts verify the signature on the passed certification request using\n   * its public key.\n   *\n   * A CSR that has been exported to a file in PEM format can be verified using\n   * OpenSSL using this command:\n   *\n   * openssl req -in <the-csr-pem-file> -verify -noout -text\n   *\n   * @return true if verified, false if not.\n   */\n  csr.verify = function() {\n    var rval = false;\n\n    var md = csr.md;\n    if(md === null) {\n      md = _createSignatureDigest({\n        signatureOid: csr.signatureOid,\n        type: 'certification request'\n      });\n\n      // produce DER formatted CertificationRequestInfo and digest it\n      var cri = csr.certificationRequestInfo ||\n        pki.getCertificationRequestInfo(csr);\n      var bytes = asn1.toDer(cri);\n      md.update(bytes.getBytes());\n    }\n\n    if(md !== null) {\n      rval = _verifySignature({\n        certificate: csr, md: md, signature: csr.signature\n      });\n    }\n\n    return rval;\n  };\n\n  return csr;\n};\n\n/**\n * Converts an X.509 subject or issuer to an ASN.1 RDNSequence.\n *\n * @param obj the subject or issuer (distinguished name).\n *\n * @return the ASN.1 RDNSequence.\n */\nfunction _dnToAsn1(obj) {\n  // create an empty RDNSequence\n  var rval = asn1.create(\n    asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, []);\n\n  // iterate over attributes\n  var attr, set;\n  var attrs = obj.attributes;\n  for(var i = 0; i < attrs.length; ++i) {\n    attr = attrs[i];\n    var value = attr.value;\n\n    // reuse tag class for attribute value if available\n    var valueTagClass = asn1.Type.PRINTABLESTRING;\n    if('valueTagClass' in attr) {\n      valueTagClass = attr.valueTagClass;\n\n      if(valueTagClass === asn1.Type.UTF8) {\n        value = forge.util.encodeUtf8(value);\n      }\n      // FIXME: handle more encodings\n    }\n\n    // create a RelativeDistinguishedName set\n    // each value in the set is an AttributeTypeAndValue first\n    // containing the type (an OID) and second the value\n    set = asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SET, true, [\n      asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [\n        // AttributeType\n        asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OID, false,\n          asn1.oidToDer(attr.type).getBytes()),\n        // AttributeValue\n        asn1.create(asn1.Class.UNIVERSAL, valueTagClass, false, value)\n      ])\n    ]);\n    rval.value.push(set);\n  }\n\n  return rval;\n}\n\n/**\n * Gets all printable attributes (typically of an issuer or subject) in a\n * simplified JSON format for display.\n *\n * @param attrs the attributes.\n *\n * @return the JSON for display.\n */\nfunction _getAttributesAsJson(attrs) {\n  var rval = {};\n  for(var i = 0; i < attrs.length; ++i) {\n    var attr = attrs[i];\n    if(attr.shortName && (\n      attr.valueTagClass === asn1.Type.UTF8 ||\n      attr.valueTagClass === asn1.Type.PRINTABLESTRING ||\n      attr.valueTagClass === asn1.Type.IA5STRING)) {\n      var value = attr.value;\n      if(attr.valueTagClass === asn1.Type.UTF8) {\n        value = forge.util.encodeUtf8(attr.value);\n      }\n      if(!(attr.shortName in rval)) {\n        rval[attr.shortName] = value;\n      } else if(forge.util.isArray(rval[attr.shortName])) {\n        rval[attr.shortName].push(value);\n      } else {\n        rval[attr.shortName] = [rval[attr.shortName], value];\n      }\n    }\n  }\n  return rval;\n}\n\n/**\n * Fills in missing fields in attributes.\n *\n * @param attrs the attributes to fill missing fields in.\n */\nfunction _fillMissingFields(attrs) {\n  var attr;\n  for(var i = 0; i < attrs.length; ++i) {\n    attr = attrs[i];\n\n    // populate missing name\n    if(typeof attr.name === 'undefined') {\n      if(attr.type && attr.type in pki.oids) {\n        attr.name = pki.oids[attr.type];\n      } else if(attr.shortName && attr.shortName in _shortNames) {\n        attr.name = pki.oids[_shortNames[attr.shortName]];\n      }\n    }\n\n    // populate missing type (OID)\n    if(typeof attr.type === 'undefined') {\n      if(attr.name && attr.name in pki.oids) {\n        attr.type = pki.oids[attr.name];\n      } else {\n        var error = new Error('Attribute type not specified.');\n        error.attribute = attr;\n        throw error;\n      }\n    }\n\n    // populate missing shortname\n    if(typeof attr.shortName === 'undefined') {\n      if(attr.name && attr.name in _shortNames) {\n        attr.shortName = _shortNames[attr.name];\n      }\n    }\n\n    // convert extensions to value\n    if(attr.type === oids.extensionRequest) {\n      attr.valueConstructed = true;\n      attr.valueTagClass = asn1.Type.SEQUENCE;\n      if(!attr.value && attr.extensions) {\n        attr.value = [];\n        for(var ei = 0; ei < attr.extensions.length; ++ei) {\n          attr.value.push(pki.certificateExtensionToAsn1(\n            _fillMissingExtensionFields(attr.extensions[ei])));\n        }\n      }\n    }\n\n    if(typeof attr.value === 'undefined') {\n      var error = new Error('Attribute value not specified.');\n      error.attribute = attr;\n      throw error;\n    }\n  }\n}\n\n/**\n * Fills in missing fields in certificate extensions.\n *\n * @param e the extension.\n * @param [options] the options to use.\n *          [cert] the certificate the extensions are for.\n *\n * @return the extension.\n */\nfunction _fillMissingExtensionFields(e, options) {\n  options = options || {};\n\n  // populate missing name\n  if(typeof e.name === 'undefined') {\n    if(e.id && e.id in pki.oids) {\n      e.name = pki.oids[e.id];\n    }\n  }\n\n  // populate missing id\n  if(typeof e.id === 'undefined') {\n    if(e.name && e.name in pki.oids) {\n      e.id = pki.oids[e.name];\n    } else {\n      var error = new Error('Extension ID not specified.');\n      error.extension = e;\n      throw error;\n    }\n  }\n\n  if(typeof e.value !== 'undefined') {\n    return e;\n  }\n\n  // handle missing value:\n\n  // value is a BIT STRING\n  if(e.name === 'keyUsage') {\n    // build flags\n    var unused = 0;\n    var b2 = 0x00;\n    var b3 = 0x00;\n    if(e.digitalSignature) {\n      b2 |= 0x80;\n      unused = 7;\n    }\n    if(e.nonRepudiation) {\n      b2 |= 0x40;\n      unused = 6;\n    }\n    if(e.keyEncipherment) {\n      b2 |= 0x20;\n      unused = 5;\n    }\n    if(e.dataEncipherment) {\n      b2 |= 0x10;\n      unused = 4;\n    }\n    if(e.keyAgreement) {\n      b2 |= 0x08;\n      unused = 3;\n    }\n    if(e.keyCertSign) {\n      b2 |= 0x04;\n      unused = 2;\n    }\n    if(e.cRLSign) {\n      b2 |= 0x02;\n      unused = 1;\n    }\n    if(e.encipherOnly) {\n      b2 |= 0x01;\n      unused = 0;\n    }\n    if(e.decipherOnly) {\n      b3 |= 0x80;\n      unused = 7;\n    }\n\n    // create bit string\n    var value = String.fromCharCode(unused);\n    if(b3 !== 0) {\n      value += String.fromCharCode(b2) + String.fromCharCode(b3);\n    } else if(b2 !== 0) {\n      value += String.fromCharCode(b2);\n    }\n    e.value = asn1.create(\n      asn1.Class.UNIVERSAL, asn1.Type.BITSTRING, false, value);\n  } else if(e.name === 'basicConstraints') {\n    // basicConstraints is a SEQUENCE\n    e.value = asn1.create(\n      asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, []);\n    // cA BOOLEAN flag defaults to false\n    if(e.cA) {\n      e.value.value.push(asn1.create(\n        asn1.Class.UNIVERSAL, asn1.Type.BOOLEAN, false,\n        String.fromCharCode(0xFF)));\n    }\n    if('pathLenConstraint' in e) {\n      e.value.value.push(asn1.create(\n        asn1.Class.UNIVERSAL, asn1.Type.INTEGER, false,\n        asn1.integerToDer(e.pathLenConstraint).getBytes()));\n    }\n  } else if(e.name === 'extKeyUsage') {\n    // extKeyUsage is a SEQUENCE of OIDs\n    e.value = asn1.create(\n      asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, []);\n    var seq = e.value.value;\n    for(var key in e) {\n      if(e[key] !== true) {\n        continue;\n      }\n      // key is name in OID map\n      if(key in oids) {\n        seq.push(asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OID,\n          false, asn1.oidToDer(oids[key]).getBytes()));\n      } else if(key.indexOf('.') !== -1) {\n        // assume key is an OID\n        seq.push(asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OID,\n          false, asn1.oidToDer(key).getBytes()));\n      }\n    }\n  } else if(e.name === 'nsCertType') {\n    // nsCertType is a BIT STRING\n    // build flags\n    var unused = 0;\n    var b2 = 0x00;\n\n    if(e.client) {\n      b2 |= 0x80;\n      unused = 7;\n    }\n    if(e.server) {\n      b2 |= 0x40;\n      unused = 6;\n    }\n    if(e.email) {\n      b2 |= 0x20;\n      unused = 5;\n    }\n    if(e.objsign) {\n      b2 |= 0x10;\n      unused = 4;\n    }\n    if(e.reserved) {\n      b2 |= 0x08;\n      unused = 3;\n    }\n    if(e.sslCA) {\n      b2 |= 0x04;\n      unused = 2;\n    }\n    if(e.emailCA) {\n      b2 |= 0x02;\n      unused = 1;\n    }\n    if(e.objCA) {\n      b2 |= 0x01;\n      unused = 0;\n    }\n\n    // create bit string\n    var value = String.fromCharCode(unused);\n    if(b2 !== 0) {\n      value += String.fromCharCode(b2);\n    }\n    e.value = asn1.create(\n      asn1.Class.UNIVERSAL, asn1.Type.BITSTRING, false, value);\n  } else if(e.name === 'subjectAltName' || e.name === 'issuerAltName') {\n    // SYNTAX SEQUENCE\n    e.value = asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, []);\n\n    var altName;\n    for(var n = 0; n < e.altNames.length; ++n) {\n      altName = e.altNames[n];\n      var value = altName.value;\n      // handle IP\n      if(altName.type === 7 && altName.ip) {\n        value = forge.util.bytesFromIP(altName.ip);\n        if(value === null) {\n          var error = new Error(\n            'Extension \"ip\" value is not a valid IPv4 or IPv6 address.');\n          error.extension = e;\n          throw error;\n        }\n      } else if(altName.type === 8) {\n        // handle OID\n        if(altName.oid) {\n          value = asn1.oidToDer(asn1.oidToDer(altName.oid));\n        } else {\n          // deprecated ... convert value to OID\n          value = asn1.oidToDer(value);\n        }\n      }\n      e.value.value.push(asn1.create(\n        asn1.Class.CONTEXT_SPECIFIC, altName.type, false,\n        value));\n    }\n  } else if(e.name === 'nsComment' && options.cert) {\n    // sanity check value is ASCII (req'd) and not too big\n    if(!(/^[\\x00-\\x7F]*$/.test(e.comment)) ||\n      (e.comment.length < 1) || (e.comment.length > 128)) {\n      throw new Error('Invalid \"nsComment\" content.');\n    }\n    // IA5STRING opaque comment\n    e.value = asn1.create(\n      asn1.Class.UNIVERSAL, asn1.Type.IA5STRING, false, e.comment);\n  } else if(e.name === 'subjectKeyIdentifier' && options.cert) {\n    var ski = options.cert.generateSubjectKeyIdentifier();\n    e.subjectKeyIdentifier = ski.toHex();\n    // OCTETSTRING w/digest\n    e.value = asn1.create(\n      asn1.Class.UNIVERSAL, asn1.Type.OCTETSTRING, false, ski.getBytes());\n  } else if(e.name === 'authorityKeyIdentifier' && options.cert) {\n    // SYNTAX SEQUENCE\n    e.value = asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, []);\n    var seq = e.value.value;\n\n    if(e.keyIdentifier) {\n      var keyIdentifier = (e.keyIdentifier === true ?\n        options.cert.generateSubjectKeyIdentifier().getBytes() :\n        e.keyIdentifier);\n      seq.push(\n        asn1.create(asn1.Class.CONTEXT_SPECIFIC, 0, false, keyIdentifier));\n    }\n\n    if(e.authorityCertIssuer) {\n      var authorityCertIssuer = [\n        asn1.create(asn1.Class.CONTEXT_SPECIFIC, 4, true, [\n          _dnToAsn1(e.authorityCertIssuer === true ?\n            options.cert.issuer : e.authorityCertIssuer)\n        ])\n      ];\n      seq.push(\n        asn1.create(asn1.Class.CONTEXT_SPECIFIC, 1, true, authorityCertIssuer));\n    }\n\n    if(e.serialNumber) {\n      var serialNumber = forge.util.hexToBytes(e.serialNumber === true ?\n        options.cert.serialNumber : e.serialNumber);\n      seq.push(\n        asn1.create(asn1.Class.CONTEXT_SPECIFIC, 2, false, serialNumber));\n    }\n  } else if(e.name === 'cRLDistributionPoints') {\n    e.value = asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, []);\n    var seq = e.value.value;\n\n    // Create sub SEQUENCE of DistributionPointName\n    var subSeq = asn1.create(\n      asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, []);\n\n    // Create fullName CHOICE\n    var fullNameGeneralNames = asn1.create(\n      asn1.Class.CONTEXT_SPECIFIC, 0, true, []);\n    var altName;\n    for(var n = 0; n < e.altNames.length; ++n) {\n      altName = e.altNames[n];\n      var value = altName.value;\n      // handle IP\n      if(altName.type === 7 && altName.ip) {\n        value = forge.util.bytesFromIP(altName.ip);\n        if(value === null) {\n          var error = new Error(\n            'Extension \"ip\" value is not a valid IPv4 or IPv6 address.');\n          error.extension = e;\n          throw error;\n        }\n      } else if(altName.type === 8) {\n        // handle OID\n        if(altName.oid) {\n          value = asn1.oidToDer(asn1.oidToDer(altName.oid));\n        } else {\n          // deprecated ... convert value to OID\n          value = asn1.oidToDer(value);\n        }\n      }\n      fullNameGeneralNames.value.push(asn1.create(\n        asn1.Class.CONTEXT_SPECIFIC, altName.type, false,\n        value));\n    }\n\n    // Add to the parent SEQUENCE\n    subSeq.value.push(asn1.create(\n      asn1.Class.CONTEXT_SPECIFIC, 0, true, [fullNameGeneralNames]));\n    seq.push(subSeq);\n  }\n\n  // ensure value has been defined by now\n  if(typeof e.value === 'undefined') {\n    var error = new Error('Extension value not specified.');\n    error.extension = e;\n    throw error;\n  }\n\n  return e;\n}\n\n/**\n * Convert signature parameters object to ASN.1\n *\n * @param {String} oid Signature algorithm OID\n * @param params The signature parametrs object\n * @return ASN.1 object representing signature parameters\n */\nfunction _signatureParametersToAsn1(oid, params) {\n  switch(oid) {\n    case oids['RSASSA-PSS']:\n      var parts = [];\n\n      if(params.hash.algorithmOid !== undefined) {\n        parts.push(asn1.create(asn1.Class.CONTEXT_SPECIFIC, 0, true, [\n          asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [\n            asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OID, false,\n              asn1.oidToDer(params.hash.algorithmOid).getBytes()),\n            asn1.create(asn1.Class.UNIVERSAL, asn1.Type.NULL, false, '')\n          ])\n        ]));\n      }\n\n      if(params.mgf.algorithmOid !== undefined) {\n        parts.push(asn1.create(asn1.Class.CONTEXT_SPECIFIC, 1, true, [\n          asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [\n            asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OID, false,\n              asn1.oidToDer(params.mgf.algorithmOid).getBytes()),\n            asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [\n              asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OID, false,\n                asn1.oidToDer(params.mgf.hash.algorithmOid).getBytes()),\n              asn1.create(asn1.Class.UNIVERSAL, asn1.Type.NULL, false, '')\n            ])\n          ])\n        ]));\n      }\n\n      if(params.saltLength !== undefined) {\n        parts.push(asn1.create(asn1.Class.CONTEXT_SPECIFIC, 2, true, [\n          asn1.create(asn1.Class.UNIVERSAL, asn1.Type.INTEGER, false,\n            asn1.integerToDer(params.saltLength).getBytes())\n        ]));\n      }\n\n      return asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, parts);\n\n    default:\n      return asn1.create(asn1.Class.UNIVERSAL, asn1.Type.NULL, false, '');\n  }\n}\n\n/**\n * Converts a certification request's attributes to an ASN.1 set of\n * CRIAttributes.\n *\n * @param csr certification request.\n *\n * @return the ASN.1 set of CRIAttributes.\n */\nfunction _CRIAttributesToAsn1(csr) {\n  // create an empty context-specific container\n  var rval = asn1.create(asn1.Class.CONTEXT_SPECIFIC, 0, true, []);\n\n  // no attributes, return empty container\n  if(csr.attributes.length === 0) {\n    return rval;\n  }\n\n  // each attribute has a sequence with a type and a set of values\n  var attrs = csr.attributes;\n  for(var i = 0; i < attrs.length; ++i) {\n    var attr = attrs[i];\n    var value = attr.value;\n\n    // reuse tag class for attribute value if available\n    var valueTagClass = asn1.Type.UTF8;\n    if('valueTagClass' in attr) {\n      valueTagClass = attr.valueTagClass;\n    }\n    if(valueTagClass === asn1.Type.UTF8) {\n      value = forge.util.encodeUtf8(value);\n    }\n    var valueConstructed = false;\n    if('valueConstructed' in attr) {\n      valueConstructed = attr.valueConstructed;\n    }\n    // FIXME: handle more encodings\n\n    // create a RelativeDistinguishedName set\n    // each value in the set is an AttributeTypeAndValue first\n    // containing the type (an OID) and second the value\n    var seq = asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [\n      // AttributeType\n      asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OID, false,\n        asn1.oidToDer(attr.type).getBytes()),\n      asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SET, true, [\n        // AttributeValue\n        asn1.create(\n          asn1.Class.UNIVERSAL, valueTagClass, valueConstructed, value)\n      ])\n    ]);\n    rval.value.push(seq);\n  }\n\n  return rval;\n}\n\nvar jan_1_1950 = new Date('1950-01-01T00:00:00Z');\nvar jan_1_2050 = new Date('2050-01-01T00:00:00Z');\n\n/**\n * Converts a Date object to ASN.1\n * Handles the different format before and after 1st January 2050\n *\n * @param date date object.\n *\n * @return the ASN.1 object representing the date.\n */\nfunction _dateToAsn1(date) {\n  if(date >= jan_1_1950 && date < jan_1_2050) {\n    return asn1.create(\n      asn1.Class.UNIVERSAL, asn1.Type.UTCTIME, false,\n      asn1.dateToUtcTime(date));\n  } else {\n    return asn1.create(\n      asn1.Class.UNIVERSAL, asn1.Type.GENERALIZEDTIME, false,\n      asn1.dateToGeneralizedTime(date));\n  }\n}\n\n/**\n * Gets the ASN.1 TBSCertificate part of an X.509v3 certificate.\n *\n * @param cert the certificate.\n *\n * @return the asn1 TBSCertificate.\n */\npki.getTBSCertificate = function(cert) {\n  // TBSCertificate\n  var notBefore = _dateToAsn1(cert.validity.notBefore);\n  var notAfter = _dateToAsn1(cert.validity.notAfter);\n  var tbs = asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [\n    // version\n    asn1.create(asn1.Class.CONTEXT_SPECIFIC, 0, true, [\n      // integer\n      asn1.create(asn1.Class.UNIVERSAL, asn1.Type.INTEGER, false,\n        asn1.integerToDer(cert.version).getBytes())\n    ]),\n    // serialNumber\n    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.INTEGER, false,\n      forge.util.hexToBytes(cert.serialNumber)),\n    // signature\n    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [\n      // algorithm\n      asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OID, false,\n        asn1.oidToDer(cert.siginfo.algorithmOid).getBytes()),\n      // parameters\n      _signatureParametersToAsn1(\n        cert.siginfo.algorithmOid, cert.siginfo.parameters)\n    ]),\n    // issuer\n    _dnToAsn1(cert.issuer),\n    // validity\n    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [\n      notBefore,\n      notAfter\n    ]),\n    // subject\n    _dnToAsn1(cert.subject),\n    // SubjectPublicKeyInfo\n    pki.publicKeyToAsn1(cert.publicKey)\n  ]);\n\n  if(cert.issuer.uniqueId) {\n    // issuerUniqueID (optional)\n    tbs.value.push(\n      asn1.create(asn1.Class.CONTEXT_SPECIFIC, 1, true, [\n        asn1.create(asn1.Class.UNIVERSAL, asn1.Type.BITSTRING, false,\n          // TODO: support arbitrary bit length ids\n          String.fromCharCode(0x00) +\n          cert.issuer.uniqueId\n        )\n      ])\n    );\n  }\n  if(cert.subject.uniqueId) {\n    // subjectUniqueID (optional)\n    tbs.value.push(\n      asn1.create(asn1.Class.CONTEXT_SPECIFIC, 2, true, [\n        asn1.create(asn1.Class.UNIVERSAL, asn1.Type.BITSTRING, false,\n          // TODO: support arbitrary bit length ids\n          String.fromCharCode(0x00) +\n          cert.subject.uniqueId\n        )\n      ])\n    );\n  }\n\n  if(cert.extensions.length > 0) {\n    // extensions (optional)\n    tbs.value.push(pki.certificateExtensionsToAsn1(cert.extensions));\n  }\n\n  return tbs;\n};\n\n/**\n * Gets the ASN.1 CertificationRequestInfo part of a\n * PKCS#10 CertificationRequest.\n *\n * @param csr the certification request.\n *\n * @return the asn1 CertificationRequestInfo.\n */\npki.getCertificationRequestInfo = function(csr) {\n  // CertificationRequestInfo\n  var cri = asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [\n    // version\n    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.INTEGER, false,\n      asn1.integerToDer(csr.version).getBytes()),\n    // subject\n    _dnToAsn1(csr.subject),\n    // SubjectPublicKeyInfo\n    pki.publicKeyToAsn1(csr.publicKey),\n    // attributes\n    _CRIAttributesToAsn1(csr)\n  ]);\n\n  return cri;\n};\n\n/**\n * Converts a DistinguishedName (subject or issuer) to an ASN.1 object.\n *\n * @param dn the DistinguishedName.\n *\n * @return the asn1 representation of a DistinguishedName.\n */\npki.distinguishedNameToAsn1 = function(dn) {\n  return _dnToAsn1(dn);\n};\n\n/**\n * Converts an X.509v3 RSA certificate to an ASN.1 object.\n *\n * @param cert the certificate.\n *\n * @return the asn1 representation of an X.509v3 RSA certificate.\n */\npki.certificateToAsn1 = function(cert) {\n  // prefer cached TBSCertificate over generating one\n  var tbsCertificate = cert.tbsCertificate || pki.getTBSCertificate(cert);\n\n  // Certificate\n  return asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [\n    // TBSCertificate\n    tbsCertificate,\n    // AlgorithmIdentifier (signature algorithm)\n    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [\n      // algorithm\n      asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OID, false,\n        asn1.oidToDer(cert.signatureOid).getBytes()),\n      // parameters\n      _signatureParametersToAsn1(cert.signatureOid, cert.signatureParameters)\n    ]),\n    // SignatureValue\n    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.BITSTRING, false,\n      String.fromCharCode(0x00) + cert.signature)\n  ]);\n};\n\n/**\n * Converts X.509v3 certificate extensions to ASN.1.\n *\n * @param exts the extensions to convert.\n *\n * @return the extensions in ASN.1 format.\n */\npki.certificateExtensionsToAsn1 = function(exts) {\n  // create top-level extension container\n  var rval = asn1.create(asn1.Class.CONTEXT_SPECIFIC, 3, true, []);\n\n  // create extension sequence (stores a sequence for each extension)\n  var seq = asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, []);\n  rval.value.push(seq);\n\n  for(var i = 0; i < exts.length; ++i) {\n    seq.value.push(pki.certificateExtensionToAsn1(exts[i]));\n  }\n\n  return rval;\n};\n\n/**\n * Converts a single certificate extension to ASN.1.\n *\n * @param ext the extension to convert.\n *\n * @return the extension in ASN.1 format.\n */\npki.certificateExtensionToAsn1 = function(ext) {\n  // create a sequence for each extension\n  var extseq = asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, []);\n\n  // extnID (OID)\n  extseq.value.push(asn1.create(\n    asn1.Class.UNIVERSAL, asn1.Type.OID, false,\n    asn1.oidToDer(ext.id).getBytes()));\n\n  // critical defaults to false\n  if(ext.critical) {\n    // critical BOOLEAN DEFAULT FALSE\n    extseq.value.push(asn1.create(\n      asn1.Class.UNIVERSAL, asn1.Type.BOOLEAN, false,\n      String.fromCharCode(0xFF)));\n  }\n\n  var value = ext.value;\n  if(typeof ext.value !== 'string') {\n    // value is asn.1\n    value = asn1.toDer(value).getBytes();\n  }\n\n  // extnValue (OCTET STRING)\n  extseq.value.push(asn1.create(\n    asn1.Class.UNIVERSAL, asn1.Type.OCTETSTRING, false, value));\n\n  return extseq;\n};\n\n/**\n * Converts a PKCS#10 certification request to an ASN.1 object.\n *\n * @param csr the certification request.\n *\n * @return the asn1 representation of a certification request.\n */\npki.certificationRequestToAsn1 = function(csr) {\n  // prefer cached CertificationRequestInfo over generating one\n  var cri = csr.certificationRequestInfo ||\n    pki.getCertificationRequestInfo(csr);\n\n  // Certificate\n  return asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [\n    // CertificationRequestInfo\n    cri,\n    // AlgorithmIdentifier (signature algorithm)\n    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [\n      // algorithm\n      asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OID, false,\n        asn1.oidToDer(csr.signatureOid).getBytes()),\n      // parameters\n      _signatureParametersToAsn1(csr.signatureOid, csr.signatureParameters)\n    ]),\n    // signature\n    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.BITSTRING, false,\n      String.fromCharCode(0x00) + csr.signature)\n  ]);\n};\n\n/**\n * Creates a CA store.\n *\n * @param certs an optional array of certificate objects or PEM-formatted\n *          certificate strings to add to the CA store.\n *\n * @return the CA store.\n */\npki.createCaStore = function(certs) {\n  // create CA store\n  var caStore = {\n    // stored certificates\n    certs: {}\n  };\n\n  /**\n   * Gets the certificate that issued the passed certificate or its\n   * 'parent'.\n   *\n   * @param cert the certificate to get the parent for.\n   *\n   * @return the parent certificate or null if none was found.\n   */\n  caStore.getIssuer = function(cert) {\n    var rval = getBySubject(cert.issuer);\n\n    // see if there are multiple matches\n    /*if(forge.util.isArray(rval)) {\n      // TODO: resolve multiple matches by checking\n      // authorityKey/subjectKey/issuerUniqueID/other identifiers, etc.\n      // FIXME: or alternatively do authority key mapping\n      // if possible (X.509v1 certs can't work?)\n      throw new Error('Resolving multiple issuer matches not implemented yet.');\n    }*/\n\n    return rval;\n  };\n\n  /**\n   * Adds a trusted certificate to the store.\n   *\n   * @param cert the certificate to add as a trusted certificate (either a\n   *          pki.certificate object or a PEM-formatted certificate).\n   */\n  caStore.addCertificate = function(cert) {\n    // convert from pem if necessary\n    if(typeof cert === 'string') {\n      cert = forge.pki.certificateFromPem(cert);\n    }\n\n    ensureSubjectHasHash(cert.subject);\n\n    if(!caStore.hasCertificate(cert)) { // avoid duplicate certificates in store\n      if(cert.subject.hash in caStore.certs) {\n        // subject hash already exists, append to array\n        var tmp = caStore.certs[cert.subject.hash];\n        if(!forge.util.isArray(tmp)) {\n          tmp = [tmp];\n        }\n        tmp.push(cert);\n        caStore.certs[cert.subject.hash] = tmp;\n      } else {\n        caStore.certs[cert.subject.hash] = cert;\n      }\n    }\n  };\n\n  /**\n   * Checks to see if the given certificate is in the store.\n   *\n   * @param cert the certificate to check (either a pki.certificate or a\n   *          PEM-formatted certificate).\n   *\n   * @return true if the certificate is in the store, false if not.\n   */\n  caStore.hasCertificate = function(cert) {\n    // convert from pem if necessary\n    if(typeof cert === 'string') {\n      cert = forge.pki.certificateFromPem(cert);\n    }\n\n    var match = getBySubject(cert.subject);\n    if(!match) {\n      return false;\n    }\n    if(!forge.util.isArray(match)) {\n      match = [match];\n    }\n    // compare DER-encoding of certificates\n    var der1 = asn1.toDer(pki.certificateToAsn1(cert)).getBytes();\n    for(var i = 0; i < match.length; ++i) {\n      var der2 = asn1.toDer(pki.certificateToAsn1(match[i])).getBytes();\n      if(der1 === der2) {\n        return true;\n      }\n    }\n    return false;\n  };\n\n  /**\n   * Lists all of the certificates kept in the store.\n   *\n   * @return an array of all of the pki.certificate objects in the store.\n   */\n  caStore.listAllCertificates = function() {\n    var certList = [];\n\n    for(var hash in caStore.certs) {\n      if(caStore.certs.hasOwnProperty(hash)) {\n        var value = caStore.certs[hash];\n        if(!forge.util.isArray(value)) {\n          certList.push(value);\n        } else {\n          for(var i = 0; i < value.length; ++i) {\n            certList.push(value[i]);\n          }\n        }\n      }\n    }\n\n    return certList;\n  };\n\n  /**\n   * Removes a certificate from the store.\n   *\n   * @param cert the certificate to remove (either a pki.certificate or a\n   *          PEM-formatted certificate).\n   *\n   * @return the certificate that was removed or null if the certificate\n   *           wasn't in store.\n   */\n  caStore.removeCertificate = function(cert) {\n    var result;\n\n    // convert from pem if necessary\n    if(typeof cert === 'string') {\n      cert = forge.pki.certificateFromPem(cert);\n    }\n    ensureSubjectHasHash(cert.subject);\n    if(!caStore.hasCertificate(cert)) {\n      return null;\n    }\n\n    var match = getBySubject(cert.subject);\n\n    if(!forge.util.isArray(match)) {\n      result = caStore.certs[cert.subject.hash];\n      delete caStore.certs[cert.subject.hash];\n      return result;\n    }\n\n    // compare DER-encoding of certificates\n    var der1 = asn1.toDer(pki.certificateToAsn1(cert)).getBytes();\n    for(var i = 0; i < match.length; ++i) {\n      var der2 = asn1.toDer(pki.certificateToAsn1(match[i])).getBytes();\n      if(der1 === der2) {\n        result = match[i];\n        match.splice(i, 1);\n      }\n    }\n    if(match.length === 0) {\n      delete caStore.certs[cert.subject.hash];\n    }\n\n    return result;\n  };\n\n  function getBySubject(subject) {\n    ensureSubjectHasHash(subject);\n    return caStore.certs[subject.hash] || null;\n  }\n\n  function ensureSubjectHasHash(subject) {\n    // produce subject hash if it doesn't exist\n    if(!subject.hash) {\n      var md = forge.md.sha1.create();\n      subject.attributes = pki.RDNAttributesAsArray(_dnToAsn1(subject), md);\n      subject.hash = md.digest().toHex();\n    }\n  }\n\n  // auto-add passed in certs\n  if(certs) {\n    // parse PEM-formatted certificates as necessary\n    for(var i = 0; i < certs.length; ++i) {\n      var cert = certs[i];\n      caStore.addCertificate(cert);\n    }\n  }\n\n  return caStore;\n};\n\n/**\n * Certificate verification errors, based on TLS.\n */\npki.certificateError = {\n  bad_certificate: 'forge.pki.BadCertificate',\n  unsupported_certificate: 'forge.pki.UnsupportedCertificate',\n  certificate_revoked: 'forge.pki.CertificateRevoked',\n  certificate_expired: 'forge.pki.CertificateExpired',\n  certificate_unknown: 'forge.pki.CertificateUnknown',\n  unknown_ca: 'forge.pki.UnknownCertificateAuthority'\n};\n\n/**\n * Verifies a certificate chain against the given Certificate Authority store\n * with an optional custom verify callback.\n *\n * @param caStore a certificate store to verify against.\n * @param chain the certificate chain to verify, with the root or highest\n *          authority at the end (an array of certificates).\n * @param options a callback to be called for every certificate in the chain or\n *                  an object with:\n *                  verify a callback to be called for every certificate in the\n *                    chain\n *                  validityCheckDate the date against which the certificate\n *                    validity period should be checked. Pass null to not check\n *                    the validity period. By default, the current date is used.\n *\n * The verify callback has the following signature:\n *\n * verified - Set to true if certificate was verified, otherwise the\n *   pki.certificateError for why the certificate failed.\n * depth - The current index in the chain, where 0 is the end point's cert.\n * certs - The certificate chain, *NOTE* an empty chain indicates an anonymous\n *   end point.\n *\n * The function returns true on success and on failure either the appropriate\n * pki.certificateError or an object with 'error' set to the appropriate\n * pki.certificateError and 'message' set to a custom error message.\n *\n * @return true if successful, error thrown if not.\n */\npki.verifyCertificateChain = function(caStore, chain, options) {\n  /* From: RFC3280 - Internet X.509 Public Key Infrastructure Certificate\n    Section 6: Certification Path Validation\n    See inline parentheticals related to this particular implementation.\n\n    The primary goal of path validation is to verify the binding between\n    a subject distinguished name or a subject alternative name and subject\n    public key, as represented in the end entity certificate, based on the\n    public key of the trust anchor. This requires obtaining a sequence of\n    certificates that support that binding. That sequence should be provided\n    in the passed 'chain'. The trust anchor should be in the given CA\n    store. The 'end entity' certificate is the certificate provided by the\n    end point (typically a server) and is the first in the chain.\n\n    To meet this goal, the path validation process verifies, among other\n    things, that a prospective certification path (a sequence of n\n    certificates or a 'chain') satisfies the following conditions:\n\n    (a) for all x in {1, ..., n-1}, the subject of certificate x is\n          the issuer of certificate x+1;\n\n    (b) certificate 1 is issued by the trust anchor;\n\n    (c) certificate n is the certificate to be validated; and\n\n    (d) for all x in {1, ..., n}, the certificate was valid at the\n          time in question.\n\n    Note that here 'n' is index 0 in the chain and 1 is the last certificate\n    in the chain and it must be signed by a certificate in the connection's\n    CA store.\n\n    The path validation process also determines the set of certificate\n    policies that are valid for this path, based on the certificate policies\n    extension, policy mapping extension, policy constraints extension, and\n    inhibit any-policy extension.\n\n    Note: Policy mapping extension not supported (Not Required).\n\n    Note: If the certificate has an unsupported critical extension, then it\n    must be rejected.\n\n    Note: A certificate is self-issued if the DNs that appear in the subject\n    and issuer fields are identical and are not empty.\n\n    The path validation algorithm assumes the following seven inputs are\n    provided to the path processing logic. What this specific implementation\n    will use is provided parenthetically:\n\n    (a) a prospective certification path of length n (the 'chain')\n    (b) the current date/time: ('now').\n    (c) user-initial-policy-set: A set of certificate policy identifiers\n          naming the policies that are acceptable to the certificate user.\n          The user-initial-policy-set contains the special value any-policy\n          if the user is not concerned about certificate policy\n          (Not implemented. Any policy is accepted).\n    (d) trust anchor information, describing a CA that serves as a trust\n          anchor for the certification path. The trust anchor information\n          includes:\n\n      (1)  the trusted issuer name,\n      (2)  the trusted public key algorithm,\n      (3)  the trusted public key, and\n      (4)  optionally, the trusted public key parameters associated\n             with the public key.\n\n      (Trust anchors are provided via certificates in the CA store).\n\n      The trust anchor information may be provided to the path processing\n      procedure in the form of a self-signed certificate. The trusted anchor\n      information is trusted because it was delivered to the path processing\n      procedure by some trustworthy out-of-band procedure. If the trusted\n      public key algorithm requires parameters, then the parameters are\n      provided along with the trusted public key (No parameters used in this\n      implementation).\n\n    (e) initial-policy-mapping-inhibit, which indicates if policy mapping is\n          allowed in the certification path.\n          (Not implemented, no policy checking)\n\n    (f) initial-explicit-policy, which indicates if the path must be valid\n          for at least one of the certificate policies in the user-initial-\n          policy-set.\n          (Not implemented, no policy checking)\n\n    (g) initial-any-policy-inhibit, which indicates whether the\n          anyPolicy OID should be processed if it is included in a\n          certificate.\n          (Not implemented, so any policy is valid provided that it is\n          not marked as critical) */\n\n  /* Basic Path Processing:\n\n    For each certificate in the 'chain', the following is checked:\n\n    1. The certificate validity period includes the current time.\n    2. The certificate was signed by its parent (where the parent is either\n       the next in the chain or from the CA store). Allow processing to\n       continue to the next step if no parent is found but the certificate is\n       in the CA store.\n    3. TODO: The certificate has not been revoked.\n    4. The certificate issuer name matches the parent's subject name.\n    5. TODO: If the certificate is self-issued and not the final certificate\n       in the chain, skip this step, otherwise verify that the subject name\n       is within one of the permitted subtrees of X.500 distinguished names\n       and that each of the alternative names in the subjectAltName extension\n       (critical or non-critical) is within one of the permitted subtrees for\n       that name type.\n    6. TODO: If the certificate is self-issued and not the final certificate\n       in the chain, skip this step, otherwise verify that the subject name\n       is not within one of the excluded subtrees for X.500 distinguished\n       names and none of the subjectAltName extension names are excluded for\n       that name type.\n    7. The other steps in the algorithm for basic path processing involve\n       handling the policy extension which is not presently supported in this\n       implementation. Instead, if a critical policy extension is found, the\n       certificate is rejected as not supported.\n    8. If the certificate is not the first or if its the only certificate in\n       the chain (having no parent from the CA store or is self-signed) and it\n       has a critical key usage extension, verify that the keyCertSign bit is\n       set. If the key usage extension exists, verify that the basic\n       constraints extension exists. If the basic constraints extension exists,\n       verify that the cA flag is set. If pathLenConstraint is set, ensure that\n       the number of certificates that precede in the chain (come earlier\n       in the chain as implemented below), excluding the very first in the\n       chain (typically the end-entity one), isn't greater than the\n       pathLenConstraint. This constraint limits the number of intermediate\n       CAs that may appear below a CA before only end-entity certificates\n       may be issued. */\n\n  // if a verify callback is passed as the third parameter, package it within\n  // the options object. This is to support a legacy function signature that\n  // expected the verify callback as the third parameter.\n  if(typeof options === 'function') {\n    options = {verify: options};\n  }\n  options = options || {};\n\n  // copy cert chain references to another array to protect against changes\n  // in verify callback\n  chain = chain.slice(0);\n  var certs = chain.slice(0);\n\n  var validityCheckDate = options.validityCheckDate;\n  // if no validityCheckDate is specified, default to the current date. Make\n  // sure to maintain the value null because it indicates that the validity\n  // period should not be checked.\n  if(typeof validityCheckDate === 'undefined') {\n    validityCheckDate = new Date();\n  }\n\n  // verify each cert in the chain using its parent, where the parent\n  // is either the next in the chain or from the CA store\n  var first = true;\n  var error = null;\n  var depth = 0;\n  do {\n    var cert = chain.shift();\n    var parent = null;\n    var selfSigned = false;\n\n    if(validityCheckDate) {\n      // 1. check valid time\n      if(validityCheckDate < cert.validity.notBefore ||\n         validityCheckDate > cert.validity.notAfter) {\n        error = {\n          message: 'Certificate is not valid yet or has expired.',\n          error: pki.certificateError.certificate_expired,\n          notBefore: cert.validity.notBefore,\n          notAfter: cert.validity.notAfter,\n          // TODO: we might want to reconsider renaming 'now' to\n          // 'validityCheckDate' should this API be changed in the future.\n          now: validityCheckDate\n        };\n      }\n    }\n\n    // 2. verify with parent from chain or CA store\n    if(error === null) {\n      parent = chain[0] || caStore.getIssuer(cert);\n      if(parent === null) {\n        // check for self-signed cert\n        if(cert.isIssuer(cert)) {\n          selfSigned = true;\n          parent = cert;\n        }\n      }\n\n      if(parent) {\n        // FIXME: current CA store implementation might have multiple\n        // certificates where the issuer can't be determined from the\n        // certificate (happens rarely with, eg: old certificates) so normalize\n        // by always putting parents into an array\n        // TODO: there's may be an extreme degenerate case currently uncovered\n        // where an old intermediate certificate seems to have a matching parent\n        // but none of the parents actually verify ... but the intermediate\n        // is in the CA and it should pass this check; needs investigation\n        var parents = parent;\n        if(!forge.util.isArray(parents)) {\n          parents = [parents];\n        }\n\n        // try to verify with each possible parent (typically only one)\n        var verified = false;\n        while(!verified && parents.length > 0) {\n          parent = parents.shift();\n          try {\n            verified = parent.verify(cert);\n          } catch(ex) {\n            // failure to verify, don't care why, try next one\n          }\n        }\n\n        if(!verified) {\n          error = {\n            message: 'Certificate signature is invalid.',\n            error: pki.certificateError.bad_certificate\n          };\n        }\n      }\n\n      if(error === null && (!parent || selfSigned) &&\n        !caStore.hasCertificate(cert)) {\n        // no parent issuer and certificate itself is not trusted\n        error = {\n          message: 'Certificate is not trusted.',\n          error: pki.certificateError.unknown_ca\n        };\n      }\n    }\n\n    // TODO: 3. check revoked\n\n    // 4. check for matching issuer/subject\n    if(error === null && parent && !cert.isIssuer(parent)) {\n      // parent is not issuer\n      error = {\n        message: 'Certificate issuer is invalid.',\n        error: pki.certificateError.bad_certificate\n      };\n    }\n\n    // 5. TODO: check names with permitted names tree\n\n    // 6. TODO: check names against excluded names tree\n\n    // 7. check for unsupported critical extensions\n    if(error === null) {\n      // supported extensions\n      var se = {\n        keyUsage: true,\n        basicConstraints: true\n      };\n      for(var i = 0; error === null && i < cert.extensions.length; ++i) {\n        var ext = cert.extensions[i];\n        if(ext.critical && !(ext.name in se)) {\n          error = {\n            message:\n              'Certificate has an unsupported critical extension.',\n            error: pki.certificateError.unsupported_certificate\n          };\n        }\n      }\n    }\n\n    // 8. check for CA if cert is not first or is the only certificate\n    // remaining in chain with no parent or is self-signed\n    if(error === null &&\n      (!first || (chain.length === 0 && (!parent || selfSigned)))) {\n      // first check keyUsage extension and then basic constraints\n      var bcExt = cert.getExtension('basicConstraints');\n      var keyUsageExt = cert.getExtension('keyUsage');\n      if(keyUsageExt !== null) {\n        // keyCertSign must be true and there must be a basic\n        // constraints extension\n        if(!keyUsageExt.keyCertSign || bcExt === null) {\n          // bad certificate\n          error = {\n            message:\n              'Certificate keyUsage or basicConstraints conflict ' +\n              'or indicate that the certificate is not a CA. ' +\n              'If the certificate is the only one in the chain or ' +\n              'isn\\'t the first then the certificate must be a ' +\n              'valid CA.',\n            error: pki.certificateError.bad_certificate\n          };\n        }\n      }\n      // basic constraints cA flag must be set\n      if(error === null && bcExt !== null && !bcExt.cA) {\n        // bad certificate\n        error = {\n          message:\n            'Certificate basicConstraints indicates the certificate ' +\n            'is not a CA.',\n          error: pki.certificateError.bad_certificate\n        };\n      }\n      // if error is not null and keyUsage is available, then we know it\n      // has keyCertSign and there is a basic constraints extension too,\n      // which means we can check pathLenConstraint (if it exists)\n      if(error === null && keyUsageExt !== null &&\n        'pathLenConstraint' in bcExt) {\n        // pathLen is the maximum # of intermediate CA certs that can be\n        // found between the current certificate and the end-entity (depth 0)\n        // certificate; this number does not include the end-entity (depth 0,\n        // last in the chain) even if it happens to be a CA certificate itself\n        var pathLen = depth - 1;\n        if(pathLen > bcExt.pathLenConstraint) {\n          // pathLenConstraint violated, bad certificate\n          error = {\n            message:\n              'Certificate basicConstraints pathLenConstraint violated.',\n            error: pki.certificateError.bad_certificate\n          };\n        }\n      }\n    }\n\n    // call application callback\n    var vfd = (error === null) ? true : error.error;\n    var ret = options.verify ? options.verify(vfd, depth, certs) : vfd;\n    if(ret === true) {\n      // clear any set error\n      error = null;\n    } else {\n      // if passed basic tests, set default message and alert\n      if(vfd === true) {\n        error = {\n          message: 'The application rejected the certificate.',\n          error: pki.certificateError.bad_certificate\n        };\n      }\n\n      // check for custom error info\n      if(ret || ret === 0) {\n        // set custom message and error\n        if(typeof ret === 'object' && !forge.util.isArray(ret)) {\n          if(ret.message) {\n            error.message = ret.message;\n          }\n          if(ret.error) {\n            error.error = ret.error;\n          }\n        } else if(typeof ret === 'string') {\n          // set custom error\n          error.error = ret;\n        }\n      }\n\n      // throw error\n      throw error;\n    }\n\n    // no longer first cert in chain\n    first = false;\n    ++depth;\n  } while(chain.length > 0);\n\n  return true;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTguanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbm9kZS1mb3JnZS9saWIveDUwOS5qcz81MWU4Il0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogSmF2YXNjcmlwdCBpbXBsZW1lbnRhdGlvbiBvZiBYLjUwOSBhbmQgcmVsYXRlZCBjb21wb25lbnRzIChzdWNoIGFzXG4gKiBDZXJ0aWZpY2F0aW9uIFNpZ25pbmcgUmVxdWVzdHMpIG9mIGEgUHVibGljIEtleSBJbmZyYXN0cnVjdHVyZS5cbiAqXG4gKiBAYXV0aG9yIERhdmUgTG9uZ2xleVxuICpcbiAqIENvcHlyaWdodCAoYykgMjAxMC0yMDE0IERpZ2l0YWwgQmF6YWFyLCBJbmMuXG4gKlxuICogVGhlIEFTTi4xIHJlcHJlc2VudGF0aW9uIG9mIGFuIFguNTA5djMgY2VydGlmaWNhdGUgaXMgYXMgZm9sbG93c1xuICogKHNlZSBSRkMgMjQ1OSk6XG4gKlxuICogQ2VydGlmaWNhdGUgOjo9IFNFUVVFTkNFIHtcbiAqICAgdGJzQ2VydGlmaWNhdGUgICAgICAgVEJTQ2VydGlmaWNhdGUsXG4gKiAgIHNpZ25hdHVyZUFsZ29yaXRobSAgIEFsZ29yaXRobUlkZW50aWZpZXIsXG4gKiAgIHNpZ25hdHVyZVZhbHVlICAgICAgIEJJVCBTVFJJTkdcbiAqIH1cbiAqXG4gKiBUQlNDZXJ0aWZpY2F0ZSA6Oj0gU0VRVUVOQ0Uge1xuICogICB2ZXJzaW9uICAgICAgICAgWzBdICBFWFBMSUNJVCBWZXJzaW9uIERFRkFVTFQgdjEsXG4gKiAgIHNlcmlhbE51bWJlciAgICAgICAgIENlcnRpZmljYXRlU2VyaWFsTnVtYmVyLFxuICogICBzaWduYXR1cmUgICAgICAgICAgICBBbGdvcml0aG1JZGVudGlmaWVyLFxuICogICBpc3N1ZXIgICAgICAgICAgICAgICBOYW1lLFxuICogICB2YWxpZGl0eSAgICAgICAgICAgICBWYWxpZGl0eSxcbiAqICAgc3ViamVjdCAgICAgICAgICAgICAgTmFtZSxcbiAqICAgc3ViamVjdFB1YmxpY0tleUluZm8gU3ViamVjdFB1YmxpY0tleUluZm8sXG4gKiAgIGlzc3VlclVuaXF1ZUlEICBbMV0gIElNUExJQ0lUIFVuaXF1ZUlkZW50aWZpZXIgT1BUSU9OQUwsXG4gKiAgICAgICAgICAgICAgICAgICAgICAgIC0tIElmIHByZXNlbnQsIHZlcnNpb24gc2hhbGwgYmUgdjIgb3IgdjNcbiAqICAgc3ViamVjdFVuaXF1ZUlEIFsyXSAgSU1QTElDSVQgVW5pcXVlSWRlbnRpZmllciBPUFRJT05BTCxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgLS0gSWYgcHJlc2VudCwgdmVyc2lvbiBzaGFsbCBiZSB2MiBvciB2M1xuICogICBleHRlbnNpb25zICAgICAgWzNdICBFWFBMSUNJVCBFeHRlbnNpb25zIE9QVElPTkFMXG4gKiAgICAgICAgICAgICAgICAgICAgICAgIC0tIElmIHByZXNlbnQsIHZlcnNpb24gc2hhbGwgYmUgdjNcbiAqIH1cbiAqXG4gKiBWZXJzaW9uIDo6PSBJTlRFR0VSICB7IHYxKDApLCB2MigxKSwgdjMoMikgfVxuICpcbiAqIENlcnRpZmljYXRlU2VyaWFsTnVtYmVyIDo6PSBJTlRFR0VSXG4gKlxuICogTmFtZSA6Oj0gQ0hPSUNFIHtcbiAqICAgLy8gb25seSBvbmUgcG9zc2libGUgY2hvaWNlIGZvciBub3dcbiAqICAgUkROU2VxdWVuY2VcbiAqIH1cbiAqXG4gKiBSRE5TZXF1ZW5jZSA6Oj0gU0VRVUVOQ0UgT0YgUmVsYXRpdmVEaXN0aW5ndWlzaGVkTmFtZVxuICpcbiAqIFJlbGF0aXZlRGlzdGluZ3Vpc2hlZE5hbWUgOjo9IFNFVCBPRiBBdHRyaWJ1dGVUeXBlQW5kVmFsdWVcbiAqXG4gKiBBdHRyaWJ1dGVUeXBlQW5kVmFsdWUgOjo9IFNFUVVFTkNFIHtcbiAqICAgdHlwZSAgICAgQXR0cmlidXRlVHlwZSxcbiAqICAgdmFsdWUgICAgQXR0cmlidXRlVmFsdWVcbiAqIH1cbiAqIEF0dHJpYnV0ZVR5cGUgOjo9IE9CSkVDVCBJREVOVElGSUVSXG4gKiBBdHRyaWJ1dGVWYWx1ZSA6Oj0gQU5ZIERFRklORUQgQlkgQXR0cmlidXRlVHlwZVxuICpcbiAqIFZhbGlkaXR5IDo6PSBTRVFVRU5DRSB7XG4gKiAgIG5vdEJlZm9yZSAgICAgIFRpbWUsXG4gKiAgIG5vdEFmdGVyICAgICAgIFRpbWVcbiAqIH1cbiAqXG4gKiBUaW1lIDo6PSBDSE9JQ0Uge1xuICogICB1dGNUaW1lICAgICAgICBVVENUaW1lLFxuICogICBnZW5lcmFsVGltZSAgICBHZW5lcmFsaXplZFRpbWVcbiAqIH1cbiAqXG4gKiBVbmlxdWVJZGVudGlmaWVyIDo6PSBCSVQgU1RSSU5HXG4gKlxuICogU3ViamVjdFB1YmxpY0tleUluZm8gOjo9IFNFUVVFTkNFIHtcbiAqICAgYWxnb3JpdGhtICAgICAgICAgICAgQWxnb3JpdGhtSWRlbnRpZmllcixcbiAqICAgc3ViamVjdFB1YmxpY0tleSAgICAgQklUIFNUUklOR1xuICogfVxuICpcbiAqIEV4dGVuc2lvbnMgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLk1BWCkgT0YgRXh0ZW5zaW9uXG4gKlxuICogRXh0ZW5zaW9uIDo6PSBTRVFVRU5DRSB7XG4gKiAgIGV4dG5JRCAgICAgIE9CSkVDVCBJREVOVElGSUVSLFxuICogICBjcml0aWNhbCAgICBCT09MRUFOIERFRkFVTFQgRkFMU0UsXG4gKiAgIGV4dG5WYWx1ZSAgIE9DVEVUIFNUUklOR1xuICogfVxuICpcbiAqIFRoZSBvbmx5IGtleSBhbGdvcml0aG0gY3VycmVudGx5IHN1cHBvcnRlZCBmb3IgUEtJIGlzIFJTQS5cbiAqXG4gKiBSU0FTU0EtUFNTIHNpZ25hdHVyZXMgYXJlIGRlc2NyaWJlZCBpbiBSRkMgMzQ0NyBhbmQgUkZDIDQwNTUuXG4gKlxuICogUEtDUyMxMCB2MS43IGRlc2NyaWJlcyBjZXJ0aWZpY2F0ZSBzaWduaW5nIHJlcXVlc3RzOlxuICpcbiAqIENlcnRpZmljYXRpb25SZXF1ZXN0SW5mbzpcbiAqXG4gKiBDZXJ0aWZpY2F0aW9uUmVxdWVzdEluZm8gOjo9IFNFUVVFTkNFIHtcbiAqICAgdmVyc2lvbiAgICAgICBJTlRFR0VSIHsgdjEoMCkgfSAodjEsLi4uKSxcbiAqICAgc3ViamVjdCAgICAgICBOYW1lLFxuICogICBzdWJqZWN0UEtJbmZvIFN1YmplY3RQdWJsaWNLZXlJbmZve3sgUEtJbmZvQWxnb3JpdGhtcyB9fSxcbiAqICAgYXR0cmlidXRlcyAgICBbMF0gQXR0cmlidXRlc3t7IENSSUF0dHJpYnV0ZXMgfX1cbiAqIH1cbiAqXG4gKiBBdHRyaWJ1dGVzIHsgQVRUUklCVVRFOklPU2V0IH0gOjo9IFNFVCBPRiBBdHRyaWJ1dGV7eyBJT1NldCB9fVxuICpcbiAqIENSSUF0dHJpYnV0ZXMgIEFUVFJJQlVURSAgOjo9IHtcbiAqICAgLi4uIC0tIGFkZCBhbnkgbG9jYWxseSBkZWZpbmVkIGF0dHJpYnV0ZXMgaGVyZSAtLSB9XG4gKlxuICogQXR0cmlidXRlIHsgQVRUUklCVVRFOklPU2V0IH0gOjo9IFNFUVVFTkNFIHtcbiAqICAgdHlwZSAgIEFUVFJJQlVURS4maWQoe0lPU2V0fSksXG4gKiAgIHZhbHVlcyBTRVQgU0laRSgxLi5NQVgpIE9GIEFUVFJJQlVURS4mVHlwZSh7SU9TZXR9e0B0eXBlfSlcbiAqIH1cbiAqXG4gKiBDZXJ0aWZpY2F0aW9uUmVxdWVzdCA6Oj0gU0VRVUVOQ0Uge1xuICogICBjZXJ0aWZpY2F0aW9uUmVxdWVzdEluZm8gQ2VydGlmaWNhdGlvblJlcXVlc3RJbmZvLFxuICogICBzaWduYXR1cmVBbGdvcml0aG0gQWxnb3JpdGhtSWRlbnRpZmllcnt7IFNpZ25hdHVyZUFsZ29yaXRobXMgfX0sXG4gKiAgIHNpZ25hdHVyZSAgICAgICAgICBCSVQgU1RSSU5HXG4gKiB9XG4gKi9cbnZhciBmb3JnZSA9IHJlcXVpcmUoJy4vZm9yZ2UnKTtcbnJlcXVpcmUoJy4vYWVzJyk7XG5yZXF1aXJlKCcuL2FzbjEnKTtcbnJlcXVpcmUoJy4vZGVzJyk7XG5yZXF1aXJlKCcuL21kJyk7XG5yZXF1aXJlKCcuL21nZicpO1xucmVxdWlyZSgnLi9vaWRzJyk7XG5yZXF1aXJlKCcuL3BlbScpO1xucmVxdWlyZSgnLi9wc3MnKTtcbnJlcXVpcmUoJy4vcnNhJyk7XG5yZXF1aXJlKCcuL3V0aWwnKTtcblxuLy8gc2hvcnRjdXQgZm9yIGFzbi4xIEFQSVxudmFyIGFzbjEgPSBmb3JnZS5hc24xO1xuXG4vKiBQdWJsaWMgS2V5IEluZnJhc3RydWN0dXJlIChQS0kpIGltcGxlbWVudGF0aW9uLiAqL1xudmFyIHBraSA9IG1vZHVsZS5leHBvcnRzID0gZm9yZ2UucGtpID0gZm9yZ2UucGtpIHx8IHt9O1xudmFyIG9pZHMgPSBwa2kub2lkcztcblxuLy8gc2hvcnQgbmFtZSBPSUQgbWFwcGluZ3NcbnZhciBfc2hvcnROYW1lcyA9IHt9O1xuX3Nob3J0TmFtZXNbJ0NOJ10gPSBvaWRzWydjb21tb25OYW1lJ107XG5fc2hvcnROYW1lc1snY29tbW9uTmFtZSddID0gJ0NOJztcbl9zaG9ydE5hbWVzWydDJ10gPSBvaWRzWydjb3VudHJ5TmFtZSddO1xuX3Nob3J0TmFtZXNbJ2NvdW50cnlOYW1lJ10gPSAnQyc7XG5fc2hvcnROYW1lc1snTCddID0gb2lkc1snbG9jYWxpdHlOYW1lJ107XG5fc2hvcnROYW1lc1snbG9jYWxpdHlOYW1lJ10gPSAnTCc7XG5fc2hvcnROYW1lc1snU1QnXSA9IG9pZHNbJ3N0YXRlT3JQcm92aW5jZU5hbWUnXTtcbl9zaG9ydE5hbWVzWydzdGF0ZU9yUHJvdmluY2VOYW1lJ10gPSAnU1QnO1xuX3Nob3J0TmFtZXNbJ08nXSA9IG9pZHNbJ29yZ2FuaXphdGlvbk5hbWUnXTtcbl9zaG9ydE5hbWVzWydvcmdhbml6YXRpb25OYW1lJ10gPSAnTyc7XG5fc2hvcnROYW1lc1snT1UnXSA9IG9pZHNbJ29yZ2FuaXphdGlvbmFsVW5pdE5hbWUnXTtcbl9zaG9ydE5hbWVzWydvcmdhbml6YXRpb25hbFVuaXROYW1lJ10gPSAnT1UnO1xuX3Nob3J0TmFtZXNbJ0UnXSA9IG9pZHNbJ2VtYWlsQWRkcmVzcyddO1xuX3Nob3J0TmFtZXNbJ2VtYWlsQWRkcmVzcyddID0gJ0UnO1xuXG4vLyB2YWxpZGF0b3IgZm9yIGFuIFN1YmplY3RQdWJsaWNLZXlJbmZvIHN0cnVjdHVyZVxuLy8gTm90ZTogQ3VycmVudGx5IG9ubHkgd29ya3Mgd2l0aCBhbiBSU0EgcHVibGljIGtleVxudmFyIHB1YmxpY0tleVZhbGlkYXRvciA9IGZvcmdlLnBraS5yc2EucHVibGljS2V5VmFsaWRhdG9yO1xuXG4vLyB2YWxpZGF0b3IgZm9yIGFuIFguNTA5djMgY2VydGlmaWNhdGVcbnZhciB4NTA5Q2VydGlmaWNhdGVWYWxpZGF0b3IgPSB7XG4gIG5hbWU6ICdDZXJ0aWZpY2F0ZScsXG4gIHRhZ0NsYXNzOiBhc24xLkNsYXNzLlVOSVZFUlNBTCxcbiAgdHlwZTogYXNuMS5UeXBlLlNFUVVFTkNFLFxuICBjb25zdHJ1Y3RlZDogdHJ1ZSxcbiAgdmFsdWU6IFt7XG4gICAgbmFtZTogJ0NlcnRpZmljYXRlLlRCU0NlcnRpZmljYXRlJyxcbiAgICB0YWdDbGFzczogYXNuMS5DbGFzcy5VTklWRVJTQUwsXG4gICAgdHlwZTogYXNuMS5UeXBlLlNFUVVFTkNFLFxuICAgIGNvbnN0cnVjdGVkOiB0cnVlLFxuICAgIGNhcHR1cmVBc24xOiAndGJzQ2VydGlmaWNhdGUnLFxuICAgIHZhbHVlOiBbe1xuICAgICAgbmFtZTogJ0NlcnRpZmljYXRlLlRCU0NlcnRpZmljYXRlLnZlcnNpb24nLFxuICAgICAgdGFnQ2xhc3M6IGFzbjEuQ2xhc3MuQ09OVEVYVF9TUEVDSUZJQyxcbiAgICAgIHR5cGU6IDAsXG4gICAgICBjb25zdHJ1Y3RlZDogdHJ1ZSxcbiAgICAgIG9wdGlvbmFsOiB0cnVlLFxuICAgICAgdmFsdWU6IFt7XG4gICAgICAgIG5hbWU6ICdDZXJ0aWZpY2F0ZS5UQlNDZXJ0aWZpY2F0ZS52ZXJzaW9uLmludGVnZXInLFxuICAgICAgICB0YWdDbGFzczogYXNuMS5DbGFzcy5VTklWRVJTQUwsXG4gICAgICAgIHR5cGU6IGFzbjEuVHlwZS5JTlRFR0VSLFxuICAgICAgICBjb25zdHJ1Y3RlZDogZmFsc2UsXG4gICAgICAgIGNhcHR1cmU6ICdjZXJ0VmVyc2lvbidcbiAgICAgIH1dXG4gICAgfSwge1xuICAgICAgbmFtZTogJ0NlcnRpZmljYXRlLlRCU0NlcnRpZmljYXRlLnNlcmlhbE51bWJlcicsXG4gICAgICB0YWdDbGFzczogYXNuMS5DbGFzcy5VTklWRVJTQUwsXG4gICAgICB0eXBlOiBhc24xLlR5cGUuSU5URUdFUixcbiAgICAgIGNvbnN0cnVjdGVkOiBmYWxzZSxcbiAgICAgIGNhcHR1cmU6ICdjZXJ0U2VyaWFsTnVtYmVyJ1xuICAgIH0sIHtcbiAgICAgIG5hbWU6ICdDZXJ0aWZpY2F0ZS5UQlNDZXJ0aWZpY2F0ZS5zaWduYXR1cmUnLFxuICAgICAgdGFnQ2xhc3M6IGFzbjEuQ2xhc3MuVU5JVkVSU0FMLFxuICAgICAgdHlwZTogYXNuMS5UeXBlLlNFUVVFTkNFLFxuICAgICAgY29uc3RydWN0ZWQ6IHRydWUsXG4gICAgICB2YWx1ZTogW3tcbiAgICAgICAgbmFtZTogJ0NlcnRpZmljYXRlLlRCU0NlcnRpZmljYXRlLnNpZ25hdHVyZS5hbGdvcml0aG0nLFxuICAgICAgICB0YWdDbGFzczogYXNuMS5DbGFzcy5VTklWRVJTQUwsXG4gICAgICAgIHR5cGU6IGFzbjEuVHlwZS5PSUQsXG4gICAgICAgIGNvbnN0cnVjdGVkOiBmYWxzZSxcbiAgICAgICAgY2FwdHVyZTogJ2NlcnRpbmZvU2lnbmF0dXJlT2lkJ1xuICAgICAgfSwge1xuICAgICAgICBuYW1lOiAnQ2VydGlmaWNhdGUuVEJTQ2VydGlmaWNhdGUuc2lnbmF0dXJlLnBhcmFtZXRlcnMnLFxuICAgICAgICB0YWdDbGFzczogYXNuMS5DbGFzcy5VTklWRVJTQUwsXG4gICAgICAgIG9wdGlvbmFsOiB0cnVlLFxuICAgICAgICBjYXB0dXJlQXNuMTogJ2NlcnRpbmZvU2lnbmF0dXJlUGFyYW1zJ1xuICAgICAgfV1cbiAgICB9LCB7XG4gICAgICBuYW1lOiAnQ2VydGlmaWNhdGUuVEJTQ2VydGlmaWNhdGUuaXNzdWVyJyxcbiAgICAgIHRhZ0NsYXNzOiBhc24xLkNsYXNzLlVOSVZFUlNBTCxcbiAgICAgIHR5cGU6IGFzbjEuVHlwZS5TRVFVRU5DRSxcbiAgICAgIGNvbnN0cnVjdGVkOiB0cnVlLFxuICAgICAgY2FwdHVyZUFzbjE6ICdjZXJ0SXNzdWVyJ1xuICAgIH0sIHtcbiAgICAgIG5hbWU6ICdDZXJ0aWZpY2F0ZS5UQlNDZXJ0aWZpY2F0ZS52YWxpZGl0eScsXG4gICAgICB0YWdDbGFzczogYXNuMS5DbGFzcy5VTklWRVJTQUwsXG4gICAgICB0eXBlOiBhc24xLlR5cGUuU0VRVUVOQ0UsXG4gICAgICBjb25zdHJ1Y3RlZDogdHJ1ZSxcbiAgICAgIC8vIE5vdGU6IFVUQyBhbmQgZ2VuZXJhbGl6ZWQgdGltZXMgbWF5IGJvdGggYXBwZWFyIHNvIHRoZSBjYXB0dXJlXG4gICAgICAvLyBuYW1lcyBhcmUgYmFzZWQgb24gdGhlaXIgZGV0ZWN0ZWQgb3JkZXIsIHRoZSBuYW1lcyB1c2VkIGJlbG93XG4gICAgICAvLyBhcmUgb25seSBmb3IgdGhlIGNvbW1vbiBjYXNlLCB3aGljaCB2YWxpZGl0eSB0aW1lIHJlYWxseSBtZWFuc1xuICAgICAgLy8gXCJub3RCZWZvcmVcIiBhbmQgd2hpY2ggbWVhbnMgXCJub3RBZnRlclwiIHdpbGwgYmUgZGV0ZXJtaW5lZCBieSBvcmRlclxuICAgICAgdmFsdWU6IFt7XG4gICAgICAgIC8vIG5vdEJlZm9yZSAoVGltZSkgKFVUQyB0aW1lIGNhc2UpXG4gICAgICAgIG5hbWU6ICdDZXJ0aWZpY2F0ZS5UQlNDZXJ0aWZpY2F0ZS52YWxpZGl0eS5ub3RCZWZvcmUgKHV0YyknLFxuICAgICAgICB0YWdDbGFzczogYXNuMS5DbGFzcy5VTklWRVJTQUwsXG4gICAgICAgIHR5cGU6IGFzbjEuVHlwZS5VVENUSU1FLFxuICAgICAgICBjb25zdHJ1Y3RlZDogZmFsc2UsXG4gICAgICAgIG9wdGlvbmFsOiB0cnVlLFxuICAgICAgICBjYXB0dXJlOiAnY2VydFZhbGlkaXR5MVVUQ1RpbWUnXG4gICAgICB9LCB7XG4gICAgICAgIC8vIG5vdEJlZm9yZSAoVGltZSkgKGdlbmVyYWxpemVkIHRpbWUgY2FzZSlcbiAgICAgICAgbmFtZTogJ0NlcnRpZmljYXRlLlRCU0NlcnRpZmljYXRlLnZhbGlkaXR5Lm5vdEJlZm9yZSAoZ2VuZXJhbGl6ZWQpJyxcbiAgICAgICAgdGFnQ2xhc3M6IGFzbjEuQ2xhc3MuVU5JVkVSU0FMLFxuICAgICAgICB0eXBlOiBhc24xLlR5cGUuR0VORVJBTElaRURUSU1FLFxuICAgICAgICBjb25zdHJ1Y3RlZDogZmFsc2UsXG4gICAgICAgIG9wdGlvbmFsOiB0cnVlLFxuICAgICAgICBjYXB0dXJlOiAnY2VydFZhbGlkaXR5MkdlbmVyYWxpemVkVGltZSdcbiAgICAgIH0sIHtcbiAgICAgICAgLy8gbm90QWZ0ZXIgKFRpbWUpIChvbmx5IFVUQyB0aW1lIGlzIHN1cHBvcnRlZClcbiAgICAgICAgbmFtZTogJ0NlcnRpZmljYXRlLlRCU0NlcnRpZmljYXRlLnZhbGlkaXR5Lm5vdEFmdGVyICh1dGMpJyxcbiAgICAgICAgdGFnQ2xhc3M6IGFzbjEuQ2xhc3MuVU5JVkVSU0FMLFxuICAgICAgICB0eXBlOiBhc24xLlR5cGUuVVRDVElNRSxcbiAgICAgICAgY29uc3RydWN0ZWQ6IGZhbHNlLFxuICAgICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICAgICAgY2FwdHVyZTogJ2NlcnRWYWxpZGl0eTNVVENUaW1lJ1xuICAgICAgfSwge1xuICAgICAgICAvLyBub3RBZnRlciAoVGltZSkgKG9ubHkgVVRDIHRpbWUgaXMgc3VwcG9ydGVkKVxuICAgICAgICBuYW1lOiAnQ2VydGlmaWNhdGUuVEJTQ2VydGlmaWNhdGUudmFsaWRpdHkubm90QWZ0ZXIgKGdlbmVyYWxpemVkKScsXG4gICAgICAgIHRhZ0NsYXNzOiBhc24xLkNsYXNzLlVOSVZFUlNBTCxcbiAgICAgICAgdHlwZTogYXNuMS5UeXBlLkdFTkVSQUxJWkVEVElNRSxcbiAgICAgICAgY29uc3RydWN0ZWQ6IGZhbHNlLFxuICAgICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICAgICAgY2FwdHVyZTogJ2NlcnRWYWxpZGl0eTRHZW5lcmFsaXplZFRpbWUnXG4gICAgICB9XVxuICAgIH0sIHtcbiAgICAgIC8vIE5hbWUgKHN1YmplY3QpIChSRE5TZXF1ZW5jZSlcbiAgICAgIG5hbWU6ICdDZXJ0aWZpY2F0ZS5UQlNDZXJ0aWZpY2F0ZS5zdWJqZWN0JyxcbiAgICAgIHRhZ0NsYXNzOiBhc24xLkNsYXNzLlVOSVZFUlNBTCxcbiAgICAgIHR5cGU6IGFzbjEuVHlwZS5TRVFVRU5DRSxcbiAgICAgIGNvbnN0cnVjdGVkOiB0cnVlLFxuICAgICAgY2FwdHVyZUFzbjE6ICdjZXJ0U3ViamVjdCdcbiAgICB9LFxuICAgIC8vIFN1YmplY3RQdWJsaWNLZXlJbmZvXG4gICAgcHVibGljS2V5VmFsaWRhdG9yLFxuICAgIHtcbiAgICAgIC8vIGlzc3VlclVuaXF1ZUlEIChvcHRpb25hbClcbiAgICAgIG5hbWU6ICdDZXJ0aWZpY2F0ZS5UQlNDZXJ0aWZpY2F0ZS5pc3N1ZXJVbmlxdWVJRCcsXG4gICAgICB0YWdDbGFzczogYXNuMS5DbGFzcy5DT05URVhUX1NQRUNJRklDLFxuICAgICAgdHlwZTogMSxcbiAgICAgIGNvbnN0cnVjdGVkOiB0cnVlLFxuICAgICAgb3B0aW9uYWw6IHRydWUsXG4gICAgICB2YWx1ZTogW3tcbiAgICAgICAgbmFtZTogJ0NlcnRpZmljYXRlLlRCU0NlcnRpZmljYXRlLmlzc3VlclVuaXF1ZUlELmlkJyxcbiAgICAgICAgdGFnQ2xhc3M6IGFzbjEuQ2xhc3MuVU5JVkVSU0FMLFxuICAgICAgICB0eXBlOiBhc24xLlR5cGUuQklUU1RSSU5HLFxuICAgICAgICBjb25zdHJ1Y3RlZDogZmFsc2UsXG4gICAgICAgIC8vIFRPRE86IHN1cHBvcnQgYXJiaXRyYXJ5IGJpdCBsZW5ndGggaWRzXG4gICAgICAgIGNhcHR1cmVCaXRTdHJpbmdWYWx1ZTogJ2NlcnRJc3N1ZXJVbmlxdWVJZCdcbiAgICAgIH1dXG4gICAgfSwge1xuICAgICAgLy8gc3ViamVjdFVuaXF1ZUlEIChvcHRpb25hbClcbiAgICAgIG5hbWU6ICdDZXJ0aWZpY2F0ZS5UQlNDZXJ0aWZpY2F0ZS5zdWJqZWN0VW5pcXVlSUQnLFxuICAgICAgdGFnQ2xhc3M6IGFzbjEuQ2xhc3MuQ09OVEVYVF9TUEVDSUZJQyxcbiAgICAgIHR5cGU6IDIsXG4gICAgICBjb25zdHJ1Y3RlZDogdHJ1ZSxcbiAgICAgIG9wdGlvbmFsOiB0cnVlLFxuICAgICAgdmFsdWU6IFt7XG4gICAgICAgIG5hbWU6ICdDZXJ0aWZpY2F0ZS5UQlNDZXJ0aWZpY2F0ZS5zdWJqZWN0VW5pcXVlSUQuaWQnLFxuICAgICAgICB0YWdDbGFzczogYXNuMS5DbGFzcy5VTklWRVJTQUwsXG4gICAgICAgIHR5cGU6IGFzbjEuVHlwZS5CSVRTVFJJTkcsXG4gICAgICAgIGNvbnN0cnVjdGVkOiBmYWxzZSxcbiAgICAgICAgLy8gVE9ETzogc3VwcG9ydCBhcmJpdHJhcnkgYml0IGxlbmd0aCBpZHNcbiAgICAgICAgY2FwdHVyZUJpdFN0cmluZ1ZhbHVlOiAnY2VydFN1YmplY3RVbmlxdWVJZCdcbiAgICAgIH1dXG4gICAgfSwge1xuICAgICAgLy8gRXh0ZW5zaW9ucyAob3B0aW9uYWwpXG4gICAgICBuYW1lOiAnQ2VydGlmaWNhdGUuVEJTQ2VydGlmaWNhdGUuZXh0ZW5zaW9ucycsXG4gICAgICB0YWdDbGFzczogYXNuMS5DbGFzcy5DT05URVhUX1NQRUNJRklDLFxuICAgICAgdHlwZTogMyxcbiAgICAgIGNvbnN0cnVjdGVkOiB0cnVlLFxuICAgICAgY2FwdHVyZUFzbjE6ICdjZXJ0RXh0ZW5zaW9ucycsXG4gICAgICBvcHRpb25hbDogdHJ1ZVxuICAgIH1dXG4gIH0sIHtcbiAgICAvLyBBbGdvcml0aG1JZGVudGlmaWVyIChzaWduYXR1cmUgYWxnb3JpdGhtKVxuICAgIG5hbWU6ICdDZXJ0aWZpY2F0ZS5zaWduYXR1cmVBbGdvcml0aG0nLFxuICAgIHRhZ0NsYXNzOiBhc24xLkNsYXNzLlVOSVZFUlNBTCxcbiAgICB0eXBlOiBhc24xLlR5cGUuU0VRVUVOQ0UsXG4gICAgY29uc3RydWN0ZWQ6IHRydWUsXG4gICAgdmFsdWU6IFt7XG4gICAgICAvLyBhbGdvcml0aG1cbiAgICAgIG5hbWU6ICdDZXJ0aWZpY2F0ZS5zaWduYXR1cmVBbGdvcml0aG0uYWxnb3JpdGhtJyxcbiAgICAgIHRhZ0NsYXNzOiBhc24xLkNsYXNzLlVOSVZFUlNBTCxcbiAgICAgIHR5cGU6IGFzbjEuVHlwZS5PSUQsXG4gICAgICBjb25zdHJ1Y3RlZDogZmFsc2UsXG4gICAgICBjYXB0dXJlOiAnY2VydFNpZ25hdHVyZU9pZCdcbiAgICB9LCB7XG4gICAgICBuYW1lOiAnQ2VydGlmaWNhdGUuVEJTQ2VydGlmaWNhdGUuc2lnbmF0dXJlLnBhcmFtZXRlcnMnLFxuICAgICAgdGFnQ2xhc3M6IGFzbjEuQ2xhc3MuVU5JVkVSU0FMLFxuICAgICAgb3B0aW9uYWw6IHRydWUsXG4gICAgICBjYXB0dXJlQXNuMTogJ2NlcnRTaWduYXR1cmVQYXJhbXMnXG4gICAgfV1cbiAgfSwge1xuICAgIC8vIFNpZ25hdHVyZVZhbHVlXG4gICAgbmFtZTogJ0NlcnRpZmljYXRlLnNpZ25hdHVyZVZhbHVlJyxcbiAgICB0YWdDbGFzczogYXNuMS5DbGFzcy5VTklWRVJTQUwsXG4gICAgdHlwZTogYXNuMS5UeXBlLkJJVFNUUklORyxcbiAgICBjb25zdHJ1Y3RlZDogZmFsc2UsXG4gICAgY2FwdHVyZUJpdFN0cmluZ1ZhbHVlOiAnY2VydFNpZ25hdHVyZSdcbiAgfV1cbn07XG5cbnZhciByc2Fzc2FQc3NQYXJhbWV0ZXJWYWxpZGF0b3IgPSB7XG4gIG5hbWU6ICdyc2Fwc3MnLFxuICB0YWdDbGFzczogYXNuMS5DbGFzcy5VTklWRVJTQUwsXG4gIHR5cGU6IGFzbjEuVHlwZS5TRVFVRU5DRSxcbiAgY29uc3RydWN0ZWQ6IHRydWUsXG4gIHZhbHVlOiBbe1xuICAgIG5hbWU6ICdyc2Fwc3MuaGFzaEFsZ29yaXRobScsXG4gICAgdGFnQ2xhc3M6IGFzbjEuQ2xhc3MuQ09OVEVYVF9TUEVDSUZJQyxcbiAgICB0eXBlOiAwLFxuICAgIGNvbnN0cnVjdGVkOiB0cnVlLFxuICAgIHZhbHVlOiBbe1xuICAgICAgbmFtZTogJ3JzYXBzcy5oYXNoQWxnb3JpdGhtLkFsZ29yaXRobUlkZW50aWZpZXInLFxuICAgICAgdGFnQ2xhc3M6IGFzbjEuQ2xhc3MuVU5JVkVSU0FMLFxuICAgICAgdHlwZTogYXNuMS5DbGFzcy5TRVFVRU5DRSxcbiAgICAgIGNvbnN0cnVjdGVkOiB0cnVlLFxuICAgICAgb3B0aW9uYWw6IHRydWUsXG4gICAgICB2YWx1ZTogW3tcbiAgICAgICAgbmFtZTogJ3JzYXBzcy5oYXNoQWxnb3JpdGhtLkFsZ29yaXRobUlkZW50aWZpZXIuYWxnb3JpdGhtJyxcbiAgICAgICAgdGFnQ2xhc3M6IGFzbjEuQ2xhc3MuVU5JVkVSU0FMLFxuICAgICAgICB0eXBlOiBhc24xLlR5cGUuT0lELFxuICAgICAgICBjb25zdHJ1Y3RlZDogZmFsc2UsXG4gICAgICAgIGNhcHR1cmU6ICdoYXNoT2lkJ1xuICAgICAgICAvKiBwYXJhbWV0ZXIgYmxvY2sgb21pdHRlZCwgZm9yIFNIQTEgTlVMTCBhbnlob3cuICovXG4gICAgICB9XVxuICAgIH1dXG4gIH0sIHtcbiAgICBuYW1lOiAncnNhcHNzLm1hc2tHZW5BbGdvcml0aG0nLFxuICAgIHRhZ0NsYXNzOiBhc24xLkNsYXNzLkNPTlRFWFRfU1BFQ0lGSUMsXG4gICAgdHlwZTogMSxcbiAgICBjb25zdHJ1Y3RlZDogdHJ1ZSxcbiAgICB2YWx1ZTogW3tcbiAgICAgIG5hbWU6ICdyc2Fwc3MubWFza0dlbkFsZ29yaXRobS5BbGdvcml0aG1JZGVudGlmaWVyJyxcbiAgICAgIHRhZ0NsYXNzOiBhc24xLkNsYXNzLlVOSVZFUlNBTCxcbiAgICAgIHR5cGU6IGFzbjEuQ2xhc3MuU0VRVUVOQ0UsXG4gICAgICBjb25zdHJ1Y3RlZDogdHJ1ZSxcbiAgICAgIG9wdGlvbmFsOiB0cnVlLFxuICAgICAgdmFsdWU6IFt7XG4gICAgICAgIG5hbWU6ICdyc2Fwc3MubWFza0dlbkFsZ29yaXRobS5BbGdvcml0aG1JZGVudGlmaWVyLmFsZ29yaXRobScsXG4gICAgICAgIHRhZ0NsYXNzOiBhc24xLkNsYXNzLlVOSVZFUlNBTCxcbiAgICAgICAgdHlwZTogYXNuMS5UeXBlLk9JRCxcbiAgICAgICAgY29uc3RydWN0ZWQ6IGZhbHNlLFxuICAgICAgICBjYXB0dXJlOiAnbWFza0dlbk9pZCdcbiAgICAgIH0sIHtcbiAgICAgICAgbmFtZTogJ3JzYXBzcy5tYXNrR2VuQWxnb3JpdGhtLkFsZ29yaXRobUlkZW50aWZpZXIucGFyYW1zJyxcbiAgICAgICAgdGFnQ2xhc3M6IGFzbjEuQ2xhc3MuVU5JVkVSU0FMLFxuICAgICAgICB0eXBlOiBhc24xLlR5cGUuU0VRVUVOQ0UsXG4gICAgICAgIGNvbnN0cnVjdGVkOiB0cnVlLFxuICAgICAgICB2YWx1ZTogW3tcbiAgICAgICAgICBuYW1lOiAncnNhcHNzLm1hc2tHZW5BbGdvcml0aG0uQWxnb3JpdGhtSWRlbnRpZmllci5wYXJhbXMuYWxnb3JpdGhtJyxcbiAgICAgICAgICB0YWdDbGFzczogYXNuMS5DbGFzcy5VTklWRVJTQUwsXG4gICAgICAgICAgdHlwZTogYXNuMS5UeXBlLk9JRCxcbiAgICAgICAgICBjb25zdHJ1Y3RlZDogZmFsc2UsXG4gICAgICAgICAgY2FwdHVyZTogJ21hc2tHZW5IYXNoT2lkJ1xuICAgICAgICAgIC8qIHBhcmFtZXRlciBibG9jayBvbWl0dGVkLCBmb3IgU0hBMSBOVUxMIGFueWhvdy4gKi9cbiAgICAgICAgfV1cbiAgICAgIH1dXG4gICAgfV1cbiAgfSwge1xuICAgIG5hbWU6ICdyc2Fwc3Muc2FsdExlbmd0aCcsXG4gICAgdGFnQ2xhc3M6IGFzbjEuQ2xhc3MuQ09OVEVYVF9TUEVDSUZJQyxcbiAgICB0eXBlOiAyLFxuICAgIG9wdGlvbmFsOiB0cnVlLFxuICAgIHZhbHVlOiBbe1xuICAgICAgbmFtZTogJ3JzYXBzcy5zYWx0TGVuZ3RoLnNhbHRMZW5ndGgnLFxuICAgICAgdGFnQ2xhc3M6IGFzbjEuQ2xhc3MuVU5JVkVSU0FMLFxuICAgICAgdHlwZTogYXNuMS5DbGFzcy5JTlRFR0VSLFxuICAgICAgY29uc3RydWN0ZWQ6IGZhbHNlLFxuICAgICAgY2FwdHVyZTogJ3NhbHRMZW5ndGgnXG4gICAgfV1cbiAgfSwge1xuICAgIG5hbWU6ICdyc2Fwc3MudHJhaWxlckZpZWxkJyxcbiAgICB0YWdDbGFzczogYXNuMS5DbGFzcy5DT05URVhUX1NQRUNJRklDLFxuICAgIHR5cGU6IDMsXG4gICAgb3B0aW9uYWw6IHRydWUsXG4gICAgdmFsdWU6IFt7XG4gICAgICBuYW1lOiAncnNhcHNzLnRyYWlsZXIudHJhaWxlcicsXG4gICAgICB0YWdDbGFzczogYXNuMS5DbGFzcy5VTklWRVJTQUwsXG4gICAgICB0eXBlOiBhc24xLkNsYXNzLklOVEVHRVIsXG4gICAgICBjb25zdHJ1Y3RlZDogZmFsc2UsXG4gICAgICBjYXB0dXJlOiAndHJhaWxlcidcbiAgICB9XVxuICB9XVxufTtcblxuLy8gdmFsaWRhdG9yIGZvciBhIENlcnRpZmljYXRpb25SZXF1ZXN0SW5mbyBzdHJ1Y3R1cmVcbnZhciBjZXJ0aWZpY2F0aW9uUmVxdWVzdEluZm9WYWxpZGF0b3IgPSB7XG4gIG5hbWU6ICdDZXJ0aWZpY2F0aW9uUmVxdWVzdEluZm8nLFxuICB0YWdDbGFzczogYXNuMS5DbGFzcy5VTklWRVJTQUwsXG4gIHR5cGU6IGFzbjEuVHlwZS5TRVFVRU5DRSxcbiAgY29uc3RydWN0ZWQ6IHRydWUsXG4gIGNhcHR1cmVBc24xOiAnY2VydGlmaWNhdGlvblJlcXVlc3RJbmZvJyxcbiAgdmFsdWU6IFt7XG4gICAgbmFtZTogJ0NlcnRpZmljYXRpb25SZXF1ZXN0SW5mby5pbnRlZ2VyJyxcbiAgICB0YWdDbGFzczogYXNuMS5DbGFzcy5VTklWRVJTQUwsXG4gICAgdHlwZTogYXNuMS5UeXBlLklOVEVHRVIsXG4gICAgY29uc3RydWN0ZWQ6IGZhbHNlLFxuICAgIGNhcHR1cmU6ICdjZXJ0aWZpY2F0aW9uUmVxdWVzdEluZm9WZXJzaW9uJ1xuICB9LCB7XG4gICAgLy8gTmFtZSAoc3ViamVjdCkgKFJETlNlcXVlbmNlKVxuICAgIG5hbWU6ICdDZXJ0aWZpY2F0aW9uUmVxdWVzdEluZm8uc3ViamVjdCcsXG4gICAgdGFnQ2xhc3M6IGFzbjEuQ2xhc3MuVU5JVkVSU0FMLFxuICAgIHR5cGU6IGFzbjEuVHlwZS5TRVFVRU5DRSxcbiAgICBjb25zdHJ1Y3RlZDogdHJ1ZSxcbiAgICBjYXB0dXJlQXNuMTogJ2NlcnRpZmljYXRpb25SZXF1ZXN0SW5mb1N1YmplY3QnXG4gIH0sXG4gIC8vIFN1YmplY3RQdWJsaWNLZXlJbmZvXG4gIHB1YmxpY0tleVZhbGlkYXRvcixcbiAge1xuICAgIG5hbWU6ICdDZXJ0aWZpY2F0aW9uUmVxdWVzdEluZm8uYXR0cmlidXRlcycsXG4gICAgdGFnQ2xhc3M6IGFzbjEuQ2xhc3MuQ09OVEVYVF9TUEVDSUZJQyxcbiAgICB0eXBlOiAwLFxuICAgIGNvbnN0cnVjdGVkOiB0cnVlLFxuICAgIG9wdGlvbmFsOiB0cnVlLFxuICAgIGNhcHR1cmU6ICdjZXJ0aWZpY2F0aW9uUmVxdWVzdEluZm9BdHRyaWJ1dGVzJyxcbiAgICB2YWx1ZTogW3tcbiAgICAgIG5hbWU6ICdDZXJ0aWZpY2F0aW9uUmVxdWVzdEluZm8uYXR0cmlidXRlcycsXG4gICAgICB0YWdDbGFzczogYXNuMS5DbGFzcy5VTklWRVJTQUwsXG4gICAgICB0eXBlOiBhc24xLlR5cGUuU0VRVUVOQ0UsXG4gICAgICBjb25zdHJ1Y3RlZDogdHJ1ZSxcbiAgICAgIHZhbHVlOiBbe1xuICAgICAgICBuYW1lOiAnQ2VydGlmaWNhdGlvblJlcXVlc3RJbmZvLmF0dHJpYnV0ZXMudHlwZScsXG4gICAgICAgIHRhZ0NsYXNzOiBhc24xLkNsYXNzLlVOSVZFUlNBTCxcbiAgICAgICAgdHlwZTogYXNuMS5UeXBlLk9JRCxcbiAgICAgICAgY29uc3RydWN0ZWQ6IGZhbHNlXG4gICAgICB9LCB7XG4gICAgICAgIG5hbWU6ICdDZXJ0aWZpY2F0aW9uUmVxdWVzdEluZm8uYXR0cmlidXRlcy52YWx1ZScsXG4gICAgICAgIHRhZ0NsYXNzOiBhc24xLkNsYXNzLlVOSVZFUlNBTCxcbiAgICAgICAgdHlwZTogYXNuMS5UeXBlLlNFVCxcbiAgICAgICAgY29uc3RydWN0ZWQ6IHRydWVcbiAgICAgIH1dXG4gICAgfV1cbiAgfV1cbn07XG5cbi8vIHZhbGlkYXRvciBmb3IgYSBDZXJ0aWZpY2F0aW9uUmVxdWVzdCBzdHJ1Y3R1cmVcbnZhciBjZXJ0aWZpY2F0aW9uUmVxdWVzdFZhbGlkYXRvciA9IHtcbiAgbmFtZTogJ0NlcnRpZmljYXRpb25SZXF1ZXN0JyxcbiAgdGFnQ2xhc3M6IGFzbjEuQ2xhc3MuVU5JVkVSU0FMLFxuICB0eXBlOiBhc24xLlR5cGUuU0VRVUVOQ0UsXG4gIGNvbnN0cnVjdGVkOiB0cnVlLFxuICBjYXB0dXJlQXNuMTogJ2NzcicsXG4gIHZhbHVlOiBbXG4gICAgY2VydGlmaWNhdGlvblJlcXVlc3RJbmZvVmFsaWRhdG9yLCB7XG4gICAgICAvLyBBbGdvcml0aG1JZGVudGlmaWVyIChzaWduYXR1cmUgYWxnb3JpdGhtKVxuICAgICAgbmFtZTogJ0NlcnRpZmljYXRpb25SZXF1ZXN0LnNpZ25hdHVyZUFsZ29yaXRobScsXG4gICAgICB0YWdDbGFzczogYXNuMS5DbGFzcy5VTklWRVJTQUwsXG4gICAgICB0eXBlOiBhc24xLlR5cGUuU0VRVUVOQ0UsXG4gICAgICBjb25zdHJ1Y3RlZDogdHJ1ZSxcbiAgICAgIHZhbHVlOiBbe1xuICAgICAgICAvLyBhbGdvcml0aG1cbiAgICAgICAgbmFtZTogJ0NlcnRpZmljYXRpb25SZXF1ZXN0LnNpZ25hdHVyZUFsZ29yaXRobS5hbGdvcml0aG0nLFxuICAgICAgICB0YWdDbGFzczogYXNuMS5DbGFzcy5VTklWRVJTQUwsXG4gICAgICAgIHR5cGU6IGFzbjEuVHlwZS5PSUQsXG4gICAgICAgIGNvbnN0cnVjdGVkOiBmYWxzZSxcbiAgICAgICAgY2FwdHVyZTogJ2NzclNpZ25hdHVyZU9pZCdcbiAgICAgIH0sIHtcbiAgICAgICAgbmFtZTogJ0NlcnRpZmljYXRpb25SZXF1ZXN0LnNpZ25hdHVyZUFsZ29yaXRobS5wYXJhbWV0ZXJzJyxcbiAgICAgICAgdGFnQ2xhc3M6IGFzbjEuQ2xhc3MuVU5JVkVSU0FMLFxuICAgICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICAgICAgY2FwdHVyZUFzbjE6ICdjc3JTaWduYXR1cmVQYXJhbXMnXG4gICAgICB9XVxuICAgIH0sIHtcbiAgICAgIC8vIHNpZ25hdHVyZVxuICAgICAgbmFtZTogJ0NlcnRpZmljYXRpb25SZXF1ZXN0LnNpZ25hdHVyZScsXG4gICAgICB0YWdDbGFzczogYXNuMS5DbGFzcy5VTklWRVJTQUwsXG4gICAgICB0eXBlOiBhc24xLlR5cGUuQklUU1RSSU5HLFxuICAgICAgY29uc3RydWN0ZWQ6IGZhbHNlLFxuICAgICAgY2FwdHVyZUJpdFN0cmluZ1ZhbHVlOiAnY3NyU2lnbmF0dXJlJ1xuICAgIH1cbiAgXVxufTtcblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBSRE5TZXF1ZW5jZSBvZiBBU04uMSBERVItZW5jb2RlZCBSZWxhdGl2ZURpc3Rpbmd1aXNoZWROYW1lXG4gKiBzZXRzIGludG8gYW4gYXJyYXkgd2l0aCBvYmplY3RzIHRoYXQgaGF2ZSB0eXBlIGFuZCB2YWx1ZSBwcm9wZXJ0aWVzLlxuICpcbiAqIEBwYXJhbSByZG4gdGhlIFJETlNlcXVlbmNlIHRvIGNvbnZlcnQuXG4gKiBAcGFyYW0gbWQgYSBtZXNzYWdlIGRpZ2VzdCB0byBhcHBlbmQgdHlwZSBhbmQgdmFsdWUgdG8gaWYgcHJvdmlkZWQuXG4gKi9cbnBraS5SRE5BdHRyaWJ1dGVzQXNBcnJheSA9IGZ1bmN0aW9uKHJkbiwgbWQpIHtcbiAgdmFyIHJ2YWwgPSBbXTtcblxuICAvLyBlYWNoIHZhbHVlIGluICdyZG4nIGluIGlzIGEgU0VUIG9mIFJlbGF0aXZlRGlzdGluZ3Vpc2hlZE5hbWVcbiAgdmFyIHNldCwgYXR0ciwgb2JqO1xuICBmb3IodmFyIHNpID0gMDsgc2kgPCByZG4udmFsdWUubGVuZ3RoOyArK3NpKSB7XG4gICAgLy8gZ2V0IHRoZSBSZWxhdGl2ZURpc3Rpbmd1aXNoZWROYW1lIHNldFxuICAgIHNldCA9IHJkbi52YWx1ZVtzaV07XG5cbiAgICAvLyBlYWNoIHZhbHVlIGluIHRoZSBTRVQgaXMgYW4gQXR0cmlidXRlVHlwZUFuZFZhbHVlIHNlcXVlbmNlXG4gICAgLy8gY29udGFpbmluZyBmaXJzdCBhIHR5cGUgKGFuIE9JRCkgYW5kIHNlY29uZCBhIHZhbHVlIChkZWZpbmVkIGJ5XG4gICAgLy8gdGhlIE9JRClcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgc2V0LnZhbHVlLmxlbmd0aDsgKytpKSB7XG4gICAgICBvYmogPSB7fTtcbiAgICAgIGF0dHIgPSBzZXQudmFsdWVbaV07XG4gICAgICBvYmoudHlwZSA9IGFzbjEuZGVyVG9PaWQoYXR0ci52YWx1ZVswXS52YWx1ZSk7XG4gICAgICBvYmoudmFsdWUgPSBhdHRyLnZhbHVlWzFdLnZhbHVlO1xuICAgICAgb2JqLnZhbHVlVGFnQ2xhc3MgPSBhdHRyLnZhbHVlWzFdLnR5cGU7XG4gICAgICAvLyBpZiB0aGUgT0lEIGlzIGtub3duLCBnZXQgaXRzIG5hbWUgYW5kIHNob3J0IG5hbWVcbiAgICAgIGlmKG9iai50eXBlIGluIG9pZHMpIHtcbiAgICAgICAgb2JqLm5hbWUgPSBvaWRzW29iai50eXBlXTtcbiAgICAgICAgaWYob2JqLm5hbWUgaW4gX3Nob3J0TmFtZXMpIHtcbiAgICAgICAgICBvYmouc2hvcnROYW1lID0gX3Nob3J0TmFtZXNbb2JqLm5hbWVdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZihtZCkge1xuICAgICAgICBtZC51cGRhdGUob2JqLnR5cGUpO1xuICAgICAgICBtZC51cGRhdGUob2JqLnZhbHVlKTtcbiAgICAgIH1cbiAgICAgIHJ2YWwucHVzaChvYmopO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBydmFsO1xufTtcblxuLyoqXG4gKiBDb252ZXJ0cyBBU04uMSBDUklBdHRyaWJ1dGVzIGludG8gYW4gYXJyYXkgd2l0aCBvYmplY3RzIHRoYXQgaGF2ZSB0eXBlIGFuZFxuICogdmFsdWUgcHJvcGVydGllcy5cbiAqXG4gKiBAcGFyYW0gYXR0cmlidXRlcyB0aGUgQ1JJQXR0cmlidXRlcyB0byBjb252ZXJ0LlxuICovXG5wa2kuQ1JJQXR0cmlidXRlc0FzQXJyYXkgPSBmdW5jdGlvbihhdHRyaWJ1dGVzKSB7XG4gIHZhciBydmFsID0gW107XG5cbiAgLy8gZWFjaCB2YWx1ZSBpbiAnYXR0cmlidXRlcycgaW4gaXMgYSBTRVFVRU5DRSB3aXRoIGFuIE9JRCBhbmQgYSBTRVRcbiAgZm9yKHZhciBzaSA9IDA7IHNpIDwgYXR0cmlidXRlcy5sZW5ndGg7ICsrc2kpIHtcbiAgICAvLyBnZXQgdGhlIGF0dHJpYnV0ZSBzZXF1ZW5jZVxuICAgIHZhciBzZXEgPSBhdHRyaWJ1dGVzW3NpXTtcblxuICAgIC8vIGVhY2ggdmFsdWUgaW4gdGhlIFNFUVVFTkNFIGNvbnRhaW5pbmcgZmlyc3QgYSB0eXBlIChhbiBPSUQpIGFuZFxuICAgIC8vIHNlY29uZCBhIHNldCBvZiB2YWx1ZXMgKGRlZmluZWQgYnkgdGhlIE9JRClcbiAgICB2YXIgdHlwZSA9IGFzbjEuZGVyVG9PaWQoc2VxLnZhbHVlWzBdLnZhbHVlKTtcbiAgICB2YXIgdmFsdWVzID0gc2VxLnZhbHVlWzFdLnZhbHVlO1xuICAgIGZvcih2YXIgdmkgPSAwOyB2aSA8IHZhbHVlcy5sZW5ndGg7ICsrdmkpIHtcbiAgICAgIHZhciBvYmogPSB7fTtcbiAgICAgIG9iai50eXBlID0gdHlwZTtcbiAgICAgIG9iai52YWx1ZSA9IHZhbHVlc1t2aV0udmFsdWU7XG4gICAgICBvYmoudmFsdWVUYWdDbGFzcyA9IHZhbHVlc1t2aV0udHlwZTtcbiAgICAgIC8vIGlmIHRoZSBPSUQgaXMga25vd24sIGdldCBpdHMgbmFtZSBhbmQgc2hvcnQgbmFtZVxuICAgICAgaWYob2JqLnR5cGUgaW4gb2lkcykge1xuICAgICAgICBvYmoubmFtZSA9IG9pZHNbb2JqLnR5cGVdO1xuICAgICAgICBpZihvYmoubmFtZSBpbiBfc2hvcnROYW1lcykge1xuICAgICAgICAgIG9iai5zaG9ydE5hbWUgPSBfc2hvcnROYW1lc1tvYmoubmFtZV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIHBhcnNlIGV4dGVuc2lvbnNcbiAgICAgIGlmKG9iai50eXBlID09PSBvaWRzLmV4dGVuc2lvblJlcXVlc3QpIHtcbiAgICAgICAgb2JqLmV4dGVuc2lvbnMgPSBbXTtcbiAgICAgICAgZm9yKHZhciBlaSA9IDA7IGVpIDwgb2JqLnZhbHVlLmxlbmd0aDsgKytlaSkge1xuICAgICAgICAgIG9iai5leHRlbnNpb25zLnB1c2gocGtpLmNlcnRpZmljYXRlRXh0ZW5zaW9uRnJvbUFzbjEob2JqLnZhbHVlW2VpXSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBydmFsLnB1c2gob2JqKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcnZhbDtcbn07XG5cbi8qKlxuICogR2V0cyBhbiBpc3N1ZXIgb3Igc3ViamVjdCBhdHRyaWJ1dGUgZnJvbSBpdHMgbmFtZSwgdHlwZSwgb3Igc2hvcnQgbmFtZS5cbiAqXG4gKiBAcGFyYW0gb2JqIHRoZSBpc3N1ZXIgb3Igc3ViamVjdCBvYmplY3QuXG4gKiBAcGFyYW0gb3B0aW9ucyBhIHNob3J0IG5hbWUgc3RyaW5nIG9yIGFuIG9iamVjdCB3aXRoOlxuICogICAgICAgICAgc2hvcnROYW1lIHRoZSBzaG9ydCBuYW1lIGZvciB0aGUgYXR0cmlidXRlLlxuICogICAgICAgICAgbmFtZSB0aGUgbmFtZSBmb3IgdGhlIGF0dHJpYnV0ZS5cbiAqICAgICAgICAgIHR5cGUgdGhlIHR5cGUgZm9yIHRoZSBhdHRyaWJ1dGUuXG4gKlxuICogQHJldHVybiB0aGUgYXR0cmlidXRlLlxuICovXG5mdW5jdGlvbiBfZ2V0QXR0cmlidXRlKG9iaiwgb3B0aW9ucykge1xuICBpZih0eXBlb2Ygb3B0aW9ucyA9PT0gJ3N0cmluZycpIHtcbiAgICBvcHRpb25zID0ge3Nob3J0TmFtZTogb3B0aW9uc307XG4gIH1cblxuICB2YXIgcnZhbCA9IG51bGw7XG4gIHZhciBhdHRyO1xuICBmb3IodmFyIGkgPSAwOyBydmFsID09PSBudWxsICYmIGkgPCBvYmouYXR0cmlidXRlcy5sZW5ndGg7ICsraSkge1xuICAgIGF0dHIgPSBvYmouYXR0cmlidXRlc1tpXTtcbiAgICBpZihvcHRpb25zLnR5cGUgJiYgb3B0aW9ucy50eXBlID09PSBhdHRyLnR5cGUpIHtcbiAgICAgIHJ2YWwgPSBhdHRyO1xuICAgIH0gZWxzZSBpZihvcHRpb25zLm5hbWUgJiYgb3B0aW9ucy5uYW1lID09PSBhdHRyLm5hbWUpIHtcbiAgICAgIHJ2YWwgPSBhdHRyO1xuICAgIH0gZWxzZSBpZihvcHRpb25zLnNob3J0TmFtZSAmJiBvcHRpb25zLnNob3J0TmFtZSA9PT0gYXR0ci5zaG9ydE5hbWUpIHtcbiAgICAgIHJ2YWwgPSBhdHRyO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcnZhbDtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBzaWduYXR1cmUgcGFyYW1ldGVycyBmcm9tIEFTTi4xIHN0cnVjdHVyZS5cbiAqXG4gKiBDdXJyZW50bHkgb25seSBSU0FTU0EtUFNTIHN1cHBvcnRlZC4gIFRoZSBQS0NTIzEgdjEuNSBzaWduYXR1cmUgc2NoZW1lIGhhZFxuICogbm8gcGFyYW1ldGVycy5cbiAqXG4gKiBSU0FTU0EtUFNTLXBhcmFtcyAgOjo9ICBTRVFVRU5DRSAge1xuICogICBoYXNoQWxnb3JpdGhtICAgICAgWzBdIEhhc2hBbGdvcml0aG0gREVGQVVMVFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYTFJZGVudGlmaWVyLFxuICogICBtYXNrR2VuQWxnb3JpdGhtICAgWzFdIE1hc2tHZW5BbGdvcml0aG0gREVGQVVMVFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1nZjFTSEExSWRlbnRpZmllcixcbiAqICAgc2FsdExlbmd0aCAgICAgICAgIFsyXSBJTlRFR0VSIERFRkFVTFQgMjAsXG4gKiAgIHRyYWlsZXJGaWVsZCAgICAgICBbM10gSU5URUdFUiBERUZBVUxUIDFcbiAqIH1cbiAqXG4gKiBIYXNoQWxnb3JpdGhtICA6Oj0gIEFsZ29yaXRobUlkZW50aWZpZXJcbiAqXG4gKiBNYXNrR2VuQWxnb3JpdGhtICA6Oj0gIEFsZ29yaXRobUlkZW50aWZpZXJcbiAqXG4gKiBBbGdvcml0aG1JZGVudGlmZXIgOjo9IFNFUVVFTkNFIHtcbiAqICAgYWxnb3JpdGhtIE9CSkVDVCBJREVOVElGSUVSLFxuICogICBwYXJhbWV0ZXJzIEFOWSBERUZJTkVEIEJZIGFsZ29yaXRobSBPUFRJT05BTFxuICogfVxuICpcbiAqIEBwYXJhbSBvaWQgVGhlIE9JRCBzcGVjaWZ5aW5nIHRoZSBzaWduYXR1cmUgYWxnb3JpdGhtXG4gKiBAcGFyYW0gb2JqIFRoZSBBU04uMSBzdHJ1Y3R1cmUgaG9sZGluZyB0aGUgcGFyYW1ldGVyc1xuICogQHBhcmFtIGZpbGxEZWZhdWx0cyBXaGV0aGVyIHRvIHVzZSByZXR1cm4gZGVmYXVsdCB2YWx1ZXMgd2hlcmUgb21pdHRlZFxuICogQHJldHVybiBzaWduYXR1cmUgcGFyYW1ldGVyIG9iamVjdFxuICovXG52YXIgX3JlYWRTaWduYXR1cmVQYXJhbWV0ZXJzID0gZnVuY3Rpb24ob2lkLCBvYmosIGZpbGxEZWZhdWx0cykge1xuICB2YXIgcGFyYW1zID0ge307XG5cbiAgaWYob2lkICE9PSBvaWRzWydSU0FTU0EtUFNTJ10pIHtcbiAgICByZXR1cm4gcGFyYW1zO1xuICB9XG5cbiAgaWYoZmlsbERlZmF1bHRzKSB7XG4gICAgcGFyYW1zID0ge1xuICAgICAgaGFzaDoge1xuICAgICAgICBhbGdvcml0aG1PaWQ6IG9pZHNbJ3NoYTEnXVxuICAgICAgfSxcbiAgICAgIG1nZjoge1xuICAgICAgICBhbGdvcml0aG1PaWQ6IG9pZHNbJ21nZjEnXSxcbiAgICAgICAgaGFzaDoge1xuICAgICAgICAgIGFsZ29yaXRobU9pZDogb2lkc1snc2hhMSddXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBzYWx0TGVuZ3RoOiAyMFxuICAgIH07XG4gIH1cblxuICB2YXIgY2FwdHVyZSA9IHt9O1xuICB2YXIgZXJyb3JzID0gW107XG4gIGlmKCFhc24xLnZhbGlkYXRlKG9iaiwgcnNhc3NhUHNzUGFyYW1ldGVyVmFsaWRhdG9yLCBjYXB0dXJlLCBlcnJvcnMpKSB7XG4gICAgdmFyIGVycm9yID0gbmV3IEVycm9yKCdDYW5ub3QgcmVhZCBSU0FTU0EtUFNTIHBhcmFtZXRlciBibG9jay4nKTtcbiAgICBlcnJvci5lcnJvcnMgPSBlcnJvcnM7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cblxuICBpZihjYXB0dXJlLmhhc2hPaWQgIT09IHVuZGVmaW5lZCkge1xuICAgIHBhcmFtcy5oYXNoID0gcGFyYW1zLmhhc2ggfHwge307XG4gICAgcGFyYW1zLmhhc2guYWxnb3JpdGhtT2lkID0gYXNuMS5kZXJUb09pZChjYXB0dXJlLmhhc2hPaWQpO1xuICB9XG5cbiAgaWYoY2FwdHVyZS5tYXNrR2VuT2lkICE9PSB1bmRlZmluZWQpIHtcbiAgICBwYXJhbXMubWdmID0gcGFyYW1zLm1nZiB8fCB7fTtcbiAgICBwYXJhbXMubWdmLmFsZ29yaXRobU9pZCA9IGFzbjEuZGVyVG9PaWQoY2FwdHVyZS5tYXNrR2VuT2lkKTtcbiAgICBwYXJhbXMubWdmLmhhc2ggPSBwYXJhbXMubWdmLmhhc2ggfHwge307XG4gICAgcGFyYW1zLm1nZi5oYXNoLmFsZ29yaXRobU9pZCA9IGFzbjEuZGVyVG9PaWQoY2FwdHVyZS5tYXNrR2VuSGFzaE9pZCk7XG4gIH1cblxuICBpZihjYXB0dXJlLnNhbHRMZW5ndGggIT09IHVuZGVmaW5lZCkge1xuICAgIHBhcmFtcy5zYWx0TGVuZ3RoID0gY2FwdHVyZS5zYWx0TGVuZ3RoLmNoYXJDb2RlQXQoMCk7XG4gIH1cblxuICByZXR1cm4gcGFyYW1zO1xufTtcblxuLyoqXG4gKiBDcmVhdGUgc2lnbmF0dXJlIGRpZ2VzdCBmb3IgT0lELlxuICpcbiAqIEBwYXJhbSBvcHRpb25zXG4gKiAgIHNpZ25hdHVyZU9pZDogdGhlIE9JRCBzcGVjaWZ5aW5nIHRoZSBzaWduYXR1cmUgYWxnb3JpdGhtLlxuICogICB0eXBlOiBhIGh1bWFuIHJlYWRhYmxlIHR5cGUgZm9yIGVycm9yIG1lc3NhZ2VzXG4gKiBAcmV0dXJuIGEgY3JlYXRlZCBtZCBpbnN0YW5jZS4gdGhyb3dzIGlmIHVua25vd24gb2lkLlxuICovXG52YXIgX2NyZWF0ZVNpZ25hdHVyZURpZ2VzdCA9IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgc3dpdGNoKG9pZHNbb3B0aW9ucy5zaWduYXR1cmVPaWRdKSB7XG4gICAgY2FzZSAnc2hhMVdpdGhSU0FFbmNyeXB0aW9uJzpcbiAgICAvLyBkZXByZWNhdGVkIGFsaWFzXG4gICAgY2FzZSAnc2hhMVdpdGhSU0FTaWduYXR1cmUnOlxuICAgICAgcmV0dXJuIGZvcmdlLm1kLnNoYTEuY3JlYXRlKCk7XG4gICAgY2FzZSAnbWQ1V2l0aFJTQUVuY3J5cHRpb24nOlxuICAgICAgcmV0dXJuIGZvcmdlLm1kLm1kNS5jcmVhdGUoKTtcbiAgICBjYXNlICdzaGEyNTZXaXRoUlNBRW5jcnlwdGlvbic6XG4gICAgICByZXR1cm4gZm9yZ2UubWQuc2hhMjU2LmNyZWF0ZSgpO1xuICAgIGNhc2UgJ3NoYTM4NFdpdGhSU0FFbmNyeXB0aW9uJzpcbiAgICAgIHJldHVybiBmb3JnZS5tZC5zaGEzODQuY3JlYXRlKCk7XG4gICAgY2FzZSAnc2hhNTEyV2l0aFJTQUVuY3J5cHRpb24nOlxuICAgICAgcmV0dXJuIGZvcmdlLm1kLnNoYTUxMi5jcmVhdGUoKTtcbiAgICBjYXNlICdSU0FTU0EtUFNTJzpcbiAgICAgIHJldHVybiBmb3JnZS5tZC5zaGEyNTYuY3JlYXRlKCk7XG4gICAgZGVmYXVsdDpcbiAgICAgIHZhciBlcnJvciA9IG5ldyBFcnJvcihcbiAgICAgICAgJ0NvdWxkIG5vdCBjb21wdXRlICcgKyBvcHRpb25zLnR5cGUgKyAnIGRpZ2VzdC4gJyArXG4gICAgICAgICdVbmtub3duIHNpZ25hdHVyZSBPSUQuJyk7XG4gICAgICBlcnJvci5zaWduYXR1cmVPaWQgPSBvcHRpb25zLnNpZ25hdHVyZU9pZDtcbiAgICAgIHRocm93IGVycm9yO1xuICB9XG59O1xuXG4vKipcbiAqIFZlcmlmeSBzaWduYXR1cmUgb24gY2VydGlmaWNhdGUgb3IgQ1NSLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zOlxuICogICBjZXJ0aWZpY2F0ZSB0aGUgY2VydGlmaWNhdGUgb3IgQ1NSIHRvIHZlcmlmeS5cbiAqICAgbWQgdGhlIHNpZ25hdHVyZSBkaWdlc3QuXG4gKiAgIHNpZ25hdHVyZSB0aGUgc2lnbmF0dXJlXG4gKiBAcmV0dXJuIGEgY3JlYXRlZCBtZCBpbnN0YW5jZS4gdGhyb3dzIGlmIHVua25vd24gb2lkLlxuICovXG52YXIgX3ZlcmlmeVNpZ25hdHVyZSA9IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgdmFyIGNlcnQgPSBvcHRpb25zLmNlcnRpZmljYXRlO1xuICB2YXIgc2NoZW1lO1xuXG4gIHN3aXRjaChjZXJ0LnNpZ25hdHVyZU9pZCkge1xuICAgIGNhc2Ugb2lkcy5zaGExV2l0aFJTQUVuY3J5cHRpb246XG4gICAgLy8gZGVwcmVjYXRlZCBhbGlhc1xuICAgIGNhc2Ugb2lkcy5zaGExV2l0aFJTQVNpZ25hdHVyZTpcbiAgICAgIC8qIHVzZSBQS0NTIzEgdjEuNSBwYWRkaW5nIHNjaGVtZSAqL1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBvaWRzWydSU0FTU0EtUFNTJ106XG4gICAgICB2YXIgaGFzaCwgbWdmO1xuXG4gICAgICAvKiBpbml0aWFsaXplIG1nZiAqL1xuICAgICAgaGFzaCA9IG9pZHNbY2VydC5zaWduYXR1cmVQYXJhbWV0ZXJzLm1nZi5oYXNoLmFsZ29yaXRobU9pZF07XG4gICAgICBpZihoYXNoID09PSB1bmRlZmluZWQgfHwgZm9yZ2UubWRbaGFzaF0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB2YXIgZXJyb3IgPSBuZXcgRXJyb3IoJ1Vuc3VwcG9ydGVkIE1HRiBoYXNoIGZ1bmN0aW9uLicpO1xuICAgICAgICBlcnJvci5vaWQgPSBjZXJ0LnNpZ25hdHVyZVBhcmFtZXRlcnMubWdmLmhhc2guYWxnb3JpdGhtT2lkO1xuICAgICAgICBlcnJvci5uYW1lID0gaGFzaDtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG5cbiAgICAgIG1nZiA9IG9pZHNbY2VydC5zaWduYXR1cmVQYXJhbWV0ZXJzLm1nZi5hbGdvcml0aG1PaWRdO1xuICAgICAgaWYobWdmID09PSB1bmRlZmluZWQgfHwgZm9yZ2UubWdmW21nZl0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB2YXIgZXJyb3IgPSBuZXcgRXJyb3IoJ1Vuc3VwcG9ydGVkIE1HRiBmdW5jdGlvbi4nKTtcbiAgICAgICAgZXJyb3Iub2lkID0gY2VydC5zaWduYXR1cmVQYXJhbWV0ZXJzLm1nZi5hbGdvcml0aG1PaWQ7XG4gICAgICAgIGVycm9yLm5hbWUgPSBtZ2Y7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuXG4gICAgICBtZ2YgPSBmb3JnZS5tZ2ZbbWdmXS5jcmVhdGUoZm9yZ2UubWRbaGFzaF0uY3JlYXRlKCkpO1xuXG4gICAgICAvKiBpbml0aWFsaXplIGhhc2ggZnVuY3Rpb24gKi9cbiAgICAgIGhhc2ggPSBvaWRzW2NlcnQuc2lnbmF0dXJlUGFyYW1ldGVycy5oYXNoLmFsZ29yaXRobU9pZF07XG4gICAgICBpZihoYXNoID09PSB1bmRlZmluZWQgfHwgZm9yZ2UubWRbaGFzaF0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB2YXIgZXJyb3IgPSBuZXcgRXJyb3IoJ1Vuc3VwcG9ydGVkIFJTQVNTQS1QU1MgaGFzaCBmdW5jdGlvbi4nKTtcbiAgICAgICAgZXJyb3Iub2lkID0gY2VydC5zaWduYXR1cmVQYXJhbWV0ZXJzLmhhc2guYWxnb3JpdGhtT2lkO1xuICAgICAgICBlcnJvci5uYW1lID0gaGFzaDtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG5cbiAgICAgIHNjaGVtZSA9IGZvcmdlLnBzcy5jcmVhdGUoXG4gICAgICAgIGZvcmdlLm1kW2hhc2hdLmNyZWF0ZSgpLCBtZ2YsIGNlcnQuc2lnbmF0dXJlUGFyYW1ldGVycy5zYWx0TGVuZ3RoXG4gICAgICApO1xuICAgICAgYnJlYWs7XG4gIH1cblxuICAvLyB2ZXJpZnkgc2lnbmF0dXJlIG9uIGNlcnQgdXNpbmcgcHVibGljIGtleVxuICByZXR1cm4gY2VydC5wdWJsaWNLZXkudmVyaWZ5KFxuICAgIG9wdGlvbnMubWQuZGlnZXN0KCkuZ2V0Qnl0ZXMoKSwgb3B0aW9ucy5zaWduYXR1cmUsIHNjaGVtZVxuICApO1xufTtcblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBYLjUwOSBjZXJ0aWZpY2F0ZSBmcm9tIFBFTSBmb3JtYXQuXG4gKlxuICogTm90ZTogSWYgdGhlIGNlcnRpZmljYXRlIGlzIHRvIGJlIHZlcmlmaWVkIHRoZW4gY29tcHV0ZSBoYXNoIHNob3VsZFxuICogYmUgc2V0IHRvIHRydWUuIFRoaXMgd2lsbCBzY2FuIHRoZSBUQlNDZXJ0aWZpY2F0ZSBwYXJ0IG9mIHRoZSBBU04uMVxuICogb2JqZWN0IHdoaWxlIGl0IGlzIGNvbnZlcnRlZCBzbyBpdCBkb2Vzbid0IG5lZWQgdG8gYmUgY29udmVydGVkIGJhY2tcbiAqIHRvIEFTTi4xLURFUi1lbmNvZGluZyBsYXRlci5cbiAqXG4gKiBAcGFyYW0gcGVtIHRoZSBQRU0tZm9ybWF0dGVkIGNlcnRpZmljYXRlLlxuICogQHBhcmFtIGNvbXB1dGVIYXNoIHRydWUgdG8gY29tcHV0ZSB0aGUgaGFzaCBmb3IgdmVyaWZpY2F0aW9uLlxuICogQHBhcmFtIHN0cmljdCB0cnVlIHRvIGJlIHN0cmljdCB3aGVuIGNoZWNraW5nIEFTTi4xIHZhbHVlIGxlbmd0aHMsIGZhbHNlIHRvXG4gKiAgICAgICAgICBhbGxvdyB0cnVuY2F0ZWQgdmFsdWVzIChkZWZhdWx0OiB0cnVlKS5cbiAqXG4gKiBAcmV0dXJuIHRoZSBjZXJ0aWZpY2F0ZS5cbiAqL1xucGtpLmNlcnRpZmljYXRlRnJvbVBlbSA9IGZ1bmN0aW9uKHBlbSwgY29tcHV0ZUhhc2gsIHN0cmljdCkge1xuICB2YXIgbXNnID0gZm9yZ2UucGVtLmRlY29kZShwZW0pWzBdO1xuXG4gIGlmKG1zZy50eXBlICE9PSAnQ0VSVElGSUNBVEUnICYmXG4gICAgbXNnLnR5cGUgIT09ICdYNTA5IENFUlRJRklDQVRFJyAmJlxuICAgIG1zZy50eXBlICE9PSAnVFJVU1RFRCBDRVJUSUZJQ0FURScpIHtcbiAgICB2YXIgZXJyb3IgPSBuZXcgRXJyb3IoXG4gICAgICAnQ291bGQgbm90IGNvbnZlcnQgY2VydGlmaWNhdGUgZnJvbSBQRU07IFBFTSBoZWFkZXIgdHlwZSAnICtcbiAgICAgICdpcyBub3QgXCJDRVJUSUZJQ0FURVwiLCBcIlg1MDkgQ0VSVElGSUNBVEVcIiwgb3IgXCJUUlVTVEVEIENFUlRJRklDQVRFXCIuJyk7XG4gICAgZXJyb3IuaGVhZGVyVHlwZSA9IG1zZy50eXBlO1xuICAgIHRocm93IGVycm9yO1xuICB9XG4gIGlmKG1zZy5wcm9jVHlwZSAmJiBtc2cucHJvY1R5cGUudHlwZSA9PT0gJ0VOQ1JZUFRFRCcpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAnQ291bGQgbm90IGNvbnZlcnQgY2VydGlmaWNhdGUgZnJvbSBQRU07IFBFTSBpcyBlbmNyeXB0ZWQuJyk7XG4gIH1cblxuICAvLyBjb252ZXJ0IERFUiB0byBBU04uMSBvYmplY3RcbiAgdmFyIG9iaiA9IGFzbjEuZnJvbURlcihtc2cuYm9keSwgc3RyaWN0KTtcblxuICByZXR1cm4gcGtpLmNlcnRpZmljYXRlRnJvbUFzbjEob2JqLCBjb21wdXRlSGFzaCk7XG59O1xuXG4vKipcbiAqIENvbnZlcnRzIGFuIFguNTA5IGNlcnRpZmljYXRlIHRvIFBFTSBmb3JtYXQuXG4gKlxuICogQHBhcmFtIGNlcnQgdGhlIGNlcnRpZmljYXRlLlxuICogQHBhcmFtIG1heGxpbmUgdGhlIG1heGltdW0gY2hhcmFjdGVycyBwZXIgbGluZSwgZGVmYXVsdHMgdG8gNjQuXG4gKlxuICogQHJldHVybiB0aGUgUEVNLWZvcm1hdHRlZCBjZXJ0aWZpY2F0ZS5cbiAqL1xucGtpLmNlcnRpZmljYXRlVG9QZW0gPSBmdW5jdGlvbihjZXJ0LCBtYXhsaW5lKSB7XG4gIC8vIGNvbnZlcnQgdG8gQVNOLjEsIHRoZW4gREVSLCB0aGVuIFBFTS1lbmNvZGVcbiAgdmFyIG1zZyA9IHtcbiAgICB0eXBlOiAnQ0VSVElGSUNBVEUnLFxuICAgIGJvZHk6IGFzbjEudG9EZXIocGtpLmNlcnRpZmljYXRlVG9Bc24xKGNlcnQpKS5nZXRCeXRlcygpXG4gIH07XG4gIHJldHVybiBmb3JnZS5wZW0uZW5jb2RlKG1zZywge21heGxpbmU6IG1heGxpbmV9KTtcbn07XG5cbi8qKlxuICogQ29udmVydHMgYW4gUlNBIHB1YmxpYyBrZXkgZnJvbSBQRU0gZm9ybWF0LlxuICpcbiAqIEBwYXJhbSBwZW0gdGhlIFBFTS1mb3JtYXR0ZWQgcHVibGljIGtleS5cbiAqXG4gKiBAcmV0dXJuIHRoZSBwdWJsaWMga2V5LlxuICovXG5wa2kucHVibGljS2V5RnJvbVBlbSA9IGZ1bmN0aW9uKHBlbSkge1xuICB2YXIgbXNnID0gZm9yZ2UucGVtLmRlY29kZShwZW0pWzBdO1xuXG4gIGlmKG1zZy50eXBlICE9PSAnUFVCTElDIEtFWScgJiYgbXNnLnR5cGUgIT09ICdSU0EgUFVCTElDIEtFWScpIHtcbiAgICB2YXIgZXJyb3IgPSBuZXcgRXJyb3IoJ0NvdWxkIG5vdCBjb252ZXJ0IHB1YmxpYyBrZXkgZnJvbSBQRU07IFBFTSBoZWFkZXIgJyArXG4gICAgICAndHlwZSBpcyBub3QgXCJQVUJMSUMgS0VZXCIgb3IgXCJSU0EgUFVCTElDIEtFWVwiLicpO1xuICAgIGVycm9yLmhlYWRlclR5cGUgPSBtc2cudHlwZTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxuICBpZihtc2cucHJvY1R5cGUgJiYgbXNnLnByb2NUeXBlLnR5cGUgPT09ICdFTkNSWVBURUQnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgY29udmVydCBwdWJsaWMga2V5IGZyb20gUEVNOyBQRU0gaXMgZW5jcnlwdGVkLicpO1xuICB9XG5cbiAgLy8gY29udmVydCBERVIgdG8gQVNOLjEgb2JqZWN0XG4gIHZhciBvYmogPSBhc24xLmZyb21EZXIobXNnLmJvZHkpO1xuXG4gIHJldHVybiBwa2kucHVibGljS2V5RnJvbUFzbjEob2JqKTtcbn07XG5cbi8qKlxuICogQ29udmVydHMgYW4gUlNBIHB1YmxpYyBrZXkgdG8gUEVNIGZvcm1hdCAodXNpbmcgYSBTdWJqZWN0UHVibGljS2V5SW5mbykuXG4gKlxuICogQHBhcmFtIGtleSB0aGUgcHVibGljIGtleS5cbiAqIEBwYXJhbSBtYXhsaW5lIHRoZSBtYXhpbXVtIGNoYXJhY3RlcnMgcGVyIGxpbmUsIGRlZmF1bHRzIHRvIDY0LlxuICpcbiAqIEByZXR1cm4gdGhlIFBFTS1mb3JtYXR0ZWQgcHVibGljIGtleS5cbiAqL1xucGtpLnB1YmxpY0tleVRvUGVtID0gZnVuY3Rpb24oa2V5LCBtYXhsaW5lKSB7XG4gIC8vIGNvbnZlcnQgdG8gQVNOLjEsIHRoZW4gREVSLCB0aGVuIFBFTS1lbmNvZGVcbiAgdmFyIG1zZyA9IHtcbiAgICB0eXBlOiAnUFVCTElDIEtFWScsXG4gICAgYm9keTogYXNuMS50b0Rlcihwa2kucHVibGljS2V5VG9Bc24xKGtleSkpLmdldEJ5dGVzKClcbiAgfTtcbiAgcmV0dXJuIGZvcmdlLnBlbS5lbmNvZGUobXNnLCB7bWF4bGluZTogbWF4bGluZX0pO1xufTtcblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBSU0EgcHVibGljIGtleSB0byBQRU0gZm9ybWF0ICh1c2luZyBhbiBSU0FQdWJsaWNLZXkpLlxuICpcbiAqIEBwYXJhbSBrZXkgdGhlIHB1YmxpYyBrZXkuXG4gKiBAcGFyYW0gbWF4bGluZSB0aGUgbWF4aW11bSBjaGFyYWN0ZXJzIHBlciBsaW5lLCBkZWZhdWx0cyB0byA2NC5cbiAqXG4gKiBAcmV0dXJuIHRoZSBQRU0tZm9ybWF0dGVkIHB1YmxpYyBrZXkuXG4gKi9cbnBraS5wdWJsaWNLZXlUb1JTQVB1YmxpY0tleVBlbSA9IGZ1bmN0aW9uKGtleSwgbWF4bGluZSkge1xuICAvLyBjb252ZXJ0IHRvIEFTTi4xLCB0aGVuIERFUiwgdGhlbiBQRU0tZW5jb2RlXG4gIHZhciBtc2cgPSB7XG4gICAgdHlwZTogJ1JTQSBQVUJMSUMgS0VZJyxcbiAgICBib2R5OiBhc24xLnRvRGVyKHBraS5wdWJsaWNLZXlUb1JTQVB1YmxpY0tleShrZXkpKS5nZXRCeXRlcygpXG4gIH07XG4gIHJldHVybiBmb3JnZS5wZW0uZW5jb2RlKG1zZywge21heGxpbmU6IG1heGxpbmV9KTtcbn07XG5cbi8qKlxuICogR2V0cyBhIGZpbmdlcnByaW50IGZvciB0aGUgZ2l2ZW4gcHVibGljIGtleS5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyB0aGUgb3B0aW9ucyB0byB1c2UuXG4gKiAgICAgICAgICBbbWRdIHRoZSBtZXNzYWdlIGRpZ2VzdCBvYmplY3QgdG8gdXNlIChkZWZhdWx0cyB0byBmb3JnZS5tZC5zaGExKS5cbiAqICAgICAgICAgIFt0eXBlXSB0aGUgdHlwZSBvZiBmaW5nZXJwcmludCwgc3VjaCBhcyAnUlNBUHVibGljS2V5JyxcbiAqICAgICAgICAgICAgJ1N1YmplY3RQdWJsaWNLZXlJbmZvJyAoZGVmYXVsdHMgdG8gJ1JTQVB1YmxpY0tleScpLlxuICogICAgICAgICAgW2VuY29kaW5nXSBhbiBhbHRlcm5hdGl2ZSBvdXRwdXQgZW5jb2RpbmcsIHN1Y2ggYXMgJ2hleCdcbiAqICAgICAgICAgICAgKGRlZmF1bHRzIHRvIG5vbmUsIG91dHB1dHMgYSBieXRlIGJ1ZmZlcikuXG4gKiAgICAgICAgICBbZGVsaW1pdGVyXSB0aGUgZGVsaW1pdGVyIHRvIHVzZSBiZXR3ZWVuIGJ5dGVzIGZvciAnaGV4JyBlbmNvZGVkXG4gKiAgICAgICAgICAgIG91dHB1dCwgZWc6ICc6JyAoZGVmYXVsdHMgdG8gbm9uZSkuXG4gKlxuICogQHJldHVybiB0aGUgZmluZ2VycHJpbnQgYXMgYSBieXRlIGJ1ZmZlciBvciBvdGhlciBlbmNvZGluZyBiYXNlZCBvbiBvcHRpb25zLlxuICovXG5wa2kuZ2V0UHVibGljS2V5RmluZ2VycHJpbnQgPSBmdW5jdGlvbihrZXksIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIHZhciBtZCA9IG9wdGlvbnMubWQgfHwgZm9yZ2UubWQuc2hhMS5jcmVhdGUoKTtcbiAgdmFyIHR5cGUgPSBvcHRpb25zLnR5cGUgfHwgJ1JTQVB1YmxpY0tleSc7XG5cbiAgdmFyIGJ5dGVzO1xuICBzd2l0Y2godHlwZSkge1xuICAgIGNhc2UgJ1JTQVB1YmxpY0tleSc6XG4gICAgICBieXRlcyA9IGFzbjEudG9EZXIocGtpLnB1YmxpY0tleVRvUlNBUHVibGljS2V5KGtleSkpLmdldEJ5dGVzKCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdTdWJqZWN0UHVibGljS2V5SW5mbyc6XG4gICAgICBieXRlcyA9IGFzbjEudG9EZXIocGtpLnB1YmxpY0tleVRvQXNuMShrZXkpKS5nZXRCeXRlcygpO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcignVW5rbm93biBmaW5nZXJwcmludCB0eXBlIFwiJyArIG9wdGlvbnMudHlwZSArICdcIi4nKTtcbiAgfVxuXG4gIC8vIGhhc2ggcHVibGljIGtleSBieXRlc1xuICBtZC5zdGFydCgpO1xuICBtZC51cGRhdGUoYnl0ZXMpO1xuICB2YXIgZGlnZXN0ID0gbWQuZGlnZXN0KCk7XG4gIGlmKG9wdGlvbnMuZW5jb2RpbmcgPT09ICdoZXgnKSB7XG4gICAgdmFyIGhleCA9IGRpZ2VzdC50b0hleCgpO1xuICAgIGlmKG9wdGlvbnMuZGVsaW1pdGVyKSB7XG4gICAgICByZXR1cm4gaGV4Lm1hdGNoKC8uezJ9L2cpLmpvaW4ob3B0aW9ucy5kZWxpbWl0ZXIpO1xuICAgIH1cbiAgICByZXR1cm4gaGV4O1xuICB9IGVsc2UgaWYob3B0aW9ucy5lbmNvZGluZyA9PT0gJ2JpbmFyeScpIHtcbiAgICByZXR1cm4gZGlnZXN0LmdldEJ5dGVzKCk7XG4gIH0gZWxzZSBpZihvcHRpb25zLmVuY29kaW5nKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIGVuY29kaW5nIFwiJyArIG9wdGlvbnMuZW5jb2RpbmcgKyAnXCIuJyk7XG4gIH1cbiAgcmV0dXJuIGRpZ2VzdDtcbn07XG5cbi8qKlxuICogQ29udmVydHMgYSBQS0NTIzEwIGNlcnRpZmljYXRpb24gcmVxdWVzdCAoQ1NSKSBmcm9tIFBFTSBmb3JtYXQuXG4gKlxuICogTm90ZTogSWYgdGhlIGNlcnRpZmljYXRpb24gcmVxdWVzdCBpcyB0byBiZSB2ZXJpZmllZCB0aGVuIGNvbXB1dGUgaGFzaFxuICogc2hvdWxkIGJlIHNldCB0byB0cnVlLiBUaGlzIHdpbGwgc2NhbiB0aGUgQ2VydGlmaWNhdGlvblJlcXVlc3RJbmZvIHBhcnQgb2ZcbiAqIHRoZSBBU04uMSBvYmplY3Qgd2hpbGUgaXQgaXMgY29udmVydGVkIHNvIGl0IGRvZXNuJ3QgbmVlZCB0byBiZSBjb252ZXJ0ZWRcbiAqIGJhY2sgdG8gQVNOLjEtREVSLWVuY29kaW5nIGxhdGVyLlxuICpcbiAqIEBwYXJhbSBwZW0gdGhlIFBFTS1mb3JtYXR0ZWQgY2VydGlmaWNhdGUuXG4gKiBAcGFyYW0gY29tcHV0ZUhhc2ggdHJ1ZSB0byBjb21wdXRlIHRoZSBoYXNoIGZvciB2ZXJpZmljYXRpb24uXG4gKiBAcGFyYW0gc3RyaWN0IHRydWUgdG8gYmUgc3RyaWN0IHdoZW4gY2hlY2tpbmcgQVNOLjEgdmFsdWUgbGVuZ3RocywgZmFsc2UgdG9cbiAqICAgICAgICAgIGFsbG93IHRydW5jYXRlZCB2YWx1ZXMgKGRlZmF1bHQ6IHRydWUpLlxuICpcbiAqIEByZXR1cm4gdGhlIGNlcnRpZmljYXRpb24gcmVxdWVzdCAoQ1NSKS5cbiAqL1xucGtpLmNlcnRpZmljYXRpb25SZXF1ZXN0RnJvbVBlbSA9IGZ1bmN0aW9uKHBlbSwgY29tcHV0ZUhhc2gsIHN0cmljdCkge1xuICB2YXIgbXNnID0gZm9yZ2UucGVtLmRlY29kZShwZW0pWzBdO1xuXG4gIGlmKG1zZy50eXBlICE9PSAnQ0VSVElGSUNBVEUgUkVRVUVTVCcpIHtcbiAgICB2YXIgZXJyb3IgPSBuZXcgRXJyb3IoJ0NvdWxkIG5vdCBjb252ZXJ0IGNlcnRpZmljYXRpb24gcmVxdWVzdCBmcm9tIFBFTTsgJyArXG4gICAgICAnUEVNIGhlYWRlciB0eXBlIGlzIG5vdCBcIkNFUlRJRklDQVRFIFJFUVVFU1RcIi4nKTtcbiAgICBlcnJvci5oZWFkZXJUeXBlID0gbXNnLnR5cGU7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbiAgaWYobXNnLnByb2NUeXBlICYmIG1zZy5wcm9jVHlwZS50eXBlID09PSAnRU5DUllQVEVEJykge1xuICAgIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IGNvbnZlcnQgY2VydGlmaWNhdGlvbiByZXF1ZXN0IGZyb20gUEVNOyAnICtcbiAgICAgICdQRU0gaXMgZW5jcnlwdGVkLicpO1xuICB9XG5cbiAgLy8gY29udmVydCBERVIgdG8gQVNOLjEgb2JqZWN0XG4gIHZhciBvYmogPSBhc24xLmZyb21EZXIobXNnLmJvZHksIHN0cmljdCk7XG5cbiAgcmV0dXJuIHBraS5jZXJ0aWZpY2F0aW9uUmVxdWVzdEZyb21Bc24xKG9iaiwgY29tcHV0ZUhhc2gpO1xufTtcblxuLyoqXG4gKiBDb252ZXJ0cyBhIFBLQ1MjMTAgY2VydGlmaWNhdGlvbiByZXF1ZXN0IChDU1IpIHRvIFBFTSBmb3JtYXQuXG4gKlxuICogQHBhcmFtIGNzciB0aGUgY2VydGlmaWNhdGlvbiByZXF1ZXN0LlxuICogQHBhcmFtIG1heGxpbmUgdGhlIG1heGltdW0gY2hhcmFjdGVycyBwZXIgbGluZSwgZGVmYXVsdHMgdG8gNjQuXG4gKlxuICogQHJldHVybiB0aGUgUEVNLWZvcm1hdHRlZCBjZXJ0aWZpY2F0aW9uIHJlcXVlc3QuXG4gKi9cbnBraS5jZXJ0aWZpY2F0aW9uUmVxdWVzdFRvUGVtID0gZnVuY3Rpb24oY3NyLCBtYXhsaW5lKSB7XG4gIC8vIGNvbnZlcnQgdG8gQVNOLjEsIHRoZW4gREVSLCB0aGVuIFBFTS1lbmNvZGVcbiAgdmFyIG1zZyA9IHtcbiAgICB0eXBlOiAnQ0VSVElGSUNBVEUgUkVRVUVTVCcsXG4gICAgYm9keTogYXNuMS50b0Rlcihwa2kuY2VydGlmaWNhdGlvblJlcXVlc3RUb0FzbjEoY3NyKSkuZ2V0Qnl0ZXMoKVxuICB9O1xuICByZXR1cm4gZm9yZ2UucGVtLmVuY29kZShtc2csIHttYXhsaW5lOiBtYXhsaW5lfSk7XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gZW1wdHkgWC41MDl2MyBSU0EgY2VydGlmaWNhdGUuXG4gKlxuICogQHJldHVybiB0aGUgY2VydGlmaWNhdGUuXG4gKi9cbnBraS5jcmVhdGVDZXJ0aWZpY2F0ZSA9IGZ1bmN0aW9uKCkge1xuICB2YXIgY2VydCA9IHt9O1xuICBjZXJ0LnZlcnNpb24gPSAweDAyO1xuICBjZXJ0LnNlcmlhbE51bWJlciA9ICcwMCc7XG4gIGNlcnQuc2lnbmF0dXJlT2lkID0gbnVsbDtcbiAgY2VydC5zaWduYXR1cmUgPSBudWxsO1xuICBjZXJ0LnNpZ2luZm8gPSB7fTtcbiAgY2VydC5zaWdpbmZvLmFsZ29yaXRobU9pZCA9IG51bGw7XG4gIGNlcnQudmFsaWRpdHkgPSB7fTtcbiAgY2VydC52YWxpZGl0eS5ub3RCZWZvcmUgPSBuZXcgRGF0ZSgpO1xuICBjZXJ0LnZhbGlkaXR5Lm5vdEFmdGVyID0gbmV3IERhdGUoKTtcblxuICBjZXJ0Lmlzc3VlciA9IHt9O1xuICBjZXJ0Lmlzc3Vlci5nZXRGaWVsZCA9IGZ1bmN0aW9uKHNuKSB7XG4gICAgcmV0dXJuIF9nZXRBdHRyaWJ1dGUoY2VydC5pc3N1ZXIsIHNuKTtcbiAgfTtcbiAgY2VydC5pc3N1ZXIuYWRkRmllbGQgPSBmdW5jdGlvbihhdHRyKSB7XG4gICAgX2ZpbGxNaXNzaW5nRmllbGRzKFthdHRyXSk7XG4gICAgY2VydC5pc3N1ZXIuYXR0cmlidXRlcy5wdXNoKGF0dHIpO1xuICB9O1xuICBjZXJ0Lmlzc3Vlci5hdHRyaWJ1dGVzID0gW107XG4gIGNlcnQuaXNzdWVyLmhhc2ggPSBudWxsO1xuXG4gIGNlcnQuc3ViamVjdCA9IHt9O1xuICBjZXJ0LnN1YmplY3QuZ2V0RmllbGQgPSBmdW5jdGlvbihzbikge1xuICAgIHJldHVybiBfZ2V0QXR0cmlidXRlKGNlcnQuc3ViamVjdCwgc24pO1xuICB9O1xuICBjZXJ0LnN1YmplY3QuYWRkRmllbGQgPSBmdW5jdGlvbihhdHRyKSB7XG4gICAgX2ZpbGxNaXNzaW5nRmllbGRzKFthdHRyXSk7XG4gICAgY2VydC5zdWJqZWN0LmF0dHJpYnV0ZXMucHVzaChhdHRyKTtcbiAgfTtcbiAgY2VydC5zdWJqZWN0LmF0dHJpYnV0ZXMgPSBbXTtcbiAgY2VydC5zdWJqZWN0Lmhhc2ggPSBudWxsO1xuXG4gIGNlcnQuZXh0ZW5zaW9ucyA9IFtdO1xuICBjZXJ0LnB1YmxpY0tleSA9IG51bGw7XG4gIGNlcnQubWQgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBzdWJqZWN0IG9mIHRoaXMgY2VydGlmaWNhdGUuXG4gICAqXG4gICAqIEBwYXJhbSBhdHRycyB0aGUgYXJyYXkgb2Ygc3ViamVjdCBhdHRyaWJ1dGVzIHRvIHVzZS5cbiAgICogQHBhcmFtIHVuaXF1ZUlkIGFuIG9wdGlvbmFsIGEgdW5pcXVlIElEIHRvIHVzZS5cbiAgICovXG4gIGNlcnQuc2V0U3ViamVjdCA9IGZ1bmN0aW9uKGF0dHJzLCB1bmlxdWVJZCkge1xuICAgIC8vIHNldCBuZXcgYXR0cmlidXRlcywgY2xlYXIgaGFzaFxuICAgIF9maWxsTWlzc2luZ0ZpZWxkcyhhdHRycyk7XG4gICAgY2VydC5zdWJqZWN0LmF0dHJpYnV0ZXMgPSBhdHRycztcbiAgICBkZWxldGUgY2VydC5zdWJqZWN0LnVuaXF1ZUlkO1xuICAgIGlmKHVuaXF1ZUlkKSB7XG4gICAgICAvLyBUT0RPOiBzdXBwb3J0IGFyYml0cmFyeSBiaXQgbGVuZ3RoIGlkc1xuICAgICAgY2VydC5zdWJqZWN0LnVuaXF1ZUlkID0gdW5pcXVlSWQ7XG4gICAgfVxuICAgIGNlcnQuc3ViamVjdC5oYXNoID0gbnVsbDtcbiAgfTtcblxuICAvKipcbiAgICogU2V0cyB0aGUgaXNzdWVyIG9mIHRoaXMgY2VydGlmaWNhdGUuXG4gICAqXG4gICAqIEBwYXJhbSBhdHRycyB0aGUgYXJyYXkgb2YgaXNzdWVyIGF0dHJpYnV0ZXMgdG8gdXNlLlxuICAgKiBAcGFyYW0gdW5pcXVlSWQgYW4gb3B0aW9uYWwgYSB1bmlxdWUgSUQgdG8gdXNlLlxuICAgKi9cbiAgY2VydC5zZXRJc3N1ZXIgPSBmdW5jdGlvbihhdHRycywgdW5pcXVlSWQpIHtcbiAgICAvLyBzZXQgbmV3IGF0dHJpYnV0ZXMsIGNsZWFyIGhhc2hcbiAgICBfZmlsbE1pc3NpbmdGaWVsZHMoYXR0cnMpO1xuICAgIGNlcnQuaXNzdWVyLmF0dHJpYnV0ZXMgPSBhdHRycztcbiAgICBkZWxldGUgY2VydC5pc3N1ZXIudW5pcXVlSWQ7XG4gICAgaWYodW5pcXVlSWQpIHtcbiAgICAgIC8vIFRPRE86IHN1cHBvcnQgYXJiaXRyYXJ5IGJpdCBsZW5ndGggaWRzXG4gICAgICBjZXJ0Lmlzc3Vlci51bmlxdWVJZCA9IHVuaXF1ZUlkO1xuICAgIH1cbiAgICBjZXJ0Lmlzc3Vlci5oYXNoID0gbnVsbDtcbiAgfTtcblxuICAvKipcbiAgICogU2V0cyB0aGUgZXh0ZW5zaW9ucyBvZiB0aGlzIGNlcnRpZmljYXRlLlxuICAgKlxuICAgKiBAcGFyYW0gZXh0cyB0aGUgYXJyYXkgb2YgZXh0ZW5zaW9ucyB0byB1c2UuXG4gICAqL1xuICBjZXJ0LnNldEV4dGVuc2lvbnMgPSBmdW5jdGlvbihleHRzKSB7XG4gICAgZm9yKHZhciBpID0gMDsgaSA8IGV4dHMubGVuZ3RoOyArK2kpIHtcbiAgICAgIF9maWxsTWlzc2luZ0V4dGVuc2lvbkZpZWxkcyhleHRzW2ldLCB7Y2VydDogY2VydH0pO1xuICAgIH1cbiAgICAvLyBzZXQgbmV3IGV4dGVuc2lvbnNcbiAgICBjZXJ0LmV4dGVuc2lvbnMgPSBleHRzO1xuICB9O1xuXG4gIC8qKlxuICAgKiBHZXRzIGFuIGV4dGVuc2lvbiBieSBpdHMgbmFtZSBvciBpZC5cbiAgICpcbiAgICogQHBhcmFtIG9wdGlvbnMgdGhlIG5hbWUgdG8gdXNlIG9yIGFuIG9iamVjdCB3aXRoOlxuICAgKiAgICAgICAgICBuYW1lIHRoZSBuYW1lIHRvIHVzZS5cbiAgICogICAgICAgICAgaWQgdGhlIGlkIHRvIHVzZS5cbiAgICpcbiAgICogQHJldHVybiB0aGUgZXh0ZW5zaW9uIG9yIG51bGwgaWYgbm90IGZvdW5kLlxuICAgKi9cbiAgY2VydC5nZXRFeHRlbnNpb24gPSBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgaWYodHlwZW9mIG9wdGlvbnMgPT09ICdzdHJpbmcnKSB7XG4gICAgICBvcHRpb25zID0ge25hbWU6IG9wdGlvbnN9O1xuICAgIH1cblxuICAgIHZhciBydmFsID0gbnVsbDtcbiAgICB2YXIgZXh0O1xuICAgIGZvcih2YXIgaSA9IDA7IHJ2YWwgPT09IG51bGwgJiYgaSA8IGNlcnQuZXh0ZW5zaW9ucy5sZW5ndGg7ICsraSkge1xuICAgICAgZXh0ID0gY2VydC5leHRlbnNpb25zW2ldO1xuICAgICAgaWYob3B0aW9ucy5pZCAmJiBleHQuaWQgPT09IG9wdGlvbnMuaWQpIHtcbiAgICAgICAgcnZhbCA9IGV4dDtcbiAgICAgIH0gZWxzZSBpZihvcHRpb25zLm5hbWUgJiYgZXh0Lm5hbWUgPT09IG9wdGlvbnMubmFtZSkge1xuICAgICAgICBydmFsID0gZXh0O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcnZhbDtcbiAgfTtcblxuICAvKipcbiAgICogU2lnbnMgdGhpcyBjZXJ0aWZpY2F0ZSB1c2luZyB0aGUgZ2l2ZW4gcHJpdmF0ZSBrZXkuXG4gICAqXG4gICAqIEBwYXJhbSBrZXkgdGhlIHByaXZhdGUga2V5IHRvIHNpZ24gd2l0aC5cbiAgICogQHBhcmFtIG1kIHRoZSBtZXNzYWdlIGRpZ2VzdCBvYmplY3QgdG8gdXNlIChkZWZhdWx0cyB0byBmb3JnZS5tZC5zaGExKS5cbiAgICovXG4gIGNlcnQuc2lnbiA9IGZ1bmN0aW9uKGtleSwgbWQpIHtcbiAgICAvLyBUT0RPOiBnZXQgc2lnbmF0dXJlIE9JRCBmcm9tIHByaXZhdGUga2V5XG4gICAgY2VydC5tZCA9IG1kIHx8IGZvcmdlLm1kLnNoYTEuY3JlYXRlKCk7XG4gICAgdmFyIGFsZ29yaXRobU9pZCA9IG9pZHNbY2VydC5tZC5hbGdvcml0aG0gKyAnV2l0aFJTQUVuY3J5cHRpb24nXTtcbiAgICBpZighYWxnb3JpdGhtT2lkKSB7XG4gICAgICB2YXIgZXJyb3IgPSBuZXcgRXJyb3IoJ0NvdWxkIG5vdCBjb21wdXRlIGNlcnRpZmljYXRlIGRpZ2VzdC4gJyArXG4gICAgICAgICdVbmtub3duIG1lc3NhZ2UgZGlnZXN0IGFsZ29yaXRobSBPSUQuJyk7XG4gICAgICBlcnJvci5hbGdvcml0aG0gPSBjZXJ0Lm1kLmFsZ29yaXRobTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgICBjZXJ0LnNpZ25hdHVyZU9pZCA9IGNlcnQuc2lnaW5mby5hbGdvcml0aG1PaWQgPSBhbGdvcml0aG1PaWQ7XG5cbiAgICAvLyBnZXQgVEJTQ2VydGlmaWNhdGUsIGNvbnZlcnQgdG8gREVSXG4gICAgY2VydC50YnNDZXJ0aWZpY2F0ZSA9IHBraS5nZXRUQlNDZXJ0aWZpY2F0ZShjZXJ0KTtcbiAgICB2YXIgYnl0ZXMgPSBhc24xLnRvRGVyKGNlcnQudGJzQ2VydGlmaWNhdGUpO1xuXG4gICAgLy8gZGlnZXN0IGFuZCBzaWduXG4gICAgY2VydC5tZC51cGRhdGUoYnl0ZXMuZ2V0Qnl0ZXMoKSk7XG4gICAgY2VydC5zaWduYXR1cmUgPSBrZXkuc2lnbihjZXJ0Lm1kKTtcbiAgfTtcblxuICAvKipcbiAgICogQXR0ZW1wdHMgdmVyaWZ5IHRoZSBzaWduYXR1cmUgb24gdGhlIHBhc3NlZCBjZXJ0aWZpY2F0ZSB1c2luZyB0aGlzXG4gICAqIGNlcnRpZmljYXRlJ3MgcHVibGljIGtleS5cbiAgICpcbiAgICogQHBhcmFtIGNoaWxkIHRoZSBjZXJ0aWZpY2F0ZSB0byB2ZXJpZnkuXG4gICAqXG4gICAqIEByZXR1cm4gdHJ1ZSBpZiB2ZXJpZmllZCwgZmFsc2UgaWYgbm90LlxuICAgKi9cbiAgY2VydC52ZXJpZnkgPSBmdW5jdGlvbihjaGlsZCkge1xuICAgIHZhciBydmFsID0gZmFsc2U7XG5cbiAgICBpZighY2VydC5pc3N1ZWQoY2hpbGQpKSB7XG4gICAgICB2YXIgaXNzdWVyID0gY2hpbGQuaXNzdWVyO1xuICAgICAgdmFyIHN1YmplY3QgPSBjZXJ0LnN1YmplY3Q7XG4gICAgICB2YXIgZXJyb3IgPSBuZXcgRXJyb3IoXG4gICAgICAgICdUaGUgcGFyZW50IGNlcnRpZmljYXRlIGRpZCBub3QgaXNzdWUgdGhlIGdpdmVuIGNoaWxkICcgK1xuICAgICAgICAnY2VydGlmaWNhdGU7IHRoZSBjaGlsZCBjZXJ0aWZpY2F0ZVxcJ3MgaXNzdWVyIGRvZXMgbm90IG1hdGNoIHRoZSAnICtcbiAgICAgICAgJ3BhcmVudFxcJ3Mgc3ViamVjdC4nKTtcbiAgICAgIGVycm9yLmV4cGVjdGVkSXNzdWVyID0gc3ViamVjdC5hdHRyaWJ1dGVzO1xuICAgICAgZXJyb3IuYWN0dWFsSXNzdWVyID0gaXNzdWVyLmF0dHJpYnV0ZXM7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG5cbiAgICB2YXIgbWQgPSBjaGlsZC5tZDtcbiAgICBpZihtZCA9PT0gbnVsbCkge1xuICAgICAgLy8gY3JlYXRlIGRpZ2VzdCBmb3IgT0lEIHNpZ25hdHVyZSB0eXBlc1xuICAgICAgbWQgPSBfY3JlYXRlU2lnbmF0dXJlRGlnZXN0KHtcbiAgICAgICAgc2lnbmF0dXJlT2lkOiBjaGlsZC5zaWduYXR1cmVPaWQsXG4gICAgICAgIHR5cGU6ICdjZXJ0aWZpY2F0ZSdcbiAgICAgIH0pO1xuXG4gICAgICAvLyBwcm9kdWNlIERFUiBmb3JtYXR0ZWQgVEJTQ2VydGlmaWNhdGUgYW5kIGRpZ2VzdCBpdFxuICAgICAgdmFyIHRic0NlcnRpZmljYXRlID0gY2hpbGQudGJzQ2VydGlmaWNhdGUgfHwgcGtpLmdldFRCU0NlcnRpZmljYXRlKGNoaWxkKTtcbiAgICAgIHZhciBieXRlcyA9IGFzbjEudG9EZXIodGJzQ2VydGlmaWNhdGUpO1xuICAgICAgbWQudXBkYXRlKGJ5dGVzLmdldEJ5dGVzKCkpO1xuICAgIH1cblxuICAgIGlmKG1kICE9PSBudWxsKSB7XG4gICAgICBydmFsID0gX3ZlcmlmeVNpZ25hdHVyZSh7XG4gICAgICAgIGNlcnRpZmljYXRlOiBjZXJ0LCBtZDogbWQsIHNpZ25hdHVyZTogY2hpbGQuc2lnbmF0dXJlXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcnZhbDtcbiAgfTtcblxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgY2VydGlmaWNhdGUncyBpc3N1ZXIgbWF0Y2hlcyB0aGUgcGFzc2VkXG4gICAqIGNlcnRpZmljYXRlJ3Mgc3ViamVjdC4gTm90ZSB0aGF0IG5vIHNpZ25hdHVyZSBjaGVjayBpcyBwZXJmb3JtZWQuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJlbnQgdGhlIGNlcnRpZmljYXRlIHRvIGNoZWNrLlxuICAgKlxuICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBjZXJ0aWZpY2F0ZSdzIGlzc3VlciBtYXRjaGVzIHRoZSBwYXNzZWQgY2VydGlmaWNhdGUnc1xuICAgKiAgICAgICAgIHN1YmplY3QuXG4gICAqL1xuICBjZXJ0LmlzSXNzdWVyID0gZnVuY3Rpb24ocGFyZW50KSB7XG4gICAgdmFyIHJ2YWwgPSBmYWxzZTtcblxuICAgIHZhciBpID0gY2VydC5pc3N1ZXI7XG4gICAgdmFyIHMgPSBwYXJlbnQuc3ViamVjdDtcblxuICAgIC8vIGNvbXBhcmUgaGFzaGVzIGlmIHByZXNlbnRcbiAgICBpZihpLmhhc2ggJiYgcy5oYXNoKSB7XG4gICAgICBydmFsID0gKGkuaGFzaCA9PT0gcy5oYXNoKTtcbiAgICB9IGVsc2UgaWYoaS5hdHRyaWJ1dGVzLmxlbmd0aCA9PT0gcy5hdHRyaWJ1dGVzLmxlbmd0aCkge1xuICAgICAgLy8gYWxsIGF0dHJpYnV0ZXMgYXJlIHRoZSBzYW1lIHNvIGlzc3VlciBtYXRjaGVzIHN1YmplY3RcbiAgICAgIHJ2YWwgPSB0cnVlO1xuICAgICAgdmFyIGlhdHRyLCBzYXR0cjtcbiAgICAgIGZvcih2YXIgbiA9IDA7IHJ2YWwgJiYgbiA8IGkuYXR0cmlidXRlcy5sZW5ndGg7ICsrbikge1xuICAgICAgICBpYXR0ciA9IGkuYXR0cmlidXRlc1tuXTtcbiAgICAgICAgc2F0dHIgPSBzLmF0dHJpYnV0ZXNbbl07XG4gICAgICAgIGlmKGlhdHRyLnR5cGUgIT09IHNhdHRyLnR5cGUgfHwgaWF0dHIudmFsdWUgIT09IHNhdHRyLnZhbHVlKSB7XG4gICAgICAgICAgLy8gYXR0cmlidXRlIG1pc21hdGNoXG4gICAgICAgICAgcnZhbCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJ2YWw7XG4gIH07XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGNlcnRpZmljYXRlJ3Mgc3ViamVjdCBtYXRjaGVzIHRoZSBpc3N1ZXIgb2YgdGhlXG4gICAqIGdpdmVuIGNlcnRpZmljYXRlKS4gTm90ZSB0aGF0IG5vdCBzaWduYXR1cmUgY2hlY2sgaXMgcGVyZm9ybWVkLlxuICAgKlxuICAgKiBAcGFyYW0gY2hpbGQgdGhlIGNlcnRpZmljYXRlIHRvIGNoZWNrLlxuICAgKlxuICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBjZXJ0aWZpY2F0ZSdzIHN1YmplY3QgbWF0Y2hlcyB0aGUgcGFzc2VkXG4gICAqICAgICAgICAgY2VydGlmaWNhdGUncyBpc3N1ZXIuXG4gICAqL1xuICBjZXJ0Lmlzc3VlZCA9IGZ1bmN0aW9uKGNoaWxkKSB7XG4gICAgcmV0dXJuIGNoaWxkLmlzSXNzdWVyKGNlcnQpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZXMgdGhlIHN1YmplY3RLZXlJZGVudGlmaWVyIGZvciB0aGlzIGNlcnRpZmljYXRlIGFzIGJ5dGUgYnVmZmVyLlxuICAgKlxuICAgKiBAcmV0dXJuIHRoZSBzdWJqZWN0S2V5SWRlbnRpZmllciBmb3IgdGhpcyBjZXJ0aWZpY2F0ZSBhcyBieXRlIGJ1ZmZlci5cbiAgICovXG4gIGNlcnQuZ2VuZXJhdGVTdWJqZWN0S2V5SWRlbnRpZmllciA9IGZ1bmN0aW9uKCkge1xuICAgIC8qIFNlZTogNC4yLjEuMiBzZWN0aW9uIG9mIHRoZSB0aGUgUkZDMzI4MCwga2V5SWRlbnRpZmllciBpcyBlaXRoZXI6XG5cbiAgICAgICgxKSBUaGUga2V5SWRlbnRpZmllciBpcyBjb21wb3NlZCBvZiB0aGUgMTYwLWJpdCBTSEEtMSBoYXNoIG9mIHRoZVxuICAgICAgICB2YWx1ZSBvZiB0aGUgQklUIFNUUklORyBzdWJqZWN0UHVibGljS2V5IChleGNsdWRpbmcgdGhlIHRhZyxcbiAgICAgICAgbGVuZ3RoLCBhbmQgbnVtYmVyIG9mIHVudXNlZCBiaXRzKS5cblxuICAgICAgKDIpIFRoZSBrZXlJZGVudGlmaWVyIGlzIGNvbXBvc2VkIG9mIGEgZm91ciBiaXQgdHlwZSBmaWVsZCB3aXRoXG4gICAgICAgIHRoZSB2YWx1ZSAwMTAwIGZvbGxvd2VkIGJ5IHRoZSBsZWFzdCBzaWduaWZpY2FudCA2MCBiaXRzIG9mIHRoZVxuICAgICAgICBTSEEtMSBoYXNoIG9mIHRoZSB2YWx1ZSBvZiB0aGUgQklUIFNUUklORyBzdWJqZWN0UHVibGljS2V5XG4gICAgICAgIChleGNsdWRpbmcgdGhlIHRhZywgbGVuZ3RoLCBhbmQgbnVtYmVyIG9mIHVudXNlZCBiaXQgc3RyaW5nIGJpdHMpLlxuICAgICovXG5cbiAgICAvLyBza2lwcGluZyB0aGUgdGFnLCBsZW5ndGgsIGFuZCBudW1iZXIgb2YgdW51c2VkIGJpdHMgaXMgdGhlIHNhbWVcbiAgICAvLyBhcyBqdXN0IHVzaW5nIHRoZSBSU0FQdWJsaWNLZXkgKGZvciBSU0Ega2V5cywgd2hpY2ggYXJlIHRoZVxuICAgIC8vIG9ubHkgb25lcyBzdXBwb3J0ZWQpXG4gICAgcmV0dXJuIHBraS5nZXRQdWJsaWNLZXlGaW5nZXJwcmludChjZXJ0LnB1YmxpY0tleSwge3R5cGU6ICdSU0FQdWJsaWNLZXknfSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIHRoZSBzdWJqZWN0S2V5SWRlbnRpZmllciBleHRlbnNpb24gdmFsdWUgZm9yIHRoaXMgY2VydGlmaWNhdGVcbiAgICogYWdhaW5zdCBpdHMgcHVibGljIGtleS4gSWYgbm8gZXh0ZW5zaW9uIGlzIGZvdW5kLCBmYWxzZSB3aWxsIGJlXG4gICAqIHJldHVybmVkLlxuICAgKlxuICAgKiBAcmV0dXJuIHRydWUgaWYgdmVyaWZpZWQsIGZhbHNlIGlmIG5vdC5cbiAgICovXG4gIGNlcnQudmVyaWZ5U3ViamVjdEtleUlkZW50aWZpZXIgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgb2lkID0gb2lkc1snc3ViamVjdEtleUlkZW50aWZpZXInXTtcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgY2VydC5leHRlbnNpb25zLmxlbmd0aDsgKytpKSB7XG4gICAgICB2YXIgZXh0ID0gY2VydC5leHRlbnNpb25zW2ldO1xuICAgICAgaWYoZXh0LmlkID09PSBvaWQpIHtcbiAgICAgICAgdmFyIHNraSA9IGNlcnQuZ2VuZXJhdGVTdWJqZWN0S2V5SWRlbnRpZmllcigpLmdldEJ5dGVzKCk7XG4gICAgICAgIHJldHVybiAoZm9yZ2UudXRpbC5oZXhUb0J5dGVzKGV4dC5zdWJqZWN0S2V5SWRlbnRpZmllcikgPT09IHNraSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcblxuICByZXR1cm4gY2VydDtcbn07XG5cbi8qKlxuICogQ29udmVydHMgYW4gWC41MDl2MyBSU0EgY2VydGlmaWNhdGUgZnJvbSBhbiBBU04uMSBvYmplY3QuXG4gKlxuICogTm90ZTogSWYgdGhlIGNlcnRpZmljYXRlIGlzIHRvIGJlIHZlcmlmaWVkIHRoZW4gY29tcHV0ZSBoYXNoIHNob3VsZFxuICogYmUgc2V0IHRvIHRydWUuIFRoZXJlIGlzIGN1cnJlbnRseSBubyBpbXBsZW1lbnRhdGlvbiBmb3IgY29udmVydGluZ1xuICogYSBjZXJ0aWZpY2F0ZSBiYWNrIHRvIEFTTi4xIHNvIHRoZSBUQlNDZXJ0aWZpY2F0ZSBwYXJ0IG9mIHRoZSBBU04uMVxuICogb2JqZWN0IG5lZWRzIHRvIGJlIHNjYW5uZWQgYmVmb3JlIHRoZSBjZXJ0IG9iamVjdCBpcyBjcmVhdGVkLlxuICpcbiAqIEBwYXJhbSBvYmogdGhlIGFzbjEgcmVwcmVzZW50YXRpb24gb2YgYW4gWC41MDl2MyBSU0EgY2VydGlmaWNhdGUuXG4gKiBAcGFyYW0gY29tcHV0ZUhhc2ggdHJ1ZSB0byBjb21wdXRlIHRoZSBoYXNoIGZvciB2ZXJpZmljYXRpb24uXG4gKlxuICogQHJldHVybiB0aGUgY2VydGlmaWNhdGUuXG4gKi9cbnBraS5jZXJ0aWZpY2F0ZUZyb21Bc24xID0gZnVuY3Rpb24ob2JqLCBjb21wdXRlSGFzaCkge1xuICAvLyB2YWxpZGF0ZSBjZXJ0aWZpY2F0ZSBhbmQgY2FwdHVyZSBkYXRhXG4gIHZhciBjYXB0dXJlID0ge307XG4gIHZhciBlcnJvcnMgPSBbXTtcbiAgaWYoIWFzbjEudmFsaWRhdGUob2JqLCB4NTA5Q2VydGlmaWNhdGVWYWxpZGF0b3IsIGNhcHR1cmUsIGVycm9ycykpIHtcbiAgICB2YXIgZXJyb3IgPSBuZXcgRXJyb3IoJ0Nhbm5vdCByZWFkIFguNTA5IGNlcnRpZmljYXRlLiAnICtcbiAgICAgICdBU04uMSBvYmplY3QgaXMgbm90IGFuIFg1MDl2MyBDZXJ0aWZpY2F0ZS4nKTtcbiAgICBlcnJvci5lcnJvcnMgPSBlcnJvcnM7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cblxuICAvLyBnZXQgb2lkXG4gIHZhciBvaWQgPSBhc24xLmRlclRvT2lkKGNhcHR1cmUucHVibGljS2V5T2lkKTtcbiAgaWYob2lkICE9PSBwa2kub2lkcy5yc2FFbmNyeXB0aW9uKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgcmVhZCBwdWJsaWMga2V5LiBPSUQgaXMgbm90IFJTQS4nKTtcbiAgfVxuXG4gIC8vIGNyZWF0ZSBjZXJ0aWZpY2F0ZVxuICB2YXIgY2VydCA9IHBraS5jcmVhdGVDZXJ0aWZpY2F0ZSgpO1xuICBjZXJ0LnZlcnNpb24gPSBjYXB0dXJlLmNlcnRWZXJzaW9uID9cbiAgICBjYXB0dXJlLmNlcnRWZXJzaW9uLmNoYXJDb2RlQXQoMCkgOiAwO1xuICB2YXIgc2VyaWFsID0gZm9yZ2UudXRpbC5jcmVhdGVCdWZmZXIoY2FwdHVyZS5jZXJ0U2VyaWFsTnVtYmVyKTtcbiAgY2VydC5zZXJpYWxOdW1iZXIgPSBzZXJpYWwudG9IZXgoKTtcbiAgY2VydC5zaWduYXR1cmVPaWQgPSBmb3JnZS5hc24xLmRlclRvT2lkKGNhcHR1cmUuY2VydFNpZ25hdHVyZU9pZCk7XG4gIGNlcnQuc2lnbmF0dXJlUGFyYW1ldGVycyA9IF9yZWFkU2lnbmF0dXJlUGFyYW1ldGVycyhcbiAgICBjZXJ0LnNpZ25hdHVyZU9pZCwgY2FwdHVyZS5jZXJ0U2lnbmF0dXJlUGFyYW1zLCB0cnVlKTtcbiAgY2VydC5zaWdpbmZvLmFsZ29yaXRobU9pZCA9IGZvcmdlLmFzbjEuZGVyVG9PaWQoY2FwdHVyZS5jZXJ0aW5mb1NpZ25hdHVyZU9pZCk7XG4gIGNlcnQuc2lnaW5mby5wYXJhbWV0ZXJzID0gX3JlYWRTaWduYXR1cmVQYXJhbWV0ZXJzKGNlcnQuc2lnaW5mby5hbGdvcml0aG1PaWQsXG4gICAgY2FwdHVyZS5jZXJ0aW5mb1NpZ25hdHVyZVBhcmFtcywgZmFsc2UpO1xuICBjZXJ0LnNpZ25hdHVyZSA9IGNhcHR1cmUuY2VydFNpZ25hdHVyZTtcblxuICB2YXIgdmFsaWRpdHkgPSBbXTtcbiAgaWYoY2FwdHVyZS5jZXJ0VmFsaWRpdHkxVVRDVGltZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgdmFsaWRpdHkucHVzaChhc24xLnV0Y1RpbWVUb0RhdGUoY2FwdHVyZS5jZXJ0VmFsaWRpdHkxVVRDVGltZSkpO1xuICB9XG4gIGlmKGNhcHR1cmUuY2VydFZhbGlkaXR5MkdlbmVyYWxpemVkVGltZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgdmFsaWRpdHkucHVzaChhc24xLmdlbmVyYWxpemVkVGltZVRvRGF0ZShcbiAgICAgIGNhcHR1cmUuY2VydFZhbGlkaXR5MkdlbmVyYWxpemVkVGltZSkpO1xuICB9XG4gIGlmKGNhcHR1cmUuY2VydFZhbGlkaXR5M1VUQ1RpbWUgIT09IHVuZGVmaW5lZCkge1xuICAgIHZhbGlkaXR5LnB1c2goYXNuMS51dGNUaW1lVG9EYXRlKGNhcHR1cmUuY2VydFZhbGlkaXR5M1VUQ1RpbWUpKTtcbiAgfVxuICBpZihjYXB0dXJlLmNlcnRWYWxpZGl0eTRHZW5lcmFsaXplZFRpbWUgIT09IHVuZGVmaW5lZCkge1xuICAgIHZhbGlkaXR5LnB1c2goYXNuMS5nZW5lcmFsaXplZFRpbWVUb0RhdGUoXG4gICAgICBjYXB0dXJlLmNlcnRWYWxpZGl0eTRHZW5lcmFsaXplZFRpbWUpKTtcbiAgfVxuICBpZih2YWxpZGl0eS5sZW5ndGggPiAyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgcmVhZCBub3RCZWZvcmUvbm90QWZ0ZXIgdmFsaWRpdHkgdGltZXM7IG1vcmUgJyArXG4gICAgICAndGhhbiB0d28gdGltZXMgd2VyZSBwcm92aWRlZCBpbiB0aGUgY2VydGlmaWNhdGUuJyk7XG4gIH1cbiAgaWYodmFsaWRpdHkubGVuZ3RoIDwgMikge1xuICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHJlYWQgbm90QmVmb3JlL25vdEFmdGVyIHZhbGlkaXR5IHRpbWVzOyB0aGV5ICcgK1xuICAgICAgJ3dlcmUgbm90IHByb3ZpZGVkIGFzIGVpdGhlciBVVENUaW1lIG9yIEdlbmVyYWxpemVkVGltZS4nKTtcbiAgfVxuICBjZXJ0LnZhbGlkaXR5Lm5vdEJlZm9yZSA9IHZhbGlkaXR5WzBdO1xuICBjZXJ0LnZhbGlkaXR5Lm5vdEFmdGVyID0gdmFsaWRpdHlbMV07XG5cbiAgLy8ga2VlcCBUQlNDZXJ0aWZpY2F0ZSB0byBwcmVzZXJ2ZSBzaWduYXR1cmUgd2hlbiBleHBvcnRpbmdcbiAgY2VydC50YnNDZXJ0aWZpY2F0ZSA9IGNhcHR1cmUudGJzQ2VydGlmaWNhdGU7XG5cbiAgaWYoY29tcHV0ZUhhc2gpIHtcbiAgICAvLyBjcmVhdGUgZGlnZXN0IGZvciBPSUQgc2lnbmF0dXJlIHR5cGVcbiAgICBjZXJ0Lm1kID0gX2NyZWF0ZVNpZ25hdHVyZURpZ2VzdCh7XG4gICAgICBzaWduYXR1cmVPaWQ6IGNlcnQuc2lnbmF0dXJlT2lkLFxuICAgICAgdHlwZTogJ2NlcnRpZmljYXRlJ1xuICAgIH0pO1xuXG4gICAgLy8gcHJvZHVjZSBERVIgZm9ybWF0dGVkIFRCU0NlcnRpZmljYXRlIGFuZCBkaWdlc3QgaXRcbiAgICB2YXIgYnl0ZXMgPSBhc24xLnRvRGVyKGNlcnQudGJzQ2VydGlmaWNhdGUpO1xuICAgIGNlcnQubWQudXBkYXRlKGJ5dGVzLmdldEJ5dGVzKCkpO1xuICB9XG5cbiAgLy8gaGFuZGxlIGlzc3VlciwgYnVpbGQgaXNzdWVyIG1lc3NhZ2UgZGlnZXN0XG4gIHZhciBpbWQgPSBmb3JnZS5tZC5zaGExLmNyZWF0ZSgpO1xuICB2YXIgaWJ5dGVzID0gYXNuMS50b0RlcihjYXB0dXJlLmNlcnRJc3N1ZXIpO1xuICBpbWQudXBkYXRlKGlieXRlcy5nZXRCeXRlcygpKTtcbiAgY2VydC5pc3N1ZXIuZ2V0RmllbGQgPSBmdW5jdGlvbihzbikge1xuICAgIHJldHVybiBfZ2V0QXR0cmlidXRlKGNlcnQuaXNzdWVyLCBzbik7XG4gIH07XG4gIGNlcnQuaXNzdWVyLmFkZEZpZWxkID0gZnVuY3Rpb24oYXR0cikge1xuICAgIF9maWxsTWlzc2luZ0ZpZWxkcyhbYXR0cl0pO1xuICAgIGNlcnQuaXNzdWVyLmF0dHJpYnV0ZXMucHVzaChhdHRyKTtcbiAgfTtcbiAgY2VydC5pc3N1ZXIuYXR0cmlidXRlcyA9IHBraS5SRE5BdHRyaWJ1dGVzQXNBcnJheShjYXB0dXJlLmNlcnRJc3N1ZXIpO1xuICBpZihjYXB0dXJlLmNlcnRJc3N1ZXJVbmlxdWVJZCkge1xuICAgIGNlcnQuaXNzdWVyLnVuaXF1ZUlkID0gY2FwdHVyZS5jZXJ0SXNzdWVyVW5pcXVlSWQ7XG4gIH1cbiAgY2VydC5pc3N1ZXIuaGFzaCA9IGltZC5kaWdlc3QoKS50b0hleCgpO1xuXG4gIC8vIGhhbmRsZSBzdWJqZWN0LCBidWlsZCBzdWJqZWN0IG1lc3NhZ2UgZGlnZXN0XG4gIHZhciBzbWQgPSBmb3JnZS5tZC5zaGExLmNyZWF0ZSgpO1xuICB2YXIgc2J5dGVzID0gYXNuMS50b0RlcihjYXB0dXJlLmNlcnRTdWJqZWN0KTtcbiAgc21kLnVwZGF0ZShzYnl0ZXMuZ2V0Qnl0ZXMoKSk7XG4gIGNlcnQuc3ViamVjdC5nZXRGaWVsZCA9IGZ1bmN0aW9uKHNuKSB7XG4gICAgcmV0dXJuIF9nZXRBdHRyaWJ1dGUoY2VydC5zdWJqZWN0LCBzbik7XG4gIH07XG4gIGNlcnQuc3ViamVjdC5hZGRGaWVsZCA9IGZ1bmN0aW9uKGF0dHIpIHtcbiAgICBfZmlsbE1pc3NpbmdGaWVsZHMoW2F0dHJdKTtcbiAgICBjZXJ0LnN1YmplY3QuYXR0cmlidXRlcy5wdXNoKGF0dHIpO1xuICB9O1xuICBjZXJ0LnN1YmplY3QuYXR0cmlidXRlcyA9IHBraS5SRE5BdHRyaWJ1dGVzQXNBcnJheShjYXB0dXJlLmNlcnRTdWJqZWN0KTtcbiAgaWYoY2FwdHVyZS5jZXJ0U3ViamVjdFVuaXF1ZUlkKSB7XG4gICAgY2VydC5zdWJqZWN0LnVuaXF1ZUlkID0gY2FwdHVyZS5jZXJ0U3ViamVjdFVuaXF1ZUlkO1xuICB9XG4gIGNlcnQuc3ViamVjdC5oYXNoID0gc21kLmRpZ2VzdCgpLnRvSGV4KCk7XG5cbiAgLy8gaGFuZGxlIGV4dGVuc2lvbnNcbiAgaWYoY2FwdHVyZS5jZXJ0RXh0ZW5zaW9ucykge1xuICAgIGNlcnQuZXh0ZW5zaW9ucyA9IHBraS5jZXJ0aWZpY2F0ZUV4dGVuc2lvbnNGcm9tQXNuMShjYXB0dXJlLmNlcnRFeHRlbnNpb25zKTtcbiAgfSBlbHNlIHtcbiAgICBjZXJ0LmV4dGVuc2lvbnMgPSBbXTtcbiAgfVxuXG4gIC8vIGNvbnZlcnQgUlNBIHB1YmxpYyBrZXkgZnJvbSBBU04uMVxuICBjZXJ0LnB1YmxpY0tleSA9IHBraS5wdWJsaWNLZXlGcm9tQXNuMShjYXB0dXJlLnN1YmplY3RQdWJsaWNLZXlJbmZvKTtcblxuICByZXR1cm4gY2VydDtcbn07XG5cbi8qKlxuICogQ29udmVydHMgYW4gQVNOLjEgZXh0ZW5zaW9ucyBvYmplY3QgKHdpdGggZXh0ZW5zaW9uIHNlcXVlbmNlcyBhcyBpdHNcbiAqIHZhbHVlcykgaW50byBhbiBhcnJheSBvZiBleHRlbnNpb24gb2JqZWN0cyB3aXRoIHR5cGVzIGFuZCB2YWx1ZXMuXG4gKlxuICogU3VwcG9ydGVkIGV4dGVuc2lvbnM6XG4gKlxuICogaWQtY2Uta2V5VXNhZ2UgT0JKRUNUIElERU5USUZJRVIgOjo9ICB7IGlkLWNlIDE1IH1cbiAqIEtleVVzYWdlIDo6PSBCSVQgU1RSSU5HIHtcbiAqICAgZGlnaXRhbFNpZ25hdHVyZSAgICAgICAgKDApLFxuICogICBub25SZXB1ZGlhdGlvbiAgICAgICAgICAoMSksXG4gKiAgIGtleUVuY2lwaGVybWVudCAgICAgICAgICgyKSxcbiAqICAgZGF0YUVuY2lwaGVybWVudCAgICAgICAgKDMpLFxuICogICBrZXlBZ3JlZW1lbnQgICAgICAgICAgICAoNCksXG4gKiAgIGtleUNlcnRTaWduICAgICAgICAgICAgICg1KSxcbiAqICAgY1JMU2lnbiAgICAgICAgICAgICAgICAgKDYpLFxuICogICBlbmNpcGhlck9ubHkgICAgICAgICAgICAoNyksXG4gKiAgIGRlY2lwaGVyT25seSAgICAgICAgICAgICg4KVxuICogfVxuICpcbiAqIGlkLWNlLWJhc2ljQ29uc3RyYWludHMgT0JKRUNUIElERU5USUZJRVIgOjo9ICB7IGlkLWNlIDE5IH1cbiAqIEJhc2ljQ29uc3RyYWludHMgOjo9IFNFUVVFTkNFIHtcbiAqICAgY0EgICAgICAgICAgICAgICAgICAgICAgQk9PTEVBTiBERUZBVUxUIEZBTFNFLFxuICogICBwYXRoTGVuQ29uc3RyYWludCAgICAgICBJTlRFR0VSICgwLi5NQVgpIE9QVElPTkFMXG4gKiB9XG4gKlxuICogc3ViamVjdEFsdE5hbWUgRVhURU5TSU9OIDo6PSB7XG4gKiAgIFNZTlRBWCBHZW5lcmFsTmFtZXNcbiAqICAgSURFTlRJRklFRCBCWSBpZC1jZS1zdWJqZWN0QWx0TmFtZVxuICogfVxuICpcbiAqIEdlbmVyYWxOYW1lcyA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4uTUFYKSBPRiBHZW5lcmFsTmFtZVxuICpcbiAqIEdlbmVyYWxOYW1lIDo6PSBDSE9JQ0Uge1xuICogICBvdGhlck5hbWUgICAgICBbMF0gSU5TVEFOQ0UgT0YgT1RIRVItTkFNRSxcbiAqICAgcmZjODIyTmFtZSAgICAgWzFdIElBNVN0cmluZyxcbiAqICAgZE5TTmFtZSAgICAgICAgWzJdIElBNVN0cmluZyxcbiAqICAgeDQwMEFkZHJlc3MgICAgWzNdIE9SQWRkcmVzcyxcbiAqICAgZGlyZWN0b3J5TmFtZSAgWzRdIE5hbWUsXG4gKiAgIGVkaVBhcnR5TmFtZSAgIFs1XSBFRElQYXJ0eU5hbWUsXG4gKiAgIHVuaWZvcm1SZXNvdXJjZUlkZW50aWZpZXIgWzZdIElBNVN0cmluZyxcbiAqICAgSVBBZGRyZXNzICAgICAgWzddIE9DVEVUIFNUUklORyxcbiAqICAgcmVnaXN0ZXJlZElEICAgWzhdIE9CSkVDVCBJREVOVElGSUVSXG4gKiB9XG4gKlxuICogT1RIRVItTkFNRSA6Oj0gVFlQRS1JREVOVElGSUVSXG4gKlxuICogRURJUGFydHlOYW1lIDo6PSBTRVFVRU5DRSB7XG4gKiAgIG5hbWVBc3NpZ25lciBbMF0gRGlyZWN0b3J5U3RyaW5nIHt1Yi1uYW1lfSBPUFRJT05BTCxcbiAqICAgcGFydHlOYW1lICAgIFsxXSBEaXJlY3RvcnlTdHJpbmcge3ViLW5hbWV9XG4gKiB9XG4gKlxuICogQHBhcmFtIGV4dHMgdGhlIGV4dGVuc2lvbnMgQVNOLjEgd2l0aCBleHRlbnNpb24gc2VxdWVuY2VzIHRvIHBhcnNlLlxuICpcbiAqIEByZXR1cm4gdGhlIGFycmF5LlxuICovXG5wa2kuY2VydGlmaWNhdGVFeHRlbnNpb25zRnJvbUFzbjEgPSBmdW5jdGlvbihleHRzKSB7XG4gIHZhciBydmFsID0gW107XG4gIGZvcih2YXIgaSA9IDA7IGkgPCBleHRzLnZhbHVlLmxlbmd0aDsgKytpKSB7XG4gICAgLy8gZ2V0IGV4dGVuc2lvbiBzZXF1ZW5jZVxuICAgIHZhciBleHRzZXEgPSBleHRzLnZhbHVlW2ldO1xuICAgIGZvcih2YXIgZWkgPSAwOyBlaSA8IGV4dHNlcS52YWx1ZS5sZW5ndGg7ICsrZWkpIHtcbiAgICAgIHJ2YWwucHVzaChwa2kuY2VydGlmaWNhdGVFeHRlbnNpb25Gcm9tQXNuMShleHRzZXEudmFsdWVbZWldKSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJ2YWw7XG59O1xuXG4vKipcbiAqIFBhcnNlcyBhIHNpbmdsZSBjZXJ0aWZpY2F0ZSBleHRlbnNpb24gZnJvbSBBU04uMS5cbiAqXG4gKiBAcGFyYW0gZXh0IHRoZSBleHRlbnNpb24gaW4gQVNOLjEgZm9ybWF0LlxuICpcbiAqIEByZXR1cm4gdGhlIHBhcnNlZCBleHRlbnNpb24gYXMgYW4gb2JqZWN0LlxuICovXG5wa2kuY2VydGlmaWNhdGVFeHRlbnNpb25Gcm9tQXNuMSA9IGZ1bmN0aW9uKGV4dCkge1xuICAvLyBhbiBleHRlbnNpb24gaGFzOlxuICAvLyBbMF0gZXh0bklEICAgICAgT0JKRUNUIElERU5USUZJRVJcbiAgLy8gWzFdIGNyaXRpY2FsICAgIEJPT0xFQU4gREVGQVVMVCBGQUxTRVxuICAvLyBbMl0gZXh0blZhbHVlICAgT0NURVQgU1RSSU5HXG4gIHZhciBlID0ge307XG4gIGUuaWQgPSBhc24xLmRlclRvT2lkKGV4dC52YWx1ZVswXS52YWx1ZSk7XG4gIGUuY3JpdGljYWwgPSBmYWxzZTtcbiAgaWYoZXh0LnZhbHVlWzFdLnR5cGUgPT09IGFzbjEuVHlwZS5CT09MRUFOKSB7XG4gICAgZS5jcml0aWNhbCA9IChleHQudmFsdWVbMV0udmFsdWUuY2hhckNvZGVBdCgwKSAhPT0gMHgwMCk7XG4gICAgZS52YWx1ZSA9IGV4dC52YWx1ZVsyXS52YWx1ZTtcbiAgfSBlbHNlIHtcbiAgICBlLnZhbHVlID0gZXh0LnZhbHVlWzFdLnZhbHVlO1xuICB9XG4gIC8vIGlmIHRoZSBvaWQgaXMga25vd24sIGdldCBpdHMgbmFtZVxuICBpZihlLmlkIGluIG9pZHMpIHtcbiAgICBlLm5hbWUgPSBvaWRzW2UuaWRdO1xuXG4gICAgLy8gaGFuZGxlIGtleSB1c2FnZVxuICAgIGlmKGUubmFtZSA9PT0gJ2tleVVzYWdlJykge1xuICAgICAgLy8gZ2V0IHZhbHVlIGFzIEJJVCBTVFJJTkdcbiAgICAgIHZhciBldiA9IGFzbjEuZnJvbURlcihlLnZhbHVlKTtcbiAgICAgIHZhciBiMiA9IDB4MDA7XG4gICAgICB2YXIgYjMgPSAweDAwO1xuICAgICAgaWYoZXYudmFsdWUubGVuZ3RoID4gMSkge1xuICAgICAgICAvLyBza2lwIGZpcnN0IGJ5dGUsIGp1c3QgaW5kaWNhdGVzIHVudXNlZCBiaXRzIHdoaWNoXG4gICAgICAgIC8vIHdpbGwgYmUgcGFkZGVkIHdpdGggMHMgYW55d2F5XG4gICAgICAgIC8vIGdldCBieXRlcyB3aXRoIGZsYWcgYml0c1xuICAgICAgICBiMiA9IGV2LnZhbHVlLmNoYXJDb2RlQXQoMSk7XG4gICAgICAgIGIzID0gZXYudmFsdWUubGVuZ3RoID4gMiA/IGV2LnZhbHVlLmNoYXJDb2RlQXQoMikgOiAwO1xuICAgICAgfVxuICAgICAgLy8gc2V0IGZsYWdzXG4gICAgICBlLmRpZ2l0YWxTaWduYXR1cmUgPSAoYjIgJiAweDgwKSA9PT0gMHg4MDtcbiAgICAgIGUubm9uUmVwdWRpYXRpb24gPSAoYjIgJiAweDQwKSA9PT0gMHg0MDtcbiAgICAgIGUua2V5RW5jaXBoZXJtZW50ID0gKGIyICYgMHgyMCkgPT09IDB4MjA7XG4gICAgICBlLmRhdGFFbmNpcGhlcm1lbnQgPSAoYjIgJiAweDEwKSA9PT0gMHgxMDtcbiAgICAgIGUua2V5QWdyZWVtZW50ID0gKGIyICYgMHgwOCkgPT09IDB4MDg7XG4gICAgICBlLmtleUNlcnRTaWduID0gKGIyICYgMHgwNCkgPT09IDB4MDQ7XG4gICAgICBlLmNSTFNpZ24gPSAoYjIgJiAweDAyKSA9PT0gMHgwMjtcbiAgICAgIGUuZW5jaXBoZXJPbmx5ID0gKGIyICYgMHgwMSkgPT09IDB4MDE7XG4gICAgICBlLmRlY2lwaGVyT25seSA9IChiMyAmIDB4ODApID09PSAweDgwO1xuICAgIH0gZWxzZSBpZihlLm5hbWUgPT09ICdiYXNpY0NvbnN0cmFpbnRzJykge1xuICAgICAgLy8gaGFuZGxlIGJhc2ljIGNvbnN0cmFpbnRzXG4gICAgICAvLyBnZXQgdmFsdWUgYXMgU0VRVUVOQ0VcbiAgICAgIHZhciBldiA9IGFzbjEuZnJvbURlcihlLnZhbHVlKTtcbiAgICAgIC8vIGdldCBjQSBCT09MRUFOIGZsYWcgKGRlZmF1bHRzIHRvIGZhbHNlKVxuICAgICAgaWYoZXYudmFsdWUubGVuZ3RoID4gMCAmJiBldi52YWx1ZVswXS50eXBlID09PSBhc24xLlR5cGUuQk9PTEVBTikge1xuICAgICAgICBlLmNBID0gKGV2LnZhbHVlWzBdLnZhbHVlLmNoYXJDb2RlQXQoMCkgIT09IDB4MDApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZS5jQSA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgLy8gZ2V0IHBhdGggbGVuZ3RoIGNvbnN0cmFpbnRcbiAgICAgIHZhciB2YWx1ZSA9IG51bGw7XG4gICAgICBpZihldi52YWx1ZS5sZW5ndGggPiAwICYmIGV2LnZhbHVlWzBdLnR5cGUgPT09IGFzbjEuVHlwZS5JTlRFR0VSKSB7XG4gICAgICAgIHZhbHVlID0gZXYudmFsdWVbMF0udmFsdWU7XG4gICAgICB9IGVsc2UgaWYoZXYudmFsdWUubGVuZ3RoID4gMSkge1xuICAgICAgICB2YWx1ZSA9IGV2LnZhbHVlWzFdLnZhbHVlO1xuICAgICAgfVxuICAgICAgaWYodmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgZS5wYXRoTGVuQ29uc3RyYWludCA9IGFzbjEuZGVyVG9JbnRlZ2VyKHZhbHVlKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYoZS5uYW1lID09PSAnZXh0S2V5VXNhZ2UnKSB7XG4gICAgICAvLyBoYW5kbGUgZXh0S2V5VXNhZ2VcbiAgICAgIC8vIHZhbHVlIGlzIGEgU0VRVUVOQ0Ugb2YgT0lEc1xuICAgICAgdmFyIGV2ID0gYXNuMS5mcm9tRGVyKGUudmFsdWUpO1xuICAgICAgZm9yKHZhciB2aSA9IDA7IHZpIDwgZXYudmFsdWUubGVuZ3RoOyArK3ZpKSB7XG4gICAgICAgIHZhciBvaWQgPSBhc24xLmRlclRvT2lkKGV2LnZhbHVlW3ZpXS52YWx1ZSk7XG4gICAgICAgIGlmKG9pZCBpbiBvaWRzKSB7XG4gICAgICAgICAgZVtvaWRzW29pZF1dID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlW29pZF0gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmKGUubmFtZSA9PT0gJ25zQ2VydFR5cGUnKSB7XG4gICAgICAvLyBoYW5kbGUgbnNDZXJ0VHlwZVxuICAgICAgLy8gZ2V0IHZhbHVlIGFzIEJJVCBTVFJJTkdcbiAgICAgIHZhciBldiA9IGFzbjEuZnJvbURlcihlLnZhbHVlKTtcbiAgICAgIHZhciBiMiA9IDB4MDA7XG4gICAgICBpZihldi52YWx1ZS5sZW5ndGggPiAxKSB7XG4gICAgICAgIC8vIHNraXAgZmlyc3QgYnl0ZSwganVzdCBpbmRpY2F0ZXMgdW51c2VkIGJpdHMgd2hpY2hcbiAgICAgICAgLy8gd2lsbCBiZSBwYWRkZWQgd2l0aCAwcyBhbnl3YXlcbiAgICAgICAgLy8gZ2V0IGJ5dGVzIHdpdGggZmxhZyBiaXRzXG4gICAgICAgIGIyID0gZXYudmFsdWUuY2hhckNvZGVBdCgxKTtcbiAgICAgIH1cbiAgICAgIC8vIHNldCBmbGFnc1xuICAgICAgZS5jbGllbnQgPSAoYjIgJiAweDgwKSA9PT0gMHg4MDtcbiAgICAgIGUuc2VydmVyID0gKGIyICYgMHg0MCkgPT09IDB4NDA7XG4gICAgICBlLmVtYWlsID0gKGIyICYgMHgyMCkgPT09IDB4MjA7XG4gICAgICBlLm9ianNpZ24gPSAoYjIgJiAweDEwKSA9PT0gMHgxMDtcbiAgICAgIGUucmVzZXJ2ZWQgPSAoYjIgJiAweDA4KSA9PT0gMHgwODtcbiAgICAgIGUuc3NsQ0EgPSAoYjIgJiAweDA0KSA9PT0gMHgwNDtcbiAgICAgIGUuZW1haWxDQSA9IChiMiAmIDB4MDIpID09PSAweDAyO1xuICAgICAgZS5vYmpDQSA9IChiMiAmIDB4MDEpID09PSAweDAxO1xuICAgIH0gZWxzZSBpZihcbiAgICAgIGUubmFtZSA9PT0gJ3N1YmplY3RBbHROYW1lJyB8fFxuICAgICAgZS5uYW1lID09PSAnaXNzdWVyQWx0TmFtZScpIHtcbiAgICAgIC8vIGhhbmRsZSBzdWJqZWN0QWx0TmFtZS9pc3N1ZXJBbHROYW1lXG4gICAgICBlLmFsdE5hbWVzID0gW107XG5cbiAgICAgIC8vIGV2IGlzIGEgU1lOVEFYIFNFUVVFTkNFXG4gICAgICB2YXIgZ247XG4gICAgICB2YXIgZXYgPSBhc24xLmZyb21EZXIoZS52YWx1ZSk7XG4gICAgICBmb3IodmFyIG4gPSAwOyBuIDwgZXYudmFsdWUubGVuZ3RoOyArK24pIHtcbiAgICAgICAgLy8gZ2V0IEdlbmVyYWxOYW1lXG4gICAgICAgIGduID0gZXYudmFsdWVbbl07XG5cbiAgICAgICAgdmFyIGFsdE5hbWUgPSB7XG4gICAgICAgICAgdHlwZTogZ24udHlwZSxcbiAgICAgICAgICB2YWx1ZTogZ24udmFsdWVcbiAgICAgICAgfTtcbiAgICAgICAgZS5hbHROYW1lcy5wdXNoKGFsdE5hbWUpO1xuXG4gICAgICAgIC8vIE5vdGU6IFN1cHBvcnQgZm9yIHR5cGVzIDEsMiw2LDcsOFxuICAgICAgICBzd2l0Y2goZ24udHlwZSkge1xuICAgICAgICAgIC8vIHJmYzgyMk5hbWVcbiAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgLy8gZE5TTmFtZVxuICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAvLyB1bmlmb3JtUmVzb3VyY2VJZGVudGlmaWVyIChVUkkpXG4gICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgLy8gSVBBZGRyZXNzXG4gICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgLy8gY29udmVydCB0byBJUHY0L0lQdjYgc3RyaW5nIHJlcHJlc2VudGF0aW9uXG4gICAgICAgICAgICBhbHROYW1lLmlwID0gZm9yZ2UudXRpbC5ieXRlc1RvSVAoZ24udmFsdWUpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgLy8gcmVnaXN0ZXJlZElEXG4gICAgICAgICAgY2FzZSA4OlxuICAgICAgICAgICAgYWx0TmFtZS5vaWQgPSBhc24xLmRlclRvT2lkKGduLnZhbHVlKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAvLyB1bnN1cHBvcnRlZFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmKGUubmFtZSA9PT0gJ3N1YmplY3RLZXlJZGVudGlmaWVyJykge1xuICAgICAgLy8gdmFsdWUgaXMgYW4gT0NURVRTVFJJTkcgdy90aGUgaGFzaCBvZiB0aGUga2V5LXR5cGUgc3BlY2lmaWNcbiAgICAgIC8vIHB1YmxpYyBrZXkgc3RydWN0dXJlIChlZzogUlNBUHVibGljS2V5KVxuICAgICAgdmFyIGV2ID0gYXNuMS5mcm9tRGVyKGUudmFsdWUpO1xuICAgICAgZS5zdWJqZWN0S2V5SWRlbnRpZmllciA9IGZvcmdlLnV0aWwuYnl0ZXNUb0hleChldi52YWx1ZSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBlO1xufTtcblxuLyoqXG4gKiBDb252ZXJ0cyBhIFBLQ1MjMTAgY2VydGlmaWNhdGlvbiByZXF1ZXN0IChDU1IpIGZyb20gYW4gQVNOLjEgb2JqZWN0LlxuICpcbiAqIE5vdGU6IElmIHRoZSBjZXJ0aWZpY2F0aW9uIHJlcXVlc3QgaXMgdG8gYmUgdmVyaWZpZWQgdGhlbiBjb21wdXRlIGhhc2hcbiAqIHNob3VsZCBiZSBzZXQgdG8gdHJ1ZS4gVGhlcmUgaXMgY3VycmVudGx5IG5vIGltcGxlbWVudGF0aW9uIGZvciBjb252ZXJ0aW5nXG4gKiBhIGNlcnRpZmljYXRlIGJhY2sgdG8gQVNOLjEgc28gdGhlIENlcnRpZmljYXRpb25SZXF1ZXN0SW5mbyBwYXJ0IG9mIHRoZVxuICogQVNOLjEgb2JqZWN0IG5lZWRzIHRvIGJlIHNjYW5uZWQgYmVmb3JlIHRoZSBjc3Igb2JqZWN0IGlzIGNyZWF0ZWQuXG4gKlxuICogQHBhcmFtIG9iaiB0aGUgYXNuMSByZXByZXNlbnRhdGlvbiBvZiBhIFBLQ1MjMTAgY2VydGlmaWNhdGlvbiByZXF1ZXN0IChDU1IpLlxuICogQHBhcmFtIGNvbXB1dGVIYXNoIHRydWUgdG8gY29tcHV0ZSB0aGUgaGFzaCBmb3IgdmVyaWZpY2F0aW9uLlxuICpcbiAqIEByZXR1cm4gdGhlIGNlcnRpZmljYXRpb24gcmVxdWVzdCAoQ1NSKS5cbiAqL1xucGtpLmNlcnRpZmljYXRpb25SZXF1ZXN0RnJvbUFzbjEgPSBmdW5jdGlvbihvYmosIGNvbXB1dGVIYXNoKSB7XG4gIC8vIHZhbGlkYXRlIGNlcnRpZmljYXRpb24gcmVxdWVzdCBhbmQgY2FwdHVyZSBkYXRhXG4gIHZhciBjYXB0dXJlID0ge307XG4gIHZhciBlcnJvcnMgPSBbXTtcbiAgaWYoIWFzbjEudmFsaWRhdGUob2JqLCBjZXJ0aWZpY2F0aW9uUmVxdWVzdFZhbGlkYXRvciwgY2FwdHVyZSwgZXJyb3JzKSkge1xuICAgIHZhciBlcnJvciA9IG5ldyBFcnJvcignQ2Fubm90IHJlYWQgUEtDUyMxMCBjZXJ0aWZpY2F0ZSByZXF1ZXN0LiAnICtcbiAgICAgICdBU04uMSBvYmplY3QgaXMgbm90IGEgUEtDUyMxMCBDZXJ0aWZpY2F0aW9uUmVxdWVzdC4nKTtcbiAgICBlcnJvci5lcnJvcnMgPSBlcnJvcnM7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cblxuICAvLyBnZXQgb2lkXG4gIHZhciBvaWQgPSBhc24xLmRlclRvT2lkKGNhcHR1cmUucHVibGljS2V5T2lkKTtcbiAgaWYob2lkICE9PSBwa2kub2lkcy5yc2FFbmNyeXB0aW9uKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgcmVhZCBwdWJsaWMga2V5LiBPSUQgaXMgbm90IFJTQS4nKTtcbiAgfVxuXG4gIC8vIGNyZWF0ZSBjZXJ0aWZpY2F0aW9uIHJlcXVlc3RcbiAgdmFyIGNzciA9IHBraS5jcmVhdGVDZXJ0aWZpY2F0aW9uUmVxdWVzdCgpO1xuICBjc3IudmVyc2lvbiA9IGNhcHR1cmUuY3NyVmVyc2lvbiA/IGNhcHR1cmUuY3NyVmVyc2lvbi5jaGFyQ29kZUF0KDApIDogMDtcbiAgY3NyLnNpZ25hdHVyZU9pZCA9IGZvcmdlLmFzbjEuZGVyVG9PaWQoY2FwdHVyZS5jc3JTaWduYXR1cmVPaWQpO1xuICBjc3Iuc2lnbmF0dXJlUGFyYW1ldGVycyA9IF9yZWFkU2lnbmF0dXJlUGFyYW1ldGVycyhcbiAgICBjc3Iuc2lnbmF0dXJlT2lkLCBjYXB0dXJlLmNzclNpZ25hdHVyZVBhcmFtcywgdHJ1ZSk7XG4gIGNzci5zaWdpbmZvLmFsZ29yaXRobU9pZCA9IGZvcmdlLmFzbjEuZGVyVG9PaWQoY2FwdHVyZS5jc3JTaWduYXR1cmVPaWQpO1xuICBjc3Iuc2lnaW5mby5wYXJhbWV0ZXJzID0gX3JlYWRTaWduYXR1cmVQYXJhbWV0ZXJzKFxuICAgIGNzci5zaWdpbmZvLmFsZ29yaXRobU9pZCwgY2FwdHVyZS5jc3JTaWduYXR1cmVQYXJhbXMsIGZhbHNlKTtcbiAgY3NyLnNpZ25hdHVyZSA9IGNhcHR1cmUuY3NyU2lnbmF0dXJlO1xuXG4gIC8vIGtlZXAgQ2VydGlmaWNhdGlvblJlcXVlc3RJbmZvIHRvIHByZXNlcnZlIHNpZ25hdHVyZSB3aGVuIGV4cG9ydGluZ1xuICBjc3IuY2VydGlmaWNhdGlvblJlcXVlc3RJbmZvID0gY2FwdHVyZS5jZXJ0aWZpY2F0aW9uUmVxdWVzdEluZm87XG5cbiAgaWYoY29tcHV0ZUhhc2gpIHtcbiAgICAvLyBjcmVhdGUgZGlnZXN0IGZvciBPSUQgc2lnbmF0dXJlIHR5cGVcbiAgICBjc3IubWQgPSBfY3JlYXRlU2lnbmF0dXJlRGlnZXN0KHtcbiAgICAgIHNpZ25hdHVyZU9pZDogY3NyLnNpZ25hdHVyZU9pZCxcbiAgICAgIHR5cGU6ICdjZXJ0aWZpY2F0aW9uIHJlcXVlc3QnXG4gICAgfSk7XG5cbiAgICAvLyBwcm9kdWNlIERFUiBmb3JtYXR0ZWQgQ2VydGlmaWNhdGlvblJlcXVlc3RJbmZvIGFuZCBkaWdlc3QgaXRcbiAgICB2YXIgYnl0ZXMgPSBhc24xLnRvRGVyKGNzci5jZXJ0aWZpY2F0aW9uUmVxdWVzdEluZm8pO1xuICAgIGNzci5tZC51cGRhdGUoYnl0ZXMuZ2V0Qnl0ZXMoKSk7XG4gIH1cblxuICAvLyBoYW5kbGUgc3ViamVjdCwgYnVpbGQgc3ViamVjdCBtZXNzYWdlIGRpZ2VzdFxuICB2YXIgc21kID0gZm9yZ2UubWQuc2hhMS5jcmVhdGUoKTtcbiAgY3NyLnN1YmplY3QuZ2V0RmllbGQgPSBmdW5jdGlvbihzbikge1xuICAgIHJldHVybiBfZ2V0QXR0cmlidXRlKGNzci5zdWJqZWN0LCBzbik7XG4gIH07XG4gIGNzci5zdWJqZWN0LmFkZEZpZWxkID0gZnVuY3Rpb24oYXR0cikge1xuICAgIF9maWxsTWlzc2luZ0ZpZWxkcyhbYXR0cl0pO1xuICAgIGNzci5zdWJqZWN0LmF0dHJpYnV0ZXMucHVzaChhdHRyKTtcbiAgfTtcbiAgY3NyLnN1YmplY3QuYXR0cmlidXRlcyA9IHBraS5SRE5BdHRyaWJ1dGVzQXNBcnJheShcbiAgICBjYXB0dXJlLmNlcnRpZmljYXRpb25SZXF1ZXN0SW5mb1N1YmplY3QsIHNtZCk7XG4gIGNzci5zdWJqZWN0Lmhhc2ggPSBzbWQuZGlnZXN0KCkudG9IZXgoKTtcblxuICAvLyBjb252ZXJ0IFJTQSBwdWJsaWMga2V5IGZyb20gQVNOLjFcbiAgY3NyLnB1YmxpY0tleSA9IHBraS5wdWJsaWNLZXlGcm9tQXNuMShjYXB0dXJlLnN1YmplY3RQdWJsaWNLZXlJbmZvKTtcblxuICAvLyBjb252ZXJ0IGF0dHJpYnV0ZXMgZnJvbSBBU04uMVxuICBjc3IuZ2V0QXR0cmlidXRlID0gZnVuY3Rpb24oc24pIHtcbiAgICByZXR1cm4gX2dldEF0dHJpYnV0ZShjc3IsIHNuKTtcbiAgfTtcbiAgY3NyLmFkZEF0dHJpYnV0ZSA9IGZ1bmN0aW9uKGF0dHIpIHtcbiAgICBfZmlsbE1pc3NpbmdGaWVsZHMoW2F0dHJdKTtcbiAgICBjc3IuYXR0cmlidXRlcy5wdXNoKGF0dHIpO1xuICB9O1xuICBjc3IuYXR0cmlidXRlcyA9IHBraS5DUklBdHRyaWJ1dGVzQXNBcnJheShcbiAgICBjYXB0dXJlLmNlcnRpZmljYXRpb25SZXF1ZXN0SW5mb0F0dHJpYnV0ZXMgfHwgW10pO1xuXG4gIHJldHVybiBjc3I7XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gZW1wdHkgY2VydGlmaWNhdGlvbiByZXF1ZXN0IChhIENTUiBvciBjZXJ0aWZpY2F0ZSBzaWduaW5nXG4gKiByZXF1ZXN0KS4gT25jZSBjcmVhdGVkLCBpdHMgcHVibGljIGtleSBhbmQgYXR0cmlidXRlcyBjYW4gYmUgc2V0IGFuZCB0aGVuXG4gKiBpdCBjYW4gYmUgc2lnbmVkLlxuICpcbiAqIEByZXR1cm4gdGhlIGVtcHR5IGNlcnRpZmljYXRpb24gcmVxdWVzdC5cbiAqL1xucGtpLmNyZWF0ZUNlcnRpZmljYXRpb25SZXF1ZXN0ID0gZnVuY3Rpb24oKSB7XG4gIHZhciBjc3IgPSB7fTtcbiAgY3NyLnZlcnNpb24gPSAweDAwO1xuICBjc3Iuc2lnbmF0dXJlT2lkID0gbnVsbDtcbiAgY3NyLnNpZ25hdHVyZSA9IG51bGw7XG4gIGNzci5zaWdpbmZvID0ge307XG4gIGNzci5zaWdpbmZvLmFsZ29yaXRobU9pZCA9IG51bGw7XG5cbiAgY3NyLnN1YmplY3QgPSB7fTtcbiAgY3NyLnN1YmplY3QuZ2V0RmllbGQgPSBmdW5jdGlvbihzbikge1xuICAgIHJldHVybiBfZ2V0QXR0cmlidXRlKGNzci5zdWJqZWN0LCBzbik7XG4gIH07XG4gIGNzci5zdWJqZWN0LmFkZEZpZWxkID0gZnVuY3Rpb24oYXR0cikge1xuICAgIF9maWxsTWlzc2luZ0ZpZWxkcyhbYXR0cl0pO1xuICAgIGNzci5zdWJqZWN0LmF0dHJpYnV0ZXMucHVzaChhdHRyKTtcbiAgfTtcbiAgY3NyLnN1YmplY3QuYXR0cmlidXRlcyA9IFtdO1xuICBjc3Iuc3ViamVjdC5oYXNoID0gbnVsbDtcblxuICBjc3IucHVibGljS2V5ID0gbnVsbDtcbiAgY3NyLmF0dHJpYnV0ZXMgPSBbXTtcbiAgY3NyLmdldEF0dHJpYnV0ZSA9IGZ1bmN0aW9uKHNuKSB7XG4gICAgcmV0dXJuIF9nZXRBdHRyaWJ1dGUoY3NyLCBzbik7XG4gIH07XG4gIGNzci5hZGRBdHRyaWJ1dGUgPSBmdW5jdGlvbihhdHRyKSB7XG4gICAgX2ZpbGxNaXNzaW5nRmllbGRzKFthdHRyXSk7XG4gICAgY3NyLmF0dHJpYnV0ZXMucHVzaChhdHRyKTtcbiAgfTtcbiAgY3NyLm1kID0gbnVsbDtcblxuICAvKipcbiAgICogU2V0cyB0aGUgc3ViamVjdCBvZiB0aGlzIGNlcnRpZmljYXRpb24gcmVxdWVzdC5cbiAgICpcbiAgICogQHBhcmFtIGF0dHJzIHRoZSBhcnJheSBvZiBzdWJqZWN0IGF0dHJpYnV0ZXMgdG8gdXNlLlxuICAgKi9cbiAgY3NyLnNldFN1YmplY3QgPSBmdW5jdGlvbihhdHRycykge1xuICAgIC8vIHNldCBuZXcgYXR0cmlidXRlc1xuICAgIF9maWxsTWlzc2luZ0ZpZWxkcyhhdHRycyk7XG4gICAgY3NyLnN1YmplY3QuYXR0cmlidXRlcyA9IGF0dHJzO1xuICAgIGNzci5zdWJqZWN0Lmhhc2ggPSBudWxsO1xuICB9O1xuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBhdHRyaWJ1dGVzIG9mIHRoaXMgY2VydGlmaWNhdGlvbiByZXF1ZXN0LlxuICAgKlxuICAgKiBAcGFyYW0gYXR0cnMgdGhlIGFycmF5IG9mIGF0dHJpYnV0ZXMgdG8gdXNlLlxuICAgKi9cbiAgY3NyLnNldEF0dHJpYnV0ZXMgPSBmdW5jdGlvbihhdHRycykge1xuICAgIC8vIHNldCBuZXcgYXR0cmlidXRlc1xuICAgIF9maWxsTWlzc2luZ0ZpZWxkcyhhdHRycyk7XG4gICAgY3NyLmF0dHJpYnV0ZXMgPSBhdHRycztcbiAgfTtcblxuICAvKipcbiAgICogU2lnbnMgdGhpcyBjZXJ0aWZpY2F0aW9uIHJlcXVlc3QgdXNpbmcgdGhlIGdpdmVuIHByaXZhdGUga2V5LlxuICAgKlxuICAgKiBAcGFyYW0ga2V5IHRoZSBwcml2YXRlIGtleSB0byBzaWduIHdpdGguXG4gICAqIEBwYXJhbSBtZCB0aGUgbWVzc2FnZSBkaWdlc3Qgb2JqZWN0IHRvIHVzZSAoZGVmYXVsdHMgdG8gZm9yZ2UubWQuc2hhMSkuXG4gICAqL1xuICBjc3Iuc2lnbiA9IGZ1bmN0aW9uKGtleSwgbWQpIHtcbiAgICAvLyBUT0RPOiBnZXQgc2lnbmF0dXJlIE9JRCBmcm9tIHByaXZhdGUga2V5XG4gICAgY3NyLm1kID0gbWQgfHwgZm9yZ2UubWQuc2hhMS5jcmVhdGUoKTtcbiAgICB2YXIgYWxnb3JpdGhtT2lkID0gb2lkc1tjc3IubWQuYWxnb3JpdGhtICsgJ1dpdGhSU0FFbmNyeXB0aW9uJ107XG4gICAgaWYoIWFsZ29yaXRobU9pZCkge1xuICAgICAgdmFyIGVycm9yID0gbmV3IEVycm9yKCdDb3VsZCBub3QgY29tcHV0ZSBjZXJ0aWZpY2F0aW9uIHJlcXVlc3QgZGlnZXN0LiAnICtcbiAgICAgICAgJ1Vua25vd24gbWVzc2FnZSBkaWdlc3QgYWxnb3JpdGhtIE9JRC4nKTtcbiAgICAgIGVycm9yLmFsZ29yaXRobSA9IGNzci5tZC5hbGdvcml0aG07XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gICAgY3NyLnNpZ25hdHVyZU9pZCA9IGNzci5zaWdpbmZvLmFsZ29yaXRobU9pZCA9IGFsZ29yaXRobU9pZDtcblxuICAgIC8vIGdldCBDZXJ0aWZpY2F0aW9uUmVxdWVzdEluZm8sIGNvbnZlcnQgdG8gREVSXG4gICAgY3NyLmNlcnRpZmljYXRpb25SZXF1ZXN0SW5mbyA9IHBraS5nZXRDZXJ0aWZpY2F0aW9uUmVxdWVzdEluZm8oY3NyKTtcbiAgICB2YXIgYnl0ZXMgPSBhc24xLnRvRGVyKGNzci5jZXJ0aWZpY2F0aW9uUmVxdWVzdEluZm8pO1xuXG4gICAgLy8gZGlnZXN0IGFuZCBzaWduXG4gICAgY3NyLm1kLnVwZGF0ZShieXRlcy5nZXRCeXRlcygpKTtcbiAgICBjc3Iuc2lnbmF0dXJlID0ga2V5LnNpZ24oY3NyLm1kKTtcbiAgfTtcblxuICAvKipcbiAgICogQXR0ZW1wdHMgdmVyaWZ5IHRoZSBzaWduYXR1cmUgb24gdGhlIHBhc3NlZCBjZXJ0aWZpY2F0aW9uIHJlcXVlc3QgdXNpbmdcbiAgICogaXRzIHB1YmxpYyBrZXkuXG4gICAqXG4gICAqIEEgQ1NSIHRoYXQgaGFzIGJlZW4gZXhwb3J0ZWQgdG8gYSBmaWxlIGluIFBFTSBmb3JtYXQgY2FuIGJlIHZlcmlmaWVkIHVzaW5nXG4gICAqIE9wZW5TU0wgdXNpbmcgdGhpcyBjb21tYW5kOlxuICAgKlxuICAgKiBvcGVuc3NsIHJlcSAtaW4gPHRoZS1jc3ItcGVtLWZpbGU+IC12ZXJpZnkgLW5vb3V0IC10ZXh0XG4gICAqXG4gICAqIEByZXR1cm4gdHJ1ZSBpZiB2ZXJpZmllZCwgZmFsc2UgaWYgbm90LlxuICAgKi9cbiAgY3NyLnZlcmlmeSA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBydmFsID0gZmFsc2U7XG5cbiAgICB2YXIgbWQgPSBjc3IubWQ7XG4gICAgaWYobWQgPT09IG51bGwpIHtcbiAgICAgIG1kID0gX2NyZWF0ZVNpZ25hdHVyZURpZ2VzdCh7XG4gICAgICAgIHNpZ25hdHVyZU9pZDogY3NyLnNpZ25hdHVyZU9pZCxcbiAgICAgICAgdHlwZTogJ2NlcnRpZmljYXRpb24gcmVxdWVzdCdcbiAgICAgIH0pO1xuXG4gICAgICAvLyBwcm9kdWNlIERFUiBmb3JtYXR0ZWQgQ2VydGlmaWNhdGlvblJlcXVlc3RJbmZvIGFuZCBkaWdlc3QgaXRcbiAgICAgIHZhciBjcmkgPSBjc3IuY2VydGlmaWNhdGlvblJlcXVlc3RJbmZvIHx8XG4gICAgICAgIHBraS5nZXRDZXJ0aWZpY2F0aW9uUmVxdWVzdEluZm8oY3NyKTtcbiAgICAgIHZhciBieXRlcyA9IGFzbjEudG9EZXIoY3JpKTtcbiAgICAgIG1kLnVwZGF0ZShieXRlcy5nZXRCeXRlcygpKTtcbiAgICB9XG5cbiAgICBpZihtZCAhPT0gbnVsbCkge1xuICAgICAgcnZhbCA9IF92ZXJpZnlTaWduYXR1cmUoe1xuICAgICAgICBjZXJ0aWZpY2F0ZTogY3NyLCBtZDogbWQsIHNpZ25hdHVyZTogY3NyLnNpZ25hdHVyZVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJ2YWw7XG4gIH07XG5cbiAgcmV0dXJuIGNzcjtcbn07XG5cbi8qKlxuICogQ29udmVydHMgYW4gWC41MDkgc3ViamVjdCBvciBpc3N1ZXIgdG8gYW4gQVNOLjEgUkROU2VxdWVuY2UuXG4gKlxuICogQHBhcmFtIG9iaiB0aGUgc3ViamVjdCBvciBpc3N1ZXIgKGRpc3Rpbmd1aXNoZWQgbmFtZSkuXG4gKlxuICogQHJldHVybiB0aGUgQVNOLjEgUkROU2VxdWVuY2UuXG4gKi9cbmZ1bmN0aW9uIF9kblRvQXNuMShvYmopIHtcbiAgLy8gY3JlYXRlIGFuIGVtcHR5IFJETlNlcXVlbmNlXG4gIHZhciBydmFsID0gYXNuMS5jcmVhdGUoXG4gICAgYXNuMS5DbGFzcy5VTklWRVJTQUwsIGFzbjEuVHlwZS5TRVFVRU5DRSwgdHJ1ZSwgW10pO1xuXG4gIC8vIGl0ZXJhdGUgb3ZlciBhdHRyaWJ1dGVzXG4gIHZhciBhdHRyLCBzZXQ7XG4gIHZhciBhdHRycyA9IG9iai5hdHRyaWJ1dGVzO1xuICBmb3IodmFyIGkgPSAwOyBpIDwgYXR0cnMubGVuZ3RoOyArK2kpIHtcbiAgICBhdHRyID0gYXR0cnNbaV07XG4gICAgdmFyIHZhbHVlID0gYXR0ci52YWx1ZTtcblxuICAgIC8vIHJldXNlIHRhZyBjbGFzcyBmb3IgYXR0cmlidXRlIHZhbHVlIGlmIGF2YWlsYWJsZVxuICAgIHZhciB2YWx1ZVRhZ0NsYXNzID0gYXNuMS5UeXBlLlBSSU5UQUJMRVNUUklORztcbiAgICBpZigndmFsdWVUYWdDbGFzcycgaW4gYXR0cikge1xuICAgICAgdmFsdWVUYWdDbGFzcyA9IGF0dHIudmFsdWVUYWdDbGFzcztcblxuICAgICAgaWYodmFsdWVUYWdDbGFzcyA9PT0gYXNuMS5UeXBlLlVURjgpIHtcbiAgICAgICAgdmFsdWUgPSBmb3JnZS51dGlsLmVuY29kZVV0ZjgodmFsdWUpO1xuICAgICAgfVxuICAgICAgLy8gRklYTUU6IGhhbmRsZSBtb3JlIGVuY29kaW5nc1xuICAgIH1cblxuICAgIC8vIGNyZWF0ZSBhIFJlbGF0aXZlRGlzdGluZ3Vpc2hlZE5hbWUgc2V0XG4gICAgLy8gZWFjaCB2YWx1ZSBpbiB0aGUgc2V0IGlzIGFuIEF0dHJpYnV0ZVR5cGVBbmRWYWx1ZSBmaXJzdFxuICAgIC8vIGNvbnRhaW5pbmcgdGhlIHR5cGUgKGFuIE9JRCkgYW5kIHNlY29uZCB0aGUgdmFsdWVcbiAgICBzZXQgPSBhc24xLmNyZWF0ZShhc24xLkNsYXNzLlVOSVZFUlNBTCwgYXNuMS5UeXBlLlNFVCwgdHJ1ZSwgW1xuICAgICAgYXNuMS5jcmVhdGUoYXNuMS5DbGFzcy5VTklWRVJTQUwsIGFzbjEuVHlwZS5TRVFVRU5DRSwgdHJ1ZSwgW1xuICAgICAgICAvLyBBdHRyaWJ1dGVUeXBlXG4gICAgICAgIGFzbjEuY3JlYXRlKGFzbjEuQ2xhc3MuVU5JVkVSU0FMLCBhc24xLlR5cGUuT0lELCBmYWxzZSxcbiAgICAgICAgICBhc24xLm9pZFRvRGVyKGF0dHIudHlwZSkuZ2V0Qnl0ZXMoKSksXG4gICAgICAgIC8vIEF0dHJpYnV0ZVZhbHVlXG4gICAgICAgIGFzbjEuY3JlYXRlKGFzbjEuQ2xhc3MuVU5JVkVSU0FMLCB2YWx1ZVRhZ0NsYXNzLCBmYWxzZSwgdmFsdWUpXG4gICAgICBdKVxuICAgIF0pO1xuICAgIHJ2YWwudmFsdWUucHVzaChzZXQpO1xuICB9XG5cbiAgcmV0dXJuIHJ2YWw7XG59XG5cbi8qKlxuICogR2V0cyBhbGwgcHJpbnRhYmxlIGF0dHJpYnV0ZXMgKHR5cGljYWxseSBvZiBhbiBpc3N1ZXIgb3Igc3ViamVjdCkgaW4gYVxuICogc2ltcGxpZmllZCBKU09OIGZvcm1hdCBmb3IgZGlzcGxheS5cbiAqXG4gKiBAcGFyYW0gYXR0cnMgdGhlIGF0dHJpYnV0ZXMuXG4gKlxuICogQHJldHVybiB0aGUgSlNPTiBmb3IgZGlzcGxheS5cbiAqL1xuZnVuY3Rpb24gX2dldEF0dHJpYnV0ZXNBc0pzb24oYXR0cnMpIHtcbiAgdmFyIHJ2YWwgPSB7fTtcbiAgZm9yKHZhciBpID0gMDsgaSA8IGF0dHJzLmxlbmd0aDsgKytpKSB7XG4gICAgdmFyIGF0dHIgPSBhdHRyc1tpXTtcbiAgICBpZihhdHRyLnNob3J0TmFtZSAmJiAoXG4gICAgICBhdHRyLnZhbHVlVGFnQ2xhc3MgPT09IGFzbjEuVHlwZS5VVEY4IHx8XG4gICAgICBhdHRyLnZhbHVlVGFnQ2xhc3MgPT09IGFzbjEuVHlwZS5QUklOVEFCTEVTVFJJTkcgfHxcbiAgICAgIGF0dHIudmFsdWVUYWdDbGFzcyA9PT0gYXNuMS5UeXBlLklBNVNUUklORykpIHtcbiAgICAgIHZhciB2YWx1ZSA9IGF0dHIudmFsdWU7XG4gICAgICBpZihhdHRyLnZhbHVlVGFnQ2xhc3MgPT09IGFzbjEuVHlwZS5VVEY4KSB7XG4gICAgICAgIHZhbHVlID0gZm9yZ2UudXRpbC5lbmNvZGVVdGY4KGF0dHIudmFsdWUpO1xuICAgICAgfVxuICAgICAgaWYoIShhdHRyLnNob3J0TmFtZSBpbiBydmFsKSkge1xuICAgICAgICBydmFsW2F0dHIuc2hvcnROYW1lXSA9IHZhbHVlO1xuICAgICAgfSBlbHNlIGlmKGZvcmdlLnV0aWwuaXNBcnJheShydmFsW2F0dHIuc2hvcnROYW1lXSkpIHtcbiAgICAgICAgcnZhbFthdHRyLnNob3J0TmFtZV0ucHVzaCh2YWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBydmFsW2F0dHIuc2hvcnROYW1lXSA9IFtydmFsW2F0dHIuc2hvcnROYW1lXSwgdmFsdWVdO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gcnZhbDtcbn1cblxuLyoqXG4gKiBGaWxscyBpbiBtaXNzaW5nIGZpZWxkcyBpbiBhdHRyaWJ1dGVzLlxuICpcbiAqIEBwYXJhbSBhdHRycyB0aGUgYXR0cmlidXRlcyB0byBmaWxsIG1pc3NpbmcgZmllbGRzIGluLlxuICovXG5mdW5jdGlvbiBfZmlsbE1pc3NpbmdGaWVsZHMoYXR0cnMpIHtcbiAgdmFyIGF0dHI7XG4gIGZvcih2YXIgaSA9IDA7IGkgPCBhdHRycy5sZW5ndGg7ICsraSkge1xuICAgIGF0dHIgPSBhdHRyc1tpXTtcblxuICAgIC8vIHBvcHVsYXRlIG1pc3NpbmcgbmFtZVxuICAgIGlmKHR5cGVvZiBhdHRyLm5hbWUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBpZihhdHRyLnR5cGUgJiYgYXR0ci50eXBlIGluIHBraS5vaWRzKSB7XG4gICAgICAgIGF0dHIubmFtZSA9IHBraS5vaWRzW2F0dHIudHlwZV07XG4gICAgICB9IGVsc2UgaWYoYXR0ci5zaG9ydE5hbWUgJiYgYXR0ci5zaG9ydE5hbWUgaW4gX3Nob3J0TmFtZXMpIHtcbiAgICAgICAgYXR0ci5uYW1lID0gcGtpLm9pZHNbX3Nob3J0TmFtZXNbYXR0ci5zaG9ydE5hbWVdXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBwb3B1bGF0ZSBtaXNzaW5nIHR5cGUgKE9JRClcbiAgICBpZih0eXBlb2YgYXR0ci50eXBlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgaWYoYXR0ci5uYW1lICYmIGF0dHIubmFtZSBpbiBwa2kub2lkcykge1xuICAgICAgICBhdHRyLnR5cGUgPSBwa2kub2lkc1thdHRyLm5hbWVdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIGVycm9yID0gbmV3IEVycm9yKCdBdHRyaWJ1dGUgdHlwZSBub3Qgc3BlY2lmaWVkLicpO1xuICAgICAgICBlcnJvci5hdHRyaWJ1dGUgPSBhdHRyO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBwb3B1bGF0ZSBtaXNzaW5nIHNob3J0bmFtZVxuICAgIGlmKHR5cGVvZiBhdHRyLnNob3J0TmFtZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGlmKGF0dHIubmFtZSAmJiBhdHRyLm5hbWUgaW4gX3Nob3J0TmFtZXMpIHtcbiAgICAgICAgYXR0ci5zaG9ydE5hbWUgPSBfc2hvcnROYW1lc1thdHRyLm5hbWVdO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGNvbnZlcnQgZXh0ZW5zaW9ucyB0byB2YWx1ZVxuICAgIGlmKGF0dHIudHlwZSA9PT0gb2lkcy5leHRlbnNpb25SZXF1ZXN0KSB7XG4gICAgICBhdHRyLnZhbHVlQ29uc3RydWN0ZWQgPSB0cnVlO1xuICAgICAgYXR0ci52YWx1ZVRhZ0NsYXNzID0gYXNuMS5UeXBlLlNFUVVFTkNFO1xuICAgICAgaWYoIWF0dHIudmFsdWUgJiYgYXR0ci5leHRlbnNpb25zKSB7XG4gICAgICAgIGF0dHIudmFsdWUgPSBbXTtcbiAgICAgICAgZm9yKHZhciBlaSA9IDA7IGVpIDwgYXR0ci5leHRlbnNpb25zLmxlbmd0aDsgKytlaSkge1xuICAgICAgICAgIGF0dHIudmFsdWUucHVzaChwa2kuY2VydGlmaWNhdGVFeHRlbnNpb25Ub0FzbjEoXG4gICAgICAgICAgICBfZmlsbE1pc3NpbmdFeHRlbnNpb25GaWVsZHMoYXR0ci5leHRlbnNpb25zW2VpXSkpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmKHR5cGVvZiBhdHRyLnZhbHVlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgdmFyIGVycm9yID0gbmV3IEVycm9yKCdBdHRyaWJ1dGUgdmFsdWUgbm90IHNwZWNpZmllZC4nKTtcbiAgICAgIGVycm9yLmF0dHJpYnV0ZSA9IGF0dHI7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBGaWxscyBpbiBtaXNzaW5nIGZpZWxkcyBpbiBjZXJ0aWZpY2F0ZSBleHRlbnNpb25zLlxuICpcbiAqIEBwYXJhbSBlIHRoZSBleHRlbnNpb24uXG4gKiBAcGFyYW0gW29wdGlvbnNdIHRoZSBvcHRpb25zIHRvIHVzZS5cbiAqICAgICAgICAgIFtjZXJ0XSB0aGUgY2VydGlmaWNhdGUgdGhlIGV4dGVuc2lvbnMgYXJlIGZvci5cbiAqXG4gKiBAcmV0dXJuIHRoZSBleHRlbnNpb24uXG4gKi9cbmZ1bmN0aW9uIF9maWxsTWlzc2luZ0V4dGVuc2lvbkZpZWxkcyhlLCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gIC8vIHBvcHVsYXRlIG1pc3NpbmcgbmFtZVxuICBpZih0eXBlb2YgZS5uYW1lID09PSAndW5kZWZpbmVkJykge1xuICAgIGlmKGUuaWQgJiYgZS5pZCBpbiBwa2kub2lkcykge1xuICAgICAgZS5uYW1lID0gcGtpLm9pZHNbZS5pZF07XG4gICAgfVxuICB9XG5cbiAgLy8gcG9wdWxhdGUgbWlzc2luZyBpZFxuICBpZih0eXBlb2YgZS5pZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBpZihlLm5hbWUgJiYgZS5uYW1lIGluIHBraS5vaWRzKSB7XG4gICAgICBlLmlkID0gcGtpLm9pZHNbZS5uYW1lXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGVycm9yID0gbmV3IEVycm9yKCdFeHRlbnNpb24gSUQgbm90IHNwZWNpZmllZC4nKTtcbiAgICAgIGVycm9yLmV4dGVuc2lvbiA9IGU7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICBpZih0eXBlb2YgZS52YWx1ZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gZTtcbiAgfVxuXG4gIC8vIGhhbmRsZSBtaXNzaW5nIHZhbHVlOlxuXG4gIC8vIHZhbHVlIGlzIGEgQklUIFNUUklOR1xuICBpZihlLm5hbWUgPT09ICdrZXlVc2FnZScpIHtcbiAgICAvLyBidWlsZCBmbGFnc1xuICAgIHZhciB1bnVzZWQgPSAwO1xuICAgIHZhciBiMiA9IDB4MDA7XG4gICAgdmFyIGIzID0gMHgwMDtcbiAgICBpZihlLmRpZ2l0YWxTaWduYXR1cmUpIHtcbiAgICAgIGIyIHw9IDB4ODA7XG4gICAgICB1bnVzZWQgPSA3O1xuICAgIH1cbiAgICBpZihlLm5vblJlcHVkaWF0aW9uKSB7XG4gICAgICBiMiB8PSAweDQwO1xuICAgICAgdW51c2VkID0gNjtcbiAgICB9XG4gICAgaWYoZS5rZXlFbmNpcGhlcm1lbnQpIHtcbiAgICAgIGIyIHw9IDB4MjA7XG4gICAgICB1bnVzZWQgPSA1O1xuICAgIH1cbiAgICBpZihlLmRhdGFFbmNpcGhlcm1lbnQpIHtcbiAgICAgIGIyIHw9IDB4MTA7XG4gICAgICB1bnVzZWQgPSA0O1xuICAgIH1cbiAgICBpZihlLmtleUFncmVlbWVudCkge1xuICAgICAgYjIgfD0gMHgwODtcbiAgICAgIHVudXNlZCA9IDM7XG4gICAgfVxuICAgIGlmKGUua2V5Q2VydFNpZ24pIHtcbiAgICAgIGIyIHw9IDB4MDQ7XG4gICAgICB1bnVzZWQgPSAyO1xuICAgIH1cbiAgICBpZihlLmNSTFNpZ24pIHtcbiAgICAgIGIyIHw9IDB4MDI7XG4gICAgICB1bnVzZWQgPSAxO1xuICAgIH1cbiAgICBpZihlLmVuY2lwaGVyT25seSkge1xuICAgICAgYjIgfD0gMHgwMTtcbiAgICAgIHVudXNlZCA9IDA7XG4gICAgfVxuICAgIGlmKGUuZGVjaXBoZXJPbmx5KSB7XG4gICAgICBiMyB8PSAweDgwO1xuICAgICAgdW51c2VkID0gNztcbiAgICB9XG5cbiAgICAvLyBjcmVhdGUgYml0IHN0cmluZ1xuICAgIHZhciB2YWx1ZSA9IFN0cmluZy5mcm9tQ2hhckNvZGUodW51c2VkKTtcbiAgICBpZihiMyAhPT0gMCkge1xuICAgICAgdmFsdWUgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShiMikgKyBTdHJpbmcuZnJvbUNoYXJDb2RlKGIzKTtcbiAgICB9IGVsc2UgaWYoYjIgIT09IDApIHtcbiAgICAgIHZhbHVlICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYjIpO1xuICAgIH1cbiAgICBlLnZhbHVlID0gYXNuMS5jcmVhdGUoXG4gICAgICBhc24xLkNsYXNzLlVOSVZFUlNBTCwgYXNuMS5UeXBlLkJJVFNUUklORywgZmFsc2UsIHZhbHVlKTtcbiAgfSBlbHNlIGlmKGUubmFtZSA9PT0gJ2Jhc2ljQ29uc3RyYWludHMnKSB7XG4gICAgLy8gYmFzaWNDb25zdHJhaW50cyBpcyBhIFNFUVVFTkNFXG4gICAgZS52YWx1ZSA9IGFzbjEuY3JlYXRlKFxuICAgICAgYXNuMS5DbGFzcy5VTklWRVJTQUwsIGFzbjEuVHlwZS5TRVFVRU5DRSwgdHJ1ZSwgW10pO1xuICAgIC8vIGNBIEJPT0xFQU4gZmxhZyBkZWZhdWx0cyB0byBmYWxzZVxuICAgIGlmKGUuY0EpIHtcbiAgICAgIGUudmFsdWUudmFsdWUucHVzaChhc24xLmNyZWF0ZShcbiAgICAgICAgYXNuMS5DbGFzcy5VTklWRVJTQUwsIGFzbjEuVHlwZS5CT09MRUFOLCBmYWxzZSxcbiAgICAgICAgU3RyaW5nLmZyb21DaGFyQ29kZSgweEZGKSkpO1xuICAgIH1cbiAgICBpZigncGF0aExlbkNvbnN0cmFpbnQnIGluIGUpIHtcbiAgICAgIGUudmFsdWUudmFsdWUucHVzaChhc24xLmNyZWF0ZShcbiAgICAgICAgYXNuMS5DbGFzcy5VTklWRVJTQUwsIGFzbjEuVHlwZS5JTlRFR0VSLCBmYWxzZSxcbiAgICAgICAgYXNuMS5pbnRlZ2VyVG9EZXIoZS5wYXRoTGVuQ29uc3RyYWludCkuZ2V0Qnl0ZXMoKSkpO1xuICAgIH1cbiAgfSBlbHNlIGlmKGUubmFtZSA9PT0gJ2V4dEtleVVzYWdlJykge1xuICAgIC8vIGV4dEtleVVzYWdlIGlzIGEgU0VRVUVOQ0Ugb2YgT0lEc1xuICAgIGUudmFsdWUgPSBhc24xLmNyZWF0ZShcbiAgICAgIGFzbjEuQ2xhc3MuVU5JVkVSU0FMLCBhc24xLlR5cGUuU0VRVUVOQ0UsIHRydWUsIFtdKTtcbiAgICB2YXIgc2VxID0gZS52YWx1ZS52YWx1ZTtcbiAgICBmb3IodmFyIGtleSBpbiBlKSB7XG4gICAgICBpZihlW2tleV0gIT09IHRydWUpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICAvLyBrZXkgaXMgbmFtZSBpbiBPSUQgbWFwXG4gICAgICBpZihrZXkgaW4gb2lkcykge1xuICAgICAgICBzZXEucHVzaChhc24xLmNyZWF0ZShhc24xLkNsYXNzLlVOSVZFUlNBTCwgYXNuMS5UeXBlLk9JRCxcbiAgICAgICAgICBmYWxzZSwgYXNuMS5vaWRUb0RlcihvaWRzW2tleV0pLmdldEJ5dGVzKCkpKTtcbiAgICAgIH0gZWxzZSBpZihrZXkuaW5kZXhPZignLicpICE9PSAtMSkge1xuICAgICAgICAvLyBhc3N1bWUga2V5IGlzIGFuIE9JRFxuICAgICAgICBzZXEucHVzaChhc24xLmNyZWF0ZShhc24xLkNsYXNzLlVOSVZFUlNBTCwgYXNuMS5UeXBlLk9JRCxcbiAgICAgICAgICBmYWxzZSwgYXNuMS5vaWRUb0RlcihrZXkpLmdldEJ5dGVzKCkpKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSBpZihlLm5hbWUgPT09ICduc0NlcnRUeXBlJykge1xuICAgIC8vIG5zQ2VydFR5cGUgaXMgYSBCSVQgU1RSSU5HXG4gICAgLy8gYnVpbGQgZmxhZ3NcbiAgICB2YXIgdW51c2VkID0gMDtcbiAgICB2YXIgYjIgPSAweDAwO1xuXG4gICAgaWYoZS5jbGllbnQpIHtcbiAgICAgIGIyIHw9IDB4ODA7XG4gICAgICB1bnVzZWQgPSA3O1xuICAgIH1cbiAgICBpZihlLnNlcnZlcikge1xuICAgICAgYjIgfD0gMHg0MDtcbiAgICAgIHVudXNlZCA9IDY7XG4gICAgfVxuICAgIGlmKGUuZW1haWwpIHtcbiAgICAgIGIyIHw9IDB4MjA7XG4gICAgICB1bnVzZWQgPSA1O1xuICAgIH1cbiAgICBpZihlLm9ianNpZ24pIHtcbiAgICAgIGIyIHw9IDB4MTA7XG4gICAgICB1bnVzZWQgPSA0O1xuICAgIH1cbiAgICBpZihlLnJlc2VydmVkKSB7XG4gICAgICBiMiB8PSAweDA4O1xuICAgICAgdW51c2VkID0gMztcbiAgICB9XG4gICAgaWYoZS5zc2xDQSkge1xuICAgICAgYjIgfD0gMHgwNDtcbiAgICAgIHVudXNlZCA9IDI7XG4gICAgfVxuICAgIGlmKGUuZW1haWxDQSkge1xuICAgICAgYjIgfD0gMHgwMjtcbiAgICAgIHVudXNlZCA9IDE7XG4gICAgfVxuICAgIGlmKGUub2JqQ0EpIHtcbiAgICAgIGIyIHw9IDB4MDE7XG4gICAgICB1bnVzZWQgPSAwO1xuICAgIH1cblxuICAgIC8vIGNyZWF0ZSBiaXQgc3RyaW5nXG4gICAgdmFyIHZhbHVlID0gU3RyaW5nLmZyb21DaGFyQ29kZSh1bnVzZWQpO1xuICAgIGlmKGIyICE9PSAwKSB7XG4gICAgICB2YWx1ZSArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGIyKTtcbiAgICB9XG4gICAgZS52YWx1ZSA9IGFzbjEuY3JlYXRlKFxuICAgICAgYXNuMS5DbGFzcy5VTklWRVJTQUwsIGFzbjEuVHlwZS5CSVRTVFJJTkcsIGZhbHNlLCB2YWx1ZSk7XG4gIH0gZWxzZSBpZihlLm5hbWUgPT09ICdzdWJqZWN0QWx0TmFtZScgfHwgZS5uYW1lID09PSAnaXNzdWVyQWx0TmFtZScpIHtcbiAgICAvLyBTWU5UQVggU0VRVUVOQ0VcbiAgICBlLnZhbHVlID0gYXNuMS5jcmVhdGUoYXNuMS5DbGFzcy5VTklWRVJTQUwsIGFzbjEuVHlwZS5TRVFVRU5DRSwgdHJ1ZSwgW10pO1xuXG4gICAgdmFyIGFsdE5hbWU7XG4gICAgZm9yKHZhciBuID0gMDsgbiA8IGUuYWx0TmFtZXMubGVuZ3RoOyArK24pIHtcbiAgICAgIGFsdE5hbWUgPSBlLmFsdE5hbWVzW25dO1xuICAgICAgdmFyIHZhbHVlID0gYWx0TmFtZS52YWx1ZTtcbiAgICAgIC8vIGhhbmRsZSBJUFxuICAgICAgaWYoYWx0TmFtZS50eXBlID09PSA3ICYmIGFsdE5hbWUuaXApIHtcbiAgICAgICAgdmFsdWUgPSBmb3JnZS51dGlsLmJ5dGVzRnJvbUlQKGFsdE5hbWUuaXApO1xuICAgICAgICBpZih2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICAgIHZhciBlcnJvciA9IG5ldyBFcnJvcihcbiAgICAgICAgICAgICdFeHRlbnNpb24gXCJpcFwiIHZhbHVlIGlzIG5vdCBhIHZhbGlkIElQdjQgb3IgSVB2NiBhZGRyZXNzLicpO1xuICAgICAgICAgIGVycm9yLmV4dGVuc2lvbiA9IGU7XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZihhbHROYW1lLnR5cGUgPT09IDgpIHtcbiAgICAgICAgLy8gaGFuZGxlIE9JRFxuICAgICAgICBpZihhbHROYW1lLm9pZCkge1xuICAgICAgICAgIHZhbHVlID0gYXNuMS5vaWRUb0Rlcihhc24xLm9pZFRvRGVyKGFsdE5hbWUub2lkKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gZGVwcmVjYXRlZCAuLi4gY29udmVydCB2YWx1ZSB0byBPSURcbiAgICAgICAgICB2YWx1ZSA9IGFzbjEub2lkVG9EZXIodmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBlLnZhbHVlLnZhbHVlLnB1c2goYXNuMS5jcmVhdGUoXG4gICAgICAgIGFzbjEuQ2xhc3MuQ09OVEVYVF9TUEVDSUZJQywgYWx0TmFtZS50eXBlLCBmYWxzZSxcbiAgICAgICAgdmFsdWUpKTtcbiAgICB9XG4gIH0gZWxzZSBpZihlLm5hbWUgPT09ICduc0NvbW1lbnQnICYmIG9wdGlvbnMuY2VydCkge1xuICAgIC8vIHNhbml0eSBjaGVjayB2YWx1ZSBpcyBBU0NJSSAocmVxJ2QpIGFuZCBub3QgdG9vIGJpZ1xuICAgIGlmKCEoL15bXFx4MDAtXFx4N0ZdKiQvLnRlc3QoZS5jb21tZW50KSkgfHxcbiAgICAgIChlLmNvbW1lbnQubGVuZ3RoIDwgMSkgfHwgKGUuY29tbWVudC5sZW5ndGggPiAxMjgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgXCJuc0NvbW1lbnRcIiBjb250ZW50LicpO1xuICAgIH1cbiAgICAvLyBJQTVTVFJJTkcgb3BhcXVlIGNvbW1lbnRcbiAgICBlLnZhbHVlID0gYXNuMS5jcmVhdGUoXG4gICAgICBhc24xLkNsYXNzLlVOSVZFUlNBTCwgYXNuMS5UeXBlLklBNVNUUklORywgZmFsc2UsIGUuY29tbWVudCk7XG4gIH0gZWxzZSBpZihlLm5hbWUgPT09ICdzdWJqZWN0S2V5SWRlbnRpZmllcicgJiYgb3B0aW9ucy5jZXJ0KSB7XG4gICAgdmFyIHNraSA9IG9wdGlvbnMuY2VydC5nZW5lcmF0ZVN1YmplY3RLZXlJZGVudGlmaWVyKCk7XG4gICAgZS5zdWJqZWN0S2V5SWRlbnRpZmllciA9IHNraS50b0hleCgpO1xuICAgIC8vIE9DVEVUU1RSSU5HIHcvZGlnZXN0XG4gICAgZS52YWx1ZSA9IGFzbjEuY3JlYXRlKFxuICAgICAgYXNuMS5DbGFzcy5VTklWRVJTQUwsIGFzbjEuVHlwZS5PQ1RFVFNUUklORywgZmFsc2UsIHNraS5nZXRCeXRlcygpKTtcbiAgfSBlbHNlIGlmKGUubmFtZSA9PT0gJ2F1dGhvcml0eUtleUlkZW50aWZpZXInICYmIG9wdGlvbnMuY2VydCkge1xuICAgIC8vIFNZTlRBWCBTRVFVRU5DRVxuICAgIGUudmFsdWUgPSBhc24xLmNyZWF0ZShhc24xLkNsYXNzLlVOSVZFUlNBTCwgYXNuMS5UeXBlLlNFUVVFTkNFLCB0cnVlLCBbXSk7XG4gICAgdmFyIHNlcSA9IGUudmFsdWUudmFsdWU7XG5cbiAgICBpZihlLmtleUlkZW50aWZpZXIpIHtcbiAgICAgIHZhciBrZXlJZGVudGlmaWVyID0gKGUua2V5SWRlbnRpZmllciA9PT0gdHJ1ZSA/XG4gICAgICAgIG9wdGlvbnMuY2VydC5nZW5lcmF0ZVN1YmplY3RLZXlJZGVudGlmaWVyKCkuZ2V0Qnl0ZXMoKSA6XG4gICAgICAgIGUua2V5SWRlbnRpZmllcik7XG4gICAgICBzZXEucHVzaChcbiAgICAgICAgYXNuMS5jcmVhdGUoYXNuMS5DbGFzcy5DT05URVhUX1NQRUNJRklDLCAwLCBmYWxzZSwga2V5SWRlbnRpZmllcikpO1xuICAgIH1cblxuICAgIGlmKGUuYXV0aG9yaXR5Q2VydElzc3Vlcikge1xuICAgICAgdmFyIGF1dGhvcml0eUNlcnRJc3N1ZXIgPSBbXG4gICAgICAgIGFzbjEuY3JlYXRlKGFzbjEuQ2xhc3MuQ09OVEVYVF9TUEVDSUZJQywgNCwgdHJ1ZSwgW1xuICAgICAgICAgIF9kblRvQXNuMShlLmF1dGhvcml0eUNlcnRJc3N1ZXIgPT09IHRydWUgP1xuICAgICAgICAgICAgb3B0aW9ucy5jZXJ0Lmlzc3VlciA6IGUuYXV0aG9yaXR5Q2VydElzc3VlcilcbiAgICAgICAgXSlcbiAgICAgIF07XG4gICAgICBzZXEucHVzaChcbiAgICAgICAgYXNuMS5jcmVhdGUoYXNuMS5DbGFzcy5DT05URVhUX1NQRUNJRklDLCAxLCB0cnVlLCBhdXRob3JpdHlDZXJ0SXNzdWVyKSk7XG4gICAgfVxuXG4gICAgaWYoZS5zZXJpYWxOdW1iZXIpIHtcbiAgICAgIHZhciBzZXJpYWxOdW1iZXIgPSBmb3JnZS51dGlsLmhleFRvQnl0ZXMoZS5zZXJpYWxOdW1iZXIgPT09IHRydWUgP1xuICAgICAgICBvcHRpb25zLmNlcnQuc2VyaWFsTnVtYmVyIDogZS5zZXJpYWxOdW1iZXIpO1xuICAgICAgc2VxLnB1c2goXG4gICAgICAgIGFzbjEuY3JlYXRlKGFzbjEuQ2xhc3MuQ09OVEVYVF9TUEVDSUZJQywgMiwgZmFsc2UsIHNlcmlhbE51bWJlcikpO1xuICAgIH1cbiAgfSBlbHNlIGlmKGUubmFtZSA9PT0gJ2NSTERpc3RyaWJ1dGlvblBvaW50cycpIHtcbiAgICBlLnZhbHVlID0gYXNuMS5jcmVhdGUoYXNuMS5DbGFzcy5VTklWRVJTQUwsIGFzbjEuVHlwZS5TRVFVRU5DRSwgdHJ1ZSwgW10pO1xuICAgIHZhciBzZXEgPSBlLnZhbHVlLnZhbHVlO1xuXG4gICAgLy8gQ3JlYXRlIHN1YiBTRVFVRU5DRSBvZiBEaXN0cmlidXRpb25Qb2ludE5hbWVcbiAgICB2YXIgc3ViU2VxID0gYXNuMS5jcmVhdGUoXG4gICAgICBhc24xLkNsYXNzLlVOSVZFUlNBTCwgYXNuMS5UeXBlLlNFUVVFTkNFLCB0cnVlLCBbXSk7XG5cbiAgICAvLyBDcmVhdGUgZnVsbE5hbWUgQ0hPSUNFXG4gICAgdmFyIGZ1bGxOYW1lR2VuZXJhbE5hbWVzID0gYXNuMS5jcmVhdGUoXG4gICAgICBhc24xLkNsYXNzLkNPTlRFWFRfU1BFQ0lGSUMsIDAsIHRydWUsIFtdKTtcbiAgICB2YXIgYWx0TmFtZTtcbiAgICBmb3IodmFyIG4gPSAwOyBuIDwgZS5hbHROYW1lcy5sZW5ndGg7ICsrbikge1xuICAgICAgYWx0TmFtZSA9IGUuYWx0TmFtZXNbbl07XG4gICAgICB2YXIgdmFsdWUgPSBhbHROYW1lLnZhbHVlO1xuICAgICAgLy8gaGFuZGxlIElQXG4gICAgICBpZihhbHROYW1lLnR5cGUgPT09IDcgJiYgYWx0TmFtZS5pcCkge1xuICAgICAgICB2YWx1ZSA9IGZvcmdlLnV0aWwuYnl0ZXNGcm9tSVAoYWx0TmFtZS5pcCk7XG4gICAgICAgIGlmKHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgICAgdmFyIGVycm9yID0gbmV3IEVycm9yKFxuICAgICAgICAgICAgJ0V4dGVuc2lvbiBcImlwXCIgdmFsdWUgaXMgbm90IGEgdmFsaWQgSVB2NCBvciBJUHY2IGFkZHJlc3MuJyk7XG4gICAgICAgICAgZXJyb3IuZXh0ZW5zaW9uID0gZTtcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmKGFsdE5hbWUudHlwZSA9PT0gOCkge1xuICAgICAgICAvLyBoYW5kbGUgT0lEXG4gICAgICAgIGlmKGFsdE5hbWUub2lkKSB7XG4gICAgICAgICAgdmFsdWUgPSBhc24xLm9pZFRvRGVyKGFzbjEub2lkVG9EZXIoYWx0TmFtZS5vaWQpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBkZXByZWNhdGVkIC4uLiBjb252ZXJ0IHZhbHVlIHRvIE9JRFxuICAgICAgICAgIHZhbHVlID0gYXNuMS5vaWRUb0Rlcih2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZ1bGxOYW1lR2VuZXJhbE5hbWVzLnZhbHVlLnB1c2goYXNuMS5jcmVhdGUoXG4gICAgICAgIGFzbjEuQ2xhc3MuQ09OVEVYVF9TUEVDSUZJQywgYWx0TmFtZS50eXBlLCBmYWxzZSxcbiAgICAgICAgdmFsdWUpKTtcbiAgICB9XG5cbiAgICAvLyBBZGQgdG8gdGhlIHBhcmVudCBTRVFVRU5DRVxuICAgIHN1YlNlcS52YWx1ZS5wdXNoKGFzbjEuY3JlYXRlKFxuICAgICAgYXNuMS5DbGFzcy5DT05URVhUX1NQRUNJRklDLCAwLCB0cnVlLCBbZnVsbE5hbWVHZW5lcmFsTmFtZXNdKSk7XG4gICAgc2VxLnB1c2goc3ViU2VxKTtcbiAgfVxuXG4gIC8vIGVuc3VyZSB2YWx1ZSBoYXMgYmVlbiBkZWZpbmVkIGJ5IG5vd1xuICBpZih0eXBlb2YgZS52YWx1ZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICB2YXIgZXJyb3IgPSBuZXcgRXJyb3IoJ0V4dGVuc2lvbiB2YWx1ZSBub3Qgc3BlY2lmaWVkLicpO1xuICAgIGVycm9yLmV4dGVuc2lvbiA9IGU7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cblxuICByZXR1cm4gZTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0IHNpZ25hdHVyZSBwYXJhbWV0ZXJzIG9iamVjdCB0byBBU04uMVxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBvaWQgU2lnbmF0dXJlIGFsZ29yaXRobSBPSURcbiAqIEBwYXJhbSBwYXJhbXMgVGhlIHNpZ25hdHVyZSBwYXJhbWV0cnMgb2JqZWN0XG4gKiBAcmV0dXJuIEFTTi4xIG9iamVjdCByZXByZXNlbnRpbmcgc2lnbmF0dXJlIHBhcmFtZXRlcnNcbiAqL1xuZnVuY3Rpb24gX3NpZ25hdHVyZVBhcmFtZXRlcnNUb0FzbjEob2lkLCBwYXJhbXMpIHtcbiAgc3dpdGNoKG9pZCkge1xuICAgIGNhc2Ugb2lkc1snUlNBU1NBLVBTUyddOlxuICAgICAgdmFyIHBhcnRzID0gW107XG5cbiAgICAgIGlmKHBhcmFtcy5oYXNoLmFsZ29yaXRobU9pZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHBhcnRzLnB1c2goYXNuMS5jcmVhdGUoYXNuMS5DbGFzcy5DT05URVhUX1NQRUNJRklDLCAwLCB0cnVlLCBbXG4gICAgICAgICAgYXNuMS5jcmVhdGUoYXNuMS5DbGFzcy5VTklWRVJTQUwsIGFzbjEuVHlwZS5TRVFVRU5DRSwgdHJ1ZSwgW1xuICAgICAgICAgICAgYXNuMS5jcmVhdGUoYXNuMS5DbGFzcy5VTklWRVJTQUwsIGFzbjEuVHlwZS5PSUQsIGZhbHNlLFxuICAgICAgICAgICAgICBhc24xLm9pZFRvRGVyKHBhcmFtcy5oYXNoLmFsZ29yaXRobU9pZCkuZ2V0Qnl0ZXMoKSksXG4gICAgICAgICAgICBhc24xLmNyZWF0ZShhc24xLkNsYXNzLlVOSVZFUlNBTCwgYXNuMS5UeXBlLk5VTEwsIGZhbHNlLCAnJylcbiAgICAgICAgICBdKVxuICAgICAgICBdKSk7XG4gICAgICB9XG5cbiAgICAgIGlmKHBhcmFtcy5tZ2YuYWxnb3JpdGhtT2lkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcGFydHMucHVzaChhc24xLmNyZWF0ZShhc24xLkNsYXNzLkNPTlRFWFRfU1BFQ0lGSUMsIDEsIHRydWUsIFtcbiAgICAgICAgICBhc24xLmNyZWF0ZShhc24xLkNsYXNzLlVOSVZFUlNBTCwgYXNuMS5UeXBlLlNFUVVFTkNFLCB0cnVlLCBbXG4gICAgICAgICAgICBhc24xLmNyZWF0ZShhc24xLkNsYXNzLlVOSVZFUlNBTCwgYXNuMS5UeXBlLk9JRCwgZmFsc2UsXG4gICAgICAgICAgICAgIGFzbjEub2lkVG9EZXIocGFyYW1zLm1nZi5hbGdvcml0aG1PaWQpLmdldEJ5dGVzKCkpLFxuICAgICAgICAgICAgYXNuMS5jcmVhdGUoYXNuMS5DbGFzcy5VTklWRVJTQUwsIGFzbjEuVHlwZS5TRVFVRU5DRSwgdHJ1ZSwgW1xuICAgICAgICAgICAgICBhc24xLmNyZWF0ZShhc24xLkNsYXNzLlVOSVZFUlNBTCwgYXNuMS5UeXBlLk9JRCwgZmFsc2UsXG4gICAgICAgICAgICAgICAgYXNuMS5vaWRUb0RlcihwYXJhbXMubWdmLmhhc2guYWxnb3JpdGhtT2lkKS5nZXRCeXRlcygpKSxcbiAgICAgICAgICAgICAgYXNuMS5jcmVhdGUoYXNuMS5DbGFzcy5VTklWRVJTQUwsIGFzbjEuVHlwZS5OVUxMLCBmYWxzZSwgJycpXG4gICAgICAgICAgICBdKVxuICAgICAgICAgIF0pXG4gICAgICAgIF0pKTtcbiAgICAgIH1cblxuICAgICAgaWYocGFyYW1zLnNhbHRMZW5ndGggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBwYXJ0cy5wdXNoKGFzbjEuY3JlYXRlKGFzbjEuQ2xhc3MuQ09OVEVYVF9TUEVDSUZJQywgMiwgdHJ1ZSwgW1xuICAgICAgICAgIGFzbjEuY3JlYXRlKGFzbjEuQ2xhc3MuVU5JVkVSU0FMLCBhc24xLlR5cGUuSU5URUdFUiwgZmFsc2UsXG4gICAgICAgICAgICBhc24xLmludGVnZXJUb0RlcihwYXJhbXMuc2FsdExlbmd0aCkuZ2V0Qnl0ZXMoKSlcbiAgICAgICAgXSkpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYXNuMS5jcmVhdGUoYXNuMS5DbGFzcy5VTklWRVJTQUwsIGFzbjEuVHlwZS5TRVFVRU5DRSwgdHJ1ZSwgcGFydHMpO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBhc24xLmNyZWF0ZShhc24xLkNsYXNzLlVOSVZFUlNBTCwgYXNuMS5UeXBlLk5VTEwsIGZhbHNlLCAnJyk7XG4gIH1cbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIGNlcnRpZmljYXRpb24gcmVxdWVzdCdzIGF0dHJpYnV0ZXMgdG8gYW4gQVNOLjEgc2V0IG9mXG4gKiBDUklBdHRyaWJ1dGVzLlxuICpcbiAqIEBwYXJhbSBjc3IgY2VydGlmaWNhdGlvbiByZXF1ZXN0LlxuICpcbiAqIEByZXR1cm4gdGhlIEFTTi4xIHNldCBvZiBDUklBdHRyaWJ1dGVzLlxuICovXG5mdW5jdGlvbiBfQ1JJQXR0cmlidXRlc1RvQXNuMShjc3IpIHtcbiAgLy8gY3JlYXRlIGFuIGVtcHR5IGNvbnRleHQtc3BlY2lmaWMgY29udGFpbmVyXG4gIHZhciBydmFsID0gYXNuMS5jcmVhdGUoYXNuMS5DbGFzcy5DT05URVhUX1NQRUNJRklDLCAwLCB0cnVlLCBbXSk7XG5cbiAgLy8gbm8gYXR0cmlidXRlcywgcmV0dXJuIGVtcHR5IGNvbnRhaW5lclxuICBpZihjc3IuYXR0cmlidXRlcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gcnZhbDtcbiAgfVxuXG4gIC8vIGVhY2ggYXR0cmlidXRlIGhhcyBhIHNlcXVlbmNlIHdpdGggYSB0eXBlIGFuZCBhIHNldCBvZiB2YWx1ZXNcbiAgdmFyIGF0dHJzID0gY3NyLmF0dHJpYnV0ZXM7XG4gIGZvcih2YXIgaSA9IDA7IGkgPCBhdHRycy5sZW5ndGg7ICsraSkge1xuICAgIHZhciBhdHRyID0gYXR0cnNbaV07XG4gICAgdmFyIHZhbHVlID0gYXR0ci52YWx1ZTtcblxuICAgIC8vIHJldXNlIHRhZyBjbGFzcyBmb3IgYXR0cmlidXRlIHZhbHVlIGlmIGF2YWlsYWJsZVxuICAgIHZhciB2YWx1ZVRhZ0NsYXNzID0gYXNuMS5UeXBlLlVURjg7XG4gICAgaWYoJ3ZhbHVlVGFnQ2xhc3MnIGluIGF0dHIpIHtcbiAgICAgIHZhbHVlVGFnQ2xhc3MgPSBhdHRyLnZhbHVlVGFnQ2xhc3M7XG4gICAgfVxuICAgIGlmKHZhbHVlVGFnQ2xhc3MgPT09IGFzbjEuVHlwZS5VVEY4KSB7XG4gICAgICB2YWx1ZSA9IGZvcmdlLnV0aWwuZW5jb2RlVXRmOCh2YWx1ZSk7XG4gICAgfVxuICAgIHZhciB2YWx1ZUNvbnN0cnVjdGVkID0gZmFsc2U7XG4gICAgaWYoJ3ZhbHVlQ29uc3RydWN0ZWQnIGluIGF0dHIpIHtcbiAgICAgIHZhbHVlQ29uc3RydWN0ZWQgPSBhdHRyLnZhbHVlQ29uc3RydWN0ZWQ7XG4gICAgfVxuICAgIC8vIEZJWE1FOiBoYW5kbGUgbW9yZSBlbmNvZGluZ3NcblxuICAgIC8vIGNyZWF0ZSBhIFJlbGF0aXZlRGlzdGluZ3Vpc2hlZE5hbWUgc2V0XG4gICAgLy8gZWFjaCB2YWx1ZSBpbiB0aGUgc2V0IGlzIGFuIEF0dHJpYnV0ZVR5cGVBbmRWYWx1ZSBmaXJzdFxuICAgIC8vIGNvbnRhaW5pbmcgdGhlIHR5cGUgKGFuIE9JRCkgYW5kIHNlY29uZCB0aGUgdmFsdWVcbiAgICB2YXIgc2VxID0gYXNuMS5jcmVhdGUoYXNuMS5DbGFzcy5VTklWRVJTQUwsIGFzbjEuVHlwZS5TRVFVRU5DRSwgdHJ1ZSwgW1xuICAgICAgLy8gQXR0cmlidXRlVHlwZVxuICAgICAgYXNuMS5jcmVhdGUoYXNuMS5DbGFzcy5VTklWRVJTQUwsIGFzbjEuVHlwZS5PSUQsIGZhbHNlLFxuICAgICAgICBhc24xLm9pZFRvRGVyKGF0dHIudHlwZSkuZ2V0Qnl0ZXMoKSksXG4gICAgICBhc24xLmNyZWF0ZShhc24xLkNsYXNzLlVOSVZFUlNBTCwgYXNuMS5UeXBlLlNFVCwgdHJ1ZSwgW1xuICAgICAgICAvLyBBdHRyaWJ1dGVWYWx1ZVxuICAgICAgICBhc24xLmNyZWF0ZShcbiAgICAgICAgICBhc24xLkNsYXNzLlVOSVZFUlNBTCwgdmFsdWVUYWdDbGFzcywgdmFsdWVDb25zdHJ1Y3RlZCwgdmFsdWUpXG4gICAgICBdKVxuICAgIF0pO1xuICAgIHJ2YWwudmFsdWUucHVzaChzZXEpO1xuICB9XG5cbiAgcmV0dXJuIHJ2YWw7XG59XG5cbnZhciBqYW5fMV8xOTUwID0gbmV3IERhdGUoJzE5NTAtMDEtMDFUMDA6MDA6MDBaJyk7XG52YXIgamFuXzFfMjA1MCA9IG5ldyBEYXRlKCcyMDUwLTAxLTAxVDAwOjAwOjAwWicpO1xuXG4vKipcbiAqIENvbnZlcnRzIGEgRGF0ZSBvYmplY3QgdG8gQVNOLjFcbiAqIEhhbmRsZXMgdGhlIGRpZmZlcmVudCBmb3JtYXQgYmVmb3JlIGFuZCBhZnRlciAxc3QgSmFudWFyeSAyMDUwXG4gKlxuICogQHBhcmFtIGRhdGUgZGF0ZSBvYmplY3QuXG4gKlxuICogQHJldHVybiB0aGUgQVNOLjEgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgZGF0ZS5cbiAqL1xuZnVuY3Rpb24gX2RhdGVUb0FzbjEoZGF0ZSkge1xuICBpZihkYXRlID49IGphbl8xXzE5NTAgJiYgZGF0ZSA8IGphbl8xXzIwNTApIHtcbiAgICByZXR1cm4gYXNuMS5jcmVhdGUoXG4gICAgICBhc24xLkNsYXNzLlVOSVZFUlNBTCwgYXNuMS5UeXBlLlVUQ1RJTUUsIGZhbHNlLFxuICAgICAgYXNuMS5kYXRlVG9VdGNUaW1lKGRhdGUpKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gYXNuMS5jcmVhdGUoXG4gICAgICBhc24xLkNsYXNzLlVOSVZFUlNBTCwgYXNuMS5UeXBlLkdFTkVSQUxJWkVEVElNRSwgZmFsc2UsXG4gICAgICBhc24xLmRhdGVUb0dlbmVyYWxpemVkVGltZShkYXRlKSk7XG4gIH1cbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBBU04uMSBUQlNDZXJ0aWZpY2F0ZSBwYXJ0IG9mIGFuIFguNTA5djMgY2VydGlmaWNhdGUuXG4gKlxuICogQHBhcmFtIGNlcnQgdGhlIGNlcnRpZmljYXRlLlxuICpcbiAqIEByZXR1cm4gdGhlIGFzbjEgVEJTQ2VydGlmaWNhdGUuXG4gKi9cbnBraS5nZXRUQlNDZXJ0aWZpY2F0ZSA9IGZ1bmN0aW9uKGNlcnQpIHtcbiAgLy8gVEJTQ2VydGlmaWNhdGVcbiAgdmFyIG5vdEJlZm9yZSA9IF9kYXRlVG9Bc24xKGNlcnQudmFsaWRpdHkubm90QmVmb3JlKTtcbiAgdmFyIG5vdEFmdGVyID0gX2RhdGVUb0FzbjEoY2VydC52YWxpZGl0eS5ub3RBZnRlcik7XG4gIHZhciB0YnMgPSBhc24xLmNyZWF0ZShhc24xLkNsYXNzLlVOSVZFUlNBTCwgYXNuMS5UeXBlLlNFUVVFTkNFLCB0cnVlLCBbXG4gICAgLy8gdmVyc2lvblxuICAgIGFzbjEuY3JlYXRlKGFzbjEuQ2xhc3MuQ09OVEVYVF9TUEVDSUZJQywgMCwgdHJ1ZSwgW1xuICAgICAgLy8gaW50ZWdlclxuICAgICAgYXNuMS5jcmVhdGUoYXNuMS5DbGFzcy5VTklWRVJTQUwsIGFzbjEuVHlwZS5JTlRFR0VSLCBmYWxzZSxcbiAgICAgICAgYXNuMS5pbnRlZ2VyVG9EZXIoY2VydC52ZXJzaW9uKS5nZXRCeXRlcygpKVxuICAgIF0pLFxuICAgIC8vIHNlcmlhbE51bWJlclxuICAgIGFzbjEuY3JlYXRlKGFzbjEuQ2xhc3MuVU5JVkVSU0FMLCBhc24xLlR5cGUuSU5URUdFUiwgZmFsc2UsXG4gICAgICBmb3JnZS51dGlsLmhleFRvQnl0ZXMoY2VydC5zZXJpYWxOdW1iZXIpKSxcbiAgICAvLyBzaWduYXR1cmVcbiAgICBhc24xLmNyZWF0ZShhc24xLkNsYXNzLlVOSVZFUlNBTCwgYXNuMS5UeXBlLlNFUVVFTkNFLCB0cnVlLCBbXG4gICAgICAvLyBhbGdvcml0aG1cbiAgICAgIGFzbjEuY3JlYXRlKGFzbjEuQ2xhc3MuVU5JVkVSU0FMLCBhc24xLlR5cGUuT0lELCBmYWxzZSxcbiAgICAgICAgYXNuMS5vaWRUb0RlcihjZXJ0LnNpZ2luZm8uYWxnb3JpdGhtT2lkKS5nZXRCeXRlcygpKSxcbiAgICAgIC8vIHBhcmFtZXRlcnNcbiAgICAgIF9zaWduYXR1cmVQYXJhbWV0ZXJzVG9Bc24xKFxuICAgICAgICBjZXJ0LnNpZ2luZm8uYWxnb3JpdGhtT2lkLCBjZXJ0LnNpZ2luZm8ucGFyYW1ldGVycylcbiAgICBdKSxcbiAgICAvLyBpc3N1ZXJcbiAgICBfZG5Ub0FzbjEoY2VydC5pc3N1ZXIpLFxuICAgIC8vIHZhbGlkaXR5XG4gICAgYXNuMS5jcmVhdGUoYXNuMS5DbGFzcy5VTklWRVJTQUwsIGFzbjEuVHlwZS5TRVFVRU5DRSwgdHJ1ZSwgW1xuICAgICAgbm90QmVmb3JlLFxuICAgICAgbm90QWZ0ZXJcbiAgICBdKSxcbiAgICAvLyBzdWJqZWN0XG4gICAgX2RuVG9Bc24xKGNlcnQuc3ViamVjdCksXG4gICAgLy8gU3ViamVjdFB1YmxpY0tleUluZm9cbiAgICBwa2kucHVibGljS2V5VG9Bc24xKGNlcnQucHVibGljS2V5KVxuICBdKTtcblxuICBpZihjZXJ0Lmlzc3Vlci51bmlxdWVJZCkge1xuICAgIC8vIGlzc3VlclVuaXF1ZUlEIChvcHRpb25hbClcbiAgICB0YnMudmFsdWUucHVzaChcbiAgICAgIGFzbjEuY3JlYXRlKGFzbjEuQ2xhc3MuQ09OVEVYVF9TUEVDSUZJQywgMSwgdHJ1ZSwgW1xuICAgICAgICBhc24xLmNyZWF0ZShhc24xLkNsYXNzLlVOSVZFUlNBTCwgYXNuMS5UeXBlLkJJVFNUUklORywgZmFsc2UsXG4gICAgICAgICAgLy8gVE9ETzogc3VwcG9ydCBhcmJpdHJhcnkgYml0IGxlbmd0aCBpZHNcbiAgICAgICAgICBTdHJpbmcuZnJvbUNoYXJDb2RlKDB4MDApICtcbiAgICAgICAgICBjZXJ0Lmlzc3Vlci51bmlxdWVJZFxuICAgICAgICApXG4gICAgICBdKVxuICAgICk7XG4gIH1cbiAgaWYoY2VydC5zdWJqZWN0LnVuaXF1ZUlkKSB7XG4gICAgLy8gc3ViamVjdFVuaXF1ZUlEIChvcHRpb25hbClcbiAgICB0YnMudmFsdWUucHVzaChcbiAgICAgIGFzbjEuY3JlYXRlKGFzbjEuQ2xhc3MuQ09OVEVYVF9TUEVDSUZJQywgMiwgdHJ1ZSwgW1xuICAgICAgICBhc24xLmNyZWF0ZShhc24xLkNsYXNzLlVOSVZFUlNBTCwgYXNuMS5UeXBlLkJJVFNUUklORywgZmFsc2UsXG4gICAgICAgICAgLy8gVE9ETzogc3VwcG9ydCBhcmJpdHJhcnkgYml0IGxlbmd0aCBpZHNcbiAgICAgICAgICBTdHJpbmcuZnJvbUNoYXJDb2RlKDB4MDApICtcbiAgICAgICAgICBjZXJ0LnN1YmplY3QudW5pcXVlSWRcbiAgICAgICAgKVxuICAgICAgXSlcbiAgICApO1xuICB9XG5cbiAgaWYoY2VydC5leHRlbnNpb25zLmxlbmd0aCA+IDApIHtcbiAgICAvLyBleHRlbnNpb25zIChvcHRpb25hbClcbiAgICB0YnMudmFsdWUucHVzaChwa2kuY2VydGlmaWNhdGVFeHRlbnNpb25zVG9Bc24xKGNlcnQuZXh0ZW5zaW9ucykpO1xuICB9XG5cbiAgcmV0dXJuIHRicztcbn07XG5cbi8qKlxuICogR2V0cyB0aGUgQVNOLjEgQ2VydGlmaWNhdGlvblJlcXVlc3RJbmZvIHBhcnQgb2YgYVxuICogUEtDUyMxMCBDZXJ0aWZpY2F0aW9uUmVxdWVzdC5cbiAqXG4gKiBAcGFyYW0gY3NyIHRoZSBjZXJ0aWZpY2F0aW9uIHJlcXVlc3QuXG4gKlxuICogQHJldHVybiB0aGUgYXNuMSBDZXJ0aWZpY2F0aW9uUmVxdWVzdEluZm8uXG4gKi9cbnBraS5nZXRDZXJ0aWZpY2F0aW9uUmVxdWVzdEluZm8gPSBmdW5jdGlvbihjc3IpIHtcbiAgLy8gQ2VydGlmaWNhdGlvblJlcXVlc3RJbmZvXG4gIHZhciBjcmkgPSBhc24xLmNyZWF0ZShhc24xLkNsYXNzLlVOSVZFUlNBTCwgYXNuMS5UeXBlLlNFUVVFTkNFLCB0cnVlLCBbXG4gICAgLy8gdmVyc2lvblxuICAgIGFzbjEuY3JlYXRlKGFzbjEuQ2xhc3MuVU5JVkVSU0FMLCBhc24xLlR5cGUuSU5URUdFUiwgZmFsc2UsXG4gICAgICBhc24xLmludGVnZXJUb0Rlcihjc3IudmVyc2lvbikuZ2V0Qnl0ZXMoKSksXG4gICAgLy8gc3ViamVjdFxuICAgIF9kblRvQXNuMShjc3Iuc3ViamVjdCksXG4gICAgLy8gU3ViamVjdFB1YmxpY0tleUluZm9cbiAgICBwa2kucHVibGljS2V5VG9Bc24xKGNzci5wdWJsaWNLZXkpLFxuICAgIC8vIGF0dHJpYnV0ZXNcbiAgICBfQ1JJQXR0cmlidXRlc1RvQXNuMShjc3IpXG4gIF0pO1xuXG4gIHJldHVybiBjcmk7XG59O1xuXG4vKipcbiAqIENvbnZlcnRzIGEgRGlzdGluZ3Vpc2hlZE5hbWUgKHN1YmplY3Qgb3IgaXNzdWVyKSB0byBhbiBBU04uMSBvYmplY3QuXG4gKlxuICogQHBhcmFtIGRuIHRoZSBEaXN0aW5ndWlzaGVkTmFtZS5cbiAqXG4gKiBAcmV0dXJuIHRoZSBhc24xIHJlcHJlc2VudGF0aW9uIG9mIGEgRGlzdGluZ3Vpc2hlZE5hbWUuXG4gKi9cbnBraS5kaXN0aW5ndWlzaGVkTmFtZVRvQXNuMSA9IGZ1bmN0aW9uKGRuKSB7XG4gIHJldHVybiBfZG5Ub0FzbjEoZG4pO1xufTtcblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBYLjUwOXYzIFJTQSBjZXJ0aWZpY2F0ZSB0byBhbiBBU04uMSBvYmplY3QuXG4gKlxuICogQHBhcmFtIGNlcnQgdGhlIGNlcnRpZmljYXRlLlxuICpcbiAqIEByZXR1cm4gdGhlIGFzbjEgcmVwcmVzZW50YXRpb24gb2YgYW4gWC41MDl2MyBSU0EgY2VydGlmaWNhdGUuXG4gKi9cbnBraS5jZXJ0aWZpY2F0ZVRvQXNuMSA9IGZ1bmN0aW9uKGNlcnQpIHtcbiAgLy8gcHJlZmVyIGNhY2hlZCBUQlNDZXJ0aWZpY2F0ZSBvdmVyIGdlbmVyYXRpbmcgb25lXG4gIHZhciB0YnNDZXJ0aWZpY2F0ZSA9IGNlcnQudGJzQ2VydGlmaWNhdGUgfHwgcGtpLmdldFRCU0NlcnRpZmljYXRlKGNlcnQpO1xuXG4gIC8vIENlcnRpZmljYXRlXG4gIHJldHVybiBhc24xLmNyZWF0ZShhc24xLkNsYXNzLlVOSVZFUlNBTCwgYXNuMS5UeXBlLlNFUVVFTkNFLCB0cnVlLCBbXG4gICAgLy8gVEJTQ2VydGlmaWNhdGVcbiAgICB0YnNDZXJ0aWZpY2F0ZSxcbiAgICAvLyBBbGdvcml0aG1JZGVudGlmaWVyIChzaWduYXR1cmUgYWxnb3JpdGhtKVxuICAgIGFzbjEuY3JlYXRlKGFzbjEuQ2xhc3MuVU5JVkVSU0FMLCBhc24xLlR5cGUuU0VRVUVOQ0UsIHRydWUsIFtcbiAgICAgIC8vIGFsZ29yaXRobVxuICAgICAgYXNuMS5jcmVhdGUoYXNuMS5DbGFzcy5VTklWRVJTQUwsIGFzbjEuVHlwZS5PSUQsIGZhbHNlLFxuICAgICAgICBhc24xLm9pZFRvRGVyKGNlcnQuc2lnbmF0dXJlT2lkKS5nZXRCeXRlcygpKSxcbiAgICAgIC8vIHBhcmFtZXRlcnNcbiAgICAgIF9zaWduYXR1cmVQYXJhbWV0ZXJzVG9Bc24xKGNlcnQuc2lnbmF0dXJlT2lkLCBjZXJ0LnNpZ25hdHVyZVBhcmFtZXRlcnMpXG4gICAgXSksXG4gICAgLy8gU2lnbmF0dXJlVmFsdWVcbiAgICBhc24xLmNyZWF0ZShhc24xLkNsYXNzLlVOSVZFUlNBTCwgYXNuMS5UeXBlLkJJVFNUUklORywgZmFsc2UsXG4gICAgICBTdHJpbmcuZnJvbUNoYXJDb2RlKDB4MDApICsgY2VydC5zaWduYXR1cmUpXG4gIF0pO1xufTtcblxuLyoqXG4gKiBDb252ZXJ0cyBYLjUwOXYzIGNlcnRpZmljYXRlIGV4dGVuc2lvbnMgdG8gQVNOLjEuXG4gKlxuICogQHBhcmFtIGV4dHMgdGhlIGV4dGVuc2lvbnMgdG8gY29udmVydC5cbiAqXG4gKiBAcmV0dXJuIHRoZSBleHRlbnNpb25zIGluIEFTTi4xIGZvcm1hdC5cbiAqL1xucGtpLmNlcnRpZmljYXRlRXh0ZW5zaW9uc1RvQXNuMSA9IGZ1bmN0aW9uKGV4dHMpIHtcbiAgLy8gY3JlYXRlIHRvcC1sZXZlbCBleHRlbnNpb24gY29udGFpbmVyXG4gIHZhciBydmFsID0gYXNuMS5jcmVhdGUoYXNuMS5DbGFzcy5DT05URVhUX1NQRUNJRklDLCAzLCB0cnVlLCBbXSk7XG5cbiAgLy8gY3JlYXRlIGV4dGVuc2lvbiBzZXF1ZW5jZSAoc3RvcmVzIGEgc2VxdWVuY2UgZm9yIGVhY2ggZXh0ZW5zaW9uKVxuICB2YXIgc2VxID0gYXNuMS5jcmVhdGUoYXNuMS5DbGFzcy5VTklWRVJTQUwsIGFzbjEuVHlwZS5TRVFVRU5DRSwgdHJ1ZSwgW10pO1xuICBydmFsLnZhbHVlLnB1c2goc2VxKTtcblxuICBmb3IodmFyIGkgPSAwOyBpIDwgZXh0cy5sZW5ndGg7ICsraSkge1xuICAgIHNlcS52YWx1ZS5wdXNoKHBraS5jZXJ0aWZpY2F0ZUV4dGVuc2lvblRvQXNuMShleHRzW2ldKSk7XG4gIH1cblxuICByZXR1cm4gcnZhbDtcbn07XG5cbi8qKlxuICogQ29udmVydHMgYSBzaW5nbGUgY2VydGlmaWNhdGUgZXh0ZW5zaW9uIHRvIEFTTi4xLlxuICpcbiAqIEBwYXJhbSBleHQgdGhlIGV4dGVuc2lvbiB0byBjb252ZXJ0LlxuICpcbiAqIEByZXR1cm4gdGhlIGV4dGVuc2lvbiBpbiBBU04uMSBmb3JtYXQuXG4gKi9cbnBraS5jZXJ0aWZpY2F0ZUV4dGVuc2lvblRvQXNuMSA9IGZ1bmN0aW9uKGV4dCkge1xuICAvLyBjcmVhdGUgYSBzZXF1ZW5jZSBmb3IgZWFjaCBleHRlbnNpb25cbiAgdmFyIGV4dHNlcSA9IGFzbjEuY3JlYXRlKGFzbjEuQ2xhc3MuVU5JVkVSU0FMLCBhc24xLlR5cGUuU0VRVUVOQ0UsIHRydWUsIFtdKTtcblxuICAvLyBleHRuSUQgKE9JRClcbiAgZXh0c2VxLnZhbHVlLnB1c2goYXNuMS5jcmVhdGUoXG4gICAgYXNuMS5DbGFzcy5VTklWRVJTQUwsIGFzbjEuVHlwZS5PSUQsIGZhbHNlLFxuICAgIGFzbjEub2lkVG9EZXIoZXh0LmlkKS5nZXRCeXRlcygpKSk7XG5cbiAgLy8gY3JpdGljYWwgZGVmYXVsdHMgdG8gZmFsc2VcbiAgaWYoZXh0LmNyaXRpY2FsKSB7XG4gICAgLy8gY3JpdGljYWwgQk9PTEVBTiBERUZBVUxUIEZBTFNFXG4gICAgZXh0c2VxLnZhbHVlLnB1c2goYXNuMS5jcmVhdGUoXG4gICAgICBhc24xLkNsYXNzLlVOSVZFUlNBTCwgYXNuMS5UeXBlLkJPT0xFQU4sIGZhbHNlLFxuICAgICAgU3RyaW5nLmZyb21DaGFyQ29kZSgweEZGKSkpO1xuICB9XG5cbiAgdmFyIHZhbHVlID0gZXh0LnZhbHVlO1xuICBpZih0eXBlb2YgZXh0LnZhbHVlICE9PSAnc3RyaW5nJykge1xuICAgIC8vIHZhbHVlIGlzIGFzbi4xXG4gICAgdmFsdWUgPSBhc24xLnRvRGVyKHZhbHVlKS5nZXRCeXRlcygpO1xuICB9XG5cbiAgLy8gZXh0blZhbHVlIChPQ1RFVCBTVFJJTkcpXG4gIGV4dHNlcS52YWx1ZS5wdXNoKGFzbjEuY3JlYXRlKFxuICAgIGFzbjEuQ2xhc3MuVU5JVkVSU0FMLCBhc24xLlR5cGUuT0NURVRTVFJJTkcsIGZhbHNlLCB2YWx1ZSkpO1xuXG4gIHJldHVybiBleHRzZXE7XG59O1xuXG4vKipcbiAqIENvbnZlcnRzIGEgUEtDUyMxMCBjZXJ0aWZpY2F0aW9uIHJlcXVlc3QgdG8gYW4gQVNOLjEgb2JqZWN0LlxuICpcbiAqIEBwYXJhbSBjc3IgdGhlIGNlcnRpZmljYXRpb24gcmVxdWVzdC5cbiAqXG4gKiBAcmV0dXJuIHRoZSBhc24xIHJlcHJlc2VudGF0aW9uIG9mIGEgY2VydGlmaWNhdGlvbiByZXF1ZXN0LlxuICovXG5wa2kuY2VydGlmaWNhdGlvblJlcXVlc3RUb0FzbjEgPSBmdW5jdGlvbihjc3IpIHtcbiAgLy8gcHJlZmVyIGNhY2hlZCBDZXJ0aWZpY2F0aW9uUmVxdWVzdEluZm8gb3ZlciBnZW5lcmF0aW5nIG9uZVxuICB2YXIgY3JpID0gY3NyLmNlcnRpZmljYXRpb25SZXF1ZXN0SW5mbyB8fFxuICAgIHBraS5nZXRDZXJ0aWZpY2F0aW9uUmVxdWVzdEluZm8oY3NyKTtcblxuICAvLyBDZXJ0aWZpY2F0ZVxuICByZXR1cm4gYXNuMS5jcmVhdGUoYXNuMS5DbGFzcy5VTklWRVJTQUwsIGFzbjEuVHlwZS5TRVFVRU5DRSwgdHJ1ZSwgW1xuICAgIC8vIENlcnRpZmljYXRpb25SZXF1ZXN0SW5mb1xuICAgIGNyaSxcbiAgICAvLyBBbGdvcml0aG1JZGVudGlmaWVyIChzaWduYXR1cmUgYWxnb3JpdGhtKVxuICAgIGFzbjEuY3JlYXRlKGFzbjEuQ2xhc3MuVU5JVkVSU0FMLCBhc24xLlR5cGUuU0VRVUVOQ0UsIHRydWUsIFtcbiAgICAgIC8vIGFsZ29yaXRobVxuICAgICAgYXNuMS5jcmVhdGUoYXNuMS5DbGFzcy5VTklWRVJTQUwsIGFzbjEuVHlwZS5PSUQsIGZhbHNlLFxuICAgICAgICBhc24xLm9pZFRvRGVyKGNzci5zaWduYXR1cmVPaWQpLmdldEJ5dGVzKCkpLFxuICAgICAgLy8gcGFyYW1ldGVyc1xuICAgICAgX3NpZ25hdHVyZVBhcmFtZXRlcnNUb0FzbjEoY3NyLnNpZ25hdHVyZU9pZCwgY3NyLnNpZ25hdHVyZVBhcmFtZXRlcnMpXG4gICAgXSksXG4gICAgLy8gc2lnbmF0dXJlXG4gICAgYXNuMS5jcmVhdGUoYXNuMS5DbGFzcy5VTklWRVJTQUwsIGFzbjEuVHlwZS5CSVRTVFJJTkcsIGZhbHNlLFxuICAgICAgU3RyaW5nLmZyb21DaGFyQ29kZSgweDAwKSArIGNzci5zaWduYXR1cmUpXG4gIF0pO1xufTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgQ0Egc3RvcmUuXG4gKlxuICogQHBhcmFtIGNlcnRzIGFuIG9wdGlvbmFsIGFycmF5IG9mIGNlcnRpZmljYXRlIG9iamVjdHMgb3IgUEVNLWZvcm1hdHRlZFxuICogICAgICAgICAgY2VydGlmaWNhdGUgc3RyaW5ncyB0byBhZGQgdG8gdGhlIENBIHN0b3JlLlxuICpcbiAqIEByZXR1cm4gdGhlIENBIHN0b3JlLlxuICovXG5wa2kuY3JlYXRlQ2FTdG9yZSA9IGZ1bmN0aW9uKGNlcnRzKSB7XG4gIC8vIGNyZWF0ZSBDQSBzdG9yZVxuICB2YXIgY2FTdG9yZSA9IHtcbiAgICAvLyBzdG9yZWQgY2VydGlmaWNhdGVzXG4gICAgY2VydHM6IHt9XG4gIH07XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGNlcnRpZmljYXRlIHRoYXQgaXNzdWVkIHRoZSBwYXNzZWQgY2VydGlmaWNhdGUgb3IgaXRzXG4gICAqICdwYXJlbnQnLlxuICAgKlxuICAgKiBAcGFyYW0gY2VydCB0aGUgY2VydGlmaWNhdGUgdG8gZ2V0IHRoZSBwYXJlbnQgZm9yLlxuICAgKlxuICAgKiBAcmV0dXJuIHRoZSBwYXJlbnQgY2VydGlmaWNhdGUgb3IgbnVsbCBpZiBub25lIHdhcyBmb3VuZC5cbiAgICovXG4gIGNhU3RvcmUuZ2V0SXNzdWVyID0gZnVuY3Rpb24oY2VydCkge1xuICAgIHZhciBydmFsID0gZ2V0QnlTdWJqZWN0KGNlcnQuaXNzdWVyKTtcblxuICAgIC8vIHNlZSBpZiB0aGVyZSBhcmUgbXVsdGlwbGUgbWF0Y2hlc1xuICAgIC8qaWYoZm9yZ2UudXRpbC5pc0FycmF5KHJ2YWwpKSB7XG4gICAgICAvLyBUT0RPOiByZXNvbHZlIG11bHRpcGxlIG1hdGNoZXMgYnkgY2hlY2tpbmdcbiAgICAgIC8vIGF1dGhvcml0eUtleS9zdWJqZWN0S2V5L2lzc3VlclVuaXF1ZUlEL290aGVyIGlkZW50aWZpZXJzLCBldGMuXG4gICAgICAvLyBGSVhNRTogb3IgYWx0ZXJuYXRpdmVseSBkbyBhdXRob3JpdHkga2V5IG1hcHBpbmdcbiAgICAgIC8vIGlmIHBvc3NpYmxlIChYLjUwOXYxIGNlcnRzIGNhbid0IHdvcms/KVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXNvbHZpbmcgbXVsdGlwbGUgaXNzdWVyIG1hdGNoZXMgbm90IGltcGxlbWVudGVkIHlldC4nKTtcbiAgICB9Ki9cblxuICAgIHJldHVybiBydmFsO1xuICB9O1xuXG4gIC8qKlxuICAgKiBBZGRzIGEgdHJ1c3RlZCBjZXJ0aWZpY2F0ZSB0byB0aGUgc3RvcmUuXG4gICAqXG4gICAqIEBwYXJhbSBjZXJ0IHRoZSBjZXJ0aWZpY2F0ZSB0byBhZGQgYXMgYSB0cnVzdGVkIGNlcnRpZmljYXRlIChlaXRoZXIgYVxuICAgKiAgICAgICAgICBwa2kuY2VydGlmaWNhdGUgb2JqZWN0IG9yIGEgUEVNLWZvcm1hdHRlZCBjZXJ0aWZpY2F0ZSkuXG4gICAqL1xuICBjYVN0b3JlLmFkZENlcnRpZmljYXRlID0gZnVuY3Rpb24oY2VydCkge1xuICAgIC8vIGNvbnZlcnQgZnJvbSBwZW0gaWYgbmVjZXNzYXJ5XG4gICAgaWYodHlwZW9mIGNlcnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICBjZXJ0ID0gZm9yZ2UucGtpLmNlcnRpZmljYXRlRnJvbVBlbShjZXJ0KTtcbiAgICB9XG5cbiAgICBlbnN1cmVTdWJqZWN0SGFzSGFzaChjZXJ0LnN1YmplY3QpO1xuXG4gICAgaWYoIWNhU3RvcmUuaGFzQ2VydGlmaWNhdGUoY2VydCkpIHsgLy8gYXZvaWQgZHVwbGljYXRlIGNlcnRpZmljYXRlcyBpbiBzdG9yZVxuICAgICAgaWYoY2VydC5zdWJqZWN0Lmhhc2ggaW4gY2FTdG9yZS5jZXJ0cykge1xuICAgICAgICAvLyBzdWJqZWN0IGhhc2ggYWxyZWFkeSBleGlzdHMsIGFwcGVuZCB0byBhcnJheVxuICAgICAgICB2YXIgdG1wID0gY2FTdG9yZS5jZXJ0c1tjZXJ0LnN1YmplY3QuaGFzaF07XG4gICAgICAgIGlmKCFmb3JnZS51dGlsLmlzQXJyYXkodG1wKSkge1xuICAgICAgICAgIHRtcCA9IFt0bXBdO1xuICAgICAgICB9XG4gICAgICAgIHRtcC5wdXNoKGNlcnQpO1xuICAgICAgICBjYVN0b3JlLmNlcnRzW2NlcnQuc3ViamVjdC5oYXNoXSA9IHRtcDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNhU3RvcmUuY2VydHNbY2VydC5zdWJqZWN0Lmhhc2hdID0gY2VydDtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIENoZWNrcyB0byBzZWUgaWYgdGhlIGdpdmVuIGNlcnRpZmljYXRlIGlzIGluIHRoZSBzdG9yZS5cbiAgICpcbiAgICogQHBhcmFtIGNlcnQgdGhlIGNlcnRpZmljYXRlIHRvIGNoZWNrIChlaXRoZXIgYSBwa2kuY2VydGlmaWNhdGUgb3IgYVxuICAgKiAgICAgICAgICBQRU0tZm9ybWF0dGVkIGNlcnRpZmljYXRlKS5cbiAgICpcbiAgICogQHJldHVybiB0cnVlIGlmIHRoZSBjZXJ0aWZpY2F0ZSBpcyBpbiB0aGUgc3RvcmUsIGZhbHNlIGlmIG5vdC5cbiAgICovXG4gIGNhU3RvcmUuaGFzQ2VydGlmaWNhdGUgPSBmdW5jdGlvbihjZXJ0KSB7XG4gICAgLy8gY29udmVydCBmcm9tIHBlbSBpZiBuZWNlc3NhcnlcbiAgICBpZih0eXBlb2YgY2VydCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGNlcnQgPSBmb3JnZS5wa2kuY2VydGlmaWNhdGVGcm9tUGVtKGNlcnQpO1xuICAgIH1cblxuICAgIHZhciBtYXRjaCA9IGdldEJ5U3ViamVjdChjZXJ0LnN1YmplY3QpO1xuICAgIGlmKCFtYXRjaCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZighZm9yZ2UudXRpbC5pc0FycmF5KG1hdGNoKSkge1xuICAgICAgbWF0Y2ggPSBbbWF0Y2hdO1xuICAgIH1cbiAgICAvLyBjb21wYXJlIERFUi1lbmNvZGluZyBvZiBjZXJ0aWZpY2F0ZXNcbiAgICB2YXIgZGVyMSA9IGFzbjEudG9EZXIocGtpLmNlcnRpZmljYXRlVG9Bc24xKGNlcnQpKS5nZXRCeXRlcygpO1xuICAgIGZvcih2YXIgaSA9IDA7IGkgPCBtYXRjaC5sZW5ndGg7ICsraSkge1xuICAgICAgdmFyIGRlcjIgPSBhc24xLnRvRGVyKHBraS5jZXJ0aWZpY2F0ZVRvQXNuMShtYXRjaFtpXSkpLmdldEJ5dGVzKCk7XG4gICAgICBpZihkZXIxID09PSBkZXIyKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH07XG5cbiAgLyoqXG4gICAqIExpc3RzIGFsbCBvZiB0aGUgY2VydGlmaWNhdGVzIGtlcHQgaW4gdGhlIHN0b3JlLlxuICAgKlxuICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIGFsbCBvZiB0aGUgcGtpLmNlcnRpZmljYXRlIG9iamVjdHMgaW4gdGhlIHN0b3JlLlxuICAgKi9cbiAgY2FTdG9yZS5saXN0QWxsQ2VydGlmaWNhdGVzID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGNlcnRMaXN0ID0gW107XG5cbiAgICBmb3IodmFyIGhhc2ggaW4gY2FTdG9yZS5jZXJ0cykge1xuICAgICAgaWYoY2FTdG9yZS5jZXJ0cy5oYXNPd25Qcm9wZXJ0eShoYXNoKSkge1xuICAgICAgICB2YXIgdmFsdWUgPSBjYVN0b3JlLmNlcnRzW2hhc2hdO1xuICAgICAgICBpZighZm9yZ2UudXRpbC5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgIGNlcnRMaXN0LnB1c2godmFsdWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgY2VydExpc3QucHVzaCh2YWx1ZVtpXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGNlcnRMaXN0O1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGEgY2VydGlmaWNhdGUgZnJvbSB0aGUgc3RvcmUuXG4gICAqXG4gICAqIEBwYXJhbSBjZXJ0IHRoZSBjZXJ0aWZpY2F0ZSB0byByZW1vdmUgKGVpdGhlciBhIHBraS5jZXJ0aWZpY2F0ZSBvciBhXG4gICAqICAgICAgICAgIFBFTS1mb3JtYXR0ZWQgY2VydGlmaWNhdGUpLlxuICAgKlxuICAgKiBAcmV0dXJuIHRoZSBjZXJ0aWZpY2F0ZSB0aGF0IHdhcyByZW1vdmVkIG9yIG51bGwgaWYgdGhlIGNlcnRpZmljYXRlXG4gICAqICAgICAgICAgICB3YXNuJ3QgaW4gc3RvcmUuXG4gICAqL1xuICBjYVN0b3JlLnJlbW92ZUNlcnRpZmljYXRlID0gZnVuY3Rpb24oY2VydCkge1xuICAgIHZhciByZXN1bHQ7XG5cbiAgICAvLyBjb252ZXJ0IGZyb20gcGVtIGlmIG5lY2Vzc2FyeVxuICAgIGlmKHR5cGVvZiBjZXJ0ID09PSAnc3RyaW5nJykge1xuICAgICAgY2VydCA9IGZvcmdlLnBraS5jZXJ0aWZpY2F0ZUZyb21QZW0oY2VydCk7XG4gICAgfVxuICAgIGVuc3VyZVN1YmplY3RIYXNIYXNoKGNlcnQuc3ViamVjdCk7XG4gICAgaWYoIWNhU3RvcmUuaGFzQ2VydGlmaWNhdGUoY2VydCkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHZhciBtYXRjaCA9IGdldEJ5U3ViamVjdChjZXJ0LnN1YmplY3QpO1xuXG4gICAgaWYoIWZvcmdlLnV0aWwuaXNBcnJheShtYXRjaCkpIHtcbiAgICAgIHJlc3VsdCA9IGNhU3RvcmUuY2VydHNbY2VydC5zdWJqZWN0Lmhhc2hdO1xuICAgICAgZGVsZXRlIGNhU3RvcmUuY2VydHNbY2VydC5zdWJqZWN0Lmhhc2hdO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvLyBjb21wYXJlIERFUi1lbmNvZGluZyBvZiBjZXJ0aWZpY2F0ZXNcbiAgICB2YXIgZGVyMSA9IGFzbjEudG9EZXIocGtpLmNlcnRpZmljYXRlVG9Bc24xKGNlcnQpKS5nZXRCeXRlcygpO1xuICAgIGZvcih2YXIgaSA9IDA7IGkgPCBtYXRjaC5sZW5ndGg7ICsraSkge1xuICAgICAgdmFyIGRlcjIgPSBhc24xLnRvRGVyKHBraS5jZXJ0aWZpY2F0ZVRvQXNuMShtYXRjaFtpXSkpLmdldEJ5dGVzKCk7XG4gICAgICBpZihkZXIxID09PSBkZXIyKSB7XG4gICAgICAgIHJlc3VsdCA9IG1hdGNoW2ldO1xuICAgICAgICBtYXRjaC5zcGxpY2UoaSwgMSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmKG1hdGNoLmxlbmd0aCA9PT0gMCkge1xuICAgICAgZGVsZXRlIGNhU3RvcmUuY2VydHNbY2VydC5zdWJqZWN0Lmhhc2hdO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG5cbiAgZnVuY3Rpb24gZ2V0QnlTdWJqZWN0KHN1YmplY3QpIHtcbiAgICBlbnN1cmVTdWJqZWN0SGFzSGFzaChzdWJqZWN0KTtcbiAgICByZXR1cm4gY2FTdG9yZS5jZXJ0c1tzdWJqZWN0Lmhhc2hdIHx8IG51bGw7XG4gIH1cblxuICBmdW5jdGlvbiBlbnN1cmVTdWJqZWN0SGFzSGFzaChzdWJqZWN0KSB7XG4gICAgLy8gcHJvZHVjZSBzdWJqZWN0IGhhc2ggaWYgaXQgZG9lc24ndCBleGlzdFxuICAgIGlmKCFzdWJqZWN0Lmhhc2gpIHtcbiAgICAgIHZhciBtZCA9IGZvcmdlLm1kLnNoYTEuY3JlYXRlKCk7XG4gICAgICBzdWJqZWN0LmF0dHJpYnV0ZXMgPSBwa2kuUkROQXR0cmlidXRlc0FzQXJyYXkoX2RuVG9Bc24xKHN1YmplY3QpLCBtZCk7XG4gICAgICBzdWJqZWN0Lmhhc2ggPSBtZC5kaWdlc3QoKS50b0hleCgpO1xuICAgIH1cbiAgfVxuXG4gIC8vIGF1dG8tYWRkIHBhc3NlZCBpbiBjZXJ0c1xuICBpZihjZXJ0cykge1xuICAgIC8vIHBhcnNlIFBFTS1mb3JtYXR0ZWQgY2VydGlmaWNhdGVzIGFzIG5lY2Vzc2FyeVxuICAgIGZvcih2YXIgaSA9IDA7IGkgPCBjZXJ0cy5sZW5ndGg7ICsraSkge1xuICAgICAgdmFyIGNlcnQgPSBjZXJ0c1tpXTtcbiAgICAgIGNhU3RvcmUuYWRkQ2VydGlmaWNhdGUoY2VydCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGNhU3RvcmU7XG59O1xuXG4vKipcbiAqIENlcnRpZmljYXRlIHZlcmlmaWNhdGlvbiBlcnJvcnMsIGJhc2VkIG9uIFRMUy5cbiAqL1xucGtpLmNlcnRpZmljYXRlRXJyb3IgPSB7XG4gIGJhZF9jZXJ0aWZpY2F0ZTogJ2ZvcmdlLnBraS5CYWRDZXJ0aWZpY2F0ZScsXG4gIHVuc3VwcG9ydGVkX2NlcnRpZmljYXRlOiAnZm9yZ2UucGtpLlVuc3VwcG9ydGVkQ2VydGlmaWNhdGUnLFxuICBjZXJ0aWZpY2F0ZV9yZXZva2VkOiAnZm9yZ2UucGtpLkNlcnRpZmljYXRlUmV2b2tlZCcsXG4gIGNlcnRpZmljYXRlX2V4cGlyZWQ6ICdmb3JnZS5wa2kuQ2VydGlmaWNhdGVFeHBpcmVkJyxcbiAgY2VydGlmaWNhdGVfdW5rbm93bjogJ2ZvcmdlLnBraS5DZXJ0aWZpY2F0ZVVua25vd24nLFxuICB1bmtub3duX2NhOiAnZm9yZ2UucGtpLlVua25vd25DZXJ0aWZpY2F0ZUF1dGhvcml0eSdcbn07XG5cbi8qKlxuICogVmVyaWZpZXMgYSBjZXJ0aWZpY2F0ZSBjaGFpbiBhZ2FpbnN0IHRoZSBnaXZlbiBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgc3RvcmVcbiAqIHdpdGggYW4gb3B0aW9uYWwgY3VzdG9tIHZlcmlmeSBjYWxsYmFjay5cbiAqXG4gKiBAcGFyYW0gY2FTdG9yZSBhIGNlcnRpZmljYXRlIHN0b3JlIHRvIHZlcmlmeSBhZ2FpbnN0LlxuICogQHBhcmFtIGNoYWluIHRoZSBjZXJ0aWZpY2F0ZSBjaGFpbiB0byB2ZXJpZnksIHdpdGggdGhlIHJvb3Qgb3IgaGlnaGVzdFxuICogICAgICAgICAgYXV0aG9yaXR5IGF0IHRoZSBlbmQgKGFuIGFycmF5IG9mIGNlcnRpZmljYXRlcykuXG4gKiBAcGFyYW0gb3B0aW9ucyBhIGNhbGxiYWNrIHRvIGJlIGNhbGxlZCBmb3IgZXZlcnkgY2VydGlmaWNhdGUgaW4gdGhlIGNoYWluIG9yXG4gKiAgICAgICAgICAgICAgICAgIGFuIG9iamVjdCB3aXRoOlxuICogICAgICAgICAgICAgICAgICB2ZXJpZnkgYSBjYWxsYmFjayB0byBiZSBjYWxsZWQgZm9yIGV2ZXJ5IGNlcnRpZmljYXRlIGluIHRoZVxuICogICAgICAgICAgICAgICAgICAgIGNoYWluXG4gKiAgICAgICAgICAgICAgICAgIHZhbGlkaXR5Q2hlY2tEYXRlIHRoZSBkYXRlIGFnYWluc3Qgd2hpY2ggdGhlIGNlcnRpZmljYXRlXG4gKiAgICAgICAgICAgICAgICAgICAgdmFsaWRpdHkgcGVyaW9kIHNob3VsZCBiZSBjaGVja2VkLiBQYXNzIG51bGwgdG8gbm90IGNoZWNrXG4gKiAgICAgICAgICAgICAgICAgICAgdGhlIHZhbGlkaXR5IHBlcmlvZC4gQnkgZGVmYXVsdCwgdGhlIGN1cnJlbnQgZGF0ZSBpcyB1c2VkLlxuICpcbiAqIFRoZSB2ZXJpZnkgY2FsbGJhY2sgaGFzIHRoZSBmb2xsb3dpbmcgc2lnbmF0dXJlOlxuICpcbiAqIHZlcmlmaWVkIC0gU2V0IHRvIHRydWUgaWYgY2VydGlmaWNhdGUgd2FzIHZlcmlmaWVkLCBvdGhlcndpc2UgdGhlXG4gKiAgIHBraS5jZXJ0aWZpY2F0ZUVycm9yIGZvciB3aHkgdGhlIGNlcnRpZmljYXRlIGZhaWxlZC5cbiAqIGRlcHRoIC0gVGhlIGN1cnJlbnQgaW5kZXggaW4gdGhlIGNoYWluLCB3aGVyZSAwIGlzIHRoZSBlbmQgcG9pbnQncyBjZXJ0LlxuICogY2VydHMgLSBUaGUgY2VydGlmaWNhdGUgY2hhaW4sICpOT1RFKiBhbiBlbXB0eSBjaGFpbiBpbmRpY2F0ZXMgYW4gYW5vbnltb3VzXG4gKiAgIGVuZCBwb2ludC5cbiAqXG4gKiBUaGUgZnVuY3Rpb24gcmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MgYW5kIG9uIGZhaWx1cmUgZWl0aGVyIHRoZSBhcHByb3ByaWF0ZVxuICogcGtpLmNlcnRpZmljYXRlRXJyb3Igb3IgYW4gb2JqZWN0IHdpdGggJ2Vycm9yJyBzZXQgdG8gdGhlIGFwcHJvcHJpYXRlXG4gKiBwa2kuY2VydGlmaWNhdGVFcnJvciBhbmQgJ21lc3NhZ2UnIHNldCB0byBhIGN1c3RvbSBlcnJvciBtZXNzYWdlLlxuICpcbiAqIEByZXR1cm4gdHJ1ZSBpZiBzdWNjZXNzZnVsLCBlcnJvciB0aHJvd24gaWYgbm90LlxuICovXG5wa2kudmVyaWZ5Q2VydGlmaWNhdGVDaGFpbiA9IGZ1bmN0aW9uKGNhU3RvcmUsIGNoYWluLCBvcHRpb25zKSB7XG4gIC8qIEZyb206IFJGQzMyODAgLSBJbnRlcm5ldCBYLjUwOSBQdWJsaWMgS2V5IEluZnJhc3RydWN0dXJlIENlcnRpZmljYXRlXG4gICAgU2VjdGlvbiA2OiBDZXJ0aWZpY2F0aW9uIFBhdGggVmFsaWRhdGlvblxuICAgIFNlZSBpbmxpbmUgcGFyZW50aGV0aWNhbHMgcmVsYXRlZCB0byB0aGlzIHBhcnRpY3VsYXIgaW1wbGVtZW50YXRpb24uXG5cbiAgICBUaGUgcHJpbWFyeSBnb2FsIG9mIHBhdGggdmFsaWRhdGlvbiBpcyB0byB2ZXJpZnkgdGhlIGJpbmRpbmcgYmV0d2VlblxuICAgIGEgc3ViamVjdCBkaXN0aW5ndWlzaGVkIG5hbWUgb3IgYSBzdWJqZWN0IGFsdGVybmF0aXZlIG5hbWUgYW5kIHN1YmplY3RcbiAgICBwdWJsaWMga2V5LCBhcyByZXByZXNlbnRlZCBpbiB0aGUgZW5kIGVudGl0eSBjZXJ0aWZpY2F0ZSwgYmFzZWQgb24gdGhlXG4gICAgcHVibGljIGtleSBvZiB0aGUgdHJ1c3QgYW5jaG9yLiBUaGlzIHJlcXVpcmVzIG9idGFpbmluZyBhIHNlcXVlbmNlIG9mXG4gICAgY2VydGlmaWNhdGVzIHRoYXQgc3VwcG9ydCB0aGF0IGJpbmRpbmcuIFRoYXQgc2VxdWVuY2Ugc2hvdWxkIGJlIHByb3ZpZGVkXG4gICAgaW4gdGhlIHBhc3NlZCAnY2hhaW4nLiBUaGUgdHJ1c3QgYW5jaG9yIHNob3VsZCBiZSBpbiB0aGUgZ2l2ZW4gQ0FcbiAgICBzdG9yZS4gVGhlICdlbmQgZW50aXR5JyBjZXJ0aWZpY2F0ZSBpcyB0aGUgY2VydGlmaWNhdGUgcHJvdmlkZWQgYnkgdGhlXG4gICAgZW5kIHBvaW50ICh0eXBpY2FsbHkgYSBzZXJ2ZXIpIGFuZCBpcyB0aGUgZmlyc3QgaW4gdGhlIGNoYWluLlxuXG4gICAgVG8gbWVldCB0aGlzIGdvYWwsIHRoZSBwYXRoIHZhbGlkYXRpb24gcHJvY2VzcyB2ZXJpZmllcywgYW1vbmcgb3RoZXJcbiAgICB0aGluZ3MsIHRoYXQgYSBwcm9zcGVjdGl2ZSBjZXJ0aWZpY2F0aW9uIHBhdGggKGEgc2VxdWVuY2Ugb2YgblxuICAgIGNlcnRpZmljYXRlcyBvciBhICdjaGFpbicpIHNhdGlzZmllcyB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG5cbiAgICAoYSkgZm9yIGFsbCB4IGluIHsxLCAuLi4sIG4tMX0sIHRoZSBzdWJqZWN0IG9mIGNlcnRpZmljYXRlIHggaXNcbiAgICAgICAgICB0aGUgaXNzdWVyIG9mIGNlcnRpZmljYXRlIHgrMTtcblxuICAgIChiKSBjZXJ0aWZpY2F0ZSAxIGlzIGlzc3VlZCBieSB0aGUgdHJ1c3QgYW5jaG9yO1xuXG4gICAgKGMpIGNlcnRpZmljYXRlIG4gaXMgdGhlIGNlcnRpZmljYXRlIHRvIGJlIHZhbGlkYXRlZDsgYW5kXG5cbiAgICAoZCkgZm9yIGFsbCB4IGluIHsxLCAuLi4sIG59LCB0aGUgY2VydGlmaWNhdGUgd2FzIHZhbGlkIGF0IHRoZVxuICAgICAgICAgIHRpbWUgaW4gcXVlc3Rpb24uXG5cbiAgICBOb3RlIHRoYXQgaGVyZSAnbicgaXMgaW5kZXggMCBpbiB0aGUgY2hhaW4gYW5kIDEgaXMgdGhlIGxhc3QgY2VydGlmaWNhdGVcbiAgICBpbiB0aGUgY2hhaW4gYW5kIGl0IG11c3QgYmUgc2lnbmVkIGJ5IGEgY2VydGlmaWNhdGUgaW4gdGhlIGNvbm5lY3Rpb24nc1xuICAgIENBIHN0b3JlLlxuXG4gICAgVGhlIHBhdGggdmFsaWRhdGlvbiBwcm9jZXNzIGFsc28gZGV0ZXJtaW5lcyB0aGUgc2V0IG9mIGNlcnRpZmljYXRlXG4gICAgcG9saWNpZXMgdGhhdCBhcmUgdmFsaWQgZm9yIHRoaXMgcGF0aCwgYmFzZWQgb24gdGhlIGNlcnRpZmljYXRlIHBvbGljaWVzXG4gICAgZXh0ZW5zaW9uLCBwb2xpY3kgbWFwcGluZyBleHRlbnNpb24sIHBvbGljeSBjb25zdHJhaW50cyBleHRlbnNpb24sIGFuZFxuICAgIGluaGliaXQgYW55LXBvbGljeSBleHRlbnNpb24uXG5cbiAgICBOb3RlOiBQb2xpY3kgbWFwcGluZyBleHRlbnNpb24gbm90IHN1cHBvcnRlZCAoTm90IFJlcXVpcmVkKS5cblxuICAgIE5vdGU6IElmIHRoZSBjZXJ0aWZpY2F0ZSBoYXMgYW4gdW5zdXBwb3J0ZWQgY3JpdGljYWwgZXh0ZW5zaW9uLCB0aGVuIGl0XG4gICAgbXVzdCBiZSByZWplY3RlZC5cblxuICAgIE5vdGU6IEEgY2VydGlmaWNhdGUgaXMgc2VsZi1pc3N1ZWQgaWYgdGhlIEROcyB0aGF0IGFwcGVhciBpbiB0aGUgc3ViamVjdFxuICAgIGFuZCBpc3N1ZXIgZmllbGRzIGFyZSBpZGVudGljYWwgYW5kIGFyZSBub3QgZW1wdHkuXG5cbiAgICBUaGUgcGF0aCB2YWxpZGF0aW9uIGFsZ29yaXRobSBhc3N1bWVzIHRoZSBmb2xsb3dpbmcgc2V2ZW4gaW5wdXRzIGFyZVxuICAgIHByb3ZpZGVkIHRvIHRoZSBwYXRoIHByb2Nlc3NpbmcgbG9naWMuIFdoYXQgdGhpcyBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvblxuICAgIHdpbGwgdXNlIGlzIHByb3ZpZGVkIHBhcmVudGhldGljYWxseTpcblxuICAgIChhKSBhIHByb3NwZWN0aXZlIGNlcnRpZmljYXRpb24gcGF0aCBvZiBsZW5ndGggbiAodGhlICdjaGFpbicpXG4gICAgKGIpIHRoZSBjdXJyZW50IGRhdGUvdGltZTogKCdub3cnKS5cbiAgICAoYykgdXNlci1pbml0aWFsLXBvbGljeS1zZXQ6IEEgc2V0IG9mIGNlcnRpZmljYXRlIHBvbGljeSBpZGVudGlmaWVyc1xuICAgICAgICAgIG5hbWluZyB0aGUgcG9saWNpZXMgdGhhdCBhcmUgYWNjZXB0YWJsZSB0byB0aGUgY2VydGlmaWNhdGUgdXNlci5cbiAgICAgICAgICBUaGUgdXNlci1pbml0aWFsLXBvbGljeS1zZXQgY29udGFpbnMgdGhlIHNwZWNpYWwgdmFsdWUgYW55LXBvbGljeVxuICAgICAgICAgIGlmIHRoZSB1c2VyIGlzIG5vdCBjb25jZXJuZWQgYWJvdXQgY2VydGlmaWNhdGUgcG9saWN5XG4gICAgICAgICAgKE5vdCBpbXBsZW1lbnRlZC4gQW55IHBvbGljeSBpcyBhY2NlcHRlZCkuXG4gICAgKGQpIHRydXN0IGFuY2hvciBpbmZvcm1hdGlvbiwgZGVzY3JpYmluZyBhIENBIHRoYXQgc2VydmVzIGFzIGEgdHJ1c3RcbiAgICAgICAgICBhbmNob3IgZm9yIHRoZSBjZXJ0aWZpY2F0aW9uIHBhdGguIFRoZSB0cnVzdCBhbmNob3IgaW5mb3JtYXRpb25cbiAgICAgICAgICBpbmNsdWRlczpcblxuICAgICAgKDEpICB0aGUgdHJ1c3RlZCBpc3N1ZXIgbmFtZSxcbiAgICAgICgyKSAgdGhlIHRydXN0ZWQgcHVibGljIGtleSBhbGdvcml0aG0sXG4gICAgICAoMykgIHRoZSB0cnVzdGVkIHB1YmxpYyBrZXksIGFuZFxuICAgICAgKDQpICBvcHRpb25hbGx5LCB0aGUgdHJ1c3RlZCBwdWJsaWMga2V5IHBhcmFtZXRlcnMgYXNzb2NpYXRlZFxuICAgICAgICAgICAgIHdpdGggdGhlIHB1YmxpYyBrZXkuXG5cbiAgICAgIChUcnVzdCBhbmNob3JzIGFyZSBwcm92aWRlZCB2aWEgY2VydGlmaWNhdGVzIGluIHRoZSBDQSBzdG9yZSkuXG5cbiAgICAgIFRoZSB0cnVzdCBhbmNob3IgaW5mb3JtYXRpb24gbWF5IGJlIHByb3ZpZGVkIHRvIHRoZSBwYXRoIHByb2Nlc3NpbmdcbiAgICAgIHByb2NlZHVyZSBpbiB0aGUgZm9ybSBvZiBhIHNlbGYtc2lnbmVkIGNlcnRpZmljYXRlLiBUaGUgdHJ1c3RlZCBhbmNob3JcbiAgICAgIGluZm9ybWF0aW9uIGlzIHRydXN0ZWQgYmVjYXVzZSBpdCB3YXMgZGVsaXZlcmVkIHRvIHRoZSBwYXRoIHByb2Nlc3NpbmdcbiAgICAgIHByb2NlZHVyZSBieSBzb21lIHRydXN0d29ydGh5IG91dC1vZi1iYW5kIHByb2NlZHVyZS4gSWYgdGhlIHRydXN0ZWRcbiAgICAgIHB1YmxpYyBrZXkgYWxnb3JpdGhtIHJlcXVpcmVzIHBhcmFtZXRlcnMsIHRoZW4gdGhlIHBhcmFtZXRlcnMgYXJlXG4gICAgICBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSB0cnVzdGVkIHB1YmxpYyBrZXkgKE5vIHBhcmFtZXRlcnMgdXNlZCBpbiB0aGlzXG4gICAgICBpbXBsZW1lbnRhdGlvbikuXG5cbiAgICAoZSkgaW5pdGlhbC1wb2xpY3ktbWFwcGluZy1pbmhpYml0LCB3aGljaCBpbmRpY2F0ZXMgaWYgcG9saWN5IG1hcHBpbmcgaXNcbiAgICAgICAgICBhbGxvd2VkIGluIHRoZSBjZXJ0aWZpY2F0aW9uIHBhdGguXG4gICAgICAgICAgKE5vdCBpbXBsZW1lbnRlZCwgbm8gcG9saWN5IGNoZWNraW5nKVxuXG4gICAgKGYpIGluaXRpYWwtZXhwbGljaXQtcG9saWN5LCB3aGljaCBpbmRpY2F0ZXMgaWYgdGhlIHBhdGggbXVzdCBiZSB2YWxpZFxuICAgICAgICAgIGZvciBhdCBsZWFzdCBvbmUgb2YgdGhlIGNlcnRpZmljYXRlIHBvbGljaWVzIGluIHRoZSB1c2VyLWluaXRpYWwtXG4gICAgICAgICAgcG9saWN5LXNldC5cbiAgICAgICAgICAoTm90IGltcGxlbWVudGVkLCBubyBwb2xpY3kgY2hlY2tpbmcpXG5cbiAgICAoZykgaW5pdGlhbC1hbnktcG9saWN5LWluaGliaXQsIHdoaWNoIGluZGljYXRlcyB3aGV0aGVyIHRoZVxuICAgICAgICAgIGFueVBvbGljeSBPSUQgc2hvdWxkIGJlIHByb2Nlc3NlZCBpZiBpdCBpcyBpbmNsdWRlZCBpbiBhXG4gICAgICAgICAgY2VydGlmaWNhdGUuXG4gICAgICAgICAgKE5vdCBpbXBsZW1lbnRlZCwgc28gYW55IHBvbGljeSBpcyB2YWxpZCBwcm92aWRlZCB0aGF0IGl0IGlzXG4gICAgICAgICAgbm90IG1hcmtlZCBhcyBjcml0aWNhbCkgKi9cblxuICAvKiBCYXNpYyBQYXRoIFByb2Nlc3Npbmc6XG5cbiAgICBGb3IgZWFjaCBjZXJ0aWZpY2F0ZSBpbiB0aGUgJ2NoYWluJywgdGhlIGZvbGxvd2luZyBpcyBjaGVja2VkOlxuXG4gICAgMS4gVGhlIGNlcnRpZmljYXRlIHZhbGlkaXR5IHBlcmlvZCBpbmNsdWRlcyB0aGUgY3VycmVudCB0aW1lLlxuICAgIDIuIFRoZSBjZXJ0aWZpY2F0ZSB3YXMgc2lnbmVkIGJ5IGl0cyBwYXJlbnQgKHdoZXJlIHRoZSBwYXJlbnQgaXMgZWl0aGVyXG4gICAgICAgdGhlIG5leHQgaW4gdGhlIGNoYWluIG9yIGZyb20gdGhlIENBIHN0b3JlKS4gQWxsb3cgcHJvY2Vzc2luZyB0b1xuICAgICAgIGNvbnRpbnVlIHRvIHRoZSBuZXh0IHN0ZXAgaWYgbm8gcGFyZW50IGlzIGZvdW5kIGJ1dCB0aGUgY2VydGlmaWNhdGUgaXNcbiAgICAgICBpbiB0aGUgQ0Egc3RvcmUuXG4gICAgMy4gVE9ETzogVGhlIGNlcnRpZmljYXRlIGhhcyBub3QgYmVlbiByZXZva2VkLlxuICAgIDQuIFRoZSBjZXJ0aWZpY2F0ZSBpc3N1ZXIgbmFtZSBtYXRjaGVzIHRoZSBwYXJlbnQncyBzdWJqZWN0IG5hbWUuXG4gICAgNS4gVE9ETzogSWYgdGhlIGNlcnRpZmljYXRlIGlzIHNlbGYtaXNzdWVkIGFuZCBub3QgdGhlIGZpbmFsIGNlcnRpZmljYXRlXG4gICAgICAgaW4gdGhlIGNoYWluLCBza2lwIHRoaXMgc3RlcCwgb3RoZXJ3aXNlIHZlcmlmeSB0aGF0IHRoZSBzdWJqZWN0IG5hbWVcbiAgICAgICBpcyB3aXRoaW4gb25lIG9mIHRoZSBwZXJtaXR0ZWQgc3VidHJlZXMgb2YgWC41MDAgZGlzdGluZ3Vpc2hlZCBuYW1lc1xuICAgICAgIGFuZCB0aGF0IGVhY2ggb2YgdGhlIGFsdGVybmF0aXZlIG5hbWVzIGluIHRoZSBzdWJqZWN0QWx0TmFtZSBleHRlbnNpb25cbiAgICAgICAoY3JpdGljYWwgb3Igbm9uLWNyaXRpY2FsKSBpcyB3aXRoaW4gb25lIG9mIHRoZSBwZXJtaXR0ZWQgc3VidHJlZXMgZm9yXG4gICAgICAgdGhhdCBuYW1lIHR5cGUuXG4gICAgNi4gVE9ETzogSWYgdGhlIGNlcnRpZmljYXRlIGlzIHNlbGYtaXNzdWVkIGFuZCBub3QgdGhlIGZpbmFsIGNlcnRpZmljYXRlXG4gICAgICAgaW4gdGhlIGNoYWluLCBza2lwIHRoaXMgc3RlcCwgb3RoZXJ3aXNlIHZlcmlmeSB0aGF0IHRoZSBzdWJqZWN0IG5hbWVcbiAgICAgICBpcyBub3Qgd2l0aGluIG9uZSBvZiB0aGUgZXhjbHVkZWQgc3VidHJlZXMgZm9yIFguNTAwIGRpc3Rpbmd1aXNoZWRcbiAgICAgICBuYW1lcyBhbmQgbm9uZSBvZiB0aGUgc3ViamVjdEFsdE5hbWUgZXh0ZW5zaW9uIG5hbWVzIGFyZSBleGNsdWRlZCBmb3JcbiAgICAgICB0aGF0IG5hbWUgdHlwZS5cbiAgICA3LiBUaGUgb3RoZXIgc3RlcHMgaW4gdGhlIGFsZ29yaXRobSBmb3IgYmFzaWMgcGF0aCBwcm9jZXNzaW5nIGludm9sdmVcbiAgICAgICBoYW5kbGluZyB0aGUgcG9saWN5IGV4dGVuc2lvbiB3aGljaCBpcyBub3QgcHJlc2VudGx5IHN1cHBvcnRlZCBpbiB0aGlzXG4gICAgICAgaW1wbGVtZW50YXRpb24uIEluc3RlYWQsIGlmIGEgY3JpdGljYWwgcG9saWN5IGV4dGVuc2lvbiBpcyBmb3VuZCwgdGhlXG4gICAgICAgY2VydGlmaWNhdGUgaXMgcmVqZWN0ZWQgYXMgbm90IHN1cHBvcnRlZC5cbiAgICA4LiBJZiB0aGUgY2VydGlmaWNhdGUgaXMgbm90IHRoZSBmaXJzdCBvciBpZiBpdHMgdGhlIG9ubHkgY2VydGlmaWNhdGUgaW5cbiAgICAgICB0aGUgY2hhaW4gKGhhdmluZyBubyBwYXJlbnQgZnJvbSB0aGUgQ0Egc3RvcmUgb3IgaXMgc2VsZi1zaWduZWQpIGFuZCBpdFxuICAgICAgIGhhcyBhIGNyaXRpY2FsIGtleSB1c2FnZSBleHRlbnNpb24sIHZlcmlmeSB0aGF0IHRoZSBrZXlDZXJ0U2lnbiBiaXQgaXNcbiAgICAgICBzZXQuIElmIHRoZSBrZXkgdXNhZ2UgZXh0ZW5zaW9uIGV4aXN0cywgdmVyaWZ5IHRoYXQgdGhlIGJhc2ljXG4gICAgICAgY29uc3RyYWludHMgZXh0ZW5zaW9uIGV4aXN0cy4gSWYgdGhlIGJhc2ljIGNvbnN0cmFpbnRzIGV4dGVuc2lvbiBleGlzdHMsXG4gICAgICAgdmVyaWZ5IHRoYXQgdGhlIGNBIGZsYWcgaXMgc2V0LiBJZiBwYXRoTGVuQ29uc3RyYWludCBpcyBzZXQsIGVuc3VyZSB0aGF0XG4gICAgICAgdGhlIG51bWJlciBvZiBjZXJ0aWZpY2F0ZXMgdGhhdCBwcmVjZWRlIGluIHRoZSBjaGFpbiAoY29tZSBlYXJsaWVyXG4gICAgICAgaW4gdGhlIGNoYWluIGFzIGltcGxlbWVudGVkIGJlbG93KSwgZXhjbHVkaW5nIHRoZSB2ZXJ5IGZpcnN0IGluIHRoZVxuICAgICAgIGNoYWluICh0eXBpY2FsbHkgdGhlIGVuZC1lbnRpdHkgb25lKSwgaXNuJ3QgZ3JlYXRlciB0aGFuIHRoZVxuICAgICAgIHBhdGhMZW5Db25zdHJhaW50LiBUaGlzIGNvbnN0cmFpbnQgbGltaXRzIHRoZSBudW1iZXIgb2YgaW50ZXJtZWRpYXRlXG4gICAgICAgQ0FzIHRoYXQgbWF5IGFwcGVhciBiZWxvdyBhIENBIGJlZm9yZSBvbmx5IGVuZC1lbnRpdHkgY2VydGlmaWNhdGVzXG4gICAgICAgbWF5IGJlIGlzc3VlZC4gKi9cblxuICAvLyBpZiBhIHZlcmlmeSBjYWxsYmFjayBpcyBwYXNzZWQgYXMgdGhlIHRoaXJkIHBhcmFtZXRlciwgcGFja2FnZSBpdCB3aXRoaW5cbiAgLy8gdGhlIG9wdGlvbnMgb2JqZWN0LiBUaGlzIGlzIHRvIHN1cHBvcnQgYSBsZWdhY3kgZnVuY3Rpb24gc2lnbmF0dXJlIHRoYXRcbiAgLy8gZXhwZWN0ZWQgdGhlIHZlcmlmeSBjYWxsYmFjayBhcyB0aGUgdGhpcmQgcGFyYW1ldGVyLlxuICBpZih0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIG9wdGlvbnMgPSB7dmVyaWZ5OiBvcHRpb25zfTtcbiAgfVxuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAvLyBjb3B5IGNlcnQgY2hhaW4gcmVmZXJlbmNlcyB0byBhbm90aGVyIGFycmF5IHRvIHByb3RlY3QgYWdhaW5zdCBjaGFuZ2VzXG4gIC8vIGluIHZlcmlmeSBjYWxsYmFja1xuICBjaGFpbiA9IGNoYWluLnNsaWNlKDApO1xuICB2YXIgY2VydHMgPSBjaGFpbi5zbGljZSgwKTtcblxuICB2YXIgdmFsaWRpdHlDaGVja0RhdGUgPSBvcHRpb25zLnZhbGlkaXR5Q2hlY2tEYXRlO1xuICAvLyBpZiBubyB2YWxpZGl0eUNoZWNrRGF0ZSBpcyBzcGVjaWZpZWQsIGRlZmF1bHQgdG8gdGhlIGN1cnJlbnQgZGF0ZS4gTWFrZVxuICAvLyBzdXJlIHRvIG1haW50YWluIHRoZSB2YWx1ZSBudWxsIGJlY2F1c2UgaXQgaW5kaWNhdGVzIHRoYXQgdGhlIHZhbGlkaXR5XG4gIC8vIHBlcmlvZCBzaG91bGQgbm90IGJlIGNoZWNrZWQuXG4gIGlmKHR5cGVvZiB2YWxpZGl0eUNoZWNrRGF0ZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICB2YWxpZGl0eUNoZWNrRGF0ZSA9IG5ldyBEYXRlKCk7XG4gIH1cblxuICAvLyB2ZXJpZnkgZWFjaCBjZXJ0IGluIHRoZSBjaGFpbiB1c2luZyBpdHMgcGFyZW50LCB3aGVyZSB0aGUgcGFyZW50XG4gIC8vIGlzIGVpdGhlciB0aGUgbmV4dCBpbiB0aGUgY2hhaW4gb3IgZnJvbSB0aGUgQ0Egc3RvcmVcbiAgdmFyIGZpcnN0ID0gdHJ1ZTtcbiAgdmFyIGVycm9yID0gbnVsbDtcbiAgdmFyIGRlcHRoID0gMDtcbiAgZG8ge1xuICAgIHZhciBjZXJ0ID0gY2hhaW4uc2hpZnQoKTtcbiAgICB2YXIgcGFyZW50ID0gbnVsbDtcbiAgICB2YXIgc2VsZlNpZ25lZCA9IGZhbHNlO1xuXG4gICAgaWYodmFsaWRpdHlDaGVja0RhdGUpIHtcbiAgICAgIC8vIDEuIGNoZWNrIHZhbGlkIHRpbWVcbiAgICAgIGlmKHZhbGlkaXR5Q2hlY2tEYXRlIDwgY2VydC52YWxpZGl0eS5ub3RCZWZvcmUgfHxcbiAgICAgICAgIHZhbGlkaXR5Q2hlY2tEYXRlID4gY2VydC52YWxpZGl0eS5ub3RBZnRlcikge1xuICAgICAgICBlcnJvciA9IHtcbiAgICAgICAgICBtZXNzYWdlOiAnQ2VydGlmaWNhdGUgaXMgbm90IHZhbGlkIHlldCBvciBoYXMgZXhwaXJlZC4nLFxuICAgICAgICAgIGVycm9yOiBwa2kuY2VydGlmaWNhdGVFcnJvci5jZXJ0aWZpY2F0ZV9leHBpcmVkLFxuICAgICAgICAgIG5vdEJlZm9yZTogY2VydC52YWxpZGl0eS5ub3RCZWZvcmUsXG4gICAgICAgICAgbm90QWZ0ZXI6IGNlcnQudmFsaWRpdHkubm90QWZ0ZXIsXG4gICAgICAgICAgLy8gVE9ETzogd2UgbWlnaHQgd2FudCB0byByZWNvbnNpZGVyIHJlbmFtaW5nICdub3cnIHRvXG4gICAgICAgICAgLy8gJ3ZhbGlkaXR5Q2hlY2tEYXRlJyBzaG91bGQgdGhpcyBBUEkgYmUgY2hhbmdlZCBpbiB0aGUgZnV0dXJlLlxuICAgICAgICAgIG5vdzogdmFsaWRpdHlDaGVja0RhdGVcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyAyLiB2ZXJpZnkgd2l0aCBwYXJlbnQgZnJvbSBjaGFpbiBvciBDQSBzdG9yZVxuICAgIGlmKGVycm9yID09PSBudWxsKSB7XG4gICAgICBwYXJlbnQgPSBjaGFpblswXSB8fCBjYVN0b3JlLmdldElzc3VlcihjZXJ0KTtcbiAgICAgIGlmKHBhcmVudCA9PT0gbnVsbCkge1xuICAgICAgICAvLyBjaGVjayBmb3Igc2VsZi1zaWduZWQgY2VydFxuICAgICAgICBpZihjZXJ0LmlzSXNzdWVyKGNlcnQpKSB7XG4gICAgICAgICAgc2VsZlNpZ25lZCA9IHRydWU7XG4gICAgICAgICAgcGFyZW50ID0gY2VydDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZihwYXJlbnQpIHtcbiAgICAgICAgLy8gRklYTUU6IGN1cnJlbnQgQ0Egc3RvcmUgaW1wbGVtZW50YXRpb24gbWlnaHQgaGF2ZSBtdWx0aXBsZVxuICAgICAgICAvLyBjZXJ0aWZpY2F0ZXMgd2hlcmUgdGhlIGlzc3VlciBjYW4ndCBiZSBkZXRlcm1pbmVkIGZyb20gdGhlXG4gICAgICAgIC8vIGNlcnRpZmljYXRlIChoYXBwZW5zIHJhcmVseSB3aXRoLCBlZzogb2xkIGNlcnRpZmljYXRlcykgc28gbm9ybWFsaXplXG4gICAgICAgIC8vIGJ5IGFsd2F5cyBwdXR0aW5nIHBhcmVudHMgaW50byBhbiBhcnJheVxuICAgICAgICAvLyBUT0RPOiB0aGVyZSdzIG1heSBiZSBhbiBleHRyZW1lIGRlZ2VuZXJhdGUgY2FzZSBjdXJyZW50bHkgdW5jb3ZlcmVkXG4gICAgICAgIC8vIHdoZXJlIGFuIG9sZCBpbnRlcm1lZGlhdGUgY2VydGlmaWNhdGUgc2VlbXMgdG8gaGF2ZSBhIG1hdGNoaW5nIHBhcmVudFxuICAgICAgICAvLyBidXQgbm9uZSBvZiB0aGUgcGFyZW50cyBhY3R1YWxseSB2ZXJpZnkgLi4uIGJ1dCB0aGUgaW50ZXJtZWRpYXRlXG4gICAgICAgIC8vIGlzIGluIHRoZSBDQSBhbmQgaXQgc2hvdWxkIHBhc3MgdGhpcyBjaGVjazsgbmVlZHMgaW52ZXN0aWdhdGlvblxuICAgICAgICB2YXIgcGFyZW50cyA9IHBhcmVudDtcbiAgICAgICAgaWYoIWZvcmdlLnV0aWwuaXNBcnJheShwYXJlbnRzKSkge1xuICAgICAgICAgIHBhcmVudHMgPSBbcGFyZW50c107XG4gICAgICAgIH1cblxuICAgICAgICAvLyB0cnkgdG8gdmVyaWZ5IHdpdGggZWFjaCBwb3NzaWJsZSBwYXJlbnQgKHR5cGljYWxseSBvbmx5IG9uZSlcbiAgICAgICAgdmFyIHZlcmlmaWVkID0gZmFsc2U7XG4gICAgICAgIHdoaWxlKCF2ZXJpZmllZCAmJiBwYXJlbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBwYXJlbnQgPSBwYXJlbnRzLnNoaWZ0KCk7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHZlcmlmaWVkID0gcGFyZW50LnZlcmlmeShjZXJ0KTtcbiAgICAgICAgICB9IGNhdGNoKGV4KSB7XG4gICAgICAgICAgICAvLyBmYWlsdXJlIHRvIHZlcmlmeSwgZG9uJ3QgY2FyZSB3aHksIHRyeSBuZXh0IG9uZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmKCF2ZXJpZmllZCkge1xuICAgICAgICAgIGVycm9yID0ge1xuICAgICAgICAgICAgbWVzc2FnZTogJ0NlcnRpZmljYXRlIHNpZ25hdHVyZSBpcyBpbnZhbGlkLicsXG4gICAgICAgICAgICBlcnJvcjogcGtpLmNlcnRpZmljYXRlRXJyb3IuYmFkX2NlcnRpZmljYXRlXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZihlcnJvciA9PT0gbnVsbCAmJiAoIXBhcmVudCB8fCBzZWxmU2lnbmVkKSAmJlxuICAgICAgICAhY2FTdG9yZS5oYXNDZXJ0aWZpY2F0ZShjZXJ0KSkge1xuICAgICAgICAvLyBubyBwYXJlbnQgaXNzdWVyIGFuZCBjZXJ0aWZpY2F0ZSBpdHNlbGYgaXMgbm90IHRydXN0ZWRcbiAgICAgICAgZXJyb3IgPSB7XG4gICAgICAgICAgbWVzc2FnZTogJ0NlcnRpZmljYXRlIGlzIG5vdCB0cnVzdGVkLicsXG4gICAgICAgICAgZXJyb3I6IHBraS5jZXJ0aWZpY2F0ZUVycm9yLnVua25vd25fY2FcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUT0RPOiAzLiBjaGVjayByZXZva2VkXG5cbiAgICAvLyA0LiBjaGVjayBmb3IgbWF0Y2hpbmcgaXNzdWVyL3N1YmplY3RcbiAgICBpZihlcnJvciA9PT0gbnVsbCAmJiBwYXJlbnQgJiYgIWNlcnQuaXNJc3N1ZXIocGFyZW50KSkge1xuICAgICAgLy8gcGFyZW50IGlzIG5vdCBpc3N1ZXJcbiAgICAgIGVycm9yID0ge1xuICAgICAgICBtZXNzYWdlOiAnQ2VydGlmaWNhdGUgaXNzdWVyIGlzIGludmFsaWQuJyxcbiAgICAgICAgZXJyb3I6IHBraS5jZXJ0aWZpY2F0ZUVycm9yLmJhZF9jZXJ0aWZpY2F0ZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyA1LiBUT0RPOiBjaGVjayBuYW1lcyB3aXRoIHBlcm1pdHRlZCBuYW1lcyB0cmVlXG5cbiAgICAvLyA2LiBUT0RPOiBjaGVjayBuYW1lcyBhZ2FpbnN0IGV4Y2x1ZGVkIG5hbWVzIHRyZWVcblxuICAgIC8vIDcuIGNoZWNrIGZvciB1bnN1cHBvcnRlZCBjcml0aWNhbCBleHRlbnNpb25zXG4gICAgaWYoZXJyb3IgPT09IG51bGwpIHtcbiAgICAgIC8vIHN1cHBvcnRlZCBleHRlbnNpb25zXG4gICAgICB2YXIgc2UgPSB7XG4gICAgICAgIGtleVVzYWdlOiB0cnVlLFxuICAgICAgICBiYXNpY0NvbnN0cmFpbnRzOiB0cnVlXG4gICAgICB9O1xuICAgICAgZm9yKHZhciBpID0gMDsgZXJyb3IgPT09IG51bGwgJiYgaSA8IGNlcnQuZXh0ZW5zaW9ucy5sZW5ndGg7ICsraSkge1xuICAgICAgICB2YXIgZXh0ID0gY2VydC5leHRlbnNpb25zW2ldO1xuICAgICAgICBpZihleHQuY3JpdGljYWwgJiYgIShleHQubmFtZSBpbiBzZSkpIHtcbiAgICAgICAgICBlcnJvciA9IHtcbiAgICAgICAgICAgIG1lc3NhZ2U6XG4gICAgICAgICAgICAgICdDZXJ0aWZpY2F0ZSBoYXMgYW4gdW5zdXBwb3J0ZWQgY3JpdGljYWwgZXh0ZW5zaW9uLicsXG4gICAgICAgICAgICBlcnJvcjogcGtpLmNlcnRpZmljYXRlRXJyb3IudW5zdXBwb3J0ZWRfY2VydGlmaWNhdGVcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gOC4gY2hlY2sgZm9yIENBIGlmIGNlcnQgaXMgbm90IGZpcnN0IG9yIGlzIHRoZSBvbmx5IGNlcnRpZmljYXRlXG4gICAgLy8gcmVtYWluaW5nIGluIGNoYWluIHdpdGggbm8gcGFyZW50IG9yIGlzIHNlbGYtc2lnbmVkXG4gICAgaWYoZXJyb3IgPT09IG51bGwgJiZcbiAgICAgICghZmlyc3QgfHwgKGNoYWluLmxlbmd0aCA9PT0gMCAmJiAoIXBhcmVudCB8fCBzZWxmU2lnbmVkKSkpKSB7XG4gICAgICAvLyBmaXJzdCBjaGVjayBrZXlVc2FnZSBleHRlbnNpb24gYW5kIHRoZW4gYmFzaWMgY29uc3RyYWludHNcbiAgICAgIHZhciBiY0V4dCA9IGNlcnQuZ2V0RXh0ZW5zaW9uKCdiYXNpY0NvbnN0cmFpbnRzJyk7XG4gICAgICB2YXIga2V5VXNhZ2VFeHQgPSBjZXJ0LmdldEV4dGVuc2lvbigna2V5VXNhZ2UnKTtcbiAgICAgIGlmKGtleVVzYWdlRXh0ICE9PSBudWxsKSB7XG4gICAgICAgIC8vIGtleUNlcnRTaWduIG11c3QgYmUgdHJ1ZSBhbmQgdGhlcmUgbXVzdCBiZSBhIGJhc2ljXG4gICAgICAgIC8vIGNvbnN0cmFpbnRzIGV4dGVuc2lvblxuICAgICAgICBpZigha2V5VXNhZ2VFeHQua2V5Q2VydFNpZ24gfHwgYmNFeHQgPT09IG51bGwpIHtcbiAgICAgICAgICAvLyBiYWQgY2VydGlmaWNhdGVcbiAgICAgICAgICBlcnJvciA9IHtcbiAgICAgICAgICAgIG1lc3NhZ2U6XG4gICAgICAgICAgICAgICdDZXJ0aWZpY2F0ZSBrZXlVc2FnZSBvciBiYXNpY0NvbnN0cmFpbnRzIGNvbmZsaWN0ICcgK1xuICAgICAgICAgICAgICAnb3IgaW5kaWNhdGUgdGhhdCB0aGUgY2VydGlmaWNhdGUgaXMgbm90IGEgQ0EuICcgK1xuICAgICAgICAgICAgICAnSWYgdGhlIGNlcnRpZmljYXRlIGlzIHRoZSBvbmx5IG9uZSBpbiB0aGUgY2hhaW4gb3IgJyArXG4gICAgICAgICAgICAgICdpc25cXCd0IHRoZSBmaXJzdCB0aGVuIHRoZSBjZXJ0aWZpY2F0ZSBtdXN0IGJlIGEgJyArXG4gICAgICAgICAgICAgICd2YWxpZCBDQS4nLFxuICAgICAgICAgICAgZXJyb3I6IHBraS5jZXJ0aWZpY2F0ZUVycm9yLmJhZF9jZXJ0aWZpY2F0ZVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIGJhc2ljIGNvbnN0cmFpbnRzIGNBIGZsYWcgbXVzdCBiZSBzZXRcbiAgICAgIGlmKGVycm9yID09PSBudWxsICYmIGJjRXh0ICE9PSBudWxsICYmICFiY0V4dC5jQSkge1xuICAgICAgICAvLyBiYWQgY2VydGlmaWNhdGVcbiAgICAgICAgZXJyb3IgPSB7XG4gICAgICAgICAgbWVzc2FnZTpcbiAgICAgICAgICAgICdDZXJ0aWZpY2F0ZSBiYXNpY0NvbnN0cmFpbnRzIGluZGljYXRlcyB0aGUgY2VydGlmaWNhdGUgJyArXG4gICAgICAgICAgICAnaXMgbm90IGEgQ0EuJyxcbiAgICAgICAgICBlcnJvcjogcGtpLmNlcnRpZmljYXRlRXJyb3IuYmFkX2NlcnRpZmljYXRlXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICAvLyBpZiBlcnJvciBpcyBub3QgbnVsbCBhbmQga2V5VXNhZ2UgaXMgYXZhaWxhYmxlLCB0aGVuIHdlIGtub3cgaXRcbiAgICAgIC8vIGhhcyBrZXlDZXJ0U2lnbiBhbmQgdGhlcmUgaXMgYSBiYXNpYyBjb25zdHJhaW50cyBleHRlbnNpb24gdG9vLFxuICAgICAgLy8gd2hpY2ggbWVhbnMgd2UgY2FuIGNoZWNrIHBhdGhMZW5Db25zdHJhaW50IChpZiBpdCBleGlzdHMpXG4gICAgICBpZihlcnJvciA9PT0gbnVsbCAmJiBrZXlVc2FnZUV4dCAhPT0gbnVsbCAmJlxuICAgICAgICAncGF0aExlbkNvbnN0cmFpbnQnIGluIGJjRXh0KSB7XG4gICAgICAgIC8vIHBhdGhMZW4gaXMgdGhlIG1heGltdW0gIyBvZiBpbnRlcm1lZGlhdGUgQ0EgY2VydHMgdGhhdCBjYW4gYmVcbiAgICAgICAgLy8gZm91bmQgYmV0d2VlbiB0aGUgY3VycmVudCBjZXJ0aWZpY2F0ZSBhbmQgdGhlIGVuZC1lbnRpdHkgKGRlcHRoIDApXG4gICAgICAgIC8vIGNlcnRpZmljYXRlOyB0aGlzIG51bWJlciBkb2VzIG5vdCBpbmNsdWRlIHRoZSBlbmQtZW50aXR5IChkZXB0aCAwLFxuICAgICAgICAvLyBsYXN0IGluIHRoZSBjaGFpbikgZXZlbiBpZiBpdCBoYXBwZW5zIHRvIGJlIGEgQ0EgY2VydGlmaWNhdGUgaXRzZWxmXG4gICAgICAgIHZhciBwYXRoTGVuID0gZGVwdGggLSAxO1xuICAgICAgICBpZihwYXRoTGVuID4gYmNFeHQucGF0aExlbkNvbnN0cmFpbnQpIHtcbiAgICAgICAgICAvLyBwYXRoTGVuQ29uc3RyYWludCB2aW9sYXRlZCwgYmFkIGNlcnRpZmljYXRlXG4gICAgICAgICAgZXJyb3IgPSB7XG4gICAgICAgICAgICBtZXNzYWdlOlxuICAgICAgICAgICAgICAnQ2VydGlmaWNhdGUgYmFzaWNDb25zdHJhaW50cyBwYXRoTGVuQ29uc3RyYWludCB2aW9sYXRlZC4nLFxuICAgICAgICAgICAgZXJyb3I6IHBraS5jZXJ0aWZpY2F0ZUVycm9yLmJhZF9jZXJ0aWZpY2F0ZVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBjYWxsIGFwcGxpY2F0aW9uIGNhbGxiYWNrXG4gICAgdmFyIHZmZCA9IChlcnJvciA9PT0gbnVsbCkgPyB0cnVlIDogZXJyb3IuZXJyb3I7XG4gICAgdmFyIHJldCA9IG9wdGlvbnMudmVyaWZ5ID8gb3B0aW9ucy52ZXJpZnkodmZkLCBkZXB0aCwgY2VydHMpIDogdmZkO1xuICAgIGlmKHJldCA9PT0gdHJ1ZSkge1xuICAgICAgLy8gY2xlYXIgYW55IHNldCBlcnJvclxuICAgICAgZXJyb3IgPSBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBpZiBwYXNzZWQgYmFzaWMgdGVzdHMsIHNldCBkZWZhdWx0IG1lc3NhZ2UgYW5kIGFsZXJ0XG4gICAgICBpZih2ZmQgPT09IHRydWUpIHtcbiAgICAgICAgZXJyb3IgPSB7XG4gICAgICAgICAgbWVzc2FnZTogJ1RoZSBhcHBsaWNhdGlvbiByZWplY3RlZCB0aGUgY2VydGlmaWNhdGUuJyxcbiAgICAgICAgICBlcnJvcjogcGtpLmNlcnRpZmljYXRlRXJyb3IuYmFkX2NlcnRpZmljYXRlXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIC8vIGNoZWNrIGZvciBjdXN0b20gZXJyb3IgaW5mb1xuICAgICAgaWYocmV0IHx8IHJldCA9PT0gMCkge1xuICAgICAgICAvLyBzZXQgY3VzdG9tIG1lc3NhZ2UgYW5kIGVycm9yXG4gICAgICAgIGlmKHR5cGVvZiByZXQgPT09ICdvYmplY3QnICYmICFmb3JnZS51dGlsLmlzQXJyYXkocmV0KSkge1xuICAgICAgICAgIGlmKHJldC5tZXNzYWdlKSB7XG4gICAgICAgICAgICBlcnJvci5tZXNzYWdlID0gcmV0Lm1lc3NhZ2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmKHJldC5lcnJvcikge1xuICAgICAgICAgICAgZXJyb3IuZXJyb3IgPSByZXQuZXJyb3I7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYodHlwZW9mIHJldCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAvLyBzZXQgY3VzdG9tIGVycm9yXG4gICAgICAgICAgZXJyb3IuZXJyb3IgPSByZXQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gdGhyb3cgZXJyb3JcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cblxuICAgIC8vIG5vIGxvbmdlciBmaXJzdCBjZXJ0IGluIGNoYWluXG4gICAgZmlyc3QgPSBmYWxzZTtcbiAgICArK2RlcHRoO1xuICB9IHdoaWxlKGNoYWluLmxlbmd0aCA+IDApO1xuXG4gIHJldHVybiB0cnVlO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///58\n")},function(module,exports,__webpack_require__){eval("/**\n * Javascript implementation of PKCS#1 PSS signature padding.\n *\n * @author Stefan Siegl\n *\n * Copyright (c) 2012 Stefan Siegl <stesie@brokenpipe.de>\n */\nvar forge = __webpack_require__(4);\n__webpack_require__(13);\n__webpack_require__(7);\n\n// shortcut for PSS API\nvar pss = module.exports = forge.pss = forge.pss || {};\n\n/**\n * Creates a PSS signature scheme object.\n *\n * There are several ways to provide a salt for encoding:\n *\n * 1. Specify the saltLength only and the built-in PRNG will generate it.\n * 2. Specify the saltLength and a custom PRNG with 'getBytesSync' defined that\n *   will be used.\n * 3. Specify the salt itself as a forge.util.ByteBuffer.\n *\n * @param options the options to use:\n *          md the message digest object to use, a forge md instance.\n *          mgf the mask generation function to use, a forge mgf instance.\n *          [saltLength] the length of the salt in octets.\n *          [prng] the pseudo-random number generator to use to produce a salt.\n *          [salt] the salt to use when encoding.\n *\n * @return a signature scheme object.\n */\npss.create = function(options) {\n  // backwards compatibility w/legacy args: hash, mgf, sLen\n  if(arguments.length === 3) {\n    options = {\n      md: arguments[0],\n      mgf: arguments[1],\n      saltLength: arguments[2]\n    };\n  }\n\n  var hash = options.md;\n  var mgf = options.mgf;\n  var hLen = hash.digestLength;\n\n  var salt_ = options.salt || null;\n  if(typeof salt_ === 'string') {\n    // assume binary-encoded string\n    salt_ = forge.util.createBuffer(salt_);\n  }\n\n  var sLen;\n  if('saltLength' in options) {\n    sLen = options.saltLength;\n  } else if(salt_ !== null) {\n    sLen = salt_.length();\n  } else {\n    throw new Error('Salt length not specified or specific salt not given.');\n  }\n\n  if(salt_ !== null && salt_.length() !== sLen) {\n    throw new Error('Given salt length does not match length of given salt.');\n  }\n\n  var prng = options.prng || forge.random;\n\n  var pssobj = {};\n\n  /**\n   * Encodes a PSS signature.\n   *\n   * This function implements EMSA-PSS-ENCODE as per RFC 3447, section 9.1.1.\n   *\n   * @param md the message digest object with the hash to sign.\n   * @param modsBits the length of the RSA modulus in bits.\n   *\n   * @return the encoded message as a binary-encoded string of length\n   *           ceil((modBits - 1) / 8).\n   */\n  pssobj.encode = function(md, modBits) {\n    var i;\n    var emBits = modBits - 1;\n    var emLen = Math.ceil(emBits / 8);\n\n    /* 2. Let mHash = Hash(M), an octet string of length hLen. */\n    var mHash = md.digest().getBytes();\n\n    /* 3. If emLen < hLen + sLen + 2, output \"encoding error\" and stop. */\n    if(emLen < hLen + sLen + 2) {\n      throw new Error('Message is too long to encrypt.');\n    }\n\n    /* 4. Generate a random octet string salt of length sLen; if sLen = 0,\n     *    then salt is the empty string. */\n    var salt;\n    if(salt_ === null) {\n      salt = prng.getBytesSync(sLen);\n    } else {\n      salt = salt_.bytes();\n    }\n\n    /* 5. Let M' = (0x)00 00 00 00 00 00 00 00 || mHash || salt; */\n    var m_ = new forge.util.ByteBuffer();\n    m_.fillWithByte(0, 8);\n    m_.putBytes(mHash);\n    m_.putBytes(salt);\n\n    /* 6. Let H = Hash(M'), an octet string of length hLen. */\n    hash.start();\n    hash.update(m_.getBytes());\n    var h = hash.digest().getBytes();\n\n    /* 7. Generate an octet string PS consisting of emLen - sLen - hLen - 2\n     *    zero octets.  The length of PS may be 0. */\n    var ps = new forge.util.ByteBuffer();\n    ps.fillWithByte(0, emLen - sLen - hLen - 2);\n\n    /* 8. Let DB = PS || 0x01 || salt; DB is an octet string of length\n     *    emLen - hLen - 1. */\n    ps.putByte(0x01);\n    ps.putBytes(salt);\n    var db = ps.getBytes();\n\n    /* 9. Let dbMask = MGF(H, emLen - hLen - 1). */\n    var maskLen = emLen - hLen - 1;\n    var dbMask = mgf.generate(h, maskLen);\n\n    /* 10. Let maskedDB = DB \\xor dbMask. */\n    var maskedDB = '';\n    for(i = 0; i < maskLen; i++) {\n      maskedDB += String.fromCharCode(db.charCodeAt(i) ^ dbMask.charCodeAt(i));\n    }\n\n    /* 11. Set the leftmost 8emLen - emBits bits of the leftmost octet in\n     *     maskedDB to zero. */\n    var mask = (0xFF00 >> (8 * emLen - emBits)) & 0xFF;\n    maskedDB = String.fromCharCode(maskedDB.charCodeAt(0) & ~mask) +\n      maskedDB.substr(1);\n\n    /* 12. Let EM = maskedDB || H || 0xbc.\n     * 13. Output EM. */\n    return maskedDB + h + String.fromCharCode(0xbc);\n  };\n\n  /**\n   * Verifies a PSS signature.\n   *\n   * This function implements EMSA-PSS-VERIFY as per RFC 3447, section 9.1.2.\n   *\n   * @param mHash the message digest hash, as a binary-encoded string, to\n   *         compare against the signature.\n   * @param em the encoded message, as a binary-encoded string\n   *          (RSA decryption result).\n   * @param modsBits the length of the RSA modulus in bits.\n   *\n   * @return true if the signature was verified, false if not.\n   */\n  pssobj.verify = function(mHash, em, modBits) {\n    var i;\n    var emBits = modBits - 1;\n    var emLen = Math.ceil(emBits / 8);\n\n    /* c. Convert the message representative m to an encoded message EM\n     *    of length emLen = ceil((modBits - 1) / 8) octets, where modBits\n     *    is the length in bits of the RSA modulus n */\n    em = em.substr(-emLen);\n\n    /* 3. If emLen < hLen + sLen + 2, output \"inconsistent\" and stop. */\n    if(emLen < hLen + sLen + 2) {\n      throw new Error('Inconsistent parameters to PSS signature verification.');\n    }\n\n    /* 4. If the rightmost octet of EM does not have hexadecimal value\n     *    0xbc, output \"inconsistent\" and stop. */\n    if(em.charCodeAt(emLen - 1) !== 0xbc) {\n      throw new Error('Encoded message does not end in 0xBC.');\n    }\n\n    /* 5. Let maskedDB be the leftmost emLen - hLen - 1 octets of EM, and\n     *    let H be the next hLen octets. */\n    var maskLen = emLen - hLen - 1;\n    var maskedDB = em.substr(0, maskLen);\n    var h = em.substr(maskLen, hLen);\n\n    /* 6. If the leftmost 8emLen - emBits bits of the leftmost octet in\n     *    maskedDB are not all equal to zero, output \"inconsistent\" and stop. */\n    var mask = (0xFF00 >> (8 * emLen - emBits)) & 0xFF;\n    if((maskedDB.charCodeAt(0) & mask) !== 0) {\n      throw new Error('Bits beyond keysize not zero as expected.');\n    }\n\n    /* 7. Let dbMask = MGF(H, emLen - hLen - 1). */\n    var dbMask = mgf.generate(h, maskLen);\n\n    /* 8. Let DB = maskedDB \\xor dbMask. */\n    var db = '';\n    for(i = 0; i < maskLen; i++) {\n      db += String.fromCharCode(maskedDB.charCodeAt(i) ^ dbMask.charCodeAt(i));\n    }\n\n    /* 9. Set the leftmost 8emLen - emBits bits of the leftmost octet\n     * in DB to zero. */\n    db = String.fromCharCode(db.charCodeAt(0) & ~mask) + db.substr(1);\n\n    /* 10. If the emLen - hLen - sLen - 2 leftmost octets of DB are not zero\n     * or if the octet at position emLen - hLen - sLen - 1 (the leftmost\n     * position is \"position 1\") does not have hexadecimal value 0x01,\n     * output \"inconsistent\" and stop. */\n    var checkLen = emLen - hLen - sLen - 2;\n    for(i = 0; i < checkLen; i++) {\n      if(db.charCodeAt(i) !== 0x00) {\n        throw new Error('Leftmost octets not zero as expected');\n      }\n    }\n\n    if(db.charCodeAt(checkLen) !== 0x01) {\n      throw new Error('Inconsistent PSS signature, 0x01 marker not found');\n    }\n\n    /* 11. Let salt be the last sLen octets of DB. */\n    var salt = db.substr(-sLen);\n\n    /* 12.  Let M' = (0x)00 00 00 00 00 00 00 00 || mHash || salt */\n    var m_ = new forge.util.ByteBuffer();\n    m_.fillWithByte(0, 8);\n    m_.putBytes(mHash);\n    m_.putBytes(salt);\n\n    /* 13. Let H' = Hash(M'), an octet string of length hLen. */\n    hash.start();\n    hash.update(m_.getBytes());\n    var h_ = hash.digest().getBytes();\n\n    /* 14. If H = H', output \"consistent.\" Otherwise, output \"inconsistent.\" */\n    return h === h_;\n  };\n\n  return pssobj;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTkuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbm9kZS1mb3JnZS9saWIvcHNzLmpzP2IzODAiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBKYXZhc2NyaXB0IGltcGxlbWVudGF0aW9uIG9mIFBLQ1MjMSBQU1Mgc2lnbmF0dXJlIHBhZGRpbmcuXG4gKlxuICogQGF1dGhvciBTdGVmYW4gU2llZ2xcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTIgU3RlZmFuIFNpZWdsIDxzdGVzaWVAYnJva2VucGlwZS5kZT5cbiAqL1xudmFyIGZvcmdlID0gcmVxdWlyZSgnLi9mb3JnZScpO1xucmVxdWlyZSgnLi9yYW5kb20nKTtcbnJlcXVpcmUoJy4vdXRpbCcpO1xuXG4vLyBzaG9ydGN1dCBmb3IgUFNTIEFQSVxudmFyIHBzcyA9IG1vZHVsZS5leHBvcnRzID0gZm9yZ2UucHNzID0gZm9yZ2UucHNzIHx8IHt9O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBQU1Mgc2lnbmF0dXJlIHNjaGVtZSBvYmplY3QuXG4gKlxuICogVGhlcmUgYXJlIHNldmVyYWwgd2F5cyB0byBwcm92aWRlIGEgc2FsdCBmb3IgZW5jb2Rpbmc6XG4gKlxuICogMS4gU3BlY2lmeSB0aGUgc2FsdExlbmd0aCBvbmx5IGFuZCB0aGUgYnVpbHQtaW4gUFJORyB3aWxsIGdlbmVyYXRlIGl0LlxuICogMi4gU3BlY2lmeSB0aGUgc2FsdExlbmd0aCBhbmQgYSBjdXN0b20gUFJORyB3aXRoICdnZXRCeXRlc1N5bmMnIGRlZmluZWQgdGhhdFxuICogICB3aWxsIGJlIHVzZWQuXG4gKiAzLiBTcGVjaWZ5IHRoZSBzYWx0IGl0c2VsZiBhcyBhIGZvcmdlLnV0aWwuQnl0ZUJ1ZmZlci5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyB0aGUgb3B0aW9ucyB0byB1c2U6XG4gKiAgICAgICAgICBtZCB0aGUgbWVzc2FnZSBkaWdlc3Qgb2JqZWN0IHRvIHVzZSwgYSBmb3JnZSBtZCBpbnN0YW5jZS5cbiAqICAgICAgICAgIG1nZiB0aGUgbWFzayBnZW5lcmF0aW9uIGZ1bmN0aW9uIHRvIHVzZSwgYSBmb3JnZSBtZ2YgaW5zdGFuY2UuXG4gKiAgICAgICAgICBbc2FsdExlbmd0aF0gdGhlIGxlbmd0aCBvZiB0aGUgc2FsdCBpbiBvY3RldHMuXG4gKiAgICAgICAgICBbcHJuZ10gdGhlIHBzZXVkby1yYW5kb20gbnVtYmVyIGdlbmVyYXRvciB0byB1c2UgdG8gcHJvZHVjZSBhIHNhbHQuXG4gKiAgICAgICAgICBbc2FsdF0gdGhlIHNhbHQgdG8gdXNlIHdoZW4gZW5jb2RpbmcuXG4gKlxuICogQHJldHVybiBhIHNpZ25hdHVyZSBzY2hlbWUgb2JqZWN0LlxuICovXG5wc3MuY3JlYXRlID0gZnVuY3Rpb24ob3B0aW9ucykge1xuICAvLyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3L2xlZ2FjeSBhcmdzOiBoYXNoLCBtZ2YsIHNMZW5cbiAgaWYoYXJndW1lbnRzLmxlbmd0aCA9PT0gMykge1xuICAgIG9wdGlvbnMgPSB7XG4gICAgICBtZDogYXJndW1lbnRzWzBdLFxuICAgICAgbWdmOiBhcmd1bWVudHNbMV0sXG4gICAgICBzYWx0TGVuZ3RoOiBhcmd1bWVudHNbMl1cbiAgICB9O1xuICB9XG5cbiAgdmFyIGhhc2ggPSBvcHRpb25zLm1kO1xuICB2YXIgbWdmID0gb3B0aW9ucy5tZ2Y7XG4gIHZhciBoTGVuID0gaGFzaC5kaWdlc3RMZW5ndGg7XG5cbiAgdmFyIHNhbHRfID0gb3B0aW9ucy5zYWx0IHx8IG51bGw7XG4gIGlmKHR5cGVvZiBzYWx0XyA9PT0gJ3N0cmluZycpIHtcbiAgICAvLyBhc3N1bWUgYmluYXJ5LWVuY29kZWQgc3RyaW5nXG4gICAgc2FsdF8gPSBmb3JnZS51dGlsLmNyZWF0ZUJ1ZmZlcihzYWx0Xyk7XG4gIH1cblxuICB2YXIgc0xlbjtcbiAgaWYoJ3NhbHRMZW5ndGgnIGluIG9wdGlvbnMpIHtcbiAgICBzTGVuID0gb3B0aW9ucy5zYWx0TGVuZ3RoO1xuICB9IGVsc2UgaWYoc2FsdF8gIT09IG51bGwpIHtcbiAgICBzTGVuID0gc2FsdF8ubGVuZ3RoKCk7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdTYWx0IGxlbmd0aCBub3Qgc3BlY2lmaWVkIG9yIHNwZWNpZmljIHNhbHQgbm90IGdpdmVuLicpO1xuICB9XG5cbiAgaWYoc2FsdF8gIT09IG51bGwgJiYgc2FsdF8ubGVuZ3RoKCkgIT09IHNMZW4pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0dpdmVuIHNhbHQgbGVuZ3RoIGRvZXMgbm90IG1hdGNoIGxlbmd0aCBvZiBnaXZlbiBzYWx0LicpO1xuICB9XG5cbiAgdmFyIHBybmcgPSBvcHRpb25zLnBybmcgfHwgZm9yZ2UucmFuZG9tO1xuXG4gIHZhciBwc3NvYmogPSB7fTtcblxuICAvKipcbiAgICogRW5jb2RlcyBhIFBTUyBzaWduYXR1cmUuXG4gICAqXG4gICAqIFRoaXMgZnVuY3Rpb24gaW1wbGVtZW50cyBFTVNBLVBTUy1FTkNPREUgYXMgcGVyIFJGQyAzNDQ3LCBzZWN0aW9uIDkuMS4xLlxuICAgKlxuICAgKiBAcGFyYW0gbWQgdGhlIG1lc3NhZ2UgZGlnZXN0IG9iamVjdCB3aXRoIHRoZSBoYXNoIHRvIHNpZ24uXG4gICAqIEBwYXJhbSBtb2RzQml0cyB0aGUgbGVuZ3RoIG9mIHRoZSBSU0EgbW9kdWx1cyBpbiBiaXRzLlxuICAgKlxuICAgKiBAcmV0dXJuIHRoZSBlbmNvZGVkIG1lc3NhZ2UgYXMgYSBiaW5hcnktZW5jb2RlZCBzdHJpbmcgb2YgbGVuZ3RoXG4gICAqICAgICAgICAgICBjZWlsKChtb2RCaXRzIC0gMSkgLyA4KS5cbiAgICovXG4gIHBzc29iai5lbmNvZGUgPSBmdW5jdGlvbihtZCwgbW9kQml0cykge1xuICAgIHZhciBpO1xuICAgIHZhciBlbUJpdHMgPSBtb2RCaXRzIC0gMTtcbiAgICB2YXIgZW1MZW4gPSBNYXRoLmNlaWwoZW1CaXRzIC8gOCk7XG5cbiAgICAvKiAyLiBMZXQgbUhhc2ggPSBIYXNoKE0pLCBhbiBvY3RldCBzdHJpbmcgb2YgbGVuZ3RoIGhMZW4uICovXG4gICAgdmFyIG1IYXNoID0gbWQuZGlnZXN0KCkuZ2V0Qnl0ZXMoKTtcblxuICAgIC8qIDMuIElmIGVtTGVuIDwgaExlbiArIHNMZW4gKyAyLCBvdXRwdXQgXCJlbmNvZGluZyBlcnJvclwiIGFuZCBzdG9wLiAqL1xuICAgIGlmKGVtTGVuIDwgaExlbiArIHNMZW4gKyAyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01lc3NhZ2UgaXMgdG9vIGxvbmcgdG8gZW5jcnlwdC4nKTtcbiAgICB9XG5cbiAgICAvKiA0LiBHZW5lcmF0ZSBhIHJhbmRvbSBvY3RldCBzdHJpbmcgc2FsdCBvZiBsZW5ndGggc0xlbjsgaWYgc0xlbiA9IDAsXG4gICAgICogICAgdGhlbiBzYWx0IGlzIHRoZSBlbXB0eSBzdHJpbmcuICovXG4gICAgdmFyIHNhbHQ7XG4gICAgaWYoc2FsdF8gPT09IG51bGwpIHtcbiAgICAgIHNhbHQgPSBwcm5nLmdldEJ5dGVzU3luYyhzTGVuKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2FsdCA9IHNhbHRfLmJ5dGVzKCk7XG4gICAgfVxuXG4gICAgLyogNS4gTGV0IE0nID0gKDB4KTAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIHx8IG1IYXNoIHx8IHNhbHQ7ICovXG4gICAgdmFyIG1fID0gbmV3IGZvcmdlLnV0aWwuQnl0ZUJ1ZmZlcigpO1xuICAgIG1fLmZpbGxXaXRoQnl0ZSgwLCA4KTtcbiAgICBtXy5wdXRCeXRlcyhtSGFzaCk7XG4gICAgbV8ucHV0Qnl0ZXMoc2FsdCk7XG5cbiAgICAvKiA2LiBMZXQgSCA9IEhhc2goTScpLCBhbiBvY3RldCBzdHJpbmcgb2YgbGVuZ3RoIGhMZW4uICovXG4gICAgaGFzaC5zdGFydCgpO1xuICAgIGhhc2gudXBkYXRlKG1fLmdldEJ5dGVzKCkpO1xuICAgIHZhciBoID0gaGFzaC5kaWdlc3QoKS5nZXRCeXRlcygpO1xuXG4gICAgLyogNy4gR2VuZXJhdGUgYW4gb2N0ZXQgc3RyaW5nIFBTIGNvbnNpc3Rpbmcgb2YgZW1MZW4gLSBzTGVuIC0gaExlbiAtIDJcbiAgICAgKiAgICB6ZXJvIG9jdGV0cy4gIFRoZSBsZW5ndGggb2YgUFMgbWF5IGJlIDAuICovXG4gICAgdmFyIHBzID0gbmV3IGZvcmdlLnV0aWwuQnl0ZUJ1ZmZlcigpO1xuICAgIHBzLmZpbGxXaXRoQnl0ZSgwLCBlbUxlbiAtIHNMZW4gLSBoTGVuIC0gMik7XG5cbiAgICAvKiA4LiBMZXQgREIgPSBQUyB8fCAweDAxIHx8IHNhbHQ7IERCIGlzIGFuIG9jdGV0IHN0cmluZyBvZiBsZW5ndGhcbiAgICAgKiAgICBlbUxlbiAtIGhMZW4gLSAxLiAqL1xuICAgIHBzLnB1dEJ5dGUoMHgwMSk7XG4gICAgcHMucHV0Qnl0ZXMoc2FsdCk7XG4gICAgdmFyIGRiID0gcHMuZ2V0Qnl0ZXMoKTtcblxuICAgIC8qIDkuIExldCBkYk1hc2sgPSBNR0YoSCwgZW1MZW4gLSBoTGVuIC0gMSkuICovXG4gICAgdmFyIG1hc2tMZW4gPSBlbUxlbiAtIGhMZW4gLSAxO1xuICAgIHZhciBkYk1hc2sgPSBtZ2YuZ2VuZXJhdGUoaCwgbWFza0xlbik7XG5cbiAgICAvKiAxMC4gTGV0IG1hc2tlZERCID0gREIgXFx4b3IgZGJNYXNrLiAqL1xuICAgIHZhciBtYXNrZWREQiA9ICcnO1xuICAgIGZvcihpID0gMDsgaSA8IG1hc2tMZW47IGkrKykge1xuICAgICAgbWFza2VkREIgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShkYi5jaGFyQ29kZUF0KGkpIF4gZGJNYXNrLmNoYXJDb2RlQXQoaSkpO1xuICAgIH1cblxuICAgIC8qIDExLiBTZXQgdGhlIGxlZnRtb3N0IDhlbUxlbiAtIGVtQml0cyBiaXRzIG9mIHRoZSBsZWZ0bW9zdCBvY3RldCBpblxuICAgICAqICAgICBtYXNrZWREQiB0byB6ZXJvLiAqL1xuICAgIHZhciBtYXNrID0gKDB4RkYwMCA+PiAoOCAqIGVtTGVuIC0gZW1CaXRzKSkgJiAweEZGO1xuICAgIG1hc2tlZERCID0gU3RyaW5nLmZyb21DaGFyQ29kZShtYXNrZWREQi5jaGFyQ29kZUF0KDApICYgfm1hc2spICtcbiAgICAgIG1hc2tlZERCLnN1YnN0cigxKTtcblxuICAgIC8qIDEyLiBMZXQgRU0gPSBtYXNrZWREQiB8fCBIIHx8IDB4YmMuXG4gICAgICogMTMuIE91dHB1dCBFTS4gKi9cbiAgICByZXR1cm4gbWFza2VkREIgKyBoICsgU3RyaW5nLmZyb21DaGFyQ29kZSgweGJjKTtcbiAgfTtcblxuICAvKipcbiAgICogVmVyaWZpZXMgYSBQU1Mgc2lnbmF0dXJlLlxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIGltcGxlbWVudHMgRU1TQS1QU1MtVkVSSUZZIGFzIHBlciBSRkMgMzQ0Nywgc2VjdGlvbiA5LjEuMi5cbiAgICpcbiAgICogQHBhcmFtIG1IYXNoIHRoZSBtZXNzYWdlIGRpZ2VzdCBoYXNoLCBhcyBhIGJpbmFyeS1lbmNvZGVkIHN0cmluZywgdG9cbiAgICogICAgICAgICBjb21wYXJlIGFnYWluc3QgdGhlIHNpZ25hdHVyZS5cbiAgICogQHBhcmFtIGVtIHRoZSBlbmNvZGVkIG1lc3NhZ2UsIGFzIGEgYmluYXJ5LWVuY29kZWQgc3RyaW5nXG4gICAqICAgICAgICAgIChSU0EgZGVjcnlwdGlvbiByZXN1bHQpLlxuICAgKiBAcGFyYW0gbW9kc0JpdHMgdGhlIGxlbmd0aCBvZiB0aGUgUlNBIG1vZHVsdXMgaW4gYml0cy5cbiAgICpcbiAgICogQHJldHVybiB0cnVlIGlmIHRoZSBzaWduYXR1cmUgd2FzIHZlcmlmaWVkLCBmYWxzZSBpZiBub3QuXG4gICAqL1xuICBwc3NvYmoudmVyaWZ5ID0gZnVuY3Rpb24obUhhc2gsIGVtLCBtb2RCaXRzKSB7XG4gICAgdmFyIGk7XG4gICAgdmFyIGVtQml0cyA9IG1vZEJpdHMgLSAxO1xuICAgIHZhciBlbUxlbiA9IE1hdGguY2VpbChlbUJpdHMgLyA4KTtcblxuICAgIC8qIGMuIENvbnZlcnQgdGhlIG1lc3NhZ2UgcmVwcmVzZW50YXRpdmUgbSB0byBhbiBlbmNvZGVkIG1lc3NhZ2UgRU1cbiAgICAgKiAgICBvZiBsZW5ndGggZW1MZW4gPSBjZWlsKChtb2RCaXRzIC0gMSkgLyA4KSBvY3RldHMsIHdoZXJlIG1vZEJpdHNcbiAgICAgKiAgICBpcyB0aGUgbGVuZ3RoIGluIGJpdHMgb2YgdGhlIFJTQSBtb2R1bHVzIG4gKi9cbiAgICBlbSA9IGVtLnN1YnN0cigtZW1MZW4pO1xuXG4gICAgLyogMy4gSWYgZW1MZW4gPCBoTGVuICsgc0xlbiArIDIsIG91dHB1dCBcImluY29uc2lzdGVudFwiIGFuZCBzdG9wLiAqL1xuICAgIGlmKGVtTGVuIDwgaExlbiArIHNMZW4gKyAyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0luY29uc2lzdGVudCBwYXJhbWV0ZXJzIHRvIFBTUyBzaWduYXR1cmUgdmVyaWZpY2F0aW9uLicpO1xuICAgIH1cblxuICAgIC8qIDQuIElmIHRoZSByaWdodG1vc3Qgb2N0ZXQgb2YgRU0gZG9lcyBub3QgaGF2ZSBoZXhhZGVjaW1hbCB2YWx1ZVxuICAgICAqICAgIDB4YmMsIG91dHB1dCBcImluY29uc2lzdGVudFwiIGFuZCBzdG9wLiAqL1xuICAgIGlmKGVtLmNoYXJDb2RlQXQoZW1MZW4gLSAxKSAhPT0gMHhiYykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFbmNvZGVkIG1lc3NhZ2UgZG9lcyBub3QgZW5kIGluIDB4QkMuJyk7XG4gICAgfVxuXG4gICAgLyogNS4gTGV0IG1hc2tlZERCIGJlIHRoZSBsZWZ0bW9zdCBlbUxlbiAtIGhMZW4gLSAxIG9jdGV0cyBvZiBFTSwgYW5kXG4gICAgICogICAgbGV0IEggYmUgdGhlIG5leHQgaExlbiBvY3RldHMuICovXG4gICAgdmFyIG1hc2tMZW4gPSBlbUxlbiAtIGhMZW4gLSAxO1xuICAgIHZhciBtYXNrZWREQiA9IGVtLnN1YnN0cigwLCBtYXNrTGVuKTtcbiAgICB2YXIgaCA9IGVtLnN1YnN0cihtYXNrTGVuLCBoTGVuKTtcblxuICAgIC8qIDYuIElmIHRoZSBsZWZ0bW9zdCA4ZW1MZW4gLSBlbUJpdHMgYml0cyBvZiB0aGUgbGVmdG1vc3Qgb2N0ZXQgaW5cbiAgICAgKiAgICBtYXNrZWREQiBhcmUgbm90IGFsbCBlcXVhbCB0byB6ZXJvLCBvdXRwdXQgXCJpbmNvbnNpc3RlbnRcIiBhbmQgc3RvcC4gKi9cbiAgICB2YXIgbWFzayA9ICgweEZGMDAgPj4gKDggKiBlbUxlbiAtIGVtQml0cykpICYgMHhGRjtcbiAgICBpZigobWFza2VkREIuY2hhckNvZGVBdCgwKSAmIG1hc2spICE9PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0JpdHMgYmV5b25kIGtleXNpemUgbm90IHplcm8gYXMgZXhwZWN0ZWQuJyk7XG4gICAgfVxuXG4gICAgLyogNy4gTGV0IGRiTWFzayA9IE1HRihILCBlbUxlbiAtIGhMZW4gLSAxKS4gKi9cbiAgICB2YXIgZGJNYXNrID0gbWdmLmdlbmVyYXRlKGgsIG1hc2tMZW4pO1xuXG4gICAgLyogOC4gTGV0IERCID0gbWFza2VkREIgXFx4b3IgZGJNYXNrLiAqL1xuICAgIHZhciBkYiA9ICcnO1xuICAgIGZvcihpID0gMDsgaSA8IG1hc2tMZW47IGkrKykge1xuICAgICAgZGIgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShtYXNrZWREQi5jaGFyQ29kZUF0KGkpIF4gZGJNYXNrLmNoYXJDb2RlQXQoaSkpO1xuICAgIH1cblxuICAgIC8qIDkuIFNldCB0aGUgbGVmdG1vc3QgOGVtTGVuIC0gZW1CaXRzIGJpdHMgb2YgdGhlIGxlZnRtb3N0IG9jdGV0XG4gICAgICogaW4gREIgdG8gemVyby4gKi9cbiAgICBkYiA9IFN0cmluZy5mcm9tQ2hhckNvZGUoZGIuY2hhckNvZGVBdCgwKSAmIH5tYXNrKSArIGRiLnN1YnN0cigxKTtcblxuICAgIC8qIDEwLiBJZiB0aGUgZW1MZW4gLSBoTGVuIC0gc0xlbiAtIDIgbGVmdG1vc3Qgb2N0ZXRzIG9mIERCIGFyZSBub3QgemVyb1xuICAgICAqIG9yIGlmIHRoZSBvY3RldCBhdCBwb3NpdGlvbiBlbUxlbiAtIGhMZW4gLSBzTGVuIC0gMSAodGhlIGxlZnRtb3N0XG4gICAgICogcG9zaXRpb24gaXMgXCJwb3NpdGlvbiAxXCIpIGRvZXMgbm90IGhhdmUgaGV4YWRlY2ltYWwgdmFsdWUgMHgwMSxcbiAgICAgKiBvdXRwdXQgXCJpbmNvbnNpc3RlbnRcIiBhbmQgc3RvcC4gKi9cbiAgICB2YXIgY2hlY2tMZW4gPSBlbUxlbiAtIGhMZW4gLSBzTGVuIC0gMjtcbiAgICBmb3IoaSA9IDA7IGkgPCBjaGVja0xlbjsgaSsrKSB7XG4gICAgICBpZihkYi5jaGFyQ29kZUF0KGkpICE9PSAweDAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTGVmdG1vc3Qgb2N0ZXRzIG5vdCB6ZXJvIGFzIGV4cGVjdGVkJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYoZGIuY2hhckNvZGVBdChjaGVja0xlbikgIT09IDB4MDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW5jb25zaXN0ZW50IFBTUyBzaWduYXR1cmUsIDB4MDEgbWFya2VyIG5vdCBmb3VuZCcpO1xuICAgIH1cblxuICAgIC8qIDExLiBMZXQgc2FsdCBiZSB0aGUgbGFzdCBzTGVuIG9jdGV0cyBvZiBEQi4gKi9cbiAgICB2YXIgc2FsdCA9IGRiLnN1YnN0cigtc0xlbik7XG5cbiAgICAvKiAxMi4gIExldCBNJyA9ICgweCkwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCB8fCBtSGFzaCB8fCBzYWx0ICovXG4gICAgdmFyIG1fID0gbmV3IGZvcmdlLnV0aWwuQnl0ZUJ1ZmZlcigpO1xuICAgIG1fLmZpbGxXaXRoQnl0ZSgwLCA4KTtcbiAgICBtXy5wdXRCeXRlcyhtSGFzaCk7XG4gICAgbV8ucHV0Qnl0ZXMoc2FsdCk7XG5cbiAgICAvKiAxMy4gTGV0IEgnID0gSGFzaChNJyksIGFuIG9jdGV0IHN0cmluZyBvZiBsZW5ndGggaExlbi4gKi9cbiAgICBoYXNoLnN0YXJ0KCk7XG4gICAgaGFzaC51cGRhdGUobV8uZ2V0Qnl0ZXMoKSk7XG4gICAgdmFyIGhfID0gaGFzaC5kaWdlc3QoKS5nZXRCeXRlcygpO1xuXG4gICAgLyogMTQuIElmIEggPSBIJywgb3V0cHV0IFwiY29uc2lzdGVudC5cIiBPdGhlcndpc2UsIG91dHB1dCBcImluY29uc2lzdGVudC5cIiAqL1xuICAgIHJldHVybiBoID09PSBoXztcbiAgfTtcblxuICByZXR1cm4gcHNzb2JqO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///59\n")},,function(module,exports,__webpack_require__){"use strict";eval("/*\nobject-assign\n(c) Sindre Sorhus\n@license MIT\n*/\n\n\n/* eslint-disable no-unused-vars */\nvar getOwnPropertySymbols = Object.getOwnPropertySymbols;\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\nvar propIsEnumerable = Object.prototype.propertyIsEnumerable;\n\nfunction toObject(val) {\n\tif (val === null || val === undefined) {\n\t\tthrow new TypeError('Object.assign cannot be called with null or undefined');\n\t}\n\n\treturn Object(val);\n}\n\nfunction shouldUseNative() {\n\ttry {\n\t\tif (!Object.assign) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Detect buggy property enumeration order in older V8 versions.\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=4118\n\t\tvar test1 = new String('abc');  // eslint-disable-line no-new-wrappers\n\t\ttest1[5] = 'de';\n\t\tif (Object.getOwnPropertyNames(test1)[0] === '5') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\tvar test2 = {};\n\t\tfor (var i = 0; i < 10; i++) {\n\t\t\ttest2['_' + String.fromCharCode(i)] = i;\n\t\t}\n\t\tvar order2 = Object.getOwnPropertyNames(test2).map(function (n) {\n\t\t\treturn test2[n];\n\t\t});\n\t\tif (order2.join('') !== '0123456789') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\tvar test3 = {};\n\t\t'abcdefghijklmnopqrst'.split('').forEach(function (letter) {\n\t\t\ttest3[letter] = letter;\n\t\t});\n\t\tif (Object.keys(Object.assign({}, test3)).join('') !==\n\t\t\t\t'abcdefghijklmnopqrst') {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t} catch (err) {\n\t\t// We don't expect any of the above to throw, but better to be safe.\n\t\treturn false;\n\t}\n}\n\nmodule.exports = shouldUseNative() ? Object.assign : function (target, source) {\n\tvar from;\n\tvar to = toObject(target);\n\tvar symbols;\n\n\tfor (var s = 1; s < arguments.length; s++) {\n\t\tfrom = Object(arguments[s]);\n\n\t\tfor (var key in from) {\n\t\t\tif (hasOwnProperty.call(from, key)) {\n\t\t\t\tto[key] = from[key];\n\t\t\t}\n\t\t}\n\n\t\tif (getOwnPropertySymbols) {\n\t\t\tsymbols = getOwnPropertySymbols(from);\n\t\t\tfor (var i = 0; i < symbols.length; i++) {\n\t\t\t\tif (propIsEnumerable.call(from, symbols[i])) {\n\t\t\t\t\tto[symbols[i]] = from[symbols[i]];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn to;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjEuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvb2JqZWN0LWFzc2lnbi9pbmRleC5qcz8zMjBjIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXG5vYmplY3QtYXNzaWduXG4oYykgU2luZHJlIFNvcmh1c1xuQGxpY2Vuc2UgTUlUXG4qL1xuXG4ndXNlIHN0cmljdCc7XG4vKiBlc2xpbnQtZGlzYWJsZSBuby11bnVzZWQtdmFycyAqL1xudmFyIGdldE93blByb3BlcnR5U3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG52YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xudmFyIHByb3BJc0VudW1lcmFibGUgPSBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlO1xuXG5mdW5jdGlvbiB0b09iamVjdCh2YWwpIHtcblx0aWYgKHZhbCA9PT0gbnVsbCB8fCB2YWwgPT09IHVuZGVmaW5lZCkge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ09iamVjdC5hc3NpZ24gY2Fubm90IGJlIGNhbGxlZCB3aXRoIG51bGwgb3IgdW5kZWZpbmVkJyk7XG5cdH1cblxuXHRyZXR1cm4gT2JqZWN0KHZhbCk7XG59XG5cbmZ1bmN0aW9uIHNob3VsZFVzZU5hdGl2ZSgpIHtcblx0dHJ5IHtcblx0XHRpZiAoIU9iamVjdC5hc3NpZ24pIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHQvLyBEZXRlY3QgYnVnZ3kgcHJvcGVydHkgZW51bWVyYXRpb24gb3JkZXIgaW4gb2xkZXIgVjggdmVyc2lvbnMuXG5cblx0XHQvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD00MTE4XG5cdFx0dmFyIHRlc3QxID0gbmV3IFN0cmluZygnYWJjJyk7ICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLW5ldy13cmFwcGVyc1xuXHRcdHRlc3QxWzVdID0gJ2RlJztcblx0XHRpZiAoT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGVzdDEpWzBdID09PSAnNScpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHQvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD0zMDU2XG5cdFx0dmFyIHRlc3QyID0ge307XG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCAxMDsgaSsrKSB7XG5cdFx0XHR0ZXN0MlsnXycgKyBTdHJpbmcuZnJvbUNoYXJDb2RlKGkpXSA9IGk7XG5cdFx0fVxuXHRcdHZhciBvcmRlcjIgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0ZXN0MikubWFwKGZ1bmN0aW9uIChuKSB7XG5cdFx0XHRyZXR1cm4gdGVzdDJbbl07XG5cdFx0fSk7XG5cdFx0aWYgKG9yZGVyMi5qb2luKCcnKSAhPT0gJzAxMjM0NTY3ODknKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Ly8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9MzA1NlxuXHRcdHZhciB0ZXN0MyA9IHt9O1xuXHRcdCdhYmNkZWZnaGlqa2xtbm9wcXJzdCcuc3BsaXQoJycpLmZvckVhY2goZnVuY3Rpb24gKGxldHRlcikge1xuXHRcdFx0dGVzdDNbbGV0dGVyXSA9IGxldHRlcjtcblx0XHR9KTtcblx0XHRpZiAoT2JqZWN0LmtleXMoT2JqZWN0LmFzc2lnbih7fSwgdGVzdDMpKS5qb2luKCcnKSAhPT1cblx0XHRcdFx0J2FiY2RlZmdoaWprbG1ub3BxcnN0Jykge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHJldHVybiB0cnVlO1xuXHR9IGNhdGNoIChlcnIpIHtcblx0XHQvLyBXZSBkb24ndCBleHBlY3QgYW55IG9mIHRoZSBhYm92ZSB0byB0aHJvdywgYnV0IGJldHRlciB0byBiZSBzYWZlLlxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNob3VsZFVzZU5hdGl2ZSgpID8gT2JqZWN0LmFzc2lnbiA6IGZ1bmN0aW9uICh0YXJnZXQsIHNvdXJjZSkge1xuXHR2YXIgZnJvbTtcblx0dmFyIHRvID0gdG9PYmplY3QodGFyZ2V0KTtcblx0dmFyIHN5bWJvbHM7XG5cblx0Zm9yICh2YXIgcyA9IDE7IHMgPCBhcmd1bWVudHMubGVuZ3RoOyBzKyspIHtcblx0XHRmcm9tID0gT2JqZWN0KGFyZ3VtZW50c1tzXSk7XG5cblx0XHRmb3IgKHZhciBrZXkgaW4gZnJvbSkge1xuXHRcdFx0aWYgKGhhc093blByb3BlcnR5LmNhbGwoZnJvbSwga2V5KSkge1xuXHRcdFx0XHR0b1trZXldID0gZnJvbVtrZXldO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChnZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcblx0XHRcdHN5bWJvbHMgPSBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZnJvbSk7XG5cdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IHN5bWJvbHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0aWYgKHByb3BJc0VudW1lcmFibGUuY2FsbChmcm9tLCBzeW1ib2xzW2ldKSkge1xuXHRcdFx0XHRcdHRvW3N5bWJvbHNbaV1dID0gZnJvbVtzeW1ib2xzW2ldXTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybiB0bztcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///61\n")},function(module,exports,__webpack_require__){"use strict";eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = exports.isUxp = void 0;\n\nvar _needsNative = _interopRequireDefault(__webpack_require__(142));\n\nvar _react = _interopRequireDefault(__webpack_require__(0));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nconst isUxp = window.location.protocol === 'plugin:';\nexports.isUxp = isUxp;\nconst defaultOptions = Object.freeze({\n  enabled: isUxp,\n  enableSpectrumUXP: false,\n  default: isUxp,\n  productNeedsOverlayFix: isUxp && (0, _needsNative.default)() || false,\n  AccordionItem: undefined,\n  Autocomplete: undefined,\n  Breadcrumbs: undefined,\n  Button: undefined,\n  Checkbox: undefined,\n  CoachMark: undefined,\n  CoachMarkIndicator: undefined,\n  CoachMarkPopover: undefined,\n  Dialog: undefined,\n  Dropdown: undefined,\n  FieldLabel: undefined,\n  FocusRingPolyfill: undefined,\n  Form: undefined,\n  Label: undefined,\n  Link: undefined,\n  ListItem: undefined,\n  Menu: undefined,\n  SubMenu: undefined,\n  ModalTrigger: undefined,\n  OverlayTrigger: undefined,\n  Popover: undefined,\n  Progress: undefined,\n  Provider: undefined,\n  Radio: undefined,\n  RadioGroup: undefined,\n  Rule: undefined,\n  Search: undefined,\n  Select: undefined,\n  SelectList: undefined,\n  Slider: undefined,\n  SwitchBase: undefined,\n  Tab: undefined,\n  TR: undefined,\n  TabList: undefined,\n  Tag: undefined,\n  Textfield: undefined,\n  Toast: undefined,\n  Tooltip: undefined,\n  Video: undefined,\n  Wait: undefined,\n  PortalContainer: undefined,\n  ScrollManager: undefined\n}); //  this is necessary because we are using require(\"Component\") and the Component is exporting default usually\n\nfunction getDefaultExport(moduleExports) {\n  return moduleExports.default || moduleExports;\n}\n\nclass UxpOptions {\n  constructor() {\n    this.reset();\n  }\n\n  reset() {\n    Object.assign(this, defaultOptions);\n  }\n\n  select(name, UxpComponentFn, WebComponentFn, SpComponentFn) {\n    if (Array.isArray(this['enableSpectrumUXP']) && this['enableSpectrumUXP'].includes(name) && SpComponentFn) {\n      return getDefaultExport(SpComponentFn());\n    }\n\n    if (this[name]) {\n      return getDefaultExport(UxpComponentFn());\n    }\n\n    return getDefaultExport(WebComponentFn());\n  }\n\n} //  we use a proxy in order to provide logic for each option on get\n\n\nvar _default = new Proxy(new UxpOptions(), {\n  get(options, p) {\n    let value = options[p];\n\n    if (defaultOptions.hasOwnProperty(p)) {\n      if (options.enabled) {\n        return value != null ? value : options.default;\n      }\n\n      return false;\n    }\n\n    return value;\n  }\n\n});\n\nexports.default = _default;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjIuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRvcnEtbmF0aXZlL3JlYWN0LXNwZWN0cnVtL3V0aWxzL1V4cE9wdGlvbnMuanM/MGY2MCJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IGV4cG9ydHMuaXNVeHAgPSB2b2lkIDA7XG5cbnZhciBfbmVlZHNOYXRpdmUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL25lZWRzTmF0aXZlXCIpKTtcblxudmFyIF9yZWFjdCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJlYWN0XCIpKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuY29uc3QgaXNVeHAgPSB3aW5kb3cubG9jYXRpb24ucHJvdG9jb2wgPT09ICdwbHVnaW46JztcbmV4cG9ydHMuaXNVeHAgPSBpc1V4cDtcbmNvbnN0IGRlZmF1bHRPcHRpb25zID0gT2JqZWN0LmZyZWV6ZSh7XG4gIGVuYWJsZWQ6IGlzVXhwLFxuICBlbmFibGVTcGVjdHJ1bVVYUDogZmFsc2UsXG4gIGRlZmF1bHQ6IGlzVXhwLFxuICBwcm9kdWN0TmVlZHNPdmVybGF5Rml4OiBpc1V4cCAmJiAoMCwgX25lZWRzTmF0aXZlLmRlZmF1bHQpKCkgfHwgZmFsc2UsXG4gIEFjY29yZGlvbkl0ZW06IHVuZGVmaW5lZCxcbiAgQXV0b2NvbXBsZXRlOiB1bmRlZmluZWQsXG4gIEJyZWFkY3J1bWJzOiB1bmRlZmluZWQsXG4gIEJ1dHRvbjogdW5kZWZpbmVkLFxuICBDaGVja2JveDogdW5kZWZpbmVkLFxuICBDb2FjaE1hcms6IHVuZGVmaW5lZCxcbiAgQ29hY2hNYXJrSW5kaWNhdG9yOiB1bmRlZmluZWQsXG4gIENvYWNoTWFya1BvcG92ZXI6IHVuZGVmaW5lZCxcbiAgRGlhbG9nOiB1bmRlZmluZWQsXG4gIERyb3Bkb3duOiB1bmRlZmluZWQsXG4gIEZpZWxkTGFiZWw6IHVuZGVmaW5lZCxcbiAgRm9jdXNSaW5nUG9seWZpbGw6IHVuZGVmaW5lZCxcbiAgRm9ybTogdW5kZWZpbmVkLFxuICBMYWJlbDogdW5kZWZpbmVkLFxuICBMaW5rOiB1bmRlZmluZWQsXG4gIExpc3RJdGVtOiB1bmRlZmluZWQsXG4gIE1lbnU6IHVuZGVmaW5lZCxcbiAgU3ViTWVudTogdW5kZWZpbmVkLFxuICBNb2RhbFRyaWdnZXI6IHVuZGVmaW5lZCxcbiAgT3ZlcmxheVRyaWdnZXI6IHVuZGVmaW5lZCxcbiAgUG9wb3ZlcjogdW5kZWZpbmVkLFxuICBQcm9ncmVzczogdW5kZWZpbmVkLFxuICBQcm92aWRlcjogdW5kZWZpbmVkLFxuICBSYWRpbzogdW5kZWZpbmVkLFxuICBSYWRpb0dyb3VwOiB1bmRlZmluZWQsXG4gIFJ1bGU6IHVuZGVmaW5lZCxcbiAgU2VhcmNoOiB1bmRlZmluZWQsXG4gIFNlbGVjdDogdW5kZWZpbmVkLFxuICBTZWxlY3RMaXN0OiB1bmRlZmluZWQsXG4gIFNsaWRlcjogdW5kZWZpbmVkLFxuICBTd2l0Y2hCYXNlOiB1bmRlZmluZWQsXG4gIFRhYjogdW5kZWZpbmVkLFxuICBUUjogdW5kZWZpbmVkLFxuICBUYWJMaXN0OiB1bmRlZmluZWQsXG4gIFRhZzogdW5kZWZpbmVkLFxuICBUZXh0ZmllbGQ6IHVuZGVmaW5lZCxcbiAgVG9hc3Q6IHVuZGVmaW5lZCxcbiAgVG9vbHRpcDogdW5kZWZpbmVkLFxuICBWaWRlbzogdW5kZWZpbmVkLFxuICBXYWl0OiB1bmRlZmluZWQsXG4gIFBvcnRhbENvbnRhaW5lcjogdW5kZWZpbmVkLFxuICBTY3JvbGxNYW5hZ2VyOiB1bmRlZmluZWRcbn0pOyAvLyAgdGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSB3ZSBhcmUgdXNpbmcgcmVxdWlyZShcIkNvbXBvbmVudFwiKSBhbmQgdGhlIENvbXBvbmVudCBpcyBleHBvcnRpbmcgZGVmYXVsdCB1c3VhbGx5XG5cbmZ1bmN0aW9uIGdldERlZmF1bHRFeHBvcnQobW9kdWxlRXhwb3J0cykge1xuICByZXR1cm4gbW9kdWxlRXhwb3J0cy5kZWZhdWx0IHx8IG1vZHVsZUV4cG9ydHM7XG59XG5cbmNsYXNzIFV4cE9wdGlvbnMge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLnJlc2V0KCk7XG4gIH1cblxuICByZXNldCgpIHtcbiAgICBPYmplY3QuYXNzaWduKHRoaXMsIGRlZmF1bHRPcHRpb25zKTtcbiAgfVxuXG4gIHNlbGVjdChuYW1lLCBVeHBDb21wb25lbnRGbiwgV2ViQ29tcG9uZW50Rm4sIFNwQ29tcG9uZW50Rm4pIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzWydlbmFibGVTcGVjdHJ1bVVYUCddKSAmJiB0aGlzWydlbmFibGVTcGVjdHJ1bVVYUCddLmluY2x1ZGVzKG5hbWUpICYmIFNwQ29tcG9uZW50Rm4pIHtcbiAgICAgIHJldHVybiBnZXREZWZhdWx0RXhwb3J0KFNwQ29tcG9uZW50Rm4oKSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXNbbmFtZV0pIHtcbiAgICAgIHJldHVybiBnZXREZWZhdWx0RXhwb3J0KFV4cENvbXBvbmVudEZuKCkpO1xuICAgIH1cblxuICAgIHJldHVybiBnZXREZWZhdWx0RXhwb3J0KFdlYkNvbXBvbmVudEZuKCkpO1xuICB9XG5cbn0gLy8gIHdlIHVzZSBhIHByb3h5IGluIG9yZGVyIHRvIHByb3ZpZGUgbG9naWMgZm9yIGVhY2ggb3B0aW9uIG9uIGdldFxuXG5cbnZhciBfZGVmYXVsdCA9IG5ldyBQcm94eShuZXcgVXhwT3B0aW9ucygpLCB7XG4gIGdldChvcHRpb25zLCBwKSB7XG4gICAgbGV0IHZhbHVlID0gb3B0aW9uc1twXTtcblxuICAgIGlmIChkZWZhdWx0T3B0aW9ucy5oYXNPd25Qcm9wZXJ0eShwKSkge1xuICAgICAgaWYgKG9wdGlvbnMuZW5hYmxlZCkge1xuICAgICAgICByZXR1cm4gdmFsdWUgIT0gbnVsbCA/IHZhbHVlIDogb3B0aW9ucy5kZWZhdWx0O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbn0pO1xuXG5leHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///62\n")},function(module,exports,__webpack_require__){"use strict";eval('/* WEBPACK VAR INJECTION */(function(process) {\n\nObject.defineProperty(exports, "__esModule", {\n  value: true\n});\nexports.default = exports.INDETERMINATE = exports.DETERMINATE = void 0;\n\nvar _classnames = _interopRequireDefault(__webpack_require__(46));\n\nvar _filterDOMProps = _interopRequireDefault(__webpack_require__(34));\n\nvar _propTypes = _interopRequireDefault(__webpack_require__(47));\n\nvar _react = _interopRequireDefault(__webpack_require__(0));\n\n__webpack_require__(146);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\nif (process.env.SCALE_MEDIUM && process.env.SCALE_LARGE) {\n  __webpack_require__(64);\n\n  __webpack_require__(149);\n} else if (process.env.SCALE_LARGE) {\n  __webpack_require__(151);\n} else {\n  __webpack_require__(64);\n}\n\nif (!process.env.THEME_LIGHT && !process.env.THEME_DARK && !process.env.THEME_LIGHTEST && !process.env.THEME_DARKEST || process.env.THEME_LIGHT) __webpack_require__(153);\nif (!process.env.THEME_LIGHT && !process.env.THEME_DARK && !process.env.THEME_LIGHTEST && !process.env.THEME_DARKEST || process.env.THEME_DARK) __webpack_require__(155);\nif (!process.env.THEME_LIGHT && !process.env.THEME_DARK && !process.env.THEME_LIGHTEST && !process.env.THEME_DARKEST || process.env.THEME_LIGHTEST) __webpack_require__(157);\nif (!process.env.THEME_LIGHT && !process.env.THEME_DARK && !process.env.THEME_LIGHTEST && !process.env.THEME_DARKEST || process.env.THEME_DARKEST) __webpack_require__(159);\nconst DETERMINATE = \'determinate\';\nexports.DETERMINATE = DETERMINATE;\nconst INDETERMINATE = \'indeterminate\';\nexports.INDETERMINATE = INDETERMINATE;\n\nclass Wait extends _react.default.Component {\n  render() {\n    let _this$props = this.props,\n        {\n      value = 0,\n      size = \'M\',\n      indeterminate = true,\n      centered = false,\n      className,\n      variant\n    } = _this$props,\n        otherProps = _objectWithoutProperties(_this$props, ["value", "size", "indeterminate", "centered", "className", "variant"]); // Determinate version has two high level masks, 1) right half, 2) left half\n    // within each of those is a submask which rotates into view within that mask\n    // but starts off on the opposite side so it\'s hidden\n    // for first 50%, submask1 moves from -180 to 0 as it covers the first half\n    // for the second 50%, submask1 stays in one place and submask2 rotates in\n    // from -180 to 0\n\n\n    let angle;\n    let fillSubmask1Style = {};\n    let fillSubmask2Style = {};\n    let ariaValue = undefined;\n\n    if (variant === DETERMINATE || variant === INDETERMINATE) {\n      console.warn(`The "${variant}" variant of Wait is deprecated. Please use the "indeterminate" prop instead.`);\n    }\n\n    if (variant === DETERMINATE || !indeterminate) {\n      value = Math.min(Math.max(+value, 0), 100);\n      ariaValue = value;\n\n      if (value > 0 && value <= 50) {\n        angle = -180 + value / 50 * 180;\n        fillSubmask1Style.transform = \'rotate(\' + angle + \'deg)\';\n        fillSubmask2Style.transform = \'rotate(-180deg)\';\n      } else if (value > 50) {\n        angle = -180 + (value - 50) / 50 * 180;\n        fillSubmask1Style.transform = \'rotate(0deg)\';\n        fillSubmask2Style.transform = \'rotate(\' + angle + \'deg)\';\n      }\n    }\n\n    return /*#__PURE__*/_react.default.createElement("div", _extends({\n      className: (0, _classnames.default)(\'spectrum-CircleLoader\', {\n        \'spectrum-CircleLoader--indeterminate\': variant === INDETERMINATE || indeterminate && variant !== DETERMINATE,\n        \'spectrum-CircleLoader--small\': size === \'S\',\n        \'spectrum-CircleLoader--large\': size === \'L\',\n        \'spectrum-CircleLoader--overBackground\': variant === \'overBackground\',\n        \'react-spectrum-Wait--centered\': centered\n      }, className),\n      role: "progressbar",\n      "aria-valuenow": ariaValue,\n      "aria-valuemin": 0,\n      "aria-valuemax": 100\n    }, (0, _filterDOMProps.default)(otherProps)), /*#__PURE__*/_react.default.createElement("div", {\n      className: "spectrum-CircleLoader-track"\n    }), /*#__PURE__*/_react.default.createElement("div", {\n      className: "spectrum-CircleLoader-fills"\n    }, /*#__PURE__*/_react.default.createElement("div", {\n      className: "spectrum-CircleLoader-fillMask1"\n    }, /*#__PURE__*/_react.default.createElement("div", {\n      className: "spectrum-CircleLoader-fillSubMask1",\n      style: fillSubmask1Style\n    }, /*#__PURE__*/_react.default.createElement("div", {\n      className: "spectrum-CircleLoader-fill"\n    }))), /*#__PURE__*/_react.default.createElement("div", {\n      className: "spectrum-CircleLoader-fillMask2"\n    }, /*#__PURE__*/_react.default.createElement("div", {\n      className: "spectrum-CircleLoader-fillSubMask2",\n      style: fillSubmask2Style\n    }, /*#__PURE__*/_react.default.createElement("div", {\n      className: "spectrum-CircleLoader-fill"\n    })))));\n  }\n\n}\n\nexports.default = Wait;\nWait.propTypes = {\n  /** Whether to center the Wait compnent in the parent container. */\n  centered: _propTypes.default.bool,\n\n  /** Custom CSS class to add to the Wait component */\n  className: _propTypes.default.string,\n\n  /**\n   * Boolean to determine if the Wait component should endlessly spin (indeterminate) or\n   * if it should be controlled manually.\n   */\n  indeterminate: _propTypes.default.bool,\n\n  /** Size of the Wait component */\n  size: _propTypes.default.string,\n\n  /** Adjust the filled portion of the Wait component to a determined value */\n  value: _propTypes.default.number,\n\n  /**\n  * The variant of Wait to display.\n  */\n  variant: _propTypes.default.oneOf([\'overBackground\'])\n};\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(16)))//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRvcnEtbmF0aXZlL3JlYWN0LXNwZWN0cnVtL1dhaXQvanMvV2FpdC5qcz9kYTRkIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gZXhwb3J0cy5JTkRFVEVSTUlOQVRFID0gZXhwb3J0cy5ERVRFUk1JTkFURSA9IHZvaWQgMDtcblxudmFyIF9jbGFzc25hbWVzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiY2xhc3NuYW1lc1wiKSk7XG5cbnZhciBfZmlsdGVyRE9NUHJvcHMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi8uLi91dGlscy9maWx0ZXJET01Qcm9wc1wiKSk7XG5cbnZhciBfcHJvcFR5cGVzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicHJvcC10eXBlc1wiKSk7XG5cbnZhciBfcmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbnJlcXVpcmUoXCIuLi9zdHlsZS9pbmRleC5jc3NcIik7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIF9leHRlbmRzKCkgeyBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldOyBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gfSB9IHJldHVybiB0YXJnZXQ7IH07IHJldHVybiBfZXh0ZW5kcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9XG5cbmZ1bmN0aW9uIF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhzb3VyY2UsIGV4Y2x1ZGVkKSB7IGlmIChzb3VyY2UgPT0gbnVsbCkgcmV0dXJuIHt9OyB2YXIgdGFyZ2V0ID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2Uoc291cmNlLCBleGNsdWRlZCk7IHZhciBrZXksIGk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBzb3VyY2VTeW1ib2xLZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzb3VyY2UpOyBmb3IgKGkgPSAwOyBpIDwgc291cmNlU3ltYm9sS2V5cy5sZW5ndGg7IGkrKykgeyBrZXkgPSBzb3VyY2VTeW1ib2xLZXlzW2ldOyBpZiAoZXhjbHVkZWQuaW5kZXhPZihrZXkpID49IDApIGNvbnRpbnVlOyBpZiAoIU9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzb3VyY2UsIGtleSkpIGNvbnRpbnVlOyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5mdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShzb3VyY2UsIGV4Y2x1ZGVkKSB7IGlmIChzb3VyY2UgPT0gbnVsbCkgcmV0dXJuIHt9OyB2YXIgdGFyZ2V0ID0ge307IHZhciBzb3VyY2VLZXlzID0gT2JqZWN0LmtleXMoc291cmNlKTsgdmFyIGtleSwgaTsgZm9yIChpID0gMDsgaSA8IHNvdXJjZUtleXMubGVuZ3RoOyBpKyspIHsga2V5ID0gc291cmNlS2V5c1tpXTsgaWYgKGV4Y2x1ZGVkLmluZGV4T2Yoa2V5KSA+PSAwKSBjb250aW51ZTsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmlmIChwcm9jZXNzLmVudi5TQ0FMRV9NRURJVU0gJiYgcHJvY2Vzcy5lbnYuU0NBTEVfTEFSR0UpIHtcbiAgcmVxdWlyZShcIkBhZG9iZS9zcGVjdHJ1bS1jc3MvZGlzdC9jb21wb25lbnRzL2NpcmNsZWxvYWRlci9pbmRleC5jc3NcIik7XG5cbiAgcmVxdWlyZShcIkBhZG9iZS9zcGVjdHJ1bS1jc3MvZGlzdC9jb21wb25lbnRzL2NpcmNsZWxvYWRlci9pbmRleC1kaWZmLmNzc1wiKTtcbn0gZWxzZSBpZiAocHJvY2Vzcy5lbnYuU0NBTEVfTEFSR0UpIHtcbiAgcmVxdWlyZShcIkBhZG9iZS9zcGVjdHJ1bS1jc3MvZGlzdC9jb21wb25lbnRzL2NpcmNsZWxvYWRlci9pbmRleC1sZy5jc3NcIik7XG59IGVsc2Uge1xuICByZXF1aXJlKFwiQGFkb2JlL3NwZWN0cnVtLWNzcy9kaXN0L2NvbXBvbmVudHMvY2lyY2xlbG9hZGVyL2luZGV4LmNzc1wiKTtcbn1cblxuaWYgKCFwcm9jZXNzLmVudi5USEVNRV9MSUdIVCAmJiAhcHJvY2Vzcy5lbnYuVEhFTUVfREFSSyAmJiAhcHJvY2Vzcy5lbnYuVEhFTUVfTElHSFRFU1QgJiYgIXByb2Nlc3MuZW52LlRIRU1FX0RBUktFU1QgfHwgcHJvY2Vzcy5lbnYuVEhFTUVfTElHSFQpIHJlcXVpcmUoXCJAYWRvYmUvc3BlY3RydW0tY3NzL2Rpc3QvY29tcG9uZW50cy9jaXJjbGVsb2FkZXIvbXVsdGlTdG9wcy9saWdodC5jc3NcIik7XG5pZiAoIXByb2Nlc3MuZW52LlRIRU1FX0xJR0hUICYmICFwcm9jZXNzLmVudi5USEVNRV9EQVJLICYmICFwcm9jZXNzLmVudi5USEVNRV9MSUdIVEVTVCAmJiAhcHJvY2Vzcy5lbnYuVEhFTUVfREFSS0VTVCB8fCBwcm9jZXNzLmVudi5USEVNRV9EQVJLKSByZXF1aXJlKFwiQGFkb2JlL3NwZWN0cnVtLWNzcy9kaXN0L2NvbXBvbmVudHMvY2lyY2xlbG9hZGVyL211bHRpU3RvcHMvZGFyay5jc3NcIik7XG5pZiAoIXByb2Nlc3MuZW52LlRIRU1FX0xJR0hUICYmICFwcm9jZXNzLmVudi5USEVNRV9EQVJLICYmICFwcm9jZXNzLmVudi5USEVNRV9MSUdIVEVTVCAmJiAhcHJvY2Vzcy5lbnYuVEhFTUVfREFSS0VTVCB8fCBwcm9jZXNzLmVudi5USEVNRV9MSUdIVEVTVCkgcmVxdWlyZShcIkBhZG9iZS9zcGVjdHJ1bS1jc3MvZGlzdC9jb21wb25lbnRzL2NpcmNsZWxvYWRlci9tdWx0aVN0b3BzL2xpZ2h0ZXN0LmNzc1wiKTtcbmlmICghcHJvY2Vzcy5lbnYuVEhFTUVfTElHSFQgJiYgIXByb2Nlc3MuZW52LlRIRU1FX0RBUksgJiYgIXByb2Nlc3MuZW52LlRIRU1FX0xJR0hURVNUICYmICFwcm9jZXNzLmVudi5USEVNRV9EQVJLRVNUIHx8IHByb2Nlc3MuZW52LlRIRU1FX0RBUktFU1QpIHJlcXVpcmUoXCJAYWRvYmUvc3BlY3RydW0tY3NzL2Rpc3QvY29tcG9uZW50cy9jaXJjbGVsb2FkZXIvbXVsdGlTdG9wcy9kYXJrZXN0LmNzc1wiKTtcbmNvbnN0IERFVEVSTUlOQVRFID0gJ2RldGVybWluYXRlJztcbmV4cG9ydHMuREVURVJNSU5BVEUgPSBERVRFUk1JTkFURTtcbmNvbnN0IElOREVURVJNSU5BVEUgPSAnaW5kZXRlcm1pbmF0ZSc7XG5leHBvcnRzLklOREVURVJNSU5BVEUgPSBJTkRFVEVSTUlOQVRFO1xuXG5jbGFzcyBXYWl0IGV4dGVuZHMgX3JlYWN0LmRlZmF1bHQuQ29tcG9uZW50IHtcbiAgcmVuZGVyKCkge1xuICAgIGxldCBfdGhpcyRwcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgIHtcbiAgICAgIHZhbHVlID0gMCxcbiAgICAgIHNpemUgPSAnTScsXG4gICAgICBpbmRldGVybWluYXRlID0gdHJ1ZSxcbiAgICAgIGNlbnRlcmVkID0gZmFsc2UsXG4gICAgICBjbGFzc05hbWUsXG4gICAgICB2YXJpYW50XG4gICAgfSA9IF90aGlzJHByb3BzLFxuICAgICAgICBvdGhlclByb3BzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKF90aGlzJHByb3BzLCBbXCJ2YWx1ZVwiLCBcInNpemVcIiwgXCJpbmRldGVybWluYXRlXCIsIFwiY2VudGVyZWRcIiwgXCJjbGFzc05hbWVcIiwgXCJ2YXJpYW50XCJdKTsgLy8gRGV0ZXJtaW5hdGUgdmVyc2lvbiBoYXMgdHdvIGhpZ2ggbGV2ZWwgbWFza3MsIDEpIHJpZ2h0IGhhbGYsIDIpIGxlZnQgaGFsZlxuICAgIC8vIHdpdGhpbiBlYWNoIG9mIHRob3NlIGlzIGEgc3VibWFzayB3aGljaCByb3RhdGVzIGludG8gdmlldyB3aXRoaW4gdGhhdCBtYXNrXG4gICAgLy8gYnV0IHN0YXJ0cyBvZmYgb24gdGhlIG9wcG9zaXRlIHNpZGUgc28gaXQncyBoaWRkZW5cbiAgICAvLyBmb3IgZmlyc3QgNTAlLCBzdWJtYXNrMSBtb3ZlcyBmcm9tIC0xODAgdG8gMCBhcyBpdCBjb3ZlcnMgdGhlIGZpcnN0IGhhbGZcbiAgICAvLyBmb3IgdGhlIHNlY29uZCA1MCUsIHN1Ym1hc2sxIHN0YXlzIGluIG9uZSBwbGFjZSBhbmQgc3VibWFzazIgcm90YXRlcyBpblxuICAgIC8vIGZyb20gLTE4MCB0byAwXG5cblxuICAgIGxldCBhbmdsZTtcbiAgICBsZXQgZmlsbFN1Ym1hc2sxU3R5bGUgPSB7fTtcbiAgICBsZXQgZmlsbFN1Ym1hc2syU3R5bGUgPSB7fTtcbiAgICBsZXQgYXJpYVZhbHVlID0gdW5kZWZpbmVkO1xuXG4gICAgaWYgKHZhcmlhbnQgPT09IERFVEVSTUlOQVRFIHx8IHZhcmlhbnQgPT09IElOREVURVJNSU5BVEUpIHtcbiAgICAgIGNvbnNvbGUud2FybihgVGhlIFwiJHt2YXJpYW50fVwiIHZhcmlhbnQgb2YgV2FpdCBpcyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIHRoZSBcImluZGV0ZXJtaW5hdGVcIiBwcm9wIGluc3RlYWQuYCk7XG4gICAgfVxuXG4gICAgaWYgKHZhcmlhbnQgPT09IERFVEVSTUlOQVRFIHx8ICFpbmRldGVybWluYXRlKSB7XG4gICAgICB2YWx1ZSA9IE1hdGgubWluKE1hdGgubWF4KCt2YWx1ZSwgMCksIDEwMCk7XG4gICAgICBhcmlhVmFsdWUgPSB2YWx1ZTtcblxuICAgICAgaWYgKHZhbHVlID4gMCAmJiB2YWx1ZSA8PSA1MCkge1xuICAgICAgICBhbmdsZSA9IC0xODAgKyB2YWx1ZSAvIDUwICogMTgwO1xuICAgICAgICBmaWxsU3VibWFzazFTdHlsZS50cmFuc2Zvcm0gPSAncm90YXRlKCcgKyBhbmdsZSArICdkZWcpJztcbiAgICAgICAgZmlsbFN1Ym1hc2syU3R5bGUudHJhbnNmb3JtID0gJ3JvdGF0ZSgtMTgwZGVnKSc7XG4gICAgICB9IGVsc2UgaWYgKHZhbHVlID4gNTApIHtcbiAgICAgICAgYW5nbGUgPSAtMTgwICsgKHZhbHVlIC0gNTApIC8gNTAgKiAxODA7XG4gICAgICAgIGZpbGxTdWJtYXNrMVN0eWxlLnRyYW5zZm9ybSA9ICdyb3RhdGUoMGRlZyknO1xuICAgICAgICBmaWxsU3VibWFzazJTdHlsZS50cmFuc2Zvcm0gPSAncm90YXRlKCcgKyBhbmdsZSArICdkZWcpJztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gLyojX19QVVJFX18qL19yZWFjdC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgX2V4dGVuZHMoe1xuICAgICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXMuZGVmYXVsdCkoJ3NwZWN0cnVtLUNpcmNsZUxvYWRlcicsIHtcbiAgICAgICAgJ3NwZWN0cnVtLUNpcmNsZUxvYWRlci0taW5kZXRlcm1pbmF0ZSc6IHZhcmlhbnQgPT09IElOREVURVJNSU5BVEUgfHwgaW5kZXRlcm1pbmF0ZSAmJiB2YXJpYW50ICE9PSBERVRFUk1JTkFURSxcbiAgICAgICAgJ3NwZWN0cnVtLUNpcmNsZUxvYWRlci0tc21hbGwnOiBzaXplID09PSAnUycsXG4gICAgICAgICdzcGVjdHJ1bS1DaXJjbGVMb2FkZXItLWxhcmdlJzogc2l6ZSA9PT0gJ0wnLFxuICAgICAgICAnc3BlY3RydW0tQ2lyY2xlTG9hZGVyLS1vdmVyQmFja2dyb3VuZCc6IHZhcmlhbnQgPT09ICdvdmVyQmFja2dyb3VuZCcsXG4gICAgICAgICdyZWFjdC1zcGVjdHJ1bS1XYWl0LS1jZW50ZXJlZCc6IGNlbnRlcmVkXG4gICAgICB9LCBjbGFzc05hbWUpLFxuICAgICAgcm9sZTogXCJwcm9ncmVzc2JhclwiLFxuICAgICAgXCJhcmlhLXZhbHVlbm93XCI6IGFyaWFWYWx1ZSxcbiAgICAgIFwiYXJpYS12YWx1ZW1pblwiOiAwLFxuICAgICAgXCJhcmlhLXZhbHVlbWF4XCI6IDEwMFxuICAgIH0sICgwLCBfZmlsdGVyRE9NUHJvcHMuZGVmYXVsdCkob3RoZXJQcm9wcykpLCAvKiNfX1BVUkVfXyovX3JlYWN0LmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICBjbGFzc05hbWU6IFwic3BlY3RydW0tQ2lyY2xlTG9hZGVyLXRyYWNrXCJcbiAgICB9KSwgLyojX19QVVJFX18qL19yZWFjdC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3NOYW1lOiBcInNwZWN0cnVtLUNpcmNsZUxvYWRlci1maWxsc1wiXG4gICAgfSwgLyojX19QVVJFX18qL19yZWFjdC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3NOYW1lOiBcInNwZWN0cnVtLUNpcmNsZUxvYWRlci1maWxsTWFzazFcIlxuICAgIH0sIC8qI19fUFVSRV9fKi9fcmVhY3QuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzTmFtZTogXCJzcGVjdHJ1bS1DaXJjbGVMb2FkZXItZmlsbFN1Yk1hc2sxXCIsXG4gICAgICBzdHlsZTogZmlsbFN1Ym1hc2sxU3R5bGVcbiAgICB9LCAvKiNfX1BVUkVfXyovX3JlYWN0LmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICBjbGFzc05hbWU6IFwic3BlY3RydW0tQ2lyY2xlTG9hZGVyLWZpbGxcIlxuICAgIH0pKSksIC8qI19fUFVSRV9fKi9fcmVhY3QuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzTmFtZTogXCJzcGVjdHJ1bS1DaXJjbGVMb2FkZXItZmlsbE1hc2syXCJcbiAgICB9LCAvKiNfX1BVUkVfXyovX3JlYWN0LmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICBjbGFzc05hbWU6IFwic3BlY3RydW0tQ2lyY2xlTG9hZGVyLWZpbGxTdWJNYXNrMlwiLFxuICAgICAgc3R5bGU6IGZpbGxTdWJtYXNrMlN0eWxlXG4gICAgfSwgLyojX19QVVJFX18qL19yZWFjdC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgY2xhc3NOYW1lOiBcInNwZWN0cnVtLUNpcmNsZUxvYWRlci1maWxsXCJcbiAgICB9KSkpKSk7XG4gIH1cblxufVxuXG5leHBvcnRzLmRlZmF1bHQgPSBXYWl0O1xuV2FpdC5wcm9wVHlwZXMgPSB7XG4gIC8qKiBXaGV0aGVyIHRvIGNlbnRlciB0aGUgV2FpdCBjb21wbmVudCBpbiB0aGUgcGFyZW50IGNvbnRhaW5lci4gKi9cbiAgY2VudGVyZWQ6IF9wcm9wVHlwZXMuZGVmYXVsdC5ib29sLFxuXG4gIC8qKiBDdXN0b20gQ1NTIGNsYXNzIHRvIGFkZCB0byB0aGUgV2FpdCBjb21wb25lbnQgKi9cbiAgY2xhc3NOYW1lOiBfcHJvcFR5cGVzLmRlZmF1bHQuc3RyaW5nLFxuXG4gIC8qKlxuICAgKiBCb29sZWFuIHRvIGRldGVybWluZSBpZiB0aGUgV2FpdCBjb21wb25lbnQgc2hvdWxkIGVuZGxlc3NseSBzcGluIChpbmRldGVybWluYXRlKSBvclxuICAgKiBpZiBpdCBzaG91bGQgYmUgY29udHJvbGxlZCBtYW51YWxseS5cbiAgICovXG4gIGluZGV0ZXJtaW5hdGU6IF9wcm9wVHlwZXMuZGVmYXVsdC5ib29sLFxuXG4gIC8qKiBTaXplIG9mIHRoZSBXYWl0IGNvbXBvbmVudCAqL1xuICBzaXplOiBfcHJvcFR5cGVzLmRlZmF1bHQuc3RyaW5nLFxuXG4gIC8qKiBBZGp1c3QgdGhlIGZpbGxlZCBwb3J0aW9uIG9mIHRoZSBXYWl0IGNvbXBvbmVudCB0byBhIGRldGVybWluZWQgdmFsdWUgKi9cbiAgdmFsdWU6IF9wcm9wVHlwZXMuZGVmYXVsdC5udW1iZXIsXG5cbiAgLyoqXG4gICogVGhlIHZhcmlhbnQgb2YgV2FpdCB0byBkaXNwbGF5LlxuICAqL1xuICB2YXJpYW50OiBfcHJvcFR5cGVzLmRlZmF1bHQub25lT2YoWydvdmVyQmFja2dyb3VuZCddKVxufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///63\n')},function(module,exports,__webpack_require__){eval("var api = __webpack_require__(5);\n            var content = __webpack_require__(148);\n\n            content = content.__esModule ? content.default : content;\n\n            if (typeof content === 'string') {\n              content = [[module.i, content, '']];\n            }\n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = api(content, options);\n\n\n\nmodule.exports = content.locals || {};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjQuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFkb2JlL3NwZWN0cnVtLWNzcy9kaXN0L2NvbXBvbmVudHMvY2lyY2xlbG9hZGVyL2luZGV4LmNzcz82M2U0Il0sInNvdXJjZXNDb250ZW50IjpbInZhciBhcGkgPSByZXF1aXJlKFwiIS4uLy4uLy4uLy4uLy4uL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzXCIpO1xuICAgICAgICAgICAgdmFyIGNvbnRlbnQgPSByZXF1aXJlKFwiISEuLi8uLi8uLi8uLi8uLi9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vaW5kZXguY3NzXCIpO1xuXG4gICAgICAgICAgICBjb250ZW50ID0gY29udGVudC5fX2VzTW9kdWxlID8gY29udGVudC5kZWZhdWx0IDogY29udGVudDtcblxuICAgICAgICAgICAgaWYgKHR5cGVvZiBjb250ZW50ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICBjb250ZW50ID0gW1ttb2R1bGUuaWQsIGNvbnRlbnQsICcnXV07XG4gICAgICAgICAgICB9XG5cbnZhciBvcHRpb25zID0ge307XG5cbm9wdGlvbnMuaW5zZXJ0ID0gXCJoZWFkXCI7XG5vcHRpb25zLnNpbmdsZXRvbiA9IGZhbHNlO1xuXG52YXIgdXBkYXRlID0gYXBpKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5cblxubW9kdWxlLmV4cG9ydHMgPSBjb250ZW50LmxvY2FscyB8fCB7fTsiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///64\n")},function(module,exports){eval("const numeric = /^[0-9]+$/\nconst compareIdentifiers = (a, b) => {\n  const anum = numeric.test(a)\n  const bnum = numeric.test(b)\n\n  if (anum && bnum) {\n    a = +a\n    b = +b\n  }\n\n  return a === b ? 0\n    : (anum && !bnum) ? -1\n    : (bnum && !anum) ? 1\n    : a < b ? -1\n    : 1\n}\n\nconst rcompareIdentifiers = (a, b) => compareIdentifiers(b, a)\n\nmodule.exports = {\n  compareIdentifiers,\n  rcompareIdentifiers,\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjUuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRvcnEtbmF0aXZlL3JlYWN0LXNwZWN0cnVtL25vZGVfbW9kdWxlcy9zZW12ZXIvaW50ZXJuYWwvaWRlbnRpZmllcnMuanM/OWE1YiJdLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBudW1lcmljID0gL15bMC05XSskL1xuY29uc3QgY29tcGFyZUlkZW50aWZpZXJzID0gKGEsIGIpID0+IHtcbiAgY29uc3QgYW51bSA9IG51bWVyaWMudGVzdChhKVxuICBjb25zdCBibnVtID0gbnVtZXJpYy50ZXN0KGIpXG5cbiAgaWYgKGFudW0gJiYgYm51bSkge1xuICAgIGEgPSArYVxuICAgIGIgPSArYlxuICB9XG5cbiAgcmV0dXJuIGEgPT09IGIgPyAwXG4gICAgOiAoYW51bSAmJiAhYm51bSkgPyAtMVxuICAgIDogKGJudW0gJiYgIWFudW0pID8gMVxuICAgIDogYSA8IGIgPyAtMVxuICAgIDogMVxufVxuXG5jb25zdCByY29tcGFyZUlkZW50aWZpZXJzID0gKGEsIGIpID0+IGNvbXBhcmVJZGVudGlmaWVycyhiLCBhKVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgY29tcGFyZUlkZW50aWZpZXJzLFxuICByY29tcGFyZUlkZW50aWZpZXJzLFxufVxuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///65\n")},function(module,exports,__webpack_require__){eval("const compare = __webpack_require__(11)\nconst eq = (a, b, loose) => compare(a, b, loose) === 0\nmodule.exports = eq\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjYuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRvcnEtbmF0aXZlL3JlYWN0LXNwZWN0cnVtL25vZGVfbW9kdWxlcy9zZW12ZXIvZnVuY3Rpb25zL2VxLmpzPzMwMjAiXSwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgY29tcGFyZSA9IHJlcXVpcmUoJy4vY29tcGFyZScpXG5jb25zdCBlcSA9IChhLCBiLCBsb29zZSkgPT4gY29tcGFyZShhLCBiLCBsb29zZSkgPT09IDBcbm1vZHVsZS5leHBvcnRzID0gZXFcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///66\n")},function(module,exports,__webpack_require__){eval("const compare = __webpack_require__(11)\nconst neq = (a, b, loose) => compare(a, b, loose) !== 0\nmodule.exports = neq\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjcuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRvcnEtbmF0aXZlL3JlYWN0LXNwZWN0cnVtL25vZGVfbW9kdWxlcy9zZW12ZXIvZnVuY3Rpb25zL25lcS5qcz8yZWVjIl0sInNvdXJjZXNDb250ZW50IjpbImNvbnN0IGNvbXBhcmUgPSByZXF1aXJlKCcuL2NvbXBhcmUnKVxuY29uc3QgbmVxID0gKGEsIGIsIGxvb3NlKSA9PiBjb21wYXJlKGEsIGIsIGxvb3NlKSAhPT0gMFxubW9kdWxlLmV4cG9ydHMgPSBuZXFcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///67\n")},function(module,exports,__webpack_require__){eval("const eq = __webpack_require__(66)\nconst neq = __webpack_require__(67)\nconst gt = __webpack_require__(37)\nconst gte = __webpack_require__(51)\nconst lt = __webpack_require__(50)\nconst lte = __webpack_require__(52)\n\nconst cmp = (a, op, b, loose) => {\n  switch (op) {\n    case '===':\n      if (typeof a === 'object') {\n        a = a.version\n      }\n      if (typeof b === 'object') {\n        b = b.version\n      }\n      return a === b\n\n    case '!==':\n      if (typeof a === 'object') {\n        a = a.version\n      }\n      if (typeof b === 'object') {\n        b = b.version\n      }\n      return a !== b\n\n    case '':\n    case '=':\n    case '==':\n      return eq(a, b, loose)\n\n    case '!=':\n      return neq(a, b, loose)\n\n    case '>':\n      return gt(a, b, loose)\n\n    case '>=':\n      return gte(a, b, loose)\n\n    case '<':\n      return lt(a, b, loose)\n\n    case '<=':\n      return lte(a, b, loose)\n\n    default:\n      throw new TypeError(`Invalid operator: ${op}`)\n  }\n}\nmodule.exports = cmp\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjguanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRvcnEtbmF0aXZlL3JlYWN0LXNwZWN0cnVtL25vZGVfbW9kdWxlcy9zZW12ZXIvZnVuY3Rpb25zL2NtcC5qcz9iNzA3Il0sInNvdXJjZXNDb250ZW50IjpbImNvbnN0IGVxID0gcmVxdWlyZSgnLi9lcScpXG5jb25zdCBuZXEgPSByZXF1aXJlKCcuL25lcScpXG5jb25zdCBndCA9IHJlcXVpcmUoJy4vZ3QnKVxuY29uc3QgZ3RlID0gcmVxdWlyZSgnLi9ndGUnKVxuY29uc3QgbHQgPSByZXF1aXJlKCcuL2x0JylcbmNvbnN0IGx0ZSA9IHJlcXVpcmUoJy4vbHRlJylcblxuY29uc3QgY21wID0gKGEsIG9wLCBiLCBsb29zZSkgPT4ge1xuICBzd2l0Y2ggKG9wKSB7XG4gICAgY2FzZSAnPT09JzpcbiAgICAgIGlmICh0eXBlb2YgYSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgYSA9IGEudmVyc2lvblxuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBiID09PSAnb2JqZWN0Jykge1xuICAgICAgICBiID0gYi52ZXJzaW9uXG4gICAgICB9XG4gICAgICByZXR1cm4gYSA9PT0gYlxuXG4gICAgY2FzZSAnIT09JzpcbiAgICAgIGlmICh0eXBlb2YgYSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgYSA9IGEudmVyc2lvblxuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBiID09PSAnb2JqZWN0Jykge1xuICAgICAgICBiID0gYi52ZXJzaW9uXG4gICAgICB9XG4gICAgICByZXR1cm4gYSAhPT0gYlxuXG4gICAgY2FzZSAnJzpcbiAgICBjYXNlICc9JzpcbiAgICBjYXNlICc9PSc6XG4gICAgICByZXR1cm4gZXEoYSwgYiwgbG9vc2UpXG5cbiAgICBjYXNlICchPSc6XG4gICAgICByZXR1cm4gbmVxKGEsIGIsIGxvb3NlKVxuXG4gICAgY2FzZSAnPic6XG4gICAgICByZXR1cm4gZ3QoYSwgYiwgbG9vc2UpXG5cbiAgICBjYXNlICc+PSc6XG4gICAgICByZXR1cm4gZ3RlKGEsIGIsIGxvb3NlKVxuXG4gICAgY2FzZSAnPCc6XG4gICAgICByZXR1cm4gbHQoYSwgYiwgbG9vc2UpXG5cbiAgICBjYXNlICc8PSc6XG4gICAgICByZXR1cm4gbHRlKGEsIGIsIGxvb3NlKVxuXG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEludmFsaWQgb3BlcmF0b3I6ICR7b3B9YClcbiAgfVxufVxubW9kdWxlLmV4cG9ydHMgPSBjbXBcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///68\n")},function(module,exports,__webpack_require__){"use strict";eval("/*\nCopyright (c) 2014, Yahoo! Inc. All rights reserved.\nCopyrights licensed under the New BSD License.\nSee the accompanying LICENSE file for terms.\n*/\n\n/* jslint esnext: true */\n\n\nexports.extend = extend;\nvar hop = Object.prototype.hasOwnProperty;\n\nfunction extend(obj) {\n    var sources = Array.prototype.slice.call(arguments, 1),\n        i, len, source, key;\n\n    for (i = 0, len = sources.length; i < len; i += 1) {\n        source = sources[i];\n        if (!source) { continue; }\n\n        for (key in source) {\n            if (hop.call(source, key)) {\n                obj[key] = source[key];\n            }\n        }\n    }\n\n    return obj;\n}\nexports.hop = hop;\n\n//# sourceMappingURL=utils.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjkuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvaW50bC1tZXNzYWdlZm9ybWF0L2xpYi91dGlscy5qcz8yNWI1Il0sInNvdXJjZXNDb250ZW50IjpbIi8qXG5Db3B5cmlnaHQgKGMpIDIwMTQsIFlhaG9vISBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5Db3B5cmlnaHRzIGxpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIExpY2Vuc2UuXG5TZWUgdGhlIGFjY29tcGFueWluZyBMSUNFTlNFIGZpbGUgZm9yIHRlcm1zLlxuKi9cblxuLyoganNsaW50IGVzbmV4dDogdHJ1ZSAqL1xuXG5cInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuZXh0ZW5kID0gZXh0ZW5kO1xudmFyIGhvcCA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG5cbmZ1bmN0aW9uIGV4dGVuZChvYmopIHtcbiAgICB2YXIgc291cmNlcyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSksXG4gICAgICAgIGksIGxlbiwgc291cmNlLCBrZXk7XG5cbiAgICBmb3IgKGkgPSAwLCBsZW4gPSBzb3VyY2VzLmxlbmd0aDsgaSA8IGxlbjsgaSArPSAxKSB7XG4gICAgICAgIHNvdXJjZSA9IHNvdXJjZXNbaV07XG4gICAgICAgIGlmICghc291cmNlKSB7IGNvbnRpbnVlOyB9XG5cbiAgICAgICAgZm9yIChrZXkgaW4gc291cmNlKSB7XG4gICAgICAgICAgICBpZiAoaG9wLmNhbGwoc291cmNlLCBrZXkpKSB7XG4gICAgICAgICAgICAgICAgb2JqW2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBvYmo7XG59XG5leHBvcnRzLmhvcCA9IGhvcDtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dXRpbHMuanMubWFwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///69\n")},function(module,exports,__webpack_require__){eval("var api = __webpack_require__(5);\n            var content = __webpack_require__(211);\n\n            content = content.__esModule ? content.default : content;\n\n            if (typeof content === 'string') {\n              content = [[module.i, content, '']];\n            }\n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = api(content, options);\n\n\n\nmodule.exports = content.locals || {};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzAuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGFkb2JlL3NwZWN0cnVtLWNzcy9kaXN0L2NvbXBvbmVudHMvcGFnZS9pbmRleC5jc3M/NDg2YSJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgYXBpID0gcmVxdWlyZShcIiEuLi8uLi8uLi8uLi8uLi9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luamVjdFN0eWxlc0ludG9TdHlsZVRhZy5qc1wiKTtcbiAgICAgICAgICAgIHZhciBjb250ZW50ID0gcmVxdWlyZShcIiEhLi4vLi4vLi4vLi4vLi4vY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL2luZGV4LmNzc1wiKTtcblxuICAgICAgICAgICAgY29udGVudCA9IGNvbnRlbnQuX19lc01vZHVsZSA/IGNvbnRlbnQuZGVmYXVsdCA6IGNvbnRlbnQ7XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgY29udGVudCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgY29udGVudCA9IFtbbW9kdWxlLmlkLCBjb250ZW50LCAnJ11dO1xuICAgICAgICAgICAgfVxuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLmluc2VydCA9IFwiaGVhZFwiO1xub3B0aW9ucy5zaW5nbGV0b24gPSBmYWxzZTtcblxudmFyIHVwZGF0ZSA9IGFwaShjb250ZW50LCBvcHRpb25zKTtcblxuXG5cbm1vZHVsZS5leHBvcnRzID0gY29udGVudC5sb2NhbHMgfHwge307Il0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///70\n")},function(module,exports,__webpack_require__){eval("var api = __webpack_require__(5);\n            var content = __webpack_require__(225);\n\n            content = content.__esModule ? content.default : content;\n\n            if (typeof content === 'string') {\n              content = [[module.i, content, '']];\n            }\n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = api(content, options);\n\n\n\nmodule.exports = content.locals || {};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzEuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRvcnEtbmF0aXZlL3JlYWN0LXNwZWN0cnVtL3NwZWN0cnVtLWNzcy1vdmVycmlkZXMvdHlwb2dyYXBoeS9pbmRleC1kaWZmLmNzcz81MzI3Il0sInNvdXJjZXNDb250ZW50IjpbInZhciBhcGkgPSByZXF1aXJlKFwiIS4uLy4uLy4uLy4uL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzXCIpO1xuICAgICAgICAgICAgdmFyIGNvbnRlbnQgPSByZXF1aXJlKFwiISEuLi8uLi8uLi8uLi9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vaW5kZXgtZGlmZi5jc3NcIik7XG5cbiAgICAgICAgICAgIGNvbnRlbnQgPSBjb250ZW50Ll9fZXNNb2R1bGUgPyBjb250ZW50LmRlZmF1bHQgOiBjb250ZW50O1xuXG4gICAgICAgICAgICBpZiAodHlwZW9mIGNvbnRlbnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgIGNvbnRlbnQgPSBbW21vZHVsZS5pZCwgY29udGVudCwgJyddXTtcbiAgICAgICAgICAgIH1cblxudmFyIG9wdGlvbnMgPSB7fTtcblxub3B0aW9ucy5pbnNlcnQgPSBcImhlYWRcIjtcbm9wdGlvbnMuc2luZ2xldG9uID0gZmFsc2U7XG5cbnZhciB1cGRhdGUgPSBhcGkoY29udGVudCwgb3B0aW9ucyk7XG5cblxuXG5tb2R1bGUuZXhwb3J0cyA9IGNvbnRlbnQubG9jYWxzIHx8IHt9OyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///71\n")},function(module,exports,__webpack_require__){eval("var api = __webpack_require__(5);\n            var content = __webpack_require__(226);\n\n            content = content.__esModule ? content.default : content;\n\n            if (typeof content === 'string') {\n              content = [[module.i, content, '']];\n            }\n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = api(content, options);\n\n\n\nmodule.exports = content.locals || {};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzIuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRvcnEtbmF0aXZlL3JlYWN0LXNwZWN0cnVtL3NwZWN0cnVtLWNzcy1vdmVycmlkZXMvdHlwb2dyYXBoeS9pbmRleC1sZy5jc3M/YWYyNCJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgYXBpID0gcmVxdWlyZShcIiEuLi8uLi8uLi8uLi9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luamVjdFN0eWxlc0ludG9TdHlsZVRhZy5qc1wiKTtcbiAgICAgICAgICAgIHZhciBjb250ZW50ID0gcmVxdWlyZShcIiEhLi4vLi4vLi4vLi4vY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL2luZGV4LWxnLmNzc1wiKTtcblxuICAgICAgICAgICAgY29udGVudCA9IGNvbnRlbnQuX19lc01vZHVsZSA/IGNvbnRlbnQuZGVmYXVsdCA6IGNvbnRlbnQ7XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgY29udGVudCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgY29udGVudCA9IFtbbW9kdWxlLmlkLCBjb250ZW50LCAnJ11dO1xuICAgICAgICAgICAgfVxuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLmluc2VydCA9IFwiaGVhZFwiO1xub3B0aW9ucy5zaW5nbGV0b24gPSBmYWxzZTtcblxudmFyIHVwZGF0ZSA9IGFwaShjb250ZW50LCBvcHRpb25zKTtcblxuXG5cbm1vZHVsZS5leHBvcnRzID0gY29udGVudC5sb2NhbHMgfHwge307Il0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///72\n")},function(module,exports,__webpack_require__){eval("var api = __webpack_require__(5);\n            var content = __webpack_require__(227);\n\n            content = content.__esModule ? content.default : content;\n\n            if (typeof content === 'string') {\n              content = [[module.i, content, '']];\n            }\n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = api(content, options);\n\n\n\nmodule.exports = content.locals || {};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRvcnEtbmF0aXZlL3JlYWN0LXNwZWN0cnVtL3NwZWN0cnVtLWNzcy1vdmVycmlkZXMvdHlwb2dyYXBoeS9tdWx0aVN0b3BzL2xpZ2h0LmNzcz85OWU3Il0sInNvdXJjZXNDb250ZW50IjpbInZhciBhcGkgPSByZXF1aXJlKFwiIS4uLy4uLy4uLy4uLy4uL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzXCIpO1xuICAgICAgICAgICAgdmFyIGNvbnRlbnQgPSByZXF1aXJlKFwiISEuLi8uLi8uLi8uLi8uLi9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vbGlnaHQuY3NzXCIpO1xuXG4gICAgICAgICAgICBjb250ZW50ID0gY29udGVudC5fX2VzTW9kdWxlID8gY29udGVudC5kZWZhdWx0IDogY29udGVudDtcblxuICAgICAgICAgICAgaWYgKHR5cGVvZiBjb250ZW50ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICBjb250ZW50ID0gW1ttb2R1bGUuaWQsIGNvbnRlbnQsICcnXV07XG4gICAgICAgICAgICB9XG5cbnZhciBvcHRpb25zID0ge307XG5cbm9wdGlvbnMuaW5zZXJ0ID0gXCJoZWFkXCI7XG5vcHRpb25zLnNpbmdsZXRvbiA9IGZhbHNlO1xuXG52YXIgdXBkYXRlID0gYXBpKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5cblxubW9kdWxlLmV4cG9ydHMgPSBjb250ZW50LmxvY2FscyB8fCB7fTsiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///73\n")},function(module,exports,__webpack_require__){eval("var api = __webpack_require__(5);\n            var content = __webpack_require__(228);\n\n            content = content.__esModule ? content.default : content;\n\n            if (typeof content === 'string') {\n              content = [[module.i, content, '']];\n            }\n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = api(content, options);\n\n\n\nmodule.exports = content.locals || {};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzQuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRvcnEtbmF0aXZlL3JlYWN0LXNwZWN0cnVtL3NwZWN0cnVtLWNzcy1vdmVycmlkZXMvdHlwb2dyYXBoeS9tdWx0aVN0b3BzL2RhcmsuY3NzPzExNzMiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGFwaSA9IHJlcXVpcmUoXCIhLi4vLi4vLi4vLi4vLi4vc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanNcIik7XG4gICAgICAgICAgICB2YXIgY29udGVudCA9IHJlcXVpcmUoXCIhIS4uLy4uLy4uLy4uLy4uL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9kYXJrLmNzc1wiKTtcblxuICAgICAgICAgICAgY29udGVudCA9IGNvbnRlbnQuX19lc01vZHVsZSA/IGNvbnRlbnQuZGVmYXVsdCA6IGNvbnRlbnQ7XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgY29udGVudCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgY29udGVudCA9IFtbbW9kdWxlLmlkLCBjb250ZW50LCAnJ11dO1xuICAgICAgICAgICAgfVxuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLmluc2VydCA9IFwiaGVhZFwiO1xub3B0aW9ucy5zaW5nbGV0b24gPSBmYWxzZTtcblxudmFyIHVwZGF0ZSA9IGFwaShjb250ZW50LCBvcHRpb25zKTtcblxuXG5cbm1vZHVsZS5leHBvcnRzID0gY29udGVudC5sb2NhbHMgfHwge307Il0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///74\n")},function(module,exports,__webpack_require__){eval("var api = __webpack_require__(5);\n            var content = __webpack_require__(229);\n\n            content = content.__esModule ? content.default : content;\n\n            if (typeof content === 'string') {\n              content = [[module.i, content, '']];\n            }\n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = api(content, options);\n\n\n\nmodule.exports = content.locals || {};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzUuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRvcnEtbmF0aXZlL3JlYWN0LXNwZWN0cnVtL3NwZWN0cnVtLWNzcy1vdmVycmlkZXMvdHlwb2dyYXBoeS9tdWx0aVN0b3BzL2xpZ2h0ZXN0LmNzcz80NzEwIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBhcGkgPSByZXF1aXJlKFwiIS4uLy4uLy4uLy4uLy4uL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzXCIpO1xuICAgICAgICAgICAgdmFyIGNvbnRlbnQgPSByZXF1aXJlKFwiISEuLi8uLi8uLi8uLi8uLi9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vbGlnaHRlc3QuY3NzXCIpO1xuXG4gICAgICAgICAgICBjb250ZW50ID0gY29udGVudC5fX2VzTW9kdWxlID8gY29udGVudC5kZWZhdWx0IDogY29udGVudDtcblxuICAgICAgICAgICAgaWYgKHR5cGVvZiBjb250ZW50ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICBjb250ZW50ID0gW1ttb2R1bGUuaWQsIGNvbnRlbnQsICcnXV07XG4gICAgICAgICAgICB9XG5cbnZhciBvcHRpb25zID0ge307XG5cbm9wdGlvbnMuaW5zZXJ0ID0gXCJoZWFkXCI7XG5vcHRpb25zLnNpbmdsZXRvbiA9IGZhbHNlO1xuXG52YXIgdXBkYXRlID0gYXBpKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5cblxubW9kdWxlLmV4cG9ydHMgPSBjb250ZW50LmxvY2FscyB8fCB7fTsiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///75\n")},function(module,exports,__webpack_require__){eval("var api = __webpack_require__(5);\n            var content = __webpack_require__(230);\n\n            content = content.__esModule ? content.default : content;\n\n            if (typeof content === 'string') {\n              content = [[module.i, content, '']];\n            }\n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = api(content, options);\n\n\n\nmodule.exports = content.locals || {};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzYuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQHRvcnEtbmF0aXZlL3JlYWN0LXNwZWN0cnVtL3NwZWN0cnVtLWNzcy1vdmVycmlkZXMvdHlwb2dyYXBoeS9tdWx0aVN0b3BzL2Rhcmtlc3QuY3NzPzk3MjciXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGFwaSA9IHJlcXVpcmUoXCIhLi4vLi4vLi4vLi4vLi4vc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanNcIik7XG4gICAgICAgICAgICB2YXIgY29udGVudCA9IHJlcXVpcmUoXCIhIS4uLy4uLy4uLy4uLy4uL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9kYXJrZXN0LmNzc1wiKTtcblxuICAgICAgICAgICAgY29udGVudCA9IGNvbnRlbnQuX19lc01vZHVsZSA/IGNvbnRlbnQuZGVmYXVsdCA6IGNvbnRlbnQ7XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgY29udGVudCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgY29udGVudCA9IFtbbW9kdWxlLmlkLCBjb250ZW50LCAnJ11dO1xuICAgICAgICAgICAgfVxuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLmluc2VydCA9IFwiaGVhZFwiO1xub3B0aW9ucy5zaW5nbGV0b24gPSBmYWxzZTtcblxudmFyIHVwZGF0ZSA9IGFwaShjb250ZW50LCBvcHRpb25zKTtcblxuXG5cbm1vZHVsZS5leHBvcnRzID0gY29udGVudC5sb2NhbHMgfHwge307Il0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///76\n")},function(module,exports,__webpack_require__){eval('/* WEBPACK VAR INJECTION */(function(global) {var scope = (typeof global !== "undefined" && global) ||\n            (typeof self !== "undefined" && self) ||\n            window;\nvar apply = Function.prototype.apply;\n\n// DOM APIs, for completeness\n\nexports.setTimeout = function() {\n  return new Timeout(apply.call(setTimeout, scope, arguments), clearTimeout);\n};\nexports.setInterval = function() {\n  return new Timeout(apply.call(setInterval, scope, arguments), clearInterval);\n};\nexports.clearTimeout =\nexports.clearInterval = function(timeout) {\n  if (timeout) {\n    timeout.close();\n  }\n};\n\nfunction Timeout(id, clearFn) {\n  this._id = id;\n  this._clearFn = clearFn;\n}\nTimeout.prototype.unref = Timeout.prototype.ref = function() {};\nTimeout.prototype.close = function() {\n  this._clearFn.call(scope, this._id);\n};\n\n// Does not start the time, just sets up the members needed.\nexports.enroll = function(item, msecs) {\n  clearTimeout(item._idleTimeoutId);\n  item._idleTimeout = msecs;\n};\n\nexports.unenroll = function(item) {\n  clearTimeout(item._idleTimeoutId);\n  item._idleTimeout = -1;\n};\n\nexports._unrefActive = exports.active = function(item) {\n  clearTimeout(item._idleTimeoutId);\n\n  var msecs = item._idleTimeout;\n  if (msecs >= 0) {\n    item._idleTimeoutId = setTimeout(function onTimeout() {\n      if (item._onTimeout)\n        item._onTimeout();\n    }, msecs);\n  }\n};\n\n// setimmediate attaches itself to the global object\n__webpack_require__(233);\n// On some exotic environments, it\'s not clear which object `setimmediate` was\n// able to install onto.  Search each possibility in the same order as the\n// `setimmediate` library.\nexports.setImmediate = (typeof self !== "undefined" && self.setImmediate) ||\n                       (typeof global !== "undefined" && global.setImmediate) ||\n                       (this && this.setImmediate);\nexports.clearImmediate = (typeof self !== "undefined" && self.clearImmediate) ||\n                         (typeof global !== "undefined" && global.clearImmediate) ||\n                         (this && this.clearImmediate);\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(21)))//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzcuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdGltZXJzLWJyb3dzZXJpZnkvbWFpbi5qcz81MTE4Il0sInNvdXJjZXNDb250ZW50IjpbInZhciBzY29wZSA9ICh0eXBlb2YgZ2xvYmFsICE9PSBcInVuZGVmaW5lZFwiICYmIGdsb2JhbCkgfHxcbiAgICAgICAgICAgICh0eXBlb2Ygc2VsZiAhPT0gXCJ1bmRlZmluZWRcIiAmJiBzZWxmKSB8fFxuICAgICAgICAgICAgd2luZG93O1xudmFyIGFwcGx5ID0gRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5O1xuXG4vLyBET00gQVBJcywgZm9yIGNvbXBsZXRlbmVzc1xuXG5leHBvcnRzLnNldFRpbWVvdXQgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBUaW1lb3V0KGFwcGx5LmNhbGwoc2V0VGltZW91dCwgc2NvcGUsIGFyZ3VtZW50cyksIGNsZWFyVGltZW91dCk7XG59O1xuZXhwb3J0cy5zZXRJbnRlcnZhbCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFRpbWVvdXQoYXBwbHkuY2FsbChzZXRJbnRlcnZhbCwgc2NvcGUsIGFyZ3VtZW50cyksIGNsZWFySW50ZXJ2YWwpO1xufTtcbmV4cG9ydHMuY2xlYXJUaW1lb3V0ID1cbmV4cG9ydHMuY2xlYXJJbnRlcnZhbCA9IGZ1bmN0aW9uKHRpbWVvdXQpIHtcbiAgaWYgKHRpbWVvdXQpIHtcbiAgICB0aW1lb3V0LmNsb3NlKCk7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIFRpbWVvdXQoaWQsIGNsZWFyRm4pIHtcbiAgdGhpcy5faWQgPSBpZDtcbiAgdGhpcy5fY2xlYXJGbiA9IGNsZWFyRm47XG59XG5UaW1lb3V0LnByb3RvdHlwZS51bnJlZiA9IFRpbWVvdXQucHJvdG90eXBlLnJlZiA9IGZ1bmN0aW9uKCkge307XG5UaW1lb3V0LnByb3RvdHlwZS5jbG9zZSA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLl9jbGVhckZuLmNhbGwoc2NvcGUsIHRoaXMuX2lkKTtcbn07XG5cbi8vIERvZXMgbm90IHN0YXJ0IHRoZSB0aW1lLCBqdXN0IHNldHMgdXAgdGhlIG1lbWJlcnMgbmVlZGVkLlxuZXhwb3J0cy5lbnJvbGwgPSBmdW5jdGlvbihpdGVtLCBtc2Vjcykge1xuICBjbGVhclRpbWVvdXQoaXRlbS5faWRsZVRpbWVvdXRJZCk7XG4gIGl0ZW0uX2lkbGVUaW1lb3V0ID0gbXNlY3M7XG59O1xuXG5leHBvcnRzLnVuZW5yb2xsID0gZnVuY3Rpb24oaXRlbSkge1xuICBjbGVhclRpbWVvdXQoaXRlbS5faWRsZVRpbWVvdXRJZCk7XG4gIGl0ZW0uX2lkbGVUaW1lb3V0ID0gLTE7XG59O1xuXG5leHBvcnRzLl91bnJlZkFjdGl2ZSA9IGV4cG9ydHMuYWN0aXZlID0gZnVuY3Rpb24oaXRlbSkge1xuICBjbGVhclRpbWVvdXQoaXRlbS5faWRsZVRpbWVvdXRJZCk7XG5cbiAgdmFyIG1zZWNzID0gaXRlbS5faWRsZVRpbWVvdXQ7XG4gIGlmIChtc2VjcyA+PSAwKSB7XG4gICAgaXRlbS5faWRsZVRpbWVvdXRJZCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gb25UaW1lb3V0KCkge1xuICAgICAgaWYgKGl0ZW0uX29uVGltZW91dClcbiAgICAgICAgaXRlbS5fb25UaW1lb3V0KCk7XG4gICAgfSwgbXNlY3MpO1xuICB9XG59O1xuXG4vLyBzZXRpbW1lZGlhdGUgYXR0YWNoZXMgaXRzZWxmIHRvIHRoZSBnbG9iYWwgb2JqZWN0XG5yZXF1aXJlKFwic2V0aW1tZWRpYXRlXCIpO1xuLy8gT24gc29tZSBleG90aWMgZW52aXJvbm1lbnRzLCBpdCdzIG5vdCBjbGVhciB3aGljaCBvYmplY3QgYHNldGltbWVkaWF0ZWAgd2FzXG4vLyBhYmxlIHRvIGluc3RhbGwgb250by4gIFNlYXJjaCBlYWNoIHBvc3NpYmlsaXR5IGluIHRoZSBzYW1lIG9yZGVyIGFzIHRoZVxuLy8gYHNldGltbWVkaWF0ZWAgbGlicmFyeS5cbmV4cG9ydHMuc2V0SW1tZWRpYXRlID0gKHR5cGVvZiBzZWxmICE9PSBcInVuZGVmaW5lZFwiICYmIHNlbGYuc2V0SW1tZWRpYXRlKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAodHlwZW9mIGdsb2JhbCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBnbG9iYWwuc2V0SW1tZWRpYXRlKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAodGhpcyAmJiB0aGlzLnNldEltbWVkaWF0ZSk7XG5leHBvcnRzLmNsZWFySW1tZWRpYXRlID0gKHR5cGVvZiBzZWxmICE9PSBcInVuZGVmaW5lZFwiICYmIHNlbGYuY2xlYXJJbW1lZGlhdGUpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgKHR5cGVvZiBnbG9iYWwgIT09IFwidW5kZWZpbmVkXCIgJiYgZ2xvYmFsLmNsZWFySW1tZWRpYXRlKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzICYmIHRoaXMuY2xlYXJJbW1lZGlhdGUpO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///77\n')},function(module,exports,__webpack_require__){eval("/**\n * Supported cipher modes.\n *\n * @author Dave Longley\n *\n * Copyright (c) 2010-2014 Digital Bazaar, Inc.\n */\nvar forge = __webpack_require__(4);\n__webpack_require__(7);\n\nforge.cipher = forge.cipher || {};\n\n// supported cipher modes\nvar modes = module.exports = forge.cipher.modes = forge.cipher.modes || {};\n\n/** Electronic codebook (ECB) (Don't use this; it's not secure) **/\n\nmodes.ecb = function(options) {\n  options = options || {};\n  this.name = 'ECB';\n  this.cipher = options.cipher;\n  this.blockSize = options.blockSize || 16;\n  this._ints = this.blockSize / 4;\n  this._inBlock = new Array(this._ints);\n  this._outBlock = new Array(this._ints);\n};\n\nmodes.ecb.prototype.start = function(options) {};\n\nmodes.ecb.prototype.encrypt = function(input, output, finish) {\n  // not enough input to encrypt\n  if(input.length() < this.blockSize && !(finish && input.length() > 0)) {\n    return true;\n  }\n\n  // get next block\n  for(var i = 0; i < this._ints; ++i) {\n    this._inBlock[i] = input.getInt32();\n  }\n\n  // encrypt block\n  this.cipher.encrypt(this._inBlock, this._outBlock);\n\n  // write output\n  for(var i = 0; i < this._ints; ++i) {\n    output.putInt32(this._outBlock[i]);\n  }\n};\n\nmodes.ecb.prototype.decrypt = function(input, output, finish) {\n  // not enough input to decrypt\n  if(input.length() < this.blockSize && !(finish && input.length() > 0)) {\n    return true;\n  }\n\n  // get next block\n  for(var i = 0; i < this._ints; ++i) {\n    this._inBlock[i] = input.getInt32();\n  }\n\n  // decrypt block\n  this.cipher.decrypt(this._inBlock, this._outBlock);\n\n  // write output\n  for(var i = 0; i < this._ints; ++i) {\n    output.putInt32(this._outBlock[i]);\n  }\n};\n\nmodes.ecb.prototype.pad = function(input, options) {\n  // add PKCS#7 padding to block (each pad byte is the\n  // value of the number of pad bytes)\n  var padding = (input.length() === this.blockSize ?\n    this.blockSize : (this.blockSize - input.length()));\n  input.fillWithByte(padding, padding);\n  return true;\n};\n\nmodes.ecb.prototype.unpad = function(output, options) {\n  // check for error: input data not a multiple of blockSize\n  if(options.overflow > 0) {\n    return false;\n  }\n\n  // ensure padding byte count is valid\n  var len = output.length();\n  var count = output.at(len - 1);\n  if(count > (this.blockSize << 2)) {\n    return false;\n  }\n\n  // trim off padding bytes\n  output.truncate(count);\n  return true;\n};\n\n/** Cipher-block Chaining (CBC) **/\n\nmodes.cbc = function(options) {\n  options = options || {};\n  this.name = 'CBC';\n  this.cipher = options.cipher;\n  this.blockSize = options.blockSize || 16;\n  this._ints = this.blockSize / 4;\n  this._inBlock = new Array(this._ints);\n  this._outBlock = new Array(this._ints);\n};\n\nmodes.cbc.prototype.start = function(options) {\n  // Note: legacy support for using IV residue (has security flaws)\n  // if IV is null, reuse block from previous processing\n  if(options.iv === null) {\n    // must have a previous block\n    if(!this._prev) {\n      throw new Error('Invalid IV parameter.');\n    }\n    this._iv = this._prev.slice(0);\n  } else if(!('iv' in options)) {\n    throw new Error('Invalid IV parameter.');\n  } else {\n    // save IV as \"previous\" block\n    this._iv = transformIV(options.iv, this.blockSize);\n    this._prev = this._iv.slice(0);\n  }\n};\n\nmodes.cbc.prototype.encrypt = function(input, output, finish) {\n  // not enough input to encrypt\n  if(input.length() < this.blockSize && !(finish && input.length() > 0)) {\n    return true;\n  }\n\n  // get next block\n  // CBC XOR's IV (or previous block) with plaintext\n  for(var i = 0; i < this._ints; ++i) {\n    this._inBlock[i] = this._prev[i] ^ input.getInt32();\n  }\n\n  // encrypt block\n  this.cipher.encrypt(this._inBlock, this._outBlock);\n\n  // write output, save previous block\n  for(var i = 0; i < this._ints; ++i) {\n    output.putInt32(this._outBlock[i]);\n  }\n  this._prev = this._outBlock;\n};\n\nmodes.cbc.prototype.decrypt = function(input, output, finish) {\n  // not enough input to decrypt\n  if(input.length() < this.blockSize && !(finish && input.length() > 0)) {\n    return true;\n  }\n\n  // get next block\n  for(var i = 0; i < this._ints; ++i) {\n    this._inBlock[i] = input.getInt32();\n  }\n\n  // decrypt block\n  this.cipher.decrypt(this._inBlock, this._outBlock);\n\n  // write output, save previous ciphered block\n  // CBC XOR's IV (or previous block) with ciphertext\n  for(var i = 0; i < this._ints; ++i) {\n    output.putInt32(this._prev[i] ^ this._outBlock[i]);\n  }\n  this._prev = this._inBlock.slice(0);\n};\n\nmodes.cbc.prototype.pad = function(input, options) {\n  // add PKCS#7 padding to block (each pad byte is the\n  // value of the number of pad bytes)\n  var padding = (input.length() === this.blockSize ?\n    this.blockSize : (this.blockSize - input.length()));\n  input.fillWithByte(padding, padding);\n  return true;\n};\n\nmodes.cbc.prototype.unpad = function(output, options) {\n  // check for error: input data not a multiple of blockSize\n  if(options.overflow > 0) {\n    return false;\n  }\n\n  // ensure padding byte count is valid\n  var len = output.length();\n  var count = output.at(len - 1);\n  if(count > (this.blockSize << 2)) {\n    return false;\n  }\n\n  // trim off padding bytes\n  output.truncate(count);\n  return true;\n};\n\n/** Cipher feedback (CFB) **/\n\nmodes.cfb = function(options) {\n  options = options || {};\n  this.name = 'CFB';\n  this.cipher = options.cipher;\n  this.blockSize = options.blockSize || 16;\n  this._ints = this.blockSize / 4;\n  this._inBlock = null;\n  this._outBlock = new Array(this._ints);\n  this._partialBlock = new Array(this._ints);\n  this._partialOutput = forge.util.createBuffer();\n  this._partialBytes = 0;\n};\n\nmodes.cfb.prototype.start = function(options) {\n  if(!('iv' in options)) {\n    throw new Error('Invalid IV parameter.');\n  }\n  // use IV as first input\n  this._iv = transformIV(options.iv, this.blockSize);\n  this._inBlock = this._iv.slice(0);\n  this._partialBytes = 0;\n};\n\nmodes.cfb.prototype.encrypt = function(input, output, finish) {\n  // not enough input to encrypt\n  var inputLength = input.length();\n  if(inputLength === 0) {\n    return true;\n  }\n\n  // encrypt block\n  this.cipher.encrypt(this._inBlock, this._outBlock);\n\n  // handle full block\n  if(this._partialBytes === 0 && inputLength >= this.blockSize) {\n    // XOR input with output, write input as output\n    for(var i = 0; i < this._ints; ++i) {\n      this._inBlock[i] = input.getInt32() ^ this._outBlock[i];\n      output.putInt32(this._inBlock[i]);\n    }\n    return;\n  }\n\n  // handle partial block\n  var partialBytes = (this.blockSize - inputLength) % this.blockSize;\n  if(partialBytes > 0) {\n    partialBytes = this.blockSize - partialBytes;\n  }\n\n  // XOR input with output, write input as partial output\n  this._partialOutput.clear();\n  for(var i = 0; i < this._ints; ++i) {\n    this._partialBlock[i] = input.getInt32() ^ this._outBlock[i];\n    this._partialOutput.putInt32(this._partialBlock[i]);\n  }\n\n  if(partialBytes > 0) {\n    // block still incomplete, restore input buffer\n    input.read -= this.blockSize;\n  } else {\n    // block complete, update input block\n    for(var i = 0; i < this._ints; ++i) {\n      this._inBlock[i] = this._partialBlock[i];\n    }\n  }\n\n  // skip any previous partial bytes\n  if(this._partialBytes > 0) {\n    this._partialOutput.getBytes(this._partialBytes);\n  }\n\n  if(partialBytes > 0 && !finish) {\n    output.putBytes(this._partialOutput.getBytes(\n      partialBytes - this._partialBytes));\n    this._partialBytes = partialBytes;\n    return true;\n  }\n\n  output.putBytes(this._partialOutput.getBytes(\n    inputLength - this._partialBytes));\n  this._partialBytes = 0;\n};\n\nmodes.cfb.prototype.decrypt = function(input, output, finish) {\n  // not enough input to decrypt\n  var inputLength = input.length();\n  if(inputLength === 0) {\n    return true;\n  }\n\n  // encrypt block (CFB always uses encryption mode)\n  this.cipher.encrypt(this._inBlock, this._outBlock);\n\n  // handle full block\n  if(this._partialBytes === 0 && inputLength >= this.blockSize) {\n    // XOR input with output, write input as output\n    for(var i = 0; i < this._ints; ++i) {\n      this._inBlock[i] = input.getInt32();\n      output.putInt32(this._inBlock[i] ^ this._outBlock[i]);\n    }\n    return;\n  }\n\n  // handle partial block\n  var partialBytes = (this.blockSize - inputLength) % this.blockSize;\n  if(partialBytes > 0) {\n    partialBytes = this.blockSize - partialBytes;\n  }\n\n  // XOR input with output, write input as partial output\n  this._partialOutput.clear();\n  for(var i = 0; i < this._ints; ++i) {\n    this._partialBlock[i] = input.getInt32();\n    this._partialOutput.putInt32(this._partialBlock[i] ^ this._outBlock[i]);\n  }\n\n  if(partialBytes > 0) {\n    // block still incomplete, restore input buffer\n    input.read -= this.blockSize;\n  } else {\n    // block complete, update input block\n    for(var i = 0; i < this._ints; ++i) {\n      this._inBlock[i] = this._partialBlock[i];\n    }\n  }\n\n  // skip any previous partial bytes\n  if(this._partialBytes > 0) {\n    this._partialOutput.getBytes(this._partialBytes);\n  }\n\n  if(partialBytes > 0 && !finish) {\n    output.putBytes(this._partialOutput.getBytes(\n      partialBytes - this._partialBytes));\n    this._partialBytes = partialBytes;\n    return true;\n  }\n\n  output.putBytes(this._partialOutput.getBytes(\n    inputLength - this._partialBytes));\n  this._partialBytes = 0;\n};\n\n/** Output feedback (OFB) **/\n\nmodes.ofb = function(options) {\n  options = options || {};\n  this.name = 'OFB';\n  this.cipher = options.cipher;\n  this.blockSize = options.blockSize || 16;\n  this._ints = this.blockSize / 4;\n  this._inBlock = null;\n  this._outBlock = new Array(this._ints);\n  this._partialOutput = forge.util.createBuffer();\n  this._partialBytes = 0;\n};\n\nmodes.ofb.prototype.start = function(options) {\n  if(!('iv' in options)) {\n    throw new Error('Invalid IV parameter.');\n  }\n  // use IV as first input\n  this._iv = transformIV(options.iv, this.blockSize);\n  this._inBlock = this._iv.slice(0);\n  this._partialBytes = 0;\n};\n\nmodes.ofb.prototype.encrypt = function(input, output, finish) {\n  // not enough input to encrypt\n  var inputLength = input.length();\n  if(input.length() === 0) {\n    return true;\n  }\n\n  // encrypt block (OFB always uses encryption mode)\n  this.cipher.encrypt(this._inBlock, this._outBlock);\n\n  // handle full block\n  if(this._partialBytes === 0 && inputLength >= this.blockSize) {\n    // XOR input with output and update next input\n    for(var i = 0; i < this._ints; ++i) {\n      output.putInt32(input.getInt32() ^ this._outBlock[i]);\n      this._inBlock[i] = this._outBlock[i];\n    }\n    return;\n  }\n\n  // handle partial block\n  var partialBytes = (this.blockSize - inputLength) % this.blockSize;\n  if(partialBytes > 0) {\n    partialBytes = this.blockSize - partialBytes;\n  }\n\n  // XOR input with output\n  this._partialOutput.clear();\n  for(var i = 0; i < this._ints; ++i) {\n    this._partialOutput.putInt32(input.getInt32() ^ this._outBlock[i]);\n  }\n\n  if(partialBytes > 0) {\n    // block still incomplete, restore input buffer\n    input.read -= this.blockSize;\n  } else {\n    // block complete, update input block\n    for(var i = 0; i < this._ints; ++i) {\n      this._inBlock[i] = this._outBlock[i];\n    }\n  }\n\n  // skip any previous partial bytes\n  if(this._partialBytes > 0) {\n    this._partialOutput.getBytes(this._partialBytes);\n  }\n\n  if(partialBytes > 0 && !finish) {\n    output.putBytes(this._partialOutput.getBytes(\n      partialBytes - this._partialBytes));\n    this._partialBytes = partialBytes;\n    return true;\n  }\n\n  output.putBytes(this._partialOutput.getBytes(\n    inputLength - this._partialBytes));\n  this._partialBytes = 0;\n};\n\nmodes.ofb.prototype.decrypt = modes.ofb.prototype.encrypt;\n\n/** Counter (CTR) **/\n\nmodes.ctr = function(options) {\n  options = options || {};\n  this.name = 'CTR';\n  this.cipher = options.cipher;\n  this.blockSize = options.blockSize || 16;\n  this._ints = this.blockSize / 4;\n  this._inBlock = null;\n  this._outBlock = new Array(this._ints);\n  this._partialOutput = forge.util.createBuffer();\n  this._partialBytes = 0;\n};\n\nmodes.ctr.prototype.start = function(options) {\n  if(!('iv' in options)) {\n    throw new Error('Invalid IV parameter.');\n  }\n  // use IV as first input\n  this._iv = transformIV(options.iv, this.blockSize);\n  this._inBlock = this._iv.slice(0);\n  this._partialBytes = 0;\n};\n\nmodes.ctr.prototype.encrypt = function(input, output, finish) {\n  // not enough input to encrypt\n  var inputLength = input.length();\n  if(inputLength === 0) {\n    return true;\n  }\n\n  // encrypt block (CTR always uses encryption mode)\n  this.cipher.encrypt(this._inBlock, this._outBlock);\n\n  // handle full block\n  if(this._partialBytes === 0 && inputLength >= this.blockSize) {\n    // XOR input with output\n    for(var i = 0; i < this._ints; ++i) {\n      output.putInt32(input.getInt32() ^ this._outBlock[i]);\n    }\n  } else {\n    // handle partial block\n    var partialBytes = (this.blockSize - inputLength) % this.blockSize;\n    if(partialBytes > 0) {\n      partialBytes = this.blockSize - partialBytes;\n    }\n\n    // XOR input with output\n    this._partialOutput.clear();\n    for(var i = 0; i < this._ints; ++i) {\n      this._partialOutput.putInt32(input.getInt32() ^ this._outBlock[i]);\n    }\n\n    if(partialBytes > 0) {\n      // block still incomplete, restore input buffer\n      input.read -= this.blockSize;\n    }\n\n    // skip any previous partial bytes\n    if(this._partialBytes > 0) {\n      this._partialOutput.getBytes(this._partialBytes);\n    }\n\n    if(partialBytes > 0 && !finish) {\n      output.putBytes(this._partialOutput.getBytes(\n        partialBytes - this._partialBytes));\n      this._partialBytes = partialBytes;\n      return true;\n    }\n\n    output.putBytes(this._partialOutput.getBytes(\n      inputLength - this._partialBytes));\n    this._partialBytes = 0;\n  }\n\n  // block complete, increment counter (input block)\n  inc32(this._inBlock);\n};\n\nmodes.ctr.prototype.decrypt = modes.ctr.prototype.encrypt;\n\n/** Galois/Counter Mode (GCM) **/\n\nmodes.gcm = function(options) {\n  options = options || {};\n  this.name = 'GCM';\n  this.cipher = options.cipher;\n  this.blockSize = options.blockSize || 16;\n  this._ints = this.blockSize / 4;\n  this._inBlock = new Array(this._ints);\n  this._outBlock = new Array(this._ints);\n  this._partialOutput = forge.util.createBuffer();\n  this._partialBytes = 0;\n\n  // R is actually this value concatenated with 120 more zero bits, but\n  // we only XOR against R so the other zeros have no effect -- we just\n  // apply this value to the first integer in a block\n  this._R = 0xE1000000;\n};\n\nmodes.gcm.prototype.start = function(options) {\n  if(!('iv' in options)) {\n    throw new Error('Invalid IV parameter.');\n  }\n  // ensure IV is a byte buffer\n  var iv = forge.util.createBuffer(options.iv);\n\n  // no ciphered data processed yet\n  this._cipherLength = 0;\n\n  // default additional data is none\n  var additionalData;\n  if('additionalData' in options) {\n    additionalData = forge.util.createBuffer(options.additionalData);\n  } else {\n    additionalData = forge.util.createBuffer();\n  }\n\n  // default tag length is 128 bits\n  if('tagLength' in options) {\n    this._tagLength = options.tagLength;\n  } else {\n    this._tagLength = 128;\n  }\n\n  // if tag is given, ensure tag matches tag length\n  this._tag = null;\n  if(options.decrypt) {\n    // save tag to check later\n    this._tag = forge.util.createBuffer(options.tag).getBytes();\n    if(this._tag.length !== (this._tagLength / 8)) {\n      throw new Error('Authentication tag does not match tag length.');\n    }\n  }\n\n  // create tmp storage for hash calculation\n  this._hashBlock = new Array(this._ints);\n\n  // no tag generated yet\n  this.tag = null;\n\n  // generate hash subkey\n  // (apply block cipher to \"zero\" block)\n  this._hashSubkey = new Array(this._ints);\n  this.cipher.encrypt([0, 0, 0, 0], this._hashSubkey);\n\n  // generate table M\n  // use 4-bit tables (32 component decomposition of a 16 byte value)\n  // 8-bit tables take more space and are known to have security\n  // vulnerabilities (in native implementations)\n  this.componentBits = 4;\n  this._m = this.generateHashTable(this._hashSubkey, this.componentBits);\n\n  // Note: support IV length different from 96 bits? (only supporting\n  // 96 bits is recommended by NIST SP-800-38D)\n  // generate J_0\n  var ivLength = iv.length();\n  if(ivLength === 12) {\n    // 96-bit IV\n    this._j0 = [iv.getInt32(), iv.getInt32(), iv.getInt32(), 1];\n  } else {\n    // IV is NOT 96-bits\n    this._j0 = [0, 0, 0, 0];\n    while(iv.length() > 0) {\n      this._j0 = this.ghash(\n        this._hashSubkey, this._j0,\n        [iv.getInt32(), iv.getInt32(), iv.getInt32(), iv.getInt32()]);\n    }\n    this._j0 = this.ghash(\n      this._hashSubkey, this._j0, [0, 0].concat(from64To32(ivLength * 8)));\n  }\n\n  // generate ICB (initial counter block)\n  this._inBlock = this._j0.slice(0);\n  inc32(this._inBlock);\n  this._partialBytes = 0;\n\n  // consume authentication data\n  additionalData = forge.util.createBuffer(additionalData);\n  // save additional data length as a BE 64-bit number\n  this._aDataLength = from64To32(additionalData.length() * 8);\n  // pad additional data to 128 bit (16 byte) block size\n  var overflow = additionalData.length() % this.blockSize;\n  if(overflow) {\n    additionalData.fillWithByte(0, this.blockSize - overflow);\n  }\n  this._s = [0, 0, 0, 0];\n  while(additionalData.length() > 0) {\n    this._s = this.ghash(this._hashSubkey, this._s, [\n      additionalData.getInt32(),\n      additionalData.getInt32(),\n      additionalData.getInt32(),\n      additionalData.getInt32()\n    ]);\n  }\n};\n\nmodes.gcm.prototype.encrypt = function(input, output, finish) {\n  // not enough input to encrypt\n  var inputLength = input.length();\n  if(inputLength === 0) {\n    return true;\n  }\n\n  // encrypt block\n  this.cipher.encrypt(this._inBlock, this._outBlock);\n\n  // handle full block\n  if(this._partialBytes === 0 && inputLength >= this.blockSize) {\n    // XOR input with output\n    for(var i = 0; i < this._ints; ++i) {\n      output.putInt32(this._outBlock[i] ^= input.getInt32());\n    }\n    this._cipherLength += this.blockSize;\n  } else {\n    // handle partial block\n    var partialBytes = (this.blockSize - inputLength) % this.blockSize;\n    if(partialBytes > 0) {\n      partialBytes = this.blockSize - partialBytes;\n    }\n\n    // XOR input with output\n    this._partialOutput.clear();\n    for(var i = 0; i < this._ints; ++i) {\n      this._partialOutput.putInt32(input.getInt32() ^ this._outBlock[i]);\n    }\n\n    if(partialBytes <= 0 || finish) {\n      // handle overflow prior to hashing\n      if(finish) {\n        // get block overflow\n        var overflow = inputLength % this.blockSize;\n        this._cipherLength += overflow;\n        // truncate for hash function\n        this._partialOutput.truncate(this.blockSize - overflow);\n      } else {\n        this._cipherLength += this.blockSize;\n      }\n\n      // get output block for hashing\n      for(var i = 0; i < this._ints; ++i) {\n        this._outBlock[i] = this._partialOutput.getInt32();\n      }\n      this._partialOutput.read -= this.blockSize;\n    }\n\n    // skip any previous partial bytes\n    if(this._partialBytes > 0) {\n      this._partialOutput.getBytes(this._partialBytes);\n    }\n\n    if(partialBytes > 0 && !finish) {\n      // block still incomplete, restore input buffer, get partial output,\n      // and return early\n      input.read -= this.blockSize;\n      output.putBytes(this._partialOutput.getBytes(\n        partialBytes - this._partialBytes));\n      this._partialBytes = partialBytes;\n      return true;\n    }\n\n    output.putBytes(this._partialOutput.getBytes(\n      inputLength - this._partialBytes));\n    this._partialBytes = 0;\n  }\n\n  // update hash block S\n  this._s = this.ghash(this._hashSubkey, this._s, this._outBlock);\n\n  // increment counter (input block)\n  inc32(this._inBlock);\n};\n\nmodes.gcm.prototype.decrypt = function(input, output, finish) {\n  // not enough input to decrypt\n  var inputLength = input.length();\n  if(inputLength < this.blockSize && !(finish && inputLength > 0)) {\n    return true;\n  }\n\n  // encrypt block (GCM always uses encryption mode)\n  this.cipher.encrypt(this._inBlock, this._outBlock);\n\n  // increment counter (input block)\n  inc32(this._inBlock);\n\n  // update hash block S\n  this._hashBlock[0] = input.getInt32();\n  this._hashBlock[1] = input.getInt32();\n  this._hashBlock[2] = input.getInt32();\n  this._hashBlock[3] = input.getInt32();\n  this._s = this.ghash(this._hashSubkey, this._s, this._hashBlock);\n\n  // XOR hash input with output\n  for(var i = 0; i < this._ints; ++i) {\n    output.putInt32(this._outBlock[i] ^ this._hashBlock[i]);\n  }\n\n  // increment cipher data length\n  if(inputLength < this.blockSize) {\n    this._cipherLength += inputLength % this.blockSize;\n  } else {\n    this._cipherLength += this.blockSize;\n  }\n};\n\nmodes.gcm.prototype.afterFinish = function(output, options) {\n  var rval = true;\n\n  // handle overflow\n  if(options.decrypt && options.overflow) {\n    output.truncate(this.blockSize - options.overflow);\n  }\n\n  // handle authentication tag\n  this.tag = forge.util.createBuffer();\n\n  // concatenate additional data length with cipher length\n  var lengths = this._aDataLength.concat(from64To32(this._cipherLength * 8));\n\n  // include lengths in hash\n  this._s = this.ghash(this._hashSubkey, this._s, lengths);\n\n  // do GCTR(J_0, S)\n  var tag = [];\n  this.cipher.encrypt(this._j0, tag);\n  for(var i = 0; i < this._ints; ++i) {\n    this.tag.putInt32(this._s[i] ^ tag[i]);\n  }\n\n  // trim tag to length\n  this.tag.truncate(this.tag.length() % (this._tagLength / 8));\n\n  // check authentication tag\n  if(options.decrypt && this.tag.bytes() !== this._tag) {\n    rval = false;\n  }\n\n  return rval;\n};\n\n/**\n * See NIST SP-800-38D 6.3 (Algorithm 1). This function performs Galois\n * field multiplication. The field, GF(2^128), is defined by the polynomial:\n *\n * x^128 + x^7 + x^2 + x + 1\n *\n * Which is represented in little-endian binary form as: 11100001 (0xe1). When\n * the value of a coefficient is 1, a bit is set. The value R, is the\n * concatenation of this value and 120 zero bits, yielding a 128-bit value\n * which matches the block size.\n *\n * This function will multiply two elements (vectors of bytes), X and Y, in\n * the field GF(2^128). The result is initialized to zero. For each bit of\n * X (out of 128), x_i, if x_i is set, then the result is multiplied (XOR'd)\n * by the current value of Y. For each bit, the value of Y will be raised by\n * a power of x (multiplied by the polynomial x). This can be achieved by\n * shifting Y once to the right. If the current value of Y, prior to being\n * multiplied by x, has 0 as its LSB, then it is a 127th degree polynomial.\n * Otherwise, we must divide by R after shifting to find the remainder.\n *\n * @param x the first block to multiply by the second.\n * @param y the second block to multiply by the first.\n *\n * @return the block result of the multiplication.\n */\nmodes.gcm.prototype.multiply = function(x, y) {\n  var z_i = [0, 0, 0, 0];\n  var v_i = y.slice(0);\n\n  // calculate Z_128 (block has 128 bits)\n  for(var i = 0; i < 128; ++i) {\n    // if x_i is 0, Z_{i+1} = Z_i (unchanged)\n    // else Z_{i+1} = Z_i ^ V_i\n    // get x_i by finding 32-bit int position, then left shift 1 by remainder\n    var x_i = x[(i / 32) | 0] & (1 << (31 - i % 32));\n    if(x_i) {\n      z_i[0] ^= v_i[0];\n      z_i[1] ^= v_i[1];\n      z_i[2] ^= v_i[2];\n      z_i[3] ^= v_i[3];\n    }\n\n    // if LSB(V_i) is 1, V_i = V_i >> 1\n    // else V_i = (V_i >> 1) ^ R\n    this.pow(v_i, v_i);\n  }\n\n  return z_i;\n};\n\nmodes.gcm.prototype.pow = function(x, out) {\n  // if LSB(x) is 1, x = x >>> 1\n  // else x = (x >>> 1) ^ R\n  var lsb = x[3] & 1;\n\n  // always do x >>> 1:\n  // starting with the rightmost integer, shift each integer to the right\n  // one bit, pulling in the bit from the integer to the left as its top\n  // most bit (do this for the last 3 integers)\n  for(var i = 3; i > 0; --i) {\n    out[i] = (x[i] >>> 1) | ((x[i - 1] & 1) << 31);\n  }\n  // shift the first integer normally\n  out[0] = x[0] >>> 1;\n\n  // if lsb was not set, then polynomial had a degree of 127 and doesn't\n  // need to divided; otherwise, XOR with R to find the remainder; we only\n  // need to XOR the first integer since R technically ends w/120 zero bits\n  if(lsb) {\n    out[0] ^= this._R;\n  }\n};\n\nmodes.gcm.prototype.tableMultiply = function(x) {\n  // assumes 4-bit tables are used\n  var z = [0, 0, 0, 0];\n  for(var i = 0; i < 32; ++i) {\n    var idx = (i / 8) | 0;\n    var x_i = (x[idx] >>> ((7 - (i % 8)) * 4)) & 0xF;\n    var ah = this._m[i][x_i];\n    z[0] ^= ah[0];\n    z[1] ^= ah[1];\n    z[2] ^= ah[2];\n    z[3] ^= ah[3];\n  }\n  return z;\n};\n\n/**\n * A continuing version of the GHASH algorithm that operates on a single\n * block. The hash block, last hash value (Ym) and the new block to hash\n * are given.\n *\n * @param h the hash block.\n * @param y the previous value for Ym, use [0, 0, 0, 0] for a new hash.\n * @param x the block to hash.\n *\n * @return the hashed value (Ym).\n */\nmodes.gcm.prototype.ghash = function(h, y, x) {\n  y[0] ^= x[0];\n  y[1] ^= x[1];\n  y[2] ^= x[2];\n  y[3] ^= x[3];\n  return this.tableMultiply(y);\n  //return this.multiply(y, h);\n};\n\n/**\n * Precomputes a table for multiplying against the hash subkey. This\n * mechanism provides a substantial speed increase over multiplication\n * performed without a table. The table-based multiplication this table is\n * for solves X * H by multiplying each component of X by H and then\n * composing the results together using XOR.\n *\n * This function can be used to generate tables with different bit sizes\n * for the components, however, this implementation assumes there are\n * 32 components of X (which is a 16 byte vector), therefore each component\n * takes 4-bits (so the table is constructed with bits=4).\n *\n * @param h the hash subkey.\n * @param bits the bit size for a component.\n */\nmodes.gcm.prototype.generateHashTable = function(h, bits) {\n  // TODO: There are further optimizations that would use only the\n  // first table M_0 (or some variant) along with a remainder table;\n  // this can be explored in the future\n  var multiplier = 8 / bits;\n  var perInt = 4 * multiplier;\n  var size = 16 * multiplier;\n  var m = new Array(size);\n  for(var i = 0; i < size; ++i) {\n    var tmp = [0, 0, 0, 0];\n    var idx = (i / perInt) | 0;\n    var shft = ((perInt - 1 - (i % perInt)) * bits);\n    tmp[idx] = (1 << (bits - 1)) << shft;\n    m[i] = this.generateSubHashTable(this.multiply(tmp, h), bits);\n  }\n  return m;\n};\n\n/**\n * Generates a table for multiplying against the hash subkey for one\n * particular component (out of all possible component values).\n *\n * @param mid the pre-multiplied value for the middle key of the table.\n * @param bits the bit size for a component.\n */\nmodes.gcm.prototype.generateSubHashTable = function(mid, bits) {\n  // compute the table quickly by minimizing the number of\n  // POW operations -- they only need to be performed for powers of 2,\n  // all other entries can be composed from those powers using XOR\n  var size = 1 << bits;\n  var half = size >>> 1;\n  var m = new Array(size);\n  m[half] = mid.slice(0);\n  var i = half >>> 1;\n  while(i > 0) {\n    // raise m0[2 * i] and store in m0[i]\n    this.pow(m[2 * i], m[i] = []);\n    i >>= 1;\n  }\n  i = 2;\n  while(i < half) {\n    for(var j = 1; j < i; ++j) {\n      var m_i = m[i];\n      var m_j = m[j];\n      m[i + j] = [\n        m_i[0] ^ m_j[0],\n        m_i[1] ^ m_j[1],\n        m_i[2] ^ m_j[2],\n        m_i[3] ^ m_j[3]\n      ];\n    }\n    i *= 2;\n  }\n  m[0] = [0, 0, 0, 0];\n  /* Note: We could avoid storing these by doing composition during multiply\n  calculate top half using composition by speed is preferred. */\n  for(i = half + 1; i < size; ++i) {\n    var c = m[i ^ half];\n    m[i] = [mid[0] ^ c[0], mid[1] ^ c[1], mid[2] ^ c[2], mid[3] ^ c[3]];\n  }\n  return m;\n};\n\n/** Utility functions */\n\nfunction transformIV(iv, blockSize) {\n  if(typeof iv === 'string') {\n    // convert iv string into byte buffer\n    iv = forge.util.createBuffer(iv);\n  }\n\n  if(forge.util.isArray(iv) && iv.length > 4) {\n    // convert iv byte array into byte buffer\n    var tmp = iv;\n    iv = forge.util.createBuffer();\n    for(var i = 0; i < tmp.length; ++i) {\n      iv.putByte(tmp[i]);\n    }\n  }\n\n  if(iv.length() < blockSize) {\n    throw new Error(\n      'Invalid IV length; got ' + iv.length() +\n      ' bytes and expected ' + blockSize + ' bytes.');\n  }\n\n  if(!forge.util.isArray(iv)) {\n    // convert iv byte buffer into 32-bit integer array\n    var ints = [];\n    var blocks = blockSize / 4;\n    for(var i = 0; i < blocks; ++i) {\n      ints.push(iv.getInt32());\n    }\n    iv = ints;\n  }\n\n  return iv;\n}\n\nfunction inc32(block) {\n  // increment last 32 bits of block only\n  block[block.length - 1] = (block[block.length - 1] + 1) & 0xFFFFFFFF;\n}\n\nfunction from64To32(num) {\n  // convert 64-bit number to two BE Int32s\n  return [(num / 0x100000000) | 0, num & 0xFFFFFFFF];\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzguanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbm9kZS1mb3JnZS9saWIvY2lwaGVyTW9kZXMuanM/YTQ2NSJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFN1cHBvcnRlZCBjaXBoZXIgbW9kZXMuXG4gKlxuICogQGF1dGhvciBEYXZlIExvbmdsZXlcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxNCBEaWdpdGFsIEJhemFhciwgSW5jLlxuICovXG52YXIgZm9yZ2UgPSByZXF1aXJlKCcuL2ZvcmdlJyk7XG5yZXF1aXJlKCcuL3V0aWwnKTtcblxuZm9yZ2UuY2lwaGVyID0gZm9yZ2UuY2lwaGVyIHx8IHt9O1xuXG4vLyBzdXBwb3J0ZWQgY2lwaGVyIG1vZGVzXG52YXIgbW9kZXMgPSBtb2R1bGUuZXhwb3J0cyA9IGZvcmdlLmNpcGhlci5tb2RlcyA9IGZvcmdlLmNpcGhlci5tb2RlcyB8fCB7fTtcblxuLyoqIEVsZWN0cm9uaWMgY29kZWJvb2sgKEVDQikgKERvbid0IHVzZSB0aGlzOyBpdCdzIG5vdCBzZWN1cmUpICoqL1xuXG5tb2Rlcy5lY2IgPSBmdW5jdGlvbihvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICB0aGlzLm5hbWUgPSAnRUNCJztcbiAgdGhpcy5jaXBoZXIgPSBvcHRpb25zLmNpcGhlcjtcbiAgdGhpcy5ibG9ja1NpemUgPSBvcHRpb25zLmJsb2NrU2l6ZSB8fCAxNjtcbiAgdGhpcy5faW50cyA9IHRoaXMuYmxvY2tTaXplIC8gNDtcbiAgdGhpcy5faW5CbG9jayA9IG5ldyBBcnJheSh0aGlzLl9pbnRzKTtcbiAgdGhpcy5fb3V0QmxvY2sgPSBuZXcgQXJyYXkodGhpcy5faW50cyk7XG59O1xuXG5tb2Rlcy5lY2IucHJvdG90eXBlLnN0YXJ0ID0gZnVuY3Rpb24ob3B0aW9ucykge307XG5cbm1vZGVzLmVjYi5wcm90b3R5cGUuZW5jcnlwdCA9IGZ1bmN0aW9uKGlucHV0LCBvdXRwdXQsIGZpbmlzaCkge1xuICAvLyBub3QgZW5vdWdoIGlucHV0IHRvIGVuY3J5cHRcbiAgaWYoaW5wdXQubGVuZ3RoKCkgPCB0aGlzLmJsb2NrU2l6ZSAmJiAhKGZpbmlzaCAmJiBpbnB1dC5sZW5ndGgoKSA+IDApKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyBnZXQgbmV4dCBibG9ja1xuICBmb3IodmFyIGkgPSAwOyBpIDwgdGhpcy5faW50czsgKytpKSB7XG4gICAgdGhpcy5faW5CbG9ja1tpXSA9IGlucHV0LmdldEludDMyKCk7XG4gIH1cblxuICAvLyBlbmNyeXB0IGJsb2NrXG4gIHRoaXMuY2lwaGVyLmVuY3J5cHQodGhpcy5faW5CbG9jaywgdGhpcy5fb3V0QmxvY2spO1xuXG4gIC8vIHdyaXRlIG91dHB1dFxuICBmb3IodmFyIGkgPSAwOyBpIDwgdGhpcy5faW50czsgKytpKSB7XG4gICAgb3V0cHV0LnB1dEludDMyKHRoaXMuX291dEJsb2NrW2ldKTtcbiAgfVxufTtcblxubW9kZXMuZWNiLnByb3RvdHlwZS5kZWNyeXB0ID0gZnVuY3Rpb24oaW5wdXQsIG91dHB1dCwgZmluaXNoKSB7XG4gIC8vIG5vdCBlbm91Z2ggaW5wdXQgdG8gZGVjcnlwdFxuICBpZihpbnB1dC5sZW5ndGgoKSA8IHRoaXMuYmxvY2tTaXplICYmICEoZmluaXNoICYmIGlucHV0Lmxlbmd0aCgpID4gMCkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vIGdldCBuZXh0IGJsb2NrXG4gIGZvcih2YXIgaSA9IDA7IGkgPCB0aGlzLl9pbnRzOyArK2kpIHtcbiAgICB0aGlzLl9pbkJsb2NrW2ldID0gaW5wdXQuZ2V0SW50MzIoKTtcbiAgfVxuXG4gIC8vIGRlY3J5cHQgYmxvY2tcbiAgdGhpcy5jaXBoZXIuZGVjcnlwdCh0aGlzLl9pbkJsb2NrLCB0aGlzLl9vdXRCbG9jayk7XG5cbiAgLy8gd3JpdGUgb3V0cHV0XG4gIGZvcih2YXIgaSA9IDA7IGkgPCB0aGlzLl9pbnRzOyArK2kpIHtcbiAgICBvdXRwdXQucHV0SW50MzIodGhpcy5fb3V0QmxvY2tbaV0pO1xuICB9XG59O1xuXG5tb2Rlcy5lY2IucHJvdG90eXBlLnBhZCA9IGZ1bmN0aW9uKGlucHV0LCBvcHRpb25zKSB7XG4gIC8vIGFkZCBQS0NTIzcgcGFkZGluZyB0byBibG9jayAoZWFjaCBwYWQgYnl0ZSBpcyB0aGVcbiAgLy8gdmFsdWUgb2YgdGhlIG51bWJlciBvZiBwYWQgYnl0ZXMpXG4gIHZhciBwYWRkaW5nID0gKGlucHV0Lmxlbmd0aCgpID09PSB0aGlzLmJsb2NrU2l6ZSA/XG4gICAgdGhpcy5ibG9ja1NpemUgOiAodGhpcy5ibG9ja1NpemUgLSBpbnB1dC5sZW5ndGgoKSkpO1xuICBpbnB1dC5maWxsV2l0aEJ5dGUocGFkZGluZywgcGFkZGluZyk7XG4gIHJldHVybiB0cnVlO1xufTtcblxubW9kZXMuZWNiLnByb3RvdHlwZS51bnBhZCA9IGZ1bmN0aW9uKG91dHB1dCwgb3B0aW9ucykge1xuICAvLyBjaGVjayBmb3IgZXJyb3I6IGlucHV0IGRhdGEgbm90IGEgbXVsdGlwbGUgb2YgYmxvY2tTaXplXG4gIGlmKG9wdGlvbnMub3ZlcmZsb3cgPiAwKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gZW5zdXJlIHBhZGRpbmcgYnl0ZSBjb3VudCBpcyB2YWxpZFxuICB2YXIgbGVuID0gb3V0cHV0Lmxlbmd0aCgpO1xuICB2YXIgY291bnQgPSBvdXRwdXQuYXQobGVuIC0gMSk7XG4gIGlmKGNvdW50ID4gKHRoaXMuYmxvY2tTaXplIDw8IDIpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gdHJpbSBvZmYgcGFkZGluZyBieXRlc1xuICBvdXRwdXQudHJ1bmNhdGUoY291bnQpO1xuICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8qKiBDaXBoZXItYmxvY2sgQ2hhaW5pbmcgKENCQykgKiovXG5cbm1vZGVzLmNiYyA9IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIHRoaXMubmFtZSA9ICdDQkMnO1xuICB0aGlzLmNpcGhlciA9IG9wdGlvbnMuY2lwaGVyO1xuICB0aGlzLmJsb2NrU2l6ZSA9IG9wdGlvbnMuYmxvY2tTaXplIHx8IDE2O1xuICB0aGlzLl9pbnRzID0gdGhpcy5ibG9ja1NpemUgLyA0O1xuICB0aGlzLl9pbkJsb2NrID0gbmV3IEFycmF5KHRoaXMuX2ludHMpO1xuICB0aGlzLl9vdXRCbG9jayA9IG5ldyBBcnJheSh0aGlzLl9pbnRzKTtcbn07XG5cbm1vZGVzLmNiYy5wcm90b3R5cGUuc3RhcnQgPSBmdW5jdGlvbihvcHRpb25zKSB7XG4gIC8vIE5vdGU6IGxlZ2FjeSBzdXBwb3J0IGZvciB1c2luZyBJViByZXNpZHVlIChoYXMgc2VjdXJpdHkgZmxhd3MpXG4gIC8vIGlmIElWIGlzIG51bGwsIHJldXNlIGJsb2NrIGZyb20gcHJldmlvdXMgcHJvY2Vzc2luZ1xuICBpZihvcHRpb25zLml2ID09PSBudWxsKSB7XG4gICAgLy8gbXVzdCBoYXZlIGEgcHJldmlvdXMgYmxvY2tcbiAgICBpZighdGhpcy5fcHJldikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIElWIHBhcmFtZXRlci4nKTtcbiAgICB9XG4gICAgdGhpcy5faXYgPSB0aGlzLl9wcmV2LnNsaWNlKDApO1xuICB9IGVsc2UgaWYoISgnaXYnIGluIG9wdGlvbnMpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIElWIHBhcmFtZXRlci4nKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBzYXZlIElWIGFzIFwicHJldmlvdXNcIiBibG9ja1xuICAgIHRoaXMuX2l2ID0gdHJhbnNmb3JtSVYob3B0aW9ucy5pdiwgdGhpcy5ibG9ja1NpemUpO1xuICAgIHRoaXMuX3ByZXYgPSB0aGlzLl9pdi5zbGljZSgwKTtcbiAgfVxufTtcblxubW9kZXMuY2JjLnByb3RvdHlwZS5lbmNyeXB0ID0gZnVuY3Rpb24oaW5wdXQsIG91dHB1dCwgZmluaXNoKSB7XG4gIC8vIG5vdCBlbm91Z2ggaW5wdXQgdG8gZW5jcnlwdFxuICBpZihpbnB1dC5sZW5ndGgoKSA8IHRoaXMuYmxvY2tTaXplICYmICEoZmluaXNoICYmIGlucHV0Lmxlbmd0aCgpID4gMCkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vIGdldCBuZXh0IGJsb2NrXG4gIC8vIENCQyBYT1IncyBJViAob3IgcHJldmlvdXMgYmxvY2spIHdpdGggcGxhaW50ZXh0XG4gIGZvcih2YXIgaSA9IDA7IGkgPCB0aGlzLl9pbnRzOyArK2kpIHtcbiAgICB0aGlzLl9pbkJsb2NrW2ldID0gdGhpcy5fcHJldltpXSBeIGlucHV0LmdldEludDMyKCk7XG4gIH1cblxuICAvLyBlbmNyeXB0IGJsb2NrXG4gIHRoaXMuY2lwaGVyLmVuY3J5cHQodGhpcy5faW5CbG9jaywgdGhpcy5fb3V0QmxvY2spO1xuXG4gIC8vIHdyaXRlIG91dHB1dCwgc2F2ZSBwcmV2aW91cyBibG9ja1xuICBmb3IodmFyIGkgPSAwOyBpIDwgdGhpcy5faW50czsgKytpKSB7XG4gICAgb3V0cHV0LnB1dEludDMyKHRoaXMuX291dEJsb2NrW2ldKTtcbiAgfVxuICB0aGlzLl9wcmV2ID0gdGhpcy5fb3V0QmxvY2s7XG59O1xuXG5tb2Rlcy5jYmMucHJvdG90eXBlLmRlY3J5cHQgPSBmdW5jdGlvbihpbnB1dCwgb3V0cHV0LCBmaW5pc2gpIHtcbiAgLy8gbm90IGVub3VnaCBpbnB1dCB0byBkZWNyeXB0XG4gIGlmKGlucHV0Lmxlbmd0aCgpIDwgdGhpcy5ibG9ja1NpemUgJiYgIShmaW5pc2ggJiYgaW5wdXQubGVuZ3RoKCkgPiAwKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLy8gZ2V0IG5leHQgYmxvY2tcbiAgZm9yKHZhciBpID0gMDsgaSA8IHRoaXMuX2ludHM7ICsraSkge1xuICAgIHRoaXMuX2luQmxvY2tbaV0gPSBpbnB1dC5nZXRJbnQzMigpO1xuICB9XG5cbiAgLy8gZGVjcnlwdCBibG9ja1xuICB0aGlzLmNpcGhlci5kZWNyeXB0KHRoaXMuX2luQmxvY2ssIHRoaXMuX291dEJsb2NrKTtcblxuICAvLyB3cml0ZSBvdXRwdXQsIHNhdmUgcHJldmlvdXMgY2lwaGVyZWQgYmxvY2tcbiAgLy8gQ0JDIFhPUidzIElWIChvciBwcmV2aW91cyBibG9jaykgd2l0aCBjaXBoZXJ0ZXh0XG4gIGZvcih2YXIgaSA9IDA7IGkgPCB0aGlzLl9pbnRzOyArK2kpIHtcbiAgICBvdXRwdXQucHV0SW50MzIodGhpcy5fcHJldltpXSBeIHRoaXMuX291dEJsb2NrW2ldKTtcbiAgfVxuICB0aGlzLl9wcmV2ID0gdGhpcy5faW5CbG9jay5zbGljZSgwKTtcbn07XG5cbm1vZGVzLmNiYy5wcm90b3R5cGUucGFkID0gZnVuY3Rpb24oaW5wdXQsIG9wdGlvbnMpIHtcbiAgLy8gYWRkIFBLQ1MjNyBwYWRkaW5nIHRvIGJsb2NrIChlYWNoIHBhZCBieXRlIGlzIHRoZVxuICAvLyB2YWx1ZSBvZiB0aGUgbnVtYmVyIG9mIHBhZCBieXRlcylcbiAgdmFyIHBhZGRpbmcgPSAoaW5wdXQubGVuZ3RoKCkgPT09IHRoaXMuYmxvY2tTaXplID9cbiAgICB0aGlzLmJsb2NrU2l6ZSA6ICh0aGlzLmJsb2NrU2l6ZSAtIGlucHV0Lmxlbmd0aCgpKSk7XG4gIGlucHV0LmZpbGxXaXRoQnl0ZShwYWRkaW5nLCBwYWRkaW5nKTtcbiAgcmV0dXJuIHRydWU7XG59O1xuXG5tb2Rlcy5jYmMucHJvdG90eXBlLnVucGFkID0gZnVuY3Rpb24ob3V0cHV0LCBvcHRpb25zKSB7XG4gIC8vIGNoZWNrIGZvciBlcnJvcjogaW5wdXQgZGF0YSBub3QgYSBtdWx0aXBsZSBvZiBibG9ja1NpemVcbiAgaWYob3B0aW9ucy5vdmVyZmxvdyA+IDApIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBlbnN1cmUgcGFkZGluZyBieXRlIGNvdW50IGlzIHZhbGlkXG4gIHZhciBsZW4gPSBvdXRwdXQubGVuZ3RoKCk7XG4gIHZhciBjb3VudCA9IG91dHB1dC5hdChsZW4gLSAxKTtcbiAgaWYoY291bnQgPiAodGhpcy5ibG9ja1NpemUgPDwgMikpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyB0cmltIG9mZiBwYWRkaW5nIGJ5dGVzXG4gIG91dHB1dC50cnVuY2F0ZShjb3VudCk7XG4gIHJldHVybiB0cnVlO1xufTtcblxuLyoqIENpcGhlciBmZWVkYmFjayAoQ0ZCKSAqKi9cblxubW9kZXMuY2ZiID0gZnVuY3Rpb24ob3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgdGhpcy5uYW1lID0gJ0NGQic7XG4gIHRoaXMuY2lwaGVyID0gb3B0aW9ucy5jaXBoZXI7XG4gIHRoaXMuYmxvY2tTaXplID0gb3B0aW9ucy5ibG9ja1NpemUgfHwgMTY7XG4gIHRoaXMuX2ludHMgPSB0aGlzLmJsb2NrU2l6ZSAvIDQ7XG4gIHRoaXMuX2luQmxvY2sgPSBudWxsO1xuICB0aGlzLl9vdXRCbG9jayA9IG5ldyBBcnJheSh0aGlzLl9pbnRzKTtcbiAgdGhpcy5fcGFydGlhbEJsb2NrID0gbmV3IEFycmF5KHRoaXMuX2ludHMpO1xuICB0aGlzLl9wYXJ0aWFsT3V0cHV0ID0gZm9yZ2UudXRpbC5jcmVhdGVCdWZmZXIoKTtcbiAgdGhpcy5fcGFydGlhbEJ5dGVzID0gMDtcbn07XG5cbm1vZGVzLmNmYi5wcm90b3R5cGUuc3RhcnQgPSBmdW5jdGlvbihvcHRpb25zKSB7XG4gIGlmKCEoJ2l2JyBpbiBvcHRpb25zKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBJViBwYXJhbWV0ZXIuJyk7XG4gIH1cbiAgLy8gdXNlIElWIGFzIGZpcnN0IGlucHV0XG4gIHRoaXMuX2l2ID0gdHJhbnNmb3JtSVYob3B0aW9ucy5pdiwgdGhpcy5ibG9ja1NpemUpO1xuICB0aGlzLl9pbkJsb2NrID0gdGhpcy5faXYuc2xpY2UoMCk7XG4gIHRoaXMuX3BhcnRpYWxCeXRlcyA9IDA7XG59O1xuXG5tb2Rlcy5jZmIucHJvdG90eXBlLmVuY3J5cHQgPSBmdW5jdGlvbihpbnB1dCwgb3V0cHV0LCBmaW5pc2gpIHtcbiAgLy8gbm90IGVub3VnaCBpbnB1dCB0byBlbmNyeXB0XG4gIHZhciBpbnB1dExlbmd0aCA9IGlucHV0Lmxlbmd0aCgpO1xuICBpZihpbnB1dExlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLy8gZW5jcnlwdCBibG9ja1xuICB0aGlzLmNpcGhlci5lbmNyeXB0KHRoaXMuX2luQmxvY2ssIHRoaXMuX291dEJsb2NrKTtcblxuICAvLyBoYW5kbGUgZnVsbCBibG9ja1xuICBpZih0aGlzLl9wYXJ0aWFsQnl0ZXMgPT09IDAgJiYgaW5wdXRMZW5ndGggPj0gdGhpcy5ibG9ja1NpemUpIHtcbiAgICAvLyBYT1IgaW5wdXQgd2l0aCBvdXRwdXQsIHdyaXRlIGlucHV0IGFzIG91dHB1dFxuICAgIGZvcih2YXIgaSA9IDA7IGkgPCB0aGlzLl9pbnRzOyArK2kpIHtcbiAgICAgIHRoaXMuX2luQmxvY2tbaV0gPSBpbnB1dC5nZXRJbnQzMigpIF4gdGhpcy5fb3V0QmxvY2tbaV07XG4gICAgICBvdXRwdXQucHV0SW50MzIodGhpcy5faW5CbG9ja1tpXSk7XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIGhhbmRsZSBwYXJ0aWFsIGJsb2NrXG4gIHZhciBwYXJ0aWFsQnl0ZXMgPSAodGhpcy5ibG9ja1NpemUgLSBpbnB1dExlbmd0aCkgJSB0aGlzLmJsb2NrU2l6ZTtcbiAgaWYocGFydGlhbEJ5dGVzID4gMCkge1xuICAgIHBhcnRpYWxCeXRlcyA9IHRoaXMuYmxvY2tTaXplIC0gcGFydGlhbEJ5dGVzO1xuICB9XG5cbiAgLy8gWE9SIGlucHV0IHdpdGggb3V0cHV0LCB3cml0ZSBpbnB1dCBhcyBwYXJ0aWFsIG91dHB1dFxuICB0aGlzLl9wYXJ0aWFsT3V0cHV0LmNsZWFyKCk7XG4gIGZvcih2YXIgaSA9IDA7IGkgPCB0aGlzLl9pbnRzOyArK2kpIHtcbiAgICB0aGlzLl9wYXJ0aWFsQmxvY2tbaV0gPSBpbnB1dC5nZXRJbnQzMigpIF4gdGhpcy5fb3V0QmxvY2tbaV07XG4gICAgdGhpcy5fcGFydGlhbE91dHB1dC5wdXRJbnQzMih0aGlzLl9wYXJ0aWFsQmxvY2tbaV0pO1xuICB9XG5cbiAgaWYocGFydGlhbEJ5dGVzID4gMCkge1xuICAgIC8vIGJsb2NrIHN0aWxsIGluY29tcGxldGUsIHJlc3RvcmUgaW5wdXQgYnVmZmVyXG4gICAgaW5wdXQucmVhZCAtPSB0aGlzLmJsb2NrU2l6ZTtcbiAgfSBlbHNlIHtcbiAgICAvLyBibG9jayBjb21wbGV0ZSwgdXBkYXRlIGlucHV0IGJsb2NrXG4gICAgZm9yKHZhciBpID0gMDsgaSA8IHRoaXMuX2ludHM7ICsraSkge1xuICAgICAgdGhpcy5faW5CbG9ja1tpXSA9IHRoaXMuX3BhcnRpYWxCbG9ja1tpXTtcbiAgICB9XG4gIH1cblxuICAvLyBza2lwIGFueSBwcmV2aW91cyBwYXJ0aWFsIGJ5dGVzXG4gIGlmKHRoaXMuX3BhcnRpYWxCeXRlcyA+IDApIHtcbiAgICB0aGlzLl9wYXJ0aWFsT3V0cHV0LmdldEJ5dGVzKHRoaXMuX3BhcnRpYWxCeXRlcyk7XG4gIH1cblxuICBpZihwYXJ0aWFsQnl0ZXMgPiAwICYmICFmaW5pc2gpIHtcbiAgICBvdXRwdXQucHV0Qnl0ZXModGhpcy5fcGFydGlhbE91dHB1dC5nZXRCeXRlcyhcbiAgICAgIHBhcnRpYWxCeXRlcyAtIHRoaXMuX3BhcnRpYWxCeXRlcykpO1xuICAgIHRoaXMuX3BhcnRpYWxCeXRlcyA9IHBhcnRpYWxCeXRlcztcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIG91dHB1dC5wdXRCeXRlcyh0aGlzLl9wYXJ0aWFsT3V0cHV0LmdldEJ5dGVzKFxuICAgIGlucHV0TGVuZ3RoIC0gdGhpcy5fcGFydGlhbEJ5dGVzKSk7XG4gIHRoaXMuX3BhcnRpYWxCeXRlcyA9IDA7XG59O1xuXG5tb2Rlcy5jZmIucHJvdG90eXBlLmRlY3J5cHQgPSBmdW5jdGlvbihpbnB1dCwgb3V0cHV0LCBmaW5pc2gpIHtcbiAgLy8gbm90IGVub3VnaCBpbnB1dCB0byBkZWNyeXB0XG4gIHZhciBpbnB1dExlbmd0aCA9IGlucHV0Lmxlbmd0aCgpO1xuICBpZihpbnB1dExlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLy8gZW5jcnlwdCBibG9jayAoQ0ZCIGFsd2F5cyB1c2VzIGVuY3J5cHRpb24gbW9kZSlcbiAgdGhpcy5jaXBoZXIuZW5jcnlwdCh0aGlzLl9pbkJsb2NrLCB0aGlzLl9vdXRCbG9jayk7XG5cbiAgLy8gaGFuZGxlIGZ1bGwgYmxvY2tcbiAgaWYodGhpcy5fcGFydGlhbEJ5dGVzID09PSAwICYmIGlucHV0TGVuZ3RoID49IHRoaXMuYmxvY2tTaXplKSB7XG4gICAgLy8gWE9SIGlucHV0IHdpdGggb3V0cHV0LCB3cml0ZSBpbnB1dCBhcyBvdXRwdXRcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgdGhpcy5faW50czsgKytpKSB7XG4gICAgICB0aGlzLl9pbkJsb2NrW2ldID0gaW5wdXQuZ2V0SW50MzIoKTtcbiAgICAgIG91dHB1dC5wdXRJbnQzMih0aGlzLl9pbkJsb2NrW2ldIF4gdGhpcy5fb3V0QmxvY2tbaV0pO1xuICAgIH1cbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBoYW5kbGUgcGFydGlhbCBibG9ja1xuICB2YXIgcGFydGlhbEJ5dGVzID0gKHRoaXMuYmxvY2tTaXplIC0gaW5wdXRMZW5ndGgpICUgdGhpcy5ibG9ja1NpemU7XG4gIGlmKHBhcnRpYWxCeXRlcyA+IDApIHtcbiAgICBwYXJ0aWFsQnl0ZXMgPSB0aGlzLmJsb2NrU2l6ZSAtIHBhcnRpYWxCeXRlcztcbiAgfVxuXG4gIC8vIFhPUiBpbnB1dCB3aXRoIG91dHB1dCwgd3JpdGUgaW5wdXQgYXMgcGFydGlhbCBvdXRwdXRcbiAgdGhpcy5fcGFydGlhbE91dHB1dC5jbGVhcigpO1xuICBmb3IodmFyIGkgPSAwOyBpIDwgdGhpcy5faW50czsgKytpKSB7XG4gICAgdGhpcy5fcGFydGlhbEJsb2NrW2ldID0gaW5wdXQuZ2V0SW50MzIoKTtcbiAgICB0aGlzLl9wYXJ0aWFsT3V0cHV0LnB1dEludDMyKHRoaXMuX3BhcnRpYWxCbG9ja1tpXSBeIHRoaXMuX291dEJsb2NrW2ldKTtcbiAgfVxuXG4gIGlmKHBhcnRpYWxCeXRlcyA+IDApIHtcbiAgICAvLyBibG9jayBzdGlsbCBpbmNvbXBsZXRlLCByZXN0b3JlIGlucHV0IGJ1ZmZlclxuICAgIGlucHV0LnJlYWQgLT0gdGhpcy5ibG9ja1NpemU7XG4gIH0gZWxzZSB7XG4gICAgLy8gYmxvY2sgY29tcGxldGUsIHVwZGF0ZSBpbnB1dCBibG9ja1xuICAgIGZvcih2YXIgaSA9IDA7IGkgPCB0aGlzLl9pbnRzOyArK2kpIHtcbiAgICAgIHRoaXMuX2luQmxvY2tbaV0gPSB0aGlzLl9wYXJ0aWFsQmxvY2tbaV07XG4gICAgfVxuICB9XG5cbiAgLy8gc2tpcCBhbnkgcHJldmlvdXMgcGFydGlhbCBieXRlc1xuICBpZih0aGlzLl9wYXJ0aWFsQnl0ZXMgPiAwKSB7XG4gICAgdGhpcy5fcGFydGlhbE91dHB1dC5nZXRCeXRlcyh0aGlzLl9wYXJ0aWFsQnl0ZXMpO1xuICB9XG5cbiAgaWYocGFydGlhbEJ5dGVzID4gMCAmJiAhZmluaXNoKSB7XG4gICAgb3V0cHV0LnB1dEJ5dGVzKHRoaXMuX3BhcnRpYWxPdXRwdXQuZ2V0Qnl0ZXMoXG4gICAgICBwYXJ0aWFsQnl0ZXMgLSB0aGlzLl9wYXJ0aWFsQnl0ZXMpKTtcbiAgICB0aGlzLl9wYXJ0aWFsQnl0ZXMgPSBwYXJ0aWFsQnl0ZXM7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBvdXRwdXQucHV0Qnl0ZXModGhpcy5fcGFydGlhbE91dHB1dC5nZXRCeXRlcyhcbiAgICBpbnB1dExlbmd0aCAtIHRoaXMuX3BhcnRpYWxCeXRlcykpO1xuICB0aGlzLl9wYXJ0aWFsQnl0ZXMgPSAwO1xufTtcblxuLyoqIE91dHB1dCBmZWVkYmFjayAoT0ZCKSAqKi9cblxubW9kZXMub2ZiID0gZnVuY3Rpb24ob3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgdGhpcy5uYW1lID0gJ09GQic7XG4gIHRoaXMuY2lwaGVyID0gb3B0aW9ucy5jaXBoZXI7XG4gIHRoaXMuYmxvY2tTaXplID0gb3B0aW9ucy5ibG9ja1NpemUgfHwgMTY7XG4gIHRoaXMuX2ludHMgPSB0aGlzLmJsb2NrU2l6ZSAvIDQ7XG4gIHRoaXMuX2luQmxvY2sgPSBudWxsO1xuICB0aGlzLl9vdXRCbG9jayA9IG5ldyBBcnJheSh0aGlzLl9pbnRzKTtcbiAgdGhpcy5fcGFydGlhbE91dHB1dCA9IGZvcmdlLnV0aWwuY3JlYXRlQnVmZmVyKCk7XG4gIHRoaXMuX3BhcnRpYWxCeXRlcyA9IDA7XG59O1xuXG5tb2Rlcy5vZmIucHJvdG90eXBlLnN0YXJ0ID0gZnVuY3Rpb24ob3B0aW9ucykge1xuICBpZighKCdpdicgaW4gb3B0aW9ucykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgSVYgcGFyYW1ldGVyLicpO1xuICB9XG4gIC8vIHVzZSBJViBhcyBmaXJzdCBpbnB1dFxuICB0aGlzLl9pdiA9IHRyYW5zZm9ybUlWKG9wdGlvbnMuaXYsIHRoaXMuYmxvY2tTaXplKTtcbiAgdGhpcy5faW5CbG9jayA9IHRoaXMuX2l2LnNsaWNlKDApO1xuICB0aGlzLl9wYXJ0aWFsQnl0ZXMgPSAwO1xufTtcblxubW9kZXMub2ZiLnByb3RvdHlwZS5lbmNyeXB0ID0gZnVuY3Rpb24oaW5wdXQsIG91dHB1dCwgZmluaXNoKSB7XG4gIC8vIG5vdCBlbm91Z2ggaW5wdXQgdG8gZW5jcnlwdFxuICB2YXIgaW5wdXRMZW5ndGggPSBpbnB1dC5sZW5ndGgoKTtcbiAgaWYoaW5wdXQubGVuZ3RoKCkgPT09IDApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vIGVuY3J5cHQgYmxvY2sgKE9GQiBhbHdheXMgdXNlcyBlbmNyeXB0aW9uIG1vZGUpXG4gIHRoaXMuY2lwaGVyLmVuY3J5cHQodGhpcy5faW5CbG9jaywgdGhpcy5fb3V0QmxvY2spO1xuXG4gIC8vIGhhbmRsZSBmdWxsIGJsb2NrXG4gIGlmKHRoaXMuX3BhcnRpYWxCeXRlcyA9PT0gMCAmJiBpbnB1dExlbmd0aCA+PSB0aGlzLmJsb2NrU2l6ZSkge1xuICAgIC8vIFhPUiBpbnB1dCB3aXRoIG91dHB1dCBhbmQgdXBkYXRlIG5leHQgaW5wdXRcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgdGhpcy5faW50czsgKytpKSB7XG4gICAgICBvdXRwdXQucHV0SW50MzIoaW5wdXQuZ2V0SW50MzIoKSBeIHRoaXMuX291dEJsb2NrW2ldKTtcbiAgICAgIHRoaXMuX2luQmxvY2tbaV0gPSB0aGlzLl9vdXRCbG9ja1tpXTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gaGFuZGxlIHBhcnRpYWwgYmxvY2tcbiAgdmFyIHBhcnRpYWxCeXRlcyA9ICh0aGlzLmJsb2NrU2l6ZSAtIGlucHV0TGVuZ3RoKSAlIHRoaXMuYmxvY2tTaXplO1xuICBpZihwYXJ0aWFsQnl0ZXMgPiAwKSB7XG4gICAgcGFydGlhbEJ5dGVzID0gdGhpcy5ibG9ja1NpemUgLSBwYXJ0aWFsQnl0ZXM7XG4gIH1cblxuICAvLyBYT1IgaW5wdXQgd2l0aCBvdXRwdXRcbiAgdGhpcy5fcGFydGlhbE91dHB1dC5jbGVhcigpO1xuICBmb3IodmFyIGkgPSAwOyBpIDwgdGhpcy5faW50czsgKytpKSB7XG4gICAgdGhpcy5fcGFydGlhbE91dHB1dC5wdXRJbnQzMihpbnB1dC5nZXRJbnQzMigpIF4gdGhpcy5fb3V0QmxvY2tbaV0pO1xuICB9XG5cbiAgaWYocGFydGlhbEJ5dGVzID4gMCkge1xuICAgIC8vIGJsb2NrIHN0aWxsIGluY29tcGxldGUsIHJlc3RvcmUgaW5wdXQgYnVmZmVyXG4gICAgaW5wdXQucmVhZCAtPSB0aGlzLmJsb2NrU2l6ZTtcbiAgfSBlbHNlIHtcbiAgICAvLyBibG9jayBjb21wbGV0ZSwgdXBkYXRlIGlucHV0IGJsb2NrXG4gICAgZm9yKHZhciBpID0gMDsgaSA8IHRoaXMuX2ludHM7ICsraSkge1xuICAgICAgdGhpcy5faW5CbG9ja1tpXSA9IHRoaXMuX291dEJsb2NrW2ldO1xuICAgIH1cbiAgfVxuXG4gIC8vIHNraXAgYW55IHByZXZpb3VzIHBhcnRpYWwgYnl0ZXNcbiAgaWYodGhpcy5fcGFydGlhbEJ5dGVzID4gMCkge1xuICAgIHRoaXMuX3BhcnRpYWxPdXRwdXQuZ2V0Qnl0ZXModGhpcy5fcGFydGlhbEJ5dGVzKTtcbiAgfVxuXG4gIGlmKHBhcnRpYWxCeXRlcyA+IDAgJiYgIWZpbmlzaCkge1xuICAgIG91dHB1dC5wdXRCeXRlcyh0aGlzLl9wYXJ0aWFsT3V0cHV0LmdldEJ5dGVzKFxuICAgICAgcGFydGlhbEJ5dGVzIC0gdGhpcy5fcGFydGlhbEJ5dGVzKSk7XG4gICAgdGhpcy5fcGFydGlhbEJ5dGVzID0gcGFydGlhbEJ5dGVzO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgb3V0cHV0LnB1dEJ5dGVzKHRoaXMuX3BhcnRpYWxPdXRwdXQuZ2V0Qnl0ZXMoXG4gICAgaW5wdXRMZW5ndGggLSB0aGlzLl9wYXJ0aWFsQnl0ZXMpKTtcbiAgdGhpcy5fcGFydGlhbEJ5dGVzID0gMDtcbn07XG5cbm1vZGVzLm9mYi5wcm90b3R5cGUuZGVjcnlwdCA9IG1vZGVzLm9mYi5wcm90b3R5cGUuZW5jcnlwdDtcblxuLyoqIENvdW50ZXIgKENUUikgKiovXG5cbm1vZGVzLmN0ciA9IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIHRoaXMubmFtZSA9ICdDVFInO1xuICB0aGlzLmNpcGhlciA9IG9wdGlvbnMuY2lwaGVyO1xuICB0aGlzLmJsb2NrU2l6ZSA9IG9wdGlvbnMuYmxvY2tTaXplIHx8IDE2O1xuICB0aGlzLl9pbnRzID0gdGhpcy5ibG9ja1NpemUgLyA0O1xuICB0aGlzLl9pbkJsb2NrID0gbnVsbDtcbiAgdGhpcy5fb3V0QmxvY2sgPSBuZXcgQXJyYXkodGhpcy5faW50cyk7XG4gIHRoaXMuX3BhcnRpYWxPdXRwdXQgPSBmb3JnZS51dGlsLmNyZWF0ZUJ1ZmZlcigpO1xuICB0aGlzLl9wYXJ0aWFsQnl0ZXMgPSAwO1xufTtcblxubW9kZXMuY3RyLnByb3RvdHlwZS5zdGFydCA9IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgaWYoISgnaXYnIGluIG9wdGlvbnMpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIElWIHBhcmFtZXRlci4nKTtcbiAgfVxuICAvLyB1c2UgSVYgYXMgZmlyc3QgaW5wdXRcbiAgdGhpcy5faXYgPSB0cmFuc2Zvcm1JVihvcHRpb25zLml2LCB0aGlzLmJsb2NrU2l6ZSk7XG4gIHRoaXMuX2luQmxvY2sgPSB0aGlzLl9pdi5zbGljZSgwKTtcbiAgdGhpcy5fcGFydGlhbEJ5dGVzID0gMDtcbn07XG5cbm1vZGVzLmN0ci5wcm90b3R5cGUuZW5jcnlwdCA9IGZ1bmN0aW9uKGlucHV0LCBvdXRwdXQsIGZpbmlzaCkge1xuICAvLyBub3QgZW5vdWdoIGlucHV0IHRvIGVuY3J5cHRcbiAgdmFyIGlucHV0TGVuZ3RoID0gaW5wdXQubGVuZ3RoKCk7XG4gIGlmKGlucHV0TGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyBlbmNyeXB0IGJsb2NrIChDVFIgYWx3YXlzIHVzZXMgZW5jcnlwdGlvbiBtb2RlKVxuICB0aGlzLmNpcGhlci5lbmNyeXB0KHRoaXMuX2luQmxvY2ssIHRoaXMuX291dEJsb2NrKTtcblxuICAvLyBoYW5kbGUgZnVsbCBibG9ja1xuICBpZih0aGlzLl9wYXJ0aWFsQnl0ZXMgPT09IDAgJiYgaW5wdXRMZW5ndGggPj0gdGhpcy5ibG9ja1NpemUpIHtcbiAgICAvLyBYT1IgaW5wdXQgd2l0aCBvdXRwdXRcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgdGhpcy5faW50czsgKytpKSB7XG4gICAgICBvdXRwdXQucHV0SW50MzIoaW5wdXQuZ2V0SW50MzIoKSBeIHRoaXMuX291dEJsb2NrW2ldKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gaGFuZGxlIHBhcnRpYWwgYmxvY2tcbiAgICB2YXIgcGFydGlhbEJ5dGVzID0gKHRoaXMuYmxvY2tTaXplIC0gaW5wdXRMZW5ndGgpICUgdGhpcy5ibG9ja1NpemU7XG4gICAgaWYocGFydGlhbEJ5dGVzID4gMCkge1xuICAgICAgcGFydGlhbEJ5dGVzID0gdGhpcy5ibG9ja1NpemUgLSBwYXJ0aWFsQnl0ZXM7XG4gICAgfVxuXG4gICAgLy8gWE9SIGlucHV0IHdpdGggb3V0cHV0XG4gICAgdGhpcy5fcGFydGlhbE91dHB1dC5jbGVhcigpO1xuICAgIGZvcih2YXIgaSA9IDA7IGkgPCB0aGlzLl9pbnRzOyArK2kpIHtcbiAgICAgIHRoaXMuX3BhcnRpYWxPdXRwdXQucHV0SW50MzIoaW5wdXQuZ2V0SW50MzIoKSBeIHRoaXMuX291dEJsb2NrW2ldKTtcbiAgICB9XG5cbiAgICBpZihwYXJ0aWFsQnl0ZXMgPiAwKSB7XG4gICAgICAvLyBibG9jayBzdGlsbCBpbmNvbXBsZXRlLCByZXN0b3JlIGlucHV0IGJ1ZmZlclxuICAgICAgaW5wdXQucmVhZCAtPSB0aGlzLmJsb2NrU2l6ZTtcbiAgICB9XG5cbiAgICAvLyBza2lwIGFueSBwcmV2aW91cyBwYXJ0aWFsIGJ5dGVzXG4gICAgaWYodGhpcy5fcGFydGlhbEJ5dGVzID4gMCkge1xuICAgICAgdGhpcy5fcGFydGlhbE91dHB1dC5nZXRCeXRlcyh0aGlzLl9wYXJ0aWFsQnl0ZXMpO1xuICAgIH1cblxuICAgIGlmKHBhcnRpYWxCeXRlcyA+IDAgJiYgIWZpbmlzaCkge1xuICAgICAgb3V0cHV0LnB1dEJ5dGVzKHRoaXMuX3BhcnRpYWxPdXRwdXQuZ2V0Qnl0ZXMoXG4gICAgICAgIHBhcnRpYWxCeXRlcyAtIHRoaXMuX3BhcnRpYWxCeXRlcykpO1xuICAgICAgdGhpcy5fcGFydGlhbEJ5dGVzID0gcGFydGlhbEJ5dGVzO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgb3V0cHV0LnB1dEJ5dGVzKHRoaXMuX3BhcnRpYWxPdXRwdXQuZ2V0Qnl0ZXMoXG4gICAgICBpbnB1dExlbmd0aCAtIHRoaXMuX3BhcnRpYWxCeXRlcykpO1xuICAgIHRoaXMuX3BhcnRpYWxCeXRlcyA9IDA7XG4gIH1cblxuICAvLyBibG9jayBjb21wbGV0ZSwgaW5jcmVtZW50IGNvdW50ZXIgKGlucHV0IGJsb2NrKVxuICBpbmMzMih0aGlzLl9pbkJsb2NrKTtcbn07XG5cbm1vZGVzLmN0ci5wcm90b3R5cGUuZGVjcnlwdCA9IG1vZGVzLmN0ci5wcm90b3R5cGUuZW5jcnlwdDtcblxuLyoqIEdhbG9pcy9Db3VudGVyIE1vZGUgKEdDTSkgKiovXG5cbm1vZGVzLmdjbSA9IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIHRoaXMubmFtZSA9ICdHQ00nO1xuICB0aGlzLmNpcGhlciA9IG9wdGlvbnMuY2lwaGVyO1xuICB0aGlzLmJsb2NrU2l6ZSA9IG9wdGlvbnMuYmxvY2tTaXplIHx8IDE2O1xuICB0aGlzLl9pbnRzID0gdGhpcy5ibG9ja1NpemUgLyA0O1xuICB0aGlzLl9pbkJsb2NrID0gbmV3IEFycmF5KHRoaXMuX2ludHMpO1xuICB0aGlzLl9vdXRCbG9jayA9IG5ldyBBcnJheSh0aGlzLl9pbnRzKTtcbiAgdGhpcy5fcGFydGlhbE91dHB1dCA9IGZvcmdlLnV0aWwuY3JlYXRlQnVmZmVyKCk7XG4gIHRoaXMuX3BhcnRpYWxCeXRlcyA9IDA7XG5cbiAgLy8gUiBpcyBhY3R1YWxseSB0aGlzIHZhbHVlIGNvbmNhdGVuYXRlZCB3aXRoIDEyMCBtb3JlIHplcm8gYml0cywgYnV0XG4gIC8vIHdlIG9ubHkgWE9SIGFnYWluc3QgUiBzbyB0aGUgb3RoZXIgemVyb3MgaGF2ZSBubyBlZmZlY3QgLS0gd2UganVzdFxuICAvLyBhcHBseSB0aGlzIHZhbHVlIHRvIHRoZSBmaXJzdCBpbnRlZ2VyIGluIGEgYmxvY2tcbiAgdGhpcy5fUiA9IDB4RTEwMDAwMDA7XG59O1xuXG5tb2Rlcy5nY20ucHJvdG90eXBlLnN0YXJ0ID0gZnVuY3Rpb24ob3B0aW9ucykge1xuICBpZighKCdpdicgaW4gb3B0aW9ucykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgSVYgcGFyYW1ldGVyLicpO1xuICB9XG4gIC8vIGVuc3VyZSBJViBpcyBhIGJ5dGUgYnVmZmVyXG4gIHZhciBpdiA9IGZvcmdlLnV0aWwuY3JlYXRlQnVmZmVyKG9wdGlvbnMuaXYpO1xuXG4gIC8vIG5vIGNpcGhlcmVkIGRhdGEgcHJvY2Vzc2VkIHlldFxuICB0aGlzLl9jaXBoZXJMZW5ndGggPSAwO1xuXG4gIC8vIGRlZmF1bHQgYWRkaXRpb25hbCBkYXRhIGlzIG5vbmVcbiAgdmFyIGFkZGl0aW9uYWxEYXRhO1xuICBpZignYWRkaXRpb25hbERhdGEnIGluIG9wdGlvbnMpIHtcbiAgICBhZGRpdGlvbmFsRGF0YSA9IGZvcmdlLnV0aWwuY3JlYXRlQnVmZmVyKG9wdGlvbnMuYWRkaXRpb25hbERhdGEpO1xuICB9IGVsc2Uge1xuICAgIGFkZGl0aW9uYWxEYXRhID0gZm9yZ2UudXRpbC5jcmVhdGVCdWZmZXIoKTtcbiAgfVxuXG4gIC8vIGRlZmF1bHQgdGFnIGxlbmd0aCBpcyAxMjggYml0c1xuICBpZigndGFnTGVuZ3RoJyBpbiBvcHRpb25zKSB7XG4gICAgdGhpcy5fdGFnTGVuZ3RoID0gb3B0aW9ucy50YWdMZW5ndGg7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5fdGFnTGVuZ3RoID0gMTI4O1xuICB9XG5cbiAgLy8gaWYgdGFnIGlzIGdpdmVuLCBlbnN1cmUgdGFnIG1hdGNoZXMgdGFnIGxlbmd0aFxuICB0aGlzLl90YWcgPSBudWxsO1xuICBpZihvcHRpb25zLmRlY3J5cHQpIHtcbiAgICAvLyBzYXZlIHRhZyB0byBjaGVjayBsYXRlclxuICAgIHRoaXMuX3RhZyA9IGZvcmdlLnV0aWwuY3JlYXRlQnVmZmVyKG9wdGlvbnMudGFnKS5nZXRCeXRlcygpO1xuICAgIGlmKHRoaXMuX3RhZy5sZW5ndGggIT09ICh0aGlzLl90YWdMZW5ndGggLyA4KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBdXRoZW50aWNhdGlvbiB0YWcgZG9lcyBub3QgbWF0Y2ggdGFnIGxlbmd0aC4nKTtcbiAgICB9XG4gIH1cblxuICAvLyBjcmVhdGUgdG1wIHN0b3JhZ2UgZm9yIGhhc2ggY2FsY3VsYXRpb25cbiAgdGhpcy5faGFzaEJsb2NrID0gbmV3IEFycmF5KHRoaXMuX2ludHMpO1xuXG4gIC8vIG5vIHRhZyBnZW5lcmF0ZWQgeWV0XG4gIHRoaXMudGFnID0gbnVsbDtcblxuICAvLyBnZW5lcmF0ZSBoYXNoIHN1YmtleVxuICAvLyAoYXBwbHkgYmxvY2sgY2lwaGVyIHRvIFwiemVyb1wiIGJsb2NrKVxuICB0aGlzLl9oYXNoU3Via2V5ID0gbmV3IEFycmF5KHRoaXMuX2ludHMpO1xuICB0aGlzLmNpcGhlci5lbmNyeXB0KFswLCAwLCAwLCAwXSwgdGhpcy5faGFzaFN1YmtleSk7XG5cbiAgLy8gZ2VuZXJhdGUgdGFibGUgTVxuICAvLyB1c2UgNC1iaXQgdGFibGVzICgzMiBjb21wb25lbnQgZGVjb21wb3NpdGlvbiBvZiBhIDE2IGJ5dGUgdmFsdWUpXG4gIC8vIDgtYml0IHRhYmxlcyB0YWtlIG1vcmUgc3BhY2UgYW5kIGFyZSBrbm93biB0byBoYXZlIHNlY3VyaXR5XG4gIC8vIHZ1bG5lcmFiaWxpdGllcyAoaW4gbmF0aXZlIGltcGxlbWVudGF0aW9ucylcbiAgdGhpcy5jb21wb25lbnRCaXRzID0gNDtcbiAgdGhpcy5fbSA9IHRoaXMuZ2VuZXJhdGVIYXNoVGFibGUodGhpcy5faGFzaFN1YmtleSwgdGhpcy5jb21wb25lbnRCaXRzKTtcblxuICAvLyBOb3RlOiBzdXBwb3J0IElWIGxlbmd0aCBkaWZmZXJlbnQgZnJvbSA5NiBiaXRzPyAob25seSBzdXBwb3J0aW5nXG4gIC8vIDk2IGJpdHMgaXMgcmVjb21tZW5kZWQgYnkgTklTVCBTUC04MDAtMzhEKVxuICAvLyBnZW5lcmF0ZSBKXzBcbiAgdmFyIGl2TGVuZ3RoID0gaXYubGVuZ3RoKCk7XG4gIGlmKGl2TGVuZ3RoID09PSAxMikge1xuICAgIC8vIDk2LWJpdCBJVlxuICAgIHRoaXMuX2owID0gW2l2LmdldEludDMyKCksIGl2LmdldEludDMyKCksIGl2LmdldEludDMyKCksIDFdO1xuICB9IGVsc2Uge1xuICAgIC8vIElWIGlzIE5PVCA5Ni1iaXRzXG4gICAgdGhpcy5fajAgPSBbMCwgMCwgMCwgMF07XG4gICAgd2hpbGUoaXYubGVuZ3RoKCkgPiAwKSB7XG4gICAgICB0aGlzLl9qMCA9IHRoaXMuZ2hhc2goXG4gICAgICAgIHRoaXMuX2hhc2hTdWJrZXksIHRoaXMuX2owLFxuICAgICAgICBbaXYuZ2V0SW50MzIoKSwgaXYuZ2V0SW50MzIoKSwgaXYuZ2V0SW50MzIoKSwgaXYuZ2V0SW50MzIoKV0pO1xuICAgIH1cbiAgICB0aGlzLl9qMCA9IHRoaXMuZ2hhc2goXG4gICAgICB0aGlzLl9oYXNoU3Via2V5LCB0aGlzLl9qMCwgWzAsIDBdLmNvbmNhdChmcm9tNjRUbzMyKGl2TGVuZ3RoICogOCkpKTtcbiAgfVxuXG4gIC8vIGdlbmVyYXRlIElDQiAoaW5pdGlhbCBjb3VudGVyIGJsb2NrKVxuICB0aGlzLl9pbkJsb2NrID0gdGhpcy5fajAuc2xpY2UoMCk7XG4gIGluYzMyKHRoaXMuX2luQmxvY2spO1xuICB0aGlzLl9wYXJ0aWFsQnl0ZXMgPSAwO1xuXG4gIC8vIGNvbnN1bWUgYXV0aGVudGljYXRpb24gZGF0YVxuICBhZGRpdGlvbmFsRGF0YSA9IGZvcmdlLnV0aWwuY3JlYXRlQnVmZmVyKGFkZGl0aW9uYWxEYXRhKTtcbiAgLy8gc2F2ZSBhZGRpdGlvbmFsIGRhdGEgbGVuZ3RoIGFzIGEgQkUgNjQtYml0IG51bWJlclxuICB0aGlzLl9hRGF0YUxlbmd0aCA9IGZyb202NFRvMzIoYWRkaXRpb25hbERhdGEubGVuZ3RoKCkgKiA4KTtcbiAgLy8gcGFkIGFkZGl0aW9uYWwgZGF0YSB0byAxMjggYml0ICgxNiBieXRlKSBibG9jayBzaXplXG4gIHZhciBvdmVyZmxvdyA9IGFkZGl0aW9uYWxEYXRhLmxlbmd0aCgpICUgdGhpcy5ibG9ja1NpemU7XG4gIGlmKG92ZXJmbG93KSB7XG4gICAgYWRkaXRpb25hbERhdGEuZmlsbFdpdGhCeXRlKDAsIHRoaXMuYmxvY2tTaXplIC0gb3ZlcmZsb3cpO1xuICB9XG4gIHRoaXMuX3MgPSBbMCwgMCwgMCwgMF07XG4gIHdoaWxlKGFkZGl0aW9uYWxEYXRhLmxlbmd0aCgpID4gMCkge1xuICAgIHRoaXMuX3MgPSB0aGlzLmdoYXNoKHRoaXMuX2hhc2hTdWJrZXksIHRoaXMuX3MsIFtcbiAgICAgIGFkZGl0aW9uYWxEYXRhLmdldEludDMyKCksXG4gICAgICBhZGRpdGlvbmFsRGF0YS5nZXRJbnQzMigpLFxuICAgICAgYWRkaXRpb25hbERhdGEuZ2V0SW50MzIoKSxcbiAgICAgIGFkZGl0aW9uYWxEYXRhLmdldEludDMyKClcbiAgICBdKTtcbiAgfVxufTtcblxubW9kZXMuZ2NtLnByb3RvdHlwZS5lbmNyeXB0ID0gZnVuY3Rpb24oaW5wdXQsIG91dHB1dCwgZmluaXNoKSB7XG4gIC8vIG5vdCBlbm91Z2ggaW5wdXQgdG8gZW5jcnlwdFxuICB2YXIgaW5wdXRMZW5ndGggPSBpbnB1dC5sZW5ndGgoKTtcbiAgaWYoaW5wdXRMZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vIGVuY3J5cHQgYmxvY2tcbiAgdGhpcy5jaXBoZXIuZW5jcnlwdCh0aGlzLl9pbkJsb2NrLCB0aGlzLl9vdXRCbG9jayk7XG5cbiAgLy8gaGFuZGxlIGZ1bGwgYmxvY2tcbiAgaWYodGhpcy5fcGFydGlhbEJ5dGVzID09PSAwICYmIGlucHV0TGVuZ3RoID49IHRoaXMuYmxvY2tTaXplKSB7XG4gICAgLy8gWE9SIGlucHV0IHdpdGggb3V0cHV0XG4gICAgZm9yKHZhciBpID0gMDsgaSA8IHRoaXMuX2ludHM7ICsraSkge1xuICAgICAgb3V0cHV0LnB1dEludDMyKHRoaXMuX291dEJsb2NrW2ldIF49IGlucHV0LmdldEludDMyKCkpO1xuICAgIH1cbiAgICB0aGlzLl9jaXBoZXJMZW5ndGggKz0gdGhpcy5ibG9ja1NpemU7XG4gIH0gZWxzZSB7XG4gICAgLy8gaGFuZGxlIHBhcnRpYWwgYmxvY2tcbiAgICB2YXIgcGFydGlhbEJ5dGVzID0gKHRoaXMuYmxvY2tTaXplIC0gaW5wdXRMZW5ndGgpICUgdGhpcy5ibG9ja1NpemU7XG4gICAgaWYocGFydGlhbEJ5dGVzID4gMCkge1xuICAgICAgcGFydGlhbEJ5dGVzID0gdGhpcy5ibG9ja1NpemUgLSBwYXJ0aWFsQnl0ZXM7XG4gICAgfVxuXG4gICAgLy8gWE9SIGlucHV0IHdpdGggb3V0cHV0XG4gICAgdGhpcy5fcGFydGlhbE91dHB1dC5jbGVhcigpO1xuICAgIGZvcih2YXIgaSA9IDA7IGkgPCB0aGlzLl9pbnRzOyArK2kpIHtcbiAgICAgIHRoaXMuX3BhcnRpYWxPdXRwdXQucHV0SW50MzIoaW5wdXQuZ2V0SW50MzIoKSBeIHRoaXMuX291dEJsb2NrW2ldKTtcbiAgICB9XG5cbiAgICBpZihwYXJ0aWFsQnl0ZXMgPD0gMCB8fCBmaW5pc2gpIHtcbiAgICAgIC8vIGhhbmRsZSBvdmVyZmxvdyBwcmlvciB0byBoYXNoaW5nXG4gICAgICBpZihmaW5pc2gpIHtcbiAgICAgICAgLy8gZ2V0IGJsb2NrIG92ZXJmbG93XG4gICAgICAgIHZhciBvdmVyZmxvdyA9IGlucHV0TGVuZ3RoICUgdGhpcy5ibG9ja1NpemU7XG4gICAgICAgIHRoaXMuX2NpcGhlckxlbmd0aCArPSBvdmVyZmxvdztcbiAgICAgICAgLy8gdHJ1bmNhdGUgZm9yIGhhc2ggZnVuY3Rpb25cbiAgICAgICAgdGhpcy5fcGFydGlhbE91dHB1dC50cnVuY2F0ZSh0aGlzLmJsb2NrU2l6ZSAtIG92ZXJmbG93KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2NpcGhlckxlbmd0aCArPSB0aGlzLmJsb2NrU2l6ZTtcbiAgICAgIH1cblxuICAgICAgLy8gZ2V0IG91dHB1dCBibG9jayBmb3IgaGFzaGluZ1xuICAgICAgZm9yKHZhciBpID0gMDsgaSA8IHRoaXMuX2ludHM7ICsraSkge1xuICAgICAgICB0aGlzLl9vdXRCbG9ja1tpXSA9IHRoaXMuX3BhcnRpYWxPdXRwdXQuZ2V0SW50MzIoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX3BhcnRpYWxPdXRwdXQucmVhZCAtPSB0aGlzLmJsb2NrU2l6ZTtcbiAgICB9XG5cbiAgICAvLyBza2lwIGFueSBwcmV2aW91cyBwYXJ0aWFsIGJ5dGVzXG4gICAgaWYodGhpcy5fcGFydGlhbEJ5dGVzID4gMCkge1xuICAgICAgdGhpcy5fcGFydGlhbE91dHB1dC5nZXRCeXRlcyh0aGlzLl9wYXJ0aWFsQnl0ZXMpO1xuICAgIH1cblxuICAgIGlmKHBhcnRpYWxCeXRlcyA+IDAgJiYgIWZpbmlzaCkge1xuICAgICAgLy8gYmxvY2sgc3RpbGwgaW5jb21wbGV0ZSwgcmVzdG9yZSBpbnB1dCBidWZmZXIsIGdldCBwYXJ0aWFsIG91dHB1dCxcbiAgICAgIC8vIGFuZCByZXR1cm4gZWFybHlcbiAgICAgIGlucHV0LnJlYWQgLT0gdGhpcy5ibG9ja1NpemU7XG4gICAgICBvdXRwdXQucHV0Qnl0ZXModGhpcy5fcGFydGlhbE91dHB1dC5nZXRCeXRlcyhcbiAgICAgICAgcGFydGlhbEJ5dGVzIC0gdGhpcy5fcGFydGlhbEJ5dGVzKSk7XG4gICAgICB0aGlzLl9wYXJ0aWFsQnl0ZXMgPSBwYXJ0aWFsQnl0ZXM7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBvdXRwdXQucHV0Qnl0ZXModGhpcy5fcGFydGlhbE91dHB1dC5nZXRCeXRlcyhcbiAgICAgIGlucHV0TGVuZ3RoIC0gdGhpcy5fcGFydGlhbEJ5dGVzKSk7XG4gICAgdGhpcy5fcGFydGlhbEJ5dGVzID0gMDtcbiAgfVxuXG4gIC8vIHVwZGF0ZSBoYXNoIGJsb2NrIFNcbiAgdGhpcy5fcyA9IHRoaXMuZ2hhc2godGhpcy5faGFzaFN1YmtleSwgdGhpcy5fcywgdGhpcy5fb3V0QmxvY2spO1xuXG4gIC8vIGluY3JlbWVudCBjb3VudGVyIChpbnB1dCBibG9jaylcbiAgaW5jMzIodGhpcy5faW5CbG9jayk7XG59O1xuXG5tb2Rlcy5nY20ucHJvdG90eXBlLmRlY3J5cHQgPSBmdW5jdGlvbihpbnB1dCwgb3V0cHV0LCBmaW5pc2gpIHtcbiAgLy8gbm90IGVub3VnaCBpbnB1dCB0byBkZWNyeXB0XG4gIHZhciBpbnB1dExlbmd0aCA9IGlucHV0Lmxlbmd0aCgpO1xuICBpZihpbnB1dExlbmd0aCA8IHRoaXMuYmxvY2tTaXplICYmICEoZmluaXNoICYmIGlucHV0TGVuZ3RoID4gMCkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vIGVuY3J5cHQgYmxvY2sgKEdDTSBhbHdheXMgdXNlcyBlbmNyeXB0aW9uIG1vZGUpXG4gIHRoaXMuY2lwaGVyLmVuY3J5cHQodGhpcy5faW5CbG9jaywgdGhpcy5fb3V0QmxvY2spO1xuXG4gIC8vIGluY3JlbWVudCBjb3VudGVyIChpbnB1dCBibG9jaylcbiAgaW5jMzIodGhpcy5faW5CbG9jayk7XG5cbiAgLy8gdXBkYXRlIGhhc2ggYmxvY2sgU1xuICB0aGlzLl9oYXNoQmxvY2tbMF0gPSBpbnB1dC5nZXRJbnQzMigpO1xuICB0aGlzLl9oYXNoQmxvY2tbMV0gPSBpbnB1dC5nZXRJbnQzMigpO1xuICB0aGlzLl9oYXNoQmxvY2tbMl0gPSBpbnB1dC5nZXRJbnQzMigpO1xuICB0aGlzLl9oYXNoQmxvY2tbM10gPSBpbnB1dC5nZXRJbnQzMigpO1xuICB0aGlzLl9zID0gdGhpcy5naGFzaCh0aGlzLl9oYXNoU3Via2V5LCB0aGlzLl9zLCB0aGlzLl9oYXNoQmxvY2spO1xuXG4gIC8vIFhPUiBoYXNoIGlucHV0IHdpdGggb3V0cHV0XG4gIGZvcih2YXIgaSA9IDA7IGkgPCB0aGlzLl9pbnRzOyArK2kpIHtcbiAgICBvdXRwdXQucHV0SW50MzIodGhpcy5fb3V0QmxvY2tbaV0gXiB0aGlzLl9oYXNoQmxvY2tbaV0pO1xuICB9XG5cbiAgLy8gaW5jcmVtZW50IGNpcGhlciBkYXRhIGxlbmd0aFxuICBpZihpbnB1dExlbmd0aCA8IHRoaXMuYmxvY2tTaXplKSB7XG4gICAgdGhpcy5fY2lwaGVyTGVuZ3RoICs9IGlucHV0TGVuZ3RoICUgdGhpcy5ibG9ja1NpemU7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5fY2lwaGVyTGVuZ3RoICs9IHRoaXMuYmxvY2tTaXplO1xuICB9XG59O1xuXG5tb2Rlcy5nY20ucHJvdG90eXBlLmFmdGVyRmluaXNoID0gZnVuY3Rpb24ob3V0cHV0LCBvcHRpb25zKSB7XG4gIHZhciBydmFsID0gdHJ1ZTtcblxuICAvLyBoYW5kbGUgb3ZlcmZsb3dcbiAgaWYob3B0aW9ucy5kZWNyeXB0ICYmIG9wdGlvbnMub3ZlcmZsb3cpIHtcbiAgICBvdXRwdXQudHJ1bmNhdGUodGhpcy5ibG9ja1NpemUgLSBvcHRpb25zLm92ZXJmbG93KTtcbiAgfVxuXG4gIC8vIGhhbmRsZSBhdXRoZW50aWNhdGlvbiB0YWdcbiAgdGhpcy50YWcgPSBmb3JnZS51dGlsLmNyZWF0ZUJ1ZmZlcigpO1xuXG4gIC8vIGNvbmNhdGVuYXRlIGFkZGl0aW9uYWwgZGF0YSBsZW5ndGggd2l0aCBjaXBoZXIgbGVuZ3RoXG4gIHZhciBsZW5ndGhzID0gdGhpcy5fYURhdGFMZW5ndGguY29uY2F0KGZyb202NFRvMzIodGhpcy5fY2lwaGVyTGVuZ3RoICogOCkpO1xuXG4gIC8vIGluY2x1ZGUgbGVuZ3RocyBpbiBoYXNoXG4gIHRoaXMuX3MgPSB0aGlzLmdoYXNoKHRoaXMuX2hhc2hTdWJrZXksIHRoaXMuX3MsIGxlbmd0aHMpO1xuXG4gIC8vIGRvIEdDVFIoSl8wLCBTKVxuICB2YXIgdGFnID0gW107XG4gIHRoaXMuY2lwaGVyLmVuY3J5cHQodGhpcy5fajAsIHRhZyk7XG4gIGZvcih2YXIgaSA9IDA7IGkgPCB0aGlzLl9pbnRzOyArK2kpIHtcbiAgICB0aGlzLnRhZy5wdXRJbnQzMih0aGlzLl9zW2ldIF4gdGFnW2ldKTtcbiAgfVxuXG4gIC8vIHRyaW0gdGFnIHRvIGxlbmd0aFxuICB0aGlzLnRhZy50cnVuY2F0ZSh0aGlzLnRhZy5sZW5ndGgoKSAlICh0aGlzLl90YWdMZW5ndGggLyA4KSk7XG5cbiAgLy8gY2hlY2sgYXV0aGVudGljYXRpb24gdGFnXG4gIGlmKG9wdGlvbnMuZGVjcnlwdCAmJiB0aGlzLnRhZy5ieXRlcygpICE9PSB0aGlzLl90YWcpIHtcbiAgICBydmFsID0gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gcnZhbDtcbn07XG5cbi8qKlxuICogU2VlIE5JU1QgU1AtODAwLTM4RCA2LjMgKEFsZ29yaXRobSAxKS4gVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBHYWxvaXNcbiAqIGZpZWxkIG11bHRpcGxpY2F0aW9uLiBUaGUgZmllbGQsIEdGKDJeMTI4KSwgaXMgZGVmaW5lZCBieSB0aGUgcG9seW5vbWlhbDpcbiAqXG4gKiB4XjEyOCArIHheNyArIHheMiArIHggKyAxXG4gKlxuICogV2hpY2ggaXMgcmVwcmVzZW50ZWQgaW4gbGl0dGxlLWVuZGlhbiBiaW5hcnkgZm9ybSBhczogMTExMDAwMDEgKDB4ZTEpLiBXaGVuXG4gKiB0aGUgdmFsdWUgb2YgYSBjb2VmZmljaWVudCBpcyAxLCBhIGJpdCBpcyBzZXQuIFRoZSB2YWx1ZSBSLCBpcyB0aGVcbiAqIGNvbmNhdGVuYXRpb24gb2YgdGhpcyB2YWx1ZSBhbmQgMTIwIHplcm8gYml0cywgeWllbGRpbmcgYSAxMjgtYml0IHZhbHVlXG4gKiB3aGljaCBtYXRjaGVzIHRoZSBibG9jayBzaXplLlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gd2lsbCBtdWx0aXBseSB0d28gZWxlbWVudHMgKHZlY3RvcnMgb2YgYnl0ZXMpLCBYIGFuZCBZLCBpblxuICogdGhlIGZpZWxkIEdGKDJeMTI4KS4gVGhlIHJlc3VsdCBpcyBpbml0aWFsaXplZCB0byB6ZXJvLiBGb3IgZWFjaCBiaXQgb2ZcbiAqIFggKG91dCBvZiAxMjgpLCB4X2ksIGlmIHhfaSBpcyBzZXQsIHRoZW4gdGhlIHJlc3VsdCBpcyBtdWx0aXBsaWVkIChYT1InZClcbiAqIGJ5IHRoZSBjdXJyZW50IHZhbHVlIG9mIFkuIEZvciBlYWNoIGJpdCwgdGhlIHZhbHVlIG9mIFkgd2lsbCBiZSByYWlzZWQgYnlcbiAqIGEgcG93ZXIgb2YgeCAobXVsdGlwbGllZCBieSB0aGUgcG9seW5vbWlhbCB4KS4gVGhpcyBjYW4gYmUgYWNoaWV2ZWQgYnlcbiAqIHNoaWZ0aW5nIFkgb25jZSB0byB0aGUgcmlnaHQuIElmIHRoZSBjdXJyZW50IHZhbHVlIG9mIFksIHByaW9yIHRvIGJlaW5nXG4gKiBtdWx0aXBsaWVkIGJ5IHgsIGhhcyAwIGFzIGl0cyBMU0IsIHRoZW4gaXQgaXMgYSAxMjd0aCBkZWdyZWUgcG9seW5vbWlhbC5cbiAqIE90aGVyd2lzZSwgd2UgbXVzdCBkaXZpZGUgYnkgUiBhZnRlciBzaGlmdGluZyB0byBmaW5kIHRoZSByZW1haW5kZXIuXG4gKlxuICogQHBhcmFtIHggdGhlIGZpcnN0IGJsb2NrIHRvIG11bHRpcGx5IGJ5IHRoZSBzZWNvbmQuXG4gKiBAcGFyYW0geSB0aGUgc2Vjb25kIGJsb2NrIHRvIG11bHRpcGx5IGJ5IHRoZSBmaXJzdC5cbiAqXG4gKiBAcmV0dXJuIHRoZSBibG9jayByZXN1bHQgb2YgdGhlIG11bHRpcGxpY2F0aW9uLlxuICovXG5tb2Rlcy5nY20ucHJvdG90eXBlLm11bHRpcGx5ID0gZnVuY3Rpb24oeCwgeSkge1xuICB2YXIgel9pID0gWzAsIDAsIDAsIDBdO1xuICB2YXIgdl9pID0geS5zbGljZSgwKTtcblxuICAvLyBjYWxjdWxhdGUgWl8xMjggKGJsb2NrIGhhcyAxMjggYml0cylcbiAgZm9yKHZhciBpID0gMDsgaSA8IDEyODsgKytpKSB7XG4gICAgLy8gaWYgeF9pIGlzIDAsIFpfe2krMX0gPSBaX2kgKHVuY2hhbmdlZClcbiAgICAvLyBlbHNlIFpfe2krMX0gPSBaX2kgXiBWX2lcbiAgICAvLyBnZXQgeF9pIGJ5IGZpbmRpbmcgMzItYml0IGludCBwb3NpdGlvbiwgdGhlbiBsZWZ0IHNoaWZ0IDEgYnkgcmVtYWluZGVyXG4gICAgdmFyIHhfaSA9IHhbKGkgLyAzMikgfCAwXSAmICgxIDw8ICgzMSAtIGkgJSAzMikpO1xuICAgIGlmKHhfaSkge1xuICAgICAgel9pWzBdIF49IHZfaVswXTtcbiAgICAgIHpfaVsxXSBePSB2X2lbMV07XG4gICAgICB6X2lbMl0gXj0gdl9pWzJdO1xuICAgICAgel9pWzNdIF49IHZfaVszXTtcbiAgICB9XG5cbiAgICAvLyBpZiBMU0IoVl9pKSBpcyAxLCBWX2kgPSBWX2kgPj4gMVxuICAgIC8vIGVsc2UgVl9pID0gKFZfaSA+PiAxKSBeIFJcbiAgICB0aGlzLnBvdyh2X2ksIHZfaSk7XG4gIH1cblxuICByZXR1cm4gel9pO1xufTtcblxubW9kZXMuZ2NtLnByb3RvdHlwZS5wb3cgPSBmdW5jdGlvbih4LCBvdXQpIHtcbiAgLy8gaWYgTFNCKHgpIGlzIDEsIHggPSB4ID4+PiAxXG4gIC8vIGVsc2UgeCA9ICh4ID4+PiAxKSBeIFJcbiAgdmFyIGxzYiA9IHhbM10gJiAxO1xuXG4gIC8vIGFsd2F5cyBkbyB4ID4+PiAxOlxuICAvLyBzdGFydGluZyB3aXRoIHRoZSByaWdodG1vc3QgaW50ZWdlciwgc2hpZnQgZWFjaCBpbnRlZ2VyIHRvIHRoZSByaWdodFxuICAvLyBvbmUgYml0LCBwdWxsaW5nIGluIHRoZSBiaXQgZnJvbSB0aGUgaW50ZWdlciB0byB0aGUgbGVmdCBhcyBpdHMgdG9wXG4gIC8vIG1vc3QgYml0IChkbyB0aGlzIGZvciB0aGUgbGFzdCAzIGludGVnZXJzKVxuICBmb3IodmFyIGkgPSAzOyBpID4gMDsgLS1pKSB7XG4gICAgb3V0W2ldID0gKHhbaV0gPj4+IDEpIHwgKCh4W2kgLSAxXSAmIDEpIDw8IDMxKTtcbiAgfVxuICAvLyBzaGlmdCB0aGUgZmlyc3QgaW50ZWdlciBub3JtYWxseVxuICBvdXRbMF0gPSB4WzBdID4+PiAxO1xuXG4gIC8vIGlmIGxzYiB3YXMgbm90IHNldCwgdGhlbiBwb2x5bm9taWFsIGhhZCBhIGRlZ3JlZSBvZiAxMjcgYW5kIGRvZXNuJ3RcbiAgLy8gbmVlZCB0byBkaXZpZGVkOyBvdGhlcndpc2UsIFhPUiB3aXRoIFIgdG8gZmluZCB0aGUgcmVtYWluZGVyOyB3ZSBvbmx5XG4gIC8vIG5lZWQgdG8gWE9SIHRoZSBmaXJzdCBpbnRlZ2VyIHNpbmNlIFIgdGVjaG5pY2FsbHkgZW5kcyB3LzEyMCB6ZXJvIGJpdHNcbiAgaWYobHNiKSB7XG4gICAgb3V0WzBdIF49IHRoaXMuX1I7XG4gIH1cbn07XG5cbm1vZGVzLmdjbS5wcm90b3R5cGUudGFibGVNdWx0aXBseSA9IGZ1bmN0aW9uKHgpIHtcbiAgLy8gYXNzdW1lcyA0LWJpdCB0YWJsZXMgYXJlIHVzZWRcbiAgdmFyIHogPSBbMCwgMCwgMCwgMF07XG4gIGZvcih2YXIgaSA9IDA7IGkgPCAzMjsgKytpKSB7XG4gICAgdmFyIGlkeCA9IChpIC8gOCkgfCAwO1xuICAgIHZhciB4X2kgPSAoeFtpZHhdID4+PiAoKDcgLSAoaSAlIDgpKSAqIDQpKSAmIDB4RjtcbiAgICB2YXIgYWggPSB0aGlzLl9tW2ldW3hfaV07XG4gICAgelswXSBePSBhaFswXTtcbiAgICB6WzFdIF49IGFoWzFdO1xuICAgIHpbMl0gXj0gYWhbMl07XG4gICAgelszXSBePSBhaFszXTtcbiAgfVxuICByZXR1cm4gejtcbn07XG5cbi8qKlxuICogQSBjb250aW51aW5nIHZlcnNpb24gb2YgdGhlIEdIQVNIIGFsZ29yaXRobSB0aGF0IG9wZXJhdGVzIG9uIGEgc2luZ2xlXG4gKiBibG9jay4gVGhlIGhhc2ggYmxvY2ssIGxhc3QgaGFzaCB2YWx1ZSAoWW0pIGFuZCB0aGUgbmV3IGJsb2NrIHRvIGhhc2hcbiAqIGFyZSBnaXZlbi5cbiAqXG4gKiBAcGFyYW0gaCB0aGUgaGFzaCBibG9jay5cbiAqIEBwYXJhbSB5IHRoZSBwcmV2aW91cyB2YWx1ZSBmb3IgWW0sIHVzZSBbMCwgMCwgMCwgMF0gZm9yIGEgbmV3IGhhc2guXG4gKiBAcGFyYW0geCB0aGUgYmxvY2sgdG8gaGFzaC5cbiAqXG4gKiBAcmV0dXJuIHRoZSBoYXNoZWQgdmFsdWUgKFltKS5cbiAqL1xubW9kZXMuZ2NtLnByb3RvdHlwZS5naGFzaCA9IGZ1bmN0aW9uKGgsIHksIHgpIHtcbiAgeVswXSBePSB4WzBdO1xuICB5WzFdIF49IHhbMV07XG4gIHlbMl0gXj0geFsyXTtcbiAgeVszXSBePSB4WzNdO1xuICByZXR1cm4gdGhpcy50YWJsZU11bHRpcGx5KHkpO1xuICAvL3JldHVybiB0aGlzLm11bHRpcGx5KHksIGgpO1xufTtcblxuLyoqXG4gKiBQcmVjb21wdXRlcyBhIHRhYmxlIGZvciBtdWx0aXBseWluZyBhZ2FpbnN0IHRoZSBoYXNoIHN1YmtleS4gVGhpc1xuICogbWVjaGFuaXNtIHByb3ZpZGVzIGEgc3Vic3RhbnRpYWwgc3BlZWQgaW5jcmVhc2Ugb3ZlciBtdWx0aXBsaWNhdGlvblxuICogcGVyZm9ybWVkIHdpdGhvdXQgYSB0YWJsZS4gVGhlIHRhYmxlLWJhc2VkIG11bHRpcGxpY2F0aW9uIHRoaXMgdGFibGUgaXNcbiAqIGZvciBzb2x2ZXMgWCAqIEggYnkgbXVsdGlwbHlpbmcgZWFjaCBjb21wb25lbnQgb2YgWCBieSBIIGFuZCB0aGVuXG4gKiBjb21wb3NpbmcgdGhlIHJlc3VsdHMgdG9nZXRoZXIgdXNpbmcgWE9SLlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gZ2VuZXJhdGUgdGFibGVzIHdpdGggZGlmZmVyZW50IGJpdCBzaXplc1xuICogZm9yIHRoZSBjb21wb25lbnRzLCBob3dldmVyLCB0aGlzIGltcGxlbWVudGF0aW9uIGFzc3VtZXMgdGhlcmUgYXJlXG4gKiAzMiBjb21wb25lbnRzIG9mIFggKHdoaWNoIGlzIGEgMTYgYnl0ZSB2ZWN0b3IpLCB0aGVyZWZvcmUgZWFjaCBjb21wb25lbnRcbiAqIHRha2VzIDQtYml0cyAoc28gdGhlIHRhYmxlIGlzIGNvbnN0cnVjdGVkIHdpdGggYml0cz00KS5cbiAqXG4gKiBAcGFyYW0gaCB0aGUgaGFzaCBzdWJrZXkuXG4gKiBAcGFyYW0gYml0cyB0aGUgYml0IHNpemUgZm9yIGEgY29tcG9uZW50LlxuICovXG5tb2Rlcy5nY20ucHJvdG90eXBlLmdlbmVyYXRlSGFzaFRhYmxlID0gZnVuY3Rpb24oaCwgYml0cykge1xuICAvLyBUT0RPOiBUaGVyZSBhcmUgZnVydGhlciBvcHRpbWl6YXRpb25zIHRoYXQgd291bGQgdXNlIG9ubHkgdGhlXG4gIC8vIGZpcnN0IHRhYmxlIE1fMCAob3Igc29tZSB2YXJpYW50KSBhbG9uZyB3aXRoIGEgcmVtYWluZGVyIHRhYmxlO1xuICAvLyB0aGlzIGNhbiBiZSBleHBsb3JlZCBpbiB0aGUgZnV0dXJlXG4gIHZhciBtdWx0aXBsaWVyID0gOCAvIGJpdHM7XG4gIHZhciBwZXJJbnQgPSA0ICogbXVsdGlwbGllcjtcbiAgdmFyIHNpemUgPSAxNiAqIG11bHRpcGxpZXI7XG4gIHZhciBtID0gbmV3IEFycmF5KHNpemUpO1xuICBmb3IodmFyIGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7XG4gICAgdmFyIHRtcCA9IFswLCAwLCAwLCAwXTtcbiAgICB2YXIgaWR4ID0gKGkgLyBwZXJJbnQpIHwgMDtcbiAgICB2YXIgc2hmdCA9ICgocGVySW50IC0gMSAtIChpICUgcGVySW50KSkgKiBiaXRzKTtcbiAgICB0bXBbaWR4XSA9ICgxIDw8IChiaXRzIC0gMSkpIDw8IHNoZnQ7XG4gICAgbVtpXSA9IHRoaXMuZ2VuZXJhdGVTdWJIYXNoVGFibGUodGhpcy5tdWx0aXBseSh0bXAsIGgpLCBiaXRzKTtcbiAgfVxuICByZXR1cm4gbTtcbn07XG5cbi8qKlxuICogR2VuZXJhdGVzIGEgdGFibGUgZm9yIG11bHRpcGx5aW5nIGFnYWluc3QgdGhlIGhhc2ggc3Via2V5IGZvciBvbmVcbiAqIHBhcnRpY3VsYXIgY29tcG9uZW50IChvdXQgb2YgYWxsIHBvc3NpYmxlIGNvbXBvbmVudCB2YWx1ZXMpLlxuICpcbiAqIEBwYXJhbSBtaWQgdGhlIHByZS1tdWx0aXBsaWVkIHZhbHVlIGZvciB0aGUgbWlkZGxlIGtleSBvZiB0aGUgdGFibGUuXG4gKiBAcGFyYW0gYml0cyB0aGUgYml0IHNpemUgZm9yIGEgY29tcG9uZW50LlxuICovXG5tb2Rlcy5nY20ucHJvdG90eXBlLmdlbmVyYXRlU3ViSGFzaFRhYmxlID0gZnVuY3Rpb24obWlkLCBiaXRzKSB7XG4gIC8vIGNvbXB1dGUgdGhlIHRhYmxlIHF1aWNrbHkgYnkgbWluaW1pemluZyB0aGUgbnVtYmVyIG9mXG4gIC8vIFBPVyBvcGVyYXRpb25zIC0tIHRoZXkgb25seSBuZWVkIHRvIGJlIHBlcmZvcm1lZCBmb3IgcG93ZXJzIG9mIDIsXG4gIC8vIGFsbCBvdGhlciBlbnRyaWVzIGNhbiBiZSBjb21wb3NlZCBmcm9tIHRob3NlIHBvd2VycyB1c2luZyBYT1JcbiAgdmFyIHNpemUgPSAxIDw8IGJpdHM7XG4gIHZhciBoYWxmID0gc2l6ZSA+Pj4gMTtcbiAgdmFyIG0gPSBuZXcgQXJyYXkoc2l6ZSk7XG4gIG1baGFsZl0gPSBtaWQuc2xpY2UoMCk7XG4gIHZhciBpID0gaGFsZiA+Pj4gMTtcbiAgd2hpbGUoaSA+IDApIHtcbiAgICAvLyByYWlzZSBtMFsyICogaV0gYW5kIHN0b3JlIGluIG0wW2ldXG4gICAgdGhpcy5wb3cobVsyICogaV0sIG1baV0gPSBbXSk7XG4gICAgaSA+Pj0gMTtcbiAgfVxuICBpID0gMjtcbiAgd2hpbGUoaSA8IGhhbGYpIHtcbiAgICBmb3IodmFyIGogPSAxOyBqIDwgaTsgKytqKSB7XG4gICAgICB2YXIgbV9pID0gbVtpXTtcbiAgICAgIHZhciBtX2ogPSBtW2pdO1xuICAgICAgbVtpICsgal0gPSBbXG4gICAgICAgIG1faVswXSBeIG1falswXSxcbiAgICAgICAgbV9pWzFdIF4gbV9qWzFdLFxuICAgICAgICBtX2lbMl0gXiBtX2pbMl0sXG4gICAgICAgIG1faVszXSBeIG1falszXVxuICAgICAgXTtcbiAgICB9XG4gICAgaSAqPSAyO1xuICB9XG4gIG1bMF0gPSBbMCwgMCwgMCwgMF07XG4gIC8qIE5vdGU6IFdlIGNvdWxkIGF2b2lkIHN0b3JpbmcgdGhlc2UgYnkgZG9pbmcgY29tcG9zaXRpb24gZHVyaW5nIG11bHRpcGx5XG4gIGNhbGN1bGF0ZSB0b3AgaGFsZiB1c2luZyBjb21wb3NpdGlvbiBieSBzcGVlZCBpcyBwcmVmZXJyZWQuICovXG4gIGZvcihpID0gaGFsZiArIDE7IGkgPCBzaXplOyArK2kpIHtcbiAgICB2YXIgYyA9IG1baSBeIGhhbGZdO1xuICAgIG1baV0gPSBbbWlkWzBdIF4gY1swXSwgbWlkWzFdIF4gY1sxXSwgbWlkWzJdIF4gY1syXSwgbWlkWzNdIF4gY1szXV07XG4gIH1cbiAgcmV0dXJuIG07XG59O1xuXG4vKiogVXRpbGl0eSBmdW5jdGlvbnMgKi9cblxuZnVuY3Rpb24gdHJhbnNmb3JtSVYoaXYsIGJsb2NrU2l6ZSkge1xuICBpZih0eXBlb2YgaXYgPT09ICdzdHJpbmcnKSB7XG4gICAgLy8gY29udmVydCBpdiBzdHJpbmcgaW50byBieXRlIGJ1ZmZlclxuICAgIGl2ID0gZm9yZ2UudXRpbC5jcmVhdGVCdWZmZXIoaXYpO1xuICB9XG5cbiAgaWYoZm9yZ2UudXRpbC5pc0FycmF5KGl2KSAmJiBpdi5sZW5ndGggPiA0KSB7XG4gICAgLy8gY29udmVydCBpdiBieXRlIGFycmF5IGludG8gYnl0ZSBidWZmZXJcbiAgICB2YXIgdG1wID0gaXY7XG4gICAgaXYgPSBmb3JnZS51dGlsLmNyZWF0ZUJ1ZmZlcigpO1xuICAgIGZvcih2YXIgaSA9IDA7IGkgPCB0bXAubGVuZ3RoOyArK2kpIHtcbiAgICAgIGl2LnB1dEJ5dGUodG1wW2ldKTtcbiAgICB9XG4gIH1cblxuICBpZihpdi5sZW5ndGgoKSA8IGJsb2NrU2l6ZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICdJbnZhbGlkIElWIGxlbmd0aDsgZ290ICcgKyBpdi5sZW5ndGgoKSArXG4gICAgICAnIGJ5dGVzIGFuZCBleHBlY3RlZCAnICsgYmxvY2tTaXplICsgJyBieXRlcy4nKTtcbiAgfVxuXG4gIGlmKCFmb3JnZS51dGlsLmlzQXJyYXkoaXYpKSB7XG4gICAgLy8gY29udmVydCBpdiBieXRlIGJ1ZmZlciBpbnRvIDMyLWJpdCBpbnRlZ2VyIGFycmF5XG4gICAgdmFyIGludHMgPSBbXTtcbiAgICB2YXIgYmxvY2tzID0gYmxvY2tTaXplIC8gNDtcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgYmxvY2tzOyArK2kpIHtcbiAgICAgIGludHMucHVzaChpdi5nZXRJbnQzMigpKTtcbiAgICB9XG4gICAgaXYgPSBpbnRzO1xuICB9XG5cbiAgcmV0dXJuIGl2O1xufVxuXG5mdW5jdGlvbiBpbmMzMihibG9jaykge1xuICAvLyBpbmNyZW1lbnQgbGFzdCAzMiBiaXRzIG9mIGJsb2NrIG9ubHlcbiAgYmxvY2tbYmxvY2subGVuZ3RoIC0gMV0gPSAoYmxvY2tbYmxvY2subGVuZ3RoIC0gMV0gKyAxKSAmIDB4RkZGRkZGRkY7XG59XG5cbmZ1bmN0aW9uIGZyb202NFRvMzIobnVtKSB7XG4gIC8vIGNvbnZlcnQgNjQtYml0IG51bWJlciB0byB0d28gQkUgSW50MzJzXG4gIHJldHVybiBbKG51bSAvIDB4MTAwMDAwMDAwKSB8IDAsIG51bSAmIDB4RkZGRkZGRkZdO1xufVxuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///78\n")},function(module,exports,__webpack_require__){eval("/**\n * A Javascript implementation of Transport Layer Security (TLS).\n *\n * @author Dave Longley\n *\n * Copyright (c) 2009-2014 Digital Bazaar, Inc.\n *\n * The TLS Handshake Protocol involves the following steps:\n *\n * - Exchange hello messages to agree on algorithms, exchange random values,\n * and check for session resumption.\n *\n * - Exchange the necessary cryptographic parameters to allow the client and\n * server to agree on a premaster secret.\n *\n * - Exchange certificates and cryptographic information to allow the client\n * and server to authenticate themselves.\n *\n * - Generate a master secret from the premaster secret and exchanged random\n * values.\n *\n * - Provide security parameters to the record layer.\n *\n * - Allow the client and server to verify that their peer has calculated the\n * same security parameters and that the handshake occurred without tampering\n * by an attacker.\n *\n * Up to 4 different messages may be sent during a key exchange. The server\n * certificate, the server key exchange, the client certificate, and the\n * client key exchange.\n *\n * A typical handshake (from the client's perspective).\n *\n * 1. Client sends ClientHello.\n * 2. Client receives ServerHello.\n * 3. Client receives optional Certificate.\n * 4. Client receives optional ServerKeyExchange.\n * 5. Client receives ServerHelloDone.\n * 6. Client sends optional Certificate.\n * 7. Client sends ClientKeyExchange.\n * 8. Client sends optional CertificateVerify.\n * 9. Client sends ChangeCipherSpec.\n * 10. Client sends Finished.\n * 11. Client receives ChangeCipherSpec.\n * 12. Client receives Finished.\n * 13. Client sends/receives application data.\n *\n * To reuse an existing session:\n *\n * 1. Client sends ClientHello with session ID for reuse.\n * 2. Client receives ServerHello with same session ID if reusing.\n * 3. Client receives ChangeCipherSpec message if reusing.\n * 4. Client receives Finished.\n * 5. Client sends ChangeCipherSpec.\n * 6. Client sends Finished.\n *\n * Note: Client ignores HelloRequest if in the middle of a handshake.\n *\n * Record Layer:\n *\n * The record layer fragments information blocks into TLSPlaintext records\n * carrying data in chunks of 2^14 bytes or less. Client message boundaries are\n * not preserved in the record layer (i.e., multiple client messages of the\n * same ContentType MAY be coalesced into a single TLSPlaintext record, or a\n * single message MAY be fragmented across several records).\n *\n * struct {\n *   uint8 major;\n *   uint8 minor;\n * } ProtocolVersion;\n *\n * struct {\n *   ContentType type;\n *   ProtocolVersion version;\n *   uint16 length;\n *   opaque fragment[TLSPlaintext.length];\n * } TLSPlaintext;\n *\n * type:\n *   The higher-level protocol used to process the enclosed fragment.\n *\n * version:\n *   The version of the protocol being employed. TLS Version 1.2 uses version\n *   {3, 3}. TLS Version 1.0 uses version {3, 1}. Note that a client that\n *   supports multiple versions of TLS may not know what version will be\n *   employed before it receives the ServerHello.\n *\n * length:\n *   The length (in bytes) of the following TLSPlaintext.fragment. The length\n *   MUST NOT exceed 2^14 = 16384 bytes.\n *\n * fragment:\n *   The application data. This data is transparent and treated as an\n *   independent block to be dealt with by the higher-level protocol specified\n *   by the type field.\n *\n * Implementations MUST NOT send zero-length fragments of Handshake, Alert, or\n * ChangeCipherSpec content types. Zero-length fragments of Application data\n * MAY be sent as they are potentially useful as a traffic analysis\n * countermeasure.\n *\n * Note: Data of different TLS record layer content types MAY be interleaved.\n * Application data is generally of lower precedence for transmission than\n * other content types. However, records MUST be delivered to the network in\n * the same order as they are protected by the record layer. Recipients MUST\n * receive and process interleaved application layer traffic during handshakes\n * subsequent to the first one on a connection.\n *\n * struct {\n *   ContentType type;       // same as TLSPlaintext.type\n *   ProtocolVersion version;// same as TLSPlaintext.version\n *   uint16 length;\n *   opaque fragment[TLSCompressed.length];\n * } TLSCompressed;\n *\n * length:\n *   The length (in bytes) of the following TLSCompressed.fragment.\n *   The length MUST NOT exceed 2^14 + 1024.\n *\n * fragment:\n *   The compressed form of TLSPlaintext.fragment.\n *\n * Note: A CompressionMethod.null operation is an identity operation; no fields\n * are altered. In this implementation, since no compression is supported,\n * uncompressed records are always the same as compressed records.\n *\n * Encryption Information:\n *\n * The encryption and MAC functions translate a TLSCompressed structure into a\n * TLSCiphertext. The decryption functions reverse the process. The MAC of the\n * record also includes a sequence number so that missing, extra, or repeated\n * messages are detectable.\n *\n * struct {\n *   ContentType type;\n *   ProtocolVersion version;\n *   uint16 length;\n *   select (SecurityParameters.cipher_type) {\n *     case stream: GenericStreamCipher;\n *     case block:  GenericBlockCipher;\n *     case aead:   GenericAEADCipher;\n *   } fragment;\n * } TLSCiphertext;\n *\n * type:\n *   The type field is identical to TLSCompressed.type.\n *\n * version:\n *   The version field is identical to TLSCompressed.version.\n *\n * length:\n *   The length (in bytes) of the following TLSCiphertext.fragment.\n *   The length MUST NOT exceed 2^14 + 2048.\n *\n * fragment:\n *   The encrypted form of TLSCompressed.fragment, with the MAC.\n *\n * Note: Only CBC Block Ciphers are supported by this implementation.\n *\n * The TLSCompressed.fragment structures are converted to/from block\n * TLSCiphertext.fragment structures.\n *\n * struct {\n *   opaque IV[SecurityParameters.record_iv_length];\n *   block-ciphered struct {\n *     opaque content[TLSCompressed.length];\n *     opaque MAC[SecurityParameters.mac_length];\n *     uint8 padding[GenericBlockCipher.padding_length];\n *     uint8 padding_length;\n *   };\n * } GenericBlockCipher;\n *\n * The MAC is generated as described in Section 6.2.3.1.\n *\n * IV:\n *   The Initialization Vector (IV) SHOULD be chosen at random, and MUST be\n *   unpredictable. Note that in versions of TLS prior to 1.1, there was no\n *   IV field, and the last ciphertext block of the previous record (the \"CBC\n *   residue\") was used as the IV. This was changed to prevent the attacks\n *   described in [CBCATT]. For block ciphers, the IV length is of length\n *   SecurityParameters.record_iv_length, which is equal to the\n *   SecurityParameters.block_size.\n *\n * padding:\n *   Padding that is added to force the length of the plaintext to be an\n *   integral multiple of the block cipher's block length. The padding MAY be\n *   any length up to 255 bytes, as long as it results in the\n *   TLSCiphertext.length being an integral multiple of the block length.\n *   Lengths longer than necessary might be desirable to frustrate attacks on\n *   a protocol that are based on analysis of the lengths of exchanged\n *   messages. Each uint8 in the padding data vector MUST be filled with the\n *   padding length value. The receiver MUST check this padding and MUST use\n *   the bad_record_mac alert to indicate padding errors.\n *\n * padding_length:\n *   The padding length MUST be such that the total size of the\n *   GenericBlockCipher structure is a multiple of the cipher's block length.\n *   Legal values range from zero to 255, inclusive. This length specifies the\n *   length of the padding field exclusive of the padding_length field itself.\n *\n * The encrypted data length (TLSCiphertext.length) is one more than the sum of\n * SecurityParameters.block_length, TLSCompressed.length,\n * SecurityParameters.mac_length, and padding_length.\n *\n * Example: If the block length is 8 bytes, the content length\n * (TLSCompressed.length) is 61 bytes, and the MAC length is 20 bytes, then the\n * length before padding is 82 bytes (this does not include the IV. Thus, the\n * padding length modulo 8 must be equal to 6 in order to make the total length\n * an even multiple of 8 bytes (the block length). The padding length can be\n * 6, 14, 22, and so on, through 254. If the padding length were the minimum\n * necessary, 6, the padding would be 6 bytes, each containing the value 6.\n * Thus, the last 8 octets of the GenericBlockCipher before block encryption\n * would be xx 06 06 06 06 06 06 06, where xx is the last octet of the MAC.\n *\n * Note: With block ciphers in CBC mode (Cipher Block Chaining), it is critical\n * that the entire plaintext of the record be known before any ciphertext is\n * transmitted. Otherwise, it is possible for the attacker to mount the attack\n * described in [CBCATT].\n *\n * Implementation note: Canvel et al. [CBCTIME] have demonstrated a timing\n * attack on CBC padding based on the time required to compute the MAC. In\n * order to defend against this attack, implementations MUST ensure that\n * record processing time is essentially the same whether or not the padding\n * is correct. In general, the best way to do this is to compute the MAC even\n * if the padding is incorrect, and only then reject the packet. For instance,\n * if the pad appears to be incorrect, the implementation might assume a\n * zero-length pad and then compute the MAC. This leaves a small timing\n * channel, since MAC performance depends, to some extent, on the size of the\n * data fragment, but it is not believed to be large enough to be exploitable,\n * due to the large block size of existing MACs and the small size of the\n * timing signal.\n */\nvar forge = __webpack_require__(4);\n__webpack_require__(14);\n__webpack_require__(31);\n__webpack_require__(55);\n__webpack_require__(27);\n__webpack_require__(80);\n__webpack_require__(13);\n__webpack_require__(32);\n__webpack_require__(7);\n\n/**\n * Generates pseudo random bytes by mixing the result of two hash functions,\n * MD5 and SHA-1.\n *\n * prf_TLS1(secret, label, seed) =\n *   P_MD5(S1, label + seed) XOR P_SHA-1(S2, label + seed);\n *\n * Each P_hash function functions as follows:\n *\n * P_hash(secret, seed) = HMAC_hash(secret, A(1) + seed) +\n *                        HMAC_hash(secret, A(2) + seed) +\n *                        HMAC_hash(secret, A(3) + seed) + ...\n * A() is defined as:\n *   A(0) = seed\n *   A(i) = HMAC_hash(secret, A(i-1))\n *\n * The '+' operator denotes concatenation.\n *\n * As many iterations A(N) as are needed are performed to generate enough\n * pseudo random byte output. If an iteration creates more data than is\n * necessary, then it is truncated.\n *\n * Therefore:\n * A(1) = HMAC_hash(secret, A(0))\n *      = HMAC_hash(secret, seed)\n * A(2) = HMAC_hash(secret, A(1))\n *      = HMAC_hash(secret, HMAC_hash(secret, seed))\n *\n * Therefore:\n * P_hash(secret, seed) =\n *   HMAC_hash(secret, HMAC_hash(secret, A(0)) + seed) +\n *   HMAC_hash(secret, HMAC_hash(secret, A(1)) + seed) +\n *   ...\n *\n * Therefore:\n * P_hash(secret, seed) =\n *   HMAC_hash(secret, HMAC_hash(secret, seed) + seed) +\n *   HMAC_hash(secret, HMAC_hash(secret, HMAC_hash(secret, seed)) + seed) +\n *   ...\n *\n * @param secret the secret to use.\n * @param label the label to use.\n * @param seed the seed value to use.\n * @param length the number of bytes to generate.\n *\n * @return the pseudo random bytes in a byte buffer.\n */\nvar prf_TLS1 = function(secret, label, seed, length) {\n  var rval = forge.util.createBuffer();\n\n  /* For TLS 1.0, the secret is split in half, into two secrets of equal\n    length. If the secret has an odd length then the last byte of the first\n    half will be the same as the first byte of the second. The length of the\n    two secrets is half of the secret rounded up. */\n  var idx = (secret.length >> 1);\n  var slen = idx + (secret.length & 1);\n  var s1 = secret.substr(0, slen);\n  var s2 = secret.substr(idx, slen);\n  var ai = forge.util.createBuffer();\n  var hmac = forge.hmac.create();\n  seed = label + seed;\n\n  // determine the number of iterations that must be performed to generate\n  // enough output bytes, md5 creates 16 byte hashes, sha1 creates 20\n  var md5itr = Math.ceil(length / 16);\n  var sha1itr = Math.ceil(length / 20);\n\n  // do md5 iterations\n  hmac.start('MD5', s1);\n  var md5bytes = forge.util.createBuffer();\n  ai.putBytes(seed);\n  for(var i = 0; i < md5itr; ++i) {\n    // HMAC_hash(secret, A(i-1))\n    hmac.start(null, null);\n    hmac.update(ai.getBytes());\n    ai.putBuffer(hmac.digest());\n\n    // HMAC_hash(secret, A(i) + seed)\n    hmac.start(null, null);\n    hmac.update(ai.bytes() + seed);\n    md5bytes.putBuffer(hmac.digest());\n  }\n\n  // do sha1 iterations\n  hmac.start('SHA1', s2);\n  var sha1bytes = forge.util.createBuffer();\n  ai.clear();\n  ai.putBytes(seed);\n  for(var i = 0; i < sha1itr; ++i) {\n    // HMAC_hash(secret, A(i-1))\n    hmac.start(null, null);\n    hmac.update(ai.getBytes());\n    ai.putBuffer(hmac.digest());\n\n    // HMAC_hash(secret, A(i) + seed)\n    hmac.start(null, null);\n    hmac.update(ai.bytes() + seed);\n    sha1bytes.putBuffer(hmac.digest());\n  }\n\n  // XOR the md5 bytes with the sha1 bytes\n  rval.putBytes(forge.util.xorBytes(\n    md5bytes.getBytes(), sha1bytes.getBytes(), length));\n\n  return rval;\n};\n\n/**\n * Generates pseudo random bytes using a SHA256 algorithm. For TLS 1.2.\n *\n * @param secret the secret to use.\n * @param label the label to use.\n * @param seed the seed value to use.\n * @param length the number of bytes to generate.\n *\n * @return the pseudo random bytes in a byte buffer.\n */\nvar prf_sha256 = function(secret, label, seed, length) {\n   // FIXME: implement me for TLS 1.2\n};\n\n/**\n * Gets a MAC for a record using the SHA-1 hash algorithm.\n *\n * @param key the mac key.\n * @param state the sequence number (array of two 32-bit integers).\n * @param record the record.\n *\n * @return the sha-1 hash (20 bytes) for the given record.\n */\nvar hmac_sha1 = function(key, seqNum, record) {\n  /* MAC is computed like so:\n  HMAC_hash(\n    key, seqNum +\n      TLSCompressed.type +\n      TLSCompressed.version +\n      TLSCompressed.length +\n      TLSCompressed.fragment)\n  */\n  var hmac = forge.hmac.create();\n  hmac.start('SHA1', key);\n  var b = forge.util.createBuffer();\n  b.putInt32(seqNum[0]);\n  b.putInt32(seqNum[1]);\n  b.putByte(record.type);\n  b.putByte(record.version.major);\n  b.putByte(record.version.minor);\n  b.putInt16(record.length);\n  b.putBytes(record.fragment.bytes());\n  hmac.update(b.getBytes());\n  return hmac.digest().getBytes();\n};\n\n/**\n * Compresses the TLSPlaintext record into a TLSCompressed record using the\n * deflate algorithm.\n *\n * @param c the TLS connection.\n * @param record the TLSPlaintext record to compress.\n * @param s the ConnectionState to use.\n *\n * @return true on success, false on failure.\n */\nvar deflate = function(c, record, s) {\n  var rval = false;\n\n  try {\n    var bytes = c.deflate(record.fragment.getBytes());\n    record.fragment = forge.util.createBuffer(bytes);\n    record.length = bytes.length;\n    rval = true;\n  } catch(ex) {\n    // deflate error, fail out\n  }\n\n  return rval;\n};\n\n/**\n * Decompresses the TLSCompressed record into a TLSPlaintext record using the\n * deflate algorithm.\n *\n * @param c the TLS connection.\n * @param record the TLSCompressed record to decompress.\n * @param s the ConnectionState to use.\n *\n * @return true on success, false on failure.\n */\nvar inflate = function(c, record, s) {\n  var rval = false;\n\n  try {\n    var bytes = c.inflate(record.fragment.getBytes());\n    record.fragment = forge.util.createBuffer(bytes);\n    record.length = bytes.length;\n    rval = true;\n  } catch(ex) {\n    // inflate error, fail out\n  }\n\n  return rval;\n};\n\n/**\n * Reads a TLS variable-length vector from a byte buffer.\n *\n * Variable-length vectors are defined by specifying a subrange of legal\n * lengths, inclusively, using the notation <floor..ceiling>. When these are\n * encoded, the actual length precedes the vector's contents in the byte\n * stream. The length will be in the form of a number consuming as many bytes\n * as required to hold the vector's specified maximum (ceiling) length. A\n * variable-length vector with an actual length field of zero is referred to\n * as an empty vector.\n *\n * @param b the byte buffer.\n * @param lenBytes the number of bytes required to store the length.\n *\n * @return the resulting byte buffer.\n */\nvar readVector = function(b, lenBytes) {\n  var len = 0;\n  switch(lenBytes) {\n  case 1:\n    len = b.getByte();\n    break;\n  case 2:\n    len = b.getInt16();\n    break;\n  case 3:\n    len = b.getInt24();\n    break;\n  case 4:\n    len = b.getInt32();\n    break;\n  }\n\n  // read vector bytes into a new buffer\n  return forge.util.createBuffer(b.getBytes(len));\n};\n\n/**\n * Writes a TLS variable-length vector to a byte buffer.\n *\n * @param b the byte buffer.\n * @param lenBytes the number of bytes required to store the length.\n * @param v the byte buffer vector.\n */\nvar writeVector = function(b, lenBytes, v) {\n  // encode length at the start of the vector, where the number of bytes for\n  // the length is the maximum number of bytes it would take to encode the\n  // vector's ceiling\n  b.putInt(v.length(), lenBytes << 3);\n  b.putBuffer(v);\n};\n\n/**\n * The tls implementation.\n */\nvar tls = {};\n\n/**\n * Version: TLS 1.2 = 3.3, TLS 1.1 = 3.2, TLS 1.0 = 3.1. Both TLS 1.1 and\n * TLS 1.2 were still too new (ie: openSSL didn't implement them) at the time\n * of this implementation so TLS 1.0 was implemented instead.\n */\ntls.Versions = {\n  TLS_1_0: {major: 3, minor: 1},\n  TLS_1_1: {major: 3, minor: 2},\n  TLS_1_2: {major: 3, minor: 3}\n};\ntls.SupportedVersions = [\n  tls.Versions.TLS_1_1,\n  tls.Versions.TLS_1_0\n];\ntls.Version = tls.SupportedVersions[0];\n\n/**\n * Maximum fragment size. True maximum is 16384, but we fragment before that\n * to allow for unusual small increases during compression.\n */\ntls.MaxFragment = 16384 - 1024;\n\n/**\n * Whether this entity is considered the \"client\" or \"server\".\n * enum { server, client } ConnectionEnd;\n */\ntls.ConnectionEnd = {\n  server: 0,\n  client: 1\n};\n\n/**\n * Pseudo-random function algorithm used to generate keys from the master\n * secret.\n * enum { tls_prf_sha256 } PRFAlgorithm;\n */\ntls.PRFAlgorithm = {\n  tls_prf_sha256: 0\n};\n\n/**\n * Bulk encryption algorithms.\n * enum { null, rc4, des3, aes } BulkCipherAlgorithm;\n */\ntls.BulkCipherAlgorithm = {\n  none: null,\n  rc4: 0,\n  des3: 1,\n  aes: 2\n};\n\n/**\n * Cipher types.\n * enum { stream, block, aead } CipherType;\n */\ntls.CipherType = {\n  stream: 0,\n  block: 1,\n  aead: 2\n};\n\n/**\n * MAC (Message Authentication Code) algorithms.\n * enum { null, hmac_md5, hmac_sha1, hmac_sha256,\n *   hmac_sha384, hmac_sha512} MACAlgorithm;\n */\ntls.MACAlgorithm = {\n  none: null,\n  hmac_md5: 0,\n  hmac_sha1: 1,\n  hmac_sha256: 2,\n  hmac_sha384: 3,\n  hmac_sha512: 4\n};\n\n/**\n * Compression algorithms.\n * enum { null(0), deflate(1), (255) } CompressionMethod;\n */\ntls.CompressionMethod = {\n  none: 0,\n  deflate: 1\n};\n\n/**\n * TLS record content types.\n * enum {\n *   change_cipher_spec(20), alert(21), handshake(22),\n *   application_data(23), (255)\n * } ContentType;\n */\ntls.ContentType = {\n  change_cipher_spec: 20,\n  alert: 21,\n  handshake: 22,\n  application_data: 23,\n  heartbeat: 24\n};\n\n/**\n * TLS handshake types.\n * enum {\n *   hello_request(0), client_hello(1), server_hello(2),\n *   certificate(11), server_key_exchange (12),\n *   certificate_request(13), server_hello_done(14),\n *   certificate_verify(15), client_key_exchange(16),\n *   finished(20), (255)\n * } HandshakeType;\n */\ntls.HandshakeType = {\n  hello_request: 0,\n  client_hello: 1,\n  server_hello: 2,\n  certificate: 11,\n  server_key_exchange: 12,\n  certificate_request: 13,\n  server_hello_done: 14,\n  certificate_verify: 15,\n  client_key_exchange: 16,\n  finished: 20\n};\n\n/**\n * TLS Alert Protocol.\n *\n * enum { warning(1), fatal(2), (255) } AlertLevel;\n *\n * enum {\n *   close_notify(0),\n *   unexpected_message(10),\n *   bad_record_mac(20),\n *   decryption_failed(21),\n *   record_overflow(22),\n *   decompression_failure(30),\n *   handshake_failure(40),\n *   bad_certificate(42),\n *   unsupported_certificate(43),\n *   certificate_revoked(44),\n *   certificate_expired(45),\n *   certificate_unknown(46),\n *   illegal_parameter(47),\n *   unknown_ca(48),\n *   access_denied(49),\n *   decode_error(50),\n *   decrypt_error(51),\n *   export_restriction(60),\n *   protocol_version(70),\n *   insufficient_security(71),\n *   internal_error(80),\n *   user_canceled(90),\n *   no_renegotiation(100),\n *   (255)\n * } AlertDescription;\n *\n * struct {\n *   AlertLevel level;\n *   AlertDescription description;\n * } Alert;\n */\ntls.Alert = {};\ntls.Alert.Level = {\n  warning: 1,\n  fatal: 2\n};\ntls.Alert.Description = {\n  close_notify: 0,\n  unexpected_message: 10,\n  bad_record_mac: 20,\n  decryption_failed: 21,\n  record_overflow: 22,\n  decompression_failure: 30,\n  handshake_failure: 40,\n  bad_certificate: 42,\n  unsupported_certificate: 43,\n  certificate_revoked: 44,\n  certificate_expired: 45,\n  certificate_unknown: 46,\n  illegal_parameter: 47,\n  unknown_ca: 48,\n  access_denied: 49,\n  decode_error: 50,\n  decrypt_error: 51,\n  export_restriction: 60,\n  protocol_version: 70,\n  insufficient_security: 71,\n  internal_error: 80,\n  user_canceled: 90,\n  no_renegotiation: 100\n};\n\n/**\n * TLS Heartbeat Message types.\n * enum {\n *   heartbeat_request(1),\n *   heartbeat_response(2),\n *   (255)\n * } HeartbeatMessageType;\n */\ntls.HeartbeatMessageType = {\n  heartbeat_request: 1,\n  heartbeat_response: 2\n};\n\n/**\n * Supported cipher suites.\n */\ntls.CipherSuites = {};\n\n/**\n * Gets a supported cipher suite from its 2 byte ID.\n *\n * @param twoBytes two bytes in a string.\n *\n * @return the matching supported cipher suite or null.\n */\ntls.getCipherSuite = function(twoBytes) {\n  var rval = null;\n  for(var key in tls.CipherSuites) {\n    var cs = tls.CipherSuites[key];\n    if(cs.id[0] === twoBytes.charCodeAt(0) &&\n      cs.id[1] === twoBytes.charCodeAt(1)) {\n      rval = cs;\n      break;\n    }\n  }\n  return rval;\n};\n\n/**\n * Called when an unexpected record is encountered.\n *\n * @param c the connection.\n * @param record the record.\n */\ntls.handleUnexpected = function(c, record) {\n  // if connection is client and closed, ignore unexpected messages\n  var ignore = (!c.open && c.entity === tls.ConnectionEnd.client);\n  if(!ignore) {\n    c.error(c, {\n      message: 'Unexpected message. Received TLS record out of order.',\n      send: true,\n      alert: {\n        level: tls.Alert.Level.fatal,\n        description: tls.Alert.Description.unexpected_message\n      }\n    });\n  }\n};\n\n/**\n * Called when a client receives a HelloRequest record.\n *\n * @param c the connection.\n * @param record the record.\n * @param length the length of the handshake message.\n */\ntls.handleHelloRequest = function(c, record, length) {\n  // ignore renegotiation requests from the server during a handshake, but\n  // if handshaking, send a warning alert that renegotation is denied\n  if(!c.handshaking && c.handshakes > 0) {\n    // send alert warning\n    tls.queue(c, tls.createAlert(c, {\n       level: tls.Alert.Level.warning,\n       description: tls.Alert.Description.no_renegotiation\n    }));\n    tls.flush(c);\n  }\n\n  // continue\n  c.process();\n};\n\n/**\n * Parses a hello message from a ClientHello or ServerHello record.\n *\n * @param record the record to parse.\n *\n * @return the parsed message.\n */\ntls.parseHelloMessage = function(c, record, length) {\n  var msg = null;\n\n  var client = (c.entity === tls.ConnectionEnd.client);\n\n  // minimum of 38 bytes in message\n  if(length < 38) {\n    c.error(c, {\n      message: client ?\n        'Invalid ServerHello message. Message too short.' :\n        'Invalid ClientHello message. Message too short.',\n      send: true,\n      alert: {\n        level: tls.Alert.Level.fatal,\n        description: tls.Alert.Description.illegal_parameter\n      }\n    });\n  } else {\n    // use 'remaining' to calculate # of remaining bytes in the message\n    var b = record.fragment;\n    var remaining = b.length();\n    msg = {\n      version: {\n        major: b.getByte(),\n        minor: b.getByte()\n      },\n      random: forge.util.createBuffer(b.getBytes(32)),\n      session_id: readVector(b, 1),\n      extensions: []\n    };\n    if(client) {\n      msg.cipher_suite = b.getBytes(2);\n      msg.compression_method = b.getByte();\n    } else {\n      msg.cipher_suites = readVector(b, 2);\n      msg.compression_methods = readVector(b, 1);\n    }\n\n    // read extensions if there are any bytes left in the message\n    remaining = length - (remaining - b.length());\n    if(remaining > 0) {\n      // parse extensions\n      var exts = readVector(b, 2);\n      while(exts.length() > 0) {\n        msg.extensions.push({\n          type: [exts.getByte(), exts.getByte()],\n          data: readVector(exts, 2)\n        });\n      }\n\n      // TODO: make extension support modular\n      if(!client) {\n        for(var i = 0; i < msg.extensions.length; ++i) {\n          var ext = msg.extensions[i];\n\n          // support SNI extension\n          if(ext.type[0] === 0x00 && ext.type[1] === 0x00) {\n            // get server name list\n            var snl = readVector(ext.data, 2);\n            while(snl.length() > 0) {\n              // read server name type\n              var snType = snl.getByte();\n\n              // only HostName type (0x00) is known, break out if\n              // another type is detected\n              if(snType !== 0x00) {\n                break;\n              }\n\n              // add host name to server name list\n              c.session.extensions.server_name.serverNameList.push(\n                readVector(snl, 2).getBytes());\n            }\n          }\n        }\n      }\n    }\n\n    // version already set, do not allow version change\n    if(c.session.version) {\n      if(msg.version.major !== c.session.version.major ||\n        msg.version.minor !== c.session.version.minor) {\n        return c.error(c, {\n          message: 'TLS version change is disallowed during renegotiation.',\n          send: true,\n          alert: {\n            level: tls.Alert.Level.fatal,\n            description: tls.Alert.Description.protocol_version\n          }\n        });\n      }\n    }\n\n    // get the chosen (ServerHello) cipher suite\n    if(client) {\n      // FIXME: should be checking configured acceptable cipher suites\n      c.session.cipherSuite = tls.getCipherSuite(msg.cipher_suite);\n    } else {\n      // get a supported preferred (ClientHello) cipher suite\n      // choose the first supported cipher suite\n      var tmp = forge.util.createBuffer(msg.cipher_suites.bytes());\n      while(tmp.length() > 0) {\n        // FIXME: should be checking configured acceptable suites\n        // cipher suites take up 2 bytes\n        c.session.cipherSuite = tls.getCipherSuite(tmp.getBytes(2));\n        if(c.session.cipherSuite !== null) {\n          break;\n        }\n      }\n    }\n\n    // cipher suite not supported\n    if(c.session.cipherSuite === null) {\n      return c.error(c, {\n        message: 'No cipher suites in common.',\n        send: true,\n        alert: {\n          level: tls.Alert.Level.fatal,\n          description: tls.Alert.Description.handshake_failure\n        },\n        cipherSuite: forge.util.bytesToHex(msg.cipher_suite)\n      });\n    }\n\n    // TODO: handle compression methods\n    if(client) {\n      c.session.compressionMethod = msg.compression_method;\n    } else {\n      // no compression\n      c.session.compressionMethod = tls.CompressionMethod.none;\n    }\n  }\n\n  return msg;\n};\n\n/**\n * Creates security parameters for the given connection based on the given\n * hello message.\n *\n * @param c the TLS connection.\n * @param msg the hello message.\n */\ntls.createSecurityParameters = function(c, msg) {\n  /* Note: security params are from TLS 1.2, some values like prf_algorithm\n  are ignored for TLS 1.0/1.1 and the builtin as specified in the spec is\n  used. */\n\n  // TODO: handle other options from server when more supported\n\n  // get client and server randoms\n  var client = (c.entity === tls.ConnectionEnd.client);\n  var msgRandom = msg.random.bytes();\n  var cRandom = client ? c.session.sp.client_random : msgRandom;\n  var sRandom = client ? msgRandom : tls.createRandom().getBytes();\n\n  // create new security parameters\n  c.session.sp = {\n    entity: c.entity,\n    prf_algorithm: tls.PRFAlgorithm.tls_prf_sha256,\n    bulk_cipher_algorithm: null,\n    cipher_type: null,\n    enc_key_length: null,\n    block_length: null,\n    fixed_iv_length: null,\n    record_iv_length: null,\n    mac_algorithm: null,\n    mac_length: null,\n    mac_key_length: null,\n    compression_algorithm: c.session.compressionMethod,\n    pre_master_secret: null,\n    master_secret: null,\n    client_random: cRandom,\n    server_random: sRandom\n  };\n};\n\n/**\n * Called when a client receives a ServerHello record.\n *\n * When a ServerHello message will be sent:\n *   The server will send this message in response to a client hello message\n *   when it was able to find an acceptable set of algorithms. If it cannot\n *   find such a match, it will respond with a handshake failure alert.\n *\n * uint24 length;\n * struct {\n *   ProtocolVersion server_version;\n *   Random random;\n *   SessionID session_id;\n *   CipherSuite cipher_suite;\n *   CompressionMethod compression_method;\n *   select(extensions_present) {\n *     case false:\n *       struct {};\n *     case true:\n *       Extension extensions<0..2^16-1>;\n *   };\n * } ServerHello;\n *\n * @param c the connection.\n * @param record the record.\n * @param length the length of the handshake message.\n */\ntls.handleServerHello = function(c, record, length) {\n  var msg = tls.parseHelloMessage(c, record, length);\n  if(c.fail) {\n    return;\n  }\n\n  // ensure server version is compatible\n  if(msg.version.minor <= c.version.minor) {\n    c.version.minor = msg.version.minor;\n  } else {\n    return c.error(c, {\n      message: 'Incompatible TLS version.',\n      send: true,\n      alert: {\n        level: tls.Alert.Level.fatal,\n        description: tls.Alert.Description.protocol_version\n      }\n    });\n  }\n\n  // indicate session version has been set\n  c.session.version = c.version;\n\n  // get the session ID from the message\n  var sessionId = msg.session_id.bytes();\n\n  // if the session ID is not blank and matches the cached one, resume\n  // the session\n  if(sessionId.length > 0 && sessionId === c.session.id) {\n    // resuming session, expect a ChangeCipherSpec next\n    c.expect = SCC;\n    c.session.resuming = true;\n\n    // get new server random\n    c.session.sp.server_random = msg.random.bytes();\n  } else {\n    // not resuming, expect a server Certificate message next\n    c.expect = SCE;\n    c.session.resuming = false;\n\n    // create new security parameters\n    tls.createSecurityParameters(c, msg);\n  }\n\n  // set new session ID\n  c.session.id = sessionId;\n\n  // continue\n  c.process();\n};\n\n/**\n * Called when a server receives a ClientHello record.\n *\n * When a ClientHello message will be sent:\n *   When a client first connects to a server it is required to send the\n *   client hello as its first message. The client can also send a client\n *   hello in response to a hello request or on its own initiative in order\n *   to renegotiate the security parameters in an existing connection.\n *\n * @param c the connection.\n * @param record the record.\n * @param length the length of the handshake message.\n */\ntls.handleClientHello = function(c, record, length) {\n  var msg = tls.parseHelloMessage(c, record, length);\n  if(c.fail) {\n    return;\n  }\n\n  // get the session ID from the message\n  var sessionId = msg.session_id.bytes();\n\n  // see if the given session ID is in the cache\n  var session = null;\n  if(c.sessionCache) {\n    session = c.sessionCache.getSession(sessionId);\n    if(session === null) {\n      // session ID not found\n      sessionId = '';\n    } else if(session.version.major !== msg.version.major ||\n      session.version.minor > msg.version.minor) {\n      // if session version is incompatible with client version, do not resume\n      session = null;\n      sessionId = '';\n    }\n  }\n\n  // no session found to resume, generate a new session ID\n  if(sessionId.length === 0) {\n    sessionId = forge.random.getBytes(32);\n  }\n\n  // update session\n  c.session.id = sessionId;\n  c.session.clientHelloVersion = msg.version;\n  c.session.sp = {};\n  if(session) {\n    // use version and security parameters from resumed session\n    c.version = c.session.version = session.version;\n    c.session.sp = session.sp;\n  } else {\n    // use highest compatible minor version\n    var version;\n    for(var i = 1; i < tls.SupportedVersions.length; ++i) {\n      version = tls.SupportedVersions[i];\n      if(version.minor <= msg.version.minor) {\n        break;\n      }\n    }\n    c.version = {major: version.major, minor: version.minor};\n    c.session.version = c.version;\n  }\n\n  // if a session is set, resume it\n  if(session !== null) {\n    // resuming session, expect a ChangeCipherSpec next\n    c.expect = CCC;\n    c.session.resuming = true;\n\n    // get new client random\n    c.session.sp.client_random = msg.random.bytes();\n  } else {\n    // not resuming, expect a Certificate or ClientKeyExchange\n    c.expect = (c.verifyClient !== false) ? CCE : CKE;\n    c.session.resuming = false;\n\n    // create new security parameters\n    tls.createSecurityParameters(c, msg);\n  }\n\n  // connection now open\n  c.open = true;\n\n  // queue server hello\n  tls.queue(c, tls.createRecord(c, {\n    type: tls.ContentType.handshake,\n    data: tls.createServerHello(c)\n  }));\n\n  if(c.session.resuming) {\n    // queue change cipher spec message\n    tls.queue(c, tls.createRecord(c, {\n      type: tls.ContentType.change_cipher_spec,\n      data: tls.createChangeCipherSpec()\n    }));\n\n    // create pending state\n    c.state.pending = tls.createConnectionState(c);\n\n    // change current write state to pending write state\n    c.state.current.write = c.state.pending.write;\n\n    // queue finished\n    tls.queue(c, tls.createRecord(c, {\n      type: tls.ContentType.handshake,\n      data: tls.createFinished(c)\n    }));\n  } else {\n    // queue server certificate\n    tls.queue(c, tls.createRecord(c, {\n      type: tls.ContentType.handshake,\n      data: tls.createCertificate(c)\n    }));\n\n    if(!c.fail) {\n      // queue server key exchange\n      tls.queue(c, tls.createRecord(c, {\n        type: tls.ContentType.handshake,\n        data: tls.createServerKeyExchange(c)\n      }));\n\n      // request client certificate if set\n      if(c.verifyClient !== false) {\n        // queue certificate request\n        tls.queue(c, tls.createRecord(c, {\n          type: tls.ContentType.handshake,\n          data: tls.createCertificateRequest(c)\n        }));\n      }\n\n      // queue server hello done\n      tls.queue(c, tls.createRecord(c, {\n        type: tls.ContentType.handshake,\n        data: tls.createServerHelloDone(c)\n      }));\n    }\n  }\n\n  // send records\n  tls.flush(c);\n\n  // continue\n  c.process();\n};\n\n/**\n * Called when a client receives a Certificate record.\n *\n * When this message will be sent:\n *   The server must send a certificate whenever the agreed-upon key exchange\n *   method is not an anonymous one. This message will always immediately\n *   follow the server hello message.\n *\n * Meaning of this message:\n *   The certificate type must be appropriate for the selected cipher suite's\n *   key exchange algorithm, and is generally an X.509v3 certificate. It must\n *   contain a key which matches the key exchange method, as follows. Unless\n *   otherwise specified, the signing algorithm for the certificate must be\n *   the same as the algorithm for the certificate key. Unless otherwise\n *   specified, the public key may be of any length.\n *\n * opaque ASN.1Cert<1..2^24-1>;\n * struct {\n *   ASN.1Cert certificate_list<1..2^24-1>;\n * } Certificate;\n *\n * @param c the connection.\n * @param record the record.\n * @param length the length of the handshake message.\n */\ntls.handleCertificate = function(c, record, length) {\n  // minimum of 3 bytes in message\n  if(length < 3) {\n    return c.error(c, {\n      message: 'Invalid Certificate message. Message too short.',\n      send: true,\n      alert: {\n        level: tls.Alert.Level.fatal,\n        description: tls.Alert.Description.illegal_parameter\n      }\n    });\n  }\n\n  var b = record.fragment;\n  var msg = {\n    certificate_list: readVector(b, 3)\n  };\n\n  /* The sender's certificate will be first in the list (chain), each\n    subsequent one that follows will certify the previous one, but root\n    certificates (self-signed) that specify the certificate authority may\n    be omitted under the assumption that clients must already possess it. */\n  var cert, asn1;\n  var certs = [];\n  try {\n    while(msg.certificate_list.length() > 0) {\n      // each entry in msg.certificate_list is a vector with 3 len bytes\n      cert = readVector(msg.certificate_list, 3);\n      asn1 = forge.asn1.fromDer(cert);\n      cert = forge.pki.certificateFromAsn1(asn1, true);\n      certs.push(cert);\n    }\n  } catch(ex) {\n    return c.error(c, {\n      message: 'Could not parse certificate list.',\n      cause: ex,\n      send: true,\n      alert: {\n        level: tls.Alert.Level.fatal,\n        description: tls.Alert.Description.bad_certificate\n      }\n    });\n  }\n\n  // ensure at least 1 certificate was provided if in client-mode\n  // or if verifyClient was set to true to require a certificate\n  // (as opposed to 'optional')\n  var client = (c.entity === tls.ConnectionEnd.client);\n  if((client || c.verifyClient === true) && certs.length === 0) {\n    // error, no certificate\n    c.error(c, {\n      message: client ?\n        'No server certificate provided.' :\n        'No client certificate provided.',\n      send: true,\n      alert: {\n        level: tls.Alert.Level.fatal,\n        description: tls.Alert.Description.illegal_parameter\n      }\n    });\n  } else if(certs.length === 0) {\n    // no certs to verify\n    // expect a ServerKeyExchange or ClientKeyExchange message next\n    c.expect = client ? SKE : CKE;\n  } else {\n    // save certificate in session\n    if(client) {\n      c.session.serverCertificate = certs[0];\n    } else {\n      c.session.clientCertificate = certs[0];\n    }\n\n    if(tls.verifyCertificateChain(c, certs)) {\n      // expect a ServerKeyExchange or ClientKeyExchange message next\n      c.expect = client ? SKE : CKE;\n    }\n  }\n\n  // continue\n  c.process();\n};\n\n/**\n * Called when a client receives a ServerKeyExchange record.\n *\n * When this message will be sent:\n *   This message will be sent immediately after the server certificate\n *   message (or the server hello message, if this is an anonymous\n *   negotiation).\n *\n *   The server key exchange message is sent by the server only when the\n *   server certificate message (if sent) does not contain enough data to\n *   allow the client to exchange a premaster secret.\n *\n * Meaning of this message:\n *   This message conveys cryptographic information to allow the client to\n *   communicate the premaster secret: either an RSA public key to encrypt\n *   the premaster secret with, or a Diffie-Hellman public key with which the\n *   client can complete a key exchange (with the result being the premaster\n *   secret.)\n *\n * enum {\n *   dhe_dss, dhe_rsa, dh_anon, rsa, dh_dss, dh_rsa\n * } KeyExchangeAlgorithm;\n *\n * struct {\n *   opaque dh_p<1..2^16-1>;\n *   opaque dh_g<1..2^16-1>;\n *   opaque dh_Ys<1..2^16-1>;\n * } ServerDHParams;\n *\n * struct {\n *   select(KeyExchangeAlgorithm) {\n *     case dh_anon:\n *       ServerDHParams params;\n *     case dhe_dss:\n *     case dhe_rsa:\n *       ServerDHParams params;\n *       digitally-signed struct {\n *         opaque client_random[32];\n *         opaque server_random[32];\n *         ServerDHParams params;\n *       } signed_params;\n *     case rsa:\n *     case dh_dss:\n *     case dh_rsa:\n *       struct {};\n *   };\n * } ServerKeyExchange;\n *\n * @param c the connection.\n * @param record the record.\n * @param length the length of the handshake message.\n */\ntls.handleServerKeyExchange = function(c, record, length) {\n  // this implementation only supports RSA, no Diffie-Hellman support\n  // so any length > 0 is invalid\n  if(length > 0) {\n    return c.error(c, {\n      message: 'Invalid key parameters. Only RSA is supported.',\n      send: true,\n      alert: {\n        level: tls.Alert.Level.fatal,\n        description: tls.Alert.Description.unsupported_certificate\n      }\n    });\n  }\n\n  // expect an optional CertificateRequest message next\n  c.expect = SCR;\n\n  // continue\n  c.process();\n};\n\n/**\n * Called when a client receives a ClientKeyExchange record.\n *\n * @param c the connection.\n * @param record the record.\n * @param length the length of the handshake message.\n */\ntls.handleClientKeyExchange = function(c, record, length) {\n  // this implementation only supports RSA, no Diffie-Hellman support\n  // so any length < 48 is invalid\n  if(length < 48) {\n    return c.error(c, {\n      message: 'Invalid key parameters. Only RSA is supported.',\n      send: true,\n      alert: {\n        level: tls.Alert.Level.fatal,\n        description: tls.Alert.Description.unsupported_certificate\n      }\n    });\n  }\n\n  var b = record.fragment;\n  var msg = {\n    enc_pre_master_secret: readVector(b, 2).getBytes()\n  };\n\n  // do rsa decryption\n  var privateKey = null;\n  if(c.getPrivateKey) {\n    try {\n      privateKey = c.getPrivateKey(c, c.session.serverCertificate);\n      privateKey = forge.pki.privateKeyFromPem(privateKey);\n    } catch(ex) {\n      c.error(c, {\n        message: 'Could not get private key.',\n        cause: ex,\n        send: true,\n        alert: {\n          level: tls.Alert.Level.fatal,\n          description: tls.Alert.Description.internal_error\n        }\n      });\n    }\n  }\n\n  if(privateKey === null) {\n    return c.error(c, {\n      message: 'No private key set.',\n      send: true,\n      alert: {\n        level: tls.Alert.Level.fatal,\n        description: tls.Alert.Description.internal_error\n      }\n    });\n  }\n\n  try {\n    // decrypt 48-byte pre-master secret\n    var sp = c.session.sp;\n    sp.pre_master_secret = privateKey.decrypt(msg.enc_pre_master_secret);\n\n    // ensure client hello version matches first 2 bytes\n    var version = c.session.clientHelloVersion;\n    if(version.major !== sp.pre_master_secret.charCodeAt(0) ||\n      version.minor !== sp.pre_master_secret.charCodeAt(1)) {\n      // error, do not send alert (see BLEI attack below)\n      throw new Error('TLS version rollback attack detected.');\n    }\n  } catch(ex) {\n    /* Note: Daniel Bleichenbacher [BLEI] can be used to attack a\n      TLS server which is using PKCS#1 encoded RSA, so instead of\n      failing here, we generate 48 random bytes and use that as\n      the pre-master secret. */\n    sp.pre_master_secret = forge.random.getBytes(48);\n  }\n\n  // expect a CertificateVerify message if a Certificate was received that\n  // does not have fixed Diffie-Hellman params, otherwise expect\n  // ChangeCipherSpec\n  c.expect = CCC;\n  if(c.session.clientCertificate !== null) {\n    // only RSA support, so expect CertificateVerify\n    // TODO: support Diffie-Hellman\n    c.expect = CCV;\n  }\n\n  // continue\n  c.process();\n};\n\n/**\n * Called when a client receives a CertificateRequest record.\n *\n * When this message will be sent:\n *   A non-anonymous server can optionally request a certificate from the\n *   client, if appropriate for the selected cipher suite. This message, if\n *   sent, will immediately follow the Server Key Exchange message (if it is\n *   sent; otherwise, the Server Certificate message).\n *\n * enum {\n *   rsa_sign(1), dss_sign(2), rsa_fixed_dh(3), dss_fixed_dh(4),\n *   rsa_ephemeral_dh_RESERVED(5), dss_ephemeral_dh_RESERVED(6),\n *   fortezza_dms_RESERVED(20), (255)\n * } ClientCertificateType;\n *\n * opaque DistinguishedName<1..2^16-1>;\n *\n * struct {\n *   ClientCertificateType certificate_types<1..2^8-1>;\n *   SignatureAndHashAlgorithm supported_signature_algorithms<2^16-1>;\n *   DistinguishedName certificate_authorities<0..2^16-1>;\n * } CertificateRequest;\n *\n * @param c the connection.\n * @param record the record.\n * @param length the length of the handshake message.\n */\ntls.handleCertificateRequest = function(c, record, length) {\n  // minimum of 3 bytes in message\n  if(length < 3) {\n    return c.error(c, {\n      message: 'Invalid CertificateRequest. Message too short.',\n      send: true,\n      alert: {\n        level: tls.Alert.Level.fatal,\n        description: tls.Alert.Description.illegal_parameter\n      }\n    });\n  }\n\n  // TODO: TLS 1.2+ has different format including\n  // SignatureAndHashAlgorithm after cert types\n  var b = record.fragment;\n  var msg = {\n    certificate_types: readVector(b, 1),\n    certificate_authorities: readVector(b, 2)\n  };\n\n  // save certificate request in session\n  c.session.certificateRequest = msg;\n\n  // expect a ServerHelloDone message next\n  c.expect = SHD;\n\n  // continue\n  c.process();\n};\n\n/**\n * Called when a server receives a CertificateVerify record.\n *\n * @param c the connection.\n * @param record the record.\n * @param length the length of the handshake message.\n */\ntls.handleCertificateVerify = function(c, record, length) {\n  if(length < 2) {\n    return c.error(c, {\n      message: 'Invalid CertificateVerify. Message too short.',\n      send: true,\n      alert: {\n        level: tls.Alert.Level.fatal,\n        description: tls.Alert.Description.illegal_parameter\n      }\n    });\n  }\n\n  // rewind to get full bytes for message so it can be manually\n  // digested below (special case for CertificateVerify messages because\n  // they must be digested *after* handling as opposed to all others)\n  var b = record.fragment;\n  b.read -= 4;\n  var msgBytes = b.bytes();\n  b.read += 4;\n\n  var msg = {\n    signature: readVector(b, 2).getBytes()\n  };\n\n  // TODO: add support for DSA\n\n  // generate data to verify\n  var verify = forge.util.createBuffer();\n  verify.putBuffer(c.session.md5.digest());\n  verify.putBuffer(c.session.sha1.digest());\n  verify = verify.getBytes();\n\n  try {\n    var cert = c.session.clientCertificate;\n    /*b = forge.pki.rsa.decrypt(\n      msg.signature, cert.publicKey, true, verify.length);\n    if(b !== verify) {*/\n    if(!cert.publicKey.verify(verify, msg.signature, 'NONE')) {\n      throw new Error('CertificateVerify signature does not match.');\n    }\n\n    // digest message now that it has been handled\n    c.session.md5.update(msgBytes);\n    c.session.sha1.update(msgBytes);\n  } catch(ex) {\n    return c.error(c, {\n      message: 'Bad signature in CertificateVerify.',\n      send: true,\n      alert: {\n        level: tls.Alert.Level.fatal,\n        description: tls.Alert.Description.handshake_failure\n      }\n    });\n  }\n\n  // expect ChangeCipherSpec\n  c.expect = CCC;\n\n  // continue\n  c.process();\n};\n\n/**\n * Called when a client receives a ServerHelloDone record.\n *\n * When this message will be sent:\n *   The server hello done message is sent by the server to indicate the end\n *   of the server hello and associated messages. After sending this message\n *   the server will wait for a client response.\n *\n * Meaning of this message:\n *   This message means that the server is done sending messages to support\n *   the key exchange, and the client can proceed with its phase of the key\n *   exchange.\n *\n *   Upon receipt of the server hello done message the client should verify\n *   that the server provided a valid certificate if required and check that\n *   the server hello parameters are acceptable.\n *\n * struct {} ServerHelloDone;\n *\n * @param c the connection.\n * @param record the record.\n * @param length the length of the handshake message.\n */\ntls.handleServerHelloDone = function(c, record, length) {\n  // len must be 0 bytes\n  if(length > 0) {\n    return c.error(c, {\n      message: 'Invalid ServerHelloDone message. Invalid length.',\n      send: true,\n      alert: {\n        level: tls.Alert.Level.fatal,\n        description: tls.Alert.Description.record_overflow\n      }\n    });\n  }\n\n  if(c.serverCertificate === null) {\n    // no server certificate was provided\n    var error = {\n      message: 'No server certificate provided. Not enough security.',\n      send: true,\n      alert: {\n        level: tls.Alert.Level.fatal,\n        description: tls.Alert.Description.insufficient_security\n      }\n    };\n\n    // call application callback\n    var depth = 0;\n    var ret = c.verify(c, error.alert.description, depth, []);\n    if(ret !== true) {\n      // check for custom alert info\n      if(ret || ret === 0) {\n        // set custom message and alert description\n        if(typeof ret === 'object' && !forge.util.isArray(ret)) {\n          if(ret.message) {\n            error.message = ret.message;\n          }\n          if(ret.alert) {\n            error.alert.description = ret.alert;\n          }\n        } else if(typeof ret === 'number') {\n          // set custom alert description\n          error.alert.description = ret;\n        }\n      }\n\n      // send error\n      return c.error(c, error);\n    }\n  }\n\n  // create client certificate message if requested\n  if(c.session.certificateRequest !== null) {\n    record = tls.createRecord(c, {\n      type: tls.ContentType.handshake,\n      data: tls.createCertificate(c)\n    });\n    tls.queue(c, record);\n  }\n\n  // create client key exchange message\n  record = tls.createRecord(c, {\n     type: tls.ContentType.handshake,\n     data: tls.createClientKeyExchange(c)\n  });\n  tls.queue(c, record);\n\n  // expect no messages until the following callback has been called\n  c.expect = SER;\n\n  // create callback to handle client signature (for client-certs)\n  var callback = function(c, signature) {\n    if(c.session.certificateRequest !== null &&\n      c.session.clientCertificate !== null) {\n      // create certificate verify message\n      tls.queue(c, tls.createRecord(c, {\n        type: tls.ContentType.handshake,\n        data: tls.createCertificateVerify(c, signature)\n      }));\n    }\n\n    // create change cipher spec message\n    tls.queue(c, tls.createRecord(c, {\n      type: tls.ContentType.change_cipher_spec,\n      data: tls.createChangeCipherSpec()\n    }));\n\n    // create pending state\n    c.state.pending = tls.createConnectionState(c);\n\n    // change current write state to pending write state\n    c.state.current.write = c.state.pending.write;\n\n    // create finished message\n    tls.queue(c, tls.createRecord(c, {\n      type: tls.ContentType.handshake,\n      data: tls.createFinished(c)\n    }));\n\n    // expect a server ChangeCipherSpec message next\n    c.expect = SCC;\n\n    // send records\n    tls.flush(c);\n\n    // continue\n    c.process();\n  };\n\n  // if there is no certificate request or no client certificate, do\n  // callback immediately\n  if(c.session.certificateRequest === null ||\n    c.session.clientCertificate === null) {\n    return callback(c, null);\n  }\n\n  // otherwise get the client signature\n  tls.getClientSignature(c, callback);\n};\n\n/**\n * Called when a ChangeCipherSpec record is received.\n *\n * @param c the connection.\n * @param record the record.\n */\ntls.handleChangeCipherSpec = function(c, record) {\n  if(record.fragment.getByte() !== 0x01) {\n    return c.error(c, {\n      message: 'Invalid ChangeCipherSpec message received.',\n      send: true,\n      alert: {\n        level: tls.Alert.Level.fatal,\n        description: tls.Alert.Description.illegal_parameter\n      }\n    });\n  }\n\n  // create pending state if:\n  // 1. Resuming session in client mode OR\n  // 2. NOT resuming session in server mode\n  var client = (c.entity === tls.ConnectionEnd.client);\n  if((c.session.resuming && client) || (!c.session.resuming && !client)) {\n    c.state.pending = tls.createConnectionState(c);\n  }\n\n  // change current read state to pending read state\n  c.state.current.read = c.state.pending.read;\n\n  // clear pending state if:\n  // 1. NOT resuming session in client mode OR\n  // 2. resuming a session in server mode\n  if((!c.session.resuming && client) || (c.session.resuming && !client)) {\n    c.state.pending = null;\n  }\n\n  // expect a Finished record next\n  c.expect = client ? SFI : CFI;\n\n  // continue\n  c.process();\n};\n\n/**\n * Called when a Finished record is received.\n *\n * When this message will be sent:\n *   A finished message is always sent immediately after a change\n *   cipher spec message to verify that the key exchange and\n *   authentication processes were successful. It is essential that a\n *   change cipher spec message be received between the other\n *   handshake messages and the Finished message.\n *\n * Meaning of this message:\n *   The finished message is the first protected with the just-\n *   negotiated algorithms, keys, and secrets. Recipients of finished\n *   messages must verify that the contents are correct.  Once a side\n *   has sent its Finished message and received and validated the\n *   Finished message from its peer, it may begin to send and receive\n *   application data over the connection.\n *\n * struct {\n *   opaque verify_data[verify_data_length];\n * } Finished;\n *\n * verify_data\n *   PRF(master_secret, finished_label, Hash(handshake_messages))\n *     [0..verify_data_length-1];\n *\n * finished_label\n *   For Finished messages sent by the client, the string\n *   \"client finished\". For Finished messages sent by the server, the\n *   string \"server finished\".\n *\n * verify_data_length depends on the cipher suite. If it is not specified\n * by the cipher suite, then it is 12. Versions of TLS < 1.2 always used\n * 12 bytes.\n *\n * @param c the connection.\n * @param record the record.\n * @param length the length of the handshake message.\n */\ntls.handleFinished = function(c, record, length) {\n  // rewind to get full bytes for message so it can be manually\n  // digested below (special case for Finished messages because they\n  // must be digested *after* handling as opposed to all others)\n  var b = record.fragment;\n  b.read -= 4;\n  var msgBytes = b.bytes();\n  b.read += 4;\n\n  // message contains only verify_data\n  var vd = record.fragment.getBytes();\n\n  // ensure verify data is correct\n  b = forge.util.createBuffer();\n  b.putBuffer(c.session.md5.digest());\n  b.putBuffer(c.session.sha1.digest());\n\n  // set label based on entity type\n  var client = (c.entity === tls.ConnectionEnd.client);\n  var label = client ? 'server finished' : 'client finished';\n\n  // TODO: determine prf function and verify length for TLS 1.2\n  var sp = c.session.sp;\n  var vdl = 12;\n  var prf = prf_TLS1;\n  b = prf(sp.master_secret, label, b.getBytes(), vdl);\n  if(b.getBytes() !== vd) {\n    return c.error(c, {\n      message: 'Invalid verify_data in Finished message.',\n      send: true,\n      alert: {\n        level: tls.Alert.Level.fatal,\n        description: tls.Alert.Description.decrypt_error\n      }\n    });\n  }\n\n  // digest finished message now that it has been handled\n  c.session.md5.update(msgBytes);\n  c.session.sha1.update(msgBytes);\n\n  // resuming session as client or NOT resuming session as server\n  if((c.session.resuming && client) || (!c.session.resuming && !client)) {\n    // create change cipher spec message\n    tls.queue(c, tls.createRecord(c, {\n      type: tls.ContentType.change_cipher_spec,\n      data: tls.createChangeCipherSpec()\n    }));\n\n    // change current write state to pending write state, clear pending\n    c.state.current.write = c.state.pending.write;\n    c.state.pending = null;\n\n    // create finished message\n    tls.queue(c, tls.createRecord(c, {\n      type: tls.ContentType.handshake,\n      data: tls.createFinished(c)\n    }));\n  }\n\n  // expect application data next\n  c.expect = client ? SAD : CAD;\n\n  // handshake complete\n  c.handshaking = false;\n  ++c.handshakes;\n\n  // save access to peer certificate\n  c.peerCertificate = client ?\n    c.session.serverCertificate : c.session.clientCertificate;\n\n  // send records\n  tls.flush(c);\n\n  // now connected\n  c.isConnected = true;\n  c.connected(c);\n\n  // continue\n  c.process();\n};\n\n/**\n * Called when an Alert record is received.\n *\n * @param c the connection.\n * @param record the record.\n */\ntls.handleAlert = function(c, record) {\n  // read alert\n  var b = record.fragment;\n  var alert = {\n    level: b.getByte(),\n    description: b.getByte()\n  };\n\n  // TODO: consider using a table?\n  // get appropriate message\n  var msg;\n  switch(alert.description) {\n  case tls.Alert.Description.close_notify:\n    msg = 'Connection closed.';\n    break;\n  case tls.Alert.Description.unexpected_message:\n    msg = 'Unexpected message.';\n    break;\n  case tls.Alert.Description.bad_record_mac:\n    msg = 'Bad record MAC.';\n    break;\n  case tls.Alert.Description.decryption_failed:\n    msg = 'Decryption failed.';\n    break;\n  case tls.Alert.Description.record_overflow:\n    msg = 'Record overflow.';\n    break;\n  case tls.Alert.Description.decompression_failure:\n    msg = 'Decompression failed.';\n    break;\n  case tls.Alert.Description.handshake_failure:\n    msg = 'Handshake failure.';\n    break;\n  case tls.Alert.Description.bad_certificate:\n    msg = 'Bad certificate.';\n    break;\n  case tls.Alert.Description.unsupported_certificate:\n    msg = 'Unsupported certificate.';\n    break;\n  case tls.Alert.Description.certificate_revoked:\n    msg = 'Certificate revoked.';\n    break;\n  case tls.Alert.Description.certificate_expired:\n    msg = 'Certificate expired.';\n    break;\n  case tls.Alert.Description.certificate_unknown:\n    msg = 'Certificate unknown.';\n    break;\n  case tls.Alert.Description.illegal_parameter:\n    msg = 'Illegal parameter.';\n    break;\n  case tls.Alert.Description.unknown_ca:\n    msg = 'Unknown certificate authority.';\n    break;\n  case tls.Alert.Description.access_denied:\n    msg = 'Access denied.';\n    break;\n  case tls.Alert.Description.decode_error:\n    msg = 'Decode error.';\n    break;\n  case tls.Alert.Description.decrypt_error:\n    msg = 'Decrypt error.';\n    break;\n  case tls.Alert.Description.export_restriction:\n    msg = 'Export restriction.';\n    break;\n  case tls.Alert.Description.protocol_version:\n    msg = 'Unsupported protocol version.';\n    break;\n  case tls.Alert.Description.insufficient_security:\n    msg = 'Insufficient security.';\n    break;\n  case tls.Alert.Description.internal_error:\n    msg = 'Internal error.';\n    break;\n  case tls.Alert.Description.user_canceled:\n    msg = 'User canceled.';\n    break;\n  case tls.Alert.Description.no_renegotiation:\n    msg = 'Renegotiation not supported.';\n    break;\n  default:\n    msg = 'Unknown error.';\n    break;\n  }\n\n  // close connection on close_notify, not an error\n  if(alert.description === tls.Alert.Description.close_notify) {\n    return c.close();\n  }\n\n  // call error handler\n  c.error(c, {\n    message: msg,\n    send: false,\n    // origin is the opposite end\n    origin: (c.entity === tls.ConnectionEnd.client) ? 'server' : 'client',\n    alert: alert\n  });\n\n  // continue\n  c.process();\n};\n\n/**\n * Called when a Handshake record is received.\n *\n * @param c the connection.\n * @param record the record.\n */\ntls.handleHandshake = function(c, record) {\n  // get the handshake type and message length\n  var b = record.fragment;\n  var type = b.getByte();\n  var length = b.getInt24();\n\n  // see if the record fragment doesn't yet contain the full message\n  if(length > b.length()) {\n    // cache the record, clear its fragment, and reset the buffer read\n    // pointer before the type and length were read\n    c.fragmented = record;\n    record.fragment = forge.util.createBuffer();\n    b.read -= 4;\n\n    // continue\n    return c.process();\n  }\n\n  // full message now available, clear cache, reset read pointer to\n  // before type and length\n  c.fragmented = null;\n  b.read -= 4;\n\n  // save the handshake bytes for digestion after handler is found\n  // (include type and length of handshake msg)\n  var bytes = b.bytes(length + 4);\n\n  // restore read pointer\n  b.read += 4;\n\n  // handle expected message\n  if(type in hsTable[c.entity][c.expect]) {\n    // initialize server session\n    if(c.entity === tls.ConnectionEnd.server && !c.open && !c.fail) {\n      c.handshaking = true;\n      c.session = {\n        version: null,\n        extensions: {\n          server_name: {\n            serverNameList: []\n          }\n        },\n        cipherSuite: null,\n        compressionMethod: null,\n        serverCertificate: null,\n        clientCertificate: null,\n        md5: forge.md.md5.create(),\n        sha1: forge.md.sha1.create()\n      };\n    }\n\n    /* Update handshake messages digest. Finished and CertificateVerify\n      messages are not digested here. They can't be digested as part of\n      the verify_data that they contain. These messages are manually\n      digested in their handlers. HelloRequest messages are simply never\n      included in the handshake message digest according to spec. */\n    if(type !== tls.HandshakeType.hello_request &&\n      type !== tls.HandshakeType.certificate_verify &&\n      type !== tls.HandshakeType.finished) {\n      c.session.md5.update(bytes);\n      c.session.sha1.update(bytes);\n    }\n\n    // handle specific handshake type record\n    hsTable[c.entity][c.expect][type](c, record, length);\n  } else {\n    // unexpected record\n    tls.handleUnexpected(c, record);\n  }\n};\n\n/**\n * Called when an ApplicationData record is received.\n *\n * @param c the connection.\n * @param record the record.\n */\ntls.handleApplicationData = function(c, record) {\n  // buffer data, notify that its ready\n  c.data.putBuffer(record.fragment);\n  c.dataReady(c);\n\n  // continue\n  c.process();\n};\n\n/**\n * Called when a Heartbeat record is received.\n *\n * @param c the connection.\n * @param record the record.\n */\ntls.handleHeartbeat = function(c, record) {\n  // get the heartbeat type and payload\n  var b = record.fragment;\n  var type = b.getByte();\n  var length = b.getInt16();\n  var payload = b.getBytes(length);\n\n  if(type === tls.HeartbeatMessageType.heartbeat_request) {\n    // discard request during handshake or if length is too large\n    if(c.handshaking || length > payload.length) {\n      // continue\n      return c.process();\n    }\n    // retransmit payload\n    tls.queue(c, tls.createRecord(c, {\n      type: tls.ContentType.heartbeat,\n      data: tls.createHeartbeat(\n        tls.HeartbeatMessageType.heartbeat_response, payload)\n    }));\n    tls.flush(c);\n  } else if(type === tls.HeartbeatMessageType.heartbeat_response) {\n    // check payload against expected payload, discard heartbeat if no match\n    if(payload !== c.expectedHeartbeatPayload) {\n      // continue\n      return c.process();\n    }\n\n    // notify that a valid heartbeat was received\n    if(c.heartbeatReceived) {\n      c.heartbeatReceived(c, forge.util.createBuffer(payload));\n    }\n  }\n\n  // continue\n  c.process();\n};\n\n/**\n * The transistional state tables for receiving TLS records. It maps the\n * current TLS engine state and a received record to a function to handle the\n * record and update the state.\n *\n * For instance, if the current state is SHE, then the TLS engine is expecting\n * a ServerHello record. Once a record is received, the handler function is\n * looked up using the state SHE and the record's content type.\n *\n * The resulting function will either be an error handler or a record handler.\n * The function will take whatever action is appropriate and update the state\n * for the next record.\n *\n * The states are all based on possible server record types. Note that the\n * client will never specifically expect to receive a HelloRequest or an alert\n * from the server so there is no state that reflects this. These messages may\n * occur at any time.\n *\n * There are two tables for mapping states because there is a second tier of\n * types for handshake messages. Once a record with a content type of handshake\n * is received, the handshake record handler will look up the handshake type in\n * the secondary map to get its appropriate handler.\n *\n * Valid message orders are as follows:\n *\n * =======================FULL HANDSHAKE======================\n * Client                                               Server\n *\n * ClientHello                  --------\x3e\n *                                                 ServerHello\n *                                                Certificate*\n *                                          ServerKeyExchange*\n *                                         CertificateRequest*\n *                              <--------      ServerHelloDone\n * Certificate*\n * ClientKeyExchange\n * CertificateVerify*\n * [ChangeCipherSpec]\n * Finished                     --------\x3e\n *                                          [ChangeCipherSpec]\n *                              <--------             Finished\n * Application Data             <-------\x3e     Application Data\n *\n * =====================SESSION RESUMPTION=====================\n * Client                                                Server\n *\n * ClientHello                   --------\x3e\n *                                                  ServerHello\n *                                           [ChangeCipherSpec]\n *                               <--------             Finished\n * [ChangeCipherSpec]\n * Finished                      --------\x3e\n * Application Data              <-------\x3e     Application Data\n */\n// client expect states (indicate which records are expected to be received)\nvar SHE = 0; // rcv server hello\nvar SCE = 1; // rcv server certificate\nvar SKE = 2; // rcv server key exchange\nvar SCR = 3; // rcv certificate request\nvar SHD = 4; // rcv server hello done\nvar SCC = 5; // rcv change cipher spec\nvar SFI = 6; // rcv finished\nvar SAD = 7; // rcv application data\nvar SER = 8; // not expecting any messages at this point\n\n// server expect states\nvar CHE = 0; // rcv client hello\nvar CCE = 1; // rcv client certificate\nvar CKE = 2; // rcv client key exchange\nvar CCV = 3; // rcv certificate verify\nvar CCC = 4; // rcv change cipher spec\nvar CFI = 5; // rcv finished\nvar CAD = 6; // rcv application data\nvar CER = 7; // not expecting any messages at this point\n\n// map client current expect state and content type to function\nvar __ = tls.handleUnexpected;\nvar R0 = tls.handleChangeCipherSpec;\nvar R1 = tls.handleAlert;\nvar R2 = tls.handleHandshake;\nvar R3 = tls.handleApplicationData;\nvar R4 = tls.handleHeartbeat;\nvar ctTable = [];\nctTable[tls.ConnectionEnd.client] = [\n//      CC,AL,HS,AD,HB\n/*SHE*/[__,R1,R2,__,R4],\n/*SCE*/[__,R1,R2,__,R4],\n/*SKE*/[__,R1,R2,__,R4],\n/*SCR*/[__,R1,R2,__,R4],\n/*SHD*/[__,R1,R2,__,R4],\n/*SCC*/[R0,R1,__,__,R4],\n/*SFI*/[__,R1,R2,__,R4],\n/*SAD*/[__,R1,R2,R3,R4],\n/*SER*/[__,R1,R2,__,R4]\n];\n\n// map server current expect state and content type to function\nctTable[tls.ConnectionEnd.server] = [\n//      CC,AL,HS,AD\n/*CHE*/[__,R1,R2,__,R4],\n/*CCE*/[__,R1,R2,__,R4],\n/*CKE*/[__,R1,R2,__,R4],\n/*CCV*/[__,R1,R2,__,R4],\n/*CCC*/[R0,R1,__,__,R4],\n/*CFI*/[__,R1,R2,__,R4],\n/*CAD*/[__,R1,R2,R3,R4],\n/*CER*/[__,R1,R2,__,R4]\n];\n\n// map client current expect state and handshake type to function\nvar H0 = tls.handleHelloRequest;\nvar H1 = tls.handleServerHello;\nvar H2 = tls.handleCertificate;\nvar H3 = tls.handleServerKeyExchange;\nvar H4 = tls.handleCertificateRequest;\nvar H5 = tls.handleServerHelloDone;\nvar H6 = tls.handleFinished;\nvar hsTable = [];\nhsTable[tls.ConnectionEnd.client] = [\n//      HR,01,SH,03,04,05,06,07,08,09,10,SC,SK,CR,HD,15,CK,17,18,19,FI\n/*SHE*/[__,__,H1,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__],\n/*SCE*/[H0,__,__,__,__,__,__,__,__,__,__,H2,H3,H4,H5,__,__,__,__,__,__],\n/*SKE*/[H0,__,__,__,__,__,__,__,__,__,__,__,H3,H4,H5,__,__,__,__,__,__],\n/*SCR*/[H0,__,__,__,__,__,__,__,__,__,__,__,__,H4,H5,__,__,__,__,__,__],\n/*SHD*/[H0,__,__,__,__,__,__,__,__,__,__,__,__,__,H5,__,__,__,__,__,__],\n/*SCC*/[H0,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__],\n/*SFI*/[H0,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,H6],\n/*SAD*/[H0,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__],\n/*SER*/[H0,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__]\n];\n\n// map server current expect state and handshake type to function\n// Note: CAD[CH] does not map to FB because renegotation is prohibited\nvar H7 = tls.handleClientHello;\nvar H8 = tls.handleClientKeyExchange;\nvar H9 = tls.handleCertificateVerify;\nhsTable[tls.ConnectionEnd.server] = [\n//      01,CH,02,03,04,05,06,07,08,09,10,CC,12,13,14,CV,CK,17,18,19,FI\n/*CHE*/[__,H7,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__],\n/*CCE*/[__,__,__,__,__,__,__,__,__,__,__,H2,__,__,__,__,__,__,__,__,__],\n/*CKE*/[__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,H8,__,__,__,__],\n/*CCV*/[__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,H9,__,__,__,__,__],\n/*CCC*/[__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__],\n/*CFI*/[__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,H6],\n/*CAD*/[__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__],\n/*CER*/[__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__,__]\n];\n\n/**\n * Generates the master_secret and keys using the given security parameters.\n *\n * The security parameters for a TLS connection state are defined as such:\n *\n * struct {\n *   ConnectionEnd          entity;\n *   PRFAlgorithm           prf_algorithm;\n *   BulkCipherAlgorithm    bulk_cipher_algorithm;\n *   CipherType             cipher_type;\n *   uint8                  enc_key_length;\n *   uint8                  block_length;\n *   uint8                  fixed_iv_length;\n *   uint8                  record_iv_length;\n *   MACAlgorithm           mac_algorithm;\n *   uint8                  mac_length;\n *   uint8                  mac_key_length;\n *   CompressionMethod      compression_algorithm;\n *   opaque                 master_secret[48];\n *   opaque                 client_random[32];\n *   opaque                 server_random[32];\n * } SecurityParameters;\n *\n * Note that this definition is from TLS 1.2. In TLS 1.0 some of these\n * parameters are ignored because, for instance, the PRFAlgorithm is a\n * builtin-fixed algorithm combining iterations of MD5 and SHA-1 in TLS 1.0.\n *\n * The Record Protocol requires an algorithm to generate keys required by the\n * current connection state.\n *\n * The master secret is expanded into a sequence of secure bytes, which is then\n * split to a client write MAC key, a server write MAC key, a client write\n * encryption key, and a server write encryption key. In TLS 1.0 a client write\n * IV and server write IV are also generated. Each of these is generated from\n * the byte sequence in that order. Unused values are empty. In TLS 1.2, some\n * AEAD ciphers may additionally require a client write IV and a server write\n * IV (see Section 6.2.3.3).\n *\n * When keys, MAC keys, and IVs are generated, the master secret is used as an\n * entropy source.\n *\n * To generate the key material, compute:\n *\n * master_secret = PRF(pre_master_secret, \"master secret\",\n *                     ClientHello.random + ServerHello.random)\n *\n * key_block = PRF(SecurityParameters.master_secret,\n *                 \"key expansion\",\n *                 SecurityParameters.server_random +\n *                 SecurityParameters.client_random);\n *\n * until enough output has been generated. Then, the key_block is\n * partitioned as follows:\n *\n * client_write_MAC_key[SecurityParameters.mac_key_length]\n * server_write_MAC_key[SecurityParameters.mac_key_length]\n * client_write_key[SecurityParameters.enc_key_length]\n * server_write_key[SecurityParameters.enc_key_length]\n * client_write_IV[SecurityParameters.fixed_iv_length]\n * server_write_IV[SecurityParameters.fixed_iv_length]\n *\n * In TLS 1.2, the client_write_IV and server_write_IV are only generated for\n * implicit nonce techniques as described in Section 3.2.1 of [AEAD]. This\n * implementation uses TLS 1.0 so IVs are generated.\n *\n * Implementation note: The currently defined cipher suite which requires the\n * most material is AES_256_CBC_SHA256. It requires 2 x 32 byte keys and 2 x 32\n * byte MAC keys, for a total 128 bytes of key material. In TLS 1.0 it also\n * requires 2 x 16 byte IVs, so it actually takes 160 bytes of key material.\n *\n * @param c the connection.\n * @param sp the security parameters to use.\n *\n * @return the security keys.\n */\ntls.generateKeys = function(c, sp) {\n  // TLS_RSA_WITH_AES_128_CBC_SHA (required to be compliant with TLS 1.2) &\n  // TLS_RSA_WITH_AES_256_CBC_SHA are the only cipher suites implemented\n  // at present\n\n  // TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA is required to be compliant with\n  // TLS 1.0 but we don't care right now because AES is better and we have\n  // an implementation for it\n\n  // TODO: TLS 1.2 implementation\n  /*\n  // determine the PRF\n  var prf;\n  switch(sp.prf_algorithm) {\n  case tls.PRFAlgorithm.tls_prf_sha256:\n    prf = prf_sha256;\n    break;\n  default:\n    // should never happen\n    throw new Error('Invalid PRF');\n  }\n  */\n\n  // TLS 1.0/1.1 implementation\n  var prf = prf_TLS1;\n\n  // concatenate server and client random\n  var random = sp.client_random + sp.server_random;\n\n  // only create master secret if session is new\n  if(!c.session.resuming) {\n    // create master secret, clean up pre-master secret\n    sp.master_secret = prf(\n      sp.pre_master_secret, 'master secret', random, 48).bytes();\n    sp.pre_master_secret = null;\n  }\n\n  // generate the amount of key material needed\n  random = sp.server_random + sp.client_random;\n  var length = 2 * sp.mac_key_length + 2 * sp.enc_key_length;\n\n  // include IV for TLS/1.0\n  var tls10 = (c.version.major === tls.Versions.TLS_1_0.major &&\n    c.version.minor === tls.Versions.TLS_1_0.minor);\n  if(tls10) {\n    length += 2 * sp.fixed_iv_length;\n  }\n  var km = prf(sp.master_secret, 'key expansion', random, length);\n\n  // split the key material into the MAC and encryption keys\n  var rval = {\n    client_write_MAC_key: km.getBytes(sp.mac_key_length),\n    server_write_MAC_key: km.getBytes(sp.mac_key_length),\n    client_write_key: km.getBytes(sp.enc_key_length),\n    server_write_key: km.getBytes(sp.enc_key_length)\n  };\n\n  // include TLS 1.0 IVs\n  if(tls10) {\n    rval.client_write_IV = km.getBytes(sp.fixed_iv_length);\n    rval.server_write_IV = km.getBytes(sp.fixed_iv_length);\n  }\n\n  return rval;\n};\n\n/**\n * Creates a new initialized TLS connection state. A connection state has\n * a read mode and a write mode.\n *\n * compression state:\n *   The current state of the compression algorithm.\n *\n * cipher state:\n *   The current state of the encryption algorithm. This will consist of the\n *   scheduled key for that connection. For stream ciphers, this will also\n *   contain whatever state information is necessary to allow the stream to\n *   continue to encrypt or decrypt data.\n *\n * MAC key:\n *   The MAC key for the connection.\n *\n * sequence number:\n *   Each connection state contains a sequence number, which is maintained\n *   separately for read and write states. The sequence number MUST be set to\n *   zero whenever a connection state is made the active state. Sequence\n *   numbers are of type uint64 and may not exceed 2^64-1. Sequence numbers do\n *   not wrap. If a TLS implementation would need to wrap a sequence number,\n *   it must renegotiate instead. A sequence number is incremented after each\n *   record: specifically, the first record transmitted under a particular\n *   connection state MUST use sequence number 0.\n *\n * @param c the connection.\n *\n * @return the new initialized TLS connection state.\n */\ntls.createConnectionState = function(c) {\n  var client = (c.entity === tls.ConnectionEnd.client);\n\n  var createMode = function() {\n    var mode = {\n      // two 32-bit numbers, first is most significant\n      sequenceNumber: [0, 0],\n      macKey: null,\n      macLength: 0,\n      macFunction: null,\n      cipherState: null,\n      cipherFunction: function(record) {return true;},\n      compressionState: null,\n      compressFunction: function(record) {return true;},\n      updateSequenceNumber: function() {\n        if(mode.sequenceNumber[1] === 0xFFFFFFFF) {\n          mode.sequenceNumber[1] = 0;\n          ++mode.sequenceNumber[0];\n        } else {\n          ++mode.sequenceNumber[1];\n        }\n      }\n    };\n    return mode;\n  };\n  var state = {\n    read: createMode(),\n    write: createMode()\n  };\n\n  // update function in read mode will decrypt then decompress a record\n  state.read.update = function(c, record) {\n    if(!state.read.cipherFunction(record, state.read)) {\n      c.error(c, {\n        message: 'Could not decrypt record or bad MAC.',\n        send: true,\n        alert: {\n          level: tls.Alert.Level.fatal,\n          // doesn't matter if decryption failed or MAC was\n          // invalid, return the same error so as not to reveal\n          // which one occurred\n          description: tls.Alert.Description.bad_record_mac\n        }\n      });\n    } else if(!state.read.compressFunction(c, record, state.read)) {\n      c.error(c, {\n        message: 'Could not decompress record.',\n        send: true,\n        alert: {\n          level: tls.Alert.Level.fatal,\n          description: tls.Alert.Description.decompression_failure\n        }\n      });\n    }\n    return !c.fail;\n  };\n\n  // update function in write mode will compress then encrypt a record\n  state.write.update = function(c, record) {\n    if(!state.write.compressFunction(c, record, state.write)) {\n      // error, but do not send alert since it would require\n      // compression as well\n      c.error(c, {\n        message: 'Could not compress record.',\n        send: false,\n        alert: {\n          level: tls.Alert.Level.fatal,\n          description: tls.Alert.Description.internal_error\n        }\n      });\n    } else if(!state.write.cipherFunction(record, state.write)) {\n      // error, but do not send alert since it would require\n      // encryption as well\n      c.error(c, {\n        message: 'Could not encrypt record.',\n        send: false,\n        alert: {\n          level: tls.Alert.Level.fatal,\n          description: tls.Alert.Description.internal_error\n        }\n      });\n    }\n    return !c.fail;\n  };\n\n  // handle security parameters\n  if(c.session) {\n    var sp = c.session.sp;\n    c.session.cipherSuite.initSecurityParameters(sp);\n\n    // generate keys\n    sp.keys = tls.generateKeys(c, sp);\n    state.read.macKey = client ?\n      sp.keys.server_write_MAC_key : sp.keys.client_write_MAC_key;\n    state.write.macKey = client ?\n      sp.keys.client_write_MAC_key : sp.keys.server_write_MAC_key;\n\n    // cipher suite setup\n    c.session.cipherSuite.initConnectionState(state, c, sp);\n\n    // compression setup\n    switch(sp.compression_algorithm) {\n    case tls.CompressionMethod.none:\n      break;\n    case tls.CompressionMethod.deflate:\n      state.read.compressFunction = inflate;\n      state.write.compressFunction = deflate;\n      break;\n    default:\n      throw new Error('Unsupported compression algorithm.');\n    }\n  }\n\n  return state;\n};\n\n/**\n * Creates a Random structure.\n *\n * struct {\n *   uint32 gmt_unix_time;\n *   opaque random_bytes[28];\n * } Random;\n *\n * gmt_unix_time:\n *   The current time and date in standard UNIX 32-bit format (seconds since\n *   the midnight starting Jan 1, 1970, UTC, ignoring leap seconds) according\n *   to the sender's internal clock. Clocks are not required to be set\n *   correctly by the basic TLS protocol; higher-level or application\n *   protocols may define additional requirements. Note that, for historical\n *   reasons, the data element is named using GMT, the predecessor of the\n *   current worldwide time base, UTC.\n * random_bytes:\n *   28 bytes generated by a secure random number generator.\n *\n * @return the Random structure as a byte array.\n */\ntls.createRandom = function() {\n  // get UTC milliseconds\n  var d = new Date();\n  var utc = +d + d.getTimezoneOffset() * 60000;\n  var rval = forge.util.createBuffer();\n  rval.putInt32(utc);\n  rval.putBytes(forge.random.getBytes(28));\n  return rval;\n};\n\n/**\n * Creates a TLS record with the given type and data.\n *\n * @param c the connection.\n * @param options:\n *   type: the record type.\n *   data: the plain text data in a byte buffer.\n *\n * @return the created record.\n */\ntls.createRecord = function(c, options) {\n  if(!options.data) {\n    return null;\n  }\n  var record = {\n    type: options.type,\n    version: {\n      major: c.version.major,\n      minor: c.version.minor\n    },\n    length: options.data.length(),\n    fragment: options.data\n  };\n  return record;\n};\n\n/**\n * Creates a TLS alert record.\n *\n * @param c the connection.\n * @param alert:\n *   level: the TLS alert level.\n *   description: the TLS alert description.\n *\n * @return the created alert record.\n */\ntls.createAlert = function(c, alert) {\n  var b = forge.util.createBuffer();\n  b.putByte(alert.level);\n  b.putByte(alert.description);\n  return tls.createRecord(c, {\n    type: tls.ContentType.alert,\n    data: b\n  });\n};\n\n/* The structure of a TLS handshake message.\n *\n * struct {\n *    HandshakeType msg_type;    // handshake type\n *    uint24 length;             // bytes in message\n *    select(HandshakeType) {\n *       case hello_request:       HelloRequest;\n *       case client_hello:        ClientHello;\n *       case server_hello:        ServerHello;\n *       case certificate:         Certificate;\n *       case server_key_exchange: ServerKeyExchange;\n *       case certificate_request: CertificateRequest;\n *       case server_hello_done:   ServerHelloDone;\n *       case certificate_verify:  CertificateVerify;\n *       case client_key_exchange: ClientKeyExchange;\n *       case finished:            Finished;\n *    } body;\n * } Handshake;\n */\n\n/**\n * Creates a ClientHello message.\n *\n * opaque SessionID<0..32>;\n * enum { null(0), deflate(1), (255) } CompressionMethod;\n * uint8 CipherSuite[2];\n *\n * struct {\n *   ProtocolVersion client_version;\n *   Random random;\n *   SessionID session_id;\n *   CipherSuite cipher_suites<2..2^16-2>;\n *   CompressionMethod compression_methods<1..2^8-1>;\n *   select(extensions_present) {\n *     case false:\n *       struct {};\n *     case true:\n *       Extension extensions<0..2^16-1>;\n *   };\n * } ClientHello;\n *\n * The extension format for extended client hellos and server hellos is:\n *\n * struct {\n *   ExtensionType extension_type;\n *   opaque extension_data<0..2^16-1>;\n * } Extension;\n *\n * Here:\n *\n * - \"extension_type\" identifies the particular extension type.\n * - \"extension_data\" contains information specific to the particular\n * extension type.\n *\n * The extension types defined in this document are:\n *\n * enum {\n *   server_name(0), max_fragment_length(1),\n *   client_certificate_url(2), trusted_ca_keys(3),\n *   truncated_hmac(4), status_request(5), (65535)\n * } ExtensionType;\n *\n * @param c the connection.\n *\n * @return the ClientHello byte buffer.\n */\ntls.createClientHello = function(c) {\n  // save hello version\n  c.session.clientHelloVersion = {\n    major: c.version.major,\n    minor: c.version.minor\n  };\n\n  // create supported cipher suites\n  var cipherSuites = forge.util.createBuffer();\n  for(var i = 0; i < c.cipherSuites.length; ++i) {\n    var cs = c.cipherSuites[i];\n    cipherSuites.putByte(cs.id[0]);\n    cipherSuites.putByte(cs.id[1]);\n  }\n  var cSuites = cipherSuites.length();\n\n  // create supported compression methods, null always supported, but\n  // also support deflate if connection has inflate and deflate methods\n  var compressionMethods = forge.util.createBuffer();\n  compressionMethods.putByte(tls.CompressionMethod.none);\n  // FIXME: deflate support disabled until issues with raw deflate data\n  // without zlib headers are resolved\n  /*\n  if(c.inflate !== null && c.deflate !== null) {\n    compressionMethods.putByte(tls.CompressionMethod.deflate);\n  }\n  */\n  var cMethods = compressionMethods.length();\n\n  // create TLS SNI (server name indication) extension if virtual host\n  // has been specified, see RFC 3546\n  var extensions = forge.util.createBuffer();\n  if(c.virtualHost) {\n    // create extension struct\n    var ext = forge.util.createBuffer();\n    ext.putByte(0x00); // type server_name (ExtensionType is 2 bytes)\n    ext.putByte(0x00);\n\n    /* In order to provide the server name, clients MAY include an\n     * extension of type \"server_name\" in the (extended) client hello.\n     * The \"extension_data\" field of this extension SHALL contain\n     * \"ServerNameList\" where:\n     *\n     * struct {\n     *   NameType name_type;\n     *   select(name_type) {\n     *     case host_name: HostName;\n     *   } name;\n     * } ServerName;\n     *\n     * enum {\n     *   host_name(0), (255)\n     * } NameType;\n     *\n     * opaque HostName<1..2^16-1>;\n     *\n     * struct {\n     *   ServerName server_name_list<1..2^16-1>\n     * } ServerNameList;\n     */\n    var serverName = forge.util.createBuffer();\n    serverName.putByte(0x00); // type host_name\n    writeVector(serverName, 2, forge.util.createBuffer(c.virtualHost));\n\n    // ServerNameList is in extension_data\n    var snList = forge.util.createBuffer();\n    writeVector(snList, 2, serverName);\n    writeVector(ext, 2, snList);\n    extensions.putBuffer(ext);\n  }\n  var extLength = extensions.length();\n  if(extLength > 0) {\n    // add extension vector length\n    extLength += 2;\n  }\n\n  // determine length of the handshake message\n  // cipher suites and compression methods size will need to be\n  // updated if more get added to the list\n  var sessionId = c.session.id;\n  var length =\n    sessionId.length + 1 + // session ID vector\n    2 +                    // version (major + minor)\n    4 + 28 +               // random time and random bytes\n    2 + cSuites +          // cipher suites vector\n    1 + cMethods +         // compression methods vector\n    extLength;             // extensions vector\n\n  // build record fragment\n  var rval = forge.util.createBuffer();\n  rval.putByte(tls.HandshakeType.client_hello);\n  rval.putInt24(length);                     // handshake length\n  rval.putByte(c.version.major);             // major version\n  rval.putByte(c.version.minor);             // minor version\n  rval.putBytes(c.session.sp.client_random); // random time + bytes\n  writeVector(rval, 1, forge.util.createBuffer(sessionId));\n  writeVector(rval, 2, cipherSuites);\n  writeVector(rval, 1, compressionMethods);\n  if(extLength > 0) {\n    writeVector(rval, 2, extensions);\n  }\n  return rval;\n};\n\n/**\n * Creates a ServerHello message.\n *\n * @param c the connection.\n *\n * @return the ServerHello byte buffer.\n */\ntls.createServerHello = function(c) {\n  // determine length of the handshake message\n  var sessionId = c.session.id;\n  var length =\n    sessionId.length + 1 + // session ID vector\n    2 +                    // version (major + minor)\n    4 + 28 +               // random time and random bytes\n    2 +                    // chosen cipher suite\n    1;                     // chosen compression method\n\n  // build record fragment\n  var rval = forge.util.createBuffer();\n  rval.putByte(tls.HandshakeType.server_hello);\n  rval.putInt24(length);                     // handshake length\n  rval.putByte(c.version.major);             // major version\n  rval.putByte(c.version.minor);             // minor version\n  rval.putBytes(c.session.sp.server_random); // random time + bytes\n  writeVector(rval, 1, forge.util.createBuffer(sessionId));\n  rval.putByte(c.session.cipherSuite.id[0]);\n  rval.putByte(c.session.cipherSuite.id[1]);\n  rval.putByte(c.session.compressionMethod);\n  return rval;\n};\n\n/**\n * Creates a Certificate message.\n *\n * When this message will be sent:\n *   This is the first message the client can send after receiving a server\n *   hello done message and the first message the server can send after\n *   sending a ServerHello. This client message is only sent if the server\n *   requests a certificate. If no suitable certificate is available, the\n *   client should send a certificate message containing no certificates. If\n *   client authentication is required by the server for the handshake to\n *   continue, it may respond with a fatal handshake failure alert.\n *\n * opaque ASN.1Cert<1..2^24-1>;\n *\n * struct {\n *   ASN.1Cert certificate_list<0..2^24-1>;\n * } Certificate;\n *\n * @param c the connection.\n *\n * @return the Certificate byte buffer.\n */\ntls.createCertificate = function(c) {\n  // TODO: check certificate request to ensure types are supported\n\n  // get a certificate (a certificate as a PEM string)\n  var client = (c.entity === tls.ConnectionEnd.client);\n  var cert = null;\n  if(c.getCertificate) {\n    var hint;\n    if(client) {\n      hint = c.session.certificateRequest;\n    } else {\n      hint = c.session.extensions.server_name.serverNameList;\n    }\n    cert = c.getCertificate(c, hint);\n  }\n\n  // buffer to hold certificate list\n  var certList = forge.util.createBuffer();\n  if(cert !== null) {\n    try {\n      // normalize cert to a chain of certificates\n      if(!forge.util.isArray(cert)) {\n        cert = [cert];\n      }\n      var asn1 = null;\n      for(var i = 0; i < cert.length; ++i) {\n        var msg = forge.pem.decode(cert[i])[0];\n        if(msg.type !== 'CERTIFICATE' &&\n          msg.type !== 'X509 CERTIFICATE' &&\n          msg.type !== 'TRUSTED CERTIFICATE') {\n          var error = new Error('Could not convert certificate from PEM; PEM ' +\n            'header type is not \"CERTIFICATE\", \"X509 CERTIFICATE\", or ' +\n            '\"TRUSTED CERTIFICATE\".');\n          error.headerType = msg.type;\n          throw error;\n        }\n        if(msg.procType && msg.procType.type === 'ENCRYPTED') {\n          throw new Error('Could not convert certificate from PEM; PEM is encrypted.');\n        }\n\n        var der = forge.util.createBuffer(msg.body);\n        if(asn1 === null) {\n          asn1 = forge.asn1.fromDer(der.bytes(), false);\n        }\n\n        // certificate entry is itself a vector with 3 length bytes\n        var certBuffer = forge.util.createBuffer();\n        writeVector(certBuffer, 3, der);\n\n        // add cert vector to cert list vector\n        certList.putBuffer(certBuffer);\n      }\n\n      // save certificate\n      cert = forge.pki.certificateFromAsn1(asn1);\n      if(client) {\n        c.session.clientCertificate = cert;\n      } else {\n        c.session.serverCertificate = cert;\n      }\n    } catch(ex) {\n      return c.error(c, {\n        message: 'Could not send certificate list.',\n        cause: ex,\n        send: true,\n        alert: {\n          level: tls.Alert.Level.fatal,\n          description: tls.Alert.Description.bad_certificate\n        }\n      });\n    }\n  }\n\n  // determine length of the handshake message\n  var length = 3 + certList.length(); // cert list vector\n\n  // build record fragment\n  var rval = forge.util.createBuffer();\n  rval.putByte(tls.HandshakeType.certificate);\n  rval.putInt24(length);\n  writeVector(rval, 3, certList);\n  return rval;\n};\n\n/**\n * Creates a ClientKeyExchange message.\n *\n * When this message will be sent:\n *   This message is always sent by the client. It will immediately follow the\n *   client certificate message, if it is sent. Otherwise it will be the first\n *   message sent by the client after it receives the server hello done\n *   message.\n *\n * Meaning of this message:\n *   With this message, the premaster secret is set, either though direct\n *   transmission of the RSA-encrypted secret, or by the transmission of\n *   Diffie-Hellman parameters which will allow each side to agree upon the\n *   same premaster secret. When the key exchange method is DH_RSA or DH_DSS,\n *   client certification has been requested, and the client was able to\n *   respond with a certificate which contained a Diffie-Hellman public key\n *   whose parameters (group and generator) matched those specified by the\n *   server in its certificate, this message will not contain any data.\n *\n * Meaning of this message:\n *   If RSA is being used for key agreement and authentication, the client\n *   generates a 48-byte premaster secret, encrypts it using the public key\n *   from the server's certificate or the temporary RSA key provided in a\n *   server key exchange message, and sends the result in an encrypted\n *   premaster secret message. This structure is a variant of the client\n *   key exchange message, not a message in itself.\n *\n * struct {\n *   select(KeyExchangeAlgorithm) {\n *     case rsa: EncryptedPreMasterSecret;\n *     case diffie_hellman: ClientDiffieHellmanPublic;\n *   } exchange_keys;\n * } ClientKeyExchange;\n *\n * struct {\n *   ProtocolVersion client_version;\n *   opaque random[46];\n * } PreMasterSecret;\n *\n * struct {\n *   public-key-encrypted PreMasterSecret pre_master_secret;\n * } EncryptedPreMasterSecret;\n *\n * A public-key-encrypted element is encoded as a vector <0..2^16-1>.\n *\n * @param c the connection.\n *\n * @return the ClientKeyExchange byte buffer.\n */\ntls.createClientKeyExchange = function(c) {\n  // create buffer to encrypt\n  var b = forge.util.createBuffer();\n\n  // add highest client-supported protocol to help server avoid version\n  // rollback attacks\n  b.putByte(c.session.clientHelloVersion.major);\n  b.putByte(c.session.clientHelloVersion.minor);\n\n  // generate and add 46 random bytes\n  b.putBytes(forge.random.getBytes(46));\n\n  // save pre-master secret\n  var sp = c.session.sp;\n  sp.pre_master_secret = b.getBytes();\n\n  // RSA-encrypt the pre-master secret\n  var key = c.session.serverCertificate.publicKey;\n  b = key.encrypt(sp.pre_master_secret);\n\n  /* Note: The encrypted pre-master secret will be stored in a\n    public-key-encrypted opaque vector that has the length prefixed using\n    2 bytes, so include those 2 bytes in the handshake message length. This\n    is done as a minor optimization instead of calling writeVector(). */\n\n  // determine length of the handshake message\n  var length = b.length + 2;\n\n  // build record fragment\n  var rval = forge.util.createBuffer();\n  rval.putByte(tls.HandshakeType.client_key_exchange);\n  rval.putInt24(length);\n  // add vector length bytes\n  rval.putInt16(b.length);\n  rval.putBytes(b);\n  return rval;\n};\n\n/**\n * Creates a ServerKeyExchange message.\n *\n * @param c the connection.\n *\n * @return the ServerKeyExchange byte buffer.\n */\ntls.createServerKeyExchange = function(c) {\n  // this implementation only supports RSA, no Diffie-Hellman support,\n  // so this record is empty\n\n  // determine length of the handshake message\n  var length = 0;\n\n  // build record fragment\n  var rval = forge.util.createBuffer();\n  if(length > 0) {\n    rval.putByte(tls.HandshakeType.server_key_exchange);\n    rval.putInt24(length);\n  }\n  return rval;\n};\n\n/**\n * Gets the signed data used to verify a client-side certificate. See\n * tls.createCertificateVerify() for details.\n *\n * @param c the connection.\n * @param callback the callback to call once the signed data is ready.\n */\ntls.getClientSignature = function(c, callback) {\n  // generate data to RSA encrypt\n  var b = forge.util.createBuffer();\n  b.putBuffer(c.session.md5.digest());\n  b.putBuffer(c.session.sha1.digest());\n  b = b.getBytes();\n\n  // create default signing function as necessary\n  c.getSignature = c.getSignature || function(c, b, callback) {\n    // do rsa encryption, call callback\n    var privateKey = null;\n    if(c.getPrivateKey) {\n      try {\n        privateKey = c.getPrivateKey(c, c.session.clientCertificate);\n        privateKey = forge.pki.privateKeyFromPem(privateKey);\n      } catch(ex) {\n        c.error(c, {\n          message: 'Could not get private key.',\n          cause: ex,\n          send: true,\n          alert: {\n            level: tls.Alert.Level.fatal,\n            description: tls.Alert.Description.internal_error\n          }\n        });\n      }\n    }\n    if(privateKey === null) {\n      c.error(c, {\n        message: 'No private key set.',\n        send: true,\n        alert: {\n          level: tls.Alert.Level.fatal,\n          description: tls.Alert.Description.internal_error\n        }\n      });\n    } else {\n      b = privateKey.sign(b, null);\n    }\n    callback(c, b);\n  };\n\n  // get client signature\n  c.getSignature(c, b, callback);\n};\n\n/**\n * Creates a CertificateVerify message.\n *\n * Meaning of this message:\n *   This structure conveys the client's Diffie-Hellman public value\n *   (Yc) if it was not already included in the client's certificate.\n *   The encoding used for Yc is determined by the enumerated\n *   PublicValueEncoding. This structure is a variant of the client\n *   key exchange message, not a message in itself.\n *\n * When this message will be sent:\n *   This message is used to provide explicit verification of a client\n *   certificate. This message is only sent following a client\n *   certificate that has signing capability (i.e. all certificates\n *   except those containing fixed Diffie-Hellman parameters). When\n *   sent, it will immediately follow the client key exchange message.\n *\n * struct {\n *   Signature signature;\n * } CertificateVerify;\n *\n * CertificateVerify.signature.md5_hash\n *   MD5(handshake_messages);\n *\n * Certificate.signature.sha_hash\n *   SHA(handshake_messages);\n *\n * Here handshake_messages refers to all handshake messages sent or\n * received starting at client hello up to but not including this\n * message, including the type and length fields of the handshake\n * messages.\n *\n * select(SignatureAlgorithm) {\n *   case anonymous: struct { };\n *   case rsa:\n *     digitally-signed struct {\n *       opaque md5_hash[16];\n *       opaque sha_hash[20];\n *     };\n *   case dsa:\n *     digitally-signed struct {\n *       opaque sha_hash[20];\n *     };\n * } Signature;\n *\n * In digital signing, one-way hash functions are used as input for a\n * signing algorithm. A digitally-signed element is encoded as an opaque\n * vector <0..2^16-1>, where the length is specified by the signing\n * algorithm and key.\n *\n * In RSA signing, a 36-byte structure of two hashes (one SHA and one\n * MD5) is signed (encrypted with the private key). It is encoded with\n * PKCS #1 block type 0 or type 1 as described in [PKCS1].\n *\n * In DSS, the 20 bytes of the SHA hash are run directly through the\n * Digital Signing Algorithm with no additional hashing.\n *\n * @param c the connection.\n * @param signature the signature to include in the message.\n *\n * @return the CertificateVerify byte buffer.\n */\ntls.createCertificateVerify = function(c, signature) {\n  /* Note: The signature will be stored in a \"digitally-signed\" opaque\n    vector that has the length prefixed using 2 bytes, so include those\n    2 bytes in the handshake message length. This is done as a minor\n    optimization instead of calling writeVector(). */\n\n  // determine length of the handshake message\n  var length = signature.length + 2;\n\n  // build record fragment\n  var rval = forge.util.createBuffer();\n  rval.putByte(tls.HandshakeType.certificate_verify);\n  rval.putInt24(length);\n  // add vector length bytes\n  rval.putInt16(signature.length);\n  rval.putBytes(signature);\n  return rval;\n};\n\n/**\n * Creates a CertificateRequest message.\n *\n * @param c the connection.\n *\n * @return the CertificateRequest byte buffer.\n */\ntls.createCertificateRequest = function(c) {\n  // TODO: support other certificate types\n  var certTypes = forge.util.createBuffer();\n\n  // common RSA certificate type\n  certTypes.putByte(0x01);\n\n  // add distinguished names from CA store\n  var cAs = forge.util.createBuffer();\n  for(var key in c.caStore.certs) {\n    var cert = c.caStore.certs[key];\n    var dn = forge.pki.distinguishedNameToAsn1(cert.subject);\n    var byteBuffer = forge.asn1.toDer(dn);\n    cAs.putInt16(byteBuffer.length());\n    cAs.putBuffer(byteBuffer);\n  }\n\n  // TODO: TLS 1.2+ has a different format\n\n  // determine length of the handshake message\n  var length =\n    1 + certTypes.length() +\n    2 + cAs.length();\n\n  // build record fragment\n  var rval = forge.util.createBuffer();\n  rval.putByte(tls.HandshakeType.certificate_request);\n  rval.putInt24(length);\n  writeVector(rval, 1, certTypes);\n  writeVector(rval, 2, cAs);\n  return rval;\n};\n\n/**\n * Creates a ServerHelloDone message.\n *\n * @param c the connection.\n *\n * @return the ServerHelloDone byte buffer.\n */\ntls.createServerHelloDone = function(c) {\n  // build record fragment\n  var rval = forge.util.createBuffer();\n  rval.putByte(tls.HandshakeType.server_hello_done);\n  rval.putInt24(0);\n  return rval;\n};\n\n/**\n * Creates a ChangeCipherSpec message.\n *\n * The change cipher spec protocol exists to signal transitions in\n * ciphering strategies. The protocol consists of a single message,\n * which is encrypted and compressed under the current (not the pending)\n * connection state. The message consists of a single byte of value 1.\n *\n * struct {\n *   enum { change_cipher_spec(1), (255) } type;\n * } ChangeCipherSpec;\n *\n * @return the ChangeCipherSpec byte buffer.\n */\ntls.createChangeCipherSpec = function() {\n  var rval = forge.util.createBuffer();\n  rval.putByte(0x01);\n  return rval;\n};\n\n/**\n * Creates a Finished message.\n *\n * struct {\n *   opaque verify_data[12];\n * } Finished;\n *\n * verify_data\n *   PRF(master_secret, finished_label, MD5(handshake_messages) +\n *   SHA-1(handshake_messages)) [0..11];\n *\n * finished_label\n *   For Finished messages sent by the client, the string \"client\n *   finished\". For Finished messages sent by the server, the\n *   string \"server finished\".\n *\n * handshake_messages\n *   All of the data from all handshake messages up to but not\n *   including this message. This is only data visible at the\n *   handshake layer and does not include record layer headers.\n *   This is the concatenation of all the Handshake structures as\n *   defined in 7.4 exchanged thus far.\n *\n * @param c the connection.\n *\n * @return the Finished byte buffer.\n */\ntls.createFinished = function(c) {\n  // generate verify_data\n  var b = forge.util.createBuffer();\n  b.putBuffer(c.session.md5.digest());\n  b.putBuffer(c.session.sha1.digest());\n\n  // TODO: determine prf function and verify length for TLS 1.2\n  var client = (c.entity === tls.ConnectionEnd.client);\n  var sp = c.session.sp;\n  var vdl = 12;\n  var prf = prf_TLS1;\n  var label = client ? 'client finished' : 'server finished';\n  b = prf(sp.master_secret, label, b.getBytes(), vdl);\n\n  // build record fragment\n  var rval = forge.util.createBuffer();\n  rval.putByte(tls.HandshakeType.finished);\n  rval.putInt24(b.length());\n  rval.putBuffer(b);\n  return rval;\n};\n\n/**\n * Creates a HeartbeatMessage (See RFC 6520).\n *\n * struct {\n *   HeartbeatMessageType type;\n *   uint16 payload_length;\n *   opaque payload[HeartbeatMessage.payload_length];\n *   opaque padding[padding_length];\n * } HeartbeatMessage;\n *\n * The total length of a HeartbeatMessage MUST NOT exceed 2^14 or\n * max_fragment_length when negotiated as defined in [RFC6066].\n *\n * type: The message type, either heartbeat_request or heartbeat_response.\n *\n * payload_length: The length of the payload.\n *\n * payload: The payload consists of arbitrary content.\n *\n * padding: The padding is random content that MUST be ignored by the\n *   receiver. The length of a HeartbeatMessage is TLSPlaintext.length\n *   for TLS and DTLSPlaintext.length for DTLS. Furthermore, the\n *   length of the type field is 1 byte, and the length of the\n *   payload_length is 2. Therefore, the padding_length is\n *   TLSPlaintext.length - payload_length - 3 for TLS and\n *   DTLSPlaintext.length - payload_length - 3 for DTLS. The\n *   padding_length MUST be at least 16.\n *\n * The sender of a HeartbeatMessage MUST use a random padding of at\n * least 16 bytes. The padding of a received HeartbeatMessage message\n * MUST be ignored.\n *\n * If the payload_length of a received HeartbeatMessage is too large,\n * the received HeartbeatMessage MUST be discarded silently.\n *\n * @param c the connection.\n * @param type the tls.HeartbeatMessageType.\n * @param payload the heartbeat data to send as the payload.\n * @param [payloadLength] the payload length to use, defaults to the\n *          actual payload length.\n *\n * @return the HeartbeatRequest byte buffer.\n */\ntls.createHeartbeat = function(type, payload, payloadLength) {\n  if(typeof payloadLength === 'undefined') {\n    payloadLength = payload.length;\n  }\n  // build record fragment\n  var rval = forge.util.createBuffer();\n  rval.putByte(type);               // heartbeat message type\n  rval.putInt16(payloadLength);     // payload length\n  rval.putBytes(payload);           // payload\n  // padding\n  var plaintextLength = rval.length();\n  var paddingLength = Math.max(16, plaintextLength - payloadLength - 3);\n  rval.putBytes(forge.random.getBytes(paddingLength));\n  return rval;\n};\n\n/**\n * Fragments, compresses, encrypts, and queues a record for delivery.\n *\n * @param c the connection.\n * @param record the record to queue.\n */\ntls.queue = function(c, record) {\n  // error during record creation\n  if(!record) {\n    return;\n  }\n\n  if(record.fragment.length() === 0) {\n    if(record.type === tls.ContentType.handshake ||\n      record.type === tls.ContentType.alert ||\n      record.type === tls.ContentType.change_cipher_spec) {\n      // Empty handshake, alert of change cipher spec messages are not allowed per the TLS specification and should not be sent.\n      return;\n    }\n  }\n\n  // if the record is a handshake record, update handshake hashes\n  if(record.type === tls.ContentType.handshake) {\n    var bytes = record.fragment.bytes();\n    c.session.md5.update(bytes);\n    c.session.sha1.update(bytes);\n    bytes = null;\n  }\n\n  // handle record fragmentation\n  var records;\n  if(record.fragment.length() <= tls.MaxFragment) {\n    records = [record];\n  } else {\n    // fragment data as long as it is too long\n    records = [];\n    var data = record.fragment.bytes();\n    while(data.length > tls.MaxFragment) {\n      records.push(tls.createRecord(c, {\n        type: record.type,\n        data: forge.util.createBuffer(data.slice(0, tls.MaxFragment))\n      }));\n      data = data.slice(tls.MaxFragment);\n    }\n    // add last record\n    if(data.length > 0) {\n      records.push(tls.createRecord(c, {\n        type: record.type,\n        data: forge.util.createBuffer(data)\n      }));\n    }\n  }\n\n  // compress and encrypt all fragmented records\n  for(var i = 0; i < records.length && !c.fail; ++i) {\n    // update the record using current write state\n    var rec = records[i];\n    var s = c.state.current.write;\n    if(s.update(c, rec)) {\n      // store record\n      c.records.push(rec);\n    }\n  }\n};\n\n/**\n * Flushes all queued records to the output buffer and calls the\n * tlsDataReady() handler on the given connection.\n *\n * @param c the connection.\n *\n * @return true on success, false on failure.\n */\ntls.flush = function(c) {\n  for(var i = 0; i < c.records.length; ++i) {\n    var record = c.records[i];\n\n    // add record header and fragment\n    c.tlsData.putByte(record.type);\n    c.tlsData.putByte(record.version.major);\n    c.tlsData.putByte(record.version.minor);\n    c.tlsData.putInt16(record.fragment.length());\n    c.tlsData.putBuffer(c.records[i].fragment);\n  }\n  c.records = [];\n  return c.tlsDataReady(c);\n};\n\n/**\n * Maps a pki.certificateError to a tls.Alert.Description.\n *\n * @param error the error to map.\n *\n * @return the alert description.\n */\nvar _certErrorToAlertDesc = function(error) {\n  switch(error) {\n  case true:\n    return true;\n  case forge.pki.certificateError.bad_certificate:\n    return tls.Alert.Description.bad_certificate;\n  case forge.pki.certificateError.unsupported_certificate:\n    return tls.Alert.Description.unsupported_certificate;\n  case forge.pki.certificateError.certificate_revoked:\n    return tls.Alert.Description.certificate_revoked;\n  case forge.pki.certificateError.certificate_expired:\n    return tls.Alert.Description.certificate_expired;\n  case forge.pki.certificateError.certificate_unknown:\n    return tls.Alert.Description.certificate_unknown;\n  case forge.pki.certificateError.unknown_ca:\n    return tls.Alert.Description.unknown_ca;\n  default:\n    return tls.Alert.Description.bad_certificate;\n  }\n};\n\n/**\n * Maps a tls.Alert.Description to a pki.certificateError.\n *\n * @param desc the alert description.\n *\n * @return the certificate error.\n */\nvar _alertDescToCertError = function(desc) {\n  switch(desc) {\n  case true:\n    return true;\n  case tls.Alert.Description.bad_certificate:\n    return forge.pki.certificateError.bad_certificate;\n  case tls.Alert.Description.unsupported_certificate:\n    return forge.pki.certificateError.unsupported_certificate;\n  case tls.Alert.Description.certificate_revoked:\n    return forge.pki.certificateError.certificate_revoked;\n  case tls.Alert.Description.certificate_expired:\n    return forge.pki.certificateError.certificate_expired;\n  case tls.Alert.Description.certificate_unknown:\n    return forge.pki.certificateError.certificate_unknown;\n  case tls.Alert.Description.unknown_ca:\n    return forge.pki.certificateError.unknown_ca;\n  default:\n    return forge.pki.certificateError.bad_certificate;\n  }\n};\n\n/**\n * Verifies a certificate chain against the given connection's\n * Certificate Authority store.\n *\n * @param c the TLS connection.\n * @param chain the certificate chain to verify, with the root or highest\n *          authority at the end.\n *\n * @return true if successful, false if not.\n */\ntls.verifyCertificateChain = function(c, chain) {\n  try {\n    // Make a copy of c.verifyOptions so that we can modify options.verify\n    // without modifying c.verifyOptions.\n    var options = {};\n    for (var key in c.verifyOptions) {\n      options[key] = c.verifyOptions[key];\n    }\n\n    options.verify = function(vfd, depth, chain) {\n      // convert pki.certificateError to tls alert description\n      var desc = _certErrorToAlertDesc(vfd);\n\n      // call application callback\n      var ret = c.verify(c, vfd, depth, chain);\n      if(ret !== true) {\n        if(typeof ret === 'object' && !forge.util.isArray(ret)) {\n          // throw custom error\n          var error = new Error('The application rejected the certificate.');\n          error.send = true;\n          error.alert = {\n            level: tls.Alert.Level.fatal,\n            description: tls.Alert.Description.bad_certificate\n          };\n          if(ret.message) {\n            error.message = ret.message;\n          }\n          if(ret.alert) {\n            error.alert.description = ret.alert;\n          }\n          throw error;\n        }\n\n        // convert tls alert description to pki.certificateError\n        if(ret !== vfd) {\n          ret = _alertDescToCertError(ret);\n        }\n      }\n\n      return ret;\n    };\n\n    // verify chain\n    forge.pki.verifyCertificateChain(c.caStore, chain, options);\n  } catch(ex) {\n    // build tls error if not already customized\n    var err = ex;\n    if(typeof err !== 'object' || forge.util.isArray(err)) {\n      err = {\n        send: true,\n        alert: {\n          level: tls.Alert.Level.fatal,\n          description: _certErrorToAlertDesc(ex)\n        }\n      };\n    }\n    if(!('send' in err)) {\n      err.send = true;\n    }\n    if(!('alert' in err)) {\n      err.alert = {\n        level: tls.Alert.Level.fatal,\n        description: _certErrorToAlertDesc(err.error)\n      };\n    }\n\n    // send error\n    c.error(c, err);\n  }\n\n  return !c.fail;\n};\n\n/**\n * Creates a new TLS session cache.\n *\n * @param cache optional map of session ID to cached session.\n * @param capacity the maximum size for the cache (default: 100).\n *\n * @return the new TLS session cache.\n */\ntls.createSessionCache = function(cache, capacity) {\n  var rval = null;\n\n  // assume input is already a session cache object\n  if(cache && cache.getSession && cache.setSession && cache.order) {\n    rval = cache;\n  } else {\n    // create cache\n    rval = {};\n    rval.cache = cache || {};\n    rval.capacity = Math.max(capacity || 100, 1);\n    rval.order = [];\n\n    // store order for sessions, delete session overflow\n    for(var key in cache) {\n      if(rval.order.length <= capacity) {\n        rval.order.push(key);\n      } else {\n        delete cache[key];\n      }\n    }\n\n    // get a session from a session ID (or get any session)\n    rval.getSession = function(sessionId) {\n      var session = null;\n      var key = null;\n\n      // if session ID provided, use it\n      if(sessionId) {\n        key = forge.util.bytesToHex(sessionId);\n      } else if(rval.order.length > 0) {\n        // get first session from cache\n        key = rval.order[0];\n      }\n\n      if(key !== null && key in rval.cache) {\n        // get cached session and remove from cache\n        session = rval.cache[key];\n        delete rval.cache[key];\n        for(var i in rval.order) {\n          if(rval.order[i] === key) {\n            rval.order.splice(i, 1);\n            break;\n          }\n        }\n      }\n\n      return session;\n    };\n\n    // set a session in the cache\n    rval.setSession = function(sessionId, session) {\n      // remove session from cache if at capacity\n      if(rval.order.length === rval.capacity) {\n        var key = rval.order.shift();\n        delete rval.cache[key];\n      }\n      // add session to cache\n      var key = forge.util.bytesToHex(sessionId);\n      rval.order.push(key);\n      rval.cache[key] = session;\n    };\n  }\n\n  return rval;\n};\n\n/**\n * Creates a new TLS connection.\n *\n * See public createConnection() docs for more details.\n *\n * @param options the options for this connection.\n *\n * @return the new TLS connection.\n */\ntls.createConnection = function(options) {\n  var caStore = null;\n  if(options.caStore) {\n    // if CA store is an array, convert it to a CA store object\n    if(forge.util.isArray(options.caStore)) {\n      caStore = forge.pki.createCaStore(options.caStore);\n    } else {\n      caStore = options.caStore;\n    }\n  } else {\n    // create empty CA store\n    caStore = forge.pki.createCaStore();\n  }\n\n  // setup default cipher suites\n  var cipherSuites = options.cipherSuites || null;\n  if(cipherSuites === null) {\n    cipherSuites = [];\n    for(var key in tls.CipherSuites) {\n      cipherSuites.push(tls.CipherSuites[key]);\n    }\n  }\n\n  // set default entity\n  var entity = (options.server || false) ?\n    tls.ConnectionEnd.server : tls.ConnectionEnd.client;\n\n  // create session cache if requested\n  var sessionCache = options.sessionCache ?\n    tls.createSessionCache(options.sessionCache) : null;\n\n  // create TLS connection\n  var c = {\n    version: {major: tls.Version.major, minor: tls.Version.minor},\n    entity: entity,\n    sessionId: options.sessionId,\n    caStore: caStore,\n    sessionCache: sessionCache,\n    cipherSuites: cipherSuites,\n    connected: options.connected,\n    virtualHost: options.virtualHost || null,\n    verifyClient: options.verifyClient || false,\n    verify: options.verify || function(cn, vfd, dpth, cts) {return vfd;},\n    verifyOptions: options.verifyOptions || {},\n    getCertificate: options.getCertificate || null,\n    getPrivateKey: options.getPrivateKey || null,\n    getSignature: options.getSignature || null,\n    input: forge.util.createBuffer(),\n    tlsData: forge.util.createBuffer(),\n    data: forge.util.createBuffer(),\n    tlsDataReady: options.tlsDataReady,\n    dataReady: options.dataReady,\n    heartbeatReceived: options.heartbeatReceived,\n    closed: options.closed,\n    error: function(c, ex) {\n      // set origin if not set\n      ex.origin = ex.origin ||\n        ((c.entity === tls.ConnectionEnd.client) ? 'client' : 'server');\n\n      // send TLS alert\n      if(ex.send) {\n        tls.queue(c, tls.createAlert(c, ex.alert));\n        tls.flush(c);\n      }\n\n      // error is fatal by default\n      var fatal = (ex.fatal !== false);\n      if(fatal) {\n        // set fail flag\n        c.fail = true;\n      }\n\n      // call error handler first\n      options.error(c, ex);\n\n      if(fatal) {\n        // fatal error, close connection, do not clear fail\n        c.close(false);\n      }\n    },\n    deflate: options.deflate || null,\n    inflate: options.inflate || null\n  };\n\n  /**\n   * Resets a closed TLS connection for reuse. Called in c.close().\n   *\n   * @param clearFail true to clear the fail flag (default: true).\n   */\n  c.reset = function(clearFail) {\n    c.version = {major: tls.Version.major, minor: tls.Version.minor};\n    c.record = null;\n    c.session = null;\n    c.peerCertificate = null;\n    c.state = {\n      pending: null,\n      current: null\n    };\n    c.expect = (c.entity === tls.ConnectionEnd.client) ? SHE : CHE;\n    c.fragmented = null;\n    c.records = [];\n    c.open = false;\n    c.handshakes = 0;\n    c.handshaking = false;\n    c.isConnected = false;\n    c.fail = !(clearFail || typeof(clearFail) === 'undefined');\n    c.input.clear();\n    c.tlsData.clear();\n    c.data.clear();\n    c.state.current = tls.createConnectionState(c);\n  };\n\n  // do initial reset of connection\n  c.reset();\n\n  /**\n   * Updates the current TLS engine state based on the given record.\n   *\n   * @param c the TLS connection.\n   * @param record the TLS record to act on.\n   */\n  var _update = function(c, record) {\n    // get record handler (align type in table by subtracting lowest)\n    var aligned = record.type - tls.ContentType.change_cipher_spec;\n    var handlers = ctTable[c.entity][c.expect];\n    if(aligned in handlers) {\n      handlers[aligned](c, record);\n    } else {\n      // unexpected record\n      tls.handleUnexpected(c, record);\n    }\n  };\n\n  /**\n   * Reads the record header and initializes the next record on the given\n   * connection.\n   *\n   * @param c the TLS connection with the next record.\n   *\n   * @return 0 if the input data could be processed, otherwise the\n   *         number of bytes required for data to be processed.\n   */\n  var _readRecordHeader = function(c) {\n    var rval = 0;\n\n    // get input buffer and its length\n    var b = c.input;\n    var len = b.length();\n\n    // need at least 5 bytes to initialize a record\n    if(len < 5) {\n      rval = 5 - len;\n    } else {\n      // enough bytes for header\n      // initialize record\n      c.record = {\n        type: b.getByte(),\n        version: {\n          major: b.getByte(),\n          minor: b.getByte()\n        },\n        length: b.getInt16(),\n        fragment: forge.util.createBuffer(),\n        ready: false\n      };\n\n      // check record version\n      var compatibleVersion = (c.record.version.major === c.version.major);\n      if(compatibleVersion && c.session && c.session.version) {\n        // session version already set, require same minor version\n        compatibleVersion = (c.record.version.minor === c.version.minor);\n      }\n      if(!compatibleVersion) {\n        c.error(c, {\n          message: 'Incompatible TLS version.',\n          send: true,\n          alert: {\n            level: tls.Alert.Level.fatal,\n            description: tls.Alert.Description.protocol_version\n          }\n        });\n      }\n    }\n\n    return rval;\n  };\n\n  /**\n   * Reads the next record's contents and appends its message to any\n   * previously fragmented message.\n   *\n   * @param c the TLS connection with the next record.\n   *\n   * @return 0 if the input data could be processed, otherwise the\n   *         number of bytes required for data to be processed.\n   */\n  var _readRecord = function(c) {\n    var rval = 0;\n\n    // ensure there is enough input data to get the entire record\n    var b = c.input;\n    var len = b.length();\n    if(len < c.record.length) {\n      // not enough data yet, return how much is required\n      rval = c.record.length - len;\n    } else {\n      // there is enough data to parse the pending record\n      // fill record fragment and compact input buffer\n      c.record.fragment.putBytes(b.getBytes(c.record.length));\n      b.compact();\n\n      // update record using current read state\n      var s = c.state.current.read;\n      if(s.update(c, c.record)) {\n        // see if there is a previously fragmented message that the\n        // new record's message fragment should be appended to\n        if(c.fragmented !== null) {\n          // if the record type matches a previously fragmented\n          // record, append the record fragment to it\n          if(c.fragmented.type === c.record.type) {\n            // concatenate record fragments\n            c.fragmented.fragment.putBuffer(c.record.fragment);\n            c.record = c.fragmented;\n          } else {\n            // error, invalid fragmented record\n            c.error(c, {\n              message: 'Invalid fragmented record.',\n              send: true,\n              alert: {\n                level: tls.Alert.Level.fatal,\n                description:\n                  tls.Alert.Description.unexpected_message\n              }\n            });\n          }\n        }\n\n        // record is now ready\n        c.record.ready = true;\n      }\n    }\n\n    return rval;\n  };\n\n  /**\n   * Performs a handshake using the TLS Handshake Protocol, as a client.\n   *\n   * This method should only be called if the connection is in client mode.\n   *\n   * @param sessionId the session ID to use, null to start a new one.\n   */\n  c.handshake = function(sessionId) {\n    // error to call this in non-client mode\n    if(c.entity !== tls.ConnectionEnd.client) {\n      // not fatal error\n      c.error(c, {\n        message: 'Cannot initiate handshake as a server.',\n        fatal: false\n      });\n    } else if(c.handshaking) {\n      // handshake is already in progress, fail but not fatal error\n      c.error(c, {\n        message: 'Handshake already in progress.',\n        fatal: false\n      });\n    } else {\n      // clear fail flag on reuse\n      if(c.fail && !c.open && c.handshakes === 0) {\n        c.fail = false;\n      }\n\n      // now handshaking\n      c.handshaking = true;\n\n      // default to blank (new session)\n      sessionId = sessionId || '';\n\n      // if a session ID was specified, try to find it in the cache\n      var session = null;\n      if(sessionId.length > 0) {\n        if(c.sessionCache) {\n          session = c.sessionCache.getSession(sessionId);\n        }\n\n        // matching session not found in cache, clear session ID\n        if(session === null) {\n          sessionId = '';\n        }\n      }\n\n      // no session given, grab a session from the cache, if available\n      if(sessionId.length === 0 && c.sessionCache) {\n        session = c.sessionCache.getSession();\n        if(session !== null) {\n          sessionId = session.id;\n        }\n      }\n\n      // set up session\n      c.session = {\n        id: sessionId,\n        version: null,\n        cipherSuite: null,\n        compressionMethod: null,\n        serverCertificate: null,\n        certificateRequest: null,\n        clientCertificate: null,\n        sp: {},\n        md5: forge.md.md5.create(),\n        sha1: forge.md.sha1.create()\n      };\n\n      // use existing session information\n      if(session) {\n        // only update version on connection, session version not yet set\n        c.version = session.version;\n        c.session.sp = session.sp;\n      }\n\n      // generate new client random\n      c.session.sp.client_random = tls.createRandom().getBytes();\n\n      // connection now open\n      c.open = true;\n\n      // send hello\n      tls.queue(c, tls.createRecord(c, {\n        type: tls.ContentType.handshake,\n        data: tls.createClientHello(c)\n      }));\n      tls.flush(c);\n    }\n  };\n\n  /**\n   * Called when TLS protocol data has been received from somewhere and should\n   * be processed by the TLS engine.\n   *\n   * @param data the TLS protocol data, as a string, to process.\n   *\n   * @return 0 if the data could be processed, otherwise the number of bytes\n   *         required for data to be processed.\n   */\n  c.process = function(data) {\n    var rval = 0;\n\n    // buffer input data\n    if(data) {\n      c.input.putBytes(data);\n    }\n\n    // process next record if no failure, process will be called after\n    // each record is handled (since handling can be asynchronous)\n    if(!c.fail) {\n      // reset record if ready and now empty\n      if(c.record !== null &&\n        c.record.ready && c.record.fragment.isEmpty()) {\n        c.record = null;\n      }\n\n      // if there is no pending record, try to read record header\n      if(c.record === null) {\n        rval = _readRecordHeader(c);\n      }\n\n      // read the next record (if record not yet ready)\n      if(!c.fail && c.record !== null && !c.record.ready) {\n        rval = _readRecord(c);\n      }\n\n      // record ready to be handled, update engine state\n      if(!c.fail && c.record !== null && c.record.ready) {\n        _update(c, c.record);\n      }\n    }\n\n    return rval;\n  };\n\n  /**\n   * Requests that application data be packaged into a TLS record. The\n   * tlsDataReady handler will be called when the TLS record(s) have been\n   * prepared.\n   *\n   * @param data the application data, as a raw 'binary' encoded string, to\n   *          be sent; to send utf-16/utf-8 string data, use the return value\n   *          of util.encodeUtf8(str).\n   *\n   * @return true on success, false on failure.\n   */\n  c.prepare = function(data) {\n    tls.queue(c, tls.createRecord(c, {\n      type: tls.ContentType.application_data,\n      data: forge.util.createBuffer(data)\n    }));\n    return tls.flush(c);\n  };\n\n  /**\n   * Requests that a heartbeat request be packaged into a TLS record for\n   * transmission. The tlsDataReady handler will be called when TLS record(s)\n   * have been prepared.\n   *\n   * When a heartbeat response has been received, the heartbeatReceived\n   * handler will be called with the matching payload. This handler can\n   * be used to clear a retransmission timer, etc.\n   *\n   * @param payload the heartbeat data to send as the payload in the message.\n   * @param [payloadLength] the payload length to use, defaults to the\n   *          actual payload length.\n   *\n   * @return true on success, false on failure.\n   */\n  c.prepareHeartbeatRequest = function(payload, payloadLength) {\n    if(payload instanceof forge.util.ByteBuffer) {\n      payload = payload.bytes();\n    }\n    if(typeof payloadLength === 'undefined') {\n      payloadLength = payload.length;\n    }\n    c.expectedHeartbeatPayload = payload;\n    tls.queue(c, tls.createRecord(c, {\n      type: tls.ContentType.heartbeat,\n      data: tls.createHeartbeat(\n        tls.HeartbeatMessageType.heartbeat_request, payload, payloadLength)\n    }));\n    return tls.flush(c);\n  };\n\n  /**\n   * Closes the connection (sends a close_notify alert).\n   *\n   * @param clearFail true to clear the fail flag (default: true).\n   */\n  c.close = function(clearFail) {\n    // save session if connection didn't fail\n    if(!c.fail && c.sessionCache && c.session) {\n      // only need to preserve session ID, version, and security params\n      var session = {\n        id: c.session.id,\n        version: c.session.version,\n        sp: c.session.sp\n      };\n      session.sp.keys = null;\n      c.sessionCache.setSession(session.id, session);\n    }\n\n    if(c.open) {\n      // connection no longer open, clear input\n      c.open = false;\n      c.input.clear();\n\n      // if connected or handshaking, send an alert\n      if(c.isConnected || c.handshaking) {\n        c.isConnected = c.handshaking = false;\n\n        // send close_notify alert\n        tls.queue(c, tls.createAlert(c, {\n          level: tls.Alert.Level.warning,\n          description: tls.Alert.Description.close_notify\n        }));\n        tls.flush(c);\n      }\n\n      // call handler\n      c.closed(c);\n    }\n\n    // reset TLS connection, do not clear fail flag\n    c.reset(clearFail);\n  };\n\n  return c;\n};\n\n/* TLS API */\nmodule.exports = forge.tls = forge.tls || {};\n\n// expose non-functions\nfor(var key in tls) {\n  if(typeof tls[key] !== 'function') {\n    forge.tls[key] = tls[key];\n  }\n}\n\n// expose prf_tls1 for testing\nforge.tls.prf_tls1 = prf_TLS1;\n\n// expose sha1 hmac method\nforge.tls.hmac_sha1 = hmac_sha1;\n\n// expose session cache creation\nforge.tls.createSessionCache = tls.createSessionCache;\n\n/**\n * Creates a new TLS connection. This does not make any assumptions about the\n * transport layer that TLS is working on top of, ie: it does not assume there\n * is a TCP/IP connection or establish one. A TLS connection is totally\n * abstracted away from the layer is runs on top of, it merely establishes a\n * secure channel between a client\" and a \"server\".\n *\n * A TLS connection contains 4 connection states: pending read and write, and\n * current read and write.\n *\n * At initialization, the current read and write states will be null. Only once\n * the security parameters have been set and the keys have been generated can\n * the pending states be converted into current states. Current states will be\n * updated for each record processed.\n *\n * A custom certificate verify callback may be provided to check information\n * like the common name on the server's certificate. It will be called for\n * every certificate in the chain. It has the following signature:\n *\n * variable func(c, certs, index, preVerify)\n * Where:\n * c         The TLS connection\n * verified  Set to true if certificate was verified, otherwise the alert\n *           tls.Alert.Description for why the certificate failed.\n * depth     The current index in the chain, where 0 is the server's cert.\n * certs     The certificate chain, *NOTE* if the server was anonymous then\n *           the chain will be empty.\n *\n * The function returns true on success and on failure either the appropriate\n * tls.Alert.Description or an object with 'alert' set to the appropriate\n * tls.Alert.Description and 'message' set to a custom error message. If true\n * is not returned then the connection will abort using, in order of\n * availability, first the returned alert description, second the preVerify\n * alert description, and lastly the default 'bad_certificate'.\n *\n * There are three callbacks that can be used to make use of client-side\n * certificates where each takes the TLS connection as the first parameter:\n *\n * getCertificate(conn, hint)\n *   The second parameter is a hint as to which certificate should be\n *   returned. If the connection entity is a client, then the hint will be\n *   the CertificateRequest message from the server that is part of the\n *   TLS protocol. If the connection entity is a server, then it will be\n *   the servername list provided via an SNI extension the ClientHello, if\n *   one was provided (empty array if not). The hint can be examined to\n *   determine which certificate to use (advanced). Most implementations\n *   will just return a certificate. The return value must be a\n *   PEM-formatted certificate or an array of PEM-formatted certificates\n *   that constitute a certificate chain, with the first in the array/chain\n *   being the client's certificate.\n * getPrivateKey(conn, certificate)\n *   The second parameter is an forge.pki X.509 certificate object that\n *   is associated with the requested private key. The return value must\n *   be a PEM-formatted private key.\n * getSignature(conn, bytes, callback)\n *   This callback can be used instead of getPrivateKey if the private key\n *   is not directly accessible in javascript or should not be. For\n *   instance, a secure external web service could provide the signature\n *   in exchange for appropriate credentials. The second parameter is a\n *   string of bytes to be signed that are part of the TLS protocol. These\n *   bytes are used to verify that the private key for the previously\n *   provided client-side certificate is accessible to the client. The\n *   callback is a function that takes 2 parameters, the TLS connection\n *   and the RSA encrypted (signed) bytes as a string. This callback must\n *   be called once the signature is ready.\n *\n * @param options the options for this connection:\n *   server: true if the connection is server-side, false for client.\n *   sessionId: a session ID to reuse, null for a new connection.\n *   caStore: an array of certificates to trust.\n *   sessionCache: a session cache to use.\n *   cipherSuites: an optional array of cipher suites to use,\n *     see tls.CipherSuites.\n *   connected: function(conn) called when the first handshake completes.\n *   virtualHost: the virtual server name to use in a TLS SNI extension.\n *   verifyClient: true to require a client certificate in server mode,\n *     'optional' to request one, false not to (default: false).\n *   verify: a handler used to custom verify certificates in the chain.\n *   verifyOptions: an object with options for the certificate chain validation.\n *     See documentation of pki.verifyCertificateChain for possible options.\n *     verifyOptions.verify is ignored. If you wish to specify a verify handler\n *     use the verify key.\n *   getCertificate: an optional callback used to get a certificate or\n *     a chain of certificates (as an array).\n *   getPrivateKey: an optional callback used to get a private key.\n *   getSignature: an optional callback used to get a signature.\n *   tlsDataReady: function(conn) called when TLS protocol data has been\n *     prepared and is ready to be used (typically sent over a socket\n *     connection to its destination), read from conn.tlsData buffer.\n *   dataReady: function(conn) called when application data has\n *     been parsed from a TLS record and should be consumed by the\n *     application, read from conn.data buffer.\n *   closed: function(conn) called when the connection has been closed.\n *   error: function(conn, error) called when there was an error.\n *   deflate: function(inBytes) if provided, will deflate TLS records using\n *     the deflate algorithm if the server supports it.\n *   inflate: function(inBytes) if provided, will inflate TLS records using\n *     the deflate algorithm if the server supports it.\n *\n * @return the new TLS connection.\n */\nforge.tls.createConnection = tls.createConnection;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzkuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbm9kZS1mb3JnZS9saWIvdGxzLmpzP2ZiMmMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBBIEphdmFzY3JpcHQgaW1wbGVtZW50YXRpb24gb2YgVHJhbnNwb3J0IExheWVyIFNlY3VyaXR5IChUTFMpLlxuICpcbiAqIEBhdXRob3IgRGF2ZSBMb25nbGV5XG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDA5LTIwMTQgRGlnaXRhbCBCYXphYXIsIEluYy5cbiAqXG4gKiBUaGUgVExTIEhhbmRzaGFrZSBQcm90b2NvbCBpbnZvbHZlcyB0aGUgZm9sbG93aW5nIHN0ZXBzOlxuICpcbiAqIC0gRXhjaGFuZ2UgaGVsbG8gbWVzc2FnZXMgdG8gYWdyZWUgb24gYWxnb3JpdGhtcywgZXhjaGFuZ2UgcmFuZG9tIHZhbHVlcyxcbiAqIGFuZCBjaGVjayBmb3Igc2Vzc2lvbiByZXN1bXB0aW9uLlxuICpcbiAqIC0gRXhjaGFuZ2UgdGhlIG5lY2Vzc2FyeSBjcnlwdG9ncmFwaGljIHBhcmFtZXRlcnMgdG8gYWxsb3cgdGhlIGNsaWVudCBhbmRcbiAqIHNlcnZlciB0byBhZ3JlZSBvbiBhIHByZW1hc3RlciBzZWNyZXQuXG4gKlxuICogLSBFeGNoYW5nZSBjZXJ0aWZpY2F0ZXMgYW5kIGNyeXB0b2dyYXBoaWMgaW5mb3JtYXRpb24gdG8gYWxsb3cgdGhlIGNsaWVudFxuICogYW5kIHNlcnZlciB0byBhdXRoZW50aWNhdGUgdGhlbXNlbHZlcy5cbiAqXG4gKiAtIEdlbmVyYXRlIGEgbWFzdGVyIHNlY3JldCBmcm9tIHRoZSBwcmVtYXN0ZXIgc2VjcmV0IGFuZCBleGNoYW5nZWQgcmFuZG9tXG4gKiB2YWx1ZXMuXG4gKlxuICogLSBQcm92aWRlIHNlY3VyaXR5IHBhcmFtZXRlcnMgdG8gdGhlIHJlY29yZCBsYXllci5cbiAqXG4gKiAtIEFsbG93IHRoZSBjbGllbnQgYW5kIHNlcnZlciB0byB2ZXJpZnkgdGhhdCB0aGVpciBwZWVyIGhhcyBjYWxjdWxhdGVkIHRoZVxuICogc2FtZSBzZWN1cml0eSBwYXJhbWV0ZXJzIGFuZCB0aGF0IHRoZSBoYW5kc2hha2Ugb2NjdXJyZWQgd2l0aG91dCB0YW1wZXJpbmdcbiAqIGJ5IGFuIGF0dGFja2VyLlxuICpcbiAqIFVwIHRvIDQgZGlmZmVyZW50IG1lc3NhZ2VzIG1heSBiZSBzZW50IGR1cmluZyBhIGtleSBleGNoYW5nZS4gVGhlIHNlcnZlclxuICogY2VydGlmaWNhdGUsIHRoZSBzZXJ2ZXIga2V5IGV4Y2hhbmdlLCB0aGUgY2xpZW50IGNlcnRpZmljYXRlLCBhbmQgdGhlXG4gKiBjbGllbnQga2V5IGV4Y2hhbmdlLlxuICpcbiAqIEEgdHlwaWNhbCBoYW5kc2hha2UgKGZyb20gdGhlIGNsaWVudCdzIHBlcnNwZWN0aXZlKS5cbiAqXG4gKiAxLiBDbGllbnQgc2VuZHMgQ2xpZW50SGVsbG8uXG4gKiAyLiBDbGllbnQgcmVjZWl2ZXMgU2VydmVySGVsbG8uXG4gKiAzLiBDbGllbnQgcmVjZWl2ZXMgb3B0aW9uYWwgQ2VydGlmaWNhdGUuXG4gKiA0LiBDbGllbnQgcmVjZWl2ZXMgb3B0aW9uYWwgU2VydmVyS2V5RXhjaGFuZ2UuXG4gKiA1LiBDbGllbnQgcmVjZWl2ZXMgU2VydmVySGVsbG9Eb25lLlxuICogNi4gQ2xpZW50IHNlbmRzIG9wdGlvbmFsIENlcnRpZmljYXRlLlxuICogNy4gQ2xpZW50IHNlbmRzIENsaWVudEtleUV4Y2hhbmdlLlxuICogOC4gQ2xpZW50IHNlbmRzIG9wdGlvbmFsIENlcnRpZmljYXRlVmVyaWZ5LlxuICogOS4gQ2xpZW50IHNlbmRzIENoYW5nZUNpcGhlclNwZWMuXG4gKiAxMC4gQ2xpZW50IHNlbmRzIEZpbmlzaGVkLlxuICogMTEuIENsaWVudCByZWNlaXZlcyBDaGFuZ2VDaXBoZXJTcGVjLlxuICogMTIuIENsaWVudCByZWNlaXZlcyBGaW5pc2hlZC5cbiAqIDEzLiBDbGllbnQgc2VuZHMvcmVjZWl2ZXMgYXBwbGljYXRpb24gZGF0YS5cbiAqXG4gKiBUbyByZXVzZSBhbiBleGlzdGluZyBzZXNzaW9uOlxuICpcbiAqIDEuIENsaWVudCBzZW5kcyBDbGllbnRIZWxsbyB3aXRoIHNlc3Npb24gSUQgZm9yIHJldXNlLlxuICogMi4gQ2xpZW50IHJlY2VpdmVzIFNlcnZlckhlbGxvIHdpdGggc2FtZSBzZXNzaW9uIElEIGlmIHJldXNpbmcuXG4gKiAzLiBDbGllbnQgcmVjZWl2ZXMgQ2hhbmdlQ2lwaGVyU3BlYyBtZXNzYWdlIGlmIHJldXNpbmcuXG4gKiA0LiBDbGllbnQgcmVjZWl2ZXMgRmluaXNoZWQuXG4gKiA1LiBDbGllbnQgc2VuZHMgQ2hhbmdlQ2lwaGVyU3BlYy5cbiAqIDYuIENsaWVudCBzZW5kcyBGaW5pc2hlZC5cbiAqXG4gKiBOb3RlOiBDbGllbnQgaWdub3JlcyBIZWxsb1JlcXVlc3QgaWYgaW4gdGhlIG1pZGRsZSBvZiBhIGhhbmRzaGFrZS5cbiAqXG4gKiBSZWNvcmQgTGF5ZXI6XG4gKlxuICogVGhlIHJlY29yZCBsYXllciBmcmFnbWVudHMgaW5mb3JtYXRpb24gYmxvY2tzIGludG8gVExTUGxhaW50ZXh0IHJlY29yZHNcbiAqIGNhcnJ5aW5nIGRhdGEgaW4gY2h1bmtzIG9mIDJeMTQgYnl0ZXMgb3IgbGVzcy4gQ2xpZW50IG1lc3NhZ2UgYm91bmRhcmllcyBhcmVcbiAqIG5vdCBwcmVzZXJ2ZWQgaW4gdGhlIHJlY29yZCBsYXllciAoaS5lLiwgbXVsdGlwbGUgY2xpZW50IG1lc3NhZ2VzIG9mIHRoZVxuICogc2FtZSBDb250ZW50VHlwZSBNQVkgYmUgY29hbGVzY2VkIGludG8gYSBzaW5nbGUgVExTUGxhaW50ZXh0IHJlY29yZCwgb3IgYVxuICogc2luZ2xlIG1lc3NhZ2UgTUFZIGJlIGZyYWdtZW50ZWQgYWNyb3NzIHNldmVyYWwgcmVjb3JkcykuXG4gKlxuICogc3RydWN0IHtcbiAqICAgdWludDggbWFqb3I7XG4gKiAgIHVpbnQ4IG1pbm9yO1xuICogfSBQcm90b2NvbFZlcnNpb247XG4gKlxuICogc3RydWN0IHtcbiAqICAgQ29udGVudFR5cGUgdHlwZTtcbiAqICAgUHJvdG9jb2xWZXJzaW9uIHZlcnNpb247XG4gKiAgIHVpbnQxNiBsZW5ndGg7XG4gKiAgIG9wYXF1ZSBmcmFnbWVudFtUTFNQbGFpbnRleHQubGVuZ3RoXTtcbiAqIH0gVExTUGxhaW50ZXh0O1xuICpcbiAqIHR5cGU6XG4gKiAgIFRoZSBoaWdoZXItbGV2ZWwgcHJvdG9jb2wgdXNlZCB0byBwcm9jZXNzIHRoZSBlbmNsb3NlZCBmcmFnbWVudC5cbiAqXG4gKiB2ZXJzaW9uOlxuICogICBUaGUgdmVyc2lvbiBvZiB0aGUgcHJvdG9jb2wgYmVpbmcgZW1wbG95ZWQuIFRMUyBWZXJzaW9uIDEuMiB1c2VzIHZlcnNpb25cbiAqICAgezMsIDN9LiBUTFMgVmVyc2lvbiAxLjAgdXNlcyB2ZXJzaW9uIHszLCAxfS4gTm90ZSB0aGF0IGEgY2xpZW50IHRoYXRcbiAqICAgc3VwcG9ydHMgbXVsdGlwbGUgdmVyc2lvbnMgb2YgVExTIG1heSBub3Qga25vdyB3aGF0IHZlcnNpb24gd2lsbCBiZVxuICogICBlbXBsb3llZCBiZWZvcmUgaXQgcmVjZWl2ZXMgdGhlIFNlcnZlckhlbGxvLlxuICpcbiAqIGxlbmd0aDpcbiAqICAgVGhlIGxlbmd0aCAoaW4gYnl0ZXMpIG9mIHRoZSBmb2xsb3dpbmcgVExTUGxhaW50ZXh0LmZyYWdtZW50LiBUaGUgbGVuZ3RoXG4gKiAgIE1VU1QgTk9UIGV4Y2VlZCAyXjE0ID0gMTYzODQgYnl0ZXMuXG4gKlxuICogZnJhZ21lbnQ6XG4gKiAgIFRoZSBhcHBsaWNhdGlvbiBkYXRhLiBUaGlzIGRhdGEgaXMgdHJhbnNwYXJlbnQgYW5kIHRyZWF0ZWQgYXMgYW5cbiAqICAgaW5kZXBlbmRlbnQgYmxvY2sgdG8gYmUgZGVhbHQgd2l0aCBieSB0aGUgaGlnaGVyLWxldmVsIHByb3RvY29sIHNwZWNpZmllZFxuICogICBieSB0aGUgdHlwZSBmaWVsZC5cbiAqXG4gKiBJbXBsZW1lbnRhdGlvbnMgTVVTVCBOT1Qgc2VuZCB6ZXJvLWxlbmd0aCBmcmFnbWVudHMgb2YgSGFuZHNoYWtlLCBBbGVydCwgb3JcbiAqIENoYW5nZUNpcGhlclNwZWMgY29udGVudCB0eXBlcy4gWmVyby1sZW5ndGggZnJhZ21lbnRzIG9mIEFwcGxpY2F0aW9uIGRhdGFcbiAqIE1BWSBiZSBzZW50IGFzIHRoZXkgYXJlIHBvdGVudGlhbGx5IHVzZWZ1bCBhcyBhIHRyYWZmaWMgYW5hbHlzaXNcbiAqIGNvdW50ZXJtZWFzdXJlLlxuICpcbiAqIE5vdGU6IERhdGEgb2YgZGlmZmVyZW50IFRMUyByZWNvcmQgbGF5ZXIgY29udGVudCB0eXBlcyBNQVkgYmUgaW50ZXJsZWF2ZWQuXG4gKiBBcHBsaWNhdGlvbiBkYXRhIGlzIGdlbmVyYWxseSBvZiBsb3dlciBwcmVjZWRlbmNlIGZvciB0cmFuc21pc3Npb24gdGhhblxuICogb3RoZXIgY29udGVudCB0eXBlcy4gSG93ZXZlciwgcmVjb3JkcyBNVVNUIGJlIGRlbGl2ZXJlZCB0byB0aGUgbmV0d29yayBpblxuICogdGhlIHNhbWUgb3JkZXIgYXMgdGhleSBhcmUgcHJvdGVjdGVkIGJ5IHRoZSByZWNvcmQgbGF5ZXIuIFJlY2lwaWVudHMgTVVTVFxuICogcmVjZWl2ZSBhbmQgcHJvY2VzcyBpbnRlcmxlYXZlZCBhcHBsaWNhdGlvbiBsYXllciB0cmFmZmljIGR1cmluZyBoYW5kc2hha2VzXG4gKiBzdWJzZXF1ZW50IHRvIHRoZSBmaXJzdCBvbmUgb24gYSBjb25uZWN0aW9uLlxuICpcbiAqIHN0cnVjdCB7XG4gKiAgIENvbnRlbnRUeXBlIHR5cGU7ICAgICAgIC8vIHNhbWUgYXMgVExTUGxhaW50ZXh0LnR5cGVcbiAqICAgUHJvdG9jb2xWZXJzaW9uIHZlcnNpb247Ly8gc2FtZSBhcyBUTFNQbGFpbnRleHQudmVyc2lvblxuICogICB1aW50MTYgbGVuZ3RoO1xuICogICBvcGFxdWUgZnJhZ21lbnRbVExTQ29tcHJlc3NlZC5sZW5ndGhdO1xuICogfSBUTFNDb21wcmVzc2VkO1xuICpcbiAqIGxlbmd0aDpcbiAqICAgVGhlIGxlbmd0aCAoaW4gYnl0ZXMpIG9mIHRoZSBmb2xsb3dpbmcgVExTQ29tcHJlc3NlZC5mcmFnbWVudC5cbiAqICAgVGhlIGxlbmd0aCBNVVNUIE5PVCBleGNlZWQgMl4xNCArIDEwMjQuXG4gKlxuICogZnJhZ21lbnQ6XG4gKiAgIFRoZSBjb21wcmVzc2VkIGZvcm0gb2YgVExTUGxhaW50ZXh0LmZyYWdtZW50LlxuICpcbiAqIE5vdGU6IEEgQ29tcHJlc3Npb25NZXRob2QubnVsbCBvcGVyYXRpb24gaXMgYW4gaWRlbnRpdHkgb3BlcmF0aW9uOyBubyBmaWVsZHNcbiAqIGFyZSBhbHRlcmVkLiBJbiB0aGlzIGltcGxlbWVudGF0aW9uLCBzaW5jZSBubyBjb21wcmVzc2lvbiBpcyBzdXBwb3J0ZWQsXG4gKiB1bmNvbXByZXNzZWQgcmVjb3JkcyBhcmUgYWx3YXlzIHRoZSBzYW1lIGFzIGNvbXByZXNzZWQgcmVjb3Jkcy5cbiAqXG4gKiBFbmNyeXB0aW9uIEluZm9ybWF0aW9uOlxuICpcbiAqIFRoZSBlbmNyeXB0aW9uIGFuZCBNQUMgZnVuY3Rpb25zIHRyYW5zbGF0ZSBhIFRMU0NvbXByZXNzZWQgc3RydWN0dXJlIGludG8gYVxuICogVExTQ2lwaGVydGV4dC4gVGhlIGRlY3J5cHRpb24gZnVuY3Rpb25zIHJldmVyc2UgdGhlIHByb2Nlc3MuIFRoZSBNQUMgb2YgdGhlXG4gKiByZWNvcmQgYWxzbyBpbmNsdWRlcyBhIHNlcXVlbmNlIG51bWJlciBzbyB0aGF0IG1pc3NpbmcsIGV4dHJhLCBvciByZXBlYXRlZFxuICogbWVzc2FnZXMgYXJlIGRldGVjdGFibGUuXG4gKlxuICogc3RydWN0IHtcbiAqICAgQ29udGVudFR5cGUgdHlwZTtcbiAqICAgUHJvdG9jb2xWZXJzaW9uIHZlcnNpb247XG4gKiAgIHVpbnQxNiBsZW5ndGg7XG4gKiAgIHNlbGVjdCAoU2VjdXJpdHlQYXJhbWV0ZXJzLmNpcGhlcl90eXBlKSB7XG4gKiAgICAgY2FzZSBzdHJlYW06IEdlbmVyaWNTdHJlYW1DaXBoZXI7XG4gKiAgICAgY2FzZSBibG9jazogIEdlbmVyaWNCbG9ja0NpcGhlcjtcbiAqICAgICBjYXNlIGFlYWQ6ICAgR2VuZXJpY0FFQURDaXBoZXI7XG4gKiAgIH0gZnJhZ21lbnQ7XG4gKiB9IFRMU0NpcGhlcnRleHQ7XG4gKlxuICogdHlwZTpcbiAqICAgVGhlIHR5cGUgZmllbGQgaXMgaWRlbnRpY2FsIHRvIFRMU0NvbXByZXNzZWQudHlwZS5cbiAqXG4gKiB2ZXJzaW9uOlxuICogICBUaGUgdmVyc2lvbiBmaWVsZCBpcyBpZGVudGljYWwgdG8gVExTQ29tcHJlc3NlZC52ZXJzaW9uLlxuICpcbiAqIGxlbmd0aDpcbiAqICAgVGhlIGxlbmd0aCAoaW4gYnl0ZXMpIG9mIHRoZSBmb2xsb3dpbmcgVExTQ2lwaGVydGV4dC5mcmFnbWVudC5cbiAqICAgVGhlIGxlbmd0aCBNVVNUIE5PVCBleGNlZWQgMl4xNCArIDIwNDguXG4gKlxuICogZnJhZ21lbnQ6XG4gKiAgIFRoZSBlbmNyeXB0ZWQgZm9ybSBvZiBUTFNDb21wcmVzc2VkLmZyYWdtZW50LCB3aXRoIHRoZSBNQUMuXG4gKlxuICogTm90ZTogT25seSBDQkMgQmxvY2sgQ2lwaGVycyBhcmUgc3VwcG9ydGVkIGJ5IHRoaXMgaW1wbGVtZW50YXRpb24uXG4gKlxuICogVGhlIFRMU0NvbXByZXNzZWQuZnJhZ21lbnQgc3RydWN0dXJlcyBhcmUgY29udmVydGVkIHRvL2Zyb20gYmxvY2tcbiAqIFRMU0NpcGhlcnRleHQuZnJhZ21lbnQgc3RydWN0dXJlcy5cbiAqXG4gKiBzdHJ1Y3Qge1xuICogICBvcGFxdWUgSVZbU2VjdXJpdHlQYXJhbWV0ZXJzLnJlY29yZF9pdl9sZW5ndGhdO1xuICogICBibG9jay1jaXBoZXJlZCBzdHJ1Y3Qge1xuICogICAgIG9wYXF1ZSBjb250ZW50W1RMU0NvbXByZXNzZWQubGVuZ3RoXTtcbiAqICAgICBvcGFxdWUgTUFDW1NlY3VyaXR5UGFyYW1ldGVycy5tYWNfbGVuZ3RoXTtcbiAqICAgICB1aW50OCBwYWRkaW5nW0dlbmVyaWNCbG9ja0NpcGhlci5wYWRkaW5nX2xlbmd0aF07XG4gKiAgICAgdWludDggcGFkZGluZ19sZW5ndGg7XG4gKiAgIH07XG4gKiB9IEdlbmVyaWNCbG9ja0NpcGhlcjtcbiAqXG4gKiBUaGUgTUFDIGlzIGdlbmVyYXRlZCBhcyBkZXNjcmliZWQgaW4gU2VjdGlvbiA2LjIuMy4xLlxuICpcbiAqIElWOlxuICogICBUaGUgSW5pdGlhbGl6YXRpb24gVmVjdG9yIChJVikgU0hPVUxEIGJlIGNob3NlbiBhdCByYW5kb20sIGFuZCBNVVNUIGJlXG4gKiAgIHVucHJlZGljdGFibGUuIE5vdGUgdGhhdCBpbiB2ZXJzaW9ucyBvZiBUTFMgcHJpb3IgdG8gMS4xLCB0aGVyZSB3YXMgbm9cbiAqICAgSVYgZmllbGQsIGFuZCB0aGUgbGFzdCBjaXBoZXJ0ZXh0IGJsb2NrIG9mIHRoZSBwcmV2aW91cyByZWNvcmQgKHRoZSBcIkNCQ1xuICogICByZXNpZHVlXCIpIHdhcyB1c2VkIGFzIHRoZSBJVi4gVGhpcyB3YXMgY2hhbmdlZCB0byBwcmV2ZW50IHRoZSBhdHRhY2tzXG4gKiAgIGRlc2NyaWJlZCBpbiBbQ0JDQVRUXS4gRm9yIGJsb2NrIGNpcGhlcnMsIHRoZSBJViBsZW5ndGggaXMgb2YgbGVuZ3RoXG4gKiAgIFNlY3VyaXR5UGFyYW1ldGVycy5yZWNvcmRfaXZfbGVuZ3RoLCB3aGljaCBpcyBlcXVhbCB0byB0aGVcbiAqICAgU2VjdXJpdHlQYXJhbWV0ZXJzLmJsb2NrX3NpemUuXG4gKlxuICogcGFkZGluZzpcbiAqICAgUGFkZGluZyB0aGF0IGlzIGFkZGVkIHRvIGZvcmNlIHRoZSBsZW5ndGggb2YgdGhlIHBsYWludGV4dCB0byBiZSBhblxuICogICBpbnRlZ3JhbCBtdWx0aXBsZSBvZiB0aGUgYmxvY2sgY2lwaGVyJ3MgYmxvY2sgbGVuZ3RoLiBUaGUgcGFkZGluZyBNQVkgYmVcbiAqICAgYW55IGxlbmd0aCB1cCB0byAyNTUgYnl0ZXMsIGFzIGxvbmcgYXMgaXQgcmVzdWx0cyBpbiB0aGVcbiAqICAgVExTQ2lwaGVydGV4dC5sZW5ndGggYmVpbmcgYW4gaW50ZWdyYWwgbXVsdGlwbGUgb2YgdGhlIGJsb2NrIGxlbmd0aC5cbiAqICAgTGVuZ3RocyBsb25nZXIgdGhhbiBuZWNlc3NhcnkgbWlnaHQgYmUgZGVzaXJhYmxlIHRvIGZydXN0cmF0ZSBhdHRhY2tzIG9uXG4gKiAgIGEgcHJvdG9jb2wgdGhhdCBhcmUgYmFzZWQgb24gYW5hbHlzaXMgb2YgdGhlIGxlbmd0aHMgb2YgZXhjaGFuZ2VkXG4gKiAgIG1lc3NhZ2VzLiBFYWNoIHVpbnQ4IGluIHRoZSBwYWRkaW5nIGRhdGEgdmVjdG9yIE1VU1QgYmUgZmlsbGVkIHdpdGggdGhlXG4gKiAgIHBhZGRpbmcgbGVuZ3RoIHZhbHVlLiBUaGUgcmVjZWl2ZXIgTVVTVCBjaGVjayB0aGlzIHBhZGRpbmcgYW5kIE1VU1QgdXNlXG4gKiAgIHRoZSBiYWRfcmVjb3JkX21hYyBhbGVydCB0byBpbmRpY2F0ZSBwYWRkaW5nIGVycm9ycy5cbiAqXG4gKiBwYWRkaW5nX2xlbmd0aDpcbiAqICAgVGhlIHBhZGRpbmcgbGVuZ3RoIE1VU1QgYmUgc3VjaCB0aGF0IHRoZSB0b3RhbCBzaXplIG9mIHRoZVxuICogICBHZW5lcmljQmxvY2tDaXBoZXIgc3RydWN0dXJlIGlzIGEgbXVsdGlwbGUgb2YgdGhlIGNpcGhlcidzIGJsb2NrIGxlbmd0aC5cbiAqICAgTGVnYWwgdmFsdWVzIHJhbmdlIGZyb20gemVybyB0byAyNTUsIGluY2x1c2l2ZS4gVGhpcyBsZW5ndGggc3BlY2lmaWVzIHRoZVxuICogICBsZW5ndGggb2YgdGhlIHBhZGRpbmcgZmllbGQgZXhjbHVzaXZlIG9mIHRoZSBwYWRkaW5nX2xlbmd0aCBmaWVsZCBpdHNlbGYuXG4gKlxuICogVGhlIGVuY3J5cHRlZCBkYXRhIGxlbmd0aCAoVExTQ2lwaGVydGV4dC5sZW5ndGgpIGlzIG9uZSBtb3JlIHRoYW4gdGhlIHN1bSBvZlxuICogU2VjdXJpdHlQYXJhbWV0ZXJzLmJsb2NrX2xlbmd0aCwgVExTQ29tcHJlc3NlZC5sZW5ndGgsXG4gKiBTZWN1cml0eVBhcmFtZXRlcnMubWFjX2xlbmd0aCwgYW5kIHBhZGRpbmdfbGVuZ3RoLlxuICpcbiAqIEV4YW1wbGU6IElmIHRoZSBibG9jayBsZW5ndGggaXMgOCBieXRlcywgdGhlIGNvbnRlbnQgbGVuZ3RoXG4gKiAoVExTQ29tcHJlc3NlZC5sZW5ndGgpIGlzIDYxIGJ5dGVzLCBhbmQgdGhlIE1BQyBsZW5ndGggaXMgMjAgYnl0ZXMsIHRoZW4gdGhlXG4gKiBsZW5ndGggYmVmb3JlIHBhZGRpbmcgaXMgODIgYnl0ZXMgKHRoaXMgZG9lcyBub3QgaW5jbHVkZSB0aGUgSVYuIFRodXMsIHRoZVxuICogcGFkZGluZyBsZW5ndGggbW9kdWxvIDggbXVzdCBiZSBlcXVhbCB0byA2IGluIG9yZGVyIHRvIG1ha2UgdGhlIHRvdGFsIGxlbmd0aFxuICogYW4gZXZlbiBtdWx0aXBsZSBvZiA4IGJ5dGVzICh0aGUgYmxvY2sgbGVuZ3RoKS4gVGhlIHBhZGRpbmcgbGVuZ3RoIGNhbiBiZVxuICogNiwgMTQsIDIyLCBhbmQgc28gb24sIHRocm91Z2ggMjU0LiBJZiB0aGUgcGFkZGluZyBsZW5ndGggd2VyZSB0aGUgbWluaW11bVxuICogbmVjZXNzYXJ5LCA2LCB0aGUgcGFkZGluZyB3b3VsZCBiZSA2IGJ5dGVzLCBlYWNoIGNvbnRhaW5pbmcgdGhlIHZhbHVlIDYuXG4gKiBUaHVzLCB0aGUgbGFzdCA4IG9jdGV0cyBvZiB0aGUgR2VuZXJpY0Jsb2NrQ2lwaGVyIGJlZm9yZSBibG9jayBlbmNyeXB0aW9uXG4gKiB3b3VsZCBiZSB4eCAwNiAwNiAwNiAwNiAwNiAwNiAwNiwgd2hlcmUgeHggaXMgdGhlIGxhc3Qgb2N0ZXQgb2YgdGhlIE1BQy5cbiAqXG4gKiBOb3RlOiBXaXRoIGJsb2NrIGNpcGhlcnMgaW4gQ0JDIG1vZGUgKENpcGhlciBCbG9jayBDaGFpbmluZyksIGl0IGlzIGNyaXRpY2FsXG4gKiB0aGF0IHRoZSBlbnRpcmUgcGxhaW50ZXh0IG9mIHRoZSByZWNvcmQgYmUga25vd24gYmVmb3JlIGFueSBjaXBoZXJ0ZXh0IGlzXG4gKiB0cmFuc21pdHRlZC4gT3RoZXJ3aXNlLCBpdCBpcyBwb3NzaWJsZSBmb3IgdGhlIGF0dGFja2VyIHRvIG1vdW50IHRoZSBhdHRhY2tcbiAqIGRlc2NyaWJlZCBpbiBbQ0JDQVRUXS5cbiAqXG4gKiBJbXBsZW1lbnRhdGlvbiBub3RlOiBDYW52ZWwgZXQgYWwuIFtDQkNUSU1FXSBoYXZlIGRlbW9uc3RyYXRlZCBhIHRpbWluZ1xuICogYXR0YWNrIG9uIENCQyBwYWRkaW5nIGJhc2VkIG9uIHRoZSB0aW1lIHJlcXVpcmVkIHRvIGNvbXB1dGUgdGhlIE1BQy4gSW5cbiAqIG9yZGVyIHRvIGRlZmVuZCBhZ2FpbnN0IHRoaXMgYXR0YWNrLCBpbXBsZW1lbnRhdGlvbnMgTVVTVCBlbnN1cmUgdGhhdFxuICogcmVjb3JkIHByb2Nlc3NpbmcgdGltZSBpcyBlc3NlbnRpYWxseSB0aGUgc2FtZSB3aGV0aGVyIG9yIG5vdCB0aGUgcGFkZGluZ1xuICogaXMgY29ycmVjdC4gSW4gZ2VuZXJhbCwgdGhlIGJlc3Qgd2F5IHRvIGRvIHRoaXMgaXMgdG8gY29tcHV0ZSB0aGUgTUFDIGV2ZW5cbiAqIGlmIHRoZSBwYWRkaW5nIGlzIGluY29ycmVjdCwgYW5kIG9ubHkgdGhlbiByZWplY3QgdGhlIHBhY2tldC4gRm9yIGluc3RhbmNlLFxuICogaWYgdGhlIHBhZCBhcHBlYXJzIHRvIGJlIGluY29ycmVjdCwgdGhlIGltcGxlbWVudGF0aW9uIG1pZ2h0IGFzc3VtZSBhXG4gKiB6ZXJvLWxlbmd0aCBwYWQgYW5kIHRoZW4gY29tcHV0ZSB0aGUgTUFDLiBUaGlzIGxlYXZlcyBhIHNtYWxsIHRpbWluZ1xuICogY2hhbm5lbCwgc2luY2UgTUFDIHBlcmZvcm1hbmNlIGRlcGVuZHMsIHRvIHNvbWUgZXh0ZW50LCBvbiB0aGUgc2l6ZSBvZiB0aGVcbiAqIGRhdGEgZnJhZ21lbnQsIGJ1dCBpdCBpcyBub3QgYmVsaWV2ZWQgdG8gYmUgbGFyZ2UgZW5vdWdoIHRvIGJlIGV4cGxvaXRhYmxlLFxuICogZHVlIHRvIHRoZSBsYXJnZSBibG9jayBzaXplIG9mIGV4aXN0aW5nIE1BQ3MgYW5kIHRoZSBzbWFsbCBzaXplIG9mIHRoZVxuICogdGltaW5nIHNpZ25hbC5cbiAqL1xudmFyIGZvcmdlID0gcmVxdWlyZSgnLi9mb3JnZScpO1xucmVxdWlyZSgnLi9hc24xJyk7XG5yZXF1aXJlKCcuL2htYWMnKTtcbnJlcXVpcmUoJy4vbWQ1Jyk7XG5yZXF1aXJlKCcuL3BlbScpO1xucmVxdWlyZSgnLi9wa2knKTtcbnJlcXVpcmUoJy4vcmFuZG9tJyk7XG5yZXF1aXJlKCcuL3NoYTEnKTtcbnJlcXVpcmUoJy4vdXRpbCcpO1xuXG4vKipcbiAqIEdlbmVyYXRlcyBwc2V1ZG8gcmFuZG9tIGJ5dGVzIGJ5IG1peGluZyB0aGUgcmVzdWx0IG9mIHR3byBoYXNoIGZ1bmN0aW9ucyxcbiAqIE1ENSBhbmQgU0hBLTEuXG4gKlxuICogcHJmX1RMUzEoc2VjcmV0LCBsYWJlbCwgc2VlZCkgPVxuICogICBQX01ENShTMSwgbGFiZWwgKyBzZWVkKSBYT1IgUF9TSEEtMShTMiwgbGFiZWwgKyBzZWVkKTtcbiAqXG4gKiBFYWNoIFBfaGFzaCBmdW5jdGlvbiBmdW5jdGlvbnMgYXMgZm9sbG93czpcbiAqXG4gKiBQX2hhc2goc2VjcmV0LCBzZWVkKSA9IEhNQUNfaGFzaChzZWNyZXQsIEEoMSkgKyBzZWVkKSArXG4gKiAgICAgICAgICAgICAgICAgICAgICAgIEhNQUNfaGFzaChzZWNyZXQsIEEoMikgKyBzZWVkKSArXG4gKiAgICAgICAgICAgICAgICAgICAgICAgIEhNQUNfaGFzaChzZWNyZXQsIEEoMykgKyBzZWVkKSArIC4uLlxuICogQSgpIGlzIGRlZmluZWQgYXM6XG4gKiAgIEEoMCkgPSBzZWVkXG4gKiAgIEEoaSkgPSBITUFDX2hhc2goc2VjcmV0LCBBKGktMSkpXG4gKlxuICogVGhlICcrJyBvcGVyYXRvciBkZW5vdGVzIGNvbmNhdGVuYXRpb24uXG4gKlxuICogQXMgbWFueSBpdGVyYXRpb25zIEEoTikgYXMgYXJlIG5lZWRlZCBhcmUgcGVyZm9ybWVkIHRvIGdlbmVyYXRlIGVub3VnaFxuICogcHNldWRvIHJhbmRvbSBieXRlIG91dHB1dC4gSWYgYW4gaXRlcmF0aW9uIGNyZWF0ZXMgbW9yZSBkYXRhIHRoYW4gaXNcbiAqIG5lY2Vzc2FyeSwgdGhlbiBpdCBpcyB0cnVuY2F0ZWQuXG4gKlxuICogVGhlcmVmb3JlOlxuICogQSgxKSA9IEhNQUNfaGFzaChzZWNyZXQsIEEoMCkpXG4gKiAgICAgID0gSE1BQ19oYXNoKHNlY3JldCwgc2VlZClcbiAqIEEoMikgPSBITUFDX2hhc2goc2VjcmV0LCBBKDEpKVxuICogICAgICA9IEhNQUNfaGFzaChzZWNyZXQsIEhNQUNfaGFzaChzZWNyZXQsIHNlZWQpKVxuICpcbiAqIFRoZXJlZm9yZTpcbiAqIFBfaGFzaChzZWNyZXQsIHNlZWQpID1cbiAqICAgSE1BQ19oYXNoKHNlY3JldCwgSE1BQ19oYXNoKHNlY3JldCwgQSgwKSkgKyBzZWVkKSArXG4gKiAgIEhNQUNfaGFzaChzZWNyZXQsIEhNQUNfaGFzaChzZWNyZXQsIEEoMSkpICsgc2VlZCkgK1xuICogICAuLi5cbiAqXG4gKiBUaGVyZWZvcmU6XG4gKiBQX2hhc2goc2VjcmV0LCBzZWVkKSA9XG4gKiAgIEhNQUNfaGFzaChzZWNyZXQsIEhNQUNfaGFzaChzZWNyZXQsIHNlZWQpICsgc2VlZCkgK1xuICogICBITUFDX2hhc2goc2VjcmV0LCBITUFDX2hhc2goc2VjcmV0LCBITUFDX2hhc2goc2VjcmV0LCBzZWVkKSkgKyBzZWVkKSArXG4gKiAgIC4uLlxuICpcbiAqIEBwYXJhbSBzZWNyZXQgdGhlIHNlY3JldCB0byB1c2UuXG4gKiBAcGFyYW0gbGFiZWwgdGhlIGxhYmVsIHRvIHVzZS5cbiAqIEBwYXJhbSBzZWVkIHRoZSBzZWVkIHZhbHVlIHRvIHVzZS5cbiAqIEBwYXJhbSBsZW5ndGggdGhlIG51bWJlciBvZiBieXRlcyB0byBnZW5lcmF0ZS5cbiAqXG4gKiBAcmV0dXJuIHRoZSBwc2V1ZG8gcmFuZG9tIGJ5dGVzIGluIGEgYnl0ZSBidWZmZXIuXG4gKi9cbnZhciBwcmZfVExTMSA9IGZ1bmN0aW9uKHNlY3JldCwgbGFiZWwsIHNlZWQsIGxlbmd0aCkge1xuICB2YXIgcnZhbCA9IGZvcmdlLnV0aWwuY3JlYXRlQnVmZmVyKCk7XG5cbiAgLyogRm9yIFRMUyAxLjAsIHRoZSBzZWNyZXQgaXMgc3BsaXQgaW4gaGFsZiwgaW50byB0d28gc2VjcmV0cyBvZiBlcXVhbFxuICAgIGxlbmd0aC4gSWYgdGhlIHNlY3JldCBoYXMgYW4gb2RkIGxlbmd0aCB0aGVuIHRoZSBsYXN0IGJ5dGUgb2YgdGhlIGZpcnN0XG4gICAgaGFsZiB3aWxsIGJlIHRoZSBzYW1lIGFzIHRoZSBmaXJzdCBieXRlIG9mIHRoZSBzZWNvbmQuIFRoZSBsZW5ndGggb2YgdGhlXG4gICAgdHdvIHNlY3JldHMgaXMgaGFsZiBvZiB0aGUgc2VjcmV0IHJvdW5kZWQgdXAuICovXG4gIHZhciBpZHggPSAoc2VjcmV0Lmxlbmd0aCA+PiAxKTtcbiAgdmFyIHNsZW4gPSBpZHggKyAoc2VjcmV0Lmxlbmd0aCAmIDEpO1xuICB2YXIgczEgPSBzZWNyZXQuc3Vic3RyKDAsIHNsZW4pO1xuICB2YXIgczIgPSBzZWNyZXQuc3Vic3RyKGlkeCwgc2xlbik7XG4gIHZhciBhaSA9IGZvcmdlLnV0aWwuY3JlYXRlQnVmZmVyKCk7XG4gIHZhciBobWFjID0gZm9yZ2UuaG1hYy5jcmVhdGUoKTtcbiAgc2VlZCA9IGxhYmVsICsgc2VlZDtcblxuICAvLyBkZXRlcm1pbmUgdGhlIG51bWJlciBvZiBpdGVyYXRpb25zIHRoYXQgbXVzdCBiZSBwZXJmb3JtZWQgdG8gZ2VuZXJhdGVcbiAgLy8gZW5vdWdoIG91dHB1dCBieXRlcywgbWQ1IGNyZWF0ZXMgMTYgYnl0ZSBoYXNoZXMsIHNoYTEgY3JlYXRlcyAyMFxuICB2YXIgbWQ1aXRyID0gTWF0aC5jZWlsKGxlbmd0aCAvIDE2KTtcbiAgdmFyIHNoYTFpdHIgPSBNYXRoLmNlaWwobGVuZ3RoIC8gMjApO1xuXG4gIC8vIGRvIG1kNSBpdGVyYXRpb25zXG4gIGhtYWMuc3RhcnQoJ01ENScsIHMxKTtcbiAgdmFyIG1kNWJ5dGVzID0gZm9yZ2UudXRpbC5jcmVhdGVCdWZmZXIoKTtcbiAgYWkucHV0Qnl0ZXMoc2VlZCk7XG4gIGZvcih2YXIgaSA9IDA7IGkgPCBtZDVpdHI7ICsraSkge1xuICAgIC8vIEhNQUNfaGFzaChzZWNyZXQsIEEoaS0xKSlcbiAgICBobWFjLnN0YXJ0KG51bGwsIG51bGwpO1xuICAgIGhtYWMudXBkYXRlKGFpLmdldEJ5dGVzKCkpO1xuICAgIGFpLnB1dEJ1ZmZlcihobWFjLmRpZ2VzdCgpKTtcblxuICAgIC8vIEhNQUNfaGFzaChzZWNyZXQsIEEoaSkgKyBzZWVkKVxuICAgIGhtYWMuc3RhcnQobnVsbCwgbnVsbCk7XG4gICAgaG1hYy51cGRhdGUoYWkuYnl0ZXMoKSArIHNlZWQpO1xuICAgIG1kNWJ5dGVzLnB1dEJ1ZmZlcihobWFjLmRpZ2VzdCgpKTtcbiAgfVxuXG4gIC8vIGRvIHNoYTEgaXRlcmF0aW9uc1xuICBobWFjLnN0YXJ0KCdTSEExJywgczIpO1xuICB2YXIgc2hhMWJ5dGVzID0gZm9yZ2UudXRpbC5jcmVhdGVCdWZmZXIoKTtcbiAgYWkuY2xlYXIoKTtcbiAgYWkucHV0Qnl0ZXMoc2VlZCk7XG4gIGZvcih2YXIgaSA9IDA7IGkgPCBzaGExaXRyOyArK2kpIHtcbiAgICAvLyBITUFDX2hhc2goc2VjcmV0LCBBKGktMSkpXG4gICAgaG1hYy5zdGFydChudWxsLCBudWxsKTtcbiAgICBobWFjLnVwZGF0ZShhaS5nZXRCeXRlcygpKTtcbiAgICBhaS5wdXRCdWZmZXIoaG1hYy5kaWdlc3QoKSk7XG5cbiAgICAvLyBITUFDX2hhc2goc2VjcmV0LCBBKGkpICsgc2VlZClcbiAgICBobWFjLnN0YXJ0KG51bGwsIG51bGwpO1xuICAgIGhtYWMudXBkYXRlKGFpLmJ5dGVzKCkgKyBzZWVkKTtcbiAgICBzaGExYnl0ZXMucHV0QnVmZmVyKGhtYWMuZGlnZXN0KCkpO1xuICB9XG5cbiAgLy8gWE9SIHRoZSBtZDUgYnl0ZXMgd2l0aCB0aGUgc2hhMSBieXRlc1xuICBydmFsLnB1dEJ5dGVzKGZvcmdlLnV0aWwueG9yQnl0ZXMoXG4gICAgbWQ1Ynl0ZXMuZ2V0Qnl0ZXMoKSwgc2hhMWJ5dGVzLmdldEJ5dGVzKCksIGxlbmd0aCkpO1xuXG4gIHJldHVybiBydmFsO1xufTtcblxuLyoqXG4gKiBHZW5lcmF0ZXMgcHNldWRvIHJhbmRvbSBieXRlcyB1c2luZyBhIFNIQTI1NiBhbGdvcml0aG0uIEZvciBUTFMgMS4yLlxuICpcbiAqIEBwYXJhbSBzZWNyZXQgdGhlIHNlY3JldCB0byB1c2UuXG4gKiBAcGFyYW0gbGFiZWwgdGhlIGxhYmVsIHRvIHVzZS5cbiAqIEBwYXJhbSBzZWVkIHRoZSBzZWVkIHZhbHVlIHRvIHVzZS5cbiAqIEBwYXJhbSBsZW5ndGggdGhlIG51bWJlciBvZiBieXRlcyB0byBnZW5lcmF0ZS5cbiAqXG4gKiBAcmV0dXJuIHRoZSBwc2V1ZG8gcmFuZG9tIGJ5dGVzIGluIGEgYnl0ZSBidWZmZXIuXG4gKi9cbnZhciBwcmZfc2hhMjU2ID0gZnVuY3Rpb24oc2VjcmV0LCBsYWJlbCwgc2VlZCwgbGVuZ3RoKSB7XG4gICAvLyBGSVhNRTogaW1wbGVtZW50IG1lIGZvciBUTFMgMS4yXG59O1xuXG4vKipcbiAqIEdldHMgYSBNQUMgZm9yIGEgcmVjb3JkIHVzaW5nIHRoZSBTSEEtMSBoYXNoIGFsZ29yaXRobS5cbiAqXG4gKiBAcGFyYW0ga2V5IHRoZSBtYWMga2V5LlxuICogQHBhcmFtIHN0YXRlIHRoZSBzZXF1ZW5jZSBudW1iZXIgKGFycmF5IG9mIHR3byAzMi1iaXQgaW50ZWdlcnMpLlxuICogQHBhcmFtIHJlY29yZCB0aGUgcmVjb3JkLlxuICpcbiAqIEByZXR1cm4gdGhlIHNoYS0xIGhhc2ggKDIwIGJ5dGVzKSBmb3IgdGhlIGdpdmVuIHJlY29yZC5cbiAqL1xudmFyIGhtYWNfc2hhMSA9IGZ1bmN0aW9uKGtleSwgc2VxTnVtLCByZWNvcmQpIHtcbiAgLyogTUFDIGlzIGNvbXB1dGVkIGxpa2Ugc286XG4gIEhNQUNfaGFzaChcbiAgICBrZXksIHNlcU51bSArXG4gICAgICBUTFNDb21wcmVzc2VkLnR5cGUgK1xuICAgICAgVExTQ29tcHJlc3NlZC52ZXJzaW9uICtcbiAgICAgIFRMU0NvbXByZXNzZWQubGVuZ3RoICtcbiAgICAgIFRMU0NvbXByZXNzZWQuZnJhZ21lbnQpXG4gICovXG4gIHZhciBobWFjID0gZm9yZ2UuaG1hYy5jcmVhdGUoKTtcbiAgaG1hYy5zdGFydCgnU0hBMScsIGtleSk7XG4gIHZhciBiID0gZm9yZ2UudXRpbC5jcmVhdGVCdWZmZXIoKTtcbiAgYi5wdXRJbnQzMihzZXFOdW1bMF0pO1xuICBiLnB1dEludDMyKHNlcU51bVsxXSk7XG4gIGIucHV0Qnl0ZShyZWNvcmQudHlwZSk7XG4gIGIucHV0Qnl0ZShyZWNvcmQudmVyc2lvbi5tYWpvcik7XG4gIGIucHV0Qnl0ZShyZWNvcmQudmVyc2lvbi5taW5vcik7XG4gIGIucHV0SW50MTYocmVjb3JkLmxlbmd0aCk7XG4gIGIucHV0Qnl0ZXMocmVjb3JkLmZyYWdtZW50LmJ5dGVzKCkpO1xuICBobWFjLnVwZGF0ZShiLmdldEJ5dGVzKCkpO1xuICByZXR1cm4gaG1hYy5kaWdlc3QoKS5nZXRCeXRlcygpO1xufTtcblxuLyoqXG4gKiBDb21wcmVzc2VzIHRoZSBUTFNQbGFpbnRleHQgcmVjb3JkIGludG8gYSBUTFNDb21wcmVzc2VkIHJlY29yZCB1c2luZyB0aGVcbiAqIGRlZmxhdGUgYWxnb3JpdGhtLlxuICpcbiAqIEBwYXJhbSBjIHRoZSBUTFMgY29ubmVjdGlvbi5cbiAqIEBwYXJhbSByZWNvcmQgdGhlIFRMU1BsYWludGV4dCByZWNvcmQgdG8gY29tcHJlc3MuXG4gKiBAcGFyYW0gcyB0aGUgQ29ubmVjdGlvblN0YXRlIHRvIHVzZS5cbiAqXG4gKiBAcmV0dXJuIHRydWUgb24gc3VjY2VzcywgZmFsc2Ugb24gZmFpbHVyZS5cbiAqL1xudmFyIGRlZmxhdGUgPSBmdW5jdGlvbihjLCByZWNvcmQsIHMpIHtcbiAgdmFyIHJ2YWwgPSBmYWxzZTtcblxuICB0cnkge1xuICAgIHZhciBieXRlcyA9IGMuZGVmbGF0ZShyZWNvcmQuZnJhZ21lbnQuZ2V0Qnl0ZXMoKSk7XG4gICAgcmVjb3JkLmZyYWdtZW50ID0gZm9yZ2UudXRpbC5jcmVhdGVCdWZmZXIoYnl0ZXMpO1xuICAgIHJlY29yZC5sZW5ndGggPSBieXRlcy5sZW5ndGg7XG4gICAgcnZhbCA9IHRydWU7XG4gIH0gY2F0Y2goZXgpIHtcbiAgICAvLyBkZWZsYXRlIGVycm9yLCBmYWlsIG91dFxuICB9XG5cbiAgcmV0dXJuIHJ2YWw7XG59O1xuXG4vKipcbiAqIERlY29tcHJlc3NlcyB0aGUgVExTQ29tcHJlc3NlZCByZWNvcmQgaW50byBhIFRMU1BsYWludGV4dCByZWNvcmQgdXNpbmcgdGhlXG4gKiBkZWZsYXRlIGFsZ29yaXRobS5cbiAqXG4gKiBAcGFyYW0gYyB0aGUgVExTIGNvbm5lY3Rpb24uXG4gKiBAcGFyYW0gcmVjb3JkIHRoZSBUTFNDb21wcmVzc2VkIHJlY29yZCB0byBkZWNvbXByZXNzLlxuICogQHBhcmFtIHMgdGhlIENvbm5lY3Rpb25TdGF0ZSB0byB1c2UuXG4gKlxuICogQHJldHVybiB0cnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIG9uIGZhaWx1cmUuXG4gKi9cbnZhciBpbmZsYXRlID0gZnVuY3Rpb24oYywgcmVjb3JkLCBzKSB7XG4gIHZhciBydmFsID0gZmFsc2U7XG5cbiAgdHJ5IHtcbiAgICB2YXIgYnl0ZXMgPSBjLmluZmxhdGUocmVjb3JkLmZyYWdtZW50LmdldEJ5dGVzKCkpO1xuICAgIHJlY29yZC5mcmFnbWVudCA9IGZvcmdlLnV0aWwuY3JlYXRlQnVmZmVyKGJ5dGVzKTtcbiAgICByZWNvcmQubGVuZ3RoID0gYnl0ZXMubGVuZ3RoO1xuICAgIHJ2YWwgPSB0cnVlO1xuICB9IGNhdGNoKGV4KSB7XG4gICAgLy8gaW5mbGF0ZSBlcnJvciwgZmFpbCBvdXRcbiAgfVxuXG4gIHJldHVybiBydmFsO1xufTtcblxuLyoqXG4gKiBSZWFkcyBhIFRMUyB2YXJpYWJsZS1sZW5ndGggdmVjdG9yIGZyb20gYSBieXRlIGJ1ZmZlci5cbiAqXG4gKiBWYXJpYWJsZS1sZW5ndGggdmVjdG9ycyBhcmUgZGVmaW5lZCBieSBzcGVjaWZ5aW5nIGEgc3VicmFuZ2Ugb2YgbGVnYWxcbiAqIGxlbmd0aHMsIGluY2x1c2l2ZWx5LCB1c2luZyB0aGUgbm90YXRpb24gPGZsb29yLi5jZWlsaW5nPi4gV2hlbiB0aGVzZSBhcmVcbiAqIGVuY29kZWQsIHRoZSBhY3R1YWwgbGVuZ3RoIHByZWNlZGVzIHRoZSB2ZWN0b3IncyBjb250ZW50cyBpbiB0aGUgYnl0ZVxuICogc3RyZWFtLiBUaGUgbGVuZ3RoIHdpbGwgYmUgaW4gdGhlIGZvcm0gb2YgYSBudW1iZXIgY29uc3VtaW5nIGFzIG1hbnkgYnl0ZXNcbiAqIGFzIHJlcXVpcmVkIHRvIGhvbGQgdGhlIHZlY3RvcidzIHNwZWNpZmllZCBtYXhpbXVtIChjZWlsaW5nKSBsZW5ndGguIEFcbiAqIHZhcmlhYmxlLWxlbmd0aCB2ZWN0b3Igd2l0aCBhbiBhY3R1YWwgbGVuZ3RoIGZpZWxkIG9mIHplcm8gaXMgcmVmZXJyZWQgdG9cbiAqIGFzIGFuIGVtcHR5IHZlY3Rvci5cbiAqXG4gKiBAcGFyYW0gYiB0aGUgYnl0ZSBidWZmZXIuXG4gKiBAcGFyYW0gbGVuQnl0ZXMgdGhlIG51bWJlciBvZiBieXRlcyByZXF1aXJlZCB0byBzdG9yZSB0aGUgbGVuZ3RoLlxuICpcbiAqIEByZXR1cm4gdGhlIHJlc3VsdGluZyBieXRlIGJ1ZmZlci5cbiAqL1xudmFyIHJlYWRWZWN0b3IgPSBmdW5jdGlvbihiLCBsZW5CeXRlcykge1xuICB2YXIgbGVuID0gMDtcbiAgc3dpdGNoKGxlbkJ5dGVzKSB7XG4gIGNhc2UgMTpcbiAgICBsZW4gPSBiLmdldEJ5dGUoKTtcbiAgICBicmVhaztcbiAgY2FzZSAyOlxuICAgIGxlbiA9IGIuZ2V0SW50MTYoKTtcbiAgICBicmVhaztcbiAgY2FzZSAzOlxuICAgIGxlbiA9IGIuZ2V0SW50MjQoKTtcbiAgICBicmVhaztcbiAgY2FzZSA0OlxuICAgIGxlbiA9IGIuZ2V0SW50MzIoKTtcbiAgICBicmVhaztcbiAgfVxuXG4gIC8vIHJlYWQgdmVjdG9yIGJ5dGVzIGludG8gYSBuZXcgYnVmZmVyXG4gIHJldHVybiBmb3JnZS51dGlsLmNyZWF0ZUJ1ZmZlcihiLmdldEJ5dGVzKGxlbikpO1xufTtcblxuLyoqXG4gKiBXcml0ZXMgYSBUTFMgdmFyaWFibGUtbGVuZ3RoIHZlY3RvciB0byBhIGJ5dGUgYnVmZmVyLlxuICpcbiAqIEBwYXJhbSBiIHRoZSBieXRlIGJ1ZmZlci5cbiAqIEBwYXJhbSBsZW5CeXRlcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlcXVpcmVkIHRvIHN0b3JlIHRoZSBsZW5ndGguXG4gKiBAcGFyYW0gdiB0aGUgYnl0ZSBidWZmZXIgdmVjdG9yLlxuICovXG52YXIgd3JpdGVWZWN0b3IgPSBmdW5jdGlvbihiLCBsZW5CeXRlcywgdikge1xuICAvLyBlbmNvZGUgbGVuZ3RoIGF0IHRoZSBzdGFydCBvZiB0aGUgdmVjdG9yLCB3aGVyZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIGZvclxuICAvLyB0aGUgbGVuZ3RoIGlzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyBpdCB3b3VsZCB0YWtlIHRvIGVuY29kZSB0aGVcbiAgLy8gdmVjdG9yJ3MgY2VpbGluZ1xuICBiLnB1dEludCh2Lmxlbmd0aCgpLCBsZW5CeXRlcyA8PCAzKTtcbiAgYi5wdXRCdWZmZXIodik7XG59O1xuXG4vKipcbiAqIFRoZSB0bHMgaW1wbGVtZW50YXRpb24uXG4gKi9cbnZhciB0bHMgPSB7fTtcblxuLyoqXG4gKiBWZXJzaW9uOiBUTFMgMS4yID0gMy4zLCBUTFMgMS4xID0gMy4yLCBUTFMgMS4wID0gMy4xLiBCb3RoIFRMUyAxLjEgYW5kXG4gKiBUTFMgMS4yIHdlcmUgc3RpbGwgdG9vIG5ldyAoaWU6IG9wZW5TU0wgZGlkbid0IGltcGxlbWVudCB0aGVtKSBhdCB0aGUgdGltZVxuICogb2YgdGhpcyBpbXBsZW1lbnRhdGlvbiBzbyBUTFMgMS4wIHdhcyBpbXBsZW1lbnRlZCBpbnN0ZWFkLlxuICovXG50bHMuVmVyc2lvbnMgPSB7XG4gIFRMU18xXzA6IHttYWpvcjogMywgbWlub3I6IDF9LFxuICBUTFNfMV8xOiB7bWFqb3I6IDMsIG1pbm9yOiAyfSxcbiAgVExTXzFfMjoge21ham9yOiAzLCBtaW5vcjogM31cbn07XG50bHMuU3VwcG9ydGVkVmVyc2lvbnMgPSBbXG4gIHRscy5WZXJzaW9ucy5UTFNfMV8xLFxuICB0bHMuVmVyc2lvbnMuVExTXzFfMFxuXTtcbnRscy5WZXJzaW9uID0gdGxzLlN1cHBvcnRlZFZlcnNpb25zWzBdO1xuXG4vKipcbiAqIE1heGltdW0gZnJhZ21lbnQgc2l6ZS4gVHJ1ZSBtYXhpbXVtIGlzIDE2Mzg0LCBidXQgd2UgZnJhZ21lbnQgYmVmb3JlIHRoYXRcbiAqIHRvIGFsbG93IGZvciB1bnVzdWFsIHNtYWxsIGluY3JlYXNlcyBkdXJpbmcgY29tcHJlc3Npb24uXG4gKi9cbnRscy5NYXhGcmFnbWVudCA9IDE2Mzg0IC0gMTAyNDtcblxuLyoqXG4gKiBXaGV0aGVyIHRoaXMgZW50aXR5IGlzIGNvbnNpZGVyZWQgdGhlIFwiY2xpZW50XCIgb3IgXCJzZXJ2ZXJcIi5cbiAqIGVudW0geyBzZXJ2ZXIsIGNsaWVudCB9IENvbm5lY3Rpb25FbmQ7XG4gKi9cbnRscy5Db25uZWN0aW9uRW5kID0ge1xuICBzZXJ2ZXI6IDAsXG4gIGNsaWVudDogMVxufTtcblxuLyoqXG4gKiBQc2V1ZG8tcmFuZG9tIGZ1bmN0aW9uIGFsZ29yaXRobSB1c2VkIHRvIGdlbmVyYXRlIGtleXMgZnJvbSB0aGUgbWFzdGVyXG4gKiBzZWNyZXQuXG4gKiBlbnVtIHsgdGxzX3ByZl9zaGEyNTYgfSBQUkZBbGdvcml0aG07XG4gKi9cbnRscy5QUkZBbGdvcml0aG0gPSB7XG4gIHRsc19wcmZfc2hhMjU2OiAwXG59O1xuXG4vKipcbiAqIEJ1bGsgZW5jcnlwdGlvbiBhbGdvcml0aG1zLlxuICogZW51bSB7IG51bGwsIHJjNCwgZGVzMywgYWVzIH0gQnVsa0NpcGhlckFsZ29yaXRobTtcbiAqL1xudGxzLkJ1bGtDaXBoZXJBbGdvcml0aG0gPSB7XG4gIG5vbmU6IG51bGwsXG4gIHJjNDogMCxcbiAgZGVzMzogMSxcbiAgYWVzOiAyXG59O1xuXG4vKipcbiAqIENpcGhlciB0eXBlcy5cbiAqIGVudW0geyBzdHJlYW0sIGJsb2NrLCBhZWFkIH0gQ2lwaGVyVHlwZTtcbiAqL1xudGxzLkNpcGhlclR5cGUgPSB7XG4gIHN0cmVhbTogMCxcbiAgYmxvY2s6IDEsXG4gIGFlYWQ6IDJcbn07XG5cbi8qKlxuICogTUFDIChNZXNzYWdlIEF1dGhlbnRpY2F0aW9uIENvZGUpIGFsZ29yaXRobXMuXG4gKiBlbnVtIHsgbnVsbCwgaG1hY19tZDUsIGhtYWNfc2hhMSwgaG1hY19zaGEyNTYsXG4gKiAgIGhtYWNfc2hhMzg0LCBobWFjX3NoYTUxMn0gTUFDQWxnb3JpdGhtO1xuICovXG50bHMuTUFDQWxnb3JpdGhtID0ge1xuICBub25lOiBudWxsLFxuICBobWFjX21kNTogMCxcbiAgaG1hY19zaGExOiAxLFxuICBobWFjX3NoYTI1NjogMixcbiAgaG1hY19zaGEzODQ6IDMsXG4gIGhtYWNfc2hhNTEyOiA0XG59O1xuXG4vKipcbiAqIENvbXByZXNzaW9uIGFsZ29yaXRobXMuXG4gKiBlbnVtIHsgbnVsbCgwKSwgZGVmbGF0ZSgxKSwgKDI1NSkgfSBDb21wcmVzc2lvbk1ldGhvZDtcbiAqL1xudGxzLkNvbXByZXNzaW9uTWV0aG9kID0ge1xuICBub25lOiAwLFxuICBkZWZsYXRlOiAxXG59O1xuXG4vKipcbiAqIFRMUyByZWNvcmQgY29udGVudCB0eXBlcy5cbiAqIGVudW0ge1xuICogICBjaGFuZ2VfY2lwaGVyX3NwZWMoMjApLCBhbGVydCgyMSksIGhhbmRzaGFrZSgyMiksXG4gKiAgIGFwcGxpY2F0aW9uX2RhdGEoMjMpLCAoMjU1KVxuICogfSBDb250ZW50VHlwZTtcbiAqL1xudGxzLkNvbnRlbnRUeXBlID0ge1xuICBjaGFuZ2VfY2lwaGVyX3NwZWM6IDIwLFxuICBhbGVydDogMjEsXG4gIGhhbmRzaGFrZTogMjIsXG4gIGFwcGxpY2F0aW9uX2RhdGE6IDIzLFxuICBoZWFydGJlYXQ6IDI0XG59O1xuXG4vKipcbiAqIFRMUyBoYW5kc2hha2UgdHlwZXMuXG4gKiBlbnVtIHtcbiAqICAgaGVsbG9fcmVxdWVzdCgwKSwgY2xpZW50X2hlbGxvKDEpLCBzZXJ2ZXJfaGVsbG8oMiksXG4gKiAgIGNlcnRpZmljYXRlKDExKSwgc2VydmVyX2tleV9leGNoYW5nZSAoMTIpLFxuICogICBjZXJ0aWZpY2F0ZV9yZXF1ZXN0KDEzKSwgc2VydmVyX2hlbGxvX2RvbmUoMTQpLFxuICogICBjZXJ0aWZpY2F0ZV92ZXJpZnkoMTUpLCBjbGllbnRfa2V5X2V4Y2hhbmdlKDE2KSxcbiAqICAgZmluaXNoZWQoMjApLCAoMjU1KVxuICogfSBIYW5kc2hha2VUeXBlO1xuICovXG50bHMuSGFuZHNoYWtlVHlwZSA9IHtcbiAgaGVsbG9fcmVxdWVzdDogMCxcbiAgY2xpZW50X2hlbGxvOiAxLFxuICBzZXJ2ZXJfaGVsbG86IDIsXG4gIGNlcnRpZmljYXRlOiAxMSxcbiAgc2VydmVyX2tleV9leGNoYW5nZTogMTIsXG4gIGNlcnRpZmljYXRlX3JlcXVlc3Q6IDEzLFxuICBzZXJ2ZXJfaGVsbG9fZG9uZTogMTQsXG4gIGNlcnRpZmljYXRlX3ZlcmlmeTogMTUsXG4gIGNsaWVudF9rZXlfZXhjaGFuZ2U6IDE2LFxuICBmaW5pc2hlZDogMjBcbn07XG5cbi8qKlxuICogVExTIEFsZXJ0IFByb3RvY29sLlxuICpcbiAqIGVudW0geyB3YXJuaW5nKDEpLCBmYXRhbCgyKSwgKDI1NSkgfSBBbGVydExldmVsO1xuICpcbiAqIGVudW0ge1xuICogICBjbG9zZV9ub3RpZnkoMCksXG4gKiAgIHVuZXhwZWN0ZWRfbWVzc2FnZSgxMCksXG4gKiAgIGJhZF9yZWNvcmRfbWFjKDIwKSxcbiAqICAgZGVjcnlwdGlvbl9mYWlsZWQoMjEpLFxuICogICByZWNvcmRfb3ZlcmZsb3coMjIpLFxuICogICBkZWNvbXByZXNzaW9uX2ZhaWx1cmUoMzApLFxuICogICBoYW5kc2hha2VfZmFpbHVyZSg0MCksXG4gKiAgIGJhZF9jZXJ0aWZpY2F0ZSg0MiksXG4gKiAgIHVuc3VwcG9ydGVkX2NlcnRpZmljYXRlKDQzKSxcbiAqICAgY2VydGlmaWNhdGVfcmV2b2tlZCg0NCksXG4gKiAgIGNlcnRpZmljYXRlX2V4cGlyZWQoNDUpLFxuICogICBjZXJ0aWZpY2F0ZV91bmtub3duKDQ2KSxcbiAqICAgaWxsZWdhbF9wYXJhbWV0ZXIoNDcpLFxuICogICB1bmtub3duX2NhKDQ4KSxcbiAqICAgYWNjZXNzX2RlbmllZCg0OSksXG4gKiAgIGRlY29kZV9lcnJvcig1MCksXG4gKiAgIGRlY3J5cHRfZXJyb3IoNTEpLFxuICogICBleHBvcnRfcmVzdHJpY3Rpb24oNjApLFxuICogICBwcm90b2NvbF92ZXJzaW9uKDcwKSxcbiAqICAgaW5zdWZmaWNpZW50X3NlY3VyaXR5KDcxKSxcbiAqICAgaW50ZXJuYWxfZXJyb3IoODApLFxuICogICB1c2VyX2NhbmNlbGVkKDkwKSxcbiAqICAgbm9fcmVuZWdvdGlhdGlvbigxMDApLFxuICogICAoMjU1KVxuICogfSBBbGVydERlc2NyaXB0aW9uO1xuICpcbiAqIHN0cnVjdCB7XG4gKiAgIEFsZXJ0TGV2ZWwgbGV2ZWw7XG4gKiAgIEFsZXJ0RGVzY3JpcHRpb24gZGVzY3JpcHRpb247XG4gKiB9IEFsZXJ0O1xuICovXG50bHMuQWxlcnQgPSB7fTtcbnRscy5BbGVydC5MZXZlbCA9IHtcbiAgd2FybmluZzogMSxcbiAgZmF0YWw6IDJcbn07XG50bHMuQWxlcnQuRGVzY3JpcHRpb24gPSB7XG4gIGNsb3NlX25vdGlmeTogMCxcbiAgdW5leHBlY3RlZF9tZXNzYWdlOiAxMCxcbiAgYmFkX3JlY29yZF9tYWM6IDIwLFxuICBkZWNyeXB0aW9uX2ZhaWxlZDogMjEsXG4gIHJlY29yZF9vdmVyZmxvdzogMjIsXG4gIGRlY29tcHJlc3Npb25fZmFpbHVyZTogMzAsXG4gIGhhbmRzaGFrZV9mYWlsdXJlOiA0MCxcbiAgYmFkX2NlcnRpZmljYXRlOiA0MixcbiAgdW5zdXBwb3J0ZWRfY2VydGlmaWNhdGU6IDQzLFxuICBjZXJ0aWZpY2F0ZV9yZXZva2VkOiA0NCxcbiAgY2VydGlmaWNhdGVfZXhwaXJlZDogNDUsXG4gIGNlcnRpZmljYXRlX3Vua25vd246IDQ2LFxuICBpbGxlZ2FsX3BhcmFtZXRlcjogNDcsXG4gIHVua25vd25fY2E6IDQ4LFxuICBhY2Nlc3NfZGVuaWVkOiA0OSxcbiAgZGVjb2RlX2Vycm9yOiA1MCxcbiAgZGVjcnlwdF9lcnJvcjogNTEsXG4gIGV4cG9ydF9yZXN0cmljdGlvbjogNjAsXG4gIHByb3RvY29sX3ZlcnNpb246IDcwLFxuICBpbnN1ZmZpY2llbnRfc2VjdXJpdHk6IDcxLFxuICBpbnRlcm5hbF9lcnJvcjogODAsXG4gIHVzZXJfY2FuY2VsZWQ6IDkwLFxuICBub19yZW5lZ290aWF0aW9uOiAxMDBcbn07XG5cbi8qKlxuICogVExTIEhlYXJ0YmVhdCBNZXNzYWdlIHR5cGVzLlxuICogZW51bSB7XG4gKiAgIGhlYXJ0YmVhdF9yZXF1ZXN0KDEpLFxuICogICBoZWFydGJlYXRfcmVzcG9uc2UoMiksXG4gKiAgICgyNTUpXG4gKiB9IEhlYXJ0YmVhdE1lc3NhZ2VUeXBlO1xuICovXG50bHMuSGVhcnRiZWF0TWVzc2FnZVR5cGUgPSB7XG4gIGhlYXJ0YmVhdF9yZXF1ZXN0OiAxLFxuICBoZWFydGJlYXRfcmVzcG9uc2U6IDJcbn07XG5cbi8qKlxuICogU3VwcG9ydGVkIGNpcGhlciBzdWl0ZXMuXG4gKi9cbnRscy5DaXBoZXJTdWl0ZXMgPSB7fTtcblxuLyoqXG4gKiBHZXRzIGEgc3VwcG9ydGVkIGNpcGhlciBzdWl0ZSBmcm9tIGl0cyAyIGJ5dGUgSUQuXG4gKlxuICogQHBhcmFtIHR3b0J5dGVzIHR3byBieXRlcyBpbiBhIHN0cmluZy5cbiAqXG4gKiBAcmV0dXJuIHRoZSBtYXRjaGluZyBzdXBwb3J0ZWQgY2lwaGVyIHN1aXRlIG9yIG51bGwuXG4gKi9cbnRscy5nZXRDaXBoZXJTdWl0ZSA9IGZ1bmN0aW9uKHR3b0J5dGVzKSB7XG4gIHZhciBydmFsID0gbnVsbDtcbiAgZm9yKHZhciBrZXkgaW4gdGxzLkNpcGhlclN1aXRlcykge1xuICAgIHZhciBjcyA9IHRscy5DaXBoZXJTdWl0ZXNba2V5XTtcbiAgICBpZihjcy5pZFswXSA9PT0gdHdvQnl0ZXMuY2hhckNvZGVBdCgwKSAmJlxuICAgICAgY3MuaWRbMV0gPT09IHR3b0J5dGVzLmNoYXJDb2RlQXQoMSkpIHtcbiAgICAgIHJ2YWwgPSBjcztcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcnZhbDtcbn07XG5cbi8qKlxuICogQ2FsbGVkIHdoZW4gYW4gdW5leHBlY3RlZCByZWNvcmQgaXMgZW5jb3VudGVyZWQuXG4gKlxuICogQHBhcmFtIGMgdGhlIGNvbm5lY3Rpb24uXG4gKiBAcGFyYW0gcmVjb3JkIHRoZSByZWNvcmQuXG4gKi9cbnRscy5oYW5kbGVVbmV4cGVjdGVkID0gZnVuY3Rpb24oYywgcmVjb3JkKSB7XG4gIC8vIGlmIGNvbm5lY3Rpb24gaXMgY2xpZW50IGFuZCBjbG9zZWQsIGlnbm9yZSB1bmV4cGVjdGVkIG1lc3NhZ2VzXG4gIHZhciBpZ25vcmUgPSAoIWMub3BlbiAmJiBjLmVudGl0eSA9PT0gdGxzLkNvbm5lY3Rpb25FbmQuY2xpZW50KTtcbiAgaWYoIWlnbm9yZSkge1xuICAgIGMuZXJyb3IoYywge1xuICAgICAgbWVzc2FnZTogJ1VuZXhwZWN0ZWQgbWVzc2FnZS4gUmVjZWl2ZWQgVExTIHJlY29yZCBvdXQgb2Ygb3JkZXIuJyxcbiAgICAgIHNlbmQ6IHRydWUsXG4gICAgICBhbGVydDoge1xuICAgICAgICBsZXZlbDogdGxzLkFsZXJ0LkxldmVsLmZhdGFsLFxuICAgICAgICBkZXNjcmlwdGlvbjogdGxzLkFsZXJ0LkRlc2NyaXB0aW9uLnVuZXhwZWN0ZWRfbWVzc2FnZVxuICAgICAgfVxuICAgIH0pO1xuICB9XG59O1xuXG4vKipcbiAqIENhbGxlZCB3aGVuIGEgY2xpZW50IHJlY2VpdmVzIGEgSGVsbG9SZXF1ZXN0IHJlY29yZC5cbiAqXG4gKiBAcGFyYW0gYyB0aGUgY29ubmVjdGlvbi5cbiAqIEBwYXJhbSByZWNvcmQgdGhlIHJlY29yZC5cbiAqIEBwYXJhbSBsZW5ndGggdGhlIGxlbmd0aCBvZiB0aGUgaGFuZHNoYWtlIG1lc3NhZ2UuXG4gKi9cbnRscy5oYW5kbGVIZWxsb1JlcXVlc3QgPSBmdW5jdGlvbihjLCByZWNvcmQsIGxlbmd0aCkge1xuICAvLyBpZ25vcmUgcmVuZWdvdGlhdGlvbiByZXF1ZXN0cyBmcm9tIHRoZSBzZXJ2ZXIgZHVyaW5nIGEgaGFuZHNoYWtlLCBidXRcbiAgLy8gaWYgaGFuZHNoYWtpbmcsIHNlbmQgYSB3YXJuaW5nIGFsZXJ0IHRoYXQgcmVuZWdvdGF0aW9uIGlzIGRlbmllZFxuICBpZighYy5oYW5kc2hha2luZyAmJiBjLmhhbmRzaGFrZXMgPiAwKSB7XG4gICAgLy8gc2VuZCBhbGVydCB3YXJuaW5nXG4gICAgdGxzLnF1ZXVlKGMsIHRscy5jcmVhdGVBbGVydChjLCB7XG4gICAgICAgbGV2ZWw6IHRscy5BbGVydC5MZXZlbC53YXJuaW5nLFxuICAgICAgIGRlc2NyaXB0aW9uOiB0bHMuQWxlcnQuRGVzY3JpcHRpb24ubm9fcmVuZWdvdGlhdGlvblxuICAgIH0pKTtcbiAgICB0bHMuZmx1c2goYyk7XG4gIH1cblxuICAvLyBjb250aW51ZVxuICBjLnByb2Nlc3MoKTtcbn07XG5cbi8qKlxuICogUGFyc2VzIGEgaGVsbG8gbWVzc2FnZSBmcm9tIGEgQ2xpZW50SGVsbG8gb3IgU2VydmVySGVsbG8gcmVjb3JkLlxuICpcbiAqIEBwYXJhbSByZWNvcmQgdGhlIHJlY29yZCB0byBwYXJzZS5cbiAqXG4gKiBAcmV0dXJuIHRoZSBwYXJzZWQgbWVzc2FnZS5cbiAqL1xudGxzLnBhcnNlSGVsbG9NZXNzYWdlID0gZnVuY3Rpb24oYywgcmVjb3JkLCBsZW5ndGgpIHtcbiAgdmFyIG1zZyA9IG51bGw7XG5cbiAgdmFyIGNsaWVudCA9IChjLmVudGl0eSA9PT0gdGxzLkNvbm5lY3Rpb25FbmQuY2xpZW50KTtcblxuICAvLyBtaW5pbXVtIG9mIDM4IGJ5dGVzIGluIG1lc3NhZ2VcbiAgaWYobGVuZ3RoIDwgMzgpIHtcbiAgICBjLmVycm9yKGMsIHtcbiAgICAgIG1lc3NhZ2U6IGNsaWVudCA/XG4gICAgICAgICdJbnZhbGlkIFNlcnZlckhlbGxvIG1lc3NhZ2UuIE1lc3NhZ2UgdG9vIHNob3J0LicgOlxuICAgICAgICAnSW52YWxpZCBDbGllbnRIZWxsbyBtZXNzYWdlLiBNZXNzYWdlIHRvbyBzaG9ydC4nLFxuICAgICAgc2VuZDogdHJ1ZSxcbiAgICAgIGFsZXJ0OiB7XG4gICAgICAgIGxldmVsOiB0bHMuQWxlcnQuTGV2ZWwuZmF0YWwsXG4gICAgICAgIGRlc2NyaXB0aW9uOiB0bHMuQWxlcnQuRGVzY3JpcHRpb24uaWxsZWdhbF9wYXJhbWV0ZXJcbiAgICAgIH1cbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICAvLyB1c2UgJ3JlbWFpbmluZycgdG8gY2FsY3VsYXRlICMgb2YgcmVtYWluaW5nIGJ5dGVzIGluIHRoZSBtZXNzYWdlXG4gICAgdmFyIGIgPSByZWNvcmQuZnJhZ21lbnQ7XG4gICAgdmFyIHJlbWFpbmluZyA9IGIubGVuZ3RoKCk7XG4gICAgbXNnID0ge1xuICAgICAgdmVyc2lvbjoge1xuICAgICAgICBtYWpvcjogYi5nZXRCeXRlKCksXG4gICAgICAgIG1pbm9yOiBiLmdldEJ5dGUoKVxuICAgICAgfSxcbiAgICAgIHJhbmRvbTogZm9yZ2UudXRpbC5jcmVhdGVCdWZmZXIoYi5nZXRCeXRlcygzMikpLFxuICAgICAgc2Vzc2lvbl9pZDogcmVhZFZlY3RvcihiLCAxKSxcbiAgICAgIGV4dGVuc2lvbnM6IFtdXG4gICAgfTtcbiAgICBpZihjbGllbnQpIHtcbiAgICAgIG1zZy5jaXBoZXJfc3VpdGUgPSBiLmdldEJ5dGVzKDIpO1xuICAgICAgbXNnLmNvbXByZXNzaW9uX21ldGhvZCA9IGIuZ2V0Qnl0ZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBtc2cuY2lwaGVyX3N1aXRlcyA9IHJlYWRWZWN0b3IoYiwgMik7XG4gICAgICBtc2cuY29tcHJlc3Npb25fbWV0aG9kcyA9IHJlYWRWZWN0b3IoYiwgMSk7XG4gICAgfVxuXG4gICAgLy8gcmVhZCBleHRlbnNpb25zIGlmIHRoZXJlIGFyZSBhbnkgYnl0ZXMgbGVmdCBpbiB0aGUgbWVzc2FnZVxuICAgIHJlbWFpbmluZyA9IGxlbmd0aCAtIChyZW1haW5pbmcgLSBiLmxlbmd0aCgpKTtcbiAgICBpZihyZW1haW5pbmcgPiAwKSB7XG4gICAgICAvLyBwYXJzZSBleHRlbnNpb25zXG4gICAgICB2YXIgZXh0cyA9IHJlYWRWZWN0b3IoYiwgMik7XG4gICAgICB3aGlsZShleHRzLmxlbmd0aCgpID4gMCkge1xuICAgICAgICBtc2cuZXh0ZW5zaW9ucy5wdXNoKHtcbiAgICAgICAgICB0eXBlOiBbZXh0cy5nZXRCeXRlKCksIGV4dHMuZ2V0Qnl0ZSgpXSxcbiAgICAgICAgICBkYXRhOiByZWFkVmVjdG9yKGV4dHMsIDIpXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyBUT0RPOiBtYWtlIGV4dGVuc2lvbiBzdXBwb3J0IG1vZHVsYXJcbiAgICAgIGlmKCFjbGllbnQpIHtcbiAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IG1zZy5leHRlbnNpb25zLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgdmFyIGV4dCA9IG1zZy5leHRlbnNpb25zW2ldO1xuXG4gICAgICAgICAgLy8gc3VwcG9ydCBTTkkgZXh0ZW5zaW9uXG4gICAgICAgICAgaWYoZXh0LnR5cGVbMF0gPT09IDB4MDAgJiYgZXh0LnR5cGVbMV0gPT09IDB4MDApIHtcbiAgICAgICAgICAgIC8vIGdldCBzZXJ2ZXIgbmFtZSBsaXN0XG4gICAgICAgICAgICB2YXIgc25sID0gcmVhZFZlY3RvcihleHQuZGF0YSwgMik7XG4gICAgICAgICAgICB3aGlsZShzbmwubGVuZ3RoKCkgPiAwKSB7XG4gICAgICAgICAgICAgIC8vIHJlYWQgc2VydmVyIG5hbWUgdHlwZVxuICAgICAgICAgICAgICB2YXIgc25UeXBlID0gc25sLmdldEJ5dGUoKTtcblxuICAgICAgICAgICAgICAvLyBvbmx5IEhvc3ROYW1lIHR5cGUgKDB4MDApIGlzIGtub3duLCBicmVhayBvdXQgaWZcbiAgICAgICAgICAgICAgLy8gYW5vdGhlciB0eXBlIGlzIGRldGVjdGVkXG4gICAgICAgICAgICAgIGlmKHNuVHlwZSAhPT0gMHgwMCkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgLy8gYWRkIGhvc3QgbmFtZSB0byBzZXJ2ZXIgbmFtZSBsaXN0XG4gICAgICAgICAgICAgIGMuc2Vzc2lvbi5leHRlbnNpb25zLnNlcnZlcl9uYW1lLnNlcnZlck5hbWVMaXN0LnB1c2goXG4gICAgICAgICAgICAgICAgcmVhZFZlY3RvcihzbmwsIDIpLmdldEJ5dGVzKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIHZlcnNpb24gYWxyZWFkeSBzZXQsIGRvIG5vdCBhbGxvdyB2ZXJzaW9uIGNoYW5nZVxuICAgIGlmKGMuc2Vzc2lvbi52ZXJzaW9uKSB7XG4gICAgICBpZihtc2cudmVyc2lvbi5tYWpvciAhPT0gYy5zZXNzaW9uLnZlcnNpb24ubWFqb3IgfHxcbiAgICAgICAgbXNnLnZlcnNpb24ubWlub3IgIT09IGMuc2Vzc2lvbi52ZXJzaW9uLm1pbm9yKSB7XG4gICAgICAgIHJldHVybiBjLmVycm9yKGMsIHtcbiAgICAgICAgICBtZXNzYWdlOiAnVExTIHZlcnNpb24gY2hhbmdlIGlzIGRpc2FsbG93ZWQgZHVyaW5nIHJlbmVnb3RpYXRpb24uJyxcbiAgICAgICAgICBzZW5kOiB0cnVlLFxuICAgICAgICAgIGFsZXJ0OiB7XG4gICAgICAgICAgICBsZXZlbDogdGxzLkFsZXJ0LkxldmVsLmZhdGFsLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IHRscy5BbGVydC5EZXNjcmlwdGlvbi5wcm90b2NvbF92ZXJzaW9uXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBnZXQgdGhlIGNob3NlbiAoU2VydmVySGVsbG8pIGNpcGhlciBzdWl0ZVxuICAgIGlmKGNsaWVudCkge1xuICAgICAgLy8gRklYTUU6IHNob3VsZCBiZSBjaGVja2luZyBjb25maWd1cmVkIGFjY2VwdGFibGUgY2lwaGVyIHN1aXRlc1xuICAgICAgYy5zZXNzaW9uLmNpcGhlclN1aXRlID0gdGxzLmdldENpcGhlclN1aXRlKG1zZy5jaXBoZXJfc3VpdGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBnZXQgYSBzdXBwb3J0ZWQgcHJlZmVycmVkIChDbGllbnRIZWxsbykgY2lwaGVyIHN1aXRlXG4gICAgICAvLyBjaG9vc2UgdGhlIGZpcnN0IHN1cHBvcnRlZCBjaXBoZXIgc3VpdGVcbiAgICAgIHZhciB0bXAgPSBmb3JnZS51dGlsLmNyZWF0ZUJ1ZmZlcihtc2cuY2lwaGVyX3N1aXRlcy5ieXRlcygpKTtcbiAgICAgIHdoaWxlKHRtcC5sZW5ndGgoKSA+IDApIHtcbiAgICAgICAgLy8gRklYTUU6IHNob3VsZCBiZSBjaGVja2luZyBjb25maWd1cmVkIGFjY2VwdGFibGUgc3VpdGVzXG4gICAgICAgIC8vIGNpcGhlciBzdWl0ZXMgdGFrZSB1cCAyIGJ5dGVzXG4gICAgICAgIGMuc2Vzc2lvbi5jaXBoZXJTdWl0ZSA9IHRscy5nZXRDaXBoZXJTdWl0ZSh0bXAuZ2V0Qnl0ZXMoMikpO1xuICAgICAgICBpZihjLnNlc3Npb24uY2lwaGVyU3VpdGUgIT09IG51bGwpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGNpcGhlciBzdWl0ZSBub3Qgc3VwcG9ydGVkXG4gICAgaWYoYy5zZXNzaW9uLmNpcGhlclN1aXRlID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gYy5lcnJvcihjLCB7XG4gICAgICAgIG1lc3NhZ2U6ICdObyBjaXBoZXIgc3VpdGVzIGluIGNvbW1vbi4nLFxuICAgICAgICBzZW5kOiB0cnVlLFxuICAgICAgICBhbGVydDoge1xuICAgICAgICAgIGxldmVsOiB0bHMuQWxlcnQuTGV2ZWwuZmF0YWwsXG4gICAgICAgICAgZGVzY3JpcHRpb246IHRscy5BbGVydC5EZXNjcmlwdGlvbi5oYW5kc2hha2VfZmFpbHVyZVxuICAgICAgICB9LFxuICAgICAgICBjaXBoZXJTdWl0ZTogZm9yZ2UudXRpbC5ieXRlc1RvSGV4KG1zZy5jaXBoZXJfc3VpdGUpXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBUT0RPOiBoYW5kbGUgY29tcHJlc3Npb24gbWV0aG9kc1xuICAgIGlmKGNsaWVudCkge1xuICAgICAgYy5zZXNzaW9uLmNvbXByZXNzaW9uTWV0aG9kID0gbXNnLmNvbXByZXNzaW9uX21ldGhvZDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gbm8gY29tcHJlc3Npb25cbiAgICAgIGMuc2Vzc2lvbi5jb21wcmVzc2lvbk1ldGhvZCA9IHRscy5Db21wcmVzc2lvbk1ldGhvZC5ub25lO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBtc2c7XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgc2VjdXJpdHkgcGFyYW1ldGVycyBmb3IgdGhlIGdpdmVuIGNvbm5lY3Rpb24gYmFzZWQgb24gdGhlIGdpdmVuXG4gKiBoZWxsbyBtZXNzYWdlLlxuICpcbiAqIEBwYXJhbSBjIHRoZSBUTFMgY29ubmVjdGlvbi5cbiAqIEBwYXJhbSBtc2cgdGhlIGhlbGxvIG1lc3NhZ2UuXG4gKi9cbnRscy5jcmVhdGVTZWN1cml0eVBhcmFtZXRlcnMgPSBmdW5jdGlvbihjLCBtc2cpIHtcbiAgLyogTm90ZTogc2VjdXJpdHkgcGFyYW1zIGFyZSBmcm9tIFRMUyAxLjIsIHNvbWUgdmFsdWVzIGxpa2UgcHJmX2FsZ29yaXRobVxuICBhcmUgaWdub3JlZCBmb3IgVExTIDEuMC8xLjEgYW5kIHRoZSBidWlsdGluIGFzIHNwZWNpZmllZCBpbiB0aGUgc3BlYyBpc1xuICB1c2VkLiAqL1xuXG4gIC8vIFRPRE86IGhhbmRsZSBvdGhlciBvcHRpb25zIGZyb20gc2VydmVyIHdoZW4gbW9yZSBzdXBwb3J0ZWRcblxuICAvLyBnZXQgY2xpZW50IGFuZCBzZXJ2ZXIgcmFuZG9tc1xuICB2YXIgY2xpZW50ID0gKGMuZW50aXR5ID09PSB0bHMuQ29ubmVjdGlvbkVuZC5jbGllbnQpO1xuICB2YXIgbXNnUmFuZG9tID0gbXNnLnJhbmRvbS5ieXRlcygpO1xuICB2YXIgY1JhbmRvbSA9IGNsaWVudCA/IGMuc2Vzc2lvbi5zcC5jbGllbnRfcmFuZG9tIDogbXNnUmFuZG9tO1xuICB2YXIgc1JhbmRvbSA9IGNsaWVudCA/IG1zZ1JhbmRvbSA6IHRscy5jcmVhdGVSYW5kb20oKS5nZXRCeXRlcygpO1xuXG4gIC8vIGNyZWF0ZSBuZXcgc2VjdXJpdHkgcGFyYW1ldGVyc1xuICBjLnNlc3Npb24uc3AgPSB7XG4gICAgZW50aXR5OiBjLmVudGl0eSxcbiAgICBwcmZfYWxnb3JpdGhtOiB0bHMuUFJGQWxnb3JpdGhtLnRsc19wcmZfc2hhMjU2LFxuICAgIGJ1bGtfY2lwaGVyX2FsZ29yaXRobTogbnVsbCxcbiAgICBjaXBoZXJfdHlwZTogbnVsbCxcbiAgICBlbmNfa2V5X2xlbmd0aDogbnVsbCxcbiAgICBibG9ja19sZW5ndGg6IG51bGwsXG4gICAgZml4ZWRfaXZfbGVuZ3RoOiBudWxsLFxuICAgIHJlY29yZF9pdl9sZW5ndGg6IG51bGwsXG4gICAgbWFjX2FsZ29yaXRobTogbnVsbCxcbiAgICBtYWNfbGVuZ3RoOiBudWxsLFxuICAgIG1hY19rZXlfbGVuZ3RoOiBudWxsLFxuICAgIGNvbXByZXNzaW9uX2FsZ29yaXRobTogYy5zZXNzaW9uLmNvbXByZXNzaW9uTWV0aG9kLFxuICAgIHByZV9tYXN0ZXJfc2VjcmV0OiBudWxsLFxuICAgIG1hc3Rlcl9zZWNyZXQ6IG51bGwsXG4gICAgY2xpZW50X3JhbmRvbTogY1JhbmRvbSxcbiAgICBzZXJ2ZXJfcmFuZG9tOiBzUmFuZG9tXG4gIH07XG59O1xuXG4vKipcbiAqIENhbGxlZCB3aGVuIGEgY2xpZW50IHJlY2VpdmVzIGEgU2VydmVySGVsbG8gcmVjb3JkLlxuICpcbiAqIFdoZW4gYSBTZXJ2ZXJIZWxsbyBtZXNzYWdlIHdpbGwgYmUgc2VudDpcbiAqICAgVGhlIHNlcnZlciB3aWxsIHNlbmQgdGhpcyBtZXNzYWdlIGluIHJlc3BvbnNlIHRvIGEgY2xpZW50IGhlbGxvIG1lc3NhZ2VcbiAqICAgd2hlbiBpdCB3YXMgYWJsZSB0byBmaW5kIGFuIGFjY2VwdGFibGUgc2V0IG9mIGFsZ29yaXRobXMuIElmIGl0IGNhbm5vdFxuICogICBmaW5kIHN1Y2ggYSBtYXRjaCwgaXQgd2lsbCByZXNwb25kIHdpdGggYSBoYW5kc2hha2UgZmFpbHVyZSBhbGVydC5cbiAqXG4gKiB1aW50MjQgbGVuZ3RoO1xuICogc3RydWN0IHtcbiAqICAgUHJvdG9jb2xWZXJzaW9uIHNlcnZlcl92ZXJzaW9uO1xuICogICBSYW5kb20gcmFuZG9tO1xuICogICBTZXNzaW9uSUQgc2Vzc2lvbl9pZDtcbiAqICAgQ2lwaGVyU3VpdGUgY2lwaGVyX3N1aXRlO1xuICogICBDb21wcmVzc2lvbk1ldGhvZCBjb21wcmVzc2lvbl9tZXRob2Q7XG4gKiAgIHNlbGVjdChleHRlbnNpb25zX3ByZXNlbnQpIHtcbiAqICAgICBjYXNlIGZhbHNlOlxuICogICAgICAgc3RydWN0IHt9O1xuICogICAgIGNhc2UgdHJ1ZTpcbiAqICAgICAgIEV4dGVuc2lvbiBleHRlbnNpb25zPDAuLjJeMTYtMT47XG4gKiAgIH07XG4gKiB9IFNlcnZlckhlbGxvO1xuICpcbiAqIEBwYXJhbSBjIHRoZSBjb25uZWN0aW9uLlxuICogQHBhcmFtIHJlY29yZCB0aGUgcmVjb3JkLlxuICogQHBhcmFtIGxlbmd0aCB0aGUgbGVuZ3RoIG9mIHRoZSBoYW5kc2hha2UgbWVzc2FnZS5cbiAqL1xudGxzLmhhbmRsZVNlcnZlckhlbGxvID0gZnVuY3Rpb24oYywgcmVjb3JkLCBsZW5ndGgpIHtcbiAgdmFyIG1zZyA9IHRscy5wYXJzZUhlbGxvTWVzc2FnZShjLCByZWNvcmQsIGxlbmd0aCk7XG4gIGlmKGMuZmFpbCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIGVuc3VyZSBzZXJ2ZXIgdmVyc2lvbiBpcyBjb21wYXRpYmxlXG4gIGlmKG1zZy52ZXJzaW9uLm1pbm9yIDw9IGMudmVyc2lvbi5taW5vcikge1xuICAgIGMudmVyc2lvbi5taW5vciA9IG1zZy52ZXJzaW9uLm1pbm9yO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBjLmVycm9yKGMsIHtcbiAgICAgIG1lc3NhZ2U6ICdJbmNvbXBhdGlibGUgVExTIHZlcnNpb24uJyxcbiAgICAgIHNlbmQ6IHRydWUsXG4gICAgICBhbGVydDoge1xuICAgICAgICBsZXZlbDogdGxzLkFsZXJ0LkxldmVsLmZhdGFsLFxuICAgICAgICBkZXNjcmlwdGlvbjogdGxzLkFsZXJ0LkRlc2NyaXB0aW9uLnByb3RvY29sX3ZlcnNpb25cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8vIGluZGljYXRlIHNlc3Npb24gdmVyc2lvbiBoYXMgYmVlbiBzZXRcbiAgYy5zZXNzaW9uLnZlcnNpb24gPSBjLnZlcnNpb247XG5cbiAgLy8gZ2V0IHRoZSBzZXNzaW9uIElEIGZyb20gdGhlIG1lc3NhZ2VcbiAgdmFyIHNlc3Npb25JZCA9IG1zZy5zZXNzaW9uX2lkLmJ5dGVzKCk7XG5cbiAgLy8gaWYgdGhlIHNlc3Npb24gSUQgaXMgbm90IGJsYW5rIGFuZCBtYXRjaGVzIHRoZSBjYWNoZWQgb25lLCByZXN1bWVcbiAgLy8gdGhlIHNlc3Npb25cbiAgaWYoc2Vzc2lvbklkLmxlbmd0aCA+IDAgJiYgc2Vzc2lvbklkID09PSBjLnNlc3Npb24uaWQpIHtcbiAgICAvLyByZXN1bWluZyBzZXNzaW9uLCBleHBlY3QgYSBDaGFuZ2VDaXBoZXJTcGVjIG5leHRcbiAgICBjLmV4cGVjdCA9IFNDQztcbiAgICBjLnNlc3Npb24ucmVzdW1pbmcgPSB0cnVlO1xuXG4gICAgLy8gZ2V0IG5ldyBzZXJ2ZXIgcmFuZG9tXG4gICAgYy5zZXNzaW9uLnNwLnNlcnZlcl9yYW5kb20gPSBtc2cucmFuZG9tLmJ5dGVzKCk7XG4gIH0gZWxzZSB7XG4gICAgLy8gbm90IHJlc3VtaW5nLCBleHBlY3QgYSBzZXJ2ZXIgQ2VydGlmaWNhdGUgbWVzc2FnZSBuZXh0XG4gICAgYy5leHBlY3QgPSBTQ0U7XG4gICAgYy5zZXNzaW9uLnJlc3VtaW5nID0gZmFsc2U7XG5cbiAgICAvLyBjcmVhdGUgbmV3IHNlY3VyaXR5IHBhcmFtZXRlcnNcbiAgICB0bHMuY3JlYXRlU2VjdXJpdHlQYXJhbWV0ZXJzKGMsIG1zZyk7XG4gIH1cblxuICAvLyBzZXQgbmV3IHNlc3Npb24gSURcbiAgYy5zZXNzaW9uLmlkID0gc2Vzc2lvbklkO1xuXG4gIC8vIGNvbnRpbnVlXG4gIGMucHJvY2VzcygpO1xufTtcblxuLyoqXG4gKiBDYWxsZWQgd2hlbiBhIHNlcnZlciByZWNlaXZlcyBhIENsaWVudEhlbGxvIHJlY29yZC5cbiAqXG4gKiBXaGVuIGEgQ2xpZW50SGVsbG8gbWVzc2FnZSB3aWxsIGJlIHNlbnQ6XG4gKiAgIFdoZW4gYSBjbGllbnQgZmlyc3QgY29ubmVjdHMgdG8gYSBzZXJ2ZXIgaXQgaXMgcmVxdWlyZWQgdG8gc2VuZCB0aGVcbiAqICAgY2xpZW50IGhlbGxvIGFzIGl0cyBmaXJzdCBtZXNzYWdlLiBUaGUgY2xpZW50IGNhbiBhbHNvIHNlbmQgYSBjbGllbnRcbiAqICAgaGVsbG8gaW4gcmVzcG9uc2UgdG8gYSBoZWxsbyByZXF1ZXN0IG9yIG9uIGl0cyBvd24gaW5pdGlhdGl2ZSBpbiBvcmRlclxuICogICB0byByZW5lZ290aWF0ZSB0aGUgc2VjdXJpdHkgcGFyYW1ldGVycyBpbiBhbiBleGlzdGluZyBjb25uZWN0aW9uLlxuICpcbiAqIEBwYXJhbSBjIHRoZSBjb25uZWN0aW9uLlxuICogQHBhcmFtIHJlY29yZCB0aGUgcmVjb3JkLlxuICogQHBhcmFtIGxlbmd0aCB0aGUgbGVuZ3RoIG9mIHRoZSBoYW5kc2hha2UgbWVzc2FnZS5cbiAqL1xudGxzLmhhbmRsZUNsaWVudEhlbGxvID0gZnVuY3Rpb24oYywgcmVjb3JkLCBsZW5ndGgpIHtcbiAgdmFyIG1zZyA9IHRscy5wYXJzZUhlbGxvTWVzc2FnZShjLCByZWNvcmQsIGxlbmd0aCk7XG4gIGlmKGMuZmFpbCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIGdldCB0aGUgc2Vzc2lvbiBJRCBmcm9tIHRoZSBtZXNzYWdlXG4gIHZhciBzZXNzaW9uSWQgPSBtc2cuc2Vzc2lvbl9pZC5ieXRlcygpO1xuXG4gIC8vIHNlZSBpZiB0aGUgZ2l2ZW4gc2Vzc2lvbiBJRCBpcyBpbiB0aGUgY2FjaGVcbiAgdmFyIHNlc3Npb24gPSBudWxsO1xuICBpZihjLnNlc3Npb25DYWNoZSkge1xuICAgIHNlc3Npb24gPSBjLnNlc3Npb25DYWNoZS5nZXRTZXNzaW9uKHNlc3Npb25JZCk7XG4gICAgaWYoc2Vzc2lvbiA9PT0gbnVsbCkge1xuICAgICAgLy8gc2Vzc2lvbiBJRCBub3QgZm91bmRcbiAgICAgIHNlc3Npb25JZCA9ICcnO1xuICAgIH0gZWxzZSBpZihzZXNzaW9uLnZlcnNpb24ubWFqb3IgIT09IG1zZy52ZXJzaW9uLm1ham9yIHx8XG4gICAgICBzZXNzaW9uLnZlcnNpb24ubWlub3IgPiBtc2cudmVyc2lvbi5taW5vcikge1xuICAgICAgLy8gaWYgc2Vzc2lvbiB2ZXJzaW9uIGlzIGluY29tcGF0aWJsZSB3aXRoIGNsaWVudCB2ZXJzaW9uLCBkbyBub3QgcmVzdW1lXG4gICAgICBzZXNzaW9uID0gbnVsbDtcbiAgICAgIHNlc3Npb25JZCA9ICcnO1xuICAgIH1cbiAgfVxuXG4gIC8vIG5vIHNlc3Npb24gZm91bmQgdG8gcmVzdW1lLCBnZW5lcmF0ZSBhIG5ldyBzZXNzaW9uIElEXG4gIGlmKHNlc3Npb25JZC5sZW5ndGggPT09IDApIHtcbiAgICBzZXNzaW9uSWQgPSBmb3JnZS5yYW5kb20uZ2V0Qnl0ZXMoMzIpO1xuICB9XG5cbiAgLy8gdXBkYXRlIHNlc3Npb25cbiAgYy5zZXNzaW9uLmlkID0gc2Vzc2lvbklkO1xuICBjLnNlc3Npb24uY2xpZW50SGVsbG9WZXJzaW9uID0gbXNnLnZlcnNpb247XG4gIGMuc2Vzc2lvbi5zcCA9IHt9O1xuICBpZihzZXNzaW9uKSB7XG4gICAgLy8gdXNlIHZlcnNpb24gYW5kIHNlY3VyaXR5IHBhcmFtZXRlcnMgZnJvbSByZXN1bWVkIHNlc3Npb25cbiAgICBjLnZlcnNpb24gPSBjLnNlc3Npb24udmVyc2lvbiA9IHNlc3Npb24udmVyc2lvbjtcbiAgICBjLnNlc3Npb24uc3AgPSBzZXNzaW9uLnNwO1xuICB9IGVsc2Uge1xuICAgIC8vIHVzZSBoaWdoZXN0IGNvbXBhdGlibGUgbWlub3IgdmVyc2lvblxuICAgIHZhciB2ZXJzaW9uO1xuICAgIGZvcih2YXIgaSA9IDE7IGkgPCB0bHMuU3VwcG9ydGVkVmVyc2lvbnMubGVuZ3RoOyArK2kpIHtcbiAgICAgIHZlcnNpb24gPSB0bHMuU3VwcG9ydGVkVmVyc2lvbnNbaV07XG4gICAgICBpZih2ZXJzaW9uLm1pbm9yIDw9IG1zZy52ZXJzaW9uLm1pbm9yKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBjLnZlcnNpb24gPSB7bWFqb3I6IHZlcnNpb24ubWFqb3IsIG1pbm9yOiB2ZXJzaW9uLm1pbm9yfTtcbiAgICBjLnNlc3Npb24udmVyc2lvbiA9IGMudmVyc2lvbjtcbiAgfVxuXG4gIC8vIGlmIGEgc2Vzc2lvbiBpcyBzZXQsIHJlc3VtZSBpdFxuICBpZihzZXNzaW9uICE9PSBudWxsKSB7XG4gICAgLy8gcmVzdW1pbmcgc2Vzc2lvbiwgZXhwZWN0IGEgQ2hhbmdlQ2lwaGVyU3BlYyBuZXh0XG4gICAgYy5leHBlY3QgPSBDQ0M7XG4gICAgYy5zZXNzaW9uLnJlc3VtaW5nID0gdHJ1ZTtcblxuICAgIC8vIGdldCBuZXcgY2xpZW50IHJhbmRvbVxuICAgIGMuc2Vzc2lvbi5zcC5jbGllbnRfcmFuZG9tID0gbXNnLnJhbmRvbS5ieXRlcygpO1xuICB9IGVsc2Uge1xuICAgIC8vIG5vdCByZXN1bWluZywgZXhwZWN0IGEgQ2VydGlmaWNhdGUgb3IgQ2xpZW50S2V5RXhjaGFuZ2VcbiAgICBjLmV4cGVjdCA9IChjLnZlcmlmeUNsaWVudCAhPT0gZmFsc2UpID8gQ0NFIDogQ0tFO1xuICAgIGMuc2Vzc2lvbi5yZXN1bWluZyA9IGZhbHNlO1xuXG4gICAgLy8gY3JlYXRlIG5ldyBzZWN1cml0eSBwYXJhbWV0ZXJzXG4gICAgdGxzLmNyZWF0ZVNlY3VyaXR5UGFyYW1ldGVycyhjLCBtc2cpO1xuICB9XG5cbiAgLy8gY29ubmVjdGlvbiBub3cgb3BlblxuICBjLm9wZW4gPSB0cnVlO1xuXG4gIC8vIHF1ZXVlIHNlcnZlciBoZWxsb1xuICB0bHMucXVldWUoYywgdGxzLmNyZWF0ZVJlY29yZChjLCB7XG4gICAgdHlwZTogdGxzLkNvbnRlbnRUeXBlLmhhbmRzaGFrZSxcbiAgICBkYXRhOiB0bHMuY3JlYXRlU2VydmVySGVsbG8oYylcbiAgfSkpO1xuXG4gIGlmKGMuc2Vzc2lvbi5yZXN1bWluZykge1xuICAgIC8vIHF1ZXVlIGNoYW5nZSBjaXBoZXIgc3BlYyBtZXNzYWdlXG4gICAgdGxzLnF1ZXVlKGMsIHRscy5jcmVhdGVSZWNvcmQoYywge1xuICAgICAgdHlwZTogdGxzLkNvbnRlbnRUeXBlLmNoYW5nZV9jaXBoZXJfc3BlYyxcbiAgICAgIGRhdGE6IHRscy5jcmVhdGVDaGFuZ2VDaXBoZXJTcGVjKClcbiAgICB9KSk7XG5cbiAgICAvLyBjcmVhdGUgcGVuZGluZyBzdGF0ZVxuICAgIGMuc3RhdGUucGVuZGluZyA9IHRscy5jcmVhdGVDb25uZWN0aW9uU3RhdGUoYyk7XG5cbiAgICAvLyBjaGFuZ2UgY3VycmVudCB3cml0ZSBzdGF0ZSB0byBwZW5kaW5nIHdyaXRlIHN0YXRlXG4gICAgYy5zdGF0ZS5jdXJyZW50LndyaXRlID0gYy5zdGF0ZS5wZW5kaW5nLndyaXRlO1xuXG4gICAgLy8gcXVldWUgZmluaXNoZWRcbiAgICB0bHMucXVldWUoYywgdGxzLmNyZWF0ZVJlY29yZChjLCB7XG4gICAgICB0eXBlOiB0bHMuQ29udGVudFR5cGUuaGFuZHNoYWtlLFxuICAgICAgZGF0YTogdGxzLmNyZWF0ZUZpbmlzaGVkKGMpXG4gICAgfSkpO1xuICB9IGVsc2Uge1xuICAgIC8vIHF1ZXVlIHNlcnZlciBjZXJ0aWZpY2F0ZVxuICAgIHRscy5xdWV1ZShjLCB0bHMuY3JlYXRlUmVjb3JkKGMsIHtcbiAgICAgIHR5cGU6IHRscy5Db250ZW50VHlwZS5oYW5kc2hha2UsXG4gICAgICBkYXRhOiB0bHMuY3JlYXRlQ2VydGlmaWNhdGUoYylcbiAgICB9KSk7XG5cbiAgICBpZighYy5mYWlsKSB7XG4gICAgICAvLyBxdWV1ZSBzZXJ2ZXIga2V5IGV4Y2hhbmdlXG4gICAgICB0bHMucXVldWUoYywgdGxzLmNyZWF0ZVJlY29yZChjLCB7XG4gICAgICAgIHR5cGU6IHRscy5Db250ZW50VHlwZS5oYW5kc2hha2UsXG4gICAgICAgIGRhdGE6IHRscy5jcmVhdGVTZXJ2ZXJLZXlFeGNoYW5nZShjKVxuICAgICAgfSkpO1xuXG4gICAgICAvLyByZXF1ZXN0IGNsaWVudCBjZXJ0aWZpY2F0ZSBpZiBzZXRcbiAgICAgIGlmKGMudmVyaWZ5Q2xpZW50ICE9PSBmYWxzZSkge1xuICAgICAgICAvLyBxdWV1ZSBjZXJ0aWZpY2F0ZSByZXF1ZXN0XG4gICAgICAgIHRscy5xdWV1ZShjLCB0bHMuY3JlYXRlUmVjb3JkKGMsIHtcbiAgICAgICAgICB0eXBlOiB0bHMuQ29udGVudFR5cGUuaGFuZHNoYWtlLFxuICAgICAgICAgIGRhdGE6IHRscy5jcmVhdGVDZXJ0aWZpY2F0ZVJlcXVlc3QoYylcbiAgICAgICAgfSkpO1xuICAgICAgfVxuXG4gICAgICAvLyBxdWV1ZSBzZXJ2ZXIgaGVsbG8gZG9uZVxuICAgICAgdGxzLnF1ZXVlKGMsIHRscy5jcmVhdGVSZWNvcmQoYywge1xuICAgICAgICB0eXBlOiB0bHMuQ29udGVudFR5cGUuaGFuZHNoYWtlLFxuICAgICAgICBkYXRhOiB0bHMuY3JlYXRlU2VydmVySGVsbG9Eb25lKGMpXG4gICAgICB9KSk7XG4gICAgfVxuICB9XG5cbiAgLy8gc2VuZCByZWNvcmRzXG4gIHRscy5mbHVzaChjKTtcblxuICAvLyBjb250aW51ZVxuICBjLnByb2Nlc3MoKTtcbn07XG5cbi8qKlxuICogQ2FsbGVkIHdoZW4gYSBjbGllbnQgcmVjZWl2ZXMgYSBDZXJ0aWZpY2F0ZSByZWNvcmQuXG4gKlxuICogV2hlbiB0aGlzIG1lc3NhZ2Ugd2lsbCBiZSBzZW50OlxuICogICBUaGUgc2VydmVyIG11c3Qgc2VuZCBhIGNlcnRpZmljYXRlIHdoZW5ldmVyIHRoZSBhZ3JlZWQtdXBvbiBrZXkgZXhjaGFuZ2VcbiAqICAgbWV0aG9kIGlzIG5vdCBhbiBhbm9ueW1vdXMgb25lLiBUaGlzIG1lc3NhZ2Ugd2lsbCBhbHdheXMgaW1tZWRpYXRlbHlcbiAqICAgZm9sbG93IHRoZSBzZXJ2ZXIgaGVsbG8gbWVzc2FnZS5cbiAqXG4gKiBNZWFuaW5nIG9mIHRoaXMgbWVzc2FnZTpcbiAqICAgVGhlIGNlcnRpZmljYXRlIHR5cGUgbXVzdCBiZSBhcHByb3ByaWF0ZSBmb3IgdGhlIHNlbGVjdGVkIGNpcGhlciBzdWl0ZSdzXG4gKiAgIGtleSBleGNoYW5nZSBhbGdvcml0aG0sIGFuZCBpcyBnZW5lcmFsbHkgYW4gWC41MDl2MyBjZXJ0aWZpY2F0ZS4gSXQgbXVzdFxuICogICBjb250YWluIGEga2V5IHdoaWNoIG1hdGNoZXMgdGhlIGtleSBleGNoYW5nZSBtZXRob2QsIGFzIGZvbGxvd3MuIFVubGVzc1xuICogICBvdGhlcndpc2Ugc3BlY2lmaWVkLCB0aGUgc2lnbmluZyBhbGdvcml0aG0gZm9yIHRoZSBjZXJ0aWZpY2F0ZSBtdXN0IGJlXG4gKiAgIHRoZSBzYW1lIGFzIHRoZSBhbGdvcml0aG0gZm9yIHRoZSBjZXJ0aWZpY2F0ZSBrZXkuIFVubGVzcyBvdGhlcndpc2VcbiAqICAgc3BlY2lmaWVkLCB0aGUgcHVibGljIGtleSBtYXkgYmUgb2YgYW55IGxlbmd0aC5cbiAqXG4gKiBvcGFxdWUgQVNOLjFDZXJ0PDEuLjJeMjQtMT47XG4gKiBzdHJ1Y3Qge1xuICogICBBU04uMUNlcnQgY2VydGlmaWNhdGVfbGlzdDwxLi4yXjI0LTE+O1xuICogfSBDZXJ0aWZpY2F0ZTtcbiAqXG4gKiBAcGFyYW0gYyB0aGUgY29ubmVjdGlvbi5cbiAqIEBwYXJhbSByZWNvcmQgdGhlIHJlY29yZC5cbiAqIEBwYXJhbSBsZW5ndGggdGhlIGxlbmd0aCBvZiB0aGUgaGFuZHNoYWtlIG1lc3NhZ2UuXG4gKi9cbnRscy5oYW5kbGVDZXJ0aWZpY2F0ZSA9IGZ1bmN0aW9uKGMsIHJlY29yZCwgbGVuZ3RoKSB7XG4gIC8vIG1pbmltdW0gb2YgMyBieXRlcyBpbiBtZXNzYWdlXG4gIGlmKGxlbmd0aCA8IDMpIHtcbiAgICByZXR1cm4gYy5lcnJvcihjLCB7XG4gICAgICBtZXNzYWdlOiAnSW52YWxpZCBDZXJ0aWZpY2F0ZSBtZXNzYWdlLiBNZXNzYWdlIHRvbyBzaG9ydC4nLFxuICAgICAgc2VuZDogdHJ1ZSxcbiAgICAgIGFsZXJ0OiB7XG4gICAgICAgIGxldmVsOiB0bHMuQWxlcnQuTGV2ZWwuZmF0YWwsXG4gICAgICAgIGRlc2NyaXB0aW9uOiB0bHMuQWxlcnQuRGVzY3JpcHRpb24uaWxsZWdhbF9wYXJhbWV0ZXJcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHZhciBiID0gcmVjb3JkLmZyYWdtZW50O1xuICB2YXIgbXNnID0ge1xuICAgIGNlcnRpZmljYXRlX2xpc3Q6IHJlYWRWZWN0b3IoYiwgMylcbiAgfTtcblxuICAvKiBUaGUgc2VuZGVyJ3MgY2VydGlmaWNhdGUgd2lsbCBiZSBmaXJzdCBpbiB0aGUgbGlzdCAoY2hhaW4pLCBlYWNoXG4gICAgc3Vic2VxdWVudCBvbmUgdGhhdCBmb2xsb3dzIHdpbGwgY2VydGlmeSB0aGUgcHJldmlvdXMgb25lLCBidXQgcm9vdFxuICAgIGNlcnRpZmljYXRlcyAoc2VsZi1zaWduZWQpIHRoYXQgc3BlY2lmeSB0aGUgY2VydGlmaWNhdGUgYXV0aG9yaXR5IG1heVxuICAgIGJlIG9taXR0ZWQgdW5kZXIgdGhlIGFzc3VtcHRpb24gdGhhdCBjbGllbnRzIG11c3QgYWxyZWFkeSBwb3NzZXNzIGl0LiAqL1xuICB2YXIgY2VydCwgYXNuMTtcbiAgdmFyIGNlcnRzID0gW107XG4gIHRyeSB7XG4gICAgd2hpbGUobXNnLmNlcnRpZmljYXRlX2xpc3QubGVuZ3RoKCkgPiAwKSB7XG4gICAgICAvLyBlYWNoIGVudHJ5IGluIG1zZy5jZXJ0aWZpY2F0ZV9saXN0IGlzIGEgdmVjdG9yIHdpdGggMyBsZW4gYnl0ZXNcbiAgICAgIGNlcnQgPSByZWFkVmVjdG9yKG1zZy5jZXJ0aWZpY2F0ZV9saXN0LCAzKTtcbiAgICAgIGFzbjEgPSBmb3JnZS5hc24xLmZyb21EZXIoY2VydCk7XG4gICAgICBjZXJ0ID0gZm9yZ2UucGtpLmNlcnRpZmljYXRlRnJvbUFzbjEoYXNuMSwgdHJ1ZSk7XG4gICAgICBjZXJ0cy5wdXNoKGNlcnQpO1xuICAgIH1cbiAgfSBjYXRjaChleCkge1xuICAgIHJldHVybiBjLmVycm9yKGMsIHtcbiAgICAgIG1lc3NhZ2U6ICdDb3VsZCBub3QgcGFyc2UgY2VydGlmaWNhdGUgbGlzdC4nLFxuICAgICAgY2F1c2U6IGV4LFxuICAgICAgc2VuZDogdHJ1ZSxcbiAgICAgIGFsZXJ0OiB7XG4gICAgICAgIGxldmVsOiB0bHMuQWxlcnQuTGV2ZWwuZmF0YWwsXG4gICAgICAgIGRlc2NyaXB0aW9uOiB0bHMuQWxlcnQuRGVzY3JpcHRpb24uYmFkX2NlcnRpZmljYXRlXG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvLyBlbnN1cmUgYXQgbGVhc3QgMSBjZXJ0aWZpY2F0ZSB3YXMgcHJvdmlkZWQgaWYgaW4gY2xpZW50LW1vZGVcbiAgLy8gb3IgaWYgdmVyaWZ5Q2xpZW50IHdhcyBzZXQgdG8gdHJ1ZSB0byByZXF1aXJlIGEgY2VydGlmaWNhdGVcbiAgLy8gKGFzIG9wcG9zZWQgdG8gJ29wdGlvbmFsJylcbiAgdmFyIGNsaWVudCA9IChjLmVudGl0eSA9PT0gdGxzLkNvbm5lY3Rpb25FbmQuY2xpZW50KTtcbiAgaWYoKGNsaWVudCB8fCBjLnZlcmlmeUNsaWVudCA9PT0gdHJ1ZSkgJiYgY2VydHMubGVuZ3RoID09PSAwKSB7XG4gICAgLy8gZXJyb3IsIG5vIGNlcnRpZmljYXRlXG4gICAgYy5lcnJvcihjLCB7XG4gICAgICBtZXNzYWdlOiBjbGllbnQgP1xuICAgICAgICAnTm8gc2VydmVyIGNlcnRpZmljYXRlIHByb3ZpZGVkLicgOlxuICAgICAgICAnTm8gY2xpZW50IGNlcnRpZmljYXRlIHByb3ZpZGVkLicsXG4gICAgICBzZW5kOiB0cnVlLFxuICAgICAgYWxlcnQ6IHtcbiAgICAgICAgbGV2ZWw6IHRscy5BbGVydC5MZXZlbC5mYXRhbCxcbiAgICAgICAgZGVzY3JpcHRpb246IHRscy5BbGVydC5EZXNjcmlwdGlvbi5pbGxlZ2FsX3BhcmFtZXRlclxuICAgICAgfVxuICAgIH0pO1xuICB9IGVsc2UgaWYoY2VydHMubGVuZ3RoID09PSAwKSB7XG4gICAgLy8gbm8gY2VydHMgdG8gdmVyaWZ5XG4gICAgLy8gZXhwZWN0IGEgU2VydmVyS2V5RXhjaGFuZ2Ugb3IgQ2xpZW50S2V5RXhjaGFuZ2UgbWVzc2FnZSBuZXh0XG4gICAgYy5leHBlY3QgPSBjbGllbnQgPyBTS0UgOiBDS0U7XG4gIH0gZWxzZSB7XG4gICAgLy8gc2F2ZSBjZXJ0aWZpY2F0ZSBpbiBzZXNzaW9uXG4gICAgaWYoY2xpZW50KSB7XG4gICAgICBjLnNlc3Npb24uc2VydmVyQ2VydGlmaWNhdGUgPSBjZXJ0c1swXTtcbiAgICB9IGVsc2Uge1xuICAgICAgYy5zZXNzaW9uLmNsaWVudENlcnRpZmljYXRlID0gY2VydHNbMF07XG4gICAgfVxuXG4gICAgaWYodGxzLnZlcmlmeUNlcnRpZmljYXRlQ2hhaW4oYywgY2VydHMpKSB7XG4gICAgICAvLyBleHBlY3QgYSBTZXJ2ZXJLZXlFeGNoYW5nZSBvciBDbGllbnRLZXlFeGNoYW5nZSBtZXNzYWdlIG5leHRcbiAgICAgIGMuZXhwZWN0ID0gY2xpZW50ID8gU0tFIDogQ0tFO1xuICAgIH1cbiAgfVxuXG4gIC8vIGNvbnRpbnVlXG4gIGMucHJvY2VzcygpO1xufTtcblxuLyoqXG4gKiBDYWxsZWQgd2hlbiBhIGNsaWVudCByZWNlaXZlcyBhIFNlcnZlcktleUV4Y2hhbmdlIHJlY29yZC5cbiAqXG4gKiBXaGVuIHRoaXMgbWVzc2FnZSB3aWxsIGJlIHNlbnQ6XG4gKiAgIFRoaXMgbWVzc2FnZSB3aWxsIGJlIHNlbnQgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIHNlcnZlciBjZXJ0aWZpY2F0ZVxuICogICBtZXNzYWdlIChvciB0aGUgc2VydmVyIGhlbGxvIG1lc3NhZ2UsIGlmIHRoaXMgaXMgYW4gYW5vbnltb3VzXG4gKiAgIG5lZ290aWF0aW9uKS5cbiAqXG4gKiAgIFRoZSBzZXJ2ZXIga2V5IGV4Y2hhbmdlIG1lc3NhZ2UgaXMgc2VudCBieSB0aGUgc2VydmVyIG9ubHkgd2hlbiB0aGVcbiAqICAgc2VydmVyIGNlcnRpZmljYXRlIG1lc3NhZ2UgKGlmIHNlbnQpIGRvZXMgbm90IGNvbnRhaW4gZW5vdWdoIGRhdGEgdG9cbiAqICAgYWxsb3cgdGhlIGNsaWVudCB0byBleGNoYW5nZSBhIHByZW1hc3RlciBzZWNyZXQuXG4gKlxuICogTWVhbmluZyBvZiB0aGlzIG1lc3NhZ2U6XG4gKiAgIFRoaXMgbWVzc2FnZSBjb252ZXlzIGNyeXB0b2dyYXBoaWMgaW5mb3JtYXRpb24gdG8gYWxsb3cgdGhlIGNsaWVudCB0b1xuICogICBjb21tdW5pY2F0ZSB0aGUgcHJlbWFzdGVyIHNlY3JldDogZWl0aGVyIGFuIFJTQSBwdWJsaWMga2V5IHRvIGVuY3J5cHRcbiAqICAgdGhlIHByZW1hc3RlciBzZWNyZXQgd2l0aCwgb3IgYSBEaWZmaWUtSGVsbG1hbiBwdWJsaWMga2V5IHdpdGggd2hpY2ggdGhlXG4gKiAgIGNsaWVudCBjYW4gY29tcGxldGUgYSBrZXkgZXhjaGFuZ2UgKHdpdGggdGhlIHJlc3VsdCBiZWluZyB0aGUgcHJlbWFzdGVyXG4gKiAgIHNlY3JldC4pXG4gKlxuICogZW51bSB7XG4gKiAgIGRoZV9kc3MsIGRoZV9yc2EsIGRoX2Fub24sIHJzYSwgZGhfZHNzLCBkaF9yc2FcbiAqIH0gS2V5RXhjaGFuZ2VBbGdvcml0aG07XG4gKlxuICogc3RydWN0IHtcbiAqICAgb3BhcXVlIGRoX3A8MS4uMl4xNi0xPjtcbiAqICAgb3BhcXVlIGRoX2c8MS4uMl4xNi0xPjtcbiAqICAgb3BhcXVlIGRoX1lzPDEuLjJeMTYtMT47XG4gKiB9IFNlcnZlckRIUGFyYW1zO1xuICpcbiAqIHN0cnVjdCB7XG4gKiAgIHNlbGVjdChLZXlFeGNoYW5nZUFsZ29yaXRobSkge1xuICogICAgIGNhc2UgZGhfYW5vbjpcbiAqICAgICAgIFNlcnZlckRIUGFyYW1zIHBhcmFtcztcbiAqICAgICBjYXNlIGRoZV9kc3M6XG4gKiAgICAgY2FzZSBkaGVfcnNhOlxuICogICAgICAgU2VydmVyREhQYXJhbXMgcGFyYW1zO1xuICogICAgICAgZGlnaXRhbGx5LXNpZ25lZCBzdHJ1Y3Qge1xuICogICAgICAgICBvcGFxdWUgY2xpZW50X3JhbmRvbVszMl07XG4gKiAgICAgICAgIG9wYXF1ZSBzZXJ2ZXJfcmFuZG9tWzMyXTtcbiAqICAgICAgICAgU2VydmVyREhQYXJhbXMgcGFyYW1zO1xuICogICAgICAgfSBzaWduZWRfcGFyYW1zO1xuICogICAgIGNhc2UgcnNhOlxuICogICAgIGNhc2UgZGhfZHNzOlxuICogICAgIGNhc2UgZGhfcnNhOlxuICogICAgICAgc3RydWN0IHt9O1xuICogICB9O1xuICogfSBTZXJ2ZXJLZXlFeGNoYW5nZTtcbiAqXG4gKiBAcGFyYW0gYyB0aGUgY29ubmVjdGlvbi5cbiAqIEBwYXJhbSByZWNvcmQgdGhlIHJlY29yZC5cbiAqIEBwYXJhbSBsZW5ndGggdGhlIGxlbmd0aCBvZiB0aGUgaGFuZHNoYWtlIG1lc3NhZ2UuXG4gKi9cbnRscy5oYW5kbGVTZXJ2ZXJLZXlFeGNoYW5nZSA9IGZ1bmN0aW9uKGMsIHJlY29yZCwgbGVuZ3RoKSB7XG4gIC8vIHRoaXMgaW1wbGVtZW50YXRpb24gb25seSBzdXBwb3J0cyBSU0EsIG5vIERpZmZpZS1IZWxsbWFuIHN1cHBvcnRcbiAgLy8gc28gYW55IGxlbmd0aCA+IDAgaXMgaW52YWxpZFxuICBpZihsZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIGMuZXJyb3IoYywge1xuICAgICAgbWVzc2FnZTogJ0ludmFsaWQga2V5IHBhcmFtZXRlcnMuIE9ubHkgUlNBIGlzIHN1cHBvcnRlZC4nLFxuICAgICAgc2VuZDogdHJ1ZSxcbiAgICAgIGFsZXJ0OiB7XG4gICAgICAgIGxldmVsOiB0bHMuQWxlcnQuTGV2ZWwuZmF0YWwsXG4gICAgICAgIGRlc2NyaXB0aW9uOiB0bHMuQWxlcnQuRGVzY3JpcHRpb24udW5zdXBwb3J0ZWRfY2VydGlmaWNhdGVcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8vIGV4cGVjdCBhbiBvcHRpb25hbCBDZXJ0aWZpY2F0ZVJlcXVlc3QgbWVzc2FnZSBuZXh0XG4gIGMuZXhwZWN0ID0gU0NSO1xuXG4gIC8vIGNvbnRpbnVlXG4gIGMucHJvY2VzcygpO1xufTtcblxuLyoqXG4gKiBDYWxsZWQgd2hlbiBhIGNsaWVudCByZWNlaXZlcyBhIENsaWVudEtleUV4Y2hhbmdlIHJlY29yZC5cbiAqXG4gKiBAcGFyYW0gYyB0aGUgY29ubmVjdGlvbi5cbiAqIEBwYXJhbSByZWNvcmQgdGhlIHJlY29yZC5cbiAqIEBwYXJhbSBsZW5ndGggdGhlIGxlbmd0aCBvZiB0aGUgaGFuZHNoYWtlIG1lc3NhZ2UuXG4gKi9cbnRscy5oYW5kbGVDbGllbnRLZXlFeGNoYW5nZSA9IGZ1bmN0aW9uKGMsIHJlY29yZCwgbGVuZ3RoKSB7XG4gIC8vIHRoaXMgaW1wbGVtZW50YXRpb24gb25seSBzdXBwb3J0cyBSU0EsIG5vIERpZmZpZS1IZWxsbWFuIHN1cHBvcnRcbiAgLy8gc28gYW55IGxlbmd0aCA8IDQ4IGlzIGludmFsaWRcbiAgaWYobGVuZ3RoIDwgNDgpIHtcbiAgICByZXR1cm4gYy5lcnJvcihjLCB7XG4gICAgICBtZXNzYWdlOiAnSW52YWxpZCBrZXkgcGFyYW1ldGVycy4gT25seSBSU0EgaXMgc3VwcG9ydGVkLicsXG4gICAgICBzZW5kOiB0cnVlLFxuICAgICAgYWxlcnQ6IHtcbiAgICAgICAgbGV2ZWw6IHRscy5BbGVydC5MZXZlbC5mYXRhbCxcbiAgICAgICAgZGVzY3JpcHRpb246IHRscy5BbGVydC5EZXNjcmlwdGlvbi51bnN1cHBvcnRlZF9jZXJ0aWZpY2F0ZVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgdmFyIGIgPSByZWNvcmQuZnJhZ21lbnQ7XG4gIHZhciBtc2cgPSB7XG4gICAgZW5jX3ByZV9tYXN0ZXJfc2VjcmV0OiByZWFkVmVjdG9yKGIsIDIpLmdldEJ5dGVzKClcbiAgfTtcblxuICAvLyBkbyByc2EgZGVjcnlwdGlvblxuICB2YXIgcHJpdmF0ZUtleSA9IG51bGw7XG4gIGlmKGMuZ2V0UHJpdmF0ZUtleSkge1xuICAgIHRyeSB7XG4gICAgICBwcml2YXRlS2V5ID0gYy5nZXRQcml2YXRlS2V5KGMsIGMuc2Vzc2lvbi5zZXJ2ZXJDZXJ0aWZpY2F0ZSk7XG4gICAgICBwcml2YXRlS2V5ID0gZm9yZ2UucGtpLnByaXZhdGVLZXlGcm9tUGVtKHByaXZhdGVLZXkpO1xuICAgIH0gY2F0Y2goZXgpIHtcbiAgICAgIGMuZXJyb3IoYywge1xuICAgICAgICBtZXNzYWdlOiAnQ291bGQgbm90IGdldCBwcml2YXRlIGtleS4nLFxuICAgICAgICBjYXVzZTogZXgsXG4gICAgICAgIHNlbmQ6IHRydWUsXG4gICAgICAgIGFsZXJ0OiB7XG4gICAgICAgICAgbGV2ZWw6IHRscy5BbGVydC5MZXZlbC5mYXRhbCxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogdGxzLkFsZXJ0LkRlc2NyaXB0aW9uLmludGVybmFsX2Vycm9yXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGlmKHByaXZhdGVLZXkgPT09IG51bGwpIHtcbiAgICByZXR1cm4gYy5lcnJvcihjLCB7XG4gICAgICBtZXNzYWdlOiAnTm8gcHJpdmF0ZSBrZXkgc2V0LicsXG4gICAgICBzZW5kOiB0cnVlLFxuICAgICAgYWxlcnQ6IHtcbiAgICAgICAgbGV2ZWw6IHRscy5BbGVydC5MZXZlbC5mYXRhbCxcbiAgICAgICAgZGVzY3JpcHRpb246IHRscy5BbGVydC5EZXNjcmlwdGlvbi5pbnRlcm5hbF9lcnJvclxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgdHJ5IHtcbiAgICAvLyBkZWNyeXB0IDQ4LWJ5dGUgcHJlLW1hc3RlciBzZWNyZXRcbiAgICB2YXIgc3AgPSBjLnNlc3Npb24uc3A7XG4gICAgc3AucHJlX21hc3Rlcl9zZWNyZXQgPSBwcml2YXRlS2V5LmRlY3J5cHQobXNnLmVuY19wcmVfbWFzdGVyX3NlY3JldCk7XG5cbiAgICAvLyBlbnN1cmUgY2xpZW50IGhlbGxvIHZlcnNpb24gbWF0Y2hlcyBmaXJzdCAyIGJ5dGVzXG4gICAgdmFyIHZlcnNpb24gPSBjLnNlc3Npb24uY2xpZW50SGVsbG9WZXJzaW9uO1xuICAgIGlmKHZlcnNpb24ubWFqb3IgIT09IHNwLnByZV9tYXN0ZXJfc2VjcmV0LmNoYXJDb2RlQXQoMCkgfHxcbiAgICAgIHZlcnNpb24ubWlub3IgIT09IHNwLnByZV9tYXN0ZXJfc2VjcmV0LmNoYXJDb2RlQXQoMSkpIHtcbiAgICAgIC8vIGVycm9yLCBkbyBub3Qgc2VuZCBhbGVydCAoc2VlIEJMRUkgYXR0YWNrIGJlbG93KVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUTFMgdmVyc2lvbiByb2xsYmFjayBhdHRhY2sgZGV0ZWN0ZWQuJyk7XG4gICAgfVxuICB9IGNhdGNoKGV4KSB7XG4gICAgLyogTm90ZTogRGFuaWVsIEJsZWljaGVuYmFjaGVyIFtCTEVJXSBjYW4gYmUgdXNlZCB0byBhdHRhY2sgYVxuICAgICAgVExTIHNlcnZlciB3aGljaCBpcyB1c2luZyBQS0NTIzEgZW5jb2RlZCBSU0EsIHNvIGluc3RlYWQgb2ZcbiAgICAgIGZhaWxpbmcgaGVyZSwgd2UgZ2VuZXJhdGUgNDggcmFuZG9tIGJ5dGVzIGFuZCB1c2UgdGhhdCBhc1xuICAgICAgdGhlIHByZS1tYXN0ZXIgc2VjcmV0LiAqL1xuICAgIHNwLnByZV9tYXN0ZXJfc2VjcmV0ID0gZm9yZ2UucmFuZG9tLmdldEJ5dGVzKDQ4KTtcbiAgfVxuXG4gIC8vIGV4cGVjdCBhIENlcnRpZmljYXRlVmVyaWZ5IG1lc3NhZ2UgaWYgYSBDZXJ0aWZpY2F0ZSB3YXMgcmVjZWl2ZWQgdGhhdFxuICAvLyBkb2VzIG5vdCBoYXZlIGZpeGVkIERpZmZpZS1IZWxsbWFuIHBhcmFtcywgb3RoZXJ3aXNlIGV4cGVjdFxuICAvLyBDaGFuZ2VDaXBoZXJTcGVjXG4gIGMuZXhwZWN0ID0gQ0NDO1xuICBpZihjLnNlc3Npb24uY2xpZW50Q2VydGlmaWNhdGUgIT09IG51bGwpIHtcbiAgICAvLyBvbmx5IFJTQSBzdXBwb3J0LCBzbyBleHBlY3QgQ2VydGlmaWNhdGVWZXJpZnlcbiAgICAvLyBUT0RPOiBzdXBwb3J0IERpZmZpZS1IZWxsbWFuXG4gICAgYy5leHBlY3QgPSBDQ1Y7XG4gIH1cblxuICAvLyBjb250aW51ZVxuICBjLnByb2Nlc3MoKTtcbn07XG5cbi8qKlxuICogQ2FsbGVkIHdoZW4gYSBjbGllbnQgcmVjZWl2ZXMgYSBDZXJ0aWZpY2F0ZVJlcXVlc3QgcmVjb3JkLlxuICpcbiAqIFdoZW4gdGhpcyBtZXNzYWdlIHdpbGwgYmUgc2VudDpcbiAqICAgQSBub24tYW5vbnltb3VzIHNlcnZlciBjYW4gb3B0aW9uYWxseSByZXF1ZXN0IGEgY2VydGlmaWNhdGUgZnJvbSB0aGVcbiAqICAgY2xpZW50LCBpZiBhcHByb3ByaWF0ZSBmb3IgdGhlIHNlbGVjdGVkIGNpcGhlciBzdWl0ZS4gVGhpcyBtZXNzYWdlLCBpZlxuICogICBzZW50LCB3aWxsIGltbWVkaWF0ZWx5IGZvbGxvdyB0aGUgU2VydmVyIEtleSBFeGNoYW5nZSBtZXNzYWdlIChpZiBpdCBpc1xuICogICBzZW50OyBvdGhlcndpc2UsIHRoZSBTZXJ2ZXIgQ2VydGlmaWNhdGUgbWVzc2FnZSkuXG4gKlxuICogZW51bSB7XG4gKiAgIHJzYV9zaWduKDEpLCBkc3Nfc2lnbigyKSwgcnNhX2ZpeGVkX2RoKDMpLCBkc3NfZml4ZWRfZGgoNCksXG4gKiAgIHJzYV9lcGhlbWVyYWxfZGhfUkVTRVJWRUQoNSksIGRzc19lcGhlbWVyYWxfZGhfUkVTRVJWRUQoNiksXG4gKiAgIGZvcnRlenphX2Rtc19SRVNFUlZFRCgyMCksICgyNTUpXG4gKiB9IENsaWVudENlcnRpZmljYXRlVHlwZTtcbiAqXG4gKiBvcGFxdWUgRGlzdGluZ3Vpc2hlZE5hbWU8MS4uMl4xNi0xPjtcbiAqXG4gKiBzdHJ1Y3Qge1xuICogICBDbGllbnRDZXJ0aWZpY2F0ZVR5cGUgY2VydGlmaWNhdGVfdHlwZXM8MS4uMl44LTE+O1xuICogICBTaWduYXR1cmVBbmRIYXNoQWxnb3JpdGhtIHN1cHBvcnRlZF9zaWduYXR1cmVfYWxnb3JpdGhtczwyXjE2LTE+O1xuICogICBEaXN0aW5ndWlzaGVkTmFtZSBjZXJ0aWZpY2F0ZV9hdXRob3JpdGllczwwLi4yXjE2LTE+O1xuICogfSBDZXJ0aWZpY2F0ZVJlcXVlc3Q7XG4gKlxuICogQHBhcmFtIGMgdGhlIGNvbm5lY3Rpb24uXG4gKiBAcGFyYW0gcmVjb3JkIHRoZSByZWNvcmQuXG4gKiBAcGFyYW0gbGVuZ3RoIHRoZSBsZW5ndGggb2YgdGhlIGhhbmRzaGFrZSBtZXNzYWdlLlxuICovXG50bHMuaGFuZGxlQ2VydGlmaWNhdGVSZXF1ZXN0ID0gZnVuY3Rpb24oYywgcmVjb3JkLCBsZW5ndGgpIHtcbiAgLy8gbWluaW11bSBvZiAzIGJ5dGVzIGluIG1lc3NhZ2VcbiAgaWYobGVuZ3RoIDwgMykge1xuICAgIHJldHVybiBjLmVycm9yKGMsIHtcbiAgICAgIG1lc3NhZ2U6ICdJbnZhbGlkIENlcnRpZmljYXRlUmVxdWVzdC4gTWVzc2FnZSB0b28gc2hvcnQuJyxcbiAgICAgIHNlbmQ6IHRydWUsXG4gICAgICBhbGVydDoge1xuICAgICAgICBsZXZlbDogdGxzLkFsZXJ0LkxldmVsLmZhdGFsLFxuICAgICAgICBkZXNjcmlwdGlvbjogdGxzLkFsZXJ0LkRlc2NyaXB0aW9uLmlsbGVnYWxfcGFyYW1ldGVyXG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvLyBUT0RPOiBUTFMgMS4yKyBoYXMgZGlmZmVyZW50IGZvcm1hdCBpbmNsdWRpbmdcbiAgLy8gU2lnbmF0dXJlQW5kSGFzaEFsZ29yaXRobSBhZnRlciBjZXJ0IHR5cGVzXG4gIHZhciBiID0gcmVjb3JkLmZyYWdtZW50O1xuICB2YXIgbXNnID0ge1xuICAgIGNlcnRpZmljYXRlX3R5cGVzOiByZWFkVmVjdG9yKGIsIDEpLFxuICAgIGNlcnRpZmljYXRlX2F1dGhvcml0aWVzOiByZWFkVmVjdG9yKGIsIDIpXG4gIH07XG5cbiAgLy8gc2F2ZSBjZXJ0aWZpY2F0ZSByZXF1ZXN0IGluIHNlc3Npb25cbiAgYy5zZXNzaW9uLmNlcnRpZmljYXRlUmVxdWVzdCA9IG1zZztcblxuICAvLyBleHBlY3QgYSBTZXJ2ZXJIZWxsb0RvbmUgbWVzc2FnZSBuZXh0XG4gIGMuZXhwZWN0ID0gU0hEO1xuXG4gIC8vIGNvbnRpbnVlXG4gIGMucHJvY2VzcygpO1xufTtcblxuLyoqXG4gKiBDYWxsZWQgd2hlbiBhIHNlcnZlciByZWNlaXZlcyBhIENlcnRpZmljYXRlVmVyaWZ5IHJlY29yZC5cbiAqXG4gKiBAcGFyYW0gYyB0aGUgY29ubmVjdGlvbi5cbiAqIEBwYXJhbSByZWNvcmQgdGhlIHJlY29yZC5cbiAqIEBwYXJhbSBsZW5ndGggdGhlIGxlbmd0aCBvZiB0aGUgaGFuZHNoYWtlIG1lc3NhZ2UuXG4gKi9cbnRscy5oYW5kbGVDZXJ0aWZpY2F0ZVZlcmlmeSA9IGZ1bmN0aW9uKGMsIHJlY29yZCwgbGVuZ3RoKSB7XG4gIGlmKGxlbmd0aCA8IDIpIHtcbiAgICByZXR1cm4gYy5lcnJvcihjLCB7XG4gICAgICBtZXNzYWdlOiAnSW52YWxpZCBDZXJ0aWZpY2F0ZVZlcmlmeS4gTWVzc2FnZSB0b28gc2hvcnQuJyxcbiAgICAgIHNlbmQ6IHRydWUsXG4gICAgICBhbGVydDoge1xuICAgICAgICBsZXZlbDogdGxzLkFsZXJ0LkxldmVsLmZhdGFsLFxuICAgICAgICBkZXNjcmlwdGlvbjogdGxzLkFsZXJ0LkRlc2NyaXB0aW9uLmlsbGVnYWxfcGFyYW1ldGVyXG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvLyByZXdpbmQgdG8gZ2V0IGZ1bGwgYnl0ZXMgZm9yIG1lc3NhZ2Ugc28gaXQgY2FuIGJlIG1hbnVhbGx5XG4gIC8vIGRpZ2VzdGVkIGJlbG93IChzcGVjaWFsIGNhc2UgZm9yIENlcnRpZmljYXRlVmVyaWZ5IG1lc3NhZ2VzIGJlY2F1c2VcbiAgLy8gdGhleSBtdXN0IGJlIGRpZ2VzdGVkICphZnRlciogaGFuZGxpbmcgYXMgb3Bwb3NlZCB0byBhbGwgb3RoZXJzKVxuICB2YXIgYiA9IHJlY29yZC5mcmFnbWVudDtcbiAgYi5yZWFkIC09IDQ7XG4gIHZhciBtc2dCeXRlcyA9IGIuYnl0ZXMoKTtcbiAgYi5yZWFkICs9IDQ7XG5cbiAgdmFyIG1zZyA9IHtcbiAgICBzaWduYXR1cmU6IHJlYWRWZWN0b3IoYiwgMikuZ2V0Qnl0ZXMoKVxuICB9O1xuXG4gIC8vIFRPRE86IGFkZCBzdXBwb3J0IGZvciBEU0FcblxuICAvLyBnZW5lcmF0ZSBkYXRhIHRvIHZlcmlmeVxuICB2YXIgdmVyaWZ5ID0gZm9yZ2UudXRpbC5jcmVhdGVCdWZmZXIoKTtcbiAgdmVyaWZ5LnB1dEJ1ZmZlcihjLnNlc3Npb24ubWQ1LmRpZ2VzdCgpKTtcbiAgdmVyaWZ5LnB1dEJ1ZmZlcihjLnNlc3Npb24uc2hhMS5kaWdlc3QoKSk7XG4gIHZlcmlmeSA9IHZlcmlmeS5nZXRCeXRlcygpO1xuXG4gIHRyeSB7XG4gICAgdmFyIGNlcnQgPSBjLnNlc3Npb24uY2xpZW50Q2VydGlmaWNhdGU7XG4gICAgLypiID0gZm9yZ2UucGtpLnJzYS5kZWNyeXB0KFxuICAgICAgbXNnLnNpZ25hdHVyZSwgY2VydC5wdWJsaWNLZXksIHRydWUsIHZlcmlmeS5sZW5ndGgpO1xuICAgIGlmKGIgIT09IHZlcmlmeSkgeyovXG4gICAgaWYoIWNlcnQucHVibGljS2V5LnZlcmlmeSh2ZXJpZnksIG1zZy5zaWduYXR1cmUsICdOT05FJykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2VydGlmaWNhdGVWZXJpZnkgc2lnbmF0dXJlIGRvZXMgbm90IG1hdGNoLicpO1xuICAgIH1cblxuICAgIC8vIGRpZ2VzdCBtZXNzYWdlIG5vdyB0aGF0IGl0IGhhcyBiZWVuIGhhbmRsZWRcbiAgICBjLnNlc3Npb24ubWQ1LnVwZGF0ZShtc2dCeXRlcyk7XG4gICAgYy5zZXNzaW9uLnNoYTEudXBkYXRlKG1zZ0J5dGVzKTtcbiAgfSBjYXRjaChleCkge1xuICAgIHJldHVybiBjLmVycm9yKGMsIHtcbiAgICAgIG1lc3NhZ2U6ICdCYWQgc2lnbmF0dXJlIGluIENlcnRpZmljYXRlVmVyaWZ5LicsXG4gICAgICBzZW5kOiB0cnVlLFxuICAgICAgYWxlcnQ6IHtcbiAgICAgICAgbGV2ZWw6IHRscy5BbGVydC5MZXZlbC5mYXRhbCxcbiAgICAgICAgZGVzY3JpcHRpb246IHRscy5BbGVydC5EZXNjcmlwdGlvbi5oYW5kc2hha2VfZmFpbHVyZVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLy8gZXhwZWN0IENoYW5nZUNpcGhlclNwZWNcbiAgYy5leHBlY3QgPSBDQ0M7XG5cbiAgLy8gY29udGludWVcbiAgYy5wcm9jZXNzKCk7XG59O1xuXG4vKipcbiAqIENhbGxlZCB3aGVuIGEgY2xpZW50IHJlY2VpdmVzIGEgU2VydmVySGVsbG9Eb25lIHJlY29yZC5cbiAqXG4gKiBXaGVuIHRoaXMgbWVzc2FnZSB3aWxsIGJlIHNlbnQ6XG4gKiAgIFRoZSBzZXJ2ZXIgaGVsbG8gZG9uZSBtZXNzYWdlIGlzIHNlbnQgYnkgdGhlIHNlcnZlciB0byBpbmRpY2F0ZSB0aGUgZW5kXG4gKiAgIG9mIHRoZSBzZXJ2ZXIgaGVsbG8gYW5kIGFzc29jaWF0ZWQgbWVzc2FnZXMuIEFmdGVyIHNlbmRpbmcgdGhpcyBtZXNzYWdlXG4gKiAgIHRoZSBzZXJ2ZXIgd2lsbCB3YWl0IGZvciBhIGNsaWVudCByZXNwb25zZS5cbiAqXG4gKiBNZWFuaW5nIG9mIHRoaXMgbWVzc2FnZTpcbiAqICAgVGhpcyBtZXNzYWdlIG1lYW5zIHRoYXQgdGhlIHNlcnZlciBpcyBkb25lIHNlbmRpbmcgbWVzc2FnZXMgdG8gc3VwcG9ydFxuICogICB0aGUga2V5IGV4Y2hhbmdlLCBhbmQgdGhlIGNsaWVudCBjYW4gcHJvY2VlZCB3aXRoIGl0cyBwaGFzZSBvZiB0aGUga2V5XG4gKiAgIGV4Y2hhbmdlLlxuICpcbiAqICAgVXBvbiByZWNlaXB0IG9mIHRoZSBzZXJ2ZXIgaGVsbG8gZG9uZSBtZXNzYWdlIHRoZSBjbGllbnQgc2hvdWxkIHZlcmlmeVxuICogICB0aGF0IHRoZSBzZXJ2ZXIgcHJvdmlkZWQgYSB2YWxpZCBjZXJ0aWZpY2F0ZSBpZiByZXF1aXJlZCBhbmQgY2hlY2sgdGhhdFxuICogICB0aGUgc2VydmVyIGhlbGxvIHBhcmFtZXRlcnMgYXJlIGFjY2VwdGFibGUuXG4gKlxuICogc3RydWN0IHt9IFNlcnZlckhlbGxvRG9uZTtcbiAqXG4gKiBAcGFyYW0gYyB0aGUgY29ubmVjdGlvbi5cbiAqIEBwYXJhbSByZWNvcmQgdGhlIHJlY29yZC5cbiAqIEBwYXJhbSBsZW5ndGggdGhlIGxlbmd0aCBvZiB0aGUgaGFuZHNoYWtlIG1lc3NhZ2UuXG4gKi9cbnRscy5oYW5kbGVTZXJ2ZXJIZWxsb0RvbmUgPSBmdW5jdGlvbihjLCByZWNvcmQsIGxlbmd0aCkge1xuICAvLyBsZW4gbXVzdCBiZSAwIGJ5dGVzXG4gIGlmKGxlbmd0aCA+IDApIHtcbiAgICByZXR1cm4gYy5lcnJvcihjLCB7XG4gICAgICBtZXNzYWdlOiAnSW52YWxpZCBTZXJ2ZXJIZWxsb0RvbmUgbWVzc2FnZS4gSW52YWxpZCBsZW5ndGguJyxcbiAgICAgIHNlbmQ6IHRydWUsXG4gICAgICBhbGVydDoge1xuICAgICAgICBsZXZlbDogdGxzLkFsZXJ0LkxldmVsLmZhdGFsLFxuICAgICAgICBkZXNjcmlwdGlvbjogdGxzLkFsZXJ0LkRlc2NyaXB0aW9uLnJlY29yZF9vdmVyZmxvd1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgaWYoYy5zZXJ2ZXJDZXJ0aWZpY2F0ZSA9PT0gbnVsbCkge1xuICAgIC8vIG5vIHNlcnZlciBjZXJ0aWZpY2F0ZSB3YXMgcHJvdmlkZWRcbiAgICB2YXIgZXJyb3IgPSB7XG4gICAgICBtZXNzYWdlOiAnTm8gc2VydmVyIGNlcnRpZmljYXRlIHByb3ZpZGVkLiBOb3QgZW5vdWdoIHNlY3VyaXR5LicsXG4gICAgICBzZW5kOiB0cnVlLFxuICAgICAgYWxlcnQ6IHtcbiAgICAgICAgbGV2ZWw6IHRscy5BbGVydC5MZXZlbC5mYXRhbCxcbiAgICAgICAgZGVzY3JpcHRpb246IHRscy5BbGVydC5EZXNjcmlwdGlvbi5pbnN1ZmZpY2llbnRfc2VjdXJpdHlcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gY2FsbCBhcHBsaWNhdGlvbiBjYWxsYmFja1xuICAgIHZhciBkZXB0aCA9IDA7XG4gICAgdmFyIHJldCA9IGMudmVyaWZ5KGMsIGVycm9yLmFsZXJ0LmRlc2NyaXB0aW9uLCBkZXB0aCwgW10pO1xuICAgIGlmKHJldCAhPT0gdHJ1ZSkge1xuICAgICAgLy8gY2hlY2sgZm9yIGN1c3RvbSBhbGVydCBpbmZvXG4gICAgICBpZihyZXQgfHwgcmV0ID09PSAwKSB7XG4gICAgICAgIC8vIHNldCBjdXN0b20gbWVzc2FnZSBhbmQgYWxlcnQgZGVzY3JpcHRpb25cbiAgICAgICAgaWYodHlwZW9mIHJldCA9PT0gJ29iamVjdCcgJiYgIWZvcmdlLnV0aWwuaXNBcnJheShyZXQpKSB7XG4gICAgICAgICAgaWYocmV0Lm1lc3NhZ2UpIHtcbiAgICAgICAgICAgIGVycm9yLm1lc3NhZ2UgPSByZXQubWVzc2FnZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYocmV0LmFsZXJ0KSB7XG4gICAgICAgICAgICBlcnJvci5hbGVydC5kZXNjcmlwdGlvbiA9IHJldC5hbGVydDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZih0eXBlb2YgcmV0ID09PSAnbnVtYmVyJykge1xuICAgICAgICAgIC8vIHNldCBjdXN0b20gYWxlcnQgZGVzY3JpcHRpb25cbiAgICAgICAgICBlcnJvci5hbGVydC5kZXNjcmlwdGlvbiA9IHJldDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBzZW5kIGVycm9yXG4gICAgICByZXR1cm4gYy5lcnJvcihjLCBlcnJvcik7XG4gICAgfVxuICB9XG5cbiAgLy8gY3JlYXRlIGNsaWVudCBjZXJ0aWZpY2F0ZSBtZXNzYWdlIGlmIHJlcXVlc3RlZFxuICBpZihjLnNlc3Npb24uY2VydGlmaWNhdGVSZXF1ZXN0ICE9PSBudWxsKSB7XG4gICAgcmVjb3JkID0gdGxzLmNyZWF0ZVJlY29yZChjLCB7XG4gICAgICB0eXBlOiB0bHMuQ29udGVudFR5cGUuaGFuZHNoYWtlLFxuICAgICAgZGF0YTogdGxzLmNyZWF0ZUNlcnRpZmljYXRlKGMpXG4gICAgfSk7XG4gICAgdGxzLnF1ZXVlKGMsIHJlY29yZCk7XG4gIH1cblxuICAvLyBjcmVhdGUgY2xpZW50IGtleSBleGNoYW5nZSBtZXNzYWdlXG4gIHJlY29yZCA9IHRscy5jcmVhdGVSZWNvcmQoYywge1xuICAgICB0eXBlOiB0bHMuQ29udGVudFR5cGUuaGFuZHNoYWtlLFxuICAgICBkYXRhOiB0bHMuY3JlYXRlQ2xpZW50S2V5RXhjaGFuZ2UoYylcbiAgfSk7XG4gIHRscy5xdWV1ZShjLCByZWNvcmQpO1xuXG4gIC8vIGV4cGVjdCBubyBtZXNzYWdlcyB1bnRpbCB0aGUgZm9sbG93aW5nIGNhbGxiYWNrIGhhcyBiZWVuIGNhbGxlZFxuICBjLmV4cGVjdCA9IFNFUjtcblxuICAvLyBjcmVhdGUgY2FsbGJhY2sgdG8gaGFuZGxlIGNsaWVudCBzaWduYXR1cmUgKGZvciBjbGllbnQtY2VydHMpXG4gIHZhciBjYWxsYmFjayA9IGZ1bmN0aW9uKGMsIHNpZ25hdHVyZSkge1xuICAgIGlmKGMuc2Vzc2lvbi5jZXJ0aWZpY2F0ZVJlcXVlc3QgIT09IG51bGwgJiZcbiAgICAgIGMuc2Vzc2lvbi5jbGllbnRDZXJ0aWZpY2F0ZSAhPT0gbnVsbCkge1xuICAgICAgLy8gY3JlYXRlIGNlcnRpZmljYXRlIHZlcmlmeSBtZXNzYWdlXG4gICAgICB0bHMucXVldWUoYywgdGxzLmNyZWF0ZVJlY29yZChjLCB7XG4gICAgICAgIHR5cGU6IHRscy5Db250ZW50VHlwZS5oYW5kc2hha2UsXG4gICAgICAgIGRhdGE6IHRscy5jcmVhdGVDZXJ0aWZpY2F0ZVZlcmlmeShjLCBzaWduYXR1cmUpXG4gICAgICB9KSk7XG4gICAgfVxuXG4gICAgLy8gY3JlYXRlIGNoYW5nZSBjaXBoZXIgc3BlYyBtZXNzYWdlXG4gICAgdGxzLnF1ZXVlKGMsIHRscy5jcmVhdGVSZWNvcmQoYywge1xuICAgICAgdHlwZTogdGxzLkNvbnRlbnRUeXBlLmNoYW5nZV9jaXBoZXJfc3BlYyxcbiAgICAgIGRhdGE6IHRscy5jcmVhdGVDaGFuZ2VDaXBoZXJTcGVjKClcbiAgICB9KSk7XG5cbiAgICAvLyBjcmVhdGUgcGVuZGluZyBzdGF0ZVxuICAgIGMuc3RhdGUucGVuZGluZyA9IHRscy5jcmVhdGVDb25uZWN0aW9uU3RhdGUoYyk7XG5cbiAgICAvLyBjaGFuZ2UgY3VycmVudCB3cml0ZSBzdGF0ZSB0byBwZW5kaW5nIHdyaXRlIHN0YXRlXG4gICAgYy5zdGF0ZS5jdXJyZW50LndyaXRlID0gYy5zdGF0ZS5wZW5kaW5nLndyaXRlO1xuXG4gICAgLy8gY3JlYXRlIGZpbmlzaGVkIG1lc3NhZ2VcbiAgICB0bHMucXVldWUoYywgdGxzLmNyZWF0ZVJlY29yZChjLCB7XG4gICAgICB0eXBlOiB0bHMuQ29udGVudFR5cGUuaGFuZHNoYWtlLFxuICAgICAgZGF0YTogdGxzLmNyZWF0ZUZpbmlzaGVkKGMpXG4gICAgfSkpO1xuXG4gICAgLy8gZXhwZWN0IGEgc2VydmVyIENoYW5nZUNpcGhlclNwZWMgbWVzc2FnZSBuZXh0XG4gICAgYy5leHBlY3QgPSBTQ0M7XG5cbiAgICAvLyBzZW5kIHJlY29yZHNcbiAgICB0bHMuZmx1c2goYyk7XG5cbiAgICAvLyBjb250aW51ZVxuICAgIGMucHJvY2VzcygpO1xuICB9O1xuXG4gIC8vIGlmIHRoZXJlIGlzIG5vIGNlcnRpZmljYXRlIHJlcXVlc3Qgb3Igbm8gY2xpZW50IGNlcnRpZmljYXRlLCBkb1xuICAvLyBjYWxsYmFjayBpbW1lZGlhdGVseVxuICBpZihjLnNlc3Npb24uY2VydGlmaWNhdGVSZXF1ZXN0ID09PSBudWxsIHx8XG4gICAgYy5zZXNzaW9uLmNsaWVudENlcnRpZmljYXRlID09PSBudWxsKSB7XG4gICAgcmV0dXJuIGNhbGxiYWNrKGMsIG51bGwpO1xuICB9XG5cbiAgLy8gb3RoZXJ3aXNlIGdldCB0aGUgY2xpZW50IHNpZ25hdHVyZVxuICB0bHMuZ2V0Q2xpZW50U2lnbmF0dXJlKGMsIGNhbGxiYWNrKTtcbn07XG5cbi8qKlxuICogQ2FsbGVkIHdoZW4gYSBDaGFuZ2VDaXBoZXJTcGVjIHJlY29yZCBpcyByZWNlaXZlZC5cbiAqXG4gKiBAcGFyYW0gYyB0aGUgY29ubmVjdGlvbi5cbiAqIEBwYXJhbSByZWNvcmQgdGhlIHJlY29yZC5cbiAqL1xudGxzLmhhbmRsZUNoYW5nZUNpcGhlclNwZWMgPSBmdW5jdGlvbihjLCByZWNvcmQpIHtcbiAgaWYocmVjb3JkLmZyYWdtZW50LmdldEJ5dGUoKSAhPT0gMHgwMSkge1xuICAgIHJldHVybiBjLmVycm9yKGMsIHtcbiAgICAgIG1lc3NhZ2U6ICdJbnZhbGlkIENoYW5nZUNpcGhlclNwZWMgbWVzc2FnZSByZWNlaXZlZC4nLFxuICAgICAgc2VuZDogdHJ1ZSxcbiAgICAgIGFsZXJ0OiB7XG4gICAgICAgIGxldmVsOiB0bHMuQWxlcnQuTGV2ZWwuZmF0YWwsXG4gICAgICAgIGRlc2NyaXB0aW9uOiB0bHMuQWxlcnQuRGVzY3JpcHRpb24uaWxsZWdhbF9wYXJhbWV0ZXJcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8vIGNyZWF0ZSBwZW5kaW5nIHN0YXRlIGlmOlxuICAvLyAxLiBSZXN1bWluZyBzZXNzaW9uIGluIGNsaWVudCBtb2RlIE9SXG4gIC8vIDIuIE5PVCByZXN1bWluZyBzZXNzaW9uIGluIHNlcnZlciBtb2RlXG4gIHZhciBjbGllbnQgPSAoYy5lbnRpdHkgPT09IHRscy5Db25uZWN0aW9uRW5kLmNsaWVudCk7XG4gIGlmKChjLnNlc3Npb24ucmVzdW1pbmcgJiYgY2xpZW50KSB8fCAoIWMuc2Vzc2lvbi5yZXN1bWluZyAmJiAhY2xpZW50KSkge1xuICAgIGMuc3RhdGUucGVuZGluZyA9IHRscy5jcmVhdGVDb25uZWN0aW9uU3RhdGUoYyk7XG4gIH1cblxuICAvLyBjaGFuZ2UgY3VycmVudCByZWFkIHN0YXRlIHRvIHBlbmRpbmcgcmVhZCBzdGF0ZVxuICBjLnN0YXRlLmN1cnJlbnQucmVhZCA9IGMuc3RhdGUucGVuZGluZy5yZWFkO1xuXG4gIC8vIGNsZWFyIHBlbmRpbmcgc3RhdGUgaWY6XG4gIC8vIDEuIE5PVCByZXN1bWluZyBzZXNzaW9uIGluIGNsaWVudCBtb2RlIE9SXG4gIC8vIDIuIHJlc3VtaW5nIGEgc2Vzc2lvbiBpbiBzZXJ2ZXIgbW9kZVxuICBpZigoIWMuc2Vzc2lvbi5yZXN1bWluZyAmJiBjbGllbnQpIHx8IChjLnNlc3Npb24ucmVzdW1pbmcgJiYgIWNsaWVudCkpIHtcbiAgICBjLnN0YXRlLnBlbmRpbmcgPSBudWxsO1xuICB9XG5cbiAgLy8gZXhwZWN0IGEgRmluaXNoZWQgcmVjb3JkIG5leHRcbiAgYy5leHBlY3QgPSBjbGllbnQgPyBTRkkgOiBDRkk7XG5cbiAgLy8gY29udGludWVcbiAgYy5wcm9jZXNzKCk7XG59O1xuXG4vKipcbiAqIENhbGxlZCB3aGVuIGEgRmluaXNoZWQgcmVjb3JkIGlzIHJlY2VpdmVkLlxuICpcbiAqIFdoZW4gdGhpcyBtZXNzYWdlIHdpbGwgYmUgc2VudDpcbiAqICAgQSBmaW5pc2hlZCBtZXNzYWdlIGlzIGFsd2F5cyBzZW50IGltbWVkaWF0ZWx5IGFmdGVyIGEgY2hhbmdlXG4gKiAgIGNpcGhlciBzcGVjIG1lc3NhZ2UgdG8gdmVyaWZ5IHRoYXQgdGhlIGtleSBleGNoYW5nZSBhbmRcbiAqICAgYXV0aGVudGljYXRpb24gcHJvY2Vzc2VzIHdlcmUgc3VjY2Vzc2Z1bC4gSXQgaXMgZXNzZW50aWFsIHRoYXQgYVxuICogICBjaGFuZ2UgY2lwaGVyIHNwZWMgbWVzc2FnZSBiZSByZWNlaXZlZCBiZXR3ZWVuIHRoZSBvdGhlclxuICogICBoYW5kc2hha2UgbWVzc2FnZXMgYW5kIHRoZSBGaW5pc2hlZCBtZXNzYWdlLlxuICpcbiAqIE1lYW5pbmcgb2YgdGhpcyBtZXNzYWdlOlxuICogICBUaGUgZmluaXNoZWQgbWVzc2FnZSBpcyB0aGUgZmlyc3QgcHJvdGVjdGVkIHdpdGggdGhlIGp1c3QtXG4gKiAgIG5lZ290aWF0ZWQgYWxnb3JpdGhtcywga2V5cywgYW5kIHNlY3JldHMuIFJlY2lwaWVudHMgb2YgZmluaXNoZWRcbiAqICAgbWVzc2FnZXMgbXVzdCB2ZXJpZnkgdGhhdCB0aGUgY29udGVudHMgYXJlIGNvcnJlY3QuICBPbmNlIGEgc2lkZVxuICogICBoYXMgc2VudCBpdHMgRmluaXNoZWQgbWVzc2FnZSBhbmQgcmVjZWl2ZWQgYW5kIHZhbGlkYXRlZCB0aGVcbiAqICAgRmluaXNoZWQgbWVzc2FnZSBmcm9tIGl0cyBwZWVyLCBpdCBtYXkgYmVnaW4gdG8gc2VuZCBhbmQgcmVjZWl2ZVxuICogICBhcHBsaWNhdGlvbiBkYXRhIG92ZXIgdGhlIGNvbm5lY3Rpb24uXG4gKlxuICogc3RydWN0IHtcbiAqICAgb3BhcXVlIHZlcmlmeV9kYXRhW3ZlcmlmeV9kYXRhX2xlbmd0aF07XG4gKiB9IEZpbmlzaGVkO1xuICpcbiAqIHZlcmlmeV9kYXRhXG4gKiAgIFBSRihtYXN0ZXJfc2VjcmV0LCBmaW5pc2hlZF9sYWJlbCwgSGFzaChoYW5kc2hha2VfbWVzc2FnZXMpKVxuICogICAgIFswLi52ZXJpZnlfZGF0YV9sZW5ndGgtMV07XG4gKlxuICogZmluaXNoZWRfbGFiZWxcbiAqICAgRm9yIEZpbmlzaGVkIG1lc3NhZ2VzIHNlbnQgYnkgdGhlIGNsaWVudCwgdGhlIHN0cmluZ1xuICogICBcImNsaWVudCBmaW5pc2hlZFwiLiBGb3IgRmluaXNoZWQgbWVzc2FnZXMgc2VudCBieSB0aGUgc2VydmVyLCB0aGVcbiAqICAgc3RyaW5nIFwic2VydmVyIGZpbmlzaGVkXCIuXG4gKlxuICogdmVyaWZ5X2RhdGFfbGVuZ3RoIGRlcGVuZHMgb24gdGhlIGNpcGhlciBzdWl0ZS4gSWYgaXQgaXMgbm90IHNwZWNpZmllZFxuICogYnkgdGhlIGNpcGhlciBzdWl0ZSwgdGhlbiBpdCBpcyAxMi4gVmVyc2lvbnMgb2YgVExTIDwgMS4yIGFsd2F5cyB1c2VkXG4gKiAxMiBieXRlcy5cbiAqXG4gKiBAcGFyYW0gYyB0aGUgY29ubmVjdGlvbi5cbiAqIEBwYXJhbSByZWNvcmQgdGhlIHJlY29yZC5cbiAqIEBwYXJhbSBsZW5ndGggdGhlIGxlbmd0aCBvZiB0aGUgaGFuZHNoYWtlIG1lc3NhZ2UuXG4gKi9cbnRscy5oYW5kbGVGaW5pc2hlZCA9IGZ1bmN0aW9uKGMsIHJlY29yZCwgbGVuZ3RoKSB7XG4gIC8vIHJld2luZCB0byBnZXQgZnVsbCBieXRlcyBmb3IgbWVzc2FnZSBzbyBpdCBjYW4gYmUgbWFudWFsbHlcbiAgLy8gZGlnZXN0ZWQgYmVsb3cgKHNwZWNpYWwgY2FzZSBmb3IgRmluaXNoZWQgbWVzc2FnZXMgYmVjYXVzZSB0aGV5XG4gIC8vIG11c3QgYmUgZGlnZXN0ZWQgKmFmdGVyKiBoYW5kbGluZyBhcyBvcHBvc2VkIHRvIGFsbCBvdGhlcnMpXG4gIHZhciBiID0gcmVjb3JkLmZyYWdtZW50O1xuICBiLnJlYWQgLT0gNDtcbiAgdmFyIG1zZ0J5dGVzID0gYi5ieXRlcygpO1xuICBiLnJlYWQgKz0gNDtcblxuICAvLyBtZXNzYWdlIGNvbnRhaW5zIG9ubHkgdmVyaWZ5X2RhdGFcbiAgdmFyIHZkID0gcmVjb3JkLmZyYWdtZW50LmdldEJ5dGVzKCk7XG5cbiAgLy8gZW5zdXJlIHZlcmlmeSBkYXRhIGlzIGNvcnJlY3RcbiAgYiA9IGZvcmdlLnV0aWwuY3JlYXRlQnVmZmVyKCk7XG4gIGIucHV0QnVmZmVyKGMuc2Vzc2lvbi5tZDUuZGlnZXN0KCkpO1xuICBiLnB1dEJ1ZmZlcihjLnNlc3Npb24uc2hhMS5kaWdlc3QoKSk7XG5cbiAgLy8gc2V0IGxhYmVsIGJhc2VkIG9uIGVudGl0eSB0eXBlXG4gIHZhciBjbGllbnQgPSAoYy5lbnRpdHkgPT09IHRscy5Db25uZWN0aW9uRW5kLmNsaWVudCk7XG4gIHZhciBsYWJlbCA9IGNsaWVudCA/ICdzZXJ2ZXIgZmluaXNoZWQnIDogJ2NsaWVudCBmaW5pc2hlZCc7XG5cbiAgLy8gVE9ETzogZGV0ZXJtaW5lIHByZiBmdW5jdGlvbiBhbmQgdmVyaWZ5IGxlbmd0aCBmb3IgVExTIDEuMlxuICB2YXIgc3AgPSBjLnNlc3Npb24uc3A7XG4gIHZhciB2ZGwgPSAxMjtcbiAgdmFyIHByZiA9IHByZl9UTFMxO1xuICBiID0gcHJmKHNwLm1hc3Rlcl9zZWNyZXQsIGxhYmVsLCBiLmdldEJ5dGVzKCksIHZkbCk7XG4gIGlmKGIuZ2V0Qnl0ZXMoKSAhPT0gdmQpIHtcbiAgICByZXR1cm4gYy5lcnJvcihjLCB7XG4gICAgICBtZXNzYWdlOiAnSW52YWxpZCB2ZXJpZnlfZGF0YSBpbiBGaW5pc2hlZCBtZXNzYWdlLicsXG4gICAgICBzZW5kOiB0cnVlLFxuICAgICAgYWxlcnQ6IHtcbiAgICAgICAgbGV2ZWw6IHRscy5BbGVydC5MZXZlbC5mYXRhbCxcbiAgICAgICAgZGVzY3JpcHRpb246IHRscy5BbGVydC5EZXNjcmlwdGlvbi5kZWNyeXB0X2Vycm9yXG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvLyBkaWdlc3QgZmluaXNoZWQgbWVzc2FnZSBub3cgdGhhdCBpdCBoYXMgYmVlbiBoYW5kbGVkXG4gIGMuc2Vzc2lvbi5tZDUudXBkYXRlKG1zZ0J5dGVzKTtcbiAgYy5zZXNzaW9uLnNoYTEudXBkYXRlKG1zZ0J5dGVzKTtcblxuICAvLyByZXN1bWluZyBzZXNzaW9uIGFzIGNsaWVudCBvciBOT1QgcmVzdW1pbmcgc2Vzc2lvbiBhcyBzZXJ2ZXJcbiAgaWYoKGMuc2Vzc2lvbi5yZXN1bWluZyAmJiBjbGllbnQpIHx8ICghYy5zZXNzaW9uLnJlc3VtaW5nICYmICFjbGllbnQpKSB7XG4gICAgLy8gY3JlYXRlIGNoYW5nZSBjaXBoZXIgc3BlYyBtZXNzYWdlXG4gICAgdGxzLnF1ZXVlKGMsIHRscy5jcmVhdGVSZWNvcmQoYywge1xuICAgICAgdHlwZTogdGxzLkNvbnRlbnRUeXBlLmNoYW5nZV9jaXBoZXJfc3BlYyxcbiAgICAgIGRhdGE6IHRscy5jcmVhdGVDaGFuZ2VDaXBoZXJTcGVjKClcbiAgICB9KSk7XG5cbiAgICAvLyBjaGFuZ2UgY3VycmVudCB3cml0ZSBzdGF0ZSB0byBwZW5kaW5nIHdyaXRlIHN0YXRlLCBjbGVhciBwZW5kaW5nXG4gICAgYy5zdGF0ZS5jdXJyZW50LndyaXRlID0gYy5zdGF0ZS5wZW5kaW5nLndyaXRlO1xuICAgIGMuc3RhdGUucGVuZGluZyA9IG51bGw7XG5cbiAgICAvLyBjcmVhdGUgZmluaXNoZWQgbWVzc2FnZVxuICAgIHRscy5xdWV1ZShjLCB0bHMuY3JlYXRlUmVjb3JkKGMsIHtcbiAgICAgIHR5cGU6IHRscy5Db250ZW50VHlwZS5oYW5kc2hha2UsXG4gICAgICBkYXRhOiB0bHMuY3JlYXRlRmluaXNoZWQoYylcbiAgICB9KSk7XG4gIH1cblxuICAvLyBleHBlY3QgYXBwbGljYXRpb24gZGF0YSBuZXh0XG4gIGMuZXhwZWN0ID0gY2xpZW50ID8gU0FEIDogQ0FEO1xuXG4gIC8vIGhhbmRzaGFrZSBjb21wbGV0ZVxuICBjLmhhbmRzaGFraW5nID0gZmFsc2U7XG4gICsrYy5oYW5kc2hha2VzO1xuXG4gIC8vIHNhdmUgYWNjZXNzIHRvIHBlZXIgY2VydGlmaWNhdGVcbiAgYy5wZWVyQ2VydGlmaWNhdGUgPSBjbGllbnQgP1xuICAgIGMuc2Vzc2lvbi5zZXJ2ZXJDZXJ0aWZpY2F0ZSA6IGMuc2Vzc2lvbi5jbGllbnRDZXJ0aWZpY2F0ZTtcblxuICAvLyBzZW5kIHJlY29yZHNcbiAgdGxzLmZsdXNoKGMpO1xuXG4gIC8vIG5vdyBjb25uZWN0ZWRcbiAgYy5pc0Nvbm5lY3RlZCA9IHRydWU7XG4gIGMuY29ubmVjdGVkKGMpO1xuXG4gIC8vIGNvbnRpbnVlXG4gIGMucHJvY2VzcygpO1xufTtcblxuLyoqXG4gKiBDYWxsZWQgd2hlbiBhbiBBbGVydCByZWNvcmQgaXMgcmVjZWl2ZWQuXG4gKlxuICogQHBhcmFtIGMgdGhlIGNvbm5lY3Rpb24uXG4gKiBAcGFyYW0gcmVjb3JkIHRoZSByZWNvcmQuXG4gKi9cbnRscy5oYW5kbGVBbGVydCA9IGZ1bmN0aW9uKGMsIHJlY29yZCkge1xuICAvLyByZWFkIGFsZXJ0XG4gIHZhciBiID0gcmVjb3JkLmZyYWdtZW50O1xuICB2YXIgYWxlcnQgPSB7XG4gICAgbGV2ZWw6IGIuZ2V0Qnl0ZSgpLFxuICAgIGRlc2NyaXB0aW9uOiBiLmdldEJ5dGUoKVxuICB9O1xuXG4gIC8vIFRPRE86IGNvbnNpZGVyIHVzaW5nIGEgdGFibGU/XG4gIC8vIGdldCBhcHByb3ByaWF0ZSBtZXNzYWdlXG4gIHZhciBtc2c7XG4gIHN3aXRjaChhbGVydC5kZXNjcmlwdGlvbikge1xuICBjYXNlIHRscy5BbGVydC5EZXNjcmlwdGlvbi5jbG9zZV9ub3RpZnk6XG4gICAgbXNnID0gJ0Nvbm5lY3Rpb24gY2xvc2VkLic7XG4gICAgYnJlYWs7XG4gIGNhc2UgdGxzLkFsZXJ0LkRlc2NyaXB0aW9uLnVuZXhwZWN0ZWRfbWVzc2FnZTpcbiAgICBtc2cgPSAnVW5leHBlY3RlZCBtZXNzYWdlLic7XG4gICAgYnJlYWs7XG4gIGNhc2UgdGxzLkFsZXJ0LkRlc2NyaXB0aW9uLmJhZF9yZWNvcmRfbWFjOlxuICAgIG1zZyA9ICdCYWQgcmVjb3JkIE1BQy4nO1xuICAgIGJyZWFrO1xuICBjYXNlIHRscy5BbGVydC5EZXNjcmlwdGlvbi5kZWNyeXB0aW9uX2ZhaWxlZDpcbiAgICBtc2cgPSAnRGVjcnlwdGlvbiBmYWlsZWQuJztcbiAgICBicmVhaztcbiAgY2FzZSB0bHMuQWxlcnQuRGVzY3JpcHRpb24ucmVjb3JkX292ZXJmbG93OlxuICAgIG1zZyA9ICdSZWNvcmQgb3ZlcmZsb3cuJztcbiAgICBicmVhaztcbiAgY2FzZSB0bHMuQWxlcnQuRGVzY3JpcHRpb24uZGVjb21wcmVzc2lvbl9mYWlsdXJlOlxuICAgIG1zZyA9ICdEZWNvbXByZXNzaW9uIGZhaWxlZC4nO1xuICAgIGJyZWFrO1xuICBjYXNlIHRscy5BbGVydC5EZXNjcmlwdGlvbi5oYW5kc2hha2VfZmFpbHVyZTpcbiAgICBtc2cgPSAnSGFuZHNoYWtlIGZhaWx1cmUuJztcbiAgICBicmVhaztcbiAgY2FzZSB0bHMuQWxlcnQuRGVzY3JpcHRpb24uYmFkX2NlcnRpZmljYXRlOlxuICAgIG1zZyA9ICdCYWQgY2VydGlmaWNhdGUuJztcbiAgICBicmVhaztcbiAgY2FzZSB0bHMuQWxlcnQuRGVzY3JpcHRpb24udW5zdXBwb3J0ZWRfY2VydGlmaWNhdGU6XG4gICAgbXNnID0gJ1Vuc3VwcG9ydGVkIGNlcnRpZmljYXRlLic7XG4gICAgYnJlYWs7XG4gIGNhc2UgdGxzLkFsZXJ0LkRlc2NyaXB0aW9uLmNlcnRpZmljYXRlX3Jldm9rZWQ6XG4gICAgbXNnID0gJ0NlcnRpZmljYXRlIHJldm9rZWQuJztcbiAgICBicmVhaztcbiAgY2FzZSB0bHMuQWxlcnQuRGVzY3JpcHRpb24uY2VydGlmaWNhdGVfZXhwaXJlZDpcbiAgICBtc2cgPSAnQ2VydGlmaWNhdGUgZXhwaXJlZC4nO1xuICAgIGJyZWFrO1xuICBjYXNlIHRscy5BbGVydC5EZXNjcmlwdGlvbi5jZXJ0aWZpY2F0ZV91bmtub3duOlxuICAgIG1zZyA9ICdDZXJ0aWZpY2F0ZSB1bmtub3duLic7XG4gICAgYnJlYWs7XG4gIGNhc2UgdGxzLkFsZXJ0LkRlc2NyaXB0aW9uLmlsbGVnYWxfcGFyYW1ldGVyOlxuICAgIG1zZyA9ICdJbGxlZ2FsIHBhcmFtZXRlci4nO1xuICAgIGJyZWFrO1xuICBjYXNlIHRscy5BbGVydC5EZXNjcmlwdGlvbi51bmtub3duX2NhOlxuICAgIG1zZyA9ICdVbmtub3duIGNlcnRpZmljYXRlIGF1dGhvcml0eS4nO1xuICAgIGJyZWFrO1xuICBjYXNlIHRscy5BbGVydC5EZXNjcmlwdGlvbi5hY2Nlc3NfZGVuaWVkOlxuICAgIG1zZyA9ICdBY2Nlc3MgZGVuaWVkLic7XG4gICAgYnJlYWs7XG4gIGNhc2UgdGxzLkFsZXJ0LkRlc2NyaXB0aW9uLmRlY29kZV9lcnJvcjpcbiAgICBtc2cgPSAnRGVjb2RlIGVycm9yLic7XG4gICAgYnJlYWs7XG4gIGNhc2UgdGxzLkFsZXJ0LkRlc2NyaXB0aW9uLmRlY3J5cHRfZXJyb3I6XG4gICAgbXNnID0gJ0RlY3J5cHQgZXJyb3IuJztcbiAgICBicmVhaztcbiAgY2FzZSB0bHMuQWxlcnQuRGVzY3JpcHRpb24uZXhwb3J0X3Jlc3RyaWN0aW9uOlxuICAgIG1zZyA9ICdFeHBvcnQgcmVzdHJpY3Rpb24uJztcbiAgICBicmVhaztcbiAgY2FzZSB0bHMuQWxlcnQuRGVzY3JpcHRpb24ucHJvdG9jb2xfdmVyc2lvbjpcbiAgICBtc2cgPSAnVW5zdXBwb3J0ZWQgcHJvdG9jb2wgdmVyc2lvbi4nO1xuICAgIGJyZWFrO1xuICBjYXNlIHRscy5BbGVydC5EZXNjcmlwdGlvbi5pbnN1ZmZpY2llbnRfc2VjdXJpdHk6XG4gICAgbXNnID0gJ0luc3VmZmljaWVudCBzZWN1cml0eS4nO1xuICAgIGJyZWFrO1xuICBjYXNlIHRscy5BbGVydC5EZXNjcmlwdGlvbi5pbnRlcm5hbF9lcnJvcjpcbiAgICBtc2cgPSAnSW50ZXJuYWwgZXJyb3IuJztcbiAgICBicmVhaztcbiAgY2FzZSB0bHMuQWxlcnQuRGVzY3JpcHRpb24udXNlcl9jYW5jZWxlZDpcbiAgICBtc2cgPSAnVXNlciBjYW5jZWxlZC4nO1xuICAgIGJyZWFrO1xuICBjYXNlIHRscy5BbGVydC5EZXNjcmlwdGlvbi5ub19yZW5lZ290aWF0aW9uOlxuICAgIG1zZyA9ICdSZW5lZ290aWF0aW9uIG5vdCBzdXBwb3J0ZWQuJztcbiAgICBicmVhaztcbiAgZGVmYXVsdDpcbiAgICBtc2cgPSAnVW5rbm93biBlcnJvci4nO1xuICAgIGJyZWFrO1xuICB9XG5cbiAgLy8gY2xvc2UgY29ubmVjdGlvbiBvbiBjbG9zZV9ub3RpZnksIG5vdCBhbiBlcnJvclxuICBpZihhbGVydC5kZXNjcmlwdGlvbiA9PT0gdGxzLkFsZXJ0LkRlc2NyaXB0aW9uLmNsb3NlX25vdGlmeSkge1xuICAgIHJldHVybiBjLmNsb3NlKCk7XG4gIH1cblxuICAvLyBjYWxsIGVycm9yIGhhbmRsZXJcbiAgYy5lcnJvcihjLCB7XG4gICAgbWVzc2FnZTogbXNnLFxuICAgIHNlbmQ6IGZhbHNlLFxuICAgIC8vIG9yaWdpbiBpcyB0aGUgb3Bwb3NpdGUgZW5kXG4gICAgb3JpZ2luOiAoYy5lbnRpdHkgPT09IHRscy5Db25uZWN0aW9uRW5kLmNsaWVudCkgPyAnc2VydmVyJyA6ICdjbGllbnQnLFxuICAgIGFsZXJ0OiBhbGVydFxuICB9KTtcblxuICAvLyBjb250aW51ZVxuICBjLnByb2Nlc3MoKTtcbn07XG5cbi8qKlxuICogQ2FsbGVkIHdoZW4gYSBIYW5kc2hha2UgcmVjb3JkIGlzIHJlY2VpdmVkLlxuICpcbiAqIEBwYXJhbSBjIHRoZSBjb25uZWN0aW9uLlxuICogQHBhcmFtIHJlY29yZCB0aGUgcmVjb3JkLlxuICovXG50bHMuaGFuZGxlSGFuZHNoYWtlID0gZnVuY3Rpb24oYywgcmVjb3JkKSB7XG4gIC8vIGdldCB0aGUgaGFuZHNoYWtlIHR5cGUgYW5kIG1lc3NhZ2UgbGVuZ3RoXG4gIHZhciBiID0gcmVjb3JkLmZyYWdtZW50O1xuICB2YXIgdHlwZSA9IGIuZ2V0Qnl0ZSgpO1xuICB2YXIgbGVuZ3RoID0gYi5nZXRJbnQyNCgpO1xuXG4gIC8vIHNlZSBpZiB0aGUgcmVjb3JkIGZyYWdtZW50IGRvZXNuJ3QgeWV0IGNvbnRhaW4gdGhlIGZ1bGwgbWVzc2FnZVxuICBpZihsZW5ndGggPiBiLmxlbmd0aCgpKSB7XG4gICAgLy8gY2FjaGUgdGhlIHJlY29yZCwgY2xlYXIgaXRzIGZyYWdtZW50LCBhbmQgcmVzZXQgdGhlIGJ1ZmZlciByZWFkXG4gICAgLy8gcG9pbnRlciBiZWZvcmUgdGhlIHR5cGUgYW5kIGxlbmd0aCB3ZXJlIHJlYWRcbiAgICBjLmZyYWdtZW50ZWQgPSByZWNvcmQ7XG4gICAgcmVjb3JkLmZyYWdtZW50ID0gZm9yZ2UudXRpbC5jcmVhdGVCdWZmZXIoKTtcbiAgICBiLnJlYWQgLT0gNDtcblxuICAgIC8vIGNvbnRpbnVlXG4gICAgcmV0dXJuIGMucHJvY2VzcygpO1xuICB9XG5cbiAgLy8gZnVsbCBtZXNzYWdlIG5vdyBhdmFpbGFibGUsIGNsZWFyIGNhY2hlLCByZXNldCByZWFkIHBvaW50ZXIgdG9cbiAgLy8gYmVmb3JlIHR5cGUgYW5kIGxlbmd0aFxuICBjLmZyYWdtZW50ZWQgPSBudWxsO1xuICBiLnJlYWQgLT0gNDtcblxuICAvLyBzYXZlIHRoZSBoYW5kc2hha2UgYnl0ZXMgZm9yIGRpZ2VzdGlvbiBhZnRlciBoYW5kbGVyIGlzIGZvdW5kXG4gIC8vIChpbmNsdWRlIHR5cGUgYW5kIGxlbmd0aCBvZiBoYW5kc2hha2UgbXNnKVxuICB2YXIgYnl0ZXMgPSBiLmJ5dGVzKGxlbmd0aCArIDQpO1xuXG4gIC8vIHJlc3RvcmUgcmVhZCBwb2ludGVyXG4gIGIucmVhZCArPSA0O1xuXG4gIC8vIGhhbmRsZSBleHBlY3RlZCBtZXNzYWdlXG4gIGlmKHR5cGUgaW4gaHNUYWJsZVtjLmVudGl0eV1bYy5leHBlY3RdKSB7XG4gICAgLy8gaW5pdGlhbGl6ZSBzZXJ2ZXIgc2Vzc2lvblxuICAgIGlmKGMuZW50aXR5ID09PSB0bHMuQ29ubmVjdGlvbkVuZC5zZXJ2ZXIgJiYgIWMub3BlbiAmJiAhYy5mYWlsKSB7XG4gICAgICBjLmhhbmRzaGFraW5nID0gdHJ1ZTtcbiAgICAgIGMuc2Vzc2lvbiA9IHtcbiAgICAgICAgdmVyc2lvbjogbnVsbCxcbiAgICAgICAgZXh0ZW5zaW9uczoge1xuICAgICAgICAgIHNlcnZlcl9uYW1lOiB7XG4gICAgICAgICAgICBzZXJ2ZXJOYW1lTGlzdDogW11cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGNpcGhlclN1aXRlOiBudWxsLFxuICAgICAgICBjb21wcmVzc2lvbk1ldGhvZDogbnVsbCxcbiAgICAgICAgc2VydmVyQ2VydGlmaWNhdGU6IG51bGwsXG4gICAgICAgIGNsaWVudENlcnRpZmljYXRlOiBudWxsLFxuICAgICAgICBtZDU6IGZvcmdlLm1kLm1kNS5jcmVhdGUoKSxcbiAgICAgICAgc2hhMTogZm9yZ2UubWQuc2hhMS5jcmVhdGUoKVxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKiBVcGRhdGUgaGFuZHNoYWtlIG1lc3NhZ2VzIGRpZ2VzdC4gRmluaXNoZWQgYW5kIENlcnRpZmljYXRlVmVyaWZ5XG4gICAgICBtZXNzYWdlcyBhcmUgbm90IGRpZ2VzdGVkIGhlcmUuIFRoZXkgY2FuJ3QgYmUgZGlnZXN0ZWQgYXMgcGFydCBvZlxuICAgICAgdGhlIHZlcmlmeV9kYXRhIHRoYXQgdGhleSBjb250YWluLiBUaGVzZSBtZXNzYWdlcyBhcmUgbWFudWFsbHlcbiAgICAgIGRpZ2VzdGVkIGluIHRoZWlyIGhhbmRsZXJzLiBIZWxsb1JlcXVlc3QgbWVzc2FnZXMgYXJlIHNpbXBseSBuZXZlclxuICAgICAgaW5jbHVkZWQgaW4gdGhlIGhhbmRzaGFrZSBtZXNzYWdlIGRpZ2VzdCBhY2NvcmRpbmcgdG8gc3BlYy4gKi9cbiAgICBpZih0eXBlICE9PSB0bHMuSGFuZHNoYWtlVHlwZS5oZWxsb19yZXF1ZXN0ICYmXG4gICAgICB0eXBlICE9PSB0bHMuSGFuZHNoYWtlVHlwZS5jZXJ0aWZpY2F0ZV92ZXJpZnkgJiZcbiAgICAgIHR5cGUgIT09IHRscy5IYW5kc2hha2VUeXBlLmZpbmlzaGVkKSB7XG4gICAgICBjLnNlc3Npb24ubWQ1LnVwZGF0ZShieXRlcyk7XG4gICAgICBjLnNlc3Npb24uc2hhMS51cGRhdGUoYnl0ZXMpO1xuICAgIH1cblxuICAgIC8vIGhhbmRsZSBzcGVjaWZpYyBoYW5kc2hha2UgdHlwZSByZWNvcmRcbiAgICBoc1RhYmxlW2MuZW50aXR5XVtjLmV4cGVjdF1bdHlwZV0oYywgcmVjb3JkLCBsZW5ndGgpO1xuICB9IGVsc2Uge1xuICAgIC8vIHVuZXhwZWN0ZWQgcmVjb3JkXG4gICAgdGxzLmhhbmRsZVVuZXhwZWN0ZWQoYywgcmVjb3JkKTtcbiAgfVxufTtcblxuLyoqXG4gKiBDYWxsZWQgd2hlbiBhbiBBcHBsaWNhdGlvbkRhdGEgcmVjb3JkIGlzIHJlY2VpdmVkLlxuICpcbiAqIEBwYXJhbSBjIHRoZSBjb25uZWN0aW9uLlxuICogQHBhcmFtIHJlY29yZCB0aGUgcmVjb3JkLlxuICovXG50bHMuaGFuZGxlQXBwbGljYXRpb25EYXRhID0gZnVuY3Rpb24oYywgcmVjb3JkKSB7XG4gIC8vIGJ1ZmZlciBkYXRhLCBub3RpZnkgdGhhdCBpdHMgcmVhZHlcbiAgYy5kYXRhLnB1dEJ1ZmZlcihyZWNvcmQuZnJhZ21lbnQpO1xuICBjLmRhdGFSZWFkeShjKTtcblxuICAvLyBjb250aW51ZVxuICBjLnByb2Nlc3MoKTtcbn07XG5cbi8qKlxuICogQ2FsbGVkIHdoZW4gYSBIZWFydGJlYXQgcmVjb3JkIGlzIHJlY2VpdmVkLlxuICpcbiAqIEBwYXJhbSBjIHRoZSBjb25uZWN0aW9uLlxuICogQHBhcmFtIHJlY29yZCB0aGUgcmVjb3JkLlxuICovXG50bHMuaGFuZGxlSGVhcnRiZWF0ID0gZnVuY3Rpb24oYywgcmVjb3JkKSB7XG4gIC8vIGdldCB0aGUgaGVhcnRiZWF0IHR5cGUgYW5kIHBheWxvYWRcbiAgdmFyIGIgPSByZWNvcmQuZnJhZ21lbnQ7XG4gIHZhciB0eXBlID0gYi5nZXRCeXRlKCk7XG4gIHZhciBsZW5ndGggPSBiLmdldEludDE2KCk7XG4gIHZhciBwYXlsb2FkID0gYi5nZXRCeXRlcyhsZW5ndGgpO1xuXG4gIGlmKHR5cGUgPT09IHRscy5IZWFydGJlYXRNZXNzYWdlVHlwZS5oZWFydGJlYXRfcmVxdWVzdCkge1xuICAgIC8vIGRpc2NhcmQgcmVxdWVzdCBkdXJpbmcgaGFuZHNoYWtlIG9yIGlmIGxlbmd0aCBpcyB0b28gbGFyZ2VcbiAgICBpZihjLmhhbmRzaGFraW5nIHx8IGxlbmd0aCA+IHBheWxvYWQubGVuZ3RoKSB7XG4gICAgICAvLyBjb250aW51ZVxuICAgICAgcmV0dXJuIGMucHJvY2VzcygpO1xuICAgIH1cbiAgICAvLyByZXRyYW5zbWl0IHBheWxvYWRcbiAgICB0bHMucXVldWUoYywgdGxzLmNyZWF0ZVJlY29yZChjLCB7XG4gICAgICB0eXBlOiB0bHMuQ29udGVudFR5cGUuaGVhcnRiZWF0LFxuICAgICAgZGF0YTogdGxzLmNyZWF0ZUhlYXJ0YmVhdChcbiAgICAgICAgdGxzLkhlYXJ0YmVhdE1lc3NhZ2VUeXBlLmhlYXJ0YmVhdF9yZXNwb25zZSwgcGF5bG9hZClcbiAgICB9KSk7XG4gICAgdGxzLmZsdXNoKGMpO1xuICB9IGVsc2UgaWYodHlwZSA9PT0gdGxzLkhlYXJ0YmVhdE1lc3NhZ2VUeXBlLmhlYXJ0YmVhdF9yZXNwb25zZSkge1xuICAgIC8vIGNoZWNrIHBheWxvYWQgYWdhaW5zdCBleHBlY3RlZCBwYXlsb2FkLCBkaXNjYXJkIGhlYXJ0YmVhdCBpZiBubyBtYXRjaFxuICAgIGlmKHBheWxvYWQgIT09IGMuZXhwZWN0ZWRIZWFydGJlYXRQYXlsb2FkKSB7XG4gICAgICAvLyBjb250aW51ZVxuICAgICAgcmV0dXJuIGMucHJvY2VzcygpO1xuICAgIH1cblxuICAgIC8vIG5vdGlmeSB0aGF0IGEgdmFsaWQgaGVhcnRiZWF0IHdhcyByZWNlaXZlZFxuICAgIGlmKGMuaGVhcnRiZWF0UmVjZWl2ZWQpIHtcbiAgICAgIGMuaGVhcnRiZWF0UmVjZWl2ZWQoYywgZm9yZ2UudXRpbC5jcmVhdGVCdWZmZXIocGF5bG9hZCkpO1xuICAgIH1cbiAgfVxuXG4gIC8vIGNvbnRpbnVlXG4gIGMucHJvY2VzcygpO1xufTtcblxuLyoqXG4gKiBUaGUgdHJhbnNpc3Rpb25hbCBzdGF0ZSB0YWJsZXMgZm9yIHJlY2VpdmluZyBUTFMgcmVjb3Jkcy4gSXQgbWFwcyB0aGVcbiAqIGN1cnJlbnQgVExTIGVuZ2luZSBzdGF0ZSBhbmQgYSByZWNlaXZlZCByZWNvcmQgdG8gYSBmdW5jdGlvbiB0byBoYW5kbGUgdGhlXG4gKiByZWNvcmQgYW5kIHVwZGF0ZSB0aGUgc3RhdGUuXG4gKlxuICogRm9yIGluc3RhbmNlLCBpZiB0aGUgY3VycmVudCBzdGF0ZSBpcyBTSEUsIHRoZW4gdGhlIFRMUyBlbmdpbmUgaXMgZXhwZWN0aW5nXG4gKiBhIFNlcnZlckhlbGxvIHJlY29yZC4gT25jZSBhIHJlY29yZCBpcyByZWNlaXZlZCwgdGhlIGhhbmRsZXIgZnVuY3Rpb24gaXNcbiAqIGxvb2tlZCB1cCB1c2luZyB0aGUgc3RhdGUgU0hFIGFuZCB0aGUgcmVjb3JkJ3MgY29udGVudCB0eXBlLlxuICpcbiAqIFRoZSByZXN1bHRpbmcgZnVuY3Rpb24gd2lsbCBlaXRoZXIgYmUgYW4gZXJyb3IgaGFuZGxlciBvciBhIHJlY29yZCBoYW5kbGVyLlxuICogVGhlIGZ1bmN0aW9uIHdpbGwgdGFrZSB3aGF0ZXZlciBhY3Rpb24gaXMgYXBwcm9wcmlhdGUgYW5kIHVwZGF0ZSB0aGUgc3RhdGVcbiAqIGZvciB0aGUgbmV4dCByZWNvcmQuXG4gKlxuICogVGhlIHN0YXRlcyBhcmUgYWxsIGJhc2VkIG9uIHBvc3NpYmxlIHNlcnZlciByZWNvcmQgdHlwZXMuIE5vdGUgdGhhdCB0aGVcbiAqIGNsaWVudCB3aWxsIG5ldmVyIHNwZWNpZmljYWxseSBleHBlY3QgdG8gcmVjZWl2ZSBhIEhlbGxvUmVxdWVzdCBvciBhbiBhbGVydFxuICogZnJvbSB0aGUgc2VydmVyIHNvIHRoZXJlIGlzIG5vIHN0YXRlIHRoYXQgcmVmbGVjdHMgdGhpcy4gVGhlc2UgbWVzc2FnZXMgbWF5XG4gKiBvY2N1ciBhdCBhbnkgdGltZS5cbiAqXG4gKiBUaGVyZSBhcmUgdHdvIHRhYmxlcyBmb3IgbWFwcGluZyBzdGF0ZXMgYmVjYXVzZSB0aGVyZSBpcyBhIHNlY29uZCB0aWVyIG9mXG4gKiB0eXBlcyBmb3IgaGFuZHNoYWtlIG1lc3NhZ2VzLiBPbmNlIGEgcmVjb3JkIHdpdGggYSBjb250ZW50IHR5cGUgb2YgaGFuZHNoYWtlXG4gKiBpcyByZWNlaXZlZCwgdGhlIGhhbmRzaGFrZSByZWNvcmQgaGFuZGxlciB3aWxsIGxvb2sgdXAgdGhlIGhhbmRzaGFrZSB0eXBlIGluXG4gKiB0aGUgc2Vjb25kYXJ5IG1hcCB0byBnZXQgaXRzIGFwcHJvcHJpYXRlIGhhbmRsZXIuXG4gKlxuICogVmFsaWQgbWVzc2FnZSBvcmRlcnMgYXJlIGFzIGZvbGxvd3M6XG4gKlxuICogPT09PT09PT09PT09PT09PT09PT09PT1GVUxMIEhBTkRTSEFLRT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENsaWVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VydmVyXG4gKlxuICogQ2xpZW50SGVsbG8gICAgICAgICAgICAgICAgICAtLS0tLS0tLT5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZlckhlbGxvXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENlcnRpZmljYXRlKlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXJ2ZXJLZXlFeGNoYW5nZSpcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDZXJ0aWZpY2F0ZVJlcXVlc3QqXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwtLS0tLS0tLSAgICAgIFNlcnZlckhlbGxvRG9uZVxuICogQ2VydGlmaWNhdGUqXG4gKiBDbGllbnRLZXlFeGNoYW5nZVxuICogQ2VydGlmaWNhdGVWZXJpZnkqXG4gKiBbQ2hhbmdlQ2lwaGVyU3BlY11cbiAqIEZpbmlzaGVkICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0+XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtDaGFuZ2VDaXBoZXJTcGVjXVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8LS0tLS0tLS0gICAgICAgICAgICAgRmluaXNoZWRcbiAqIEFwcGxpY2F0aW9uIERhdGEgICAgICAgICAgICAgPC0tLS0tLS0+ICAgICBBcHBsaWNhdGlvbiBEYXRhXG4gKlxuICogPT09PT09PT09PT09PT09PT09PT09U0VTU0lPTiBSRVNVTVBUSU9OPT09PT09PT09PT09PT09PT09PT09XG4gKiBDbGllbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXJ2ZXJcbiAqXG4gKiBDbGllbnRIZWxsbyAgICAgICAgICAgICAgICAgICAtLS0tLS0tLT5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXJ2ZXJIZWxsb1xuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0NoYW5nZUNpcGhlclNwZWNdXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8LS0tLS0tLS0gICAgICAgICAgICAgRmluaXNoZWRcbiAqIFtDaGFuZ2VDaXBoZXJTcGVjXVxuICogRmluaXNoZWQgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0+XG4gKiBBcHBsaWNhdGlvbiBEYXRhICAgICAgICAgICAgICA8LS0tLS0tLT4gICAgIEFwcGxpY2F0aW9uIERhdGFcbiAqL1xuLy8gY2xpZW50IGV4cGVjdCBzdGF0ZXMgKGluZGljYXRlIHdoaWNoIHJlY29yZHMgYXJlIGV4cGVjdGVkIHRvIGJlIHJlY2VpdmVkKVxudmFyIFNIRSA9IDA7IC8vIHJjdiBzZXJ2ZXIgaGVsbG9cbnZhciBTQ0UgPSAxOyAvLyByY3Ygc2VydmVyIGNlcnRpZmljYXRlXG52YXIgU0tFID0gMjsgLy8gcmN2IHNlcnZlciBrZXkgZXhjaGFuZ2VcbnZhciBTQ1IgPSAzOyAvLyByY3YgY2VydGlmaWNhdGUgcmVxdWVzdFxudmFyIFNIRCA9IDQ7IC8vIHJjdiBzZXJ2ZXIgaGVsbG8gZG9uZVxudmFyIFNDQyA9IDU7IC8vIHJjdiBjaGFuZ2UgY2lwaGVyIHNwZWNcbnZhciBTRkkgPSA2OyAvLyByY3YgZmluaXNoZWRcbnZhciBTQUQgPSA3OyAvLyByY3YgYXBwbGljYXRpb24gZGF0YVxudmFyIFNFUiA9IDg7IC8vIG5vdCBleHBlY3RpbmcgYW55IG1lc3NhZ2VzIGF0IHRoaXMgcG9pbnRcblxuLy8gc2VydmVyIGV4cGVjdCBzdGF0ZXNcbnZhciBDSEUgPSAwOyAvLyByY3YgY2xpZW50IGhlbGxvXG52YXIgQ0NFID0gMTsgLy8gcmN2IGNsaWVudCBjZXJ0aWZpY2F0ZVxudmFyIENLRSA9IDI7IC8vIHJjdiBjbGllbnQga2V5IGV4Y2hhbmdlXG52YXIgQ0NWID0gMzsgLy8gcmN2IGNlcnRpZmljYXRlIHZlcmlmeVxudmFyIENDQyA9IDQ7IC8vIHJjdiBjaGFuZ2UgY2lwaGVyIHNwZWNcbnZhciBDRkkgPSA1OyAvLyByY3YgZmluaXNoZWRcbnZhciBDQUQgPSA2OyAvLyByY3YgYXBwbGljYXRpb24gZGF0YVxudmFyIENFUiA9IDc7IC8vIG5vdCBleHBlY3RpbmcgYW55IG1lc3NhZ2VzIGF0IHRoaXMgcG9pbnRcblxuLy8gbWFwIGNsaWVudCBjdXJyZW50IGV4cGVjdCBzdGF0ZSBhbmQgY29udGVudCB0eXBlIHRvIGZ1bmN0aW9uXG52YXIgX18gPSB0bHMuaGFuZGxlVW5leHBlY3RlZDtcbnZhciBSMCA9IHRscy5oYW5kbGVDaGFuZ2VDaXBoZXJTcGVjO1xudmFyIFIxID0gdGxzLmhhbmRsZUFsZXJ0O1xudmFyIFIyID0gdGxzLmhhbmRsZUhhbmRzaGFrZTtcbnZhciBSMyA9IHRscy5oYW5kbGVBcHBsaWNhdGlvbkRhdGE7XG52YXIgUjQgPSB0bHMuaGFuZGxlSGVhcnRiZWF0O1xudmFyIGN0VGFibGUgPSBbXTtcbmN0VGFibGVbdGxzLkNvbm5lY3Rpb25FbmQuY2xpZW50XSA9IFtcbi8vICAgICAgQ0MsQUwsSFMsQUQsSEJcbi8qU0hFKi9bX18sUjEsUjIsX18sUjRdLFxuLypTQ0UqL1tfXyxSMSxSMixfXyxSNF0sXG4vKlNLRSovW19fLFIxLFIyLF9fLFI0XSxcbi8qU0NSKi9bX18sUjEsUjIsX18sUjRdLFxuLypTSEQqL1tfXyxSMSxSMixfXyxSNF0sXG4vKlNDQyovW1IwLFIxLF9fLF9fLFI0XSxcbi8qU0ZJKi9bX18sUjEsUjIsX18sUjRdLFxuLypTQUQqL1tfXyxSMSxSMixSMyxSNF0sXG4vKlNFUiovW19fLFIxLFIyLF9fLFI0XVxuXTtcblxuLy8gbWFwIHNlcnZlciBjdXJyZW50IGV4cGVjdCBzdGF0ZSBhbmQgY29udGVudCB0eXBlIHRvIGZ1bmN0aW9uXG5jdFRhYmxlW3Rscy5Db25uZWN0aW9uRW5kLnNlcnZlcl0gPSBbXG4vLyAgICAgIENDLEFMLEhTLEFEXG4vKkNIRSovW19fLFIxLFIyLF9fLFI0XSxcbi8qQ0NFKi9bX18sUjEsUjIsX18sUjRdLFxuLypDS0UqL1tfXyxSMSxSMixfXyxSNF0sXG4vKkNDViovW19fLFIxLFIyLF9fLFI0XSxcbi8qQ0NDKi9bUjAsUjEsX18sX18sUjRdLFxuLypDRkkqL1tfXyxSMSxSMixfXyxSNF0sXG4vKkNBRCovW19fLFIxLFIyLFIzLFI0XSxcbi8qQ0VSKi9bX18sUjEsUjIsX18sUjRdXG5dO1xuXG4vLyBtYXAgY2xpZW50IGN1cnJlbnQgZXhwZWN0IHN0YXRlIGFuZCBoYW5kc2hha2UgdHlwZSB0byBmdW5jdGlvblxudmFyIEgwID0gdGxzLmhhbmRsZUhlbGxvUmVxdWVzdDtcbnZhciBIMSA9IHRscy5oYW5kbGVTZXJ2ZXJIZWxsbztcbnZhciBIMiA9IHRscy5oYW5kbGVDZXJ0aWZpY2F0ZTtcbnZhciBIMyA9IHRscy5oYW5kbGVTZXJ2ZXJLZXlFeGNoYW5nZTtcbnZhciBINCA9IHRscy5oYW5kbGVDZXJ0aWZpY2F0ZVJlcXVlc3Q7XG52YXIgSDUgPSB0bHMuaGFuZGxlU2VydmVySGVsbG9Eb25lO1xudmFyIEg2ID0gdGxzLmhhbmRsZUZpbmlzaGVkO1xudmFyIGhzVGFibGUgPSBbXTtcbmhzVGFibGVbdGxzLkNvbm5lY3Rpb25FbmQuY2xpZW50XSA9IFtcbi8vICAgICAgSFIsMDEsU0gsMDMsMDQsMDUsMDYsMDcsMDgsMDksMTAsU0MsU0ssQ1IsSEQsMTUsQ0ssMTcsMTgsMTksRklcbi8qU0hFKi9bX18sX18sSDEsX18sX18sX18sX18sX18sX18sX18sX18sX18sX18sX18sX18sX18sX18sX18sX18sX18sX19dLFxuLypTQ0UqL1tIMCxfXyxfXyxfXyxfXyxfXyxfXyxfXyxfXyxfXyxfXyxIMixIMyxINCxINSxfXyxfXyxfXyxfXyxfXyxfX10sXG4vKlNLRSovW0gwLF9fLF9fLF9fLF9fLF9fLF9fLF9fLF9fLF9fLF9fLF9fLEgzLEg0LEg1LF9fLF9fLF9fLF9fLF9fLF9fXSxcbi8qU0NSKi9bSDAsX18sX18sX18sX18sX18sX18sX18sX18sX18sX18sX18sX18sSDQsSDUsX18sX18sX18sX18sX18sX19dLFxuLypTSEQqL1tIMCxfXyxfXyxfXyxfXyxfXyxfXyxfXyxfXyxfXyxfXyxfXyxfXyxfXyxINSxfXyxfXyxfXyxfXyxfXyxfX10sXG4vKlNDQyovW0gwLF9fLF9fLF9fLF9fLF9fLF9fLF9fLF9fLF9fLF9fLF9fLF9fLF9fLF9fLF9fLF9fLF9fLF9fLF9fLF9fXSxcbi8qU0ZJKi9bSDAsX18sX18sX18sX18sX18sX18sX18sX18sX18sX18sX18sX18sX18sX18sX18sX18sX18sX18sX18sSDZdLFxuLypTQUQqL1tIMCxfXyxfXyxfXyxfXyxfXyxfXyxfXyxfXyxfXyxfXyxfXyxfXyxfXyxfXyxfXyxfXyxfXyxfXyxfXyxfX10sXG4vKlNFUiovW0gwLF9fLF9fLF9fLF9fLF9fLF9fLF9fLF9fLF9fLF9fLF9fLF9fLF9fLF9fLF9fLF9fLF9fLF9fLF9fLF9fXVxuXTtcblxuLy8gbWFwIHNlcnZlciBjdXJyZW50IGV4cGVjdCBzdGF0ZSBhbmQgaGFuZHNoYWtlIHR5cGUgdG8gZnVuY3Rpb25cbi8vIE5vdGU6IENBRFtDSF0gZG9lcyBub3QgbWFwIHRvIEZCIGJlY2F1c2UgcmVuZWdvdGF0aW9uIGlzIHByb2hpYml0ZWRcbnZhciBINyA9IHRscy5oYW5kbGVDbGllbnRIZWxsbztcbnZhciBIOCA9IHRscy5oYW5kbGVDbGllbnRLZXlFeGNoYW5nZTtcbnZhciBIOSA9IHRscy5oYW5kbGVDZXJ0aWZpY2F0ZVZlcmlmeTtcbmhzVGFibGVbdGxzLkNvbm5lY3Rpb25FbmQuc2VydmVyXSA9IFtcbi8vICAgICAgMDEsQ0gsMDIsMDMsMDQsMDUsMDYsMDcsMDgsMDksMTAsQ0MsMTIsMTMsMTQsQ1YsQ0ssMTcsMTgsMTksRklcbi8qQ0hFKi9bX18sSDcsX18sX18sX18sX18sX18sX18sX18sX18sX18sX18sX18sX18sX18sX18sX18sX18sX18sX18sX19dLFxuLypDQ0UqL1tfXyxfXyxfXyxfXyxfXyxfXyxfXyxfXyxfXyxfXyxfXyxIMixfXyxfXyxfXyxfXyxfXyxfXyxfXyxfXyxfX10sXG4vKkNLRSovW19fLF9fLF9fLF9fLF9fLF9fLF9fLF9fLF9fLF9fLF9fLF9fLF9fLF9fLF9fLF9fLEg4LF9fLF9fLF9fLF9fXSxcbi8qQ0NWKi9bX18sX18sX18sX18sX18sX18sX18sX18sX18sX18sX18sX18sX18sX18sX18sSDksX18sX18sX18sX18sX19dLFxuLypDQ0MqL1tfXyxfXyxfXyxfXyxfXyxfXyxfXyxfXyxfXyxfXyxfXyxfXyxfXyxfXyxfXyxfXyxfXyxfXyxfXyxfXyxfX10sXG4vKkNGSSovW19fLF9fLF9fLF9fLF9fLF9fLF9fLF9fLF9fLF9fLF9fLF9fLF9fLF9fLF9fLF9fLF9fLF9fLF9fLF9fLEg2XSxcbi8qQ0FEKi9bX18sX18sX18sX18sX18sX18sX18sX18sX18sX18sX18sX18sX18sX18sX18sX18sX18sX18sX18sX18sX19dLFxuLypDRVIqL1tfXyxfXyxfXyxfXyxfXyxfXyxfXyxfXyxfXyxfXyxfXyxfXyxfXyxfXyxfXyxfXyxfXyxfXyxfXyxfXyxfX11cbl07XG5cbi8qKlxuICogR2VuZXJhdGVzIHRoZSBtYXN0ZXJfc2VjcmV0IGFuZCBrZXlzIHVzaW5nIHRoZSBnaXZlbiBzZWN1cml0eSBwYXJhbWV0ZXJzLlxuICpcbiAqIFRoZSBzZWN1cml0eSBwYXJhbWV0ZXJzIGZvciBhIFRMUyBjb25uZWN0aW9uIHN0YXRlIGFyZSBkZWZpbmVkIGFzIHN1Y2g6XG4gKlxuICogc3RydWN0IHtcbiAqICAgQ29ubmVjdGlvbkVuZCAgICAgICAgICBlbnRpdHk7XG4gKiAgIFBSRkFsZ29yaXRobSAgICAgICAgICAgcHJmX2FsZ29yaXRobTtcbiAqICAgQnVsa0NpcGhlckFsZ29yaXRobSAgICBidWxrX2NpcGhlcl9hbGdvcml0aG07XG4gKiAgIENpcGhlclR5cGUgICAgICAgICAgICAgY2lwaGVyX3R5cGU7XG4gKiAgIHVpbnQ4ICAgICAgICAgICAgICAgICAgZW5jX2tleV9sZW5ndGg7XG4gKiAgIHVpbnQ4ICAgICAgICAgICAgICAgICAgYmxvY2tfbGVuZ3RoO1xuICogICB1aW50OCAgICAgICAgICAgICAgICAgIGZpeGVkX2l2X2xlbmd0aDtcbiAqICAgdWludDggICAgICAgICAgICAgICAgICByZWNvcmRfaXZfbGVuZ3RoO1xuICogICBNQUNBbGdvcml0aG0gICAgICAgICAgIG1hY19hbGdvcml0aG07XG4gKiAgIHVpbnQ4ICAgICAgICAgICAgICAgICAgbWFjX2xlbmd0aDtcbiAqICAgdWludDggICAgICAgICAgICAgICAgICBtYWNfa2V5X2xlbmd0aDtcbiAqICAgQ29tcHJlc3Npb25NZXRob2QgICAgICBjb21wcmVzc2lvbl9hbGdvcml0aG07XG4gKiAgIG9wYXF1ZSAgICAgICAgICAgICAgICAgbWFzdGVyX3NlY3JldFs0OF07XG4gKiAgIG9wYXF1ZSAgICAgICAgICAgICAgICAgY2xpZW50X3JhbmRvbVszMl07XG4gKiAgIG9wYXF1ZSAgICAgICAgICAgICAgICAgc2VydmVyX3JhbmRvbVszMl07XG4gKiB9IFNlY3VyaXR5UGFyYW1ldGVycztcbiAqXG4gKiBOb3RlIHRoYXQgdGhpcyBkZWZpbml0aW9uIGlzIGZyb20gVExTIDEuMi4gSW4gVExTIDEuMCBzb21lIG9mIHRoZXNlXG4gKiBwYXJhbWV0ZXJzIGFyZSBpZ25vcmVkIGJlY2F1c2UsIGZvciBpbnN0YW5jZSwgdGhlIFBSRkFsZ29yaXRobSBpcyBhXG4gKiBidWlsdGluLWZpeGVkIGFsZ29yaXRobSBjb21iaW5pbmcgaXRlcmF0aW9ucyBvZiBNRDUgYW5kIFNIQS0xIGluIFRMUyAxLjAuXG4gKlxuICogVGhlIFJlY29yZCBQcm90b2NvbCByZXF1aXJlcyBhbiBhbGdvcml0aG0gdG8gZ2VuZXJhdGUga2V5cyByZXF1aXJlZCBieSB0aGVcbiAqIGN1cnJlbnQgY29ubmVjdGlvbiBzdGF0ZS5cbiAqXG4gKiBUaGUgbWFzdGVyIHNlY3JldCBpcyBleHBhbmRlZCBpbnRvIGEgc2VxdWVuY2Ugb2Ygc2VjdXJlIGJ5dGVzLCB3aGljaCBpcyB0aGVuXG4gKiBzcGxpdCB0byBhIGNsaWVudCB3cml0ZSBNQUMga2V5LCBhIHNlcnZlciB3cml0ZSBNQUMga2V5LCBhIGNsaWVudCB3cml0ZVxuICogZW5jcnlwdGlvbiBrZXksIGFuZCBhIHNlcnZlciB3cml0ZSBlbmNyeXB0aW9uIGtleS4gSW4gVExTIDEuMCBhIGNsaWVudCB3cml0ZVxuICogSVYgYW5kIHNlcnZlciB3cml0ZSBJViBhcmUgYWxzbyBnZW5lcmF0ZWQuIEVhY2ggb2YgdGhlc2UgaXMgZ2VuZXJhdGVkIGZyb21cbiAqIHRoZSBieXRlIHNlcXVlbmNlIGluIHRoYXQgb3JkZXIuIFVudXNlZCB2YWx1ZXMgYXJlIGVtcHR5LiBJbiBUTFMgMS4yLCBzb21lXG4gKiBBRUFEIGNpcGhlcnMgbWF5IGFkZGl0aW9uYWxseSByZXF1aXJlIGEgY2xpZW50IHdyaXRlIElWIGFuZCBhIHNlcnZlciB3cml0ZVxuICogSVYgKHNlZSBTZWN0aW9uIDYuMi4zLjMpLlxuICpcbiAqIFdoZW4ga2V5cywgTUFDIGtleXMsIGFuZCBJVnMgYXJlIGdlbmVyYXRlZCwgdGhlIG1hc3RlciBzZWNyZXQgaXMgdXNlZCBhcyBhblxuICogZW50cm9weSBzb3VyY2UuXG4gKlxuICogVG8gZ2VuZXJhdGUgdGhlIGtleSBtYXRlcmlhbCwgY29tcHV0ZTpcbiAqXG4gKiBtYXN0ZXJfc2VjcmV0ID0gUFJGKHByZV9tYXN0ZXJfc2VjcmV0LCBcIm1hc3RlciBzZWNyZXRcIixcbiAqICAgICAgICAgICAgICAgICAgICAgQ2xpZW50SGVsbG8ucmFuZG9tICsgU2VydmVySGVsbG8ucmFuZG9tKVxuICpcbiAqIGtleV9ibG9jayA9IFBSRihTZWN1cml0eVBhcmFtZXRlcnMubWFzdGVyX3NlY3JldCxcbiAqICAgICAgICAgICAgICAgICBcImtleSBleHBhbnNpb25cIixcbiAqICAgICAgICAgICAgICAgICBTZWN1cml0eVBhcmFtZXRlcnMuc2VydmVyX3JhbmRvbSArXG4gKiAgICAgICAgICAgICAgICAgU2VjdXJpdHlQYXJhbWV0ZXJzLmNsaWVudF9yYW5kb20pO1xuICpcbiAqIHVudGlsIGVub3VnaCBvdXRwdXQgaGFzIGJlZW4gZ2VuZXJhdGVkLiBUaGVuLCB0aGUga2V5X2Jsb2NrIGlzXG4gKiBwYXJ0aXRpb25lZCBhcyBmb2xsb3dzOlxuICpcbiAqIGNsaWVudF93cml0ZV9NQUNfa2V5W1NlY3VyaXR5UGFyYW1ldGVycy5tYWNfa2V5X2xlbmd0aF1cbiAqIHNlcnZlcl93cml0ZV9NQUNfa2V5W1NlY3VyaXR5UGFyYW1ldGVycy5tYWNfa2V5X2xlbmd0aF1cbiAqIGNsaWVudF93cml0ZV9rZXlbU2VjdXJpdHlQYXJhbWV0ZXJzLmVuY19rZXlfbGVuZ3RoXVxuICogc2VydmVyX3dyaXRlX2tleVtTZWN1cml0eVBhcmFtZXRlcnMuZW5jX2tleV9sZW5ndGhdXG4gKiBjbGllbnRfd3JpdGVfSVZbU2VjdXJpdHlQYXJhbWV0ZXJzLmZpeGVkX2l2X2xlbmd0aF1cbiAqIHNlcnZlcl93cml0ZV9JVltTZWN1cml0eVBhcmFtZXRlcnMuZml4ZWRfaXZfbGVuZ3RoXVxuICpcbiAqIEluIFRMUyAxLjIsIHRoZSBjbGllbnRfd3JpdGVfSVYgYW5kIHNlcnZlcl93cml0ZV9JViBhcmUgb25seSBnZW5lcmF0ZWQgZm9yXG4gKiBpbXBsaWNpdCBub25jZSB0ZWNobmlxdWVzIGFzIGRlc2NyaWJlZCBpbiBTZWN0aW9uIDMuMi4xIG9mIFtBRUFEXS4gVGhpc1xuICogaW1wbGVtZW50YXRpb24gdXNlcyBUTFMgMS4wIHNvIElWcyBhcmUgZ2VuZXJhdGVkLlxuICpcbiAqIEltcGxlbWVudGF0aW9uIG5vdGU6IFRoZSBjdXJyZW50bHkgZGVmaW5lZCBjaXBoZXIgc3VpdGUgd2hpY2ggcmVxdWlyZXMgdGhlXG4gKiBtb3N0IG1hdGVyaWFsIGlzIEFFU18yNTZfQ0JDX1NIQTI1Ni4gSXQgcmVxdWlyZXMgMiB4IDMyIGJ5dGUga2V5cyBhbmQgMiB4IDMyXG4gKiBieXRlIE1BQyBrZXlzLCBmb3IgYSB0b3RhbCAxMjggYnl0ZXMgb2Yga2V5IG1hdGVyaWFsLiBJbiBUTFMgMS4wIGl0IGFsc29cbiAqIHJlcXVpcmVzIDIgeCAxNiBieXRlIElWcywgc28gaXQgYWN0dWFsbHkgdGFrZXMgMTYwIGJ5dGVzIG9mIGtleSBtYXRlcmlhbC5cbiAqXG4gKiBAcGFyYW0gYyB0aGUgY29ubmVjdGlvbi5cbiAqIEBwYXJhbSBzcCB0aGUgc2VjdXJpdHkgcGFyYW1ldGVycyB0byB1c2UuXG4gKlxuICogQHJldHVybiB0aGUgc2VjdXJpdHkga2V5cy5cbiAqL1xudGxzLmdlbmVyYXRlS2V5cyA9IGZ1bmN0aW9uKGMsIHNwKSB7XG4gIC8vIFRMU19SU0FfV0lUSF9BRVNfMTI4X0NCQ19TSEEgKHJlcXVpcmVkIHRvIGJlIGNvbXBsaWFudCB3aXRoIFRMUyAxLjIpICZcbiAgLy8gVExTX1JTQV9XSVRIX0FFU18yNTZfQ0JDX1NIQSBhcmUgdGhlIG9ubHkgY2lwaGVyIHN1aXRlcyBpbXBsZW1lbnRlZFxuICAvLyBhdCBwcmVzZW50XG5cbiAgLy8gVExTX0RIRV9EU1NfV0lUSF8zREVTX0VERV9DQkNfU0hBIGlzIHJlcXVpcmVkIHRvIGJlIGNvbXBsaWFudCB3aXRoXG4gIC8vIFRMUyAxLjAgYnV0IHdlIGRvbid0IGNhcmUgcmlnaHQgbm93IGJlY2F1c2UgQUVTIGlzIGJldHRlciBhbmQgd2UgaGF2ZVxuICAvLyBhbiBpbXBsZW1lbnRhdGlvbiBmb3IgaXRcblxuICAvLyBUT0RPOiBUTFMgMS4yIGltcGxlbWVudGF0aW9uXG4gIC8qXG4gIC8vIGRldGVybWluZSB0aGUgUFJGXG4gIHZhciBwcmY7XG4gIHN3aXRjaChzcC5wcmZfYWxnb3JpdGhtKSB7XG4gIGNhc2UgdGxzLlBSRkFsZ29yaXRobS50bHNfcHJmX3NoYTI1NjpcbiAgICBwcmYgPSBwcmZfc2hhMjU2O1xuICAgIGJyZWFrO1xuICBkZWZhdWx0OlxuICAgIC8vIHNob3VsZCBuZXZlciBoYXBwZW5cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgUFJGJyk7XG4gIH1cbiAgKi9cblxuICAvLyBUTFMgMS4wLzEuMSBpbXBsZW1lbnRhdGlvblxuICB2YXIgcHJmID0gcHJmX1RMUzE7XG5cbiAgLy8gY29uY2F0ZW5hdGUgc2VydmVyIGFuZCBjbGllbnQgcmFuZG9tXG4gIHZhciByYW5kb20gPSBzcC5jbGllbnRfcmFuZG9tICsgc3Auc2VydmVyX3JhbmRvbTtcblxuICAvLyBvbmx5IGNyZWF0ZSBtYXN0ZXIgc2VjcmV0IGlmIHNlc3Npb24gaXMgbmV3XG4gIGlmKCFjLnNlc3Npb24ucmVzdW1pbmcpIHtcbiAgICAvLyBjcmVhdGUgbWFzdGVyIHNlY3JldCwgY2xlYW4gdXAgcHJlLW1hc3RlciBzZWNyZXRcbiAgICBzcC5tYXN0ZXJfc2VjcmV0ID0gcHJmKFxuICAgICAgc3AucHJlX21hc3Rlcl9zZWNyZXQsICdtYXN0ZXIgc2VjcmV0JywgcmFuZG9tLCA0OCkuYnl0ZXMoKTtcbiAgICBzcC5wcmVfbWFzdGVyX3NlY3JldCA9IG51bGw7XG4gIH1cblxuICAvLyBnZW5lcmF0ZSB0aGUgYW1vdW50IG9mIGtleSBtYXRlcmlhbCBuZWVkZWRcbiAgcmFuZG9tID0gc3Auc2VydmVyX3JhbmRvbSArIHNwLmNsaWVudF9yYW5kb207XG4gIHZhciBsZW5ndGggPSAyICogc3AubWFjX2tleV9sZW5ndGggKyAyICogc3AuZW5jX2tleV9sZW5ndGg7XG5cbiAgLy8gaW5jbHVkZSBJViBmb3IgVExTLzEuMFxuICB2YXIgdGxzMTAgPSAoYy52ZXJzaW9uLm1ham9yID09PSB0bHMuVmVyc2lvbnMuVExTXzFfMC5tYWpvciAmJlxuICAgIGMudmVyc2lvbi5taW5vciA9PT0gdGxzLlZlcnNpb25zLlRMU18xXzAubWlub3IpO1xuICBpZih0bHMxMCkge1xuICAgIGxlbmd0aCArPSAyICogc3AuZml4ZWRfaXZfbGVuZ3RoO1xuICB9XG4gIHZhciBrbSA9IHByZihzcC5tYXN0ZXJfc2VjcmV0LCAna2V5IGV4cGFuc2lvbicsIHJhbmRvbSwgbGVuZ3RoKTtcblxuICAvLyBzcGxpdCB0aGUga2V5IG1hdGVyaWFsIGludG8gdGhlIE1BQyBhbmQgZW5jcnlwdGlvbiBrZXlzXG4gIHZhciBydmFsID0ge1xuICAgIGNsaWVudF93cml0ZV9NQUNfa2V5OiBrbS5nZXRCeXRlcyhzcC5tYWNfa2V5X2xlbmd0aCksXG4gICAgc2VydmVyX3dyaXRlX01BQ19rZXk6IGttLmdldEJ5dGVzKHNwLm1hY19rZXlfbGVuZ3RoKSxcbiAgICBjbGllbnRfd3JpdGVfa2V5OiBrbS5nZXRCeXRlcyhzcC5lbmNfa2V5X2xlbmd0aCksXG4gICAgc2VydmVyX3dyaXRlX2tleToga20uZ2V0Qnl0ZXMoc3AuZW5jX2tleV9sZW5ndGgpXG4gIH07XG5cbiAgLy8gaW5jbHVkZSBUTFMgMS4wIElWc1xuICBpZih0bHMxMCkge1xuICAgIHJ2YWwuY2xpZW50X3dyaXRlX0lWID0ga20uZ2V0Qnl0ZXMoc3AuZml4ZWRfaXZfbGVuZ3RoKTtcbiAgICBydmFsLnNlcnZlcl93cml0ZV9JViA9IGttLmdldEJ5dGVzKHNwLmZpeGVkX2l2X2xlbmd0aCk7XG4gIH1cblxuICByZXR1cm4gcnZhbDtcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBpbml0aWFsaXplZCBUTFMgY29ubmVjdGlvbiBzdGF0ZS4gQSBjb25uZWN0aW9uIHN0YXRlIGhhc1xuICogYSByZWFkIG1vZGUgYW5kIGEgd3JpdGUgbW9kZS5cbiAqXG4gKiBjb21wcmVzc2lvbiBzdGF0ZTpcbiAqICAgVGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGNvbXByZXNzaW9uIGFsZ29yaXRobS5cbiAqXG4gKiBjaXBoZXIgc3RhdGU6XG4gKiAgIFRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBlbmNyeXB0aW9uIGFsZ29yaXRobS4gVGhpcyB3aWxsIGNvbnNpc3Qgb2YgdGhlXG4gKiAgIHNjaGVkdWxlZCBrZXkgZm9yIHRoYXQgY29ubmVjdGlvbi4gRm9yIHN0cmVhbSBjaXBoZXJzLCB0aGlzIHdpbGwgYWxzb1xuICogICBjb250YWluIHdoYXRldmVyIHN0YXRlIGluZm9ybWF0aW9uIGlzIG5lY2Vzc2FyeSB0byBhbGxvdyB0aGUgc3RyZWFtIHRvXG4gKiAgIGNvbnRpbnVlIHRvIGVuY3J5cHQgb3IgZGVjcnlwdCBkYXRhLlxuICpcbiAqIE1BQyBrZXk6XG4gKiAgIFRoZSBNQUMga2V5IGZvciB0aGUgY29ubmVjdGlvbi5cbiAqXG4gKiBzZXF1ZW5jZSBudW1iZXI6XG4gKiAgIEVhY2ggY29ubmVjdGlvbiBzdGF0ZSBjb250YWlucyBhIHNlcXVlbmNlIG51bWJlciwgd2hpY2ggaXMgbWFpbnRhaW5lZFxuICogICBzZXBhcmF0ZWx5IGZvciByZWFkIGFuZCB3cml0ZSBzdGF0ZXMuIFRoZSBzZXF1ZW5jZSBudW1iZXIgTVVTVCBiZSBzZXQgdG9cbiAqICAgemVybyB3aGVuZXZlciBhIGNvbm5lY3Rpb24gc3RhdGUgaXMgbWFkZSB0aGUgYWN0aXZlIHN0YXRlLiBTZXF1ZW5jZVxuICogICBudW1iZXJzIGFyZSBvZiB0eXBlIHVpbnQ2NCBhbmQgbWF5IG5vdCBleGNlZWQgMl42NC0xLiBTZXF1ZW5jZSBudW1iZXJzIGRvXG4gKiAgIG5vdCB3cmFwLiBJZiBhIFRMUyBpbXBsZW1lbnRhdGlvbiB3b3VsZCBuZWVkIHRvIHdyYXAgYSBzZXF1ZW5jZSBudW1iZXIsXG4gKiAgIGl0IG11c3QgcmVuZWdvdGlhdGUgaW5zdGVhZC4gQSBzZXF1ZW5jZSBudW1iZXIgaXMgaW5jcmVtZW50ZWQgYWZ0ZXIgZWFjaFxuICogICByZWNvcmQ6IHNwZWNpZmljYWxseSwgdGhlIGZpcnN0IHJlY29yZCB0cmFuc21pdHRlZCB1bmRlciBhIHBhcnRpY3VsYXJcbiAqICAgY29ubmVjdGlvbiBzdGF0ZSBNVVNUIHVzZSBzZXF1ZW5jZSBudW1iZXIgMC5cbiAqXG4gKiBAcGFyYW0gYyB0aGUgY29ubmVjdGlvbi5cbiAqXG4gKiBAcmV0dXJuIHRoZSBuZXcgaW5pdGlhbGl6ZWQgVExTIGNvbm5lY3Rpb24gc3RhdGUuXG4gKi9cbnRscy5jcmVhdGVDb25uZWN0aW9uU3RhdGUgPSBmdW5jdGlvbihjKSB7XG4gIHZhciBjbGllbnQgPSAoYy5lbnRpdHkgPT09IHRscy5Db25uZWN0aW9uRW5kLmNsaWVudCk7XG5cbiAgdmFyIGNyZWF0ZU1vZGUgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgbW9kZSA9IHtcbiAgICAgIC8vIHR3byAzMi1iaXQgbnVtYmVycywgZmlyc3QgaXMgbW9zdCBzaWduaWZpY2FudFxuICAgICAgc2VxdWVuY2VOdW1iZXI6IFswLCAwXSxcbiAgICAgIG1hY0tleTogbnVsbCxcbiAgICAgIG1hY0xlbmd0aDogMCxcbiAgICAgIG1hY0Z1bmN0aW9uOiBudWxsLFxuICAgICAgY2lwaGVyU3RhdGU6IG51bGwsXG4gICAgICBjaXBoZXJGdW5jdGlvbjogZnVuY3Rpb24ocmVjb3JkKSB7cmV0dXJuIHRydWU7fSxcbiAgICAgIGNvbXByZXNzaW9uU3RhdGU6IG51bGwsXG4gICAgICBjb21wcmVzc0Z1bmN0aW9uOiBmdW5jdGlvbihyZWNvcmQpIHtyZXR1cm4gdHJ1ZTt9LFxuICAgICAgdXBkYXRlU2VxdWVuY2VOdW1iZXI6IGZ1bmN0aW9uKCkge1xuICAgICAgICBpZihtb2RlLnNlcXVlbmNlTnVtYmVyWzFdID09PSAweEZGRkZGRkZGKSB7XG4gICAgICAgICAgbW9kZS5zZXF1ZW5jZU51bWJlclsxXSA9IDA7XG4gICAgICAgICAgKyttb2RlLnNlcXVlbmNlTnVtYmVyWzBdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICsrbW9kZS5zZXF1ZW5jZU51bWJlclsxXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIG1vZGU7XG4gIH07XG4gIHZhciBzdGF0ZSA9IHtcbiAgICByZWFkOiBjcmVhdGVNb2RlKCksXG4gICAgd3JpdGU6IGNyZWF0ZU1vZGUoKVxuICB9O1xuXG4gIC8vIHVwZGF0ZSBmdW5jdGlvbiBpbiByZWFkIG1vZGUgd2lsbCBkZWNyeXB0IHRoZW4gZGVjb21wcmVzcyBhIHJlY29yZFxuICBzdGF0ZS5yZWFkLnVwZGF0ZSA9IGZ1bmN0aW9uKGMsIHJlY29yZCkge1xuICAgIGlmKCFzdGF0ZS5yZWFkLmNpcGhlckZ1bmN0aW9uKHJlY29yZCwgc3RhdGUucmVhZCkpIHtcbiAgICAgIGMuZXJyb3IoYywge1xuICAgICAgICBtZXNzYWdlOiAnQ291bGQgbm90IGRlY3J5cHQgcmVjb3JkIG9yIGJhZCBNQUMuJyxcbiAgICAgICAgc2VuZDogdHJ1ZSxcbiAgICAgICAgYWxlcnQ6IHtcbiAgICAgICAgICBsZXZlbDogdGxzLkFsZXJ0LkxldmVsLmZhdGFsLFxuICAgICAgICAgIC8vIGRvZXNuJ3QgbWF0dGVyIGlmIGRlY3J5cHRpb24gZmFpbGVkIG9yIE1BQyB3YXNcbiAgICAgICAgICAvLyBpbnZhbGlkLCByZXR1cm4gdGhlIHNhbWUgZXJyb3Igc28gYXMgbm90IHRvIHJldmVhbFxuICAgICAgICAgIC8vIHdoaWNoIG9uZSBvY2N1cnJlZFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiB0bHMuQWxlcnQuRGVzY3JpcHRpb24uYmFkX3JlY29yZF9tYWNcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmKCFzdGF0ZS5yZWFkLmNvbXByZXNzRnVuY3Rpb24oYywgcmVjb3JkLCBzdGF0ZS5yZWFkKSkge1xuICAgICAgYy5lcnJvcihjLCB7XG4gICAgICAgIG1lc3NhZ2U6ICdDb3VsZCBub3QgZGVjb21wcmVzcyByZWNvcmQuJyxcbiAgICAgICAgc2VuZDogdHJ1ZSxcbiAgICAgICAgYWxlcnQ6IHtcbiAgICAgICAgICBsZXZlbDogdGxzLkFsZXJ0LkxldmVsLmZhdGFsLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiB0bHMuQWxlcnQuRGVzY3JpcHRpb24uZGVjb21wcmVzc2lvbl9mYWlsdXJlXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gIWMuZmFpbDtcbiAgfTtcblxuICAvLyB1cGRhdGUgZnVuY3Rpb24gaW4gd3JpdGUgbW9kZSB3aWxsIGNvbXByZXNzIHRoZW4gZW5jcnlwdCBhIHJlY29yZFxuICBzdGF0ZS53cml0ZS51cGRhdGUgPSBmdW5jdGlvbihjLCByZWNvcmQpIHtcbiAgICBpZighc3RhdGUud3JpdGUuY29tcHJlc3NGdW5jdGlvbihjLCByZWNvcmQsIHN0YXRlLndyaXRlKSkge1xuICAgICAgLy8gZXJyb3IsIGJ1dCBkbyBub3Qgc2VuZCBhbGVydCBzaW5jZSBpdCB3b3VsZCByZXF1aXJlXG4gICAgICAvLyBjb21wcmVzc2lvbiBhcyB3ZWxsXG4gICAgICBjLmVycm9yKGMsIHtcbiAgICAgICAgbWVzc2FnZTogJ0NvdWxkIG5vdCBjb21wcmVzcyByZWNvcmQuJyxcbiAgICAgICAgc2VuZDogZmFsc2UsXG4gICAgICAgIGFsZXJ0OiB7XG4gICAgICAgICAgbGV2ZWw6IHRscy5BbGVydC5MZXZlbC5mYXRhbCxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogdGxzLkFsZXJ0LkRlc2NyaXB0aW9uLmludGVybmFsX2Vycm9yXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZighc3RhdGUud3JpdGUuY2lwaGVyRnVuY3Rpb24ocmVjb3JkLCBzdGF0ZS53cml0ZSkpIHtcbiAgICAgIC8vIGVycm9yLCBidXQgZG8gbm90IHNlbmQgYWxlcnQgc2luY2UgaXQgd291bGQgcmVxdWlyZVxuICAgICAgLy8gZW5jcnlwdGlvbiBhcyB3ZWxsXG4gICAgICBjLmVycm9yKGMsIHtcbiAgICAgICAgbWVzc2FnZTogJ0NvdWxkIG5vdCBlbmNyeXB0IHJlY29yZC4nLFxuICAgICAgICBzZW5kOiBmYWxzZSxcbiAgICAgICAgYWxlcnQ6IHtcbiAgICAgICAgICBsZXZlbDogdGxzLkFsZXJ0LkxldmVsLmZhdGFsLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiB0bHMuQWxlcnQuRGVzY3JpcHRpb24uaW50ZXJuYWxfZXJyb3JcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiAhYy5mYWlsO1xuICB9O1xuXG4gIC8vIGhhbmRsZSBzZWN1cml0eSBwYXJhbWV0ZXJzXG4gIGlmKGMuc2Vzc2lvbikge1xuICAgIHZhciBzcCA9IGMuc2Vzc2lvbi5zcDtcbiAgICBjLnNlc3Npb24uY2lwaGVyU3VpdGUuaW5pdFNlY3VyaXR5UGFyYW1ldGVycyhzcCk7XG5cbiAgICAvLyBnZW5lcmF0ZSBrZXlzXG4gICAgc3Aua2V5cyA9IHRscy5nZW5lcmF0ZUtleXMoYywgc3ApO1xuICAgIHN0YXRlLnJlYWQubWFjS2V5ID0gY2xpZW50ID9cbiAgICAgIHNwLmtleXMuc2VydmVyX3dyaXRlX01BQ19rZXkgOiBzcC5rZXlzLmNsaWVudF93cml0ZV9NQUNfa2V5O1xuICAgIHN0YXRlLndyaXRlLm1hY0tleSA9IGNsaWVudCA/XG4gICAgICBzcC5rZXlzLmNsaWVudF93cml0ZV9NQUNfa2V5IDogc3Aua2V5cy5zZXJ2ZXJfd3JpdGVfTUFDX2tleTtcblxuICAgIC8vIGNpcGhlciBzdWl0ZSBzZXR1cFxuICAgIGMuc2Vzc2lvbi5jaXBoZXJTdWl0ZS5pbml0Q29ubmVjdGlvblN0YXRlKHN0YXRlLCBjLCBzcCk7XG5cbiAgICAvLyBjb21wcmVzc2lvbiBzZXR1cFxuICAgIHN3aXRjaChzcC5jb21wcmVzc2lvbl9hbGdvcml0aG0pIHtcbiAgICBjYXNlIHRscy5Db21wcmVzc2lvbk1ldGhvZC5ub25lOlxuICAgICAgYnJlYWs7XG4gICAgY2FzZSB0bHMuQ29tcHJlc3Npb25NZXRob2QuZGVmbGF0ZTpcbiAgICAgIHN0YXRlLnJlYWQuY29tcHJlc3NGdW5jdGlvbiA9IGluZmxhdGU7XG4gICAgICBzdGF0ZS53cml0ZS5jb21wcmVzc0Z1bmN0aW9uID0gZGVmbGF0ZTtcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vuc3VwcG9ydGVkIGNvbXByZXNzaW9uIGFsZ29yaXRobS4nKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gc3RhdGU7XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBSYW5kb20gc3RydWN0dXJlLlxuICpcbiAqIHN0cnVjdCB7XG4gKiAgIHVpbnQzMiBnbXRfdW5peF90aW1lO1xuICogICBvcGFxdWUgcmFuZG9tX2J5dGVzWzI4XTtcbiAqIH0gUmFuZG9tO1xuICpcbiAqIGdtdF91bml4X3RpbWU6XG4gKiAgIFRoZSBjdXJyZW50IHRpbWUgYW5kIGRhdGUgaW4gc3RhbmRhcmQgVU5JWCAzMi1iaXQgZm9ybWF0IChzZWNvbmRzIHNpbmNlXG4gKiAgIHRoZSBtaWRuaWdodCBzdGFydGluZyBKYW4gMSwgMTk3MCwgVVRDLCBpZ25vcmluZyBsZWFwIHNlY29uZHMpIGFjY29yZGluZ1xuICogICB0byB0aGUgc2VuZGVyJ3MgaW50ZXJuYWwgY2xvY2suIENsb2NrcyBhcmUgbm90IHJlcXVpcmVkIHRvIGJlIHNldFxuICogICBjb3JyZWN0bHkgYnkgdGhlIGJhc2ljIFRMUyBwcm90b2NvbDsgaGlnaGVyLWxldmVsIG9yIGFwcGxpY2F0aW9uXG4gKiAgIHByb3RvY29scyBtYXkgZGVmaW5lIGFkZGl0aW9uYWwgcmVxdWlyZW1lbnRzLiBOb3RlIHRoYXQsIGZvciBoaXN0b3JpY2FsXG4gKiAgIHJlYXNvbnMsIHRoZSBkYXRhIGVsZW1lbnQgaXMgbmFtZWQgdXNpbmcgR01ULCB0aGUgcHJlZGVjZXNzb3Igb2YgdGhlXG4gKiAgIGN1cnJlbnQgd29ybGR3aWRlIHRpbWUgYmFzZSwgVVRDLlxuICogcmFuZG9tX2J5dGVzOlxuICogICAyOCBieXRlcyBnZW5lcmF0ZWQgYnkgYSBzZWN1cmUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IuXG4gKlxuICogQHJldHVybiB0aGUgUmFuZG9tIHN0cnVjdHVyZSBhcyBhIGJ5dGUgYXJyYXkuXG4gKi9cbnRscy5jcmVhdGVSYW5kb20gPSBmdW5jdGlvbigpIHtcbiAgLy8gZ2V0IFVUQyBtaWxsaXNlY29uZHNcbiAgdmFyIGQgPSBuZXcgRGF0ZSgpO1xuICB2YXIgdXRjID0gK2QgKyBkLmdldFRpbWV6b25lT2Zmc2V0KCkgKiA2MDAwMDtcbiAgdmFyIHJ2YWwgPSBmb3JnZS51dGlsLmNyZWF0ZUJ1ZmZlcigpO1xuICBydmFsLnB1dEludDMyKHV0Yyk7XG4gIHJ2YWwucHV0Qnl0ZXMoZm9yZ2UucmFuZG9tLmdldEJ5dGVzKDI4KSk7XG4gIHJldHVybiBydmFsO1xufTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgVExTIHJlY29yZCB3aXRoIHRoZSBnaXZlbiB0eXBlIGFuZCBkYXRhLlxuICpcbiAqIEBwYXJhbSBjIHRoZSBjb25uZWN0aW9uLlxuICogQHBhcmFtIG9wdGlvbnM6XG4gKiAgIHR5cGU6IHRoZSByZWNvcmQgdHlwZS5cbiAqICAgZGF0YTogdGhlIHBsYWluIHRleHQgZGF0YSBpbiBhIGJ5dGUgYnVmZmVyLlxuICpcbiAqIEByZXR1cm4gdGhlIGNyZWF0ZWQgcmVjb3JkLlxuICovXG50bHMuY3JlYXRlUmVjb3JkID0gZnVuY3Rpb24oYywgb3B0aW9ucykge1xuICBpZighb3B0aW9ucy5kYXRhKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgdmFyIHJlY29yZCA9IHtcbiAgICB0eXBlOiBvcHRpb25zLnR5cGUsXG4gICAgdmVyc2lvbjoge1xuICAgICAgbWFqb3I6IGMudmVyc2lvbi5tYWpvcixcbiAgICAgIG1pbm9yOiBjLnZlcnNpb24ubWlub3JcbiAgICB9LFxuICAgIGxlbmd0aDogb3B0aW9ucy5kYXRhLmxlbmd0aCgpLFxuICAgIGZyYWdtZW50OiBvcHRpb25zLmRhdGFcbiAgfTtcbiAgcmV0dXJuIHJlY29yZDtcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIFRMUyBhbGVydCByZWNvcmQuXG4gKlxuICogQHBhcmFtIGMgdGhlIGNvbm5lY3Rpb24uXG4gKiBAcGFyYW0gYWxlcnQ6XG4gKiAgIGxldmVsOiB0aGUgVExTIGFsZXJ0IGxldmVsLlxuICogICBkZXNjcmlwdGlvbjogdGhlIFRMUyBhbGVydCBkZXNjcmlwdGlvbi5cbiAqXG4gKiBAcmV0dXJuIHRoZSBjcmVhdGVkIGFsZXJ0IHJlY29yZC5cbiAqL1xudGxzLmNyZWF0ZUFsZXJ0ID0gZnVuY3Rpb24oYywgYWxlcnQpIHtcbiAgdmFyIGIgPSBmb3JnZS51dGlsLmNyZWF0ZUJ1ZmZlcigpO1xuICBiLnB1dEJ5dGUoYWxlcnQubGV2ZWwpO1xuICBiLnB1dEJ5dGUoYWxlcnQuZGVzY3JpcHRpb24pO1xuICByZXR1cm4gdGxzLmNyZWF0ZVJlY29yZChjLCB7XG4gICAgdHlwZTogdGxzLkNvbnRlbnRUeXBlLmFsZXJ0LFxuICAgIGRhdGE6IGJcbiAgfSk7XG59O1xuXG4vKiBUaGUgc3RydWN0dXJlIG9mIGEgVExTIGhhbmRzaGFrZSBtZXNzYWdlLlxuICpcbiAqIHN0cnVjdCB7XG4gKiAgICBIYW5kc2hha2VUeXBlIG1zZ190eXBlOyAgICAvLyBoYW5kc2hha2UgdHlwZVxuICogICAgdWludDI0IGxlbmd0aDsgICAgICAgICAgICAgLy8gYnl0ZXMgaW4gbWVzc2FnZVxuICogICAgc2VsZWN0KEhhbmRzaGFrZVR5cGUpIHtcbiAqICAgICAgIGNhc2UgaGVsbG9fcmVxdWVzdDogICAgICAgSGVsbG9SZXF1ZXN0O1xuICogICAgICAgY2FzZSBjbGllbnRfaGVsbG86ICAgICAgICBDbGllbnRIZWxsbztcbiAqICAgICAgIGNhc2Ugc2VydmVyX2hlbGxvOiAgICAgICAgU2VydmVySGVsbG87XG4gKiAgICAgICBjYXNlIGNlcnRpZmljYXRlOiAgICAgICAgIENlcnRpZmljYXRlO1xuICogICAgICAgY2FzZSBzZXJ2ZXJfa2V5X2V4Y2hhbmdlOiBTZXJ2ZXJLZXlFeGNoYW5nZTtcbiAqICAgICAgIGNhc2UgY2VydGlmaWNhdGVfcmVxdWVzdDogQ2VydGlmaWNhdGVSZXF1ZXN0O1xuICogICAgICAgY2FzZSBzZXJ2ZXJfaGVsbG9fZG9uZTogICBTZXJ2ZXJIZWxsb0RvbmU7XG4gKiAgICAgICBjYXNlIGNlcnRpZmljYXRlX3ZlcmlmeTogIENlcnRpZmljYXRlVmVyaWZ5O1xuICogICAgICAgY2FzZSBjbGllbnRfa2V5X2V4Y2hhbmdlOiBDbGllbnRLZXlFeGNoYW5nZTtcbiAqICAgICAgIGNhc2UgZmluaXNoZWQ6ICAgICAgICAgICAgRmluaXNoZWQ7XG4gKiAgICB9IGJvZHk7XG4gKiB9IEhhbmRzaGFrZTtcbiAqL1xuXG4vKipcbiAqIENyZWF0ZXMgYSBDbGllbnRIZWxsbyBtZXNzYWdlLlxuICpcbiAqIG9wYXF1ZSBTZXNzaW9uSUQ8MC4uMzI+O1xuICogZW51bSB7IG51bGwoMCksIGRlZmxhdGUoMSksICgyNTUpIH0gQ29tcHJlc3Npb25NZXRob2Q7XG4gKiB1aW50OCBDaXBoZXJTdWl0ZVsyXTtcbiAqXG4gKiBzdHJ1Y3Qge1xuICogICBQcm90b2NvbFZlcnNpb24gY2xpZW50X3ZlcnNpb247XG4gKiAgIFJhbmRvbSByYW5kb207XG4gKiAgIFNlc3Npb25JRCBzZXNzaW9uX2lkO1xuICogICBDaXBoZXJTdWl0ZSBjaXBoZXJfc3VpdGVzPDIuLjJeMTYtMj47XG4gKiAgIENvbXByZXNzaW9uTWV0aG9kIGNvbXByZXNzaW9uX21ldGhvZHM8MS4uMl44LTE+O1xuICogICBzZWxlY3QoZXh0ZW5zaW9uc19wcmVzZW50KSB7XG4gKiAgICAgY2FzZSBmYWxzZTpcbiAqICAgICAgIHN0cnVjdCB7fTtcbiAqICAgICBjYXNlIHRydWU6XG4gKiAgICAgICBFeHRlbnNpb24gZXh0ZW5zaW9uczwwLi4yXjE2LTE+O1xuICogICB9O1xuICogfSBDbGllbnRIZWxsbztcbiAqXG4gKiBUaGUgZXh0ZW5zaW9uIGZvcm1hdCBmb3IgZXh0ZW5kZWQgY2xpZW50IGhlbGxvcyBhbmQgc2VydmVyIGhlbGxvcyBpczpcbiAqXG4gKiBzdHJ1Y3Qge1xuICogICBFeHRlbnNpb25UeXBlIGV4dGVuc2lvbl90eXBlO1xuICogICBvcGFxdWUgZXh0ZW5zaW9uX2RhdGE8MC4uMl4xNi0xPjtcbiAqIH0gRXh0ZW5zaW9uO1xuICpcbiAqIEhlcmU6XG4gKlxuICogLSBcImV4dGVuc2lvbl90eXBlXCIgaWRlbnRpZmllcyB0aGUgcGFydGljdWxhciBleHRlbnNpb24gdHlwZS5cbiAqIC0gXCJleHRlbnNpb25fZGF0YVwiIGNvbnRhaW5zIGluZm9ybWF0aW9uIHNwZWNpZmljIHRvIHRoZSBwYXJ0aWN1bGFyXG4gKiBleHRlbnNpb24gdHlwZS5cbiAqXG4gKiBUaGUgZXh0ZW5zaW9uIHR5cGVzIGRlZmluZWQgaW4gdGhpcyBkb2N1bWVudCBhcmU6XG4gKlxuICogZW51bSB7XG4gKiAgIHNlcnZlcl9uYW1lKDApLCBtYXhfZnJhZ21lbnRfbGVuZ3RoKDEpLFxuICogICBjbGllbnRfY2VydGlmaWNhdGVfdXJsKDIpLCB0cnVzdGVkX2NhX2tleXMoMyksXG4gKiAgIHRydW5jYXRlZF9obWFjKDQpLCBzdGF0dXNfcmVxdWVzdCg1KSwgKDY1NTM1KVxuICogfSBFeHRlbnNpb25UeXBlO1xuICpcbiAqIEBwYXJhbSBjIHRoZSBjb25uZWN0aW9uLlxuICpcbiAqIEByZXR1cm4gdGhlIENsaWVudEhlbGxvIGJ5dGUgYnVmZmVyLlxuICovXG50bHMuY3JlYXRlQ2xpZW50SGVsbG8gPSBmdW5jdGlvbihjKSB7XG4gIC8vIHNhdmUgaGVsbG8gdmVyc2lvblxuICBjLnNlc3Npb24uY2xpZW50SGVsbG9WZXJzaW9uID0ge1xuICAgIG1ham9yOiBjLnZlcnNpb24ubWFqb3IsXG4gICAgbWlub3I6IGMudmVyc2lvbi5taW5vclxuICB9O1xuXG4gIC8vIGNyZWF0ZSBzdXBwb3J0ZWQgY2lwaGVyIHN1aXRlc1xuICB2YXIgY2lwaGVyU3VpdGVzID0gZm9yZ2UudXRpbC5jcmVhdGVCdWZmZXIoKTtcbiAgZm9yKHZhciBpID0gMDsgaSA8IGMuY2lwaGVyU3VpdGVzLmxlbmd0aDsgKytpKSB7XG4gICAgdmFyIGNzID0gYy5jaXBoZXJTdWl0ZXNbaV07XG4gICAgY2lwaGVyU3VpdGVzLnB1dEJ5dGUoY3MuaWRbMF0pO1xuICAgIGNpcGhlclN1aXRlcy5wdXRCeXRlKGNzLmlkWzFdKTtcbiAgfVxuICB2YXIgY1N1aXRlcyA9IGNpcGhlclN1aXRlcy5sZW5ndGgoKTtcblxuICAvLyBjcmVhdGUgc3VwcG9ydGVkIGNvbXByZXNzaW9uIG1ldGhvZHMsIG51bGwgYWx3YXlzIHN1cHBvcnRlZCwgYnV0XG4gIC8vIGFsc28gc3VwcG9ydCBkZWZsYXRlIGlmIGNvbm5lY3Rpb24gaGFzIGluZmxhdGUgYW5kIGRlZmxhdGUgbWV0aG9kc1xuICB2YXIgY29tcHJlc3Npb25NZXRob2RzID0gZm9yZ2UudXRpbC5jcmVhdGVCdWZmZXIoKTtcbiAgY29tcHJlc3Npb25NZXRob2RzLnB1dEJ5dGUodGxzLkNvbXByZXNzaW9uTWV0aG9kLm5vbmUpO1xuICAvLyBGSVhNRTogZGVmbGF0ZSBzdXBwb3J0IGRpc2FibGVkIHVudGlsIGlzc3VlcyB3aXRoIHJhdyBkZWZsYXRlIGRhdGFcbiAgLy8gd2l0aG91dCB6bGliIGhlYWRlcnMgYXJlIHJlc29sdmVkXG4gIC8qXG4gIGlmKGMuaW5mbGF0ZSAhPT0gbnVsbCAmJiBjLmRlZmxhdGUgIT09IG51bGwpIHtcbiAgICBjb21wcmVzc2lvbk1ldGhvZHMucHV0Qnl0ZSh0bHMuQ29tcHJlc3Npb25NZXRob2QuZGVmbGF0ZSk7XG4gIH1cbiAgKi9cbiAgdmFyIGNNZXRob2RzID0gY29tcHJlc3Npb25NZXRob2RzLmxlbmd0aCgpO1xuXG4gIC8vIGNyZWF0ZSBUTFMgU05JIChzZXJ2ZXIgbmFtZSBpbmRpY2F0aW9uKSBleHRlbnNpb24gaWYgdmlydHVhbCBob3N0XG4gIC8vIGhhcyBiZWVuIHNwZWNpZmllZCwgc2VlIFJGQyAzNTQ2XG4gIHZhciBleHRlbnNpb25zID0gZm9yZ2UudXRpbC5jcmVhdGVCdWZmZXIoKTtcbiAgaWYoYy52aXJ0dWFsSG9zdCkge1xuICAgIC8vIGNyZWF0ZSBleHRlbnNpb24gc3RydWN0XG4gICAgdmFyIGV4dCA9IGZvcmdlLnV0aWwuY3JlYXRlQnVmZmVyKCk7XG4gICAgZXh0LnB1dEJ5dGUoMHgwMCk7IC8vIHR5cGUgc2VydmVyX25hbWUgKEV4dGVuc2lvblR5cGUgaXMgMiBieXRlcylcbiAgICBleHQucHV0Qnl0ZSgweDAwKTtcblxuICAgIC8qIEluIG9yZGVyIHRvIHByb3ZpZGUgdGhlIHNlcnZlciBuYW1lLCBjbGllbnRzIE1BWSBpbmNsdWRlIGFuXG4gICAgICogZXh0ZW5zaW9uIG9mIHR5cGUgXCJzZXJ2ZXJfbmFtZVwiIGluIHRoZSAoZXh0ZW5kZWQpIGNsaWVudCBoZWxsby5cbiAgICAgKiBUaGUgXCJleHRlbnNpb25fZGF0YVwiIGZpZWxkIG9mIHRoaXMgZXh0ZW5zaW9uIFNIQUxMIGNvbnRhaW5cbiAgICAgKiBcIlNlcnZlck5hbWVMaXN0XCIgd2hlcmU6XG4gICAgICpcbiAgICAgKiBzdHJ1Y3Qge1xuICAgICAqICAgTmFtZVR5cGUgbmFtZV90eXBlO1xuICAgICAqICAgc2VsZWN0KG5hbWVfdHlwZSkge1xuICAgICAqICAgICBjYXNlIGhvc3RfbmFtZTogSG9zdE5hbWU7XG4gICAgICogICB9IG5hbWU7XG4gICAgICogfSBTZXJ2ZXJOYW1lO1xuICAgICAqXG4gICAgICogZW51bSB7XG4gICAgICogICBob3N0X25hbWUoMCksICgyNTUpXG4gICAgICogfSBOYW1lVHlwZTtcbiAgICAgKlxuICAgICAqIG9wYXF1ZSBIb3N0TmFtZTwxLi4yXjE2LTE+O1xuICAgICAqXG4gICAgICogc3RydWN0IHtcbiAgICAgKiAgIFNlcnZlck5hbWUgc2VydmVyX25hbWVfbGlzdDwxLi4yXjE2LTE+XG4gICAgICogfSBTZXJ2ZXJOYW1lTGlzdDtcbiAgICAgKi9cbiAgICB2YXIgc2VydmVyTmFtZSA9IGZvcmdlLnV0aWwuY3JlYXRlQnVmZmVyKCk7XG4gICAgc2VydmVyTmFtZS5wdXRCeXRlKDB4MDApOyAvLyB0eXBlIGhvc3RfbmFtZVxuICAgIHdyaXRlVmVjdG9yKHNlcnZlck5hbWUsIDIsIGZvcmdlLnV0aWwuY3JlYXRlQnVmZmVyKGMudmlydHVhbEhvc3QpKTtcblxuICAgIC8vIFNlcnZlck5hbWVMaXN0IGlzIGluIGV4dGVuc2lvbl9kYXRhXG4gICAgdmFyIHNuTGlzdCA9IGZvcmdlLnV0aWwuY3JlYXRlQnVmZmVyKCk7XG4gICAgd3JpdGVWZWN0b3Ioc25MaXN0LCAyLCBzZXJ2ZXJOYW1lKTtcbiAgICB3cml0ZVZlY3RvcihleHQsIDIsIHNuTGlzdCk7XG4gICAgZXh0ZW5zaW9ucy5wdXRCdWZmZXIoZXh0KTtcbiAgfVxuICB2YXIgZXh0TGVuZ3RoID0gZXh0ZW5zaW9ucy5sZW5ndGgoKTtcbiAgaWYoZXh0TGVuZ3RoID4gMCkge1xuICAgIC8vIGFkZCBleHRlbnNpb24gdmVjdG9yIGxlbmd0aFxuICAgIGV4dExlbmd0aCArPSAyO1xuICB9XG5cbiAgLy8gZGV0ZXJtaW5lIGxlbmd0aCBvZiB0aGUgaGFuZHNoYWtlIG1lc3NhZ2VcbiAgLy8gY2lwaGVyIHN1aXRlcyBhbmQgY29tcHJlc3Npb24gbWV0aG9kcyBzaXplIHdpbGwgbmVlZCB0byBiZVxuICAvLyB1cGRhdGVkIGlmIG1vcmUgZ2V0IGFkZGVkIHRvIHRoZSBsaXN0XG4gIHZhciBzZXNzaW9uSWQgPSBjLnNlc3Npb24uaWQ7XG4gIHZhciBsZW5ndGggPVxuICAgIHNlc3Npb25JZC5sZW5ndGggKyAxICsgLy8gc2Vzc2lvbiBJRCB2ZWN0b3JcbiAgICAyICsgICAgICAgICAgICAgICAgICAgIC8vIHZlcnNpb24gKG1ham9yICsgbWlub3IpXG4gICAgNCArIDI4ICsgICAgICAgICAgICAgICAvLyByYW5kb20gdGltZSBhbmQgcmFuZG9tIGJ5dGVzXG4gICAgMiArIGNTdWl0ZXMgKyAgICAgICAgICAvLyBjaXBoZXIgc3VpdGVzIHZlY3RvclxuICAgIDEgKyBjTWV0aG9kcyArICAgICAgICAgLy8gY29tcHJlc3Npb24gbWV0aG9kcyB2ZWN0b3JcbiAgICBleHRMZW5ndGg7ICAgICAgICAgICAgIC8vIGV4dGVuc2lvbnMgdmVjdG9yXG5cbiAgLy8gYnVpbGQgcmVjb3JkIGZyYWdtZW50XG4gIHZhciBydmFsID0gZm9yZ2UudXRpbC5jcmVhdGVCdWZmZXIoKTtcbiAgcnZhbC5wdXRCeXRlKHRscy5IYW5kc2hha2VUeXBlLmNsaWVudF9oZWxsbyk7XG4gIHJ2YWwucHV0SW50MjQobGVuZ3RoKTsgICAgICAgICAgICAgICAgICAgICAvLyBoYW5kc2hha2UgbGVuZ3RoXG4gIHJ2YWwucHV0Qnl0ZShjLnZlcnNpb24ubWFqb3IpOyAgICAgICAgICAgICAvLyBtYWpvciB2ZXJzaW9uXG4gIHJ2YWwucHV0Qnl0ZShjLnZlcnNpb24ubWlub3IpOyAgICAgICAgICAgICAvLyBtaW5vciB2ZXJzaW9uXG4gIHJ2YWwucHV0Qnl0ZXMoYy5zZXNzaW9uLnNwLmNsaWVudF9yYW5kb20pOyAvLyByYW5kb20gdGltZSArIGJ5dGVzXG4gIHdyaXRlVmVjdG9yKHJ2YWwsIDEsIGZvcmdlLnV0aWwuY3JlYXRlQnVmZmVyKHNlc3Npb25JZCkpO1xuICB3cml0ZVZlY3RvcihydmFsLCAyLCBjaXBoZXJTdWl0ZXMpO1xuICB3cml0ZVZlY3RvcihydmFsLCAxLCBjb21wcmVzc2lvbk1ldGhvZHMpO1xuICBpZihleHRMZW5ndGggPiAwKSB7XG4gICAgd3JpdGVWZWN0b3IocnZhbCwgMiwgZXh0ZW5zaW9ucyk7XG4gIH1cbiAgcmV0dXJuIHJ2YWw7XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBTZXJ2ZXJIZWxsbyBtZXNzYWdlLlxuICpcbiAqIEBwYXJhbSBjIHRoZSBjb25uZWN0aW9uLlxuICpcbiAqIEByZXR1cm4gdGhlIFNlcnZlckhlbGxvIGJ5dGUgYnVmZmVyLlxuICovXG50bHMuY3JlYXRlU2VydmVySGVsbG8gPSBmdW5jdGlvbihjKSB7XG4gIC8vIGRldGVybWluZSBsZW5ndGggb2YgdGhlIGhhbmRzaGFrZSBtZXNzYWdlXG4gIHZhciBzZXNzaW9uSWQgPSBjLnNlc3Npb24uaWQ7XG4gIHZhciBsZW5ndGggPVxuICAgIHNlc3Npb25JZC5sZW5ndGggKyAxICsgLy8gc2Vzc2lvbiBJRCB2ZWN0b3JcbiAgICAyICsgICAgICAgICAgICAgICAgICAgIC8vIHZlcnNpb24gKG1ham9yICsgbWlub3IpXG4gICAgNCArIDI4ICsgICAgICAgICAgICAgICAvLyByYW5kb20gdGltZSBhbmQgcmFuZG9tIGJ5dGVzXG4gICAgMiArICAgICAgICAgICAgICAgICAgICAvLyBjaG9zZW4gY2lwaGVyIHN1aXRlXG4gICAgMTsgICAgICAgICAgICAgICAgICAgICAvLyBjaG9zZW4gY29tcHJlc3Npb24gbWV0aG9kXG5cbiAgLy8gYnVpbGQgcmVjb3JkIGZyYWdtZW50XG4gIHZhciBydmFsID0gZm9yZ2UudXRpbC5jcmVhdGVCdWZmZXIoKTtcbiAgcnZhbC5wdXRCeXRlKHRscy5IYW5kc2hha2VUeXBlLnNlcnZlcl9oZWxsbyk7XG4gIHJ2YWwucHV0SW50MjQobGVuZ3RoKTsgICAgICAgICAgICAgICAgICAgICAvLyBoYW5kc2hha2UgbGVuZ3RoXG4gIHJ2YWwucHV0Qnl0ZShjLnZlcnNpb24ubWFqb3IpOyAgICAgICAgICAgICAvLyBtYWpvciB2ZXJzaW9uXG4gIHJ2YWwucHV0Qnl0ZShjLnZlcnNpb24ubWlub3IpOyAgICAgICAgICAgICAvLyBtaW5vciB2ZXJzaW9uXG4gIHJ2YWwucHV0Qnl0ZXMoYy5zZXNzaW9uLnNwLnNlcnZlcl9yYW5kb20pOyAvLyByYW5kb20gdGltZSArIGJ5dGVzXG4gIHdyaXRlVmVjdG9yKHJ2YWwsIDEsIGZvcmdlLnV0aWwuY3JlYXRlQnVmZmVyKHNlc3Npb25JZCkpO1xuICBydmFsLnB1dEJ5dGUoYy5zZXNzaW9uLmNpcGhlclN1aXRlLmlkWzBdKTtcbiAgcnZhbC5wdXRCeXRlKGMuc2Vzc2lvbi5jaXBoZXJTdWl0ZS5pZFsxXSk7XG4gIHJ2YWwucHV0Qnl0ZShjLnNlc3Npb24uY29tcHJlc3Npb25NZXRob2QpO1xuICByZXR1cm4gcnZhbDtcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIENlcnRpZmljYXRlIG1lc3NhZ2UuXG4gKlxuICogV2hlbiB0aGlzIG1lc3NhZ2Ugd2lsbCBiZSBzZW50OlxuICogICBUaGlzIGlzIHRoZSBmaXJzdCBtZXNzYWdlIHRoZSBjbGllbnQgY2FuIHNlbmQgYWZ0ZXIgcmVjZWl2aW5nIGEgc2VydmVyXG4gKiAgIGhlbGxvIGRvbmUgbWVzc2FnZSBhbmQgdGhlIGZpcnN0IG1lc3NhZ2UgdGhlIHNlcnZlciBjYW4gc2VuZCBhZnRlclxuICogICBzZW5kaW5nIGEgU2VydmVySGVsbG8uIFRoaXMgY2xpZW50IG1lc3NhZ2UgaXMgb25seSBzZW50IGlmIHRoZSBzZXJ2ZXJcbiAqICAgcmVxdWVzdHMgYSBjZXJ0aWZpY2F0ZS4gSWYgbm8gc3VpdGFibGUgY2VydGlmaWNhdGUgaXMgYXZhaWxhYmxlLCB0aGVcbiAqICAgY2xpZW50IHNob3VsZCBzZW5kIGEgY2VydGlmaWNhdGUgbWVzc2FnZSBjb250YWluaW5nIG5vIGNlcnRpZmljYXRlcy4gSWZcbiAqICAgY2xpZW50IGF1dGhlbnRpY2F0aW9uIGlzIHJlcXVpcmVkIGJ5IHRoZSBzZXJ2ZXIgZm9yIHRoZSBoYW5kc2hha2UgdG9cbiAqICAgY29udGludWUsIGl0IG1heSByZXNwb25kIHdpdGggYSBmYXRhbCBoYW5kc2hha2UgZmFpbHVyZSBhbGVydC5cbiAqXG4gKiBvcGFxdWUgQVNOLjFDZXJ0PDEuLjJeMjQtMT47XG4gKlxuICogc3RydWN0IHtcbiAqICAgQVNOLjFDZXJ0IGNlcnRpZmljYXRlX2xpc3Q8MC4uMl4yNC0xPjtcbiAqIH0gQ2VydGlmaWNhdGU7XG4gKlxuICogQHBhcmFtIGMgdGhlIGNvbm5lY3Rpb24uXG4gKlxuICogQHJldHVybiB0aGUgQ2VydGlmaWNhdGUgYnl0ZSBidWZmZXIuXG4gKi9cbnRscy5jcmVhdGVDZXJ0aWZpY2F0ZSA9IGZ1bmN0aW9uKGMpIHtcbiAgLy8gVE9ETzogY2hlY2sgY2VydGlmaWNhdGUgcmVxdWVzdCB0byBlbnN1cmUgdHlwZXMgYXJlIHN1cHBvcnRlZFxuXG4gIC8vIGdldCBhIGNlcnRpZmljYXRlIChhIGNlcnRpZmljYXRlIGFzIGEgUEVNIHN0cmluZylcbiAgdmFyIGNsaWVudCA9IChjLmVudGl0eSA9PT0gdGxzLkNvbm5lY3Rpb25FbmQuY2xpZW50KTtcbiAgdmFyIGNlcnQgPSBudWxsO1xuICBpZihjLmdldENlcnRpZmljYXRlKSB7XG4gICAgdmFyIGhpbnQ7XG4gICAgaWYoY2xpZW50KSB7XG4gICAgICBoaW50ID0gYy5zZXNzaW9uLmNlcnRpZmljYXRlUmVxdWVzdDtcbiAgICB9IGVsc2Uge1xuICAgICAgaGludCA9IGMuc2Vzc2lvbi5leHRlbnNpb25zLnNlcnZlcl9uYW1lLnNlcnZlck5hbWVMaXN0O1xuICAgIH1cbiAgICBjZXJ0ID0gYy5nZXRDZXJ0aWZpY2F0ZShjLCBoaW50KTtcbiAgfVxuXG4gIC8vIGJ1ZmZlciB0byBob2xkIGNlcnRpZmljYXRlIGxpc3RcbiAgdmFyIGNlcnRMaXN0ID0gZm9yZ2UudXRpbC5jcmVhdGVCdWZmZXIoKTtcbiAgaWYoY2VydCAhPT0gbnVsbCkge1xuICAgIHRyeSB7XG4gICAgICAvLyBub3JtYWxpemUgY2VydCB0byBhIGNoYWluIG9mIGNlcnRpZmljYXRlc1xuICAgICAgaWYoIWZvcmdlLnV0aWwuaXNBcnJheShjZXJ0KSkge1xuICAgICAgICBjZXJ0ID0gW2NlcnRdO1xuICAgICAgfVxuICAgICAgdmFyIGFzbjEgPSBudWxsO1xuICAgICAgZm9yKHZhciBpID0gMDsgaSA8IGNlcnQubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgdmFyIG1zZyA9IGZvcmdlLnBlbS5kZWNvZGUoY2VydFtpXSlbMF07XG4gICAgICAgIGlmKG1zZy50eXBlICE9PSAnQ0VSVElGSUNBVEUnICYmXG4gICAgICAgICAgbXNnLnR5cGUgIT09ICdYNTA5IENFUlRJRklDQVRFJyAmJlxuICAgICAgICAgIG1zZy50eXBlICE9PSAnVFJVU1RFRCBDRVJUSUZJQ0FURScpIHtcbiAgICAgICAgICB2YXIgZXJyb3IgPSBuZXcgRXJyb3IoJ0NvdWxkIG5vdCBjb252ZXJ0IGNlcnRpZmljYXRlIGZyb20gUEVNOyBQRU0gJyArXG4gICAgICAgICAgICAnaGVhZGVyIHR5cGUgaXMgbm90IFwiQ0VSVElGSUNBVEVcIiwgXCJYNTA5IENFUlRJRklDQVRFXCIsIG9yICcgK1xuICAgICAgICAgICAgJ1wiVFJVU1RFRCBDRVJUSUZJQ0FURVwiLicpO1xuICAgICAgICAgIGVycm9yLmhlYWRlclR5cGUgPSBtc2cudHlwZTtcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICBpZihtc2cucHJvY1R5cGUgJiYgbXNnLnByb2NUeXBlLnR5cGUgPT09ICdFTkNSWVBURUQnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgY29udmVydCBjZXJ0aWZpY2F0ZSBmcm9tIFBFTTsgUEVNIGlzIGVuY3J5cHRlZC4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBkZXIgPSBmb3JnZS51dGlsLmNyZWF0ZUJ1ZmZlcihtc2cuYm9keSk7XG4gICAgICAgIGlmKGFzbjEgPT09IG51bGwpIHtcbiAgICAgICAgICBhc24xID0gZm9yZ2UuYXNuMS5mcm9tRGVyKGRlci5ieXRlcygpLCBmYWxzZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjZXJ0aWZpY2F0ZSBlbnRyeSBpcyBpdHNlbGYgYSB2ZWN0b3Igd2l0aCAzIGxlbmd0aCBieXRlc1xuICAgICAgICB2YXIgY2VydEJ1ZmZlciA9IGZvcmdlLnV0aWwuY3JlYXRlQnVmZmVyKCk7XG4gICAgICAgIHdyaXRlVmVjdG9yKGNlcnRCdWZmZXIsIDMsIGRlcik7XG5cbiAgICAgICAgLy8gYWRkIGNlcnQgdmVjdG9yIHRvIGNlcnQgbGlzdCB2ZWN0b3JcbiAgICAgICAgY2VydExpc3QucHV0QnVmZmVyKGNlcnRCdWZmZXIpO1xuICAgICAgfVxuXG4gICAgICAvLyBzYXZlIGNlcnRpZmljYXRlXG4gICAgICBjZXJ0ID0gZm9yZ2UucGtpLmNlcnRpZmljYXRlRnJvbUFzbjEoYXNuMSk7XG4gICAgICBpZihjbGllbnQpIHtcbiAgICAgICAgYy5zZXNzaW9uLmNsaWVudENlcnRpZmljYXRlID0gY2VydDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGMuc2Vzc2lvbi5zZXJ2ZXJDZXJ0aWZpY2F0ZSA9IGNlcnQ7XG4gICAgICB9XG4gICAgfSBjYXRjaChleCkge1xuICAgICAgcmV0dXJuIGMuZXJyb3IoYywge1xuICAgICAgICBtZXNzYWdlOiAnQ291bGQgbm90IHNlbmQgY2VydGlmaWNhdGUgbGlzdC4nLFxuICAgICAgICBjYXVzZTogZXgsXG4gICAgICAgIHNlbmQ6IHRydWUsXG4gICAgICAgIGFsZXJ0OiB7XG4gICAgICAgICAgbGV2ZWw6IHRscy5BbGVydC5MZXZlbC5mYXRhbCxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogdGxzLkFsZXJ0LkRlc2NyaXB0aW9uLmJhZF9jZXJ0aWZpY2F0ZVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvLyBkZXRlcm1pbmUgbGVuZ3RoIG9mIHRoZSBoYW5kc2hha2UgbWVzc2FnZVxuICB2YXIgbGVuZ3RoID0gMyArIGNlcnRMaXN0Lmxlbmd0aCgpOyAvLyBjZXJ0IGxpc3QgdmVjdG9yXG5cbiAgLy8gYnVpbGQgcmVjb3JkIGZyYWdtZW50XG4gIHZhciBydmFsID0gZm9yZ2UudXRpbC5jcmVhdGVCdWZmZXIoKTtcbiAgcnZhbC5wdXRCeXRlKHRscy5IYW5kc2hha2VUeXBlLmNlcnRpZmljYXRlKTtcbiAgcnZhbC5wdXRJbnQyNChsZW5ndGgpO1xuICB3cml0ZVZlY3RvcihydmFsLCAzLCBjZXJ0TGlzdCk7XG4gIHJldHVybiBydmFsO1xufTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgQ2xpZW50S2V5RXhjaGFuZ2UgbWVzc2FnZS5cbiAqXG4gKiBXaGVuIHRoaXMgbWVzc2FnZSB3aWxsIGJlIHNlbnQ6XG4gKiAgIFRoaXMgbWVzc2FnZSBpcyBhbHdheXMgc2VudCBieSB0aGUgY2xpZW50LiBJdCB3aWxsIGltbWVkaWF0ZWx5IGZvbGxvdyB0aGVcbiAqICAgY2xpZW50IGNlcnRpZmljYXRlIG1lc3NhZ2UsIGlmIGl0IGlzIHNlbnQuIE90aGVyd2lzZSBpdCB3aWxsIGJlIHRoZSBmaXJzdFxuICogICBtZXNzYWdlIHNlbnQgYnkgdGhlIGNsaWVudCBhZnRlciBpdCByZWNlaXZlcyB0aGUgc2VydmVyIGhlbGxvIGRvbmVcbiAqICAgbWVzc2FnZS5cbiAqXG4gKiBNZWFuaW5nIG9mIHRoaXMgbWVzc2FnZTpcbiAqICAgV2l0aCB0aGlzIG1lc3NhZ2UsIHRoZSBwcmVtYXN0ZXIgc2VjcmV0IGlzIHNldCwgZWl0aGVyIHRob3VnaCBkaXJlY3RcbiAqICAgdHJhbnNtaXNzaW9uIG9mIHRoZSBSU0EtZW5jcnlwdGVkIHNlY3JldCwgb3IgYnkgdGhlIHRyYW5zbWlzc2lvbiBvZlxuICogICBEaWZmaWUtSGVsbG1hbiBwYXJhbWV0ZXJzIHdoaWNoIHdpbGwgYWxsb3cgZWFjaCBzaWRlIHRvIGFncmVlIHVwb24gdGhlXG4gKiAgIHNhbWUgcHJlbWFzdGVyIHNlY3JldC4gV2hlbiB0aGUga2V5IGV4Y2hhbmdlIG1ldGhvZCBpcyBESF9SU0Egb3IgREhfRFNTLFxuICogICBjbGllbnQgY2VydGlmaWNhdGlvbiBoYXMgYmVlbiByZXF1ZXN0ZWQsIGFuZCB0aGUgY2xpZW50IHdhcyBhYmxlIHRvXG4gKiAgIHJlc3BvbmQgd2l0aCBhIGNlcnRpZmljYXRlIHdoaWNoIGNvbnRhaW5lZCBhIERpZmZpZS1IZWxsbWFuIHB1YmxpYyBrZXlcbiAqICAgd2hvc2UgcGFyYW1ldGVycyAoZ3JvdXAgYW5kIGdlbmVyYXRvcikgbWF0Y2hlZCB0aG9zZSBzcGVjaWZpZWQgYnkgdGhlXG4gKiAgIHNlcnZlciBpbiBpdHMgY2VydGlmaWNhdGUsIHRoaXMgbWVzc2FnZSB3aWxsIG5vdCBjb250YWluIGFueSBkYXRhLlxuICpcbiAqIE1lYW5pbmcgb2YgdGhpcyBtZXNzYWdlOlxuICogICBJZiBSU0EgaXMgYmVpbmcgdXNlZCBmb3Iga2V5IGFncmVlbWVudCBhbmQgYXV0aGVudGljYXRpb24sIHRoZSBjbGllbnRcbiAqICAgZ2VuZXJhdGVzIGEgNDgtYnl0ZSBwcmVtYXN0ZXIgc2VjcmV0LCBlbmNyeXB0cyBpdCB1c2luZyB0aGUgcHVibGljIGtleVxuICogICBmcm9tIHRoZSBzZXJ2ZXIncyBjZXJ0aWZpY2F0ZSBvciB0aGUgdGVtcG9yYXJ5IFJTQSBrZXkgcHJvdmlkZWQgaW4gYVxuICogICBzZXJ2ZXIga2V5IGV4Y2hhbmdlIG1lc3NhZ2UsIGFuZCBzZW5kcyB0aGUgcmVzdWx0IGluIGFuIGVuY3J5cHRlZFxuICogICBwcmVtYXN0ZXIgc2VjcmV0IG1lc3NhZ2UuIFRoaXMgc3RydWN0dXJlIGlzIGEgdmFyaWFudCBvZiB0aGUgY2xpZW50XG4gKiAgIGtleSBleGNoYW5nZSBtZXNzYWdlLCBub3QgYSBtZXNzYWdlIGluIGl0c2VsZi5cbiAqXG4gKiBzdHJ1Y3Qge1xuICogICBzZWxlY3QoS2V5RXhjaGFuZ2VBbGdvcml0aG0pIHtcbiAqICAgICBjYXNlIHJzYTogRW5jcnlwdGVkUHJlTWFzdGVyU2VjcmV0O1xuICogICAgIGNhc2UgZGlmZmllX2hlbGxtYW46IENsaWVudERpZmZpZUhlbGxtYW5QdWJsaWM7XG4gKiAgIH0gZXhjaGFuZ2Vfa2V5cztcbiAqIH0gQ2xpZW50S2V5RXhjaGFuZ2U7XG4gKlxuICogc3RydWN0IHtcbiAqICAgUHJvdG9jb2xWZXJzaW9uIGNsaWVudF92ZXJzaW9uO1xuICogICBvcGFxdWUgcmFuZG9tWzQ2XTtcbiAqIH0gUHJlTWFzdGVyU2VjcmV0O1xuICpcbiAqIHN0cnVjdCB7XG4gKiAgIHB1YmxpYy1rZXktZW5jcnlwdGVkIFByZU1hc3RlclNlY3JldCBwcmVfbWFzdGVyX3NlY3JldDtcbiAqIH0gRW5jcnlwdGVkUHJlTWFzdGVyU2VjcmV0O1xuICpcbiAqIEEgcHVibGljLWtleS1lbmNyeXB0ZWQgZWxlbWVudCBpcyBlbmNvZGVkIGFzIGEgdmVjdG9yIDwwLi4yXjE2LTE+LlxuICpcbiAqIEBwYXJhbSBjIHRoZSBjb25uZWN0aW9uLlxuICpcbiAqIEByZXR1cm4gdGhlIENsaWVudEtleUV4Y2hhbmdlIGJ5dGUgYnVmZmVyLlxuICovXG50bHMuY3JlYXRlQ2xpZW50S2V5RXhjaGFuZ2UgPSBmdW5jdGlvbihjKSB7XG4gIC8vIGNyZWF0ZSBidWZmZXIgdG8gZW5jcnlwdFxuICB2YXIgYiA9IGZvcmdlLnV0aWwuY3JlYXRlQnVmZmVyKCk7XG5cbiAgLy8gYWRkIGhpZ2hlc3QgY2xpZW50LXN1cHBvcnRlZCBwcm90b2NvbCB0byBoZWxwIHNlcnZlciBhdm9pZCB2ZXJzaW9uXG4gIC8vIHJvbGxiYWNrIGF0dGFja3NcbiAgYi5wdXRCeXRlKGMuc2Vzc2lvbi5jbGllbnRIZWxsb1ZlcnNpb24ubWFqb3IpO1xuICBiLnB1dEJ5dGUoYy5zZXNzaW9uLmNsaWVudEhlbGxvVmVyc2lvbi5taW5vcik7XG5cbiAgLy8gZ2VuZXJhdGUgYW5kIGFkZCA0NiByYW5kb20gYnl0ZXNcbiAgYi5wdXRCeXRlcyhmb3JnZS5yYW5kb20uZ2V0Qnl0ZXMoNDYpKTtcblxuICAvLyBzYXZlIHByZS1tYXN0ZXIgc2VjcmV0XG4gIHZhciBzcCA9IGMuc2Vzc2lvbi5zcDtcbiAgc3AucHJlX21hc3Rlcl9zZWNyZXQgPSBiLmdldEJ5dGVzKCk7XG5cbiAgLy8gUlNBLWVuY3J5cHQgdGhlIHByZS1tYXN0ZXIgc2VjcmV0XG4gIHZhciBrZXkgPSBjLnNlc3Npb24uc2VydmVyQ2VydGlmaWNhdGUucHVibGljS2V5O1xuICBiID0ga2V5LmVuY3J5cHQoc3AucHJlX21hc3Rlcl9zZWNyZXQpO1xuXG4gIC8qIE5vdGU6IFRoZSBlbmNyeXB0ZWQgcHJlLW1hc3RlciBzZWNyZXQgd2lsbCBiZSBzdG9yZWQgaW4gYVxuICAgIHB1YmxpYy1rZXktZW5jcnlwdGVkIG9wYXF1ZSB2ZWN0b3IgdGhhdCBoYXMgdGhlIGxlbmd0aCBwcmVmaXhlZCB1c2luZ1xuICAgIDIgYnl0ZXMsIHNvIGluY2x1ZGUgdGhvc2UgMiBieXRlcyBpbiB0aGUgaGFuZHNoYWtlIG1lc3NhZ2UgbGVuZ3RoLiBUaGlzXG4gICAgaXMgZG9uZSBhcyBhIG1pbm9yIG9wdGltaXphdGlvbiBpbnN0ZWFkIG9mIGNhbGxpbmcgd3JpdGVWZWN0b3IoKS4gKi9cblxuICAvLyBkZXRlcm1pbmUgbGVuZ3RoIG9mIHRoZSBoYW5kc2hha2UgbWVzc2FnZVxuICB2YXIgbGVuZ3RoID0gYi5sZW5ndGggKyAyO1xuXG4gIC8vIGJ1aWxkIHJlY29yZCBmcmFnbWVudFxuICB2YXIgcnZhbCA9IGZvcmdlLnV0aWwuY3JlYXRlQnVmZmVyKCk7XG4gIHJ2YWwucHV0Qnl0ZSh0bHMuSGFuZHNoYWtlVHlwZS5jbGllbnRfa2V5X2V4Y2hhbmdlKTtcbiAgcnZhbC5wdXRJbnQyNChsZW5ndGgpO1xuICAvLyBhZGQgdmVjdG9yIGxlbmd0aCBieXRlc1xuICBydmFsLnB1dEludDE2KGIubGVuZ3RoKTtcbiAgcnZhbC5wdXRCeXRlcyhiKTtcbiAgcmV0dXJuIHJ2YWw7XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBTZXJ2ZXJLZXlFeGNoYW5nZSBtZXNzYWdlLlxuICpcbiAqIEBwYXJhbSBjIHRoZSBjb25uZWN0aW9uLlxuICpcbiAqIEByZXR1cm4gdGhlIFNlcnZlcktleUV4Y2hhbmdlIGJ5dGUgYnVmZmVyLlxuICovXG50bHMuY3JlYXRlU2VydmVyS2V5RXhjaGFuZ2UgPSBmdW5jdGlvbihjKSB7XG4gIC8vIHRoaXMgaW1wbGVtZW50YXRpb24gb25seSBzdXBwb3J0cyBSU0EsIG5vIERpZmZpZS1IZWxsbWFuIHN1cHBvcnQsXG4gIC8vIHNvIHRoaXMgcmVjb3JkIGlzIGVtcHR5XG5cbiAgLy8gZGV0ZXJtaW5lIGxlbmd0aCBvZiB0aGUgaGFuZHNoYWtlIG1lc3NhZ2VcbiAgdmFyIGxlbmd0aCA9IDA7XG5cbiAgLy8gYnVpbGQgcmVjb3JkIGZyYWdtZW50XG4gIHZhciBydmFsID0gZm9yZ2UudXRpbC5jcmVhdGVCdWZmZXIoKTtcbiAgaWYobGVuZ3RoID4gMCkge1xuICAgIHJ2YWwucHV0Qnl0ZSh0bHMuSGFuZHNoYWtlVHlwZS5zZXJ2ZXJfa2V5X2V4Y2hhbmdlKTtcbiAgICBydmFsLnB1dEludDI0KGxlbmd0aCk7XG4gIH1cbiAgcmV0dXJuIHJ2YWw7XG59O1xuXG4vKipcbiAqIEdldHMgdGhlIHNpZ25lZCBkYXRhIHVzZWQgdG8gdmVyaWZ5IGEgY2xpZW50LXNpZGUgY2VydGlmaWNhdGUuIFNlZVxuICogdGxzLmNyZWF0ZUNlcnRpZmljYXRlVmVyaWZ5KCkgZm9yIGRldGFpbHMuXG4gKlxuICogQHBhcmFtIGMgdGhlIGNvbm5lY3Rpb24uXG4gKiBAcGFyYW0gY2FsbGJhY2sgdGhlIGNhbGxiYWNrIHRvIGNhbGwgb25jZSB0aGUgc2lnbmVkIGRhdGEgaXMgcmVhZHkuXG4gKi9cbnRscy5nZXRDbGllbnRTaWduYXR1cmUgPSBmdW5jdGlvbihjLCBjYWxsYmFjaykge1xuICAvLyBnZW5lcmF0ZSBkYXRhIHRvIFJTQSBlbmNyeXB0XG4gIHZhciBiID0gZm9yZ2UudXRpbC5jcmVhdGVCdWZmZXIoKTtcbiAgYi5wdXRCdWZmZXIoYy5zZXNzaW9uLm1kNS5kaWdlc3QoKSk7XG4gIGIucHV0QnVmZmVyKGMuc2Vzc2lvbi5zaGExLmRpZ2VzdCgpKTtcbiAgYiA9IGIuZ2V0Qnl0ZXMoKTtcblxuICAvLyBjcmVhdGUgZGVmYXVsdCBzaWduaW5nIGZ1bmN0aW9uIGFzIG5lY2Vzc2FyeVxuICBjLmdldFNpZ25hdHVyZSA9IGMuZ2V0U2lnbmF0dXJlIHx8IGZ1bmN0aW9uKGMsIGIsIGNhbGxiYWNrKSB7XG4gICAgLy8gZG8gcnNhIGVuY3J5cHRpb24sIGNhbGwgY2FsbGJhY2tcbiAgICB2YXIgcHJpdmF0ZUtleSA9IG51bGw7XG4gICAgaWYoYy5nZXRQcml2YXRlS2V5KSB7XG4gICAgICB0cnkge1xuICAgICAgICBwcml2YXRlS2V5ID0gYy5nZXRQcml2YXRlS2V5KGMsIGMuc2Vzc2lvbi5jbGllbnRDZXJ0aWZpY2F0ZSk7XG4gICAgICAgIHByaXZhdGVLZXkgPSBmb3JnZS5wa2kucHJpdmF0ZUtleUZyb21QZW0ocHJpdmF0ZUtleSk7XG4gICAgICB9IGNhdGNoKGV4KSB7XG4gICAgICAgIGMuZXJyb3IoYywge1xuICAgICAgICAgIG1lc3NhZ2U6ICdDb3VsZCBub3QgZ2V0IHByaXZhdGUga2V5LicsXG4gICAgICAgICAgY2F1c2U6IGV4LFxuICAgICAgICAgIHNlbmQ6IHRydWUsXG4gICAgICAgICAgYWxlcnQ6IHtcbiAgICAgICAgICAgIGxldmVsOiB0bHMuQWxlcnQuTGV2ZWwuZmF0YWwsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogdGxzLkFsZXJ0LkRlc2NyaXB0aW9uLmludGVybmFsX2Vycm9yXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYocHJpdmF0ZUtleSA9PT0gbnVsbCkge1xuICAgICAgYy5lcnJvcihjLCB7XG4gICAgICAgIG1lc3NhZ2U6ICdObyBwcml2YXRlIGtleSBzZXQuJyxcbiAgICAgICAgc2VuZDogdHJ1ZSxcbiAgICAgICAgYWxlcnQ6IHtcbiAgICAgICAgICBsZXZlbDogdGxzLkFsZXJ0LkxldmVsLmZhdGFsLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiB0bHMuQWxlcnQuRGVzY3JpcHRpb24uaW50ZXJuYWxfZXJyb3JcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGIgPSBwcml2YXRlS2V5LnNpZ24oYiwgbnVsbCk7XG4gICAgfVxuICAgIGNhbGxiYWNrKGMsIGIpO1xuICB9O1xuXG4gIC8vIGdldCBjbGllbnQgc2lnbmF0dXJlXG4gIGMuZ2V0U2lnbmF0dXJlKGMsIGIsIGNhbGxiYWNrKTtcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIENlcnRpZmljYXRlVmVyaWZ5IG1lc3NhZ2UuXG4gKlxuICogTWVhbmluZyBvZiB0aGlzIG1lc3NhZ2U6XG4gKiAgIFRoaXMgc3RydWN0dXJlIGNvbnZleXMgdGhlIGNsaWVudCdzIERpZmZpZS1IZWxsbWFuIHB1YmxpYyB2YWx1ZVxuICogICAoWWMpIGlmIGl0IHdhcyBub3QgYWxyZWFkeSBpbmNsdWRlZCBpbiB0aGUgY2xpZW50J3MgY2VydGlmaWNhdGUuXG4gKiAgIFRoZSBlbmNvZGluZyB1c2VkIGZvciBZYyBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBlbnVtZXJhdGVkXG4gKiAgIFB1YmxpY1ZhbHVlRW5jb2RpbmcuIFRoaXMgc3RydWN0dXJlIGlzIGEgdmFyaWFudCBvZiB0aGUgY2xpZW50XG4gKiAgIGtleSBleGNoYW5nZSBtZXNzYWdlLCBub3QgYSBtZXNzYWdlIGluIGl0c2VsZi5cbiAqXG4gKiBXaGVuIHRoaXMgbWVzc2FnZSB3aWxsIGJlIHNlbnQ6XG4gKiAgIFRoaXMgbWVzc2FnZSBpcyB1c2VkIHRvIHByb3ZpZGUgZXhwbGljaXQgdmVyaWZpY2F0aW9uIG9mIGEgY2xpZW50XG4gKiAgIGNlcnRpZmljYXRlLiBUaGlzIG1lc3NhZ2UgaXMgb25seSBzZW50IGZvbGxvd2luZyBhIGNsaWVudFxuICogICBjZXJ0aWZpY2F0ZSB0aGF0IGhhcyBzaWduaW5nIGNhcGFiaWxpdHkgKGkuZS4gYWxsIGNlcnRpZmljYXRlc1xuICogICBleGNlcHQgdGhvc2UgY29udGFpbmluZyBmaXhlZCBEaWZmaWUtSGVsbG1hbiBwYXJhbWV0ZXJzKS4gV2hlblxuICogICBzZW50LCBpdCB3aWxsIGltbWVkaWF0ZWx5IGZvbGxvdyB0aGUgY2xpZW50IGtleSBleGNoYW5nZSBtZXNzYWdlLlxuICpcbiAqIHN0cnVjdCB7XG4gKiAgIFNpZ25hdHVyZSBzaWduYXR1cmU7XG4gKiB9IENlcnRpZmljYXRlVmVyaWZ5O1xuICpcbiAqIENlcnRpZmljYXRlVmVyaWZ5LnNpZ25hdHVyZS5tZDVfaGFzaFxuICogICBNRDUoaGFuZHNoYWtlX21lc3NhZ2VzKTtcbiAqXG4gKiBDZXJ0aWZpY2F0ZS5zaWduYXR1cmUuc2hhX2hhc2hcbiAqICAgU0hBKGhhbmRzaGFrZV9tZXNzYWdlcyk7XG4gKlxuICogSGVyZSBoYW5kc2hha2VfbWVzc2FnZXMgcmVmZXJzIHRvIGFsbCBoYW5kc2hha2UgbWVzc2FnZXMgc2VudCBvclxuICogcmVjZWl2ZWQgc3RhcnRpbmcgYXQgY2xpZW50IGhlbGxvIHVwIHRvIGJ1dCBub3QgaW5jbHVkaW5nIHRoaXNcbiAqIG1lc3NhZ2UsIGluY2x1ZGluZyB0aGUgdHlwZSBhbmQgbGVuZ3RoIGZpZWxkcyBvZiB0aGUgaGFuZHNoYWtlXG4gKiBtZXNzYWdlcy5cbiAqXG4gKiBzZWxlY3QoU2lnbmF0dXJlQWxnb3JpdGhtKSB7XG4gKiAgIGNhc2UgYW5vbnltb3VzOiBzdHJ1Y3QgeyB9O1xuICogICBjYXNlIHJzYTpcbiAqICAgICBkaWdpdGFsbHktc2lnbmVkIHN0cnVjdCB7XG4gKiAgICAgICBvcGFxdWUgbWQ1X2hhc2hbMTZdO1xuICogICAgICAgb3BhcXVlIHNoYV9oYXNoWzIwXTtcbiAqICAgICB9O1xuICogICBjYXNlIGRzYTpcbiAqICAgICBkaWdpdGFsbHktc2lnbmVkIHN0cnVjdCB7XG4gKiAgICAgICBvcGFxdWUgc2hhX2hhc2hbMjBdO1xuICogICAgIH07XG4gKiB9IFNpZ25hdHVyZTtcbiAqXG4gKiBJbiBkaWdpdGFsIHNpZ25pbmcsIG9uZS13YXkgaGFzaCBmdW5jdGlvbnMgYXJlIHVzZWQgYXMgaW5wdXQgZm9yIGFcbiAqIHNpZ25pbmcgYWxnb3JpdGhtLiBBIGRpZ2l0YWxseS1zaWduZWQgZWxlbWVudCBpcyBlbmNvZGVkIGFzIGFuIG9wYXF1ZVxuICogdmVjdG9yIDwwLi4yXjE2LTE+LCB3aGVyZSB0aGUgbGVuZ3RoIGlzIHNwZWNpZmllZCBieSB0aGUgc2lnbmluZ1xuICogYWxnb3JpdGhtIGFuZCBrZXkuXG4gKlxuICogSW4gUlNBIHNpZ25pbmcsIGEgMzYtYnl0ZSBzdHJ1Y3R1cmUgb2YgdHdvIGhhc2hlcyAob25lIFNIQSBhbmQgb25lXG4gKiBNRDUpIGlzIHNpZ25lZCAoZW5jcnlwdGVkIHdpdGggdGhlIHByaXZhdGUga2V5KS4gSXQgaXMgZW5jb2RlZCB3aXRoXG4gKiBQS0NTICMxIGJsb2NrIHR5cGUgMCBvciB0eXBlIDEgYXMgZGVzY3JpYmVkIGluIFtQS0NTMV0uXG4gKlxuICogSW4gRFNTLCB0aGUgMjAgYnl0ZXMgb2YgdGhlIFNIQSBoYXNoIGFyZSBydW4gZGlyZWN0bHkgdGhyb3VnaCB0aGVcbiAqIERpZ2l0YWwgU2lnbmluZyBBbGdvcml0aG0gd2l0aCBubyBhZGRpdGlvbmFsIGhhc2hpbmcuXG4gKlxuICogQHBhcmFtIGMgdGhlIGNvbm5lY3Rpb24uXG4gKiBAcGFyYW0gc2lnbmF0dXJlIHRoZSBzaWduYXR1cmUgdG8gaW5jbHVkZSBpbiB0aGUgbWVzc2FnZS5cbiAqXG4gKiBAcmV0dXJuIHRoZSBDZXJ0aWZpY2F0ZVZlcmlmeSBieXRlIGJ1ZmZlci5cbiAqL1xudGxzLmNyZWF0ZUNlcnRpZmljYXRlVmVyaWZ5ID0gZnVuY3Rpb24oYywgc2lnbmF0dXJlKSB7XG4gIC8qIE5vdGU6IFRoZSBzaWduYXR1cmUgd2lsbCBiZSBzdG9yZWQgaW4gYSBcImRpZ2l0YWxseS1zaWduZWRcIiBvcGFxdWVcbiAgICB2ZWN0b3IgdGhhdCBoYXMgdGhlIGxlbmd0aCBwcmVmaXhlZCB1c2luZyAyIGJ5dGVzLCBzbyBpbmNsdWRlIHRob3NlXG4gICAgMiBieXRlcyBpbiB0aGUgaGFuZHNoYWtlIG1lc3NhZ2UgbGVuZ3RoLiBUaGlzIGlzIGRvbmUgYXMgYSBtaW5vclxuICAgIG9wdGltaXphdGlvbiBpbnN0ZWFkIG9mIGNhbGxpbmcgd3JpdGVWZWN0b3IoKS4gKi9cblxuICAvLyBkZXRlcm1pbmUgbGVuZ3RoIG9mIHRoZSBoYW5kc2hha2UgbWVzc2FnZVxuICB2YXIgbGVuZ3RoID0gc2lnbmF0dXJlLmxlbmd0aCArIDI7XG5cbiAgLy8gYnVpbGQgcmVjb3JkIGZyYWdtZW50XG4gIHZhciBydmFsID0gZm9yZ2UudXRpbC5jcmVhdGVCdWZmZXIoKTtcbiAgcnZhbC5wdXRCeXRlKHRscy5IYW5kc2hha2VUeXBlLmNlcnRpZmljYXRlX3ZlcmlmeSk7XG4gIHJ2YWwucHV0SW50MjQobGVuZ3RoKTtcbiAgLy8gYWRkIHZlY3RvciBsZW5ndGggYnl0ZXNcbiAgcnZhbC5wdXRJbnQxNihzaWduYXR1cmUubGVuZ3RoKTtcbiAgcnZhbC5wdXRCeXRlcyhzaWduYXR1cmUpO1xuICByZXR1cm4gcnZhbDtcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIENlcnRpZmljYXRlUmVxdWVzdCBtZXNzYWdlLlxuICpcbiAqIEBwYXJhbSBjIHRoZSBjb25uZWN0aW9uLlxuICpcbiAqIEByZXR1cm4gdGhlIENlcnRpZmljYXRlUmVxdWVzdCBieXRlIGJ1ZmZlci5cbiAqL1xudGxzLmNyZWF0ZUNlcnRpZmljYXRlUmVxdWVzdCA9IGZ1bmN0aW9uKGMpIHtcbiAgLy8gVE9ETzogc3VwcG9ydCBvdGhlciBjZXJ0aWZpY2F0ZSB0eXBlc1xuICB2YXIgY2VydFR5cGVzID0gZm9yZ2UudXRpbC5jcmVhdGVCdWZmZXIoKTtcblxuICAvLyBjb21tb24gUlNBIGNlcnRpZmljYXRlIHR5cGVcbiAgY2VydFR5cGVzLnB1dEJ5dGUoMHgwMSk7XG5cbiAgLy8gYWRkIGRpc3Rpbmd1aXNoZWQgbmFtZXMgZnJvbSBDQSBzdG9yZVxuICB2YXIgY0FzID0gZm9yZ2UudXRpbC5jcmVhdGVCdWZmZXIoKTtcbiAgZm9yKHZhciBrZXkgaW4gYy5jYVN0b3JlLmNlcnRzKSB7XG4gICAgdmFyIGNlcnQgPSBjLmNhU3RvcmUuY2VydHNba2V5XTtcbiAgICB2YXIgZG4gPSBmb3JnZS5wa2kuZGlzdGluZ3Vpc2hlZE5hbWVUb0FzbjEoY2VydC5zdWJqZWN0KTtcbiAgICB2YXIgYnl0ZUJ1ZmZlciA9IGZvcmdlLmFzbjEudG9EZXIoZG4pO1xuICAgIGNBcy5wdXRJbnQxNihieXRlQnVmZmVyLmxlbmd0aCgpKTtcbiAgICBjQXMucHV0QnVmZmVyKGJ5dGVCdWZmZXIpO1xuICB9XG5cbiAgLy8gVE9ETzogVExTIDEuMisgaGFzIGEgZGlmZmVyZW50IGZvcm1hdFxuXG4gIC8vIGRldGVybWluZSBsZW5ndGggb2YgdGhlIGhhbmRzaGFrZSBtZXNzYWdlXG4gIHZhciBsZW5ndGggPVxuICAgIDEgKyBjZXJ0VHlwZXMubGVuZ3RoKCkgK1xuICAgIDIgKyBjQXMubGVuZ3RoKCk7XG5cbiAgLy8gYnVpbGQgcmVjb3JkIGZyYWdtZW50XG4gIHZhciBydmFsID0gZm9yZ2UudXRpbC5jcmVhdGVCdWZmZXIoKTtcbiAgcnZhbC5wdXRCeXRlKHRscy5IYW5kc2hha2VUeXBlLmNlcnRpZmljYXRlX3JlcXVlc3QpO1xuICBydmFsLnB1dEludDI0KGxlbmd0aCk7XG4gIHdyaXRlVmVjdG9yKHJ2YWwsIDEsIGNlcnRUeXBlcyk7XG4gIHdyaXRlVmVjdG9yKHJ2YWwsIDIsIGNBcyk7XG4gIHJldHVybiBydmFsO1xufTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgU2VydmVySGVsbG9Eb25lIG1lc3NhZ2UuXG4gKlxuICogQHBhcmFtIGMgdGhlIGNvbm5lY3Rpb24uXG4gKlxuICogQHJldHVybiB0aGUgU2VydmVySGVsbG9Eb25lIGJ5dGUgYnVmZmVyLlxuICovXG50bHMuY3JlYXRlU2VydmVySGVsbG9Eb25lID0gZnVuY3Rpb24oYykge1xuICAvLyBidWlsZCByZWNvcmQgZnJhZ21lbnRcbiAgdmFyIHJ2YWwgPSBmb3JnZS51dGlsLmNyZWF0ZUJ1ZmZlcigpO1xuICBydmFsLnB1dEJ5dGUodGxzLkhhbmRzaGFrZVR5cGUuc2VydmVyX2hlbGxvX2RvbmUpO1xuICBydmFsLnB1dEludDI0KDApO1xuICByZXR1cm4gcnZhbDtcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIENoYW5nZUNpcGhlclNwZWMgbWVzc2FnZS5cbiAqXG4gKiBUaGUgY2hhbmdlIGNpcGhlciBzcGVjIHByb3RvY29sIGV4aXN0cyB0byBzaWduYWwgdHJhbnNpdGlvbnMgaW5cbiAqIGNpcGhlcmluZyBzdHJhdGVnaWVzLiBUaGUgcHJvdG9jb2wgY29uc2lzdHMgb2YgYSBzaW5nbGUgbWVzc2FnZSxcbiAqIHdoaWNoIGlzIGVuY3J5cHRlZCBhbmQgY29tcHJlc3NlZCB1bmRlciB0aGUgY3VycmVudCAobm90IHRoZSBwZW5kaW5nKVxuICogY29ubmVjdGlvbiBzdGF0ZS4gVGhlIG1lc3NhZ2UgY29uc2lzdHMgb2YgYSBzaW5nbGUgYnl0ZSBvZiB2YWx1ZSAxLlxuICpcbiAqIHN0cnVjdCB7XG4gKiAgIGVudW0geyBjaGFuZ2VfY2lwaGVyX3NwZWMoMSksICgyNTUpIH0gdHlwZTtcbiAqIH0gQ2hhbmdlQ2lwaGVyU3BlYztcbiAqXG4gKiBAcmV0dXJuIHRoZSBDaGFuZ2VDaXBoZXJTcGVjIGJ5dGUgYnVmZmVyLlxuICovXG50bHMuY3JlYXRlQ2hhbmdlQ2lwaGVyU3BlYyA9IGZ1bmN0aW9uKCkge1xuICB2YXIgcnZhbCA9IGZvcmdlLnV0aWwuY3JlYXRlQnVmZmVyKCk7XG4gIHJ2YWwucHV0Qnl0ZSgweDAxKTtcbiAgcmV0dXJuIHJ2YWw7XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBGaW5pc2hlZCBtZXNzYWdlLlxuICpcbiAqIHN0cnVjdCB7XG4gKiAgIG9wYXF1ZSB2ZXJpZnlfZGF0YVsxMl07XG4gKiB9IEZpbmlzaGVkO1xuICpcbiAqIHZlcmlmeV9kYXRhXG4gKiAgIFBSRihtYXN0ZXJfc2VjcmV0LCBmaW5pc2hlZF9sYWJlbCwgTUQ1KGhhbmRzaGFrZV9tZXNzYWdlcykgK1xuICogICBTSEEtMShoYW5kc2hha2VfbWVzc2FnZXMpKSBbMC4uMTFdO1xuICpcbiAqIGZpbmlzaGVkX2xhYmVsXG4gKiAgIEZvciBGaW5pc2hlZCBtZXNzYWdlcyBzZW50IGJ5IHRoZSBjbGllbnQsIHRoZSBzdHJpbmcgXCJjbGllbnRcbiAqICAgZmluaXNoZWRcIi4gRm9yIEZpbmlzaGVkIG1lc3NhZ2VzIHNlbnQgYnkgdGhlIHNlcnZlciwgdGhlXG4gKiAgIHN0cmluZyBcInNlcnZlciBmaW5pc2hlZFwiLlxuICpcbiAqIGhhbmRzaGFrZV9tZXNzYWdlc1xuICogICBBbGwgb2YgdGhlIGRhdGEgZnJvbSBhbGwgaGFuZHNoYWtlIG1lc3NhZ2VzIHVwIHRvIGJ1dCBub3RcbiAqICAgaW5jbHVkaW5nIHRoaXMgbWVzc2FnZS4gVGhpcyBpcyBvbmx5IGRhdGEgdmlzaWJsZSBhdCB0aGVcbiAqICAgaGFuZHNoYWtlIGxheWVyIGFuZCBkb2VzIG5vdCBpbmNsdWRlIHJlY29yZCBsYXllciBoZWFkZXJzLlxuICogICBUaGlzIGlzIHRoZSBjb25jYXRlbmF0aW9uIG9mIGFsbCB0aGUgSGFuZHNoYWtlIHN0cnVjdHVyZXMgYXNcbiAqICAgZGVmaW5lZCBpbiA3LjQgZXhjaGFuZ2VkIHRodXMgZmFyLlxuICpcbiAqIEBwYXJhbSBjIHRoZSBjb25uZWN0aW9uLlxuICpcbiAqIEByZXR1cm4gdGhlIEZpbmlzaGVkIGJ5dGUgYnVmZmVyLlxuICovXG50bHMuY3JlYXRlRmluaXNoZWQgPSBmdW5jdGlvbihjKSB7XG4gIC8vIGdlbmVyYXRlIHZlcmlmeV9kYXRhXG4gIHZhciBiID0gZm9yZ2UudXRpbC5jcmVhdGVCdWZmZXIoKTtcbiAgYi5wdXRCdWZmZXIoYy5zZXNzaW9uLm1kNS5kaWdlc3QoKSk7XG4gIGIucHV0QnVmZmVyKGMuc2Vzc2lvbi5zaGExLmRpZ2VzdCgpKTtcblxuICAvLyBUT0RPOiBkZXRlcm1pbmUgcHJmIGZ1bmN0aW9uIGFuZCB2ZXJpZnkgbGVuZ3RoIGZvciBUTFMgMS4yXG4gIHZhciBjbGllbnQgPSAoYy5lbnRpdHkgPT09IHRscy5Db25uZWN0aW9uRW5kLmNsaWVudCk7XG4gIHZhciBzcCA9IGMuc2Vzc2lvbi5zcDtcbiAgdmFyIHZkbCA9IDEyO1xuICB2YXIgcHJmID0gcHJmX1RMUzE7XG4gIHZhciBsYWJlbCA9IGNsaWVudCA/ICdjbGllbnQgZmluaXNoZWQnIDogJ3NlcnZlciBmaW5pc2hlZCc7XG4gIGIgPSBwcmYoc3AubWFzdGVyX3NlY3JldCwgbGFiZWwsIGIuZ2V0Qnl0ZXMoKSwgdmRsKTtcblxuICAvLyBidWlsZCByZWNvcmQgZnJhZ21lbnRcbiAgdmFyIHJ2YWwgPSBmb3JnZS51dGlsLmNyZWF0ZUJ1ZmZlcigpO1xuICBydmFsLnB1dEJ5dGUodGxzLkhhbmRzaGFrZVR5cGUuZmluaXNoZWQpO1xuICBydmFsLnB1dEludDI0KGIubGVuZ3RoKCkpO1xuICBydmFsLnB1dEJ1ZmZlcihiKTtcbiAgcmV0dXJuIHJ2YWw7XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBIZWFydGJlYXRNZXNzYWdlIChTZWUgUkZDIDY1MjApLlxuICpcbiAqIHN0cnVjdCB7XG4gKiAgIEhlYXJ0YmVhdE1lc3NhZ2VUeXBlIHR5cGU7XG4gKiAgIHVpbnQxNiBwYXlsb2FkX2xlbmd0aDtcbiAqICAgb3BhcXVlIHBheWxvYWRbSGVhcnRiZWF0TWVzc2FnZS5wYXlsb2FkX2xlbmd0aF07XG4gKiAgIG9wYXF1ZSBwYWRkaW5nW3BhZGRpbmdfbGVuZ3RoXTtcbiAqIH0gSGVhcnRiZWF0TWVzc2FnZTtcbiAqXG4gKiBUaGUgdG90YWwgbGVuZ3RoIG9mIGEgSGVhcnRiZWF0TWVzc2FnZSBNVVNUIE5PVCBleGNlZWQgMl4xNCBvclxuICogbWF4X2ZyYWdtZW50X2xlbmd0aCB3aGVuIG5lZ290aWF0ZWQgYXMgZGVmaW5lZCBpbiBbUkZDNjA2Nl0uXG4gKlxuICogdHlwZTogVGhlIG1lc3NhZ2UgdHlwZSwgZWl0aGVyIGhlYXJ0YmVhdF9yZXF1ZXN0IG9yIGhlYXJ0YmVhdF9yZXNwb25zZS5cbiAqXG4gKiBwYXlsb2FkX2xlbmd0aDogVGhlIGxlbmd0aCBvZiB0aGUgcGF5bG9hZC5cbiAqXG4gKiBwYXlsb2FkOiBUaGUgcGF5bG9hZCBjb25zaXN0cyBvZiBhcmJpdHJhcnkgY29udGVudC5cbiAqXG4gKiBwYWRkaW5nOiBUaGUgcGFkZGluZyBpcyByYW5kb20gY29udGVudCB0aGF0IE1VU1QgYmUgaWdub3JlZCBieSB0aGVcbiAqICAgcmVjZWl2ZXIuIFRoZSBsZW5ndGggb2YgYSBIZWFydGJlYXRNZXNzYWdlIGlzIFRMU1BsYWludGV4dC5sZW5ndGhcbiAqICAgZm9yIFRMUyBhbmQgRFRMU1BsYWludGV4dC5sZW5ndGggZm9yIERUTFMuIEZ1cnRoZXJtb3JlLCB0aGVcbiAqICAgbGVuZ3RoIG9mIHRoZSB0eXBlIGZpZWxkIGlzIDEgYnl0ZSwgYW5kIHRoZSBsZW5ndGggb2YgdGhlXG4gKiAgIHBheWxvYWRfbGVuZ3RoIGlzIDIuIFRoZXJlZm9yZSwgdGhlIHBhZGRpbmdfbGVuZ3RoIGlzXG4gKiAgIFRMU1BsYWludGV4dC5sZW5ndGggLSBwYXlsb2FkX2xlbmd0aCAtIDMgZm9yIFRMUyBhbmRcbiAqICAgRFRMU1BsYWludGV4dC5sZW5ndGggLSBwYXlsb2FkX2xlbmd0aCAtIDMgZm9yIERUTFMuIFRoZVxuICogICBwYWRkaW5nX2xlbmd0aCBNVVNUIGJlIGF0IGxlYXN0IDE2LlxuICpcbiAqIFRoZSBzZW5kZXIgb2YgYSBIZWFydGJlYXRNZXNzYWdlIE1VU1QgdXNlIGEgcmFuZG9tIHBhZGRpbmcgb2YgYXRcbiAqIGxlYXN0IDE2IGJ5dGVzLiBUaGUgcGFkZGluZyBvZiBhIHJlY2VpdmVkIEhlYXJ0YmVhdE1lc3NhZ2UgbWVzc2FnZVxuICogTVVTVCBiZSBpZ25vcmVkLlxuICpcbiAqIElmIHRoZSBwYXlsb2FkX2xlbmd0aCBvZiBhIHJlY2VpdmVkIEhlYXJ0YmVhdE1lc3NhZ2UgaXMgdG9vIGxhcmdlLFxuICogdGhlIHJlY2VpdmVkIEhlYXJ0YmVhdE1lc3NhZ2UgTVVTVCBiZSBkaXNjYXJkZWQgc2lsZW50bHkuXG4gKlxuICogQHBhcmFtIGMgdGhlIGNvbm5lY3Rpb24uXG4gKiBAcGFyYW0gdHlwZSB0aGUgdGxzLkhlYXJ0YmVhdE1lc3NhZ2VUeXBlLlxuICogQHBhcmFtIHBheWxvYWQgdGhlIGhlYXJ0YmVhdCBkYXRhIHRvIHNlbmQgYXMgdGhlIHBheWxvYWQuXG4gKiBAcGFyYW0gW3BheWxvYWRMZW5ndGhdIHRoZSBwYXlsb2FkIGxlbmd0aCB0byB1c2UsIGRlZmF1bHRzIHRvIHRoZVxuICogICAgICAgICAgYWN0dWFsIHBheWxvYWQgbGVuZ3RoLlxuICpcbiAqIEByZXR1cm4gdGhlIEhlYXJ0YmVhdFJlcXVlc3QgYnl0ZSBidWZmZXIuXG4gKi9cbnRscy5jcmVhdGVIZWFydGJlYXQgPSBmdW5jdGlvbih0eXBlLCBwYXlsb2FkLCBwYXlsb2FkTGVuZ3RoKSB7XG4gIGlmKHR5cGVvZiBwYXlsb2FkTGVuZ3RoID09PSAndW5kZWZpbmVkJykge1xuICAgIHBheWxvYWRMZW5ndGggPSBwYXlsb2FkLmxlbmd0aDtcbiAgfVxuICAvLyBidWlsZCByZWNvcmQgZnJhZ21lbnRcbiAgdmFyIHJ2YWwgPSBmb3JnZS51dGlsLmNyZWF0ZUJ1ZmZlcigpO1xuICBydmFsLnB1dEJ5dGUodHlwZSk7ICAgICAgICAgICAgICAgLy8gaGVhcnRiZWF0IG1lc3NhZ2UgdHlwZVxuICBydmFsLnB1dEludDE2KHBheWxvYWRMZW5ndGgpOyAgICAgLy8gcGF5bG9hZCBsZW5ndGhcbiAgcnZhbC5wdXRCeXRlcyhwYXlsb2FkKTsgICAgICAgICAgIC8vIHBheWxvYWRcbiAgLy8gcGFkZGluZ1xuICB2YXIgcGxhaW50ZXh0TGVuZ3RoID0gcnZhbC5sZW5ndGgoKTtcbiAgdmFyIHBhZGRpbmdMZW5ndGggPSBNYXRoLm1heCgxNiwgcGxhaW50ZXh0TGVuZ3RoIC0gcGF5bG9hZExlbmd0aCAtIDMpO1xuICBydmFsLnB1dEJ5dGVzKGZvcmdlLnJhbmRvbS5nZXRCeXRlcyhwYWRkaW5nTGVuZ3RoKSk7XG4gIHJldHVybiBydmFsO1xufTtcblxuLyoqXG4gKiBGcmFnbWVudHMsIGNvbXByZXNzZXMsIGVuY3J5cHRzLCBhbmQgcXVldWVzIGEgcmVjb3JkIGZvciBkZWxpdmVyeS5cbiAqXG4gKiBAcGFyYW0gYyB0aGUgY29ubmVjdGlvbi5cbiAqIEBwYXJhbSByZWNvcmQgdGhlIHJlY29yZCB0byBxdWV1ZS5cbiAqL1xudGxzLnF1ZXVlID0gZnVuY3Rpb24oYywgcmVjb3JkKSB7XG4gIC8vIGVycm9yIGR1cmluZyByZWNvcmQgY3JlYXRpb25cbiAgaWYoIXJlY29yZCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmKHJlY29yZC5mcmFnbWVudC5sZW5ndGgoKSA9PT0gMCkge1xuICAgIGlmKHJlY29yZC50eXBlID09PSB0bHMuQ29udGVudFR5cGUuaGFuZHNoYWtlIHx8XG4gICAgICByZWNvcmQudHlwZSA9PT0gdGxzLkNvbnRlbnRUeXBlLmFsZXJ0IHx8XG4gICAgICByZWNvcmQudHlwZSA9PT0gdGxzLkNvbnRlbnRUeXBlLmNoYW5nZV9jaXBoZXJfc3BlYykge1xuICAgICAgLy8gRW1wdHkgaGFuZHNoYWtlLCBhbGVydCBvZiBjaGFuZ2UgY2lwaGVyIHNwZWMgbWVzc2FnZXMgYXJlIG5vdCBhbGxvd2VkIHBlciB0aGUgVExTIHNwZWNpZmljYXRpb24gYW5kIHNob3VsZCBub3QgYmUgc2VudC5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICAvLyBpZiB0aGUgcmVjb3JkIGlzIGEgaGFuZHNoYWtlIHJlY29yZCwgdXBkYXRlIGhhbmRzaGFrZSBoYXNoZXNcbiAgaWYocmVjb3JkLnR5cGUgPT09IHRscy5Db250ZW50VHlwZS5oYW5kc2hha2UpIHtcbiAgICB2YXIgYnl0ZXMgPSByZWNvcmQuZnJhZ21lbnQuYnl0ZXMoKTtcbiAgICBjLnNlc3Npb24ubWQ1LnVwZGF0ZShieXRlcyk7XG4gICAgYy5zZXNzaW9uLnNoYTEudXBkYXRlKGJ5dGVzKTtcbiAgICBieXRlcyA9IG51bGw7XG4gIH1cblxuICAvLyBoYW5kbGUgcmVjb3JkIGZyYWdtZW50YXRpb25cbiAgdmFyIHJlY29yZHM7XG4gIGlmKHJlY29yZC5mcmFnbWVudC5sZW5ndGgoKSA8PSB0bHMuTWF4RnJhZ21lbnQpIHtcbiAgICByZWNvcmRzID0gW3JlY29yZF07XG4gIH0gZWxzZSB7XG4gICAgLy8gZnJhZ21lbnQgZGF0YSBhcyBsb25nIGFzIGl0IGlzIHRvbyBsb25nXG4gICAgcmVjb3JkcyA9IFtdO1xuICAgIHZhciBkYXRhID0gcmVjb3JkLmZyYWdtZW50LmJ5dGVzKCk7XG4gICAgd2hpbGUoZGF0YS5sZW5ndGggPiB0bHMuTWF4RnJhZ21lbnQpIHtcbiAgICAgIHJlY29yZHMucHVzaCh0bHMuY3JlYXRlUmVjb3JkKGMsIHtcbiAgICAgICAgdHlwZTogcmVjb3JkLnR5cGUsXG4gICAgICAgIGRhdGE6IGZvcmdlLnV0aWwuY3JlYXRlQnVmZmVyKGRhdGEuc2xpY2UoMCwgdGxzLk1heEZyYWdtZW50KSlcbiAgICAgIH0pKTtcbiAgICAgIGRhdGEgPSBkYXRhLnNsaWNlKHRscy5NYXhGcmFnbWVudCk7XG4gICAgfVxuICAgIC8vIGFkZCBsYXN0IHJlY29yZFxuICAgIGlmKGRhdGEubGVuZ3RoID4gMCkge1xuICAgICAgcmVjb3Jkcy5wdXNoKHRscy5jcmVhdGVSZWNvcmQoYywge1xuICAgICAgICB0eXBlOiByZWNvcmQudHlwZSxcbiAgICAgICAgZGF0YTogZm9yZ2UudXRpbC5jcmVhdGVCdWZmZXIoZGF0YSlcbiAgICAgIH0pKTtcbiAgICB9XG4gIH1cblxuICAvLyBjb21wcmVzcyBhbmQgZW5jcnlwdCBhbGwgZnJhZ21lbnRlZCByZWNvcmRzXG4gIGZvcih2YXIgaSA9IDA7IGkgPCByZWNvcmRzLmxlbmd0aCAmJiAhYy5mYWlsOyArK2kpIHtcbiAgICAvLyB1cGRhdGUgdGhlIHJlY29yZCB1c2luZyBjdXJyZW50IHdyaXRlIHN0YXRlXG4gICAgdmFyIHJlYyA9IHJlY29yZHNbaV07XG4gICAgdmFyIHMgPSBjLnN0YXRlLmN1cnJlbnQud3JpdGU7XG4gICAgaWYocy51cGRhdGUoYywgcmVjKSkge1xuICAgICAgLy8gc3RvcmUgcmVjb3JkXG4gICAgICBjLnJlY29yZHMucHVzaChyZWMpO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBGbHVzaGVzIGFsbCBxdWV1ZWQgcmVjb3JkcyB0byB0aGUgb3V0cHV0IGJ1ZmZlciBhbmQgY2FsbHMgdGhlXG4gKiB0bHNEYXRhUmVhZHkoKSBoYW5kbGVyIG9uIHRoZSBnaXZlbiBjb25uZWN0aW9uLlxuICpcbiAqIEBwYXJhbSBjIHRoZSBjb25uZWN0aW9uLlxuICpcbiAqIEByZXR1cm4gdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBvbiBmYWlsdXJlLlxuICovXG50bHMuZmx1c2ggPSBmdW5jdGlvbihjKSB7XG4gIGZvcih2YXIgaSA9IDA7IGkgPCBjLnJlY29yZHMubGVuZ3RoOyArK2kpIHtcbiAgICB2YXIgcmVjb3JkID0gYy5yZWNvcmRzW2ldO1xuXG4gICAgLy8gYWRkIHJlY29yZCBoZWFkZXIgYW5kIGZyYWdtZW50XG4gICAgYy50bHNEYXRhLnB1dEJ5dGUocmVjb3JkLnR5cGUpO1xuICAgIGMudGxzRGF0YS5wdXRCeXRlKHJlY29yZC52ZXJzaW9uLm1ham9yKTtcbiAgICBjLnRsc0RhdGEucHV0Qnl0ZShyZWNvcmQudmVyc2lvbi5taW5vcik7XG4gICAgYy50bHNEYXRhLnB1dEludDE2KHJlY29yZC5mcmFnbWVudC5sZW5ndGgoKSk7XG4gICAgYy50bHNEYXRhLnB1dEJ1ZmZlcihjLnJlY29yZHNbaV0uZnJhZ21lbnQpO1xuICB9XG4gIGMucmVjb3JkcyA9IFtdO1xuICByZXR1cm4gYy50bHNEYXRhUmVhZHkoYyk7XG59O1xuXG4vKipcbiAqIE1hcHMgYSBwa2kuY2VydGlmaWNhdGVFcnJvciB0byBhIHRscy5BbGVydC5EZXNjcmlwdGlvbi5cbiAqXG4gKiBAcGFyYW0gZXJyb3IgdGhlIGVycm9yIHRvIG1hcC5cbiAqXG4gKiBAcmV0dXJuIHRoZSBhbGVydCBkZXNjcmlwdGlvbi5cbiAqL1xudmFyIF9jZXJ0RXJyb3JUb0FsZXJ0RGVzYyA9IGZ1bmN0aW9uKGVycm9yKSB7XG4gIHN3aXRjaChlcnJvcikge1xuICBjYXNlIHRydWU6XG4gICAgcmV0dXJuIHRydWU7XG4gIGNhc2UgZm9yZ2UucGtpLmNlcnRpZmljYXRlRXJyb3IuYmFkX2NlcnRpZmljYXRlOlxuICAgIHJldHVybiB0bHMuQWxlcnQuRGVzY3JpcHRpb24uYmFkX2NlcnRpZmljYXRlO1xuICBjYXNlIGZvcmdlLnBraS5jZXJ0aWZpY2F0ZUVycm9yLnVuc3VwcG9ydGVkX2NlcnRpZmljYXRlOlxuICAgIHJldHVybiB0bHMuQWxlcnQuRGVzY3JpcHRpb24udW5zdXBwb3J0ZWRfY2VydGlmaWNhdGU7XG4gIGNhc2UgZm9yZ2UucGtpLmNlcnRpZmljYXRlRXJyb3IuY2VydGlmaWNhdGVfcmV2b2tlZDpcbiAgICByZXR1cm4gdGxzLkFsZXJ0LkRlc2NyaXB0aW9uLmNlcnRpZmljYXRlX3Jldm9rZWQ7XG4gIGNhc2UgZm9yZ2UucGtpLmNlcnRpZmljYXRlRXJyb3IuY2VydGlmaWNhdGVfZXhwaXJlZDpcbiAgICByZXR1cm4gdGxzLkFsZXJ0LkRlc2NyaXB0aW9uLmNlcnRpZmljYXRlX2V4cGlyZWQ7XG4gIGNhc2UgZm9yZ2UucGtpLmNlcnRpZmljYXRlRXJyb3IuY2VydGlmaWNhdGVfdW5rbm93bjpcbiAgICByZXR1cm4gdGxzLkFsZXJ0LkRlc2NyaXB0aW9uLmNlcnRpZmljYXRlX3Vua25vd247XG4gIGNhc2UgZm9yZ2UucGtpLmNlcnRpZmljYXRlRXJyb3IudW5rbm93bl9jYTpcbiAgICByZXR1cm4gdGxzLkFsZXJ0LkRlc2NyaXB0aW9uLnVua25vd25fY2E7XG4gIGRlZmF1bHQ6XG4gICAgcmV0dXJuIHRscy5BbGVydC5EZXNjcmlwdGlvbi5iYWRfY2VydGlmaWNhdGU7XG4gIH1cbn07XG5cbi8qKlxuICogTWFwcyBhIHRscy5BbGVydC5EZXNjcmlwdGlvbiB0byBhIHBraS5jZXJ0aWZpY2F0ZUVycm9yLlxuICpcbiAqIEBwYXJhbSBkZXNjIHRoZSBhbGVydCBkZXNjcmlwdGlvbi5cbiAqXG4gKiBAcmV0dXJuIHRoZSBjZXJ0aWZpY2F0ZSBlcnJvci5cbiAqL1xudmFyIF9hbGVydERlc2NUb0NlcnRFcnJvciA9IGZ1bmN0aW9uKGRlc2MpIHtcbiAgc3dpdGNoKGRlc2MpIHtcbiAgY2FzZSB0cnVlOlxuICAgIHJldHVybiB0cnVlO1xuICBjYXNlIHRscy5BbGVydC5EZXNjcmlwdGlvbi5iYWRfY2VydGlmaWNhdGU6XG4gICAgcmV0dXJuIGZvcmdlLnBraS5jZXJ0aWZpY2F0ZUVycm9yLmJhZF9jZXJ0aWZpY2F0ZTtcbiAgY2FzZSB0bHMuQWxlcnQuRGVzY3JpcHRpb24udW5zdXBwb3J0ZWRfY2VydGlmaWNhdGU6XG4gICAgcmV0dXJuIGZvcmdlLnBraS5jZXJ0aWZpY2F0ZUVycm9yLnVuc3VwcG9ydGVkX2NlcnRpZmljYXRlO1xuICBjYXNlIHRscy5BbGVydC5EZXNjcmlwdGlvbi5jZXJ0aWZpY2F0ZV9yZXZva2VkOlxuICAgIHJldHVybiBmb3JnZS5wa2kuY2VydGlmaWNhdGVFcnJvci5jZXJ0aWZpY2F0ZV9yZXZva2VkO1xuICBjYXNlIHRscy5BbGVydC5EZXNjcmlwdGlvbi5jZXJ0aWZpY2F0ZV9leHBpcmVkOlxuICAgIHJldHVybiBmb3JnZS5wa2kuY2VydGlmaWNhdGVFcnJvci5jZXJ0aWZpY2F0ZV9leHBpcmVkO1xuICBjYXNlIHRscy5BbGVydC5EZXNjcmlwdGlvbi5jZXJ0aWZpY2F0ZV91bmtub3duOlxuICAgIHJldHVybiBmb3JnZS5wa2kuY2VydGlmaWNhdGVFcnJvci5jZXJ0aWZpY2F0ZV91bmtub3duO1xuICBjYXNlIHRscy5BbGVydC5EZXNjcmlwdGlvbi51bmtub3duX2NhOlxuICAgIHJldHVybiBmb3JnZS5wa2kuY2VydGlmaWNhdGVFcnJvci51bmtub3duX2NhO1xuICBkZWZhdWx0OlxuICAgIHJldHVybiBmb3JnZS5wa2kuY2VydGlmaWNhdGVFcnJvci5iYWRfY2VydGlmaWNhdGU7XG4gIH1cbn07XG5cbi8qKlxuICogVmVyaWZpZXMgYSBjZXJ0aWZpY2F0ZSBjaGFpbiBhZ2FpbnN0IHRoZSBnaXZlbiBjb25uZWN0aW9uJ3NcbiAqIENlcnRpZmljYXRlIEF1dGhvcml0eSBzdG9yZS5cbiAqXG4gKiBAcGFyYW0gYyB0aGUgVExTIGNvbm5lY3Rpb24uXG4gKiBAcGFyYW0gY2hhaW4gdGhlIGNlcnRpZmljYXRlIGNoYWluIHRvIHZlcmlmeSwgd2l0aCB0aGUgcm9vdCBvciBoaWdoZXN0XG4gKiAgICAgICAgICBhdXRob3JpdHkgYXQgdGhlIGVuZC5cbiAqXG4gKiBAcmV0dXJuIHRydWUgaWYgc3VjY2Vzc2Z1bCwgZmFsc2UgaWYgbm90LlxuICovXG50bHMudmVyaWZ5Q2VydGlmaWNhdGVDaGFpbiA9IGZ1bmN0aW9uKGMsIGNoYWluKSB7XG4gIHRyeSB7XG4gICAgLy8gTWFrZSBhIGNvcHkgb2YgYy52ZXJpZnlPcHRpb25zIHNvIHRoYXQgd2UgY2FuIG1vZGlmeSBvcHRpb25zLnZlcmlmeVxuICAgIC8vIHdpdGhvdXQgbW9kaWZ5aW5nIGMudmVyaWZ5T3B0aW9ucy5cbiAgICB2YXIgb3B0aW9ucyA9IHt9O1xuICAgIGZvciAodmFyIGtleSBpbiBjLnZlcmlmeU9wdGlvbnMpIHtcbiAgICAgIG9wdGlvbnNba2V5XSA9IGMudmVyaWZ5T3B0aW9uc1trZXldO1xuICAgIH1cblxuICAgIG9wdGlvbnMudmVyaWZ5ID0gZnVuY3Rpb24odmZkLCBkZXB0aCwgY2hhaW4pIHtcbiAgICAgIC8vIGNvbnZlcnQgcGtpLmNlcnRpZmljYXRlRXJyb3IgdG8gdGxzIGFsZXJ0IGRlc2NyaXB0aW9uXG4gICAgICB2YXIgZGVzYyA9IF9jZXJ0RXJyb3JUb0FsZXJ0RGVzYyh2ZmQpO1xuXG4gICAgICAvLyBjYWxsIGFwcGxpY2F0aW9uIGNhbGxiYWNrXG4gICAgICB2YXIgcmV0ID0gYy52ZXJpZnkoYywgdmZkLCBkZXB0aCwgY2hhaW4pO1xuICAgICAgaWYocmV0ICE9PSB0cnVlKSB7XG4gICAgICAgIGlmKHR5cGVvZiByZXQgPT09ICdvYmplY3QnICYmICFmb3JnZS51dGlsLmlzQXJyYXkocmV0KSkge1xuICAgICAgICAgIC8vIHRocm93IGN1c3RvbSBlcnJvclxuICAgICAgICAgIHZhciBlcnJvciA9IG5ldyBFcnJvcignVGhlIGFwcGxpY2F0aW9uIHJlamVjdGVkIHRoZSBjZXJ0aWZpY2F0ZS4nKTtcbiAgICAgICAgICBlcnJvci5zZW5kID0gdHJ1ZTtcbiAgICAgICAgICBlcnJvci5hbGVydCA9IHtcbiAgICAgICAgICAgIGxldmVsOiB0bHMuQWxlcnQuTGV2ZWwuZmF0YWwsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogdGxzLkFsZXJ0LkRlc2NyaXB0aW9uLmJhZF9jZXJ0aWZpY2F0ZVxuICAgICAgICAgIH07XG4gICAgICAgICAgaWYocmV0Lm1lc3NhZ2UpIHtcbiAgICAgICAgICAgIGVycm9yLm1lc3NhZ2UgPSByZXQubWVzc2FnZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYocmV0LmFsZXJ0KSB7XG4gICAgICAgICAgICBlcnJvci5hbGVydC5kZXNjcmlwdGlvbiA9IHJldC5hbGVydDtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjb252ZXJ0IHRscyBhbGVydCBkZXNjcmlwdGlvbiB0byBwa2kuY2VydGlmaWNhdGVFcnJvclxuICAgICAgICBpZihyZXQgIT09IHZmZCkge1xuICAgICAgICAgIHJldCA9IF9hbGVydERlc2NUb0NlcnRFcnJvcihyZXQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXQ7XG4gICAgfTtcblxuICAgIC8vIHZlcmlmeSBjaGFpblxuICAgIGZvcmdlLnBraS52ZXJpZnlDZXJ0aWZpY2F0ZUNoYWluKGMuY2FTdG9yZSwgY2hhaW4sIG9wdGlvbnMpO1xuICB9IGNhdGNoKGV4KSB7XG4gICAgLy8gYnVpbGQgdGxzIGVycm9yIGlmIG5vdCBhbHJlYWR5IGN1c3RvbWl6ZWRcbiAgICB2YXIgZXJyID0gZXg7XG4gICAgaWYodHlwZW9mIGVyciAhPT0gJ29iamVjdCcgfHwgZm9yZ2UudXRpbC5pc0FycmF5KGVycikpIHtcbiAgICAgIGVyciA9IHtcbiAgICAgICAgc2VuZDogdHJ1ZSxcbiAgICAgICAgYWxlcnQ6IHtcbiAgICAgICAgICBsZXZlbDogdGxzLkFsZXJ0LkxldmVsLmZhdGFsLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiBfY2VydEVycm9yVG9BbGVydERlc2MoZXgpXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuICAgIGlmKCEoJ3NlbmQnIGluIGVycikpIHtcbiAgICAgIGVyci5zZW5kID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYoISgnYWxlcnQnIGluIGVycikpIHtcbiAgICAgIGVyci5hbGVydCA9IHtcbiAgICAgICAgbGV2ZWw6IHRscy5BbGVydC5MZXZlbC5mYXRhbCxcbiAgICAgICAgZGVzY3JpcHRpb246IF9jZXJ0RXJyb3JUb0FsZXJ0RGVzYyhlcnIuZXJyb3IpXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIHNlbmQgZXJyb3JcbiAgICBjLmVycm9yKGMsIGVycik7XG4gIH1cblxuICByZXR1cm4gIWMuZmFpbDtcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBUTFMgc2Vzc2lvbiBjYWNoZS5cbiAqXG4gKiBAcGFyYW0gY2FjaGUgb3B0aW9uYWwgbWFwIG9mIHNlc3Npb24gSUQgdG8gY2FjaGVkIHNlc3Npb24uXG4gKiBAcGFyYW0gY2FwYWNpdHkgdGhlIG1heGltdW0gc2l6ZSBmb3IgdGhlIGNhY2hlIChkZWZhdWx0OiAxMDApLlxuICpcbiAqIEByZXR1cm4gdGhlIG5ldyBUTFMgc2Vzc2lvbiBjYWNoZS5cbiAqL1xudGxzLmNyZWF0ZVNlc3Npb25DYWNoZSA9IGZ1bmN0aW9uKGNhY2hlLCBjYXBhY2l0eSkge1xuICB2YXIgcnZhbCA9IG51bGw7XG5cbiAgLy8gYXNzdW1lIGlucHV0IGlzIGFscmVhZHkgYSBzZXNzaW9uIGNhY2hlIG9iamVjdFxuICBpZihjYWNoZSAmJiBjYWNoZS5nZXRTZXNzaW9uICYmIGNhY2hlLnNldFNlc3Npb24gJiYgY2FjaGUub3JkZXIpIHtcbiAgICBydmFsID0gY2FjaGU7XG4gIH0gZWxzZSB7XG4gICAgLy8gY3JlYXRlIGNhY2hlXG4gICAgcnZhbCA9IHt9O1xuICAgIHJ2YWwuY2FjaGUgPSBjYWNoZSB8fCB7fTtcbiAgICBydmFsLmNhcGFjaXR5ID0gTWF0aC5tYXgoY2FwYWNpdHkgfHwgMTAwLCAxKTtcbiAgICBydmFsLm9yZGVyID0gW107XG5cbiAgICAvLyBzdG9yZSBvcmRlciBmb3Igc2Vzc2lvbnMsIGRlbGV0ZSBzZXNzaW9uIG92ZXJmbG93XG4gICAgZm9yKHZhciBrZXkgaW4gY2FjaGUpIHtcbiAgICAgIGlmKHJ2YWwub3JkZXIubGVuZ3RoIDw9IGNhcGFjaXR5KSB7XG4gICAgICAgIHJ2YWwub3JkZXIucHVzaChrZXkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlIGNhY2hlW2tleV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gZ2V0IGEgc2Vzc2lvbiBmcm9tIGEgc2Vzc2lvbiBJRCAob3IgZ2V0IGFueSBzZXNzaW9uKVxuICAgIHJ2YWwuZ2V0U2Vzc2lvbiA9IGZ1bmN0aW9uKHNlc3Npb25JZCkge1xuICAgICAgdmFyIHNlc3Npb24gPSBudWxsO1xuICAgICAgdmFyIGtleSA9IG51bGw7XG5cbiAgICAgIC8vIGlmIHNlc3Npb24gSUQgcHJvdmlkZWQsIHVzZSBpdFxuICAgICAgaWYoc2Vzc2lvbklkKSB7XG4gICAgICAgIGtleSA9IGZvcmdlLnV0aWwuYnl0ZXNUb0hleChzZXNzaW9uSWQpO1xuICAgICAgfSBlbHNlIGlmKHJ2YWwub3JkZXIubGVuZ3RoID4gMCkge1xuICAgICAgICAvLyBnZXQgZmlyc3Qgc2Vzc2lvbiBmcm9tIGNhY2hlXG4gICAgICAgIGtleSA9IHJ2YWwub3JkZXJbMF07XG4gICAgICB9XG5cbiAgICAgIGlmKGtleSAhPT0gbnVsbCAmJiBrZXkgaW4gcnZhbC5jYWNoZSkge1xuICAgICAgICAvLyBnZXQgY2FjaGVkIHNlc3Npb24gYW5kIHJlbW92ZSBmcm9tIGNhY2hlXG4gICAgICAgIHNlc3Npb24gPSBydmFsLmNhY2hlW2tleV07XG4gICAgICAgIGRlbGV0ZSBydmFsLmNhY2hlW2tleV07XG4gICAgICAgIGZvcih2YXIgaSBpbiBydmFsLm9yZGVyKSB7XG4gICAgICAgICAgaWYocnZhbC5vcmRlcltpXSA9PT0ga2V5KSB7XG4gICAgICAgICAgICBydmFsLm9yZGVyLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gc2Vzc2lvbjtcbiAgICB9O1xuXG4gICAgLy8gc2V0IGEgc2Vzc2lvbiBpbiB0aGUgY2FjaGVcbiAgICBydmFsLnNldFNlc3Npb24gPSBmdW5jdGlvbihzZXNzaW9uSWQsIHNlc3Npb24pIHtcbiAgICAgIC8vIHJlbW92ZSBzZXNzaW9uIGZyb20gY2FjaGUgaWYgYXQgY2FwYWNpdHlcbiAgICAgIGlmKHJ2YWwub3JkZXIubGVuZ3RoID09PSBydmFsLmNhcGFjaXR5KSB7XG4gICAgICAgIHZhciBrZXkgPSBydmFsLm9yZGVyLnNoaWZ0KCk7XG4gICAgICAgIGRlbGV0ZSBydmFsLmNhY2hlW2tleV07XG4gICAgICB9XG4gICAgICAvLyBhZGQgc2Vzc2lvbiB0byBjYWNoZVxuICAgICAgdmFyIGtleSA9IGZvcmdlLnV0aWwuYnl0ZXNUb0hleChzZXNzaW9uSWQpO1xuICAgICAgcnZhbC5vcmRlci5wdXNoKGtleSk7XG4gICAgICBydmFsLmNhY2hlW2tleV0gPSBzZXNzaW9uO1xuICAgIH07XG4gIH1cblxuICByZXR1cm4gcnZhbDtcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBUTFMgY29ubmVjdGlvbi5cbiAqXG4gKiBTZWUgcHVibGljIGNyZWF0ZUNvbm5lY3Rpb24oKSBkb2NzIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgdGhlIG9wdGlvbnMgZm9yIHRoaXMgY29ubmVjdGlvbi5cbiAqXG4gKiBAcmV0dXJuIHRoZSBuZXcgVExTIGNvbm5lY3Rpb24uXG4gKi9cbnRscy5jcmVhdGVDb25uZWN0aW9uID0gZnVuY3Rpb24ob3B0aW9ucykge1xuICB2YXIgY2FTdG9yZSA9IG51bGw7XG4gIGlmKG9wdGlvbnMuY2FTdG9yZSkge1xuICAgIC8vIGlmIENBIHN0b3JlIGlzIGFuIGFycmF5LCBjb252ZXJ0IGl0IHRvIGEgQ0Egc3RvcmUgb2JqZWN0XG4gICAgaWYoZm9yZ2UudXRpbC5pc0FycmF5KG9wdGlvbnMuY2FTdG9yZSkpIHtcbiAgICAgIGNhU3RvcmUgPSBmb3JnZS5wa2kuY3JlYXRlQ2FTdG9yZShvcHRpb25zLmNhU3RvcmUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjYVN0b3JlID0gb3B0aW9ucy5jYVN0b3JlO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBjcmVhdGUgZW1wdHkgQ0Egc3RvcmVcbiAgICBjYVN0b3JlID0gZm9yZ2UucGtpLmNyZWF0ZUNhU3RvcmUoKTtcbiAgfVxuXG4gIC8vIHNldHVwIGRlZmF1bHQgY2lwaGVyIHN1aXRlc1xuICB2YXIgY2lwaGVyU3VpdGVzID0gb3B0aW9ucy5jaXBoZXJTdWl0ZXMgfHwgbnVsbDtcbiAgaWYoY2lwaGVyU3VpdGVzID09PSBudWxsKSB7XG4gICAgY2lwaGVyU3VpdGVzID0gW107XG4gICAgZm9yKHZhciBrZXkgaW4gdGxzLkNpcGhlclN1aXRlcykge1xuICAgICAgY2lwaGVyU3VpdGVzLnB1c2godGxzLkNpcGhlclN1aXRlc1trZXldKTtcbiAgICB9XG4gIH1cblxuICAvLyBzZXQgZGVmYXVsdCBlbnRpdHlcbiAgdmFyIGVudGl0eSA9IChvcHRpb25zLnNlcnZlciB8fCBmYWxzZSkgP1xuICAgIHRscy5Db25uZWN0aW9uRW5kLnNlcnZlciA6IHRscy5Db25uZWN0aW9uRW5kLmNsaWVudDtcblxuICAvLyBjcmVhdGUgc2Vzc2lvbiBjYWNoZSBpZiByZXF1ZXN0ZWRcbiAgdmFyIHNlc3Npb25DYWNoZSA9IG9wdGlvbnMuc2Vzc2lvbkNhY2hlID9cbiAgICB0bHMuY3JlYXRlU2Vzc2lvbkNhY2hlKG9wdGlvbnMuc2Vzc2lvbkNhY2hlKSA6IG51bGw7XG5cbiAgLy8gY3JlYXRlIFRMUyBjb25uZWN0aW9uXG4gIHZhciBjID0ge1xuICAgIHZlcnNpb246IHttYWpvcjogdGxzLlZlcnNpb24ubWFqb3IsIG1pbm9yOiB0bHMuVmVyc2lvbi5taW5vcn0sXG4gICAgZW50aXR5OiBlbnRpdHksXG4gICAgc2Vzc2lvbklkOiBvcHRpb25zLnNlc3Npb25JZCxcbiAgICBjYVN0b3JlOiBjYVN0b3JlLFxuICAgIHNlc3Npb25DYWNoZTogc2Vzc2lvbkNhY2hlLFxuICAgIGNpcGhlclN1aXRlczogY2lwaGVyU3VpdGVzLFxuICAgIGNvbm5lY3RlZDogb3B0aW9ucy5jb25uZWN0ZWQsXG4gICAgdmlydHVhbEhvc3Q6IG9wdGlvbnMudmlydHVhbEhvc3QgfHwgbnVsbCxcbiAgICB2ZXJpZnlDbGllbnQ6IG9wdGlvbnMudmVyaWZ5Q2xpZW50IHx8IGZhbHNlLFxuICAgIHZlcmlmeTogb3B0aW9ucy52ZXJpZnkgfHwgZnVuY3Rpb24oY24sIHZmZCwgZHB0aCwgY3RzKSB7cmV0dXJuIHZmZDt9LFxuICAgIHZlcmlmeU9wdGlvbnM6IG9wdGlvbnMudmVyaWZ5T3B0aW9ucyB8fCB7fSxcbiAgICBnZXRDZXJ0aWZpY2F0ZTogb3B0aW9ucy5nZXRDZXJ0aWZpY2F0ZSB8fCBudWxsLFxuICAgIGdldFByaXZhdGVLZXk6IG9wdGlvbnMuZ2V0UHJpdmF0ZUtleSB8fCBudWxsLFxuICAgIGdldFNpZ25hdHVyZTogb3B0aW9ucy5nZXRTaWduYXR1cmUgfHwgbnVsbCxcbiAgICBpbnB1dDogZm9yZ2UudXRpbC5jcmVhdGVCdWZmZXIoKSxcbiAgICB0bHNEYXRhOiBmb3JnZS51dGlsLmNyZWF0ZUJ1ZmZlcigpLFxuICAgIGRhdGE6IGZvcmdlLnV0aWwuY3JlYXRlQnVmZmVyKCksXG4gICAgdGxzRGF0YVJlYWR5OiBvcHRpb25zLnRsc0RhdGFSZWFkeSxcbiAgICBkYXRhUmVhZHk6IG9wdGlvbnMuZGF0YVJlYWR5LFxuICAgIGhlYXJ0YmVhdFJlY2VpdmVkOiBvcHRpb25zLmhlYXJ0YmVhdFJlY2VpdmVkLFxuICAgIGNsb3NlZDogb3B0aW9ucy5jbG9zZWQsXG4gICAgZXJyb3I6IGZ1bmN0aW9uKGMsIGV4KSB7XG4gICAgICAvLyBzZXQgb3JpZ2luIGlmIG5vdCBzZXRcbiAgICAgIGV4Lm9yaWdpbiA9IGV4Lm9yaWdpbiB8fFxuICAgICAgICAoKGMuZW50aXR5ID09PSB0bHMuQ29ubmVjdGlvbkVuZC5jbGllbnQpID8gJ2NsaWVudCcgOiAnc2VydmVyJyk7XG5cbiAgICAgIC8vIHNlbmQgVExTIGFsZXJ0XG4gICAgICBpZihleC5zZW5kKSB7XG4gICAgICAgIHRscy5xdWV1ZShjLCB0bHMuY3JlYXRlQWxlcnQoYywgZXguYWxlcnQpKTtcbiAgICAgICAgdGxzLmZsdXNoKGMpO1xuICAgICAgfVxuXG4gICAgICAvLyBlcnJvciBpcyBmYXRhbCBieSBkZWZhdWx0XG4gICAgICB2YXIgZmF0YWwgPSAoZXguZmF0YWwgIT09IGZhbHNlKTtcbiAgICAgIGlmKGZhdGFsKSB7XG4gICAgICAgIC8vIHNldCBmYWlsIGZsYWdcbiAgICAgICAgYy5mYWlsID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gY2FsbCBlcnJvciBoYW5kbGVyIGZpcnN0XG4gICAgICBvcHRpb25zLmVycm9yKGMsIGV4KTtcblxuICAgICAgaWYoZmF0YWwpIHtcbiAgICAgICAgLy8gZmF0YWwgZXJyb3IsIGNsb3NlIGNvbm5lY3Rpb24sIGRvIG5vdCBjbGVhciBmYWlsXG4gICAgICAgIGMuY2xvc2UoZmFsc2UpO1xuICAgICAgfVxuICAgIH0sXG4gICAgZGVmbGF0ZTogb3B0aW9ucy5kZWZsYXRlIHx8IG51bGwsXG4gICAgaW5mbGF0ZTogb3B0aW9ucy5pbmZsYXRlIHx8IG51bGxcbiAgfTtcblxuICAvKipcbiAgICogUmVzZXRzIGEgY2xvc2VkIFRMUyBjb25uZWN0aW9uIGZvciByZXVzZS4gQ2FsbGVkIGluIGMuY2xvc2UoKS5cbiAgICpcbiAgICogQHBhcmFtIGNsZWFyRmFpbCB0cnVlIHRvIGNsZWFyIHRoZSBmYWlsIGZsYWcgKGRlZmF1bHQ6IHRydWUpLlxuICAgKi9cbiAgYy5yZXNldCA9IGZ1bmN0aW9uKGNsZWFyRmFpbCkge1xuICAgIGMudmVyc2lvbiA9IHttYWpvcjogdGxzLlZlcnNpb24ubWFqb3IsIG1pbm9yOiB0bHMuVmVyc2lvbi5taW5vcn07XG4gICAgYy5yZWNvcmQgPSBudWxsO1xuICAgIGMuc2Vzc2lvbiA9IG51bGw7XG4gICAgYy5wZWVyQ2VydGlmaWNhdGUgPSBudWxsO1xuICAgIGMuc3RhdGUgPSB7XG4gICAgICBwZW5kaW5nOiBudWxsLFxuICAgICAgY3VycmVudDogbnVsbFxuICAgIH07XG4gICAgYy5leHBlY3QgPSAoYy5lbnRpdHkgPT09IHRscy5Db25uZWN0aW9uRW5kLmNsaWVudCkgPyBTSEUgOiBDSEU7XG4gICAgYy5mcmFnbWVudGVkID0gbnVsbDtcbiAgICBjLnJlY29yZHMgPSBbXTtcbiAgICBjLm9wZW4gPSBmYWxzZTtcbiAgICBjLmhhbmRzaGFrZXMgPSAwO1xuICAgIGMuaGFuZHNoYWtpbmcgPSBmYWxzZTtcbiAgICBjLmlzQ29ubmVjdGVkID0gZmFsc2U7XG4gICAgYy5mYWlsID0gIShjbGVhckZhaWwgfHwgdHlwZW9mKGNsZWFyRmFpbCkgPT09ICd1bmRlZmluZWQnKTtcbiAgICBjLmlucHV0LmNsZWFyKCk7XG4gICAgYy50bHNEYXRhLmNsZWFyKCk7XG4gICAgYy5kYXRhLmNsZWFyKCk7XG4gICAgYy5zdGF0ZS5jdXJyZW50ID0gdGxzLmNyZWF0ZUNvbm5lY3Rpb25TdGF0ZShjKTtcbiAgfTtcblxuICAvLyBkbyBpbml0aWFsIHJlc2V0IG9mIGNvbm5lY3Rpb25cbiAgYy5yZXNldCgpO1xuXG4gIC8qKlxuICAgKiBVcGRhdGVzIHRoZSBjdXJyZW50IFRMUyBlbmdpbmUgc3RhdGUgYmFzZWQgb24gdGhlIGdpdmVuIHJlY29yZC5cbiAgICpcbiAgICogQHBhcmFtIGMgdGhlIFRMUyBjb25uZWN0aW9uLlxuICAgKiBAcGFyYW0gcmVjb3JkIHRoZSBUTFMgcmVjb3JkIHRvIGFjdCBvbi5cbiAgICovXG4gIHZhciBfdXBkYXRlID0gZnVuY3Rpb24oYywgcmVjb3JkKSB7XG4gICAgLy8gZ2V0IHJlY29yZCBoYW5kbGVyIChhbGlnbiB0eXBlIGluIHRhYmxlIGJ5IHN1YnRyYWN0aW5nIGxvd2VzdClcbiAgICB2YXIgYWxpZ25lZCA9IHJlY29yZC50eXBlIC0gdGxzLkNvbnRlbnRUeXBlLmNoYW5nZV9jaXBoZXJfc3BlYztcbiAgICB2YXIgaGFuZGxlcnMgPSBjdFRhYmxlW2MuZW50aXR5XVtjLmV4cGVjdF07XG4gICAgaWYoYWxpZ25lZCBpbiBoYW5kbGVycykge1xuICAgICAgaGFuZGxlcnNbYWxpZ25lZF0oYywgcmVjb3JkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gdW5leHBlY3RlZCByZWNvcmRcbiAgICAgIHRscy5oYW5kbGVVbmV4cGVjdGVkKGMsIHJlY29yZCk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBSZWFkcyB0aGUgcmVjb3JkIGhlYWRlciBhbmQgaW5pdGlhbGl6ZXMgdGhlIG5leHQgcmVjb3JkIG9uIHRoZSBnaXZlblxuICAgKiBjb25uZWN0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gYyB0aGUgVExTIGNvbm5lY3Rpb24gd2l0aCB0aGUgbmV4dCByZWNvcmQuXG4gICAqXG4gICAqIEByZXR1cm4gMCBpZiB0aGUgaW5wdXQgZGF0YSBjb3VsZCBiZSBwcm9jZXNzZWQsIG90aGVyd2lzZSB0aGVcbiAgICogICAgICAgICBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgZm9yIGRhdGEgdG8gYmUgcHJvY2Vzc2VkLlxuICAgKi9cbiAgdmFyIF9yZWFkUmVjb3JkSGVhZGVyID0gZnVuY3Rpb24oYykge1xuICAgIHZhciBydmFsID0gMDtcblxuICAgIC8vIGdldCBpbnB1dCBidWZmZXIgYW5kIGl0cyBsZW5ndGhcbiAgICB2YXIgYiA9IGMuaW5wdXQ7XG4gICAgdmFyIGxlbiA9IGIubGVuZ3RoKCk7XG5cbiAgICAvLyBuZWVkIGF0IGxlYXN0IDUgYnl0ZXMgdG8gaW5pdGlhbGl6ZSBhIHJlY29yZFxuICAgIGlmKGxlbiA8IDUpIHtcbiAgICAgIHJ2YWwgPSA1IC0gbGVuO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBlbm91Z2ggYnl0ZXMgZm9yIGhlYWRlclxuICAgICAgLy8gaW5pdGlhbGl6ZSByZWNvcmRcbiAgICAgIGMucmVjb3JkID0ge1xuICAgICAgICB0eXBlOiBiLmdldEJ5dGUoKSxcbiAgICAgICAgdmVyc2lvbjoge1xuICAgICAgICAgIG1ham9yOiBiLmdldEJ5dGUoKSxcbiAgICAgICAgICBtaW5vcjogYi5nZXRCeXRlKClcbiAgICAgICAgfSxcbiAgICAgICAgbGVuZ3RoOiBiLmdldEludDE2KCksXG4gICAgICAgIGZyYWdtZW50OiBmb3JnZS51dGlsLmNyZWF0ZUJ1ZmZlcigpLFxuICAgICAgICByZWFkeTogZmFsc2VcbiAgICAgIH07XG5cbiAgICAgIC8vIGNoZWNrIHJlY29yZCB2ZXJzaW9uXG4gICAgICB2YXIgY29tcGF0aWJsZVZlcnNpb24gPSAoYy5yZWNvcmQudmVyc2lvbi5tYWpvciA9PT0gYy52ZXJzaW9uLm1ham9yKTtcbiAgICAgIGlmKGNvbXBhdGlibGVWZXJzaW9uICYmIGMuc2Vzc2lvbiAmJiBjLnNlc3Npb24udmVyc2lvbikge1xuICAgICAgICAvLyBzZXNzaW9uIHZlcnNpb24gYWxyZWFkeSBzZXQsIHJlcXVpcmUgc2FtZSBtaW5vciB2ZXJzaW9uXG4gICAgICAgIGNvbXBhdGlibGVWZXJzaW9uID0gKGMucmVjb3JkLnZlcnNpb24ubWlub3IgPT09IGMudmVyc2lvbi5taW5vcik7XG4gICAgICB9XG4gICAgICBpZighY29tcGF0aWJsZVZlcnNpb24pIHtcbiAgICAgICAgYy5lcnJvcihjLCB7XG4gICAgICAgICAgbWVzc2FnZTogJ0luY29tcGF0aWJsZSBUTFMgdmVyc2lvbi4nLFxuICAgICAgICAgIHNlbmQ6IHRydWUsXG4gICAgICAgICAgYWxlcnQ6IHtcbiAgICAgICAgICAgIGxldmVsOiB0bHMuQWxlcnQuTGV2ZWwuZmF0YWwsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogdGxzLkFsZXJ0LkRlc2NyaXB0aW9uLnByb3RvY29sX3ZlcnNpb25cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBydmFsO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZWFkcyB0aGUgbmV4dCByZWNvcmQncyBjb250ZW50cyBhbmQgYXBwZW5kcyBpdHMgbWVzc2FnZSB0byBhbnlcbiAgICogcHJldmlvdXNseSBmcmFnbWVudGVkIG1lc3NhZ2UuXG4gICAqXG4gICAqIEBwYXJhbSBjIHRoZSBUTFMgY29ubmVjdGlvbiB3aXRoIHRoZSBuZXh0IHJlY29yZC5cbiAgICpcbiAgICogQHJldHVybiAwIGlmIHRoZSBpbnB1dCBkYXRhIGNvdWxkIGJlIHByb2Nlc3NlZCwgb3RoZXJ3aXNlIHRoZVxuICAgKiAgICAgICAgIG51bWJlciBvZiBieXRlcyByZXF1aXJlZCBmb3IgZGF0YSB0byBiZSBwcm9jZXNzZWQuXG4gICAqL1xuICB2YXIgX3JlYWRSZWNvcmQgPSBmdW5jdGlvbihjKSB7XG4gICAgdmFyIHJ2YWwgPSAwO1xuXG4gICAgLy8gZW5zdXJlIHRoZXJlIGlzIGVub3VnaCBpbnB1dCBkYXRhIHRvIGdldCB0aGUgZW50aXJlIHJlY29yZFxuICAgIHZhciBiID0gYy5pbnB1dDtcbiAgICB2YXIgbGVuID0gYi5sZW5ndGgoKTtcbiAgICBpZihsZW4gPCBjLnJlY29yZC5sZW5ndGgpIHtcbiAgICAgIC8vIG5vdCBlbm91Z2ggZGF0YSB5ZXQsIHJldHVybiBob3cgbXVjaCBpcyByZXF1aXJlZFxuICAgICAgcnZhbCA9IGMucmVjb3JkLmxlbmd0aCAtIGxlbjtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gdGhlcmUgaXMgZW5vdWdoIGRhdGEgdG8gcGFyc2UgdGhlIHBlbmRpbmcgcmVjb3JkXG4gICAgICAvLyBmaWxsIHJlY29yZCBmcmFnbWVudCBhbmQgY29tcGFjdCBpbnB1dCBidWZmZXJcbiAgICAgIGMucmVjb3JkLmZyYWdtZW50LnB1dEJ5dGVzKGIuZ2V0Qnl0ZXMoYy5yZWNvcmQubGVuZ3RoKSk7XG4gICAgICBiLmNvbXBhY3QoKTtcblxuICAgICAgLy8gdXBkYXRlIHJlY29yZCB1c2luZyBjdXJyZW50IHJlYWQgc3RhdGVcbiAgICAgIHZhciBzID0gYy5zdGF0ZS5jdXJyZW50LnJlYWQ7XG4gICAgICBpZihzLnVwZGF0ZShjLCBjLnJlY29yZCkpIHtcbiAgICAgICAgLy8gc2VlIGlmIHRoZXJlIGlzIGEgcHJldmlvdXNseSBmcmFnbWVudGVkIG1lc3NhZ2UgdGhhdCB0aGVcbiAgICAgICAgLy8gbmV3IHJlY29yZCdzIG1lc3NhZ2UgZnJhZ21lbnQgc2hvdWxkIGJlIGFwcGVuZGVkIHRvXG4gICAgICAgIGlmKGMuZnJhZ21lbnRlZCAhPT0gbnVsbCkge1xuICAgICAgICAgIC8vIGlmIHRoZSByZWNvcmQgdHlwZSBtYXRjaGVzIGEgcHJldmlvdXNseSBmcmFnbWVudGVkXG4gICAgICAgICAgLy8gcmVjb3JkLCBhcHBlbmQgdGhlIHJlY29yZCBmcmFnbWVudCB0byBpdFxuICAgICAgICAgIGlmKGMuZnJhZ21lbnRlZC50eXBlID09PSBjLnJlY29yZC50eXBlKSB7XG4gICAgICAgICAgICAvLyBjb25jYXRlbmF0ZSByZWNvcmQgZnJhZ21lbnRzXG4gICAgICAgICAgICBjLmZyYWdtZW50ZWQuZnJhZ21lbnQucHV0QnVmZmVyKGMucmVjb3JkLmZyYWdtZW50KTtcbiAgICAgICAgICAgIGMucmVjb3JkID0gYy5mcmFnbWVudGVkO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBlcnJvciwgaW52YWxpZCBmcmFnbWVudGVkIHJlY29yZFxuICAgICAgICAgICAgYy5lcnJvcihjLCB7XG4gICAgICAgICAgICAgIG1lc3NhZ2U6ICdJbnZhbGlkIGZyYWdtZW50ZWQgcmVjb3JkLicsXG4gICAgICAgICAgICAgIHNlbmQ6IHRydWUsXG4gICAgICAgICAgICAgIGFsZXJ0OiB7XG4gICAgICAgICAgICAgICAgbGV2ZWw6IHRscy5BbGVydC5MZXZlbC5mYXRhbCxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICAgICAgICAgIHRscy5BbGVydC5EZXNjcmlwdGlvbi51bmV4cGVjdGVkX21lc3NhZ2VcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gcmVjb3JkIGlzIG5vdyByZWFkeVxuICAgICAgICBjLnJlY29yZC5yZWFkeSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJ2YWw7XG4gIH07XG5cbiAgLyoqXG4gICAqIFBlcmZvcm1zIGEgaGFuZHNoYWtlIHVzaW5nIHRoZSBUTFMgSGFuZHNoYWtlIFByb3RvY29sLCBhcyBhIGNsaWVudC5cbiAgICpcbiAgICogVGhpcyBtZXRob2Qgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGlmIHRoZSBjb25uZWN0aW9uIGlzIGluIGNsaWVudCBtb2RlLlxuICAgKlxuICAgKiBAcGFyYW0gc2Vzc2lvbklkIHRoZSBzZXNzaW9uIElEIHRvIHVzZSwgbnVsbCB0byBzdGFydCBhIG5ldyBvbmUuXG4gICAqL1xuICBjLmhhbmRzaGFrZSA9IGZ1bmN0aW9uKHNlc3Npb25JZCkge1xuICAgIC8vIGVycm9yIHRvIGNhbGwgdGhpcyBpbiBub24tY2xpZW50IG1vZGVcbiAgICBpZihjLmVudGl0eSAhPT0gdGxzLkNvbm5lY3Rpb25FbmQuY2xpZW50KSB7XG4gICAgICAvLyBub3QgZmF0YWwgZXJyb3JcbiAgICAgIGMuZXJyb3IoYywge1xuICAgICAgICBtZXNzYWdlOiAnQ2Fubm90IGluaXRpYXRlIGhhbmRzaGFrZSBhcyBhIHNlcnZlci4nLFxuICAgICAgICBmYXRhbDogZmFsc2VcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZihjLmhhbmRzaGFraW5nKSB7XG4gICAgICAvLyBoYW5kc2hha2UgaXMgYWxyZWFkeSBpbiBwcm9ncmVzcywgZmFpbCBidXQgbm90IGZhdGFsIGVycm9yXG4gICAgICBjLmVycm9yKGMsIHtcbiAgICAgICAgbWVzc2FnZTogJ0hhbmRzaGFrZSBhbHJlYWR5IGluIHByb2dyZXNzLicsXG4gICAgICAgIGZhdGFsOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGNsZWFyIGZhaWwgZmxhZyBvbiByZXVzZVxuICAgICAgaWYoYy5mYWlsICYmICFjLm9wZW4gJiYgYy5oYW5kc2hha2VzID09PSAwKSB7XG4gICAgICAgIGMuZmFpbCA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICAvLyBub3cgaGFuZHNoYWtpbmdcbiAgICAgIGMuaGFuZHNoYWtpbmcgPSB0cnVlO1xuXG4gICAgICAvLyBkZWZhdWx0IHRvIGJsYW5rIChuZXcgc2Vzc2lvbilcbiAgICAgIHNlc3Npb25JZCA9IHNlc3Npb25JZCB8fCAnJztcblxuICAgICAgLy8gaWYgYSBzZXNzaW9uIElEIHdhcyBzcGVjaWZpZWQsIHRyeSB0byBmaW5kIGl0IGluIHRoZSBjYWNoZVxuICAgICAgdmFyIHNlc3Npb24gPSBudWxsO1xuICAgICAgaWYoc2Vzc2lvbklkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgaWYoYy5zZXNzaW9uQ2FjaGUpIHtcbiAgICAgICAgICBzZXNzaW9uID0gYy5zZXNzaW9uQ2FjaGUuZ2V0U2Vzc2lvbihzZXNzaW9uSWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gbWF0Y2hpbmcgc2Vzc2lvbiBub3QgZm91bmQgaW4gY2FjaGUsIGNsZWFyIHNlc3Npb24gSURcbiAgICAgICAgaWYoc2Vzc2lvbiA9PT0gbnVsbCkge1xuICAgICAgICAgIHNlc3Npb25JZCA9ICcnO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIG5vIHNlc3Npb24gZ2l2ZW4sIGdyYWIgYSBzZXNzaW9uIGZyb20gdGhlIGNhY2hlLCBpZiBhdmFpbGFibGVcbiAgICAgIGlmKHNlc3Npb25JZC5sZW5ndGggPT09IDAgJiYgYy5zZXNzaW9uQ2FjaGUpIHtcbiAgICAgICAgc2Vzc2lvbiA9IGMuc2Vzc2lvbkNhY2hlLmdldFNlc3Npb24oKTtcbiAgICAgICAgaWYoc2Vzc2lvbiAhPT0gbnVsbCkge1xuICAgICAgICAgIHNlc3Npb25JZCA9IHNlc3Npb24uaWQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gc2V0IHVwIHNlc3Npb25cbiAgICAgIGMuc2Vzc2lvbiA9IHtcbiAgICAgICAgaWQ6IHNlc3Npb25JZCxcbiAgICAgICAgdmVyc2lvbjogbnVsbCxcbiAgICAgICAgY2lwaGVyU3VpdGU6IG51bGwsXG4gICAgICAgIGNvbXByZXNzaW9uTWV0aG9kOiBudWxsLFxuICAgICAgICBzZXJ2ZXJDZXJ0aWZpY2F0ZTogbnVsbCxcbiAgICAgICAgY2VydGlmaWNhdGVSZXF1ZXN0OiBudWxsLFxuICAgICAgICBjbGllbnRDZXJ0aWZpY2F0ZTogbnVsbCxcbiAgICAgICAgc3A6IHt9LFxuICAgICAgICBtZDU6IGZvcmdlLm1kLm1kNS5jcmVhdGUoKSxcbiAgICAgICAgc2hhMTogZm9yZ2UubWQuc2hhMS5jcmVhdGUoKVxuICAgICAgfTtcblxuICAgICAgLy8gdXNlIGV4aXN0aW5nIHNlc3Npb24gaW5mb3JtYXRpb25cbiAgICAgIGlmKHNlc3Npb24pIHtcbiAgICAgICAgLy8gb25seSB1cGRhdGUgdmVyc2lvbiBvbiBjb25uZWN0aW9uLCBzZXNzaW9uIHZlcnNpb24gbm90IHlldCBzZXRcbiAgICAgICAgYy52ZXJzaW9uID0gc2Vzc2lvbi52ZXJzaW9uO1xuICAgICAgICBjLnNlc3Npb24uc3AgPSBzZXNzaW9uLnNwO1xuICAgICAgfVxuXG4gICAgICAvLyBnZW5lcmF0ZSBuZXcgY2xpZW50IHJhbmRvbVxuICAgICAgYy5zZXNzaW9uLnNwLmNsaWVudF9yYW5kb20gPSB0bHMuY3JlYXRlUmFuZG9tKCkuZ2V0Qnl0ZXMoKTtcblxuICAgICAgLy8gY29ubmVjdGlvbiBub3cgb3BlblxuICAgICAgYy5vcGVuID0gdHJ1ZTtcblxuICAgICAgLy8gc2VuZCBoZWxsb1xuICAgICAgdGxzLnF1ZXVlKGMsIHRscy5jcmVhdGVSZWNvcmQoYywge1xuICAgICAgICB0eXBlOiB0bHMuQ29udGVudFR5cGUuaGFuZHNoYWtlLFxuICAgICAgICBkYXRhOiB0bHMuY3JlYXRlQ2xpZW50SGVsbG8oYylcbiAgICAgIH0pKTtcbiAgICAgIHRscy5mbHVzaChjKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIFRMUyBwcm90b2NvbCBkYXRhIGhhcyBiZWVuIHJlY2VpdmVkIGZyb20gc29tZXdoZXJlIGFuZCBzaG91bGRcbiAgICogYmUgcHJvY2Vzc2VkIGJ5IHRoZSBUTFMgZW5naW5lLlxuICAgKlxuICAgKiBAcGFyYW0gZGF0YSB0aGUgVExTIHByb3RvY29sIGRhdGEsIGFzIGEgc3RyaW5nLCB0byBwcm9jZXNzLlxuICAgKlxuICAgKiBAcmV0dXJuIDAgaWYgdGhlIGRhdGEgY291bGQgYmUgcHJvY2Vzc2VkLCBvdGhlcndpc2UgdGhlIG51bWJlciBvZiBieXRlc1xuICAgKiAgICAgICAgIHJlcXVpcmVkIGZvciBkYXRhIHRvIGJlIHByb2Nlc3NlZC5cbiAgICovXG4gIGMucHJvY2VzcyA9IGZ1bmN0aW9uKGRhdGEpIHtcbiAgICB2YXIgcnZhbCA9IDA7XG5cbiAgICAvLyBidWZmZXIgaW5wdXQgZGF0YVxuICAgIGlmKGRhdGEpIHtcbiAgICAgIGMuaW5wdXQucHV0Qnl0ZXMoZGF0YSk7XG4gICAgfVxuXG4gICAgLy8gcHJvY2VzcyBuZXh0IHJlY29yZCBpZiBubyBmYWlsdXJlLCBwcm9jZXNzIHdpbGwgYmUgY2FsbGVkIGFmdGVyXG4gICAgLy8gZWFjaCByZWNvcmQgaXMgaGFuZGxlZCAoc2luY2UgaGFuZGxpbmcgY2FuIGJlIGFzeW5jaHJvbm91cylcbiAgICBpZighYy5mYWlsKSB7XG4gICAgICAvLyByZXNldCByZWNvcmQgaWYgcmVhZHkgYW5kIG5vdyBlbXB0eVxuICAgICAgaWYoYy5yZWNvcmQgIT09IG51bGwgJiZcbiAgICAgICAgYy5yZWNvcmQucmVhZHkgJiYgYy5yZWNvcmQuZnJhZ21lbnQuaXNFbXB0eSgpKSB7XG4gICAgICAgIGMucmVjb3JkID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgLy8gaWYgdGhlcmUgaXMgbm8gcGVuZGluZyByZWNvcmQsIHRyeSB0byByZWFkIHJlY29yZCBoZWFkZXJcbiAgICAgIGlmKGMucmVjb3JkID09PSBudWxsKSB7XG4gICAgICAgIHJ2YWwgPSBfcmVhZFJlY29yZEhlYWRlcihjKTtcbiAgICAgIH1cblxuICAgICAgLy8gcmVhZCB0aGUgbmV4dCByZWNvcmQgKGlmIHJlY29yZCBub3QgeWV0IHJlYWR5KVxuICAgICAgaWYoIWMuZmFpbCAmJiBjLnJlY29yZCAhPT0gbnVsbCAmJiAhYy5yZWNvcmQucmVhZHkpIHtcbiAgICAgICAgcnZhbCA9IF9yZWFkUmVjb3JkKGMpO1xuICAgICAgfVxuXG4gICAgICAvLyByZWNvcmQgcmVhZHkgdG8gYmUgaGFuZGxlZCwgdXBkYXRlIGVuZ2luZSBzdGF0ZVxuICAgICAgaWYoIWMuZmFpbCAmJiBjLnJlY29yZCAhPT0gbnVsbCAmJiBjLnJlY29yZC5yZWFkeSkge1xuICAgICAgICBfdXBkYXRlKGMsIGMucmVjb3JkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcnZhbDtcbiAgfTtcblxuICAvKipcbiAgICogUmVxdWVzdHMgdGhhdCBhcHBsaWNhdGlvbiBkYXRhIGJlIHBhY2thZ2VkIGludG8gYSBUTFMgcmVjb3JkLiBUaGVcbiAgICogdGxzRGF0YVJlYWR5IGhhbmRsZXIgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgVExTIHJlY29yZChzKSBoYXZlIGJlZW5cbiAgICogcHJlcGFyZWQuXG4gICAqXG4gICAqIEBwYXJhbSBkYXRhIHRoZSBhcHBsaWNhdGlvbiBkYXRhLCBhcyBhIHJhdyAnYmluYXJ5JyBlbmNvZGVkIHN0cmluZywgdG9cbiAgICogICAgICAgICAgYmUgc2VudDsgdG8gc2VuZCB1dGYtMTYvdXRmLTggc3RyaW5nIGRhdGEsIHVzZSB0aGUgcmV0dXJuIHZhbHVlXG4gICAqICAgICAgICAgIG9mIHV0aWwuZW5jb2RlVXRmOChzdHIpLlxuICAgKlxuICAgKiBAcmV0dXJuIHRydWUgb24gc3VjY2VzcywgZmFsc2Ugb24gZmFpbHVyZS5cbiAgICovXG4gIGMucHJlcGFyZSA9IGZ1bmN0aW9uKGRhdGEpIHtcbiAgICB0bHMucXVldWUoYywgdGxzLmNyZWF0ZVJlY29yZChjLCB7XG4gICAgICB0eXBlOiB0bHMuQ29udGVudFR5cGUuYXBwbGljYXRpb25fZGF0YSxcbiAgICAgIGRhdGE6IGZvcmdlLnV0aWwuY3JlYXRlQnVmZmVyKGRhdGEpXG4gICAgfSkpO1xuICAgIHJldHVybiB0bHMuZmx1c2goYyk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFJlcXVlc3RzIHRoYXQgYSBoZWFydGJlYXQgcmVxdWVzdCBiZSBwYWNrYWdlZCBpbnRvIGEgVExTIHJlY29yZCBmb3JcbiAgICogdHJhbnNtaXNzaW9uLiBUaGUgdGxzRGF0YVJlYWR5IGhhbmRsZXIgd2lsbCBiZSBjYWxsZWQgd2hlbiBUTFMgcmVjb3JkKHMpXG4gICAqIGhhdmUgYmVlbiBwcmVwYXJlZC5cbiAgICpcbiAgICogV2hlbiBhIGhlYXJ0YmVhdCByZXNwb25zZSBoYXMgYmVlbiByZWNlaXZlZCwgdGhlIGhlYXJ0YmVhdFJlY2VpdmVkXG4gICAqIGhhbmRsZXIgd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGUgbWF0Y2hpbmcgcGF5bG9hZC4gVGhpcyBoYW5kbGVyIGNhblxuICAgKiBiZSB1c2VkIHRvIGNsZWFyIGEgcmV0cmFuc21pc3Npb24gdGltZXIsIGV0Yy5cbiAgICpcbiAgICogQHBhcmFtIHBheWxvYWQgdGhlIGhlYXJ0YmVhdCBkYXRhIHRvIHNlbmQgYXMgdGhlIHBheWxvYWQgaW4gdGhlIG1lc3NhZ2UuXG4gICAqIEBwYXJhbSBbcGF5bG9hZExlbmd0aF0gdGhlIHBheWxvYWQgbGVuZ3RoIHRvIHVzZSwgZGVmYXVsdHMgdG8gdGhlXG4gICAqICAgICAgICAgIGFjdHVhbCBwYXlsb2FkIGxlbmd0aC5cbiAgICpcbiAgICogQHJldHVybiB0cnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIG9uIGZhaWx1cmUuXG4gICAqL1xuICBjLnByZXBhcmVIZWFydGJlYXRSZXF1ZXN0ID0gZnVuY3Rpb24ocGF5bG9hZCwgcGF5bG9hZExlbmd0aCkge1xuICAgIGlmKHBheWxvYWQgaW5zdGFuY2VvZiBmb3JnZS51dGlsLkJ5dGVCdWZmZXIpIHtcbiAgICAgIHBheWxvYWQgPSBwYXlsb2FkLmJ5dGVzKCk7XG4gICAgfVxuICAgIGlmKHR5cGVvZiBwYXlsb2FkTGVuZ3RoID09PSAndW5kZWZpbmVkJykge1xuICAgICAgcGF5bG9hZExlbmd0aCA9IHBheWxvYWQubGVuZ3RoO1xuICAgIH1cbiAgICBjLmV4cGVjdGVkSGVhcnRiZWF0UGF5bG9hZCA9IHBheWxvYWQ7XG4gICAgdGxzLnF1ZXVlKGMsIHRscy5jcmVhdGVSZWNvcmQoYywge1xuICAgICAgdHlwZTogdGxzLkNvbnRlbnRUeXBlLmhlYXJ0YmVhdCxcbiAgICAgIGRhdGE6IHRscy5jcmVhdGVIZWFydGJlYXQoXG4gICAgICAgIHRscy5IZWFydGJlYXRNZXNzYWdlVHlwZS5oZWFydGJlYXRfcmVxdWVzdCwgcGF5bG9hZCwgcGF5bG9hZExlbmd0aClcbiAgICB9KSk7XG4gICAgcmV0dXJuIHRscy5mbHVzaChjKTtcbiAgfTtcblxuICAvKipcbiAgICogQ2xvc2VzIHRoZSBjb25uZWN0aW9uIChzZW5kcyBhIGNsb3NlX25vdGlmeSBhbGVydCkuXG4gICAqXG4gICAqIEBwYXJhbSBjbGVhckZhaWwgdHJ1ZSB0byBjbGVhciB0aGUgZmFpbCBmbGFnIChkZWZhdWx0OiB0cnVlKS5cbiAgICovXG4gIGMuY2xvc2UgPSBmdW5jdGlvbihjbGVhckZhaWwpIHtcbiAgICAvLyBzYXZlIHNlc3Npb24gaWYgY29ubmVjdGlvbiBkaWRuJ3QgZmFpbFxuICAgIGlmKCFjLmZhaWwgJiYgYy5zZXNzaW9uQ2FjaGUgJiYgYy5zZXNzaW9uKSB7XG4gICAgICAvLyBvbmx5IG5lZWQgdG8gcHJlc2VydmUgc2Vzc2lvbiBJRCwgdmVyc2lvbiwgYW5kIHNlY3VyaXR5IHBhcmFtc1xuICAgICAgdmFyIHNlc3Npb24gPSB7XG4gICAgICAgIGlkOiBjLnNlc3Npb24uaWQsXG4gICAgICAgIHZlcnNpb246IGMuc2Vzc2lvbi52ZXJzaW9uLFxuICAgICAgICBzcDogYy5zZXNzaW9uLnNwXG4gICAgICB9O1xuICAgICAgc2Vzc2lvbi5zcC5rZXlzID0gbnVsbDtcbiAgICAgIGMuc2Vzc2lvbkNhY2hlLnNldFNlc3Npb24oc2Vzc2lvbi5pZCwgc2Vzc2lvbik7XG4gICAgfVxuXG4gICAgaWYoYy5vcGVuKSB7XG4gICAgICAvLyBjb25uZWN0aW9uIG5vIGxvbmdlciBvcGVuLCBjbGVhciBpbnB1dFxuICAgICAgYy5vcGVuID0gZmFsc2U7XG4gICAgICBjLmlucHV0LmNsZWFyKCk7XG5cbiAgICAgIC8vIGlmIGNvbm5lY3RlZCBvciBoYW5kc2hha2luZywgc2VuZCBhbiBhbGVydFxuICAgICAgaWYoYy5pc0Nvbm5lY3RlZCB8fCBjLmhhbmRzaGFraW5nKSB7XG4gICAgICAgIGMuaXNDb25uZWN0ZWQgPSBjLmhhbmRzaGFraW5nID0gZmFsc2U7XG5cbiAgICAgICAgLy8gc2VuZCBjbG9zZV9ub3RpZnkgYWxlcnRcbiAgICAgICAgdGxzLnF1ZXVlKGMsIHRscy5jcmVhdGVBbGVydChjLCB7XG4gICAgICAgICAgbGV2ZWw6IHRscy5BbGVydC5MZXZlbC53YXJuaW5nLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiB0bHMuQWxlcnQuRGVzY3JpcHRpb24uY2xvc2Vfbm90aWZ5XG4gICAgICAgIH0pKTtcbiAgICAgICAgdGxzLmZsdXNoKGMpO1xuICAgICAgfVxuXG4gICAgICAvLyBjYWxsIGhhbmRsZXJcbiAgICAgIGMuY2xvc2VkKGMpO1xuICAgIH1cblxuICAgIC8vIHJlc2V0IFRMUyBjb25uZWN0aW9uLCBkbyBub3QgY2xlYXIgZmFpbCBmbGFnXG4gICAgYy5yZXNldChjbGVhckZhaWwpO1xuICB9O1xuXG4gIHJldHVybiBjO1xufTtcblxuLyogVExTIEFQSSAqL1xubW9kdWxlLmV4cG9ydHMgPSBmb3JnZS50bHMgPSBmb3JnZS50bHMgfHwge307XG5cbi8vIGV4cG9zZSBub24tZnVuY3Rpb25zXG5mb3IodmFyIGtleSBpbiB0bHMpIHtcbiAgaWYodHlwZW9mIHRsc1trZXldICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgZm9yZ2UudGxzW2tleV0gPSB0bHNba2V5XTtcbiAgfVxufVxuXG4vLyBleHBvc2UgcHJmX3RsczEgZm9yIHRlc3RpbmdcbmZvcmdlLnRscy5wcmZfdGxzMSA9IHByZl9UTFMxO1xuXG4vLyBleHBvc2Ugc2hhMSBobWFjIG1ldGhvZFxuZm9yZ2UudGxzLmhtYWNfc2hhMSA9IGhtYWNfc2hhMTtcblxuLy8gZXhwb3NlIHNlc3Npb24gY2FjaGUgY3JlYXRpb25cbmZvcmdlLnRscy5jcmVhdGVTZXNzaW9uQ2FjaGUgPSB0bHMuY3JlYXRlU2Vzc2lvbkNhY2hlO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgVExTIGNvbm5lY3Rpb24uIFRoaXMgZG9lcyBub3QgbWFrZSBhbnkgYXNzdW1wdGlvbnMgYWJvdXQgdGhlXG4gKiB0cmFuc3BvcnQgbGF5ZXIgdGhhdCBUTFMgaXMgd29ya2luZyBvbiB0b3Agb2YsIGllOiBpdCBkb2VzIG5vdCBhc3N1bWUgdGhlcmVcbiAqIGlzIGEgVENQL0lQIGNvbm5lY3Rpb24gb3IgZXN0YWJsaXNoIG9uZS4gQSBUTFMgY29ubmVjdGlvbiBpcyB0b3RhbGx5XG4gKiBhYnN0cmFjdGVkIGF3YXkgZnJvbSB0aGUgbGF5ZXIgaXMgcnVucyBvbiB0b3Agb2YsIGl0IG1lcmVseSBlc3RhYmxpc2hlcyBhXG4gKiBzZWN1cmUgY2hhbm5lbCBiZXR3ZWVuIGEgY2xpZW50XCIgYW5kIGEgXCJzZXJ2ZXJcIi5cbiAqXG4gKiBBIFRMUyBjb25uZWN0aW9uIGNvbnRhaW5zIDQgY29ubmVjdGlvbiBzdGF0ZXM6IHBlbmRpbmcgcmVhZCBhbmQgd3JpdGUsIGFuZFxuICogY3VycmVudCByZWFkIGFuZCB3cml0ZS5cbiAqXG4gKiBBdCBpbml0aWFsaXphdGlvbiwgdGhlIGN1cnJlbnQgcmVhZCBhbmQgd3JpdGUgc3RhdGVzIHdpbGwgYmUgbnVsbC4gT25seSBvbmNlXG4gKiB0aGUgc2VjdXJpdHkgcGFyYW1ldGVycyBoYXZlIGJlZW4gc2V0IGFuZCB0aGUga2V5cyBoYXZlIGJlZW4gZ2VuZXJhdGVkIGNhblxuICogdGhlIHBlbmRpbmcgc3RhdGVzIGJlIGNvbnZlcnRlZCBpbnRvIGN1cnJlbnQgc3RhdGVzLiBDdXJyZW50IHN0YXRlcyB3aWxsIGJlXG4gKiB1cGRhdGVkIGZvciBlYWNoIHJlY29yZCBwcm9jZXNzZWQuXG4gKlxuICogQSBjdXN0b20gY2VydGlmaWNhdGUgdmVyaWZ5IGNhbGxiYWNrIG1heSBiZSBwcm92aWRlZCB0byBjaGVjayBpbmZvcm1hdGlvblxuICogbGlrZSB0aGUgY29tbW9uIG5hbWUgb24gdGhlIHNlcnZlcidzIGNlcnRpZmljYXRlLiBJdCB3aWxsIGJlIGNhbGxlZCBmb3JcbiAqIGV2ZXJ5IGNlcnRpZmljYXRlIGluIHRoZSBjaGFpbi4gSXQgaGFzIHRoZSBmb2xsb3dpbmcgc2lnbmF0dXJlOlxuICpcbiAqIHZhcmlhYmxlIGZ1bmMoYywgY2VydHMsIGluZGV4LCBwcmVWZXJpZnkpXG4gKiBXaGVyZTpcbiAqIGMgICAgICAgICBUaGUgVExTIGNvbm5lY3Rpb25cbiAqIHZlcmlmaWVkICBTZXQgdG8gdHJ1ZSBpZiBjZXJ0aWZpY2F0ZSB3YXMgdmVyaWZpZWQsIG90aGVyd2lzZSB0aGUgYWxlcnRcbiAqICAgICAgICAgICB0bHMuQWxlcnQuRGVzY3JpcHRpb24gZm9yIHdoeSB0aGUgY2VydGlmaWNhdGUgZmFpbGVkLlxuICogZGVwdGggICAgIFRoZSBjdXJyZW50IGluZGV4IGluIHRoZSBjaGFpbiwgd2hlcmUgMCBpcyB0aGUgc2VydmVyJ3MgY2VydC5cbiAqIGNlcnRzICAgICBUaGUgY2VydGlmaWNhdGUgY2hhaW4sICpOT1RFKiBpZiB0aGUgc2VydmVyIHdhcyBhbm9ueW1vdXMgdGhlblxuICogICAgICAgICAgIHRoZSBjaGFpbiB3aWxsIGJlIGVtcHR5LlxuICpcbiAqIFRoZSBmdW5jdGlvbiByZXR1cm5zIHRydWUgb24gc3VjY2VzcyBhbmQgb24gZmFpbHVyZSBlaXRoZXIgdGhlIGFwcHJvcHJpYXRlXG4gKiB0bHMuQWxlcnQuRGVzY3JpcHRpb24gb3IgYW4gb2JqZWN0IHdpdGggJ2FsZXJ0JyBzZXQgdG8gdGhlIGFwcHJvcHJpYXRlXG4gKiB0bHMuQWxlcnQuRGVzY3JpcHRpb24gYW5kICdtZXNzYWdlJyBzZXQgdG8gYSBjdXN0b20gZXJyb3IgbWVzc2FnZS4gSWYgdHJ1ZVxuICogaXMgbm90IHJldHVybmVkIHRoZW4gdGhlIGNvbm5lY3Rpb24gd2lsbCBhYm9ydCB1c2luZywgaW4gb3JkZXIgb2ZcbiAqIGF2YWlsYWJpbGl0eSwgZmlyc3QgdGhlIHJldHVybmVkIGFsZXJ0IGRlc2NyaXB0aW9uLCBzZWNvbmQgdGhlIHByZVZlcmlmeVxuICogYWxlcnQgZGVzY3JpcHRpb24sIGFuZCBsYXN0bHkgdGhlIGRlZmF1bHQgJ2JhZF9jZXJ0aWZpY2F0ZScuXG4gKlxuICogVGhlcmUgYXJlIHRocmVlIGNhbGxiYWNrcyB0aGF0IGNhbiBiZSB1c2VkIHRvIG1ha2UgdXNlIG9mIGNsaWVudC1zaWRlXG4gKiBjZXJ0aWZpY2F0ZXMgd2hlcmUgZWFjaCB0YWtlcyB0aGUgVExTIGNvbm5lY3Rpb24gYXMgdGhlIGZpcnN0IHBhcmFtZXRlcjpcbiAqXG4gKiBnZXRDZXJ0aWZpY2F0ZShjb25uLCBoaW50KVxuICogICBUaGUgc2Vjb25kIHBhcmFtZXRlciBpcyBhIGhpbnQgYXMgdG8gd2hpY2ggY2VydGlmaWNhdGUgc2hvdWxkIGJlXG4gKiAgIHJldHVybmVkLiBJZiB0aGUgY29ubmVjdGlvbiBlbnRpdHkgaXMgYSBjbGllbnQsIHRoZW4gdGhlIGhpbnQgd2lsbCBiZVxuICogICB0aGUgQ2VydGlmaWNhdGVSZXF1ZXN0IG1lc3NhZ2UgZnJvbSB0aGUgc2VydmVyIHRoYXQgaXMgcGFydCBvZiB0aGVcbiAqICAgVExTIHByb3RvY29sLiBJZiB0aGUgY29ubmVjdGlvbiBlbnRpdHkgaXMgYSBzZXJ2ZXIsIHRoZW4gaXQgd2lsbCBiZVxuICogICB0aGUgc2VydmVybmFtZSBsaXN0IHByb3ZpZGVkIHZpYSBhbiBTTkkgZXh0ZW5zaW9uIHRoZSBDbGllbnRIZWxsbywgaWZcbiAqICAgb25lIHdhcyBwcm92aWRlZCAoZW1wdHkgYXJyYXkgaWYgbm90KS4gVGhlIGhpbnQgY2FuIGJlIGV4YW1pbmVkIHRvXG4gKiAgIGRldGVybWluZSB3aGljaCBjZXJ0aWZpY2F0ZSB0byB1c2UgKGFkdmFuY2VkKS4gTW9zdCBpbXBsZW1lbnRhdGlvbnNcbiAqICAgd2lsbCBqdXN0IHJldHVybiBhIGNlcnRpZmljYXRlLiBUaGUgcmV0dXJuIHZhbHVlIG11c3QgYmUgYVxuICogICBQRU0tZm9ybWF0dGVkIGNlcnRpZmljYXRlIG9yIGFuIGFycmF5IG9mIFBFTS1mb3JtYXR0ZWQgY2VydGlmaWNhdGVzXG4gKiAgIHRoYXQgY29uc3RpdHV0ZSBhIGNlcnRpZmljYXRlIGNoYWluLCB3aXRoIHRoZSBmaXJzdCBpbiB0aGUgYXJyYXkvY2hhaW5cbiAqICAgYmVpbmcgdGhlIGNsaWVudCdzIGNlcnRpZmljYXRlLlxuICogZ2V0UHJpdmF0ZUtleShjb25uLCBjZXJ0aWZpY2F0ZSlcbiAqICAgVGhlIHNlY29uZCBwYXJhbWV0ZXIgaXMgYW4gZm9yZ2UucGtpIFguNTA5IGNlcnRpZmljYXRlIG9iamVjdCB0aGF0XG4gKiAgIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVxdWVzdGVkIHByaXZhdGUga2V5LiBUaGUgcmV0dXJuIHZhbHVlIG11c3RcbiAqICAgYmUgYSBQRU0tZm9ybWF0dGVkIHByaXZhdGUga2V5LlxuICogZ2V0U2lnbmF0dXJlKGNvbm4sIGJ5dGVzLCBjYWxsYmFjaylcbiAqICAgVGhpcyBjYWxsYmFjayBjYW4gYmUgdXNlZCBpbnN0ZWFkIG9mIGdldFByaXZhdGVLZXkgaWYgdGhlIHByaXZhdGUga2V5XG4gKiAgIGlzIG5vdCBkaXJlY3RseSBhY2Nlc3NpYmxlIGluIGphdmFzY3JpcHQgb3Igc2hvdWxkIG5vdCBiZS4gRm9yXG4gKiAgIGluc3RhbmNlLCBhIHNlY3VyZSBleHRlcm5hbCB3ZWIgc2VydmljZSBjb3VsZCBwcm92aWRlIHRoZSBzaWduYXR1cmVcbiAqICAgaW4gZXhjaGFuZ2UgZm9yIGFwcHJvcHJpYXRlIGNyZWRlbnRpYWxzLiBUaGUgc2Vjb25kIHBhcmFtZXRlciBpcyBhXG4gKiAgIHN0cmluZyBvZiBieXRlcyB0byBiZSBzaWduZWQgdGhhdCBhcmUgcGFydCBvZiB0aGUgVExTIHByb3RvY29sLiBUaGVzZVxuICogICBieXRlcyBhcmUgdXNlZCB0byB2ZXJpZnkgdGhhdCB0aGUgcHJpdmF0ZSBrZXkgZm9yIHRoZSBwcmV2aW91c2x5XG4gKiAgIHByb3ZpZGVkIGNsaWVudC1zaWRlIGNlcnRpZmljYXRlIGlzIGFjY2Vzc2libGUgdG8gdGhlIGNsaWVudC4gVGhlXG4gKiAgIGNhbGxiYWNrIGlzIGEgZnVuY3Rpb24gdGhhdCB0YWtlcyAyIHBhcmFtZXRlcnMsIHRoZSBUTFMgY29ubmVjdGlvblxuICogICBhbmQgdGhlIFJTQSBlbmNyeXB0ZWQgKHNpZ25lZCkgYnl0ZXMgYXMgYSBzdHJpbmcuIFRoaXMgY2FsbGJhY2sgbXVzdFxuICogICBiZSBjYWxsZWQgb25jZSB0aGUgc2lnbmF0dXJlIGlzIHJlYWR5LlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIHRoZSBvcHRpb25zIGZvciB0aGlzIGNvbm5lY3Rpb246XG4gKiAgIHNlcnZlcjogdHJ1ZSBpZiB0aGUgY29ubmVjdGlvbiBpcyBzZXJ2ZXItc2lkZSwgZmFsc2UgZm9yIGNsaWVudC5cbiAqICAgc2Vzc2lvbklkOiBhIHNlc3Npb24gSUQgdG8gcmV1c2UsIG51bGwgZm9yIGEgbmV3IGNvbm5lY3Rpb24uXG4gKiAgIGNhU3RvcmU6IGFuIGFycmF5IG9mIGNlcnRpZmljYXRlcyB0byB0cnVzdC5cbiAqICAgc2Vzc2lvbkNhY2hlOiBhIHNlc3Npb24gY2FjaGUgdG8gdXNlLlxuICogICBjaXBoZXJTdWl0ZXM6IGFuIG9wdGlvbmFsIGFycmF5IG9mIGNpcGhlciBzdWl0ZXMgdG8gdXNlLFxuICogICAgIHNlZSB0bHMuQ2lwaGVyU3VpdGVzLlxuICogICBjb25uZWN0ZWQ6IGZ1bmN0aW9uKGNvbm4pIGNhbGxlZCB3aGVuIHRoZSBmaXJzdCBoYW5kc2hha2UgY29tcGxldGVzLlxuICogICB2aXJ0dWFsSG9zdDogdGhlIHZpcnR1YWwgc2VydmVyIG5hbWUgdG8gdXNlIGluIGEgVExTIFNOSSBleHRlbnNpb24uXG4gKiAgIHZlcmlmeUNsaWVudDogdHJ1ZSB0byByZXF1aXJlIGEgY2xpZW50IGNlcnRpZmljYXRlIGluIHNlcnZlciBtb2RlLFxuICogICAgICdvcHRpb25hbCcgdG8gcmVxdWVzdCBvbmUsIGZhbHNlIG5vdCB0byAoZGVmYXVsdDogZmFsc2UpLlxuICogICB2ZXJpZnk6IGEgaGFuZGxlciB1c2VkIHRvIGN1c3RvbSB2ZXJpZnkgY2VydGlmaWNhdGVzIGluIHRoZSBjaGFpbi5cbiAqICAgdmVyaWZ5T3B0aW9uczogYW4gb2JqZWN0IHdpdGggb3B0aW9ucyBmb3IgdGhlIGNlcnRpZmljYXRlIGNoYWluIHZhbGlkYXRpb24uXG4gKiAgICAgU2VlIGRvY3VtZW50YXRpb24gb2YgcGtpLnZlcmlmeUNlcnRpZmljYXRlQ2hhaW4gZm9yIHBvc3NpYmxlIG9wdGlvbnMuXG4gKiAgICAgdmVyaWZ5T3B0aW9ucy52ZXJpZnkgaXMgaWdub3JlZC4gSWYgeW91IHdpc2ggdG8gc3BlY2lmeSBhIHZlcmlmeSBoYW5kbGVyXG4gKiAgICAgdXNlIHRoZSB2ZXJpZnkga2V5LlxuICogICBnZXRDZXJ0aWZpY2F0ZTogYW4gb3B0aW9uYWwgY2FsbGJhY2sgdXNlZCB0byBnZXQgYSBjZXJ0aWZpY2F0ZSBvclxuICogICAgIGEgY2hhaW4gb2YgY2VydGlmaWNhdGVzIChhcyBhbiBhcnJheSkuXG4gKiAgIGdldFByaXZhdGVLZXk6IGFuIG9wdGlvbmFsIGNhbGxiYWNrIHVzZWQgdG8gZ2V0IGEgcHJpdmF0ZSBrZXkuXG4gKiAgIGdldFNpZ25hdHVyZTogYW4gb3B0aW9uYWwgY2FsbGJhY2sgdXNlZCB0byBnZXQgYSBzaWduYXR1cmUuXG4gKiAgIHRsc0RhdGFSZWFkeTogZnVuY3Rpb24oY29ubikgY2FsbGVkIHdoZW4gVExTIHByb3RvY29sIGRhdGEgaGFzIGJlZW5cbiAqICAgICBwcmVwYXJlZCBhbmQgaXMgcmVhZHkgdG8gYmUgdXNlZCAodHlwaWNhbGx5IHNlbnQgb3ZlciBhIHNvY2tldFxuICogICAgIGNvbm5lY3Rpb24gdG8gaXRzIGRlc3RpbmF0aW9uKSwgcmVhZCBmcm9tIGNvbm4udGxzRGF0YSBidWZmZXIuXG4gKiAgIGRhdGFSZWFkeTogZnVuY3Rpb24oY29ubikgY2FsbGVkIHdoZW4gYXBwbGljYXRpb24gZGF0YSBoYXNcbiAqICAgICBiZWVuIHBhcnNlZCBmcm9tIGEgVExTIHJlY29yZCBhbmQgc2hvdWxkIGJlIGNvbnN1bWVkIGJ5IHRoZVxuICogICAgIGFwcGxpY2F0aW9uLCByZWFkIGZyb20gY29ubi5kYXRhIGJ1ZmZlci5cbiAqICAgY2xvc2VkOiBmdW5jdGlvbihjb25uKSBjYWxsZWQgd2hlbiB0aGUgY29ubmVjdGlvbiBoYXMgYmVlbiBjbG9zZWQuXG4gKiAgIGVycm9yOiBmdW5jdGlvbihjb25uLCBlcnJvcikgY2FsbGVkIHdoZW4gdGhlcmUgd2FzIGFuIGVycm9yLlxuICogICBkZWZsYXRlOiBmdW5jdGlvbihpbkJ5dGVzKSBpZiBwcm92aWRlZCwgd2lsbCBkZWZsYXRlIFRMUyByZWNvcmRzIHVzaW5nXG4gKiAgICAgdGhlIGRlZmxhdGUgYWxnb3JpdGhtIGlmIHRoZSBzZXJ2ZXIgc3VwcG9ydHMgaXQuXG4gKiAgIGluZmxhdGU6IGZ1bmN0aW9uKGluQnl0ZXMpIGlmIHByb3ZpZGVkLCB3aWxsIGluZmxhdGUgVExTIHJlY29yZHMgdXNpbmdcbiAqICAgICB0aGUgZGVmbGF0ZSBhbGdvcml0aG0gaWYgdGhlIHNlcnZlciBzdXBwb3J0cyBpdC5cbiAqXG4gKiBAcmV0dXJuIHRoZSBuZXcgVExTIGNvbm5lY3Rpb24uXG4gKi9cbmZvcmdlLnRscy5jcmVhdGVDb25uZWN0aW9uID0gdGxzLmNyZWF0ZUNvbm5lY3Rpb247XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///79\n")},function(module,exports,__webpack_require__){eval("/**\n * Javascript implementation of a basic Public Key Infrastructure, including\n * support for RSA public and private keys.\n *\n * @author Dave Longley\n *\n * Copyright (c) 2010-2013 Digital Bazaar, Inc.\n */\nvar forge = __webpack_require__(4);\n__webpack_require__(14);\n__webpack_require__(23);\n__webpack_require__(81);\n__webpack_require__(27);\n__webpack_require__(56);\n__webpack_require__(87);\n__webpack_require__(59);\n__webpack_require__(42);\n__webpack_require__(7);\n__webpack_require__(58);\n\n// shortcut for asn.1 API\nvar asn1 = forge.asn1;\n\n/* Public Key Infrastructure (PKI) implementation. */\nvar pki = module.exports = forge.pki = forge.pki || {};\n\n/**\n * NOTE: THIS METHOD IS DEPRECATED. Use pem.decode() instead.\n *\n * Converts PEM-formatted data to DER.\n *\n * @param pem the PEM-formatted data.\n *\n * @return the DER-formatted data.\n */\npki.pemToDer = function(pem) {\n  var msg = forge.pem.decode(pem)[0];\n  if(msg.procType && msg.procType.type === 'ENCRYPTED') {\n    throw new Error('Could not convert PEM to DER; PEM is encrypted.');\n  }\n  return forge.util.createBuffer(msg.body);\n};\n\n/**\n * Converts an RSA private key from PEM format.\n *\n * @param pem the PEM-formatted private key.\n *\n * @return the private key.\n */\npki.privateKeyFromPem = function(pem) {\n  var msg = forge.pem.decode(pem)[0];\n\n  if(msg.type !== 'PRIVATE KEY' && msg.type !== 'RSA PRIVATE KEY') {\n    var error = new Error('Could not convert private key from PEM; PEM ' +\n      'header type is not \"PRIVATE KEY\" or \"RSA PRIVATE KEY\".');\n    error.headerType = msg.type;\n    throw error;\n  }\n  if(msg.procType && msg.procType.type === 'ENCRYPTED') {\n    throw new Error('Could not convert private key from PEM; PEM is encrypted.');\n  }\n\n  // convert DER to ASN.1 object\n  var obj = asn1.fromDer(msg.body);\n\n  return pki.privateKeyFromAsn1(obj);\n};\n\n/**\n * Converts an RSA private key to PEM format.\n *\n * @param key the private key.\n * @param maxline the maximum characters per line, defaults to 64.\n *\n * @return the PEM-formatted private key.\n */\npki.privateKeyToPem = function(key, maxline) {\n  // convert to ASN.1, then DER, then PEM-encode\n  var msg = {\n    type: 'RSA PRIVATE KEY',\n    body: asn1.toDer(pki.privateKeyToAsn1(key)).getBytes()\n  };\n  return forge.pem.encode(msg, {maxline: maxline});\n};\n\n/**\n * Converts a PrivateKeyInfo to PEM format.\n *\n * @param pki the PrivateKeyInfo.\n * @param maxline the maximum characters per line, defaults to 64.\n *\n * @return the PEM-formatted private key.\n */\npki.privateKeyInfoToPem = function(pki, maxline) {\n  // convert to DER, then PEM-encode\n  var msg = {\n    type: 'PRIVATE KEY',\n    body: asn1.toDer(pki).getBytes()\n  };\n  return forge.pem.encode(msg, {maxline: maxline});\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODAuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbm9kZS1mb3JnZS9saWIvcGtpLmpzPzBjNTIiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBKYXZhc2NyaXB0IGltcGxlbWVudGF0aW9uIG9mIGEgYmFzaWMgUHVibGljIEtleSBJbmZyYXN0cnVjdHVyZSwgaW5jbHVkaW5nXG4gKiBzdXBwb3J0IGZvciBSU0EgcHVibGljIGFuZCBwcml2YXRlIGtleXMuXG4gKlxuICogQGF1dGhvciBEYXZlIExvbmdsZXlcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMyBEaWdpdGFsIEJhemFhciwgSW5jLlxuICovXG52YXIgZm9yZ2UgPSByZXF1aXJlKCcuL2ZvcmdlJyk7XG5yZXF1aXJlKCcuL2FzbjEnKTtcbnJlcXVpcmUoJy4vb2lkcycpO1xucmVxdWlyZSgnLi9wYmUnKTtcbnJlcXVpcmUoJy4vcGVtJyk7XG5yZXF1aXJlKCcuL3Bia2RmMicpO1xucmVxdWlyZSgnLi9wa2NzMTInKTtcbnJlcXVpcmUoJy4vcHNzJyk7XG5yZXF1aXJlKCcuL3JzYScpO1xucmVxdWlyZSgnLi91dGlsJyk7XG5yZXF1aXJlKCcuL3g1MDknKTtcblxuLy8gc2hvcnRjdXQgZm9yIGFzbi4xIEFQSVxudmFyIGFzbjEgPSBmb3JnZS5hc24xO1xuXG4vKiBQdWJsaWMgS2V5IEluZnJhc3RydWN0dXJlIChQS0kpIGltcGxlbWVudGF0aW9uLiAqL1xudmFyIHBraSA9IG1vZHVsZS5leHBvcnRzID0gZm9yZ2UucGtpID0gZm9yZ2UucGtpIHx8IHt9O1xuXG4vKipcbiAqIE5PVEU6IFRISVMgTUVUSE9EIElTIERFUFJFQ0FURUQuIFVzZSBwZW0uZGVjb2RlKCkgaW5zdGVhZC5cbiAqXG4gKiBDb252ZXJ0cyBQRU0tZm9ybWF0dGVkIGRhdGEgdG8gREVSLlxuICpcbiAqIEBwYXJhbSBwZW0gdGhlIFBFTS1mb3JtYXR0ZWQgZGF0YS5cbiAqXG4gKiBAcmV0dXJuIHRoZSBERVItZm9ybWF0dGVkIGRhdGEuXG4gKi9cbnBraS5wZW1Ub0RlciA9IGZ1bmN0aW9uKHBlbSkge1xuICB2YXIgbXNnID0gZm9yZ2UucGVtLmRlY29kZShwZW0pWzBdO1xuICBpZihtc2cucHJvY1R5cGUgJiYgbXNnLnByb2NUeXBlLnR5cGUgPT09ICdFTkNSWVBURUQnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgY29udmVydCBQRU0gdG8gREVSOyBQRU0gaXMgZW5jcnlwdGVkLicpO1xuICB9XG4gIHJldHVybiBmb3JnZS51dGlsLmNyZWF0ZUJ1ZmZlcihtc2cuYm9keSk7XG59O1xuXG4vKipcbiAqIENvbnZlcnRzIGFuIFJTQSBwcml2YXRlIGtleSBmcm9tIFBFTSBmb3JtYXQuXG4gKlxuICogQHBhcmFtIHBlbSB0aGUgUEVNLWZvcm1hdHRlZCBwcml2YXRlIGtleS5cbiAqXG4gKiBAcmV0dXJuIHRoZSBwcml2YXRlIGtleS5cbiAqL1xucGtpLnByaXZhdGVLZXlGcm9tUGVtID0gZnVuY3Rpb24ocGVtKSB7XG4gIHZhciBtc2cgPSBmb3JnZS5wZW0uZGVjb2RlKHBlbSlbMF07XG5cbiAgaWYobXNnLnR5cGUgIT09ICdQUklWQVRFIEtFWScgJiYgbXNnLnR5cGUgIT09ICdSU0EgUFJJVkFURSBLRVknKSB7XG4gICAgdmFyIGVycm9yID0gbmV3IEVycm9yKCdDb3VsZCBub3QgY29udmVydCBwcml2YXRlIGtleSBmcm9tIFBFTTsgUEVNICcgK1xuICAgICAgJ2hlYWRlciB0eXBlIGlzIG5vdCBcIlBSSVZBVEUgS0VZXCIgb3IgXCJSU0EgUFJJVkFURSBLRVlcIi4nKTtcbiAgICBlcnJvci5oZWFkZXJUeXBlID0gbXNnLnR5cGU7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbiAgaWYobXNnLnByb2NUeXBlICYmIG1zZy5wcm9jVHlwZS50eXBlID09PSAnRU5DUllQVEVEJykge1xuICAgIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IGNvbnZlcnQgcHJpdmF0ZSBrZXkgZnJvbSBQRU07IFBFTSBpcyBlbmNyeXB0ZWQuJyk7XG4gIH1cblxuICAvLyBjb252ZXJ0IERFUiB0byBBU04uMSBvYmplY3RcbiAgdmFyIG9iaiA9IGFzbjEuZnJvbURlcihtc2cuYm9keSk7XG5cbiAgcmV0dXJuIHBraS5wcml2YXRlS2V5RnJvbUFzbjEob2JqKTtcbn07XG5cbi8qKlxuICogQ29udmVydHMgYW4gUlNBIHByaXZhdGUga2V5IHRvIFBFTSBmb3JtYXQuXG4gKlxuICogQHBhcmFtIGtleSB0aGUgcHJpdmF0ZSBrZXkuXG4gKiBAcGFyYW0gbWF4bGluZSB0aGUgbWF4aW11bSBjaGFyYWN0ZXJzIHBlciBsaW5lLCBkZWZhdWx0cyB0byA2NC5cbiAqXG4gKiBAcmV0dXJuIHRoZSBQRU0tZm9ybWF0dGVkIHByaXZhdGUga2V5LlxuICovXG5wa2kucHJpdmF0ZUtleVRvUGVtID0gZnVuY3Rpb24oa2V5LCBtYXhsaW5lKSB7XG4gIC8vIGNvbnZlcnQgdG8gQVNOLjEsIHRoZW4gREVSLCB0aGVuIFBFTS1lbmNvZGVcbiAgdmFyIG1zZyA9IHtcbiAgICB0eXBlOiAnUlNBIFBSSVZBVEUgS0VZJyxcbiAgICBib2R5OiBhc24xLnRvRGVyKHBraS5wcml2YXRlS2V5VG9Bc24xKGtleSkpLmdldEJ5dGVzKClcbiAgfTtcbiAgcmV0dXJuIGZvcmdlLnBlbS5lbmNvZGUobXNnLCB7bWF4bGluZTogbWF4bGluZX0pO1xufTtcblxuLyoqXG4gKiBDb252ZXJ0cyBhIFByaXZhdGVLZXlJbmZvIHRvIFBFTSBmb3JtYXQuXG4gKlxuICogQHBhcmFtIHBraSB0aGUgUHJpdmF0ZUtleUluZm8uXG4gKiBAcGFyYW0gbWF4bGluZSB0aGUgbWF4aW11bSBjaGFyYWN0ZXJzIHBlciBsaW5lLCBkZWZhdWx0cyB0byA2NC5cbiAqXG4gKiBAcmV0dXJuIHRoZSBQRU0tZm9ybWF0dGVkIHByaXZhdGUga2V5LlxuICovXG5wa2kucHJpdmF0ZUtleUluZm9Ub1BlbSA9IGZ1bmN0aW9uKHBraSwgbWF4bGluZSkge1xuICAvLyBjb252ZXJ0IHRvIERFUiwgdGhlbiBQRU0tZW5jb2RlXG4gIHZhciBtc2cgPSB7XG4gICAgdHlwZTogJ1BSSVZBVEUgS0VZJyxcbiAgICBib2R5OiBhc24xLnRvRGVyKHBraSkuZ2V0Qnl0ZXMoKVxuICB9O1xuICByZXR1cm4gZm9yZ2UucGVtLmVuY29kZShtc2csIHttYXhsaW5lOiBtYXhsaW5lfSk7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///80\n")},function(module,exports,__webpack_require__){eval("/**\n * Password-based encryption functions.\n *\n * @author Dave Longley\n * @author Stefan Siegl <stesie@brokenpipe.de>\n *\n * Copyright (c) 2010-2013 Digital Bazaar, Inc.\n * Copyright (c) 2012 Stefan Siegl <stesie@brokenpipe.de>\n *\n * An EncryptedPrivateKeyInfo:\n *\n * EncryptedPrivateKeyInfo ::= SEQUENCE {\n *   encryptionAlgorithm  EncryptionAlgorithmIdentifier,\n *   encryptedData        EncryptedData }\n *\n * EncryptionAlgorithmIdentifier ::= AlgorithmIdentifier\n *\n * EncryptedData ::= OCTET STRING\n */\nvar forge = __webpack_require__(4);\n__webpack_require__(22);\n__webpack_require__(14);\n__webpack_require__(41);\n__webpack_require__(17);\n__webpack_require__(23);\n__webpack_require__(56);\n__webpack_require__(27);\n__webpack_require__(13);\n__webpack_require__(84);\n__webpack_require__(42);\n__webpack_require__(7);\n\nif(typeof BigInteger === 'undefined') {\n  var BigInteger = forge.jsbn.BigInteger;\n}\n\n// shortcut for asn.1 API\nvar asn1 = forge.asn1;\n\n/* Password-based encryption implementation. */\nvar pki = forge.pki = forge.pki || {};\nmodule.exports = pki.pbe = forge.pbe = forge.pbe || {};\nvar oids = pki.oids;\n\n// validator for an EncryptedPrivateKeyInfo structure\n// Note: Currently only works w/algorithm params\nvar encryptedPrivateKeyValidator = {\n  name: 'EncryptedPrivateKeyInfo',\n  tagClass: asn1.Class.UNIVERSAL,\n  type: asn1.Type.SEQUENCE,\n  constructed: true,\n  value: [{\n    name: 'EncryptedPrivateKeyInfo.encryptionAlgorithm',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.SEQUENCE,\n    constructed: true,\n    value: [{\n      name: 'AlgorithmIdentifier.algorithm',\n      tagClass: asn1.Class.UNIVERSAL,\n      type: asn1.Type.OID,\n      constructed: false,\n      capture: 'encryptionOid'\n    }, {\n      name: 'AlgorithmIdentifier.parameters',\n      tagClass: asn1.Class.UNIVERSAL,\n      type: asn1.Type.SEQUENCE,\n      constructed: true,\n      captureAsn1: 'encryptionParams'\n    }]\n  }, {\n    // encryptedData\n    name: 'EncryptedPrivateKeyInfo.encryptedData',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.OCTETSTRING,\n    constructed: false,\n    capture: 'encryptedData'\n  }]\n};\n\n// validator for a PBES2Algorithms structure\n// Note: Currently only works w/PBKDF2 + AES encryption schemes\nvar PBES2AlgorithmsValidator = {\n  name: 'PBES2Algorithms',\n  tagClass: asn1.Class.UNIVERSAL,\n  type: asn1.Type.SEQUENCE,\n  constructed: true,\n  value: [{\n    name: 'PBES2Algorithms.keyDerivationFunc',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.SEQUENCE,\n    constructed: true,\n    value: [{\n      name: 'PBES2Algorithms.keyDerivationFunc.oid',\n      tagClass: asn1.Class.UNIVERSAL,\n      type: asn1.Type.OID,\n      constructed: false,\n      capture: 'kdfOid'\n    }, {\n      name: 'PBES2Algorithms.params',\n      tagClass: asn1.Class.UNIVERSAL,\n      type: asn1.Type.SEQUENCE,\n      constructed: true,\n      value: [{\n        name: 'PBES2Algorithms.params.salt',\n        tagClass: asn1.Class.UNIVERSAL,\n        type: asn1.Type.OCTETSTRING,\n        constructed: false,\n        capture: 'kdfSalt'\n      }, {\n        name: 'PBES2Algorithms.params.iterationCount',\n        tagClass: asn1.Class.UNIVERSAL,\n        type: asn1.Type.INTEGER,\n        constructed: false,\n        capture: 'kdfIterationCount'\n      }, {\n        name: 'PBES2Algorithms.params.keyLength',\n        tagClass: asn1.Class.UNIVERSAL,\n        type: asn1.Type.INTEGER,\n        constructed: false,\n        optional: true,\n        capture: 'keyLength'\n      }, {\n        // prf\n        name: 'PBES2Algorithms.params.prf',\n        tagClass: asn1.Class.UNIVERSAL,\n        type: asn1.Type.SEQUENCE,\n        constructed: true,\n        optional: true,\n        value: [{\n          name: 'PBES2Algorithms.params.prf.algorithm',\n          tagClass: asn1.Class.UNIVERSAL,\n          type: asn1.Type.OID,\n          constructed: false,\n          capture: 'prfOid'\n        }]\n      }]\n    }]\n  }, {\n    name: 'PBES2Algorithms.encryptionScheme',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.SEQUENCE,\n    constructed: true,\n    value: [{\n      name: 'PBES2Algorithms.encryptionScheme.oid',\n      tagClass: asn1.Class.UNIVERSAL,\n      type: asn1.Type.OID,\n      constructed: false,\n      capture: 'encOid'\n    }, {\n      name: 'PBES2Algorithms.encryptionScheme.iv',\n      tagClass: asn1.Class.UNIVERSAL,\n      type: asn1.Type.OCTETSTRING,\n      constructed: false,\n      capture: 'encIv'\n    }]\n  }]\n};\n\nvar pkcs12PbeParamsValidator = {\n  name: 'pkcs-12PbeParams',\n  tagClass: asn1.Class.UNIVERSAL,\n  type: asn1.Type.SEQUENCE,\n  constructed: true,\n  value: [{\n    name: 'pkcs-12PbeParams.salt',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.OCTETSTRING,\n    constructed: false,\n    capture: 'salt'\n  }, {\n    name: 'pkcs-12PbeParams.iterations',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.INTEGER,\n    constructed: false,\n    capture: 'iterations'\n  }]\n};\n\n/**\n * Encrypts a ASN.1 PrivateKeyInfo object, producing an EncryptedPrivateKeyInfo.\n *\n * PBES2Algorithms ALGORITHM-IDENTIFIER ::=\n *   { {PBES2-params IDENTIFIED BY id-PBES2}, ...}\n *\n * id-PBES2 OBJECT IDENTIFIER ::= {pkcs-5 13}\n *\n * PBES2-params ::= SEQUENCE {\n *   keyDerivationFunc AlgorithmIdentifier {{PBES2-KDFs}},\n *   encryptionScheme AlgorithmIdentifier {{PBES2-Encs}}\n * }\n *\n * PBES2-KDFs ALGORITHM-IDENTIFIER ::=\n *   { {PBKDF2-params IDENTIFIED BY id-PBKDF2}, ... }\n *\n * PBES2-Encs ALGORITHM-IDENTIFIER ::= { ... }\n *\n * PBKDF2-params ::= SEQUENCE {\n *   salt CHOICE {\n *     specified OCTET STRING,\n *     otherSource AlgorithmIdentifier {{PBKDF2-SaltSources}}\n *   },\n *   iterationCount INTEGER (1..MAX),\n *   keyLength INTEGER (1..MAX) OPTIONAL,\n *   prf AlgorithmIdentifier {{PBKDF2-PRFs}} DEFAULT algid-hmacWithSHA1\n * }\n *\n * @param obj the ASN.1 PrivateKeyInfo object.\n * @param password the password to encrypt with.\n * @param options:\n *          algorithm the encryption algorithm to use\n *            ('aes128', 'aes192', 'aes256', '3des'), defaults to 'aes128'.\n *          count the iteration count to use.\n *          saltSize the salt size to use.\n *          prfAlgorithm the PRF message digest algorithm to use\n *            ('sha1', 'sha224', 'sha256', 'sha384', 'sha512')\n *\n * @return the ASN.1 EncryptedPrivateKeyInfo.\n */\npki.encryptPrivateKeyInfo = function(obj, password, options) {\n  // set default options\n  options = options || {};\n  options.saltSize = options.saltSize || 8;\n  options.count = options.count || 2048;\n  options.algorithm = options.algorithm || 'aes128';\n  options.prfAlgorithm = options.prfAlgorithm || 'sha1';\n\n  // generate PBE params\n  var salt = forge.random.getBytesSync(options.saltSize);\n  var count = options.count;\n  var countBytes = asn1.integerToDer(count);\n  var dkLen;\n  var encryptionAlgorithm;\n  var encryptedData;\n  if(options.algorithm.indexOf('aes') === 0 || options.algorithm === 'des') {\n    // do PBES2\n    var ivLen, encOid, cipherFn;\n    switch(options.algorithm) {\n    case 'aes128':\n      dkLen = 16;\n      ivLen = 16;\n      encOid = oids['aes128-CBC'];\n      cipherFn = forge.aes.createEncryptionCipher;\n      break;\n    case 'aes192':\n      dkLen = 24;\n      ivLen = 16;\n      encOid = oids['aes192-CBC'];\n      cipherFn = forge.aes.createEncryptionCipher;\n      break;\n    case 'aes256':\n      dkLen = 32;\n      ivLen = 16;\n      encOid = oids['aes256-CBC'];\n      cipherFn = forge.aes.createEncryptionCipher;\n      break;\n    case 'des':\n      dkLen = 8;\n      ivLen = 8;\n      encOid = oids['desCBC'];\n      cipherFn = forge.des.createEncryptionCipher;\n      break;\n    default:\n      var error = new Error('Cannot encrypt private key. Unknown encryption algorithm.');\n      error.algorithm = options.algorithm;\n      throw error;\n    }\n\n    // get PRF message digest\n    var prfAlgorithm = 'hmacWith' + options.prfAlgorithm.toUpperCase();\n    var md = prfAlgorithmToMessageDigest(prfAlgorithm);\n\n    // encrypt private key using pbe SHA-1 and AES/DES\n    var dk = forge.pkcs5.pbkdf2(password, salt, count, dkLen, md);\n    var iv = forge.random.getBytesSync(ivLen);\n    var cipher = cipherFn(dk);\n    cipher.start(iv);\n    cipher.update(asn1.toDer(obj));\n    cipher.finish();\n    encryptedData = cipher.output.getBytes();\n\n    // get PBKDF2-params\n    var params = createPbkdf2Params(salt, countBytes, dkLen, prfAlgorithm);\n\n    encryptionAlgorithm = asn1.create(\n      asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [\n      asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OID, false,\n        asn1.oidToDer(oids['pkcs5PBES2']).getBytes()),\n      asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [\n        // keyDerivationFunc\n        asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [\n          asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OID, false,\n            asn1.oidToDer(oids['pkcs5PBKDF2']).getBytes()),\n          // PBKDF2-params\n          params\n        ]),\n        // encryptionScheme\n        asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [\n          asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OID, false,\n            asn1.oidToDer(encOid).getBytes()),\n          // iv\n          asn1.create(\n            asn1.Class.UNIVERSAL, asn1.Type.OCTETSTRING, false, iv)\n        ])\n      ])\n    ]);\n  } else if(options.algorithm === '3des') {\n    // Do PKCS12 PBE\n    dkLen = 24;\n\n    var saltBytes = new forge.util.ByteBuffer(salt);\n    var dk = pki.pbe.generatePkcs12Key(password, saltBytes, 1, count, dkLen);\n    var iv = pki.pbe.generatePkcs12Key(password, saltBytes, 2, count, dkLen);\n    var cipher = forge.des.createEncryptionCipher(dk);\n    cipher.start(iv);\n    cipher.update(asn1.toDer(obj));\n    cipher.finish();\n    encryptedData = cipher.output.getBytes();\n\n    encryptionAlgorithm = asn1.create(\n      asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [\n      asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OID, false,\n        asn1.oidToDer(oids['pbeWithSHAAnd3-KeyTripleDES-CBC']).getBytes()),\n      // pkcs-12PbeParams\n      asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [\n        // salt\n        asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OCTETSTRING, false, salt),\n        // iteration count\n        asn1.create(asn1.Class.UNIVERSAL, asn1.Type.INTEGER, false,\n          countBytes.getBytes())\n      ])\n    ]);\n  } else {\n    var error = new Error('Cannot encrypt private key. Unknown encryption algorithm.');\n    error.algorithm = options.algorithm;\n    throw error;\n  }\n\n  // EncryptedPrivateKeyInfo\n  var rval = asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [\n    // encryptionAlgorithm\n    encryptionAlgorithm,\n    // encryptedData\n    asn1.create(\n      asn1.Class.UNIVERSAL, asn1.Type.OCTETSTRING, false, encryptedData)\n  ]);\n  return rval;\n};\n\n/**\n * Decrypts a ASN.1 PrivateKeyInfo object.\n *\n * @param obj the ASN.1 EncryptedPrivateKeyInfo object.\n * @param password the password to decrypt with.\n *\n * @return the ASN.1 PrivateKeyInfo on success, null on failure.\n */\npki.decryptPrivateKeyInfo = function(obj, password) {\n  var rval = null;\n\n  // get PBE params\n  var capture = {};\n  var errors = [];\n  if(!asn1.validate(obj, encryptedPrivateKeyValidator, capture, errors)) {\n    var error = new Error('Cannot read encrypted private key. ' +\n      'ASN.1 object is not a supported EncryptedPrivateKeyInfo.');\n    error.errors = errors;\n    throw error;\n  }\n\n  // get cipher\n  var oid = asn1.derToOid(capture.encryptionOid);\n  var cipher = pki.pbe.getCipher(oid, capture.encryptionParams, password);\n\n  // get encrypted data\n  var encrypted = forge.util.createBuffer(capture.encryptedData);\n\n  cipher.update(encrypted);\n  if(cipher.finish()) {\n    rval = asn1.fromDer(cipher.output);\n  }\n\n  return rval;\n};\n\n/**\n * Converts a EncryptedPrivateKeyInfo to PEM format.\n *\n * @param epki the EncryptedPrivateKeyInfo.\n * @param maxline the maximum characters per line, defaults to 64.\n *\n * @return the PEM-formatted encrypted private key.\n */\npki.encryptedPrivateKeyToPem = function(epki, maxline) {\n  // convert to DER, then PEM-encode\n  var msg = {\n    type: 'ENCRYPTED PRIVATE KEY',\n    body: asn1.toDer(epki).getBytes()\n  };\n  return forge.pem.encode(msg, {maxline: maxline});\n};\n\n/**\n * Converts a PEM-encoded EncryptedPrivateKeyInfo to ASN.1 format. Decryption\n * is not performed.\n *\n * @param pem the EncryptedPrivateKeyInfo in PEM-format.\n *\n * @return the ASN.1 EncryptedPrivateKeyInfo.\n */\npki.encryptedPrivateKeyFromPem = function(pem) {\n  var msg = forge.pem.decode(pem)[0];\n\n  if(msg.type !== 'ENCRYPTED PRIVATE KEY') {\n    var error = new Error('Could not convert encrypted private key from PEM; ' +\n      'PEM header type is \"ENCRYPTED PRIVATE KEY\".');\n    error.headerType = msg.type;\n    throw error;\n  }\n  if(msg.procType && msg.procType.type === 'ENCRYPTED') {\n    throw new Error('Could not convert encrypted private key from PEM; ' +\n      'PEM is encrypted.');\n  }\n\n  // convert DER to ASN.1 object\n  return asn1.fromDer(msg.body);\n};\n\n/**\n * Encrypts an RSA private key. By default, the key will be wrapped in\n * a PrivateKeyInfo and encrypted to produce a PKCS#8 EncryptedPrivateKeyInfo.\n * This is the standard, preferred way to encrypt a private key.\n *\n * To produce a non-standard PEM-encrypted private key that uses encapsulated\n * headers to indicate the encryption algorithm (old-style non-PKCS#8 OpenSSL\n * private key encryption), set the 'legacy' option to true. Note: Using this\n * option will cause the iteration count to be forced to 1.\n *\n * Note: The 'des' algorithm is supported, but it is not considered to be\n * secure because it only uses a single 56-bit key. If possible, it is highly\n * recommended that a different algorithm be used.\n *\n * @param rsaKey the RSA key to encrypt.\n * @param password the password to use.\n * @param options:\n *          algorithm: the encryption algorithm to use\n *            ('aes128', 'aes192', 'aes256', '3des', 'des').\n *          count: the iteration count to use.\n *          saltSize: the salt size to use.\n *          legacy: output an old non-PKCS#8 PEM-encrypted+encapsulated\n *            headers (DEK-Info) private key.\n *\n * @return the PEM-encoded ASN.1 EncryptedPrivateKeyInfo.\n */\npki.encryptRsaPrivateKey = function(rsaKey, password, options) {\n  // standard PKCS#8\n  options = options || {};\n  if(!options.legacy) {\n    // encrypt PrivateKeyInfo\n    var rval = pki.wrapRsaPrivateKey(pki.privateKeyToAsn1(rsaKey));\n    rval = pki.encryptPrivateKeyInfo(rval, password, options);\n    return pki.encryptedPrivateKeyToPem(rval);\n  }\n\n  // legacy non-PKCS#8\n  var algorithm;\n  var iv;\n  var dkLen;\n  var cipherFn;\n  switch(options.algorithm) {\n  case 'aes128':\n    algorithm = 'AES-128-CBC';\n    dkLen = 16;\n    iv = forge.random.getBytesSync(16);\n    cipherFn = forge.aes.createEncryptionCipher;\n    break;\n  case 'aes192':\n    algorithm = 'AES-192-CBC';\n    dkLen = 24;\n    iv = forge.random.getBytesSync(16);\n    cipherFn = forge.aes.createEncryptionCipher;\n    break;\n  case 'aes256':\n    algorithm = 'AES-256-CBC';\n    dkLen = 32;\n    iv = forge.random.getBytesSync(16);\n    cipherFn = forge.aes.createEncryptionCipher;\n    break;\n  case '3des':\n    algorithm = 'DES-EDE3-CBC';\n    dkLen = 24;\n    iv = forge.random.getBytesSync(8);\n    cipherFn = forge.des.createEncryptionCipher;\n    break;\n  case 'des':\n    algorithm = 'DES-CBC';\n    dkLen = 8;\n    iv = forge.random.getBytesSync(8);\n    cipherFn = forge.des.createEncryptionCipher;\n    break;\n  default:\n    var error = new Error('Could not encrypt RSA private key; unsupported ' +\n      'encryption algorithm \"' + options.algorithm + '\".');\n    error.algorithm = options.algorithm;\n    throw error;\n  }\n\n  // encrypt private key using OpenSSL legacy key derivation\n  var dk = forge.pbe.opensslDeriveBytes(password, iv.substr(0, 8), dkLen);\n  var cipher = cipherFn(dk);\n  cipher.start(iv);\n  cipher.update(asn1.toDer(pki.privateKeyToAsn1(rsaKey)));\n  cipher.finish();\n\n  var msg = {\n    type: 'RSA PRIVATE KEY',\n    procType: {\n      version: '4',\n      type: 'ENCRYPTED'\n    },\n    dekInfo: {\n      algorithm: algorithm,\n      parameters: forge.util.bytesToHex(iv).toUpperCase()\n    },\n    body: cipher.output.getBytes()\n  };\n  return forge.pem.encode(msg);\n};\n\n/**\n * Decrypts an RSA private key.\n *\n * @param pem the PEM-formatted EncryptedPrivateKeyInfo to decrypt.\n * @param password the password to use.\n *\n * @return the RSA key on success, null on failure.\n */\npki.decryptRsaPrivateKey = function(pem, password) {\n  var rval = null;\n\n  var msg = forge.pem.decode(pem)[0];\n\n  if(msg.type !== 'ENCRYPTED PRIVATE KEY' &&\n    msg.type !== 'PRIVATE KEY' &&\n    msg.type !== 'RSA PRIVATE KEY') {\n    var error = new Error('Could not convert private key from PEM; PEM header type ' +\n      'is not \"ENCRYPTED PRIVATE KEY\", \"PRIVATE KEY\", or \"RSA PRIVATE KEY\".');\n    error.headerType = error;\n    throw error;\n  }\n\n  if(msg.procType && msg.procType.type === 'ENCRYPTED') {\n    var dkLen;\n    var cipherFn;\n    switch(msg.dekInfo.algorithm) {\n    case 'DES-CBC':\n      dkLen = 8;\n      cipherFn = forge.des.createDecryptionCipher;\n      break;\n    case 'DES-EDE3-CBC':\n      dkLen = 24;\n      cipherFn = forge.des.createDecryptionCipher;\n      break;\n    case 'AES-128-CBC':\n      dkLen = 16;\n      cipherFn = forge.aes.createDecryptionCipher;\n      break;\n    case 'AES-192-CBC':\n      dkLen = 24;\n      cipherFn = forge.aes.createDecryptionCipher;\n      break;\n    case 'AES-256-CBC':\n      dkLen = 32;\n      cipherFn = forge.aes.createDecryptionCipher;\n      break;\n    case 'RC2-40-CBC':\n      dkLen = 5;\n      cipherFn = function(key) {\n        return forge.rc2.createDecryptionCipher(key, 40);\n      };\n      break;\n    case 'RC2-64-CBC':\n      dkLen = 8;\n      cipherFn = function(key) {\n        return forge.rc2.createDecryptionCipher(key, 64);\n      };\n      break;\n    case 'RC2-128-CBC':\n      dkLen = 16;\n      cipherFn = function(key) {\n        return forge.rc2.createDecryptionCipher(key, 128);\n      };\n      break;\n    default:\n      var error = new Error('Could not decrypt private key; unsupported ' +\n        'encryption algorithm \"' + msg.dekInfo.algorithm + '\".');\n      error.algorithm = msg.dekInfo.algorithm;\n      throw error;\n    }\n\n    // use OpenSSL legacy key derivation\n    var iv = forge.util.hexToBytes(msg.dekInfo.parameters);\n    var dk = forge.pbe.opensslDeriveBytes(password, iv.substr(0, 8), dkLen);\n    var cipher = cipherFn(dk);\n    cipher.start(iv);\n    cipher.update(forge.util.createBuffer(msg.body));\n    if(cipher.finish()) {\n      rval = cipher.output.getBytes();\n    } else {\n      return rval;\n    }\n  } else {\n    rval = msg.body;\n  }\n\n  if(msg.type === 'ENCRYPTED PRIVATE KEY') {\n    rval = pki.decryptPrivateKeyInfo(asn1.fromDer(rval), password);\n  } else {\n    // decryption already performed above\n    rval = asn1.fromDer(rval);\n  }\n\n  if(rval !== null) {\n    rval = pki.privateKeyFromAsn1(rval);\n  }\n\n  return rval;\n};\n\n/**\n * Derives a PKCS#12 key.\n *\n * @param password the password to derive the key material from, null or\n *          undefined for none.\n * @param salt the salt, as a ByteBuffer, to use.\n * @param id the PKCS#12 ID byte (1 = key material, 2 = IV, 3 = MAC).\n * @param iter the iteration count.\n * @param n the number of bytes to derive from the password.\n * @param md the message digest to use, defaults to SHA-1.\n *\n * @return a ByteBuffer with the bytes derived from the password.\n */\npki.pbe.generatePkcs12Key = function(password, salt, id, iter, n, md) {\n  var j, l;\n\n  if(typeof md === 'undefined' || md === null) {\n    if(!('sha1' in forge.md)) {\n      throw new Error('\"sha1\" hash algorithm unavailable.');\n    }\n    md = forge.md.sha1.create();\n  }\n\n  var u = md.digestLength;\n  var v = md.blockLength;\n  var result = new forge.util.ByteBuffer();\n\n  /* Convert password to Unicode byte buffer + trailing 0-byte. */\n  var passBuf = new forge.util.ByteBuffer();\n  if(password !== null && password !== undefined) {\n    for(l = 0; l < password.length; l++) {\n      passBuf.putInt16(password.charCodeAt(l));\n    }\n    passBuf.putInt16(0);\n  }\n\n  /* Length of salt and password in BYTES. */\n  var p = passBuf.length();\n  var s = salt.length();\n\n  /* 1. Construct a string, D (the \"diversifier\"), by concatenating\n        v copies of ID. */\n  var D = new forge.util.ByteBuffer();\n  D.fillWithByte(id, v);\n\n  /* 2. Concatenate copies of the salt together to create a string S of length\n        v * ceil(s / v) bytes (the final copy of the salt may be trunacted\n        to create S).\n        Note that if the salt is the empty string, then so is S. */\n  var Slen = v * Math.ceil(s / v);\n  var S = new forge.util.ByteBuffer();\n  for(l = 0; l < Slen; l++) {\n    S.putByte(salt.at(l % s));\n  }\n\n  /* 3. Concatenate copies of the password together to create a string P of\n        length v * ceil(p / v) bytes (the final copy of the password may be\n        truncated to create P).\n        Note that if the password is the empty string, then so is P. */\n  var Plen = v * Math.ceil(p / v);\n  var P = new forge.util.ByteBuffer();\n  for(l = 0; l < Plen; l++) {\n    P.putByte(passBuf.at(l % p));\n  }\n\n  /* 4. Set I=S||P to be the concatenation of S and P. */\n  var I = S;\n  I.putBuffer(P);\n\n  /* 5. Set c=ceil(n / u). */\n  var c = Math.ceil(n / u);\n\n  /* 6. For i=1, 2, ..., c, do the following: */\n  for(var i = 1; i <= c; i++) {\n    /* a) Set Ai=H^r(D||I). (l.e. the rth hash of D||I, H(H(H(...H(D||I)))) */\n    var buf = new forge.util.ByteBuffer();\n    buf.putBytes(D.bytes());\n    buf.putBytes(I.bytes());\n    for(var round = 0; round < iter; round++) {\n      md.start();\n      md.update(buf.getBytes());\n      buf = md.digest();\n    }\n\n    /* b) Concatenate copies of Ai to create a string B of length v bytes (the\n          final copy of Ai may be truncated to create B). */\n    var B = new forge.util.ByteBuffer();\n    for(l = 0; l < v; l++) {\n      B.putByte(buf.at(l % u));\n    }\n\n    /* c) Treating I as a concatenation I0, I1, ..., Ik-1 of v-byte blocks,\n          where k=ceil(s / v) + ceil(p / v), modify I by setting\n          Ij=(Ij+B+1) mod 2v for each j.  */\n    var k = Math.ceil(s / v) + Math.ceil(p / v);\n    var Inew = new forge.util.ByteBuffer();\n    for(j = 0; j < k; j++) {\n      var chunk = new forge.util.ByteBuffer(I.getBytes(v));\n      var x = 0x1ff;\n      for(l = B.length() - 1; l >= 0; l--) {\n        x = x >> 8;\n        x += B.at(l) + chunk.at(l);\n        chunk.setAt(l, x & 0xff);\n      }\n      Inew.putBuffer(chunk);\n    }\n    I = Inew;\n\n    /* Add Ai to A. */\n    result.putBuffer(buf);\n  }\n\n  result.truncate(result.length() - n);\n  return result;\n};\n\n/**\n * Get new Forge cipher object instance.\n *\n * @param oid the OID (in string notation).\n * @param params the ASN.1 params object.\n * @param password the password to decrypt with.\n *\n * @return new cipher object instance.\n */\npki.pbe.getCipher = function(oid, params, password) {\n  switch(oid) {\n  case pki.oids['pkcs5PBES2']:\n    return pki.pbe.getCipherForPBES2(oid, params, password);\n\n  case pki.oids['pbeWithSHAAnd3-KeyTripleDES-CBC']:\n  case pki.oids['pbewithSHAAnd40BitRC2-CBC']:\n    return pki.pbe.getCipherForPKCS12PBE(oid, params, password);\n\n  default:\n    var error = new Error('Cannot read encrypted PBE data block. Unsupported OID.');\n    error.oid = oid;\n    error.supportedOids = [\n      'pkcs5PBES2',\n      'pbeWithSHAAnd3-KeyTripleDES-CBC',\n      'pbewithSHAAnd40BitRC2-CBC'\n    ];\n    throw error;\n  }\n};\n\n/**\n * Get new Forge cipher object instance according to PBES2 params block.\n *\n * The returned cipher instance is already started using the IV\n * from PBES2 parameter block.\n *\n * @param oid the PKCS#5 PBKDF2 OID (in string notation).\n * @param params the ASN.1 PBES2-params object.\n * @param password the password to decrypt with.\n *\n * @return new cipher object instance.\n */\npki.pbe.getCipherForPBES2 = function(oid, params, password) {\n  // get PBE params\n  var capture = {};\n  var errors = [];\n  if(!asn1.validate(params, PBES2AlgorithmsValidator, capture, errors)) {\n    var error = new Error('Cannot read password-based-encryption algorithm ' +\n      'parameters. ASN.1 object is not a supported EncryptedPrivateKeyInfo.');\n    error.errors = errors;\n    throw error;\n  }\n\n  // check oids\n  oid = asn1.derToOid(capture.kdfOid);\n  if(oid !== pki.oids['pkcs5PBKDF2']) {\n    var error = new Error('Cannot read encrypted private key. ' +\n      'Unsupported key derivation function OID.');\n    error.oid = oid;\n    error.supportedOids = ['pkcs5PBKDF2'];\n    throw error;\n  }\n  oid = asn1.derToOid(capture.encOid);\n  if(oid !== pki.oids['aes128-CBC'] &&\n    oid !== pki.oids['aes192-CBC'] &&\n    oid !== pki.oids['aes256-CBC'] &&\n    oid !== pki.oids['des-EDE3-CBC'] &&\n    oid !== pki.oids['desCBC']) {\n    var error = new Error('Cannot read encrypted private key. ' +\n      'Unsupported encryption scheme OID.');\n    error.oid = oid;\n    error.supportedOids = [\n      'aes128-CBC', 'aes192-CBC', 'aes256-CBC', 'des-EDE3-CBC', 'desCBC'];\n    throw error;\n  }\n\n  // set PBE params\n  var salt = capture.kdfSalt;\n  var count = forge.util.createBuffer(capture.kdfIterationCount);\n  count = count.getInt(count.length() << 3);\n  var dkLen;\n  var cipherFn;\n  switch(pki.oids[oid]) {\n  case 'aes128-CBC':\n    dkLen = 16;\n    cipherFn = forge.aes.createDecryptionCipher;\n    break;\n  case 'aes192-CBC':\n    dkLen = 24;\n    cipherFn = forge.aes.createDecryptionCipher;\n    break;\n  case 'aes256-CBC':\n    dkLen = 32;\n    cipherFn = forge.aes.createDecryptionCipher;\n    break;\n  case 'des-EDE3-CBC':\n    dkLen = 24;\n    cipherFn = forge.des.createDecryptionCipher;\n    break;\n  case 'desCBC':\n    dkLen = 8;\n    cipherFn = forge.des.createDecryptionCipher;\n    break;\n  }\n\n  // get PRF message digest\n  var md = prfOidToMessageDigest(capture.prfOid);\n\n  // decrypt private key using pbe with chosen PRF and AES/DES\n  var dk = forge.pkcs5.pbkdf2(password, salt, count, dkLen, md);\n  var iv = capture.encIv;\n  var cipher = cipherFn(dk);\n  cipher.start(iv);\n\n  return cipher;\n};\n\n/**\n * Get new Forge cipher object instance for PKCS#12 PBE.\n *\n * The returned cipher instance is already started using the key & IV\n * derived from the provided password and PKCS#12 PBE salt.\n *\n * @param oid The PKCS#12 PBE OID (in string notation).\n * @param params The ASN.1 PKCS#12 PBE-params object.\n * @param password The password to decrypt with.\n *\n * @return the new cipher object instance.\n */\npki.pbe.getCipherForPKCS12PBE = function(oid, params, password) {\n  // get PBE params\n  var capture = {};\n  var errors = [];\n  if(!asn1.validate(params, pkcs12PbeParamsValidator, capture, errors)) {\n    var error = new Error('Cannot read password-based-encryption algorithm ' +\n      'parameters. ASN.1 object is not a supported EncryptedPrivateKeyInfo.');\n    error.errors = errors;\n    throw error;\n  }\n\n  var salt = forge.util.createBuffer(capture.salt);\n  var count = forge.util.createBuffer(capture.iterations);\n  count = count.getInt(count.length() << 3);\n\n  var dkLen, dIvLen, cipherFn;\n  switch(oid) {\n    case pki.oids['pbeWithSHAAnd3-KeyTripleDES-CBC']:\n      dkLen = 24;\n      dIvLen = 8;\n      cipherFn = forge.des.startDecrypting;\n      break;\n\n    case pki.oids['pbewithSHAAnd40BitRC2-CBC']:\n      dkLen = 5;\n      dIvLen = 8;\n      cipherFn = function(key, iv) {\n        var cipher = forge.rc2.createDecryptionCipher(key, 40);\n        cipher.start(iv, null);\n        return cipher;\n      };\n      break;\n\n    default:\n      var error = new Error('Cannot read PKCS #12 PBE data block. Unsupported OID.');\n      error.oid = oid;\n      throw error;\n  }\n\n  // get PRF message digest\n  var md = prfOidToMessageDigest(capture.prfOid);\n  var key = pki.pbe.generatePkcs12Key(password, salt, 1, count, dkLen, md);\n  md.start();\n  var iv = pki.pbe.generatePkcs12Key(password, salt, 2, count, dIvLen, md);\n\n  return cipherFn(key, iv);\n};\n\n/**\n * OpenSSL's legacy key derivation function.\n *\n * See: http://www.openssl.org/docs/crypto/EVP_BytesToKey.html\n *\n * @param password the password to derive the key from.\n * @param salt the salt to use, null for none.\n * @param dkLen the number of bytes needed for the derived key.\n * @param [options] the options to use:\n *          [md] an optional message digest object to use.\n */\npki.pbe.opensslDeriveBytes = function(password, salt, dkLen, md) {\n  if(typeof md === 'undefined' || md === null) {\n    if(!('md5' in forge.md)) {\n      throw new Error('\"md5\" hash algorithm unavailable.');\n    }\n    md = forge.md.md5.create();\n  }\n  if(salt === null) {\n    salt = '';\n  }\n  var digests = [hash(md, password + salt)];\n  for(var length = 16, i = 1; length < dkLen; ++i, length += 16) {\n    digests.push(hash(md, digests[i - 1] + password + salt));\n  }\n  return digests.join('').substr(0, dkLen);\n};\n\nfunction hash(md, bytes) {\n  return md.start().update(bytes).digest().getBytes();\n}\n\nfunction prfOidToMessageDigest(prfOid) {\n  // get PRF algorithm, default to SHA-1\n  var prfAlgorithm;\n  if(!prfOid) {\n    prfAlgorithm = 'hmacWithSHA1';\n  } else {\n    prfAlgorithm = pki.oids[asn1.derToOid(prfOid)];\n    if(!prfAlgorithm) {\n      var error = new Error('Unsupported PRF OID.');\n      error.oid = prfOid;\n      error.supported = [\n        'hmacWithSHA1', 'hmacWithSHA224', 'hmacWithSHA256', 'hmacWithSHA384',\n        'hmacWithSHA512'];\n      throw error;\n    }\n  }\n  return prfAlgorithmToMessageDigest(prfAlgorithm);\n}\n\nfunction prfAlgorithmToMessageDigest(prfAlgorithm) {\n  var factory = forge.md;\n  switch(prfAlgorithm) {\n  case 'hmacWithSHA224':\n    factory = forge.md.sha512;\n  case 'hmacWithSHA1':\n  case 'hmacWithSHA256':\n  case 'hmacWithSHA384':\n  case 'hmacWithSHA512':\n    prfAlgorithm = prfAlgorithm.substr(8).toLowerCase();\n    break;\n  default:\n    var error = new Error('Unsupported PRF algorithm.');\n    error.algorithm = prfAlgorithm;\n    error.supported = [\n      'hmacWithSHA1', 'hmacWithSHA224', 'hmacWithSHA256', 'hmacWithSHA384',\n      'hmacWithSHA512'];\n    throw error;\n  }\n  if(!factory || !(prfAlgorithm in factory)) {\n    throw new Error('Unknown hash algorithm: ' + prfAlgorithm);\n  }\n  return factory[prfAlgorithm].create();\n}\n\nfunction createPbkdf2Params(salt, countBytes, dkLen, prfAlgorithm) {\n  var params = asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [\n    // salt\n    asn1.create(\n      asn1.Class.UNIVERSAL, asn1.Type.OCTETSTRING, false, salt),\n    // iteration count\n    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.INTEGER, false,\n      countBytes.getBytes())\n  ]);\n  // when PRF algorithm is not SHA-1 default, add key length and PRF algorithm\n  if(prfAlgorithm !== 'hmacWithSHA1') {\n    params.value.push(\n      // key length\n      asn1.create(asn1.Class.UNIVERSAL, asn1.Type.INTEGER, false,\n        forge.util.hexToBytes(dkLen.toString(16))),\n      // AlgorithmIdentifier\n      asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [\n        // algorithm\n        asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OID, false,\n          asn1.oidToDer(pki.oids[prfAlgorithm]).getBytes()),\n        // parameters (null)\n        asn1.create(asn1.Class.UNIVERSAL, asn1.Type.NULL, false, '')\n      ]));\n  }\n  return params;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODEuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbm9kZS1mb3JnZS9saWIvcGJlLmpzPzQ0ZjMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBQYXNzd29yZC1iYXNlZCBlbmNyeXB0aW9uIGZ1bmN0aW9ucy5cbiAqXG4gKiBAYXV0aG9yIERhdmUgTG9uZ2xleVxuICogQGF1dGhvciBTdGVmYW4gU2llZ2wgPHN0ZXNpZUBicm9rZW5waXBlLmRlPlxuICpcbiAqIENvcHlyaWdodCAoYykgMjAxMC0yMDEzIERpZ2l0YWwgQmF6YWFyLCBJbmMuXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTIgU3RlZmFuIFNpZWdsIDxzdGVzaWVAYnJva2VucGlwZS5kZT5cbiAqXG4gKiBBbiBFbmNyeXB0ZWRQcml2YXRlS2V5SW5mbzpcbiAqXG4gKiBFbmNyeXB0ZWRQcml2YXRlS2V5SW5mbyA6Oj0gU0VRVUVOQ0Uge1xuICogICBlbmNyeXB0aW9uQWxnb3JpdGhtICBFbmNyeXB0aW9uQWxnb3JpdGhtSWRlbnRpZmllcixcbiAqICAgZW5jcnlwdGVkRGF0YSAgICAgICAgRW5jcnlwdGVkRGF0YSB9XG4gKlxuICogRW5jcnlwdGlvbkFsZ29yaXRobUlkZW50aWZpZXIgOjo9IEFsZ29yaXRobUlkZW50aWZpZXJcbiAqXG4gKiBFbmNyeXB0ZWREYXRhIDo6PSBPQ1RFVCBTVFJJTkdcbiAqL1xudmFyIGZvcmdlID0gcmVxdWlyZSgnLi9mb3JnZScpO1xucmVxdWlyZSgnLi9hZXMnKTtcbnJlcXVpcmUoJy4vYXNuMScpO1xucmVxdWlyZSgnLi9kZXMnKTtcbnJlcXVpcmUoJy4vbWQnKTtcbnJlcXVpcmUoJy4vb2lkcycpO1xucmVxdWlyZSgnLi9wYmtkZjInKTtcbnJlcXVpcmUoJy4vcGVtJyk7XG5yZXF1aXJlKCcuL3JhbmRvbScpO1xucmVxdWlyZSgnLi9yYzInKTtcbnJlcXVpcmUoJy4vcnNhJyk7XG5yZXF1aXJlKCcuL3V0aWwnKTtcblxuaWYodHlwZW9mIEJpZ0ludGVnZXIgPT09ICd1bmRlZmluZWQnKSB7XG4gIHZhciBCaWdJbnRlZ2VyID0gZm9yZ2UuanNibi5CaWdJbnRlZ2VyO1xufVxuXG4vLyBzaG9ydGN1dCBmb3IgYXNuLjEgQVBJXG52YXIgYXNuMSA9IGZvcmdlLmFzbjE7XG5cbi8qIFBhc3N3b3JkLWJhc2VkIGVuY3J5cHRpb24gaW1wbGVtZW50YXRpb24uICovXG52YXIgcGtpID0gZm9yZ2UucGtpID0gZm9yZ2UucGtpIHx8IHt9O1xubW9kdWxlLmV4cG9ydHMgPSBwa2kucGJlID0gZm9yZ2UucGJlID0gZm9yZ2UucGJlIHx8IHt9O1xudmFyIG9pZHMgPSBwa2kub2lkcztcblxuLy8gdmFsaWRhdG9yIGZvciBhbiBFbmNyeXB0ZWRQcml2YXRlS2V5SW5mbyBzdHJ1Y3R1cmVcbi8vIE5vdGU6IEN1cnJlbnRseSBvbmx5IHdvcmtzIHcvYWxnb3JpdGhtIHBhcmFtc1xudmFyIGVuY3J5cHRlZFByaXZhdGVLZXlWYWxpZGF0b3IgPSB7XG4gIG5hbWU6ICdFbmNyeXB0ZWRQcml2YXRlS2V5SW5mbycsXG4gIHRhZ0NsYXNzOiBhc24xLkNsYXNzLlVOSVZFUlNBTCxcbiAgdHlwZTogYXNuMS5UeXBlLlNFUVVFTkNFLFxuICBjb25zdHJ1Y3RlZDogdHJ1ZSxcbiAgdmFsdWU6IFt7XG4gICAgbmFtZTogJ0VuY3J5cHRlZFByaXZhdGVLZXlJbmZvLmVuY3J5cHRpb25BbGdvcml0aG0nLFxuICAgIHRhZ0NsYXNzOiBhc24xLkNsYXNzLlVOSVZFUlNBTCxcbiAgICB0eXBlOiBhc24xLlR5cGUuU0VRVUVOQ0UsXG4gICAgY29uc3RydWN0ZWQ6IHRydWUsXG4gICAgdmFsdWU6IFt7XG4gICAgICBuYW1lOiAnQWxnb3JpdGhtSWRlbnRpZmllci5hbGdvcml0aG0nLFxuICAgICAgdGFnQ2xhc3M6IGFzbjEuQ2xhc3MuVU5JVkVSU0FMLFxuICAgICAgdHlwZTogYXNuMS5UeXBlLk9JRCxcbiAgICAgIGNvbnN0cnVjdGVkOiBmYWxzZSxcbiAgICAgIGNhcHR1cmU6ICdlbmNyeXB0aW9uT2lkJ1xuICAgIH0sIHtcbiAgICAgIG5hbWU6ICdBbGdvcml0aG1JZGVudGlmaWVyLnBhcmFtZXRlcnMnLFxuICAgICAgdGFnQ2xhc3M6IGFzbjEuQ2xhc3MuVU5JVkVSU0FMLFxuICAgICAgdHlwZTogYXNuMS5UeXBlLlNFUVVFTkNFLFxuICAgICAgY29uc3RydWN0ZWQ6IHRydWUsXG4gICAgICBjYXB0dXJlQXNuMTogJ2VuY3J5cHRpb25QYXJhbXMnXG4gICAgfV1cbiAgfSwge1xuICAgIC8vIGVuY3J5cHRlZERhdGFcbiAgICBuYW1lOiAnRW5jcnlwdGVkUHJpdmF0ZUtleUluZm8uZW5jcnlwdGVkRGF0YScsXG4gICAgdGFnQ2xhc3M6IGFzbjEuQ2xhc3MuVU5JVkVSU0FMLFxuICAgIHR5cGU6IGFzbjEuVHlwZS5PQ1RFVFNUUklORyxcbiAgICBjb25zdHJ1Y3RlZDogZmFsc2UsXG4gICAgY2FwdHVyZTogJ2VuY3J5cHRlZERhdGEnXG4gIH1dXG59O1xuXG4vLyB2YWxpZGF0b3IgZm9yIGEgUEJFUzJBbGdvcml0aG1zIHN0cnVjdHVyZVxuLy8gTm90ZTogQ3VycmVudGx5IG9ubHkgd29ya3Mgdy9QQktERjIgKyBBRVMgZW5jcnlwdGlvbiBzY2hlbWVzXG52YXIgUEJFUzJBbGdvcml0aG1zVmFsaWRhdG9yID0ge1xuICBuYW1lOiAnUEJFUzJBbGdvcml0aG1zJyxcbiAgdGFnQ2xhc3M6IGFzbjEuQ2xhc3MuVU5JVkVSU0FMLFxuICB0eXBlOiBhc24xLlR5cGUuU0VRVUVOQ0UsXG4gIGNvbnN0cnVjdGVkOiB0cnVlLFxuICB2YWx1ZTogW3tcbiAgICBuYW1lOiAnUEJFUzJBbGdvcml0aG1zLmtleURlcml2YXRpb25GdW5jJyxcbiAgICB0YWdDbGFzczogYXNuMS5DbGFzcy5VTklWRVJTQUwsXG4gICAgdHlwZTogYXNuMS5UeXBlLlNFUVVFTkNFLFxuICAgIGNvbnN0cnVjdGVkOiB0cnVlLFxuICAgIHZhbHVlOiBbe1xuICAgICAgbmFtZTogJ1BCRVMyQWxnb3JpdGhtcy5rZXlEZXJpdmF0aW9uRnVuYy5vaWQnLFxuICAgICAgdGFnQ2xhc3M6IGFzbjEuQ2xhc3MuVU5JVkVSU0FMLFxuICAgICAgdHlwZTogYXNuMS5UeXBlLk9JRCxcbiAgICAgIGNvbnN0cnVjdGVkOiBmYWxzZSxcbiAgICAgIGNhcHR1cmU6ICdrZGZPaWQnXG4gICAgfSwge1xuICAgICAgbmFtZTogJ1BCRVMyQWxnb3JpdGhtcy5wYXJhbXMnLFxuICAgICAgdGFnQ2xhc3M6IGFzbjEuQ2xhc3MuVU5JVkVSU0FMLFxuICAgICAgdHlwZTogYXNuMS5UeXBlLlNFUVVFTkNFLFxuICAgICAgY29uc3RydWN0ZWQ6IHRydWUsXG4gICAgICB2YWx1ZTogW3tcbiAgICAgICAgbmFtZTogJ1BCRVMyQWxnb3JpdGhtcy5wYXJhbXMuc2FsdCcsXG4gICAgICAgIHRhZ0NsYXNzOiBhc24xLkNsYXNzLlVOSVZFUlNBTCxcbiAgICAgICAgdHlwZTogYXNuMS5UeXBlLk9DVEVUU1RSSU5HLFxuICAgICAgICBjb25zdHJ1Y3RlZDogZmFsc2UsXG4gICAgICAgIGNhcHR1cmU6ICdrZGZTYWx0J1xuICAgICAgfSwge1xuICAgICAgICBuYW1lOiAnUEJFUzJBbGdvcml0aG1zLnBhcmFtcy5pdGVyYXRpb25Db3VudCcsXG4gICAgICAgIHRhZ0NsYXNzOiBhc24xLkNsYXNzLlVOSVZFUlNBTCxcbiAgICAgICAgdHlwZTogYXNuMS5UeXBlLklOVEVHRVIsXG4gICAgICAgIGNvbnN0cnVjdGVkOiBmYWxzZSxcbiAgICAgICAgY2FwdHVyZTogJ2tkZkl0ZXJhdGlvbkNvdW50J1xuICAgICAgfSwge1xuICAgICAgICBuYW1lOiAnUEJFUzJBbGdvcml0aG1zLnBhcmFtcy5rZXlMZW5ndGgnLFxuICAgICAgICB0YWdDbGFzczogYXNuMS5DbGFzcy5VTklWRVJTQUwsXG4gICAgICAgIHR5cGU6IGFzbjEuVHlwZS5JTlRFR0VSLFxuICAgICAgICBjb25zdHJ1Y3RlZDogZmFsc2UsXG4gICAgICAgIG9wdGlvbmFsOiB0cnVlLFxuICAgICAgICBjYXB0dXJlOiAna2V5TGVuZ3RoJ1xuICAgICAgfSwge1xuICAgICAgICAvLyBwcmZcbiAgICAgICAgbmFtZTogJ1BCRVMyQWxnb3JpdGhtcy5wYXJhbXMucHJmJyxcbiAgICAgICAgdGFnQ2xhc3M6IGFzbjEuQ2xhc3MuVU5JVkVSU0FMLFxuICAgICAgICB0eXBlOiBhc24xLlR5cGUuU0VRVUVOQ0UsXG4gICAgICAgIGNvbnN0cnVjdGVkOiB0cnVlLFxuICAgICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICAgICAgdmFsdWU6IFt7XG4gICAgICAgICAgbmFtZTogJ1BCRVMyQWxnb3JpdGhtcy5wYXJhbXMucHJmLmFsZ29yaXRobScsXG4gICAgICAgICAgdGFnQ2xhc3M6IGFzbjEuQ2xhc3MuVU5JVkVSU0FMLFxuICAgICAgICAgIHR5cGU6IGFzbjEuVHlwZS5PSUQsXG4gICAgICAgICAgY29uc3RydWN0ZWQ6IGZhbHNlLFxuICAgICAgICAgIGNhcHR1cmU6ICdwcmZPaWQnXG4gICAgICAgIH1dXG4gICAgICB9XVxuICAgIH1dXG4gIH0sIHtcbiAgICBuYW1lOiAnUEJFUzJBbGdvcml0aG1zLmVuY3J5cHRpb25TY2hlbWUnLFxuICAgIHRhZ0NsYXNzOiBhc24xLkNsYXNzLlVOSVZFUlNBTCxcbiAgICB0eXBlOiBhc24xLlR5cGUuU0VRVUVOQ0UsXG4gICAgY29uc3RydWN0ZWQ6IHRydWUsXG4gICAgdmFsdWU6IFt7XG4gICAgICBuYW1lOiAnUEJFUzJBbGdvcml0aG1zLmVuY3J5cHRpb25TY2hlbWUub2lkJyxcbiAgICAgIHRhZ0NsYXNzOiBhc24xLkNsYXNzLlVOSVZFUlNBTCxcbiAgICAgIHR5cGU6IGFzbjEuVHlwZS5PSUQsXG4gICAgICBjb25zdHJ1Y3RlZDogZmFsc2UsXG4gICAgICBjYXB0dXJlOiAnZW5jT2lkJ1xuICAgIH0sIHtcbiAgICAgIG5hbWU6ICdQQkVTMkFsZ29yaXRobXMuZW5jcnlwdGlvblNjaGVtZS5pdicsXG4gICAgICB0YWdDbGFzczogYXNuMS5DbGFzcy5VTklWRVJTQUwsXG4gICAgICB0eXBlOiBhc24xLlR5cGUuT0NURVRTVFJJTkcsXG4gICAgICBjb25zdHJ1Y3RlZDogZmFsc2UsXG4gICAgICBjYXB0dXJlOiAnZW5jSXYnXG4gICAgfV1cbiAgfV1cbn07XG5cbnZhciBwa2NzMTJQYmVQYXJhbXNWYWxpZGF0b3IgPSB7XG4gIG5hbWU6ICdwa2NzLTEyUGJlUGFyYW1zJyxcbiAgdGFnQ2xhc3M6IGFzbjEuQ2xhc3MuVU5JVkVSU0FMLFxuICB0eXBlOiBhc24xLlR5cGUuU0VRVUVOQ0UsXG4gIGNvbnN0cnVjdGVkOiB0cnVlLFxuICB2YWx1ZTogW3tcbiAgICBuYW1lOiAncGtjcy0xMlBiZVBhcmFtcy5zYWx0JyxcbiAgICB0YWdDbGFzczogYXNuMS5DbGFzcy5VTklWRVJTQUwsXG4gICAgdHlwZTogYXNuMS5UeXBlLk9DVEVUU1RSSU5HLFxuICAgIGNvbnN0cnVjdGVkOiBmYWxzZSxcbiAgICBjYXB0dXJlOiAnc2FsdCdcbiAgfSwge1xuICAgIG5hbWU6ICdwa2NzLTEyUGJlUGFyYW1zLml0ZXJhdGlvbnMnLFxuICAgIHRhZ0NsYXNzOiBhc24xLkNsYXNzLlVOSVZFUlNBTCxcbiAgICB0eXBlOiBhc24xLlR5cGUuSU5URUdFUixcbiAgICBjb25zdHJ1Y3RlZDogZmFsc2UsXG4gICAgY2FwdHVyZTogJ2l0ZXJhdGlvbnMnXG4gIH1dXG59O1xuXG4vKipcbiAqIEVuY3J5cHRzIGEgQVNOLjEgUHJpdmF0ZUtleUluZm8gb2JqZWN0LCBwcm9kdWNpbmcgYW4gRW5jcnlwdGVkUHJpdmF0ZUtleUluZm8uXG4gKlxuICogUEJFUzJBbGdvcml0aG1zIEFMR09SSVRITS1JREVOVElGSUVSIDo6PVxuICogICB7IHtQQkVTMi1wYXJhbXMgSURFTlRJRklFRCBCWSBpZC1QQkVTMn0sIC4uLn1cbiAqXG4gKiBpZC1QQkVTMiBPQkpFQ1QgSURFTlRJRklFUiA6Oj0ge3BrY3MtNSAxM31cbiAqXG4gKiBQQkVTMi1wYXJhbXMgOjo9IFNFUVVFTkNFIHtcbiAqICAga2V5RGVyaXZhdGlvbkZ1bmMgQWxnb3JpdGhtSWRlbnRpZmllciB7e1BCRVMyLUtERnN9fSxcbiAqICAgZW5jcnlwdGlvblNjaGVtZSBBbGdvcml0aG1JZGVudGlmaWVyIHt7UEJFUzItRW5jc319XG4gKiB9XG4gKlxuICogUEJFUzItS0RGcyBBTEdPUklUSE0tSURFTlRJRklFUiA6Oj1cbiAqICAgeyB7UEJLREYyLXBhcmFtcyBJREVOVElGSUVEIEJZIGlkLVBCS0RGMn0sIC4uLiB9XG4gKlxuICogUEJFUzItRW5jcyBBTEdPUklUSE0tSURFTlRJRklFUiA6Oj0geyAuLi4gfVxuICpcbiAqIFBCS0RGMi1wYXJhbXMgOjo9IFNFUVVFTkNFIHtcbiAqICAgc2FsdCBDSE9JQ0Uge1xuICogICAgIHNwZWNpZmllZCBPQ1RFVCBTVFJJTkcsXG4gKiAgICAgb3RoZXJTb3VyY2UgQWxnb3JpdGhtSWRlbnRpZmllciB7e1BCS0RGMi1TYWx0U291cmNlc319XG4gKiAgIH0sXG4gKiAgIGl0ZXJhdGlvbkNvdW50IElOVEVHRVIgKDEuLk1BWCksXG4gKiAgIGtleUxlbmd0aCBJTlRFR0VSICgxLi5NQVgpIE9QVElPTkFMLFxuICogICBwcmYgQWxnb3JpdGhtSWRlbnRpZmllciB7e1BCS0RGMi1QUkZzfX0gREVGQVVMVCBhbGdpZC1obWFjV2l0aFNIQTFcbiAqIH1cbiAqXG4gKiBAcGFyYW0gb2JqIHRoZSBBU04uMSBQcml2YXRlS2V5SW5mbyBvYmplY3QuXG4gKiBAcGFyYW0gcGFzc3dvcmQgdGhlIHBhc3N3b3JkIHRvIGVuY3J5cHQgd2l0aC5cbiAqIEBwYXJhbSBvcHRpb25zOlxuICogICAgICAgICAgYWxnb3JpdGhtIHRoZSBlbmNyeXB0aW9uIGFsZ29yaXRobSB0byB1c2VcbiAqICAgICAgICAgICAgKCdhZXMxMjgnLCAnYWVzMTkyJywgJ2FlczI1NicsICczZGVzJyksIGRlZmF1bHRzIHRvICdhZXMxMjgnLlxuICogICAgICAgICAgY291bnQgdGhlIGl0ZXJhdGlvbiBjb3VudCB0byB1c2UuXG4gKiAgICAgICAgICBzYWx0U2l6ZSB0aGUgc2FsdCBzaXplIHRvIHVzZS5cbiAqICAgICAgICAgIHByZkFsZ29yaXRobSB0aGUgUFJGIG1lc3NhZ2UgZGlnZXN0IGFsZ29yaXRobSB0byB1c2VcbiAqICAgICAgICAgICAgKCdzaGExJywgJ3NoYTIyNCcsICdzaGEyNTYnLCAnc2hhMzg0JywgJ3NoYTUxMicpXG4gKlxuICogQHJldHVybiB0aGUgQVNOLjEgRW5jcnlwdGVkUHJpdmF0ZUtleUluZm8uXG4gKi9cbnBraS5lbmNyeXB0UHJpdmF0ZUtleUluZm8gPSBmdW5jdGlvbihvYmosIHBhc3N3b3JkLCBvcHRpb25zKSB7XG4gIC8vIHNldCBkZWZhdWx0IG9wdGlvbnNcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIG9wdGlvbnMuc2FsdFNpemUgPSBvcHRpb25zLnNhbHRTaXplIHx8IDg7XG4gIG9wdGlvbnMuY291bnQgPSBvcHRpb25zLmNvdW50IHx8IDIwNDg7XG4gIG9wdGlvbnMuYWxnb3JpdGhtID0gb3B0aW9ucy5hbGdvcml0aG0gfHwgJ2FlczEyOCc7XG4gIG9wdGlvbnMucHJmQWxnb3JpdGhtID0gb3B0aW9ucy5wcmZBbGdvcml0aG0gfHwgJ3NoYTEnO1xuXG4gIC8vIGdlbmVyYXRlIFBCRSBwYXJhbXNcbiAgdmFyIHNhbHQgPSBmb3JnZS5yYW5kb20uZ2V0Qnl0ZXNTeW5jKG9wdGlvbnMuc2FsdFNpemUpO1xuICB2YXIgY291bnQgPSBvcHRpb25zLmNvdW50O1xuICB2YXIgY291bnRCeXRlcyA9IGFzbjEuaW50ZWdlclRvRGVyKGNvdW50KTtcbiAgdmFyIGRrTGVuO1xuICB2YXIgZW5jcnlwdGlvbkFsZ29yaXRobTtcbiAgdmFyIGVuY3J5cHRlZERhdGE7XG4gIGlmKG9wdGlvbnMuYWxnb3JpdGhtLmluZGV4T2YoJ2FlcycpID09PSAwIHx8IG9wdGlvbnMuYWxnb3JpdGhtID09PSAnZGVzJykge1xuICAgIC8vIGRvIFBCRVMyXG4gICAgdmFyIGl2TGVuLCBlbmNPaWQsIGNpcGhlckZuO1xuICAgIHN3aXRjaChvcHRpb25zLmFsZ29yaXRobSkge1xuICAgIGNhc2UgJ2FlczEyOCc6XG4gICAgICBka0xlbiA9IDE2O1xuICAgICAgaXZMZW4gPSAxNjtcbiAgICAgIGVuY09pZCA9IG9pZHNbJ2FlczEyOC1DQkMnXTtcbiAgICAgIGNpcGhlckZuID0gZm9yZ2UuYWVzLmNyZWF0ZUVuY3J5cHRpb25DaXBoZXI7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdhZXMxOTInOlxuICAgICAgZGtMZW4gPSAyNDtcbiAgICAgIGl2TGVuID0gMTY7XG4gICAgICBlbmNPaWQgPSBvaWRzWydhZXMxOTItQ0JDJ107XG4gICAgICBjaXBoZXJGbiA9IGZvcmdlLmFlcy5jcmVhdGVFbmNyeXB0aW9uQ2lwaGVyO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnYWVzMjU2JzpcbiAgICAgIGRrTGVuID0gMzI7XG4gICAgICBpdkxlbiA9IDE2O1xuICAgICAgZW5jT2lkID0gb2lkc1snYWVzMjU2LUNCQyddO1xuICAgICAgY2lwaGVyRm4gPSBmb3JnZS5hZXMuY3JlYXRlRW5jcnlwdGlvbkNpcGhlcjtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2Rlcyc6XG4gICAgICBka0xlbiA9IDg7XG4gICAgICBpdkxlbiA9IDg7XG4gICAgICBlbmNPaWQgPSBvaWRzWydkZXNDQkMnXTtcbiAgICAgIGNpcGhlckZuID0gZm9yZ2UuZGVzLmNyZWF0ZUVuY3J5cHRpb25DaXBoZXI7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgdmFyIGVycm9yID0gbmV3IEVycm9yKCdDYW5ub3QgZW5jcnlwdCBwcml2YXRlIGtleS4gVW5rbm93biBlbmNyeXB0aW9uIGFsZ29yaXRobS4nKTtcbiAgICAgIGVycm9yLmFsZ29yaXRobSA9IG9wdGlvbnMuYWxnb3JpdGhtO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuXG4gICAgLy8gZ2V0IFBSRiBtZXNzYWdlIGRpZ2VzdFxuICAgIHZhciBwcmZBbGdvcml0aG0gPSAnaG1hY1dpdGgnICsgb3B0aW9ucy5wcmZBbGdvcml0aG0udG9VcHBlckNhc2UoKTtcbiAgICB2YXIgbWQgPSBwcmZBbGdvcml0aG1Ub01lc3NhZ2VEaWdlc3QocHJmQWxnb3JpdGhtKTtcblxuICAgIC8vIGVuY3J5cHQgcHJpdmF0ZSBrZXkgdXNpbmcgcGJlIFNIQS0xIGFuZCBBRVMvREVTXG4gICAgdmFyIGRrID0gZm9yZ2UucGtjczUucGJrZGYyKHBhc3N3b3JkLCBzYWx0LCBjb3VudCwgZGtMZW4sIG1kKTtcbiAgICB2YXIgaXYgPSBmb3JnZS5yYW5kb20uZ2V0Qnl0ZXNTeW5jKGl2TGVuKTtcbiAgICB2YXIgY2lwaGVyID0gY2lwaGVyRm4oZGspO1xuICAgIGNpcGhlci5zdGFydChpdik7XG4gICAgY2lwaGVyLnVwZGF0ZShhc24xLnRvRGVyKG9iaikpO1xuICAgIGNpcGhlci5maW5pc2goKTtcbiAgICBlbmNyeXB0ZWREYXRhID0gY2lwaGVyLm91dHB1dC5nZXRCeXRlcygpO1xuXG4gICAgLy8gZ2V0IFBCS0RGMi1wYXJhbXNcbiAgICB2YXIgcGFyYW1zID0gY3JlYXRlUGJrZGYyUGFyYW1zKHNhbHQsIGNvdW50Qnl0ZXMsIGRrTGVuLCBwcmZBbGdvcml0aG0pO1xuXG4gICAgZW5jcnlwdGlvbkFsZ29yaXRobSA9IGFzbjEuY3JlYXRlKFxuICAgICAgYXNuMS5DbGFzcy5VTklWRVJTQUwsIGFzbjEuVHlwZS5TRVFVRU5DRSwgdHJ1ZSwgW1xuICAgICAgYXNuMS5jcmVhdGUoYXNuMS5DbGFzcy5VTklWRVJTQUwsIGFzbjEuVHlwZS5PSUQsIGZhbHNlLFxuICAgICAgICBhc24xLm9pZFRvRGVyKG9pZHNbJ3BrY3M1UEJFUzInXSkuZ2V0Qnl0ZXMoKSksXG4gICAgICBhc24xLmNyZWF0ZShhc24xLkNsYXNzLlVOSVZFUlNBTCwgYXNuMS5UeXBlLlNFUVVFTkNFLCB0cnVlLCBbXG4gICAgICAgIC8vIGtleURlcml2YXRpb25GdW5jXG4gICAgICAgIGFzbjEuY3JlYXRlKGFzbjEuQ2xhc3MuVU5JVkVSU0FMLCBhc24xLlR5cGUuU0VRVUVOQ0UsIHRydWUsIFtcbiAgICAgICAgICBhc24xLmNyZWF0ZShhc24xLkNsYXNzLlVOSVZFUlNBTCwgYXNuMS5UeXBlLk9JRCwgZmFsc2UsXG4gICAgICAgICAgICBhc24xLm9pZFRvRGVyKG9pZHNbJ3BrY3M1UEJLREYyJ10pLmdldEJ5dGVzKCkpLFxuICAgICAgICAgIC8vIFBCS0RGMi1wYXJhbXNcbiAgICAgICAgICBwYXJhbXNcbiAgICAgICAgXSksXG4gICAgICAgIC8vIGVuY3J5cHRpb25TY2hlbWVcbiAgICAgICAgYXNuMS5jcmVhdGUoYXNuMS5DbGFzcy5VTklWRVJTQUwsIGFzbjEuVHlwZS5TRVFVRU5DRSwgdHJ1ZSwgW1xuICAgICAgICAgIGFzbjEuY3JlYXRlKGFzbjEuQ2xhc3MuVU5JVkVSU0FMLCBhc24xLlR5cGUuT0lELCBmYWxzZSxcbiAgICAgICAgICAgIGFzbjEub2lkVG9EZXIoZW5jT2lkKS5nZXRCeXRlcygpKSxcbiAgICAgICAgICAvLyBpdlxuICAgICAgICAgIGFzbjEuY3JlYXRlKFxuICAgICAgICAgICAgYXNuMS5DbGFzcy5VTklWRVJTQUwsIGFzbjEuVHlwZS5PQ1RFVFNUUklORywgZmFsc2UsIGl2KVxuICAgICAgICBdKVxuICAgICAgXSlcbiAgICBdKTtcbiAgfSBlbHNlIGlmKG9wdGlvbnMuYWxnb3JpdGhtID09PSAnM2RlcycpIHtcbiAgICAvLyBEbyBQS0NTMTIgUEJFXG4gICAgZGtMZW4gPSAyNDtcblxuICAgIHZhciBzYWx0Qnl0ZXMgPSBuZXcgZm9yZ2UudXRpbC5CeXRlQnVmZmVyKHNhbHQpO1xuICAgIHZhciBkayA9IHBraS5wYmUuZ2VuZXJhdGVQa2NzMTJLZXkocGFzc3dvcmQsIHNhbHRCeXRlcywgMSwgY291bnQsIGRrTGVuKTtcbiAgICB2YXIgaXYgPSBwa2kucGJlLmdlbmVyYXRlUGtjczEyS2V5KHBhc3N3b3JkLCBzYWx0Qnl0ZXMsIDIsIGNvdW50LCBka0xlbik7XG4gICAgdmFyIGNpcGhlciA9IGZvcmdlLmRlcy5jcmVhdGVFbmNyeXB0aW9uQ2lwaGVyKGRrKTtcbiAgICBjaXBoZXIuc3RhcnQoaXYpO1xuICAgIGNpcGhlci51cGRhdGUoYXNuMS50b0RlcihvYmopKTtcbiAgICBjaXBoZXIuZmluaXNoKCk7XG4gICAgZW5jcnlwdGVkRGF0YSA9IGNpcGhlci5vdXRwdXQuZ2V0Qnl0ZXMoKTtcblxuICAgIGVuY3J5cHRpb25BbGdvcml0aG0gPSBhc24xLmNyZWF0ZShcbiAgICAgIGFzbjEuQ2xhc3MuVU5JVkVSU0FMLCBhc24xLlR5cGUuU0VRVUVOQ0UsIHRydWUsIFtcbiAgICAgIGFzbjEuY3JlYXRlKGFzbjEuQ2xhc3MuVU5JVkVSU0FMLCBhc24xLlR5cGUuT0lELCBmYWxzZSxcbiAgICAgICAgYXNuMS5vaWRUb0RlcihvaWRzWydwYmVXaXRoU0hBQW5kMy1LZXlUcmlwbGVERVMtQ0JDJ10pLmdldEJ5dGVzKCkpLFxuICAgICAgLy8gcGtjcy0xMlBiZVBhcmFtc1xuICAgICAgYXNuMS5jcmVhdGUoYXNuMS5DbGFzcy5VTklWRVJTQUwsIGFzbjEuVHlwZS5TRVFVRU5DRSwgdHJ1ZSwgW1xuICAgICAgICAvLyBzYWx0XG4gICAgICAgIGFzbjEuY3JlYXRlKGFzbjEuQ2xhc3MuVU5JVkVSU0FMLCBhc24xLlR5cGUuT0NURVRTVFJJTkcsIGZhbHNlLCBzYWx0KSxcbiAgICAgICAgLy8gaXRlcmF0aW9uIGNvdW50XG4gICAgICAgIGFzbjEuY3JlYXRlKGFzbjEuQ2xhc3MuVU5JVkVSU0FMLCBhc24xLlR5cGUuSU5URUdFUiwgZmFsc2UsXG4gICAgICAgICAgY291bnRCeXRlcy5nZXRCeXRlcygpKVxuICAgICAgXSlcbiAgICBdKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgZXJyb3IgPSBuZXcgRXJyb3IoJ0Nhbm5vdCBlbmNyeXB0IHByaXZhdGUga2V5LiBVbmtub3duIGVuY3J5cHRpb24gYWxnb3JpdGhtLicpO1xuICAgIGVycm9yLmFsZ29yaXRobSA9IG9wdGlvbnMuYWxnb3JpdGhtO1xuICAgIHRocm93IGVycm9yO1xuICB9XG5cbiAgLy8gRW5jcnlwdGVkUHJpdmF0ZUtleUluZm9cbiAgdmFyIHJ2YWwgPSBhc24xLmNyZWF0ZShhc24xLkNsYXNzLlVOSVZFUlNBTCwgYXNuMS5UeXBlLlNFUVVFTkNFLCB0cnVlLCBbXG4gICAgLy8gZW5jcnlwdGlvbkFsZ29yaXRobVxuICAgIGVuY3J5cHRpb25BbGdvcml0aG0sXG4gICAgLy8gZW5jcnlwdGVkRGF0YVxuICAgIGFzbjEuY3JlYXRlKFxuICAgICAgYXNuMS5DbGFzcy5VTklWRVJTQUwsIGFzbjEuVHlwZS5PQ1RFVFNUUklORywgZmFsc2UsIGVuY3J5cHRlZERhdGEpXG4gIF0pO1xuICByZXR1cm4gcnZhbDtcbn07XG5cbi8qKlxuICogRGVjcnlwdHMgYSBBU04uMSBQcml2YXRlS2V5SW5mbyBvYmplY3QuXG4gKlxuICogQHBhcmFtIG9iaiB0aGUgQVNOLjEgRW5jcnlwdGVkUHJpdmF0ZUtleUluZm8gb2JqZWN0LlxuICogQHBhcmFtIHBhc3N3b3JkIHRoZSBwYXNzd29yZCB0byBkZWNyeXB0IHdpdGguXG4gKlxuICogQHJldHVybiB0aGUgQVNOLjEgUHJpdmF0ZUtleUluZm8gb24gc3VjY2VzcywgbnVsbCBvbiBmYWlsdXJlLlxuICovXG5wa2kuZGVjcnlwdFByaXZhdGVLZXlJbmZvID0gZnVuY3Rpb24ob2JqLCBwYXNzd29yZCkge1xuICB2YXIgcnZhbCA9IG51bGw7XG5cbiAgLy8gZ2V0IFBCRSBwYXJhbXNcbiAgdmFyIGNhcHR1cmUgPSB7fTtcbiAgdmFyIGVycm9ycyA9IFtdO1xuICBpZighYXNuMS52YWxpZGF0ZShvYmosIGVuY3J5cHRlZFByaXZhdGVLZXlWYWxpZGF0b3IsIGNhcHR1cmUsIGVycm9ycykpIHtcbiAgICB2YXIgZXJyb3IgPSBuZXcgRXJyb3IoJ0Nhbm5vdCByZWFkIGVuY3J5cHRlZCBwcml2YXRlIGtleS4gJyArXG4gICAgICAnQVNOLjEgb2JqZWN0IGlzIG5vdCBhIHN1cHBvcnRlZCBFbmNyeXB0ZWRQcml2YXRlS2V5SW5mby4nKTtcbiAgICBlcnJvci5lcnJvcnMgPSBlcnJvcnM7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cblxuICAvLyBnZXQgY2lwaGVyXG4gIHZhciBvaWQgPSBhc24xLmRlclRvT2lkKGNhcHR1cmUuZW5jcnlwdGlvbk9pZCk7XG4gIHZhciBjaXBoZXIgPSBwa2kucGJlLmdldENpcGhlcihvaWQsIGNhcHR1cmUuZW5jcnlwdGlvblBhcmFtcywgcGFzc3dvcmQpO1xuXG4gIC8vIGdldCBlbmNyeXB0ZWQgZGF0YVxuICB2YXIgZW5jcnlwdGVkID0gZm9yZ2UudXRpbC5jcmVhdGVCdWZmZXIoY2FwdHVyZS5lbmNyeXB0ZWREYXRhKTtcblxuICBjaXBoZXIudXBkYXRlKGVuY3J5cHRlZCk7XG4gIGlmKGNpcGhlci5maW5pc2goKSkge1xuICAgIHJ2YWwgPSBhc24xLmZyb21EZXIoY2lwaGVyLm91dHB1dCk7XG4gIH1cblxuICByZXR1cm4gcnZhbDtcbn07XG5cbi8qKlxuICogQ29udmVydHMgYSBFbmNyeXB0ZWRQcml2YXRlS2V5SW5mbyB0byBQRU0gZm9ybWF0LlxuICpcbiAqIEBwYXJhbSBlcGtpIHRoZSBFbmNyeXB0ZWRQcml2YXRlS2V5SW5mby5cbiAqIEBwYXJhbSBtYXhsaW5lIHRoZSBtYXhpbXVtIGNoYXJhY3RlcnMgcGVyIGxpbmUsIGRlZmF1bHRzIHRvIDY0LlxuICpcbiAqIEByZXR1cm4gdGhlIFBFTS1mb3JtYXR0ZWQgZW5jcnlwdGVkIHByaXZhdGUga2V5LlxuICovXG5wa2kuZW5jcnlwdGVkUHJpdmF0ZUtleVRvUGVtID0gZnVuY3Rpb24oZXBraSwgbWF4bGluZSkge1xuICAvLyBjb252ZXJ0IHRvIERFUiwgdGhlbiBQRU0tZW5jb2RlXG4gIHZhciBtc2cgPSB7XG4gICAgdHlwZTogJ0VOQ1JZUFRFRCBQUklWQVRFIEtFWScsXG4gICAgYm9keTogYXNuMS50b0RlcihlcGtpKS5nZXRCeXRlcygpXG4gIH07XG4gIHJldHVybiBmb3JnZS5wZW0uZW5jb2RlKG1zZywge21heGxpbmU6IG1heGxpbmV9KTtcbn07XG5cbi8qKlxuICogQ29udmVydHMgYSBQRU0tZW5jb2RlZCBFbmNyeXB0ZWRQcml2YXRlS2V5SW5mbyB0byBBU04uMSBmb3JtYXQuIERlY3J5cHRpb25cbiAqIGlzIG5vdCBwZXJmb3JtZWQuXG4gKlxuICogQHBhcmFtIHBlbSB0aGUgRW5jcnlwdGVkUHJpdmF0ZUtleUluZm8gaW4gUEVNLWZvcm1hdC5cbiAqXG4gKiBAcmV0dXJuIHRoZSBBU04uMSBFbmNyeXB0ZWRQcml2YXRlS2V5SW5mby5cbiAqL1xucGtpLmVuY3J5cHRlZFByaXZhdGVLZXlGcm9tUGVtID0gZnVuY3Rpb24ocGVtKSB7XG4gIHZhciBtc2cgPSBmb3JnZS5wZW0uZGVjb2RlKHBlbSlbMF07XG5cbiAgaWYobXNnLnR5cGUgIT09ICdFTkNSWVBURUQgUFJJVkFURSBLRVknKSB7XG4gICAgdmFyIGVycm9yID0gbmV3IEVycm9yKCdDb3VsZCBub3QgY29udmVydCBlbmNyeXB0ZWQgcHJpdmF0ZSBrZXkgZnJvbSBQRU07ICcgK1xuICAgICAgJ1BFTSBoZWFkZXIgdHlwZSBpcyBcIkVOQ1JZUFRFRCBQUklWQVRFIEtFWVwiLicpO1xuICAgIGVycm9yLmhlYWRlclR5cGUgPSBtc2cudHlwZTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxuICBpZihtc2cucHJvY1R5cGUgJiYgbXNnLnByb2NUeXBlLnR5cGUgPT09ICdFTkNSWVBURUQnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgY29udmVydCBlbmNyeXB0ZWQgcHJpdmF0ZSBrZXkgZnJvbSBQRU07ICcgK1xuICAgICAgJ1BFTSBpcyBlbmNyeXB0ZWQuJyk7XG4gIH1cblxuICAvLyBjb252ZXJ0IERFUiB0byBBU04uMSBvYmplY3RcbiAgcmV0dXJuIGFzbjEuZnJvbURlcihtc2cuYm9keSk7XG59O1xuXG4vKipcbiAqIEVuY3J5cHRzIGFuIFJTQSBwcml2YXRlIGtleS4gQnkgZGVmYXVsdCwgdGhlIGtleSB3aWxsIGJlIHdyYXBwZWQgaW5cbiAqIGEgUHJpdmF0ZUtleUluZm8gYW5kIGVuY3J5cHRlZCB0byBwcm9kdWNlIGEgUEtDUyM4IEVuY3J5cHRlZFByaXZhdGVLZXlJbmZvLlxuICogVGhpcyBpcyB0aGUgc3RhbmRhcmQsIHByZWZlcnJlZCB3YXkgdG8gZW5jcnlwdCBhIHByaXZhdGUga2V5LlxuICpcbiAqIFRvIHByb2R1Y2UgYSBub24tc3RhbmRhcmQgUEVNLWVuY3J5cHRlZCBwcml2YXRlIGtleSB0aGF0IHVzZXMgZW5jYXBzdWxhdGVkXG4gKiBoZWFkZXJzIHRvIGluZGljYXRlIHRoZSBlbmNyeXB0aW9uIGFsZ29yaXRobSAob2xkLXN0eWxlIG5vbi1QS0NTIzggT3BlblNTTFxuICogcHJpdmF0ZSBrZXkgZW5jcnlwdGlvbiksIHNldCB0aGUgJ2xlZ2FjeScgb3B0aW9uIHRvIHRydWUuIE5vdGU6IFVzaW5nIHRoaXNcbiAqIG9wdGlvbiB3aWxsIGNhdXNlIHRoZSBpdGVyYXRpb24gY291bnQgdG8gYmUgZm9yY2VkIHRvIDEuXG4gKlxuICogTm90ZTogVGhlICdkZXMnIGFsZ29yaXRobSBpcyBzdXBwb3J0ZWQsIGJ1dCBpdCBpcyBub3QgY29uc2lkZXJlZCB0byBiZVxuICogc2VjdXJlIGJlY2F1c2UgaXQgb25seSB1c2VzIGEgc2luZ2xlIDU2LWJpdCBrZXkuIElmIHBvc3NpYmxlLCBpdCBpcyBoaWdobHlcbiAqIHJlY29tbWVuZGVkIHRoYXQgYSBkaWZmZXJlbnQgYWxnb3JpdGhtIGJlIHVzZWQuXG4gKlxuICogQHBhcmFtIHJzYUtleSB0aGUgUlNBIGtleSB0byBlbmNyeXB0LlxuICogQHBhcmFtIHBhc3N3b3JkIHRoZSBwYXNzd29yZCB0byB1c2UuXG4gKiBAcGFyYW0gb3B0aW9uczpcbiAqICAgICAgICAgIGFsZ29yaXRobTogdGhlIGVuY3J5cHRpb24gYWxnb3JpdGhtIHRvIHVzZVxuICogICAgICAgICAgICAoJ2FlczEyOCcsICdhZXMxOTInLCAnYWVzMjU2JywgJzNkZXMnLCAnZGVzJykuXG4gKiAgICAgICAgICBjb3VudDogdGhlIGl0ZXJhdGlvbiBjb3VudCB0byB1c2UuXG4gKiAgICAgICAgICBzYWx0U2l6ZTogdGhlIHNhbHQgc2l6ZSB0byB1c2UuXG4gKiAgICAgICAgICBsZWdhY3k6IG91dHB1dCBhbiBvbGQgbm9uLVBLQ1MjOCBQRU0tZW5jcnlwdGVkK2VuY2Fwc3VsYXRlZFxuICogICAgICAgICAgICBoZWFkZXJzIChERUstSW5mbykgcHJpdmF0ZSBrZXkuXG4gKlxuICogQHJldHVybiB0aGUgUEVNLWVuY29kZWQgQVNOLjEgRW5jcnlwdGVkUHJpdmF0ZUtleUluZm8uXG4gKi9cbnBraS5lbmNyeXB0UnNhUHJpdmF0ZUtleSA9IGZ1bmN0aW9uKHJzYUtleSwgcGFzc3dvcmQsIG9wdGlvbnMpIHtcbiAgLy8gc3RhbmRhcmQgUEtDUyM4XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICBpZighb3B0aW9ucy5sZWdhY3kpIHtcbiAgICAvLyBlbmNyeXB0IFByaXZhdGVLZXlJbmZvXG4gICAgdmFyIHJ2YWwgPSBwa2kud3JhcFJzYVByaXZhdGVLZXkocGtpLnByaXZhdGVLZXlUb0FzbjEocnNhS2V5KSk7XG4gICAgcnZhbCA9IHBraS5lbmNyeXB0UHJpdmF0ZUtleUluZm8ocnZhbCwgcGFzc3dvcmQsIG9wdGlvbnMpO1xuICAgIHJldHVybiBwa2kuZW5jcnlwdGVkUHJpdmF0ZUtleVRvUGVtKHJ2YWwpO1xuICB9XG5cbiAgLy8gbGVnYWN5IG5vbi1QS0NTIzhcbiAgdmFyIGFsZ29yaXRobTtcbiAgdmFyIGl2O1xuICB2YXIgZGtMZW47XG4gIHZhciBjaXBoZXJGbjtcbiAgc3dpdGNoKG9wdGlvbnMuYWxnb3JpdGhtKSB7XG4gIGNhc2UgJ2FlczEyOCc6XG4gICAgYWxnb3JpdGhtID0gJ0FFUy0xMjgtQ0JDJztcbiAgICBka0xlbiA9IDE2O1xuICAgIGl2ID0gZm9yZ2UucmFuZG9tLmdldEJ5dGVzU3luYygxNik7XG4gICAgY2lwaGVyRm4gPSBmb3JnZS5hZXMuY3JlYXRlRW5jcnlwdGlvbkNpcGhlcjtcbiAgICBicmVhaztcbiAgY2FzZSAnYWVzMTkyJzpcbiAgICBhbGdvcml0aG0gPSAnQUVTLTE5Mi1DQkMnO1xuICAgIGRrTGVuID0gMjQ7XG4gICAgaXYgPSBmb3JnZS5yYW5kb20uZ2V0Qnl0ZXNTeW5jKDE2KTtcbiAgICBjaXBoZXJGbiA9IGZvcmdlLmFlcy5jcmVhdGVFbmNyeXB0aW9uQ2lwaGVyO1xuICAgIGJyZWFrO1xuICBjYXNlICdhZXMyNTYnOlxuICAgIGFsZ29yaXRobSA9ICdBRVMtMjU2LUNCQyc7XG4gICAgZGtMZW4gPSAzMjtcbiAgICBpdiA9IGZvcmdlLnJhbmRvbS5nZXRCeXRlc1N5bmMoMTYpO1xuICAgIGNpcGhlckZuID0gZm9yZ2UuYWVzLmNyZWF0ZUVuY3J5cHRpb25DaXBoZXI7XG4gICAgYnJlYWs7XG4gIGNhc2UgJzNkZXMnOlxuICAgIGFsZ29yaXRobSA9ICdERVMtRURFMy1DQkMnO1xuICAgIGRrTGVuID0gMjQ7XG4gICAgaXYgPSBmb3JnZS5yYW5kb20uZ2V0Qnl0ZXNTeW5jKDgpO1xuICAgIGNpcGhlckZuID0gZm9yZ2UuZGVzLmNyZWF0ZUVuY3J5cHRpb25DaXBoZXI7XG4gICAgYnJlYWs7XG4gIGNhc2UgJ2Rlcyc6XG4gICAgYWxnb3JpdGhtID0gJ0RFUy1DQkMnO1xuICAgIGRrTGVuID0gODtcbiAgICBpdiA9IGZvcmdlLnJhbmRvbS5nZXRCeXRlc1N5bmMoOCk7XG4gICAgY2lwaGVyRm4gPSBmb3JnZS5kZXMuY3JlYXRlRW5jcnlwdGlvbkNpcGhlcjtcbiAgICBicmVhaztcbiAgZGVmYXVsdDpcbiAgICB2YXIgZXJyb3IgPSBuZXcgRXJyb3IoJ0NvdWxkIG5vdCBlbmNyeXB0IFJTQSBwcml2YXRlIGtleTsgdW5zdXBwb3J0ZWQgJyArXG4gICAgICAnZW5jcnlwdGlvbiBhbGdvcml0aG0gXCInICsgb3B0aW9ucy5hbGdvcml0aG0gKyAnXCIuJyk7XG4gICAgZXJyb3IuYWxnb3JpdGhtID0gb3B0aW9ucy5hbGdvcml0aG07XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cblxuICAvLyBlbmNyeXB0IHByaXZhdGUga2V5IHVzaW5nIE9wZW5TU0wgbGVnYWN5IGtleSBkZXJpdmF0aW9uXG4gIHZhciBkayA9IGZvcmdlLnBiZS5vcGVuc3NsRGVyaXZlQnl0ZXMocGFzc3dvcmQsIGl2LnN1YnN0cigwLCA4KSwgZGtMZW4pO1xuICB2YXIgY2lwaGVyID0gY2lwaGVyRm4oZGspO1xuICBjaXBoZXIuc3RhcnQoaXYpO1xuICBjaXBoZXIudXBkYXRlKGFzbjEudG9EZXIocGtpLnByaXZhdGVLZXlUb0FzbjEocnNhS2V5KSkpO1xuICBjaXBoZXIuZmluaXNoKCk7XG5cbiAgdmFyIG1zZyA9IHtcbiAgICB0eXBlOiAnUlNBIFBSSVZBVEUgS0VZJyxcbiAgICBwcm9jVHlwZToge1xuICAgICAgdmVyc2lvbjogJzQnLFxuICAgICAgdHlwZTogJ0VOQ1JZUFRFRCdcbiAgICB9LFxuICAgIGRla0luZm86IHtcbiAgICAgIGFsZ29yaXRobTogYWxnb3JpdGhtLFxuICAgICAgcGFyYW1ldGVyczogZm9yZ2UudXRpbC5ieXRlc1RvSGV4KGl2KS50b1VwcGVyQ2FzZSgpXG4gICAgfSxcbiAgICBib2R5OiBjaXBoZXIub3V0cHV0LmdldEJ5dGVzKClcbiAgfTtcbiAgcmV0dXJuIGZvcmdlLnBlbS5lbmNvZGUobXNnKTtcbn07XG5cbi8qKlxuICogRGVjcnlwdHMgYW4gUlNBIHByaXZhdGUga2V5LlxuICpcbiAqIEBwYXJhbSBwZW0gdGhlIFBFTS1mb3JtYXR0ZWQgRW5jcnlwdGVkUHJpdmF0ZUtleUluZm8gdG8gZGVjcnlwdC5cbiAqIEBwYXJhbSBwYXNzd29yZCB0aGUgcGFzc3dvcmQgdG8gdXNlLlxuICpcbiAqIEByZXR1cm4gdGhlIFJTQSBrZXkgb24gc3VjY2VzcywgbnVsbCBvbiBmYWlsdXJlLlxuICovXG5wa2kuZGVjcnlwdFJzYVByaXZhdGVLZXkgPSBmdW5jdGlvbihwZW0sIHBhc3N3b3JkKSB7XG4gIHZhciBydmFsID0gbnVsbDtcblxuICB2YXIgbXNnID0gZm9yZ2UucGVtLmRlY29kZShwZW0pWzBdO1xuXG4gIGlmKG1zZy50eXBlICE9PSAnRU5DUllQVEVEIFBSSVZBVEUgS0VZJyAmJlxuICAgIG1zZy50eXBlICE9PSAnUFJJVkFURSBLRVknICYmXG4gICAgbXNnLnR5cGUgIT09ICdSU0EgUFJJVkFURSBLRVknKSB7XG4gICAgdmFyIGVycm9yID0gbmV3IEVycm9yKCdDb3VsZCBub3QgY29udmVydCBwcml2YXRlIGtleSBmcm9tIFBFTTsgUEVNIGhlYWRlciB0eXBlICcgK1xuICAgICAgJ2lzIG5vdCBcIkVOQ1JZUFRFRCBQUklWQVRFIEtFWVwiLCBcIlBSSVZBVEUgS0VZXCIsIG9yIFwiUlNBIFBSSVZBVEUgS0VZXCIuJyk7XG4gICAgZXJyb3IuaGVhZGVyVHlwZSA9IGVycm9yO1xuICAgIHRocm93IGVycm9yO1xuICB9XG5cbiAgaWYobXNnLnByb2NUeXBlICYmIG1zZy5wcm9jVHlwZS50eXBlID09PSAnRU5DUllQVEVEJykge1xuICAgIHZhciBka0xlbjtcbiAgICB2YXIgY2lwaGVyRm47XG4gICAgc3dpdGNoKG1zZy5kZWtJbmZvLmFsZ29yaXRobSkge1xuICAgIGNhc2UgJ0RFUy1DQkMnOlxuICAgICAgZGtMZW4gPSA4O1xuICAgICAgY2lwaGVyRm4gPSBmb3JnZS5kZXMuY3JlYXRlRGVjcnlwdGlvbkNpcGhlcjtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ0RFUy1FREUzLUNCQyc6XG4gICAgICBka0xlbiA9IDI0O1xuICAgICAgY2lwaGVyRm4gPSBmb3JnZS5kZXMuY3JlYXRlRGVjcnlwdGlvbkNpcGhlcjtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ0FFUy0xMjgtQ0JDJzpcbiAgICAgIGRrTGVuID0gMTY7XG4gICAgICBjaXBoZXJGbiA9IGZvcmdlLmFlcy5jcmVhdGVEZWNyeXB0aW9uQ2lwaGVyO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnQUVTLTE5Mi1DQkMnOlxuICAgICAgZGtMZW4gPSAyNDtcbiAgICAgIGNpcGhlckZuID0gZm9yZ2UuYWVzLmNyZWF0ZURlY3J5cHRpb25DaXBoZXI7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdBRVMtMjU2LUNCQyc6XG4gICAgICBka0xlbiA9IDMyO1xuICAgICAgY2lwaGVyRm4gPSBmb3JnZS5hZXMuY3JlYXRlRGVjcnlwdGlvbkNpcGhlcjtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ1JDMi00MC1DQkMnOlxuICAgICAgZGtMZW4gPSA1O1xuICAgICAgY2lwaGVyRm4gPSBmdW5jdGlvbihrZXkpIHtcbiAgICAgICAgcmV0dXJuIGZvcmdlLnJjMi5jcmVhdGVEZWNyeXB0aW9uQ2lwaGVyKGtleSwgNDApO1xuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ1JDMi02NC1DQkMnOlxuICAgICAgZGtMZW4gPSA4O1xuICAgICAgY2lwaGVyRm4gPSBmdW5jdGlvbihrZXkpIHtcbiAgICAgICAgcmV0dXJuIGZvcmdlLnJjMi5jcmVhdGVEZWNyeXB0aW9uQ2lwaGVyKGtleSwgNjQpO1xuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ1JDMi0xMjgtQ0JDJzpcbiAgICAgIGRrTGVuID0gMTY7XG4gICAgICBjaXBoZXJGbiA9IGZ1bmN0aW9uKGtleSkge1xuICAgICAgICByZXR1cm4gZm9yZ2UucmMyLmNyZWF0ZURlY3J5cHRpb25DaXBoZXIoa2V5LCAxMjgpO1xuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICB2YXIgZXJyb3IgPSBuZXcgRXJyb3IoJ0NvdWxkIG5vdCBkZWNyeXB0IHByaXZhdGUga2V5OyB1bnN1cHBvcnRlZCAnICtcbiAgICAgICAgJ2VuY3J5cHRpb24gYWxnb3JpdGhtIFwiJyArIG1zZy5kZWtJbmZvLmFsZ29yaXRobSArICdcIi4nKTtcbiAgICAgIGVycm9yLmFsZ29yaXRobSA9IG1zZy5kZWtJbmZvLmFsZ29yaXRobTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cblxuICAgIC8vIHVzZSBPcGVuU1NMIGxlZ2FjeSBrZXkgZGVyaXZhdGlvblxuICAgIHZhciBpdiA9IGZvcmdlLnV0aWwuaGV4VG9CeXRlcyhtc2cuZGVrSW5mby5wYXJhbWV0ZXJzKTtcbiAgICB2YXIgZGsgPSBmb3JnZS5wYmUub3BlbnNzbERlcml2ZUJ5dGVzKHBhc3N3b3JkLCBpdi5zdWJzdHIoMCwgOCksIGRrTGVuKTtcbiAgICB2YXIgY2lwaGVyID0gY2lwaGVyRm4oZGspO1xuICAgIGNpcGhlci5zdGFydChpdik7XG4gICAgY2lwaGVyLnVwZGF0ZShmb3JnZS51dGlsLmNyZWF0ZUJ1ZmZlcihtc2cuYm9keSkpO1xuICAgIGlmKGNpcGhlci5maW5pc2goKSkge1xuICAgICAgcnZhbCA9IGNpcGhlci5vdXRwdXQuZ2V0Qnl0ZXMoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHJ2YWw7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHJ2YWwgPSBtc2cuYm9keTtcbiAgfVxuXG4gIGlmKG1zZy50eXBlID09PSAnRU5DUllQVEVEIFBSSVZBVEUgS0VZJykge1xuICAgIHJ2YWwgPSBwa2kuZGVjcnlwdFByaXZhdGVLZXlJbmZvKGFzbjEuZnJvbURlcihydmFsKSwgcGFzc3dvcmQpO1xuICB9IGVsc2Uge1xuICAgIC8vIGRlY3J5cHRpb24gYWxyZWFkeSBwZXJmb3JtZWQgYWJvdmVcbiAgICBydmFsID0gYXNuMS5mcm9tRGVyKHJ2YWwpO1xuICB9XG5cbiAgaWYocnZhbCAhPT0gbnVsbCkge1xuICAgIHJ2YWwgPSBwa2kucHJpdmF0ZUtleUZyb21Bc24xKHJ2YWwpO1xuICB9XG5cbiAgcmV0dXJuIHJ2YWw7XG59O1xuXG4vKipcbiAqIERlcml2ZXMgYSBQS0NTIzEyIGtleS5cbiAqXG4gKiBAcGFyYW0gcGFzc3dvcmQgdGhlIHBhc3N3b3JkIHRvIGRlcml2ZSB0aGUga2V5IG1hdGVyaWFsIGZyb20sIG51bGwgb3JcbiAqICAgICAgICAgIHVuZGVmaW5lZCBmb3Igbm9uZS5cbiAqIEBwYXJhbSBzYWx0IHRoZSBzYWx0LCBhcyBhIEJ5dGVCdWZmZXIsIHRvIHVzZS5cbiAqIEBwYXJhbSBpZCB0aGUgUEtDUyMxMiBJRCBieXRlICgxID0ga2V5IG1hdGVyaWFsLCAyID0gSVYsIDMgPSBNQUMpLlxuICogQHBhcmFtIGl0ZXIgdGhlIGl0ZXJhdGlvbiBjb3VudC5cbiAqIEBwYXJhbSBuIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gZGVyaXZlIGZyb20gdGhlIHBhc3N3b3JkLlxuICogQHBhcmFtIG1kIHRoZSBtZXNzYWdlIGRpZ2VzdCB0byB1c2UsIGRlZmF1bHRzIHRvIFNIQS0xLlxuICpcbiAqIEByZXR1cm4gYSBCeXRlQnVmZmVyIHdpdGggdGhlIGJ5dGVzIGRlcml2ZWQgZnJvbSB0aGUgcGFzc3dvcmQuXG4gKi9cbnBraS5wYmUuZ2VuZXJhdGVQa2NzMTJLZXkgPSBmdW5jdGlvbihwYXNzd29yZCwgc2FsdCwgaWQsIGl0ZXIsIG4sIG1kKSB7XG4gIHZhciBqLCBsO1xuXG4gIGlmKHR5cGVvZiBtZCA9PT0gJ3VuZGVmaW5lZCcgfHwgbWQgPT09IG51bGwpIHtcbiAgICBpZighKCdzaGExJyBpbiBmb3JnZS5tZCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignXCJzaGExXCIgaGFzaCBhbGdvcml0aG0gdW5hdmFpbGFibGUuJyk7XG4gICAgfVxuICAgIG1kID0gZm9yZ2UubWQuc2hhMS5jcmVhdGUoKTtcbiAgfVxuXG4gIHZhciB1ID0gbWQuZGlnZXN0TGVuZ3RoO1xuICB2YXIgdiA9IG1kLmJsb2NrTGVuZ3RoO1xuICB2YXIgcmVzdWx0ID0gbmV3IGZvcmdlLnV0aWwuQnl0ZUJ1ZmZlcigpO1xuXG4gIC8qIENvbnZlcnQgcGFzc3dvcmQgdG8gVW5pY29kZSBieXRlIGJ1ZmZlciArIHRyYWlsaW5nIDAtYnl0ZS4gKi9cbiAgdmFyIHBhc3NCdWYgPSBuZXcgZm9yZ2UudXRpbC5CeXRlQnVmZmVyKCk7XG4gIGlmKHBhc3N3b3JkICE9PSBudWxsICYmIHBhc3N3b3JkICE9PSB1bmRlZmluZWQpIHtcbiAgICBmb3IobCA9IDA7IGwgPCBwYXNzd29yZC5sZW5ndGg7IGwrKykge1xuICAgICAgcGFzc0J1Zi5wdXRJbnQxNihwYXNzd29yZC5jaGFyQ29kZUF0KGwpKTtcbiAgICB9XG4gICAgcGFzc0J1Zi5wdXRJbnQxNigwKTtcbiAgfVxuXG4gIC8qIExlbmd0aCBvZiBzYWx0IGFuZCBwYXNzd29yZCBpbiBCWVRFUy4gKi9cbiAgdmFyIHAgPSBwYXNzQnVmLmxlbmd0aCgpO1xuICB2YXIgcyA9IHNhbHQubGVuZ3RoKCk7XG5cbiAgLyogMS4gQ29uc3RydWN0IGEgc3RyaW5nLCBEICh0aGUgXCJkaXZlcnNpZmllclwiKSwgYnkgY29uY2F0ZW5hdGluZ1xuICAgICAgICB2IGNvcGllcyBvZiBJRC4gKi9cbiAgdmFyIEQgPSBuZXcgZm9yZ2UudXRpbC5CeXRlQnVmZmVyKCk7XG4gIEQuZmlsbFdpdGhCeXRlKGlkLCB2KTtcblxuICAvKiAyLiBDb25jYXRlbmF0ZSBjb3BpZXMgb2YgdGhlIHNhbHQgdG9nZXRoZXIgdG8gY3JlYXRlIGEgc3RyaW5nIFMgb2YgbGVuZ3RoXG4gICAgICAgIHYgKiBjZWlsKHMgLyB2KSBieXRlcyAodGhlIGZpbmFsIGNvcHkgb2YgdGhlIHNhbHQgbWF5IGJlIHRydW5hY3RlZFxuICAgICAgICB0byBjcmVhdGUgUykuXG4gICAgICAgIE5vdGUgdGhhdCBpZiB0aGUgc2FsdCBpcyB0aGUgZW1wdHkgc3RyaW5nLCB0aGVuIHNvIGlzIFMuICovXG4gIHZhciBTbGVuID0gdiAqIE1hdGguY2VpbChzIC8gdik7XG4gIHZhciBTID0gbmV3IGZvcmdlLnV0aWwuQnl0ZUJ1ZmZlcigpO1xuICBmb3IobCA9IDA7IGwgPCBTbGVuOyBsKyspIHtcbiAgICBTLnB1dEJ5dGUoc2FsdC5hdChsICUgcykpO1xuICB9XG5cbiAgLyogMy4gQ29uY2F0ZW5hdGUgY29waWVzIG9mIHRoZSBwYXNzd29yZCB0b2dldGhlciB0byBjcmVhdGUgYSBzdHJpbmcgUCBvZlxuICAgICAgICBsZW5ndGggdiAqIGNlaWwocCAvIHYpIGJ5dGVzICh0aGUgZmluYWwgY29weSBvZiB0aGUgcGFzc3dvcmQgbWF5IGJlXG4gICAgICAgIHRydW5jYXRlZCB0byBjcmVhdGUgUCkuXG4gICAgICAgIE5vdGUgdGhhdCBpZiB0aGUgcGFzc3dvcmQgaXMgdGhlIGVtcHR5IHN0cmluZywgdGhlbiBzbyBpcyBQLiAqL1xuICB2YXIgUGxlbiA9IHYgKiBNYXRoLmNlaWwocCAvIHYpO1xuICB2YXIgUCA9IG5ldyBmb3JnZS51dGlsLkJ5dGVCdWZmZXIoKTtcbiAgZm9yKGwgPSAwOyBsIDwgUGxlbjsgbCsrKSB7XG4gICAgUC5wdXRCeXRlKHBhc3NCdWYuYXQobCAlIHApKTtcbiAgfVxuXG4gIC8qIDQuIFNldCBJPVN8fFAgdG8gYmUgdGhlIGNvbmNhdGVuYXRpb24gb2YgUyBhbmQgUC4gKi9cbiAgdmFyIEkgPSBTO1xuICBJLnB1dEJ1ZmZlcihQKTtcblxuICAvKiA1LiBTZXQgYz1jZWlsKG4gLyB1KS4gKi9cbiAgdmFyIGMgPSBNYXRoLmNlaWwobiAvIHUpO1xuXG4gIC8qIDYuIEZvciBpPTEsIDIsIC4uLiwgYywgZG8gdGhlIGZvbGxvd2luZzogKi9cbiAgZm9yKHZhciBpID0gMTsgaSA8PSBjOyBpKyspIHtcbiAgICAvKiBhKSBTZXQgQWk9SF5yKER8fEkpLiAobC5lLiB0aGUgcnRoIGhhc2ggb2YgRHx8SSwgSChIKEgoLi4uSChEfHxJKSkpKSAqL1xuICAgIHZhciBidWYgPSBuZXcgZm9yZ2UudXRpbC5CeXRlQnVmZmVyKCk7XG4gICAgYnVmLnB1dEJ5dGVzKEQuYnl0ZXMoKSk7XG4gICAgYnVmLnB1dEJ5dGVzKEkuYnl0ZXMoKSk7XG4gICAgZm9yKHZhciByb3VuZCA9IDA7IHJvdW5kIDwgaXRlcjsgcm91bmQrKykge1xuICAgICAgbWQuc3RhcnQoKTtcbiAgICAgIG1kLnVwZGF0ZShidWYuZ2V0Qnl0ZXMoKSk7XG4gICAgICBidWYgPSBtZC5kaWdlc3QoKTtcbiAgICB9XG5cbiAgICAvKiBiKSBDb25jYXRlbmF0ZSBjb3BpZXMgb2YgQWkgdG8gY3JlYXRlIGEgc3RyaW5nIEIgb2YgbGVuZ3RoIHYgYnl0ZXMgKHRoZVxuICAgICAgICAgIGZpbmFsIGNvcHkgb2YgQWkgbWF5IGJlIHRydW5jYXRlZCB0byBjcmVhdGUgQikuICovXG4gICAgdmFyIEIgPSBuZXcgZm9yZ2UudXRpbC5CeXRlQnVmZmVyKCk7XG4gICAgZm9yKGwgPSAwOyBsIDwgdjsgbCsrKSB7XG4gICAgICBCLnB1dEJ5dGUoYnVmLmF0KGwgJSB1KSk7XG4gICAgfVxuXG4gICAgLyogYykgVHJlYXRpbmcgSSBhcyBhIGNvbmNhdGVuYXRpb24gSTAsIEkxLCAuLi4sIElrLTEgb2Ygdi1ieXRlIGJsb2NrcyxcbiAgICAgICAgICB3aGVyZSBrPWNlaWwocyAvIHYpICsgY2VpbChwIC8gdiksIG1vZGlmeSBJIGJ5IHNldHRpbmdcbiAgICAgICAgICBJaj0oSWorQisxKSBtb2QgMnYgZm9yIGVhY2ggai4gICovXG4gICAgdmFyIGsgPSBNYXRoLmNlaWwocyAvIHYpICsgTWF0aC5jZWlsKHAgLyB2KTtcbiAgICB2YXIgSW5ldyA9IG5ldyBmb3JnZS51dGlsLkJ5dGVCdWZmZXIoKTtcbiAgICBmb3IoaiA9IDA7IGogPCBrOyBqKyspIHtcbiAgICAgIHZhciBjaHVuayA9IG5ldyBmb3JnZS51dGlsLkJ5dGVCdWZmZXIoSS5nZXRCeXRlcyh2KSk7XG4gICAgICB2YXIgeCA9IDB4MWZmO1xuICAgICAgZm9yKGwgPSBCLmxlbmd0aCgpIC0gMTsgbCA+PSAwOyBsLS0pIHtcbiAgICAgICAgeCA9IHggPj4gODtcbiAgICAgICAgeCArPSBCLmF0KGwpICsgY2h1bmsuYXQobCk7XG4gICAgICAgIGNodW5rLnNldEF0KGwsIHggJiAweGZmKTtcbiAgICAgIH1cbiAgICAgIEluZXcucHV0QnVmZmVyKGNodW5rKTtcbiAgICB9XG4gICAgSSA9IEluZXc7XG5cbiAgICAvKiBBZGQgQWkgdG8gQS4gKi9cbiAgICByZXN1bHQucHV0QnVmZmVyKGJ1Zik7XG4gIH1cblxuICByZXN1bHQudHJ1bmNhdGUocmVzdWx0Lmxlbmd0aCgpIC0gbik7XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKipcbiAqIEdldCBuZXcgRm9yZ2UgY2lwaGVyIG9iamVjdCBpbnN0YW5jZS5cbiAqXG4gKiBAcGFyYW0gb2lkIHRoZSBPSUQgKGluIHN0cmluZyBub3RhdGlvbikuXG4gKiBAcGFyYW0gcGFyYW1zIHRoZSBBU04uMSBwYXJhbXMgb2JqZWN0LlxuICogQHBhcmFtIHBhc3N3b3JkIHRoZSBwYXNzd29yZCB0byBkZWNyeXB0IHdpdGguXG4gKlxuICogQHJldHVybiBuZXcgY2lwaGVyIG9iamVjdCBpbnN0YW5jZS5cbiAqL1xucGtpLnBiZS5nZXRDaXBoZXIgPSBmdW5jdGlvbihvaWQsIHBhcmFtcywgcGFzc3dvcmQpIHtcbiAgc3dpdGNoKG9pZCkge1xuICBjYXNlIHBraS5vaWRzWydwa2NzNVBCRVMyJ106XG4gICAgcmV0dXJuIHBraS5wYmUuZ2V0Q2lwaGVyRm9yUEJFUzIob2lkLCBwYXJhbXMsIHBhc3N3b3JkKTtcblxuICBjYXNlIHBraS5vaWRzWydwYmVXaXRoU0hBQW5kMy1LZXlUcmlwbGVERVMtQ0JDJ106XG4gIGNhc2UgcGtpLm9pZHNbJ3BiZXdpdGhTSEFBbmQ0MEJpdFJDMi1DQkMnXTpcbiAgICByZXR1cm4gcGtpLnBiZS5nZXRDaXBoZXJGb3JQS0NTMTJQQkUob2lkLCBwYXJhbXMsIHBhc3N3b3JkKTtcblxuICBkZWZhdWx0OlxuICAgIHZhciBlcnJvciA9IG5ldyBFcnJvcignQ2Fubm90IHJlYWQgZW5jcnlwdGVkIFBCRSBkYXRhIGJsb2NrLiBVbnN1cHBvcnRlZCBPSUQuJyk7XG4gICAgZXJyb3Iub2lkID0gb2lkO1xuICAgIGVycm9yLnN1cHBvcnRlZE9pZHMgPSBbXG4gICAgICAncGtjczVQQkVTMicsXG4gICAgICAncGJlV2l0aFNIQUFuZDMtS2V5VHJpcGxlREVTLUNCQycsXG4gICAgICAncGJld2l0aFNIQUFuZDQwQml0UkMyLUNCQydcbiAgICBdO1xuICAgIHRocm93IGVycm9yO1xuICB9XG59O1xuXG4vKipcbiAqIEdldCBuZXcgRm9yZ2UgY2lwaGVyIG9iamVjdCBpbnN0YW5jZSBhY2NvcmRpbmcgdG8gUEJFUzIgcGFyYW1zIGJsb2NrLlxuICpcbiAqIFRoZSByZXR1cm5lZCBjaXBoZXIgaW5zdGFuY2UgaXMgYWxyZWFkeSBzdGFydGVkIHVzaW5nIHRoZSBJVlxuICogZnJvbSBQQkVTMiBwYXJhbWV0ZXIgYmxvY2suXG4gKlxuICogQHBhcmFtIG9pZCB0aGUgUEtDUyM1IFBCS0RGMiBPSUQgKGluIHN0cmluZyBub3RhdGlvbikuXG4gKiBAcGFyYW0gcGFyYW1zIHRoZSBBU04uMSBQQkVTMi1wYXJhbXMgb2JqZWN0LlxuICogQHBhcmFtIHBhc3N3b3JkIHRoZSBwYXNzd29yZCB0byBkZWNyeXB0IHdpdGguXG4gKlxuICogQHJldHVybiBuZXcgY2lwaGVyIG9iamVjdCBpbnN0YW5jZS5cbiAqL1xucGtpLnBiZS5nZXRDaXBoZXJGb3JQQkVTMiA9IGZ1bmN0aW9uKG9pZCwgcGFyYW1zLCBwYXNzd29yZCkge1xuICAvLyBnZXQgUEJFIHBhcmFtc1xuICB2YXIgY2FwdHVyZSA9IHt9O1xuICB2YXIgZXJyb3JzID0gW107XG4gIGlmKCFhc24xLnZhbGlkYXRlKHBhcmFtcywgUEJFUzJBbGdvcml0aG1zVmFsaWRhdG9yLCBjYXB0dXJlLCBlcnJvcnMpKSB7XG4gICAgdmFyIGVycm9yID0gbmV3IEVycm9yKCdDYW5ub3QgcmVhZCBwYXNzd29yZC1iYXNlZC1lbmNyeXB0aW9uIGFsZ29yaXRobSAnICtcbiAgICAgICdwYXJhbWV0ZXJzLiBBU04uMSBvYmplY3QgaXMgbm90IGEgc3VwcG9ydGVkIEVuY3J5cHRlZFByaXZhdGVLZXlJbmZvLicpO1xuICAgIGVycm9yLmVycm9ycyA9IGVycm9ycztcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxuXG4gIC8vIGNoZWNrIG9pZHNcbiAgb2lkID0gYXNuMS5kZXJUb09pZChjYXB0dXJlLmtkZk9pZCk7XG4gIGlmKG9pZCAhPT0gcGtpLm9pZHNbJ3BrY3M1UEJLREYyJ10pIHtcbiAgICB2YXIgZXJyb3IgPSBuZXcgRXJyb3IoJ0Nhbm5vdCByZWFkIGVuY3J5cHRlZCBwcml2YXRlIGtleS4gJyArXG4gICAgICAnVW5zdXBwb3J0ZWQga2V5IGRlcml2YXRpb24gZnVuY3Rpb24gT0lELicpO1xuICAgIGVycm9yLm9pZCA9IG9pZDtcbiAgICBlcnJvci5zdXBwb3J0ZWRPaWRzID0gWydwa2NzNVBCS0RGMiddO1xuICAgIHRocm93IGVycm9yO1xuICB9XG4gIG9pZCA9IGFzbjEuZGVyVG9PaWQoY2FwdHVyZS5lbmNPaWQpO1xuICBpZihvaWQgIT09IHBraS5vaWRzWydhZXMxMjgtQ0JDJ10gJiZcbiAgICBvaWQgIT09IHBraS5vaWRzWydhZXMxOTItQ0JDJ10gJiZcbiAgICBvaWQgIT09IHBraS5vaWRzWydhZXMyNTYtQ0JDJ10gJiZcbiAgICBvaWQgIT09IHBraS5vaWRzWydkZXMtRURFMy1DQkMnXSAmJlxuICAgIG9pZCAhPT0gcGtpLm9pZHNbJ2Rlc0NCQyddKSB7XG4gICAgdmFyIGVycm9yID0gbmV3IEVycm9yKCdDYW5ub3QgcmVhZCBlbmNyeXB0ZWQgcHJpdmF0ZSBrZXkuICcgK1xuICAgICAgJ1Vuc3VwcG9ydGVkIGVuY3J5cHRpb24gc2NoZW1lIE9JRC4nKTtcbiAgICBlcnJvci5vaWQgPSBvaWQ7XG4gICAgZXJyb3Iuc3VwcG9ydGVkT2lkcyA9IFtcbiAgICAgICdhZXMxMjgtQ0JDJywgJ2FlczE5Mi1DQkMnLCAnYWVzMjU2LUNCQycsICdkZXMtRURFMy1DQkMnLCAnZGVzQ0JDJ107XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cblxuICAvLyBzZXQgUEJFIHBhcmFtc1xuICB2YXIgc2FsdCA9IGNhcHR1cmUua2RmU2FsdDtcbiAgdmFyIGNvdW50ID0gZm9yZ2UudXRpbC5jcmVhdGVCdWZmZXIoY2FwdHVyZS5rZGZJdGVyYXRpb25Db3VudCk7XG4gIGNvdW50ID0gY291bnQuZ2V0SW50KGNvdW50Lmxlbmd0aCgpIDw8IDMpO1xuICB2YXIgZGtMZW47XG4gIHZhciBjaXBoZXJGbjtcbiAgc3dpdGNoKHBraS5vaWRzW29pZF0pIHtcbiAgY2FzZSAnYWVzMTI4LUNCQyc6XG4gICAgZGtMZW4gPSAxNjtcbiAgICBjaXBoZXJGbiA9IGZvcmdlLmFlcy5jcmVhdGVEZWNyeXB0aW9uQ2lwaGVyO1xuICAgIGJyZWFrO1xuICBjYXNlICdhZXMxOTItQ0JDJzpcbiAgICBka0xlbiA9IDI0O1xuICAgIGNpcGhlckZuID0gZm9yZ2UuYWVzLmNyZWF0ZURlY3J5cHRpb25DaXBoZXI7XG4gICAgYnJlYWs7XG4gIGNhc2UgJ2FlczI1Ni1DQkMnOlxuICAgIGRrTGVuID0gMzI7XG4gICAgY2lwaGVyRm4gPSBmb3JnZS5hZXMuY3JlYXRlRGVjcnlwdGlvbkNpcGhlcjtcbiAgICBicmVhaztcbiAgY2FzZSAnZGVzLUVERTMtQ0JDJzpcbiAgICBka0xlbiA9IDI0O1xuICAgIGNpcGhlckZuID0gZm9yZ2UuZGVzLmNyZWF0ZURlY3J5cHRpb25DaXBoZXI7XG4gICAgYnJlYWs7XG4gIGNhc2UgJ2Rlc0NCQyc6XG4gICAgZGtMZW4gPSA4O1xuICAgIGNpcGhlckZuID0gZm9yZ2UuZGVzLmNyZWF0ZURlY3J5cHRpb25DaXBoZXI7XG4gICAgYnJlYWs7XG4gIH1cblxuICAvLyBnZXQgUFJGIG1lc3NhZ2UgZGlnZXN0XG4gIHZhciBtZCA9IHByZk9pZFRvTWVzc2FnZURpZ2VzdChjYXB0dXJlLnByZk9pZCk7XG5cbiAgLy8gZGVjcnlwdCBwcml2YXRlIGtleSB1c2luZyBwYmUgd2l0aCBjaG9zZW4gUFJGIGFuZCBBRVMvREVTXG4gIHZhciBkayA9IGZvcmdlLnBrY3M1LnBia2RmMihwYXNzd29yZCwgc2FsdCwgY291bnQsIGRrTGVuLCBtZCk7XG4gIHZhciBpdiA9IGNhcHR1cmUuZW5jSXY7XG4gIHZhciBjaXBoZXIgPSBjaXBoZXJGbihkayk7XG4gIGNpcGhlci5zdGFydChpdik7XG5cbiAgcmV0dXJuIGNpcGhlcjtcbn07XG5cbi8qKlxuICogR2V0IG5ldyBGb3JnZSBjaXBoZXIgb2JqZWN0IGluc3RhbmNlIGZvciBQS0NTIzEyIFBCRS5cbiAqXG4gKiBUaGUgcmV0dXJuZWQgY2lwaGVyIGluc3RhbmNlIGlzIGFscmVhZHkgc3RhcnRlZCB1c2luZyB0aGUga2V5ICYgSVZcbiAqIGRlcml2ZWQgZnJvbSB0aGUgcHJvdmlkZWQgcGFzc3dvcmQgYW5kIFBLQ1MjMTIgUEJFIHNhbHQuXG4gKlxuICogQHBhcmFtIG9pZCBUaGUgUEtDUyMxMiBQQkUgT0lEIChpbiBzdHJpbmcgbm90YXRpb24pLlxuICogQHBhcmFtIHBhcmFtcyBUaGUgQVNOLjEgUEtDUyMxMiBQQkUtcGFyYW1zIG9iamVjdC5cbiAqIEBwYXJhbSBwYXNzd29yZCBUaGUgcGFzc3dvcmQgdG8gZGVjcnlwdCB3aXRoLlxuICpcbiAqIEByZXR1cm4gdGhlIG5ldyBjaXBoZXIgb2JqZWN0IGluc3RhbmNlLlxuICovXG5wa2kucGJlLmdldENpcGhlckZvclBLQ1MxMlBCRSA9IGZ1bmN0aW9uKG9pZCwgcGFyYW1zLCBwYXNzd29yZCkge1xuICAvLyBnZXQgUEJFIHBhcmFtc1xuICB2YXIgY2FwdHVyZSA9IHt9O1xuICB2YXIgZXJyb3JzID0gW107XG4gIGlmKCFhc24xLnZhbGlkYXRlKHBhcmFtcywgcGtjczEyUGJlUGFyYW1zVmFsaWRhdG9yLCBjYXB0dXJlLCBlcnJvcnMpKSB7XG4gICAgdmFyIGVycm9yID0gbmV3IEVycm9yKCdDYW5ub3QgcmVhZCBwYXNzd29yZC1iYXNlZC1lbmNyeXB0aW9uIGFsZ29yaXRobSAnICtcbiAgICAgICdwYXJhbWV0ZXJzLiBBU04uMSBvYmplY3QgaXMgbm90IGEgc3VwcG9ydGVkIEVuY3J5cHRlZFByaXZhdGVLZXlJbmZvLicpO1xuICAgIGVycm9yLmVycm9ycyA9IGVycm9ycztcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxuXG4gIHZhciBzYWx0ID0gZm9yZ2UudXRpbC5jcmVhdGVCdWZmZXIoY2FwdHVyZS5zYWx0KTtcbiAgdmFyIGNvdW50ID0gZm9yZ2UudXRpbC5jcmVhdGVCdWZmZXIoY2FwdHVyZS5pdGVyYXRpb25zKTtcbiAgY291bnQgPSBjb3VudC5nZXRJbnQoY291bnQubGVuZ3RoKCkgPDwgMyk7XG5cbiAgdmFyIGRrTGVuLCBkSXZMZW4sIGNpcGhlckZuO1xuICBzd2l0Y2gob2lkKSB7XG4gICAgY2FzZSBwa2kub2lkc1sncGJlV2l0aFNIQUFuZDMtS2V5VHJpcGxlREVTLUNCQyddOlxuICAgICAgZGtMZW4gPSAyNDtcbiAgICAgIGRJdkxlbiA9IDg7XG4gICAgICBjaXBoZXJGbiA9IGZvcmdlLmRlcy5zdGFydERlY3J5cHRpbmc7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgcGtpLm9pZHNbJ3BiZXdpdGhTSEFBbmQ0MEJpdFJDMi1DQkMnXTpcbiAgICAgIGRrTGVuID0gNTtcbiAgICAgIGRJdkxlbiA9IDg7XG4gICAgICBjaXBoZXJGbiA9IGZ1bmN0aW9uKGtleSwgaXYpIHtcbiAgICAgICAgdmFyIGNpcGhlciA9IGZvcmdlLnJjMi5jcmVhdGVEZWNyeXB0aW9uQ2lwaGVyKGtleSwgNDApO1xuICAgICAgICBjaXBoZXIuc3RhcnQoaXYsIG51bGwpO1xuICAgICAgICByZXR1cm4gY2lwaGVyO1xuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHZhciBlcnJvciA9IG5ldyBFcnJvcignQ2Fubm90IHJlYWQgUEtDUyAjMTIgUEJFIGRhdGEgYmxvY2suIFVuc3VwcG9ydGVkIE9JRC4nKTtcbiAgICAgIGVycm9yLm9pZCA9IG9pZDtcbiAgICAgIHRocm93IGVycm9yO1xuICB9XG5cbiAgLy8gZ2V0IFBSRiBtZXNzYWdlIGRpZ2VzdFxuICB2YXIgbWQgPSBwcmZPaWRUb01lc3NhZ2VEaWdlc3QoY2FwdHVyZS5wcmZPaWQpO1xuICB2YXIga2V5ID0gcGtpLnBiZS5nZW5lcmF0ZVBrY3MxMktleShwYXNzd29yZCwgc2FsdCwgMSwgY291bnQsIGRrTGVuLCBtZCk7XG4gIG1kLnN0YXJ0KCk7XG4gIHZhciBpdiA9IHBraS5wYmUuZ2VuZXJhdGVQa2NzMTJLZXkocGFzc3dvcmQsIHNhbHQsIDIsIGNvdW50LCBkSXZMZW4sIG1kKTtcblxuICByZXR1cm4gY2lwaGVyRm4oa2V5LCBpdik7XG59O1xuXG4vKipcbiAqIE9wZW5TU0wncyBsZWdhY3kga2V5IGRlcml2YXRpb24gZnVuY3Rpb24uXG4gKlxuICogU2VlOiBodHRwOi8vd3d3Lm9wZW5zc2wub3JnL2RvY3MvY3J5cHRvL0VWUF9CeXRlc1RvS2V5Lmh0bWxcbiAqXG4gKiBAcGFyYW0gcGFzc3dvcmQgdGhlIHBhc3N3b3JkIHRvIGRlcml2ZSB0aGUga2V5IGZyb20uXG4gKiBAcGFyYW0gc2FsdCB0aGUgc2FsdCB0byB1c2UsIG51bGwgZm9yIG5vbmUuXG4gKiBAcGFyYW0gZGtMZW4gdGhlIG51bWJlciBvZiBieXRlcyBuZWVkZWQgZm9yIHRoZSBkZXJpdmVkIGtleS5cbiAqIEBwYXJhbSBbb3B0aW9uc10gdGhlIG9wdGlvbnMgdG8gdXNlOlxuICogICAgICAgICAgW21kXSBhbiBvcHRpb25hbCBtZXNzYWdlIGRpZ2VzdCBvYmplY3QgdG8gdXNlLlxuICovXG5wa2kucGJlLm9wZW5zc2xEZXJpdmVCeXRlcyA9IGZ1bmN0aW9uKHBhc3N3b3JkLCBzYWx0LCBka0xlbiwgbWQpIHtcbiAgaWYodHlwZW9mIG1kID09PSAndW5kZWZpbmVkJyB8fCBtZCA9PT0gbnVsbCkge1xuICAgIGlmKCEoJ21kNScgaW4gZm9yZ2UubWQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1wibWQ1XCIgaGFzaCBhbGdvcml0aG0gdW5hdmFpbGFibGUuJyk7XG4gICAgfVxuICAgIG1kID0gZm9yZ2UubWQubWQ1LmNyZWF0ZSgpO1xuICB9XG4gIGlmKHNhbHQgPT09IG51bGwpIHtcbiAgICBzYWx0ID0gJyc7XG4gIH1cbiAgdmFyIGRpZ2VzdHMgPSBbaGFzaChtZCwgcGFzc3dvcmQgKyBzYWx0KV07XG4gIGZvcih2YXIgbGVuZ3RoID0gMTYsIGkgPSAxOyBsZW5ndGggPCBka0xlbjsgKytpLCBsZW5ndGggKz0gMTYpIHtcbiAgICBkaWdlc3RzLnB1c2goaGFzaChtZCwgZGlnZXN0c1tpIC0gMV0gKyBwYXNzd29yZCArIHNhbHQpKTtcbiAgfVxuICByZXR1cm4gZGlnZXN0cy5qb2luKCcnKS5zdWJzdHIoMCwgZGtMZW4pO1xufTtcblxuZnVuY3Rpb24gaGFzaChtZCwgYnl0ZXMpIHtcbiAgcmV0dXJuIG1kLnN0YXJ0KCkudXBkYXRlKGJ5dGVzKS5kaWdlc3QoKS5nZXRCeXRlcygpO1xufVxuXG5mdW5jdGlvbiBwcmZPaWRUb01lc3NhZ2VEaWdlc3QocHJmT2lkKSB7XG4gIC8vIGdldCBQUkYgYWxnb3JpdGhtLCBkZWZhdWx0IHRvIFNIQS0xXG4gIHZhciBwcmZBbGdvcml0aG07XG4gIGlmKCFwcmZPaWQpIHtcbiAgICBwcmZBbGdvcml0aG0gPSAnaG1hY1dpdGhTSEExJztcbiAgfSBlbHNlIHtcbiAgICBwcmZBbGdvcml0aG0gPSBwa2kub2lkc1thc24xLmRlclRvT2lkKHByZk9pZCldO1xuICAgIGlmKCFwcmZBbGdvcml0aG0pIHtcbiAgICAgIHZhciBlcnJvciA9IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgUFJGIE9JRC4nKTtcbiAgICAgIGVycm9yLm9pZCA9IHByZk9pZDtcbiAgICAgIGVycm9yLnN1cHBvcnRlZCA9IFtcbiAgICAgICAgJ2htYWNXaXRoU0hBMScsICdobWFjV2l0aFNIQTIyNCcsICdobWFjV2l0aFNIQTI1NicsICdobWFjV2l0aFNIQTM4NCcsXG4gICAgICAgICdobWFjV2l0aFNIQTUxMiddO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG4gIHJldHVybiBwcmZBbGdvcml0aG1Ub01lc3NhZ2VEaWdlc3QocHJmQWxnb3JpdGhtKTtcbn1cblxuZnVuY3Rpb24gcHJmQWxnb3JpdGhtVG9NZXNzYWdlRGlnZXN0KHByZkFsZ29yaXRobSkge1xuICB2YXIgZmFjdG9yeSA9IGZvcmdlLm1kO1xuICBzd2l0Y2gocHJmQWxnb3JpdGhtKSB7XG4gIGNhc2UgJ2htYWNXaXRoU0hBMjI0JzpcbiAgICBmYWN0b3J5ID0gZm9yZ2UubWQuc2hhNTEyO1xuICBjYXNlICdobWFjV2l0aFNIQTEnOlxuICBjYXNlICdobWFjV2l0aFNIQTI1Nic6XG4gIGNhc2UgJ2htYWNXaXRoU0hBMzg0JzpcbiAgY2FzZSAnaG1hY1dpdGhTSEE1MTInOlxuICAgIHByZkFsZ29yaXRobSA9IHByZkFsZ29yaXRobS5zdWJzdHIoOCkudG9Mb3dlckNhc2UoKTtcbiAgICBicmVhaztcbiAgZGVmYXVsdDpcbiAgICB2YXIgZXJyb3IgPSBuZXcgRXJyb3IoJ1Vuc3VwcG9ydGVkIFBSRiBhbGdvcml0aG0uJyk7XG4gICAgZXJyb3IuYWxnb3JpdGhtID0gcHJmQWxnb3JpdGhtO1xuICAgIGVycm9yLnN1cHBvcnRlZCA9IFtcbiAgICAgICdobWFjV2l0aFNIQTEnLCAnaG1hY1dpdGhTSEEyMjQnLCAnaG1hY1dpdGhTSEEyNTYnLCAnaG1hY1dpdGhTSEEzODQnLFxuICAgICAgJ2htYWNXaXRoU0hBNTEyJ107XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbiAgaWYoIWZhY3RvcnkgfHwgIShwcmZBbGdvcml0aG0gaW4gZmFjdG9yeSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gaGFzaCBhbGdvcml0aG06ICcgKyBwcmZBbGdvcml0aG0pO1xuICB9XG4gIHJldHVybiBmYWN0b3J5W3ByZkFsZ29yaXRobV0uY3JlYXRlKCk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVBia2RmMlBhcmFtcyhzYWx0LCBjb3VudEJ5dGVzLCBka0xlbiwgcHJmQWxnb3JpdGhtKSB7XG4gIHZhciBwYXJhbXMgPSBhc24xLmNyZWF0ZShhc24xLkNsYXNzLlVOSVZFUlNBTCwgYXNuMS5UeXBlLlNFUVVFTkNFLCB0cnVlLCBbXG4gICAgLy8gc2FsdFxuICAgIGFzbjEuY3JlYXRlKFxuICAgICAgYXNuMS5DbGFzcy5VTklWRVJTQUwsIGFzbjEuVHlwZS5PQ1RFVFNUUklORywgZmFsc2UsIHNhbHQpLFxuICAgIC8vIGl0ZXJhdGlvbiBjb3VudFxuICAgIGFzbjEuY3JlYXRlKGFzbjEuQ2xhc3MuVU5JVkVSU0FMLCBhc24xLlR5cGUuSU5URUdFUiwgZmFsc2UsXG4gICAgICBjb3VudEJ5dGVzLmdldEJ5dGVzKCkpXG4gIF0pO1xuICAvLyB3aGVuIFBSRiBhbGdvcml0aG0gaXMgbm90IFNIQS0xIGRlZmF1bHQsIGFkZCBrZXkgbGVuZ3RoIGFuZCBQUkYgYWxnb3JpdGhtXG4gIGlmKHByZkFsZ29yaXRobSAhPT0gJ2htYWNXaXRoU0hBMScpIHtcbiAgICBwYXJhbXMudmFsdWUucHVzaChcbiAgICAgIC8vIGtleSBsZW5ndGhcbiAgICAgIGFzbjEuY3JlYXRlKGFzbjEuQ2xhc3MuVU5JVkVSU0FMLCBhc24xLlR5cGUuSU5URUdFUiwgZmFsc2UsXG4gICAgICAgIGZvcmdlLnV0aWwuaGV4VG9CeXRlcyhka0xlbi50b1N0cmluZygxNikpKSxcbiAgICAgIC8vIEFsZ29yaXRobUlkZW50aWZpZXJcbiAgICAgIGFzbjEuY3JlYXRlKGFzbjEuQ2xhc3MuVU5JVkVSU0FMLCBhc24xLlR5cGUuU0VRVUVOQ0UsIHRydWUsIFtcbiAgICAgICAgLy8gYWxnb3JpdGhtXG4gICAgICAgIGFzbjEuY3JlYXRlKGFzbjEuQ2xhc3MuVU5JVkVSU0FMLCBhc24xLlR5cGUuT0lELCBmYWxzZSxcbiAgICAgICAgICBhc24xLm9pZFRvRGVyKHBraS5vaWRzW3ByZkFsZ29yaXRobV0pLmdldEJ5dGVzKCkpLFxuICAgICAgICAvLyBwYXJhbWV0ZXJzIChudWxsKVxuICAgICAgICBhc24xLmNyZWF0ZShhc24xLkNsYXNzLlVOSVZFUlNBTCwgYXNuMS5UeXBlLk5VTEwsIGZhbHNlLCAnJylcbiAgICAgIF0pKTtcbiAgfVxuICByZXR1cm4gcGFyYW1zO1xufVxuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///81\n")},function(module,exports,__webpack_require__){eval("/**\n * Secure Hash Algorithm with 256-bit digest (SHA-256) implementation.\n *\n * See FIPS 180-2 for details.\n *\n * @author Dave Longley\n *\n * Copyright (c) 2010-2015 Digital Bazaar, Inc.\n */\nvar forge = __webpack_require__(4);\n__webpack_require__(17);\n__webpack_require__(7);\n\nvar sha256 = module.exports = forge.sha256 = forge.sha256 || {};\nforge.md.sha256 = forge.md.algorithms.sha256 = sha256;\n\n/**\n * Creates a SHA-256 message digest object.\n *\n * @return a message digest object.\n */\nsha256.create = function() {\n  // do initialization as necessary\n  if(!_initialized) {\n    _init();\n  }\n\n  // SHA-256 state contains eight 32-bit integers\n  var _state = null;\n\n  // input buffer\n  var _input = forge.util.createBuffer();\n\n  // used for word storage\n  var _w = new Array(64);\n\n  // message digest object\n  var md = {\n    algorithm: 'sha256',\n    blockLength: 64,\n    digestLength: 32,\n    // 56-bit length of message so far (does not including padding)\n    messageLength: 0,\n    // true message length\n    fullMessageLength: null,\n    // size of message length in bytes\n    messageLengthSize: 8\n  };\n\n  /**\n   * Starts the digest.\n   *\n   * @return this digest object.\n   */\n  md.start = function() {\n    // up to 56-bit message length for convenience\n    md.messageLength = 0;\n\n    // full message length (set md.messageLength64 for backwards-compatibility)\n    md.fullMessageLength = md.messageLength64 = [];\n    var int32s = md.messageLengthSize / 4;\n    for(var i = 0; i < int32s; ++i) {\n      md.fullMessageLength.push(0);\n    }\n    _input = forge.util.createBuffer();\n    _state = {\n      h0: 0x6A09E667,\n      h1: 0xBB67AE85,\n      h2: 0x3C6EF372,\n      h3: 0xA54FF53A,\n      h4: 0x510E527F,\n      h5: 0x9B05688C,\n      h6: 0x1F83D9AB,\n      h7: 0x5BE0CD19\n    };\n    return md;\n  };\n  // start digest automatically for first time\n  md.start();\n\n  /**\n   * Updates the digest with the given message input. The given input can\n   * treated as raw input (no encoding will be applied) or an encoding of\n   * 'utf8' maybe given to encode the input using UTF-8.\n   *\n   * @param msg the message input to update with.\n   * @param encoding the encoding to use (default: 'raw', other: 'utf8').\n   *\n   * @return this digest object.\n   */\n  md.update = function(msg, encoding) {\n    if(encoding === 'utf8') {\n      msg = forge.util.encodeUtf8(msg);\n    }\n\n    // update message length\n    var len = msg.length;\n    md.messageLength += len;\n    len = [(len / 0x100000000) >>> 0, len >>> 0];\n    for(var i = md.fullMessageLength.length - 1; i >= 0; --i) {\n      md.fullMessageLength[i] += len[1];\n      len[1] = len[0] + ((md.fullMessageLength[i] / 0x100000000) >>> 0);\n      md.fullMessageLength[i] = md.fullMessageLength[i] >>> 0;\n      len[0] = ((len[1] / 0x100000000) >>> 0);\n    }\n\n    // add bytes to input buffer\n    _input.putBytes(msg);\n\n    // process bytes\n    _update(_state, _w, _input);\n\n    // compact input buffer every 2K or if empty\n    if(_input.read > 2048 || _input.length() === 0) {\n      _input.compact();\n    }\n\n    return md;\n  };\n\n  /**\n   * Produces the digest.\n   *\n   * @return a byte buffer containing the digest value.\n   */\n  md.digest = function() {\n    /* Note: Here we copy the remaining bytes in the input buffer and\n    add the appropriate SHA-256 padding. Then we do the final update\n    on a copy of the state so that if the user wants to get\n    intermediate digests they can do so. */\n\n    /* Determine the number of bytes that must be added to the message\n    to ensure its length is congruent to 448 mod 512. In other words,\n    the data to be digested must be a multiple of 512 bits (or 128 bytes).\n    This data includes the message, some padding, and the length of the\n    message. Since the length of the message will be encoded as 8 bytes (64\n    bits), that means that the last segment of the data must have 56 bytes\n    (448 bits) of message and padding. Therefore, the length of the message\n    plus the padding must be congruent to 448 mod 512 because\n    512 - 128 = 448.\n\n    In order to fill up the message length it must be filled with\n    padding that begins with 1 bit followed by all 0 bits. Padding\n    must *always* be present, so if the message length is already\n    congruent to 448 mod 512, then 512 padding bits must be added. */\n\n    var finalBlock = forge.util.createBuffer();\n    finalBlock.putBytes(_input.bytes());\n\n    // compute remaining size to be digested (include message length size)\n    var remaining = (\n      md.fullMessageLength[md.fullMessageLength.length - 1] +\n      md.messageLengthSize);\n\n    // add padding for overflow blockSize - overflow\n    // _padding starts with 1 byte with first bit is set (byte value 128), then\n    // there may be up to (blockSize - 1) other pad bytes\n    var overflow = remaining & (md.blockLength - 1);\n    finalBlock.putBytes(_padding.substr(0, md.blockLength - overflow));\n\n    // serialize message length in bits in big-endian order; since length\n    // is stored in bytes we multiply by 8 and add carry from next int\n    var next, carry;\n    var bits = md.fullMessageLength[0] * 8;\n    for(var i = 0; i < md.fullMessageLength.length - 1; ++i) {\n      next = md.fullMessageLength[i + 1] * 8;\n      carry = (next / 0x100000000) >>> 0;\n      bits += carry;\n      finalBlock.putInt32(bits >>> 0);\n      bits = next >>> 0;\n    }\n    finalBlock.putInt32(bits);\n\n    var s2 = {\n      h0: _state.h0,\n      h1: _state.h1,\n      h2: _state.h2,\n      h3: _state.h3,\n      h4: _state.h4,\n      h5: _state.h5,\n      h6: _state.h6,\n      h7: _state.h7\n    };\n    _update(s2, _w, finalBlock);\n    var rval = forge.util.createBuffer();\n    rval.putInt32(s2.h0);\n    rval.putInt32(s2.h1);\n    rval.putInt32(s2.h2);\n    rval.putInt32(s2.h3);\n    rval.putInt32(s2.h4);\n    rval.putInt32(s2.h5);\n    rval.putInt32(s2.h6);\n    rval.putInt32(s2.h7);\n    return rval;\n  };\n\n  return md;\n};\n\n// sha-256 padding bytes not initialized yet\nvar _padding = null;\nvar _initialized = false;\n\n// table of constants\nvar _k = null;\n\n/**\n * Initializes the constant tables.\n */\nfunction _init() {\n  // create padding\n  _padding = String.fromCharCode(128);\n  _padding += forge.util.fillString(String.fromCharCode(0x00), 64);\n\n  // create K table for SHA-256\n  _k = [\n    0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5,\n    0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,\n    0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,\n    0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,\n    0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc,\n    0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,\n    0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7,\n    0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,\n    0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,\n    0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,\n    0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3,\n    0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,\n    0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5,\n    0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,\n    0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,\n    0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2];\n\n  // now initialized\n  _initialized = true;\n}\n\n/**\n * Updates a SHA-256 state with the given byte buffer.\n *\n * @param s the SHA-256 state to update.\n * @param w the array to use to store words.\n * @param bytes the byte buffer to update with.\n */\nfunction _update(s, w, bytes) {\n  // consume 512 bit (64 byte) chunks\n  var t1, t2, s0, s1, ch, maj, i, a, b, c, d, e, f, g, h;\n  var len = bytes.length();\n  while(len >= 64) {\n    // the w array will be populated with sixteen 32-bit big-endian words\n    // and then extended into 64 32-bit words according to SHA-256\n    for(i = 0; i < 16; ++i) {\n      w[i] = bytes.getInt32();\n    }\n    for(; i < 64; ++i) {\n      // XOR word 2 words ago rot right 17, rot right 19, shft right 10\n      t1 = w[i - 2];\n      t1 =\n        ((t1 >>> 17) | (t1 << 15)) ^\n        ((t1 >>> 19) | (t1 << 13)) ^\n        (t1 >>> 10);\n      // XOR word 15 words ago rot right 7, rot right 18, shft right 3\n      t2 = w[i - 15];\n      t2 =\n        ((t2 >>> 7) | (t2 << 25)) ^\n        ((t2 >>> 18) | (t2 << 14)) ^\n        (t2 >>> 3);\n      // sum(t1, word 7 ago, t2, word 16 ago) modulo 2^32\n      w[i] = (t1 + w[i - 7] + t2 + w[i - 16]) | 0;\n    }\n\n    // initialize hash value for this chunk\n    a = s.h0;\n    b = s.h1;\n    c = s.h2;\n    d = s.h3;\n    e = s.h4;\n    f = s.h5;\n    g = s.h6;\n    h = s.h7;\n\n    // round function\n    for(i = 0; i < 64; ++i) {\n      // Sum1(e)\n      s1 =\n        ((e >>> 6) | (e << 26)) ^\n        ((e >>> 11) | (e << 21)) ^\n        ((e >>> 25) | (e << 7));\n      // Ch(e, f, g) (optimized the same way as SHA-1)\n      ch = g ^ (e & (f ^ g));\n      // Sum0(a)\n      s0 =\n        ((a >>> 2) | (a << 30)) ^\n        ((a >>> 13) | (a << 19)) ^\n        ((a >>> 22) | (a << 10));\n      // Maj(a, b, c) (optimized the same way as SHA-1)\n      maj = (a & b) | (c & (a ^ b));\n\n      // main algorithm\n      t1 = h + s1 + ch + _k[i] + w[i];\n      t2 = s0 + maj;\n      h = g;\n      g = f;\n      f = e;\n      // `>>> 0` necessary to avoid iOS/Safari 10 optimization bug\n      // can't truncate with `| 0`\n      e = (d + t1) >>> 0;\n      d = c;\n      c = b;\n      b = a;\n      // `>>> 0` necessary to avoid iOS/Safari 10 optimization bug\n      // can't truncate with `| 0`\n      a = (t1 + t2) >>> 0;\n    }\n\n    // update hash state\n    s.h0 = (s.h0 + a) | 0;\n    s.h1 = (s.h1 + b) | 0;\n    s.h2 = (s.h2 + c) | 0;\n    s.h3 = (s.h3 + d) | 0;\n    s.h4 = (s.h4 + e) | 0;\n    s.h5 = (s.h5 + f) | 0;\n    s.h6 = (s.h6 + g) | 0;\n    s.h7 = (s.h7 + h) | 0;\n    len -= 64;\n  }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODIuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbm9kZS1mb3JnZS9saWIvc2hhMjU2LmpzP2E3N2YiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBTZWN1cmUgSGFzaCBBbGdvcml0aG0gd2l0aCAyNTYtYml0IGRpZ2VzdCAoU0hBLTI1NikgaW1wbGVtZW50YXRpb24uXG4gKlxuICogU2VlIEZJUFMgMTgwLTIgZm9yIGRldGFpbHMuXG4gKlxuICogQGF1dGhvciBEYXZlIExvbmdsZXlcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxNSBEaWdpdGFsIEJhemFhciwgSW5jLlxuICovXG52YXIgZm9yZ2UgPSByZXF1aXJlKCcuL2ZvcmdlJyk7XG5yZXF1aXJlKCcuL21kJyk7XG5yZXF1aXJlKCcuL3V0aWwnKTtcblxudmFyIHNoYTI1NiA9IG1vZHVsZS5leHBvcnRzID0gZm9yZ2Uuc2hhMjU2ID0gZm9yZ2Uuc2hhMjU2IHx8IHt9O1xuZm9yZ2UubWQuc2hhMjU2ID0gZm9yZ2UubWQuYWxnb3JpdGhtcy5zaGEyNTYgPSBzaGEyNTY7XG5cbi8qKlxuICogQ3JlYXRlcyBhIFNIQS0yNTYgbWVzc2FnZSBkaWdlc3Qgb2JqZWN0LlxuICpcbiAqIEByZXR1cm4gYSBtZXNzYWdlIGRpZ2VzdCBvYmplY3QuXG4gKi9cbnNoYTI1Ni5jcmVhdGUgPSBmdW5jdGlvbigpIHtcbiAgLy8gZG8gaW5pdGlhbGl6YXRpb24gYXMgbmVjZXNzYXJ5XG4gIGlmKCFfaW5pdGlhbGl6ZWQpIHtcbiAgICBfaW5pdCgpO1xuICB9XG5cbiAgLy8gU0hBLTI1NiBzdGF0ZSBjb250YWlucyBlaWdodCAzMi1iaXQgaW50ZWdlcnNcbiAgdmFyIF9zdGF0ZSA9IG51bGw7XG5cbiAgLy8gaW5wdXQgYnVmZmVyXG4gIHZhciBfaW5wdXQgPSBmb3JnZS51dGlsLmNyZWF0ZUJ1ZmZlcigpO1xuXG4gIC8vIHVzZWQgZm9yIHdvcmQgc3RvcmFnZVxuICB2YXIgX3cgPSBuZXcgQXJyYXkoNjQpO1xuXG4gIC8vIG1lc3NhZ2UgZGlnZXN0IG9iamVjdFxuICB2YXIgbWQgPSB7XG4gICAgYWxnb3JpdGhtOiAnc2hhMjU2JyxcbiAgICBibG9ja0xlbmd0aDogNjQsXG4gICAgZGlnZXN0TGVuZ3RoOiAzMixcbiAgICAvLyA1Ni1iaXQgbGVuZ3RoIG9mIG1lc3NhZ2Ugc28gZmFyIChkb2VzIG5vdCBpbmNsdWRpbmcgcGFkZGluZylcbiAgICBtZXNzYWdlTGVuZ3RoOiAwLFxuICAgIC8vIHRydWUgbWVzc2FnZSBsZW5ndGhcbiAgICBmdWxsTWVzc2FnZUxlbmd0aDogbnVsbCxcbiAgICAvLyBzaXplIG9mIG1lc3NhZ2UgbGVuZ3RoIGluIGJ5dGVzXG4gICAgbWVzc2FnZUxlbmd0aFNpemU6IDhcbiAgfTtcblxuICAvKipcbiAgICogU3RhcnRzIHRoZSBkaWdlc3QuXG4gICAqXG4gICAqIEByZXR1cm4gdGhpcyBkaWdlc3Qgb2JqZWN0LlxuICAgKi9cbiAgbWQuc3RhcnQgPSBmdW5jdGlvbigpIHtcbiAgICAvLyB1cCB0byA1Ni1iaXQgbWVzc2FnZSBsZW5ndGggZm9yIGNvbnZlbmllbmNlXG4gICAgbWQubWVzc2FnZUxlbmd0aCA9IDA7XG5cbiAgICAvLyBmdWxsIG1lc3NhZ2UgbGVuZ3RoIChzZXQgbWQubWVzc2FnZUxlbmd0aDY0IGZvciBiYWNrd2FyZHMtY29tcGF0aWJpbGl0eSlcbiAgICBtZC5mdWxsTWVzc2FnZUxlbmd0aCA9IG1kLm1lc3NhZ2VMZW5ndGg2NCA9IFtdO1xuICAgIHZhciBpbnQzMnMgPSBtZC5tZXNzYWdlTGVuZ3RoU2l6ZSAvIDQ7XG4gICAgZm9yKHZhciBpID0gMDsgaSA8IGludDMyczsgKytpKSB7XG4gICAgICBtZC5mdWxsTWVzc2FnZUxlbmd0aC5wdXNoKDApO1xuICAgIH1cbiAgICBfaW5wdXQgPSBmb3JnZS51dGlsLmNyZWF0ZUJ1ZmZlcigpO1xuICAgIF9zdGF0ZSA9IHtcbiAgICAgIGgwOiAweDZBMDlFNjY3LFxuICAgICAgaDE6IDB4QkI2N0FFODUsXG4gICAgICBoMjogMHgzQzZFRjM3MixcbiAgICAgIGgzOiAweEE1NEZGNTNBLFxuICAgICAgaDQ6IDB4NTEwRTUyN0YsXG4gICAgICBoNTogMHg5QjA1Njg4QyxcbiAgICAgIGg2OiAweDFGODNEOUFCLFxuICAgICAgaDc6IDB4NUJFMENEMTlcbiAgICB9O1xuICAgIHJldHVybiBtZDtcbiAgfTtcbiAgLy8gc3RhcnQgZGlnZXN0IGF1dG9tYXRpY2FsbHkgZm9yIGZpcnN0IHRpbWVcbiAgbWQuc3RhcnQoKTtcblxuICAvKipcbiAgICogVXBkYXRlcyB0aGUgZGlnZXN0IHdpdGggdGhlIGdpdmVuIG1lc3NhZ2UgaW5wdXQuIFRoZSBnaXZlbiBpbnB1dCBjYW5cbiAgICogdHJlYXRlZCBhcyByYXcgaW5wdXQgKG5vIGVuY29kaW5nIHdpbGwgYmUgYXBwbGllZCkgb3IgYW4gZW5jb2Rpbmcgb2ZcbiAgICogJ3V0ZjgnIG1heWJlIGdpdmVuIHRvIGVuY29kZSB0aGUgaW5wdXQgdXNpbmcgVVRGLTguXG4gICAqXG4gICAqIEBwYXJhbSBtc2cgdGhlIG1lc3NhZ2UgaW5wdXQgdG8gdXBkYXRlIHdpdGguXG4gICAqIEBwYXJhbSBlbmNvZGluZyB0aGUgZW5jb2RpbmcgdG8gdXNlIChkZWZhdWx0OiAncmF3Jywgb3RoZXI6ICd1dGY4JykuXG4gICAqXG4gICAqIEByZXR1cm4gdGhpcyBkaWdlc3Qgb2JqZWN0LlxuICAgKi9cbiAgbWQudXBkYXRlID0gZnVuY3Rpb24obXNnLCBlbmNvZGluZykge1xuICAgIGlmKGVuY29kaW5nID09PSAndXRmOCcpIHtcbiAgICAgIG1zZyA9IGZvcmdlLnV0aWwuZW5jb2RlVXRmOChtc2cpO1xuICAgIH1cblxuICAgIC8vIHVwZGF0ZSBtZXNzYWdlIGxlbmd0aFxuICAgIHZhciBsZW4gPSBtc2cubGVuZ3RoO1xuICAgIG1kLm1lc3NhZ2VMZW5ndGggKz0gbGVuO1xuICAgIGxlbiA9IFsobGVuIC8gMHgxMDAwMDAwMDApID4+PiAwLCBsZW4gPj4+IDBdO1xuICAgIGZvcih2YXIgaSA9IG1kLmZ1bGxNZXNzYWdlTGVuZ3RoLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICBtZC5mdWxsTWVzc2FnZUxlbmd0aFtpXSArPSBsZW5bMV07XG4gICAgICBsZW5bMV0gPSBsZW5bMF0gKyAoKG1kLmZ1bGxNZXNzYWdlTGVuZ3RoW2ldIC8gMHgxMDAwMDAwMDApID4+PiAwKTtcbiAgICAgIG1kLmZ1bGxNZXNzYWdlTGVuZ3RoW2ldID0gbWQuZnVsbE1lc3NhZ2VMZW5ndGhbaV0gPj4+IDA7XG4gICAgICBsZW5bMF0gPSAoKGxlblsxXSAvIDB4MTAwMDAwMDAwKSA+Pj4gMCk7XG4gICAgfVxuXG4gICAgLy8gYWRkIGJ5dGVzIHRvIGlucHV0IGJ1ZmZlclxuICAgIF9pbnB1dC5wdXRCeXRlcyhtc2cpO1xuXG4gICAgLy8gcHJvY2VzcyBieXRlc1xuICAgIF91cGRhdGUoX3N0YXRlLCBfdywgX2lucHV0KTtcblxuICAgIC8vIGNvbXBhY3QgaW5wdXQgYnVmZmVyIGV2ZXJ5IDJLIG9yIGlmIGVtcHR5XG4gICAgaWYoX2lucHV0LnJlYWQgPiAyMDQ4IHx8IF9pbnB1dC5sZW5ndGgoKSA9PT0gMCkge1xuICAgICAgX2lucHV0LmNvbXBhY3QoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbWQ7XG4gIH07XG5cbiAgLyoqXG4gICAqIFByb2R1Y2VzIHRoZSBkaWdlc3QuXG4gICAqXG4gICAqIEByZXR1cm4gYSBieXRlIGJ1ZmZlciBjb250YWluaW5nIHRoZSBkaWdlc3QgdmFsdWUuXG4gICAqL1xuICBtZC5kaWdlc3QgPSBmdW5jdGlvbigpIHtcbiAgICAvKiBOb3RlOiBIZXJlIHdlIGNvcHkgdGhlIHJlbWFpbmluZyBieXRlcyBpbiB0aGUgaW5wdXQgYnVmZmVyIGFuZFxuICAgIGFkZCB0aGUgYXBwcm9wcmlhdGUgU0hBLTI1NiBwYWRkaW5nLiBUaGVuIHdlIGRvIHRoZSBmaW5hbCB1cGRhdGVcbiAgICBvbiBhIGNvcHkgb2YgdGhlIHN0YXRlIHNvIHRoYXQgaWYgdGhlIHVzZXIgd2FudHMgdG8gZ2V0XG4gICAgaW50ZXJtZWRpYXRlIGRpZ2VzdHMgdGhleSBjYW4gZG8gc28uICovXG5cbiAgICAvKiBEZXRlcm1pbmUgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IG11c3QgYmUgYWRkZWQgdG8gdGhlIG1lc3NhZ2VcbiAgICB0byBlbnN1cmUgaXRzIGxlbmd0aCBpcyBjb25ncnVlbnQgdG8gNDQ4IG1vZCA1MTIuIEluIG90aGVyIHdvcmRzLFxuICAgIHRoZSBkYXRhIHRvIGJlIGRpZ2VzdGVkIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA1MTIgYml0cyAob3IgMTI4IGJ5dGVzKS5cbiAgICBUaGlzIGRhdGEgaW5jbHVkZXMgdGhlIG1lc3NhZ2UsIHNvbWUgcGFkZGluZywgYW5kIHRoZSBsZW5ndGggb2YgdGhlXG4gICAgbWVzc2FnZS4gU2luY2UgdGhlIGxlbmd0aCBvZiB0aGUgbWVzc2FnZSB3aWxsIGJlIGVuY29kZWQgYXMgOCBieXRlcyAoNjRcbiAgICBiaXRzKSwgdGhhdCBtZWFucyB0aGF0IHRoZSBsYXN0IHNlZ21lbnQgb2YgdGhlIGRhdGEgbXVzdCBoYXZlIDU2IGJ5dGVzXG4gICAgKDQ0OCBiaXRzKSBvZiBtZXNzYWdlIGFuZCBwYWRkaW5nLiBUaGVyZWZvcmUsIHRoZSBsZW5ndGggb2YgdGhlIG1lc3NhZ2VcbiAgICBwbHVzIHRoZSBwYWRkaW5nIG11c3QgYmUgY29uZ3J1ZW50IHRvIDQ0OCBtb2QgNTEyIGJlY2F1c2VcbiAgICA1MTIgLSAxMjggPSA0NDguXG5cbiAgICBJbiBvcmRlciB0byBmaWxsIHVwIHRoZSBtZXNzYWdlIGxlbmd0aCBpdCBtdXN0IGJlIGZpbGxlZCB3aXRoXG4gICAgcGFkZGluZyB0aGF0IGJlZ2lucyB3aXRoIDEgYml0IGZvbGxvd2VkIGJ5IGFsbCAwIGJpdHMuIFBhZGRpbmdcbiAgICBtdXN0ICphbHdheXMqIGJlIHByZXNlbnQsIHNvIGlmIHRoZSBtZXNzYWdlIGxlbmd0aCBpcyBhbHJlYWR5XG4gICAgY29uZ3J1ZW50IHRvIDQ0OCBtb2QgNTEyLCB0aGVuIDUxMiBwYWRkaW5nIGJpdHMgbXVzdCBiZSBhZGRlZC4gKi9cblxuICAgIHZhciBmaW5hbEJsb2NrID0gZm9yZ2UudXRpbC5jcmVhdGVCdWZmZXIoKTtcbiAgICBmaW5hbEJsb2NrLnB1dEJ5dGVzKF9pbnB1dC5ieXRlcygpKTtcblxuICAgIC8vIGNvbXB1dGUgcmVtYWluaW5nIHNpemUgdG8gYmUgZGlnZXN0ZWQgKGluY2x1ZGUgbWVzc2FnZSBsZW5ndGggc2l6ZSlcbiAgICB2YXIgcmVtYWluaW5nID0gKFxuICAgICAgbWQuZnVsbE1lc3NhZ2VMZW5ndGhbbWQuZnVsbE1lc3NhZ2VMZW5ndGgubGVuZ3RoIC0gMV0gK1xuICAgICAgbWQubWVzc2FnZUxlbmd0aFNpemUpO1xuXG4gICAgLy8gYWRkIHBhZGRpbmcgZm9yIG92ZXJmbG93IGJsb2NrU2l6ZSAtIG92ZXJmbG93XG4gICAgLy8gX3BhZGRpbmcgc3RhcnRzIHdpdGggMSBieXRlIHdpdGggZmlyc3QgYml0IGlzIHNldCAoYnl0ZSB2YWx1ZSAxMjgpLCB0aGVuXG4gICAgLy8gdGhlcmUgbWF5IGJlIHVwIHRvIChibG9ja1NpemUgLSAxKSBvdGhlciBwYWQgYnl0ZXNcbiAgICB2YXIgb3ZlcmZsb3cgPSByZW1haW5pbmcgJiAobWQuYmxvY2tMZW5ndGggLSAxKTtcbiAgICBmaW5hbEJsb2NrLnB1dEJ5dGVzKF9wYWRkaW5nLnN1YnN0cigwLCBtZC5ibG9ja0xlbmd0aCAtIG92ZXJmbG93KSk7XG5cbiAgICAvLyBzZXJpYWxpemUgbWVzc2FnZSBsZW5ndGggaW4gYml0cyBpbiBiaWctZW5kaWFuIG9yZGVyOyBzaW5jZSBsZW5ndGhcbiAgICAvLyBpcyBzdG9yZWQgaW4gYnl0ZXMgd2UgbXVsdGlwbHkgYnkgOCBhbmQgYWRkIGNhcnJ5IGZyb20gbmV4dCBpbnRcbiAgICB2YXIgbmV4dCwgY2Fycnk7XG4gICAgdmFyIGJpdHMgPSBtZC5mdWxsTWVzc2FnZUxlbmd0aFswXSAqIDg7XG4gICAgZm9yKHZhciBpID0gMDsgaSA8IG1kLmZ1bGxNZXNzYWdlTGVuZ3RoLmxlbmd0aCAtIDE7ICsraSkge1xuICAgICAgbmV4dCA9IG1kLmZ1bGxNZXNzYWdlTGVuZ3RoW2kgKyAxXSAqIDg7XG4gICAgICBjYXJyeSA9IChuZXh0IC8gMHgxMDAwMDAwMDApID4+PiAwO1xuICAgICAgYml0cyArPSBjYXJyeTtcbiAgICAgIGZpbmFsQmxvY2sucHV0SW50MzIoYml0cyA+Pj4gMCk7XG4gICAgICBiaXRzID0gbmV4dCA+Pj4gMDtcbiAgICB9XG4gICAgZmluYWxCbG9jay5wdXRJbnQzMihiaXRzKTtcblxuICAgIHZhciBzMiA9IHtcbiAgICAgIGgwOiBfc3RhdGUuaDAsXG4gICAgICBoMTogX3N0YXRlLmgxLFxuICAgICAgaDI6IF9zdGF0ZS5oMixcbiAgICAgIGgzOiBfc3RhdGUuaDMsXG4gICAgICBoNDogX3N0YXRlLmg0LFxuICAgICAgaDU6IF9zdGF0ZS5oNSxcbiAgICAgIGg2OiBfc3RhdGUuaDYsXG4gICAgICBoNzogX3N0YXRlLmg3XG4gICAgfTtcbiAgICBfdXBkYXRlKHMyLCBfdywgZmluYWxCbG9jayk7XG4gICAgdmFyIHJ2YWwgPSBmb3JnZS51dGlsLmNyZWF0ZUJ1ZmZlcigpO1xuICAgIHJ2YWwucHV0SW50MzIoczIuaDApO1xuICAgIHJ2YWwucHV0SW50MzIoczIuaDEpO1xuICAgIHJ2YWwucHV0SW50MzIoczIuaDIpO1xuICAgIHJ2YWwucHV0SW50MzIoczIuaDMpO1xuICAgIHJ2YWwucHV0SW50MzIoczIuaDQpO1xuICAgIHJ2YWwucHV0SW50MzIoczIuaDUpO1xuICAgIHJ2YWwucHV0SW50MzIoczIuaDYpO1xuICAgIHJ2YWwucHV0SW50MzIoczIuaDcpO1xuICAgIHJldHVybiBydmFsO1xuICB9O1xuXG4gIHJldHVybiBtZDtcbn07XG5cbi8vIHNoYS0yNTYgcGFkZGluZyBieXRlcyBub3QgaW5pdGlhbGl6ZWQgeWV0XG52YXIgX3BhZGRpbmcgPSBudWxsO1xudmFyIF9pbml0aWFsaXplZCA9IGZhbHNlO1xuXG4vLyB0YWJsZSBvZiBjb25zdGFudHNcbnZhciBfayA9IG51bGw7XG5cbi8qKlxuICogSW5pdGlhbGl6ZXMgdGhlIGNvbnN0YW50IHRhYmxlcy5cbiAqL1xuZnVuY3Rpb24gX2luaXQoKSB7XG4gIC8vIGNyZWF0ZSBwYWRkaW5nXG4gIF9wYWRkaW5nID0gU3RyaW5nLmZyb21DaGFyQ29kZSgxMjgpO1xuICBfcGFkZGluZyArPSBmb3JnZS51dGlsLmZpbGxTdHJpbmcoU3RyaW5nLmZyb21DaGFyQ29kZSgweDAwKSwgNjQpO1xuXG4gIC8vIGNyZWF0ZSBLIHRhYmxlIGZvciBTSEEtMjU2XG4gIF9rID0gW1xuICAgIDB4NDI4YTJmOTgsIDB4NzEzNzQ0OTEsIDB4YjVjMGZiY2YsIDB4ZTliNWRiYTUsXG4gICAgMHgzOTU2YzI1YiwgMHg1OWYxMTFmMSwgMHg5MjNmODJhNCwgMHhhYjFjNWVkNSxcbiAgICAweGQ4MDdhYTk4LCAweDEyODM1YjAxLCAweDI0MzE4NWJlLCAweDU1MGM3ZGMzLFxuICAgIDB4NzJiZTVkNzQsIDB4ODBkZWIxZmUsIDB4OWJkYzA2YTcsIDB4YzE5YmYxNzQsXG4gICAgMHhlNDliNjljMSwgMHhlZmJlNDc4NiwgMHgwZmMxOWRjNiwgMHgyNDBjYTFjYyxcbiAgICAweDJkZTkyYzZmLCAweDRhNzQ4NGFhLCAweDVjYjBhOWRjLCAweDc2Zjk4OGRhLFxuICAgIDB4OTgzZTUxNTIsIDB4YTgzMWM2NmQsIDB4YjAwMzI3YzgsIDB4YmY1OTdmYzcsXG4gICAgMHhjNmUwMGJmMywgMHhkNWE3OTE0NywgMHgwNmNhNjM1MSwgMHgxNDI5Mjk2NyxcbiAgICAweDI3YjcwYTg1LCAweDJlMWIyMTM4LCAweDRkMmM2ZGZjLCAweDUzMzgwZDEzLFxuICAgIDB4NjUwYTczNTQsIDB4NzY2YTBhYmIsIDB4ODFjMmM5MmUsIDB4OTI3MjJjODUsXG4gICAgMHhhMmJmZThhMSwgMHhhODFhNjY0YiwgMHhjMjRiOGI3MCwgMHhjNzZjNTFhMyxcbiAgICAweGQxOTJlODE5LCAweGQ2OTkwNjI0LCAweGY0MGUzNTg1LCAweDEwNmFhMDcwLFxuICAgIDB4MTlhNGMxMTYsIDB4MWUzNzZjMDgsIDB4Mjc0ODc3NGMsIDB4MzRiMGJjYjUsXG4gICAgMHgzOTFjMGNiMywgMHg0ZWQ4YWE0YSwgMHg1YjljY2E0ZiwgMHg2ODJlNmZmMyxcbiAgICAweDc0OGY4MmVlLCAweDc4YTU2MzZmLCAweDg0Yzg3ODE0LCAweDhjYzcwMjA4LFxuICAgIDB4OTBiZWZmZmEsIDB4YTQ1MDZjZWIsIDB4YmVmOWEzZjcsIDB4YzY3MTc4ZjJdO1xuXG4gIC8vIG5vdyBpbml0aWFsaXplZFxuICBfaW5pdGlhbGl6ZWQgPSB0cnVlO1xufVxuXG4vKipcbiAqIFVwZGF0ZXMgYSBTSEEtMjU2IHN0YXRlIHdpdGggdGhlIGdpdmVuIGJ5dGUgYnVmZmVyLlxuICpcbiAqIEBwYXJhbSBzIHRoZSBTSEEtMjU2IHN0YXRlIHRvIHVwZGF0ZS5cbiAqIEBwYXJhbSB3IHRoZSBhcnJheSB0byB1c2UgdG8gc3RvcmUgd29yZHMuXG4gKiBAcGFyYW0gYnl0ZXMgdGhlIGJ5dGUgYnVmZmVyIHRvIHVwZGF0ZSB3aXRoLlxuICovXG5mdW5jdGlvbiBfdXBkYXRlKHMsIHcsIGJ5dGVzKSB7XG4gIC8vIGNvbnN1bWUgNTEyIGJpdCAoNjQgYnl0ZSkgY2h1bmtzXG4gIHZhciB0MSwgdDIsIHMwLCBzMSwgY2gsIG1haiwgaSwgYSwgYiwgYywgZCwgZSwgZiwgZywgaDtcbiAgdmFyIGxlbiA9IGJ5dGVzLmxlbmd0aCgpO1xuICB3aGlsZShsZW4gPj0gNjQpIHtcbiAgICAvLyB0aGUgdyBhcnJheSB3aWxsIGJlIHBvcHVsYXRlZCB3aXRoIHNpeHRlZW4gMzItYml0IGJpZy1lbmRpYW4gd29yZHNcbiAgICAvLyBhbmQgdGhlbiBleHRlbmRlZCBpbnRvIDY0IDMyLWJpdCB3b3JkcyBhY2NvcmRpbmcgdG8gU0hBLTI1NlxuICAgIGZvcihpID0gMDsgaSA8IDE2OyArK2kpIHtcbiAgICAgIHdbaV0gPSBieXRlcy5nZXRJbnQzMigpO1xuICAgIH1cbiAgICBmb3IoOyBpIDwgNjQ7ICsraSkge1xuICAgICAgLy8gWE9SIHdvcmQgMiB3b3JkcyBhZ28gcm90IHJpZ2h0IDE3LCByb3QgcmlnaHQgMTksIHNoZnQgcmlnaHQgMTBcbiAgICAgIHQxID0gd1tpIC0gMl07XG4gICAgICB0MSA9XG4gICAgICAgICgodDEgPj4+IDE3KSB8ICh0MSA8PCAxNSkpIF5cbiAgICAgICAgKCh0MSA+Pj4gMTkpIHwgKHQxIDw8IDEzKSkgXlxuICAgICAgICAodDEgPj4+IDEwKTtcbiAgICAgIC8vIFhPUiB3b3JkIDE1IHdvcmRzIGFnbyByb3QgcmlnaHQgNywgcm90IHJpZ2h0IDE4LCBzaGZ0IHJpZ2h0IDNcbiAgICAgIHQyID0gd1tpIC0gMTVdO1xuICAgICAgdDIgPVxuICAgICAgICAoKHQyID4+PiA3KSB8ICh0MiA8PCAyNSkpIF5cbiAgICAgICAgKCh0MiA+Pj4gMTgpIHwgKHQyIDw8IDE0KSkgXlxuICAgICAgICAodDIgPj4+IDMpO1xuICAgICAgLy8gc3VtKHQxLCB3b3JkIDcgYWdvLCB0Miwgd29yZCAxNiBhZ28pIG1vZHVsbyAyXjMyXG4gICAgICB3W2ldID0gKHQxICsgd1tpIC0gN10gKyB0MiArIHdbaSAtIDE2XSkgfCAwO1xuICAgIH1cblxuICAgIC8vIGluaXRpYWxpemUgaGFzaCB2YWx1ZSBmb3IgdGhpcyBjaHVua1xuICAgIGEgPSBzLmgwO1xuICAgIGIgPSBzLmgxO1xuICAgIGMgPSBzLmgyO1xuICAgIGQgPSBzLmgzO1xuICAgIGUgPSBzLmg0O1xuICAgIGYgPSBzLmg1O1xuICAgIGcgPSBzLmg2O1xuICAgIGggPSBzLmg3O1xuXG4gICAgLy8gcm91bmQgZnVuY3Rpb25cbiAgICBmb3IoaSA9IDA7IGkgPCA2NDsgKytpKSB7XG4gICAgICAvLyBTdW0xKGUpXG4gICAgICBzMSA9XG4gICAgICAgICgoZSA+Pj4gNikgfCAoZSA8PCAyNikpIF5cbiAgICAgICAgKChlID4+PiAxMSkgfCAoZSA8PCAyMSkpIF5cbiAgICAgICAgKChlID4+PiAyNSkgfCAoZSA8PCA3KSk7XG4gICAgICAvLyBDaChlLCBmLCBnKSAob3B0aW1pemVkIHRoZSBzYW1lIHdheSBhcyBTSEEtMSlcbiAgICAgIGNoID0gZyBeIChlICYgKGYgXiBnKSk7XG4gICAgICAvLyBTdW0wKGEpXG4gICAgICBzMCA9XG4gICAgICAgICgoYSA+Pj4gMikgfCAoYSA8PCAzMCkpIF5cbiAgICAgICAgKChhID4+PiAxMykgfCAoYSA8PCAxOSkpIF5cbiAgICAgICAgKChhID4+PiAyMikgfCAoYSA8PCAxMCkpO1xuICAgICAgLy8gTWFqKGEsIGIsIGMpIChvcHRpbWl6ZWQgdGhlIHNhbWUgd2F5IGFzIFNIQS0xKVxuICAgICAgbWFqID0gKGEgJiBiKSB8IChjICYgKGEgXiBiKSk7XG5cbiAgICAgIC8vIG1haW4gYWxnb3JpdGhtXG4gICAgICB0MSA9IGggKyBzMSArIGNoICsgX2tbaV0gKyB3W2ldO1xuICAgICAgdDIgPSBzMCArIG1hajtcbiAgICAgIGggPSBnO1xuICAgICAgZyA9IGY7XG4gICAgICBmID0gZTtcbiAgICAgIC8vIGA+Pj4gMGAgbmVjZXNzYXJ5IHRvIGF2b2lkIGlPUy9TYWZhcmkgMTAgb3B0aW1pemF0aW9uIGJ1Z1xuICAgICAgLy8gY2FuJ3QgdHJ1bmNhdGUgd2l0aCBgfCAwYFxuICAgICAgZSA9IChkICsgdDEpID4+PiAwO1xuICAgICAgZCA9IGM7XG4gICAgICBjID0gYjtcbiAgICAgIGIgPSBhO1xuICAgICAgLy8gYD4+PiAwYCBuZWNlc3NhcnkgdG8gYXZvaWQgaU9TL1NhZmFyaSAxMCBvcHRpbWl6YXRpb24gYnVnXG4gICAgICAvLyBjYW4ndCB0cnVuY2F0ZSB3aXRoIGB8IDBgXG4gICAgICBhID0gKHQxICsgdDIpID4+PiAwO1xuICAgIH1cblxuICAgIC8vIHVwZGF0ZSBoYXNoIHN0YXRlXG4gICAgcy5oMCA9IChzLmgwICsgYSkgfCAwO1xuICAgIHMuaDEgPSAocy5oMSArIGIpIHwgMDtcbiAgICBzLmgyID0gKHMuaDIgKyBjKSB8IDA7XG4gICAgcy5oMyA9IChzLmgzICsgZCkgfCAwO1xuICAgIHMuaDQgPSAocy5oNCArIGUpIHwgMDtcbiAgICBzLmg1ID0gKHMuaDUgKyBmKSB8IDA7XG4gICAgcy5oNiA9IChzLmg2ICsgZykgfCAwO1xuICAgIHMuaDcgPSAocy5oNyArIGgpIHwgMDtcbiAgICBsZW4gLT0gNjQ7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///82\n")},function(module,exports,__webpack_require__){eval("/* WEBPACK VAR INJECTION */(function(process) {/**\n * A javascript implementation of a cryptographically-secure\n * Pseudo Random Number Generator (PRNG). The Fortuna algorithm is followed\n * here though the use of SHA-256 is not enforced; when generating an\n * a PRNG context, the hashing algorithm and block cipher used for\n * the generator are specified via a plugin.\n *\n * @author Dave Longley\n *\n * Copyright (c) 2010-2014 Digital Bazaar, Inc.\n */\nvar forge = __webpack_require__(4);\n__webpack_require__(7);\n\nvar _crypto = null;\nif(forge.util.isNodejs && !forge.options.usePureJavaScript &&\n  !process.versions['node-webkit']) {\n  _crypto = __webpack_require__(57);\n}\n\n/* PRNG API */\nvar prng = module.exports = forge.prng = forge.prng || {};\n\n/**\n * Creates a new PRNG context.\n *\n * A PRNG plugin must be passed in that will provide:\n *\n * 1. A function that initializes the key and seed of a PRNG context. It\n *   will be given a 16 byte key and a 16 byte seed. Any key expansion\n *   or transformation of the seed from a byte string into an array of\n *   integers (or similar) should be performed.\n * 2. The cryptographic function used by the generator. It takes a key and\n *   a seed.\n * 3. A seed increment function. It takes the seed and returns seed + 1.\n * 4. An api to create a message digest.\n *\n * For an example, see random.js.\n *\n * @param plugin the PRNG plugin to use.\n */\nprng.create = function(plugin) {\n  var ctx = {\n    plugin: plugin,\n    key: null,\n    seed: null,\n    time: null,\n    // number of reseeds so far\n    reseeds: 0,\n    // amount of data generated so far\n    generated: 0,\n    // no initial key bytes\n    keyBytes: ''\n  };\n\n  // create 32 entropy pools (each is a message digest)\n  var md = plugin.md;\n  var pools = new Array(32);\n  for(var i = 0; i < 32; ++i) {\n    pools[i] = md.create();\n  }\n  ctx.pools = pools;\n\n  // entropy pools are written to cyclically, starting at index 0\n  ctx.pool = 0;\n\n  /**\n   * Generates random bytes. The bytes may be generated synchronously or\n   * asynchronously. Web workers must use the asynchronous interface or\n   * else the behavior is undefined.\n   *\n   * @param count the number of random bytes to generate.\n   * @param [callback(err, bytes)] called once the operation completes.\n   *\n   * @return count random bytes as a string.\n   */\n  ctx.generate = function(count, callback) {\n    // do synchronously\n    if(!callback) {\n      return ctx.generateSync(count);\n    }\n\n    // simple generator using counter-based CBC\n    var cipher = ctx.plugin.cipher;\n    var increment = ctx.plugin.increment;\n    var formatKey = ctx.plugin.formatKey;\n    var formatSeed = ctx.plugin.formatSeed;\n    var b = forge.util.createBuffer();\n\n    // paranoid deviation from Fortuna:\n    // reset key for every request to protect previously\n    // generated random bytes should the key be discovered;\n    // there is no 100ms based reseeding because of this\n    // forced reseed for every `generate` call\n    ctx.key = null;\n\n    generate();\n\n    function generate(err) {\n      if(err) {\n        return callback(err);\n      }\n\n      // sufficient bytes generated\n      if(b.length() >= count) {\n        return callback(null, b.getBytes(count));\n      }\n\n      // if amount of data generated is greater than 1 MiB, trigger reseed\n      if(ctx.generated > 0xfffff) {\n        ctx.key = null;\n      }\n\n      if(ctx.key === null) {\n        // prevent stack overflow\n        return forge.util.nextTick(function() {\n          _reseed(generate);\n        });\n      }\n\n      // generate the random bytes\n      var bytes = cipher(ctx.key, ctx.seed);\n      ctx.generated += bytes.length;\n      b.putBytes(bytes);\n\n      // generate bytes for a new key and seed\n      ctx.key = formatKey(cipher(ctx.key, increment(ctx.seed)));\n      ctx.seed = formatSeed(cipher(ctx.key, ctx.seed));\n\n      forge.util.setImmediate(generate);\n    }\n  };\n\n  /**\n   * Generates random bytes synchronously.\n   *\n   * @param count the number of random bytes to generate.\n   *\n   * @return count random bytes as a string.\n   */\n  ctx.generateSync = function(count) {\n    // simple generator using counter-based CBC\n    var cipher = ctx.plugin.cipher;\n    var increment = ctx.plugin.increment;\n    var formatKey = ctx.plugin.formatKey;\n    var formatSeed = ctx.plugin.formatSeed;\n\n    // paranoid deviation from Fortuna:\n    // reset key for every request to protect previously\n    // generated random bytes should the key be discovered;\n    // there is no 100ms based reseeding because of this\n    // forced reseed for every `generateSync` call\n    ctx.key = null;\n\n    var b = forge.util.createBuffer();\n    while(b.length() < count) {\n      // if amount of data generated is greater than 1 MiB, trigger reseed\n      if(ctx.generated > 0xfffff) {\n        ctx.key = null;\n      }\n\n      if(ctx.key === null) {\n        _reseedSync();\n      }\n\n      // generate the random bytes\n      var bytes = cipher(ctx.key, ctx.seed);\n      ctx.generated += bytes.length;\n      b.putBytes(bytes);\n\n      // generate bytes for a new key and seed\n      ctx.key = formatKey(cipher(ctx.key, increment(ctx.seed)));\n      ctx.seed = formatSeed(cipher(ctx.key, ctx.seed));\n    }\n\n    return b.getBytes(count);\n  };\n\n  /**\n   * Private function that asynchronously reseeds a generator.\n   *\n   * @param callback(err) called once the operation completes.\n   */\n  function _reseed(callback) {\n    if(ctx.pools[0].messageLength >= 32) {\n      _seed();\n      return callback();\n    }\n    // not enough seed data...\n    var needed = (32 - ctx.pools[0].messageLength) << 5;\n    ctx.seedFile(needed, function(err, bytes) {\n      if(err) {\n        return callback(err);\n      }\n      ctx.collect(bytes);\n      _seed();\n      callback();\n    });\n  }\n\n  /**\n   * Private function that synchronously reseeds a generator.\n   */\n  function _reseedSync() {\n    if(ctx.pools[0].messageLength >= 32) {\n      return _seed();\n    }\n    // not enough seed data...\n    var needed = (32 - ctx.pools[0].messageLength) << 5;\n    ctx.collect(ctx.seedFileSync(needed));\n    _seed();\n  }\n\n  /**\n   * Private function that seeds a generator once enough bytes are available.\n   */\n  function _seed() {\n    // update reseed count\n    ctx.reseeds = (ctx.reseeds === 0xffffffff) ? 0 : ctx.reseeds + 1;\n\n    // goal is to update `key` via:\n    // key = hash(key + s)\n    //   where 's' is all collected entropy from selected pools, then...\n\n    // create a plugin-based message digest\n    var md = ctx.plugin.md.create();\n\n    // consume current key bytes\n    md.update(ctx.keyBytes);\n\n    // digest the entropy of pools whose index k meet the\n    // condition 'n mod 2^k == 0' where n is the number of reseeds\n    var _2powK = 1;\n    for(var k = 0; k < 32; ++k) {\n      if(ctx.reseeds % _2powK === 0) {\n        md.update(ctx.pools[k].digest().getBytes());\n        ctx.pools[k].start();\n      }\n      _2powK = _2powK << 1;\n    }\n\n    // get digest for key bytes\n    ctx.keyBytes = md.digest().getBytes();\n\n    // paranoid deviation from Fortuna:\n    // update `seed` via `seed = hash(key)`\n    // instead of initializing to zero once and only\n    // ever incrementing it\n    md.start();\n    md.update(ctx.keyBytes);\n    var seedBytes = md.digest().getBytes();\n\n    // update state\n    ctx.key = ctx.plugin.formatKey(ctx.keyBytes);\n    ctx.seed = ctx.plugin.formatSeed(seedBytes);\n    ctx.generated = 0;\n  }\n\n  /**\n   * The built-in default seedFile. This seedFile is used when entropy\n   * is needed immediately.\n   *\n   * @param needed the number of bytes that are needed.\n   *\n   * @return the random bytes.\n   */\n  function defaultSeedFile(needed) {\n    // use window.crypto.getRandomValues strong source of entropy if available\n    var getRandomValues = null;\n    var globalScope = forge.util.globalScope;\n    var _crypto = globalScope.crypto || globalScope.msCrypto;\n    if(_crypto && _crypto.getRandomValues) {\n      getRandomValues = function(arr) {\n        return _crypto.getRandomValues(arr);\n      };\n    }\n\n    var b = forge.util.createBuffer();\n    if(getRandomValues) {\n      while(b.length() < needed) {\n        // max byte length is 65536 before QuotaExceededError is thrown\n        // http://www.w3.org/TR/WebCryptoAPI/#RandomSource-method-getRandomValues\n        var count = Math.max(1, Math.min(needed - b.length(), 65536) / 4);\n        var entropy = new Uint32Array(Math.floor(count));\n        try {\n          getRandomValues(entropy);\n          for(var i = 0; i < entropy.length; ++i) {\n            b.putInt32(entropy[i]);\n          }\n        } catch(e) {\n          /* only ignore QuotaExceededError */\n          if(!(typeof QuotaExceededError !== 'undefined' &&\n            e instanceof QuotaExceededError)) {\n            throw e;\n          }\n        }\n      }\n    }\n\n    // be sad and add some weak random data\n    if(b.length() < needed) {\n      /* Draws from Park-Miller \"minimal standard\" 31 bit PRNG,\n      implemented with David G. Carta's optimization: with 32 bit math\n      and without division (Public Domain). */\n      var hi, lo, next;\n      var seed = Math.floor(Math.random() * 0x010000);\n      while(b.length() < needed) {\n        lo = 16807 * (seed & 0xFFFF);\n        hi = 16807 * (seed >> 16);\n        lo += (hi & 0x7FFF) << 16;\n        lo += hi >> 15;\n        lo = (lo & 0x7FFFFFFF) + (lo >> 31);\n        seed = lo & 0xFFFFFFFF;\n\n        // consume lower 3 bytes of seed\n        for(var i = 0; i < 3; ++i) {\n          // throw in more pseudo random\n          next = seed >>> (i << 3);\n          next ^= Math.floor(Math.random() * 0x0100);\n          b.putByte(next & 0xFF);\n        }\n      }\n    }\n\n    return b.getBytes(needed);\n  }\n  // initialize seed file APIs\n  if(_crypto) {\n    // use nodejs async API\n    ctx.seedFile = function(needed, callback) {\n      _crypto.randomBytes(needed, function(err, bytes) {\n        if(err) {\n          return callback(err);\n        }\n        callback(null, bytes.toString());\n      });\n    };\n    // use nodejs sync API\n    ctx.seedFileSync = function(needed) {\n      return _crypto.randomBytes(needed).toString();\n    };\n  } else {\n    ctx.seedFile = function(needed, callback) {\n      try {\n        callback(null, defaultSeedFile(needed));\n      } catch(e) {\n        callback(e);\n      }\n    };\n    ctx.seedFileSync = defaultSeedFile;\n  }\n\n  /**\n   * Adds entropy to a prng ctx's accumulator.\n   *\n   * @param bytes the bytes of entropy as a string.\n   */\n  ctx.collect = function(bytes) {\n    // iterate over pools distributing entropy cyclically\n    var count = bytes.length;\n    for(var i = 0; i < count; ++i) {\n      ctx.pools[ctx.pool].update(bytes.substr(i, 1));\n      ctx.pool = (ctx.pool === 31) ? 0 : ctx.pool + 1;\n    }\n  };\n\n  /**\n   * Collects an integer of n bits.\n   *\n   * @param i the integer entropy.\n   * @param n the number of bits in the integer.\n   */\n  ctx.collectInt = function(i, n) {\n    var bytes = '';\n    for(var x = 0; x < n; x += 8) {\n      bytes += String.fromCharCode((i >> x) & 0xFF);\n    }\n    ctx.collect(bytes);\n  };\n\n  /**\n   * Registers a Web Worker to receive immediate entropy from the main thread.\n   * This method is required until Web Workers can access the native crypto\n   * API. This method should be called twice for each created worker, once in\n   * the main thread, and once in the worker itself.\n   *\n   * @param worker the worker to register.\n   */\n  ctx.registerWorker = function(worker) {\n    // worker receives random bytes\n    if(worker === self) {\n      ctx.seedFile = function(needed, callback) {\n        function listener(e) {\n          var data = e.data;\n          if(data.forge && data.forge.prng) {\n            self.removeEventListener('message', listener);\n            callback(data.forge.prng.err, data.forge.prng.bytes);\n          }\n        }\n        self.addEventListener('message', listener);\n        self.postMessage({forge: {prng: {needed: needed}}});\n      };\n    } else {\n      // main thread sends random bytes upon request\n      var listener = function(e) {\n        var data = e.data;\n        if(data.forge && data.forge.prng) {\n          ctx.seedFile(data.forge.prng.needed, function(err, bytes) {\n            worker.postMessage({forge: {prng: {err: err, bytes: bytes}}});\n          });\n        }\n      };\n      // TODO: do we need to remove the event listener when the worker dies?\n      worker.addEventListener('message', listener);\n    }\n  };\n\n  return ctx;\n};\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(16)))//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbm9kZS1mb3JnZS9saWIvcHJuZy5qcz8wY2I3Il0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQSBqYXZhc2NyaXB0IGltcGxlbWVudGF0aW9uIG9mIGEgY3J5cHRvZ3JhcGhpY2FsbHktc2VjdXJlXG4gKiBQc2V1ZG8gUmFuZG9tIE51bWJlciBHZW5lcmF0b3IgKFBSTkcpLiBUaGUgRm9ydHVuYSBhbGdvcml0aG0gaXMgZm9sbG93ZWRcbiAqIGhlcmUgdGhvdWdoIHRoZSB1c2Ugb2YgU0hBLTI1NiBpcyBub3QgZW5mb3JjZWQ7IHdoZW4gZ2VuZXJhdGluZyBhblxuICogYSBQUk5HIGNvbnRleHQsIHRoZSBoYXNoaW5nIGFsZ29yaXRobSBhbmQgYmxvY2sgY2lwaGVyIHVzZWQgZm9yXG4gKiB0aGUgZ2VuZXJhdG9yIGFyZSBzcGVjaWZpZWQgdmlhIGEgcGx1Z2luLlxuICpcbiAqIEBhdXRob3IgRGF2ZSBMb25nbGV5XG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTQgRGlnaXRhbCBCYXphYXIsIEluYy5cbiAqL1xudmFyIGZvcmdlID0gcmVxdWlyZSgnLi9mb3JnZScpO1xucmVxdWlyZSgnLi91dGlsJyk7XG5cbnZhciBfY3J5cHRvID0gbnVsbDtcbmlmKGZvcmdlLnV0aWwuaXNOb2RlanMgJiYgIWZvcmdlLm9wdGlvbnMudXNlUHVyZUphdmFTY3JpcHQgJiZcbiAgIXByb2Nlc3MudmVyc2lvbnNbJ25vZGUtd2Via2l0J10pIHtcbiAgX2NyeXB0byA9IHJlcXVpcmUoJ2NyeXB0bycpO1xufVxuXG4vKiBQUk5HIEFQSSAqL1xudmFyIHBybmcgPSBtb2R1bGUuZXhwb3J0cyA9IGZvcmdlLnBybmcgPSBmb3JnZS5wcm5nIHx8IHt9O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgUFJORyBjb250ZXh0LlxuICpcbiAqIEEgUFJORyBwbHVnaW4gbXVzdCBiZSBwYXNzZWQgaW4gdGhhdCB3aWxsIHByb3ZpZGU6XG4gKlxuICogMS4gQSBmdW5jdGlvbiB0aGF0IGluaXRpYWxpemVzIHRoZSBrZXkgYW5kIHNlZWQgb2YgYSBQUk5HIGNvbnRleHQuIEl0XG4gKiAgIHdpbGwgYmUgZ2l2ZW4gYSAxNiBieXRlIGtleSBhbmQgYSAxNiBieXRlIHNlZWQuIEFueSBrZXkgZXhwYW5zaW9uXG4gKiAgIG9yIHRyYW5zZm9ybWF0aW9uIG9mIHRoZSBzZWVkIGZyb20gYSBieXRlIHN0cmluZyBpbnRvIGFuIGFycmF5IG9mXG4gKiAgIGludGVnZXJzIChvciBzaW1pbGFyKSBzaG91bGQgYmUgcGVyZm9ybWVkLlxuICogMi4gVGhlIGNyeXB0b2dyYXBoaWMgZnVuY3Rpb24gdXNlZCBieSB0aGUgZ2VuZXJhdG9yLiBJdCB0YWtlcyBhIGtleSBhbmRcbiAqICAgYSBzZWVkLlxuICogMy4gQSBzZWVkIGluY3JlbWVudCBmdW5jdGlvbi4gSXQgdGFrZXMgdGhlIHNlZWQgYW5kIHJldHVybnMgc2VlZCArIDEuXG4gKiA0LiBBbiBhcGkgdG8gY3JlYXRlIGEgbWVzc2FnZSBkaWdlc3QuXG4gKlxuICogRm9yIGFuIGV4YW1wbGUsIHNlZSByYW5kb20uanMuXG4gKlxuICogQHBhcmFtIHBsdWdpbiB0aGUgUFJORyBwbHVnaW4gdG8gdXNlLlxuICovXG5wcm5nLmNyZWF0ZSA9IGZ1bmN0aW9uKHBsdWdpbikge1xuICB2YXIgY3R4ID0ge1xuICAgIHBsdWdpbjogcGx1Z2luLFxuICAgIGtleTogbnVsbCxcbiAgICBzZWVkOiBudWxsLFxuICAgIHRpbWU6IG51bGwsXG4gICAgLy8gbnVtYmVyIG9mIHJlc2VlZHMgc28gZmFyXG4gICAgcmVzZWVkczogMCxcbiAgICAvLyBhbW91bnQgb2YgZGF0YSBnZW5lcmF0ZWQgc28gZmFyXG4gICAgZ2VuZXJhdGVkOiAwLFxuICAgIC8vIG5vIGluaXRpYWwga2V5IGJ5dGVzXG4gICAga2V5Qnl0ZXM6ICcnXG4gIH07XG5cbiAgLy8gY3JlYXRlIDMyIGVudHJvcHkgcG9vbHMgKGVhY2ggaXMgYSBtZXNzYWdlIGRpZ2VzdClcbiAgdmFyIG1kID0gcGx1Z2luLm1kO1xuICB2YXIgcG9vbHMgPSBuZXcgQXJyYXkoMzIpO1xuICBmb3IodmFyIGkgPSAwOyBpIDwgMzI7ICsraSkge1xuICAgIHBvb2xzW2ldID0gbWQuY3JlYXRlKCk7XG4gIH1cbiAgY3R4LnBvb2xzID0gcG9vbHM7XG5cbiAgLy8gZW50cm9weSBwb29scyBhcmUgd3JpdHRlbiB0byBjeWNsaWNhbGx5LCBzdGFydGluZyBhdCBpbmRleCAwXG4gIGN0eC5wb29sID0gMDtcblxuICAvKipcbiAgICogR2VuZXJhdGVzIHJhbmRvbSBieXRlcy4gVGhlIGJ5dGVzIG1heSBiZSBnZW5lcmF0ZWQgc3luY2hyb25vdXNseSBvclxuICAgKiBhc3luY2hyb25vdXNseS4gV2ViIHdvcmtlcnMgbXVzdCB1c2UgdGhlIGFzeW5jaHJvbm91cyBpbnRlcmZhY2Ugb3JcbiAgICogZWxzZSB0aGUgYmVoYXZpb3IgaXMgdW5kZWZpbmVkLlxuICAgKlxuICAgKiBAcGFyYW0gY291bnQgdGhlIG51bWJlciBvZiByYW5kb20gYnl0ZXMgdG8gZ2VuZXJhdGUuXG4gICAqIEBwYXJhbSBbY2FsbGJhY2soZXJyLCBieXRlcyldIGNhbGxlZCBvbmNlIHRoZSBvcGVyYXRpb24gY29tcGxldGVzLlxuICAgKlxuICAgKiBAcmV0dXJuIGNvdW50IHJhbmRvbSBieXRlcyBhcyBhIHN0cmluZy5cbiAgICovXG4gIGN0eC5nZW5lcmF0ZSA9IGZ1bmN0aW9uKGNvdW50LCBjYWxsYmFjaykge1xuICAgIC8vIGRvIHN5bmNocm9ub3VzbHlcbiAgICBpZighY2FsbGJhY2spIHtcbiAgICAgIHJldHVybiBjdHguZ2VuZXJhdGVTeW5jKGNvdW50KTtcbiAgICB9XG5cbiAgICAvLyBzaW1wbGUgZ2VuZXJhdG9yIHVzaW5nIGNvdW50ZXItYmFzZWQgQ0JDXG4gICAgdmFyIGNpcGhlciA9IGN0eC5wbHVnaW4uY2lwaGVyO1xuICAgIHZhciBpbmNyZW1lbnQgPSBjdHgucGx1Z2luLmluY3JlbWVudDtcbiAgICB2YXIgZm9ybWF0S2V5ID0gY3R4LnBsdWdpbi5mb3JtYXRLZXk7XG4gICAgdmFyIGZvcm1hdFNlZWQgPSBjdHgucGx1Z2luLmZvcm1hdFNlZWQ7XG4gICAgdmFyIGIgPSBmb3JnZS51dGlsLmNyZWF0ZUJ1ZmZlcigpO1xuXG4gICAgLy8gcGFyYW5vaWQgZGV2aWF0aW9uIGZyb20gRm9ydHVuYTpcbiAgICAvLyByZXNldCBrZXkgZm9yIGV2ZXJ5IHJlcXVlc3QgdG8gcHJvdGVjdCBwcmV2aW91c2x5XG4gICAgLy8gZ2VuZXJhdGVkIHJhbmRvbSBieXRlcyBzaG91bGQgdGhlIGtleSBiZSBkaXNjb3ZlcmVkO1xuICAgIC8vIHRoZXJlIGlzIG5vIDEwMG1zIGJhc2VkIHJlc2VlZGluZyBiZWNhdXNlIG9mIHRoaXNcbiAgICAvLyBmb3JjZWQgcmVzZWVkIGZvciBldmVyeSBgZ2VuZXJhdGVgIGNhbGxcbiAgICBjdHgua2V5ID0gbnVsbDtcblxuICAgIGdlbmVyYXRlKCk7XG5cbiAgICBmdW5jdGlvbiBnZW5lcmF0ZShlcnIpIHtcbiAgICAgIGlmKGVycikge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICAgIH1cblxuICAgICAgLy8gc3VmZmljaWVudCBieXRlcyBnZW5lcmF0ZWRcbiAgICAgIGlmKGIubGVuZ3RoKCkgPj0gY291bnQpIHtcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG51bGwsIGIuZ2V0Qnl0ZXMoY291bnQpKTtcbiAgICAgIH1cblxuICAgICAgLy8gaWYgYW1vdW50IG9mIGRhdGEgZ2VuZXJhdGVkIGlzIGdyZWF0ZXIgdGhhbiAxIE1pQiwgdHJpZ2dlciByZXNlZWRcbiAgICAgIGlmKGN0eC5nZW5lcmF0ZWQgPiAweGZmZmZmKSB7XG4gICAgICAgIGN0eC5rZXkgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICBpZihjdHgua2V5ID09PSBudWxsKSB7XG4gICAgICAgIC8vIHByZXZlbnQgc3RhY2sgb3ZlcmZsb3dcbiAgICAgICAgcmV0dXJuIGZvcmdlLnV0aWwubmV4dFRpY2soZnVuY3Rpb24oKSB7XG4gICAgICAgICAgX3Jlc2VlZChnZW5lcmF0ZSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyBnZW5lcmF0ZSB0aGUgcmFuZG9tIGJ5dGVzXG4gICAgICB2YXIgYnl0ZXMgPSBjaXBoZXIoY3R4LmtleSwgY3R4LnNlZWQpO1xuICAgICAgY3R4LmdlbmVyYXRlZCArPSBieXRlcy5sZW5ndGg7XG4gICAgICBiLnB1dEJ5dGVzKGJ5dGVzKTtcblxuICAgICAgLy8gZ2VuZXJhdGUgYnl0ZXMgZm9yIGEgbmV3IGtleSBhbmQgc2VlZFxuICAgICAgY3R4LmtleSA9IGZvcm1hdEtleShjaXBoZXIoY3R4LmtleSwgaW5jcmVtZW50KGN0eC5zZWVkKSkpO1xuICAgICAgY3R4LnNlZWQgPSBmb3JtYXRTZWVkKGNpcGhlcihjdHgua2V5LCBjdHguc2VlZCkpO1xuXG4gICAgICBmb3JnZS51dGlsLnNldEltbWVkaWF0ZShnZW5lcmF0ZSk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZXMgcmFuZG9tIGJ5dGVzIHN5bmNocm9ub3VzbHkuXG4gICAqXG4gICAqIEBwYXJhbSBjb3VudCB0aGUgbnVtYmVyIG9mIHJhbmRvbSBieXRlcyB0byBnZW5lcmF0ZS5cbiAgICpcbiAgICogQHJldHVybiBjb3VudCByYW5kb20gYnl0ZXMgYXMgYSBzdHJpbmcuXG4gICAqL1xuICBjdHguZ2VuZXJhdGVTeW5jID0gZnVuY3Rpb24oY291bnQpIHtcbiAgICAvLyBzaW1wbGUgZ2VuZXJhdG9yIHVzaW5nIGNvdW50ZXItYmFzZWQgQ0JDXG4gICAgdmFyIGNpcGhlciA9IGN0eC5wbHVnaW4uY2lwaGVyO1xuICAgIHZhciBpbmNyZW1lbnQgPSBjdHgucGx1Z2luLmluY3JlbWVudDtcbiAgICB2YXIgZm9ybWF0S2V5ID0gY3R4LnBsdWdpbi5mb3JtYXRLZXk7XG4gICAgdmFyIGZvcm1hdFNlZWQgPSBjdHgucGx1Z2luLmZvcm1hdFNlZWQ7XG5cbiAgICAvLyBwYXJhbm9pZCBkZXZpYXRpb24gZnJvbSBGb3J0dW5hOlxuICAgIC8vIHJlc2V0IGtleSBmb3IgZXZlcnkgcmVxdWVzdCB0byBwcm90ZWN0IHByZXZpb3VzbHlcbiAgICAvLyBnZW5lcmF0ZWQgcmFuZG9tIGJ5dGVzIHNob3VsZCB0aGUga2V5IGJlIGRpc2NvdmVyZWQ7XG4gICAgLy8gdGhlcmUgaXMgbm8gMTAwbXMgYmFzZWQgcmVzZWVkaW5nIGJlY2F1c2Ugb2YgdGhpc1xuICAgIC8vIGZvcmNlZCByZXNlZWQgZm9yIGV2ZXJ5IGBnZW5lcmF0ZVN5bmNgIGNhbGxcbiAgICBjdHgua2V5ID0gbnVsbDtcblxuICAgIHZhciBiID0gZm9yZ2UudXRpbC5jcmVhdGVCdWZmZXIoKTtcbiAgICB3aGlsZShiLmxlbmd0aCgpIDwgY291bnQpIHtcbiAgICAgIC8vIGlmIGFtb3VudCBvZiBkYXRhIGdlbmVyYXRlZCBpcyBncmVhdGVyIHRoYW4gMSBNaUIsIHRyaWdnZXIgcmVzZWVkXG4gICAgICBpZihjdHguZ2VuZXJhdGVkID4gMHhmZmZmZikge1xuICAgICAgICBjdHgua2V5ID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgaWYoY3R4LmtleSA9PT0gbnVsbCkge1xuICAgICAgICBfcmVzZWVkU3luYygpO1xuICAgICAgfVxuXG4gICAgICAvLyBnZW5lcmF0ZSB0aGUgcmFuZG9tIGJ5dGVzXG4gICAgICB2YXIgYnl0ZXMgPSBjaXBoZXIoY3R4LmtleSwgY3R4LnNlZWQpO1xuICAgICAgY3R4LmdlbmVyYXRlZCArPSBieXRlcy5sZW5ndGg7XG4gICAgICBiLnB1dEJ5dGVzKGJ5dGVzKTtcblxuICAgICAgLy8gZ2VuZXJhdGUgYnl0ZXMgZm9yIGEgbmV3IGtleSBhbmQgc2VlZFxuICAgICAgY3R4LmtleSA9IGZvcm1hdEtleShjaXBoZXIoY3R4LmtleSwgaW5jcmVtZW50KGN0eC5zZWVkKSkpO1xuICAgICAgY3R4LnNlZWQgPSBmb3JtYXRTZWVkKGNpcGhlcihjdHgua2V5LCBjdHguc2VlZCkpO1xuICAgIH1cblxuICAgIHJldHVybiBiLmdldEJ5dGVzKGNvdW50KTtcbiAgfTtcblxuICAvKipcbiAgICogUHJpdmF0ZSBmdW5jdGlvbiB0aGF0IGFzeW5jaHJvbm91c2x5IHJlc2VlZHMgYSBnZW5lcmF0b3IuXG4gICAqXG4gICAqIEBwYXJhbSBjYWxsYmFjayhlcnIpIGNhbGxlZCBvbmNlIHRoZSBvcGVyYXRpb24gY29tcGxldGVzLlxuICAgKi9cbiAgZnVuY3Rpb24gX3Jlc2VlZChjYWxsYmFjaykge1xuICAgIGlmKGN0eC5wb29sc1swXS5tZXNzYWdlTGVuZ3RoID49IDMyKSB7XG4gICAgICBfc2VlZCgpO1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgfVxuICAgIC8vIG5vdCBlbm91Z2ggc2VlZCBkYXRhLi4uXG4gICAgdmFyIG5lZWRlZCA9ICgzMiAtIGN0eC5wb29sc1swXS5tZXNzYWdlTGVuZ3RoKSA8PCA1O1xuICAgIGN0eC5zZWVkRmlsZShuZWVkZWQsIGZ1bmN0aW9uKGVyciwgYnl0ZXMpIHtcbiAgICAgIGlmKGVycikge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICAgIH1cbiAgICAgIGN0eC5jb2xsZWN0KGJ5dGVzKTtcbiAgICAgIF9zZWVkKCk7XG4gICAgICBjYWxsYmFjaygpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFByaXZhdGUgZnVuY3Rpb24gdGhhdCBzeW5jaHJvbm91c2x5IHJlc2VlZHMgYSBnZW5lcmF0b3IuXG4gICAqL1xuICBmdW5jdGlvbiBfcmVzZWVkU3luYygpIHtcbiAgICBpZihjdHgucG9vbHNbMF0ubWVzc2FnZUxlbmd0aCA+PSAzMikge1xuICAgICAgcmV0dXJuIF9zZWVkKCk7XG4gICAgfVxuICAgIC8vIG5vdCBlbm91Z2ggc2VlZCBkYXRhLi4uXG4gICAgdmFyIG5lZWRlZCA9ICgzMiAtIGN0eC5wb29sc1swXS5tZXNzYWdlTGVuZ3RoKSA8PCA1O1xuICAgIGN0eC5jb2xsZWN0KGN0eC5zZWVkRmlsZVN5bmMobmVlZGVkKSk7XG4gICAgX3NlZWQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcml2YXRlIGZ1bmN0aW9uIHRoYXQgc2VlZHMgYSBnZW5lcmF0b3Igb25jZSBlbm91Z2ggYnl0ZXMgYXJlIGF2YWlsYWJsZS5cbiAgICovXG4gIGZ1bmN0aW9uIF9zZWVkKCkge1xuICAgIC8vIHVwZGF0ZSByZXNlZWQgY291bnRcbiAgICBjdHgucmVzZWVkcyA9IChjdHgucmVzZWVkcyA9PT0gMHhmZmZmZmZmZikgPyAwIDogY3R4LnJlc2VlZHMgKyAxO1xuXG4gICAgLy8gZ29hbCBpcyB0byB1cGRhdGUgYGtleWAgdmlhOlxuICAgIC8vIGtleSA9IGhhc2goa2V5ICsgcylcbiAgICAvLyAgIHdoZXJlICdzJyBpcyBhbGwgY29sbGVjdGVkIGVudHJvcHkgZnJvbSBzZWxlY3RlZCBwb29scywgdGhlbi4uLlxuXG4gICAgLy8gY3JlYXRlIGEgcGx1Z2luLWJhc2VkIG1lc3NhZ2UgZGlnZXN0XG4gICAgdmFyIG1kID0gY3R4LnBsdWdpbi5tZC5jcmVhdGUoKTtcblxuICAgIC8vIGNvbnN1bWUgY3VycmVudCBrZXkgYnl0ZXNcbiAgICBtZC51cGRhdGUoY3R4LmtleUJ5dGVzKTtcblxuICAgIC8vIGRpZ2VzdCB0aGUgZW50cm9weSBvZiBwb29scyB3aG9zZSBpbmRleCBrIG1lZXQgdGhlXG4gICAgLy8gY29uZGl0aW9uICduIG1vZCAyXmsgPT0gMCcgd2hlcmUgbiBpcyB0aGUgbnVtYmVyIG9mIHJlc2VlZHNcbiAgICB2YXIgXzJwb3dLID0gMTtcbiAgICBmb3IodmFyIGsgPSAwOyBrIDwgMzI7ICsraykge1xuICAgICAgaWYoY3R4LnJlc2VlZHMgJSBfMnBvd0sgPT09IDApIHtcbiAgICAgICAgbWQudXBkYXRlKGN0eC5wb29sc1trXS5kaWdlc3QoKS5nZXRCeXRlcygpKTtcbiAgICAgICAgY3R4LnBvb2xzW2tdLnN0YXJ0KCk7XG4gICAgICB9XG4gICAgICBfMnBvd0sgPSBfMnBvd0sgPDwgMTtcbiAgICB9XG5cbiAgICAvLyBnZXQgZGlnZXN0IGZvciBrZXkgYnl0ZXNcbiAgICBjdHgua2V5Qnl0ZXMgPSBtZC5kaWdlc3QoKS5nZXRCeXRlcygpO1xuXG4gICAgLy8gcGFyYW5vaWQgZGV2aWF0aW9uIGZyb20gRm9ydHVuYTpcbiAgICAvLyB1cGRhdGUgYHNlZWRgIHZpYSBgc2VlZCA9IGhhc2goa2V5KWBcbiAgICAvLyBpbnN0ZWFkIG9mIGluaXRpYWxpemluZyB0byB6ZXJvIG9uY2UgYW5kIG9ubHlcbiAgICAvLyBldmVyIGluY3JlbWVudGluZyBpdFxuICAgIG1kLnN0YXJ0KCk7XG4gICAgbWQudXBkYXRlKGN0eC5rZXlCeXRlcyk7XG4gICAgdmFyIHNlZWRCeXRlcyA9IG1kLmRpZ2VzdCgpLmdldEJ5dGVzKCk7XG5cbiAgICAvLyB1cGRhdGUgc3RhdGVcbiAgICBjdHgua2V5ID0gY3R4LnBsdWdpbi5mb3JtYXRLZXkoY3R4LmtleUJ5dGVzKTtcbiAgICBjdHguc2VlZCA9IGN0eC5wbHVnaW4uZm9ybWF0U2VlZChzZWVkQnl0ZXMpO1xuICAgIGN0eC5nZW5lcmF0ZWQgPSAwO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBidWlsdC1pbiBkZWZhdWx0IHNlZWRGaWxlLiBUaGlzIHNlZWRGaWxlIGlzIHVzZWQgd2hlbiBlbnRyb3B5XG4gICAqIGlzIG5lZWRlZCBpbW1lZGlhdGVseS5cbiAgICpcbiAgICogQHBhcmFtIG5lZWRlZCB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYXJlIG5lZWRlZC5cbiAgICpcbiAgICogQHJldHVybiB0aGUgcmFuZG9tIGJ5dGVzLlxuICAgKi9cbiAgZnVuY3Rpb24gZGVmYXVsdFNlZWRGaWxlKG5lZWRlZCkge1xuICAgIC8vIHVzZSB3aW5kb3cuY3J5cHRvLmdldFJhbmRvbVZhbHVlcyBzdHJvbmcgc291cmNlIG9mIGVudHJvcHkgaWYgYXZhaWxhYmxlXG4gICAgdmFyIGdldFJhbmRvbVZhbHVlcyA9IG51bGw7XG4gICAgdmFyIGdsb2JhbFNjb3BlID0gZm9yZ2UudXRpbC5nbG9iYWxTY29wZTtcbiAgICB2YXIgX2NyeXB0byA9IGdsb2JhbFNjb3BlLmNyeXB0byB8fCBnbG9iYWxTY29wZS5tc0NyeXB0bztcbiAgICBpZihfY3J5cHRvICYmIF9jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKSB7XG4gICAgICBnZXRSYW5kb21WYWx1ZXMgPSBmdW5jdGlvbihhcnIpIHtcbiAgICAgICAgcmV0dXJuIF9jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKGFycik7XG4gICAgICB9O1xuICAgIH1cblxuICAgIHZhciBiID0gZm9yZ2UudXRpbC5jcmVhdGVCdWZmZXIoKTtcbiAgICBpZihnZXRSYW5kb21WYWx1ZXMpIHtcbiAgICAgIHdoaWxlKGIubGVuZ3RoKCkgPCBuZWVkZWQpIHtcbiAgICAgICAgLy8gbWF4IGJ5dGUgbGVuZ3RoIGlzIDY1NTM2IGJlZm9yZSBRdW90YUV4Y2VlZGVkRXJyb3IgaXMgdGhyb3duXG4gICAgICAgIC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL1dlYkNyeXB0b0FQSS8jUmFuZG9tU291cmNlLW1ldGhvZC1nZXRSYW5kb21WYWx1ZXNcbiAgICAgICAgdmFyIGNvdW50ID0gTWF0aC5tYXgoMSwgTWF0aC5taW4obmVlZGVkIC0gYi5sZW5ndGgoKSwgNjU1MzYpIC8gNCk7XG4gICAgICAgIHZhciBlbnRyb3B5ID0gbmV3IFVpbnQzMkFycmF5KE1hdGguZmxvb3IoY291bnQpKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBnZXRSYW5kb21WYWx1ZXMoZW50cm9weSk7XG4gICAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IGVudHJvcHkubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIGIucHV0SW50MzIoZW50cm9weVtpXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoKGUpIHtcbiAgICAgICAgICAvKiBvbmx5IGlnbm9yZSBRdW90YUV4Y2VlZGVkRXJyb3IgKi9cbiAgICAgICAgICBpZighKHR5cGVvZiBRdW90YUV4Y2VlZGVkRXJyb3IgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgICAgICBlIGluc3RhbmNlb2YgUXVvdGFFeGNlZWRlZEVycm9yKSkge1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBiZSBzYWQgYW5kIGFkZCBzb21lIHdlYWsgcmFuZG9tIGRhdGFcbiAgICBpZihiLmxlbmd0aCgpIDwgbmVlZGVkKSB7XG4gICAgICAvKiBEcmF3cyBmcm9tIFBhcmstTWlsbGVyIFwibWluaW1hbCBzdGFuZGFyZFwiIDMxIGJpdCBQUk5HLFxuICAgICAgaW1wbGVtZW50ZWQgd2l0aCBEYXZpZCBHLiBDYXJ0YSdzIG9wdGltaXphdGlvbjogd2l0aCAzMiBiaXQgbWF0aFxuICAgICAgYW5kIHdpdGhvdXQgZGl2aXNpb24gKFB1YmxpYyBEb21haW4pLiAqL1xuICAgICAgdmFyIGhpLCBsbywgbmV4dDtcbiAgICAgIHZhciBzZWVkID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMHgwMTAwMDApO1xuICAgICAgd2hpbGUoYi5sZW5ndGgoKSA8IG5lZWRlZCkge1xuICAgICAgICBsbyA9IDE2ODA3ICogKHNlZWQgJiAweEZGRkYpO1xuICAgICAgICBoaSA9IDE2ODA3ICogKHNlZWQgPj4gMTYpO1xuICAgICAgICBsbyArPSAoaGkgJiAweDdGRkYpIDw8IDE2O1xuICAgICAgICBsbyArPSBoaSA+PiAxNTtcbiAgICAgICAgbG8gPSAobG8gJiAweDdGRkZGRkZGKSArIChsbyA+PiAzMSk7XG4gICAgICAgIHNlZWQgPSBsbyAmIDB4RkZGRkZGRkY7XG5cbiAgICAgICAgLy8gY29uc3VtZSBsb3dlciAzIGJ5dGVzIG9mIHNlZWRcbiAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IDM7ICsraSkge1xuICAgICAgICAgIC8vIHRocm93IGluIG1vcmUgcHNldWRvIHJhbmRvbVxuICAgICAgICAgIG5leHQgPSBzZWVkID4+PiAoaSA8PCAzKTtcbiAgICAgICAgICBuZXh0IF49IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDB4MDEwMCk7XG4gICAgICAgICAgYi5wdXRCeXRlKG5leHQgJiAweEZGKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBiLmdldEJ5dGVzKG5lZWRlZCk7XG4gIH1cbiAgLy8gaW5pdGlhbGl6ZSBzZWVkIGZpbGUgQVBJc1xuICBpZihfY3J5cHRvKSB7XG4gICAgLy8gdXNlIG5vZGVqcyBhc3luYyBBUElcbiAgICBjdHguc2VlZEZpbGUgPSBmdW5jdGlvbihuZWVkZWQsIGNhbGxiYWNrKSB7XG4gICAgICBfY3J5cHRvLnJhbmRvbUJ5dGVzKG5lZWRlZCwgZnVuY3Rpb24oZXJyLCBieXRlcykge1xuICAgICAgICBpZihlcnIpIHtcbiAgICAgICAgICByZXR1cm4gY2FsbGJhY2soZXJyKTtcbiAgICAgICAgfVxuICAgICAgICBjYWxsYmFjayhudWxsLCBieXRlcy50b1N0cmluZygpKTtcbiAgICAgIH0pO1xuICAgIH07XG4gICAgLy8gdXNlIG5vZGVqcyBzeW5jIEFQSVxuICAgIGN0eC5zZWVkRmlsZVN5bmMgPSBmdW5jdGlvbihuZWVkZWQpIHtcbiAgICAgIHJldHVybiBfY3J5cHRvLnJhbmRvbUJ5dGVzKG5lZWRlZCkudG9TdHJpbmcoKTtcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIGN0eC5zZWVkRmlsZSA9IGZ1bmN0aW9uKG5lZWRlZCwgY2FsbGJhY2spIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNhbGxiYWNrKG51bGwsIGRlZmF1bHRTZWVkRmlsZShuZWVkZWQpKTtcbiAgICAgIH0gY2F0Y2goZSkge1xuICAgICAgICBjYWxsYmFjayhlKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGN0eC5zZWVkRmlsZVN5bmMgPSBkZWZhdWx0U2VlZEZpbGU7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBlbnRyb3B5IHRvIGEgcHJuZyBjdHgncyBhY2N1bXVsYXRvci5cbiAgICpcbiAgICogQHBhcmFtIGJ5dGVzIHRoZSBieXRlcyBvZiBlbnRyb3B5IGFzIGEgc3RyaW5nLlxuICAgKi9cbiAgY3R4LmNvbGxlY3QgPSBmdW5jdGlvbihieXRlcykge1xuICAgIC8vIGl0ZXJhdGUgb3ZlciBwb29scyBkaXN0cmlidXRpbmcgZW50cm9weSBjeWNsaWNhbGx5XG4gICAgdmFyIGNvdW50ID0gYnl0ZXMubGVuZ3RoO1xuICAgIGZvcih2YXIgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7XG4gICAgICBjdHgucG9vbHNbY3R4LnBvb2xdLnVwZGF0ZShieXRlcy5zdWJzdHIoaSwgMSkpO1xuICAgICAgY3R4LnBvb2wgPSAoY3R4LnBvb2wgPT09IDMxKSA/IDAgOiBjdHgucG9vbCArIDE7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBDb2xsZWN0cyBhbiBpbnRlZ2VyIG9mIG4gYml0cy5cbiAgICpcbiAgICogQHBhcmFtIGkgdGhlIGludGVnZXIgZW50cm9weS5cbiAgICogQHBhcmFtIG4gdGhlIG51bWJlciBvZiBiaXRzIGluIHRoZSBpbnRlZ2VyLlxuICAgKi9cbiAgY3R4LmNvbGxlY3RJbnQgPSBmdW5jdGlvbihpLCBuKSB7XG4gICAgdmFyIGJ5dGVzID0gJyc7XG4gICAgZm9yKHZhciB4ID0gMDsgeCA8IG47IHggKz0gOCkge1xuICAgICAgYnl0ZXMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSgoaSA+PiB4KSAmIDB4RkYpO1xuICAgIH1cbiAgICBjdHguY29sbGVjdChieXRlcyk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIFdlYiBXb3JrZXIgdG8gcmVjZWl2ZSBpbW1lZGlhdGUgZW50cm9weSBmcm9tIHRoZSBtYWluIHRocmVhZC5cbiAgICogVGhpcyBtZXRob2QgaXMgcmVxdWlyZWQgdW50aWwgV2ViIFdvcmtlcnMgY2FuIGFjY2VzcyB0aGUgbmF0aXZlIGNyeXB0b1xuICAgKiBBUEkuIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgdHdpY2UgZm9yIGVhY2ggY3JlYXRlZCB3b3JrZXIsIG9uY2UgaW5cbiAgICogdGhlIG1haW4gdGhyZWFkLCBhbmQgb25jZSBpbiB0aGUgd29ya2VyIGl0c2VsZi5cbiAgICpcbiAgICogQHBhcmFtIHdvcmtlciB0aGUgd29ya2VyIHRvIHJlZ2lzdGVyLlxuICAgKi9cbiAgY3R4LnJlZ2lzdGVyV29ya2VyID0gZnVuY3Rpb24od29ya2VyKSB7XG4gICAgLy8gd29ya2VyIHJlY2VpdmVzIHJhbmRvbSBieXRlc1xuICAgIGlmKHdvcmtlciA9PT0gc2VsZikge1xuICAgICAgY3R4LnNlZWRGaWxlID0gZnVuY3Rpb24obmVlZGVkLCBjYWxsYmFjaykge1xuICAgICAgICBmdW5jdGlvbiBsaXN0ZW5lcihlKSB7XG4gICAgICAgICAgdmFyIGRhdGEgPSBlLmRhdGE7XG4gICAgICAgICAgaWYoZGF0YS5mb3JnZSAmJiBkYXRhLmZvcmdlLnBybmcpIHtcbiAgICAgICAgICAgIHNlbGYucmVtb3ZlRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGxpc3RlbmVyKTtcbiAgICAgICAgICAgIGNhbGxiYWNrKGRhdGEuZm9yZ2UucHJuZy5lcnIsIGRhdGEuZm9yZ2UucHJuZy5ieXRlcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHNlbGYuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGxpc3RlbmVyKTtcbiAgICAgICAgc2VsZi5wb3N0TWVzc2FnZSh7Zm9yZ2U6IHtwcm5nOiB7bmVlZGVkOiBuZWVkZWR9fX0pO1xuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gbWFpbiB0aHJlYWQgc2VuZHMgcmFuZG9tIGJ5dGVzIHVwb24gcmVxdWVzdFxuICAgICAgdmFyIGxpc3RlbmVyID0gZnVuY3Rpb24oZSkge1xuICAgICAgICB2YXIgZGF0YSA9IGUuZGF0YTtcbiAgICAgICAgaWYoZGF0YS5mb3JnZSAmJiBkYXRhLmZvcmdlLnBybmcpIHtcbiAgICAgICAgICBjdHguc2VlZEZpbGUoZGF0YS5mb3JnZS5wcm5nLm5lZWRlZCwgZnVuY3Rpb24oZXJyLCBieXRlcykge1xuICAgICAgICAgICAgd29ya2VyLnBvc3RNZXNzYWdlKHtmb3JnZToge3Bybmc6IHtlcnI6IGVyciwgYnl0ZXM6IGJ5dGVzfX19KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIC8vIFRPRE86IGRvIHdlIG5lZWQgdG8gcmVtb3ZlIHRoZSBldmVudCBsaXN0ZW5lciB3aGVuIHRoZSB3b3JrZXIgZGllcz9cbiAgICAgIHdvcmtlci5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgbGlzdGVuZXIpO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gY3R4O1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///83\n")},function(module,exports,__webpack_require__){eval("/**\n * RC2 implementation.\n *\n * @author Stefan Siegl\n *\n * Copyright (c) 2012 Stefan Siegl <stesie@brokenpipe.de>\n *\n * Information on the RC2 cipher is available from RFC #2268,\n * http://www.ietf.org/rfc/rfc2268.txt\n */\nvar forge = __webpack_require__(4);\n__webpack_require__(7);\n\nvar piTable = [\n  0xd9, 0x78, 0xf9, 0xc4, 0x19, 0xdd, 0xb5, 0xed, 0x28, 0xe9, 0xfd, 0x79, 0x4a, 0xa0, 0xd8, 0x9d,\n  0xc6, 0x7e, 0x37, 0x83, 0x2b, 0x76, 0x53, 0x8e, 0x62, 0x4c, 0x64, 0x88, 0x44, 0x8b, 0xfb, 0xa2,\n  0x17, 0x9a, 0x59, 0xf5, 0x87, 0xb3, 0x4f, 0x13, 0x61, 0x45, 0x6d, 0x8d, 0x09, 0x81, 0x7d, 0x32,\n  0xbd, 0x8f, 0x40, 0xeb, 0x86, 0xb7, 0x7b, 0x0b, 0xf0, 0x95, 0x21, 0x22, 0x5c, 0x6b, 0x4e, 0x82,\n  0x54, 0xd6, 0x65, 0x93, 0xce, 0x60, 0xb2, 0x1c, 0x73, 0x56, 0xc0, 0x14, 0xa7, 0x8c, 0xf1, 0xdc,\n  0x12, 0x75, 0xca, 0x1f, 0x3b, 0xbe, 0xe4, 0xd1, 0x42, 0x3d, 0xd4, 0x30, 0xa3, 0x3c, 0xb6, 0x26,\n  0x6f, 0xbf, 0x0e, 0xda, 0x46, 0x69, 0x07, 0x57, 0x27, 0xf2, 0x1d, 0x9b, 0xbc, 0x94, 0x43, 0x03,\n  0xf8, 0x11, 0xc7, 0xf6, 0x90, 0xef, 0x3e, 0xe7, 0x06, 0xc3, 0xd5, 0x2f, 0xc8, 0x66, 0x1e, 0xd7,\n  0x08, 0xe8, 0xea, 0xde, 0x80, 0x52, 0xee, 0xf7, 0x84, 0xaa, 0x72, 0xac, 0x35, 0x4d, 0x6a, 0x2a,\n  0x96, 0x1a, 0xd2, 0x71, 0x5a, 0x15, 0x49, 0x74, 0x4b, 0x9f, 0xd0, 0x5e, 0x04, 0x18, 0xa4, 0xec,\n  0xc2, 0xe0, 0x41, 0x6e, 0x0f, 0x51, 0xcb, 0xcc, 0x24, 0x91, 0xaf, 0x50, 0xa1, 0xf4, 0x70, 0x39,\n  0x99, 0x7c, 0x3a, 0x85, 0x23, 0xb8, 0xb4, 0x7a, 0xfc, 0x02, 0x36, 0x5b, 0x25, 0x55, 0x97, 0x31,\n  0x2d, 0x5d, 0xfa, 0x98, 0xe3, 0x8a, 0x92, 0xae, 0x05, 0xdf, 0x29, 0x10, 0x67, 0x6c, 0xba, 0xc9,\n  0xd3, 0x00, 0xe6, 0xcf, 0xe1, 0x9e, 0xa8, 0x2c, 0x63, 0x16, 0x01, 0x3f, 0x58, 0xe2, 0x89, 0xa9,\n  0x0d, 0x38, 0x34, 0x1b, 0xab, 0x33, 0xff, 0xb0, 0xbb, 0x48, 0x0c, 0x5f, 0xb9, 0xb1, 0xcd, 0x2e,\n  0xc5, 0xf3, 0xdb, 0x47, 0xe5, 0xa5, 0x9c, 0x77, 0x0a, 0xa6, 0x20, 0x68, 0xfe, 0x7f, 0xc1, 0xad\n];\n\nvar s = [1, 2, 3, 5];\n\n/**\n * Rotate a word left by given number of bits.\n *\n * Bits that are shifted out on the left are put back in on the right\n * hand side.\n *\n * @param word The word to shift left.\n * @param bits The number of bits to shift by.\n * @return The rotated word.\n */\nvar rol = function(word, bits) {\n  return ((word << bits) & 0xffff) | ((word & 0xffff) >> (16 - bits));\n};\n\n/**\n * Rotate a word right by given number of bits.\n *\n * Bits that are shifted out on the right are put back in on the left\n * hand side.\n *\n * @param word The word to shift right.\n * @param bits The number of bits to shift by.\n * @return The rotated word.\n */\nvar ror = function(word, bits) {\n  return ((word & 0xffff) >> bits) | ((word << (16 - bits)) & 0xffff);\n};\n\n/* RC2 API */\nmodule.exports = forge.rc2 = forge.rc2 || {};\n\n/**\n * Perform RC2 key expansion as per RFC #2268, section 2.\n *\n * @param key variable-length user key (between 1 and 128 bytes)\n * @param effKeyBits number of effective key bits (default: 128)\n * @return the expanded RC2 key (ByteBuffer of 128 bytes)\n */\nforge.rc2.expandKey = function(key, effKeyBits) {\n  if(typeof key === 'string') {\n    key = forge.util.createBuffer(key);\n  }\n  effKeyBits = effKeyBits || 128;\n\n  /* introduce variables that match the names used in RFC #2268 */\n  var L = key;\n  var T = key.length();\n  var T1 = effKeyBits;\n  var T8 = Math.ceil(T1 / 8);\n  var TM = 0xff >> (T1 & 0x07);\n  var i;\n\n  for(i = T; i < 128; i++) {\n    L.putByte(piTable[(L.at(i - 1) + L.at(i - T)) & 0xff]);\n  }\n\n  L.setAt(128 - T8, piTable[L.at(128 - T8) & TM]);\n\n  for(i = 127 - T8; i >= 0; i--) {\n    L.setAt(i, piTable[L.at(i + 1) ^ L.at(i + T8)]);\n  }\n\n  return L;\n};\n\n/**\n * Creates a RC2 cipher object.\n *\n * @param key the symmetric key to use (as base for key generation).\n * @param bits the number of effective key bits.\n * @param encrypt false for decryption, true for encryption.\n *\n * @return the cipher.\n */\nvar createCipher = function(key, bits, encrypt) {\n  var _finish = false, _input = null, _output = null, _iv = null;\n  var mixRound, mashRound;\n  var i, j, K = [];\n\n  /* Expand key and fill into K[] Array */\n  key = forge.rc2.expandKey(key, bits);\n  for(i = 0; i < 64; i++) {\n    K.push(key.getInt16Le());\n  }\n\n  if(encrypt) {\n    /**\n     * Perform one mixing round \"in place\".\n     *\n     * @param R Array of four words to perform mixing on.\n     */\n    mixRound = function(R) {\n      for(i = 0; i < 4; i++) {\n        R[i] += K[j] + (R[(i + 3) % 4] & R[(i + 2) % 4]) +\n          ((~R[(i + 3) % 4]) & R[(i + 1) % 4]);\n        R[i] = rol(R[i], s[i]);\n        j++;\n      }\n    };\n\n    /**\n     * Perform one mashing round \"in place\".\n     *\n     * @param R Array of four words to perform mashing on.\n     */\n    mashRound = function(R) {\n      for(i = 0; i < 4; i++) {\n        R[i] += K[R[(i + 3) % 4] & 63];\n      }\n    };\n  } else {\n    /**\n     * Perform one r-mixing round \"in place\".\n     *\n     * @param R Array of four words to perform mixing on.\n     */\n    mixRound = function(R) {\n      for(i = 3; i >= 0; i--) {\n        R[i] = ror(R[i], s[i]);\n        R[i] -= K[j] + (R[(i + 3) % 4] & R[(i + 2) % 4]) +\n          ((~R[(i + 3) % 4]) & R[(i + 1) % 4]);\n        j--;\n      }\n    };\n\n    /**\n     * Perform one r-mashing round \"in place\".\n     *\n     * @param R Array of four words to perform mashing on.\n     */\n    mashRound = function(R) {\n      for(i = 3; i >= 0; i--) {\n        R[i] -= K[R[(i + 3) % 4] & 63];\n      }\n    };\n  }\n\n  /**\n   * Run the specified cipher execution plan.\n   *\n   * This function takes four words from the input buffer, applies the IV on\n   * it (if requested) and runs the provided execution plan.\n   *\n   * The plan must be put together in form of a array of arrays.  Where the\n   * outer one is simply a list of steps to perform and the inner one needs\n   * to have two elements: the first one telling how many rounds to perform,\n   * the second one telling what to do (i.e. the function to call).\n   *\n   * @param {Array} plan The plan to execute.\n   */\n  var runPlan = function(plan) {\n    var R = [];\n\n    /* Get data from input buffer and fill the four words into R */\n    for(i = 0; i < 4; i++) {\n      var val = _input.getInt16Le();\n\n      if(_iv !== null) {\n        if(encrypt) {\n          /* We're encrypting, apply the IV first. */\n          val ^= _iv.getInt16Le();\n        } else {\n          /* We're decryption, keep cipher text for next block. */\n          _iv.putInt16Le(val);\n        }\n      }\n\n      R.push(val & 0xffff);\n    }\n\n    /* Reset global \"j\" variable as per spec. */\n    j = encrypt ? 0 : 63;\n\n    /* Run execution plan. */\n    for(var ptr = 0; ptr < plan.length; ptr++) {\n      for(var ctr = 0; ctr < plan[ptr][0]; ctr++) {\n        plan[ptr][1](R);\n      }\n    }\n\n    /* Write back result to output buffer. */\n    for(i = 0; i < 4; i++) {\n      if(_iv !== null) {\n        if(encrypt) {\n          /* We're encrypting in CBC-mode, feed back encrypted bytes into\n             IV buffer to carry it forward to next block. */\n          _iv.putInt16Le(R[i]);\n        } else {\n          R[i] ^= _iv.getInt16Le();\n        }\n      }\n\n      _output.putInt16Le(R[i]);\n    }\n  };\n\n  /* Create cipher object */\n  var cipher = null;\n  cipher = {\n    /**\n     * Starts or restarts the encryption or decryption process, whichever\n     * was previously configured.\n     *\n     * To use the cipher in CBC mode, iv may be given either as a string\n     * of bytes, or as a byte buffer.  For ECB mode, give null as iv.\n     *\n     * @param iv the initialization vector to use, null for ECB mode.\n     * @param output the output the buffer to write to, null to create one.\n     */\n    start: function(iv, output) {\n      if(iv) {\n        /* CBC mode */\n        if(typeof iv === 'string') {\n          iv = forge.util.createBuffer(iv);\n        }\n      }\n\n      _finish = false;\n      _input = forge.util.createBuffer();\n      _output = output || new forge.util.createBuffer();\n      _iv = iv;\n\n      cipher.output = _output;\n    },\n\n    /**\n     * Updates the next block.\n     *\n     * @param input the buffer to read from.\n     */\n    update: function(input) {\n      if(!_finish) {\n        // not finishing, so fill the input buffer with more input\n        _input.putBuffer(input);\n      }\n\n      while(_input.length() >= 8) {\n        runPlan([\n            [ 5, mixRound ],\n            [ 1, mashRound ],\n            [ 6, mixRound ],\n            [ 1, mashRound ],\n            [ 5, mixRound ]\n          ]);\n      }\n    },\n\n    /**\n     * Finishes encrypting or decrypting.\n     *\n     * @param pad a padding function to use, null for PKCS#7 padding,\n     *           signature(blockSize, buffer, decrypt).\n     *\n     * @return true if successful, false on error.\n     */\n    finish: function(pad) {\n      var rval = true;\n\n      if(encrypt) {\n        if(pad) {\n          rval = pad(8, _input, !encrypt);\n        } else {\n          // add PKCS#7 padding to block (each pad byte is the\n          // value of the number of pad bytes)\n          var padding = (_input.length() === 8) ? 8 : (8 - _input.length());\n          _input.fillWithByte(padding, padding);\n        }\n      }\n\n      if(rval) {\n        // do final update\n        _finish = true;\n        cipher.update();\n      }\n\n      if(!encrypt) {\n        // check for error: input data not a multiple of block size\n        rval = (_input.length() === 0);\n        if(rval) {\n          if(pad) {\n            rval = pad(8, _output, !encrypt);\n          } else {\n            // ensure padding byte count is valid\n            var len = _output.length();\n            var count = _output.at(len - 1);\n\n            if(count > len) {\n              rval = false;\n            } else {\n              // trim off padding bytes\n              _output.truncate(count);\n            }\n          }\n        }\n      }\n\n      return rval;\n    }\n  };\n\n  return cipher;\n};\n\n/**\n * Creates an RC2 cipher object to encrypt data in ECB or CBC mode using the\n * given symmetric key. The output will be stored in the 'output' member\n * of the returned cipher.\n *\n * The key and iv may be given as a string of bytes or a byte buffer.\n * The cipher is initialized to use 128 effective key bits.\n *\n * @param key the symmetric key to use.\n * @param iv the initialization vector to use.\n * @param output the buffer to write to, null to create one.\n *\n * @return the cipher.\n */\nforge.rc2.startEncrypting = function(key, iv, output) {\n  var cipher = forge.rc2.createEncryptionCipher(key, 128);\n  cipher.start(iv, output);\n  return cipher;\n};\n\n/**\n * Creates an RC2 cipher object to encrypt data in ECB or CBC mode using the\n * given symmetric key.\n *\n * The key may be given as a string of bytes or a byte buffer.\n *\n * To start encrypting call start() on the cipher with an iv and optional\n * output buffer.\n *\n * @param key the symmetric key to use.\n *\n * @return the cipher.\n */\nforge.rc2.createEncryptionCipher = function(key, bits) {\n  return createCipher(key, bits, true);\n};\n\n/**\n * Creates an RC2 cipher object to decrypt data in ECB or CBC mode using the\n * given symmetric key. The output will be stored in the 'output' member\n * of the returned cipher.\n *\n * The key and iv may be given as a string of bytes or a byte buffer.\n * The cipher is initialized to use 128 effective key bits.\n *\n * @param key the symmetric key to use.\n * @param iv the initialization vector to use.\n * @param output the buffer to write to, null to create one.\n *\n * @return the cipher.\n */\nforge.rc2.startDecrypting = function(key, iv, output) {\n  var cipher = forge.rc2.createDecryptionCipher(key, 128);\n  cipher.start(iv, output);\n  return cipher;\n};\n\n/**\n * Creates an RC2 cipher object to decrypt data in ECB or CBC mode using the\n * given symmetric key.\n *\n * The key may be given as a string of bytes or a byte buffer.\n *\n * To start decrypting call start() on the cipher with an iv and optional\n * output buffer.\n *\n * @param key the symmetric key to use.\n *\n * @return the cipher.\n */\nforge.rc2.createDecryptionCipher = function(key, bits) {\n  return createCipher(key, bits, false);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODQuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbm9kZS1mb3JnZS9saWIvcmMyLmpzP2M2YTgiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBSQzIgaW1wbGVtZW50YXRpb24uXG4gKlxuICogQGF1dGhvciBTdGVmYW4gU2llZ2xcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTIgU3RlZmFuIFNpZWdsIDxzdGVzaWVAYnJva2VucGlwZS5kZT5cbiAqXG4gKiBJbmZvcm1hdGlvbiBvbiB0aGUgUkMyIGNpcGhlciBpcyBhdmFpbGFibGUgZnJvbSBSRkMgIzIyNjgsXG4gKiBodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMyMjY4LnR4dFxuICovXG52YXIgZm9yZ2UgPSByZXF1aXJlKCcuL2ZvcmdlJyk7XG5yZXF1aXJlKCcuL3V0aWwnKTtcblxudmFyIHBpVGFibGUgPSBbXG4gIDB4ZDksIDB4NzgsIDB4ZjksIDB4YzQsIDB4MTksIDB4ZGQsIDB4YjUsIDB4ZWQsIDB4MjgsIDB4ZTksIDB4ZmQsIDB4NzksIDB4NGEsIDB4YTAsIDB4ZDgsIDB4OWQsXG4gIDB4YzYsIDB4N2UsIDB4MzcsIDB4ODMsIDB4MmIsIDB4NzYsIDB4NTMsIDB4OGUsIDB4NjIsIDB4NGMsIDB4NjQsIDB4ODgsIDB4NDQsIDB4OGIsIDB4ZmIsIDB4YTIsXG4gIDB4MTcsIDB4OWEsIDB4NTksIDB4ZjUsIDB4ODcsIDB4YjMsIDB4NGYsIDB4MTMsIDB4NjEsIDB4NDUsIDB4NmQsIDB4OGQsIDB4MDksIDB4ODEsIDB4N2QsIDB4MzIsXG4gIDB4YmQsIDB4OGYsIDB4NDAsIDB4ZWIsIDB4ODYsIDB4YjcsIDB4N2IsIDB4MGIsIDB4ZjAsIDB4OTUsIDB4MjEsIDB4MjIsIDB4NWMsIDB4NmIsIDB4NGUsIDB4ODIsXG4gIDB4NTQsIDB4ZDYsIDB4NjUsIDB4OTMsIDB4Y2UsIDB4NjAsIDB4YjIsIDB4MWMsIDB4NzMsIDB4NTYsIDB4YzAsIDB4MTQsIDB4YTcsIDB4OGMsIDB4ZjEsIDB4ZGMsXG4gIDB4MTIsIDB4NzUsIDB4Y2EsIDB4MWYsIDB4M2IsIDB4YmUsIDB4ZTQsIDB4ZDEsIDB4NDIsIDB4M2QsIDB4ZDQsIDB4MzAsIDB4YTMsIDB4M2MsIDB4YjYsIDB4MjYsXG4gIDB4NmYsIDB4YmYsIDB4MGUsIDB4ZGEsIDB4NDYsIDB4NjksIDB4MDcsIDB4NTcsIDB4MjcsIDB4ZjIsIDB4MWQsIDB4OWIsIDB4YmMsIDB4OTQsIDB4NDMsIDB4MDMsXG4gIDB4ZjgsIDB4MTEsIDB4YzcsIDB4ZjYsIDB4OTAsIDB4ZWYsIDB4M2UsIDB4ZTcsIDB4MDYsIDB4YzMsIDB4ZDUsIDB4MmYsIDB4YzgsIDB4NjYsIDB4MWUsIDB4ZDcsXG4gIDB4MDgsIDB4ZTgsIDB4ZWEsIDB4ZGUsIDB4ODAsIDB4NTIsIDB4ZWUsIDB4ZjcsIDB4ODQsIDB4YWEsIDB4NzIsIDB4YWMsIDB4MzUsIDB4NGQsIDB4NmEsIDB4MmEsXG4gIDB4OTYsIDB4MWEsIDB4ZDIsIDB4NzEsIDB4NWEsIDB4MTUsIDB4NDksIDB4NzQsIDB4NGIsIDB4OWYsIDB4ZDAsIDB4NWUsIDB4MDQsIDB4MTgsIDB4YTQsIDB4ZWMsXG4gIDB4YzIsIDB4ZTAsIDB4NDEsIDB4NmUsIDB4MGYsIDB4NTEsIDB4Y2IsIDB4Y2MsIDB4MjQsIDB4OTEsIDB4YWYsIDB4NTAsIDB4YTEsIDB4ZjQsIDB4NzAsIDB4MzksXG4gIDB4OTksIDB4N2MsIDB4M2EsIDB4ODUsIDB4MjMsIDB4YjgsIDB4YjQsIDB4N2EsIDB4ZmMsIDB4MDIsIDB4MzYsIDB4NWIsIDB4MjUsIDB4NTUsIDB4OTcsIDB4MzEsXG4gIDB4MmQsIDB4NWQsIDB4ZmEsIDB4OTgsIDB4ZTMsIDB4OGEsIDB4OTIsIDB4YWUsIDB4MDUsIDB4ZGYsIDB4MjksIDB4MTAsIDB4NjcsIDB4NmMsIDB4YmEsIDB4YzksXG4gIDB4ZDMsIDB4MDAsIDB4ZTYsIDB4Y2YsIDB4ZTEsIDB4OWUsIDB4YTgsIDB4MmMsIDB4NjMsIDB4MTYsIDB4MDEsIDB4M2YsIDB4NTgsIDB4ZTIsIDB4ODksIDB4YTksXG4gIDB4MGQsIDB4MzgsIDB4MzQsIDB4MWIsIDB4YWIsIDB4MzMsIDB4ZmYsIDB4YjAsIDB4YmIsIDB4NDgsIDB4MGMsIDB4NWYsIDB4YjksIDB4YjEsIDB4Y2QsIDB4MmUsXG4gIDB4YzUsIDB4ZjMsIDB4ZGIsIDB4NDcsIDB4ZTUsIDB4YTUsIDB4OWMsIDB4NzcsIDB4MGEsIDB4YTYsIDB4MjAsIDB4NjgsIDB4ZmUsIDB4N2YsIDB4YzEsIDB4YWRcbl07XG5cbnZhciBzID0gWzEsIDIsIDMsIDVdO1xuXG4vKipcbiAqIFJvdGF0ZSBhIHdvcmQgbGVmdCBieSBnaXZlbiBudW1iZXIgb2YgYml0cy5cbiAqXG4gKiBCaXRzIHRoYXQgYXJlIHNoaWZ0ZWQgb3V0IG9uIHRoZSBsZWZ0IGFyZSBwdXQgYmFjayBpbiBvbiB0aGUgcmlnaHRcbiAqIGhhbmQgc2lkZS5cbiAqXG4gKiBAcGFyYW0gd29yZCBUaGUgd29yZCB0byBzaGlmdCBsZWZ0LlxuICogQHBhcmFtIGJpdHMgVGhlIG51bWJlciBvZiBiaXRzIHRvIHNoaWZ0IGJ5LlxuICogQHJldHVybiBUaGUgcm90YXRlZCB3b3JkLlxuICovXG52YXIgcm9sID0gZnVuY3Rpb24od29yZCwgYml0cykge1xuICByZXR1cm4gKCh3b3JkIDw8IGJpdHMpICYgMHhmZmZmKSB8ICgod29yZCAmIDB4ZmZmZikgPj4gKDE2IC0gYml0cykpO1xufTtcblxuLyoqXG4gKiBSb3RhdGUgYSB3b3JkIHJpZ2h0IGJ5IGdpdmVuIG51bWJlciBvZiBiaXRzLlxuICpcbiAqIEJpdHMgdGhhdCBhcmUgc2hpZnRlZCBvdXQgb24gdGhlIHJpZ2h0IGFyZSBwdXQgYmFjayBpbiBvbiB0aGUgbGVmdFxuICogaGFuZCBzaWRlLlxuICpcbiAqIEBwYXJhbSB3b3JkIFRoZSB3b3JkIHRvIHNoaWZ0IHJpZ2h0LlxuICogQHBhcmFtIGJpdHMgVGhlIG51bWJlciBvZiBiaXRzIHRvIHNoaWZ0IGJ5LlxuICogQHJldHVybiBUaGUgcm90YXRlZCB3b3JkLlxuICovXG52YXIgcm9yID0gZnVuY3Rpb24od29yZCwgYml0cykge1xuICByZXR1cm4gKCh3b3JkICYgMHhmZmZmKSA+PiBiaXRzKSB8ICgod29yZCA8PCAoMTYgLSBiaXRzKSkgJiAweGZmZmYpO1xufTtcblxuLyogUkMyIEFQSSAqL1xubW9kdWxlLmV4cG9ydHMgPSBmb3JnZS5yYzIgPSBmb3JnZS5yYzIgfHwge307XG5cbi8qKlxuICogUGVyZm9ybSBSQzIga2V5IGV4cGFuc2lvbiBhcyBwZXIgUkZDICMyMjY4LCBzZWN0aW9uIDIuXG4gKlxuICogQHBhcmFtIGtleSB2YXJpYWJsZS1sZW5ndGggdXNlciBrZXkgKGJldHdlZW4gMSBhbmQgMTI4IGJ5dGVzKVxuICogQHBhcmFtIGVmZktleUJpdHMgbnVtYmVyIG9mIGVmZmVjdGl2ZSBrZXkgYml0cyAoZGVmYXVsdDogMTI4KVxuICogQHJldHVybiB0aGUgZXhwYW5kZWQgUkMyIGtleSAoQnl0ZUJ1ZmZlciBvZiAxMjggYnl0ZXMpXG4gKi9cbmZvcmdlLnJjMi5leHBhbmRLZXkgPSBmdW5jdGlvbihrZXksIGVmZktleUJpdHMpIHtcbiAgaWYodHlwZW9mIGtleSA9PT0gJ3N0cmluZycpIHtcbiAgICBrZXkgPSBmb3JnZS51dGlsLmNyZWF0ZUJ1ZmZlcihrZXkpO1xuICB9XG4gIGVmZktleUJpdHMgPSBlZmZLZXlCaXRzIHx8IDEyODtcblxuICAvKiBpbnRyb2R1Y2UgdmFyaWFibGVzIHRoYXQgbWF0Y2ggdGhlIG5hbWVzIHVzZWQgaW4gUkZDICMyMjY4ICovXG4gIHZhciBMID0ga2V5O1xuICB2YXIgVCA9IGtleS5sZW5ndGgoKTtcbiAgdmFyIFQxID0gZWZmS2V5Qml0cztcbiAgdmFyIFQ4ID0gTWF0aC5jZWlsKFQxIC8gOCk7XG4gIHZhciBUTSA9IDB4ZmYgPj4gKFQxICYgMHgwNyk7XG4gIHZhciBpO1xuXG4gIGZvcihpID0gVDsgaSA8IDEyODsgaSsrKSB7XG4gICAgTC5wdXRCeXRlKHBpVGFibGVbKEwuYXQoaSAtIDEpICsgTC5hdChpIC0gVCkpICYgMHhmZl0pO1xuICB9XG5cbiAgTC5zZXRBdCgxMjggLSBUOCwgcGlUYWJsZVtMLmF0KDEyOCAtIFQ4KSAmIFRNXSk7XG5cbiAgZm9yKGkgPSAxMjcgLSBUODsgaSA+PSAwOyBpLS0pIHtcbiAgICBMLnNldEF0KGksIHBpVGFibGVbTC5hdChpICsgMSkgXiBMLmF0KGkgKyBUOCldKTtcbiAgfVxuXG4gIHJldHVybiBMO1xufTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgUkMyIGNpcGhlciBvYmplY3QuXG4gKlxuICogQHBhcmFtIGtleSB0aGUgc3ltbWV0cmljIGtleSB0byB1c2UgKGFzIGJhc2UgZm9yIGtleSBnZW5lcmF0aW9uKS5cbiAqIEBwYXJhbSBiaXRzIHRoZSBudW1iZXIgb2YgZWZmZWN0aXZlIGtleSBiaXRzLlxuICogQHBhcmFtIGVuY3J5cHQgZmFsc2UgZm9yIGRlY3J5cHRpb24sIHRydWUgZm9yIGVuY3J5cHRpb24uXG4gKlxuICogQHJldHVybiB0aGUgY2lwaGVyLlxuICovXG52YXIgY3JlYXRlQ2lwaGVyID0gZnVuY3Rpb24oa2V5LCBiaXRzLCBlbmNyeXB0KSB7XG4gIHZhciBfZmluaXNoID0gZmFsc2UsIF9pbnB1dCA9IG51bGwsIF9vdXRwdXQgPSBudWxsLCBfaXYgPSBudWxsO1xuICB2YXIgbWl4Um91bmQsIG1hc2hSb3VuZDtcbiAgdmFyIGksIGosIEsgPSBbXTtcblxuICAvKiBFeHBhbmQga2V5IGFuZCBmaWxsIGludG8gS1tdIEFycmF5ICovXG4gIGtleSA9IGZvcmdlLnJjMi5leHBhbmRLZXkoa2V5LCBiaXRzKTtcbiAgZm9yKGkgPSAwOyBpIDwgNjQ7IGkrKykge1xuICAgIEsucHVzaChrZXkuZ2V0SW50MTZMZSgpKTtcbiAgfVxuXG4gIGlmKGVuY3J5cHQpIHtcbiAgICAvKipcbiAgICAgKiBQZXJmb3JtIG9uZSBtaXhpbmcgcm91bmQgXCJpbiBwbGFjZVwiLlxuICAgICAqXG4gICAgICogQHBhcmFtIFIgQXJyYXkgb2YgZm91ciB3b3JkcyB0byBwZXJmb3JtIG1peGluZyBvbi5cbiAgICAgKi9cbiAgICBtaXhSb3VuZCA9IGZ1bmN0aW9uKFIpIHtcbiAgICAgIGZvcihpID0gMDsgaSA8IDQ7IGkrKykge1xuICAgICAgICBSW2ldICs9IEtbal0gKyAoUlsoaSArIDMpICUgNF0gJiBSWyhpICsgMikgJSA0XSkgK1xuICAgICAgICAgICgoflJbKGkgKyAzKSAlIDRdKSAmIFJbKGkgKyAxKSAlIDRdKTtcbiAgICAgICAgUltpXSA9IHJvbChSW2ldLCBzW2ldKTtcbiAgICAgICAgaisrO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBQZXJmb3JtIG9uZSBtYXNoaW5nIHJvdW5kIFwiaW4gcGxhY2VcIi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBSIEFycmF5IG9mIGZvdXIgd29yZHMgdG8gcGVyZm9ybSBtYXNoaW5nIG9uLlxuICAgICAqL1xuICAgIG1hc2hSb3VuZCA9IGZ1bmN0aW9uKFIpIHtcbiAgICAgIGZvcihpID0gMDsgaSA8IDQ7IGkrKykge1xuICAgICAgICBSW2ldICs9IEtbUlsoaSArIDMpICUgNF0gJiA2M107XG4gICAgICB9XG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICAvKipcbiAgICAgKiBQZXJmb3JtIG9uZSByLW1peGluZyByb3VuZCBcImluIHBsYWNlXCIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gUiBBcnJheSBvZiBmb3VyIHdvcmRzIHRvIHBlcmZvcm0gbWl4aW5nIG9uLlxuICAgICAqL1xuICAgIG1peFJvdW5kID0gZnVuY3Rpb24oUikge1xuICAgICAgZm9yKGkgPSAzOyBpID49IDA7IGktLSkge1xuICAgICAgICBSW2ldID0gcm9yKFJbaV0sIHNbaV0pO1xuICAgICAgICBSW2ldIC09IEtbal0gKyAoUlsoaSArIDMpICUgNF0gJiBSWyhpICsgMikgJSA0XSkgK1xuICAgICAgICAgICgoflJbKGkgKyAzKSAlIDRdKSAmIFJbKGkgKyAxKSAlIDRdKTtcbiAgICAgICAgai0tO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBQZXJmb3JtIG9uZSByLW1hc2hpbmcgcm91bmQgXCJpbiBwbGFjZVwiLlxuICAgICAqXG4gICAgICogQHBhcmFtIFIgQXJyYXkgb2YgZm91ciB3b3JkcyB0byBwZXJmb3JtIG1hc2hpbmcgb24uXG4gICAgICovXG4gICAgbWFzaFJvdW5kID0gZnVuY3Rpb24oUikge1xuICAgICAgZm9yKGkgPSAzOyBpID49IDA7IGktLSkge1xuICAgICAgICBSW2ldIC09IEtbUlsoaSArIDMpICUgNF0gJiA2M107XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW4gdGhlIHNwZWNpZmllZCBjaXBoZXIgZXhlY3V0aW9uIHBsYW4uXG4gICAqXG4gICAqIFRoaXMgZnVuY3Rpb24gdGFrZXMgZm91ciB3b3JkcyBmcm9tIHRoZSBpbnB1dCBidWZmZXIsIGFwcGxpZXMgdGhlIElWIG9uXG4gICAqIGl0IChpZiByZXF1ZXN0ZWQpIGFuZCBydW5zIHRoZSBwcm92aWRlZCBleGVjdXRpb24gcGxhbi5cbiAgICpcbiAgICogVGhlIHBsYW4gbXVzdCBiZSBwdXQgdG9nZXRoZXIgaW4gZm9ybSBvZiBhIGFycmF5IG9mIGFycmF5cy4gIFdoZXJlIHRoZVxuICAgKiBvdXRlciBvbmUgaXMgc2ltcGx5IGEgbGlzdCBvZiBzdGVwcyB0byBwZXJmb3JtIGFuZCB0aGUgaW5uZXIgb25lIG5lZWRzXG4gICAqIHRvIGhhdmUgdHdvIGVsZW1lbnRzOiB0aGUgZmlyc3Qgb25lIHRlbGxpbmcgaG93IG1hbnkgcm91bmRzIHRvIHBlcmZvcm0sXG4gICAqIHRoZSBzZWNvbmQgb25lIHRlbGxpbmcgd2hhdCB0byBkbyAoaS5lLiB0aGUgZnVuY3Rpb24gdG8gY2FsbCkuXG4gICAqXG4gICAqIEBwYXJhbSB7QXJyYXl9IHBsYW4gVGhlIHBsYW4gdG8gZXhlY3V0ZS5cbiAgICovXG4gIHZhciBydW5QbGFuID0gZnVuY3Rpb24ocGxhbikge1xuICAgIHZhciBSID0gW107XG5cbiAgICAvKiBHZXQgZGF0YSBmcm9tIGlucHV0IGJ1ZmZlciBhbmQgZmlsbCB0aGUgZm91ciB3b3JkcyBpbnRvIFIgKi9cbiAgICBmb3IoaSA9IDA7IGkgPCA0OyBpKyspIHtcbiAgICAgIHZhciB2YWwgPSBfaW5wdXQuZ2V0SW50MTZMZSgpO1xuXG4gICAgICBpZihfaXYgIT09IG51bGwpIHtcbiAgICAgICAgaWYoZW5jcnlwdCkge1xuICAgICAgICAgIC8qIFdlJ3JlIGVuY3J5cHRpbmcsIGFwcGx5IHRoZSBJViBmaXJzdC4gKi9cbiAgICAgICAgICB2YWwgXj0gX2l2LmdldEludDE2TGUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvKiBXZSdyZSBkZWNyeXB0aW9uLCBrZWVwIGNpcGhlciB0ZXh0IGZvciBuZXh0IGJsb2NrLiAqL1xuICAgICAgICAgIF9pdi5wdXRJbnQxNkxlKHZhbCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgUi5wdXNoKHZhbCAmIDB4ZmZmZik7XG4gICAgfVxuXG4gICAgLyogUmVzZXQgZ2xvYmFsIFwialwiIHZhcmlhYmxlIGFzIHBlciBzcGVjLiAqL1xuICAgIGogPSBlbmNyeXB0ID8gMCA6IDYzO1xuXG4gICAgLyogUnVuIGV4ZWN1dGlvbiBwbGFuLiAqL1xuICAgIGZvcih2YXIgcHRyID0gMDsgcHRyIDwgcGxhbi5sZW5ndGg7IHB0cisrKSB7XG4gICAgICBmb3IodmFyIGN0ciA9IDA7IGN0ciA8IHBsYW5bcHRyXVswXTsgY3RyKyspIHtcbiAgICAgICAgcGxhbltwdHJdWzFdKFIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qIFdyaXRlIGJhY2sgcmVzdWx0IHRvIG91dHB1dCBidWZmZXIuICovXG4gICAgZm9yKGkgPSAwOyBpIDwgNDsgaSsrKSB7XG4gICAgICBpZihfaXYgIT09IG51bGwpIHtcbiAgICAgICAgaWYoZW5jcnlwdCkge1xuICAgICAgICAgIC8qIFdlJ3JlIGVuY3J5cHRpbmcgaW4gQ0JDLW1vZGUsIGZlZWQgYmFjayBlbmNyeXB0ZWQgYnl0ZXMgaW50b1xuICAgICAgICAgICAgIElWIGJ1ZmZlciB0byBjYXJyeSBpdCBmb3J3YXJkIHRvIG5leHQgYmxvY2suICovXG4gICAgICAgICAgX2l2LnB1dEludDE2TGUoUltpXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgUltpXSBePSBfaXYuZ2V0SW50MTZMZSgpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIF9vdXRwdXQucHV0SW50MTZMZShSW2ldKTtcbiAgICB9XG4gIH07XG5cbiAgLyogQ3JlYXRlIGNpcGhlciBvYmplY3QgKi9cbiAgdmFyIGNpcGhlciA9IG51bGw7XG4gIGNpcGhlciA9IHtcbiAgICAvKipcbiAgICAgKiBTdGFydHMgb3IgcmVzdGFydHMgdGhlIGVuY3J5cHRpb24gb3IgZGVjcnlwdGlvbiBwcm9jZXNzLCB3aGljaGV2ZXJcbiAgICAgKiB3YXMgcHJldmlvdXNseSBjb25maWd1cmVkLlxuICAgICAqXG4gICAgICogVG8gdXNlIHRoZSBjaXBoZXIgaW4gQ0JDIG1vZGUsIGl2IG1heSBiZSBnaXZlbiBlaXRoZXIgYXMgYSBzdHJpbmdcbiAgICAgKiBvZiBieXRlcywgb3IgYXMgYSBieXRlIGJ1ZmZlci4gIEZvciBFQ0IgbW9kZSwgZ2l2ZSBudWxsIGFzIGl2LlxuICAgICAqXG4gICAgICogQHBhcmFtIGl2IHRoZSBpbml0aWFsaXphdGlvbiB2ZWN0b3IgdG8gdXNlLCBudWxsIGZvciBFQ0IgbW9kZS5cbiAgICAgKiBAcGFyYW0gb3V0cHV0IHRoZSBvdXRwdXQgdGhlIGJ1ZmZlciB0byB3cml0ZSB0bywgbnVsbCB0byBjcmVhdGUgb25lLlxuICAgICAqL1xuICAgIHN0YXJ0OiBmdW5jdGlvbihpdiwgb3V0cHV0KSB7XG4gICAgICBpZihpdikge1xuICAgICAgICAvKiBDQkMgbW9kZSAqL1xuICAgICAgICBpZih0eXBlb2YgaXYgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgaXYgPSBmb3JnZS51dGlsLmNyZWF0ZUJ1ZmZlcihpdik7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgX2ZpbmlzaCA9IGZhbHNlO1xuICAgICAgX2lucHV0ID0gZm9yZ2UudXRpbC5jcmVhdGVCdWZmZXIoKTtcbiAgICAgIF9vdXRwdXQgPSBvdXRwdXQgfHwgbmV3IGZvcmdlLnV0aWwuY3JlYXRlQnVmZmVyKCk7XG4gICAgICBfaXYgPSBpdjtcblxuICAgICAgY2lwaGVyLm91dHB1dCA9IF9vdXRwdXQ7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZXMgdGhlIG5leHQgYmxvY2suXG4gICAgICpcbiAgICAgKiBAcGFyYW0gaW5wdXQgdGhlIGJ1ZmZlciB0byByZWFkIGZyb20uXG4gICAgICovXG4gICAgdXBkYXRlOiBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgaWYoIV9maW5pc2gpIHtcbiAgICAgICAgLy8gbm90IGZpbmlzaGluZywgc28gZmlsbCB0aGUgaW5wdXQgYnVmZmVyIHdpdGggbW9yZSBpbnB1dFxuICAgICAgICBfaW5wdXQucHV0QnVmZmVyKGlucHV0KTtcbiAgICAgIH1cblxuICAgICAgd2hpbGUoX2lucHV0Lmxlbmd0aCgpID49IDgpIHtcbiAgICAgICAgcnVuUGxhbihbXG4gICAgICAgICAgICBbIDUsIG1peFJvdW5kIF0sXG4gICAgICAgICAgICBbIDEsIG1hc2hSb3VuZCBdLFxuICAgICAgICAgICAgWyA2LCBtaXhSb3VuZCBdLFxuICAgICAgICAgICAgWyAxLCBtYXNoUm91bmQgXSxcbiAgICAgICAgICAgIFsgNSwgbWl4Um91bmQgXVxuICAgICAgICAgIF0pO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBGaW5pc2hlcyBlbmNyeXB0aW5nIG9yIGRlY3J5cHRpbmcuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcGFkIGEgcGFkZGluZyBmdW5jdGlvbiB0byB1c2UsIG51bGwgZm9yIFBLQ1MjNyBwYWRkaW5nLFxuICAgICAqICAgICAgICAgICBzaWduYXR1cmUoYmxvY2tTaXplLCBidWZmZXIsIGRlY3J5cHQpLlxuICAgICAqXG4gICAgICogQHJldHVybiB0cnVlIGlmIHN1Y2Nlc3NmdWwsIGZhbHNlIG9uIGVycm9yLlxuICAgICAqL1xuICAgIGZpbmlzaDogZnVuY3Rpb24ocGFkKSB7XG4gICAgICB2YXIgcnZhbCA9IHRydWU7XG5cbiAgICAgIGlmKGVuY3J5cHQpIHtcbiAgICAgICAgaWYocGFkKSB7XG4gICAgICAgICAgcnZhbCA9IHBhZCg4LCBfaW5wdXQsICFlbmNyeXB0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBhZGQgUEtDUyM3IHBhZGRpbmcgdG8gYmxvY2sgKGVhY2ggcGFkIGJ5dGUgaXMgdGhlXG4gICAgICAgICAgLy8gdmFsdWUgb2YgdGhlIG51bWJlciBvZiBwYWQgYnl0ZXMpXG4gICAgICAgICAgdmFyIHBhZGRpbmcgPSAoX2lucHV0Lmxlbmd0aCgpID09PSA4KSA/IDggOiAoOCAtIF9pbnB1dC5sZW5ndGgoKSk7XG4gICAgICAgICAgX2lucHV0LmZpbGxXaXRoQnl0ZShwYWRkaW5nLCBwYWRkaW5nKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZihydmFsKSB7XG4gICAgICAgIC8vIGRvIGZpbmFsIHVwZGF0ZVxuICAgICAgICBfZmluaXNoID0gdHJ1ZTtcbiAgICAgICAgY2lwaGVyLnVwZGF0ZSgpO1xuICAgICAgfVxuXG4gICAgICBpZighZW5jcnlwdCkge1xuICAgICAgICAvLyBjaGVjayBmb3IgZXJyb3I6IGlucHV0IGRhdGEgbm90IGEgbXVsdGlwbGUgb2YgYmxvY2sgc2l6ZVxuICAgICAgICBydmFsID0gKF9pbnB1dC5sZW5ndGgoKSA9PT0gMCk7XG4gICAgICAgIGlmKHJ2YWwpIHtcbiAgICAgICAgICBpZihwYWQpIHtcbiAgICAgICAgICAgIHJ2YWwgPSBwYWQoOCwgX291dHB1dCwgIWVuY3J5cHQpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBlbnN1cmUgcGFkZGluZyBieXRlIGNvdW50IGlzIHZhbGlkXG4gICAgICAgICAgICB2YXIgbGVuID0gX291dHB1dC5sZW5ndGgoKTtcbiAgICAgICAgICAgIHZhciBjb3VudCA9IF9vdXRwdXQuYXQobGVuIC0gMSk7XG5cbiAgICAgICAgICAgIGlmKGNvdW50ID4gbGVuKSB7XG4gICAgICAgICAgICAgIHJ2YWwgPSBmYWxzZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIHRyaW0gb2ZmIHBhZGRpbmcgYnl0ZXNcbiAgICAgICAgICAgICAgX291dHB1dC50cnVuY2F0ZShjb3VudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBydmFsO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gY2lwaGVyO1xufTtcblxuLyoqXG4gKiBDcmVhdGVzIGFuIFJDMiBjaXBoZXIgb2JqZWN0IHRvIGVuY3J5cHQgZGF0YSBpbiBFQ0Igb3IgQ0JDIG1vZGUgdXNpbmcgdGhlXG4gKiBnaXZlbiBzeW1tZXRyaWMga2V5LiBUaGUgb3V0cHV0IHdpbGwgYmUgc3RvcmVkIGluIHRoZSAnb3V0cHV0JyBtZW1iZXJcbiAqIG9mIHRoZSByZXR1cm5lZCBjaXBoZXIuXG4gKlxuICogVGhlIGtleSBhbmQgaXYgbWF5IGJlIGdpdmVuIGFzIGEgc3RyaW5nIG9mIGJ5dGVzIG9yIGEgYnl0ZSBidWZmZXIuXG4gKiBUaGUgY2lwaGVyIGlzIGluaXRpYWxpemVkIHRvIHVzZSAxMjggZWZmZWN0aXZlIGtleSBiaXRzLlxuICpcbiAqIEBwYXJhbSBrZXkgdGhlIHN5bW1ldHJpYyBrZXkgdG8gdXNlLlxuICogQHBhcmFtIGl2IHRoZSBpbml0aWFsaXphdGlvbiB2ZWN0b3IgdG8gdXNlLlxuICogQHBhcmFtIG91dHB1dCB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvLCBudWxsIHRvIGNyZWF0ZSBvbmUuXG4gKlxuICogQHJldHVybiB0aGUgY2lwaGVyLlxuICovXG5mb3JnZS5yYzIuc3RhcnRFbmNyeXB0aW5nID0gZnVuY3Rpb24oa2V5LCBpdiwgb3V0cHV0KSB7XG4gIHZhciBjaXBoZXIgPSBmb3JnZS5yYzIuY3JlYXRlRW5jcnlwdGlvbkNpcGhlcihrZXksIDEyOCk7XG4gIGNpcGhlci5zdGFydChpdiwgb3V0cHV0KTtcbiAgcmV0dXJuIGNpcGhlcjtcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBSQzIgY2lwaGVyIG9iamVjdCB0byBlbmNyeXB0IGRhdGEgaW4gRUNCIG9yIENCQyBtb2RlIHVzaW5nIHRoZVxuICogZ2l2ZW4gc3ltbWV0cmljIGtleS5cbiAqXG4gKiBUaGUga2V5IG1heSBiZSBnaXZlbiBhcyBhIHN0cmluZyBvZiBieXRlcyBvciBhIGJ5dGUgYnVmZmVyLlxuICpcbiAqIFRvIHN0YXJ0IGVuY3J5cHRpbmcgY2FsbCBzdGFydCgpIG9uIHRoZSBjaXBoZXIgd2l0aCBhbiBpdiBhbmQgb3B0aW9uYWxcbiAqIG91dHB1dCBidWZmZXIuXG4gKlxuICogQHBhcmFtIGtleSB0aGUgc3ltbWV0cmljIGtleSB0byB1c2UuXG4gKlxuICogQHJldHVybiB0aGUgY2lwaGVyLlxuICovXG5mb3JnZS5yYzIuY3JlYXRlRW5jcnlwdGlvbkNpcGhlciA9IGZ1bmN0aW9uKGtleSwgYml0cykge1xuICByZXR1cm4gY3JlYXRlQ2lwaGVyKGtleSwgYml0cywgdHJ1ZSk7XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gUkMyIGNpcGhlciBvYmplY3QgdG8gZGVjcnlwdCBkYXRhIGluIEVDQiBvciBDQkMgbW9kZSB1c2luZyB0aGVcbiAqIGdpdmVuIHN5bW1ldHJpYyBrZXkuIFRoZSBvdXRwdXQgd2lsbCBiZSBzdG9yZWQgaW4gdGhlICdvdXRwdXQnIG1lbWJlclxuICogb2YgdGhlIHJldHVybmVkIGNpcGhlci5cbiAqXG4gKiBUaGUga2V5IGFuZCBpdiBtYXkgYmUgZ2l2ZW4gYXMgYSBzdHJpbmcgb2YgYnl0ZXMgb3IgYSBieXRlIGJ1ZmZlci5cbiAqIFRoZSBjaXBoZXIgaXMgaW5pdGlhbGl6ZWQgdG8gdXNlIDEyOCBlZmZlY3RpdmUga2V5IGJpdHMuXG4gKlxuICogQHBhcmFtIGtleSB0aGUgc3ltbWV0cmljIGtleSB0byB1c2UuXG4gKiBAcGFyYW0gaXYgdGhlIGluaXRpYWxpemF0aW9uIHZlY3RvciB0byB1c2UuXG4gKiBAcGFyYW0gb3V0cHV0IHRoZSBidWZmZXIgdG8gd3JpdGUgdG8sIG51bGwgdG8gY3JlYXRlIG9uZS5cbiAqXG4gKiBAcmV0dXJuIHRoZSBjaXBoZXIuXG4gKi9cbmZvcmdlLnJjMi5zdGFydERlY3J5cHRpbmcgPSBmdW5jdGlvbihrZXksIGl2LCBvdXRwdXQpIHtcbiAgdmFyIGNpcGhlciA9IGZvcmdlLnJjMi5jcmVhdGVEZWNyeXB0aW9uQ2lwaGVyKGtleSwgMTI4KTtcbiAgY2lwaGVyLnN0YXJ0KGl2LCBvdXRwdXQpO1xuICByZXR1cm4gY2lwaGVyO1xufTtcblxuLyoqXG4gKiBDcmVhdGVzIGFuIFJDMiBjaXBoZXIgb2JqZWN0IHRvIGRlY3J5cHQgZGF0YSBpbiBFQ0Igb3IgQ0JDIG1vZGUgdXNpbmcgdGhlXG4gKiBnaXZlbiBzeW1tZXRyaWMga2V5LlxuICpcbiAqIFRoZSBrZXkgbWF5IGJlIGdpdmVuIGFzIGEgc3RyaW5nIG9mIGJ5dGVzIG9yIGEgYnl0ZSBidWZmZXIuXG4gKlxuICogVG8gc3RhcnQgZGVjcnlwdGluZyBjYWxsIHN0YXJ0KCkgb24gdGhlIGNpcGhlciB3aXRoIGFuIGl2IGFuZCBvcHRpb25hbFxuICogb3V0cHV0IGJ1ZmZlci5cbiAqXG4gKiBAcGFyYW0ga2V5IHRoZSBzeW1tZXRyaWMga2V5IHRvIHVzZS5cbiAqXG4gKiBAcmV0dXJuIHRoZSBjaXBoZXIuXG4gKi9cbmZvcmdlLnJjMi5jcmVhdGVEZWNyeXB0aW9uQ2lwaGVyID0gZnVuY3Rpb24oa2V5LCBiaXRzKSB7XG4gIHJldHVybiBjcmVhdGVDaXBoZXIoa2V5LCBiaXRzLCBmYWxzZSk7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///84\n")},function(module,exports,__webpack_require__){eval("/**\n * Partial implementation of PKCS#1 v2.2: RSA-OEAP\n *\n * Modified but based on the following MIT and BSD licensed code:\n *\n * https://github.com/kjur/jsjws/blob/master/rsa.js:\n *\n * The 'jsjws'(JSON Web Signature JavaScript Library) License\n *\n * Copyright (c) 2012 Kenji Urushima\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * http://webrsa.cvs.sourceforge.net/viewvc/webrsa/Client/RSAES-OAEP.js?content-type=text%2Fplain:\n *\n * RSAES-OAEP.js\n * $Id: RSAES-OAEP.js,v 1.1.1.1 2003/03/19 15:37:20 ellispritchard Exp $\n * JavaScript Implementation of PKCS #1 v2.1 RSA CRYPTOGRAPHY STANDARD (RSA Laboratories, June 14, 2002)\n * Copyright (C) Ellis Pritchard, Guardian Unlimited 2003.\n * Contact: ellis@nukinetics.com\n * Distributed under the BSD License.\n *\n * Official documentation: http://www.rsa.com/rsalabs/node.asp?id=2125\n *\n * @author Evan Jones (http://evanjones.ca/)\n * @author Dave Longley\n *\n * Copyright (c) 2013-2014 Digital Bazaar, Inc.\n */\nvar forge = __webpack_require__(4);\n__webpack_require__(7);\n__webpack_require__(13);\n__webpack_require__(32);\n\n// shortcut for PKCS#1 API\nvar pkcs1 = module.exports = forge.pkcs1 = forge.pkcs1 || {};\n\n/**\n * Encode the given RSAES-OAEP message (M) using key, with optional label (L)\n * and seed.\n *\n * This method does not perform RSA encryption, it only encodes the message\n * using RSAES-OAEP.\n *\n * @param key the RSA key to use.\n * @param message the message to encode.\n * @param options the options to use:\n *          label an optional label to use.\n *          seed the seed to use.\n *          md the message digest object to use, undefined for SHA-1.\n *          mgf1 optional mgf1 parameters:\n *            md the message digest object to use for MGF1.\n *\n * @return the encoded message bytes.\n */\npkcs1.encode_rsa_oaep = function(key, message, options) {\n  // parse arguments\n  var label;\n  var seed;\n  var md;\n  var mgf1Md;\n  // legacy args (label, seed, md)\n  if(typeof options === 'string') {\n    label = options;\n    seed = arguments[3] || undefined;\n    md = arguments[4] || undefined;\n  } else if(options) {\n    label = options.label || undefined;\n    seed = options.seed || undefined;\n    md = options.md || undefined;\n    if(options.mgf1 && options.mgf1.md) {\n      mgf1Md = options.mgf1.md;\n    }\n  }\n\n  // default OAEP to SHA-1 message digest\n  if(!md) {\n    md = forge.md.sha1.create();\n  } else {\n    md.start();\n  }\n\n  // default MGF-1 to same as OAEP\n  if(!mgf1Md) {\n    mgf1Md = md;\n  }\n\n  // compute length in bytes and check output\n  var keyLength = Math.ceil(key.n.bitLength() / 8);\n  var maxLength = keyLength - 2 * md.digestLength - 2;\n  if(message.length > maxLength) {\n    var error = new Error('RSAES-OAEP input message length is too long.');\n    error.length = message.length;\n    error.maxLength = maxLength;\n    throw error;\n  }\n\n  if(!label) {\n    label = '';\n  }\n  md.update(label, 'raw');\n  var lHash = md.digest();\n\n  var PS = '';\n  var PS_length = maxLength - message.length;\n  for(var i = 0; i < PS_length; i++) {\n    PS += '\\x00';\n  }\n\n  var DB = lHash.getBytes() + PS + '\\x01' + message;\n\n  if(!seed) {\n    seed = forge.random.getBytes(md.digestLength);\n  } else if(seed.length !== md.digestLength) {\n    var error = new Error('Invalid RSAES-OAEP seed. The seed length must ' +\n      'match the digest length.');\n    error.seedLength = seed.length;\n    error.digestLength = md.digestLength;\n    throw error;\n  }\n\n  var dbMask = rsa_mgf1(seed, keyLength - md.digestLength - 1, mgf1Md);\n  var maskedDB = forge.util.xorBytes(DB, dbMask, DB.length);\n\n  var seedMask = rsa_mgf1(maskedDB, md.digestLength, mgf1Md);\n  var maskedSeed = forge.util.xorBytes(seed, seedMask, seed.length);\n\n  // return encoded message\n  return '\\x00' + maskedSeed + maskedDB;\n};\n\n/**\n * Decode the given RSAES-OAEP encoded message (EM) using key, with optional\n * label (L).\n *\n * This method does not perform RSA decryption, it only decodes the message\n * using RSAES-OAEP.\n *\n * @param key the RSA key to use.\n * @param em the encoded message to decode.\n * @param options the options to use:\n *          label an optional label to use.\n *          md the message digest object to use for OAEP, undefined for SHA-1.\n *          mgf1 optional mgf1 parameters:\n *            md the message digest object to use for MGF1.\n *\n * @return the decoded message bytes.\n */\npkcs1.decode_rsa_oaep = function(key, em, options) {\n  // parse args\n  var label;\n  var md;\n  var mgf1Md;\n  // legacy args\n  if(typeof options === 'string') {\n    label = options;\n    md = arguments[3] || undefined;\n  } else if(options) {\n    label = options.label || undefined;\n    md = options.md || undefined;\n    if(options.mgf1 && options.mgf1.md) {\n      mgf1Md = options.mgf1.md;\n    }\n  }\n\n  // compute length in bytes\n  var keyLength = Math.ceil(key.n.bitLength() / 8);\n\n  if(em.length !== keyLength) {\n    var error = new Error('RSAES-OAEP encoded message length is invalid.');\n    error.length = em.length;\n    error.expectedLength = keyLength;\n    throw error;\n  }\n\n  // default OAEP to SHA-1 message digest\n  if(md === undefined) {\n    md = forge.md.sha1.create();\n  } else {\n    md.start();\n  }\n\n  // default MGF-1 to same as OAEP\n  if(!mgf1Md) {\n    mgf1Md = md;\n  }\n\n  if(keyLength < 2 * md.digestLength + 2) {\n    throw new Error('RSAES-OAEP key is too short for the hash function.');\n  }\n\n  if(!label) {\n    label = '';\n  }\n  md.update(label, 'raw');\n  var lHash = md.digest().getBytes();\n\n  // split the message into its parts\n  var y = em.charAt(0);\n  var maskedSeed = em.substring(1, md.digestLength + 1);\n  var maskedDB = em.substring(1 + md.digestLength);\n\n  var seedMask = rsa_mgf1(maskedDB, md.digestLength, mgf1Md);\n  var seed = forge.util.xorBytes(maskedSeed, seedMask, maskedSeed.length);\n\n  var dbMask = rsa_mgf1(seed, keyLength - md.digestLength - 1, mgf1Md);\n  var db = forge.util.xorBytes(maskedDB, dbMask, maskedDB.length);\n\n  var lHashPrime = db.substring(0, md.digestLength);\n\n  // constant time check that all values match what is expected\n  var error = (y !== '\\x00');\n\n  // constant time check lHash vs lHashPrime\n  for(var i = 0; i < md.digestLength; ++i) {\n    error |= (lHash.charAt(i) !== lHashPrime.charAt(i));\n  }\n\n  // \"constant time\" find the 0x1 byte separating the padding (zeros) from the\n  // message\n  // TODO: It must be possible to do this in a better/smarter way?\n  var in_ps = 1;\n  var index = md.digestLength;\n  for(var j = md.digestLength; j < db.length; j++) {\n    var code = db.charCodeAt(j);\n\n    var is_0 = (code & 0x1) ^ 0x1;\n\n    // non-zero if not 0 or 1 in the ps section\n    var error_mask = in_ps ? 0xfffe : 0x0000;\n    error |= (code & error_mask);\n\n    // latch in_ps to zero after we find 0x1\n    in_ps = in_ps & is_0;\n    index += in_ps;\n  }\n\n  if(error || db.charCodeAt(index) !== 0x1) {\n    throw new Error('Invalid RSAES-OAEP padding.');\n  }\n\n  return db.substring(index + 1);\n};\n\nfunction rsa_mgf1(seed, maskLength, hash) {\n  // default to SHA-1 message digest\n  if(!hash) {\n    hash = forge.md.sha1.create();\n  }\n  var t = '';\n  var count = Math.ceil(maskLength / hash.digestLength);\n  for(var i = 0; i < count; ++i) {\n    var c = String.fromCharCode(\n      (i >> 24) & 0xFF, (i >> 16) & 0xFF, (i >> 8) & 0xFF, i & 0xFF);\n    hash.start();\n    hash.update(seed + c);\n    t += hash.digest().getBytes();\n  }\n  return t.substring(0, maskLength);\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODUuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbm9kZS1mb3JnZS9saWIvcGtjczEuanM/ZDE0OCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFBhcnRpYWwgaW1wbGVtZW50YXRpb24gb2YgUEtDUyMxIHYyLjI6IFJTQS1PRUFQXG4gKlxuICogTW9kaWZpZWQgYnV0IGJhc2VkIG9uIHRoZSBmb2xsb3dpbmcgTUlUIGFuZCBCU0QgbGljZW5zZWQgY29kZTpcbiAqXG4gKiBodHRwczovL2dpdGh1Yi5jb20va2p1ci9qc2p3cy9ibG9iL21hc3Rlci9yc2EuanM6XG4gKlxuICogVGhlICdqc2p3cycoSlNPTiBXZWIgU2lnbmF0dXJlIEphdmFTY3JpcHQgTGlicmFyeSkgTGljZW5zZVxuICpcbiAqIENvcHlyaWdodCAoYykgMjAxMiBLZW5qaSBVcnVzaGltYVxuICpcbiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbiAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbiAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbiAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbiAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbiAqXG4gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4gKlxuICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbiAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4gKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4gKiBUSEUgU09GVFdBUkUuXG4gKlxuICogaHR0cDovL3dlYnJzYS5jdnMuc291cmNlZm9yZ2UubmV0L3ZpZXd2Yy93ZWJyc2EvQ2xpZW50L1JTQUVTLU9BRVAuanM/Y29udGVudC10eXBlPXRleHQlMkZwbGFpbjpcbiAqXG4gKiBSU0FFUy1PQUVQLmpzXG4gKiAkSWQ6IFJTQUVTLU9BRVAuanMsdiAxLjEuMS4xIDIwMDMvMDMvMTkgMTU6Mzc6MjAgZWxsaXNwcml0Y2hhcmQgRXhwICRcbiAqIEphdmFTY3JpcHQgSW1wbGVtZW50YXRpb24gb2YgUEtDUyAjMSB2Mi4xIFJTQSBDUllQVE9HUkFQSFkgU1RBTkRBUkQgKFJTQSBMYWJvcmF0b3JpZXMsIEp1bmUgMTQsIDIwMDIpXG4gKiBDb3B5cmlnaHQgKEMpIEVsbGlzIFByaXRjaGFyZCwgR3VhcmRpYW4gVW5saW1pdGVkIDIwMDMuXG4gKiBDb250YWN0OiBlbGxpc0BudWtpbmV0aWNzLmNvbVxuICogRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJTRCBMaWNlbnNlLlxuICpcbiAqIE9mZmljaWFsIGRvY3VtZW50YXRpb246IGh0dHA6Ly93d3cucnNhLmNvbS9yc2FsYWJzL25vZGUuYXNwP2lkPTIxMjVcbiAqXG4gKiBAYXV0aG9yIEV2YW4gSm9uZXMgKGh0dHA6Ly9ldmFuam9uZXMuY2EvKVxuICogQGF1dGhvciBEYXZlIExvbmdsZXlcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNCBEaWdpdGFsIEJhemFhciwgSW5jLlxuICovXG52YXIgZm9yZ2UgPSByZXF1aXJlKCcuL2ZvcmdlJyk7XG5yZXF1aXJlKCcuL3V0aWwnKTtcbnJlcXVpcmUoJy4vcmFuZG9tJyk7XG5yZXF1aXJlKCcuL3NoYTEnKTtcblxuLy8gc2hvcnRjdXQgZm9yIFBLQ1MjMSBBUElcbnZhciBwa2NzMSA9IG1vZHVsZS5leHBvcnRzID0gZm9yZ2UucGtjczEgPSBmb3JnZS5wa2NzMSB8fCB7fTtcblxuLyoqXG4gKiBFbmNvZGUgdGhlIGdpdmVuIFJTQUVTLU9BRVAgbWVzc2FnZSAoTSkgdXNpbmcga2V5LCB3aXRoIG9wdGlvbmFsIGxhYmVsIChMKVxuICogYW5kIHNlZWQuXG4gKlxuICogVGhpcyBtZXRob2QgZG9lcyBub3QgcGVyZm9ybSBSU0EgZW5jcnlwdGlvbiwgaXQgb25seSBlbmNvZGVzIHRoZSBtZXNzYWdlXG4gKiB1c2luZyBSU0FFUy1PQUVQLlxuICpcbiAqIEBwYXJhbSBrZXkgdGhlIFJTQSBrZXkgdG8gdXNlLlxuICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UgdG8gZW5jb2RlLlxuICogQHBhcmFtIG9wdGlvbnMgdGhlIG9wdGlvbnMgdG8gdXNlOlxuICogICAgICAgICAgbGFiZWwgYW4gb3B0aW9uYWwgbGFiZWwgdG8gdXNlLlxuICogICAgICAgICAgc2VlZCB0aGUgc2VlZCB0byB1c2UuXG4gKiAgICAgICAgICBtZCB0aGUgbWVzc2FnZSBkaWdlc3Qgb2JqZWN0IHRvIHVzZSwgdW5kZWZpbmVkIGZvciBTSEEtMS5cbiAqICAgICAgICAgIG1nZjEgb3B0aW9uYWwgbWdmMSBwYXJhbWV0ZXJzOlxuICogICAgICAgICAgICBtZCB0aGUgbWVzc2FnZSBkaWdlc3Qgb2JqZWN0IHRvIHVzZSBmb3IgTUdGMS5cbiAqXG4gKiBAcmV0dXJuIHRoZSBlbmNvZGVkIG1lc3NhZ2UgYnl0ZXMuXG4gKi9cbnBrY3MxLmVuY29kZV9yc2Ffb2FlcCA9IGZ1bmN0aW9uKGtleSwgbWVzc2FnZSwgb3B0aW9ucykge1xuICAvLyBwYXJzZSBhcmd1bWVudHNcbiAgdmFyIGxhYmVsO1xuICB2YXIgc2VlZDtcbiAgdmFyIG1kO1xuICB2YXIgbWdmMU1kO1xuICAvLyBsZWdhY3kgYXJncyAobGFiZWwsIHNlZWQsIG1kKVxuICBpZih0eXBlb2Ygb3B0aW9ucyA9PT0gJ3N0cmluZycpIHtcbiAgICBsYWJlbCA9IG9wdGlvbnM7XG4gICAgc2VlZCA9IGFyZ3VtZW50c1szXSB8fCB1bmRlZmluZWQ7XG4gICAgbWQgPSBhcmd1bWVudHNbNF0gfHwgdW5kZWZpbmVkO1xuICB9IGVsc2UgaWYob3B0aW9ucykge1xuICAgIGxhYmVsID0gb3B0aW9ucy5sYWJlbCB8fCB1bmRlZmluZWQ7XG4gICAgc2VlZCA9IG9wdGlvbnMuc2VlZCB8fCB1bmRlZmluZWQ7XG4gICAgbWQgPSBvcHRpb25zLm1kIHx8IHVuZGVmaW5lZDtcbiAgICBpZihvcHRpb25zLm1nZjEgJiYgb3B0aW9ucy5tZ2YxLm1kKSB7XG4gICAgICBtZ2YxTWQgPSBvcHRpb25zLm1nZjEubWQ7XG4gICAgfVxuICB9XG5cbiAgLy8gZGVmYXVsdCBPQUVQIHRvIFNIQS0xIG1lc3NhZ2UgZGlnZXN0XG4gIGlmKCFtZCkge1xuICAgIG1kID0gZm9yZ2UubWQuc2hhMS5jcmVhdGUoKTtcbiAgfSBlbHNlIHtcbiAgICBtZC5zdGFydCgpO1xuICB9XG5cbiAgLy8gZGVmYXVsdCBNR0YtMSB0byBzYW1lIGFzIE9BRVBcbiAgaWYoIW1nZjFNZCkge1xuICAgIG1nZjFNZCA9IG1kO1xuICB9XG5cbiAgLy8gY29tcHV0ZSBsZW5ndGggaW4gYnl0ZXMgYW5kIGNoZWNrIG91dHB1dFxuICB2YXIga2V5TGVuZ3RoID0gTWF0aC5jZWlsKGtleS5uLmJpdExlbmd0aCgpIC8gOCk7XG4gIHZhciBtYXhMZW5ndGggPSBrZXlMZW5ndGggLSAyICogbWQuZGlnZXN0TGVuZ3RoIC0gMjtcbiAgaWYobWVzc2FnZS5sZW5ndGggPiBtYXhMZW5ndGgpIHtcbiAgICB2YXIgZXJyb3IgPSBuZXcgRXJyb3IoJ1JTQUVTLU9BRVAgaW5wdXQgbWVzc2FnZSBsZW5ndGggaXMgdG9vIGxvbmcuJyk7XG4gICAgZXJyb3IubGVuZ3RoID0gbWVzc2FnZS5sZW5ndGg7XG4gICAgZXJyb3IubWF4TGVuZ3RoID0gbWF4TGVuZ3RoO1xuICAgIHRocm93IGVycm9yO1xuICB9XG5cbiAgaWYoIWxhYmVsKSB7XG4gICAgbGFiZWwgPSAnJztcbiAgfVxuICBtZC51cGRhdGUobGFiZWwsICdyYXcnKTtcbiAgdmFyIGxIYXNoID0gbWQuZGlnZXN0KCk7XG5cbiAgdmFyIFBTID0gJyc7XG4gIHZhciBQU19sZW5ndGggPSBtYXhMZW5ndGggLSBtZXNzYWdlLmxlbmd0aDtcbiAgZm9yKHZhciBpID0gMDsgaSA8IFBTX2xlbmd0aDsgaSsrKSB7XG4gICAgUFMgKz0gJ1xceDAwJztcbiAgfVxuXG4gIHZhciBEQiA9IGxIYXNoLmdldEJ5dGVzKCkgKyBQUyArICdcXHgwMScgKyBtZXNzYWdlO1xuXG4gIGlmKCFzZWVkKSB7XG4gICAgc2VlZCA9IGZvcmdlLnJhbmRvbS5nZXRCeXRlcyhtZC5kaWdlc3RMZW5ndGgpO1xuICB9IGVsc2UgaWYoc2VlZC5sZW5ndGggIT09IG1kLmRpZ2VzdExlbmd0aCkge1xuICAgIHZhciBlcnJvciA9IG5ldyBFcnJvcignSW52YWxpZCBSU0FFUy1PQUVQIHNlZWQuIFRoZSBzZWVkIGxlbmd0aCBtdXN0ICcgK1xuICAgICAgJ21hdGNoIHRoZSBkaWdlc3QgbGVuZ3RoLicpO1xuICAgIGVycm9yLnNlZWRMZW5ndGggPSBzZWVkLmxlbmd0aDtcbiAgICBlcnJvci5kaWdlc3RMZW5ndGggPSBtZC5kaWdlc3RMZW5ndGg7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cblxuICB2YXIgZGJNYXNrID0gcnNhX21nZjEoc2VlZCwga2V5TGVuZ3RoIC0gbWQuZGlnZXN0TGVuZ3RoIC0gMSwgbWdmMU1kKTtcbiAgdmFyIG1hc2tlZERCID0gZm9yZ2UudXRpbC54b3JCeXRlcyhEQiwgZGJNYXNrLCBEQi5sZW5ndGgpO1xuXG4gIHZhciBzZWVkTWFzayA9IHJzYV9tZ2YxKG1hc2tlZERCLCBtZC5kaWdlc3RMZW5ndGgsIG1nZjFNZCk7XG4gIHZhciBtYXNrZWRTZWVkID0gZm9yZ2UudXRpbC54b3JCeXRlcyhzZWVkLCBzZWVkTWFzaywgc2VlZC5sZW5ndGgpO1xuXG4gIC8vIHJldHVybiBlbmNvZGVkIG1lc3NhZ2VcbiAgcmV0dXJuICdcXHgwMCcgKyBtYXNrZWRTZWVkICsgbWFza2VkREI7XG59O1xuXG4vKipcbiAqIERlY29kZSB0aGUgZ2l2ZW4gUlNBRVMtT0FFUCBlbmNvZGVkIG1lc3NhZ2UgKEVNKSB1c2luZyBrZXksIHdpdGggb3B0aW9uYWxcbiAqIGxhYmVsIChMKS5cbiAqXG4gKiBUaGlzIG1ldGhvZCBkb2VzIG5vdCBwZXJmb3JtIFJTQSBkZWNyeXB0aW9uLCBpdCBvbmx5IGRlY29kZXMgdGhlIG1lc3NhZ2VcbiAqIHVzaW5nIFJTQUVTLU9BRVAuXG4gKlxuICogQHBhcmFtIGtleSB0aGUgUlNBIGtleSB0byB1c2UuXG4gKiBAcGFyYW0gZW0gdGhlIGVuY29kZWQgbWVzc2FnZSB0byBkZWNvZGUuXG4gKiBAcGFyYW0gb3B0aW9ucyB0aGUgb3B0aW9ucyB0byB1c2U6XG4gKiAgICAgICAgICBsYWJlbCBhbiBvcHRpb25hbCBsYWJlbCB0byB1c2UuXG4gKiAgICAgICAgICBtZCB0aGUgbWVzc2FnZSBkaWdlc3Qgb2JqZWN0IHRvIHVzZSBmb3IgT0FFUCwgdW5kZWZpbmVkIGZvciBTSEEtMS5cbiAqICAgICAgICAgIG1nZjEgb3B0aW9uYWwgbWdmMSBwYXJhbWV0ZXJzOlxuICogICAgICAgICAgICBtZCB0aGUgbWVzc2FnZSBkaWdlc3Qgb2JqZWN0IHRvIHVzZSBmb3IgTUdGMS5cbiAqXG4gKiBAcmV0dXJuIHRoZSBkZWNvZGVkIG1lc3NhZ2UgYnl0ZXMuXG4gKi9cbnBrY3MxLmRlY29kZV9yc2Ffb2FlcCA9IGZ1bmN0aW9uKGtleSwgZW0sIG9wdGlvbnMpIHtcbiAgLy8gcGFyc2UgYXJnc1xuICB2YXIgbGFiZWw7XG4gIHZhciBtZDtcbiAgdmFyIG1nZjFNZDtcbiAgLy8gbGVnYWN5IGFyZ3NcbiAgaWYodHlwZW9mIG9wdGlvbnMgPT09ICdzdHJpbmcnKSB7XG4gICAgbGFiZWwgPSBvcHRpb25zO1xuICAgIG1kID0gYXJndW1lbnRzWzNdIHx8IHVuZGVmaW5lZDtcbiAgfSBlbHNlIGlmKG9wdGlvbnMpIHtcbiAgICBsYWJlbCA9IG9wdGlvbnMubGFiZWwgfHwgdW5kZWZpbmVkO1xuICAgIG1kID0gb3B0aW9ucy5tZCB8fCB1bmRlZmluZWQ7XG4gICAgaWYob3B0aW9ucy5tZ2YxICYmIG9wdGlvbnMubWdmMS5tZCkge1xuICAgICAgbWdmMU1kID0gb3B0aW9ucy5tZ2YxLm1kO1xuICAgIH1cbiAgfVxuXG4gIC8vIGNvbXB1dGUgbGVuZ3RoIGluIGJ5dGVzXG4gIHZhciBrZXlMZW5ndGggPSBNYXRoLmNlaWwoa2V5Lm4uYml0TGVuZ3RoKCkgLyA4KTtcblxuICBpZihlbS5sZW5ndGggIT09IGtleUxlbmd0aCkge1xuICAgIHZhciBlcnJvciA9IG5ldyBFcnJvcignUlNBRVMtT0FFUCBlbmNvZGVkIG1lc3NhZ2UgbGVuZ3RoIGlzIGludmFsaWQuJyk7XG4gICAgZXJyb3IubGVuZ3RoID0gZW0ubGVuZ3RoO1xuICAgIGVycm9yLmV4cGVjdGVkTGVuZ3RoID0ga2V5TGVuZ3RoO1xuICAgIHRocm93IGVycm9yO1xuICB9XG5cbiAgLy8gZGVmYXVsdCBPQUVQIHRvIFNIQS0xIG1lc3NhZ2UgZGlnZXN0XG4gIGlmKG1kID09PSB1bmRlZmluZWQpIHtcbiAgICBtZCA9IGZvcmdlLm1kLnNoYTEuY3JlYXRlKCk7XG4gIH0gZWxzZSB7XG4gICAgbWQuc3RhcnQoKTtcbiAgfVxuXG4gIC8vIGRlZmF1bHQgTUdGLTEgdG8gc2FtZSBhcyBPQUVQXG4gIGlmKCFtZ2YxTWQpIHtcbiAgICBtZ2YxTWQgPSBtZDtcbiAgfVxuXG4gIGlmKGtleUxlbmd0aCA8IDIgKiBtZC5kaWdlc3RMZW5ndGggKyAyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdSU0FFUy1PQUVQIGtleSBpcyB0b28gc2hvcnQgZm9yIHRoZSBoYXNoIGZ1bmN0aW9uLicpO1xuICB9XG5cbiAgaWYoIWxhYmVsKSB7XG4gICAgbGFiZWwgPSAnJztcbiAgfVxuICBtZC51cGRhdGUobGFiZWwsICdyYXcnKTtcbiAgdmFyIGxIYXNoID0gbWQuZGlnZXN0KCkuZ2V0Qnl0ZXMoKTtcblxuICAvLyBzcGxpdCB0aGUgbWVzc2FnZSBpbnRvIGl0cyBwYXJ0c1xuICB2YXIgeSA9IGVtLmNoYXJBdCgwKTtcbiAgdmFyIG1hc2tlZFNlZWQgPSBlbS5zdWJzdHJpbmcoMSwgbWQuZGlnZXN0TGVuZ3RoICsgMSk7XG4gIHZhciBtYXNrZWREQiA9IGVtLnN1YnN0cmluZygxICsgbWQuZGlnZXN0TGVuZ3RoKTtcblxuICB2YXIgc2VlZE1hc2sgPSByc2FfbWdmMShtYXNrZWREQiwgbWQuZGlnZXN0TGVuZ3RoLCBtZ2YxTWQpO1xuICB2YXIgc2VlZCA9IGZvcmdlLnV0aWwueG9yQnl0ZXMobWFza2VkU2VlZCwgc2VlZE1hc2ssIG1hc2tlZFNlZWQubGVuZ3RoKTtcblxuICB2YXIgZGJNYXNrID0gcnNhX21nZjEoc2VlZCwga2V5TGVuZ3RoIC0gbWQuZGlnZXN0TGVuZ3RoIC0gMSwgbWdmMU1kKTtcbiAgdmFyIGRiID0gZm9yZ2UudXRpbC54b3JCeXRlcyhtYXNrZWREQiwgZGJNYXNrLCBtYXNrZWREQi5sZW5ndGgpO1xuXG4gIHZhciBsSGFzaFByaW1lID0gZGIuc3Vic3RyaW5nKDAsIG1kLmRpZ2VzdExlbmd0aCk7XG5cbiAgLy8gY29uc3RhbnQgdGltZSBjaGVjayB0aGF0IGFsbCB2YWx1ZXMgbWF0Y2ggd2hhdCBpcyBleHBlY3RlZFxuICB2YXIgZXJyb3IgPSAoeSAhPT0gJ1xceDAwJyk7XG5cbiAgLy8gY29uc3RhbnQgdGltZSBjaGVjayBsSGFzaCB2cyBsSGFzaFByaW1lXG4gIGZvcih2YXIgaSA9IDA7IGkgPCBtZC5kaWdlc3RMZW5ndGg7ICsraSkge1xuICAgIGVycm9yIHw9IChsSGFzaC5jaGFyQXQoaSkgIT09IGxIYXNoUHJpbWUuY2hhckF0KGkpKTtcbiAgfVxuXG4gIC8vIFwiY29uc3RhbnQgdGltZVwiIGZpbmQgdGhlIDB4MSBieXRlIHNlcGFyYXRpbmcgdGhlIHBhZGRpbmcgKHplcm9zKSBmcm9tIHRoZVxuICAvLyBtZXNzYWdlXG4gIC8vIFRPRE86IEl0IG11c3QgYmUgcG9zc2libGUgdG8gZG8gdGhpcyBpbiBhIGJldHRlci9zbWFydGVyIHdheT9cbiAgdmFyIGluX3BzID0gMTtcbiAgdmFyIGluZGV4ID0gbWQuZGlnZXN0TGVuZ3RoO1xuICBmb3IodmFyIGogPSBtZC5kaWdlc3RMZW5ndGg7IGogPCBkYi5sZW5ndGg7IGorKykge1xuICAgIHZhciBjb2RlID0gZGIuY2hhckNvZGVBdChqKTtcblxuICAgIHZhciBpc18wID0gKGNvZGUgJiAweDEpIF4gMHgxO1xuXG4gICAgLy8gbm9uLXplcm8gaWYgbm90IDAgb3IgMSBpbiB0aGUgcHMgc2VjdGlvblxuICAgIHZhciBlcnJvcl9tYXNrID0gaW5fcHMgPyAweGZmZmUgOiAweDAwMDA7XG4gICAgZXJyb3IgfD0gKGNvZGUgJiBlcnJvcl9tYXNrKTtcblxuICAgIC8vIGxhdGNoIGluX3BzIHRvIHplcm8gYWZ0ZXIgd2UgZmluZCAweDFcbiAgICBpbl9wcyA9IGluX3BzICYgaXNfMDtcbiAgICBpbmRleCArPSBpbl9wcztcbiAgfVxuXG4gIGlmKGVycm9yIHx8IGRiLmNoYXJDb2RlQXQoaW5kZXgpICE9PSAweDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgUlNBRVMtT0FFUCBwYWRkaW5nLicpO1xuICB9XG5cbiAgcmV0dXJuIGRiLnN1YnN0cmluZyhpbmRleCArIDEpO1xufTtcblxuZnVuY3Rpb24gcnNhX21nZjEoc2VlZCwgbWFza0xlbmd0aCwgaGFzaCkge1xuICAvLyBkZWZhdWx0IHRvIFNIQS0xIG1lc3NhZ2UgZGlnZXN0XG4gIGlmKCFoYXNoKSB7XG4gICAgaGFzaCA9IGZvcmdlLm1kLnNoYTEuY3JlYXRlKCk7XG4gIH1cbiAgdmFyIHQgPSAnJztcbiAgdmFyIGNvdW50ID0gTWF0aC5jZWlsKG1hc2tMZW5ndGggLyBoYXNoLmRpZ2VzdExlbmd0aCk7XG4gIGZvcih2YXIgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7XG4gICAgdmFyIGMgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKFxuICAgICAgKGkgPj4gMjQpICYgMHhGRiwgKGkgPj4gMTYpICYgMHhGRiwgKGkgPj4gOCkgJiAweEZGLCBpICYgMHhGRik7XG4gICAgaGFzaC5zdGFydCgpO1xuICAgIGhhc2gudXBkYXRlKHNlZWQgKyBjKTtcbiAgICB0ICs9IGhhc2guZGlnZXN0KCkuZ2V0Qnl0ZXMoKTtcbiAgfVxuICByZXR1cm4gdC5zdWJzdHJpbmcoMCwgbWFza0xlbmd0aCk7XG59XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///85\n")},function(module,exports,__webpack_require__){eval("/**\n * Prime number generation API.\n *\n * @author Dave Longley\n *\n * Copyright (c) 2014 Digital Bazaar, Inc.\n */\nvar forge = __webpack_require__(4);\n__webpack_require__(7);\n__webpack_require__(43);\n__webpack_require__(13);\n\n(function() {\n\n// forge.prime already defined\nif(forge.prime) {\n  module.exports = forge.prime;\n  return;\n}\n\n/* PRIME API */\nvar prime = module.exports = forge.prime = forge.prime || {};\n\nvar BigInteger = forge.jsbn.BigInteger;\n\n// primes are 30k+i for i = 1, 7, 11, 13, 17, 19, 23, 29\nvar GCD_30_DELTA = [6, 4, 2, 4, 2, 4, 6, 2];\nvar THIRTY = new BigInteger(null);\nTHIRTY.fromInt(30);\nvar op_or = function(x, y) {return x|y;};\n\n/**\n * Generates a random probable prime with the given number of bits.\n *\n * Alternative algorithms can be specified by name as a string or as an\n * object with custom options like so:\n *\n * {\n *   name: 'PRIMEINC',\n *   options: {\n *     maxBlockTime: <the maximum amount of time to block the main\n *       thread before allowing I/O other JS to run>,\n *     millerRabinTests: <the number of miller-rabin tests to run>,\n *     workerScript: <the worker script URL>,\n *     workers: <the number of web workers (if supported) to use,\n *       -1 to use estimated cores minus one>.\n *     workLoad: the size of the work load, ie: number of possible prime\n *       numbers for each web worker to check per work assignment,\n *       (default: 100).\n *   }\n * }\n *\n * @param bits the number of bits for the prime number.\n * @param options the options to use.\n *          [algorithm] the algorithm to use (default: 'PRIMEINC').\n *          [prng] a custom crypto-secure pseudo-random number generator to use,\n *            that must define \"getBytesSync\".\n *\n * @return callback(err, num) called once the operation completes.\n */\nprime.generateProbablePrime = function(bits, options, callback) {\n  if(typeof options === 'function') {\n    callback = options;\n    options = {};\n  }\n  options = options || {};\n\n  // default to PRIMEINC algorithm\n  var algorithm = options.algorithm || 'PRIMEINC';\n  if(typeof algorithm === 'string') {\n    algorithm = {name: algorithm};\n  }\n  algorithm.options = algorithm.options || {};\n\n  // create prng with api that matches BigInteger secure random\n  var prng = options.prng || forge.random;\n  var rng = {\n    // x is an array to fill with bytes\n    nextBytes: function(x) {\n      var b = prng.getBytesSync(x.length);\n      for(var i = 0; i < x.length; ++i) {\n        x[i] = b.charCodeAt(i);\n      }\n    }\n  };\n\n  if(algorithm.name === 'PRIMEINC') {\n    return primeincFindPrime(bits, rng, algorithm.options, callback);\n  }\n\n  throw new Error('Invalid prime generation algorithm: ' + algorithm.name);\n};\n\nfunction primeincFindPrime(bits, rng, options, callback) {\n  if('workers' in options) {\n    return primeincFindPrimeWithWorkers(bits, rng, options, callback);\n  }\n  return primeincFindPrimeWithoutWorkers(bits, rng, options, callback);\n}\n\nfunction primeincFindPrimeWithoutWorkers(bits, rng, options, callback) {\n  // initialize random number\n  var num = generateRandom(bits, rng);\n\n  /* Note: All primes are of the form 30k+i for i < 30 and gcd(30, i)=1. The\n  number we are given is always aligned at 30k + 1. Each time the number is\n  determined not to be prime we add to get to the next 'i', eg: if the number\n  was at 30k + 1 we add 6. */\n  var deltaIdx = 0;\n\n  // get required number of MR tests\n  var mrTests = getMillerRabinTests(num.bitLength());\n  if('millerRabinTests' in options) {\n    mrTests = options.millerRabinTests;\n  }\n\n  // find prime nearest to 'num' for maxBlockTime ms\n  // 10 ms gives 5ms of leeway for other calculations before dropping\n  // below 60fps (1000/60 == 16.67), but in reality, the number will\n  // likely be higher due to an 'atomic' big int modPow\n  var maxBlockTime = 10;\n  if('maxBlockTime' in options) {\n    maxBlockTime = options.maxBlockTime;\n  }\n\n  _primeinc(num, bits, rng, deltaIdx, mrTests, maxBlockTime, callback);\n}\n\nfunction _primeinc(num, bits, rng, deltaIdx, mrTests, maxBlockTime, callback) {\n  var start = +new Date();\n  do {\n    // overflow, regenerate random number\n    if(num.bitLength() > bits) {\n      num = generateRandom(bits, rng);\n    }\n    // do primality test\n    if(num.isProbablePrime(mrTests)) {\n      return callback(null, num);\n    }\n    // get next potential prime\n    num.dAddOffset(GCD_30_DELTA[deltaIdx++ % 8], 0);\n  } while(maxBlockTime < 0 || (+new Date() - start < maxBlockTime));\n\n  // keep trying later\n  forge.util.setImmediate(function() {\n    _primeinc(num, bits, rng, deltaIdx, mrTests, maxBlockTime, callback);\n  });\n}\n\n// NOTE: This algorithm is indeterminate in nature because workers\n// run in parallel looking at different segments of numbers. Even if this\n// algorithm is run twice with the same input from a predictable RNG, it\n// may produce different outputs.\nfunction primeincFindPrimeWithWorkers(bits, rng, options, callback) {\n  // web workers unavailable\n  if(typeof Worker === 'undefined') {\n    return primeincFindPrimeWithoutWorkers(bits, rng, options, callback);\n  }\n\n  // initialize random number\n  var num = generateRandom(bits, rng);\n\n  // use web workers to generate keys\n  var numWorkers = options.workers;\n  var workLoad = options.workLoad || 100;\n  var range = workLoad * 30 / 8;\n  var workerScript = options.workerScript || 'forge/prime.worker.js';\n  if(numWorkers === -1) {\n    return forge.util.estimateCores(function(err, cores) {\n      if(err) {\n        // default to 2\n        cores = 2;\n      }\n      numWorkers = cores - 1;\n      generate();\n    });\n  }\n  generate();\n\n  function generate() {\n    // require at least 1 worker\n    numWorkers = Math.max(1, numWorkers);\n\n    // TODO: consider optimizing by starting workers outside getPrime() ...\n    // note that in order to clean up they will have to be made internally\n    // asynchronous which may actually be slower\n\n    // start workers immediately\n    var workers = [];\n    for(var i = 0; i < numWorkers; ++i) {\n      // FIXME: fix path or use blob URLs\n      workers[i] = new Worker(workerScript);\n    }\n    var running = numWorkers;\n\n    // listen for requests from workers and assign ranges to find prime\n    for(var i = 0; i < numWorkers; ++i) {\n      workers[i].addEventListener('message', workerMessage);\n    }\n\n    /* Note: The distribution of random numbers is unknown. Therefore, each\n    web worker is continuously allocated a range of numbers to check for a\n    random number until one is found.\n\n    Every 30 numbers will be checked just 8 times, because prime numbers\n    have the form:\n\n    30k+i, for i < 30 and gcd(30, i)=1 (there are 8 values of i for this)\n\n    Therefore, if we want a web worker to run N checks before asking for\n    a new range of numbers, each range must contain N*30/8 numbers.\n\n    For 100 checks (workLoad), this is a range of 375. */\n\n    var found = false;\n    function workerMessage(e) {\n      // ignore message, prime already found\n      if(found) {\n        return;\n      }\n\n      --running;\n      var data = e.data;\n      if(data.found) {\n        // terminate all workers\n        for(var i = 0; i < workers.length; ++i) {\n          workers[i].terminate();\n        }\n        found = true;\n        return callback(null, new BigInteger(data.prime, 16));\n      }\n\n      // overflow, regenerate random number\n      if(num.bitLength() > bits) {\n        num = generateRandom(bits, rng);\n      }\n\n      // assign new range to check\n      var hex = num.toString(16);\n\n      // start prime search\n      e.target.postMessage({\n        hex: hex,\n        workLoad: workLoad\n      });\n\n      num.dAddOffset(range, 0);\n    }\n  }\n}\n\n/**\n * Generates a random number using the given number of bits and RNG.\n *\n * @param bits the number of bits for the number.\n * @param rng the random number generator to use.\n *\n * @return the random number.\n */\nfunction generateRandom(bits, rng) {\n  var num = new BigInteger(bits, rng);\n  // force MSB set\n  var bits1 = bits - 1;\n  if(!num.testBit(bits1)) {\n    num.bitwiseTo(BigInteger.ONE.shiftLeft(bits1), op_or, num);\n  }\n  // align number on 30k+1 boundary\n  num.dAddOffset(31 - num.mod(THIRTY).byteValue(), 0);\n  return num;\n}\n\n/**\n * Returns the required number of Miller-Rabin tests to generate a\n * prime with an error probability of (1/2)^80.\n *\n * See Handbook of Applied Cryptography Chapter 4, Table 4.4.\n *\n * @param bits the bit size.\n *\n * @return the required number of iterations.\n */\nfunction getMillerRabinTests(bits) {\n  if(bits <= 100) return 27;\n  if(bits <= 150) return 18;\n  if(bits <= 200) return 15;\n  if(bits <= 250) return 12;\n  if(bits <= 300) return 9;\n  if(bits <= 350) return 8;\n  if(bits <= 400) return 7;\n  if(bits <= 500) return 6;\n  if(bits <= 600) return 5;\n  if(bits <= 800) return 4;\n  if(bits <= 1250) return 3;\n  return 2;\n}\n\n})();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODYuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbm9kZS1mb3JnZS9saWIvcHJpbWUuanM/OGQ0ZCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFByaW1lIG51bWJlciBnZW5lcmF0aW9uIEFQSS5cbiAqXG4gKiBAYXV0aG9yIERhdmUgTG9uZ2xleVxuICpcbiAqIENvcHlyaWdodCAoYykgMjAxNCBEaWdpdGFsIEJhemFhciwgSW5jLlxuICovXG52YXIgZm9yZ2UgPSByZXF1aXJlKCcuL2ZvcmdlJyk7XG5yZXF1aXJlKCcuL3V0aWwnKTtcbnJlcXVpcmUoJy4vanNibicpO1xucmVxdWlyZSgnLi9yYW5kb20nKTtcblxuKGZ1bmN0aW9uKCkge1xuXG4vLyBmb3JnZS5wcmltZSBhbHJlYWR5IGRlZmluZWRcbmlmKGZvcmdlLnByaW1lKSB7XG4gIG1vZHVsZS5leHBvcnRzID0gZm9yZ2UucHJpbWU7XG4gIHJldHVybjtcbn1cblxuLyogUFJJTUUgQVBJICovXG52YXIgcHJpbWUgPSBtb2R1bGUuZXhwb3J0cyA9IGZvcmdlLnByaW1lID0gZm9yZ2UucHJpbWUgfHwge307XG5cbnZhciBCaWdJbnRlZ2VyID0gZm9yZ2UuanNibi5CaWdJbnRlZ2VyO1xuXG4vLyBwcmltZXMgYXJlIDMwaytpIGZvciBpID0gMSwgNywgMTEsIDEzLCAxNywgMTksIDIzLCAyOVxudmFyIEdDRF8zMF9ERUxUQSA9IFs2LCA0LCAyLCA0LCAyLCA0LCA2LCAyXTtcbnZhciBUSElSVFkgPSBuZXcgQmlnSW50ZWdlcihudWxsKTtcblRISVJUWS5mcm9tSW50KDMwKTtcbnZhciBvcF9vciA9IGZ1bmN0aW9uKHgsIHkpIHtyZXR1cm4geHx5O307XG5cbi8qKlxuICogR2VuZXJhdGVzIGEgcmFuZG9tIHByb2JhYmxlIHByaW1lIHdpdGggdGhlIGdpdmVuIG51bWJlciBvZiBiaXRzLlxuICpcbiAqIEFsdGVybmF0aXZlIGFsZ29yaXRobXMgY2FuIGJlIHNwZWNpZmllZCBieSBuYW1lIGFzIGEgc3RyaW5nIG9yIGFzIGFuXG4gKiBvYmplY3Qgd2l0aCBjdXN0b20gb3B0aW9ucyBsaWtlIHNvOlxuICpcbiAqIHtcbiAqICAgbmFtZTogJ1BSSU1FSU5DJyxcbiAqICAgb3B0aW9uczoge1xuICogICAgIG1heEJsb2NrVGltZTogPHRoZSBtYXhpbXVtIGFtb3VudCBvZiB0aW1lIHRvIGJsb2NrIHRoZSBtYWluXG4gKiAgICAgICB0aHJlYWQgYmVmb3JlIGFsbG93aW5nIEkvTyBvdGhlciBKUyB0byBydW4+LFxuICogICAgIG1pbGxlclJhYmluVGVzdHM6IDx0aGUgbnVtYmVyIG9mIG1pbGxlci1yYWJpbiB0ZXN0cyB0byBydW4+LFxuICogICAgIHdvcmtlclNjcmlwdDogPHRoZSB3b3JrZXIgc2NyaXB0IFVSTD4sXG4gKiAgICAgd29ya2VyczogPHRoZSBudW1iZXIgb2Ygd2ViIHdvcmtlcnMgKGlmIHN1cHBvcnRlZCkgdG8gdXNlLFxuICogICAgICAgLTEgdG8gdXNlIGVzdGltYXRlZCBjb3JlcyBtaW51cyBvbmU+LlxuICogICAgIHdvcmtMb2FkOiB0aGUgc2l6ZSBvZiB0aGUgd29yayBsb2FkLCBpZTogbnVtYmVyIG9mIHBvc3NpYmxlIHByaW1lXG4gKiAgICAgICBudW1iZXJzIGZvciBlYWNoIHdlYiB3b3JrZXIgdG8gY2hlY2sgcGVyIHdvcmsgYXNzaWdubWVudCxcbiAqICAgICAgIChkZWZhdWx0OiAxMDApLlxuICogICB9XG4gKiB9XG4gKlxuICogQHBhcmFtIGJpdHMgdGhlIG51bWJlciBvZiBiaXRzIGZvciB0aGUgcHJpbWUgbnVtYmVyLlxuICogQHBhcmFtIG9wdGlvbnMgdGhlIG9wdGlvbnMgdG8gdXNlLlxuICogICAgICAgICAgW2FsZ29yaXRobV0gdGhlIGFsZ29yaXRobSB0byB1c2UgKGRlZmF1bHQ6ICdQUklNRUlOQycpLlxuICogICAgICAgICAgW3BybmddIGEgY3VzdG9tIGNyeXB0by1zZWN1cmUgcHNldWRvLXJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIHRvIHVzZSxcbiAqICAgICAgICAgICAgdGhhdCBtdXN0IGRlZmluZSBcImdldEJ5dGVzU3luY1wiLlxuICpcbiAqIEByZXR1cm4gY2FsbGJhY2soZXJyLCBudW0pIGNhbGxlZCBvbmNlIHRoZSBvcGVyYXRpb24gY29tcGxldGVzLlxuICovXG5wcmltZS5nZW5lcmF0ZVByb2JhYmxlUHJpbWUgPSBmdW5jdGlvbihiaXRzLCBvcHRpb25zLCBjYWxsYmFjaykge1xuICBpZih0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNhbGxiYWNrID0gb3B0aW9ucztcbiAgICBvcHRpb25zID0ge307XG4gIH1cbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgLy8gZGVmYXVsdCB0byBQUklNRUlOQyBhbGdvcml0aG1cbiAgdmFyIGFsZ29yaXRobSA9IG9wdGlvbnMuYWxnb3JpdGhtIHx8ICdQUklNRUlOQyc7XG4gIGlmKHR5cGVvZiBhbGdvcml0aG0gPT09ICdzdHJpbmcnKSB7XG4gICAgYWxnb3JpdGhtID0ge25hbWU6IGFsZ29yaXRobX07XG4gIH1cbiAgYWxnb3JpdGhtLm9wdGlvbnMgPSBhbGdvcml0aG0ub3B0aW9ucyB8fCB7fTtcblxuICAvLyBjcmVhdGUgcHJuZyB3aXRoIGFwaSB0aGF0IG1hdGNoZXMgQmlnSW50ZWdlciBzZWN1cmUgcmFuZG9tXG4gIHZhciBwcm5nID0gb3B0aW9ucy5wcm5nIHx8IGZvcmdlLnJhbmRvbTtcbiAgdmFyIHJuZyA9IHtcbiAgICAvLyB4IGlzIGFuIGFycmF5IHRvIGZpbGwgd2l0aCBieXRlc1xuICAgIG5leHRCeXRlczogZnVuY3Rpb24oeCkge1xuICAgICAgdmFyIGIgPSBwcm5nLmdldEJ5dGVzU3luYyh4Lmxlbmd0aCk7XG4gICAgICBmb3IodmFyIGkgPSAwOyBpIDwgeC5sZW5ndGg7ICsraSkge1xuICAgICAgICB4W2ldID0gYi5jaGFyQ29kZUF0KGkpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBpZihhbGdvcml0aG0ubmFtZSA9PT0gJ1BSSU1FSU5DJykge1xuICAgIHJldHVybiBwcmltZWluY0ZpbmRQcmltZShiaXRzLCBybmcsIGFsZ29yaXRobS5vcHRpb25zLCBjYWxsYmFjayk7XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgcHJpbWUgZ2VuZXJhdGlvbiBhbGdvcml0aG06ICcgKyBhbGdvcml0aG0ubmFtZSk7XG59O1xuXG5mdW5jdGlvbiBwcmltZWluY0ZpbmRQcmltZShiaXRzLCBybmcsIG9wdGlvbnMsIGNhbGxiYWNrKSB7XG4gIGlmKCd3b3JrZXJzJyBpbiBvcHRpb25zKSB7XG4gICAgcmV0dXJuIHByaW1laW5jRmluZFByaW1lV2l0aFdvcmtlcnMoYml0cywgcm5nLCBvcHRpb25zLCBjYWxsYmFjayk7XG4gIH1cbiAgcmV0dXJuIHByaW1laW5jRmluZFByaW1lV2l0aG91dFdvcmtlcnMoYml0cywgcm5nLCBvcHRpb25zLCBjYWxsYmFjayk7XG59XG5cbmZ1bmN0aW9uIHByaW1laW5jRmluZFByaW1lV2l0aG91dFdvcmtlcnMoYml0cywgcm5nLCBvcHRpb25zLCBjYWxsYmFjaykge1xuICAvLyBpbml0aWFsaXplIHJhbmRvbSBudW1iZXJcbiAgdmFyIG51bSA9IGdlbmVyYXRlUmFuZG9tKGJpdHMsIHJuZyk7XG5cbiAgLyogTm90ZTogQWxsIHByaW1lcyBhcmUgb2YgdGhlIGZvcm0gMzBrK2kgZm9yIGkgPCAzMCBhbmQgZ2NkKDMwLCBpKT0xLiBUaGVcbiAgbnVtYmVyIHdlIGFyZSBnaXZlbiBpcyBhbHdheXMgYWxpZ25lZCBhdCAzMGsgKyAxLiBFYWNoIHRpbWUgdGhlIG51bWJlciBpc1xuICBkZXRlcm1pbmVkIG5vdCB0byBiZSBwcmltZSB3ZSBhZGQgdG8gZ2V0IHRvIHRoZSBuZXh0ICdpJywgZWc6IGlmIHRoZSBudW1iZXJcbiAgd2FzIGF0IDMwayArIDEgd2UgYWRkIDYuICovXG4gIHZhciBkZWx0YUlkeCA9IDA7XG5cbiAgLy8gZ2V0IHJlcXVpcmVkIG51bWJlciBvZiBNUiB0ZXN0c1xuICB2YXIgbXJUZXN0cyA9IGdldE1pbGxlclJhYmluVGVzdHMobnVtLmJpdExlbmd0aCgpKTtcbiAgaWYoJ21pbGxlclJhYmluVGVzdHMnIGluIG9wdGlvbnMpIHtcbiAgICBtclRlc3RzID0gb3B0aW9ucy5taWxsZXJSYWJpblRlc3RzO1xuICB9XG5cbiAgLy8gZmluZCBwcmltZSBuZWFyZXN0IHRvICdudW0nIGZvciBtYXhCbG9ja1RpbWUgbXNcbiAgLy8gMTAgbXMgZ2l2ZXMgNW1zIG9mIGxlZXdheSBmb3Igb3RoZXIgY2FsY3VsYXRpb25zIGJlZm9yZSBkcm9wcGluZ1xuICAvLyBiZWxvdyA2MGZwcyAoMTAwMC82MCA9PSAxNi42NyksIGJ1dCBpbiByZWFsaXR5LCB0aGUgbnVtYmVyIHdpbGxcbiAgLy8gbGlrZWx5IGJlIGhpZ2hlciBkdWUgdG8gYW4gJ2F0b21pYycgYmlnIGludCBtb2RQb3dcbiAgdmFyIG1heEJsb2NrVGltZSA9IDEwO1xuICBpZignbWF4QmxvY2tUaW1lJyBpbiBvcHRpb25zKSB7XG4gICAgbWF4QmxvY2tUaW1lID0gb3B0aW9ucy5tYXhCbG9ja1RpbWU7XG4gIH1cblxuICBfcHJpbWVpbmMobnVtLCBiaXRzLCBybmcsIGRlbHRhSWR4LCBtclRlc3RzLCBtYXhCbG9ja1RpbWUsIGNhbGxiYWNrKTtcbn1cblxuZnVuY3Rpb24gX3ByaW1laW5jKG51bSwgYml0cywgcm5nLCBkZWx0YUlkeCwgbXJUZXN0cywgbWF4QmxvY2tUaW1lLCBjYWxsYmFjaykge1xuICB2YXIgc3RhcnQgPSArbmV3IERhdGUoKTtcbiAgZG8ge1xuICAgIC8vIG92ZXJmbG93LCByZWdlbmVyYXRlIHJhbmRvbSBudW1iZXJcbiAgICBpZihudW0uYml0TGVuZ3RoKCkgPiBiaXRzKSB7XG4gICAgICBudW0gPSBnZW5lcmF0ZVJhbmRvbShiaXRzLCBybmcpO1xuICAgIH1cbiAgICAvLyBkbyBwcmltYWxpdHkgdGVzdFxuICAgIGlmKG51bS5pc1Byb2JhYmxlUHJpbWUobXJUZXN0cykpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjayhudWxsLCBudW0pO1xuICAgIH1cbiAgICAvLyBnZXQgbmV4dCBwb3RlbnRpYWwgcHJpbWVcbiAgICBudW0uZEFkZE9mZnNldChHQ0RfMzBfREVMVEFbZGVsdGFJZHgrKyAlIDhdLCAwKTtcbiAgfSB3aGlsZShtYXhCbG9ja1RpbWUgPCAwIHx8ICgrbmV3IERhdGUoKSAtIHN0YXJ0IDwgbWF4QmxvY2tUaW1lKSk7XG5cbiAgLy8ga2VlcCB0cnlpbmcgbGF0ZXJcbiAgZm9yZ2UudXRpbC5zZXRJbW1lZGlhdGUoZnVuY3Rpb24oKSB7XG4gICAgX3ByaW1laW5jKG51bSwgYml0cywgcm5nLCBkZWx0YUlkeCwgbXJUZXN0cywgbWF4QmxvY2tUaW1lLCBjYWxsYmFjayk7XG4gIH0pO1xufVxuXG4vLyBOT1RFOiBUaGlzIGFsZ29yaXRobSBpcyBpbmRldGVybWluYXRlIGluIG5hdHVyZSBiZWNhdXNlIHdvcmtlcnNcbi8vIHJ1biBpbiBwYXJhbGxlbCBsb29raW5nIGF0IGRpZmZlcmVudCBzZWdtZW50cyBvZiBudW1iZXJzLiBFdmVuIGlmIHRoaXNcbi8vIGFsZ29yaXRobSBpcyBydW4gdHdpY2Ugd2l0aCB0aGUgc2FtZSBpbnB1dCBmcm9tIGEgcHJlZGljdGFibGUgUk5HLCBpdFxuLy8gbWF5IHByb2R1Y2UgZGlmZmVyZW50IG91dHB1dHMuXG5mdW5jdGlvbiBwcmltZWluY0ZpbmRQcmltZVdpdGhXb3JrZXJzKGJpdHMsIHJuZywgb3B0aW9ucywgY2FsbGJhY2spIHtcbiAgLy8gd2ViIHdvcmtlcnMgdW5hdmFpbGFibGVcbiAgaWYodHlwZW9mIFdvcmtlciA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gcHJpbWVpbmNGaW5kUHJpbWVXaXRob3V0V29ya2VycyhiaXRzLCBybmcsIG9wdGlvbnMsIGNhbGxiYWNrKTtcbiAgfVxuXG4gIC8vIGluaXRpYWxpemUgcmFuZG9tIG51bWJlclxuICB2YXIgbnVtID0gZ2VuZXJhdGVSYW5kb20oYml0cywgcm5nKTtcblxuICAvLyB1c2Ugd2ViIHdvcmtlcnMgdG8gZ2VuZXJhdGUga2V5c1xuICB2YXIgbnVtV29ya2VycyA9IG9wdGlvbnMud29ya2VycztcbiAgdmFyIHdvcmtMb2FkID0gb3B0aW9ucy53b3JrTG9hZCB8fCAxMDA7XG4gIHZhciByYW5nZSA9IHdvcmtMb2FkICogMzAgLyA4O1xuICB2YXIgd29ya2VyU2NyaXB0ID0gb3B0aW9ucy53b3JrZXJTY3JpcHQgfHwgJ2ZvcmdlL3ByaW1lLndvcmtlci5qcyc7XG4gIGlmKG51bVdvcmtlcnMgPT09IC0xKSB7XG4gICAgcmV0dXJuIGZvcmdlLnV0aWwuZXN0aW1hdGVDb3JlcyhmdW5jdGlvbihlcnIsIGNvcmVzKSB7XG4gICAgICBpZihlcnIpIHtcbiAgICAgICAgLy8gZGVmYXVsdCB0byAyXG4gICAgICAgIGNvcmVzID0gMjtcbiAgICAgIH1cbiAgICAgIG51bVdvcmtlcnMgPSBjb3JlcyAtIDE7XG4gICAgICBnZW5lcmF0ZSgpO1xuICAgIH0pO1xuICB9XG4gIGdlbmVyYXRlKCk7XG5cbiAgZnVuY3Rpb24gZ2VuZXJhdGUoKSB7XG4gICAgLy8gcmVxdWlyZSBhdCBsZWFzdCAxIHdvcmtlclxuICAgIG51bVdvcmtlcnMgPSBNYXRoLm1heCgxLCBudW1Xb3JrZXJzKTtcblxuICAgIC8vIFRPRE86IGNvbnNpZGVyIG9wdGltaXppbmcgYnkgc3RhcnRpbmcgd29ya2VycyBvdXRzaWRlIGdldFByaW1lKCkgLi4uXG4gICAgLy8gbm90ZSB0aGF0IGluIG9yZGVyIHRvIGNsZWFuIHVwIHRoZXkgd2lsbCBoYXZlIHRvIGJlIG1hZGUgaW50ZXJuYWxseVxuICAgIC8vIGFzeW5jaHJvbm91cyB3aGljaCBtYXkgYWN0dWFsbHkgYmUgc2xvd2VyXG5cbiAgICAvLyBzdGFydCB3b3JrZXJzIGltbWVkaWF0ZWx5XG4gICAgdmFyIHdvcmtlcnMgPSBbXTtcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgbnVtV29ya2VyczsgKytpKSB7XG4gICAgICAvLyBGSVhNRTogZml4IHBhdGggb3IgdXNlIGJsb2IgVVJMc1xuICAgICAgd29ya2Vyc1tpXSA9IG5ldyBXb3JrZXIod29ya2VyU2NyaXB0KTtcbiAgICB9XG4gICAgdmFyIHJ1bm5pbmcgPSBudW1Xb3JrZXJzO1xuXG4gICAgLy8gbGlzdGVuIGZvciByZXF1ZXN0cyBmcm9tIHdvcmtlcnMgYW5kIGFzc2lnbiByYW5nZXMgdG8gZmluZCBwcmltZVxuICAgIGZvcih2YXIgaSA9IDA7IGkgPCBudW1Xb3JrZXJzOyArK2kpIHtcbiAgICAgIHdvcmtlcnNbaV0uYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIHdvcmtlck1lc3NhZ2UpO1xuICAgIH1cblxuICAgIC8qIE5vdGU6IFRoZSBkaXN0cmlidXRpb24gb2YgcmFuZG9tIG51bWJlcnMgaXMgdW5rbm93bi4gVGhlcmVmb3JlLCBlYWNoXG4gICAgd2ViIHdvcmtlciBpcyBjb250aW51b3VzbHkgYWxsb2NhdGVkIGEgcmFuZ2Ugb2YgbnVtYmVycyB0byBjaGVjayBmb3IgYVxuICAgIHJhbmRvbSBudW1iZXIgdW50aWwgb25lIGlzIGZvdW5kLlxuXG4gICAgRXZlcnkgMzAgbnVtYmVycyB3aWxsIGJlIGNoZWNrZWQganVzdCA4IHRpbWVzLCBiZWNhdXNlIHByaW1lIG51bWJlcnNcbiAgICBoYXZlIHRoZSBmb3JtOlxuXG4gICAgMzBrK2ksIGZvciBpIDwgMzAgYW5kIGdjZCgzMCwgaSk9MSAodGhlcmUgYXJlIDggdmFsdWVzIG9mIGkgZm9yIHRoaXMpXG5cbiAgICBUaGVyZWZvcmUsIGlmIHdlIHdhbnQgYSB3ZWIgd29ya2VyIHRvIHJ1biBOIGNoZWNrcyBiZWZvcmUgYXNraW5nIGZvclxuICAgIGEgbmV3IHJhbmdlIG9mIG51bWJlcnMsIGVhY2ggcmFuZ2UgbXVzdCBjb250YWluIE4qMzAvOCBudW1iZXJzLlxuXG4gICAgRm9yIDEwMCBjaGVja3MgKHdvcmtMb2FkKSwgdGhpcyBpcyBhIHJhbmdlIG9mIDM3NS4gKi9cblxuICAgIHZhciBmb3VuZCA9IGZhbHNlO1xuICAgIGZ1bmN0aW9uIHdvcmtlck1lc3NhZ2UoZSkge1xuICAgICAgLy8gaWdub3JlIG1lc3NhZ2UsIHByaW1lIGFscmVhZHkgZm91bmRcbiAgICAgIGlmKGZvdW5kKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLS1ydW5uaW5nO1xuICAgICAgdmFyIGRhdGEgPSBlLmRhdGE7XG4gICAgICBpZihkYXRhLmZvdW5kKSB7XG4gICAgICAgIC8vIHRlcm1pbmF0ZSBhbGwgd29ya2Vyc1xuICAgICAgICBmb3IodmFyIGkgPSAwOyBpIDwgd29ya2Vycy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgIHdvcmtlcnNbaV0udGVybWluYXRlKCk7XG4gICAgICAgIH1cbiAgICAgICAgZm91bmQgPSB0cnVlO1xuICAgICAgICByZXR1cm4gY2FsbGJhY2sobnVsbCwgbmV3IEJpZ0ludGVnZXIoZGF0YS5wcmltZSwgMTYpKTtcbiAgICAgIH1cblxuICAgICAgLy8gb3ZlcmZsb3csIHJlZ2VuZXJhdGUgcmFuZG9tIG51bWJlclxuICAgICAgaWYobnVtLmJpdExlbmd0aCgpID4gYml0cykge1xuICAgICAgICBudW0gPSBnZW5lcmF0ZVJhbmRvbShiaXRzLCBybmcpO1xuICAgICAgfVxuXG4gICAgICAvLyBhc3NpZ24gbmV3IHJhbmdlIHRvIGNoZWNrXG4gICAgICB2YXIgaGV4ID0gbnVtLnRvU3RyaW5nKDE2KTtcblxuICAgICAgLy8gc3RhcnQgcHJpbWUgc2VhcmNoXG4gICAgICBlLnRhcmdldC5wb3N0TWVzc2FnZSh7XG4gICAgICAgIGhleDogaGV4LFxuICAgICAgICB3b3JrTG9hZDogd29ya0xvYWRcbiAgICAgIH0pO1xuXG4gICAgICBudW0uZEFkZE9mZnNldChyYW5nZSwgMCk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogR2VuZXJhdGVzIGEgcmFuZG9tIG51bWJlciB1c2luZyB0aGUgZ2l2ZW4gbnVtYmVyIG9mIGJpdHMgYW5kIFJORy5cbiAqXG4gKiBAcGFyYW0gYml0cyB0aGUgbnVtYmVyIG9mIGJpdHMgZm9yIHRoZSBudW1iZXIuXG4gKiBAcGFyYW0gcm5nIHRoZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvciB0byB1c2UuXG4gKlxuICogQHJldHVybiB0aGUgcmFuZG9tIG51bWJlci5cbiAqL1xuZnVuY3Rpb24gZ2VuZXJhdGVSYW5kb20oYml0cywgcm5nKSB7XG4gIHZhciBudW0gPSBuZXcgQmlnSW50ZWdlcihiaXRzLCBybmcpO1xuICAvLyBmb3JjZSBNU0Igc2V0XG4gIHZhciBiaXRzMSA9IGJpdHMgLSAxO1xuICBpZighbnVtLnRlc3RCaXQoYml0czEpKSB7XG4gICAgbnVtLmJpdHdpc2VUbyhCaWdJbnRlZ2VyLk9ORS5zaGlmdExlZnQoYml0czEpLCBvcF9vciwgbnVtKTtcbiAgfVxuICAvLyBhbGlnbiBudW1iZXIgb24gMzBrKzEgYm91bmRhcnlcbiAgbnVtLmRBZGRPZmZzZXQoMzEgLSBudW0ubW9kKFRISVJUWSkuYnl0ZVZhbHVlKCksIDApO1xuICByZXR1cm4gbnVtO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIHJlcXVpcmVkIG51bWJlciBvZiBNaWxsZXItUmFiaW4gdGVzdHMgdG8gZ2VuZXJhdGUgYVxuICogcHJpbWUgd2l0aCBhbiBlcnJvciBwcm9iYWJpbGl0eSBvZiAoMS8yKV44MC5cbiAqXG4gKiBTZWUgSGFuZGJvb2sgb2YgQXBwbGllZCBDcnlwdG9ncmFwaHkgQ2hhcHRlciA0LCBUYWJsZSA0LjQuXG4gKlxuICogQHBhcmFtIGJpdHMgdGhlIGJpdCBzaXplLlxuICpcbiAqIEByZXR1cm4gdGhlIHJlcXVpcmVkIG51bWJlciBvZiBpdGVyYXRpb25zLlxuICovXG5mdW5jdGlvbiBnZXRNaWxsZXJSYWJpblRlc3RzKGJpdHMpIHtcbiAgaWYoYml0cyA8PSAxMDApIHJldHVybiAyNztcbiAgaWYoYml0cyA8PSAxNTApIHJldHVybiAxODtcbiAgaWYoYml0cyA8PSAyMDApIHJldHVybiAxNTtcbiAgaWYoYml0cyA8PSAyNTApIHJldHVybiAxMjtcbiAgaWYoYml0cyA8PSAzMDApIHJldHVybiA5O1xuICBpZihiaXRzIDw9IDM1MCkgcmV0dXJuIDg7XG4gIGlmKGJpdHMgPD0gNDAwKSByZXR1cm4gNztcbiAgaWYoYml0cyA8PSA1MDApIHJldHVybiA2O1xuICBpZihiaXRzIDw9IDYwMCkgcmV0dXJuIDU7XG4gIGlmKGJpdHMgPD0gODAwKSByZXR1cm4gNDtcbiAgaWYoYml0cyA8PSAxMjUwKSByZXR1cm4gMztcbiAgcmV0dXJuIDI7XG59XG5cbn0pKCk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///86\n")},function(module,exports,__webpack_require__){eval("/**\n * Javascript implementation of PKCS#12.\n *\n * @author Dave Longley\n * @author Stefan Siegl <stesie@brokenpipe.de>\n *\n * Copyright (c) 2010-2014 Digital Bazaar, Inc.\n * Copyright (c) 2012 Stefan Siegl <stesie@brokenpipe.de>\n *\n * The ASN.1 representation of PKCS#12 is as follows\n * (see ftp://ftp.rsasecurity.com/pub/pkcs/pkcs-12/pkcs-12-tc1.pdf for details)\n *\n * PFX ::= SEQUENCE {\n *   version  INTEGER {v3(3)}(v3,...),\n *   authSafe ContentInfo,\n *   macData  MacData OPTIONAL\n * }\n *\n * MacData ::= SEQUENCE {\n *   mac DigestInfo,\n *   macSalt OCTET STRING,\n *   iterations INTEGER DEFAULT 1\n * }\n * Note: The iterations default is for historical reasons and its use is\n * deprecated. A higher value, like 1024, is recommended.\n *\n * DigestInfo is defined in PKCS#7 as follows:\n *\n * DigestInfo ::= SEQUENCE {\n *   digestAlgorithm DigestAlgorithmIdentifier,\n *   digest Digest\n * }\n *\n * DigestAlgorithmIdentifier ::= AlgorithmIdentifier\n *\n * The AlgorithmIdentifier contains an Object Identifier (OID) and parameters\n * for the algorithm, if any. In the case of SHA1 there is none.\n *\n * AlgorithmIdentifer ::= SEQUENCE {\n *    algorithm OBJECT IDENTIFIER,\n *    parameters ANY DEFINED BY algorithm OPTIONAL\n * }\n *\n * Digest ::= OCTET STRING\n *\n *\n * ContentInfo ::= SEQUENCE {\n *   contentType ContentType,\n *   content     [0] EXPLICIT ANY DEFINED BY contentType OPTIONAL\n * }\n *\n * ContentType ::= OBJECT IDENTIFIER\n *\n * AuthenticatedSafe ::= SEQUENCE OF ContentInfo\n * -- Data if unencrypted\n * -- EncryptedData if password-encrypted\n * -- EnvelopedData if public key-encrypted\n *\n *\n * SafeContents ::= SEQUENCE OF SafeBag\n *\n * SafeBag ::= SEQUENCE {\n *   bagId     BAG-TYPE.&id ({PKCS12BagSet})\n *   bagValue  [0] EXPLICIT BAG-TYPE.&Type({PKCS12BagSet}{@bagId}),\n *   bagAttributes SET OF PKCS12Attribute OPTIONAL\n * }\n *\n * PKCS12Attribute ::= SEQUENCE {\n *   attrId ATTRIBUTE.&id ({PKCS12AttrSet}),\n *   attrValues SET OF ATTRIBUTE.&Type ({PKCS12AttrSet}{@attrId})\n * } -- This type is compatible with the X.500 type 'Attribute'\n *\n * PKCS12AttrSet ATTRIBUTE ::= {\n *   friendlyName | -- from PKCS #9\n *   localKeyId, -- from PKCS #9\n *   ... -- Other attributes are allowed\n * }\n *\n * CertBag ::= SEQUENCE {\n *   certId    BAG-TYPE.&id   ({CertTypes}),\n *   certValue [0] EXPLICIT BAG-TYPE.&Type ({CertTypes}{@certId})\n * }\n *\n * x509Certificate BAG-TYPE ::= {OCTET STRING IDENTIFIED BY {certTypes 1}}\n *   -- DER-encoded X.509 certificate stored in OCTET STRING\n *\n * sdsiCertificate BAG-TYPE ::= {IA5String IDENTIFIED BY {certTypes 2}}\n * -- Base64-encoded SDSI certificate stored in IA5String\n *\n * CertTypes BAG-TYPE ::= {\n *   x509Certificate |\n *   sdsiCertificate,\n *   ... -- For future extensions\n * }\n */\nvar forge = __webpack_require__(4);\n__webpack_require__(14);\n__webpack_require__(31);\n__webpack_require__(23);\n__webpack_require__(88);\n__webpack_require__(81);\n__webpack_require__(13);\n__webpack_require__(42);\n__webpack_require__(32);\n__webpack_require__(7);\n__webpack_require__(58);\n\n// shortcut for asn.1 & PKI API\nvar asn1 = forge.asn1;\nvar pki = forge.pki;\n\n// shortcut for PKCS#12 API\nvar p12 = module.exports = forge.pkcs12 = forge.pkcs12 || {};\n\nvar contentInfoValidator = {\n  name: 'ContentInfo',\n  tagClass: asn1.Class.UNIVERSAL,\n  type: asn1.Type.SEQUENCE,  // a ContentInfo\n  constructed: true,\n  value: [{\n    name: 'ContentInfo.contentType',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.OID,\n    constructed: false,\n    capture: 'contentType'\n  }, {\n    name: 'ContentInfo.content',\n    tagClass: asn1.Class.CONTEXT_SPECIFIC,\n    constructed: true,\n    captureAsn1: 'content'\n  }]\n};\n\nvar pfxValidator = {\n  name: 'PFX',\n  tagClass: asn1.Class.UNIVERSAL,\n  type: asn1.Type.SEQUENCE,\n  constructed: true,\n  value: [{\n    name: 'PFX.version',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.INTEGER,\n    constructed: false,\n    capture: 'version'\n  },\n  contentInfoValidator, {\n    name: 'PFX.macData',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.SEQUENCE,\n    constructed: true,\n    optional: true,\n    captureAsn1: 'mac',\n    value: [{\n      name: 'PFX.macData.mac',\n      tagClass: asn1.Class.UNIVERSAL,\n      type: asn1.Type.SEQUENCE,  // DigestInfo\n      constructed: true,\n      value: [{\n        name: 'PFX.macData.mac.digestAlgorithm',\n        tagClass: asn1.Class.UNIVERSAL,\n        type: asn1.Type.SEQUENCE,  // DigestAlgorithmIdentifier\n        constructed: true,\n        value: [{\n          name: 'PFX.macData.mac.digestAlgorithm.algorithm',\n          tagClass: asn1.Class.UNIVERSAL,\n          type: asn1.Type.OID,\n          constructed: false,\n          capture: 'macAlgorithm'\n        }, {\n          name: 'PFX.macData.mac.digestAlgorithm.parameters',\n          tagClass: asn1.Class.UNIVERSAL,\n          captureAsn1: 'macAlgorithmParameters'\n        }]\n      }, {\n        name: 'PFX.macData.mac.digest',\n        tagClass: asn1.Class.UNIVERSAL,\n        type: asn1.Type.OCTETSTRING,\n        constructed: false,\n        capture: 'macDigest'\n      }]\n    }, {\n      name: 'PFX.macData.macSalt',\n      tagClass: asn1.Class.UNIVERSAL,\n      type: asn1.Type.OCTETSTRING,\n      constructed: false,\n      capture: 'macSalt'\n    }, {\n      name: 'PFX.macData.iterations',\n      tagClass: asn1.Class.UNIVERSAL,\n      type: asn1.Type.INTEGER,\n      constructed: false,\n      optional: true,\n      capture: 'macIterations'\n    }]\n  }]\n};\n\nvar safeBagValidator = {\n  name: 'SafeBag',\n  tagClass: asn1.Class.UNIVERSAL,\n  type: asn1.Type.SEQUENCE,\n  constructed: true,\n  value: [{\n    name: 'SafeBag.bagId',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.OID,\n    constructed: false,\n    capture: 'bagId'\n  }, {\n    name: 'SafeBag.bagValue',\n    tagClass: asn1.Class.CONTEXT_SPECIFIC,\n    constructed: true,\n    captureAsn1: 'bagValue'\n  }, {\n    name: 'SafeBag.bagAttributes',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.SET,\n    constructed: true,\n    optional: true,\n    capture: 'bagAttributes'\n  }]\n};\n\nvar attributeValidator = {\n  name: 'Attribute',\n  tagClass: asn1.Class.UNIVERSAL,\n  type: asn1.Type.SEQUENCE,\n  constructed: true,\n  value: [{\n    name: 'Attribute.attrId',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.OID,\n    constructed: false,\n    capture: 'oid'\n  }, {\n    name: 'Attribute.attrValues',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.SET,\n    constructed: true,\n    capture: 'values'\n  }]\n};\n\nvar certBagValidator = {\n  name: 'CertBag',\n  tagClass: asn1.Class.UNIVERSAL,\n  type: asn1.Type.SEQUENCE,\n  constructed: true,\n  value: [{\n    name: 'CertBag.certId',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.OID,\n    constructed: false,\n    capture: 'certId'\n  }, {\n    name: 'CertBag.certValue',\n    tagClass: asn1.Class.CONTEXT_SPECIFIC,\n    constructed: true,\n    /* So far we only support X.509 certificates (which are wrapped in\n       an OCTET STRING, hence hard code that here). */\n    value: [{\n      name: 'CertBag.certValue[0]',\n      tagClass: asn1.Class.UNIVERSAL,\n      type: asn1.Class.OCTETSTRING,\n      constructed: false,\n      capture: 'cert'\n    }]\n  }]\n};\n\n/**\n * Search SafeContents structure for bags with matching attributes.\n *\n * The search can optionally be narrowed by a certain bag type.\n *\n * @param safeContents the SafeContents structure to search in.\n * @param attrName the name of the attribute to compare against.\n * @param attrValue the attribute value to search for.\n * @param [bagType] bag type to narrow search by.\n *\n * @return an array of matching bags.\n */\nfunction _getBagsByAttribute(safeContents, attrName, attrValue, bagType) {\n  var result = [];\n\n  for(var i = 0; i < safeContents.length; i++) {\n    for(var j = 0; j < safeContents[i].safeBags.length; j++) {\n      var bag = safeContents[i].safeBags[j];\n      if(bagType !== undefined && bag.type !== bagType) {\n        continue;\n      }\n      // only filter by bag type, no attribute specified\n      if(attrName === null) {\n        result.push(bag);\n        continue;\n      }\n      if(bag.attributes[attrName] !== undefined &&\n        bag.attributes[attrName].indexOf(attrValue) >= 0) {\n        result.push(bag);\n      }\n    }\n  }\n\n  return result;\n}\n\n/**\n * Converts a PKCS#12 PFX in ASN.1 notation into a PFX object.\n *\n * @param obj The PKCS#12 PFX in ASN.1 notation.\n * @param strict true to use strict DER decoding, false not to (default: true).\n * @param {String} password Password to decrypt with (optional).\n *\n * @return PKCS#12 PFX object.\n */\np12.pkcs12FromAsn1 = function(obj, strict, password) {\n  // handle args\n  if(typeof strict === 'string') {\n    password = strict;\n    strict = true;\n  } else if(strict === undefined) {\n    strict = true;\n  }\n\n  // validate PFX and capture data\n  var capture = {};\n  var errors = [];\n  if(!asn1.validate(obj, pfxValidator, capture, errors)) {\n    var error = new Error('Cannot read PKCS#12 PFX. ' +\n      'ASN.1 object is not an PKCS#12 PFX.');\n    error.errors = error;\n    throw error;\n  }\n\n  var pfx = {\n    version: capture.version.charCodeAt(0),\n    safeContents: [],\n\n    /**\n     * Gets bags with matching attributes.\n     *\n     * @param filter the attributes to filter by:\n     *          [localKeyId] the localKeyId to search for.\n     *          [localKeyIdHex] the localKeyId in hex to search for.\n     *          [friendlyName] the friendly name to search for.\n     *          [bagType] bag type to narrow each attribute search by.\n     *\n     * @return a map of attribute type to an array of matching bags or, if no\n     *           attribute was given but a bag type, the map key will be the\n     *           bag type.\n     */\n    getBags: function(filter) {\n      var rval = {};\n\n      var localKeyId;\n      if('localKeyId' in filter) {\n        localKeyId = filter.localKeyId;\n      } else if('localKeyIdHex' in filter) {\n        localKeyId = forge.util.hexToBytes(filter.localKeyIdHex);\n      }\n\n      // filter on bagType only\n      if(localKeyId === undefined && !('friendlyName' in filter) &&\n        'bagType' in filter) {\n        rval[filter.bagType] = _getBagsByAttribute(\n          pfx.safeContents, null, null, filter.bagType);\n      }\n\n      if(localKeyId !== undefined) {\n        rval.localKeyId = _getBagsByAttribute(\n          pfx.safeContents, 'localKeyId',\n          localKeyId, filter.bagType);\n      }\n      if('friendlyName' in filter) {\n        rval.friendlyName = _getBagsByAttribute(\n          pfx.safeContents, 'friendlyName',\n          filter.friendlyName, filter.bagType);\n      }\n\n      return rval;\n    },\n\n    /**\n     * DEPRECATED: use getBags() instead.\n     *\n     * Get bags with matching friendlyName attribute.\n     *\n     * @param friendlyName the friendly name to search for.\n     * @param [bagType] bag type to narrow search by.\n     *\n     * @return an array of bags with matching friendlyName attribute.\n     */\n    getBagsByFriendlyName: function(friendlyName, bagType) {\n      return _getBagsByAttribute(\n        pfx.safeContents, 'friendlyName', friendlyName, bagType);\n    },\n\n    /**\n     * DEPRECATED: use getBags() instead.\n     *\n     * Get bags with matching localKeyId attribute.\n     *\n     * @param localKeyId the localKeyId to search for.\n     * @param [bagType] bag type to narrow search by.\n     *\n     * @return an array of bags with matching localKeyId attribute.\n     */\n    getBagsByLocalKeyId: function(localKeyId, bagType) {\n      return _getBagsByAttribute(\n        pfx.safeContents, 'localKeyId', localKeyId, bagType);\n    }\n  };\n\n  if(capture.version.charCodeAt(0) !== 3) {\n    var error = new Error('PKCS#12 PFX of version other than 3 not supported.');\n    error.version = capture.version.charCodeAt(0);\n    throw error;\n  }\n\n  if(asn1.derToOid(capture.contentType) !== pki.oids.data) {\n    var error = new Error('Only PKCS#12 PFX in password integrity mode supported.');\n    error.oid = asn1.derToOid(capture.contentType);\n    throw error;\n  }\n\n  var data = capture.content.value[0];\n  if(data.tagClass !== asn1.Class.UNIVERSAL ||\n     data.type !== asn1.Type.OCTETSTRING) {\n    throw new Error('PKCS#12 authSafe content data is not an OCTET STRING.');\n  }\n  data = _decodePkcs7Data(data);\n\n  // check for MAC\n  if(capture.mac) {\n    var md = null;\n    var macKeyBytes = 0;\n    var macAlgorithm = asn1.derToOid(capture.macAlgorithm);\n    switch(macAlgorithm) {\n    case pki.oids.sha1:\n      md = forge.md.sha1.create();\n      macKeyBytes = 20;\n      break;\n    case pki.oids.sha256:\n      md = forge.md.sha256.create();\n      macKeyBytes = 32;\n      break;\n    case pki.oids.sha384:\n      md = forge.md.sha384.create();\n      macKeyBytes = 48;\n      break;\n    case pki.oids.sha512:\n      md = forge.md.sha512.create();\n      macKeyBytes = 64;\n      break;\n    case pki.oids.md5:\n      md = forge.md.md5.create();\n      macKeyBytes = 16;\n      break;\n    }\n    if(md === null) {\n      throw new Error('PKCS#12 uses unsupported MAC algorithm: ' + macAlgorithm);\n    }\n\n    // verify MAC (iterations default to 1)\n    var macSalt = new forge.util.ByteBuffer(capture.macSalt);\n    var macIterations = (('macIterations' in capture) ?\n      parseInt(forge.util.bytesToHex(capture.macIterations), 16) : 1);\n    var macKey = p12.generateKey(\n      password, macSalt, 3, macIterations, macKeyBytes, md);\n    var mac = forge.hmac.create();\n    mac.start(md, macKey);\n    mac.update(data.value);\n    var macValue = mac.getMac();\n    if(macValue.getBytes() !== capture.macDigest) {\n      throw new Error('PKCS#12 MAC could not be verified. Invalid password?');\n    }\n  }\n\n  _decodeAuthenticatedSafe(pfx, data.value, strict, password);\n  return pfx;\n};\n\n/**\n * Decodes PKCS#7 Data. PKCS#7 (RFC 2315) defines \"Data\" as an OCTET STRING,\n * but it is sometimes an OCTET STRING that is composed/constructed of chunks,\n * each its own OCTET STRING. This is BER-encoding vs. DER-encoding. This\n * function transforms this corner-case into the usual simple,\n * non-composed/constructed OCTET STRING.\n *\n * This function may be moved to ASN.1 at some point to better deal with\n * more BER-encoding issues, should they arise.\n *\n * @param data the ASN.1 Data object to transform.\n */\nfunction _decodePkcs7Data(data) {\n  // handle special case of \"chunked\" data content: an octet string composed\n  // of other octet strings\n  if(data.composed || data.constructed) {\n    var value = forge.util.createBuffer();\n    for(var i = 0; i < data.value.length; ++i) {\n      value.putBytes(data.value[i].value);\n    }\n    data.composed = data.constructed = false;\n    data.value = value.getBytes();\n  }\n  return data;\n}\n\n/**\n * Decode PKCS#12 AuthenticatedSafe (BER encoded) into PFX object.\n *\n * The AuthenticatedSafe is a BER-encoded SEQUENCE OF ContentInfo.\n *\n * @param pfx The PKCS#12 PFX object to fill.\n * @param {String} authSafe BER-encoded AuthenticatedSafe.\n * @param strict true to use strict DER decoding, false not to.\n * @param {String} password Password to decrypt with (optional).\n */\nfunction _decodeAuthenticatedSafe(pfx, authSafe, strict, password) {\n  authSafe = asn1.fromDer(authSafe, strict);  /* actually it's BER encoded */\n\n  if(authSafe.tagClass !== asn1.Class.UNIVERSAL ||\n     authSafe.type !== asn1.Type.SEQUENCE ||\n     authSafe.constructed !== true) {\n    throw new Error('PKCS#12 AuthenticatedSafe expected to be a ' +\n      'SEQUENCE OF ContentInfo');\n  }\n\n  for(var i = 0; i < authSafe.value.length; i++) {\n    var contentInfo = authSafe.value[i];\n\n    // validate contentInfo and capture data\n    var capture = {};\n    var errors = [];\n    if(!asn1.validate(contentInfo, contentInfoValidator, capture, errors)) {\n      var error = new Error('Cannot read ContentInfo.');\n      error.errors = errors;\n      throw error;\n    }\n\n    var obj = {\n      encrypted: false\n    };\n    var safeContents = null;\n    var data = capture.content.value[0];\n    switch(asn1.derToOid(capture.contentType)) {\n    case pki.oids.data:\n      if(data.tagClass !== asn1.Class.UNIVERSAL ||\n         data.type !== asn1.Type.OCTETSTRING) {\n        throw new Error('PKCS#12 SafeContents Data is not an OCTET STRING.');\n      }\n      safeContents = _decodePkcs7Data(data).value;\n      break;\n    case pki.oids.encryptedData:\n      safeContents = _decryptSafeContents(data, password);\n      obj.encrypted = true;\n      break;\n    default:\n      var error = new Error('Unsupported PKCS#12 contentType.');\n      error.contentType = asn1.derToOid(capture.contentType);\n      throw error;\n    }\n\n    obj.safeBags = _decodeSafeContents(safeContents, strict, password);\n    pfx.safeContents.push(obj);\n  }\n}\n\n/**\n * Decrypt PKCS#7 EncryptedData structure.\n *\n * @param data ASN.1 encoded EncryptedContentInfo object.\n * @param password The user-provided password.\n *\n * @return The decrypted SafeContents (ASN.1 object).\n */\nfunction _decryptSafeContents(data, password) {\n  var capture = {};\n  var errors = [];\n  if(!asn1.validate(\n    data, forge.pkcs7.asn1.encryptedDataValidator, capture, errors)) {\n    var error = new Error('Cannot read EncryptedContentInfo.');\n    error.errors = errors;\n    throw error;\n  }\n\n  var oid = asn1.derToOid(capture.contentType);\n  if(oid !== pki.oids.data) {\n    var error = new Error(\n      'PKCS#12 EncryptedContentInfo ContentType is not Data.');\n    error.oid = oid;\n    throw error;\n  }\n\n  // get cipher\n  oid = asn1.derToOid(capture.encAlgorithm);\n  var cipher = pki.pbe.getCipher(oid, capture.encParameter, password);\n\n  // get encrypted data\n  var encryptedContentAsn1 = _decodePkcs7Data(capture.encryptedContentAsn1);\n  var encrypted = forge.util.createBuffer(encryptedContentAsn1.value);\n\n  cipher.update(encrypted);\n  if(!cipher.finish()) {\n    throw new Error('Failed to decrypt PKCS#12 SafeContents.');\n  }\n\n  return cipher.output.getBytes();\n}\n\n/**\n * Decode PKCS#12 SafeContents (BER-encoded) into array of Bag objects.\n *\n * The safeContents is a BER-encoded SEQUENCE OF SafeBag.\n *\n * @param {String} safeContents BER-encoded safeContents.\n * @param strict true to use strict DER decoding, false not to.\n * @param {String} password Password to decrypt with (optional).\n *\n * @return {Array} Array of Bag objects.\n */\nfunction _decodeSafeContents(safeContents, strict, password) {\n  // if strict and no safe contents, return empty safes\n  if(!strict && safeContents.length === 0) {\n    return [];\n  }\n\n  // actually it's BER-encoded\n  safeContents = asn1.fromDer(safeContents, strict);\n\n  if(safeContents.tagClass !== asn1.Class.UNIVERSAL ||\n    safeContents.type !== asn1.Type.SEQUENCE ||\n    safeContents.constructed !== true) {\n    throw new Error(\n      'PKCS#12 SafeContents expected to be a SEQUENCE OF SafeBag.');\n  }\n\n  var res = [];\n  for(var i = 0; i < safeContents.value.length; i++) {\n    var safeBag = safeContents.value[i];\n\n    // validate SafeBag and capture data\n    var capture = {};\n    var errors = [];\n    if(!asn1.validate(safeBag, safeBagValidator, capture, errors)) {\n      var error = new Error('Cannot read SafeBag.');\n      error.errors = errors;\n      throw error;\n    }\n\n    /* Create bag object and push to result array. */\n    var bag = {\n      type: asn1.derToOid(capture.bagId),\n      attributes: _decodeBagAttributes(capture.bagAttributes)\n    };\n    res.push(bag);\n\n    var validator, decoder;\n    var bagAsn1 = capture.bagValue.value[0];\n    switch(bag.type) {\n      case pki.oids.pkcs8ShroudedKeyBag:\n        /* bagAsn1 has a EncryptedPrivateKeyInfo, which we need to decrypt.\n           Afterwards we can handle it like a keyBag,\n           which is a PrivateKeyInfo. */\n        bagAsn1 = pki.decryptPrivateKeyInfo(bagAsn1, password);\n        if(bagAsn1 === null) {\n          throw new Error(\n            'Unable to decrypt PKCS#8 ShroudedKeyBag, wrong password?');\n        }\n\n        /* fall through */\n      case pki.oids.keyBag:\n        /* A PKCS#12 keyBag is a simple PrivateKeyInfo as understood by our\n           PKI module, hence we don't have to do validation/capturing here,\n           just pass what we already got. */\n        try {\n          bag.key = pki.privateKeyFromAsn1(bagAsn1);\n        } catch(e) {\n          // ignore unknown key type, pass asn1 value\n          bag.key = null;\n          bag.asn1 = bagAsn1;\n        }\n        continue;  /* Nothing more to do. */\n\n      case pki.oids.certBag:\n        /* A PKCS#12 certBag can wrap both X.509 and sdsi certificates.\n           Therefore put the SafeBag content through another validator to\n           capture the fields.  Afterwards check & store the results. */\n        validator = certBagValidator;\n        decoder = function() {\n          if(asn1.derToOid(capture.certId) !== pki.oids.x509Certificate) {\n            var error = new Error(\n              'Unsupported certificate type, only X.509 supported.');\n            error.oid = asn1.derToOid(capture.certId);\n            throw error;\n          }\n\n          // true=produce cert hash\n          var certAsn1 = asn1.fromDer(capture.cert, strict);\n          try {\n            bag.cert = pki.certificateFromAsn1(certAsn1, true);\n          } catch(e) {\n            // ignore unknown cert type, pass asn1 value\n            bag.cert = null;\n            bag.asn1 = certAsn1;\n          }\n        };\n        break;\n\n      default:\n        var error = new Error('Unsupported PKCS#12 SafeBag type.');\n        error.oid = bag.type;\n        throw error;\n    }\n\n    /* Validate SafeBag value (i.e. CertBag, etc.) and capture data if needed. */\n    if(validator !== undefined &&\n       !asn1.validate(bagAsn1, validator, capture, errors)) {\n      var error = new Error('Cannot read PKCS#12 ' + validator.name);\n      error.errors = errors;\n      throw error;\n    }\n\n    /* Call decoder function from above to store the results. */\n    decoder();\n  }\n\n  return res;\n}\n\n/**\n * Decode PKCS#12 SET OF PKCS12Attribute into JavaScript object.\n *\n * @param attributes SET OF PKCS12Attribute (ASN.1 object).\n *\n * @return the decoded attributes.\n */\nfunction _decodeBagAttributes(attributes) {\n  var decodedAttrs = {};\n\n  if(attributes !== undefined) {\n    for(var i = 0; i < attributes.length; ++i) {\n      var capture = {};\n      var errors = [];\n      if(!asn1.validate(attributes[i], attributeValidator, capture, errors)) {\n        var error = new Error('Cannot read PKCS#12 BagAttribute.');\n        error.errors = errors;\n        throw error;\n      }\n\n      var oid = asn1.derToOid(capture.oid);\n      if(pki.oids[oid] === undefined) {\n        // unsupported attribute type, ignore.\n        continue;\n      }\n\n      decodedAttrs[pki.oids[oid]] = [];\n      for(var j = 0; j < capture.values.length; ++j) {\n        decodedAttrs[pki.oids[oid]].push(capture.values[j].value);\n      }\n    }\n  }\n\n  return decodedAttrs;\n}\n\n/**\n * Wraps a private key and certificate in a PKCS#12 PFX wrapper. If a\n * password is provided then the private key will be encrypted.\n *\n * An entire certificate chain may also be included. To do this, pass\n * an array for the \"cert\" parameter where the first certificate is\n * the one that is paired with the private key and each subsequent one\n * verifies the previous one. The certificates may be in PEM format or\n * have been already parsed by Forge.\n *\n * @todo implement password-based-encryption for the whole package\n *\n * @param key the private key.\n * @param cert the certificate (may be an array of certificates in order\n *          to specify a certificate chain).\n * @param password the password to use, null for none.\n * @param options:\n *          algorithm the encryption algorithm to use\n *            ('aes128', 'aes192', 'aes256', '3des'), defaults to 'aes128'.\n *          count the iteration count to use.\n *          saltSize the salt size to use.\n *          useMac true to include a MAC, false not to, defaults to true.\n *          localKeyId the local key ID to use, in hex.\n *          friendlyName the friendly name to use.\n *          generateLocalKeyId true to generate a random local key ID,\n *            false not to, defaults to true.\n *\n * @return the PKCS#12 PFX ASN.1 object.\n */\np12.toPkcs12Asn1 = function(key, cert, password, options) {\n  // set default options\n  options = options || {};\n  options.saltSize = options.saltSize || 8;\n  options.count = options.count || 2048;\n  options.algorithm = options.algorithm || options.encAlgorithm || 'aes128';\n  if(!('useMac' in options)) {\n    options.useMac = true;\n  }\n  if(!('localKeyId' in options)) {\n    options.localKeyId = null;\n  }\n  if(!('generateLocalKeyId' in options)) {\n    options.generateLocalKeyId = true;\n  }\n\n  var localKeyId = options.localKeyId;\n  var bagAttrs;\n  if(localKeyId !== null) {\n    localKeyId = forge.util.hexToBytes(localKeyId);\n  } else if(options.generateLocalKeyId) {\n    // use SHA-1 of paired cert, if available\n    if(cert) {\n      var pairedCert = forge.util.isArray(cert) ? cert[0] : cert;\n      if(typeof pairedCert === 'string') {\n        pairedCert = pki.certificateFromPem(pairedCert);\n      }\n      var sha1 = forge.md.sha1.create();\n      sha1.update(asn1.toDer(pki.certificateToAsn1(pairedCert)).getBytes());\n      localKeyId = sha1.digest().getBytes();\n    } else {\n      // FIXME: consider using SHA-1 of public key (which can be generated\n      // from private key components), see: cert.generateSubjectKeyIdentifier\n      // generate random bytes\n      localKeyId = forge.random.getBytes(20);\n    }\n  }\n\n  var attrs = [];\n  if(localKeyId !== null) {\n    attrs.push(\n      // localKeyID\n      asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [\n        // attrId\n        asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OID, false,\n          asn1.oidToDer(pki.oids.localKeyId).getBytes()),\n        // attrValues\n        asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SET, true, [\n          asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OCTETSTRING, false,\n            localKeyId)\n        ])\n      ]));\n  }\n  if('friendlyName' in options) {\n    attrs.push(\n      // friendlyName\n      asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [\n        // attrId\n        asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OID, false,\n          asn1.oidToDer(pki.oids.friendlyName).getBytes()),\n        // attrValues\n        asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SET, true, [\n          asn1.create(asn1.Class.UNIVERSAL, asn1.Type.BMPSTRING, false,\n            options.friendlyName)\n        ])\n      ]));\n  }\n\n  if(attrs.length > 0) {\n    bagAttrs = asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SET, true, attrs);\n  }\n\n  // collect contents for AuthenticatedSafe\n  var contents = [];\n\n  // create safe bag(s) for certificate chain\n  var chain = [];\n  if(cert !== null) {\n    if(forge.util.isArray(cert)) {\n      chain = cert;\n    } else {\n      chain = [cert];\n    }\n  }\n\n  var certSafeBags = [];\n  for(var i = 0; i < chain.length; ++i) {\n    // convert cert from PEM as necessary\n    cert = chain[i];\n    if(typeof cert === 'string') {\n      cert = pki.certificateFromPem(cert);\n    }\n\n    // SafeBag\n    var certBagAttrs = (i === 0) ? bagAttrs : undefined;\n    var certAsn1 = pki.certificateToAsn1(cert);\n    var certSafeBag =\n      asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [\n        // bagId\n        asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OID, false,\n          asn1.oidToDer(pki.oids.certBag).getBytes()),\n        // bagValue\n        asn1.create(asn1.Class.CONTEXT_SPECIFIC, 0, true, [\n          // CertBag\n          asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [\n            // certId\n            asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OID, false,\n              asn1.oidToDer(pki.oids.x509Certificate).getBytes()),\n            // certValue (x509Certificate)\n            asn1.create(asn1.Class.CONTEXT_SPECIFIC, 0, true, [\n              asn1.create(\n                asn1.Class.UNIVERSAL, asn1.Type.OCTETSTRING, false,\n                asn1.toDer(certAsn1).getBytes())\n            ])])]),\n        // bagAttributes (OPTIONAL)\n        certBagAttrs\n      ]);\n    certSafeBags.push(certSafeBag);\n  }\n\n  if(certSafeBags.length > 0) {\n    // SafeContents\n    var certSafeContents = asn1.create(\n      asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, certSafeBags);\n\n    // ContentInfo\n    var certCI =\n      // PKCS#7 ContentInfo\n      asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [\n        // contentType\n        asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OID, false,\n          // OID for the content type is 'data'\n          asn1.oidToDer(pki.oids.data).getBytes()),\n        // content\n        asn1.create(asn1.Class.CONTEXT_SPECIFIC, 0, true, [\n          asn1.create(\n            asn1.Class.UNIVERSAL, asn1.Type.OCTETSTRING, false,\n            asn1.toDer(certSafeContents).getBytes())\n        ])\n      ]);\n    contents.push(certCI);\n  }\n\n  // create safe contents for private key\n  var keyBag = null;\n  if(key !== null) {\n    // SafeBag\n    var pkAsn1 = pki.wrapRsaPrivateKey(pki.privateKeyToAsn1(key));\n    if(password === null) {\n      // no encryption\n      keyBag = asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [\n        // bagId\n        asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OID, false,\n          asn1.oidToDer(pki.oids.keyBag).getBytes()),\n        // bagValue\n        asn1.create(asn1.Class.CONTEXT_SPECIFIC, 0, true, [\n          // PrivateKeyInfo\n          pkAsn1\n        ]),\n        // bagAttributes (OPTIONAL)\n        bagAttrs\n      ]);\n    } else {\n      // encrypted PrivateKeyInfo\n      keyBag = asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [\n        // bagId\n        asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OID, false,\n          asn1.oidToDer(pki.oids.pkcs8ShroudedKeyBag).getBytes()),\n        // bagValue\n        asn1.create(asn1.Class.CONTEXT_SPECIFIC, 0, true, [\n          // EncryptedPrivateKeyInfo\n          pki.encryptPrivateKeyInfo(pkAsn1, password, options)\n        ]),\n        // bagAttributes (OPTIONAL)\n        bagAttrs\n      ]);\n    }\n\n    // SafeContents\n    var keySafeContents =\n      asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [keyBag]);\n\n    // ContentInfo\n    var keyCI =\n      // PKCS#7 ContentInfo\n      asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [\n        // contentType\n        asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OID, false,\n          // OID for the content type is 'data'\n          asn1.oidToDer(pki.oids.data).getBytes()),\n        // content\n        asn1.create(asn1.Class.CONTEXT_SPECIFIC, 0, true, [\n          asn1.create(\n            asn1.Class.UNIVERSAL, asn1.Type.OCTETSTRING, false,\n            asn1.toDer(keySafeContents).getBytes())\n        ])\n      ]);\n    contents.push(keyCI);\n  }\n\n  // create AuthenticatedSafe by stringing together the contents\n  var safe = asn1.create(\n    asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, contents);\n\n  var macData;\n  if(options.useMac) {\n    // MacData\n    var sha1 = forge.md.sha1.create();\n    var macSalt = new forge.util.ByteBuffer(\n      forge.random.getBytes(options.saltSize));\n    var count = options.count;\n    // 160-bit key\n    var key = p12.generateKey(password, macSalt, 3, count, 20);\n    var mac = forge.hmac.create();\n    mac.start(sha1, key);\n    mac.update(asn1.toDer(safe).getBytes());\n    var macValue = mac.getMac();\n    macData = asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [\n      // mac DigestInfo\n      asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [\n        // digestAlgorithm\n        asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [\n          // algorithm = SHA-1\n          asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OID, false,\n            asn1.oidToDer(pki.oids.sha1).getBytes()),\n          // parameters = Null\n          asn1.create(asn1.Class.UNIVERSAL, asn1.Type.NULL, false, '')\n        ]),\n        // digest\n        asn1.create(\n          asn1.Class.UNIVERSAL, asn1.Type.OCTETSTRING,\n          false, macValue.getBytes())\n      ]),\n      // macSalt OCTET STRING\n      asn1.create(\n        asn1.Class.UNIVERSAL, asn1.Type.OCTETSTRING, false, macSalt.getBytes()),\n      // iterations INTEGER (XXX: Only support count < 65536)\n      asn1.create(asn1.Class.UNIVERSAL, asn1.Type.INTEGER, false,\n        asn1.integerToDer(count).getBytes()\n      )\n    ]);\n  }\n\n  // PFX\n  return asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [\n    // version (3)\n    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.INTEGER, false,\n      asn1.integerToDer(3).getBytes()),\n    // PKCS#7 ContentInfo\n    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [\n      // contentType\n      asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OID, false,\n        // OID for the content type is 'data'\n        asn1.oidToDer(pki.oids.data).getBytes()),\n      // content\n      asn1.create(asn1.Class.CONTEXT_SPECIFIC, 0, true, [\n        asn1.create(\n          asn1.Class.UNIVERSAL, asn1.Type.OCTETSTRING, false,\n          asn1.toDer(safe).getBytes())\n      ])\n    ]),\n    macData\n  ]);\n};\n\n/**\n * Derives a PKCS#12 key.\n *\n * @param password the password to derive the key material from, null or\n *          undefined for none.\n * @param salt the salt, as a ByteBuffer, to use.\n * @param id the PKCS#12 ID byte (1 = key material, 2 = IV, 3 = MAC).\n * @param iter the iteration count.\n * @param n the number of bytes to derive from the password.\n * @param md the message digest to use, defaults to SHA-1.\n *\n * @return a ByteBuffer with the bytes derived from the password.\n */\np12.generateKey = forge.pbe.generatePkcs12Key;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODcuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbm9kZS1mb3JnZS9saWIvcGtjczEyLmpzP2UzNzYiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBKYXZhc2NyaXB0IGltcGxlbWVudGF0aW9uIG9mIFBLQ1MjMTIuXG4gKlxuICogQGF1dGhvciBEYXZlIExvbmdsZXlcbiAqIEBhdXRob3IgU3RlZmFuIFNpZWdsIDxzdGVzaWVAYnJva2VucGlwZS5kZT5cbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxNCBEaWdpdGFsIEJhemFhciwgSW5jLlxuICogQ29weXJpZ2h0IChjKSAyMDEyIFN0ZWZhbiBTaWVnbCA8c3Rlc2llQGJyb2tlbnBpcGUuZGU+XG4gKlxuICogVGhlIEFTTi4xIHJlcHJlc2VudGF0aW9uIG9mIFBLQ1MjMTIgaXMgYXMgZm9sbG93c1xuICogKHNlZSBmdHA6Ly9mdHAucnNhc2VjdXJpdHkuY29tL3B1Yi9wa2NzL3BrY3MtMTIvcGtjcy0xMi10YzEucGRmIGZvciBkZXRhaWxzKVxuICpcbiAqIFBGWCA6Oj0gU0VRVUVOQ0Uge1xuICogICB2ZXJzaW9uICBJTlRFR0VSIHt2MygzKX0odjMsLi4uKSxcbiAqICAgYXV0aFNhZmUgQ29udGVudEluZm8sXG4gKiAgIG1hY0RhdGEgIE1hY0RhdGEgT1BUSU9OQUxcbiAqIH1cbiAqXG4gKiBNYWNEYXRhIDo6PSBTRVFVRU5DRSB7XG4gKiAgIG1hYyBEaWdlc3RJbmZvLFxuICogICBtYWNTYWx0IE9DVEVUIFNUUklORyxcbiAqICAgaXRlcmF0aW9ucyBJTlRFR0VSIERFRkFVTFQgMVxuICogfVxuICogTm90ZTogVGhlIGl0ZXJhdGlvbnMgZGVmYXVsdCBpcyBmb3IgaGlzdG9yaWNhbCByZWFzb25zIGFuZCBpdHMgdXNlIGlzXG4gKiBkZXByZWNhdGVkLiBBIGhpZ2hlciB2YWx1ZSwgbGlrZSAxMDI0LCBpcyByZWNvbW1lbmRlZC5cbiAqXG4gKiBEaWdlc3RJbmZvIGlzIGRlZmluZWQgaW4gUEtDUyM3IGFzIGZvbGxvd3M6XG4gKlxuICogRGlnZXN0SW5mbyA6Oj0gU0VRVUVOQ0Uge1xuICogICBkaWdlc3RBbGdvcml0aG0gRGlnZXN0QWxnb3JpdGhtSWRlbnRpZmllcixcbiAqICAgZGlnZXN0IERpZ2VzdFxuICogfVxuICpcbiAqIERpZ2VzdEFsZ29yaXRobUlkZW50aWZpZXIgOjo9IEFsZ29yaXRobUlkZW50aWZpZXJcbiAqXG4gKiBUaGUgQWxnb3JpdGhtSWRlbnRpZmllciBjb250YWlucyBhbiBPYmplY3QgSWRlbnRpZmllciAoT0lEKSBhbmQgcGFyYW1ldGVyc1xuICogZm9yIHRoZSBhbGdvcml0aG0sIGlmIGFueS4gSW4gdGhlIGNhc2Ugb2YgU0hBMSB0aGVyZSBpcyBub25lLlxuICpcbiAqIEFsZ29yaXRobUlkZW50aWZlciA6Oj0gU0VRVUVOQ0Uge1xuICogICAgYWxnb3JpdGhtIE9CSkVDVCBJREVOVElGSUVSLFxuICogICAgcGFyYW1ldGVycyBBTlkgREVGSU5FRCBCWSBhbGdvcml0aG0gT1BUSU9OQUxcbiAqIH1cbiAqXG4gKiBEaWdlc3QgOjo9IE9DVEVUIFNUUklOR1xuICpcbiAqXG4gKiBDb250ZW50SW5mbyA6Oj0gU0VRVUVOQ0Uge1xuICogICBjb250ZW50VHlwZSBDb250ZW50VHlwZSxcbiAqICAgY29udGVudCAgICAgWzBdIEVYUExJQ0lUIEFOWSBERUZJTkVEIEJZIGNvbnRlbnRUeXBlIE9QVElPTkFMXG4gKiB9XG4gKlxuICogQ29udGVudFR5cGUgOjo9IE9CSkVDVCBJREVOVElGSUVSXG4gKlxuICogQXV0aGVudGljYXRlZFNhZmUgOjo9IFNFUVVFTkNFIE9GIENvbnRlbnRJbmZvXG4gKiAtLSBEYXRhIGlmIHVuZW5jcnlwdGVkXG4gKiAtLSBFbmNyeXB0ZWREYXRhIGlmIHBhc3N3b3JkLWVuY3J5cHRlZFxuICogLS0gRW52ZWxvcGVkRGF0YSBpZiBwdWJsaWMga2V5LWVuY3J5cHRlZFxuICpcbiAqXG4gKiBTYWZlQ29udGVudHMgOjo9IFNFUVVFTkNFIE9GIFNhZmVCYWdcbiAqXG4gKiBTYWZlQmFnIDo6PSBTRVFVRU5DRSB7XG4gKiAgIGJhZ0lkICAgICBCQUctVFlQRS4maWQgKHtQS0NTMTJCYWdTZXR9KVxuICogICBiYWdWYWx1ZSAgWzBdIEVYUExJQ0lUIEJBRy1UWVBFLiZUeXBlKHtQS0NTMTJCYWdTZXR9e0BiYWdJZH0pLFxuICogICBiYWdBdHRyaWJ1dGVzIFNFVCBPRiBQS0NTMTJBdHRyaWJ1dGUgT1BUSU9OQUxcbiAqIH1cbiAqXG4gKiBQS0NTMTJBdHRyaWJ1dGUgOjo9IFNFUVVFTkNFIHtcbiAqICAgYXR0cklkIEFUVFJJQlVURS4maWQgKHtQS0NTMTJBdHRyU2V0fSksXG4gKiAgIGF0dHJWYWx1ZXMgU0VUIE9GIEFUVFJJQlVURS4mVHlwZSAoe1BLQ1MxMkF0dHJTZXR9e0BhdHRySWR9KVxuICogfSAtLSBUaGlzIHR5cGUgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBYLjUwMCB0eXBlICdBdHRyaWJ1dGUnXG4gKlxuICogUEtDUzEyQXR0clNldCBBVFRSSUJVVEUgOjo9IHtcbiAqICAgZnJpZW5kbHlOYW1lIHwgLS0gZnJvbSBQS0NTICM5XG4gKiAgIGxvY2FsS2V5SWQsIC0tIGZyb20gUEtDUyAjOVxuICogICAuLi4gLS0gT3RoZXIgYXR0cmlidXRlcyBhcmUgYWxsb3dlZFxuICogfVxuICpcbiAqIENlcnRCYWcgOjo9IFNFUVVFTkNFIHtcbiAqICAgY2VydElkICAgIEJBRy1UWVBFLiZpZCAgICh7Q2VydFR5cGVzfSksXG4gKiAgIGNlcnRWYWx1ZSBbMF0gRVhQTElDSVQgQkFHLVRZUEUuJlR5cGUgKHtDZXJ0VHlwZXN9e0BjZXJ0SWR9KVxuICogfVxuICpcbiAqIHg1MDlDZXJ0aWZpY2F0ZSBCQUctVFlQRSA6Oj0ge09DVEVUIFNUUklORyBJREVOVElGSUVEIEJZIHtjZXJ0VHlwZXMgMX19XG4gKiAgIC0tIERFUi1lbmNvZGVkIFguNTA5IGNlcnRpZmljYXRlIHN0b3JlZCBpbiBPQ1RFVCBTVFJJTkdcbiAqXG4gKiBzZHNpQ2VydGlmaWNhdGUgQkFHLVRZUEUgOjo9IHtJQTVTdHJpbmcgSURFTlRJRklFRCBCWSB7Y2VydFR5cGVzIDJ9fVxuICogLS0gQmFzZTY0LWVuY29kZWQgU0RTSSBjZXJ0aWZpY2F0ZSBzdG9yZWQgaW4gSUE1U3RyaW5nXG4gKlxuICogQ2VydFR5cGVzIEJBRy1UWVBFIDo6PSB7XG4gKiAgIHg1MDlDZXJ0aWZpY2F0ZSB8XG4gKiAgIHNkc2lDZXJ0aWZpY2F0ZSxcbiAqICAgLi4uIC0tIEZvciBmdXR1cmUgZXh0ZW5zaW9uc1xuICogfVxuICovXG52YXIgZm9yZ2UgPSByZXF1aXJlKCcuL2ZvcmdlJyk7XG5yZXF1aXJlKCcuL2FzbjEnKTtcbnJlcXVpcmUoJy4vaG1hYycpO1xucmVxdWlyZSgnLi9vaWRzJyk7XG5yZXF1aXJlKCcuL3BrY3M3YXNuMScpO1xucmVxdWlyZSgnLi9wYmUnKTtcbnJlcXVpcmUoJy4vcmFuZG9tJyk7XG5yZXF1aXJlKCcuL3JzYScpO1xucmVxdWlyZSgnLi9zaGExJyk7XG5yZXF1aXJlKCcuL3V0aWwnKTtcbnJlcXVpcmUoJy4veDUwOScpO1xuXG4vLyBzaG9ydGN1dCBmb3IgYXNuLjEgJiBQS0kgQVBJXG52YXIgYXNuMSA9IGZvcmdlLmFzbjE7XG52YXIgcGtpID0gZm9yZ2UucGtpO1xuXG4vLyBzaG9ydGN1dCBmb3IgUEtDUyMxMiBBUElcbnZhciBwMTIgPSBtb2R1bGUuZXhwb3J0cyA9IGZvcmdlLnBrY3MxMiA9IGZvcmdlLnBrY3MxMiB8fCB7fTtcblxudmFyIGNvbnRlbnRJbmZvVmFsaWRhdG9yID0ge1xuICBuYW1lOiAnQ29udGVudEluZm8nLFxuICB0YWdDbGFzczogYXNuMS5DbGFzcy5VTklWRVJTQUwsXG4gIHR5cGU6IGFzbjEuVHlwZS5TRVFVRU5DRSwgIC8vIGEgQ29udGVudEluZm9cbiAgY29uc3RydWN0ZWQ6IHRydWUsXG4gIHZhbHVlOiBbe1xuICAgIG5hbWU6ICdDb250ZW50SW5mby5jb250ZW50VHlwZScsXG4gICAgdGFnQ2xhc3M6IGFzbjEuQ2xhc3MuVU5JVkVSU0FMLFxuICAgIHR5cGU6IGFzbjEuVHlwZS5PSUQsXG4gICAgY29uc3RydWN0ZWQ6IGZhbHNlLFxuICAgIGNhcHR1cmU6ICdjb250ZW50VHlwZSdcbiAgfSwge1xuICAgIG5hbWU6ICdDb250ZW50SW5mby5jb250ZW50JyxcbiAgICB0YWdDbGFzczogYXNuMS5DbGFzcy5DT05URVhUX1NQRUNJRklDLFxuICAgIGNvbnN0cnVjdGVkOiB0cnVlLFxuICAgIGNhcHR1cmVBc24xOiAnY29udGVudCdcbiAgfV1cbn07XG5cbnZhciBwZnhWYWxpZGF0b3IgPSB7XG4gIG5hbWU6ICdQRlgnLFxuICB0YWdDbGFzczogYXNuMS5DbGFzcy5VTklWRVJTQUwsXG4gIHR5cGU6IGFzbjEuVHlwZS5TRVFVRU5DRSxcbiAgY29uc3RydWN0ZWQ6IHRydWUsXG4gIHZhbHVlOiBbe1xuICAgIG5hbWU6ICdQRlgudmVyc2lvbicsXG4gICAgdGFnQ2xhc3M6IGFzbjEuQ2xhc3MuVU5JVkVSU0FMLFxuICAgIHR5cGU6IGFzbjEuVHlwZS5JTlRFR0VSLFxuICAgIGNvbnN0cnVjdGVkOiBmYWxzZSxcbiAgICBjYXB0dXJlOiAndmVyc2lvbidcbiAgfSxcbiAgY29udGVudEluZm9WYWxpZGF0b3IsIHtcbiAgICBuYW1lOiAnUEZYLm1hY0RhdGEnLFxuICAgIHRhZ0NsYXNzOiBhc24xLkNsYXNzLlVOSVZFUlNBTCxcbiAgICB0eXBlOiBhc24xLlR5cGUuU0VRVUVOQ0UsXG4gICAgY29uc3RydWN0ZWQ6IHRydWUsXG4gICAgb3B0aW9uYWw6IHRydWUsXG4gICAgY2FwdHVyZUFzbjE6ICdtYWMnLFxuICAgIHZhbHVlOiBbe1xuICAgICAgbmFtZTogJ1BGWC5tYWNEYXRhLm1hYycsXG4gICAgICB0YWdDbGFzczogYXNuMS5DbGFzcy5VTklWRVJTQUwsXG4gICAgICB0eXBlOiBhc24xLlR5cGUuU0VRVUVOQ0UsICAvLyBEaWdlc3RJbmZvXG4gICAgICBjb25zdHJ1Y3RlZDogdHJ1ZSxcbiAgICAgIHZhbHVlOiBbe1xuICAgICAgICBuYW1lOiAnUEZYLm1hY0RhdGEubWFjLmRpZ2VzdEFsZ29yaXRobScsXG4gICAgICAgIHRhZ0NsYXNzOiBhc24xLkNsYXNzLlVOSVZFUlNBTCxcbiAgICAgICAgdHlwZTogYXNuMS5UeXBlLlNFUVVFTkNFLCAgLy8gRGlnZXN0QWxnb3JpdGhtSWRlbnRpZmllclxuICAgICAgICBjb25zdHJ1Y3RlZDogdHJ1ZSxcbiAgICAgICAgdmFsdWU6IFt7XG4gICAgICAgICAgbmFtZTogJ1BGWC5tYWNEYXRhLm1hYy5kaWdlc3RBbGdvcml0aG0uYWxnb3JpdGhtJyxcbiAgICAgICAgICB0YWdDbGFzczogYXNuMS5DbGFzcy5VTklWRVJTQUwsXG4gICAgICAgICAgdHlwZTogYXNuMS5UeXBlLk9JRCxcbiAgICAgICAgICBjb25zdHJ1Y3RlZDogZmFsc2UsXG4gICAgICAgICAgY2FwdHVyZTogJ21hY0FsZ29yaXRobSdcbiAgICAgICAgfSwge1xuICAgICAgICAgIG5hbWU6ICdQRlgubWFjRGF0YS5tYWMuZGlnZXN0QWxnb3JpdGhtLnBhcmFtZXRlcnMnLFxuICAgICAgICAgIHRhZ0NsYXNzOiBhc24xLkNsYXNzLlVOSVZFUlNBTCxcbiAgICAgICAgICBjYXB0dXJlQXNuMTogJ21hY0FsZ29yaXRobVBhcmFtZXRlcnMnXG4gICAgICAgIH1dXG4gICAgICB9LCB7XG4gICAgICAgIG5hbWU6ICdQRlgubWFjRGF0YS5tYWMuZGlnZXN0JyxcbiAgICAgICAgdGFnQ2xhc3M6IGFzbjEuQ2xhc3MuVU5JVkVSU0FMLFxuICAgICAgICB0eXBlOiBhc24xLlR5cGUuT0NURVRTVFJJTkcsXG4gICAgICAgIGNvbnN0cnVjdGVkOiBmYWxzZSxcbiAgICAgICAgY2FwdHVyZTogJ21hY0RpZ2VzdCdcbiAgICAgIH1dXG4gICAgfSwge1xuICAgICAgbmFtZTogJ1BGWC5tYWNEYXRhLm1hY1NhbHQnLFxuICAgICAgdGFnQ2xhc3M6IGFzbjEuQ2xhc3MuVU5JVkVSU0FMLFxuICAgICAgdHlwZTogYXNuMS5UeXBlLk9DVEVUU1RSSU5HLFxuICAgICAgY29uc3RydWN0ZWQ6IGZhbHNlLFxuICAgICAgY2FwdHVyZTogJ21hY1NhbHQnXG4gICAgfSwge1xuICAgICAgbmFtZTogJ1BGWC5tYWNEYXRhLml0ZXJhdGlvbnMnLFxuICAgICAgdGFnQ2xhc3M6IGFzbjEuQ2xhc3MuVU5JVkVSU0FMLFxuICAgICAgdHlwZTogYXNuMS5UeXBlLklOVEVHRVIsXG4gICAgICBjb25zdHJ1Y3RlZDogZmFsc2UsXG4gICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICAgIGNhcHR1cmU6ICdtYWNJdGVyYXRpb25zJ1xuICAgIH1dXG4gIH1dXG59O1xuXG52YXIgc2FmZUJhZ1ZhbGlkYXRvciA9IHtcbiAgbmFtZTogJ1NhZmVCYWcnLFxuICB0YWdDbGFzczogYXNuMS5DbGFzcy5VTklWRVJTQUwsXG4gIHR5cGU6IGFzbjEuVHlwZS5TRVFVRU5DRSxcbiAgY29uc3RydWN0ZWQ6IHRydWUsXG4gIHZhbHVlOiBbe1xuICAgIG5hbWU6ICdTYWZlQmFnLmJhZ0lkJyxcbiAgICB0YWdDbGFzczogYXNuMS5DbGFzcy5VTklWRVJTQUwsXG4gICAgdHlwZTogYXNuMS5UeXBlLk9JRCxcbiAgICBjb25zdHJ1Y3RlZDogZmFsc2UsXG4gICAgY2FwdHVyZTogJ2JhZ0lkJ1xuICB9LCB7XG4gICAgbmFtZTogJ1NhZmVCYWcuYmFnVmFsdWUnLFxuICAgIHRhZ0NsYXNzOiBhc24xLkNsYXNzLkNPTlRFWFRfU1BFQ0lGSUMsXG4gICAgY29uc3RydWN0ZWQ6IHRydWUsXG4gICAgY2FwdHVyZUFzbjE6ICdiYWdWYWx1ZSdcbiAgfSwge1xuICAgIG5hbWU6ICdTYWZlQmFnLmJhZ0F0dHJpYnV0ZXMnLFxuICAgIHRhZ0NsYXNzOiBhc24xLkNsYXNzLlVOSVZFUlNBTCxcbiAgICB0eXBlOiBhc24xLlR5cGUuU0VULFxuICAgIGNvbnN0cnVjdGVkOiB0cnVlLFxuICAgIG9wdGlvbmFsOiB0cnVlLFxuICAgIGNhcHR1cmU6ICdiYWdBdHRyaWJ1dGVzJ1xuICB9XVxufTtcblxudmFyIGF0dHJpYnV0ZVZhbGlkYXRvciA9IHtcbiAgbmFtZTogJ0F0dHJpYnV0ZScsXG4gIHRhZ0NsYXNzOiBhc24xLkNsYXNzLlVOSVZFUlNBTCxcbiAgdHlwZTogYXNuMS5UeXBlLlNFUVVFTkNFLFxuICBjb25zdHJ1Y3RlZDogdHJ1ZSxcbiAgdmFsdWU6IFt7XG4gICAgbmFtZTogJ0F0dHJpYnV0ZS5hdHRySWQnLFxuICAgIHRhZ0NsYXNzOiBhc24xLkNsYXNzLlVOSVZFUlNBTCxcbiAgICB0eXBlOiBhc24xLlR5cGUuT0lELFxuICAgIGNvbnN0cnVjdGVkOiBmYWxzZSxcbiAgICBjYXB0dXJlOiAnb2lkJ1xuICB9LCB7XG4gICAgbmFtZTogJ0F0dHJpYnV0ZS5hdHRyVmFsdWVzJyxcbiAgICB0YWdDbGFzczogYXNuMS5DbGFzcy5VTklWRVJTQUwsXG4gICAgdHlwZTogYXNuMS5UeXBlLlNFVCxcbiAgICBjb25zdHJ1Y3RlZDogdHJ1ZSxcbiAgICBjYXB0dXJlOiAndmFsdWVzJ1xuICB9XVxufTtcblxudmFyIGNlcnRCYWdWYWxpZGF0b3IgPSB7XG4gIG5hbWU6ICdDZXJ0QmFnJyxcbiAgdGFnQ2xhc3M6IGFzbjEuQ2xhc3MuVU5JVkVSU0FMLFxuICB0eXBlOiBhc24xLlR5cGUuU0VRVUVOQ0UsXG4gIGNvbnN0cnVjdGVkOiB0cnVlLFxuICB2YWx1ZTogW3tcbiAgICBuYW1lOiAnQ2VydEJhZy5jZXJ0SWQnLFxuICAgIHRhZ0NsYXNzOiBhc24xLkNsYXNzLlVOSVZFUlNBTCxcbiAgICB0eXBlOiBhc24xLlR5cGUuT0lELFxuICAgIGNvbnN0cnVjdGVkOiBmYWxzZSxcbiAgICBjYXB0dXJlOiAnY2VydElkJ1xuICB9LCB7XG4gICAgbmFtZTogJ0NlcnRCYWcuY2VydFZhbHVlJyxcbiAgICB0YWdDbGFzczogYXNuMS5DbGFzcy5DT05URVhUX1NQRUNJRklDLFxuICAgIGNvbnN0cnVjdGVkOiB0cnVlLFxuICAgIC8qIFNvIGZhciB3ZSBvbmx5IHN1cHBvcnQgWC41MDkgY2VydGlmaWNhdGVzICh3aGljaCBhcmUgd3JhcHBlZCBpblxuICAgICAgIGFuIE9DVEVUIFNUUklORywgaGVuY2UgaGFyZCBjb2RlIHRoYXQgaGVyZSkuICovXG4gICAgdmFsdWU6IFt7XG4gICAgICBuYW1lOiAnQ2VydEJhZy5jZXJ0VmFsdWVbMF0nLFxuICAgICAgdGFnQ2xhc3M6IGFzbjEuQ2xhc3MuVU5JVkVSU0FMLFxuICAgICAgdHlwZTogYXNuMS5DbGFzcy5PQ1RFVFNUUklORyxcbiAgICAgIGNvbnN0cnVjdGVkOiBmYWxzZSxcbiAgICAgIGNhcHR1cmU6ICdjZXJ0J1xuICAgIH1dXG4gIH1dXG59O1xuXG4vKipcbiAqIFNlYXJjaCBTYWZlQ29udGVudHMgc3RydWN0dXJlIGZvciBiYWdzIHdpdGggbWF0Y2hpbmcgYXR0cmlidXRlcy5cbiAqXG4gKiBUaGUgc2VhcmNoIGNhbiBvcHRpb25hbGx5IGJlIG5hcnJvd2VkIGJ5IGEgY2VydGFpbiBiYWcgdHlwZS5cbiAqXG4gKiBAcGFyYW0gc2FmZUNvbnRlbnRzIHRoZSBTYWZlQ29udGVudHMgc3RydWN0dXJlIHRvIHNlYXJjaCBpbi5cbiAqIEBwYXJhbSBhdHRyTmFtZSB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIHRvIGNvbXBhcmUgYWdhaW5zdC5cbiAqIEBwYXJhbSBhdHRyVmFsdWUgdGhlIGF0dHJpYnV0ZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICogQHBhcmFtIFtiYWdUeXBlXSBiYWcgdHlwZSB0byBuYXJyb3cgc2VhcmNoIGJ5LlxuICpcbiAqIEByZXR1cm4gYW4gYXJyYXkgb2YgbWF0Y2hpbmcgYmFncy5cbiAqL1xuZnVuY3Rpb24gX2dldEJhZ3NCeUF0dHJpYnV0ZShzYWZlQ29udGVudHMsIGF0dHJOYW1lLCBhdHRyVmFsdWUsIGJhZ1R5cGUpIHtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuXG4gIGZvcih2YXIgaSA9IDA7IGkgPCBzYWZlQ29udGVudHMubGVuZ3RoOyBpKyspIHtcbiAgICBmb3IodmFyIGogPSAwOyBqIDwgc2FmZUNvbnRlbnRzW2ldLnNhZmVCYWdzLmxlbmd0aDsgaisrKSB7XG4gICAgICB2YXIgYmFnID0gc2FmZUNvbnRlbnRzW2ldLnNhZmVCYWdzW2pdO1xuICAgICAgaWYoYmFnVHlwZSAhPT0gdW5kZWZpbmVkICYmIGJhZy50eXBlICE9PSBiYWdUeXBlKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgLy8gb25seSBmaWx0ZXIgYnkgYmFnIHR5cGUsIG5vIGF0dHJpYnV0ZSBzcGVjaWZpZWRcbiAgICAgIGlmKGF0dHJOYW1lID09PSBudWxsKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKGJhZyk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYoYmFnLmF0dHJpYnV0ZXNbYXR0ck5hbWVdICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgYmFnLmF0dHJpYnV0ZXNbYXR0ck5hbWVdLmluZGV4T2YoYXR0clZhbHVlKSA+PSAwKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKGJhZyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIFBLQ1MjMTIgUEZYIGluIEFTTi4xIG5vdGF0aW9uIGludG8gYSBQRlggb2JqZWN0LlxuICpcbiAqIEBwYXJhbSBvYmogVGhlIFBLQ1MjMTIgUEZYIGluIEFTTi4xIG5vdGF0aW9uLlxuICogQHBhcmFtIHN0cmljdCB0cnVlIHRvIHVzZSBzdHJpY3QgREVSIGRlY29kaW5nLCBmYWxzZSBub3QgdG8gKGRlZmF1bHQ6IHRydWUpLlxuICogQHBhcmFtIHtTdHJpbmd9IHBhc3N3b3JkIFBhc3N3b3JkIHRvIGRlY3J5cHQgd2l0aCAob3B0aW9uYWwpLlxuICpcbiAqIEByZXR1cm4gUEtDUyMxMiBQRlggb2JqZWN0LlxuICovXG5wMTIucGtjczEyRnJvbUFzbjEgPSBmdW5jdGlvbihvYmosIHN0cmljdCwgcGFzc3dvcmQpIHtcbiAgLy8gaGFuZGxlIGFyZ3NcbiAgaWYodHlwZW9mIHN0cmljdCA9PT0gJ3N0cmluZycpIHtcbiAgICBwYXNzd29yZCA9IHN0cmljdDtcbiAgICBzdHJpY3QgPSB0cnVlO1xuICB9IGVsc2UgaWYoc3RyaWN0ID09PSB1bmRlZmluZWQpIHtcbiAgICBzdHJpY3QgPSB0cnVlO1xuICB9XG5cbiAgLy8gdmFsaWRhdGUgUEZYIGFuZCBjYXB0dXJlIGRhdGFcbiAgdmFyIGNhcHR1cmUgPSB7fTtcbiAgdmFyIGVycm9ycyA9IFtdO1xuICBpZighYXNuMS52YWxpZGF0ZShvYmosIHBmeFZhbGlkYXRvciwgY2FwdHVyZSwgZXJyb3JzKSkge1xuICAgIHZhciBlcnJvciA9IG5ldyBFcnJvcignQ2Fubm90IHJlYWQgUEtDUyMxMiBQRlguICcgK1xuICAgICAgJ0FTTi4xIG9iamVjdCBpcyBub3QgYW4gUEtDUyMxMiBQRlguJyk7XG4gICAgZXJyb3IuZXJyb3JzID0gZXJyb3I7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cblxuICB2YXIgcGZ4ID0ge1xuICAgIHZlcnNpb246IGNhcHR1cmUudmVyc2lvbi5jaGFyQ29kZUF0KDApLFxuICAgIHNhZmVDb250ZW50czogW10sXG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGJhZ3Mgd2l0aCBtYXRjaGluZyBhdHRyaWJ1dGVzLlxuICAgICAqXG4gICAgICogQHBhcmFtIGZpbHRlciB0aGUgYXR0cmlidXRlcyB0byBmaWx0ZXIgYnk6XG4gICAgICogICAgICAgICAgW2xvY2FsS2V5SWRdIHRoZSBsb2NhbEtleUlkIHRvIHNlYXJjaCBmb3IuXG4gICAgICogICAgICAgICAgW2xvY2FsS2V5SWRIZXhdIHRoZSBsb2NhbEtleUlkIGluIGhleCB0byBzZWFyY2ggZm9yLlxuICAgICAqICAgICAgICAgIFtmcmllbmRseU5hbWVdIHRoZSBmcmllbmRseSBuYW1lIHRvIHNlYXJjaCBmb3IuXG4gICAgICogICAgICAgICAgW2JhZ1R5cGVdIGJhZyB0eXBlIHRvIG5hcnJvdyBlYWNoIGF0dHJpYnV0ZSBzZWFyY2ggYnkuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIGEgbWFwIG9mIGF0dHJpYnV0ZSB0eXBlIHRvIGFuIGFycmF5IG9mIG1hdGNoaW5nIGJhZ3Mgb3IsIGlmIG5vXG4gICAgICogICAgICAgICAgIGF0dHJpYnV0ZSB3YXMgZ2l2ZW4gYnV0IGEgYmFnIHR5cGUsIHRoZSBtYXAga2V5IHdpbGwgYmUgdGhlXG4gICAgICogICAgICAgICAgIGJhZyB0eXBlLlxuICAgICAqL1xuICAgIGdldEJhZ3M6IGZ1bmN0aW9uKGZpbHRlcikge1xuICAgICAgdmFyIHJ2YWwgPSB7fTtcblxuICAgICAgdmFyIGxvY2FsS2V5SWQ7XG4gICAgICBpZignbG9jYWxLZXlJZCcgaW4gZmlsdGVyKSB7XG4gICAgICAgIGxvY2FsS2V5SWQgPSBmaWx0ZXIubG9jYWxLZXlJZDtcbiAgICAgIH0gZWxzZSBpZignbG9jYWxLZXlJZEhleCcgaW4gZmlsdGVyKSB7XG4gICAgICAgIGxvY2FsS2V5SWQgPSBmb3JnZS51dGlsLmhleFRvQnl0ZXMoZmlsdGVyLmxvY2FsS2V5SWRIZXgpO1xuICAgICAgfVxuXG4gICAgICAvLyBmaWx0ZXIgb24gYmFnVHlwZSBvbmx5XG4gICAgICBpZihsb2NhbEtleUlkID09PSB1bmRlZmluZWQgJiYgISgnZnJpZW5kbHlOYW1lJyBpbiBmaWx0ZXIpICYmXG4gICAgICAgICdiYWdUeXBlJyBpbiBmaWx0ZXIpIHtcbiAgICAgICAgcnZhbFtmaWx0ZXIuYmFnVHlwZV0gPSBfZ2V0QmFnc0J5QXR0cmlidXRlKFxuICAgICAgICAgIHBmeC5zYWZlQ29udGVudHMsIG51bGwsIG51bGwsIGZpbHRlci5iYWdUeXBlKTtcbiAgICAgIH1cblxuICAgICAgaWYobG9jYWxLZXlJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJ2YWwubG9jYWxLZXlJZCA9IF9nZXRCYWdzQnlBdHRyaWJ1dGUoXG4gICAgICAgICAgcGZ4LnNhZmVDb250ZW50cywgJ2xvY2FsS2V5SWQnLFxuICAgICAgICAgIGxvY2FsS2V5SWQsIGZpbHRlci5iYWdUeXBlKTtcbiAgICAgIH1cbiAgICAgIGlmKCdmcmllbmRseU5hbWUnIGluIGZpbHRlcikge1xuICAgICAgICBydmFsLmZyaWVuZGx5TmFtZSA9IF9nZXRCYWdzQnlBdHRyaWJ1dGUoXG4gICAgICAgICAgcGZ4LnNhZmVDb250ZW50cywgJ2ZyaWVuZGx5TmFtZScsXG4gICAgICAgICAgZmlsdGVyLmZyaWVuZGx5TmFtZSwgZmlsdGVyLmJhZ1R5cGUpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcnZhbDtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogREVQUkVDQVRFRDogdXNlIGdldEJhZ3MoKSBpbnN0ZWFkLlxuICAgICAqXG4gICAgICogR2V0IGJhZ3Mgd2l0aCBtYXRjaGluZyBmcmllbmRseU5hbWUgYXR0cmlidXRlLlxuICAgICAqXG4gICAgICogQHBhcmFtIGZyaWVuZGx5TmFtZSB0aGUgZnJpZW5kbHkgbmFtZSB0byBzZWFyY2ggZm9yLlxuICAgICAqIEBwYXJhbSBbYmFnVHlwZV0gYmFnIHR5cGUgdG8gbmFycm93IHNlYXJjaCBieS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gYW4gYXJyYXkgb2YgYmFncyB3aXRoIG1hdGNoaW5nIGZyaWVuZGx5TmFtZSBhdHRyaWJ1dGUuXG4gICAgICovXG4gICAgZ2V0QmFnc0J5RnJpZW5kbHlOYW1lOiBmdW5jdGlvbihmcmllbmRseU5hbWUsIGJhZ1R5cGUpIHtcbiAgICAgIHJldHVybiBfZ2V0QmFnc0J5QXR0cmlidXRlKFxuICAgICAgICBwZnguc2FmZUNvbnRlbnRzLCAnZnJpZW5kbHlOYW1lJywgZnJpZW5kbHlOYW1lLCBiYWdUeXBlKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogREVQUkVDQVRFRDogdXNlIGdldEJhZ3MoKSBpbnN0ZWFkLlxuICAgICAqXG4gICAgICogR2V0IGJhZ3Mgd2l0aCBtYXRjaGluZyBsb2NhbEtleUlkIGF0dHJpYnV0ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBsb2NhbEtleUlkIHRoZSBsb2NhbEtleUlkIHRvIHNlYXJjaCBmb3IuXG4gICAgICogQHBhcmFtIFtiYWdUeXBlXSBiYWcgdHlwZSB0byBuYXJyb3cgc2VhcmNoIGJ5LlxuICAgICAqXG4gICAgICogQHJldHVybiBhbiBhcnJheSBvZiBiYWdzIHdpdGggbWF0Y2hpbmcgbG9jYWxLZXlJZCBhdHRyaWJ1dGUuXG4gICAgICovXG4gICAgZ2V0QmFnc0J5TG9jYWxLZXlJZDogZnVuY3Rpb24obG9jYWxLZXlJZCwgYmFnVHlwZSkge1xuICAgICAgcmV0dXJuIF9nZXRCYWdzQnlBdHRyaWJ1dGUoXG4gICAgICAgIHBmeC5zYWZlQ29udGVudHMsICdsb2NhbEtleUlkJywgbG9jYWxLZXlJZCwgYmFnVHlwZSk7XG4gICAgfVxuICB9O1xuXG4gIGlmKGNhcHR1cmUudmVyc2lvbi5jaGFyQ29kZUF0KDApICE9PSAzKSB7XG4gICAgdmFyIGVycm9yID0gbmV3IEVycm9yKCdQS0NTIzEyIFBGWCBvZiB2ZXJzaW9uIG90aGVyIHRoYW4gMyBub3Qgc3VwcG9ydGVkLicpO1xuICAgIGVycm9yLnZlcnNpb24gPSBjYXB0dXJlLnZlcnNpb24uY2hhckNvZGVBdCgwKTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxuXG4gIGlmKGFzbjEuZGVyVG9PaWQoY2FwdHVyZS5jb250ZW50VHlwZSkgIT09IHBraS5vaWRzLmRhdGEpIHtcbiAgICB2YXIgZXJyb3IgPSBuZXcgRXJyb3IoJ09ubHkgUEtDUyMxMiBQRlggaW4gcGFzc3dvcmQgaW50ZWdyaXR5IG1vZGUgc3VwcG9ydGVkLicpO1xuICAgIGVycm9yLm9pZCA9IGFzbjEuZGVyVG9PaWQoY2FwdHVyZS5jb250ZW50VHlwZSk7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cblxuICB2YXIgZGF0YSA9IGNhcHR1cmUuY29udGVudC52YWx1ZVswXTtcbiAgaWYoZGF0YS50YWdDbGFzcyAhPT0gYXNuMS5DbGFzcy5VTklWRVJTQUwgfHxcbiAgICAgZGF0YS50eXBlICE9PSBhc24xLlR5cGUuT0NURVRTVFJJTkcpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1BLQ1MjMTIgYXV0aFNhZmUgY29udGVudCBkYXRhIGlzIG5vdCBhbiBPQ1RFVCBTVFJJTkcuJyk7XG4gIH1cbiAgZGF0YSA9IF9kZWNvZGVQa2NzN0RhdGEoZGF0YSk7XG5cbiAgLy8gY2hlY2sgZm9yIE1BQ1xuICBpZihjYXB0dXJlLm1hYykge1xuICAgIHZhciBtZCA9IG51bGw7XG4gICAgdmFyIG1hY0tleUJ5dGVzID0gMDtcbiAgICB2YXIgbWFjQWxnb3JpdGhtID0gYXNuMS5kZXJUb09pZChjYXB0dXJlLm1hY0FsZ29yaXRobSk7XG4gICAgc3dpdGNoKG1hY0FsZ29yaXRobSkge1xuICAgIGNhc2UgcGtpLm9pZHMuc2hhMTpcbiAgICAgIG1kID0gZm9yZ2UubWQuc2hhMS5jcmVhdGUoKTtcbiAgICAgIG1hY0tleUJ5dGVzID0gMjA7XG4gICAgICBicmVhaztcbiAgICBjYXNlIHBraS5vaWRzLnNoYTI1NjpcbiAgICAgIG1kID0gZm9yZ2UubWQuc2hhMjU2LmNyZWF0ZSgpO1xuICAgICAgbWFjS2V5Qnl0ZXMgPSAzMjtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgcGtpLm9pZHMuc2hhMzg0OlxuICAgICAgbWQgPSBmb3JnZS5tZC5zaGEzODQuY3JlYXRlKCk7XG4gICAgICBtYWNLZXlCeXRlcyA9IDQ4O1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBwa2kub2lkcy5zaGE1MTI6XG4gICAgICBtZCA9IGZvcmdlLm1kLnNoYTUxMi5jcmVhdGUoKTtcbiAgICAgIG1hY0tleUJ5dGVzID0gNjQ7XG4gICAgICBicmVhaztcbiAgICBjYXNlIHBraS5vaWRzLm1kNTpcbiAgICAgIG1kID0gZm9yZ2UubWQubWQ1LmNyZWF0ZSgpO1xuICAgICAgbWFjS2V5Qnl0ZXMgPSAxNjtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBpZihtZCA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdQS0NTIzEyIHVzZXMgdW5zdXBwb3J0ZWQgTUFDIGFsZ29yaXRobTogJyArIG1hY0FsZ29yaXRobSk7XG4gICAgfVxuXG4gICAgLy8gdmVyaWZ5IE1BQyAoaXRlcmF0aW9ucyBkZWZhdWx0IHRvIDEpXG4gICAgdmFyIG1hY1NhbHQgPSBuZXcgZm9yZ2UudXRpbC5CeXRlQnVmZmVyKGNhcHR1cmUubWFjU2FsdCk7XG4gICAgdmFyIG1hY0l0ZXJhdGlvbnMgPSAoKCdtYWNJdGVyYXRpb25zJyBpbiBjYXB0dXJlKSA/XG4gICAgICBwYXJzZUludChmb3JnZS51dGlsLmJ5dGVzVG9IZXgoY2FwdHVyZS5tYWNJdGVyYXRpb25zKSwgMTYpIDogMSk7XG4gICAgdmFyIG1hY0tleSA9IHAxMi5nZW5lcmF0ZUtleShcbiAgICAgIHBhc3N3b3JkLCBtYWNTYWx0LCAzLCBtYWNJdGVyYXRpb25zLCBtYWNLZXlCeXRlcywgbWQpO1xuICAgIHZhciBtYWMgPSBmb3JnZS5obWFjLmNyZWF0ZSgpO1xuICAgIG1hYy5zdGFydChtZCwgbWFjS2V5KTtcbiAgICBtYWMudXBkYXRlKGRhdGEudmFsdWUpO1xuICAgIHZhciBtYWNWYWx1ZSA9IG1hYy5nZXRNYWMoKTtcbiAgICBpZihtYWNWYWx1ZS5nZXRCeXRlcygpICE9PSBjYXB0dXJlLm1hY0RpZ2VzdCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdQS0NTIzEyIE1BQyBjb3VsZCBub3QgYmUgdmVyaWZpZWQuIEludmFsaWQgcGFzc3dvcmQ/Jyk7XG4gICAgfVxuICB9XG5cbiAgX2RlY29kZUF1dGhlbnRpY2F0ZWRTYWZlKHBmeCwgZGF0YS52YWx1ZSwgc3RyaWN0LCBwYXNzd29yZCk7XG4gIHJldHVybiBwZng7XG59O1xuXG4vKipcbiAqIERlY29kZXMgUEtDUyM3IERhdGEuIFBLQ1MjNyAoUkZDIDIzMTUpIGRlZmluZXMgXCJEYXRhXCIgYXMgYW4gT0NURVQgU1RSSU5HLFxuICogYnV0IGl0IGlzIHNvbWV0aW1lcyBhbiBPQ1RFVCBTVFJJTkcgdGhhdCBpcyBjb21wb3NlZC9jb25zdHJ1Y3RlZCBvZiBjaHVua3MsXG4gKiBlYWNoIGl0cyBvd24gT0NURVQgU1RSSU5HLiBUaGlzIGlzIEJFUi1lbmNvZGluZyB2cy4gREVSLWVuY29kaW5nLiBUaGlzXG4gKiBmdW5jdGlvbiB0cmFuc2Zvcm1zIHRoaXMgY29ybmVyLWNhc2UgaW50byB0aGUgdXN1YWwgc2ltcGxlLFxuICogbm9uLWNvbXBvc2VkL2NvbnN0cnVjdGVkIE9DVEVUIFNUUklORy5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIG1heSBiZSBtb3ZlZCB0byBBU04uMSBhdCBzb21lIHBvaW50IHRvIGJldHRlciBkZWFsIHdpdGhcbiAqIG1vcmUgQkVSLWVuY29kaW5nIGlzc3Vlcywgc2hvdWxkIHRoZXkgYXJpc2UuXG4gKlxuICogQHBhcmFtIGRhdGEgdGhlIEFTTi4xIERhdGEgb2JqZWN0IHRvIHRyYW5zZm9ybS5cbiAqL1xuZnVuY3Rpb24gX2RlY29kZVBrY3M3RGF0YShkYXRhKSB7XG4gIC8vIGhhbmRsZSBzcGVjaWFsIGNhc2Ugb2YgXCJjaHVua2VkXCIgZGF0YSBjb250ZW50OiBhbiBvY3RldCBzdHJpbmcgY29tcG9zZWRcbiAgLy8gb2Ygb3RoZXIgb2N0ZXQgc3RyaW5nc1xuICBpZihkYXRhLmNvbXBvc2VkIHx8IGRhdGEuY29uc3RydWN0ZWQpIHtcbiAgICB2YXIgdmFsdWUgPSBmb3JnZS51dGlsLmNyZWF0ZUJ1ZmZlcigpO1xuICAgIGZvcih2YXIgaSA9IDA7IGkgPCBkYXRhLnZhbHVlLmxlbmd0aDsgKytpKSB7XG4gICAgICB2YWx1ZS5wdXRCeXRlcyhkYXRhLnZhbHVlW2ldLnZhbHVlKTtcbiAgICB9XG4gICAgZGF0YS5jb21wb3NlZCA9IGRhdGEuY29uc3RydWN0ZWQgPSBmYWxzZTtcbiAgICBkYXRhLnZhbHVlID0gdmFsdWUuZ2V0Qnl0ZXMoKTtcbiAgfVxuICByZXR1cm4gZGF0YTtcbn1cblxuLyoqXG4gKiBEZWNvZGUgUEtDUyMxMiBBdXRoZW50aWNhdGVkU2FmZSAoQkVSIGVuY29kZWQpIGludG8gUEZYIG9iamVjdC5cbiAqXG4gKiBUaGUgQXV0aGVudGljYXRlZFNhZmUgaXMgYSBCRVItZW5jb2RlZCBTRVFVRU5DRSBPRiBDb250ZW50SW5mby5cbiAqXG4gKiBAcGFyYW0gcGZ4IFRoZSBQS0NTIzEyIFBGWCBvYmplY3QgdG8gZmlsbC5cbiAqIEBwYXJhbSB7U3RyaW5nfSBhdXRoU2FmZSBCRVItZW5jb2RlZCBBdXRoZW50aWNhdGVkU2FmZS5cbiAqIEBwYXJhbSBzdHJpY3QgdHJ1ZSB0byB1c2Ugc3RyaWN0IERFUiBkZWNvZGluZywgZmFsc2Ugbm90IHRvLlxuICogQHBhcmFtIHtTdHJpbmd9IHBhc3N3b3JkIFBhc3N3b3JkIHRvIGRlY3J5cHQgd2l0aCAob3B0aW9uYWwpLlxuICovXG5mdW5jdGlvbiBfZGVjb2RlQXV0aGVudGljYXRlZFNhZmUocGZ4LCBhdXRoU2FmZSwgc3RyaWN0LCBwYXNzd29yZCkge1xuICBhdXRoU2FmZSA9IGFzbjEuZnJvbURlcihhdXRoU2FmZSwgc3RyaWN0KTsgIC8qIGFjdHVhbGx5IGl0J3MgQkVSIGVuY29kZWQgKi9cblxuICBpZihhdXRoU2FmZS50YWdDbGFzcyAhPT0gYXNuMS5DbGFzcy5VTklWRVJTQUwgfHxcbiAgICAgYXV0aFNhZmUudHlwZSAhPT0gYXNuMS5UeXBlLlNFUVVFTkNFIHx8XG4gICAgIGF1dGhTYWZlLmNvbnN0cnVjdGVkICE9PSB0cnVlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdQS0NTIzEyIEF1dGhlbnRpY2F0ZWRTYWZlIGV4cGVjdGVkIHRvIGJlIGEgJyArXG4gICAgICAnU0VRVUVOQ0UgT0YgQ29udGVudEluZm8nKTtcbiAgfVxuXG4gIGZvcih2YXIgaSA9IDA7IGkgPCBhdXRoU2FmZS52YWx1ZS5sZW5ndGg7IGkrKykge1xuICAgIHZhciBjb250ZW50SW5mbyA9IGF1dGhTYWZlLnZhbHVlW2ldO1xuXG4gICAgLy8gdmFsaWRhdGUgY29udGVudEluZm8gYW5kIGNhcHR1cmUgZGF0YVxuICAgIHZhciBjYXB0dXJlID0ge307XG4gICAgdmFyIGVycm9ycyA9IFtdO1xuICAgIGlmKCFhc24xLnZhbGlkYXRlKGNvbnRlbnRJbmZvLCBjb250ZW50SW5mb1ZhbGlkYXRvciwgY2FwdHVyZSwgZXJyb3JzKSkge1xuICAgICAgdmFyIGVycm9yID0gbmV3IEVycm9yKCdDYW5ub3QgcmVhZCBDb250ZW50SW5mby4nKTtcbiAgICAgIGVycm9yLmVycm9ycyA9IGVycm9ycztcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cblxuICAgIHZhciBvYmogPSB7XG4gICAgICBlbmNyeXB0ZWQ6IGZhbHNlXG4gICAgfTtcbiAgICB2YXIgc2FmZUNvbnRlbnRzID0gbnVsbDtcbiAgICB2YXIgZGF0YSA9IGNhcHR1cmUuY29udGVudC52YWx1ZVswXTtcbiAgICBzd2l0Y2goYXNuMS5kZXJUb09pZChjYXB0dXJlLmNvbnRlbnRUeXBlKSkge1xuICAgIGNhc2UgcGtpLm9pZHMuZGF0YTpcbiAgICAgIGlmKGRhdGEudGFnQ2xhc3MgIT09IGFzbjEuQ2xhc3MuVU5JVkVSU0FMIHx8XG4gICAgICAgICBkYXRhLnR5cGUgIT09IGFzbjEuVHlwZS5PQ1RFVFNUUklORykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BLQ1MjMTIgU2FmZUNvbnRlbnRzIERhdGEgaXMgbm90IGFuIE9DVEVUIFNUUklORy4nKTtcbiAgICAgIH1cbiAgICAgIHNhZmVDb250ZW50cyA9IF9kZWNvZGVQa2NzN0RhdGEoZGF0YSkudmFsdWU7XG4gICAgICBicmVhaztcbiAgICBjYXNlIHBraS5vaWRzLmVuY3J5cHRlZERhdGE6XG4gICAgICBzYWZlQ29udGVudHMgPSBfZGVjcnlwdFNhZmVDb250ZW50cyhkYXRhLCBwYXNzd29yZCk7XG4gICAgICBvYmouZW5jcnlwdGVkID0gdHJ1ZTtcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICB2YXIgZXJyb3IgPSBuZXcgRXJyb3IoJ1Vuc3VwcG9ydGVkIFBLQ1MjMTIgY29udGVudFR5cGUuJyk7XG4gICAgICBlcnJvci5jb250ZW50VHlwZSA9IGFzbjEuZGVyVG9PaWQoY2FwdHVyZS5jb250ZW50VHlwZSk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG5cbiAgICBvYmouc2FmZUJhZ3MgPSBfZGVjb2RlU2FmZUNvbnRlbnRzKHNhZmVDb250ZW50cywgc3RyaWN0LCBwYXNzd29yZCk7XG4gICAgcGZ4LnNhZmVDb250ZW50cy5wdXNoKG9iaik7XG4gIH1cbn1cblxuLyoqXG4gKiBEZWNyeXB0IFBLQ1MjNyBFbmNyeXB0ZWREYXRhIHN0cnVjdHVyZS5cbiAqXG4gKiBAcGFyYW0gZGF0YSBBU04uMSBlbmNvZGVkIEVuY3J5cHRlZENvbnRlbnRJbmZvIG9iamVjdC5cbiAqIEBwYXJhbSBwYXNzd29yZCBUaGUgdXNlci1wcm92aWRlZCBwYXNzd29yZC5cbiAqXG4gKiBAcmV0dXJuIFRoZSBkZWNyeXB0ZWQgU2FmZUNvbnRlbnRzIChBU04uMSBvYmplY3QpLlxuICovXG5mdW5jdGlvbiBfZGVjcnlwdFNhZmVDb250ZW50cyhkYXRhLCBwYXNzd29yZCkge1xuICB2YXIgY2FwdHVyZSA9IHt9O1xuICB2YXIgZXJyb3JzID0gW107XG4gIGlmKCFhc24xLnZhbGlkYXRlKFxuICAgIGRhdGEsIGZvcmdlLnBrY3M3LmFzbjEuZW5jcnlwdGVkRGF0YVZhbGlkYXRvciwgY2FwdHVyZSwgZXJyb3JzKSkge1xuICAgIHZhciBlcnJvciA9IG5ldyBFcnJvcignQ2Fubm90IHJlYWQgRW5jcnlwdGVkQ29udGVudEluZm8uJyk7XG4gICAgZXJyb3IuZXJyb3JzID0gZXJyb3JzO1xuICAgIHRocm93IGVycm9yO1xuICB9XG5cbiAgdmFyIG9pZCA9IGFzbjEuZGVyVG9PaWQoY2FwdHVyZS5jb250ZW50VHlwZSk7XG4gIGlmKG9pZCAhPT0gcGtpLm9pZHMuZGF0YSkge1xuICAgIHZhciBlcnJvciA9IG5ldyBFcnJvcihcbiAgICAgICdQS0NTIzEyIEVuY3J5cHRlZENvbnRlbnRJbmZvIENvbnRlbnRUeXBlIGlzIG5vdCBEYXRhLicpO1xuICAgIGVycm9yLm9pZCA9IG9pZDtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxuXG4gIC8vIGdldCBjaXBoZXJcbiAgb2lkID0gYXNuMS5kZXJUb09pZChjYXB0dXJlLmVuY0FsZ29yaXRobSk7XG4gIHZhciBjaXBoZXIgPSBwa2kucGJlLmdldENpcGhlcihvaWQsIGNhcHR1cmUuZW5jUGFyYW1ldGVyLCBwYXNzd29yZCk7XG5cbiAgLy8gZ2V0IGVuY3J5cHRlZCBkYXRhXG4gIHZhciBlbmNyeXB0ZWRDb250ZW50QXNuMSA9IF9kZWNvZGVQa2NzN0RhdGEoY2FwdHVyZS5lbmNyeXB0ZWRDb250ZW50QXNuMSk7XG4gIHZhciBlbmNyeXB0ZWQgPSBmb3JnZS51dGlsLmNyZWF0ZUJ1ZmZlcihlbmNyeXB0ZWRDb250ZW50QXNuMS52YWx1ZSk7XG5cbiAgY2lwaGVyLnVwZGF0ZShlbmNyeXB0ZWQpO1xuICBpZighY2lwaGVyLmZpbmlzaCgpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gZGVjcnlwdCBQS0NTIzEyIFNhZmVDb250ZW50cy4nKTtcbiAgfVxuXG4gIHJldHVybiBjaXBoZXIub3V0cHV0LmdldEJ5dGVzKCk7XG59XG5cbi8qKlxuICogRGVjb2RlIFBLQ1MjMTIgU2FmZUNvbnRlbnRzIChCRVItZW5jb2RlZCkgaW50byBhcnJheSBvZiBCYWcgb2JqZWN0cy5cbiAqXG4gKiBUaGUgc2FmZUNvbnRlbnRzIGlzIGEgQkVSLWVuY29kZWQgU0VRVUVOQ0UgT0YgU2FmZUJhZy5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc2FmZUNvbnRlbnRzIEJFUi1lbmNvZGVkIHNhZmVDb250ZW50cy5cbiAqIEBwYXJhbSBzdHJpY3QgdHJ1ZSB0byB1c2Ugc3RyaWN0IERFUiBkZWNvZGluZywgZmFsc2Ugbm90IHRvLlxuICogQHBhcmFtIHtTdHJpbmd9IHBhc3N3b3JkIFBhc3N3b3JkIHRvIGRlY3J5cHQgd2l0aCAob3B0aW9uYWwpLlxuICpcbiAqIEByZXR1cm4ge0FycmF5fSBBcnJheSBvZiBCYWcgb2JqZWN0cy5cbiAqL1xuZnVuY3Rpb24gX2RlY29kZVNhZmVDb250ZW50cyhzYWZlQ29udGVudHMsIHN0cmljdCwgcGFzc3dvcmQpIHtcbiAgLy8gaWYgc3RyaWN0IGFuZCBubyBzYWZlIGNvbnRlbnRzLCByZXR1cm4gZW1wdHkgc2FmZXNcbiAgaWYoIXN0cmljdCAmJiBzYWZlQ29udGVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgLy8gYWN0dWFsbHkgaXQncyBCRVItZW5jb2RlZFxuICBzYWZlQ29udGVudHMgPSBhc24xLmZyb21EZXIoc2FmZUNvbnRlbnRzLCBzdHJpY3QpO1xuXG4gIGlmKHNhZmVDb250ZW50cy50YWdDbGFzcyAhPT0gYXNuMS5DbGFzcy5VTklWRVJTQUwgfHxcbiAgICBzYWZlQ29udGVudHMudHlwZSAhPT0gYXNuMS5UeXBlLlNFUVVFTkNFIHx8XG4gICAgc2FmZUNvbnRlbnRzLmNvbnN0cnVjdGVkICE9PSB0cnVlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgJ1BLQ1MjMTIgU2FmZUNvbnRlbnRzIGV4cGVjdGVkIHRvIGJlIGEgU0VRVUVOQ0UgT0YgU2FmZUJhZy4nKTtcbiAgfVxuXG4gIHZhciByZXMgPSBbXTtcbiAgZm9yKHZhciBpID0gMDsgaSA8IHNhZmVDb250ZW50cy52YWx1ZS5sZW5ndGg7IGkrKykge1xuICAgIHZhciBzYWZlQmFnID0gc2FmZUNvbnRlbnRzLnZhbHVlW2ldO1xuXG4gICAgLy8gdmFsaWRhdGUgU2FmZUJhZyBhbmQgY2FwdHVyZSBkYXRhXG4gICAgdmFyIGNhcHR1cmUgPSB7fTtcbiAgICB2YXIgZXJyb3JzID0gW107XG4gICAgaWYoIWFzbjEudmFsaWRhdGUoc2FmZUJhZywgc2FmZUJhZ1ZhbGlkYXRvciwgY2FwdHVyZSwgZXJyb3JzKSkge1xuICAgICAgdmFyIGVycm9yID0gbmV3IEVycm9yKCdDYW5ub3QgcmVhZCBTYWZlQmFnLicpO1xuICAgICAgZXJyb3IuZXJyb3JzID0gZXJyb3JzO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuXG4gICAgLyogQ3JlYXRlIGJhZyBvYmplY3QgYW5kIHB1c2ggdG8gcmVzdWx0IGFycmF5LiAqL1xuICAgIHZhciBiYWcgPSB7XG4gICAgICB0eXBlOiBhc24xLmRlclRvT2lkKGNhcHR1cmUuYmFnSWQpLFxuICAgICAgYXR0cmlidXRlczogX2RlY29kZUJhZ0F0dHJpYnV0ZXMoY2FwdHVyZS5iYWdBdHRyaWJ1dGVzKVxuICAgIH07XG4gICAgcmVzLnB1c2goYmFnKTtcblxuICAgIHZhciB2YWxpZGF0b3IsIGRlY29kZXI7XG4gICAgdmFyIGJhZ0FzbjEgPSBjYXB0dXJlLmJhZ1ZhbHVlLnZhbHVlWzBdO1xuICAgIHN3aXRjaChiYWcudHlwZSkge1xuICAgICAgY2FzZSBwa2kub2lkcy5wa2NzOFNocm91ZGVkS2V5QmFnOlxuICAgICAgICAvKiBiYWdBc24xIGhhcyBhIEVuY3J5cHRlZFByaXZhdGVLZXlJbmZvLCB3aGljaCB3ZSBuZWVkIHRvIGRlY3J5cHQuXG4gICAgICAgICAgIEFmdGVyd2FyZHMgd2UgY2FuIGhhbmRsZSBpdCBsaWtlIGEga2V5QmFnLFxuICAgICAgICAgICB3aGljaCBpcyBhIFByaXZhdGVLZXlJbmZvLiAqL1xuICAgICAgICBiYWdBc24xID0gcGtpLmRlY3J5cHRQcml2YXRlS2V5SW5mbyhiYWdBc24xLCBwYXNzd29yZCk7XG4gICAgICAgIGlmKGJhZ0FzbjEgPT09IG51bGwpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAnVW5hYmxlIHRvIGRlY3J5cHQgUEtDUyM4IFNocm91ZGVkS2V5QmFnLCB3cm9uZyBwYXNzd29yZD8nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qIGZhbGwgdGhyb3VnaCAqL1xuICAgICAgY2FzZSBwa2kub2lkcy5rZXlCYWc6XG4gICAgICAgIC8qIEEgUEtDUyMxMiBrZXlCYWcgaXMgYSBzaW1wbGUgUHJpdmF0ZUtleUluZm8gYXMgdW5kZXJzdG9vZCBieSBvdXJcbiAgICAgICAgICAgUEtJIG1vZHVsZSwgaGVuY2Ugd2UgZG9uJ3QgaGF2ZSB0byBkbyB2YWxpZGF0aW9uL2NhcHR1cmluZyBoZXJlLFxuICAgICAgICAgICBqdXN0IHBhc3Mgd2hhdCB3ZSBhbHJlYWR5IGdvdC4gKi9cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBiYWcua2V5ID0gcGtpLnByaXZhdGVLZXlGcm9tQXNuMShiYWdBc24xKTtcbiAgICAgICAgfSBjYXRjaChlKSB7XG4gICAgICAgICAgLy8gaWdub3JlIHVua25vd24ga2V5IHR5cGUsIHBhc3MgYXNuMSB2YWx1ZVxuICAgICAgICAgIGJhZy5rZXkgPSBudWxsO1xuICAgICAgICAgIGJhZy5hc24xID0gYmFnQXNuMTtcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTsgIC8qIE5vdGhpbmcgbW9yZSB0byBkby4gKi9cblxuICAgICAgY2FzZSBwa2kub2lkcy5jZXJ0QmFnOlxuICAgICAgICAvKiBBIFBLQ1MjMTIgY2VydEJhZyBjYW4gd3JhcCBib3RoIFguNTA5IGFuZCBzZHNpIGNlcnRpZmljYXRlcy5cbiAgICAgICAgICAgVGhlcmVmb3JlIHB1dCB0aGUgU2FmZUJhZyBjb250ZW50IHRocm91Z2ggYW5vdGhlciB2YWxpZGF0b3IgdG9cbiAgICAgICAgICAgY2FwdHVyZSB0aGUgZmllbGRzLiAgQWZ0ZXJ3YXJkcyBjaGVjayAmIHN0b3JlIHRoZSByZXN1bHRzLiAqL1xuICAgICAgICB2YWxpZGF0b3IgPSBjZXJ0QmFnVmFsaWRhdG9yO1xuICAgICAgICBkZWNvZGVyID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgaWYoYXNuMS5kZXJUb09pZChjYXB0dXJlLmNlcnRJZCkgIT09IHBraS5vaWRzLng1MDlDZXJ0aWZpY2F0ZSkge1xuICAgICAgICAgICAgdmFyIGVycm9yID0gbmV3IEVycm9yKFxuICAgICAgICAgICAgICAnVW5zdXBwb3J0ZWQgY2VydGlmaWNhdGUgdHlwZSwgb25seSBYLjUwOSBzdXBwb3J0ZWQuJyk7XG4gICAgICAgICAgICBlcnJvci5vaWQgPSBhc24xLmRlclRvT2lkKGNhcHR1cmUuY2VydElkKTtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIHRydWU9cHJvZHVjZSBjZXJ0IGhhc2hcbiAgICAgICAgICB2YXIgY2VydEFzbjEgPSBhc24xLmZyb21EZXIoY2FwdHVyZS5jZXJ0LCBzdHJpY3QpO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBiYWcuY2VydCA9IHBraS5jZXJ0aWZpY2F0ZUZyb21Bc24xKGNlcnRBc24xLCB0cnVlKTtcbiAgICAgICAgICB9IGNhdGNoKGUpIHtcbiAgICAgICAgICAgIC8vIGlnbm9yZSB1bmtub3duIGNlcnQgdHlwZSwgcGFzcyBhc24xIHZhbHVlXG4gICAgICAgICAgICBiYWcuY2VydCA9IG51bGw7XG4gICAgICAgICAgICBiYWcuYXNuMSA9IGNlcnRBc24xO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHZhciBlcnJvciA9IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgUEtDUyMxMiBTYWZlQmFnIHR5cGUuJyk7XG4gICAgICAgIGVycm9yLm9pZCA9IGJhZy50eXBlO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG5cbiAgICAvKiBWYWxpZGF0ZSBTYWZlQmFnIHZhbHVlIChpLmUuIENlcnRCYWcsIGV0Yy4pIGFuZCBjYXB0dXJlIGRhdGEgaWYgbmVlZGVkLiAqL1xuICAgIGlmKHZhbGlkYXRvciAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgIWFzbjEudmFsaWRhdGUoYmFnQXNuMSwgdmFsaWRhdG9yLCBjYXB0dXJlLCBlcnJvcnMpKSB7XG4gICAgICB2YXIgZXJyb3IgPSBuZXcgRXJyb3IoJ0Nhbm5vdCByZWFkIFBLQ1MjMTIgJyArIHZhbGlkYXRvci5uYW1lKTtcbiAgICAgIGVycm9yLmVycm9ycyA9IGVycm9ycztcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cblxuICAgIC8qIENhbGwgZGVjb2RlciBmdW5jdGlvbiBmcm9tIGFib3ZlIHRvIHN0b3JlIHRoZSByZXN1bHRzLiAqL1xuICAgIGRlY29kZXIoKTtcbiAgfVxuXG4gIHJldHVybiByZXM7XG59XG5cbi8qKlxuICogRGVjb2RlIFBLQ1MjMTIgU0VUIE9GIFBLQ1MxMkF0dHJpYnV0ZSBpbnRvIEphdmFTY3JpcHQgb2JqZWN0LlxuICpcbiAqIEBwYXJhbSBhdHRyaWJ1dGVzIFNFVCBPRiBQS0NTMTJBdHRyaWJ1dGUgKEFTTi4xIG9iamVjdCkuXG4gKlxuICogQHJldHVybiB0aGUgZGVjb2RlZCBhdHRyaWJ1dGVzLlxuICovXG5mdW5jdGlvbiBfZGVjb2RlQmFnQXR0cmlidXRlcyhhdHRyaWJ1dGVzKSB7XG4gIHZhciBkZWNvZGVkQXR0cnMgPSB7fTtcblxuICBpZihhdHRyaWJ1dGVzICE9PSB1bmRlZmluZWQpIHtcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgYXR0cmlidXRlcy5sZW5ndGg7ICsraSkge1xuICAgICAgdmFyIGNhcHR1cmUgPSB7fTtcbiAgICAgIHZhciBlcnJvcnMgPSBbXTtcbiAgICAgIGlmKCFhc24xLnZhbGlkYXRlKGF0dHJpYnV0ZXNbaV0sIGF0dHJpYnV0ZVZhbGlkYXRvciwgY2FwdHVyZSwgZXJyb3JzKSkge1xuICAgICAgICB2YXIgZXJyb3IgPSBuZXcgRXJyb3IoJ0Nhbm5vdCByZWFkIFBLQ1MjMTIgQmFnQXR0cmlidXRlLicpO1xuICAgICAgICBlcnJvci5lcnJvcnMgPSBlcnJvcnM7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuXG4gICAgICB2YXIgb2lkID0gYXNuMS5kZXJUb09pZChjYXB0dXJlLm9pZCk7XG4gICAgICBpZihwa2kub2lkc1tvaWRdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gdW5zdXBwb3J0ZWQgYXR0cmlidXRlIHR5cGUsIGlnbm9yZS5cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGRlY29kZWRBdHRyc1twa2kub2lkc1tvaWRdXSA9IFtdO1xuICAgICAgZm9yKHZhciBqID0gMDsgaiA8IGNhcHR1cmUudmFsdWVzLmxlbmd0aDsgKytqKSB7XG4gICAgICAgIGRlY29kZWRBdHRyc1twa2kub2lkc1tvaWRdXS5wdXNoKGNhcHR1cmUudmFsdWVzW2pdLnZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gZGVjb2RlZEF0dHJzO1xufVxuXG4vKipcbiAqIFdyYXBzIGEgcHJpdmF0ZSBrZXkgYW5kIGNlcnRpZmljYXRlIGluIGEgUEtDUyMxMiBQRlggd3JhcHBlci4gSWYgYVxuICogcGFzc3dvcmQgaXMgcHJvdmlkZWQgdGhlbiB0aGUgcHJpdmF0ZSBrZXkgd2lsbCBiZSBlbmNyeXB0ZWQuXG4gKlxuICogQW4gZW50aXJlIGNlcnRpZmljYXRlIGNoYWluIG1heSBhbHNvIGJlIGluY2x1ZGVkLiBUbyBkbyB0aGlzLCBwYXNzXG4gKiBhbiBhcnJheSBmb3IgdGhlIFwiY2VydFwiIHBhcmFtZXRlciB3aGVyZSB0aGUgZmlyc3QgY2VydGlmaWNhdGUgaXNcbiAqIHRoZSBvbmUgdGhhdCBpcyBwYWlyZWQgd2l0aCB0aGUgcHJpdmF0ZSBrZXkgYW5kIGVhY2ggc3Vic2VxdWVudCBvbmVcbiAqIHZlcmlmaWVzIHRoZSBwcmV2aW91cyBvbmUuIFRoZSBjZXJ0aWZpY2F0ZXMgbWF5IGJlIGluIFBFTSBmb3JtYXQgb3JcbiAqIGhhdmUgYmVlbiBhbHJlYWR5IHBhcnNlZCBieSBGb3JnZS5cbiAqXG4gKiBAdG9kbyBpbXBsZW1lbnQgcGFzc3dvcmQtYmFzZWQtZW5jcnlwdGlvbiBmb3IgdGhlIHdob2xlIHBhY2thZ2VcbiAqXG4gKiBAcGFyYW0ga2V5IHRoZSBwcml2YXRlIGtleS5cbiAqIEBwYXJhbSBjZXJ0IHRoZSBjZXJ0aWZpY2F0ZSAobWF5IGJlIGFuIGFycmF5IG9mIGNlcnRpZmljYXRlcyBpbiBvcmRlclxuICogICAgICAgICAgdG8gc3BlY2lmeSBhIGNlcnRpZmljYXRlIGNoYWluKS5cbiAqIEBwYXJhbSBwYXNzd29yZCB0aGUgcGFzc3dvcmQgdG8gdXNlLCBudWxsIGZvciBub25lLlxuICogQHBhcmFtIG9wdGlvbnM6XG4gKiAgICAgICAgICBhbGdvcml0aG0gdGhlIGVuY3J5cHRpb24gYWxnb3JpdGhtIHRvIHVzZVxuICogICAgICAgICAgICAoJ2FlczEyOCcsICdhZXMxOTInLCAnYWVzMjU2JywgJzNkZXMnKSwgZGVmYXVsdHMgdG8gJ2FlczEyOCcuXG4gKiAgICAgICAgICBjb3VudCB0aGUgaXRlcmF0aW9uIGNvdW50IHRvIHVzZS5cbiAqICAgICAgICAgIHNhbHRTaXplIHRoZSBzYWx0IHNpemUgdG8gdXNlLlxuICogICAgICAgICAgdXNlTWFjIHRydWUgdG8gaW5jbHVkZSBhIE1BQywgZmFsc2Ugbm90IHRvLCBkZWZhdWx0cyB0byB0cnVlLlxuICogICAgICAgICAgbG9jYWxLZXlJZCB0aGUgbG9jYWwga2V5IElEIHRvIHVzZSwgaW4gaGV4LlxuICogICAgICAgICAgZnJpZW5kbHlOYW1lIHRoZSBmcmllbmRseSBuYW1lIHRvIHVzZS5cbiAqICAgICAgICAgIGdlbmVyYXRlTG9jYWxLZXlJZCB0cnVlIHRvIGdlbmVyYXRlIGEgcmFuZG9tIGxvY2FsIGtleSBJRCxcbiAqICAgICAgICAgICAgZmFsc2Ugbm90IHRvLCBkZWZhdWx0cyB0byB0cnVlLlxuICpcbiAqIEByZXR1cm4gdGhlIFBLQ1MjMTIgUEZYIEFTTi4xIG9iamVjdC5cbiAqL1xucDEyLnRvUGtjczEyQXNuMSA9IGZ1bmN0aW9uKGtleSwgY2VydCwgcGFzc3dvcmQsIG9wdGlvbnMpIHtcbiAgLy8gc2V0IGRlZmF1bHQgb3B0aW9uc1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgb3B0aW9ucy5zYWx0U2l6ZSA9IG9wdGlvbnMuc2FsdFNpemUgfHwgODtcbiAgb3B0aW9ucy5jb3VudCA9IG9wdGlvbnMuY291bnQgfHwgMjA0ODtcbiAgb3B0aW9ucy5hbGdvcml0aG0gPSBvcHRpb25zLmFsZ29yaXRobSB8fCBvcHRpb25zLmVuY0FsZ29yaXRobSB8fCAnYWVzMTI4JztcbiAgaWYoISgndXNlTWFjJyBpbiBvcHRpb25zKSkge1xuICAgIG9wdGlvbnMudXNlTWFjID0gdHJ1ZTtcbiAgfVxuICBpZighKCdsb2NhbEtleUlkJyBpbiBvcHRpb25zKSkge1xuICAgIG9wdGlvbnMubG9jYWxLZXlJZCA9IG51bGw7XG4gIH1cbiAgaWYoISgnZ2VuZXJhdGVMb2NhbEtleUlkJyBpbiBvcHRpb25zKSkge1xuICAgIG9wdGlvbnMuZ2VuZXJhdGVMb2NhbEtleUlkID0gdHJ1ZTtcbiAgfVxuXG4gIHZhciBsb2NhbEtleUlkID0gb3B0aW9ucy5sb2NhbEtleUlkO1xuICB2YXIgYmFnQXR0cnM7XG4gIGlmKGxvY2FsS2V5SWQgIT09IG51bGwpIHtcbiAgICBsb2NhbEtleUlkID0gZm9yZ2UudXRpbC5oZXhUb0J5dGVzKGxvY2FsS2V5SWQpO1xuICB9IGVsc2UgaWYob3B0aW9ucy5nZW5lcmF0ZUxvY2FsS2V5SWQpIHtcbiAgICAvLyB1c2UgU0hBLTEgb2YgcGFpcmVkIGNlcnQsIGlmIGF2YWlsYWJsZVxuICAgIGlmKGNlcnQpIHtcbiAgICAgIHZhciBwYWlyZWRDZXJ0ID0gZm9yZ2UudXRpbC5pc0FycmF5KGNlcnQpID8gY2VydFswXSA6IGNlcnQ7XG4gICAgICBpZih0eXBlb2YgcGFpcmVkQ2VydCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcGFpcmVkQ2VydCA9IHBraS5jZXJ0aWZpY2F0ZUZyb21QZW0ocGFpcmVkQ2VydCk7XG4gICAgICB9XG4gICAgICB2YXIgc2hhMSA9IGZvcmdlLm1kLnNoYTEuY3JlYXRlKCk7XG4gICAgICBzaGExLnVwZGF0ZShhc24xLnRvRGVyKHBraS5jZXJ0aWZpY2F0ZVRvQXNuMShwYWlyZWRDZXJ0KSkuZ2V0Qnl0ZXMoKSk7XG4gICAgICBsb2NhbEtleUlkID0gc2hhMS5kaWdlc3QoKS5nZXRCeXRlcygpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBGSVhNRTogY29uc2lkZXIgdXNpbmcgU0hBLTEgb2YgcHVibGljIGtleSAod2hpY2ggY2FuIGJlIGdlbmVyYXRlZFxuICAgICAgLy8gZnJvbSBwcml2YXRlIGtleSBjb21wb25lbnRzKSwgc2VlOiBjZXJ0LmdlbmVyYXRlU3ViamVjdEtleUlkZW50aWZpZXJcbiAgICAgIC8vIGdlbmVyYXRlIHJhbmRvbSBieXRlc1xuICAgICAgbG9jYWxLZXlJZCA9IGZvcmdlLnJhbmRvbS5nZXRCeXRlcygyMCk7XG4gICAgfVxuICB9XG5cbiAgdmFyIGF0dHJzID0gW107XG4gIGlmKGxvY2FsS2V5SWQgIT09IG51bGwpIHtcbiAgICBhdHRycy5wdXNoKFxuICAgICAgLy8gbG9jYWxLZXlJRFxuICAgICAgYXNuMS5jcmVhdGUoYXNuMS5DbGFzcy5VTklWRVJTQUwsIGFzbjEuVHlwZS5TRVFVRU5DRSwgdHJ1ZSwgW1xuICAgICAgICAvLyBhdHRySWRcbiAgICAgICAgYXNuMS5jcmVhdGUoYXNuMS5DbGFzcy5VTklWRVJTQUwsIGFzbjEuVHlwZS5PSUQsIGZhbHNlLFxuICAgICAgICAgIGFzbjEub2lkVG9EZXIocGtpLm9pZHMubG9jYWxLZXlJZCkuZ2V0Qnl0ZXMoKSksXG4gICAgICAgIC8vIGF0dHJWYWx1ZXNcbiAgICAgICAgYXNuMS5jcmVhdGUoYXNuMS5DbGFzcy5VTklWRVJTQUwsIGFzbjEuVHlwZS5TRVQsIHRydWUsIFtcbiAgICAgICAgICBhc24xLmNyZWF0ZShhc24xLkNsYXNzLlVOSVZFUlNBTCwgYXNuMS5UeXBlLk9DVEVUU1RSSU5HLCBmYWxzZSxcbiAgICAgICAgICAgIGxvY2FsS2V5SWQpXG4gICAgICAgIF0pXG4gICAgICBdKSk7XG4gIH1cbiAgaWYoJ2ZyaWVuZGx5TmFtZScgaW4gb3B0aW9ucykge1xuICAgIGF0dHJzLnB1c2goXG4gICAgICAvLyBmcmllbmRseU5hbWVcbiAgICAgIGFzbjEuY3JlYXRlKGFzbjEuQ2xhc3MuVU5JVkVSU0FMLCBhc24xLlR5cGUuU0VRVUVOQ0UsIHRydWUsIFtcbiAgICAgICAgLy8gYXR0cklkXG4gICAgICAgIGFzbjEuY3JlYXRlKGFzbjEuQ2xhc3MuVU5JVkVSU0FMLCBhc24xLlR5cGUuT0lELCBmYWxzZSxcbiAgICAgICAgICBhc24xLm9pZFRvRGVyKHBraS5vaWRzLmZyaWVuZGx5TmFtZSkuZ2V0Qnl0ZXMoKSksXG4gICAgICAgIC8vIGF0dHJWYWx1ZXNcbiAgICAgICAgYXNuMS5jcmVhdGUoYXNuMS5DbGFzcy5VTklWRVJTQUwsIGFzbjEuVHlwZS5TRVQsIHRydWUsIFtcbiAgICAgICAgICBhc24xLmNyZWF0ZShhc24xLkNsYXNzLlVOSVZFUlNBTCwgYXNuMS5UeXBlLkJNUFNUUklORywgZmFsc2UsXG4gICAgICAgICAgICBvcHRpb25zLmZyaWVuZGx5TmFtZSlcbiAgICAgICAgXSlcbiAgICAgIF0pKTtcbiAgfVxuXG4gIGlmKGF0dHJzLmxlbmd0aCA+IDApIHtcbiAgICBiYWdBdHRycyA9IGFzbjEuY3JlYXRlKGFzbjEuQ2xhc3MuVU5JVkVSU0FMLCBhc24xLlR5cGUuU0VULCB0cnVlLCBhdHRycyk7XG4gIH1cblxuICAvLyBjb2xsZWN0IGNvbnRlbnRzIGZvciBBdXRoZW50aWNhdGVkU2FmZVxuICB2YXIgY29udGVudHMgPSBbXTtcblxuICAvLyBjcmVhdGUgc2FmZSBiYWcocykgZm9yIGNlcnRpZmljYXRlIGNoYWluXG4gIHZhciBjaGFpbiA9IFtdO1xuICBpZihjZXJ0ICE9PSBudWxsKSB7XG4gICAgaWYoZm9yZ2UudXRpbC5pc0FycmF5KGNlcnQpKSB7XG4gICAgICBjaGFpbiA9IGNlcnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNoYWluID0gW2NlcnRdO1xuICAgIH1cbiAgfVxuXG4gIHZhciBjZXJ0U2FmZUJhZ3MgPSBbXTtcbiAgZm9yKHZhciBpID0gMDsgaSA8IGNoYWluLmxlbmd0aDsgKytpKSB7XG4gICAgLy8gY29udmVydCBjZXJ0IGZyb20gUEVNIGFzIG5lY2Vzc2FyeVxuICAgIGNlcnQgPSBjaGFpbltpXTtcbiAgICBpZih0eXBlb2YgY2VydCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGNlcnQgPSBwa2kuY2VydGlmaWNhdGVGcm9tUGVtKGNlcnQpO1xuICAgIH1cblxuICAgIC8vIFNhZmVCYWdcbiAgICB2YXIgY2VydEJhZ0F0dHJzID0gKGkgPT09IDApID8gYmFnQXR0cnMgOiB1bmRlZmluZWQ7XG4gICAgdmFyIGNlcnRBc24xID0gcGtpLmNlcnRpZmljYXRlVG9Bc24xKGNlcnQpO1xuICAgIHZhciBjZXJ0U2FmZUJhZyA9XG4gICAgICBhc24xLmNyZWF0ZShhc24xLkNsYXNzLlVOSVZFUlNBTCwgYXNuMS5UeXBlLlNFUVVFTkNFLCB0cnVlLCBbXG4gICAgICAgIC8vIGJhZ0lkXG4gICAgICAgIGFzbjEuY3JlYXRlKGFzbjEuQ2xhc3MuVU5JVkVSU0FMLCBhc24xLlR5cGUuT0lELCBmYWxzZSxcbiAgICAgICAgICBhc24xLm9pZFRvRGVyKHBraS5vaWRzLmNlcnRCYWcpLmdldEJ5dGVzKCkpLFxuICAgICAgICAvLyBiYWdWYWx1ZVxuICAgICAgICBhc24xLmNyZWF0ZShhc24xLkNsYXNzLkNPTlRFWFRfU1BFQ0lGSUMsIDAsIHRydWUsIFtcbiAgICAgICAgICAvLyBDZXJ0QmFnXG4gICAgICAgICAgYXNuMS5jcmVhdGUoYXNuMS5DbGFzcy5VTklWRVJTQUwsIGFzbjEuVHlwZS5TRVFVRU5DRSwgdHJ1ZSwgW1xuICAgICAgICAgICAgLy8gY2VydElkXG4gICAgICAgICAgICBhc24xLmNyZWF0ZShhc24xLkNsYXNzLlVOSVZFUlNBTCwgYXNuMS5UeXBlLk9JRCwgZmFsc2UsXG4gICAgICAgICAgICAgIGFzbjEub2lkVG9EZXIocGtpLm9pZHMueDUwOUNlcnRpZmljYXRlKS5nZXRCeXRlcygpKSxcbiAgICAgICAgICAgIC8vIGNlcnRWYWx1ZSAoeDUwOUNlcnRpZmljYXRlKVxuICAgICAgICAgICAgYXNuMS5jcmVhdGUoYXNuMS5DbGFzcy5DT05URVhUX1NQRUNJRklDLCAwLCB0cnVlLCBbXG4gICAgICAgICAgICAgIGFzbjEuY3JlYXRlKFxuICAgICAgICAgICAgICAgIGFzbjEuQ2xhc3MuVU5JVkVSU0FMLCBhc24xLlR5cGUuT0NURVRTVFJJTkcsIGZhbHNlLFxuICAgICAgICAgICAgICAgIGFzbjEudG9EZXIoY2VydEFzbjEpLmdldEJ5dGVzKCkpXG4gICAgICAgICAgICBdKV0pXSksXG4gICAgICAgIC8vIGJhZ0F0dHJpYnV0ZXMgKE9QVElPTkFMKVxuICAgICAgICBjZXJ0QmFnQXR0cnNcbiAgICAgIF0pO1xuICAgIGNlcnRTYWZlQmFncy5wdXNoKGNlcnRTYWZlQmFnKTtcbiAgfVxuXG4gIGlmKGNlcnRTYWZlQmFncy5sZW5ndGggPiAwKSB7XG4gICAgLy8gU2FmZUNvbnRlbnRzXG4gICAgdmFyIGNlcnRTYWZlQ29udGVudHMgPSBhc24xLmNyZWF0ZShcbiAgICAgIGFzbjEuQ2xhc3MuVU5JVkVSU0FMLCBhc24xLlR5cGUuU0VRVUVOQ0UsIHRydWUsIGNlcnRTYWZlQmFncyk7XG5cbiAgICAvLyBDb250ZW50SW5mb1xuICAgIHZhciBjZXJ0Q0kgPVxuICAgICAgLy8gUEtDUyM3IENvbnRlbnRJbmZvXG4gICAgICBhc24xLmNyZWF0ZShhc24xLkNsYXNzLlVOSVZFUlNBTCwgYXNuMS5UeXBlLlNFUVVFTkNFLCB0cnVlLCBbXG4gICAgICAgIC8vIGNvbnRlbnRUeXBlXG4gICAgICAgIGFzbjEuY3JlYXRlKGFzbjEuQ2xhc3MuVU5JVkVSU0FMLCBhc24xLlR5cGUuT0lELCBmYWxzZSxcbiAgICAgICAgICAvLyBPSUQgZm9yIHRoZSBjb250ZW50IHR5cGUgaXMgJ2RhdGEnXG4gICAgICAgICAgYXNuMS5vaWRUb0Rlcihwa2kub2lkcy5kYXRhKS5nZXRCeXRlcygpKSxcbiAgICAgICAgLy8gY29udGVudFxuICAgICAgICBhc24xLmNyZWF0ZShhc24xLkNsYXNzLkNPTlRFWFRfU1BFQ0lGSUMsIDAsIHRydWUsIFtcbiAgICAgICAgICBhc24xLmNyZWF0ZShcbiAgICAgICAgICAgIGFzbjEuQ2xhc3MuVU5JVkVSU0FMLCBhc24xLlR5cGUuT0NURVRTVFJJTkcsIGZhbHNlLFxuICAgICAgICAgICAgYXNuMS50b0RlcihjZXJ0U2FmZUNvbnRlbnRzKS5nZXRCeXRlcygpKVxuICAgICAgICBdKVxuICAgICAgXSk7XG4gICAgY29udGVudHMucHVzaChjZXJ0Q0kpO1xuICB9XG5cbiAgLy8gY3JlYXRlIHNhZmUgY29udGVudHMgZm9yIHByaXZhdGUga2V5XG4gIHZhciBrZXlCYWcgPSBudWxsO1xuICBpZihrZXkgIT09IG51bGwpIHtcbiAgICAvLyBTYWZlQmFnXG4gICAgdmFyIHBrQXNuMSA9IHBraS53cmFwUnNhUHJpdmF0ZUtleShwa2kucHJpdmF0ZUtleVRvQXNuMShrZXkpKTtcbiAgICBpZihwYXNzd29yZCA9PT0gbnVsbCkge1xuICAgICAgLy8gbm8gZW5jcnlwdGlvblxuICAgICAga2V5QmFnID0gYXNuMS5jcmVhdGUoYXNuMS5DbGFzcy5VTklWRVJTQUwsIGFzbjEuVHlwZS5TRVFVRU5DRSwgdHJ1ZSwgW1xuICAgICAgICAvLyBiYWdJZFxuICAgICAgICBhc24xLmNyZWF0ZShhc24xLkNsYXNzLlVOSVZFUlNBTCwgYXNuMS5UeXBlLk9JRCwgZmFsc2UsXG4gICAgICAgICAgYXNuMS5vaWRUb0Rlcihwa2kub2lkcy5rZXlCYWcpLmdldEJ5dGVzKCkpLFxuICAgICAgICAvLyBiYWdWYWx1ZVxuICAgICAgICBhc24xLmNyZWF0ZShhc24xLkNsYXNzLkNPTlRFWFRfU1BFQ0lGSUMsIDAsIHRydWUsIFtcbiAgICAgICAgICAvLyBQcml2YXRlS2V5SW5mb1xuICAgICAgICAgIHBrQXNuMVxuICAgICAgICBdKSxcbiAgICAgICAgLy8gYmFnQXR0cmlidXRlcyAoT1BUSU9OQUwpXG4gICAgICAgIGJhZ0F0dHJzXG4gICAgICBdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gZW5jcnlwdGVkIFByaXZhdGVLZXlJbmZvXG4gICAgICBrZXlCYWcgPSBhc24xLmNyZWF0ZShhc24xLkNsYXNzLlVOSVZFUlNBTCwgYXNuMS5UeXBlLlNFUVVFTkNFLCB0cnVlLCBbXG4gICAgICAgIC8vIGJhZ0lkXG4gICAgICAgIGFzbjEuY3JlYXRlKGFzbjEuQ2xhc3MuVU5JVkVSU0FMLCBhc24xLlR5cGUuT0lELCBmYWxzZSxcbiAgICAgICAgICBhc24xLm9pZFRvRGVyKHBraS5vaWRzLnBrY3M4U2hyb3VkZWRLZXlCYWcpLmdldEJ5dGVzKCkpLFxuICAgICAgICAvLyBiYWdWYWx1ZVxuICAgICAgICBhc24xLmNyZWF0ZShhc24xLkNsYXNzLkNPTlRFWFRfU1BFQ0lGSUMsIDAsIHRydWUsIFtcbiAgICAgICAgICAvLyBFbmNyeXB0ZWRQcml2YXRlS2V5SW5mb1xuICAgICAgICAgIHBraS5lbmNyeXB0UHJpdmF0ZUtleUluZm8ocGtBc24xLCBwYXNzd29yZCwgb3B0aW9ucylcbiAgICAgICAgXSksXG4gICAgICAgIC8vIGJhZ0F0dHJpYnV0ZXMgKE9QVElPTkFMKVxuICAgICAgICBiYWdBdHRyc1xuICAgICAgXSk7XG4gICAgfVxuXG4gICAgLy8gU2FmZUNvbnRlbnRzXG4gICAgdmFyIGtleVNhZmVDb250ZW50cyA9XG4gICAgICBhc24xLmNyZWF0ZShhc24xLkNsYXNzLlVOSVZFUlNBTCwgYXNuMS5UeXBlLlNFUVVFTkNFLCB0cnVlLCBba2V5QmFnXSk7XG5cbiAgICAvLyBDb250ZW50SW5mb1xuICAgIHZhciBrZXlDSSA9XG4gICAgICAvLyBQS0NTIzcgQ29udGVudEluZm9cbiAgICAgIGFzbjEuY3JlYXRlKGFzbjEuQ2xhc3MuVU5JVkVSU0FMLCBhc24xLlR5cGUuU0VRVUVOQ0UsIHRydWUsIFtcbiAgICAgICAgLy8gY29udGVudFR5cGVcbiAgICAgICAgYXNuMS5jcmVhdGUoYXNuMS5DbGFzcy5VTklWRVJTQUwsIGFzbjEuVHlwZS5PSUQsIGZhbHNlLFxuICAgICAgICAgIC8vIE9JRCBmb3IgdGhlIGNvbnRlbnQgdHlwZSBpcyAnZGF0YSdcbiAgICAgICAgICBhc24xLm9pZFRvRGVyKHBraS5vaWRzLmRhdGEpLmdldEJ5dGVzKCkpLFxuICAgICAgICAvLyBjb250ZW50XG4gICAgICAgIGFzbjEuY3JlYXRlKGFzbjEuQ2xhc3MuQ09OVEVYVF9TUEVDSUZJQywgMCwgdHJ1ZSwgW1xuICAgICAgICAgIGFzbjEuY3JlYXRlKFxuICAgICAgICAgICAgYXNuMS5DbGFzcy5VTklWRVJTQUwsIGFzbjEuVHlwZS5PQ1RFVFNUUklORywgZmFsc2UsXG4gICAgICAgICAgICBhc24xLnRvRGVyKGtleVNhZmVDb250ZW50cykuZ2V0Qnl0ZXMoKSlcbiAgICAgICAgXSlcbiAgICAgIF0pO1xuICAgIGNvbnRlbnRzLnB1c2goa2V5Q0kpO1xuICB9XG5cbiAgLy8gY3JlYXRlIEF1dGhlbnRpY2F0ZWRTYWZlIGJ5IHN0cmluZ2luZyB0b2dldGhlciB0aGUgY29udGVudHNcbiAgdmFyIHNhZmUgPSBhc24xLmNyZWF0ZShcbiAgICBhc24xLkNsYXNzLlVOSVZFUlNBTCwgYXNuMS5UeXBlLlNFUVVFTkNFLCB0cnVlLCBjb250ZW50cyk7XG5cbiAgdmFyIG1hY0RhdGE7XG4gIGlmKG9wdGlvbnMudXNlTWFjKSB7XG4gICAgLy8gTWFjRGF0YVxuICAgIHZhciBzaGExID0gZm9yZ2UubWQuc2hhMS5jcmVhdGUoKTtcbiAgICB2YXIgbWFjU2FsdCA9IG5ldyBmb3JnZS51dGlsLkJ5dGVCdWZmZXIoXG4gICAgICBmb3JnZS5yYW5kb20uZ2V0Qnl0ZXMob3B0aW9ucy5zYWx0U2l6ZSkpO1xuICAgIHZhciBjb3VudCA9IG9wdGlvbnMuY291bnQ7XG4gICAgLy8gMTYwLWJpdCBrZXlcbiAgICB2YXIga2V5ID0gcDEyLmdlbmVyYXRlS2V5KHBhc3N3b3JkLCBtYWNTYWx0LCAzLCBjb3VudCwgMjApO1xuICAgIHZhciBtYWMgPSBmb3JnZS5obWFjLmNyZWF0ZSgpO1xuICAgIG1hYy5zdGFydChzaGExLCBrZXkpO1xuICAgIG1hYy51cGRhdGUoYXNuMS50b0RlcihzYWZlKS5nZXRCeXRlcygpKTtcbiAgICB2YXIgbWFjVmFsdWUgPSBtYWMuZ2V0TWFjKCk7XG4gICAgbWFjRGF0YSA9IGFzbjEuY3JlYXRlKGFzbjEuQ2xhc3MuVU5JVkVSU0FMLCBhc24xLlR5cGUuU0VRVUVOQ0UsIHRydWUsIFtcbiAgICAgIC8vIG1hYyBEaWdlc3RJbmZvXG4gICAgICBhc24xLmNyZWF0ZShhc24xLkNsYXNzLlVOSVZFUlNBTCwgYXNuMS5UeXBlLlNFUVVFTkNFLCB0cnVlLCBbXG4gICAgICAgIC8vIGRpZ2VzdEFsZ29yaXRobVxuICAgICAgICBhc24xLmNyZWF0ZShhc24xLkNsYXNzLlVOSVZFUlNBTCwgYXNuMS5UeXBlLlNFUVVFTkNFLCB0cnVlLCBbXG4gICAgICAgICAgLy8gYWxnb3JpdGhtID0gU0hBLTFcbiAgICAgICAgICBhc24xLmNyZWF0ZShhc24xLkNsYXNzLlVOSVZFUlNBTCwgYXNuMS5UeXBlLk9JRCwgZmFsc2UsXG4gICAgICAgICAgICBhc24xLm9pZFRvRGVyKHBraS5vaWRzLnNoYTEpLmdldEJ5dGVzKCkpLFxuICAgICAgICAgIC8vIHBhcmFtZXRlcnMgPSBOdWxsXG4gICAgICAgICAgYXNuMS5jcmVhdGUoYXNuMS5DbGFzcy5VTklWRVJTQUwsIGFzbjEuVHlwZS5OVUxMLCBmYWxzZSwgJycpXG4gICAgICAgIF0pLFxuICAgICAgICAvLyBkaWdlc3RcbiAgICAgICAgYXNuMS5jcmVhdGUoXG4gICAgICAgICAgYXNuMS5DbGFzcy5VTklWRVJTQUwsIGFzbjEuVHlwZS5PQ1RFVFNUUklORyxcbiAgICAgICAgICBmYWxzZSwgbWFjVmFsdWUuZ2V0Qnl0ZXMoKSlcbiAgICAgIF0pLFxuICAgICAgLy8gbWFjU2FsdCBPQ1RFVCBTVFJJTkdcbiAgICAgIGFzbjEuY3JlYXRlKFxuICAgICAgICBhc24xLkNsYXNzLlVOSVZFUlNBTCwgYXNuMS5UeXBlLk9DVEVUU1RSSU5HLCBmYWxzZSwgbWFjU2FsdC5nZXRCeXRlcygpKSxcbiAgICAgIC8vIGl0ZXJhdGlvbnMgSU5URUdFUiAoWFhYOiBPbmx5IHN1cHBvcnQgY291bnQgPCA2NTUzNilcbiAgICAgIGFzbjEuY3JlYXRlKGFzbjEuQ2xhc3MuVU5JVkVSU0FMLCBhc24xLlR5cGUuSU5URUdFUiwgZmFsc2UsXG4gICAgICAgIGFzbjEuaW50ZWdlclRvRGVyKGNvdW50KS5nZXRCeXRlcygpXG4gICAgICApXG4gICAgXSk7XG4gIH1cblxuICAvLyBQRlhcbiAgcmV0dXJuIGFzbjEuY3JlYXRlKGFzbjEuQ2xhc3MuVU5JVkVSU0FMLCBhc24xLlR5cGUuU0VRVUVOQ0UsIHRydWUsIFtcbiAgICAvLyB2ZXJzaW9uICgzKVxuICAgIGFzbjEuY3JlYXRlKGFzbjEuQ2xhc3MuVU5JVkVSU0FMLCBhc24xLlR5cGUuSU5URUdFUiwgZmFsc2UsXG4gICAgICBhc24xLmludGVnZXJUb0RlcigzKS5nZXRCeXRlcygpKSxcbiAgICAvLyBQS0NTIzcgQ29udGVudEluZm9cbiAgICBhc24xLmNyZWF0ZShhc24xLkNsYXNzLlVOSVZFUlNBTCwgYXNuMS5UeXBlLlNFUVVFTkNFLCB0cnVlLCBbXG4gICAgICAvLyBjb250ZW50VHlwZVxuICAgICAgYXNuMS5jcmVhdGUoYXNuMS5DbGFzcy5VTklWRVJTQUwsIGFzbjEuVHlwZS5PSUQsIGZhbHNlLFxuICAgICAgICAvLyBPSUQgZm9yIHRoZSBjb250ZW50IHR5cGUgaXMgJ2RhdGEnXG4gICAgICAgIGFzbjEub2lkVG9EZXIocGtpLm9pZHMuZGF0YSkuZ2V0Qnl0ZXMoKSksXG4gICAgICAvLyBjb250ZW50XG4gICAgICBhc24xLmNyZWF0ZShhc24xLkNsYXNzLkNPTlRFWFRfU1BFQ0lGSUMsIDAsIHRydWUsIFtcbiAgICAgICAgYXNuMS5jcmVhdGUoXG4gICAgICAgICAgYXNuMS5DbGFzcy5VTklWRVJTQUwsIGFzbjEuVHlwZS5PQ1RFVFNUUklORywgZmFsc2UsXG4gICAgICAgICAgYXNuMS50b0RlcihzYWZlKS5nZXRCeXRlcygpKVxuICAgICAgXSlcbiAgICBdKSxcbiAgICBtYWNEYXRhXG4gIF0pO1xufTtcblxuLyoqXG4gKiBEZXJpdmVzIGEgUEtDUyMxMiBrZXkuXG4gKlxuICogQHBhcmFtIHBhc3N3b3JkIHRoZSBwYXNzd29yZCB0byBkZXJpdmUgdGhlIGtleSBtYXRlcmlhbCBmcm9tLCBudWxsIG9yXG4gKiAgICAgICAgICB1bmRlZmluZWQgZm9yIG5vbmUuXG4gKiBAcGFyYW0gc2FsdCB0aGUgc2FsdCwgYXMgYSBCeXRlQnVmZmVyLCB0byB1c2UuXG4gKiBAcGFyYW0gaWQgdGhlIFBLQ1MjMTIgSUQgYnl0ZSAoMSA9IGtleSBtYXRlcmlhbCwgMiA9IElWLCAzID0gTUFDKS5cbiAqIEBwYXJhbSBpdGVyIHRoZSBpdGVyYXRpb24gY291bnQuXG4gKiBAcGFyYW0gbiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGRlcml2ZSBmcm9tIHRoZSBwYXNzd29yZC5cbiAqIEBwYXJhbSBtZCB0aGUgbWVzc2FnZSBkaWdlc3QgdG8gdXNlLCBkZWZhdWx0cyB0byBTSEEtMS5cbiAqXG4gKiBAcmV0dXJuIGEgQnl0ZUJ1ZmZlciB3aXRoIHRoZSBieXRlcyBkZXJpdmVkIGZyb20gdGhlIHBhc3N3b3JkLlxuICovXG5wMTIuZ2VuZXJhdGVLZXkgPSBmb3JnZS5wYmUuZ2VuZXJhdGVQa2NzMTJLZXk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///87\n")},function(module,exports,__webpack_require__){eval("/**\n * Javascript implementation of ASN.1 validators for PKCS#7 v1.5.\n *\n * @author Dave Longley\n * @author Stefan Siegl\n *\n * Copyright (c) 2012-2015 Digital Bazaar, Inc.\n * Copyright (c) 2012 Stefan Siegl <stesie@brokenpipe.de>\n *\n * The ASN.1 representation of PKCS#7 is as follows\n * (see RFC #2315 for details, http://www.ietf.org/rfc/rfc2315.txt):\n *\n * A PKCS#7 message consists of a ContentInfo on root level, which may\n * contain any number of further ContentInfo nested into it.\n *\n * ContentInfo ::= SEQUENCE {\n *   contentType                ContentType,\n *   content               [0]  EXPLICIT ANY DEFINED BY contentType OPTIONAL\n * }\n *\n * ContentType ::= OBJECT IDENTIFIER\n *\n * EnvelopedData ::= SEQUENCE {\n *   version                    Version,\n *   recipientInfos             RecipientInfos,\n *   encryptedContentInfo       EncryptedContentInfo\n * }\n *\n * EncryptedData ::= SEQUENCE {\n *   version                    Version,\n *   encryptedContentInfo       EncryptedContentInfo\n * }\n *\n * id-signedData OBJECT IDENTIFIER ::= { iso(1) member-body(2)\n *   us(840) rsadsi(113549) pkcs(1) pkcs7(7) 2 }\n *\n * SignedData ::= SEQUENCE {\n *   version           INTEGER,\n *   digestAlgorithms  DigestAlgorithmIdentifiers,\n *   contentInfo       ContentInfo,\n *   certificates      [0] IMPLICIT Certificates OPTIONAL,\n *   crls              [1] IMPLICIT CertificateRevocationLists OPTIONAL,\n *   signerInfos       SignerInfos\n * }\n *\n * SignerInfos ::= SET OF SignerInfo\n *\n * SignerInfo ::= SEQUENCE {\n *   version                    Version,\n *   issuerAndSerialNumber      IssuerAndSerialNumber,\n *   digestAlgorithm            DigestAlgorithmIdentifier,\n *   authenticatedAttributes    [0] IMPLICIT Attributes OPTIONAL,\n *   digestEncryptionAlgorithm  DigestEncryptionAlgorithmIdentifier,\n *   encryptedDigest            EncryptedDigest,\n *   unauthenticatedAttributes  [1] IMPLICIT Attributes OPTIONAL\n * }\n *\n * EncryptedDigest ::= OCTET STRING\n *\n * Attributes ::= SET OF Attribute\n *\n * Attribute ::= SEQUENCE {\n *   attrType    OBJECT IDENTIFIER,\n *   attrValues  SET OF AttributeValue\n * }\n *\n * AttributeValue ::= ANY\n *\n * Version ::= INTEGER\n *\n * RecipientInfos ::= SET OF RecipientInfo\n *\n * EncryptedContentInfo ::= SEQUENCE {\n *   contentType                 ContentType,\n *   contentEncryptionAlgorithm  ContentEncryptionAlgorithmIdentifier,\n *   encryptedContent       [0]  IMPLICIT EncryptedContent OPTIONAL\n * }\n *\n * ContentEncryptionAlgorithmIdentifier ::= AlgorithmIdentifier\n *\n * The AlgorithmIdentifier contains an Object Identifier (OID) and parameters\n * for the algorithm, if any. In the case of AES and DES3, there is only one,\n * the IV.\n *\n * AlgorithmIdentifer ::= SEQUENCE {\n *    algorithm OBJECT IDENTIFIER,\n *    parameters ANY DEFINED BY algorithm OPTIONAL\n * }\n *\n * EncryptedContent ::= OCTET STRING\n *\n * RecipientInfo ::= SEQUENCE {\n *   version                     Version,\n *   issuerAndSerialNumber       IssuerAndSerialNumber,\n *   keyEncryptionAlgorithm      KeyEncryptionAlgorithmIdentifier,\n *   encryptedKey                EncryptedKey\n * }\n *\n * IssuerAndSerialNumber ::= SEQUENCE {\n *   issuer                      Name,\n *   serialNumber                CertificateSerialNumber\n * }\n *\n * CertificateSerialNumber ::= INTEGER\n *\n * KeyEncryptionAlgorithmIdentifier ::= AlgorithmIdentifier\n *\n * EncryptedKey ::= OCTET STRING\n */\nvar forge = __webpack_require__(4);\n__webpack_require__(14);\n__webpack_require__(7);\n\n// shortcut for ASN.1 API\nvar asn1 = forge.asn1;\n\n// shortcut for PKCS#7 API\nvar p7v = module.exports = forge.pkcs7asn1 = forge.pkcs7asn1 || {};\nforge.pkcs7 = forge.pkcs7 || {};\nforge.pkcs7.asn1 = p7v;\n\nvar contentInfoValidator = {\n  name: 'ContentInfo',\n  tagClass: asn1.Class.UNIVERSAL,\n  type: asn1.Type.SEQUENCE,\n  constructed: true,\n  value: [{\n    name: 'ContentInfo.ContentType',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.OID,\n    constructed: false,\n    capture: 'contentType'\n  }, {\n    name: 'ContentInfo.content',\n    tagClass: asn1.Class.CONTEXT_SPECIFIC,\n    type: 0,\n    constructed: true,\n    optional: true,\n    captureAsn1: 'content'\n  }]\n};\np7v.contentInfoValidator = contentInfoValidator;\n\nvar encryptedContentInfoValidator = {\n  name: 'EncryptedContentInfo',\n  tagClass: asn1.Class.UNIVERSAL,\n  type: asn1.Type.SEQUENCE,\n  constructed: true,\n  value: [{\n    name: 'EncryptedContentInfo.contentType',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.OID,\n    constructed: false,\n    capture: 'contentType'\n  }, {\n    name: 'EncryptedContentInfo.contentEncryptionAlgorithm',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.SEQUENCE,\n    constructed: true,\n    value: [{\n      name: 'EncryptedContentInfo.contentEncryptionAlgorithm.algorithm',\n      tagClass: asn1.Class.UNIVERSAL,\n      type: asn1.Type.OID,\n      constructed: false,\n      capture: 'encAlgorithm'\n    }, {\n      name: 'EncryptedContentInfo.contentEncryptionAlgorithm.parameter',\n      tagClass: asn1.Class.UNIVERSAL,\n      captureAsn1: 'encParameter'\n    }]\n  }, {\n    name: 'EncryptedContentInfo.encryptedContent',\n    tagClass: asn1.Class.CONTEXT_SPECIFIC,\n    type: 0,\n    /* The PKCS#7 structure output by OpenSSL somewhat differs from what\n     * other implementations do generate.\n     *\n     * OpenSSL generates a structure like this:\n     * SEQUENCE {\n     *    ...\n     *    [0]\n     *       26 DA 67 D2 17 9C 45 3C B1 2A A8 59 2F 29 33 38\n     *       C3 C3 DF 86 71 74 7A 19 9F 40 D0 29 BE 85 90 45\n     *       ...\n     * }\n     *\n     * Whereas other implementations (and this PKCS#7 module) generate:\n     * SEQUENCE {\n     *    ...\n     *    [0] {\n     *       OCTET STRING\n     *          26 DA 67 D2 17 9C 45 3C B1 2A A8 59 2F 29 33 38\n     *          C3 C3 DF 86 71 74 7A 19 9F 40 D0 29 BE 85 90 45\n     *          ...\n     *    }\n     * }\n     *\n     * In order to support both, we just capture the context specific\n     * field here.  The OCTET STRING bit is removed below.\n     */\n    capture: 'encryptedContent',\n    captureAsn1: 'encryptedContentAsn1'\n  }]\n};\n\np7v.envelopedDataValidator = {\n  name: 'EnvelopedData',\n  tagClass: asn1.Class.UNIVERSAL,\n  type: asn1.Type.SEQUENCE,\n  constructed: true,\n  value: [{\n    name: 'EnvelopedData.Version',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.INTEGER,\n    constructed: false,\n    capture: 'version'\n  }, {\n    name: 'EnvelopedData.RecipientInfos',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.SET,\n    constructed: true,\n    captureAsn1: 'recipientInfos'\n  }].concat(encryptedContentInfoValidator)\n};\n\np7v.encryptedDataValidator = {\n  name: 'EncryptedData',\n  tagClass: asn1.Class.UNIVERSAL,\n  type: asn1.Type.SEQUENCE,\n  constructed: true,\n  value: [{\n    name: 'EncryptedData.Version',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.INTEGER,\n    constructed: false,\n    capture: 'version'\n  }].concat(encryptedContentInfoValidator)\n};\n\nvar signerValidator = {\n  name: 'SignerInfo',\n  tagClass: asn1.Class.UNIVERSAL,\n  type: asn1.Type.SEQUENCE,\n  constructed: true,\n  value: [{\n    name: 'SignerInfo.version',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.INTEGER,\n    constructed: false\n  }, {\n    name: 'SignerInfo.issuerAndSerialNumber',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.SEQUENCE,\n    constructed: true,\n    value: [{\n      name: 'SignerInfo.issuerAndSerialNumber.issuer',\n      tagClass: asn1.Class.UNIVERSAL,\n      type: asn1.Type.SEQUENCE,\n      constructed: true,\n      captureAsn1: 'issuer'\n    }, {\n      name: 'SignerInfo.issuerAndSerialNumber.serialNumber',\n      tagClass: asn1.Class.UNIVERSAL,\n      type: asn1.Type.INTEGER,\n      constructed: false,\n      capture: 'serial'\n    }]\n  }, {\n    name: 'SignerInfo.digestAlgorithm',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.SEQUENCE,\n    constructed: true,\n    value: [{\n      name: 'SignerInfo.digestAlgorithm.algorithm',\n      tagClass: asn1.Class.UNIVERSAL,\n      type: asn1.Type.OID,\n      constructed: false,\n      capture: 'digestAlgorithm'\n    }, {\n      name: 'SignerInfo.digestAlgorithm.parameter',\n      tagClass: asn1.Class.UNIVERSAL,\n      constructed: false,\n      captureAsn1: 'digestParameter',\n      optional: true\n    }]\n  }, {\n    name: 'SignerInfo.authenticatedAttributes',\n    tagClass: asn1.Class.CONTEXT_SPECIFIC,\n    type: 0,\n    constructed: true,\n    optional: true,\n    capture: 'authenticatedAttributes'\n  }, {\n    name: 'SignerInfo.digestEncryptionAlgorithm',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.SEQUENCE,\n    constructed: true,\n    capture: 'signatureAlgorithm'\n  }, {\n    name: 'SignerInfo.encryptedDigest',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.OCTETSTRING,\n    constructed: false,\n    capture: 'signature'\n  }, {\n    name: 'SignerInfo.unauthenticatedAttributes',\n    tagClass: asn1.Class.CONTEXT_SPECIFIC,\n    type: 1,\n    constructed: true,\n    optional: true,\n    capture: 'unauthenticatedAttributes'\n  }]\n};\n\np7v.signedDataValidator = {\n  name: 'SignedData',\n  tagClass: asn1.Class.UNIVERSAL,\n  type: asn1.Type.SEQUENCE,\n  constructed: true,\n  value: [{\n    name: 'SignedData.Version',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.INTEGER,\n    constructed: false,\n    capture: 'version'\n  }, {\n    name: 'SignedData.DigestAlgorithms',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.SET,\n    constructed: true,\n    captureAsn1: 'digestAlgorithms'\n  },\n  contentInfoValidator,\n  {\n    name: 'SignedData.Certificates',\n    tagClass: asn1.Class.CONTEXT_SPECIFIC,\n    type: 0,\n    optional: true,\n    captureAsn1: 'certificates'\n  }, {\n    name: 'SignedData.CertificateRevocationLists',\n    tagClass: asn1.Class.CONTEXT_SPECIFIC,\n    type: 1,\n    optional: true,\n    captureAsn1: 'crls'\n  }, {\n    name: 'SignedData.SignerInfos',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.SET,\n    capture: 'signerInfos',\n    optional: true,\n    value: [signerValidator]\n  }]\n};\n\np7v.recipientInfoValidator = {\n  name: 'RecipientInfo',\n  tagClass: asn1.Class.UNIVERSAL,\n  type: asn1.Type.SEQUENCE,\n  constructed: true,\n  value: [{\n    name: 'RecipientInfo.version',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.INTEGER,\n    constructed: false,\n    capture: 'version'\n  }, {\n    name: 'RecipientInfo.issuerAndSerial',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.SEQUENCE,\n    constructed: true,\n    value: [{\n      name: 'RecipientInfo.issuerAndSerial.issuer',\n      tagClass: asn1.Class.UNIVERSAL,\n      type: asn1.Type.SEQUENCE,\n      constructed: true,\n      captureAsn1: 'issuer'\n    }, {\n      name: 'RecipientInfo.issuerAndSerial.serialNumber',\n      tagClass: asn1.Class.UNIVERSAL,\n      type: asn1.Type.INTEGER,\n      constructed: false,\n      capture: 'serial'\n    }]\n  }, {\n    name: 'RecipientInfo.keyEncryptionAlgorithm',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.SEQUENCE,\n    constructed: true,\n    value: [{\n      name: 'RecipientInfo.keyEncryptionAlgorithm.algorithm',\n      tagClass: asn1.Class.UNIVERSAL,\n      type: asn1.Type.OID,\n      constructed: false,\n      capture: 'encAlgorithm'\n    }, {\n      name: 'RecipientInfo.keyEncryptionAlgorithm.parameter',\n      tagClass: asn1.Class.UNIVERSAL,\n      constructed: false,\n      captureAsn1: 'encParameter',\n      optional: true\n    }]\n  }, {\n    name: 'RecipientInfo.encryptedKey',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.OCTETSTRING,\n    constructed: false,\n    capture: 'encKey'\n  }]\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODguanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbm9kZS1mb3JnZS9saWIvcGtjczdhc24xLmpzP2Y2YTQiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBKYXZhc2NyaXB0IGltcGxlbWVudGF0aW9uIG9mIEFTTi4xIHZhbGlkYXRvcnMgZm9yIFBLQ1MjNyB2MS41LlxuICpcbiAqIEBhdXRob3IgRGF2ZSBMb25nbGV5XG4gKiBAYXV0aG9yIFN0ZWZhbiBTaWVnbFxuICpcbiAqIENvcHlyaWdodCAoYykgMjAxMi0yMDE1IERpZ2l0YWwgQmF6YWFyLCBJbmMuXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTIgU3RlZmFuIFNpZWdsIDxzdGVzaWVAYnJva2VucGlwZS5kZT5cbiAqXG4gKiBUaGUgQVNOLjEgcmVwcmVzZW50YXRpb24gb2YgUEtDUyM3IGlzIGFzIGZvbGxvd3NcbiAqIChzZWUgUkZDICMyMzE1IGZvciBkZXRhaWxzLCBodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMyMzE1LnR4dCk6XG4gKlxuICogQSBQS0NTIzcgbWVzc2FnZSBjb25zaXN0cyBvZiBhIENvbnRlbnRJbmZvIG9uIHJvb3QgbGV2ZWwsIHdoaWNoIG1heVxuICogY29udGFpbiBhbnkgbnVtYmVyIG9mIGZ1cnRoZXIgQ29udGVudEluZm8gbmVzdGVkIGludG8gaXQuXG4gKlxuICogQ29udGVudEluZm8gOjo9IFNFUVVFTkNFIHtcbiAqICAgY29udGVudFR5cGUgICAgICAgICAgICAgICAgQ29udGVudFR5cGUsXG4gKiAgIGNvbnRlbnQgICAgICAgICAgICAgICBbMF0gIEVYUExJQ0lUIEFOWSBERUZJTkVEIEJZIGNvbnRlbnRUeXBlIE9QVElPTkFMXG4gKiB9XG4gKlxuICogQ29udGVudFR5cGUgOjo9IE9CSkVDVCBJREVOVElGSUVSXG4gKlxuICogRW52ZWxvcGVkRGF0YSA6Oj0gU0VRVUVOQ0Uge1xuICogICB2ZXJzaW9uICAgICAgICAgICAgICAgICAgICBWZXJzaW9uLFxuICogICByZWNpcGllbnRJbmZvcyAgICAgICAgICAgICBSZWNpcGllbnRJbmZvcyxcbiAqICAgZW5jcnlwdGVkQ29udGVudEluZm8gICAgICAgRW5jcnlwdGVkQ29udGVudEluZm9cbiAqIH1cbiAqXG4gKiBFbmNyeXB0ZWREYXRhIDo6PSBTRVFVRU5DRSB7XG4gKiAgIHZlcnNpb24gICAgICAgICAgICAgICAgICAgIFZlcnNpb24sXG4gKiAgIGVuY3J5cHRlZENvbnRlbnRJbmZvICAgICAgIEVuY3J5cHRlZENvbnRlbnRJbmZvXG4gKiB9XG4gKlxuICogaWQtc2lnbmVkRGF0YSBPQkpFQ1QgSURFTlRJRklFUiA6Oj0geyBpc28oMSkgbWVtYmVyLWJvZHkoMilcbiAqICAgdXMoODQwKSByc2Fkc2koMTEzNTQ5KSBwa2NzKDEpIHBrY3M3KDcpIDIgfVxuICpcbiAqIFNpZ25lZERhdGEgOjo9IFNFUVVFTkNFIHtcbiAqICAgdmVyc2lvbiAgICAgICAgICAgSU5URUdFUixcbiAqICAgZGlnZXN0QWxnb3JpdGhtcyAgRGlnZXN0QWxnb3JpdGhtSWRlbnRpZmllcnMsXG4gKiAgIGNvbnRlbnRJbmZvICAgICAgIENvbnRlbnRJbmZvLFxuICogICBjZXJ0aWZpY2F0ZXMgICAgICBbMF0gSU1QTElDSVQgQ2VydGlmaWNhdGVzIE9QVElPTkFMLFxuICogICBjcmxzICAgICAgICAgICAgICBbMV0gSU1QTElDSVQgQ2VydGlmaWNhdGVSZXZvY2F0aW9uTGlzdHMgT1BUSU9OQUwsXG4gKiAgIHNpZ25lckluZm9zICAgICAgIFNpZ25lckluZm9zXG4gKiB9XG4gKlxuICogU2lnbmVySW5mb3MgOjo9IFNFVCBPRiBTaWduZXJJbmZvXG4gKlxuICogU2lnbmVySW5mbyA6Oj0gU0VRVUVOQ0Uge1xuICogICB2ZXJzaW9uICAgICAgICAgICAgICAgICAgICBWZXJzaW9uLFxuICogICBpc3N1ZXJBbmRTZXJpYWxOdW1iZXIgICAgICBJc3N1ZXJBbmRTZXJpYWxOdW1iZXIsXG4gKiAgIGRpZ2VzdEFsZ29yaXRobSAgICAgICAgICAgIERpZ2VzdEFsZ29yaXRobUlkZW50aWZpZXIsXG4gKiAgIGF1dGhlbnRpY2F0ZWRBdHRyaWJ1dGVzICAgIFswXSBJTVBMSUNJVCBBdHRyaWJ1dGVzIE9QVElPTkFMLFxuICogICBkaWdlc3RFbmNyeXB0aW9uQWxnb3JpdGhtICBEaWdlc3RFbmNyeXB0aW9uQWxnb3JpdGhtSWRlbnRpZmllcixcbiAqICAgZW5jcnlwdGVkRGlnZXN0ICAgICAgICAgICAgRW5jcnlwdGVkRGlnZXN0LFxuICogICB1bmF1dGhlbnRpY2F0ZWRBdHRyaWJ1dGVzICBbMV0gSU1QTElDSVQgQXR0cmlidXRlcyBPUFRJT05BTFxuICogfVxuICpcbiAqIEVuY3J5cHRlZERpZ2VzdCA6Oj0gT0NURVQgU1RSSU5HXG4gKlxuICogQXR0cmlidXRlcyA6Oj0gU0VUIE9GIEF0dHJpYnV0ZVxuICpcbiAqIEF0dHJpYnV0ZSA6Oj0gU0VRVUVOQ0Uge1xuICogICBhdHRyVHlwZSAgICBPQkpFQ1QgSURFTlRJRklFUixcbiAqICAgYXR0clZhbHVlcyAgU0VUIE9GIEF0dHJpYnV0ZVZhbHVlXG4gKiB9XG4gKlxuICogQXR0cmlidXRlVmFsdWUgOjo9IEFOWVxuICpcbiAqIFZlcnNpb24gOjo9IElOVEVHRVJcbiAqXG4gKiBSZWNpcGllbnRJbmZvcyA6Oj0gU0VUIE9GIFJlY2lwaWVudEluZm9cbiAqXG4gKiBFbmNyeXB0ZWRDb250ZW50SW5mbyA6Oj0gU0VRVUVOQ0Uge1xuICogICBjb250ZW50VHlwZSAgICAgICAgICAgICAgICAgQ29udGVudFR5cGUsXG4gKiAgIGNvbnRlbnRFbmNyeXB0aW9uQWxnb3JpdGhtICBDb250ZW50RW5jcnlwdGlvbkFsZ29yaXRobUlkZW50aWZpZXIsXG4gKiAgIGVuY3J5cHRlZENvbnRlbnQgICAgICAgWzBdICBJTVBMSUNJVCBFbmNyeXB0ZWRDb250ZW50IE9QVElPTkFMXG4gKiB9XG4gKlxuICogQ29udGVudEVuY3J5cHRpb25BbGdvcml0aG1JZGVudGlmaWVyIDo6PSBBbGdvcml0aG1JZGVudGlmaWVyXG4gKlxuICogVGhlIEFsZ29yaXRobUlkZW50aWZpZXIgY29udGFpbnMgYW4gT2JqZWN0IElkZW50aWZpZXIgKE9JRCkgYW5kIHBhcmFtZXRlcnNcbiAqIGZvciB0aGUgYWxnb3JpdGhtLCBpZiBhbnkuIEluIHRoZSBjYXNlIG9mIEFFUyBhbmQgREVTMywgdGhlcmUgaXMgb25seSBvbmUsXG4gKiB0aGUgSVYuXG4gKlxuICogQWxnb3JpdGhtSWRlbnRpZmVyIDo6PSBTRVFVRU5DRSB7XG4gKiAgICBhbGdvcml0aG0gT0JKRUNUIElERU5USUZJRVIsXG4gKiAgICBwYXJhbWV0ZXJzIEFOWSBERUZJTkVEIEJZIGFsZ29yaXRobSBPUFRJT05BTFxuICogfVxuICpcbiAqIEVuY3J5cHRlZENvbnRlbnQgOjo9IE9DVEVUIFNUUklOR1xuICpcbiAqIFJlY2lwaWVudEluZm8gOjo9IFNFUVVFTkNFIHtcbiAqICAgdmVyc2lvbiAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24sXG4gKiAgIGlzc3VlckFuZFNlcmlhbE51bWJlciAgICAgICBJc3N1ZXJBbmRTZXJpYWxOdW1iZXIsXG4gKiAgIGtleUVuY3J5cHRpb25BbGdvcml0aG0gICAgICBLZXlFbmNyeXB0aW9uQWxnb3JpdGhtSWRlbnRpZmllcixcbiAqICAgZW5jcnlwdGVkS2V5ICAgICAgICAgICAgICAgIEVuY3J5cHRlZEtleVxuICogfVxuICpcbiAqIElzc3VlckFuZFNlcmlhbE51bWJlciA6Oj0gU0VRVUVOQ0Uge1xuICogICBpc3N1ZXIgICAgICAgICAgICAgICAgICAgICAgTmFtZSxcbiAqICAgc2VyaWFsTnVtYmVyICAgICAgICAgICAgICAgIENlcnRpZmljYXRlU2VyaWFsTnVtYmVyXG4gKiB9XG4gKlxuICogQ2VydGlmaWNhdGVTZXJpYWxOdW1iZXIgOjo9IElOVEVHRVJcbiAqXG4gKiBLZXlFbmNyeXB0aW9uQWxnb3JpdGhtSWRlbnRpZmllciA6Oj0gQWxnb3JpdGhtSWRlbnRpZmllclxuICpcbiAqIEVuY3J5cHRlZEtleSA6Oj0gT0NURVQgU1RSSU5HXG4gKi9cbnZhciBmb3JnZSA9IHJlcXVpcmUoJy4vZm9yZ2UnKTtcbnJlcXVpcmUoJy4vYXNuMScpO1xucmVxdWlyZSgnLi91dGlsJyk7XG5cbi8vIHNob3J0Y3V0IGZvciBBU04uMSBBUElcbnZhciBhc24xID0gZm9yZ2UuYXNuMTtcblxuLy8gc2hvcnRjdXQgZm9yIFBLQ1MjNyBBUElcbnZhciBwN3YgPSBtb2R1bGUuZXhwb3J0cyA9IGZvcmdlLnBrY3M3YXNuMSA9IGZvcmdlLnBrY3M3YXNuMSB8fCB7fTtcbmZvcmdlLnBrY3M3ID0gZm9yZ2UucGtjczcgfHwge307XG5mb3JnZS5wa2NzNy5hc24xID0gcDd2O1xuXG52YXIgY29udGVudEluZm9WYWxpZGF0b3IgPSB7XG4gIG5hbWU6ICdDb250ZW50SW5mbycsXG4gIHRhZ0NsYXNzOiBhc24xLkNsYXNzLlVOSVZFUlNBTCxcbiAgdHlwZTogYXNuMS5UeXBlLlNFUVVFTkNFLFxuICBjb25zdHJ1Y3RlZDogdHJ1ZSxcbiAgdmFsdWU6IFt7XG4gICAgbmFtZTogJ0NvbnRlbnRJbmZvLkNvbnRlbnRUeXBlJyxcbiAgICB0YWdDbGFzczogYXNuMS5DbGFzcy5VTklWRVJTQUwsXG4gICAgdHlwZTogYXNuMS5UeXBlLk9JRCxcbiAgICBjb25zdHJ1Y3RlZDogZmFsc2UsXG4gICAgY2FwdHVyZTogJ2NvbnRlbnRUeXBlJ1xuICB9LCB7XG4gICAgbmFtZTogJ0NvbnRlbnRJbmZvLmNvbnRlbnQnLFxuICAgIHRhZ0NsYXNzOiBhc24xLkNsYXNzLkNPTlRFWFRfU1BFQ0lGSUMsXG4gICAgdHlwZTogMCxcbiAgICBjb25zdHJ1Y3RlZDogdHJ1ZSxcbiAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICBjYXB0dXJlQXNuMTogJ2NvbnRlbnQnXG4gIH1dXG59O1xucDd2LmNvbnRlbnRJbmZvVmFsaWRhdG9yID0gY29udGVudEluZm9WYWxpZGF0b3I7XG5cbnZhciBlbmNyeXB0ZWRDb250ZW50SW5mb1ZhbGlkYXRvciA9IHtcbiAgbmFtZTogJ0VuY3J5cHRlZENvbnRlbnRJbmZvJyxcbiAgdGFnQ2xhc3M6IGFzbjEuQ2xhc3MuVU5JVkVSU0FMLFxuICB0eXBlOiBhc24xLlR5cGUuU0VRVUVOQ0UsXG4gIGNvbnN0cnVjdGVkOiB0cnVlLFxuICB2YWx1ZTogW3tcbiAgICBuYW1lOiAnRW5jcnlwdGVkQ29udGVudEluZm8uY29udGVudFR5cGUnLFxuICAgIHRhZ0NsYXNzOiBhc24xLkNsYXNzLlVOSVZFUlNBTCxcbiAgICB0eXBlOiBhc24xLlR5cGUuT0lELFxuICAgIGNvbnN0cnVjdGVkOiBmYWxzZSxcbiAgICBjYXB0dXJlOiAnY29udGVudFR5cGUnXG4gIH0sIHtcbiAgICBuYW1lOiAnRW5jcnlwdGVkQ29udGVudEluZm8uY29udGVudEVuY3J5cHRpb25BbGdvcml0aG0nLFxuICAgIHRhZ0NsYXNzOiBhc24xLkNsYXNzLlVOSVZFUlNBTCxcbiAgICB0eXBlOiBhc24xLlR5cGUuU0VRVUVOQ0UsXG4gICAgY29uc3RydWN0ZWQ6IHRydWUsXG4gICAgdmFsdWU6IFt7XG4gICAgICBuYW1lOiAnRW5jcnlwdGVkQ29udGVudEluZm8uY29udGVudEVuY3J5cHRpb25BbGdvcml0aG0uYWxnb3JpdGhtJyxcbiAgICAgIHRhZ0NsYXNzOiBhc24xLkNsYXNzLlVOSVZFUlNBTCxcbiAgICAgIHR5cGU6IGFzbjEuVHlwZS5PSUQsXG4gICAgICBjb25zdHJ1Y3RlZDogZmFsc2UsXG4gICAgICBjYXB0dXJlOiAnZW5jQWxnb3JpdGhtJ1xuICAgIH0sIHtcbiAgICAgIG5hbWU6ICdFbmNyeXB0ZWRDb250ZW50SW5mby5jb250ZW50RW5jcnlwdGlvbkFsZ29yaXRobS5wYXJhbWV0ZXInLFxuICAgICAgdGFnQ2xhc3M6IGFzbjEuQ2xhc3MuVU5JVkVSU0FMLFxuICAgICAgY2FwdHVyZUFzbjE6ICdlbmNQYXJhbWV0ZXInXG4gICAgfV1cbiAgfSwge1xuICAgIG5hbWU6ICdFbmNyeXB0ZWRDb250ZW50SW5mby5lbmNyeXB0ZWRDb250ZW50JyxcbiAgICB0YWdDbGFzczogYXNuMS5DbGFzcy5DT05URVhUX1NQRUNJRklDLFxuICAgIHR5cGU6IDAsXG4gICAgLyogVGhlIFBLQ1MjNyBzdHJ1Y3R1cmUgb3V0cHV0IGJ5IE9wZW5TU0wgc29tZXdoYXQgZGlmZmVycyBmcm9tIHdoYXRcbiAgICAgKiBvdGhlciBpbXBsZW1lbnRhdGlvbnMgZG8gZ2VuZXJhdGUuXG4gICAgICpcbiAgICAgKiBPcGVuU1NMIGdlbmVyYXRlcyBhIHN0cnVjdHVyZSBsaWtlIHRoaXM6XG4gICAgICogU0VRVUVOQ0Uge1xuICAgICAqICAgIC4uLlxuICAgICAqICAgIFswXVxuICAgICAqICAgICAgIDI2IERBIDY3IEQyIDE3IDlDIDQ1IDNDIEIxIDJBIEE4IDU5IDJGIDI5IDMzIDM4XG4gICAgICogICAgICAgQzMgQzMgREYgODYgNzEgNzQgN0EgMTkgOUYgNDAgRDAgMjkgQkUgODUgOTAgNDVcbiAgICAgKiAgICAgICAuLi5cbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBXaGVyZWFzIG90aGVyIGltcGxlbWVudGF0aW9ucyAoYW5kIHRoaXMgUEtDUyM3IG1vZHVsZSkgZ2VuZXJhdGU6XG4gICAgICogU0VRVUVOQ0Uge1xuICAgICAqICAgIC4uLlxuICAgICAqICAgIFswXSB7XG4gICAgICogICAgICAgT0NURVQgU1RSSU5HXG4gICAgICogICAgICAgICAgMjYgREEgNjcgRDIgMTcgOUMgNDUgM0MgQjEgMkEgQTggNTkgMkYgMjkgMzMgMzhcbiAgICAgKiAgICAgICAgICBDMyBDMyBERiA4NiA3MSA3NCA3QSAxOSA5RiA0MCBEMCAyOSBCRSA4NSA5MCA0NVxuICAgICAqICAgICAgICAgIC4uLlxuICAgICAqICAgIH1cbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBJbiBvcmRlciB0byBzdXBwb3J0IGJvdGgsIHdlIGp1c3QgY2FwdHVyZSB0aGUgY29udGV4dCBzcGVjaWZpY1xuICAgICAqIGZpZWxkIGhlcmUuICBUaGUgT0NURVQgU1RSSU5HIGJpdCBpcyByZW1vdmVkIGJlbG93LlxuICAgICAqL1xuICAgIGNhcHR1cmU6ICdlbmNyeXB0ZWRDb250ZW50JyxcbiAgICBjYXB0dXJlQXNuMTogJ2VuY3J5cHRlZENvbnRlbnRBc24xJ1xuICB9XVxufTtcblxucDd2LmVudmVsb3BlZERhdGFWYWxpZGF0b3IgPSB7XG4gIG5hbWU6ICdFbnZlbG9wZWREYXRhJyxcbiAgdGFnQ2xhc3M6IGFzbjEuQ2xhc3MuVU5JVkVSU0FMLFxuICB0eXBlOiBhc24xLlR5cGUuU0VRVUVOQ0UsXG4gIGNvbnN0cnVjdGVkOiB0cnVlLFxuICB2YWx1ZTogW3tcbiAgICBuYW1lOiAnRW52ZWxvcGVkRGF0YS5WZXJzaW9uJyxcbiAgICB0YWdDbGFzczogYXNuMS5DbGFzcy5VTklWRVJTQUwsXG4gICAgdHlwZTogYXNuMS5UeXBlLklOVEVHRVIsXG4gICAgY29uc3RydWN0ZWQ6IGZhbHNlLFxuICAgIGNhcHR1cmU6ICd2ZXJzaW9uJ1xuICB9LCB7XG4gICAgbmFtZTogJ0VudmVsb3BlZERhdGEuUmVjaXBpZW50SW5mb3MnLFxuICAgIHRhZ0NsYXNzOiBhc24xLkNsYXNzLlVOSVZFUlNBTCxcbiAgICB0eXBlOiBhc24xLlR5cGUuU0VULFxuICAgIGNvbnN0cnVjdGVkOiB0cnVlLFxuICAgIGNhcHR1cmVBc24xOiAncmVjaXBpZW50SW5mb3MnXG4gIH1dLmNvbmNhdChlbmNyeXB0ZWRDb250ZW50SW5mb1ZhbGlkYXRvcilcbn07XG5cbnA3di5lbmNyeXB0ZWREYXRhVmFsaWRhdG9yID0ge1xuICBuYW1lOiAnRW5jcnlwdGVkRGF0YScsXG4gIHRhZ0NsYXNzOiBhc24xLkNsYXNzLlVOSVZFUlNBTCxcbiAgdHlwZTogYXNuMS5UeXBlLlNFUVVFTkNFLFxuICBjb25zdHJ1Y3RlZDogdHJ1ZSxcbiAgdmFsdWU6IFt7XG4gICAgbmFtZTogJ0VuY3J5cHRlZERhdGEuVmVyc2lvbicsXG4gICAgdGFnQ2xhc3M6IGFzbjEuQ2xhc3MuVU5JVkVSU0FMLFxuICAgIHR5cGU6IGFzbjEuVHlwZS5JTlRFR0VSLFxuICAgIGNvbnN0cnVjdGVkOiBmYWxzZSxcbiAgICBjYXB0dXJlOiAndmVyc2lvbidcbiAgfV0uY29uY2F0KGVuY3J5cHRlZENvbnRlbnRJbmZvVmFsaWRhdG9yKVxufTtcblxudmFyIHNpZ25lclZhbGlkYXRvciA9IHtcbiAgbmFtZTogJ1NpZ25lckluZm8nLFxuICB0YWdDbGFzczogYXNuMS5DbGFzcy5VTklWRVJTQUwsXG4gIHR5cGU6IGFzbjEuVHlwZS5TRVFVRU5DRSxcbiAgY29uc3RydWN0ZWQ6IHRydWUsXG4gIHZhbHVlOiBbe1xuICAgIG5hbWU6ICdTaWduZXJJbmZvLnZlcnNpb24nLFxuICAgIHRhZ0NsYXNzOiBhc24xLkNsYXNzLlVOSVZFUlNBTCxcbiAgICB0eXBlOiBhc24xLlR5cGUuSU5URUdFUixcbiAgICBjb25zdHJ1Y3RlZDogZmFsc2VcbiAgfSwge1xuICAgIG5hbWU6ICdTaWduZXJJbmZvLmlzc3VlckFuZFNlcmlhbE51bWJlcicsXG4gICAgdGFnQ2xhc3M6IGFzbjEuQ2xhc3MuVU5JVkVSU0FMLFxuICAgIHR5cGU6IGFzbjEuVHlwZS5TRVFVRU5DRSxcbiAgICBjb25zdHJ1Y3RlZDogdHJ1ZSxcbiAgICB2YWx1ZTogW3tcbiAgICAgIG5hbWU6ICdTaWduZXJJbmZvLmlzc3VlckFuZFNlcmlhbE51bWJlci5pc3N1ZXInLFxuICAgICAgdGFnQ2xhc3M6IGFzbjEuQ2xhc3MuVU5JVkVSU0FMLFxuICAgICAgdHlwZTogYXNuMS5UeXBlLlNFUVVFTkNFLFxuICAgICAgY29uc3RydWN0ZWQ6IHRydWUsXG4gICAgICBjYXB0dXJlQXNuMTogJ2lzc3VlcidcbiAgICB9LCB7XG4gICAgICBuYW1lOiAnU2lnbmVySW5mby5pc3N1ZXJBbmRTZXJpYWxOdW1iZXIuc2VyaWFsTnVtYmVyJyxcbiAgICAgIHRhZ0NsYXNzOiBhc24xLkNsYXNzLlVOSVZFUlNBTCxcbiAgICAgIHR5cGU6IGFzbjEuVHlwZS5JTlRFR0VSLFxuICAgICAgY29uc3RydWN0ZWQ6IGZhbHNlLFxuICAgICAgY2FwdHVyZTogJ3NlcmlhbCdcbiAgICB9XVxuICB9LCB7XG4gICAgbmFtZTogJ1NpZ25lckluZm8uZGlnZXN0QWxnb3JpdGhtJyxcbiAgICB0YWdDbGFzczogYXNuMS5DbGFzcy5VTklWRVJTQUwsXG4gICAgdHlwZTogYXNuMS5UeXBlLlNFUVVFTkNFLFxuICAgIGNvbnN0cnVjdGVkOiB0cnVlLFxuICAgIHZhbHVlOiBbe1xuICAgICAgbmFtZTogJ1NpZ25lckluZm8uZGlnZXN0QWxnb3JpdGhtLmFsZ29yaXRobScsXG4gICAgICB0YWdDbGFzczogYXNuMS5DbGFzcy5VTklWRVJTQUwsXG4gICAgICB0eXBlOiBhc24xLlR5cGUuT0lELFxuICAgICAgY29uc3RydWN0ZWQ6IGZhbHNlLFxuICAgICAgY2FwdHVyZTogJ2RpZ2VzdEFsZ29yaXRobSdcbiAgICB9LCB7XG4gICAgICBuYW1lOiAnU2lnbmVySW5mby5kaWdlc3RBbGdvcml0aG0ucGFyYW1ldGVyJyxcbiAgICAgIHRhZ0NsYXNzOiBhc24xLkNsYXNzLlVOSVZFUlNBTCxcbiAgICAgIGNvbnN0cnVjdGVkOiBmYWxzZSxcbiAgICAgIGNhcHR1cmVBc24xOiAnZGlnZXN0UGFyYW1ldGVyJyxcbiAgICAgIG9wdGlvbmFsOiB0cnVlXG4gICAgfV1cbiAgfSwge1xuICAgIG5hbWU6ICdTaWduZXJJbmZvLmF1dGhlbnRpY2F0ZWRBdHRyaWJ1dGVzJyxcbiAgICB0YWdDbGFzczogYXNuMS5DbGFzcy5DT05URVhUX1NQRUNJRklDLFxuICAgIHR5cGU6IDAsXG4gICAgY29uc3RydWN0ZWQ6IHRydWUsXG4gICAgb3B0aW9uYWw6IHRydWUsXG4gICAgY2FwdHVyZTogJ2F1dGhlbnRpY2F0ZWRBdHRyaWJ1dGVzJ1xuICB9LCB7XG4gICAgbmFtZTogJ1NpZ25lckluZm8uZGlnZXN0RW5jcnlwdGlvbkFsZ29yaXRobScsXG4gICAgdGFnQ2xhc3M6IGFzbjEuQ2xhc3MuVU5JVkVSU0FMLFxuICAgIHR5cGU6IGFzbjEuVHlwZS5TRVFVRU5DRSxcbiAgICBjb25zdHJ1Y3RlZDogdHJ1ZSxcbiAgICBjYXB0dXJlOiAnc2lnbmF0dXJlQWxnb3JpdGhtJ1xuICB9LCB7XG4gICAgbmFtZTogJ1NpZ25lckluZm8uZW5jcnlwdGVkRGlnZXN0JyxcbiAgICB0YWdDbGFzczogYXNuMS5DbGFzcy5VTklWRVJTQUwsXG4gICAgdHlwZTogYXNuMS5UeXBlLk9DVEVUU1RSSU5HLFxuICAgIGNvbnN0cnVjdGVkOiBmYWxzZSxcbiAgICBjYXB0dXJlOiAnc2lnbmF0dXJlJ1xuICB9LCB7XG4gICAgbmFtZTogJ1NpZ25lckluZm8udW5hdXRoZW50aWNhdGVkQXR0cmlidXRlcycsXG4gICAgdGFnQ2xhc3M6IGFzbjEuQ2xhc3MuQ09OVEVYVF9TUEVDSUZJQyxcbiAgICB0eXBlOiAxLFxuICAgIGNvbnN0cnVjdGVkOiB0cnVlLFxuICAgIG9wdGlvbmFsOiB0cnVlLFxuICAgIGNhcHR1cmU6ICd1bmF1dGhlbnRpY2F0ZWRBdHRyaWJ1dGVzJ1xuICB9XVxufTtcblxucDd2LnNpZ25lZERhdGFWYWxpZGF0b3IgPSB7XG4gIG5hbWU6ICdTaWduZWREYXRhJyxcbiAgdGFnQ2xhc3M6IGFzbjEuQ2xhc3MuVU5JVkVSU0FMLFxuICB0eXBlOiBhc24xLlR5cGUuU0VRVUVOQ0UsXG4gIGNvbnN0cnVjdGVkOiB0cnVlLFxuICB2YWx1ZTogW3tcbiAgICBuYW1lOiAnU2lnbmVkRGF0YS5WZXJzaW9uJyxcbiAgICB0YWdDbGFzczogYXNuMS5DbGFzcy5VTklWRVJTQUwsXG4gICAgdHlwZTogYXNuMS5UeXBlLklOVEVHRVIsXG4gICAgY29uc3RydWN0ZWQ6IGZhbHNlLFxuICAgIGNhcHR1cmU6ICd2ZXJzaW9uJ1xuICB9LCB7XG4gICAgbmFtZTogJ1NpZ25lZERhdGEuRGlnZXN0QWxnb3JpdGhtcycsXG4gICAgdGFnQ2xhc3M6IGFzbjEuQ2xhc3MuVU5JVkVSU0FMLFxuICAgIHR5cGU6IGFzbjEuVHlwZS5TRVQsXG4gICAgY29uc3RydWN0ZWQ6IHRydWUsXG4gICAgY2FwdHVyZUFzbjE6ICdkaWdlc3RBbGdvcml0aG1zJ1xuICB9LFxuICBjb250ZW50SW5mb1ZhbGlkYXRvcixcbiAge1xuICAgIG5hbWU6ICdTaWduZWREYXRhLkNlcnRpZmljYXRlcycsXG4gICAgdGFnQ2xhc3M6IGFzbjEuQ2xhc3MuQ09OVEVYVF9TUEVDSUZJQyxcbiAgICB0eXBlOiAwLFxuICAgIG9wdGlvbmFsOiB0cnVlLFxuICAgIGNhcHR1cmVBc24xOiAnY2VydGlmaWNhdGVzJ1xuICB9LCB7XG4gICAgbmFtZTogJ1NpZ25lZERhdGEuQ2VydGlmaWNhdGVSZXZvY2F0aW9uTGlzdHMnLFxuICAgIHRhZ0NsYXNzOiBhc24xLkNsYXNzLkNPTlRFWFRfU1BFQ0lGSUMsXG4gICAgdHlwZTogMSxcbiAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICBjYXB0dXJlQXNuMTogJ2NybHMnXG4gIH0sIHtcbiAgICBuYW1lOiAnU2lnbmVkRGF0YS5TaWduZXJJbmZvcycsXG4gICAgdGFnQ2xhc3M6IGFzbjEuQ2xhc3MuVU5JVkVSU0FMLFxuICAgIHR5cGU6IGFzbjEuVHlwZS5TRVQsXG4gICAgY2FwdHVyZTogJ3NpZ25lckluZm9zJyxcbiAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICB2YWx1ZTogW3NpZ25lclZhbGlkYXRvcl1cbiAgfV1cbn07XG5cbnA3di5yZWNpcGllbnRJbmZvVmFsaWRhdG9yID0ge1xuICBuYW1lOiAnUmVjaXBpZW50SW5mbycsXG4gIHRhZ0NsYXNzOiBhc24xLkNsYXNzLlVOSVZFUlNBTCxcbiAgdHlwZTogYXNuMS5UeXBlLlNFUVVFTkNFLFxuICBjb25zdHJ1Y3RlZDogdHJ1ZSxcbiAgdmFsdWU6IFt7XG4gICAgbmFtZTogJ1JlY2lwaWVudEluZm8udmVyc2lvbicsXG4gICAgdGFnQ2xhc3M6IGFzbjEuQ2xhc3MuVU5JVkVSU0FMLFxuICAgIHR5cGU6IGFzbjEuVHlwZS5JTlRFR0VSLFxuICAgIGNvbnN0cnVjdGVkOiBmYWxzZSxcbiAgICBjYXB0dXJlOiAndmVyc2lvbidcbiAgfSwge1xuICAgIG5hbWU6ICdSZWNpcGllbnRJbmZvLmlzc3VlckFuZFNlcmlhbCcsXG4gICAgdGFnQ2xhc3M6IGFzbjEuQ2xhc3MuVU5JVkVSU0FMLFxuICAgIHR5cGU6IGFzbjEuVHlwZS5TRVFVRU5DRSxcbiAgICBjb25zdHJ1Y3RlZDogdHJ1ZSxcbiAgICB2YWx1ZTogW3tcbiAgICAgIG5hbWU6ICdSZWNpcGllbnRJbmZvLmlzc3VlckFuZFNlcmlhbC5pc3N1ZXInLFxuICAgICAgdGFnQ2xhc3M6IGFzbjEuQ2xhc3MuVU5JVkVSU0FMLFxuICAgICAgdHlwZTogYXNuMS5UeXBlLlNFUVVFTkNFLFxuICAgICAgY29uc3RydWN0ZWQ6IHRydWUsXG4gICAgICBjYXB0dXJlQXNuMTogJ2lzc3VlcidcbiAgICB9LCB7XG4gICAgICBuYW1lOiAnUmVjaXBpZW50SW5mby5pc3N1ZXJBbmRTZXJpYWwuc2VyaWFsTnVtYmVyJyxcbiAgICAgIHRhZ0NsYXNzOiBhc24xLkNsYXNzLlVOSVZFUlNBTCxcbiAgICAgIHR5cGU6IGFzbjEuVHlwZS5JTlRFR0VSLFxuICAgICAgY29uc3RydWN0ZWQ6IGZhbHNlLFxuICAgICAgY2FwdHVyZTogJ3NlcmlhbCdcbiAgICB9XVxuICB9LCB7XG4gICAgbmFtZTogJ1JlY2lwaWVudEluZm8ua2V5RW5jcnlwdGlvbkFsZ29yaXRobScsXG4gICAgdGFnQ2xhc3M6IGFzbjEuQ2xhc3MuVU5JVkVSU0FMLFxuICAgIHR5cGU6IGFzbjEuVHlwZS5TRVFVRU5DRSxcbiAgICBjb25zdHJ1Y3RlZDogdHJ1ZSxcbiAgICB2YWx1ZTogW3tcbiAgICAgIG5hbWU6ICdSZWNpcGllbnRJbmZvLmtleUVuY3J5cHRpb25BbGdvcml0aG0uYWxnb3JpdGhtJyxcbiAgICAgIHRhZ0NsYXNzOiBhc24xLkNsYXNzLlVOSVZFUlNBTCxcbiAgICAgIHR5cGU6IGFzbjEuVHlwZS5PSUQsXG4gICAgICBjb25zdHJ1Y3RlZDogZmFsc2UsXG4gICAgICBjYXB0dXJlOiAnZW5jQWxnb3JpdGhtJ1xuICAgIH0sIHtcbiAgICAgIG5hbWU6ICdSZWNpcGllbnRJbmZvLmtleUVuY3J5cHRpb25BbGdvcml0aG0ucGFyYW1ldGVyJyxcbiAgICAgIHRhZ0NsYXNzOiBhc24xLkNsYXNzLlVOSVZFUlNBTCxcbiAgICAgIGNvbnN0cnVjdGVkOiBmYWxzZSxcbiAgICAgIGNhcHR1cmVBc24xOiAnZW5jUGFyYW1ldGVyJyxcbiAgICAgIG9wdGlvbmFsOiB0cnVlXG4gICAgfV1cbiAgfSwge1xuICAgIG5hbWU6ICdSZWNpcGllbnRJbmZvLmVuY3J5cHRlZEtleScsXG4gICAgdGFnQ2xhc3M6IGFzbjEuQ2xhc3MuVU5JVkVSU0FMLFxuICAgIHR5cGU6IGFzbjEuVHlwZS5PQ1RFVFNUUklORyxcbiAgICBjb25zdHJ1Y3RlZDogZmFsc2UsXG4gICAgY2FwdHVyZTogJ2VuY0tleSdcbiAgfV1cbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///88\n")},function(module,exports,__webpack_require__){eval("/**\n * Javascript implementation of mask generation function MGF1.\n *\n * @author Stefan Siegl\n * @author Dave Longley\n *\n * Copyright (c) 2012 Stefan Siegl <stesie@brokenpipe.de>\n * Copyright (c) 2014 Digital Bazaar, Inc.\n */\nvar forge = __webpack_require__(4);\n__webpack_require__(7);\n\nforge.mgf = forge.mgf || {};\nvar mgf1 = module.exports = forge.mgf.mgf1 = forge.mgf1 = forge.mgf1 || {};\n\n/**\n * Creates a MGF1 mask generation function object.\n *\n * @param md the message digest API to use (eg: forge.md.sha1.create()).\n *\n * @return a mask generation function object.\n */\nmgf1.create = function(md) {\n  var mgf = {\n    /**\n     * Generate mask of specified length.\n     *\n     * @param {String} seed The seed for mask generation.\n     * @param maskLen Number of bytes to generate.\n     * @return {String} The generated mask.\n     */\n    generate: function(seed, maskLen) {\n      /* 2. Let T be the empty octet string. */\n      var t = new forge.util.ByteBuffer();\n\n      /* 3. For counter from 0 to ceil(maskLen / hLen), do the following: */\n      var len = Math.ceil(maskLen / md.digestLength);\n      for(var i = 0; i < len; i++) {\n        /* a. Convert counter to an octet string C of length 4 octets */\n        var c = new forge.util.ByteBuffer();\n        c.putInt32(i);\n\n        /* b. Concatenate the hash of the seed mgfSeed and C to the octet\n         * string T: */\n        md.start();\n        md.update(seed + c.getBytes());\n        t.putBuffer(md.digest());\n      }\n\n      /* Output the leading maskLen octets of T as the octet string mask. */\n      t.truncate(t.length() - maskLen);\n      return t.getBytes();\n    }\n  };\n\n  return mgf;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODkuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbm9kZS1mb3JnZS9saWIvbWdmMS5qcz80NTk1Il0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogSmF2YXNjcmlwdCBpbXBsZW1lbnRhdGlvbiBvZiBtYXNrIGdlbmVyYXRpb24gZnVuY3Rpb24gTUdGMS5cbiAqXG4gKiBAYXV0aG9yIFN0ZWZhbiBTaWVnbFxuICogQGF1dGhvciBEYXZlIExvbmdsZXlcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTIgU3RlZmFuIFNpZWdsIDxzdGVzaWVAYnJva2VucGlwZS5kZT5cbiAqIENvcHlyaWdodCAoYykgMjAxNCBEaWdpdGFsIEJhemFhciwgSW5jLlxuICovXG52YXIgZm9yZ2UgPSByZXF1aXJlKCcuL2ZvcmdlJyk7XG5yZXF1aXJlKCcuL3V0aWwnKTtcblxuZm9yZ2UubWdmID0gZm9yZ2UubWdmIHx8IHt9O1xudmFyIG1nZjEgPSBtb2R1bGUuZXhwb3J0cyA9IGZvcmdlLm1nZi5tZ2YxID0gZm9yZ2UubWdmMSA9IGZvcmdlLm1nZjEgfHwge307XG5cbi8qKlxuICogQ3JlYXRlcyBhIE1HRjEgbWFzayBnZW5lcmF0aW9uIGZ1bmN0aW9uIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0gbWQgdGhlIG1lc3NhZ2UgZGlnZXN0IEFQSSB0byB1c2UgKGVnOiBmb3JnZS5tZC5zaGExLmNyZWF0ZSgpKS5cbiAqXG4gKiBAcmV0dXJuIGEgbWFzayBnZW5lcmF0aW9uIGZ1bmN0aW9uIG9iamVjdC5cbiAqL1xubWdmMS5jcmVhdGUgPSBmdW5jdGlvbihtZCkge1xuICB2YXIgbWdmID0ge1xuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlIG1hc2sgb2Ygc3BlY2lmaWVkIGxlbmd0aC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzZWVkIFRoZSBzZWVkIGZvciBtYXNrIGdlbmVyYXRpb24uXG4gICAgICogQHBhcmFtIG1hc2tMZW4gTnVtYmVyIG9mIGJ5dGVzIHRvIGdlbmVyYXRlLlxuICAgICAqIEByZXR1cm4ge1N0cmluZ30gVGhlIGdlbmVyYXRlZCBtYXNrLlxuICAgICAqL1xuICAgIGdlbmVyYXRlOiBmdW5jdGlvbihzZWVkLCBtYXNrTGVuKSB7XG4gICAgICAvKiAyLiBMZXQgVCBiZSB0aGUgZW1wdHkgb2N0ZXQgc3RyaW5nLiAqL1xuICAgICAgdmFyIHQgPSBuZXcgZm9yZ2UudXRpbC5CeXRlQnVmZmVyKCk7XG5cbiAgICAgIC8qIDMuIEZvciBjb3VudGVyIGZyb20gMCB0byBjZWlsKG1hc2tMZW4gLyBoTGVuKSwgZG8gdGhlIGZvbGxvd2luZzogKi9cbiAgICAgIHZhciBsZW4gPSBNYXRoLmNlaWwobWFza0xlbiAvIG1kLmRpZ2VzdExlbmd0aCk7XG4gICAgICBmb3IodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgLyogYS4gQ29udmVydCBjb3VudGVyIHRvIGFuIG9jdGV0IHN0cmluZyBDIG9mIGxlbmd0aCA0IG9jdGV0cyAqL1xuICAgICAgICB2YXIgYyA9IG5ldyBmb3JnZS51dGlsLkJ5dGVCdWZmZXIoKTtcbiAgICAgICAgYy5wdXRJbnQzMihpKTtcblxuICAgICAgICAvKiBiLiBDb25jYXRlbmF0ZSB0aGUgaGFzaCBvZiB0aGUgc2VlZCBtZ2ZTZWVkIGFuZCBDIHRvIHRoZSBvY3RldFxuICAgICAgICAgKiBzdHJpbmcgVDogKi9cbiAgICAgICAgbWQuc3RhcnQoKTtcbiAgICAgICAgbWQudXBkYXRlKHNlZWQgKyBjLmdldEJ5dGVzKCkpO1xuICAgICAgICB0LnB1dEJ1ZmZlcihtZC5kaWdlc3QoKSk7XG4gICAgICB9XG5cbiAgICAgIC8qIE91dHB1dCB0aGUgbGVhZGluZyBtYXNrTGVuIG9jdGV0cyBvZiBUIGFzIHRoZSBvY3RldCBzdHJpbmcgbWFzay4gKi9cbiAgICAgIHQudHJ1bmNhdGUodC5sZW5ndGgoKSAtIG1hc2tMZW4pO1xuICAgICAgcmV0dXJuIHQuZ2V0Qnl0ZXMoKTtcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIG1nZjtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///89\n")},function(module,exports,__webpack_require__){eval("/**\n * Secure Hash Algorithm with a 1024-bit block size implementation.\n *\n * This includes: SHA-512, SHA-384, SHA-512/224, and SHA-512/256. For\n * SHA-256 (block size 512 bits), see sha256.js.\n *\n * See FIPS 180-4 for details.\n *\n * @author Dave Longley\n *\n * Copyright (c) 2014-2015 Digital Bazaar, Inc.\n */\nvar forge = __webpack_require__(4);\n__webpack_require__(17);\n__webpack_require__(7);\n\nvar sha512 = module.exports = forge.sha512 = forge.sha512 || {};\n\n// SHA-512\nforge.md.sha512 = forge.md.algorithms.sha512 = sha512;\n\n// SHA-384\nvar sha384 = forge.sha384 = forge.sha512.sha384 = forge.sha512.sha384 || {};\nsha384.create = function() {\n  return sha512.create('SHA-384');\n};\nforge.md.sha384 = forge.md.algorithms.sha384 = sha384;\n\n// SHA-512/256\nforge.sha512.sha256 = forge.sha512.sha256 || {\n  create: function() {\n    return sha512.create('SHA-512/256');\n  }\n};\nforge.md['sha512/256'] = forge.md.algorithms['sha512/256'] =\n  forge.sha512.sha256;\n\n// SHA-512/224\nforge.sha512.sha224 = forge.sha512.sha224 || {\n  create: function() {\n    return sha512.create('SHA-512/224');\n  }\n};\nforge.md['sha512/224'] = forge.md.algorithms['sha512/224'] =\n  forge.sha512.sha224;\n\n/**\n * Creates a SHA-2 message digest object.\n *\n * @param algorithm the algorithm to use (SHA-512, SHA-384, SHA-512/224,\n *          SHA-512/256).\n *\n * @return a message digest object.\n */\nsha512.create = function(algorithm) {\n  // do initialization as necessary\n  if(!_initialized) {\n    _init();\n  }\n\n  if(typeof algorithm === 'undefined') {\n    algorithm = 'SHA-512';\n  }\n\n  if(!(algorithm in _states)) {\n    throw new Error('Invalid SHA-512 algorithm: ' + algorithm);\n  }\n\n  // SHA-512 state contains eight 64-bit integers (each as two 32-bit ints)\n  var _state = _states[algorithm];\n  var _h = null;\n\n  // input buffer\n  var _input = forge.util.createBuffer();\n\n  // used for 64-bit word storage\n  var _w = new Array(80);\n  for(var wi = 0; wi < 80; ++wi) {\n    _w[wi] = new Array(2);\n  }\n\n  // determine digest length by algorithm name (default)\n  var digestLength = 64;\n  switch(algorithm) {\n    case 'SHA-384':\n      digestLength = 48;\n      break;\n    case 'SHA-512/256':\n      digestLength = 32;\n      break;\n    case 'SHA-512/224':\n      digestLength = 28;\n      break;\n  }\n\n  // message digest object\n  var md = {\n    // SHA-512 => sha512\n    algorithm: algorithm.replace('-', '').toLowerCase(),\n    blockLength: 128,\n    digestLength: digestLength,\n    // 56-bit length of message so far (does not including padding)\n    messageLength: 0,\n    // true message length\n    fullMessageLength: null,\n    // size of message length in bytes\n    messageLengthSize: 16\n  };\n\n  /**\n   * Starts the digest.\n   *\n   * @return this digest object.\n   */\n  md.start = function() {\n    // up to 56-bit message length for convenience\n    md.messageLength = 0;\n\n    // full message length (set md.messageLength128 for backwards-compatibility)\n    md.fullMessageLength = md.messageLength128 = [];\n    var int32s = md.messageLengthSize / 4;\n    for(var i = 0; i < int32s; ++i) {\n      md.fullMessageLength.push(0);\n    }\n    _input = forge.util.createBuffer();\n    _h = new Array(_state.length);\n    for(var i = 0; i < _state.length; ++i) {\n      _h[i] = _state[i].slice(0);\n    }\n    return md;\n  };\n  // start digest automatically for first time\n  md.start();\n\n  /**\n   * Updates the digest with the given message input. The given input can\n   * treated as raw input (no encoding will be applied) or an encoding of\n   * 'utf8' maybe given to encode the input using UTF-8.\n   *\n   * @param msg the message input to update with.\n   * @param encoding the encoding to use (default: 'raw', other: 'utf8').\n   *\n   * @return this digest object.\n   */\n  md.update = function(msg, encoding) {\n    if(encoding === 'utf8') {\n      msg = forge.util.encodeUtf8(msg);\n    }\n\n    // update message length\n    var len = msg.length;\n    md.messageLength += len;\n    len = [(len / 0x100000000) >>> 0, len >>> 0];\n    for(var i = md.fullMessageLength.length - 1; i >= 0; --i) {\n      md.fullMessageLength[i] += len[1];\n      len[1] = len[0] + ((md.fullMessageLength[i] / 0x100000000) >>> 0);\n      md.fullMessageLength[i] = md.fullMessageLength[i] >>> 0;\n      len[0] = ((len[1] / 0x100000000) >>> 0);\n    }\n\n    // add bytes to input buffer\n    _input.putBytes(msg);\n\n    // process bytes\n    _update(_h, _w, _input);\n\n    // compact input buffer every 2K or if empty\n    if(_input.read > 2048 || _input.length() === 0) {\n      _input.compact();\n    }\n\n    return md;\n  };\n\n  /**\n   * Produces the digest.\n   *\n   * @return a byte buffer containing the digest value.\n   */\n  md.digest = function() {\n    /* Note: Here we copy the remaining bytes in the input buffer and\n    add the appropriate SHA-512 padding. Then we do the final update\n    on a copy of the state so that if the user wants to get\n    intermediate digests they can do so. */\n\n    /* Determine the number of bytes that must be added to the message\n    to ensure its length is congruent to 896 mod 1024. In other words,\n    the data to be digested must be a multiple of 1024 bits (or 128 bytes).\n    This data includes the message, some padding, and the length of the\n    message. Since the length of the message will be encoded as 16 bytes (128\n    bits), that means that the last segment of the data must have 112 bytes\n    (896 bits) of message and padding. Therefore, the length of the message\n    plus the padding must be congruent to 896 mod 1024 because\n    1024 - 128 = 896.\n\n    In order to fill up the message length it must be filled with\n    padding that begins with 1 bit followed by all 0 bits. Padding\n    must *always* be present, so if the message length is already\n    congruent to 896 mod 1024, then 1024 padding bits must be added. */\n\n    var finalBlock = forge.util.createBuffer();\n    finalBlock.putBytes(_input.bytes());\n\n    // compute remaining size to be digested (include message length size)\n    var remaining = (\n      md.fullMessageLength[md.fullMessageLength.length - 1] +\n      md.messageLengthSize);\n\n    // add padding for overflow blockSize - overflow\n    // _padding starts with 1 byte with first bit is set (byte value 128), then\n    // there may be up to (blockSize - 1) other pad bytes\n    var overflow = remaining & (md.blockLength - 1);\n    finalBlock.putBytes(_padding.substr(0, md.blockLength - overflow));\n\n    // serialize message length in bits in big-endian order; since length\n    // is stored in bytes we multiply by 8 and add carry from next int\n    var next, carry;\n    var bits = md.fullMessageLength[0] * 8;\n    for(var i = 0; i < md.fullMessageLength.length - 1; ++i) {\n      next = md.fullMessageLength[i + 1] * 8;\n      carry = (next / 0x100000000) >>> 0;\n      bits += carry;\n      finalBlock.putInt32(bits >>> 0);\n      bits = next >>> 0;\n    }\n    finalBlock.putInt32(bits);\n\n    var h = new Array(_h.length);\n    for(var i = 0; i < _h.length; ++i) {\n      h[i] = _h[i].slice(0);\n    }\n    _update(h, _w, finalBlock);\n    var rval = forge.util.createBuffer();\n    var hlen;\n    if(algorithm === 'SHA-512') {\n      hlen = h.length;\n    } else if(algorithm === 'SHA-384') {\n      hlen = h.length - 2;\n    } else {\n      hlen = h.length - 4;\n    }\n    for(var i = 0; i < hlen; ++i) {\n      rval.putInt32(h[i][0]);\n      if(i !== hlen - 1 || algorithm !== 'SHA-512/224') {\n        rval.putInt32(h[i][1]);\n      }\n    }\n    return rval;\n  };\n\n  return md;\n};\n\n// sha-512 padding bytes not initialized yet\nvar _padding = null;\nvar _initialized = false;\n\n// table of constants\nvar _k = null;\n\n// initial hash states\nvar _states = null;\n\n/**\n * Initializes the constant tables.\n */\nfunction _init() {\n  // create padding\n  _padding = String.fromCharCode(128);\n  _padding += forge.util.fillString(String.fromCharCode(0x00), 128);\n\n  // create K table for SHA-512\n  _k = [\n    [0x428a2f98, 0xd728ae22], [0x71374491, 0x23ef65cd],\n    [0xb5c0fbcf, 0xec4d3b2f], [0xe9b5dba5, 0x8189dbbc],\n    [0x3956c25b, 0xf348b538], [0x59f111f1, 0xb605d019],\n    [0x923f82a4, 0xaf194f9b], [0xab1c5ed5, 0xda6d8118],\n    [0xd807aa98, 0xa3030242], [0x12835b01, 0x45706fbe],\n    [0x243185be, 0x4ee4b28c], [0x550c7dc3, 0xd5ffb4e2],\n    [0x72be5d74, 0xf27b896f], [0x80deb1fe, 0x3b1696b1],\n    [0x9bdc06a7, 0x25c71235], [0xc19bf174, 0xcf692694],\n    [0xe49b69c1, 0x9ef14ad2], [0xefbe4786, 0x384f25e3],\n    [0x0fc19dc6, 0x8b8cd5b5], [0x240ca1cc, 0x77ac9c65],\n    [0x2de92c6f, 0x592b0275], [0x4a7484aa, 0x6ea6e483],\n    [0x5cb0a9dc, 0xbd41fbd4], [0x76f988da, 0x831153b5],\n    [0x983e5152, 0xee66dfab], [0xa831c66d, 0x2db43210],\n    [0xb00327c8, 0x98fb213f], [0xbf597fc7, 0xbeef0ee4],\n    [0xc6e00bf3, 0x3da88fc2], [0xd5a79147, 0x930aa725],\n    [0x06ca6351, 0xe003826f], [0x14292967, 0x0a0e6e70],\n    [0x27b70a85, 0x46d22ffc], [0x2e1b2138, 0x5c26c926],\n    [0x4d2c6dfc, 0x5ac42aed], [0x53380d13, 0x9d95b3df],\n    [0x650a7354, 0x8baf63de], [0x766a0abb, 0x3c77b2a8],\n    [0x81c2c92e, 0x47edaee6], [0x92722c85, 0x1482353b],\n    [0xa2bfe8a1, 0x4cf10364], [0xa81a664b, 0xbc423001],\n    [0xc24b8b70, 0xd0f89791], [0xc76c51a3, 0x0654be30],\n    [0xd192e819, 0xd6ef5218], [0xd6990624, 0x5565a910],\n    [0xf40e3585, 0x5771202a], [0x106aa070, 0x32bbd1b8],\n    [0x19a4c116, 0xb8d2d0c8], [0x1e376c08, 0x5141ab53],\n    [0x2748774c, 0xdf8eeb99], [0x34b0bcb5, 0xe19b48a8],\n    [0x391c0cb3, 0xc5c95a63], [0x4ed8aa4a, 0xe3418acb],\n    [0x5b9cca4f, 0x7763e373], [0x682e6ff3, 0xd6b2b8a3],\n    [0x748f82ee, 0x5defb2fc], [0x78a5636f, 0x43172f60],\n    [0x84c87814, 0xa1f0ab72], [0x8cc70208, 0x1a6439ec],\n    [0x90befffa, 0x23631e28], [0xa4506ceb, 0xde82bde9],\n    [0xbef9a3f7, 0xb2c67915], [0xc67178f2, 0xe372532b],\n    [0xca273ece, 0xea26619c], [0xd186b8c7, 0x21c0c207],\n    [0xeada7dd6, 0xcde0eb1e], [0xf57d4f7f, 0xee6ed178],\n    [0x06f067aa, 0x72176fba], [0x0a637dc5, 0xa2c898a6],\n    [0x113f9804, 0xbef90dae], [0x1b710b35, 0x131c471b],\n    [0x28db77f5, 0x23047d84], [0x32caab7b, 0x40c72493],\n    [0x3c9ebe0a, 0x15c9bebc], [0x431d67c4, 0x9c100d4c],\n    [0x4cc5d4be, 0xcb3e42b6], [0x597f299c, 0xfc657e2a],\n    [0x5fcb6fab, 0x3ad6faec], [0x6c44198c, 0x4a475817]\n  ];\n\n  // initial hash states\n  _states = {};\n  _states['SHA-512'] = [\n    [0x6a09e667, 0xf3bcc908],\n    [0xbb67ae85, 0x84caa73b],\n    [0x3c6ef372, 0xfe94f82b],\n    [0xa54ff53a, 0x5f1d36f1],\n    [0x510e527f, 0xade682d1],\n    [0x9b05688c, 0x2b3e6c1f],\n    [0x1f83d9ab, 0xfb41bd6b],\n    [0x5be0cd19, 0x137e2179]\n  ];\n  _states['SHA-384'] = [\n    [0xcbbb9d5d, 0xc1059ed8],\n    [0x629a292a, 0x367cd507],\n    [0x9159015a, 0x3070dd17],\n    [0x152fecd8, 0xf70e5939],\n    [0x67332667, 0xffc00b31],\n    [0x8eb44a87, 0x68581511],\n    [0xdb0c2e0d, 0x64f98fa7],\n    [0x47b5481d, 0xbefa4fa4]\n  ];\n  _states['SHA-512/256'] = [\n    [0x22312194, 0xFC2BF72C],\n    [0x9F555FA3, 0xC84C64C2],\n    [0x2393B86B, 0x6F53B151],\n    [0x96387719, 0x5940EABD],\n    [0x96283EE2, 0xA88EFFE3],\n    [0xBE5E1E25, 0x53863992],\n    [0x2B0199FC, 0x2C85B8AA],\n    [0x0EB72DDC, 0x81C52CA2]\n  ];\n  _states['SHA-512/224'] = [\n    [0x8C3D37C8, 0x19544DA2],\n    [0x73E19966, 0x89DCD4D6],\n    [0x1DFAB7AE, 0x32FF9C82],\n    [0x679DD514, 0x582F9FCF],\n    [0x0F6D2B69, 0x7BD44DA8],\n    [0x77E36F73, 0x04C48942],\n    [0x3F9D85A8, 0x6A1D36C8],\n    [0x1112E6AD, 0x91D692A1]\n  ];\n\n  // now initialized\n  _initialized = true;\n}\n\n/**\n * Updates a SHA-512 state with the given byte buffer.\n *\n * @param s the SHA-512 state to update.\n * @param w the array to use to store words.\n * @param bytes the byte buffer to update with.\n */\nfunction _update(s, w, bytes) {\n  // consume 512 bit (128 byte) chunks\n  var t1_hi, t1_lo;\n  var t2_hi, t2_lo;\n  var s0_hi, s0_lo;\n  var s1_hi, s1_lo;\n  var ch_hi, ch_lo;\n  var maj_hi, maj_lo;\n  var a_hi, a_lo;\n  var b_hi, b_lo;\n  var c_hi, c_lo;\n  var d_hi, d_lo;\n  var e_hi, e_lo;\n  var f_hi, f_lo;\n  var g_hi, g_lo;\n  var h_hi, h_lo;\n  var i, hi, lo, w2, w7, w15, w16;\n  var len = bytes.length();\n  while(len >= 128) {\n    // the w array will be populated with sixteen 64-bit big-endian words\n    // and then extended into 64 64-bit words according to SHA-512\n    for(i = 0; i < 16; ++i) {\n      w[i][0] = bytes.getInt32() >>> 0;\n      w[i][1] = bytes.getInt32() >>> 0;\n    }\n    for(; i < 80; ++i) {\n      // for word 2 words ago: ROTR 19(x) ^ ROTR 61(x) ^ SHR 6(x)\n      w2 = w[i - 2];\n      hi = w2[0];\n      lo = w2[1];\n\n      // high bits\n      t1_hi = (\n        ((hi >>> 19) | (lo << 13)) ^ // ROTR 19\n        ((lo >>> 29) | (hi << 3)) ^ // ROTR 61/(swap + ROTR 29)\n        (hi >>> 6)) >>> 0; // SHR 6\n      // low bits\n      t1_lo = (\n        ((hi << 13) | (lo >>> 19)) ^ // ROTR 19\n        ((lo << 3) | (hi >>> 29)) ^ // ROTR 61/(swap + ROTR 29)\n        ((hi << 26) | (lo >>> 6))) >>> 0; // SHR 6\n\n      // for word 15 words ago: ROTR 1(x) ^ ROTR 8(x) ^ SHR 7(x)\n      w15 = w[i - 15];\n      hi = w15[0];\n      lo = w15[1];\n\n      // high bits\n      t2_hi = (\n        ((hi >>> 1) | (lo << 31)) ^ // ROTR 1\n        ((hi >>> 8) | (lo << 24)) ^ // ROTR 8\n        (hi >>> 7)) >>> 0; // SHR 7\n      // low bits\n      t2_lo = (\n        ((hi << 31) | (lo >>> 1)) ^ // ROTR 1\n        ((hi << 24) | (lo >>> 8)) ^ // ROTR 8\n        ((hi << 25) | (lo >>> 7))) >>> 0; // SHR 7\n\n      // sum(t1, word 7 ago, t2, word 16 ago) modulo 2^64 (carry lo overflow)\n      w7 = w[i - 7];\n      w16 = w[i - 16];\n      lo = (t1_lo + w7[1] + t2_lo + w16[1]);\n      w[i][0] = (t1_hi + w7[0] + t2_hi + w16[0] +\n        ((lo / 0x100000000) >>> 0)) >>> 0;\n      w[i][1] = lo >>> 0;\n    }\n\n    // initialize hash value for this chunk\n    a_hi = s[0][0];\n    a_lo = s[0][1];\n    b_hi = s[1][0];\n    b_lo = s[1][1];\n    c_hi = s[2][0];\n    c_lo = s[2][1];\n    d_hi = s[3][0];\n    d_lo = s[3][1];\n    e_hi = s[4][0];\n    e_lo = s[4][1];\n    f_hi = s[5][0];\n    f_lo = s[5][1];\n    g_hi = s[6][0];\n    g_lo = s[6][1];\n    h_hi = s[7][0];\n    h_lo = s[7][1];\n\n    // round function\n    for(i = 0; i < 80; ++i) {\n      // Sum1(e) = ROTR 14(e) ^ ROTR 18(e) ^ ROTR 41(e)\n      s1_hi = (\n        ((e_hi >>> 14) | (e_lo << 18)) ^ // ROTR 14\n        ((e_hi >>> 18) | (e_lo << 14)) ^ // ROTR 18\n        ((e_lo >>> 9) | (e_hi << 23))) >>> 0; // ROTR 41/(swap + ROTR 9)\n      s1_lo = (\n        ((e_hi << 18) | (e_lo >>> 14)) ^ // ROTR 14\n        ((e_hi << 14) | (e_lo >>> 18)) ^ // ROTR 18\n        ((e_lo << 23) | (e_hi >>> 9))) >>> 0; // ROTR 41/(swap + ROTR 9)\n\n      // Ch(e, f, g) (optimized the same way as SHA-1)\n      ch_hi = (g_hi ^ (e_hi & (f_hi ^ g_hi))) >>> 0;\n      ch_lo = (g_lo ^ (e_lo & (f_lo ^ g_lo))) >>> 0;\n\n      // Sum0(a) = ROTR 28(a) ^ ROTR 34(a) ^ ROTR 39(a)\n      s0_hi = (\n        ((a_hi >>> 28) | (a_lo << 4)) ^ // ROTR 28\n        ((a_lo >>> 2) | (a_hi << 30)) ^ // ROTR 34/(swap + ROTR 2)\n        ((a_lo >>> 7) | (a_hi << 25))) >>> 0; // ROTR 39/(swap + ROTR 7)\n      s0_lo = (\n        ((a_hi << 4) | (a_lo >>> 28)) ^ // ROTR 28\n        ((a_lo << 30) | (a_hi >>> 2)) ^ // ROTR 34/(swap + ROTR 2)\n        ((a_lo << 25) | (a_hi >>> 7))) >>> 0; // ROTR 39/(swap + ROTR 7)\n\n      // Maj(a, b, c) (optimized the same way as SHA-1)\n      maj_hi = ((a_hi & b_hi) | (c_hi & (a_hi ^ b_hi))) >>> 0;\n      maj_lo = ((a_lo & b_lo) | (c_lo & (a_lo ^ b_lo))) >>> 0;\n\n      // main algorithm\n      // t1 = (h + s1 + ch + _k[i] + _w[i]) modulo 2^64 (carry lo overflow)\n      lo = (h_lo + s1_lo + ch_lo + _k[i][1] + w[i][1]);\n      t1_hi = (h_hi + s1_hi + ch_hi + _k[i][0] + w[i][0] +\n        ((lo / 0x100000000) >>> 0)) >>> 0;\n      t1_lo = lo >>> 0;\n\n      // t2 = s0 + maj modulo 2^64 (carry lo overflow)\n      lo = s0_lo + maj_lo;\n      t2_hi = (s0_hi + maj_hi + ((lo / 0x100000000) >>> 0)) >>> 0;\n      t2_lo = lo >>> 0;\n\n      h_hi = g_hi;\n      h_lo = g_lo;\n\n      g_hi = f_hi;\n      g_lo = f_lo;\n\n      f_hi = e_hi;\n      f_lo = e_lo;\n\n      // e = (d + t1) modulo 2^64 (carry lo overflow)\n      lo = d_lo + t1_lo;\n      e_hi = (d_hi + t1_hi + ((lo / 0x100000000) >>> 0)) >>> 0;\n      e_lo = lo >>> 0;\n\n      d_hi = c_hi;\n      d_lo = c_lo;\n\n      c_hi = b_hi;\n      c_lo = b_lo;\n\n      b_hi = a_hi;\n      b_lo = a_lo;\n\n      // a = (t1 + t2) modulo 2^64 (carry lo overflow)\n      lo = t1_lo + t2_lo;\n      a_hi = (t1_hi + t2_hi + ((lo / 0x100000000) >>> 0)) >>> 0;\n      a_lo = lo >>> 0;\n    }\n\n    // update hash state (additional modulo 2^64)\n    lo = s[0][1] + a_lo;\n    s[0][0] = (s[0][0] + a_hi + ((lo / 0x100000000) >>> 0)) >>> 0;\n    s[0][1] = lo >>> 0;\n\n    lo = s[1][1] + b_lo;\n    s[1][0] = (s[1][0] + b_hi + ((lo / 0x100000000) >>> 0)) >>> 0;\n    s[1][1] = lo >>> 0;\n\n    lo = s[2][1] + c_lo;\n    s[2][0] = (s[2][0] + c_hi + ((lo / 0x100000000) >>> 0)) >>> 0;\n    s[2][1] = lo >>> 0;\n\n    lo = s[3][1] + d_lo;\n    s[3][0] = (s[3][0] + d_hi + ((lo / 0x100000000) >>> 0)) >>> 0;\n    s[3][1] = lo >>> 0;\n\n    lo = s[4][1] + e_lo;\n    s[4][0] = (s[4][0] + e_hi + ((lo / 0x100000000) >>> 0)) >>> 0;\n    s[4][1] = lo >>> 0;\n\n    lo = s[5][1] + f_lo;\n    s[5][0] = (s[5][0] + f_hi + ((lo / 0x100000000) >>> 0)) >>> 0;\n    s[5][1] = lo >>> 0;\n\n    lo = s[6][1] + g_lo;\n    s[6][0] = (s[6][0] + g_hi + ((lo / 0x100000000) >>> 0)) >>> 0;\n    s[6][1] = lo >>> 0;\n\n    lo = s[7][1] + h_lo;\n    s[7][0] = (s[7][0] + h_hi + ((lo / 0x100000000) >>> 0)) >>> 0;\n    s[7][1] = lo >>> 0;\n\n    len -= 128;\n  }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTAuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbm9kZS1mb3JnZS9saWIvc2hhNTEyLmpzPzUzMWUiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBTZWN1cmUgSGFzaCBBbGdvcml0aG0gd2l0aCBhIDEwMjQtYml0IGJsb2NrIHNpemUgaW1wbGVtZW50YXRpb24uXG4gKlxuICogVGhpcyBpbmNsdWRlczogU0hBLTUxMiwgU0hBLTM4NCwgU0hBLTUxMi8yMjQsIGFuZCBTSEEtNTEyLzI1Ni4gRm9yXG4gKiBTSEEtMjU2IChibG9jayBzaXplIDUxMiBiaXRzKSwgc2VlIHNoYTI1Ni5qcy5cbiAqXG4gKiBTZWUgRklQUyAxODAtNCBmb3IgZGV0YWlscy5cbiAqXG4gKiBAYXV0aG9yIERhdmUgTG9uZ2xleVxuICpcbiAqIENvcHlyaWdodCAoYykgMjAxNC0yMDE1IERpZ2l0YWwgQmF6YWFyLCBJbmMuXG4gKi9cbnZhciBmb3JnZSA9IHJlcXVpcmUoJy4vZm9yZ2UnKTtcbnJlcXVpcmUoJy4vbWQnKTtcbnJlcXVpcmUoJy4vdXRpbCcpO1xuXG52YXIgc2hhNTEyID0gbW9kdWxlLmV4cG9ydHMgPSBmb3JnZS5zaGE1MTIgPSBmb3JnZS5zaGE1MTIgfHwge307XG5cbi8vIFNIQS01MTJcbmZvcmdlLm1kLnNoYTUxMiA9IGZvcmdlLm1kLmFsZ29yaXRobXMuc2hhNTEyID0gc2hhNTEyO1xuXG4vLyBTSEEtMzg0XG52YXIgc2hhMzg0ID0gZm9yZ2Uuc2hhMzg0ID0gZm9yZ2Uuc2hhNTEyLnNoYTM4NCA9IGZvcmdlLnNoYTUxMi5zaGEzODQgfHwge307XG5zaGEzODQuY3JlYXRlID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBzaGE1MTIuY3JlYXRlKCdTSEEtMzg0Jyk7XG59O1xuZm9yZ2UubWQuc2hhMzg0ID0gZm9yZ2UubWQuYWxnb3JpdGhtcy5zaGEzODQgPSBzaGEzODQ7XG5cbi8vIFNIQS01MTIvMjU2XG5mb3JnZS5zaGE1MTIuc2hhMjU2ID0gZm9yZ2Uuc2hhNTEyLnNoYTI1NiB8fCB7XG4gIGNyZWF0ZTogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHNoYTUxMi5jcmVhdGUoJ1NIQS01MTIvMjU2Jyk7XG4gIH1cbn07XG5mb3JnZS5tZFsnc2hhNTEyLzI1NiddID0gZm9yZ2UubWQuYWxnb3JpdGhtc1snc2hhNTEyLzI1NiddID1cbiAgZm9yZ2Uuc2hhNTEyLnNoYTI1NjtcblxuLy8gU0hBLTUxMi8yMjRcbmZvcmdlLnNoYTUxMi5zaGEyMjQgPSBmb3JnZS5zaGE1MTIuc2hhMjI0IHx8IHtcbiAgY3JlYXRlOiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gc2hhNTEyLmNyZWF0ZSgnU0hBLTUxMi8yMjQnKTtcbiAgfVxufTtcbmZvcmdlLm1kWydzaGE1MTIvMjI0J10gPSBmb3JnZS5tZC5hbGdvcml0aG1zWydzaGE1MTIvMjI0J10gPVxuICBmb3JnZS5zaGE1MTIuc2hhMjI0O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBTSEEtMiBtZXNzYWdlIGRpZ2VzdCBvYmplY3QuXG4gKlxuICogQHBhcmFtIGFsZ29yaXRobSB0aGUgYWxnb3JpdGhtIHRvIHVzZSAoU0hBLTUxMiwgU0hBLTM4NCwgU0hBLTUxMi8yMjQsXG4gKiAgICAgICAgICBTSEEtNTEyLzI1NikuXG4gKlxuICogQHJldHVybiBhIG1lc3NhZ2UgZGlnZXN0IG9iamVjdC5cbiAqL1xuc2hhNTEyLmNyZWF0ZSA9IGZ1bmN0aW9uKGFsZ29yaXRobSkge1xuICAvLyBkbyBpbml0aWFsaXphdGlvbiBhcyBuZWNlc3NhcnlcbiAgaWYoIV9pbml0aWFsaXplZCkge1xuICAgIF9pbml0KCk7XG4gIH1cblxuICBpZih0eXBlb2YgYWxnb3JpdGhtID09PSAndW5kZWZpbmVkJykge1xuICAgIGFsZ29yaXRobSA9ICdTSEEtNTEyJztcbiAgfVxuXG4gIGlmKCEoYWxnb3JpdGhtIGluIF9zdGF0ZXMpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIFNIQS01MTIgYWxnb3JpdGhtOiAnICsgYWxnb3JpdGhtKTtcbiAgfVxuXG4gIC8vIFNIQS01MTIgc3RhdGUgY29udGFpbnMgZWlnaHQgNjQtYml0IGludGVnZXJzIChlYWNoIGFzIHR3byAzMi1iaXQgaW50cylcbiAgdmFyIF9zdGF0ZSA9IF9zdGF0ZXNbYWxnb3JpdGhtXTtcbiAgdmFyIF9oID0gbnVsbDtcblxuICAvLyBpbnB1dCBidWZmZXJcbiAgdmFyIF9pbnB1dCA9IGZvcmdlLnV0aWwuY3JlYXRlQnVmZmVyKCk7XG5cbiAgLy8gdXNlZCBmb3IgNjQtYml0IHdvcmQgc3RvcmFnZVxuICB2YXIgX3cgPSBuZXcgQXJyYXkoODApO1xuICBmb3IodmFyIHdpID0gMDsgd2kgPCA4MDsgKyt3aSkge1xuICAgIF93W3dpXSA9IG5ldyBBcnJheSgyKTtcbiAgfVxuXG4gIC8vIGRldGVybWluZSBkaWdlc3QgbGVuZ3RoIGJ5IGFsZ29yaXRobSBuYW1lIChkZWZhdWx0KVxuICB2YXIgZGlnZXN0TGVuZ3RoID0gNjQ7XG4gIHN3aXRjaChhbGdvcml0aG0pIHtcbiAgICBjYXNlICdTSEEtMzg0JzpcbiAgICAgIGRpZ2VzdExlbmd0aCA9IDQ4O1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnU0hBLTUxMi8yNTYnOlxuICAgICAgZGlnZXN0TGVuZ3RoID0gMzI7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdTSEEtNTEyLzIyNCc6XG4gICAgICBkaWdlc3RMZW5ndGggPSAyODtcbiAgICAgIGJyZWFrO1xuICB9XG5cbiAgLy8gbWVzc2FnZSBkaWdlc3Qgb2JqZWN0XG4gIHZhciBtZCA9IHtcbiAgICAvLyBTSEEtNTEyID0+IHNoYTUxMlxuICAgIGFsZ29yaXRobTogYWxnb3JpdGhtLnJlcGxhY2UoJy0nLCAnJykudG9Mb3dlckNhc2UoKSxcbiAgICBibG9ja0xlbmd0aDogMTI4LFxuICAgIGRpZ2VzdExlbmd0aDogZGlnZXN0TGVuZ3RoLFxuICAgIC8vIDU2LWJpdCBsZW5ndGggb2YgbWVzc2FnZSBzbyBmYXIgKGRvZXMgbm90IGluY2x1ZGluZyBwYWRkaW5nKVxuICAgIG1lc3NhZ2VMZW5ndGg6IDAsXG4gICAgLy8gdHJ1ZSBtZXNzYWdlIGxlbmd0aFxuICAgIGZ1bGxNZXNzYWdlTGVuZ3RoOiBudWxsLFxuICAgIC8vIHNpemUgb2YgbWVzc2FnZSBsZW5ndGggaW4gYnl0ZXNcbiAgICBtZXNzYWdlTGVuZ3RoU2l6ZTogMTZcbiAgfTtcblxuICAvKipcbiAgICogU3RhcnRzIHRoZSBkaWdlc3QuXG4gICAqXG4gICAqIEByZXR1cm4gdGhpcyBkaWdlc3Qgb2JqZWN0LlxuICAgKi9cbiAgbWQuc3RhcnQgPSBmdW5jdGlvbigpIHtcbiAgICAvLyB1cCB0byA1Ni1iaXQgbWVzc2FnZSBsZW5ndGggZm9yIGNvbnZlbmllbmNlXG4gICAgbWQubWVzc2FnZUxlbmd0aCA9IDA7XG5cbiAgICAvLyBmdWxsIG1lc3NhZ2UgbGVuZ3RoIChzZXQgbWQubWVzc2FnZUxlbmd0aDEyOCBmb3IgYmFja3dhcmRzLWNvbXBhdGliaWxpdHkpXG4gICAgbWQuZnVsbE1lc3NhZ2VMZW5ndGggPSBtZC5tZXNzYWdlTGVuZ3RoMTI4ID0gW107XG4gICAgdmFyIGludDMycyA9IG1kLm1lc3NhZ2VMZW5ndGhTaXplIC8gNDtcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgaW50MzJzOyArK2kpIHtcbiAgICAgIG1kLmZ1bGxNZXNzYWdlTGVuZ3RoLnB1c2goMCk7XG4gICAgfVxuICAgIF9pbnB1dCA9IGZvcmdlLnV0aWwuY3JlYXRlQnVmZmVyKCk7XG4gICAgX2ggPSBuZXcgQXJyYXkoX3N0YXRlLmxlbmd0aCk7XG4gICAgZm9yKHZhciBpID0gMDsgaSA8IF9zdGF0ZS5sZW5ndGg7ICsraSkge1xuICAgICAgX2hbaV0gPSBfc3RhdGVbaV0uc2xpY2UoMCk7XG4gICAgfVxuICAgIHJldHVybiBtZDtcbiAgfTtcbiAgLy8gc3RhcnQgZGlnZXN0IGF1dG9tYXRpY2FsbHkgZm9yIGZpcnN0IHRpbWVcbiAgbWQuc3RhcnQoKTtcblxuICAvKipcbiAgICogVXBkYXRlcyB0aGUgZGlnZXN0IHdpdGggdGhlIGdpdmVuIG1lc3NhZ2UgaW5wdXQuIFRoZSBnaXZlbiBpbnB1dCBjYW5cbiAgICogdHJlYXRlZCBhcyByYXcgaW5wdXQgKG5vIGVuY29kaW5nIHdpbGwgYmUgYXBwbGllZCkgb3IgYW4gZW5jb2Rpbmcgb2ZcbiAgICogJ3V0ZjgnIG1heWJlIGdpdmVuIHRvIGVuY29kZSB0aGUgaW5wdXQgdXNpbmcgVVRGLTguXG4gICAqXG4gICAqIEBwYXJhbSBtc2cgdGhlIG1lc3NhZ2UgaW5wdXQgdG8gdXBkYXRlIHdpdGguXG4gICAqIEBwYXJhbSBlbmNvZGluZyB0aGUgZW5jb2RpbmcgdG8gdXNlIChkZWZhdWx0OiAncmF3Jywgb3RoZXI6ICd1dGY4JykuXG4gICAqXG4gICAqIEByZXR1cm4gdGhpcyBkaWdlc3Qgb2JqZWN0LlxuICAgKi9cbiAgbWQudXBkYXRlID0gZnVuY3Rpb24obXNnLCBlbmNvZGluZykge1xuICAgIGlmKGVuY29kaW5nID09PSAndXRmOCcpIHtcbiAgICAgIG1zZyA9IGZvcmdlLnV0aWwuZW5jb2RlVXRmOChtc2cpO1xuICAgIH1cblxuICAgIC8vIHVwZGF0ZSBtZXNzYWdlIGxlbmd0aFxuICAgIHZhciBsZW4gPSBtc2cubGVuZ3RoO1xuICAgIG1kLm1lc3NhZ2VMZW5ndGggKz0gbGVuO1xuICAgIGxlbiA9IFsobGVuIC8gMHgxMDAwMDAwMDApID4+PiAwLCBsZW4gPj4+IDBdO1xuICAgIGZvcih2YXIgaSA9IG1kLmZ1bGxNZXNzYWdlTGVuZ3RoLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICBtZC5mdWxsTWVzc2FnZUxlbmd0aFtpXSArPSBsZW5bMV07XG4gICAgICBsZW5bMV0gPSBsZW5bMF0gKyAoKG1kLmZ1bGxNZXNzYWdlTGVuZ3RoW2ldIC8gMHgxMDAwMDAwMDApID4+PiAwKTtcbiAgICAgIG1kLmZ1bGxNZXNzYWdlTGVuZ3RoW2ldID0gbWQuZnVsbE1lc3NhZ2VMZW5ndGhbaV0gPj4+IDA7XG4gICAgICBsZW5bMF0gPSAoKGxlblsxXSAvIDB4MTAwMDAwMDAwKSA+Pj4gMCk7XG4gICAgfVxuXG4gICAgLy8gYWRkIGJ5dGVzIHRvIGlucHV0IGJ1ZmZlclxuICAgIF9pbnB1dC5wdXRCeXRlcyhtc2cpO1xuXG4gICAgLy8gcHJvY2VzcyBieXRlc1xuICAgIF91cGRhdGUoX2gsIF93LCBfaW5wdXQpO1xuXG4gICAgLy8gY29tcGFjdCBpbnB1dCBidWZmZXIgZXZlcnkgMksgb3IgaWYgZW1wdHlcbiAgICBpZihfaW5wdXQucmVhZCA+IDIwNDggfHwgX2lucHV0Lmxlbmd0aCgpID09PSAwKSB7XG4gICAgICBfaW5wdXQuY29tcGFjdCgpO1xuICAgIH1cblxuICAgIHJldHVybiBtZDtcbiAgfTtcblxuICAvKipcbiAgICogUHJvZHVjZXMgdGhlIGRpZ2VzdC5cbiAgICpcbiAgICogQHJldHVybiBhIGJ5dGUgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIGRpZ2VzdCB2YWx1ZS5cbiAgICovXG4gIG1kLmRpZ2VzdCA9IGZ1bmN0aW9uKCkge1xuICAgIC8qIE5vdGU6IEhlcmUgd2UgY29weSB0aGUgcmVtYWluaW5nIGJ5dGVzIGluIHRoZSBpbnB1dCBidWZmZXIgYW5kXG4gICAgYWRkIHRoZSBhcHByb3ByaWF0ZSBTSEEtNTEyIHBhZGRpbmcuIFRoZW4gd2UgZG8gdGhlIGZpbmFsIHVwZGF0ZVxuICAgIG9uIGEgY29weSBvZiB0aGUgc3RhdGUgc28gdGhhdCBpZiB0aGUgdXNlciB3YW50cyB0byBnZXRcbiAgICBpbnRlcm1lZGlhdGUgZGlnZXN0cyB0aGV5IGNhbiBkbyBzby4gKi9cblxuICAgIC8qIERldGVybWluZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgbXVzdCBiZSBhZGRlZCB0byB0aGUgbWVzc2FnZVxuICAgIHRvIGVuc3VyZSBpdHMgbGVuZ3RoIGlzIGNvbmdydWVudCB0byA4OTYgbW9kIDEwMjQuIEluIG90aGVyIHdvcmRzLFxuICAgIHRoZSBkYXRhIHRvIGJlIGRpZ2VzdGVkIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxMDI0IGJpdHMgKG9yIDEyOCBieXRlcykuXG4gICAgVGhpcyBkYXRhIGluY2x1ZGVzIHRoZSBtZXNzYWdlLCBzb21lIHBhZGRpbmcsIGFuZCB0aGUgbGVuZ3RoIG9mIHRoZVxuICAgIG1lc3NhZ2UuIFNpbmNlIHRoZSBsZW5ndGggb2YgdGhlIG1lc3NhZ2Ugd2lsbCBiZSBlbmNvZGVkIGFzIDE2IGJ5dGVzICgxMjhcbiAgICBiaXRzKSwgdGhhdCBtZWFucyB0aGF0IHRoZSBsYXN0IHNlZ21lbnQgb2YgdGhlIGRhdGEgbXVzdCBoYXZlIDExMiBieXRlc1xuICAgICg4OTYgYml0cykgb2YgbWVzc2FnZSBhbmQgcGFkZGluZy4gVGhlcmVmb3JlLCB0aGUgbGVuZ3RoIG9mIHRoZSBtZXNzYWdlXG4gICAgcGx1cyB0aGUgcGFkZGluZyBtdXN0IGJlIGNvbmdydWVudCB0byA4OTYgbW9kIDEwMjQgYmVjYXVzZVxuICAgIDEwMjQgLSAxMjggPSA4OTYuXG5cbiAgICBJbiBvcmRlciB0byBmaWxsIHVwIHRoZSBtZXNzYWdlIGxlbmd0aCBpdCBtdXN0IGJlIGZpbGxlZCB3aXRoXG4gICAgcGFkZGluZyB0aGF0IGJlZ2lucyB3aXRoIDEgYml0IGZvbGxvd2VkIGJ5IGFsbCAwIGJpdHMuIFBhZGRpbmdcbiAgICBtdXN0ICphbHdheXMqIGJlIHByZXNlbnQsIHNvIGlmIHRoZSBtZXNzYWdlIGxlbmd0aCBpcyBhbHJlYWR5XG4gICAgY29uZ3J1ZW50IHRvIDg5NiBtb2QgMTAyNCwgdGhlbiAxMDI0IHBhZGRpbmcgYml0cyBtdXN0IGJlIGFkZGVkLiAqL1xuXG4gICAgdmFyIGZpbmFsQmxvY2sgPSBmb3JnZS51dGlsLmNyZWF0ZUJ1ZmZlcigpO1xuICAgIGZpbmFsQmxvY2sucHV0Qnl0ZXMoX2lucHV0LmJ5dGVzKCkpO1xuXG4gICAgLy8gY29tcHV0ZSByZW1haW5pbmcgc2l6ZSB0byBiZSBkaWdlc3RlZCAoaW5jbHVkZSBtZXNzYWdlIGxlbmd0aCBzaXplKVxuICAgIHZhciByZW1haW5pbmcgPSAoXG4gICAgICBtZC5mdWxsTWVzc2FnZUxlbmd0aFttZC5mdWxsTWVzc2FnZUxlbmd0aC5sZW5ndGggLSAxXSArXG4gICAgICBtZC5tZXNzYWdlTGVuZ3RoU2l6ZSk7XG5cbiAgICAvLyBhZGQgcGFkZGluZyBmb3Igb3ZlcmZsb3cgYmxvY2tTaXplIC0gb3ZlcmZsb3dcbiAgICAvLyBfcGFkZGluZyBzdGFydHMgd2l0aCAxIGJ5dGUgd2l0aCBmaXJzdCBiaXQgaXMgc2V0IChieXRlIHZhbHVlIDEyOCksIHRoZW5cbiAgICAvLyB0aGVyZSBtYXkgYmUgdXAgdG8gKGJsb2NrU2l6ZSAtIDEpIG90aGVyIHBhZCBieXRlc1xuICAgIHZhciBvdmVyZmxvdyA9IHJlbWFpbmluZyAmIChtZC5ibG9ja0xlbmd0aCAtIDEpO1xuICAgIGZpbmFsQmxvY2sucHV0Qnl0ZXMoX3BhZGRpbmcuc3Vic3RyKDAsIG1kLmJsb2NrTGVuZ3RoIC0gb3ZlcmZsb3cpKTtcblxuICAgIC8vIHNlcmlhbGl6ZSBtZXNzYWdlIGxlbmd0aCBpbiBiaXRzIGluIGJpZy1lbmRpYW4gb3JkZXI7IHNpbmNlIGxlbmd0aFxuICAgIC8vIGlzIHN0b3JlZCBpbiBieXRlcyB3ZSBtdWx0aXBseSBieSA4IGFuZCBhZGQgY2FycnkgZnJvbSBuZXh0IGludFxuICAgIHZhciBuZXh0LCBjYXJyeTtcbiAgICB2YXIgYml0cyA9IG1kLmZ1bGxNZXNzYWdlTGVuZ3RoWzBdICogODtcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgbWQuZnVsbE1lc3NhZ2VMZW5ndGgubGVuZ3RoIC0gMTsgKytpKSB7XG4gICAgICBuZXh0ID0gbWQuZnVsbE1lc3NhZ2VMZW5ndGhbaSArIDFdICogODtcbiAgICAgIGNhcnJ5ID0gKG5leHQgLyAweDEwMDAwMDAwMCkgPj4+IDA7XG4gICAgICBiaXRzICs9IGNhcnJ5O1xuICAgICAgZmluYWxCbG9jay5wdXRJbnQzMihiaXRzID4+PiAwKTtcbiAgICAgIGJpdHMgPSBuZXh0ID4+PiAwO1xuICAgIH1cbiAgICBmaW5hbEJsb2NrLnB1dEludDMyKGJpdHMpO1xuXG4gICAgdmFyIGggPSBuZXcgQXJyYXkoX2gubGVuZ3RoKTtcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgX2gubGVuZ3RoOyArK2kpIHtcbiAgICAgIGhbaV0gPSBfaFtpXS5zbGljZSgwKTtcbiAgICB9XG4gICAgX3VwZGF0ZShoLCBfdywgZmluYWxCbG9jayk7XG4gICAgdmFyIHJ2YWwgPSBmb3JnZS51dGlsLmNyZWF0ZUJ1ZmZlcigpO1xuICAgIHZhciBobGVuO1xuICAgIGlmKGFsZ29yaXRobSA9PT0gJ1NIQS01MTInKSB7XG4gICAgICBobGVuID0gaC5sZW5ndGg7XG4gICAgfSBlbHNlIGlmKGFsZ29yaXRobSA9PT0gJ1NIQS0zODQnKSB7XG4gICAgICBobGVuID0gaC5sZW5ndGggLSAyO1xuICAgIH0gZWxzZSB7XG4gICAgICBobGVuID0gaC5sZW5ndGggLSA0O1xuICAgIH1cbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgaGxlbjsgKytpKSB7XG4gICAgICBydmFsLnB1dEludDMyKGhbaV1bMF0pO1xuICAgICAgaWYoaSAhPT0gaGxlbiAtIDEgfHwgYWxnb3JpdGhtICE9PSAnU0hBLTUxMi8yMjQnKSB7XG4gICAgICAgIHJ2YWwucHV0SW50MzIoaFtpXVsxXSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBydmFsO1xuICB9O1xuXG4gIHJldHVybiBtZDtcbn07XG5cbi8vIHNoYS01MTIgcGFkZGluZyBieXRlcyBub3QgaW5pdGlhbGl6ZWQgeWV0XG52YXIgX3BhZGRpbmcgPSBudWxsO1xudmFyIF9pbml0aWFsaXplZCA9IGZhbHNlO1xuXG4vLyB0YWJsZSBvZiBjb25zdGFudHNcbnZhciBfayA9IG51bGw7XG5cbi8vIGluaXRpYWwgaGFzaCBzdGF0ZXNcbnZhciBfc3RhdGVzID0gbnVsbDtcblxuLyoqXG4gKiBJbml0aWFsaXplcyB0aGUgY29uc3RhbnQgdGFibGVzLlxuICovXG5mdW5jdGlvbiBfaW5pdCgpIHtcbiAgLy8gY3JlYXRlIHBhZGRpbmdcbiAgX3BhZGRpbmcgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKDEyOCk7XG4gIF9wYWRkaW5nICs9IGZvcmdlLnV0aWwuZmlsbFN0cmluZyhTdHJpbmcuZnJvbUNoYXJDb2RlKDB4MDApLCAxMjgpO1xuXG4gIC8vIGNyZWF0ZSBLIHRhYmxlIGZvciBTSEEtNTEyXG4gIF9rID0gW1xuICAgIFsweDQyOGEyZjk4LCAweGQ3MjhhZTIyXSwgWzB4NzEzNzQ0OTEsIDB4MjNlZjY1Y2RdLFxuICAgIFsweGI1YzBmYmNmLCAweGVjNGQzYjJmXSwgWzB4ZTliNWRiYTUsIDB4ODE4OWRiYmNdLFxuICAgIFsweDM5NTZjMjViLCAweGYzNDhiNTM4XSwgWzB4NTlmMTExZjEsIDB4YjYwNWQwMTldLFxuICAgIFsweDkyM2Y4MmE0LCAweGFmMTk0ZjliXSwgWzB4YWIxYzVlZDUsIDB4ZGE2ZDgxMThdLFxuICAgIFsweGQ4MDdhYTk4LCAweGEzMDMwMjQyXSwgWzB4MTI4MzViMDEsIDB4NDU3MDZmYmVdLFxuICAgIFsweDI0MzE4NWJlLCAweDRlZTRiMjhjXSwgWzB4NTUwYzdkYzMsIDB4ZDVmZmI0ZTJdLFxuICAgIFsweDcyYmU1ZDc0LCAweGYyN2I4OTZmXSwgWzB4ODBkZWIxZmUsIDB4M2IxNjk2YjFdLFxuICAgIFsweDliZGMwNmE3LCAweDI1YzcxMjM1XSwgWzB4YzE5YmYxNzQsIDB4Y2Y2OTI2OTRdLFxuICAgIFsweGU0OWI2OWMxLCAweDllZjE0YWQyXSwgWzB4ZWZiZTQ3ODYsIDB4Mzg0ZjI1ZTNdLFxuICAgIFsweDBmYzE5ZGM2LCAweDhiOGNkNWI1XSwgWzB4MjQwY2ExY2MsIDB4NzdhYzljNjVdLFxuICAgIFsweDJkZTkyYzZmLCAweDU5MmIwMjc1XSwgWzB4NGE3NDg0YWEsIDB4NmVhNmU0ODNdLFxuICAgIFsweDVjYjBhOWRjLCAweGJkNDFmYmQ0XSwgWzB4NzZmOTg4ZGEsIDB4ODMxMTUzYjVdLFxuICAgIFsweDk4M2U1MTUyLCAweGVlNjZkZmFiXSwgWzB4YTgzMWM2NmQsIDB4MmRiNDMyMTBdLFxuICAgIFsweGIwMDMyN2M4LCAweDk4ZmIyMTNmXSwgWzB4YmY1OTdmYzcsIDB4YmVlZjBlZTRdLFxuICAgIFsweGM2ZTAwYmYzLCAweDNkYTg4ZmMyXSwgWzB4ZDVhNzkxNDcsIDB4OTMwYWE3MjVdLFxuICAgIFsweDA2Y2E2MzUxLCAweGUwMDM4MjZmXSwgWzB4MTQyOTI5NjcsIDB4MGEwZTZlNzBdLFxuICAgIFsweDI3YjcwYTg1LCAweDQ2ZDIyZmZjXSwgWzB4MmUxYjIxMzgsIDB4NWMyNmM5MjZdLFxuICAgIFsweDRkMmM2ZGZjLCAweDVhYzQyYWVkXSwgWzB4NTMzODBkMTMsIDB4OWQ5NWIzZGZdLFxuICAgIFsweDY1MGE3MzU0LCAweDhiYWY2M2RlXSwgWzB4NzY2YTBhYmIsIDB4M2M3N2IyYThdLFxuICAgIFsweDgxYzJjOTJlLCAweDQ3ZWRhZWU2XSwgWzB4OTI3MjJjODUsIDB4MTQ4MjM1M2JdLFxuICAgIFsweGEyYmZlOGExLCAweDRjZjEwMzY0XSwgWzB4YTgxYTY2NGIsIDB4YmM0MjMwMDFdLFxuICAgIFsweGMyNGI4YjcwLCAweGQwZjg5NzkxXSwgWzB4Yzc2YzUxYTMsIDB4MDY1NGJlMzBdLFxuICAgIFsweGQxOTJlODE5LCAweGQ2ZWY1MjE4XSwgWzB4ZDY5OTA2MjQsIDB4NTU2NWE5MTBdLFxuICAgIFsweGY0MGUzNTg1LCAweDU3NzEyMDJhXSwgWzB4MTA2YWEwNzAsIDB4MzJiYmQxYjhdLFxuICAgIFsweDE5YTRjMTE2LCAweGI4ZDJkMGM4XSwgWzB4MWUzNzZjMDgsIDB4NTE0MWFiNTNdLFxuICAgIFsweDI3NDg3NzRjLCAweGRmOGVlYjk5XSwgWzB4MzRiMGJjYjUsIDB4ZTE5YjQ4YThdLFxuICAgIFsweDM5MWMwY2IzLCAweGM1Yzk1YTYzXSwgWzB4NGVkOGFhNGEsIDB4ZTM0MThhY2JdLFxuICAgIFsweDViOWNjYTRmLCAweDc3NjNlMzczXSwgWzB4NjgyZTZmZjMsIDB4ZDZiMmI4YTNdLFxuICAgIFsweDc0OGY4MmVlLCAweDVkZWZiMmZjXSwgWzB4NzhhNTYzNmYsIDB4NDMxNzJmNjBdLFxuICAgIFsweDg0Yzg3ODE0LCAweGExZjBhYjcyXSwgWzB4OGNjNzAyMDgsIDB4MWE2NDM5ZWNdLFxuICAgIFsweDkwYmVmZmZhLCAweDIzNjMxZTI4XSwgWzB4YTQ1MDZjZWIsIDB4ZGU4MmJkZTldLFxuICAgIFsweGJlZjlhM2Y3LCAweGIyYzY3OTE1XSwgWzB4YzY3MTc4ZjIsIDB4ZTM3MjUzMmJdLFxuICAgIFsweGNhMjczZWNlLCAweGVhMjY2MTljXSwgWzB4ZDE4NmI4YzcsIDB4MjFjMGMyMDddLFxuICAgIFsweGVhZGE3ZGQ2LCAweGNkZTBlYjFlXSwgWzB4ZjU3ZDRmN2YsIDB4ZWU2ZWQxNzhdLFxuICAgIFsweDA2ZjA2N2FhLCAweDcyMTc2ZmJhXSwgWzB4MGE2MzdkYzUsIDB4YTJjODk4YTZdLFxuICAgIFsweDExM2Y5ODA0LCAweGJlZjkwZGFlXSwgWzB4MWI3MTBiMzUsIDB4MTMxYzQ3MWJdLFxuICAgIFsweDI4ZGI3N2Y1LCAweDIzMDQ3ZDg0XSwgWzB4MzJjYWFiN2IsIDB4NDBjNzI0OTNdLFxuICAgIFsweDNjOWViZTBhLCAweDE1YzliZWJjXSwgWzB4NDMxZDY3YzQsIDB4OWMxMDBkNGNdLFxuICAgIFsweDRjYzVkNGJlLCAweGNiM2U0MmI2XSwgWzB4NTk3ZjI5OWMsIDB4ZmM2NTdlMmFdLFxuICAgIFsweDVmY2I2ZmFiLCAweDNhZDZmYWVjXSwgWzB4NmM0NDE5OGMsIDB4NGE0NzU4MTddXG4gIF07XG5cbiAgLy8gaW5pdGlhbCBoYXNoIHN0YXRlc1xuICBfc3RhdGVzID0ge307XG4gIF9zdGF0ZXNbJ1NIQS01MTInXSA9IFtcbiAgICBbMHg2YTA5ZTY2NywgMHhmM2JjYzkwOF0sXG4gICAgWzB4YmI2N2FlODUsIDB4ODRjYWE3M2JdLFxuICAgIFsweDNjNmVmMzcyLCAweGZlOTRmODJiXSxcbiAgICBbMHhhNTRmZjUzYSwgMHg1ZjFkMzZmMV0sXG4gICAgWzB4NTEwZTUyN2YsIDB4YWRlNjgyZDFdLFxuICAgIFsweDliMDU2ODhjLCAweDJiM2U2YzFmXSxcbiAgICBbMHgxZjgzZDlhYiwgMHhmYjQxYmQ2Yl0sXG4gICAgWzB4NWJlMGNkMTksIDB4MTM3ZTIxNzldXG4gIF07XG4gIF9zdGF0ZXNbJ1NIQS0zODQnXSA9IFtcbiAgICBbMHhjYmJiOWQ1ZCwgMHhjMTA1OWVkOF0sXG4gICAgWzB4NjI5YTI5MmEsIDB4MzY3Y2Q1MDddLFxuICAgIFsweDkxNTkwMTVhLCAweDMwNzBkZDE3XSxcbiAgICBbMHgxNTJmZWNkOCwgMHhmNzBlNTkzOV0sXG4gICAgWzB4NjczMzI2NjcsIDB4ZmZjMDBiMzFdLFxuICAgIFsweDhlYjQ0YTg3LCAweDY4NTgxNTExXSxcbiAgICBbMHhkYjBjMmUwZCwgMHg2NGY5OGZhN10sXG4gICAgWzB4NDdiNTQ4MWQsIDB4YmVmYTRmYTRdXG4gIF07XG4gIF9zdGF0ZXNbJ1NIQS01MTIvMjU2J10gPSBbXG4gICAgWzB4MjIzMTIxOTQsIDB4RkMyQkY3MkNdLFxuICAgIFsweDlGNTU1RkEzLCAweEM4NEM2NEMyXSxcbiAgICBbMHgyMzkzQjg2QiwgMHg2RjUzQjE1MV0sXG4gICAgWzB4OTYzODc3MTksIDB4NTk0MEVBQkRdLFxuICAgIFsweDk2MjgzRUUyLCAweEE4OEVGRkUzXSxcbiAgICBbMHhCRTVFMUUyNSwgMHg1Mzg2Mzk5Ml0sXG4gICAgWzB4MkIwMTk5RkMsIDB4MkM4NUI4QUFdLFxuICAgIFsweDBFQjcyRERDLCAweDgxQzUyQ0EyXVxuICBdO1xuICBfc3RhdGVzWydTSEEtNTEyLzIyNCddID0gW1xuICAgIFsweDhDM0QzN0M4LCAweDE5NTQ0REEyXSxcbiAgICBbMHg3M0UxOTk2NiwgMHg4OURDRDRENl0sXG4gICAgWzB4MURGQUI3QUUsIDB4MzJGRjlDODJdLFxuICAgIFsweDY3OURENTE0LCAweDU4MkY5RkNGXSxcbiAgICBbMHgwRjZEMkI2OSwgMHg3QkQ0NERBOF0sXG4gICAgWzB4NzdFMzZGNzMsIDB4MDRDNDg5NDJdLFxuICAgIFsweDNGOUQ4NUE4LCAweDZBMUQzNkM4XSxcbiAgICBbMHgxMTEyRTZBRCwgMHg5MUQ2OTJBMV1cbiAgXTtcblxuICAvLyBub3cgaW5pdGlhbGl6ZWRcbiAgX2luaXRpYWxpemVkID0gdHJ1ZTtcbn1cblxuLyoqXG4gKiBVcGRhdGVzIGEgU0hBLTUxMiBzdGF0ZSB3aXRoIHRoZSBnaXZlbiBieXRlIGJ1ZmZlci5cbiAqXG4gKiBAcGFyYW0gcyB0aGUgU0hBLTUxMiBzdGF0ZSB0byB1cGRhdGUuXG4gKiBAcGFyYW0gdyB0aGUgYXJyYXkgdG8gdXNlIHRvIHN0b3JlIHdvcmRzLlxuICogQHBhcmFtIGJ5dGVzIHRoZSBieXRlIGJ1ZmZlciB0byB1cGRhdGUgd2l0aC5cbiAqL1xuZnVuY3Rpb24gX3VwZGF0ZShzLCB3LCBieXRlcykge1xuICAvLyBjb25zdW1lIDUxMiBiaXQgKDEyOCBieXRlKSBjaHVua3NcbiAgdmFyIHQxX2hpLCB0MV9sbztcbiAgdmFyIHQyX2hpLCB0Ml9sbztcbiAgdmFyIHMwX2hpLCBzMF9sbztcbiAgdmFyIHMxX2hpLCBzMV9sbztcbiAgdmFyIGNoX2hpLCBjaF9sbztcbiAgdmFyIG1hal9oaSwgbWFqX2xvO1xuICB2YXIgYV9oaSwgYV9sbztcbiAgdmFyIGJfaGksIGJfbG87XG4gIHZhciBjX2hpLCBjX2xvO1xuICB2YXIgZF9oaSwgZF9sbztcbiAgdmFyIGVfaGksIGVfbG87XG4gIHZhciBmX2hpLCBmX2xvO1xuICB2YXIgZ19oaSwgZ19sbztcbiAgdmFyIGhfaGksIGhfbG87XG4gIHZhciBpLCBoaSwgbG8sIHcyLCB3NywgdzE1LCB3MTY7XG4gIHZhciBsZW4gPSBieXRlcy5sZW5ndGgoKTtcbiAgd2hpbGUobGVuID49IDEyOCkge1xuICAgIC8vIHRoZSB3IGFycmF5IHdpbGwgYmUgcG9wdWxhdGVkIHdpdGggc2l4dGVlbiA2NC1iaXQgYmlnLWVuZGlhbiB3b3Jkc1xuICAgIC8vIGFuZCB0aGVuIGV4dGVuZGVkIGludG8gNjQgNjQtYml0IHdvcmRzIGFjY29yZGluZyB0byBTSEEtNTEyXG4gICAgZm9yKGkgPSAwOyBpIDwgMTY7ICsraSkge1xuICAgICAgd1tpXVswXSA9IGJ5dGVzLmdldEludDMyKCkgPj4+IDA7XG4gICAgICB3W2ldWzFdID0gYnl0ZXMuZ2V0SW50MzIoKSA+Pj4gMDtcbiAgICB9XG4gICAgZm9yKDsgaSA8IDgwOyArK2kpIHtcbiAgICAgIC8vIGZvciB3b3JkIDIgd29yZHMgYWdvOiBST1RSIDE5KHgpIF4gUk9UUiA2MSh4KSBeIFNIUiA2KHgpXG4gICAgICB3MiA9IHdbaSAtIDJdO1xuICAgICAgaGkgPSB3MlswXTtcbiAgICAgIGxvID0gdzJbMV07XG5cbiAgICAgIC8vIGhpZ2ggYml0c1xuICAgICAgdDFfaGkgPSAoXG4gICAgICAgICgoaGkgPj4+IDE5KSB8IChsbyA8PCAxMykpIF4gLy8gUk9UUiAxOVxuICAgICAgICAoKGxvID4+PiAyOSkgfCAoaGkgPDwgMykpIF4gLy8gUk9UUiA2MS8oc3dhcCArIFJPVFIgMjkpXG4gICAgICAgIChoaSA+Pj4gNikpID4+PiAwOyAvLyBTSFIgNlxuICAgICAgLy8gbG93IGJpdHNcbiAgICAgIHQxX2xvID0gKFxuICAgICAgICAoKGhpIDw8IDEzKSB8IChsbyA+Pj4gMTkpKSBeIC8vIFJPVFIgMTlcbiAgICAgICAgKChsbyA8PCAzKSB8IChoaSA+Pj4gMjkpKSBeIC8vIFJPVFIgNjEvKHN3YXAgKyBST1RSIDI5KVxuICAgICAgICAoKGhpIDw8IDI2KSB8IChsbyA+Pj4gNikpKSA+Pj4gMDsgLy8gU0hSIDZcblxuICAgICAgLy8gZm9yIHdvcmQgMTUgd29yZHMgYWdvOiBST1RSIDEoeCkgXiBST1RSIDgoeCkgXiBTSFIgNyh4KVxuICAgICAgdzE1ID0gd1tpIC0gMTVdO1xuICAgICAgaGkgPSB3MTVbMF07XG4gICAgICBsbyA9IHcxNVsxXTtcblxuICAgICAgLy8gaGlnaCBiaXRzXG4gICAgICB0Ml9oaSA9IChcbiAgICAgICAgKChoaSA+Pj4gMSkgfCAobG8gPDwgMzEpKSBeIC8vIFJPVFIgMVxuICAgICAgICAoKGhpID4+PiA4KSB8IChsbyA8PCAyNCkpIF4gLy8gUk9UUiA4XG4gICAgICAgIChoaSA+Pj4gNykpID4+PiAwOyAvLyBTSFIgN1xuICAgICAgLy8gbG93IGJpdHNcbiAgICAgIHQyX2xvID0gKFxuICAgICAgICAoKGhpIDw8IDMxKSB8IChsbyA+Pj4gMSkpIF4gLy8gUk9UUiAxXG4gICAgICAgICgoaGkgPDwgMjQpIHwgKGxvID4+PiA4KSkgXiAvLyBST1RSIDhcbiAgICAgICAgKChoaSA8PCAyNSkgfCAobG8gPj4+IDcpKSkgPj4+IDA7IC8vIFNIUiA3XG5cbiAgICAgIC8vIHN1bSh0MSwgd29yZCA3IGFnbywgdDIsIHdvcmQgMTYgYWdvKSBtb2R1bG8gMl42NCAoY2FycnkgbG8gb3ZlcmZsb3cpXG4gICAgICB3NyA9IHdbaSAtIDddO1xuICAgICAgdzE2ID0gd1tpIC0gMTZdO1xuICAgICAgbG8gPSAodDFfbG8gKyB3N1sxXSArIHQyX2xvICsgdzE2WzFdKTtcbiAgICAgIHdbaV1bMF0gPSAodDFfaGkgKyB3N1swXSArIHQyX2hpICsgdzE2WzBdICtcbiAgICAgICAgKChsbyAvIDB4MTAwMDAwMDAwKSA+Pj4gMCkpID4+PiAwO1xuICAgICAgd1tpXVsxXSA9IGxvID4+PiAwO1xuICAgIH1cblxuICAgIC8vIGluaXRpYWxpemUgaGFzaCB2YWx1ZSBmb3IgdGhpcyBjaHVua1xuICAgIGFfaGkgPSBzWzBdWzBdO1xuICAgIGFfbG8gPSBzWzBdWzFdO1xuICAgIGJfaGkgPSBzWzFdWzBdO1xuICAgIGJfbG8gPSBzWzFdWzFdO1xuICAgIGNfaGkgPSBzWzJdWzBdO1xuICAgIGNfbG8gPSBzWzJdWzFdO1xuICAgIGRfaGkgPSBzWzNdWzBdO1xuICAgIGRfbG8gPSBzWzNdWzFdO1xuICAgIGVfaGkgPSBzWzRdWzBdO1xuICAgIGVfbG8gPSBzWzRdWzFdO1xuICAgIGZfaGkgPSBzWzVdWzBdO1xuICAgIGZfbG8gPSBzWzVdWzFdO1xuICAgIGdfaGkgPSBzWzZdWzBdO1xuICAgIGdfbG8gPSBzWzZdWzFdO1xuICAgIGhfaGkgPSBzWzddWzBdO1xuICAgIGhfbG8gPSBzWzddWzFdO1xuXG4gICAgLy8gcm91bmQgZnVuY3Rpb25cbiAgICBmb3IoaSA9IDA7IGkgPCA4MDsgKytpKSB7XG4gICAgICAvLyBTdW0xKGUpID0gUk9UUiAxNChlKSBeIFJPVFIgMTgoZSkgXiBST1RSIDQxKGUpXG4gICAgICBzMV9oaSA9IChcbiAgICAgICAgKChlX2hpID4+PiAxNCkgfCAoZV9sbyA8PCAxOCkpIF4gLy8gUk9UUiAxNFxuICAgICAgICAoKGVfaGkgPj4+IDE4KSB8IChlX2xvIDw8IDE0KSkgXiAvLyBST1RSIDE4XG4gICAgICAgICgoZV9sbyA+Pj4gOSkgfCAoZV9oaSA8PCAyMykpKSA+Pj4gMDsgLy8gUk9UUiA0MS8oc3dhcCArIFJPVFIgOSlcbiAgICAgIHMxX2xvID0gKFxuICAgICAgICAoKGVfaGkgPDwgMTgpIHwgKGVfbG8gPj4+IDE0KSkgXiAvLyBST1RSIDE0XG4gICAgICAgICgoZV9oaSA8PCAxNCkgfCAoZV9sbyA+Pj4gMTgpKSBeIC8vIFJPVFIgMThcbiAgICAgICAgKChlX2xvIDw8IDIzKSB8IChlX2hpID4+PiA5KSkpID4+PiAwOyAvLyBST1RSIDQxLyhzd2FwICsgUk9UUiA5KVxuXG4gICAgICAvLyBDaChlLCBmLCBnKSAob3B0aW1pemVkIHRoZSBzYW1lIHdheSBhcyBTSEEtMSlcbiAgICAgIGNoX2hpID0gKGdfaGkgXiAoZV9oaSAmIChmX2hpIF4gZ19oaSkpKSA+Pj4gMDtcbiAgICAgIGNoX2xvID0gKGdfbG8gXiAoZV9sbyAmIChmX2xvIF4gZ19sbykpKSA+Pj4gMDtcblxuICAgICAgLy8gU3VtMChhKSA9IFJPVFIgMjgoYSkgXiBST1RSIDM0KGEpIF4gUk9UUiAzOShhKVxuICAgICAgczBfaGkgPSAoXG4gICAgICAgICgoYV9oaSA+Pj4gMjgpIHwgKGFfbG8gPDwgNCkpIF4gLy8gUk9UUiAyOFxuICAgICAgICAoKGFfbG8gPj4+IDIpIHwgKGFfaGkgPDwgMzApKSBeIC8vIFJPVFIgMzQvKHN3YXAgKyBST1RSIDIpXG4gICAgICAgICgoYV9sbyA+Pj4gNykgfCAoYV9oaSA8PCAyNSkpKSA+Pj4gMDsgLy8gUk9UUiAzOS8oc3dhcCArIFJPVFIgNylcbiAgICAgIHMwX2xvID0gKFxuICAgICAgICAoKGFfaGkgPDwgNCkgfCAoYV9sbyA+Pj4gMjgpKSBeIC8vIFJPVFIgMjhcbiAgICAgICAgKChhX2xvIDw8IDMwKSB8IChhX2hpID4+PiAyKSkgXiAvLyBST1RSIDM0Lyhzd2FwICsgUk9UUiAyKVxuICAgICAgICAoKGFfbG8gPDwgMjUpIHwgKGFfaGkgPj4+IDcpKSkgPj4+IDA7IC8vIFJPVFIgMzkvKHN3YXAgKyBST1RSIDcpXG5cbiAgICAgIC8vIE1haihhLCBiLCBjKSAob3B0aW1pemVkIHRoZSBzYW1lIHdheSBhcyBTSEEtMSlcbiAgICAgIG1hal9oaSA9ICgoYV9oaSAmIGJfaGkpIHwgKGNfaGkgJiAoYV9oaSBeIGJfaGkpKSkgPj4+IDA7XG4gICAgICBtYWpfbG8gPSAoKGFfbG8gJiBiX2xvKSB8IChjX2xvICYgKGFfbG8gXiBiX2xvKSkpID4+PiAwO1xuXG4gICAgICAvLyBtYWluIGFsZ29yaXRobVxuICAgICAgLy8gdDEgPSAoaCArIHMxICsgY2ggKyBfa1tpXSArIF93W2ldKSBtb2R1bG8gMl42NCAoY2FycnkgbG8gb3ZlcmZsb3cpXG4gICAgICBsbyA9IChoX2xvICsgczFfbG8gKyBjaF9sbyArIF9rW2ldWzFdICsgd1tpXVsxXSk7XG4gICAgICB0MV9oaSA9IChoX2hpICsgczFfaGkgKyBjaF9oaSArIF9rW2ldWzBdICsgd1tpXVswXSArXG4gICAgICAgICgobG8gLyAweDEwMDAwMDAwMCkgPj4+IDApKSA+Pj4gMDtcbiAgICAgIHQxX2xvID0gbG8gPj4+IDA7XG5cbiAgICAgIC8vIHQyID0gczAgKyBtYWogbW9kdWxvIDJeNjQgKGNhcnJ5IGxvIG92ZXJmbG93KVxuICAgICAgbG8gPSBzMF9sbyArIG1hal9sbztcbiAgICAgIHQyX2hpID0gKHMwX2hpICsgbWFqX2hpICsgKChsbyAvIDB4MTAwMDAwMDAwKSA+Pj4gMCkpID4+PiAwO1xuICAgICAgdDJfbG8gPSBsbyA+Pj4gMDtcblxuICAgICAgaF9oaSA9IGdfaGk7XG4gICAgICBoX2xvID0gZ19sbztcblxuICAgICAgZ19oaSA9IGZfaGk7XG4gICAgICBnX2xvID0gZl9sbztcblxuICAgICAgZl9oaSA9IGVfaGk7XG4gICAgICBmX2xvID0gZV9sbztcblxuICAgICAgLy8gZSA9IChkICsgdDEpIG1vZHVsbyAyXjY0IChjYXJyeSBsbyBvdmVyZmxvdylcbiAgICAgIGxvID0gZF9sbyArIHQxX2xvO1xuICAgICAgZV9oaSA9IChkX2hpICsgdDFfaGkgKyAoKGxvIC8gMHgxMDAwMDAwMDApID4+PiAwKSkgPj4+IDA7XG4gICAgICBlX2xvID0gbG8gPj4+IDA7XG5cbiAgICAgIGRfaGkgPSBjX2hpO1xuICAgICAgZF9sbyA9IGNfbG87XG5cbiAgICAgIGNfaGkgPSBiX2hpO1xuICAgICAgY19sbyA9IGJfbG87XG5cbiAgICAgIGJfaGkgPSBhX2hpO1xuICAgICAgYl9sbyA9IGFfbG87XG5cbiAgICAgIC8vIGEgPSAodDEgKyB0MikgbW9kdWxvIDJeNjQgKGNhcnJ5IGxvIG92ZXJmbG93KVxuICAgICAgbG8gPSB0MV9sbyArIHQyX2xvO1xuICAgICAgYV9oaSA9ICh0MV9oaSArIHQyX2hpICsgKChsbyAvIDB4MTAwMDAwMDAwKSA+Pj4gMCkpID4+PiAwO1xuICAgICAgYV9sbyA9IGxvID4+PiAwO1xuICAgIH1cblxuICAgIC8vIHVwZGF0ZSBoYXNoIHN0YXRlIChhZGRpdGlvbmFsIG1vZHVsbyAyXjY0KVxuICAgIGxvID0gc1swXVsxXSArIGFfbG87XG4gICAgc1swXVswXSA9IChzWzBdWzBdICsgYV9oaSArICgobG8gLyAweDEwMDAwMDAwMCkgPj4+IDApKSA+Pj4gMDtcbiAgICBzWzBdWzFdID0gbG8gPj4+IDA7XG5cbiAgICBsbyA9IHNbMV1bMV0gKyBiX2xvO1xuICAgIHNbMV1bMF0gPSAoc1sxXVswXSArIGJfaGkgKyAoKGxvIC8gMHgxMDAwMDAwMDApID4+PiAwKSkgPj4+IDA7XG4gICAgc1sxXVsxXSA9IGxvID4+PiAwO1xuXG4gICAgbG8gPSBzWzJdWzFdICsgY19sbztcbiAgICBzWzJdWzBdID0gKHNbMl1bMF0gKyBjX2hpICsgKChsbyAvIDB4MTAwMDAwMDAwKSA+Pj4gMCkpID4+PiAwO1xuICAgIHNbMl1bMV0gPSBsbyA+Pj4gMDtcblxuICAgIGxvID0gc1szXVsxXSArIGRfbG87XG4gICAgc1szXVswXSA9IChzWzNdWzBdICsgZF9oaSArICgobG8gLyAweDEwMDAwMDAwMCkgPj4+IDApKSA+Pj4gMDtcbiAgICBzWzNdWzFdID0gbG8gPj4+IDA7XG5cbiAgICBsbyA9IHNbNF1bMV0gKyBlX2xvO1xuICAgIHNbNF1bMF0gPSAoc1s0XVswXSArIGVfaGkgKyAoKGxvIC8gMHgxMDAwMDAwMDApID4+PiAwKSkgPj4+IDA7XG4gICAgc1s0XVsxXSA9IGxvID4+PiAwO1xuXG4gICAgbG8gPSBzWzVdWzFdICsgZl9sbztcbiAgICBzWzVdWzBdID0gKHNbNV1bMF0gKyBmX2hpICsgKChsbyAvIDB4MTAwMDAwMDAwKSA+Pj4gMCkpID4+PiAwO1xuICAgIHNbNV1bMV0gPSBsbyA+Pj4gMDtcblxuICAgIGxvID0gc1s2XVsxXSArIGdfbG87XG4gICAgc1s2XVswXSA9IChzWzZdWzBdICsgZ19oaSArICgobG8gLyAweDEwMDAwMDAwMCkgPj4+IDApKSA+Pj4gMDtcbiAgICBzWzZdWzFdID0gbG8gPj4+IDA7XG5cbiAgICBsbyA9IHNbN11bMV0gKyBoX2xvO1xuICAgIHNbN11bMF0gPSAoc1s3XVswXSArIGhfaGkgKyAoKGxvIC8gMHgxMDAwMDAwMDApID4+PiAwKSkgPj4+IDA7XG4gICAgc1s3XVsxXSA9IGxvID4+PiAwO1xuXG4gICAgbGVuIC09IDEyODtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///90\n")},function(module,exports,__webpack_require__){eval("/* WEBPACK VAR INJECTION */(function(global, module) {var __WEBPACK_AMD_DEFINE_RESULT__;/**\n * @license\n * Lodash <https://lodash.com/>\n * Copyright OpenJS Foundation and other contributors <https://openjsf.org/>\n * Released under MIT license <https://lodash.com/license>\n * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n;(function() {\n\n  /** Used as a safe reference for `undefined` in pre-ES5 environments. */\n  var undefined;\n\n  /** Used as the semantic version number. */\n  var VERSION = '4.17.21';\n\n  /** Used as the size to enable large array optimizations. */\n  var LARGE_ARRAY_SIZE = 200;\n\n  /** Error message constants. */\n  var CORE_ERROR_TEXT = 'Unsupported core-js use. Try https://npms.io/search?q=ponyfill.',\n      FUNC_ERROR_TEXT = 'Expected a function',\n      INVALID_TEMPL_VAR_ERROR_TEXT = 'Invalid `variable` option passed into `_.template`';\n\n  /** Used to stand-in for `undefined` hash values. */\n  var HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n  /** Used as the maximum memoize cache size. */\n  var MAX_MEMOIZE_SIZE = 500;\n\n  /** Used as the internal argument placeholder. */\n  var PLACEHOLDER = '__lodash_placeholder__';\n\n  /** Used to compose bitmasks for cloning. */\n  var CLONE_DEEP_FLAG = 1,\n      CLONE_FLAT_FLAG = 2,\n      CLONE_SYMBOLS_FLAG = 4;\n\n  /** Used to compose bitmasks for value comparisons. */\n  var COMPARE_PARTIAL_FLAG = 1,\n      COMPARE_UNORDERED_FLAG = 2;\n\n  /** Used to compose bitmasks for function metadata. */\n  var WRAP_BIND_FLAG = 1,\n      WRAP_BIND_KEY_FLAG = 2,\n      WRAP_CURRY_BOUND_FLAG = 4,\n      WRAP_CURRY_FLAG = 8,\n      WRAP_CURRY_RIGHT_FLAG = 16,\n      WRAP_PARTIAL_FLAG = 32,\n      WRAP_PARTIAL_RIGHT_FLAG = 64,\n      WRAP_ARY_FLAG = 128,\n      WRAP_REARG_FLAG = 256,\n      WRAP_FLIP_FLAG = 512;\n\n  /** Used as default options for `_.truncate`. */\n  var DEFAULT_TRUNC_LENGTH = 30,\n      DEFAULT_TRUNC_OMISSION = '...';\n\n  /** Used to detect hot functions by number of calls within a span of milliseconds. */\n  var HOT_COUNT = 800,\n      HOT_SPAN = 16;\n\n  /** Used to indicate the type of lazy iteratees. */\n  var LAZY_FILTER_FLAG = 1,\n      LAZY_MAP_FLAG = 2,\n      LAZY_WHILE_FLAG = 3;\n\n  /** Used as references for various `Number` constants. */\n  var INFINITY = 1 / 0,\n      MAX_SAFE_INTEGER = 9007199254740991,\n      MAX_INTEGER = 1.7976931348623157e+308,\n      NAN = 0 / 0;\n\n  /** Used as references for the maximum length and index of an array. */\n  var MAX_ARRAY_LENGTH = 4294967295,\n      MAX_ARRAY_INDEX = MAX_ARRAY_LENGTH - 1,\n      HALF_MAX_ARRAY_LENGTH = MAX_ARRAY_LENGTH >>> 1;\n\n  /** Used to associate wrap methods with their bit flags. */\n  var wrapFlags = [\n    ['ary', WRAP_ARY_FLAG],\n    ['bind', WRAP_BIND_FLAG],\n    ['bindKey', WRAP_BIND_KEY_FLAG],\n    ['curry', WRAP_CURRY_FLAG],\n    ['curryRight', WRAP_CURRY_RIGHT_FLAG],\n    ['flip', WRAP_FLIP_FLAG],\n    ['partial', WRAP_PARTIAL_FLAG],\n    ['partialRight', WRAP_PARTIAL_RIGHT_FLAG],\n    ['rearg', WRAP_REARG_FLAG]\n  ];\n\n  /** `Object#toString` result references. */\n  var argsTag = '[object Arguments]',\n      arrayTag = '[object Array]',\n      asyncTag = '[object AsyncFunction]',\n      boolTag = '[object Boolean]',\n      dateTag = '[object Date]',\n      domExcTag = '[object DOMException]',\n      errorTag = '[object Error]',\n      funcTag = '[object Function]',\n      genTag = '[object GeneratorFunction]',\n      mapTag = '[object Map]',\n      numberTag = '[object Number]',\n      nullTag = '[object Null]',\n      objectTag = '[object Object]',\n      promiseTag = '[object Promise]',\n      proxyTag = '[object Proxy]',\n      regexpTag = '[object RegExp]',\n      setTag = '[object Set]',\n      stringTag = '[object String]',\n      symbolTag = '[object Symbol]',\n      undefinedTag = '[object Undefined]',\n      weakMapTag = '[object WeakMap]',\n      weakSetTag = '[object WeakSet]';\n\n  var arrayBufferTag = '[object ArrayBuffer]',\n      dataViewTag = '[object DataView]',\n      float32Tag = '[object Float32Array]',\n      float64Tag = '[object Float64Array]',\n      int8Tag = '[object Int8Array]',\n      int16Tag = '[object Int16Array]',\n      int32Tag = '[object Int32Array]',\n      uint8Tag = '[object Uint8Array]',\n      uint8ClampedTag = '[object Uint8ClampedArray]',\n      uint16Tag = '[object Uint16Array]',\n      uint32Tag = '[object Uint32Array]';\n\n  /** Used to match empty string literals in compiled template source. */\n  var reEmptyStringLeading = /\\b__p \\+= '';/g,\n      reEmptyStringMiddle = /\\b(__p \\+=) '' \\+/g,\n      reEmptyStringTrailing = /(__e\\(.*?\\)|\\b__t\\)) \\+\\n'';/g;\n\n  /** Used to match HTML entities and HTML characters. */\n  var reEscapedHtml = /&(?:amp|lt|gt|quot|#39);/g,\n      reUnescapedHtml = /[&<>\"']/g,\n      reHasEscapedHtml = RegExp(reEscapedHtml.source),\n      reHasUnescapedHtml = RegExp(reUnescapedHtml.source);\n\n  /** Used to match template delimiters. */\n  var reEscape = /<%-([\\s\\S]+?)%>/g,\n      reEvaluate = /<%([\\s\\S]+?)%>/g,\n      reInterpolate = /<%=([\\s\\S]+?)%>/g;\n\n  /** Used to match property names within property paths. */\n  var reIsDeepProp = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,\n      reIsPlainProp = /^\\w*$/,\n      rePropName = /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g;\n\n  /**\n   * Used to match `RegExp`\n   * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n   */\n  var reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g,\n      reHasRegExpChar = RegExp(reRegExpChar.source);\n\n  /** Used to match leading whitespace. */\n  var reTrimStart = /^\\s+/;\n\n  /** Used to match a single whitespace character. */\n  var reWhitespace = /\\s/;\n\n  /** Used to match wrap detail comments. */\n  var reWrapComment = /\\{(?:\\n\\/\\* \\[wrapped with .+\\] \\*\\/)?\\n?/,\n      reWrapDetails = /\\{\\n\\/\\* \\[wrapped with (.+)\\] \\*/,\n      reSplitDetails = /,? & /;\n\n  /** Used to match words composed of alphanumeric characters. */\n  var reAsciiWord = /[^\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\x7f]+/g;\n\n  /**\n   * Used to validate the `validate` option in `_.template` variable.\n   *\n   * Forbids characters which could potentially change the meaning of the function argument definition:\n   * - \"(),\" (modification of function parameters)\n   * - \"=\" (default value)\n   * - \"[]{}\" (destructuring of function parameters)\n   * - \"/\" (beginning of a comment)\n   * - whitespace\n   */\n  var reForbiddenIdentifierChars = /[()=,{}\\[\\]\\/\\s]/;\n\n  /** Used to match backslashes in property paths. */\n  var reEscapeChar = /\\\\(\\\\)?/g;\n\n  /**\n   * Used to match\n   * [ES template delimiters](http://ecma-international.org/ecma-262/7.0/#sec-template-literal-lexical-components).\n   */\n  var reEsTemplate = /\\$\\{([^\\\\}]*(?:\\\\.[^\\\\}]*)*)\\}/g;\n\n  /** Used to match `RegExp` flags from their coerced string values. */\n  var reFlags = /\\w*$/;\n\n  /** Used to detect bad signed hexadecimal string values. */\n  var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n  /** Used to detect binary string values. */\n  var reIsBinary = /^0b[01]+$/i;\n\n  /** Used to detect host constructors (Safari). */\n  var reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n  /** Used to detect octal string values. */\n  var reIsOctal = /^0o[0-7]+$/i;\n\n  /** Used to detect unsigned integer values. */\n  var reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n  /** Used to match Latin Unicode letters (excluding mathematical operators). */\n  var reLatin = /[\\xc0-\\xd6\\xd8-\\xf6\\xf8-\\xff\\u0100-\\u017f]/g;\n\n  /** Used to ensure capturing order of template delimiters. */\n  var reNoMatch = /($^)/;\n\n  /** Used to match unescaped characters in compiled string literals. */\n  var reUnescapedString = /['\\n\\r\\u2028\\u2029\\\\]/g;\n\n  /** Used to compose unicode character classes. */\n  var rsAstralRange = '\\\\ud800-\\\\udfff',\n      rsComboMarksRange = '\\\\u0300-\\\\u036f',\n      reComboHalfMarksRange = '\\\\ufe20-\\\\ufe2f',\n      rsComboSymbolsRange = '\\\\u20d0-\\\\u20ff',\n      rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange,\n      rsDingbatRange = '\\\\u2700-\\\\u27bf',\n      rsLowerRange = 'a-z\\\\xdf-\\\\xf6\\\\xf8-\\\\xff',\n      rsMathOpRange = '\\\\xac\\\\xb1\\\\xd7\\\\xf7',\n      rsNonCharRange = '\\\\x00-\\\\x2f\\\\x3a-\\\\x40\\\\x5b-\\\\x60\\\\x7b-\\\\xbf',\n      rsPunctuationRange = '\\\\u2000-\\\\u206f',\n      rsSpaceRange = ' \\\\t\\\\x0b\\\\f\\\\xa0\\\\ufeff\\\\n\\\\r\\\\u2028\\\\u2029\\\\u1680\\\\u180e\\\\u2000\\\\u2001\\\\u2002\\\\u2003\\\\u2004\\\\u2005\\\\u2006\\\\u2007\\\\u2008\\\\u2009\\\\u200a\\\\u202f\\\\u205f\\\\u3000',\n      rsUpperRange = 'A-Z\\\\xc0-\\\\xd6\\\\xd8-\\\\xde',\n      rsVarRange = '\\\\ufe0e\\\\ufe0f',\n      rsBreakRange = rsMathOpRange + rsNonCharRange + rsPunctuationRange + rsSpaceRange;\n\n  /** Used to compose unicode capture groups. */\n  var rsApos = \"['\\u2019]\",\n      rsAstral = '[' + rsAstralRange + ']',\n      rsBreak = '[' + rsBreakRange + ']',\n      rsCombo = '[' + rsComboRange + ']',\n      rsDigits = '\\\\d+',\n      rsDingbat = '[' + rsDingbatRange + ']',\n      rsLower = '[' + rsLowerRange + ']',\n      rsMisc = '[^' + rsAstralRange + rsBreakRange + rsDigits + rsDingbatRange + rsLowerRange + rsUpperRange + ']',\n      rsFitz = '\\\\ud83c[\\\\udffb-\\\\udfff]',\n      rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')',\n      rsNonAstral = '[^' + rsAstralRange + ']',\n      rsRegional = '(?:\\\\ud83c[\\\\udde6-\\\\uddff]){2}',\n      rsSurrPair = '[\\\\ud800-\\\\udbff][\\\\udc00-\\\\udfff]',\n      rsUpper = '[' + rsUpperRange + ']',\n      rsZWJ = '\\\\u200d';\n\n  /** Used to compose unicode regexes. */\n  var rsMiscLower = '(?:' + rsLower + '|' + rsMisc + ')',\n      rsMiscUpper = '(?:' + rsUpper + '|' + rsMisc + ')',\n      rsOptContrLower = '(?:' + rsApos + '(?:d|ll|m|re|s|t|ve))?',\n      rsOptContrUpper = '(?:' + rsApos + '(?:D|LL|M|RE|S|T|VE))?',\n      reOptMod = rsModifier + '?',\n      rsOptVar = '[' + rsVarRange + ']?',\n      rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*',\n      rsOrdLower = '\\\\d*(?:1st|2nd|3rd|(?![123])\\\\dth)(?=\\\\b|[A-Z_])',\n      rsOrdUpper = '\\\\d*(?:1ST|2ND|3RD|(?![123])\\\\dTH)(?=\\\\b|[a-z_])',\n      rsSeq = rsOptVar + reOptMod + rsOptJoin,\n      rsEmoji = '(?:' + [rsDingbat, rsRegional, rsSurrPair].join('|') + ')' + rsSeq,\n      rsSymbol = '(?:' + [rsNonAstral + rsCombo + '?', rsCombo, rsRegional, rsSurrPair, rsAstral].join('|') + ')';\n\n  /** Used to match apostrophes. */\n  var reApos = RegExp(rsApos, 'g');\n\n  /**\n   * Used to match [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks) and\n   * [combining diacritical marks for symbols](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks_for_Symbols).\n   */\n  var reComboMark = RegExp(rsCombo, 'g');\n\n  /** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */\n  var reUnicode = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g');\n\n  /** Used to match complex or compound words. */\n  var reUnicodeWord = RegExp([\n    rsUpper + '?' + rsLower + '+' + rsOptContrLower + '(?=' + [rsBreak, rsUpper, '$'].join('|') + ')',\n    rsMiscUpper + '+' + rsOptContrUpper + '(?=' + [rsBreak, rsUpper + rsMiscLower, '$'].join('|') + ')',\n    rsUpper + '?' + rsMiscLower + '+' + rsOptContrLower,\n    rsUpper + '+' + rsOptContrUpper,\n    rsOrdUpper,\n    rsOrdLower,\n    rsDigits,\n    rsEmoji\n  ].join('|'), 'g');\n\n  /** Used to detect strings with [zero-width joiners or code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */\n  var reHasUnicode = RegExp('[' + rsZWJ + rsAstralRange  + rsComboRange + rsVarRange + ']');\n\n  /** Used to detect strings that need a more robust regexp to match words. */\n  var reHasUnicodeWord = /[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/;\n\n  /** Used to assign default `context` object properties. */\n  var contextProps = [\n    'Array', 'Buffer', 'DataView', 'Date', 'Error', 'Float32Array', 'Float64Array',\n    'Function', 'Int8Array', 'Int16Array', 'Int32Array', 'Map', 'Math', 'Object',\n    'Promise', 'RegExp', 'Set', 'String', 'Symbol', 'TypeError', 'Uint8Array',\n    'Uint8ClampedArray', 'Uint16Array', 'Uint32Array', 'WeakMap',\n    '_', 'clearTimeout', 'isFinite', 'parseInt', 'setTimeout'\n  ];\n\n  /** Used to make template sourceURLs easier to identify. */\n  var templateCounter = -1;\n\n  /** Used to identify `toStringTag` values of typed arrays. */\n  var typedArrayTags = {};\n  typedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\n  typedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\n  typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\n  typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\n  typedArrayTags[uint32Tag] = true;\n  typedArrayTags[argsTag] = typedArrayTags[arrayTag] =\n  typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\n  typedArrayTags[dataViewTag] = typedArrayTags[dateTag] =\n  typedArrayTags[errorTag] = typedArrayTags[funcTag] =\n  typedArrayTags[mapTag] = typedArrayTags[numberTag] =\n  typedArrayTags[objectTag] = typedArrayTags[regexpTag] =\n  typedArrayTags[setTag] = typedArrayTags[stringTag] =\n  typedArrayTags[weakMapTag] = false;\n\n  /** Used to identify `toStringTag` values supported by `_.clone`. */\n  var cloneableTags = {};\n  cloneableTags[argsTag] = cloneableTags[arrayTag] =\n  cloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] =\n  cloneableTags[boolTag] = cloneableTags[dateTag] =\n  cloneableTags[float32Tag] = cloneableTags[float64Tag] =\n  cloneableTags[int8Tag] = cloneableTags[int16Tag] =\n  cloneableTags[int32Tag] = cloneableTags[mapTag] =\n  cloneableTags[numberTag] = cloneableTags[objectTag] =\n  cloneableTags[regexpTag] = cloneableTags[setTag] =\n  cloneableTags[stringTag] = cloneableTags[symbolTag] =\n  cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] =\n  cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;\n  cloneableTags[errorTag] = cloneableTags[funcTag] =\n  cloneableTags[weakMapTag] = false;\n\n  /** Used to map Latin Unicode letters to basic Latin letters. */\n  var deburredLetters = {\n    // Latin-1 Supplement block.\n    '\\xc0': 'A',  '\\xc1': 'A', '\\xc2': 'A', '\\xc3': 'A', '\\xc4': 'A', '\\xc5': 'A',\n    '\\xe0': 'a',  '\\xe1': 'a', '\\xe2': 'a', '\\xe3': 'a', '\\xe4': 'a', '\\xe5': 'a',\n    '\\xc7': 'C',  '\\xe7': 'c',\n    '\\xd0': 'D',  '\\xf0': 'd',\n    '\\xc8': 'E',  '\\xc9': 'E', '\\xca': 'E', '\\xcb': 'E',\n    '\\xe8': 'e',  '\\xe9': 'e', '\\xea': 'e', '\\xeb': 'e',\n    '\\xcc': 'I',  '\\xcd': 'I', '\\xce': 'I', '\\xcf': 'I',\n    '\\xec': 'i',  '\\xed': 'i', '\\xee': 'i', '\\xef': 'i',\n    '\\xd1': 'N',  '\\xf1': 'n',\n    '\\xd2': 'O',  '\\xd3': 'O', '\\xd4': 'O', '\\xd5': 'O', '\\xd6': 'O', '\\xd8': 'O',\n    '\\xf2': 'o',  '\\xf3': 'o', '\\xf4': 'o', '\\xf5': 'o', '\\xf6': 'o', '\\xf8': 'o',\n    '\\xd9': 'U',  '\\xda': 'U', '\\xdb': 'U', '\\xdc': 'U',\n    '\\xf9': 'u',  '\\xfa': 'u', '\\xfb': 'u', '\\xfc': 'u',\n    '\\xdd': 'Y',  '\\xfd': 'y', '\\xff': 'y',\n    '\\xc6': 'Ae', '\\xe6': 'ae',\n    '\\xde': 'Th', '\\xfe': 'th',\n    '\\xdf': 'ss',\n    // Latin Extended-A block.\n    '\\u0100': 'A',  '\\u0102': 'A', '\\u0104': 'A',\n    '\\u0101': 'a',  '\\u0103': 'a', '\\u0105': 'a',\n    '\\u0106': 'C',  '\\u0108': 'C', '\\u010a': 'C', '\\u010c': 'C',\n    '\\u0107': 'c',  '\\u0109': 'c', '\\u010b': 'c', '\\u010d': 'c',\n    '\\u010e': 'D',  '\\u0110': 'D', '\\u010f': 'd', '\\u0111': 'd',\n    '\\u0112': 'E',  '\\u0114': 'E', '\\u0116': 'E', '\\u0118': 'E', '\\u011a': 'E',\n    '\\u0113': 'e',  '\\u0115': 'e', '\\u0117': 'e', '\\u0119': 'e', '\\u011b': 'e',\n    '\\u011c': 'G',  '\\u011e': 'G', '\\u0120': 'G', '\\u0122': 'G',\n    '\\u011d': 'g',  '\\u011f': 'g', '\\u0121': 'g', '\\u0123': 'g',\n    '\\u0124': 'H',  '\\u0126': 'H', '\\u0125': 'h', '\\u0127': 'h',\n    '\\u0128': 'I',  '\\u012a': 'I', '\\u012c': 'I', '\\u012e': 'I', '\\u0130': 'I',\n    '\\u0129': 'i',  '\\u012b': 'i', '\\u012d': 'i', '\\u012f': 'i', '\\u0131': 'i',\n    '\\u0134': 'J',  '\\u0135': 'j',\n    '\\u0136': 'K',  '\\u0137': 'k', '\\u0138': 'k',\n    '\\u0139': 'L',  '\\u013b': 'L', '\\u013d': 'L', '\\u013f': 'L', '\\u0141': 'L',\n    '\\u013a': 'l',  '\\u013c': 'l', '\\u013e': 'l', '\\u0140': 'l', '\\u0142': 'l',\n    '\\u0143': 'N',  '\\u0145': 'N', '\\u0147': 'N', '\\u014a': 'N',\n    '\\u0144': 'n',  '\\u0146': 'n', '\\u0148': 'n', '\\u014b': 'n',\n    '\\u014c': 'O',  '\\u014e': 'O', '\\u0150': 'O',\n    '\\u014d': 'o',  '\\u014f': 'o', '\\u0151': 'o',\n    '\\u0154': 'R',  '\\u0156': 'R', '\\u0158': 'R',\n    '\\u0155': 'r',  '\\u0157': 'r', '\\u0159': 'r',\n    '\\u015a': 'S',  '\\u015c': 'S', '\\u015e': 'S', '\\u0160': 'S',\n    '\\u015b': 's',  '\\u015d': 's', '\\u015f': 's', '\\u0161': 's',\n    '\\u0162': 'T',  '\\u0164': 'T', '\\u0166': 'T',\n    '\\u0163': 't',  '\\u0165': 't', '\\u0167': 't',\n    '\\u0168': 'U',  '\\u016a': 'U', '\\u016c': 'U', '\\u016e': 'U', '\\u0170': 'U', '\\u0172': 'U',\n    '\\u0169': 'u',  '\\u016b': 'u', '\\u016d': 'u', '\\u016f': 'u', '\\u0171': 'u', '\\u0173': 'u',\n    '\\u0174': 'W',  '\\u0175': 'w',\n    '\\u0176': 'Y',  '\\u0177': 'y', '\\u0178': 'Y',\n    '\\u0179': 'Z',  '\\u017b': 'Z', '\\u017d': 'Z',\n    '\\u017a': 'z',  '\\u017c': 'z', '\\u017e': 'z',\n    '\\u0132': 'IJ', '\\u0133': 'ij',\n    '\\u0152': 'Oe', '\\u0153': 'oe',\n    '\\u0149': \"'n\", '\\u017f': 's'\n  };\n\n  /** Used to map characters to HTML entities. */\n  var htmlEscapes = {\n    '&': '&amp;',\n    '<': '&lt;',\n    '>': '&gt;',\n    '\"': '&quot;',\n    \"'\": '&#39;'\n  };\n\n  /** Used to map HTML entities to characters. */\n  var htmlUnescapes = {\n    '&amp;': '&',\n    '&lt;': '<',\n    '&gt;': '>',\n    '&quot;': '\"',\n    '&#39;': \"'\"\n  };\n\n  /** Used to escape characters for inclusion in compiled string literals. */\n  var stringEscapes = {\n    '\\\\': '\\\\',\n    \"'\": \"'\",\n    '\\n': 'n',\n    '\\r': 'r',\n    '\\u2028': 'u2028',\n    '\\u2029': 'u2029'\n  };\n\n  /** Built-in method references without a dependency on `root`. */\n  var freeParseFloat = parseFloat,\n      freeParseInt = parseInt;\n\n  /** Detect free variable `global` from Node.js. */\n  var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\n  /** Detect free variable `self`. */\n  var freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n  /** Used as a reference to the global object. */\n  var root = freeGlobal || freeSelf || Function('return this')();\n\n  /** Detect free variable `exports`. */\n  var freeExports =  true && exports && !exports.nodeType && exports;\n\n  /** Detect free variable `module`. */\n  var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n  /** Detect the popular CommonJS extension `module.exports`. */\n  var moduleExports = freeModule && freeModule.exports === freeExports;\n\n  /** Detect free variable `process` from Node.js. */\n  var freeProcess = moduleExports && freeGlobal.process;\n\n  /** Used to access faster Node.js helpers. */\n  var nodeUtil = (function() {\n    try {\n      // Use `util.types` for Node.js 10+.\n      var types = freeModule && freeModule.require && freeModule.require('util').types;\n\n      if (types) {\n        return types;\n      }\n\n      // Legacy `process.binding('util')` for Node.js < 10.\n      return freeProcess && freeProcess.binding && freeProcess.binding('util');\n    } catch (e) {}\n  }());\n\n  /* Node.js helper references. */\n  var nodeIsArrayBuffer = nodeUtil && nodeUtil.isArrayBuffer,\n      nodeIsDate = nodeUtil && nodeUtil.isDate,\n      nodeIsMap = nodeUtil && nodeUtil.isMap,\n      nodeIsRegExp = nodeUtil && nodeUtil.isRegExp,\n      nodeIsSet = nodeUtil && nodeUtil.isSet,\n      nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\n\n  /*--------------------------------------------------------------------------*/\n\n  /**\n   * A faster alternative to `Function#apply`, this function invokes `func`\n   * with the `this` binding of `thisArg` and the arguments of `args`.\n   *\n   * @private\n   * @param {Function} func The function to invoke.\n   * @param {*} thisArg The `this` binding of `func`.\n   * @param {Array} args The arguments to invoke `func` with.\n   * @returns {*} Returns the result of `func`.\n   */\n  function apply(func, thisArg, args) {\n    switch (args.length) {\n      case 0: return func.call(thisArg);\n      case 1: return func.call(thisArg, args[0]);\n      case 2: return func.call(thisArg, args[0], args[1]);\n      case 3: return func.call(thisArg, args[0], args[1], args[2]);\n    }\n    return func.apply(thisArg, args);\n  }\n\n  /**\n   * A specialized version of `baseAggregator` for arrays.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} setter The function to set `accumulator` values.\n   * @param {Function} iteratee The iteratee to transform keys.\n   * @param {Object} accumulator The initial aggregated object.\n   * @returns {Function} Returns `accumulator`.\n   */\n  function arrayAggregator(array, setter, iteratee, accumulator) {\n    var index = -1,\n        length = array == null ? 0 : array.length;\n\n    while (++index < length) {\n      var value = array[index];\n      setter(accumulator, value, iteratee(value), array);\n    }\n    return accumulator;\n  }\n\n  /**\n   * A specialized version of `_.forEach` for arrays without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {Array} Returns `array`.\n   */\n  function arrayEach(array, iteratee) {\n    var index = -1,\n        length = array == null ? 0 : array.length;\n\n    while (++index < length) {\n      if (iteratee(array[index], index, array) === false) {\n        break;\n      }\n    }\n    return array;\n  }\n\n  /**\n   * A specialized version of `_.forEachRight` for arrays without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {Array} Returns `array`.\n   */\n  function arrayEachRight(array, iteratee) {\n    var length = array == null ? 0 : array.length;\n\n    while (length--) {\n      if (iteratee(array[length], length, array) === false) {\n        break;\n      }\n    }\n    return array;\n  }\n\n  /**\n   * A specialized version of `_.every` for arrays without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} predicate The function invoked per iteration.\n   * @returns {boolean} Returns `true` if all elements pass the predicate check,\n   *  else `false`.\n   */\n  function arrayEvery(array, predicate) {\n    var index = -1,\n        length = array == null ? 0 : array.length;\n\n    while (++index < length) {\n      if (!predicate(array[index], index, array)) {\n        return false;\n      }\n    }\n    return true;\n  }\n\n  /**\n   * A specialized version of `_.filter` for arrays without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} predicate The function invoked per iteration.\n   * @returns {Array} Returns the new filtered array.\n   */\n  function arrayFilter(array, predicate) {\n    var index = -1,\n        length = array == null ? 0 : array.length,\n        resIndex = 0,\n        result = [];\n\n    while (++index < length) {\n      var value = array[index];\n      if (predicate(value, index, array)) {\n        result[resIndex++] = value;\n      }\n    }\n    return result;\n  }\n\n  /**\n   * A specialized version of `_.includes` for arrays without support for\n   * specifying an index to search from.\n   *\n   * @private\n   * @param {Array} [array] The array to inspect.\n   * @param {*} target The value to search for.\n   * @returns {boolean} Returns `true` if `target` is found, else `false`.\n   */\n  function arrayIncludes(array, value) {\n    var length = array == null ? 0 : array.length;\n    return !!length && baseIndexOf(array, value, 0) > -1;\n  }\n\n  /**\n   * This function is like `arrayIncludes` except that it accepts a comparator.\n   *\n   * @private\n   * @param {Array} [array] The array to inspect.\n   * @param {*} target The value to search for.\n   * @param {Function} comparator The comparator invoked per element.\n   * @returns {boolean} Returns `true` if `target` is found, else `false`.\n   */\n  function arrayIncludesWith(array, value, comparator) {\n    var index = -1,\n        length = array == null ? 0 : array.length;\n\n    while (++index < length) {\n      if (comparator(value, array[index])) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  /**\n   * A specialized version of `_.map` for arrays without support for iteratee\n   * shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {Array} Returns the new mapped array.\n   */\n  function arrayMap(array, iteratee) {\n    var index = -1,\n        length = array == null ? 0 : array.length,\n        result = Array(length);\n\n    while (++index < length) {\n      result[index] = iteratee(array[index], index, array);\n    }\n    return result;\n  }\n\n  /**\n   * Appends the elements of `values` to `array`.\n   *\n   * @private\n   * @param {Array} array The array to modify.\n   * @param {Array} values The values to append.\n   * @returns {Array} Returns `array`.\n   */\n  function arrayPush(array, values) {\n    var index = -1,\n        length = values.length,\n        offset = array.length;\n\n    while (++index < length) {\n      array[offset + index] = values[index];\n    }\n    return array;\n  }\n\n  /**\n   * A specialized version of `_.reduce` for arrays without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @param {*} [accumulator] The initial value.\n   * @param {boolean} [initAccum] Specify using the first element of `array` as\n   *  the initial value.\n   * @returns {*} Returns the accumulated value.\n   */\n  function arrayReduce(array, iteratee, accumulator, initAccum) {\n    var index = -1,\n        length = array == null ? 0 : array.length;\n\n    if (initAccum && length) {\n      accumulator = array[++index];\n    }\n    while (++index < length) {\n      accumulator = iteratee(accumulator, array[index], index, array);\n    }\n    return accumulator;\n  }\n\n  /**\n   * A specialized version of `_.reduceRight` for arrays without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @param {*} [accumulator] The initial value.\n   * @param {boolean} [initAccum] Specify using the last element of `array` as\n   *  the initial value.\n   * @returns {*} Returns the accumulated value.\n   */\n  function arrayReduceRight(array, iteratee, accumulator, initAccum) {\n    var length = array == null ? 0 : array.length;\n    if (initAccum && length) {\n      accumulator = array[--length];\n    }\n    while (length--) {\n      accumulator = iteratee(accumulator, array[length], length, array);\n    }\n    return accumulator;\n  }\n\n  /**\n   * A specialized version of `_.some` for arrays without support for iteratee\n   * shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} predicate The function invoked per iteration.\n   * @returns {boolean} Returns `true` if any element passes the predicate check,\n   *  else `false`.\n   */\n  function arraySome(array, predicate) {\n    var index = -1,\n        length = array == null ? 0 : array.length;\n\n    while (++index < length) {\n      if (predicate(array[index], index, array)) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  /**\n   * Gets the size of an ASCII `string`.\n   *\n   * @private\n   * @param {string} string The string inspect.\n   * @returns {number} Returns the string size.\n   */\n  var asciiSize = baseProperty('length');\n\n  /**\n   * Converts an ASCII `string` to an array.\n   *\n   * @private\n   * @param {string} string The string to convert.\n   * @returns {Array} Returns the converted array.\n   */\n  function asciiToArray(string) {\n    return string.split('');\n  }\n\n  /**\n   * Splits an ASCII `string` into an array of its words.\n   *\n   * @private\n   * @param {string} The string to inspect.\n   * @returns {Array} Returns the words of `string`.\n   */\n  function asciiWords(string) {\n    return string.match(reAsciiWord) || [];\n  }\n\n  /**\n   * The base implementation of methods like `_.findKey` and `_.findLastKey`,\n   * without support for iteratee shorthands, which iterates over `collection`\n   * using `eachFunc`.\n   *\n   * @private\n   * @param {Array|Object} collection The collection to inspect.\n   * @param {Function} predicate The function invoked per iteration.\n   * @param {Function} eachFunc The function to iterate over `collection`.\n   * @returns {*} Returns the found element or its key, else `undefined`.\n   */\n  function baseFindKey(collection, predicate, eachFunc) {\n    var result;\n    eachFunc(collection, function(value, key, collection) {\n      if (predicate(value, key, collection)) {\n        result = key;\n        return false;\n      }\n    });\n    return result;\n  }\n\n  /**\n   * The base implementation of `_.findIndex` and `_.findLastIndex` without\n   * support for iteratee shorthands.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {Function} predicate The function invoked per iteration.\n   * @param {number} fromIndex The index to search from.\n   * @param {boolean} [fromRight] Specify iterating from right to left.\n   * @returns {number} Returns the index of the matched value, else `-1`.\n   */\n  function baseFindIndex(array, predicate, fromIndex, fromRight) {\n    var length = array.length,\n        index = fromIndex + (fromRight ? 1 : -1);\n\n    while ((fromRight ? index-- : ++index < length)) {\n      if (predicate(array[index], index, array)) {\n        return index;\n      }\n    }\n    return -1;\n  }\n\n  /**\n   * The base implementation of `_.indexOf` without `fromIndex` bounds checks.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {*} value The value to search for.\n   * @param {number} fromIndex The index to search from.\n   * @returns {number} Returns the index of the matched value, else `-1`.\n   */\n  function baseIndexOf(array, value, fromIndex) {\n    return value === value\n      ? strictIndexOf(array, value, fromIndex)\n      : baseFindIndex(array, baseIsNaN, fromIndex);\n  }\n\n  /**\n   * This function is like `baseIndexOf` except that it accepts a comparator.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {*} value The value to search for.\n   * @param {number} fromIndex The index to search from.\n   * @param {Function} comparator The comparator invoked per element.\n   * @returns {number} Returns the index of the matched value, else `-1`.\n   */\n  function baseIndexOfWith(array, value, fromIndex, comparator) {\n    var index = fromIndex - 1,\n        length = array.length;\n\n    while (++index < length) {\n      if (comparator(array[index], value)) {\n        return index;\n      }\n    }\n    return -1;\n  }\n\n  /**\n   * The base implementation of `_.isNaN` without support for number objects.\n   *\n   * @private\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\n   */\n  function baseIsNaN(value) {\n    return value !== value;\n  }\n\n  /**\n   * The base implementation of `_.mean` and `_.meanBy` without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} array The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {number} Returns the mean.\n   */\n  function baseMean(array, iteratee) {\n    var length = array == null ? 0 : array.length;\n    return length ? (baseSum(array, iteratee) / length) : NAN;\n  }\n\n  /**\n   * The base implementation of `_.property` without support for deep paths.\n   *\n   * @private\n   * @param {string} key The key of the property to get.\n   * @returns {Function} Returns the new accessor function.\n   */\n  function baseProperty(key) {\n    return function(object) {\n      return object == null ? undefined : object[key];\n    };\n  }\n\n  /**\n   * The base implementation of `_.propertyOf` without support for deep paths.\n   *\n   * @private\n   * @param {Object} object The object to query.\n   * @returns {Function} Returns the new accessor function.\n   */\n  function basePropertyOf(object) {\n    return function(key) {\n      return object == null ? undefined : object[key];\n    };\n  }\n\n  /**\n   * The base implementation of `_.reduce` and `_.reduceRight`, without support\n   * for iteratee shorthands, which iterates over `collection` using `eachFunc`.\n   *\n   * @private\n   * @param {Array|Object} collection The collection to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @param {*} accumulator The initial value.\n   * @param {boolean} initAccum Specify using the first or last element of\n   *  `collection` as the initial value.\n   * @param {Function} eachFunc The function to iterate over `collection`.\n   * @returns {*} Returns the accumulated value.\n   */\n  function baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) {\n    eachFunc(collection, function(value, index, collection) {\n      accumulator = initAccum\n        ? (initAccum = false, value)\n        : iteratee(accumulator, value, index, collection);\n    });\n    return accumulator;\n  }\n\n  /**\n   * The base implementation of `_.sortBy` which uses `comparer` to define the\n   * sort order of `array` and replaces criteria objects with their corresponding\n   * values.\n   *\n   * @private\n   * @param {Array} array The array to sort.\n   * @param {Function} comparer The function to define sort order.\n   * @returns {Array} Returns `array`.\n   */\n  function baseSortBy(array, comparer) {\n    var length = array.length;\n\n    array.sort(comparer);\n    while (length--) {\n      array[length] = array[length].value;\n    }\n    return array;\n  }\n\n  /**\n   * The base implementation of `_.sum` and `_.sumBy` without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} array The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {number} Returns the sum.\n   */\n  function baseSum(array, iteratee) {\n    var result,\n        index = -1,\n        length = array.length;\n\n    while (++index < length) {\n      var current = iteratee(array[index]);\n      if (current !== undefined) {\n        result = result === undefined ? current : (result + current);\n      }\n    }\n    return result;\n  }\n\n  /**\n   * The base implementation of `_.times` without support for iteratee shorthands\n   * or max array length checks.\n   *\n   * @private\n   * @param {number} n The number of times to invoke `iteratee`.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {Array} Returns the array of results.\n   */\n  function baseTimes(n, iteratee) {\n    var index = -1,\n        result = Array(n);\n\n    while (++index < n) {\n      result[index] = iteratee(index);\n    }\n    return result;\n  }\n\n  /**\n   * The base implementation of `_.toPairs` and `_.toPairsIn` which creates an array\n   * of key-value pairs for `object` corresponding to the property names of `props`.\n   *\n   * @private\n   * @param {Object} object The object to query.\n   * @param {Array} props The property names to get values for.\n   * @returns {Object} Returns the key-value pairs.\n   */\n  function baseToPairs(object, props) {\n    return arrayMap(props, function(key) {\n      return [key, object[key]];\n    });\n  }\n\n  /**\n   * The base implementation of `_.trim`.\n   *\n   * @private\n   * @param {string} string The string to trim.\n   * @returns {string} Returns the trimmed string.\n   */\n  function baseTrim(string) {\n    return string\n      ? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart, '')\n      : string;\n  }\n\n  /**\n   * The base implementation of `_.unary` without support for storing metadata.\n   *\n   * @private\n   * @param {Function} func The function to cap arguments for.\n   * @returns {Function} Returns the new capped function.\n   */\n  function baseUnary(func) {\n    return function(value) {\n      return func(value);\n    };\n  }\n\n  /**\n   * The base implementation of `_.values` and `_.valuesIn` which creates an\n   * array of `object` property values corresponding to the property names\n   * of `props`.\n   *\n   * @private\n   * @param {Object} object The object to query.\n   * @param {Array} props The property names to get values for.\n   * @returns {Object} Returns the array of property values.\n   */\n  function baseValues(object, props) {\n    return arrayMap(props, function(key) {\n      return object[key];\n    });\n  }\n\n  /**\n   * Checks if a `cache` value for `key` exists.\n   *\n   * @private\n   * @param {Object} cache The cache to query.\n   * @param {string} key The key of the entry to check.\n   * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n   */\n  function cacheHas(cache, key) {\n    return cache.has(key);\n  }\n\n  /**\n   * Used by `_.trim` and `_.trimStart` to get the index of the first string symbol\n   * that is not found in the character symbols.\n   *\n   * @private\n   * @param {Array} strSymbols The string symbols to inspect.\n   * @param {Array} chrSymbols The character symbols to find.\n   * @returns {number} Returns the index of the first unmatched string symbol.\n   */\n  function charsStartIndex(strSymbols, chrSymbols) {\n    var index = -1,\n        length = strSymbols.length;\n\n    while (++index < length && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}\n    return index;\n  }\n\n  /**\n   * Used by `_.trim` and `_.trimEnd` to get the index of the last string symbol\n   * that is not found in the character symbols.\n   *\n   * @private\n   * @param {Array} strSymbols The string symbols to inspect.\n   * @param {Array} chrSymbols The character symbols to find.\n   * @returns {number} Returns the index of the last unmatched string symbol.\n   */\n  function charsEndIndex(strSymbols, chrSymbols) {\n    var index = strSymbols.length;\n\n    while (index-- && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}\n    return index;\n  }\n\n  /**\n   * Gets the number of `placeholder` occurrences in `array`.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {*} placeholder The placeholder to search for.\n   * @returns {number} Returns the placeholder count.\n   */\n  function countHolders(array, placeholder) {\n    var length = array.length,\n        result = 0;\n\n    while (length--) {\n      if (array[length] === placeholder) {\n        ++result;\n      }\n    }\n    return result;\n  }\n\n  /**\n   * Used by `_.deburr` to convert Latin-1 Supplement and Latin Extended-A\n   * letters to basic Latin letters.\n   *\n   * @private\n   * @param {string} letter The matched letter to deburr.\n   * @returns {string} Returns the deburred letter.\n   */\n  var deburrLetter = basePropertyOf(deburredLetters);\n\n  /**\n   * Used by `_.escape` to convert characters to HTML entities.\n   *\n   * @private\n   * @param {string} chr The matched character to escape.\n   * @returns {string} Returns the escaped character.\n   */\n  var escapeHtmlChar = basePropertyOf(htmlEscapes);\n\n  /**\n   * Used by `_.template` to escape characters for inclusion in compiled string literals.\n   *\n   * @private\n   * @param {string} chr The matched character to escape.\n   * @returns {string} Returns the escaped character.\n   */\n  function escapeStringChar(chr) {\n    return '\\\\' + stringEscapes[chr];\n  }\n\n  /**\n   * Gets the value at `key` of `object`.\n   *\n   * @private\n   * @param {Object} [object] The object to query.\n   * @param {string} key The key of the property to get.\n   * @returns {*} Returns the property value.\n   */\n  function getValue(object, key) {\n    return object == null ? undefined : object[key];\n  }\n\n  /**\n   * Checks if `string` contains Unicode symbols.\n   *\n   * @private\n   * @param {string} string The string to inspect.\n   * @returns {boolean} Returns `true` if a symbol is found, else `false`.\n   */\n  function hasUnicode(string) {\n    return reHasUnicode.test(string);\n  }\n\n  /**\n   * Checks if `string` contains a word composed of Unicode symbols.\n   *\n   * @private\n   * @param {string} string The string to inspect.\n   * @returns {boolean} Returns `true` if a word is found, else `false`.\n   */\n  function hasUnicodeWord(string) {\n    return reHasUnicodeWord.test(string);\n  }\n\n  /**\n   * Converts `iterator` to an array.\n   *\n   * @private\n   * @param {Object} iterator The iterator to convert.\n   * @returns {Array} Returns the converted array.\n   */\n  function iteratorToArray(iterator) {\n    var data,\n        result = [];\n\n    while (!(data = iterator.next()).done) {\n      result.push(data.value);\n    }\n    return result;\n  }\n\n  /**\n   * Converts `map` to its key-value pairs.\n   *\n   * @private\n   * @param {Object} map The map to convert.\n   * @returns {Array} Returns the key-value pairs.\n   */\n  function mapToArray(map) {\n    var index = -1,\n        result = Array(map.size);\n\n    map.forEach(function(value, key) {\n      result[++index] = [key, value];\n    });\n    return result;\n  }\n\n  /**\n   * Creates a unary function that invokes `func` with its argument transformed.\n   *\n   * @private\n   * @param {Function} func The function to wrap.\n   * @param {Function} transform The argument transform.\n   * @returns {Function} Returns the new function.\n   */\n  function overArg(func, transform) {\n    return function(arg) {\n      return func(transform(arg));\n    };\n  }\n\n  /**\n   * Replaces all `placeholder` elements in `array` with an internal placeholder\n   * and returns an array of their indexes.\n   *\n   * @private\n   * @param {Array} array The array to modify.\n   * @param {*} placeholder The placeholder to replace.\n   * @returns {Array} Returns the new array of placeholder indexes.\n   */\n  function replaceHolders(array, placeholder) {\n    var index = -1,\n        length = array.length,\n        resIndex = 0,\n        result = [];\n\n    while (++index < length) {\n      var value = array[index];\n      if (value === placeholder || value === PLACEHOLDER) {\n        array[index] = PLACEHOLDER;\n        result[resIndex++] = index;\n      }\n    }\n    return result;\n  }\n\n  /**\n   * Converts `set` to an array of its values.\n   *\n   * @private\n   * @param {Object} set The set to convert.\n   * @returns {Array} Returns the values.\n   */\n  function setToArray(set) {\n    var index = -1,\n        result = Array(set.size);\n\n    set.forEach(function(value) {\n      result[++index] = value;\n    });\n    return result;\n  }\n\n  /**\n   * Converts `set` to its value-value pairs.\n   *\n   * @private\n   * @param {Object} set The set to convert.\n   * @returns {Array} Returns the value-value pairs.\n   */\n  function setToPairs(set) {\n    var index = -1,\n        result = Array(set.size);\n\n    set.forEach(function(value) {\n      result[++index] = [value, value];\n    });\n    return result;\n  }\n\n  /**\n   * A specialized version of `_.indexOf` which performs strict equality\n   * comparisons of values, i.e. `===`.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {*} value The value to search for.\n   * @param {number} fromIndex The index to search from.\n   * @returns {number} Returns the index of the matched value, else `-1`.\n   */\n  function strictIndexOf(array, value, fromIndex) {\n    var index = fromIndex - 1,\n        length = array.length;\n\n    while (++index < length) {\n      if (array[index] === value) {\n        return index;\n      }\n    }\n    return -1;\n  }\n\n  /**\n   * A specialized version of `_.lastIndexOf` which performs strict equality\n   * comparisons of values, i.e. `===`.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {*} value The value to search for.\n   * @param {number} fromIndex The index to search from.\n   * @returns {number} Returns the index of the matched value, else `-1`.\n   */\n  function strictLastIndexOf(array, value, fromIndex) {\n    var index = fromIndex + 1;\n    while (index--) {\n      if (array[index] === value) {\n        return index;\n      }\n    }\n    return index;\n  }\n\n  /**\n   * Gets the number of symbols in `string`.\n   *\n   * @private\n   * @param {string} string The string to inspect.\n   * @returns {number} Returns the string size.\n   */\n  function stringSize(string) {\n    return hasUnicode(string)\n      ? unicodeSize(string)\n      : asciiSize(string);\n  }\n\n  /**\n   * Converts `string` to an array.\n   *\n   * @private\n   * @param {string} string The string to convert.\n   * @returns {Array} Returns the converted array.\n   */\n  function stringToArray(string) {\n    return hasUnicode(string)\n      ? unicodeToArray(string)\n      : asciiToArray(string);\n  }\n\n  /**\n   * Used by `_.trim` and `_.trimEnd` to get the index of the last non-whitespace\n   * character of `string`.\n   *\n   * @private\n   * @param {string} string The string to inspect.\n   * @returns {number} Returns the index of the last non-whitespace character.\n   */\n  function trimmedEndIndex(string) {\n    var index = string.length;\n\n    while (index-- && reWhitespace.test(string.charAt(index))) {}\n    return index;\n  }\n\n  /**\n   * Used by `_.unescape` to convert HTML entities to characters.\n   *\n   * @private\n   * @param {string} chr The matched character to unescape.\n   * @returns {string} Returns the unescaped character.\n   */\n  var unescapeHtmlChar = basePropertyOf(htmlUnescapes);\n\n  /**\n   * Gets the size of a Unicode `string`.\n   *\n   * @private\n   * @param {string} string The string inspect.\n   * @returns {number} Returns the string size.\n   */\n  function unicodeSize(string) {\n    var result = reUnicode.lastIndex = 0;\n    while (reUnicode.test(string)) {\n      ++result;\n    }\n    return result;\n  }\n\n  /**\n   * Converts a Unicode `string` to an array.\n   *\n   * @private\n   * @param {string} string The string to convert.\n   * @returns {Array} Returns the converted array.\n   */\n  function unicodeToArray(string) {\n    return string.match(reUnicode) || [];\n  }\n\n  /**\n   * Splits a Unicode `string` into an array of its words.\n   *\n   * @private\n   * @param {string} The string to inspect.\n   * @returns {Array} Returns the words of `string`.\n   */\n  function unicodeWords(string) {\n    return string.match(reUnicodeWord) || [];\n  }\n\n  /*--------------------------------------------------------------------------*/\n\n  /**\n   * Create a new pristine `lodash` function using the `context` object.\n   *\n   * @static\n   * @memberOf _\n   * @since 1.1.0\n   * @category Util\n   * @param {Object} [context=root] The context object.\n   * @returns {Function} Returns a new `lodash` function.\n   * @example\n   *\n   * _.mixin({ 'foo': _.constant('foo') });\n   *\n   * var lodash = _.runInContext();\n   * lodash.mixin({ 'bar': lodash.constant('bar') });\n   *\n   * _.isFunction(_.foo);\n   * // => true\n   * _.isFunction(_.bar);\n   * // => false\n   *\n   * lodash.isFunction(lodash.foo);\n   * // => false\n   * lodash.isFunction(lodash.bar);\n   * // => true\n   *\n   * // Create a suped-up `defer` in Node.js.\n   * var defer = _.runInContext({ 'setTimeout': setImmediate }).defer;\n   */\n  var runInContext = (function runInContext(context) {\n    context = context == null ? root : _.defaults(root.Object(), context, _.pick(root, contextProps));\n\n    /** Built-in constructor references. */\n    var Array = context.Array,\n        Date = context.Date,\n        Error = context.Error,\n        Function = context.Function,\n        Math = context.Math,\n        Object = context.Object,\n        RegExp = context.RegExp,\n        String = context.String,\n        TypeError = context.TypeError;\n\n    /** Used for built-in method references. */\n    var arrayProto = Array.prototype,\n        funcProto = Function.prototype,\n        objectProto = Object.prototype;\n\n    /** Used to detect overreaching core-js shims. */\n    var coreJsData = context['__core-js_shared__'];\n\n    /** Used to resolve the decompiled source of functions. */\n    var funcToString = funcProto.toString;\n\n    /** Used to check objects for own properties. */\n    var hasOwnProperty = objectProto.hasOwnProperty;\n\n    /** Used to generate unique IDs. */\n    var idCounter = 0;\n\n    /** Used to detect methods masquerading as native. */\n    var maskSrcKey = (function() {\n      var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n      return uid ? ('Symbol(src)_1.' + uid) : '';\n    }());\n\n    /**\n     * Used to resolve the\n     * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n     * of values.\n     */\n    var nativeObjectToString = objectProto.toString;\n\n    /** Used to infer the `Object` constructor. */\n    var objectCtorString = funcToString.call(Object);\n\n    /** Used to restore the original `_` reference in `_.noConflict`. */\n    var oldDash = root._;\n\n    /** Used to detect if a method is native. */\n    var reIsNative = RegExp('^' +\n      funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n      .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n    );\n\n    /** Built-in value references. */\n    var Buffer = moduleExports ? context.Buffer : undefined,\n        Symbol = context.Symbol,\n        Uint8Array = context.Uint8Array,\n        allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined,\n        getPrototype = overArg(Object.getPrototypeOf, Object),\n        objectCreate = Object.create,\n        propertyIsEnumerable = objectProto.propertyIsEnumerable,\n        splice = arrayProto.splice,\n        spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined,\n        symIterator = Symbol ? Symbol.iterator : undefined,\n        symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n    var defineProperty = (function() {\n      try {\n        var func = getNative(Object, 'defineProperty');\n        func({}, '', {});\n        return func;\n      } catch (e) {}\n    }());\n\n    /** Mocked built-ins. */\n    var ctxClearTimeout = context.clearTimeout !== root.clearTimeout && context.clearTimeout,\n        ctxNow = Date && Date.now !== root.Date.now && Date.now,\n        ctxSetTimeout = context.setTimeout !== root.setTimeout && context.setTimeout;\n\n    /* Built-in method references for those with the same name as other `lodash` methods. */\n    var nativeCeil = Math.ceil,\n        nativeFloor = Math.floor,\n        nativeGetSymbols = Object.getOwnPropertySymbols,\n        nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined,\n        nativeIsFinite = context.isFinite,\n        nativeJoin = arrayProto.join,\n        nativeKeys = overArg(Object.keys, Object),\n        nativeMax = Math.max,\n        nativeMin = Math.min,\n        nativeNow = Date.now,\n        nativeParseInt = context.parseInt,\n        nativeRandom = Math.random,\n        nativeReverse = arrayProto.reverse;\n\n    /* Built-in method references that are verified to be native. */\n    var DataView = getNative(context, 'DataView'),\n        Map = getNative(context, 'Map'),\n        Promise = getNative(context, 'Promise'),\n        Set = getNative(context, 'Set'),\n        WeakMap = getNative(context, 'WeakMap'),\n        nativeCreate = getNative(Object, 'create');\n\n    /** Used to store function metadata. */\n    var metaMap = WeakMap && new WeakMap;\n\n    /** Used to lookup unminified function names. */\n    var realNames = {};\n\n    /** Used to detect maps, sets, and weakmaps. */\n    var dataViewCtorString = toSource(DataView),\n        mapCtorString = toSource(Map),\n        promiseCtorString = toSource(Promise),\n        setCtorString = toSource(Set),\n        weakMapCtorString = toSource(WeakMap);\n\n    /** Used to convert symbols to primitives and strings. */\n    var symbolProto = Symbol ? Symbol.prototype : undefined,\n        symbolValueOf = symbolProto ? symbolProto.valueOf : undefined,\n        symbolToString = symbolProto ? symbolProto.toString : undefined;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a `lodash` object which wraps `value` to enable implicit method\n     * chain sequences. Methods that operate on and return arrays, collections,\n     * and functions can be chained together. Methods that retrieve a single value\n     * or may return a primitive value will automatically end the chain sequence\n     * and return the unwrapped value. Otherwise, the value must be unwrapped\n     * with `_#value`.\n     *\n     * Explicit chain sequences, which must be unwrapped with `_#value`, may be\n     * enabled using `_.chain`.\n     *\n     * The execution of chained methods is lazy, that is, it's deferred until\n     * `_#value` is implicitly or explicitly called.\n     *\n     * Lazy evaluation allows several methods to support shortcut fusion.\n     * Shortcut fusion is an optimization to merge iteratee calls; this avoids\n     * the creation of intermediate arrays and can greatly reduce the number of\n     * iteratee executions. Sections of a chain sequence qualify for shortcut\n     * fusion if the section is applied to an array and iteratees accept only\n     * one argument. The heuristic for whether a section qualifies for shortcut\n     * fusion is subject to change.\n     *\n     * Chaining is supported in custom builds as long as the `_#value` method is\n     * directly or indirectly included in the build.\n     *\n     * In addition to lodash methods, wrappers have `Array` and `String` methods.\n     *\n     * The wrapper `Array` methods are:\n     * `concat`, `join`, `pop`, `push`, `shift`, `sort`, `splice`, and `unshift`\n     *\n     * The wrapper `String` methods are:\n     * `replace` and `split`\n     *\n     * The wrapper methods that support shortcut fusion are:\n     * `at`, `compact`, `drop`, `dropRight`, `dropWhile`, `filter`, `find`,\n     * `findLast`, `head`, `initial`, `last`, `map`, `reject`, `reverse`, `slice`,\n     * `tail`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, and `toArray`\n     *\n     * The chainable wrapper methods are:\n     * `after`, `ary`, `assign`, `assignIn`, `assignInWith`, `assignWith`, `at`,\n     * `before`, `bind`, `bindAll`, `bindKey`, `castArray`, `chain`, `chunk`,\n     * `commit`, `compact`, `concat`, `conforms`, `constant`, `countBy`, `create`,\n     * `curry`, `debounce`, `defaults`, `defaultsDeep`, `defer`, `delay`,\n     * `difference`, `differenceBy`, `differenceWith`, `drop`, `dropRight`,\n     * `dropRightWhile`, `dropWhile`, `extend`, `extendWith`, `fill`, `filter`,\n     * `flatMap`, `flatMapDeep`, `flatMapDepth`, `flatten`, `flattenDeep`,\n     * `flattenDepth`, `flip`, `flow`, `flowRight`, `fromPairs`, `functions`,\n     * `functionsIn`, `groupBy`, `initial`, `intersection`, `intersectionBy`,\n     * `intersectionWith`, `invert`, `invertBy`, `invokeMap`, `iteratee`, `keyBy`,\n     * `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, `matchesProperty`,\n     * `memoize`, `merge`, `mergeWith`, `method`, `methodOf`, `mixin`, `negate`,\n     * `nthArg`, `omit`, `omitBy`, `once`, `orderBy`, `over`, `overArgs`,\n     * `overEvery`, `overSome`, `partial`, `partialRight`, `partition`, `pick`,\n     * `pickBy`, `plant`, `property`, `propertyOf`, `pull`, `pullAll`, `pullAllBy`,\n     * `pullAllWith`, `pullAt`, `push`, `range`, `rangeRight`, `rearg`, `reject`,\n     * `remove`, `rest`, `reverse`, `sampleSize`, `set`, `setWith`, `shuffle`,\n     * `slice`, `sort`, `sortBy`, `splice`, `spread`, `tail`, `take`, `takeRight`,\n     * `takeRightWhile`, `takeWhile`, `tap`, `throttle`, `thru`, `toArray`,\n     * `toPairs`, `toPairsIn`, `toPath`, `toPlainObject`, `transform`, `unary`,\n     * `union`, `unionBy`, `unionWith`, `uniq`, `uniqBy`, `uniqWith`, `unset`,\n     * `unshift`, `unzip`, `unzipWith`, `update`, `updateWith`, `values`,\n     * `valuesIn`, `without`, `wrap`, `xor`, `xorBy`, `xorWith`, `zip`,\n     * `zipObject`, `zipObjectDeep`, and `zipWith`\n     *\n     * The wrapper methods that are **not** chainable by default are:\n     * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`,\n     * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `conformsTo`, `deburr`,\n     * `defaultTo`, `divide`, `each`, `eachRight`, `endsWith`, `eq`, `escape`,\n     * `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, `findLast`,\n     * `findLastIndex`, `findLastKey`, `first`, `floor`, `forEach`, `forEachRight`,\n     * `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`,\n     * `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`,\n     * `isArguments`, `isArray`, `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`,\n     * `isBoolean`, `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`,\n     * `isEqualWith`, `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`,\n     * `isMap`, `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`,\n     * `isNumber`, `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`,\n     * `isSafeInteger`, `isSet`, `isString`, `isUndefined`, `isTypedArray`,\n     * `isWeakMap`, `isWeakSet`, `join`, `kebabCase`, `last`, `lastIndexOf`,\n     * `lowerCase`, `lowerFirst`, `lt`, `lte`, `max`, `maxBy`, `mean`, `meanBy`,\n     * `min`, `minBy`, `multiply`, `noConflict`, `noop`, `now`, `nth`, `pad`,\n     * `padEnd`, `padStart`, `parseInt`, `pop`, `random`, `reduce`, `reduceRight`,\n     * `repeat`, `result`, `round`, `runInContext`, `sample`, `shift`, `size`,\n     * `snakeCase`, `some`, `sortedIndex`, `sortedIndexBy`, `sortedLastIndex`,\n     * `sortedLastIndexBy`, `startCase`, `startsWith`, `stubArray`, `stubFalse`,\n     * `stubObject`, `stubString`, `stubTrue`, `subtract`, `sum`, `sumBy`,\n     * `template`, `times`, `toFinite`, `toInteger`, `toJSON`, `toLength`,\n     * `toLower`, `toNumber`, `toSafeInteger`, `toString`, `toUpper`, `trim`,\n     * `trimEnd`, `trimStart`, `truncate`, `unescape`, `uniqueId`, `upperCase`,\n     * `upperFirst`, `value`, and `words`\n     *\n     * @name _\n     * @constructor\n     * @category Seq\n     * @param {*} value The value to wrap in a `lodash` instance.\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * var wrapped = _([1, 2, 3]);\n     *\n     * // Returns an unwrapped value.\n     * wrapped.reduce(_.add);\n     * // => 6\n     *\n     * // Returns a wrapped value.\n     * var squares = wrapped.map(square);\n     *\n     * _.isArray(squares);\n     * // => false\n     *\n     * _.isArray(squares.value());\n     * // => true\n     */\n    function lodash(value) {\n      if (isObjectLike(value) && !isArray(value) && !(value instanceof LazyWrapper)) {\n        if (value instanceof LodashWrapper) {\n          return value;\n        }\n        if (hasOwnProperty.call(value, '__wrapped__')) {\n          return wrapperClone(value);\n        }\n      }\n      return new LodashWrapper(value);\n    }\n\n    /**\n     * The base implementation of `_.create` without support for assigning\n     * properties to the created object.\n     *\n     * @private\n     * @param {Object} proto The object to inherit from.\n     * @returns {Object} Returns the new object.\n     */\n    var baseCreate = (function() {\n      function object() {}\n      return function(proto) {\n        if (!isObject(proto)) {\n          return {};\n        }\n        if (objectCreate) {\n          return objectCreate(proto);\n        }\n        object.prototype = proto;\n        var result = new object;\n        object.prototype = undefined;\n        return result;\n      };\n    }());\n\n    /**\n     * The function whose prototype chain sequence wrappers inherit from.\n     *\n     * @private\n     */\n    function baseLodash() {\n      // No operation performed.\n    }\n\n    /**\n     * The base constructor for creating `lodash` wrapper objects.\n     *\n     * @private\n     * @param {*} value The value to wrap.\n     * @param {boolean} [chainAll] Enable explicit method chain sequences.\n     */\n    function LodashWrapper(value, chainAll) {\n      this.__wrapped__ = value;\n      this.__actions__ = [];\n      this.__chain__ = !!chainAll;\n      this.__index__ = 0;\n      this.__values__ = undefined;\n    }\n\n    /**\n     * By default, the template delimiters used by lodash are like those in\n     * embedded Ruby (ERB) as well as ES2015 template strings. Change the\n     * following template settings to use alternative delimiters.\n     *\n     * @static\n     * @memberOf _\n     * @type {Object}\n     */\n    lodash.templateSettings = {\n\n      /**\n       * Used to detect `data` property values to be HTML-escaped.\n       *\n       * @memberOf _.templateSettings\n       * @type {RegExp}\n       */\n      'escape': reEscape,\n\n      /**\n       * Used to detect code to be evaluated.\n       *\n       * @memberOf _.templateSettings\n       * @type {RegExp}\n       */\n      'evaluate': reEvaluate,\n\n      /**\n       * Used to detect `data` property values to inject.\n       *\n       * @memberOf _.templateSettings\n       * @type {RegExp}\n       */\n      'interpolate': reInterpolate,\n\n      /**\n       * Used to reference the data object in the template text.\n       *\n       * @memberOf _.templateSettings\n       * @type {string}\n       */\n      'variable': '',\n\n      /**\n       * Used to import variables into the compiled template.\n       *\n       * @memberOf _.templateSettings\n       * @type {Object}\n       */\n      'imports': {\n\n        /**\n         * A reference to the `lodash` function.\n         *\n         * @memberOf _.templateSettings.imports\n         * @type {Function}\n         */\n        '_': lodash\n      }\n    };\n\n    // Ensure wrappers are instances of `baseLodash`.\n    lodash.prototype = baseLodash.prototype;\n    lodash.prototype.constructor = lodash;\n\n    LodashWrapper.prototype = baseCreate(baseLodash.prototype);\n    LodashWrapper.prototype.constructor = LodashWrapper;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a lazy wrapper object which wraps `value` to enable lazy evaluation.\n     *\n     * @private\n     * @constructor\n     * @param {*} value The value to wrap.\n     */\n    function LazyWrapper(value) {\n      this.__wrapped__ = value;\n      this.__actions__ = [];\n      this.__dir__ = 1;\n      this.__filtered__ = false;\n      this.__iteratees__ = [];\n      this.__takeCount__ = MAX_ARRAY_LENGTH;\n      this.__views__ = [];\n    }\n\n    /**\n     * Creates a clone of the lazy wrapper object.\n     *\n     * @private\n     * @name clone\n     * @memberOf LazyWrapper\n     * @returns {Object} Returns the cloned `LazyWrapper` object.\n     */\n    function lazyClone() {\n      var result = new LazyWrapper(this.__wrapped__);\n      result.__actions__ = copyArray(this.__actions__);\n      result.__dir__ = this.__dir__;\n      result.__filtered__ = this.__filtered__;\n      result.__iteratees__ = copyArray(this.__iteratees__);\n      result.__takeCount__ = this.__takeCount__;\n      result.__views__ = copyArray(this.__views__);\n      return result;\n    }\n\n    /**\n     * Reverses the direction of lazy iteration.\n     *\n     * @private\n     * @name reverse\n     * @memberOf LazyWrapper\n     * @returns {Object} Returns the new reversed `LazyWrapper` object.\n     */\n    function lazyReverse() {\n      if (this.__filtered__) {\n        var result = new LazyWrapper(this);\n        result.__dir__ = -1;\n        result.__filtered__ = true;\n      } else {\n        result = this.clone();\n        result.__dir__ *= -1;\n      }\n      return result;\n    }\n\n    /**\n     * Extracts the unwrapped value from its lazy wrapper.\n     *\n     * @private\n     * @name value\n     * @memberOf LazyWrapper\n     * @returns {*} Returns the unwrapped value.\n     */\n    function lazyValue() {\n      var array = this.__wrapped__.value(),\n          dir = this.__dir__,\n          isArr = isArray(array),\n          isRight = dir < 0,\n          arrLength = isArr ? array.length : 0,\n          view = getView(0, arrLength, this.__views__),\n          start = view.start,\n          end = view.end,\n          length = end - start,\n          index = isRight ? end : (start - 1),\n          iteratees = this.__iteratees__,\n          iterLength = iteratees.length,\n          resIndex = 0,\n          takeCount = nativeMin(length, this.__takeCount__);\n\n      if (!isArr || (!isRight && arrLength == length && takeCount == length)) {\n        return baseWrapperValue(array, this.__actions__);\n      }\n      var result = [];\n\n      outer:\n      while (length-- && resIndex < takeCount) {\n        index += dir;\n\n        var iterIndex = -1,\n            value = array[index];\n\n        while (++iterIndex < iterLength) {\n          var data = iteratees[iterIndex],\n              iteratee = data.iteratee,\n              type = data.type,\n              computed = iteratee(value);\n\n          if (type == LAZY_MAP_FLAG) {\n            value = computed;\n          } else if (!computed) {\n            if (type == LAZY_FILTER_FLAG) {\n              continue outer;\n            } else {\n              break outer;\n            }\n          }\n        }\n        result[resIndex++] = value;\n      }\n      return result;\n    }\n\n    // Ensure `LazyWrapper` is an instance of `baseLodash`.\n    LazyWrapper.prototype = baseCreate(baseLodash.prototype);\n    LazyWrapper.prototype.constructor = LazyWrapper;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a hash object.\n     *\n     * @private\n     * @constructor\n     * @param {Array} [entries] The key-value pairs to cache.\n     */\n    function Hash(entries) {\n      var index = -1,\n          length = entries == null ? 0 : entries.length;\n\n      this.clear();\n      while (++index < length) {\n        var entry = entries[index];\n        this.set(entry[0], entry[1]);\n      }\n    }\n\n    /**\n     * Removes all key-value entries from the hash.\n     *\n     * @private\n     * @name clear\n     * @memberOf Hash\n     */\n    function hashClear() {\n      this.__data__ = nativeCreate ? nativeCreate(null) : {};\n      this.size = 0;\n    }\n\n    /**\n     * Removes `key` and its value from the hash.\n     *\n     * @private\n     * @name delete\n     * @memberOf Hash\n     * @param {Object} hash The hash to modify.\n     * @param {string} key The key of the value to remove.\n     * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n     */\n    function hashDelete(key) {\n      var result = this.has(key) && delete this.__data__[key];\n      this.size -= result ? 1 : 0;\n      return result;\n    }\n\n    /**\n     * Gets the hash value for `key`.\n     *\n     * @private\n     * @name get\n     * @memberOf Hash\n     * @param {string} key The key of the value to get.\n     * @returns {*} Returns the entry value.\n     */\n    function hashGet(key) {\n      var data = this.__data__;\n      if (nativeCreate) {\n        var result = data[key];\n        return result === HASH_UNDEFINED ? undefined : result;\n      }\n      return hasOwnProperty.call(data, key) ? data[key] : undefined;\n    }\n\n    /**\n     * Checks if a hash value for `key` exists.\n     *\n     * @private\n     * @name has\n     * @memberOf Hash\n     * @param {string} key The key of the entry to check.\n     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n     */\n    function hashHas(key) {\n      var data = this.__data__;\n      return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);\n    }\n\n    /**\n     * Sets the hash `key` to `value`.\n     *\n     * @private\n     * @name set\n     * @memberOf Hash\n     * @param {string} key The key of the value to set.\n     * @param {*} value The value to set.\n     * @returns {Object} Returns the hash instance.\n     */\n    function hashSet(key, value) {\n      var data = this.__data__;\n      this.size += this.has(key) ? 0 : 1;\n      data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n      return this;\n    }\n\n    // Add methods to `Hash`.\n    Hash.prototype.clear = hashClear;\n    Hash.prototype['delete'] = hashDelete;\n    Hash.prototype.get = hashGet;\n    Hash.prototype.has = hashHas;\n    Hash.prototype.set = hashSet;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates an list cache object.\n     *\n     * @private\n     * @constructor\n     * @param {Array} [entries] The key-value pairs to cache.\n     */\n    function ListCache(entries) {\n      var index = -1,\n          length = entries == null ? 0 : entries.length;\n\n      this.clear();\n      while (++index < length) {\n        var entry = entries[index];\n        this.set(entry[0], entry[1]);\n      }\n    }\n\n    /**\n     * Removes all key-value entries from the list cache.\n     *\n     * @private\n     * @name clear\n     * @memberOf ListCache\n     */\n    function listCacheClear() {\n      this.__data__ = [];\n      this.size = 0;\n    }\n\n    /**\n     * Removes `key` and its value from the list cache.\n     *\n     * @private\n     * @name delete\n     * @memberOf ListCache\n     * @param {string} key The key of the value to remove.\n     * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n     */\n    function listCacheDelete(key) {\n      var data = this.__data__,\n          index = assocIndexOf(data, key);\n\n      if (index < 0) {\n        return false;\n      }\n      var lastIndex = data.length - 1;\n      if (index == lastIndex) {\n        data.pop();\n      } else {\n        splice.call(data, index, 1);\n      }\n      --this.size;\n      return true;\n    }\n\n    /**\n     * Gets the list cache value for `key`.\n     *\n     * @private\n     * @name get\n     * @memberOf ListCache\n     * @param {string} key The key of the value to get.\n     * @returns {*} Returns the entry value.\n     */\n    function listCacheGet(key) {\n      var data = this.__data__,\n          index = assocIndexOf(data, key);\n\n      return index < 0 ? undefined : data[index][1];\n    }\n\n    /**\n     * Checks if a list cache value for `key` exists.\n     *\n     * @private\n     * @name has\n     * @memberOf ListCache\n     * @param {string} key The key of the entry to check.\n     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n     */\n    function listCacheHas(key) {\n      return assocIndexOf(this.__data__, key) > -1;\n    }\n\n    /**\n     * Sets the list cache `key` to `value`.\n     *\n     * @private\n     * @name set\n     * @memberOf ListCache\n     * @param {string} key The key of the value to set.\n     * @param {*} value The value to set.\n     * @returns {Object} Returns the list cache instance.\n     */\n    function listCacheSet(key, value) {\n      var data = this.__data__,\n          index = assocIndexOf(data, key);\n\n      if (index < 0) {\n        ++this.size;\n        data.push([key, value]);\n      } else {\n        data[index][1] = value;\n      }\n      return this;\n    }\n\n    // Add methods to `ListCache`.\n    ListCache.prototype.clear = listCacheClear;\n    ListCache.prototype['delete'] = listCacheDelete;\n    ListCache.prototype.get = listCacheGet;\n    ListCache.prototype.has = listCacheHas;\n    ListCache.prototype.set = listCacheSet;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a map cache object to store key-value pairs.\n     *\n     * @private\n     * @constructor\n     * @param {Array} [entries] The key-value pairs to cache.\n     */\n    function MapCache(entries) {\n      var index = -1,\n          length = entries == null ? 0 : entries.length;\n\n      this.clear();\n      while (++index < length) {\n        var entry = entries[index];\n        this.set(entry[0], entry[1]);\n      }\n    }\n\n    /**\n     * Removes all key-value entries from the map.\n     *\n     * @private\n     * @name clear\n     * @memberOf MapCache\n     */\n    function mapCacheClear() {\n      this.size = 0;\n      this.__data__ = {\n        'hash': new Hash,\n        'map': new (Map || ListCache),\n        'string': new Hash\n      };\n    }\n\n    /**\n     * Removes `key` and its value from the map.\n     *\n     * @private\n     * @name delete\n     * @memberOf MapCache\n     * @param {string} key The key of the value to remove.\n     * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n     */\n    function mapCacheDelete(key) {\n      var result = getMapData(this, key)['delete'](key);\n      this.size -= result ? 1 : 0;\n      return result;\n    }\n\n    /**\n     * Gets the map value for `key`.\n     *\n     * @private\n     * @name get\n     * @memberOf MapCache\n     * @param {string} key The key of the value to get.\n     * @returns {*} Returns the entry value.\n     */\n    function mapCacheGet(key) {\n      return getMapData(this, key).get(key);\n    }\n\n    /**\n     * Checks if a map value for `key` exists.\n     *\n     * @private\n     * @name has\n     * @memberOf MapCache\n     * @param {string} key The key of the entry to check.\n     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n     */\n    function mapCacheHas(key) {\n      return getMapData(this, key).has(key);\n    }\n\n    /**\n     * Sets the map `key` to `value`.\n     *\n     * @private\n     * @name set\n     * @memberOf MapCache\n     * @param {string} key The key of the value to set.\n     * @param {*} value The value to set.\n     * @returns {Object} Returns the map cache instance.\n     */\n    function mapCacheSet(key, value) {\n      var data = getMapData(this, key),\n          size = data.size;\n\n      data.set(key, value);\n      this.size += data.size == size ? 0 : 1;\n      return this;\n    }\n\n    // Add methods to `MapCache`.\n    MapCache.prototype.clear = mapCacheClear;\n    MapCache.prototype['delete'] = mapCacheDelete;\n    MapCache.prototype.get = mapCacheGet;\n    MapCache.prototype.has = mapCacheHas;\n    MapCache.prototype.set = mapCacheSet;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     *\n     * Creates an array cache object to store unique values.\n     *\n     * @private\n     * @constructor\n     * @param {Array} [values] The values to cache.\n     */\n    function SetCache(values) {\n      var index = -1,\n          length = values == null ? 0 : values.length;\n\n      this.__data__ = new MapCache;\n      while (++index < length) {\n        this.add(values[index]);\n      }\n    }\n\n    /**\n     * Adds `value` to the array cache.\n     *\n     * @private\n     * @name add\n     * @memberOf SetCache\n     * @alias push\n     * @param {*} value The value to cache.\n     * @returns {Object} Returns the cache instance.\n     */\n    function setCacheAdd(value) {\n      this.__data__.set(value, HASH_UNDEFINED);\n      return this;\n    }\n\n    /**\n     * Checks if `value` is in the array cache.\n     *\n     * @private\n     * @name has\n     * @memberOf SetCache\n     * @param {*} value The value to search for.\n     * @returns {number} Returns `true` if `value` is found, else `false`.\n     */\n    function setCacheHas(value) {\n      return this.__data__.has(value);\n    }\n\n    // Add methods to `SetCache`.\n    SetCache.prototype.add = SetCache.prototype.push = setCacheAdd;\n    SetCache.prototype.has = setCacheHas;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a stack cache object to store key-value pairs.\n     *\n     * @private\n     * @constructor\n     * @param {Array} [entries] The key-value pairs to cache.\n     */\n    function Stack(entries) {\n      var data = this.__data__ = new ListCache(entries);\n      this.size = data.size;\n    }\n\n    /**\n     * Removes all key-value entries from the stack.\n     *\n     * @private\n     * @name clear\n     * @memberOf Stack\n     */\n    function stackClear() {\n      this.__data__ = new ListCache;\n      this.size = 0;\n    }\n\n    /**\n     * Removes `key` and its value from the stack.\n     *\n     * @private\n     * @name delete\n     * @memberOf Stack\n     * @param {string} key The key of the value to remove.\n     * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n     */\n    function stackDelete(key) {\n      var data = this.__data__,\n          result = data['delete'](key);\n\n      this.size = data.size;\n      return result;\n    }\n\n    /**\n     * Gets the stack value for `key`.\n     *\n     * @private\n     * @name get\n     * @memberOf Stack\n     * @param {string} key The key of the value to get.\n     * @returns {*} Returns the entry value.\n     */\n    function stackGet(key) {\n      return this.__data__.get(key);\n    }\n\n    /**\n     * Checks if a stack value for `key` exists.\n     *\n     * @private\n     * @name has\n     * @memberOf Stack\n     * @param {string} key The key of the entry to check.\n     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n     */\n    function stackHas(key) {\n      return this.__data__.has(key);\n    }\n\n    /**\n     * Sets the stack `key` to `value`.\n     *\n     * @private\n     * @name set\n     * @memberOf Stack\n     * @param {string} key The key of the value to set.\n     * @param {*} value The value to set.\n     * @returns {Object} Returns the stack cache instance.\n     */\n    function stackSet(key, value) {\n      var data = this.__data__;\n      if (data instanceof ListCache) {\n        var pairs = data.__data__;\n        if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {\n          pairs.push([key, value]);\n          this.size = ++data.size;\n          return this;\n        }\n        data = this.__data__ = new MapCache(pairs);\n      }\n      data.set(key, value);\n      this.size = data.size;\n      return this;\n    }\n\n    // Add methods to `Stack`.\n    Stack.prototype.clear = stackClear;\n    Stack.prototype['delete'] = stackDelete;\n    Stack.prototype.get = stackGet;\n    Stack.prototype.has = stackHas;\n    Stack.prototype.set = stackSet;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates an array of the enumerable property names of the array-like `value`.\n     *\n     * @private\n     * @param {*} value The value to query.\n     * @param {boolean} inherited Specify returning inherited property names.\n     * @returns {Array} Returns the array of property names.\n     */\n    function arrayLikeKeys(value, inherited) {\n      var isArr = isArray(value),\n          isArg = !isArr && isArguments(value),\n          isBuff = !isArr && !isArg && isBuffer(value),\n          isType = !isArr && !isArg && !isBuff && isTypedArray(value),\n          skipIndexes = isArr || isArg || isBuff || isType,\n          result = skipIndexes ? baseTimes(value.length, String) : [],\n          length = result.length;\n\n      for (var key in value) {\n        if ((inherited || hasOwnProperty.call(value, key)) &&\n            !(skipIndexes && (\n               // Safari 9 has enumerable `arguments.length` in strict mode.\n               key == 'length' ||\n               // Node.js 0.10 has enumerable non-index properties on buffers.\n               (isBuff && (key == 'offset' || key == 'parent')) ||\n               // PhantomJS 2 has enumerable non-index properties on typed arrays.\n               (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||\n               // Skip index properties.\n               isIndex(key, length)\n            ))) {\n          result.push(key);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * A specialized version of `_.sample` for arrays.\n     *\n     * @private\n     * @param {Array} array The array to sample.\n     * @returns {*} Returns the random element.\n     */\n    function arraySample(array) {\n      var length = array.length;\n      return length ? array[baseRandom(0, length - 1)] : undefined;\n    }\n\n    /**\n     * A specialized version of `_.sampleSize` for arrays.\n     *\n     * @private\n     * @param {Array} array The array to sample.\n     * @param {number} n The number of elements to sample.\n     * @returns {Array} Returns the random elements.\n     */\n    function arraySampleSize(array, n) {\n      return shuffleSelf(copyArray(array), baseClamp(n, 0, array.length));\n    }\n\n    /**\n     * A specialized version of `_.shuffle` for arrays.\n     *\n     * @private\n     * @param {Array} array The array to shuffle.\n     * @returns {Array} Returns the new shuffled array.\n     */\n    function arrayShuffle(array) {\n      return shuffleSelf(copyArray(array));\n    }\n\n    /**\n     * This function is like `assignValue` except that it doesn't assign\n     * `undefined` values.\n     *\n     * @private\n     * @param {Object} object The object to modify.\n     * @param {string} key The key of the property to assign.\n     * @param {*} value The value to assign.\n     */\n    function assignMergeValue(object, key, value) {\n      if ((value !== undefined && !eq(object[key], value)) ||\n          (value === undefined && !(key in object))) {\n        baseAssignValue(object, key, value);\n      }\n    }\n\n    /**\n     * Assigns `value` to `key` of `object` if the existing value is not equivalent\n     * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons.\n     *\n     * @private\n     * @param {Object} object The object to modify.\n     * @param {string} key The key of the property to assign.\n     * @param {*} value The value to assign.\n     */\n    function assignValue(object, key, value) {\n      var objValue = object[key];\n      if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||\n          (value === undefined && !(key in object))) {\n        baseAssignValue(object, key, value);\n      }\n    }\n\n    /**\n     * Gets the index at which the `key` is found in `array` of key-value pairs.\n     *\n     * @private\n     * @param {Array} array The array to inspect.\n     * @param {*} key The key to search for.\n     * @returns {number} Returns the index of the matched value, else `-1`.\n     */\n    function assocIndexOf(array, key) {\n      var length = array.length;\n      while (length--) {\n        if (eq(array[length][0], key)) {\n          return length;\n        }\n      }\n      return -1;\n    }\n\n    /**\n     * Aggregates elements of `collection` on `accumulator` with keys transformed\n     * by `iteratee` and values set by `setter`.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} setter The function to set `accumulator` values.\n     * @param {Function} iteratee The iteratee to transform keys.\n     * @param {Object} accumulator The initial aggregated object.\n     * @returns {Function} Returns `accumulator`.\n     */\n    function baseAggregator(collection, setter, iteratee, accumulator) {\n      baseEach(collection, function(value, key, collection) {\n        setter(accumulator, value, iteratee(value), collection);\n      });\n      return accumulator;\n    }\n\n    /**\n     * The base implementation of `_.assign` without support for multiple sources\n     * or `customizer` functions.\n     *\n     * @private\n     * @param {Object} object The destination object.\n     * @param {Object} source The source object.\n     * @returns {Object} Returns `object`.\n     */\n    function baseAssign(object, source) {\n      return object && copyObject(source, keys(source), object);\n    }\n\n    /**\n     * The base implementation of `_.assignIn` without support for multiple sources\n     * or `customizer` functions.\n     *\n     * @private\n     * @param {Object} object The destination object.\n     * @param {Object} source The source object.\n     * @returns {Object} Returns `object`.\n     */\n    function baseAssignIn(object, source) {\n      return object && copyObject(source, keysIn(source), object);\n    }\n\n    /**\n     * The base implementation of `assignValue` and `assignMergeValue` without\n     * value checks.\n     *\n     * @private\n     * @param {Object} object The object to modify.\n     * @param {string} key The key of the property to assign.\n     * @param {*} value The value to assign.\n     */\n    function baseAssignValue(object, key, value) {\n      if (key == '__proto__' && defineProperty) {\n        defineProperty(object, key, {\n          'configurable': true,\n          'enumerable': true,\n          'value': value,\n          'writable': true\n        });\n      } else {\n        object[key] = value;\n      }\n    }\n\n    /**\n     * The base implementation of `_.at` without support for individual paths.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {string[]} paths The property paths to pick.\n     * @returns {Array} Returns the picked elements.\n     */\n    function baseAt(object, paths) {\n      var index = -1,\n          length = paths.length,\n          result = Array(length),\n          skip = object == null;\n\n      while (++index < length) {\n        result[index] = skip ? undefined : get(object, paths[index]);\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.clamp` which doesn't coerce arguments.\n     *\n     * @private\n     * @param {number} number The number to clamp.\n     * @param {number} [lower] The lower bound.\n     * @param {number} upper The upper bound.\n     * @returns {number} Returns the clamped number.\n     */\n    function baseClamp(number, lower, upper) {\n      if (number === number) {\n        if (upper !== undefined) {\n          number = number <= upper ? number : upper;\n        }\n        if (lower !== undefined) {\n          number = number >= lower ? number : lower;\n        }\n      }\n      return number;\n    }\n\n    /**\n     * The base implementation of `_.clone` and `_.cloneDeep` which tracks\n     * traversed objects.\n     *\n     * @private\n     * @param {*} value The value to clone.\n     * @param {boolean} bitmask The bitmask flags.\n     *  1 - Deep clone\n     *  2 - Flatten inherited properties\n     *  4 - Clone symbols\n     * @param {Function} [customizer] The function to customize cloning.\n     * @param {string} [key] The key of `value`.\n     * @param {Object} [object] The parent object of `value`.\n     * @param {Object} [stack] Tracks traversed objects and their clone counterparts.\n     * @returns {*} Returns the cloned value.\n     */\n    function baseClone(value, bitmask, customizer, key, object, stack) {\n      var result,\n          isDeep = bitmask & CLONE_DEEP_FLAG,\n          isFlat = bitmask & CLONE_FLAT_FLAG,\n          isFull = bitmask & CLONE_SYMBOLS_FLAG;\n\n      if (customizer) {\n        result = object ? customizer(value, key, object, stack) : customizer(value);\n      }\n      if (result !== undefined) {\n        return result;\n      }\n      if (!isObject(value)) {\n        return value;\n      }\n      var isArr = isArray(value);\n      if (isArr) {\n        result = initCloneArray(value);\n        if (!isDeep) {\n          return copyArray(value, result);\n        }\n      } else {\n        var tag = getTag(value),\n            isFunc = tag == funcTag || tag == genTag;\n\n        if (isBuffer(value)) {\n          return cloneBuffer(value, isDeep);\n        }\n        if (tag == objectTag || tag == argsTag || (isFunc && !object)) {\n          result = (isFlat || isFunc) ? {} : initCloneObject(value);\n          if (!isDeep) {\n            return isFlat\n              ? copySymbolsIn(value, baseAssignIn(result, value))\n              : copySymbols(value, baseAssign(result, value));\n          }\n        } else {\n          if (!cloneableTags[tag]) {\n            return object ? value : {};\n          }\n          result = initCloneByTag(value, tag, isDeep);\n        }\n      }\n      // Check for circular references and return its corresponding clone.\n      stack || (stack = new Stack);\n      var stacked = stack.get(value);\n      if (stacked) {\n        return stacked;\n      }\n      stack.set(value, result);\n\n      if (isSet(value)) {\n        value.forEach(function(subValue) {\n          result.add(baseClone(subValue, bitmask, customizer, subValue, value, stack));\n        });\n      } else if (isMap(value)) {\n        value.forEach(function(subValue, key) {\n          result.set(key, baseClone(subValue, bitmask, customizer, key, value, stack));\n        });\n      }\n\n      var keysFunc = isFull\n        ? (isFlat ? getAllKeysIn : getAllKeys)\n        : (isFlat ? keysIn : keys);\n\n      var props = isArr ? undefined : keysFunc(value);\n      arrayEach(props || value, function(subValue, key) {\n        if (props) {\n          key = subValue;\n          subValue = value[key];\n        }\n        // Recursively populate clone (susceptible to call stack limits).\n        assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack));\n      });\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.conforms` which doesn't clone `source`.\n     *\n     * @private\n     * @param {Object} source The object of property predicates to conform to.\n     * @returns {Function} Returns the new spec function.\n     */\n    function baseConforms(source) {\n      var props = keys(source);\n      return function(object) {\n        return baseConformsTo(object, source, props);\n      };\n    }\n\n    /**\n     * The base implementation of `_.conformsTo` which accepts `props` to check.\n     *\n     * @private\n     * @param {Object} object The object to inspect.\n     * @param {Object} source The object of property predicates to conform to.\n     * @returns {boolean} Returns `true` if `object` conforms, else `false`.\n     */\n    function baseConformsTo(object, source, props) {\n      var length = props.length;\n      if (object == null) {\n        return !length;\n      }\n      object = Object(object);\n      while (length--) {\n        var key = props[length],\n            predicate = source[key],\n            value = object[key];\n\n        if ((value === undefined && !(key in object)) || !predicate(value)) {\n          return false;\n        }\n      }\n      return true;\n    }\n\n    /**\n     * The base implementation of `_.delay` and `_.defer` which accepts `args`\n     * to provide to `func`.\n     *\n     * @private\n     * @param {Function} func The function to delay.\n     * @param {number} wait The number of milliseconds to delay invocation.\n     * @param {Array} args The arguments to provide to `func`.\n     * @returns {number|Object} Returns the timer id or timeout object.\n     */\n    function baseDelay(func, wait, args) {\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      return setTimeout(function() { func.apply(undefined, args); }, wait);\n    }\n\n    /**\n     * The base implementation of methods like `_.difference` without support\n     * for excluding multiple arrays or iteratee shorthands.\n     *\n     * @private\n     * @param {Array} array The array to inspect.\n     * @param {Array} values The values to exclude.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of filtered values.\n     */\n    function baseDifference(array, values, iteratee, comparator) {\n      var index = -1,\n          includes = arrayIncludes,\n          isCommon = true,\n          length = array.length,\n          result = [],\n          valuesLength = values.length;\n\n      if (!length) {\n        return result;\n      }\n      if (iteratee) {\n        values = arrayMap(values, baseUnary(iteratee));\n      }\n      if (comparator) {\n        includes = arrayIncludesWith;\n        isCommon = false;\n      }\n      else if (values.length >= LARGE_ARRAY_SIZE) {\n        includes = cacheHas;\n        isCommon = false;\n        values = new SetCache(values);\n      }\n      outer:\n      while (++index < length) {\n        var value = array[index],\n            computed = iteratee == null ? value : iteratee(value);\n\n        value = (comparator || value !== 0) ? value : 0;\n        if (isCommon && computed === computed) {\n          var valuesIndex = valuesLength;\n          while (valuesIndex--) {\n            if (values[valuesIndex] === computed) {\n              continue outer;\n            }\n          }\n          result.push(value);\n        }\n        else if (!includes(values, computed, comparator)) {\n          result.push(value);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.forEach` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Array|Object} Returns `collection`.\n     */\n    var baseEach = createBaseEach(baseForOwn);\n\n    /**\n     * The base implementation of `_.forEachRight` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Array|Object} Returns `collection`.\n     */\n    var baseEachRight = createBaseEach(baseForOwnRight, true);\n\n    /**\n     * The base implementation of `_.every` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} predicate The function invoked per iteration.\n     * @returns {boolean} Returns `true` if all elements pass the predicate check,\n     *  else `false`\n     */\n    function baseEvery(collection, predicate) {\n      var result = true;\n      baseEach(collection, function(value, index, collection) {\n        result = !!predicate(value, index, collection);\n        return result;\n      });\n      return result;\n    }\n\n    /**\n     * The base implementation of methods like `_.max` and `_.min` which accepts a\n     * `comparator` to determine the extremum value.\n     *\n     * @private\n     * @param {Array} array The array to iterate over.\n     * @param {Function} iteratee The iteratee invoked per iteration.\n     * @param {Function} comparator The comparator used to compare values.\n     * @returns {*} Returns the extremum value.\n     */\n    function baseExtremum(array, iteratee, comparator) {\n      var index = -1,\n          length = array.length;\n\n      while (++index < length) {\n        var value = array[index],\n            current = iteratee(value);\n\n        if (current != null && (computed === undefined\n              ? (current === current && !isSymbol(current))\n              : comparator(current, computed)\n            )) {\n          var computed = current,\n              result = value;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.fill` without an iteratee call guard.\n     *\n     * @private\n     * @param {Array} array The array to fill.\n     * @param {*} value The value to fill `array` with.\n     * @param {number} [start=0] The start position.\n     * @param {number} [end=array.length] The end position.\n     * @returns {Array} Returns `array`.\n     */\n    function baseFill(array, value, start, end) {\n      var length = array.length;\n\n      start = toInteger(start);\n      if (start < 0) {\n        start = -start > length ? 0 : (length + start);\n      }\n      end = (end === undefined || end > length) ? length : toInteger(end);\n      if (end < 0) {\n        end += length;\n      }\n      end = start > end ? 0 : toLength(end);\n      while (start < end) {\n        array[start++] = value;\n      }\n      return array;\n    }\n\n    /**\n     * The base implementation of `_.filter` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} predicate The function invoked per iteration.\n     * @returns {Array} Returns the new filtered array.\n     */\n    function baseFilter(collection, predicate) {\n      var result = [];\n      baseEach(collection, function(value, index, collection) {\n        if (predicate(value, index, collection)) {\n          result.push(value);\n        }\n      });\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.flatten` with support for restricting flattening.\n     *\n     * @private\n     * @param {Array} array The array to flatten.\n     * @param {number} depth The maximum recursion depth.\n     * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.\n     * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.\n     * @param {Array} [result=[]] The initial result value.\n     * @returns {Array} Returns the new flattened array.\n     */\n    function baseFlatten(array, depth, predicate, isStrict, result) {\n      var index = -1,\n          length = array.length;\n\n      predicate || (predicate = isFlattenable);\n      result || (result = []);\n\n      while (++index < length) {\n        var value = array[index];\n        if (depth > 0 && predicate(value)) {\n          if (depth > 1) {\n            // Recursively flatten arrays (susceptible to call stack limits).\n            baseFlatten(value, depth - 1, predicate, isStrict, result);\n          } else {\n            arrayPush(result, value);\n          }\n        } else if (!isStrict) {\n          result[result.length] = value;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `baseForOwn` which iterates over `object`\n     * properties returned by `keysFunc` and invokes `iteratee` for each property.\n     * Iteratee functions may exit iteration early by explicitly returning `false`.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @param {Function} keysFunc The function to get the keys of `object`.\n     * @returns {Object} Returns `object`.\n     */\n    var baseFor = createBaseFor();\n\n    /**\n     * This function is like `baseFor` except that it iterates over properties\n     * in the opposite order.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @param {Function} keysFunc The function to get the keys of `object`.\n     * @returns {Object} Returns `object`.\n     */\n    var baseForRight = createBaseFor(true);\n\n    /**\n     * The base implementation of `_.forOwn` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     */\n    function baseForOwn(object, iteratee) {\n      return object && baseFor(object, iteratee, keys);\n    }\n\n    /**\n     * The base implementation of `_.forOwnRight` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     */\n    function baseForOwnRight(object, iteratee) {\n      return object && baseForRight(object, iteratee, keys);\n    }\n\n    /**\n     * The base implementation of `_.functions` which creates an array of\n     * `object` function property names filtered from `props`.\n     *\n     * @private\n     * @param {Object} object The object to inspect.\n     * @param {Array} props The property names to filter.\n     * @returns {Array} Returns the function names.\n     */\n    function baseFunctions(object, props) {\n      return arrayFilter(props, function(key) {\n        return isFunction(object[key]);\n      });\n    }\n\n    /**\n     * The base implementation of `_.get` without support for default values.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path of the property to get.\n     * @returns {*} Returns the resolved value.\n     */\n    function baseGet(object, path) {\n      path = castPath(path, object);\n\n      var index = 0,\n          length = path.length;\n\n      while (object != null && index < length) {\n        object = object[toKey(path[index++])];\n      }\n      return (index && index == length) ? object : undefined;\n    }\n\n    /**\n     * The base implementation of `getAllKeys` and `getAllKeysIn` which uses\n     * `keysFunc` and `symbolsFunc` to get the enumerable property names and\n     * symbols of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {Function} keysFunc The function to get the keys of `object`.\n     * @param {Function} symbolsFunc The function to get the symbols of `object`.\n     * @returns {Array} Returns the array of property names and symbols.\n     */\n    function baseGetAllKeys(object, keysFunc, symbolsFunc) {\n      var result = keysFunc(object);\n      return isArray(object) ? result : arrayPush(result, symbolsFunc(object));\n    }\n\n    /**\n     * The base implementation of `getTag` without fallbacks for buggy environments.\n     *\n     * @private\n     * @param {*} value The value to query.\n     * @returns {string} Returns the `toStringTag`.\n     */\n    function baseGetTag(value) {\n      if (value == null) {\n        return value === undefined ? undefinedTag : nullTag;\n      }\n      return (symToStringTag && symToStringTag in Object(value))\n        ? getRawTag(value)\n        : objectToString(value);\n    }\n\n    /**\n     * The base implementation of `_.gt` which doesn't coerce arguments.\n     *\n     * @private\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if `value` is greater than `other`,\n     *  else `false`.\n     */\n    function baseGt(value, other) {\n      return value > other;\n    }\n\n    /**\n     * The base implementation of `_.has` without support for deep paths.\n     *\n     * @private\n     * @param {Object} [object] The object to query.\n     * @param {Array|string} key The key to check.\n     * @returns {boolean} Returns `true` if `key` exists, else `false`.\n     */\n    function baseHas(object, key) {\n      return object != null && hasOwnProperty.call(object, key);\n    }\n\n    /**\n     * The base implementation of `_.hasIn` without support for deep paths.\n     *\n     * @private\n     * @param {Object} [object] The object to query.\n     * @param {Array|string} key The key to check.\n     * @returns {boolean} Returns `true` if `key` exists, else `false`.\n     */\n    function baseHasIn(object, key) {\n      return object != null && key in Object(object);\n    }\n\n    /**\n     * The base implementation of `_.inRange` which doesn't coerce arguments.\n     *\n     * @private\n     * @param {number} number The number to check.\n     * @param {number} start The start of the range.\n     * @param {number} end The end of the range.\n     * @returns {boolean} Returns `true` if `number` is in the range, else `false`.\n     */\n    function baseInRange(number, start, end) {\n      return number >= nativeMin(start, end) && number < nativeMax(start, end);\n    }\n\n    /**\n     * The base implementation of methods like `_.intersection`, without support\n     * for iteratee shorthands, that accepts an array of arrays to inspect.\n     *\n     * @private\n     * @param {Array} arrays The arrays to inspect.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of shared values.\n     */\n    function baseIntersection(arrays, iteratee, comparator) {\n      var includes = comparator ? arrayIncludesWith : arrayIncludes,\n          length = arrays[0].length,\n          othLength = arrays.length,\n          othIndex = othLength,\n          caches = Array(othLength),\n          maxLength = Infinity,\n          result = [];\n\n      while (othIndex--) {\n        var array = arrays[othIndex];\n        if (othIndex && iteratee) {\n          array = arrayMap(array, baseUnary(iteratee));\n        }\n        maxLength = nativeMin(array.length, maxLength);\n        caches[othIndex] = !comparator && (iteratee || (length >= 120 && array.length >= 120))\n          ? new SetCache(othIndex && array)\n          : undefined;\n      }\n      array = arrays[0];\n\n      var index = -1,\n          seen = caches[0];\n\n      outer:\n      while (++index < length && result.length < maxLength) {\n        var value = array[index],\n            computed = iteratee ? iteratee(value) : value;\n\n        value = (comparator || value !== 0) ? value : 0;\n        if (!(seen\n              ? cacheHas(seen, computed)\n              : includes(result, computed, comparator)\n            )) {\n          othIndex = othLength;\n          while (--othIndex) {\n            var cache = caches[othIndex];\n            if (!(cache\n                  ? cacheHas(cache, computed)\n                  : includes(arrays[othIndex], computed, comparator))\n                ) {\n              continue outer;\n            }\n          }\n          if (seen) {\n            seen.push(computed);\n          }\n          result.push(value);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.invert` and `_.invertBy` which inverts\n     * `object` with values transformed by `iteratee` and set by `setter`.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {Function} setter The function to set `accumulator` values.\n     * @param {Function} iteratee The iteratee to transform values.\n     * @param {Object} accumulator The initial inverted object.\n     * @returns {Function} Returns `accumulator`.\n     */\n    function baseInverter(object, setter, iteratee, accumulator) {\n      baseForOwn(object, function(value, key, object) {\n        setter(accumulator, iteratee(value), key, object);\n      });\n      return accumulator;\n    }\n\n    /**\n     * The base implementation of `_.invoke` without support for individual\n     * method arguments.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path of the method to invoke.\n     * @param {Array} args The arguments to invoke the method with.\n     * @returns {*} Returns the result of the invoked method.\n     */\n    function baseInvoke(object, path, args) {\n      path = castPath(path, object);\n      object = parent(object, path);\n      var func = object == null ? object : object[toKey(last(path))];\n      return func == null ? undefined : apply(func, object, args);\n    }\n\n    /**\n     * The base implementation of `_.isArguments`.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n     */\n    function baseIsArguments(value) {\n      return isObjectLike(value) && baseGetTag(value) == argsTag;\n    }\n\n    /**\n     * The base implementation of `_.isArrayBuffer` without Node.js optimizations.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`.\n     */\n    function baseIsArrayBuffer(value) {\n      return isObjectLike(value) && baseGetTag(value) == arrayBufferTag;\n    }\n\n    /**\n     * The base implementation of `_.isDate` without Node.js optimizations.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a date object, else `false`.\n     */\n    function baseIsDate(value) {\n      return isObjectLike(value) && baseGetTag(value) == dateTag;\n    }\n\n    /**\n     * The base implementation of `_.isEqual` which supports partial comparisons\n     * and tracks traversed objects.\n     *\n     * @private\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @param {boolean} bitmask The bitmask flags.\n     *  1 - Unordered comparison\n     *  2 - Partial comparison\n     * @param {Function} [customizer] The function to customize comparisons.\n     * @param {Object} [stack] Tracks traversed `value` and `other` objects.\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n     */\n    function baseIsEqual(value, other, bitmask, customizer, stack) {\n      if (value === other) {\n        return true;\n      }\n      if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {\n        return value !== value && other !== other;\n      }\n      return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);\n    }\n\n    /**\n     * A specialized version of `baseIsEqual` for arrays and objects which performs\n     * deep comparisons and tracks traversed objects enabling objects with circular\n     * references to be compared.\n     *\n     * @private\n     * @param {Object} object The object to compare.\n     * @param {Object} other The other object to compare.\n     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n     * @param {Function} customizer The function to customize comparisons.\n     * @param {Function} equalFunc The function to determine equivalents of values.\n     * @param {Object} [stack] Tracks traversed `object` and `other` objects.\n     * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n     */\n    function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {\n      var objIsArr = isArray(object),\n          othIsArr = isArray(other),\n          objTag = objIsArr ? arrayTag : getTag(object),\n          othTag = othIsArr ? arrayTag : getTag(other);\n\n      objTag = objTag == argsTag ? objectTag : objTag;\n      othTag = othTag == argsTag ? objectTag : othTag;\n\n      var objIsObj = objTag == objectTag,\n          othIsObj = othTag == objectTag,\n          isSameTag = objTag == othTag;\n\n      if (isSameTag && isBuffer(object)) {\n        if (!isBuffer(other)) {\n          return false;\n        }\n        objIsArr = true;\n        objIsObj = false;\n      }\n      if (isSameTag && !objIsObj) {\n        stack || (stack = new Stack);\n        return (objIsArr || isTypedArray(object))\n          ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)\n          : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);\n      }\n      if (!(bitmask & COMPARE_PARTIAL_FLAG)) {\n        var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),\n            othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\n\n        if (objIsWrapped || othIsWrapped) {\n          var objUnwrapped = objIsWrapped ? object.value() : object,\n              othUnwrapped = othIsWrapped ? other.value() : other;\n\n          stack || (stack = new Stack);\n          return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);\n        }\n      }\n      if (!isSameTag) {\n        return false;\n      }\n      stack || (stack = new Stack);\n      return equalObjects(object, other, bitmask, customizer, equalFunc, stack);\n    }\n\n    /**\n     * The base implementation of `_.isMap` without Node.js optimizations.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n     */\n    function baseIsMap(value) {\n      return isObjectLike(value) && getTag(value) == mapTag;\n    }\n\n    /**\n     * The base implementation of `_.isMatch` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Object} object The object to inspect.\n     * @param {Object} source The object of property values to match.\n     * @param {Array} matchData The property names, values, and compare flags to match.\n     * @param {Function} [customizer] The function to customize comparisons.\n     * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n     */\n    function baseIsMatch(object, source, matchData, customizer) {\n      var index = matchData.length,\n          length = index,\n          noCustomizer = !customizer;\n\n      if (object == null) {\n        return !length;\n      }\n      object = Object(object);\n      while (index--) {\n        var data = matchData[index];\n        if ((noCustomizer && data[2])\n              ? data[1] !== object[data[0]]\n              : !(data[0] in object)\n            ) {\n          return false;\n        }\n      }\n      while (++index < length) {\n        data = matchData[index];\n        var key = data[0],\n            objValue = object[key],\n            srcValue = data[1];\n\n        if (noCustomizer && data[2]) {\n          if (objValue === undefined && !(key in object)) {\n            return false;\n          }\n        } else {\n          var stack = new Stack;\n          if (customizer) {\n            var result = customizer(objValue, srcValue, key, object, source, stack);\n          }\n          if (!(result === undefined\n                ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack)\n                : result\n              )) {\n            return false;\n          }\n        }\n      }\n      return true;\n    }\n\n    /**\n     * The base implementation of `_.isNative` without bad shim checks.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a native function,\n     *  else `false`.\n     */\n    function baseIsNative(value) {\n      if (!isObject(value) || isMasked(value)) {\n        return false;\n      }\n      var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\n      return pattern.test(toSource(value));\n    }\n\n    /**\n     * The base implementation of `_.isRegExp` without Node.js optimizations.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.\n     */\n    function baseIsRegExp(value) {\n      return isObjectLike(value) && baseGetTag(value) == regexpTag;\n    }\n\n    /**\n     * The base implementation of `_.isSet` without Node.js optimizations.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n     */\n    function baseIsSet(value) {\n      return isObjectLike(value) && getTag(value) == setTag;\n    }\n\n    /**\n     * The base implementation of `_.isTypedArray` without Node.js optimizations.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n     */\n    function baseIsTypedArray(value) {\n      return isObjectLike(value) &&\n        isLength(value.length) && !!typedArrayTags[baseGetTag(value)];\n    }\n\n    /**\n     * The base implementation of `_.iteratee`.\n     *\n     * @private\n     * @param {*} [value=_.identity] The value to convert to an iteratee.\n     * @returns {Function} Returns the iteratee.\n     */\n    function baseIteratee(value) {\n      // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9.\n      // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.\n      if (typeof value == 'function') {\n        return value;\n      }\n      if (value == null) {\n        return identity;\n      }\n      if (typeof value == 'object') {\n        return isArray(value)\n          ? baseMatchesProperty(value[0], value[1])\n          : baseMatches(value);\n      }\n      return property(value);\n    }\n\n    /**\n     * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names.\n     */\n    function baseKeys(object) {\n      if (!isPrototype(object)) {\n        return nativeKeys(object);\n      }\n      var result = [];\n      for (var key in Object(object)) {\n        if (hasOwnProperty.call(object, key) && key != 'constructor') {\n          result.push(key);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names.\n     */\n    function baseKeysIn(object) {\n      if (!isObject(object)) {\n        return nativeKeysIn(object);\n      }\n      var isProto = isPrototype(object),\n          result = [];\n\n      for (var key in object) {\n        if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {\n          result.push(key);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.lt` which doesn't coerce arguments.\n     *\n     * @private\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if `value` is less than `other`,\n     *  else `false`.\n     */\n    function baseLt(value, other) {\n      return value < other;\n    }\n\n    /**\n     * The base implementation of `_.map` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Array} Returns the new mapped array.\n     */\n    function baseMap(collection, iteratee) {\n      var index = -1,\n          result = isArrayLike(collection) ? Array(collection.length) : [];\n\n      baseEach(collection, function(value, key, collection) {\n        result[++index] = iteratee(value, key, collection);\n      });\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.matches` which doesn't clone `source`.\n     *\n     * @private\n     * @param {Object} source The object of property values to match.\n     * @returns {Function} Returns the new spec function.\n     */\n    function baseMatches(source) {\n      var matchData = getMatchData(source);\n      if (matchData.length == 1 && matchData[0][2]) {\n        return matchesStrictComparable(matchData[0][0], matchData[0][1]);\n      }\n      return function(object) {\n        return object === source || baseIsMatch(object, source, matchData);\n      };\n    }\n\n    /**\n     * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.\n     *\n     * @private\n     * @param {string} path The path of the property to get.\n     * @param {*} srcValue The value to match.\n     * @returns {Function} Returns the new spec function.\n     */\n    function baseMatchesProperty(path, srcValue) {\n      if (isKey(path) && isStrictComparable(srcValue)) {\n        return matchesStrictComparable(toKey(path), srcValue);\n      }\n      return function(object) {\n        var objValue = get(object, path);\n        return (objValue === undefined && objValue === srcValue)\n          ? hasIn(object, path)\n          : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG);\n      };\n    }\n\n    /**\n     * The base implementation of `_.merge` without support for multiple sources.\n     *\n     * @private\n     * @param {Object} object The destination object.\n     * @param {Object} source The source object.\n     * @param {number} srcIndex The index of `source`.\n     * @param {Function} [customizer] The function to customize merged values.\n     * @param {Object} [stack] Tracks traversed source values and their merged\n     *  counterparts.\n     */\n    function baseMerge(object, source, srcIndex, customizer, stack) {\n      if (object === source) {\n        return;\n      }\n      baseFor(source, function(srcValue, key) {\n        stack || (stack = new Stack);\n        if (isObject(srcValue)) {\n          baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack);\n        }\n        else {\n          var newValue = customizer\n            ? customizer(safeGet(object, key), srcValue, (key + ''), object, source, stack)\n            : undefined;\n\n          if (newValue === undefined) {\n            newValue = srcValue;\n          }\n          assignMergeValue(object, key, newValue);\n        }\n      }, keysIn);\n    }\n\n    /**\n     * A specialized version of `baseMerge` for arrays and objects which performs\n     * deep merges and tracks traversed objects enabling objects with circular\n     * references to be merged.\n     *\n     * @private\n     * @param {Object} object The destination object.\n     * @param {Object} source The source object.\n     * @param {string} key The key of the value to merge.\n     * @param {number} srcIndex The index of `source`.\n     * @param {Function} mergeFunc The function to merge values.\n     * @param {Function} [customizer] The function to customize assigned values.\n     * @param {Object} [stack] Tracks traversed source values and their merged\n     *  counterparts.\n     */\n    function baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, stack) {\n      var objValue = safeGet(object, key),\n          srcValue = safeGet(source, key),\n          stacked = stack.get(srcValue);\n\n      if (stacked) {\n        assignMergeValue(object, key, stacked);\n        return;\n      }\n      var newValue = customizer\n        ? customizer(objValue, srcValue, (key + ''), object, source, stack)\n        : undefined;\n\n      var isCommon = newValue === undefined;\n\n      if (isCommon) {\n        var isArr = isArray(srcValue),\n            isBuff = !isArr && isBuffer(srcValue),\n            isTyped = !isArr && !isBuff && isTypedArray(srcValue);\n\n        newValue = srcValue;\n        if (isArr || isBuff || isTyped) {\n          if (isArray(objValue)) {\n            newValue = objValue;\n          }\n          else if (isArrayLikeObject(objValue)) {\n            newValue = copyArray(objValue);\n          }\n          else if (isBuff) {\n            isCommon = false;\n            newValue = cloneBuffer(srcValue, true);\n          }\n          else if (isTyped) {\n            isCommon = false;\n            newValue = cloneTypedArray(srcValue, true);\n          }\n          else {\n            newValue = [];\n          }\n        }\n        else if (isPlainObject(srcValue) || isArguments(srcValue)) {\n          newValue = objValue;\n          if (isArguments(objValue)) {\n            newValue = toPlainObject(objValue);\n          }\n          else if (!isObject(objValue) || isFunction(objValue)) {\n            newValue = initCloneObject(srcValue);\n          }\n        }\n        else {\n          isCommon = false;\n        }\n      }\n      if (isCommon) {\n        // Recursively merge objects and arrays (susceptible to call stack limits).\n        stack.set(srcValue, newValue);\n        mergeFunc(newValue, srcValue, srcIndex, customizer, stack);\n        stack['delete'](srcValue);\n      }\n      assignMergeValue(object, key, newValue);\n    }\n\n    /**\n     * The base implementation of `_.nth` which doesn't coerce arguments.\n     *\n     * @private\n     * @param {Array} array The array to query.\n     * @param {number} n The index of the element to return.\n     * @returns {*} Returns the nth element of `array`.\n     */\n    function baseNth(array, n) {\n      var length = array.length;\n      if (!length) {\n        return;\n      }\n      n += n < 0 ? length : 0;\n      return isIndex(n, length) ? array[n] : undefined;\n    }\n\n    /**\n     * The base implementation of `_.orderBy` without param guards.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by.\n     * @param {string[]} orders The sort orders of `iteratees`.\n     * @returns {Array} Returns the new sorted array.\n     */\n    function baseOrderBy(collection, iteratees, orders) {\n      if (iteratees.length) {\n        iteratees = arrayMap(iteratees, function(iteratee) {\n          if (isArray(iteratee)) {\n            return function(value) {\n              return baseGet(value, iteratee.length === 1 ? iteratee[0] : iteratee);\n            }\n          }\n          return iteratee;\n        });\n      } else {\n        iteratees = [identity];\n      }\n\n      var index = -1;\n      iteratees = arrayMap(iteratees, baseUnary(getIteratee()));\n\n      var result = baseMap(collection, function(value, key, collection) {\n        var criteria = arrayMap(iteratees, function(iteratee) {\n          return iteratee(value);\n        });\n        return { 'criteria': criteria, 'index': ++index, 'value': value };\n      });\n\n      return baseSortBy(result, function(object, other) {\n        return compareMultiple(object, other, orders);\n      });\n    }\n\n    /**\n     * The base implementation of `_.pick` without support for individual\n     * property identifiers.\n     *\n     * @private\n     * @param {Object} object The source object.\n     * @param {string[]} paths The property paths to pick.\n     * @returns {Object} Returns the new object.\n     */\n    function basePick(object, paths) {\n      return basePickBy(object, paths, function(value, path) {\n        return hasIn(object, path);\n      });\n    }\n\n    /**\n     * The base implementation of  `_.pickBy` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Object} object The source object.\n     * @param {string[]} paths The property paths to pick.\n     * @param {Function} predicate The function invoked per property.\n     * @returns {Object} Returns the new object.\n     */\n    function basePickBy(object, paths, predicate) {\n      var index = -1,\n          length = paths.length,\n          result = {};\n\n      while (++index < length) {\n        var path = paths[index],\n            value = baseGet(object, path);\n\n        if (predicate(value, path)) {\n          baseSet(result, castPath(path, object), value);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * A specialized version of `baseProperty` which supports deep paths.\n     *\n     * @private\n     * @param {Array|string} path The path of the property to get.\n     * @returns {Function} Returns the new accessor function.\n     */\n    function basePropertyDeep(path) {\n      return function(object) {\n        return baseGet(object, path);\n      };\n    }\n\n    /**\n     * The base implementation of `_.pullAllBy` without support for iteratee\n     * shorthands.\n     *\n     * @private\n     * @param {Array} array The array to modify.\n     * @param {Array} values The values to remove.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns `array`.\n     */\n    function basePullAll(array, values, iteratee, comparator) {\n      var indexOf = comparator ? baseIndexOfWith : baseIndexOf,\n          index = -1,\n          length = values.length,\n          seen = array;\n\n      if (array === values) {\n        values = copyArray(values);\n      }\n      if (iteratee) {\n        seen = arrayMap(array, baseUnary(iteratee));\n      }\n      while (++index < length) {\n        var fromIndex = 0,\n            value = values[index],\n            computed = iteratee ? iteratee(value) : value;\n\n        while ((fromIndex = indexOf(seen, computed, fromIndex, comparator)) > -1) {\n          if (seen !== array) {\n            splice.call(seen, fromIndex, 1);\n          }\n          splice.call(array, fromIndex, 1);\n        }\n      }\n      return array;\n    }\n\n    /**\n     * The base implementation of `_.pullAt` without support for individual\n     * indexes or capturing the removed elements.\n     *\n     * @private\n     * @param {Array} array The array to modify.\n     * @param {number[]} indexes The indexes of elements to remove.\n     * @returns {Array} Returns `array`.\n     */\n    function basePullAt(array, indexes) {\n      var length = array ? indexes.length : 0,\n          lastIndex = length - 1;\n\n      while (length--) {\n        var index = indexes[length];\n        if (length == lastIndex || index !== previous) {\n          var previous = index;\n          if (isIndex(index)) {\n            splice.call(array, index, 1);\n          } else {\n            baseUnset(array, index);\n          }\n        }\n      }\n      return array;\n    }\n\n    /**\n     * The base implementation of `_.random` without support for returning\n     * floating-point numbers.\n     *\n     * @private\n     * @param {number} lower The lower bound.\n     * @param {number} upper The upper bound.\n     * @returns {number} Returns the random number.\n     */\n    function baseRandom(lower, upper) {\n      return lower + nativeFloor(nativeRandom() * (upper - lower + 1));\n    }\n\n    /**\n     * The base implementation of `_.range` and `_.rangeRight` which doesn't\n     * coerce arguments.\n     *\n     * @private\n     * @param {number} start The start of the range.\n     * @param {number} end The end of the range.\n     * @param {number} step The value to increment or decrement by.\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Array} Returns the range of numbers.\n     */\n    function baseRange(start, end, step, fromRight) {\n      var index = -1,\n          length = nativeMax(nativeCeil((end - start) / (step || 1)), 0),\n          result = Array(length);\n\n      while (length--) {\n        result[fromRight ? length : ++index] = start;\n        start += step;\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.repeat` which doesn't coerce arguments.\n     *\n     * @private\n     * @param {string} string The string to repeat.\n     * @param {number} n The number of times to repeat the string.\n     * @returns {string} Returns the repeated string.\n     */\n    function baseRepeat(string, n) {\n      var result = '';\n      if (!string || n < 1 || n > MAX_SAFE_INTEGER) {\n        return result;\n      }\n      // Leverage the exponentiation by squaring algorithm for a faster repeat.\n      // See https://en.wikipedia.org/wiki/Exponentiation_by_squaring for more details.\n      do {\n        if (n % 2) {\n          result += string;\n        }\n        n = nativeFloor(n / 2);\n        if (n) {\n          string += string;\n        }\n      } while (n);\n\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.rest` which doesn't validate or coerce arguments.\n     *\n     * @private\n     * @param {Function} func The function to apply a rest parameter to.\n     * @param {number} [start=func.length-1] The start position of the rest parameter.\n     * @returns {Function} Returns the new function.\n     */\n    function baseRest(func, start) {\n      return setToString(overRest(func, start, identity), func + '');\n    }\n\n    /**\n     * The base implementation of `_.sample`.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to sample.\n     * @returns {*} Returns the random element.\n     */\n    function baseSample(collection) {\n      return arraySample(values(collection));\n    }\n\n    /**\n     * The base implementation of `_.sampleSize` without param guards.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to sample.\n     * @param {number} n The number of elements to sample.\n     * @returns {Array} Returns the random elements.\n     */\n    function baseSampleSize(collection, n) {\n      var array = values(collection);\n      return shuffleSelf(array, baseClamp(n, 0, array.length));\n    }\n\n    /**\n     * The base implementation of `_.set`.\n     *\n     * @private\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to set.\n     * @param {*} value The value to set.\n     * @param {Function} [customizer] The function to customize path creation.\n     * @returns {Object} Returns `object`.\n     */\n    function baseSet(object, path, value, customizer) {\n      if (!isObject(object)) {\n        return object;\n      }\n      path = castPath(path, object);\n\n      var index = -1,\n          length = path.length,\n          lastIndex = length - 1,\n          nested = object;\n\n      while (nested != null && ++index < length) {\n        var key = toKey(path[index]),\n            newValue = value;\n\n        if (key === '__proto__' || key === 'constructor' || key === 'prototype') {\n          return object;\n        }\n\n        if (index != lastIndex) {\n          var objValue = nested[key];\n          newValue = customizer ? customizer(objValue, key, nested) : undefined;\n          if (newValue === undefined) {\n            newValue = isObject(objValue)\n              ? objValue\n              : (isIndex(path[index + 1]) ? [] : {});\n          }\n        }\n        assignValue(nested, key, newValue);\n        nested = nested[key];\n      }\n      return object;\n    }\n\n    /**\n     * The base implementation of `setData` without support for hot loop shorting.\n     *\n     * @private\n     * @param {Function} func The function to associate metadata with.\n     * @param {*} data The metadata.\n     * @returns {Function} Returns `func`.\n     */\n    var baseSetData = !metaMap ? identity : function(func, data) {\n      metaMap.set(func, data);\n      return func;\n    };\n\n    /**\n     * The base implementation of `setToString` without support for hot loop shorting.\n     *\n     * @private\n     * @param {Function} func The function to modify.\n     * @param {Function} string The `toString` result.\n     * @returns {Function} Returns `func`.\n     */\n    var baseSetToString = !defineProperty ? identity : function(func, string) {\n      return defineProperty(func, 'toString', {\n        'configurable': true,\n        'enumerable': false,\n        'value': constant(string),\n        'writable': true\n      });\n    };\n\n    /**\n     * The base implementation of `_.shuffle`.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to shuffle.\n     * @returns {Array} Returns the new shuffled array.\n     */\n    function baseShuffle(collection) {\n      return shuffleSelf(values(collection));\n    }\n\n    /**\n     * The base implementation of `_.slice` without an iteratee call guard.\n     *\n     * @private\n     * @param {Array} array The array to slice.\n     * @param {number} [start=0] The start position.\n     * @param {number} [end=array.length] The end position.\n     * @returns {Array} Returns the slice of `array`.\n     */\n    function baseSlice(array, start, end) {\n      var index = -1,\n          length = array.length;\n\n      if (start < 0) {\n        start = -start > length ? 0 : (length + start);\n      }\n      end = end > length ? length : end;\n      if (end < 0) {\n        end += length;\n      }\n      length = start > end ? 0 : ((end - start) >>> 0);\n      start >>>= 0;\n\n      var result = Array(length);\n      while (++index < length) {\n        result[index] = array[index + start];\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.some` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} predicate The function invoked per iteration.\n     * @returns {boolean} Returns `true` if any element passes the predicate check,\n     *  else `false`.\n     */\n    function baseSome(collection, predicate) {\n      var result;\n\n      baseEach(collection, function(value, index, collection) {\n        result = predicate(value, index, collection);\n        return !result;\n      });\n      return !!result;\n    }\n\n    /**\n     * The base implementation of `_.sortedIndex` and `_.sortedLastIndex` which\n     * performs a binary search of `array` to determine the index at which `value`\n     * should be inserted into `array` in order to maintain its sort order.\n     *\n     * @private\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @param {boolean} [retHighest] Specify returning the highest qualified index.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     */\n    function baseSortedIndex(array, value, retHighest) {\n      var low = 0,\n          high = array == null ? low : array.length;\n\n      if (typeof value == 'number' && value === value && high <= HALF_MAX_ARRAY_LENGTH) {\n        while (low < high) {\n          var mid = (low + high) >>> 1,\n              computed = array[mid];\n\n          if (computed !== null && !isSymbol(computed) &&\n              (retHighest ? (computed <= value) : (computed < value))) {\n            low = mid + 1;\n          } else {\n            high = mid;\n          }\n        }\n        return high;\n      }\n      return baseSortedIndexBy(array, value, identity, retHighest);\n    }\n\n    /**\n     * The base implementation of `_.sortedIndexBy` and `_.sortedLastIndexBy`\n     * which invokes `iteratee` for `value` and each element of `array` to compute\n     * their sort ranking. The iteratee is invoked with one argument; (value).\n     *\n     * @private\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @param {Function} iteratee The iteratee invoked per element.\n     * @param {boolean} [retHighest] Specify returning the highest qualified index.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     */\n    function baseSortedIndexBy(array, value, iteratee, retHighest) {\n      var low = 0,\n          high = array == null ? 0 : array.length;\n      if (high === 0) {\n        return 0;\n      }\n\n      value = iteratee(value);\n      var valIsNaN = value !== value,\n          valIsNull = value === null,\n          valIsSymbol = isSymbol(value),\n          valIsUndefined = value === undefined;\n\n      while (low < high) {\n        var mid = nativeFloor((low + high) / 2),\n            computed = iteratee(array[mid]),\n            othIsDefined = computed !== undefined,\n            othIsNull = computed === null,\n            othIsReflexive = computed === computed,\n            othIsSymbol = isSymbol(computed);\n\n        if (valIsNaN) {\n          var setLow = retHighest || othIsReflexive;\n        } else if (valIsUndefined) {\n          setLow = othIsReflexive && (retHighest || othIsDefined);\n        } else if (valIsNull) {\n          setLow = othIsReflexive && othIsDefined && (retHighest || !othIsNull);\n        } else if (valIsSymbol) {\n          setLow = othIsReflexive && othIsDefined && !othIsNull && (retHighest || !othIsSymbol);\n        } else if (othIsNull || othIsSymbol) {\n          setLow = false;\n        } else {\n          setLow = retHighest ? (computed <= value) : (computed < value);\n        }\n        if (setLow) {\n          low = mid + 1;\n        } else {\n          high = mid;\n        }\n      }\n      return nativeMin(high, MAX_ARRAY_INDEX);\n    }\n\n    /**\n     * The base implementation of `_.sortedUniq` and `_.sortedUniqBy` without\n     * support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array} array The array to inspect.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @returns {Array} Returns the new duplicate free array.\n     */\n    function baseSortedUniq(array, iteratee) {\n      var index = -1,\n          length = array.length,\n          resIndex = 0,\n          result = [];\n\n      while (++index < length) {\n        var value = array[index],\n            computed = iteratee ? iteratee(value) : value;\n\n        if (!index || !eq(computed, seen)) {\n          var seen = computed;\n          result[resIndex++] = value === 0 ? 0 : value;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.toNumber` which doesn't ensure correct\n     * conversions of binary, hexadecimal, or octal string values.\n     *\n     * @private\n     * @param {*} value The value to process.\n     * @returns {number} Returns the number.\n     */\n    function baseToNumber(value) {\n      if (typeof value == 'number') {\n        return value;\n      }\n      if (isSymbol(value)) {\n        return NAN;\n      }\n      return +value;\n    }\n\n    /**\n     * The base implementation of `_.toString` which doesn't convert nullish\n     * values to empty strings.\n     *\n     * @private\n     * @param {*} value The value to process.\n     * @returns {string} Returns the string.\n     */\n    function baseToString(value) {\n      // Exit early for strings to avoid a performance hit in some environments.\n      if (typeof value == 'string') {\n        return value;\n      }\n      if (isArray(value)) {\n        // Recursively convert values (susceptible to call stack limits).\n        return arrayMap(value, baseToString) + '';\n      }\n      if (isSymbol(value)) {\n        return symbolToString ? symbolToString.call(value) : '';\n      }\n      var result = (value + '');\n      return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n    }\n\n    /**\n     * The base implementation of `_.uniqBy` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array} array The array to inspect.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new duplicate free array.\n     */\n    function baseUniq(array, iteratee, comparator) {\n      var index = -1,\n          includes = arrayIncludes,\n          length = array.length,\n          isCommon = true,\n          result = [],\n          seen = result;\n\n      if (comparator) {\n        isCommon = false;\n        includes = arrayIncludesWith;\n      }\n      else if (length >= LARGE_ARRAY_SIZE) {\n        var set = iteratee ? null : createSet(array);\n        if (set) {\n          return setToArray(set);\n        }\n        isCommon = false;\n        includes = cacheHas;\n        seen = new SetCache;\n      }\n      else {\n        seen = iteratee ? [] : result;\n      }\n      outer:\n      while (++index < length) {\n        var value = array[index],\n            computed = iteratee ? iteratee(value) : value;\n\n        value = (comparator || value !== 0) ? value : 0;\n        if (isCommon && computed === computed) {\n          var seenIndex = seen.length;\n          while (seenIndex--) {\n            if (seen[seenIndex] === computed) {\n              continue outer;\n            }\n          }\n          if (iteratee) {\n            seen.push(computed);\n          }\n          result.push(value);\n        }\n        else if (!includes(seen, computed, comparator)) {\n          if (seen !== result) {\n            seen.push(computed);\n          }\n          result.push(value);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.unset`.\n     *\n     * @private\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The property path to unset.\n     * @returns {boolean} Returns `true` if the property is deleted, else `false`.\n     */\n    function baseUnset(object, path) {\n      path = castPath(path, object);\n      object = parent(object, path);\n      return object == null || delete object[toKey(last(path))];\n    }\n\n    /**\n     * The base implementation of `_.update`.\n     *\n     * @private\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to update.\n     * @param {Function} updater The function to produce the updated value.\n     * @param {Function} [customizer] The function to customize path creation.\n     * @returns {Object} Returns `object`.\n     */\n    function baseUpdate(object, path, updater, customizer) {\n      return baseSet(object, path, updater(baseGet(object, path)), customizer);\n    }\n\n    /**\n     * The base implementation of methods like `_.dropWhile` and `_.takeWhile`\n     * without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array} array The array to query.\n     * @param {Function} predicate The function invoked per iteration.\n     * @param {boolean} [isDrop] Specify dropping elements instead of taking them.\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Array} Returns the slice of `array`.\n     */\n    function baseWhile(array, predicate, isDrop, fromRight) {\n      var length = array.length,\n          index = fromRight ? length : -1;\n\n      while ((fromRight ? index-- : ++index < length) &&\n        predicate(array[index], index, array)) {}\n\n      return isDrop\n        ? baseSlice(array, (fromRight ? 0 : index), (fromRight ? index + 1 : length))\n        : baseSlice(array, (fromRight ? index + 1 : 0), (fromRight ? length : index));\n    }\n\n    /**\n     * The base implementation of `wrapperValue` which returns the result of\n     * performing a sequence of actions on the unwrapped `value`, where each\n     * successive action is supplied the return value of the previous.\n     *\n     * @private\n     * @param {*} value The unwrapped value.\n     * @param {Array} actions Actions to perform to resolve the unwrapped value.\n     * @returns {*} Returns the resolved value.\n     */\n    function baseWrapperValue(value, actions) {\n      var result = value;\n      if (result instanceof LazyWrapper) {\n        result = result.value();\n      }\n      return arrayReduce(actions, function(result, action) {\n        return action.func.apply(action.thisArg, arrayPush([result], action.args));\n      }, result);\n    }\n\n    /**\n     * The base implementation of methods like `_.xor`, without support for\n     * iteratee shorthands, that accepts an array of arrays to inspect.\n     *\n     * @private\n     * @param {Array} arrays The arrays to inspect.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of values.\n     */\n    function baseXor(arrays, iteratee, comparator) {\n      var length = arrays.length;\n      if (length < 2) {\n        return length ? baseUniq(arrays[0]) : [];\n      }\n      var index = -1,\n          result = Array(length);\n\n      while (++index < length) {\n        var array = arrays[index],\n            othIndex = -1;\n\n        while (++othIndex < length) {\n          if (othIndex != index) {\n            result[index] = baseDifference(result[index] || array, arrays[othIndex], iteratee, comparator);\n          }\n        }\n      }\n      return baseUniq(baseFlatten(result, 1), iteratee, comparator);\n    }\n\n    /**\n     * This base implementation of `_.zipObject` which assigns values using `assignFunc`.\n     *\n     * @private\n     * @param {Array} props The property identifiers.\n     * @param {Array} values The property values.\n     * @param {Function} assignFunc The function to assign values.\n     * @returns {Object} Returns the new object.\n     */\n    function baseZipObject(props, values, assignFunc) {\n      var index = -1,\n          length = props.length,\n          valsLength = values.length,\n          result = {};\n\n      while (++index < length) {\n        var value = index < valsLength ? values[index] : undefined;\n        assignFunc(result, props[index], value);\n      }\n      return result;\n    }\n\n    /**\n     * Casts `value` to an empty array if it's not an array like object.\n     *\n     * @private\n     * @param {*} value The value to inspect.\n     * @returns {Array|Object} Returns the cast array-like object.\n     */\n    function castArrayLikeObject(value) {\n      return isArrayLikeObject(value) ? value : [];\n    }\n\n    /**\n     * Casts `value` to `identity` if it's not a function.\n     *\n     * @private\n     * @param {*} value The value to inspect.\n     * @returns {Function} Returns cast function.\n     */\n    function castFunction(value) {\n      return typeof value == 'function' ? value : identity;\n    }\n\n    /**\n     * Casts `value` to a path array if it's not one.\n     *\n     * @private\n     * @param {*} value The value to inspect.\n     * @param {Object} [object] The object to query keys on.\n     * @returns {Array} Returns the cast property path array.\n     */\n    function castPath(value, object) {\n      if (isArray(value)) {\n        return value;\n      }\n      return isKey(value, object) ? [value] : stringToPath(toString(value));\n    }\n\n    /**\n     * A `baseRest` alias which can be replaced with `identity` by module\n     * replacement plugins.\n     *\n     * @private\n     * @type {Function}\n     * @param {Function} func The function to apply a rest parameter to.\n     * @returns {Function} Returns the new function.\n     */\n    var castRest = baseRest;\n\n    /**\n     * Casts `array` to a slice if it's needed.\n     *\n     * @private\n     * @param {Array} array The array to inspect.\n     * @param {number} start The start position.\n     * @param {number} [end=array.length] The end position.\n     * @returns {Array} Returns the cast slice.\n     */\n    function castSlice(array, start, end) {\n      var length = array.length;\n      end = end === undefined ? length : end;\n      return (!start && end >= length) ? array : baseSlice(array, start, end);\n    }\n\n    /**\n     * A simple wrapper around the global [`clearTimeout`](https://mdn.io/clearTimeout).\n     *\n     * @private\n     * @param {number|Object} id The timer id or timeout object of the timer to clear.\n     */\n    var clearTimeout = ctxClearTimeout || function(id) {\n      return root.clearTimeout(id);\n    };\n\n    /**\n     * Creates a clone of  `buffer`.\n     *\n     * @private\n     * @param {Buffer} buffer The buffer to clone.\n     * @param {boolean} [isDeep] Specify a deep clone.\n     * @returns {Buffer} Returns the cloned buffer.\n     */\n    function cloneBuffer(buffer, isDeep) {\n      if (isDeep) {\n        return buffer.slice();\n      }\n      var length = buffer.length,\n          result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);\n\n      buffer.copy(result);\n      return result;\n    }\n\n    /**\n     * Creates a clone of `arrayBuffer`.\n     *\n     * @private\n     * @param {ArrayBuffer} arrayBuffer The array buffer to clone.\n     * @returns {ArrayBuffer} Returns the cloned array buffer.\n     */\n    function cloneArrayBuffer(arrayBuffer) {\n      var result = new arrayBuffer.constructor(arrayBuffer.byteLength);\n      new Uint8Array(result).set(new Uint8Array(arrayBuffer));\n      return result;\n    }\n\n    /**\n     * Creates a clone of `dataView`.\n     *\n     * @private\n     * @param {Object} dataView The data view to clone.\n     * @param {boolean} [isDeep] Specify a deep clone.\n     * @returns {Object} Returns the cloned data view.\n     */\n    function cloneDataView(dataView, isDeep) {\n      var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;\n      return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);\n    }\n\n    /**\n     * Creates a clone of `regexp`.\n     *\n     * @private\n     * @param {Object} regexp The regexp to clone.\n     * @returns {Object} Returns the cloned regexp.\n     */\n    function cloneRegExp(regexp) {\n      var result = new regexp.constructor(regexp.source, reFlags.exec(regexp));\n      result.lastIndex = regexp.lastIndex;\n      return result;\n    }\n\n    /**\n     * Creates a clone of the `symbol` object.\n     *\n     * @private\n     * @param {Object} symbol The symbol object to clone.\n     * @returns {Object} Returns the cloned symbol object.\n     */\n    function cloneSymbol(symbol) {\n      return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {};\n    }\n\n    /**\n     * Creates a clone of `typedArray`.\n     *\n     * @private\n     * @param {Object} typedArray The typed array to clone.\n     * @param {boolean} [isDeep] Specify a deep clone.\n     * @returns {Object} Returns the cloned typed array.\n     */\n    function cloneTypedArray(typedArray, isDeep) {\n      var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;\n      return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);\n    }\n\n    /**\n     * Compares values to sort them in ascending order.\n     *\n     * @private\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {number} Returns the sort order indicator for `value`.\n     */\n    function compareAscending(value, other) {\n      if (value !== other) {\n        var valIsDefined = value !== undefined,\n            valIsNull = value === null,\n            valIsReflexive = value === value,\n            valIsSymbol = isSymbol(value);\n\n        var othIsDefined = other !== undefined,\n            othIsNull = other === null,\n            othIsReflexive = other === other,\n            othIsSymbol = isSymbol(other);\n\n        if ((!othIsNull && !othIsSymbol && !valIsSymbol && value > other) ||\n            (valIsSymbol && othIsDefined && othIsReflexive && !othIsNull && !othIsSymbol) ||\n            (valIsNull && othIsDefined && othIsReflexive) ||\n            (!valIsDefined && othIsReflexive) ||\n            !valIsReflexive) {\n          return 1;\n        }\n        if ((!valIsNull && !valIsSymbol && !othIsSymbol && value < other) ||\n            (othIsSymbol && valIsDefined && valIsReflexive && !valIsNull && !valIsSymbol) ||\n            (othIsNull && valIsDefined && valIsReflexive) ||\n            (!othIsDefined && valIsReflexive) ||\n            !othIsReflexive) {\n          return -1;\n        }\n      }\n      return 0;\n    }\n\n    /**\n     * Used by `_.orderBy` to compare multiple properties of a value to another\n     * and stable sort them.\n     *\n     * If `orders` is unspecified, all values are sorted in ascending order. Otherwise,\n     * specify an order of \"desc\" for descending or \"asc\" for ascending sort order\n     * of corresponding values.\n     *\n     * @private\n     * @param {Object} object The object to compare.\n     * @param {Object} other The other object to compare.\n     * @param {boolean[]|string[]} orders The order to sort by for each property.\n     * @returns {number} Returns the sort order indicator for `object`.\n     */\n    function compareMultiple(object, other, orders) {\n      var index = -1,\n          objCriteria = object.criteria,\n          othCriteria = other.criteria,\n          length = objCriteria.length,\n          ordersLength = orders.length;\n\n      while (++index < length) {\n        var result = compareAscending(objCriteria[index], othCriteria[index]);\n        if (result) {\n          if (index >= ordersLength) {\n            return result;\n          }\n          var order = orders[index];\n          return result * (order == 'desc' ? -1 : 1);\n        }\n      }\n      // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications\n      // that causes it, under certain circumstances, to provide the same value for\n      // `object` and `other`. See https://github.com/jashkenas/underscore/pull/1247\n      // for more details.\n      //\n      // This also ensures a stable sort in V8 and other engines.\n      // See https://bugs.chromium.org/p/v8/issues/detail?id=90 for more details.\n      return object.index - other.index;\n    }\n\n    /**\n     * Creates an array that is the composition of partially applied arguments,\n     * placeholders, and provided arguments into a single array of arguments.\n     *\n     * @private\n     * @param {Array} args The provided arguments.\n     * @param {Array} partials The arguments to prepend to those provided.\n     * @param {Array} holders The `partials` placeholder indexes.\n     * @params {boolean} [isCurried] Specify composing for a curried function.\n     * @returns {Array} Returns the new array of composed arguments.\n     */\n    function composeArgs(args, partials, holders, isCurried) {\n      var argsIndex = -1,\n          argsLength = args.length,\n          holdersLength = holders.length,\n          leftIndex = -1,\n          leftLength = partials.length,\n          rangeLength = nativeMax(argsLength - holdersLength, 0),\n          result = Array(leftLength + rangeLength),\n          isUncurried = !isCurried;\n\n      while (++leftIndex < leftLength) {\n        result[leftIndex] = partials[leftIndex];\n      }\n      while (++argsIndex < holdersLength) {\n        if (isUncurried || argsIndex < argsLength) {\n          result[holders[argsIndex]] = args[argsIndex];\n        }\n      }\n      while (rangeLength--) {\n        result[leftIndex++] = args[argsIndex++];\n      }\n      return result;\n    }\n\n    /**\n     * This function is like `composeArgs` except that the arguments composition\n     * is tailored for `_.partialRight`.\n     *\n     * @private\n     * @param {Array} args The provided arguments.\n     * @param {Array} partials The arguments to append to those provided.\n     * @param {Array} holders The `partials` placeholder indexes.\n     * @params {boolean} [isCurried] Specify composing for a curried function.\n     * @returns {Array} Returns the new array of composed arguments.\n     */\n    function composeArgsRight(args, partials, holders, isCurried) {\n      var argsIndex = -1,\n          argsLength = args.length,\n          holdersIndex = -1,\n          holdersLength = holders.length,\n          rightIndex = -1,\n          rightLength = partials.length,\n          rangeLength = nativeMax(argsLength - holdersLength, 0),\n          result = Array(rangeLength + rightLength),\n          isUncurried = !isCurried;\n\n      while (++argsIndex < rangeLength) {\n        result[argsIndex] = args[argsIndex];\n      }\n      var offset = argsIndex;\n      while (++rightIndex < rightLength) {\n        result[offset + rightIndex] = partials[rightIndex];\n      }\n      while (++holdersIndex < holdersLength) {\n        if (isUncurried || argsIndex < argsLength) {\n          result[offset + holders[holdersIndex]] = args[argsIndex++];\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Copies the values of `source` to `array`.\n     *\n     * @private\n     * @param {Array} source The array to copy values from.\n     * @param {Array} [array=[]] The array to copy values to.\n     * @returns {Array} Returns `array`.\n     */\n    function copyArray(source, array) {\n      var index = -1,\n          length = source.length;\n\n      array || (array = Array(length));\n      while (++index < length) {\n        array[index] = source[index];\n      }\n      return array;\n    }\n\n    /**\n     * Copies properties of `source` to `object`.\n     *\n     * @private\n     * @param {Object} source The object to copy properties from.\n     * @param {Array} props The property identifiers to copy.\n     * @param {Object} [object={}] The object to copy properties to.\n     * @param {Function} [customizer] The function to customize copied values.\n     * @returns {Object} Returns `object`.\n     */\n    function copyObject(source, props, object, customizer) {\n      var isNew = !object;\n      object || (object = {});\n\n      var index = -1,\n          length = props.length;\n\n      while (++index < length) {\n        var key = props[index];\n\n        var newValue = customizer\n          ? customizer(object[key], source[key], key, object, source)\n          : undefined;\n\n        if (newValue === undefined) {\n          newValue = source[key];\n        }\n        if (isNew) {\n          baseAssignValue(object, key, newValue);\n        } else {\n          assignValue(object, key, newValue);\n        }\n      }\n      return object;\n    }\n\n    /**\n     * Copies own symbols of `source` to `object`.\n     *\n     * @private\n     * @param {Object} source The object to copy symbols from.\n     * @param {Object} [object={}] The object to copy symbols to.\n     * @returns {Object} Returns `object`.\n     */\n    function copySymbols(source, object) {\n      return copyObject(source, getSymbols(source), object);\n    }\n\n    /**\n     * Copies own and inherited symbols of `source` to `object`.\n     *\n     * @private\n     * @param {Object} source The object to copy symbols from.\n     * @param {Object} [object={}] The object to copy symbols to.\n     * @returns {Object} Returns `object`.\n     */\n    function copySymbolsIn(source, object) {\n      return copyObject(source, getSymbolsIn(source), object);\n    }\n\n    /**\n     * Creates a function like `_.groupBy`.\n     *\n     * @private\n     * @param {Function} setter The function to set accumulator values.\n     * @param {Function} [initializer] The accumulator object initializer.\n     * @returns {Function} Returns the new aggregator function.\n     */\n    function createAggregator(setter, initializer) {\n      return function(collection, iteratee) {\n        var func = isArray(collection) ? arrayAggregator : baseAggregator,\n            accumulator = initializer ? initializer() : {};\n\n        return func(collection, setter, getIteratee(iteratee, 2), accumulator);\n      };\n    }\n\n    /**\n     * Creates a function like `_.assign`.\n     *\n     * @private\n     * @param {Function} assigner The function to assign values.\n     * @returns {Function} Returns the new assigner function.\n     */\n    function createAssigner(assigner) {\n      return baseRest(function(object, sources) {\n        var index = -1,\n            length = sources.length,\n            customizer = length > 1 ? sources[length - 1] : undefined,\n            guard = length > 2 ? sources[2] : undefined;\n\n        customizer = (assigner.length > 3 && typeof customizer == 'function')\n          ? (length--, customizer)\n          : undefined;\n\n        if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n          customizer = length < 3 ? undefined : customizer;\n          length = 1;\n        }\n        object = Object(object);\n        while (++index < length) {\n          var source = sources[index];\n          if (source) {\n            assigner(object, source, index, customizer);\n          }\n        }\n        return object;\n      });\n    }\n\n    /**\n     * Creates a `baseEach` or `baseEachRight` function.\n     *\n     * @private\n     * @param {Function} eachFunc The function to iterate over a collection.\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Function} Returns the new base function.\n     */\n    function createBaseEach(eachFunc, fromRight) {\n      return function(collection, iteratee) {\n        if (collection == null) {\n          return collection;\n        }\n        if (!isArrayLike(collection)) {\n          return eachFunc(collection, iteratee);\n        }\n        var length = collection.length,\n            index = fromRight ? length : -1,\n            iterable = Object(collection);\n\n        while ((fromRight ? index-- : ++index < length)) {\n          if (iteratee(iterable[index], index, iterable) === false) {\n            break;\n          }\n        }\n        return collection;\n      };\n    }\n\n    /**\n     * Creates a base function for methods like `_.forIn` and `_.forOwn`.\n     *\n     * @private\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Function} Returns the new base function.\n     */\n    function createBaseFor(fromRight) {\n      return function(object, iteratee, keysFunc) {\n        var index = -1,\n            iterable = Object(object),\n            props = keysFunc(object),\n            length = props.length;\n\n        while (length--) {\n          var key = props[fromRight ? length : ++index];\n          if (iteratee(iterable[key], key, iterable) === false) {\n            break;\n          }\n        }\n        return object;\n      };\n    }\n\n    /**\n     * Creates a function that wraps `func` to invoke it with the optional `this`\n     * binding of `thisArg`.\n     *\n     * @private\n     * @param {Function} func The function to wrap.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @param {*} [thisArg] The `this` binding of `func`.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createBind(func, bitmask, thisArg) {\n      var isBind = bitmask & WRAP_BIND_FLAG,\n          Ctor = createCtor(func);\n\n      function wrapper() {\n        var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\n        return fn.apply(isBind ? thisArg : this, arguments);\n      }\n      return wrapper;\n    }\n\n    /**\n     * Creates a function like `_.lowerFirst`.\n     *\n     * @private\n     * @param {string} methodName The name of the `String` case method to use.\n     * @returns {Function} Returns the new case function.\n     */\n    function createCaseFirst(methodName) {\n      return function(string) {\n        string = toString(string);\n\n        var strSymbols = hasUnicode(string)\n          ? stringToArray(string)\n          : undefined;\n\n        var chr = strSymbols\n          ? strSymbols[0]\n          : string.charAt(0);\n\n        var trailing = strSymbols\n          ? castSlice(strSymbols, 1).join('')\n          : string.slice(1);\n\n        return chr[methodName]() + trailing;\n      };\n    }\n\n    /**\n     * Creates a function like `_.camelCase`.\n     *\n     * @private\n     * @param {Function} callback The function to combine each word.\n     * @returns {Function} Returns the new compounder function.\n     */\n    function createCompounder(callback) {\n      return function(string) {\n        return arrayReduce(words(deburr(string).replace(reApos, '')), callback, '');\n      };\n    }\n\n    /**\n     * Creates a function that produces an instance of `Ctor` regardless of\n     * whether it was invoked as part of a `new` expression or by `call` or `apply`.\n     *\n     * @private\n     * @param {Function} Ctor The constructor to wrap.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createCtor(Ctor) {\n      return function() {\n        // Use a `switch` statement to work with class constructors. See\n        // http://ecma-international.org/ecma-262/7.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist\n        // for more details.\n        var args = arguments;\n        switch (args.length) {\n          case 0: return new Ctor;\n          case 1: return new Ctor(args[0]);\n          case 2: return new Ctor(args[0], args[1]);\n          case 3: return new Ctor(args[0], args[1], args[2]);\n          case 4: return new Ctor(args[0], args[1], args[2], args[3]);\n          case 5: return new Ctor(args[0], args[1], args[2], args[3], args[4]);\n          case 6: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5]);\n          case 7: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);\n        }\n        var thisBinding = baseCreate(Ctor.prototype),\n            result = Ctor.apply(thisBinding, args);\n\n        // Mimic the constructor's `return` behavior.\n        // See https://es5.github.io/#x13.2.2 for more details.\n        return isObject(result) ? result : thisBinding;\n      };\n    }\n\n    /**\n     * Creates a function that wraps `func` to enable currying.\n     *\n     * @private\n     * @param {Function} func The function to wrap.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @param {number} arity The arity of `func`.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createCurry(func, bitmask, arity) {\n      var Ctor = createCtor(func);\n\n      function wrapper() {\n        var length = arguments.length,\n            args = Array(length),\n            index = length,\n            placeholder = getHolder(wrapper);\n\n        while (index--) {\n          args[index] = arguments[index];\n        }\n        var holders = (length < 3 && args[0] !== placeholder && args[length - 1] !== placeholder)\n          ? []\n          : replaceHolders(args, placeholder);\n\n        length -= holders.length;\n        if (length < arity) {\n          return createRecurry(\n            func, bitmask, createHybrid, wrapper.placeholder, undefined,\n            args, holders, undefined, undefined, arity - length);\n        }\n        var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\n        return apply(fn, this, args);\n      }\n      return wrapper;\n    }\n\n    /**\n     * Creates a `_.find` or `_.findLast` function.\n     *\n     * @private\n     * @param {Function} findIndexFunc The function to find the collection index.\n     * @returns {Function} Returns the new find function.\n     */\n    function createFind(findIndexFunc) {\n      return function(collection, predicate, fromIndex) {\n        var iterable = Object(collection);\n        if (!isArrayLike(collection)) {\n          var iteratee = getIteratee(predicate, 3);\n          collection = keys(collection);\n          predicate = function(key) { return iteratee(iterable[key], key, iterable); };\n        }\n        var index = findIndexFunc(collection, predicate, fromIndex);\n        return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined;\n      };\n    }\n\n    /**\n     * Creates a `_.flow` or `_.flowRight` function.\n     *\n     * @private\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Function} Returns the new flow function.\n     */\n    function createFlow(fromRight) {\n      return flatRest(function(funcs) {\n        var length = funcs.length,\n            index = length,\n            prereq = LodashWrapper.prototype.thru;\n\n        if (fromRight) {\n          funcs.reverse();\n        }\n        while (index--) {\n          var func = funcs[index];\n          if (typeof func != 'function') {\n            throw new TypeError(FUNC_ERROR_TEXT);\n          }\n          if (prereq && !wrapper && getFuncName(func) == 'wrapper') {\n            var wrapper = new LodashWrapper([], true);\n          }\n        }\n        index = wrapper ? index : length;\n        while (++index < length) {\n          func = funcs[index];\n\n          var funcName = getFuncName(func),\n              data = funcName == 'wrapper' ? getData(func) : undefined;\n\n          if (data && isLaziable(data[0]) &&\n                data[1] == (WRAP_ARY_FLAG | WRAP_CURRY_FLAG | WRAP_PARTIAL_FLAG | WRAP_REARG_FLAG) &&\n                !data[4].length && data[9] == 1\n              ) {\n            wrapper = wrapper[getFuncName(data[0])].apply(wrapper, data[3]);\n          } else {\n            wrapper = (func.length == 1 && isLaziable(func))\n              ? wrapper[funcName]()\n              : wrapper.thru(func);\n          }\n        }\n        return function() {\n          var args = arguments,\n              value = args[0];\n\n          if (wrapper && args.length == 1 && isArray(value)) {\n            return wrapper.plant(value).value();\n          }\n          var index = 0,\n              result = length ? funcs[index].apply(this, args) : value;\n\n          while (++index < length) {\n            result = funcs[index].call(this, result);\n          }\n          return result;\n        };\n      });\n    }\n\n    /**\n     * Creates a function that wraps `func` to invoke it with optional `this`\n     * binding of `thisArg`, partial application, and currying.\n     *\n     * @private\n     * @param {Function|string} func The function or method name to wrap.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @param {*} [thisArg] The `this` binding of `func`.\n     * @param {Array} [partials] The arguments to prepend to those provided to\n     *  the new function.\n     * @param {Array} [holders] The `partials` placeholder indexes.\n     * @param {Array} [partialsRight] The arguments to append to those provided\n     *  to the new function.\n     * @param {Array} [holdersRight] The `partialsRight` placeholder indexes.\n     * @param {Array} [argPos] The argument positions of the new function.\n     * @param {number} [ary] The arity cap of `func`.\n     * @param {number} [arity] The arity of `func`.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createHybrid(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) {\n      var isAry = bitmask & WRAP_ARY_FLAG,\n          isBind = bitmask & WRAP_BIND_FLAG,\n          isBindKey = bitmask & WRAP_BIND_KEY_FLAG,\n          isCurried = bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG),\n          isFlip = bitmask & WRAP_FLIP_FLAG,\n          Ctor = isBindKey ? undefined : createCtor(func);\n\n      function wrapper() {\n        var length = arguments.length,\n            args = Array(length),\n            index = length;\n\n        while (index--) {\n          args[index] = arguments[index];\n        }\n        if (isCurried) {\n          var placeholder = getHolder(wrapper),\n              holdersCount = countHolders(args, placeholder);\n        }\n        if (partials) {\n          args = composeArgs(args, partials, holders, isCurried);\n        }\n        if (partialsRight) {\n          args = composeArgsRight(args, partialsRight, holdersRight, isCurried);\n        }\n        length -= holdersCount;\n        if (isCurried && length < arity) {\n          var newHolders = replaceHolders(args, placeholder);\n          return createRecurry(\n            func, bitmask, createHybrid, wrapper.placeholder, thisArg,\n            args, newHolders, argPos, ary, arity - length\n          );\n        }\n        var thisBinding = isBind ? thisArg : this,\n            fn = isBindKey ? thisBinding[func] : func;\n\n        length = args.length;\n        if (argPos) {\n          args = reorder(args, argPos);\n        } else if (isFlip && length > 1) {\n          args.reverse();\n        }\n        if (isAry && ary < length) {\n          args.length = ary;\n        }\n        if (this && this !== root && this instanceof wrapper) {\n          fn = Ctor || createCtor(fn);\n        }\n        return fn.apply(thisBinding, args);\n      }\n      return wrapper;\n    }\n\n    /**\n     * Creates a function like `_.invertBy`.\n     *\n     * @private\n     * @param {Function} setter The function to set accumulator values.\n     * @param {Function} toIteratee The function to resolve iteratees.\n     * @returns {Function} Returns the new inverter function.\n     */\n    function createInverter(setter, toIteratee) {\n      return function(object, iteratee) {\n        return baseInverter(object, setter, toIteratee(iteratee), {});\n      };\n    }\n\n    /**\n     * Creates a function that performs a mathematical operation on two values.\n     *\n     * @private\n     * @param {Function} operator The function to perform the operation.\n     * @param {number} [defaultValue] The value used for `undefined` arguments.\n     * @returns {Function} Returns the new mathematical operation function.\n     */\n    function createMathOperation(operator, defaultValue) {\n      return function(value, other) {\n        var result;\n        if (value === undefined && other === undefined) {\n          return defaultValue;\n        }\n        if (value !== undefined) {\n          result = value;\n        }\n        if (other !== undefined) {\n          if (result === undefined) {\n            return other;\n          }\n          if (typeof value == 'string' || typeof other == 'string') {\n            value = baseToString(value);\n            other = baseToString(other);\n          } else {\n            value = baseToNumber(value);\n            other = baseToNumber(other);\n          }\n          result = operator(value, other);\n        }\n        return result;\n      };\n    }\n\n    /**\n     * Creates a function like `_.over`.\n     *\n     * @private\n     * @param {Function} arrayFunc The function to iterate over iteratees.\n     * @returns {Function} Returns the new over function.\n     */\n    function createOver(arrayFunc) {\n      return flatRest(function(iteratees) {\n        iteratees = arrayMap(iteratees, baseUnary(getIteratee()));\n        return baseRest(function(args) {\n          var thisArg = this;\n          return arrayFunc(iteratees, function(iteratee) {\n            return apply(iteratee, thisArg, args);\n          });\n        });\n      });\n    }\n\n    /**\n     * Creates the padding for `string` based on `length`. The `chars` string\n     * is truncated if the number of characters exceeds `length`.\n     *\n     * @private\n     * @param {number} length The padding length.\n     * @param {string} [chars=' '] The string used as padding.\n     * @returns {string} Returns the padding for `string`.\n     */\n    function createPadding(length, chars) {\n      chars = chars === undefined ? ' ' : baseToString(chars);\n\n      var charsLength = chars.length;\n      if (charsLength < 2) {\n        return charsLength ? baseRepeat(chars, length) : chars;\n      }\n      var result = baseRepeat(chars, nativeCeil(length / stringSize(chars)));\n      return hasUnicode(chars)\n        ? castSlice(stringToArray(result), 0, length).join('')\n        : result.slice(0, length);\n    }\n\n    /**\n     * Creates a function that wraps `func` to invoke it with the `this` binding\n     * of `thisArg` and `partials` prepended to the arguments it receives.\n     *\n     * @private\n     * @param {Function} func The function to wrap.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @param {*} thisArg The `this` binding of `func`.\n     * @param {Array} partials The arguments to prepend to those provided to\n     *  the new function.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createPartial(func, bitmask, thisArg, partials) {\n      var isBind = bitmask & WRAP_BIND_FLAG,\n          Ctor = createCtor(func);\n\n      function wrapper() {\n        var argsIndex = -1,\n            argsLength = arguments.length,\n            leftIndex = -1,\n            leftLength = partials.length,\n            args = Array(leftLength + argsLength),\n            fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\n\n        while (++leftIndex < leftLength) {\n          args[leftIndex] = partials[leftIndex];\n        }\n        while (argsLength--) {\n          args[leftIndex++] = arguments[++argsIndex];\n        }\n        return apply(fn, isBind ? thisArg : this, args);\n      }\n      return wrapper;\n    }\n\n    /**\n     * Creates a `_.range` or `_.rangeRight` function.\n     *\n     * @private\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Function} Returns the new range function.\n     */\n    function createRange(fromRight) {\n      return function(start, end, step) {\n        if (step && typeof step != 'number' && isIterateeCall(start, end, step)) {\n          end = step = undefined;\n        }\n        // Ensure the sign of `-0` is preserved.\n        start = toFinite(start);\n        if (end === undefined) {\n          end = start;\n          start = 0;\n        } else {\n          end = toFinite(end);\n        }\n        step = step === undefined ? (start < end ? 1 : -1) : toFinite(step);\n        return baseRange(start, end, step, fromRight);\n      };\n    }\n\n    /**\n     * Creates a function that performs a relational operation on two values.\n     *\n     * @private\n     * @param {Function} operator The function to perform the operation.\n     * @returns {Function} Returns the new relational operation function.\n     */\n    function createRelationalOperation(operator) {\n      return function(value, other) {\n        if (!(typeof value == 'string' && typeof other == 'string')) {\n          value = toNumber(value);\n          other = toNumber(other);\n        }\n        return operator(value, other);\n      };\n    }\n\n    /**\n     * Creates a function that wraps `func` to continue currying.\n     *\n     * @private\n     * @param {Function} func The function to wrap.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @param {Function} wrapFunc The function to create the `func` wrapper.\n     * @param {*} placeholder The placeholder value.\n     * @param {*} [thisArg] The `this` binding of `func`.\n     * @param {Array} [partials] The arguments to prepend to those provided to\n     *  the new function.\n     * @param {Array} [holders] The `partials` placeholder indexes.\n     * @param {Array} [argPos] The argument positions of the new function.\n     * @param {number} [ary] The arity cap of `func`.\n     * @param {number} [arity] The arity of `func`.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createRecurry(func, bitmask, wrapFunc, placeholder, thisArg, partials, holders, argPos, ary, arity) {\n      var isCurry = bitmask & WRAP_CURRY_FLAG,\n          newHolders = isCurry ? holders : undefined,\n          newHoldersRight = isCurry ? undefined : holders,\n          newPartials = isCurry ? partials : undefined,\n          newPartialsRight = isCurry ? undefined : partials;\n\n      bitmask |= (isCurry ? WRAP_PARTIAL_FLAG : WRAP_PARTIAL_RIGHT_FLAG);\n      bitmask &= ~(isCurry ? WRAP_PARTIAL_RIGHT_FLAG : WRAP_PARTIAL_FLAG);\n\n      if (!(bitmask & WRAP_CURRY_BOUND_FLAG)) {\n        bitmask &= ~(WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG);\n      }\n      var newData = [\n        func, bitmask, thisArg, newPartials, newHolders, newPartialsRight,\n        newHoldersRight, argPos, ary, arity\n      ];\n\n      var result = wrapFunc.apply(undefined, newData);\n      if (isLaziable(func)) {\n        setData(result, newData);\n      }\n      result.placeholder = placeholder;\n      return setWrapToString(result, func, bitmask);\n    }\n\n    /**\n     * Creates a function like `_.round`.\n     *\n     * @private\n     * @param {string} methodName The name of the `Math` method to use when rounding.\n     * @returns {Function} Returns the new round function.\n     */\n    function createRound(methodName) {\n      var func = Math[methodName];\n      return function(number, precision) {\n        number = toNumber(number);\n        precision = precision == null ? 0 : nativeMin(toInteger(precision), 292);\n        if (precision && nativeIsFinite(number)) {\n          // Shift with exponential notation to avoid floating-point issues.\n          // See [MDN](https://mdn.io/round#Examples) for more details.\n          var pair = (toString(number) + 'e').split('e'),\n              value = func(pair[0] + 'e' + (+pair[1] + precision));\n\n          pair = (toString(value) + 'e').split('e');\n          return +(pair[0] + 'e' + (+pair[1] - precision));\n        }\n        return func(number);\n      };\n    }\n\n    /**\n     * Creates a set object of `values`.\n     *\n     * @private\n     * @param {Array} values The values to add to the set.\n     * @returns {Object} Returns the new set.\n     */\n    var createSet = !(Set && (1 / setToArray(new Set([,-0]))[1]) == INFINITY) ? noop : function(values) {\n      return new Set(values);\n    };\n\n    /**\n     * Creates a `_.toPairs` or `_.toPairsIn` function.\n     *\n     * @private\n     * @param {Function} keysFunc The function to get the keys of a given object.\n     * @returns {Function} Returns the new pairs function.\n     */\n    function createToPairs(keysFunc) {\n      return function(object) {\n        var tag = getTag(object);\n        if (tag == mapTag) {\n          return mapToArray(object);\n        }\n        if (tag == setTag) {\n          return setToPairs(object);\n        }\n        return baseToPairs(object, keysFunc(object));\n      };\n    }\n\n    /**\n     * Creates a function that either curries or invokes `func` with optional\n     * `this` binding and partially applied arguments.\n     *\n     * @private\n     * @param {Function|string} func The function or method name to wrap.\n     * @param {number} bitmask The bitmask flags.\n     *    1 - `_.bind`\n     *    2 - `_.bindKey`\n     *    4 - `_.curry` or `_.curryRight` of a bound function\n     *    8 - `_.curry`\n     *   16 - `_.curryRight`\n     *   32 - `_.partial`\n     *   64 - `_.partialRight`\n     *  128 - `_.rearg`\n     *  256 - `_.ary`\n     *  512 - `_.flip`\n     * @param {*} [thisArg] The `this` binding of `func`.\n     * @param {Array} [partials] The arguments to be partially applied.\n     * @param {Array} [holders] The `partials` placeholder indexes.\n     * @param {Array} [argPos] The argument positions of the new function.\n     * @param {number} [ary] The arity cap of `func`.\n     * @param {number} [arity] The arity of `func`.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createWrap(func, bitmask, thisArg, partials, holders, argPos, ary, arity) {\n      var isBindKey = bitmask & WRAP_BIND_KEY_FLAG;\n      if (!isBindKey && typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      var length = partials ? partials.length : 0;\n      if (!length) {\n        bitmask &= ~(WRAP_PARTIAL_FLAG | WRAP_PARTIAL_RIGHT_FLAG);\n        partials = holders = undefined;\n      }\n      ary = ary === undefined ? ary : nativeMax(toInteger(ary), 0);\n      arity = arity === undefined ? arity : toInteger(arity);\n      length -= holders ? holders.length : 0;\n\n      if (bitmask & WRAP_PARTIAL_RIGHT_FLAG) {\n        var partialsRight = partials,\n            holdersRight = holders;\n\n        partials = holders = undefined;\n      }\n      var data = isBindKey ? undefined : getData(func);\n\n      var newData = [\n        func, bitmask, thisArg, partials, holders, partialsRight, holdersRight,\n        argPos, ary, arity\n      ];\n\n      if (data) {\n        mergeData(newData, data);\n      }\n      func = newData[0];\n      bitmask = newData[1];\n      thisArg = newData[2];\n      partials = newData[3];\n      holders = newData[4];\n      arity = newData[9] = newData[9] === undefined\n        ? (isBindKey ? 0 : func.length)\n        : nativeMax(newData[9] - length, 0);\n\n      if (!arity && bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG)) {\n        bitmask &= ~(WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG);\n      }\n      if (!bitmask || bitmask == WRAP_BIND_FLAG) {\n        var result = createBind(func, bitmask, thisArg);\n      } else if (bitmask == WRAP_CURRY_FLAG || bitmask == WRAP_CURRY_RIGHT_FLAG) {\n        result = createCurry(func, bitmask, arity);\n      } else if ((bitmask == WRAP_PARTIAL_FLAG || bitmask == (WRAP_BIND_FLAG | WRAP_PARTIAL_FLAG)) && !holders.length) {\n        result = createPartial(func, bitmask, thisArg, partials);\n      } else {\n        result = createHybrid.apply(undefined, newData);\n      }\n      var setter = data ? baseSetData : setData;\n      return setWrapToString(setter(result, newData), func, bitmask);\n    }\n\n    /**\n     * Used by `_.defaults` to customize its `_.assignIn` use to assign properties\n     * of source objects to the destination object for all destination properties\n     * that resolve to `undefined`.\n     *\n     * @private\n     * @param {*} objValue The destination value.\n     * @param {*} srcValue The source value.\n     * @param {string} key The key of the property to assign.\n     * @param {Object} object The parent object of `objValue`.\n     * @returns {*} Returns the value to assign.\n     */\n    function customDefaultsAssignIn(objValue, srcValue, key, object) {\n      if (objValue === undefined ||\n          (eq(objValue, objectProto[key]) && !hasOwnProperty.call(object, key))) {\n        return srcValue;\n      }\n      return objValue;\n    }\n\n    /**\n     * Used by `_.defaultsDeep` to customize its `_.merge` use to merge source\n     * objects into destination objects that are passed thru.\n     *\n     * @private\n     * @param {*} objValue The destination value.\n     * @param {*} srcValue The source value.\n     * @param {string} key The key of the property to merge.\n     * @param {Object} object The parent object of `objValue`.\n     * @param {Object} source The parent object of `srcValue`.\n     * @param {Object} [stack] Tracks traversed source values and their merged\n     *  counterparts.\n     * @returns {*} Returns the value to assign.\n     */\n    function customDefaultsMerge(objValue, srcValue, key, object, source, stack) {\n      if (isObject(objValue) && isObject(srcValue)) {\n        // Recursively merge objects and arrays (susceptible to call stack limits).\n        stack.set(srcValue, objValue);\n        baseMerge(objValue, srcValue, undefined, customDefaultsMerge, stack);\n        stack['delete'](srcValue);\n      }\n      return objValue;\n    }\n\n    /**\n     * Used by `_.omit` to customize its `_.cloneDeep` use to only clone plain\n     * objects.\n     *\n     * @private\n     * @param {*} value The value to inspect.\n     * @param {string} key The key of the property to inspect.\n     * @returns {*} Returns the uncloned value or `undefined` to defer cloning to `_.cloneDeep`.\n     */\n    function customOmitClone(value) {\n      return isPlainObject(value) ? undefined : value;\n    }\n\n    /**\n     * A specialized version of `baseIsEqualDeep` for arrays with support for\n     * partial deep comparisons.\n     *\n     * @private\n     * @param {Array} array The array to compare.\n     * @param {Array} other The other array to compare.\n     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n     * @param {Function} customizer The function to customize comparisons.\n     * @param {Function} equalFunc The function to determine equivalents of values.\n     * @param {Object} stack Tracks traversed `array` and `other` objects.\n     * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.\n     */\n    function equalArrays(array, other, bitmask, customizer, equalFunc, stack) {\n      var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n          arrLength = array.length,\n          othLength = other.length;\n\n      if (arrLength != othLength && !(isPartial && othLength > arrLength)) {\n        return false;\n      }\n      // Check that cyclic values are equal.\n      var arrStacked = stack.get(array);\n      var othStacked = stack.get(other);\n      if (arrStacked && othStacked) {\n        return arrStacked == other && othStacked == array;\n      }\n      var index = -1,\n          result = true,\n          seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined;\n\n      stack.set(array, other);\n      stack.set(other, array);\n\n      // Ignore non-index properties.\n      while (++index < arrLength) {\n        var arrValue = array[index],\n            othValue = other[index];\n\n        if (customizer) {\n          var compared = isPartial\n            ? customizer(othValue, arrValue, index, other, array, stack)\n            : customizer(arrValue, othValue, index, array, other, stack);\n        }\n        if (compared !== undefined) {\n          if (compared) {\n            continue;\n          }\n          result = false;\n          break;\n        }\n        // Recursively compare arrays (susceptible to call stack limits).\n        if (seen) {\n          if (!arraySome(other, function(othValue, othIndex) {\n                if (!cacheHas(seen, othIndex) &&\n                    (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {\n                  return seen.push(othIndex);\n                }\n              })) {\n            result = false;\n            break;\n          }\n        } else if (!(\n              arrValue === othValue ||\n                equalFunc(arrValue, othValue, bitmask, customizer, stack)\n            )) {\n          result = false;\n          break;\n        }\n      }\n      stack['delete'](array);\n      stack['delete'](other);\n      return result;\n    }\n\n    /**\n     * A specialized version of `baseIsEqualDeep` for comparing objects of\n     * the same `toStringTag`.\n     *\n     * **Note:** This function only supports comparing values with tags of\n     * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\n     *\n     * @private\n     * @param {Object} object The object to compare.\n     * @param {Object} other The other object to compare.\n     * @param {string} tag The `toStringTag` of the objects to compare.\n     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n     * @param {Function} customizer The function to customize comparisons.\n     * @param {Function} equalFunc The function to determine equivalents of values.\n     * @param {Object} stack Tracks traversed `object` and `other` objects.\n     * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n     */\n    function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {\n      switch (tag) {\n        case dataViewTag:\n          if ((object.byteLength != other.byteLength) ||\n              (object.byteOffset != other.byteOffset)) {\n            return false;\n          }\n          object = object.buffer;\n          other = other.buffer;\n\n        case arrayBufferTag:\n          if ((object.byteLength != other.byteLength) ||\n              !equalFunc(new Uint8Array(object), new Uint8Array(other))) {\n            return false;\n          }\n          return true;\n\n        case boolTag:\n        case dateTag:\n        case numberTag:\n          // Coerce booleans to `1` or `0` and dates to milliseconds.\n          // Invalid dates are coerced to `NaN`.\n          return eq(+object, +other);\n\n        case errorTag:\n          return object.name == other.name && object.message == other.message;\n\n        case regexpTag:\n        case stringTag:\n          // Coerce regexes to strings and treat strings, primitives and objects,\n          // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring\n          // for more details.\n          return object == (other + '');\n\n        case mapTag:\n          var convert = mapToArray;\n\n        case setTag:\n          var isPartial = bitmask & COMPARE_PARTIAL_FLAG;\n          convert || (convert = setToArray);\n\n          if (object.size != other.size && !isPartial) {\n            return false;\n          }\n          // Assume cyclic values are equal.\n          var stacked = stack.get(object);\n          if (stacked) {\n            return stacked == other;\n          }\n          bitmask |= COMPARE_UNORDERED_FLAG;\n\n          // Recursively compare objects (susceptible to call stack limits).\n          stack.set(object, other);\n          var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);\n          stack['delete'](object);\n          return result;\n\n        case symbolTag:\n          if (symbolValueOf) {\n            return symbolValueOf.call(object) == symbolValueOf.call(other);\n          }\n      }\n      return false;\n    }\n\n    /**\n     * A specialized version of `baseIsEqualDeep` for objects with support for\n     * partial deep comparisons.\n     *\n     * @private\n     * @param {Object} object The object to compare.\n     * @param {Object} other The other object to compare.\n     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n     * @param {Function} customizer The function to customize comparisons.\n     * @param {Function} equalFunc The function to determine equivalents of values.\n     * @param {Object} stack Tracks traversed `object` and `other` objects.\n     * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n     */\n    function equalObjects(object, other, bitmask, customizer, equalFunc, stack) {\n      var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n          objProps = getAllKeys(object),\n          objLength = objProps.length,\n          othProps = getAllKeys(other),\n          othLength = othProps.length;\n\n      if (objLength != othLength && !isPartial) {\n        return false;\n      }\n      var index = objLength;\n      while (index--) {\n        var key = objProps[index];\n        if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {\n          return false;\n        }\n      }\n      // Check that cyclic values are equal.\n      var objStacked = stack.get(object);\n      var othStacked = stack.get(other);\n      if (objStacked && othStacked) {\n        return objStacked == other && othStacked == object;\n      }\n      var result = true;\n      stack.set(object, other);\n      stack.set(other, object);\n\n      var skipCtor = isPartial;\n      while (++index < objLength) {\n        key = objProps[index];\n        var objValue = object[key],\n            othValue = other[key];\n\n        if (customizer) {\n          var compared = isPartial\n            ? customizer(othValue, objValue, key, other, object, stack)\n            : customizer(objValue, othValue, key, object, other, stack);\n        }\n        // Recursively compare objects (susceptible to call stack limits).\n        if (!(compared === undefined\n              ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))\n              : compared\n            )) {\n          result = false;\n          break;\n        }\n        skipCtor || (skipCtor = key == 'constructor');\n      }\n      if (result && !skipCtor) {\n        var objCtor = object.constructor,\n            othCtor = other.constructor;\n\n        // Non `Object` object instances with different constructors are not equal.\n        if (objCtor != othCtor &&\n            ('constructor' in object && 'constructor' in other) &&\n            !(typeof objCtor == 'function' && objCtor instanceof objCtor &&\n              typeof othCtor == 'function' && othCtor instanceof othCtor)) {\n          result = false;\n        }\n      }\n      stack['delete'](object);\n      stack['delete'](other);\n      return result;\n    }\n\n    /**\n     * A specialized version of `baseRest` which flattens the rest array.\n     *\n     * @private\n     * @param {Function} func The function to apply a rest parameter to.\n     * @returns {Function} Returns the new function.\n     */\n    function flatRest(func) {\n      return setToString(overRest(func, undefined, flatten), func + '');\n    }\n\n    /**\n     * Creates an array of own enumerable property names and symbols of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names and symbols.\n     */\n    function getAllKeys(object) {\n      return baseGetAllKeys(object, keys, getSymbols);\n    }\n\n    /**\n     * Creates an array of own and inherited enumerable property names and\n     * symbols of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names and symbols.\n     */\n    function getAllKeysIn(object) {\n      return baseGetAllKeys(object, keysIn, getSymbolsIn);\n    }\n\n    /**\n     * Gets metadata for `func`.\n     *\n     * @private\n     * @param {Function} func The function to query.\n     * @returns {*} Returns the metadata for `func`.\n     */\n    var getData = !metaMap ? noop : function(func) {\n      return metaMap.get(func);\n    };\n\n    /**\n     * Gets the name of `func`.\n     *\n     * @private\n     * @param {Function} func The function to query.\n     * @returns {string} Returns the function name.\n     */\n    function getFuncName(func) {\n      var result = (func.name + ''),\n          array = realNames[result],\n          length = hasOwnProperty.call(realNames, result) ? array.length : 0;\n\n      while (length--) {\n        var data = array[length],\n            otherFunc = data.func;\n        if (otherFunc == null || otherFunc == func) {\n          return data.name;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Gets the argument placeholder value for `func`.\n     *\n     * @private\n     * @param {Function} func The function to inspect.\n     * @returns {*} Returns the placeholder value.\n     */\n    function getHolder(func) {\n      var object = hasOwnProperty.call(lodash, 'placeholder') ? lodash : func;\n      return object.placeholder;\n    }\n\n    /**\n     * Gets the appropriate \"iteratee\" function. If `_.iteratee` is customized,\n     * this function returns the custom method, otherwise it returns `baseIteratee`.\n     * If arguments are provided, the chosen function is invoked with them and\n     * its result is returned.\n     *\n     * @private\n     * @param {*} [value] The value to convert to an iteratee.\n     * @param {number} [arity] The arity of the created iteratee.\n     * @returns {Function} Returns the chosen function or its result.\n     */\n    function getIteratee() {\n      var result = lodash.iteratee || iteratee;\n      result = result === iteratee ? baseIteratee : result;\n      return arguments.length ? result(arguments[0], arguments[1]) : result;\n    }\n\n    /**\n     * Gets the data for `map`.\n     *\n     * @private\n     * @param {Object} map The map to query.\n     * @param {string} key The reference key.\n     * @returns {*} Returns the map data.\n     */\n    function getMapData(map, key) {\n      var data = map.__data__;\n      return isKeyable(key)\n        ? data[typeof key == 'string' ? 'string' : 'hash']\n        : data.map;\n    }\n\n    /**\n     * Gets the property names, values, and compare flags of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the match data of `object`.\n     */\n    function getMatchData(object) {\n      var result = keys(object),\n          length = result.length;\n\n      while (length--) {\n        var key = result[length],\n            value = object[key];\n\n        result[length] = [key, value, isStrictComparable(value)];\n      }\n      return result;\n    }\n\n    /**\n     * Gets the native function at `key` of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {string} key The key of the method to get.\n     * @returns {*} Returns the function if it's native, else `undefined`.\n     */\n    function getNative(object, key) {\n      var value = getValue(object, key);\n      return baseIsNative(value) ? value : undefined;\n    }\n\n    /**\n     * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n     *\n     * @private\n     * @param {*} value The value to query.\n     * @returns {string} Returns the raw `toStringTag`.\n     */\n    function getRawTag(value) {\n      var isOwn = hasOwnProperty.call(value, symToStringTag),\n          tag = value[symToStringTag];\n\n      try {\n        value[symToStringTag] = undefined;\n        var unmasked = true;\n      } catch (e) {}\n\n      var result = nativeObjectToString.call(value);\n      if (unmasked) {\n        if (isOwn) {\n          value[symToStringTag] = tag;\n        } else {\n          delete value[symToStringTag];\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Creates an array of the own enumerable symbols of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of symbols.\n     */\n    var getSymbols = !nativeGetSymbols ? stubArray : function(object) {\n      if (object == null) {\n        return [];\n      }\n      object = Object(object);\n      return arrayFilter(nativeGetSymbols(object), function(symbol) {\n        return propertyIsEnumerable.call(object, symbol);\n      });\n    };\n\n    /**\n     * Creates an array of the own and inherited enumerable symbols of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of symbols.\n     */\n    var getSymbolsIn = !nativeGetSymbols ? stubArray : function(object) {\n      var result = [];\n      while (object) {\n        arrayPush(result, getSymbols(object));\n        object = getPrototype(object);\n      }\n      return result;\n    };\n\n    /**\n     * Gets the `toStringTag` of `value`.\n     *\n     * @private\n     * @param {*} value The value to query.\n     * @returns {string} Returns the `toStringTag`.\n     */\n    var getTag = baseGetTag;\n\n    // Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.\n    if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||\n        (Map && getTag(new Map) != mapTag) ||\n        (Promise && getTag(Promise.resolve()) != promiseTag) ||\n        (Set && getTag(new Set) != setTag) ||\n        (WeakMap && getTag(new WeakMap) != weakMapTag)) {\n      getTag = function(value) {\n        var result = baseGetTag(value),\n            Ctor = result == objectTag ? value.constructor : undefined,\n            ctorString = Ctor ? toSource(Ctor) : '';\n\n        if (ctorString) {\n          switch (ctorString) {\n            case dataViewCtorString: return dataViewTag;\n            case mapCtorString: return mapTag;\n            case promiseCtorString: return promiseTag;\n            case setCtorString: return setTag;\n            case weakMapCtorString: return weakMapTag;\n          }\n        }\n        return result;\n      };\n    }\n\n    /**\n     * Gets the view, applying any `transforms` to the `start` and `end` positions.\n     *\n     * @private\n     * @param {number} start The start of the view.\n     * @param {number} end The end of the view.\n     * @param {Array} transforms The transformations to apply to the view.\n     * @returns {Object} Returns an object containing the `start` and `end`\n     *  positions of the view.\n     */\n    function getView(start, end, transforms) {\n      var index = -1,\n          length = transforms.length;\n\n      while (++index < length) {\n        var data = transforms[index],\n            size = data.size;\n\n        switch (data.type) {\n          case 'drop':      start += size; break;\n          case 'dropRight': end -= size; break;\n          case 'take':      end = nativeMin(end, start + size); break;\n          case 'takeRight': start = nativeMax(start, end - size); break;\n        }\n      }\n      return { 'start': start, 'end': end };\n    }\n\n    /**\n     * Extracts wrapper details from the `source` body comment.\n     *\n     * @private\n     * @param {string} source The source to inspect.\n     * @returns {Array} Returns the wrapper details.\n     */\n    function getWrapDetails(source) {\n      var match = source.match(reWrapDetails);\n      return match ? match[1].split(reSplitDetails) : [];\n    }\n\n    /**\n     * Checks if `path` exists on `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path to check.\n     * @param {Function} hasFunc The function to check properties.\n     * @returns {boolean} Returns `true` if `path` exists, else `false`.\n     */\n    function hasPath(object, path, hasFunc) {\n      path = castPath(path, object);\n\n      var index = -1,\n          length = path.length,\n          result = false;\n\n      while (++index < length) {\n        var key = toKey(path[index]);\n        if (!(result = object != null && hasFunc(object, key))) {\n          break;\n        }\n        object = object[key];\n      }\n      if (result || ++index != length) {\n        return result;\n      }\n      length = object == null ? 0 : object.length;\n      return !!length && isLength(length) && isIndex(key, length) &&\n        (isArray(object) || isArguments(object));\n    }\n\n    /**\n     * Initializes an array clone.\n     *\n     * @private\n     * @param {Array} array The array to clone.\n     * @returns {Array} Returns the initialized clone.\n     */\n    function initCloneArray(array) {\n      var length = array.length,\n          result = new array.constructor(length);\n\n      // Add properties assigned by `RegExp#exec`.\n      if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) {\n        result.index = array.index;\n        result.input = array.input;\n      }\n      return result;\n    }\n\n    /**\n     * Initializes an object clone.\n     *\n     * @private\n     * @param {Object} object The object to clone.\n     * @returns {Object} Returns the initialized clone.\n     */\n    function initCloneObject(object) {\n      return (typeof object.constructor == 'function' && !isPrototype(object))\n        ? baseCreate(getPrototype(object))\n        : {};\n    }\n\n    /**\n     * Initializes an object clone based on its `toStringTag`.\n     *\n     * **Note:** This function only supports cloning values with tags of\n     * `Boolean`, `Date`, `Error`, `Map`, `Number`, `RegExp`, `Set`, or `String`.\n     *\n     * @private\n     * @param {Object} object The object to clone.\n     * @param {string} tag The `toStringTag` of the object to clone.\n     * @param {boolean} [isDeep] Specify a deep clone.\n     * @returns {Object} Returns the initialized clone.\n     */\n    function initCloneByTag(object, tag, isDeep) {\n      var Ctor = object.constructor;\n      switch (tag) {\n        case arrayBufferTag:\n          return cloneArrayBuffer(object);\n\n        case boolTag:\n        case dateTag:\n          return new Ctor(+object);\n\n        case dataViewTag:\n          return cloneDataView(object, isDeep);\n\n        case float32Tag: case float64Tag:\n        case int8Tag: case int16Tag: case int32Tag:\n        case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag:\n          return cloneTypedArray(object, isDeep);\n\n        case mapTag:\n          return new Ctor;\n\n        case numberTag:\n        case stringTag:\n          return new Ctor(object);\n\n        case regexpTag:\n          return cloneRegExp(object);\n\n        case setTag:\n          return new Ctor;\n\n        case symbolTag:\n          return cloneSymbol(object);\n      }\n    }\n\n    /**\n     * Inserts wrapper `details` in a comment at the top of the `source` body.\n     *\n     * @private\n     * @param {string} source The source to modify.\n     * @returns {Array} details The details to insert.\n     * @returns {string} Returns the modified source.\n     */\n    function insertWrapDetails(source, details) {\n      var length = details.length;\n      if (!length) {\n        return source;\n      }\n      var lastIndex = length - 1;\n      details[lastIndex] = (length > 1 ? '& ' : '') + details[lastIndex];\n      details = details.join(length > 2 ? ', ' : ' ');\n      return source.replace(reWrapComment, '{\\n/* [wrapped with ' + details + '] */\\n');\n    }\n\n    /**\n     * Checks if `value` is a flattenable `arguments` object or array.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.\n     */\n    function isFlattenable(value) {\n      return isArray(value) || isArguments(value) ||\n        !!(spreadableSymbol && value && value[spreadableSymbol]);\n    }\n\n    /**\n     * Checks if `value` is a valid array-like index.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n     * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n     */\n    function isIndex(value, length) {\n      var type = typeof value;\n      length = length == null ? MAX_SAFE_INTEGER : length;\n\n      return !!length &&\n        (type == 'number' ||\n          (type != 'symbol' && reIsUint.test(value))) &&\n            (value > -1 && value % 1 == 0 && value < length);\n    }\n\n    /**\n     * Checks if the given arguments are from an iteratee call.\n     *\n     * @private\n     * @param {*} value The potential iteratee value argument.\n     * @param {*} index The potential iteratee index or key argument.\n     * @param {*} object The potential iteratee object argument.\n     * @returns {boolean} Returns `true` if the arguments are from an iteratee call,\n     *  else `false`.\n     */\n    function isIterateeCall(value, index, object) {\n      if (!isObject(object)) {\n        return false;\n      }\n      var type = typeof index;\n      if (type == 'number'\n            ? (isArrayLike(object) && isIndex(index, object.length))\n            : (type == 'string' && index in object)\n          ) {\n        return eq(object[index], value);\n      }\n      return false;\n    }\n\n    /**\n     * Checks if `value` is a property name and not a property path.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @param {Object} [object] The object to query keys on.\n     * @returns {boolean} Returns `true` if `value` is a property name, else `false`.\n     */\n    function isKey(value, object) {\n      if (isArray(value)) {\n        return false;\n      }\n      var type = typeof value;\n      if (type == 'number' || type == 'symbol' || type == 'boolean' ||\n          value == null || isSymbol(value)) {\n        return true;\n      }\n      return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||\n        (object != null && value in Object(object));\n    }\n\n    /**\n     * Checks if `value` is suitable for use as unique object key.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n     */\n    function isKeyable(value) {\n      var type = typeof value;\n      return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n        ? (value !== '__proto__')\n        : (value === null);\n    }\n\n    /**\n     * Checks if `func` has a lazy counterpart.\n     *\n     * @private\n     * @param {Function} func The function to check.\n     * @returns {boolean} Returns `true` if `func` has a lazy counterpart,\n     *  else `false`.\n     */\n    function isLaziable(func) {\n      var funcName = getFuncName(func),\n          other = lodash[funcName];\n\n      if (typeof other != 'function' || !(funcName in LazyWrapper.prototype)) {\n        return false;\n      }\n      if (func === other) {\n        return true;\n      }\n      var data = getData(other);\n      return !!data && func === data[0];\n    }\n\n    /**\n     * Checks if `func` has its source masked.\n     *\n     * @private\n     * @param {Function} func The function to check.\n     * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n     */\n    function isMasked(func) {\n      return !!maskSrcKey && (maskSrcKey in func);\n    }\n\n    /**\n     * Checks if `func` is capable of being masked.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `func` is maskable, else `false`.\n     */\n    var isMaskable = coreJsData ? isFunction : stubFalse;\n\n    /**\n     * Checks if `value` is likely a prototype object.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n     */\n    function isPrototype(value) {\n      var Ctor = value && value.constructor,\n          proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n      return value === proto;\n    }\n\n    /**\n     * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` if suitable for strict\n     *  equality comparisons, else `false`.\n     */\n    function isStrictComparable(value) {\n      return value === value && !isObject(value);\n    }\n\n    /**\n     * A specialized version of `matchesProperty` for source values suitable\n     * for strict equality comparisons, i.e. `===`.\n     *\n     * @private\n     * @param {string} key The key of the property to get.\n     * @param {*} srcValue The value to match.\n     * @returns {Function} Returns the new spec function.\n     */\n    function matchesStrictComparable(key, srcValue) {\n      return function(object) {\n        if (object == null) {\n          return false;\n        }\n        return object[key] === srcValue &&\n          (srcValue !== undefined || (key in Object(object)));\n      };\n    }\n\n    /**\n     * A specialized version of `_.memoize` which clears the memoized function's\n     * cache when it exceeds `MAX_MEMOIZE_SIZE`.\n     *\n     * @private\n     * @param {Function} func The function to have its output memoized.\n     * @returns {Function} Returns the new memoized function.\n     */\n    function memoizeCapped(func) {\n      var result = memoize(func, function(key) {\n        if (cache.size === MAX_MEMOIZE_SIZE) {\n          cache.clear();\n        }\n        return key;\n      });\n\n      var cache = result.cache;\n      return result;\n    }\n\n    /**\n     * Merges the function metadata of `source` into `data`.\n     *\n     * Merging metadata reduces the number of wrappers used to invoke a function.\n     * This is possible because methods like `_.bind`, `_.curry`, and `_.partial`\n     * may be applied regardless of execution order. Methods like `_.ary` and\n     * `_.rearg` modify function arguments, making the order in which they are\n     * executed important, preventing the merging of metadata. However, we make\n     * an exception for a safe combined case where curried functions have `_.ary`\n     * and or `_.rearg` applied.\n     *\n     * @private\n     * @param {Array} data The destination metadata.\n     * @param {Array} source The source metadata.\n     * @returns {Array} Returns `data`.\n     */\n    function mergeData(data, source) {\n      var bitmask = data[1],\n          srcBitmask = source[1],\n          newBitmask = bitmask | srcBitmask,\n          isCommon = newBitmask < (WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG | WRAP_ARY_FLAG);\n\n      var isCombo =\n        ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_CURRY_FLAG)) ||\n        ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_REARG_FLAG) && (data[7].length <= source[8])) ||\n        ((srcBitmask == (WRAP_ARY_FLAG | WRAP_REARG_FLAG)) && (source[7].length <= source[8]) && (bitmask == WRAP_CURRY_FLAG));\n\n      // Exit early if metadata can't be merged.\n      if (!(isCommon || isCombo)) {\n        return data;\n      }\n      // Use source `thisArg` if available.\n      if (srcBitmask & WRAP_BIND_FLAG) {\n        data[2] = source[2];\n        // Set when currying a bound function.\n        newBitmask |= bitmask & WRAP_BIND_FLAG ? 0 : WRAP_CURRY_BOUND_FLAG;\n      }\n      // Compose partial arguments.\n      var value = source[3];\n      if (value) {\n        var partials = data[3];\n        data[3] = partials ? composeArgs(partials, value, source[4]) : value;\n        data[4] = partials ? replaceHolders(data[3], PLACEHOLDER) : source[4];\n      }\n      // Compose partial right arguments.\n      value = source[5];\n      if (value) {\n        partials = data[5];\n        data[5] = partials ? composeArgsRight(partials, value, source[6]) : value;\n        data[6] = partials ? replaceHolders(data[5], PLACEHOLDER) : source[6];\n      }\n      // Use source `argPos` if available.\n      value = source[7];\n      if (value) {\n        data[7] = value;\n      }\n      // Use source `ary` if it's smaller.\n      if (srcBitmask & WRAP_ARY_FLAG) {\n        data[8] = data[8] == null ? source[8] : nativeMin(data[8], source[8]);\n      }\n      // Use source `arity` if one is not provided.\n      if (data[9] == null) {\n        data[9] = source[9];\n      }\n      // Use source `func` and merge bitmasks.\n      data[0] = source[0];\n      data[1] = newBitmask;\n\n      return data;\n    }\n\n    /**\n     * This function is like\n     * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n     * except that it includes inherited enumerable properties.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names.\n     */\n    function nativeKeysIn(object) {\n      var result = [];\n      if (object != null) {\n        for (var key in Object(object)) {\n          result.push(key);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Converts `value` to a string using `Object.prototype.toString`.\n     *\n     * @private\n     * @param {*} value The value to convert.\n     * @returns {string} Returns the converted string.\n     */\n    function objectToString(value) {\n      return nativeObjectToString.call(value);\n    }\n\n    /**\n     * A specialized version of `baseRest` which transforms the rest array.\n     *\n     * @private\n     * @param {Function} func The function to apply a rest parameter to.\n     * @param {number} [start=func.length-1] The start position of the rest parameter.\n     * @param {Function} transform The rest array transform.\n     * @returns {Function} Returns the new function.\n     */\n    function overRest(func, start, transform) {\n      start = nativeMax(start === undefined ? (func.length - 1) : start, 0);\n      return function() {\n        var args = arguments,\n            index = -1,\n            length = nativeMax(args.length - start, 0),\n            array = Array(length);\n\n        while (++index < length) {\n          array[index] = args[start + index];\n        }\n        index = -1;\n        var otherArgs = Array(start + 1);\n        while (++index < start) {\n          otherArgs[index] = args[index];\n        }\n        otherArgs[start] = transform(array);\n        return apply(func, this, otherArgs);\n      };\n    }\n\n    /**\n     * Gets the parent value at `path` of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {Array} path The path to get the parent value of.\n     * @returns {*} Returns the parent value.\n     */\n    function parent(object, path) {\n      return path.length < 2 ? object : baseGet(object, baseSlice(path, 0, -1));\n    }\n\n    /**\n     * Reorder `array` according to the specified indexes where the element at\n     * the first index is assigned as the first element, the element at\n     * the second index is assigned as the second element, and so on.\n     *\n     * @private\n     * @param {Array} array The array to reorder.\n     * @param {Array} indexes The arranged array indexes.\n     * @returns {Array} Returns `array`.\n     */\n    function reorder(array, indexes) {\n      var arrLength = array.length,\n          length = nativeMin(indexes.length, arrLength),\n          oldArray = copyArray(array);\n\n      while (length--) {\n        var index = indexes[length];\n        array[length] = isIndex(index, arrLength) ? oldArray[index] : undefined;\n      }\n      return array;\n    }\n\n    /**\n     * Gets the value at `key`, unless `key` is \"__proto__\" or \"constructor\".\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {string} key The key of the property to get.\n     * @returns {*} Returns the property value.\n     */\n    function safeGet(object, key) {\n      if (key === 'constructor' && typeof object[key] === 'function') {\n        return;\n      }\n\n      if (key == '__proto__') {\n        return;\n      }\n\n      return object[key];\n    }\n\n    /**\n     * Sets metadata for `func`.\n     *\n     * **Note:** If this function becomes hot, i.e. is invoked a lot in a short\n     * period of time, it will trip its breaker and transition to an identity\n     * function to avoid garbage collection pauses in V8. See\n     * [V8 issue 2070](https://bugs.chromium.org/p/v8/issues/detail?id=2070)\n     * for more details.\n     *\n     * @private\n     * @param {Function} func The function to associate metadata with.\n     * @param {*} data The metadata.\n     * @returns {Function} Returns `func`.\n     */\n    var setData = shortOut(baseSetData);\n\n    /**\n     * A simple wrapper around the global [`setTimeout`](https://mdn.io/setTimeout).\n     *\n     * @private\n     * @param {Function} func The function to delay.\n     * @param {number} wait The number of milliseconds to delay invocation.\n     * @returns {number|Object} Returns the timer id or timeout object.\n     */\n    var setTimeout = ctxSetTimeout || function(func, wait) {\n      return root.setTimeout(func, wait);\n    };\n\n    /**\n     * Sets the `toString` method of `func` to return `string`.\n     *\n     * @private\n     * @param {Function} func The function to modify.\n     * @param {Function} string The `toString` result.\n     * @returns {Function} Returns `func`.\n     */\n    var setToString = shortOut(baseSetToString);\n\n    /**\n     * Sets the `toString` method of `wrapper` to mimic the source of `reference`\n     * with wrapper details in a comment at the top of the source body.\n     *\n     * @private\n     * @param {Function} wrapper The function to modify.\n     * @param {Function} reference The reference function.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @returns {Function} Returns `wrapper`.\n     */\n    function setWrapToString(wrapper, reference, bitmask) {\n      var source = (reference + '');\n      return setToString(wrapper, insertWrapDetails(source, updateWrapDetails(getWrapDetails(source), bitmask)));\n    }\n\n    /**\n     * Creates a function that'll short out and invoke `identity` instead\n     * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`\n     * milliseconds.\n     *\n     * @private\n     * @param {Function} func The function to restrict.\n     * @returns {Function} Returns the new shortable function.\n     */\n    function shortOut(func) {\n      var count = 0,\n          lastCalled = 0;\n\n      return function() {\n        var stamp = nativeNow(),\n            remaining = HOT_SPAN - (stamp - lastCalled);\n\n        lastCalled = stamp;\n        if (remaining > 0) {\n          if (++count >= HOT_COUNT) {\n            return arguments[0];\n          }\n        } else {\n          count = 0;\n        }\n        return func.apply(undefined, arguments);\n      };\n    }\n\n    /**\n     * A specialized version of `_.shuffle` which mutates and sets the size of `array`.\n     *\n     * @private\n     * @param {Array} array The array to shuffle.\n     * @param {number} [size=array.length] The size of `array`.\n     * @returns {Array} Returns `array`.\n     */\n    function shuffleSelf(array, size) {\n      var index = -1,\n          length = array.length,\n          lastIndex = length - 1;\n\n      size = size === undefined ? length : size;\n      while (++index < size) {\n        var rand = baseRandom(index, lastIndex),\n            value = array[rand];\n\n        array[rand] = array[index];\n        array[index] = value;\n      }\n      array.length = size;\n      return array;\n    }\n\n    /**\n     * Converts `string` to a property path array.\n     *\n     * @private\n     * @param {string} string The string to convert.\n     * @returns {Array} Returns the property path array.\n     */\n    var stringToPath = memoizeCapped(function(string) {\n      var result = [];\n      if (string.charCodeAt(0) === 46 /* . */) {\n        result.push('');\n      }\n      string.replace(rePropName, function(match, number, quote, subString) {\n        result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match));\n      });\n      return result;\n    });\n\n    /**\n     * Converts `value` to a string key if it's not a string or symbol.\n     *\n     * @private\n     * @param {*} value The value to inspect.\n     * @returns {string|symbol} Returns the key.\n     */\n    function toKey(value) {\n      if (typeof value == 'string' || isSymbol(value)) {\n        return value;\n      }\n      var result = (value + '');\n      return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n    }\n\n    /**\n     * Converts `func` to its source code.\n     *\n     * @private\n     * @param {Function} func The function to convert.\n     * @returns {string} Returns the source code.\n     */\n    function toSource(func) {\n      if (func != null) {\n        try {\n          return funcToString.call(func);\n        } catch (e) {}\n        try {\n          return (func + '');\n        } catch (e) {}\n      }\n      return '';\n    }\n\n    /**\n     * Updates wrapper `details` based on `bitmask` flags.\n     *\n     * @private\n     * @returns {Array} details The details to modify.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @returns {Array} Returns `details`.\n     */\n    function updateWrapDetails(details, bitmask) {\n      arrayEach(wrapFlags, function(pair) {\n        var value = '_.' + pair[0];\n        if ((bitmask & pair[1]) && !arrayIncludes(details, value)) {\n          details.push(value);\n        }\n      });\n      return details.sort();\n    }\n\n    /**\n     * Creates a clone of `wrapper`.\n     *\n     * @private\n     * @param {Object} wrapper The wrapper to clone.\n     * @returns {Object} Returns the cloned wrapper.\n     */\n    function wrapperClone(wrapper) {\n      if (wrapper instanceof LazyWrapper) {\n        return wrapper.clone();\n      }\n      var result = new LodashWrapper(wrapper.__wrapped__, wrapper.__chain__);\n      result.__actions__ = copyArray(wrapper.__actions__);\n      result.__index__  = wrapper.__index__;\n      result.__values__ = wrapper.__values__;\n      return result;\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates an array of elements split into groups the length of `size`.\n     * If `array` can't be split evenly, the final chunk will be the remaining\n     * elements.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to process.\n     * @param {number} [size=1] The length of each chunk\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the new array of chunks.\n     * @example\n     *\n     * _.chunk(['a', 'b', 'c', 'd'], 2);\n     * // => [['a', 'b'], ['c', 'd']]\n     *\n     * _.chunk(['a', 'b', 'c', 'd'], 3);\n     * // => [['a', 'b', 'c'], ['d']]\n     */\n    function chunk(array, size, guard) {\n      if ((guard ? isIterateeCall(array, size, guard) : size === undefined)) {\n        size = 1;\n      } else {\n        size = nativeMax(toInteger(size), 0);\n      }\n      var length = array == null ? 0 : array.length;\n      if (!length || size < 1) {\n        return [];\n      }\n      var index = 0,\n          resIndex = 0,\n          result = Array(nativeCeil(length / size));\n\n      while (index < length) {\n        result[resIndex++] = baseSlice(array, index, (index += size));\n      }\n      return result;\n    }\n\n    /**\n     * Creates an array with all falsey values removed. The values `false`, `null`,\n     * `0`, `\"\"`, `undefined`, and `NaN` are falsey.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to compact.\n     * @returns {Array} Returns the new array of filtered values.\n     * @example\n     *\n     * _.compact([0, 1, false, 2, '', 3]);\n     * // => [1, 2, 3]\n     */\n    function compact(array) {\n      var index = -1,\n          length = array == null ? 0 : array.length,\n          resIndex = 0,\n          result = [];\n\n      while (++index < length) {\n        var value = array[index];\n        if (value) {\n          result[resIndex++] = value;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Creates a new array concatenating `array` with any additional arrays\n     * and/or values.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to concatenate.\n     * @param {...*} [values] The values to concatenate.\n     * @returns {Array} Returns the new concatenated array.\n     * @example\n     *\n     * var array = [1];\n     * var other = _.concat(array, 2, [3], [[4]]);\n     *\n     * console.log(other);\n     * // => [1, 2, 3, [4]]\n     *\n     * console.log(array);\n     * // => [1]\n     */\n    function concat() {\n      var length = arguments.length;\n      if (!length) {\n        return [];\n      }\n      var args = Array(length - 1),\n          array = arguments[0],\n          index = length;\n\n      while (index--) {\n        args[index - 1] = arguments[index];\n      }\n      return arrayPush(isArray(array) ? copyArray(array) : [array], baseFlatten(args, 1));\n    }\n\n    /**\n     * Creates an array of `array` values not included in the other given arrays\n     * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons. The order and references of result values are\n     * determined by the first array.\n     *\n     * **Note:** Unlike `_.pullAll`, this method returns a new array.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {...Array} [values] The values to exclude.\n     * @returns {Array} Returns the new array of filtered values.\n     * @see _.without, _.xor\n     * @example\n     *\n     * _.difference([2, 1], [2, 3]);\n     * // => [1]\n     */\n    var difference = baseRest(function(array, values) {\n      return isArrayLikeObject(array)\n        ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true))\n        : [];\n    });\n\n    /**\n     * This method is like `_.difference` except that it accepts `iteratee` which\n     * is invoked for each element of `array` and `values` to generate the criterion\n     * by which they're compared. The order and references of result values are\n     * determined by the first array. The iteratee is invoked with one argument:\n     * (value).\n     *\n     * **Note:** Unlike `_.pullAllBy`, this method returns a new array.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {...Array} [values] The values to exclude.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Array} Returns the new array of filtered values.\n     * @example\n     *\n     * _.differenceBy([2.1, 1.2], [2.3, 3.4], Math.floor);\n     * // => [1.2]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.differenceBy([{ 'x': 2 }, { 'x': 1 }], [{ 'x': 1 }], 'x');\n     * // => [{ 'x': 2 }]\n     */\n    var differenceBy = baseRest(function(array, values) {\n      var iteratee = last(values);\n      if (isArrayLikeObject(iteratee)) {\n        iteratee = undefined;\n      }\n      return isArrayLikeObject(array)\n        ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), getIteratee(iteratee, 2))\n        : [];\n    });\n\n    /**\n     * This method is like `_.difference` except that it accepts `comparator`\n     * which is invoked to compare elements of `array` to `values`. The order and\n     * references of result values are determined by the first array. The comparator\n     * is invoked with two arguments: (arrVal, othVal).\n     *\n     * **Note:** Unlike `_.pullAllWith`, this method returns a new array.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {...Array} [values] The values to exclude.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of filtered values.\n     * @example\n     *\n     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\n     *\n     * _.differenceWith(objects, [{ 'x': 1, 'y': 2 }], _.isEqual);\n     * // => [{ 'x': 2, 'y': 1 }]\n     */\n    var differenceWith = baseRest(function(array, values) {\n      var comparator = last(values);\n      if (isArrayLikeObject(comparator)) {\n        comparator = undefined;\n      }\n      return isArrayLikeObject(array)\n        ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), undefined, comparator)\n        : [];\n    });\n\n    /**\n     * Creates a slice of `array` with `n` elements dropped from the beginning.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.5.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {number} [n=1] The number of elements to drop.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.drop([1, 2, 3]);\n     * // => [2, 3]\n     *\n     * _.drop([1, 2, 3], 2);\n     * // => [3]\n     *\n     * _.drop([1, 2, 3], 5);\n     * // => []\n     *\n     * _.drop([1, 2, 3], 0);\n     * // => [1, 2, 3]\n     */\n    function drop(array, n, guard) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return [];\n      }\n      n = (guard || n === undefined) ? 1 : toInteger(n);\n      return baseSlice(array, n < 0 ? 0 : n, length);\n    }\n\n    /**\n     * Creates a slice of `array` with `n` elements dropped from the end.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {number} [n=1] The number of elements to drop.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.dropRight([1, 2, 3]);\n     * // => [1, 2]\n     *\n     * _.dropRight([1, 2, 3], 2);\n     * // => [1]\n     *\n     * _.dropRight([1, 2, 3], 5);\n     * // => []\n     *\n     * _.dropRight([1, 2, 3], 0);\n     * // => [1, 2, 3]\n     */\n    function dropRight(array, n, guard) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return [];\n      }\n      n = (guard || n === undefined) ? 1 : toInteger(n);\n      n = length - n;\n      return baseSlice(array, 0, n < 0 ? 0 : n);\n    }\n\n    /**\n     * Creates a slice of `array` excluding elements dropped from the end.\n     * Elements are dropped until `predicate` returns falsey. The predicate is\n     * invoked with three arguments: (value, index, array).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': true },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': false }\n     * ];\n     *\n     * _.dropRightWhile(users, function(o) { return !o.active; });\n     * // => objects for ['barney']\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.dropRightWhile(users, { 'user': 'pebbles', 'active': false });\n     * // => objects for ['barney', 'fred']\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.dropRightWhile(users, ['active', false]);\n     * // => objects for ['barney']\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.dropRightWhile(users, 'active');\n     * // => objects for ['barney', 'fred', 'pebbles']\n     */\n    function dropRightWhile(array, predicate) {\n      return (array && array.length)\n        ? baseWhile(array, getIteratee(predicate, 3), true, true)\n        : [];\n    }\n\n    /**\n     * Creates a slice of `array` excluding elements dropped from the beginning.\n     * Elements are dropped until `predicate` returns falsey. The predicate is\n     * invoked with three arguments: (value, index, array).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': false },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': true }\n     * ];\n     *\n     * _.dropWhile(users, function(o) { return !o.active; });\n     * // => objects for ['pebbles']\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.dropWhile(users, { 'user': 'barney', 'active': false });\n     * // => objects for ['fred', 'pebbles']\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.dropWhile(users, ['active', false]);\n     * // => objects for ['pebbles']\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.dropWhile(users, 'active');\n     * // => objects for ['barney', 'fred', 'pebbles']\n     */\n    function dropWhile(array, predicate) {\n      return (array && array.length)\n        ? baseWhile(array, getIteratee(predicate, 3), true)\n        : [];\n    }\n\n    /**\n     * Fills elements of `array` with `value` from `start` up to, but not\n     * including, `end`.\n     *\n     * **Note:** This method mutates `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.2.0\n     * @category Array\n     * @param {Array} array The array to fill.\n     * @param {*} value The value to fill `array` with.\n     * @param {number} [start=0] The start position.\n     * @param {number} [end=array.length] The end position.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = [1, 2, 3];\n     *\n     * _.fill(array, 'a');\n     * console.log(array);\n     * // => ['a', 'a', 'a']\n     *\n     * _.fill(Array(3), 2);\n     * // => [2, 2, 2]\n     *\n     * _.fill([4, 6, 8, 10], '*', 1, 3);\n     * // => [4, '*', '*', 10]\n     */\n    function fill(array, value, start, end) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return [];\n      }\n      if (start && typeof start != 'number' && isIterateeCall(array, value, start)) {\n        start = 0;\n        end = length;\n      }\n      return baseFill(array, value, start, end);\n    }\n\n    /**\n     * This method is like `_.find` except that it returns the index of the first\n     * element `predicate` returns truthy for instead of the element itself.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.1.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @param {number} [fromIndex=0] The index to search from.\n     * @returns {number} Returns the index of the found element, else `-1`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': false },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': true }\n     * ];\n     *\n     * _.findIndex(users, function(o) { return o.user == 'barney'; });\n     * // => 0\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.findIndex(users, { 'user': 'fred', 'active': false });\n     * // => 1\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.findIndex(users, ['active', false]);\n     * // => 0\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.findIndex(users, 'active');\n     * // => 2\n     */\n    function findIndex(array, predicate, fromIndex) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return -1;\n      }\n      var index = fromIndex == null ? 0 : toInteger(fromIndex);\n      if (index < 0) {\n        index = nativeMax(length + index, 0);\n      }\n      return baseFindIndex(array, getIteratee(predicate, 3), index);\n    }\n\n    /**\n     * This method is like `_.findIndex` except that it iterates over elements\n     * of `collection` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @param {number} [fromIndex=array.length-1] The index to search from.\n     * @returns {number} Returns the index of the found element, else `-1`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': true },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': false }\n     * ];\n     *\n     * _.findLastIndex(users, function(o) { return o.user == 'pebbles'; });\n     * // => 2\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.findLastIndex(users, { 'user': 'barney', 'active': true });\n     * // => 0\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.findLastIndex(users, ['active', false]);\n     * // => 2\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.findLastIndex(users, 'active');\n     * // => 0\n     */\n    function findLastIndex(array, predicate, fromIndex) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return -1;\n      }\n      var index = length - 1;\n      if (fromIndex !== undefined) {\n        index = toInteger(fromIndex);\n        index = fromIndex < 0\n          ? nativeMax(length + index, 0)\n          : nativeMin(index, length - 1);\n      }\n      return baseFindIndex(array, getIteratee(predicate, 3), index, true);\n    }\n\n    /**\n     * Flattens `array` a single level deep.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to flatten.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * _.flatten([1, [2, [3, [4]], 5]]);\n     * // => [1, 2, [3, [4]], 5]\n     */\n    function flatten(array) {\n      var length = array == null ? 0 : array.length;\n      return length ? baseFlatten(array, 1) : [];\n    }\n\n    /**\n     * Recursively flattens `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to flatten.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * _.flattenDeep([1, [2, [3, [4]], 5]]);\n     * // => [1, 2, 3, 4, 5]\n     */\n    function flattenDeep(array) {\n      var length = array == null ? 0 : array.length;\n      return length ? baseFlatten(array, INFINITY) : [];\n    }\n\n    /**\n     * Recursively flatten `array` up to `depth` times.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.4.0\n     * @category Array\n     * @param {Array} array The array to flatten.\n     * @param {number} [depth=1] The maximum recursion depth.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * var array = [1, [2, [3, [4]], 5]];\n     *\n     * _.flattenDepth(array, 1);\n     * // => [1, 2, [3, [4]], 5]\n     *\n     * _.flattenDepth(array, 2);\n     * // => [1, 2, 3, [4], 5]\n     */\n    function flattenDepth(array, depth) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return [];\n      }\n      depth = depth === undefined ? 1 : toInteger(depth);\n      return baseFlatten(array, depth);\n    }\n\n    /**\n     * The inverse of `_.toPairs`; this method returns an object composed\n     * from key-value `pairs`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} pairs The key-value pairs.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * _.fromPairs([['a', 1], ['b', 2]]);\n     * // => { 'a': 1, 'b': 2 }\n     */\n    function fromPairs(pairs) {\n      var index = -1,\n          length = pairs == null ? 0 : pairs.length,\n          result = {};\n\n      while (++index < length) {\n        var pair = pairs[index];\n        result[pair[0]] = pair[1];\n      }\n      return result;\n    }\n\n    /**\n     * Gets the first element of `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @alias first\n     * @category Array\n     * @param {Array} array The array to query.\n     * @returns {*} Returns the first element of `array`.\n     * @example\n     *\n     * _.head([1, 2, 3]);\n     * // => 1\n     *\n     * _.head([]);\n     * // => undefined\n     */\n    function head(array) {\n      return (array && array.length) ? array[0] : undefined;\n    }\n\n    /**\n     * Gets the index at which the first occurrence of `value` is found in `array`\n     * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons. If `fromIndex` is negative, it's used as the\n     * offset from the end of `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {*} value The value to search for.\n     * @param {number} [fromIndex=0] The index to search from.\n     * @returns {number} Returns the index of the matched value, else `-1`.\n     * @example\n     *\n     * _.indexOf([1, 2, 1, 2], 2);\n     * // => 1\n     *\n     * // Search from the `fromIndex`.\n     * _.indexOf([1, 2, 1, 2], 2, 2);\n     * // => 3\n     */\n    function indexOf(array, value, fromIndex) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return -1;\n      }\n      var index = fromIndex == null ? 0 : toInteger(fromIndex);\n      if (index < 0) {\n        index = nativeMax(length + index, 0);\n      }\n      return baseIndexOf(array, value, index);\n    }\n\n    /**\n     * Gets all but the last element of `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.initial([1, 2, 3]);\n     * // => [1, 2]\n     */\n    function initial(array) {\n      var length = array == null ? 0 : array.length;\n      return length ? baseSlice(array, 0, -1) : [];\n    }\n\n    /**\n     * Creates an array of unique values that are included in all given arrays\n     * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons. The order and references of result values are\n     * determined by the first array.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @returns {Array} Returns the new array of intersecting values.\n     * @example\n     *\n     * _.intersection([2, 1], [2, 3]);\n     * // => [2]\n     */\n    var intersection = baseRest(function(arrays) {\n      var mapped = arrayMap(arrays, castArrayLikeObject);\n      return (mapped.length && mapped[0] === arrays[0])\n        ? baseIntersection(mapped)\n        : [];\n    });\n\n    /**\n     * This method is like `_.intersection` except that it accepts `iteratee`\n     * which is invoked for each element of each `arrays` to generate the criterion\n     * by which they're compared. The order and references of result values are\n     * determined by the first array. The iteratee is invoked with one argument:\n     * (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Array} Returns the new array of intersecting values.\n     * @example\n     *\n     * _.intersectionBy([2.1, 1.2], [2.3, 3.4], Math.floor);\n     * // => [2.1]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.intersectionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');\n     * // => [{ 'x': 1 }]\n     */\n    var intersectionBy = baseRest(function(arrays) {\n      var iteratee = last(arrays),\n          mapped = arrayMap(arrays, castArrayLikeObject);\n\n      if (iteratee === last(mapped)) {\n        iteratee = undefined;\n      } else {\n        mapped.pop();\n      }\n      return (mapped.length && mapped[0] === arrays[0])\n        ? baseIntersection(mapped, getIteratee(iteratee, 2))\n        : [];\n    });\n\n    /**\n     * This method is like `_.intersection` except that it accepts `comparator`\n     * which is invoked to compare elements of `arrays`. The order and references\n     * of result values are determined by the first array. The comparator is\n     * invoked with two arguments: (arrVal, othVal).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of intersecting values.\n     * @example\n     *\n     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\n     * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];\n     *\n     * _.intersectionWith(objects, others, _.isEqual);\n     * // => [{ 'x': 1, 'y': 2 }]\n     */\n    var intersectionWith = baseRest(function(arrays) {\n      var comparator = last(arrays),\n          mapped = arrayMap(arrays, castArrayLikeObject);\n\n      comparator = typeof comparator == 'function' ? comparator : undefined;\n      if (comparator) {\n        mapped.pop();\n      }\n      return (mapped.length && mapped[0] === arrays[0])\n        ? baseIntersection(mapped, undefined, comparator)\n        : [];\n    });\n\n    /**\n     * Converts all elements in `array` into a string separated by `separator`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to convert.\n     * @param {string} [separator=','] The element separator.\n     * @returns {string} Returns the joined string.\n     * @example\n     *\n     * _.join(['a', 'b', 'c'], '~');\n     * // => 'a~b~c'\n     */\n    function join(array, separator) {\n      return array == null ? '' : nativeJoin.call(array, separator);\n    }\n\n    /**\n     * Gets the last element of `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @returns {*} Returns the last element of `array`.\n     * @example\n     *\n     * _.last([1, 2, 3]);\n     * // => 3\n     */\n    function last(array) {\n      var length = array == null ? 0 : array.length;\n      return length ? array[length - 1] : undefined;\n    }\n\n    /**\n     * This method is like `_.indexOf` except that it iterates over elements of\n     * `array` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {*} value The value to search for.\n     * @param {number} [fromIndex=array.length-1] The index to search from.\n     * @returns {number} Returns the index of the matched value, else `-1`.\n     * @example\n     *\n     * _.lastIndexOf([1, 2, 1, 2], 2);\n     * // => 3\n     *\n     * // Search from the `fromIndex`.\n     * _.lastIndexOf([1, 2, 1, 2], 2, 2);\n     * // => 1\n     */\n    function lastIndexOf(array, value, fromIndex) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return -1;\n      }\n      var index = length;\n      if (fromIndex !== undefined) {\n        index = toInteger(fromIndex);\n        index = index < 0 ? nativeMax(length + index, 0) : nativeMin(index, length - 1);\n      }\n      return value === value\n        ? strictLastIndexOf(array, value, index)\n        : baseFindIndex(array, baseIsNaN, index, true);\n    }\n\n    /**\n     * Gets the element at index `n` of `array`. If `n` is negative, the nth\n     * element from the end is returned.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.11.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {number} [n=0] The index of the element to return.\n     * @returns {*} Returns the nth element of `array`.\n     * @example\n     *\n     * var array = ['a', 'b', 'c', 'd'];\n     *\n     * _.nth(array, 1);\n     * // => 'b'\n     *\n     * _.nth(array, -2);\n     * // => 'c';\n     */\n    function nth(array, n) {\n      return (array && array.length) ? baseNth(array, toInteger(n)) : undefined;\n    }\n\n    /**\n     * Removes all given values from `array` using\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons.\n     *\n     * **Note:** Unlike `_.without`, this method mutates `array`. Use `_.remove`\n     * to remove elements from an array by predicate.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {...*} [values] The values to remove.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = ['a', 'b', 'c', 'a', 'b', 'c'];\n     *\n     * _.pull(array, 'a', 'c');\n     * console.log(array);\n     * // => ['b', 'b']\n     */\n    var pull = baseRest(pullAll);\n\n    /**\n     * This method is like `_.pull` except that it accepts an array of values to remove.\n     *\n     * **Note:** Unlike `_.difference`, this method mutates `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {Array} values The values to remove.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = ['a', 'b', 'c', 'a', 'b', 'c'];\n     *\n     * _.pullAll(array, ['a', 'c']);\n     * console.log(array);\n     * // => ['b', 'b']\n     */\n    function pullAll(array, values) {\n      return (array && array.length && values && values.length)\n        ? basePullAll(array, values)\n        : array;\n    }\n\n    /**\n     * This method is like `_.pullAll` except that it accepts `iteratee` which is\n     * invoked for each element of `array` and `values` to generate the criterion\n     * by which they're compared. The iteratee is invoked with one argument: (value).\n     *\n     * **Note:** Unlike `_.differenceBy`, this method mutates `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {Array} values The values to remove.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = [{ 'x': 1 }, { 'x': 2 }, { 'x': 3 }, { 'x': 1 }];\n     *\n     * _.pullAllBy(array, [{ 'x': 1 }, { 'x': 3 }], 'x');\n     * console.log(array);\n     * // => [{ 'x': 2 }]\n     */\n    function pullAllBy(array, values, iteratee) {\n      return (array && array.length && values && values.length)\n        ? basePullAll(array, values, getIteratee(iteratee, 2))\n        : array;\n    }\n\n    /**\n     * This method is like `_.pullAll` except that it accepts `comparator` which\n     * is invoked to compare elements of `array` to `values`. The comparator is\n     * invoked with two arguments: (arrVal, othVal).\n     *\n     * **Note:** Unlike `_.differenceWith`, this method mutates `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.6.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {Array} values The values to remove.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = [{ 'x': 1, 'y': 2 }, { 'x': 3, 'y': 4 }, { 'x': 5, 'y': 6 }];\n     *\n     * _.pullAllWith(array, [{ 'x': 3, 'y': 4 }], _.isEqual);\n     * console.log(array);\n     * // => [{ 'x': 1, 'y': 2 }, { 'x': 5, 'y': 6 }]\n     */\n    function pullAllWith(array, values, comparator) {\n      return (array && array.length && values && values.length)\n        ? basePullAll(array, values, undefined, comparator)\n        : array;\n    }\n\n    /**\n     * Removes elements from `array` corresponding to `indexes` and returns an\n     * array of removed elements.\n     *\n     * **Note:** Unlike `_.at`, this method mutates `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {...(number|number[])} [indexes] The indexes of elements to remove.\n     * @returns {Array} Returns the new array of removed elements.\n     * @example\n     *\n     * var array = ['a', 'b', 'c', 'd'];\n     * var pulled = _.pullAt(array, [1, 3]);\n     *\n     * console.log(array);\n     * // => ['a', 'c']\n     *\n     * console.log(pulled);\n     * // => ['b', 'd']\n     */\n    var pullAt = flatRest(function(array, indexes) {\n      var length = array == null ? 0 : array.length,\n          result = baseAt(array, indexes);\n\n      basePullAt(array, arrayMap(indexes, function(index) {\n        return isIndex(index, length) ? +index : index;\n      }).sort(compareAscending));\n\n      return result;\n    });\n\n    /**\n     * Removes all elements from `array` that `predicate` returns truthy for\n     * and returns an array of the removed elements. The predicate is invoked\n     * with three arguments: (value, index, array).\n     *\n     * **Note:** Unlike `_.filter`, this method mutates `array`. Use `_.pull`\n     * to pull elements from an array by value.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the new array of removed elements.\n     * @example\n     *\n     * var array = [1, 2, 3, 4];\n     * var evens = _.remove(array, function(n) {\n     *   return n % 2 == 0;\n     * });\n     *\n     * console.log(array);\n     * // => [1, 3]\n     *\n     * console.log(evens);\n     * // => [2, 4]\n     */\n    function remove(array, predicate) {\n      var result = [];\n      if (!(array && array.length)) {\n        return result;\n      }\n      var index = -1,\n          indexes = [],\n          length = array.length;\n\n      predicate = getIteratee(predicate, 3);\n      while (++index < length) {\n        var value = array[index];\n        if (predicate(value, index, array)) {\n          result.push(value);\n          indexes.push(index);\n        }\n      }\n      basePullAt(array, indexes);\n      return result;\n    }\n\n    /**\n     * Reverses `array` so that the first element becomes the last, the second\n     * element becomes the second to last, and so on.\n     *\n     * **Note:** This method mutates `array` and is based on\n     * [`Array#reverse`](https://mdn.io/Array/reverse).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = [1, 2, 3];\n     *\n     * _.reverse(array);\n     * // => [3, 2, 1]\n     *\n     * console.log(array);\n     * // => [3, 2, 1]\n     */\n    function reverse(array) {\n      return array == null ? array : nativeReverse.call(array);\n    }\n\n    /**\n     * Creates a slice of `array` from `start` up to, but not including, `end`.\n     *\n     * **Note:** This method is used instead of\n     * [`Array#slice`](https://mdn.io/Array/slice) to ensure dense arrays are\n     * returned.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to slice.\n     * @param {number} [start=0] The start position.\n     * @param {number} [end=array.length] The end position.\n     * @returns {Array} Returns the slice of `array`.\n     */\n    function slice(array, start, end) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return [];\n      }\n      if (end && typeof end != 'number' && isIterateeCall(array, start, end)) {\n        start = 0;\n        end = length;\n      }\n      else {\n        start = start == null ? 0 : toInteger(start);\n        end = end === undefined ? length : toInteger(end);\n      }\n      return baseSlice(array, start, end);\n    }\n\n    /**\n     * Uses a binary search to determine the lowest index at which `value`\n     * should be inserted into `array` in order to maintain its sort order.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     * @example\n     *\n     * _.sortedIndex([30, 50], 40);\n     * // => 1\n     */\n    function sortedIndex(array, value) {\n      return baseSortedIndex(array, value);\n    }\n\n    /**\n     * This method is like `_.sortedIndex` except that it accepts `iteratee`\n     * which is invoked for `value` and each element of `array` to compute their\n     * sort ranking. The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     * @example\n     *\n     * var objects = [{ 'x': 4 }, { 'x': 5 }];\n     *\n     * _.sortedIndexBy(objects, { 'x': 4 }, function(o) { return o.x; });\n     * // => 0\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.sortedIndexBy(objects, { 'x': 4 }, 'x');\n     * // => 0\n     */\n    function sortedIndexBy(array, value, iteratee) {\n      return baseSortedIndexBy(array, value, getIteratee(iteratee, 2));\n    }\n\n    /**\n     * This method is like `_.indexOf` except that it performs a binary\n     * search on a sorted `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {*} value The value to search for.\n     * @returns {number} Returns the index of the matched value, else `-1`.\n     * @example\n     *\n     * _.sortedIndexOf([4, 5, 5, 5, 6], 5);\n     * // => 1\n     */\n    function sortedIndexOf(array, value) {\n      var length = array == null ? 0 : array.length;\n      if (length) {\n        var index = baseSortedIndex(array, value);\n        if (index < length && eq(array[index], value)) {\n          return index;\n        }\n      }\n      return -1;\n    }\n\n    /**\n     * This method is like `_.sortedIndex` except that it returns the highest\n     * index at which `value` should be inserted into `array` in order to\n     * maintain its sort order.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     * @example\n     *\n     * _.sortedLastIndex([4, 5, 5, 5, 6], 5);\n     * // => 4\n     */\n    function sortedLastIndex(array, value) {\n      return baseSortedIndex(array, value, true);\n    }\n\n    /**\n     * This method is like `_.sortedLastIndex` except that it accepts `iteratee`\n     * which is invoked for `value` and each element of `array` to compute their\n     * sort ranking. The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     * @example\n     *\n     * var objects = [{ 'x': 4 }, { 'x': 5 }];\n     *\n     * _.sortedLastIndexBy(objects, { 'x': 4 }, function(o) { return o.x; });\n     * // => 1\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.sortedLastIndexBy(objects, { 'x': 4 }, 'x');\n     * // => 1\n     */\n    function sortedLastIndexBy(array, value, iteratee) {\n      return baseSortedIndexBy(array, value, getIteratee(iteratee, 2), true);\n    }\n\n    /**\n     * This method is like `_.lastIndexOf` except that it performs a binary\n     * search on a sorted `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {*} value The value to search for.\n     * @returns {number} Returns the index of the matched value, else `-1`.\n     * @example\n     *\n     * _.sortedLastIndexOf([4, 5, 5, 5, 6], 5);\n     * // => 3\n     */\n    function sortedLastIndexOf(array, value) {\n      var length = array == null ? 0 : array.length;\n      if (length) {\n        var index = baseSortedIndex(array, value, true) - 1;\n        if (eq(array[index], value)) {\n          return index;\n        }\n      }\n      return -1;\n    }\n\n    /**\n     * This method is like `_.uniq` except that it's designed and optimized\n     * for sorted arrays.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @returns {Array} Returns the new duplicate free array.\n     * @example\n     *\n     * _.sortedUniq([1, 1, 2]);\n     * // => [1, 2]\n     */\n    function sortedUniq(array) {\n      return (array && array.length)\n        ? baseSortedUniq(array)\n        : [];\n    }\n\n    /**\n     * This method is like `_.uniqBy` except that it's designed and optimized\n     * for sorted arrays.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @returns {Array} Returns the new duplicate free array.\n     * @example\n     *\n     * _.sortedUniqBy([1.1, 1.2, 2.3, 2.4], Math.floor);\n     * // => [1.1, 2.3]\n     */\n    function sortedUniqBy(array, iteratee) {\n      return (array && array.length)\n        ? baseSortedUniq(array, getIteratee(iteratee, 2))\n        : [];\n    }\n\n    /**\n     * Gets all but the first element of `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.tail([1, 2, 3]);\n     * // => [2, 3]\n     */\n    function tail(array) {\n      var length = array == null ? 0 : array.length;\n      return length ? baseSlice(array, 1, length) : [];\n    }\n\n    /**\n     * Creates a slice of `array` with `n` elements taken from the beginning.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {number} [n=1] The number of elements to take.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.take([1, 2, 3]);\n     * // => [1]\n     *\n     * _.take([1, 2, 3], 2);\n     * // => [1, 2]\n     *\n     * _.take([1, 2, 3], 5);\n     * // => [1, 2, 3]\n     *\n     * _.take([1, 2, 3], 0);\n     * // => []\n     */\n    function take(array, n, guard) {\n      if (!(array && array.length)) {\n        return [];\n      }\n      n = (guard || n === undefined) ? 1 : toInteger(n);\n      return baseSlice(array, 0, n < 0 ? 0 : n);\n    }\n\n    /**\n     * Creates a slice of `array` with `n` elements taken from the end.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {number} [n=1] The number of elements to take.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.takeRight([1, 2, 3]);\n     * // => [3]\n     *\n     * _.takeRight([1, 2, 3], 2);\n     * // => [2, 3]\n     *\n     * _.takeRight([1, 2, 3], 5);\n     * // => [1, 2, 3]\n     *\n     * _.takeRight([1, 2, 3], 0);\n     * // => []\n     */\n    function takeRight(array, n, guard) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return [];\n      }\n      n = (guard || n === undefined) ? 1 : toInteger(n);\n      n = length - n;\n      return baseSlice(array, n < 0 ? 0 : n, length);\n    }\n\n    /**\n     * Creates a slice of `array` with elements taken from the end. Elements are\n     * taken until `predicate` returns falsey. The predicate is invoked with\n     * three arguments: (value, index, array).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': true },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': false }\n     * ];\n     *\n     * _.takeRightWhile(users, function(o) { return !o.active; });\n     * // => objects for ['fred', 'pebbles']\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.takeRightWhile(users, { 'user': 'pebbles', 'active': false });\n     * // => objects for ['pebbles']\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.takeRightWhile(users, ['active', false]);\n     * // => objects for ['fred', 'pebbles']\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.takeRightWhile(users, 'active');\n     * // => []\n     */\n    function takeRightWhile(array, predicate) {\n      return (array && array.length)\n        ? baseWhile(array, getIteratee(predicate, 3), false, true)\n        : [];\n    }\n\n    /**\n     * Creates a slice of `array` with elements taken from the beginning. Elements\n     * are taken until `predicate` returns falsey. The predicate is invoked with\n     * three arguments: (value, index, array).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': false },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': true }\n     * ];\n     *\n     * _.takeWhile(users, function(o) { return !o.active; });\n     * // => objects for ['barney', 'fred']\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.takeWhile(users, { 'user': 'barney', 'active': false });\n     * // => objects for ['barney']\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.takeWhile(users, ['active', false]);\n     * // => objects for ['barney', 'fred']\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.takeWhile(users, 'active');\n     * // => []\n     */\n    function takeWhile(array, predicate) {\n      return (array && array.length)\n        ? baseWhile(array, getIteratee(predicate, 3))\n        : [];\n    }\n\n    /**\n     * Creates an array of unique values, in order, from all given arrays using\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @returns {Array} Returns the new array of combined values.\n     * @example\n     *\n     * _.union([2], [1, 2]);\n     * // => [2, 1]\n     */\n    var union = baseRest(function(arrays) {\n      return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true));\n    });\n\n    /**\n     * This method is like `_.union` except that it accepts `iteratee` which is\n     * invoked for each element of each `arrays` to generate the criterion by\n     * which uniqueness is computed. Result values are chosen from the first\n     * array in which the value occurs. The iteratee is invoked with one argument:\n     * (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Array} Returns the new array of combined values.\n     * @example\n     *\n     * _.unionBy([2.1], [1.2, 2.3], Math.floor);\n     * // => [2.1, 1.2]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.unionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');\n     * // => [{ 'x': 1 }, { 'x': 2 }]\n     */\n    var unionBy = baseRest(function(arrays) {\n      var iteratee = last(arrays);\n      if (isArrayLikeObject(iteratee)) {\n        iteratee = undefined;\n      }\n      return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), getIteratee(iteratee, 2));\n    });\n\n    /**\n     * This method is like `_.union` except that it accepts `comparator` which\n     * is invoked to compare elements of `arrays`. Result values are chosen from\n     * the first array in which the value occurs. The comparator is invoked\n     * with two arguments: (arrVal, othVal).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of combined values.\n     * @example\n     *\n     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\n     * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];\n     *\n     * _.unionWith(objects, others, _.isEqual);\n     * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]\n     */\n    var unionWith = baseRest(function(arrays) {\n      var comparator = last(arrays);\n      comparator = typeof comparator == 'function' ? comparator : undefined;\n      return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), undefined, comparator);\n    });\n\n    /**\n     * Creates a duplicate-free version of an array, using\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons, in which only the first occurrence of each element\n     * is kept. The order of result values is determined by the order they occur\n     * in the array.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @returns {Array} Returns the new duplicate free array.\n     * @example\n     *\n     * _.uniq([2, 1, 2]);\n     * // => [2, 1]\n     */\n    function uniq(array) {\n      return (array && array.length) ? baseUniq(array) : [];\n    }\n\n    /**\n     * This method is like `_.uniq` except that it accepts `iteratee` which is\n     * invoked for each element in `array` to generate the criterion by which\n     * uniqueness is computed. The order of result values is determined by the\n     * order they occur in the array. The iteratee is invoked with one argument:\n     * (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Array} Returns the new duplicate free array.\n     * @example\n     *\n     * _.uniqBy([2.1, 1.2, 2.3], Math.floor);\n     * // => [2.1, 1.2]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.uniqBy([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');\n     * // => [{ 'x': 1 }, { 'x': 2 }]\n     */\n    function uniqBy(array, iteratee) {\n      return (array && array.length) ? baseUniq(array, getIteratee(iteratee, 2)) : [];\n    }\n\n    /**\n     * This method is like `_.uniq` except that it accepts `comparator` which\n     * is invoked to compare elements of `array`. The order of result values is\n     * determined by the order they occur in the array.The comparator is invoked\n     * with two arguments: (arrVal, othVal).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new duplicate free array.\n     * @example\n     *\n     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 2 }];\n     *\n     * _.uniqWith(objects, _.isEqual);\n     * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]\n     */\n    function uniqWith(array, comparator) {\n      comparator = typeof comparator == 'function' ? comparator : undefined;\n      return (array && array.length) ? baseUniq(array, undefined, comparator) : [];\n    }\n\n    /**\n     * This method is like `_.zip` except that it accepts an array of grouped\n     * elements and creates an array regrouping the elements to their pre-zip\n     * configuration.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.2.0\n     * @category Array\n     * @param {Array} array The array of grouped elements to process.\n     * @returns {Array} Returns the new array of regrouped elements.\n     * @example\n     *\n     * var zipped = _.zip(['a', 'b'], [1, 2], [true, false]);\n     * // => [['a', 1, true], ['b', 2, false]]\n     *\n     * _.unzip(zipped);\n     * // => [['a', 'b'], [1, 2], [true, false]]\n     */\n    function unzip(array) {\n      if (!(array && array.length)) {\n        return [];\n      }\n      var length = 0;\n      array = arrayFilter(array, function(group) {\n        if (isArrayLikeObject(group)) {\n          length = nativeMax(group.length, length);\n          return true;\n        }\n      });\n      return baseTimes(length, function(index) {\n        return arrayMap(array, baseProperty(index));\n      });\n    }\n\n    /**\n     * This method is like `_.unzip` except that it accepts `iteratee` to specify\n     * how regrouped values should be combined. The iteratee is invoked with the\n     * elements of each group: (...group).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.8.0\n     * @category Array\n     * @param {Array} array The array of grouped elements to process.\n     * @param {Function} [iteratee=_.identity] The function to combine\n     *  regrouped values.\n     * @returns {Array} Returns the new array of regrouped elements.\n     * @example\n     *\n     * var zipped = _.zip([1, 2], [10, 20], [100, 200]);\n     * // => [[1, 10, 100], [2, 20, 200]]\n     *\n     * _.unzipWith(zipped, _.add);\n     * // => [3, 30, 300]\n     */\n    function unzipWith(array, iteratee) {\n      if (!(array && array.length)) {\n        return [];\n      }\n      var result = unzip(array);\n      if (iteratee == null) {\n        return result;\n      }\n      return arrayMap(result, function(group) {\n        return apply(iteratee, undefined, group);\n      });\n    }\n\n    /**\n     * Creates an array excluding all given values using\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons.\n     *\n     * **Note:** Unlike `_.pull`, this method returns a new array.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {...*} [values] The values to exclude.\n     * @returns {Array} Returns the new array of filtered values.\n     * @see _.difference, _.xor\n     * @example\n     *\n     * _.without([2, 1, 2, 3], 1, 2);\n     * // => [3]\n     */\n    var without = baseRest(function(array, values) {\n      return isArrayLikeObject(array)\n        ? baseDifference(array, values)\n        : [];\n    });\n\n    /**\n     * Creates an array of unique values that is the\n     * [symmetric difference](https://en.wikipedia.org/wiki/Symmetric_difference)\n     * of the given arrays. The order of result values is determined by the order\n     * they occur in the arrays.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.4.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @returns {Array} Returns the new array of filtered values.\n     * @see _.difference, _.without\n     * @example\n     *\n     * _.xor([2, 1], [2, 3]);\n     * // => [1, 3]\n     */\n    var xor = baseRest(function(arrays) {\n      return baseXor(arrayFilter(arrays, isArrayLikeObject));\n    });\n\n    /**\n     * This method is like `_.xor` except that it accepts `iteratee` which is\n     * invoked for each element of each `arrays` to generate the criterion by\n     * which by which they're compared. The order of result values is determined\n     * by the order they occur in the arrays. The iteratee is invoked with one\n     * argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Array} Returns the new array of filtered values.\n     * @example\n     *\n     * _.xorBy([2.1, 1.2], [2.3, 3.4], Math.floor);\n     * // => [1.2, 3.4]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.xorBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');\n     * // => [{ 'x': 2 }]\n     */\n    var xorBy = baseRest(function(arrays) {\n      var iteratee = last(arrays);\n      if (isArrayLikeObject(iteratee)) {\n        iteratee = undefined;\n      }\n      return baseXor(arrayFilter(arrays, isArrayLikeObject), getIteratee(iteratee, 2));\n    });\n\n    /**\n     * This method is like `_.xor` except that it accepts `comparator` which is\n     * invoked to compare elements of `arrays`. The order of result values is\n     * determined by the order they occur in the arrays. The comparator is invoked\n     * with two arguments: (arrVal, othVal).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of filtered values.\n     * @example\n     *\n     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\n     * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];\n     *\n     * _.xorWith(objects, others, _.isEqual);\n     * // => [{ 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]\n     */\n    var xorWith = baseRest(function(arrays) {\n      var comparator = last(arrays);\n      comparator = typeof comparator == 'function' ? comparator : undefined;\n      return baseXor(arrayFilter(arrays, isArrayLikeObject), undefined, comparator);\n    });\n\n    /**\n     * Creates an array of grouped elements, the first of which contains the\n     * first elements of the given arrays, the second of which contains the\n     * second elements of the given arrays, and so on.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to process.\n     * @returns {Array} Returns the new array of grouped elements.\n     * @example\n     *\n     * _.zip(['a', 'b'], [1, 2], [true, false]);\n     * // => [['a', 1, true], ['b', 2, false]]\n     */\n    var zip = baseRest(unzip);\n\n    /**\n     * This method is like `_.fromPairs` except that it accepts two arrays,\n     * one of property identifiers and one of corresponding values.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.4.0\n     * @category Array\n     * @param {Array} [props=[]] The property identifiers.\n     * @param {Array} [values=[]] The property values.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * _.zipObject(['a', 'b'], [1, 2]);\n     * // => { 'a': 1, 'b': 2 }\n     */\n    function zipObject(props, values) {\n      return baseZipObject(props || [], values || [], assignValue);\n    }\n\n    /**\n     * This method is like `_.zipObject` except that it supports property paths.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.1.0\n     * @category Array\n     * @param {Array} [props=[]] The property identifiers.\n     * @param {Array} [values=[]] The property values.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * _.zipObjectDeep(['a.b[0].c', 'a.b[1].d'], [1, 2]);\n     * // => { 'a': { 'b': [{ 'c': 1 }, { 'd': 2 }] } }\n     */\n    function zipObjectDeep(props, values) {\n      return baseZipObject(props || [], values || [], baseSet);\n    }\n\n    /**\n     * This method is like `_.zip` except that it accepts `iteratee` to specify\n     * how grouped values should be combined. The iteratee is invoked with the\n     * elements of each group: (...group).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.8.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to process.\n     * @param {Function} [iteratee=_.identity] The function to combine\n     *  grouped values.\n     * @returns {Array} Returns the new array of grouped elements.\n     * @example\n     *\n     * _.zipWith([1, 2], [10, 20], [100, 200], function(a, b, c) {\n     *   return a + b + c;\n     * });\n     * // => [111, 222]\n     */\n    var zipWith = baseRest(function(arrays) {\n      var length = arrays.length,\n          iteratee = length > 1 ? arrays[length - 1] : undefined;\n\n      iteratee = typeof iteratee == 'function' ? (arrays.pop(), iteratee) : undefined;\n      return unzipWith(arrays, iteratee);\n    });\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a `lodash` wrapper instance that wraps `value` with explicit method\n     * chain sequences enabled. The result of such sequences must be unwrapped\n     * with `_#value`.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.3.0\n     * @category Seq\n     * @param {*} value The value to wrap.\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'age': 36 },\n     *   { 'user': 'fred',    'age': 40 },\n     *   { 'user': 'pebbles', 'age': 1 }\n     * ];\n     *\n     * var youngest = _\n     *   .chain(users)\n     *   .sortBy('age')\n     *   .map(function(o) {\n     *     return o.user + ' is ' + o.age;\n     *   })\n     *   .head()\n     *   .value();\n     * // => 'pebbles is 1'\n     */\n    function chain(value) {\n      var result = lodash(value);\n      result.__chain__ = true;\n      return result;\n    }\n\n    /**\n     * This method invokes `interceptor` and returns `value`. The interceptor\n     * is invoked with one argument; (value). The purpose of this method is to\n     * \"tap into\" a method chain sequence in order to modify intermediate results.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Seq\n     * @param {*} value The value to provide to `interceptor`.\n     * @param {Function} interceptor The function to invoke.\n     * @returns {*} Returns `value`.\n     * @example\n     *\n     * _([1, 2, 3])\n     *  .tap(function(array) {\n     *    // Mutate input array.\n     *    array.pop();\n     *  })\n     *  .reverse()\n     *  .value();\n     * // => [2, 1]\n     */\n    function tap(value, interceptor) {\n      interceptor(value);\n      return value;\n    }\n\n    /**\n     * This method is like `_.tap` except that it returns the result of `interceptor`.\n     * The purpose of this method is to \"pass thru\" values replacing intermediate\n     * results in a method chain sequence.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Seq\n     * @param {*} value The value to provide to `interceptor`.\n     * @param {Function} interceptor The function to invoke.\n     * @returns {*} Returns the result of `interceptor`.\n     * @example\n     *\n     * _('  abc  ')\n     *  .chain()\n     *  .trim()\n     *  .thru(function(value) {\n     *    return [value];\n     *  })\n     *  .value();\n     * // => ['abc']\n     */\n    function thru(value, interceptor) {\n      return interceptor(value);\n    }\n\n    /**\n     * This method is the wrapper version of `_.at`.\n     *\n     * @name at\n     * @memberOf _\n     * @since 1.0.0\n     * @category Seq\n     * @param {...(string|string[])} [paths] The property paths to pick.\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] };\n     *\n     * _(object).at(['a[0].b.c', 'a[1]']).value();\n     * // => [3, 4]\n     */\n    var wrapperAt = flatRest(function(paths) {\n      var length = paths.length,\n          start = length ? paths[0] : 0,\n          value = this.__wrapped__,\n          interceptor = function(object) { return baseAt(object, paths); };\n\n      if (length > 1 || this.__actions__.length ||\n          !(value instanceof LazyWrapper) || !isIndex(start)) {\n        return this.thru(interceptor);\n      }\n      value = value.slice(start, +start + (length ? 1 : 0));\n      value.__actions__.push({\n        'func': thru,\n        'args': [interceptor],\n        'thisArg': undefined\n      });\n      return new LodashWrapper(value, this.__chain__).thru(function(array) {\n        if (length && !array.length) {\n          array.push(undefined);\n        }\n        return array;\n      });\n    });\n\n    /**\n     * Creates a `lodash` wrapper instance with explicit method chain sequences enabled.\n     *\n     * @name chain\n     * @memberOf _\n     * @since 0.1.0\n     * @category Seq\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36 },\n     *   { 'user': 'fred',   'age': 40 }\n     * ];\n     *\n     * // A sequence without explicit chaining.\n     * _(users).head();\n     * // => { 'user': 'barney', 'age': 36 }\n     *\n     * // A sequence with explicit chaining.\n     * _(users)\n     *   .chain()\n     *   .head()\n     *   .pick('user')\n     *   .value();\n     * // => { 'user': 'barney' }\n     */\n    function wrapperChain() {\n      return chain(this);\n    }\n\n    /**\n     * Executes the chain sequence and returns the wrapped result.\n     *\n     * @name commit\n     * @memberOf _\n     * @since 3.2.0\n     * @category Seq\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * var array = [1, 2];\n     * var wrapped = _(array).push(3);\n     *\n     * console.log(array);\n     * // => [1, 2]\n     *\n     * wrapped = wrapped.commit();\n     * console.log(array);\n     * // => [1, 2, 3]\n     *\n     * wrapped.last();\n     * // => 3\n     *\n     * console.log(array);\n     * // => [1, 2, 3]\n     */\n    function wrapperCommit() {\n      return new LodashWrapper(this.value(), this.__chain__);\n    }\n\n    /**\n     * Gets the next value on a wrapped object following the\n     * [iterator protocol](https://mdn.io/iteration_protocols#iterator).\n     *\n     * @name next\n     * @memberOf _\n     * @since 4.0.0\n     * @category Seq\n     * @returns {Object} Returns the next iterator value.\n     * @example\n     *\n     * var wrapped = _([1, 2]);\n     *\n     * wrapped.next();\n     * // => { 'done': false, 'value': 1 }\n     *\n     * wrapped.next();\n     * // => { 'done': false, 'value': 2 }\n     *\n     * wrapped.next();\n     * // => { 'done': true, 'value': undefined }\n     */\n    function wrapperNext() {\n      if (this.__values__ === undefined) {\n        this.__values__ = toArray(this.value());\n      }\n      var done = this.__index__ >= this.__values__.length,\n          value = done ? undefined : this.__values__[this.__index__++];\n\n      return { 'done': done, 'value': value };\n    }\n\n    /**\n     * Enables the wrapper to be iterable.\n     *\n     * @name Symbol.iterator\n     * @memberOf _\n     * @since 4.0.0\n     * @category Seq\n     * @returns {Object} Returns the wrapper object.\n     * @example\n     *\n     * var wrapped = _([1, 2]);\n     *\n     * wrapped[Symbol.iterator]() === wrapped;\n     * // => true\n     *\n     * Array.from(wrapped);\n     * // => [1, 2]\n     */\n    function wrapperToIterator() {\n      return this;\n    }\n\n    /**\n     * Creates a clone of the chain sequence planting `value` as the wrapped value.\n     *\n     * @name plant\n     * @memberOf _\n     * @since 3.2.0\n     * @category Seq\n     * @param {*} value The value to plant.\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * var wrapped = _([1, 2]).map(square);\n     * var other = wrapped.plant([3, 4]);\n     *\n     * other.value();\n     * // => [9, 16]\n     *\n     * wrapped.value();\n     * // => [1, 4]\n     */\n    function wrapperPlant(value) {\n      var result,\n          parent = this;\n\n      while (parent instanceof baseLodash) {\n        var clone = wrapperClone(parent);\n        clone.__index__ = 0;\n        clone.__values__ = undefined;\n        if (result) {\n          previous.__wrapped__ = clone;\n        } else {\n          result = clone;\n        }\n        var previous = clone;\n        parent = parent.__wrapped__;\n      }\n      previous.__wrapped__ = value;\n      return result;\n    }\n\n    /**\n     * This method is the wrapper version of `_.reverse`.\n     *\n     * **Note:** This method mutates the wrapped array.\n     *\n     * @name reverse\n     * @memberOf _\n     * @since 0.1.0\n     * @category Seq\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * var array = [1, 2, 3];\n     *\n     * _(array).reverse().value()\n     * // => [3, 2, 1]\n     *\n     * console.log(array);\n     * // => [3, 2, 1]\n     */\n    function wrapperReverse() {\n      var value = this.__wrapped__;\n      if (value instanceof LazyWrapper) {\n        var wrapped = value;\n        if (this.__actions__.length) {\n          wrapped = new LazyWrapper(this);\n        }\n        wrapped = wrapped.reverse();\n        wrapped.__actions__.push({\n          'func': thru,\n          'args': [reverse],\n          'thisArg': undefined\n        });\n        return new LodashWrapper(wrapped, this.__chain__);\n      }\n      return this.thru(reverse);\n    }\n\n    /**\n     * Executes the chain sequence to resolve the unwrapped value.\n     *\n     * @name value\n     * @memberOf _\n     * @since 0.1.0\n     * @alias toJSON, valueOf\n     * @category Seq\n     * @returns {*} Returns the resolved unwrapped value.\n     * @example\n     *\n     * _([1, 2, 3]).value();\n     * // => [1, 2, 3]\n     */\n    function wrapperValue() {\n      return baseWrapperValue(this.__wrapped__, this.__actions__);\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates an object composed of keys generated from the results of running\n     * each element of `collection` thru `iteratee`. The corresponding value of\n     * each key is the number of times the key was returned by `iteratee`. The\n     * iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.5.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\n     * @returns {Object} Returns the composed aggregate object.\n     * @example\n     *\n     * _.countBy([6.1, 4.2, 6.3], Math.floor);\n     * // => { '4': 1, '6': 2 }\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.countBy(['one', 'two', 'three'], 'length');\n     * // => { '3': 2, '5': 1 }\n     */\n    var countBy = createAggregator(function(result, value, key) {\n      if (hasOwnProperty.call(result, key)) {\n        ++result[key];\n      } else {\n        baseAssignValue(result, key, 1);\n      }\n    });\n\n    /**\n     * Checks if `predicate` returns truthy for **all** elements of `collection`.\n     * Iteration is stopped once `predicate` returns falsey. The predicate is\n     * invoked with three arguments: (value, index|key, collection).\n     *\n     * **Note:** This method returns `true` for\n     * [empty collections](https://en.wikipedia.org/wiki/Empty_set) because\n     * [everything is true](https://en.wikipedia.org/wiki/Vacuous_truth) of\n     * elements of empty collections.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {boolean} Returns `true` if all elements pass the predicate check,\n     *  else `false`.\n     * @example\n     *\n     * _.every([true, 1, null, 'yes'], Boolean);\n     * // => false\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36, 'active': false },\n     *   { 'user': 'fred',   'age': 40, 'active': false }\n     * ];\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.every(users, { 'user': 'barney', 'active': false });\n     * // => false\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.every(users, ['active', false]);\n     * // => true\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.every(users, 'active');\n     * // => false\n     */\n    function every(collection, predicate, guard) {\n      var func = isArray(collection) ? arrayEvery : baseEvery;\n      if (guard && isIterateeCall(collection, predicate, guard)) {\n        predicate = undefined;\n      }\n      return func(collection, getIteratee(predicate, 3));\n    }\n\n    /**\n     * Iterates over elements of `collection`, returning an array of all elements\n     * `predicate` returns truthy for. The predicate is invoked with three\n     * arguments: (value, index|key, collection).\n     *\n     * **Note:** Unlike `_.remove`, this method returns a new array.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the new filtered array.\n     * @see _.reject\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36, 'active': true },\n     *   { 'user': 'fred',   'age': 40, 'active': false }\n     * ];\n     *\n     * _.filter(users, function(o) { return !o.active; });\n     * // => objects for ['fred']\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.filter(users, { 'age': 36, 'active': true });\n     * // => objects for ['barney']\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.filter(users, ['active', false]);\n     * // => objects for ['fred']\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.filter(users, 'active');\n     * // => objects for ['barney']\n     *\n     * // Combining several predicates using `_.overEvery` or `_.overSome`.\n     * _.filter(users, _.overSome([{ 'age': 36 }, ['age', 40]]));\n     * // => objects for ['fred', 'barney']\n     */\n    function filter(collection, predicate) {\n      var func = isArray(collection) ? arrayFilter : baseFilter;\n      return func(collection, getIteratee(predicate, 3));\n    }\n\n    /**\n     * Iterates over elements of `collection`, returning the first element\n     * `predicate` returns truthy for. The predicate is invoked with three\n     * arguments: (value, index|key, collection).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to inspect.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @param {number} [fromIndex=0] The index to search from.\n     * @returns {*} Returns the matched element, else `undefined`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'age': 36, 'active': true },\n     *   { 'user': 'fred',    'age': 40, 'active': false },\n     *   { 'user': 'pebbles', 'age': 1,  'active': true }\n     * ];\n     *\n     * _.find(users, function(o) { return o.age < 40; });\n     * // => object for 'barney'\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.find(users, { 'age': 1, 'active': true });\n     * // => object for 'pebbles'\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.find(users, ['active', false]);\n     * // => object for 'fred'\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.find(users, 'active');\n     * // => object for 'barney'\n     */\n    var find = createFind(findIndex);\n\n    /**\n     * This method is like `_.find` except that it iterates over elements of\n     * `collection` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to inspect.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @param {number} [fromIndex=collection.length-1] The index to search from.\n     * @returns {*} Returns the matched element, else `undefined`.\n     * @example\n     *\n     * _.findLast([1, 2, 3, 4], function(n) {\n     *   return n % 2 == 1;\n     * });\n     * // => 3\n     */\n    var findLast = createFind(findLastIndex);\n\n    /**\n     * Creates a flattened array of values by running each element in `collection`\n     * thru `iteratee` and flattening the mapped results. The iteratee is invoked\n     * with three arguments: (value, index|key, collection).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * function duplicate(n) {\n     *   return [n, n];\n     * }\n     *\n     * _.flatMap([1, 2], duplicate);\n     * // => [1, 1, 2, 2]\n     */\n    function flatMap(collection, iteratee) {\n      return baseFlatten(map(collection, iteratee), 1);\n    }\n\n    /**\n     * This method is like `_.flatMap` except that it recursively flattens the\n     * mapped results.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.7.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * function duplicate(n) {\n     *   return [[[n, n]]];\n     * }\n     *\n     * _.flatMapDeep([1, 2], duplicate);\n     * // => [1, 1, 2, 2]\n     */\n    function flatMapDeep(collection, iteratee) {\n      return baseFlatten(map(collection, iteratee), INFINITY);\n    }\n\n    /**\n     * This method is like `_.flatMap` except that it recursively flattens the\n     * mapped results up to `depth` times.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.7.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @param {number} [depth=1] The maximum recursion depth.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * function duplicate(n) {\n     *   return [[[n, n]]];\n     * }\n     *\n     * _.flatMapDepth([1, 2], duplicate, 2);\n     * // => [[1, 1], [2, 2]]\n     */\n    function flatMapDepth(collection, iteratee, depth) {\n      depth = depth === undefined ? 1 : toInteger(depth);\n      return baseFlatten(map(collection, iteratee), depth);\n    }\n\n    /**\n     * Iterates over elements of `collection` and invokes `iteratee` for each element.\n     * The iteratee is invoked with three arguments: (value, index|key, collection).\n     * Iteratee functions may exit iteration early by explicitly returning `false`.\n     *\n     * **Note:** As with other \"Collections\" methods, objects with a \"length\"\n     * property are iterated like arrays. To avoid this behavior use `_.forIn`\n     * or `_.forOwn` for object iteration.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @alias each\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Array|Object} Returns `collection`.\n     * @see _.forEachRight\n     * @example\n     *\n     * _.forEach([1, 2], function(value) {\n     *   console.log(value);\n     * });\n     * // => Logs `1` then `2`.\n     *\n     * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => Logs 'a' then 'b' (iteration order is not guaranteed).\n     */\n    function forEach(collection, iteratee) {\n      var func = isArray(collection) ? arrayEach : baseEach;\n      return func(collection, getIteratee(iteratee, 3));\n    }\n\n    /**\n     * This method is like `_.forEach` except that it iterates over elements of\n     * `collection` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @alias eachRight\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Array|Object} Returns `collection`.\n     * @see _.forEach\n     * @example\n     *\n     * _.forEachRight([1, 2], function(value) {\n     *   console.log(value);\n     * });\n     * // => Logs `2` then `1`.\n     */\n    function forEachRight(collection, iteratee) {\n      var func = isArray(collection) ? arrayEachRight : baseEachRight;\n      return func(collection, getIteratee(iteratee, 3));\n    }\n\n    /**\n     * Creates an object composed of keys generated from the results of running\n     * each element of `collection` thru `iteratee`. The order of grouped values\n     * is determined by the order they occur in `collection`. The corresponding\n     * value of each key is an array of elements responsible for generating the\n     * key. The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\n     * @returns {Object} Returns the composed aggregate object.\n     * @example\n     *\n     * _.groupBy([6.1, 4.2, 6.3], Math.floor);\n     * // => { '4': [4.2], '6': [6.1, 6.3] }\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.groupBy(['one', 'two', 'three'], 'length');\n     * // => { '3': ['one', 'two'], '5': ['three'] }\n     */\n    var groupBy = createAggregator(function(result, value, key) {\n      if (hasOwnProperty.call(result, key)) {\n        result[key].push(value);\n      } else {\n        baseAssignValue(result, key, [value]);\n      }\n    });\n\n    /**\n     * Checks if `value` is in `collection`. If `collection` is a string, it's\n     * checked for a substring of `value`, otherwise\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * is used for equality comparisons. If `fromIndex` is negative, it's used as\n     * the offset from the end of `collection`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to inspect.\n     * @param {*} value The value to search for.\n     * @param {number} [fromIndex=0] The index to search from.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.\n     * @returns {boolean} Returns `true` if `value` is found, else `false`.\n     * @example\n     *\n     * _.includes([1, 2, 3], 1);\n     * // => true\n     *\n     * _.includes([1, 2, 3], 1, 2);\n     * // => false\n     *\n     * _.includes({ 'a': 1, 'b': 2 }, 1);\n     * // => true\n     *\n     * _.includes('abcd', 'bc');\n     * // => true\n     */\n    function includes(collection, value, fromIndex, guard) {\n      collection = isArrayLike(collection) ? collection : values(collection);\n      fromIndex = (fromIndex && !guard) ? toInteger(fromIndex) : 0;\n\n      var length = collection.length;\n      if (fromIndex < 0) {\n        fromIndex = nativeMax(length + fromIndex, 0);\n      }\n      return isString(collection)\n        ? (fromIndex <= length && collection.indexOf(value, fromIndex) > -1)\n        : (!!length && baseIndexOf(collection, value, fromIndex) > -1);\n    }\n\n    /**\n     * Invokes the method at `path` of each element in `collection`, returning\n     * an array of the results of each invoked method. Any additional arguments\n     * are provided to each invoked method. If `path` is a function, it's invoked\n     * for, and `this` bound to, each element in `collection`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Array|Function|string} path The path of the method to invoke or\n     *  the function invoked per iteration.\n     * @param {...*} [args] The arguments to invoke each method with.\n     * @returns {Array} Returns the array of results.\n     * @example\n     *\n     * _.invokeMap([[5, 1, 7], [3, 2, 1]], 'sort');\n     * // => [[1, 5, 7], [1, 2, 3]]\n     *\n     * _.invokeMap([123, 456], String.prototype.split, '');\n     * // => [['1', '2', '3'], ['4', '5', '6']]\n     */\n    var invokeMap = baseRest(function(collection, path, args) {\n      var index = -1,\n          isFunc = typeof path == 'function',\n          result = isArrayLike(collection) ? Array(collection.length) : [];\n\n      baseEach(collection, function(value) {\n        result[++index] = isFunc ? apply(path, value, args) : baseInvoke(value, path, args);\n      });\n      return result;\n    });\n\n    /**\n     * Creates an object composed of keys generated from the results of running\n     * each element of `collection` thru `iteratee`. The corresponding value of\n     * each key is the last element responsible for generating the key. The\n     * iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\n     * @returns {Object} Returns the composed aggregate object.\n     * @example\n     *\n     * var array = [\n     *   { 'dir': 'left', 'code': 97 },\n     *   { 'dir': 'right', 'code': 100 }\n     * ];\n     *\n     * _.keyBy(array, function(o) {\n     *   return String.fromCharCode(o.code);\n     * });\n     * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }\n     *\n     * _.keyBy(array, 'dir');\n     * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } }\n     */\n    var keyBy = createAggregator(function(result, value, key) {\n      baseAssignValue(result, key, value);\n    });\n\n    /**\n     * Creates an array of values by running each element in `collection` thru\n     * `iteratee`. The iteratee is invoked with three arguments:\n     * (value, index|key, collection).\n     *\n     * Many lodash methods are guarded to work as iteratees for methods like\n     * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`.\n     *\n     * The guarded methods are:\n     * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`,\n     * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`,\n     * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`,\n     * `template`, `trim`, `trimEnd`, `trimStart`, and `words`\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the new mapped array.\n     * @example\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * _.map([4, 8], square);\n     * // => [16, 64]\n     *\n     * _.map({ 'a': 4, 'b': 8 }, square);\n     * // => [16, 64] (iteration order is not guaranteed)\n     *\n     * var users = [\n     *   { 'user': 'barney' },\n     *   { 'user': 'fred' }\n     * ];\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.map(users, 'user');\n     * // => ['barney', 'fred']\n     */\n    function map(collection, iteratee) {\n      var func = isArray(collection) ? arrayMap : baseMap;\n      return func(collection, getIteratee(iteratee, 3));\n    }\n\n    /**\n     * This method is like `_.sortBy` except that it allows specifying the sort\n     * orders of the iteratees to sort by. If `orders` is unspecified, all values\n     * are sorted in ascending order. Otherwise, specify an order of \"desc\" for\n     * descending or \"asc\" for ascending sort order of corresponding values.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Array[]|Function[]|Object[]|string[]} [iteratees=[_.identity]]\n     *  The iteratees to sort by.\n     * @param {string[]} [orders] The sort orders of `iteratees`.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.\n     * @returns {Array} Returns the new sorted array.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'fred',   'age': 48 },\n     *   { 'user': 'barney', 'age': 34 },\n     *   { 'user': 'fred',   'age': 40 },\n     *   { 'user': 'barney', 'age': 36 }\n     * ];\n     *\n     * // Sort by `user` in ascending order and by `age` in descending order.\n     * _.orderBy(users, ['user', 'age'], ['asc', 'desc']);\n     * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]]\n     */\n    function orderBy(collection, iteratees, orders, guard) {\n      if (collection == null) {\n        return [];\n      }\n      if (!isArray(iteratees)) {\n        iteratees = iteratees == null ? [] : [iteratees];\n      }\n      orders = guard ? undefined : orders;\n      if (!isArray(orders)) {\n        orders = orders == null ? [] : [orders];\n      }\n      return baseOrderBy(collection, iteratees, orders);\n    }\n\n    /**\n     * Creates an array of elements split into two groups, the first of which\n     * contains elements `predicate` returns truthy for, the second of which\n     * contains elements `predicate` returns falsey for. The predicate is\n     * invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the array of grouped elements.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'age': 36, 'active': false },\n     *   { 'user': 'fred',    'age': 40, 'active': true },\n     *   { 'user': 'pebbles', 'age': 1,  'active': false }\n     * ];\n     *\n     * _.partition(users, function(o) { return o.active; });\n     * // => objects for [['fred'], ['barney', 'pebbles']]\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.partition(users, { 'age': 1, 'active': false });\n     * // => objects for [['pebbles'], ['barney', 'fred']]\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.partition(users, ['active', false]);\n     * // => objects for [['barney', 'pebbles'], ['fred']]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.partition(users, 'active');\n     * // => objects for [['fred'], ['barney', 'pebbles']]\n     */\n    var partition = createAggregator(function(result, value, key) {\n      result[key ? 0 : 1].push(value);\n    }, function() { return [[], []]; });\n\n    /**\n     * Reduces `collection` to a value which is the accumulated result of running\n     * each element in `collection` thru `iteratee`, where each successive\n     * invocation is supplied the return value of the previous. If `accumulator`\n     * is not given, the first element of `collection` is used as the initial\n     * value. The iteratee is invoked with four arguments:\n     * (accumulator, value, index|key, collection).\n     *\n     * Many lodash methods are guarded to work as iteratees for methods like\n     * `_.reduce`, `_.reduceRight`, and `_.transform`.\n     *\n     * The guarded methods are:\n     * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`,\n     * and `sortBy`\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @param {*} [accumulator] The initial value.\n     * @returns {*} Returns the accumulated value.\n     * @see _.reduceRight\n     * @example\n     *\n     * _.reduce([1, 2], function(sum, n) {\n     *   return sum + n;\n     * }, 0);\n     * // => 3\n     *\n     * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {\n     *   (result[value] || (result[value] = [])).push(key);\n     *   return result;\n     * }, {});\n     * // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed)\n     */\n    function reduce(collection, iteratee, accumulator) {\n      var func = isArray(collection) ? arrayReduce : baseReduce,\n          initAccum = arguments.length < 3;\n\n      return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEach);\n    }\n\n    /**\n     * This method is like `_.reduce` except that it iterates over elements of\n     * `collection` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @param {*} [accumulator] The initial value.\n     * @returns {*} Returns the accumulated value.\n     * @see _.reduce\n     * @example\n     *\n     * var array = [[0, 1], [2, 3], [4, 5]];\n     *\n     * _.reduceRight(array, function(flattened, other) {\n     *   return flattened.concat(other);\n     * }, []);\n     * // => [4, 5, 2, 3, 0, 1]\n     */\n    function reduceRight(collection, iteratee, accumulator) {\n      var func = isArray(collection) ? arrayReduceRight : baseReduce,\n          initAccum = arguments.length < 3;\n\n      return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEachRight);\n    }\n\n    /**\n     * The opposite of `_.filter`; this method returns the elements of `collection`\n     * that `predicate` does **not** return truthy for.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the new filtered array.\n     * @see _.filter\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36, 'active': false },\n     *   { 'user': 'fred',   'age': 40, 'active': true }\n     * ];\n     *\n     * _.reject(users, function(o) { return !o.active; });\n     * // => objects for ['fred']\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.reject(users, { 'age': 40, 'active': true });\n     * // => objects for ['barney']\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.reject(users, ['active', false]);\n     * // => objects for ['fred']\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.reject(users, 'active');\n     * // => objects for ['barney']\n     */\n    function reject(collection, predicate) {\n      var func = isArray(collection) ? arrayFilter : baseFilter;\n      return func(collection, negate(getIteratee(predicate, 3)));\n    }\n\n    /**\n     * Gets a random element from `collection`.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to sample.\n     * @returns {*} Returns the random element.\n     * @example\n     *\n     * _.sample([1, 2, 3, 4]);\n     * // => 2\n     */\n    function sample(collection) {\n      var func = isArray(collection) ? arraySample : baseSample;\n      return func(collection);\n    }\n\n    /**\n     * Gets `n` random elements at unique keys from `collection` up to the\n     * size of `collection`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to sample.\n     * @param {number} [n=1] The number of elements to sample.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the random elements.\n     * @example\n     *\n     * _.sampleSize([1, 2, 3], 2);\n     * // => [3, 1]\n     *\n     * _.sampleSize([1, 2, 3], 4);\n     * // => [2, 3, 1]\n     */\n    function sampleSize(collection, n, guard) {\n      if ((guard ? isIterateeCall(collection, n, guard) : n === undefined)) {\n        n = 1;\n      } else {\n        n = toInteger(n);\n      }\n      var func = isArray(collection) ? arraySampleSize : baseSampleSize;\n      return func(collection, n);\n    }\n\n    /**\n     * Creates an array of shuffled values, using a version of the\n     * [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher-Yates_shuffle).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to shuffle.\n     * @returns {Array} Returns the new shuffled array.\n     * @example\n     *\n     * _.shuffle([1, 2, 3, 4]);\n     * // => [4, 1, 3, 2]\n     */\n    function shuffle(collection) {\n      var func = isArray(collection) ? arrayShuffle : baseShuffle;\n      return func(collection);\n    }\n\n    /**\n     * Gets the size of `collection` by returning its length for array-like\n     * values or the number of own enumerable string keyed properties for objects.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to inspect.\n     * @returns {number} Returns the collection size.\n     * @example\n     *\n     * _.size([1, 2, 3]);\n     * // => 3\n     *\n     * _.size({ 'a': 1, 'b': 2 });\n     * // => 2\n     *\n     * _.size('pebbles');\n     * // => 7\n     */\n    function size(collection) {\n      if (collection == null) {\n        return 0;\n      }\n      if (isArrayLike(collection)) {\n        return isString(collection) ? stringSize(collection) : collection.length;\n      }\n      var tag = getTag(collection);\n      if (tag == mapTag || tag == setTag) {\n        return collection.size;\n      }\n      return baseKeys(collection).length;\n    }\n\n    /**\n     * Checks if `predicate` returns truthy for **any** element of `collection`.\n     * Iteration is stopped once `predicate` returns truthy. The predicate is\n     * invoked with three arguments: (value, index|key, collection).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {boolean} Returns `true` if any element passes the predicate check,\n     *  else `false`.\n     * @example\n     *\n     * _.some([null, 0, 'yes', false], Boolean);\n     * // => true\n     *\n     * var users = [\n     *   { 'user': 'barney', 'active': true },\n     *   { 'user': 'fred',   'active': false }\n     * ];\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.some(users, { 'user': 'barney', 'active': false });\n     * // => false\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.some(users, ['active', false]);\n     * // => true\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.some(users, 'active');\n     * // => true\n     */\n    function some(collection, predicate, guard) {\n      var func = isArray(collection) ? arraySome : baseSome;\n      if (guard && isIterateeCall(collection, predicate, guard)) {\n        predicate = undefined;\n      }\n      return func(collection, getIteratee(predicate, 3));\n    }\n\n    /**\n     * Creates an array of elements, sorted in ascending order by the results of\n     * running each element in a collection thru each iteratee. This method\n     * performs a stable sort, that is, it preserves the original sort order of\n     * equal elements. The iteratees are invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {...(Function|Function[])} [iteratees=[_.identity]]\n     *  The iteratees to sort by.\n     * @returns {Array} Returns the new sorted array.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'fred',   'age': 48 },\n     *   { 'user': 'barney', 'age': 36 },\n     *   { 'user': 'fred',   'age': 30 },\n     *   { 'user': 'barney', 'age': 34 }\n     * ];\n     *\n     * _.sortBy(users, [function(o) { return o.user; }]);\n     * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 30]]\n     *\n     * _.sortBy(users, ['user', 'age']);\n     * // => objects for [['barney', 34], ['barney', 36], ['fred', 30], ['fred', 48]]\n     */\n    var sortBy = baseRest(function(collection, iteratees) {\n      if (collection == null) {\n        return [];\n      }\n      var length = iteratees.length;\n      if (length > 1 && isIterateeCall(collection, iteratees[0], iteratees[1])) {\n        iteratees = [];\n      } else if (length > 2 && isIterateeCall(iteratees[0], iteratees[1], iteratees[2])) {\n        iteratees = [iteratees[0]];\n      }\n      return baseOrderBy(collection, baseFlatten(iteratees, 1), []);\n    });\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Gets the timestamp of the number of milliseconds that have elapsed since\n     * the Unix epoch (1 January 1970 00:00:00 UTC).\n     *\n     * @static\n     * @memberOf _\n     * @since 2.4.0\n     * @category Date\n     * @returns {number} Returns the timestamp.\n     * @example\n     *\n     * _.defer(function(stamp) {\n     *   console.log(_.now() - stamp);\n     * }, _.now());\n     * // => Logs the number of milliseconds it took for the deferred invocation.\n     */\n    var now = ctxNow || function() {\n      return root.Date.now();\n    };\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * The opposite of `_.before`; this method creates a function that invokes\n     * `func` once it's called `n` or more times.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {number} n The number of calls before `func` is invoked.\n     * @param {Function} func The function to restrict.\n     * @returns {Function} Returns the new restricted function.\n     * @example\n     *\n     * var saves = ['profile', 'settings'];\n     *\n     * var done = _.after(saves.length, function() {\n     *   console.log('done saving!');\n     * });\n     *\n     * _.forEach(saves, function(type) {\n     *   asyncSave({ 'type': type, 'complete': done });\n     * });\n     * // => Logs 'done saving!' after the two async saves have completed.\n     */\n    function after(n, func) {\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      n = toInteger(n);\n      return function() {\n        if (--n < 1) {\n          return func.apply(this, arguments);\n        }\n      };\n    }\n\n    /**\n     * Creates a function that invokes `func`, with up to `n` arguments,\n     * ignoring any additional arguments.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Function\n     * @param {Function} func The function to cap arguments for.\n     * @param {number} [n=func.length] The arity cap.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Function} Returns the new capped function.\n     * @example\n     *\n     * _.map(['6', '8', '10'], _.ary(parseInt, 1));\n     * // => [6, 8, 10]\n     */\n    function ary(func, n, guard) {\n      n = guard ? undefined : n;\n      n = (func && n == null) ? func.length : n;\n      return createWrap(func, WRAP_ARY_FLAG, undefined, undefined, undefined, undefined, n);\n    }\n\n    /**\n     * Creates a function that invokes `func`, with the `this` binding and arguments\n     * of the created function, while it's called less than `n` times. Subsequent\n     * calls to the created function return the result of the last `func` invocation.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Function\n     * @param {number} n The number of calls at which `func` is no longer invoked.\n     * @param {Function} func The function to restrict.\n     * @returns {Function} Returns the new restricted function.\n     * @example\n     *\n     * jQuery(element).on('click', _.before(5, addContactToList));\n     * // => Allows adding up to 4 contacts to the list.\n     */\n    function before(n, func) {\n      var result;\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      n = toInteger(n);\n      return function() {\n        if (--n > 0) {\n          result = func.apply(this, arguments);\n        }\n        if (n <= 1) {\n          func = undefined;\n        }\n        return result;\n      };\n    }\n\n    /**\n     * Creates a function that invokes `func` with the `this` binding of `thisArg`\n     * and `partials` prepended to the arguments it receives.\n     *\n     * The `_.bind.placeholder` value, which defaults to `_` in monolithic builds,\n     * may be used as a placeholder for partially applied arguments.\n     *\n     * **Note:** Unlike native `Function#bind`, this method doesn't set the \"length\"\n     * property of bound functions.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to bind.\n     * @param {*} thisArg The `this` binding of `func`.\n     * @param {...*} [partials] The arguments to be partially applied.\n     * @returns {Function} Returns the new bound function.\n     * @example\n     *\n     * function greet(greeting, punctuation) {\n     *   return greeting + ' ' + this.user + punctuation;\n     * }\n     *\n     * var object = { 'user': 'fred' };\n     *\n     * var bound = _.bind(greet, object, 'hi');\n     * bound('!');\n     * // => 'hi fred!'\n     *\n     * // Bound with placeholders.\n     * var bound = _.bind(greet, object, _, '!');\n     * bound('hi');\n     * // => 'hi fred!'\n     */\n    var bind = baseRest(function(func, thisArg, partials) {\n      var bitmask = WRAP_BIND_FLAG;\n      if (partials.length) {\n        var holders = replaceHolders(partials, getHolder(bind));\n        bitmask |= WRAP_PARTIAL_FLAG;\n      }\n      return createWrap(func, bitmask, thisArg, partials, holders);\n    });\n\n    /**\n     * Creates a function that invokes the method at `object[key]` with `partials`\n     * prepended to the arguments it receives.\n     *\n     * This method differs from `_.bind` by allowing bound functions to reference\n     * methods that may be redefined or don't yet exist. See\n     * [Peter Michaux's article](http://peter.michaux.ca/articles/lazy-function-definition-pattern)\n     * for more details.\n     *\n     * The `_.bindKey.placeholder` value, which defaults to `_` in monolithic\n     * builds, may be used as a placeholder for partially applied arguments.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.10.0\n     * @category Function\n     * @param {Object} object The object to invoke the method on.\n     * @param {string} key The key of the method.\n     * @param {...*} [partials] The arguments to be partially applied.\n     * @returns {Function} Returns the new bound function.\n     * @example\n     *\n     * var object = {\n     *   'user': 'fred',\n     *   'greet': function(greeting, punctuation) {\n     *     return greeting + ' ' + this.user + punctuation;\n     *   }\n     * };\n     *\n     * var bound = _.bindKey(object, 'greet', 'hi');\n     * bound('!');\n     * // => 'hi fred!'\n     *\n     * object.greet = function(greeting, punctuation) {\n     *   return greeting + 'ya ' + this.user + punctuation;\n     * };\n     *\n     * bound('!');\n     * // => 'hiya fred!'\n     *\n     * // Bound with placeholders.\n     * var bound = _.bindKey(object, 'greet', _, '!');\n     * bound('hi');\n     * // => 'hiya fred!'\n     */\n    var bindKey = baseRest(function(object, key, partials) {\n      var bitmask = WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG;\n      if (partials.length) {\n        var holders = replaceHolders(partials, getHolder(bindKey));\n        bitmask |= WRAP_PARTIAL_FLAG;\n      }\n      return createWrap(key, bitmask, object, partials, holders);\n    });\n\n    /**\n     * Creates a function that accepts arguments of `func` and either invokes\n     * `func` returning its result, if at least `arity` number of arguments have\n     * been provided, or returns a function that accepts the remaining `func`\n     * arguments, and so on. The arity of `func` may be specified if `func.length`\n     * is not sufficient.\n     *\n     * The `_.curry.placeholder` value, which defaults to `_` in monolithic builds,\n     * may be used as a placeholder for provided arguments.\n     *\n     * **Note:** This method doesn't set the \"length\" property of curried functions.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Function\n     * @param {Function} func The function to curry.\n     * @param {number} [arity=func.length] The arity of `func`.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Function} Returns the new curried function.\n     * @example\n     *\n     * var abc = function(a, b, c) {\n     *   return [a, b, c];\n     * };\n     *\n     * var curried = _.curry(abc);\n     *\n     * curried(1)(2)(3);\n     * // => [1, 2, 3]\n     *\n     * curried(1, 2)(3);\n     * // => [1, 2, 3]\n     *\n     * curried(1, 2, 3);\n     * // => [1, 2, 3]\n     *\n     * // Curried with placeholders.\n     * curried(1)(_, 3)(2);\n     * // => [1, 2, 3]\n     */\n    function curry(func, arity, guard) {\n      arity = guard ? undefined : arity;\n      var result = createWrap(func, WRAP_CURRY_FLAG, undefined, undefined, undefined, undefined, undefined, arity);\n      result.placeholder = curry.placeholder;\n      return result;\n    }\n\n    /**\n     * This method is like `_.curry` except that arguments are applied to `func`\n     * in the manner of `_.partialRight` instead of `_.partial`.\n     *\n     * The `_.curryRight.placeholder` value, which defaults to `_` in monolithic\n     * builds, may be used as a placeholder for provided arguments.\n     *\n     * **Note:** This method doesn't set the \"length\" property of curried functions.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Function\n     * @param {Function} func The function to curry.\n     * @param {number} [arity=func.length] The arity of `func`.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Function} Returns the new curried function.\n     * @example\n     *\n     * var abc = function(a, b, c) {\n     *   return [a, b, c];\n     * };\n     *\n     * var curried = _.curryRight(abc);\n     *\n     * curried(3)(2)(1);\n     * // => [1, 2, 3]\n     *\n     * curried(2, 3)(1);\n     * // => [1, 2, 3]\n     *\n     * curried(1, 2, 3);\n     * // => [1, 2, 3]\n     *\n     * // Curried with placeholders.\n     * curried(3)(1, _)(2);\n     * // => [1, 2, 3]\n     */\n    function curryRight(func, arity, guard) {\n      arity = guard ? undefined : arity;\n      var result = createWrap(func, WRAP_CURRY_RIGHT_FLAG, undefined, undefined, undefined, undefined, undefined, arity);\n      result.placeholder = curryRight.placeholder;\n      return result;\n    }\n\n    /**\n     * Creates a debounced function that delays invoking `func` until after `wait`\n     * milliseconds have elapsed since the last time the debounced function was\n     * invoked. The debounced function comes with a `cancel` method to cancel\n     * delayed `func` invocations and a `flush` method to immediately invoke them.\n     * Provide `options` to indicate whether `func` should be invoked on the\n     * leading and/or trailing edge of the `wait` timeout. The `func` is invoked\n     * with the last arguments provided to the debounced function. Subsequent\n     * calls to the debounced function return the result of the last `func`\n     * invocation.\n     *\n     * **Note:** If `leading` and `trailing` options are `true`, `func` is\n     * invoked on the trailing edge of the timeout only if the debounced function\n     * is invoked more than once during the `wait` timeout.\n     *\n     * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n     * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n     *\n     * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n     * for details over the differences between `_.debounce` and `_.throttle`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to debounce.\n     * @param {number} [wait=0] The number of milliseconds to delay.\n     * @param {Object} [options={}] The options object.\n     * @param {boolean} [options.leading=false]\n     *  Specify invoking on the leading edge of the timeout.\n     * @param {number} [options.maxWait]\n     *  The maximum time `func` is allowed to be delayed before it's invoked.\n     * @param {boolean} [options.trailing=true]\n     *  Specify invoking on the trailing edge of the timeout.\n     * @returns {Function} Returns the new debounced function.\n     * @example\n     *\n     * // Avoid costly calculations while the window size is in flux.\n     * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n     *\n     * // Invoke `sendMail` when clicked, debouncing subsequent calls.\n     * jQuery(element).on('click', _.debounce(sendMail, 300, {\n     *   'leading': true,\n     *   'trailing': false\n     * }));\n     *\n     * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\n     * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n     * var source = new EventSource('/stream');\n     * jQuery(source).on('message', debounced);\n     *\n     * // Cancel the trailing debounced invocation.\n     * jQuery(window).on('popstate', debounced.cancel);\n     */\n    function debounce(func, wait, options) {\n      var lastArgs,\n          lastThis,\n          maxWait,\n          result,\n          timerId,\n          lastCallTime,\n          lastInvokeTime = 0,\n          leading = false,\n          maxing = false,\n          trailing = true;\n\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      wait = toNumber(wait) || 0;\n      if (isObject(options)) {\n        leading = !!options.leading;\n        maxing = 'maxWait' in options;\n        maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;\n        trailing = 'trailing' in options ? !!options.trailing : trailing;\n      }\n\n      function invokeFunc(time) {\n        var args = lastArgs,\n            thisArg = lastThis;\n\n        lastArgs = lastThis = undefined;\n        lastInvokeTime = time;\n        result = func.apply(thisArg, args);\n        return result;\n      }\n\n      function leadingEdge(time) {\n        // Reset any `maxWait` timer.\n        lastInvokeTime = time;\n        // Start the timer for the trailing edge.\n        timerId = setTimeout(timerExpired, wait);\n        // Invoke the leading edge.\n        return leading ? invokeFunc(time) : result;\n      }\n\n      function remainingWait(time) {\n        var timeSinceLastCall = time - lastCallTime,\n            timeSinceLastInvoke = time - lastInvokeTime,\n            timeWaiting = wait - timeSinceLastCall;\n\n        return maxing\n          ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke)\n          : timeWaiting;\n      }\n\n      function shouldInvoke(time) {\n        var timeSinceLastCall = time - lastCallTime,\n            timeSinceLastInvoke = time - lastInvokeTime;\n\n        // Either this is the first call, activity has stopped and we're at the\n        // trailing edge, the system time has gone backwards and we're treating\n        // it as the trailing edge, or we've hit the `maxWait` limit.\n        return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n          (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\n      }\n\n      function timerExpired() {\n        var time = now();\n        if (shouldInvoke(time)) {\n          return trailingEdge(time);\n        }\n        // Restart the timer.\n        timerId = setTimeout(timerExpired, remainingWait(time));\n      }\n\n      function trailingEdge(time) {\n        timerId = undefined;\n\n        // Only invoke if we have `lastArgs` which means `func` has been\n        // debounced at least once.\n        if (trailing && lastArgs) {\n          return invokeFunc(time);\n        }\n        lastArgs = lastThis = undefined;\n        return result;\n      }\n\n      function cancel() {\n        if (timerId !== undefined) {\n          clearTimeout(timerId);\n        }\n        lastInvokeTime = 0;\n        lastArgs = lastCallTime = lastThis = timerId = undefined;\n      }\n\n      function flush() {\n        return timerId === undefined ? result : trailingEdge(now());\n      }\n\n      function debounced() {\n        var time = now(),\n            isInvoking = shouldInvoke(time);\n\n        lastArgs = arguments;\n        lastThis = this;\n        lastCallTime = time;\n\n        if (isInvoking) {\n          if (timerId === undefined) {\n            return leadingEdge(lastCallTime);\n          }\n          if (maxing) {\n            // Handle invocations in a tight loop.\n            clearTimeout(timerId);\n            timerId = setTimeout(timerExpired, wait);\n            return invokeFunc(lastCallTime);\n          }\n        }\n        if (timerId === undefined) {\n          timerId = setTimeout(timerExpired, wait);\n        }\n        return result;\n      }\n      debounced.cancel = cancel;\n      debounced.flush = flush;\n      return debounced;\n    }\n\n    /**\n     * Defers invoking the `func` until the current call stack has cleared. Any\n     * additional arguments are provided to `func` when it's invoked.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to defer.\n     * @param {...*} [args] The arguments to invoke `func` with.\n     * @returns {number} Returns the timer id.\n     * @example\n     *\n     * _.defer(function(text) {\n     *   console.log(text);\n     * }, 'deferred');\n     * // => Logs 'deferred' after one millisecond.\n     */\n    var defer = baseRest(function(func, args) {\n      return baseDelay(func, 1, args);\n    });\n\n    /**\n     * Invokes `func` after `wait` milliseconds. Any additional arguments are\n     * provided to `func` when it's invoked.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to delay.\n     * @param {number} wait The number of milliseconds to delay invocation.\n     * @param {...*} [args] The arguments to invoke `func` with.\n     * @returns {number} Returns the timer id.\n     * @example\n     *\n     * _.delay(function(text) {\n     *   console.log(text);\n     * }, 1000, 'later');\n     * // => Logs 'later' after one second.\n     */\n    var delay = baseRest(function(func, wait, args) {\n      return baseDelay(func, toNumber(wait) || 0, args);\n    });\n\n    /**\n     * Creates a function that invokes `func` with arguments reversed.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Function\n     * @param {Function} func The function to flip arguments for.\n     * @returns {Function} Returns the new flipped function.\n     * @example\n     *\n     * var flipped = _.flip(function() {\n     *   return _.toArray(arguments);\n     * });\n     *\n     * flipped('a', 'b', 'c', 'd');\n     * // => ['d', 'c', 'b', 'a']\n     */\n    function flip(func) {\n      return createWrap(func, WRAP_FLIP_FLAG);\n    }\n\n    /**\n     * Creates a function that memoizes the result of `func`. If `resolver` is\n     * provided, it determines the cache key for storing the result based on the\n     * arguments provided to the memoized function. By default, the first argument\n     * provided to the memoized function is used as the map cache key. The `func`\n     * is invoked with the `this` binding of the memoized function.\n     *\n     * **Note:** The cache is exposed as the `cache` property on the memoized\n     * function. Its creation may be customized by replacing the `_.memoize.Cache`\n     * constructor with one whose instances implement the\n     * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)\n     * method interface of `clear`, `delete`, `get`, `has`, and `set`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to have its output memoized.\n     * @param {Function} [resolver] The function to resolve the cache key.\n     * @returns {Function} Returns the new memoized function.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': 2 };\n     * var other = { 'c': 3, 'd': 4 };\n     *\n     * var values = _.memoize(_.values);\n     * values(object);\n     * // => [1, 2]\n     *\n     * values(other);\n     * // => [3, 4]\n     *\n     * object.a = 2;\n     * values(object);\n     * // => [1, 2]\n     *\n     * // Modify the result cache.\n     * values.cache.set(object, ['a', 'b']);\n     * values(object);\n     * // => ['a', 'b']\n     *\n     * // Replace `_.memoize.Cache`.\n     * _.memoize.Cache = WeakMap;\n     */\n    function memoize(func, resolver) {\n      if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      var memoized = function() {\n        var args = arguments,\n            key = resolver ? resolver.apply(this, args) : args[0],\n            cache = memoized.cache;\n\n        if (cache.has(key)) {\n          return cache.get(key);\n        }\n        var result = func.apply(this, args);\n        memoized.cache = cache.set(key, result) || cache;\n        return result;\n      };\n      memoized.cache = new (memoize.Cache || MapCache);\n      return memoized;\n    }\n\n    // Expose `MapCache`.\n    memoize.Cache = MapCache;\n\n    /**\n     * Creates a function that negates the result of the predicate `func`. The\n     * `func` predicate is invoked with the `this` binding and arguments of the\n     * created function.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Function\n     * @param {Function} predicate The predicate to negate.\n     * @returns {Function} Returns the new negated function.\n     * @example\n     *\n     * function isEven(n) {\n     *   return n % 2 == 0;\n     * }\n     *\n     * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven));\n     * // => [1, 3, 5]\n     */\n    function negate(predicate) {\n      if (typeof predicate != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      return function() {\n        var args = arguments;\n        switch (args.length) {\n          case 0: return !predicate.call(this);\n          case 1: return !predicate.call(this, args[0]);\n          case 2: return !predicate.call(this, args[0], args[1]);\n          case 3: return !predicate.call(this, args[0], args[1], args[2]);\n        }\n        return !predicate.apply(this, args);\n      };\n    }\n\n    /**\n     * Creates a function that is restricted to invoking `func` once. Repeat calls\n     * to the function return the value of the first invocation. The `func` is\n     * invoked with the `this` binding and arguments of the created function.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to restrict.\n     * @returns {Function} Returns the new restricted function.\n     * @example\n     *\n     * var initialize = _.once(createApplication);\n     * initialize();\n     * initialize();\n     * // => `createApplication` is invoked once\n     */\n    function once(func) {\n      return before(2, func);\n    }\n\n    /**\n     * Creates a function that invokes `func` with its arguments transformed.\n     *\n     * @static\n     * @since 4.0.0\n     * @memberOf _\n     * @category Function\n     * @param {Function} func The function to wrap.\n     * @param {...(Function|Function[])} [transforms=[_.identity]]\n     *  The argument transforms.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * function doubled(n) {\n     *   return n * 2;\n     * }\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * var func = _.overArgs(function(x, y) {\n     *   return [x, y];\n     * }, [square, doubled]);\n     *\n     * func(9, 3);\n     * // => [81, 6]\n     *\n     * func(10, 5);\n     * // => [100, 10]\n     */\n    var overArgs = castRest(function(func, transforms) {\n      transforms = (transforms.length == 1 && isArray(transforms[0]))\n        ? arrayMap(transforms[0], baseUnary(getIteratee()))\n        : arrayMap(baseFlatten(transforms, 1), baseUnary(getIteratee()));\n\n      var funcsLength = transforms.length;\n      return baseRest(function(args) {\n        var index = -1,\n            length = nativeMin(args.length, funcsLength);\n\n        while (++index < length) {\n          args[index] = transforms[index].call(this, args[index]);\n        }\n        return apply(func, this, args);\n      });\n    });\n\n    /**\n     * Creates a function that invokes `func` with `partials` prepended to the\n     * arguments it receives. This method is like `_.bind` except it does **not**\n     * alter the `this` binding.\n     *\n     * The `_.partial.placeholder` value, which defaults to `_` in monolithic\n     * builds, may be used as a placeholder for partially applied arguments.\n     *\n     * **Note:** This method doesn't set the \"length\" property of partially\n     * applied functions.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.2.0\n     * @category Function\n     * @param {Function} func The function to partially apply arguments to.\n     * @param {...*} [partials] The arguments to be partially applied.\n     * @returns {Function} Returns the new partially applied function.\n     * @example\n     *\n     * function greet(greeting, name) {\n     *   return greeting + ' ' + name;\n     * }\n     *\n     * var sayHelloTo = _.partial(greet, 'hello');\n     * sayHelloTo('fred');\n     * // => 'hello fred'\n     *\n     * // Partially applied with placeholders.\n     * var greetFred = _.partial(greet, _, 'fred');\n     * greetFred('hi');\n     * // => 'hi fred'\n     */\n    var partial = baseRest(function(func, partials) {\n      var holders = replaceHolders(partials, getHolder(partial));\n      return createWrap(func, WRAP_PARTIAL_FLAG, undefined, partials, holders);\n    });\n\n    /**\n     * This method is like `_.partial` except that partially applied arguments\n     * are appended to the arguments it receives.\n     *\n     * The `_.partialRight.placeholder` value, which defaults to `_` in monolithic\n     * builds, may be used as a placeholder for partially applied arguments.\n     *\n     * **Note:** This method doesn't set the \"length\" property of partially\n     * applied functions.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.0.0\n     * @category Function\n     * @param {Function} func The function to partially apply arguments to.\n     * @param {...*} [partials] The arguments to be partially applied.\n     * @returns {Function} Returns the new partially applied function.\n     * @example\n     *\n     * function greet(greeting, name) {\n     *   return greeting + ' ' + name;\n     * }\n     *\n     * var greetFred = _.partialRight(greet, 'fred');\n     * greetFred('hi');\n     * // => 'hi fred'\n     *\n     * // Partially applied with placeholders.\n     * var sayHelloTo = _.partialRight(greet, 'hello', _);\n     * sayHelloTo('fred');\n     * // => 'hello fred'\n     */\n    var partialRight = baseRest(function(func, partials) {\n      var holders = replaceHolders(partials, getHolder(partialRight));\n      return createWrap(func, WRAP_PARTIAL_RIGHT_FLAG, undefined, partials, holders);\n    });\n\n    /**\n     * Creates a function that invokes `func` with arguments arranged according\n     * to the specified `indexes` where the argument value at the first index is\n     * provided as the first argument, the argument value at the second index is\n     * provided as the second argument, and so on.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Function\n     * @param {Function} func The function to rearrange arguments for.\n     * @param {...(number|number[])} indexes The arranged argument indexes.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var rearged = _.rearg(function(a, b, c) {\n     *   return [a, b, c];\n     * }, [2, 0, 1]);\n     *\n     * rearged('b', 'c', 'a')\n     * // => ['a', 'b', 'c']\n     */\n    var rearg = flatRest(function(func, indexes) {\n      return createWrap(func, WRAP_REARG_FLAG, undefined, undefined, undefined, indexes);\n    });\n\n    /**\n     * Creates a function that invokes `func` with the `this` binding of the\n     * created function and arguments from `start` and beyond provided as\n     * an array.\n     *\n     * **Note:** This method is based on the\n     * [rest parameter](https://mdn.io/rest_parameters).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Function\n     * @param {Function} func The function to apply a rest parameter to.\n     * @param {number} [start=func.length-1] The start position of the rest parameter.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var say = _.rest(function(what, names) {\n     *   return what + ' ' + _.initial(names).join(', ') +\n     *     (_.size(names) > 1 ? ', & ' : '') + _.last(names);\n     * });\n     *\n     * say('hello', 'fred', 'barney', 'pebbles');\n     * // => 'hello fred, barney, & pebbles'\n     */\n    function rest(func, start) {\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      start = start === undefined ? start : toInteger(start);\n      return baseRest(func, start);\n    }\n\n    /**\n     * Creates a function that invokes `func` with the `this` binding of the\n     * create function and an array of arguments much like\n     * [`Function#apply`](http://www.ecma-international.org/ecma-262/7.0/#sec-function.prototype.apply).\n     *\n     * **Note:** This method is based on the\n     * [spread operator](https://mdn.io/spread_operator).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.2.0\n     * @category Function\n     * @param {Function} func The function to spread arguments over.\n     * @param {number} [start=0] The start position of the spread.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var say = _.spread(function(who, what) {\n     *   return who + ' says ' + what;\n     * });\n     *\n     * say(['fred', 'hello']);\n     * // => 'fred says hello'\n     *\n     * var numbers = Promise.all([\n     *   Promise.resolve(40),\n     *   Promise.resolve(36)\n     * ]);\n     *\n     * numbers.then(_.spread(function(x, y) {\n     *   return x + y;\n     * }));\n     * // => a Promise of 76\n     */\n    function spread(func, start) {\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      start = start == null ? 0 : nativeMax(toInteger(start), 0);\n      return baseRest(function(args) {\n        var array = args[start],\n            otherArgs = castSlice(args, 0, start);\n\n        if (array) {\n          arrayPush(otherArgs, array);\n        }\n        return apply(func, this, otherArgs);\n      });\n    }\n\n    /**\n     * Creates a throttled function that only invokes `func` at most once per\n     * every `wait` milliseconds. The throttled function comes with a `cancel`\n     * method to cancel delayed `func` invocations and a `flush` method to\n     * immediately invoke them. Provide `options` to indicate whether `func`\n     * should be invoked on the leading and/or trailing edge of the `wait`\n     * timeout. The `func` is invoked with the last arguments provided to the\n     * throttled function. Subsequent calls to the throttled function return the\n     * result of the last `func` invocation.\n     *\n     * **Note:** If `leading` and `trailing` options are `true`, `func` is\n     * invoked on the trailing edge of the timeout only if the throttled function\n     * is invoked more than once during the `wait` timeout.\n     *\n     * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n     * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n     *\n     * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n     * for details over the differences between `_.throttle` and `_.debounce`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to throttle.\n     * @param {number} [wait=0] The number of milliseconds to throttle invocations to.\n     * @param {Object} [options={}] The options object.\n     * @param {boolean} [options.leading=true]\n     *  Specify invoking on the leading edge of the timeout.\n     * @param {boolean} [options.trailing=true]\n     *  Specify invoking on the trailing edge of the timeout.\n     * @returns {Function} Returns the new throttled function.\n     * @example\n     *\n     * // Avoid excessively updating the position while scrolling.\n     * jQuery(window).on('scroll', _.throttle(updatePosition, 100));\n     *\n     * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.\n     * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });\n     * jQuery(element).on('click', throttled);\n     *\n     * // Cancel the trailing throttled invocation.\n     * jQuery(window).on('popstate', throttled.cancel);\n     */\n    function throttle(func, wait, options) {\n      var leading = true,\n          trailing = true;\n\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      if (isObject(options)) {\n        leading = 'leading' in options ? !!options.leading : leading;\n        trailing = 'trailing' in options ? !!options.trailing : trailing;\n      }\n      return debounce(func, wait, {\n        'leading': leading,\n        'maxWait': wait,\n        'trailing': trailing\n      });\n    }\n\n    /**\n     * Creates a function that accepts up to one argument, ignoring any\n     * additional arguments.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Function\n     * @param {Function} func The function to cap arguments for.\n     * @returns {Function} Returns the new capped function.\n     * @example\n     *\n     * _.map(['6', '8', '10'], _.unary(parseInt));\n     * // => [6, 8, 10]\n     */\n    function unary(func) {\n      return ary(func, 1);\n    }\n\n    /**\n     * Creates a function that provides `value` to `wrapper` as its first\n     * argument. Any additional arguments provided to the function are appended\n     * to those provided to the `wrapper`. The wrapper is invoked with the `this`\n     * binding of the created function.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {*} value The value to wrap.\n     * @param {Function} [wrapper=identity] The wrapper function.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var p = _.wrap(_.escape, function(func, text) {\n     *   return '<p>' + func(text) + '</p>';\n     * });\n     *\n     * p('fred, barney, & pebbles');\n     * // => '<p>fred, barney, &amp; pebbles</p>'\n     */\n    function wrap(value, wrapper) {\n      return partial(castFunction(wrapper), value);\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Casts `value` as an array if it's not one.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.4.0\n     * @category Lang\n     * @param {*} value The value to inspect.\n     * @returns {Array} Returns the cast array.\n     * @example\n     *\n     * _.castArray(1);\n     * // => [1]\n     *\n     * _.castArray({ 'a': 1 });\n     * // => [{ 'a': 1 }]\n     *\n     * _.castArray('abc');\n     * // => ['abc']\n     *\n     * _.castArray(null);\n     * // => [null]\n     *\n     * _.castArray(undefined);\n     * // => [undefined]\n     *\n     * _.castArray();\n     * // => []\n     *\n     * var array = [1, 2, 3];\n     * console.log(_.castArray(array) === array);\n     * // => true\n     */\n    function castArray() {\n      if (!arguments.length) {\n        return [];\n      }\n      var value = arguments[0];\n      return isArray(value) ? value : [value];\n    }\n\n    /**\n     * Creates a shallow clone of `value`.\n     *\n     * **Note:** This method is loosely based on the\n     * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm)\n     * and supports cloning arrays, array buffers, booleans, date objects, maps,\n     * numbers, `Object` objects, regexes, sets, strings, symbols, and typed\n     * arrays. The own enumerable properties of `arguments` objects are cloned\n     * as plain objects. An empty object is returned for uncloneable values such\n     * as error objects, functions, DOM nodes, and WeakMaps.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to clone.\n     * @returns {*} Returns the cloned value.\n     * @see _.cloneDeep\n     * @example\n     *\n     * var objects = [{ 'a': 1 }, { 'b': 2 }];\n     *\n     * var shallow = _.clone(objects);\n     * console.log(shallow[0] === objects[0]);\n     * // => true\n     */\n    function clone(value) {\n      return baseClone(value, CLONE_SYMBOLS_FLAG);\n    }\n\n    /**\n     * This method is like `_.clone` except that it accepts `customizer` which\n     * is invoked to produce the cloned value. If `customizer` returns `undefined`,\n     * cloning is handled by the method instead. The `customizer` is invoked with\n     * up to four arguments; (value [, index|key, object, stack]).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to clone.\n     * @param {Function} [customizer] The function to customize cloning.\n     * @returns {*} Returns the cloned value.\n     * @see _.cloneDeepWith\n     * @example\n     *\n     * function customizer(value) {\n     *   if (_.isElement(value)) {\n     *     return value.cloneNode(false);\n     *   }\n     * }\n     *\n     * var el = _.cloneWith(document.body, customizer);\n     *\n     * console.log(el === document.body);\n     * // => false\n     * console.log(el.nodeName);\n     * // => 'BODY'\n     * console.log(el.childNodes.length);\n     * // => 0\n     */\n    function cloneWith(value, customizer) {\n      customizer = typeof customizer == 'function' ? customizer : undefined;\n      return baseClone(value, CLONE_SYMBOLS_FLAG, customizer);\n    }\n\n    /**\n     * This method is like `_.clone` except that it recursively clones `value`.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.0.0\n     * @category Lang\n     * @param {*} value The value to recursively clone.\n     * @returns {*} Returns the deep cloned value.\n     * @see _.clone\n     * @example\n     *\n     * var objects = [{ 'a': 1 }, { 'b': 2 }];\n     *\n     * var deep = _.cloneDeep(objects);\n     * console.log(deep[0] === objects[0]);\n     * // => false\n     */\n    function cloneDeep(value) {\n      return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG);\n    }\n\n    /**\n     * This method is like `_.cloneWith` except that it recursively clones `value`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to recursively clone.\n     * @param {Function} [customizer] The function to customize cloning.\n     * @returns {*} Returns the deep cloned value.\n     * @see _.cloneWith\n     * @example\n     *\n     * function customizer(value) {\n     *   if (_.isElement(value)) {\n     *     return value.cloneNode(true);\n     *   }\n     * }\n     *\n     * var el = _.cloneDeepWith(document.body, customizer);\n     *\n     * console.log(el === document.body);\n     * // => false\n     * console.log(el.nodeName);\n     * // => 'BODY'\n     * console.log(el.childNodes.length);\n     * // => 20\n     */\n    function cloneDeepWith(value, customizer) {\n      customizer = typeof customizer == 'function' ? customizer : undefined;\n      return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG, customizer);\n    }\n\n    /**\n     * Checks if `object` conforms to `source` by invoking the predicate\n     * properties of `source` with the corresponding property values of `object`.\n     *\n     * **Note:** This method is equivalent to `_.conforms` when `source` is\n     * partially applied.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.14.0\n     * @category Lang\n     * @param {Object} object The object to inspect.\n     * @param {Object} source The object of property predicates to conform to.\n     * @returns {boolean} Returns `true` if `object` conforms, else `false`.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': 2 };\n     *\n     * _.conformsTo(object, { 'b': function(n) { return n > 1; } });\n     * // => true\n     *\n     * _.conformsTo(object, { 'b': function(n) { return n > 2; } });\n     * // => false\n     */\n    function conformsTo(object, source) {\n      return source == null || baseConformsTo(object, source, keys(source));\n    }\n\n    /**\n     * Performs a\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * comparison between two values to determine if they are equivalent.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n     * @example\n     *\n     * var object = { 'a': 1 };\n     * var other = { 'a': 1 };\n     *\n     * _.eq(object, object);\n     * // => true\n     *\n     * _.eq(object, other);\n     * // => false\n     *\n     * _.eq('a', 'a');\n     * // => true\n     *\n     * _.eq('a', Object('a'));\n     * // => false\n     *\n     * _.eq(NaN, NaN);\n     * // => true\n     */\n    function eq(value, other) {\n      return value === other || (value !== value && other !== other);\n    }\n\n    /**\n     * Checks if `value` is greater than `other`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.9.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if `value` is greater than `other`,\n     *  else `false`.\n     * @see _.lt\n     * @example\n     *\n     * _.gt(3, 1);\n     * // => true\n     *\n     * _.gt(3, 3);\n     * // => false\n     *\n     * _.gt(1, 3);\n     * // => false\n     */\n    var gt = createRelationalOperation(baseGt);\n\n    /**\n     * Checks if `value` is greater than or equal to `other`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.9.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if `value` is greater than or equal to\n     *  `other`, else `false`.\n     * @see _.lte\n     * @example\n     *\n     * _.gte(3, 1);\n     * // => true\n     *\n     * _.gte(3, 3);\n     * // => true\n     *\n     * _.gte(1, 3);\n     * // => false\n     */\n    var gte = createRelationalOperation(function(value, other) {\n      return value >= other;\n    });\n\n    /**\n     * Checks if `value` is likely an `arguments` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n     *  else `false`.\n     * @example\n     *\n     * _.isArguments(function() { return arguments; }());\n     * // => true\n     *\n     * _.isArguments([1, 2, 3]);\n     * // => false\n     */\n    var isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {\n      return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&\n        !propertyIsEnumerable.call(value, 'callee');\n    };\n\n    /**\n     * Checks if `value` is classified as an `Array` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n     * @example\n     *\n     * _.isArray([1, 2, 3]);\n     * // => true\n     *\n     * _.isArray(document.body.children);\n     * // => false\n     *\n     * _.isArray('abc');\n     * // => false\n     *\n     * _.isArray(_.noop);\n     * // => false\n     */\n    var isArray = Array.isArray;\n\n    /**\n     * Checks if `value` is classified as an `ArrayBuffer` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.3.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`.\n     * @example\n     *\n     * _.isArrayBuffer(new ArrayBuffer(2));\n     * // => true\n     *\n     * _.isArrayBuffer(new Array(2));\n     * // => false\n     */\n    var isArrayBuffer = nodeIsArrayBuffer ? baseUnary(nodeIsArrayBuffer) : baseIsArrayBuffer;\n\n    /**\n     * Checks if `value` is array-like. A value is considered array-like if it's\n     * not a function and has a `value.length` that's an integer greater than or\n     * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n     * @example\n     *\n     * _.isArrayLike([1, 2, 3]);\n     * // => true\n     *\n     * _.isArrayLike(document.body.children);\n     * // => true\n     *\n     * _.isArrayLike('abc');\n     * // => true\n     *\n     * _.isArrayLike(_.noop);\n     * // => false\n     */\n    function isArrayLike(value) {\n      return value != null && isLength(value.length) && !isFunction(value);\n    }\n\n    /**\n     * This method is like `_.isArrayLike` except that it also checks if `value`\n     * is an object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an array-like object,\n     *  else `false`.\n     * @example\n     *\n     * _.isArrayLikeObject([1, 2, 3]);\n     * // => true\n     *\n     * _.isArrayLikeObject(document.body.children);\n     * // => true\n     *\n     * _.isArrayLikeObject('abc');\n     * // => false\n     *\n     * _.isArrayLikeObject(_.noop);\n     * // => false\n     */\n    function isArrayLikeObject(value) {\n      return isObjectLike(value) && isArrayLike(value);\n    }\n\n    /**\n     * Checks if `value` is classified as a boolean primitive or object.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a boolean, else `false`.\n     * @example\n     *\n     * _.isBoolean(false);\n     * // => true\n     *\n     * _.isBoolean(null);\n     * // => false\n     */\n    function isBoolean(value) {\n      return value === true || value === false ||\n        (isObjectLike(value) && baseGetTag(value) == boolTag);\n    }\n\n    /**\n     * Checks if `value` is a buffer.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.3.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.\n     * @example\n     *\n     * _.isBuffer(new Buffer(2));\n     * // => true\n     *\n     * _.isBuffer(new Uint8Array(2));\n     * // => false\n     */\n    var isBuffer = nativeIsBuffer || stubFalse;\n\n    /**\n     * Checks if `value` is classified as a `Date` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a date object, else `false`.\n     * @example\n     *\n     * _.isDate(new Date);\n     * // => true\n     *\n     * _.isDate('Mon April 23 2012');\n     * // => false\n     */\n    var isDate = nodeIsDate ? baseUnary(nodeIsDate) : baseIsDate;\n\n    /**\n     * Checks if `value` is likely a DOM element.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a DOM element, else `false`.\n     * @example\n     *\n     * _.isElement(document.body);\n     * // => true\n     *\n     * _.isElement('<body>');\n     * // => false\n     */\n    function isElement(value) {\n      return isObjectLike(value) && value.nodeType === 1 && !isPlainObject(value);\n    }\n\n    /**\n     * Checks if `value` is an empty object, collection, map, or set.\n     *\n     * Objects are considered empty if they have no own enumerable string keyed\n     * properties.\n     *\n     * Array-like values such as `arguments` objects, arrays, buffers, strings, or\n     * jQuery-like collections are considered empty if they have a `length` of `0`.\n     * Similarly, maps and sets are considered empty if they have a `size` of `0`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is empty, else `false`.\n     * @example\n     *\n     * _.isEmpty(null);\n     * // => true\n     *\n     * _.isEmpty(true);\n     * // => true\n     *\n     * _.isEmpty(1);\n     * // => true\n     *\n     * _.isEmpty([1, 2, 3]);\n     * // => false\n     *\n     * _.isEmpty({ 'a': 1 });\n     * // => false\n     */\n    function isEmpty(value) {\n      if (value == null) {\n        return true;\n      }\n      if (isArrayLike(value) &&\n          (isArray(value) || typeof value == 'string' || typeof value.splice == 'function' ||\n            isBuffer(value) || isTypedArray(value) || isArguments(value))) {\n        return !value.length;\n      }\n      var tag = getTag(value);\n      if (tag == mapTag || tag == setTag) {\n        return !value.size;\n      }\n      if (isPrototype(value)) {\n        return !baseKeys(value).length;\n      }\n      for (var key in value) {\n        if (hasOwnProperty.call(value, key)) {\n          return false;\n        }\n      }\n      return true;\n    }\n\n    /**\n     * Performs a deep comparison between two values to determine if they are\n     * equivalent.\n     *\n     * **Note:** This method supports comparing arrays, array buffers, booleans,\n     * date objects, error objects, maps, numbers, `Object` objects, regexes,\n     * sets, strings, symbols, and typed arrays. `Object` objects are compared\n     * by their own, not inherited, enumerable properties. Functions and DOM\n     * nodes are compared by strict equality, i.e. `===`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n     * @example\n     *\n     * var object = { 'a': 1 };\n     * var other = { 'a': 1 };\n     *\n     * _.isEqual(object, other);\n     * // => true\n     *\n     * object === other;\n     * // => false\n     */\n    function isEqual(value, other) {\n      return baseIsEqual(value, other);\n    }\n\n    /**\n     * This method is like `_.isEqual` except that it accepts `customizer` which\n     * is invoked to compare values. If `customizer` returns `undefined`, comparisons\n     * are handled by the method instead. The `customizer` is invoked with up to\n     * six arguments: (objValue, othValue [, index|key, object, other, stack]).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @param {Function} [customizer] The function to customize comparisons.\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n     * @example\n     *\n     * function isGreeting(value) {\n     *   return /^h(?:i|ello)$/.test(value);\n     * }\n     *\n     * function customizer(objValue, othValue) {\n     *   if (isGreeting(objValue) && isGreeting(othValue)) {\n     *     return true;\n     *   }\n     * }\n     *\n     * var array = ['hello', 'goodbye'];\n     * var other = ['hi', 'goodbye'];\n     *\n     * _.isEqualWith(array, other, customizer);\n     * // => true\n     */\n    function isEqualWith(value, other, customizer) {\n      customizer = typeof customizer == 'function' ? customizer : undefined;\n      var result = customizer ? customizer(value, other) : undefined;\n      return result === undefined ? baseIsEqual(value, other, undefined, customizer) : !!result;\n    }\n\n    /**\n     * Checks if `value` is an `Error`, `EvalError`, `RangeError`, `ReferenceError`,\n     * `SyntaxError`, `TypeError`, or `URIError` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an error object, else `false`.\n     * @example\n     *\n     * _.isError(new Error);\n     * // => true\n     *\n     * _.isError(Error);\n     * // => false\n     */\n    function isError(value) {\n      if (!isObjectLike(value)) {\n        return false;\n      }\n      var tag = baseGetTag(value);\n      return tag == errorTag || tag == domExcTag ||\n        (typeof value.message == 'string' && typeof value.name == 'string' && !isPlainObject(value));\n    }\n\n    /**\n     * Checks if `value` is a finite primitive number.\n     *\n     * **Note:** This method is based on\n     * [`Number.isFinite`](https://mdn.io/Number/isFinite).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a finite number, else `false`.\n     * @example\n     *\n     * _.isFinite(3);\n     * // => true\n     *\n     * _.isFinite(Number.MIN_VALUE);\n     * // => true\n     *\n     * _.isFinite(Infinity);\n     * // => false\n     *\n     * _.isFinite('3');\n     * // => false\n     */\n    function isFinite(value) {\n      return typeof value == 'number' && nativeIsFinite(value);\n    }\n\n    /**\n     * Checks if `value` is classified as a `Function` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n     * @example\n     *\n     * _.isFunction(_);\n     * // => true\n     *\n     * _.isFunction(/abc/);\n     * // => false\n     */\n    function isFunction(value) {\n      if (!isObject(value)) {\n        return false;\n      }\n      // The use of `Object#toString` avoids issues with the `typeof` operator\n      // in Safari 9 which returns 'object' for typed arrays and other constructors.\n      var tag = baseGetTag(value);\n      return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n    }\n\n    /**\n     * Checks if `value` is an integer.\n     *\n     * **Note:** This method is based on\n     * [`Number.isInteger`](https://mdn.io/Number/isInteger).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an integer, else `false`.\n     * @example\n     *\n     * _.isInteger(3);\n     * // => true\n     *\n     * _.isInteger(Number.MIN_VALUE);\n     * // => false\n     *\n     * _.isInteger(Infinity);\n     * // => false\n     *\n     * _.isInteger('3');\n     * // => false\n     */\n    function isInteger(value) {\n      return typeof value == 'number' && value == toInteger(value);\n    }\n\n    /**\n     * Checks if `value` is a valid array-like length.\n     *\n     * **Note:** This method is loosely based on\n     * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n     * @example\n     *\n     * _.isLength(3);\n     * // => true\n     *\n     * _.isLength(Number.MIN_VALUE);\n     * // => false\n     *\n     * _.isLength(Infinity);\n     * // => false\n     *\n     * _.isLength('3');\n     * // => false\n     */\n    function isLength(value) {\n      return typeof value == 'number' &&\n        value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n    }\n\n    /**\n     * Checks if `value` is the\n     * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n     * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n     * @example\n     *\n     * _.isObject({});\n     * // => true\n     *\n     * _.isObject([1, 2, 3]);\n     * // => true\n     *\n     * _.isObject(_.noop);\n     * // => true\n     *\n     * _.isObject(null);\n     * // => false\n     */\n    function isObject(value) {\n      var type = typeof value;\n      return value != null && (type == 'object' || type == 'function');\n    }\n\n    /**\n     * Checks if `value` is object-like. A value is object-like if it's not `null`\n     * and has a `typeof` result of \"object\".\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n     * @example\n     *\n     * _.isObjectLike({});\n     * // => true\n     *\n     * _.isObjectLike([1, 2, 3]);\n     * // => true\n     *\n     * _.isObjectLike(_.noop);\n     * // => false\n     *\n     * _.isObjectLike(null);\n     * // => false\n     */\n    function isObjectLike(value) {\n      return value != null && typeof value == 'object';\n    }\n\n    /**\n     * Checks if `value` is classified as a `Map` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.3.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n     * @example\n     *\n     * _.isMap(new Map);\n     * // => true\n     *\n     * _.isMap(new WeakMap);\n     * // => false\n     */\n    var isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap;\n\n    /**\n     * Performs a partial deep comparison between `object` and `source` to\n     * determine if `object` contains equivalent property values.\n     *\n     * **Note:** This method is equivalent to `_.matches` when `source` is\n     * partially applied.\n     *\n     * Partial comparisons will match empty array and empty object `source`\n     * values against any array or object value, respectively. See `_.isEqual`\n     * for a list of supported value comparisons.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Lang\n     * @param {Object} object The object to inspect.\n     * @param {Object} source The object of property values to match.\n     * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': 2 };\n     *\n     * _.isMatch(object, { 'b': 2 });\n     * // => true\n     *\n     * _.isMatch(object, { 'b': 1 });\n     * // => false\n     */\n    function isMatch(object, source) {\n      return object === source || baseIsMatch(object, source, getMatchData(source));\n    }\n\n    /**\n     * This method is like `_.isMatch` except that it accepts `customizer` which\n     * is invoked to compare values. If `customizer` returns `undefined`, comparisons\n     * are handled by the method instead. The `customizer` is invoked with five\n     * arguments: (objValue, srcValue, index|key, object, source).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {Object} object The object to inspect.\n     * @param {Object} source The object of property values to match.\n     * @param {Function} [customizer] The function to customize comparisons.\n     * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n     * @example\n     *\n     * function isGreeting(value) {\n     *   return /^h(?:i|ello)$/.test(value);\n     * }\n     *\n     * function customizer(objValue, srcValue) {\n     *   if (isGreeting(objValue) && isGreeting(srcValue)) {\n     *     return true;\n     *   }\n     * }\n     *\n     * var object = { 'greeting': 'hello' };\n     * var source = { 'greeting': 'hi' };\n     *\n     * _.isMatchWith(object, source, customizer);\n     * // => true\n     */\n    function isMatchWith(object, source, customizer) {\n      customizer = typeof customizer == 'function' ? customizer : undefined;\n      return baseIsMatch(object, source, getMatchData(source), customizer);\n    }\n\n    /**\n     * Checks if `value` is `NaN`.\n     *\n     * **Note:** This method is based on\n     * [`Number.isNaN`](https://mdn.io/Number/isNaN) and is not the same as\n     * global [`isNaN`](https://mdn.io/isNaN) which returns `true` for\n     * `undefined` and other non-number values.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\n     * @example\n     *\n     * _.isNaN(NaN);\n     * // => true\n     *\n     * _.isNaN(new Number(NaN));\n     * // => true\n     *\n     * isNaN(undefined);\n     * // => true\n     *\n     * _.isNaN(undefined);\n     * // => false\n     */\n    function isNaN(value) {\n      // An `NaN` primitive is the only value that is not equal to itself.\n      // Perform the `toStringTag` check first to avoid errors with some\n      // ActiveX objects in IE.\n      return isNumber(value) && value != +value;\n    }\n\n    /**\n     * Checks if `value` is a pristine native function.\n     *\n     * **Note:** This method can't reliably detect native functions in the presence\n     * of the core-js package because core-js circumvents this kind of detection.\n     * Despite multiple requests, the core-js maintainer has made it clear: any\n     * attempt to fix the detection will be obstructed. As a result, we're left\n     * with little choice but to throw an error. Unfortunately, this also affects\n     * packages, like [babel-polyfill](https://www.npmjs.com/package/babel-polyfill),\n     * which rely on core-js.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a native function,\n     *  else `false`.\n     * @example\n     *\n     * _.isNative(Array.prototype.push);\n     * // => true\n     *\n     * _.isNative(_);\n     * // => false\n     */\n    function isNative(value) {\n      if (isMaskable(value)) {\n        throw new Error(CORE_ERROR_TEXT);\n      }\n      return baseIsNative(value);\n    }\n\n    /**\n     * Checks if `value` is `null`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is `null`, else `false`.\n     * @example\n     *\n     * _.isNull(null);\n     * // => true\n     *\n     * _.isNull(void 0);\n     * // => false\n     */\n    function isNull(value) {\n      return value === null;\n    }\n\n    /**\n     * Checks if `value` is `null` or `undefined`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is nullish, else `false`.\n     * @example\n     *\n     * _.isNil(null);\n     * // => true\n     *\n     * _.isNil(void 0);\n     * // => true\n     *\n     * _.isNil(NaN);\n     * // => false\n     */\n    function isNil(value) {\n      return value == null;\n    }\n\n    /**\n     * Checks if `value` is classified as a `Number` primitive or object.\n     *\n     * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are\n     * classified as numbers, use the `_.isFinite` method.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a number, else `false`.\n     * @example\n     *\n     * _.isNumber(3);\n     * // => true\n     *\n     * _.isNumber(Number.MIN_VALUE);\n     * // => true\n     *\n     * _.isNumber(Infinity);\n     * // => true\n     *\n     * _.isNumber('3');\n     * // => false\n     */\n    function isNumber(value) {\n      return typeof value == 'number' ||\n        (isObjectLike(value) && baseGetTag(value) == numberTag);\n    }\n\n    /**\n     * Checks if `value` is a plain object, that is, an object created by the\n     * `Object` constructor or one with a `[[Prototype]]` of `null`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.8.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     * }\n     *\n     * _.isPlainObject(new Foo);\n     * // => false\n     *\n     * _.isPlainObject([1, 2, 3]);\n     * // => false\n     *\n     * _.isPlainObject({ 'x': 0, 'y': 0 });\n     * // => true\n     *\n     * _.isPlainObject(Object.create(null));\n     * // => true\n     */\n    function isPlainObject(value) {\n      if (!isObjectLike(value) || baseGetTag(value) != objectTag) {\n        return false;\n      }\n      var proto = getPrototype(value);\n      if (proto === null) {\n        return true;\n      }\n      var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;\n      return typeof Ctor == 'function' && Ctor instanceof Ctor &&\n        funcToString.call(Ctor) == objectCtorString;\n    }\n\n    /**\n     * Checks if `value` is classified as a `RegExp` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.\n     * @example\n     *\n     * _.isRegExp(/abc/);\n     * // => true\n     *\n     * _.isRegExp('/abc/');\n     * // => false\n     */\n    var isRegExp = nodeIsRegExp ? baseUnary(nodeIsRegExp) : baseIsRegExp;\n\n    /**\n     * Checks if `value` is a safe integer. An integer is safe if it's an IEEE-754\n     * double precision number which isn't the result of a rounded unsafe integer.\n     *\n     * **Note:** This method is based on\n     * [`Number.isSafeInteger`](https://mdn.io/Number/isSafeInteger).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a safe integer, else `false`.\n     * @example\n     *\n     * _.isSafeInteger(3);\n     * // => true\n     *\n     * _.isSafeInteger(Number.MIN_VALUE);\n     * // => false\n     *\n     * _.isSafeInteger(Infinity);\n     * // => false\n     *\n     * _.isSafeInteger('3');\n     * // => false\n     */\n    function isSafeInteger(value) {\n      return isInteger(value) && value >= -MAX_SAFE_INTEGER && value <= MAX_SAFE_INTEGER;\n    }\n\n    /**\n     * Checks if `value` is classified as a `Set` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.3.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n     * @example\n     *\n     * _.isSet(new Set);\n     * // => true\n     *\n     * _.isSet(new WeakSet);\n     * // => false\n     */\n    var isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet;\n\n    /**\n     * Checks if `value` is classified as a `String` primitive or object.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a string, else `false`.\n     * @example\n     *\n     * _.isString('abc');\n     * // => true\n     *\n     * _.isString(1);\n     * // => false\n     */\n    function isString(value) {\n      return typeof value == 'string' ||\n        (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag);\n    }\n\n    /**\n     * Checks if `value` is classified as a `Symbol` primitive or object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n     * @example\n     *\n     * _.isSymbol(Symbol.iterator);\n     * // => true\n     *\n     * _.isSymbol('abc');\n     * // => false\n     */\n    function isSymbol(value) {\n      return typeof value == 'symbol' ||\n        (isObjectLike(value) && baseGetTag(value) == symbolTag);\n    }\n\n    /**\n     * Checks if `value` is classified as a typed array.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n     * @example\n     *\n     * _.isTypedArray(new Uint8Array);\n     * // => true\n     *\n     * _.isTypedArray([]);\n     * // => false\n     */\n    var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\n\n    /**\n     * Checks if `value` is `undefined`.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`.\n     * @example\n     *\n     * _.isUndefined(void 0);\n     * // => true\n     *\n     * _.isUndefined(null);\n     * // => false\n     */\n    function isUndefined(value) {\n      return value === undefined;\n    }\n\n    /**\n     * Checks if `value` is classified as a `WeakMap` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.3.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a weak map, else `false`.\n     * @example\n     *\n     * _.isWeakMap(new WeakMap);\n     * // => true\n     *\n     * _.isWeakMap(new Map);\n     * // => false\n     */\n    function isWeakMap(value) {\n      return isObjectLike(value) && getTag(value) == weakMapTag;\n    }\n\n    /**\n     * Checks if `value` is classified as a `WeakSet` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.3.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a weak set, else `false`.\n     * @example\n     *\n     * _.isWeakSet(new WeakSet);\n     * // => true\n     *\n     * _.isWeakSet(new Set);\n     * // => false\n     */\n    function isWeakSet(value) {\n      return isObjectLike(value) && baseGetTag(value) == weakSetTag;\n    }\n\n    /**\n     * Checks if `value` is less than `other`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.9.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if `value` is less than `other`,\n     *  else `false`.\n     * @see _.gt\n     * @example\n     *\n     * _.lt(1, 3);\n     * // => true\n     *\n     * _.lt(3, 3);\n     * // => false\n     *\n     * _.lt(3, 1);\n     * // => false\n     */\n    var lt = createRelationalOperation(baseLt);\n\n    /**\n     * Checks if `value` is less than or equal to `other`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.9.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if `value` is less than or equal to\n     *  `other`, else `false`.\n     * @see _.gte\n     * @example\n     *\n     * _.lte(1, 3);\n     * // => true\n     *\n     * _.lte(3, 3);\n     * // => true\n     *\n     * _.lte(3, 1);\n     * // => false\n     */\n    var lte = createRelationalOperation(function(value, other) {\n      return value <= other;\n    });\n\n    /**\n     * Converts `value` to an array.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {Array} Returns the converted array.\n     * @example\n     *\n     * _.toArray({ 'a': 1, 'b': 2 });\n     * // => [1, 2]\n     *\n     * _.toArray('abc');\n     * // => ['a', 'b', 'c']\n     *\n     * _.toArray(1);\n     * // => []\n     *\n     * _.toArray(null);\n     * // => []\n     */\n    function toArray(value) {\n      if (!value) {\n        return [];\n      }\n      if (isArrayLike(value)) {\n        return isString(value) ? stringToArray(value) : copyArray(value);\n      }\n      if (symIterator && value[symIterator]) {\n        return iteratorToArray(value[symIterator]());\n      }\n      var tag = getTag(value),\n          func = tag == mapTag ? mapToArray : (tag == setTag ? setToArray : values);\n\n      return func(value);\n    }\n\n    /**\n     * Converts `value` to a finite number.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.12.0\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {number} Returns the converted number.\n     * @example\n     *\n     * _.toFinite(3.2);\n     * // => 3.2\n     *\n     * _.toFinite(Number.MIN_VALUE);\n     * // => 5e-324\n     *\n     * _.toFinite(Infinity);\n     * // => 1.7976931348623157e+308\n     *\n     * _.toFinite('3.2');\n     * // => 3.2\n     */\n    function toFinite(value) {\n      if (!value) {\n        return value === 0 ? value : 0;\n      }\n      value = toNumber(value);\n      if (value === INFINITY || value === -INFINITY) {\n        var sign = (value < 0 ? -1 : 1);\n        return sign * MAX_INTEGER;\n      }\n      return value === value ? value : 0;\n    }\n\n    /**\n     * Converts `value` to an integer.\n     *\n     * **Note:** This method is loosely based on\n     * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {number} Returns the converted integer.\n     * @example\n     *\n     * _.toInteger(3.2);\n     * // => 3\n     *\n     * _.toInteger(Number.MIN_VALUE);\n     * // => 0\n     *\n     * _.toInteger(Infinity);\n     * // => 1.7976931348623157e+308\n     *\n     * _.toInteger('3.2');\n     * // => 3\n     */\n    function toInteger(value) {\n      var result = toFinite(value),\n          remainder = result % 1;\n\n      return result === result ? (remainder ? result - remainder : result) : 0;\n    }\n\n    /**\n     * Converts `value` to an integer suitable for use as the length of an\n     * array-like object.\n     *\n     * **Note:** This method is based on\n     * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {number} Returns the converted integer.\n     * @example\n     *\n     * _.toLength(3.2);\n     * // => 3\n     *\n     * _.toLength(Number.MIN_VALUE);\n     * // => 0\n     *\n     * _.toLength(Infinity);\n     * // => 4294967295\n     *\n     * _.toLength('3.2');\n     * // => 3\n     */\n    function toLength(value) {\n      return value ? baseClamp(toInteger(value), 0, MAX_ARRAY_LENGTH) : 0;\n    }\n\n    /**\n     * Converts `value` to a number.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to process.\n     * @returns {number} Returns the number.\n     * @example\n     *\n     * _.toNumber(3.2);\n     * // => 3.2\n     *\n     * _.toNumber(Number.MIN_VALUE);\n     * // => 5e-324\n     *\n     * _.toNumber(Infinity);\n     * // => Infinity\n     *\n     * _.toNumber('3.2');\n     * // => 3.2\n     */\n    function toNumber(value) {\n      if (typeof value == 'number') {\n        return value;\n      }\n      if (isSymbol(value)) {\n        return NAN;\n      }\n      if (isObject(value)) {\n        var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n        value = isObject(other) ? (other + '') : other;\n      }\n      if (typeof value != 'string') {\n        return value === 0 ? value : +value;\n      }\n      value = baseTrim(value);\n      var isBinary = reIsBinary.test(value);\n      return (isBinary || reIsOctal.test(value))\n        ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n        : (reIsBadHex.test(value) ? NAN : +value);\n    }\n\n    /**\n     * Converts `value` to a plain object flattening inherited enumerable string\n     * keyed properties of `value` to own properties of the plain object.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {Object} Returns the converted plain object.\n     * @example\n     *\n     * function Foo() {\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.assign({ 'a': 1 }, new Foo);\n     * // => { 'a': 1, 'b': 2 }\n     *\n     * _.assign({ 'a': 1 }, _.toPlainObject(new Foo));\n     * // => { 'a': 1, 'b': 2, 'c': 3 }\n     */\n    function toPlainObject(value) {\n      return copyObject(value, keysIn(value));\n    }\n\n    /**\n     * Converts `value` to a safe integer. A safe integer can be compared and\n     * represented correctly.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {number} Returns the converted integer.\n     * @example\n     *\n     * _.toSafeInteger(3.2);\n     * // => 3\n     *\n     * _.toSafeInteger(Number.MIN_VALUE);\n     * // => 0\n     *\n     * _.toSafeInteger(Infinity);\n     * // => 9007199254740991\n     *\n     * _.toSafeInteger('3.2');\n     * // => 3\n     */\n    function toSafeInteger(value) {\n      return value\n        ? baseClamp(toInteger(value), -MAX_SAFE_INTEGER, MAX_SAFE_INTEGER)\n        : (value === 0 ? value : 0);\n    }\n\n    /**\n     * Converts `value` to a string. An empty string is returned for `null`\n     * and `undefined` values. The sign of `-0` is preserved.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {string} Returns the converted string.\n     * @example\n     *\n     * _.toString(null);\n     * // => ''\n     *\n     * _.toString(-0);\n     * // => '-0'\n     *\n     * _.toString([1, 2, 3]);\n     * // => '1,2,3'\n     */\n    function toString(value) {\n      return value == null ? '' : baseToString(value);\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Assigns own enumerable string keyed properties of source objects to the\n     * destination object. Source objects are applied from left to right.\n     * Subsequent sources overwrite property assignments of previous sources.\n     *\n     * **Note:** This method mutates `object` and is loosely based on\n     * [`Object.assign`](https://mdn.io/Object/assign).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.10.0\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} [sources] The source objects.\n     * @returns {Object} Returns `object`.\n     * @see _.assignIn\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     * }\n     *\n     * function Bar() {\n     *   this.c = 3;\n     * }\n     *\n     * Foo.prototype.b = 2;\n     * Bar.prototype.d = 4;\n     *\n     * _.assign({ 'a': 0 }, new Foo, new Bar);\n     * // => { 'a': 1, 'c': 3 }\n     */\n    var assign = createAssigner(function(object, source) {\n      if (isPrototype(source) || isArrayLike(source)) {\n        copyObject(source, keys(source), object);\n        return;\n      }\n      for (var key in source) {\n        if (hasOwnProperty.call(source, key)) {\n          assignValue(object, key, source[key]);\n        }\n      }\n    });\n\n    /**\n     * This method is like `_.assign` except that it iterates over own and\n     * inherited source properties.\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @alias extend\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} [sources] The source objects.\n     * @returns {Object} Returns `object`.\n     * @see _.assign\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     * }\n     *\n     * function Bar() {\n     *   this.c = 3;\n     * }\n     *\n     * Foo.prototype.b = 2;\n     * Bar.prototype.d = 4;\n     *\n     * _.assignIn({ 'a': 0 }, new Foo, new Bar);\n     * // => { 'a': 1, 'b': 2, 'c': 3, 'd': 4 }\n     */\n    var assignIn = createAssigner(function(object, source) {\n      copyObject(source, keysIn(source), object);\n    });\n\n    /**\n     * This method is like `_.assignIn` except that it accepts `customizer`\n     * which is invoked to produce the assigned values. If `customizer` returns\n     * `undefined`, assignment is handled by the method instead. The `customizer`\n     * is invoked with five arguments: (objValue, srcValue, key, object, source).\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @alias extendWith\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} sources The source objects.\n     * @param {Function} [customizer] The function to customize assigned values.\n     * @returns {Object} Returns `object`.\n     * @see _.assignWith\n     * @example\n     *\n     * function customizer(objValue, srcValue) {\n     *   return _.isUndefined(objValue) ? srcValue : objValue;\n     * }\n     *\n     * var defaults = _.partialRight(_.assignInWith, customizer);\n     *\n     * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n     * // => { 'a': 1, 'b': 2 }\n     */\n    var assignInWith = createAssigner(function(object, source, srcIndex, customizer) {\n      copyObject(source, keysIn(source), object, customizer);\n    });\n\n    /**\n     * This method is like `_.assign` except that it accepts `customizer`\n     * which is invoked to produce the assigned values. If `customizer` returns\n     * `undefined`, assignment is handled by the method instead. The `customizer`\n     * is invoked with five arguments: (objValue, srcValue, key, object, source).\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} sources The source objects.\n     * @param {Function} [customizer] The function to customize assigned values.\n     * @returns {Object} Returns `object`.\n     * @see _.assignInWith\n     * @example\n     *\n     * function customizer(objValue, srcValue) {\n     *   return _.isUndefined(objValue) ? srcValue : objValue;\n     * }\n     *\n     * var defaults = _.partialRight(_.assignWith, customizer);\n     *\n     * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n     * // => { 'a': 1, 'b': 2 }\n     */\n    var assignWith = createAssigner(function(object, source, srcIndex, customizer) {\n      copyObject(source, keys(source), object, customizer);\n    });\n\n    /**\n     * Creates an array of values corresponding to `paths` of `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.0.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {...(string|string[])} [paths] The property paths to pick.\n     * @returns {Array} Returns the picked values.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] };\n     *\n     * _.at(object, ['a[0].b.c', 'a[1]']);\n     * // => [3, 4]\n     */\n    var at = flatRest(baseAt);\n\n    /**\n     * Creates an object that inherits from the `prototype` object. If a\n     * `properties` object is given, its own enumerable string keyed properties\n     * are assigned to the created object.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.3.0\n     * @category Object\n     * @param {Object} prototype The object to inherit from.\n     * @param {Object} [properties] The properties to assign to the object.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * function Shape() {\n     *   this.x = 0;\n     *   this.y = 0;\n     * }\n     *\n     * function Circle() {\n     *   Shape.call(this);\n     * }\n     *\n     * Circle.prototype = _.create(Shape.prototype, {\n     *   'constructor': Circle\n     * });\n     *\n     * var circle = new Circle;\n     * circle instanceof Circle;\n     * // => true\n     *\n     * circle instanceof Shape;\n     * // => true\n     */\n    function create(prototype, properties) {\n      var result = baseCreate(prototype);\n      return properties == null ? result : baseAssign(result, properties);\n    }\n\n    /**\n     * Assigns own and inherited enumerable string keyed properties of source\n     * objects to the destination object for all destination properties that\n     * resolve to `undefined`. Source objects are applied from left to right.\n     * Once a property is set, additional values of the same property are ignored.\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} [sources] The source objects.\n     * @returns {Object} Returns `object`.\n     * @see _.defaultsDeep\n     * @example\n     *\n     * _.defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n     * // => { 'a': 1, 'b': 2 }\n     */\n    var defaults = baseRest(function(object, sources) {\n      object = Object(object);\n\n      var index = -1;\n      var length = sources.length;\n      var guard = length > 2 ? sources[2] : undefined;\n\n      if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n        length = 1;\n      }\n\n      while (++index < length) {\n        var source = sources[index];\n        var props = keysIn(source);\n        var propsIndex = -1;\n        var propsLength = props.length;\n\n        while (++propsIndex < propsLength) {\n          var key = props[propsIndex];\n          var value = object[key];\n\n          if (value === undefined ||\n              (eq(value, objectProto[key]) && !hasOwnProperty.call(object, key))) {\n            object[key] = source[key];\n          }\n        }\n      }\n\n      return object;\n    });\n\n    /**\n     * This method is like `_.defaults` except that it recursively assigns\n     * default properties.\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.10.0\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} [sources] The source objects.\n     * @returns {Object} Returns `object`.\n     * @see _.defaults\n     * @example\n     *\n     * _.defaultsDeep({ 'a': { 'b': 2 } }, { 'a': { 'b': 1, 'c': 3 } });\n     * // => { 'a': { 'b': 2, 'c': 3 } }\n     */\n    var defaultsDeep = baseRest(function(args) {\n      args.push(undefined, customDefaultsMerge);\n      return apply(mergeWith, undefined, args);\n    });\n\n    /**\n     * This method is like `_.find` except that it returns the key of the first\n     * element `predicate` returns truthy for instead of the element itself.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.1.0\n     * @category Object\n     * @param {Object} object The object to inspect.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {string|undefined} Returns the key of the matched element,\n     *  else `undefined`.\n     * @example\n     *\n     * var users = {\n     *   'barney':  { 'age': 36, 'active': true },\n     *   'fred':    { 'age': 40, 'active': false },\n     *   'pebbles': { 'age': 1,  'active': true }\n     * };\n     *\n     * _.findKey(users, function(o) { return o.age < 40; });\n     * // => 'barney' (iteration order is not guaranteed)\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.findKey(users, { 'age': 1, 'active': true });\n     * // => 'pebbles'\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.findKey(users, ['active', false]);\n     * // => 'fred'\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.findKey(users, 'active');\n     * // => 'barney'\n     */\n    function findKey(object, predicate) {\n      return baseFindKey(object, getIteratee(predicate, 3), baseForOwn);\n    }\n\n    /**\n     * This method is like `_.findKey` except that it iterates over elements of\n     * a collection in the opposite order.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Object\n     * @param {Object} object The object to inspect.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {string|undefined} Returns the key of the matched element,\n     *  else `undefined`.\n     * @example\n     *\n     * var users = {\n     *   'barney':  { 'age': 36, 'active': true },\n     *   'fred':    { 'age': 40, 'active': false },\n     *   'pebbles': { 'age': 1,  'active': true }\n     * };\n     *\n     * _.findLastKey(users, function(o) { return o.age < 40; });\n     * // => returns 'pebbles' assuming `_.findKey` returns 'barney'\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.findLastKey(users, { 'age': 36, 'active': true });\n     * // => 'barney'\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.findLastKey(users, ['active', false]);\n     * // => 'fred'\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.findLastKey(users, 'active');\n     * // => 'pebbles'\n     */\n    function findLastKey(object, predicate) {\n      return baseFindKey(object, getIteratee(predicate, 3), baseForOwnRight);\n    }\n\n    /**\n     * Iterates over own and inherited enumerable string keyed properties of an\n     * object and invokes `iteratee` for each property. The iteratee is invoked\n     * with three arguments: (value, key, object). Iteratee functions may exit\n     * iteration early by explicitly returning `false`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.3.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     * @see _.forInRight\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.forIn(new Foo, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => Logs 'a', 'b', then 'c' (iteration order is not guaranteed).\n     */\n    function forIn(object, iteratee) {\n      return object == null\n        ? object\n        : baseFor(object, getIteratee(iteratee, 3), keysIn);\n    }\n\n    /**\n     * This method is like `_.forIn` except that it iterates over properties of\n     * `object` in the opposite order.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     * @see _.forIn\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.forInRight(new Foo, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => Logs 'c', 'b', then 'a' assuming `_.forIn` logs 'a', 'b', then 'c'.\n     */\n    function forInRight(object, iteratee) {\n      return object == null\n        ? object\n        : baseForRight(object, getIteratee(iteratee, 3), keysIn);\n    }\n\n    /**\n     * Iterates over own enumerable string keyed properties of an object and\n     * invokes `iteratee` for each property. The iteratee is invoked with three\n     * arguments: (value, key, object). Iteratee functions may exit iteration\n     * early by explicitly returning `false`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.3.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     * @see _.forOwnRight\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.forOwn(new Foo, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => Logs 'a' then 'b' (iteration order is not guaranteed).\n     */\n    function forOwn(object, iteratee) {\n      return object && baseForOwn(object, getIteratee(iteratee, 3));\n    }\n\n    /**\n     * This method is like `_.forOwn` except that it iterates over properties of\n     * `object` in the opposite order.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     * @see _.forOwn\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.forOwnRight(new Foo, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => Logs 'b' then 'a' assuming `_.forOwn` logs 'a' then 'b'.\n     */\n    function forOwnRight(object, iteratee) {\n      return object && baseForOwnRight(object, getIteratee(iteratee, 3));\n    }\n\n    /**\n     * Creates an array of function property names from own enumerable properties\n     * of `object`.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to inspect.\n     * @returns {Array} Returns the function names.\n     * @see _.functionsIn\n     * @example\n     *\n     * function Foo() {\n     *   this.a = _.constant('a');\n     *   this.b = _.constant('b');\n     * }\n     *\n     * Foo.prototype.c = _.constant('c');\n     *\n     * _.functions(new Foo);\n     * // => ['a', 'b']\n     */\n    function functions(object) {\n      return object == null ? [] : baseFunctions(object, keys(object));\n    }\n\n    /**\n     * Creates an array of function property names from own and inherited\n     * enumerable properties of `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The object to inspect.\n     * @returns {Array} Returns the function names.\n     * @see _.functions\n     * @example\n     *\n     * function Foo() {\n     *   this.a = _.constant('a');\n     *   this.b = _.constant('b');\n     * }\n     *\n     * Foo.prototype.c = _.constant('c');\n     *\n     * _.functionsIn(new Foo);\n     * // => ['a', 'b', 'c']\n     */\n    function functionsIn(object) {\n      return object == null ? [] : baseFunctions(object, keysIn(object));\n    }\n\n    /**\n     * Gets the value at `path` of `object`. If the resolved value is\n     * `undefined`, the `defaultValue` is returned in its place.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.7.0\n     * @category Object\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path of the property to get.\n     * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n     * @returns {*} Returns the resolved value.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n     *\n     * _.get(object, 'a[0].b.c');\n     * // => 3\n     *\n     * _.get(object, ['a', '0', 'b', 'c']);\n     * // => 3\n     *\n     * _.get(object, 'a.b.c', 'default');\n     * // => 'default'\n     */\n    function get(object, path, defaultValue) {\n      var result = object == null ? undefined : baseGet(object, path);\n      return result === undefined ? defaultValue : result;\n    }\n\n    /**\n     * Checks if `path` is a direct property of `object`.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path to check.\n     * @returns {boolean} Returns `true` if `path` exists, else `false`.\n     * @example\n     *\n     * var object = { 'a': { 'b': 2 } };\n     * var other = _.create({ 'a': _.create({ 'b': 2 }) });\n     *\n     * _.has(object, 'a');\n     * // => true\n     *\n     * _.has(object, 'a.b');\n     * // => true\n     *\n     * _.has(object, ['a', 'b']);\n     * // => true\n     *\n     * _.has(other, 'a');\n     * // => false\n     */\n    function has(object, path) {\n      return object != null && hasPath(object, path, baseHas);\n    }\n\n    /**\n     * Checks if `path` is a direct or inherited property of `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path to check.\n     * @returns {boolean} Returns `true` if `path` exists, else `false`.\n     * @example\n     *\n     * var object = _.create({ 'a': _.create({ 'b': 2 }) });\n     *\n     * _.hasIn(object, 'a');\n     * // => true\n     *\n     * _.hasIn(object, 'a.b');\n     * // => true\n     *\n     * _.hasIn(object, ['a', 'b']);\n     * // => true\n     *\n     * _.hasIn(object, 'b');\n     * // => false\n     */\n    function hasIn(object, path) {\n      return object != null && hasPath(object, path, baseHasIn);\n    }\n\n    /**\n     * Creates an object composed of the inverted keys and values of `object`.\n     * If `object` contains duplicate values, subsequent values overwrite\n     * property assignments of previous values.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.7.0\n     * @category Object\n     * @param {Object} object The object to invert.\n     * @returns {Object} Returns the new inverted object.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': 2, 'c': 1 };\n     *\n     * _.invert(object);\n     * // => { '1': 'c', '2': 'b' }\n     */\n    var invert = createInverter(function(result, value, key) {\n      if (value != null &&\n          typeof value.toString != 'function') {\n        value = nativeObjectToString.call(value);\n      }\n\n      result[value] = key;\n    }, constant(identity));\n\n    /**\n     * This method is like `_.invert` except that the inverted object is generated\n     * from the results of running each element of `object` thru `iteratee`. The\n     * corresponding inverted value of each inverted key is an array of keys\n     * responsible for generating the inverted value. The iteratee is invoked\n     * with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.1.0\n     * @category Object\n     * @param {Object} object The object to invert.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Object} Returns the new inverted object.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': 2, 'c': 1 };\n     *\n     * _.invertBy(object);\n     * // => { '1': ['a', 'c'], '2': ['b'] }\n     *\n     * _.invertBy(object, function(value) {\n     *   return 'group' + value;\n     * });\n     * // => { 'group1': ['a', 'c'], 'group2': ['b'] }\n     */\n    var invertBy = createInverter(function(result, value, key) {\n      if (value != null &&\n          typeof value.toString != 'function') {\n        value = nativeObjectToString.call(value);\n      }\n\n      if (hasOwnProperty.call(result, value)) {\n        result[value].push(key);\n      } else {\n        result[value] = [key];\n      }\n    }, getIteratee);\n\n    /**\n     * Invokes the method at `path` of `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path of the method to invoke.\n     * @param {...*} [args] The arguments to invoke the method with.\n     * @returns {*} Returns the result of the invoked method.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': [1, 2, 3, 4] } }] };\n     *\n     * _.invoke(object, 'a[0].b.c.slice', 1, 3);\n     * // => [2, 3]\n     */\n    var invoke = baseRest(baseInvoke);\n\n    /**\n     * Creates an array of the own enumerable property names of `object`.\n     *\n     * **Note:** Non-object values are coerced to objects. See the\n     * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n     * for more details.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.keys(new Foo);\n     * // => ['a', 'b'] (iteration order is not guaranteed)\n     *\n     * _.keys('hi');\n     * // => ['0', '1']\n     */\n    function keys(object) {\n      return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);\n    }\n\n    /**\n     * Creates an array of the own and inherited enumerable property names of `object`.\n     *\n     * **Note:** Non-object values are coerced to objects.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.keysIn(new Foo);\n     * // => ['a', 'b', 'c'] (iteration order is not guaranteed)\n     */\n    function keysIn(object) {\n      return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);\n    }\n\n    /**\n     * The opposite of `_.mapValues`; this method creates an object with the\n     * same values as `object` and keys generated by running each own enumerable\n     * string keyed property of `object` thru `iteratee`. The iteratee is invoked\n     * with three arguments: (value, key, object).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.8.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Object} Returns the new mapped object.\n     * @see _.mapValues\n     * @example\n     *\n     * _.mapKeys({ 'a': 1, 'b': 2 }, function(value, key) {\n     *   return key + value;\n     * });\n     * // => { 'a1': 1, 'b2': 2 }\n     */\n    function mapKeys(object, iteratee) {\n      var result = {};\n      iteratee = getIteratee(iteratee, 3);\n\n      baseForOwn(object, function(value, key, object) {\n        baseAssignValue(result, iteratee(value, key, object), value);\n      });\n      return result;\n    }\n\n    /**\n     * Creates an object with the same keys as `object` and values generated\n     * by running each own enumerable string keyed property of `object` thru\n     * `iteratee`. The iteratee is invoked with three arguments:\n     * (value, key, object).\n     *\n     * @static\n     * @memberOf _\n     * @since 2.4.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Object} Returns the new mapped object.\n     * @see _.mapKeys\n     * @example\n     *\n     * var users = {\n     *   'fred':    { 'user': 'fred',    'age': 40 },\n     *   'pebbles': { 'user': 'pebbles', 'age': 1 }\n     * };\n     *\n     * _.mapValues(users, function(o) { return o.age; });\n     * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.mapValues(users, 'age');\n     * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)\n     */\n    function mapValues(object, iteratee) {\n      var result = {};\n      iteratee = getIteratee(iteratee, 3);\n\n      baseForOwn(object, function(value, key, object) {\n        baseAssignValue(result, key, iteratee(value, key, object));\n      });\n      return result;\n    }\n\n    /**\n     * This method is like `_.assign` except that it recursively merges own and\n     * inherited enumerable string keyed properties of source objects into the\n     * destination object. Source properties that resolve to `undefined` are\n     * skipped if a destination value exists. Array and plain object properties\n     * are merged recursively. Other objects and value types are overridden by\n     * assignment. Source objects are applied from left to right. Subsequent\n     * sources overwrite property assignments of previous sources.\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.5.0\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} [sources] The source objects.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var object = {\n     *   'a': [{ 'b': 2 }, { 'd': 4 }]\n     * };\n     *\n     * var other = {\n     *   'a': [{ 'c': 3 }, { 'e': 5 }]\n     * };\n     *\n     * _.merge(object, other);\n     * // => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] }\n     */\n    var merge = createAssigner(function(object, source, srcIndex) {\n      baseMerge(object, source, srcIndex);\n    });\n\n    /**\n     * This method is like `_.merge` except that it accepts `customizer` which\n     * is invoked to produce the merged values of the destination and source\n     * properties. If `customizer` returns `undefined`, merging is handled by the\n     * method instead. The `customizer` is invoked with six arguments:\n     * (objValue, srcValue, key, object, source, stack).\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} sources The source objects.\n     * @param {Function} customizer The function to customize assigned values.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * function customizer(objValue, srcValue) {\n     *   if (_.isArray(objValue)) {\n     *     return objValue.concat(srcValue);\n     *   }\n     * }\n     *\n     * var object = { 'a': [1], 'b': [2] };\n     * var other = { 'a': [3], 'b': [4] };\n     *\n     * _.mergeWith(object, other, customizer);\n     * // => { 'a': [1, 3], 'b': [2, 4] }\n     */\n    var mergeWith = createAssigner(function(object, source, srcIndex, customizer) {\n      baseMerge(object, source, srcIndex, customizer);\n    });\n\n    /**\n     * The opposite of `_.pick`; this method creates an object composed of the\n     * own and inherited enumerable property paths of `object` that are not omitted.\n     *\n     * **Note:** This method is considerably slower than `_.pick`.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The source object.\n     * @param {...(string|string[])} [paths] The property paths to omit.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': '2', 'c': 3 };\n     *\n     * _.omit(object, ['a', 'c']);\n     * // => { 'b': '2' }\n     */\n    var omit = flatRest(function(object, paths) {\n      var result = {};\n      if (object == null) {\n        return result;\n      }\n      var isDeep = false;\n      paths = arrayMap(paths, function(path) {\n        path = castPath(path, object);\n        isDeep || (isDeep = path.length > 1);\n        return path;\n      });\n      copyObject(object, getAllKeysIn(object), result);\n      if (isDeep) {\n        result = baseClone(result, CLONE_DEEP_FLAG | CLONE_FLAT_FLAG | CLONE_SYMBOLS_FLAG, customOmitClone);\n      }\n      var length = paths.length;\n      while (length--) {\n        baseUnset(result, paths[length]);\n      }\n      return result;\n    });\n\n    /**\n     * The opposite of `_.pickBy`; this method creates an object composed of\n     * the own and inherited enumerable string keyed properties of `object` that\n     * `predicate` doesn't return truthy for. The predicate is invoked with two\n     * arguments: (value, key).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The source object.\n     * @param {Function} [predicate=_.identity] The function invoked per property.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': '2', 'c': 3 };\n     *\n     * _.omitBy(object, _.isNumber);\n     * // => { 'b': '2' }\n     */\n    function omitBy(object, predicate) {\n      return pickBy(object, negate(getIteratee(predicate)));\n    }\n\n    /**\n     * Creates an object composed of the picked `object` properties.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The source object.\n     * @param {...(string|string[])} [paths] The property paths to pick.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': '2', 'c': 3 };\n     *\n     * _.pick(object, ['a', 'c']);\n     * // => { 'a': 1, 'c': 3 }\n     */\n    var pick = flatRest(function(object, paths) {\n      return object == null ? {} : basePick(object, paths);\n    });\n\n    /**\n     * Creates an object composed of the `object` properties `predicate` returns\n     * truthy for. The predicate is invoked with two arguments: (value, key).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The source object.\n     * @param {Function} [predicate=_.identity] The function invoked per property.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': '2', 'c': 3 };\n     *\n     * _.pickBy(object, _.isNumber);\n     * // => { 'a': 1, 'c': 3 }\n     */\n    function pickBy(object, predicate) {\n      if (object == null) {\n        return {};\n      }\n      var props = arrayMap(getAllKeysIn(object), function(prop) {\n        return [prop];\n      });\n      predicate = getIteratee(predicate);\n      return basePickBy(object, props, function(value, path) {\n        return predicate(value, path[0]);\n      });\n    }\n\n    /**\n     * This method is like `_.get` except that if the resolved value is a\n     * function it's invoked with the `this` binding of its parent object and\n     * its result is returned.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path of the property to resolve.\n     * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n     * @returns {*} Returns the resolved value.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c1': 3, 'c2': _.constant(4) } }] };\n     *\n     * _.result(object, 'a[0].b.c1');\n     * // => 3\n     *\n     * _.result(object, 'a[0].b.c2');\n     * // => 4\n     *\n     * _.result(object, 'a[0].b.c3', 'default');\n     * // => 'default'\n     *\n     * _.result(object, 'a[0].b.c3', _.constant('default'));\n     * // => 'default'\n     */\n    function result(object, path, defaultValue) {\n      path = castPath(path, object);\n\n      var index = -1,\n          length = path.length;\n\n      // Ensure the loop is entered when path is empty.\n      if (!length) {\n        length = 1;\n        object = undefined;\n      }\n      while (++index < length) {\n        var value = object == null ? undefined : object[toKey(path[index])];\n        if (value === undefined) {\n          index = length;\n          value = defaultValue;\n        }\n        object = isFunction(value) ? value.call(object) : value;\n      }\n      return object;\n    }\n\n    /**\n     * Sets the value at `path` of `object`. If a portion of `path` doesn't exist,\n     * it's created. Arrays are created for missing index properties while objects\n     * are created for all other missing properties. Use `_.setWith` to customize\n     * `path` creation.\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.7.0\n     * @category Object\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to set.\n     * @param {*} value The value to set.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n     *\n     * _.set(object, 'a[0].b.c', 4);\n     * console.log(object.a[0].b.c);\n     * // => 4\n     *\n     * _.set(object, ['x', '0', 'y', 'z'], 5);\n     * console.log(object.x[0].y.z);\n     * // => 5\n     */\n    function set(object, path, value) {\n      return object == null ? object : baseSet(object, path, value);\n    }\n\n    /**\n     * This method is like `_.set` except that it accepts `customizer` which is\n     * invoked to produce the objects of `path`.  If `customizer` returns `undefined`\n     * path creation is handled by the method instead. The `customizer` is invoked\n     * with three arguments: (nsValue, key, nsObject).\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to set.\n     * @param {*} value The value to set.\n     * @param {Function} [customizer] The function to customize assigned values.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var object = {};\n     *\n     * _.setWith(object, '[0][1]', 'a', Object);\n     * // => { '0': { '1': 'a' } }\n     */\n    function setWith(object, path, value, customizer) {\n      customizer = typeof customizer == 'function' ? customizer : undefined;\n      return object == null ? object : baseSet(object, path, value, customizer);\n    }\n\n    /**\n     * Creates an array of own enumerable string keyed-value pairs for `object`\n     * which can be consumed by `_.fromPairs`. If `object` is a map or set, its\n     * entries are returned.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @alias entries\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the key-value pairs.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.toPairs(new Foo);\n     * // => [['a', 1], ['b', 2]] (iteration order is not guaranteed)\n     */\n    var toPairs = createToPairs(keys);\n\n    /**\n     * Creates an array of own and inherited enumerable string keyed-value pairs\n     * for `object` which can be consumed by `_.fromPairs`. If `object` is a map\n     * or set, its entries are returned.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @alias entriesIn\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the key-value pairs.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.toPairsIn(new Foo);\n     * // => [['a', 1], ['b', 2], ['c', 3]] (iteration order is not guaranteed)\n     */\n    var toPairsIn = createToPairs(keysIn);\n\n    /**\n     * An alternative to `_.reduce`; this method transforms `object` to a new\n     * `accumulator` object which is the result of running each of its own\n     * enumerable string keyed properties thru `iteratee`, with each invocation\n     * potentially mutating the `accumulator` object. If `accumulator` is not\n     * provided, a new object with the same `[[Prototype]]` will be used. The\n     * iteratee is invoked with four arguments: (accumulator, value, key, object).\n     * Iteratee functions may exit iteration early by explicitly returning `false`.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.3.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @param {*} [accumulator] The custom accumulator value.\n     * @returns {*} Returns the accumulated value.\n     * @example\n     *\n     * _.transform([2, 3, 4], function(result, n) {\n     *   result.push(n *= n);\n     *   return n % 2 == 0;\n     * }, []);\n     * // => [4, 9]\n     *\n     * _.transform({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {\n     *   (result[value] || (result[value] = [])).push(key);\n     * }, {});\n     * // => { '1': ['a', 'c'], '2': ['b'] }\n     */\n    function transform(object, iteratee, accumulator) {\n      var isArr = isArray(object),\n          isArrLike = isArr || isBuffer(object) || isTypedArray(object);\n\n      iteratee = getIteratee(iteratee, 4);\n      if (accumulator == null) {\n        var Ctor = object && object.constructor;\n        if (isArrLike) {\n          accumulator = isArr ? new Ctor : [];\n        }\n        else if (isObject(object)) {\n          accumulator = isFunction(Ctor) ? baseCreate(getPrototype(object)) : {};\n        }\n        else {\n          accumulator = {};\n        }\n      }\n      (isArrLike ? arrayEach : baseForOwn)(object, function(value, index, object) {\n        return iteratee(accumulator, value, index, object);\n      });\n      return accumulator;\n    }\n\n    /**\n     * Removes the property at `path` of `object`.\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to unset.\n     * @returns {boolean} Returns `true` if the property is deleted, else `false`.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': 7 } }] };\n     * _.unset(object, 'a[0].b.c');\n     * // => true\n     *\n     * console.log(object);\n     * // => { 'a': [{ 'b': {} }] };\n     *\n     * _.unset(object, ['a', '0', 'b', 'c']);\n     * // => true\n     *\n     * console.log(object);\n     * // => { 'a': [{ 'b': {} }] };\n     */\n    function unset(object, path) {\n      return object == null ? true : baseUnset(object, path);\n    }\n\n    /**\n     * This method is like `_.set` except that accepts `updater` to produce the\n     * value to set. Use `_.updateWith` to customize `path` creation. The `updater`\n     * is invoked with one argument: (value).\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.6.0\n     * @category Object\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to set.\n     * @param {Function} updater The function to produce the updated value.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n     *\n     * _.update(object, 'a[0].b.c', function(n) { return n * n; });\n     * console.log(object.a[0].b.c);\n     * // => 9\n     *\n     * _.update(object, 'x[0].y.z', function(n) { return n ? n + 1 : 0; });\n     * console.log(object.x[0].y.z);\n     * // => 0\n     */\n    function update(object, path, updater) {\n      return object == null ? object : baseUpdate(object, path, castFunction(updater));\n    }\n\n    /**\n     * This method is like `_.update` except that it accepts `customizer` which is\n     * invoked to produce the objects of `path`.  If `customizer` returns `undefined`\n     * path creation is handled by the method instead. The `customizer` is invoked\n     * with three arguments: (nsValue, key, nsObject).\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.6.0\n     * @category Object\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to set.\n     * @param {Function} updater The function to produce the updated value.\n     * @param {Function} [customizer] The function to customize assigned values.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var object = {};\n     *\n     * _.updateWith(object, '[0][1]', _.constant('a'), Object);\n     * // => { '0': { '1': 'a' } }\n     */\n    function updateWith(object, path, updater, customizer) {\n      customizer = typeof customizer == 'function' ? customizer : undefined;\n      return object == null ? object : baseUpdate(object, path, castFunction(updater), customizer);\n    }\n\n    /**\n     * Creates an array of the own enumerable string keyed property values of `object`.\n     *\n     * **Note:** Non-object values are coerced to objects.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property values.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.values(new Foo);\n     * // => [1, 2] (iteration order is not guaranteed)\n     *\n     * _.values('hi');\n     * // => ['h', 'i']\n     */\n    function values(object) {\n      return object == null ? [] : baseValues(object, keys(object));\n    }\n\n    /**\n     * Creates an array of the own and inherited enumerable string keyed property\n     * values of `object`.\n     *\n     * **Note:** Non-object values are coerced to objects.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property values.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.valuesIn(new Foo);\n     * // => [1, 2, 3] (iteration order is not guaranteed)\n     */\n    function valuesIn(object) {\n      return object == null ? [] : baseValues(object, keysIn(object));\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Clamps `number` within the inclusive `lower` and `upper` bounds.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Number\n     * @param {number} number The number to clamp.\n     * @param {number} [lower] The lower bound.\n     * @param {number} upper The upper bound.\n     * @returns {number} Returns the clamped number.\n     * @example\n     *\n     * _.clamp(-10, -5, 5);\n     * // => -5\n     *\n     * _.clamp(10, -5, 5);\n     * // => 5\n     */\n    function clamp(number, lower, upper) {\n      if (upper === undefined) {\n        upper = lower;\n        lower = undefined;\n      }\n      if (upper !== undefined) {\n        upper = toNumber(upper);\n        upper = upper === upper ? upper : 0;\n      }\n      if (lower !== undefined) {\n        lower = toNumber(lower);\n        lower = lower === lower ? lower : 0;\n      }\n      return baseClamp(toNumber(number), lower, upper);\n    }\n\n    /**\n     * Checks if `n` is between `start` and up to, but not including, `end`. If\n     * `end` is not specified, it's set to `start` with `start` then set to `0`.\n     * If `start` is greater than `end` the params are swapped to support\n     * negative ranges.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.3.0\n     * @category Number\n     * @param {number} number The number to check.\n     * @param {number} [start=0] The start of the range.\n     * @param {number} end The end of the range.\n     * @returns {boolean} Returns `true` if `number` is in the range, else `false`.\n     * @see _.range, _.rangeRight\n     * @example\n     *\n     * _.inRange(3, 2, 4);\n     * // => true\n     *\n     * _.inRange(4, 8);\n     * // => true\n     *\n     * _.inRange(4, 2);\n     * // => false\n     *\n     * _.inRange(2, 2);\n     * // => false\n     *\n     * _.inRange(1.2, 2);\n     * // => true\n     *\n     * _.inRange(5.2, 4);\n     * // => false\n     *\n     * _.inRange(-3, -2, -6);\n     * // => true\n     */\n    function inRange(number, start, end) {\n      start = toFinite(start);\n      if (end === undefined) {\n        end = start;\n        start = 0;\n      } else {\n        end = toFinite(end);\n      }\n      number = toNumber(number);\n      return baseInRange(number, start, end);\n    }\n\n    /**\n     * Produces a random number between the inclusive `lower` and `upper` bounds.\n     * If only one argument is provided a number between `0` and the given number\n     * is returned. If `floating` is `true`, or either `lower` or `upper` are\n     * floats, a floating-point number is returned instead of an integer.\n     *\n     * **Note:** JavaScript follows the IEEE-754 standard for resolving\n     * floating-point values which can produce unexpected results.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.7.0\n     * @category Number\n     * @param {number} [lower=0] The lower bound.\n     * @param {number} [upper=1] The upper bound.\n     * @param {boolean} [floating] Specify returning a floating-point number.\n     * @returns {number} Returns the random number.\n     * @example\n     *\n     * _.random(0, 5);\n     * // => an integer between 0 and 5\n     *\n     * _.random(5);\n     * // => also an integer between 0 and 5\n     *\n     * _.random(5, true);\n     * // => a floating-point number between 0 and 5\n     *\n     * _.random(1.2, 5.2);\n     * // => a floating-point number between 1.2 and 5.2\n     */\n    function random(lower, upper, floating) {\n      if (floating && typeof floating != 'boolean' && isIterateeCall(lower, upper, floating)) {\n        upper = floating = undefined;\n      }\n      if (floating === undefined) {\n        if (typeof upper == 'boolean') {\n          floating = upper;\n          upper = undefined;\n        }\n        else if (typeof lower == 'boolean') {\n          floating = lower;\n          lower = undefined;\n        }\n      }\n      if (lower === undefined && upper === undefined) {\n        lower = 0;\n        upper = 1;\n      }\n      else {\n        lower = toFinite(lower);\n        if (upper === undefined) {\n          upper = lower;\n          lower = 0;\n        } else {\n          upper = toFinite(upper);\n        }\n      }\n      if (lower > upper) {\n        var temp = lower;\n        lower = upper;\n        upper = temp;\n      }\n      if (floating || lower % 1 || upper % 1) {\n        var rand = nativeRandom();\n        return nativeMin(lower + (rand * (upper - lower + freeParseFloat('1e-' + ((rand + '').length - 1)))), upper);\n      }\n      return baseRandom(lower, upper);\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Converts `string` to [camel case](https://en.wikipedia.org/wiki/CamelCase).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the camel cased string.\n     * @example\n     *\n     * _.camelCase('Foo Bar');\n     * // => 'fooBar'\n     *\n     * _.camelCase('--foo-bar--');\n     * // => 'fooBar'\n     *\n     * _.camelCase('__FOO_BAR__');\n     * // => 'fooBar'\n     */\n    var camelCase = createCompounder(function(result, word, index) {\n      word = word.toLowerCase();\n      return result + (index ? capitalize(word) : word);\n    });\n\n    /**\n     * Converts the first character of `string` to upper case and the remaining\n     * to lower case.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to capitalize.\n     * @returns {string} Returns the capitalized string.\n     * @example\n     *\n     * _.capitalize('FRED');\n     * // => 'Fred'\n     */\n    function capitalize(string) {\n      return upperFirst(toString(string).toLowerCase());\n    }\n\n    /**\n     * Deburrs `string` by converting\n     * [Latin-1 Supplement](https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)#Character_table)\n     * and [Latin Extended-A](https://en.wikipedia.org/wiki/Latin_Extended-A)\n     * letters to basic Latin letters and removing\n     * [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to deburr.\n     * @returns {string} Returns the deburred string.\n     * @example\n     *\n     * _.deburr('déjà vu');\n     * // => 'deja vu'\n     */\n    function deburr(string) {\n      string = toString(string);\n      return string && string.replace(reLatin, deburrLetter).replace(reComboMark, '');\n    }\n\n    /**\n     * Checks if `string` ends with the given target string.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to inspect.\n     * @param {string} [target] The string to search for.\n     * @param {number} [position=string.length] The position to search up to.\n     * @returns {boolean} Returns `true` if `string` ends with `target`,\n     *  else `false`.\n     * @example\n     *\n     * _.endsWith('abc', 'c');\n     * // => true\n     *\n     * _.endsWith('abc', 'b');\n     * // => false\n     *\n     * _.endsWith('abc', 'b', 2);\n     * // => true\n     */\n    function endsWith(string, target, position) {\n      string = toString(string);\n      target = baseToString(target);\n\n      var length = string.length;\n      position = position === undefined\n        ? length\n        : baseClamp(toInteger(position), 0, length);\n\n      var end = position;\n      position -= target.length;\n      return position >= 0 && string.slice(position, end) == target;\n    }\n\n    /**\n     * Converts the characters \"&\", \"<\", \">\", '\"', and \"'\" in `string` to their\n     * corresponding HTML entities.\n     *\n     * **Note:** No other characters are escaped. To escape additional\n     * characters use a third-party library like [_he_](https://mths.be/he).\n     *\n     * Though the \">\" character is escaped for symmetry, characters like\n     * \">\" and \"/\" don't need escaping in HTML and have no special meaning\n     * unless they're part of a tag or unquoted attribute value. See\n     * [Mathias Bynens's article](https://mathiasbynens.be/notes/ambiguous-ampersands)\n     * (under \"semi-related fun fact\") for more details.\n     *\n     * When working with HTML you should always\n     * [quote attribute values](http://wonko.com/post/html-escaping) to reduce\n     * XSS vectors.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The string to escape.\n     * @returns {string} Returns the escaped string.\n     * @example\n     *\n     * _.escape('fred, barney, & pebbles');\n     * // => 'fred, barney, &amp; pebbles'\n     */\n    function escape(string) {\n      string = toString(string);\n      return (string && reHasUnescapedHtml.test(string))\n        ? string.replace(reUnescapedHtml, escapeHtmlChar)\n        : string;\n    }\n\n    /**\n     * Escapes the `RegExp` special characters \"^\", \"$\", \"\\\", \".\", \"*\", \"+\",\n     * \"?\", \"(\", \")\", \"[\", \"]\", \"{\", \"}\", and \"|\" in `string`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to escape.\n     * @returns {string} Returns the escaped string.\n     * @example\n     *\n     * _.escapeRegExp('[lodash](https://lodash.com/)');\n     * // => '\\[lodash\\]\\(https://lodash\\.com/\\)'\n     */\n    function escapeRegExp(string) {\n      string = toString(string);\n      return (string && reHasRegExpChar.test(string))\n        ? string.replace(reRegExpChar, '\\\\$&')\n        : string;\n    }\n\n    /**\n     * Converts `string` to\n     * [kebab case](https://en.wikipedia.org/wiki/Letter_case#Special_case_styles).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the kebab cased string.\n     * @example\n     *\n     * _.kebabCase('Foo Bar');\n     * // => 'foo-bar'\n     *\n     * _.kebabCase('fooBar');\n     * // => 'foo-bar'\n     *\n     * _.kebabCase('__FOO_BAR__');\n     * // => 'foo-bar'\n     */\n    var kebabCase = createCompounder(function(result, word, index) {\n      return result + (index ? '-' : '') + word.toLowerCase();\n    });\n\n    /**\n     * Converts `string`, as space separated words, to lower case.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the lower cased string.\n     * @example\n     *\n     * _.lowerCase('--Foo-Bar--');\n     * // => 'foo bar'\n     *\n     * _.lowerCase('fooBar');\n     * // => 'foo bar'\n     *\n     * _.lowerCase('__FOO_BAR__');\n     * // => 'foo bar'\n     */\n    var lowerCase = createCompounder(function(result, word, index) {\n      return result + (index ? ' ' : '') + word.toLowerCase();\n    });\n\n    /**\n     * Converts the first character of `string` to lower case.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the converted string.\n     * @example\n     *\n     * _.lowerFirst('Fred');\n     * // => 'fred'\n     *\n     * _.lowerFirst('FRED');\n     * // => 'fRED'\n     */\n    var lowerFirst = createCaseFirst('toLowerCase');\n\n    /**\n     * Pads `string` on the left and right sides if it's shorter than `length`.\n     * Padding characters are truncated if they can't be evenly divided by `length`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to pad.\n     * @param {number} [length=0] The padding length.\n     * @param {string} [chars=' '] The string used as padding.\n     * @returns {string} Returns the padded string.\n     * @example\n     *\n     * _.pad('abc', 8);\n     * // => '  abc   '\n     *\n     * _.pad('abc', 8, '_-');\n     * // => '_-abc_-_'\n     *\n     * _.pad('abc', 3);\n     * // => 'abc'\n     */\n    function pad(string, length, chars) {\n      string = toString(string);\n      length = toInteger(length);\n\n      var strLength = length ? stringSize(string) : 0;\n      if (!length || strLength >= length) {\n        return string;\n      }\n      var mid = (length - strLength) / 2;\n      return (\n        createPadding(nativeFloor(mid), chars) +\n        string +\n        createPadding(nativeCeil(mid), chars)\n      );\n    }\n\n    /**\n     * Pads `string` on the right side if it's shorter than `length`. Padding\n     * characters are truncated if they exceed `length`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to pad.\n     * @param {number} [length=0] The padding length.\n     * @param {string} [chars=' '] The string used as padding.\n     * @returns {string} Returns the padded string.\n     * @example\n     *\n     * _.padEnd('abc', 6);\n     * // => 'abc   '\n     *\n     * _.padEnd('abc', 6, '_-');\n     * // => 'abc_-_'\n     *\n     * _.padEnd('abc', 3);\n     * // => 'abc'\n     */\n    function padEnd(string, length, chars) {\n      string = toString(string);\n      length = toInteger(length);\n\n      var strLength = length ? stringSize(string) : 0;\n      return (length && strLength < length)\n        ? (string + createPadding(length - strLength, chars))\n        : string;\n    }\n\n    /**\n     * Pads `string` on the left side if it's shorter than `length`. Padding\n     * characters are truncated if they exceed `length`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to pad.\n     * @param {number} [length=0] The padding length.\n     * @param {string} [chars=' '] The string used as padding.\n     * @returns {string} Returns the padded string.\n     * @example\n     *\n     * _.padStart('abc', 6);\n     * // => '   abc'\n     *\n     * _.padStart('abc', 6, '_-');\n     * // => '_-_abc'\n     *\n     * _.padStart('abc', 3);\n     * // => 'abc'\n     */\n    function padStart(string, length, chars) {\n      string = toString(string);\n      length = toInteger(length);\n\n      var strLength = length ? stringSize(string) : 0;\n      return (length && strLength < length)\n        ? (createPadding(length - strLength, chars) + string)\n        : string;\n    }\n\n    /**\n     * Converts `string` to an integer of the specified radix. If `radix` is\n     * `undefined` or `0`, a `radix` of `10` is used unless `value` is a\n     * hexadecimal, in which case a `radix` of `16` is used.\n     *\n     * **Note:** This method aligns with the\n     * [ES5 implementation](https://es5.github.io/#x15.1.2.2) of `parseInt`.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.1.0\n     * @category String\n     * @param {string} string The string to convert.\n     * @param {number} [radix=10] The radix to interpret `value` by.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {number} Returns the converted integer.\n     * @example\n     *\n     * _.parseInt('08');\n     * // => 8\n     *\n     * _.map(['6', '08', '10'], _.parseInt);\n     * // => [6, 8, 10]\n     */\n    function parseInt(string, radix, guard) {\n      if (guard || radix == null) {\n        radix = 0;\n      } else if (radix) {\n        radix = +radix;\n      }\n      return nativeParseInt(toString(string).replace(reTrimStart, ''), radix || 0);\n    }\n\n    /**\n     * Repeats the given string `n` times.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to repeat.\n     * @param {number} [n=1] The number of times to repeat the string.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {string} Returns the repeated string.\n     * @example\n     *\n     * _.repeat('*', 3);\n     * // => '***'\n     *\n     * _.repeat('abc', 2);\n     * // => 'abcabc'\n     *\n     * _.repeat('abc', 0);\n     * // => ''\n     */\n    function repeat(string, n, guard) {\n      if ((guard ? isIterateeCall(string, n, guard) : n === undefined)) {\n        n = 1;\n      } else {\n        n = toInteger(n);\n      }\n      return baseRepeat(toString(string), n);\n    }\n\n    /**\n     * Replaces matches for `pattern` in `string` with `replacement`.\n     *\n     * **Note:** This method is based on\n     * [`String#replace`](https://mdn.io/String/replace).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to modify.\n     * @param {RegExp|string} pattern The pattern to replace.\n     * @param {Function|string} replacement The match replacement.\n     * @returns {string} Returns the modified string.\n     * @example\n     *\n     * _.replace('Hi Fred', 'Fred', 'Barney');\n     * // => 'Hi Barney'\n     */\n    function replace() {\n      var args = arguments,\n          string = toString(args[0]);\n\n      return args.length < 3 ? string : string.replace(args[1], args[2]);\n    }\n\n    /**\n     * Converts `string` to\n     * [snake case](https://en.wikipedia.org/wiki/Snake_case).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the snake cased string.\n     * @example\n     *\n     * _.snakeCase('Foo Bar');\n     * // => 'foo_bar'\n     *\n     * _.snakeCase('fooBar');\n     * // => 'foo_bar'\n     *\n     * _.snakeCase('--FOO-BAR--');\n     * // => 'foo_bar'\n     */\n    var snakeCase = createCompounder(function(result, word, index) {\n      return result + (index ? '_' : '') + word.toLowerCase();\n    });\n\n    /**\n     * Splits `string` by `separator`.\n     *\n     * **Note:** This method is based on\n     * [`String#split`](https://mdn.io/String/split).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to split.\n     * @param {RegExp|string} separator The separator pattern to split by.\n     * @param {number} [limit] The length to truncate results to.\n     * @returns {Array} Returns the string segments.\n     * @example\n     *\n     * _.split('a-b-c', '-', 2);\n     * // => ['a', 'b']\n     */\n    function split(string, separator, limit) {\n      if (limit && typeof limit != 'number' && isIterateeCall(string, separator, limit)) {\n        separator = limit = undefined;\n      }\n      limit = limit === undefined ? MAX_ARRAY_LENGTH : limit >>> 0;\n      if (!limit) {\n        return [];\n      }\n      string = toString(string);\n      if (string && (\n            typeof separator == 'string' ||\n            (separator != null && !isRegExp(separator))\n          )) {\n        separator = baseToString(separator);\n        if (!separator && hasUnicode(string)) {\n          return castSlice(stringToArray(string), 0, limit);\n        }\n      }\n      return string.split(separator, limit);\n    }\n\n    /**\n     * Converts `string` to\n     * [start case](https://en.wikipedia.org/wiki/Letter_case#Stylistic_or_specialised_usage).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.1.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the start cased string.\n     * @example\n     *\n     * _.startCase('--foo-bar--');\n     * // => 'Foo Bar'\n     *\n     * _.startCase('fooBar');\n     * // => 'Foo Bar'\n     *\n     * _.startCase('__FOO_BAR__');\n     * // => 'FOO BAR'\n     */\n    var startCase = createCompounder(function(result, word, index) {\n      return result + (index ? ' ' : '') + upperFirst(word);\n    });\n\n    /**\n     * Checks if `string` starts with the given target string.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to inspect.\n     * @param {string} [target] The string to search for.\n     * @param {number} [position=0] The position to search from.\n     * @returns {boolean} Returns `true` if `string` starts with `target`,\n     *  else `false`.\n     * @example\n     *\n     * _.startsWith('abc', 'a');\n     * // => true\n     *\n     * _.startsWith('abc', 'b');\n     * // => false\n     *\n     * _.startsWith('abc', 'b', 1);\n     * // => true\n     */\n    function startsWith(string, target, position) {\n      string = toString(string);\n      position = position == null\n        ? 0\n        : baseClamp(toInteger(position), 0, string.length);\n\n      target = baseToString(target);\n      return string.slice(position, position + target.length) == target;\n    }\n\n    /**\n     * Creates a compiled template function that can interpolate data properties\n     * in \"interpolate\" delimiters, HTML-escape interpolated data properties in\n     * \"escape\" delimiters, and execute JavaScript in \"evaluate\" delimiters. Data\n     * properties may be accessed as free variables in the template. If a setting\n     * object is given, it takes precedence over `_.templateSettings` values.\n     *\n     * **Note:** In the development build `_.template` utilizes\n     * [sourceURLs](http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl)\n     * for easier debugging.\n     *\n     * For more information on precompiling templates see\n     * [lodash's custom builds documentation](https://lodash.com/custom-builds).\n     *\n     * For more information on Chrome extension sandboxes see\n     * [Chrome's extensions documentation](https://developer.chrome.com/extensions/sandboxingEval).\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The template string.\n     * @param {Object} [options={}] The options object.\n     * @param {RegExp} [options.escape=_.templateSettings.escape]\n     *  The HTML \"escape\" delimiter.\n     * @param {RegExp} [options.evaluate=_.templateSettings.evaluate]\n     *  The \"evaluate\" delimiter.\n     * @param {Object} [options.imports=_.templateSettings.imports]\n     *  An object to import into the template as free variables.\n     * @param {RegExp} [options.interpolate=_.templateSettings.interpolate]\n     *  The \"interpolate\" delimiter.\n     * @param {string} [options.sourceURL='lodash.templateSources[n]']\n     *  The sourceURL of the compiled template.\n     * @param {string} [options.variable='obj']\n     *  The data object variable name.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Function} Returns the compiled template function.\n     * @example\n     *\n     * // Use the \"interpolate\" delimiter to create a compiled template.\n     * var compiled = _.template('hello <%= user %>!');\n     * compiled({ 'user': 'fred' });\n     * // => 'hello fred!'\n     *\n     * // Use the HTML \"escape\" delimiter to escape data property values.\n     * var compiled = _.template('<b><%- value %></b>');\n     * compiled({ 'value': '<script>' });\n     * // => '<b>&lt;script&gt;</b>'\n     *\n     * // Use the \"evaluate\" delimiter to execute JavaScript and generate HTML.\n     * var compiled = _.template('<% _.forEach(users, function(user) { %><li><%- user %></li><% }); %>');\n     * compiled({ 'users': ['fred', 'barney'] });\n     * // => '<li>fred</li><li>barney</li>'\n     *\n     * // Use the internal `print` function in \"evaluate\" delimiters.\n     * var compiled = _.template('<% print(\"hello \" + user); %>!');\n     * compiled({ 'user': 'barney' });\n     * // => 'hello barney!'\n     *\n     * // Use the ES template literal delimiter as an \"interpolate\" delimiter.\n     * // Disable support by replacing the \"interpolate\" delimiter.\n     * var compiled = _.template('hello ${ user }!');\n     * compiled({ 'user': 'pebbles' });\n     * // => 'hello pebbles!'\n     *\n     * // Use backslashes to treat delimiters as plain text.\n     * var compiled = _.template('<%= \"\\\\<%- value %\\\\>\" %>');\n     * compiled({ 'value': 'ignored' });\n     * // => '<%- value %>'\n     *\n     * // Use the `imports` option to import `jQuery` as `jq`.\n     * var text = '<% jq.each(users, function(user) { %><li><%- user %></li><% }); %>';\n     * var compiled = _.template(text, { 'imports': { 'jq': jQuery } });\n     * compiled({ 'users': ['fred', 'barney'] });\n     * // => '<li>fred</li><li>barney</li>'\n     *\n     * // Use the `sourceURL` option to specify a custom sourceURL for the template.\n     * var compiled = _.template('hello <%= user %>!', { 'sourceURL': '/basic/greeting.jst' });\n     * compiled(data);\n     * // => Find the source of \"greeting.jst\" under the Sources tab or Resources panel of the web inspector.\n     *\n     * // Use the `variable` option to ensure a with-statement isn't used in the compiled template.\n     * var compiled = _.template('hi <%= data.user %>!', { 'variable': 'data' });\n     * compiled.source;\n     * // => function(data) {\n     * //   var __t, __p = '';\n     * //   __p += 'hi ' + ((__t = ( data.user )) == null ? '' : __t) + '!';\n     * //   return __p;\n     * // }\n     *\n     * // Use custom template delimiters.\n     * _.templateSettings.interpolate = /{{([\\s\\S]+?)}}/g;\n     * var compiled = _.template('hello {{ user }}!');\n     * compiled({ 'user': 'mustache' });\n     * // => 'hello mustache!'\n     *\n     * // Use the `source` property to inline compiled templates for meaningful\n     * // line numbers in error messages and stack traces.\n     * fs.writeFileSync(path.join(process.cwd(), 'jst.js'), '\\\n     *   var JST = {\\\n     *     \"main\": ' + _.template(mainText).source + '\\\n     *   };\\\n     * ');\n     */\n    function template(string, options, guard) {\n      // Based on John Resig's `tmpl` implementation\n      // (http://ejohn.org/blog/javascript-micro-templating/)\n      // and Laura Doktorova's doT.js (https://github.com/olado/doT).\n      var settings = lodash.templateSettings;\n\n      if (guard && isIterateeCall(string, options, guard)) {\n        options = undefined;\n      }\n      string = toString(string);\n      options = assignInWith({}, options, settings, customDefaultsAssignIn);\n\n      var imports = assignInWith({}, options.imports, settings.imports, customDefaultsAssignIn),\n          importsKeys = keys(imports),\n          importsValues = baseValues(imports, importsKeys);\n\n      var isEscaping,\n          isEvaluating,\n          index = 0,\n          interpolate = options.interpolate || reNoMatch,\n          source = \"__p += '\";\n\n      // Compile the regexp to match each delimiter.\n      var reDelimiters = RegExp(\n        (options.escape || reNoMatch).source + '|' +\n        interpolate.source + '|' +\n        (interpolate === reInterpolate ? reEsTemplate : reNoMatch).source + '|' +\n        (options.evaluate || reNoMatch).source + '|$'\n      , 'g');\n\n      // Use a sourceURL for easier debugging.\n      // The sourceURL gets injected into the source that's eval-ed, so be careful\n      // to normalize all kinds of whitespace, so e.g. newlines (and unicode versions of it) can't sneak in\n      // and escape the comment, thus injecting code that gets evaled.\n      var sourceURL = '//# sourceURL=' +\n        (hasOwnProperty.call(options, 'sourceURL')\n          ? (options.sourceURL + '').replace(/\\s/g, ' ')\n          : ('lodash.templateSources[' + (++templateCounter) + ']')\n        ) + '\\n';\n\n      string.replace(reDelimiters, function(match, escapeValue, interpolateValue, esTemplateValue, evaluateValue, offset) {\n        interpolateValue || (interpolateValue = esTemplateValue);\n\n        // Escape characters that can't be included in string literals.\n        source += string.slice(index, offset).replace(reUnescapedString, escapeStringChar);\n\n        // Replace delimiters with snippets.\n        if (escapeValue) {\n          isEscaping = true;\n          source += \"' +\\n__e(\" + escapeValue + \") +\\n'\";\n        }\n        if (evaluateValue) {\n          isEvaluating = true;\n          source += \"';\\n\" + evaluateValue + \";\\n__p += '\";\n        }\n        if (interpolateValue) {\n          source += \"' +\\n((__t = (\" + interpolateValue + \")) == null ? '' : __t) +\\n'\";\n        }\n        index = offset + match.length;\n\n        // The JS engine embedded in Adobe products needs `match` returned in\n        // order to produce the correct `offset` value.\n        return match;\n      });\n\n      source += \"';\\n\";\n\n      // If `variable` is not specified wrap a with-statement around the generated\n      // code to add the data object to the top of the scope chain.\n      var variable = hasOwnProperty.call(options, 'variable') && options.variable;\n      if (!variable) {\n        source = 'with (obj) {\\n' + source + '\\n}\\n';\n      }\n      // Throw an error if a forbidden character was found in `variable`, to prevent\n      // potential command injection attacks.\n      else if (reForbiddenIdentifierChars.test(variable)) {\n        throw new Error(INVALID_TEMPL_VAR_ERROR_TEXT);\n      }\n\n      // Cleanup code by stripping empty strings.\n      source = (isEvaluating ? source.replace(reEmptyStringLeading, '') : source)\n        .replace(reEmptyStringMiddle, '$1')\n        .replace(reEmptyStringTrailing, '$1;');\n\n      // Frame code as the function body.\n      source = 'function(' + (variable || 'obj') + ') {\\n' +\n        (variable\n          ? ''\n          : 'obj || (obj = {});\\n'\n        ) +\n        \"var __t, __p = ''\" +\n        (isEscaping\n           ? ', __e = _.escape'\n           : ''\n        ) +\n        (isEvaluating\n          ? ', __j = Array.prototype.join;\\n' +\n            \"function print() { __p += __j.call(arguments, '') }\\n\"\n          : ';\\n'\n        ) +\n        source +\n        'return __p\\n}';\n\n      var result = attempt(function() {\n        return Function(importsKeys, sourceURL + 'return ' + source)\n          .apply(undefined, importsValues);\n      });\n\n      // Provide the compiled function's source by its `toString` method or\n      // the `source` property as a convenience for inlining compiled templates.\n      result.source = source;\n      if (isError(result)) {\n        throw result;\n      }\n      return result;\n    }\n\n    /**\n     * Converts `string`, as a whole, to lower case just like\n     * [String#toLowerCase](https://mdn.io/toLowerCase).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the lower cased string.\n     * @example\n     *\n     * _.toLower('--Foo-Bar--');\n     * // => '--foo-bar--'\n     *\n     * _.toLower('fooBar');\n     * // => 'foobar'\n     *\n     * _.toLower('__FOO_BAR__');\n     * // => '__foo_bar__'\n     */\n    function toLower(value) {\n      return toString(value).toLowerCase();\n    }\n\n    /**\n     * Converts `string`, as a whole, to upper case just like\n     * [String#toUpperCase](https://mdn.io/toUpperCase).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the upper cased string.\n     * @example\n     *\n     * _.toUpper('--foo-bar--');\n     * // => '--FOO-BAR--'\n     *\n     * _.toUpper('fooBar');\n     * // => 'FOOBAR'\n     *\n     * _.toUpper('__foo_bar__');\n     * // => '__FOO_BAR__'\n     */\n    function toUpper(value) {\n      return toString(value).toUpperCase();\n    }\n\n    /**\n     * Removes leading and trailing whitespace or specified characters from `string`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to trim.\n     * @param {string} [chars=whitespace] The characters to trim.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {string} Returns the trimmed string.\n     * @example\n     *\n     * _.trim('  abc  ');\n     * // => 'abc'\n     *\n     * _.trim('-_-abc-_-', '_-');\n     * // => 'abc'\n     *\n     * _.map(['  foo  ', '  bar  '], _.trim);\n     * // => ['foo', 'bar']\n     */\n    function trim(string, chars, guard) {\n      string = toString(string);\n      if (string && (guard || chars === undefined)) {\n        return baseTrim(string);\n      }\n      if (!string || !(chars = baseToString(chars))) {\n        return string;\n      }\n      var strSymbols = stringToArray(string),\n          chrSymbols = stringToArray(chars),\n          start = charsStartIndex(strSymbols, chrSymbols),\n          end = charsEndIndex(strSymbols, chrSymbols) + 1;\n\n      return castSlice(strSymbols, start, end).join('');\n    }\n\n    /**\n     * Removes trailing whitespace or specified characters from `string`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to trim.\n     * @param {string} [chars=whitespace] The characters to trim.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {string} Returns the trimmed string.\n     * @example\n     *\n     * _.trimEnd('  abc  ');\n     * // => '  abc'\n     *\n     * _.trimEnd('-_-abc-_-', '_-');\n     * // => '-_-abc'\n     */\n    function trimEnd(string, chars, guard) {\n      string = toString(string);\n      if (string && (guard || chars === undefined)) {\n        return string.slice(0, trimmedEndIndex(string) + 1);\n      }\n      if (!string || !(chars = baseToString(chars))) {\n        return string;\n      }\n      var strSymbols = stringToArray(string),\n          end = charsEndIndex(strSymbols, stringToArray(chars)) + 1;\n\n      return castSlice(strSymbols, 0, end).join('');\n    }\n\n    /**\n     * Removes leading whitespace or specified characters from `string`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to trim.\n     * @param {string} [chars=whitespace] The characters to trim.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {string} Returns the trimmed string.\n     * @example\n     *\n     * _.trimStart('  abc  ');\n     * // => 'abc  '\n     *\n     * _.trimStart('-_-abc-_-', '_-');\n     * // => 'abc-_-'\n     */\n    function trimStart(string, chars, guard) {\n      string = toString(string);\n      if (string && (guard || chars === undefined)) {\n        return string.replace(reTrimStart, '');\n      }\n      if (!string || !(chars = baseToString(chars))) {\n        return string;\n      }\n      var strSymbols = stringToArray(string),\n          start = charsStartIndex(strSymbols, stringToArray(chars));\n\n      return castSlice(strSymbols, start).join('');\n    }\n\n    /**\n     * Truncates `string` if it's longer than the given maximum string length.\n     * The last characters of the truncated string are replaced with the omission\n     * string which defaults to \"...\".\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to truncate.\n     * @param {Object} [options={}] The options object.\n     * @param {number} [options.length=30] The maximum string length.\n     * @param {string} [options.omission='...'] The string to indicate text is omitted.\n     * @param {RegExp|string} [options.separator] The separator pattern to truncate to.\n     * @returns {string} Returns the truncated string.\n     * @example\n     *\n     * _.truncate('hi-diddly-ho there, neighborino');\n     * // => 'hi-diddly-ho there, neighbo...'\n     *\n     * _.truncate('hi-diddly-ho there, neighborino', {\n     *   'length': 24,\n     *   'separator': ' '\n     * });\n     * // => 'hi-diddly-ho there,...'\n     *\n     * _.truncate('hi-diddly-ho there, neighborino', {\n     *   'length': 24,\n     *   'separator': /,? +/\n     * });\n     * // => 'hi-diddly-ho there...'\n     *\n     * _.truncate('hi-diddly-ho there, neighborino', {\n     *   'omission': ' [...]'\n     * });\n     * // => 'hi-diddly-ho there, neig [...]'\n     */\n    function truncate(string, options) {\n      var length = DEFAULT_TRUNC_LENGTH,\n          omission = DEFAULT_TRUNC_OMISSION;\n\n      if (isObject(options)) {\n        var separator = 'separator' in options ? options.separator : separator;\n        length = 'length' in options ? toInteger(options.length) : length;\n        omission = 'omission' in options ? baseToString(options.omission) : omission;\n      }\n      string = toString(string);\n\n      var strLength = string.length;\n      if (hasUnicode(string)) {\n        var strSymbols = stringToArray(string);\n        strLength = strSymbols.length;\n      }\n      if (length >= strLength) {\n        return string;\n      }\n      var end = length - stringSize(omission);\n      if (end < 1) {\n        return omission;\n      }\n      var result = strSymbols\n        ? castSlice(strSymbols, 0, end).join('')\n        : string.slice(0, end);\n\n      if (separator === undefined) {\n        return result + omission;\n      }\n      if (strSymbols) {\n        end += (result.length - end);\n      }\n      if (isRegExp(separator)) {\n        if (string.slice(end).search(separator)) {\n          var match,\n              substring = result;\n\n          if (!separator.global) {\n            separator = RegExp(separator.source, toString(reFlags.exec(separator)) + 'g');\n          }\n          separator.lastIndex = 0;\n          while ((match = separator.exec(substring))) {\n            var newEnd = match.index;\n          }\n          result = result.slice(0, newEnd === undefined ? end : newEnd);\n        }\n      } else if (string.indexOf(baseToString(separator), end) != end) {\n        var index = result.lastIndexOf(separator);\n        if (index > -1) {\n          result = result.slice(0, index);\n        }\n      }\n      return result + omission;\n    }\n\n    /**\n     * The inverse of `_.escape`; this method converts the HTML entities\n     * `&amp;`, `&lt;`, `&gt;`, `&quot;`, and `&#39;` in `string` to\n     * their corresponding characters.\n     *\n     * **Note:** No other HTML entities are unescaped. To unescape additional\n     * HTML entities use a third-party library like [_he_](https://mths.be/he).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.6.0\n     * @category String\n     * @param {string} [string=''] The string to unescape.\n     * @returns {string} Returns the unescaped string.\n     * @example\n     *\n     * _.unescape('fred, barney, &amp; pebbles');\n     * // => 'fred, barney, & pebbles'\n     */\n    function unescape(string) {\n      string = toString(string);\n      return (string && reHasEscapedHtml.test(string))\n        ? string.replace(reEscapedHtml, unescapeHtmlChar)\n        : string;\n    }\n\n    /**\n     * Converts `string`, as space separated words, to upper case.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the upper cased string.\n     * @example\n     *\n     * _.upperCase('--foo-bar');\n     * // => 'FOO BAR'\n     *\n     * _.upperCase('fooBar');\n     * // => 'FOO BAR'\n     *\n     * _.upperCase('__foo_bar__');\n     * // => 'FOO BAR'\n     */\n    var upperCase = createCompounder(function(result, word, index) {\n      return result + (index ? ' ' : '') + word.toUpperCase();\n    });\n\n    /**\n     * Converts the first character of `string` to upper case.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the converted string.\n     * @example\n     *\n     * _.upperFirst('fred');\n     * // => 'Fred'\n     *\n     * _.upperFirst('FRED');\n     * // => 'FRED'\n     */\n    var upperFirst = createCaseFirst('toUpperCase');\n\n    /**\n     * Splits `string` into an array of its words.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to inspect.\n     * @param {RegExp|string} [pattern] The pattern to match words.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the words of `string`.\n     * @example\n     *\n     * _.words('fred, barney, & pebbles');\n     * // => ['fred', 'barney', 'pebbles']\n     *\n     * _.words('fred, barney, & pebbles', /[^, ]+/g);\n     * // => ['fred', 'barney', '&', 'pebbles']\n     */\n    function words(string, pattern, guard) {\n      string = toString(string);\n      pattern = guard ? undefined : pattern;\n\n      if (pattern === undefined) {\n        return hasUnicodeWord(string) ? unicodeWords(string) : asciiWords(string);\n      }\n      return string.match(pattern) || [];\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Attempts to invoke `func`, returning either the result or the caught error\n     * object. Any additional arguments are provided to `func` when it's invoked.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Util\n     * @param {Function} func The function to attempt.\n     * @param {...*} [args] The arguments to invoke `func` with.\n     * @returns {*} Returns the `func` result or error object.\n     * @example\n     *\n     * // Avoid throwing errors for invalid selectors.\n     * var elements = _.attempt(function(selector) {\n     *   return document.querySelectorAll(selector);\n     * }, '>_>');\n     *\n     * if (_.isError(elements)) {\n     *   elements = [];\n     * }\n     */\n    var attempt = baseRest(function(func, args) {\n      try {\n        return apply(func, undefined, args);\n      } catch (e) {\n        return isError(e) ? e : new Error(e);\n      }\n    });\n\n    /**\n     * Binds methods of an object to the object itself, overwriting the existing\n     * method.\n     *\n     * **Note:** This method doesn't set the \"length\" property of bound functions.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @param {Object} object The object to bind and assign the bound methods to.\n     * @param {...(string|string[])} methodNames The object method names to bind.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var view = {\n     *   'label': 'docs',\n     *   'click': function() {\n     *     console.log('clicked ' + this.label);\n     *   }\n     * };\n     *\n     * _.bindAll(view, ['click']);\n     * jQuery(element).on('click', view.click);\n     * // => Logs 'clicked docs' when clicked.\n     */\n    var bindAll = flatRest(function(object, methodNames) {\n      arrayEach(methodNames, function(key) {\n        key = toKey(key);\n        baseAssignValue(object, key, bind(object[key], object));\n      });\n      return object;\n    });\n\n    /**\n     * Creates a function that iterates over `pairs` and invokes the corresponding\n     * function of the first predicate to return truthy. The predicate-function\n     * pairs are invoked with the `this` binding and arguments of the created\n     * function.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {Array} pairs The predicate-function pairs.\n     * @returns {Function} Returns the new composite function.\n     * @example\n     *\n     * var func = _.cond([\n     *   [_.matches({ 'a': 1 }),           _.constant('matches A')],\n     *   [_.conforms({ 'b': _.isNumber }), _.constant('matches B')],\n     *   [_.stubTrue,                      _.constant('no match')]\n     * ]);\n     *\n     * func({ 'a': 1, 'b': 2 });\n     * // => 'matches A'\n     *\n     * func({ 'a': 0, 'b': 1 });\n     * // => 'matches B'\n     *\n     * func({ 'a': '1', 'b': '2' });\n     * // => 'no match'\n     */\n    function cond(pairs) {\n      var length = pairs == null ? 0 : pairs.length,\n          toIteratee = getIteratee();\n\n      pairs = !length ? [] : arrayMap(pairs, function(pair) {\n        if (typeof pair[1] != 'function') {\n          throw new TypeError(FUNC_ERROR_TEXT);\n        }\n        return [toIteratee(pair[0]), pair[1]];\n      });\n\n      return baseRest(function(args) {\n        var index = -1;\n        while (++index < length) {\n          var pair = pairs[index];\n          if (apply(pair[0], this, args)) {\n            return apply(pair[1], this, args);\n          }\n        }\n      });\n    }\n\n    /**\n     * Creates a function that invokes the predicate properties of `source` with\n     * the corresponding property values of a given object, returning `true` if\n     * all predicates return truthy, else `false`.\n     *\n     * **Note:** The created function is equivalent to `_.conformsTo` with\n     * `source` partially applied.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {Object} source The object of property predicates to conform to.\n     * @returns {Function} Returns the new spec function.\n     * @example\n     *\n     * var objects = [\n     *   { 'a': 2, 'b': 1 },\n     *   { 'a': 1, 'b': 2 }\n     * ];\n     *\n     * _.filter(objects, _.conforms({ 'b': function(n) { return n > 1; } }));\n     * // => [{ 'a': 1, 'b': 2 }]\n     */\n    function conforms(source) {\n      return baseConforms(baseClone(source, CLONE_DEEP_FLAG));\n    }\n\n    /**\n     * Creates a function that returns `value`.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.4.0\n     * @category Util\n     * @param {*} value The value to return from the new function.\n     * @returns {Function} Returns the new constant function.\n     * @example\n     *\n     * var objects = _.times(2, _.constant({ 'a': 1 }));\n     *\n     * console.log(objects);\n     * // => [{ 'a': 1 }, { 'a': 1 }]\n     *\n     * console.log(objects[0] === objects[1]);\n     * // => true\n     */\n    function constant(value) {\n      return function() {\n        return value;\n      };\n    }\n\n    /**\n     * Checks `value` to determine whether a default value should be returned in\n     * its place. The `defaultValue` is returned if `value` is `NaN`, `null`,\n     * or `undefined`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.14.0\n     * @category Util\n     * @param {*} value The value to check.\n     * @param {*} defaultValue The default value.\n     * @returns {*} Returns the resolved value.\n     * @example\n     *\n     * _.defaultTo(1, 10);\n     * // => 1\n     *\n     * _.defaultTo(undefined, 10);\n     * // => 10\n     */\n    function defaultTo(value, defaultValue) {\n      return (value == null || value !== value) ? defaultValue : value;\n    }\n\n    /**\n     * Creates a function that returns the result of invoking the given functions\n     * with the `this` binding of the created function, where each successive\n     * invocation is supplied the return value of the previous.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Util\n     * @param {...(Function|Function[])} [funcs] The functions to invoke.\n     * @returns {Function} Returns the new composite function.\n     * @see _.flowRight\n     * @example\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * var addSquare = _.flow([_.add, square]);\n     * addSquare(1, 2);\n     * // => 9\n     */\n    var flow = createFlow();\n\n    /**\n     * This method is like `_.flow` except that it creates a function that\n     * invokes the given functions from right to left.\n     *\n     * @static\n     * @since 3.0.0\n     * @memberOf _\n     * @category Util\n     * @param {...(Function|Function[])} [funcs] The functions to invoke.\n     * @returns {Function} Returns the new composite function.\n     * @see _.flow\n     * @example\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * var addSquare = _.flowRight([square, _.add]);\n     * addSquare(1, 2);\n     * // => 9\n     */\n    var flowRight = createFlow(true);\n\n    /**\n     * This method returns the first argument it receives.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @param {*} value Any value.\n     * @returns {*} Returns `value`.\n     * @example\n     *\n     * var object = { 'a': 1 };\n     *\n     * console.log(_.identity(object) === object);\n     * // => true\n     */\n    function identity(value) {\n      return value;\n    }\n\n    /**\n     * Creates a function that invokes `func` with the arguments of the created\n     * function. If `func` is a property name, the created function returns the\n     * property value for a given element. If `func` is an array or object, the\n     * created function returns `true` for elements that contain the equivalent\n     * source properties, otherwise it returns `false`.\n     *\n     * @static\n     * @since 4.0.0\n     * @memberOf _\n     * @category Util\n     * @param {*} [func=_.identity] The value to convert to a callback.\n     * @returns {Function} Returns the callback.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36, 'active': true },\n     *   { 'user': 'fred',   'age': 40, 'active': false }\n     * ];\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.filter(users, _.iteratee({ 'user': 'barney', 'active': true }));\n     * // => [{ 'user': 'barney', 'age': 36, 'active': true }]\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.filter(users, _.iteratee(['user', 'fred']));\n     * // => [{ 'user': 'fred', 'age': 40 }]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.map(users, _.iteratee('user'));\n     * // => ['barney', 'fred']\n     *\n     * // Create custom iteratee shorthands.\n     * _.iteratee = _.wrap(_.iteratee, function(iteratee, func) {\n     *   return !_.isRegExp(func) ? iteratee(func) : function(string) {\n     *     return func.test(string);\n     *   };\n     * });\n     *\n     * _.filter(['abc', 'def'], /ef/);\n     * // => ['def']\n     */\n    function iteratee(func) {\n      return baseIteratee(typeof func == 'function' ? func : baseClone(func, CLONE_DEEP_FLAG));\n    }\n\n    /**\n     * Creates a function that performs a partial deep comparison between a given\n     * object and `source`, returning `true` if the given object has equivalent\n     * property values, else `false`.\n     *\n     * **Note:** The created function is equivalent to `_.isMatch` with `source`\n     * partially applied.\n     *\n     * Partial comparisons will match empty array and empty object `source`\n     * values against any array or object value, respectively. See `_.isEqual`\n     * for a list of supported value comparisons.\n     *\n     * **Note:** Multiple values can be checked by combining several matchers\n     * using `_.overSome`\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Util\n     * @param {Object} source The object of property values to match.\n     * @returns {Function} Returns the new spec function.\n     * @example\n     *\n     * var objects = [\n     *   { 'a': 1, 'b': 2, 'c': 3 },\n     *   { 'a': 4, 'b': 5, 'c': 6 }\n     * ];\n     *\n     * _.filter(objects, _.matches({ 'a': 4, 'c': 6 }));\n     * // => [{ 'a': 4, 'b': 5, 'c': 6 }]\n     *\n     * // Checking for several possible values\n     * _.filter(objects, _.overSome([_.matches({ 'a': 1 }), _.matches({ 'a': 4 })]));\n     * // => [{ 'a': 1, 'b': 2, 'c': 3 }, { 'a': 4, 'b': 5, 'c': 6 }]\n     */\n    function matches(source) {\n      return baseMatches(baseClone(source, CLONE_DEEP_FLAG));\n    }\n\n    /**\n     * Creates a function that performs a partial deep comparison between the\n     * value at `path` of a given object to `srcValue`, returning `true` if the\n     * object value is equivalent, else `false`.\n     *\n     * **Note:** Partial comparisons will match empty array and empty object\n     * `srcValue` values against any array or object value, respectively. See\n     * `_.isEqual` for a list of supported value comparisons.\n     *\n     * **Note:** Multiple values can be checked by combining several matchers\n     * using `_.overSome`\n     *\n     * @static\n     * @memberOf _\n     * @since 3.2.0\n     * @category Util\n     * @param {Array|string} path The path of the property to get.\n     * @param {*} srcValue The value to match.\n     * @returns {Function} Returns the new spec function.\n     * @example\n     *\n     * var objects = [\n     *   { 'a': 1, 'b': 2, 'c': 3 },\n     *   { 'a': 4, 'b': 5, 'c': 6 }\n     * ];\n     *\n     * _.find(objects, _.matchesProperty('a', 4));\n     * // => { 'a': 4, 'b': 5, 'c': 6 }\n     *\n     * // Checking for several possible values\n     * _.filter(objects, _.overSome([_.matchesProperty('a', 1), _.matchesProperty('a', 4)]));\n     * // => [{ 'a': 1, 'b': 2, 'c': 3 }, { 'a': 4, 'b': 5, 'c': 6 }]\n     */\n    function matchesProperty(path, srcValue) {\n      return baseMatchesProperty(path, baseClone(srcValue, CLONE_DEEP_FLAG));\n    }\n\n    /**\n     * Creates a function that invokes the method at `path` of a given object.\n     * Any additional arguments are provided to the invoked method.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.7.0\n     * @category Util\n     * @param {Array|string} path The path of the method to invoke.\n     * @param {...*} [args] The arguments to invoke the method with.\n     * @returns {Function} Returns the new invoker function.\n     * @example\n     *\n     * var objects = [\n     *   { 'a': { 'b': _.constant(2) } },\n     *   { 'a': { 'b': _.constant(1) } }\n     * ];\n     *\n     * _.map(objects, _.method('a.b'));\n     * // => [2, 1]\n     *\n     * _.map(objects, _.method(['a', 'b']));\n     * // => [2, 1]\n     */\n    var method = baseRest(function(path, args) {\n      return function(object) {\n        return baseInvoke(object, path, args);\n      };\n    });\n\n    /**\n     * The opposite of `_.method`; this method creates a function that invokes\n     * the method at a given path of `object`. Any additional arguments are\n     * provided to the invoked method.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.7.0\n     * @category Util\n     * @param {Object} object The object to query.\n     * @param {...*} [args] The arguments to invoke the method with.\n     * @returns {Function} Returns the new invoker function.\n     * @example\n     *\n     * var array = _.times(3, _.constant),\n     *     object = { 'a': array, 'b': array, 'c': array };\n     *\n     * _.map(['a[2]', 'c[0]'], _.methodOf(object));\n     * // => [2, 0]\n     *\n     * _.map([['a', '2'], ['c', '0']], _.methodOf(object));\n     * // => [2, 0]\n     */\n    var methodOf = baseRest(function(object, args) {\n      return function(path) {\n        return baseInvoke(object, path, args);\n      };\n    });\n\n    /**\n     * Adds all own enumerable string keyed function properties of a source\n     * object to the destination object. If `object` is a function, then methods\n     * are added to its prototype as well.\n     *\n     * **Note:** Use `_.runInContext` to create a pristine `lodash` function to\n     * avoid conflicts caused by modifying the original.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @param {Function|Object} [object=lodash] The destination object.\n     * @param {Object} source The object of functions to add.\n     * @param {Object} [options={}] The options object.\n     * @param {boolean} [options.chain=true] Specify whether mixins are chainable.\n     * @returns {Function|Object} Returns `object`.\n     * @example\n     *\n     * function vowels(string) {\n     *   return _.filter(string, function(v) {\n     *     return /[aeiou]/i.test(v);\n     *   });\n     * }\n     *\n     * _.mixin({ 'vowels': vowels });\n     * _.vowels('fred');\n     * // => ['e']\n     *\n     * _('fred').vowels().value();\n     * // => ['e']\n     *\n     * _.mixin({ 'vowels': vowels }, { 'chain': false });\n     * _('fred').vowels();\n     * // => ['e']\n     */\n    function mixin(object, source, options) {\n      var props = keys(source),\n          methodNames = baseFunctions(source, props);\n\n      if (options == null &&\n          !(isObject(source) && (methodNames.length || !props.length))) {\n        options = source;\n        source = object;\n        object = this;\n        methodNames = baseFunctions(source, keys(source));\n      }\n      var chain = !(isObject(options) && 'chain' in options) || !!options.chain,\n          isFunc = isFunction(object);\n\n      arrayEach(methodNames, function(methodName) {\n        var func = source[methodName];\n        object[methodName] = func;\n        if (isFunc) {\n          object.prototype[methodName] = function() {\n            var chainAll = this.__chain__;\n            if (chain || chainAll) {\n              var result = object(this.__wrapped__),\n                  actions = result.__actions__ = copyArray(this.__actions__);\n\n              actions.push({ 'func': func, 'args': arguments, 'thisArg': object });\n              result.__chain__ = chainAll;\n              return result;\n            }\n            return func.apply(object, arrayPush([this.value()], arguments));\n          };\n        }\n      });\n\n      return object;\n    }\n\n    /**\n     * Reverts the `_` variable to its previous value and returns a reference to\n     * the `lodash` function.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @returns {Function} Returns the `lodash` function.\n     * @example\n     *\n     * var lodash = _.noConflict();\n     */\n    function noConflict() {\n      if (root._ === this) {\n        root._ = oldDash;\n      }\n      return this;\n    }\n\n    /**\n     * This method returns `undefined`.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.3.0\n     * @category Util\n     * @example\n     *\n     * _.times(2, _.noop);\n     * // => [undefined, undefined]\n     */\n    function noop() {\n      // No operation performed.\n    }\n\n    /**\n     * Creates a function that gets the argument at index `n`. If `n` is negative,\n     * the nth argument from the end is returned.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {number} [n=0] The index of the argument to return.\n     * @returns {Function} Returns the new pass-thru function.\n     * @example\n     *\n     * var func = _.nthArg(1);\n     * func('a', 'b', 'c', 'd');\n     * // => 'b'\n     *\n     * var func = _.nthArg(-2);\n     * func('a', 'b', 'c', 'd');\n     * // => 'c'\n     */\n    function nthArg(n) {\n      n = toInteger(n);\n      return baseRest(function(args) {\n        return baseNth(args, n);\n      });\n    }\n\n    /**\n     * Creates a function that invokes `iteratees` with the arguments it receives\n     * and returns their results.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {...(Function|Function[])} [iteratees=[_.identity]]\n     *  The iteratees to invoke.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var func = _.over([Math.max, Math.min]);\n     *\n     * func(1, 2, 3, 4);\n     * // => [4, 1]\n     */\n    var over = createOver(arrayMap);\n\n    /**\n     * Creates a function that checks if **all** of the `predicates` return\n     * truthy when invoked with the arguments it receives.\n     *\n     * Following shorthands are possible for providing predicates.\n     * Pass an `Object` and it will be used as an parameter for `_.matches` to create the predicate.\n     * Pass an `Array` of parameters for `_.matchesProperty` and the predicate will be created using them.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {...(Function|Function[])} [predicates=[_.identity]]\n     *  The predicates to check.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var func = _.overEvery([Boolean, isFinite]);\n     *\n     * func('1');\n     * // => true\n     *\n     * func(null);\n     * // => false\n     *\n     * func(NaN);\n     * // => false\n     */\n    var overEvery = createOver(arrayEvery);\n\n    /**\n     * Creates a function that checks if **any** of the `predicates` return\n     * truthy when invoked with the arguments it receives.\n     *\n     * Following shorthands are possible for providing predicates.\n     * Pass an `Object` and it will be used as an parameter for `_.matches` to create the predicate.\n     * Pass an `Array` of parameters for `_.matchesProperty` and the predicate will be created using them.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {...(Function|Function[])} [predicates=[_.identity]]\n     *  The predicates to check.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var func = _.overSome([Boolean, isFinite]);\n     *\n     * func('1');\n     * // => true\n     *\n     * func(null);\n     * // => true\n     *\n     * func(NaN);\n     * // => false\n     *\n     * var matchesFunc = _.overSome([{ 'a': 1 }, { 'a': 2 }])\n     * var matchesPropertyFunc = _.overSome([['a', 1], ['a', 2]])\n     */\n    var overSome = createOver(arraySome);\n\n    /**\n     * Creates a function that returns the value at `path` of a given object.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.4.0\n     * @category Util\n     * @param {Array|string} path The path of the property to get.\n     * @returns {Function} Returns the new accessor function.\n     * @example\n     *\n     * var objects = [\n     *   { 'a': { 'b': 2 } },\n     *   { 'a': { 'b': 1 } }\n     * ];\n     *\n     * _.map(objects, _.property('a.b'));\n     * // => [2, 1]\n     *\n     * _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b');\n     * // => [1, 2]\n     */\n    function property(path) {\n      return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path);\n    }\n\n    /**\n     * The opposite of `_.property`; this method creates a function that returns\n     * the value at a given path of `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Util\n     * @param {Object} object The object to query.\n     * @returns {Function} Returns the new accessor function.\n     * @example\n     *\n     * var array = [0, 1, 2],\n     *     object = { 'a': array, 'b': array, 'c': array };\n     *\n     * _.map(['a[2]', 'c[0]'], _.propertyOf(object));\n     * // => [2, 0]\n     *\n     * _.map([['a', '2'], ['c', '0']], _.propertyOf(object));\n     * // => [2, 0]\n     */\n    function propertyOf(object) {\n      return function(path) {\n        return object == null ? undefined : baseGet(object, path);\n      };\n    }\n\n    /**\n     * Creates an array of numbers (positive and/or negative) progressing from\n     * `start` up to, but not including, `end`. A step of `-1` is used if a negative\n     * `start` is specified without an `end` or `step`. If `end` is not specified,\n     * it's set to `start` with `start` then set to `0`.\n     *\n     * **Note:** JavaScript follows the IEEE-754 standard for resolving\n     * floating-point values which can produce unexpected results.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @param {number} [start=0] The start of the range.\n     * @param {number} end The end of the range.\n     * @param {number} [step=1] The value to increment or decrement by.\n     * @returns {Array} Returns the range of numbers.\n     * @see _.inRange, _.rangeRight\n     * @example\n     *\n     * _.range(4);\n     * // => [0, 1, 2, 3]\n     *\n     * _.range(-4);\n     * // => [0, -1, -2, -3]\n     *\n     * _.range(1, 5);\n     * // => [1, 2, 3, 4]\n     *\n     * _.range(0, 20, 5);\n     * // => [0, 5, 10, 15]\n     *\n     * _.range(0, -4, -1);\n     * // => [0, -1, -2, -3]\n     *\n     * _.range(1, 4, 0);\n     * // => [1, 1, 1]\n     *\n     * _.range(0);\n     * // => []\n     */\n    var range = createRange();\n\n    /**\n     * This method is like `_.range` except that it populates values in\n     * descending order.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {number} [start=0] The start of the range.\n     * @param {number} end The end of the range.\n     * @param {number} [step=1] The value to increment or decrement by.\n     * @returns {Array} Returns the range of numbers.\n     * @see _.inRange, _.range\n     * @example\n     *\n     * _.rangeRight(4);\n     * // => [3, 2, 1, 0]\n     *\n     * _.rangeRight(-4);\n     * // => [-3, -2, -1, 0]\n     *\n     * _.rangeRight(1, 5);\n     * // => [4, 3, 2, 1]\n     *\n     * _.rangeRight(0, 20, 5);\n     * // => [15, 10, 5, 0]\n     *\n     * _.rangeRight(0, -4, -1);\n     * // => [-3, -2, -1, 0]\n     *\n     * _.rangeRight(1, 4, 0);\n     * // => [1, 1, 1]\n     *\n     * _.rangeRight(0);\n     * // => []\n     */\n    var rangeRight = createRange(true);\n\n    /**\n     * This method returns a new empty array.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.13.0\n     * @category Util\n     * @returns {Array} Returns the new empty array.\n     * @example\n     *\n     * var arrays = _.times(2, _.stubArray);\n     *\n     * console.log(arrays);\n     * // => [[], []]\n     *\n     * console.log(arrays[0] === arrays[1]);\n     * // => false\n     */\n    function stubArray() {\n      return [];\n    }\n\n    /**\n     * This method returns `false`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.13.0\n     * @category Util\n     * @returns {boolean} Returns `false`.\n     * @example\n     *\n     * _.times(2, _.stubFalse);\n     * // => [false, false]\n     */\n    function stubFalse() {\n      return false;\n    }\n\n    /**\n     * This method returns a new empty object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.13.0\n     * @category Util\n     * @returns {Object} Returns the new empty object.\n     * @example\n     *\n     * var objects = _.times(2, _.stubObject);\n     *\n     * console.log(objects);\n     * // => [{}, {}]\n     *\n     * console.log(objects[0] === objects[1]);\n     * // => false\n     */\n    function stubObject() {\n      return {};\n    }\n\n    /**\n     * This method returns an empty string.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.13.0\n     * @category Util\n     * @returns {string} Returns the empty string.\n     * @example\n     *\n     * _.times(2, _.stubString);\n     * // => ['', '']\n     */\n    function stubString() {\n      return '';\n    }\n\n    /**\n     * This method returns `true`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.13.0\n     * @category Util\n     * @returns {boolean} Returns `true`.\n     * @example\n     *\n     * _.times(2, _.stubTrue);\n     * // => [true, true]\n     */\n    function stubTrue() {\n      return true;\n    }\n\n    /**\n     * Invokes the iteratee `n` times, returning an array of the results of\n     * each invocation. The iteratee is invoked with one argument; (index).\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @param {number} n The number of times to invoke `iteratee`.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the array of results.\n     * @example\n     *\n     * _.times(3, String);\n     * // => ['0', '1', '2']\n     *\n     *  _.times(4, _.constant(0));\n     * // => [0, 0, 0, 0]\n     */\n    function times(n, iteratee) {\n      n = toInteger(n);\n      if (n < 1 || n > MAX_SAFE_INTEGER) {\n        return [];\n      }\n      var index = MAX_ARRAY_LENGTH,\n          length = nativeMin(n, MAX_ARRAY_LENGTH);\n\n      iteratee = getIteratee(iteratee);\n      n -= MAX_ARRAY_LENGTH;\n\n      var result = baseTimes(length, iteratee);\n      while (++index < n) {\n        iteratee(index);\n      }\n      return result;\n    }\n\n    /**\n     * Converts `value` to a property path array.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {*} value The value to convert.\n     * @returns {Array} Returns the new property path array.\n     * @example\n     *\n     * _.toPath('a.b.c');\n     * // => ['a', 'b', 'c']\n     *\n     * _.toPath('a[0].b.c');\n     * // => ['a', '0', 'b', 'c']\n     */\n    function toPath(value) {\n      if (isArray(value)) {\n        return arrayMap(value, toKey);\n      }\n      return isSymbol(value) ? [value] : copyArray(stringToPath(toString(value)));\n    }\n\n    /**\n     * Generates a unique ID. If `prefix` is given, the ID is appended to it.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @param {string} [prefix=''] The value to prefix the ID with.\n     * @returns {string} Returns the unique ID.\n     * @example\n     *\n     * _.uniqueId('contact_');\n     * // => 'contact_104'\n     *\n     * _.uniqueId();\n     * // => '105'\n     */\n    function uniqueId(prefix) {\n      var id = ++idCounter;\n      return toString(prefix) + id;\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Adds two numbers.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.4.0\n     * @category Math\n     * @param {number} augend The first number in an addition.\n     * @param {number} addend The second number in an addition.\n     * @returns {number} Returns the total.\n     * @example\n     *\n     * _.add(6, 4);\n     * // => 10\n     */\n    var add = createMathOperation(function(augend, addend) {\n      return augend + addend;\n    }, 0);\n\n    /**\n     * Computes `number` rounded up to `precision`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.10.0\n     * @category Math\n     * @param {number} number The number to round up.\n     * @param {number} [precision=0] The precision to round up to.\n     * @returns {number} Returns the rounded up number.\n     * @example\n     *\n     * _.ceil(4.006);\n     * // => 5\n     *\n     * _.ceil(6.004, 2);\n     * // => 6.01\n     *\n     * _.ceil(6040, -2);\n     * // => 6100\n     */\n    var ceil = createRound('ceil');\n\n    /**\n     * Divide two numbers.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.7.0\n     * @category Math\n     * @param {number} dividend The first number in a division.\n     * @param {number} divisor The second number in a division.\n     * @returns {number} Returns the quotient.\n     * @example\n     *\n     * _.divide(6, 4);\n     * // => 1.5\n     */\n    var divide = createMathOperation(function(dividend, divisor) {\n      return dividend / divisor;\n    }, 1);\n\n    /**\n     * Computes `number` rounded down to `precision`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.10.0\n     * @category Math\n     * @param {number} number The number to round down.\n     * @param {number} [precision=0] The precision to round down to.\n     * @returns {number} Returns the rounded down number.\n     * @example\n     *\n     * _.floor(4.006);\n     * // => 4\n     *\n     * _.floor(0.046, 2);\n     * // => 0.04\n     *\n     * _.floor(4060, -2);\n     * // => 4000\n     */\n    var floor = createRound('floor');\n\n    /**\n     * Computes the maximum value of `array`. If `array` is empty or falsey,\n     * `undefined` is returned.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @returns {*} Returns the maximum value.\n     * @example\n     *\n     * _.max([4, 2, 8, 6]);\n     * // => 8\n     *\n     * _.max([]);\n     * // => undefined\n     */\n    function max(array) {\n      return (array && array.length)\n        ? baseExtremum(array, identity, baseGt)\n        : undefined;\n    }\n\n    /**\n     * This method is like `_.max` except that it accepts `iteratee` which is\n     * invoked for each element in `array` to generate the criterion by which\n     * the value is ranked. The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {*} Returns the maximum value.\n     * @example\n     *\n     * var objects = [{ 'n': 1 }, { 'n': 2 }];\n     *\n     * _.maxBy(objects, function(o) { return o.n; });\n     * // => { 'n': 2 }\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.maxBy(objects, 'n');\n     * // => { 'n': 2 }\n     */\n    function maxBy(array, iteratee) {\n      return (array && array.length)\n        ? baseExtremum(array, getIteratee(iteratee, 2), baseGt)\n        : undefined;\n    }\n\n    /**\n     * Computes the mean of the values in `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @returns {number} Returns the mean.\n     * @example\n     *\n     * _.mean([4, 2, 8, 6]);\n     * // => 5\n     */\n    function mean(array) {\n      return baseMean(array, identity);\n    }\n\n    /**\n     * This method is like `_.mean` except that it accepts `iteratee` which is\n     * invoked for each element in `array` to generate the value to be averaged.\n     * The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.7.0\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {number} Returns the mean.\n     * @example\n     *\n     * var objects = [{ 'n': 4 }, { 'n': 2 }, { 'n': 8 }, { 'n': 6 }];\n     *\n     * _.meanBy(objects, function(o) { return o.n; });\n     * // => 5\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.meanBy(objects, 'n');\n     * // => 5\n     */\n    function meanBy(array, iteratee) {\n      return baseMean(array, getIteratee(iteratee, 2));\n    }\n\n    /**\n     * Computes the minimum value of `array`. If `array` is empty or falsey,\n     * `undefined` is returned.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @returns {*} Returns the minimum value.\n     * @example\n     *\n     * _.min([4, 2, 8, 6]);\n     * // => 2\n     *\n     * _.min([]);\n     * // => undefined\n     */\n    function min(array) {\n      return (array && array.length)\n        ? baseExtremum(array, identity, baseLt)\n        : undefined;\n    }\n\n    /**\n     * This method is like `_.min` except that it accepts `iteratee` which is\n     * invoked for each element in `array` to generate the criterion by which\n     * the value is ranked. The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {*} Returns the minimum value.\n     * @example\n     *\n     * var objects = [{ 'n': 1 }, { 'n': 2 }];\n     *\n     * _.minBy(objects, function(o) { return o.n; });\n     * // => { 'n': 1 }\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.minBy(objects, 'n');\n     * // => { 'n': 1 }\n     */\n    function minBy(array, iteratee) {\n      return (array && array.length)\n        ? baseExtremum(array, getIteratee(iteratee, 2), baseLt)\n        : undefined;\n    }\n\n    /**\n     * Multiply two numbers.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.7.0\n     * @category Math\n     * @param {number} multiplier The first number in a multiplication.\n     * @param {number} multiplicand The second number in a multiplication.\n     * @returns {number} Returns the product.\n     * @example\n     *\n     * _.multiply(6, 4);\n     * // => 24\n     */\n    var multiply = createMathOperation(function(multiplier, multiplicand) {\n      return multiplier * multiplicand;\n    }, 1);\n\n    /**\n     * Computes `number` rounded to `precision`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.10.0\n     * @category Math\n     * @param {number} number The number to round.\n     * @param {number} [precision=0] The precision to round to.\n     * @returns {number} Returns the rounded number.\n     * @example\n     *\n     * _.round(4.006);\n     * // => 4\n     *\n     * _.round(4.006, 2);\n     * // => 4.01\n     *\n     * _.round(4060, -2);\n     * // => 4100\n     */\n    var round = createRound('round');\n\n    /**\n     * Subtract two numbers.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Math\n     * @param {number} minuend The first number in a subtraction.\n     * @param {number} subtrahend The second number in a subtraction.\n     * @returns {number} Returns the difference.\n     * @example\n     *\n     * _.subtract(6, 4);\n     * // => 2\n     */\n    var subtract = createMathOperation(function(minuend, subtrahend) {\n      return minuend - subtrahend;\n    }, 0);\n\n    /**\n     * Computes the sum of the values in `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.4.0\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @returns {number} Returns the sum.\n     * @example\n     *\n     * _.sum([4, 2, 8, 6]);\n     * // => 20\n     */\n    function sum(array) {\n      return (array && array.length)\n        ? baseSum(array, identity)\n        : 0;\n    }\n\n    /**\n     * This method is like `_.sum` except that it accepts `iteratee` which is\n     * invoked for each element in `array` to generate the value to be summed.\n     * The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {number} Returns the sum.\n     * @example\n     *\n     * var objects = [{ 'n': 4 }, { 'n': 2 }, { 'n': 8 }, { 'n': 6 }];\n     *\n     * _.sumBy(objects, function(o) { return o.n; });\n     * // => 20\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.sumBy(objects, 'n');\n     * // => 20\n     */\n    function sumBy(array, iteratee) {\n      return (array && array.length)\n        ? baseSum(array, getIteratee(iteratee, 2))\n        : 0;\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    // Add methods that return wrapped values in chain sequences.\n    lodash.after = after;\n    lodash.ary = ary;\n    lodash.assign = assign;\n    lodash.assignIn = assignIn;\n    lodash.assignInWith = assignInWith;\n    lodash.assignWith = assignWith;\n    lodash.at = at;\n    lodash.before = before;\n    lodash.bind = bind;\n    lodash.bindAll = bindAll;\n    lodash.bindKey = bindKey;\n    lodash.castArray = castArray;\n    lodash.chain = chain;\n    lodash.chunk = chunk;\n    lodash.compact = compact;\n    lodash.concat = concat;\n    lodash.cond = cond;\n    lodash.conforms = conforms;\n    lodash.constant = constant;\n    lodash.countBy = countBy;\n    lodash.create = create;\n    lodash.curry = curry;\n    lodash.curryRight = curryRight;\n    lodash.debounce = debounce;\n    lodash.defaults = defaults;\n    lodash.defaultsDeep = defaultsDeep;\n    lodash.defer = defer;\n    lodash.delay = delay;\n    lodash.difference = difference;\n    lodash.differenceBy = differenceBy;\n    lodash.differenceWith = differenceWith;\n    lodash.drop = drop;\n    lodash.dropRight = dropRight;\n    lodash.dropRightWhile = dropRightWhile;\n    lodash.dropWhile = dropWhile;\n    lodash.fill = fill;\n    lodash.filter = filter;\n    lodash.flatMap = flatMap;\n    lodash.flatMapDeep = flatMapDeep;\n    lodash.flatMapDepth = flatMapDepth;\n    lodash.flatten = flatten;\n    lodash.flattenDeep = flattenDeep;\n    lodash.flattenDepth = flattenDepth;\n    lodash.flip = flip;\n    lodash.flow = flow;\n    lodash.flowRight = flowRight;\n    lodash.fromPairs = fromPairs;\n    lodash.functions = functions;\n    lodash.functionsIn = functionsIn;\n    lodash.groupBy = groupBy;\n    lodash.initial = initial;\n    lodash.intersection = intersection;\n    lodash.intersectionBy = intersectionBy;\n    lodash.intersectionWith = intersectionWith;\n    lodash.invert = invert;\n    lodash.invertBy = invertBy;\n    lodash.invokeMap = invokeMap;\n    lodash.iteratee = iteratee;\n    lodash.keyBy = keyBy;\n    lodash.keys = keys;\n    lodash.keysIn = keysIn;\n    lodash.map = map;\n    lodash.mapKeys = mapKeys;\n    lodash.mapValues = mapValues;\n    lodash.matches = matches;\n    lodash.matchesProperty = matchesProperty;\n    lodash.memoize = memoize;\n    lodash.merge = merge;\n    lodash.mergeWith = mergeWith;\n    lodash.method = method;\n    lodash.methodOf = methodOf;\n    lodash.mixin = mixin;\n    lodash.negate = negate;\n    lodash.nthArg = nthArg;\n    lodash.omit = omit;\n    lodash.omitBy = omitBy;\n    lodash.once = once;\n    lodash.orderBy = orderBy;\n    lodash.over = over;\n    lodash.overArgs = overArgs;\n    lodash.overEvery = overEvery;\n    lodash.overSome = overSome;\n    lodash.partial = partial;\n    lodash.partialRight = partialRight;\n    lodash.partition = partition;\n    lodash.pick = pick;\n    lodash.pickBy = pickBy;\n    lodash.property = property;\n    lodash.propertyOf = propertyOf;\n    lodash.pull = pull;\n    lodash.pullAll = pullAll;\n    lodash.pullAllBy = pullAllBy;\n    lodash.pullAllWith = pullAllWith;\n    lodash.pullAt = pullAt;\n    lodash.range = range;\n    lodash.rangeRight = rangeRight;\n    lodash.rearg = rearg;\n    lodash.reject = reject;\n    lodash.remove = remove;\n    lodash.rest = rest;\n    lodash.reverse = reverse;\n    lodash.sampleSize = sampleSize;\n    lodash.set = set;\n    lodash.setWith = setWith;\n    lodash.shuffle = shuffle;\n    lodash.slice = slice;\n    lodash.sortBy = sortBy;\n    lodash.sortedUniq = sortedUniq;\n    lodash.sortedUniqBy = sortedUniqBy;\n    lodash.split = split;\n    lodash.spread = spread;\n    lodash.tail = tail;\n    lodash.take = take;\n    lodash.takeRight = takeRight;\n    lodash.takeRightWhile = takeRightWhile;\n    lodash.takeWhile = takeWhile;\n    lodash.tap = tap;\n    lodash.throttle = throttle;\n    lodash.thru = thru;\n    lodash.toArray = toArray;\n    lodash.toPairs = toPairs;\n    lodash.toPairsIn = toPairsIn;\n    lodash.toPath = toPath;\n    lodash.toPlainObject = toPlainObject;\n    lodash.transform = transform;\n    lodash.unary = unary;\n    lodash.union = union;\n    lodash.unionBy = unionBy;\n    lodash.unionWith = unionWith;\n    lodash.uniq = uniq;\n    lodash.uniqBy = uniqBy;\n    lodash.uniqWith = uniqWith;\n    lodash.unset = unset;\n    lodash.unzip = unzip;\n    lodash.unzipWith = unzipWith;\n    lodash.update = update;\n    lodash.updateWith = updateWith;\n    lodash.values = values;\n    lodash.valuesIn = valuesIn;\n    lodash.without = without;\n    lodash.words = words;\n    lodash.wrap = wrap;\n    lodash.xor = xor;\n    lodash.xorBy = xorBy;\n    lodash.xorWith = xorWith;\n    lodash.zip = zip;\n    lodash.zipObject = zipObject;\n    lodash.zipObjectDeep = zipObjectDeep;\n    lodash.zipWith = zipWith;\n\n    // Add aliases.\n    lodash.entries = toPairs;\n    lodash.entriesIn = toPairsIn;\n    lodash.extend = assignIn;\n    lodash.extendWith = assignInWith;\n\n    // Add methods to `lodash.prototype`.\n    mixin(lodash, lodash);\n\n    /*------------------------------------------------------------------------*/\n\n    // Add methods that return unwrapped values in chain sequences.\n    lodash.add = add;\n    lodash.attempt = attempt;\n    lodash.camelCase = camelCase;\n    lodash.capitalize = capitalize;\n    lodash.ceil = ceil;\n    lodash.clamp = clamp;\n    lodash.clone = clone;\n    lodash.cloneDeep = cloneDeep;\n    lodash.cloneDeepWith = cloneDeepWith;\n    lodash.cloneWith = cloneWith;\n    lodash.conformsTo = conformsTo;\n    lodash.deburr = deburr;\n    lodash.defaultTo = defaultTo;\n    lodash.divide = divide;\n    lodash.endsWith = endsWith;\n    lodash.eq = eq;\n    lodash.escape = escape;\n    lodash.escapeRegExp = escapeRegExp;\n    lodash.every = every;\n    lodash.find = find;\n    lodash.findIndex = findIndex;\n    lodash.findKey = findKey;\n    lodash.findLast = findLast;\n    lodash.findLastIndex = findLastIndex;\n    lodash.findLastKey = findLastKey;\n    lodash.floor = floor;\n    lodash.forEach = forEach;\n    lodash.forEachRight = forEachRight;\n    lodash.forIn = forIn;\n    lodash.forInRight = forInRight;\n    lodash.forOwn = forOwn;\n    lodash.forOwnRight = forOwnRight;\n    lodash.get = get;\n    lodash.gt = gt;\n    lodash.gte = gte;\n    lodash.has = has;\n    lodash.hasIn = hasIn;\n    lodash.head = head;\n    lodash.identity = identity;\n    lodash.includes = includes;\n    lodash.indexOf = indexOf;\n    lodash.inRange = inRange;\n    lodash.invoke = invoke;\n    lodash.isArguments = isArguments;\n    lodash.isArray = isArray;\n    lodash.isArrayBuffer = isArrayBuffer;\n    lodash.isArrayLike = isArrayLike;\n    lodash.isArrayLikeObject = isArrayLikeObject;\n    lodash.isBoolean = isBoolean;\n    lodash.isBuffer = isBuffer;\n    lodash.isDate = isDate;\n    lodash.isElement = isElement;\n    lodash.isEmpty = isEmpty;\n    lodash.isEqual = isEqual;\n    lodash.isEqualWith = isEqualWith;\n    lodash.isError = isError;\n    lodash.isFinite = isFinite;\n    lodash.isFunction = isFunction;\n    lodash.isInteger = isInteger;\n    lodash.isLength = isLength;\n    lodash.isMap = isMap;\n    lodash.isMatch = isMatch;\n    lodash.isMatchWith = isMatchWith;\n    lodash.isNaN = isNaN;\n    lodash.isNative = isNative;\n    lodash.isNil = isNil;\n    lodash.isNull = isNull;\n    lodash.isNumber = isNumber;\n    lodash.isObject = isObject;\n    lodash.isObjectLike = isObjectLike;\n    lodash.isPlainObject = isPlainObject;\n    lodash.isRegExp = isRegExp;\n    lodash.isSafeInteger = isSafeInteger;\n    lodash.isSet = isSet;\n    lodash.isString = isString;\n    lodash.isSymbol = isSymbol;\n    lodash.isTypedArray = isTypedArray;\n    lodash.isUndefined = isUndefined;\n    lodash.isWeakMap = isWeakMap;\n    lodash.isWeakSet = isWeakSet;\n    lodash.join = join;\n    lodash.kebabCase = kebabCase;\n    lodash.last = last;\n    lodash.lastIndexOf = lastIndexOf;\n    lodash.lowerCase = lowerCase;\n    lodash.lowerFirst = lowerFirst;\n    lodash.lt = lt;\n    lodash.lte = lte;\n    lodash.max = max;\n    lodash.maxBy = maxBy;\n    lodash.mean = mean;\n    lodash.meanBy = meanBy;\n    lodash.min = min;\n    lodash.minBy = minBy;\n    lodash.stubArray = stubArray;\n    lodash.stubFalse = stubFalse;\n    lodash.stubObject = stubObject;\n    lodash.stubString = stubString;\n    lodash.stubTrue = stubTrue;\n    lodash.multiply = multiply;\n    lodash.nth = nth;\n    lodash.noConflict = noConflict;\n    lodash.noop = noop;\n    lodash.now = now;\n    lodash.pad = pad;\n    lodash.padEnd = padEnd;\n    lodash.padStart = padStart;\n    lodash.parseInt = parseInt;\n    lodash.random = random;\n    lodash.reduce = reduce;\n    lodash.reduceRight = reduceRight;\n    lodash.repeat = repeat;\n    lodash.replace = replace;\n    lodash.result = result;\n    lodash.round = round;\n    lodash.runInContext = runInContext;\n    lodash.sample = sample;\n    lodash.size = size;\n    lodash.snakeCase = snakeCase;\n    lodash.some = some;\n    lodash.sortedIndex = sortedIndex;\n    lodash.sortedIndexBy = sortedIndexBy;\n    lodash.sortedIndexOf = sortedIndexOf;\n    lodash.sortedLastIndex = sortedLastIndex;\n    lodash.sortedLastIndexBy = sortedLastIndexBy;\n    lodash.sortedLastIndexOf = sortedLastIndexOf;\n    lodash.startCase = startCase;\n    lodash.startsWith = startsWith;\n    lodash.subtract = subtract;\n    lodash.sum = sum;\n    lodash.sumBy = sumBy;\n    lodash.template = template;\n    lodash.times = times;\n    lodash.toFinite = toFinite;\n    lodash.toInteger = toInteger;\n    lodash.toLength = toLength;\n    lodash.toLower = toLower;\n    lodash.toNumber = toNumber;\n    lodash.toSafeInteger = toSafeInteger;\n    lodash.toString = toString;\n    lodash.toUpper = toUpper;\n    lodash.trim = trim;\n    lodash.trimEnd = trimEnd;\n    lodash.trimStart = trimStart;\n    lodash.truncate = truncate;\n    lodash.unescape = unescape;\n    lodash.uniqueId = uniqueId;\n    lodash.upperCase = upperCase;\n    lodash.upperFirst = upperFirst;\n\n    // Add aliases.\n    lodash.each = forEach;\n    lodash.eachRight = forEachRight;\n    lodash.first = head;\n\n    mixin(lodash, (function() {\n      var source = {};\n      baseForOwn(lodash, function(func, methodName) {\n        if (!hasOwnProperty.call(lodash.prototype, methodName)) {\n          source[methodName] = func;\n        }\n      });\n      return source;\n    }()), { 'chain': false });\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * The semantic version number.\n     *\n     * @static\n     * @memberOf _\n     * @type {string}\n     */\n    lodash.VERSION = VERSION;\n\n    // Assign default placeholders.\n    arrayEach(['bind', 'bindKey', 'curry', 'curryRight', 'partial', 'partialRight'], function(methodName) {\n      lodash[methodName].placeholder = lodash;\n    });\n\n    // Add `LazyWrapper` methods for `_.drop` and `_.take` variants.\n    arrayEach(['drop', 'take'], function(methodName, index) {\n      LazyWrapper.prototype[methodName] = function(n) {\n        n = n === undefined ? 1 : nativeMax(toInteger(n), 0);\n\n        var result = (this.__filtered__ && !index)\n          ? new LazyWrapper(this)\n          : this.clone();\n\n        if (result.__filtered__) {\n          result.__takeCount__ = nativeMin(n, result.__takeCount__);\n        } else {\n          result.__views__.push({\n            'size': nativeMin(n, MAX_ARRAY_LENGTH),\n            'type': methodName + (result.__dir__ < 0 ? 'Right' : '')\n          });\n        }\n        return result;\n      };\n\n      LazyWrapper.prototype[methodName + 'Right'] = function(n) {\n        return this.reverse()[methodName](n).reverse();\n      };\n    });\n\n    // Add `LazyWrapper` methods that accept an `iteratee` value.\n    arrayEach(['filter', 'map', 'takeWhile'], function(methodName, index) {\n      var type = index + 1,\n          isFilter = type == LAZY_FILTER_FLAG || type == LAZY_WHILE_FLAG;\n\n      LazyWrapper.prototype[methodName] = function(iteratee) {\n        var result = this.clone();\n        result.__iteratees__.push({\n          'iteratee': getIteratee(iteratee, 3),\n          'type': type\n        });\n        result.__filtered__ = result.__filtered__ || isFilter;\n        return result;\n      };\n    });\n\n    // Add `LazyWrapper` methods for `_.head` and `_.last`.\n    arrayEach(['head', 'last'], function(methodName, index) {\n      var takeName = 'take' + (index ? 'Right' : '');\n\n      LazyWrapper.prototype[methodName] = function() {\n        return this[takeName](1).value()[0];\n      };\n    });\n\n    // Add `LazyWrapper` methods for `_.initial` and `_.tail`.\n    arrayEach(['initial', 'tail'], function(methodName, index) {\n      var dropName = 'drop' + (index ? '' : 'Right');\n\n      LazyWrapper.prototype[methodName] = function() {\n        return this.__filtered__ ? new LazyWrapper(this) : this[dropName](1);\n      };\n    });\n\n    LazyWrapper.prototype.compact = function() {\n      return this.filter(identity);\n    };\n\n    LazyWrapper.prototype.find = function(predicate) {\n      return this.filter(predicate).head();\n    };\n\n    LazyWrapper.prototype.findLast = function(predicate) {\n      return this.reverse().find(predicate);\n    };\n\n    LazyWrapper.prototype.invokeMap = baseRest(function(path, args) {\n      if (typeof path == 'function') {\n        return new LazyWrapper(this);\n      }\n      return this.map(function(value) {\n        return baseInvoke(value, path, args);\n      });\n    });\n\n    LazyWrapper.prototype.reject = function(predicate) {\n      return this.filter(negate(getIteratee(predicate)));\n    };\n\n    LazyWrapper.prototype.slice = function(start, end) {\n      start = toInteger(start);\n\n      var result = this;\n      if (result.__filtered__ && (start > 0 || end < 0)) {\n        return new LazyWrapper(result);\n      }\n      if (start < 0) {\n        result = result.takeRight(-start);\n      } else if (start) {\n        result = result.drop(start);\n      }\n      if (end !== undefined) {\n        end = toInteger(end);\n        result = end < 0 ? result.dropRight(-end) : result.take(end - start);\n      }\n      return result;\n    };\n\n    LazyWrapper.prototype.takeRightWhile = function(predicate) {\n      return this.reverse().takeWhile(predicate).reverse();\n    };\n\n    LazyWrapper.prototype.toArray = function() {\n      return this.take(MAX_ARRAY_LENGTH);\n    };\n\n    // Add `LazyWrapper` methods to `lodash.prototype`.\n    baseForOwn(LazyWrapper.prototype, function(func, methodName) {\n      var checkIteratee = /^(?:filter|find|map|reject)|While$/.test(methodName),\n          isTaker = /^(?:head|last)$/.test(methodName),\n          lodashFunc = lodash[isTaker ? ('take' + (methodName == 'last' ? 'Right' : '')) : methodName],\n          retUnwrapped = isTaker || /^find/.test(methodName);\n\n      if (!lodashFunc) {\n        return;\n      }\n      lodash.prototype[methodName] = function() {\n        var value = this.__wrapped__,\n            args = isTaker ? [1] : arguments,\n            isLazy = value instanceof LazyWrapper,\n            iteratee = args[0],\n            useLazy = isLazy || isArray(value);\n\n        var interceptor = function(value) {\n          var result = lodashFunc.apply(lodash, arrayPush([value], args));\n          return (isTaker && chainAll) ? result[0] : result;\n        };\n\n        if (useLazy && checkIteratee && typeof iteratee == 'function' && iteratee.length != 1) {\n          // Avoid lazy use if the iteratee has a \"length\" value other than `1`.\n          isLazy = useLazy = false;\n        }\n        var chainAll = this.__chain__,\n            isHybrid = !!this.__actions__.length,\n            isUnwrapped = retUnwrapped && !chainAll,\n            onlyLazy = isLazy && !isHybrid;\n\n        if (!retUnwrapped && useLazy) {\n          value = onlyLazy ? value : new LazyWrapper(this);\n          var result = func.apply(value, args);\n          result.__actions__.push({ 'func': thru, 'args': [interceptor], 'thisArg': undefined });\n          return new LodashWrapper(result, chainAll);\n        }\n        if (isUnwrapped && onlyLazy) {\n          return func.apply(this, args);\n        }\n        result = this.thru(interceptor);\n        return isUnwrapped ? (isTaker ? result.value()[0] : result.value()) : result;\n      };\n    });\n\n    // Add `Array` methods to `lodash.prototype`.\n    arrayEach(['pop', 'push', 'shift', 'sort', 'splice', 'unshift'], function(methodName) {\n      var func = arrayProto[methodName],\n          chainName = /^(?:push|sort|unshift)$/.test(methodName) ? 'tap' : 'thru',\n          retUnwrapped = /^(?:pop|shift)$/.test(methodName);\n\n      lodash.prototype[methodName] = function() {\n        var args = arguments;\n        if (retUnwrapped && !this.__chain__) {\n          var value = this.value();\n          return func.apply(isArray(value) ? value : [], args);\n        }\n        return this[chainName](function(value) {\n          return func.apply(isArray(value) ? value : [], args);\n        });\n      };\n    });\n\n    // Map minified method names to their real names.\n    baseForOwn(LazyWrapper.prototype, function(func, methodName) {\n      var lodashFunc = lodash[methodName];\n      if (lodashFunc) {\n        var key = lodashFunc.name + '';\n        if (!hasOwnProperty.call(realNames, key)) {\n          realNames[key] = [];\n        }\n        realNames[key].push({ 'name': methodName, 'func': lodashFunc });\n      }\n    });\n\n    realNames[createHybrid(undefined, WRAP_BIND_KEY_FLAG).name] = [{\n      'name': 'wrapper',\n      'func': undefined\n    }];\n\n    // Add methods to `LazyWrapper`.\n    LazyWrapper.prototype.clone = lazyClone;\n    LazyWrapper.prototype.reverse = lazyReverse;\n    LazyWrapper.prototype.value = lazyValue;\n\n    // Add chain sequence methods to the `lodash` wrapper.\n    lodash.prototype.at = wrapperAt;\n    lodash.prototype.chain = wrapperChain;\n    lodash.prototype.commit = wrapperCommit;\n    lodash.prototype.next = wrapperNext;\n    lodash.prototype.plant = wrapperPlant;\n    lodash.prototype.reverse = wrapperReverse;\n    lodash.prototype.toJSON = lodash.prototype.valueOf = lodash.prototype.value = wrapperValue;\n\n    // Add lazy aliases.\n    lodash.prototype.first = lodash.prototype.head;\n\n    if (symIterator) {\n      lodash.prototype[symIterator] = wrapperToIterator;\n    }\n    return lodash;\n  });\n\n  /*--------------------------------------------------------------------------*/\n\n  // Export lodash.\n  var _ = runInContext();\n\n  // Some AMD build optimizers, like r.js, check for condition patterns like:\n  if (true) {\n    // Expose Lodash on the global object to prevent errors when Lodash is\n    // loaded by a script tag in the presence of an AMD loader.\n    // See http://requirejs.org/docs/errors.html#mismatch for more details.\n    // Use `_.noConflict` to remove Lodash from the global object.\n    root._ = _;\n\n    // Define as an anonymous module so, through path mapping, it can be\n    // referenced as the \"underscore\" module.\n    !(__WEBPACK_AMD_DEFINE_RESULT__ = (function() {\n      return _;\n    }).call(exports, __webpack_require__, exports, module),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  }\n  // Check for `exports` after `define` in case a build optimizer adds it.\n  else {}\n}.call(this));\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(21), __webpack_require__(115)(module)))//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTEuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoL2xvZGFzaC5qcz8yZWYwIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIExvZGFzaCA8aHR0cHM6Ly9sb2Rhc2guY29tLz5cbiAqIENvcHlyaWdodCBPcGVuSlMgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzIDxodHRwczovL29wZW5qc2Yub3JnLz5cbiAqIFJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlIDxodHRwczovL2xvZGFzaC5jb20vbGljZW5zZT5cbiAqIEJhc2VkIG9uIFVuZGVyc2NvcmUuanMgMS44LjMgPGh0dHA6Ly91bmRlcnNjb3JlanMub3JnL0xJQ0VOU0U+XG4gKiBDb3B5cmlnaHQgSmVyZW15IEFzaGtlbmFzLCBEb2N1bWVudENsb3VkIGFuZCBJbnZlc3RpZ2F0aXZlIFJlcG9ydGVycyAmIEVkaXRvcnNcbiAqL1xuOyhmdW5jdGlvbigpIHtcblxuICAvKiogVXNlZCBhcyBhIHNhZmUgcmVmZXJlbmNlIGZvciBgdW5kZWZpbmVkYCBpbiBwcmUtRVM1IGVudmlyb25tZW50cy4gKi9cbiAgdmFyIHVuZGVmaW5lZDtcblxuICAvKiogVXNlZCBhcyB0aGUgc2VtYW50aWMgdmVyc2lvbiBudW1iZXIuICovXG4gIHZhciBWRVJTSU9OID0gJzQuMTcuMjEnO1xuXG4gIC8qKiBVc2VkIGFzIHRoZSBzaXplIHRvIGVuYWJsZSBsYXJnZSBhcnJheSBvcHRpbWl6YXRpb25zLiAqL1xuICB2YXIgTEFSR0VfQVJSQVlfU0laRSA9IDIwMDtcblxuICAvKiogRXJyb3IgbWVzc2FnZSBjb25zdGFudHMuICovXG4gIHZhciBDT1JFX0VSUk9SX1RFWFQgPSAnVW5zdXBwb3J0ZWQgY29yZS1qcyB1c2UuIFRyeSBodHRwczovL25wbXMuaW8vc2VhcmNoP3E9cG9ueWZpbGwuJyxcbiAgICAgIEZVTkNfRVJST1JfVEVYVCA9ICdFeHBlY3RlZCBhIGZ1bmN0aW9uJyxcbiAgICAgIElOVkFMSURfVEVNUExfVkFSX0VSUk9SX1RFWFQgPSAnSW52YWxpZCBgdmFyaWFibGVgIG9wdGlvbiBwYXNzZWQgaW50byBgXy50ZW1wbGF0ZWAnO1xuXG4gIC8qKiBVc2VkIHRvIHN0YW5kLWluIGZvciBgdW5kZWZpbmVkYCBoYXNoIHZhbHVlcy4gKi9cbiAgdmFyIEhBU0hfVU5ERUZJTkVEID0gJ19fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18nO1xuXG4gIC8qKiBVc2VkIGFzIHRoZSBtYXhpbXVtIG1lbW9pemUgY2FjaGUgc2l6ZS4gKi9cbiAgdmFyIE1BWF9NRU1PSVpFX1NJWkUgPSA1MDA7XG5cbiAgLyoqIFVzZWQgYXMgdGhlIGludGVybmFsIGFyZ3VtZW50IHBsYWNlaG9sZGVyLiAqL1xuICB2YXIgUExBQ0VIT0xERVIgPSAnX19sb2Rhc2hfcGxhY2Vob2xkZXJfXyc7XG5cbiAgLyoqIFVzZWQgdG8gY29tcG9zZSBiaXRtYXNrcyBmb3IgY2xvbmluZy4gKi9cbiAgdmFyIENMT05FX0RFRVBfRkxBRyA9IDEsXG4gICAgICBDTE9ORV9GTEFUX0ZMQUcgPSAyLFxuICAgICAgQ0xPTkVfU1lNQk9MU19GTEFHID0gNDtcblxuICAvKiogVXNlZCB0byBjb21wb3NlIGJpdG1hc2tzIGZvciB2YWx1ZSBjb21wYXJpc29ucy4gKi9cbiAgdmFyIENPTVBBUkVfUEFSVElBTF9GTEFHID0gMSxcbiAgICAgIENPTVBBUkVfVU5PUkRFUkVEX0ZMQUcgPSAyO1xuXG4gIC8qKiBVc2VkIHRvIGNvbXBvc2UgYml0bWFza3MgZm9yIGZ1bmN0aW9uIG1ldGFkYXRhLiAqL1xuICB2YXIgV1JBUF9CSU5EX0ZMQUcgPSAxLFxuICAgICAgV1JBUF9CSU5EX0tFWV9GTEFHID0gMixcbiAgICAgIFdSQVBfQ1VSUllfQk9VTkRfRkxBRyA9IDQsXG4gICAgICBXUkFQX0NVUlJZX0ZMQUcgPSA4LFxuICAgICAgV1JBUF9DVVJSWV9SSUdIVF9GTEFHID0gMTYsXG4gICAgICBXUkFQX1BBUlRJQUxfRkxBRyA9IDMyLFxuICAgICAgV1JBUF9QQVJUSUFMX1JJR0hUX0ZMQUcgPSA2NCxcbiAgICAgIFdSQVBfQVJZX0ZMQUcgPSAxMjgsXG4gICAgICBXUkFQX1JFQVJHX0ZMQUcgPSAyNTYsXG4gICAgICBXUkFQX0ZMSVBfRkxBRyA9IDUxMjtcblxuICAvKiogVXNlZCBhcyBkZWZhdWx0IG9wdGlvbnMgZm9yIGBfLnRydW5jYXRlYC4gKi9cbiAgdmFyIERFRkFVTFRfVFJVTkNfTEVOR1RIID0gMzAsXG4gICAgICBERUZBVUxUX1RSVU5DX09NSVNTSU9OID0gJy4uLic7XG5cbiAgLyoqIFVzZWQgdG8gZGV0ZWN0IGhvdCBmdW5jdGlvbnMgYnkgbnVtYmVyIG9mIGNhbGxzIHdpdGhpbiBhIHNwYW4gb2YgbWlsbGlzZWNvbmRzLiAqL1xuICB2YXIgSE9UX0NPVU5UID0gODAwLFxuICAgICAgSE9UX1NQQU4gPSAxNjtcblxuICAvKiogVXNlZCB0byBpbmRpY2F0ZSB0aGUgdHlwZSBvZiBsYXp5IGl0ZXJhdGVlcy4gKi9cbiAgdmFyIExBWllfRklMVEVSX0ZMQUcgPSAxLFxuICAgICAgTEFaWV9NQVBfRkxBRyA9IDIsXG4gICAgICBMQVpZX1dISUxFX0ZMQUcgPSAzO1xuXG4gIC8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIHZhcmlvdXMgYE51bWJlcmAgY29uc3RhbnRzLiAqL1xuICB2YXIgSU5GSU5JVFkgPSAxIC8gMCxcbiAgICAgIE1BWF9TQUZFX0lOVEVHRVIgPSA5MDA3MTk5MjU0NzQwOTkxLFxuICAgICAgTUFYX0lOVEVHRVIgPSAxLjc5NzY5MzEzNDg2MjMxNTdlKzMwOCxcbiAgICAgIE5BTiA9IDAgLyAwO1xuXG4gIC8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIHRoZSBtYXhpbXVtIGxlbmd0aCBhbmQgaW5kZXggb2YgYW4gYXJyYXkuICovXG4gIHZhciBNQVhfQVJSQVlfTEVOR1RIID0gNDI5NDk2NzI5NSxcbiAgICAgIE1BWF9BUlJBWV9JTkRFWCA9IE1BWF9BUlJBWV9MRU5HVEggLSAxLFxuICAgICAgSEFMRl9NQVhfQVJSQVlfTEVOR1RIID0gTUFYX0FSUkFZX0xFTkdUSCA+Pj4gMTtcblxuICAvKiogVXNlZCB0byBhc3NvY2lhdGUgd3JhcCBtZXRob2RzIHdpdGggdGhlaXIgYml0IGZsYWdzLiAqL1xuICB2YXIgd3JhcEZsYWdzID0gW1xuICAgIFsnYXJ5JywgV1JBUF9BUllfRkxBR10sXG4gICAgWydiaW5kJywgV1JBUF9CSU5EX0ZMQUddLFxuICAgIFsnYmluZEtleScsIFdSQVBfQklORF9LRVlfRkxBR10sXG4gICAgWydjdXJyeScsIFdSQVBfQ1VSUllfRkxBR10sXG4gICAgWydjdXJyeVJpZ2h0JywgV1JBUF9DVVJSWV9SSUdIVF9GTEFHXSxcbiAgICBbJ2ZsaXAnLCBXUkFQX0ZMSVBfRkxBR10sXG4gICAgWydwYXJ0aWFsJywgV1JBUF9QQVJUSUFMX0ZMQUddLFxuICAgIFsncGFydGlhbFJpZ2h0JywgV1JBUF9QQVJUSUFMX1JJR0hUX0ZMQUddLFxuICAgIFsncmVhcmcnLCBXUkFQX1JFQVJHX0ZMQUddXG4gIF07XG5cbiAgLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xuICB2YXIgYXJnc1RhZyA9ICdbb2JqZWN0IEFyZ3VtZW50c10nLFxuICAgICAgYXJyYXlUYWcgPSAnW29iamVjdCBBcnJheV0nLFxuICAgICAgYXN5bmNUYWcgPSAnW29iamVjdCBBc3luY0Z1bmN0aW9uXScsXG4gICAgICBib29sVGFnID0gJ1tvYmplY3QgQm9vbGVhbl0nLFxuICAgICAgZGF0ZVRhZyA9ICdbb2JqZWN0IERhdGVdJyxcbiAgICAgIGRvbUV4Y1RhZyA9ICdbb2JqZWN0IERPTUV4Y2VwdGlvbl0nLFxuICAgICAgZXJyb3JUYWcgPSAnW29iamVjdCBFcnJvcl0nLFxuICAgICAgZnVuY1RhZyA9ICdbb2JqZWN0IEZ1bmN0aW9uXScsXG4gICAgICBnZW5UYWcgPSAnW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl0nLFxuICAgICAgbWFwVGFnID0gJ1tvYmplY3QgTWFwXScsXG4gICAgICBudW1iZXJUYWcgPSAnW29iamVjdCBOdW1iZXJdJyxcbiAgICAgIG51bGxUYWcgPSAnW29iamVjdCBOdWxsXScsXG4gICAgICBvYmplY3RUYWcgPSAnW29iamVjdCBPYmplY3RdJyxcbiAgICAgIHByb21pc2VUYWcgPSAnW29iamVjdCBQcm9taXNlXScsXG4gICAgICBwcm94eVRhZyA9ICdbb2JqZWN0IFByb3h5XScsXG4gICAgICByZWdleHBUYWcgPSAnW29iamVjdCBSZWdFeHBdJyxcbiAgICAgIHNldFRhZyA9ICdbb2JqZWN0IFNldF0nLFxuICAgICAgc3RyaW5nVGFnID0gJ1tvYmplY3QgU3RyaW5nXScsXG4gICAgICBzeW1ib2xUYWcgPSAnW29iamVjdCBTeW1ib2xdJyxcbiAgICAgIHVuZGVmaW5lZFRhZyA9ICdbb2JqZWN0IFVuZGVmaW5lZF0nLFxuICAgICAgd2Vha01hcFRhZyA9ICdbb2JqZWN0IFdlYWtNYXBdJyxcbiAgICAgIHdlYWtTZXRUYWcgPSAnW29iamVjdCBXZWFrU2V0XSc7XG5cbiAgdmFyIGFycmF5QnVmZmVyVGFnID0gJ1tvYmplY3QgQXJyYXlCdWZmZXJdJyxcbiAgICAgIGRhdGFWaWV3VGFnID0gJ1tvYmplY3QgRGF0YVZpZXddJyxcbiAgICAgIGZsb2F0MzJUYWcgPSAnW29iamVjdCBGbG9hdDMyQXJyYXldJyxcbiAgICAgIGZsb2F0NjRUYWcgPSAnW29iamVjdCBGbG9hdDY0QXJyYXldJyxcbiAgICAgIGludDhUYWcgPSAnW29iamVjdCBJbnQ4QXJyYXldJyxcbiAgICAgIGludDE2VGFnID0gJ1tvYmplY3QgSW50MTZBcnJheV0nLFxuICAgICAgaW50MzJUYWcgPSAnW29iamVjdCBJbnQzMkFycmF5XScsXG4gICAgICB1aW50OFRhZyA9ICdbb2JqZWN0IFVpbnQ4QXJyYXldJyxcbiAgICAgIHVpbnQ4Q2xhbXBlZFRhZyA9ICdbb2JqZWN0IFVpbnQ4Q2xhbXBlZEFycmF5XScsXG4gICAgICB1aW50MTZUYWcgPSAnW29iamVjdCBVaW50MTZBcnJheV0nLFxuICAgICAgdWludDMyVGFnID0gJ1tvYmplY3QgVWludDMyQXJyYXldJztcblxuICAvKiogVXNlZCB0byBtYXRjaCBlbXB0eSBzdHJpbmcgbGl0ZXJhbHMgaW4gY29tcGlsZWQgdGVtcGxhdGUgc291cmNlLiAqL1xuICB2YXIgcmVFbXB0eVN0cmluZ0xlYWRpbmcgPSAvXFxiX19wIFxcKz0gJyc7L2csXG4gICAgICByZUVtcHR5U3RyaW5nTWlkZGxlID0gL1xcYihfX3AgXFwrPSkgJycgXFwrL2csXG4gICAgICByZUVtcHR5U3RyaW5nVHJhaWxpbmcgPSAvKF9fZVxcKC4qP1xcKXxcXGJfX3RcXCkpIFxcK1xcbicnOy9nO1xuXG4gIC8qKiBVc2VkIHRvIG1hdGNoIEhUTUwgZW50aXRpZXMgYW5kIEhUTUwgY2hhcmFjdGVycy4gKi9cbiAgdmFyIHJlRXNjYXBlZEh0bWwgPSAvJig/OmFtcHxsdHxndHxxdW90fCMzOSk7L2csXG4gICAgICByZVVuZXNjYXBlZEh0bWwgPSAvWyY8PlwiJ10vZyxcbiAgICAgIHJlSGFzRXNjYXBlZEh0bWwgPSBSZWdFeHAocmVFc2NhcGVkSHRtbC5zb3VyY2UpLFxuICAgICAgcmVIYXNVbmVzY2FwZWRIdG1sID0gUmVnRXhwKHJlVW5lc2NhcGVkSHRtbC5zb3VyY2UpO1xuXG4gIC8qKiBVc2VkIHRvIG1hdGNoIHRlbXBsYXRlIGRlbGltaXRlcnMuICovXG4gIHZhciByZUVzY2FwZSA9IC88JS0oW1xcc1xcU10rPyklPi9nLFxuICAgICAgcmVFdmFsdWF0ZSA9IC88JShbXFxzXFxTXSs/KSU+L2csXG4gICAgICByZUludGVycG9sYXRlID0gLzwlPShbXFxzXFxTXSs/KSU+L2c7XG5cbiAgLyoqIFVzZWQgdG8gbWF0Y2ggcHJvcGVydHkgbmFtZXMgd2l0aGluIHByb3BlcnR5IHBhdGhzLiAqL1xuICB2YXIgcmVJc0RlZXBQcm9wID0gL1xcLnxcXFsoPzpbXltcXF1dKnwoW1wiJ10pKD86KD8hXFwxKVteXFxcXF18XFxcXC4pKj9cXDEpXFxdLyxcbiAgICAgIHJlSXNQbGFpblByb3AgPSAvXlxcdyokLyxcbiAgICAgIHJlUHJvcE5hbWUgPSAvW14uW1xcXV0rfFxcWyg/OigtP1xcZCsoPzpcXC5cXGQrKT8pfChbXCInXSkoKD86KD8hXFwyKVteXFxcXF18XFxcXC4pKj8pXFwyKVxcXXwoPz0oPzpcXC58XFxbXFxdKSg/OlxcLnxcXFtcXF18JCkpL2c7XG5cbiAgLyoqXG4gICAqIFVzZWQgdG8gbWF0Y2ggYFJlZ0V4cGBcbiAgICogW3N5bnRheCBjaGFyYWN0ZXJzXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1wYXR0ZXJucykuXG4gICAqL1xuICB2YXIgcmVSZWdFeHBDaGFyID0gL1tcXFxcXiQuKis/KClbXFxde318XS9nLFxuICAgICAgcmVIYXNSZWdFeHBDaGFyID0gUmVnRXhwKHJlUmVnRXhwQ2hhci5zb3VyY2UpO1xuXG4gIC8qKiBVc2VkIHRvIG1hdGNoIGxlYWRpbmcgd2hpdGVzcGFjZS4gKi9cbiAgdmFyIHJlVHJpbVN0YXJ0ID0gL15cXHMrLztcblxuICAvKiogVXNlZCB0byBtYXRjaCBhIHNpbmdsZSB3aGl0ZXNwYWNlIGNoYXJhY3Rlci4gKi9cbiAgdmFyIHJlV2hpdGVzcGFjZSA9IC9cXHMvO1xuXG4gIC8qKiBVc2VkIHRvIG1hdGNoIHdyYXAgZGV0YWlsIGNvbW1lbnRzLiAqL1xuICB2YXIgcmVXcmFwQ29tbWVudCA9IC9cXHsoPzpcXG5cXC9cXCogXFxbd3JhcHBlZCB3aXRoIC4rXFxdIFxcKlxcLyk/XFxuPy8sXG4gICAgICByZVdyYXBEZXRhaWxzID0gL1xce1xcblxcL1xcKiBcXFt3cmFwcGVkIHdpdGggKC4rKVxcXSBcXCovLFxuICAgICAgcmVTcGxpdERldGFpbHMgPSAvLD8gJiAvO1xuXG4gIC8qKiBVc2VkIHRvIG1hdGNoIHdvcmRzIGNvbXBvc2VkIG9mIGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzLiAqL1xuICB2YXIgcmVBc2NpaVdvcmQgPSAvW15cXHgwMC1cXHgyZlxceDNhLVxceDQwXFx4NWItXFx4NjBcXHg3Yi1cXHg3Zl0rL2c7XG5cbiAgLyoqXG4gICAqIFVzZWQgdG8gdmFsaWRhdGUgdGhlIGB2YWxpZGF0ZWAgb3B0aW9uIGluIGBfLnRlbXBsYXRlYCB2YXJpYWJsZS5cbiAgICpcbiAgICogRm9yYmlkcyBjaGFyYWN0ZXJzIHdoaWNoIGNvdWxkIHBvdGVudGlhbGx5IGNoYW5nZSB0aGUgbWVhbmluZyBvZiB0aGUgZnVuY3Rpb24gYXJndW1lbnQgZGVmaW5pdGlvbjpcbiAgICogLSBcIigpLFwiIChtb2RpZmljYXRpb24gb2YgZnVuY3Rpb24gcGFyYW1ldGVycylcbiAgICogLSBcIj1cIiAoZGVmYXVsdCB2YWx1ZSlcbiAgICogLSBcIltde31cIiAoZGVzdHJ1Y3R1cmluZyBvZiBmdW5jdGlvbiBwYXJhbWV0ZXJzKVxuICAgKiAtIFwiL1wiIChiZWdpbm5pbmcgb2YgYSBjb21tZW50KVxuICAgKiAtIHdoaXRlc3BhY2VcbiAgICovXG4gIHZhciByZUZvcmJpZGRlbklkZW50aWZpZXJDaGFycyA9IC9bKCk9LHt9XFxbXFxdXFwvXFxzXS87XG5cbiAgLyoqIFVzZWQgdG8gbWF0Y2ggYmFja3NsYXNoZXMgaW4gcHJvcGVydHkgcGF0aHMuICovXG4gIHZhciByZUVzY2FwZUNoYXIgPSAvXFxcXChcXFxcKT8vZztcblxuICAvKipcbiAgICogVXNlZCB0byBtYXRjaFxuICAgKiBbRVMgdGVtcGxhdGUgZGVsaW1pdGVyc10oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtdGVtcGxhdGUtbGl0ZXJhbC1sZXhpY2FsLWNvbXBvbmVudHMpLlxuICAgKi9cbiAgdmFyIHJlRXNUZW1wbGF0ZSA9IC9cXCRcXHsoW15cXFxcfV0qKD86XFxcXC5bXlxcXFx9XSopKilcXH0vZztcblxuICAvKiogVXNlZCB0byBtYXRjaCBgUmVnRXhwYCBmbGFncyBmcm9tIHRoZWlyIGNvZXJjZWQgc3RyaW5nIHZhbHVlcy4gKi9cbiAgdmFyIHJlRmxhZ3MgPSAvXFx3KiQvO1xuXG4gIC8qKiBVc2VkIHRvIGRldGVjdCBiYWQgc2lnbmVkIGhleGFkZWNpbWFsIHN0cmluZyB2YWx1ZXMuICovXG4gIHZhciByZUlzQmFkSGV4ID0gL15bLStdMHhbMC05YS1mXSskL2k7XG5cbiAgLyoqIFVzZWQgdG8gZGV0ZWN0IGJpbmFyeSBzdHJpbmcgdmFsdWVzLiAqL1xuICB2YXIgcmVJc0JpbmFyeSA9IC9eMGJbMDFdKyQvaTtcblxuICAvKiogVXNlZCB0byBkZXRlY3QgaG9zdCBjb25zdHJ1Y3RvcnMgKFNhZmFyaSkuICovXG4gIHZhciByZUlzSG9zdEN0b3IgPSAvXlxcW29iamVjdCAuKz9Db25zdHJ1Y3RvclxcXSQvO1xuXG4gIC8qKiBVc2VkIHRvIGRldGVjdCBvY3RhbCBzdHJpbmcgdmFsdWVzLiAqL1xuICB2YXIgcmVJc09jdGFsID0gL14wb1swLTddKyQvaTtcblxuICAvKiogVXNlZCB0byBkZXRlY3QgdW5zaWduZWQgaW50ZWdlciB2YWx1ZXMuICovXG4gIHZhciByZUlzVWludCA9IC9eKD86MHxbMS05XVxcZCopJC87XG5cbiAgLyoqIFVzZWQgdG8gbWF0Y2ggTGF0aW4gVW5pY29kZSBsZXR0ZXJzIChleGNsdWRpbmcgbWF0aGVtYXRpY2FsIG9wZXJhdG9ycykuICovXG4gIHZhciByZUxhdGluID0gL1tcXHhjMC1cXHhkNlxceGQ4LVxceGY2XFx4ZjgtXFx4ZmZcXHUwMTAwLVxcdTAxN2ZdL2c7XG5cbiAgLyoqIFVzZWQgdG8gZW5zdXJlIGNhcHR1cmluZyBvcmRlciBvZiB0ZW1wbGF0ZSBkZWxpbWl0ZXJzLiAqL1xuICB2YXIgcmVOb01hdGNoID0gLygkXikvO1xuXG4gIC8qKiBVc2VkIHRvIG1hdGNoIHVuZXNjYXBlZCBjaGFyYWN0ZXJzIGluIGNvbXBpbGVkIHN0cmluZyBsaXRlcmFscy4gKi9cbiAgdmFyIHJlVW5lc2NhcGVkU3RyaW5nID0gL1snXFxuXFxyXFx1MjAyOFxcdTIwMjlcXFxcXS9nO1xuXG4gIC8qKiBVc2VkIHRvIGNvbXBvc2UgdW5pY29kZSBjaGFyYWN0ZXIgY2xhc3Nlcy4gKi9cbiAgdmFyIHJzQXN0cmFsUmFuZ2UgPSAnXFxcXHVkODAwLVxcXFx1ZGZmZicsXG4gICAgICByc0NvbWJvTWFya3NSYW5nZSA9ICdcXFxcdTAzMDAtXFxcXHUwMzZmJyxcbiAgICAgIHJlQ29tYm9IYWxmTWFya3NSYW5nZSA9ICdcXFxcdWZlMjAtXFxcXHVmZTJmJyxcbiAgICAgIHJzQ29tYm9TeW1ib2xzUmFuZ2UgPSAnXFxcXHUyMGQwLVxcXFx1MjBmZicsXG4gICAgICByc0NvbWJvUmFuZ2UgPSByc0NvbWJvTWFya3NSYW5nZSArIHJlQ29tYm9IYWxmTWFya3NSYW5nZSArIHJzQ29tYm9TeW1ib2xzUmFuZ2UsXG4gICAgICByc0RpbmdiYXRSYW5nZSA9ICdcXFxcdTI3MDAtXFxcXHUyN2JmJyxcbiAgICAgIHJzTG93ZXJSYW5nZSA9ICdhLXpcXFxceGRmLVxcXFx4ZjZcXFxceGY4LVxcXFx4ZmYnLFxuICAgICAgcnNNYXRoT3BSYW5nZSA9ICdcXFxceGFjXFxcXHhiMVxcXFx4ZDdcXFxceGY3JyxcbiAgICAgIHJzTm9uQ2hhclJhbmdlID0gJ1xcXFx4MDAtXFxcXHgyZlxcXFx4M2EtXFxcXHg0MFxcXFx4NWItXFxcXHg2MFxcXFx4N2ItXFxcXHhiZicsXG4gICAgICByc1B1bmN0dWF0aW9uUmFuZ2UgPSAnXFxcXHUyMDAwLVxcXFx1MjA2ZicsXG4gICAgICByc1NwYWNlUmFuZ2UgPSAnIFxcXFx0XFxcXHgwYlxcXFxmXFxcXHhhMFxcXFx1ZmVmZlxcXFxuXFxcXHJcXFxcdTIwMjhcXFxcdTIwMjlcXFxcdTE2ODBcXFxcdTE4MGVcXFxcdTIwMDBcXFxcdTIwMDFcXFxcdTIwMDJcXFxcdTIwMDNcXFxcdTIwMDRcXFxcdTIwMDVcXFxcdTIwMDZcXFxcdTIwMDdcXFxcdTIwMDhcXFxcdTIwMDlcXFxcdTIwMGFcXFxcdTIwMmZcXFxcdTIwNWZcXFxcdTMwMDAnLFxuICAgICAgcnNVcHBlclJhbmdlID0gJ0EtWlxcXFx4YzAtXFxcXHhkNlxcXFx4ZDgtXFxcXHhkZScsXG4gICAgICByc1ZhclJhbmdlID0gJ1xcXFx1ZmUwZVxcXFx1ZmUwZicsXG4gICAgICByc0JyZWFrUmFuZ2UgPSByc01hdGhPcFJhbmdlICsgcnNOb25DaGFyUmFuZ2UgKyByc1B1bmN0dWF0aW9uUmFuZ2UgKyByc1NwYWNlUmFuZ2U7XG5cbiAgLyoqIFVzZWQgdG8gY29tcG9zZSB1bmljb2RlIGNhcHR1cmUgZ3JvdXBzLiAqL1xuICB2YXIgcnNBcG9zID0gXCJbJ1xcdTIwMTldXCIsXG4gICAgICByc0FzdHJhbCA9ICdbJyArIHJzQXN0cmFsUmFuZ2UgKyAnXScsXG4gICAgICByc0JyZWFrID0gJ1snICsgcnNCcmVha1JhbmdlICsgJ10nLFxuICAgICAgcnNDb21ibyA9ICdbJyArIHJzQ29tYm9SYW5nZSArICddJyxcbiAgICAgIHJzRGlnaXRzID0gJ1xcXFxkKycsXG4gICAgICByc0RpbmdiYXQgPSAnWycgKyByc0RpbmdiYXRSYW5nZSArICddJyxcbiAgICAgIHJzTG93ZXIgPSAnWycgKyByc0xvd2VyUmFuZ2UgKyAnXScsXG4gICAgICByc01pc2MgPSAnW14nICsgcnNBc3RyYWxSYW5nZSArIHJzQnJlYWtSYW5nZSArIHJzRGlnaXRzICsgcnNEaW5nYmF0UmFuZ2UgKyByc0xvd2VyUmFuZ2UgKyByc1VwcGVyUmFuZ2UgKyAnXScsXG4gICAgICByc0ZpdHogPSAnXFxcXHVkODNjW1xcXFx1ZGZmYi1cXFxcdWRmZmZdJyxcbiAgICAgIHJzTW9kaWZpZXIgPSAnKD86JyArIHJzQ29tYm8gKyAnfCcgKyByc0ZpdHogKyAnKScsXG4gICAgICByc05vbkFzdHJhbCA9ICdbXicgKyByc0FzdHJhbFJhbmdlICsgJ10nLFxuICAgICAgcnNSZWdpb25hbCA9ICcoPzpcXFxcdWQ4M2NbXFxcXHVkZGU2LVxcXFx1ZGRmZl0pezJ9JyxcbiAgICAgIHJzU3VyclBhaXIgPSAnW1xcXFx1ZDgwMC1cXFxcdWRiZmZdW1xcXFx1ZGMwMC1cXFxcdWRmZmZdJyxcbiAgICAgIHJzVXBwZXIgPSAnWycgKyByc1VwcGVyUmFuZ2UgKyAnXScsXG4gICAgICByc1pXSiA9ICdcXFxcdTIwMGQnO1xuXG4gIC8qKiBVc2VkIHRvIGNvbXBvc2UgdW5pY29kZSByZWdleGVzLiAqL1xuICB2YXIgcnNNaXNjTG93ZXIgPSAnKD86JyArIHJzTG93ZXIgKyAnfCcgKyByc01pc2MgKyAnKScsXG4gICAgICByc01pc2NVcHBlciA9ICcoPzonICsgcnNVcHBlciArICd8JyArIHJzTWlzYyArICcpJyxcbiAgICAgIHJzT3B0Q29udHJMb3dlciA9ICcoPzonICsgcnNBcG9zICsgJyg/OmR8bGx8bXxyZXxzfHR8dmUpKT8nLFxuICAgICAgcnNPcHRDb250clVwcGVyID0gJyg/OicgKyByc0Fwb3MgKyAnKD86RHxMTHxNfFJFfFN8VHxWRSkpPycsXG4gICAgICByZU9wdE1vZCA9IHJzTW9kaWZpZXIgKyAnPycsXG4gICAgICByc09wdFZhciA9ICdbJyArIHJzVmFyUmFuZ2UgKyAnXT8nLFxuICAgICAgcnNPcHRKb2luID0gJyg/OicgKyByc1pXSiArICcoPzonICsgW3JzTm9uQXN0cmFsLCByc1JlZ2lvbmFsLCByc1N1cnJQYWlyXS5qb2luKCd8JykgKyAnKScgKyByc09wdFZhciArIHJlT3B0TW9kICsgJykqJyxcbiAgICAgIHJzT3JkTG93ZXIgPSAnXFxcXGQqKD86MXN0fDJuZHwzcmR8KD8hWzEyM10pXFxcXGR0aCkoPz1cXFxcYnxbQS1aX10pJyxcbiAgICAgIHJzT3JkVXBwZXIgPSAnXFxcXGQqKD86MVNUfDJORHwzUkR8KD8hWzEyM10pXFxcXGRUSCkoPz1cXFxcYnxbYS16X10pJyxcbiAgICAgIHJzU2VxID0gcnNPcHRWYXIgKyByZU9wdE1vZCArIHJzT3B0Sm9pbixcbiAgICAgIHJzRW1vamkgPSAnKD86JyArIFtyc0RpbmdiYXQsIHJzUmVnaW9uYWwsIHJzU3VyclBhaXJdLmpvaW4oJ3wnKSArICcpJyArIHJzU2VxLFxuICAgICAgcnNTeW1ib2wgPSAnKD86JyArIFtyc05vbkFzdHJhbCArIHJzQ29tYm8gKyAnPycsIHJzQ29tYm8sIHJzUmVnaW9uYWwsIHJzU3VyclBhaXIsIHJzQXN0cmFsXS5qb2luKCd8JykgKyAnKSc7XG5cbiAgLyoqIFVzZWQgdG8gbWF0Y2ggYXBvc3Ryb3BoZXMuICovXG4gIHZhciByZUFwb3MgPSBSZWdFeHAocnNBcG9zLCAnZycpO1xuXG4gIC8qKlxuICAgKiBVc2VkIHRvIG1hdGNoIFtjb21iaW5pbmcgZGlhY3JpdGljYWwgbWFya3NdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0NvbWJpbmluZ19EaWFjcml0aWNhbF9NYXJrcykgYW5kXG4gICAqIFtjb21iaW5pbmcgZGlhY3JpdGljYWwgbWFya3MgZm9yIHN5bWJvbHNdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0NvbWJpbmluZ19EaWFjcml0aWNhbF9NYXJrc19mb3JfU3ltYm9scykuXG4gICAqL1xuICB2YXIgcmVDb21ib01hcmsgPSBSZWdFeHAocnNDb21ibywgJ2cnKTtcblxuICAvKiogVXNlZCB0byBtYXRjaCBbc3RyaW5nIHN5bWJvbHNdKGh0dHBzOi8vbWF0aGlhc2J5bmVucy5iZS9ub3Rlcy9qYXZhc2NyaXB0LXVuaWNvZGUpLiAqL1xuICB2YXIgcmVVbmljb2RlID0gUmVnRXhwKHJzRml0eiArICcoPz0nICsgcnNGaXR6ICsgJyl8JyArIHJzU3ltYm9sICsgcnNTZXEsICdnJyk7XG5cbiAgLyoqIFVzZWQgdG8gbWF0Y2ggY29tcGxleCBvciBjb21wb3VuZCB3b3Jkcy4gKi9cbiAgdmFyIHJlVW5pY29kZVdvcmQgPSBSZWdFeHAoW1xuICAgIHJzVXBwZXIgKyAnPycgKyByc0xvd2VyICsgJysnICsgcnNPcHRDb250ckxvd2VyICsgJyg/PScgKyBbcnNCcmVhaywgcnNVcHBlciwgJyQnXS5qb2luKCd8JykgKyAnKScsXG4gICAgcnNNaXNjVXBwZXIgKyAnKycgKyByc09wdENvbnRyVXBwZXIgKyAnKD89JyArIFtyc0JyZWFrLCByc1VwcGVyICsgcnNNaXNjTG93ZXIsICckJ10uam9pbignfCcpICsgJyknLFxuICAgIHJzVXBwZXIgKyAnPycgKyByc01pc2NMb3dlciArICcrJyArIHJzT3B0Q29udHJMb3dlcixcbiAgICByc1VwcGVyICsgJysnICsgcnNPcHRDb250clVwcGVyLFxuICAgIHJzT3JkVXBwZXIsXG4gICAgcnNPcmRMb3dlcixcbiAgICByc0RpZ2l0cyxcbiAgICByc0Vtb2ppXG4gIF0uam9pbignfCcpLCAnZycpO1xuXG4gIC8qKiBVc2VkIHRvIGRldGVjdCBzdHJpbmdzIHdpdGggW3plcm8td2lkdGggam9pbmVycyBvciBjb2RlIHBvaW50cyBmcm9tIHRoZSBhc3RyYWwgcGxhbmVzXShodHRwOi8vZWV2LmVlL2Jsb2cvMjAxNS8wOS8xMi9kYXJrLWNvcm5lcnMtb2YtdW5pY29kZS8pLiAqL1xuICB2YXIgcmVIYXNVbmljb2RlID0gUmVnRXhwKCdbJyArIHJzWldKICsgcnNBc3RyYWxSYW5nZSAgKyByc0NvbWJvUmFuZ2UgKyByc1ZhclJhbmdlICsgJ10nKTtcblxuICAvKiogVXNlZCB0byBkZXRlY3Qgc3RyaW5ncyB0aGF0IG5lZWQgYSBtb3JlIHJvYnVzdCByZWdleHAgdG8gbWF0Y2ggd29yZHMuICovXG4gIHZhciByZUhhc1VuaWNvZGVXb3JkID0gL1thLXpdW0EtWl18W0EtWl17Mn1bYS16XXxbMC05XVthLXpBLVpdfFthLXpBLVpdWzAtOV18W15hLXpBLVowLTkgXS87XG5cbiAgLyoqIFVzZWQgdG8gYXNzaWduIGRlZmF1bHQgYGNvbnRleHRgIG9iamVjdCBwcm9wZXJ0aWVzLiAqL1xuICB2YXIgY29udGV4dFByb3BzID0gW1xuICAgICdBcnJheScsICdCdWZmZXInLCAnRGF0YVZpZXcnLCAnRGF0ZScsICdFcnJvcicsICdGbG9hdDMyQXJyYXknLCAnRmxvYXQ2NEFycmF5JyxcbiAgICAnRnVuY3Rpb24nLCAnSW50OEFycmF5JywgJ0ludDE2QXJyYXknLCAnSW50MzJBcnJheScsICdNYXAnLCAnTWF0aCcsICdPYmplY3QnLFxuICAgICdQcm9taXNlJywgJ1JlZ0V4cCcsICdTZXQnLCAnU3RyaW5nJywgJ1N5bWJvbCcsICdUeXBlRXJyb3InLCAnVWludDhBcnJheScsXG4gICAgJ1VpbnQ4Q2xhbXBlZEFycmF5JywgJ1VpbnQxNkFycmF5JywgJ1VpbnQzMkFycmF5JywgJ1dlYWtNYXAnLFxuICAgICdfJywgJ2NsZWFyVGltZW91dCcsICdpc0Zpbml0ZScsICdwYXJzZUludCcsICdzZXRUaW1lb3V0J1xuICBdO1xuXG4gIC8qKiBVc2VkIHRvIG1ha2UgdGVtcGxhdGUgc291cmNlVVJMcyBlYXNpZXIgdG8gaWRlbnRpZnkuICovXG4gIHZhciB0ZW1wbGF0ZUNvdW50ZXIgPSAtMTtcblxuICAvKiogVXNlZCB0byBpZGVudGlmeSBgdG9TdHJpbmdUYWdgIHZhbHVlcyBvZiB0eXBlZCBhcnJheXMuICovXG4gIHZhciB0eXBlZEFycmF5VGFncyA9IHt9O1xuICB0eXBlZEFycmF5VGFnc1tmbG9hdDMyVGFnXSA9IHR5cGVkQXJyYXlUYWdzW2Zsb2F0NjRUYWddID1cbiAgdHlwZWRBcnJheVRhZ3NbaW50OFRhZ10gPSB0eXBlZEFycmF5VGFnc1tpbnQxNlRhZ10gPVxuICB0eXBlZEFycmF5VGFnc1tpbnQzMlRhZ10gPSB0eXBlZEFycmF5VGFnc1t1aW50OFRhZ10gPVxuICB0eXBlZEFycmF5VGFnc1t1aW50OENsYW1wZWRUYWddID0gdHlwZWRBcnJheVRhZ3NbdWludDE2VGFnXSA9XG4gIHR5cGVkQXJyYXlUYWdzW3VpbnQzMlRhZ10gPSB0cnVlO1xuICB0eXBlZEFycmF5VGFnc1thcmdzVGFnXSA9IHR5cGVkQXJyYXlUYWdzW2FycmF5VGFnXSA9XG4gIHR5cGVkQXJyYXlUYWdzW2FycmF5QnVmZmVyVGFnXSA9IHR5cGVkQXJyYXlUYWdzW2Jvb2xUYWddID1cbiAgdHlwZWRBcnJheVRhZ3NbZGF0YVZpZXdUYWddID0gdHlwZWRBcnJheVRhZ3NbZGF0ZVRhZ10gPVxuICB0eXBlZEFycmF5VGFnc1tlcnJvclRhZ10gPSB0eXBlZEFycmF5VGFnc1tmdW5jVGFnXSA9XG4gIHR5cGVkQXJyYXlUYWdzW21hcFRhZ10gPSB0eXBlZEFycmF5VGFnc1tudW1iZXJUYWddID1cbiAgdHlwZWRBcnJheVRhZ3Nbb2JqZWN0VGFnXSA9IHR5cGVkQXJyYXlUYWdzW3JlZ2V4cFRhZ10gPVxuICB0eXBlZEFycmF5VGFnc1tzZXRUYWddID0gdHlwZWRBcnJheVRhZ3Nbc3RyaW5nVGFnXSA9XG4gIHR5cGVkQXJyYXlUYWdzW3dlYWtNYXBUYWddID0gZmFsc2U7XG5cbiAgLyoqIFVzZWQgdG8gaWRlbnRpZnkgYHRvU3RyaW5nVGFnYCB2YWx1ZXMgc3VwcG9ydGVkIGJ5IGBfLmNsb25lYC4gKi9cbiAgdmFyIGNsb25lYWJsZVRhZ3MgPSB7fTtcbiAgY2xvbmVhYmxlVGFnc1thcmdzVGFnXSA9IGNsb25lYWJsZVRhZ3NbYXJyYXlUYWddID1cbiAgY2xvbmVhYmxlVGFnc1thcnJheUJ1ZmZlclRhZ10gPSBjbG9uZWFibGVUYWdzW2RhdGFWaWV3VGFnXSA9XG4gIGNsb25lYWJsZVRhZ3NbYm9vbFRhZ10gPSBjbG9uZWFibGVUYWdzW2RhdGVUYWddID1cbiAgY2xvbmVhYmxlVGFnc1tmbG9hdDMyVGFnXSA9IGNsb25lYWJsZVRhZ3NbZmxvYXQ2NFRhZ10gPVxuICBjbG9uZWFibGVUYWdzW2ludDhUYWddID0gY2xvbmVhYmxlVGFnc1tpbnQxNlRhZ10gPVxuICBjbG9uZWFibGVUYWdzW2ludDMyVGFnXSA9IGNsb25lYWJsZVRhZ3NbbWFwVGFnXSA9XG4gIGNsb25lYWJsZVRhZ3NbbnVtYmVyVGFnXSA9IGNsb25lYWJsZVRhZ3Nbb2JqZWN0VGFnXSA9XG4gIGNsb25lYWJsZVRhZ3NbcmVnZXhwVGFnXSA9IGNsb25lYWJsZVRhZ3Nbc2V0VGFnXSA9XG4gIGNsb25lYWJsZVRhZ3Nbc3RyaW5nVGFnXSA9IGNsb25lYWJsZVRhZ3Nbc3ltYm9sVGFnXSA9XG4gIGNsb25lYWJsZVRhZ3NbdWludDhUYWddID0gY2xvbmVhYmxlVGFnc1t1aW50OENsYW1wZWRUYWddID1cbiAgY2xvbmVhYmxlVGFnc1t1aW50MTZUYWddID0gY2xvbmVhYmxlVGFnc1t1aW50MzJUYWddID0gdHJ1ZTtcbiAgY2xvbmVhYmxlVGFnc1tlcnJvclRhZ10gPSBjbG9uZWFibGVUYWdzW2Z1bmNUYWddID1cbiAgY2xvbmVhYmxlVGFnc1t3ZWFrTWFwVGFnXSA9IGZhbHNlO1xuXG4gIC8qKiBVc2VkIHRvIG1hcCBMYXRpbiBVbmljb2RlIGxldHRlcnMgdG8gYmFzaWMgTGF0aW4gbGV0dGVycy4gKi9cbiAgdmFyIGRlYnVycmVkTGV0dGVycyA9IHtcbiAgICAvLyBMYXRpbi0xIFN1cHBsZW1lbnQgYmxvY2suXG4gICAgJ1xceGMwJzogJ0EnLCAgJ1xceGMxJzogJ0EnLCAnXFx4YzInOiAnQScsICdcXHhjMyc6ICdBJywgJ1xceGM0JzogJ0EnLCAnXFx4YzUnOiAnQScsXG4gICAgJ1xceGUwJzogJ2EnLCAgJ1xceGUxJzogJ2EnLCAnXFx4ZTInOiAnYScsICdcXHhlMyc6ICdhJywgJ1xceGU0JzogJ2EnLCAnXFx4ZTUnOiAnYScsXG4gICAgJ1xceGM3JzogJ0MnLCAgJ1xceGU3JzogJ2MnLFxuICAgICdcXHhkMCc6ICdEJywgICdcXHhmMCc6ICdkJyxcbiAgICAnXFx4YzgnOiAnRScsICAnXFx4YzknOiAnRScsICdcXHhjYSc6ICdFJywgJ1xceGNiJzogJ0UnLFxuICAgICdcXHhlOCc6ICdlJywgICdcXHhlOSc6ICdlJywgJ1xceGVhJzogJ2UnLCAnXFx4ZWInOiAnZScsXG4gICAgJ1xceGNjJzogJ0knLCAgJ1xceGNkJzogJ0knLCAnXFx4Y2UnOiAnSScsICdcXHhjZic6ICdJJyxcbiAgICAnXFx4ZWMnOiAnaScsICAnXFx4ZWQnOiAnaScsICdcXHhlZSc6ICdpJywgJ1xceGVmJzogJ2knLFxuICAgICdcXHhkMSc6ICdOJywgICdcXHhmMSc6ICduJyxcbiAgICAnXFx4ZDInOiAnTycsICAnXFx4ZDMnOiAnTycsICdcXHhkNCc6ICdPJywgJ1xceGQ1JzogJ08nLCAnXFx4ZDYnOiAnTycsICdcXHhkOCc6ICdPJyxcbiAgICAnXFx4ZjInOiAnbycsICAnXFx4ZjMnOiAnbycsICdcXHhmNCc6ICdvJywgJ1xceGY1JzogJ28nLCAnXFx4ZjYnOiAnbycsICdcXHhmOCc6ICdvJyxcbiAgICAnXFx4ZDknOiAnVScsICAnXFx4ZGEnOiAnVScsICdcXHhkYic6ICdVJywgJ1xceGRjJzogJ1UnLFxuICAgICdcXHhmOSc6ICd1JywgICdcXHhmYSc6ICd1JywgJ1xceGZiJzogJ3UnLCAnXFx4ZmMnOiAndScsXG4gICAgJ1xceGRkJzogJ1knLCAgJ1xceGZkJzogJ3knLCAnXFx4ZmYnOiAneScsXG4gICAgJ1xceGM2JzogJ0FlJywgJ1xceGU2JzogJ2FlJyxcbiAgICAnXFx4ZGUnOiAnVGgnLCAnXFx4ZmUnOiAndGgnLFxuICAgICdcXHhkZic6ICdzcycsXG4gICAgLy8gTGF0aW4gRXh0ZW5kZWQtQSBibG9jay5cbiAgICAnXFx1MDEwMCc6ICdBJywgICdcXHUwMTAyJzogJ0EnLCAnXFx1MDEwNCc6ICdBJyxcbiAgICAnXFx1MDEwMSc6ICdhJywgICdcXHUwMTAzJzogJ2EnLCAnXFx1MDEwNSc6ICdhJyxcbiAgICAnXFx1MDEwNic6ICdDJywgICdcXHUwMTA4JzogJ0MnLCAnXFx1MDEwYSc6ICdDJywgJ1xcdTAxMGMnOiAnQycsXG4gICAgJ1xcdTAxMDcnOiAnYycsICAnXFx1MDEwOSc6ICdjJywgJ1xcdTAxMGInOiAnYycsICdcXHUwMTBkJzogJ2MnLFxuICAgICdcXHUwMTBlJzogJ0QnLCAgJ1xcdTAxMTAnOiAnRCcsICdcXHUwMTBmJzogJ2QnLCAnXFx1MDExMSc6ICdkJyxcbiAgICAnXFx1MDExMic6ICdFJywgICdcXHUwMTE0JzogJ0UnLCAnXFx1MDExNic6ICdFJywgJ1xcdTAxMTgnOiAnRScsICdcXHUwMTFhJzogJ0UnLFxuICAgICdcXHUwMTEzJzogJ2UnLCAgJ1xcdTAxMTUnOiAnZScsICdcXHUwMTE3JzogJ2UnLCAnXFx1MDExOSc6ICdlJywgJ1xcdTAxMWInOiAnZScsXG4gICAgJ1xcdTAxMWMnOiAnRycsICAnXFx1MDExZSc6ICdHJywgJ1xcdTAxMjAnOiAnRycsICdcXHUwMTIyJzogJ0cnLFxuICAgICdcXHUwMTFkJzogJ2cnLCAgJ1xcdTAxMWYnOiAnZycsICdcXHUwMTIxJzogJ2cnLCAnXFx1MDEyMyc6ICdnJyxcbiAgICAnXFx1MDEyNCc6ICdIJywgICdcXHUwMTI2JzogJ0gnLCAnXFx1MDEyNSc6ICdoJywgJ1xcdTAxMjcnOiAnaCcsXG4gICAgJ1xcdTAxMjgnOiAnSScsICAnXFx1MDEyYSc6ICdJJywgJ1xcdTAxMmMnOiAnSScsICdcXHUwMTJlJzogJ0knLCAnXFx1MDEzMCc6ICdJJyxcbiAgICAnXFx1MDEyOSc6ICdpJywgICdcXHUwMTJiJzogJ2knLCAnXFx1MDEyZCc6ICdpJywgJ1xcdTAxMmYnOiAnaScsICdcXHUwMTMxJzogJ2knLFxuICAgICdcXHUwMTM0JzogJ0onLCAgJ1xcdTAxMzUnOiAnaicsXG4gICAgJ1xcdTAxMzYnOiAnSycsICAnXFx1MDEzNyc6ICdrJywgJ1xcdTAxMzgnOiAnaycsXG4gICAgJ1xcdTAxMzknOiAnTCcsICAnXFx1MDEzYic6ICdMJywgJ1xcdTAxM2QnOiAnTCcsICdcXHUwMTNmJzogJ0wnLCAnXFx1MDE0MSc6ICdMJyxcbiAgICAnXFx1MDEzYSc6ICdsJywgICdcXHUwMTNjJzogJ2wnLCAnXFx1MDEzZSc6ICdsJywgJ1xcdTAxNDAnOiAnbCcsICdcXHUwMTQyJzogJ2wnLFxuICAgICdcXHUwMTQzJzogJ04nLCAgJ1xcdTAxNDUnOiAnTicsICdcXHUwMTQ3JzogJ04nLCAnXFx1MDE0YSc6ICdOJyxcbiAgICAnXFx1MDE0NCc6ICduJywgICdcXHUwMTQ2JzogJ24nLCAnXFx1MDE0OCc6ICduJywgJ1xcdTAxNGInOiAnbicsXG4gICAgJ1xcdTAxNGMnOiAnTycsICAnXFx1MDE0ZSc6ICdPJywgJ1xcdTAxNTAnOiAnTycsXG4gICAgJ1xcdTAxNGQnOiAnbycsICAnXFx1MDE0Zic6ICdvJywgJ1xcdTAxNTEnOiAnbycsXG4gICAgJ1xcdTAxNTQnOiAnUicsICAnXFx1MDE1Nic6ICdSJywgJ1xcdTAxNTgnOiAnUicsXG4gICAgJ1xcdTAxNTUnOiAncicsICAnXFx1MDE1Nyc6ICdyJywgJ1xcdTAxNTknOiAncicsXG4gICAgJ1xcdTAxNWEnOiAnUycsICAnXFx1MDE1Yyc6ICdTJywgJ1xcdTAxNWUnOiAnUycsICdcXHUwMTYwJzogJ1MnLFxuICAgICdcXHUwMTViJzogJ3MnLCAgJ1xcdTAxNWQnOiAncycsICdcXHUwMTVmJzogJ3MnLCAnXFx1MDE2MSc6ICdzJyxcbiAgICAnXFx1MDE2Mic6ICdUJywgICdcXHUwMTY0JzogJ1QnLCAnXFx1MDE2Nic6ICdUJyxcbiAgICAnXFx1MDE2Myc6ICd0JywgICdcXHUwMTY1JzogJ3QnLCAnXFx1MDE2Nyc6ICd0JyxcbiAgICAnXFx1MDE2OCc6ICdVJywgICdcXHUwMTZhJzogJ1UnLCAnXFx1MDE2Yyc6ICdVJywgJ1xcdTAxNmUnOiAnVScsICdcXHUwMTcwJzogJ1UnLCAnXFx1MDE3Mic6ICdVJyxcbiAgICAnXFx1MDE2OSc6ICd1JywgICdcXHUwMTZiJzogJ3UnLCAnXFx1MDE2ZCc6ICd1JywgJ1xcdTAxNmYnOiAndScsICdcXHUwMTcxJzogJ3UnLCAnXFx1MDE3Myc6ICd1JyxcbiAgICAnXFx1MDE3NCc6ICdXJywgICdcXHUwMTc1JzogJ3cnLFxuICAgICdcXHUwMTc2JzogJ1knLCAgJ1xcdTAxNzcnOiAneScsICdcXHUwMTc4JzogJ1knLFxuICAgICdcXHUwMTc5JzogJ1onLCAgJ1xcdTAxN2InOiAnWicsICdcXHUwMTdkJzogJ1onLFxuICAgICdcXHUwMTdhJzogJ3onLCAgJ1xcdTAxN2MnOiAneicsICdcXHUwMTdlJzogJ3onLFxuICAgICdcXHUwMTMyJzogJ0lKJywgJ1xcdTAxMzMnOiAnaWonLFxuICAgICdcXHUwMTUyJzogJ09lJywgJ1xcdTAxNTMnOiAnb2UnLFxuICAgICdcXHUwMTQ5JzogXCInblwiLCAnXFx1MDE3Zic6ICdzJ1xuICB9O1xuXG4gIC8qKiBVc2VkIHRvIG1hcCBjaGFyYWN0ZXJzIHRvIEhUTUwgZW50aXRpZXMuICovXG4gIHZhciBodG1sRXNjYXBlcyA9IHtcbiAgICAnJic6ICcmYW1wOycsXG4gICAgJzwnOiAnJmx0OycsXG4gICAgJz4nOiAnJmd0OycsXG4gICAgJ1wiJzogJyZxdW90OycsXG4gICAgXCInXCI6ICcmIzM5OydcbiAgfTtcblxuICAvKiogVXNlZCB0byBtYXAgSFRNTCBlbnRpdGllcyB0byBjaGFyYWN0ZXJzLiAqL1xuICB2YXIgaHRtbFVuZXNjYXBlcyA9IHtcbiAgICAnJmFtcDsnOiAnJicsXG4gICAgJyZsdDsnOiAnPCcsXG4gICAgJyZndDsnOiAnPicsXG4gICAgJyZxdW90Oyc6ICdcIicsXG4gICAgJyYjMzk7JzogXCInXCJcbiAgfTtcblxuICAvKiogVXNlZCB0byBlc2NhcGUgY2hhcmFjdGVycyBmb3IgaW5jbHVzaW9uIGluIGNvbXBpbGVkIHN0cmluZyBsaXRlcmFscy4gKi9cbiAgdmFyIHN0cmluZ0VzY2FwZXMgPSB7XG4gICAgJ1xcXFwnOiAnXFxcXCcsXG4gICAgXCInXCI6IFwiJ1wiLFxuICAgICdcXG4nOiAnbicsXG4gICAgJ1xccic6ICdyJyxcbiAgICAnXFx1MjAyOCc6ICd1MjAyOCcsXG4gICAgJ1xcdTIwMjknOiAndTIwMjknXG4gIH07XG5cbiAgLyoqIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIHdpdGhvdXQgYSBkZXBlbmRlbmN5IG9uIGByb290YC4gKi9cbiAgdmFyIGZyZWVQYXJzZUZsb2F0ID0gcGFyc2VGbG9hdCxcbiAgICAgIGZyZWVQYXJzZUludCA9IHBhcnNlSW50O1xuXG4gIC8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgZ2xvYmFsYCBmcm9tIE5vZGUuanMuICovXG4gIHZhciBmcmVlR2xvYmFsID0gdHlwZW9mIGdsb2JhbCA9PSAnb2JqZWN0JyAmJiBnbG9iYWwgJiYgZ2xvYmFsLk9iamVjdCA9PT0gT2JqZWN0ICYmIGdsb2JhbDtcblxuICAvKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYHNlbGZgLiAqL1xuICB2YXIgZnJlZVNlbGYgPSB0eXBlb2Ygc2VsZiA9PSAnb2JqZWN0JyAmJiBzZWxmICYmIHNlbGYuT2JqZWN0ID09PSBPYmplY3QgJiYgc2VsZjtcblxuICAvKiogVXNlZCBhcyBhIHJlZmVyZW5jZSB0byB0aGUgZ2xvYmFsIG9iamVjdC4gKi9cbiAgdmFyIHJvb3QgPSBmcmVlR2xvYmFsIHx8IGZyZWVTZWxmIHx8IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG5cbiAgLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBleHBvcnRzYC4gKi9cbiAgdmFyIGZyZWVFeHBvcnRzID0gdHlwZW9mIGV4cG9ydHMgPT0gJ29iamVjdCcgJiYgZXhwb3J0cyAmJiAhZXhwb3J0cy5ub2RlVHlwZSAmJiBleHBvcnRzO1xuXG4gIC8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgbW9kdWxlYC4gKi9cbiAgdmFyIGZyZWVNb2R1bGUgPSBmcmVlRXhwb3J0cyAmJiB0eXBlb2YgbW9kdWxlID09ICdvYmplY3QnICYmIG1vZHVsZSAmJiAhbW9kdWxlLm5vZGVUeXBlICYmIG1vZHVsZTtcblxuICAvKiogRGV0ZWN0IHRoZSBwb3B1bGFyIENvbW1vbkpTIGV4dGVuc2lvbiBgbW9kdWxlLmV4cG9ydHNgLiAqL1xuICB2YXIgbW9kdWxlRXhwb3J0cyA9IGZyZWVNb2R1bGUgJiYgZnJlZU1vZHVsZS5leHBvcnRzID09PSBmcmVlRXhwb3J0cztcblxuICAvKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYHByb2Nlc3NgIGZyb20gTm9kZS5qcy4gKi9cbiAgdmFyIGZyZWVQcm9jZXNzID0gbW9kdWxlRXhwb3J0cyAmJiBmcmVlR2xvYmFsLnByb2Nlc3M7XG5cbiAgLyoqIFVzZWQgdG8gYWNjZXNzIGZhc3RlciBOb2RlLmpzIGhlbHBlcnMuICovXG4gIHZhciBub2RlVXRpbCA9IChmdW5jdGlvbigpIHtcbiAgICB0cnkge1xuICAgICAgLy8gVXNlIGB1dGlsLnR5cGVzYCBmb3IgTm9kZS5qcyAxMCsuXG4gICAgICB2YXIgdHlwZXMgPSBmcmVlTW9kdWxlICYmIGZyZWVNb2R1bGUucmVxdWlyZSAmJiBmcmVlTW9kdWxlLnJlcXVpcmUoJ3V0aWwnKS50eXBlcztcblxuICAgICAgaWYgKHR5cGVzKSB7XG4gICAgICAgIHJldHVybiB0eXBlcztcbiAgICAgIH1cblxuICAgICAgLy8gTGVnYWN5IGBwcm9jZXNzLmJpbmRpbmcoJ3V0aWwnKWAgZm9yIE5vZGUuanMgPCAxMC5cbiAgICAgIHJldHVybiBmcmVlUHJvY2VzcyAmJiBmcmVlUHJvY2Vzcy5iaW5kaW5nICYmIGZyZWVQcm9jZXNzLmJpbmRpbmcoJ3V0aWwnKTtcbiAgICB9IGNhdGNoIChlKSB7fVxuICB9KCkpO1xuXG4gIC8qIE5vZGUuanMgaGVscGVyIHJlZmVyZW5jZXMuICovXG4gIHZhciBub2RlSXNBcnJheUJ1ZmZlciA9IG5vZGVVdGlsICYmIG5vZGVVdGlsLmlzQXJyYXlCdWZmZXIsXG4gICAgICBub2RlSXNEYXRlID0gbm9kZVV0aWwgJiYgbm9kZVV0aWwuaXNEYXRlLFxuICAgICAgbm9kZUlzTWFwID0gbm9kZVV0aWwgJiYgbm9kZVV0aWwuaXNNYXAsXG4gICAgICBub2RlSXNSZWdFeHAgPSBub2RlVXRpbCAmJiBub2RlVXRpbC5pc1JlZ0V4cCxcbiAgICAgIG5vZGVJc1NldCA9IG5vZGVVdGlsICYmIG5vZGVVdGlsLmlzU2V0LFxuICAgICAgbm9kZUlzVHlwZWRBcnJheSA9IG5vZGVVdGlsICYmIG5vZGVVdGlsLmlzVHlwZWRBcnJheTtcblxuICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAvKipcbiAgICogQSBmYXN0ZXIgYWx0ZXJuYXRpdmUgdG8gYEZ1bmN0aW9uI2FwcGx5YCwgdGhpcyBmdW5jdGlvbiBpbnZva2VzIGBmdW5jYFxuICAgKiB3aXRoIHRoZSBgdGhpc2AgYmluZGluZyBvZiBgdGhpc0FyZ2AgYW5kIHRoZSBhcmd1bWVudHMgb2YgYGFyZ3NgLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBpbnZva2UuXG4gICAqIEBwYXJhbSB7Kn0gdGhpc0FyZyBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGZ1bmNgLlxuICAgKiBAcGFyYW0ge0FycmF5fSBhcmdzIFRoZSBhcmd1bWVudHMgdG8gaW52b2tlIGBmdW5jYCB3aXRoLlxuICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmVzdWx0IG9mIGBmdW5jYC5cbiAgICovXG4gIGZ1bmN0aW9uIGFwcGx5KGZ1bmMsIHRoaXNBcmcsIGFyZ3MpIHtcbiAgICBzd2l0Y2ggKGFyZ3MubGVuZ3RoKSB7XG4gICAgICBjYXNlIDA6IHJldHVybiBmdW5jLmNhbGwodGhpc0FyZyk7XG4gICAgICBjYXNlIDE6IHJldHVybiBmdW5jLmNhbGwodGhpc0FyZywgYXJnc1swXSk7XG4gICAgICBjYXNlIDI6IHJldHVybiBmdW5jLmNhbGwodGhpc0FyZywgYXJnc1swXSwgYXJnc1sxXSk7XG4gICAgICBjYXNlIDM6IHJldHVybiBmdW5jLmNhbGwodGhpc0FyZywgYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSk7XG4gICAgfVxuICAgIHJldHVybiBmdW5jLmFwcGx5KHRoaXNBcmcsIGFyZ3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZUFnZ3JlZ2F0b3JgIGZvciBhcnJheXMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gc2V0dGVyIFRoZSBmdW5jdGlvbiB0byBzZXQgYGFjY3VtdWxhdG9yYCB2YWx1ZXMuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBpdGVyYXRlZSB0byB0cmFuc2Zvcm0ga2V5cy5cbiAgICogQHBhcmFtIHtPYmplY3R9IGFjY3VtdWxhdG9yIFRoZSBpbml0aWFsIGFnZ3JlZ2F0ZWQgb2JqZWN0LlxuICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgYGFjY3VtdWxhdG9yYC5cbiAgICovXG4gIGZ1bmN0aW9uIGFycmF5QWdncmVnYXRvcihhcnJheSwgc2V0dGVyLCBpdGVyYXRlZSwgYWNjdW11bGF0b3IpIHtcbiAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdO1xuICAgICAgc2V0dGVyKGFjY3VtdWxhdG9yLCB2YWx1ZSwgaXRlcmF0ZWUodmFsdWUpLCBhcnJheSk7XG4gICAgfVxuICAgIHJldHVybiBhY2N1bXVsYXRvcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uZm9yRWFjaGAgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yXG4gICAqIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gICAqL1xuICBmdW5jdGlvbiBhcnJheUVhY2goYXJyYXksIGl0ZXJhdGVlKSB7XG4gICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuXG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIGlmIChpdGVyYXRlZShhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSkgPT09IGZhbHNlKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYXJyYXk7XG4gIH1cblxuICAvKipcbiAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLmZvckVhY2hSaWdodGAgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yXG4gICAqIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gICAqL1xuICBmdW5jdGlvbiBhcnJheUVhY2hSaWdodChhcnJheSwgaXRlcmF0ZWUpIHtcbiAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG5cbiAgICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICAgIGlmIChpdGVyYXRlZShhcnJheVtsZW5ndGhdLCBsZW5ndGgsIGFycmF5KSA9PT0gZmFsc2UpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhcnJheTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uZXZlcnlgIGZvciBhcnJheXMgd2l0aG91dCBzdXBwb3J0IGZvclxuICAgKiBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRpY2F0ZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYWxsIGVsZW1lbnRzIHBhc3MgdGhlIHByZWRpY2F0ZSBjaGVjayxcbiAgICogIGVsc2UgYGZhbHNlYC5cbiAgICovXG4gIGZ1bmN0aW9uIGFycmF5RXZlcnkoYXJyYXksIHByZWRpY2F0ZSkge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICBpZiAoIXByZWRpY2F0ZShhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uZmlsdGVyYCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3JcbiAgICogaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZmlsdGVyZWQgYXJyYXkuXG4gICAqL1xuICBmdW5jdGlvbiBhcnJheUZpbHRlcihhcnJheSwgcHJlZGljYXRlKSB7XG4gICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoLFxuICAgICAgICByZXNJbmRleCA9IDAsXG4gICAgICAgIHJlc3VsdCA9IFtdO1xuXG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIHZhciB2YWx1ZSA9IGFycmF5W2luZGV4XTtcbiAgICAgIGlmIChwcmVkaWNhdGUodmFsdWUsIGluZGV4LCBhcnJheSkpIHtcbiAgICAgICAgcmVzdWx0W3Jlc0luZGV4KytdID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLmluY2x1ZGVzYCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3JcbiAgICogc3BlY2lmeWluZyBhbiBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICogQHBhcmFtIHsqfSB0YXJnZXQgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdGFyZ2V0YCBpcyBmb3VuZCwgZWxzZSBgZmFsc2VgLlxuICAgKi9cbiAgZnVuY3Rpb24gYXJyYXlJbmNsdWRlcyhhcnJheSwgdmFsdWUpIHtcbiAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgcmV0dXJuICEhbGVuZ3RoICYmIGJhc2VJbmRleE9mKGFycmF5LCB2YWx1ZSwgMCkgPiAtMTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIGZ1bmN0aW9uIGlzIGxpa2UgYGFycmF5SW5jbHVkZXNgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYSBjb21wYXJhdG9yLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgKiBAcGFyYW0geyp9IHRhcmdldCBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY29tcGFyYXRvciBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHRhcmdldGAgaXMgZm91bmQsIGVsc2UgYGZhbHNlYC5cbiAgICovXG4gIGZ1bmN0aW9uIGFycmF5SW5jbHVkZXNXaXRoKGFycmF5LCB2YWx1ZSwgY29tcGFyYXRvcikge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICBpZiAoY29tcGFyYXRvcih2YWx1ZSwgYXJyYXlbaW5kZXhdKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5tYXBgIGZvciBhcnJheXMgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZVxuICAgKiBzaG9ydGhhbmRzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IG1hcHBlZCBhcnJheS5cbiAgICovXG4gIGZ1bmN0aW9uIGFycmF5TWFwKGFycmF5LCBpdGVyYXRlZSkge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgcmVzdWx0ID0gQXJyYXkobGVuZ3RoKTtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICByZXN1bHRbaW5kZXhdID0gaXRlcmF0ZWUoYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcGVuZHMgdGhlIGVsZW1lbnRzIG9mIGB2YWx1ZXNgIHRvIGBhcnJheWAuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBtb2RpZnkuXG4gICAqIEBwYXJhbSB7QXJyYXl9IHZhbHVlcyBUaGUgdmFsdWVzIHRvIGFwcGVuZC5cbiAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gICAqL1xuICBmdW5jdGlvbiBhcnJheVB1c2goYXJyYXksIHZhbHVlcykge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICBsZW5ndGggPSB2YWx1ZXMubGVuZ3RoLFxuICAgICAgICBvZmZzZXQgPSBhcnJheS5sZW5ndGg7XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgYXJyYXlbb2Zmc2V0ICsgaW5kZXhdID0gdmFsdWVzW2luZGV4XTtcbiAgICB9XG4gICAgcmV0dXJuIGFycmF5O1xuICB9XG5cbiAgLyoqXG4gICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5yZWR1Y2VgIGZvciBhcnJheXMgd2l0aG91dCBzdXBwb3J0IGZvclxuICAgKiBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAqIEBwYXJhbSB7Kn0gW2FjY3VtdWxhdG9yXSBUaGUgaW5pdGlhbCB2YWx1ZS5cbiAgICogQHBhcmFtIHtib29sZWFufSBbaW5pdEFjY3VtXSBTcGVjaWZ5IHVzaW5nIHRoZSBmaXJzdCBlbGVtZW50IG9mIGBhcnJheWAgYXNcbiAgICogIHRoZSBpbml0aWFsIHZhbHVlLlxuICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgYWNjdW11bGF0ZWQgdmFsdWUuXG4gICAqL1xuICBmdW5jdGlvbiBhcnJheVJlZHVjZShhcnJheSwgaXRlcmF0ZWUsIGFjY3VtdWxhdG9yLCBpbml0QWNjdW0pIHtcbiAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG5cbiAgICBpZiAoaW5pdEFjY3VtICYmIGxlbmd0aCkge1xuICAgICAgYWNjdW11bGF0b3IgPSBhcnJheVsrK2luZGV4XTtcbiAgICB9XG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIGFjY3VtdWxhdG9yID0gaXRlcmF0ZWUoYWNjdW11bGF0b3IsIGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KTtcbiAgICB9XG4gICAgcmV0dXJuIGFjY3VtdWxhdG9yO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5yZWR1Y2VSaWdodGAgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yXG4gICAqIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICogQHBhcmFtIHsqfSBbYWNjdW11bGF0b3JdIFRoZSBpbml0aWFsIHZhbHVlLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpbml0QWNjdW1dIFNwZWNpZnkgdXNpbmcgdGhlIGxhc3QgZWxlbWVudCBvZiBgYXJyYXlgIGFzXG4gICAqICB0aGUgaW5pdGlhbCB2YWx1ZS5cbiAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGFjY3VtdWxhdGVkIHZhbHVlLlxuICAgKi9cbiAgZnVuY3Rpb24gYXJyYXlSZWR1Y2VSaWdodChhcnJheSwgaXRlcmF0ZWUsIGFjY3VtdWxhdG9yLCBpbml0QWNjdW0pIHtcbiAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgaWYgKGluaXRBY2N1bSAmJiBsZW5ndGgpIHtcbiAgICAgIGFjY3VtdWxhdG9yID0gYXJyYXlbLS1sZW5ndGhdO1xuICAgIH1cbiAgICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICAgIGFjY3VtdWxhdG9yID0gaXRlcmF0ZWUoYWNjdW11bGF0b3IsIGFycmF5W2xlbmd0aF0sIGxlbmd0aCwgYXJyYXkpO1xuICAgIH1cbiAgICByZXR1cm4gYWNjdW11bGF0b3I7XG4gIH1cblxuICAvKipcbiAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLnNvbWVgIGZvciBhcnJheXMgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZVxuICAgKiBzaG9ydGhhbmRzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRpY2F0ZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW55IGVsZW1lbnQgcGFzc2VzIHRoZSBwcmVkaWNhdGUgY2hlY2ssXG4gICAqICBlbHNlIGBmYWxzZWAuXG4gICAqL1xuICBmdW5jdGlvbiBhcnJheVNvbWUoYXJyYXksIHByZWRpY2F0ZSkge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICBpZiAocHJlZGljYXRlKGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHNpemUgb2YgYW4gQVNDSUkgYHN0cmluZ2AuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyBpbnNwZWN0LlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBzdHJpbmcgc2l6ZS5cbiAgICovXG4gIHZhciBhc2NpaVNpemUgPSBiYXNlUHJvcGVydHkoJ2xlbmd0aCcpO1xuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhbiBBU0NJSSBgc3RyaW5nYCB0byBhbiBhcnJheS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgY29udmVydGVkIGFycmF5LlxuICAgKi9cbiAgZnVuY3Rpb24gYXNjaWlUb0FycmF5KHN0cmluZykge1xuICAgIHJldHVybiBzdHJpbmcuc3BsaXQoJycpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNwbGl0cyBhbiBBU0NJSSBgc3RyaW5nYCBpbnRvIGFuIGFycmF5IG9mIGl0cyB3b3Jkcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IFRoZSBzdHJpbmcgdG8gaW5zcGVjdC5cbiAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSB3b3JkcyBvZiBgc3RyaW5nYC5cbiAgICovXG4gIGZ1bmN0aW9uIGFzY2lpV29yZHMoc3RyaW5nKSB7XG4gICAgcmV0dXJuIHN0cmluZy5tYXRjaChyZUFzY2lpV29yZCkgfHwgW107XG4gIH1cblxuICAvKipcbiAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgbWV0aG9kcyBsaWtlIGBfLmZpbmRLZXlgIGFuZCBgXy5maW5kTGFzdEtleWAsXG4gICAqIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcywgd2hpY2ggaXRlcmF0ZXMgb3ZlciBgY29sbGVjdGlvbmBcbiAgICogdXNpbmcgYGVhY2hGdW5jYC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaW5zcGVjdC5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGVhY2hGdW5jIFRoZSBmdW5jdGlvbiB0byBpdGVyYXRlIG92ZXIgYGNvbGxlY3Rpb25gLlxuICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZm91bmQgZWxlbWVudCBvciBpdHMga2V5LCBlbHNlIGB1bmRlZmluZWRgLlxuICAgKi9cbiAgZnVuY3Rpb24gYmFzZUZpbmRLZXkoY29sbGVjdGlvbiwgcHJlZGljYXRlLCBlYWNoRnVuYykge1xuICAgIHZhciByZXN1bHQ7XG4gICAgZWFjaEZ1bmMoY29sbGVjdGlvbiwgZnVuY3Rpb24odmFsdWUsIGtleSwgY29sbGVjdGlvbikge1xuICAgICAgaWYgKHByZWRpY2F0ZSh2YWx1ZSwga2V5LCBjb2xsZWN0aW9uKSkge1xuICAgICAgICByZXN1bHQgPSBrZXk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZpbmRJbmRleGAgYW5kIGBfLmZpbmRMYXN0SW5kZXhgIHdpdGhvdXRcbiAgICogc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRpY2F0ZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgKiBAcGFyYW0ge251bWJlcn0gZnJvbUluZGV4IFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAgICogQHBhcmFtIHtib29sZWFufSBbZnJvbVJpZ2h0XSBTcGVjaWZ5IGl0ZXJhdGluZyBmcm9tIHJpZ2h0IHRvIGxlZnQuXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlLCBlbHNlIGAtMWAuXG4gICAqL1xuICBmdW5jdGlvbiBiYXNlRmluZEluZGV4KGFycmF5LCBwcmVkaWNhdGUsIGZyb21JbmRleCwgZnJvbVJpZ2h0KSB7XG4gICAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgaW5kZXggPSBmcm9tSW5kZXggKyAoZnJvbVJpZ2h0ID8gMSA6IC0xKTtcblxuICAgIHdoaWxlICgoZnJvbVJpZ2h0ID8gaW5kZXgtLSA6ICsraW5kZXggPCBsZW5ndGgpKSB7XG4gICAgICBpZiAocHJlZGljYXRlKGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KSkge1xuICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAtMTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pbmRleE9mYCB3aXRob3V0IGBmcm9tSW5kZXhgIGJvdW5kcyBjaGVja3MuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICAgKiBAcGFyYW0ge251bWJlcn0gZnJvbUluZGV4IFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAgICovXG4gIGZ1bmN0aW9uIGJhc2VJbmRleE9mKGFycmF5LCB2YWx1ZSwgZnJvbUluZGV4KSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSB2YWx1ZVxuICAgICAgPyBzdHJpY3RJbmRleE9mKGFycmF5LCB2YWx1ZSwgZnJvbUluZGV4KVxuICAgICAgOiBiYXNlRmluZEluZGV4KGFycmF5LCBiYXNlSXNOYU4sIGZyb21JbmRleCk7XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBmdW5jdGlvbiBpcyBsaWtlIGBiYXNlSW5kZXhPZmAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBhIGNvbXBhcmF0b3IuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICAgKiBAcGFyYW0ge251bWJlcn0gZnJvbUluZGV4IFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY29tcGFyYXRvciBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbWF0Y2hlZCB2YWx1ZSwgZWxzZSBgLTFgLlxuICAgKi9cbiAgZnVuY3Rpb24gYmFzZUluZGV4T2ZXaXRoKGFycmF5LCB2YWx1ZSwgZnJvbUluZGV4LCBjb21wYXJhdG9yKSB7XG4gICAgdmFyIGluZGV4ID0gZnJvbUluZGV4IC0gMSxcbiAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIGlmIChjb21wYXJhdG9yKGFycmF5W2luZGV4XSwgdmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBpbmRleDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIC0xO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzTmFOYCB3aXRob3V0IHN1cHBvcnQgZm9yIG51bWJlciBvYmplY3RzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYE5hTmAsIGVsc2UgYGZhbHNlYC5cbiAgICovXG4gIGZ1bmN0aW9uIGJhc2VJc05hTih2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSAhPT0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ubWVhbmAgYW5kIGBfLm1lYW5CeWAgd2l0aG91dCBzdXBwb3J0IGZvclxuICAgKiBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBtZWFuLlxuICAgKi9cbiAgZnVuY3Rpb24gYmFzZU1lYW4oYXJyYXksIGl0ZXJhdGVlKSB7XG4gICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgIHJldHVybiBsZW5ndGggPyAoYmFzZVN1bShhcnJheSwgaXRlcmF0ZWUpIC8gbGVuZ3RoKSA6IE5BTjtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5wcm9wZXJ0eWAgd2l0aG91dCBzdXBwb3J0IGZvciBkZWVwIHBhdGhzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYWNjZXNzb3IgZnVuY3Rpb24uXG4gICAqL1xuICBmdW5jdGlvbiBiYXNlUHJvcGVydHkoa2V5KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKG9iamVjdCkge1xuICAgICAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8gdW5kZWZpbmVkIDogb2JqZWN0W2tleV07XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5wcm9wZXJ0eU9mYCB3aXRob3V0IHN1cHBvcnQgZm9yIGRlZXAgcGF0aHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYWNjZXNzb3IgZnVuY3Rpb24uXG4gICAqL1xuICBmdW5jdGlvbiBiYXNlUHJvcGVydHlPZihvYmplY3QpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oa2V5KSB7XG4gICAgICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyB1bmRlZmluZWQgOiBvYmplY3Rba2V5XTtcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnJlZHVjZWAgYW5kIGBfLnJlZHVjZVJpZ2h0YCwgd2l0aG91dCBzdXBwb3J0XG4gICAqIGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLCB3aGljaCBpdGVyYXRlcyBvdmVyIGBjb2xsZWN0aW9uYCB1c2luZyBgZWFjaEZ1bmNgLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAqIEBwYXJhbSB7Kn0gYWNjdW11bGF0b3IgVGhlIGluaXRpYWwgdmFsdWUuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaW5pdEFjY3VtIFNwZWNpZnkgdXNpbmcgdGhlIGZpcnN0IG9yIGxhc3QgZWxlbWVudCBvZlxuICAgKiAgYGNvbGxlY3Rpb25gIGFzIHRoZSBpbml0aWFsIHZhbHVlLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBlYWNoRnVuYyBUaGUgZnVuY3Rpb24gdG8gaXRlcmF0ZSBvdmVyIGBjb2xsZWN0aW9uYC5cbiAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGFjY3VtdWxhdGVkIHZhbHVlLlxuICAgKi9cbiAgZnVuY3Rpb24gYmFzZVJlZHVjZShjb2xsZWN0aW9uLCBpdGVyYXRlZSwgYWNjdW11bGF0b3IsIGluaXRBY2N1bSwgZWFjaEZ1bmMpIHtcbiAgICBlYWNoRnVuYyhjb2xsZWN0aW9uLCBmdW5jdGlvbih2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pIHtcbiAgICAgIGFjY3VtdWxhdG9yID0gaW5pdEFjY3VtXG4gICAgICAgID8gKGluaXRBY2N1bSA9IGZhbHNlLCB2YWx1ZSlcbiAgICAgICAgOiBpdGVyYXRlZShhY2N1bXVsYXRvciwgdmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKTtcbiAgICB9KTtcbiAgICByZXR1cm4gYWNjdW11bGF0b3I7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uc29ydEJ5YCB3aGljaCB1c2VzIGBjb21wYXJlcmAgdG8gZGVmaW5lIHRoZVxuICAgKiBzb3J0IG9yZGVyIG9mIGBhcnJheWAgYW5kIHJlcGxhY2VzIGNyaXRlcmlhIG9iamVjdHMgd2l0aCB0aGVpciBjb3JyZXNwb25kaW5nXG4gICAqIHZhbHVlcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHNvcnQuXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNvbXBhcmVyIFRoZSBmdW5jdGlvbiB0byBkZWZpbmUgc29ydCBvcmRlci5cbiAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gICAqL1xuICBmdW5jdGlvbiBiYXNlU29ydEJ5KGFycmF5LCBjb21wYXJlcikge1xuICAgIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG5cbiAgICBhcnJheS5zb3J0KGNvbXBhcmVyKTtcbiAgICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICAgIGFycmF5W2xlbmd0aF0gPSBhcnJheVtsZW5ndGhdLnZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gYXJyYXk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uc3VtYCBhbmQgYF8uc3VtQnlgIHdpdGhvdXQgc3VwcG9ydCBmb3JcbiAgICogaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgc3VtLlxuICAgKi9cbiAgZnVuY3Rpb24gYmFzZVN1bShhcnJheSwgaXRlcmF0ZWUpIHtcbiAgICB2YXIgcmVzdWx0LFxuICAgICAgICBpbmRleCA9IC0xLFxuICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG5cbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgdmFyIGN1cnJlbnQgPSBpdGVyYXRlZShhcnJheVtpbmRleF0pO1xuICAgICAgaWYgKGN1cnJlbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXN1bHQgPSByZXN1bHQgPT09IHVuZGVmaW5lZCA/IGN1cnJlbnQgOiAocmVzdWx0ICsgY3VycmVudCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udGltZXNgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kc1xuICAgKiBvciBtYXggYXJyYXkgbGVuZ3RoIGNoZWNrcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtudW1iZXJ9IG4gVGhlIG51bWJlciBvZiB0aW1lcyB0byBpbnZva2UgYGl0ZXJhdGVlYC5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiByZXN1bHRzLlxuICAgKi9cbiAgZnVuY3Rpb24gYmFzZVRpbWVzKG4sIGl0ZXJhdGVlKSB7XG4gICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgIHJlc3VsdCA9IEFycmF5KG4pO1xuXG4gICAgd2hpbGUgKCsraW5kZXggPCBuKSB7XG4gICAgICByZXN1bHRbaW5kZXhdID0gaXRlcmF0ZWUoaW5kZXgpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnRvUGFpcnNgIGFuZCBgXy50b1BhaXJzSW5gIHdoaWNoIGNyZWF0ZXMgYW4gYXJyYXlcbiAgICogb2Yga2V5LXZhbHVlIHBhaXJzIGZvciBgb2JqZWN0YCBjb3JyZXNwb25kaW5nIHRvIHRoZSBwcm9wZXJ0eSBuYW1lcyBvZiBgcHJvcHNgLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAqIEBwYXJhbSB7QXJyYXl9IHByb3BzIFRoZSBwcm9wZXJ0eSBuYW1lcyB0byBnZXQgdmFsdWVzIGZvci5cbiAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUga2V5LXZhbHVlIHBhaXJzLlxuICAgKi9cbiAgZnVuY3Rpb24gYmFzZVRvUGFpcnMob2JqZWN0LCBwcm9wcykge1xuICAgIHJldHVybiBhcnJheU1hcChwcm9wcywgZnVuY3Rpb24oa2V5KSB7XG4gICAgICByZXR1cm4gW2tleSwgb2JqZWN0W2tleV1dO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnRyaW1gLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gdHJpbS5cbiAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgdHJpbW1lZCBzdHJpbmcuXG4gICAqL1xuICBmdW5jdGlvbiBiYXNlVHJpbShzdHJpbmcpIHtcbiAgICByZXR1cm4gc3RyaW5nXG4gICAgICA/IHN0cmluZy5zbGljZSgwLCB0cmltbWVkRW5kSW5kZXgoc3RyaW5nKSArIDEpLnJlcGxhY2UocmVUcmltU3RhcnQsICcnKVxuICAgICAgOiBzdHJpbmc7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udW5hcnlgIHdpdGhvdXQgc3VwcG9ydCBmb3Igc3RvcmluZyBtZXRhZGF0YS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY2FwIGFyZ3VtZW50cyBmb3IuXG4gICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGNhcHBlZCBmdW5jdGlvbi5cbiAgICovXG4gIGZ1bmN0aW9uIGJhc2VVbmFyeShmdW5jKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICByZXR1cm4gZnVuYyh2YWx1ZSk7XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy52YWx1ZXNgIGFuZCBgXy52YWx1ZXNJbmAgd2hpY2ggY3JlYXRlcyBhblxuICAgKiBhcnJheSBvZiBgb2JqZWN0YCBwcm9wZXJ0eSB2YWx1ZXMgY29ycmVzcG9uZGluZyB0byB0aGUgcHJvcGVydHkgbmFtZXNcbiAgICogb2YgYHByb3BzYC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgKiBAcGFyYW0ge0FycmF5fSBwcm9wcyBUaGUgcHJvcGVydHkgbmFtZXMgdG8gZ2V0IHZhbHVlcyBmb3IuXG4gICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IHZhbHVlcy5cbiAgICovXG4gIGZ1bmN0aW9uIGJhc2VWYWx1ZXMob2JqZWN0LCBwcm9wcykge1xuICAgIHJldHVybiBhcnJheU1hcChwcm9wcywgZnVuY3Rpb24oa2V5KSB7XG4gICAgICByZXR1cm4gb2JqZWN0W2tleV07XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIGEgYGNhY2hlYCB2YWx1ZSBmb3IgYGtleWAgZXhpc3RzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge09iamVjdH0gY2FjaGUgVGhlIGNhY2hlIHRvIHF1ZXJ5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIGVudHJ5IHRvIGNoZWNrLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW4gZW50cnkgZm9yIGBrZXlgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICAgKi9cbiAgZnVuY3Rpb24gY2FjaGVIYXMoY2FjaGUsIGtleSkge1xuICAgIHJldHVybiBjYWNoZS5oYXMoa2V5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVc2VkIGJ5IGBfLnRyaW1gIGFuZCBgXy50cmltU3RhcnRgIHRvIGdldCB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IHN0cmluZyBzeW1ib2xcbiAgICogdGhhdCBpcyBub3QgZm91bmQgaW4gdGhlIGNoYXJhY3RlciBzeW1ib2xzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBzdHJTeW1ib2xzIFRoZSBzdHJpbmcgc3ltYm9scyB0byBpbnNwZWN0LlxuICAgKiBAcGFyYW0ge0FycmF5fSBjaHJTeW1ib2xzIFRoZSBjaGFyYWN0ZXIgc3ltYm9scyB0byBmaW5kLlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgdW5tYXRjaGVkIHN0cmluZyBzeW1ib2wuXG4gICAqL1xuICBmdW5jdGlvbiBjaGFyc1N0YXJ0SW5kZXgoc3RyU3ltYm9scywgY2hyU3ltYm9scykge1xuICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICBsZW5ndGggPSBzdHJTeW1ib2xzLmxlbmd0aDtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoICYmIGJhc2VJbmRleE9mKGNoclN5bWJvbHMsIHN0clN5bWJvbHNbaW5kZXhdLCAwKSA+IC0xKSB7fVxuICAgIHJldHVybiBpbmRleDtcbiAgfVxuXG4gIC8qKlxuICAgKiBVc2VkIGJ5IGBfLnRyaW1gIGFuZCBgXy50cmltRW5kYCB0byBnZXQgdGhlIGluZGV4IG9mIHRoZSBsYXN0IHN0cmluZyBzeW1ib2xcbiAgICogdGhhdCBpcyBub3QgZm91bmQgaW4gdGhlIGNoYXJhY3RlciBzeW1ib2xzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBzdHJTeW1ib2xzIFRoZSBzdHJpbmcgc3ltYm9scyB0byBpbnNwZWN0LlxuICAgKiBAcGFyYW0ge0FycmF5fSBjaHJTeW1ib2xzIFRoZSBjaGFyYWN0ZXIgc3ltYm9scyB0byBmaW5kLlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbGFzdCB1bm1hdGNoZWQgc3RyaW5nIHN5bWJvbC5cbiAgICovXG4gIGZ1bmN0aW9uIGNoYXJzRW5kSW5kZXgoc3RyU3ltYm9scywgY2hyU3ltYm9scykge1xuICAgIHZhciBpbmRleCA9IHN0clN5bWJvbHMubGVuZ3RoO1xuXG4gICAgd2hpbGUgKGluZGV4LS0gJiYgYmFzZUluZGV4T2YoY2hyU3ltYm9scywgc3RyU3ltYm9sc1tpbmRleF0sIDApID4gLTEpIHt9XG4gICAgcmV0dXJuIGluZGV4O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIG51bWJlciBvZiBgcGxhY2Vob2xkZXJgIG9jY3VycmVuY2VzIGluIGBhcnJheWAuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgKiBAcGFyYW0geyp9IHBsYWNlaG9sZGVyIFRoZSBwbGFjZWhvbGRlciB0byBzZWFyY2ggZm9yLlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBwbGFjZWhvbGRlciBjb3VudC5cbiAgICovXG4gIGZ1bmN0aW9uIGNvdW50SG9sZGVycyhhcnJheSwgcGxhY2Vob2xkZXIpIHtcbiAgICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgICByZXN1bHQgPSAwO1xuXG4gICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICBpZiAoYXJyYXlbbGVuZ3RoXSA9PT0gcGxhY2Vob2xkZXIpIHtcbiAgICAgICAgKytyZXN1bHQ7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogVXNlZCBieSBgXy5kZWJ1cnJgIHRvIGNvbnZlcnQgTGF0aW4tMSBTdXBwbGVtZW50IGFuZCBMYXRpbiBFeHRlbmRlZC1BXG4gICAqIGxldHRlcnMgdG8gYmFzaWMgTGF0aW4gbGV0dGVycy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGxldHRlciBUaGUgbWF0Y2hlZCBsZXR0ZXIgdG8gZGVidXJyLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBkZWJ1cnJlZCBsZXR0ZXIuXG4gICAqL1xuICB2YXIgZGVidXJyTGV0dGVyID0gYmFzZVByb3BlcnR5T2YoZGVidXJyZWRMZXR0ZXJzKTtcblxuICAvKipcbiAgICogVXNlZCBieSBgXy5lc2NhcGVgIHRvIGNvbnZlcnQgY2hhcmFjdGVycyB0byBIVE1MIGVudGl0aWVzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2hyIFRoZSBtYXRjaGVkIGNoYXJhY3RlciB0byBlc2NhcGUuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGVzY2FwZWQgY2hhcmFjdGVyLlxuICAgKi9cbiAgdmFyIGVzY2FwZUh0bWxDaGFyID0gYmFzZVByb3BlcnR5T2YoaHRtbEVzY2FwZXMpO1xuXG4gIC8qKlxuICAgKiBVc2VkIGJ5IGBfLnRlbXBsYXRlYCB0byBlc2NhcGUgY2hhcmFjdGVycyBmb3IgaW5jbHVzaW9uIGluIGNvbXBpbGVkIHN0cmluZyBsaXRlcmFscy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNociBUaGUgbWF0Y2hlZCBjaGFyYWN0ZXIgdG8gZXNjYXBlLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBlc2NhcGVkIGNoYXJhY3Rlci5cbiAgICovXG4gIGZ1bmN0aW9uIGVzY2FwZVN0cmluZ0NoYXIoY2hyKSB7XG4gICAgcmV0dXJuICdcXFxcJyArIHN0cmluZ0VzY2FwZXNbY2hyXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSB2YWx1ZSBhdCBga2V5YCBvZiBgb2JqZWN0YC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3RdIFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcHJvcGVydHkgdmFsdWUuXG4gICAqL1xuICBmdW5jdGlvbiBnZXRWYWx1ZShvYmplY3QsIGtleSkge1xuICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IHVuZGVmaW5lZCA6IG9iamVjdFtrZXldO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBgc3RyaW5nYCBjb250YWlucyBVbmljb2RlIHN5bWJvbHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byBpbnNwZWN0LlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYSBzeW1ib2wgaXMgZm91bmQsIGVsc2UgYGZhbHNlYC5cbiAgICovXG4gIGZ1bmN0aW9uIGhhc1VuaWNvZGUoc3RyaW5nKSB7XG4gICAgcmV0dXJuIHJlSGFzVW5pY29kZS50ZXN0KHN0cmluZyk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIGBzdHJpbmdgIGNvbnRhaW5zIGEgd29yZCBjb21wb3NlZCBvZiBVbmljb2RlIHN5bWJvbHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byBpbnNwZWN0LlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYSB3b3JkIGlzIGZvdW5kLCBlbHNlIGBmYWxzZWAuXG4gICAqL1xuICBmdW5jdGlvbiBoYXNVbmljb2RlV29yZChzdHJpbmcpIHtcbiAgICByZXR1cm4gcmVIYXNVbmljb2RlV29yZC50ZXN0KHN0cmluZyk7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgYGl0ZXJhdG9yYCB0byBhbiBhcnJheS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtPYmplY3R9IGl0ZXJhdG9yIFRoZSBpdGVyYXRvciB0byBjb252ZXJ0LlxuICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBhcnJheS5cbiAgICovXG4gIGZ1bmN0aW9uIGl0ZXJhdG9yVG9BcnJheShpdGVyYXRvcikge1xuICAgIHZhciBkYXRhLFxuICAgICAgICByZXN1bHQgPSBbXTtcblxuICAgIHdoaWxlICghKGRhdGEgPSBpdGVyYXRvci5uZXh0KCkpLmRvbmUpIHtcbiAgICAgIHJlc3VsdC5wdXNoKGRhdGEudmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGBtYXBgIHRvIGl0cyBrZXktdmFsdWUgcGFpcnMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBtYXAgVGhlIG1hcCB0byBjb252ZXJ0LlxuICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGtleS12YWx1ZSBwYWlycy5cbiAgICovXG4gIGZ1bmN0aW9uIG1hcFRvQXJyYXkobWFwKSB7XG4gICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgIHJlc3VsdCA9IEFycmF5KG1hcC5zaXplKTtcblxuICAgIG1hcC5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICAgIHJlc3VsdFsrK2luZGV4XSA9IFtrZXksIHZhbHVlXTtcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSB1bmFyeSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYGZ1bmNgIHdpdGggaXRzIGFyZ3VtZW50IHRyYW5zZm9ybWVkLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB3cmFwLlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSB0cmFuc2Zvcm0gVGhlIGFyZ3VtZW50IHRyYW5zZm9ybS5cbiAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAqL1xuICBmdW5jdGlvbiBvdmVyQXJnKGZ1bmMsIHRyYW5zZm9ybSkge1xuICAgIHJldHVybiBmdW5jdGlvbihhcmcpIHtcbiAgICAgIHJldHVybiBmdW5jKHRyYW5zZm9ybShhcmcpKTtcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcGxhY2VzIGFsbCBgcGxhY2Vob2xkZXJgIGVsZW1lbnRzIGluIGBhcnJheWAgd2l0aCBhbiBpbnRlcm5hbCBwbGFjZWhvbGRlclxuICAgKiBhbmQgcmV0dXJucyBhbiBhcnJheSBvZiB0aGVpciBpbmRleGVzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gbW9kaWZ5LlxuICAgKiBAcGFyYW0geyp9IHBsYWNlaG9sZGVyIFRoZSBwbGFjZWhvbGRlciB0byByZXBsYWNlLlxuICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBwbGFjZWhvbGRlciBpbmRleGVzLlxuICAgKi9cbiAgZnVuY3Rpb24gcmVwbGFjZUhvbGRlcnMoYXJyYXksIHBsYWNlaG9sZGVyKSB7XG4gICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgcmVzSW5kZXggPSAwLFxuICAgICAgICByZXN1bHQgPSBbXTtcblxuICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICB2YXIgdmFsdWUgPSBhcnJheVtpbmRleF07XG4gICAgICBpZiAodmFsdWUgPT09IHBsYWNlaG9sZGVyIHx8IHZhbHVlID09PSBQTEFDRUhPTERFUikge1xuICAgICAgICBhcnJheVtpbmRleF0gPSBQTEFDRUhPTERFUjtcbiAgICAgICAgcmVzdWx0W3Jlc0luZGV4KytdID0gaW5kZXg7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgYHNldGAgdG8gYW4gYXJyYXkgb2YgaXRzIHZhbHVlcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtPYmplY3R9IHNldCBUaGUgc2V0IHRvIGNvbnZlcnQuXG4gICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgdmFsdWVzLlxuICAgKi9cbiAgZnVuY3Rpb24gc2V0VG9BcnJheShzZXQpIHtcbiAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgcmVzdWx0ID0gQXJyYXkoc2V0LnNpemUpO1xuXG4gICAgc2V0LmZvckVhY2goZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIHJlc3VsdFsrK2luZGV4XSA9IHZhbHVlO1xuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgYHNldGAgdG8gaXRzIHZhbHVlLXZhbHVlIHBhaXJzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge09iamVjdH0gc2V0IFRoZSBzZXQgdG8gY29udmVydC5cbiAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSB2YWx1ZS12YWx1ZSBwYWlycy5cbiAgICovXG4gIGZ1bmN0aW9uIHNldFRvUGFpcnMoc2V0KSB7XG4gICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgIHJlc3VsdCA9IEFycmF5KHNldC5zaXplKTtcblxuICAgIHNldC5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICByZXN1bHRbKytpbmRleF0gPSBbdmFsdWUsIHZhbHVlXTtcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5pbmRleE9mYCB3aGljaCBwZXJmb3JtcyBzdHJpY3QgZXF1YWxpdHlcbiAgICogY29tcGFyaXNvbnMgb2YgdmFsdWVzLCBpLmUuIGA9PT1gLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGZyb21JbmRleCBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlLCBlbHNlIGAtMWAuXG4gICAqL1xuICBmdW5jdGlvbiBzdHJpY3RJbmRleE9mKGFycmF5LCB2YWx1ZSwgZnJvbUluZGV4KSB7XG4gICAgdmFyIGluZGV4ID0gZnJvbUluZGV4IC0gMSxcbiAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIGlmIChhcnJheVtpbmRleF0gPT09IHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBpbmRleDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIC0xO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5sYXN0SW5kZXhPZmAgd2hpY2ggcGVyZm9ybXMgc3RyaWN0IGVxdWFsaXR5XG4gICAqIGNvbXBhcmlzb25zIG9mIHZhbHVlcywgaS5lLiBgPT09YC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBmcm9tSW5kZXggVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbWF0Y2hlZCB2YWx1ZSwgZWxzZSBgLTFgLlxuICAgKi9cbiAgZnVuY3Rpb24gc3RyaWN0TGFzdEluZGV4T2YoYXJyYXksIHZhbHVlLCBmcm9tSW5kZXgpIHtcbiAgICB2YXIgaW5kZXggPSBmcm9tSW5kZXggKyAxO1xuICAgIHdoaWxlIChpbmRleC0tKSB7XG4gICAgICBpZiAoYXJyYXlbaW5kZXhdID09PSB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBpbmRleDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBudW1iZXIgb2Ygc3ltYm9scyBpbiBgc3RyaW5nYC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIGluc3BlY3QuXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHN0cmluZyBzaXplLlxuICAgKi9cbiAgZnVuY3Rpb24gc3RyaW5nU2l6ZShzdHJpbmcpIHtcbiAgICByZXR1cm4gaGFzVW5pY29kZShzdHJpbmcpXG4gICAgICA/IHVuaWNvZGVTaXplKHN0cmluZylcbiAgICAgIDogYXNjaWlTaXplKHN0cmluZyk7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgYHN0cmluZ2AgdG8gYW4gYXJyYXkuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBhcnJheS5cbiAgICovXG4gIGZ1bmN0aW9uIHN0cmluZ1RvQXJyYXkoc3RyaW5nKSB7XG4gICAgcmV0dXJuIGhhc1VuaWNvZGUoc3RyaW5nKVxuICAgICAgPyB1bmljb2RlVG9BcnJheShzdHJpbmcpXG4gICAgICA6IGFzY2lpVG9BcnJheShzdHJpbmcpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVzZWQgYnkgYF8udHJpbWAgYW5kIGBfLnRyaW1FbmRgIHRvIGdldCB0aGUgaW5kZXggb2YgdGhlIGxhc3Qgbm9uLXdoaXRlc3BhY2VcbiAgICogY2hhcmFjdGVyIG9mIGBzdHJpbmdgLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gaW5zcGVjdC5cbiAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGxhc3Qgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyLlxuICAgKi9cbiAgZnVuY3Rpb24gdHJpbW1lZEVuZEluZGV4KHN0cmluZykge1xuICAgIHZhciBpbmRleCA9IHN0cmluZy5sZW5ndGg7XG5cbiAgICB3aGlsZSAoaW5kZXgtLSAmJiByZVdoaXRlc3BhY2UudGVzdChzdHJpbmcuY2hhckF0KGluZGV4KSkpIHt9XG4gICAgcmV0dXJuIGluZGV4O1xuICB9XG5cbiAgLyoqXG4gICAqIFVzZWQgYnkgYF8udW5lc2NhcGVgIHRvIGNvbnZlcnQgSFRNTCBlbnRpdGllcyB0byBjaGFyYWN0ZXJzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2hyIFRoZSBtYXRjaGVkIGNoYXJhY3RlciB0byB1bmVzY2FwZS5cbiAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgdW5lc2NhcGVkIGNoYXJhY3Rlci5cbiAgICovXG4gIHZhciB1bmVzY2FwZUh0bWxDaGFyID0gYmFzZVByb3BlcnR5T2YoaHRtbFVuZXNjYXBlcyk7XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHNpemUgb2YgYSBVbmljb2RlIGBzdHJpbmdgLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgaW5zcGVjdC5cbiAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgc3RyaW5nIHNpemUuXG4gICAqL1xuICBmdW5jdGlvbiB1bmljb2RlU2l6ZShzdHJpbmcpIHtcbiAgICB2YXIgcmVzdWx0ID0gcmVVbmljb2RlLmxhc3RJbmRleCA9IDA7XG4gICAgd2hpbGUgKHJlVW5pY29kZS50ZXN0KHN0cmluZykpIHtcbiAgICAgICsrcmVzdWx0O1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGEgVW5pY29kZSBgc3RyaW5nYCB0byBhbiBhcnJheS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgY29udmVydGVkIGFycmF5LlxuICAgKi9cbiAgZnVuY3Rpb24gdW5pY29kZVRvQXJyYXkoc3RyaW5nKSB7XG4gICAgcmV0dXJuIHN0cmluZy5tYXRjaChyZVVuaWNvZGUpIHx8IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIFNwbGl0cyBhIFVuaWNvZGUgYHN0cmluZ2AgaW50byBhbiBhcnJheSBvZiBpdHMgd29yZHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBUaGUgc3RyaW5nIHRvIGluc3BlY3QuXG4gICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgd29yZHMgb2YgYHN0cmluZ2AuXG4gICAqL1xuICBmdW5jdGlvbiB1bmljb2RlV29yZHMoc3RyaW5nKSB7XG4gICAgcmV0dXJuIHN0cmluZy5tYXRjaChyZVVuaWNvZGVXb3JkKSB8fCBbXTtcbiAgfVxuXG4gIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgcHJpc3RpbmUgYGxvZGFzaGAgZnVuY3Rpb24gdXNpbmcgdGhlIGBjb250ZXh0YCBvYmplY3QuXG4gICAqXG4gICAqIEBzdGF0aWNcbiAgICogQG1lbWJlck9mIF9cbiAgICogQHNpbmNlIDEuMS4wXG4gICAqIEBjYXRlZ29yeSBVdGlsXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbY29udGV4dD1yb290XSBUaGUgY29udGV4dCBvYmplY3QuXG4gICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyBhIG5ldyBgbG9kYXNoYCBmdW5jdGlvbi5cbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogXy5taXhpbih7ICdmb28nOiBfLmNvbnN0YW50KCdmb28nKSB9KTtcbiAgICpcbiAgICogdmFyIGxvZGFzaCA9IF8ucnVuSW5Db250ZXh0KCk7XG4gICAqIGxvZGFzaC5taXhpbih7ICdiYXInOiBsb2Rhc2guY29uc3RhbnQoJ2JhcicpIH0pO1xuICAgKlxuICAgKiBfLmlzRnVuY3Rpb24oXy5mb28pO1xuICAgKiAvLyA9PiB0cnVlXG4gICAqIF8uaXNGdW5jdGlvbihfLmJhcik7XG4gICAqIC8vID0+IGZhbHNlXG4gICAqXG4gICAqIGxvZGFzaC5pc0Z1bmN0aW9uKGxvZGFzaC5mb28pO1xuICAgKiAvLyA9PiBmYWxzZVxuICAgKiBsb2Rhc2guaXNGdW5jdGlvbihsb2Rhc2guYmFyKTtcbiAgICogLy8gPT4gdHJ1ZVxuICAgKlxuICAgKiAvLyBDcmVhdGUgYSBzdXBlZC11cCBgZGVmZXJgIGluIE5vZGUuanMuXG4gICAqIHZhciBkZWZlciA9IF8ucnVuSW5Db250ZXh0KHsgJ3NldFRpbWVvdXQnOiBzZXRJbW1lZGlhdGUgfSkuZGVmZXI7XG4gICAqL1xuICB2YXIgcnVuSW5Db250ZXh0ID0gKGZ1bmN0aW9uIHJ1bkluQ29udGV4dChjb250ZXh0KSB7XG4gICAgY29udGV4dCA9IGNvbnRleHQgPT0gbnVsbCA/IHJvb3QgOiBfLmRlZmF1bHRzKHJvb3QuT2JqZWN0KCksIGNvbnRleHQsIF8ucGljayhyb290LCBjb250ZXh0UHJvcHMpKTtcblxuICAgIC8qKiBCdWlsdC1pbiBjb25zdHJ1Y3RvciByZWZlcmVuY2VzLiAqL1xuICAgIHZhciBBcnJheSA9IGNvbnRleHQuQXJyYXksXG4gICAgICAgIERhdGUgPSBjb250ZXh0LkRhdGUsXG4gICAgICAgIEVycm9yID0gY29udGV4dC5FcnJvcixcbiAgICAgICAgRnVuY3Rpb24gPSBjb250ZXh0LkZ1bmN0aW9uLFxuICAgICAgICBNYXRoID0gY29udGV4dC5NYXRoLFxuICAgICAgICBPYmplY3QgPSBjb250ZXh0Lk9iamVjdCxcbiAgICAgICAgUmVnRXhwID0gY29udGV4dC5SZWdFeHAsXG4gICAgICAgIFN0cmluZyA9IGNvbnRleHQuU3RyaW5nLFxuICAgICAgICBUeXBlRXJyb3IgPSBjb250ZXh0LlR5cGVFcnJvcjtcblxuICAgIC8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbiAgICB2YXIgYXJyYXlQcm90byA9IEFycmF5LnByb3RvdHlwZSxcbiAgICAgICAgZnVuY1Byb3RvID0gRnVuY3Rpb24ucHJvdG90eXBlLFxuICAgICAgICBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbiAgICAvKiogVXNlZCB0byBkZXRlY3Qgb3ZlcnJlYWNoaW5nIGNvcmUtanMgc2hpbXMuICovXG4gICAgdmFyIGNvcmVKc0RhdGEgPSBjb250ZXh0WydfX2NvcmUtanNfc2hhcmVkX18nXTtcblxuICAgIC8qKiBVc2VkIHRvIHJlc29sdmUgdGhlIGRlY29tcGlsZWQgc291cmNlIG9mIGZ1bmN0aW9ucy4gKi9cbiAgICB2YXIgZnVuY1RvU3RyaW5nID0gZnVuY1Byb3RvLnRvU3RyaW5nO1xuXG4gICAgLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG4gICAgdmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbiAgICAvKiogVXNlZCB0byBnZW5lcmF0ZSB1bmlxdWUgSURzLiAqL1xuICAgIHZhciBpZENvdW50ZXIgPSAwO1xuXG4gICAgLyoqIFVzZWQgdG8gZGV0ZWN0IG1ldGhvZHMgbWFzcXVlcmFkaW5nIGFzIG5hdGl2ZS4gKi9cbiAgICB2YXIgbWFza1NyY0tleSA9IChmdW5jdGlvbigpIHtcbiAgICAgIHZhciB1aWQgPSAvW14uXSskLy5leGVjKGNvcmVKc0RhdGEgJiYgY29yZUpzRGF0YS5rZXlzICYmIGNvcmVKc0RhdGEua2V5cy5JRV9QUk9UTyB8fCAnJyk7XG4gICAgICByZXR1cm4gdWlkID8gKCdTeW1ib2woc3JjKV8xLicgKyB1aWQpIDogJyc7XG4gICAgfSgpKTtcblxuICAgIC8qKlxuICAgICAqIFVzZWQgdG8gcmVzb2x2ZSB0aGVcbiAgICAgKiBbYHRvU3RyaW5nVGFnYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtb2JqZWN0LnByb3RvdHlwZS50b3N0cmluZylcbiAgICAgKiBvZiB2YWx1ZXMuXG4gICAgICovXG4gICAgdmFyIG5hdGl2ZU9iamVjdFRvU3RyaW5nID0gb2JqZWN0UHJvdG8udG9TdHJpbmc7XG5cbiAgICAvKiogVXNlZCB0byBpbmZlciB0aGUgYE9iamVjdGAgY29uc3RydWN0b3IuICovXG4gICAgdmFyIG9iamVjdEN0b3JTdHJpbmcgPSBmdW5jVG9TdHJpbmcuY2FsbChPYmplY3QpO1xuXG4gICAgLyoqIFVzZWQgdG8gcmVzdG9yZSB0aGUgb3JpZ2luYWwgYF9gIHJlZmVyZW5jZSBpbiBgXy5ub0NvbmZsaWN0YC4gKi9cbiAgICB2YXIgb2xkRGFzaCA9IHJvb3QuXztcblxuICAgIC8qKiBVc2VkIHRvIGRldGVjdCBpZiBhIG1ldGhvZCBpcyBuYXRpdmUuICovXG4gICAgdmFyIHJlSXNOYXRpdmUgPSBSZWdFeHAoJ14nICtcbiAgICAgIGZ1bmNUb1N0cmluZy5jYWxsKGhhc093blByb3BlcnR5KS5yZXBsYWNlKHJlUmVnRXhwQ2hhciwgJ1xcXFwkJicpXG4gICAgICAucmVwbGFjZSgvaGFzT3duUHJvcGVydHl8KGZ1bmN0aW9uKS4qPyg/PVxcXFxcXCgpfCBmb3IgLis/KD89XFxcXFxcXSkvZywgJyQxLio/JykgKyAnJCdcbiAgICApO1xuXG4gICAgLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG4gICAgdmFyIEJ1ZmZlciA9IG1vZHVsZUV4cG9ydHMgPyBjb250ZXh0LkJ1ZmZlciA6IHVuZGVmaW5lZCxcbiAgICAgICAgU3ltYm9sID0gY29udGV4dC5TeW1ib2wsXG4gICAgICAgIFVpbnQ4QXJyYXkgPSBjb250ZXh0LlVpbnQ4QXJyYXksXG4gICAgICAgIGFsbG9jVW5zYWZlID0gQnVmZmVyID8gQnVmZmVyLmFsbG9jVW5zYWZlIDogdW5kZWZpbmVkLFxuICAgICAgICBnZXRQcm90b3R5cGUgPSBvdmVyQXJnKE9iamVjdC5nZXRQcm90b3R5cGVPZiwgT2JqZWN0KSxcbiAgICAgICAgb2JqZWN0Q3JlYXRlID0gT2JqZWN0LmNyZWF0ZSxcbiAgICAgICAgcHJvcGVydHlJc0VudW1lcmFibGUgPSBvYmplY3RQcm90by5wcm9wZXJ0eUlzRW51bWVyYWJsZSxcbiAgICAgICAgc3BsaWNlID0gYXJyYXlQcm90by5zcGxpY2UsXG4gICAgICAgIHNwcmVhZGFibGVTeW1ib2wgPSBTeW1ib2wgPyBTeW1ib2wuaXNDb25jYXRTcHJlYWRhYmxlIDogdW5kZWZpbmVkLFxuICAgICAgICBzeW1JdGVyYXRvciA9IFN5bWJvbCA/IFN5bWJvbC5pdGVyYXRvciA6IHVuZGVmaW5lZCxcbiAgICAgICAgc3ltVG9TdHJpbmdUYWcgPSBTeW1ib2wgPyBTeW1ib2wudG9TdHJpbmdUYWcgOiB1bmRlZmluZWQ7XG5cbiAgICB2YXIgZGVmaW5lUHJvcGVydHkgPSAoZnVuY3Rpb24oKSB7XG4gICAgICB0cnkge1xuICAgICAgICB2YXIgZnVuYyA9IGdldE5hdGl2ZShPYmplY3QsICdkZWZpbmVQcm9wZXJ0eScpO1xuICAgICAgICBmdW5jKHt9LCAnJywge30pO1xuICAgICAgICByZXR1cm4gZnVuYztcbiAgICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgfSgpKTtcblxuICAgIC8qKiBNb2NrZWQgYnVpbHQtaW5zLiAqL1xuICAgIHZhciBjdHhDbGVhclRpbWVvdXQgPSBjb250ZXh0LmNsZWFyVGltZW91dCAhPT0gcm9vdC5jbGVhclRpbWVvdXQgJiYgY29udGV4dC5jbGVhclRpbWVvdXQsXG4gICAgICAgIGN0eE5vdyA9IERhdGUgJiYgRGF0ZS5ub3cgIT09IHJvb3QuRGF0ZS5ub3cgJiYgRGF0ZS5ub3csXG4gICAgICAgIGN0eFNldFRpbWVvdXQgPSBjb250ZXh0LnNldFRpbWVvdXQgIT09IHJvb3Quc2V0VGltZW91dCAmJiBjb250ZXh0LnNldFRpbWVvdXQ7XG5cbiAgICAvKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyBmb3IgdGhvc2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMuICovXG4gICAgdmFyIG5hdGl2ZUNlaWwgPSBNYXRoLmNlaWwsXG4gICAgICAgIG5hdGl2ZUZsb29yID0gTWF0aC5mbG9vcixcbiAgICAgICAgbmF0aXZlR2V0U3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMsXG4gICAgICAgIG5hdGl2ZUlzQnVmZmVyID0gQnVmZmVyID8gQnVmZmVyLmlzQnVmZmVyIDogdW5kZWZpbmVkLFxuICAgICAgICBuYXRpdmVJc0Zpbml0ZSA9IGNvbnRleHQuaXNGaW5pdGUsXG4gICAgICAgIG5hdGl2ZUpvaW4gPSBhcnJheVByb3RvLmpvaW4sXG4gICAgICAgIG5hdGl2ZUtleXMgPSBvdmVyQXJnKE9iamVjdC5rZXlzLCBPYmplY3QpLFxuICAgICAgICBuYXRpdmVNYXggPSBNYXRoLm1heCxcbiAgICAgICAgbmF0aXZlTWluID0gTWF0aC5taW4sXG4gICAgICAgIG5hdGl2ZU5vdyA9IERhdGUubm93LFxuICAgICAgICBuYXRpdmVQYXJzZUludCA9IGNvbnRleHQucGFyc2VJbnQsXG4gICAgICAgIG5hdGl2ZVJhbmRvbSA9IE1hdGgucmFuZG9tLFxuICAgICAgICBuYXRpdmVSZXZlcnNlID0gYXJyYXlQcm90by5yZXZlcnNlO1xuXG4gICAgLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgdGhhdCBhcmUgdmVyaWZpZWQgdG8gYmUgbmF0aXZlLiAqL1xuICAgIHZhciBEYXRhVmlldyA9IGdldE5hdGl2ZShjb250ZXh0LCAnRGF0YVZpZXcnKSxcbiAgICAgICAgTWFwID0gZ2V0TmF0aXZlKGNvbnRleHQsICdNYXAnKSxcbiAgICAgICAgUHJvbWlzZSA9IGdldE5hdGl2ZShjb250ZXh0LCAnUHJvbWlzZScpLFxuICAgICAgICBTZXQgPSBnZXROYXRpdmUoY29udGV4dCwgJ1NldCcpLFxuICAgICAgICBXZWFrTWFwID0gZ2V0TmF0aXZlKGNvbnRleHQsICdXZWFrTWFwJyksXG4gICAgICAgIG5hdGl2ZUNyZWF0ZSA9IGdldE5hdGl2ZShPYmplY3QsICdjcmVhdGUnKTtcblxuICAgIC8qKiBVc2VkIHRvIHN0b3JlIGZ1bmN0aW9uIG1ldGFkYXRhLiAqL1xuICAgIHZhciBtZXRhTWFwID0gV2Vha01hcCAmJiBuZXcgV2Vha01hcDtcblxuICAgIC8qKiBVc2VkIHRvIGxvb2t1cCB1bm1pbmlmaWVkIGZ1bmN0aW9uIG5hbWVzLiAqL1xuICAgIHZhciByZWFsTmFtZXMgPSB7fTtcblxuICAgIC8qKiBVc2VkIHRvIGRldGVjdCBtYXBzLCBzZXRzLCBhbmQgd2Vha21hcHMuICovXG4gICAgdmFyIGRhdGFWaWV3Q3RvclN0cmluZyA9IHRvU291cmNlKERhdGFWaWV3KSxcbiAgICAgICAgbWFwQ3RvclN0cmluZyA9IHRvU291cmNlKE1hcCksXG4gICAgICAgIHByb21pc2VDdG9yU3RyaW5nID0gdG9Tb3VyY2UoUHJvbWlzZSksXG4gICAgICAgIHNldEN0b3JTdHJpbmcgPSB0b1NvdXJjZShTZXQpLFxuICAgICAgICB3ZWFrTWFwQ3RvclN0cmluZyA9IHRvU291cmNlKFdlYWtNYXApO1xuXG4gICAgLyoqIFVzZWQgdG8gY29udmVydCBzeW1ib2xzIHRvIHByaW1pdGl2ZXMgYW5kIHN0cmluZ3MuICovXG4gICAgdmFyIHN5bWJvbFByb3RvID0gU3ltYm9sID8gU3ltYm9sLnByb3RvdHlwZSA6IHVuZGVmaW5lZCxcbiAgICAgICAgc3ltYm9sVmFsdWVPZiA9IHN5bWJvbFByb3RvID8gc3ltYm9sUHJvdG8udmFsdWVPZiA6IHVuZGVmaW5lZCxcbiAgICAgICAgc3ltYm9sVG9TdHJpbmcgPSBzeW1ib2xQcm90byA/IHN5bWJvbFByb3RvLnRvU3RyaW5nIDogdW5kZWZpbmVkO1xuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGBsb2Rhc2hgIG9iamVjdCB3aGljaCB3cmFwcyBgdmFsdWVgIHRvIGVuYWJsZSBpbXBsaWNpdCBtZXRob2RcbiAgICAgKiBjaGFpbiBzZXF1ZW5jZXMuIE1ldGhvZHMgdGhhdCBvcGVyYXRlIG9uIGFuZCByZXR1cm4gYXJyYXlzLCBjb2xsZWN0aW9ucyxcbiAgICAgKiBhbmQgZnVuY3Rpb25zIGNhbiBiZSBjaGFpbmVkIHRvZ2V0aGVyLiBNZXRob2RzIHRoYXQgcmV0cmlldmUgYSBzaW5nbGUgdmFsdWVcbiAgICAgKiBvciBtYXkgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlIHdpbGwgYXV0b21hdGljYWxseSBlbmQgdGhlIGNoYWluIHNlcXVlbmNlXG4gICAgICogYW5kIHJldHVybiB0aGUgdW53cmFwcGVkIHZhbHVlLiBPdGhlcndpc2UsIHRoZSB2YWx1ZSBtdXN0IGJlIHVud3JhcHBlZFxuICAgICAqIHdpdGggYF8jdmFsdWVgLlxuICAgICAqXG4gICAgICogRXhwbGljaXQgY2hhaW4gc2VxdWVuY2VzLCB3aGljaCBtdXN0IGJlIHVud3JhcHBlZCB3aXRoIGBfI3ZhbHVlYCwgbWF5IGJlXG4gICAgICogZW5hYmxlZCB1c2luZyBgXy5jaGFpbmAuXG4gICAgICpcbiAgICAgKiBUaGUgZXhlY3V0aW9uIG9mIGNoYWluZWQgbWV0aG9kcyBpcyBsYXp5LCB0aGF0IGlzLCBpdCdzIGRlZmVycmVkIHVudGlsXG4gICAgICogYF8jdmFsdWVgIGlzIGltcGxpY2l0bHkgb3IgZXhwbGljaXRseSBjYWxsZWQuXG4gICAgICpcbiAgICAgKiBMYXp5IGV2YWx1YXRpb24gYWxsb3dzIHNldmVyYWwgbWV0aG9kcyB0byBzdXBwb3J0IHNob3J0Y3V0IGZ1c2lvbi5cbiAgICAgKiBTaG9ydGN1dCBmdXNpb24gaXMgYW4gb3B0aW1pemF0aW9uIHRvIG1lcmdlIGl0ZXJhdGVlIGNhbGxzOyB0aGlzIGF2b2lkc1xuICAgICAqIHRoZSBjcmVhdGlvbiBvZiBpbnRlcm1lZGlhdGUgYXJyYXlzIGFuZCBjYW4gZ3JlYXRseSByZWR1Y2UgdGhlIG51bWJlciBvZlxuICAgICAqIGl0ZXJhdGVlIGV4ZWN1dGlvbnMuIFNlY3Rpb25zIG9mIGEgY2hhaW4gc2VxdWVuY2UgcXVhbGlmeSBmb3Igc2hvcnRjdXRcbiAgICAgKiBmdXNpb24gaWYgdGhlIHNlY3Rpb24gaXMgYXBwbGllZCB0byBhbiBhcnJheSBhbmQgaXRlcmF0ZWVzIGFjY2VwdCBvbmx5XG4gICAgICogb25lIGFyZ3VtZW50LiBUaGUgaGV1cmlzdGljIGZvciB3aGV0aGVyIGEgc2VjdGlvbiBxdWFsaWZpZXMgZm9yIHNob3J0Y3V0XG4gICAgICogZnVzaW9uIGlzIHN1YmplY3QgdG8gY2hhbmdlLlxuICAgICAqXG4gICAgICogQ2hhaW5pbmcgaXMgc3VwcG9ydGVkIGluIGN1c3RvbSBidWlsZHMgYXMgbG9uZyBhcyB0aGUgYF8jdmFsdWVgIG1ldGhvZCBpc1xuICAgICAqIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgaW5jbHVkZWQgaW4gdGhlIGJ1aWxkLlxuICAgICAqXG4gICAgICogSW4gYWRkaXRpb24gdG8gbG9kYXNoIG1ldGhvZHMsIHdyYXBwZXJzIGhhdmUgYEFycmF5YCBhbmQgYFN0cmluZ2AgbWV0aG9kcy5cbiAgICAgKlxuICAgICAqIFRoZSB3cmFwcGVyIGBBcnJheWAgbWV0aG9kcyBhcmU6XG4gICAgICogYGNvbmNhdGAsIGBqb2luYCwgYHBvcGAsIGBwdXNoYCwgYHNoaWZ0YCwgYHNvcnRgLCBgc3BsaWNlYCwgYW5kIGB1bnNoaWZ0YFxuICAgICAqXG4gICAgICogVGhlIHdyYXBwZXIgYFN0cmluZ2AgbWV0aG9kcyBhcmU6XG4gICAgICogYHJlcGxhY2VgIGFuZCBgc3BsaXRgXG4gICAgICpcbiAgICAgKiBUaGUgd3JhcHBlciBtZXRob2RzIHRoYXQgc3VwcG9ydCBzaG9ydGN1dCBmdXNpb24gYXJlOlxuICAgICAqIGBhdGAsIGBjb21wYWN0YCwgYGRyb3BgLCBgZHJvcFJpZ2h0YCwgYGRyb3BXaGlsZWAsIGBmaWx0ZXJgLCBgZmluZGAsXG4gICAgICogYGZpbmRMYXN0YCwgYGhlYWRgLCBgaW5pdGlhbGAsIGBsYXN0YCwgYG1hcGAsIGByZWplY3RgLCBgcmV2ZXJzZWAsIGBzbGljZWAsXG4gICAgICogYHRhaWxgLCBgdGFrZWAsIGB0YWtlUmlnaHRgLCBgdGFrZVJpZ2h0V2hpbGVgLCBgdGFrZVdoaWxlYCwgYW5kIGB0b0FycmF5YFxuICAgICAqXG4gICAgICogVGhlIGNoYWluYWJsZSB3cmFwcGVyIG1ldGhvZHMgYXJlOlxuICAgICAqIGBhZnRlcmAsIGBhcnlgLCBgYXNzaWduYCwgYGFzc2lnbkluYCwgYGFzc2lnbkluV2l0aGAsIGBhc3NpZ25XaXRoYCwgYGF0YCxcbiAgICAgKiBgYmVmb3JlYCwgYGJpbmRgLCBgYmluZEFsbGAsIGBiaW5kS2V5YCwgYGNhc3RBcnJheWAsIGBjaGFpbmAsIGBjaHVua2AsXG4gICAgICogYGNvbW1pdGAsIGBjb21wYWN0YCwgYGNvbmNhdGAsIGBjb25mb3Jtc2AsIGBjb25zdGFudGAsIGBjb3VudEJ5YCwgYGNyZWF0ZWAsXG4gICAgICogYGN1cnJ5YCwgYGRlYm91bmNlYCwgYGRlZmF1bHRzYCwgYGRlZmF1bHRzRGVlcGAsIGBkZWZlcmAsIGBkZWxheWAsXG4gICAgICogYGRpZmZlcmVuY2VgLCBgZGlmZmVyZW5jZUJ5YCwgYGRpZmZlcmVuY2VXaXRoYCwgYGRyb3BgLCBgZHJvcFJpZ2h0YCxcbiAgICAgKiBgZHJvcFJpZ2h0V2hpbGVgLCBgZHJvcFdoaWxlYCwgYGV4dGVuZGAsIGBleHRlbmRXaXRoYCwgYGZpbGxgLCBgZmlsdGVyYCxcbiAgICAgKiBgZmxhdE1hcGAsIGBmbGF0TWFwRGVlcGAsIGBmbGF0TWFwRGVwdGhgLCBgZmxhdHRlbmAsIGBmbGF0dGVuRGVlcGAsXG4gICAgICogYGZsYXR0ZW5EZXB0aGAsIGBmbGlwYCwgYGZsb3dgLCBgZmxvd1JpZ2h0YCwgYGZyb21QYWlyc2AsIGBmdW5jdGlvbnNgLFxuICAgICAqIGBmdW5jdGlvbnNJbmAsIGBncm91cEJ5YCwgYGluaXRpYWxgLCBgaW50ZXJzZWN0aW9uYCwgYGludGVyc2VjdGlvbkJ5YCxcbiAgICAgKiBgaW50ZXJzZWN0aW9uV2l0aGAsIGBpbnZlcnRgLCBgaW52ZXJ0QnlgLCBgaW52b2tlTWFwYCwgYGl0ZXJhdGVlYCwgYGtleUJ5YCxcbiAgICAgKiBga2V5c2AsIGBrZXlzSW5gLCBgbWFwYCwgYG1hcEtleXNgLCBgbWFwVmFsdWVzYCwgYG1hdGNoZXNgLCBgbWF0Y2hlc1Byb3BlcnR5YCxcbiAgICAgKiBgbWVtb2l6ZWAsIGBtZXJnZWAsIGBtZXJnZVdpdGhgLCBgbWV0aG9kYCwgYG1ldGhvZE9mYCwgYG1peGluYCwgYG5lZ2F0ZWAsXG4gICAgICogYG50aEFyZ2AsIGBvbWl0YCwgYG9taXRCeWAsIGBvbmNlYCwgYG9yZGVyQnlgLCBgb3ZlcmAsIGBvdmVyQXJnc2AsXG4gICAgICogYG92ZXJFdmVyeWAsIGBvdmVyU29tZWAsIGBwYXJ0aWFsYCwgYHBhcnRpYWxSaWdodGAsIGBwYXJ0aXRpb25gLCBgcGlja2AsXG4gICAgICogYHBpY2tCeWAsIGBwbGFudGAsIGBwcm9wZXJ0eWAsIGBwcm9wZXJ0eU9mYCwgYHB1bGxgLCBgcHVsbEFsbGAsIGBwdWxsQWxsQnlgLFxuICAgICAqIGBwdWxsQWxsV2l0aGAsIGBwdWxsQXRgLCBgcHVzaGAsIGByYW5nZWAsIGByYW5nZVJpZ2h0YCwgYHJlYXJnYCwgYHJlamVjdGAsXG4gICAgICogYHJlbW92ZWAsIGByZXN0YCwgYHJldmVyc2VgLCBgc2FtcGxlU2l6ZWAsIGBzZXRgLCBgc2V0V2l0aGAsIGBzaHVmZmxlYCxcbiAgICAgKiBgc2xpY2VgLCBgc29ydGAsIGBzb3J0QnlgLCBgc3BsaWNlYCwgYHNwcmVhZGAsIGB0YWlsYCwgYHRha2VgLCBgdGFrZVJpZ2h0YCxcbiAgICAgKiBgdGFrZVJpZ2h0V2hpbGVgLCBgdGFrZVdoaWxlYCwgYHRhcGAsIGB0aHJvdHRsZWAsIGB0aHJ1YCwgYHRvQXJyYXlgLFxuICAgICAqIGB0b1BhaXJzYCwgYHRvUGFpcnNJbmAsIGB0b1BhdGhgLCBgdG9QbGFpbk9iamVjdGAsIGB0cmFuc2Zvcm1gLCBgdW5hcnlgLFxuICAgICAqIGB1bmlvbmAsIGB1bmlvbkJ5YCwgYHVuaW9uV2l0aGAsIGB1bmlxYCwgYHVuaXFCeWAsIGB1bmlxV2l0aGAsIGB1bnNldGAsXG4gICAgICogYHVuc2hpZnRgLCBgdW56aXBgLCBgdW56aXBXaXRoYCwgYHVwZGF0ZWAsIGB1cGRhdGVXaXRoYCwgYHZhbHVlc2AsXG4gICAgICogYHZhbHVlc0luYCwgYHdpdGhvdXRgLCBgd3JhcGAsIGB4b3JgLCBgeG9yQnlgLCBgeG9yV2l0aGAsIGB6aXBgLFxuICAgICAqIGB6aXBPYmplY3RgLCBgemlwT2JqZWN0RGVlcGAsIGFuZCBgemlwV2l0aGBcbiAgICAgKlxuICAgICAqIFRoZSB3cmFwcGVyIG1ldGhvZHMgdGhhdCBhcmUgKipub3QqKiBjaGFpbmFibGUgYnkgZGVmYXVsdCBhcmU6XG4gICAgICogYGFkZGAsIGBhdHRlbXB0YCwgYGNhbWVsQ2FzZWAsIGBjYXBpdGFsaXplYCwgYGNlaWxgLCBgY2xhbXBgLCBgY2xvbmVgLFxuICAgICAqIGBjbG9uZURlZXBgLCBgY2xvbmVEZWVwV2l0aGAsIGBjbG9uZVdpdGhgLCBgY29uZm9ybXNUb2AsIGBkZWJ1cnJgLFxuICAgICAqIGBkZWZhdWx0VG9gLCBgZGl2aWRlYCwgYGVhY2hgLCBgZWFjaFJpZ2h0YCwgYGVuZHNXaXRoYCwgYGVxYCwgYGVzY2FwZWAsXG4gICAgICogYGVzY2FwZVJlZ0V4cGAsIGBldmVyeWAsIGBmaW5kYCwgYGZpbmRJbmRleGAsIGBmaW5kS2V5YCwgYGZpbmRMYXN0YCxcbiAgICAgKiBgZmluZExhc3RJbmRleGAsIGBmaW5kTGFzdEtleWAsIGBmaXJzdGAsIGBmbG9vcmAsIGBmb3JFYWNoYCwgYGZvckVhY2hSaWdodGAsXG4gICAgICogYGZvckluYCwgYGZvckluUmlnaHRgLCBgZm9yT3duYCwgYGZvck93blJpZ2h0YCwgYGdldGAsIGBndGAsIGBndGVgLCBgaGFzYCxcbiAgICAgKiBgaGFzSW5gLCBgaGVhZGAsIGBpZGVudGl0eWAsIGBpbmNsdWRlc2AsIGBpbmRleE9mYCwgYGluUmFuZ2VgLCBgaW52b2tlYCxcbiAgICAgKiBgaXNBcmd1bWVudHNgLCBgaXNBcnJheWAsIGBpc0FycmF5QnVmZmVyYCwgYGlzQXJyYXlMaWtlYCwgYGlzQXJyYXlMaWtlT2JqZWN0YCxcbiAgICAgKiBgaXNCb29sZWFuYCwgYGlzQnVmZmVyYCwgYGlzRGF0ZWAsIGBpc0VsZW1lbnRgLCBgaXNFbXB0eWAsIGBpc0VxdWFsYCxcbiAgICAgKiBgaXNFcXVhbFdpdGhgLCBgaXNFcnJvcmAsIGBpc0Zpbml0ZWAsIGBpc0Z1bmN0aW9uYCwgYGlzSW50ZWdlcmAsIGBpc0xlbmd0aGAsXG4gICAgICogYGlzTWFwYCwgYGlzTWF0Y2hgLCBgaXNNYXRjaFdpdGhgLCBgaXNOYU5gLCBgaXNOYXRpdmVgLCBgaXNOaWxgLCBgaXNOdWxsYCxcbiAgICAgKiBgaXNOdW1iZXJgLCBgaXNPYmplY3RgLCBgaXNPYmplY3RMaWtlYCwgYGlzUGxhaW5PYmplY3RgLCBgaXNSZWdFeHBgLFxuICAgICAqIGBpc1NhZmVJbnRlZ2VyYCwgYGlzU2V0YCwgYGlzU3RyaW5nYCwgYGlzVW5kZWZpbmVkYCwgYGlzVHlwZWRBcnJheWAsXG4gICAgICogYGlzV2Vha01hcGAsIGBpc1dlYWtTZXRgLCBgam9pbmAsIGBrZWJhYkNhc2VgLCBgbGFzdGAsIGBsYXN0SW5kZXhPZmAsXG4gICAgICogYGxvd2VyQ2FzZWAsIGBsb3dlckZpcnN0YCwgYGx0YCwgYGx0ZWAsIGBtYXhgLCBgbWF4QnlgLCBgbWVhbmAsIGBtZWFuQnlgLFxuICAgICAqIGBtaW5gLCBgbWluQnlgLCBgbXVsdGlwbHlgLCBgbm9Db25mbGljdGAsIGBub29wYCwgYG5vd2AsIGBudGhgLCBgcGFkYCxcbiAgICAgKiBgcGFkRW5kYCwgYHBhZFN0YXJ0YCwgYHBhcnNlSW50YCwgYHBvcGAsIGByYW5kb21gLCBgcmVkdWNlYCwgYHJlZHVjZVJpZ2h0YCxcbiAgICAgKiBgcmVwZWF0YCwgYHJlc3VsdGAsIGByb3VuZGAsIGBydW5JbkNvbnRleHRgLCBgc2FtcGxlYCwgYHNoaWZ0YCwgYHNpemVgLFxuICAgICAqIGBzbmFrZUNhc2VgLCBgc29tZWAsIGBzb3J0ZWRJbmRleGAsIGBzb3J0ZWRJbmRleEJ5YCwgYHNvcnRlZExhc3RJbmRleGAsXG4gICAgICogYHNvcnRlZExhc3RJbmRleEJ5YCwgYHN0YXJ0Q2FzZWAsIGBzdGFydHNXaXRoYCwgYHN0dWJBcnJheWAsIGBzdHViRmFsc2VgLFxuICAgICAqIGBzdHViT2JqZWN0YCwgYHN0dWJTdHJpbmdgLCBgc3R1YlRydWVgLCBgc3VidHJhY3RgLCBgc3VtYCwgYHN1bUJ5YCxcbiAgICAgKiBgdGVtcGxhdGVgLCBgdGltZXNgLCBgdG9GaW5pdGVgLCBgdG9JbnRlZ2VyYCwgYHRvSlNPTmAsIGB0b0xlbmd0aGAsXG4gICAgICogYHRvTG93ZXJgLCBgdG9OdW1iZXJgLCBgdG9TYWZlSW50ZWdlcmAsIGB0b1N0cmluZ2AsIGB0b1VwcGVyYCwgYHRyaW1gLFxuICAgICAqIGB0cmltRW5kYCwgYHRyaW1TdGFydGAsIGB0cnVuY2F0ZWAsIGB1bmVzY2FwZWAsIGB1bmlxdWVJZGAsIGB1cHBlckNhc2VgLFxuICAgICAqIGB1cHBlckZpcnN0YCwgYHZhbHVlYCwgYW5kIGB3b3Jkc2BcbiAgICAgKlxuICAgICAqIEBuYW1lIF9cbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKiBAY2F0ZWdvcnkgU2VxXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gd3JhcCBpbiBhIGBsb2Rhc2hgIGluc3RhbmNlLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBgbG9kYXNoYCB3cmFwcGVyIGluc3RhbmNlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBzcXVhcmUobikge1xuICAgICAqICAgcmV0dXJuIG4gKiBuO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIHZhciB3cmFwcGVkID0gXyhbMSwgMiwgM10pO1xuICAgICAqXG4gICAgICogLy8gUmV0dXJucyBhbiB1bndyYXBwZWQgdmFsdWUuXG4gICAgICogd3JhcHBlZC5yZWR1Y2UoXy5hZGQpO1xuICAgICAqIC8vID0+IDZcbiAgICAgKlxuICAgICAqIC8vIFJldHVybnMgYSB3cmFwcGVkIHZhbHVlLlxuICAgICAqIHZhciBzcXVhcmVzID0gd3JhcHBlZC5tYXAoc3F1YXJlKTtcbiAgICAgKlxuICAgICAqIF8uaXNBcnJheShzcXVhcmVzKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pc0FycmF5KHNxdWFyZXMudmFsdWUoKSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGxvZGFzaCh2YWx1ZSkge1xuICAgICAgaWYgKGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgIWlzQXJyYXkodmFsdWUpICYmICEodmFsdWUgaW5zdGFuY2VvZiBMYXp5V3JhcHBlcikpIHtcbiAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgTG9kYXNoV3JhcHBlcikge1xuICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwgJ19fd3JhcHBlZF9fJykpIHtcbiAgICAgICAgICByZXR1cm4gd3JhcHBlckNsb25lKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyBMb2Rhc2hXcmFwcGVyKHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5jcmVhdGVgIHdpdGhvdXQgc3VwcG9ydCBmb3IgYXNzaWduaW5nXG4gICAgICogcHJvcGVydGllcyB0byB0aGUgY3JlYXRlZCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm90byBUaGUgb2JqZWN0IHRvIGluaGVyaXQgZnJvbS5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LlxuICAgICAqL1xuICAgIHZhciBiYXNlQ3JlYXRlID0gKGZ1bmN0aW9uKCkge1xuICAgICAgZnVuY3Rpb24gb2JqZWN0KCkge31cbiAgICAgIHJldHVybiBmdW5jdGlvbihwcm90bykge1xuICAgICAgICBpZiAoIWlzT2JqZWN0KHByb3RvKSkge1xuICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob2JqZWN0Q3JlYXRlKSB7XG4gICAgICAgICAgcmV0dXJuIG9iamVjdENyZWF0ZShwcm90byk7XG4gICAgICAgIH1cbiAgICAgICAgb2JqZWN0LnByb3RvdHlwZSA9IHByb3RvO1xuICAgICAgICB2YXIgcmVzdWx0ID0gbmV3IG9iamVjdDtcbiAgICAgICAgb2JqZWN0LnByb3RvdHlwZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH07XG4gICAgfSgpKTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBmdW5jdGlvbiB3aG9zZSBwcm90b3R5cGUgY2hhaW4gc2VxdWVuY2Ugd3JhcHBlcnMgaW5oZXJpdCBmcm9tLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlTG9kYXNoKCkge1xuICAgICAgLy8gTm8gb3BlcmF0aW9uIHBlcmZvcm1lZC5cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBjb25zdHJ1Y3RvciBmb3IgY3JlYXRpbmcgYGxvZGFzaGAgd3JhcHBlciBvYmplY3RzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byB3cmFwLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2NoYWluQWxsXSBFbmFibGUgZXhwbGljaXQgbWV0aG9kIGNoYWluIHNlcXVlbmNlcy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBMb2Rhc2hXcmFwcGVyKHZhbHVlLCBjaGFpbkFsbCkge1xuICAgICAgdGhpcy5fX3dyYXBwZWRfXyA9IHZhbHVlO1xuICAgICAgdGhpcy5fX2FjdGlvbnNfXyA9IFtdO1xuICAgICAgdGhpcy5fX2NoYWluX18gPSAhIWNoYWluQWxsO1xuICAgICAgdGhpcy5fX2luZGV4X18gPSAwO1xuICAgICAgdGhpcy5fX3ZhbHVlc19fID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEJ5IGRlZmF1bHQsIHRoZSB0ZW1wbGF0ZSBkZWxpbWl0ZXJzIHVzZWQgYnkgbG9kYXNoIGFyZSBsaWtlIHRob3NlIGluXG4gICAgICogZW1iZWRkZWQgUnVieSAoRVJCKSBhcyB3ZWxsIGFzIEVTMjAxNSB0ZW1wbGF0ZSBzdHJpbmdzLiBDaGFuZ2UgdGhlXG4gICAgICogZm9sbG93aW5nIHRlbXBsYXRlIHNldHRpbmdzIHRvIHVzZSBhbHRlcm5hdGl2ZSBkZWxpbWl0ZXJzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHR5cGUge09iamVjdH1cbiAgICAgKi9cbiAgICBsb2Rhc2gudGVtcGxhdGVTZXR0aW5ncyA9IHtcblxuICAgICAgLyoqXG4gICAgICAgKiBVc2VkIHRvIGRldGVjdCBgZGF0YWAgcHJvcGVydHkgdmFsdWVzIHRvIGJlIEhUTUwtZXNjYXBlZC5cbiAgICAgICAqXG4gICAgICAgKiBAbWVtYmVyT2YgXy50ZW1wbGF0ZVNldHRpbmdzXG4gICAgICAgKiBAdHlwZSB7UmVnRXhwfVxuICAgICAgICovXG4gICAgICAnZXNjYXBlJzogcmVFc2NhcGUsXG5cbiAgICAgIC8qKlxuICAgICAgICogVXNlZCB0byBkZXRlY3QgY29kZSB0byBiZSBldmFsdWF0ZWQuXG4gICAgICAgKlxuICAgICAgICogQG1lbWJlck9mIF8udGVtcGxhdGVTZXR0aW5nc1xuICAgICAgICogQHR5cGUge1JlZ0V4cH1cbiAgICAgICAqL1xuICAgICAgJ2V2YWx1YXRlJzogcmVFdmFsdWF0ZSxcblxuICAgICAgLyoqXG4gICAgICAgKiBVc2VkIHRvIGRldGVjdCBgZGF0YWAgcHJvcGVydHkgdmFsdWVzIHRvIGluamVjdC5cbiAgICAgICAqXG4gICAgICAgKiBAbWVtYmVyT2YgXy50ZW1wbGF0ZVNldHRpbmdzXG4gICAgICAgKiBAdHlwZSB7UmVnRXhwfVxuICAgICAgICovXG4gICAgICAnaW50ZXJwb2xhdGUnOiByZUludGVycG9sYXRlLFxuXG4gICAgICAvKipcbiAgICAgICAqIFVzZWQgdG8gcmVmZXJlbmNlIHRoZSBkYXRhIG9iamVjdCBpbiB0aGUgdGVtcGxhdGUgdGV4dC5cbiAgICAgICAqXG4gICAgICAgKiBAbWVtYmVyT2YgXy50ZW1wbGF0ZVNldHRpbmdzXG4gICAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAgICovXG4gICAgICAndmFyaWFibGUnOiAnJyxcblxuICAgICAgLyoqXG4gICAgICAgKiBVc2VkIHRvIGltcG9ydCB2YXJpYWJsZXMgaW50byB0aGUgY29tcGlsZWQgdGVtcGxhdGUuXG4gICAgICAgKlxuICAgICAgICogQG1lbWJlck9mIF8udGVtcGxhdGVTZXR0aW5nc1xuICAgICAgICogQHR5cGUge09iamVjdH1cbiAgICAgICAqL1xuICAgICAgJ2ltcG9ydHMnOiB7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEEgcmVmZXJlbmNlIHRvIHRoZSBgbG9kYXNoYCBmdW5jdGlvbi5cbiAgICAgICAgICpcbiAgICAgICAgICogQG1lbWJlck9mIF8udGVtcGxhdGVTZXR0aW5ncy5pbXBvcnRzXG4gICAgICAgICAqIEB0eXBlIHtGdW5jdGlvbn1cbiAgICAgICAgICovXG4gICAgICAgICdfJzogbG9kYXNoXG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIEVuc3VyZSB3cmFwcGVycyBhcmUgaW5zdGFuY2VzIG9mIGBiYXNlTG9kYXNoYC5cbiAgICBsb2Rhc2gucHJvdG90eXBlID0gYmFzZUxvZGFzaC5wcm90b3R5cGU7XG4gICAgbG9kYXNoLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGxvZGFzaDtcblxuICAgIExvZGFzaFdyYXBwZXIucHJvdG90eXBlID0gYmFzZUNyZWF0ZShiYXNlTG9kYXNoLnByb3RvdHlwZSk7XG4gICAgTG9kYXNoV3JhcHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBMb2Rhc2hXcmFwcGVyO1xuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGxhenkgd3JhcHBlciBvYmplY3Qgd2hpY2ggd3JhcHMgYHZhbHVlYCB0byBlbmFibGUgbGF6eSBldmFsdWF0aW9uLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byB3cmFwLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIExhenlXcmFwcGVyKHZhbHVlKSB7XG4gICAgICB0aGlzLl9fd3JhcHBlZF9fID0gdmFsdWU7XG4gICAgICB0aGlzLl9fYWN0aW9uc19fID0gW107XG4gICAgICB0aGlzLl9fZGlyX18gPSAxO1xuICAgICAgdGhpcy5fX2ZpbHRlcmVkX18gPSBmYWxzZTtcbiAgICAgIHRoaXMuX19pdGVyYXRlZXNfXyA9IFtdO1xuICAgICAgdGhpcy5fX3Rha2VDb3VudF9fID0gTUFYX0FSUkFZX0xFTkdUSDtcbiAgICAgIHRoaXMuX192aWV3c19fID0gW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGNsb25lIG9mIHRoZSBsYXp5IHdyYXBwZXIgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBjbG9uZVxuICAgICAqIEBtZW1iZXJPZiBMYXp5V3JhcHBlclxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNsb25lZCBgTGF6eVdyYXBwZXJgIG9iamVjdC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBsYXp5Q2xvbmUoKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gbmV3IExhenlXcmFwcGVyKHRoaXMuX193cmFwcGVkX18pO1xuICAgICAgcmVzdWx0Ll9fYWN0aW9uc19fID0gY29weUFycmF5KHRoaXMuX19hY3Rpb25zX18pO1xuICAgICAgcmVzdWx0Ll9fZGlyX18gPSB0aGlzLl9fZGlyX187XG4gICAgICByZXN1bHQuX19maWx0ZXJlZF9fID0gdGhpcy5fX2ZpbHRlcmVkX187XG4gICAgICByZXN1bHQuX19pdGVyYXRlZXNfXyA9IGNvcHlBcnJheSh0aGlzLl9faXRlcmF0ZWVzX18pO1xuICAgICAgcmVzdWx0Ll9fdGFrZUNvdW50X18gPSB0aGlzLl9fdGFrZUNvdW50X187XG4gICAgICByZXN1bHQuX192aWV3c19fID0gY29weUFycmF5KHRoaXMuX192aWV3c19fKTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV2ZXJzZXMgdGhlIGRpcmVjdGlvbiBvZiBsYXp5IGl0ZXJhdGlvbi5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgcmV2ZXJzZVxuICAgICAqIEBtZW1iZXJPZiBMYXp5V3JhcHBlclxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyByZXZlcnNlZCBgTGF6eVdyYXBwZXJgIG9iamVjdC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBsYXp5UmV2ZXJzZSgpIHtcbiAgICAgIGlmICh0aGlzLl9fZmlsdGVyZWRfXykge1xuICAgICAgICB2YXIgcmVzdWx0ID0gbmV3IExhenlXcmFwcGVyKHRoaXMpO1xuICAgICAgICByZXN1bHQuX19kaXJfXyA9IC0xO1xuICAgICAgICByZXN1bHQuX19maWx0ZXJlZF9fID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdCA9IHRoaXMuY2xvbmUoKTtcbiAgICAgICAgcmVzdWx0Ll9fZGlyX18gKj0gLTE7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV4dHJhY3RzIHRoZSB1bndyYXBwZWQgdmFsdWUgZnJvbSBpdHMgbGF6eSB3cmFwcGVyLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSB2YWx1ZVxuICAgICAqIEBtZW1iZXJPZiBMYXp5V3JhcHBlclxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSB1bndyYXBwZWQgdmFsdWUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbGF6eVZhbHVlKCkge1xuICAgICAgdmFyIGFycmF5ID0gdGhpcy5fX3dyYXBwZWRfXy52YWx1ZSgpLFxuICAgICAgICAgIGRpciA9IHRoaXMuX19kaXJfXyxcbiAgICAgICAgICBpc0FyciA9IGlzQXJyYXkoYXJyYXkpLFxuICAgICAgICAgIGlzUmlnaHQgPSBkaXIgPCAwLFxuICAgICAgICAgIGFyckxlbmd0aCA9IGlzQXJyID8gYXJyYXkubGVuZ3RoIDogMCxcbiAgICAgICAgICB2aWV3ID0gZ2V0VmlldygwLCBhcnJMZW5ndGgsIHRoaXMuX192aWV3c19fKSxcbiAgICAgICAgICBzdGFydCA9IHZpZXcuc3RhcnQsXG4gICAgICAgICAgZW5kID0gdmlldy5lbmQsXG4gICAgICAgICAgbGVuZ3RoID0gZW5kIC0gc3RhcnQsXG4gICAgICAgICAgaW5kZXggPSBpc1JpZ2h0ID8gZW5kIDogKHN0YXJ0IC0gMSksXG4gICAgICAgICAgaXRlcmF0ZWVzID0gdGhpcy5fX2l0ZXJhdGVlc19fLFxuICAgICAgICAgIGl0ZXJMZW5ndGggPSBpdGVyYXRlZXMubGVuZ3RoLFxuICAgICAgICAgIHJlc0luZGV4ID0gMCxcbiAgICAgICAgICB0YWtlQ291bnQgPSBuYXRpdmVNaW4obGVuZ3RoLCB0aGlzLl9fdGFrZUNvdW50X18pO1xuXG4gICAgICBpZiAoIWlzQXJyIHx8ICghaXNSaWdodCAmJiBhcnJMZW5ndGggPT0gbGVuZ3RoICYmIHRha2VDb3VudCA9PSBsZW5ndGgpKSB7XG4gICAgICAgIHJldHVybiBiYXNlV3JhcHBlclZhbHVlKGFycmF5LCB0aGlzLl9fYWN0aW9uc19fKTtcbiAgICAgIH1cbiAgICAgIHZhciByZXN1bHQgPSBbXTtcblxuICAgICAgb3V0ZXI6XG4gICAgICB3aGlsZSAobGVuZ3RoLS0gJiYgcmVzSW5kZXggPCB0YWtlQ291bnQpIHtcbiAgICAgICAgaW5kZXggKz0gZGlyO1xuXG4gICAgICAgIHZhciBpdGVySW5kZXggPSAtMSxcbiAgICAgICAgICAgIHZhbHVlID0gYXJyYXlbaW5kZXhdO1xuXG4gICAgICAgIHdoaWxlICgrK2l0ZXJJbmRleCA8IGl0ZXJMZW5ndGgpIHtcbiAgICAgICAgICB2YXIgZGF0YSA9IGl0ZXJhdGVlc1tpdGVySW5kZXhdLFxuICAgICAgICAgICAgICBpdGVyYXRlZSA9IGRhdGEuaXRlcmF0ZWUsXG4gICAgICAgICAgICAgIHR5cGUgPSBkYXRhLnR5cGUsXG4gICAgICAgICAgICAgIGNvbXB1dGVkID0gaXRlcmF0ZWUodmFsdWUpO1xuXG4gICAgICAgICAgaWYgKHR5cGUgPT0gTEFaWV9NQVBfRkxBRykge1xuICAgICAgICAgICAgdmFsdWUgPSBjb21wdXRlZDtcbiAgICAgICAgICB9IGVsc2UgaWYgKCFjb21wdXRlZCkge1xuICAgICAgICAgICAgaWYgKHR5cGUgPT0gTEFaWV9GSUxURVJfRkxBRykge1xuICAgICAgICAgICAgICBjb250aW51ZSBvdXRlcjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGJyZWFrIG91dGVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXN1bHRbcmVzSW5kZXgrK10gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLy8gRW5zdXJlIGBMYXp5V3JhcHBlcmAgaXMgYW4gaW5zdGFuY2Ugb2YgYGJhc2VMb2Rhc2hgLlxuICAgIExhenlXcmFwcGVyLnByb3RvdHlwZSA9IGJhc2VDcmVhdGUoYmFzZUxvZGFzaC5wcm90b3R5cGUpO1xuICAgIExhenlXcmFwcGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IExhenlXcmFwcGVyO1xuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGhhc2ggb2JqZWN0LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbZW50cmllc10gVGhlIGtleS12YWx1ZSBwYWlycyB0byBjYWNoZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBIYXNoKGVudHJpZXMpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IGVudHJpZXMgPT0gbnVsbCA/IDAgOiBlbnRyaWVzLmxlbmd0aDtcblxuICAgICAgdGhpcy5jbGVhcigpO1xuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gZW50cmllc1tpbmRleF07XG4gICAgICAgIHRoaXMuc2V0KGVudHJ5WzBdLCBlbnRyeVsxXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhbGwga2V5LXZhbHVlIGVudHJpZXMgZnJvbSB0aGUgaGFzaC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgY2xlYXJcbiAgICAgKiBAbWVtYmVyT2YgSGFzaFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGhhc2hDbGVhcigpIHtcbiAgICAgIHRoaXMuX19kYXRhX18gPSBuYXRpdmVDcmVhdGUgPyBuYXRpdmVDcmVhdGUobnVsbCkgOiB7fTtcbiAgICAgIHRoaXMuc2l6ZSA9IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBga2V5YCBhbmQgaXRzIHZhbHVlIGZyb20gdGhlIGhhc2guXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGRlbGV0ZVxuICAgICAqIEBtZW1iZXJPZiBIYXNoXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGhhc2ggVGhlIGhhc2ggdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gcmVtb3ZlLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZW50cnkgd2FzIHJlbW92ZWQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBoYXNoRGVsZXRlKGtleSkge1xuICAgICAgdmFyIHJlc3VsdCA9IHRoaXMuaGFzKGtleSkgJiYgZGVsZXRlIHRoaXMuX19kYXRhX19ba2V5XTtcbiAgICAgIHRoaXMuc2l6ZSAtPSByZXN1bHQgPyAxIDogMDtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgaGFzaCB2YWx1ZSBmb3IgYGtleWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGdldFxuICAgICAqIEBtZW1iZXJPZiBIYXNoXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBnZXQuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGVudHJ5IHZhbHVlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGhhc2hHZXQoa2V5KSB7XG4gICAgICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX187XG4gICAgICBpZiAobmF0aXZlQ3JlYXRlKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBkYXRhW2tleV07XG4gICAgICAgIHJldHVybiByZXN1bHQgPT09IEhBU0hfVU5ERUZJTkVEID8gdW5kZWZpbmVkIDogcmVzdWx0O1xuICAgICAgfVxuICAgICAgcmV0dXJuIGhhc093blByb3BlcnR5LmNhbGwoZGF0YSwga2V5KSA/IGRhdGFba2V5XSA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYSBoYXNoIHZhbHVlIGZvciBga2V5YCBleGlzdHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGhhc1xuICAgICAqIEBtZW1iZXJPZiBIYXNoXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBlbnRyeSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW4gZW50cnkgZm9yIGBrZXlgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGhhc2hIYXMoa2V5KSB7XG4gICAgICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX187XG4gICAgICByZXR1cm4gbmF0aXZlQ3JlYXRlID8gKGRhdGFba2V5XSAhPT0gdW5kZWZpbmVkKSA6IGhhc093blByb3BlcnR5LmNhbGwoZGF0YSwga2V5KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBoYXNoIGBrZXlgIHRvIGB2YWx1ZWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIHNldFxuICAgICAqIEBtZW1iZXJPZiBIYXNoXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBzZXQuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGhhc2ggaW5zdGFuY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaGFzaFNldChrZXksIHZhbHVlKSB7XG4gICAgICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX187XG4gICAgICB0aGlzLnNpemUgKz0gdGhpcy5oYXMoa2V5KSA/IDAgOiAxO1xuICAgICAgZGF0YVtrZXldID0gKG5hdGl2ZUNyZWF0ZSAmJiB2YWx1ZSA9PT0gdW5kZWZpbmVkKSA/IEhBU0hfVU5ERUZJTkVEIDogdmFsdWU7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvLyBBZGQgbWV0aG9kcyB0byBgSGFzaGAuXG4gICAgSGFzaC5wcm90b3R5cGUuY2xlYXIgPSBoYXNoQ2xlYXI7XG4gICAgSGFzaC5wcm90b3R5cGVbJ2RlbGV0ZSddID0gaGFzaERlbGV0ZTtcbiAgICBIYXNoLnByb3RvdHlwZS5nZXQgPSBoYXNoR2V0O1xuICAgIEhhc2gucHJvdG90eXBlLmhhcyA9IGhhc2hIYXM7XG4gICAgSGFzaC5wcm90b3R5cGUuc2V0ID0gaGFzaFNldDtcblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gbGlzdCBjYWNoZSBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtlbnRyaWVzXSBUaGUga2V5LXZhbHVlIHBhaXJzIHRvIGNhY2hlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIExpc3RDYWNoZShlbnRyaWVzKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBlbnRyaWVzID09IG51bGwgPyAwIDogZW50cmllcy5sZW5ndGg7XG5cbiAgICAgIHRoaXMuY2xlYXIoKTtcbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IGVudHJpZXNbaW5kZXhdO1xuICAgICAgICB0aGlzLnNldChlbnRyeVswXSwgZW50cnlbMV0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYWxsIGtleS12YWx1ZSBlbnRyaWVzIGZyb20gdGhlIGxpc3QgY2FjaGUuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGNsZWFyXG4gICAgICogQG1lbWJlck9mIExpc3RDYWNoZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGxpc3RDYWNoZUNsZWFyKCkge1xuICAgICAgdGhpcy5fX2RhdGFfXyA9IFtdO1xuICAgICAgdGhpcy5zaXplID0gMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGBrZXlgIGFuZCBpdHMgdmFsdWUgZnJvbSB0aGUgbGlzdCBjYWNoZS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgZGVsZXRlXG4gICAgICogQG1lbWJlck9mIExpc3RDYWNoZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gcmVtb3ZlLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZW50cnkgd2FzIHJlbW92ZWQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBsaXN0Q2FjaGVEZWxldGUoa2V5KSB7XG4gICAgICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX18sXG4gICAgICAgICAgaW5kZXggPSBhc3NvY0luZGV4T2YoZGF0YSwga2V5KTtcblxuICAgICAgaWYgKGluZGV4IDwgMCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICB2YXIgbGFzdEluZGV4ID0gZGF0YS5sZW5ndGggLSAxO1xuICAgICAgaWYgKGluZGV4ID09IGxhc3RJbmRleCkge1xuICAgICAgICBkYXRhLnBvcCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3BsaWNlLmNhbGwoZGF0YSwgaW5kZXgsIDEpO1xuICAgICAgfVxuICAgICAgLS10aGlzLnNpemU7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBsaXN0IGNhY2hlIHZhbHVlIGZvciBga2V5YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgZ2V0XG4gICAgICogQG1lbWJlck9mIExpc3RDYWNoZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gZ2V0LlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBlbnRyeSB2YWx1ZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBsaXN0Q2FjaGVHZXQoa2V5KSB7XG4gICAgICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX18sXG4gICAgICAgICAgaW5kZXggPSBhc3NvY0luZGV4T2YoZGF0YSwga2V5KTtcblxuICAgICAgcmV0dXJuIGluZGV4IDwgMCA/IHVuZGVmaW5lZCA6IGRhdGFbaW5kZXhdWzFdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBhIGxpc3QgY2FjaGUgdmFsdWUgZm9yIGBrZXlgIGV4aXN0cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgaGFzXG4gICAgICogQG1lbWJlck9mIExpc3RDYWNoZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgZW50cnkgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFuIGVudHJ5IGZvciBga2V5YCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBsaXN0Q2FjaGVIYXMoa2V5KSB7XG4gICAgICByZXR1cm4gYXNzb2NJbmRleE9mKHRoaXMuX19kYXRhX18sIGtleSkgPiAtMTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBsaXN0IGNhY2hlIGBrZXlgIHRvIGB2YWx1ZWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIHNldFxuICAgICAqIEBtZW1iZXJPZiBMaXN0Q2FjaGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHNldC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbGlzdCBjYWNoZSBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBsaXN0Q2FjaGVTZXQoa2V5LCB2YWx1ZSkge1xuICAgICAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fLFxuICAgICAgICAgIGluZGV4ID0gYXNzb2NJbmRleE9mKGRhdGEsIGtleSk7XG5cbiAgICAgIGlmIChpbmRleCA8IDApIHtcbiAgICAgICAgKyt0aGlzLnNpemU7XG4gICAgICAgIGRhdGEucHVzaChba2V5LCB2YWx1ZV0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGF0YVtpbmRleF1bMV0gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8vIEFkZCBtZXRob2RzIHRvIGBMaXN0Q2FjaGVgLlxuICAgIExpc3RDYWNoZS5wcm90b3R5cGUuY2xlYXIgPSBsaXN0Q2FjaGVDbGVhcjtcbiAgICBMaXN0Q2FjaGUucHJvdG90eXBlWydkZWxldGUnXSA9IGxpc3RDYWNoZURlbGV0ZTtcbiAgICBMaXN0Q2FjaGUucHJvdG90eXBlLmdldCA9IGxpc3RDYWNoZUdldDtcbiAgICBMaXN0Q2FjaGUucHJvdG90eXBlLmhhcyA9IGxpc3RDYWNoZUhhcztcbiAgICBMaXN0Q2FjaGUucHJvdG90eXBlLnNldCA9IGxpc3RDYWNoZVNldDtcblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBtYXAgY2FjaGUgb2JqZWN0IHRvIHN0b3JlIGtleS12YWx1ZSBwYWlycy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICogQHBhcmFtIHtBcnJheX0gW2VudHJpZXNdIFRoZSBrZXktdmFsdWUgcGFpcnMgdG8gY2FjaGUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gTWFwQ2FjaGUoZW50cmllcykge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gZW50cmllcyA9PSBudWxsID8gMCA6IGVudHJpZXMubGVuZ3RoO1xuXG4gICAgICB0aGlzLmNsZWFyKCk7XG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgZW50cnkgPSBlbnRyaWVzW2luZGV4XTtcbiAgICAgICAgdGhpcy5zZXQoZW50cnlbMF0sIGVudHJ5WzFdKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGFsbCBrZXktdmFsdWUgZW50cmllcyBmcm9tIHRoZSBtYXAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGNsZWFyXG4gICAgICogQG1lbWJlck9mIE1hcENhY2hlXG4gICAgICovXG4gICAgZnVuY3Rpb24gbWFwQ2FjaGVDbGVhcigpIHtcbiAgICAgIHRoaXMuc2l6ZSA9IDA7XG4gICAgICB0aGlzLl9fZGF0YV9fID0ge1xuICAgICAgICAnaGFzaCc6IG5ldyBIYXNoLFxuICAgICAgICAnbWFwJzogbmV3IChNYXAgfHwgTGlzdENhY2hlKSxcbiAgICAgICAgJ3N0cmluZyc6IG5ldyBIYXNoXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYGtleWAgYW5kIGl0cyB2YWx1ZSBmcm9tIHRoZSBtYXAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGRlbGV0ZVxuICAgICAqIEBtZW1iZXJPZiBNYXBDYWNoZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gcmVtb3ZlLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZW50cnkgd2FzIHJlbW92ZWQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtYXBDYWNoZURlbGV0ZShrZXkpIHtcbiAgICAgIHZhciByZXN1bHQgPSBnZXRNYXBEYXRhKHRoaXMsIGtleSlbJ2RlbGV0ZSddKGtleSk7XG4gICAgICB0aGlzLnNpemUgLT0gcmVzdWx0ID8gMSA6IDA7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIG1hcCB2YWx1ZSBmb3IgYGtleWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGdldFxuICAgICAqIEBtZW1iZXJPZiBNYXBDYWNoZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gZ2V0LlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBlbnRyeSB2YWx1ZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtYXBDYWNoZUdldChrZXkpIHtcbiAgICAgIHJldHVybiBnZXRNYXBEYXRhKHRoaXMsIGtleSkuZ2V0KGtleSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGEgbWFwIHZhbHVlIGZvciBga2V5YCBleGlzdHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIGhhc1xuICAgICAqIEBtZW1iZXJPZiBNYXBDYWNoZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgZW50cnkgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFuIGVudHJ5IGZvciBga2V5YCBleGlzdHMsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtYXBDYWNoZUhhcyhrZXkpIHtcbiAgICAgIHJldHVybiBnZXRNYXBEYXRhKHRoaXMsIGtleSkuaGFzKGtleSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgbWFwIGBrZXlgIHRvIGB2YWx1ZWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBuYW1lIHNldFxuICAgICAqIEBtZW1iZXJPZiBNYXBDYWNoZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gc2V0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBtYXAgY2FjaGUgaW5zdGFuY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbWFwQ2FjaGVTZXQoa2V5LCB2YWx1ZSkge1xuICAgICAgdmFyIGRhdGEgPSBnZXRNYXBEYXRhKHRoaXMsIGtleSksXG4gICAgICAgICAgc2l6ZSA9IGRhdGEuc2l6ZTtcblxuICAgICAgZGF0YS5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICB0aGlzLnNpemUgKz0gZGF0YS5zaXplID09IHNpemUgPyAwIDogMTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8vIEFkZCBtZXRob2RzIHRvIGBNYXBDYWNoZWAuXG4gICAgTWFwQ2FjaGUucHJvdG90eXBlLmNsZWFyID0gbWFwQ2FjaGVDbGVhcjtcbiAgICBNYXBDYWNoZS5wcm90b3R5cGVbJ2RlbGV0ZSddID0gbWFwQ2FjaGVEZWxldGU7XG4gICAgTWFwQ2FjaGUucHJvdG90eXBlLmdldCA9IG1hcENhY2hlR2V0O1xuICAgIE1hcENhY2hlLnByb3RvdHlwZS5oYXMgPSBtYXBDYWNoZUhhcztcbiAgICBNYXBDYWNoZS5wcm90b3R5cGUuc2V0ID0gbWFwQ2FjaGVTZXQ7XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgY2FjaGUgb2JqZWN0IHRvIHN0b3JlIHVuaXF1ZSB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFt2YWx1ZXNdIFRoZSB2YWx1ZXMgdG8gY2FjaGUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gU2V0Q2FjaGUodmFsdWVzKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSB2YWx1ZXMgPT0gbnVsbCA/IDAgOiB2YWx1ZXMubGVuZ3RoO1xuXG4gICAgICB0aGlzLl9fZGF0YV9fID0gbmV3IE1hcENhY2hlO1xuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdGhpcy5hZGQodmFsdWVzW2luZGV4XSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkcyBgdmFsdWVgIHRvIHRoZSBhcnJheSBjYWNoZS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgYWRkXG4gICAgICogQG1lbWJlck9mIFNldENhY2hlXG4gICAgICogQGFsaWFzIHB1c2hcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjYWNoZS5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjYWNoZSBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzZXRDYWNoZUFkZCh2YWx1ZSkge1xuICAgICAgdGhpcy5fX2RhdGFfXy5zZXQodmFsdWUsIEhBU0hfVU5ERUZJTkVEKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGluIHRoZSBhcnJheSBjYWNoZS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgaGFzXG4gICAgICogQG1lbWJlck9mIFNldENhY2hlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGZvdW5kLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gc2V0Q2FjaGVIYXModmFsdWUpIHtcbiAgICAgIHJldHVybiB0aGlzLl9fZGF0YV9fLmhhcyh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLy8gQWRkIG1ldGhvZHMgdG8gYFNldENhY2hlYC5cbiAgICBTZXRDYWNoZS5wcm90b3R5cGUuYWRkID0gU2V0Q2FjaGUucHJvdG90eXBlLnB1c2ggPSBzZXRDYWNoZUFkZDtcbiAgICBTZXRDYWNoZS5wcm90b3R5cGUuaGFzID0gc2V0Q2FjaGVIYXM7XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgc3RhY2sgY2FjaGUgb2JqZWN0IHRvIHN0b3JlIGtleS12YWx1ZSBwYWlycy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICogQHBhcmFtIHtBcnJheX0gW2VudHJpZXNdIFRoZSBrZXktdmFsdWUgcGFpcnMgdG8gY2FjaGUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gU3RhY2soZW50cmllcykge1xuICAgICAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fID0gbmV3IExpc3RDYWNoZShlbnRyaWVzKTtcbiAgICAgIHRoaXMuc2l6ZSA9IGRhdGEuc2l6ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGFsbCBrZXktdmFsdWUgZW50cmllcyBmcm9tIHRoZSBzdGFjay5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgY2xlYXJcbiAgICAgKiBAbWVtYmVyT2YgU3RhY2tcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzdGFja0NsZWFyKCkge1xuICAgICAgdGhpcy5fX2RhdGFfXyA9IG5ldyBMaXN0Q2FjaGU7XG4gICAgICB0aGlzLnNpemUgPSAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYGtleWAgYW5kIGl0cyB2YWx1ZSBmcm9tIHRoZSBzdGFjay5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQG5hbWUgZGVsZXRlXG4gICAgICogQG1lbWJlck9mIFN0YWNrXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byByZW1vdmUuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBlbnRyeSB3YXMgcmVtb3ZlZCwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHN0YWNrRGVsZXRlKGtleSkge1xuICAgICAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fLFxuICAgICAgICAgIHJlc3VsdCA9IGRhdGFbJ2RlbGV0ZSddKGtleSk7XG5cbiAgICAgIHRoaXMuc2l6ZSA9IGRhdGEuc2l6ZTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgc3RhY2sgdmFsdWUgZm9yIGBrZXlgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBnZXRcbiAgICAgKiBAbWVtYmVyT2YgU3RhY2tcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIGdldC5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZW50cnkgdmFsdWUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gc3RhY2tHZXQoa2V5KSB7XG4gICAgICByZXR1cm4gdGhpcy5fX2RhdGFfXy5nZXQoa2V5KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYSBzdGFjayB2YWx1ZSBmb3IgYGtleWAgZXhpc3RzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBoYXNcbiAgICAgKiBAbWVtYmVyT2YgU3RhY2tcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIGVudHJ5IHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbiBlbnRyeSBmb3IgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gc3RhY2tIYXMoa2V5KSB7XG4gICAgICByZXR1cm4gdGhpcy5fX2RhdGFfXy5oYXMoa2V5KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBzdGFjayBga2V5YCB0byBgdmFsdWVgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAbmFtZSBzZXRcbiAgICAgKiBAbWVtYmVyT2YgU3RhY2tcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHNldC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgc3RhY2sgY2FjaGUgaW5zdGFuY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gc3RhY2tTZXQoa2V5LCB2YWx1ZSkge1xuICAgICAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fO1xuICAgICAgaWYgKGRhdGEgaW5zdGFuY2VvZiBMaXN0Q2FjaGUpIHtcbiAgICAgICAgdmFyIHBhaXJzID0gZGF0YS5fX2RhdGFfXztcbiAgICAgICAgaWYgKCFNYXAgfHwgKHBhaXJzLmxlbmd0aCA8IExBUkdFX0FSUkFZX1NJWkUgLSAxKSkge1xuICAgICAgICAgIHBhaXJzLnB1c2goW2tleSwgdmFsdWVdKTtcbiAgICAgICAgICB0aGlzLnNpemUgPSArK2RhdGEuc2l6ZTtcbiAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgICAgICBkYXRhID0gdGhpcy5fX2RhdGFfXyA9IG5ldyBNYXBDYWNoZShwYWlycyk7XG4gICAgICB9XG4gICAgICBkYXRhLnNldChrZXksIHZhbHVlKTtcbiAgICAgIHRoaXMuc2l6ZSA9IGRhdGEuc2l6ZTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8vIEFkZCBtZXRob2RzIHRvIGBTdGFja2AuXG4gICAgU3RhY2sucHJvdG90eXBlLmNsZWFyID0gc3RhY2tDbGVhcjtcbiAgICBTdGFjay5wcm90b3R5cGVbJ2RlbGV0ZSddID0gc3RhY2tEZWxldGU7XG4gICAgU3RhY2sucHJvdG90eXBlLmdldCA9IHN0YWNrR2V0O1xuICAgIFN0YWNrLnByb3RvdHlwZS5oYXMgPSBzdGFja0hhcztcbiAgICBTdGFjay5wcm90b3R5cGUuc2V0ID0gc3RhY2tTZXQ7XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHRoZSBlbnVtZXJhYmxlIHByb3BlcnR5IG5hbWVzIG9mIHRoZSBhcnJheS1saWtlIGB2YWx1ZWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gaW5oZXJpdGVkIFNwZWNpZnkgcmV0dXJuaW5nIGluaGVyaXRlZCBwcm9wZXJ0eSBuYW1lcy5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGFycmF5TGlrZUtleXModmFsdWUsIGluaGVyaXRlZCkge1xuICAgICAgdmFyIGlzQXJyID0gaXNBcnJheSh2YWx1ZSksXG4gICAgICAgICAgaXNBcmcgPSAhaXNBcnIgJiYgaXNBcmd1bWVudHModmFsdWUpLFxuICAgICAgICAgIGlzQnVmZiA9ICFpc0FyciAmJiAhaXNBcmcgJiYgaXNCdWZmZXIodmFsdWUpLFxuICAgICAgICAgIGlzVHlwZSA9ICFpc0FyciAmJiAhaXNBcmcgJiYgIWlzQnVmZiAmJiBpc1R5cGVkQXJyYXkodmFsdWUpLFxuICAgICAgICAgIHNraXBJbmRleGVzID0gaXNBcnIgfHwgaXNBcmcgfHwgaXNCdWZmIHx8IGlzVHlwZSxcbiAgICAgICAgICByZXN1bHQgPSBza2lwSW5kZXhlcyA/IGJhc2VUaW1lcyh2YWx1ZS5sZW5ndGgsIFN0cmluZykgOiBbXSxcbiAgICAgICAgICBsZW5ndGggPSByZXN1bHQubGVuZ3RoO1xuXG4gICAgICBmb3IgKHZhciBrZXkgaW4gdmFsdWUpIHtcbiAgICAgICAgaWYgKChpbmhlcml0ZWQgfHwgaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwga2V5KSkgJiZcbiAgICAgICAgICAgICEoc2tpcEluZGV4ZXMgJiYgKFxuICAgICAgICAgICAgICAgLy8gU2FmYXJpIDkgaGFzIGVudW1lcmFibGUgYGFyZ3VtZW50cy5sZW5ndGhgIGluIHN0cmljdCBtb2RlLlxuICAgICAgICAgICAgICAga2V5ID09ICdsZW5ndGgnIHx8XG4gICAgICAgICAgICAgICAvLyBOb2RlLmpzIDAuMTAgaGFzIGVudW1lcmFibGUgbm9uLWluZGV4IHByb3BlcnRpZXMgb24gYnVmZmVycy5cbiAgICAgICAgICAgICAgIChpc0J1ZmYgJiYgKGtleSA9PSAnb2Zmc2V0JyB8fCBrZXkgPT0gJ3BhcmVudCcpKSB8fFxuICAgICAgICAgICAgICAgLy8gUGhhbnRvbUpTIDIgaGFzIGVudW1lcmFibGUgbm9uLWluZGV4IHByb3BlcnRpZXMgb24gdHlwZWQgYXJyYXlzLlxuICAgICAgICAgICAgICAgKGlzVHlwZSAmJiAoa2V5ID09ICdidWZmZXInIHx8IGtleSA9PSAnYnl0ZUxlbmd0aCcgfHwga2V5ID09ICdieXRlT2Zmc2V0JykpIHx8XG4gICAgICAgICAgICAgICAvLyBTa2lwIGluZGV4IHByb3BlcnRpZXMuXG4gICAgICAgICAgICAgICBpc0luZGV4KGtleSwgbGVuZ3RoKVxuICAgICAgICAgICAgKSkpIHtcbiAgICAgICAgICByZXN1bHQucHVzaChrZXkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5zYW1wbGVgIGZvciBhcnJheXMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBzYW1wbGUuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJhbmRvbSBlbGVtZW50LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGFycmF5U2FtcGxlKGFycmF5KSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuICAgICAgcmV0dXJuIGxlbmd0aCA/IGFycmF5W2Jhc2VSYW5kb20oMCwgbGVuZ3RoIC0gMSldIDogdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5zYW1wbGVTaXplYCBmb3IgYXJyYXlzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gc2FtcGxlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBuIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgdG8gc2FtcGxlLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgcmFuZG9tIGVsZW1lbnRzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGFycmF5U2FtcGxlU2l6ZShhcnJheSwgbikge1xuICAgICAgcmV0dXJuIHNodWZmbGVTZWxmKGNvcHlBcnJheShhcnJheSksIGJhc2VDbGFtcChuLCAwLCBhcnJheS5sZW5ndGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uc2h1ZmZsZWAgZm9yIGFycmF5cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHNodWZmbGUuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgc2h1ZmZsZWQgYXJyYXkuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYXJyYXlTaHVmZmxlKGFycmF5KSB7XG4gICAgICByZXR1cm4gc2h1ZmZsZVNlbGYoY29weUFycmF5KGFycmF5KSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyBsaWtlIGBhc3NpZ25WYWx1ZWAgZXhjZXB0IHRoYXQgaXQgZG9lc24ndCBhc3NpZ25cbiAgICAgKiBgdW5kZWZpbmVkYCB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBhc3NpZ24uXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gYXNzaWduLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGFzc2lnbk1lcmdlVmFsdWUob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gICAgICBpZiAoKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgIWVxKG9iamVjdFtrZXldLCB2YWx1ZSkpIHx8XG4gICAgICAgICAgKHZhbHVlID09PSB1bmRlZmluZWQgJiYgIShrZXkgaW4gb2JqZWN0KSkpIHtcbiAgICAgICAgYmFzZUFzc2lnblZhbHVlKG9iamVjdCwga2V5LCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQXNzaWducyBgdmFsdWVgIHRvIGBrZXlgIG9mIGBvYmplY3RgIGlmIHRoZSBleGlzdGluZyB2YWx1ZSBpcyBub3QgZXF1aXZhbGVudFxuICAgICAqIHVzaW5nIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pXG4gICAgICogZm9yIGVxdWFsaXR5IGNvbXBhcmlzb25zLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gYXNzaWduLlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGFzc2lnbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBhc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgdmFsdWUpIHtcbiAgICAgIHZhciBvYmpWYWx1ZSA9IG9iamVjdFtrZXldO1xuICAgICAgaWYgKCEoaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSkgJiYgZXEob2JqVmFsdWUsIHZhbHVlKSkgfHxcbiAgICAgICAgICAodmFsdWUgPT09IHVuZGVmaW5lZCAmJiAhKGtleSBpbiBvYmplY3QpKSkge1xuICAgICAgICBiYXNlQXNzaWduVmFsdWUob2JqZWN0LCBrZXksIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBpbmRleCBhdCB3aGljaCB0aGUgYGtleWAgaXMgZm91bmQgaW4gYGFycmF5YCBvZiBrZXktdmFsdWUgcGFpcnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7Kn0ga2V5IFRoZSBrZXkgdG8gc2VhcmNoIGZvci5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbWF0Y2hlZCB2YWx1ZSwgZWxzZSBgLTFgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGFzc29jSW5kZXhPZihhcnJheSwga2V5KSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuICAgICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICAgIGlmIChlcShhcnJheVtsZW5ndGhdWzBdLCBrZXkpKSB7XG4gICAgICAgICAgcmV0dXJuIGxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIC0xO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFnZ3JlZ2F0ZXMgZWxlbWVudHMgb2YgYGNvbGxlY3Rpb25gIG9uIGBhY2N1bXVsYXRvcmAgd2l0aCBrZXlzIHRyYW5zZm9ybWVkXG4gICAgICogYnkgYGl0ZXJhdGVlYCBhbmQgdmFsdWVzIHNldCBieSBgc2V0dGVyYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHNldHRlciBUaGUgZnVuY3Rpb24gdG8gc2V0IGBhY2N1bXVsYXRvcmAgdmFsdWVzLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBpdGVyYXRlZSB0byB0cmFuc2Zvcm0ga2V5cy5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gYWNjdW11bGF0b3IgVGhlIGluaXRpYWwgYWdncmVnYXRlZCBvYmplY3QuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIGBhY2N1bXVsYXRvcmAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUFnZ3JlZ2F0b3IoY29sbGVjdGlvbiwgc2V0dGVyLCBpdGVyYXRlZSwgYWNjdW11bGF0b3IpIHtcbiAgICAgIGJhc2VFYWNoKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBrZXksIGNvbGxlY3Rpb24pIHtcbiAgICAgICAgc2V0dGVyKGFjY3VtdWxhdG9yLCB2YWx1ZSwgaXRlcmF0ZWUodmFsdWUpLCBjb2xsZWN0aW9uKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGFjY3VtdWxhdG9yO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmFzc2lnbmAgd2l0aG91dCBzdXBwb3J0IGZvciBtdWx0aXBsZSBzb3VyY2VzXG4gICAgICogb3IgYGN1c3RvbWl6ZXJgIGZ1bmN0aW9ucy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIHNvdXJjZSBvYmplY3QuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlQXNzaWduKG9iamVjdCwgc291cmNlKSB7XG4gICAgICByZXR1cm4gb2JqZWN0ICYmIGNvcHlPYmplY3Qoc291cmNlLCBrZXlzKHNvdXJjZSksIG9iamVjdCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uYXNzaWduSW5gIHdpdGhvdXQgc3VwcG9ydCBmb3IgbXVsdGlwbGUgc291cmNlc1xuICAgICAqIG9yIGBjdXN0b21pemVyYCBmdW5jdGlvbnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBzb3VyY2Ugb2JqZWN0LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUFzc2lnbkluKG9iamVjdCwgc291cmNlKSB7XG4gICAgICByZXR1cm4gb2JqZWN0ICYmIGNvcHlPYmplY3Qoc291cmNlLCBrZXlzSW4oc291cmNlKSwgb2JqZWN0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgYXNzaWduVmFsdWVgIGFuZCBgYXNzaWduTWVyZ2VWYWx1ZWAgd2l0aG91dFxuICAgICAqIHZhbHVlIGNoZWNrcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGFzc2lnbi5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBhc3NpZ24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUFzc2lnblZhbHVlKG9iamVjdCwga2V5LCB2YWx1ZSkge1xuICAgICAgaWYgKGtleSA9PSAnX19wcm90b19fJyAmJiBkZWZpbmVQcm9wZXJ0eSkge1xuICAgICAgICBkZWZpbmVQcm9wZXJ0eShvYmplY3QsIGtleSwge1xuICAgICAgICAgICdjb25maWd1cmFibGUnOiB0cnVlLFxuICAgICAgICAgICdlbnVtZXJhYmxlJzogdHJ1ZSxcbiAgICAgICAgICAndmFsdWUnOiB2YWx1ZSxcbiAgICAgICAgICAnd3JpdGFibGUnOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb2JqZWN0W2tleV0gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5hdGAgd2l0aG91dCBzdXBwb3J0IGZvciBpbmRpdmlkdWFsIHBhdGhzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nW119IHBhdGhzIFRoZSBwcm9wZXJ0eSBwYXRocyB0byBwaWNrLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgcGlja2VkIGVsZW1lbnRzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VBdChvYmplY3QsIHBhdGhzKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBwYXRocy5sZW5ndGgsXG4gICAgICAgICAgcmVzdWx0ID0gQXJyYXkobGVuZ3RoKSxcbiAgICAgICAgICBza2lwID0gb2JqZWN0ID09IG51bGw7XG5cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHJlc3VsdFtpbmRleF0gPSBza2lwID8gdW5kZWZpbmVkIDogZ2V0KG9iamVjdCwgcGF0aHNbaW5kZXhdKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uY2xhbXBgIHdoaWNoIGRvZXNuJ3QgY29lcmNlIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG51bWJlciBUaGUgbnVtYmVyIHRvIGNsYW1wLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbG93ZXJdIFRoZSBsb3dlciBib3VuZC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdXBwZXIgVGhlIHVwcGVyIGJvdW5kLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGNsYW1wZWQgbnVtYmVyLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VDbGFtcChudW1iZXIsIGxvd2VyLCB1cHBlcikge1xuICAgICAgaWYgKG51bWJlciA9PT0gbnVtYmVyKSB7XG4gICAgICAgIGlmICh1cHBlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgbnVtYmVyID0gbnVtYmVyIDw9IHVwcGVyID8gbnVtYmVyIDogdXBwZXI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxvd2VyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBudW1iZXIgPSBudW1iZXIgPj0gbG93ZXIgPyBudW1iZXIgOiBsb3dlcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG51bWJlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5jbG9uZWAgYW5kIGBfLmNsb25lRGVlcGAgd2hpY2ggdHJhY2tzXG4gICAgICogdHJhdmVyc2VkIG9iamVjdHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNsb25lLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy5cbiAgICAgKiAgMSAtIERlZXAgY2xvbmVcbiAgICAgKiAgMiAtIEZsYXR0ZW4gaW5oZXJpdGVkIHByb3BlcnRpZXNcbiAgICAgKiAgNCAtIENsb25lIHN5bWJvbHNcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjbG9uaW5nLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBba2V5XSBUaGUga2V5IG9mIGB2YWx1ZWAuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3RdIFRoZSBwYXJlbnQgb2JqZWN0IG9mIGB2YWx1ZWAuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtzdGFja10gVHJhY2tzIHRyYXZlcnNlZCBvYmplY3RzIGFuZCB0aGVpciBjbG9uZSBjb3VudGVycGFydHMuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGNsb25lZCB2YWx1ZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlQ2xvbmUodmFsdWUsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGtleSwgb2JqZWN0LCBzdGFjaykge1xuICAgICAgdmFyIHJlc3VsdCxcbiAgICAgICAgICBpc0RlZXAgPSBiaXRtYXNrICYgQ0xPTkVfREVFUF9GTEFHLFxuICAgICAgICAgIGlzRmxhdCA9IGJpdG1hc2sgJiBDTE9ORV9GTEFUX0ZMQUcsXG4gICAgICAgICAgaXNGdWxsID0gYml0bWFzayAmIENMT05FX1NZTUJPTFNfRkxBRztcblxuICAgICAgaWYgKGN1c3RvbWl6ZXIpIHtcbiAgICAgICAgcmVzdWx0ID0gb2JqZWN0ID8gY3VzdG9taXplcih2YWx1ZSwga2V5LCBvYmplY3QsIHN0YWNrKSA6IGN1c3RvbWl6ZXIodmFsdWUpO1xuICAgICAgfVxuICAgICAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgICBpZiAoIWlzT2JqZWN0KHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG4gICAgICB2YXIgaXNBcnIgPSBpc0FycmF5KHZhbHVlKTtcbiAgICAgIGlmIChpc0Fycikge1xuICAgICAgICByZXN1bHQgPSBpbml0Q2xvbmVBcnJheSh2YWx1ZSk7XG4gICAgICAgIGlmICghaXNEZWVwKSB7XG4gICAgICAgICAgcmV0dXJuIGNvcHlBcnJheSh2YWx1ZSwgcmVzdWx0KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIHRhZyA9IGdldFRhZyh2YWx1ZSksXG4gICAgICAgICAgICBpc0Z1bmMgPSB0YWcgPT0gZnVuY1RhZyB8fCB0YWcgPT0gZ2VuVGFnO1xuXG4gICAgICAgIGlmIChpc0J1ZmZlcih2YWx1ZSkpIHtcbiAgICAgICAgICByZXR1cm4gY2xvbmVCdWZmZXIodmFsdWUsIGlzRGVlcCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRhZyA9PSBvYmplY3RUYWcgfHwgdGFnID09IGFyZ3NUYWcgfHwgKGlzRnVuYyAmJiAhb2JqZWN0KSkge1xuICAgICAgICAgIHJlc3VsdCA9IChpc0ZsYXQgfHwgaXNGdW5jKSA/IHt9IDogaW5pdENsb25lT2JqZWN0KHZhbHVlKTtcbiAgICAgICAgICBpZiAoIWlzRGVlcCkge1xuICAgICAgICAgICAgcmV0dXJuIGlzRmxhdFxuICAgICAgICAgICAgICA/IGNvcHlTeW1ib2xzSW4odmFsdWUsIGJhc2VBc3NpZ25JbihyZXN1bHQsIHZhbHVlKSlcbiAgICAgICAgICAgICAgOiBjb3B5U3ltYm9scyh2YWx1ZSwgYmFzZUFzc2lnbihyZXN1bHQsIHZhbHVlKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICghY2xvbmVhYmxlVGFnc1t0YWddKSB7XG4gICAgICAgICAgICByZXR1cm4gb2JqZWN0ID8gdmFsdWUgOiB7fTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVzdWx0ID0gaW5pdENsb25lQnlUYWcodmFsdWUsIHRhZywgaXNEZWVwKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gQ2hlY2sgZm9yIGNpcmN1bGFyIHJlZmVyZW5jZXMgYW5kIHJldHVybiBpdHMgY29ycmVzcG9uZGluZyBjbG9uZS5cbiAgICAgIHN0YWNrIHx8IChzdGFjayA9IG5ldyBTdGFjayk7XG4gICAgICB2YXIgc3RhY2tlZCA9IHN0YWNrLmdldCh2YWx1ZSk7XG4gICAgICBpZiAoc3RhY2tlZCkge1xuICAgICAgICByZXR1cm4gc3RhY2tlZDtcbiAgICAgIH1cbiAgICAgIHN0YWNrLnNldCh2YWx1ZSwgcmVzdWx0KTtcblxuICAgICAgaWYgKGlzU2V0KHZhbHVlKSkge1xuICAgICAgICB2YWx1ZS5mb3JFYWNoKGZ1bmN0aW9uKHN1YlZhbHVlKSB7XG4gICAgICAgICAgcmVzdWx0LmFkZChiYXNlQ2xvbmUoc3ViVmFsdWUsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIHN1YlZhbHVlLCB2YWx1ZSwgc3RhY2spKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKGlzTWFwKHZhbHVlKSkge1xuICAgICAgICB2YWx1ZS5mb3JFYWNoKGZ1bmN0aW9uKHN1YlZhbHVlLCBrZXkpIHtcbiAgICAgICAgICByZXN1bHQuc2V0KGtleSwgYmFzZUNsb25lKHN1YlZhbHVlLCBiaXRtYXNrLCBjdXN0b21pemVyLCBrZXksIHZhbHVlLCBzdGFjaykpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgdmFyIGtleXNGdW5jID0gaXNGdWxsXG4gICAgICAgID8gKGlzRmxhdCA/IGdldEFsbEtleXNJbiA6IGdldEFsbEtleXMpXG4gICAgICAgIDogKGlzRmxhdCA/IGtleXNJbiA6IGtleXMpO1xuXG4gICAgICB2YXIgcHJvcHMgPSBpc0FyciA/IHVuZGVmaW5lZCA6IGtleXNGdW5jKHZhbHVlKTtcbiAgICAgIGFycmF5RWFjaChwcm9wcyB8fCB2YWx1ZSwgZnVuY3Rpb24oc3ViVmFsdWUsIGtleSkge1xuICAgICAgICBpZiAocHJvcHMpIHtcbiAgICAgICAgICBrZXkgPSBzdWJWYWx1ZTtcbiAgICAgICAgICBzdWJWYWx1ZSA9IHZhbHVlW2tleV07XG4gICAgICAgIH1cbiAgICAgICAgLy8gUmVjdXJzaXZlbHkgcG9wdWxhdGUgY2xvbmUgKHN1c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGltaXRzKS5cbiAgICAgICAgYXNzaWduVmFsdWUocmVzdWx0LCBrZXksIGJhc2VDbG9uZShzdWJWYWx1ZSwgYml0bWFzaywgY3VzdG9taXplciwga2V5LCB2YWx1ZSwgc3RhY2spKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5jb25mb3Jtc2Agd2hpY2ggZG9lc24ndCBjbG9uZSBgc291cmNlYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IG9mIHByb3BlcnR5IHByZWRpY2F0ZXMgdG8gY29uZm9ybSB0by5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBzcGVjIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VDb25mb3Jtcyhzb3VyY2UpIHtcbiAgICAgIHZhciBwcm9wcyA9IGtleXMoc291cmNlKTtcbiAgICAgIHJldHVybiBmdW5jdGlvbihvYmplY3QpIHtcbiAgICAgICAgcmV0dXJuIGJhc2VDb25mb3Jtc1RvKG9iamVjdCwgc291cmNlLCBwcm9wcyk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmNvbmZvcm1zVG9gIHdoaWNoIGFjY2VwdHMgYHByb3BzYCB0byBjaGVjay5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IG9mIHByb3BlcnR5IHByZWRpY2F0ZXMgdG8gY29uZm9ybSB0by5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYG9iamVjdGAgY29uZm9ybXMsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlQ29uZm9ybXNUbyhvYmplY3QsIHNvdXJjZSwgcHJvcHMpIHtcbiAgICAgIHZhciBsZW5ndGggPSBwcm9wcy5sZW5ndGg7XG4gICAgICBpZiAob2JqZWN0ID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuICFsZW5ndGg7XG4gICAgICB9XG4gICAgICBvYmplY3QgPSBPYmplY3Qob2JqZWN0KTtcbiAgICAgIHdoaWxlIChsZW5ndGgtLSkge1xuICAgICAgICB2YXIga2V5ID0gcHJvcHNbbGVuZ3RoXSxcbiAgICAgICAgICAgIHByZWRpY2F0ZSA9IHNvdXJjZVtrZXldLFxuICAgICAgICAgICAgdmFsdWUgPSBvYmplY3Rba2V5XTtcblxuICAgICAgICBpZiAoKHZhbHVlID09PSB1bmRlZmluZWQgJiYgIShrZXkgaW4gb2JqZWN0KSkgfHwgIXByZWRpY2F0ZSh2YWx1ZSkpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmRlbGF5YCBhbmQgYF8uZGVmZXJgIHdoaWNoIGFjY2VwdHMgYGFyZ3NgXG4gICAgICogdG8gcHJvdmlkZSB0byBgZnVuY2AuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRlbGF5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB3YWl0IFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIGRlbGF5IGludm9jYXRpb24uXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJncyBUaGUgYXJndW1lbnRzIHRvIHByb3ZpZGUgdG8gYGZ1bmNgLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ8T2JqZWN0fSBSZXR1cm5zIHRoZSB0aW1lciBpZCBvciB0aW1lb3V0IG9iamVjdC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlRGVsYXkoZnVuYywgd2FpdCwgYXJncykge1xuICAgICAgaWYgKHR5cGVvZiBmdW5jICE9ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7IGZ1bmMuYXBwbHkodW5kZWZpbmVkLCBhcmdzKTsgfSwgd2FpdCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgbWV0aG9kcyBsaWtlIGBfLmRpZmZlcmVuY2VgIHdpdGhvdXQgc3VwcG9ydFxuICAgICAqIGZvciBleGNsdWRpbmcgbXVsdGlwbGUgYXJyYXlzIG9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHZhbHVlcyBUaGUgdmFsdWVzIHRvIGV4Y2x1ZGUuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlXSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY29tcGFyYXRvcl0gVGhlIGNvbXBhcmF0b3IgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBmaWx0ZXJlZCB2YWx1ZXMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZURpZmZlcmVuY2UoYXJyYXksIHZhbHVlcywgaXRlcmF0ZWUsIGNvbXBhcmF0b3IpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGluY2x1ZGVzID0gYXJyYXlJbmNsdWRlcyxcbiAgICAgICAgICBpc0NvbW1vbiA9IHRydWUsXG4gICAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgICAgIHJlc3VsdCA9IFtdLFxuICAgICAgICAgIHZhbHVlc0xlbmd0aCA9IHZhbHVlcy5sZW5ndGg7XG5cbiAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgICBpZiAoaXRlcmF0ZWUpIHtcbiAgICAgICAgdmFsdWVzID0gYXJyYXlNYXAodmFsdWVzLCBiYXNlVW5hcnkoaXRlcmF0ZWUpKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb21wYXJhdG9yKSB7XG4gICAgICAgIGluY2x1ZGVzID0gYXJyYXlJbmNsdWRlc1dpdGg7XG4gICAgICAgIGlzQ29tbW9uID0gZmFsc2U7XG4gICAgICB9XG4gICAgICBlbHNlIGlmICh2YWx1ZXMubGVuZ3RoID49IExBUkdFX0FSUkFZX1NJWkUpIHtcbiAgICAgICAgaW5jbHVkZXMgPSBjYWNoZUhhcztcbiAgICAgICAgaXNDb21tb24gPSBmYWxzZTtcbiAgICAgICAgdmFsdWVzID0gbmV3IFNldENhY2hlKHZhbHVlcyk7XG4gICAgICB9XG4gICAgICBvdXRlcjpcbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IGFycmF5W2luZGV4XSxcbiAgICAgICAgICAgIGNvbXB1dGVkID0gaXRlcmF0ZWUgPT0gbnVsbCA/IHZhbHVlIDogaXRlcmF0ZWUodmFsdWUpO1xuXG4gICAgICAgIHZhbHVlID0gKGNvbXBhcmF0b3IgfHwgdmFsdWUgIT09IDApID8gdmFsdWUgOiAwO1xuICAgICAgICBpZiAoaXNDb21tb24gJiYgY29tcHV0ZWQgPT09IGNvbXB1dGVkKSB7XG4gICAgICAgICAgdmFyIHZhbHVlc0luZGV4ID0gdmFsdWVzTGVuZ3RoO1xuICAgICAgICAgIHdoaWxlICh2YWx1ZXNJbmRleC0tKSB7XG4gICAgICAgICAgICBpZiAodmFsdWVzW3ZhbHVlc0luZGV4XSA9PT0gY29tcHV0ZWQpIHtcbiAgICAgICAgICAgICAgY29udGludWUgb3V0ZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlc3VsdC5wdXNoKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghaW5jbHVkZXModmFsdWVzLCBjb21wdXRlZCwgY29tcGFyYXRvcikpIHtcbiAgICAgICAgICByZXN1bHQucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZm9yRWFjaGAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl8T2JqZWN0fSBSZXR1cm5zIGBjb2xsZWN0aW9uYC5cbiAgICAgKi9cbiAgICB2YXIgYmFzZUVhY2ggPSBjcmVhdGVCYXNlRWFjaChiYXNlRm9yT3duKTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZvckVhY2hSaWdodGAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl8T2JqZWN0fSBSZXR1cm5zIGBjb2xsZWN0aW9uYC5cbiAgICAgKi9cbiAgICB2YXIgYmFzZUVhY2hSaWdodCA9IGNyZWF0ZUJhc2VFYWNoKGJhc2VGb3JPd25SaWdodCwgdHJ1ZSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5ldmVyeWAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFsbCBlbGVtZW50cyBwYXNzIHRoZSBwcmVkaWNhdGUgY2hlY2ssXG4gICAgICogIGVsc2UgYGZhbHNlYFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VFdmVyeShjb2xsZWN0aW9uLCBwcmVkaWNhdGUpIHtcbiAgICAgIHZhciByZXN1bHQgPSB0cnVlO1xuICAgICAgYmFzZUVhY2goY29sbGVjdGlvbiwgZnVuY3Rpb24odmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKSB7XG4gICAgICAgIHJlc3VsdCA9ICEhcHJlZGljYXRlKHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbik7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgbWV0aG9kcyBsaWtlIGBfLm1heGAgYW5kIGBfLm1pbmAgd2hpY2ggYWNjZXB0cyBhXG4gICAgICogYGNvbXBhcmF0b3JgIHRvIGRldGVybWluZSB0aGUgZXh0cmVtdW0gdmFsdWUuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjb21wYXJhdG9yIFRoZSBjb21wYXJhdG9yIHVzZWQgdG8gY29tcGFyZSB2YWx1ZXMuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGV4dHJlbXVtIHZhbHVlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VFeHRyZW11bShhcnJheSwgaXRlcmF0ZWUsIGNvbXBhcmF0b3IpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdLFxuICAgICAgICAgICAgY3VycmVudCA9IGl0ZXJhdGVlKHZhbHVlKTtcblxuICAgICAgICBpZiAoY3VycmVudCAhPSBudWxsICYmIChjb21wdXRlZCA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgID8gKGN1cnJlbnQgPT09IGN1cnJlbnQgJiYgIWlzU3ltYm9sKGN1cnJlbnQpKVxuICAgICAgICAgICAgICA6IGNvbXBhcmF0b3IoY3VycmVudCwgY29tcHV0ZWQpXG4gICAgICAgICAgICApKSB7XG4gICAgICAgICAgdmFyIGNvbXB1dGVkID0gY3VycmVudCxcbiAgICAgICAgICAgICAgcmVzdWx0ID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZmlsbGAgd2l0aG91dCBhbiBpdGVyYXRlZSBjYWxsIGd1YXJkLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gZmlsbC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBmaWxsIGBhcnJheWAgd2l0aC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3N0YXJ0PTBdIFRoZSBzdGFydCBwb3NpdGlvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2VuZD1hcnJheS5sZW5ndGhdIFRoZSBlbmQgcG9zaXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUZpbGwoYXJyYXksIHZhbHVlLCBzdGFydCwgZW5kKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXG4gICAgICBzdGFydCA9IHRvSW50ZWdlcihzdGFydCk7XG4gICAgICBpZiAoc3RhcnQgPCAwKSB7XG4gICAgICAgIHN0YXJ0ID0gLXN0YXJ0ID4gbGVuZ3RoID8gMCA6IChsZW5ndGggKyBzdGFydCk7XG4gICAgICB9XG4gICAgICBlbmQgPSAoZW5kID09PSB1bmRlZmluZWQgfHwgZW5kID4gbGVuZ3RoKSA/IGxlbmd0aCA6IHRvSW50ZWdlcihlbmQpO1xuICAgICAgaWYgKGVuZCA8IDApIHtcbiAgICAgICAgZW5kICs9IGxlbmd0aDtcbiAgICAgIH1cbiAgICAgIGVuZCA9IHN0YXJ0ID4gZW5kID8gMCA6IHRvTGVuZ3RoKGVuZCk7XG4gICAgICB3aGlsZSAoc3RhcnQgPCBlbmQpIHtcbiAgICAgICAgYXJyYXlbc3RhcnQrK10gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhcnJheTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5maWx0ZXJgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRpY2F0ZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZpbHRlcmVkIGFycmF5LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VGaWx0ZXIoY29sbGVjdGlvbiwgcHJlZGljYXRlKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgICBiYXNlRWFjaChjb2xsZWN0aW9uLCBmdW5jdGlvbih2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pIHtcbiAgICAgICAgaWYgKHByZWRpY2F0ZSh2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pKSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2godmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZmxhdHRlbmAgd2l0aCBzdXBwb3J0IGZvciByZXN0cmljdGluZyBmbGF0dGVuaW5nLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gZmxhdHRlbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZGVwdGggVGhlIG1heGltdW0gcmVjdXJzaW9uIGRlcHRoLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3ByZWRpY2F0ZT1pc0ZsYXR0ZW5hYmxlXSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzU3RyaWN0XSBSZXN0cmljdCB0byB2YWx1ZXMgdGhhdCBwYXNzIGBwcmVkaWNhdGVgIGNoZWNrcy5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbcmVzdWx0PVtdXSBUaGUgaW5pdGlhbCByZXN1bHQgdmFsdWUuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZmxhdHRlbmVkIGFycmF5LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VGbGF0dGVuKGFycmF5LCBkZXB0aCwgcHJlZGljYXRlLCBpc1N0cmljdCwgcmVzdWx0KSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG5cbiAgICAgIHByZWRpY2F0ZSB8fCAocHJlZGljYXRlID0gaXNGbGF0dGVuYWJsZSk7XG4gICAgICByZXN1bHQgfHwgKHJlc3VsdCA9IFtdKTtcblxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdO1xuICAgICAgICBpZiAoZGVwdGggPiAwICYmIHByZWRpY2F0ZSh2YWx1ZSkpIHtcbiAgICAgICAgICBpZiAoZGVwdGggPiAxKSB7XG4gICAgICAgICAgICAvLyBSZWN1cnNpdmVseSBmbGF0dGVuIGFycmF5cyAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLlxuICAgICAgICAgICAgYmFzZUZsYXR0ZW4odmFsdWUsIGRlcHRoIC0gMSwgcHJlZGljYXRlLCBpc1N0cmljdCwgcmVzdWx0KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYXJyYXlQdXNoKHJlc3VsdCwgdmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICghaXNTdHJpY3QpIHtcbiAgICAgICAgICByZXN1bHRbcmVzdWx0Lmxlbmd0aF0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgYmFzZUZvck93bmAgd2hpY2ggaXRlcmF0ZXMgb3ZlciBgb2JqZWN0YFxuICAgICAqIHByb3BlcnRpZXMgcmV0dXJuZWQgYnkgYGtleXNGdW5jYCBhbmQgaW52b2tlcyBgaXRlcmF0ZWVgIGZvciBlYWNoIHByb3BlcnR5LlxuICAgICAqIEl0ZXJhdGVlIGZ1bmN0aW9ucyBtYXkgZXhpdCBpdGVyYXRpb24gZWFybHkgYnkgZXhwbGljaXRseSByZXR1cm5pbmcgYGZhbHNlYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGtleXNGdW5jIFRoZSBmdW5jdGlvbiB0byBnZXQgdGhlIGtleXMgb2YgYG9iamVjdGAuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKi9cbiAgICB2YXIgYmFzZUZvciA9IGNyZWF0ZUJhc2VGb3IoKTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgbGlrZSBgYmFzZUZvcmAgZXhjZXB0IHRoYXQgaXQgaXRlcmF0ZXMgb3ZlciBwcm9wZXJ0aWVzXG4gICAgICogaW4gdGhlIG9wcG9zaXRlIG9yZGVyLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0ga2V5c0Z1bmMgVGhlIGZ1bmN0aW9uIHRvIGdldCB0aGUga2V5cyBvZiBgb2JqZWN0YC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqL1xuICAgIHZhciBiYXNlRm9yUmlnaHQgPSBjcmVhdGVCYXNlRm9yKHRydWUpO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZm9yT3duYCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VGb3JPd24ob2JqZWN0LCBpdGVyYXRlZSkge1xuICAgICAgcmV0dXJuIG9iamVjdCAmJiBiYXNlRm9yKG9iamVjdCwgaXRlcmF0ZWUsIGtleXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZvck93blJpZ2h0YCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VGb3JPd25SaWdodChvYmplY3QsIGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gb2JqZWN0ICYmIGJhc2VGb3JSaWdodChvYmplY3QsIGl0ZXJhdGVlLCBrZXlzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5mdW5jdGlvbnNgIHdoaWNoIGNyZWF0ZXMgYW4gYXJyYXkgb2ZcbiAgICAgKiBgb2JqZWN0YCBmdW5jdGlvbiBwcm9wZXJ0eSBuYW1lcyBmaWx0ZXJlZCBmcm9tIGBwcm9wc2AuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHByb3BzIFRoZSBwcm9wZXJ0eSBuYW1lcyB0byBmaWx0ZXIuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBmdW5jdGlvbiBuYW1lcy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlRnVuY3Rpb25zKG9iamVjdCwgcHJvcHMpIHtcbiAgICAgIHJldHVybiBhcnJheUZpbHRlcihwcm9wcywgZnVuY3Rpb24oa2V5KSB7XG4gICAgICAgIHJldHVybiBpc0Z1bmN0aW9uKG9iamVjdFtrZXldKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmdldGAgd2l0aG91dCBzdXBwb3J0IGZvciBkZWZhdWx0IHZhbHVlcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJlc29sdmVkIHZhbHVlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VHZXQob2JqZWN0LCBwYXRoKSB7XG4gICAgICBwYXRoID0gY2FzdFBhdGgocGF0aCwgb2JqZWN0KTtcblxuICAgICAgdmFyIGluZGV4ID0gMCxcbiAgICAgICAgICBsZW5ndGggPSBwYXRoLmxlbmd0aDtcblxuICAgICAgd2hpbGUgKG9iamVjdCAhPSBudWxsICYmIGluZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIG9iamVjdCA9IG9iamVjdFt0b0tleShwYXRoW2luZGV4KytdKV07XG4gICAgICB9XG4gICAgICByZXR1cm4gKGluZGV4ICYmIGluZGV4ID09IGxlbmd0aCkgPyBvYmplY3QgOiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYGdldEFsbEtleXNgIGFuZCBgZ2V0QWxsS2V5c0luYCB3aGljaCB1c2VzXG4gICAgICogYGtleXNGdW5jYCBhbmQgYHN5bWJvbHNGdW5jYCB0byBnZXQgdGhlIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMgYW5kXG4gICAgICogc3ltYm9scyBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGtleXNGdW5jIFRoZSBmdW5jdGlvbiB0byBnZXQgdGhlIGtleXMgb2YgYG9iamVjdGAuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gc3ltYm9sc0Z1bmMgVGhlIGZ1bmN0aW9uIHRvIGdldCB0aGUgc3ltYm9scyBvZiBgb2JqZWN0YC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzIGFuZCBzeW1ib2xzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VHZXRBbGxLZXlzKG9iamVjdCwga2V5c0Z1bmMsIHN5bWJvbHNGdW5jKSB7XG4gICAgICB2YXIgcmVzdWx0ID0ga2V5c0Z1bmMob2JqZWN0KTtcbiAgICAgIHJldHVybiBpc0FycmF5KG9iamVjdCkgPyByZXN1bHQgOiBhcnJheVB1c2gocmVzdWx0LCBzeW1ib2xzRnVuYyhvYmplY3QpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgZ2V0VGFnYCB3aXRob3V0IGZhbGxiYWNrcyBmb3IgYnVnZ3kgZW52aXJvbm1lbnRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBgdG9TdHJpbmdUYWdgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VHZXRUYWcodmFsdWUpIHtcbiAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkVGFnIDogbnVsbFRhZztcbiAgICAgIH1cbiAgICAgIHJldHVybiAoc3ltVG9TdHJpbmdUYWcgJiYgc3ltVG9TdHJpbmdUYWcgaW4gT2JqZWN0KHZhbHVlKSlcbiAgICAgICAgPyBnZXRSYXdUYWcodmFsdWUpXG4gICAgICAgIDogb2JqZWN0VG9TdHJpbmcodmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmd0YCB3aGljaCBkb2Vzbid0IGNvZXJjZSBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBncmVhdGVyIHRoYW4gYG90aGVyYCxcbiAgICAgKiAgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VHdCh2YWx1ZSwgb3RoZXIpIHtcbiAgICAgIHJldHVybiB2YWx1ZSA+IG90aGVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmhhc2Agd2l0aG91dCBzdXBwb3J0IGZvciBkZWVwIHBhdGhzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29iamVjdF0gVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30ga2V5IFRoZSBrZXkgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBrZXlgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VIYXMob2JqZWN0LCBrZXkpIHtcbiAgICAgIHJldHVybiBvYmplY3QgIT0gbnVsbCAmJiBoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5oYXNJbmAgd2l0aG91dCBzdXBwb3J0IGZvciBkZWVwIHBhdGhzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29iamVjdF0gVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30ga2V5IFRoZSBrZXkgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBrZXlgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VIYXNJbihvYmplY3QsIGtleSkge1xuICAgICAgcmV0dXJuIG9iamVjdCAhPSBudWxsICYmIGtleSBpbiBPYmplY3Qob2JqZWN0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pblJhbmdlYCB3aGljaCBkb2Vzbid0IGNvZXJjZSBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBudW1iZXIgVGhlIG51bWJlciB0byBjaGVjay5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gc3RhcnQgVGhlIHN0YXJ0IG9mIHRoZSByYW5nZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZW5kIFRoZSBlbmQgb2YgdGhlIHJhbmdlLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgbnVtYmVyYCBpcyBpbiB0aGUgcmFuZ2UsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlSW5SYW5nZShudW1iZXIsIHN0YXJ0LCBlbmQpIHtcbiAgICAgIHJldHVybiBudW1iZXIgPj0gbmF0aXZlTWluKHN0YXJ0LCBlbmQpICYmIG51bWJlciA8IG5hdGl2ZU1heChzdGFydCwgZW5kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBtZXRob2RzIGxpa2UgYF8uaW50ZXJzZWN0aW9uYCwgd2l0aG91dCBzdXBwb3J0XG4gICAgICogZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMsIHRoYXQgYWNjZXB0cyBhbiBhcnJheSBvZiBhcnJheXMgdG8gaW5zcGVjdC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXlzIFRoZSBhcnJheXMgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWVdIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjb21wYXJhdG9yXSBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIHNoYXJlZCB2YWx1ZXMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUludGVyc2VjdGlvbihhcnJheXMsIGl0ZXJhdGVlLCBjb21wYXJhdG9yKSB7XG4gICAgICB2YXIgaW5jbHVkZXMgPSBjb21wYXJhdG9yID8gYXJyYXlJbmNsdWRlc1dpdGggOiBhcnJheUluY2x1ZGVzLFxuICAgICAgICAgIGxlbmd0aCA9IGFycmF5c1swXS5sZW5ndGgsXG4gICAgICAgICAgb3RoTGVuZ3RoID0gYXJyYXlzLmxlbmd0aCxcbiAgICAgICAgICBvdGhJbmRleCA9IG90aExlbmd0aCxcbiAgICAgICAgICBjYWNoZXMgPSBBcnJheShvdGhMZW5ndGgpLFxuICAgICAgICAgIG1heExlbmd0aCA9IEluZmluaXR5LFxuICAgICAgICAgIHJlc3VsdCA9IFtdO1xuXG4gICAgICB3aGlsZSAob3RoSW5kZXgtLSkge1xuICAgICAgICB2YXIgYXJyYXkgPSBhcnJheXNbb3RoSW5kZXhdO1xuICAgICAgICBpZiAob3RoSW5kZXggJiYgaXRlcmF0ZWUpIHtcbiAgICAgICAgICBhcnJheSA9IGFycmF5TWFwKGFycmF5LCBiYXNlVW5hcnkoaXRlcmF0ZWUpKTtcbiAgICAgICAgfVxuICAgICAgICBtYXhMZW5ndGggPSBuYXRpdmVNaW4oYXJyYXkubGVuZ3RoLCBtYXhMZW5ndGgpO1xuICAgICAgICBjYWNoZXNbb3RoSW5kZXhdID0gIWNvbXBhcmF0b3IgJiYgKGl0ZXJhdGVlIHx8IChsZW5ndGggPj0gMTIwICYmIGFycmF5Lmxlbmd0aCA+PSAxMjApKVxuICAgICAgICAgID8gbmV3IFNldENhY2hlKG90aEluZGV4ICYmIGFycmF5KVxuICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgYXJyYXkgPSBhcnJheXNbMF07XG5cbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIHNlZW4gPSBjYWNoZXNbMF07XG5cbiAgICAgIG91dGVyOlxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGggJiYgcmVzdWx0Lmxlbmd0aCA8IG1heExlbmd0aCkge1xuICAgICAgICB2YXIgdmFsdWUgPSBhcnJheVtpbmRleF0sXG4gICAgICAgICAgICBjb21wdXRlZCA9IGl0ZXJhdGVlID8gaXRlcmF0ZWUodmFsdWUpIDogdmFsdWU7XG5cbiAgICAgICAgdmFsdWUgPSAoY29tcGFyYXRvciB8fCB2YWx1ZSAhPT0gMCkgPyB2YWx1ZSA6IDA7XG4gICAgICAgIGlmICghKHNlZW5cbiAgICAgICAgICAgICAgPyBjYWNoZUhhcyhzZWVuLCBjb21wdXRlZClcbiAgICAgICAgICAgICAgOiBpbmNsdWRlcyhyZXN1bHQsIGNvbXB1dGVkLCBjb21wYXJhdG9yKVxuICAgICAgICAgICAgKSkge1xuICAgICAgICAgIG90aEluZGV4ID0gb3RoTGVuZ3RoO1xuICAgICAgICAgIHdoaWxlICgtLW90aEluZGV4KSB7XG4gICAgICAgICAgICB2YXIgY2FjaGUgPSBjYWNoZXNbb3RoSW5kZXhdO1xuICAgICAgICAgICAgaWYgKCEoY2FjaGVcbiAgICAgICAgICAgICAgICAgID8gY2FjaGVIYXMoY2FjaGUsIGNvbXB1dGVkKVxuICAgICAgICAgICAgICAgICAgOiBpbmNsdWRlcyhhcnJheXNbb3RoSW5kZXhdLCBjb21wdXRlZCwgY29tcGFyYXRvcikpXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGNvbnRpbnVlIG91dGVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc2Vlbikge1xuICAgICAgICAgICAgc2Vlbi5wdXNoKGNvbXB1dGVkKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVzdWx0LnB1c2godmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmludmVydGAgYW5kIGBfLmludmVydEJ5YCB3aGljaCBpbnZlcnRzXG4gICAgICogYG9iamVjdGAgd2l0aCB2YWx1ZXMgdHJhbnNmb3JtZWQgYnkgYGl0ZXJhdGVlYCBhbmQgc2V0IGJ5IGBzZXR0ZXJgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHNldHRlciBUaGUgZnVuY3Rpb24gdG8gc2V0IGBhY2N1bXVsYXRvcmAgdmFsdWVzLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBpdGVyYXRlZSB0byB0cmFuc2Zvcm0gdmFsdWVzLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBhY2N1bXVsYXRvciBUaGUgaW5pdGlhbCBpbnZlcnRlZCBvYmplY3QuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIGBhY2N1bXVsYXRvcmAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUludmVydGVyKG9iamVjdCwgc2V0dGVyLCBpdGVyYXRlZSwgYWNjdW11bGF0b3IpIHtcbiAgICAgIGJhc2VGb3JPd24ob2JqZWN0LCBmdW5jdGlvbih2YWx1ZSwga2V5LCBvYmplY3QpIHtcbiAgICAgICAgc2V0dGVyKGFjY3VtdWxhdG9yLCBpdGVyYXRlZSh2YWx1ZSksIGtleSwgb2JqZWN0KTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGFjY3VtdWxhdG9yO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmludm9rZWAgd2l0aG91dCBzdXBwb3J0IGZvciBpbmRpdmlkdWFsXG4gICAgICogbWV0aG9kIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBtZXRob2QgdG8gaW52b2tlLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFyZ3MgVGhlIGFyZ3VtZW50cyB0byBpbnZva2UgdGhlIG1ldGhvZCB3aXRoLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByZXN1bHQgb2YgdGhlIGludm9rZWQgbWV0aG9kLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VJbnZva2Uob2JqZWN0LCBwYXRoLCBhcmdzKSB7XG4gICAgICBwYXRoID0gY2FzdFBhdGgocGF0aCwgb2JqZWN0KTtcbiAgICAgIG9iamVjdCA9IHBhcmVudChvYmplY3QsIHBhdGgpO1xuICAgICAgdmFyIGZ1bmMgPSBvYmplY3QgPT0gbnVsbCA/IG9iamVjdCA6IG9iamVjdFt0b0tleShsYXN0KHBhdGgpKV07XG4gICAgICByZXR1cm4gZnVuYyA9PSBudWxsID8gdW5kZWZpbmVkIDogYXBwbHkoZnVuYywgb2JqZWN0LCBhcmdzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc0FyZ3VtZW50c2AuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIGBhcmd1bWVudHNgIG9iamVjdCxcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlSXNBcmd1bWVudHModmFsdWUpIHtcbiAgICAgIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmIGJhc2VHZXRUYWcodmFsdWUpID09IGFyZ3NUYWc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNBcnJheUJ1ZmZlcmAgd2l0aG91dCBOb2RlLmpzIG9wdGltaXphdGlvbnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIGFycmF5IGJ1ZmZlciwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VJc0FycmF5QnVmZmVyKHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBiYXNlR2V0VGFnKHZhbHVlKSA9PSBhcnJheUJ1ZmZlclRhZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc0RhdGVgIHdpdGhvdXQgTm9kZS5qcyBvcHRpbWl6YXRpb25zLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIGRhdGUgb2JqZWN0LCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUlzRGF0ZSh2YWx1ZSkge1xuICAgICAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgYmFzZUdldFRhZyh2YWx1ZSkgPT0gZGF0ZVRhZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc0VxdWFsYCB3aGljaCBzdXBwb3J0cyBwYXJ0aWFsIGNvbXBhcmlzb25zXG4gICAgICogYW5kIHRyYWNrcyB0cmF2ZXJzZWQgb2JqZWN0cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0geyp9IG90aGVyIFRoZSBvdGhlciB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy5cbiAgICAgKiAgMSAtIFVub3JkZXJlZCBjb21wYXJpc29uXG4gICAgICogIDIgLSBQYXJ0aWFsIGNvbXBhcmlzb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb21wYXJpc29ucy5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW3N0YWNrXSBUcmFja3MgdHJhdmVyc2VkIGB2YWx1ZWAgYW5kIGBvdGhlcmAgb2JqZWN0cy5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHZhbHVlcyBhcmUgZXF1aXZhbGVudCwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VJc0VxdWFsKHZhbHVlLCBvdGhlciwgYml0bWFzaywgY3VzdG9taXplciwgc3RhY2spIHtcbiAgICAgIGlmICh2YWx1ZSA9PT0gb3RoZXIpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBpZiAodmFsdWUgPT0gbnVsbCB8fCBvdGhlciA9PSBudWxsIHx8ICghaXNPYmplY3RMaWtlKHZhbHVlKSAmJiAhaXNPYmplY3RMaWtlKG90aGVyKSkpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlICE9PSB2YWx1ZSAmJiBvdGhlciAhPT0gb3RoZXI7XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFzZUlzRXF1YWxEZWVwKHZhbHVlLCBvdGhlciwgYml0bWFzaywgY3VzdG9taXplciwgYmFzZUlzRXF1YWwsIHN0YWNrKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VJc0VxdWFsYCBmb3IgYXJyYXlzIGFuZCBvYmplY3RzIHdoaWNoIHBlcmZvcm1zXG4gICAgICogZGVlcCBjb21wYXJpc29ucyBhbmQgdHJhY2tzIHRyYXZlcnNlZCBvYmplY3RzIGVuYWJsaW5nIG9iamVjdHMgd2l0aCBjaXJjdWxhclxuICAgICAqIHJlZmVyZW5jZXMgdG8gYmUgY29tcGFyZWQuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvdGhlciBUaGUgb3RoZXIgb2JqZWN0IHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgYmFzZUlzRXF1YWxgIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY3VzdG9taXplciBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNvbXBhcmlzb25zLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGVxdWFsRnVuYyBUaGUgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIGVxdWl2YWxlbnRzIG9mIHZhbHVlcy5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW3N0YWNrXSBUcmFja3MgdHJhdmVyc2VkIGBvYmplY3RgIGFuZCBgb3RoZXJgIG9iamVjdHMuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBvYmplY3RzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUlzRXF1YWxEZWVwKG9iamVjdCwgb3RoZXIsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spIHtcbiAgICAgIHZhciBvYmpJc0FyciA9IGlzQXJyYXkob2JqZWN0KSxcbiAgICAgICAgICBvdGhJc0FyciA9IGlzQXJyYXkob3RoZXIpLFxuICAgICAgICAgIG9ialRhZyA9IG9iaklzQXJyID8gYXJyYXlUYWcgOiBnZXRUYWcob2JqZWN0KSxcbiAgICAgICAgICBvdGhUYWcgPSBvdGhJc0FyciA/IGFycmF5VGFnIDogZ2V0VGFnKG90aGVyKTtcblxuICAgICAgb2JqVGFnID0gb2JqVGFnID09IGFyZ3NUYWcgPyBvYmplY3RUYWcgOiBvYmpUYWc7XG4gICAgICBvdGhUYWcgPSBvdGhUYWcgPT0gYXJnc1RhZyA/IG9iamVjdFRhZyA6IG90aFRhZztcblxuICAgICAgdmFyIG9iaklzT2JqID0gb2JqVGFnID09IG9iamVjdFRhZyxcbiAgICAgICAgICBvdGhJc09iaiA9IG90aFRhZyA9PSBvYmplY3RUYWcsXG4gICAgICAgICAgaXNTYW1lVGFnID0gb2JqVGFnID09IG90aFRhZztcblxuICAgICAgaWYgKGlzU2FtZVRhZyAmJiBpc0J1ZmZlcihvYmplY3QpKSB7XG4gICAgICAgIGlmICghaXNCdWZmZXIob3RoZXIpKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIG9iaklzQXJyID0gdHJ1ZTtcbiAgICAgICAgb2JqSXNPYmogPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmIChpc1NhbWVUYWcgJiYgIW9iaklzT2JqKSB7XG4gICAgICAgIHN0YWNrIHx8IChzdGFjayA9IG5ldyBTdGFjayk7XG4gICAgICAgIHJldHVybiAob2JqSXNBcnIgfHwgaXNUeXBlZEFycmF5KG9iamVjdCkpXG4gICAgICAgICAgPyBlcXVhbEFycmF5cyhvYmplY3QsIG90aGVyLCBiaXRtYXNrLCBjdXN0b21pemVyLCBlcXVhbEZ1bmMsIHN0YWNrKVxuICAgICAgICAgIDogZXF1YWxCeVRhZyhvYmplY3QsIG90aGVyLCBvYmpUYWcsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spO1xuICAgICAgfVxuICAgICAgaWYgKCEoYml0bWFzayAmIENPTVBBUkVfUEFSVElBTF9GTEFHKSkge1xuICAgICAgICB2YXIgb2JqSXNXcmFwcGVkID0gb2JqSXNPYmogJiYgaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsICdfX3dyYXBwZWRfXycpLFxuICAgICAgICAgICAgb3RoSXNXcmFwcGVkID0gb3RoSXNPYmogJiYgaGFzT3duUHJvcGVydHkuY2FsbChvdGhlciwgJ19fd3JhcHBlZF9fJyk7XG5cbiAgICAgICAgaWYgKG9iaklzV3JhcHBlZCB8fCBvdGhJc1dyYXBwZWQpIHtcbiAgICAgICAgICB2YXIgb2JqVW53cmFwcGVkID0gb2JqSXNXcmFwcGVkID8gb2JqZWN0LnZhbHVlKCkgOiBvYmplY3QsXG4gICAgICAgICAgICAgIG90aFVud3JhcHBlZCA9IG90aElzV3JhcHBlZCA/IG90aGVyLnZhbHVlKCkgOiBvdGhlcjtcblxuICAgICAgICAgIHN0YWNrIHx8IChzdGFjayA9IG5ldyBTdGFjayk7XG4gICAgICAgICAgcmV0dXJuIGVxdWFsRnVuYyhvYmpVbndyYXBwZWQsIG90aFVud3JhcHBlZCwgYml0bWFzaywgY3VzdG9taXplciwgc3RhY2spO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIWlzU2FtZVRhZykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBzdGFjayB8fCAoc3RhY2sgPSBuZXcgU3RhY2spO1xuICAgICAgcmV0dXJuIGVxdWFsT2JqZWN0cyhvYmplY3QsIG90aGVyLCBiaXRtYXNrLCBjdXN0b21pemVyLCBlcXVhbEZ1bmMsIHN0YWNrKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc01hcGAgd2l0aG91dCBOb2RlLmpzIG9wdGltaXphdGlvbnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgbWFwLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUlzTWFwKHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBnZXRUYWcodmFsdWUpID09IG1hcFRhZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc01hdGNoYCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIG9iamVjdCBvZiBwcm9wZXJ0eSB2YWx1ZXMgdG8gbWF0Y2guXG4gICAgICogQHBhcmFtIHtBcnJheX0gbWF0Y2hEYXRhIFRoZSBwcm9wZXJ0eSBuYW1lcywgdmFsdWVzLCBhbmQgY29tcGFyZSBmbGFncyB0byBtYXRjaC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb21wYXJpc29ucy5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYG9iamVjdGAgaXMgYSBtYXRjaCwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VJc01hdGNoKG9iamVjdCwgc291cmNlLCBtYXRjaERhdGEsIGN1c3RvbWl6ZXIpIHtcbiAgICAgIHZhciBpbmRleCA9IG1hdGNoRGF0YS5sZW5ndGgsXG4gICAgICAgICAgbGVuZ3RoID0gaW5kZXgsXG4gICAgICAgICAgbm9DdXN0b21pemVyID0gIWN1c3RvbWl6ZXI7XG5cbiAgICAgIGlmIChvYmplY3QgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gIWxlbmd0aDtcbiAgICAgIH1cbiAgICAgIG9iamVjdCA9IE9iamVjdChvYmplY3QpO1xuICAgICAgd2hpbGUgKGluZGV4LS0pIHtcbiAgICAgICAgdmFyIGRhdGEgPSBtYXRjaERhdGFbaW5kZXhdO1xuICAgICAgICBpZiAoKG5vQ3VzdG9taXplciAmJiBkYXRhWzJdKVxuICAgICAgICAgICAgICA/IGRhdGFbMV0gIT09IG9iamVjdFtkYXRhWzBdXVxuICAgICAgICAgICAgICA6ICEoZGF0YVswXSBpbiBvYmplY3QpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIGRhdGEgPSBtYXRjaERhdGFbaW5kZXhdO1xuICAgICAgICB2YXIga2V5ID0gZGF0YVswXSxcbiAgICAgICAgICAgIG9ialZhbHVlID0gb2JqZWN0W2tleV0sXG4gICAgICAgICAgICBzcmNWYWx1ZSA9IGRhdGFbMV07XG5cbiAgICAgICAgaWYgKG5vQ3VzdG9taXplciAmJiBkYXRhWzJdKSB7XG4gICAgICAgICAgaWYgKG9ialZhbHVlID09PSB1bmRlZmluZWQgJiYgIShrZXkgaW4gb2JqZWN0KSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgc3RhY2sgPSBuZXcgU3RhY2s7XG4gICAgICAgICAgaWYgKGN1c3RvbWl6ZXIpIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSBjdXN0b21pemVyKG9ialZhbHVlLCBzcmNWYWx1ZSwga2V5LCBvYmplY3QsIHNvdXJjZSwgc3RhY2spO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIShyZXN1bHQgPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgID8gYmFzZUlzRXF1YWwoc3JjVmFsdWUsIG9ialZhbHVlLCBDT01QQVJFX1BBUlRJQUxfRkxBRyB8IENPTVBBUkVfVU5PUkRFUkVEX0ZMQUcsIGN1c3RvbWl6ZXIsIHN0YWNrKVxuICAgICAgICAgICAgICAgIDogcmVzdWx0XG4gICAgICAgICAgICAgICkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzTmF0aXZlYCB3aXRob3V0IGJhZCBzaGltIGNoZWNrcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBuYXRpdmUgZnVuY3Rpb24sXG4gICAgICogIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlSXNOYXRpdmUodmFsdWUpIHtcbiAgICAgIGlmICghaXNPYmplY3QodmFsdWUpIHx8IGlzTWFza2VkKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICB2YXIgcGF0dGVybiA9IGlzRnVuY3Rpb24odmFsdWUpID8gcmVJc05hdGl2ZSA6IHJlSXNIb3N0Q3RvcjtcbiAgICAgIHJldHVybiBwYXR0ZXJuLnRlc3QodG9Tb3VyY2UodmFsdWUpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc1JlZ0V4cGAgd2l0aG91dCBOb2RlLmpzIG9wdGltaXphdGlvbnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgcmVnZXhwLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUlzUmVnRXhwKHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBiYXNlR2V0VGFnKHZhbHVlKSA9PSByZWdleHBUYWc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNTZXRgIHdpdGhvdXQgTm9kZS5qcyBvcHRpbWl6YXRpb25zLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHNldCwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VJc1NldCh2YWx1ZSkge1xuICAgICAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgZ2V0VGFnKHZhbHVlKSA9PSBzZXRUYWc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNUeXBlZEFycmF5YCB3aXRob3V0IE5vZGUuanMgb3B0aW1pemF0aW9ucy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSB0eXBlZCBhcnJheSwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VJc1R5cGVkQXJyYXkodmFsdWUpIHtcbiAgICAgIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmXG4gICAgICAgIGlzTGVuZ3RoKHZhbHVlLmxlbmd0aCkgJiYgISF0eXBlZEFycmF5VGFnc1tiYXNlR2V0VGFnKHZhbHVlKV07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXRlcmF0ZWVgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IFt2YWx1ZT1fLmlkZW50aXR5XSBUaGUgdmFsdWUgdG8gY29udmVydCB0byBhbiBpdGVyYXRlZS5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIGl0ZXJhdGVlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VJdGVyYXRlZSh2YWx1ZSkge1xuICAgICAgLy8gRG9uJ3Qgc3RvcmUgdGhlIGB0eXBlb2ZgIHJlc3VsdCBpbiBhIHZhcmlhYmxlIHRvIGF2b2lkIGEgSklUIGJ1ZyBpbiBTYWZhcmkgOS5cbiAgICAgIC8vIFNlZSBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTU2MDM0IGZvciBtb3JlIGRldGFpbHMuXG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIGlkZW50aXR5O1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0Jykge1xuICAgICAgICByZXR1cm4gaXNBcnJheSh2YWx1ZSlcbiAgICAgICAgICA/IGJhc2VNYXRjaGVzUHJvcGVydHkodmFsdWVbMF0sIHZhbHVlWzFdKVxuICAgICAgICAgIDogYmFzZU1hdGNoZXModmFsdWUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHByb3BlcnR5KHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5rZXlzYCB3aGljaCBkb2Vzbid0IHRyZWF0IHNwYXJzZSBhcnJheXMgYXMgZGVuc2UuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VLZXlzKG9iamVjdCkge1xuICAgICAgaWYgKCFpc1Byb3RvdHlwZShvYmplY3QpKSB7XG4gICAgICAgIHJldHVybiBuYXRpdmVLZXlzKG9iamVjdCk7XG4gICAgICB9XG4gICAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgICBmb3IgKHZhciBrZXkgaW4gT2JqZWN0KG9iamVjdCkpIHtcbiAgICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpICYmIGtleSAhPSAnY29uc3RydWN0b3InKSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2goa2V5KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5rZXlzSW5gIHdoaWNoIGRvZXNuJ3QgdHJlYXQgc3BhcnNlIGFycmF5cyBhcyBkZW5zZS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZUtleXNJbihvYmplY3QpIHtcbiAgICAgIGlmICghaXNPYmplY3Qob2JqZWN0KSkge1xuICAgICAgICByZXR1cm4gbmF0aXZlS2V5c0luKG9iamVjdCk7XG4gICAgICB9XG4gICAgICB2YXIgaXNQcm90byA9IGlzUHJvdG90eXBlKG9iamVjdCksXG4gICAgICAgICAgcmVzdWx0ID0gW107XG5cbiAgICAgIGZvciAodmFyIGtleSBpbiBvYmplY3QpIHtcbiAgICAgICAgaWYgKCEoa2V5ID09ICdjb25zdHJ1Y3RvcicgJiYgKGlzUHJvdG8gfHwgIWhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpKSkpIHtcbiAgICAgICAgICByZXN1bHQucHVzaChrZXkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmx0YCB3aGljaCBkb2Vzbid0IGNvZXJjZSBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBsZXNzIHRoYW4gYG90aGVyYCxcbiAgICAgKiAgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VMdCh2YWx1ZSwgb3RoZXIpIHtcbiAgICAgIHJldHVybiB2YWx1ZSA8IG90aGVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLm1hcGAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBtYXBwZWQgYXJyYXkuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZU1hcChjb2xsZWN0aW9uLCBpdGVyYXRlZSkge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgcmVzdWx0ID0gaXNBcnJheUxpa2UoY29sbGVjdGlvbikgPyBBcnJheShjb2xsZWN0aW9uLmxlbmd0aCkgOiBbXTtcblxuICAgICAgYmFzZUVhY2goY29sbGVjdGlvbiwgZnVuY3Rpb24odmFsdWUsIGtleSwgY29sbGVjdGlvbikge1xuICAgICAgICByZXN1bHRbKytpbmRleF0gPSBpdGVyYXRlZSh2YWx1ZSwga2V5LCBjb2xsZWN0aW9uKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5tYXRjaGVzYCB3aGljaCBkb2Vzbid0IGNsb25lIGBzb3VyY2VgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3Qgb2YgcHJvcGVydHkgdmFsdWVzIHRvIG1hdGNoLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHNwZWMgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZU1hdGNoZXMoc291cmNlKSB7XG4gICAgICB2YXIgbWF0Y2hEYXRhID0gZ2V0TWF0Y2hEYXRhKHNvdXJjZSk7XG4gICAgICBpZiAobWF0Y2hEYXRhLmxlbmd0aCA9PSAxICYmIG1hdGNoRGF0YVswXVsyXSkge1xuICAgICAgICByZXR1cm4gbWF0Y2hlc1N0cmljdENvbXBhcmFibGUobWF0Y2hEYXRhWzBdWzBdLCBtYXRjaERhdGFbMF1bMV0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZ1bmN0aW9uKG9iamVjdCkge1xuICAgICAgICByZXR1cm4gb2JqZWN0ID09PSBzb3VyY2UgfHwgYmFzZUlzTWF0Y2gob2JqZWN0LCBzb3VyY2UsIG1hdGNoRGF0YSk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLm1hdGNoZXNQcm9wZXJ0eWAgd2hpY2ggZG9lc24ndCBjbG9uZSBgc3JjVmFsdWVgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICAgICAqIEBwYXJhbSB7Kn0gc3JjVmFsdWUgVGhlIHZhbHVlIHRvIG1hdGNoLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHNwZWMgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZU1hdGNoZXNQcm9wZXJ0eShwYXRoLCBzcmNWYWx1ZSkge1xuICAgICAgaWYgKGlzS2V5KHBhdGgpICYmIGlzU3RyaWN0Q29tcGFyYWJsZShzcmNWYWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIG1hdGNoZXNTdHJpY3RDb21wYXJhYmxlKHRvS2V5KHBhdGgpLCBzcmNWYWx1ZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgICAgIHZhciBvYmpWYWx1ZSA9IGdldChvYmplY3QsIHBhdGgpO1xuICAgICAgICByZXR1cm4gKG9ialZhbHVlID09PSB1bmRlZmluZWQgJiYgb2JqVmFsdWUgPT09IHNyY1ZhbHVlKVxuICAgICAgICAgID8gaGFzSW4ob2JqZWN0LCBwYXRoKVxuICAgICAgICAgIDogYmFzZUlzRXF1YWwoc3JjVmFsdWUsIG9ialZhbHVlLCBDT01QQVJFX1BBUlRJQUxfRkxBRyB8IENPTVBBUkVfVU5PUkRFUkVEX0ZMQUcpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5tZXJnZWAgd2l0aG91dCBzdXBwb3J0IGZvciBtdWx0aXBsZSBzb3VyY2VzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgc291cmNlIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gc3JjSW5kZXggVGhlIGluZGV4IG9mIGBzb3VyY2VgLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIG1lcmdlZCB2YWx1ZXMuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtzdGFja10gVHJhY2tzIHRyYXZlcnNlZCBzb3VyY2UgdmFsdWVzIGFuZCB0aGVpciBtZXJnZWRcbiAgICAgKiAgY291bnRlcnBhcnRzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VNZXJnZShvYmplY3QsIHNvdXJjZSwgc3JjSW5kZXgsIGN1c3RvbWl6ZXIsIHN0YWNrKSB7XG4gICAgICBpZiAob2JqZWN0ID09PSBzb3VyY2UpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgYmFzZUZvcihzb3VyY2UsIGZ1bmN0aW9uKHNyY1ZhbHVlLCBrZXkpIHtcbiAgICAgICAgc3RhY2sgfHwgKHN0YWNrID0gbmV3IFN0YWNrKTtcbiAgICAgICAgaWYgKGlzT2JqZWN0KHNyY1ZhbHVlKSkge1xuICAgICAgICAgIGJhc2VNZXJnZURlZXAob2JqZWN0LCBzb3VyY2UsIGtleSwgc3JjSW5kZXgsIGJhc2VNZXJnZSwgY3VzdG9taXplciwgc3RhY2spO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIHZhciBuZXdWYWx1ZSA9IGN1c3RvbWl6ZXJcbiAgICAgICAgICAgID8gY3VzdG9taXplcihzYWZlR2V0KG9iamVjdCwga2V5KSwgc3JjVmFsdWUsIChrZXkgKyAnJyksIG9iamVjdCwgc291cmNlLCBzdGFjaylcbiAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICAgICAgaWYgKG5ld1ZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG5ld1ZhbHVlID0gc3JjVmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGFzc2lnbk1lcmdlVmFsdWUob2JqZWN0LCBrZXksIG5ld1ZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSwga2V5c0luKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VNZXJnZWAgZm9yIGFycmF5cyBhbmQgb2JqZWN0cyB3aGljaCBwZXJmb3Jtc1xuICAgICAqIGRlZXAgbWVyZ2VzIGFuZCB0cmFja3MgdHJhdmVyc2VkIG9iamVjdHMgZW5hYmxpbmcgb2JqZWN0cyB3aXRoIGNpcmN1bGFyXG4gICAgICogcmVmZXJlbmNlcyB0byBiZSBtZXJnZWQuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBzb3VyY2Ugb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gbWVyZ2UuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHNyY0luZGV4IFRoZSBpbmRleCBvZiBgc291cmNlYC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBtZXJnZUZ1bmMgVGhlIGZ1bmN0aW9uIHRvIG1lcmdlIHZhbHVlcy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBhc3NpZ25lZCB2YWx1ZXMuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtzdGFja10gVHJhY2tzIHRyYXZlcnNlZCBzb3VyY2UgdmFsdWVzIGFuZCB0aGVpciBtZXJnZWRcbiAgICAgKiAgY291bnRlcnBhcnRzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VNZXJnZURlZXAob2JqZWN0LCBzb3VyY2UsIGtleSwgc3JjSW5kZXgsIG1lcmdlRnVuYywgY3VzdG9taXplciwgc3RhY2spIHtcbiAgICAgIHZhciBvYmpWYWx1ZSA9IHNhZmVHZXQob2JqZWN0LCBrZXkpLFxuICAgICAgICAgIHNyY1ZhbHVlID0gc2FmZUdldChzb3VyY2UsIGtleSksXG4gICAgICAgICAgc3RhY2tlZCA9IHN0YWNrLmdldChzcmNWYWx1ZSk7XG5cbiAgICAgIGlmIChzdGFja2VkKSB7XG4gICAgICAgIGFzc2lnbk1lcmdlVmFsdWUob2JqZWN0LCBrZXksIHN0YWNrZWQpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB2YXIgbmV3VmFsdWUgPSBjdXN0b21pemVyXG4gICAgICAgID8gY3VzdG9taXplcihvYmpWYWx1ZSwgc3JjVmFsdWUsIChrZXkgKyAnJyksIG9iamVjdCwgc291cmNlLCBzdGFjaylcbiAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAgIHZhciBpc0NvbW1vbiA9IG5ld1ZhbHVlID09PSB1bmRlZmluZWQ7XG5cbiAgICAgIGlmIChpc0NvbW1vbikge1xuICAgICAgICB2YXIgaXNBcnIgPSBpc0FycmF5KHNyY1ZhbHVlKSxcbiAgICAgICAgICAgIGlzQnVmZiA9ICFpc0FyciAmJiBpc0J1ZmZlcihzcmNWYWx1ZSksXG4gICAgICAgICAgICBpc1R5cGVkID0gIWlzQXJyICYmICFpc0J1ZmYgJiYgaXNUeXBlZEFycmF5KHNyY1ZhbHVlKTtcblxuICAgICAgICBuZXdWYWx1ZSA9IHNyY1ZhbHVlO1xuICAgICAgICBpZiAoaXNBcnIgfHwgaXNCdWZmIHx8IGlzVHlwZWQpIHtcbiAgICAgICAgICBpZiAoaXNBcnJheShvYmpWYWx1ZSkpIHtcbiAgICAgICAgICAgIG5ld1ZhbHVlID0gb2JqVmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2UgaWYgKGlzQXJyYXlMaWtlT2JqZWN0KG9ialZhbHVlKSkge1xuICAgICAgICAgICAgbmV3VmFsdWUgPSBjb3B5QXJyYXkob2JqVmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIGlmIChpc0J1ZmYpIHtcbiAgICAgICAgICAgIGlzQ29tbW9uID0gZmFsc2U7XG4gICAgICAgICAgICBuZXdWYWx1ZSA9IGNsb25lQnVmZmVyKHNyY1ZhbHVlLCB0cnVlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSBpZiAoaXNUeXBlZCkge1xuICAgICAgICAgICAgaXNDb21tb24gPSBmYWxzZTtcbiAgICAgICAgICAgIG5ld1ZhbHVlID0gY2xvbmVUeXBlZEFycmF5KHNyY1ZhbHVlLCB0cnVlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBuZXdWYWx1ZSA9IFtdO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc1BsYWluT2JqZWN0KHNyY1ZhbHVlKSB8fCBpc0FyZ3VtZW50cyhzcmNWYWx1ZSkpIHtcbiAgICAgICAgICBuZXdWYWx1ZSA9IG9ialZhbHVlO1xuICAgICAgICAgIGlmIChpc0FyZ3VtZW50cyhvYmpWYWx1ZSkpIHtcbiAgICAgICAgICAgIG5ld1ZhbHVlID0gdG9QbGFpbk9iamVjdChvYmpWYWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2UgaWYgKCFpc09iamVjdChvYmpWYWx1ZSkgfHwgaXNGdW5jdGlvbihvYmpWYWx1ZSkpIHtcbiAgICAgICAgICAgIG5ld1ZhbHVlID0gaW5pdENsb25lT2JqZWN0KHNyY1ZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgaXNDb21tb24gPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGlzQ29tbW9uKSB7XG4gICAgICAgIC8vIFJlY3Vyc2l2ZWx5IG1lcmdlIG9iamVjdHMgYW5kIGFycmF5cyAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLlxuICAgICAgICBzdGFjay5zZXQoc3JjVmFsdWUsIG5ld1ZhbHVlKTtcbiAgICAgICAgbWVyZ2VGdW5jKG5ld1ZhbHVlLCBzcmNWYWx1ZSwgc3JjSW5kZXgsIGN1c3RvbWl6ZXIsIHN0YWNrKTtcbiAgICAgICAgc3RhY2tbJ2RlbGV0ZSddKHNyY1ZhbHVlKTtcbiAgICAgIH1cbiAgICAgIGFzc2lnbk1lcmdlVmFsdWUob2JqZWN0LCBrZXksIG5ld1ZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5udGhgIHdoaWNoIGRvZXNuJ3QgY29lcmNlIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBuIFRoZSBpbmRleCBvZiB0aGUgZWxlbWVudCB0byByZXR1cm4uXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIG50aCBlbGVtZW50IG9mIGBhcnJheWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZU50aChhcnJheSwgbikge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcbiAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIG4gKz0gbiA8IDAgPyBsZW5ndGggOiAwO1xuICAgICAgcmV0dXJuIGlzSW5kZXgobiwgbGVuZ3RoKSA/IGFycmF5W25dIDogdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLm9yZGVyQnlgIHdpdGhvdXQgcGFyYW0gZ3VhcmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbltdfE9iamVjdFtdfHN0cmluZ1tdfSBpdGVyYXRlZXMgVGhlIGl0ZXJhdGVlcyB0byBzb3J0IGJ5LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nW119IG9yZGVycyBUaGUgc29ydCBvcmRlcnMgb2YgYGl0ZXJhdGVlc2AuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgc29ydGVkIGFycmF5LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VPcmRlckJ5KGNvbGxlY3Rpb24sIGl0ZXJhdGVlcywgb3JkZXJzKSB7XG4gICAgICBpZiAoaXRlcmF0ZWVzLmxlbmd0aCkge1xuICAgICAgICBpdGVyYXRlZXMgPSBhcnJheU1hcChpdGVyYXRlZXMsIGZ1bmN0aW9uKGl0ZXJhdGVlKSB7XG4gICAgICAgICAgaWYgKGlzQXJyYXkoaXRlcmF0ZWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGJhc2VHZXQodmFsdWUsIGl0ZXJhdGVlLmxlbmd0aCA9PT0gMSA/IGl0ZXJhdGVlWzBdIDogaXRlcmF0ZWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gaXRlcmF0ZWU7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaXRlcmF0ZWVzID0gW2lkZW50aXR5XTtcbiAgICAgIH1cblxuICAgICAgdmFyIGluZGV4ID0gLTE7XG4gICAgICBpdGVyYXRlZXMgPSBhcnJheU1hcChpdGVyYXRlZXMsIGJhc2VVbmFyeShnZXRJdGVyYXRlZSgpKSk7XG5cbiAgICAgIHZhciByZXN1bHQgPSBiYXNlTWFwKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBrZXksIGNvbGxlY3Rpb24pIHtcbiAgICAgICAgdmFyIGNyaXRlcmlhID0gYXJyYXlNYXAoaXRlcmF0ZWVzLCBmdW5jdGlvbihpdGVyYXRlZSkge1xuICAgICAgICAgIHJldHVybiBpdGVyYXRlZSh2YWx1ZSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4geyAnY3JpdGVyaWEnOiBjcml0ZXJpYSwgJ2luZGV4JzogKytpbmRleCwgJ3ZhbHVlJzogdmFsdWUgfTtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gYmFzZVNvcnRCeShyZXN1bHQsIGZ1bmN0aW9uKG9iamVjdCwgb3RoZXIpIHtcbiAgICAgICAgcmV0dXJuIGNvbXBhcmVNdWx0aXBsZShvYmplY3QsIG90aGVyLCBvcmRlcnMpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ucGlja2Agd2l0aG91dCBzdXBwb3J0IGZvciBpbmRpdmlkdWFsXG4gICAgICogcHJvcGVydHkgaWRlbnRpZmllcnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIHNvdXJjZSBvYmplY3QuXG4gICAgICogQHBhcmFtIHtzdHJpbmdbXX0gcGF0aHMgVGhlIHByb3BlcnR5IHBhdGhzIHRvIHBpY2suXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlUGljayhvYmplY3QsIHBhdGhzKSB7XG4gICAgICByZXR1cm4gYmFzZVBpY2tCeShvYmplY3QsIHBhdGhzLCBmdW5jdGlvbih2YWx1ZSwgcGF0aCkge1xuICAgICAgICByZXR1cm4gaGFzSW4ob2JqZWN0LCBwYXRoKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mICBgXy5waWNrQnlgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgc291cmNlIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBwYXRocyBUaGUgcHJvcGVydHkgcGF0aHMgdG8gcGljay5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIHByb3BlcnR5LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVBpY2tCeShvYmplY3QsIHBhdGhzLCBwcmVkaWNhdGUpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IHBhdGhzLmxlbmd0aCxcbiAgICAgICAgICByZXN1bHQgPSB7fTtcblxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIHBhdGggPSBwYXRoc1tpbmRleF0sXG4gICAgICAgICAgICB2YWx1ZSA9IGJhc2VHZXQob2JqZWN0LCBwYXRoKTtcblxuICAgICAgICBpZiAocHJlZGljYXRlKHZhbHVlLCBwYXRoKSkge1xuICAgICAgICAgIGJhc2VTZXQocmVzdWx0LCBjYXN0UGF0aChwYXRoLCBvYmplY3QpLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlUHJvcGVydHlgIHdoaWNoIHN1cHBvcnRzIGRlZXAgcGF0aHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYWNjZXNzb3IgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVByb3BlcnR5RGVlcChwYXRoKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgICAgIHJldHVybiBiYXNlR2V0KG9iamVjdCwgcGF0aCk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnB1bGxBbGxCeWAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZVxuICAgICAqIHNob3J0aGFuZHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtBcnJheX0gdmFsdWVzIFRoZSB2YWx1ZXMgdG8gcmVtb3ZlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NvbXBhcmF0b3JdIFRoZSBjb21wYXJhdG9yIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVB1bGxBbGwoYXJyYXksIHZhbHVlcywgaXRlcmF0ZWUsIGNvbXBhcmF0b3IpIHtcbiAgICAgIHZhciBpbmRleE9mID0gY29tcGFyYXRvciA/IGJhc2VJbmRleE9mV2l0aCA6IGJhc2VJbmRleE9mLFxuICAgICAgICAgIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gdmFsdWVzLmxlbmd0aCxcbiAgICAgICAgICBzZWVuID0gYXJyYXk7XG5cbiAgICAgIGlmIChhcnJheSA9PT0gdmFsdWVzKSB7XG4gICAgICAgIHZhbHVlcyA9IGNvcHlBcnJheSh2YWx1ZXMpO1xuICAgICAgfVxuICAgICAgaWYgKGl0ZXJhdGVlKSB7XG4gICAgICAgIHNlZW4gPSBhcnJheU1hcChhcnJheSwgYmFzZVVuYXJ5KGl0ZXJhdGVlKSk7XG4gICAgICB9XG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgZnJvbUluZGV4ID0gMCxcbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWVzW2luZGV4XSxcbiAgICAgICAgICAgIGNvbXB1dGVkID0gaXRlcmF0ZWUgPyBpdGVyYXRlZSh2YWx1ZSkgOiB2YWx1ZTtcblxuICAgICAgICB3aGlsZSAoKGZyb21JbmRleCA9IGluZGV4T2Yoc2VlbiwgY29tcHV0ZWQsIGZyb21JbmRleCwgY29tcGFyYXRvcikpID4gLTEpIHtcbiAgICAgICAgICBpZiAoc2VlbiAhPT0gYXJyYXkpIHtcbiAgICAgICAgICAgIHNwbGljZS5jYWxsKHNlZW4sIGZyb21JbmRleCwgMSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHNwbGljZS5jYWxsKGFycmF5LCBmcm9tSW5kZXgsIDEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gYXJyYXk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ucHVsbEF0YCB3aXRob3V0IHN1cHBvcnQgZm9yIGluZGl2aWR1YWxcbiAgICAgKiBpbmRleGVzIG9yIGNhcHR1cmluZyB0aGUgcmVtb3ZlZCBlbGVtZW50cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge251bWJlcltdfSBpbmRleGVzIFRoZSBpbmRleGVzIG9mIGVsZW1lbnRzIHRvIHJlbW92ZS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlUHVsbEF0KGFycmF5LCBpbmRleGVzKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPyBpbmRleGVzLmxlbmd0aCA6IDAsXG4gICAgICAgICAgbGFzdEluZGV4ID0gbGVuZ3RoIC0gMTtcblxuICAgICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICAgIHZhciBpbmRleCA9IGluZGV4ZXNbbGVuZ3RoXTtcbiAgICAgICAgaWYgKGxlbmd0aCA9PSBsYXN0SW5kZXggfHwgaW5kZXggIT09IHByZXZpb3VzKSB7XG4gICAgICAgICAgdmFyIHByZXZpb3VzID0gaW5kZXg7XG4gICAgICAgICAgaWYgKGlzSW5kZXgoaW5kZXgpKSB7XG4gICAgICAgICAgICBzcGxpY2UuY2FsbChhcnJheSwgaW5kZXgsIDEpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBiYXNlVW5zZXQoYXJyYXksIGluZGV4KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBhcnJheTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5yYW5kb21gIHdpdGhvdXQgc3VwcG9ydCBmb3IgcmV0dXJuaW5nXG4gICAgICogZmxvYXRpbmctcG9pbnQgbnVtYmVycy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGxvd2VyIFRoZSBsb3dlciBib3VuZC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdXBwZXIgVGhlIHVwcGVyIGJvdW5kLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHJhbmRvbSBudW1iZXIuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVJhbmRvbShsb3dlciwgdXBwZXIpIHtcbiAgICAgIHJldHVybiBsb3dlciArIG5hdGl2ZUZsb29yKG5hdGl2ZVJhbmRvbSgpICogKHVwcGVyIC0gbG93ZXIgKyAxKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ucmFuZ2VgIGFuZCBgXy5yYW5nZVJpZ2h0YCB3aGljaCBkb2Vzbid0XG4gICAgICogY29lcmNlIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0IFRoZSBzdGFydCBvZiB0aGUgcmFuZ2UuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGVuZCBUaGUgZW5kIG9mIHRoZSByYW5nZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gc3RlcCBUaGUgdmFsdWUgdG8gaW5jcmVtZW50IG9yIGRlY3JlbWVudCBieS5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtmcm9tUmlnaHRdIFNwZWNpZnkgaXRlcmF0aW5nIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHJhbmdlIG9mIG51bWJlcnMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVJhbmdlKHN0YXJ0LCBlbmQsIHN0ZXAsIGZyb21SaWdodCkge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gbmF0aXZlTWF4KG5hdGl2ZUNlaWwoKGVuZCAtIHN0YXJ0KSAvIChzdGVwIHx8IDEpKSwgMCksXG4gICAgICAgICAgcmVzdWx0ID0gQXJyYXkobGVuZ3RoKTtcblxuICAgICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICAgIHJlc3VsdFtmcm9tUmlnaHQgPyBsZW5ndGggOiArK2luZGV4XSA9IHN0YXJ0O1xuICAgICAgICBzdGFydCArPSBzdGVwO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5yZXBlYXRgIHdoaWNoIGRvZXNuJ3QgY29lcmNlIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIHJlcGVhdC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRvIHJlcGVhdCB0aGUgc3RyaW5nLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHJlcGVhdGVkIHN0cmluZy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlUmVwZWF0KHN0cmluZywgbikge1xuICAgICAgdmFyIHJlc3VsdCA9ICcnO1xuICAgICAgaWYgKCFzdHJpbmcgfHwgbiA8IDEgfHwgbiA+IE1BWF9TQUZFX0lOVEVHRVIpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICAgIC8vIExldmVyYWdlIHRoZSBleHBvbmVudGlhdGlvbiBieSBzcXVhcmluZyBhbGdvcml0aG0gZm9yIGEgZmFzdGVyIHJlcGVhdC5cbiAgICAgIC8vIFNlZSBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9FeHBvbmVudGlhdGlvbl9ieV9zcXVhcmluZyBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAgZG8ge1xuICAgICAgICBpZiAobiAlIDIpIHtcbiAgICAgICAgICByZXN1bHQgKz0gc3RyaW5nO1xuICAgICAgICB9XG4gICAgICAgIG4gPSBuYXRpdmVGbG9vcihuIC8gMik7XG4gICAgICAgIGlmIChuKSB7XG4gICAgICAgICAgc3RyaW5nICs9IHN0cmluZztcbiAgICAgICAgfVxuICAgICAgfSB3aGlsZSAobik7XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ucmVzdGAgd2hpY2ggZG9lc24ndCB2YWxpZGF0ZSBvciBjb2VyY2UgYXJndW1lbnRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBhcHBseSBhIHJlc3QgcGFyYW1ldGVyIHRvLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9ZnVuYy5sZW5ndGgtMV0gVGhlIHN0YXJ0IHBvc2l0aW9uIG9mIHRoZSByZXN0IHBhcmFtZXRlci5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlUmVzdChmdW5jLCBzdGFydCkge1xuICAgICAgcmV0dXJuIHNldFRvU3RyaW5nKG92ZXJSZXN0KGZ1bmMsIHN0YXJ0LCBpZGVudGl0eSksIGZ1bmMgKyAnJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uc2FtcGxlYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gc2FtcGxlLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByYW5kb20gZWxlbWVudC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlU2FtcGxlKGNvbGxlY3Rpb24pIHtcbiAgICAgIHJldHVybiBhcnJheVNhbXBsZSh2YWx1ZXMoY29sbGVjdGlvbikpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnNhbXBsZVNpemVgIHdpdGhvdXQgcGFyYW0gZ3VhcmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBzYW1wbGUuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG4gVGhlIG51bWJlciBvZiBlbGVtZW50cyB0byBzYW1wbGUuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSByYW5kb20gZWxlbWVudHMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVNhbXBsZVNpemUoY29sbGVjdGlvbiwgbikge1xuICAgICAgdmFyIGFycmF5ID0gdmFsdWVzKGNvbGxlY3Rpb24pO1xuICAgICAgcmV0dXJuIHNodWZmbGVTZWxmKGFycmF5LCBiYXNlQ2xhbXAobiwgMCwgYXJyYXkubGVuZ3RoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uc2V0YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gc2V0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBwYXRoIGNyZWF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVNldChvYmplY3QsIHBhdGgsIHZhbHVlLCBjdXN0b21pemVyKSB7XG4gICAgICBpZiAoIWlzT2JqZWN0KG9iamVjdCkpIHtcbiAgICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICAgIH1cbiAgICAgIHBhdGggPSBjYXN0UGF0aChwYXRoLCBvYmplY3QpO1xuXG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBwYXRoLmxlbmd0aCxcbiAgICAgICAgICBsYXN0SW5kZXggPSBsZW5ndGggLSAxLFxuICAgICAgICAgIG5lc3RlZCA9IG9iamVjdDtcblxuICAgICAgd2hpbGUgKG5lc3RlZCAhPSBudWxsICYmICsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIGtleSA9IHRvS2V5KHBhdGhbaW5kZXhdKSxcbiAgICAgICAgICAgIG5ld1ZhbHVlID0gdmFsdWU7XG5cbiAgICAgICAgaWYgKGtleSA9PT0gJ19fcHJvdG9fXycgfHwga2V5ID09PSAnY29uc3RydWN0b3InIHx8IGtleSA9PT0gJ3Byb3RvdHlwZScpIHtcbiAgICAgICAgICByZXR1cm4gb2JqZWN0O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGluZGV4ICE9IGxhc3RJbmRleCkge1xuICAgICAgICAgIHZhciBvYmpWYWx1ZSA9IG5lc3RlZFtrZXldO1xuICAgICAgICAgIG5ld1ZhbHVlID0gY3VzdG9taXplciA/IGN1c3RvbWl6ZXIob2JqVmFsdWUsIGtleSwgbmVzdGVkKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICBpZiAobmV3VmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbmV3VmFsdWUgPSBpc09iamVjdChvYmpWYWx1ZSlcbiAgICAgICAgICAgICAgPyBvYmpWYWx1ZVxuICAgICAgICAgICAgICA6IChpc0luZGV4KHBhdGhbaW5kZXggKyAxXSkgPyBbXSA6IHt9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYXNzaWduVmFsdWUobmVzdGVkLCBrZXksIG5ld1ZhbHVlKTtcbiAgICAgICAgbmVzdGVkID0gbmVzdGVkW2tleV07XG4gICAgICB9XG4gICAgICByZXR1cm4gb2JqZWN0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBzZXREYXRhYCB3aXRob3V0IHN1cHBvcnQgZm9yIGhvdCBsb29wIHNob3J0aW5nLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBhc3NvY2lhdGUgbWV0YWRhdGEgd2l0aC5cbiAgICAgKiBAcGFyYW0geyp9IGRhdGEgVGhlIG1ldGFkYXRhLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyBgZnVuY2AuXG4gICAgICovXG4gICAgdmFyIGJhc2VTZXREYXRhID0gIW1ldGFNYXAgPyBpZGVudGl0eSA6IGZ1bmN0aW9uKGZ1bmMsIGRhdGEpIHtcbiAgICAgIG1ldGFNYXAuc2V0KGZ1bmMsIGRhdGEpO1xuICAgICAgcmV0dXJuIGZ1bmM7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBzZXRUb1N0cmluZ2Agd2l0aG91dCBzdXBwb3J0IGZvciBob3QgbG9vcCBzaG9ydGluZy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHN0cmluZyBUaGUgYHRvU3RyaW5nYCByZXN1bHQuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIGBmdW5jYC5cbiAgICAgKi9cbiAgICB2YXIgYmFzZVNldFRvU3RyaW5nID0gIWRlZmluZVByb3BlcnR5ID8gaWRlbnRpdHkgOiBmdW5jdGlvbihmdW5jLCBzdHJpbmcpIHtcbiAgICAgIHJldHVybiBkZWZpbmVQcm9wZXJ0eShmdW5jLCAndG9TdHJpbmcnLCB7XG4gICAgICAgICdjb25maWd1cmFibGUnOiB0cnVlLFxuICAgICAgICAnZW51bWVyYWJsZSc6IGZhbHNlLFxuICAgICAgICAndmFsdWUnOiBjb25zdGFudChzdHJpbmcpLFxuICAgICAgICAnd3JpdGFibGUnOiB0cnVlXG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uc2h1ZmZsZWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIHNodWZmbGUuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgc2h1ZmZsZWQgYXJyYXkuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVNodWZmbGUoY29sbGVjdGlvbikge1xuICAgICAgcmV0dXJuIHNodWZmbGVTZWxmKHZhbHVlcyhjb2xsZWN0aW9uKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uc2xpY2VgIHdpdGhvdXQgYW4gaXRlcmF0ZWUgY2FsbCBndWFyZC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHNsaWNlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9MF0gVGhlIHN0YXJ0IHBvc2l0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZW5kPWFycmF5Lmxlbmd0aF0gVGhlIGVuZCBwb3NpdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHNsaWNlIG9mIGBhcnJheWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVNsaWNlKGFycmF5LCBzdGFydCwgZW5kKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG5cbiAgICAgIGlmIChzdGFydCA8IDApIHtcbiAgICAgICAgc3RhcnQgPSAtc3RhcnQgPiBsZW5ndGggPyAwIDogKGxlbmd0aCArIHN0YXJ0KTtcbiAgICAgIH1cbiAgICAgIGVuZCA9IGVuZCA+IGxlbmd0aCA/IGxlbmd0aCA6IGVuZDtcbiAgICAgIGlmIChlbmQgPCAwKSB7XG4gICAgICAgIGVuZCArPSBsZW5ndGg7XG4gICAgICB9XG4gICAgICBsZW5ndGggPSBzdGFydCA+IGVuZCA/IDAgOiAoKGVuZCAtIHN0YXJ0KSA+Pj4gMCk7XG4gICAgICBzdGFydCA+Pj49IDA7XG5cbiAgICAgIHZhciByZXN1bHQgPSBBcnJheShsZW5ndGgpO1xuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgcmVzdWx0W2luZGV4XSA9IGFycmF5W2luZGV4ICsgc3RhcnRdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5zb21lYCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW55IGVsZW1lbnQgcGFzc2VzIHRoZSBwcmVkaWNhdGUgY2hlY2ssXG4gICAgICogIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlU29tZShjb2xsZWN0aW9uLCBwcmVkaWNhdGUpIHtcbiAgICAgIHZhciByZXN1bHQ7XG5cbiAgICAgIGJhc2VFYWNoKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbikge1xuICAgICAgICByZXN1bHQgPSBwcmVkaWNhdGUodmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKTtcbiAgICAgICAgcmV0dXJuICFyZXN1bHQ7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiAhIXJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5zb3J0ZWRJbmRleGAgYW5kIGBfLnNvcnRlZExhc3RJbmRleGAgd2hpY2hcbiAgICAgKiBwZXJmb3JtcyBhIGJpbmFyeSBzZWFyY2ggb2YgYGFycmF5YCB0byBkZXRlcm1pbmUgdGhlIGluZGV4IGF0IHdoaWNoIGB2YWx1ZWBcbiAgICAgKiBzaG91bGQgYmUgaW5zZXJ0ZWQgaW50byBgYXJyYXlgIGluIG9yZGVyIHRvIG1haW50YWluIGl0cyBzb3J0IG9yZGVyLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgc29ydGVkIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gZXZhbHVhdGUuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbcmV0SGlnaGVzdF0gU3BlY2lmeSByZXR1cm5pbmcgdGhlIGhpZ2hlc3QgcXVhbGlmaWVkIGluZGV4LlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IGF0IHdoaWNoIGB2YWx1ZWAgc2hvdWxkIGJlIGluc2VydGVkXG4gICAgICogIGludG8gYGFycmF5YC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlU29ydGVkSW5kZXgoYXJyYXksIHZhbHVlLCByZXRIaWdoZXN0KSB7XG4gICAgICB2YXIgbG93ID0gMCxcbiAgICAgICAgICBoaWdoID0gYXJyYXkgPT0gbnVsbCA/IGxvdyA6IGFycmF5Lmxlbmd0aDtcblxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnbnVtYmVyJyAmJiB2YWx1ZSA9PT0gdmFsdWUgJiYgaGlnaCA8PSBIQUxGX01BWF9BUlJBWV9MRU5HVEgpIHtcbiAgICAgICAgd2hpbGUgKGxvdyA8IGhpZ2gpIHtcbiAgICAgICAgICB2YXIgbWlkID0gKGxvdyArIGhpZ2gpID4+PiAxLFxuICAgICAgICAgICAgICBjb21wdXRlZCA9IGFycmF5W21pZF07XG5cbiAgICAgICAgICBpZiAoY29tcHV0ZWQgIT09IG51bGwgJiYgIWlzU3ltYm9sKGNvbXB1dGVkKSAmJlxuICAgICAgICAgICAgICAocmV0SGlnaGVzdCA/IChjb21wdXRlZCA8PSB2YWx1ZSkgOiAoY29tcHV0ZWQgPCB2YWx1ZSkpKSB7XG4gICAgICAgICAgICBsb3cgPSBtaWQgKyAxO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBoaWdoID0gbWlkO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaGlnaDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBiYXNlU29ydGVkSW5kZXhCeShhcnJheSwgdmFsdWUsIGlkZW50aXR5LCByZXRIaWdoZXN0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5zb3J0ZWRJbmRleEJ5YCBhbmQgYF8uc29ydGVkTGFzdEluZGV4QnlgXG4gICAgICogd2hpY2ggaW52b2tlcyBgaXRlcmF0ZWVgIGZvciBgdmFsdWVgIGFuZCBlYWNoIGVsZW1lbnQgb2YgYGFycmF5YCB0byBjb21wdXRlXG4gICAgICogdGhlaXIgc29ydCByYW5raW5nLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDsgKHZhbHVlKS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIHNvcnRlZCBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGV2YWx1YXRlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3JldEhpZ2hlc3RdIFNwZWNpZnkgcmV0dXJuaW5nIHRoZSBoaWdoZXN0IHF1YWxpZmllZCBpbmRleC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBhdCB3aGljaCBgdmFsdWVgIHNob3VsZCBiZSBpbnNlcnRlZFxuICAgICAqICBpbnRvIGBhcnJheWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVNvcnRlZEluZGV4QnkoYXJyYXksIHZhbHVlLCBpdGVyYXRlZSwgcmV0SGlnaGVzdCkge1xuICAgICAgdmFyIGxvdyA9IDAsXG4gICAgICAgICAgaGlnaCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgICAgaWYgKGhpZ2ggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9XG5cbiAgICAgIHZhbHVlID0gaXRlcmF0ZWUodmFsdWUpO1xuICAgICAgdmFyIHZhbElzTmFOID0gdmFsdWUgIT09IHZhbHVlLFxuICAgICAgICAgIHZhbElzTnVsbCA9IHZhbHVlID09PSBudWxsLFxuICAgICAgICAgIHZhbElzU3ltYm9sID0gaXNTeW1ib2wodmFsdWUpLFxuICAgICAgICAgIHZhbElzVW5kZWZpbmVkID0gdmFsdWUgPT09IHVuZGVmaW5lZDtcblxuICAgICAgd2hpbGUgKGxvdyA8IGhpZ2gpIHtcbiAgICAgICAgdmFyIG1pZCA9IG5hdGl2ZUZsb29yKChsb3cgKyBoaWdoKSAvIDIpLFxuICAgICAgICAgICAgY29tcHV0ZWQgPSBpdGVyYXRlZShhcnJheVttaWRdKSxcbiAgICAgICAgICAgIG90aElzRGVmaW5lZCA9IGNvbXB1dGVkICE9PSB1bmRlZmluZWQsXG4gICAgICAgICAgICBvdGhJc051bGwgPSBjb21wdXRlZCA9PT0gbnVsbCxcbiAgICAgICAgICAgIG90aElzUmVmbGV4aXZlID0gY29tcHV0ZWQgPT09IGNvbXB1dGVkLFxuICAgICAgICAgICAgb3RoSXNTeW1ib2wgPSBpc1N5bWJvbChjb21wdXRlZCk7XG5cbiAgICAgICAgaWYgKHZhbElzTmFOKSB7XG4gICAgICAgICAgdmFyIHNldExvdyA9IHJldEhpZ2hlc3QgfHwgb3RoSXNSZWZsZXhpdmU7XG4gICAgICAgIH0gZWxzZSBpZiAodmFsSXNVbmRlZmluZWQpIHtcbiAgICAgICAgICBzZXRMb3cgPSBvdGhJc1JlZmxleGl2ZSAmJiAocmV0SGlnaGVzdCB8fCBvdGhJc0RlZmluZWQpO1xuICAgICAgICB9IGVsc2UgaWYgKHZhbElzTnVsbCkge1xuICAgICAgICAgIHNldExvdyA9IG90aElzUmVmbGV4aXZlICYmIG90aElzRGVmaW5lZCAmJiAocmV0SGlnaGVzdCB8fCAhb3RoSXNOdWxsKTtcbiAgICAgICAgfSBlbHNlIGlmICh2YWxJc1N5bWJvbCkge1xuICAgICAgICAgIHNldExvdyA9IG90aElzUmVmbGV4aXZlICYmIG90aElzRGVmaW5lZCAmJiAhb3RoSXNOdWxsICYmIChyZXRIaWdoZXN0IHx8ICFvdGhJc1N5bWJvbCk7XG4gICAgICAgIH0gZWxzZSBpZiAob3RoSXNOdWxsIHx8IG90aElzU3ltYm9sKSB7XG4gICAgICAgICAgc2V0TG93ID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2V0TG93ID0gcmV0SGlnaGVzdCA/IChjb21wdXRlZCA8PSB2YWx1ZSkgOiAoY29tcHV0ZWQgPCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNldExvdykge1xuICAgICAgICAgIGxvdyA9IG1pZCArIDE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaGlnaCA9IG1pZDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG5hdGl2ZU1pbihoaWdoLCBNQVhfQVJSQVlfSU5ERVgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnNvcnRlZFVuaXFgIGFuZCBgXy5zb3J0ZWRVbmlxQnlgIHdpdGhvdXRcbiAgICAgKiBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWVdIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGR1cGxpY2F0ZSBmcmVlIGFycmF5LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VTb3J0ZWRVbmlxKGFycmF5LCBpdGVyYXRlZSkge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgICAgIHJlc0luZGV4ID0gMCxcbiAgICAgICAgICByZXN1bHQgPSBbXTtcblxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdLFxuICAgICAgICAgICAgY29tcHV0ZWQgPSBpdGVyYXRlZSA/IGl0ZXJhdGVlKHZhbHVlKSA6IHZhbHVlO1xuXG4gICAgICAgIGlmICghaW5kZXggfHwgIWVxKGNvbXB1dGVkLCBzZWVuKSkge1xuICAgICAgICAgIHZhciBzZWVuID0gY29tcHV0ZWQ7XG4gICAgICAgICAgcmVzdWx0W3Jlc0luZGV4KytdID0gdmFsdWUgPT09IDAgPyAwIDogdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udG9OdW1iZXJgIHdoaWNoIGRvZXNuJ3QgZW5zdXJlIGNvcnJlY3RcbiAgICAgKiBjb252ZXJzaW9ucyBvZiBiaW5hcnksIGhleGFkZWNpbWFsLCBvciBvY3RhbCBzdHJpbmcgdmFsdWVzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBwcm9jZXNzLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIG51bWJlci5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlVG9OdW1iZXIodmFsdWUpIHtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgICAgaWYgKGlzU3ltYm9sKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gTkFOO1xuICAgICAgfVxuICAgICAgcmV0dXJuICt2YWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy50b1N0cmluZ2Agd2hpY2ggZG9lc24ndCBjb252ZXJ0IG51bGxpc2hcbiAgICAgKiB2YWx1ZXMgdG8gZW1wdHkgc3RyaW5ncy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcHJvY2Vzcy5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBzdHJpbmcuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVRvU3RyaW5nKHZhbHVlKSB7XG4gICAgICAvLyBFeGl0IGVhcmx5IGZvciBzdHJpbmdzIHRvIGF2b2lkIGEgcGVyZm9ybWFuY2UgaGl0IGluIHNvbWUgZW52aXJvbm1lbnRzLlxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG4gICAgICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgLy8gUmVjdXJzaXZlbHkgY29udmVydCB2YWx1ZXMgKHN1c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGltaXRzKS5cbiAgICAgICAgcmV0dXJuIGFycmF5TWFwKHZhbHVlLCBiYXNlVG9TdHJpbmcpICsgJyc7XG4gICAgICB9XG4gICAgICBpZiAoaXNTeW1ib2wodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBzeW1ib2xUb1N0cmluZyA/IHN5bWJvbFRvU3RyaW5nLmNhbGwodmFsdWUpIDogJyc7XG4gICAgICB9XG4gICAgICB2YXIgcmVzdWx0ID0gKHZhbHVlICsgJycpO1xuICAgICAgcmV0dXJuIChyZXN1bHQgPT0gJzAnICYmICgxIC8gdmFsdWUpID09IC1JTkZJTklUWSkgPyAnLTAnIDogcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnVuaXFCeWAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWVdIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjb21wYXJhdG9yXSBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGR1cGxpY2F0ZSBmcmVlIGFycmF5LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGJhc2VVbmlxKGFycmF5LCBpdGVyYXRlZSwgY29tcGFyYXRvcikge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgaW5jbHVkZXMgPSBhcnJheUluY2x1ZGVzLFxuICAgICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgICBpc0NvbW1vbiA9IHRydWUsXG4gICAgICAgICAgcmVzdWx0ID0gW10sXG4gICAgICAgICAgc2VlbiA9IHJlc3VsdDtcblxuICAgICAgaWYgKGNvbXBhcmF0b3IpIHtcbiAgICAgICAgaXNDb21tb24gPSBmYWxzZTtcbiAgICAgICAgaW5jbHVkZXMgPSBhcnJheUluY2x1ZGVzV2l0aDtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKGxlbmd0aCA+PSBMQVJHRV9BUlJBWV9TSVpFKSB7XG4gICAgICAgIHZhciBzZXQgPSBpdGVyYXRlZSA/IG51bGwgOiBjcmVhdGVTZXQoYXJyYXkpO1xuICAgICAgICBpZiAoc2V0KSB7XG4gICAgICAgICAgcmV0dXJuIHNldFRvQXJyYXkoc2V0KTtcbiAgICAgICAgfVxuICAgICAgICBpc0NvbW1vbiA9IGZhbHNlO1xuICAgICAgICBpbmNsdWRlcyA9IGNhY2hlSGFzO1xuICAgICAgICBzZWVuID0gbmV3IFNldENhY2hlO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIHNlZW4gPSBpdGVyYXRlZSA/IFtdIDogcmVzdWx0O1xuICAgICAgfVxuICAgICAgb3V0ZXI6XG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgdmFsdWUgPSBhcnJheVtpbmRleF0sXG4gICAgICAgICAgICBjb21wdXRlZCA9IGl0ZXJhdGVlID8gaXRlcmF0ZWUodmFsdWUpIDogdmFsdWU7XG5cbiAgICAgICAgdmFsdWUgPSAoY29tcGFyYXRvciB8fCB2YWx1ZSAhPT0gMCkgPyB2YWx1ZSA6IDA7XG4gICAgICAgIGlmIChpc0NvbW1vbiAmJiBjb21wdXRlZCA9PT0gY29tcHV0ZWQpIHtcbiAgICAgICAgICB2YXIgc2VlbkluZGV4ID0gc2Vlbi5sZW5ndGg7XG4gICAgICAgICAgd2hpbGUgKHNlZW5JbmRleC0tKSB7XG4gICAgICAgICAgICBpZiAoc2VlbltzZWVuSW5kZXhdID09PSBjb21wdXRlZCkge1xuICAgICAgICAgICAgICBjb250aW51ZSBvdXRlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGl0ZXJhdGVlKSB7XG4gICAgICAgICAgICBzZWVuLnB1c2goY29tcHV0ZWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXN1bHQucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIWluY2x1ZGVzKHNlZW4sIGNvbXB1dGVkLCBjb21wYXJhdG9yKSkge1xuICAgICAgICAgIGlmIChzZWVuICE9PSByZXN1bHQpIHtcbiAgICAgICAgICAgIHNlZW4ucHVzaChjb21wdXRlZCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlc3VsdC5wdXNoKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy51bnNldGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHByb3BlcnR5IHBhdGggdG8gdW5zZXQuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBwcm9wZXJ0eSBpcyBkZWxldGVkLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVVuc2V0KG9iamVjdCwgcGF0aCkge1xuICAgICAgcGF0aCA9IGNhc3RQYXRoKHBhdGgsIG9iamVjdCk7XG4gICAgICBvYmplY3QgPSBwYXJlbnQob2JqZWN0LCBwYXRoKTtcbiAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCB8fCBkZWxldGUgb2JqZWN0W3RvS2V5KGxhc3QocGF0aCkpXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy51cGRhdGVgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byB1cGRhdGUuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gdXBkYXRlciBUaGUgZnVuY3Rpb24gdG8gcHJvZHVjZSB0aGUgdXBkYXRlZCB2YWx1ZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBwYXRoIGNyZWF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVVwZGF0ZShvYmplY3QsIHBhdGgsIHVwZGF0ZXIsIGN1c3RvbWl6ZXIpIHtcbiAgICAgIHJldHVybiBiYXNlU2V0KG9iamVjdCwgcGF0aCwgdXBkYXRlcihiYXNlR2V0KG9iamVjdCwgcGF0aCkpLCBjdXN0b21pemVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBtZXRob2RzIGxpa2UgYF8uZHJvcFdoaWxlYCBhbmQgYF8udGFrZVdoaWxlYFxuICAgICAqIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRpY2F0ZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzRHJvcF0gU3BlY2lmeSBkcm9wcGluZyBlbGVtZW50cyBpbnN0ZWFkIG9mIHRha2luZyB0aGVtLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Zyb21SaWdodF0gU3BlY2lmeSBpdGVyYXRpbmcgZnJvbSByaWdodCB0byBsZWZ0LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgc2xpY2Ugb2YgYGFycmF5YC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlV2hpbGUoYXJyYXksIHByZWRpY2F0ZSwgaXNEcm9wLCBmcm9tUmlnaHQpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICAgICAgaW5kZXggPSBmcm9tUmlnaHQgPyBsZW5ndGggOiAtMTtcblxuICAgICAgd2hpbGUgKChmcm9tUmlnaHQgPyBpbmRleC0tIDogKytpbmRleCA8IGxlbmd0aCkgJiZcbiAgICAgICAgcHJlZGljYXRlKGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KSkge31cblxuICAgICAgcmV0dXJuIGlzRHJvcFxuICAgICAgICA/IGJhc2VTbGljZShhcnJheSwgKGZyb21SaWdodCA/IDAgOiBpbmRleCksIChmcm9tUmlnaHQgPyBpbmRleCArIDEgOiBsZW5ndGgpKVxuICAgICAgICA6IGJhc2VTbGljZShhcnJheSwgKGZyb21SaWdodCA/IGluZGV4ICsgMSA6IDApLCAoZnJvbVJpZ2h0ID8gbGVuZ3RoIDogaW5kZXgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgd3JhcHBlclZhbHVlYCB3aGljaCByZXR1cm5zIHRoZSByZXN1bHQgb2ZcbiAgICAgKiBwZXJmb3JtaW5nIGEgc2VxdWVuY2Ugb2YgYWN0aW9ucyBvbiB0aGUgdW53cmFwcGVkIGB2YWx1ZWAsIHdoZXJlIGVhY2hcbiAgICAgKiBzdWNjZXNzaXZlIGFjdGlvbiBpcyBzdXBwbGllZCB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBwcmV2aW91cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdW53cmFwcGVkIHZhbHVlLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFjdGlvbnMgQWN0aW9ucyB0byBwZXJmb3JtIHRvIHJlc29sdmUgdGhlIHVud3JhcHBlZCB2YWx1ZS5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmVzb2x2ZWQgdmFsdWUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVdyYXBwZXJWYWx1ZSh2YWx1ZSwgYWN0aW9ucykge1xuICAgICAgdmFyIHJlc3VsdCA9IHZhbHVlO1xuICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIExhenlXcmFwcGVyKSB7XG4gICAgICAgIHJlc3VsdCA9IHJlc3VsdC52YWx1ZSgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFycmF5UmVkdWNlKGFjdGlvbnMsIGZ1bmN0aW9uKHJlc3VsdCwgYWN0aW9uKSB7XG4gICAgICAgIHJldHVybiBhY3Rpb24uZnVuYy5hcHBseShhY3Rpb24udGhpc0FyZywgYXJyYXlQdXNoKFtyZXN1bHRdLCBhY3Rpb24uYXJncykpO1xuICAgICAgfSwgcmVzdWx0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBtZXRob2RzIGxpa2UgYF8ueG9yYCwgd2l0aG91dCBzdXBwb3J0IGZvclxuICAgICAqIGl0ZXJhdGVlIHNob3J0aGFuZHMsIHRoYXQgYWNjZXB0cyBhbiBhcnJheSBvZiBhcnJheXMgdG8gaW5zcGVjdC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXlzIFRoZSBhcnJheXMgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWVdIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjb21wYXJhdG9yXSBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIHZhbHVlcy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBiYXNlWG9yKGFycmF5cywgaXRlcmF0ZWUsIGNvbXBhcmF0b3IpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheXMubGVuZ3RoO1xuICAgICAgaWYgKGxlbmd0aCA8IDIpIHtcbiAgICAgICAgcmV0dXJuIGxlbmd0aCA/IGJhc2VVbmlxKGFycmF5c1swXSkgOiBbXTtcbiAgICAgIH1cbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIHJlc3VsdCA9IEFycmF5KGxlbmd0aCk7XG5cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciBhcnJheSA9IGFycmF5c1tpbmRleF0sXG4gICAgICAgICAgICBvdGhJbmRleCA9IC0xO1xuXG4gICAgICAgIHdoaWxlICgrK290aEluZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgICAgaWYgKG90aEluZGV4ICE9IGluZGV4KSB7XG4gICAgICAgICAgICByZXN1bHRbaW5kZXhdID0gYmFzZURpZmZlcmVuY2UocmVzdWx0W2luZGV4XSB8fCBhcnJheSwgYXJyYXlzW290aEluZGV4XSwgaXRlcmF0ZWUsIGNvbXBhcmF0b3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGJhc2VVbmlxKGJhc2VGbGF0dGVuKHJlc3VsdCwgMSksIGl0ZXJhdGVlLCBjb21wYXJhdG9yKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uemlwT2JqZWN0YCB3aGljaCBhc3NpZ25zIHZhbHVlcyB1c2luZyBgYXNzaWduRnVuY2AuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHByb3BzIFRoZSBwcm9wZXJ0eSBpZGVudGlmaWVycy5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSB2YWx1ZXMgVGhlIHByb3BlcnR5IHZhbHVlcy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBhc3NpZ25GdW5jIFRoZSBmdW5jdGlvbiB0byBhc3NpZ24gdmFsdWVzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmFzZVppcE9iamVjdChwcm9wcywgdmFsdWVzLCBhc3NpZ25GdW5jKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBwcm9wcy5sZW5ndGgsXG4gICAgICAgICAgdmFsc0xlbmd0aCA9IHZhbHVlcy5sZW5ndGgsXG4gICAgICAgICAgcmVzdWx0ID0ge307XG5cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IGluZGV4IDwgdmFsc0xlbmd0aCA/IHZhbHVlc1tpbmRleF0gOiB1bmRlZmluZWQ7XG4gICAgICAgIGFzc2lnbkZ1bmMocmVzdWx0LCBwcm9wc1tpbmRleF0sIHZhbHVlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FzdHMgYHZhbHVlYCB0byBhbiBlbXB0eSBhcnJheSBpZiBpdCdzIG5vdCBhbiBhcnJheSBsaWtlIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gaW5zcGVjdC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl8T2JqZWN0fSBSZXR1cm5zIHRoZSBjYXN0IGFycmF5LWxpa2Ugb2JqZWN0LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNhc3RBcnJheUxpa2VPYmplY3QodmFsdWUpIHtcbiAgICAgIHJldHVybiBpc0FycmF5TGlrZU9iamVjdCh2YWx1ZSkgPyB2YWx1ZSA6IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhc3RzIGB2YWx1ZWAgdG8gYGlkZW50aXR5YCBpZiBpdCdzIG5vdCBhIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBpbnNwZWN0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyBjYXN0IGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNhc3RGdW5jdGlvbih2YWx1ZSkge1xuICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAnZnVuY3Rpb24nID8gdmFsdWUgOiBpZGVudGl0eTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYXN0cyBgdmFsdWVgIHRvIGEgcGF0aCBhcnJheSBpZiBpdCdzIG5vdCBvbmUuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3RdIFRoZSBvYmplY3QgdG8gcXVlcnkga2V5cyBvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGNhc3QgcHJvcGVydHkgcGF0aCBhcnJheS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjYXN0UGF0aCh2YWx1ZSwgb2JqZWN0KSB7XG4gICAgICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGlzS2V5KHZhbHVlLCBvYmplY3QpID8gW3ZhbHVlXSA6IHN0cmluZ1RvUGF0aCh0b1N0cmluZyh2YWx1ZSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgYGJhc2VSZXN0YCBhbGlhcyB3aGljaCBjYW4gYmUgcmVwbGFjZWQgd2l0aCBgaWRlbnRpdHlgIGJ5IG1vZHVsZVxuICAgICAqIHJlcGxhY2VtZW50IHBsdWdpbnMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEB0eXBlIHtGdW5jdGlvbn1cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBhcHBseSBhIHJlc3QgcGFyYW1ldGVyIHRvLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIHZhciBjYXN0UmVzdCA9IGJhc2VSZXN0O1xuXG4gICAgLyoqXG4gICAgICogQ2FzdHMgYGFycmF5YCB0byBhIHNsaWNlIGlmIGl0J3MgbmVlZGVkLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gc3RhcnQgVGhlIHN0YXJ0IHBvc2l0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZW5kPWFycmF5Lmxlbmd0aF0gVGhlIGVuZCBwb3NpdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGNhc3Qgc2xpY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2FzdFNsaWNlKGFycmF5LCBzdGFydCwgZW5kKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuICAgICAgZW5kID0gZW5kID09PSB1bmRlZmluZWQgPyBsZW5ndGggOiBlbmQ7XG4gICAgICByZXR1cm4gKCFzdGFydCAmJiBlbmQgPj0gbGVuZ3RoKSA/IGFycmF5IDogYmFzZVNsaWNlKGFycmF5LCBzdGFydCwgZW5kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNpbXBsZSB3cmFwcGVyIGFyb3VuZCB0aGUgZ2xvYmFsIFtgY2xlYXJUaW1lb3V0YF0oaHR0cHM6Ly9tZG4uaW8vY2xlYXJUaW1lb3V0KS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtudW1iZXJ8T2JqZWN0fSBpZCBUaGUgdGltZXIgaWQgb3IgdGltZW91dCBvYmplY3Qgb2YgdGhlIHRpbWVyIHRvIGNsZWFyLlxuICAgICAqL1xuICAgIHZhciBjbGVhclRpbWVvdXQgPSBjdHhDbGVhclRpbWVvdXQgfHwgZnVuY3Rpb24oaWQpIHtcbiAgICAgIHJldHVybiByb290LmNsZWFyVGltZW91dChpZCk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBjbG9uZSBvZiAgYGJ1ZmZlcmAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QnVmZmVyfSBidWZmZXIgVGhlIGJ1ZmZlciB0byBjbG9uZS5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpc0RlZXBdIFNwZWNpZnkgYSBkZWVwIGNsb25lLlxuICAgICAqIEByZXR1cm5zIHtCdWZmZXJ9IFJldHVybnMgdGhlIGNsb25lZCBidWZmZXIuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2xvbmVCdWZmZXIoYnVmZmVyLCBpc0RlZXApIHtcbiAgICAgIGlmIChpc0RlZXApIHtcbiAgICAgICAgcmV0dXJuIGJ1ZmZlci5zbGljZSgpO1xuICAgICAgfVxuICAgICAgdmFyIGxlbmd0aCA9IGJ1ZmZlci5sZW5ndGgsXG4gICAgICAgICAgcmVzdWx0ID0gYWxsb2NVbnNhZmUgPyBhbGxvY1Vuc2FmZShsZW5ndGgpIDogbmV3IGJ1ZmZlci5jb25zdHJ1Y3RvcihsZW5ndGgpO1xuXG4gICAgICBidWZmZXIuY29weShyZXN1bHQpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgY2xvbmUgb2YgYGFycmF5QnVmZmVyYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheUJ1ZmZlcn0gYXJyYXlCdWZmZXIgVGhlIGFycmF5IGJ1ZmZlciB0byBjbG9uZS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXlCdWZmZXJ9IFJldHVybnMgdGhlIGNsb25lZCBhcnJheSBidWZmZXIuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2xvbmVBcnJheUJ1ZmZlcihhcnJheUJ1ZmZlcikge1xuICAgICAgdmFyIHJlc3VsdCA9IG5ldyBhcnJheUJ1ZmZlci5jb25zdHJ1Y3RvcihhcnJheUJ1ZmZlci5ieXRlTGVuZ3RoKTtcbiAgICAgIG5ldyBVaW50OEFycmF5KHJlc3VsdCkuc2V0KG5ldyBVaW50OEFycmF5KGFycmF5QnVmZmVyKSk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBjbG9uZSBvZiBgZGF0YVZpZXdgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZGF0YVZpZXcgVGhlIGRhdGEgdmlldyB0byBjbG9uZS5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpc0RlZXBdIFNwZWNpZnkgYSBkZWVwIGNsb25lLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNsb25lZCBkYXRhIHZpZXcuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2xvbmVEYXRhVmlldyhkYXRhVmlldywgaXNEZWVwKSB7XG4gICAgICB2YXIgYnVmZmVyID0gaXNEZWVwID8gY2xvbmVBcnJheUJ1ZmZlcihkYXRhVmlldy5idWZmZXIpIDogZGF0YVZpZXcuYnVmZmVyO1xuICAgICAgcmV0dXJuIG5ldyBkYXRhVmlldy5jb25zdHJ1Y3RvcihidWZmZXIsIGRhdGFWaWV3LmJ5dGVPZmZzZXQsIGRhdGFWaWV3LmJ5dGVMZW5ndGgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBjbG9uZSBvZiBgcmVnZXhwYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHJlZ2V4cCBUaGUgcmVnZXhwIHRvIGNsb25lLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNsb25lZCByZWdleHAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2xvbmVSZWdFeHAocmVnZXhwKSB7XG4gICAgICB2YXIgcmVzdWx0ID0gbmV3IHJlZ2V4cC5jb25zdHJ1Y3RvcihyZWdleHAuc291cmNlLCByZUZsYWdzLmV4ZWMocmVnZXhwKSk7XG4gICAgICByZXN1bHQubGFzdEluZGV4ID0gcmVnZXhwLmxhc3RJbmRleDtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGNsb25lIG9mIHRoZSBgc3ltYm9sYCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzeW1ib2wgVGhlIHN5bWJvbCBvYmplY3QgdG8gY2xvbmUuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY2xvbmVkIHN5bWJvbCBvYmplY3QuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2xvbmVTeW1ib2woc3ltYm9sKSB7XG4gICAgICByZXR1cm4gc3ltYm9sVmFsdWVPZiA/IE9iamVjdChzeW1ib2xWYWx1ZU9mLmNhbGwoc3ltYm9sKSkgOiB7fTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgY2xvbmUgb2YgYHR5cGVkQXJyYXlgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gdHlwZWRBcnJheSBUaGUgdHlwZWQgYXJyYXkgdG8gY2xvbmUuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbaXNEZWVwXSBTcGVjaWZ5IGEgZGVlcCBjbG9uZS5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjbG9uZWQgdHlwZWQgYXJyYXkuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2xvbmVUeXBlZEFycmF5KHR5cGVkQXJyYXksIGlzRGVlcCkge1xuICAgICAgdmFyIGJ1ZmZlciA9IGlzRGVlcCA/IGNsb25lQXJyYXlCdWZmZXIodHlwZWRBcnJheS5idWZmZXIpIDogdHlwZWRBcnJheS5idWZmZXI7XG4gICAgICByZXR1cm4gbmV3IHR5cGVkQXJyYXkuY29uc3RydWN0b3IoYnVmZmVyLCB0eXBlZEFycmF5LmJ5dGVPZmZzZXQsIHR5cGVkQXJyYXkubGVuZ3RoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb21wYXJlcyB2YWx1ZXMgdG8gc29ydCB0aGVtIGluIGFzY2VuZGluZyBvcmRlci5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0geyp9IG90aGVyIFRoZSBvdGhlciB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHNvcnQgb3JkZXIgaW5kaWNhdG9yIGZvciBgdmFsdWVgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNvbXBhcmVBc2NlbmRpbmcodmFsdWUsIG90aGVyKSB7XG4gICAgICBpZiAodmFsdWUgIT09IG90aGVyKSB7XG4gICAgICAgIHZhciB2YWxJc0RlZmluZWQgPSB2YWx1ZSAhPT0gdW5kZWZpbmVkLFxuICAgICAgICAgICAgdmFsSXNOdWxsID0gdmFsdWUgPT09IG51bGwsXG4gICAgICAgICAgICB2YWxJc1JlZmxleGl2ZSA9IHZhbHVlID09PSB2YWx1ZSxcbiAgICAgICAgICAgIHZhbElzU3ltYm9sID0gaXNTeW1ib2wodmFsdWUpO1xuXG4gICAgICAgIHZhciBvdGhJc0RlZmluZWQgPSBvdGhlciAhPT0gdW5kZWZpbmVkLFxuICAgICAgICAgICAgb3RoSXNOdWxsID0gb3RoZXIgPT09IG51bGwsXG4gICAgICAgICAgICBvdGhJc1JlZmxleGl2ZSA9IG90aGVyID09PSBvdGhlcixcbiAgICAgICAgICAgIG90aElzU3ltYm9sID0gaXNTeW1ib2wob3RoZXIpO1xuXG4gICAgICAgIGlmICgoIW90aElzTnVsbCAmJiAhb3RoSXNTeW1ib2wgJiYgIXZhbElzU3ltYm9sICYmIHZhbHVlID4gb3RoZXIpIHx8XG4gICAgICAgICAgICAodmFsSXNTeW1ib2wgJiYgb3RoSXNEZWZpbmVkICYmIG90aElzUmVmbGV4aXZlICYmICFvdGhJc051bGwgJiYgIW90aElzU3ltYm9sKSB8fFxuICAgICAgICAgICAgKHZhbElzTnVsbCAmJiBvdGhJc0RlZmluZWQgJiYgb3RoSXNSZWZsZXhpdmUpIHx8XG4gICAgICAgICAgICAoIXZhbElzRGVmaW5lZCAmJiBvdGhJc1JlZmxleGl2ZSkgfHxcbiAgICAgICAgICAgICF2YWxJc1JlZmxleGl2ZSkge1xuICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICB9XG4gICAgICAgIGlmICgoIXZhbElzTnVsbCAmJiAhdmFsSXNTeW1ib2wgJiYgIW90aElzU3ltYm9sICYmIHZhbHVlIDwgb3RoZXIpIHx8XG4gICAgICAgICAgICAob3RoSXNTeW1ib2wgJiYgdmFsSXNEZWZpbmVkICYmIHZhbElzUmVmbGV4aXZlICYmICF2YWxJc051bGwgJiYgIXZhbElzU3ltYm9sKSB8fFxuICAgICAgICAgICAgKG90aElzTnVsbCAmJiB2YWxJc0RlZmluZWQgJiYgdmFsSXNSZWZsZXhpdmUpIHx8XG4gICAgICAgICAgICAoIW90aElzRGVmaW5lZCAmJiB2YWxJc1JlZmxleGl2ZSkgfHxcbiAgICAgICAgICAgICFvdGhJc1JlZmxleGl2ZSkge1xuICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlZCBieSBgXy5vcmRlckJ5YCB0byBjb21wYXJlIG11bHRpcGxlIHByb3BlcnRpZXMgb2YgYSB2YWx1ZSB0byBhbm90aGVyXG4gICAgICogYW5kIHN0YWJsZSBzb3J0IHRoZW0uXG4gICAgICpcbiAgICAgKiBJZiBgb3JkZXJzYCBpcyB1bnNwZWNpZmllZCwgYWxsIHZhbHVlcyBhcmUgc29ydGVkIGluIGFzY2VuZGluZyBvcmRlci4gT3RoZXJ3aXNlLFxuICAgICAqIHNwZWNpZnkgYW4gb3JkZXIgb2YgXCJkZXNjXCIgZm9yIGRlc2NlbmRpbmcgb3IgXCJhc2NcIiBmb3IgYXNjZW5kaW5nIHNvcnQgb3JkZXJcbiAgICAgKiBvZiBjb3JyZXNwb25kaW5nIHZhbHVlcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG90aGVyIFRoZSBvdGhlciBvYmplY3QgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW5bXXxzdHJpbmdbXX0gb3JkZXJzIFRoZSBvcmRlciB0byBzb3J0IGJ5IGZvciBlYWNoIHByb3BlcnR5LlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHNvcnQgb3JkZXIgaW5kaWNhdG9yIGZvciBgb2JqZWN0YC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjb21wYXJlTXVsdGlwbGUob2JqZWN0LCBvdGhlciwgb3JkZXJzKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBvYmpDcml0ZXJpYSA9IG9iamVjdC5jcml0ZXJpYSxcbiAgICAgICAgICBvdGhDcml0ZXJpYSA9IG90aGVyLmNyaXRlcmlhLFxuICAgICAgICAgIGxlbmd0aCA9IG9iakNyaXRlcmlhLmxlbmd0aCxcbiAgICAgICAgICBvcmRlcnNMZW5ndGggPSBvcmRlcnMubGVuZ3RoO1xuXG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gY29tcGFyZUFzY2VuZGluZyhvYmpDcml0ZXJpYVtpbmRleF0sIG90aENyaXRlcmlhW2luZGV4XSk7XG4gICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICBpZiAoaW5kZXggPj0gb3JkZXJzTGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgb3JkZXIgPSBvcmRlcnNbaW5kZXhdO1xuICAgICAgICAgIHJldHVybiByZXN1bHQgKiAob3JkZXIgPT0gJ2Rlc2MnID8gLTEgOiAxKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gRml4ZXMgYW4gYEFycmF5I3NvcnRgIGJ1ZyBpbiB0aGUgSlMgZW5naW5lIGVtYmVkZGVkIGluIEFkb2JlIGFwcGxpY2F0aW9uc1xuICAgICAgLy8gdGhhdCBjYXVzZXMgaXQsIHVuZGVyIGNlcnRhaW4gY2lyY3Vtc3RhbmNlcywgdG8gcHJvdmlkZSB0aGUgc2FtZSB2YWx1ZSBmb3JcbiAgICAgIC8vIGBvYmplY3RgIGFuZCBgb3RoZXJgLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2phc2hrZW5hcy91bmRlcnNjb3JlL3B1bGwvMTI0N1xuICAgICAgLy8gZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgIC8vXG4gICAgICAvLyBUaGlzIGFsc28gZW5zdXJlcyBhIHN0YWJsZSBzb3J0IGluIFY4IGFuZCBvdGhlciBlbmdpbmVzLlxuICAgICAgLy8gU2VlIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTkwIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICByZXR1cm4gb2JqZWN0LmluZGV4IC0gb3RoZXIuaW5kZXg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSB0aGF0IGlzIHRoZSBjb21wb3NpdGlvbiBvZiBwYXJ0aWFsbHkgYXBwbGllZCBhcmd1bWVudHMsXG4gICAgICogcGxhY2Vob2xkZXJzLCBhbmQgcHJvdmlkZWQgYXJndW1lbnRzIGludG8gYSBzaW5nbGUgYXJyYXkgb2YgYXJndW1lbnRzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcmdzIFRoZSBwcm92aWRlZCBhcmd1bWVudHMuXG4gICAgICogQHBhcmFtIHtBcnJheX0gcGFydGlhbHMgVGhlIGFyZ3VtZW50cyB0byBwcmVwZW5kIHRvIHRob3NlIHByb3ZpZGVkLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGhvbGRlcnMgVGhlIGBwYXJ0aWFsc2AgcGxhY2Vob2xkZXIgaW5kZXhlcy5cbiAgICAgKiBAcGFyYW1zIHtib29sZWFufSBbaXNDdXJyaWVkXSBTcGVjaWZ5IGNvbXBvc2luZyBmb3IgYSBjdXJyaWVkIGZ1bmN0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGNvbXBvc2VkIGFyZ3VtZW50cy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjb21wb3NlQXJncyhhcmdzLCBwYXJ0aWFscywgaG9sZGVycywgaXNDdXJyaWVkKSB7XG4gICAgICB2YXIgYXJnc0luZGV4ID0gLTEsXG4gICAgICAgICAgYXJnc0xlbmd0aCA9IGFyZ3MubGVuZ3RoLFxuICAgICAgICAgIGhvbGRlcnNMZW5ndGggPSBob2xkZXJzLmxlbmd0aCxcbiAgICAgICAgICBsZWZ0SW5kZXggPSAtMSxcbiAgICAgICAgICBsZWZ0TGVuZ3RoID0gcGFydGlhbHMubGVuZ3RoLFxuICAgICAgICAgIHJhbmdlTGVuZ3RoID0gbmF0aXZlTWF4KGFyZ3NMZW5ndGggLSBob2xkZXJzTGVuZ3RoLCAwKSxcbiAgICAgICAgICByZXN1bHQgPSBBcnJheShsZWZ0TGVuZ3RoICsgcmFuZ2VMZW5ndGgpLFxuICAgICAgICAgIGlzVW5jdXJyaWVkID0gIWlzQ3VycmllZDtcblxuICAgICAgd2hpbGUgKCsrbGVmdEluZGV4IDwgbGVmdExlbmd0aCkge1xuICAgICAgICByZXN1bHRbbGVmdEluZGV4XSA9IHBhcnRpYWxzW2xlZnRJbmRleF07XG4gICAgICB9XG4gICAgICB3aGlsZSAoKythcmdzSW5kZXggPCBob2xkZXJzTGVuZ3RoKSB7XG4gICAgICAgIGlmIChpc1VuY3VycmllZCB8fCBhcmdzSW5kZXggPCBhcmdzTGVuZ3RoKSB7XG4gICAgICAgICAgcmVzdWx0W2hvbGRlcnNbYXJnc0luZGV4XV0gPSBhcmdzW2FyZ3NJbmRleF07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHdoaWxlIChyYW5nZUxlbmd0aC0tKSB7XG4gICAgICAgIHJlc3VsdFtsZWZ0SW5kZXgrK10gPSBhcmdzW2FyZ3NJbmRleCsrXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyBsaWtlIGBjb21wb3NlQXJnc2AgZXhjZXB0IHRoYXQgdGhlIGFyZ3VtZW50cyBjb21wb3NpdGlvblxuICAgICAqIGlzIHRhaWxvcmVkIGZvciBgXy5wYXJ0aWFsUmlnaHRgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcmdzIFRoZSBwcm92aWRlZCBhcmd1bWVudHMuXG4gICAgICogQHBhcmFtIHtBcnJheX0gcGFydGlhbHMgVGhlIGFyZ3VtZW50cyB0byBhcHBlbmQgdG8gdGhvc2UgcHJvdmlkZWQuXG4gICAgICogQHBhcmFtIHtBcnJheX0gaG9sZGVycyBUaGUgYHBhcnRpYWxzYCBwbGFjZWhvbGRlciBpbmRleGVzLlxuICAgICAqIEBwYXJhbXMge2Jvb2xlYW59IFtpc0N1cnJpZWRdIFNwZWNpZnkgY29tcG9zaW5nIGZvciBhIGN1cnJpZWQgZnVuY3Rpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgY29tcG9zZWQgYXJndW1lbnRzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNvbXBvc2VBcmdzUmlnaHQoYXJncywgcGFydGlhbHMsIGhvbGRlcnMsIGlzQ3VycmllZCkge1xuICAgICAgdmFyIGFyZ3NJbmRleCA9IC0xLFxuICAgICAgICAgIGFyZ3NMZW5ndGggPSBhcmdzLmxlbmd0aCxcbiAgICAgICAgICBob2xkZXJzSW5kZXggPSAtMSxcbiAgICAgICAgICBob2xkZXJzTGVuZ3RoID0gaG9sZGVycy5sZW5ndGgsXG4gICAgICAgICAgcmlnaHRJbmRleCA9IC0xLFxuICAgICAgICAgIHJpZ2h0TGVuZ3RoID0gcGFydGlhbHMubGVuZ3RoLFxuICAgICAgICAgIHJhbmdlTGVuZ3RoID0gbmF0aXZlTWF4KGFyZ3NMZW5ndGggLSBob2xkZXJzTGVuZ3RoLCAwKSxcbiAgICAgICAgICByZXN1bHQgPSBBcnJheShyYW5nZUxlbmd0aCArIHJpZ2h0TGVuZ3RoKSxcbiAgICAgICAgICBpc1VuY3VycmllZCA9ICFpc0N1cnJpZWQ7XG5cbiAgICAgIHdoaWxlICgrK2FyZ3NJbmRleCA8IHJhbmdlTGVuZ3RoKSB7XG4gICAgICAgIHJlc3VsdFthcmdzSW5kZXhdID0gYXJnc1thcmdzSW5kZXhdO1xuICAgICAgfVxuICAgICAgdmFyIG9mZnNldCA9IGFyZ3NJbmRleDtcbiAgICAgIHdoaWxlICgrK3JpZ2h0SW5kZXggPCByaWdodExlbmd0aCkge1xuICAgICAgICByZXN1bHRbb2Zmc2V0ICsgcmlnaHRJbmRleF0gPSBwYXJ0aWFsc1tyaWdodEluZGV4XTtcbiAgICAgIH1cbiAgICAgIHdoaWxlICgrK2hvbGRlcnNJbmRleCA8IGhvbGRlcnNMZW5ndGgpIHtcbiAgICAgICAgaWYgKGlzVW5jdXJyaWVkIHx8IGFyZ3NJbmRleCA8IGFyZ3NMZW5ndGgpIHtcbiAgICAgICAgICByZXN1bHRbb2Zmc2V0ICsgaG9sZGVyc1tob2xkZXJzSW5kZXhdXSA9IGFyZ3NbYXJnc0luZGV4KytdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvcGllcyB0aGUgdmFsdWVzIG9mIGBzb3VyY2VgIHRvIGBhcnJheWAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHNvdXJjZSBUaGUgYXJyYXkgdG8gY29weSB2YWx1ZXMgZnJvbS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbYXJyYXk9W11dIFRoZSBhcnJheSB0byBjb3B5IHZhbHVlcyB0by5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjb3B5QXJyYXkoc291cmNlLCBhcnJheSkge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gc291cmNlLmxlbmd0aDtcblxuICAgICAgYXJyYXkgfHwgKGFycmF5ID0gQXJyYXkobGVuZ3RoKSk7XG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICBhcnJheVtpbmRleF0gPSBzb3VyY2VbaW5kZXhdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFycmF5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvcGllcyBwcm9wZXJ0aWVzIG9mIGBzb3VyY2VgIHRvIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3QgdG8gY29weSBwcm9wZXJ0aWVzIGZyb20uXG4gICAgICogQHBhcmFtIHtBcnJheX0gcHJvcHMgVGhlIHByb3BlcnR5IGlkZW50aWZpZXJzIHRvIGNvcHkuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3Q9e31dIFRoZSBvYmplY3QgdG8gY29weSBwcm9wZXJ0aWVzIHRvLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNvcGllZCB2YWx1ZXMuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjb3B5T2JqZWN0KHNvdXJjZSwgcHJvcHMsIG9iamVjdCwgY3VzdG9taXplcikge1xuICAgICAgdmFyIGlzTmV3ID0gIW9iamVjdDtcbiAgICAgIG9iamVjdCB8fCAob2JqZWN0ID0ge30pO1xuXG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBwcm9wcy5sZW5ndGg7XG5cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciBrZXkgPSBwcm9wc1tpbmRleF07XG5cbiAgICAgICAgdmFyIG5ld1ZhbHVlID0gY3VzdG9taXplclxuICAgICAgICAgID8gY3VzdG9taXplcihvYmplY3Rba2V5XSwgc291cmNlW2tleV0sIGtleSwgb2JqZWN0LCBzb3VyY2UpXG4gICAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgaWYgKG5ld1ZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBuZXdWYWx1ZSA9IHNvdXJjZVtrZXldO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc05ldykge1xuICAgICAgICAgIGJhc2VBc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgbmV3VmFsdWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGFzc2lnblZhbHVlKG9iamVjdCwga2V5LCBuZXdWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBvYmplY3Q7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29waWVzIG93biBzeW1ib2xzIG9mIGBzb3VyY2VgIHRvIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3QgdG8gY29weSBzeW1ib2xzIGZyb20uXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3Q9e31dIFRoZSBvYmplY3QgdG8gY29weSBzeW1ib2xzIHRvLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY29weVN5bWJvbHMoc291cmNlLCBvYmplY3QpIHtcbiAgICAgIHJldHVybiBjb3B5T2JqZWN0KHNvdXJjZSwgZ2V0U3ltYm9scyhzb3VyY2UpLCBvYmplY3QpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvcGllcyBvd24gYW5kIGluaGVyaXRlZCBzeW1ib2xzIG9mIGBzb3VyY2VgIHRvIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3QgdG8gY29weSBzeW1ib2xzIGZyb20uXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3Q9e31dIFRoZSBvYmplY3QgdG8gY29weSBzeW1ib2xzIHRvLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY29weVN5bWJvbHNJbihzb3VyY2UsIG9iamVjdCkge1xuICAgICAgcmV0dXJuIGNvcHlPYmplY3Qoc291cmNlLCBnZXRTeW1ib2xzSW4oc291cmNlKSwgb2JqZWN0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gbGlrZSBgXy5ncm91cEJ5YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gc2V0dGVyIFRoZSBmdW5jdGlvbiB0byBzZXQgYWNjdW11bGF0b3IgdmFsdWVzLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpbml0aWFsaXplcl0gVGhlIGFjY3VtdWxhdG9yIG9iamVjdCBpbml0aWFsaXplci5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBhZ2dyZWdhdG9yIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZUFnZ3JlZ2F0b3Ioc2V0dGVyLCBpbml0aWFsaXplcikge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKGNvbGxlY3Rpb24sIGl0ZXJhdGVlKSB7XG4gICAgICAgIHZhciBmdW5jID0gaXNBcnJheShjb2xsZWN0aW9uKSA/IGFycmF5QWdncmVnYXRvciA6IGJhc2VBZ2dyZWdhdG9yLFxuICAgICAgICAgICAgYWNjdW11bGF0b3IgPSBpbml0aWFsaXplciA/IGluaXRpYWxpemVyKCkgOiB7fTtcblxuICAgICAgICByZXR1cm4gZnVuYyhjb2xsZWN0aW9uLCBzZXR0ZXIsIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAyKSwgYWNjdW11bGF0b3IpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gbGlrZSBgXy5hc3NpZ25gLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBhc3NpZ25lciBUaGUgZnVuY3Rpb24gdG8gYXNzaWduIHZhbHVlcy5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBhc3NpZ25lciBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVBc3NpZ25lcihhc3NpZ25lcikge1xuICAgICAgcmV0dXJuIGJhc2VSZXN0KGZ1bmN0aW9uKG9iamVjdCwgc291cmNlcykge1xuICAgICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICAgIGxlbmd0aCA9IHNvdXJjZXMubGVuZ3RoLFxuICAgICAgICAgICAgY3VzdG9taXplciA9IGxlbmd0aCA+IDEgPyBzb3VyY2VzW2xlbmd0aCAtIDFdIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgZ3VhcmQgPSBsZW5ndGggPiAyID8gc291cmNlc1syXSA6IHVuZGVmaW5lZDtcblxuICAgICAgICBjdXN0b21pemVyID0gKGFzc2lnbmVyLmxlbmd0aCA+IDMgJiYgdHlwZW9mIGN1c3RvbWl6ZXIgPT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgICA/IChsZW5ndGgtLSwgY3VzdG9taXplcilcbiAgICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgICAgICBpZiAoZ3VhcmQgJiYgaXNJdGVyYXRlZUNhbGwoc291cmNlc1swXSwgc291cmNlc1sxXSwgZ3VhcmQpKSB7XG4gICAgICAgICAgY3VzdG9taXplciA9IGxlbmd0aCA8IDMgPyB1bmRlZmluZWQgOiBjdXN0b21pemVyO1xuICAgICAgICAgIGxlbmd0aCA9IDE7XG4gICAgICAgIH1cbiAgICAgICAgb2JqZWN0ID0gT2JqZWN0KG9iamVjdCk7XG4gICAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgICAgdmFyIHNvdXJjZSA9IHNvdXJjZXNbaW5kZXhdO1xuICAgICAgICAgIGlmIChzb3VyY2UpIHtcbiAgICAgICAgICAgIGFzc2lnbmVyKG9iamVjdCwgc291cmNlLCBpbmRleCwgY3VzdG9taXplcik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvYmplY3Q7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgYGJhc2VFYWNoYCBvciBgYmFzZUVhY2hSaWdodGAgZnVuY3Rpb24uXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGVhY2hGdW5jIFRoZSBmdW5jdGlvbiB0byBpdGVyYXRlIG92ZXIgYSBjb2xsZWN0aW9uLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Zyb21SaWdodF0gU3BlY2lmeSBpdGVyYXRpbmcgZnJvbSByaWdodCB0byBsZWZ0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGJhc2UgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlQmFzZUVhY2goZWFjaEZ1bmMsIGZyb21SaWdodCkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKGNvbGxlY3Rpb24sIGl0ZXJhdGVlKSB7XG4gICAgICAgIGlmIChjb2xsZWN0aW9uID09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gY29sbGVjdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzQXJyYXlMaWtlKGNvbGxlY3Rpb24pKSB7XG4gICAgICAgICAgcmV0dXJuIGVhY2hGdW5jKGNvbGxlY3Rpb24sIGl0ZXJhdGVlKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgbGVuZ3RoID0gY29sbGVjdGlvbi5sZW5ndGgsXG4gICAgICAgICAgICBpbmRleCA9IGZyb21SaWdodCA/IGxlbmd0aCA6IC0xLFxuICAgICAgICAgICAgaXRlcmFibGUgPSBPYmplY3QoY29sbGVjdGlvbik7XG5cbiAgICAgICAgd2hpbGUgKChmcm9tUmlnaHQgPyBpbmRleC0tIDogKytpbmRleCA8IGxlbmd0aCkpIHtcbiAgICAgICAgICBpZiAoaXRlcmF0ZWUoaXRlcmFibGVbaW5kZXhdLCBpbmRleCwgaXRlcmFibGUpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb2xsZWN0aW9uO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgYmFzZSBmdW5jdGlvbiBmb3IgbWV0aG9kcyBsaWtlIGBfLmZvckluYCBhbmQgYF8uZm9yT3duYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbZnJvbVJpZ2h0XSBTcGVjaWZ5IGl0ZXJhdGluZyBmcm9tIHJpZ2h0IHRvIGxlZnQuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYmFzZSBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVCYXNlRm9yKGZyb21SaWdodCkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKG9iamVjdCwgaXRlcmF0ZWUsIGtleXNGdW5jKSB7XG4gICAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgICAgaXRlcmFibGUgPSBPYmplY3Qob2JqZWN0KSxcbiAgICAgICAgICAgIHByb3BzID0ga2V5c0Z1bmMob2JqZWN0KSxcbiAgICAgICAgICAgIGxlbmd0aCA9IHByb3BzLmxlbmd0aDtcblxuICAgICAgICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICAgICAgICB2YXIga2V5ID0gcHJvcHNbZnJvbVJpZ2h0ID8gbGVuZ3RoIDogKytpbmRleF07XG4gICAgICAgICAgaWYgKGl0ZXJhdGVlKGl0ZXJhYmxlW2tleV0sIGtleSwgaXRlcmFibGUpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvYmplY3Q7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHdyYXBzIGBmdW5jYCB0byBpbnZva2UgaXQgd2l0aCB0aGUgb3B0aW9uYWwgYHRoaXNgXG4gICAgICogYmluZGluZyBvZiBgdGhpc0FyZ2AuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHdyYXAuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgY3JlYXRlV3JhcGAgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGZ1bmNgLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHdyYXBwZWQgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlQmluZChmdW5jLCBiaXRtYXNrLCB0aGlzQXJnKSB7XG4gICAgICB2YXIgaXNCaW5kID0gYml0bWFzayAmIFdSQVBfQklORF9GTEFHLFxuICAgICAgICAgIEN0b3IgPSBjcmVhdGVDdG9yKGZ1bmMpO1xuXG4gICAgICBmdW5jdGlvbiB3cmFwcGVyKCkge1xuICAgICAgICB2YXIgZm4gPSAodGhpcyAmJiB0aGlzICE9PSByb290ICYmIHRoaXMgaW5zdGFuY2VvZiB3cmFwcGVyKSA/IEN0b3IgOiBmdW5jO1xuICAgICAgICByZXR1cm4gZm4uYXBwbHkoaXNCaW5kID8gdGhpc0FyZyA6IHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gd3JhcHBlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gbGlrZSBgXy5sb3dlckZpcnN0YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZE5hbWUgVGhlIG5hbWUgb2YgdGhlIGBTdHJpbmdgIGNhc2UgbWV0aG9kIHRvIHVzZS5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjYXNlIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZUNhc2VGaXJzdChtZXRob2ROYW1lKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24oc3RyaW5nKSB7XG4gICAgICAgIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7XG5cbiAgICAgICAgdmFyIHN0clN5bWJvbHMgPSBoYXNVbmljb2RlKHN0cmluZylcbiAgICAgICAgICA/IHN0cmluZ1RvQXJyYXkoc3RyaW5nKVxuICAgICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIHZhciBjaHIgPSBzdHJTeW1ib2xzXG4gICAgICAgICAgPyBzdHJTeW1ib2xzWzBdXG4gICAgICAgICAgOiBzdHJpbmcuY2hhckF0KDApO1xuXG4gICAgICAgIHZhciB0cmFpbGluZyA9IHN0clN5bWJvbHNcbiAgICAgICAgICA/IGNhc3RTbGljZShzdHJTeW1ib2xzLCAxKS5qb2luKCcnKVxuICAgICAgICAgIDogc3RyaW5nLnNsaWNlKDEpO1xuXG4gICAgICAgIHJldHVybiBjaHJbbWV0aG9kTmFtZV0oKSArIHRyYWlsaW5nO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gbGlrZSBgXy5jYW1lbENhc2VgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBUaGUgZnVuY3Rpb24gdG8gY29tYmluZSBlYWNoIHdvcmQuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgY29tcG91bmRlciBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVDb21wb3VuZGVyKGNhbGxiYWNrKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24oc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiBhcnJheVJlZHVjZSh3b3JkcyhkZWJ1cnIoc3RyaW5nKS5yZXBsYWNlKHJlQXBvcywgJycpKSwgY2FsbGJhY2ssICcnKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgcHJvZHVjZXMgYW4gaW5zdGFuY2Ugb2YgYEN0b3JgIHJlZ2FyZGxlc3Mgb2ZcbiAgICAgKiB3aGV0aGVyIGl0IHdhcyBpbnZva2VkIGFzIHBhcnQgb2YgYSBgbmV3YCBleHByZXNzaW9uIG9yIGJ5IGBjYWxsYCBvciBgYXBwbHlgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBDdG9yIFRoZSBjb25zdHJ1Y3RvciB0byB3cmFwLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHdyYXBwZWQgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlQ3RvcihDdG9yKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgIC8vIFVzZSBhIGBzd2l0Y2hgIHN0YXRlbWVudCB0byB3b3JrIHdpdGggY2xhc3MgY29uc3RydWN0b3JzLiBTZWVcbiAgICAgICAgLy8gaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtZWNtYXNjcmlwdC1mdW5jdGlvbi1vYmplY3RzLWNhbGwtdGhpc2FyZ3VtZW50LWFyZ3VtZW50c2xpc3RcbiAgICAgICAgLy8gZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgICAgIHN3aXRjaCAoYXJncy5sZW5ndGgpIHtcbiAgICAgICAgICBjYXNlIDA6IHJldHVybiBuZXcgQ3RvcjtcbiAgICAgICAgICBjYXNlIDE6IHJldHVybiBuZXcgQ3RvcihhcmdzWzBdKTtcbiAgICAgICAgICBjYXNlIDI6IHJldHVybiBuZXcgQ3RvcihhcmdzWzBdLCBhcmdzWzFdKTtcbiAgICAgICAgICBjYXNlIDM6IHJldHVybiBuZXcgQ3RvcihhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKTtcbiAgICAgICAgICBjYXNlIDQ6IHJldHVybiBuZXcgQ3RvcihhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdLCBhcmdzWzNdKTtcbiAgICAgICAgICBjYXNlIDU6IHJldHVybiBuZXcgQ3RvcihhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdLCBhcmdzWzNdLCBhcmdzWzRdKTtcbiAgICAgICAgICBjYXNlIDY6IHJldHVybiBuZXcgQ3RvcihhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdLCBhcmdzWzNdLCBhcmdzWzRdLCBhcmdzWzVdKTtcbiAgICAgICAgICBjYXNlIDc6IHJldHVybiBuZXcgQ3RvcihhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdLCBhcmdzWzNdLCBhcmdzWzRdLCBhcmdzWzVdLCBhcmdzWzZdKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgdGhpc0JpbmRpbmcgPSBiYXNlQ3JlYXRlKEN0b3IucHJvdG90eXBlKSxcbiAgICAgICAgICAgIHJlc3VsdCA9IEN0b3IuYXBwbHkodGhpc0JpbmRpbmcsIGFyZ3MpO1xuXG4gICAgICAgIC8vIE1pbWljIHRoZSBjb25zdHJ1Y3RvcidzIGByZXR1cm5gIGJlaGF2aW9yLlxuICAgICAgICAvLyBTZWUgaHR0cHM6Ly9lczUuZ2l0aHViLmlvLyN4MTMuMi4yIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICAgIHJldHVybiBpc09iamVjdChyZXN1bHQpID8gcmVzdWx0IDogdGhpc0JpbmRpbmc7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHdyYXBzIGBmdW5jYCB0byBlbmFibGUgY3VycnlpbmcuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHdyYXAuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgY3JlYXRlV3JhcGAgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYXJpdHkgVGhlIGFyaXR5IG9mIGBmdW5jYC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyB3cmFwcGVkIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZUN1cnJ5KGZ1bmMsIGJpdG1hc2ssIGFyaXR5KSB7XG4gICAgICB2YXIgQ3RvciA9IGNyZWF0ZUN0b3IoZnVuYyk7XG5cbiAgICAgIGZ1bmN0aW9uIHdyYXBwZXIoKSB7XG4gICAgICAgIHZhciBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoLFxuICAgICAgICAgICAgYXJncyA9IEFycmF5KGxlbmd0aCksXG4gICAgICAgICAgICBpbmRleCA9IGxlbmd0aCxcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyID0gZ2V0SG9sZGVyKHdyYXBwZXIpO1xuXG4gICAgICAgIHdoaWxlIChpbmRleC0tKSB7XG4gICAgICAgICAgYXJnc1tpbmRleF0gPSBhcmd1bWVudHNbaW5kZXhdO1xuICAgICAgICB9XG4gICAgICAgIHZhciBob2xkZXJzID0gKGxlbmd0aCA8IDMgJiYgYXJnc1swXSAhPT0gcGxhY2Vob2xkZXIgJiYgYXJnc1tsZW5ndGggLSAxXSAhPT0gcGxhY2Vob2xkZXIpXG4gICAgICAgICAgPyBbXVxuICAgICAgICAgIDogcmVwbGFjZUhvbGRlcnMoYXJncywgcGxhY2Vob2xkZXIpO1xuXG4gICAgICAgIGxlbmd0aCAtPSBob2xkZXJzLmxlbmd0aDtcbiAgICAgICAgaWYgKGxlbmd0aCA8IGFyaXR5KSB7XG4gICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlY3VycnkoXG4gICAgICAgICAgICBmdW5jLCBiaXRtYXNrLCBjcmVhdGVIeWJyaWQsIHdyYXBwZXIucGxhY2Vob2xkZXIsIHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGFyZ3MsIGhvbGRlcnMsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBhcml0eSAtIGxlbmd0aCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGZuID0gKHRoaXMgJiYgdGhpcyAhPT0gcm9vdCAmJiB0aGlzIGluc3RhbmNlb2Ygd3JhcHBlcikgPyBDdG9yIDogZnVuYztcbiAgICAgICAgcmV0dXJuIGFwcGx5KGZuLCB0aGlzLCBhcmdzKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB3cmFwcGVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBgXy5maW5kYCBvciBgXy5maW5kTGFzdGAgZnVuY3Rpb24uXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZpbmRJbmRleEZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGZpbmQgdGhlIGNvbGxlY3Rpb24gaW5kZXguXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZmluZCBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVGaW5kKGZpbmRJbmRleEZ1bmMpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihjb2xsZWN0aW9uLCBwcmVkaWNhdGUsIGZyb21JbmRleCkge1xuICAgICAgICB2YXIgaXRlcmFibGUgPSBPYmplY3QoY29sbGVjdGlvbik7XG4gICAgICAgIGlmICghaXNBcnJheUxpa2UoY29sbGVjdGlvbikpIHtcbiAgICAgICAgICB2YXIgaXRlcmF0ZWUgPSBnZXRJdGVyYXRlZShwcmVkaWNhdGUsIDMpO1xuICAgICAgICAgIGNvbGxlY3Rpb24gPSBrZXlzKGNvbGxlY3Rpb24pO1xuICAgICAgICAgIHByZWRpY2F0ZSA9IGZ1bmN0aW9uKGtleSkgeyByZXR1cm4gaXRlcmF0ZWUoaXRlcmFibGVba2V5XSwga2V5LCBpdGVyYWJsZSk7IH07XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGluZGV4ID0gZmluZEluZGV4RnVuYyhjb2xsZWN0aW9uLCBwcmVkaWNhdGUsIGZyb21JbmRleCk7XG4gICAgICAgIHJldHVybiBpbmRleCA+IC0xID8gaXRlcmFibGVbaXRlcmF0ZWUgPyBjb2xsZWN0aW9uW2luZGV4XSA6IGluZGV4XSA6IHVuZGVmaW5lZDtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGBfLmZsb3dgIG9yIGBfLmZsb3dSaWdodGAgZnVuY3Rpb24uXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Zyb21SaWdodF0gU3BlY2lmeSBpdGVyYXRpbmcgZnJvbSByaWdodCB0byBsZWZ0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZsb3cgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlRmxvdyhmcm9tUmlnaHQpIHtcbiAgICAgIHJldHVybiBmbGF0UmVzdChmdW5jdGlvbihmdW5jcykge1xuICAgICAgICB2YXIgbGVuZ3RoID0gZnVuY3MubGVuZ3RoLFxuICAgICAgICAgICAgaW5kZXggPSBsZW5ndGgsXG4gICAgICAgICAgICBwcmVyZXEgPSBMb2Rhc2hXcmFwcGVyLnByb3RvdHlwZS50aHJ1O1xuXG4gICAgICAgIGlmIChmcm9tUmlnaHQpIHtcbiAgICAgICAgICBmdW5jcy5yZXZlcnNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKGluZGV4LS0pIHtcbiAgICAgICAgICB2YXIgZnVuYyA9IGZ1bmNzW2luZGV4XTtcbiAgICAgICAgICBpZiAodHlwZW9mIGZ1bmMgIT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocHJlcmVxICYmICF3cmFwcGVyICYmIGdldEZ1bmNOYW1lKGZ1bmMpID09ICd3cmFwcGVyJykge1xuICAgICAgICAgICAgdmFyIHdyYXBwZXIgPSBuZXcgTG9kYXNoV3JhcHBlcihbXSwgdHJ1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGluZGV4ID0gd3JhcHBlciA/IGluZGV4IDogbGVuZ3RoO1xuICAgICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICAgIGZ1bmMgPSBmdW5jc1tpbmRleF07XG5cbiAgICAgICAgICB2YXIgZnVuY05hbWUgPSBnZXRGdW5jTmFtZShmdW5jKSxcbiAgICAgICAgICAgICAgZGF0YSA9IGZ1bmNOYW1lID09ICd3cmFwcGVyJyA/IGdldERhdGEoZnVuYykgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgICBpZiAoZGF0YSAmJiBpc0xhemlhYmxlKGRhdGFbMF0pICYmXG4gICAgICAgICAgICAgICAgZGF0YVsxXSA9PSAoV1JBUF9BUllfRkxBRyB8IFdSQVBfQ1VSUllfRkxBRyB8IFdSQVBfUEFSVElBTF9GTEFHIHwgV1JBUF9SRUFSR19GTEFHKSAmJlxuICAgICAgICAgICAgICAgICFkYXRhWzRdLmxlbmd0aCAmJiBkYXRhWzldID09IDFcbiAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICB3cmFwcGVyID0gd3JhcHBlcltnZXRGdW5jTmFtZShkYXRhWzBdKV0uYXBwbHkod3JhcHBlciwgZGF0YVszXSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHdyYXBwZXIgPSAoZnVuYy5sZW5ndGggPT0gMSAmJiBpc0xhemlhYmxlKGZ1bmMpKVxuICAgICAgICAgICAgICA/IHdyYXBwZXJbZnVuY05hbWVdKClcbiAgICAgICAgICAgICAgOiB3cmFwcGVyLnRocnUoZnVuYyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgICB2YXIgYXJncyA9IGFyZ3VtZW50cyxcbiAgICAgICAgICAgICAgdmFsdWUgPSBhcmdzWzBdO1xuXG4gICAgICAgICAgaWYgKHdyYXBwZXIgJiYgYXJncy5sZW5ndGggPT0gMSAmJiBpc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIHdyYXBwZXIucGxhbnQodmFsdWUpLnZhbHVlKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciBpbmRleCA9IDAsXG4gICAgICAgICAgICAgIHJlc3VsdCA9IGxlbmd0aCA/IGZ1bmNzW2luZGV4XS5hcHBseSh0aGlzLCBhcmdzKSA6IHZhbHVlO1xuXG4gICAgICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGZ1bmNzW2luZGV4XS5jYWxsKHRoaXMsIHJlc3VsdCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCB3cmFwcyBgZnVuY2AgdG8gaW52b2tlIGl0IHdpdGggb3B0aW9uYWwgYHRoaXNgXG4gICAgICogYmluZGluZyBvZiBgdGhpc0FyZ2AsIHBhcnRpYWwgYXBwbGljYXRpb24sIGFuZCBjdXJyeWluZy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbnxzdHJpbmd9IGZ1bmMgVGhlIGZ1bmN0aW9uIG9yIG1ldGhvZCBuYW1lIHRvIHdyYXAuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgY3JlYXRlV3JhcGAgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGZ1bmNgLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtwYXJ0aWFsc10gVGhlIGFyZ3VtZW50cyB0byBwcmVwZW5kIHRvIHRob3NlIHByb3ZpZGVkIHRvXG4gICAgICogIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICogQHBhcmFtIHtBcnJheX0gW2hvbGRlcnNdIFRoZSBgcGFydGlhbHNgIHBsYWNlaG9sZGVyIGluZGV4ZXMuXG4gICAgICogQHBhcmFtIHtBcnJheX0gW3BhcnRpYWxzUmlnaHRdIFRoZSBhcmd1bWVudHMgdG8gYXBwZW5kIHRvIHRob3NlIHByb3ZpZGVkXG4gICAgICogIHRvIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICogQHBhcmFtIHtBcnJheX0gW2hvbGRlcnNSaWdodF0gVGhlIGBwYXJ0aWFsc1JpZ2h0YCBwbGFjZWhvbGRlciBpbmRleGVzLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFthcmdQb3NdIFRoZSBhcmd1bWVudCBwb3NpdGlvbnMgb2YgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2FyeV0gVGhlIGFyaXR5IGNhcCBvZiBgZnVuY2AuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFthcml0eV0gVGhlIGFyaXR5IG9mIGBmdW5jYC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyB3cmFwcGVkIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZUh5YnJpZChmdW5jLCBiaXRtYXNrLCB0aGlzQXJnLCBwYXJ0aWFscywgaG9sZGVycywgcGFydGlhbHNSaWdodCwgaG9sZGVyc1JpZ2h0LCBhcmdQb3MsIGFyeSwgYXJpdHkpIHtcbiAgICAgIHZhciBpc0FyeSA9IGJpdG1hc2sgJiBXUkFQX0FSWV9GTEFHLFxuICAgICAgICAgIGlzQmluZCA9IGJpdG1hc2sgJiBXUkFQX0JJTkRfRkxBRyxcbiAgICAgICAgICBpc0JpbmRLZXkgPSBiaXRtYXNrICYgV1JBUF9CSU5EX0tFWV9GTEFHLFxuICAgICAgICAgIGlzQ3VycmllZCA9IGJpdG1hc2sgJiAoV1JBUF9DVVJSWV9GTEFHIHwgV1JBUF9DVVJSWV9SSUdIVF9GTEFHKSxcbiAgICAgICAgICBpc0ZsaXAgPSBiaXRtYXNrICYgV1JBUF9GTElQX0ZMQUcsXG4gICAgICAgICAgQ3RvciA9IGlzQmluZEtleSA/IHVuZGVmaW5lZCA6IGNyZWF0ZUN0b3IoZnVuYyk7XG5cbiAgICAgIGZ1bmN0aW9uIHdyYXBwZXIoKSB7XG4gICAgICAgIHZhciBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoLFxuICAgICAgICAgICAgYXJncyA9IEFycmF5KGxlbmd0aCksXG4gICAgICAgICAgICBpbmRleCA9IGxlbmd0aDtcblxuICAgICAgICB3aGlsZSAoaW5kZXgtLSkge1xuICAgICAgICAgIGFyZ3NbaW5kZXhdID0gYXJndW1lbnRzW2luZGV4XTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNDdXJyaWVkKSB7XG4gICAgICAgICAgdmFyIHBsYWNlaG9sZGVyID0gZ2V0SG9sZGVyKHdyYXBwZXIpLFxuICAgICAgICAgICAgICBob2xkZXJzQ291bnQgPSBjb3VudEhvbGRlcnMoYXJncywgcGxhY2Vob2xkZXIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXJ0aWFscykge1xuICAgICAgICAgIGFyZ3MgPSBjb21wb3NlQXJncyhhcmdzLCBwYXJ0aWFscywgaG9sZGVycywgaXNDdXJyaWVkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFydGlhbHNSaWdodCkge1xuICAgICAgICAgIGFyZ3MgPSBjb21wb3NlQXJnc1JpZ2h0KGFyZ3MsIHBhcnRpYWxzUmlnaHQsIGhvbGRlcnNSaWdodCwgaXNDdXJyaWVkKTtcbiAgICAgICAgfVxuICAgICAgICBsZW5ndGggLT0gaG9sZGVyc0NvdW50O1xuICAgICAgICBpZiAoaXNDdXJyaWVkICYmIGxlbmd0aCA8IGFyaXR5KSB7XG4gICAgICAgICAgdmFyIG5ld0hvbGRlcnMgPSByZXBsYWNlSG9sZGVycyhhcmdzLCBwbGFjZWhvbGRlcik7XG4gICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlY3VycnkoXG4gICAgICAgICAgICBmdW5jLCBiaXRtYXNrLCBjcmVhdGVIeWJyaWQsIHdyYXBwZXIucGxhY2Vob2xkZXIsIHRoaXNBcmcsXG4gICAgICAgICAgICBhcmdzLCBuZXdIb2xkZXJzLCBhcmdQb3MsIGFyeSwgYXJpdHkgLSBsZW5ndGhcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHZhciB0aGlzQmluZGluZyA9IGlzQmluZCA/IHRoaXNBcmcgOiB0aGlzLFxuICAgICAgICAgICAgZm4gPSBpc0JpbmRLZXkgPyB0aGlzQmluZGluZ1tmdW5jXSA6IGZ1bmM7XG5cbiAgICAgICAgbGVuZ3RoID0gYXJncy5sZW5ndGg7XG4gICAgICAgIGlmIChhcmdQb3MpIHtcbiAgICAgICAgICBhcmdzID0gcmVvcmRlcihhcmdzLCBhcmdQb3MpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzRmxpcCAmJiBsZW5ndGggPiAxKSB7XG4gICAgICAgICAgYXJncy5yZXZlcnNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzQXJ5ICYmIGFyeSA8IGxlbmd0aCkge1xuICAgICAgICAgIGFyZ3MubGVuZ3RoID0gYXJ5O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzICYmIHRoaXMgIT09IHJvb3QgJiYgdGhpcyBpbnN0YW5jZW9mIHdyYXBwZXIpIHtcbiAgICAgICAgICBmbiA9IEN0b3IgfHwgY3JlYXRlQ3Rvcihmbik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZuLmFwcGx5KHRoaXNCaW5kaW5nLCBhcmdzKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB3cmFwcGVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiBsaWtlIGBfLmludmVydEJ5YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gc2V0dGVyIFRoZSBmdW5jdGlvbiB0byBzZXQgYWNjdW11bGF0b3IgdmFsdWVzLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHRvSXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIHRvIHJlc29sdmUgaXRlcmF0ZWVzLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGludmVydGVyIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZUludmVydGVyKHNldHRlciwgdG9JdGVyYXRlZSkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKG9iamVjdCwgaXRlcmF0ZWUpIHtcbiAgICAgICAgcmV0dXJuIGJhc2VJbnZlcnRlcihvYmplY3QsIHNldHRlciwgdG9JdGVyYXRlZShpdGVyYXRlZSksIHt9KTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgcGVyZm9ybXMgYSBtYXRoZW1hdGljYWwgb3BlcmF0aW9uIG9uIHR3byB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9wZXJhdG9yIFRoZSBmdW5jdGlvbiB0byBwZXJmb3JtIHRoZSBvcGVyYXRpb24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtkZWZhdWx0VmFsdWVdIFRoZSB2YWx1ZSB1c2VkIGZvciBgdW5kZWZpbmVkYCBhcmd1bWVudHMuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgbWF0aGVtYXRpY2FsIG9wZXJhdGlvbiBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVNYXRoT3BlcmF0aW9uKG9wZXJhdG9yLCBkZWZhdWx0VmFsdWUpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbih2YWx1ZSwgb3RoZXIpIHtcbiAgICAgICAgdmFyIHJlc3VsdDtcbiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgJiYgb3RoZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXN1bHQgPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3RoZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGlmIChyZXN1bHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIG90aGVyO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09ICdzdHJpbmcnIHx8IHR5cGVvZiBvdGhlciA9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdmFsdWUgPSBiYXNlVG9TdHJpbmcodmFsdWUpO1xuICAgICAgICAgICAgb3RoZXIgPSBiYXNlVG9TdHJpbmcob3RoZXIpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YWx1ZSA9IGJhc2VUb051bWJlcih2YWx1ZSk7XG4gICAgICAgICAgICBvdGhlciA9IGJhc2VUb051bWJlcihvdGhlcik7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlc3VsdCA9IG9wZXJhdG9yKHZhbHVlLCBvdGhlcik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIGxpa2UgYF8ub3ZlcmAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGFycmF5RnVuYyBUaGUgZnVuY3Rpb24gdG8gaXRlcmF0ZSBvdmVyIGl0ZXJhdGVlcy5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBvdmVyIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZU92ZXIoYXJyYXlGdW5jKSB7XG4gICAgICByZXR1cm4gZmxhdFJlc3QoZnVuY3Rpb24oaXRlcmF0ZWVzKSB7XG4gICAgICAgIGl0ZXJhdGVlcyA9IGFycmF5TWFwKGl0ZXJhdGVlcywgYmFzZVVuYXJ5KGdldEl0ZXJhdGVlKCkpKTtcbiAgICAgICAgcmV0dXJuIGJhc2VSZXN0KGZ1bmN0aW9uKGFyZ3MpIHtcbiAgICAgICAgICB2YXIgdGhpc0FyZyA9IHRoaXM7XG4gICAgICAgICAgcmV0dXJuIGFycmF5RnVuYyhpdGVyYXRlZXMsIGZ1bmN0aW9uKGl0ZXJhdGVlKSB7XG4gICAgICAgICAgICByZXR1cm4gYXBwbHkoaXRlcmF0ZWUsIHRoaXNBcmcsIGFyZ3MpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgdGhlIHBhZGRpbmcgZm9yIGBzdHJpbmdgIGJhc2VkIG9uIGBsZW5ndGhgLiBUaGUgYGNoYXJzYCBzdHJpbmdcbiAgICAgKiBpcyB0cnVuY2F0ZWQgaWYgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGV4Y2VlZHMgYGxlbmd0aGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBsZW5ndGggVGhlIHBhZGRpbmcgbGVuZ3RoLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbY2hhcnM9JyAnXSBUaGUgc3RyaW5nIHVzZWQgYXMgcGFkZGluZy5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBwYWRkaW5nIGZvciBgc3RyaW5nYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVQYWRkaW5nKGxlbmd0aCwgY2hhcnMpIHtcbiAgICAgIGNoYXJzID0gY2hhcnMgPT09IHVuZGVmaW5lZCA/ICcgJyA6IGJhc2VUb1N0cmluZyhjaGFycyk7XG5cbiAgICAgIHZhciBjaGFyc0xlbmd0aCA9IGNoYXJzLmxlbmd0aDtcbiAgICAgIGlmIChjaGFyc0xlbmd0aCA8IDIpIHtcbiAgICAgICAgcmV0dXJuIGNoYXJzTGVuZ3RoID8gYmFzZVJlcGVhdChjaGFycywgbGVuZ3RoKSA6IGNoYXJzO1xuICAgICAgfVxuICAgICAgdmFyIHJlc3VsdCA9IGJhc2VSZXBlYXQoY2hhcnMsIG5hdGl2ZUNlaWwobGVuZ3RoIC8gc3RyaW5nU2l6ZShjaGFycykpKTtcbiAgICAgIHJldHVybiBoYXNVbmljb2RlKGNoYXJzKVxuICAgICAgICA/IGNhc3RTbGljZShzdHJpbmdUb0FycmF5KHJlc3VsdCksIDAsIGxlbmd0aCkuam9pbignJylcbiAgICAgICAgOiByZXN1bHQuc2xpY2UoMCwgbGVuZ3RoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCB3cmFwcyBgZnVuY2AgdG8gaW52b2tlIGl0IHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nXG4gICAgICogb2YgYHRoaXNBcmdgIGFuZCBgcGFydGlhbHNgIHByZXBlbmRlZCB0byB0aGUgYXJndW1lbnRzIGl0IHJlY2VpdmVzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB3cmFwLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGNyZWF0ZVdyYXBgIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICogQHBhcmFtIHsqfSB0aGlzQXJnIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgZnVuY2AuXG4gICAgICogQHBhcmFtIHtBcnJheX0gcGFydGlhbHMgVGhlIGFyZ3VtZW50cyB0byBwcmVwZW5kIHRvIHRob3NlIHByb3ZpZGVkIHRvXG4gICAgICogIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgd3JhcHBlZCBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGVQYXJ0aWFsKGZ1bmMsIGJpdG1hc2ssIHRoaXNBcmcsIHBhcnRpYWxzKSB7XG4gICAgICB2YXIgaXNCaW5kID0gYml0bWFzayAmIFdSQVBfQklORF9GTEFHLFxuICAgICAgICAgIEN0b3IgPSBjcmVhdGVDdG9yKGZ1bmMpO1xuXG4gICAgICBmdW5jdGlvbiB3cmFwcGVyKCkge1xuICAgICAgICB2YXIgYXJnc0luZGV4ID0gLTEsXG4gICAgICAgICAgICBhcmdzTGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aCxcbiAgICAgICAgICAgIGxlZnRJbmRleCA9IC0xLFxuICAgICAgICAgICAgbGVmdExlbmd0aCA9IHBhcnRpYWxzLmxlbmd0aCxcbiAgICAgICAgICAgIGFyZ3MgPSBBcnJheShsZWZ0TGVuZ3RoICsgYXJnc0xlbmd0aCksXG4gICAgICAgICAgICBmbiA9ICh0aGlzICYmIHRoaXMgIT09IHJvb3QgJiYgdGhpcyBpbnN0YW5jZW9mIHdyYXBwZXIpID8gQ3RvciA6IGZ1bmM7XG5cbiAgICAgICAgd2hpbGUgKCsrbGVmdEluZGV4IDwgbGVmdExlbmd0aCkge1xuICAgICAgICAgIGFyZ3NbbGVmdEluZGV4XSA9IHBhcnRpYWxzW2xlZnRJbmRleF07XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKGFyZ3NMZW5ndGgtLSkge1xuICAgICAgICAgIGFyZ3NbbGVmdEluZGV4KytdID0gYXJndW1lbnRzWysrYXJnc0luZGV4XTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXBwbHkoZm4sIGlzQmluZCA/IHRoaXNBcmcgOiB0aGlzLCBhcmdzKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB3cmFwcGVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBgXy5yYW5nZWAgb3IgYF8ucmFuZ2VSaWdodGAgZnVuY3Rpb24uXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Zyb21SaWdodF0gU3BlY2lmeSBpdGVyYXRpbmcgZnJvbSByaWdodCB0byBsZWZ0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHJhbmdlIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZVJhbmdlKGZyb21SaWdodCkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKHN0YXJ0LCBlbmQsIHN0ZXApIHtcbiAgICAgICAgaWYgKHN0ZXAgJiYgdHlwZW9mIHN0ZXAgIT0gJ251bWJlcicgJiYgaXNJdGVyYXRlZUNhbGwoc3RhcnQsIGVuZCwgc3RlcCkpIHtcbiAgICAgICAgICBlbmQgPSBzdGVwID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIC8vIEVuc3VyZSB0aGUgc2lnbiBvZiBgLTBgIGlzIHByZXNlcnZlZC5cbiAgICAgICAgc3RhcnQgPSB0b0Zpbml0ZShzdGFydCk7XG4gICAgICAgIGlmIChlbmQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGVuZCA9IHN0YXJ0O1xuICAgICAgICAgIHN0YXJ0ID0gMDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlbmQgPSB0b0Zpbml0ZShlbmQpO1xuICAgICAgICB9XG4gICAgICAgIHN0ZXAgPSBzdGVwID09PSB1bmRlZmluZWQgPyAoc3RhcnQgPCBlbmQgPyAxIDogLTEpIDogdG9GaW5pdGUoc3RlcCk7XG4gICAgICAgIHJldHVybiBiYXNlUmFuZ2Uoc3RhcnQsIGVuZCwgc3RlcCwgZnJvbVJpZ2h0KTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgcGVyZm9ybXMgYSByZWxhdGlvbmFsIG9wZXJhdGlvbiBvbiB0d28gdmFsdWVzLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvcGVyYXRvciBUaGUgZnVuY3Rpb24gdG8gcGVyZm9ybSB0aGUgb3BlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHJlbGF0aW9uYWwgb3BlcmF0aW9uIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZVJlbGF0aW9uYWxPcGVyYXRpb24ob3BlcmF0b3IpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbih2YWx1ZSwgb3RoZXIpIHtcbiAgICAgICAgaWYgKCEodHlwZW9mIHZhbHVlID09ICdzdHJpbmcnICYmIHR5cGVvZiBvdGhlciA9PSAnc3RyaW5nJykpIHtcbiAgICAgICAgICB2YWx1ZSA9IHRvTnVtYmVyKHZhbHVlKTtcbiAgICAgICAgICBvdGhlciA9IHRvTnVtYmVyKG90aGVyKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb3BlcmF0b3IodmFsdWUsIG90aGVyKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgd3JhcHMgYGZ1bmNgIHRvIGNvbnRpbnVlIGN1cnJ5aW5nLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB3cmFwLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGNyZWF0ZVdyYXBgIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gd3JhcEZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGNyZWF0ZSB0aGUgYGZ1bmNgIHdyYXBwZXIuXG4gICAgICogQHBhcmFtIHsqfSBwbGFjZWhvbGRlciBUaGUgcGxhY2Vob2xkZXIgdmFsdWUuXG4gICAgICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBmdW5jYC5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbcGFydGlhbHNdIFRoZSBhcmd1bWVudHMgdG8gcHJlcGVuZCB0byB0aG9zZSBwcm92aWRlZCB0b1xuICAgICAqICB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFtob2xkZXJzXSBUaGUgYHBhcnRpYWxzYCBwbGFjZWhvbGRlciBpbmRleGVzLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IFthcmdQb3NdIFRoZSBhcmd1bWVudCBwb3NpdGlvbnMgb2YgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2FyeV0gVGhlIGFyaXR5IGNhcCBvZiBgZnVuY2AuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFthcml0eV0gVGhlIGFyaXR5IG9mIGBmdW5jYC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyB3cmFwcGVkIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZVJlY3VycnkoZnVuYywgYml0bWFzaywgd3JhcEZ1bmMsIHBsYWNlaG9sZGVyLCB0aGlzQXJnLCBwYXJ0aWFscywgaG9sZGVycywgYXJnUG9zLCBhcnksIGFyaXR5KSB7XG4gICAgICB2YXIgaXNDdXJyeSA9IGJpdG1hc2sgJiBXUkFQX0NVUlJZX0ZMQUcsXG4gICAgICAgICAgbmV3SG9sZGVycyA9IGlzQ3VycnkgPyBob2xkZXJzIDogdW5kZWZpbmVkLFxuICAgICAgICAgIG5ld0hvbGRlcnNSaWdodCA9IGlzQ3VycnkgPyB1bmRlZmluZWQgOiBob2xkZXJzLFxuICAgICAgICAgIG5ld1BhcnRpYWxzID0gaXNDdXJyeSA/IHBhcnRpYWxzIDogdW5kZWZpbmVkLFxuICAgICAgICAgIG5ld1BhcnRpYWxzUmlnaHQgPSBpc0N1cnJ5ID8gdW5kZWZpbmVkIDogcGFydGlhbHM7XG5cbiAgICAgIGJpdG1hc2sgfD0gKGlzQ3VycnkgPyBXUkFQX1BBUlRJQUxfRkxBRyA6IFdSQVBfUEFSVElBTF9SSUdIVF9GTEFHKTtcbiAgICAgIGJpdG1hc2sgJj0gfihpc0N1cnJ5ID8gV1JBUF9QQVJUSUFMX1JJR0hUX0ZMQUcgOiBXUkFQX1BBUlRJQUxfRkxBRyk7XG5cbiAgICAgIGlmICghKGJpdG1hc2sgJiBXUkFQX0NVUlJZX0JPVU5EX0ZMQUcpKSB7XG4gICAgICAgIGJpdG1hc2sgJj0gfihXUkFQX0JJTkRfRkxBRyB8IFdSQVBfQklORF9LRVlfRkxBRyk7XG4gICAgICB9XG4gICAgICB2YXIgbmV3RGF0YSA9IFtcbiAgICAgICAgZnVuYywgYml0bWFzaywgdGhpc0FyZywgbmV3UGFydGlhbHMsIG5ld0hvbGRlcnMsIG5ld1BhcnRpYWxzUmlnaHQsXG4gICAgICAgIG5ld0hvbGRlcnNSaWdodCwgYXJnUG9zLCBhcnksIGFyaXR5XG4gICAgICBdO1xuXG4gICAgICB2YXIgcmVzdWx0ID0gd3JhcEZ1bmMuYXBwbHkodW5kZWZpbmVkLCBuZXdEYXRhKTtcbiAgICAgIGlmIChpc0xhemlhYmxlKGZ1bmMpKSB7XG4gICAgICAgIHNldERhdGEocmVzdWx0LCBuZXdEYXRhKTtcbiAgICAgIH1cbiAgICAgIHJlc3VsdC5wbGFjZWhvbGRlciA9IHBsYWNlaG9sZGVyO1xuICAgICAgcmV0dXJuIHNldFdyYXBUb1N0cmluZyhyZXN1bHQsIGZ1bmMsIGJpdG1hc2spO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiBsaWtlIGBfLnJvdW5kYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZE5hbWUgVGhlIG5hbWUgb2YgdGhlIGBNYXRoYCBtZXRob2QgdG8gdXNlIHdoZW4gcm91bmRpbmcuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgcm91bmQgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlUm91bmQobWV0aG9kTmFtZSkge1xuICAgICAgdmFyIGZ1bmMgPSBNYXRoW21ldGhvZE5hbWVdO1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKG51bWJlciwgcHJlY2lzaW9uKSB7XG4gICAgICAgIG51bWJlciA9IHRvTnVtYmVyKG51bWJlcik7XG4gICAgICAgIHByZWNpc2lvbiA9IHByZWNpc2lvbiA9PSBudWxsID8gMCA6IG5hdGl2ZU1pbih0b0ludGVnZXIocHJlY2lzaW9uKSwgMjkyKTtcbiAgICAgICAgaWYgKHByZWNpc2lvbiAmJiBuYXRpdmVJc0Zpbml0ZShudW1iZXIpKSB7XG4gICAgICAgICAgLy8gU2hpZnQgd2l0aCBleHBvbmVudGlhbCBub3RhdGlvbiB0byBhdm9pZCBmbG9hdGluZy1wb2ludCBpc3N1ZXMuXG4gICAgICAgICAgLy8gU2VlIFtNRE5dKGh0dHBzOi8vbWRuLmlvL3JvdW5kI0V4YW1wbGVzKSBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAgICAgIHZhciBwYWlyID0gKHRvU3RyaW5nKG51bWJlcikgKyAnZScpLnNwbGl0KCdlJyksXG4gICAgICAgICAgICAgIHZhbHVlID0gZnVuYyhwYWlyWzBdICsgJ2UnICsgKCtwYWlyWzFdICsgcHJlY2lzaW9uKSk7XG5cbiAgICAgICAgICBwYWlyID0gKHRvU3RyaW5nKHZhbHVlKSArICdlJykuc3BsaXQoJ2UnKTtcbiAgICAgICAgICByZXR1cm4gKyhwYWlyWzBdICsgJ2UnICsgKCtwYWlyWzFdIC0gcHJlY2lzaW9uKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZ1bmMobnVtYmVyKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHNldCBvYmplY3Qgb2YgYHZhbHVlc2AuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHZhbHVlcyBUaGUgdmFsdWVzIHRvIGFkZCB0byB0aGUgc2V0LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBzZXQuXG4gICAgICovXG4gICAgdmFyIGNyZWF0ZVNldCA9ICEoU2V0ICYmICgxIC8gc2V0VG9BcnJheShuZXcgU2V0KFssLTBdKSlbMV0pID09IElORklOSVRZKSA/IG5vb3AgOiBmdW5jdGlvbih2YWx1ZXMpIHtcbiAgICAgIHJldHVybiBuZXcgU2V0KHZhbHVlcyk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBgXy50b1BhaXJzYCBvciBgXy50b1BhaXJzSW5gIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBrZXlzRnVuYyBUaGUgZnVuY3Rpb24gdG8gZ2V0IHRoZSBrZXlzIG9mIGEgZ2l2ZW4gb2JqZWN0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHBhaXJzIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZVRvUGFpcnMoa2V5c0Z1bmMpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihvYmplY3QpIHtcbiAgICAgICAgdmFyIHRhZyA9IGdldFRhZyhvYmplY3QpO1xuICAgICAgICBpZiAodGFnID09IG1hcFRhZykge1xuICAgICAgICAgIHJldHVybiBtYXBUb0FycmF5KG9iamVjdCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRhZyA9PSBzZXRUYWcpIHtcbiAgICAgICAgICByZXR1cm4gc2V0VG9QYWlycyhvYmplY3QpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBiYXNlVG9QYWlycyhvYmplY3QsIGtleXNGdW5jKG9iamVjdCkpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBlaXRoZXIgY3VycmllcyBvciBpbnZva2VzIGBmdW5jYCB3aXRoIG9wdGlvbmFsXG4gICAgICogYHRoaXNgIGJpbmRpbmcgYW5kIHBhcnRpYWxseSBhcHBsaWVkIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbnxzdHJpbmd9IGZ1bmMgVGhlIGZ1bmN0aW9uIG9yIG1ldGhvZCBuYW1lIHRvIHdyYXAuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuXG4gICAgICogICAgMSAtIGBfLmJpbmRgXG4gICAgICogICAgMiAtIGBfLmJpbmRLZXlgXG4gICAgICogICAgNCAtIGBfLmN1cnJ5YCBvciBgXy5jdXJyeVJpZ2h0YCBvZiBhIGJvdW5kIGZ1bmN0aW9uXG4gICAgICogICAgOCAtIGBfLmN1cnJ5YFxuICAgICAqICAgMTYgLSBgXy5jdXJyeVJpZ2h0YFxuICAgICAqICAgMzIgLSBgXy5wYXJ0aWFsYFxuICAgICAqICAgNjQgLSBgXy5wYXJ0aWFsUmlnaHRgXG4gICAgICogIDEyOCAtIGBfLnJlYXJnYFxuICAgICAqICAyNTYgLSBgXy5hcnlgXG4gICAgICogIDUxMiAtIGBfLmZsaXBgXG4gICAgICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBmdW5jYC5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbcGFydGlhbHNdIFRoZSBhcmd1bWVudHMgdG8gYmUgcGFydGlhbGx5IGFwcGxpZWQuXG4gICAgICogQHBhcmFtIHtBcnJheX0gW2hvbGRlcnNdIFRoZSBgcGFydGlhbHNgIHBsYWNlaG9sZGVyIGluZGV4ZXMuXG4gICAgICogQHBhcmFtIHtBcnJheX0gW2FyZ1Bvc10gVGhlIGFyZ3VtZW50IHBvc2l0aW9ucyBvZiB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJ5XSBUaGUgYXJpdHkgY2FwIG9mIGBmdW5jYC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2FyaXR5XSBUaGUgYXJpdHkgb2YgYGZ1bmNgLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHdyYXBwZWQgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlV3JhcChmdW5jLCBiaXRtYXNrLCB0aGlzQXJnLCBwYXJ0aWFscywgaG9sZGVycywgYXJnUG9zLCBhcnksIGFyaXR5KSB7XG4gICAgICB2YXIgaXNCaW5kS2V5ID0gYml0bWFzayAmIFdSQVBfQklORF9LRVlfRkxBRztcbiAgICAgIGlmICghaXNCaW5kS2V5ICYmIHR5cGVvZiBmdW5jICE9ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICAgICAgfVxuICAgICAgdmFyIGxlbmd0aCA9IHBhcnRpYWxzID8gcGFydGlhbHMubGVuZ3RoIDogMDtcbiAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgIGJpdG1hc2sgJj0gfihXUkFQX1BBUlRJQUxfRkxBRyB8IFdSQVBfUEFSVElBTF9SSUdIVF9GTEFHKTtcbiAgICAgICAgcGFydGlhbHMgPSBob2xkZXJzID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgYXJ5ID0gYXJ5ID09PSB1bmRlZmluZWQgPyBhcnkgOiBuYXRpdmVNYXgodG9JbnRlZ2VyKGFyeSksIDApO1xuICAgICAgYXJpdHkgPSBhcml0eSA9PT0gdW5kZWZpbmVkID8gYXJpdHkgOiB0b0ludGVnZXIoYXJpdHkpO1xuICAgICAgbGVuZ3RoIC09IGhvbGRlcnMgPyBob2xkZXJzLmxlbmd0aCA6IDA7XG5cbiAgICAgIGlmIChiaXRtYXNrICYgV1JBUF9QQVJUSUFMX1JJR0hUX0ZMQUcpIHtcbiAgICAgICAgdmFyIHBhcnRpYWxzUmlnaHQgPSBwYXJ0aWFscyxcbiAgICAgICAgICAgIGhvbGRlcnNSaWdodCA9IGhvbGRlcnM7XG5cbiAgICAgICAgcGFydGlhbHMgPSBob2xkZXJzID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgdmFyIGRhdGEgPSBpc0JpbmRLZXkgPyB1bmRlZmluZWQgOiBnZXREYXRhKGZ1bmMpO1xuXG4gICAgICB2YXIgbmV3RGF0YSA9IFtcbiAgICAgICAgZnVuYywgYml0bWFzaywgdGhpc0FyZywgcGFydGlhbHMsIGhvbGRlcnMsIHBhcnRpYWxzUmlnaHQsIGhvbGRlcnNSaWdodCxcbiAgICAgICAgYXJnUG9zLCBhcnksIGFyaXR5XG4gICAgICBdO1xuXG4gICAgICBpZiAoZGF0YSkge1xuICAgICAgICBtZXJnZURhdGEobmV3RGF0YSwgZGF0YSk7XG4gICAgICB9XG4gICAgICBmdW5jID0gbmV3RGF0YVswXTtcbiAgICAgIGJpdG1hc2sgPSBuZXdEYXRhWzFdO1xuICAgICAgdGhpc0FyZyA9IG5ld0RhdGFbMl07XG4gICAgICBwYXJ0aWFscyA9IG5ld0RhdGFbM107XG4gICAgICBob2xkZXJzID0gbmV3RGF0YVs0XTtcbiAgICAgIGFyaXR5ID0gbmV3RGF0YVs5XSA9IG5ld0RhdGFbOV0gPT09IHVuZGVmaW5lZFxuICAgICAgICA/IChpc0JpbmRLZXkgPyAwIDogZnVuYy5sZW5ndGgpXG4gICAgICAgIDogbmF0aXZlTWF4KG5ld0RhdGFbOV0gLSBsZW5ndGgsIDApO1xuXG4gICAgICBpZiAoIWFyaXR5ICYmIGJpdG1hc2sgJiAoV1JBUF9DVVJSWV9GTEFHIHwgV1JBUF9DVVJSWV9SSUdIVF9GTEFHKSkge1xuICAgICAgICBiaXRtYXNrICY9IH4oV1JBUF9DVVJSWV9GTEFHIHwgV1JBUF9DVVJSWV9SSUdIVF9GTEFHKTtcbiAgICAgIH1cbiAgICAgIGlmICghYml0bWFzayB8fCBiaXRtYXNrID09IFdSQVBfQklORF9GTEFHKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBjcmVhdGVCaW5kKGZ1bmMsIGJpdG1hc2ssIHRoaXNBcmcpO1xuICAgICAgfSBlbHNlIGlmIChiaXRtYXNrID09IFdSQVBfQ1VSUllfRkxBRyB8fCBiaXRtYXNrID09IFdSQVBfQ1VSUllfUklHSFRfRkxBRykge1xuICAgICAgICByZXN1bHQgPSBjcmVhdGVDdXJyeShmdW5jLCBiaXRtYXNrLCBhcml0eSk7XG4gICAgICB9IGVsc2UgaWYgKChiaXRtYXNrID09IFdSQVBfUEFSVElBTF9GTEFHIHx8IGJpdG1hc2sgPT0gKFdSQVBfQklORF9GTEFHIHwgV1JBUF9QQVJUSUFMX0ZMQUcpKSAmJiAhaG9sZGVycy5sZW5ndGgpIHtcbiAgICAgICAgcmVzdWx0ID0gY3JlYXRlUGFydGlhbChmdW5jLCBiaXRtYXNrLCB0aGlzQXJnLCBwYXJ0aWFscyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQgPSBjcmVhdGVIeWJyaWQuYXBwbHkodW5kZWZpbmVkLCBuZXdEYXRhKTtcbiAgICAgIH1cbiAgICAgIHZhciBzZXR0ZXIgPSBkYXRhID8gYmFzZVNldERhdGEgOiBzZXREYXRhO1xuICAgICAgcmV0dXJuIHNldFdyYXBUb1N0cmluZyhzZXR0ZXIocmVzdWx0LCBuZXdEYXRhKSwgZnVuYywgYml0bWFzayk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlZCBieSBgXy5kZWZhdWx0c2AgdG8gY3VzdG9taXplIGl0cyBgXy5hc3NpZ25JbmAgdXNlIHRvIGFzc2lnbiBwcm9wZXJ0aWVzXG4gICAgICogb2Ygc291cmNlIG9iamVjdHMgdG8gdGhlIGRlc3RpbmF0aW9uIG9iamVjdCBmb3IgYWxsIGRlc3RpbmF0aW9uIHByb3BlcnRpZXNcbiAgICAgKiB0aGF0IHJlc29sdmUgdG8gYHVuZGVmaW5lZGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gb2JqVmFsdWUgVGhlIGRlc3RpbmF0aW9uIHZhbHVlLlxuICAgICAqIEBwYXJhbSB7Kn0gc3JjVmFsdWUgVGhlIHNvdXJjZSB2YWx1ZS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGFzc2lnbi5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBwYXJlbnQgb2JqZWN0IG9mIGBvYmpWYWx1ZWAuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHZhbHVlIHRvIGFzc2lnbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjdXN0b21EZWZhdWx0c0Fzc2lnbkluKG9ialZhbHVlLCBzcmNWYWx1ZSwga2V5LCBvYmplY3QpIHtcbiAgICAgIGlmIChvYmpWYWx1ZSA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgKGVxKG9ialZhbHVlLCBvYmplY3RQcm90b1trZXldKSAmJiAhaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSkpKSB7XG4gICAgICAgIHJldHVybiBzcmNWYWx1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBvYmpWYWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2VkIGJ5IGBfLmRlZmF1bHRzRGVlcGAgdG8gY3VzdG9taXplIGl0cyBgXy5tZXJnZWAgdXNlIHRvIG1lcmdlIHNvdXJjZVxuICAgICAqIG9iamVjdHMgaW50byBkZXN0aW5hdGlvbiBvYmplY3RzIHRoYXQgYXJlIHBhc3NlZCB0aHJ1LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IG9ialZhbHVlIFRoZSBkZXN0aW5hdGlvbiB2YWx1ZS5cbiAgICAgKiBAcGFyYW0geyp9IHNyY1ZhbHVlIFRoZSBzb3VyY2UgdmFsdWUuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBtZXJnZS5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBwYXJlbnQgb2JqZWN0IG9mIGBvYmpWYWx1ZWAuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgcGFyZW50IG9iamVjdCBvZiBgc3JjVmFsdWVgLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbc3RhY2tdIFRyYWNrcyB0cmF2ZXJzZWQgc291cmNlIHZhbHVlcyBhbmQgdGhlaXIgbWVyZ2VkXG4gICAgICogIGNvdW50ZXJwYXJ0cy5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgdmFsdWUgdG8gYXNzaWduLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGN1c3RvbURlZmF1bHRzTWVyZ2Uob2JqVmFsdWUsIHNyY1ZhbHVlLCBrZXksIG9iamVjdCwgc291cmNlLCBzdGFjaykge1xuICAgICAgaWYgKGlzT2JqZWN0KG9ialZhbHVlKSAmJiBpc09iamVjdChzcmNWYWx1ZSkpIHtcbiAgICAgICAgLy8gUmVjdXJzaXZlbHkgbWVyZ2Ugb2JqZWN0cyBhbmQgYXJyYXlzIChzdXNjZXB0aWJsZSB0byBjYWxsIHN0YWNrIGxpbWl0cykuXG4gICAgICAgIHN0YWNrLnNldChzcmNWYWx1ZSwgb2JqVmFsdWUpO1xuICAgICAgICBiYXNlTWVyZ2Uob2JqVmFsdWUsIHNyY1ZhbHVlLCB1bmRlZmluZWQsIGN1c3RvbURlZmF1bHRzTWVyZ2UsIHN0YWNrKTtcbiAgICAgICAgc3RhY2tbJ2RlbGV0ZSddKHNyY1ZhbHVlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBvYmpWYWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2VkIGJ5IGBfLm9taXRgIHRvIGN1c3RvbWl6ZSBpdHMgYF8uY2xvbmVEZWVwYCB1c2UgdG8gb25seSBjbG9uZSBwbGFpblxuICAgICAqIG9iamVjdHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBpbnNwZWN0LlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSB1bmNsb25lZCB2YWx1ZSBvciBgdW5kZWZpbmVkYCB0byBkZWZlciBjbG9uaW5nIHRvIGBfLmNsb25lRGVlcGAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3VzdG9tT21pdENsb25lKHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNQbGFpbk9iamVjdCh2YWx1ZSkgPyB1bmRlZmluZWQgOiB2YWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VJc0VxdWFsRGVlcGAgZm9yIGFycmF5cyB3aXRoIHN1cHBvcnQgZm9yXG4gICAgICogcGFydGlhbCBkZWVwIGNvbXBhcmlzb25zLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBvdGhlciBUaGUgb3RoZXIgYXJyYXkgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy4gU2VlIGBiYXNlSXNFcXVhbGAgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjdXN0b21pemVyIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29tcGFyaXNvbnMuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZXF1YWxGdW5jIFRoZSBmdW5jdGlvbiB0byBkZXRlcm1pbmUgZXF1aXZhbGVudHMgb2YgdmFsdWVzLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzdGFjayBUcmFja3MgdHJhdmVyc2VkIGBhcnJheWAgYW5kIGBvdGhlcmAgb2JqZWN0cy5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGFycmF5cyBhcmUgZXF1aXZhbGVudCwgZWxzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGVxdWFsQXJyYXlzKGFycmF5LCBvdGhlciwgYml0bWFzaywgY3VzdG9taXplciwgZXF1YWxGdW5jLCBzdGFjaykge1xuICAgICAgdmFyIGlzUGFydGlhbCA9IGJpdG1hc2sgJiBDT01QQVJFX1BBUlRJQUxfRkxBRyxcbiAgICAgICAgICBhcnJMZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICAgICAgb3RoTGVuZ3RoID0gb3RoZXIubGVuZ3RoO1xuXG4gICAgICBpZiAoYXJyTGVuZ3RoICE9IG90aExlbmd0aCAmJiAhKGlzUGFydGlhbCAmJiBvdGhMZW5ndGggPiBhcnJMZW5ndGgpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIC8vIENoZWNrIHRoYXQgY3ljbGljIHZhbHVlcyBhcmUgZXF1YWwuXG4gICAgICB2YXIgYXJyU3RhY2tlZCA9IHN0YWNrLmdldChhcnJheSk7XG4gICAgICB2YXIgb3RoU3RhY2tlZCA9IHN0YWNrLmdldChvdGhlcik7XG4gICAgICBpZiAoYXJyU3RhY2tlZCAmJiBvdGhTdGFja2VkKSB7XG4gICAgICAgIHJldHVybiBhcnJTdGFja2VkID09IG90aGVyICYmIG90aFN0YWNrZWQgPT0gYXJyYXk7XG4gICAgICB9XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICByZXN1bHQgPSB0cnVlLFxuICAgICAgICAgIHNlZW4gPSAoYml0bWFzayAmIENPTVBBUkVfVU5PUkRFUkVEX0ZMQUcpID8gbmV3IFNldENhY2hlIDogdW5kZWZpbmVkO1xuXG4gICAgICBzdGFjay5zZXQoYXJyYXksIG90aGVyKTtcbiAgICAgIHN0YWNrLnNldChvdGhlciwgYXJyYXkpO1xuXG4gICAgICAvLyBJZ25vcmUgbm9uLWluZGV4IHByb3BlcnRpZXMuXG4gICAgICB3aGlsZSAoKytpbmRleCA8IGFyckxlbmd0aCkge1xuICAgICAgICB2YXIgYXJyVmFsdWUgPSBhcnJheVtpbmRleF0sXG4gICAgICAgICAgICBvdGhWYWx1ZSA9IG90aGVyW2luZGV4XTtcblxuICAgICAgICBpZiAoY3VzdG9taXplcikge1xuICAgICAgICAgIHZhciBjb21wYXJlZCA9IGlzUGFydGlhbFxuICAgICAgICAgICAgPyBjdXN0b21pemVyKG90aFZhbHVlLCBhcnJWYWx1ZSwgaW5kZXgsIG90aGVyLCBhcnJheSwgc3RhY2spXG4gICAgICAgICAgICA6IGN1c3RvbWl6ZXIoYXJyVmFsdWUsIG90aFZhbHVlLCBpbmRleCwgYXJyYXksIG90aGVyLCBzdGFjayk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbXBhcmVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBpZiAoY29tcGFyZWQpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXN1bHQgPSBmYWxzZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICAvLyBSZWN1cnNpdmVseSBjb21wYXJlIGFycmF5cyAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLlxuICAgICAgICBpZiAoc2Vlbikge1xuICAgICAgICAgIGlmICghYXJyYXlTb21lKG90aGVyLCBmdW5jdGlvbihvdGhWYWx1ZSwgb3RoSW5kZXgpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWNhY2hlSGFzKHNlZW4sIG90aEluZGV4KSAmJlxuICAgICAgICAgICAgICAgICAgICAoYXJyVmFsdWUgPT09IG90aFZhbHVlIHx8IGVxdWFsRnVuYyhhcnJWYWx1ZSwgb3RoVmFsdWUsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIHN0YWNrKSkpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBzZWVuLnB1c2gob3RoSW5kZXgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSkpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGZhbHNlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKCEoXG4gICAgICAgICAgICAgIGFyclZhbHVlID09PSBvdGhWYWx1ZSB8fFxuICAgICAgICAgICAgICAgIGVxdWFsRnVuYyhhcnJWYWx1ZSwgb3RoVmFsdWUsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIHN0YWNrKVxuICAgICAgICAgICAgKSkge1xuICAgICAgICAgIHJlc3VsdCA9IGZhbHNlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBzdGFja1snZGVsZXRlJ10oYXJyYXkpO1xuICAgICAgc3RhY2tbJ2RlbGV0ZSddKG90aGVyKTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlSXNFcXVhbERlZXBgIGZvciBjb21wYXJpbmcgb2JqZWN0cyBvZlxuICAgICAqIHRoZSBzYW1lIGB0b1N0cmluZ1RhZ2AuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBmdW5jdGlvbiBvbmx5IHN1cHBvcnRzIGNvbXBhcmluZyB2YWx1ZXMgd2l0aCB0YWdzIG9mXG4gICAgICogYEJvb2xlYW5gLCBgRGF0ZWAsIGBFcnJvcmAsIGBOdW1iZXJgLCBgUmVnRXhwYCwgb3IgYFN0cmluZ2AuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvdGhlciBUaGUgb3RoZXIgb2JqZWN0IHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHRhZyBUaGUgYHRvU3RyaW5nVGFnYCBvZiB0aGUgb2JqZWN0cyB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGJhc2VJc0VxdWFsYCBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGN1c3RvbWl6ZXIgVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb21wYXJpc29ucy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBlcXVhbEZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRldGVybWluZSBlcXVpdmFsZW50cyBvZiB2YWx1ZXMuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHN0YWNrIFRyYWNrcyB0cmF2ZXJzZWQgYG9iamVjdGAgYW5kIGBvdGhlcmAgb2JqZWN0cy5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG9iamVjdHMgYXJlIGVxdWl2YWxlbnQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBlcXVhbEJ5VGFnKG9iamVjdCwgb3RoZXIsIHRhZywgYml0bWFzaywgY3VzdG9taXplciwgZXF1YWxGdW5jLCBzdGFjaykge1xuICAgICAgc3dpdGNoICh0YWcpIHtcbiAgICAgICAgY2FzZSBkYXRhVmlld1RhZzpcbiAgICAgICAgICBpZiAoKG9iamVjdC5ieXRlTGVuZ3RoICE9IG90aGVyLmJ5dGVMZW5ndGgpIHx8XG4gICAgICAgICAgICAgIChvYmplY3QuYnl0ZU9mZnNldCAhPSBvdGhlci5ieXRlT2Zmc2V0KSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBvYmplY3QgPSBvYmplY3QuYnVmZmVyO1xuICAgICAgICAgIG90aGVyID0gb3RoZXIuYnVmZmVyO1xuXG4gICAgICAgIGNhc2UgYXJyYXlCdWZmZXJUYWc6XG4gICAgICAgICAgaWYgKChvYmplY3QuYnl0ZUxlbmd0aCAhPSBvdGhlci5ieXRlTGVuZ3RoKSB8fFxuICAgICAgICAgICAgICAhZXF1YWxGdW5jKG5ldyBVaW50OEFycmF5KG9iamVjdCksIG5ldyBVaW50OEFycmF5KG90aGVyKSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICAgICAgY2FzZSBib29sVGFnOlxuICAgICAgICBjYXNlIGRhdGVUYWc6XG4gICAgICAgIGNhc2UgbnVtYmVyVGFnOlxuICAgICAgICAgIC8vIENvZXJjZSBib29sZWFucyB0byBgMWAgb3IgYDBgIGFuZCBkYXRlcyB0byBtaWxsaXNlY29uZHMuXG4gICAgICAgICAgLy8gSW52YWxpZCBkYXRlcyBhcmUgY29lcmNlZCB0byBgTmFOYC5cbiAgICAgICAgICByZXR1cm4gZXEoK29iamVjdCwgK290aGVyKTtcblxuICAgICAgICBjYXNlIGVycm9yVGFnOlxuICAgICAgICAgIHJldHVybiBvYmplY3QubmFtZSA9PSBvdGhlci5uYW1lICYmIG9iamVjdC5tZXNzYWdlID09IG90aGVyLm1lc3NhZ2U7XG5cbiAgICAgICAgY2FzZSByZWdleHBUYWc6XG4gICAgICAgIGNhc2Ugc3RyaW5nVGFnOlxuICAgICAgICAgIC8vIENvZXJjZSByZWdleGVzIHRvIHN0cmluZ3MgYW5kIHRyZWF0IHN0cmluZ3MsIHByaW1pdGl2ZXMgYW5kIG9iamVjdHMsXG4gICAgICAgICAgLy8gYXMgZXF1YWwuIFNlZSBodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtcmVnZXhwLnByb3RvdHlwZS50b3N0cmluZ1xuICAgICAgICAgIC8vIGZvciBtb3JlIGRldGFpbHMuXG4gICAgICAgICAgcmV0dXJuIG9iamVjdCA9PSAob3RoZXIgKyAnJyk7XG5cbiAgICAgICAgY2FzZSBtYXBUYWc6XG4gICAgICAgICAgdmFyIGNvbnZlcnQgPSBtYXBUb0FycmF5O1xuXG4gICAgICAgIGNhc2Ugc2V0VGFnOlxuICAgICAgICAgIHZhciBpc1BhcnRpYWwgPSBiaXRtYXNrICYgQ09NUEFSRV9QQVJUSUFMX0ZMQUc7XG4gICAgICAgICAgY29udmVydCB8fCAoY29udmVydCA9IHNldFRvQXJyYXkpO1xuXG4gICAgICAgICAgaWYgKG9iamVjdC5zaXplICE9IG90aGVyLnNpemUgJiYgIWlzUGFydGlhbCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBBc3N1bWUgY3ljbGljIHZhbHVlcyBhcmUgZXF1YWwuXG4gICAgICAgICAgdmFyIHN0YWNrZWQgPSBzdGFjay5nZXQob2JqZWN0KTtcbiAgICAgICAgICBpZiAoc3RhY2tlZCkge1xuICAgICAgICAgICAgcmV0dXJuIHN0YWNrZWQgPT0gb3RoZXI7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJpdG1hc2sgfD0gQ09NUEFSRV9VTk9SREVSRURfRkxBRztcblxuICAgICAgICAgIC8vIFJlY3Vyc2l2ZWx5IGNvbXBhcmUgb2JqZWN0cyAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLlxuICAgICAgICAgIHN0YWNrLnNldChvYmplY3QsIG90aGVyKTtcbiAgICAgICAgICB2YXIgcmVzdWx0ID0gZXF1YWxBcnJheXMoY29udmVydChvYmplY3QpLCBjb252ZXJ0KG90aGVyKSwgYml0bWFzaywgY3VzdG9taXplciwgZXF1YWxGdW5jLCBzdGFjayk7XG4gICAgICAgICAgc3RhY2tbJ2RlbGV0ZSddKG9iamVjdCk7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcblxuICAgICAgICBjYXNlIHN5bWJvbFRhZzpcbiAgICAgICAgICBpZiAoc3ltYm9sVmFsdWVPZikge1xuICAgICAgICAgICAgcmV0dXJuIHN5bWJvbFZhbHVlT2YuY2FsbChvYmplY3QpID09IHN5bWJvbFZhbHVlT2YuY2FsbChvdGhlcik7XG4gICAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZUlzRXF1YWxEZWVwYCBmb3Igb2JqZWN0cyB3aXRoIHN1cHBvcnQgZm9yXG4gICAgICogcGFydGlhbCBkZWVwIGNvbXBhcmlzb25zLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3RoZXIgVGhlIG90aGVyIG9iamVjdCB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGJhc2VJc0VxdWFsYCBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGN1c3RvbWl6ZXIgVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb21wYXJpc29ucy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBlcXVhbEZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRldGVybWluZSBlcXVpdmFsZW50cyBvZiB2YWx1ZXMuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHN0YWNrIFRyYWNrcyB0cmF2ZXJzZWQgYG9iamVjdGAgYW5kIGBvdGhlcmAgb2JqZWN0cy5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG9iamVjdHMgYXJlIGVxdWl2YWxlbnQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBlcXVhbE9iamVjdHMob2JqZWN0LCBvdGhlciwgYml0bWFzaywgY3VzdG9taXplciwgZXF1YWxGdW5jLCBzdGFjaykge1xuICAgICAgdmFyIGlzUGFydGlhbCA9IGJpdG1hc2sgJiBDT01QQVJFX1BBUlRJQUxfRkxBRyxcbiAgICAgICAgICBvYmpQcm9wcyA9IGdldEFsbEtleXMob2JqZWN0KSxcbiAgICAgICAgICBvYmpMZW5ndGggPSBvYmpQcm9wcy5sZW5ndGgsXG4gICAgICAgICAgb3RoUHJvcHMgPSBnZXRBbGxLZXlzKG90aGVyKSxcbiAgICAgICAgICBvdGhMZW5ndGggPSBvdGhQcm9wcy5sZW5ndGg7XG5cbiAgICAgIGlmIChvYmpMZW5ndGggIT0gb3RoTGVuZ3RoICYmICFpc1BhcnRpYWwpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgdmFyIGluZGV4ID0gb2JqTGVuZ3RoO1xuICAgICAgd2hpbGUgKGluZGV4LS0pIHtcbiAgICAgICAgdmFyIGtleSA9IG9ialByb3BzW2luZGV4XTtcbiAgICAgICAgaWYgKCEoaXNQYXJ0aWFsID8ga2V5IGluIG90aGVyIDogaGFzT3duUHJvcGVydHkuY2FsbChvdGhlciwga2V5KSkpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIENoZWNrIHRoYXQgY3ljbGljIHZhbHVlcyBhcmUgZXF1YWwuXG4gICAgICB2YXIgb2JqU3RhY2tlZCA9IHN0YWNrLmdldChvYmplY3QpO1xuICAgICAgdmFyIG90aFN0YWNrZWQgPSBzdGFjay5nZXQob3RoZXIpO1xuICAgICAgaWYgKG9ialN0YWNrZWQgJiYgb3RoU3RhY2tlZCkge1xuICAgICAgICByZXR1cm4gb2JqU3RhY2tlZCA9PSBvdGhlciAmJiBvdGhTdGFja2VkID09IG9iamVjdDtcbiAgICAgIH1cbiAgICAgIHZhciByZXN1bHQgPSB0cnVlO1xuICAgICAgc3RhY2suc2V0KG9iamVjdCwgb3RoZXIpO1xuICAgICAgc3RhY2suc2V0KG90aGVyLCBvYmplY3QpO1xuXG4gICAgICB2YXIgc2tpcEN0b3IgPSBpc1BhcnRpYWw7XG4gICAgICB3aGlsZSAoKytpbmRleCA8IG9iakxlbmd0aCkge1xuICAgICAgICBrZXkgPSBvYmpQcm9wc1tpbmRleF07XG4gICAgICAgIHZhciBvYmpWYWx1ZSA9IG9iamVjdFtrZXldLFxuICAgICAgICAgICAgb3RoVmFsdWUgPSBvdGhlcltrZXldO1xuXG4gICAgICAgIGlmIChjdXN0b21pemVyKSB7XG4gICAgICAgICAgdmFyIGNvbXBhcmVkID0gaXNQYXJ0aWFsXG4gICAgICAgICAgICA/IGN1c3RvbWl6ZXIob3RoVmFsdWUsIG9ialZhbHVlLCBrZXksIG90aGVyLCBvYmplY3QsIHN0YWNrKVxuICAgICAgICAgICAgOiBjdXN0b21pemVyKG9ialZhbHVlLCBvdGhWYWx1ZSwga2V5LCBvYmplY3QsIG90aGVyLCBzdGFjayk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gUmVjdXJzaXZlbHkgY29tcGFyZSBvYmplY3RzIChzdXNjZXB0aWJsZSB0byBjYWxsIHN0YWNrIGxpbWl0cykuXG4gICAgICAgIGlmICghKGNvbXBhcmVkID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgPyAob2JqVmFsdWUgPT09IG90aFZhbHVlIHx8IGVxdWFsRnVuYyhvYmpWYWx1ZSwgb3RoVmFsdWUsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIHN0YWNrKSlcbiAgICAgICAgICAgICAgOiBjb21wYXJlZFxuICAgICAgICAgICAgKSkge1xuICAgICAgICAgIHJlc3VsdCA9IGZhbHNlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHNraXBDdG9yIHx8IChza2lwQ3RvciA9IGtleSA9PSAnY29uc3RydWN0b3InKTtcbiAgICAgIH1cbiAgICAgIGlmIChyZXN1bHQgJiYgIXNraXBDdG9yKSB7XG4gICAgICAgIHZhciBvYmpDdG9yID0gb2JqZWN0LmNvbnN0cnVjdG9yLFxuICAgICAgICAgICAgb3RoQ3RvciA9IG90aGVyLmNvbnN0cnVjdG9yO1xuXG4gICAgICAgIC8vIE5vbiBgT2JqZWN0YCBvYmplY3QgaW5zdGFuY2VzIHdpdGggZGlmZmVyZW50IGNvbnN0cnVjdG9ycyBhcmUgbm90IGVxdWFsLlxuICAgICAgICBpZiAob2JqQ3RvciAhPSBvdGhDdG9yICYmXG4gICAgICAgICAgICAoJ2NvbnN0cnVjdG9yJyBpbiBvYmplY3QgJiYgJ2NvbnN0cnVjdG9yJyBpbiBvdGhlcikgJiZcbiAgICAgICAgICAgICEodHlwZW9mIG9iakN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiBvYmpDdG9yIGluc3RhbmNlb2Ygb2JqQ3RvciAmJlxuICAgICAgICAgICAgICB0eXBlb2Ygb3RoQ3RvciA9PSAnZnVuY3Rpb24nICYmIG90aEN0b3IgaW5zdGFuY2VvZiBvdGhDdG9yKSkge1xuICAgICAgICAgIHJlc3VsdCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBzdGFja1snZGVsZXRlJ10ob2JqZWN0KTtcbiAgICAgIHN0YWNrWydkZWxldGUnXShvdGhlcik7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZVJlc3RgIHdoaWNoIGZsYXR0ZW5zIHRoZSByZXN0IGFycmF5LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBhcHBseSBhIHJlc3QgcGFyYW1ldGVyIHRvLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZsYXRSZXN0KGZ1bmMpIHtcbiAgICAgIHJldHVybiBzZXRUb1N0cmluZyhvdmVyUmVzdChmdW5jLCB1bmRlZmluZWQsIGZsYXR0ZW4pLCBmdW5jICsgJycpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2Ygb3duIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMgYW5kIHN5bWJvbHMgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzIGFuZCBzeW1ib2xzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdldEFsbEtleXMob2JqZWN0KSB7XG4gICAgICByZXR1cm4gYmFzZUdldEFsbEtleXMob2JqZWN0LCBrZXlzLCBnZXRTeW1ib2xzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIG93biBhbmQgaW5oZXJpdGVkIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMgYW5kXG4gICAgICogc3ltYm9scyBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMgYW5kIHN5bWJvbHMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZ2V0QWxsS2V5c0luKG9iamVjdCkge1xuICAgICAgcmV0dXJuIGJhc2VHZXRBbGxLZXlzKG9iamVjdCwga2V5c0luLCBnZXRTeW1ib2xzSW4pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgbWV0YWRhdGEgZm9yIGBmdW5jYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIG1ldGFkYXRhIGZvciBgZnVuY2AuXG4gICAgICovXG4gICAgdmFyIGdldERhdGEgPSAhbWV0YU1hcCA/IG5vb3AgOiBmdW5jdGlvbihmdW5jKSB7XG4gICAgICByZXR1cm4gbWV0YU1hcC5nZXQoZnVuYyk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIG5hbWUgb2YgYGZ1bmNgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBmdW5jdGlvbiBuYW1lLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdldEZ1bmNOYW1lKGZ1bmMpIHtcbiAgICAgIHZhciByZXN1bHQgPSAoZnVuYy5uYW1lICsgJycpLFxuICAgICAgICAgIGFycmF5ID0gcmVhbE5hbWVzW3Jlc3VsdF0sXG4gICAgICAgICAgbGVuZ3RoID0gaGFzT3duUHJvcGVydHkuY2FsbChyZWFsTmFtZXMsIHJlc3VsdCkgPyBhcnJheS5sZW5ndGggOiAwO1xuXG4gICAgICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICAgICAgdmFyIGRhdGEgPSBhcnJheVtsZW5ndGhdLFxuICAgICAgICAgICAgb3RoZXJGdW5jID0gZGF0YS5mdW5jO1xuICAgICAgICBpZiAob3RoZXJGdW5jID09IG51bGwgfHwgb3RoZXJGdW5jID09IGZ1bmMpIHtcbiAgICAgICAgICByZXR1cm4gZGF0YS5uYW1lO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGFyZ3VtZW50IHBsYWNlaG9sZGVyIHZhbHVlIGZvciBgZnVuY2AuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGluc3BlY3QuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHBsYWNlaG9sZGVyIHZhbHVlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdldEhvbGRlcihmdW5jKSB7XG4gICAgICB2YXIgb2JqZWN0ID0gaGFzT3duUHJvcGVydHkuY2FsbChsb2Rhc2gsICdwbGFjZWhvbGRlcicpID8gbG9kYXNoIDogZnVuYztcbiAgICAgIHJldHVybiBvYmplY3QucGxhY2Vob2xkZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgYXBwcm9wcmlhdGUgXCJpdGVyYXRlZVwiIGZ1bmN0aW9uLiBJZiBgXy5pdGVyYXRlZWAgaXMgY3VzdG9taXplZCxcbiAgICAgKiB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGN1c3RvbSBtZXRob2QsIG90aGVyd2lzZSBpdCByZXR1cm5zIGBiYXNlSXRlcmF0ZWVgLlxuICAgICAqIElmIGFyZ3VtZW50cyBhcmUgcHJvdmlkZWQsIHRoZSBjaG9zZW4gZnVuY3Rpb24gaXMgaW52b2tlZCB3aXRoIHRoZW0gYW5kXG4gICAgICogaXRzIHJlc3VsdCBpcyByZXR1cm5lZC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSBbdmFsdWVdIFRoZSB2YWx1ZSB0byBjb252ZXJ0IHRvIGFuIGl0ZXJhdGVlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJpdHldIFRoZSBhcml0eSBvZiB0aGUgY3JlYXRlZCBpdGVyYXRlZS5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIGNob3NlbiBmdW5jdGlvbiBvciBpdHMgcmVzdWx0LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdldEl0ZXJhdGVlKCkge1xuICAgICAgdmFyIHJlc3VsdCA9IGxvZGFzaC5pdGVyYXRlZSB8fCBpdGVyYXRlZTtcbiAgICAgIHJlc3VsdCA9IHJlc3VsdCA9PT0gaXRlcmF0ZWUgPyBiYXNlSXRlcmF0ZWUgOiByZXN1bHQ7XG4gICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IHJlc3VsdChhcmd1bWVudHNbMF0sIGFyZ3VtZW50c1sxXSkgOiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgZGF0YSBmb3IgYG1hcGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBtYXAgVGhlIG1hcCB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSByZWZlcmVuY2Uga2V5LlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBtYXAgZGF0YS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRNYXBEYXRhKG1hcCwga2V5KSB7XG4gICAgICB2YXIgZGF0YSA9IG1hcC5fX2RhdGFfXztcbiAgICAgIHJldHVybiBpc0tleWFibGUoa2V5KVxuICAgICAgICA/IGRhdGFbdHlwZW9mIGtleSA9PSAnc3RyaW5nJyA/ICdzdHJpbmcnIDogJ2hhc2gnXVxuICAgICAgICA6IGRhdGEubWFwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHByb3BlcnR5IG5hbWVzLCB2YWx1ZXMsIGFuZCBjb21wYXJlIGZsYWdzIG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBtYXRjaCBkYXRhIG9mIGBvYmplY3RgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdldE1hdGNoRGF0YShvYmplY3QpIHtcbiAgICAgIHZhciByZXN1bHQgPSBrZXlzKG9iamVjdCksXG4gICAgICAgICAgbGVuZ3RoID0gcmVzdWx0Lmxlbmd0aDtcblxuICAgICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICAgIHZhciBrZXkgPSByZXN1bHRbbGVuZ3RoXSxcbiAgICAgICAgICAgIHZhbHVlID0gb2JqZWN0W2tleV07XG5cbiAgICAgICAgcmVzdWx0W2xlbmd0aF0gPSBba2V5LCB2YWx1ZSwgaXNTdHJpY3RDb21wYXJhYmxlKHZhbHVlKV07XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIG5hdGl2ZSBmdW5jdGlvbiBhdCBga2V5YCBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgbWV0aG9kIHRvIGdldC5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZnVuY3Rpb24gaWYgaXQncyBuYXRpdmUsIGVsc2UgYHVuZGVmaW5lZGAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZ2V0TmF0aXZlKG9iamVjdCwga2V5KSB7XG4gICAgICB2YXIgdmFsdWUgPSBnZXRWYWx1ZShvYmplY3QsIGtleSk7XG4gICAgICByZXR1cm4gYmFzZUlzTmF0aXZlKHZhbHVlKSA/IHZhbHVlIDogdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZUdldFRhZ2Agd2hpY2ggaWdub3JlcyBgU3ltYm9sLnRvU3RyaW5nVGFnYCB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHJhdyBgdG9TdHJpbmdUYWdgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdldFJhd1RhZyh2YWx1ZSkge1xuICAgICAgdmFyIGlzT3duID0gaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwgc3ltVG9TdHJpbmdUYWcpLFxuICAgICAgICAgIHRhZyA9IHZhbHVlW3N5bVRvU3RyaW5nVGFnXTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgdmFsdWVbc3ltVG9TdHJpbmdUYWddID0gdW5kZWZpbmVkO1xuICAgICAgICB2YXIgdW5tYXNrZWQgPSB0cnVlO1xuICAgICAgfSBjYXRjaCAoZSkge31cblxuICAgICAgdmFyIHJlc3VsdCA9IG5hdGl2ZU9iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUpO1xuICAgICAgaWYgKHVubWFza2VkKSB7XG4gICAgICAgIGlmIChpc093bikge1xuICAgICAgICAgIHZhbHVlW3N5bVRvU3RyaW5nVGFnXSA9IHRhZztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkZWxldGUgdmFsdWVbc3ltVG9TdHJpbmdUYWddO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdGhlIG93biBlbnVtZXJhYmxlIHN5bWJvbHMgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHN5bWJvbHMuXG4gICAgICovXG4gICAgdmFyIGdldFN5bWJvbHMgPSAhbmF0aXZlR2V0U3ltYm9scyA/IHN0dWJBcnJheSA6IGZ1bmN0aW9uKG9iamVjdCkge1xuICAgICAgaWYgKG9iamVjdCA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIG9iamVjdCA9IE9iamVjdChvYmplY3QpO1xuICAgICAgcmV0dXJuIGFycmF5RmlsdGVyKG5hdGl2ZUdldFN5bWJvbHMob2JqZWN0KSwgZnVuY3Rpb24oc3ltYm9sKSB7XG4gICAgICAgIHJldHVybiBwcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKG9iamVjdCwgc3ltYm9sKTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHRoZSBvd24gYW5kIGluaGVyaXRlZCBlbnVtZXJhYmxlIHN5bWJvbHMgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHN5bWJvbHMuXG4gICAgICovXG4gICAgdmFyIGdldFN5bWJvbHNJbiA9ICFuYXRpdmVHZXRTeW1ib2xzID8gc3R1YkFycmF5IDogZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgICB3aGlsZSAob2JqZWN0KSB7XG4gICAgICAgIGFycmF5UHVzaChyZXN1bHQsIGdldFN5bWJvbHMob2JqZWN0KSk7XG4gICAgICAgIG9iamVjdCA9IGdldFByb3RvdHlwZShvYmplY3QpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgYHRvU3RyaW5nVGFnYCBvZiBgdmFsdWVgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBgdG9TdHJpbmdUYWdgLlxuICAgICAqL1xuICAgIHZhciBnZXRUYWcgPSBiYXNlR2V0VGFnO1xuXG4gICAgLy8gRmFsbGJhY2sgZm9yIGRhdGEgdmlld3MsIG1hcHMsIHNldHMsIGFuZCB3ZWFrIG1hcHMgaW4gSUUgMTEgYW5kIHByb21pc2VzIGluIE5vZGUuanMgPCA2LlxuICAgIGlmICgoRGF0YVZpZXcgJiYgZ2V0VGFnKG5ldyBEYXRhVmlldyhuZXcgQXJyYXlCdWZmZXIoMSkpKSAhPSBkYXRhVmlld1RhZykgfHxcbiAgICAgICAgKE1hcCAmJiBnZXRUYWcobmV3IE1hcCkgIT0gbWFwVGFnKSB8fFxuICAgICAgICAoUHJvbWlzZSAmJiBnZXRUYWcoUHJvbWlzZS5yZXNvbHZlKCkpICE9IHByb21pc2VUYWcpIHx8XG4gICAgICAgIChTZXQgJiYgZ2V0VGFnKG5ldyBTZXQpICE9IHNldFRhZykgfHxcbiAgICAgICAgKFdlYWtNYXAgJiYgZ2V0VGFnKG5ldyBXZWFrTWFwKSAhPSB3ZWFrTWFwVGFnKSkge1xuICAgICAgZ2V0VGFnID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IGJhc2VHZXRUYWcodmFsdWUpLFxuICAgICAgICAgICAgQ3RvciA9IHJlc3VsdCA9PSBvYmplY3RUYWcgPyB2YWx1ZS5jb25zdHJ1Y3RvciA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGN0b3JTdHJpbmcgPSBDdG9yID8gdG9Tb3VyY2UoQ3RvcikgOiAnJztcblxuICAgICAgICBpZiAoY3RvclN0cmluZykge1xuICAgICAgICAgIHN3aXRjaCAoY3RvclN0cmluZykge1xuICAgICAgICAgICAgY2FzZSBkYXRhVmlld0N0b3JTdHJpbmc6IHJldHVybiBkYXRhVmlld1RhZztcbiAgICAgICAgICAgIGNhc2UgbWFwQ3RvclN0cmluZzogcmV0dXJuIG1hcFRhZztcbiAgICAgICAgICAgIGNhc2UgcHJvbWlzZUN0b3JTdHJpbmc6IHJldHVybiBwcm9taXNlVGFnO1xuICAgICAgICAgICAgY2FzZSBzZXRDdG9yU3RyaW5nOiByZXR1cm4gc2V0VGFnO1xuICAgICAgICAgICAgY2FzZSB3ZWFrTWFwQ3RvclN0cmluZzogcmV0dXJuIHdlYWtNYXBUYWc7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHZpZXcsIGFwcGx5aW5nIGFueSBgdHJhbnNmb3Jtc2AgdG8gdGhlIGBzdGFydGAgYW5kIGBlbmRgIHBvc2l0aW9ucy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0IFRoZSBzdGFydCBvZiB0aGUgdmlldy5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZW5kIFRoZSBlbmQgb2YgdGhlIHZpZXcuXG4gICAgICogQHBhcmFtIHtBcnJheX0gdHJhbnNmb3JtcyBUaGUgdHJhbnNmb3JtYXRpb25zIHRvIGFwcGx5IHRvIHRoZSB2aWV3LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGBzdGFydGAgYW5kIGBlbmRgXG4gICAgICogIHBvc2l0aW9ucyBvZiB0aGUgdmlldy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXRWaWV3KHN0YXJ0LCBlbmQsIHRyYW5zZm9ybXMpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IHRyYW5zZm9ybXMubGVuZ3RoO1xuXG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgZGF0YSA9IHRyYW5zZm9ybXNbaW5kZXhdLFxuICAgICAgICAgICAgc2l6ZSA9IGRhdGEuc2l6ZTtcblxuICAgICAgICBzd2l0Y2ggKGRhdGEudHlwZSkge1xuICAgICAgICAgIGNhc2UgJ2Ryb3AnOiAgICAgIHN0YXJ0ICs9IHNpemU7IGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ2Ryb3BSaWdodCc6IGVuZCAtPSBzaXplOyBicmVhaztcbiAgICAgICAgICBjYXNlICd0YWtlJzogICAgICBlbmQgPSBuYXRpdmVNaW4oZW5kLCBzdGFydCArIHNpemUpOyBicmVhaztcbiAgICAgICAgICBjYXNlICd0YWtlUmlnaHQnOiBzdGFydCA9IG5hdGl2ZU1heChzdGFydCwgZW5kIC0gc2l6ZSk7IGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4geyAnc3RhcnQnOiBzdGFydCwgJ2VuZCc6IGVuZCB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV4dHJhY3RzIHdyYXBwZXIgZGV0YWlscyBmcm9tIHRoZSBgc291cmNlYCBib2R5IGNvbW1lbnQuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2UgVGhlIHNvdXJjZSB0byBpbnNwZWN0LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgd3JhcHBlciBkZXRhaWxzLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdldFdyYXBEZXRhaWxzKHNvdXJjZSkge1xuICAgICAgdmFyIG1hdGNoID0gc291cmNlLm1hdGNoKHJlV3JhcERldGFpbHMpO1xuICAgICAgcmV0dXJuIG1hdGNoID8gbWF0Y2hbMV0uc3BsaXQocmVTcGxpdERldGFpbHMpIDogW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGBwYXRoYCBleGlzdHMgb24gYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCB0byBjaGVjay5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBoYXNGdW5jIFRoZSBmdW5jdGlvbiB0byBjaGVjayBwcm9wZXJ0aWVzLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgcGF0aGAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaGFzUGF0aChvYmplY3QsIHBhdGgsIGhhc0Z1bmMpIHtcbiAgICAgIHBhdGggPSBjYXN0UGF0aChwYXRoLCBvYmplY3QpO1xuXG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBwYXRoLmxlbmd0aCxcbiAgICAgICAgICByZXN1bHQgPSBmYWxzZTtcblxuICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIGtleSA9IHRvS2V5KHBhdGhbaW5kZXhdKTtcbiAgICAgICAgaWYgKCEocmVzdWx0ID0gb2JqZWN0ICE9IG51bGwgJiYgaGFzRnVuYyhvYmplY3QsIGtleSkpKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgb2JqZWN0ID0gb2JqZWN0W2tleV07XG4gICAgICB9XG4gICAgICBpZiAocmVzdWx0IHx8ICsraW5kZXggIT0gbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgICBsZW5ndGggPSBvYmplY3QgPT0gbnVsbCA/IDAgOiBvYmplY3QubGVuZ3RoO1xuICAgICAgcmV0dXJuICEhbGVuZ3RoICYmIGlzTGVuZ3RoKGxlbmd0aCkgJiYgaXNJbmRleChrZXksIGxlbmd0aCkgJiZcbiAgICAgICAgKGlzQXJyYXkob2JqZWN0KSB8fCBpc0FyZ3VtZW50cyhvYmplY3QpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbml0aWFsaXplcyBhbiBhcnJheSBjbG9uZS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGNsb25lLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgaW5pdGlhbGl6ZWQgY2xvbmUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaW5pdENsb25lQXJyYXkoYXJyYXkpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICAgICAgcmVzdWx0ID0gbmV3IGFycmF5LmNvbnN0cnVjdG9yKGxlbmd0aCk7XG5cbiAgICAgIC8vIEFkZCBwcm9wZXJ0aWVzIGFzc2lnbmVkIGJ5IGBSZWdFeHAjZXhlY2AuXG4gICAgICBpZiAobGVuZ3RoICYmIHR5cGVvZiBhcnJheVswXSA9PSAnc3RyaW5nJyAmJiBoYXNPd25Qcm9wZXJ0eS5jYWxsKGFycmF5LCAnaW5kZXgnKSkge1xuICAgICAgICByZXN1bHQuaW5kZXggPSBhcnJheS5pbmRleDtcbiAgICAgICAgcmVzdWx0LmlucHV0ID0gYXJyYXkuaW5wdXQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemVzIGFuIG9iamVjdCBjbG9uZS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGNsb25lLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGluaXRpYWxpemVkIGNsb25lLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGluaXRDbG9uZU9iamVjdChvYmplY3QpIHtcbiAgICAgIHJldHVybiAodHlwZW9mIG9iamVjdC5jb25zdHJ1Y3RvciA9PSAnZnVuY3Rpb24nICYmICFpc1Byb3RvdHlwZShvYmplY3QpKVxuICAgICAgICA/IGJhc2VDcmVhdGUoZ2V0UHJvdG90eXBlKG9iamVjdCkpXG4gICAgICAgIDoge307XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW5pdGlhbGl6ZXMgYW4gb2JqZWN0IGNsb25lIGJhc2VkIG9uIGl0cyBgdG9TdHJpbmdUYWdgLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgZnVuY3Rpb24gb25seSBzdXBwb3J0cyBjbG9uaW5nIHZhbHVlcyB3aXRoIHRhZ3Mgb2ZcbiAgICAgKiBgQm9vbGVhbmAsIGBEYXRlYCwgYEVycm9yYCwgYE1hcGAsIGBOdW1iZXJgLCBgUmVnRXhwYCwgYFNldGAsIG9yIGBTdHJpbmdgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gY2xvbmUuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHRhZyBUaGUgYHRvU3RyaW5nVGFnYCBvZiB0aGUgb2JqZWN0IHRvIGNsb25lLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzRGVlcF0gU3BlY2lmeSBhIGRlZXAgY2xvbmUuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgaW5pdGlhbGl6ZWQgY2xvbmUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaW5pdENsb25lQnlUYWcob2JqZWN0LCB0YWcsIGlzRGVlcCkge1xuICAgICAgdmFyIEN0b3IgPSBvYmplY3QuY29uc3RydWN0b3I7XG4gICAgICBzd2l0Y2ggKHRhZykge1xuICAgICAgICBjYXNlIGFycmF5QnVmZmVyVGFnOlxuICAgICAgICAgIHJldHVybiBjbG9uZUFycmF5QnVmZmVyKG9iamVjdCk7XG5cbiAgICAgICAgY2FzZSBib29sVGFnOlxuICAgICAgICBjYXNlIGRhdGVUYWc6XG4gICAgICAgICAgcmV0dXJuIG5ldyBDdG9yKCtvYmplY3QpO1xuXG4gICAgICAgIGNhc2UgZGF0YVZpZXdUYWc6XG4gICAgICAgICAgcmV0dXJuIGNsb25lRGF0YVZpZXcob2JqZWN0LCBpc0RlZXApO1xuXG4gICAgICAgIGNhc2UgZmxvYXQzMlRhZzogY2FzZSBmbG9hdDY0VGFnOlxuICAgICAgICBjYXNlIGludDhUYWc6IGNhc2UgaW50MTZUYWc6IGNhc2UgaW50MzJUYWc6XG4gICAgICAgIGNhc2UgdWludDhUYWc6IGNhc2UgdWludDhDbGFtcGVkVGFnOiBjYXNlIHVpbnQxNlRhZzogY2FzZSB1aW50MzJUYWc6XG4gICAgICAgICAgcmV0dXJuIGNsb25lVHlwZWRBcnJheShvYmplY3QsIGlzRGVlcCk7XG5cbiAgICAgICAgY2FzZSBtYXBUYWc6XG4gICAgICAgICAgcmV0dXJuIG5ldyBDdG9yO1xuXG4gICAgICAgIGNhc2UgbnVtYmVyVGFnOlxuICAgICAgICBjYXNlIHN0cmluZ1RhZzpcbiAgICAgICAgICByZXR1cm4gbmV3IEN0b3Iob2JqZWN0KTtcblxuICAgICAgICBjYXNlIHJlZ2V4cFRhZzpcbiAgICAgICAgICByZXR1cm4gY2xvbmVSZWdFeHAob2JqZWN0KTtcblxuICAgICAgICBjYXNlIHNldFRhZzpcbiAgICAgICAgICByZXR1cm4gbmV3IEN0b3I7XG5cbiAgICAgICAgY2FzZSBzeW1ib2xUYWc6XG4gICAgICAgICAgcmV0dXJuIGNsb25lU3ltYm9sKG9iamVjdCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW5zZXJ0cyB3cmFwcGVyIGBkZXRhaWxzYCBpbiBhIGNvbW1lbnQgYXQgdGhlIHRvcCBvZiB0aGUgYHNvdXJjZWAgYm9keS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZSBUaGUgc291cmNlIHRvIG1vZGlmeS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IGRldGFpbHMgVGhlIGRldGFpbHMgdG8gaW5zZXJ0LlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIG1vZGlmaWVkIHNvdXJjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpbnNlcnRXcmFwRGV0YWlscyhzb3VyY2UsIGRldGFpbHMpIHtcbiAgICAgIHZhciBsZW5ndGggPSBkZXRhaWxzLmxlbmd0aDtcbiAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBzb3VyY2U7XG4gICAgICB9XG4gICAgICB2YXIgbGFzdEluZGV4ID0gbGVuZ3RoIC0gMTtcbiAgICAgIGRldGFpbHNbbGFzdEluZGV4XSA9IChsZW5ndGggPiAxID8gJyYgJyA6ICcnKSArIGRldGFpbHNbbGFzdEluZGV4XTtcbiAgICAgIGRldGFpbHMgPSBkZXRhaWxzLmpvaW4obGVuZ3RoID4gMiA/ICcsICcgOiAnICcpO1xuICAgICAgcmV0dXJuIHNvdXJjZS5yZXBsYWNlKHJlV3JhcENvbW1lbnQsICd7XFxuLyogW3dyYXBwZWQgd2l0aCAnICsgZGV0YWlscyArICddICovXFxuJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBmbGF0dGVuYWJsZSBgYXJndW1lbnRzYCBvYmplY3Qgb3IgYXJyYXkuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGZsYXR0ZW5hYmxlLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNGbGF0dGVuYWJsZSh2YWx1ZSkge1xuICAgICAgcmV0dXJuIGlzQXJyYXkodmFsdWUpIHx8IGlzQXJndW1lbnRzKHZhbHVlKSB8fFxuICAgICAgICAhIShzcHJlYWRhYmxlU3ltYm9sICYmIHZhbHVlICYmIHZhbHVlW3NwcmVhZGFibGVTeW1ib2xdKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIHZhbGlkIGFycmF5LWxpa2UgaW5kZXguXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbGVuZ3RoPU1BWF9TQUZFX0lOVEVHRVJdIFRoZSB1cHBlciBib3VuZHMgb2YgYSB2YWxpZCBpbmRleC5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHZhbGlkIGluZGV4LCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNJbmRleCh2YWx1ZSwgbGVuZ3RoKSB7XG4gICAgICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgICAgIGxlbmd0aCA9IGxlbmd0aCA9PSBudWxsID8gTUFYX1NBRkVfSU5URUdFUiA6IGxlbmd0aDtcblxuICAgICAgcmV0dXJuICEhbGVuZ3RoICYmXG4gICAgICAgICh0eXBlID09ICdudW1iZXInIHx8XG4gICAgICAgICAgKHR5cGUgIT0gJ3N5bWJvbCcgJiYgcmVJc1VpbnQudGVzdCh2YWx1ZSkpKSAmJlxuICAgICAgICAgICAgKHZhbHVlID4gLTEgJiYgdmFsdWUgJSAxID09IDAgJiYgdmFsdWUgPCBsZW5ndGgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gYXJndW1lbnRzIGFyZSBmcm9tIGFuIGl0ZXJhdGVlIGNhbGwuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHBvdGVudGlhbCBpdGVyYXRlZSB2YWx1ZSBhcmd1bWVudC5cbiAgICAgKiBAcGFyYW0geyp9IGluZGV4IFRoZSBwb3RlbnRpYWwgaXRlcmF0ZWUgaW5kZXggb3Iga2V5IGFyZ3VtZW50LlxuICAgICAqIEBwYXJhbSB7Kn0gb2JqZWN0IFRoZSBwb3RlbnRpYWwgaXRlcmF0ZWUgb2JqZWN0IGFyZ3VtZW50LlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgYXJndW1lbnRzIGFyZSBmcm9tIGFuIGl0ZXJhdGVlIGNhbGwsXG4gICAgICogIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc0l0ZXJhdGVlQ2FsbCh2YWx1ZSwgaW5kZXgsIG9iamVjdCkge1xuICAgICAgaWYgKCFpc09iamVjdChvYmplY3QpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHZhciB0eXBlID0gdHlwZW9mIGluZGV4O1xuICAgICAgaWYgKHR5cGUgPT0gJ251bWJlcidcbiAgICAgICAgICAgID8gKGlzQXJyYXlMaWtlKG9iamVjdCkgJiYgaXNJbmRleChpbmRleCwgb2JqZWN0Lmxlbmd0aCkpXG4gICAgICAgICAgICA6ICh0eXBlID09ICdzdHJpbmcnICYmIGluZGV4IGluIG9iamVjdClcbiAgICAgICAgICApIHtcbiAgICAgICAgcmV0dXJuIGVxKG9iamVjdFtpbmRleF0sIHZhbHVlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIHByb3BlcnR5IG5hbWUgYW5kIG5vdCBhIHByb3BlcnR5IHBhdGguXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0XSBUaGUgb2JqZWN0IHRvIHF1ZXJ5IGtleXMgb24uXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBwcm9wZXJ0eSBuYW1lLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNLZXkodmFsdWUsIG9iamVjdCkge1xuICAgICAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHZhciB0eXBlID0gdHlwZW9mIHZhbHVlO1xuICAgICAgaWYgKHR5cGUgPT0gJ251bWJlcicgfHwgdHlwZSA9PSAnc3ltYm9sJyB8fCB0eXBlID09ICdib29sZWFuJyB8fFxuICAgICAgICAgIHZhbHVlID09IG51bGwgfHwgaXNTeW1ib2wodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlSXNQbGFpblByb3AudGVzdCh2YWx1ZSkgfHwgIXJlSXNEZWVwUHJvcC50ZXN0KHZhbHVlKSB8fFxuICAgICAgICAob2JqZWN0ICE9IG51bGwgJiYgdmFsdWUgaW4gT2JqZWN0KG9iamVjdCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIHN1aXRhYmxlIGZvciB1c2UgYXMgdW5pcXVlIG9iamVjdCBrZXkuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIHN1aXRhYmxlLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNLZXlhYmxlKHZhbHVlKSB7XG4gICAgICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgICAgIHJldHVybiAodHlwZSA9PSAnc3RyaW5nJyB8fCB0eXBlID09ICdudW1iZXInIHx8IHR5cGUgPT0gJ3N5bWJvbCcgfHwgdHlwZSA9PSAnYm9vbGVhbicpXG4gICAgICAgID8gKHZhbHVlICE9PSAnX19wcm90b19fJylcbiAgICAgICAgOiAodmFsdWUgPT09IG51bGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgZnVuY2AgaGFzIGEgbGF6eSBjb3VudGVycGFydC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBmdW5jYCBoYXMgYSBsYXp5IGNvdW50ZXJwYXJ0LFxuICAgICAqICBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNMYXppYWJsZShmdW5jKSB7XG4gICAgICB2YXIgZnVuY05hbWUgPSBnZXRGdW5jTmFtZShmdW5jKSxcbiAgICAgICAgICBvdGhlciA9IGxvZGFzaFtmdW5jTmFtZV07XG5cbiAgICAgIGlmICh0eXBlb2Ygb3RoZXIgIT0gJ2Z1bmN0aW9uJyB8fCAhKGZ1bmNOYW1lIGluIExhenlXcmFwcGVyLnByb3RvdHlwZSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKGZ1bmMgPT09IG90aGVyKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgdmFyIGRhdGEgPSBnZXREYXRhKG90aGVyKTtcbiAgICAgIHJldHVybiAhIWRhdGEgJiYgZnVuYyA9PT0gZGF0YVswXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYGZ1bmNgIGhhcyBpdHMgc291cmNlIG1hc2tlZC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBmdW5jYCBpcyBtYXNrZWQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc01hc2tlZChmdW5jKSB7XG4gICAgICByZXR1cm4gISFtYXNrU3JjS2V5ICYmIChtYXNrU3JjS2V5IGluIGZ1bmMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgZnVuY2AgaXMgY2FwYWJsZSBvZiBiZWluZyBtYXNrZWQuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgZnVuY2AgaXMgbWFza2FibGUsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICB2YXIgaXNNYXNrYWJsZSA9IGNvcmVKc0RhdGEgPyBpc0Z1bmN0aW9uIDogc3R1YkZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgbGlrZWx5IGEgcHJvdG90eXBlIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBwcm90b3R5cGUsIGVsc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc1Byb3RvdHlwZSh2YWx1ZSkge1xuICAgICAgdmFyIEN0b3IgPSB2YWx1ZSAmJiB2YWx1ZS5jb25zdHJ1Y3RvcixcbiAgICAgICAgICBwcm90byA9ICh0eXBlb2YgQ3RvciA9PSAnZnVuY3Rpb24nICYmIEN0b3IucHJvdG90eXBlKSB8fCBvYmplY3RQcm90bztcblxuICAgICAgcmV0dXJuIHZhbHVlID09PSBwcm90bztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBzdWl0YWJsZSBmb3Igc3RyaWN0IGVxdWFsaXR5IGNvbXBhcmlzb25zLCBpLmUuIGA9PT1gLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpZiBzdWl0YWJsZSBmb3Igc3RyaWN0XG4gICAgICogIGVxdWFsaXR5IGNvbXBhcmlzb25zLCBlbHNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNTdHJpY3RDb21wYXJhYmxlKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdmFsdWUgPT09IHZhbHVlICYmICFpc09iamVjdCh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBtYXRjaGVzUHJvcGVydHlgIGZvciBzb3VyY2UgdmFsdWVzIHN1aXRhYmxlXG4gICAgICogZm9yIHN0cmljdCBlcXVhbGl0eSBjb21wYXJpc29ucywgaS5lLiBgPT09YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gICAgICogQHBhcmFtIHsqfSBzcmNWYWx1ZSBUaGUgdmFsdWUgdG8gbWF0Y2guXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgc3BlYyBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtYXRjaGVzU3RyaWN0Q29tcGFyYWJsZShrZXksIHNyY1ZhbHVlKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgICAgIGlmIChvYmplY3QgPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb2JqZWN0W2tleV0gPT09IHNyY1ZhbHVlICYmXG4gICAgICAgICAgKHNyY1ZhbHVlICE9PSB1bmRlZmluZWQgfHwgKGtleSBpbiBPYmplY3Qob2JqZWN0KSkpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8ubWVtb2l6ZWAgd2hpY2ggY2xlYXJzIHRoZSBtZW1vaXplZCBmdW5jdGlvbidzXG4gICAgICogY2FjaGUgd2hlbiBpdCBleGNlZWRzIGBNQVhfTUVNT0laRV9TSVpFYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gaGF2ZSBpdHMgb3V0cHV0IG1lbW9pemVkLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IG1lbW9pemVkIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1lbW9pemVDYXBwZWQoZnVuYykge1xuICAgICAgdmFyIHJlc3VsdCA9IG1lbW9pemUoZnVuYywgZnVuY3Rpb24oa2V5KSB7XG4gICAgICAgIGlmIChjYWNoZS5zaXplID09PSBNQVhfTUVNT0laRV9TSVpFKSB7XG4gICAgICAgICAgY2FjaGUuY2xlYXIoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ga2V5O1xuICAgICAgfSk7XG5cbiAgICAgIHZhciBjYWNoZSA9IHJlc3VsdC5jYWNoZTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWVyZ2VzIHRoZSBmdW5jdGlvbiBtZXRhZGF0YSBvZiBgc291cmNlYCBpbnRvIGBkYXRhYC5cbiAgICAgKlxuICAgICAqIE1lcmdpbmcgbWV0YWRhdGEgcmVkdWNlcyB0aGUgbnVtYmVyIG9mIHdyYXBwZXJzIHVzZWQgdG8gaW52b2tlIGEgZnVuY3Rpb24uXG4gICAgICogVGhpcyBpcyBwb3NzaWJsZSBiZWNhdXNlIG1ldGhvZHMgbGlrZSBgXy5iaW5kYCwgYF8uY3VycnlgLCBhbmQgYF8ucGFydGlhbGBcbiAgICAgKiBtYXkgYmUgYXBwbGllZCByZWdhcmRsZXNzIG9mIGV4ZWN1dGlvbiBvcmRlci4gTWV0aG9kcyBsaWtlIGBfLmFyeWAgYW5kXG4gICAgICogYF8ucmVhcmdgIG1vZGlmeSBmdW5jdGlvbiBhcmd1bWVudHMsIG1ha2luZyB0aGUgb3JkZXIgaW4gd2hpY2ggdGhleSBhcmVcbiAgICAgKiBleGVjdXRlZCBpbXBvcnRhbnQsIHByZXZlbnRpbmcgdGhlIG1lcmdpbmcgb2YgbWV0YWRhdGEuIEhvd2V2ZXIsIHdlIG1ha2VcbiAgICAgKiBhbiBleGNlcHRpb24gZm9yIGEgc2FmZSBjb21iaW5lZCBjYXNlIHdoZXJlIGN1cnJpZWQgZnVuY3Rpb25zIGhhdmUgYF8uYXJ5YFxuICAgICAqIGFuZCBvciBgXy5yZWFyZ2AgYXBwbGllZC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtBcnJheX0gZGF0YSBUaGUgZGVzdGluYXRpb24gbWV0YWRhdGEuXG4gICAgICogQHBhcmFtIHtBcnJheX0gc291cmNlIFRoZSBzb3VyY2UgbWV0YWRhdGEuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBkYXRhYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtZXJnZURhdGEoZGF0YSwgc291cmNlKSB7XG4gICAgICB2YXIgYml0bWFzayA9IGRhdGFbMV0sXG4gICAgICAgICAgc3JjQml0bWFzayA9IHNvdXJjZVsxXSxcbiAgICAgICAgICBuZXdCaXRtYXNrID0gYml0bWFzayB8IHNyY0JpdG1hc2ssXG4gICAgICAgICAgaXNDb21tb24gPSBuZXdCaXRtYXNrIDwgKFdSQVBfQklORF9GTEFHIHwgV1JBUF9CSU5EX0tFWV9GTEFHIHwgV1JBUF9BUllfRkxBRyk7XG5cbiAgICAgIHZhciBpc0NvbWJvID1cbiAgICAgICAgKChzcmNCaXRtYXNrID09IFdSQVBfQVJZX0ZMQUcpICYmIChiaXRtYXNrID09IFdSQVBfQ1VSUllfRkxBRykpIHx8XG4gICAgICAgICgoc3JjQml0bWFzayA9PSBXUkFQX0FSWV9GTEFHKSAmJiAoYml0bWFzayA9PSBXUkFQX1JFQVJHX0ZMQUcpICYmIChkYXRhWzddLmxlbmd0aCA8PSBzb3VyY2VbOF0pKSB8fFxuICAgICAgICAoKHNyY0JpdG1hc2sgPT0gKFdSQVBfQVJZX0ZMQUcgfCBXUkFQX1JFQVJHX0ZMQUcpKSAmJiAoc291cmNlWzddLmxlbmd0aCA8PSBzb3VyY2VbOF0pICYmIChiaXRtYXNrID09IFdSQVBfQ1VSUllfRkxBRykpO1xuXG4gICAgICAvLyBFeGl0IGVhcmx5IGlmIG1ldGFkYXRhIGNhbid0IGJlIG1lcmdlZC5cbiAgICAgIGlmICghKGlzQ29tbW9uIHx8IGlzQ29tYm8pKSB7XG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgfVxuICAgICAgLy8gVXNlIHNvdXJjZSBgdGhpc0FyZ2AgaWYgYXZhaWxhYmxlLlxuICAgICAgaWYgKHNyY0JpdG1hc2sgJiBXUkFQX0JJTkRfRkxBRykge1xuICAgICAgICBkYXRhWzJdID0gc291cmNlWzJdO1xuICAgICAgICAvLyBTZXQgd2hlbiBjdXJyeWluZyBhIGJvdW5kIGZ1bmN0aW9uLlxuICAgICAgICBuZXdCaXRtYXNrIHw9IGJpdG1hc2sgJiBXUkFQX0JJTkRfRkxBRyA/IDAgOiBXUkFQX0NVUlJZX0JPVU5EX0ZMQUc7XG4gICAgICB9XG4gICAgICAvLyBDb21wb3NlIHBhcnRpYWwgYXJndW1lbnRzLlxuICAgICAgdmFyIHZhbHVlID0gc291cmNlWzNdO1xuICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgIHZhciBwYXJ0aWFscyA9IGRhdGFbM107XG4gICAgICAgIGRhdGFbM10gPSBwYXJ0aWFscyA/IGNvbXBvc2VBcmdzKHBhcnRpYWxzLCB2YWx1ZSwgc291cmNlWzRdKSA6IHZhbHVlO1xuICAgICAgICBkYXRhWzRdID0gcGFydGlhbHMgPyByZXBsYWNlSG9sZGVycyhkYXRhWzNdLCBQTEFDRUhPTERFUikgOiBzb3VyY2VbNF07XG4gICAgICB9XG4gICAgICAvLyBDb21wb3NlIHBhcnRpYWwgcmlnaHQgYXJndW1lbnRzLlxuICAgICAgdmFsdWUgPSBzb3VyY2VbNV07XG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgcGFydGlhbHMgPSBkYXRhWzVdO1xuICAgICAgICBkYXRhWzVdID0gcGFydGlhbHMgPyBjb21wb3NlQXJnc1JpZ2h0KHBhcnRpYWxzLCB2YWx1ZSwgc291cmNlWzZdKSA6IHZhbHVlO1xuICAgICAgICBkYXRhWzZdID0gcGFydGlhbHMgPyByZXBsYWNlSG9sZGVycyhkYXRhWzVdLCBQTEFDRUhPTERFUikgOiBzb3VyY2VbNl07XG4gICAgICB9XG4gICAgICAvLyBVc2Ugc291cmNlIGBhcmdQb3NgIGlmIGF2YWlsYWJsZS5cbiAgICAgIHZhbHVlID0gc291cmNlWzddO1xuICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgIGRhdGFbN10gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIC8vIFVzZSBzb3VyY2UgYGFyeWAgaWYgaXQncyBzbWFsbGVyLlxuICAgICAgaWYgKHNyY0JpdG1hc2sgJiBXUkFQX0FSWV9GTEFHKSB7XG4gICAgICAgIGRhdGFbOF0gPSBkYXRhWzhdID09IG51bGwgPyBzb3VyY2VbOF0gOiBuYXRpdmVNaW4oZGF0YVs4XSwgc291cmNlWzhdKTtcbiAgICAgIH1cbiAgICAgIC8vIFVzZSBzb3VyY2UgYGFyaXR5YCBpZiBvbmUgaXMgbm90IHByb3ZpZGVkLlxuICAgICAgaWYgKGRhdGFbOV0gPT0gbnVsbCkge1xuICAgICAgICBkYXRhWzldID0gc291cmNlWzldO1xuICAgICAgfVxuICAgICAgLy8gVXNlIHNvdXJjZSBgZnVuY2AgYW5kIG1lcmdlIGJpdG1hc2tzLlxuICAgICAgZGF0YVswXSA9IHNvdXJjZVswXTtcbiAgICAgIGRhdGFbMV0gPSBuZXdCaXRtYXNrO1xuXG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIGxpa2VcbiAgICAgKiBbYE9iamVjdC5rZXlzYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtb2JqZWN0LmtleXMpXG4gICAgICogZXhjZXB0IHRoYXQgaXQgaW5jbHVkZXMgaW5oZXJpdGVkIGVudW1lcmFibGUgcHJvcGVydGllcy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMuXG4gICAgICovXG4gICAgZnVuY3Rpb24gbmF0aXZlS2V5c0luKG9iamVjdCkge1xuICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgaWYgKG9iamVjdCAhPSBudWxsKSB7XG4gICAgICAgIGZvciAodmFyIGtleSBpbiBPYmplY3Qob2JqZWN0KSkge1xuICAgICAgICAgIHJlc3VsdC5wdXNoKGtleSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHZhbHVlYCB0byBhIHN0cmluZyB1c2luZyBgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZ2AuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgY29udmVydGVkIHN0cmluZy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBvYmplY3RUb1N0cmluZyh2YWx1ZSkge1xuICAgICAgcmV0dXJuIG5hdGl2ZU9iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZVJlc3RgIHdoaWNoIHRyYW5zZm9ybXMgdGhlIHJlc3QgYXJyYXkuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGFwcGx5IGEgcmVzdCBwYXJhbWV0ZXIgdG8uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzdGFydD1mdW5jLmxlbmd0aC0xXSBUaGUgc3RhcnQgcG9zaXRpb24gb2YgdGhlIHJlc3QgcGFyYW1ldGVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHRyYW5zZm9ybSBUaGUgcmVzdCBhcnJheSB0cmFuc2Zvcm0uXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gb3ZlclJlc3QoZnVuYywgc3RhcnQsIHRyYW5zZm9ybSkge1xuICAgICAgc3RhcnQgPSBuYXRpdmVNYXgoc3RhcnQgPT09IHVuZGVmaW5lZCA/IChmdW5jLmxlbmd0aCAtIDEpIDogc3RhcnQsIDApO1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgYXJncyA9IGFyZ3VtZW50cyxcbiAgICAgICAgICAgIGluZGV4ID0gLTEsXG4gICAgICAgICAgICBsZW5ndGggPSBuYXRpdmVNYXgoYXJncy5sZW5ndGggLSBzdGFydCwgMCksXG4gICAgICAgICAgICBhcnJheSA9IEFycmF5KGxlbmd0aCk7XG5cbiAgICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgICBhcnJheVtpbmRleF0gPSBhcmdzW3N0YXJ0ICsgaW5kZXhdO1xuICAgICAgICB9XG4gICAgICAgIGluZGV4ID0gLTE7XG4gICAgICAgIHZhciBvdGhlckFyZ3MgPSBBcnJheShzdGFydCArIDEpO1xuICAgICAgICB3aGlsZSAoKytpbmRleCA8IHN0YXJ0KSB7XG4gICAgICAgICAgb3RoZXJBcmdzW2luZGV4XSA9IGFyZ3NbaW5kZXhdO1xuICAgICAgICB9XG4gICAgICAgIG90aGVyQXJnc1tzdGFydF0gPSB0cmFuc2Zvcm0oYXJyYXkpO1xuICAgICAgICByZXR1cm4gYXBwbHkoZnVuYywgdGhpcywgb3RoZXJBcmdzKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgcGFyZW50IHZhbHVlIGF0IGBwYXRoYCBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHBhdGggVGhlIHBhdGggdG8gZ2V0IHRoZSBwYXJlbnQgdmFsdWUgb2YuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHBhcmVudCB2YWx1ZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBwYXJlbnQob2JqZWN0LCBwYXRoKSB7XG4gICAgICByZXR1cm4gcGF0aC5sZW5ndGggPCAyID8gb2JqZWN0IDogYmFzZUdldChvYmplY3QsIGJhc2VTbGljZShwYXRoLCAwLCAtMSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlb3JkZXIgYGFycmF5YCBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBpbmRleGVzIHdoZXJlIHRoZSBlbGVtZW50IGF0XG4gICAgICogdGhlIGZpcnN0IGluZGV4IGlzIGFzc2lnbmVkIGFzIHRoZSBmaXJzdCBlbGVtZW50LCB0aGUgZWxlbWVudCBhdFxuICAgICAqIHRoZSBzZWNvbmQgaW5kZXggaXMgYXNzaWduZWQgYXMgdGhlIHNlY29uZCBlbGVtZW50LCBhbmQgc28gb24uXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byByZW9yZGVyLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGluZGV4ZXMgVGhlIGFycmFuZ2VkIGFycmF5IGluZGV4ZXMuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gcmVvcmRlcihhcnJheSwgaW5kZXhlcykge1xuICAgICAgdmFyIGFyckxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgICBsZW5ndGggPSBuYXRpdmVNaW4oaW5kZXhlcy5sZW5ndGgsIGFyckxlbmd0aCksXG4gICAgICAgICAgb2xkQXJyYXkgPSBjb3B5QXJyYXkoYXJyYXkpO1xuXG4gICAgICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICAgICAgdmFyIGluZGV4ID0gaW5kZXhlc1tsZW5ndGhdO1xuICAgICAgICBhcnJheVtsZW5ndGhdID0gaXNJbmRleChpbmRleCwgYXJyTGVuZ3RoKSA/IG9sZEFycmF5W2luZGV4XSA6IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhcnJheTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSB2YWx1ZSBhdCBga2V5YCwgdW5sZXNzIGBrZXlgIGlzIFwiX19wcm90b19fXCIgb3IgXCJjb25zdHJ1Y3RvclwiLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHByb3BlcnR5IHZhbHVlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNhZmVHZXQob2JqZWN0LCBrZXkpIHtcbiAgICAgIGlmIChrZXkgPT09ICdjb25zdHJ1Y3RvcicgJiYgdHlwZW9mIG9iamVjdFtrZXldID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGtleSA9PSAnX19wcm90b19fJykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBvYmplY3Rba2V5XTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIG1ldGFkYXRhIGZvciBgZnVuY2AuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogSWYgdGhpcyBmdW5jdGlvbiBiZWNvbWVzIGhvdCwgaS5lLiBpcyBpbnZva2VkIGEgbG90IGluIGEgc2hvcnRcbiAgICAgKiBwZXJpb2Qgb2YgdGltZSwgaXQgd2lsbCB0cmlwIGl0cyBicmVha2VyIGFuZCB0cmFuc2l0aW9uIHRvIGFuIGlkZW50aXR5XG4gICAgICogZnVuY3Rpb24gdG8gYXZvaWQgZ2FyYmFnZSBjb2xsZWN0aW9uIHBhdXNlcyBpbiBWOC4gU2VlXG4gICAgICogW1Y4IGlzc3VlIDIwNzBdKGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTIwNzApXG4gICAgICogZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gYXNzb2NpYXRlIG1ldGFkYXRhIHdpdGguXG4gICAgICogQHBhcmFtIHsqfSBkYXRhIFRoZSBtZXRhZGF0YS5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgYGZ1bmNgLlxuICAgICAqL1xuICAgIHZhciBzZXREYXRhID0gc2hvcnRPdXQoYmFzZVNldERhdGEpO1xuXG4gICAgLyoqXG4gICAgICogQSBzaW1wbGUgd3JhcHBlciBhcm91bmQgdGhlIGdsb2JhbCBbYHNldFRpbWVvdXRgXShodHRwczovL21kbi5pby9zZXRUaW1lb3V0KS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gZGVsYXkuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHdhaXQgVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gZGVsYXkgaW52b2NhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfE9iamVjdH0gUmV0dXJucyB0aGUgdGltZXIgaWQgb3IgdGltZW91dCBvYmplY3QuXG4gICAgICovXG4gICAgdmFyIHNldFRpbWVvdXQgPSBjdHhTZXRUaW1lb3V0IHx8IGZ1bmN0aW9uKGZ1bmMsIHdhaXQpIHtcbiAgICAgIHJldHVybiByb290LnNldFRpbWVvdXQoZnVuYywgd2FpdCk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGB0b1N0cmluZ2AgbWV0aG9kIG9mIGBmdW5jYCB0byByZXR1cm4gYHN0cmluZ2AuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBzdHJpbmcgVGhlIGB0b1N0cmluZ2AgcmVzdWx0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyBgZnVuY2AuXG4gICAgICovXG4gICAgdmFyIHNldFRvU3RyaW5nID0gc2hvcnRPdXQoYmFzZVNldFRvU3RyaW5nKTtcblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGB0b1N0cmluZ2AgbWV0aG9kIG9mIGB3cmFwcGVyYCB0byBtaW1pYyB0aGUgc291cmNlIG9mIGByZWZlcmVuY2VgXG4gICAgICogd2l0aCB3cmFwcGVyIGRldGFpbHMgaW4gYSBjb21tZW50IGF0IHRoZSB0b3Agb2YgdGhlIHNvdXJjZSBib2R5LlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSB3cmFwcGVyIFRoZSBmdW5jdGlvbiB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gcmVmZXJlbmNlIFRoZSByZWZlcmVuY2UgZnVuY3Rpb24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgY3JlYXRlV3JhcGAgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgYHdyYXBwZXJgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNldFdyYXBUb1N0cmluZyh3cmFwcGVyLCByZWZlcmVuY2UsIGJpdG1hc2spIHtcbiAgICAgIHZhciBzb3VyY2UgPSAocmVmZXJlbmNlICsgJycpO1xuICAgICAgcmV0dXJuIHNldFRvU3RyaW5nKHdyYXBwZXIsIGluc2VydFdyYXBEZXRhaWxzKHNvdXJjZSwgdXBkYXRlV3JhcERldGFpbHMoZ2V0V3JhcERldGFpbHMoc291cmNlKSwgYml0bWFzaykpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCdsbCBzaG9ydCBvdXQgYW5kIGludm9rZSBgaWRlbnRpdHlgIGluc3RlYWRcbiAgICAgKiBvZiBgZnVuY2Agd2hlbiBpdCdzIGNhbGxlZCBgSE9UX0NPVU5UYCBvciBtb3JlIHRpbWVzIGluIGBIT1RfU1BBTmBcbiAgICAgKiBtaWxsaXNlY29uZHMuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHJlc3RyaWN0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHNob3J0YWJsZSBmdW5jdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzaG9ydE91dChmdW5jKSB7XG4gICAgICB2YXIgY291bnQgPSAwLFxuICAgICAgICAgIGxhc3RDYWxsZWQgPSAwO1xuXG4gICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBzdGFtcCA9IG5hdGl2ZU5vdygpLFxuICAgICAgICAgICAgcmVtYWluaW5nID0gSE9UX1NQQU4gLSAoc3RhbXAgLSBsYXN0Q2FsbGVkKTtcblxuICAgICAgICBsYXN0Q2FsbGVkID0gc3RhbXA7XG4gICAgICAgIGlmIChyZW1haW5pbmcgPiAwKSB7XG4gICAgICAgICAgaWYgKCsrY291bnQgPj0gSE9UX0NPVU5UKSB7XG4gICAgICAgICAgICByZXR1cm4gYXJndW1lbnRzWzBdO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb3VudCA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZ1bmMuYXBwbHkodW5kZWZpbmVkLCBhcmd1bWVudHMpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uc2h1ZmZsZWAgd2hpY2ggbXV0YXRlcyBhbmQgc2V0cyB0aGUgc2l6ZSBvZiBgYXJyYXlgLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gc2h1ZmZsZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3NpemU9YXJyYXkubGVuZ3RoXSBUaGUgc2l6ZSBvZiBgYXJyYXlgLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNodWZmbGVTZWxmKGFycmF5LCBzaXplKSB7XG4gICAgICB2YXIgaW5kZXggPSAtMSxcbiAgICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICAgICAgbGFzdEluZGV4ID0gbGVuZ3RoIC0gMTtcblxuICAgICAgc2l6ZSA9IHNpemUgPT09IHVuZGVmaW5lZCA/IGxlbmd0aCA6IHNpemU7XG4gICAgICB3aGlsZSAoKytpbmRleCA8IHNpemUpIHtcbiAgICAgICAgdmFyIHJhbmQgPSBiYXNlUmFuZG9tKGluZGV4LCBsYXN0SW5kZXgpLFxuICAgICAgICAgICAgdmFsdWUgPSBhcnJheVtyYW5kXTtcblxuICAgICAgICBhcnJheVtyYW5kXSA9IGFycmF5W2luZGV4XTtcbiAgICAgICAgYXJyYXlbaW5kZXhdID0gdmFsdWU7XG4gICAgICB9XG4gICAgICBhcnJheS5sZW5ndGggPSBzaXplO1xuICAgICAgcmV0dXJuIGFycmF5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGBzdHJpbmdgIHRvIGEgcHJvcGVydHkgcGF0aCBhcnJheS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBwcm9wZXJ0eSBwYXRoIGFycmF5LlxuICAgICAqL1xuICAgIHZhciBzdHJpbmdUb1BhdGggPSBtZW1vaXplQ2FwcGVkKGZ1bmN0aW9uKHN0cmluZykge1xuICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgaWYgKHN0cmluZy5jaGFyQ29kZUF0KDApID09PSA0NiAvKiAuICovKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKCcnKTtcbiAgICAgIH1cbiAgICAgIHN0cmluZy5yZXBsYWNlKHJlUHJvcE5hbWUsIGZ1bmN0aW9uKG1hdGNoLCBudW1iZXIsIHF1b3RlLCBzdWJTdHJpbmcpIHtcbiAgICAgICAgcmVzdWx0LnB1c2gocXVvdGUgPyBzdWJTdHJpbmcucmVwbGFjZShyZUVzY2FwZUNoYXIsICckMScpIDogKG51bWJlciB8fCBtYXRjaCkpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHZhbHVlYCB0byBhIHN0cmluZyBrZXkgaWYgaXQncyBub3QgYSBzdHJpbmcgb3Igc3ltYm9sLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBpbnNwZWN0LlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd8c3ltYm9sfSBSZXR1cm5zIHRoZSBrZXkuXG4gICAgICovXG4gICAgZnVuY3Rpb24gdG9LZXkodmFsdWUpIHtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT0gJ3N0cmluZycgfHwgaXNTeW1ib2wodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIHZhciByZXN1bHQgPSAodmFsdWUgKyAnJyk7XG4gICAgICByZXR1cm4gKHJlc3VsdCA9PSAnMCcgJiYgKDEgLyB2YWx1ZSkgPT0gLUlORklOSVRZKSA/ICctMCcgOiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYGZ1bmNgIHRvIGl0cyBzb3VyY2UgY29kZS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBzb3VyY2UgY29kZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0b1NvdXJjZShmdW5jKSB7XG4gICAgICBpZiAoZnVuYyAhPSBudWxsKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIGZ1bmNUb1N0cmluZy5jYWxsKGZ1bmMpO1xuICAgICAgICB9IGNhdGNoIChlKSB7fVxuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiAoZnVuYyArICcnKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge31cbiAgICAgIH1cbiAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIHdyYXBwZXIgYGRldGFpbHNgIGJhc2VkIG9uIGBiaXRtYXNrYCBmbGFncy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHJldHVybnMge0FycmF5fSBkZXRhaWxzIFRoZSBkZXRhaWxzIHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy4gU2VlIGBjcmVhdGVXcmFwYCBmb3IgbW9yZSBkZXRhaWxzLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgZGV0YWlsc2AuXG4gICAgICovXG4gICAgZnVuY3Rpb24gdXBkYXRlV3JhcERldGFpbHMoZGV0YWlscywgYml0bWFzaykge1xuICAgICAgYXJyYXlFYWNoKHdyYXBGbGFncywgZnVuY3Rpb24ocGFpcikge1xuICAgICAgICB2YXIgdmFsdWUgPSAnXy4nICsgcGFpclswXTtcbiAgICAgICAgaWYgKChiaXRtYXNrICYgcGFpclsxXSkgJiYgIWFycmF5SW5jbHVkZXMoZGV0YWlscywgdmFsdWUpKSB7XG4gICAgICAgICAgZGV0YWlscy5wdXNoKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gZGV0YWlscy5zb3J0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGNsb25lIG9mIGB3cmFwcGVyYC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHdyYXBwZXIgVGhlIHdyYXBwZXIgdG8gY2xvbmUuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY2xvbmVkIHdyYXBwZXIuXG4gICAgICovXG4gICAgZnVuY3Rpb24gd3JhcHBlckNsb25lKHdyYXBwZXIpIHtcbiAgICAgIGlmICh3cmFwcGVyIGluc3RhbmNlb2YgTGF6eVdyYXBwZXIpIHtcbiAgICAgICAgcmV0dXJuIHdyYXBwZXIuY2xvbmUoKTtcbiAgICAgIH1cbiAgICAgIHZhciByZXN1bHQgPSBuZXcgTG9kYXNoV3JhcHBlcih3cmFwcGVyLl9fd3JhcHBlZF9fLCB3cmFwcGVyLl9fY2hhaW5fXyk7XG4gICAgICByZXN1bHQuX19hY3Rpb25zX18gPSBjb3B5QXJyYXkod3JhcHBlci5fX2FjdGlvbnNfXyk7XG4gICAgICByZXN1bHQuX19pbmRleF9fICA9IHdyYXBwZXIuX19pbmRleF9fO1xuICAgICAgcmVzdWx0Ll9fdmFsdWVzX18gPSB3cmFwcGVyLl9fdmFsdWVzX187XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgZWxlbWVudHMgc3BsaXQgaW50byBncm91cHMgdGhlIGxlbmd0aCBvZiBgc2l6ZWAuXG4gICAgICogSWYgYGFycmF5YCBjYW4ndCBiZSBzcGxpdCBldmVubHksIHRoZSBmaW5hbCBjaHVuayB3aWxsIGJlIHRoZSByZW1haW5pbmdcbiAgICAgKiBlbGVtZW50cy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBwcm9jZXNzLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc2l6ZT0xXSBUaGUgbGVuZ3RoIG9mIGVhY2ggY2h1bmtcbiAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGNodW5rcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5jaHVuayhbJ2EnLCAnYicsICdjJywgJ2QnXSwgMik7XG4gICAgICogLy8gPT4gW1snYScsICdiJ10sIFsnYycsICdkJ11dXG4gICAgICpcbiAgICAgKiBfLmNodW5rKFsnYScsICdiJywgJ2MnLCAnZCddLCAzKTtcbiAgICAgKiAvLyA9PiBbWydhJywgJ2InLCAnYyddLCBbJ2QnXV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjaHVuayhhcnJheSwgc2l6ZSwgZ3VhcmQpIHtcbiAgICAgIGlmICgoZ3VhcmQgPyBpc0l0ZXJhdGVlQ2FsbChhcnJheSwgc2l6ZSwgZ3VhcmQpIDogc2l6ZSA9PT0gdW5kZWZpbmVkKSkge1xuICAgICAgICBzaXplID0gMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNpemUgPSBuYXRpdmVNYXgodG9JbnRlZ2VyKHNpemUpLCAwKTtcbiAgICAgIH1cbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIGlmICghbGVuZ3RoIHx8IHNpemUgPCAxKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIHZhciBpbmRleCA9IDAsXG4gICAgICAgICAgcmVzSW5kZXggPSAwLFxuICAgICAgICAgIHJlc3VsdCA9IEFycmF5KG5hdGl2ZUNlaWwobGVuZ3RoIC8gc2l6ZSkpO1xuXG4gICAgICB3aGlsZSAoaW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgcmVzdWx0W3Jlc0luZGV4KytdID0gYmFzZVNsaWNlKGFycmF5LCBpbmRleCwgKGluZGV4ICs9IHNpemUpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSB3aXRoIGFsbCBmYWxzZXkgdmFsdWVzIHJlbW92ZWQuIFRoZSB2YWx1ZXMgYGZhbHNlYCwgYG51bGxgLFxuICAgICAqIGAwYCwgYFwiXCJgLCBgdW5kZWZpbmVkYCwgYW5kIGBOYU5gIGFyZSBmYWxzZXkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gY29tcGFjdC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBmaWx0ZXJlZCB2YWx1ZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uY29tcGFjdChbMCwgMSwgZmFsc2UsIDIsICcnLCAzXSk7XG4gICAgICogLy8gPT4gWzEsIDIsIDNdXG4gICAgICovXG4gICAgZnVuY3Rpb24gY29tcGFjdChhcnJheSkge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGgsXG4gICAgICAgICAgcmVzSW5kZXggPSAwLFxuICAgICAgICAgIHJlc3VsdCA9IFtdO1xuXG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgdmFsdWUgPSBhcnJheVtpbmRleF07XG4gICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgIHJlc3VsdFtyZXNJbmRleCsrXSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgYXJyYXkgY29uY2F0ZW5hdGluZyBgYXJyYXlgIHdpdGggYW55IGFkZGl0aW9uYWwgYXJyYXlzXG4gICAgICogYW5kL29yIHZhbHVlcy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBjb25jYXRlbmF0ZS5cbiAgICAgKiBAcGFyYW0gey4uLip9IFt2YWx1ZXNdIFRoZSB2YWx1ZXMgdG8gY29uY2F0ZW5hdGUuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgY29uY2F0ZW5hdGVkIGFycmF5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbMV07XG4gICAgICogdmFyIG90aGVyID0gXy5jb25jYXQoYXJyYXksIDIsIFszXSwgW1s0XV0pO1xuICAgICAqXG4gICAgICogY29uc29sZS5sb2cob3RoZXIpO1xuICAgICAqIC8vID0+IFsxLCAyLCAzLCBbNF1dXG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhhcnJheSk7XG4gICAgICogLy8gPT4gWzFdXG4gICAgICovXG4gICAgZnVuY3Rpb24gY29uY2F0KCkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICB2YXIgYXJncyA9IEFycmF5KGxlbmd0aCAtIDEpLFxuICAgICAgICAgIGFycmF5ID0gYXJndW1lbnRzWzBdLFxuICAgICAgICAgIGluZGV4ID0gbGVuZ3RoO1xuXG4gICAgICB3aGlsZSAoaW5kZXgtLSkge1xuICAgICAgICBhcmdzW2luZGV4IC0gMV0gPSBhcmd1bWVudHNbaW5kZXhdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFycmF5UHVzaChpc0FycmF5KGFycmF5KSA/IGNvcHlBcnJheShhcnJheSkgOiBbYXJyYXldLCBiYXNlRmxhdHRlbihhcmdzLCAxKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiBgYXJyYXlgIHZhbHVlcyBub3QgaW5jbHVkZWQgaW4gdGhlIG90aGVyIGdpdmVuIGFycmF5c1xuICAgICAqIHVzaW5nIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pXG4gICAgICogZm9yIGVxdWFsaXR5IGNvbXBhcmlzb25zLiBUaGUgb3JkZXIgYW5kIHJlZmVyZW5jZXMgb2YgcmVzdWx0IHZhbHVlcyBhcmVcbiAgICAgKiBkZXRlcm1pbmVkIGJ5IHRoZSBmaXJzdCBhcnJheS5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBVbmxpa2UgYF8ucHVsbEFsbGAsIHRoaXMgbWV0aG9kIHJldHVybnMgYSBuZXcgYXJyYXkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0gey4uLkFycmF5fSBbdmFsdWVzXSBUaGUgdmFsdWVzIHRvIGV4Y2x1ZGUuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgZmlsdGVyZWQgdmFsdWVzLlxuICAgICAqIEBzZWUgXy53aXRob3V0LCBfLnhvclxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmRpZmZlcmVuY2UoWzIsIDFdLCBbMiwgM10pO1xuICAgICAqIC8vID0+IFsxXVxuICAgICAqL1xuICAgIHZhciBkaWZmZXJlbmNlID0gYmFzZVJlc3QoZnVuY3Rpb24oYXJyYXksIHZhbHVlcykge1xuICAgICAgcmV0dXJuIGlzQXJyYXlMaWtlT2JqZWN0KGFycmF5KVxuICAgICAgICA/IGJhc2VEaWZmZXJlbmNlKGFycmF5LCBiYXNlRmxhdHRlbih2YWx1ZXMsIDEsIGlzQXJyYXlMaWtlT2JqZWN0LCB0cnVlKSlcbiAgICAgICAgOiBbXTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZGlmZmVyZW5jZWAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgaXRlcmF0ZWVgIHdoaWNoXG4gICAgICogaXMgaW52b2tlZCBmb3IgZWFjaCBlbGVtZW50IG9mIGBhcnJheWAgYW5kIGB2YWx1ZXNgIHRvIGdlbmVyYXRlIHRoZSBjcml0ZXJpb25cbiAgICAgKiBieSB3aGljaCB0aGV5J3JlIGNvbXBhcmVkLiBUaGUgb3JkZXIgYW5kIHJlZmVyZW5jZXMgb2YgcmVzdWx0IHZhbHVlcyBhcmVcbiAgICAgKiBkZXRlcm1pbmVkIGJ5IHRoZSBmaXJzdCBhcnJheS4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6XG4gICAgICogKHZhbHVlKS5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBVbmxpa2UgYF8ucHVsbEFsbEJ5YCwgdGhpcyBtZXRob2QgcmV0dXJucyBhIG5ldyBhcnJheS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7Li4uQXJyYXl9IFt2YWx1ZXNdIFRoZSB2YWx1ZXMgdG8gZXhjbHVkZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgZmlsdGVyZWQgdmFsdWVzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmRpZmZlcmVuY2VCeShbMi4xLCAxLjJdLCBbMi4zLCAzLjRdLCBNYXRoLmZsb29yKTtcbiAgICAgKiAvLyA9PiBbMS4yXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5kaWZmZXJlbmNlQnkoW3sgJ3gnOiAyIH0sIHsgJ3gnOiAxIH1dLCBbeyAneCc6IDEgfV0sICd4Jyk7XG4gICAgICogLy8gPT4gW3sgJ3gnOiAyIH1dXG4gICAgICovXG4gICAgdmFyIGRpZmZlcmVuY2VCeSA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5LCB2YWx1ZXMpIHtcbiAgICAgIHZhciBpdGVyYXRlZSA9IGxhc3QodmFsdWVzKTtcbiAgICAgIGlmIChpc0FycmF5TGlrZU9iamVjdChpdGVyYXRlZSkpIHtcbiAgICAgICAgaXRlcmF0ZWUgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gaXNBcnJheUxpa2VPYmplY3QoYXJyYXkpXG4gICAgICAgID8gYmFzZURpZmZlcmVuY2UoYXJyYXksIGJhc2VGbGF0dGVuKHZhbHVlcywgMSwgaXNBcnJheUxpa2VPYmplY3QsIHRydWUpLCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMikpXG4gICAgICAgIDogW107XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmRpZmZlcmVuY2VgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGNvbXBhcmF0b3JgXG4gICAgICogd2hpY2ggaXMgaW52b2tlZCB0byBjb21wYXJlIGVsZW1lbnRzIG9mIGBhcnJheWAgdG8gYHZhbHVlc2AuIFRoZSBvcmRlciBhbmRcbiAgICAgKiByZWZlcmVuY2VzIG9mIHJlc3VsdCB2YWx1ZXMgYXJlIGRldGVybWluZWQgYnkgdGhlIGZpcnN0IGFycmF5LiBUaGUgY29tcGFyYXRvclxuICAgICAqIGlzIGludm9rZWQgd2l0aCB0d28gYXJndW1lbnRzOiAoYXJyVmFsLCBvdGhWYWwpLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFVubGlrZSBgXy5wdWxsQWxsV2l0aGAsIHRoaXMgbWV0aG9kIHJldHVybnMgYSBuZXcgYXJyYXkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0gey4uLkFycmF5fSBbdmFsdWVzXSBUaGUgdmFsdWVzIHRvIGV4Y2x1ZGUuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NvbXBhcmF0b3JdIFRoZSBjb21wYXJhdG9yIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgZmlsdGVyZWQgdmFsdWVzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFt7ICd4JzogMSwgJ3knOiAyIH0sIHsgJ3gnOiAyLCAneSc6IDEgfV07XG4gICAgICpcbiAgICAgKiBfLmRpZmZlcmVuY2VXaXRoKG9iamVjdHMsIFt7ICd4JzogMSwgJ3knOiAyIH1dLCBfLmlzRXF1YWwpO1xuICAgICAqIC8vID0+IFt7ICd4JzogMiwgJ3knOiAxIH1dXG4gICAgICovXG4gICAgdmFyIGRpZmZlcmVuY2VXaXRoID0gYmFzZVJlc3QoZnVuY3Rpb24oYXJyYXksIHZhbHVlcykge1xuICAgICAgdmFyIGNvbXBhcmF0b3IgPSBsYXN0KHZhbHVlcyk7XG4gICAgICBpZiAoaXNBcnJheUxpa2VPYmplY3QoY29tcGFyYXRvcikpIHtcbiAgICAgICAgY29tcGFyYXRvciA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBpc0FycmF5TGlrZU9iamVjdChhcnJheSlcbiAgICAgICAgPyBiYXNlRGlmZmVyZW5jZShhcnJheSwgYmFzZUZsYXR0ZW4odmFsdWVzLCAxLCBpc0FycmF5TGlrZU9iamVjdCwgdHJ1ZSksIHVuZGVmaW5lZCwgY29tcGFyYXRvcilcbiAgICAgICAgOiBbXTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBzbGljZSBvZiBgYXJyYXlgIHdpdGggYG5gIGVsZW1lbnRzIGRyb3BwZWQgZnJvbSB0aGUgYmVnaW5uaW5nLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuNS4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbj0xXSBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIGRyb3AuXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHNsaWNlIG9mIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZHJvcChbMSwgMiwgM10pO1xuICAgICAqIC8vID0+IFsyLCAzXVxuICAgICAqXG4gICAgICogXy5kcm9wKFsxLCAyLCAzXSwgMik7XG4gICAgICogLy8gPT4gWzNdXG4gICAgICpcbiAgICAgKiBfLmRyb3AoWzEsIDIsIDNdLCA1KTtcbiAgICAgKiAvLyA9PiBbXVxuICAgICAqXG4gICAgICogXy5kcm9wKFsxLCAyLCAzXSwgMCk7XG4gICAgICogLy8gPT4gWzEsIDIsIDNdXG4gICAgICovXG4gICAgZnVuY3Rpb24gZHJvcChhcnJheSwgbiwgZ3VhcmQpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIG4gPSAoZ3VhcmQgfHwgbiA9PT0gdW5kZWZpbmVkKSA/IDEgOiB0b0ludGVnZXIobik7XG4gICAgICByZXR1cm4gYmFzZVNsaWNlKGFycmF5LCBuIDwgMCA/IDAgOiBuLCBsZW5ndGgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBzbGljZSBvZiBgYXJyYXlgIHdpdGggYG5gIGVsZW1lbnRzIGRyb3BwZWQgZnJvbSB0aGUgZW5kLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbj0xXSBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIGRyb3AuXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHNsaWNlIG9mIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZHJvcFJpZ2h0KFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gWzEsIDJdXG4gICAgICpcbiAgICAgKiBfLmRyb3BSaWdodChbMSwgMiwgM10sIDIpO1xuICAgICAqIC8vID0+IFsxXVxuICAgICAqXG4gICAgICogXy5kcm9wUmlnaHQoWzEsIDIsIDNdLCA1KTtcbiAgICAgKiAvLyA9PiBbXVxuICAgICAqXG4gICAgICogXy5kcm9wUmlnaHQoWzEsIDIsIDNdLCAwKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgM11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBkcm9wUmlnaHQoYXJyYXksIG4sIGd1YXJkKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICBuID0gKGd1YXJkIHx8IG4gPT09IHVuZGVmaW5lZCkgPyAxIDogdG9JbnRlZ2VyKG4pO1xuICAgICAgbiA9IGxlbmd0aCAtIG47XG4gICAgICByZXR1cm4gYmFzZVNsaWNlKGFycmF5LCAwLCBuIDwgMCA/IDAgOiBuKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgc2xpY2Ugb2YgYGFycmF5YCBleGNsdWRpbmcgZWxlbWVudHMgZHJvcHBlZCBmcm9tIHRoZSBlbmQuXG4gICAgICogRWxlbWVudHMgYXJlIGRyb3BwZWQgdW50aWwgYHByZWRpY2F0ZWAgcmV0dXJucyBmYWxzZXkuIFRoZSBwcmVkaWNhdGUgaXNcbiAgICAgKiBpbnZva2VkIHdpdGggdGhyZWUgYXJndW1lbnRzOiAodmFsdWUsIGluZGV4LCBhcnJheSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgc2xpY2Ugb2YgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAgJ2FjdGl2ZSc6IHRydWUgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgICdhY3RpdmUnOiBmYWxzZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdwZWJibGVzJywgJ2FjdGl2ZSc6IGZhbHNlIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy5kcm9wUmlnaHRXaGlsZSh1c2VycywgZnVuY3Rpb24obykgeyByZXR1cm4gIW8uYWN0aXZlOyB9KTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ2Jhcm5leSddXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZHJvcFJpZ2h0V2hpbGUodXNlcnMsIHsgJ3VzZXInOiAncGViYmxlcycsICdhY3RpdmUnOiBmYWxzZSB9KTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ2Jhcm5leScsICdmcmVkJ11cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmRyb3BSaWdodFdoaWxlKHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydiYXJuZXknXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5kcm9wUmlnaHRXaGlsZSh1c2VycywgJ2FjdGl2ZScpO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnYmFybmV5JywgJ2ZyZWQnLCAncGViYmxlcyddXG4gICAgICovXG4gICAgZnVuY3Rpb24gZHJvcFJpZ2h0V2hpbGUoYXJyYXksIHByZWRpY2F0ZSkge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpXG4gICAgICAgID8gYmFzZVdoaWxlKGFycmF5LCBnZXRJdGVyYXRlZShwcmVkaWNhdGUsIDMpLCB0cnVlLCB0cnVlKVxuICAgICAgICA6IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBzbGljZSBvZiBgYXJyYXlgIGV4Y2x1ZGluZyBlbGVtZW50cyBkcm9wcGVkIGZyb20gdGhlIGJlZ2lubmluZy5cbiAgICAgKiBFbGVtZW50cyBhcmUgZHJvcHBlZCB1bnRpbCBgcHJlZGljYXRlYCByZXR1cm5zIGZhbHNleS4gVGhlIHByZWRpY2F0ZSBpc1xuICAgICAqIGludm9rZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM6ICh2YWx1ZSwgaW5kZXgsIGFycmF5KS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBzbGljZSBvZiBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSBbXG4gICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICAnYWN0aXZlJzogZmFsc2UgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgICdhY3RpdmUnOiBmYWxzZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdwZWJibGVzJywgJ2FjdGl2ZSc6IHRydWUgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiBfLmRyb3BXaGlsZSh1c2VycywgZnVuY3Rpb24obykgeyByZXR1cm4gIW8uYWN0aXZlOyB9KTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ3BlYmJsZXMnXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmRyb3BXaGlsZSh1c2VycywgeyAndXNlcic6ICdiYXJuZXknLCAnYWN0aXZlJzogZmFsc2UgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydmcmVkJywgJ3BlYmJsZXMnXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZHJvcFdoaWxlKHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydwZWJibGVzJ11cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZHJvcFdoaWxlKHVzZXJzLCAnYWN0aXZlJyk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydiYXJuZXknLCAnZnJlZCcsICdwZWJibGVzJ11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBkcm9wV2hpbGUoYXJyYXksIHByZWRpY2F0ZSkge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpXG4gICAgICAgID8gYmFzZVdoaWxlKGFycmF5LCBnZXRJdGVyYXRlZShwcmVkaWNhdGUsIDMpLCB0cnVlKVxuICAgICAgICA6IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZpbGxzIGVsZW1lbnRzIG9mIGBhcnJheWAgd2l0aCBgdmFsdWVgIGZyb20gYHN0YXJ0YCB1cCB0bywgYnV0IG5vdFxuICAgICAqIGluY2x1ZGluZywgYGVuZGAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgYXJyYXlgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMi4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGZpbGwuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gZmlsbCBgYXJyYXlgIHdpdGguXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzdGFydD0wXSBUaGUgc3RhcnQgcG9zaXRpb24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtlbmQ9YXJyYXkubGVuZ3RoXSBUaGUgZW5kIHBvc2l0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbMSwgMiwgM107XG4gICAgICpcbiAgICAgKiBfLmZpbGwoYXJyYXksICdhJyk7XG4gICAgICogY29uc29sZS5sb2coYXJyYXkpO1xuICAgICAqIC8vID0+IFsnYScsICdhJywgJ2EnXVxuICAgICAqXG4gICAgICogXy5maWxsKEFycmF5KDMpLCAyKTtcbiAgICAgKiAvLyA9PiBbMiwgMiwgMl1cbiAgICAgKlxuICAgICAqIF8uZmlsbChbNCwgNiwgOCwgMTBdLCAnKicsIDEsIDMpO1xuICAgICAqIC8vID0+IFs0LCAnKicsICcqJywgMTBdXG4gICAgICovXG4gICAgZnVuY3Rpb24gZmlsbChhcnJheSwgdmFsdWUsIHN0YXJ0LCBlbmQpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIGlmIChzdGFydCAmJiB0eXBlb2Ygc3RhcnQgIT0gJ251bWJlcicgJiYgaXNJdGVyYXRlZUNhbGwoYXJyYXksIHZhbHVlLCBzdGFydCkpIHtcbiAgICAgICAgc3RhcnQgPSAwO1xuICAgICAgICBlbmQgPSBsZW5ndGg7XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFzZUZpbGwoYXJyYXksIHZhbHVlLCBzdGFydCwgZW5kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmZpbmRgIGV4Y2VwdCB0aGF0IGl0IHJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBmaXJzdFxuICAgICAqIGVsZW1lbnQgYHByZWRpY2F0ZWAgcmV0dXJucyB0cnV0aHkgZm9yIGluc3RlYWQgb2YgdGhlIGVsZW1lbnQgaXRzZWxmLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDEuMS4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZnJvbUluZGV4PTBdIFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZm91bmQgZWxlbWVudCwgZWxzZSBgLTFgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSBbXG4gICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICAnYWN0aXZlJzogZmFsc2UgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgICdhY3RpdmUnOiBmYWxzZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdwZWJibGVzJywgJ2FjdGl2ZSc6IHRydWUgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiBfLmZpbmRJbmRleCh1c2VycywgZnVuY3Rpb24obykgeyByZXR1cm4gby51c2VyID09ICdiYXJuZXknOyB9KTtcbiAgICAgKiAvLyA9PiAwXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmluZEluZGV4KHVzZXJzLCB7ICd1c2VyJzogJ2ZyZWQnLCAnYWN0aXZlJzogZmFsc2UgfSk7XG4gICAgICogLy8gPT4gMVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmluZEluZGV4KHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7XG4gICAgICogLy8gPT4gMFxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5maW5kSW5kZXgodXNlcnMsICdhY3RpdmUnKTtcbiAgICAgKiAvLyA9PiAyXG4gICAgICovXG4gICAgZnVuY3Rpb24gZmluZEluZGV4KGFycmF5LCBwcmVkaWNhdGUsIGZyb21JbmRleCkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgICAgaWYgKCFsZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgfVxuICAgICAgdmFyIGluZGV4ID0gZnJvbUluZGV4ID09IG51bGwgPyAwIDogdG9JbnRlZ2VyKGZyb21JbmRleCk7XG4gICAgICBpZiAoaW5kZXggPCAwKSB7XG4gICAgICAgIGluZGV4ID0gbmF0aXZlTWF4KGxlbmd0aCArIGluZGV4LCAwKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBiYXNlRmluZEluZGV4KGFycmF5LCBnZXRJdGVyYXRlZShwcmVkaWNhdGUsIDMpLCBpbmRleCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5maW5kSW5kZXhgIGV4Y2VwdCB0aGF0IGl0IGl0ZXJhdGVzIG92ZXIgZWxlbWVudHNcbiAgICAgKiBvZiBgY29sbGVjdGlvbmAgZnJvbSByaWdodCB0byBsZWZ0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDIuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZnJvbUluZGV4PWFycmF5Lmxlbmd0aC0xXSBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGZvdW5kIGVsZW1lbnQsIGVsc2UgYC0xYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAgJ2FjdGl2ZSc6IHRydWUgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgICdhY3RpdmUnOiBmYWxzZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdwZWJibGVzJywgJ2FjdGl2ZSc6IGZhbHNlIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy5maW5kTGFzdEluZGV4KHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiBvLnVzZXIgPT0gJ3BlYmJsZXMnOyB9KTtcbiAgICAgKiAvLyA9PiAyXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmluZExhc3RJbmRleCh1c2VycywgeyAndXNlcic6ICdiYXJuZXknLCAnYWN0aXZlJzogdHJ1ZSB9KTtcbiAgICAgKiAvLyA9PiAwXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5maW5kTGFzdEluZGV4KHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7XG4gICAgICogLy8gPT4gMlxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5maW5kTGFzdEluZGV4KHVzZXJzLCAnYWN0aXZlJyk7XG4gICAgICogLy8gPT4gMFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZpbmRMYXN0SW5kZXgoYXJyYXksIHByZWRpY2F0ZSwgZnJvbUluZGV4KSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICByZXR1cm4gLTE7XG4gICAgICB9XG4gICAgICB2YXIgaW5kZXggPSBsZW5ndGggLSAxO1xuICAgICAgaWYgKGZyb21JbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGluZGV4ID0gdG9JbnRlZ2VyKGZyb21JbmRleCk7XG4gICAgICAgIGluZGV4ID0gZnJvbUluZGV4IDwgMFxuICAgICAgICAgID8gbmF0aXZlTWF4KGxlbmd0aCArIGluZGV4LCAwKVxuICAgICAgICAgIDogbmF0aXZlTWluKGluZGV4LCBsZW5ndGggLSAxKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBiYXNlRmluZEluZGV4KGFycmF5LCBnZXRJdGVyYXRlZShwcmVkaWNhdGUsIDMpLCBpbmRleCwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmxhdHRlbnMgYGFycmF5YCBhIHNpbmdsZSBsZXZlbCBkZWVwLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGZsYXR0ZW4uXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZmxhdHRlbmVkIGFycmF5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmZsYXR0ZW4oWzEsIFsyLCBbMywgWzRdXSwgNV1dKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgWzMsIFs0XV0sIDVdXG4gICAgICovXG4gICAgZnVuY3Rpb24gZmxhdHRlbihhcnJheSkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgICAgcmV0dXJuIGxlbmd0aCA/IGJhc2VGbGF0dGVuKGFycmF5LCAxKSA6IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlY3Vyc2l2ZWx5IGZsYXR0ZW5zIGBhcnJheWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gZmxhdHRlbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmbGF0dGVuZWQgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZmxhdHRlbkRlZXAoWzEsIFsyLCBbMywgWzRdXSwgNV1dKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgMywgNCwgNV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmbGF0dGVuRGVlcChhcnJheSkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgICAgcmV0dXJuIGxlbmd0aCA/IGJhc2VGbGF0dGVuKGFycmF5LCBJTkZJTklUWSkgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWN1cnNpdmVseSBmbGF0dGVuIGBhcnJheWAgdXAgdG8gYGRlcHRoYCB0aW1lcy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjQuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBmbGF0dGVuLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZGVwdGg9MV0gVGhlIG1heGltdW0gcmVjdXJzaW9uIGRlcHRoLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZsYXR0ZW5lZCBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gWzEsIFsyLCBbMywgWzRdXSwgNV1dO1xuICAgICAqXG4gICAgICogXy5mbGF0dGVuRGVwdGgoYXJyYXksIDEpO1xuICAgICAqIC8vID0+IFsxLCAyLCBbMywgWzRdXSwgNV1cbiAgICAgKlxuICAgICAqIF8uZmxhdHRlbkRlcHRoKGFycmF5LCAyKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgMywgWzRdLCA1XVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZsYXR0ZW5EZXB0aChhcnJheSwgZGVwdGgpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIGRlcHRoID0gZGVwdGggPT09IHVuZGVmaW5lZCA/IDEgOiB0b0ludGVnZXIoZGVwdGgpO1xuICAgICAgcmV0dXJuIGJhc2VGbGF0dGVuKGFycmF5LCBkZXB0aCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGludmVyc2Ugb2YgYF8udG9QYWlyc2A7IHRoaXMgbWV0aG9kIHJldHVybnMgYW4gb2JqZWN0IGNvbXBvc2VkXG4gICAgICogZnJvbSBrZXktdmFsdWUgYHBhaXJzYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHBhaXJzIFRoZSBrZXktdmFsdWUgcGFpcnMuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5mcm9tUGFpcnMoW1snYScsIDFdLCBbJ2InLCAyXV0pO1xuICAgICAqIC8vID0+IHsgJ2EnOiAxLCAnYic6IDIgfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZyb21QYWlycyhwYWlycykge1xuICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgbGVuZ3RoID0gcGFpcnMgPT0gbnVsbCA/IDAgOiBwYWlycy5sZW5ndGgsXG4gICAgICAgICAgcmVzdWx0ID0ge307XG5cbiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgIHZhciBwYWlyID0gcGFpcnNbaW5kZXhdO1xuICAgICAgICByZXN1bHRbcGFpclswXV0gPSBwYWlyWzFdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBmaXJzdCBlbGVtZW50IG9mIGBhcnJheWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAYWxpYXMgZmlyc3RcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGZpcnN0IGVsZW1lbnQgb2YgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5oZWFkKFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gMVxuICAgICAqXG4gICAgICogXy5oZWFkKFtdKTtcbiAgICAgKiAvLyA9PiB1bmRlZmluZWRcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBoZWFkKGFycmF5KSB7XG4gICAgICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aCkgPyBhcnJheVswXSA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBpbmRleCBhdCB3aGljaCB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiBgdmFsdWVgIGlzIGZvdW5kIGluIGBhcnJheWBcbiAgICAgKiB1c2luZyBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKVxuICAgICAqIGZvciBlcXVhbGl0eSBjb21wYXJpc29ucy4gSWYgYGZyb21JbmRleGAgaXMgbmVnYXRpdmUsIGl0J3MgdXNlZCBhcyB0aGVcbiAgICAgKiBvZmZzZXQgZnJvbSB0aGUgZW5kIG9mIGBhcnJheWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZnJvbUluZGV4PTBdIFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbWF0Y2hlZCB2YWx1ZSwgZWxzZSBgLTFgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmluZGV4T2YoWzEsIDIsIDEsIDJdLCAyKTtcbiAgICAgKiAvLyA9PiAxXG4gICAgICpcbiAgICAgKiAvLyBTZWFyY2ggZnJvbSB0aGUgYGZyb21JbmRleGAuXG4gICAgICogXy5pbmRleE9mKFsxLCAyLCAxLCAyXSwgMiwgMik7XG4gICAgICogLy8gPT4gM1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGluZGV4T2YoYXJyYXksIHZhbHVlLCBmcm9tSW5kZXgpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiAtMTtcbiAgICAgIH1cbiAgICAgIHZhciBpbmRleCA9IGZyb21JbmRleCA9PSBudWxsID8gMCA6IHRvSW50ZWdlcihmcm9tSW5kZXgpO1xuICAgICAgaWYgKGluZGV4IDwgMCkge1xuICAgICAgICBpbmRleCA9IG5hdGl2ZU1heChsZW5ndGggKyBpbmRleCwgMCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFzZUluZGV4T2YoYXJyYXksIHZhbHVlLCBpbmRleCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBhbGwgYnV0IHRoZSBsYXN0IGVsZW1lbnQgb2YgYGFycmF5YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHNsaWNlIG9mIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaW5pdGlhbChbMSwgMiwgM10pO1xuICAgICAqIC8vID0+IFsxLCAyXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGluaXRpYWwoYXJyYXkpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIHJldHVybiBsZW5ndGggPyBiYXNlU2xpY2UoYXJyYXksIDAsIC0xKSA6IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdW5pcXVlIHZhbHVlcyB0aGF0IGFyZSBpbmNsdWRlZCBpbiBhbGwgZ2l2ZW4gYXJyYXlzXG4gICAgICogdXNpbmcgW2BTYW1lVmFsdWVaZXJvYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtc2FtZXZhbHVlemVybylcbiAgICAgKiBmb3IgZXF1YWxpdHkgY29tcGFyaXNvbnMuIFRoZSBvcmRlciBhbmQgcmVmZXJlbmNlcyBvZiByZXN1bHQgdmFsdWVzIGFyZVxuICAgICAqIGRldGVybWluZWQgYnkgdGhlIGZpcnN0IGFycmF5LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHsuLi5BcnJheX0gW2FycmF5c10gVGhlIGFycmF5cyB0byBpbnNwZWN0LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGludGVyc2VjdGluZyB2YWx1ZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaW50ZXJzZWN0aW9uKFsyLCAxXSwgWzIsIDNdKTtcbiAgICAgKiAvLyA9PiBbMl1cbiAgICAgKi9cbiAgICB2YXIgaW50ZXJzZWN0aW9uID0gYmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKSB7XG4gICAgICB2YXIgbWFwcGVkID0gYXJyYXlNYXAoYXJyYXlzLCBjYXN0QXJyYXlMaWtlT2JqZWN0KTtcbiAgICAgIHJldHVybiAobWFwcGVkLmxlbmd0aCAmJiBtYXBwZWRbMF0gPT09IGFycmF5c1swXSlcbiAgICAgICAgPyBiYXNlSW50ZXJzZWN0aW9uKG1hcHBlZClcbiAgICAgICAgOiBbXTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uaW50ZXJzZWN0aW9uYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBpdGVyYXRlZWBcbiAgICAgKiB3aGljaCBpcyBpbnZva2VkIGZvciBlYWNoIGVsZW1lbnQgb2YgZWFjaCBgYXJyYXlzYCB0byBnZW5lcmF0ZSB0aGUgY3JpdGVyaW9uXG4gICAgICogYnkgd2hpY2ggdGhleSdyZSBjb21wYXJlZC4gVGhlIG9yZGVyIGFuZCByZWZlcmVuY2VzIG9mIHJlc3VsdCB2YWx1ZXMgYXJlXG4gICAgICogZGV0ZXJtaW5lZCBieSB0aGUgZmlyc3QgYXJyYXkuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OlxuICAgICAqICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0gey4uLkFycmF5fSBbYXJyYXlzXSBUaGUgYXJyYXlzIHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGludGVyc2VjdGluZyB2YWx1ZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaW50ZXJzZWN0aW9uQnkoWzIuMSwgMS4yXSwgWzIuMywgMy40XSwgTWF0aC5mbG9vcik7XG4gICAgICogLy8gPT4gWzIuMV1cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uaW50ZXJzZWN0aW9uQnkoW3sgJ3gnOiAxIH1dLCBbeyAneCc6IDIgfSwgeyAneCc6IDEgfV0sICd4Jyk7XG4gICAgICogLy8gPT4gW3sgJ3gnOiAxIH1dXG4gICAgICovXG4gICAgdmFyIGludGVyc2VjdGlvbkJ5ID0gYmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKSB7XG4gICAgICB2YXIgaXRlcmF0ZWUgPSBsYXN0KGFycmF5cyksXG4gICAgICAgICAgbWFwcGVkID0gYXJyYXlNYXAoYXJyYXlzLCBjYXN0QXJyYXlMaWtlT2JqZWN0KTtcblxuICAgICAgaWYgKGl0ZXJhdGVlID09PSBsYXN0KG1hcHBlZCkpIHtcbiAgICAgICAgaXRlcmF0ZWUgPSB1bmRlZmluZWQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtYXBwZWQucG9wKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gKG1hcHBlZC5sZW5ndGggJiYgbWFwcGVkWzBdID09PSBhcnJheXNbMF0pXG4gICAgICAgID8gYmFzZUludGVyc2VjdGlvbihtYXBwZWQsIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAyKSlcbiAgICAgICAgOiBbXTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uaW50ZXJzZWN0aW9uYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBjb21wYXJhdG9yYFxuICAgICAqIHdoaWNoIGlzIGludm9rZWQgdG8gY29tcGFyZSBlbGVtZW50cyBvZiBgYXJyYXlzYC4gVGhlIG9yZGVyIGFuZCByZWZlcmVuY2VzXG4gICAgICogb2YgcmVzdWx0IHZhbHVlcyBhcmUgZGV0ZXJtaW5lZCBieSB0aGUgZmlyc3QgYXJyYXkuIFRoZSBjb21wYXJhdG9yIGlzXG4gICAgICogaW52b2tlZCB3aXRoIHR3byBhcmd1bWVudHM6IChhcnJWYWwsIG90aFZhbCkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0gey4uLkFycmF5fSBbYXJyYXlzXSBUaGUgYXJyYXlzIHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NvbXBhcmF0b3JdIFRoZSBjb21wYXJhdG9yIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgaW50ZXJzZWN0aW5nIHZhbHVlcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdHMgPSBbeyAneCc6IDEsICd5JzogMiB9LCB7ICd4JzogMiwgJ3knOiAxIH1dO1xuICAgICAqIHZhciBvdGhlcnMgPSBbeyAneCc6IDEsICd5JzogMSB9LCB7ICd4JzogMSwgJ3knOiAyIH1dO1xuICAgICAqXG4gICAgICogXy5pbnRlcnNlY3Rpb25XaXRoKG9iamVjdHMsIG90aGVycywgXy5pc0VxdWFsKTtcbiAgICAgKiAvLyA9PiBbeyAneCc6IDEsICd5JzogMiB9XVxuICAgICAqL1xuICAgIHZhciBpbnRlcnNlY3Rpb25XaXRoID0gYmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKSB7XG4gICAgICB2YXIgY29tcGFyYXRvciA9IGxhc3QoYXJyYXlzKSxcbiAgICAgICAgICBtYXBwZWQgPSBhcnJheU1hcChhcnJheXMsIGNhc3RBcnJheUxpa2VPYmplY3QpO1xuXG4gICAgICBjb21wYXJhdG9yID0gdHlwZW9mIGNvbXBhcmF0b3IgPT0gJ2Z1bmN0aW9uJyA/IGNvbXBhcmF0b3IgOiB1bmRlZmluZWQ7XG4gICAgICBpZiAoY29tcGFyYXRvcikge1xuICAgICAgICBtYXBwZWQucG9wKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gKG1hcHBlZC5sZW5ndGggJiYgbWFwcGVkWzBdID09PSBhcnJheXNbMF0pXG4gICAgICAgID8gYmFzZUludGVyc2VjdGlvbihtYXBwZWQsIHVuZGVmaW5lZCwgY29tcGFyYXRvcilcbiAgICAgICAgOiBbXTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGFsbCBlbGVtZW50cyBpbiBgYXJyYXlgIGludG8gYSBzdHJpbmcgc2VwYXJhdGVkIGJ5IGBzZXBhcmF0b3JgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGNvbnZlcnQuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzZXBhcmF0b3I9JywnXSBUaGUgZWxlbWVudCBzZXBhcmF0b3IuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgam9pbmVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5qb2luKFsnYScsICdiJywgJ2MnXSwgJ34nKTtcbiAgICAgKiAvLyA9PiAnYX5ifmMnXG4gICAgICovXG4gICAgZnVuY3Rpb24gam9pbihhcnJheSwgc2VwYXJhdG9yKSB7XG4gICAgICByZXR1cm4gYXJyYXkgPT0gbnVsbCA/ICcnIDogbmF0aXZlSm9pbi5jYWxsKGFycmF5LCBzZXBhcmF0b3IpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGxhc3QgZWxlbWVudCBvZiBgYXJyYXlgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBsYXN0IGVsZW1lbnQgb2YgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5sYXN0KFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gM1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGxhc3QoYXJyYXkpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIHJldHVybiBsZW5ndGggPyBhcnJheVtsZW5ndGggLSAxXSA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmluZGV4T2ZgIGV4Y2VwdCB0aGF0IGl0IGl0ZXJhdGVzIG92ZXIgZWxlbWVudHMgb2ZcbiAgICAgKiBgYXJyYXlgIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtmcm9tSW5kZXg9YXJyYXkubGVuZ3RoLTFdIFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbWF0Y2hlZCB2YWx1ZSwgZWxzZSBgLTFgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmxhc3RJbmRleE9mKFsxLCAyLCAxLCAyXSwgMik7XG4gICAgICogLy8gPT4gM1xuICAgICAqXG4gICAgICogLy8gU2VhcmNoIGZyb20gdGhlIGBmcm9tSW5kZXhgLlxuICAgICAqIF8ubGFzdEluZGV4T2YoWzEsIDIsIDEsIDJdLCAyLCAyKTtcbiAgICAgKiAvLyA9PiAxXG4gICAgICovXG4gICAgZnVuY3Rpb24gbGFzdEluZGV4T2YoYXJyYXksIHZhbHVlLCBmcm9tSW5kZXgpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiAtMTtcbiAgICAgIH1cbiAgICAgIHZhciBpbmRleCA9IGxlbmd0aDtcbiAgICAgIGlmIChmcm9tSW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpbmRleCA9IHRvSW50ZWdlcihmcm9tSW5kZXgpO1xuICAgICAgICBpbmRleCA9IGluZGV4IDwgMCA/IG5hdGl2ZU1heChsZW5ndGggKyBpbmRleCwgMCkgOiBuYXRpdmVNaW4oaW5kZXgsIGxlbmd0aCAtIDEpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbHVlID09PSB2YWx1ZVxuICAgICAgICA/IHN0cmljdExhc3RJbmRleE9mKGFycmF5LCB2YWx1ZSwgaW5kZXgpXG4gICAgICAgIDogYmFzZUZpbmRJbmRleChhcnJheSwgYmFzZUlzTmFOLCBpbmRleCwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgZWxlbWVudCBhdCBpbmRleCBgbmAgb2YgYGFycmF5YC4gSWYgYG5gIGlzIG5lZ2F0aXZlLCB0aGUgbnRoXG4gICAgICogZWxlbWVudCBmcm9tIHRoZSBlbmQgaXMgcmV0dXJuZWQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4xMS4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbj0wXSBUaGUgaW5kZXggb2YgdGhlIGVsZW1lbnQgdG8gcmV0dXJuLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBudGggZWxlbWVudCBvZiBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbJ2EnLCAnYicsICdjJywgJ2QnXTtcbiAgICAgKlxuICAgICAqIF8ubnRoKGFycmF5LCAxKTtcbiAgICAgKiAvLyA9PiAnYidcbiAgICAgKlxuICAgICAqIF8ubnRoKGFycmF5LCAtMik7XG4gICAgICogLy8gPT4gJ2MnO1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIG50aChhcnJheSwgbikge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpID8gYmFzZU50aChhcnJheSwgdG9JbnRlZ2VyKG4pKSA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGFsbCBnaXZlbiB2YWx1ZXMgZnJvbSBgYXJyYXlgIHVzaW5nXG4gICAgICogW2BTYW1lVmFsdWVaZXJvYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtc2FtZXZhbHVlemVybylcbiAgICAgKiBmb3IgZXF1YWxpdHkgY29tcGFyaXNvbnMuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVW5saWtlIGBfLndpdGhvdXRgLCB0aGlzIG1ldGhvZCBtdXRhdGVzIGBhcnJheWAuIFVzZSBgXy5yZW1vdmVgXG4gICAgICogdG8gcmVtb3ZlIGVsZW1lbnRzIGZyb20gYW4gYXJyYXkgYnkgcHJlZGljYXRlLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDIuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0gey4uLip9IFt2YWx1ZXNdIFRoZSB2YWx1ZXMgdG8gcmVtb3ZlLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbJ2EnLCAnYicsICdjJywgJ2EnLCAnYicsICdjJ107XG4gICAgICpcbiAgICAgKiBfLnB1bGwoYXJyYXksICdhJywgJ2MnKTtcbiAgICAgKiBjb25zb2xlLmxvZyhhcnJheSk7XG4gICAgICogLy8gPT4gWydiJywgJ2InXVxuICAgICAqL1xuICAgIHZhciBwdWxsID0gYmFzZVJlc3QocHVsbEFsbCk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnB1bGxgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYW4gYXJyYXkgb2YgdmFsdWVzIHRvIHJlbW92ZS5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBVbmxpa2UgYF8uZGlmZmVyZW5jZWAsIHRoaXMgbWV0aG9kIG11dGF0ZXMgYGFycmF5YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtBcnJheX0gdmFsdWVzIFRoZSB2YWx1ZXMgdG8gcmVtb3ZlLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbJ2EnLCAnYicsICdjJywgJ2EnLCAnYicsICdjJ107XG4gICAgICpcbiAgICAgKiBfLnB1bGxBbGwoYXJyYXksIFsnYScsICdjJ10pO1xuICAgICAqIGNvbnNvbGUubG9nKGFycmF5KTtcbiAgICAgKiAvLyA9PiBbJ2InLCAnYiddXG4gICAgICovXG4gICAgZnVuY3Rpb24gcHVsbEFsbChhcnJheSwgdmFsdWVzKSB7XG4gICAgICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aCAmJiB2YWx1ZXMgJiYgdmFsdWVzLmxlbmd0aClcbiAgICAgICAgPyBiYXNlUHVsbEFsbChhcnJheSwgdmFsdWVzKVxuICAgICAgICA6IGFycmF5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8ucHVsbEFsbGAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgaXRlcmF0ZWVgIHdoaWNoIGlzXG4gICAgICogaW52b2tlZCBmb3IgZWFjaCBlbGVtZW50IG9mIGBhcnJheWAgYW5kIGB2YWx1ZXNgIHRvIGdlbmVyYXRlIHRoZSBjcml0ZXJpb25cbiAgICAgKiBieSB3aGljaCB0aGV5J3JlIGNvbXBhcmVkLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDogKHZhbHVlKS5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBVbmxpa2UgYF8uZGlmZmVyZW5jZUJ5YCwgdGhpcyBtZXRob2QgbXV0YXRlcyBgYXJyYXlgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSB2YWx1ZXMgVGhlIHZhbHVlcyB0byByZW1vdmUuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbeyAneCc6IDEgfSwgeyAneCc6IDIgfSwgeyAneCc6IDMgfSwgeyAneCc6IDEgfV07XG4gICAgICpcbiAgICAgKiBfLnB1bGxBbGxCeShhcnJheSwgW3sgJ3gnOiAxIH0sIHsgJ3gnOiAzIH1dLCAneCcpO1xuICAgICAqIGNvbnNvbGUubG9nKGFycmF5KTtcbiAgICAgKiAvLyA9PiBbeyAneCc6IDIgfV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBwdWxsQWxsQnkoYXJyYXksIHZhbHVlcywgaXRlcmF0ZWUpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoICYmIHZhbHVlcyAmJiB2YWx1ZXMubGVuZ3RoKVxuICAgICAgICA/IGJhc2VQdWxsQWxsKGFycmF5LCB2YWx1ZXMsIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAyKSlcbiAgICAgICAgOiBhcnJheTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnB1bGxBbGxgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGNvbXBhcmF0b3JgIHdoaWNoXG4gICAgICogaXMgaW52b2tlZCB0byBjb21wYXJlIGVsZW1lbnRzIG9mIGBhcnJheWAgdG8gYHZhbHVlc2AuIFRoZSBjb21wYXJhdG9yIGlzXG4gICAgICogaW52b2tlZCB3aXRoIHR3byBhcmd1bWVudHM6IChhcnJWYWwsIG90aFZhbCkuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVW5saWtlIGBfLmRpZmZlcmVuY2VXaXRoYCwgdGhpcyBtZXRob2QgbXV0YXRlcyBgYXJyYXlgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuNi4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSB2YWx1ZXMgVGhlIHZhbHVlcyB0byByZW1vdmUuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NvbXBhcmF0b3JdIFRoZSBjb21wYXJhdG9yIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBhcnJheSA9IFt7ICd4JzogMSwgJ3knOiAyIH0sIHsgJ3gnOiAzLCAneSc6IDQgfSwgeyAneCc6IDUsICd5JzogNiB9XTtcbiAgICAgKlxuICAgICAqIF8ucHVsbEFsbFdpdGgoYXJyYXksIFt7ICd4JzogMywgJ3knOiA0IH1dLCBfLmlzRXF1YWwpO1xuICAgICAqIGNvbnNvbGUubG9nKGFycmF5KTtcbiAgICAgKiAvLyA9PiBbeyAneCc6IDEsICd5JzogMiB9LCB7ICd4JzogNSwgJ3knOiA2IH1dXG4gICAgICovXG4gICAgZnVuY3Rpb24gcHVsbEFsbFdpdGgoYXJyYXksIHZhbHVlcywgY29tcGFyYXRvcikge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGggJiYgdmFsdWVzICYmIHZhbHVlcy5sZW5ndGgpXG4gICAgICAgID8gYmFzZVB1bGxBbGwoYXJyYXksIHZhbHVlcywgdW5kZWZpbmVkLCBjb21wYXJhdG9yKVxuICAgICAgICA6IGFycmF5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgZWxlbWVudHMgZnJvbSBgYXJyYXlgIGNvcnJlc3BvbmRpbmcgdG8gYGluZGV4ZXNgIGFuZCByZXR1cm5zIGFuXG4gICAgICogYXJyYXkgb2YgcmVtb3ZlZCBlbGVtZW50cy5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBVbmxpa2UgYF8uYXRgLCB0aGlzIG1ldGhvZCBtdXRhdGVzIGBhcnJheWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7Li4uKG51bWJlcnxudW1iZXJbXSl9IFtpbmRleGVzXSBUaGUgaW5kZXhlcyBvZiBlbGVtZW50cyB0byByZW1vdmUuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgcmVtb3ZlZCBlbGVtZW50cy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gWydhJywgJ2InLCAnYycsICdkJ107XG4gICAgICogdmFyIHB1bGxlZCA9IF8ucHVsbEF0KGFycmF5LCBbMSwgM10pO1xuICAgICAqXG4gICAgICogY29uc29sZS5sb2coYXJyYXkpO1xuICAgICAqIC8vID0+IFsnYScsICdjJ11cbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKHB1bGxlZCk7XG4gICAgICogLy8gPT4gWydiJywgJ2QnXVxuICAgICAqL1xuICAgIHZhciBwdWxsQXQgPSBmbGF0UmVzdChmdW5jdGlvbihhcnJheSwgaW5kZXhlcykge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoLFxuICAgICAgICAgIHJlc3VsdCA9IGJhc2VBdChhcnJheSwgaW5kZXhlcyk7XG5cbiAgICAgIGJhc2VQdWxsQXQoYXJyYXksIGFycmF5TWFwKGluZGV4ZXMsIGZ1bmN0aW9uKGluZGV4KSB7XG4gICAgICAgIHJldHVybiBpc0luZGV4KGluZGV4LCBsZW5ndGgpID8gK2luZGV4IDogaW5kZXg7XG4gICAgICB9KS5zb3J0KGNvbXBhcmVBc2NlbmRpbmcpKTtcblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYWxsIGVsZW1lbnRzIGZyb20gYGFycmF5YCB0aGF0IGBwcmVkaWNhdGVgIHJldHVybnMgdHJ1dGh5IGZvclxuICAgICAqIGFuZCByZXR1cm5zIGFuIGFycmF5IG9mIHRoZSByZW1vdmVkIGVsZW1lbnRzLiBUaGUgcHJlZGljYXRlIGlzIGludm9rZWRcbiAgICAgKiB3aXRoIHRocmVlIGFyZ3VtZW50czogKHZhbHVlLCBpbmRleCwgYXJyYXkpLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFVubGlrZSBgXy5maWx0ZXJgLCB0aGlzIG1ldGhvZCBtdXRhdGVzIGBhcnJheWAuIFVzZSBgXy5wdWxsYFxuICAgICAqIHRvIHB1bGwgZWxlbWVudHMgZnJvbSBhbiBhcnJheSBieSB2YWx1ZS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAyLjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBtb2RpZnkuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIHJlbW92ZWQgZWxlbWVudHMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBhcnJheSA9IFsxLCAyLCAzLCA0XTtcbiAgICAgKiB2YXIgZXZlbnMgPSBfLnJlbW92ZShhcnJheSwgZnVuY3Rpb24obikge1xuICAgICAqICAgcmV0dXJuIG4gJSAyID09IDA7XG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhhcnJheSk7XG4gICAgICogLy8gPT4gWzEsIDNdXG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhldmVucyk7XG4gICAgICogLy8gPT4gWzIsIDRdXG4gICAgICovXG4gICAgZnVuY3Rpb24gcmVtb3ZlKGFycmF5LCBwcmVkaWNhdGUpIHtcbiAgICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICAgIGlmICghKGFycmF5ICYmIGFycmF5Lmxlbmd0aCkpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGluZGV4ZXMgPSBbXSxcbiAgICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG5cbiAgICAgIHByZWRpY2F0ZSA9IGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwgMyk7XG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgdmFsdWUgPSBhcnJheVtpbmRleF07XG4gICAgICAgIGlmIChwcmVkaWNhdGUodmFsdWUsIGluZGV4LCBhcnJheSkpIHtcbiAgICAgICAgICByZXN1bHQucHVzaCh2YWx1ZSk7XG4gICAgICAgICAgaW5kZXhlcy5wdXNoKGluZGV4KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgYmFzZVB1bGxBdChhcnJheSwgaW5kZXhlcyk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldmVyc2VzIGBhcnJheWAgc28gdGhhdCB0aGUgZmlyc3QgZWxlbWVudCBiZWNvbWVzIHRoZSBsYXN0LCB0aGUgc2Vjb25kXG4gICAgICogZWxlbWVudCBiZWNvbWVzIHRoZSBzZWNvbmQgdG8gbGFzdCwgYW5kIHNvIG9uLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgYGFycmF5YCBhbmQgaXMgYmFzZWQgb25cbiAgICAgKiBbYEFycmF5I3JldmVyc2VgXShodHRwczovL21kbi5pby9BcnJheS9yZXZlcnNlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBtb2RpZnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBhcnJheSA9IFsxLCAyLCAzXTtcbiAgICAgKlxuICAgICAqIF8ucmV2ZXJzZShhcnJheSk7XG4gICAgICogLy8gPT4gWzMsIDIsIDFdXG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhhcnJheSk7XG4gICAgICogLy8gPT4gWzMsIDIsIDFdXG4gICAgICovXG4gICAgZnVuY3Rpb24gcmV2ZXJzZShhcnJheSkge1xuICAgICAgcmV0dXJuIGFycmF5ID09IG51bGwgPyBhcnJheSA6IG5hdGl2ZVJldmVyc2UuY2FsbChhcnJheSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHNsaWNlIG9mIGBhcnJheWAgZnJvbSBgc3RhcnRgIHVwIHRvLCBidXQgbm90IGluY2x1ZGluZywgYGVuZGAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgdXNlZCBpbnN0ZWFkIG9mXG4gICAgICogW2BBcnJheSNzbGljZWBdKGh0dHBzOi8vbWRuLmlvL0FycmF5L3NsaWNlKSB0byBlbnN1cmUgZGVuc2UgYXJyYXlzIGFyZVxuICAgICAqIHJldHVybmVkLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHNsaWNlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9MF0gVGhlIHN0YXJ0IHBvc2l0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZW5kPWFycmF5Lmxlbmd0aF0gVGhlIGVuZCBwb3NpdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHNsaWNlIG9mIGBhcnJheWAuXG4gICAgICovXG4gICAgZnVuY3Rpb24gc2xpY2UoYXJyYXksIHN0YXJ0LCBlbmQpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIGlmIChlbmQgJiYgdHlwZW9mIGVuZCAhPSAnbnVtYmVyJyAmJiBpc0l0ZXJhdGVlQ2FsbChhcnJheSwgc3RhcnQsIGVuZCkpIHtcbiAgICAgICAgc3RhcnQgPSAwO1xuICAgICAgICBlbmQgPSBsZW5ndGg7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgc3RhcnQgPSBzdGFydCA9PSBudWxsID8gMCA6IHRvSW50ZWdlcihzdGFydCk7XG4gICAgICAgIGVuZCA9IGVuZCA9PT0gdW5kZWZpbmVkID8gbGVuZ3RoIDogdG9JbnRlZ2VyKGVuZCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFzZVNsaWNlKGFycmF5LCBzdGFydCwgZW5kKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2VzIGEgYmluYXJ5IHNlYXJjaCB0byBkZXRlcm1pbmUgdGhlIGxvd2VzdCBpbmRleCBhdCB3aGljaCBgdmFsdWVgXG4gICAgICogc2hvdWxkIGJlIGluc2VydGVkIGludG8gYGFycmF5YCBpbiBvcmRlciB0byBtYWludGFpbiBpdHMgc29ydCBvcmRlci5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBzb3J0ZWQgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBldmFsdWF0ZS5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBhdCB3aGljaCBgdmFsdWVgIHNob3VsZCBiZSBpbnNlcnRlZFxuICAgICAqICBpbnRvIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uc29ydGVkSW5kZXgoWzMwLCA1MF0sIDQwKTtcbiAgICAgKiAvLyA9PiAxXG4gICAgICovXG4gICAgZnVuY3Rpb24gc29ydGVkSW5kZXgoYXJyYXksIHZhbHVlKSB7XG4gICAgICByZXR1cm4gYmFzZVNvcnRlZEluZGV4KGFycmF5LCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5zb3J0ZWRJbmRleGAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgaXRlcmF0ZWVgXG4gICAgICogd2hpY2ggaXMgaW52b2tlZCBmb3IgYHZhbHVlYCBhbmQgZWFjaCBlbGVtZW50IG9mIGBhcnJheWAgdG8gY29tcHV0ZSB0aGVpclxuICAgICAqIHNvcnQgcmFua2luZy4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6ICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgc29ydGVkIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gZXZhbHVhdGUuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IGF0IHdoaWNoIGB2YWx1ZWAgc2hvdWxkIGJlIGluc2VydGVkXG4gICAgICogIGludG8gYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdHMgPSBbeyAneCc6IDQgfSwgeyAneCc6IDUgfV07XG4gICAgICpcbiAgICAgKiBfLnNvcnRlZEluZGV4Qnkob2JqZWN0cywgeyAneCc6IDQgfSwgZnVuY3Rpb24obykgeyByZXR1cm4gby54OyB9KTtcbiAgICAgKiAvLyA9PiAwXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLnNvcnRlZEluZGV4Qnkob2JqZWN0cywgeyAneCc6IDQgfSwgJ3gnKTtcbiAgICAgKiAvLyA9PiAwXG4gICAgICovXG4gICAgZnVuY3Rpb24gc29ydGVkSW5kZXhCeShhcnJheSwgdmFsdWUsIGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gYmFzZVNvcnRlZEluZGV4QnkoYXJyYXksIHZhbHVlLCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMikpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uaW5kZXhPZmAgZXhjZXB0IHRoYXQgaXQgcGVyZm9ybXMgYSBiaW5hcnlcbiAgICAgKiBzZWFyY2ggb24gYSBzb3J0ZWQgYGFycmF5YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5zb3J0ZWRJbmRleE9mKFs0LCA1LCA1LCA1LCA2XSwgNSk7XG4gICAgICogLy8gPT4gMVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNvcnRlZEluZGV4T2YoYXJyYXksIHZhbHVlKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7XG4gICAgICBpZiAobGVuZ3RoKSB7XG4gICAgICAgIHZhciBpbmRleCA9IGJhc2VTb3J0ZWRJbmRleChhcnJheSwgdmFsdWUpO1xuICAgICAgICBpZiAoaW5kZXggPCBsZW5ndGggJiYgZXEoYXJyYXlbaW5kZXhdLCB2YWx1ZSkpIHtcbiAgICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiAtMTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnNvcnRlZEluZGV4YCBleGNlcHQgdGhhdCBpdCByZXR1cm5zIHRoZSBoaWdoZXN0XG4gICAgICogaW5kZXggYXQgd2hpY2ggYHZhbHVlYCBzaG91bGQgYmUgaW5zZXJ0ZWQgaW50byBgYXJyYXlgIGluIG9yZGVyIHRvXG4gICAgICogbWFpbnRhaW4gaXRzIHNvcnQgb3JkZXIuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgc29ydGVkIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gZXZhbHVhdGUuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggYXQgd2hpY2ggYHZhbHVlYCBzaG91bGQgYmUgaW5zZXJ0ZWRcbiAgICAgKiAgaW50byBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnNvcnRlZExhc3RJbmRleChbNCwgNSwgNSwgNSwgNl0sIDUpO1xuICAgICAqIC8vID0+IDRcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzb3J0ZWRMYXN0SW5kZXgoYXJyYXksIHZhbHVlKSB7XG4gICAgICByZXR1cm4gYmFzZVNvcnRlZEluZGV4KGFycmF5LCB2YWx1ZSwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5zb3J0ZWRMYXN0SW5kZXhgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGl0ZXJhdGVlYFxuICAgICAqIHdoaWNoIGlzIGludm9rZWQgZm9yIGB2YWx1ZWAgYW5kIGVhY2ggZWxlbWVudCBvZiBgYXJyYXlgIHRvIGNvbXB1dGUgdGhlaXJcbiAgICAgKiBzb3J0IHJhbmtpbmcuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIHNvcnRlZCBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGV2YWx1YXRlLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBhdCB3aGljaCBgdmFsdWVgIHNob3VsZCBiZSBpbnNlcnRlZFxuICAgICAqICBpbnRvIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gW3sgJ3gnOiA0IH0sIHsgJ3gnOiA1IH1dO1xuICAgICAqXG4gICAgICogXy5zb3J0ZWRMYXN0SW5kZXhCeShvYmplY3RzLCB7ICd4JzogNCB9LCBmdW5jdGlvbihvKSB7IHJldHVybiBvLng7IH0pO1xuICAgICAqIC8vID0+IDFcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uc29ydGVkTGFzdEluZGV4Qnkob2JqZWN0cywgeyAneCc6IDQgfSwgJ3gnKTtcbiAgICAgKiAvLyA9PiAxXG4gICAgICovXG4gICAgZnVuY3Rpb24gc29ydGVkTGFzdEluZGV4QnkoYXJyYXksIHZhbHVlLCBpdGVyYXRlZSkge1xuICAgICAgcmV0dXJuIGJhc2VTb3J0ZWRJbmRleEJ5KGFycmF5LCB2YWx1ZSwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDIpLCB0cnVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmxhc3RJbmRleE9mYCBleGNlcHQgdGhhdCBpdCBwZXJmb3JtcyBhIGJpbmFyeVxuICAgICAqIHNlYXJjaCBvbiBhIHNvcnRlZCBgYXJyYXlgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbWF0Y2hlZCB2YWx1ZSwgZWxzZSBgLTFgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnNvcnRlZExhc3RJbmRleE9mKFs0LCA1LCA1LCA1LCA2XSwgNSk7XG4gICAgICogLy8gPT4gM1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNvcnRlZExhc3RJbmRleE9mKGFycmF5LCB2YWx1ZSkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgICAgaWYgKGxlbmd0aCkge1xuICAgICAgICB2YXIgaW5kZXggPSBiYXNlU29ydGVkSW5kZXgoYXJyYXksIHZhbHVlLCB0cnVlKSAtIDE7XG4gICAgICAgIGlmIChlcShhcnJheVtpbmRleF0sIHZhbHVlKSkge1xuICAgICAgICAgIHJldHVybiBpbmRleDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIC0xO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8udW5pcWAgZXhjZXB0IHRoYXQgaXQncyBkZXNpZ25lZCBhbmQgb3B0aW1pemVkXG4gICAgICogZm9yIHNvcnRlZCBhcnJheXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBkdXBsaWNhdGUgZnJlZSBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5zb3J0ZWRVbmlxKFsxLCAxLCAyXSk7XG4gICAgICogLy8gPT4gWzEsIDJdXG4gICAgICovXG4gICAgZnVuY3Rpb24gc29ydGVkVW5pcShhcnJheSkge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpXG4gICAgICAgID8gYmFzZVNvcnRlZFVuaXEoYXJyYXkpXG4gICAgICAgIDogW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy51bmlxQnlgIGV4Y2VwdCB0aGF0IGl0J3MgZGVzaWduZWQgYW5kIG9wdGltaXplZFxuICAgICAqIGZvciBzb3J0ZWQgYXJyYXlzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlXSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBkdXBsaWNhdGUgZnJlZSBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5zb3J0ZWRVbmlxQnkoWzEuMSwgMS4yLCAyLjMsIDIuNF0sIE1hdGguZmxvb3IpO1xuICAgICAqIC8vID0+IFsxLjEsIDIuM11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzb3J0ZWRVbmlxQnkoYXJyYXksIGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aClcbiAgICAgICAgPyBiYXNlU29ydGVkVW5pcShhcnJheSwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDIpKVxuICAgICAgICA6IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgYWxsIGJ1dCB0aGUgZmlyc3QgZWxlbWVudCBvZiBgYXJyYXlgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgc2xpY2Ugb2YgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50YWlsKFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gWzIsIDNdXG4gICAgICovXG4gICAgZnVuY3Rpb24gdGFpbChhcnJheSkge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoO1xuICAgICAgcmV0dXJuIGxlbmd0aCA/IGJhc2VTbGljZShhcnJheSwgMSwgbGVuZ3RoKSA6IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBzbGljZSBvZiBgYXJyYXlgIHdpdGggYG5gIGVsZW1lbnRzIHRha2VuIGZyb20gdGhlIGJlZ2lubmluZy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW249MV0gVGhlIG51bWJlciBvZiBlbGVtZW50cyB0byB0YWtlLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBzbGljZSBvZiBgYXJyYXlgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRha2UoWzEsIDIsIDNdKTtcbiAgICAgKiAvLyA9PiBbMV1cbiAgICAgKlxuICAgICAqIF8udGFrZShbMSwgMiwgM10sIDIpO1xuICAgICAqIC8vID0+IFsxLCAyXVxuICAgICAqXG4gICAgICogXy50YWtlKFsxLCAyLCAzXSwgNSk7XG4gICAgICogLy8gPT4gWzEsIDIsIDNdXG4gICAgICpcbiAgICAgKiBfLnRha2UoWzEsIDIsIDNdLCAwKTtcbiAgICAgKiAvLyA9PiBbXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRha2UoYXJyYXksIG4sIGd1YXJkKSB7XG4gICAgICBpZiAoIShhcnJheSAmJiBhcnJheS5sZW5ndGgpKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIG4gPSAoZ3VhcmQgfHwgbiA9PT0gdW5kZWZpbmVkKSA/IDEgOiB0b0ludGVnZXIobik7XG4gICAgICByZXR1cm4gYmFzZVNsaWNlKGFycmF5LCAwLCBuIDwgMCA/IDAgOiBuKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgc2xpY2Ugb2YgYGFycmF5YCB3aXRoIGBuYCBlbGVtZW50cyB0YWtlbiBmcm9tIHRoZSBlbmQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtuPTFdIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgdG8gdGFrZS5cbiAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgc2xpY2Ugb2YgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50YWtlUmlnaHQoWzEsIDIsIDNdKTtcbiAgICAgKiAvLyA9PiBbM11cbiAgICAgKlxuICAgICAqIF8udGFrZVJpZ2h0KFsxLCAyLCAzXSwgMik7XG4gICAgICogLy8gPT4gWzIsIDNdXG4gICAgICpcbiAgICAgKiBfLnRha2VSaWdodChbMSwgMiwgM10sIDUpO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqXG4gICAgICogXy50YWtlUmlnaHQoWzEsIDIsIDNdLCAwKTtcbiAgICAgKiAvLyA9PiBbXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRha2VSaWdodChhcnJheSwgbiwgZ3VhcmQpIHtcbiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDtcbiAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIG4gPSAoZ3VhcmQgfHwgbiA9PT0gdW5kZWZpbmVkKSA/IDEgOiB0b0ludGVnZXIobik7XG4gICAgICBuID0gbGVuZ3RoIC0gbjtcbiAgICAgIHJldHVybiBiYXNlU2xpY2UoYXJyYXksIG4gPCAwID8gMCA6IG4sIGxlbmd0aCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHNsaWNlIG9mIGBhcnJheWAgd2l0aCBlbGVtZW50cyB0YWtlbiBmcm9tIHRoZSBlbmQuIEVsZW1lbnRzIGFyZVxuICAgICAqIHRha2VuIHVudGlsIGBwcmVkaWNhdGVgIHJldHVybnMgZmFsc2V5LiBUaGUgcHJlZGljYXRlIGlzIGludm9rZWQgd2l0aFxuICAgICAqIHRocmVlIGFyZ3VtZW50czogKHZhbHVlLCBpbmRleCwgYXJyYXkpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHNsaWNlIG9mIGBhcnJheWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgICdhY3RpdmUnOiB0cnVlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICAnYWN0aXZlJzogZmFsc2UgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAncGViYmxlcycsICdhY3RpdmUnOiBmYWxzZSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8udGFrZVJpZ2h0V2hpbGUodXNlcnMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuICFvLmFjdGl2ZTsgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydmcmVkJywgJ3BlYmJsZXMnXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLnRha2VSaWdodFdoaWxlKHVzZXJzLCB7ICd1c2VyJzogJ3BlYmJsZXMnLCAnYWN0aXZlJzogZmFsc2UgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydwZWJibGVzJ11cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLnRha2VSaWdodFdoaWxlKHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydmcmVkJywgJ3BlYmJsZXMnXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy50YWtlUmlnaHRXaGlsZSh1c2VycywgJ2FjdGl2ZScpO1xuICAgICAqIC8vID0+IFtdXG4gICAgICovXG4gICAgZnVuY3Rpb24gdGFrZVJpZ2h0V2hpbGUoYXJyYXksIHByZWRpY2F0ZSkge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpXG4gICAgICAgID8gYmFzZVdoaWxlKGFycmF5LCBnZXRJdGVyYXRlZShwcmVkaWNhdGUsIDMpLCBmYWxzZSwgdHJ1ZSlcbiAgICAgICAgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgc2xpY2Ugb2YgYGFycmF5YCB3aXRoIGVsZW1lbnRzIHRha2VuIGZyb20gdGhlIGJlZ2lubmluZy4gRWxlbWVudHNcbiAgICAgKiBhcmUgdGFrZW4gdW50aWwgYHByZWRpY2F0ZWAgcmV0dXJucyBmYWxzZXkuIFRoZSBwcmVkaWNhdGUgaXMgaW52b2tlZCB3aXRoXG4gICAgICogdGhyZWUgYXJndW1lbnRzOiAodmFsdWUsIGluZGV4LCBhcnJheSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgc2xpY2Ugb2YgYGFycmF5YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAgJ2FjdGl2ZSc6IGZhbHNlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICAnYWN0aXZlJzogZmFsc2UgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAncGViYmxlcycsICdhY3RpdmUnOiB0cnVlIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy50YWtlV2hpbGUodXNlcnMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuICFvLmFjdGl2ZTsgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydiYXJuZXknLCAnZnJlZCddXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8udGFrZVdoaWxlKHVzZXJzLCB7ICd1c2VyJzogJ2Jhcm5leScsICdhY3RpdmUnOiBmYWxzZSB9KTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ2Jhcm5leSddXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy50YWtlV2hpbGUodXNlcnMsIFsnYWN0aXZlJywgZmFsc2VdKTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ2Jhcm5leScsICdmcmVkJ11cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8udGFrZVdoaWxlKHVzZXJzLCAnYWN0aXZlJyk7XG4gICAgICogLy8gPT4gW11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0YWtlV2hpbGUoYXJyYXksIHByZWRpY2F0ZSkge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpXG4gICAgICAgID8gYmFzZVdoaWxlKGFycmF5LCBnZXRJdGVyYXRlZShwcmVkaWNhdGUsIDMpKVxuICAgICAgICA6IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdW5pcXVlIHZhbHVlcywgaW4gb3JkZXIsIGZyb20gYWxsIGdpdmVuIGFycmF5cyB1c2luZ1xuICAgICAqIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pXG4gICAgICogZm9yIGVxdWFsaXR5IGNvbXBhcmlzb25zLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHsuLi5BcnJheX0gW2FycmF5c10gVGhlIGFycmF5cyB0byBpbnNwZWN0LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGNvbWJpbmVkIHZhbHVlcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy51bmlvbihbMl0sIFsxLCAyXSk7XG4gICAgICogLy8gPT4gWzIsIDFdXG4gICAgICovXG4gICAgdmFyIHVuaW9uID0gYmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKSB7XG4gICAgICByZXR1cm4gYmFzZVVuaXEoYmFzZUZsYXR0ZW4oYXJyYXlzLCAxLCBpc0FycmF5TGlrZU9iamVjdCwgdHJ1ZSkpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy51bmlvbmAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgaXRlcmF0ZWVgIHdoaWNoIGlzXG4gICAgICogaW52b2tlZCBmb3IgZWFjaCBlbGVtZW50IG9mIGVhY2ggYGFycmF5c2AgdG8gZ2VuZXJhdGUgdGhlIGNyaXRlcmlvbiBieVxuICAgICAqIHdoaWNoIHVuaXF1ZW5lc3MgaXMgY29tcHV0ZWQuIFJlc3VsdCB2YWx1ZXMgYXJlIGNob3NlbiBmcm9tIHRoZSBmaXJzdFxuICAgICAqIGFycmF5IGluIHdoaWNoIHRoZSB2YWx1ZSBvY2N1cnMuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OlxuICAgICAqICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0gey4uLkFycmF5fSBbYXJyYXlzXSBUaGUgYXJyYXlzIHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGNvbWJpbmVkIHZhbHVlcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy51bmlvbkJ5KFsyLjFdLCBbMS4yLCAyLjNdLCBNYXRoLmZsb29yKTtcbiAgICAgKiAvLyA9PiBbMi4xLCAxLjJdXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLnVuaW9uQnkoW3sgJ3gnOiAxIH1dLCBbeyAneCc6IDIgfSwgeyAneCc6IDEgfV0sICd4Jyk7XG4gICAgICogLy8gPT4gW3sgJ3gnOiAxIH0sIHsgJ3gnOiAyIH1dXG4gICAgICovXG4gICAgdmFyIHVuaW9uQnkgPSBiYXNlUmVzdChmdW5jdGlvbihhcnJheXMpIHtcbiAgICAgIHZhciBpdGVyYXRlZSA9IGxhc3QoYXJyYXlzKTtcbiAgICAgIGlmIChpc0FycmF5TGlrZU9iamVjdChpdGVyYXRlZSkpIHtcbiAgICAgICAgaXRlcmF0ZWUgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFzZVVuaXEoYmFzZUZsYXR0ZW4oYXJyYXlzLCAxLCBpc0FycmF5TGlrZU9iamVjdCwgdHJ1ZSksIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAyKSk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnVuaW9uYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBjb21wYXJhdG9yYCB3aGljaFxuICAgICAqIGlzIGludm9rZWQgdG8gY29tcGFyZSBlbGVtZW50cyBvZiBgYXJyYXlzYC4gUmVzdWx0IHZhbHVlcyBhcmUgY2hvc2VuIGZyb21cbiAgICAgKiB0aGUgZmlyc3QgYXJyYXkgaW4gd2hpY2ggdGhlIHZhbHVlIG9jY3Vycy4gVGhlIGNvbXBhcmF0b3IgaXMgaW52b2tlZFxuICAgICAqIHdpdGggdHdvIGFyZ3VtZW50czogKGFyclZhbCwgb3RoVmFsKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7Li4uQXJyYXl9IFthcnJheXNdIFRoZSBhcnJheXMgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY29tcGFyYXRvcl0gVGhlIGNvbXBhcmF0b3IgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBjb21iaW5lZCB2YWx1ZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gW3sgJ3gnOiAxLCAneSc6IDIgfSwgeyAneCc6IDIsICd5JzogMSB9XTtcbiAgICAgKiB2YXIgb3RoZXJzID0gW3sgJ3gnOiAxLCAneSc6IDEgfSwgeyAneCc6IDEsICd5JzogMiB9XTtcbiAgICAgKlxuICAgICAqIF8udW5pb25XaXRoKG9iamVjdHMsIG90aGVycywgXy5pc0VxdWFsKTtcbiAgICAgKiAvLyA9PiBbeyAneCc6IDEsICd5JzogMiB9LCB7ICd4JzogMiwgJ3knOiAxIH0sIHsgJ3gnOiAxLCAneSc6IDEgfV1cbiAgICAgKi9cbiAgICB2YXIgdW5pb25XaXRoID0gYmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKSB7XG4gICAgICB2YXIgY29tcGFyYXRvciA9IGxhc3QoYXJyYXlzKTtcbiAgICAgIGNvbXBhcmF0b3IgPSB0eXBlb2YgY29tcGFyYXRvciA9PSAnZnVuY3Rpb24nID8gY29tcGFyYXRvciA6IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiBiYXNlVW5pcShiYXNlRmxhdHRlbihhcnJheXMsIDEsIGlzQXJyYXlMaWtlT2JqZWN0LCB0cnVlKSwgdW5kZWZpbmVkLCBjb21wYXJhdG9yKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBkdXBsaWNhdGUtZnJlZSB2ZXJzaW9uIG9mIGFuIGFycmF5LCB1c2luZ1xuICAgICAqIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pXG4gICAgICogZm9yIGVxdWFsaXR5IGNvbXBhcmlzb25zLCBpbiB3aGljaCBvbmx5IHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIGVhY2ggZWxlbWVudFxuICAgICAqIGlzIGtlcHQuIFRoZSBvcmRlciBvZiByZXN1bHQgdmFsdWVzIGlzIGRldGVybWluZWQgYnkgdGhlIG9yZGVyIHRoZXkgb2NjdXJcbiAgICAgKiBpbiB0aGUgYXJyYXkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBkdXBsaWNhdGUgZnJlZSBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy51bmlxKFsyLCAxLCAyXSk7XG4gICAgICogLy8gPT4gWzIsIDFdXG4gICAgICovXG4gICAgZnVuY3Rpb24gdW5pcShhcnJheSkge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpID8gYmFzZVVuaXEoYXJyYXkpIDogW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy51bmlxYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBpdGVyYXRlZWAgd2hpY2ggaXNcbiAgICAgKiBpbnZva2VkIGZvciBlYWNoIGVsZW1lbnQgaW4gYGFycmF5YCB0byBnZW5lcmF0ZSB0aGUgY3JpdGVyaW9uIGJ5IHdoaWNoXG4gICAgICogdW5pcXVlbmVzcyBpcyBjb21wdXRlZC4gVGhlIG9yZGVyIG9mIHJlc3VsdCB2YWx1ZXMgaXMgZGV0ZXJtaW5lZCBieSB0aGVcbiAgICAgKiBvcmRlciB0aGV5IG9jY3VyIGluIHRoZSBhcnJheS4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6XG4gICAgICogKHZhbHVlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBkdXBsaWNhdGUgZnJlZSBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy51bmlxQnkoWzIuMSwgMS4yLCAyLjNdLCBNYXRoLmZsb29yKTtcbiAgICAgKiAvLyA9PiBbMi4xLCAxLjJdXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLnVuaXFCeShbeyAneCc6IDEgfSwgeyAneCc6IDIgfSwgeyAneCc6IDEgfV0sICd4Jyk7XG4gICAgICogLy8gPT4gW3sgJ3gnOiAxIH0sIHsgJ3gnOiAyIH1dXG4gICAgICovXG4gICAgZnVuY3Rpb24gdW5pcUJ5KGFycmF5LCBpdGVyYXRlZSkge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpID8gYmFzZVVuaXEoYXJyYXksIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAyKSkgOiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnVuaXFgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGNvbXBhcmF0b3JgIHdoaWNoXG4gICAgICogaXMgaW52b2tlZCB0byBjb21wYXJlIGVsZW1lbnRzIG9mIGBhcnJheWAuIFRoZSBvcmRlciBvZiByZXN1bHQgdmFsdWVzIGlzXG4gICAgICogZGV0ZXJtaW5lZCBieSB0aGUgb3JkZXIgdGhleSBvY2N1ciBpbiB0aGUgYXJyYXkuVGhlIGNvbXBhcmF0b3IgaXMgaW52b2tlZFxuICAgICAqIHdpdGggdHdvIGFyZ3VtZW50czogKGFyclZhbCwgb3RoVmFsKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjb21wYXJhdG9yXSBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGR1cGxpY2F0ZSBmcmVlIGFycmF5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFt7ICd4JzogMSwgJ3knOiAyIH0sIHsgJ3gnOiAyLCAneSc6IDEgfSwgeyAneCc6IDEsICd5JzogMiB9XTtcbiAgICAgKlxuICAgICAqIF8udW5pcVdpdGgob2JqZWN0cywgXy5pc0VxdWFsKTtcbiAgICAgKiAvLyA9PiBbeyAneCc6IDEsICd5JzogMiB9LCB7ICd4JzogMiwgJ3knOiAxIH1dXG4gICAgICovXG4gICAgZnVuY3Rpb24gdW5pcVdpdGgoYXJyYXksIGNvbXBhcmF0b3IpIHtcbiAgICAgIGNvbXBhcmF0b3IgPSB0eXBlb2YgY29tcGFyYXRvciA9PSAnZnVuY3Rpb24nID8gY29tcGFyYXRvciA6IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKSA/IGJhc2VVbmlxKGFycmF5LCB1bmRlZmluZWQsIGNvbXBhcmF0b3IpIDogW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy56aXBgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYW4gYXJyYXkgb2YgZ3JvdXBlZFxuICAgICAqIGVsZW1lbnRzIGFuZCBjcmVhdGVzIGFuIGFycmF5IHJlZ3JvdXBpbmcgdGhlIGVsZW1lbnRzIHRvIHRoZWlyIHByZS16aXBcbiAgICAgKiBjb25maWd1cmF0aW9uLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDEuMi4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IG9mIGdyb3VwZWQgZWxlbWVudHMgdG8gcHJvY2Vzcy5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiByZWdyb3VwZWQgZWxlbWVudHMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB6aXBwZWQgPSBfLnppcChbJ2EnLCAnYiddLCBbMSwgMl0sIFt0cnVlLCBmYWxzZV0pO1xuICAgICAqIC8vID0+IFtbJ2EnLCAxLCB0cnVlXSwgWydiJywgMiwgZmFsc2VdXVxuICAgICAqXG4gICAgICogXy51bnppcCh6aXBwZWQpO1xuICAgICAqIC8vID0+IFtbJ2EnLCAnYiddLCBbMSwgMl0sIFt0cnVlLCBmYWxzZV1dXG4gICAgICovXG4gICAgZnVuY3Rpb24gdW56aXAoYXJyYXkpIHtcbiAgICAgIGlmICghKGFycmF5ICYmIGFycmF5Lmxlbmd0aCkpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgdmFyIGxlbmd0aCA9IDA7XG4gICAgICBhcnJheSA9IGFycmF5RmlsdGVyKGFycmF5LCBmdW5jdGlvbihncm91cCkge1xuICAgICAgICBpZiAoaXNBcnJheUxpa2VPYmplY3QoZ3JvdXApKSB7XG4gICAgICAgICAgbGVuZ3RoID0gbmF0aXZlTWF4KGdyb3VwLmxlbmd0aCwgbGVuZ3RoKTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gYmFzZVRpbWVzKGxlbmd0aCwgZnVuY3Rpb24oaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIGFycmF5TWFwKGFycmF5LCBiYXNlUHJvcGVydHkoaW5kZXgpKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8udW56aXBgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGl0ZXJhdGVlYCB0byBzcGVjaWZ5XG4gICAgICogaG93IHJlZ3JvdXBlZCB2YWx1ZXMgc2hvdWxkIGJlIGNvbWJpbmVkLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIHRoZVxuICAgICAqIGVsZW1lbnRzIG9mIGVhY2ggZ3JvdXA6ICguLi5ncm91cCkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy44LjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgb2YgZ3JvdXBlZCBlbGVtZW50cyB0byBwcm9jZXNzLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gdG8gY29tYmluZVxuICAgICAqICByZWdyb3VwZWQgdmFsdWVzLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIHJlZ3JvdXBlZCBlbGVtZW50cy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHppcHBlZCA9IF8uemlwKFsxLCAyXSwgWzEwLCAyMF0sIFsxMDAsIDIwMF0pO1xuICAgICAqIC8vID0+IFtbMSwgMTAsIDEwMF0sIFsyLCAyMCwgMjAwXV1cbiAgICAgKlxuICAgICAqIF8udW56aXBXaXRoKHppcHBlZCwgXy5hZGQpO1xuICAgICAqIC8vID0+IFszLCAzMCwgMzAwXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHVuemlwV2l0aChhcnJheSwgaXRlcmF0ZWUpIHtcbiAgICAgIGlmICghKGFycmF5ICYmIGFycmF5Lmxlbmd0aCkpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgdmFyIHJlc3VsdCA9IHVuemlwKGFycmF5KTtcbiAgICAgIGlmIChpdGVyYXRlZSA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gYXJyYXlNYXAocmVzdWx0LCBmdW5jdGlvbihncm91cCkge1xuICAgICAgICByZXR1cm4gYXBwbHkoaXRlcmF0ZWUsIHVuZGVmaW5lZCwgZ3JvdXApO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBleGNsdWRpbmcgYWxsIGdpdmVuIHZhbHVlcyB1c2luZ1xuICAgICAqIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pXG4gICAgICogZm9yIGVxdWFsaXR5IGNvbXBhcmlzb25zLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFVubGlrZSBgXy5wdWxsYCwgdGhpcyBtZXRob2QgcmV0dXJucyBhIG5ldyBhcnJheS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7Li4uKn0gW3ZhbHVlc10gVGhlIHZhbHVlcyB0byBleGNsdWRlLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGZpbHRlcmVkIHZhbHVlcy5cbiAgICAgKiBAc2VlIF8uZGlmZmVyZW5jZSwgXy54b3JcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy53aXRob3V0KFsyLCAxLCAyLCAzXSwgMSwgMik7XG4gICAgICogLy8gPT4gWzNdXG4gICAgICovXG4gICAgdmFyIHdpdGhvdXQgPSBiYXNlUmVzdChmdW5jdGlvbihhcnJheSwgdmFsdWVzKSB7XG4gICAgICByZXR1cm4gaXNBcnJheUxpa2VPYmplY3QoYXJyYXkpXG4gICAgICAgID8gYmFzZURpZmZlcmVuY2UoYXJyYXksIHZhbHVlcylcbiAgICAgICAgOiBbXTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdW5pcXVlIHZhbHVlcyB0aGF0IGlzIHRoZVxuICAgICAqIFtzeW1tZXRyaWMgZGlmZmVyZW5jZV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU3ltbWV0cmljX2RpZmZlcmVuY2UpXG4gICAgICogb2YgdGhlIGdpdmVuIGFycmF5cy4gVGhlIG9yZGVyIG9mIHJlc3VsdCB2YWx1ZXMgaXMgZGV0ZXJtaW5lZCBieSB0aGUgb3JkZXJcbiAgICAgKiB0aGV5IG9jY3VyIGluIHRoZSBhcnJheXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMi40LjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0gey4uLkFycmF5fSBbYXJyYXlzXSBUaGUgYXJyYXlzIHRvIGluc3BlY3QuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgZmlsdGVyZWQgdmFsdWVzLlxuICAgICAqIEBzZWUgXy5kaWZmZXJlbmNlLCBfLndpdGhvdXRcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy54b3IoWzIsIDFdLCBbMiwgM10pO1xuICAgICAqIC8vID0+IFsxLCAzXVxuICAgICAqL1xuICAgIHZhciB4b3IgPSBiYXNlUmVzdChmdW5jdGlvbihhcnJheXMpIHtcbiAgICAgIHJldHVybiBiYXNlWG9yKGFycmF5RmlsdGVyKGFycmF5cywgaXNBcnJheUxpa2VPYmplY3QpKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8ueG9yYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBpdGVyYXRlZWAgd2hpY2ggaXNcbiAgICAgKiBpbnZva2VkIGZvciBlYWNoIGVsZW1lbnQgb2YgZWFjaCBgYXJyYXlzYCB0byBnZW5lcmF0ZSB0aGUgY3JpdGVyaW9uIGJ5XG4gICAgICogd2hpY2ggYnkgd2hpY2ggdGhleSdyZSBjb21wYXJlZC4gVGhlIG9yZGVyIG9mIHJlc3VsdCB2YWx1ZXMgaXMgZGV0ZXJtaW5lZFxuICAgICAqIGJ5IHRoZSBvcmRlciB0aGV5IG9jY3VyIGluIHRoZSBhcnJheXMuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lXG4gICAgICogYXJndW1lbnQ6ICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0gey4uLkFycmF5fSBbYXJyYXlzXSBUaGUgYXJyYXlzIHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGZpbHRlcmVkIHZhbHVlcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy54b3JCeShbMi4xLCAxLjJdLCBbMi4zLCAzLjRdLCBNYXRoLmZsb29yKTtcbiAgICAgKiAvLyA9PiBbMS4yLCAzLjRdXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLnhvckJ5KFt7ICd4JzogMSB9XSwgW3sgJ3gnOiAyIH0sIHsgJ3gnOiAxIH1dLCAneCcpO1xuICAgICAqIC8vID0+IFt7ICd4JzogMiB9XVxuICAgICAqL1xuICAgIHZhciB4b3JCeSA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cykge1xuICAgICAgdmFyIGl0ZXJhdGVlID0gbGFzdChhcnJheXMpO1xuICAgICAgaWYgKGlzQXJyYXlMaWtlT2JqZWN0KGl0ZXJhdGVlKSkge1xuICAgICAgICBpdGVyYXRlZSA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBiYXNlWG9yKGFycmF5RmlsdGVyKGFycmF5cywgaXNBcnJheUxpa2VPYmplY3QpLCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMikpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy54b3JgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGNvbXBhcmF0b3JgIHdoaWNoIGlzXG4gICAgICogaW52b2tlZCB0byBjb21wYXJlIGVsZW1lbnRzIG9mIGBhcnJheXNgLiBUaGUgb3JkZXIgb2YgcmVzdWx0IHZhbHVlcyBpc1xuICAgICAqIGRldGVybWluZWQgYnkgdGhlIG9yZGVyIHRoZXkgb2NjdXIgaW4gdGhlIGFycmF5cy4gVGhlIGNvbXBhcmF0b3IgaXMgaW52b2tlZFxuICAgICAqIHdpdGggdHdvIGFyZ3VtZW50czogKGFyclZhbCwgb3RoVmFsKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBBcnJheVxuICAgICAqIEBwYXJhbSB7Li4uQXJyYXl9IFthcnJheXNdIFRoZSBhcnJheXMgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY29tcGFyYXRvcl0gVGhlIGNvbXBhcmF0b3IgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBmaWx0ZXJlZCB2YWx1ZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gW3sgJ3gnOiAxLCAneSc6IDIgfSwgeyAneCc6IDIsICd5JzogMSB9XTtcbiAgICAgKiB2YXIgb3RoZXJzID0gW3sgJ3gnOiAxLCAneSc6IDEgfSwgeyAneCc6IDEsICd5JzogMiB9XTtcbiAgICAgKlxuICAgICAqIF8ueG9yV2l0aChvYmplY3RzLCBvdGhlcnMsIF8uaXNFcXVhbCk7XG4gICAgICogLy8gPT4gW3sgJ3gnOiAyLCAneSc6IDEgfSwgeyAneCc6IDEsICd5JzogMSB9XVxuICAgICAqL1xuICAgIHZhciB4b3JXaXRoID0gYmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKSB7XG4gICAgICB2YXIgY29tcGFyYXRvciA9IGxhc3QoYXJyYXlzKTtcbiAgICAgIGNvbXBhcmF0b3IgPSB0eXBlb2YgY29tcGFyYXRvciA9PSAnZnVuY3Rpb24nID8gY29tcGFyYXRvciA6IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiBiYXNlWG9yKGFycmF5RmlsdGVyKGFycmF5cywgaXNBcnJheUxpa2VPYmplY3QpLCB1bmRlZmluZWQsIGNvbXBhcmF0b3IpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiBncm91cGVkIGVsZW1lbnRzLCB0aGUgZmlyc3Qgb2Ygd2hpY2ggY29udGFpbnMgdGhlXG4gICAgICogZmlyc3QgZWxlbWVudHMgb2YgdGhlIGdpdmVuIGFycmF5cywgdGhlIHNlY29uZCBvZiB3aGljaCBjb250YWlucyB0aGVcbiAgICAgKiBzZWNvbmQgZWxlbWVudHMgb2YgdGhlIGdpdmVuIGFycmF5cywgYW5kIHNvIG9uLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEFycmF5XG4gICAgICogQHBhcmFtIHsuLi5BcnJheX0gW2FycmF5c10gVGhlIGFycmF5cyB0byBwcm9jZXNzLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGdyb3VwZWQgZWxlbWVudHMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uemlwKFsnYScsICdiJ10sIFsxLCAyXSwgW3RydWUsIGZhbHNlXSk7XG4gICAgICogLy8gPT4gW1snYScsIDEsIHRydWVdLCBbJ2InLCAyLCBmYWxzZV1dXG4gICAgICovXG4gICAgdmFyIHppcCA9IGJhc2VSZXN0KHVuemlwKTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZnJvbVBhaXJzYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIHR3byBhcnJheXMsXG4gICAgICogb25lIG9mIHByb3BlcnR5IGlkZW50aWZpZXJzIGFuZCBvbmUgb2YgY29ycmVzcG9uZGluZyB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC40LjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbcHJvcHM9W11dIFRoZSBwcm9wZXJ0eSBpZGVudGlmaWVycy5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbdmFsdWVzPVtdXSBUaGUgcHJvcGVydHkgdmFsdWVzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uemlwT2JqZWN0KFsnYScsICdiJ10sIFsxLCAyXSk7XG4gICAgICogLy8gPT4geyAnYSc6IDEsICdiJzogMiB9XG4gICAgICovXG4gICAgZnVuY3Rpb24gemlwT2JqZWN0KHByb3BzLCB2YWx1ZXMpIHtcbiAgICAgIHJldHVybiBiYXNlWmlwT2JqZWN0KHByb3BzIHx8IFtdLCB2YWx1ZXMgfHwgW10sIGFzc2lnblZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnppcE9iamVjdGAgZXhjZXB0IHRoYXQgaXQgc3VwcG9ydHMgcHJvcGVydHkgcGF0aHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbcHJvcHM9W11dIFRoZSBwcm9wZXJ0eSBpZGVudGlmaWVycy5cbiAgICAgKiBAcGFyYW0ge0FycmF5fSBbdmFsdWVzPVtdXSBUaGUgcHJvcGVydHkgdmFsdWVzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uemlwT2JqZWN0RGVlcChbJ2EuYlswXS5jJywgJ2EuYlsxXS5kJ10sIFsxLCAyXSk7XG4gICAgICogLy8gPT4geyAnYSc6IHsgJ2InOiBbeyAnYyc6IDEgfSwgeyAnZCc6IDIgfV0gfSB9XG4gICAgICovXG4gICAgZnVuY3Rpb24gemlwT2JqZWN0RGVlcChwcm9wcywgdmFsdWVzKSB7XG4gICAgICByZXR1cm4gYmFzZVppcE9iamVjdChwcm9wcyB8fCBbXSwgdmFsdWVzIHx8IFtdLCBiYXNlU2V0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnppcGAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgaXRlcmF0ZWVgIHRvIHNwZWNpZnlcbiAgICAgKiBob3cgZ3JvdXBlZCB2YWx1ZXMgc2hvdWxkIGJlIGNvbWJpbmVkLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIHRoZVxuICAgICAqIGVsZW1lbnRzIG9mIGVhY2ggZ3JvdXA6ICguLi5ncm91cCkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy44LjBcbiAgICAgKiBAY2F0ZWdvcnkgQXJyYXlcbiAgICAgKiBAcGFyYW0gey4uLkFycmF5fSBbYXJyYXlzXSBUaGUgYXJyYXlzIHRvIHByb2Nlc3MuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiB0byBjb21iaW5lXG4gICAgICogIGdyb3VwZWQgdmFsdWVzLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGdyb3VwZWQgZWxlbWVudHMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uemlwV2l0aChbMSwgMl0sIFsxMCwgMjBdLCBbMTAwLCAyMDBdLCBmdW5jdGlvbihhLCBiLCBjKSB7XG4gICAgICogICByZXR1cm4gYSArIGIgKyBjO1xuICAgICAqIH0pO1xuICAgICAqIC8vID0+IFsxMTEsIDIyMl1cbiAgICAgKi9cbiAgICB2YXIgemlwV2l0aCA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cykge1xuICAgICAgdmFyIGxlbmd0aCA9IGFycmF5cy5sZW5ndGgsXG4gICAgICAgICAgaXRlcmF0ZWUgPSBsZW5ndGggPiAxID8gYXJyYXlzW2xlbmd0aCAtIDFdIDogdW5kZWZpbmVkO1xuXG4gICAgICBpdGVyYXRlZSA9IHR5cGVvZiBpdGVyYXRlZSA9PSAnZnVuY3Rpb24nID8gKGFycmF5cy5wb3AoKSwgaXRlcmF0ZWUpIDogdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuIHVuemlwV2l0aChhcnJheXMsIGl0ZXJhdGVlKTtcbiAgICB9KTtcblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBgbG9kYXNoYCB3cmFwcGVyIGluc3RhbmNlIHRoYXQgd3JhcHMgYHZhbHVlYCB3aXRoIGV4cGxpY2l0IG1ldGhvZFxuICAgICAqIGNoYWluIHNlcXVlbmNlcyBlbmFibGVkLiBUaGUgcmVzdWx0IG9mIHN1Y2ggc2VxdWVuY2VzIG11c3QgYmUgdW53cmFwcGVkXG4gICAgICogd2l0aCBgXyN2YWx1ZWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMS4zLjBcbiAgICAgKiBAY2F0ZWdvcnkgU2VxXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gd3JhcC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgYGxvZGFzaGAgd3JhcHBlciBpbnN0YW5jZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAgJ2FnZSc6IDM2IH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICAnYWdlJzogNDAgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAncGViYmxlcycsICdhZ2UnOiAxIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogdmFyIHlvdW5nZXN0ID0gX1xuICAgICAqICAgLmNoYWluKHVzZXJzKVxuICAgICAqICAgLnNvcnRCeSgnYWdlJylcbiAgICAgKiAgIC5tYXAoZnVuY3Rpb24obykge1xuICAgICAqICAgICByZXR1cm4gby51c2VyICsgJyBpcyAnICsgby5hZ2U7XG4gICAgICogICB9KVxuICAgICAqICAgLmhlYWQoKVxuICAgICAqICAgLnZhbHVlKCk7XG4gICAgICogLy8gPT4gJ3BlYmJsZXMgaXMgMSdcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjaGFpbih2YWx1ZSkge1xuICAgICAgdmFyIHJlc3VsdCA9IGxvZGFzaCh2YWx1ZSk7XG4gICAgICByZXN1bHQuX19jaGFpbl9fID0gdHJ1ZTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaW52b2tlcyBgaW50ZXJjZXB0b3JgIGFuZCByZXR1cm5zIGB2YWx1ZWAuIFRoZSBpbnRlcmNlcHRvclxuICAgICAqIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ7ICh2YWx1ZSkuIFRoZSBwdXJwb3NlIG9mIHRoaXMgbWV0aG9kIGlzIHRvXG4gICAgICogXCJ0YXAgaW50b1wiIGEgbWV0aG9kIGNoYWluIHNlcXVlbmNlIGluIG9yZGVyIHRvIG1vZGlmeSBpbnRlcm1lZGlhdGUgcmVzdWx0cy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBTZXFcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBwcm92aWRlIHRvIGBpbnRlcmNlcHRvcmAuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaW50ZXJjZXB0b3IgVGhlIGZ1bmN0aW9uIHRvIGludm9rZS5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyBgdmFsdWVgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfKFsxLCAyLCAzXSlcbiAgICAgKiAgLnRhcChmdW5jdGlvbihhcnJheSkge1xuICAgICAqICAgIC8vIE11dGF0ZSBpbnB1dCBhcnJheS5cbiAgICAgKiAgICBhcnJheS5wb3AoKTtcbiAgICAgKiAgfSlcbiAgICAgKiAgLnJldmVyc2UoKVxuICAgICAqICAudmFsdWUoKTtcbiAgICAgKiAvLyA9PiBbMiwgMV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0YXAodmFsdWUsIGludGVyY2VwdG9yKSB7XG4gICAgICBpbnRlcmNlcHRvcih2YWx1ZSk7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy50YXBgIGV4Y2VwdCB0aGF0IGl0IHJldHVybnMgdGhlIHJlc3VsdCBvZiBgaW50ZXJjZXB0b3JgLlxuICAgICAqIFRoZSBwdXJwb3NlIG9mIHRoaXMgbWV0aG9kIGlzIHRvIFwicGFzcyB0aHJ1XCIgdmFsdWVzIHJlcGxhY2luZyBpbnRlcm1lZGlhdGVcbiAgICAgKiByZXN1bHRzIGluIGEgbWV0aG9kIGNoYWluIHNlcXVlbmNlLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IFNlcVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHByb3ZpZGUgdG8gYGludGVyY2VwdG9yYC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpbnRlcmNlcHRvciBUaGUgZnVuY3Rpb24gdG8gaW52b2tlLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYGludGVyY2VwdG9yYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXygnICBhYmMgICcpXG4gICAgICogIC5jaGFpbigpXG4gICAgICogIC50cmltKClcbiAgICAgKiAgLnRocnUoZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgKiAgICByZXR1cm4gW3ZhbHVlXTtcbiAgICAgKiAgfSlcbiAgICAgKiAgLnZhbHVlKCk7XG4gICAgICogLy8gPT4gWydhYmMnXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRocnUodmFsdWUsIGludGVyY2VwdG9yKSB7XG4gICAgICByZXR1cm4gaW50ZXJjZXB0b3IodmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIHRoZSB3cmFwcGVyIHZlcnNpb24gb2YgYF8uYXRgLlxuICAgICAqXG4gICAgICogQG5hbWUgYXRcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAxLjAuMFxuICAgICAqIEBjYXRlZ29yeSBTZXFcbiAgICAgKiBAcGFyYW0gey4uLihzdHJpbmd8c3RyaW5nW10pfSBbcGF0aHNdIFRoZSBwcm9wZXJ0eSBwYXRocyB0byBwaWNrLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBgbG9kYXNoYCB3cmFwcGVyIGluc3RhbmNlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IFt7ICdiJzogeyAnYyc6IDMgfSB9LCA0XSB9O1xuICAgICAqXG4gICAgICogXyhvYmplY3QpLmF0KFsnYVswXS5iLmMnLCAnYVsxXSddKS52YWx1ZSgpO1xuICAgICAqIC8vID0+IFszLCA0XVxuICAgICAqL1xuICAgIHZhciB3cmFwcGVyQXQgPSBmbGF0UmVzdChmdW5jdGlvbihwYXRocykge1xuICAgICAgdmFyIGxlbmd0aCA9IHBhdGhzLmxlbmd0aCxcbiAgICAgICAgICBzdGFydCA9IGxlbmd0aCA/IHBhdGhzWzBdIDogMCxcbiAgICAgICAgICB2YWx1ZSA9IHRoaXMuX193cmFwcGVkX18sXG4gICAgICAgICAgaW50ZXJjZXB0b3IgPSBmdW5jdGlvbihvYmplY3QpIHsgcmV0dXJuIGJhc2VBdChvYmplY3QsIHBhdGhzKTsgfTtcblxuICAgICAgaWYgKGxlbmd0aCA+IDEgfHwgdGhpcy5fX2FjdGlvbnNfXy5sZW5ndGggfHxcbiAgICAgICAgICAhKHZhbHVlIGluc3RhbmNlb2YgTGF6eVdyYXBwZXIpIHx8ICFpc0luZGV4KHN0YXJ0KSkge1xuICAgICAgICByZXR1cm4gdGhpcy50aHJ1KGludGVyY2VwdG9yKTtcbiAgICAgIH1cbiAgICAgIHZhbHVlID0gdmFsdWUuc2xpY2Uoc3RhcnQsICtzdGFydCArIChsZW5ndGggPyAxIDogMCkpO1xuICAgICAgdmFsdWUuX19hY3Rpb25zX18ucHVzaCh7XG4gICAgICAgICdmdW5jJzogdGhydSxcbiAgICAgICAgJ2FyZ3MnOiBbaW50ZXJjZXB0b3JdLFxuICAgICAgICAndGhpc0FyZyc6IHVuZGVmaW5lZFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gbmV3IExvZGFzaFdyYXBwZXIodmFsdWUsIHRoaXMuX19jaGFpbl9fKS50aHJ1KGZ1bmN0aW9uKGFycmF5KSB7XG4gICAgICAgIGlmIChsZW5ndGggJiYgIWFycmF5Lmxlbmd0aCkge1xuICAgICAgICAgIGFycmF5LnB1c2godW5kZWZpbmVkKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXJyYXk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBgbG9kYXNoYCB3cmFwcGVyIGluc3RhbmNlIHdpdGggZXhwbGljaXQgbWV0aG9kIGNoYWluIHNlcXVlbmNlcyBlbmFibGVkLlxuICAgICAqXG4gICAgICogQG5hbWUgY2hhaW5cbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBTZXFcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgYGxvZGFzaGAgd3JhcHBlciBpbnN0YW5jZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAnYWdlJzogMzYgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgJ2FnZSc6IDQwIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogLy8gQSBzZXF1ZW5jZSB3aXRob3V0IGV4cGxpY2l0IGNoYWluaW5nLlxuICAgICAqIF8odXNlcnMpLmhlYWQoKTtcbiAgICAgKiAvLyA9PiB7ICd1c2VyJzogJ2Jhcm5leScsICdhZ2UnOiAzNiB9XG4gICAgICpcbiAgICAgKiAvLyBBIHNlcXVlbmNlIHdpdGggZXhwbGljaXQgY2hhaW5pbmcuXG4gICAgICogXyh1c2VycylcbiAgICAgKiAgIC5jaGFpbigpXG4gICAgICogICAuaGVhZCgpXG4gICAgICogICAucGljaygndXNlcicpXG4gICAgICogICAudmFsdWUoKTtcbiAgICAgKiAvLyA9PiB7ICd1c2VyJzogJ2Jhcm5leScgfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHdyYXBwZXJDaGFpbigpIHtcbiAgICAgIHJldHVybiBjaGFpbih0aGlzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeGVjdXRlcyB0aGUgY2hhaW4gc2VxdWVuY2UgYW5kIHJldHVybnMgdGhlIHdyYXBwZWQgcmVzdWx0LlxuICAgICAqXG4gICAgICogQG5hbWUgY29tbWl0XG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4yLjBcbiAgICAgKiBAY2F0ZWdvcnkgU2VxXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IGBsb2Rhc2hgIHdyYXBwZXIgaW5zdGFuY2UuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBhcnJheSA9IFsxLCAyXTtcbiAgICAgKiB2YXIgd3JhcHBlZCA9IF8oYXJyYXkpLnB1c2goMyk7XG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhhcnJheSk7XG4gICAgICogLy8gPT4gWzEsIDJdXG4gICAgICpcbiAgICAgKiB3cmFwcGVkID0gd3JhcHBlZC5jb21taXQoKTtcbiAgICAgKiBjb25zb2xlLmxvZyhhcnJheSk7XG4gICAgICogLy8gPT4gWzEsIDIsIDNdXG4gICAgICpcbiAgICAgKiB3cmFwcGVkLmxhc3QoKTtcbiAgICAgKiAvLyA9PiAzXG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhhcnJheSk7XG4gICAgICogLy8gPT4gWzEsIDIsIDNdXG4gICAgICovXG4gICAgZnVuY3Rpb24gd3JhcHBlckNvbW1pdCgpIHtcbiAgICAgIHJldHVybiBuZXcgTG9kYXNoV3JhcHBlcih0aGlzLnZhbHVlKCksIHRoaXMuX19jaGFpbl9fKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBuZXh0IHZhbHVlIG9uIGEgd3JhcHBlZCBvYmplY3QgZm9sbG93aW5nIHRoZVxuICAgICAqIFtpdGVyYXRvciBwcm90b2NvbF0oaHR0cHM6Ly9tZG4uaW8vaXRlcmF0aW9uX3Byb3RvY29scyNpdGVyYXRvcikuXG4gICAgICpcbiAgICAgKiBAbmFtZSBuZXh0XG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU2VxXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV4dCBpdGVyYXRvciB2YWx1ZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHdyYXBwZWQgPSBfKFsxLCAyXSk7XG4gICAgICpcbiAgICAgKiB3cmFwcGVkLm5leHQoKTtcbiAgICAgKiAvLyA9PiB7ICdkb25lJzogZmFsc2UsICd2YWx1ZSc6IDEgfVxuICAgICAqXG4gICAgICogd3JhcHBlZC5uZXh0KCk7XG4gICAgICogLy8gPT4geyAnZG9uZSc6IGZhbHNlLCAndmFsdWUnOiAyIH1cbiAgICAgKlxuICAgICAqIHdyYXBwZWQubmV4dCgpO1xuICAgICAqIC8vID0+IHsgJ2RvbmUnOiB0cnVlLCAndmFsdWUnOiB1bmRlZmluZWQgfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHdyYXBwZXJOZXh0KCkge1xuICAgICAgaWYgKHRoaXMuX192YWx1ZXNfXyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuX192YWx1ZXNfXyA9IHRvQXJyYXkodGhpcy52YWx1ZSgpKTtcbiAgICAgIH1cbiAgICAgIHZhciBkb25lID0gdGhpcy5fX2luZGV4X18gPj0gdGhpcy5fX3ZhbHVlc19fLmxlbmd0aCxcbiAgICAgICAgICB2YWx1ZSA9IGRvbmUgPyB1bmRlZmluZWQgOiB0aGlzLl9fdmFsdWVzX19bdGhpcy5fX2luZGV4X18rK107XG5cbiAgICAgIHJldHVybiB7ICdkb25lJzogZG9uZSwgJ3ZhbHVlJzogdmFsdWUgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbmFibGVzIHRoZSB3cmFwcGVyIHRvIGJlIGl0ZXJhYmxlLlxuICAgICAqXG4gICAgICogQG5hbWUgU3ltYm9sLml0ZXJhdG9yXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU2VxXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgd3JhcHBlciBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB3cmFwcGVkID0gXyhbMSwgMl0pO1xuICAgICAqXG4gICAgICogd3JhcHBlZFtTeW1ib2wuaXRlcmF0b3JdKCkgPT09IHdyYXBwZWQ7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogQXJyYXkuZnJvbSh3cmFwcGVkKTtcbiAgICAgKiAvLyA9PiBbMSwgMl1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB3cmFwcGVyVG9JdGVyYXRvcigpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBjbG9uZSBvZiB0aGUgY2hhaW4gc2VxdWVuY2UgcGxhbnRpbmcgYHZhbHVlYCBhcyB0aGUgd3JhcHBlZCB2YWx1ZS5cbiAgICAgKlxuICAgICAqIEBuYW1lIHBsYW50XG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4yLjBcbiAgICAgKiBAY2F0ZWdvcnkgU2VxXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcGxhbnQuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IGBsb2Rhc2hgIHdyYXBwZXIgaW5zdGFuY2UuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIHNxdWFyZShuKSB7XG4gICAgICogICByZXR1cm4gbiAqIG47XG4gICAgICogfVxuICAgICAqXG4gICAgICogdmFyIHdyYXBwZWQgPSBfKFsxLCAyXSkubWFwKHNxdWFyZSk7XG4gICAgICogdmFyIG90aGVyID0gd3JhcHBlZC5wbGFudChbMywgNF0pO1xuICAgICAqXG4gICAgICogb3RoZXIudmFsdWUoKTtcbiAgICAgKiAvLyA9PiBbOSwgMTZdXG4gICAgICpcbiAgICAgKiB3cmFwcGVkLnZhbHVlKCk7XG4gICAgICogLy8gPT4gWzEsIDRdXG4gICAgICovXG4gICAgZnVuY3Rpb24gd3JhcHBlclBsYW50KHZhbHVlKSB7XG4gICAgICB2YXIgcmVzdWx0LFxuICAgICAgICAgIHBhcmVudCA9IHRoaXM7XG5cbiAgICAgIHdoaWxlIChwYXJlbnQgaW5zdGFuY2VvZiBiYXNlTG9kYXNoKSB7XG4gICAgICAgIHZhciBjbG9uZSA9IHdyYXBwZXJDbG9uZShwYXJlbnQpO1xuICAgICAgICBjbG9uZS5fX2luZGV4X18gPSAwO1xuICAgICAgICBjbG9uZS5fX3ZhbHVlc19fID0gdW5kZWZpbmVkO1xuICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgcHJldmlvdXMuX193cmFwcGVkX18gPSBjbG9uZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXN1bHQgPSBjbG9uZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcHJldmlvdXMgPSBjbG9uZTtcbiAgICAgICAgcGFyZW50ID0gcGFyZW50Ll9fd3JhcHBlZF9fO1xuICAgICAgfVxuICAgICAgcHJldmlvdXMuX193cmFwcGVkX18gPSB2YWx1ZTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgdGhlIHdyYXBwZXIgdmVyc2lvbiBvZiBgXy5yZXZlcnNlYC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIHRoZSB3cmFwcGVkIGFycmF5LlxuICAgICAqXG4gICAgICogQG5hbWUgcmV2ZXJzZVxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IFNlcVxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBgbG9kYXNoYCB3cmFwcGVyIGluc3RhbmNlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbMSwgMiwgM107XG4gICAgICpcbiAgICAgKiBfKGFycmF5KS5yZXZlcnNlKCkudmFsdWUoKVxuICAgICAqIC8vID0+IFszLCAyLCAxXVxuICAgICAqXG4gICAgICogY29uc29sZS5sb2coYXJyYXkpO1xuICAgICAqIC8vID0+IFszLCAyLCAxXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHdyYXBwZXJSZXZlcnNlKCkge1xuICAgICAgdmFyIHZhbHVlID0gdGhpcy5fX3dyYXBwZWRfXztcbiAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIExhenlXcmFwcGVyKSB7XG4gICAgICAgIHZhciB3cmFwcGVkID0gdmFsdWU7XG4gICAgICAgIGlmICh0aGlzLl9fYWN0aW9uc19fLmxlbmd0aCkge1xuICAgICAgICAgIHdyYXBwZWQgPSBuZXcgTGF6eVdyYXBwZXIodGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgd3JhcHBlZCA9IHdyYXBwZWQucmV2ZXJzZSgpO1xuICAgICAgICB3cmFwcGVkLl9fYWN0aW9uc19fLnB1c2goe1xuICAgICAgICAgICdmdW5jJzogdGhydSxcbiAgICAgICAgICAnYXJncyc6IFtyZXZlcnNlXSxcbiAgICAgICAgICAndGhpc0FyZyc6IHVuZGVmaW5lZFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIG5ldyBMb2Rhc2hXcmFwcGVyKHdyYXBwZWQsIHRoaXMuX19jaGFpbl9fKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLnRocnUocmV2ZXJzZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXhlY3V0ZXMgdGhlIGNoYWluIHNlcXVlbmNlIHRvIHJlc29sdmUgdGhlIHVud3JhcHBlZCB2YWx1ZS5cbiAgICAgKlxuICAgICAqIEBuYW1lIHZhbHVlXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAYWxpYXMgdG9KU09OLCB2YWx1ZU9mXG4gICAgICogQGNhdGVnb3J5IFNlcVxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByZXNvbHZlZCB1bndyYXBwZWQgdmFsdWUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8oWzEsIDIsIDNdKS52YWx1ZSgpO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHdyYXBwZXJWYWx1ZSgpIHtcbiAgICAgIHJldHVybiBiYXNlV3JhcHBlclZhbHVlKHRoaXMuX193cmFwcGVkX18sIHRoaXMuX19hY3Rpb25zX18pO1xuICAgIH1cblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gb2JqZWN0IGNvbXBvc2VkIG9mIGtleXMgZ2VuZXJhdGVkIGZyb20gdGhlIHJlc3VsdHMgb2YgcnVubmluZ1xuICAgICAqIGVhY2ggZWxlbWVudCBvZiBgY29sbGVjdGlvbmAgdGhydSBgaXRlcmF0ZWVgLiBUaGUgY29ycmVzcG9uZGluZyB2YWx1ZSBvZlxuICAgICAqIGVhY2gga2V5IGlzIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGtleSB3YXMgcmV0dXJuZWQgYnkgYGl0ZXJhdGVlYC4gVGhlXG4gICAgICogaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDogKHZhbHVlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjUuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgdG8gdHJhbnNmb3JtIGtleXMuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY29tcG9zZWQgYWdncmVnYXRlIG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5jb3VudEJ5KFs2LjEsIDQuMiwgNi4zXSwgTWF0aC5mbG9vcik7XG4gICAgICogLy8gPT4geyAnNCc6IDEsICc2JzogMiB9XG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmNvdW50QnkoWydvbmUnLCAndHdvJywgJ3RocmVlJ10sICdsZW5ndGgnKTtcbiAgICAgKiAvLyA9PiB7ICczJzogMiwgJzUnOiAxIH1cbiAgICAgKi9cbiAgICB2YXIgY291bnRCeSA9IGNyZWF0ZUFnZ3JlZ2F0b3IoZnVuY3Rpb24ocmVzdWx0LCB2YWx1ZSwga2V5KSB7XG4gICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChyZXN1bHQsIGtleSkpIHtcbiAgICAgICAgKytyZXN1bHRba2V5XTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJhc2VBc3NpZ25WYWx1ZShyZXN1bHQsIGtleSwgMSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHByZWRpY2F0ZWAgcmV0dXJucyB0cnV0aHkgZm9yICoqYWxsKiogZWxlbWVudHMgb2YgYGNvbGxlY3Rpb25gLlxuICAgICAqIEl0ZXJhdGlvbiBpcyBzdG9wcGVkIG9uY2UgYHByZWRpY2F0ZWAgcmV0dXJucyBmYWxzZXkuIFRoZSBwcmVkaWNhdGUgaXNcbiAgICAgKiBpbnZva2VkIHdpdGggdGhyZWUgYXJndW1lbnRzOiAodmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgcmV0dXJucyBgdHJ1ZWAgZm9yXG4gICAgICogW2VtcHR5IGNvbGxlY3Rpb25zXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9FbXB0eV9zZXQpIGJlY2F1c2VcbiAgICAgKiBbZXZlcnl0aGluZyBpcyB0cnVlXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9WYWN1b3VzX3RydXRoKSBvZlxuICAgICAqIGVsZW1lbnRzIG9mIGVtcHR5IGNvbGxlY3Rpb25zLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFsbCBlbGVtZW50cyBwYXNzIHRoZSBwcmVkaWNhdGUgY2hlY2ssXG4gICAgICogIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5ldmVyeShbdHJ1ZSwgMSwgbnVsbCwgJ3llcyddLCBCb29sZWFuKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAnYWdlJzogMzYsICdhY3RpdmUnOiBmYWxzZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAnYWdlJzogNDAsICdhY3RpdmUnOiBmYWxzZSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzYCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5ldmVyeSh1c2VycywgeyAndXNlcic6ICdiYXJuZXknLCAnYWN0aXZlJzogZmFsc2UgfSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmV2ZXJ5KHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5ldmVyeSh1c2VycywgJ2FjdGl2ZScpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gZXZlcnkoY29sbGVjdGlvbiwgcHJlZGljYXRlLCBndWFyZCkge1xuICAgICAgdmFyIGZ1bmMgPSBpc0FycmF5KGNvbGxlY3Rpb24pID8gYXJyYXlFdmVyeSA6IGJhc2VFdmVyeTtcbiAgICAgIGlmIChndWFyZCAmJiBpc0l0ZXJhdGVlQ2FsbChjb2xsZWN0aW9uLCBwcmVkaWNhdGUsIGd1YXJkKSkge1xuICAgICAgICBwcmVkaWNhdGUgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gZnVuYyhjb2xsZWN0aW9uLCBnZXRJdGVyYXRlZShwcmVkaWNhdGUsIDMpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJdGVyYXRlcyBvdmVyIGVsZW1lbnRzIG9mIGBjb2xsZWN0aW9uYCwgcmV0dXJuaW5nIGFuIGFycmF5IG9mIGFsbCBlbGVtZW50c1xuICAgICAqIGBwcmVkaWNhdGVgIHJldHVybnMgdHJ1dGh5IGZvci4gVGhlIHByZWRpY2F0ZSBpcyBpbnZva2VkIHdpdGggdGhyZWVcbiAgICAgKiBhcmd1bWVudHM6ICh2YWx1ZSwgaW5kZXh8a2V5LCBjb2xsZWN0aW9uKS5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBVbmxpa2UgYF8ucmVtb3ZlYCwgdGhpcyBtZXRob2QgcmV0dXJucyBhIG5ldyBhcnJheS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmaWx0ZXJlZCBhcnJheS5cbiAgICAgKiBAc2VlIF8ucmVqZWN0XG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FnZSc6IDM2LCAnYWN0aXZlJzogdHJ1ZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAnYWdlJzogNDAsICdhY3RpdmUnOiBmYWxzZSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8uZmlsdGVyKHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiAhby5hY3RpdmU7IH0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnZnJlZCddXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmlsdGVyKHVzZXJzLCB7ICdhZ2UnOiAzNiwgJ2FjdGl2ZSc6IHRydWUgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydiYXJuZXknXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmlsdGVyKHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydmcmVkJ11cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmlsdGVyKHVzZXJzLCAnYWN0aXZlJyk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydiYXJuZXknXVxuICAgICAqXG4gICAgICogLy8gQ29tYmluaW5nIHNldmVyYWwgcHJlZGljYXRlcyB1c2luZyBgXy5vdmVyRXZlcnlgIG9yIGBfLm92ZXJTb21lYC5cbiAgICAgKiBfLmZpbHRlcih1c2VycywgXy5vdmVyU29tZShbeyAnYWdlJzogMzYgfSwgWydhZ2UnLCA0MF1dKSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydmcmVkJywgJ2Jhcm5leSddXG4gICAgICovXG4gICAgZnVuY3Rpb24gZmlsdGVyKGNvbGxlY3Rpb24sIHByZWRpY2F0ZSkge1xuICAgICAgdmFyIGZ1bmMgPSBpc0FycmF5KGNvbGxlY3Rpb24pID8gYXJyYXlGaWx0ZXIgOiBiYXNlRmlsdGVyO1xuICAgICAgcmV0dXJuIGZ1bmMoY29sbGVjdGlvbiwgZ2V0SXRlcmF0ZWUocHJlZGljYXRlLCAzKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSXRlcmF0ZXMgb3ZlciBlbGVtZW50cyBvZiBgY29sbGVjdGlvbmAsIHJldHVybmluZyB0aGUgZmlyc3QgZWxlbWVudFxuICAgICAqIGBwcmVkaWNhdGVgIHJldHVybnMgdHJ1dGh5IGZvci4gVGhlIHByZWRpY2F0ZSBpcyBpbnZva2VkIHdpdGggdGhyZWVcbiAgICAgKiBhcmd1bWVudHM6ICh2YWx1ZSwgaW5kZXh8a2V5LCBjb2xsZWN0aW9uKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtmcm9tSW5kZXg9MF0gVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBtYXRjaGVkIGVsZW1lbnQsIGVsc2UgYHVuZGVmaW5lZGAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgICdhZ2UnOiAzNiwgJ2FjdGl2ZSc6IHRydWUgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgICdhZ2UnOiA0MCwgJ2FjdGl2ZSc6IGZhbHNlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ3BlYmJsZXMnLCAnYWdlJzogMSwgICdhY3RpdmUnOiB0cnVlIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy5maW5kKHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiBvLmFnZSA8IDQwOyB9KTtcbiAgICAgKiAvLyA9PiBvYmplY3QgZm9yICdiYXJuZXknXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmluZCh1c2VycywgeyAnYWdlJzogMSwgJ2FjdGl2ZSc6IHRydWUgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0IGZvciAncGViYmxlcydcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbmQodXNlcnMsIFsnYWN0aXZlJywgZmFsc2VdKTtcbiAgICAgKiAvLyA9PiBvYmplY3QgZm9yICdmcmVkJ1xuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5maW5kKHVzZXJzLCAnYWN0aXZlJyk7XG4gICAgICogLy8gPT4gb2JqZWN0IGZvciAnYmFybmV5J1xuICAgICAqL1xuICAgIHZhciBmaW5kID0gY3JlYXRlRmluZChmaW5kSW5kZXgpO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5maW5kYCBleGNlcHQgdGhhdCBpdCBpdGVyYXRlcyBvdmVyIGVsZW1lbnRzIG9mXG4gICAgICogYGNvbGxlY3Rpb25gIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAyLjAuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtmcm9tSW5kZXg9Y29sbGVjdGlvbi5sZW5ndGgtMV0gVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBtYXRjaGVkIGVsZW1lbnQsIGVsc2UgYHVuZGVmaW5lZGAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZmluZExhc3QoWzEsIDIsIDMsIDRdLCBmdW5jdGlvbihuKSB7XG4gICAgICogICByZXR1cm4gbiAlIDIgPT0gMTtcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiAzXG4gICAgICovXG4gICAgdmFyIGZpbmRMYXN0ID0gY3JlYXRlRmluZChmaW5kTGFzdEluZGV4KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmbGF0dGVuZWQgYXJyYXkgb2YgdmFsdWVzIGJ5IHJ1bm5pbmcgZWFjaCBlbGVtZW50IGluIGBjb2xsZWN0aW9uYFxuICAgICAqIHRocnUgYGl0ZXJhdGVlYCBhbmQgZmxhdHRlbmluZyB0aGUgbWFwcGVkIHJlc3VsdHMuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkXG4gICAgICogd2l0aCB0aHJlZSBhcmd1bWVudHM6ICh2YWx1ZSwgaW5kZXh8a2V5LCBjb2xsZWN0aW9uKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZsYXR0ZW5lZCBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gZHVwbGljYXRlKG4pIHtcbiAgICAgKiAgIHJldHVybiBbbiwgbl07XG4gICAgICogfVxuICAgICAqXG4gICAgICogXy5mbGF0TWFwKFsxLCAyXSwgZHVwbGljYXRlKTtcbiAgICAgKiAvLyA9PiBbMSwgMSwgMiwgMl1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmbGF0TWFwKGNvbGxlY3Rpb24sIGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gYmFzZUZsYXR0ZW4obWFwKGNvbGxlY3Rpb24sIGl0ZXJhdGVlKSwgMSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5mbGF0TWFwYCBleGNlcHQgdGhhdCBpdCByZWN1cnNpdmVseSBmbGF0dGVucyB0aGVcbiAgICAgKiBtYXBwZWQgcmVzdWx0cy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjcuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZsYXR0ZW5lZCBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gZHVwbGljYXRlKG4pIHtcbiAgICAgKiAgIHJldHVybiBbW1tuLCBuXV1dO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIF8uZmxhdE1hcERlZXAoWzEsIDJdLCBkdXBsaWNhdGUpO1xuICAgICAqIC8vID0+IFsxLCAxLCAyLCAyXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZsYXRNYXBEZWVwKGNvbGxlY3Rpb24sIGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gYmFzZUZsYXR0ZW4obWFwKGNvbGxlY3Rpb24sIGl0ZXJhdGVlKSwgSU5GSU5JVFkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZmxhdE1hcGAgZXhjZXB0IHRoYXQgaXQgcmVjdXJzaXZlbHkgZmxhdHRlbnMgdGhlXG4gICAgICogbWFwcGVkIHJlc3VsdHMgdXAgdG8gYGRlcHRoYCB0aW1lcy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjcuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZGVwdGg9MV0gVGhlIG1heGltdW0gcmVjdXJzaW9uIGRlcHRoLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZsYXR0ZW5lZCBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gZHVwbGljYXRlKG4pIHtcbiAgICAgKiAgIHJldHVybiBbW1tuLCBuXV1dO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIF8uZmxhdE1hcERlcHRoKFsxLCAyXSwgZHVwbGljYXRlLCAyKTtcbiAgICAgKiAvLyA9PiBbWzEsIDFdLCBbMiwgMl1dXG4gICAgICovXG4gICAgZnVuY3Rpb24gZmxhdE1hcERlcHRoKGNvbGxlY3Rpb24sIGl0ZXJhdGVlLCBkZXB0aCkge1xuICAgICAgZGVwdGggPSBkZXB0aCA9PT0gdW5kZWZpbmVkID8gMSA6IHRvSW50ZWdlcihkZXB0aCk7XG4gICAgICByZXR1cm4gYmFzZUZsYXR0ZW4obWFwKGNvbGxlY3Rpb24sIGl0ZXJhdGVlKSwgZGVwdGgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEl0ZXJhdGVzIG92ZXIgZWxlbWVudHMgb2YgYGNvbGxlY3Rpb25gIGFuZCBpbnZva2VzIGBpdGVyYXRlZWAgZm9yIGVhY2ggZWxlbWVudC5cbiAgICAgKiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIHRocmVlIGFyZ3VtZW50czogKHZhbHVlLCBpbmRleHxrZXksIGNvbGxlY3Rpb24pLlxuICAgICAqIEl0ZXJhdGVlIGZ1bmN0aW9ucyBtYXkgZXhpdCBpdGVyYXRpb24gZWFybHkgYnkgZXhwbGljaXRseSByZXR1cm5pbmcgYGZhbHNlYC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBBcyB3aXRoIG90aGVyIFwiQ29sbGVjdGlvbnNcIiBtZXRob2RzLCBvYmplY3RzIHdpdGggYSBcImxlbmd0aFwiXG4gICAgICogcHJvcGVydHkgYXJlIGl0ZXJhdGVkIGxpa2UgYXJyYXlzLiBUbyBhdm9pZCB0aGlzIGJlaGF2aW9yIHVzZSBgXy5mb3JJbmBcbiAgICAgKiBvciBgXy5mb3JPd25gIGZvciBvYmplY3QgaXRlcmF0aW9uLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGFsaWFzIGVhY2hcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl8T2JqZWN0fSBSZXR1cm5zIGBjb2xsZWN0aW9uYC5cbiAgICAgKiBAc2VlIF8uZm9yRWFjaFJpZ2h0XG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZm9yRWFjaChbMSwgMl0sIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICogICBjb25zb2xlLmxvZyh2YWx1ZSk7XG4gICAgICogfSk7XG4gICAgICogLy8gPT4gTG9ncyBgMWAgdGhlbiBgMmAuXG4gICAgICpcbiAgICAgKiBfLmZvckVhY2goeyAnYSc6IDEsICdiJzogMiB9LCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gICAgICogICBjb25zb2xlLmxvZyhrZXkpO1xuICAgICAqIH0pO1xuICAgICAqIC8vID0+IExvZ3MgJ2EnIHRoZW4gJ2InIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZvckVhY2goY29sbGVjdGlvbiwgaXRlcmF0ZWUpIHtcbiAgICAgIHZhciBmdW5jID0gaXNBcnJheShjb2xsZWN0aW9uKSA/IGFycmF5RWFjaCA6IGJhc2VFYWNoO1xuICAgICAgcmV0dXJuIGZ1bmMoY29sbGVjdGlvbiwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDMpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmZvckVhY2hgIGV4Y2VwdCB0aGF0IGl0IGl0ZXJhdGVzIG92ZXIgZWxlbWVudHMgb2ZcbiAgICAgKiBgY29sbGVjdGlvbmAgZnJvbSByaWdodCB0byBsZWZ0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDIuMC4wXG4gICAgICogQGFsaWFzIGVhY2hSaWdodFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheXxPYmplY3R9IFJldHVybnMgYGNvbGxlY3Rpb25gLlxuICAgICAqIEBzZWUgXy5mb3JFYWNoXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZm9yRWFjaFJpZ2h0KFsxLCAyXSwgZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKHZhbHVlKTtcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiBMb2dzIGAyYCB0aGVuIGAxYC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmb3JFYWNoUmlnaHQoY29sbGVjdGlvbiwgaXRlcmF0ZWUpIHtcbiAgICAgIHZhciBmdW5jID0gaXNBcnJheShjb2xsZWN0aW9uKSA/IGFycmF5RWFjaFJpZ2h0IDogYmFzZUVhY2hSaWdodDtcbiAgICAgIHJldHVybiBmdW5jKGNvbGxlY3Rpb24sIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAzKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBvYmplY3QgY29tcG9zZWQgb2Yga2V5cyBnZW5lcmF0ZWQgZnJvbSB0aGUgcmVzdWx0cyBvZiBydW5uaW5nXG4gICAgICogZWFjaCBlbGVtZW50IG9mIGBjb2xsZWN0aW9uYCB0aHJ1IGBpdGVyYXRlZWAuIFRoZSBvcmRlciBvZiBncm91cGVkIHZhbHVlc1xuICAgICAqIGlzIGRldGVybWluZWQgYnkgdGhlIG9yZGVyIHRoZXkgb2NjdXIgaW4gYGNvbGxlY3Rpb25gLiBUaGUgY29ycmVzcG9uZGluZ1xuICAgICAqIHZhbHVlIG9mIGVhY2gga2V5IGlzIGFuIGFycmF5IG9mIGVsZW1lbnRzIHJlc3BvbnNpYmxlIGZvciBnZW5lcmF0aW5nIHRoZVxuICAgICAqIGtleS4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6ICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGl0ZXJhdGVlIHRvIHRyYW5zZm9ybSBrZXlzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNvbXBvc2VkIGFnZ3JlZ2F0ZSBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZ3JvdXBCeShbNi4xLCA0LjIsIDYuM10sIE1hdGguZmxvb3IpO1xuICAgICAqIC8vID0+IHsgJzQnOiBbNC4yXSwgJzYnOiBbNi4xLCA2LjNdIH1cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZ3JvdXBCeShbJ29uZScsICd0d28nLCAndGhyZWUnXSwgJ2xlbmd0aCcpO1xuICAgICAqIC8vID0+IHsgJzMnOiBbJ29uZScsICd0d28nXSwgJzUnOiBbJ3RocmVlJ10gfVxuICAgICAqL1xuICAgIHZhciBncm91cEJ5ID0gY3JlYXRlQWdncmVnYXRvcihmdW5jdGlvbihyZXN1bHQsIHZhbHVlLCBrZXkpIHtcbiAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKHJlc3VsdCwga2V5KSkge1xuICAgICAgICByZXN1bHRba2V5XS5wdXNoKHZhbHVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJhc2VBc3NpZ25WYWx1ZShyZXN1bHQsIGtleSwgW3ZhbHVlXSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBpbiBgY29sbGVjdGlvbmAuIElmIGBjb2xsZWN0aW9uYCBpcyBhIHN0cmluZywgaXQnc1xuICAgICAqIGNoZWNrZWQgZm9yIGEgc3Vic3RyaW5nIG9mIGB2YWx1ZWAsIG90aGVyd2lzZVxuICAgICAqIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pXG4gICAgICogaXMgdXNlZCBmb3IgZXF1YWxpdHkgY29tcGFyaXNvbnMuIElmIGBmcm9tSW5kZXhgIGlzIG5lZ2F0aXZlLCBpdCdzIHVzZWQgYXNcbiAgICAgKiB0aGUgb2Zmc2V0IGZyb20gdGhlIGVuZCBvZiBgY29sbGVjdGlvbmAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fHN0cmluZ30gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtmcm9tSW5kZXg9MF0gVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLnJlZHVjZWAuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgZm91bmQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pbmNsdWRlcyhbMSwgMiwgM10sIDEpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaW5jbHVkZXMoWzEsIDIsIDNdLCAxLCAyKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pbmNsdWRlcyh7ICdhJzogMSwgJ2InOiAyIH0sIDEpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaW5jbHVkZXMoJ2FiY2QnLCAnYmMnKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaW5jbHVkZXMoY29sbGVjdGlvbiwgdmFsdWUsIGZyb21JbmRleCwgZ3VhcmQpIHtcbiAgICAgIGNvbGxlY3Rpb24gPSBpc0FycmF5TGlrZShjb2xsZWN0aW9uKSA/IGNvbGxlY3Rpb24gOiB2YWx1ZXMoY29sbGVjdGlvbik7XG4gICAgICBmcm9tSW5kZXggPSAoZnJvbUluZGV4ICYmICFndWFyZCkgPyB0b0ludGVnZXIoZnJvbUluZGV4KSA6IDA7XG5cbiAgICAgIHZhciBsZW5ndGggPSBjb2xsZWN0aW9uLmxlbmd0aDtcbiAgICAgIGlmIChmcm9tSW5kZXggPCAwKSB7XG4gICAgICAgIGZyb21JbmRleCA9IG5hdGl2ZU1heChsZW5ndGggKyBmcm9tSW5kZXgsIDApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGlzU3RyaW5nKGNvbGxlY3Rpb24pXG4gICAgICAgID8gKGZyb21JbmRleCA8PSBsZW5ndGggJiYgY29sbGVjdGlvbi5pbmRleE9mKHZhbHVlLCBmcm9tSW5kZXgpID4gLTEpXG4gICAgICAgIDogKCEhbGVuZ3RoICYmIGJhc2VJbmRleE9mKGNvbGxlY3Rpb24sIHZhbHVlLCBmcm9tSW5kZXgpID4gLTEpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEludm9rZXMgdGhlIG1ldGhvZCBhdCBgcGF0aGAgb2YgZWFjaCBlbGVtZW50IGluIGBjb2xsZWN0aW9uYCwgcmV0dXJuaW5nXG4gICAgICogYW4gYXJyYXkgb2YgdGhlIHJlc3VsdHMgb2YgZWFjaCBpbnZva2VkIG1ldGhvZC4gQW55IGFkZGl0aW9uYWwgYXJndW1lbnRzXG4gICAgICogYXJlIHByb3ZpZGVkIHRvIGVhY2ggaW52b2tlZCBtZXRob2QuIElmIGBwYXRoYCBpcyBhIGZ1bmN0aW9uLCBpdCdzIGludm9rZWRcbiAgICAgKiBmb3IsIGFuZCBgdGhpc2AgYm91bmQgdG8sIGVhY2ggZWxlbWVudCBpbiBgY29sbGVjdGlvbmAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0FycmF5fEZ1bmN0aW9ufHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgbWV0aG9kIHRvIGludm9rZSBvclxuICAgICAqICB0aGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7Li4uKn0gW2FyZ3NdIFRoZSBhcmd1bWVudHMgdG8gaW52b2tlIGVhY2ggbWV0aG9kIHdpdGguXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiByZXN1bHRzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmludm9rZU1hcChbWzUsIDEsIDddLCBbMywgMiwgMV1dLCAnc29ydCcpO1xuICAgICAqIC8vID0+IFtbMSwgNSwgN10sIFsxLCAyLCAzXV1cbiAgICAgKlxuICAgICAqIF8uaW52b2tlTWFwKFsxMjMsIDQ1Nl0sIFN0cmluZy5wcm90b3R5cGUuc3BsaXQsICcnKTtcbiAgICAgKiAvLyA9PiBbWycxJywgJzInLCAnMyddLCBbJzQnLCAnNScsICc2J11dXG4gICAgICovXG4gICAgdmFyIGludm9rZU1hcCA9IGJhc2VSZXN0KGZ1bmN0aW9uKGNvbGxlY3Rpb24sIHBhdGgsIGFyZ3MpIHtcbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGlzRnVuYyA9IHR5cGVvZiBwYXRoID09ICdmdW5jdGlvbicsXG4gICAgICAgICAgcmVzdWx0ID0gaXNBcnJheUxpa2UoY29sbGVjdGlvbikgPyBBcnJheShjb2xsZWN0aW9uLmxlbmd0aCkgOiBbXTtcblxuICAgICAgYmFzZUVhY2goY29sbGVjdGlvbiwgZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgcmVzdWx0WysraW5kZXhdID0gaXNGdW5jID8gYXBwbHkocGF0aCwgdmFsdWUsIGFyZ3MpIDogYmFzZUludm9rZSh2YWx1ZSwgcGF0aCwgYXJncyk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIG9iamVjdCBjb21wb3NlZCBvZiBrZXlzIGdlbmVyYXRlZCBmcm9tIHRoZSByZXN1bHRzIG9mIHJ1bm5pbmdcbiAgICAgKiBlYWNoIGVsZW1lbnQgb2YgYGNvbGxlY3Rpb25gIHRocnUgYGl0ZXJhdGVlYC4gVGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUgb2ZcbiAgICAgKiBlYWNoIGtleSBpcyB0aGUgbGFzdCBlbGVtZW50IHJlc3BvbnNpYmxlIGZvciBnZW5lcmF0aW5nIHRoZSBrZXkuIFRoZVxuICAgICAqIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6ICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGl0ZXJhdGVlIHRvIHRyYW5zZm9ybSBrZXlzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNvbXBvc2VkIGFnZ3JlZ2F0ZSBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBhcnJheSA9IFtcbiAgICAgKiAgIHsgJ2Rpcic6ICdsZWZ0JywgJ2NvZGUnOiA5NyB9LFxuICAgICAqICAgeyAnZGlyJzogJ3JpZ2h0JywgJ2NvZGUnOiAxMDAgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiBfLmtleUJ5KGFycmF5LCBmdW5jdGlvbihvKSB7XG4gICAgICogICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShvLmNvZGUpO1xuICAgICAqIH0pO1xuICAgICAqIC8vID0+IHsgJ2EnOiB7ICdkaXInOiAnbGVmdCcsICdjb2RlJzogOTcgfSwgJ2QnOiB7ICdkaXInOiAncmlnaHQnLCAnY29kZSc6IDEwMCB9IH1cbiAgICAgKlxuICAgICAqIF8ua2V5QnkoYXJyYXksICdkaXInKTtcbiAgICAgKiAvLyA9PiB7ICdsZWZ0JzogeyAnZGlyJzogJ2xlZnQnLCAnY29kZSc6IDk3IH0sICdyaWdodCc6IHsgJ2Rpcic6ICdyaWdodCcsICdjb2RlJzogMTAwIH0gfVxuICAgICAqL1xuICAgIHZhciBrZXlCeSA9IGNyZWF0ZUFnZ3JlZ2F0b3IoZnVuY3Rpb24ocmVzdWx0LCB2YWx1ZSwga2V5KSB7XG4gICAgICBiYXNlQXNzaWduVmFsdWUocmVzdWx0LCBrZXksIHZhbHVlKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdmFsdWVzIGJ5IHJ1bm5pbmcgZWFjaCBlbGVtZW50IGluIGBjb2xsZWN0aW9uYCB0aHJ1XG4gICAgICogYGl0ZXJhdGVlYC4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM6XG4gICAgICogKHZhbHVlLCBpbmRleHxrZXksIGNvbGxlY3Rpb24pLlxuICAgICAqXG4gICAgICogTWFueSBsb2Rhc2ggbWV0aG9kcyBhcmUgZ3VhcmRlZCB0byB3b3JrIGFzIGl0ZXJhdGVlcyBmb3IgbWV0aG9kcyBsaWtlXG4gICAgICogYF8uZXZlcnlgLCBgXy5maWx0ZXJgLCBgXy5tYXBgLCBgXy5tYXBWYWx1ZXNgLCBgXy5yZWplY3RgLCBhbmQgYF8uc29tZWAuXG4gICAgICpcbiAgICAgKiBUaGUgZ3VhcmRlZCBtZXRob2RzIGFyZTpcbiAgICAgKiBgYXJ5YCwgYGNodW5rYCwgYGN1cnJ5YCwgYGN1cnJ5UmlnaHRgLCBgZHJvcGAsIGBkcm9wUmlnaHRgLCBgZXZlcnlgLFxuICAgICAqIGBmaWxsYCwgYGludmVydGAsIGBwYXJzZUludGAsIGByYW5kb21gLCBgcmFuZ2VgLCBgcmFuZ2VSaWdodGAsIGByZXBlYXRgLFxuICAgICAqIGBzYW1wbGVTaXplYCwgYHNsaWNlYCwgYHNvbWVgLCBgc29ydEJ5YCwgYHNwbGl0YCwgYHRha2VgLCBgdGFrZVJpZ2h0YCxcbiAgICAgKiBgdGVtcGxhdGVgLCBgdHJpbWAsIGB0cmltRW5kYCwgYHRyaW1TdGFydGAsIGFuZCBgd29yZHNgXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBtYXBwZWQgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIHNxdWFyZShuKSB7XG4gICAgICogICByZXR1cm4gbiAqIG47XG4gICAgICogfVxuICAgICAqXG4gICAgICogXy5tYXAoWzQsIDhdLCBzcXVhcmUpO1xuICAgICAqIC8vID0+IFsxNiwgNjRdXG4gICAgICpcbiAgICAgKiBfLm1hcCh7ICdhJzogNCwgJ2InOiA4IH0sIHNxdWFyZSk7XG4gICAgICogLy8gPT4gWzE2LCA2NF0gKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IFtcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JyB9LFxuICAgICAqICAgeyAndXNlcic6ICdmcmVkJyB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8ubWFwKHVzZXJzLCAndXNlcicpO1xuICAgICAqIC8vID0+IFsnYmFybmV5JywgJ2ZyZWQnXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1hcChjb2xsZWN0aW9uLCBpdGVyYXRlZSkge1xuICAgICAgdmFyIGZ1bmMgPSBpc0FycmF5KGNvbGxlY3Rpb24pID8gYXJyYXlNYXAgOiBiYXNlTWFwO1xuICAgICAgcmV0dXJuIGZ1bmMoY29sbGVjdGlvbiwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDMpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnNvcnRCeWAgZXhjZXB0IHRoYXQgaXQgYWxsb3dzIHNwZWNpZnlpbmcgdGhlIHNvcnRcbiAgICAgKiBvcmRlcnMgb2YgdGhlIGl0ZXJhdGVlcyB0byBzb3J0IGJ5LiBJZiBgb3JkZXJzYCBpcyB1bnNwZWNpZmllZCwgYWxsIHZhbHVlc1xuICAgICAqIGFyZSBzb3J0ZWQgaW4gYXNjZW5kaW5nIG9yZGVyLiBPdGhlcndpc2UsIHNwZWNpZnkgYW4gb3JkZXIgb2YgXCJkZXNjXCIgZm9yXG4gICAgICogZGVzY2VuZGluZyBvciBcImFzY1wiIGZvciBhc2NlbmRpbmcgc29ydCBvcmRlciBvZiBjb3JyZXNwb25kaW5nIHZhbHVlcy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7QXJyYXlbXXxGdW5jdGlvbltdfE9iamVjdFtdfHN0cmluZ1tdfSBbaXRlcmF0ZWVzPVtfLmlkZW50aXR5XV1cbiAgICAgKiAgVGhlIGl0ZXJhdGVlcyB0byBzb3J0IGJ5LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nW119IFtvcmRlcnNdIFRoZSBzb3J0IG9yZGVycyBvZiBgaXRlcmF0ZWVzYC5cbiAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5yZWR1Y2VgLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IHNvcnRlZCBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAnYWdlJzogNDggfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FnZSc6IDM0IH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICdhZ2UnOiA0MCB9LFxuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAnYWdlJzogMzYgfVxuICAgICAqIF07XG4gICAgICpcbiAgICAgKiAvLyBTb3J0IGJ5IGB1c2VyYCBpbiBhc2NlbmRpbmcgb3JkZXIgYW5kIGJ5IGBhZ2VgIGluIGRlc2NlbmRpbmcgb3JkZXIuXG4gICAgICogXy5vcmRlckJ5KHVzZXJzLCBbJ3VzZXInLCAnYWdlJ10sIFsnYXNjJywgJ2Rlc2MnXSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgW1snYmFybmV5JywgMzZdLCBbJ2Jhcm5leScsIDM0XSwgWydmcmVkJywgNDhdLCBbJ2ZyZWQnLCA0MF1dXG4gICAgICovXG4gICAgZnVuY3Rpb24gb3JkZXJCeShjb2xsZWN0aW9uLCBpdGVyYXRlZXMsIG9yZGVycywgZ3VhcmQpIHtcbiAgICAgIGlmIChjb2xsZWN0aW9uID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgaWYgKCFpc0FycmF5KGl0ZXJhdGVlcykpIHtcbiAgICAgICAgaXRlcmF0ZWVzID0gaXRlcmF0ZWVzID09IG51bGwgPyBbXSA6IFtpdGVyYXRlZXNdO1xuICAgICAgfVxuICAgICAgb3JkZXJzID0gZ3VhcmQgPyB1bmRlZmluZWQgOiBvcmRlcnM7XG4gICAgICBpZiAoIWlzQXJyYXkob3JkZXJzKSkge1xuICAgICAgICBvcmRlcnMgPSBvcmRlcnMgPT0gbnVsbCA/IFtdIDogW29yZGVyc107XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFzZU9yZGVyQnkoY29sbGVjdGlvbiwgaXRlcmF0ZWVzLCBvcmRlcnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgZWxlbWVudHMgc3BsaXQgaW50byB0d28gZ3JvdXBzLCB0aGUgZmlyc3Qgb2Ygd2hpY2hcbiAgICAgKiBjb250YWlucyBlbGVtZW50cyBgcHJlZGljYXRlYCByZXR1cm5zIHRydXRoeSBmb3IsIHRoZSBzZWNvbmQgb2Ygd2hpY2hcbiAgICAgKiBjb250YWlucyBlbGVtZW50cyBgcHJlZGljYXRlYCByZXR1cm5zIGZhbHNleSBmb3IuIFRoZSBwcmVkaWNhdGUgaXNcbiAgICAgKiBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgZ3JvdXBlZCBlbGVtZW50cy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAgJ2FnZSc6IDM2LCAnYWN0aXZlJzogZmFsc2UgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgICdhZ2UnOiA0MCwgJ2FjdGl2ZSc6IHRydWUgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAncGViYmxlcycsICdhZ2UnOiAxLCAgJ2FjdGl2ZSc6IGZhbHNlIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy5wYXJ0aXRpb24odXNlcnMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuIG8uYWN0aXZlOyB9KTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbWydmcmVkJ10sIFsnYmFybmV5JywgJ3BlYmJsZXMnXV1cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzYCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5wYXJ0aXRpb24odXNlcnMsIHsgJ2FnZSc6IDEsICdhY3RpdmUnOiBmYWxzZSB9KTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbWydwZWJibGVzJ10sIFsnYmFybmV5JywgJ2ZyZWQnXV1cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLnBhcnRpdGlvbih1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pO1xuICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFtbJ2Jhcm5leScsICdwZWJibGVzJ10sIFsnZnJlZCddXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5wYXJ0aXRpb24odXNlcnMsICdhY3RpdmUnKTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbWydmcmVkJ10sIFsnYmFybmV5JywgJ3BlYmJsZXMnXV1cbiAgICAgKi9cbiAgICB2YXIgcGFydGl0aW9uID0gY3JlYXRlQWdncmVnYXRvcihmdW5jdGlvbihyZXN1bHQsIHZhbHVlLCBrZXkpIHtcbiAgICAgIHJlc3VsdFtrZXkgPyAwIDogMV0ucHVzaCh2YWx1ZSk7XG4gICAgfSwgZnVuY3Rpb24oKSB7IHJldHVybiBbW10sIFtdXTsgfSk7XG5cbiAgICAvKipcbiAgICAgKiBSZWR1Y2VzIGBjb2xsZWN0aW9uYCB0byBhIHZhbHVlIHdoaWNoIGlzIHRoZSBhY2N1bXVsYXRlZCByZXN1bHQgb2YgcnVubmluZ1xuICAgICAqIGVhY2ggZWxlbWVudCBpbiBgY29sbGVjdGlvbmAgdGhydSBgaXRlcmF0ZWVgLCB3aGVyZSBlYWNoIHN1Y2Nlc3NpdmVcbiAgICAgKiBpbnZvY2F0aW9uIGlzIHN1cHBsaWVkIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIHByZXZpb3VzLiBJZiBgYWNjdW11bGF0b3JgXG4gICAgICogaXMgbm90IGdpdmVuLCB0aGUgZmlyc3QgZWxlbWVudCBvZiBgY29sbGVjdGlvbmAgaXMgdXNlZCBhcyB0aGUgaW5pdGlhbFxuICAgICAqIHZhbHVlLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIGZvdXIgYXJndW1lbnRzOlxuICAgICAqIChhY2N1bXVsYXRvciwgdmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuXG4gICAgICpcbiAgICAgKiBNYW55IGxvZGFzaCBtZXRob2RzIGFyZSBndWFyZGVkIHRvIHdvcmsgYXMgaXRlcmF0ZWVzIGZvciBtZXRob2RzIGxpa2VcbiAgICAgKiBgXy5yZWR1Y2VgLCBgXy5yZWR1Y2VSaWdodGAsIGFuZCBgXy50cmFuc2Zvcm1gLlxuICAgICAqXG4gICAgICogVGhlIGd1YXJkZWQgbWV0aG9kcyBhcmU6XG4gICAgICogYGFzc2lnbmAsIGBkZWZhdWx0c2AsIGBkZWZhdWx0c0RlZXBgLCBgaW5jbHVkZXNgLCBgbWVyZ2VgLCBgb3JkZXJCeWAsXG4gICAgICogYW5kIGBzb3J0QnlgXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0geyp9IFthY2N1bXVsYXRvcl0gVGhlIGluaXRpYWwgdmFsdWUuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGFjY3VtdWxhdGVkIHZhbHVlLlxuICAgICAqIEBzZWUgXy5yZWR1Y2VSaWdodFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnJlZHVjZShbMSwgMl0sIGZ1bmN0aW9uKHN1bSwgbikge1xuICAgICAqICAgcmV0dXJuIHN1bSArIG47XG4gICAgICogfSwgMCk7XG4gICAgICogLy8gPT4gM1xuICAgICAqXG4gICAgICogXy5yZWR1Y2UoeyAnYSc6IDEsICdiJzogMiwgJ2MnOiAxIH0sIGZ1bmN0aW9uKHJlc3VsdCwgdmFsdWUsIGtleSkge1xuICAgICAqICAgKHJlc3VsdFt2YWx1ZV0gfHwgKHJlc3VsdFt2YWx1ZV0gPSBbXSkpLnB1c2goa2V5KTtcbiAgICAgKiAgIHJldHVybiByZXN1bHQ7XG4gICAgICogfSwge30pO1xuICAgICAqIC8vID0+IHsgJzEnOiBbJ2EnLCAnYyddLCAnMic6IFsnYiddIH0gKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAgICAgKi9cbiAgICBmdW5jdGlvbiByZWR1Y2UoY29sbGVjdGlvbiwgaXRlcmF0ZWUsIGFjY3VtdWxhdG9yKSB7XG4gICAgICB2YXIgZnVuYyA9IGlzQXJyYXkoY29sbGVjdGlvbikgPyBhcnJheVJlZHVjZSA6IGJhc2VSZWR1Y2UsXG4gICAgICAgICAgaW5pdEFjY3VtID0gYXJndW1lbnRzLmxlbmd0aCA8IDM7XG5cbiAgICAgIHJldHVybiBmdW5jKGNvbGxlY3Rpb24sIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCA0KSwgYWNjdW11bGF0b3IsIGluaXRBY2N1bSwgYmFzZUVhY2gpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8ucmVkdWNlYCBleGNlcHQgdGhhdCBpdCBpdGVyYXRlcyBvdmVyIGVsZW1lbnRzIG9mXG4gICAgICogYGNvbGxlY3Rpb25gIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7Kn0gW2FjY3VtdWxhdG9yXSBUaGUgaW5pdGlhbCB2YWx1ZS5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgYWNjdW11bGF0ZWQgdmFsdWUuXG4gICAgICogQHNlZSBfLnJlZHVjZVxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYXJyYXkgPSBbWzAsIDFdLCBbMiwgM10sIFs0LCA1XV07XG4gICAgICpcbiAgICAgKiBfLnJlZHVjZVJpZ2h0KGFycmF5LCBmdW5jdGlvbihmbGF0dGVuZWQsIG90aGVyKSB7XG4gICAgICogICByZXR1cm4gZmxhdHRlbmVkLmNvbmNhdChvdGhlcik7XG4gICAgICogfSwgW10pO1xuICAgICAqIC8vID0+IFs0LCA1LCAyLCAzLCAwLCAxXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJlZHVjZVJpZ2h0KGNvbGxlY3Rpb24sIGl0ZXJhdGVlLCBhY2N1bXVsYXRvcikge1xuICAgICAgdmFyIGZ1bmMgPSBpc0FycmF5KGNvbGxlY3Rpb24pID8gYXJyYXlSZWR1Y2VSaWdodCA6IGJhc2VSZWR1Y2UsXG4gICAgICAgICAgaW5pdEFjY3VtID0gYXJndW1lbnRzLmxlbmd0aCA8IDM7XG5cbiAgICAgIHJldHVybiBmdW5jKGNvbGxlY3Rpb24sIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCA0KSwgYWNjdW11bGF0b3IsIGluaXRBY2N1bSwgYmFzZUVhY2hSaWdodCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIG9wcG9zaXRlIG9mIGBfLmZpbHRlcmA7IHRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGVsZW1lbnRzIG9mIGBjb2xsZWN0aW9uYFxuICAgICAqIHRoYXQgYHByZWRpY2F0ZWAgZG9lcyAqKm5vdCoqIHJldHVybiB0cnV0aHkgZm9yLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZpbHRlcmVkIGFycmF5LlxuICAgICAqIEBzZWUgXy5maWx0ZXJcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAnYWdlJzogMzYsICdhY3RpdmUnOiBmYWxzZSB9LFxuICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAnYWdlJzogNDAsICdhY3RpdmUnOiB0cnVlIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy5yZWplY3QodXNlcnMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuICFvLmFjdGl2ZTsgfSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydmcmVkJ11cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzYCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5yZWplY3QodXNlcnMsIHsgJ2FnZSc6IDQwLCAnYWN0aXZlJzogdHJ1ZSB9KTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ2Jhcm5leSddXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5yZWplY3QodXNlcnMsIFsnYWN0aXZlJywgZmFsc2VdKTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ2ZyZWQnXVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5yZWplY3QodXNlcnMsICdhY3RpdmUnKTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ2Jhcm5leSddXG4gICAgICovXG4gICAgZnVuY3Rpb24gcmVqZWN0KGNvbGxlY3Rpb24sIHByZWRpY2F0ZSkge1xuICAgICAgdmFyIGZ1bmMgPSBpc0FycmF5KGNvbGxlY3Rpb24pID8gYXJyYXlGaWx0ZXIgOiBiYXNlRmlsdGVyO1xuICAgICAgcmV0dXJuIGZ1bmMoY29sbGVjdGlvbiwgbmVnYXRlKGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwgMykpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGEgcmFuZG9tIGVsZW1lbnQgZnJvbSBgY29sbGVjdGlvbmAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMi4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIHNhbXBsZS5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmFuZG9tIGVsZW1lbnQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uc2FtcGxlKFsxLCAyLCAzLCA0XSk7XG4gICAgICogLy8gPT4gMlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNhbXBsZShjb2xsZWN0aW9uKSB7XG4gICAgICB2YXIgZnVuYyA9IGlzQXJyYXkoY29sbGVjdGlvbikgPyBhcnJheVNhbXBsZSA6IGJhc2VTYW1wbGU7XG4gICAgICByZXR1cm4gZnVuYyhjb2xsZWN0aW9uKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGBuYCByYW5kb20gZWxlbWVudHMgYXQgdW5pcXVlIGtleXMgZnJvbSBgY29sbGVjdGlvbmAgdXAgdG8gdGhlXG4gICAgICogc2l6ZSBvZiBgY29sbGVjdGlvbmAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIHNhbXBsZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW249MV0gVGhlIG51bWJlciBvZiBlbGVtZW50cyB0byBzYW1wbGUuXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHJhbmRvbSBlbGVtZW50cy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5zYW1wbGVTaXplKFsxLCAyLCAzXSwgMik7XG4gICAgICogLy8gPT4gWzMsIDFdXG4gICAgICpcbiAgICAgKiBfLnNhbXBsZVNpemUoWzEsIDIsIDNdLCA0KTtcbiAgICAgKiAvLyA9PiBbMiwgMywgMV1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzYW1wbGVTaXplKGNvbGxlY3Rpb24sIG4sIGd1YXJkKSB7XG4gICAgICBpZiAoKGd1YXJkID8gaXNJdGVyYXRlZUNhbGwoY29sbGVjdGlvbiwgbiwgZ3VhcmQpIDogbiA9PT0gdW5kZWZpbmVkKSkge1xuICAgICAgICBuID0gMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG4gPSB0b0ludGVnZXIobik7XG4gICAgICB9XG4gICAgICB2YXIgZnVuYyA9IGlzQXJyYXkoY29sbGVjdGlvbikgPyBhcnJheVNhbXBsZVNpemUgOiBiYXNlU2FtcGxlU2l6ZTtcbiAgICAgIHJldHVybiBmdW5jKGNvbGxlY3Rpb24sIG4pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2Ygc2h1ZmZsZWQgdmFsdWVzLCB1c2luZyBhIHZlcnNpb24gb2YgdGhlXG4gICAgICogW0Zpc2hlci1ZYXRlcyBzaHVmZmxlXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9GaXNoZXItWWF0ZXNfc2h1ZmZsZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIHNodWZmbGUuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgc2h1ZmZsZWQgYXJyYXkuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uc2h1ZmZsZShbMSwgMiwgMywgNF0pO1xuICAgICAqIC8vID0+IFs0LCAxLCAzLCAyXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNodWZmbGUoY29sbGVjdGlvbikge1xuICAgICAgdmFyIGZ1bmMgPSBpc0FycmF5KGNvbGxlY3Rpb24pID8gYXJyYXlTaHVmZmxlIDogYmFzZVNodWZmbGU7XG4gICAgICByZXR1cm4gZnVuYyhjb2xsZWN0aW9uKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBzaXplIG9mIGBjb2xsZWN0aW9uYCBieSByZXR1cm5pbmcgaXRzIGxlbmd0aCBmb3IgYXJyYXktbGlrZVxuICAgICAqIHZhbHVlcyBvciB0aGUgbnVtYmVyIG9mIG93biBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0aWVzIGZvciBvYmplY3RzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdHxzdHJpbmd9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaW5zcGVjdC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBjb2xsZWN0aW9uIHNpemUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uc2l6ZShbMSwgMiwgM10pO1xuICAgICAqIC8vID0+IDNcbiAgICAgKlxuICAgICAqIF8uc2l6ZSh7ICdhJzogMSwgJ2InOiAyIH0pO1xuICAgICAqIC8vID0+IDJcbiAgICAgKlxuICAgICAqIF8uc2l6ZSgncGViYmxlcycpO1xuICAgICAqIC8vID0+IDdcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzaXplKGNvbGxlY3Rpb24pIHtcbiAgICAgIGlmIChjb2xsZWN0aW9uID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9XG4gICAgICBpZiAoaXNBcnJheUxpa2UoY29sbGVjdGlvbikpIHtcbiAgICAgICAgcmV0dXJuIGlzU3RyaW5nKGNvbGxlY3Rpb24pID8gc3RyaW5nU2l6ZShjb2xsZWN0aW9uKSA6IGNvbGxlY3Rpb24ubGVuZ3RoO1xuICAgICAgfVxuICAgICAgdmFyIHRhZyA9IGdldFRhZyhjb2xsZWN0aW9uKTtcbiAgICAgIGlmICh0YWcgPT0gbWFwVGFnIHx8IHRhZyA9PSBzZXRUYWcpIHtcbiAgICAgICAgcmV0dXJuIGNvbGxlY3Rpb24uc2l6ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBiYXNlS2V5cyhjb2xsZWN0aW9uKS5sZW5ndGg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGBwcmVkaWNhdGVgIHJldHVybnMgdHJ1dGh5IGZvciAqKmFueSoqIGVsZW1lbnQgb2YgYGNvbGxlY3Rpb25gLlxuICAgICAqIEl0ZXJhdGlvbiBpcyBzdG9wcGVkIG9uY2UgYHByZWRpY2F0ZWAgcmV0dXJucyB0cnV0aHkuIFRoZSBwcmVkaWNhdGUgaXNcbiAgICAgKiBpbnZva2VkIHdpdGggdGhyZWUgYXJndW1lbnRzOiAodmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvblxuICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW55IGVsZW1lbnQgcGFzc2VzIHRoZSBwcmVkaWNhdGUgY2hlY2ssXG4gICAgICogIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5zb21lKFtudWxsLCAwLCAneWVzJywgZmFsc2VdLCBCb29sZWFuKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSBbXG4gICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICdhY3RpdmUnOiB0cnVlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICdhY3RpdmUnOiBmYWxzZSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzYCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5zb21lKHVzZXJzLCB7ICd1c2VyJzogJ2Jhcm5leScsICdhY3RpdmUnOiBmYWxzZSB9KTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uc29tZSh1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uc29tZSh1c2VycywgJ2FjdGl2ZScpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzb21lKGNvbGxlY3Rpb24sIHByZWRpY2F0ZSwgZ3VhcmQpIHtcbiAgICAgIHZhciBmdW5jID0gaXNBcnJheShjb2xsZWN0aW9uKSA/IGFycmF5U29tZSA6IGJhc2VTb21lO1xuICAgICAgaWYgKGd1YXJkICYmIGlzSXRlcmF0ZWVDYWxsKGNvbGxlY3Rpb24sIHByZWRpY2F0ZSwgZ3VhcmQpKSB7XG4gICAgICAgIHByZWRpY2F0ZSA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmdW5jKGNvbGxlY3Rpb24sIGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwgMykpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgZWxlbWVudHMsIHNvcnRlZCBpbiBhc2NlbmRpbmcgb3JkZXIgYnkgdGhlIHJlc3VsdHMgb2ZcbiAgICAgKiBydW5uaW5nIGVhY2ggZWxlbWVudCBpbiBhIGNvbGxlY3Rpb24gdGhydSBlYWNoIGl0ZXJhdGVlLiBUaGlzIG1ldGhvZFxuICAgICAqIHBlcmZvcm1zIGEgc3RhYmxlIHNvcnQsIHRoYXQgaXMsIGl0IHByZXNlcnZlcyB0aGUgb3JpZ2luYWwgc29ydCBvcmRlciBvZlxuICAgICAqIGVxdWFsIGVsZW1lbnRzLiBUaGUgaXRlcmF0ZWVzIGFyZSBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHsuLi4oRnVuY3Rpb258RnVuY3Rpb25bXSl9IFtpdGVyYXRlZXM9W18uaWRlbnRpdHldXVxuICAgICAqICBUaGUgaXRlcmF0ZWVzIHRvIHNvcnQgYnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgc29ydGVkIGFycmF5LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgdXNlcnMgPSBbXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICdhZ2UnOiA0OCB9LFxuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAnYWdlJzogMzYgfSxcbiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgJ2FnZSc6IDMwIH0sXG4gICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICdhZ2UnOiAzNCB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8uc29ydEJ5KHVzZXJzLCBbZnVuY3Rpb24obykgeyByZXR1cm4gby51c2VyOyB9XSk7XG4gICAgICogLy8gPT4gb2JqZWN0cyBmb3IgW1snYmFybmV5JywgMzZdLCBbJ2Jhcm5leScsIDM0XSwgWydmcmVkJywgNDhdLCBbJ2ZyZWQnLCAzMF1dXG4gICAgICpcbiAgICAgKiBfLnNvcnRCeSh1c2VycywgWyd1c2VyJywgJ2FnZSddKTtcbiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbWydiYXJuZXknLCAzNF0sIFsnYmFybmV5JywgMzZdLCBbJ2ZyZWQnLCAzMF0sIFsnZnJlZCcsIDQ4XV1cbiAgICAgKi9cbiAgICB2YXIgc29ydEJ5ID0gYmFzZVJlc3QoZnVuY3Rpb24oY29sbGVjdGlvbiwgaXRlcmF0ZWVzKSB7XG4gICAgICBpZiAoY29sbGVjdGlvbiA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIHZhciBsZW5ndGggPSBpdGVyYXRlZXMubGVuZ3RoO1xuICAgICAgaWYgKGxlbmd0aCA+IDEgJiYgaXNJdGVyYXRlZUNhbGwoY29sbGVjdGlvbiwgaXRlcmF0ZWVzWzBdLCBpdGVyYXRlZXNbMV0pKSB7XG4gICAgICAgIGl0ZXJhdGVlcyA9IFtdO1xuICAgICAgfSBlbHNlIGlmIChsZW5ndGggPiAyICYmIGlzSXRlcmF0ZWVDYWxsKGl0ZXJhdGVlc1swXSwgaXRlcmF0ZWVzWzFdLCBpdGVyYXRlZXNbMl0pKSB7XG4gICAgICAgIGl0ZXJhdGVlcyA9IFtpdGVyYXRlZXNbMF1dO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJhc2VPcmRlckJ5KGNvbGxlY3Rpb24sIGJhc2VGbGF0dGVuKGl0ZXJhdGVlcywgMSksIFtdKTtcbiAgICB9KTtcblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHRpbWVzdGFtcCBvZiB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0aGF0IGhhdmUgZWxhcHNlZCBzaW5jZVxuICAgICAqIHRoZSBVbml4IGVwb2NoICgxIEphbnVhcnkgMTk3MCAwMDowMDowMCBVVEMpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDIuNC4wXG4gICAgICogQGNhdGVnb3J5IERhdGVcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSB0aW1lc3RhbXAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZGVmZXIoZnVuY3Rpb24oc3RhbXApIHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKF8ubm93KCkgLSBzdGFtcCk7XG4gICAgICogfSwgXy5ub3coKSk7XG4gICAgICogLy8gPT4gTG9ncyB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBpdCB0b29rIGZvciB0aGUgZGVmZXJyZWQgaW52b2NhdGlvbi5cbiAgICAgKi9cbiAgICB2YXIgbm93ID0gY3R4Tm93IHx8IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHJvb3QuRGF0ZS5ub3coKTtcbiAgICB9O1xuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogVGhlIG9wcG9zaXRlIG9mIGBfLmJlZm9yZWA7IHRoaXMgbWV0aG9kIGNyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXNcbiAgICAgKiBgZnVuY2Agb25jZSBpdCdzIGNhbGxlZCBgbmAgb3IgbW9yZSB0aW1lcy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBuIFRoZSBudW1iZXIgb2YgY2FsbHMgYmVmb3JlIGBmdW5jYCBpcyBpbnZva2VkLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHJlc3RyaWN0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHJlc3RyaWN0ZWQgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBzYXZlcyA9IFsncHJvZmlsZScsICdzZXR0aW5ncyddO1xuICAgICAqXG4gICAgICogdmFyIGRvbmUgPSBfLmFmdGVyKHNhdmVzLmxlbmd0aCwgZnVuY3Rpb24oKSB7XG4gICAgICogICBjb25zb2xlLmxvZygnZG9uZSBzYXZpbmchJyk7XG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKiBfLmZvckVhY2goc2F2ZXMsIGZ1bmN0aW9uKHR5cGUpIHtcbiAgICAgKiAgIGFzeW5jU2F2ZSh7ICd0eXBlJzogdHlwZSwgJ2NvbXBsZXRlJzogZG9uZSB9KTtcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiBMb2dzICdkb25lIHNhdmluZyEnIGFmdGVyIHRoZSB0d28gYXN5bmMgc2F2ZXMgaGF2ZSBjb21wbGV0ZWQuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYWZ0ZXIobiwgZnVuYykge1xuICAgICAgaWYgKHR5cGVvZiBmdW5jICE9ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICAgICAgfVxuICAgICAgbiA9IHRvSW50ZWdlcihuKTtcbiAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKC0tbiA8IDEpIHtcbiAgICAgICAgICByZXR1cm4gZnVuYy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYGZ1bmNgLCB3aXRoIHVwIHRvIGBuYCBhcmd1bWVudHMsXG4gICAgICogaWdub3JpbmcgYW55IGFkZGl0aW9uYWwgYXJndW1lbnRzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY2FwIGFyZ3VtZW50cyBmb3IuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtuPWZ1bmMubGVuZ3RoXSBUaGUgYXJpdHkgY2FwLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgY2FwcGVkIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLm1hcChbJzYnLCAnOCcsICcxMCddLCBfLmFyeShwYXJzZUludCwgMSkpO1xuICAgICAqIC8vID0+IFs2LCA4LCAxMF1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBhcnkoZnVuYywgbiwgZ3VhcmQpIHtcbiAgICAgIG4gPSBndWFyZCA/IHVuZGVmaW5lZCA6IG47XG4gICAgICBuID0gKGZ1bmMgJiYgbiA9PSBudWxsKSA/IGZ1bmMubGVuZ3RoIDogbjtcbiAgICAgIHJldHVybiBjcmVhdGVXcmFwKGZ1bmMsIFdSQVBfQVJZX0ZMQUcsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBgZnVuY2AsIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIGFuZCBhcmd1bWVudHNcbiAgICAgKiBvZiB0aGUgY3JlYXRlZCBmdW5jdGlvbiwgd2hpbGUgaXQncyBjYWxsZWQgbGVzcyB0aGFuIGBuYCB0aW1lcy4gU3Vic2VxdWVudFxuICAgICAqIGNhbGxzIHRvIHRoZSBjcmVhdGVkIGZ1bmN0aW9uIHJldHVybiB0aGUgcmVzdWx0IG9mIHRoZSBsYXN0IGBmdW5jYCBpbnZvY2F0aW9uLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG4gVGhlIG51bWJlciBvZiBjYWxscyBhdCB3aGljaCBgZnVuY2AgaXMgbm8gbG9uZ2VyIGludm9rZWQuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcmVzdHJpY3QuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgcmVzdHJpY3RlZCBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogalF1ZXJ5KGVsZW1lbnQpLm9uKCdjbGljaycsIF8uYmVmb3JlKDUsIGFkZENvbnRhY3RUb0xpc3QpKTtcbiAgICAgKiAvLyA9PiBBbGxvd3MgYWRkaW5nIHVwIHRvIDQgY29udGFjdHMgdG8gdGhlIGxpc3QuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYmVmb3JlKG4sIGZ1bmMpIHtcbiAgICAgIHZhciByZXN1bHQ7XG4gICAgICBpZiAodHlwZW9mIGZ1bmMgIT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7XG4gICAgICB9XG4gICAgICBuID0gdG9JbnRlZ2VyKG4pO1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAoLS1uID4gMCkge1xuICAgICAgICAgIHJlc3VsdCA9IGZ1bmMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobiA8PSAxKSB7XG4gICAgICAgICAgZnVuYyA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGBmdW5jYCB3aXRoIHRoZSBgdGhpc2AgYmluZGluZyBvZiBgdGhpc0FyZ2BcbiAgICAgKiBhbmQgYHBhcnRpYWxzYCBwcmVwZW5kZWQgdG8gdGhlIGFyZ3VtZW50cyBpdCByZWNlaXZlcy5cbiAgICAgKlxuICAgICAqIFRoZSBgXy5iaW5kLnBsYWNlaG9sZGVyYCB2YWx1ZSwgd2hpY2ggZGVmYXVsdHMgdG8gYF9gIGluIG1vbm9saXRoaWMgYnVpbGRzLFxuICAgICAqIG1heSBiZSB1c2VkIGFzIGEgcGxhY2Vob2xkZXIgZm9yIHBhcnRpYWxseSBhcHBsaWVkIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBVbmxpa2UgbmF0aXZlIGBGdW5jdGlvbiNiaW5kYCwgdGhpcyBtZXRob2QgZG9lc24ndCBzZXQgdGhlIFwibGVuZ3RoXCJcbiAgICAgKiBwcm9wZXJ0eSBvZiBib3VuZCBmdW5jdGlvbnMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBiaW5kLlxuICAgICAqIEBwYXJhbSB7Kn0gdGhpc0FyZyBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGZ1bmNgLlxuICAgICAqIEBwYXJhbSB7Li4uKn0gW3BhcnRpYWxzXSBUaGUgYXJndW1lbnRzIHRvIGJlIHBhcnRpYWxseSBhcHBsaWVkLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGJvdW5kIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBncmVldChncmVldGluZywgcHVuY3R1YXRpb24pIHtcbiAgICAgKiAgIHJldHVybiBncmVldGluZyArICcgJyArIHRoaXMudXNlciArIHB1bmN0dWF0aW9uO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICd1c2VyJzogJ2ZyZWQnIH07XG4gICAgICpcbiAgICAgKiB2YXIgYm91bmQgPSBfLmJpbmQoZ3JlZXQsIG9iamVjdCwgJ2hpJyk7XG4gICAgICogYm91bmQoJyEnKTtcbiAgICAgKiAvLyA9PiAnaGkgZnJlZCEnXG4gICAgICpcbiAgICAgKiAvLyBCb3VuZCB3aXRoIHBsYWNlaG9sZGVycy5cbiAgICAgKiB2YXIgYm91bmQgPSBfLmJpbmQoZ3JlZXQsIG9iamVjdCwgXywgJyEnKTtcbiAgICAgKiBib3VuZCgnaGknKTtcbiAgICAgKiAvLyA9PiAnaGkgZnJlZCEnXG4gICAgICovXG4gICAgdmFyIGJpbmQgPSBiYXNlUmVzdChmdW5jdGlvbihmdW5jLCB0aGlzQXJnLCBwYXJ0aWFscykge1xuICAgICAgdmFyIGJpdG1hc2sgPSBXUkFQX0JJTkRfRkxBRztcbiAgICAgIGlmIChwYXJ0aWFscy5sZW5ndGgpIHtcbiAgICAgICAgdmFyIGhvbGRlcnMgPSByZXBsYWNlSG9sZGVycyhwYXJ0aWFscywgZ2V0SG9sZGVyKGJpbmQpKTtcbiAgICAgICAgYml0bWFzayB8PSBXUkFQX1BBUlRJQUxfRkxBRztcbiAgICAgIH1cbiAgICAgIHJldHVybiBjcmVhdGVXcmFwKGZ1bmMsIGJpdG1hc2ssIHRoaXNBcmcsIHBhcnRpYWxzLCBob2xkZXJzKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgdGhlIG1ldGhvZCBhdCBgb2JqZWN0W2tleV1gIHdpdGggYHBhcnRpYWxzYFxuICAgICAqIHByZXBlbmRlZCB0byB0aGUgYXJndW1lbnRzIGl0IHJlY2VpdmVzLlxuICAgICAqXG4gICAgICogVGhpcyBtZXRob2QgZGlmZmVycyBmcm9tIGBfLmJpbmRgIGJ5IGFsbG93aW5nIGJvdW5kIGZ1bmN0aW9ucyB0byByZWZlcmVuY2VcbiAgICAgKiBtZXRob2RzIHRoYXQgbWF5IGJlIHJlZGVmaW5lZCBvciBkb24ndCB5ZXQgZXhpc3QuIFNlZVxuICAgICAqIFtQZXRlciBNaWNoYXV4J3MgYXJ0aWNsZV0oaHR0cDovL3BldGVyLm1pY2hhdXguY2EvYXJ0aWNsZXMvbGF6eS1mdW5jdGlvbi1kZWZpbml0aW9uLXBhdHRlcm4pXG4gICAgICogZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgKlxuICAgICAqIFRoZSBgXy5iaW5kS2V5LnBsYWNlaG9sZGVyYCB2YWx1ZSwgd2hpY2ggZGVmYXVsdHMgdG8gYF9gIGluIG1vbm9saXRoaWNcbiAgICAgKiBidWlsZHMsIG1heSBiZSB1c2VkIGFzIGEgcGxhY2Vob2xkZXIgZm9yIHBhcnRpYWxseSBhcHBsaWVkIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEwLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaW52b2tlIHRoZSBtZXRob2Qgb24uXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBtZXRob2QuXG4gICAgICogQHBhcmFtIHsuLi4qfSBbcGFydGlhbHNdIFRoZSBhcmd1bWVudHMgdG8gYmUgcGFydGlhbGx5IGFwcGxpZWQuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYm91bmQgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7XG4gICAgICogICAndXNlcic6ICdmcmVkJyxcbiAgICAgKiAgICdncmVldCc6IGZ1bmN0aW9uKGdyZWV0aW5nLCBwdW5jdHVhdGlvbikge1xuICAgICAqICAgICByZXR1cm4gZ3JlZXRpbmcgKyAnICcgKyB0aGlzLnVzZXIgKyBwdW5jdHVhdGlvbjtcbiAgICAgKiAgIH1cbiAgICAgKiB9O1xuICAgICAqXG4gICAgICogdmFyIGJvdW5kID0gXy5iaW5kS2V5KG9iamVjdCwgJ2dyZWV0JywgJ2hpJyk7XG4gICAgICogYm91bmQoJyEnKTtcbiAgICAgKiAvLyA9PiAnaGkgZnJlZCEnXG4gICAgICpcbiAgICAgKiBvYmplY3QuZ3JlZXQgPSBmdW5jdGlvbihncmVldGluZywgcHVuY3R1YXRpb24pIHtcbiAgICAgKiAgIHJldHVybiBncmVldGluZyArICd5YSAnICsgdGhpcy51c2VyICsgcHVuY3R1YXRpb247XG4gICAgICogfTtcbiAgICAgKlxuICAgICAqIGJvdW5kKCchJyk7XG4gICAgICogLy8gPT4gJ2hpeWEgZnJlZCEnXG4gICAgICpcbiAgICAgKiAvLyBCb3VuZCB3aXRoIHBsYWNlaG9sZGVycy5cbiAgICAgKiB2YXIgYm91bmQgPSBfLmJpbmRLZXkob2JqZWN0LCAnZ3JlZXQnLCBfLCAnIScpO1xuICAgICAqIGJvdW5kKCdoaScpO1xuICAgICAqIC8vID0+ICdoaXlhIGZyZWQhJ1xuICAgICAqL1xuICAgIHZhciBiaW5kS2V5ID0gYmFzZVJlc3QoZnVuY3Rpb24ob2JqZWN0LCBrZXksIHBhcnRpYWxzKSB7XG4gICAgICB2YXIgYml0bWFzayA9IFdSQVBfQklORF9GTEFHIHwgV1JBUF9CSU5EX0tFWV9GTEFHO1xuICAgICAgaWYgKHBhcnRpYWxzLmxlbmd0aCkge1xuICAgICAgICB2YXIgaG9sZGVycyA9IHJlcGxhY2VIb2xkZXJzKHBhcnRpYWxzLCBnZXRIb2xkZXIoYmluZEtleSkpO1xuICAgICAgICBiaXRtYXNrIHw9IFdSQVBfUEFSVElBTF9GTEFHO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNyZWF0ZVdyYXAoa2V5LCBiaXRtYXNrLCBvYmplY3QsIHBhcnRpYWxzLCBob2xkZXJzKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGFjY2VwdHMgYXJndW1lbnRzIG9mIGBmdW5jYCBhbmQgZWl0aGVyIGludm9rZXNcbiAgICAgKiBgZnVuY2AgcmV0dXJuaW5nIGl0cyByZXN1bHQsIGlmIGF0IGxlYXN0IGBhcml0eWAgbnVtYmVyIG9mIGFyZ3VtZW50cyBoYXZlXG4gICAgICogYmVlbiBwcm92aWRlZCwgb3IgcmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgYWNjZXB0cyB0aGUgcmVtYWluaW5nIGBmdW5jYFxuICAgICAqIGFyZ3VtZW50cywgYW5kIHNvIG9uLiBUaGUgYXJpdHkgb2YgYGZ1bmNgIG1heSBiZSBzcGVjaWZpZWQgaWYgYGZ1bmMubGVuZ3RoYFxuICAgICAqIGlzIG5vdCBzdWZmaWNpZW50LlxuICAgICAqXG4gICAgICogVGhlIGBfLmN1cnJ5LnBsYWNlaG9sZGVyYCB2YWx1ZSwgd2hpY2ggZGVmYXVsdHMgdG8gYF9gIGluIG1vbm9saXRoaWMgYnVpbGRzLFxuICAgICAqIG1heSBiZSB1c2VkIGFzIGEgcGxhY2Vob2xkZXIgZm9yIHByb3ZpZGVkIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBkb2Vzbid0IHNldCB0aGUgXCJsZW5ndGhcIiBwcm9wZXJ0eSBvZiBjdXJyaWVkIGZ1bmN0aW9ucy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAyLjAuMFxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGN1cnJ5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJpdHk9ZnVuYy5sZW5ndGhdIFRoZSBhcml0eSBvZiBgZnVuY2AuXG4gICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjdXJyaWVkIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgYWJjID0gZnVuY3Rpb24oYSwgYiwgYykge1xuICAgICAqICAgcmV0dXJuIFthLCBiLCBjXTtcbiAgICAgKiB9O1xuICAgICAqXG4gICAgICogdmFyIGN1cnJpZWQgPSBfLmN1cnJ5KGFiYyk7XG4gICAgICpcbiAgICAgKiBjdXJyaWVkKDEpKDIpKDMpO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqXG4gICAgICogY3VycmllZCgxLCAyKSgzKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgM11cbiAgICAgKlxuICAgICAqIGN1cnJpZWQoMSwgMiwgMyk7XG4gICAgICogLy8gPT4gWzEsIDIsIDNdXG4gICAgICpcbiAgICAgKiAvLyBDdXJyaWVkIHdpdGggcGxhY2Vob2xkZXJzLlxuICAgICAqIGN1cnJpZWQoMSkoXywgMykoMik7XG4gICAgICogLy8gPT4gWzEsIDIsIDNdXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3VycnkoZnVuYywgYXJpdHksIGd1YXJkKSB7XG4gICAgICBhcml0eSA9IGd1YXJkID8gdW5kZWZpbmVkIDogYXJpdHk7XG4gICAgICB2YXIgcmVzdWx0ID0gY3JlYXRlV3JhcChmdW5jLCBXUkFQX0NVUlJZX0ZMQUcsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBhcml0eSk7XG4gICAgICByZXN1bHQucGxhY2Vob2xkZXIgPSBjdXJyeS5wbGFjZWhvbGRlcjtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5jdXJyeWAgZXhjZXB0IHRoYXQgYXJndW1lbnRzIGFyZSBhcHBsaWVkIHRvIGBmdW5jYFxuICAgICAqIGluIHRoZSBtYW5uZXIgb2YgYF8ucGFydGlhbFJpZ2h0YCBpbnN0ZWFkIG9mIGBfLnBhcnRpYWxgLlxuICAgICAqXG4gICAgICogVGhlIGBfLmN1cnJ5UmlnaHQucGxhY2Vob2xkZXJgIHZhbHVlLCB3aGljaCBkZWZhdWx0cyB0byBgX2AgaW4gbW9ub2xpdGhpY1xuICAgICAqIGJ1aWxkcywgbWF5IGJlIHVzZWQgYXMgYSBwbGFjZWhvbGRlciBmb3IgcHJvdmlkZWQgYXJndW1lbnRzLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGRvZXNuJ3Qgc2V0IHRoZSBcImxlbmd0aFwiIHByb3BlcnR5IG9mIGN1cnJpZWQgZnVuY3Rpb25zLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY3VycnkuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFthcml0eT1mdW5jLmxlbmd0aF0gVGhlIGFyaXR5IG9mIGBmdW5jYC5cbiAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGN1cnJpZWQgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBhYmMgPSBmdW5jdGlvbihhLCBiLCBjKSB7XG4gICAgICogICByZXR1cm4gW2EsIGIsIGNdO1xuICAgICAqIH07XG4gICAgICpcbiAgICAgKiB2YXIgY3VycmllZCA9IF8uY3VycnlSaWdodChhYmMpO1xuICAgICAqXG4gICAgICogY3VycmllZCgzKSgyKSgxKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgM11cbiAgICAgKlxuICAgICAqIGN1cnJpZWQoMiwgMykoMSk7XG4gICAgICogLy8gPT4gWzEsIDIsIDNdXG4gICAgICpcbiAgICAgKiBjdXJyaWVkKDEsIDIsIDMpO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqXG4gICAgICogLy8gQ3VycmllZCB3aXRoIHBsYWNlaG9sZGVycy5cbiAgICAgKiBjdXJyaWVkKDMpKDEsIF8pKDIpO1xuICAgICAqIC8vID0+IFsxLCAyLCAzXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGN1cnJ5UmlnaHQoZnVuYywgYXJpdHksIGd1YXJkKSB7XG4gICAgICBhcml0eSA9IGd1YXJkID8gdW5kZWZpbmVkIDogYXJpdHk7XG4gICAgICB2YXIgcmVzdWx0ID0gY3JlYXRlV3JhcChmdW5jLCBXUkFQX0NVUlJZX1JJR0hUX0ZMQUcsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBhcml0eSk7XG4gICAgICByZXN1bHQucGxhY2Vob2xkZXIgPSBjdXJyeVJpZ2h0LnBsYWNlaG9sZGVyO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZGVib3VuY2VkIGZ1bmN0aW9uIHRoYXQgZGVsYXlzIGludm9raW5nIGBmdW5jYCB1bnRpbCBhZnRlciBgd2FpdGBcbiAgICAgKiBtaWxsaXNlY29uZHMgaGF2ZSBlbGFwc2VkIHNpbmNlIHRoZSBsYXN0IHRpbWUgdGhlIGRlYm91bmNlZCBmdW5jdGlvbiB3YXNcbiAgICAgKiBpbnZva2VkLiBUaGUgZGVib3VuY2VkIGZ1bmN0aW9uIGNvbWVzIHdpdGggYSBgY2FuY2VsYCBtZXRob2QgdG8gY2FuY2VsXG4gICAgICogZGVsYXllZCBgZnVuY2AgaW52b2NhdGlvbnMgYW5kIGEgYGZsdXNoYCBtZXRob2QgdG8gaW1tZWRpYXRlbHkgaW52b2tlIHRoZW0uXG4gICAgICogUHJvdmlkZSBgb3B0aW9uc2AgdG8gaW5kaWNhdGUgd2hldGhlciBgZnVuY2Agc2hvdWxkIGJlIGludm9rZWQgb24gdGhlXG4gICAgICogbGVhZGluZyBhbmQvb3IgdHJhaWxpbmcgZWRnZSBvZiB0aGUgYHdhaXRgIHRpbWVvdXQuIFRoZSBgZnVuY2AgaXMgaW52b2tlZFxuICAgICAqIHdpdGggdGhlIGxhc3QgYXJndW1lbnRzIHByb3ZpZGVkIHRvIHRoZSBkZWJvdW5jZWQgZnVuY3Rpb24uIFN1YnNlcXVlbnRcbiAgICAgKiBjYWxscyB0byB0aGUgZGVib3VuY2VkIGZ1bmN0aW9uIHJldHVybiB0aGUgcmVzdWx0IG9mIHRoZSBsYXN0IGBmdW5jYFxuICAgICAqIGludm9jYXRpb24uXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogSWYgYGxlYWRpbmdgIGFuZCBgdHJhaWxpbmdgIG9wdGlvbnMgYXJlIGB0cnVlYCwgYGZ1bmNgIGlzXG4gICAgICogaW52b2tlZCBvbiB0aGUgdHJhaWxpbmcgZWRnZSBvZiB0aGUgdGltZW91dCBvbmx5IGlmIHRoZSBkZWJvdW5jZWQgZnVuY3Rpb25cbiAgICAgKiBpcyBpbnZva2VkIG1vcmUgdGhhbiBvbmNlIGR1cmluZyB0aGUgYHdhaXRgIHRpbWVvdXQuXG4gICAgICpcbiAgICAgKiBJZiBgd2FpdGAgaXMgYDBgIGFuZCBgbGVhZGluZ2AgaXMgYGZhbHNlYCwgYGZ1bmNgIGludm9jYXRpb24gaXMgZGVmZXJyZWRcbiAgICAgKiB1bnRpbCB0byB0aGUgbmV4dCB0aWNrLCBzaW1pbGFyIHRvIGBzZXRUaW1lb3V0YCB3aXRoIGEgdGltZW91dCBvZiBgMGAuXG4gICAgICpcbiAgICAgKiBTZWUgW0RhdmlkIENvcmJhY2hvJ3MgYXJ0aWNsZV0oaHR0cHM6Ly9jc3MtdHJpY2tzLmNvbS9kZWJvdW5jaW5nLXRocm90dGxpbmctZXhwbGFpbmVkLWV4YW1wbGVzLylcbiAgICAgKiBmb3IgZGV0YWlscyBvdmVyIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIGBfLmRlYm91bmNlYCBhbmQgYF8udGhyb3R0bGVgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gZGVib3VuY2UuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFt3YWl0PTBdIFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIGRlbGF5LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV0gVGhlIG9wdGlvbnMgb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMubGVhZGluZz1mYWxzZV1cbiAgICAgKiAgU3BlY2lmeSBpbnZva2luZyBvbiB0aGUgbGVhZGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5tYXhXYWl0XVxuICAgICAqICBUaGUgbWF4aW11bSB0aW1lIGBmdW5jYCBpcyBhbGxvd2VkIHRvIGJlIGRlbGF5ZWQgYmVmb3JlIGl0J3MgaW52b2tlZC5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnRyYWlsaW5nPXRydWVdXG4gICAgICogIFNwZWNpZnkgaW52b2tpbmcgb24gdGhlIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIHRpbWVvdXQuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZGVib3VuY2VkIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiAvLyBBdm9pZCBjb3N0bHkgY2FsY3VsYXRpb25zIHdoaWxlIHRoZSB3aW5kb3cgc2l6ZSBpcyBpbiBmbHV4LlxuICAgICAqIGpRdWVyeSh3aW5kb3cpLm9uKCdyZXNpemUnLCBfLmRlYm91bmNlKGNhbGN1bGF0ZUxheW91dCwgMTUwKSk7XG4gICAgICpcbiAgICAgKiAvLyBJbnZva2UgYHNlbmRNYWlsYCB3aGVuIGNsaWNrZWQsIGRlYm91bmNpbmcgc3Vic2VxdWVudCBjYWxscy5cbiAgICAgKiBqUXVlcnkoZWxlbWVudCkub24oJ2NsaWNrJywgXy5kZWJvdW5jZShzZW5kTWFpbCwgMzAwLCB7XG4gICAgICogICAnbGVhZGluZyc6IHRydWUsXG4gICAgICogICAndHJhaWxpbmcnOiBmYWxzZVxuICAgICAqIH0pKTtcbiAgICAgKlxuICAgICAqIC8vIEVuc3VyZSBgYmF0Y2hMb2dgIGlzIGludm9rZWQgb25jZSBhZnRlciAxIHNlY29uZCBvZiBkZWJvdW5jZWQgY2FsbHMuXG4gICAgICogdmFyIGRlYm91bmNlZCA9IF8uZGVib3VuY2UoYmF0Y2hMb2csIDI1MCwgeyAnbWF4V2FpdCc6IDEwMDAgfSk7XG4gICAgICogdmFyIHNvdXJjZSA9IG5ldyBFdmVudFNvdXJjZSgnL3N0cmVhbScpO1xuICAgICAqIGpRdWVyeShzb3VyY2UpLm9uKCdtZXNzYWdlJywgZGVib3VuY2VkKTtcbiAgICAgKlxuICAgICAqIC8vIENhbmNlbCB0aGUgdHJhaWxpbmcgZGVib3VuY2VkIGludm9jYXRpb24uXG4gICAgICogalF1ZXJ5KHdpbmRvdykub24oJ3BvcHN0YXRlJywgZGVib3VuY2VkLmNhbmNlbCk7XG4gICAgICovXG4gICAgZnVuY3Rpb24gZGVib3VuY2UoZnVuYywgd2FpdCwgb3B0aW9ucykge1xuICAgICAgdmFyIGxhc3RBcmdzLFxuICAgICAgICAgIGxhc3RUaGlzLFxuICAgICAgICAgIG1heFdhaXQsXG4gICAgICAgICAgcmVzdWx0LFxuICAgICAgICAgIHRpbWVySWQsXG4gICAgICAgICAgbGFzdENhbGxUaW1lLFxuICAgICAgICAgIGxhc3RJbnZva2VUaW1lID0gMCxcbiAgICAgICAgICBsZWFkaW5nID0gZmFsc2UsXG4gICAgICAgICAgbWF4aW5nID0gZmFsc2UsXG4gICAgICAgICAgdHJhaWxpbmcgPSB0cnVlO1xuXG4gICAgICBpZiAodHlwZW9mIGZ1bmMgIT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7XG4gICAgICB9XG4gICAgICB3YWl0ID0gdG9OdW1iZXIod2FpdCkgfHwgMDtcbiAgICAgIGlmIChpc09iamVjdChvcHRpb25zKSkge1xuICAgICAgICBsZWFkaW5nID0gISFvcHRpb25zLmxlYWRpbmc7XG4gICAgICAgIG1heGluZyA9ICdtYXhXYWl0JyBpbiBvcHRpb25zO1xuICAgICAgICBtYXhXYWl0ID0gbWF4aW5nID8gbmF0aXZlTWF4KHRvTnVtYmVyKG9wdGlvbnMubWF4V2FpdCkgfHwgMCwgd2FpdCkgOiBtYXhXYWl0O1xuICAgICAgICB0cmFpbGluZyA9ICd0cmFpbGluZycgaW4gb3B0aW9ucyA/ICEhb3B0aW9ucy50cmFpbGluZyA6IHRyYWlsaW5nO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBpbnZva2VGdW5jKHRpbWUpIHtcbiAgICAgICAgdmFyIGFyZ3MgPSBsYXN0QXJncyxcbiAgICAgICAgICAgIHRoaXNBcmcgPSBsYXN0VGhpcztcblxuICAgICAgICBsYXN0QXJncyA9IGxhc3RUaGlzID0gdW5kZWZpbmVkO1xuICAgICAgICBsYXN0SW52b2tlVGltZSA9IHRpbWU7XG4gICAgICAgIHJlc3VsdCA9IGZ1bmMuYXBwbHkodGhpc0FyZywgYXJncyk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGxlYWRpbmdFZGdlKHRpbWUpIHtcbiAgICAgICAgLy8gUmVzZXQgYW55IGBtYXhXYWl0YCB0aW1lci5cbiAgICAgICAgbGFzdEludm9rZVRpbWUgPSB0aW1lO1xuICAgICAgICAvLyBTdGFydCB0aGUgdGltZXIgZm9yIHRoZSB0cmFpbGluZyBlZGdlLlxuICAgICAgICB0aW1lcklkID0gc2V0VGltZW91dCh0aW1lckV4cGlyZWQsIHdhaXQpO1xuICAgICAgICAvLyBJbnZva2UgdGhlIGxlYWRpbmcgZWRnZS5cbiAgICAgICAgcmV0dXJuIGxlYWRpbmcgPyBpbnZva2VGdW5jKHRpbWUpIDogcmVzdWx0O1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiByZW1haW5pbmdXYWl0KHRpbWUpIHtcbiAgICAgICAgdmFyIHRpbWVTaW5jZUxhc3RDYWxsID0gdGltZSAtIGxhc3RDYWxsVGltZSxcbiAgICAgICAgICAgIHRpbWVTaW5jZUxhc3RJbnZva2UgPSB0aW1lIC0gbGFzdEludm9rZVRpbWUsXG4gICAgICAgICAgICB0aW1lV2FpdGluZyA9IHdhaXQgLSB0aW1lU2luY2VMYXN0Q2FsbDtcblxuICAgICAgICByZXR1cm4gbWF4aW5nXG4gICAgICAgICAgPyBuYXRpdmVNaW4odGltZVdhaXRpbmcsIG1heFdhaXQgLSB0aW1lU2luY2VMYXN0SW52b2tlKVxuICAgICAgICAgIDogdGltZVdhaXRpbmc7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIHNob3VsZEludm9rZSh0aW1lKSB7XG4gICAgICAgIHZhciB0aW1lU2luY2VMYXN0Q2FsbCA9IHRpbWUgLSBsYXN0Q2FsbFRpbWUsXG4gICAgICAgICAgICB0aW1lU2luY2VMYXN0SW52b2tlID0gdGltZSAtIGxhc3RJbnZva2VUaW1lO1xuXG4gICAgICAgIC8vIEVpdGhlciB0aGlzIGlzIHRoZSBmaXJzdCBjYWxsLCBhY3Rpdml0eSBoYXMgc3RvcHBlZCBhbmQgd2UncmUgYXQgdGhlXG4gICAgICAgIC8vIHRyYWlsaW5nIGVkZ2UsIHRoZSBzeXN0ZW0gdGltZSBoYXMgZ29uZSBiYWNrd2FyZHMgYW5kIHdlJ3JlIHRyZWF0aW5nXG4gICAgICAgIC8vIGl0IGFzIHRoZSB0cmFpbGluZyBlZGdlLCBvciB3ZSd2ZSBoaXQgdGhlIGBtYXhXYWl0YCBsaW1pdC5cbiAgICAgICAgcmV0dXJuIChsYXN0Q2FsbFRpbWUgPT09IHVuZGVmaW5lZCB8fCAodGltZVNpbmNlTGFzdENhbGwgPj0gd2FpdCkgfHxcbiAgICAgICAgICAodGltZVNpbmNlTGFzdENhbGwgPCAwKSB8fCAobWF4aW5nICYmIHRpbWVTaW5jZUxhc3RJbnZva2UgPj0gbWF4V2FpdCkpO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiB0aW1lckV4cGlyZWQoKSB7XG4gICAgICAgIHZhciB0aW1lID0gbm93KCk7XG4gICAgICAgIGlmIChzaG91bGRJbnZva2UodGltZSkpIHtcbiAgICAgICAgICByZXR1cm4gdHJhaWxpbmdFZGdlKHRpbWUpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFJlc3RhcnQgdGhlIHRpbWVyLlxuICAgICAgICB0aW1lcklkID0gc2V0VGltZW91dCh0aW1lckV4cGlyZWQsIHJlbWFpbmluZ1dhaXQodGltZSkpO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiB0cmFpbGluZ0VkZ2UodGltZSkge1xuICAgICAgICB0aW1lcklkID0gdW5kZWZpbmVkO1xuXG4gICAgICAgIC8vIE9ubHkgaW52b2tlIGlmIHdlIGhhdmUgYGxhc3RBcmdzYCB3aGljaCBtZWFucyBgZnVuY2AgaGFzIGJlZW5cbiAgICAgICAgLy8gZGVib3VuY2VkIGF0IGxlYXN0IG9uY2UuXG4gICAgICAgIGlmICh0cmFpbGluZyAmJiBsYXN0QXJncykge1xuICAgICAgICAgIHJldHVybiBpbnZva2VGdW5jKHRpbWUpO1xuICAgICAgICB9XG4gICAgICAgIGxhc3RBcmdzID0gbGFzdFRoaXMgPSB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGNhbmNlbCgpIHtcbiAgICAgICAgaWYgKHRpbWVySWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lcklkKTtcbiAgICAgICAgfVxuICAgICAgICBsYXN0SW52b2tlVGltZSA9IDA7XG4gICAgICAgIGxhc3RBcmdzID0gbGFzdENhbGxUaW1lID0gbGFzdFRoaXMgPSB0aW1lcklkID0gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBmbHVzaCgpIHtcbiAgICAgICAgcmV0dXJuIHRpbWVySWQgPT09IHVuZGVmaW5lZCA/IHJlc3VsdCA6IHRyYWlsaW5nRWRnZShub3coKSk7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGRlYm91bmNlZCgpIHtcbiAgICAgICAgdmFyIHRpbWUgPSBub3coKSxcbiAgICAgICAgICAgIGlzSW52b2tpbmcgPSBzaG91bGRJbnZva2UodGltZSk7XG5cbiAgICAgICAgbGFzdEFyZ3MgPSBhcmd1bWVudHM7XG4gICAgICAgIGxhc3RUaGlzID0gdGhpcztcbiAgICAgICAgbGFzdENhbGxUaW1lID0gdGltZTtcblxuICAgICAgICBpZiAoaXNJbnZva2luZykge1xuICAgICAgICAgIGlmICh0aW1lcklkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBsZWFkaW5nRWRnZShsYXN0Q2FsbFRpbWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAobWF4aW5nKSB7XG4gICAgICAgICAgICAvLyBIYW5kbGUgaW52b2NhdGlvbnMgaW4gYSB0aWdodCBsb29wLlxuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVySWQpO1xuICAgICAgICAgICAgdGltZXJJZCA9IHNldFRpbWVvdXQodGltZXJFeHBpcmVkLCB3YWl0KTtcbiAgICAgICAgICAgIHJldHVybiBpbnZva2VGdW5jKGxhc3RDYWxsVGltZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aW1lcklkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aW1lcklkID0gc2V0VGltZW91dCh0aW1lckV4cGlyZWQsIHdhaXQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgICBkZWJvdW5jZWQuY2FuY2VsID0gY2FuY2VsO1xuICAgICAgZGVib3VuY2VkLmZsdXNoID0gZmx1c2g7XG4gICAgICByZXR1cm4gZGVib3VuY2VkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlZmVycyBpbnZva2luZyB0aGUgYGZ1bmNgIHVudGlsIHRoZSBjdXJyZW50IGNhbGwgc3RhY2sgaGFzIGNsZWFyZWQuIEFueVxuICAgICAqIGFkZGl0aW9uYWwgYXJndW1lbnRzIGFyZSBwcm92aWRlZCB0byBgZnVuY2Agd2hlbiBpdCdzIGludm9rZWQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBkZWZlci5cbiAgICAgKiBAcGFyYW0gey4uLip9IFthcmdzXSBUaGUgYXJndW1lbnRzIHRvIGludm9rZSBgZnVuY2Agd2l0aC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSB0aW1lciBpZC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5kZWZlcihmdW5jdGlvbih0ZXh0KSB7XG4gICAgICogICBjb25zb2xlLmxvZyh0ZXh0KTtcbiAgICAgKiB9LCAnZGVmZXJyZWQnKTtcbiAgICAgKiAvLyA9PiBMb2dzICdkZWZlcnJlZCcgYWZ0ZXIgb25lIG1pbGxpc2Vjb25kLlxuICAgICAqL1xuICAgIHZhciBkZWZlciA9IGJhc2VSZXN0KGZ1bmN0aW9uKGZ1bmMsIGFyZ3MpIHtcbiAgICAgIHJldHVybiBiYXNlRGVsYXkoZnVuYywgMSwgYXJncyk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBJbnZva2VzIGBmdW5jYCBhZnRlciBgd2FpdGAgbWlsbGlzZWNvbmRzLiBBbnkgYWRkaXRpb25hbCBhcmd1bWVudHMgYXJlXG4gICAgICogcHJvdmlkZWQgdG8gYGZ1bmNgIHdoZW4gaXQncyBpbnZva2VkLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gZGVsYXkuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHdhaXQgVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gZGVsYXkgaW52b2NhdGlvbi5cbiAgICAgKiBAcGFyYW0gey4uLip9IFthcmdzXSBUaGUgYXJndW1lbnRzIHRvIGludm9rZSBgZnVuY2Agd2l0aC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSB0aW1lciBpZC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5kZWxheShmdW5jdGlvbih0ZXh0KSB7XG4gICAgICogICBjb25zb2xlLmxvZyh0ZXh0KTtcbiAgICAgKiB9LCAxMDAwLCAnbGF0ZXInKTtcbiAgICAgKiAvLyA9PiBMb2dzICdsYXRlcicgYWZ0ZXIgb25lIHNlY29uZC5cbiAgICAgKi9cbiAgICB2YXIgZGVsYXkgPSBiYXNlUmVzdChmdW5jdGlvbihmdW5jLCB3YWl0LCBhcmdzKSB7XG4gICAgICByZXR1cm4gYmFzZURlbGF5KGZ1bmMsIHRvTnVtYmVyKHdhaXQpIHx8IDAsIGFyZ3MpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBgZnVuY2Agd2l0aCBhcmd1bWVudHMgcmV2ZXJzZWQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBmbGlwIGFyZ3VtZW50cyBmb3IuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZmxpcHBlZCBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGZsaXBwZWQgPSBfLmZsaXAoZnVuY3Rpb24oKSB7XG4gICAgICogICByZXR1cm4gXy50b0FycmF5KGFyZ3VtZW50cyk7XG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKiBmbGlwcGVkKCdhJywgJ2InLCAnYycsICdkJyk7XG4gICAgICogLy8gPT4gWydkJywgJ2MnLCAnYicsICdhJ11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmbGlwKGZ1bmMpIHtcbiAgICAgIHJldHVybiBjcmVhdGVXcmFwKGZ1bmMsIFdSQVBfRkxJUF9GTEFHKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBtZW1vaXplcyB0aGUgcmVzdWx0IG9mIGBmdW5jYC4gSWYgYHJlc29sdmVyYCBpc1xuICAgICAqIHByb3ZpZGVkLCBpdCBkZXRlcm1pbmVzIHRoZSBjYWNoZSBrZXkgZm9yIHN0b3JpbmcgdGhlIHJlc3VsdCBiYXNlZCBvbiB0aGVcbiAgICAgKiBhcmd1bWVudHMgcHJvdmlkZWQgdG8gdGhlIG1lbW9pemVkIGZ1bmN0aW9uLiBCeSBkZWZhdWx0LCB0aGUgZmlyc3QgYXJndW1lbnRcbiAgICAgKiBwcm92aWRlZCB0byB0aGUgbWVtb2l6ZWQgZnVuY3Rpb24gaXMgdXNlZCBhcyB0aGUgbWFwIGNhY2hlIGtleS4gVGhlIGBmdW5jYFxuICAgICAqIGlzIGludm9rZWQgd2l0aCB0aGUgYHRoaXNgIGJpbmRpbmcgb2YgdGhlIG1lbW9pemVkIGZ1bmN0aW9uLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoZSBjYWNoZSBpcyBleHBvc2VkIGFzIHRoZSBgY2FjaGVgIHByb3BlcnR5IG9uIHRoZSBtZW1vaXplZFxuICAgICAqIGZ1bmN0aW9uLiBJdHMgY3JlYXRpb24gbWF5IGJlIGN1c3RvbWl6ZWQgYnkgcmVwbGFjaW5nIHRoZSBgXy5tZW1vaXplLkNhY2hlYFxuICAgICAqIGNvbnN0cnVjdG9yIHdpdGggb25lIHdob3NlIGluc3RhbmNlcyBpbXBsZW1lbnQgdGhlXG4gICAgICogW2BNYXBgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1wcm9wZXJ0aWVzLW9mLXRoZS1tYXAtcHJvdG90eXBlLW9iamVjdClcbiAgICAgKiBtZXRob2QgaW50ZXJmYWNlIG9mIGBjbGVhcmAsIGBkZWxldGVgLCBgZ2V0YCwgYGhhc2AsIGFuZCBgc2V0YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGhhdmUgaXRzIG91dHB1dCBtZW1vaXplZC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcmVzb2x2ZXJdIFRoZSBmdW5jdGlvbiB0byByZXNvbHZlIHRoZSBjYWNoZSBrZXkuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgbWVtb2l6ZWQgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogMSwgJ2InOiAyIH07XG4gICAgICogdmFyIG90aGVyID0geyAnYyc6IDMsICdkJzogNCB9O1xuICAgICAqXG4gICAgICogdmFyIHZhbHVlcyA9IF8ubWVtb2l6ZShfLnZhbHVlcyk7XG4gICAgICogdmFsdWVzKG9iamVjdCk7XG4gICAgICogLy8gPT4gWzEsIDJdXG4gICAgICpcbiAgICAgKiB2YWx1ZXMob3RoZXIpO1xuICAgICAqIC8vID0+IFszLCA0XVxuICAgICAqXG4gICAgICogb2JqZWN0LmEgPSAyO1xuICAgICAqIHZhbHVlcyhvYmplY3QpO1xuICAgICAqIC8vID0+IFsxLCAyXVxuICAgICAqXG4gICAgICogLy8gTW9kaWZ5IHRoZSByZXN1bHQgY2FjaGUuXG4gICAgICogdmFsdWVzLmNhY2hlLnNldChvYmplY3QsIFsnYScsICdiJ10pO1xuICAgICAqIHZhbHVlcyhvYmplY3QpO1xuICAgICAqIC8vID0+IFsnYScsICdiJ11cbiAgICAgKlxuICAgICAqIC8vIFJlcGxhY2UgYF8ubWVtb2l6ZS5DYWNoZWAuXG4gICAgICogXy5tZW1vaXplLkNhY2hlID0gV2Vha01hcDtcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtZW1vaXplKGZ1bmMsIHJlc29sdmVyKSB7XG4gICAgICBpZiAodHlwZW9mIGZ1bmMgIT0gJ2Z1bmN0aW9uJyB8fCAocmVzb2x2ZXIgIT0gbnVsbCAmJiB0eXBlb2YgcmVzb2x2ZXIgIT0gJ2Z1bmN0aW9uJykpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICAgICAgfVxuICAgICAgdmFyIG1lbW9pemVkID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBhcmdzID0gYXJndW1lbnRzLFxuICAgICAgICAgICAga2V5ID0gcmVzb2x2ZXIgPyByZXNvbHZlci5hcHBseSh0aGlzLCBhcmdzKSA6IGFyZ3NbMF0sXG4gICAgICAgICAgICBjYWNoZSA9IG1lbW9pemVkLmNhY2hlO1xuXG4gICAgICAgIGlmIChjYWNoZS5oYXMoa2V5KSkge1xuICAgICAgICAgIHJldHVybiBjYWNoZS5nZXQoa2V5KTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICAgICAgbWVtb2l6ZWQuY2FjaGUgPSBjYWNoZS5zZXQoa2V5LCByZXN1bHQpIHx8IGNhY2hlO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfTtcbiAgICAgIG1lbW9pemVkLmNhY2hlID0gbmV3IChtZW1vaXplLkNhY2hlIHx8IE1hcENhY2hlKTtcbiAgICAgIHJldHVybiBtZW1vaXplZDtcbiAgICB9XG5cbiAgICAvLyBFeHBvc2UgYE1hcENhY2hlYC5cbiAgICBtZW1vaXplLkNhY2hlID0gTWFwQ2FjaGU7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBuZWdhdGVzIHRoZSByZXN1bHQgb2YgdGhlIHByZWRpY2F0ZSBgZnVuY2AuIFRoZVxuICAgICAqIGBmdW5jYCBwcmVkaWNhdGUgaXMgaW52b2tlZCB3aXRoIHRoZSBgdGhpc2AgYmluZGluZyBhbmQgYXJndW1lbnRzIG9mIHRoZVxuICAgICAqIGNyZWF0ZWQgZnVuY3Rpb24uXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIHByZWRpY2F0ZSB0byBuZWdhdGUuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgbmVnYXRlZCBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gaXNFdmVuKG4pIHtcbiAgICAgKiAgIHJldHVybiBuICUgMiA9PSAwO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIF8uZmlsdGVyKFsxLCAyLCAzLCA0LCA1LCA2XSwgXy5uZWdhdGUoaXNFdmVuKSk7XG4gICAgICogLy8gPT4gWzEsIDMsIDVdXG4gICAgICovXG4gICAgZnVuY3Rpb24gbmVnYXRlKHByZWRpY2F0ZSkge1xuICAgICAgaWYgKHR5cGVvZiBwcmVkaWNhdGUgIT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBhcmdzID0gYXJndW1lbnRzO1xuICAgICAgICBzd2l0Y2ggKGFyZ3MubGVuZ3RoKSB7XG4gICAgICAgICAgY2FzZSAwOiByZXR1cm4gIXByZWRpY2F0ZS5jYWxsKHRoaXMpO1xuICAgICAgICAgIGNhc2UgMTogcmV0dXJuICFwcmVkaWNhdGUuY2FsbCh0aGlzLCBhcmdzWzBdKTtcbiAgICAgICAgICBjYXNlIDI6IHJldHVybiAhcHJlZGljYXRlLmNhbGwodGhpcywgYXJnc1swXSwgYXJnc1sxXSk7XG4gICAgICAgICAgY2FzZSAzOiByZXR1cm4gIXByZWRpY2F0ZS5jYWxsKHRoaXMsIGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAhcHJlZGljYXRlLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpcyByZXN0cmljdGVkIHRvIGludm9raW5nIGBmdW5jYCBvbmNlLiBSZXBlYXQgY2FsbHNcbiAgICAgKiB0byB0aGUgZnVuY3Rpb24gcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgZmlyc3QgaW52b2NhdGlvbi4gVGhlIGBmdW5jYCBpc1xuICAgICAqIGludm9rZWQgd2l0aCB0aGUgYHRoaXNgIGJpbmRpbmcgYW5kIGFyZ3VtZW50cyBvZiB0aGUgY3JlYXRlZCBmdW5jdGlvbi5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHJlc3RyaWN0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHJlc3RyaWN0ZWQgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBpbml0aWFsaXplID0gXy5vbmNlKGNyZWF0ZUFwcGxpY2F0aW9uKTtcbiAgICAgKiBpbml0aWFsaXplKCk7XG4gICAgICogaW5pdGlhbGl6ZSgpO1xuICAgICAqIC8vID0+IGBjcmVhdGVBcHBsaWNhdGlvbmAgaXMgaW52b2tlZCBvbmNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gb25jZShmdW5jKSB7XG4gICAgICByZXR1cm4gYmVmb3JlKDIsIGZ1bmMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYGZ1bmNgIHdpdGggaXRzIGFyZ3VtZW50cyB0cmFuc2Zvcm1lZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHdyYXAuXG4gICAgICogQHBhcmFtIHsuLi4oRnVuY3Rpb258RnVuY3Rpb25bXSl9IFt0cmFuc2Zvcm1zPVtfLmlkZW50aXR5XV1cbiAgICAgKiAgVGhlIGFyZ3VtZW50IHRyYW5zZm9ybXMuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGRvdWJsZWQobikge1xuICAgICAqICAgcmV0dXJuIG4gKiAyO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIHNxdWFyZShuKSB7XG4gICAgICogICByZXR1cm4gbiAqIG47XG4gICAgICogfVxuICAgICAqXG4gICAgICogdmFyIGZ1bmMgPSBfLm92ZXJBcmdzKGZ1bmN0aW9uKHgsIHkpIHtcbiAgICAgKiAgIHJldHVybiBbeCwgeV07XG4gICAgICogfSwgW3NxdWFyZSwgZG91YmxlZF0pO1xuICAgICAqXG4gICAgICogZnVuYyg5LCAzKTtcbiAgICAgKiAvLyA9PiBbODEsIDZdXG4gICAgICpcbiAgICAgKiBmdW5jKDEwLCA1KTtcbiAgICAgKiAvLyA9PiBbMTAwLCAxMF1cbiAgICAgKi9cbiAgICB2YXIgb3ZlckFyZ3MgPSBjYXN0UmVzdChmdW5jdGlvbihmdW5jLCB0cmFuc2Zvcm1zKSB7XG4gICAgICB0cmFuc2Zvcm1zID0gKHRyYW5zZm9ybXMubGVuZ3RoID09IDEgJiYgaXNBcnJheSh0cmFuc2Zvcm1zWzBdKSlcbiAgICAgICAgPyBhcnJheU1hcCh0cmFuc2Zvcm1zWzBdLCBiYXNlVW5hcnkoZ2V0SXRlcmF0ZWUoKSkpXG4gICAgICAgIDogYXJyYXlNYXAoYmFzZUZsYXR0ZW4odHJhbnNmb3JtcywgMSksIGJhc2VVbmFyeShnZXRJdGVyYXRlZSgpKSk7XG5cbiAgICAgIHZhciBmdW5jc0xlbmd0aCA9IHRyYW5zZm9ybXMubGVuZ3RoO1xuICAgICAgcmV0dXJuIGJhc2VSZXN0KGZ1bmN0aW9uKGFyZ3MpIHtcbiAgICAgICAgdmFyIGluZGV4ID0gLTEsXG4gICAgICAgICAgICBsZW5ndGggPSBuYXRpdmVNaW4oYXJncy5sZW5ndGgsIGZ1bmNzTGVuZ3RoKTtcblxuICAgICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICAgIGFyZ3NbaW5kZXhdID0gdHJhbnNmb3Jtc1tpbmRleF0uY2FsbCh0aGlzLCBhcmdzW2luZGV4XSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFwcGx5KGZ1bmMsIHRoaXMsIGFyZ3MpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGBmdW5jYCB3aXRoIGBwYXJ0aWFsc2AgcHJlcGVuZGVkIHRvIHRoZVxuICAgICAqIGFyZ3VtZW50cyBpdCByZWNlaXZlcy4gVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5iaW5kYCBleGNlcHQgaXQgZG9lcyAqKm5vdCoqXG4gICAgICogYWx0ZXIgdGhlIGB0aGlzYCBiaW5kaW5nLlxuICAgICAqXG4gICAgICogVGhlIGBfLnBhcnRpYWwucGxhY2Vob2xkZXJgIHZhbHVlLCB3aGljaCBkZWZhdWx0cyB0byBgX2AgaW4gbW9ub2xpdGhpY1xuICAgICAqIGJ1aWxkcywgbWF5IGJlIHVzZWQgYXMgYSBwbGFjZWhvbGRlciBmb3IgcGFydGlhbGx5IGFwcGxpZWQgYXJndW1lbnRzLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGRvZXNuJ3Qgc2V0IHRoZSBcImxlbmd0aFwiIHByb3BlcnR5IG9mIHBhcnRpYWxseVxuICAgICAqIGFwcGxpZWQgZnVuY3Rpb25zLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMi4wXG4gICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcGFydGlhbGx5IGFwcGx5IGFyZ3VtZW50cyB0by5cbiAgICAgKiBAcGFyYW0gey4uLip9IFtwYXJ0aWFsc10gVGhlIGFyZ3VtZW50cyB0byBiZSBwYXJ0aWFsbHkgYXBwbGllZC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBwYXJ0aWFsbHkgYXBwbGllZCBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gZ3JlZXQoZ3JlZXRpbmcsIG5hbWUpIHtcbiAgICAgKiAgIHJldHVybiBncmVldGluZyArICcgJyArIG5hbWU7XG4gICAgICogfVxuICAgICAqXG4gICAgICogdmFyIHNheUhlbGxvVG8gPSBfLnBhcnRpYWwoZ3JlZXQsICdoZWxsbycpO1xuICAgICAqIHNheUhlbGxvVG8oJ2ZyZWQnKTtcbiAgICAgKiAvLyA9PiAnaGVsbG8gZnJlZCdcbiAgICAgKlxuICAgICAqIC8vIFBhcnRpYWxseSBhcHBsaWVkIHdpdGggcGxhY2Vob2xkZXJzLlxuICAgICAqIHZhciBncmVldEZyZWQgPSBfLnBhcnRpYWwoZ3JlZXQsIF8sICdmcmVkJyk7XG4gICAgICogZ3JlZXRGcmVkKCdoaScpO1xuICAgICAqIC8vID0+ICdoaSBmcmVkJ1xuICAgICAqL1xuICAgIHZhciBwYXJ0aWFsID0gYmFzZVJlc3QoZnVuY3Rpb24oZnVuYywgcGFydGlhbHMpIHtcbiAgICAgIHZhciBob2xkZXJzID0gcmVwbGFjZUhvbGRlcnMocGFydGlhbHMsIGdldEhvbGRlcihwYXJ0aWFsKSk7XG4gICAgICByZXR1cm4gY3JlYXRlV3JhcChmdW5jLCBXUkFQX1BBUlRJQUxfRkxBRywgdW5kZWZpbmVkLCBwYXJ0aWFscywgaG9sZGVycyk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnBhcnRpYWxgIGV4Y2VwdCB0aGF0IHBhcnRpYWxseSBhcHBsaWVkIGFyZ3VtZW50c1xuICAgICAqIGFyZSBhcHBlbmRlZCB0byB0aGUgYXJndW1lbnRzIGl0IHJlY2VpdmVzLlxuICAgICAqXG4gICAgICogVGhlIGBfLnBhcnRpYWxSaWdodC5wbGFjZWhvbGRlcmAgdmFsdWUsIHdoaWNoIGRlZmF1bHRzIHRvIGBfYCBpbiBtb25vbGl0aGljXG4gICAgICogYnVpbGRzLCBtYXkgYmUgdXNlZCBhcyBhIHBsYWNlaG9sZGVyIGZvciBwYXJ0aWFsbHkgYXBwbGllZCBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgZG9lc24ndCBzZXQgdGhlIFwibGVuZ3RoXCIgcHJvcGVydHkgb2YgcGFydGlhbGx5XG4gICAgICogYXBwbGllZCBmdW5jdGlvbnMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMS4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBwYXJ0aWFsbHkgYXBwbHkgYXJndW1lbnRzIHRvLlxuICAgICAqIEBwYXJhbSB7Li4uKn0gW3BhcnRpYWxzXSBUaGUgYXJndW1lbnRzIHRvIGJlIHBhcnRpYWxseSBhcHBsaWVkLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHBhcnRpYWxseSBhcHBsaWVkIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBncmVldChncmVldGluZywgbmFtZSkge1xuICAgICAqICAgcmV0dXJuIGdyZWV0aW5nICsgJyAnICsgbmFtZTtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiB2YXIgZ3JlZXRGcmVkID0gXy5wYXJ0aWFsUmlnaHQoZ3JlZXQsICdmcmVkJyk7XG4gICAgICogZ3JlZXRGcmVkKCdoaScpO1xuICAgICAqIC8vID0+ICdoaSBmcmVkJ1xuICAgICAqXG4gICAgICogLy8gUGFydGlhbGx5IGFwcGxpZWQgd2l0aCBwbGFjZWhvbGRlcnMuXG4gICAgICogdmFyIHNheUhlbGxvVG8gPSBfLnBhcnRpYWxSaWdodChncmVldCwgJ2hlbGxvJywgXyk7XG4gICAgICogc2F5SGVsbG9UbygnZnJlZCcpO1xuICAgICAqIC8vID0+ICdoZWxsbyBmcmVkJ1xuICAgICAqL1xuICAgIHZhciBwYXJ0aWFsUmlnaHQgPSBiYXNlUmVzdChmdW5jdGlvbihmdW5jLCBwYXJ0aWFscykge1xuICAgICAgdmFyIGhvbGRlcnMgPSByZXBsYWNlSG9sZGVycyhwYXJ0aWFscywgZ2V0SG9sZGVyKHBhcnRpYWxSaWdodCkpO1xuICAgICAgcmV0dXJuIGNyZWF0ZVdyYXAoZnVuYywgV1JBUF9QQVJUSUFMX1JJR0hUX0ZMQUcsIHVuZGVmaW5lZCwgcGFydGlhbHMsIGhvbGRlcnMpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBgZnVuY2Agd2l0aCBhcmd1bWVudHMgYXJyYW5nZWQgYWNjb3JkaW5nXG4gICAgICogdG8gdGhlIHNwZWNpZmllZCBgaW5kZXhlc2Agd2hlcmUgdGhlIGFyZ3VtZW50IHZhbHVlIGF0IHRoZSBmaXJzdCBpbmRleCBpc1xuICAgICAqIHByb3ZpZGVkIGFzIHRoZSBmaXJzdCBhcmd1bWVudCwgdGhlIGFyZ3VtZW50IHZhbHVlIGF0IHRoZSBzZWNvbmQgaW5kZXggaXNcbiAgICAgKiBwcm92aWRlZCBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50LCBhbmQgc28gb24uXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byByZWFycmFuZ2UgYXJndW1lbnRzIGZvci5cbiAgICAgKiBAcGFyYW0gey4uLihudW1iZXJ8bnVtYmVyW10pfSBpbmRleGVzIFRoZSBhcnJhbmdlZCBhcmd1bWVudCBpbmRleGVzLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgcmVhcmdlZCA9IF8ucmVhcmcoZnVuY3Rpb24oYSwgYiwgYykge1xuICAgICAqICAgcmV0dXJuIFthLCBiLCBjXTtcbiAgICAgKiB9LCBbMiwgMCwgMV0pO1xuICAgICAqXG4gICAgICogcmVhcmdlZCgnYicsICdjJywgJ2EnKVxuICAgICAqIC8vID0+IFsnYScsICdiJywgJ2MnXVxuICAgICAqL1xuICAgIHZhciByZWFyZyA9IGZsYXRSZXN0KGZ1bmN0aW9uKGZ1bmMsIGluZGV4ZXMpIHtcbiAgICAgIHJldHVybiBjcmVhdGVXcmFwKGZ1bmMsIFdSQVBfUkVBUkdfRkxBRywgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgaW5kZXhlcyk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGBmdW5jYCB3aXRoIHRoZSBgdGhpc2AgYmluZGluZyBvZiB0aGVcbiAgICAgKiBjcmVhdGVkIGZ1bmN0aW9uIGFuZCBhcmd1bWVudHMgZnJvbSBgc3RhcnRgIGFuZCBiZXlvbmQgcHJvdmlkZWQgYXNcbiAgICAgKiBhbiBhcnJheS5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBiYXNlZCBvbiB0aGVcbiAgICAgKiBbcmVzdCBwYXJhbWV0ZXJdKGh0dHBzOi8vbWRuLmlvL3Jlc3RfcGFyYW1ldGVycykuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBhcHBseSBhIHJlc3QgcGFyYW1ldGVyIHRvLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9ZnVuYy5sZW5ndGgtMV0gVGhlIHN0YXJ0IHBvc2l0aW9uIG9mIHRoZSByZXN0IHBhcmFtZXRlci5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHNheSA9IF8ucmVzdChmdW5jdGlvbih3aGF0LCBuYW1lcykge1xuICAgICAqICAgcmV0dXJuIHdoYXQgKyAnICcgKyBfLmluaXRpYWwobmFtZXMpLmpvaW4oJywgJykgK1xuICAgICAqICAgICAoXy5zaXplKG5hbWVzKSA+IDEgPyAnLCAmICcgOiAnJykgKyBfLmxhc3QobmFtZXMpO1xuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogc2F5KCdoZWxsbycsICdmcmVkJywgJ2Jhcm5leScsICdwZWJibGVzJyk7XG4gICAgICogLy8gPT4gJ2hlbGxvIGZyZWQsIGJhcm5leSwgJiBwZWJibGVzJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJlc3QoZnVuYywgc3RhcnQpIHtcbiAgICAgIGlmICh0eXBlb2YgZnVuYyAhPSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcbiAgICAgIH1cbiAgICAgIHN0YXJ0ID0gc3RhcnQgPT09IHVuZGVmaW5lZCA/IHN0YXJ0IDogdG9JbnRlZ2VyKHN0YXJ0KTtcbiAgICAgIHJldHVybiBiYXNlUmVzdChmdW5jLCBzdGFydCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBgZnVuY2Agd2l0aCB0aGUgYHRoaXNgIGJpbmRpbmcgb2YgdGhlXG4gICAgICogY3JlYXRlIGZ1bmN0aW9uIGFuZCBhbiBhcnJheSBvZiBhcmd1bWVudHMgbXVjaCBsaWtlXG4gICAgICogW2BGdW5jdGlvbiNhcHBseWBdKGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1mdW5jdGlvbi5wcm90b3R5cGUuYXBwbHkpLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGJhc2VkIG9uIHRoZVxuICAgICAqIFtzcHJlYWQgb3BlcmF0b3JdKGh0dHBzOi8vbWRuLmlvL3NwcmVhZF9vcGVyYXRvcikuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4yLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBzcHJlYWQgYXJndW1lbnRzIG92ZXIuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzdGFydD0wXSBUaGUgc3RhcnQgcG9zaXRpb24gb2YgdGhlIHNwcmVhZC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHNheSA9IF8uc3ByZWFkKGZ1bmN0aW9uKHdobywgd2hhdCkge1xuICAgICAqICAgcmV0dXJuIHdobyArICcgc2F5cyAnICsgd2hhdDtcbiAgICAgKiB9KTtcbiAgICAgKlxuICAgICAqIHNheShbJ2ZyZWQnLCAnaGVsbG8nXSk7XG4gICAgICogLy8gPT4gJ2ZyZWQgc2F5cyBoZWxsbydcbiAgICAgKlxuICAgICAqIHZhciBudW1iZXJzID0gUHJvbWlzZS5hbGwoW1xuICAgICAqICAgUHJvbWlzZS5yZXNvbHZlKDQwKSxcbiAgICAgKiAgIFByb21pc2UucmVzb2x2ZSgzNilcbiAgICAgKiBdKTtcbiAgICAgKlxuICAgICAqIG51bWJlcnMudGhlbihfLnNwcmVhZChmdW5jdGlvbih4LCB5KSB7XG4gICAgICogICByZXR1cm4geCArIHk7XG4gICAgICogfSkpO1xuICAgICAqIC8vID0+IGEgUHJvbWlzZSBvZiA3NlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNwcmVhZChmdW5jLCBzdGFydCkge1xuICAgICAgaWYgKHR5cGVvZiBmdW5jICE9ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICAgICAgfVxuICAgICAgc3RhcnQgPSBzdGFydCA9PSBudWxsID8gMCA6IG5hdGl2ZU1heCh0b0ludGVnZXIoc3RhcnQpLCAwKTtcbiAgICAgIHJldHVybiBiYXNlUmVzdChmdW5jdGlvbihhcmdzKSB7XG4gICAgICAgIHZhciBhcnJheSA9IGFyZ3Nbc3RhcnRdLFxuICAgICAgICAgICAgb3RoZXJBcmdzID0gY2FzdFNsaWNlKGFyZ3MsIDAsIHN0YXJ0KTtcblxuICAgICAgICBpZiAoYXJyYXkpIHtcbiAgICAgICAgICBhcnJheVB1c2gob3RoZXJBcmdzLCBhcnJheSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFwcGx5KGZ1bmMsIHRoaXMsIG90aGVyQXJncyk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgdGhyb3R0bGVkIGZ1bmN0aW9uIHRoYXQgb25seSBpbnZva2VzIGBmdW5jYCBhdCBtb3N0IG9uY2UgcGVyXG4gICAgICogZXZlcnkgYHdhaXRgIG1pbGxpc2Vjb25kcy4gVGhlIHRocm90dGxlZCBmdW5jdGlvbiBjb21lcyB3aXRoIGEgYGNhbmNlbGBcbiAgICAgKiBtZXRob2QgdG8gY2FuY2VsIGRlbGF5ZWQgYGZ1bmNgIGludm9jYXRpb25zIGFuZCBhIGBmbHVzaGAgbWV0aG9kIHRvXG4gICAgICogaW1tZWRpYXRlbHkgaW52b2tlIHRoZW0uIFByb3ZpZGUgYG9wdGlvbnNgIHRvIGluZGljYXRlIHdoZXRoZXIgYGZ1bmNgXG4gICAgICogc2hvdWxkIGJlIGludm9rZWQgb24gdGhlIGxlYWRpbmcgYW5kL29yIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIGB3YWl0YFxuICAgICAqIHRpbWVvdXQuIFRoZSBgZnVuY2AgaXMgaW52b2tlZCB3aXRoIHRoZSBsYXN0IGFyZ3VtZW50cyBwcm92aWRlZCB0byB0aGVcbiAgICAgKiB0aHJvdHRsZWQgZnVuY3Rpb24uIFN1YnNlcXVlbnQgY2FsbHMgdG8gdGhlIHRocm90dGxlZCBmdW5jdGlvbiByZXR1cm4gdGhlXG4gICAgICogcmVzdWx0IG9mIHRoZSBsYXN0IGBmdW5jYCBpbnZvY2F0aW9uLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIElmIGBsZWFkaW5nYCBhbmQgYHRyYWlsaW5nYCBvcHRpb25zIGFyZSBgdHJ1ZWAsIGBmdW5jYCBpc1xuICAgICAqIGludm9rZWQgb24gdGhlIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIHRpbWVvdXQgb25seSBpZiB0aGUgdGhyb3R0bGVkIGZ1bmN0aW9uXG4gICAgICogaXMgaW52b2tlZCBtb3JlIHRoYW4gb25jZSBkdXJpbmcgdGhlIGB3YWl0YCB0aW1lb3V0LlxuICAgICAqXG4gICAgICogSWYgYHdhaXRgIGlzIGAwYCBhbmQgYGxlYWRpbmdgIGlzIGBmYWxzZWAsIGBmdW5jYCBpbnZvY2F0aW9uIGlzIGRlZmVycmVkXG4gICAgICogdW50aWwgdG8gdGhlIG5leHQgdGljaywgc2ltaWxhciB0byBgc2V0VGltZW91dGAgd2l0aCBhIHRpbWVvdXQgb2YgYDBgLlxuICAgICAqXG4gICAgICogU2VlIFtEYXZpZCBDb3JiYWNobydzIGFydGljbGVdKGh0dHBzOi8vY3NzLXRyaWNrcy5jb20vZGVib3VuY2luZy10aHJvdHRsaW5nLWV4cGxhaW5lZC1leGFtcGxlcy8pXG4gICAgICogZm9yIGRldGFpbHMgb3ZlciB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiBgXy50aHJvdHRsZWAgYW5kIGBfLmRlYm91bmNlYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHRocm90dGxlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbd2FpdD0wXSBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byB0aHJvdHRsZSBpbnZvY2F0aW9ucyB0by5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnM9e31dIFRoZSBvcHRpb25zIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmxlYWRpbmc9dHJ1ZV1cbiAgICAgKiAgU3BlY2lmeSBpbnZva2luZyBvbiB0aGUgbGVhZGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0LlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMudHJhaWxpbmc9dHJ1ZV1cbiAgICAgKiAgU3BlY2lmeSBpbnZva2luZyBvbiB0aGUgdHJhaWxpbmcgZWRnZSBvZiB0aGUgdGltZW91dC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyB0aHJvdHRsZWQgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIC8vIEF2b2lkIGV4Y2Vzc2l2ZWx5IHVwZGF0aW5nIHRoZSBwb3NpdGlvbiB3aGlsZSBzY3JvbGxpbmcuXG4gICAgICogalF1ZXJ5KHdpbmRvdykub24oJ3Njcm9sbCcsIF8udGhyb3R0bGUodXBkYXRlUG9zaXRpb24sIDEwMCkpO1xuICAgICAqXG4gICAgICogLy8gSW52b2tlIGByZW5ld1Rva2VuYCB3aGVuIHRoZSBjbGljayBldmVudCBpcyBmaXJlZCwgYnV0IG5vdCBtb3JlIHRoYW4gb25jZSBldmVyeSA1IG1pbnV0ZXMuXG4gICAgICogdmFyIHRocm90dGxlZCA9IF8udGhyb3R0bGUocmVuZXdUb2tlbiwgMzAwMDAwLCB7ICd0cmFpbGluZyc6IGZhbHNlIH0pO1xuICAgICAqIGpRdWVyeShlbGVtZW50KS5vbignY2xpY2snLCB0aHJvdHRsZWQpO1xuICAgICAqXG4gICAgICogLy8gQ2FuY2VsIHRoZSB0cmFpbGluZyB0aHJvdHRsZWQgaW52b2NhdGlvbi5cbiAgICAgKiBqUXVlcnkod2luZG93KS5vbigncG9wc3RhdGUnLCB0aHJvdHRsZWQuY2FuY2VsKTtcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0aHJvdHRsZShmdW5jLCB3YWl0LCBvcHRpb25zKSB7XG4gICAgICB2YXIgbGVhZGluZyA9IHRydWUsXG4gICAgICAgICAgdHJhaWxpbmcgPSB0cnVlO1xuXG4gICAgICBpZiAodHlwZW9mIGZ1bmMgIT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7XG4gICAgICB9XG4gICAgICBpZiAoaXNPYmplY3Qob3B0aW9ucykpIHtcbiAgICAgICAgbGVhZGluZyA9ICdsZWFkaW5nJyBpbiBvcHRpb25zID8gISFvcHRpb25zLmxlYWRpbmcgOiBsZWFkaW5nO1xuICAgICAgICB0cmFpbGluZyA9ICd0cmFpbGluZycgaW4gb3B0aW9ucyA/ICEhb3B0aW9ucy50cmFpbGluZyA6IHRyYWlsaW5nO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGRlYm91bmNlKGZ1bmMsIHdhaXQsIHtcbiAgICAgICAgJ2xlYWRpbmcnOiBsZWFkaW5nLFxuICAgICAgICAnbWF4V2FpdCc6IHdhaXQsXG4gICAgICAgICd0cmFpbGluZyc6IHRyYWlsaW5nXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBhY2NlcHRzIHVwIHRvIG9uZSBhcmd1bWVudCwgaWdub3JpbmcgYW55XG4gICAgICogYWRkaXRpb25hbCBhcmd1bWVudHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBjYXAgYXJndW1lbnRzIGZvci5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjYXBwZWQgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ubWFwKFsnNicsICc4JywgJzEwJ10sIF8udW5hcnkocGFyc2VJbnQpKTtcbiAgICAgKiAvLyA9PiBbNiwgOCwgMTBdXG4gICAgICovXG4gICAgZnVuY3Rpb24gdW5hcnkoZnVuYykge1xuICAgICAgcmV0dXJuIGFyeShmdW5jLCAxKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBwcm92aWRlcyBgdmFsdWVgIHRvIGB3cmFwcGVyYCBhcyBpdHMgZmlyc3RcbiAgICAgKiBhcmd1bWVudC4gQW55IGFkZGl0aW9uYWwgYXJndW1lbnRzIHByb3ZpZGVkIHRvIHRoZSBmdW5jdGlvbiBhcmUgYXBwZW5kZWRcbiAgICAgKiB0byB0aG9zZSBwcm92aWRlZCB0byB0aGUgYHdyYXBwZXJgLiBUaGUgd3JhcHBlciBpcyBpbnZva2VkIHdpdGggdGhlIGB0aGlzYFxuICAgICAqIGJpbmRpbmcgb2YgdGhlIGNyZWF0ZWQgZnVuY3Rpb24uXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byB3cmFwLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFt3cmFwcGVyPWlkZW50aXR5XSBUaGUgd3JhcHBlciBmdW5jdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHAgPSBfLndyYXAoXy5lc2NhcGUsIGZ1bmN0aW9uKGZ1bmMsIHRleHQpIHtcbiAgICAgKiAgIHJldHVybiAnPHA+JyArIGZ1bmModGV4dCkgKyAnPC9wPic7XG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKiBwKCdmcmVkLCBiYXJuZXksICYgcGViYmxlcycpO1xuICAgICAqIC8vID0+ICc8cD5mcmVkLCBiYXJuZXksICZhbXA7IHBlYmJsZXM8L3A+J1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHdyYXAodmFsdWUsIHdyYXBwZXIpIHtcbiAgICAgIHJldHVybiBwYXJ0aWFsKGNhc3RGdW5jdGlvbih3cmFwcGVyKSwgdmFsdWUpO1xuICAgIH1cblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIENhc3RzIGB2YWx1ZWAgYXMgYW4gYXJyYXkgaWYgaXQncyBub3Qgb25lLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuNC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBpbnNwZWN0LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgY2FzdCBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5jYXN0QXJyYXkoMSk7XG4gICAgICogLy8gPT4gWzFdXG4gICAgICpcbiAgICAgKiBfLmNhc3RBcnJheSh7ICdhJzogMSB9KTtcbiAgICAgKiAvLyA9PiBbeyAnYSc6IDEgfV1cbiAgICAgKlxuICAgICAqIF8uY2FzdEFycmF5KCdhYmMnKTtcbiAgICAgKiAvLyA9PiBbJ2FiYyddXG4gICAgICpcbiAgICAgKiBfLmNhc3RBcnJheShudWxsKTtcbiAgICAgKiAvLyA9PiBbbnVsbF1cbiAgICAgKlxuICAgICAqIF8uY2FzdEFycmF5KHVuZGVmaW5lZCk7XG4gICAgICogLy8gPT4gW3VuZGVmaW5lZF1cbiAgICAgKlxuICAgICAqIF8uY2FzdEFycmF5KCk7XG4gICAgICogLy8gPT4gW11cbiAgICAgKlxuICAgICAqIHZhciBhcnJheSA9IFsxLCAyLCAzXTtcbiAgICAgKiBjb25zb2xlLmxvZyhfLmNhc3RBcnJheShhcnJheSkgPT09IGFycmF5KTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2FzdEFycmF5KCkge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIHZhciB2YWx1ZSA9IGFyZ3VtZW50c1swXTtcbiAgICAgIHJldHVybiBpc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW3ZhbHVlXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgc2hhbGxvdyBjbG9uZSBvZiBgdmFsdWVgLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGxvb3NlbHkgYmFzZWQgb24gdGhlXG4gICAgICogW3N0cnVjdHVyZWQgY2xvbmUgYWxnb3JpdGhtXShodHRwczovL21kbi5pby9TdHJ1Y3R1cmVkX2Nsb25lX2FsZ29yaXRobSlcbiAgICAgKiBhbmQgc3VwcG9ydHMgY2xvbmluZyBhcnJheXMsIGFycmF5IGJ1ZmZlcnMsIGJvb2xlYW5zLCBkYXRlIG9iamVjdHMsIG1hcHMsXG4gICAgICogbnVtYmVycywgYE9iamVjdGAgb2JqZWN0cywgcmVnZXhlcywgc2V0cywgc3RyaW5ncywgc3ltYm9scywgYW5kIHR5cGVkXG4gICAgICogYXJyYXlzLiBUaGUgb3duIGVudW1lcmFibGUgcHJvcGVydGllcyBvZiBgYXJndW1lbnRzYCBvYmplY3RzIGFyZSBjbG9uZWRcbiAgICAgKiBhcyBwbGFpbiBvYmplY3RzLiBBbiBlbXB0eSBvYmplY3QgaXMgcmV0dXJuZWQgZm9yIHVuY2xvbmVhYmxlIHZhbHVlcyBzdWNoXG4gICAgICogYXMgZXJyb3Igb2JqZWN0cywgZnVuY3Rpb25zLCBET00gbm9kZXMsIGFuZCBXZWFrTWFwcy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2xvbmUuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGNsb25lZCB2YWx1ZS5cbiAgICAgKiBAc2VlIF8uY2xvbmVEZWVwXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gW3sgJ2EnOiAxIH0sIHsgJ2InOiAyIH1dO1xuICAgICAqXG4gICAgICogdmFyIHNoYWxsb3cgPSBfLmNsb25lKG9iamVjdHMpO1xuICAgICAqIGNvbnNvbGUubG9nKHNoYWxsb3dbMF0gPT09IG9iamVjdHNbMF0pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjbG9uZSh2YWx1ZSkge1xuICAgICAgcmV0dXJuIGJhc2VDbG9uZSh2YWx1ZSwgQ0xPTkVfU1lNQk9MU19GTEFHKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmNsb25lYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBjdXN0b21pemVyYCB3aGljaFxuICAgICAqIGlzIGludm9rZWQgdG8gcHJvZHVjZSB0aGUgY2xvbmVkIHZhbHVlLiBJZiBgY3VzdG9taXplcmAgcmV0dXJucyBgdW5kZWZpbmVkYCxcbiAgICAgKiBjbG9uaW5nIGlzIGhhbmRsZWQgYnkgdGhlIG1ldGhvZCBpbnN0ZWFkLiBUaGUgYGN1c3RvbWl6ZXJgIGlzIGludm9rZWQgd2l0aFxuICAgICAqIHVwIHRvIGZvdXIgYXJndW1lbnRzOyAodmFsdWUgWywgaW5kZXh8a2V5LCBvYmplY3QsIHN0YWNrXSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNsb25lLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNsb25pbmcuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGNsb25lZCB2YWx1ZS5cbiAgICAgKiBAc2VlIF8uY2xvbmVEZWVwV2l0aFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBjdXN0b21pemVyKHZhbHVlKSB7XG4gICAgICogICBpZiAoXy5pc0VsZW1lbnQodmFsdWUpKSB7XG4gICAgICogICAgIHJldHVybiB2YWx1ZS5jbG9uZU5vZGUoZmFsc2UpO1xuICAgICAqICAgfVxuICAgICAqIH1cbiAgICAgKlxuICAgICAqIHZhciBlbCA9IF8uY2xvbmVXaXRoKGRvY3VtZW50LmJvZHksIGN1c3RvbWl6ZXIpO1xuICAgICAqXG4gICAgICogY29uc29sZS5sb2coZWwgPT09IGRvY3VtZW50LmJvZHkpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICogY29uc29sZS5sb2coZWwubm9kZU5hbWUpO1xuICAgICAqIC8vID0+ICdCT0RZJ1xuICAgICAqIGNvbnNvbGUubG9nKGVsLmNoaWxkTm9kZXMubGVuZ3RoKTtcbiAgICAgKiAvLyA9PiAwXG4gICAgICovXG4gICAgZnVuY3Rpb24gY2xvbmVXaXRoKHZhbHVlLCBjdXN0b21pemVyKSB7XG4gICAgICBjdXN0b21pemVyID0gdHlwZW9mIGN1c3RvbWl6ZXIgPT0gJ2Z1bmN0aW9uJyA/IGN1c3RvbWl6ZXIgOiB1bmRlZmluZWQ7XG4gICAgICByZXR1cm4gYmFzZUNsb25lKHZhbHVlLCBDTE9ORV9TWU1CT0xTX0ZMQUcsIGN1c3RvbWl6ZXIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uY2xvbmVgIGV4Y2VwdCB0aGF0IGl0IHJlY3Vyc2l2ZWx5IGNsb25lcyBgdmFsdWVgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDEuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byByZWN1cnNpdmVseSBjbG9uZS5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZGVlcCBjbG9uZWQgdmFsdWUuXG4gICAgICogQHNlZSBfLmNsb25lXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gW3sgJ2EnOiAxIH0sIHsgJ2InOiAyIH1dO1xuICAgICAqXG4gICAgICogdmFyIGRlZXAgPSBfLmNsb25lRGVlcChvYmplY3RzKTtcbiAgICAgKiBjb25zb2xlLmxvZyhkZWVwWzBdID09PSBvYmplY3RzWzBdKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNsb25lRGVlcCh2YWx1ZSkge1xuICAgICAgcmV0dXJuIGJhc2VDbG9uZSh2YWx1ZSwgQ0xPTkVfREVFUF9GTEFHIHwgQ0xPTkVfU1lNQk9MU19GTEFHKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmNsb25lV2l0aGAgZXhjZXB0IHRoYXQgaXQgcmVjdXJzaXZlbHkgY2xvbmVzIGB2YWx1ZWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHJlY3Vyc2l2ZWx5IGNsb25lLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNsb25pbmcuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGRlZXAgY2xvbmVkIHZhbHVlLlxuICAgICAqIEBzZWUgXy5jbG9uZVdpdGhcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gY3VzdG9taXplcih2YWx1ZSkge1xuICAgICAqICAgaWYgKF8uaXNFbGVtZW50KHZhbHVlKSkge1xuICAgICAqICAgICByZXR1cm4gdmFsdWUuY2xvbmVOb2RlKHRydWUpO1xuICAgICAqICAgfVxuICAgICAqIH1cbiAgICAgKlxuICAgICAqIHZhciBlbCA9IF8uY2xvbmVEZWVwV2l0aChkb2N1bWVudC5ib2R5LCBjdXN0b21pemVyKTtcbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKGVsID09PSBkb2N1bWVudC5ib2R5KTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqIGNvbnNvbGUubG9nKGVsLm5vZGVOYW1lKTtcbiAgICAgKiAvLyA9PiAnQk9EWSdcbiAgICAgKiBjb25zb2xlLmxvZyhlbC5jaGlsZE5vZGVzLmxlbmd0aCk7XG4gICAgICogLy8gPT4gMjBcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjbG9uZURlZXBXaXRoKHZhbHVlLCBjdXN0b21pemVyKSB7XG4gICAgICBjdXN0b21pemVyID0gdHlwZW9mIGN1c3RvbWl6ZXIgPT0gJ2Z1bmN0aW9uJyA/IGN1c3RvbWl6ZXIgOiB1bmRlZmluZWQ7XG4gICAgICByZXR1cm4gYmFzZUNsb25lKHZhbHVlLCBDTE9ORV9ERUVQX0ZMQUcgfCBDTE9ORV9TWU1CT0xTX0ZMQUcsIGN1c3RvbWl6ZXIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgb2JqZWN0YCBjb25mb3JtcyB0byBgc291cmNlYCBieSBpbnZva2luZyB0aGUgcHJlZGljYXRlXG4gICAgICogcHJvcGVydGllcyBvZiBgc291cmNlYCB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIHByb3BlcnR5IHZhbHVlcyBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBlcXVpdmFsZW50IHRvIGBfLmNvbmZvcm1zYCB3aGVuIGBzb3VyY2VgIGlzXG4gICAgICogcGFydGlhbGx5IGFwcGxpZWQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4xNC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3Qgb2YgcHJvcGVydHkgcHJlZGljYXRlcyB0byBjb25mb3JtIHRvLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgb2JqZWN0YCBjb25mb3JtcywgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEsICdiJzogMiB9O1xuICAgICAqXG4gICAgICogXy5jb25mb3Jtc1RvKG9iamVjdCwgeyAnYic6IGZ1bmN0aW9uKG4pIHsgcmV0dXJuIG4gPiAxOyB9IH0pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uY29uZm9ybXNUbyhvYmplY3QsIHsgJ2InOiBmdW5jdGlvbihuKSB7IHJldHVybiBuID4gMjsgfSB9KTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNvbmZvcm1zVG8ob2JqZWN0LCBzb3VyY2UpIHtcbiAgICAgIHJldHVybiBzb3VyY2UgPT0gbnVsbCB8fCBiYXNlQ29uZm9ybXNUbyhvYmplY3QsIHNvdXJjZSwga2V5cyhzb3VyY2UpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQZXJmb3JtcyBhXG4gICAgICogW2BTYW1lVmFsdWVaZXJvYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtc2FtZXZhbHVlemVybylcbiAgICAgKiBjb21wYXJpc29uIGJldHdlZW4gdHdvIHZhbHVlcyB0byBkZXRlcm1pbmUgaWYgdGhleSBhcmUgZXF1aXZhbGVudC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0geyp9IG90aGVyIFRoZSBvdGhlciB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgdmFsdWVzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogMSB9O1xuICAgICAqIHZhciBvdGhlciA9IHsgJ2EnOiAxIH07XG4gICAgICpcbiAgICAgKiBfLmVxKG9iamVjdCwgb2JqZWN0KTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmVxKG9iamVjdCwgb3RoZXIpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmVxKCdhJywgJ2EnKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmVxKCdhJywgT2JqZWN0KCdhJykpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmVxKE5hTiwgTmFOKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICovXG4gICAgZnVuY3Rpb24gZXEodmFsdWUsIG90aGVyKSB7XG4gICAgICByZXR1cm4gdmFsdWUgPT09IG90aGVyIHx8ICh2YWx1ZSAhPT0gdmFsdWUgJiYgb3RoZXIgIT09IG90aGVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBncmVhdGVyIHRoYW4gYG90aGVyYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjkuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0geyp9IG90aGVyIFRoZSBvdGhlciB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGdyZWF0ZXIgdGhhbiBgb3RoZXJgLFxuICAgICAqICBlbHNlIGBmYWxzZWAuXG4gICAgICogQHNlZSBfLmx0XG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZ3QoMywgMSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5ndCgzLCAzKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5ndCgxLCAzKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIHZhciBndCA9IGNyZWF0ZVJlbGF0aW9uYWxPcGVyYXRpb24oYmFzZUd0KTtcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBgb3RoZXJgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuOS4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7Kn0gb3RoZXIgVGhlIG90aGVyIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvXG4gICAgICogIGBvdGhlcmAsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAc2VlIF8ubHRlXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZ3RlKDMsIDEpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uZ3RlKDMsIDMpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uZ3RlKDEsIDMpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgdmFyIGd0ZSA9IGNyZWF0ZVJlbGF0aW9uYWxPcGVyYXRpb24oZnVuY3Rpb24odmFsdWUsIG90aGVyKSB7XG4gICAgICByZXR1cm4gdmFsdWUgPj0gb3RoZXI7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBsaWtlbHkgYW4gYGFyZ3VtZW50c2Agb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBgYXJndW1lbnRzYCBvYmplY3QsXG4gICAgICogIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc0FyZ3VtZW50cyhmdW5jdGlvbigpIHsgcmV0dXJuIGFyZ3VtZW50czsgfSgpKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzQXJndW1lbnRzKFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICB2YXIgaXNBcmd1bWVudHMgPSBiYXNlSXNBcmd1bWVudHMoZnVuY3Rpb24oKSB7IHJldHVybiBhcmd1bWVudHM7IH0oKSkgPyBiYXNlSXNBcmd1bWVudHMgOiBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwgJ2NhbGxlZScpICYmXG4gICAgICAgICFwcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHZhbHVlLCAnY2FsbGVlJyk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYW4gYEFycmF5YCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIGFycmF5LCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNBcnJheShbMSwgMiwgM10pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNBcnJheShkb2N1bWVudC5ib2R5LmNoaWxkcmVuKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pc0FycmF5KCdhYmMnKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pc0FycmF5KF8ubm9vcCk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICB2YXIgaXNBcnJheSA9IEFycmF5LmlzQXJyYXk7XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGFuIGBBcnJheUJ1ZmZlcmAgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMy4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBhcnJheSBidWZmZXIsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc0FycmF5QnVmZmVyKG5ldyBBcnJheUJ1ZmZlcigyKSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0FycmF5QnVmZmVyKG5ldyBBcnJheSgyKSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICB2YXIgaXNBcnJheUJ1ZmZlciA9IG5vZGVJc0FycmF5QnVmZmVyID8gYmFzZVVuYXJ5KG5vZGVJc0FycmF5QnVmZmVyKSA6IGJhc2VJc0FycmF5QnVmZmVyO1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYXJyYXktbGlrZS4gQSB2YWx1ZSBpcyBjb25zaWRlcmVkIGFycmF5LWxpa2UgaWYgaXQnc1xuICAgICAqIG5vdCBhIGZ1bmN0aW9uIGFuZCBoYXMgYSBgdmFsdWUubGVuZ3RoYCB0aGF0J3MgYW4gaW50ZWdlciBncmVhdGVyIHRoYW4gb3JcbiAgICAgKiBlcXVhbCB0byBgMGAgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byBgTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVJgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhcnJheS1saWtlLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNBcnJheUxpa2UoWzEsIDIsIDNdKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzQXJyYXlMaWtlKGRvY3VtZW50LmJvZHkuY2hpbGRyZW4pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNBcnJheUxpa2UoJ2FiYycpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNBcnJheUxpa2UoXy5ub29wKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzQXJyYXlMaWtlKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdmFsdWUgIT0gbnVsbCAmJiBpc0xlbmd0aCh2YWx1ZS5sZW5ndGgpICYmICFpc0Z1bmN0aW9uKHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmlzQXJyYXlMaWtlYCBleGNlcHQgdGhhdCBpdCBhbHNvIGNoZWNrcyBpZiBgdmFsdWVgXG4gICAgICogaXMgYW4gb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBhcnJheS1saWtlIG9iamVjdCxcbiAgICAgKiAgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzQXJyYXlMaWtlT2JqZWN0KFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0FycmF5TGlrZU9iamVjdChkb2N1bWVudC5ib2R5LmNoaWxkcmVuKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzQXJyYXlMaWtlT2JqZWN0KCdhYmMnKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pc0FycmF5TGlrZU9iamVjdChfLm5vb3ApO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNBcnJheUxpa2VPYmplY3QodmFsdWUpIHtcbiAgICAgIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmIGlzQXJyYXlMaWtlKHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYm9vbGVhbiBwcmltaXRpdmUgb3Igb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIGJvb2xlYW4sIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc0Jvb2xlYW4oZmFsc2UpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNCb29sZWFuKG51bGwpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNCb29sZWFuKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdmFsdWUgPT09IHRydWUgfHwgdmFsdWUgPT09IGZhbHNlIHx8XG4gICAgICAgIChpc09iamVjdExpa2UodmFsdWUpICYmIGJhc2VHZXRUYWcodmFsdWUpID09IGJvb2xUYWcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgYnVmZmVyLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMy4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIGJ1ZmZlciwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzQnVmZmVyKG5ldyBCdWZmZXIoMikpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNCdWZmZXIobmV3IFVpbnQ4QXJyYXkoMikpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgdmFyIGlzQnVmZmVyID0gbmF0aXZlSXNCdWZmZXIgfHwgc3R1YkZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBEYXRlYCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgZGF0ZSBvYmplY3QsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc0RhdGUobmV3IERhdGUpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNEYXRlKCdNb24gQXByaWwgMjMgMjAxMicpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgdmFyIGlzRGF0ZSA9IG5vZGVJc0RhdGUgPyBiYXNlVW5hcnkobm9kZUlzRGF0ZSkgOiBiYXNlSXNEYXRlO1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgbGlrZWx5IGEgRE9NIGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgRE9NIGVsZW1lbnQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc0VsZW1lbnQoZG9jdW1lbnQuYm9keSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0VsZW1lbnQoJzxib2R5PicpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNFbGVtZW50KHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSAmJiB2YWx1ZS5ub2RlVHlwZSA9PT0gMSAmJiAhaXNQbGFpbk9iamVjdCh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYW4gZW1wdHkgb2JqZWN0LCBjb2xsZWN0aW9uLCBtYXAsIG9yIHNldC5cbiAgICAgKlxuICAgICAqIE9iamVjdHMgYXJlIGNvbnNpZGVyZWQgZW1wdHkgaWYgdGhleSBoYXZlIG5vIG93biBlbnVtZXJhYmxlIHN0cmluZyBrZXllZFxuICAgICAqIHByb3BlcnRpZXMuXG4gICAgICpcbiAgICAgKiBBcnJheS1saWtlIHZhbHVlcyBzdWNoIGFzIGBhcmd1bWVudHNgIG9iamVjdHMsIGFycmF5cywgYnVmZmVycywgc3RyaW5ncywgb3JcbiAgICAgKiBqUXVlcnktbGlrZSBjb2xsZWN0aW9ucyBhcmUgY29uc2lkZXJlZCBlbXB0eSBpZiB0aGV5IGhhdmUgYSBgbGVuZ3RoYCBvZiBgMGAuXG4gICAgICogU2ltaWxhcmx5LCBtYXBzIGFuZCBzZXRzIGFyZSBjb25zaWRlcmVkIGVtcHR5IGlmIHRoZXkgaGF2ZSBhIGBzaXplYCBvZiBgMGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGVtcHR5LCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNFbXB0eShudWxsKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzRW1wdHkodHJ1ZSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc0VtcHR5KDEpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNFbXB0eShbMSwgMiwgM10pO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmlzRW1wdHkoeyAnYSc6IDEgfSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc0VtcHR5KHZhbHVlKSB7XG4gICAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChpc0FycmF5TGlrZSh2YWx1ZSkgJiZcbiAgICAgICAgICAoaXNBcnJheSh2YWx1ZSkgfHwgdHlwZW9mIHZhbHVlID09ICdzdHJpbmcnIHx8IHR5cGVvZiB2YWx1ZS5zcGxpY2UgPT0gJ2Z1bmN0aW9uJyB8fFxuICAgICAgICAgICAgaXNCdWZmZXIodmFsdWUpIHx8IGlzVHlwZWRBcnJheSh2YWx1ZSkgfHwgaXNBcmd1bWVudHModmFsdWUpKSkge1xuICAgICAgICByZXR1cm4gIXZhbHVlLmxlbmd0aDtcbiAgICAgIH1cbiAgICAgIHZhciB0YWcgPSBnZXRUYWcodmFsdWUpO1xuICAgICAgaWYgKHRhZyA9PSBtYXBUYWcgfHwgdGFnID09IHNldFRhZykge1xuICAgICAgICByZXR1cm4gIXZhbHVlLnNpemU7XG4gICAgICB9XG4gICAgICBpZiAoaXNQcm90b3R5cGUodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiAhYmFzZUtleXModmFsdWUpLmxlbmd0aDtcbiAgICAgIH1cbiAgICAgIGZvciAodmFyIGtleSBpbiB2YWx1ZSkge1xuICAgICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwga2V5KSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGVyZm9ybXMgYSBkZWVwIGNvbXBhcmlzb24gYmV0d2VlbiB0d28gdmFsdWVzIHRvIGRldGVybWluZSBpZiB0aGV5IGFyZVxuICAgICAqIGVxdWl2YWxlbnQuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2Qgc3VwcG9ydHMgY29tcGFyaW5nIGFycmF5cywgYXJyYXkgYnVmZmVycywgYm9vbGVhbnMsXG4gICAgICogZGF0ZSBvYmplY3RzLCBlcnJvciBvYmplY3RzLCBtYXBzLCBudW1iZXJzLCBgT2JqZWN0YCBvYmplY3RzLCByZWdleGVzLFxuICAgICAqIHNldHMsIHN0cmluZ3MsIHN5bWJvbHMsIGFuZCB0eXBlZCBhcnJheXMuIGBPYmplY3RgIG9iamVjdHMgYXJlIGNvbXBhcmVkXG4gICAgICogYnkgdGhlaXIgb3duLCBub3QgaW5oZXJpdGVkLCBlbnVtZXJhYmxlIHByb3BlcnRpZXMuIEZ1bmN0aW9ucyBhbmQgRE9NXG4gICAgICogbm9kZXMgYXJlIGNvbXBhcmVkIGJ5IHN0cmljdCBlcXVhbGl0eSwgaS5lLiBgPT09YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0geyp9IG90aGVyIFRoZSBvdGhlciB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgdmFsdWVzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogMSB9O1xuICAgICAqIHZhciBvdGhlciA9IHsgJ2EnOiAxIH07XG4gICAgICpcbiAgICAgKiBfLmlzRXF1YWwob2JqZWN0LCBvdGhlcik7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogb2JqZWN0ID09PSBvdGhlcjtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzRXF1YWwodmFsdWUsIG90aGVyKSB7XG4gICAgICByZXR1cm4gYmFzZUlzRXF1YWwodmFsdWUsIG90aGVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmlzRXF1YWxgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGN1c3RvbWl6ZXJgIHdoaWNoXG4gICAgICogaXMgaW52b2tlZCB0byBjb21wYXJlIHZhbHVlcy4gSWYgYGN1c3RvbWl6ZXJgIHJldHVybnMgYHVuZGVmaW5lZGAsIGNvbXBhcmlzb25zXG4gICAgICogYXJlIGhhbmRsZWQgYnkgdGhlIG1ldGhvZCBpbnN0ZWFkLiBUaGUgYGN1c3RvbWl6ZXJgIGlzIGludm9rZWQgd2l0aCB1cCB0b1xuICAgICAqIHNpeCBhcmd1bWVudHM6IChvYmpWYWx1ZSwgb3RoVmFsdWUgWywgaW5kZXh8a2V5LCBvYmplY3QsIG90aGVyLCBzdGFja10pLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEBwYXJhbSB7Kn0gb3RoZXIgVGhlIG90aGVyIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29tcGFyaXNvbnMuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSB2YWx1ZXMgYXJlIGVxdWl2YWxlbnQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gaXNHcmVldGluZyh2YWx1ZSkge1xuICAgICAqICAgcmV0dXJuIC9eaCg/Oml8ZWxsbykkLy50ZXN0KHZhbHVlKTtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBjdXN0b21pemVyKG9ialZhbHVlLCBvdGhWYWx1ZSkge1xuICAgICAqICAgaWYgKGlzR3JlZXRpbmcob2JqVmFsdWUpICYmIGlzR3JlZXRpbmcob3RoVmFsdWUpKSB7XG4gICAgICogICAgIHJldHVybiB0cnVlO1xuICAgICAqICAgfVxuICAgICAqIH1cbiAgICAgKlxuICAgICAqIHZhciBhcnJheSA9IFsnaGVsbG8nLCAnZ29vZGJ5ZSddO1xuICAgICAqIHZhciBvdGhlciA9IFsnaGknLCAnZ29vZGJ5ZSddO1xuICAgICAqXG4gICAgICogXy5pc0VxdWFsV2l0aChhcnJheSwgb3RoZXIsIGN1c3RvbWl6ZXIpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc0VxdWFsV2l0aCh2YWx1ZSwgb3RoZXIsIGN1c3RvbWl6ZXIpIHtcbiAgICAgIGN1c3RvbWl6ZXIgPSB0eXBlb2YgY3VzdG9taXplciA9PSAnZnVuY3Rpb24nID8gY3VzdG9taXplciA6IHVuZGVmaW5lZDtcbiAgICAgIHZhciByZXN1bHQgPSBjdXN0b21pemVyID8gY3VzdG9taXplcih2YWx1ZSwgb3RoZXIpIDogdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuIHJlc3VsdCA9PT0gdW5kZWZpbmVkID8gYmFzZUlzRXF1YWwodmFsdWUsIG90aGVyLCB1bmRlZmluZWQsIGN1c3RvbWl6ZXIpIDogISFyZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYW4gYEVycm9yYCwgYEV2YWxFcnJvcmAsIGBSYW5nZUVycm9yYCwgYFJlZmVyZW5jZUVycm9yYCxcbiAgICAgKiBgU3ludGF4RXJyb3JgLCBgVHlwZUVycm9yYCwgb3IgYFVSSUVycm9yYCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIGVycm9yIG9iamVjdCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzRXJyb3IobmV3IEVycm9yKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzRXJyb3IoRXJyb3IpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNFcnJvcih2YWx1ZSkge1xuICAgICAgaWYgKCFpc09iamVjdExpa2UodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHZhciB0YWcgPSBiYXNlR2V0VGFnKHZhbHVlKTtcbiAgICAgIHJldHVybiB0YWcgPT0gZXJyb3JUYWcgfHwgdGFnID09IGRvbUV4Y1RhZyB8fFxuICAgICAgICAodHlwZW9mIHZhbHVlLm1lc3NhZ2UgPT0gJ3N0cmluZycgJiYgdHlwZW9mIHZhbHVlLm5hbWUgPT0gJ3N0cmluZycgJiYgIWlzUGxhaW5PYmplY3QodmFsdWUpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIGZpbml0ZSBwcmltaXRpdmUgbnVtYmVyLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGJhc2VkIG9uXG4gICAgICogW2BOdW1iZXIuaXNGaW5pdGVgXShodHRwczovL21kbi5pby9OdW1iZXIvaXNGaW5pdGUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIGZpbml0ZSBudW1iZXIsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc0Zpbml0ZSgzKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzRmluaXRlKE51bWJlci5NSU5fVkFMVUUpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNGaW5pdGUoSW5maW5pdHkpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmlzRmluaXRlKCczJyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc0Zpbml0ZSh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAnbnVtYmVyJyAmJiBuYXRpdmVJc0Zpbml0ZSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBGdW5jdGlvbmAgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIGZ1bmN0aW9uLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNGdW5jdGlvbihfKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzRnVuY3Rpb24oL2FiYy8pO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNGdW5jdGlvbih2YWx1ZSkge1xuICAgICAgaWYgKCFpc09iamVjdCh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgLy8gVGhlIHVzZSBvZiBgT2JqZWN0I3RvU3RyaW5nYCBhdm9pZHMgaXNzdWVzIHdpdGggdGhlIGB0eXBlb2ZgIG9wZXJhdG9yXG4gICAgICAvLyBpbiBTYWZhcmkgOSB3aGljaCByZXR1cm5zICdvYmplY3QnIGZvciB0eXBlZCBhcnJheXMgYW5kIG90aGVyIGNvbnN0cnVjdG9ycy5cbiAgICAgIHZhciB0YWcgPSBiYXNlR2V0VGFnKHZhbHVlKTtcbiAgICAgIHJldHVybiB0YWcgPT0gZnVuY1RhZyB8fCB0YWcgPT0gZ2VuVGFnIHx8IHRhZyA9PSBhc3luY1RhZyB8fCB0YWcgPT0gcHJveHlUYWc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYW4gaW50ZWdlci5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBiYXNlZCBvblxuICAgICAqIFtgTnVtYmVyLmlzSW50ZWdlcmBdKGh0dHBzOi8vbWRuLmlvL051bWJlci9pc0ludGVnZXIpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBpbnRlZ2VyLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNJbnRlZ2VyKDMpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNJbnRlZ2VyKE51bWJlci5NSU5fVkFMVUUpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmlzSW50ZWdlcihJbmZpbml0eSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaXNJbnRlZ2VyKCczJyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc0ludGVnZXIodmFsdWUpIHtcbiAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicgJiYgdmFsdWUgPT0gdG9JbnRlZ2VyKHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIHZhbGlkIGFycmF5LWxpa2UgbGVuZ3RoLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGxvb3NlbHkgYmFzZWQgb25cbiAgICAgKiBbYFRvTGVuZ3RoYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtdG9sZW5ndGgpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHZhbGlkIGxlbmd0aCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzTGVuZ3RoKDMpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNMZW5ndGgoTnVtYmVyLk1JTl9WQUxVRSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaXNMZW5ndGgoSW5maW5pdHkpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmlzTGVuZ3RoKCczJyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc0xlbmd0aCh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAnbnVtYmVyJyAmJlxuICAgICAgICB2YWx1ZSA+IC0xICYmIHZhbHVlICUgMSA9PSAwICYmIHZhbHVlIDw9IE1BWF9TQUZFX0lOVEVHRVI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgdGhlXG4gICAgICogW2xhbmd1YWdlIHR5cGVdKGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1lY21hc2NyaXB0LWxhbmd1YWdlLXR5cGVzKVxuICAgICAqIG9mIGBPYmplY3RgLiAoZS5nLiBhcnJheXMsIGZ1bmN0aW9ucywgb2JqZWN0cywgcmVnZXhlcywgYG5ldyBOdW1iZXIoMClgLCBhbmQgYG5ldyBTdHJpbmcoJycpYClcbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gb2JqZWN0LCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNPYmplY3Qoe30pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNPYmplY3QoWzEsIDIsIDNdKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzT2JqZWN0KF8ubm9vcCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc09iamVjdChudWxsKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzT2JqZWN0KHZhbHVlKSB7XG4gICAgICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgICAgIHJldHVybiB2YWx1ZSAhPSBudWxsICYmICh0eXBlID09ICdvYmplY3QnIHx8IHR5cGUgPT0gJ2Z1bmN0aW9uJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UuIEEgdmFsdWUgaXMgb2JqZWN0LWxpa2UgaWYgaXQncyBub3QgYG51bGxgXG4gICAgICogYW5kIGhhcyBhIGB0eXBlb2ZgIHJlc3VsdCBvZiBcIm9iamVjdFwiLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBvYmplY3QtbGlrZSwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzT2JqZWN0TGlrZSh7fSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc09iamVjdExpa2UoWzEsIDIsIDNdKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzT2JqZWN0TGlrZShfLm5vb3ApO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmlzT2JqZWN0TGlrZShudWxsKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzT2JqZWN0TGlrZSh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlICE9IG51bGwgJiYgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgTWFwYCBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4zLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgbWFwLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNNYXAobmV3IE1hcCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc01hcChuZXcgV2Vha01hcCk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICB2YXIgaXNNYXAgPSBub2RlSXNNYXAgPyBiYXNlVW5hcnkobm9kZUlzTWFwKSA6IGJhc2VJc01hcDtcblxuICAgIC8qKlxuICAgICAqIFBlcmZvcm1zIGEgcGFydGlhbCBkZWVwIGNvbXBhcmlzb24gYmV0d2VlbiBgb2JqZWN0YCBhbmQgYHNvdXJjZWAgdG9cbiAgICAgKiBkZXRlcm1pbmUgaWYgYG9iamVjdGAgY29udGFpbnMgZXF1aXZhbGVudCBwcm9wZXJ0eSB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgZXF1aXZhbGVudCB0byBgXy5tYXRjaGVzYCB3aGVuIGBzb3VyY2VgIGlzXG4gICAgICogcGFydGlhbGx5IGFwcGxpZWQuXG4gICAgICpcbiAgICAgKiBQYXJ0aWFsIGNvbXBhcmlzb25zIHdpbGwgbWF0Y2ggZW1wdHkgYXJyYXkgYW5kIGVtcHR5IG9iamVjdCBgc291cmNlYFxuICAgICAqIHZhbHVlcyBhZ2FpbnN0IGFueSBhcnJheSBvciBvYmplY3QgdmFsdWUsIHJlc3BlY3RpdmVseS4gU2VlIGBfLmlzRXF1YWxgXG4gICAgICogZm9yIGEgbGlzdCBvZiBzdXBwb3J0ZWQgdmFsdWUgY29tcGFyaXNvbnMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIG9iamVjdCBvZiBwcm9wZXJ0eSB2YWx1ZXMgdG8gbWF0Y2guXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBvYmplY3RgIGlzIGEgbWF0Y2gsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxLCAnYic6IDIgfTtcbiAgICAgKlxuICAgICAqIF8uaXNNYXRjaChvYmplY3QsIHsgJ2InOiAyIH0pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNNYXRjaChvYmplY3QsIHsgJ2InOiAxIH0pO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNNYXRjaChvYmplY3QsIHNvdXJjZSkge1xuICAgICAgcmV0dXJuIG9iamVjdCA9PT0gc291cmNlIHx8IGJhc2VJc01hdGNoKG9iamVjdCwgc291cmNlLCBnZXRNYXRjaERhdGEoc291cmNlKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5pc01hdGNoYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBjdXN0b21pemVyYCB3aGljaFxuICAgICAqIGlzIGludm9rZWQgdG8gY29tcGFyZSB2YWx1ZXMuIElmIGBjdXN0b21pemVyYCByZXR1cm5zIGB1bmRlZmluZWRgLCBjb21wYXJpc29uc1xuICAgICAqIGFyZSBoYW5kbGVkIGJ5IHRoZSBtZXRob2QgaW5zdGVhZC4gVGhlIGBjdXN0b21pemVyYCBpcyBpbnZva2VkIHdpdGggZml2ZVxuICAgICAqIGFyZ3VtZW50czogKG9ialZhbHVlLCBzcmNWYWx1ZSwgaW5kZXh8a2V5LCBvYmplY3QsIHNvdXJjZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIG9iamVjdCBvZiBwcm9wZXJ0eSB2YWx1ZXMgdG8gbWF0Y2guXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29tcGFyaXNvbnMuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBvYmplY3RgIGlzIGEgbWF0Y2gsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gaXNHcmVldGluZyh2YWx1ZSkge1xuICAgICAqICAgcmV0dXJuIC9eaCg/Oml8ZWxsbykkLy50ZXN0KHZhbHVlKTtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBjdXN0b21pemVyKG9ialZhbHVlLCBzcmNWYWx1ZSkge1xuICAgICAqICAgaWYgKGlzR3JlZXRpbmcob2JqVmFsdWUpICYmIGlzR3JlZXRpbmcoc3JjVmFsdWUpKSB7XG4gICAgICogICAgIHJldHVybiB0cnVlO1xuICAgICAqICAgfVxuICAgICAqIH1cbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdncmVldGluZyc6ICdoZWxsbycgfTtcbiAgICAgKiB2YXIgc291cmNlID0geyAnZ3JlZXRpbmcnOiAnaGknIH07XG4gICAgICpcbiAgICAgKiBfLmlzTWF0Y2hXaXRoKG9iamVjdCwgc291cmNlLCBjdXN0b21pemVyKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNNYXRjaFdpdGgob2JqZWN0LCBzb3VyY2UsIGN1c3RvbWl6ZXIpIHtcbiAgICAgIGN1c3RvbWl6ZXIgPSB0eXBlb2YgY3VzdG9taXplciA9PSAnZnVuY3Rpb24nID8gY3VzdG9taXplciA6IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiBiYXNlSXNNYXRjaChvYmplY3QsIHNvdXJjZSwgZ2V0TWF0Y2hEYXRhKHNvdXJjZSksIGN1c3RvbWl6ZXIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGBOYU5gLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGJhc2VkIG9uXG4gICAgICogW2BOdW1iZXIuaXNOYU5gXShodHRwczovL21kbi5pby9OdW1iZXIvaXNOYU4pIGFuZCBpcyBub3QgdGhlIHNhbWUgYXNcbiAgICAgKiBnbG9iYWwgW2Bpc05hTmBdKGh0dHBzOi8vbWRuLmlvL2lzTmFOKSB3aGljaCByZXR1cm5zIGB0cnVlYCBmb3JcbiAgICAgKiBgdW5kZWZpbmVkYCBhbmQgb3RoZXIgbm9uLW51bWJlciB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGBOYU5gLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNOYU4oTmFOKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzTmFOKG5ldyBOdW1iZXIoTmFOKSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogaXNOYU4odW5kZWZpbmVkKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzTmFOKHVuZGVmaW5lZCk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc05hTih2YWx1ZSkge1xuICAgICAgLy8gQW4gYE5hTmAgcHJpbWl0aXZlIGlzIHRoZSBvbmx5IHZhbHVlIHRoYXQgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi5cbiAgICAgIC8vIFBlcmZvcm0gdGhlIGB0b1N0cmluZ1RhZ2AgY2hlY2sgZmlyc3QgdG8gYXZvaWQgZXJyb3JzIHdpdGggc29tZVxuICAgICAgLy8gQWN0aXZlWCBvYmplY3RzIGluIElFLlxuICAgICAgcmV0dXJuIGlzTnVtYmVyKHZhbHVlKSAmJiB2YWx1ZSAhPSArdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBwcmlzdGluZSBuYXRpdmUgZnVuY3Rpb24uXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgY2FuJ3QgcmVsaWFibHkgZGV0ZWN0IG5hdGl2ZSBmdW5jdGlvbnMgaW4gdGhlIHByZXNlbmNlXG4gICAgICogb2YgdGhlIGNvcmUtanMgcGFja2FnZSBiZWNhdXNlIGNvcmUtanMgY2lyY3VtdmVudHMgdGhpcyBraW5kIG9mIGRldGVjdGlvbi5cbiAgICAgKiBEZXNwaXRlIG11bHRpcGxlIHJlcXVlc3RzLCB0aGUgY29yZS1qcyBtYWludGFpbmVyIGhhcyBtYWRlIGl0IGNsZWFyOiBhbnlcbiAgICAgKiBhdHRlbXB0IHRvIGZpeCB0aGUgZGV0ZWN0aW9uIHdpbGwgYmUgb2JzdHJ1Y3RlZC4gQXMgYSByZXN1bHQsIHdlJ3JlIGxlZnRcbiAgICAgKiB3aXRoIGxpdHRsZSBjaG9pY2UgYnV0IHRvIHRocm93IGFuIGVycm9yLiBVbmZvcnR1bmF0ZWx5LCB0aGlzIGFsc28gYWZmZWN0c1xuICAgICAqIHBhY2thZ2VzLCBsaWtlIFtiYWJlbC1wb2x5ZmlsbF0oaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvYmFiZWwtcG9seWZpbGwpLFxuICAgICAqIHdoaWNoIHJlbHkgb24gY29yZS1qcy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBuYXRpdmUgZnVuY3Rpb24sXG4gICAgICogIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc05hdGl2ZShBcnJheS5wcm90b3R5cGUucHVzaCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc05hdGl2ZShfKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzTmF0aXZlKHZhbHVlKSB7XG4gICAgICBpZiAoaXNNYXNrYWJsZSh2YWx1ZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKENPUkVfRVJST1JfVEVYVCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFzZUlzTmF0aXZlKHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBgbnVsbGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGBudWxsYCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzTnVsbChudWxsKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzTnVsbCh2b2lkIDApO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNOdWxsKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdmFsdWUgPT09IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYG51bGxgIG9yIGB1bmRlZmluZWRgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBudWxsaXNoLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNOaWwobnVsbCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc05pbCh2b2lkIDApO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNOaWwoTmFOKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzTmlsKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdmFsdWUgPT0gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYE51bWJlcmAgcHJpbWl0aXZlIG9yIG9iamVjdC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUbyBleGNsdWRlIGBJbmZpbml0eWAsIGAtSW5maW5pdHlgLCBhbmQgYE5hTmAsIHdoaWNoIGFyZVxuICAgICAqIGNsYXNzaWZpZWQgYXMgbnVtYmVycywgdXNlIHRoZSBgXy5pc0Zpbml0ZWAgbWV0aG9kLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIG51bWJlciwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzTnVtYmVyKDMpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNOdW1iZXIoTnVtYmVyLk1JTl9WQUxVRSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc051bWJlcihJbmZpbml0eSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc051bWJlcignMycpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNOdW1iZXIodmFsdWUpIHtcbiAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicgfHxcbiAgICAgICAgKGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgYmFzZUdldFRhZyh2YWx1ZSkgPT0gbnVtYmVyVGFnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIHBsYWluIG9iamVjdCwgdGhhdCBpcywgYW4gb2JqZWN0IGNyZWF0ZWQgYnkgdGhlXG4gICAgICogYE9iamVjdGAgY29uc3RydWN0b3Igb3Igb25lIHdpdGggYSBgW1tQcm90b3R5cGVdXWAgb2YgYG51bGxgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuOC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHBsYWluIG9iamVjdCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBGb28oKSB7XG4gICAgICogICB0aGlzLmEgPSAxO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIF8uaXNQbGFpbk9iamVjdChuZXcgRm9vKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pc1BsYWluT2JqZWN0KFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaXNQbGFpbk9iamVjdCh7ICd4JzogMCwgJ3knOiAwIH0pO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNQbGFpbk9iamVjdChPYmplY3QuY3JlYXRlKG51bGwpKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNQbGFpbk9iamVjdCh2YWx1ZSkge1xuICAgICAgaWYgKCFpc09iamVjdExpa2UodmFsdWUpIHx8IGJhc2VHZXRUYWcodmFsdWUpICE9IG9iamVjdFRhZykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICB2YXIgcHJvdG8gPSBnZXRQcm90b3R5cGUodmFsdWUpO1xuICAgICAgaWYgKHByb3RvID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgdmFyIEN0b3IgPSBoYXNPd25Qcm9wZXJ0eS5jYWxsKHByb3RvLCAnY29uc3RydWN0b3InKSAmJiBwcm90by5jb25zdHJ1Y3RvcjtcbiAgICAgIHJldHVybiB0eXBlb2YgQ3RvciA9PSAnZnVuY3Rpb24nICYmIEN0b3IgaW5zdGFuY2VvZiBDdG9yICYmXG4gICAgICAgIGZ1bmNUb1N0cmluZy5jYWxsKEN0b3IpID09IG9iamVjdEN0b3JTdHJpbmc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBSZWdFeHBgIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSByZWdleHAsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc1JlZ0V4cCgvYWJjLyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc1JlZ0V4cCgnL2FiYy8nKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIHZhciBpc1JlZ0V4cCA9IG5vZGVJc1JlZ0V4cCA/IGJhc2VVbmFyeShub2RlSXNSZWdFeHApIDogYmFzZUlzUmVnRXhwO1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBzYWZlIGludGVnZXIuIEFuIGludGVnZXIgaXMgc2FmZSBpZiBpdCdzIGFuIElFRUUtNzU0XG4gICAgICogZG91YmxlIHByZWNpc2lvbiBudW1iZXIgd2hpY2ggaXNuJ3QgdGhlIHJlc3VsdCBvZiBhIHJvdW5kZWQgdW5zYWZlIGludGVnZXIuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgYmFzZWQgb25cbiAgICAgKiBbYE51bWJlci5pc1NhZmVJbnRlZ2VyYF0oaHR0cHM6Ly9tZG4uaW8vTnVtYmVyL2lzU2FmZUludGVnZXIpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHNhZmUgaW50ZWdlciwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzU2FmZUludGVnZXIoMyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc1NhZmVJbnRlZ2VyKE51bWJlci5NSU5fVkFMVUUpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmlzU2FmZUludGVnZXIoSW5maW5pdHkpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBfLmlzU2FmZUludGVnZXIoJzMnKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzU2FmZUludGVnZXIodmFsdWUpIHtcbiAgICAgIHJldHVybiBpc0ludGVnZXIodmFsdWUpICYmIHZhbHVlID49IC1NQVhfU0FGRV9JTlRFR0VSICYmIHZhbHVlIDw9IE1BWF9TQUZFX0lOVEVHRVI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBTZXRgIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjMuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBzZXQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc1NldChuZXcgU2V0KTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmlzU2V0KG5ldyBXZWFrU2V0KTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIHZhciBpc1NldCA9IG5vZGVJc1NldCA/IGJhc2VVbmFyeShub2RlSXNTZXQpIDogYmFzZUlzU2V0O1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBTdHJpbmdgIHByaW1pdGl2ZSBvciBvYmplY3QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgc3RyaW5nLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uaXNTdHJpbmcoJ2FiYycpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNTdHJpbmcoMSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc1N0cmluZyh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAnc3RyaW5nJyB8fFxuICAgICAgICAoIWlzQXJyYXkodmFsdWUpICYmIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgYmFzZUdldFRhZyh2YWx1ZSkgPT0gc3RyaW5nVGFnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYFN5bWJvbGAgcHJpbWl0aXZlIG9yIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBzeW1ib2wsIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc1N5bWJvbChTeW1ib2wuaXRlcmF0b3IpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNTeW1ib2woJ2FiYycpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNTeW1ib2wodmFsdWUpIHtcbiAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ3N5bWJvbCcgfHxcbiAgICAgICAgKGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgYmFzZUdldFRhZyh2YWx1ZSkgPT0gc3ltYm9sVGFnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgdHlwZWQgYXJyYXkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgdHlwZWQgYXJyYXksIGVsc2UgYGZhbHNlYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pc1R5cGVkQXJyYXkobmV3IFVpbnQ4QXJyYXkpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaXNUeXBlZEFycmF5KFtdKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIHZhciBpc1R5cGVkQXJyYXkgPSBub2RlSXNUeXBlZEFycmF5ID8gYmFzZVVuYXJ5KG5vZGVJc1R5cGVkQXJyYXkpIDogYmFzZUlzVHlwZWRBcnJheTtcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGB1bmRlZmluZWRgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBgdW5kZWZpbmVkYCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzVW5kZWZpbmVkKHZvaWQgMCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc1VuZGVmaW5lZChudWxsKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzVW5kZWZpbmVkKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYFdlYWtNYXBgIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjMuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSB3ZWFrIG1hcCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzV2Vha01hcChuZXcgV2Vha01hcCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc1dlYWtNYXAobmV3IE1hcCk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc1dlYWtNYXAodmFsdWUpIHtcbiAgICAgIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmIGdldFRhZyh2YWx1ZSkgPT0gd2Vha01hcFRhZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYFdlYWtTZXRgIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjMuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSB3ZWFrIHNldCwgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmlzV2Vha1NldChuZXcgV2Vha1NldCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pc1dlYWtTZXQobmV3IFNldCk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc1dlYWtTZXQodmFsdWUpIHtcbiAgICAgIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmIGJhc2VHZXRUYWcodmFsdWUpID09IHdlYWtTZXRUYWc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgbGVzcyB0aGFuIGBvdGhlcmAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy45LjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuXG4gICAgICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBsZXNzIHRoYW4gYG90aGVyYCxcbiAgICAgKiAgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBzZWUgXy5ndFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmx0KDEsIDMpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8ubHQoMywgMyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8ubHQoMywgMSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICB2YXIgbHQgPSBjcmVhdGVSZWxhdGlvbmFsT3BlcmF0aW9uKGJhc2VMdCk7XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gYG90aGVyYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjkuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29tcGFyZS5cbiAgICAgKiBAcGFyYW0geyp9IG90aGVyIFRoZSBvdGhlciB2YWx1ZSB0byBjb21wYXJlLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0b1xuICAgICAqICBgb3RoZXJgLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQHNlZSBfLmd0ZVxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmx0ZSgxLCAzKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmx0ZSgzLCAzKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmx0ZSgzLCAxKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIHZhciBsdGUgPSBjcmVhdGVSZWxhdGlvbmFsT3BlcmF0aW9uKGZ1bmN0aW9uKHZhbHVlLCBvdGhlcikge1xuICAgICAgcmV0dXJuIHZhbHVlIDw9IG90aGVyO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHZhbHVlYCB0byBhbiBhcnJheS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50b0FycmF5KHsgJ2EnOiAxLCAnYic6IDIgfSk7XG4gICAgICogLy8gPT4gWzEsIDJdXG4gICAgICpcbiAgICAgKiBfLnRvQXJyYXkoJ2FiYycpO1xuICAgICAqIC8vID0+IFsnYScsICdiJywgJ2MnXVxuICAgICAqXG4gICAgICogXy50b0FycmF5KDEpO1xuICAgICAqIC8vID0+IFtdXG4gICAgICpcbiAgICAgKiBfLnRvQXJyYXkobnVsbCk7XG4gICAgICogLy8gPT4gW11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0b0FycmF5KHZhbHVlKSB7XG4gICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIGlmIChpc0FycmF5TGlrZSh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIGlzU3RyaW5nKHZhbHVlKSA/IHN0cmluZ1RvQXJyYXkodmFsdWUpIDogY29weUFycmF5KHZhbHVlKTtcbiAgICAgIH1cbiAgICAgIGlmIChzeW1JdGVyYXRvciAmJiB2YWx1ZVtzeW1JdGVyYXRvcl0pIHtcbiAgICAgICAgcmV0dXJuIGl0ZXJhdG9yVG9BcnJheSh2YWx1ZVtzeW1JdGVyYXRvcl0oKSk7XG4gICAgICB9XG4gICAgICB2YXIgdGFnID0gZ2V0VGFnKHZhbHVlKSxcbiAgICAgICAgICBmdW5jID0gdGFnID09IG1hcFRhZyA/IG1hcFRvQXJyYXkgOiAodGFnID09IHNldFRhZyA/IHNldFRvQXJyYXkgOiB2YWx1ZXMpO1xuXG4gICAgICByZXR1cm4gZnVuYyh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHZhbHVlYCB0byBhIGZpbml0ZSBudW1iZXIuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4xMi4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBudW1iZXIuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udG9GaW5pdGUoMy4yKTtcbiAgICAgKiAvLyA9PiAzLjJcbiAgICAgKlxuICAgICAqIF8udG9GaW5pdGUoTnVtYmVyLk1JTl9WQUxVRSk7XG4gICAgICogLy8gPT4gNWUtMzI0XG4gICAgICpcbiAgICAgKiBfLnRvRmluaXRlKEluZmluaXR5KTtcbiAgICAgKiAvLyA9PiAxLjc5NzY5MzEzNDg2MjMxNTdlKzMwOFxuICAgICAqXG4gICAgICogXy50b0Zpbml0ZSgnMy4yJyk7XG4gICAgICogLy8gPT4gMy4yXG4gICAgICovXG4gICAgZnVuY3Rpb24gdG9GaW5pdGUodmFsdWUpIHtcbiAgICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlID09PSAwID8gdmFsdWUgOiAwO1xuICAgICAgfVxuICAgICAgdmFsdWUgPSB0b051bWJlcih2YWx1ZSk7XG4gICAgICBpZiAodmFsdWUgPT09IElORklOSVRZIHx8IHZhbHVlID09PSAtSU5GSU5JVFkpIHtcbiAgICAgICAgdmFyIHNpZ24gPSAodmFsdWUgPCAwID8gLTEgOiAxKTtcbiAgICAgICAgcmV0dXJuIHNpZ24gKiBNQVhfSU5URUdFUjtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWx1ZSA9PT0gdmFsdWUgPyB2YWx1ZSA6IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHZhbHVlYCB0byBhbiBpbnRlZ2VyLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGxvb3NlbHkgYmFzZWQgb25cbiAgICAgKiBbYFRvSW50ZWdlcmBdKGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy10b2ludGVnZXIpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBpbnRlZ2VyLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRvSW50ZWdlcigzLjIpO1xuICAgICAqIC8vID0+IDNcbiAgICAgKlxuICAgICAqIF8udG9JbnRlZ2VyKE51bWJlci5NSU5fVkFMVUUpO1xuICAgICAqIC8vID0+IDBcbiAgICAgKlxuICAgICAqIF8udG9JbnRlZ2VyKEluZmluaXR5KTtcbiAgICAgKiAvLyA9PiAxLjc5NzY5MzEzNDg2MjMxNTdlKzMwOFxuICAgICAqXG4gICAgICogXy50b0ludGVnZXIoJzMuMicpO1xuICAgICAqIC8vID0+IDNcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0b0ludGVnZXIodmFsdWUpIHtcbiAgICAgIHZhciByZXN1bHQgPSB0b0Zpbml0ZSh2YWx1ZSksXG4gICAgICAgICAgcmVtYWluZGVyID0gcmVzdWx0ICUgMTtcblxuICAgICAgcmV0dXJuIHJlc3VsdCA9PT0gcmVzdWx0ID8gKHJlbWFpbmRlciA/IHJlc3VsdCAtIHJlbWFpbmRlciA6IHJlc3VsdCkgOiAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYW4gaW50ZWdlciBzdWl0YWJsZSBmb3IgdXNlIGFzIHRoZSBsZW5ndGggb2YgYW5cbiAgICAgKiBhcnJheS1saWtlIG9iamVjdC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBiYXNlZCBvblxuICAgICAqIFtgVG9MZW5ndGhgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy10b2xlbmd0aCkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTGFuZ1xuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgY29udmVydGVkIGludGVnZXIuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udG9MZW5ndGgoMy4yKTtcbiAgICAgKiAvLyA9PiAzXG4gICAgICpcbiAgICAgKiBfLnRvTGVuZ3RoKE51bWJlci5NSU5fVkFMVUUpO1xuICAgICAqIC8vID0+IDBcbiAgICAgKlxuICAgICAqIF8udG9MZW5ndGgoSW5maW5pdHkpO1xuICAgICAqIC8vID0+IDQyOTQ5NjcyOTVcbiAgICAgKlxuICAgICAqIF8udG9MZW5ndGgoJzMuMicpO1xuICAgICAqIC8vID0+IDNcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0b0xlbmd0aCh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlID8gYmFzZUNsYW1wKHRvSW50ZWdlcih2YWx1ZSksIDAsIE1BWF9BUlJBWV9MRU5HVEgpIDogMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgbnVtYmVyLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IExhbmdcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBwcm9jZXNzLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIG51bWJlci5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50b051bWJlcigzLjIpO1xuICAgICAqIC8vID0+IDMuMlxuICAgICAqXG4gICAgICogXy50b051bWJlcihOdW1iZXIuTUlOX1ZBTFVFKTtcbiAgICAgKiAvLyA9PiA1ZS0zMjRcbiAgICAgKlxuICAgICAqIF8udG9OdW1iZXIoSW5maW5pdHkpO1xuICAgICAqIC8vID0+IEluZmluaXR5XG4gICAgICpcbiAgICAgKiBfLnRvTnVtYmVyKCczLjInKTtcbiAgICAgKiAvLyA9PiAzLjJcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0b051bWJlcih2YWx1ZSkge1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnbnVtYmVyJykge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG4gICAgICBpZiAoaXNTeW1ib2wodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBOQU47XG4gICAgICB9XG4gICAgICBpZiAoaXNPYmplY3QodmFsdWUpKSB7XG4gICAgICAgIHZhciBvdGhlciA9IHR5cGVvZiB2YWx1ZS52YWx1ZU9mID09ICdmdW5jdGlvbicgPyB2YWx1ZS52YWx1ZU9mKCkgOiB2YWx1ZTtcbiAgICAgICAgdmFsdWUgPSBpc09iamVjdChvdGhlcikgPyAob3RoZXIgKyAnJykgOiBvdGhlcjtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlID09PSAwID8gdmFsdWUgOiArdmFsdWU7XG4gICAgICB9XG4gICAgICB2YWx1ZSA9IGJhc2VUcmltKHZhbHVlKTtcbiAgICAgIHZhciBpc0JpbmFyeSA9IHJlSXNCaW5hcnkudGVzdCh2YWx1ZSk7XG4gICAgICByZXR1cm4gKGlzQmluYXJ5IHx8IHJlSXNPY3RhbC50ZXN0KHZhbHVlKSlcbiAgICAgICAgPyBmcmVlUGFyc2VJbnQodmFsdWUuc2xpY2UoMiksIGlzQmluYXJ5ID8gMiA6IDgpXG4gICAgICAgIDogKHJlSXNCYWRIZXgudGVzdCh2YWx1ZSkgPyBOQU4gOiArdmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBwbGFpbiBvYmplY3QgZmxhdHRlbmluZyBpbmhlcml0ZWQgZW51bWVyYWJsZSBzdHJpbmdcbiAgICAgKiBrZXllZCBwcm9wZXJ0aWVzIG9mIGB2YWx1ZWAgdG8gb3duIHByb3BlcnRpZXMgb2YgdGhlIHBsYWluIG9iamVjdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgcGxhaW4gb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBGb28oKSB7XG4gICAgICogICB0aGlzLmIgPSAyO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gICAgICpcbiAgICAgKiBfLmFzc2lnbih7ICdhJzogMSB9LCBuZXcgRm9vKTtcbiAgICAgKiAvLyA9PiB7ICdhJzogMSwgJ2InOiAyIH1cbiAgICAgKlxuICAgICAqIF8uYXNzaWduKHsgJ2EnOiAxIH0sIF8udG9QbGFpbk9iamVjdChuZXcgRm9vKSk7XG4gICAgICogLy8gPT4geyAnYSc6IDEsICdiJzogMiwgJ2MnOiAzIH1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0b1BsYWluT2JqZWN0KHZhbHVlKSB7XG4gICAgICByZXR1cm4gY29weU9iamVjdCh2YWx1ZSwga2V5c0luKHZhbHVlKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHZhbHVlYCB0byBhIHNhZmUgaW50ZWdlci4gQSBzYWZlIGludGVnZXIgY2FuIGJlIGNvbXBhcmVkIGFuZFxuICAgICAqIHJlcHJlc2VudGVkIGNvcnJlY3RseS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgaW50ZWdlci5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50b1NhZmVJbnRlZ2VyKDMuMik7XG4gICAgICogLy8gPT4gM1xuICAgICAqXG4gICAgICogXy50b1NhZmVJbnRlZ2VyKE51bWJlci5NSU5fVkFMVUUpO1xuICAgICAqIC8vID0+IDBcbiAgICAgKlxuICAgICAqIF8udG9TYWZlSW50ZWdlcihJbmZpbml0eSk7XG4gICAgICogLy8gPT4gOTAwNzE5OTI1NDc0MDk5MVxuICAgICAqXG4gICAgICogXy50b1NhZmVJbnRlZ2VyKCczLjInKTtcbiAgICAgKiAvLyA9PiAzXG4gICAgICovXG4gICAgZnVuY3Rpb24gdG9TYWZlSW50ZWdlcih2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlXG4gICAgICAgID8gYmFzZUNsYW1wKHRvSW50ZWdlcih2YWx1ZSksIC1NQVhfU0FGRV9JTlRFR0VSLCBNQVhfU0FGRV9JTlRFR0VSKVxuICAgICAgICA6ICh2YWx1ZSA9PT0gMCA/IHZhbHVlIDogMCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHZhbHVlYCB0byBhIHN0cmluZy4gQW4gZW1wdHkgc3RyaW5nIGlzIHJldHVybmVkIGZvciBgbnVsbGBcbiAgICAgKiBhbmQgYHVuZGVmaW5lZGAgdmFsdWVzLiBUaGUgc2lnbiBvZiBgLTBgIGlzIHByZXNlcnZlZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBMYW5nXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRvU3RyaW5nKG51bGwpO1xuICAgICAqIC8vID0+ICcnXG4gICAgICpcbiAgICAgKiBfLnRvU3RyaW5nKC0wKTtcbiAgICAgKiAvLyA9PiAnLTAnXG4gICAgICpcbiAgICAgKiBfLnRvU3RyaW5nKFsxLCAyLCAzXSk7XG4gICAgICogLy8gPT4gJzEsMiwzJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRvU3RyaW5nKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdmFsdWUgPT0gbnVsbCA/ICcnIDogYmFzZVRvU3RyaW5nKHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBBc3NpZ25zIG93biBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0aWVzIG9mIHNvdXJjZSBvYmplY3RzIHRvIHRoZVxuICAgICAqIGRlc3RpbmF0aW9uIG9iamVjdC4gU291cmNlIG9iamVjdHMgYXJlIGFwcGxpZWQgZnJvbSBsZWZ0IHRvIHJpZ2h0LlxuICAgICAqIFN1YnNlcXVlbnQgc291cmNlcyBvdmVyd3JpdGUgcHJvcGVydHkgYXNzaWdubWVudHMgb2YgcHJldmlvdXMgc291cmNlcy5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBvYmplY3RgIGFuZCBpcyBsb29zZWx5IGJhc2VkIG9uXG4gICAgICogW2BPYmplY3QuYXNzaWduYF0oaHR0cHM6Ly9tZG4uaW8vT2JqZWN0L2Fzc2lnbikuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMC4xMC4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdC5cbiAgICAgKiBAcGFyYW0gey4uLk9iamVjdH0gW3NvdXJjZXNdIFRoZSBzb3VyY2Ugb2JqZWN0cy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqIEBzZWUgXy5hc3NpZ25JblxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBGb28oKSB7XG4gICAgICogICB0aGlzLmEgPSAxO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIEJhcigpIHtcbiAgICAgKiAgIHRoaXMuYyA9IDM7XG4gICAgICogfVxuICAgICAqXG4gICAgICogRm9vLnByb3RvdHlwZS5iID0gMjtcbiAgICAgKiBCYXIucHJvdG90eXBlLmQgPSA0O1xuICAgICAqXG4gICAgICogXy5hc3NpZ24oeyAnYSc6IDAgfSwgbmV3IEZvbywgbmV3IEJhcik7XG4gICAgICogLy8gPT4geyAnYSc6IDEsICdjJzogMyB9XG4gICAgICovXG4gICAgdmFyIGFzc2lnbiA9IGNyZWF0ZUFzc2lnbmVyKGZ1bmN0aW9uKG9iamVjdCwgc291cmNlKSB7XG4gICAgICBpZiAoaXNQcm90b3R5cGUoc291cmNlKSB8fCBpc0FycmF5TGlrZShzb3VyY2UpKSB7XG4gICAgICAgIGNvcHlPYmplY3Qoc291cmNlLCBrZXlzKHNvdXJjZSksIG9iamVjdCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHtcbiAgICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7XG4gICAgICAgICAgYXNzaWduVmFsdWUob2JqZWN0LCBrZXksIHNvdXJjZVtrZXldKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5hc3NpZ25gIGV4Y2VwdCB0aGF0IGl0IGl0ZXJhdGVzIG92ZXIgb3duIGFuZFxuICAgICAqIGluaGVyaXRlZCBzb3VyY2UgcHJvcGVydGllcy5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGFsaWFzIGV4dGVuZFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gICAgICogQHBhcmFtIHsuLi5PYmplY3R9IFtzb3VyY2VzXSBUaGUgc291cmNlIG9iamVjdHMuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKiBAc2VlIF8uYXNzaWduXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIEZvbygpIHtcbiAgICAgKiAgIHRoaXMuYSA9IDE7XG4gICAgICogfVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gQmFyKCkge1xuICAgICAqICAgdGhpcy5jID0gMztcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBGb28ucHJvdG90eXBlLmIgPSAyO1xuICAgICAqIEJhci5wcm90b3R5cGUuZCA9IDQ7XG4gICAgICpcbiAgICAgKiBfLmFzc2lnbkluKHsgJ2EnOiAwIH0sIG5ldyBGb28sIG5ldyBCYXIpO1xuICAgICAqIC8vID0+IHsgJ2EnOiAxLCAnYic6IDIsICdjJzogMywgJ2QnOiA0IH1cbiAgICAgKi9cbiAgICB2YXIgYXNzaWduSW4gPSBjcmVhdGVBc3NpZ25lcihmdW5jdGlvbihvYmplY3QsIHNvdXJjZSkge1xuICAgICAgY29weU9iamVjdChzb3VyY2UsIGtleXNJbihzb3VyY2UpLCBvYmplY3QpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5hc3NpZ25JbmAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgY3VzdG9taXplcmBcbiAgICAgKiB3aGljaCBpcyBpbnZva2VkIHRvIHByb2R1Y2UgdGhlIGFzc2lnbmVkIHZhbHVlcy4gSWYgYGN1c3RvbWl6ZXJgIHJldHVybnNcbiAgICAgKiBgdW5kZWZpbmVkYCwgYXNzaWdubWVudCBpcyBoYW5kbGVkIGJ5IHRoZSBtZXRob2QgaW5zdGVhZC4gVGhlIGBjdXN0b21pemVyYFxuICAgICAqIGlzIGludm9rZWQgd2l0aCBmaXZlIGFyZ3VtZW50czogKG9ialZhbHVlLCBzcmNWYWx1ZSwga2V5LCBvYmplY3QsIHNvdXJjZSkuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBhbGlhcyBleHRlbmRXaXRoXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdC5cbiAgICAgKiBAcGFyYW0gey4uLk9iamVjdH0gc291cmNlcyBUaGUgc291cmNlIG9iamVjdHMuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgYXNzaWduZWQgdmFsdWVzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQHNlZSBfLmFzc2lnbldpdGhcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gY3VzdG9taXplcihvYmpWYWx1ZSwgc3JjVmFsdWUpIHtcbiAgICAgKiAgIHJldHVybiBfLmlzVW5kZWZpbmVkKG9ialZhbHVlKSA/IHNyY1ZhbHVlIDogb2JqVmFsdWU7XG4gICAgICogfVxuICAgICAqXG4gICAgICogdmFyIGRlZmF1bHRzID0gXy5wYXJ0aWFsUmlnaHQoXy5hc3NpZ25JbldpdGgsIGN1c3RvbWl6ZXIpO1xuICAgICAqXG4gICAgICogZGVmYXVsdHMoeyAnYSc6IDEgfSwgeyAnYic6IDIgfSwgeyAnYSc6IDMgfSk7XG4gICAgICogLy8gPT4geyAnYSc6IDEsICdiJzogMiB9XG4gICAgICovXG4gICAgdmFyIGFzc2lnbkluV2l0aCA9IGNyZWF0ZUFzc2lnbmVyKGZ1bmN0aW9uKG9iamVjdCwgc291cmNlLCBzcmNJbmRleCwgY3VzdG9taXplcikge1xuICAgICAgY29weU9iamVjdChzb3VyY2UsIGtleXNJbihzb3VyY2UpLCBvYmplY3QsIGN1c3RvbWl6ZXIpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5hc3NpZ25gIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGN1c3RvbWl6ZXJgXG4gICAgICogd2hpY2ggaXMgaW52b2tlZCB0byBwcm9kdWNlIHRoZSBhc3NpZ25lZCB2YWx1ZXMuIElmIGBjdXN0b21pemVyYCByZXR1cm5zXG4gICAgICogYHVuZGVmaW5lZGAsIGFzc2lnbm1lbnQgaXMgaGFuZGxlZCBieSB0aGUgbWV0aG9kIGluc3RlYWQuIFRoZSBgY3VzdG9taXplcmBcbiAgICAgKiBpcyBpbnZva2VkIHdpdGggZml2ZSBhcmd1bWVudHM6IChvYmpWYWx1ZSwgc3JjVmFsdWUsIGtleSwgb2JqZWN0LCBzb3VyY2UpLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7Li4uT2JqZWN0fSBzb3VyY2VzIFRoZSBzb3VyY2Ugb2JqZWN0cy5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBhc3NpZ25lZCB2YWx1ZXMuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKiBAc2VlIF8uYXNzaWduSW5XaXRoXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIGN1c3RvbWl6ZXIob2JqVmFsdWUsIHNyY1ZhbHVlKSB7XG4gICAgICogICByZXR1cm4gXy5pc1VuZGVmaW5lZChvYmpWYWx1ZSkgPyBzcmNWYWx1ZSA6IG9ialZhbHVlO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIHZhciBkZWZhdWx0cyA9IF8ucGFydGlhbFJpZ2h0KF8uYXNzaWduV2l0aCwgY3VzdG9taXplcik7XG4gICAgICpcbiAgICAgKiBkZWZhdWx0cyh7ICdhJzogMSB9LCB7ICdiJzogMiB9LCB7ICdhJzogMyB9KTtcbiAgICAgKiAvLyA9PiB7ICdhJzogMSwgJ2InOiAyIH1cbiAgICAgKi9cbiAgICB2YXIgYXNzaWduV2l0aCA9IGNyZWF0ZUFzc2lnbmVyKGZ1bmN0aW9uKG9iamVjdCwgc291cmNlLCBzcmNJbmRleCwgY3VzdG9taXplcikge1xuICAgICAgY29weU9iamVjdChzb3VyY2UsIGtleXMoc291cmNlKSwgb2JqZWN0LCBjdXN0b21pemVyKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdmFsdWVzIGNvcnJlc3BvbmRpbmcgdG8gYHBhdGhzYCBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAxLjAuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7Li4uKHN0cmluZ3xzdHJpbmdbXSl9IFtwYXRoc10gVGhlIHByb3BlcnR5IHBhdGhzIHRvIHBpY2suXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBwaWNrZWQgdmFsdWVzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IFt7ICdiJzogeyAnYyc6IDMgfSB9LCA0XSB9O1xuICAgICAqXG4gICAgICogXy5hdChvYmplY3QsIFsnYVswXS5iLmMnLCAnYVsxXSddKTtcbiAgICAgKiAvLyA9PiBbMywgNF1cbiAgICAgKi9cbiAgICB2YXIgYXQgPSBmbGF0UmVzdChiYXNlQXQpO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBvYmplY3QgdGhhdCBpbmhlcml0cyBmcm9tIHRoZSBgcHJvdG90eXBlYCBvYmplY3QuIElmIGFcbiAgICAgKiBgcHJvcGVydGllc2Agb2JqZWN0IGlzIGdpdmVuLCBpdHMgb3duIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIHByb3BlcnRpZXNcbiAgICAgKiBhcmUgYXNzaWduZWQgdG8gdGhlIGNyZWF0ZWQgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDIuMy4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm90b3R5cGUgVGhlIG9iamVjdCB0byBpbmhlcml0IGZyb20uXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtwcm9wZXJ0aWVzXSBUaGUgcHJvcGVydGllcyB0byBhc3NpZ24gdG8gdGhlIG9iamVjdC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBTaGFwZSgpIHtcbiAgICAgKiAgIHRoaXMueCA9IDA7XG4gICAgICogICB0aGlzLnkgPSAwO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIENpcmNsZSgpIHtcbiAgICAgKiAgIFNoYXBlLmNhbGwodGhpcyk7XG4gICAgICogfVxuICAgICAqXG4gICAgICogQ2lyY2xlLnByb3RvdHlwZSA9IF8uY3JlYXRlKFNoYXBlLnByb3RvdHlwZSwge1xuICAgICAqICAgJ2NvbnN0cnVjdG9yJzogQ2lyY2xlXG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKiB2YXIgY2lyY2xlID0gbmV3IENpcmNsZTtcbiAgICAgKiBjaXJjbGUgaW5zdGFuY2VvZiBDaXJjbGU7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogY2lyY2xlIGluc3RhbmNlb2YgU2hhcGU7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShwcm90b3R5cGUsIHByb3BlcnRpZXMpIHtcbiAgICAgIHZhciByZXN1bHQgPSBiYXNlQ3JlYXRlKHByb3RvdHlwZSk7XG4gICAgICByZXR1cm4gcHJvcGVydGllcyA9PSBudWxsID8gcmVzdWx0IDogYmFzZUFzc2lnbihyZXN1bHQsIHByb3BlcnRpZXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFzc2lnbnMgb3duIGFuZCBpbmhlcml0ZWQgZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgcHJvcGVydGllcyBvZiBzb3VyY2VcbiAgICAgKiBvYmplY3RzIHRvIHRoZSBkZXN0aW5hdGlvbiBvYmplY3QgZm9yIGFsbCBkZXN0aW5hdGlvbiBwcm9wZXJ0aWVzIHRoYXRcbiAgICAgKiByZXNvbHZlIHRvIGB1bmRlZmluZWRgLiBTb3VyY2Ugb2JqZWN0cyBhcmUgYXBwbGllZCBmcm9tIGxlZnQgdG8gcmlnaHQuXG4gICAgICogT25jZSBhIHByb3BlcnR5IGlzIHNldCwgYWRkaXRpb25hbCB2YWx1ZXMgb2YgdGhlIHNhbWUgcHJvcGVydHkgYXJlIGlnbm9yZWQuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gICAgICogQHBhcmFtIHsuLi5PYmplY3R9IFtzb3VyY2VzXSBUaGUgc291cmNlIG9iamVjdHMuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKiBAc2VlIF8uZGVmYXVsdHNEZWVwXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZGVmYXVsdHMoeyAnYSc6IDEgfSwgeyAnYic6IDIgfSwgeyAnYSc6IDMgfSk7XG4gICAgICogLy8gPT4geyAnYSc6IDEsICdiJzogMiB9XG4gICAgICovXG4gICAgdmFyIGRlZmF1bHRzID0gYmFzZVJlc3QoZnVuY3Rpb24ob2JqZWN0LCBzb3VyY2VzKSB7XG4gICAgICBvYmplY3QgPSBPYmplY3Qob2JqZWN0KTtcblxuICAgICAgdmFyIGluZGV4ID0gLTE7XG4gICAgICB2YXIgbGVuZ3RoID0gc291cmNlcy5sZW5ndGg7XG4gICAgICB2YXIgZ3VhcmQgPSBsZW5ndGggPiAyID8gc291cmNlc1syXSA6IHVuZGVmaW5lZDtcblxuICAgICAgaWYgKGd1YXJkICYmIGlzSXRlcmF0ZWVDYWxsKHNvdXJjZXNbMF0sIHNvdXJjZXNbMV0sIGd1YXJkKSkge1xuICAgICAgICBsZW5ndGggPSAxO1xuICAgICAgfVxuXG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgc291cmNlID0gc291cmNlc1tpbmRleF07XG4gICAgICAgIHZhciBwcm9wcyA9IGtleXNJbihzb3VyY2UpO1xuICAgICAgICB2YXIgcHJvcHNJbmRleCA9IC0xO1xuICAgICAgICB2YXIgcHJvcHNMZW5ndGggPSBwcm9wcy5sZW5ndGg7XG5cbiAgICAgICAgd2hpbGUgKCsrcHJvcHNJbmRleCA8IHByb3BzTGVuZ3RoKSB7XG4gICAgICAgICAgdmFyIGtleSA9IHByb3BzW3Byb3BzSW5kZXhdO1xuICAgICAgICAgIHZhciB2YWx1ZSA9IG9iamVjdFtrZXldO1xuXG4gICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgICAgKGVxKHZhbHVlLCBvYmplY3RQcm90b1trZXldKSAmJiAhaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSkpKSB7XG4gICAgICAgICAgICBvYmplY3Rba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gb2JqZWN0O1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5kZWZhdWx0c2AgZXhjZXB0IHRoYXQgaXQgcmVjdXJzaXZlbHkgYXNzaWduc1xuICAgICAqIGRlZmF1bHQgcHJvcGVydGllcy5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMTAuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gICAgICogQHBhcmFtIHsuLi5PYmplY3R9IFtzb3VyY2VzXSBUaGUgc291cmNlIG9iamVjdHMuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKiBAc2VlIF8uZGVmYXVsdHNcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5kZWZhdWx0c0RlZXAoeyAnYSc6IHsgJ2InOiAyIH0gfSwgeyAnYSc6IHsgJ2InOiAxLCAnYyc6IDMgfSB9KTtcbiAgICAgKiAvLyA9PiB7ICdhJzogeyAnYic6IDIsICdjJzogMyB9IH1cbiAgICAgKi9cbiAgICB2YXIgZGVmYXVsdHNEZWVwID0gYmFzZVJlc3QoZnVuY3Rpb24oYXJncykge1xuICAgICAgYXJncy5wdXNoKHVuZGVmaW5lZCwgY3VzdG9tRGVmYXVsdHNNZXJnZSk7XG4gICAgICByZXR1cm4gYXBwbHkobWVyZ2VXaXRoLCB1bmRlZmluZWQsIGFyZ3MpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5maW5kYCBleGNlcHQgdGhhdCBpdCByZXR1cm5zIHRoZSBrZXkgb2YgdGhlIGZpcnN0XG4gICAgICogZWxlbWVudCBgcHJlZGljYXRlYCByZXR1cm5zIHRydXRoeSBmb3IgaW5zdGVhZCBvZiB0aGUgZWxlbWVudCBpdHNlbGYuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMS4xLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd8dW5kZWZpbmVkfSBSZXR1cm5zIHRoZSBrZXkgb2YgdGhlIG1hdGNoZWQgZWxlbWVudCxcbiAgICAgKiAgZWxzZSBgdW5kZWZpbmVkYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0ge1xuICAgICAqICAgJ2Jhcm5leSc6ICB7ICdhZ2UnOiAzNiwgJ2FjdGl2ZSc6IHRydWUgfSxcbiAgICAgKiAgICdmcmVkJzogICAgeyAnYWdlJzogNDAsICdhY3RpdmUnOiBmYWxzZSB9LFxuICAgICAqICAgJ3BlYmJsZXMnOiB7ICdhZ2UnOiAxLCAgJ2FjdGl2ZSc6IHRydWUgfVxuICAgICAqIH07XG4gICAgICpcbiAgICAgKiBfLmZpbmRLZXkodXNlcnMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuIG8uYWdlIDwgNDA7IH0pO1xuICAgICAqIC8vID0+ICdiYXJuZXknIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmluZEtleSh1c2VycywgeyAnYWdlJzogMSwgJ2FjdGl2ZSc6IHRydWUgfSk7XG4gICAgICogLy8gPT4gJ3BlYmJsZXMnXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5maW5kS2V5KHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7XG4gICAgICogLy8gPT4gJ2ZyZWQnXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbmRLZXkodXNlcnMsICdhY3RpdmUnKTtcbiAgICAgKiAvLyA9PiAnYmFybmV5J1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZpbmRLZXkob2JqZWN0LCBwcmVkaWNhdGUpIHtcbiAgICAgIHJldHVybiBiYXNlRmluZEtleShvYmplY3QsIGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwgMyksIGJhc2VGb3JPd24pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZmluZEtleWAgZXhjZXB0IHRoYXQgaXQgaXRlcmF0ZXMgb3ZlciBlbGVtZW50cyBvZlxuICAgICAqIGEgY29sbGVjdGlvbiBpbiB0aGUgb3Bwb3NpdGUgb3JkZXIuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMi4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGluc3BlY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd8dW5kZWZpbmVkfSBSZXR1cm5zIHRoZSBrZXkgb2YgdGhlIG1hdGNoZWQgZWxlbWVudCxcbiAgICAgKiAgZWxzZSBgdW5kZWZpbmVkYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0ge1xuICAgICAqICAgJ2Jhcm5leSc6ICB7ICdhZ2UnOiAzNiwgJ2FjdGl2ZSc6IHRydWUgfSxcbiAgICAgKiAgICdmcmVkJzogICAgeyAnYWdlJzogNDAsICdhY3RpdmUnOiBmYWxzZSB9LFxuICAgICAqICAgJ3BlYmJsZXMnOiB7ICdhZ2UnOiAxLCAgJ2FjdGl2ZSc6IHRydWUgfVxuICAgICAqIH07XG4gICAgICpcbiAgICAgKiBfLmZpbmRMYXN0S2V5KHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiBvLmFnZSA8IDQwOyB9KTtcbiAgICAgKiAvLyA9PiByZXR1cm5zICdwZWJibGVzJyBhc3N1bWluZyBgXy5maW5kS2V5YCByZXR1cm5zICdiYXJuZXknXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmluZExhc3RLZXkodXNlcnMsIHsgJ2FnZSc6IDM2LCAnYWN0aXZlJzogdHJ1ZSB9KTtcbiAgICAgKiAvLyA9PiAnYmFybmV5J1xuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmluZExhc3RLZXkodXNlcnMsIFsnYWN0aXZlJywgZmFsc2VdKTtcbiAgICAgKiAvLyA9PiAnZnJlZCdcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uZmluZExhc3RLZXkodXNlcnMsICdhY3RpdmUnKTtcbiAgICAgKiAvLyA9PiAncGViYmxlcydcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmaW5kTGFzdEtleShvYmplY3QsIHByZWRpY2F0ZSkge1xuICAgICAgcmV0dXJuIGJhc2VGaW5kS2V5KG9iamVjdCwgZ2V0SXRlcmF0ZWUocHJlZGljYXRlLCAzKSwgYmFzZUZvck93blJpZ2h0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJdGVyYXRlcyBvdmVyIG93biBhbmQgaW5oZXJpdGVkIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIHByb3BlcnRpZXMgb2YgYW5cbiAgICAgKiBvYmplY3QgYW5kIGludm9rZXMgYGl0ZXJhdGVlYCBmb3IgZWFjaCBwcm9wZXJ0eS4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWRcbiAgICAgKiB3aXRoIHRocmVlIGFyZ3VtZW50czogKHZhbHVlLCBrZXksIG9iamVjdCkuIEl0ZXJhdGVlIGZ1bmN0aW9ucyBtYXkgZXhpdFxuICAgICAqIGl0ZXJhdGlvbiBlYXJseSBieSBleHBsaWNpdGx5IHJldHVybmluZyBgZmFsc2VgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuMy4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKiBAc2VlIF8uZm9ySW5SaWdodFxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBGb28oKSB7XG4gICAgICogICB0aGlzLmEgPSAxO1xuICAgICAqICAgdGhpcy5iID0gMjtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBGb28ucHJvdG90eXBlLmMgPSAzO1xuICAgICAqXG4gICAgICogXy5mb3JJbihuZXcgRm9vLCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gICAgICogICBjb25zb2xlLmxvZyhrZXkpO1xuICAgICAqIH0pO1xuICAgICAqIC8vID0+IExvZ3MgJ2EnLCAnYicsIHRoZW4gJ2MnIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZvckluKG9iamVjdCwgaXRlcmF0ZWUpIHtcbiAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbFxuICAgICAgICA/IG9iamVjdFxuICAgICAgICA6IGJhc2VGb3Iob2JqZWN0LCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMyksIGtleXNJbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5mb3JJbmAgZXhjZXB0IHRoYXQgaXQgaXRlcmF0ZXMgb3ZlciBwcm9wZXJ0aWVzIG9mXG4gICAgICogYG9iamVjdGAgaW4gdGhlIG9wcG9zaXRlIG9yZGVyLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDIuMC4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKiBAc2VlIF8uZm9ySW5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gRm9vKCkge1xuICAgICAqICAgdGhpcy5hID0gMTtcbiAgICAgKiAgIHRoaXMuYiA9IDI7XG4gICAgICogfVxuICAgICAqXG4gICAgICogRm9vLnByb3RvdHlwZS5jID0gMztcbiAgICAgKlxuICAgICAqIF8uZm9ySW5SaWdodChuZXcgRm9vLCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gICAgICogICBjb25zb2xlLmxvZyhrZXkpO1xuICAgICAqIH0pO1xuICAgICAqIC8vID0+IExvZ3MgJ2MnLCAnYicsIHRoZW4gJ2EnIGFzc3VtaW5nIGBfLmZvckluYCBsb2dzICdhJywgJ2InLCB0aGVuICdjJy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmb3JJblJpZ2h0KG9iamVjdCwgaXRlcmF0ZWUpIHtcbiAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbFxuICAgICAgICA/IG9iamVjdFxuICAgICAgICA6IGJhc2VGb3JSaWdodChvYmplY3QsIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAzKSwga2V5c0luKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJdGVyYXRlcyBvdmVyIG93biBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0aWVzIG9mIGFuIG9iamVjdCBhbmRcbiAgICAgKiBpbnZva2VzIGBpdGVyYXRlZWAgZm9yIGVhY2ggcHJvcGVydHkuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggdGhyZWVcbiAgICAgKiBhcmd1bWVudHM6ICh2YWx1ZSwga2V5LCBvYmplY3QpLiBJdGVyYXRlZSBmdW5jdGlvbnMgbWF5IGV4aXQgaXRlcmF0aW9uXG4gICAgICogZWFybHkgYnkgZXhwbGljaXRseSByZXR1cm5pbmcgYGZhbHNlYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjMuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQHNlZSBfLmZvck93blJpZ2h0XG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIEZvbygpIHtcbiAgICAgKiAgIHRoaXMuYSA9IDE7XG4gICAgICogICB0aGlzLmIgPSAyO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gICAgICpcbiAgICAgKiBfLmZvck93bihuZXcgRm9vLCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gICAgICogICBjb25zb2xlLmxvZyhrZXkpO1xuICAgICAqIH0pO1xuICAgICAqIC8vID0+IExvZ3MgJ2EnIHRoZW4gJ2InIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZvck93bihvYmplY3QsIGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gb2JqZWN0ICYmIGJhc2VGb3JPd24ob2JqZWN0LCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMykpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZm9yT3duYCBleGNlcHQgdGhhdCBpdCBpdGVyYXRlcyBvdmVyIHByb3BlcnRpZXMgb2ZcbiAgICAgKiBgb2JqZWN0YCBpbiB0aGUgb3Bwb3NpdGUgb3JkZXIuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMi4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqIEBzZWUgXy5mb3JPd25cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gRm9vKCkge1xuICAgICAqICAgdGhpcy5hID0gMTtcbiAgICAgKiAgIHRoaXMuYiA9IDI7XG4gICAgICogfVxuICAgICAqXG4gICAgICogRm9vLnByb3RvdHlwZS5jID0gMztcbiAgICAgKlxuICAgICAqIF8uZm9yT3duUmlnaHQobmV3IEZvbywgZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAqICAgY29uc29sZS5sb2coa2V5KTtcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiBMb2dzICdiJyB0aGVuICdhJyBhc3N1bWluZyBgXy5mb3JPd25gIGxvZ3MgJ2EnIHRoZW4gJ2InLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZvck93blJpZ2h0KG9iamVjdCwgaXRlcmF0ZWUpIHtcbiAgICAgIHJldHVybiBvYmplY3QgJiYgYmFzZUZvck93blJpZ2h0KG9iamVjdCwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDMpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIGZ1bmN0aW9uIHByb3BlcnR5IG5hbWVzIGZyb20gb3duIGVudW1lcmFibGUgcHJvcGVydGllc1xuICAgICAqIG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpbnNwZWN0LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgZnVuY3Rpb24gbmFtZXMuXG4gICAgICogQHNlZSBfLmZ1bmN0aW9uc0luXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIEZvbygpIHtcbiAgICAgKiAgIHRoaXMuYSA9IF8uY29uc3RhbnQoJ2EnKTtcbiAgICAgKiAgIHRoaXMuYiA9IF8uY29uc3RhbnQoJ2InKTtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBGb28ucHJvdG90eXBlLmMgPSBfLmNvbnN0YW50KCdjJyk7XG4gICAgICpcbiAgICAgKiBfLmZ1bmN0aW9ucyhuZXcgRm9vKTtcbiAgICAgKiAvLyA9PiBbJ2EnLCAnYiddXG4gICAgICovXG4gICAgZnVuY3Rpb24gZnVuY3Rpb25zKG9iamVjdCkge1xuICAgICAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8gW10gOiBiYXNlRnVuY3Rpb25zKG9iamVjdCwga2V5cyhvYmplY3QpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIGZ1bmN0aW9uIHByb3BlcnR5IG5hbWVzIGZyb20gb3duIGFuZCBpbmhlcml0ZWRcbiAgICAgKiBlbnVtZXJhYmxlIHByb3BlcnRpZXMgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGluc3BlY3QuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBmdW5jdGlvbiBuYW1lcy5cbiAgICAgKiBAc2VlIF8uZnVuY3Rpb25zXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIEZvbygpIHtcbiAgICAgKiAgIHRoaXMuYSA9IF8uY29uc3RhbnQoJ2EnKTtcbiAgICAgKiAgIHRoaXMuYiA9IF8uY29uc3RhbnQoJ2InKTtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBGb28ucHJvdG90eXBlLmMgPSBfLmNvbnN0YW50KCdjJyk7XG4gICAgICpcbiAgICAgKiBfLmZ1bmN0aW9uc0luKG5ldyBGb28pO1xuICAgICAqIC8vID0+IFsnYScsICdiJywgJ2MnXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZ1bmN0aW9uc0luKG9iamVjdCkge1xuICAgICAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8gW10gOiBiYXNlRnVuY3Rpb25zKG9iamVjdCwga2V5c0luKG9iamVjdCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHZhbHVlIGF0IGBwYXRoYCBvZiBgb2JqZWN0YC4gSWYgdGhlIHJlc29sdmVkIHZhbHVlIGlzXG4gICAgICogYHVuZGVmaW5lZGAsIHRoZSBgZGVmYXVsdFZhbHVlYCBpcyByZXR1cm5lZCBpbiBpdHMgcGxhY2UuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy43LjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuXG4gICAgICogQHBhcmFtIHsqfSBbZGVmYXVsdFZhbHVlXSBUaGUgdmFsdWUgcmV0dXJuZWQgZm9yIGB1bmRlZmluZWRgIHJlc29sdmVkIHZhbHVlcy5cbiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmVzb2x2ZWQgdmFsdWUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogW3sgJ2InOiB7ICdjJzogMyB9IH1dIH07XG4gICAgICpcbiAgICAgKiBfLmdldChvYmplY3QsICdhWzBdLmIuYycpO1xuICAgICAqIC8vID0+IDNcbiAgICAgKlxuICAgICAqIF8uZ2V0KG9iamVjdCwgWydhJywgJzAnLCAnYicsICdjJ10pO1xuICAgICAqIC8vID0+IDNcbiAgICAgKlxuICAgICAqIF8uZ2V0KG9iamVjdCwgJ2EuYi5jJywgJ2RlZmF1bHQnKTtcbiAgICAgKiAvLyA9PiAnZGVmYXVsdCdcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBnZXQob2JqZWN0LCBwYXRoLCBkZWZhdWx0VmFsdWUpIHtcbiAgICAgIHZhciByZXN1bHQgPSBvYmplY3QgPT0gbnVsbCA/IHVuZGVmaW5lZCA6IGJhc2VHZXQob2JqZWN0LCBwYXRoKTtcbiAgICAgIHJldHVybiByZXN1bHQgPT09IHVuZGVmaW5lZCA/IGRlZmF1bHRWYWx1ZSA6IHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYHBhdGhgIGlzIGEgZGlyZWN0IHByb3BlcnR5IG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHBhdGhgIGV4aXN0cywgZWxzZSBgZmFsc2VgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IHsgJ2InOiAyIH0gfTtcbiAgICAgKiB2YXIgb3RoZXIgPSBfLmNyZWF0ZSh7ICdhJzogXy5jcmVhdGUoeyAnYic6IDIgfSkgfSk7XG4gICAgICpcbiAgICAgKiBfLmhhcyhvYmplY3QsICdhJyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5oYXMob2JqZWN0LCAnYS5iJyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5oYXMob2JqZWN0LCBbJ2EnLCAnYiddKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmhhcyhvdGhlciwgJ2EnKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGhhcyhvYmplY3QsIHBhdGgpIHtcbiAgICAgIHJldHVybiBvYmplY3QgIT0gbnVsbCAmJiBoYXNQYXRoKG9iamVjdCwgcGF0aCwgYmFzZUhhcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGBwYXRoYCBpcyBhIGRpcmVjdCBvciBpbmhlcml0ZWQgcHJvcGVydHkgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgcGF0aGAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSBfLmNyZWF0ZSh7ICdhJzogXy5jcmVhdGUoeyAnYic6IDIgfSkgfSk7XG4gICAgICpcbiAgICAgKiBfLmhhc0luKG9iamVjdCwgJ2EnKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmhhc0luKG9iamVjdCwgJ2EuYicpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaGFzSW4ob2JqZWN0LCBbJ2EnLCAnYiddKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmhhc0luKG9iamVjdCwgJ2InKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGhhc0luKG9iamVjdCwgcGF0aCkge1xuICAgICAgcmV0dXJuIG9iamVjdCAhPSBudWxsICYmIGhhc1BhdGgob2JqZWN0LCBwYXRoLCBiYXNlSGFzSW4pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gb2JqZWN0IGNvbXBvc2VkIG9mIHRoZSBpbnZlcnRlZCBrZXlzIGFuZCB2YWx1ZXMgb2YgYG9iamVjdGAuXG4gICAgICogSWYgYG9iamVjdGAgY29udGFpbnMgZHVwbGljYXRlIHZhbHVlcywgc3Vic2VxdWVudCB2YWx1ZXMgb3ZlcndyaXRlXG4gICAgICogcHJvcGVydHkgYXNzaWdubWVudHMgb2YgcHJldmlvdXMgdmFsdWVzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuNy4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpbnZlcnQuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IGludmVydGVkIG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxLCAnYic6IDIsICdjJzogMSB9O1xuICAgICAqXG4gICAgICogXy5pbnZlcnQob2JqZWN0KTtcbiAgICAgKiAvLyA9PiB7ICcxJzogJ2MnLCAnMic6ICdiJyB9XG4gICAgICovXG4gICAgdmFyIGludmVydCA9IGNyZWF0ZUludmVydGVyKGZ1bmN0aW9uKHJlc3VsdCwgdmFsdWUsIGtleSkge1xuICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiZcbiAgICAgICAgICB0eXBlb2YgdmFsdWUudG9TdHJpbmcgIT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB2YWx1ZSA9IG5hdGl2ZU9iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUpO1xuICAgICAgfVxuXG4gICAgICByZXN1bHRbdmFsdWVdID0ga2V5O1xuICAgIH0sIGNvbnN0YW50KGlkZW50aXR5KSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmludmVydGAgZXhjZXB0IHRoYXQgdGhlIGludmVydGVkIG9iamVjdCBpcyBnZW5lcmF0ZWRcbiAgICAgKiBmcm9tIHRoZSByZXN1bHRzIG9mIHJ1bm5pbmcgZWFjaCBlbGVtZW50IG9mIGBvYmplY3RgIHRocnUgYGl0ZXJhdGVlYC4gVGhlXG4gICAgICogY29ycmVzcG9uZGluZyBpbnZlcnRlZCB2YWx1ZSBvZiBlYWNoIGludmVydGVkIGtleSBpcyBhbiBhcnJheSBvZiBrZXlzXG4gICAgICogcmVzcG9uc2libGUgZm9yIGdlbmVyYXRpbmcgdGhlIGludmVydGVkIHZhbHVlLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZFxuICAgICAqIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMS4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpbnZlcnQuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBpbnZlcnRlZCBvYmplY3QuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogMSwgJ2InOiAyLCAnYyc6IDEgfTtcbiAgICAgKlxuICAgICAqIF8uaW52ZXJ0Qnkob2JqZWN0KTtcbiAgICAgKiAvLyA9PiB7ICcxJzogWydhJywgJ2MnXSwgJzInOiBbJ2InXSB9XG4gICAgICpcbiAgICAgKiBfLmludmVydEJ5KG9iamVjdCwgZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgKiAgIHJldHVybiAnZ3JvdXAnICsgdmFsdWU7XG4gICAgICogfSk7XG4gICAgICogLy8gPT4geyAnZ3JvdXAxJzogWydhJywgJ2MnXSwgJ2dyb3VwMic6IFsnYiddIH1cbiAgICAgKi9cbiAgICB2YXIgaW52ZXJ0QnkgPSBjcmVhdGVJbnZlcnRlcihmdW5jdGlvbihyZXN1bHQsIHZhbHVlLCBrZXkpIHtcbiAgICAgIGlmICh2YWx1ZSAhPSBudWxsICYmXG4gICAgICAgICAgdHlwZW9mIHZhbHVlLnRvU3RyaW5nICE9ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdmFsdWUgPSBuYXRpdmVPYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwocmVzdWx0LCB2YWx1ZSkpIHtcbiAgICAgICAgcmVzdWx0W3ZhbHVlXS5wdXNoKGtleSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHRbdmFsdWVdID0gW2tleV07XG4gICAgICB9XG4gICAgfSwgZ2V0SXRlcmF0ZWUpO1xuXG4gICAgLyoqXG4gICAgICogSW52b2tlcyB0aGUgbWV0aG9kIGF0IGBwYXRoYCBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIG1ldGhvZCB0byBpbnZva2UuXG4gICAgICogQHBhcmFtIHsuLi4qfSBbYXJnc10gVGhlIGFyZ3VtZW50cyB0byBpbnZva2UgdGhlIG1ldGhvZCB3aXRoLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByZXN1bHQgb2YgdGhlIGludm9rZWQgbWV0aG9kLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IFt7ICdiJzogeyAnYyc6IFsxLCAyLCAzLCA0XSB9IH1dIH07XG4gICAgICpcbiAgICAgKiBfLmludm9rZShvYmplY3QsICdhWzBdLmIuYy5zbGljZScsIDEsIDMpO1xuICAgICAqIC8vID0+IFsyLCAzXVxuICAgICAqL1xuICAgIHZhciBpbnZva2UgPSBiYXNlUmVzdChiYXNlSW52b2tlKTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdGhlIG93biBlbnVtZXJhYmxlIHByb3BlcnR5IG5hbWVzIG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIE5vbi1vYmplY3QgdmFsdWVzIGFyZSBjb2VyY2VkIHRvIG9iamVjdHMuIFNlZSB0aGVcbiAgICAgKiBbRVMgc3BlY10oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtb2JqZWN0LmtleXMpXG4gICAgICogZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gRm9vKCkge1xuICAgICAqICAgdGhpcy5hID0gMTtcbiAgICAgKiAgIHRoaXMuYiA9IDI7XG4gICAgICogfVxuICAgICAqXG4gICAgICogRm9vLnByb3RvdHlwZS5jID0gMztcbiAgICAgKlxuICAgICAqIF8ua2V5cyhuZXcgRm9vKTtcbiAgICAgKiAvLyA9PiBbJ2EnLCAnYiddIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gICAgICpcbiAgICAgKiBfLmtleXMoJ2hpJyk7XG4gICAgICogLy8gPT4gWycwJywgJzEnXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGtleXMob2JqZWN0KSB7XG4gICAgICByZXR1cm4gaXNBcnJheUxpa2Uob2JqZWN0KSA/IGFycmF5TGlrZUtleXMob2JqZWN0KSA6IGJhc2VLZXlzKG9iamVjdCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiB0aGUgb3duIGFuZCBpbmhlcml0ZWQgZW51bWVyYWJsZSBwcm9wZXJ0eSBuYW1lcyBvZiBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBOb24tb2JqZWN0IHZhbHVlcyBhcmUgY29lcmNlZCB0byBvYmplY3RzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBGb28oKSB7XG4gICAgICogICB0aGlzLmEgPSAxO1xuICAgICAqICAgdGhpcy5iID0gMjtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBGb28ucHJvdG90eXBlLmMgPSAzO1xuICAgICAqXG4gICAgICogXy5rZXlzSW4obmV3IEZvbyk7XG4gICAgICogLy8gPT4gWydhJywgJ2InLCAnYyddIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gICAgICovXG4gICAgZnVuY3Rpb24ga2V5c0luKG9iamVjdCkge1xuICAgICAgcmV0dXJuIGlzQXJyYXlMaWtlKG9iamVjdCkgPyBhcnJheUxpa2VLZXlzKG9iamVjdCwgdHJ1ZSkgOiBiYXNlS2V5c0luKG9iamVjdCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIG9wcG9zaXRlIG9mIGBfLm1hcFZhbHVlc2A7IHRoaXMgbWV0aG9kIGNyZWF0ZXMgYW4gb2JqZWN0IHdpdGggdGhlXG4gICAgICogc2FtZSB2YWx1ZXMgYXMgYG9iamVjdGAgYW5kIGtleXMgZ2VuZXJhdGVkIGJ5IHJ1bm5pbmcgZWFjaCBvd24gZW51bWVyYWJsZVxuICAgICAqIHN0cmluZyBrZXllZCBwcm9wZXJ0eSBvZiBgb2JqZWN0YCB0aHJ1IGBpdGVyYXRlZWAuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkXG4gICAgICogd2l0aCB0aHJlZSBhcmd1bWVudHM6ICh2YWx1ZSwga2V5LCBvYmplY3QpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuOC4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG1hcHBlZCBvYmplY3QuXG4gICAgICogQHNlZSBfLm1hcFZhbHVlc1xuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLm1hcEtleXMoeyAnYSc6IDEsICdiJzogMiB9LCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gICAgICogICByZXR1cm4ga2V5ICsgdmFsdWU7XG4gICAgICogfSk7XG4gICAgICogLy8gPT4geyAnYTEnOiAxLCAnYjInOiAyIH1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtYXBLZXlzKG9iamVjdCwgaXRlcmF0ZWUpIHtcbiAgICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICAgIGl0ZXJhdGVlID0gZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDMpO1xuXG4gICAgICBiYXNlRm9yT3duKG9iamVjdCwgZnVuY3Rpb24odmFsdWUsIGtleSwgb2JqZWN0KSB7XG4gICAgICAgIGJhc2VBc3NpZ25WYWx1ZShyZXN1bHQsIGl0ZXJhdGVlKHZhbHVlLCBrZXksIG9iamVjdCksIHZhbHVlKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIG9iamVjdCB3aXRoIHRoZSBzYW1lIGtleXMgYXMgYG9iamVjdGAgYW5kIHZhbHVlcyBnZW5lcmF0ZWRcbiAgICAgKiBieSBydW5uaW5nIGVhY2ggb3duIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIHByb3BlcnR5IG9mIGBvYmplY3RgIHRocnVcbiAgICAgKiBgaXRlcmF0ZWVgLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIHRocmVlIGFyZ3VtZW50czpcbiAgICAgKiAodmFsdWUsIGtleSwgb2JqZWN0KS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAyLjQuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBtYXBwZWQgb2JqZWN0LlxuICAgICAqIEBzZWUgXy5tYXBLZXlzXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB1c2VycyA9IHtcbiAgICAgKiAgICdmcmVkJzogICAgeyAndXNlcic6ICdmcmVkJywgICAgJ2FnZSc6IDQwIH0sXG4gICAgICogICAncGViYmxlcyc6IHsgJ3VzZXInOiAncGViYmxlcycsICdhZ2UnOiAxIH1cbiAgICAgKiB9O1xuICAgICAqXG4gICAgICogXy5tYXBWYWx1ZXModXNlcnMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuIG8uYWdlOyB9KTtcbiAgICAgKiAvLyA9PiB7ICdmcmVkJzogNDAsICdwZWJibGVzJzogMSB9IChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLm1hcFZhbHVlcyh1c2VycywgJ2FnZScpO1xuICAgICAqIC8vID0+IHsgJ2ZyZWQnOiA0MCwgJ3BlYmJsZXMnOiAxIH0gKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtYXBWYWx1ZXMob2JqZWN0LCBpdGVyYXRlZSkge1xuICAgICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgICAgaXRlcmF0ZWUgPSBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMyk7XG5cbiAgICAgIGJhc2VGb3JPd24ob2JqZWN0LCBmdW5jdGlvbih2YWx1ZSwga2V5LCBvYmplY3QpIHtcbiAgICAgICAgYmFzZUFzc2lnblZhbHVlKHJlc3VsdCwga2V5LCBpdGVyYXRlZSh2YWx1ZSwga2V5LCBvYmplY3QpKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmFzc2lnbmAgZXhjZXB0IHRoYXQgaXQgcmVjdXJzaXZlbHkgbWVyZ2VzIG93biBhbmRcbiAgICAgKiBpbmhlcml0ZWQgZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgcHJvcGVydGllcyBvZiBzb3VyY2Ugb2JqZWN0cyBpbnRvIHRoZVxuICAgICAqIGRlc3RpbmF0aW9uIG9iamVjdC4gU291cmNlIHByb3BlcnRpZXMgdGhhdCByZXNvbHZlIHRvIGB1bmRlZmluZWRgIGFyZVxuICAgICAqIHNraXBwZWQgaWYgYSBkZXN0aW5hdGlvbiB2YWx1ZSBleGlzdHMuIEFycmF5IGFuZCBwbGFpbiBvYmplY3QgcHJvcGVydGllc1xuICAgICAqIGFyZSBtZXJnZWQgcmVjdXJzaXZlbHkuIE90aGVyIG9iamVjdHMgYW5kIHZhbHVlIHR5cGVzIGFyZSBvdmVycmlkZGVuIGJ5XG4gICAgICogYXNzaWdubWVudC4gU291cmNlIG9iamVjdHMgYXJlIGFwcGxpZWQgZnJvbSBsZWZ0IHRvIHJpZ2h0LiBTdWJzZXF1ZW50XG4gICAgICogc291cmNlcyBvdmVyd3JpdGUgcHJvcGVydHkgYXNzaWdubWVudHMgb2YgcHJldmlvdXMgc291cmNlcy5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuNS4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdC5cbiAgICAgKiBAcGFyYW0gey4uLk9iamVjdH0gW3NvdXJjZXNdIFRoZSBzb3VyY2Ugb2JqZWN0cy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0ge1xuICAgICAqICAgJ2EnOiBbeyAnYic6IDIgfSwgeyAnZCc6IDQgfV1cbiAgICAgKiB9O1xuICAgICAqXG4gICAgICogdmFyIG90aGVyID0ge1xuICAgICAqICAgJ2EnOiBbeyAnYyc6IDMgfSwgeyAnZSc6IDUgfV1cbiAgICAgKiB9O1xuICAgICAqXG4gICAgICogXy5tZXJnZShvYmplY3QsIG90aGVyKTtcbiAgICAgKiAvLyA9PiB7ICdhJzogW3sgJ2InOiAyLCAnYyc6IDMgfSwgeyAnZCc6IDQsICdlJzogNSB9XSB9XG4gICAgICovXG4gICAgdmFyIG1lcmdlID0gY3JlYXRlQXNzaWduZXIoZnVuY3Rpb24ob2JqZWN0LCBzb3VyY2UsIHNyY0luZGV4KSB7XG4gICAgICBiYXNlTWVyZ2Uob2JqZWN0LCBzb3VyY2UsIHNyY0luZGV4KTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8ubWVyZ2VgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGN1c3RvbWl6ZXJgIHdoaWNoXG4gICAgICogaXMgaW52b2tlZCB0byBwcm9kdWNlIHRoZSBtZXJnZWQgdmFsdWVzIG9mIHRoZSBkZXN0aW5hdGlvbiBhbmQgc291cmNlXG4gICAgICogcHJvcGVydGllcy4gSWYgYGN1c3RvbWl6ZXJgIHJldHVybnMgYHVuZGVmaW5lZGAsIG1lcmdpbmcgaXMgaGFuZGxlZCBieSB0aGVcbiAgICAgKiBtZXRob2QgaW5zdGVhZC4gVGhlIGBjdXN0b21pemVyYCBpcyBpbnZva2VkIHdpdGggc2l4IGFyZ3VtZW50czpcbiAgICAgKiAob2JqVmFsdWUsIHNyY1ZhbHVlLCBrZXksIG9iamVjdCwgc291cmNlLCBzdGFjaykuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuXG4gICAgICogQHBhcmFtIHsuLi5PYmplY3R9IHNvdXJjZXMgVGhlIHNvdXJjZSBvYmplY3RzLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGN1c3RvbWl6ZXIgVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBhc3NpZ25lZCB2YWx1ZXMuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gY3VzdG9taXplcihvYmpWYWx1ZSwgc3JjVmFsdWUpIHtcbiAgICAgKiAgIGlmIChfLmlzQXJyYXkob2JqVmFsdWUpKSB7XG4gICAgICogICAgIHJldHVybiBvYmpWYWx1ZS5jb25jYXQoc3JjVmFsdWUpO1xuICAgICAqICAgfVxuICAgICAqIH1cbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogWzFdLCAnYic6IFsyXSB9O1xuICAgICAqIHZhciBvdGhlciA9IHsgJ2EnOiBbM10sICdiJzogWzRdIH07XG4gICAgICpcbiAgICAgKiBfLm1lcmdlV2l0aChvYmplY3QsIG90aGVyLCBjdXN0b21pemVyKTtcbiAgICAgKiAvLyA9PiB7ICdhJzogWzEsIDNdLCAnYic6IFsyLCA0XSB9XG4gICAgICovXG4gICAgdmFyIG1lcmdlV2l0aCA9IGNyZWF0ZUFzc2lnbmVyKGZ1bmN0aW9uKG9iamVjdCwgc291cmNlLCBzcmNJbmRleCwgY3VzdG9taXplcikge1xuICAgICAgYmFzZU1lcmdlKG9iamVjdCwgc291cmNlLCBzcmNJbmRleCwgY3VzdG9taXplcik7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgb3Bwb3NpdGUgb2YgYF8ucGlja2A7IHRoaXMgbWV0aG9kIGNyZWF0ZXMgYW4gb2JqZWN0IGNvbXBvc2VkIG9mIHRoZVxuICAgICAqIG93biBhbmQgaW5oZXJpdGVkIGVudW1lcmFibGUgcHJvcGVydHkgcGF0aHMgb2YgYG9iamVjdGAgdGhhdCBhcmUgbm90IG9taXR0ZWQuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgY29uc2lkZXJhYmx5IHNsb3dlciB0aGFuIGBfLnBpY2tgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIHNvdXJjZSBvYmplY3QuXG4gICAgICogQHBhcmFtIHsuLi4oc3RyaW5nfHN0cmluZ1tdKX0gW3BhdGhzXSBUaGUgcHJvcGVydHkgcGF0aHMgdG8gb21pdC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEsICdiJzogJzInLCAnYyc6IDMgfTtcbiAgICAgKlxuICAgICAqIF8ub21pdChvYmplY3QsIFsnYScsICdjJ10pO1xuICAgICAqIC8vID0+IHsgJ2InOiAnMicgfVxuICAgICAqL1xuICAgIHZhciBvbWl0ID0gZmxhdFJlc3QoZnVuY3Rpb24ob2JqZWN0LCBwYXRocykge1xuICAgICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgICAgaWYgKG9iamVjdCA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgICB2YXIgaXNEZWVwID0gZmFsc2U7XG4gICAgICBwYXRocyA9IGFycmF5TWFwKHBhdGhzLCBmdW5jdGlvbihwYXRoKSB7XG4gICAgICAgIHBhdGggPSBjYXN0UGF0aChwYXRoLCBvYmplY3QpO1xuICAgICAgICBpc0RlZXAgfHwgKGlzRGVlcCA9IHBhdGgubGVuZ3RoID4gMSk7XG4gICAgICAgIHJldHVybiBwYXRoO1xuICAgICAgfSk7XG4gICAgICBjb3B5T2JqZWN0KG9iamVjdCwgZ2V0QWxsS2V5c0luKG9iamVjdCksIHJlc3VsdCk7XG4gICAgICBpZiAoaXNEZWVwKSB7XG4gICAgICAgIHJlc3VsdCA9IGJhc2VDbG9uZShyZXN1bHQsIENMT05FX0RFRVBfRkxBRyB8IENMT05FX0ZMQVRfRkxBRyB8IENMT05FX1NZTUJPTFNfRkxBRywgY3VzdG9tT21pdENsb25lKTtcbiAgICAgIH1cbiAgICAgIHZhciBsZW5ndGggPSBwYXRocy5sZW5ndGg7XG4gICAgICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICAgICAgYmFzZVVuc2V0KHJlc3VsdCwgcGF0aHNbbGVuZ3RoXSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogVGhlIG9wcG9zaXRlIG9mIGBfLnBpY2tCeWA7IHRoaXMgbWV0aG9kIGNyZWF0ZXMgYW4gb2JqZWN0IGNvbXBvc2VkIG9mXG4gICAgICogdGhlIG93biBhbmQgaW5oZXJpdGVkIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIHByb3BlcnRpZXMgb2YgYG9iamVjdGAgdGhhdFxuICAgICAqIGBwcmVkaWNhdGVgIGRvZXNuJ3QgcmV0dXJuIHRydXRoeSBmb3IuIFRoZSBwcmVkaWNhdGUgaXMgaW52b2tlZCB3aXRoIHR3b1xuICAgICAqIGFyZ3VtZW50czogKHZhbHVlLCBrZXkpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIHNvdXJjZSBvYmplY3QuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgcHJvcGVydHkuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxLCAnYic6ICcyJywgJ2MnOiAzIH07XG4gICAgICpcbiAgICAgKiBfLm9taXRCeShvYmplY3QsIF8uaXNOdW1iZXIpO1xuICAgICAqIC8vID0+IHsgJ2InOiAnMicgfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG9taXRCeShvYmplY3QsIHByZWRpY2F0ZSkge1xuICAgICAgcmV0dXJuIHBpY2tCeShvYmplY3QsIG5lZ2F0ZShnZXRJdGVyYXRlZShwcmVkaWNhdGUpKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBvYmplY3QgY29tcG9zZWQgb2YgdGhlIHBpY2tlZCBgb2JqZWN0YCBwcm9wZXJ0aWVzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIHNvdXJjZSBvYmplY3QuXG4gICAgICogQHBhcmFtIHsuLi4oc3RyaW5nfHN0cmluZ1tdKX0gW3BhdGhzXSBUaGUgcHJvcGVydHkgcGF0aHMgdG8gcGljay5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEsICdiJzogJzInLCAnYyc6IDMgfTtcbiAgICAgKlxuICAgICAqIF8ucGljayhvYmplY3QsIFsnYScsICdjJ10pO1xuICAgICAqIC8vID0+IHsgJ2EnOiAxLCAnYyc6IDMgfVxuICAgICAqL1xuICAgIHZhciBwaWNrID0gZmxhdFJlc3QoZnVuY3Rpb24ob2JqZWN0LCBwYXRocykge1xuICAgICAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8ge30gOiBiYXNlUGljayhvYmplY3QsIHBhdGhzKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gb2JqZWN0IGNvbXBvc2VkIG9mIHRoZSBgb2JqZWN0YCBwcm9wZXJ0aWVzIGBwcmVkaWNhdGVgIHJldHVybnNcbiAgICAgKiB0cnV0aHkgZm9yLiBUaGUgcHJlZGljYXRlIGlzIGludm9rZWQgd2l0aCB0d28gYXJndW1lbnRzOiAodmFsdWUsIGtleSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgc291cmNlIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBwcm9wZXJ0eS5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEsICdiJzogJzInLCAnYyc6IDMgfTtcbiAgICAgKlxuICAgICAqIF8ucGlja0J5KG9iamVjdCwgXy5pc051bWJlcik7XG4gICAgICogLy8gPT4geyAnYSc6IDEsICdjJzogMyB9XG4gICAgICovXG4gICAgZnVuY3Rpb24gcGlja0J5KG9iamVjdCwgcHJlZGljYXRlKSB7XG4gICAgICBpZiAob2JqZWN0ID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgfVxuICAgICAgdmFyIHByb3BzID0gYXJyYXlNYXAoZ2V0QWxsS2V5c0luKG9iamVjdCksIGZ1bmN0aW9uKHByb3ApIHtcbiAgICAgICAgcmV0dXJuIFtwcm9wXTtcbiAgICAgIH0pO1xuICAgICAgcHJlZGljYXRlID0gZ2V0SXRlcmF0ZWUocHJlZGljYXRlKTtcbiAgICAgIHJldHVybiBiYXNlUGlja0J5KG9iamVjdCwgcHJvcHMsIGZ1bmN0aW9uKHZhbHVlLCBwYXRoKSB7XG4gICAgICAgIHJldHVybiBwcmVkaWNhdGUodmFsdWUsIHBhdGhbMF0pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5nZXRgIGV4Y2VwdCB0aGF0IGlmIHRoZSByZXNvbHZlZCB2YWx1ZSBpcyBhXG4gICAgICogZnVuY3Rpb24gaXQncyBpbnZva2VkIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIG9mIGl0cyBwYXJlbnQgb2JqZWN0IGFuZFxuICAgICAqIGl0cyByZXN1bHQgaXMgcmV0dXJuZWQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byByZXNvbHZlLlxuICAgICAqIEBwYXJhbSB7Kn0gW2RlZmF1bHRWYWx1ZV0gVGhlIHZhbHVlIHJldHVybmVkIGZvciBgdW5kZWZpbmVkYCByZXNvbHZlZCB2YWx1ZXMuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJlc29sdmVkIHZhbHVlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IFt7ICdiJzogeyAnYzEnOiAzLCAnYzInOiBfLmNvbnN0YW50KDQpIH0gfV0gfTtcbiAgICAgKlxuICAgICAqIF8ucmVzdWx0KG9iamVjdCwgJ2FbMF0uYi5jMScpO1xuICAgICAqIC8vID0+IDNcbiAgICAgKlxuICAgICAqIF8ucmVzdWx0KG9iamVjdCwgJ2FbMF0uYi5jMicpO1xuICAgICAqIC8vID0+IDRcbiAgICAgKlxuICAgICAqIF8ucmVzdWx0KG9iamVjdCwgJ2FbMF0uYi5jMycsICdkZWZhdWx0Jyk7XG4gICAgICogLy8gPT4gJ2RlZmF1bHQnXG4gICAgICpcbiAgICAgKiBfLnJlc3VsdChvYmplY3QsICdhWzBdLmIuYzMnLCBfLmNvbnN0YW50KCdkZWZhdWx0JykpO1xuICAgICAqIC8vID0+ICdkZWZhdWx0J1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJlc3VsdChvYmplY3QsIHBhdGgsIGRlZmF1bHRWYWx1ZSkge1xuICAgICAgcGF0aCA9IGNhc3RQYXRoKHBhdGgsIG9iamVjdCk7XG5cbiAgICAgIHZhciBpbmRleCA9IC0xLFxuICAgICAgICAgIGxlbmd0aCA9IHBhdGgubGVuZ3RoO1xuXG4gICAgICAvLyBFbnN1cmUgdGhlIGxvb3AgaXMgZW50ZXJlZCB3aGVuIHBhdGggaXMgZW1wdHkuXG4gICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICBsZW5ndGggPSAxO1xuICAgICAgICBvYmplY3QgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgdmFsdWUgPSBvYmplY3QgPT0gbnVsbCA/IHVuZGVmaW5lZCA6IG9iamVjdFt0b0tleShwYXRoW2luZGV4XSldO1xuICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGluZGV4ID0gbGVuZ3RoO1xuICAgICAgICAgIHZhbHVlID0gZGVmYXVsdFZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIG9iamVjdCA9IGlzRnVuY3Rpb24odmFsdWUpID8gdmFsdWUuY2FsbChvYmplY3QpIDogdmFsdWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gb2JqZWN0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHZhbHVlIGF0IGBwYXRoYCBvZiBgb2JqZWN0YC4gSWYgYSBwb3J0aW9uIG9mIGBwYXRoYCBkb2Vzbid0IGV4aXN0LFxuICAgICAqIGl0J3MgY3JlYXRlZC4gQXJyYXlzIGFyZSBjcmVhdGVkIGZvciBtaXNzaW5nIGluZGV4IHByb3BlcnRpZXMgd2hpbGUgb2JqZWN0c1xuICAgICAqIGFyZSBjcmVhdGVkIGZvciBhbGwgb3RoZXIgbWlzc2luZyBwcm9wZXJ0aWVzLiBVc2UgYF8uc2V0V2l0aGAgdG8gY3VzdG9taXplXG4gICAgICogYHBhdGhgIGNyZWF0aW9uLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy43LjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gc2V0LlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IFt7ICdiJzogeyAnYyc6IDMgfSB9XSB9O1xuICAgICAqXG4gICAgICogXy5zZXQob2JqZWN0LCAnYVswXS5iLmMnLCA0KTtcbiAgICAgKiBjb25zb2xlLmxvZyhvYmplY3QuYVswXS5iLmMpO1xuICAgICAqIC8vID0+IDRcbiAgICAgKlxuICAgICAqIF8uc2V0KG9iamVjdCwgWyd4JywgJzAnLCAneScsICd6J10sIDUpO1xuICAgICAqIGNvbnNvbGUubG9nKG9iamVjdC54WzBdLnkueik7XG4gICAgICogLy8gPT4gNVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNldChvYmplY3QsIHBhdGgsIHZhbHVlKSB7XG4gICAgICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyBvYmplY3QgOiBiYXNlU2V0KG9iamVjdCwgcGF0aCwgdmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uc2V0YCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBjdXN0b21pemVyYCB3aGljaCBpc1xuICAgICAqIGludm9rZWQgdG8gcHJvZHVjZSB0aGUgb2JqZWN0cyBvZiBgcGF0aGAuICBJZiBgY3VzdG9taXplcmAgcmV0dXJucyBgdW5kZWZpbmVkYFxuICAgICAqIHBhdGggY3JlYXRpb24gaXMgaGFuZGxlZCBieSB0aGUgbWV0aG9kIGluc3RlYWQuIFRoZSBgY3VzdG9taXplcmAgaXMgaW52b2tlZFxuICAgICAqIHdpdGggdGhyZWUgYXJndW1lbnRzOiAobnNWYWx1ZSwga2V5LCBuc09iamVjdCkuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgb2JqZWN0YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gbW9kaWZ5LlxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byBzZXQuXG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGFzc2lnbmVkIHZhbHVlcy5cbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0ID0ge307XG4gICAgICpcbiAgICAgKiBfLnNldFdpdGgob2JqZWN0LCAnWzBdWzFdJywgJ2EnLCBPYmplY3QpO1xuICAgICAqIC8vID0+IHsgJzAnOiB7ICcxJzogJ2EnIH0gfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNldFdpdGgob2JqZWN0LCBwYXRoLCB2YWx1ZSwgY3VzdG9taXplcikge1xuICAgICAgY3VzdG9taXplciA9IHR5cGVvZiBjdXN0b21pemVyID09ICdmdW5jdGlvbicgPyBjdXN0b21pemVyIDogdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8gb2JqZWN0IDogYmFzZVNldChvYmplY3QsIHBhdGgsIHZhbHVlLCBjdXN0b21pemVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIG93biBlbnVtZXJhYmxlIHN0cmluZyBrZXllZC12YWx1ZSBwYWlycyBmb3IgYG9iamVjdGBcbiAgICAgKiB3aGljaCBjYW4gYmUgY29uc3VtZWQgYnkgYF8uZnJvbVBhaXJzYC4gSWYgYG9iamVjdGAgaXMgYSBtYXAgb3Igc2V0LCBpdHNcbiAgICAgKiBlbnRyaWVzIGFyZSByZXR1cm5lZC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBhbGlhcyBlbnRyaWVzXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGtleS12YWx1ZSBwYWlycy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gRm9vKCkge1xuICAgICAqICAgdGhpcy5hID0gMTtcbiAgICAgKiAgIHRoaXMuYiA9IDI7XG4gICAgICogfVxuICAgICAqXG4gICAgICogRm9vLnByb3RvdHlwZS5jID0gMztcbiAgICAgKlxuICAgICAqIF8udG9QYWlycyhuZXcgRm9vKTtcbiAgICAgKiAvLyA9PiBbWydhJywgMV0sIFsnYicsIDJdXSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICAgICAqL1xuICAgIHZhciB0b1BhaXJzID0gY3JlYXRlVG9QYWlycyhrZXlzKTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2Ygb3duIGFuZCBpbmhlcml0ZWQgZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQtdmFsdWUgcGFpcnNcbiAgICAgKiBmb3IgYG9iamVjdGAgd2hpY2ggY2FuIGJlIGNvbnN1bWVkIGJ5IGBfLmZyb21QYWlyc2AuIElmIGBvYmplY3RgIGlzIGEgbWFwXG4gICAgICogb3Igc2V0LCBpdHMgZW50cmllcyBhcmUgcmV0dXJuZWQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAYWxpYXMgZW50cmllc0luXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGtleS12YWx1ZSBwYWlycy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gRm9vKCkge1xuICAgICAqICAgdGhpcy5hID0gMTtcbiAgICAgKiAgIHRoaXMuYiA9IDI7XG4gICAgICogfVxuICAgICAqXG4gICAgICogRm9vLnByb3RvdHlwZS5jID0gMztcbiAgICAgKlxuICAgICAqIF8udG9QYWlyc0luKG5ldyBGb28pO1xuICAgICAqIC8vID0+IFtbJ2EnLCAxXSwgWydiJywgMl0sIFsnYycsIDNdXSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKVxuICAgICAqL1xuICAgIHZhciB0b1BhaXJzSW4gPSBjcmVhdGVUb1BhaXJzKGtleXNJbik7XG5cbiAgICAvKipcbiAgICAgKiBBbiBhbHRlcm5hdGl2ZSB0byBgXy5yZWR1Y2VgOyB0aGlzIG1ldGhvZCB0cmFuc2Zvcm1zIGBvYmplY3RgIHRvIGEgbmV3XG4gICAgICogYGFjY3VtdWxhdG9yYCBvYmplY3Qgd2hpY2ggaXMgdGhlIHJlc3VsdCBvZiBydW5uaW5nIGVhY2ggb2YgaXRzIG93blxuICAgICAqIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIHByb3BlcnRpZXMgdGhydSBgaXRlcmF0ZWVgLCB3aXRoIGVhY2ggaW52b2NhdGlvblxuICAgICAqIHBvdGVudGlhbGx5IG11dGF0aW5nIHRoZSBgYWNjdW11bGF0b3JgIG9iamVjdC4gSWYgYGFjY3VtdWxhdG9yYCBpcyBub3RcbiAgICAgKiBwcm92aWRlZCwgYSBuZXcgb2JqZWN0IHdpdGggdGhlIHNhbWUgYFtbUHJvdG90eXBlXV1gIHdpbGwgYmUgdXNlZC4gVGhlXG4gICAgICogaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIGZvdXIgYXJndW1lbnRzOiAoYWNjdW11bGF0b3IsIHZhbHVlLCBrZXksIG9iamVjdCkuXG4gICAgICogSXRlcmF0ZWUgZnVuY3Rpb25zIG1heSBleGl0IGl0ZXJhdGlvbiBlYXJseSBieSBleHBsaWNpdGx5IHJldHVybmluZyBgZmFsc2VgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDEuMy4wXG4gICAgICogQGNhdGVnb3J5IE9iamVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uXG4gICAgICogQHBhcmFtIHsqfSBbYWNjdW11bGF0b3JdIFRoZSBjdXN0b20gYWNjdW11bGF0b3IgdmFsdWUuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGFjY3VtdWxhdGVkIHZhbHVlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRyYW5zZm9ybShbMiwgMywgNF0sIGZ1bmN0aW9uKHJlc3VsdCwgbikge1xuICAgICAqICAgcmVzdWx0LnB1c2gobiAqPSBuKTtcbiAgICAgKiAgIHJldHVybiBuICUgMiA9PSAwO1xuICAgICAqIH0sIFtdKTtcbiAgICAgKiAvLyA9PiBbNCwgOV1cbiAgICAgKlxuICAgICAqIF8udHJhbnNmb3JtKHsgJ2EnOiAxLCAnYic6IDIsICdjJzogMSB9LCBmdW5jdGlvbihyZXN1bHQsIHZhbHVlLCBrZXkpIHtcbiAgICAgKiAgIChyZXN1bHRbdmFsdWVdIHx8IChyZXN1bHRbdmFsdWVdID0gW10pKS5wdXNoKGtleSk7XG4gICAgICogfSwge30pO1xuICAgICAqIC8vID0+IHsgJzEnOiBbJ2EnLCAnYyddLCAnMic6IFsnYiddIH1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0cmFuc2Zvcm0ob2JqZWN0LCBpdGVyYXRlZSwgYWNjdW11bGF0b3IpIHtcbiAgICAgIHZhciBpc0FyciA9IGlzQXJyYXkob2JqZWN0KSxcbiAgICAgICAgICBpc0Fyckxpa2UgPSBpc0FyciB8fCBpc0J1ZmZlcihvYmplY3QpIHx8IGlzVHlwZWRBcnJheShvYmplY3QpO1xuXG4gICAgICBpdGVyYXRlZSA9IGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCA0KTtcbiAgICAgIGlmIChhY2N1bXVsYXRvciA9PSBudWxsKSB7XG4gICAgICAgIHZhciBDdG9yID0gb2JqZWN0ICYmIG9iamVjdC5jb25zdHJ1Y3RvcjtcbiAgICAgICAgaWYgKGlzQXJyTGlrZSkge1xuICAgICAgICAgIGFjY3VtdWxhdG9yID0gaXNBcnIgPyBuZXcgQ3RvciA6IFtdO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGlzT2JqZWN0KG9iamVjdCkpIHtcbiAgICAgICAgICBhY2N1bXVsYXRvciA9IGlzRnVuY3Rpb24oQ3RvcikgPyBiYXNlQ3JlYXRlKGdldFByb3RvdHlwZShvYmplY3QpKSA6IHt9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGFjY3VtdWxhdG9yID0ge307XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIChpc0Fyckxpa2UgPyBhcnJheUVhY2ggOiBiYXNlRm9yT3duKShvYmplY3QsIGZ1bmN0aW9uKHZhbHVlLCBpbmRleCwgb2JqZWN0KSB7XG4gICAgICAgIHJldHVybiBpdGVyYXRlZShhY2N1bXVsYXRvciwgdmFsdWUsIGluZGV4LCBvYmplY3QpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gYWNjdW11bGF0b3I7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyB0aGUgcHJvcGVydHkgYXQgYHBhdGhgIG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gdW5zZXQuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBwcm9wZXJ0eSBpcyBkZWxldGVkLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogW3sgJ2InOiB7ICdjJzogNyB9IH1dIH07XG4gICAgICogXy51bnNldChvYmplY3QsICdhWzBdLmIuYycpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKG9iamVjdCk7XG4gICAgICogLy8gPT4geyAnYSc6IFt7ICdiJzoge30gfV0gfTtcbiAgICAgKlxuICAgICAqIF8udW5zZXQob2JqZWN0LCBbJ2EnLCAnMCcsICdiJywgJ2MnXSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogY29uc29sZS5sb2cob2JqZWN0KTtcbiAgICAgKiAvLyA9PiB7ICdhJzogW3sgJ2InOiB7fSB9XSB9O1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHVuc2V0KG9iamVjdCwgcGF0aCkge1xuICAgICAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8gdHJ1ZSA6IGJhc2VVbnNldChvYmplY3QsIHBhdGgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uc2V0YCBleGNlcHQgdGhhdCBhY2NlcHRzIGB1cGRhdGVyYCB0byBwcm9kdWNlIHRoZVxuICAgICAqIHZhbHVlIHRvIHNldC4gVXNlIGBfLnVwZGF0ZVdpdGhgIHRvIGN1c3RvbWl6ZSBgcGF0aGAgY3JlYXRpb24uIFRoZSBgdXBkYXRlcmBcbiAgICAgKiBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC42LjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gc2V0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHVwZGF0ZXIgVGhlIGZ1bmN0aW9uIHRvIHByb2R1Y2UgdGhlIHVwZGF0ZWQgdmFsdWUuXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiBbeyAnYic6IHsgJ2MnOiAzIH0gfV0gfTtcbiAgICAgKlxuICAgICAqIF8udXBkYXRlKG9iamVjdCwgJ2FbMF0uYi5jJywgZnVuY3Rpb24obikgeyByZXR1cm4gbiAqIG47IH0pO1xuICAgICAqIGNvbnNvbGUubG9nKG9iamVjdC5hWzBdLmIuYyk7XG4gICAgICogLy8gPT4gOVxuICAgICAqXG4gICAgICogXy51cGRhdGUob2JqZWN0LCAneFswXS55LnonLCBmdW5jdGlvbihuKSB7IHJldHVybiBuID8gbiArIDEgOiAwOyB9KTtcbiAgICAgKiBjb25zb2xlLmxvZyhvYmplY3QueFswXS55LnopO1xuICAgICAqIC8vID0+IDBcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB1cGRhdGUob2JqZWN0LCBwYXRoLCB1cGRhdGVyKSB7XG4gICAgICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyBvYmplY3QgOiBiYXNlVXBkYXRlKG9iamVjdCwgcGF0aCwgY2FzdEZ1bmN0aW9uKHVwZGF0ZXIpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnVwZGF0ZWAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgY3VzdG9taXplcmAgd2hpY2ggaXNcbiAgICAgKiBpbnZva2VkIHRvIHByb2R1Y2UgdGhlIG9iamVjdHMgb2YgYHBhdGhgLiAgSWYgYGN1c3RvbWl6ZXJgIHJldHVybnMgYHVuZGVmaW5lZGBcbiAgICAgKiBwYXRoIGNyZWF0aW9uIGlzIGhhbmRsZWQgYnkgdGhlIG1ldGhvZCBpbnN0ZWFkLiBUaGUgYGN1c3RvbWl6ZXJgIGlzIGludm9rZWRcbiAgICAgKiB3aXRoIHRocmVlIGFyZ3VtZW50czogKG5zVmFsdWUsIGtleSwgbnNPYmplY3QpLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC42LjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gc2V0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHVwZGF0ZXIgVGhlIGZ1bmN0aW9uIHRvIHByb2R1Y2UgdGhlIHVwZGF0ZWQgdmFsdWUuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgYXNzaWduZWQgdmFsdWVzLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7fTtcbiAgICAgKlxuICAgICAqIF8udXBkYXRlV2l0aChvYmplY3QsICdbMF1bMV0nLCBfLmNvbnN0YW50KCdhJyksIE9iamVjdCk7XG4gICAgICogLy8gPT4geyAnMCc6IHsgJzEnOiAnYScgfSB9XG4gICAgICovXG4gICAgZnVuY3Rpb24gdXBkYXRlV2l0aChvYmplY3QsIHBhdGgsIHVwZGF0ZXIsIGN1c3RvbWl6ZXIpIHtcbiAgICAgIGN1c3RvbWl6ZXIgPSB0eXBlb2YgY3VzdG9taXplciA9PSAnZnVuY3Rpb24nID8gY3VzdG9taXplciA6IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IG9iamVjdCA6IGJhc2VVcGRhdGUob2JqZWN0LCBwYXRoLCBjYXN0RnVuY3Rpb24odXBkYXRlciksIGN1c3RvbWl6ZXIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdGhlIG93biBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0eSB2YWx1ZXMgb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogTm9uLW9iamVjdCB2YWx1ZXMgYXJlIGNvZXJjZWQgdG8gb2JqZWN0cy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSB2YWx1ZXMuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIEZvbygpIHtcbiAgICAgKiAgIHRoaXMuYSA9IDE7XG4gICAgICogICB0aGlzLmIgPSAyO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIEZvby5wcm90b3R5cGUuYyA9IDM7XG4gICAgICpcbiAgICAgKiBfLnZhbHVlcyhuZXcgRm9vKTtcbiAgICAgKiAvLyA9PiBbMSwgMl0gKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAgICAgKlxuICAgICAqIF8udmFsdWVzKCdoaScpO1xuICAgICAqIC8vID0+IFsnaCcsICdpJ11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB2YWx1ZXMob2JqZWN0KSB7XG4gICAgICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyBbXSA6IGJhc2VWYWx1ZXMob2JqZWN0LCBrZXlzKG9iamVjdCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdGhlIG93biBhbmQgaW5oZXJpdGVkIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIHByb3BlcnR5XG4gICAgICogdmFsdWVzIG9mIGBvYmplY3RgLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIE5vbi1vYmplY3QgdmFsdWVzIGFyZSBjb2VyY2VkIHRvIG9iamVjdHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0XG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgdmFsdWVzLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBmdW5jdGlvbiBGb28oKSB7XG4gICAgICogICB0aGlzLmEgPSAxO1xuICAgICAqICAgdGhpcy5iID0gMjtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBGb28ucHJvdG90eXBlLmMgPSAzO1xuICAgICAqXG4gICAgICogXy52YWx1ZXNJbihuZXcgRm9vKTtcbiAgICAgKiAvLyA9PiBbMSwgMiwgM10gKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZClcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB2YWx1ZXNJbihvYmplY3QpIHtcbiAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IFtdIDogYmFzZVZhbHVlcyhvYmplY3QsIGtleXNJbihvYmplY3QpKTtcbiAgICB9XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBDbGFtcHMgYG51bWJlcmAgd2l0aGluIHRoZSBpbmNsdXNpdmUgYGxvd2VyYCBhbmQgYHVwcGVyYCBib3VuZHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTnVtYmVyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG51bWJlciBUaGUgbnVtYmVyIHRvIGNsYW1wLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbG93ZXJdIFRoZSBsb3dlciBib3VuZC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gdXBwZXIgVGhlIHVwcGVyIGJvdW5kLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGNsYW1wZWQgbnVtYmVyLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmNsYW1wKC0xMCwgLTUsIDUpO1xuICAgICAqIC8vID0+IC01XG4gICAgICpcbiAgICAgKiBfLmNsYW1wKDEwLCAtNSwgNSk7XG4gICAgICogLy8gPT4gNVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNsYW1wKG51bWJlciwgbG93ZXIsIHVwcGVyKSB7XG4gICAgICBpZiAodXBwZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB1cHBlciA9IGxvd2VyO1xuICAgICAgICBsb3dlciA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGlmICh1cHBlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHVwcGVyID0gdG9OdW1iZXIodXBwZXIpO1xuICAgICAgICB1cHBlciA9IHVwcGVyID09PSB1cHBlciA/IHVwcGVyIDogMDtcbiAgICAgIH1cbiAgICAgIGlmIChsb3dlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGxvd2VyID0gdG9OdW1iZXIobG93ZXIpO1xuICAgICAgICBsb3dlciA9IGxvd2VyID09PSBsb3dlciA/IGxvd2VyIDogMDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBiYXNlQ2xhbXAodG9OdW1iZXIobnVtYmVyKSwgbG93ZXIsIHVwcGVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYG5gIGlzIGJldHdlZW4gYHN0YXJ0YCBhbmQgdXAgdG8sIGJ1dCBub3QgaW5jbHVkaW5nLCBgZW5kYC4gSWZcbiAgICAgKiBgZW5kYCBpcyBub3Qgc3BlY2lmaWVkLCBpdCdzIHNldCB0byBgc3RhcnRgIHdpdGggYHN0YXJ0YCB0aGVuIHNldCB0byBgMGAuXG4gICAgICogSWYgYHN0YXJ0YCBpcyBncmVhdGVyIHRoYW4gYGVuZGAgdGhlIHBhcmFtcyBhcmUgc3dhcHBlZCB0byBzdXBwb3J0XG4gICAgICogbmVnYXRpdmUgcmFuZ2VzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMy4wXG4gICAgICogQGNhdGVnb3J5IE51bWJlclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBudW1iZXIgVGhlIG51bWJlciB0byBjaGVjay5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3N0YXJ0PTBdIFRoZSBzdGFydCBvZiB0aGUgcmFuZ2UuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGVuZCBUaGUgZW5kIG9mIHRoZSByYW5nZS5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYG51bWJlcmAgaXMgaW4gdGhlIHJhbmdlLCBlbHNlIGBmYWxzZWAuXG4gICAgICogQHNlZSBfLnJhbmdlLCBfLnJhbmdlUmlnaHRcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5pblJhbmdlKDMsIDIsIDQpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIF8uaW5SYW5nZSg0LCA4KTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLmluUmFuZ2UoNCwgMik7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaW5SYW5nZSgyLCAyKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5pblJhbmdlKDEuMiwgMik7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5pblJhbmdlKDUuMiwgNCk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uaW5SYW5nZSgtMywgLTIsIC02KTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaW5SYW5nZShudW1iZXIsIHN0YXJ0LCBlbmQpIHtcbiAgICAgIHN0YXJ0ID0gdG9GaW5pdGUoc3RhcnQpO1xuICAgICAgaWYgKGVuZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGVuZCA9IHN0YXJ0O1xuICAgICAgICBzdGFydCA9IDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbmQgPSB0b0Zpbml0ZShlbmQpO1xuICAgICAgfVxuICAgICAgbnVtYmVyID0gdG9OdW1iZXIobnVtYmVyKTtcbiAgICAgIHJldHVybiBiYXNlSW5SYW5nZShudW1iZXIsIHN0YXJ0LCBlbmQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFByb2R1Y2VzIGEgcmFuZG9tIG51bWJlciBiZXR3ZWVuIHRoZSBpbmNsdXNpdmUgYGxvd2VyYCBhbmQgYHVwcGVyYCBib3VuZHMuXG4gICAgICogSWYgb25seSBvbmUgYXJndW1lbnQgaXMgcHJvdmlkZWQgYSBudW1iZXIgYmV0d2VlbiBgMGAgYW5kIHRoZSBnaXZlbiBudW1iZXJcbiAgICAgKiBpcyByZXR1cm5lZC4gSWYgYGZsb2F0aW5nYCBpcyBgdHJ1ZWAsIG9yIGVpdGhlciBgbG93ZXJgIG9yIGB1cHBlcmAgYXJlXG4gICAgICogZmxvYXRzLCBhIGZsb2F0aW5nLXBvaW50IG51bWJlciBpcyByZXR1cm5lZCBpbnN0ZWFkIG9mIGFuIGludGVnZXIuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogSmF2YVNjcmlwdCBmb2xsb3dzIHRoZSBJRUVFLTc1NCBzdGFuZGFyZCBmb3IgcmVzb2x2aW5nXG4gICAgICogZmxvYXRpbmctcG9pbnQgdmFsdWVzIHdoaWNoIGNhbiBwcm9kdWNlIHVuZXhwZWN0ZWQgcmVzdWx0cy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAwLjcuMFxuICAgICAqIEBjYXRlZ29yeSBOdW1iZXJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2xvd2VyPTBdIFRoZSBsb3dlciBib3VuZC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3VwcGVyPTFdIFRoZSB1cHBlciBib3VuZC5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtmbG9hdGluZ10gU3BlY2lmeSByZXR1cm5pbmcgYSBmbG9hdGluZy1wb2ludCBudW1iZXIuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgcmFuZG9tIG51bWJlci5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5yYW5kb20oMCwgNSk7XG4gICAgICogLy8gPT4gYW4gaW50ZWdlciBiZXR3ZWVuIDAgYW5kIDVcbiAgICAgKlxuICAgICAqIF8ucmFuZG9tKDUpO1xuICAgICAqIC8vID0+IGFsc28gYW4gaW50ZWdlciBiZXR3ZWVuIDAgYW5kIDVcbiAgICAgKlxuICAgICAqIF8ucmFuZG9tKDUsIHRydWUpO1xuICAgICAqIC8vID0+IGEgZmxvYXRpbmctcG9pbnQgbnVtYmVyIGJldHdlZW4gMCBhbmQgNVxuICAgICAqXG4gICAgICogXy5yYW5kb20oMS4yLCA1LjIpO1xuICAgICAqIC8vID0+IGEgZmxvYXRpbmctcG9pbnQgbnVtYmVyIGJldHdlZW4gMS4yIGFuZCA1LjJcbiAgICAgKi9cbiAgICBmdW5jdGlvbiByYW5kb20obG93ZXIsIHVwcGVyLCBmbG9hdGluZykge1xuICAgICAgaWYgKGZsb2F0aW5nICYmIHR5cGVvZiBmbG9hdGluZyAhPSAnYm9vbGVhbicgJiYgaXNJdGVyYXRlZUNhbGwobG93ZXIsIHVwcGVyLCBmbG9hdGluZykpIHtcbiAgICAgICAgdXBwZXIgPSBmbG9hdGluZyA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGlmIChmbG9hdGluZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdXBwZXIgPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgZmxvYXRpbmcgPSB1cHBlcjtcbiAgICAgICAgICB1cHBlciA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlb2YgbG93ZXIgPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgZmxvYXRpbmcgPSBsb3dlcjtcbiAgICAgICAgICBsb3dlciA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGxvd2VyID09PSB1bmRlZmluZWQgJiYgdXBwZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBsb3dlciA9IDA7XG4gICAgICAgIHVwcGVyID0gMTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBsb3dlciA9IHRvRmluaXRlKGxvd2VyKTtcbiAgICAgICAgaWYgKHVwcGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB1cHBlciA9IGxvd2VyO1xuICAgICAgICAgIGxvd2VyID0gMDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB1cHBlciA9IHRvRmluaXRlKHVwcGVyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGxvd2VyID4gdXBwZXIpIHtcbiAgICAgICAgdmFyIHRlbXAgPSBsb3dlcjtcbiAgICAgICAgbG93ZXIgPSB1cHBlcjtcbiAgICAgICAgdXBwZXIgPSB0ZW1wO1xuICAgICAgfVxuICAgICAgaWYgKGZsb2F0aW5nIHx8IGxvd2VyICUgMSB8fCB1cHBlciAlIDEpIHtcbiAgICAgICAgdmFyIHJhbmQgPSBuYXRpdmVSYW5kb20oKTtcbiAgICAgICAgcmV0dXJuIG5hdGl2ZU1pbihsb3dlciArIChyYW5kICogKHVwcGVyIC0gbG93ZXIgKyBmcmVlUGFyc2VGbG9hdCgnMWUtJyArICgocmFuZCArICcnKS5sZW5ndGggLSAxKSkpKSwgdXBwZXIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJhc2VSYW5kb20obG93ZXIsIHVwcGVyKTtcbiAgICB9XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgc3RyaW5nYCB0byBbY2FtZWwgY2FzZV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQ2FtZWxDYXNlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGNhbWVsIGNhc2VkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5jYW1lbENhc2UoJ0ZvbyBCYXInKTtcbiAgICAgKiAvLyA9PiAnZm9vQmFyJ1xuICAgICAqXG4gICAgICogXy5jYW1lbENhc2UoJy0tZm9vLWJhci0tJyk7XG4gICAgICogLy8gPT4gJ2Zvb0JhcidcbiAgICAgKlxuICAgICAqIF8uY2FtZWxDYXNlKCdfX0ZPT19CQVJfXycpO1xuICAgICAqIC8vID0+ICdmb29CYXInXG4gICAgICovXG4gICAgdmFyIGNhbWVsQ2FzZSA9IGNyZWF0ZUNvbXBvdW5kZXIoZnVuY3Rpb24ocmVzdWx0LCB3b3JkLCBpbmRleCkge1xuICAgICAgd29yZCA9IHdvcmQudG9Mb3dlckNhc2UoKTtcbiAgICAgIHJldHVybiByZXN1bHQgKyAoaW5kZXggPyBjYXBpdGFsaXplKHdvcmQpIDogd29yZCk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIGBzdHJpbmdgIHRvIHVwcGVyIGNhc2UgYW5kIHRoZSByZW1haW5pbmdcbiAgICAgKiB0byBsb3dlciBjYXNlLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGNhcGl0YWxpemUuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgY2FwaXRhbGl6ZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmNhcGl0YWxpemUoJ0ZSRUQnKTtcbiAgICAgKiAvLyA9PiAnRnJlZCdcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjYXBpdGFsaXplKHN0cmluZykge1xuICAgICAgcmV0dXJuIHVwcGVyRmlyc3QodG9TdHJpbmcoc3RyaW5nKS50b0xvd2VyQ2FzZSgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWJ1cnJzIGBzdHJpbmdgIGJ5IGNvbnZlcnRpbmdcbiAgICAgKiBbTGF0aW4tMSBTdXBwbGVtZW50XShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9MYXRpbi0xX1N1cHBsZW1lbnRfKFVuaWNvZGVfYmxvY2spI0NoYXJhY3Rlcl90YWJsZSlcbiAgICAgKiBhbmQgW0xhdGluIEV4dGVuZGVkLUFdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0xhdGluX0V4dGVuZGVkLUEpXG4gICAgICogbGV0dGVycyB0byBiYXNpYyBMYXRpbiBsZXR0ZXJzIGFuZCByZW1vdmluZ1xuICAgICAqIFtjb21iaW5pbmcgZGlhY3JpdGljYWwgbWFya3NdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0NvbWJpbmluZ19EaWFjcml0aWNhbF9NYXJrcykuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gZGVidXJyLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGRlYnVycmVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5kZWJ1cnIoJ2TDqWrDoCB2dScpO1xuICAgICAqIC8vID0+ICdkZWphIHZ1J1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGRlYnVycihzdHJpbmcpIHtcbiAgICAgIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7XG4gICAgICByZXR1cm4gc3RyaW5nICYmIHN0cmluZy5yZXBsYWNlKHJlTGF0aW4sIGRlYnVyckxldHRlcikucmVwbGFjZShyZUNvbWJvTWFyaywgJycpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgc3RyaW5nYCBlbmRzIHdpdGggdGhlIGdpdmVuIHRhcmdldCBzdHJpbmcuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gaW5zcGVjdC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3RhcmdldF0gVGhlIHN0cmluZyB0byBzZWFyY2ggZm9yLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbcG9zaXRpb249c3RyaW5nLmxlbmd0aF0gVGhlIHBvc2l0aW9uIHRvIHNlYXJjaCB1cCB0by5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHN0cmluZ2AgZW5kcyB3aXRoIGB0YXJnZXRgLFxuICAgICAqICBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZW5kc1dpdGgoJ2FiYycsICdjJyk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogXy5lbmRzV2l0aCgnYWJjJywgJ2InKTtcbiAgICAgKiAvLyA9PiBmYWxzZVxuICAgICAqXG4gICAgICogXy5lbmRzV2l0aCgnYWJjJywgJ2InLCAyKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICovXG4gICAgZnVuY3Rpb24gZW5kc1dpdGgoc3RyaW5nLCB0YXJnZXQsIHBvc2l0aW9uKSB7XG4gICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuICAgICAgdGFyZ2V0ID0gYmFzZVRvU3RyaW5nKHRhcmdldCk7XG5cbiAgICAgIHZhciBsZW5ndGggPSBzdHJpbmcubGVuZ3RoO1xuICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbiA9PT0gdW5kZWZpbmVkXG4gICAgICAgID8gbGVuZ3RoXG4gICAgICAgIDogYmFzZUNsYW1wKHRvSW50ZWdlcihwb3NpdGlvbiksIDAsIGxlbmd0aCk7XG5cbiAgICAgIHZhciBlbmQgPSBwb3NpdGlvbjtcbiAgICAgIHBvc2l0aW9uIC09IHRhcmdldC5sZW5ndGg7XG4gICAgICByZXR1cm4gcG9zaXRpb24gPj0gMCAmJiBzdHJpbmcuc2xpY2UocG9zaXRpb24sIGVuZCkgPT0gdGFyZ2V0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIHRoZSBjaGFyYWN0ZXJzIFwiJlwiLCBcIjxcIiwgXCI+XCIsICdcIicsIGFuZCBcIidcIiBpbiBgc3RyaW5nYCB0byB0aGVpclxuICAgICAqIGNvcnJlc3BvbmRpbmcgSFRNTCBlbnRpdGllcy5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBObyBvdGhlciBjaGFyYWN0ZXJzIGFyZSBlc2NhcGVkLiBUbyBlc2NhcGUgYWRkaXRpb25hbFxuICAgICAqIGNoYXJhY3RlcnMgdXNlIGEgdGhpcmQtcGFydHkgbGlicmFyeSBsaWtlIFtfaGVfXShodHRwczovL210aHMuYmUvaGUpLlxuICAgICAqXG4gICAgICogVGhvdWdoIHRoZSBcIj5cIiBjaGFyYWN0ZXIgaXMgZXNjYXBlZCBmb3Igc3ltbWV0cnksIGNoYXJhY3RlcnMgbGlrZVxuICAgICAqIFwiPlwiIGFuZCBcIi9cIiBkb24ndCBuZWVkIGVzY2FwaW5nIGluIEhUTUwgYW5kIGhhdmUgbm8gc3BlY2lhbCBtZWFuaW5nXG4gICAgICogdW5sZXNzIHRoZXkncmUgcGFydCBvZiBhIHRhZyBvciB1bnF1b3RlZCBhdHRyaWJ1dGUgdmFsdWUuIFNlZVxuICAgICAqIFtNYXRoaWFzIEJ5bmVucydzIGFydGljbGVdKGh0dHBzOi8vbWF0aGlhc2J5bmVucy5iZS9ub3Rlcy9hbWJpZ3VvdXMtYW1wZXJzYW5kcylcbiAgICAgKiAodW5kZXIgXCJzZW1pLXJlbGF0ZWQgZnVuIGZhY3RcIikgZm9yIG1vcmUgZGV0YWlscy5cbiAgICAgKlxuICAgICAqIFdoZW4gd29ya2luZyB3aXRoIEhUTUwgeW91IHNob3VsZCBhbHdheXNcbiAgICAgKiBbcXVvdGUgYXR0cmlidXRlIHZhbHVlc10oaHR0cDovL3dvbmtvLmNvbS9wb3N0L2h0bWwtZXNjYXBpbmcpIHRvIHJlZHVjZVxuICAgICAqIFhTUyB2ZWN0b3JzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGVzY2FwZS5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBlc2NhcGVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5lc2NhcGUoJ2ZyZWQsIGJhcm5leSwgJiBwZWJibGVzJyk7XG4gICAgICogLy8gPT4gJ2ZyZWQsIGJhcm5leSwgJmFtcDsgcGViYmxlcydcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBlc2NhcGUoc3RyaW5nKSB7XG4gICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuICAgICAgcmV0dXJuIChzdHJpbmcgJiYgcmVIYXNVbmVzY2FwZWRIdG1sLnRlc3Qoc3RyaW5nKSlcbiAgICAgICAgPyBzdHJpbmcucmVwbGFjZShyZVVuZXNjYXBlZEh0bWwsIGVzY2FwZUh0bWxDaGFyKVxuICAgICAgICA6IHN0cmluZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFc2NhcGVzIHRoZSBgUmVnRXhwYCBzcGVjaWFsIGNoYXJhY3RlcnMgXCJeXCIsIFwiJFwiLCBcIlxcXCIsIFwiLlwiLCBcIipcIiwgXCIrXCIsXG4gICAgICogXCI/XCIsIFwiKFwiLCBcIilcIiwgXCJbXCIsIFwiXVwiLCBcIntcIiwgXCJ9XCIsIGFuZCBcInxcIiBpbiBgc3RyaW5nYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBlc2NhcGUuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgZXNjYXBlZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZXNjYXBlUmVnRXhwKCdbbG9kYXNoXShodHRwczovL2xvZGFzaC5jb20vKScpO1xuICAgICAqIC8vID0+ICdcXFtsb2Rhc2hcXF1cXChodHRwczovL2xvZGFzaFxcLmNvbS9cXCknXG4gICAgICovXG4gICAgZnVuY3Rpb24gZXNjYXBlUmVnRXhwKHN0cmluZykge1xuICAgICAgc3RyaW5nID0gdG9TdHJpbmcoc3RyaW5nKTtcbiAgICAgIHJldHVybiAoc3RyaW5nICYmIHJlSGFzUmVnRXhwQ2hhci50ZXN0KHN0cmluZykpXG4gICAgICAgID8gc3RyaW5nLnJlcGxhY2UocmVSZWdFeHBDaGFyLCAnXFxcXCQmJylcbiAgICAgICAgOiBzdHJpbmc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHN0cmluZ2AgdG9cbiAgICAgKiBba2ViYWIgY2FzZV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTGV0dGVyX2Nhc2UjU3BlY2lhbF9jYXNlX3N0eWxlcykuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBrZWJhYiBjYXNlZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ua2ViYWJDYXNlKCdGb28gQmFyJyk7XG4gICAgICogLy8gPT4gJ2Zvby1iYXInXG4gICAgICpcbiAgICAgKiBfLmtlYmFiQ2FzZSgnZm9vQmFyJyk7XG4gICAgICogLy8gPT4gJ2Zvby1iYXInXG4gICAgICpcbiAgICAgKiBfLmtlYmFiQ2FzZSgnX19GT09fQkFSX18nKTtcbiAgICAgKiAvLyA9PiAnZm9vLWJhcidcbiAgICAgKi9cbiAgICB2YXIga2ViYWJDYXNlID0gY3JlYXRlQ29tcG91bmRlcihmdW5jdGlvbihyZXN1bHQsIHdvcmQsIGluZGV4KSB7XG4gICAgICByZXR1cm4gcmVzdWx0ICsgKGluZGV4ID8gJy0nIDogJycpICsgd29yZC50b0xvd2VyQ2FzZSgpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHN0cmluZ2AsIGFzIHNwYWNlIHNlcGFyYXRlZCB3b3JkcywgdG8gbG93ZXIgY2FzZS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGxvd2VyIGNhc2VkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5sb3dlckNhc2UoJy0tRm9vLUJhci0tJyk7XG4gICAgICogLy8gPT4gJ2ZvbyBiYXInXG4gICAgICpcbiAgICAgKiBfLmxvd2VyQ2FzZSgnZm9vQmFyJyk7XG4gICAgICogLy8gPT4gJ2ZvbyBiYXInXG4gICAgICpcbiAgICAgKiBfLmxvd2VyQ2FzZSgnX19GT09fQkFSX18nKTtcbiAgICAgKiAvLyA9PiAnZm9vIGJhcidcbiAgICAgKi9cbiAgICB2YXIgbG93ZXJDYXNlID0gY3JlYXRlQ29tcG91bmRlcihmdW5jdGlvbihyZXN1bHQsIHdvcmQsIGluZGV4KSB7XG4gICAgICByZXR1cm4gcmVzdWx0ICsgKGluZGV4ID8gJyAnIDogJycpICsgd29yZC50b0xvd2VyQ2FzZSgpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiBgc3RyaW5nYCB0byBsb3dlciBjYXNlLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgY29udmVydGVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5sb3dlckZpcnN0KCdGcmVkJyk7XG4gICAgICogLy8gPT4gJ2ZyZWQnXG4gICAgICpcbiAgICAgKiBfLmxvd2VyRmlyc3QoJ0ZSRUQnKTtcbiAgICAgKiAvLyA9PiAnZlJFRCdcbiAgICAgKi9cbiAgICB2YXIgbG93ZXJGaXJzdCA9IGNyZWF0ZUNhc2VGaXJzdCgndG9Mb3dlckNhc2UnKTtcblxuICAgIC8qKlxuICAgICAqIFBhZHMgYHN0cmluZ2Agb24gdGhlIGxlZnQgYW5kIHJpZ2h0IHNpZGVzIGlmIGl0J3Mgc2hvcnRlciB0aGFuIGBsZW5ndGhgLlxuICAgICAqIFBhZGRpbmcgY2hhcmFjdGVycyBhcmUgdHJ1bmNhdGVkIGlmIHRoZXkgY2FuJ3QgYmUgZXZlbmx5IGRpdmlkZWQgYnkgYGxlbmd0aGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gcGFkLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbGVuZ3RoPTBdIFRoZSBwYWRkaW5nIGxlbmd0aC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2NoYXJzPScgJ10gVGhlIHN0cmluZyB1c2VkIGFzIHBhZGRpbmcuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgcGFkZGVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5wYWQoJ2FiYycsIDgpO1xuICAgICAqIC8vID0+ICcgIGFiYyAgICdcbiAgICAgKlxuICAgICAqIF8ucGFkKCdhYmMnLCA4LCAnXy0nKTtcbiAgICAgKiAvLyA9PiAnXy1hYmNfLV8nXG4gICAgICpcbiAgICAgKiBfLnBhZCgnYWJjJywgMyk7XG4gICAgICogLy8gPT4gJ2FiYydcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBwYWQoc3RyaW5nLCBsZW5ndGgsIGNoYXJzKSB7XG4gICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuICAgICAgbGVuZ3RoID0gdG9JbnRlZ2VyKGxlbmd0aCk7XG5cbiAgICAgIHZhciBzdHJMZW5ndGggPSBsZW5ndGggPyBzdHJpbmdTaXplKHN0cmluZykgOiAwO1xuICAgICAgaWYgKCFsZW5ndGggfHwgc3RyTGVuZ3RoID49IGxlbmd0aCkge1xuICAgICAgICByZXR1cm4gc3RyaW5nO1xuICAgICAgfVxuICAgICAgdmFyIG1pZCA9IChsZW5ndGggLSBzdHJMZW5ndGgpIC8gMjtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIGNyZWF0ZVBhZGRpbmcobmF0aXZlRmxvb3IobWlkKSwgY2hhcnMpICtcbiAgICAgICAgc3RyaW5nICtcbiAgICAgICAgY3JlYXRlUGFkZGluZyhuYXRpdmVDZWlsKG1pZCksIGNoYXJzKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQYWRzIGBzdHJpbmdgIG9uIHRoZSByaWdodCBzaWRlIGlmIGl0J3Mgc2hvcnRlciB0aGFuIGBsZW5ndGhgLiBQYWRkaW5nXG4gICAgICogY2hhcmFjdGVycyBhcmUgdHJ1bmNhdGVkIGlmIHRoZXkgZXhjZWVkIGBsZW5ndGhgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIHBhZC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2xlbmd0aD0wXSBUaGUgcGFkZGluZyBsZW5ndGguXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtjaGFycz0nICddIFRoZSBzdHJpbmcgdXNlZCBhcyBwYWRkaW5nLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHBhZGRlZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ucGFkRW5kKCdhYmMnLCA2KTtcbiAgICAgKiAvLyA9PiAnYWJjICAgJ1xuICAgICAqXG4gICAgICogXy5wYWRFbmQoJ2FiYycsIDYsICdfLScpO1xuICAgICAqIC8vID0+ICdhYmNfLV8nXG4gICAgICpcbiAgICAgKiBfLnBhZEVuZCgnYWJjJywgMyk7XG4gICAgICogLy8gPT4gJ2FiYydcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBwYWRFbmQoc3RyaW5nLCBsZW5ndGgsIGNoYXJzKSB7XG4gICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuICAgICAgbGVuZ3RoID0gdG9JbnRlZ2VyKGxlbmd0aCk7XG5cbiAgICAgIHZhciBzdHJMZW5ndGggPSBsZW5ndGggPyBzdHJpbmdTaXplKHN0cmluZykgOiAwO1xuICAgICAgcmV0dXJuIChsZW5ndGggJiYgc3RyTGVuZ3RoIDwgbGVuZ3RoKVxuICAgICAgICA/IChzdHJpbmcgKyBjcmVhdGVQYWRkaW5nKGxlbmd0aCAtIHN0ckxlbmd0aCwgY2hhcnMpKVxuICAgICAgICA6IHN0cmluZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQYWRzIGBzdHJpbmdgIG9uIHRoZSBsZWZ0IHNpZGUgaWYgaXQncyBzaG9ydGVyIHRoYW4gYGxlbmd0aGAuIFBhZGRpbmdcbiAgICAgKiBjaGFyYWN0ZXJzIGFyZSB0cnVuY2F0ZWQgaWYgdGhleSBleGNlZWQgYGxlbmd0aGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gcGFkLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbGVuZ3RoPTBdIFRoZSBwYWRkaW5nIGxlbmd0aC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2NoYXJzPScgJ10gVGhlIHN0cmluZyB1c2VkIGFzIHBhZGRpbmcuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgcGFkZGVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5wYWRTdGFydCgnYWJjJywgNik7XG4gICAgICogLy8gPT4gJyAgIGFiYydcbiAgICAgKlxuICAgICAqIF8ucGFkU3RhcnQoJ2FiYycsIDYsICdfLScpO1xuICAgICAqIC8vID0+ICdfLV9hYmMnXG4gICAgICpcbiAgICAgKiBfLnBhZFN0YXJ0KCdhYmMnLCAzKTtcbiAgICAgKiAvLyA9PiAnYWJjJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHBhZFN0YXJ0KHN0cmluZywgbGVuZ3RoLCBjaGFycykge1xuICAgICAgc3RyaW5nID0gdG9TdHJpbmcoc3RyaW5nKTtcbiAgICAgIGxlbmd0aCA9IHRvSW50ZWdlcihsZW5ndGgpO1xuXG4gICAgICB2YXIgc3RyTGVuZ3RoID0gbGVuZ3RoID8gc3RyaW5nU2l6ZShzdHJpbmcpIDogMDtcbiAgICAgIHJldHVybiAobGVuZ3RoICYmIHN0ckxlbmd0aCA8IGxlbmd0aClcbiAgICAgICAgPyAoY3JlYXRlUGFkZGluZyhsZW5ndGggLSBzdHJMZW5ndGgsIGNoYXJzKSArIHN0cmluZylcbiAgICAgICAgOiBzdHJpbmc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHN0cmluZ2AgdG8gYW4gaW50ZWdlciBvZiB0aGUgc3BlY2lmaWVkIHJhZGl4LiBJZiBgcmFkaXhgIGlzXG4gICAgICogYHVuZGVmaW5lZGAgb3IgYDBgLCBhIGByYWRpeGAgb2YgYDEwYCBpcyB1c2VkIHVubGVzcyBgdmFsdWVgIGlzIGFcbiAgICAgKiBoZXhhZGVjaW1hbCwgaW4gd2hpY2ggY2FzZSBhIGByYWRpeGAgb2YgYDE2YCBpcyB1c2VkLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGFsaWducyB3aXRoIHRoZVxuICAgICAqIFtFUzUgaW1wbGVtZW50YXRpb25dKGh0dHBzOi8vZXM1LmdpdGh1Yi5pby8jeDE1LjEuMi4yKSBvZiBgcGFyc2VJbnRgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDEuMS4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbcmFkaXg9MTBdIFRoZSByYWRpeCB0byBpbnRlcnByZXQgYHZhbHVlYCBieS5cbiAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBpbnRlZ2VyLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnBhcnNlSW50KCcwOCcpO1xuICAgICAqIC8vID0+IDhcbiAgICAgKlxuICAgICAqIF8ubWFwKFsnNicsICcwOCcsICcxMCddLCBfLnBhcnNlSW50KTtcbiAgICAgKiAvLyA9PiBbNiwgOCwgMTBdXG4gICAgICovXG4gICAgZnVuY3Rpb24gcGFyc2VJbnQoc3RyaW5nLCByYWRpeCwgZ3VhcmQpIHtcbiAgICAgIGlmIChndWFyZCB8fCByYWRpeCA9PSBudWxsKSB7XG4gICAgICAgIHJhZGl4ID0gMDtcbiAgICAgIH0gZWxzZSBpZiAocmFkaXgpIHtcbiAgICAgICAgcmFkaXggPSArcmFkaXg7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmF0aXZlUGFyc2VJbnQodG9TdHJpbmcoc3RyaW5nKS5yZXBsYWNlKHJlVHJpbVN0YXJ0LCAnJyksIHJhZGl4IHx8IDApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlcGVhdHMgdGhlIGdpdmVuIHN0cmluZyBgbmAgdGltZXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gcmVwZWF0LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbj0xXSBUaGUgbnVtYmVyIG9mIHRpbWVzIHRvIHJlcGVhdCB0aGUgc3RyaW5nLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgcmVwZWF0ZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnJlcGVhdCgnKicsIDMpO1xuICAgICAqIC8vID0+ICcqKionXG4gICAgICpcbiAgICAgKiBfLnJlcGVhdCgnYWJjJywgMik7XG4gICAgICogLy8gPT4gJ2FiY2FiYydcbiAgICAgKlxuICAgICAqIF8ucmVwZWF0KCdhYmMnLCAwKTtcbiAgICAgKiAvLyA9PiAnJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJlcGVhdChzdHJpbmcsIG4sIGd1YXJkKSB7XG4gICAgICBpZiAoKGd1YXJkID8gaXNJdGVyYXRlZUNhbGwoc3RyaW5nLCBuLCBndWFyZCkgOiBuID09PSB1bmRlZmluZWQpKSB7XG4gICAgICAgIG4gPSAxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbiA9IHRvSW50ZWdlcihuKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBiYXNlUmVwZWF0KHRvU3RyaW5nKHN0cmluZyksIG4pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlcGxhY2VzIG1hdGNoZXMgZm9yIGBwYXR0ZXJuYCBpbiBgc3RyaW5nYCB3aXRoIGByZXBsYWNlbWVudGAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgYmFzZWQgb25cbiAgICAgKiBbYFN0cmluZyNyZXBsYWNlYF0oaHR0cHM6Ly9tZG4uaW8vU3RyaW5nL3JlcGxhY2UpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIG1vZGlmeS5cbiAgICAgKiBAcGFyYW0ge1JlZ0V4cHxzdHJpbmd9IHBhdHRlcm4gVGhlIHBhdHRlcm4gdG8gcmVwbGFjZS5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufHN0cmluZ30gcmVwbGFjZW1lbnQgVGhlIG1hdGNoIHJlcGxhY2VtZW50LlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIG1vZGlmaWVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5yZXBsYWNlKCdIaSBGcmVkJywgJ0ZyZWQnLCAnQmFybmV5Jyk7XG4gICAgICogLy8gPT4gJ0hpIEJhcm5leSdcbiAgICAgKi9cbiAgICBmdW5jdGlvbiByZXBsYWNlKCkge1xuICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHMsXG4gICAgICAgICAgc3RyaW5nID0gdG9TdHJpbmcoYXJnc1swXSk7XG5cbiAgICAgIHJldHVybiBhcmdzLmxlbmd0aCA8IDMgPyBzdHJpbmcgOiBzdHJpbmcucmVwbGFjZShhcmdzWzFdLCBhcmdzWzJdKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgc3RyaW5nYCB0b1xuICAgICAqIFtzbmFrZSBjYXNlXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9TbmFrZV9jYXNlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHNuYWtlIGNhc2VkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5zbmFrZUNhc2UoJ0ZvbyBCYXInKTtcbiAgICAgKiAvLyA9PiAnZm9vX2JhcidcbiAgICAgKlxuICAgICAqIF8uc25ha2VDYXNlKCdmb29CYXInKTtcbiAgICAgKiAvLyA9PiAnZm9vX2JhcidcbiAgICAgKlxuICAgICAqIF8uc25ha2VDYXNlKCctLUZPTy1CQVItLScpO1xuICAgICAqIC8vID0+ICdmb29fYmFyJ1xuICAgICAqL1xuICAgIHZhciBzbmFrZUNhc2UgPSBjcmVhdGVDb21wb3VuZGVyKGZ1bmN0aW9uKHJlc3VsdCwgd29yZCwgaW5kZXgpIHtcbiAgICAgIHJldHVybiByZXN1bHQgKyAoaW5kZXggPyAnXycgOiAnJykgKyB3b3JkLnRvTG93ZXJDYXNlKCk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBTcGxpdHMgYHN0cmluZ2AgYnkgYHNlcGFyYXRvcmAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgYmFzZWQgb25cbiAgICAgKiBbYFN0cmluZyNzcGxpdGBdKGh0dHBzOi8vbWRuLmlvL1N0cmluZy9zcGxpdCkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gc3BsaXQuXG4gICAgICogQHBhcmFtIHtSZWdFeHB8c3RyaW5nfSBzZXBhcmF0b3IgVGhlIHNlcGFyYXRvciBwYXR0ZXJuIHRvIHNwbGl0IGJ5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbGltaXRdIFRoZSBsZW5ndGggdG8gdHJ1bmNhdGUgcmVzdWx0cyB0by5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHN0cmluZyBzZWdtZW50cy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5zcGxpdCgnYS1iLWMnLCAnLScsIDIpO1xuICAgICAqIC8vID0+IFsnYScsICdiJ11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzcGxpdChzdHJpbmcsIHNlcGFyYXRvciwgbGltaXQpIHtcbiAgICAgIGlmIChsaW1pdCAmJiB0eXBlb2YgbGltaXQgIT0gJ251bWJlcicgJiYgaXNJdGVyYXRlZUNhbGwoc3RyaW5nLCBzZXBhcmF0b3IsIGxpbWl0KSkge1xuICAgICAgICBzZXBhcmF0b3IgPSBsaW1pdCA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGxpbWl0ID0gbGltaXQgPT09IHVuZGVmaW5lZCA/IE1BWF9BUlJBWV9MRU5HVEggOiBsaW1pdCA+Pj4gMDtcbiAgICAgIGlmICghbGltaXQpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgc3RyaW5nID0gdG9TdHJpbmcoc3RyaW5nKTtcbiAgICAgIGlmIChzdHJpbmcgJiYgKFxuICAgICAgICAgICAgdHlwZW9mIHNlcGFyYXRvciA9PSAnc3RyaW5nJyB8fFxuICAgICAgICAgICAgKHNlcGFyYXRvciAhPSBudWxsICYmICFpc1JlZ0V4cChzZXBhcmF0b3IpKVxuICAgICAgICAgICkpIHtcbiAgICAgICAgc2VwYXJhdG9yID0gYmFzZVRvU3RyaW5nKHNlcGFyYXRvcik7XG4gICAgICAgIGlmICghc2VwYXJhdG9yICYmIGhhc1VuaWNvZGUoc3RyaW5nKSkge1xuICAgICAgICAgIHJldHVybiBjYXN0U2xpY2Uoc3RyaW5nVG9BcnJheShzdHJpbmcpLCAwLCBsaW1pdCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBzdHJpbmcuc3BsaXQoc2VwYXJhdG9yLCBsaW1pdCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHN0cmluZ2AgdG9cbiAgICAgKiBbc3RhcnQgY2FzZV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTGV0dGVyX2Nhc2UjU3R5bGlzdGljX29yX3NwZWNpYWxpc2VkX3VzYWdlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjEuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBjb252ZXJ0LlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHN0YXJ0IGNhc2VkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5zdGFydENhc2UoJy0tZm9vLWJhci0tJyk7XG4gICAgICogLy8gPT4gJ0ZvbyBCYXInXG4gICAgICpcbiAgICAgKiBfLnN0YXJ0Q2FzZSgnZm9vQmFyJyk7XG4gICAgICogLy8gPT4gJ0ZvbyBCYXInXG4gICAgICpcbiAgICAgKiBfLnN0YXJ0Q2FzZSgnX19GT09fQkFSX18nKTtcbiAgICAgKiAvLyA9PiAnRk9PIEJBUidcbiAgICAgKi9cbiAgICB2YXIgc3RhcnRDYXNlID0gY3JlYXRlQ29tcG91bmRlcihmdW5jdGlvbihyZXN1bHQsIHdvcmQsIGluZGV4KSB7XG4gICAgICByZXR1cm4gcmVzdWx0ICsgKGluZGV4ID8gJyAnIDogJycpICsgdXBwZXJGaXJzdCh3b3JkKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBgc3RyaW5nYCBzdGFydHMgd2l0aCB0aGUgZ2l2ZW4gdGFyZ2V0IHN0cmluZy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbdGFyZ2V0XSBUaGUgc3RyaW5nIHRvIHNlYXJjaCBmb3IuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtwb3NpdGlvbj0wXSBUaGUgcG9zaXRpb24gdG8gc2VhcmNoIGZyb20uXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBzdHJpbmdgIHN0YXJ0cyB3aXRoIGB0YXJnZXRgLFxuICAgICAqICBlbHNlIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uc3RhcnRzV2l0aCgnYWJjJywgJ2EnKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBfLnN0YXJ0c1dpdGgoJ2FiYycsICdiJyk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKlxuICAgICAqIF8uc3RhcnRzV2l0aCgnYWJjJywgJ2InLCAxKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICovXG4gICAgZnVuY3Rpb24gc3RhcnRzV2l0aChzdHJpbmcsIHRhcmdldCwgcG9zaXRpb24pIHtcbiAgICAgIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7XG4gICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uID09IG51bGxcbiAgICAgICAgPyAwXG4gICAgICAgIDogYmFzZUNsYW1wKHRvSW50ZWdlcihwb3NpdGlvbiksIDAsIHN0cmluZy5sZW5ndGgpO1xuXG4gICAgICB0YXJnZXQgPSBiYXNlVG9TdHJpbmcodGFyZ2V0KTtcbiAgICAgIHJldHVybiBzdHJpbmcuc2xpY2UocG9zaXRpb24sIHBvc2l0aW9uICsgdGFyZ2V0Lmxlbmd0aCkgPT0gdGFyZ2V0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBjb21waWxlZCB0ZW1wbGF0ZSBmdW5jdGlvbiB0aGF0IGNhbiBpbnRlcnBvbGF0ZSBkYXRhIHByb3BlcnRpZXNcbiAgICAgKiBpbiBcImludGVycG9sYXRlXCIgZGVsaW1pdGVycywgSFRNTC1lc2NhcGUgaW50ZXJwb2xhdGVkIGRhdGEgcHJvcGVydGllcyBpblxuICAgICAqIFwiZXNjYXBlXCIgZGVsaW1pdGVycywgYW5kIGV4ZWN1dGUgSmF2YVNjcmlwdCBpbiBcImV2YWx1YXRlXCIgZGVsaW1pdGVycy4gRGF0YVxuICAgICAqIHByb3BlcnRpZXMgbWF5IGJlIGFjY2Vzc2VkIGFzIGZyZWUgdmFyaWFibGVzIGluIHRoZSB0ZW1wbGF0ZS4gSWYgYSBzZXR0aW5nXG4gICAgICogb2JqZWN0IGlzIGdpdmVuLCBpdCB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgYF8udGVtcGxhdGVTZXR0aW5nc2AgdmFsdWVzLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIEluIHRoZSBkZXZlbG9wbWVudCBidWlsZCBgXy50ZW1wbGF0ZWAgdXRpbGl6ZXNcbiAgICAgKiBbc291cmNlVVJMc10oaHR0cDovL3d3dy5odG1sNXJvY2tzLmNvbS9lbi90dXRvcmlhbHMvZGV2ZWxvcGVydG9vbHMvc291cmNlbWFwcy8jdG9jLXNvdXJjZXVybClcbiAgICAgKiBmb3IgZWFzaWVyIGRlYnVnZ2luZy5cbiAgICAgKlxuICAgICAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHByZWNvbXBpbGluZyB0ZW1wbGF0ZXMgc2VlXG4gICAgICogW2xvZGFzaCdzIGN1c3RvbSBidWlsZHMgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9sb2Rhc2guY29tL2N1c3RvbS1idWlsZHMpLlxuICAgICAqXG4gICAgICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gQ2hyb21lIGV4dGVuc2lvbiBzYW5kYm94ZXMgc2VlXG4gICAgICogW0Nocm9tZSdzIGV4dGVuc2lvbnMgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9kZXZlbG9wZXIuY2hyb21lLmNvbS9leHRlbnNpb25zL3NhbmRib3hpbmdFdmFsKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHRlbXBsYXRlIHN0cmluZy5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnM9e31dIFRoZSBvcHRpb25zIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge1JlZ0V4cH0gW29wdGlvbnMuZXNjYXBlPV8udGVtcGxhdGVTZXR0aW5ncy5lc2NhcGVdXG4gICAgICogIFRoZSBIVE1MIFwiZXNjYXBlXCIgZGVsaW1pdGVyLlxuICAgICAqIEBwYXJhbSB7UmVnRXhwfSBbb3B0aW9ucy5ldmFsdWF0ZT1fLnRlbXBsYXRlU2V0dGluZ3MuZXZhbHVhdGVdXG4gICAgICogIFRoZSBcImV2YWx1YXRlXCIgZGVsaW1pdGVyLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucy5pbXBvcnRzPV8udGVtcGxhdGVTZXR0aW5ncy5pbXBvcnRzXVxuICAgICAqICBBbiBvYmplY3QgdG8gaW1wb3J0IGludG8gdGhlIHRlbXBsYXRlIGFzIGZyZWUgdmFyaWFibGVzLlxuICAgICAqIEBwYXJhbSB7UmVnRXhwfSBbb3B0aW9ucy5pbnRlcnBvbGF0ZT1fLnRlbXBsYXRlU2V0dGluZ3MuaW50ZXJwb2xhdGVdXG4gICAgICogIFRoZSBcImludGVycG9sYXRlXCIgZGVsaW1pdGVyLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5zb3VyY2VVUkw9J2xvZGFzaC50ZW1wbGF0ZVNvdXJjZXNbbl0nXVxuICAgICAqICBUaGUgc291cmNlVVJMIG9mIHRoZSBjb21waWxlZCB0ZW1wbGF0ZS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMudmFyaWFibGU9J29iaiddXG4gICAgICogIFRoZSBkYXRhIG9iamVjdCB2YXJpYWJsZSBuYW1lLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBjb21waWxlZCB0ZW1wbGF0ZSBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogLy8gVXNlIHRoZSBcImludGVycG9sYXRlXCIgZGVsaW1pdGVyIHRvIGNyZWF0ZSBhIGNvbXBpbGVkIHRlbXBsYXRlLlxuICAgICAqIHZhciBjb21waWxlZCA9IF8udGVtcGxhdGUoJ2hlbGxvIDwlPSB1c2VyICU+IScpO1xuICAgICAqIGNvbXBpbGVkKHsgJ3VzZXInOiAnZnJlZCcgfSk7XG4gICAgICogLy8gPT4gJ2hlbGxvIGZyZWQhJ1xuICAgICAqXG4gICAgICogLy8gVXNlIHRoZSBIVE1MIFwiZXNjYXBlXCIgZGVsaW1pdGVyIHRvIGVzY2FwZSBkYXRhIHByb3BlcnR5IHZhbHVlcy5cbiAgICAgKiB2YXIgY29tcGlsZWQgPSBfLnRlbXBsYXRlKCc8Yj48JS0gdmFsdWUgJT48L2I+Jyk7XG4gICAgICogY29tcGlsZWQoeyAndmFsdWUnOiAnPHNjcmlwdD4nIH0pO1xuICAgICAqIC8vID0+ICc8Yj4mbHQ7c2NyaXB0Jmd0OzwvYj4nXG4gICAgICpcbiAgICAgKiAvLyBVc2UgdGhlIFwiZXZhbHVhdGVcIiBkZWxpbWl0ZXIgdG8gZXhlY3V0ZSBKYXZhU2NyaXB0IGFuZCBnZW5lcmF0ZSBIVE1MLlxuICAgICAqIHZhciBjb21waWxlZCA9IF8udGVtcGxhdGUoJzwlIF8uZm9yRWFjaCh1c2VycywgZnVuY3Rpb24odXNlcikgeyAlPjxsaT48JS0gdXNlciAlPjwvbGk+PCUgfSk7ICU+Jyk7XG4gICAgICogY29tcGlsZWQoeyAndXNlcnMnOiBbJ2ZyZWQnLCAnYmFybmV5J10gfSk7XG4gICAgICogLy8gPT4gJzxsaT5mcmVkPC9saT48bGk+YmFybmV5PC9saT4nXG4gICAgICpcbiAgICAgKiAvLyBVc2UgdGhlIGludGVybmFsIGBwcmludGAgZnVuY3Rpb24gaW4gXCJldmFsdWF0ZVwiIGRlbGltaXRlcnMuXG4gICAgICogdmFyIGNvbXBpbGVkID0gXy50ZW1wbGF0ZSgnPCUgcHJpbnQoXCJoZWxsbyBcIiArIHVzZXIpOyAlPiEnKTtcbiAgICAgKiBjb21waWxlZCh7ICd1c2VyJzogJ2Jhcm5leScgfSk7XG4gICAgICogLy8gPT4gJ2hlbGxvIGJhcm5leSEnXG4gICAgICpcbiAgICAgKiAvLyBVc2UgdGhlIEVTIHRlbXBsYXRlIGxpdGVyYWwgZGVsaW1pdGVyIGFzIGFuIFwiaW50ZXJwb2xhdGVcIiBkZWxpbWl0ZXIuXG4gICAgICogLy8gRGlzYWJsZSBzdXBwb3J0IGJ5IHJlcGxhY2luZyB0aGUgXCJpbnRlcnBvbGF0ZVwiIGRlbGltaXRlci5cbiAgICAgKiB2YXIgY29tcGlsZWQgPSBfLnRlbXBsYXRlKCdoZWxsbyAkeyB1c2VyIH0hJyk7XG4gICAgICogY29tcGlsZWQoeyAndXNlcic6ICdwZWJibGVzJyB9KTtcbiAgICAgKiAvLyA9PiAnaGVsbG8gcGViYmxlcyEnXG4gICAgICpcbiAgICAgKiAvLyBVc2UgYmFja3NsYXNoZXMgdG8gdHJlYXQgZGVsaW1pdGVycyBhcyBwbGFpbiB0ZXh0LlxuICAgICAqIHZhciBjb21waWxlZCA9IF8udGVtcGxhdGUoJzwlPSBcIlxcXFw8JS0gdmFsdWUgJVxcXFw+XCIgJT4nKTtcbiAgICAgKiBjb21waWxlZCh7ICd2YWx1ZSc6ICdpZ25vcmVkJyB9KTtcbiAgICAgKiAvLyA9PiAnPCUtIHZhbHVlICU+J1xuICAgICAqXG4gICAgICogLy8gVXNlIHRoZSBgaW1wb3J0c2Agb3B0aW9uIHRvIGltcG9ydCBgalF1ZXJ5YCBhcyBganFgLlxuICAgICAqIHZhciB0ZXh0ID0gJzwlIGpxLmVhY2godXNlcnMsIGZ1bmN0aW9uKHVzZXIpIHsgJT48bGk+PCUtIHVzZXIgJT48L2xpPjwlIH0pOyAlPic7XG4gICAgICogdmFyIGNvbXBpbGVkID0gXy50ZW1wbGF0ZSh0ZXh0LCB7ICdpbXBvcnRzJzogeyAnanEnOiBqUXVlcnkgfSB9KTtcbiAgICAgKiBjb21waWxlZCh7ICd1c2Vycyc6IFsnZnJlZCcsICdiYXJuZXknXSB9KTtcbiAgICAgKiAvLyA9PiAnPGxpPmZyZWQ8L2xpPjxsaT5iYXJuZXk8L2xpPidcbiAgICAgKlxuICAgICAqIC8vIFVzZSB0aGUgYHNvdXJjZVVSTGAgb3B0aW9uIHRvIHNwZWNpZnkgYSBjdXN0b20gc291cmNlVVJMIGZvciB0aGUgdGVtcGxhdGUuXG4gICAgICogdmFyIGNvbXBpbGVkID0gXy50ZW1wbGF0ZSgnaGVsbG8gPCU9IHVzZXIgJT4hJywgeyAnc291cmNlVVJMJzogJy9iYXNpYy9ncmVldGluZy5qc3QnIH0pO1xuICAgICAqIGNvbXBpbGVkKGRhdGEpO1xuICAgICAqIC8vID0+IEZpbmQgdGhlIHNvdXJjZSBvZiBcImdyZWV0aW5nLmpzdFwiIHVuZGVyIHRoZSBTb3VyY2VzIHRhYiBvciBSZXNvdXJjZXMgcGFuZWwgb2YgdGhlIHdlYiBpbnNwZWN0b3IuXG4gICAgICpcbiAgICAgKiAvLyBVc2UgdGhlIGB2YXJpYWJsZWAgb3B0aW9uIHRvIGVuc3VyZSBhIHdpdGgtc3RhdGVtZW50IGlzbid0IHVzZWQgaW4gdGhlIGNvbXBpbGVkIHRlbXBsYXRlLlxuICAgICAqIHZhciBjb21waWxlZCA9IF8udGVtcGxhdGUoJ2hpIDwlPSBkYXRhLnVzZXIgJT4hJywgeyAndmFyaWFibGUnOiAnZGF0YScgfSk7XG4gICAgICogY29tcGlsZWQuc291cmNlO1xuICAgICAqIC8vID0+IGZ1bmN0aW9uKGRhdGEpIHtcbiAgICAgKiAvLyAgIHZhciBfX3QsIF9fcCA9ICcnO1xuICAgICAqIC8vICAgX19wICs9ICdoaSAnICsgKChfX3QgPSAoIGRhdGEudXNlciApKSA9PSBudWxsID8gJycgOiBfX3QpICsgJyEnO1xuICAgICAqIC8vICAgcmV0dXJuIF9fcDtcbiAgICAgKiAvLyB9XG4gICAgICpcbiAgICAgKiAvLyBVc2UgY3VzdG9tIHRlbXBsYXRlIGRlbGltaXRlcnMuXG4gICAgICogXy50ZW1wbGF0ZVNldHRpbmdzLmludGVycG9sYXRlID0gL3t7KFtcXHNcXFNdKz8pfX0vZztcbiAgICAgKiB2YXIgY29tcGlsZWQgPSBfLnRlbXBsYXRlKCdoZWxsbyB7eyB1c2VyIH19IScpO1xuICAgICAqIGNvbXBpbGVkKHsgJ3VzZXInOiAnbXVzdGFjaGUnIH0pO1xuICAgICAqIC8vID0+ICdoZWxsbyBtdXN0YWNoZSEnXG4gICAgICpcbiAgICAgKiAvLyBVc2UgdGhlIGBzb3VyY2VgIHByb3BlcnR5IHRvIGlubGluZSBjb21waWxlZCB0ZW1wbGF0ZXMgZm9yIG1lYW5pbmdmdWxcbiAgICAgKiAvLyBsaW5lIG51bWJlcnMgaW4gZXJyb3IgbWVzc2FnZXMgYW5kIHN0YWNrIHRyYWNlcy5cbiAgICAgKiBmcy53cml0ZUZpbGVTeW5jKHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCAnanN0LmpzJyksICdcXFxuICAgICAqICAgdmFyIEpTVCA9IHtcXFxuICAgICAqICAgICBcIm1haW5cIjogJyArIF8udGVtcGxhdGUobWFpblRleHQpLnNvdXJjZSArICdcXFxuICAgICAqICAgfTtcXFxuICAgICAqICcpO1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRlbXBsYXRlKHN0cmluZywgb3B0aW9ucywgZ3VhcmQpIHtcbiAgICAgIC8vIEJhc2VkIG9uIEpvaG4gUmVzaWcncyBgdG1wbGAgaW1wbGVtZW50YXRpb25cbiAgICAgIC8vIChodHRwOi8vZWpvaG4ub3JnL2Jsb2cvamF2YXNjcmlwdC1taWNyby10ZW1wbGF0aW5nLylcbiAgICAgIC8vIGFuZCBMYXVyYSBEb2t0b3JvdmEncyBkb1QuanMgKGh0dHBzOi8vZ2l0aHViLmNvbS9vbGFkby9kb1QpLlxuICAgICAgdmFyIHNldHRpbmdzID0gbG9kYXNoLnRlbXBsYXRlU2V0dGluZ3M7XG5cbiAgICAgIGlmIChndWFyZCAmJiBpc0l0ZXJhdGVlQ2FsbChzdHJpbmcsIG9wdGlvbnMsIGd1YXJkKSkge1xuICAgICAgICBvcHRpb25zID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgc3RyaW5nID0gdG9TdHJpbmcoc3RyaW5nKTtcbiAgICAgIG9wdGlvbnMgPSBhc3NpZ25JbldpdGgoe30sIG9wdGlvbnMsIHNldHRpbmdzLCBjdXN0b21EZWZhdWx0c0Fzc2lnbkluKTtcblxuICAgICAgdmFyIGltcG9ydHMgPSBhc3NpZ25JbldpdGgoe30sIG9wdGlvbnMuaW1wb3J0cywgc2V0dGluZ3MuaW1wb3J0cywgY3VzdG9tRGVmYXVsdHNBc3NpZ25JbiksXG4gICAgICAgICAgaW1wb3J0c0tleXMgPSBrZXlzKGltcG9ydHMpLFxuICAgICAgICAgIGltcG9ydHNWYWx1ZXMgPSBiYXNlVmFsdWVzKGltcG9ydHMsIGltcG9ydHNLZXlzKTtcblxuICAgICAgdmFyIGlzRXNjYXBpbmcsXG4gICAgICAgICAgaXNFdmFsdWF0aW5nLFxuICAgICAgICAgIGluZGV4ID0gMCxcbiAgICAgICAgICBpbnRlcnBvbGF0ZSA9IG9wdGlvbnMuaW50ZXJwb2xhdGUgfHwgcmVOb01hdGNoLFxuICAgICAgICAgIHNvdXJjZSA9IFwiX19wICs9ICdcIjtcblxuICAgICAgLy8gQ29tcGlsZSB0aGUgcmVnZXhwIHRvIG1hdGNoIGVhY2ggZGVsaW1pdGVyLlxuICAgICAgdmFyIHJlRGVsaW1pdGVycyA9IFJlZ0V4cChcbiAgICAgICAgKG9wdGlvbnMuZXNjYXBlIHx8IHJlTm9NYXRjaCkuc291cmNlICsgJ3wnICtcbiAgICAgICAgaW50ZXJwb2xhdGUuc291cmNlICsgJ3wnICtcbiAgICAgICAgKGludGVycG9sYXRlID09PSByZUludGVycG9sYXRlID8gcmVFc1RlbXBsYXRlIDogcmVOb01hdGNoKS5zb3VyY2UgKyAnfCcgK1xuICAgICAgICAob3B0aW9ucy5ldmFsdWF0ZSB8fCByZU5vTWF0Y2gpLnNvdXJjZSArICd8JCdcbiAgICAgICwgJ2cnKTtcblxuICAgICAgLy8gVXNlIGEgc291cmNlVVJMIGZvciBlYXNpZXIgZGVidWdnaW5nLlxuICAgICAgLy8gVGhlIHNvdXJjZVVSTCBnZXRzIGluamVjdGVkIGludG8gdGhlIHNvdXJjZSB0aGF0J3MgZXZhbC1lZCwgc28gYmUgY2FyZWZ1bFxuICAgICAgLy8gdG8gbm9ybWFsaXplIGFsbCBraW5kcyBvZiB3aGl0ZXNwYWNlLCBzbyBlLmcuIG5ld2xpbmVzIChhbmQgdW5pY29kZSB2ZXJzaW9ucyBvZiBpdCkgY2FuJ3Qgc25lYWsgaW5cbiAgICAgIC8vIGFuZCBlc2NhcGUgdGhlIGNvbW1lbnQsIHRodXMgaW5qZWN0aW5nIGNvZGUgdGhhdCBnZXRzIGV2YWxlZC5cbiAgICAgIHZhciBzb3VyY2VVUkwgPSAnLy8jIHNvdXJjZVVSTD0nICtcbiAgICAgICAgKGhhc093blByb3BlcnR5LmNhbGwob3B0aW9ucywgJ3NvdXJjZVVSTCcpXG4gICAgICAgICAgPyAob3B0aW9ucy5zb3VyY2VVUkwgKyAnJykucmVwbGFjZSgvXFxzL2csICcgJylcbiAgICAgICAgICA6ICgnbG9kYXNoLnRlbXBsYXRlU291cmNlc1snICsgKCsrdGVtcGxhdGVDb3VudGVyKSArICddJylcbiAgICAgICAgKSArICdcXG4nO1xuXG4gICAgICBzdHJpbmcucmVwbGFjZShyZURlbGltaXRlcnMsIGZ1bmN0aW9uKG1hdGNoLCBlc2NhcGVWYWx1ZSwgaW50ZXJwb2xhdGVWYWx1ZSwgZXNUZW1wbGF0ZVZhbHVlLCBldmFsdWF0ZVZhbHVlLCBvZmZzZXQpIHtcbiAgICAgICAgaW50ZXJwb2xhdGVWYWx1ZSB8fCAoaW50ZXJwb2xhdGVWYWx1ZSA9IGVzVGVtcGxhdGVWYWx1ZSk7XG5cbiAgICAgICAgLy8gRXNjYXBlIGNoYXJhY3RlcnMgdGhhdCBjYW4ndCBiZSBpbmNsdWRlZCBpbiBzdHJpbmcgbGl0ZXJhbHMuXG4gICAgICAgIHNvdXJjZSArPSBzdHJpbmcuc2xpY2UoaW5kZXgsIG9mZnNldCkucmVwbGFjZShyZVVuZXNjYXBlZFN0cmluZywgZXNjYXBlU3RyaW5nQ2hhcik7XG5cbiAgICAgICAgLy8gUmVwbGFjZSBkZWxpbWl0ZXJzIHdpdGggc25pcHBldHMuXG4gICAgICAgIGlmIChlc2NhcGVWYWx1ZSkge1xuICAgICAgICAgIGlzRXNjYXBpbmcgPSB0cnVlO1xuICAgICAgICAgIHNvdXJjZSArPSBcIicgK1xcbl9fZShcIiArIGVzY2FwZVZhbHVlICsgXCIpICtcXG4nXCI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV2YWx1YXRlVmFsdWUpIHtcbiAgICAgICAgICBpc0V2YWx1YXRpbmcgPSB0cnVlO1xuICAgICAgICAgIHNvdXJjZSArPSBcIic7XFxuXCIgKyBldmFsdWF0ZVZhbHVlICsgXCI7XFxuX19wICs9ICdcIjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW50ZXJwb2xhdGVWYWx1ZSkge1xuICAgICAgICAgIHNvdXJjZSArPSBcIicgK1xcbigoX190ID0gKFwiICsgaW50ZXJwb2xhdGVWYWx1ZSArIFwiKSkgPT0gbnVsbCA/ICcnIDogX190KSArXFxuJ1wiO1xuICAgICAgICB9XG4gICAgICAgIGluZGV4ID0gb2Zmc2V0ICsgbWF0Y2gubGVuZ3RoO1xuXG4gICAgICAgIC8vIFRoZSBKUyBlbmdpbmUgZW1iZWRkZWQgaW4gQWRvYmUgcHJvZHVjdHMgbmVlZHMgYG1hdGNoYCByZXR1cm5lZCBpblxuICAgICAgICAvLyBvcmRlciB0byBwcm9kdWNlIHRoZSBjb3JyZWN0IGBvZmZzZXRgIHZhbHVlLlxuICAgICAgICByZXR1cm4gbWF0Y2g7XG4gICAgICB9KTtcblxuICAgICAgc291cmNlICs9IFwiJztcXG5cIjtcblxuICAgICAgLy8gSWYgYHZhcmlhYmxlYCBpcyBub3Qgc3BlY2lmaWVkIHdyYXAgYSB3aXRoLXN0YXRlbWVudCBhcm91bmQgdGhlIGdlbmVyYXRlZFxuICAgICAgLy8gY29kZSB0byBhZGQgdGhlIGRhdGEgb2JqZWN0IHRvIHRoZSB0b3Agb2YgdGhlIHNjb3BlIGNoYWluLlxuICAgICAgdmFyIHZhcmlhYmxlID0gaGFzT3duUHJvcGVydHkuY2FsbChvcHRpb25zLCAndmFyaWFibGUnKSAmJiBvcHRpb25zLnZhcmlhYmxlO1xuICAgICAgaWYgKCF2YXJpYWJsZSkge1xuICAgICAgICBzb3VyY2UgPSAnd2l0aCAob2JqKSB7XFxuJyArIHNvdXJjZSArICdcXG59XFxuJztcbiAgICAgIH1cbiAgICAgIC8vIFRocm93IGFuIGVycm9yIGlmIGEgZm9yYmlkZGVuIGNoYXJhY3RlciB3YXMgZm91bmQgaW4gYHZhcmlhYmxlYCwgdG8gcHJldmVudFxuICAgICAgLy8gcG90ZW50aWFsIGNvbW1hbmQgaW5qZWN0aW9uIGF0dGFja3MuXG4gICAgICBlbHNlIGlmIChyZUZvcmJpZGRlbklkZW50aWZpZXJDaGFycy50ZXN0KHZhcmlhYmxlKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoSU5WQUxJRF9URU1QTF9WQVJfRVJST1JfVEVYVCk7XG4gICAgICB9XG5cbiAgICAgIC8vIENsZWFudXAgY29kZSBieSBzdHJpcHBpbmcgZW1wdHkgc3RyaW5ncy5cbiAgICAgIHNvdXJjZSA9IChpc0V2YWx1YXRpbmcgPyBzb3VyY2UucmVwbGFjZShyZUVtcHR5U3RyaW5nTGVhZGluZywgJycpIDogc291cmNlKVxuICAgICAgICAucmVwbGFjZShyZUVtcHR5U3RyaW5nTWlkZGxlLCAnJDEnKVxuICAgICAgICAucmVwbGFjZShyZUVtcHR5U3RyaW5nVHJhaWxpbmcsICckMTsnKTtcblxuICAgICAgLy8gRnJhbWUgY29kZSBhcyB0aGUgZnVuY3Rpb24gYm9keS5cbiAgICAgIHNvdXJjZSA9ICdmdW5jdGlvbignICsgKHZhcmlhYmxlIHx8ICdvYmonKSArICcpIHtcXG4nICtcbiAgICAgICAgKHZhcmlhYmxlXG4gICAgICAgICAgPyAnJ1xuICAgICAgICAgIDogJ29iaiB8fCAob2JqID0ge30pO1xcbidcbiAgICAgICAgKSArXG4gICAgICAgIFwidmFyIF9fdCwgX19wID0gJydcIiArXG4gICAgICAgIChpc0VzY2FwaW5nXG4gICAgICAgICAgID8gJywgX19lID0gXy5lc2NhcGUnXG4gICAgICAgICAgIDogJydcbiAgICAgICAgKSArXG4gICAgICAgIChpc0V2YWx1YXRpbmdcbiAgICAgICAgICA/ICcsIF9faiA9IEFycmF5LnByb3RvdHlwZS5qb2luO1xcbicgK1xuICAgICAgICAgICAgXCJmdW5jdGlvbiBwcmludCgpIHsgX19wICs9IF9fai5jYWxsKGFyZ3VtZW50cywgJycpIH1cXG5cIlxuICAgICAgICAgIDogJztcXG4nXG4gICAgICAgICkgK1xuICAgICAgICBzb3VyY2UgK1xuICAgICAgICAncmV0dXJuIF9fcFxcbn0nO1xuXG4gICAgICB2YXIgcmVzdWx0ID0gYXR0ZW1wdChmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIEZ1bmN0aW9uKGltcG9ydHNLZXlzLCBzb3VyY2VVUkwgKyAncmV0dXJuICcgKyBzb3VyY2UpXG4gICAgICAgICAgLmFwcGx5KHVuZGVmaW5lZCwgaW1wb3J0c1ZhbHVlcyk7XG4gICAgICB9KTtcblxuICAgICAgLy8gUHJvdmlkZSB0aGUgY29tcGlsZWQgZnVuY3Rpb24ncyBzb3VyY2UgYnkgaXRzIGB0b1N0cmluZ2AgbWV0aG9kIG9yXG4gICAgICAvLyB0aGUgYHNvdXJjZWAgcHJvcGVydHkgYXMgYSBjb252ZW5pZW5jZSBmb3IgaW5saW5pbmcgY29tcGlsZWQgdGVtcGxhdGVzLlxuICAgICAgcmVzdWx0LnNvdXJjZSA9IHNvdXJjZTtcbiAgICAgIGlmIChpc0Vycm9yKHJlc3VsdCkpIHtcbiAgICAgICAgdGhyb3cgcmVzdWx0O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgc3RyaW5nYCwgYXMgYSB3aG9sZSwgdG8gbG93ZXIgY2FzZSBqdXN0IGxpa2VcbiAgICAgKiBbU3RyaW5nI3RvTG93ZXJDYXNlXShodHRwczovL21kbi5pby90b0xvd2VyQ2FzZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBsb3dlciBjYXNlZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udG9Mb3dlcignLS1Gb28tQmFyLS0nKTtcbiAgICAgKiAvLyA9PiAnLS1mb28tYmFyLS0nXG4gICAgICpcbiAgICAgKiBfLnRvTG93ZXIoJ2Zvb0JhcicpO1xuICAgICAqIC8vID0+ICdmb29iYXInXG4gICAgICpcbiAgICAgKiBfLnRvTG93ZXIoJ19fRk9PX0JBUl9fJyk7XG4gICAgICogLy8gPT4gJ19fZm9vX2Jhcl9fJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRvTG93ZXIodmFsdWUpIHtcbiAgICAgIHJldHVybiB0b1N0cmluZyh2YWx1ZSkudG9Mb3dlckNhc2UoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgc3RyaW5nYCwgYXMgYSB3aG9sZSwgdG8gdXBwZXIgY2FzZSBqdXN0IGxpa2VcbiAgICAgKiBbU3RyaW5nI3RvVXBwZXJDYXNlXShodHRwczovL21kbi5pby90b1VwcGVyQ2FzZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gY29udmVydC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSB1cHBlciBjYXNlZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udG9VcHBlcignLS1mb28tYmFyLS0nKTtcbiAgICAgKiAvLyA9PiAnLS1GT08tQkFSLS0nXG4gICAgICpcbiAgICAgKiBfLnRvVXBwZXIoJ2Zvb0JhcicpO1xuICAgICAqIC8vID0+ICdGT09CQVInXG4gICAgICpcbiAgICAgKiBfLnRvVXBwZXIoJ19fZm9vX2Jhcl9fJyk7XG4gICAgICogLy8gPT4gJ19fRk9PX0JBUl9fJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRvVXBwZXIodmFsdWUpIHtcbiAgICAgIHJldHVybiB0b1N0cmluZyh2YWx1ZSkudG9VcHBlckNhc2UoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2Ugb3Igc3BlY2lmaWVkIGNoYXJhY3RlcnMgZnJvbSBgc3RyaW5nYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byB0cmltLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbY2hhcnM9d2hpdGVzcGFjZV0gVGhlIGNoYXJhY3RlcnMgdG8gdHJpbS5cbiAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHRyaW1tZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRyaW0oJyAgYWJjICAnKTtcbiAgICAgKiAvLyA9PiAnYWJjJ1xuICAgICAqXG4gICAgICogXy50cmltKCctXy1hYmMtXy0nLCAnXy0nKTtcbiAgICAgKiAvLyA9PiAnYWJjJ1xuICAgICAqXG4gICAgICogXy5tYXAoWycgIGZvbyAgJywgJyAgYmFyICAnXSwgXy50cmltKTtcbiAgICAgKiAvLyA9PiBbJ2ZvbycsICdiYXInXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRyaW0oc3RyaW5nLCBjaGFycywgZ3VhcmQpIHtcbiAgICAgIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7XG4gICAgICBpZiAoc3RyaW5nICYmIChndWFyZCB8fCBjaGFycyA9PT0gdW5kZWZpbmVkKSkge1xuICAgICAgICByZXR1cm4gYmFzZVRyaW0oc3RyaW5nKTtcbiAgICAgIH1cbiAgICAgIGlmICghc3RyaW5nIHx8ICEoY2hhcnMgPSBiYXNlVG9TdHJpbmcoY2hhcnMpKSkge1xuICAgICAgICByZXR1cm4gc3RyaW5nO1xuICAgICAgfVxuICAgICAgdmFyIHN0clN5bWJvbHMgPSBzdHJpbmdUb0FycmF5KHN0cmluZyksXG4gICAgICAgICAgY2hyU3ltYm9scyA9IHN0cmluZ1RvQXJyYXkoY2hhcnMpLFxuICAgICAgICAgIHN0YXJ0ID0gY2hhcnNTdGFydEluZGV4KHN0clN5bWJvbHMsIGNoclN5bWJvbHMpLFxuICAgICAgICAgIGVuZCA9IGNoYXJzRW5kSW5kZXgoc3RyU3ltYm9scywgY2hyU3ltYm9scykgKyAxO1xuXG4gICAgICByZXR1cm4gY2FzdFNsaWNlKHN0clN5bWJvbHMsIHN0YXJ0LCBlbmQpLmpvaW4oJycpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgdHJhaWxpbmcgd2hpdGVzcGFjZSBvciBzcGVjaWZpZWQgY2hhcmFjdGVycyBmcm9tIGBzdHJpbmdgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIHRyaW0uXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtjaGFycz13aGl0ZXNwYWNlXSBUaGUgY2hhcmFjdGVycyB0byB0cmltLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgdHJpbW1lZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udHJpbUVuZCgnICBhYmMgICcpO1xuICAgICAqIC8vID0+ICcgIGFiYydcbiAgICAgKlxuICAgICAqIF8udHJpbUVuZCgnLV8tYWJjLV8tJywgJ18tJyk7XG4gICAgICogLy8gPT4gJy1fLWFiYydcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0cmltRW5kKHN0cmluZywgY2hhcnMsIGd1YXJkKSB7XG4gICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuICAgICAgaWYgKHN0cmluZyAmJiAoZ3VhcmQgfHwgY2hhcnMgPT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgcmV0dXJuIHN0cmluZy5zbGljZSgwLCB0cmltbWVkRW5kSW5kZXgoc3RyaW5nKSArIDEpO1xuICAgICAgfVxuICAgICAgaWYgKCFzdHJpbmcgfHwgIShjaGFycyA9IGJhc2VUb1N0cmluZyhjaGFycykpKSB7XG4gICAgICAgIHJldHVybiBzdHJpbmc7XG4gICAgICB9XG4gICAgICB2YXIgc3RyU3ltYm9scyA9IHN0cmluZ1RvQXJyYXkoc3RyaW5nKSxcbiAgICAgICAgICBlbmQgPSBjaGFyc0VuZEluZGV4KHN0clN5bWJvbHMsIHN0cmluZ1RvQXJyYXkoY2hhcnMpKSArIDE7XG5cbiAgICAgIHJldHVybiBjYXN0U2xpY2Uoc3RyU3ltYm9scywgMCwgZW5kKS5qb2luKCcnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGxlYWRpbmcgd2hpdGVzcGFjZSBvciBzcGVjaWZpZWQgY2hhcmFjdGVycyBmcm9tIGBzdHJpbmdgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIHRyaW0uXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtjaGFycz13aGl0ZXNwYWNlXSBUaGUgY2hhcmFjdGVycyB0byB0cmltLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgdHJpbW1lZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udHJpbVN0YXJ0KCcgIGFiYyAgJyk7XG4gICAgICogLy8gPT4gJ2FiYyAgJ1xuICAgICAqXG4gICAgICogXy50cmltU3RhcnQoJy1fLWFiYy1fLScsICdfLScpO1xuICAgICAqIC8vID0+ICdhYmMtXy0nXG4gICAgICovXG4gICAgZnVuY3Rpb24gdHJpbVN0YXJ0KHN0cmluZywgY2hhcnMsIGd1YXJkKSB7XG4gICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuICAgICAgaWYgKHN0cmluZyAmJiAoZ3VhcmQgfHwgY2hhcnMgPT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKHJlVHJpbVN0YXJ0LCAnJyk7XG4gICAgICB9XG4gICAgICBpZiAoIXN0cmluZyB8fCAhKGNoYXJzID0gYmFzZVRvU3RyaW5nKGNoYXJzKSkpIHtcbiAgICAgICAgcmV0dXJuIHN0cmluZztcbiAgICAgIH1cbiAgICAgIHZhciBzdHJTeW1ib2xzID0gc3RyaW5nVG9BcnJheShzdHJpbmcpLFxuICAgICAgICAgIHN0YXJ0ID0gY2hhcnNTdGFydEluZGV4KHN0clN5bWJvbHMsIHN0cmluZ1RvQXJyYXkoY2hhcnMpKTtcblxuICAgICAgcmV0dXJuIGNhc3RTbGljZShzdHJTeW1ib2xzLCBzdGFydCkuam9pbignJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVHJ1bmNhdGVzIGBzdHJpbmdgIGlmIGl0J3MgbG9uZ2VyIHRoYW4gdGhlIGdpdmVuIG1heGltdW0gc3RyaW5nIGxlbmd0aC5cbiAgICAgKiBUaGUgbGFzdCBjaGFyYWN0ZXJzIG9mIHRoZSB0cnVuY2F0ZWQgc3RyaW5nIGFyZSByZXBsYWNlZCB3aXRoIHRoZSBvbWlzc2lvblxuICAgICAqIHN0cmluZyB3aGljaCBkZWZhdWx0cyB0byBcIi4uLlwiLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIHRydW5jYXRlLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV0gVGhlIG9wdGlvbnMgb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5sZW5ndGg9MzBdIFRoZSBtYXhpbXVtIHN0cmluZyBsZW5ndGguXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLm9taXNzaW9uPScuLi4nXSBUaGUgc3RyaW5nIHRvIGluZGljYXRlIHRleHQgaXMgb21pdHRlZC5cbiAgICAgKiBAcGFyYW0ge1JlZ0V4cHxzdHJpbmd9IFtvcHRpb25zLnNlcGFyYXRvcl0gVGhlIHNlcGFyYXRvciBwYXR0ZXJuIHRvIHRydW5jYXRlIHRvLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHRydW5jYXRlZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udHJ1bmNhdGUoJ2hpLWRpZGRseS1obyB0aGVyZSwgbmVpZ2hib3Jpbm8nKTtcbiAgICAgKiAvLyA9PiAnaGktZGlkZGx5LWhvIHRoZXJlLCBuZWlnaGJvLi4uJ1xuICAgICAqXG4gICAgICogXy50cnVuY2F0ZSgnaGktZGlkZGx5LWhvIHRoZXJlLCBuZWlnaGJvcmlubycsIHtcbiAgICAgKiAgICdsZW5ndGgnOiAyNCxcbiAgICAgKiAgICdzZXBhcmF0b3InOiAnICdcbiAgICAgKiB9KTtcbiAgICAgKiAvLyA9PiAnaGktZGlkZGx5LWhvIHRoZXJlLC4uLidcbiAgICAgKlxuICAgICAqIF8udHJ1bmNhdGUoJ2hpLWRpZGRseS1obyB0aGVyZSwgbmVpZ2hib3Jpbm8nLCB7XG4gICAgICogICAnbGVuZ3RoJzogMjQsXG4gICAgICogICAnc2VwYXJhdG9yJzogLyw/ICsvXG4gICAgICogfSk7XG4gICAgICogLy8gPT4gJ2hpLWRpZGRseS1obyB0aGVyZS4uLidcbiAgICAgKlxuICAgICAqIF8udHJ1bmNhdGUoJ2hpLWRpZGRseS1obyB0aGVyZSwgbmVpZ2hib3Jpbm8nLCB7XG4gICAgICogICAnb21pc3Npb24nOiAnIFsuLi5dJ1xuICAgICAqIH0pO1xuICAgICAqIC8vID0+ICdoaS1kaWRkbHktaG8gdGhlcmUsIG5laWcgWy4uLl0nXG4gICAgICovXG4gICAgZnVuY3Rpb24gdHJ1bmNhdGUoc3RyaW5nLCBvcHRpb25zKSB7XG4gICAgICB2YXIgbGVuZ3RoID0gREVGQVVMVF9UUlVOQ19MRU5HVEgsXG4gICAgICAgICAgb21pc3Npb24gPSBERUZBVUxUX1RSVU5DX09NSVNTSU9OO1xuXG4gICAgICBpZiAoaXNPYmplY3Qob3B0aW9ucykpIHtcbiAgICAgICAgdmFyIHNlcGFyYXRvciA9ICdzZXBhcmF0b3InIGluIG9wdGlvbnMgPyBvcHRpb25zLnNlcGFyYXRvciA6IHNlcGFyYXRvcjtcbiAgICAgICAgbGVuZ3RoID0gJ2xlbmd0aCcgaW4gb3B0aW9ucyA/IHRvSW50ZWdlcihvcHRpb25zLmxlbmd0aCkgOiBsZW5ndGg7XG4gICAgICAgIG9taXNzaW9uID0gJ29taXNzaW9uJyBpbiBvcHRpb25zID8gYmFzZVRvU3RyaW5nKG9wdGlvbnMub21pc3Npb24pIDogb21pc3Npb247XG4gICAgICB9XG4gICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuXG4gICAgICB2YXIgc3RyTGVuZ3RoID0gc3RyaW5nLmxlbmd0aDtcbiAgICAgIGlmIChoYXNVbmljb2RlKHN0cmluZykpIHtcbiAgICAgICAgdmFyIHN0clN5bWJvbHMgPSBzdHJpbmdUb0FycmF5KHN0cmluZyk7XG4gICAgICAgIHN0ckxlbmd0aCA9IHN0clN5bWJvbHMubGVuZ3RoO1xuICAgICAgfVxuICAgICAgaWYgKGxlbmd0aCA+PSBzdHJMZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIHN0cmluZztcbiAgICAgIH1cbiAgICAgIHZhciBlbmQgPSBsZW5ndGggLSBzdHJpbmdTaXplKG9taXNzaW9uKTtcbiAgICAgIGlmIChlbmQgPCAxKSB7XG4gICAgICAgIHJldHVybiBvbWlzc2lvbjtcbiAgICAgIH1cbiAgICAgIHZhciByZXN1bHQgPSBzdHJTeW1ib2xzXG4gICAgICAgID8gY2FzdFNsaWNlKHN0clN5bWJvbHMsIDAsIGVuZCkuam9pbignJylcbiAgICAgICAgOiBzdHJpbmcuc2xpY2UoMCwgZW5kKTtcblxuICAgICAgaWYgKHNlcGFyYXRvciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQgKyBvbWlzc2lvbjtcbiAgICAgIH1cbiAgICAgIGlmIChzdHJTeW1ib2xzKSB7XG4gICAgICAgIGVuZCArPSAocmVzdWx0Lmxlbmd0aCAtIGVuZCk7XG4gICAgICB9XG4gICAgICBpZiAoaXNSZWdFeHAoc2VwYXJhdG9yKSkge1xuICAgICAgICBpZiAoc3RyaW5nLnNsaWNlKGVuZCkuc2VhcmNoKHNlcGFyYXRvcikpIHtcbiAgICAgICAgICB2YXIgbWF0Y2gsXG4gICAgICAgICAgICAgIHN1YnN0cmluZyA9IHJlc3VsdDtcblxuICAgICAgICAgIGlmICghc2VwYXJhdG9yLmdsb2JhbCkge1xuICAgICAgICAgICAgc2VwYXJhdG9yID0gUmVnRXhwKHNlcGFyYXRvci5zb3VyY2UsIHRvU3RyaW5nKHJlRmxhZ3MuZXhlYyhzZXBhcmF0b3IpKSArICdnJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHNlcGFyYXRvci5sYXN0SW5kZXggPSAwO1xuICAgICAgICAgIHdoaWxlICgobWF0Y2ggPSBzZXBhcmF0b3IuZXhlYyhzdWJzdHJpbmcpKSkge1xuICAgICAgICAgICAgdmFyIG5ld0VuZCA9IG1hdGNoLmluZGV4O1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXN1bHQgPSByZXN1bHQuc2xpY2UoMCwgbmV3RW5kID09PSB1bmRlZmluZWQgPyBlbmQgOiBuZXdFbmQpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHN0cmluZy5pbmRleE9mKGJhc2VUb1N0cmluZyhzZXBhcmF0b3IpLCBlbmQpICE9IGVuZCkge1xuICAgICAgICB2YXIgaW5kZXggPSByZXN1bHQubGFzdEluZGV4T2Yoc2VwYXJhdG9yKTtcbiAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgICAgICByZXN1bHQgPSByZXN1bHQuc2xpY2UoMCwgaW5kZXgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0ICsgb21pc3Npb247XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGludmVyc2Ugb2YgYF8uZXNjYXBlYDsgdGhpcyBtZXRob2QgY29udmVydHMgdGhlIEhUTUwgZW50aXRpZXNcbiAgICAgKiBgJmFtcDtgLCBgJmx0O2AsIGAmZ3Q7YCwgYCZxdW90O2AsIGFuZCBgJiMzOTtgIGluIGBzdHJpbmdgIHRvXG4gICAgICogdGhlaXIgY29ycmVzcG9uZGluZyBjaGFyYWN0ZXJzLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIE5vIG90aGVyIEhUTUwgZW50aXRpZXMgYXJlIHVuZXNjYXBlZC4gVG8gdW5lc2NhcGUgYWRkaXRpb25hbFxuICAgICAqIEhUTUwgZW50aXRpZXMgdXNlIGEgdGhpcmQtcGFydHkgbGlicmFyeSBsaWtlIFtfaGVfXShodHRwczovL210aHMuYmUvaGUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDAuNi4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIHVuZXNjYXBlLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHVuZXNjYXBlZCBzdHJpbmcuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udW5lc2NhcGUoJ2ZyZWQsIGJhcm5leSwgJmFtcDsgcGViYmxlcycpO1xuICAgICAqIC8vID0+ICdmcmVkLCBiYXJuZXksICYgcGViYmxlcydcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB1bmVzY2FwZShzdHJpbmcpIHtcbiAgICAgIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7XG4gICAgICByZXR1cm4gKHN0cmluZyAmJiByZUhhc0VzY2FwZWRIdG1sLnRlc3Qoc3RyaW5nKSlcbiAgICAgICAgPyBzdHJpbmcucmVwbGFjZShyZUVzY2FwZWRIdG1sLCB1bmVzY2FwZUh0bWxDaGFyKVxuICAgICAgICA6IHN0cmluZztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBgc3RyaW5nYCwgYXMgc3BhY2Ugc2VwYXJhdGVkIHdvcmRzLCB0byB1cHBlciBjYXNlLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgdXBwZXIgY2FzZWQgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnVwcGVyQ2FzZSgnLS1mb28tYmFyJyk7XG4gICAgICogLy8gPT4gJ0ZPTyBCQVInXG4gICAgICpcbiAgICAgKiBfLnVwcGVyQ2FzZSgnZm9vQmFyJyk7XG4gICAgICogLy8gPT4gJ0ZPTyBCQVInXG4gICAgICpcbiAgICAgKiBfLnVwcGVyQ2FzZSgnX19mb29fYmFyX18nKTtcbiAgICAgKiAvLyA9PiAnRk9PIEJBUidcbiAgICAgKi9cbiAgICB2YXIgdXBwZXJDYXNlID0gY3JlYXRlQ29tcG91bmRlcihmdW5jdGlvbihyZXN1bHQsIHdvcmQsIGluZGV4KSB7XG4gICAgICByZXR1cm4gcmVzdWx0ICsgKGluZGV4ID8gJyAnIDogJycpICsgd29yZC50b1VwcGVyQ2FzZSgpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiBgc3RyaW5nYCB0byB1cHBlciBjYXNlLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFN0cmluZ1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgY29udmVydGVkIHN0cmluZy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy51cHBlckZpcnN0KCdmcmVkJyk7XG4gICAgICogLy8gPT4gJ0ZyZWQnXG4gICAgICpcbiAgICAgKiBfLnVwcGVyRmlyc3QoJ0ZSRUQnKTtcbiAgICAgKiAvLyA9PiAnRlJFRCdcbiAgICAgKi9cbiAgICB2YXIgdXBwZXJGaXJzdCA9IGNyZWF0ZUNhc2VGaXJzdCgndG9VcHBlckNhc2UnKTtcblxuICAgIC8qKlxuICAgICAqIFNwbGl0cyBgc3RyaW5nYCBpbnRvIGFuIGFycmF5IG9mIGl0cyB3b3Jkcy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBTdHJpbmdcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBpbnNwZWN0LlxuICAgICAqIEBwYXJhbSB7UmVnRXhwfHN0cmluZ30gW3BhdHRlcm5dIFRoZSBwYXR0ZXJuIHRvIG1hdGNoIHdvcmRzLlxuICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSB3b3JkcyBvZiBgc3RyaW5nYC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy53b3JkcygnZnJlZCwgYmFybmV5LCAmIHBlYmJsZXMnKTtcbiAgICAgKiAvLyA9PiBbJ2ZyZWQnLCAnYmFybmV5JywgJ3BlYmJsZXMnXVxuICAgICAqXG4gICAgICogXy53b3JkcygnZnJlZCwgYmFybmV5LCAmIHBlYmJsZXMnLCAvW14sIF0rL2cpO1xuICAgICAqIC8vID0+IFsnZnJlZCcsICdiYXJuZXknLCAnJicsICdwZWJibGVzJ11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB3b3JkcyhzdHJpbmcsIHBhdHRlcm4sIGd1YXJkKSB7XG4gICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpO1xuICAgICAgcGF0dGVybiA9IGd1YXJkID8gdW5kZWZpbmVkIDogcGF0dGVybjtcblxuICAgICAgaWYgKHBhdHRlcm4gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gaGFzVW5pY29kZVdvcmQoc3RyaW5nKSA/IHVuaWNvZGVXb3JkcyhzdHJpbmcpIDogYXNjaWlXb3JkcyhzdHJpbmcpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHN0cmluZy5tYXRjaChwYXR0ZXJuKSB8fCBbXTtcbiAgICB9XG5cbiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgICAvKipcbiAgICAgKiBBdHRlbXB0cyB0byBpbnZva2UgYGZ1bmNgLCByZXR1cm5pbmcgZWl0aGVyIHRoZSByZXN1bHQgb3IgdGhlIGNhdWdodCBlcnJvclxuICAgICAqIG9iamVjdC4gQW55IGFkZGl0aW9uYWwgYXJndW1lbnRzIGFyZSBwcm92aWRlZCB0byBgZnVuY2Agd2hlbiBpdCdzIGludm9rZWQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGF0dGVtcHQuXG4gICAgICogQHBhcmFtIHsuLi4qfSBbYXJnc10gVGhlIGFyZ3VtZW50cyB0byBpbnZva2UgYGZ1bmNgIHdpdGguXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGBmdW5jYCByZXN1bHQgb3IgZXJyb3Igb2JqZWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiAvLyBBdm9pZCB0aHJvd2luZyBlcnJvcnMgZm9yIGludmFsaWQgc2VsZWN0b3JzLlxuICAgICAqIHZhciBlbGVtZW50cyA9IF8uYXR0ZW1wdChmdW5jdGlvbihzZWxlY3Rvcikge1xuICAgICAqICAgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpO1xuICAgICAqIH0sICc+Xz4nKTtcbiAgICAgKlxuICAgICAqIGlmIChfLmlzRXJyb3IoZWxlbWVudHMpKSB7XG4gICAgICogICBlbGVtZW50cyA9IFtdO1xuICAgICAqIH1cbiAgICAgKi9cbiAgICB2YXIgYXR0ZW1wdCA9IGJhc2VSZXN0KGZ1bmN0aW9uKGZ1bmMsIGFyZ3MpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhcHBseShmdW5jLCB1bmRlZmluZWQsIGFyZ3MpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gaXNFcnJvcihlKSA/IGUgOiBuZXcgRXJyb3IoZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBCaW5kcyBtZXRob2RzIG9mIGFuIG9iamVjdCB0byB0aGUgb2JqZWN0IGl0c2VsZiwgb3ZlcndyaXRpbmcgdGhlIGV4aXN0aW5nXG4gICAgICogbWV0aG9kLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGRvZXNuJ3Qgc2V0IHRoZSBcImxlbmd0aFwiIHByb3BlcnR5IG9mIGJvdW5kIGZ1bmN0aW9ucy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGJpbmQgYW5kIGFzc2lnbiB0aGUgYm91bmQgbWV0aG9kcyB0by5cbiAgICAgKiBAcGFyYW0gey4uLihzdHJpbmd8c3RyaW5nW10pfSBtZXRob2ROYW1lcyBUaGUgb2JqZWN0IG1ldGhvZCBuYW1lcyB0byBiaW5kLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciB2aWV3ID0ge1xuICAgICAqICAgJ2xhYmVsJzogJ2RvY3MnLFxuICAgICAqICAgJ2NsaWNrJzogZnVuY3Rpb24oKSB7XG4gICAgICogICAgIGNvbnNvbGUubG9nKCdjbGlja2VkICcgKyB0aGlzLmxhYmVsKTtcbiAgICAgKiAgIH1cbiAgICAgKiB9O1xuICAgICAqXG4gICAgICogXy5iaW5kQWxsKHZpZXcsIFsnY2xpY2snXSk7XG4gICAgICogalF1ZXJ5KGVsZW1lbnQpLm9uKCdjbGljaycsIHZpZXcuY2xpY2spO1xuICAgICAqIC8vID0+IExvZ3MgJ2NsaWNrZWQgZG9jcycgd2hlbiBjbGlja2VkLlxuICAgICAqL1xuICAgIHZhciBiaW5kQWxsID0gZmxhdFJlc3QoZnVuY3Rpb24ob2JqZWN0LCBtZXRob2ROYW1lcykge1xuICAgICAgYXJyYXlFYWNoKG1ldGhvZE5hbWVzLCBmdW5jdGlvbihrZXkpIHtcbiAgICAgICAga2V5ID0gdG9LZXkoa2V5KTtcbiAgICAgICAgYmFzZUFzc2lnblZhbHVlKG9iamVjdCwga2V5LCBiaW5kKG9iamVjdFtrZXldLCBvYmplY3QpKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGl0ZXJhdGVzIG92ZXIgYHBhaXJzYCBhbmQgaW52b2tlcyB0aGUgY29ycmVzcG9uZGluZ1xuICAgICAqIGZ1bmN0aW9uIG9mIHRoZSBmaXJzdCBwcmVkaWNhdGUgdG8gcmV0dXJuIHRydXRoeS4gVGhlIHByZWRpY2F0ZS1mdW5jdGlvblxuICAgICAqIHBhaXJzIGFyZSBpbnZva2VkIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIGFuZCBhcmd1bWVudHMgb2YgdGhlIGNyZWF0ZWRcbiAgICAgKiBmdW5jdGlvbi5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHtBcnJheX0gcGFpcnMgVGhlIHByZWRpY2F0ZS1mdW5jdGlvbiBwYWlycy5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjb21wb3NpdGUgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBmdW5jID0gXy5jb25kKFtcbiAgICAgKiAgIFtfLm1hdGNoZXMoeyAnYSc6IDEgfSksICAgICAgICAgICBfLmNvbnN0YW50KCdtYXRjaGVzIEEnKV0sXG4gICAgICogICBbXy5jb25mb3Jtcyh7ICdiJzogXy5pc051bWJlciB9KSwgXy5jb25zdGFudCgnbWF0Y2hlcyBCJyldLFxuICAgICAqICAgW18uc3R1YlRydWUsICAgICAgICAgICAgICAgICAgICAgIF8uY29uc3RhbnQoJ25vIG1hdGNoJyldXG4gICAgICogXSk7XG4gICAgICpcbiAgICAgKiBmdW5jKHsgJ2EnOiAxLCAnYic6IDIgfSk7XG4gICAgICogLy8gPT4gJ21hdGNoZXMgQSdcbiAgICAgKlxuICAgICAqIGZ1bmMoeyAnYSc6IDAsICdiJzogMSB9KTtcbiAgICAgKiAvLyA9PiAnbWF0Y2hlcyBCJ1xuICAgICAqXG4gICAgICogZnVuYyh7ICdhJzogJzEnLCAnYic6ICcyJyB9KTtcbiAgICAgKiAvLyA9PiAnbm8gbWF0Y2gnXG4gICAgICovXG4gICAgZnVuY3Rpb24gY29uZChwYWlycykge1xuICAgICAgdmFyIGxlbmd0aCA9IHBhaXJzID09IG51bGwgPyAwIDogcGFpcnMubGVuZ3RoLFxuICAgICAgICAgIHRvSXRlcmF0ZWUgPSBnZXRJdGVyYXRlZSgpO1xuXG4gICAgICBwYWlycyA9ICFsZW5ndGggPyBbXSA6IGFycmF5TWFwKHBhaXJzLCBmdW5jdGlvbihwYWlyKSB7XG4gICAgICAgIGlmICh0eXBlb2YgcGFpclsxXSAhPSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbdG9JdGVyYXRlZShwYWlyWzBdKSwgcGFpclsxXV07XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGJhc2VSZXN0KGZ1bmN0aW9uKGFyZ3MpIHtcbiAgICAgICAgdmFyIGluZGV4ID0gLTE7XG4gICAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG4gICAgICAgICAgdmFyIHBhaXIgPSBwYWlyc1tpbmRleF07XG4gICAgICAgICAgaWYgKGFwcGx5KHBhaXJbMF0sIHRoaXMsIGFyZ3MpKSB7XG4gICAgICAgICAgICByZXR1cm4gYXBwbHkocGFpclsxXSwgdGhpcywgYXJncyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIHRoZSBwcmVkaWNhdGUgcHJvcGVydGllcyBvZiBgc291cmNlYCB3aXRoXG4gICAgICogdGhlIGNvcnJlc3BvbmRpbmcgcHJvcGVydHkgdmFsdWVzIG9mIGEgZ2l2ZW4gb2JqZWN0LCByZXR1cm5pbmcgYHRydWVgIGlmXG4gICAgICogYWxsIHByZWRpY2F0ZXMgcmV0dXJuIHRydXRoeSwgZWxzZSBgZmFsc2VgLlxuICAgICAqXG4gICAgICogKipOb3RlOioqIFRoZSBjcmVhdGVkIGZ1bmN0aW9uIGlzIGVxdWl2YWxlbnQgdG8gYF8uY29uZm9ybXNUb2Agd2l0aFxuICAgICAqIGBzb3VyY2VgIHBhcnRpYWxseSBhcHBsaWVkLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3Qgb2YgcHJvcGVydHkgcHJlZGljYXRlcyB0byBjb25mb3JtIHRvLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHNwZWMgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gW1xuICAgICAqICAgeyAnYSc6IDIsICdiJzogMSB9LFxuICAgICAqICAgeyAnYSc6IDEsICdiJzogMiB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8uZmlsdGVyKG9iamVjdHMsIF8uY29uZm9ybXMoeyAnYic6IGZ1bmN0aW9uKG4pIHsgcmV0dXJuIG4gPiAxOyB9IH0pKTtcbiAgICAgKiAvLyA9PiBbeyAnYSc6IDEsICdiJzogMiB9XVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNvbmZvcm1zKHNvdXJjZSkge1xuICAgICAgcmV0dXJuIGJhc2VDb25mb3JtcyhiYXNlQ2xvbmUoc291cmNlLCBDTE9ORV9ERUVQX0ZMQUcpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGB2YWx1ZWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMi40LjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHJldHVybiBmcm9tIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgY29uc3RhbnQgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gXy50aW1lcygyLCBfLmNvbnN0YW50KHsgJ2EnOiAxIH0pKTtcbiAgICAgKlxuICAgICAqIGNvbnNvbGUubG9nKG9iamVjdHMpO1xuICAgICAqIC8vID0+IFt7ICdhJzogMSB9LCB7ICdhJzogMSB9XVxuICAgICAqXG4gICAgICogY29uc29sZS5sb2cob2JqZWN0c1swXSA9PT0gb2JqZWN0c1sxXSk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNvbnN0YW50KHZhbHVlKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGB2YWx1ZWAgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYSBkZWZhdWx0IHZhbHVlIHNob3VsZCBiZSByZXR1cm5lZCBpblxuICAgICAqIGl0cyBwbGFjZS4gVGhlIGBkZWZhdWx0VmFsdWVgIGlzIHJldHVybmVkIGlmIGB2YWx1ZWAgaXMgYE5hTmAsIGBudWxsYCxcbiAgICAgKiBvciBgdW5kZWZpbmVkYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjE0LjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgICAqIEBwYXJhbSB7Kn0gZGVmYXVsdFZhbHVlIFRoZSBkZWZhdWx0IHZhbHVlLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByZXNvbHZlZCB2YWx1ZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5kZWZhdWx0VG8oMSwgMTApO1xuICAgICAqIC8vID0+IDFcbiAgICAgKlxuICAgICAqIF8uZGVmYXVsdFRvKHVuZGVmaW5lZCwgMTApO1xuICAgICAqIC8vID0+IDEwXG4gICAgICovXG4gICAgZnVuY3Rpb24gZGVmYXVsdFRvKHZhbHVlLCBkZWZhdWx0VmFsdWUpIHtcbiAgICAgIHJldHVybiAodmFsdWUgPT0gbnVsbCB8fCB2YWx1ZSAhPT0gdmFsdWUpID8gZGVmYXVsdFZhbHVlIDogdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgcmVzdWx0IG9mIGludm9raW5nIHRoZSBnaXZlbiBmdW5jdGlvbnNcbiAgICAgKiB3aXRoIHRoZSBgdGhpc2AgYmluZGluZyBvZiB0aGUgY3JlYXRlZCBmdW5jdGlvbiwgd2hlcmUgZWFjaCBzdWNjZXNzaXZlXG4gICAgICogaW52b2NhdGlvbiBpcyBzdXBwbGllZCB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBwcmV2aW91cy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHsuLi4oRnVuY3Rpb258RnVuY3Rpb25bXSl9IFtmdW5jc10gVGhlIGZ1bmN0aW9ucyB0byBpbnZva2UuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgY29tcG9zaXRlIGZ1bmN0aW9uLlxuICAgICAqIEBzZWUgXy5mbG93UmlnaHRcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gc3F1YXJlKG4pIHtcbiAgICAgKiAgIHJldHVybiBuICogbjtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiB2YXIgYWRkU3F1YXJlID0gXy5mbG93KFtfLmFkZCwgc3F1YXJlXSk7XG4gICAgICogYWRkU3F1YXJlKDEsIDIpO1xuICAgICAqIC8vID0+IDlcbiAgICAgKi9cbiAgICB2YXIgZmxvdyA9IGNyZWF0ZUZsb3coKTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZmxvd2AgZXhjZXB0IHRoYXQgaXQgY3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXRcbiAgICAgKiBpbnZva2VzIHRoZSBnaXZlbiBmdW5jdGlvbnMgZnJvbSByaWdodCB0byBsZWZ0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0gey4uLihGdW5jdGlvbnxGdW5jdGlvbltdKX0gW2Z1bmNzXSBUaGUgZnVuY3Rpb25zIHRvIGludm9rZS5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjb21wb3NpdGUgZnVuY3Rpb24uXG4gICAgICogQHNlZSBfLmZsb3dcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogZnVuY3Rpb24gc3F1YXJlKG4pIHtcbiAgICAgKiAgIHJldHVybiBuICogbjtcbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiB2YXIgYWRkU3F1YXJlID0gXy5mbG93UmlnaHQoW3NxdWFyZSwgXy5hZGRdKTtcbiAgICAgKiBhZGRTcXVhcmUoMSwgMik7XG4gICAgICogLy8gPT4gOVxuICAgICAqL1xuICAgIHZhciBmbG93UmlnaHQgPSBjcmVhdGVGbG93KHRydWUpO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgZmlyc3QgYXJndW1lbnQgaXQgcmVjZWl2ZXMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgQW55IHZhbHVlLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIGB2YWx1ZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogMSB9O1xuICAgICAqXG4gICAgICogY29uc29sZS5sb2coXy5pZGVudGl0eShvYmplY3QpID09PSBvYmplY3QpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpZGVudGl0eSh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYGZ1bmNgIHdpdGggdGhlIGFyZ3VtZW50cyBvZiB0aGUgY3JlYXRlZFxuICAgICAqIGZ1bmN0aW9uLiBJZiBgZnVuY2AgaXMgYSBwcm9wZXJ0eSBuYW1lLCB0aGUgY3JlYXRlZCBmdW5jdGlvbiByZXR1cm5zIHRoZVxuICAgICAqIHByb3BlcnR5IHZhbHVlIGZvciBhIGdpdmVuIGVsZW1lbnQuIElmIGBmdW5jYCBpcyBhbiBhcnJheSBvciBvYmplY3QsIHRoZVxuICAgICAqIGNyZWF0ZWQgZnVuY3Rpb24gcmV0dXJucyBgdHJ1ZWAgZm9yIGVsZW1lbnRzIHRoYXQgY29udGFpbiB0aGUgZXF1aXZhbGVudFxuICAgICAqIHNvdXJjZSBwcm9wZXJ0aWVzLCBvdGhlcndpc2UgaXQgcmV0dXJucyBgZmFsc2VgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0geyp9IFtmdW5jPV8uaWRlbnRpdHldIFRoZSB2YWx1ZSB0byBjb252ZXJ0IHRvIGEgY2FsbGJhY2suXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBjYWxsYmFjay5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIHVzZXJzID0gW1xuICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAnYWdlJzogMzYsICdhY3RpdmUnOiB0cnVlIH0sXG4gICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICdhZ2UnOiA0MCwgJ2FjdGl2ZSc6IGZhbHNlIH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC5cbiAgICAgKiBfLmZpbHRlcih1c2VycywgXy5pdGVyYXRlZSh7ICd1c2VyJzogJ2Jhcm5leScsICdhY3RpdmUnOiB0cnVlIH0pKTtcbiAgICAgKiAvLyA9PiBbeyAndXNlcic6ICdiYXJuZXknLCAnYWdlJzogMzYsICdhY3RpdmUnOiB0cnVlIH1dXG4gICAgICpcbiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5maWx0ZXIodXNlcnMsIF8uaXRlcmF0ZWUoWyd1c2VyJywgJ2ZyZWQnXSkpO1xuICAgICAqIC8vID0+IFt7ICd1c2VyJzogJ2ZyZWQnLCAnYWdlJzogNDAgfV1cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8ubWFwKHVzZXJzLCBfLml0ZXJhdGVlKCd1c2VyJykpO1xuICAgICAqIC8vID0+IFsnYmFybmV5JywgJ2ZyZWQnXVxuICAgICAqXG4gICAgICogLy8gQ3JlYXRlIGN1c3RvbSBpdGVyYXRlZSBzaG9ydGhhbmRzLlxuICAgICAqIF8uaXRlcmF0ZWUgPSBfLndyYXAoXy5pdGVyYXRlZSwgZnVuY3Rpb24oaXRlcmF0ZWUsIGZ1bmMpIHtcbiAgICAgKiAgIHJldHVybiAhXy5pc1JlZ0V4cChmdW5jKSA/IGl0ZXJhdGVlKGZ1bmMpIDogZnVuY3Rpb24oc3RyaW5nKSB7XG4gICAgICogICAgIHJldHVybiBmdW5jLnRlc3Qoc3RyaW5nKTtcbiAgICAgKiAgIH07XG4gICAgICogfSk7XG4gICAgICpcbiAgICAgKiBfLmZpbHRlcihbJ2FiYycsICdkZWYnXSwgL2VmLyk7XG4gICAgICogLy8gPT4gWydkZWYnXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGl0ZXJhdGVlKGZ1bmMpIHtcbiAgICAgIHJldHVybiBiYXNlSXRlcmF0ZWUodHlwZW9mIGZ1bmMgPT0gJ2Z1bmN0aW9uJyA/IGZ1bmMgOiBiYXNlQ2xvbmUoZnVuYywgQ0xPTkVfREVFUF9GTEFHKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgcGVyZm9ybXMgYSBwYXJ0aWFsIGRlZXAgY29tcGFyaXNvbiBiZXR3ZWVuIGEgZ2l2ZW5cbiAgICAgKiBvYmplY3QgYW5kIGBzb3VyY2VgLCByZXR1cm5pbmcgYHRydWVgIGlmIHRoZSBnaXZlbiBvYmplY3QgaGFzIGVxdWl2YWxlbnRcbiAgICAgKiBwcm9wZXJ0eSB2YWx1ZXMsIGVsc2UgYGZhbHNlYC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBUaGUgY3JlYXRlZCBmdW5jdGlvbiBpcyBlcXVpdmFsZW50IHRvIGBfLmlzTWF0Y2hgIHdpdGggYHNvdXJjZWBcbiAgICAgKiBwYXJ0aWFsbHkgYXBwbGllZC5cbiAgICAgKlxuICAgICAqIFBhcnRpYWwgY29tcGFyaXNvbnMgd2lsbCBtYXRjaCBlbXB0eSBhcnJheSBhbmQgZW1wdHkgb2JqZWN0IGBzb3VyY2VgXG4gICAgICogdmFsdWVzIGFnYWluc3QgYW55IGFycmF5IG9yIG9iamVjdCB2YWx1ZSwgcmVzcGVjdGl2ZWx5LiBTZWUgYF8uaXNFcXVhbGBcbiAgICAgKiBmb3IgYSBsaXN0IG9mIHN1cHBvcnRlZCB2YWx1ZSBjb21wYXJpc29ucy5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBNdWx0aXBsZSB2YWx1ZXMgY2FuIGJlIGNoZWNrZWQgYnkgY29tYmluaW5nIHNldmVyYWwgbWF0Y2hlcnNcbiAgICAgKiB1c2luZyBgXy5vdmVyU29tZWBcbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjAuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IG9mIHByb3BlcnR5IHZhbHVlcyB0byBtYXRjaC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBzcGVjIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFtcbiAgICAgKiAgIHsgJ2EnOiAxLCAnYic6IDIsICdjJzogMyB9LFxuICAgICAqICAgeyAnYSc6IDQsICdiJzogNSwgJ2MnOiA2IH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy5maWx0ZXIob2JqZWN0cywgXy5tYXRjaGVzKHsgJ2EnOiA0LCAnYyc6IDYgfSkpO1xuICAgICAqIC8vID0+IFt7ICdhJzogNCwgJ2InOiA1LCAnYyc6IDYgfV1cbiAgICAgKlxuICAgICAqIC8vIENoZWNraW5nIGZvciBzZXZlcmFsIHBvc3NpYmxlIHZhbHVlc1xuICAgICAqIF8uZmlsdGVyKG9iamVjdHMsIF8ub3ZlclNvbWUoW18ubWF0Y2hlcyh7ICdhJzogMSB9KSwgXy5tYXRjaGVzKHsgJ2EnOiA0IH0pXSkpO1xuICAgICAqIC8vID0+IFt7ICdhJzogMSwgJ2InOiAyLCAnYyc6IDMgfSwgeyAnYSc6IDQsICdiJzogNSwgJ2MnOiA2IH1dXG4gICAgICovXG4gICAgZnVuY3Rpb24gbWF0Y2hlcyhzb3VyY2UpIHtcbiAgICAgIHJldHVybiBiYXNlTWF0Y2hlcyhiYXNlQ2xvbmUoc291cmNlLCBDTE9ORV9ERUVQX0ZMQUcpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBwZXJmb3JtcyBhIHBhcnRpYWwgZGVlcCBjb21wYXJpc29uIGJldHdlZW4gdGhlXG4gICAgICogdmFsdWUgYXQgYHBhdGhgIG9mIGEgZ2l2ZW4gb2JqZWN0IHRvIGBzcmNWYWx1ZWAsIHJldHVybmluZyBgdHJ1ZWAgaWYgdGhlXG4gICAgICogb2JqZWN0IHZhbHVlIGlzIGVxdWl2YWxlbnQsIGVsc2UgYGZhbHNlYC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBQYXJ0aWFsIGNvbXBhcmlzb25zIHdpbGwgbWF0Y2ggZW1wdHkgYXJyYXkgYW5kIGVtcHR5IG9iamVjdFxuICAgICAqIGBzcmNWYWx1ZWAgdmFsdWVzIGFnYWluc3QgYW55IGFycmF5IG9yIG9iamVjdCB2YWx1ZSwgcmVzcGVjdGl2ZWx5LiBTZWVcbiAgICAgKiBgXy5pc0VxdWFsYCBmb3IgYSBsaXN0IG9mIHN1cHBvcnRlZCB2YWx1ZSBjb21wYXJpc29ucy5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBNdWx0aXBsZSB2YWx1ZXMgY2FuIGJlIGNoZWNrZWQgYnkgY29tYmluaW5nIHNldmVyYWwgbWF0Y2hlcnNcbiAgICAgKiB1c2luZyBgXy5vdmVyU29tZWBcbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjIuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAgICAgKiBAcGFyYW0geyp9IHNyY1ZhbHVlIFRoZSB2YWx1ZSB0byBtYXRjaC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBzcGVjIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFtcbiAgICAgKiAgIHsgJ2EnOiAxLCAnYic6IDIsICdjJzogMyB9LFxuICAgICAqICAgeyAnYSc6IDQsICdiJzogNSwgJ2MnOiA2IH1cbiAgICAgKiBdO1xuICAgICAqXG4gICAgICogXy5maW5kKG9iamVjdHMsIF8ubWF0Y2hlc1Byb3BlcnR5KCdhJywgNCkpO1xuICAgICAqIC8vID0+IHsgJ2EnOiA0LCAnYic6IDUsICdjJzogNiB9XG4gICAgICpcbiAgICAgKiAvLyBDaGVja2luZyBmb3Igc2V2ZXJhbCBwb3NzaWJsZSB2YWx1ZXNcbiAgICAgKiBfLmZpbHRlcihvYmplY3RzLCBfLm92ZXJTb21lKFtfLm1hdGNoZXNQcm9wZXJ0eSgnYScsIDEpLCBfLm1hdGNoZXNQcm9wZXJ0eSgnYScsIDQpXSkpO1xuICAgICAqIC8vID0+IFt7ICdhJzogMSwgJ2InOiAyLCAnYyc6IDMgfSwgeyAnYSc6IDQsICdiJzogNSwgJ2MnOiA2IH1dXG4gICAgICovXG4gICAgZnVuY3Rpb24gbWF0Y2hlc1Byb3BlcnR5KHBhdGgsIHNyY1ZhbHVlKSB7XG4gICAgICByZXR1cm4gYmFzZU1hdGNoZXNQcm9wZXJ0eShwYXRoLCBiYXNlQ2xvbmUoc3JjVmFsdWUsIENMT05FX0RFRVBfRkxBRykpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgdGhlIG1ldGhvZCBhdCBgcGF0aGAgb2YgYSBnaXZlbiBvYmplY3QuXG4gICAgICogQW55IGFkZGl0aW9uYWwgYXJndW1lbnRzIGFyZSBwcm92aWRlZCB0byB0aGUgaW52b2tlZCBtZXRob2QuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy43LjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBtZXRob2QgdG8gaW52b2tlLlxuICAgICAqIEBwYXJhbSB7Li4uKn0gW2FyZ3NdIFRoZSBhcmd1bWVudHMgdG8gaW52b2tlIHRoZSBtZXRob2Qgd2l0aC5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBpbnZva2VyIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFtcbiAgICAgKiAgIHsgJ2EnOiB7ICdiJzogXy5jb25zdGFudCgyKSB9IH0sXG4gICAgICogICB7ICdhJzogeyAnYic6IF8uY29uc3RhbnQoMSkgfSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8ubWFwKG9iamVjdHMsIF8ubWV0aG9kKCdhLmInKSk7XG4gICAgICogLy8gPT4gWzIsIDFdXG4gICAgICpcbiAgICAgKiBfLm1hcChvYmplY3RzLCBfLm1ldGhvZChbJ2EnLCAnYiddKSk7XG4gICAgICogLy8gPT4gWzIsIDFdXG4gICAgICovXG4gICAgdmFyIG1ldGhvZCA9IGJhc2VSZXN0KGZ1bmN0aW9uKHBhdGgsIGFyZ3MpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihvYmplY3QpIHtcbiAgICAgICAgcmV0dXJuIGJhc2VJbnZva2Uob2JqZWN0LCBwYXRoLCBhcmdzKTtcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgb3Bwb3NpdGUgb2YgYF8ubWV0aG9kYDsgdGhpcyBtZXRob2QgY3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlc1xuICAgICAqIHRoZSBtZXRob2QgYXQgYSBnaXZlbiBwYXRoIG9mIGBvYmplY3RgLiBBbnkgYWRkaXRpb25hbCBhcmd1bWVudHMgYXJlXG4gICAgICogcHJvdmlkZWQgdG8gdGhlIGludm9rZWQgbWV0aG9kLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuNy4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuXG4gICAgICogQHBhcmFtIHsuLi4qfSBbYXJnc10gVGhlIGFyZ3VtZW50cyB0byBpbnZva2UgdGhlIG1ldGhvZCB3aXRoLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGludm9rZXIgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBhcnJheSA9IF8udGltZXMoMywgXy5jb25zdGFudCksXG4gICAgICogICAgIG9iamVjdCA9IHsgJ2EnOiBhcnJheSwgJ2InOiBhcnJheSwgJ2MnOiBhcnJheSB9O1xuICAgICAqXG4gICAgICogXy5tYXAoWydhWzJdJywgJ2NbMF0nXSwgXy5tZXRob2RPZihvYmplY3QpKTtcbiAgICAgKiAvLyA9PiBbMiwgMF1cbiAgICAgKlxuICAgICAqIF8ubWFwKFtbJ2EnLCAnMiddLCBbJ2MnLCAnMCddXSwgXy5tZXRob2RPZihvYmplY3QpKTtcbiAgICAgKiAvLyA9PiBbMiwgMF1cbiAgICAgKi9cbiAgICB2YXIgbWV0aG9kT2YgPSBiYXNlUmVzdChmdW5jdGlvbihvYmplY3QsIGFyZ3MpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihwYXRoKSB7XG4gICAgICAgIHJldHVybiBiYXNlSW52b2tlKG9iamVjdCwgcGF0aCwgYXJncyk7XG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQWRkcyBhbGwgb3duIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIGZ1bmN0aW9uIHByb3BlcnRpZXMgb2YgYSBzb3VyY2VcbiAgICAgKiBvYmplY3QgdG8gdGhlIGRlc3RpbmF0aW9uIG9iamVjdC4gSWYgYG9iamVjdGAgaXMgYSBmdW5jdGlvbiwgdGhlbiBtZXRob2RzXG4gICAgICogYXJlIGFkZGVkIHRvIGl0cyBwcm90b3R5cGUgYXMgd2VsbC5cbiAgICAgKlxuICAgICAqICoqTm90ZToqKiBVc2UgYF8ucnVuSW5Db250ZXh0YCB0byBjcmVhdGUgYSBwcmlzdGluZSBgbG9kYXNoYCBmdW5jdGlvbiB0b1xuICAgICAqIGF2b2lkIGNvbmZsaWN0cyBjYXVzZWQgYnkgbW9kaWZ5aW5nIHRoZSBvcmlnaW5hbC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbnxPYmplY3R9IFtvYmplY3Q9bG9kYXNoXSBUaGUgZGVzdGluYXRpb24gb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIG9iamVjdCBvZiBmdW5jdGlvbnMgdG8gYWRkLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV0gVGhlIG9wdGlvbnMgb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuY2hhaW49dHJ1ZV0gU3BlY2lmeSB3aGV0aGVyIG1peGlucyBhcmUgY2hhaW5hYmxlLlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbnxPYmplY3R9IFJldHVybnMgYG9iamVjdGAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIGZ1bmN0aW9uIHZvd2VscyhzdHJpbmcpIHtcbiAgICAgKiAgIHJldHVybiBfLmZpbHRlcihzdHJpbmcsIGZ1bmN0aW9uKHYpIHtcbiAgICAgKiAgICAgcmV0dXJuIC9bYWVpb3VdL2kudGVzdCh2KTtcbiAgICAgKiAgIH0pO1xuICAgICAqIH1cbiAgICAgKlxuICAgICAqIF8ubWl4aW4oeyAndm93ZWxzJzogdm93ZWxzIH0pO1xuICAgICAqIF8udm93ZWxzKCdmcmVkJyk7XG4gICAgICogLy8gPT4gWydlJ11cbiAgICAgKlxuICAgICAqIF8oJ2ZyZWQnKS52b3dlbHMoKS52YWx1ZSgpO1xuICAgICAqIC8vID0+IFsnZSddXG4gICAgICpcbiAgICAgKiBfLm1peGluKHsgJ3Zvd2Vscyc6IHZvd2VscyB9LCB7ICdjaGFpbic6IGZhbHNlIH0pO1xuICAgICAqIF8oJ2ZyZWQnKS52b3dlbHMoKTtcbiAgICAgKiAvLyA9PiBbJ2UnXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1peGluKG9iamVjdCwgc291cmNlLCBvcHRpb25zKSB7XG4gICAgICB2YXIgcHJvcHMgPSBrZXlzKHNvdXJjZSksXG4gICAgICAgICAgbWV0aG9kTmFtZXMgPSBiYXNlRnVuY3Rpb25zKHNvdXJjZSwgcHJvcHMpO1xuXG4gICAgICBpZiAob3B0aW9ucyA9PSBudWxsICYmXG4gICAgICAgICAgIShpc09iamVjdChzb3VyY2UpICYmIChtZXRob2ROYW1lcy5sZW5ndGggfHwgIXByb3BzLmxlbmd0aCkpKSB7XG4gICAgICAgIG9wdGlvbnMgPSBzb3VyY2U7XG4gICAgICAgIHNvdXJjZSA9IG9iamVjdDtcbiAgICAgICAgb2JqZWN0ID0gdGhpcztcbiAgICAgICAgbWV0aG9kTmFtZXMgPSBiYXNlRnVuY3Rpb25zKHNvdXJjZSwga2V5cyhzb3VyY2UpKTtcbiAgICAgIH1cbiAgICAgIHZhciBjaGFpbiA9ICEoaXNPYmplY3Qob3B0aW9ucykgJiYgJ2NoYWluJyBpbiBvcHRpb25zKSB8fCAhIW9wdGlvbnMuY2hhaW4sXG4gICAgICAgICAgaXNGdW5jID0gaXNGdW5jdGlvbihvYmplY3QpO1xuXG4gICAgICBhcnJheUVhY2gobWV0aG9kTmFtZXMsIGZ1bmN0aW9uKG1ldGhvZE5hbWUpIHtcbiAgICAgICAgdmFyIGZ1bmMgPSBzb3VyY2VbbWV0aG9kTmFtZV07XG4gICAgICAgIG9iamVjdFttZXRob2ROYW1lXSA9IGZ1bmM7XG4gICAgICAgIGlmIChpc0Z1bmMpIHtcbiAgICAgICAgICBvYmplY3QucHJvdG90eXBlW21ldGhvZE5hbWVdID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB2YXIgY2hhaW5BbGwgPSB0aGlzLl9fY2hhaW5fXztcbiAgICAgICAgICAgIGlmIChjaGFpbiB8fCBjaGFpbkFsbCkge1xuICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gb2JqZWN0KHRoaXMuX193cmFwcGVkX18pLFxuICAgICAgICAgICAgICAgICAgYWN0aW9ucyA9IHJlc3VsdC5fX2FjdGlvbnNfXyA9IGNvcHlBcnJheSh0aGlzLl9fYWN0aW9uc19fKTtcblxuICAgICAgICAgICAgICBhY3Rpb25zLnB1c2goeyAnZnVuYyc6IGZ1bmMsICdhcmdzJzogYXJndW1lbnRzLCAndGhpc0FyZyc6IG9iamVjdCB9KTtcbiAgICAgICAgICAgICAgcmVzdWx0Ll9fY2hhaW5fXyA9IGNoYWluQWxsO1xuICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZ1bmMuYXBwbHkob2JqZWN0LCBhcnJheVB1c2goW3RoaXMudmFsdWUoKV0sIGFyZ3VtZW50cykpO1xuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gb2JqZWN0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldmVydHMgdGhlIGBfYCB2YXJpYWJsZSB0byBpdHMgcHJldmlvdXMgdmFsdWUgYW5kIHJldHVybnMgYSByZWZlcmVuY2UgdG9cbiAgICAgKiB0aGUgYGxvZGFzaGAgZnVuY3Rpb24uXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHNpbmNlIDAuMS4wXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgYGxvZGFzaGAgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBsb2Rhc2ggPSBfLm5vQ29uZmxpY3QoKTtcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBub0NvbmZsaWN0KCkge1xuICAgICAgaWYgKHJvb3QuXyA9PT0gdGhpcykge1xuICAgICAgICByb290Ll8gPSBvbGREYXNoO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgcmV0dXJucyBgdW5kZWZpbmVkYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAyLjMuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udGltZXMoMiwgXy5ub29wKTtcbiAgICAgKiAvLyA9PiBbdW5kZWZpbmVkLCB1bmRlZmluZWRdXG4gICAgICovXG4gICAgZnVuY3Rpb24gbm9vcCgpIHtcbiAgICAgIC8vIE5vIG9wZXJhdGlvbiBwZXJmb3JtZWQuXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgZ2V0cyB0aGUgYXJndW1lbnQgYXQgaW5kZXggYG5gLiBJZiBgbmAgaXMgbmVnYXRpdmUsXG4gICAgICogdGhlIG50aCBhcmd1bWVudCBmcm9tIHRoZSBlbmQgaXMgcmV0dXJuZWQuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbj0wXSBUaGUgaW5kZXggb2YgdGhlIGFyZ3VtZW50IHRvIHJldHVybi5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBwYXNzLXRocnUgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBmdW5jID0gXy5udGhBcmcoMSk7XG4gICAgICogZnVuYygnYScsICdiJywgJ2MnLCAnZCcpO1xuICAgICAqIC8vID0+ICdiJ1xuICAgICAqXG4gICAgICogdmFyIGZ1bmMgPSBfLm50aEFyZygtMik7XG4gICAgICogZnVuYygnYScsICdiJywgJ2MnLCAnZCcpO1xuICAgICAqIC8vID0+ICdjJ1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIG50aEFyZyhuKSB7XG4gICAgICBuID0gdG9JbnRlZ2VyKG4pO1xuICAgICAgcmV0dXJuIGJhc2VSZXN0KGZ1bmN0aW9uKGFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIGJhc2VOdGgoYXJncywgbik7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGBpdGVyYXRlZXNgIHdpdGggdGhlIGFyZ3VtZW50cyBpdCByZWNlaXZlc1xuICAgICAqIGFuZCByZXR1cm5zIHRoZWlyIHJlc3VsdHMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7Li4uKEZ1bmN0aW9ufEZ1bmN0aW9uW10pfSBbaXRlcmF0ZWVzPVtfLmlkZW50aXR5XV1cbiAgICAgKiAgVGhlIGl0ZXJhdGVlcyB0byBpbnZva2UuXG4gICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBmdW5jID0gXy5vdmVyKFtNYXRoLm1heCwgTWF0aC5taW5dKTtcbiAgICAgKlxuICAgICAqIGZ1bmMoMSwgMiwgMywgNCk7XG4gICAgICogLy8gPT4gWzQsIDFdXG4gICAgICovXG4gICAgdmFyIG92ZXIgPSBjcmVhdGVPdmVyKGFycmF5TWFwKTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGNoZWNrcyBpZiAqKmFsbCoqIG9mIHRoZSBgcHJlZGljYXRlc2AgcmV0dXJuXG4gICAgICogdHJ1dGh5IHdoZW4gaW52b2tlZCB3aXRoIHRoZSBhcmd1bWVudHMgaXQgcmVjZWl2ZXMuXG4gICAgICpcbiAgICAgKiBGb2xsb3dpbmcgc2hvcnRoYW5kcyBhcmUgcG9zc2libGUgZm9yIHByb3ZpZGluZyBwcmVkaWNhdGVzLlxuICAgICAqIFBhc3MgYW4gYE9iamVjdGAgYW5kIGl0IHdpbGwgYmUgdXNlZCBhcyBhbiBwYXJhbWV0ZXIgZm9yIGBfLm1hdGNoZXNgIHRvIGNyZWF0ZSB0aGUgcHJlZGljYXRlLlxuICAgICAqIFBhc3MgYW4gYEFycmF5YCBvZiBwYXJhbWV0ZXJzIGZvciBgXy5tYXRjaGVzUHJvcGVydHlgIGFuZCB0aGUgcHJlZGljYXRlIHdpbGwgYmUgY3JlYXRlZCB1c2luZyB0aGVtLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0gey4uLihGdW5jdGlvbnxGdW5jdGlvbltdKX0gW3ByZWRpY2F0ZXM9W18uaWRlbnRpdHldXVxuICAgICAqICBUaGUgcHJlZGljYXRlcyB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGZ1bmMgPSBfLm92ZXJFdmVyeShbQm9vbGVhbiwgaXNGaW5pdGVdKTtcbiAgICAgKlxuICAgICAqIGZ1bmMoJzEnKTtcbiAgICAgKiAvLyA9PiB0cnVlXG4gICAgICpcbiAgICAgKiBmdW5jKG51bGwpO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiBmdW5jKE5hTik7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICB2YXIgb3ZlckV2ZXJ5ID0gY3JlYXRlT3ZlcihhcnJheUV2ZXJ5KTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGNoZWNrcyBpZiAqKmFueSoqIG9mIHRoZSBgcHJlZGljYXRlc2AgcmV0dXJuXG4gICAgICogdHJ1dGh5IHdoZW4gaW52b2tlZCB3aXRoIHRoZSBhcmd1bWVudHMgaXQgcmVjZWl2ZXMuXG4gICAgICpcbiAgICAgKiBGb2xsb3dpbmcgc2hvcnRoYW5kcyBhcmUgcG9zc2libGUgZm9yIHByb3ZpZGluZyBwcmVkaWNhdGVzLlxuICAgICAqIFBhc3MgYW4gYE9iamVjdGAgYW5kIGl0IHdpbGwgYmUgdXNlZCBhcyBhbiBwYXJhbWV0ZXIgZm9yIGBfLm1hdGNoZXNgIHRvIGNyZWF0ZSB0aGUgcHJlZGljYXRlLlxuICAgICAqIFBhc3MgYW4gYEFycmF5YCBvZiBwYXJhbWV0ZXJzIGZvciBgXy5tYXRjaGVzUHJvcGVydHlgIGFuZCB0aGUgcHJlZGljYXRlIHdpbGwgYmUgY3JlYXRlZCB1c2luZyB0aGVtLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMC4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0gey4uLihGdW5jdGlvbnxGdW5jdGlvbltdKX0gW3ByZWRpY2F0ZXM9W18uaWRlbnRpdHldXVxuICAgICAqICBUaGUgcHJlZGljYXRlcyB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGZ1bmMgPSBfLm92ZXJTb21lKFtCb29sZWFuLCBpc0Zpbml0ZV0pO1xuICAgICAqXG4gICAgICogZnVuYygnMScpO1xuICAgICAqIC8vID0+IHRydWVcbiAgICAgKlxuICAgICAqIGZ1bmMobnVsbCk7XG4gICAgICogLy8gPT4gdHJ1ZVxuICAgICAqXG4gICAgICogZnVuYyhOYU4pO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICpcbiAgICAgKiB2YXIgbWF0Y2hlc0Z1bmMgPSBfLm92ZXJTb21lKFt7ICdhJzogMSB9LCB7ICdhJzogMiB9XSlcbiAgICAgKiB2YXIgbWF0Y2hlc1Byb3BlcnR5RnVuYyA9IF8ub3ZlclNvbWUoW1snYScsIDFdLCBbJ2EnLCAyXV0pXG4gICAgICovXG4gICAgdmFyIG92ZXJTb21lID0gY3JlYXRlT3ZlcihhcnJheVNvbWUpO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgdmFsdWUgYXQgYHBhdGhgIG9mIGEgZ2l2ZW4gb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDIuNC4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGFjY2Vzc29yIGZ1bmN0aW9uLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFtcbiAgICAgKiAgIHsgJ2EnOiB7ICdiJzogMiB9IH0sXG4gICAgICogICB7ICdhJzogeyAnYic6IDEgfSB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIF8ubWFwKG9iamVjdHMsIF8ucHJvcGVydHkoJ2EuYicpKTtcbiAgICAgKiAvLyA9PiBbMiwgMV1cbiAgICAgKlxuICAgICAqIF8ubWFwKF8uc29ydEJ5KG9iamVjdHMsIF8ucHJvcGVydHkoWydhJywgJ2InXSkpLCAnYS5iJyk7XG4gICAgICogLy8gPT4gWzEsIDJdXG4gICAgICovXG4gICAgZnVuY3Rpb24gcHJvcGVydHkocGF0aCkge1xuICAgICAgcmV0dXJuIGlzS2V5KHBhdGgpID8gYmFzZVByb3BlcnR5KHRvS2V5KHBhdGgpKSA6IGJhc2VQcm9wZXJ0eURlZXAocGF0aCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIG9wcG9zaXRlIG9mIGBfLnByb3BlcnR5YDsgdGhpcyBtZXRob2QgY3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJuc1xuICAgICAqIHRoZSB2YWx1ZSBhdCBhIGdpdmVuIHBhdGggb2YgYG9iamVjdGAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS5cbiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBhY2Nlc3NvciBmdW5jdGlvbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5ID0gWzAsIDEsIDJdLFxuICAgICAqICAgICBvYmplY3QgPSB7ICdhJzogYXJyYXksICdiJzogYXJyYXksICdjJzogYXJyYXkgfTtcbiAgICAgKlxuICAgICAqIF8ubWFwKFsnYVsyXScsICdjWzBdJ10sIF8ucHJvcGVydHlPZihvYmplY3QpKTtcbiAgICAgKiAvLyA9PiBbMiwgMF1cbiAgICAgKlxuICAgICAqIF8ubWFwKFtbJ2EnLCAnMiddLCBbJ2MnLCAnMCddXSwgXy5wcm9wZXJ0eU9mKG9iamVjdCkpO1xuICAgICAqIC8vID0+IFsyLCAwXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHByb3BlcnR5T2Yob2JqZWN0KSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24ocGF0aCkge1xuICAgICAgICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyB1bmRlZmluZWQgOiBiYXNlR2V0KG9iamVjdCwgcGF0aCk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgbnVtYmVycyAocG9zaXRpdmUgYW5kL29yIG5lZ2F0aXZlKSBwcm9ncmVzc2luZyBmcm9tXG4gICAgICogYHN0YXJ0YCB1cCB0bywgYnV0IG5vdCBpbmNsdWRpbmcsIGBlbmRgLiBBIHN0ZXAgb2YgYC0xYCBpcyB1c2VkIGlmIGEgbmVnYXRpdmVcbiAgICAgKiBgc3RhcnRgIGlzIHNwZWNpZmllZCB3aXRob3V0IGFuIGBlbmRgIG9yIGBzdGVwYC4gSWYgYGVuZGAgaXMgbm90IHNwZWNpZmllZCxcbiAgICAgKiBpdCdzIHNldCB0byBgc3RhcnRgIHdpdGggYHN0YXJ0YCB0aGVuIHNldCB0byBgMGAuXG4gICAgICpcbiAgICAgKiAqKk5vdGU6KiogSmF2YVNjcmlwdCBmb2xsb3dzIHRoZSBJRUVFLTc1NCBzdGFuZGFyZCBmb3IgcmVzb2x2aW5nXG4gICAgICogZmxvYXRpbmctcG9pbnQgdmFsdWVzIHdoaWNoIGNhbiBwcm9kdWNlIHVuZXhwZWN0ZWQgcmVzdWx0cy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzdGFydD0wXSBUaGUgc3RhcnQgb2YgdGhlIHJhbmdlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBlbmQgVGhlIGVuZCBvZiB0aGUgcmFuZ2UuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtzdGVwPTFdIFRoZSB2YWx1ZSB0byBpbmNyZW1lbnQgb3IgZGVjcmVtZW50IGJ5LlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgcmFuZ2Ugb2YgbnVtYmVycy5cbiAgICAgKiBAc2VlIF8uaW5SYW5nZSwgXy5yYW5nZVJpZ2h0XG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8ucmFuZ2UoNCk7XG4gICAgICogLy8gPT4gWzAsIDEsIDIsIDNdXG4gICAgICpcbiAgICAgKiBfLnJhbmdlKC00KTtcbiAgICAgKiAvLyA9PiBbMCwgLTEsIC0yLCAtM11cbiAgICAgKlxuICAgICAqIF8ucmFuZ2UoMSwgNSk7XG4gICAgICogLy8gPT4gWzEsIDIsIDMsIDRdXG4gICAgICpcbiAgICAgKiBfLnJhbmdlKDAsIDIwLCA1KTtcbiAgICAgKiAvLyA9PiBbMCwgNSwgMTAsIDE1XVxuICAgICAqXG4gICAgICogXy5yYW5nZSgwLCAtNCwgLTEpO1xuICAgICAqIC8vID0+IFswLCAtMSwgLTIsIC0zXVxuICAgICAqXG4gICAgICogXy5yYW5nZSgxLCA0LCAwKTtcbiAgICAgKiAvLyA9PiBbMSwgMSwgMV1cbiAgICAgKlxuICAgICAqIF8ucmFuZ2UoMCk7XG4gICAgICogLy8gPT4gW11cbiAgICAgKi9cbiAgICB2YXIgcmFuZ2UgPSBjcmVhdGVSYW5nZSgpO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5yYW5nZWAgZXhjZXB0IHRoYXQgaXQgcG9wdWxhdGVzIHZhbHVlcyBpblxuICAgICAqIGRlc2NlbmRpbmcgb3JkZXIuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9MF0gVGhlIHN0YXJ0IG9mIHRoZSByYW5nZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZW5kIFRoZSBlbmQgb2YgdGhlIHJhbmdlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RlcD0xXSBUaGUgdmFsdWUgdG8gaW5jcmVtZW50IG9yIGRlY3JlbWVudCBieS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHJhbmdlIG9mIG51bWJlcnMuXG4gICAgICogQHNlZSBfLmluUmFuZ2UsIF8ucmFuZ2VcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5yYW5nZVJpZ2h0KDQpO1xuICAgICAqIC8vID0+IFszLCAyLCAxLCAwXVxuICAgICAqXG4gICAgICogXy5yYW5nZVJpZ2h0KC00KTtcbiAgICAgKiAvLyA9PiBbLTMsIC0yLCAtMSwgMF1cbiAgICAgKlxuICAgICAqIF8ucmFuZ2VSaWdodCgxLCA1KTtcbiAgICAgKiAvLyA9PiBbNCwgMywgMiwgMV1cbiAgICAgKlxuICAgICAqIF8ucmFuZ2VSaWdodCgwLCAyMCwgNSk7XG4gICAgICogLy8gPT4gWzE1LCAxMCwgNSwgMF1cbiAgICAgKlxuICAgICAqIF8ucmFuZ2VSaWdodCgwLCAtNCwgLTEpO1xuICAgICAqIC8vID0+IFstMywgLTIsIC0xLCAwXVxuICAgICAqXG4gICAgICogXy5yYW5nZVJpZ2h0KDEsIDQsIDApO1xuICAgICAqIC8vID0+IFsxLCAxLCAxXVxuICAgICAqXG4gICAgICogXy5yYW5nZVJpZ2h0KDApO1xuICAgICAqIC8vID0+IFtdXG4gICAgICovXG4gICAgdmFyIHJhbmdlUmlnaHQgPSBjcmVhdGVSYW5nZSh0cnVlKTtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgYSBuZXcgZW1wdHkgYXJyYXkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4xMy4wXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBlbXB0eSBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIGFycmF5cyA9IF8udGltZXMoMiwgXy5zdHViQXJyYXkpO1xuICAgICAqXG4gICAgICogY29uc29sZS5sb2coYXJyYXlzKTtcbiAgICAgKiAvLyA9PiBbW10sIFtdXVxuICAgICAqXG4gICAgICogY29uc29sZS5sb2coYXJyYXlzWzBdID09PSBhcnJheXNbMV0pO1xuICAgICAqIC8vID0+IGZhbHNlXG4gICAgICovXG4gICAgZnVuY3Rpb24gc3R1YkFycmF5KCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgYGZhbHNlYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjEzLjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGBmYWxzZWAuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8udGltZXMoMiwgXy5zdHViRmFsc2UpO1xuICAgICAqIC8vID0+IFtmYWxzZSwgZmFsc2VdXG4gICAgICovXG4gICAgZnVuY3Rpb24gc3R1YkZhbHNlKCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgYSBuZXcgZW1wdHkgb2JqZWN0LlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMTMuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IGVtcHR5IG9iamVjdC5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdHMgPSBfLnRpbWVzKDIsIF8uc3R1Yk9iamVjdCk7XG4gICAgICpcbiAgICAgKiBjb25zb2xlLmxvZyhvYmplY3RzKTtcbiAgICAgKiAvLyA9PiBbe30sIHt9XVxuICAgICAqXG4gICAgICogY29uc29sZS5sb2cob2JqZWN0c1swXSA9PT0gb2JqZWN0c1sxXSk7XG4gICAgICogLy8gPT4gZmFsc2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzdHViT2JqZWN0KCkge1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgYW4gZW1wdHkgc3RyaW5nLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMTMuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgZW1wdHkgc3RyaW5nLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRpbWVzKDIsIF8uc3R1YlN0cmluZyk7XG4gICAgICogLy8gPT4gWycnLCAnJ11cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzdHViU3RyaW5nKCkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgYHRydWVgLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuMTMuMFxuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnRpbWVzKDIsIF8uc3R1YlRydWUpO1xuICAgICAqIC8vID0+IFt0cnVlLCB0cnVlXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHN0dWJUcnVlKCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW52b2tlcyB0aGUgaXRlcmF0ZWUgYG5gIHRpbWVzLCByZXR1cm5pbmcgYW4gYXJyYXkgb2YgdGhlIHJlc3VsdHMgb2ZcbiAgICAgKiBlYWNoIGludm9jYXRpb24uIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OyAoaW5kZXgpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IFV0aWxcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRvIGludm9rZSBgaXRlcmF0ZWVgLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLlxuICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcmVzdWx0cy5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50aW1lcygzLCBTdHJpbmcpO1xuICAgICAqIC8vID0+IFsnMCcsICcxJywgJzInXVxuICAgICAqXG4gICAgICogIF8udGltZXMoNCwgXy5jb25zdGFudCgwKSk7XG4gICAgICogLy8gPT4gWzAsIDAsIDAsIDBdXG4gICAgICovXG4gICAgZnVuY3Rpb24gdGltZXMobiwgaXRlcmF0ZWUpIHtcbiAgICAgIG4gPSB0b0ludGVnZXIobik7XG4gICAgICBpZiAobiA8IDEgfHwgbiA+IE1BWF9TQUZFX0lOVEVHRVIpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgdmFyIGluZGV4ID0gTUFYX0FSUkFZX0xFTkdUSCxcbiAgICAgICAgICBsZW5ndGggPSBuYXRpdmVNaW4obiwgTUFYX0FSUkFZX0xFTkdUSCk7XG5cbiAgICAgIGl0ZXJhdGVlID0gZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUpO1xuICAgICAgbiAtPSBNQVhfQVJSQVlfTEVOR1RIO1xuXG4gICAgICB2YXIgcmVzdWx0ID0gYmFzZVRpbWVzKGxlbmd0aCwgaXRlcmF0ZWUpO1xuICAgICAgd2hpbGUgKCsraW5kZXggPCBuKSB7XG4gICAgICAgIGl0ZXJhdGVlKGluZGV4KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYHZhbHVlYCB0byBhIHByb3BlcnR5IHBhdGggYXJyYXkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgVXRpbFxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgcHJvcGVydHkgcGF0aCBhcnJheS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy50b1BhdGgoJ2EuYi5jJyk7XG4gICAgICogLy8gPT4gWydhJywgJ2InLCAnYyddXG4gICAgICpcbiAgICAgKiBfLnRvUGF0aCgnYVswXS5iLmMnKTtcbiAgICAgKiAvLyA9PiBbJ2EnLCAnMCcsICdiJywgJ2MnXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRvUGF0aCh2YWx1ZSkge1xuICAgICAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBhcnJheU1hcCh2YWx1ZSwgdG9LZXkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGlzU3ltYm9sKHZhbHVlKSA/IFt2YWx1ZV0gOiBjb3B5QXJyYXkoc3RyaW5nVG9QYXRoKHRvU3RyaW5nKHZhbHVlKSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlcyBhIHVuaXF1ZSBJRC4gSWYgYHByZWZpeGAgaXMgZ2l2ZW4sIHRoZSBJRCBpcyBhcHBlbmRlZCB0byBpdC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAc2luY2UgMC4xLjBcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBjYXRlZ29yeSBVdGlsXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtwcmVmaXg9JyddIFRoZSB2YWx1ZSB0byBwcmVmaXggdGhlIElEIHdpdGguXG4gICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgdW5pcXVlIElELlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnVuaXF1ZUlkKCdjb250YWN0XycpO1xuICAgICAqIC8vID0+ICdjb250YWN0XzEwNCdcbiAgICAgKlxuICAgICAqIF8udW5pcXVlSWQoKTtcbiAgICAgKiAvLyA9PiAnMTA1J1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHVuaXF1ZUlkKHByZWZpeCkge1xuICAgICAgdmFyIGlkID0gKytpZENvdW50ZXI7XG4gICAgICByZXR1cm4gdG9TdHJpbmcocHJlZml4KSArIGlkO1xuICAgIH1cblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8qKlxuICAgICAqIEFkZHMgdHdvIG51bWJlcnMuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgMy40LjBcbiAgICAgKiBAY2F0ZWdvcnkgTWF0aFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBhdWdlbmQgVGhlIGZpcnN0IG51bWJlciBpbiBhbiBhZGRpdGlvbi5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYWRkZW5kIFRoZSBzZWNvbmQgbnVtYmVyIGluIGFuIGFkZGl0aW9uLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHRvdGFsLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmFkZCg2LCA0KTtcbiAgICAgKiAvLyA9PiAxMFxuICAgICAqL1xuICAgIHZhciBhZGQgPSBjcmVhdGVNYXRoT3BlcmF0aW9uKGZ1bmN0aW9uKGF1Z2VuZCwgYWRkZW5kKSB7XG4gICAgICByZXR1cm4gYXVnZW5kICsgYWRkZW5kO1xuICAgIH0sIDApO1xuXG4gICAgLyoqXG4gICAgICogQ29tcHV0ZXMgYG51bWJlcmAgcm91bmRlZCB1cCB0byBgcHJlY2lzaW9uYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjEwLjBcbiAgICAgKiBAY2F0ZWdvcnkgTWF0aFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBudW1iZXIgVGhlIG51bWJlciB0byByb3VuZCB1cC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3ByZWNpc2lvbj0wXSBUaGUgcHJlY2lzaW9uIHRvIHJvdW5kIHVwIHRvLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHJvdW5kZWQgdXAgbnVtYmVyLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLmNlaWwoNC4wMDYpO1xuICAgICAqIC8vID0+IDVcbiAgICAgKlxuICAgICAqIF8uY2VpbCg2LjAwNCwgMik7XG4gICAgICogLy8gPT4gNi4wMVxuICAgICAqXG4gICAgICogXy5jZWlsKDYwNDAsIC0yKTtcbiAgICAgKiAvLyA9PiA2MTAwXG4gICAgICovXG4gICAgdmFyIGNlaWwgPSBjcmVhdGVSb3VuZCgnY2VpbCcpO1xuXG4gICAgLyoqXG4gICAgICogRGl2aWRlIHR3byBudW1iZXJzLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuNy4wXG4gICAgICogQGNhdGVnb3J5IE1hdGhcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZGl2aWRlbmQgVGhlIGZpcnN0IG51bWJlciBpbiBhIGRpdmlzaW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBkaXZpc29yIFRoZSBzZWNvbmQgbnVtYmVyIGluIGEgZGl2aXNpb24uXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgcXVvdGllbnQuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZGl2aWRlKDYsIDQpO1xuICAgICAqIC8vID0+IDEuNVxuICAgICAqL1xuICAgIHZhciBkaXZpZGUgPSBjcmVhdGVNYXRoT3BlcmF0aW9uKGZ1bmN0aW9uKGRpdmlkZW5kLCBkaXZpc29yKSB7XG4gICAgICByZXR1cm4gZGl2aWRlbmQgLyBkaXZpc29yO1xuICAgIH0sIDEpO1xuXG4gICAgLyoqXG4gICAgICogQ29tcHV0ZXMgYG51bWJlcmAgcm91bmRlZCBkb3duIHRvIGBwcmVjaXNpb25gLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDMuMTAuMFxuICAgICAqIEBjYXRlZ29yeSBNYXRoXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG51bWJlciBUaGUgbnVtYmVyIHRvIHJvdW5kIGRvd24uXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IFtwcmVjaXNpb249MF0gVGhlIHByZWNpc2lvbiB0byByb3VuZCBkb3duIHRvLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHJvdW5kZWQgZG93biBudW1iZXIuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uZmxvb3IoNC4wMDYpO1xuICAgICAqIC8vID0+IDRcbiAgICAgKlxuICAgICAqIF8uZmxvb3IoMC4wNDYsIDIpO1xuICAgICAqIC8vID0+IDAuMDRcbiAgICAgKlxuICAgICAqIF8uZmxvb3IoNDA2MCwgLTIpO1xuICAgICAqIC8vID0+IDQwMDBcbiAgICAgKi9cbiAgICB2YXIgZmxvb3IgPSBjcmVhdGVSb3VuZCgnZmxvb3InKTtcblxuICAgIC8qKlxuICAgICAqIENvbXB1dGVzIHRoZSBtYXhpbXVtIHZhbHVlIG9mIGBhcnJheWAuIElmIGBhcnJheWAgaXMgZW1wdHkgb3IgZmFsc2V5LFxuICAgICAqIGB1bmRlZmluZWRgIGlzIHJldHVybmVkLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IE1hdGhcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBtYXhpbXVtIHZhbHVlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLm1heChbNCwgMiwgOCwgNl0pO1xuICAgICAqIC8vID0+IDhcbiAgICAgKlxuICAgICAqIF8ubWF4KFtdKTtcbiAgICAgKiAvLyA9PiB1bmRlZmluZWRcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtYXgoYXJyYXkpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKVxuICAgICAgICA/IGJhc2VFeHRyZW11bShhcnJheSwgaWRlbnRpdHksIGJhc2VHdClcbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5tYXhgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGl0ZXJhdGVlYCB3aGljaCBpc1xuICAgICAqIGludm9rZWQgZm9yIGVhY2ggZWxlbWVudCBpbiBgYXJyYXlgIHRvIGdlbmVyYXRlIHRoZSBjcml0ZXJpb24gYnkgd2hpY2hcbiAgICAgKiB0aGUgdmFsdWUgaXMgcmFua2VkLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDogKHZhbHVlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBNYXRoXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIG1heGltdW0gdmFsdWUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gW3sgJ24nOiAxIH0sIHsgJ24nOiAyIH1dO1xuICAgICAqXG4gICAgICogXy5tYXhCeShvYmplY3RzLCBmdW5jdGlvbihvKSB7IHJldHVybiBvLm47IH0pO1xuICAgICAqIC8vID0+IHsgJ24nOiAyIH1cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8ubWF4Qnkob2JqZWN0cywgJ24nKTtcbiAgICAgKiAvLyA9PiB7ICduJzogMiB9XG4gICAgICovXG4gICAgZnVuY3Rpb24gbWF4QnkoYXJyYXksIGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aClcbiAgICAgICAgPyBiYXNlRXh0cmVtdW0oYXJyYXksIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAyKSwgYmFzZUd0KVxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb21wdXRlcyB0aGUgbWVhbiBvZiB0aGUgdmFsdWVzIGluIGBhcnJheWAuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTWF0aFxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgbWVhbi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5tZWFuKFs0LCAyLCA4LCA2XSk7XG4gICAgICogLy8gPT4gNVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG1lYW4oYXJyYXkpIHtcbiAgICAgIHJldHVybiBiYXNlTWVhbihhcnJheSwgaWRlbnRpdHkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8ubWVhbmAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgaXRlcmF0ZWVgIHdoaWNoIGlzXG4gICAgICogaW52b2tlZCBmb3IgZWFjaCBlbGVtZW50IGluIGBhcnJheWAgdG8gZ2VuZXJhdGUgdGhlIHZhbHVlIHRvIGJlIGF2ZXJhZ2VkLlxuICAgICAqIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHNpbmNlIDQuNy4wXG4gICAgICogQGNhdGVnb3J5IE1hdGhcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBtZWFuLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiB2YXIgb2JqZWN0cyA9IFt7ICduJzogNCB9LCB7ICduJzogMiB9LCB7ICduJzogOCB9LCB7ICduJzogNiB9XTtcbiAgICAgKlxuICAgICAqIF8ubWVhbkJ5KG9iamVjdHMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuIG8ubjsgfSk7XG4gICAgICogLy8gPT4gNVxuICAgICAqXG4gICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuXG4gICAgICogXy5tZWFuQnkob2JqZWN0cywgJ24nKTtcbiAgICAgKiAvLyA9PiA1XG4gICAgICovXG4gICAgZnVuY3Rpb24gbWVhbkJ5KGFycmF5LCBpdGVyYXRlZSkge1xuICAgICAgcmV0dXJuIGJhc2VNZWFuKGFycmF5LCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMikpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbXB1dGVzIHRoZSBtaW5pbXVtIHZhbHVlIG9mIGBhcnJheWAuIElmIGBhcnJheWAgaXMgZW1wdHkgb3IgZmFsc2V5LFxuICAgICAqIGB1bmRlZmluZWRgIGlzIHJldHVybmVkLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBzaW5jZSAwLjEuMFxuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQGNhdGVnb3J5IE1hdGhcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBtaW5pbXVtIHZhbHVlLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLm1pbihbNCwgMiwgOCwgNl0pO1xuICAgICAqIC8vID0+IDJcbiAgICAgKlxuICAgICAqIF8ubWluKFtdKTtcbiAgICAgKiAvLyA9PiB1bmRlZmluZWRcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtaW4oYXJyYXkpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKVxuICAgICAgICA/IGJhc2VFeHRyZW11bShhcnJheSwgaWRlbnRpdHksIGJhc2VMdClcbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5taW5gIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGl0ZXJhdGVlYCB3aGljaCBpc1xuICAgICAqIGludm9rZWQgZm9yIGVhY2ggZWxlbWVudCBpbiBgYXJyYXlgIHRvIGdlbmVyYXRlIHRoZSBjcml0ZXJpb24gYnkgd2hpY2hcbiAgICAgKiB0aGUgdmFsdWUgaXMgcmFua2VkLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDogKHZhbHVlKS5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBNYXRoXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIG1pbmltdW0gdmFsdWUuXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIHZhciBvYmplY3RzID0gW3sgJ24nOiAxIH0sIHsgJ24nOiAyIH1dO1xuICAgICAqXG4gICAgICogXy5taW5CeShvYmplY3RzLCBmdW5jdGlvbihvKSB7IHJldHVybiBvLm47IH0pO1xuICAgICAqIC8vID0+IHsgJ24nOiAxIH1cbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8ubWluQnkob2JqZWN0cywgJ24nKTtcbiAgICAgKiAvLyA9PiB7ICduJzogMSB9XG4gICAgICovXG4gICAgZnVuY3Rpb24gbWluQnkoYXJyYXksIGl0ZXJhdGVlKSB7XG4gICAgICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aClcbiAgICAgICAgPyBiYXNlRXh0cmVtdW0oYXJyYXksIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAyKSwgYmFzZUx0KVxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNdWx0aXBseSB0d28gbnVtYmVycy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjcuMFxuICAgICAqIEBjYXRlZ29yeSBNYXRoXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG11bHRpcGxpZXIgVGhlIGZpcnN0IG51bWJlciBpbiBhIG11bHRpcGxpY2F0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBtdWx0aXBsaWNhbmQgVGhlIHNlY29uZCBudW1iZXIgaW4gYSBtdWx0aXBsaWNhdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBwcm9kdWN0LlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLm11bHRpcGx5KDYsIDQpO1xuICAgICAqIC8vID0+IDI0XG4gICAgICovXG4gICAgdmFyIG11bHRpcGx5ID0gY3JlYXRlTWF0aE9wZXJhdGlvbihmdW5jdGlvbihtdWx0aXBsaWVyLCBtdWx0aXBsaWNhbmQpIHtcbiAgICAgIHJldHVybiBtdWx0aXBsaWVyICogbXVsdGlwbGljYW5kO1xuICAgIH0sIDEpO1xuXG4gICAgLyoqXG4gICAgICogQ29tcHV0ZXMgYG51bWJlcmAgcm91bmRlZCB0byBgcHJlY2lzaW9uYC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjEwLjBcbiAgICAgKiBAY2F0ZWdvcnkgTWF0aFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBudW1iZXIgVGhlIG51bWJlciB0byByb3VuZC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3ByZWNpc2lvbj0wXSBUaGUgcHJlY2lzaW9uIHRvIHJvdW5kIHRvLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHJvdW5kZWQgbnVtYmVyLlxuICAgICAqIEBleGFtcGxlXG4gICAgICpcbiAgICAgKiBfLnJvdW5kKDQuMDA2KTtcbiAgICAgKiAvLyA9PiA0XG4gICAgICpcbiAgICAgKiBfLnJvdW5kKDQuMDA2LCAyKTtcbiAgICAgKiAvLyA9PiA0LjAxXG4gICAgICpcbiAgICAgKiBfLnJvdW5kKDQwNjAsIC0yKTtcbiAgICAgKiAvLyA9PiA0MTAwXG4gICAgICovXG4gICAgdmFyIHJvdW5kID0gY3JlYXRlUm91bmQoJ3JvdW5kJyk7XG5cbiAgICAvKipcbiAgICAgKiBTdWJ0cmFjdCB0d28gbnVtYmVycy5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSA0LjAuMFxuICAgICAqIEBjYXRlZ29yeSBNYXRoXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG1pbnVlbmQgVGhlIGZpcnN0IG51bWJlciBpbiBhIHN1YnRyYWN0aW9uLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzdWJ0cmFoZW5kIFRoZSBzZWNvbmQgbnVtYmVyIGluIGEgc3VidHJhY3Rpb24uXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgZGlmZmVyZW5jZS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogXy5zdWJ0cmFjdCg2LCA0KTtcbiAgICAgKiAvLyA9PiAyXG4gICAgICovXG4gICAgdmFyIHN1YnRyYWN0ID0gY3JlYXRlTWF0aE9wZXJhdGlvbihmdW5jdGlvbihtaW51ZW5kLCBzdWJ0cmFoZW5kKSB7XG4gICAgICByZXR1cm4gbWludWVuZCAtIHN1YnRyYWhlbmQ7XG4gICAgfSwgMCk7XG5cbiAgICAvKipcbiAgICAgKiBDb21wdXRlcyB0aGUgc3VtIG9mIHRoZSB2YWx1ZXMgaW4gYGFycmF5YC5cbiAgICAgKlxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAbWVtYmVyT2YgX1xuICAgICAqIEBzaW5jZSAzLjQuMFxuICAgICAqIEBjYXRlZ29yeSBNYXRoXG4gICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBzdW0uXG4gICAgICogQGV4YW1wbGVcbiAgICAgKlxuICAgICAqIF8uc3VtKFs0LCAyLCA4LCA2XSk7XG4gICAgICogLy8gPT4gMjBcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzdW0oYXJyYXkpIHtcbiAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKVxuICAgICAgICA/IGJhc2VTdW0oYXJyYXksIGlkZW50aXR5KVxuICAgICAgICA6IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5zdW1gIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGl0ZXJhdGVlYCB3aGljaCBpc1xuICAgICAqIGludm9rZWQgZm9yIGVhY2ggZWxlbWVudCBpbiBgYXJyYXlgIHRvIGdlbmVyYXRlIHRoZSB2YWx1ZSB0byBiZSBzdW1tZWQuXG4gICAgICogVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6ICh2YWx1ZSkuXG4gICAgICpcbiAgICAgKiBAc3RhdGljXG4gICAgICogQG1lbWJlck9mIF9cbiAgICAgKiBAc2luY2UgNC4wLjBcbiAgICAgKiBAY2F0ZWdvcnkgTWF0aFxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHN1bS5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqXG4gICAgICogdmFyIG9iamVjdHMgPSBbeyAnbic6IDQgfSwgeyAnbic6IDIgfSwgeyAnbic6IDggfSwgeyAnbic6IDYgfV07XG4gICAgICpcbiAgICAgKiBfLnN1bUJ5KG9iamVjdHMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuIG8ubjsgfSk7XG4gICAgICogLy8gPT4gMjBcbiAgICAgKlxuICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLlxuICAgICAqIF8uc3VtQnkob2JqZWN0cywgJ24nKTtcbiAgICAgKiAvLyA9PiAyMFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHN1bUJ5KGFycmF5LCBpdGVyYXRlZSkge1xuICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpXG4gICAgICAgID8gYmFzZVN1bShhcnJheSwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDIpKVxuICAgICAgICA6IDA7XG4gICAgfVxuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLy8gQWRkIG1ldGhvZHMgdGhhdCByZXR1cm4gd3JhcHBlZCB2YWx1ZXMgaW4gY2hhaW4gc2VxdWVuY2VzLlxuICAgIGxvZGFzaC5hZnRlciA9IGFmdGVyO1xuICAgIGxvZGFzaC5hcnkgPSBhcnk7XG4gICAgbG9kYXNoLmFzc2lnbiA9IGFzc2lnbjtcbiAgICBsb2Rhc2guYXNzaWduSW4gPSBhc3NpZ25JbjtcbiAgICBsb2Rhc2guYXNzaWduSW5XaXRoID0gYXNzaWduSW5XaXRoO1xuICAgIGxvZGFzaC5hc3NpZ25XaXRoID0gYXNzaWduV2l0aDtcbiAgICBsb2Rhc2guYXQgPSBhdDtcbiAgICBsb2Rhc2guYmVmb3JlID0gYmVmb3JlO1xuICAgIGxvZGFzaC5iaW5kID0gYmluZDtcbiAgICBsb2Rhc2guYmluZEFsbCA9IGJpbmRBbGw7XG4gICAgbG9kYXNoLmJpbmRLZXkgPSBiaW5kS2V5O1xuICAgIGxvZGFzaC5jYXN0QXJyYXkgPSBjYXN0QXJyYXk7XG4gICAgbG9kYXNoLmNoYWluID0gY2hhaW47XG4gICAgbG9kYXNoLmNodW5rID0gY2h1bms7XG4gICAgbG9kYXNoLmNvbXBhY3QgPSBjb21wYWN0O1xuICAgIGxvZGFzaC5jb25jYXQgPSBjb25jYXQ7XG4gICAgbG9kYXNoLmNvbmQgPSBjb25kO1xuICAgIGxvZGFzaC5jb25mb3JtcyA9IGNvbmZvcm1zO1xuICAgIGxvZGFzaC5jb25zdGFudCA9IGNvbnN0YW50O1xuICAgIGxvZGFzaC5jb3VudEJ5ID0gY291bnRCeTtcbiAgICBsb2Rhc2guY3JlYXRlID0gY3JlYXRlO1xuICAgIGxvZGFzaC5jdXJyeSA9IGN1cnJ5O1xuICAgIGxvZGFzaC5jdXJyeVJpZ2h0ID0gY3VycnlSaWdodDtcbiAgICBsb2Rhc2guZGVib3VuY2UgPSBkZWJvdW5jZTtcbiAgICBsb2Rhc2guZGVmYXVsdHMgPSBkZWZhdWx0cztcbiAgICBsb2Rhc2guZGVmYXVsdHNEZWVwID0gZGVmYXVsdHNEZWVwO1xuICAgIGxvZGFzaC5kZWZlciA9IGRlZmVyO1xuICAgIGxvZGFzaC5kZWxheSA9IGRlbGF5O1xuICAgIGxvZGFzaC5kaWZmZXJlbmNlID0gZGlmZmVyZW5jZTtcbiAgICBsb2Rhc2guZGlmZmVyZW5jZUJ5ID0gZGlmZmVyZW5jZUJ5O1xuICAgIGxvZGFzaC5kaWZmZXJlbmNlV2l0aCA9IGRpZmZlcmVuY2VXaXRoO1xuICAgIGxvZGFzaC5kcm9wID0gZHJvcDtcbiAgICBsb2Rhc2guZHJvcFJpZ2h0ID0gZHJvcFJpZ2h0O1xuICAgIGxvZGFzaC5kcm9wUmlnaHRXaGlsZSA9IGRyb3BSaWdodFdoaWxlO1xuICAgIGxvZGFzaC5kcm9wV2hpbGUgPSBkcm9wV2hpbGU7XG4gICAgbG9kYXNoLmZpbGwgPSBmaWxsO1xuICAgIGxvZGFzaC5maWx0ZXIgPSBmaWx0ZXI7XG4gICAgbG9kYXNoLmZsYXRNYXAgPSBmbGF0TWFwO1xuICAgIGxvZGFzaC5mbGF0TWFwRGVlcCA9IGZsYXRNYXBEZWVwO1xuICAgIGxvZGFzaC5mbGF0TWFwRGVwdGggPSBmbGF0TWFwRGVwdGg7XG4gICAgbG9kYXNoLmZsYXR0ZW4gPSBmbGF0dGVuO1xuICAgIGxvZGFzaC5mbGF0dGVuRGVlcCA9IGZsYXR0ZW5EZWVwO1xuICAgIGxvZGFzaC5mbGF0dGVuRGVwdGggPSBmbGF0dGVuRGVwdGg7XG4gICAgbG9kYXNoLmZsaXAgPSBmbGlwO1xuICAgIGxvZGFzaC5mbG93ID0gZmxvdztcbiAgICBsb2Rhc2guZmxvd1JpZ2h0ID0gZmxvd1JpZ2h0O1xuICAgIGxvZGFzaC5mcm9tUGFpcnMgPSBmcm9tUGFpcnM7XG4gICAgbG9kYXNoLmZ1bmN0aW9ucyA9IGZ1bmN0aW9ucztcbiAgICBsb2Rhc2guZnVuY3Rpb25zSW4gPSBmdW5jdGlvbnNJbjtcbiAgICBsb2Rhc2guZ3JvdXBCeSA9IGdyb3VwQnk7XG4gICAgbG9kYXNoLmluaXRpYWwgPSBpbml0aWFsO1xuICAgIGxvZGFzaC5pbnRlcnNlY3Rpb24gPSBpbnRlcnNlY3Rpb247XG4gICAgbG9kYXNoLmludGVyc2VjdGlvbkJ5ID0gaW50ZXJzZWN0aW9uQnk7XG4gICAgbG9kYXNoLmludGVyc2VjdGlvbldpdGggPSBpbnRlcnNlY3Rpb25XaXRoO1xuICAgIGxvZGFzaC5pbnZlcnQgPSBpbnZlcnQ7XG4gICAgbG9kYXNoLmludmVydEJ5ID0gaW52ZXJ0Qnk7XG4gICAgbG9kYXNoLmludm9rZU1hcCA9IGludm9rZU1hcDtcbiAgICBsb2Rhc2guaXRlcmF0ZWUgPSBpdGVyYXRlZTtcbiAgICBsb2Rhc2gua2V5QnkgPSBrZXlCeTtcbiAgICBsb2Rhc2gua2V5cyA9IGtleXM7XG4gICAgbG9kYXNoLmtleXNJbiA9IGtleXNJbjtcbiAgICBsb2Rhc2gubWFwID0gbWFwO1xuICAgIGxvZGFzaC5tYXBLZXlzID0gbWFwS2V5cztcbiAgICBsb2Rhc2gubWFwVmFsdWVzID0gbWFwVmFsdWVzO1xuICAgIGxvZGFzaC5tYXRjaGVzID0gbWF0Y2hlcztcbiAgICBsb2Rhc2gubWF0Y2hlc1Byb3BlcnR5ID0gbWF0Y2hlc1Byb3BlcnR5O1xuICAgIGxvZGFzaC5tZW1vaXplID0gbWVtb2l6ZTtcbiAgICBsb2Rhc2gubWVyZ2UgPSBtZXJnZTtcbiAgICBsb2Rhc2gubWVyZ2VXaXRoID0gbWVyZ2VXaXRoO1xuICAgIGxvZGFzaC5tZXRob2QgPSBtZXRob2Q7XG4gICAgbG9kYXNoLm1ldGhvZE9mID0gbWV0aG9kT2Y7XG4gICAgbG9kYXNoLm1peGluID0gbWl4aW47XG4gICAgbG9kYXNoLm5lZ2F0ZSA9IG5lZ2F0ZTtcbiAgICBsb2Rhc2gubnRoQXJnID0gbnRoQXJnO1xuICAgIGxvZGFzaC5vbWl0ID0gb21pdDtcbiAgICBsb2Rhc2gub21pdEJ5ID0gb21pdEJ5O1xuICAgIGxvZGFzaC5vbmNlID0gb25jZTtcbiAgICBsb2Rhc2gub3JkZXJCeSA9IG9yZGVyQnk7XG4gICAgbG9kYXNoLm92ZXIgPSBvdmVyO1xuICAgIGxvZGFzaC5vdmVyQXJncyA9IG92ZXJBcmdzO1xuICAgIGxvZGFzaC5vdmVyRXZlcnkgPSBvdmVyRXZlcnk7XG4gICAgbG9kYXNoLm92ZXJTb21lID0gb3ZlclNvbWU7XG4gICAgbG9kYXNoLnBhcnRpYWwgPSBwYXJ0aWFsO1xuICAgIGxvZGFzaC5wYXJ0aWFsUmlnaHQgPSBwYXJ0aWFsUmlnaHQ7XG4gICAgbG9kYXNoLnBhcnRpdGlvbiA9IHBhcnRpdGlvbjtcbiAgICBsb2Rhc2gucGljayA9IHBpY2s7XG4gICAgbG9kYXNoLnBpY2tCeSA9IHBpY2tCeTtcbiAgICBsb2Rhc2gucHJvcGVydHkgPSBwcm9wZXJ0eTtcbiAgICBsb2Rhc2gucHJvcGVydHlPZiA9IHByb3BlcnR5T2Y7XG4gICAgbG9kYXNoLnB1bGwgPSBwdWxsO1xuICAgIGxvZGFzaC5wdWxsQWxsID0gcHVsbEFsbDtcbiAgICBsb2Rhc2gucHVsbEFsbEJ5ID0gcHVsbEFsbEJ5O1xuICAgIGxvZGFzaC5wdWxsQWxsV2l0aCA9IHB1bGxBbGxXaXRoO1xuICAgIGxvZGFzaC5wdWxsQXQgPSBwdWxsQXQ7XG4gICAgbG9kYXNoLnJhbmdlID0gcmFuZ2U7XG4gICAgbG9kYXNoLnJhbmdlUmlnaHQgPSByYW5nZVJpZ2h0O1xuICAgIGxvZGFzaC5yZWFyZyA9IHJlYXJnO1xuICAgIGxvZGFzaC5yZWplY3QgPSByZWplY3Q7XG4gICAgbG9kYXNoLnJlbW92ZSA9IHJlbW92ZTtcbiAgICBsb2Rhc2gucmVzdCA9IHJlc3Q7XG4gICAgbG9kYXNoLnJldmVyc2UgPSByZXZlcnNlO1xuICAgIGxvZGFzaC5zYW1wbGVTaXplID0gc2FtcGxlU2l6ZTtcbiAgICBsb2Rhc2guc2V0ID0gc2V0O1xuICAgIGxvZGFzaC5zZXRXaXRoID0gc2V0V2l0aDtcbiAgICBsb2Rhc2guc2h1ZmZsZSA9IHNodWZmbGU7XG4gICAgbG9kYXNoLnNsaWNlID0gc2xpY2U7XG4gICAgbG9kYXNoLnNvcnRCeSA9IHNvcnRCeTtcbiAgICBsb2Rhc2guc29ydGVkVW5pcSA9IHNvcnRlZFVuaXE7XG4gICAgbG9kYXNoLnNvcnRlZFVuaXFCeSA9IHNvcnRlZFVuaXFCeTtcbiAgICBsb2Rhc2guc3BsaXQgPSBzcGxpdDtcbiAgICBsb2Rhc2guc3ByZWFkID0gc3ByZWFkO1xuICAgIGxvZGFzaC50YWlsID0gdGFpbDtcbiAgICBsb2Rhc2gudGFrZSA9IHRha2U7XG4gICAgbG9kYXNoLnRha2VSaWdodCA9IHRha2VSaWdodDtcbiAgICBsb2Rhc2gudGFrZVJpZ2h0V2hpbGUgPSB0YWtlUmlnaHRXaGlsZTtcbiAgICBsb2Rhc2gudGFrZVdoaWxlID0gdGFrZVdoaWxlO1xuICAgIGxvZGFzaC50YXAgPSB0YXA7XG4gICAgbG9kYXNoLnRocm90dGxlID0gdGhyb3R0bGU7XG4gICAgbG9kYXNoLnRocnUgPSB0aHJ1O1xuICAgIGxvZGFzaC50b0FycmF5ID0gdG9BcnJheTtcbiAgICBsb2Rhc2gudG9QYWlycyA9IHRvUGFpcnM7XG4gICAgbG9kYXNoLnRvUGFpcnNJbiA9IHRvUGFpcnNJbjtcbiAgICBsb2Rhc2gudG9QYXRoID0gdG9QYXRoO1xuICAgIGxvZGFzaC50b1BsYWluT2JqZWN0ID0gdG9QbGFpbk9iamVjdDtcbiAgICBsb2Rhc2gudHJhbnNmb3JtID0gdHJhbnNmb3JtO1xuICAgIGxvZGFzaC51bmFyeSA9IHVuYXJ5O1xuICAgIGxvZGFzaC51bmlvbiA9IHVuaW9uO1xuICAgIGxvZGFzaC51bmlvbkJ5ID0gdW5pb25CeTtcbiAgICBsb2Rhc2gudW5pb25XaXRoID0gdW5pb25XaXRoO1xuICAgIGxvZGFzaC51bmlxID0gdW5pcTtcbiAgICBsb2Rhc2gudW5pcUJ5ID0gdW5pcUJ5O1xuICAgIGxvZGFzaC51bmlxV2l0aCA9IHVuaXFXaXRoO1xuICAgIGxvZGFzaC51bnNldCA9IHVuc2V0O1xuICAgIGxvZGFzaC51bnppcCA9IHVuemlwO1xuICAgIGxvZGFzaC51bnppcFdpdGggPSB1bnppcFdpdGg7XG4gICAgbG9kYXNoLnVwZGF0ZSA9IHVwZGF0ZTtcbiAgICBsb2Rhc2gudXBkYXRlV2l0aCA9IHVwZGF0ZVdpdGg7XG4gICAgbG9kYXNoLnZhbHVlcyA9IHZhbHVlcztcbiAgICBsb2Rhc2gudmFsdWVzSW4gPSB2YWx1ZXNJbjtcbiAgICBsb2Rhc2gud2l0aG91dCA9IHdpdGhvdXQ7XG4gICAgbG9kYXNoLndvcmRzID0gd29yZHM7XG4gICAgbG9kYXNoLndyYXAgPSB3cmFwO1xuICAgIGxvZGFzaC54b3IgPSB4b3I7XG4gICAgbG9kYXNoLnhvckJ5ID0geG9yQnk7XG4gICAgbG9kYXNoLnhvcldpdGggPSB4b3JXaXRoO1xuICAgIGxvZGFzaC56aXAgPSB6aXA7XG4gICAgbG9kYXNoLnppcE9iamVjdCA9IHppcE9iamVjdDtcbiAgICBsb2Rhc2guemlwT2JqZWN0RGVlcCA9IHppcE9iamVjdERlZXA7XG4gICAgbG9kYXNoLnppcFdpdGggPSB6aXBXaXRoO1xuXG4gICAgLy8gQWRkIGFsaWFzZXMuXG4gICAgbG9kYXNoLmVudHJpZXMgPSB0b1BhaXJzO1xuICAgIGxvZGFzaC5lbnRyaWVzSW4gPSB0b1BhaXJzSW47XG4gICAgbG9kYXNoLmV4dGVuZCA9IGFzc2lnbkluO1xuICAgIGxvZGFzaC5leHRlbmRXaXRoID0gYXNzaWduSW5XaXRoO1xuXG4gICAgLy8gQWRkIG1ldGhvZHMgdG8gYGxvZGFzaC5wcm90b3R5cGVgLlxuICAgIG1peGluKGxvZGFzaCwgbG9kYXNoKTtcblxuICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAgIC8vIEFkZCBtZXRob2RzIHRoYXQgcmV0dXJuIHVud3JhcHBlZCB2YWx1ZXMgaW4gY2hhaW4gc2VxdWVuY2VzLlxuICAgIGxvZGFzaC5hZGQgPSBhZGQ7XG4gICAgbG9kYXNoLmF0dGVtcHQgPSBhdHRlbXB0O1xuICAgIGxvZGFzaC5jYW1lbENhc2UgPSBjYW1lbENhc2U7XG4gICAgbG9kYXNoLmNhcGl0YWxpemUgPSBjYXBpdGFsaXplO1xuICAgIGxvZGFzaC5jZWlsID0gY2VpbDtcbiAgICBsb2Rhc2guY2xhbXAgPSBjbGFtcDtcbiAgICBsb2Rhc2guY2xvbmUgPSBjbG9uZTtcbiAgICBsb2Rhc2guY2xvbmVEZWVwID0gY2xvbmVEZWVwO1xuICAgIGxvZGFzaC5jbG9uZURlZXBXaXRoID0gY2xvbmVEZWVwV2l0aDtcbiAgICBsb2Rhc2guY2xvbmVXaXRoID0gY2xvbmVXaXRoO1xuICAgIGxvZGFzaC5jb25mb3Jtc1RvID0gY29uZm9ybXNUbztcbiAgICBsb2Rhc2guZGVidXJyID0gZGVidXJyO1xuICAgIGxvZGFzaC5kZWZhdWx0VG8gPSBkZWZhdWx0VG87XG4gICAgbG9kYXNoLmRpdmlkZSA9IGRpdmlkZTtcbiAgICBsb2Rhc2guZW5kc1dpdGggPSBlbmRzV2l0aDtcbiAgICBsb2Rhc2guZXEgPSBlcTtcbiAgICBsb2Rhc2guZXNjYXBlID0gZXNjYXBlO1xuICAgIGxvZGFzaC5lc2NhcGVSZWdFeHAgPSBlc2NhcGVSZWdFeHA7XG4gICAgbG9kYXNoLmV2ZXJ5ID0gZXZlcnk7XG4gICAgbG9kYXNoLmZpbmQgPSBmaW5kO1xuICAgIGxvZGFzaC5maW5kSW5kZXggPSBmaW5kSW5kZXg7XG4gICAgbG9kYXNoLmZpbmRLZXkgPSBmaW5kS2V5O1xuICAgIGxvZGFzaC5maW5kTGFzdCA9IGZpbmRMYXN0O1xuICAgIGxvZGFzaC5maW5kTGFzdEluZGV4ID0gZmluZExhc3RJbmRleDtcbiAgICBsb2Rhc2guZmluZExhc3RLZXkgPSBmaW5kTGFzdEtleTtcbiAgICBsb2Rhc2guZmxvb3IgPSBmbG9vcjtcbiAgICBsb2Rhc2guZm9yRWFjaCA9IGZvckVhY2g7XG4gICAgbG9kYXNoLmZvckVhY2hSaWdodCA9IGZvckVhY2hSaWdodDtcbiAgICBsb2Rhc2guZm9ySW4gPSBmb3JJbjtcbiAgICBsb2Rhc2guZm9ySW5SaWdodCA9IGZvckluUmlnaHQ7XG4gICAgbG9kYXNoLmZvck93biA9IGZvck93bjtcbiAgICBsb2Rhc2guZm9yT3duUmlnaHQgPSBmb3JPd25SaWdodDtcbiAgICBsb2Rhc2guZ2V0ID0gZ2V0O1xuICAgIGxvZGFzaC5ndCA9IGd0O1xuICAgIGxvZGFzaC5ndGUgPSBndGU7XG4gICAgbG9kYXNoLmhhcyA9IGhhcztcbiAgICBsb2Rhc2guaGFzSW4gPSBoYXNJbjtcbiAgICBsb2Rhc2guaGVhZCA9IGhlYWQ7XG4gICAgbG9kYXNoLmlkZW50aXR5ID0gaWRlbnRpdHk7XG4gICAgbG9kYXNoLmluY2x1ZGVzID0gaW5jbHVkZXM7XG4gICAgbG9kYXNoLmluZGV4T2YgPSBpbmRleE9mO1xuICAgIGxvZGFzaC5pblJhbmdlID0gaW5SYW5nZTtcbiAgICBsb2Rhc2guaW52b2tlID0gaW52b2tlO1xuICAgIGxvZGFzaC5pc0FyZ3VtZW50cyA9IGlzQXJndW1lbnRzO1xuICAgIGxvZGFzaC5pc0FycmF5ID0gaXNBcnJheTtcbiAgICBsb2Rhc2guaXNBcnJheUJ1ZmZlciA9IGlzQXJyYXlCdWZmZXI7XG4gICAgbG9kYXNoLmlzQXJyYXlMaWtlID0gaXNBcnJheUxpa2U7XG4gICAgbG9kYXNoLmlzQXJyYXlMaWtlT2JqZWN0ID0gaXNBcnJheUxpa2VPYmplY3Q7XG4gICAgbG9kYXNoLmlzQm9vbGVhbiA9IGlzQm9vbGVhbjtcbiAgICBsb2Rhc2guaXNCdWZmZXIgPSBpc0J1ZmZlcjtcbiAgICBsb2Rhc2guaXNEYXRlID0gaXNEYXRlO1xuICAgIGxvZGFzaC5pc0VsZW1lbnQgPSBpc0VsZW1lbnQ7XG4gICAgbG9kYXNoLmlzRW1wdHkgPSBpc0VtcHR5O1xuICAgIGxvZGFzaC5pc0VxdWFsID0gaXNFcXVhbDtcbiAgICBsb2Rhc2guaXNFcXVhbFdpdGggPSBpc0VxdWFsV2l0aDtcbiAgICBsb2Rhc2guaXNFcnJvciA9IGlzRXJyb3I7XG4gICAgbG9kYXNoLmlzRmluaXRlID0gaXNGaW5pdGU7XG4gICAgbG9kYXNoLmlzRnVuY3Rpb24gPSBpc0Z1bmN0aW9uO1xuICAgIGxvZGFzaC5pc0ludGVnZXIgPSBpc0ludGVnZXI7XG4gICAgbG9kYXNoLmlzTGVuZ3RoID0gaXNMZW5ndGg7XG4gICAgbG9kYXNoLmlzTWFwID0gaXNNYXA7XG4gICAgbG9kYXNoLmlzTWF0Y2ggPSBpc01hdGNoO1xuICAgIGxvZGFzaC5pc01hdGNoV2l0aCA9IGlzTWF0Y2hXaXRoO1xuICAgIGxvZGFzaC5pc05hTiA9IGlzTmFOO1xuICAgIGxvZGFzaC5pc05hdGl2ZSA9IGlzTmF0aXZlO1xuICAgIGxvZGFzaC5pc05pbCA9IGlzTmlsO1xuICAgIGxvZGFzaC5pc051bGwgPSBpc051bGw7XG4gICAgbG9kYXNoLmlzTnVtYmVyID0gaXNOdW1iZXI7XG4gICAgbG9kYXNoLmlzT2JqZWN0ID0gaXNPYmplY3Q7XG4gICAgbG9kYXNoLmlzT2JqZWN0TGlrZSA9IGlzT2JqZWN0TGlrZTtcbiAgICBsb2Rhc2guaXNQbGFpbk9iamVjdCA9IGlzUGxhaW5PYmplY3Q7XG4gICAgbG9kYXNoLmlzUmVnRXhwID0gaXNSZWdFeHA7XG4gICAgbG9kYXNoLmlzU2FmZUludGVnZXIgPSBpc1NhZmVJbnRlZ2VyO1xuICAgIGxvZGFzaC5pc1NldCA9IGlzU2V0O1xuICAgIGxvZGFzaC5pc1N0cmluZyA9IGlzU3RyaW5nO1xuICAgIGxvZGFzaC5pc1N5bWJvbCA9IGlzU3ltYm9sO1xuICAgIGxvZGFzaC5pc1R5cGVkQXJyYXkgPSBpc1R5cGVkQXJyYXk7XG4gICAgbG9kYXNoLmlzVW5kZWZpbmVkID0gaXNVbmRlZmluZWQ7XG4gICAgbG9kYXNoLmlzV2Vha01hcCA9IGlzV2Vha01hcDtcbiAgICBsb2Rhc2guaXNXZWFrU2V0ID0gaXNXZWFrU2V0O1xuICAgIGxvZGFzaC5qb2luID0gam9pbjtcbiAgICBsb2Rhc2gua2ViYWJDYXNlID0ga2ViYWJDYXNlO1xuICAgIGxvZGFzaC5sYXN0ID0gbGFzdDtcbiAgICBsb2Rhc2gubGFzdEluZGV4T2YgPSBsYXN0SW5kZXhPZjtcbiAgICBsb2Rhc2gubG93ZXJDYXNlID0gbG93ZXJDYXNlO1xuICAgIGxvZGFzaC5sb3dlckZpcnN0ID0gbG93ZXJGaXJzdDtcbiAgICBsb2Rhc2gubHQgPSBsdDtcbiAgICBsb2Rhc2gubHRlID0gbHRlO1xuICAgIGxvZGFzaC5tYXggPSBtYXg7XG4gICAgbG9kYXNoLm1heEJ5ID0gbWF4Qnk7XG4gICAgbG9kYXNoLm1lYW4gPSBtZWFuO1xuICAgIGxvZGFzaC5tZWFuQnkgPSBtZWFuQnk7XG4gICAgbG9kYXNoLm1pbiA9IG1pbjtcbiAgICBsb2Rhc2gubWluQnkgPSBtaW5CeTtcbiAgICBsb2Rhc2guc3R1YkFycmF5ID0gc3R1YkFycmF5O1xuICAgIGxvZGFzaC5zdHViRmFsc2UgPSBzdHViRmFsc2U7XG4gICAgbG9kYXNoLnN0dWJPYmplY3QgPSBzdHViT2JqZWN0O1xuICAgIGxvZGFzaC5zdHViU3RyaW5nID0gc3R1YlN0cmluZztcbiAgICBsb2Rhc2guc3R1YlRydWUgPSBzdHViVHJ1ZTtcbiAgICBsb2Rhc2gubXVsdGlwbHkgPSBtdWx0aXBseTtcbiAgICBsb2Rhc2gubnRoID0gbnRoO1xuICAgIGxvZGFzaC5ub0NvbmZsaWN0ID0gbm9Db25mbGljdDtcbiAgICBsb2Rhc2gubm9vcCA9IG5vb3A7XG4gICAgbG9kYXNoLm5vdyA9IG5vdztcbiAgICBsb2Rhc2gucGFkID0gcGFkO1xuICAgIGxvZGFzaC5wYWRFbmQgPSBwYWRFbmQ7XG4gICAgbG9kYXNoLnBhZFN0YXJ0ID0gcGFkU3RhcnQ7XG4gICAgbG9kYXNoLnBhcnNlSW50ID0gcGFyc2VJbnQ7XG4gICAgbG9kYXNoLnJhbmRvbSA9IHJhbmRvbTtcbiAgICBsb2Rhc2gucmVkdWNlID0gcmVkdWNlO1xuICAgIGxvZGFzaC5yZWR1Y2VSaWdodCA9IHJlZHVjZVJpZ2h0O1xuICAgIGxvZGFzaC5yZXBlYXQgPSByZXBlYXQ7XG4gICAgbG9kYXNoLnJlcGxhY2UgPSByZXBsYWNlO1xuICAgIGxvZGFzaC5yZXN1bHQgPSByZXN1bHQ7XG4gICAgbG9kYXNoLnJvdW5kID0gcm91bmQ7XG4gICAgbG9kYXNoLnJ1bkluQ29udGV4dCA9IHJ1bkluQ29udGV4dDtcbiAgICBsb2Rhc2guc2FtcGxlID0gc2FtcGxlO1xuICAgIGxvZGFzaC5zaXplID0gc2l6ZTtcbiAgICBsb2Rhc2guc25ha2VDYXNlID0gc25ha2VDYXNlO1xuICAgIGxvZGFzaC5zb21lID0gc29tZTtcbiAgICBsb2Rhc2guc29ydGVkSW5kZXggPSBzb3J0ZWRJbmRleDtcbiAgICBsb2Rhc2guc29ydGVkSW5kZXhCeSA9IHNvcnRlZEluZGV4Qnk7XG4gICAgbG9kYXNoLnNvcnRlZEluZGV4T2YgPSBzb3J0ZWRJbmRleE9mO1xuICAgIGxvZGFzaC5zb3J0ZWRMYXN0SW5kZXggPSBzb3J0ZWRMYXN0SW5kZXg7XG4gICAgbG9kYXNoLnNvcnRlZExhc3RJbmRleEJ5ID0gc29ydGVkTGFzdEluZGV4Qnk7XG4gICAgbG9kYXNoLnNvcnRlZExhc3RJbmRleE9mID0gc29ydGVkTGFzdEluZGV4T2Y7XG4gICAgbG9kYXNoLnN0YXJ0Q2FzZSA9IHN0YXJ0Q2FzZTtcbiAgICBsb2Rhc2guc3RhcnRzV2l0aCA9IHN0YXJ0c1dpdGg7XG4gICAgbG9kYXNoLnN1YnRyYWN0ID0gc3VidHJhY3Q7XG4gICAgbG9kYXNoLnN1bSA9IHN1bTtcbiAgICBsb2Rhc2guc3VtQnkgPSBzdW1CeTtcbiAgICBsb2Rhc2gudGVtcGxhdGUgPSB0ZW1wbGF0ZTtcbiAgICBsb2Rhc2gudGltZXMgPSB0aW1lcztcbiAgICBsb2Rhc2gudG9GaW5pdGUgPSB0b0Zpbml0ZTtcbiAgICBsb2Rhc2gudG9JbnRlZ2VyID0gdG9JbnRlZ2VyO1xuICAgIGxvZGFzaC50b0xlbmd0aCA9IHRvTGVuZ3RoO1xuICAgIGxvZGFzaC50b0xvd2VyID0gdG9Mb3dlcjtcbiAgICBsb2Rhc2gudG9OdW1iZXIgPSB0b051bWJlcjtcbiAgICBsb2Rhc2gudG9TYWZlSW50ZWdlciA9IHRvU2FmZUludGVnZXI7XG4gICAgbG9kYXNoLnRvU3RyaW5nID0gdG9TdHJpbmc7XG4gICAgbG9kYXNoLnRvVXBwZXIgPSB0b1VwcGVyO1xuICAgIGxvZGFzaC50cmltID0gdHJpbTtcbiAgICBsb2Rhc2gudHJpbUVuZCA9IHRyaW1FbmQ7XG4gICAgbG9kYXNoLnRyaW1TdGFydCA9IHRyaW1TdGFydDtcbiAgICBsb2Rhc2gudHJ1bmNhdGUgPSB0cnVuY2F0ZTtcbiAgICBsb2Rhc2gudW5lc2NhcGUgPSB1bmVzY2FwZTtcbiAgICBsb2Rhc2gudW5pcXVlSWQgPSB1bmlxdWVJZDtcbiAgICBsb2Rhc2gudXBwZXJDYXNlID0gdXBwZXJDYXNlO1xuICAgIGxvZGFzaC51cHBlckZpcnN0ID0gdXBwZXJGaXJzdDtcblxuICAgIC8vIEFkZCBhbGlhc2VzLlxuICAgIGxvZGFzaC5lYWNoID0gZm9yRWFjaDtcbiAgICBsb2Rhc2guZWFjaFJpZ2h0ID0gZm9yRWFjaFJpZ2h0O1xuICAgIGxvZGFzaC5maXJzdCA9IGhlYWQ7XG5cbiAgICBtaXhpbihsb2Rhc2gsIChmdW5jdGlvbigpIHtcbiAgICAgIHZhciBzb3VyY2UgPSB7fTtcbiAgICAgIGJhc2VGb3JPd24obG9kYXNoLCBmdW5jdGlvbihmdW5jLCBtZXRob2ROYW1lKSB7XG4gICAgICAgIGlmICghaGFzT3duUHJvcGVydHkuY2FsbChsb2Rhc2gucHJvdG90eXBlLCBtZXRob2ROYW1lKSkge1xuICAgICAgICAgIHNvdXJjZVttZXRob2ROYW1lXSA9IGZ1bmM7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHNvdXJjZTtcbiAgICB9KCkpLCB7ICdjaGFpbic6IGZhbHNlIH0pO1xuXG4gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gICAgLyoqXG4gICAgICogVGhlIHNlbWFudGljIHZlcnNpb24gbnVtYmVyLlxuICAgICAqXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBtZW1iZXJPZiBfXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cbiAgICBsb2Rhc2guVkVSU0lPTiA9IFZFUlNJT047XG5cbiAgICAvLyBBc3NpZ24gZGVmYXVsdCBwbGFjZWhvbGRlcnMuXG4gICAgYXJyYXlFYWNoKFsnYmluZCcsICdiaW5kS2V5JywgJ2N1cnJ5JywgJ2N1cnJ5UmlnaHQnLCAncGFydGlhbCcsICdwYXJ0aWFsUmlnaHQnXSwgZnVuY3Rpb24obWV0aG9kTmFtZSkge1xuICAgICAgbG9kYXNoW21ldGhvZE5hbWVdLnBsYWNlaG9sZGVyID0gbG9kYXNoO1xuICAgIH0pO1xuXG4gICAgLy8gQWRkIGBMYXp5V3JhcHBlcmAgbWV0aG9kcyBmb3IgYF8uZHJvcGAgYW5kIGBfLnRha2VgIHZhcmlhbnRzLlxuICAgIGFycmF5RWFjaChbJ2Ryb3AnLCAndGFrZSddLCBmdW5jdGlvbihtZXRob2ROYW1lLCBpbmRleCkge1xuICAgICAgTGF6eVdyYXBwZXIucHJvdG90eXBlW21ldGhvZE5hbWVdID0gZnVuY3Rpb24obikge1xuICAgICAgICBuID0gbiA9PT0gdW5kZWZpbmVkID8gMSA6IG5hdGl2ZU1heCh0b0ludGVnZXIobiksIDApO1xuXG4gICAgICAgIHZhciByZXN1bHQgPSAodGhpcy5fX2ZpbHRlcmVkX18gJiYgIWluZGV4KVxuICAgICAgICAgID8gbmV3IExhenlXcmFwcGVyKHRoaXMpXG4gICAgICAgICAgOiB0aGlzLmNsb25lKCk7XG5cbiAgICAgICAgaWYgKHJlc3VsdC5fX2ZpbHRlcmVkX18pIHtcbiAgICAgICAgICByZXN1bHQuX190YWtlQ291bnRfXyA9IG5hdGl2ZU1pbihuLCByZXN1bHQuX190YWtlQ291bnRfXyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzdWx0Ll9fdmlld3NfXy5wdXNoKHtcbiAgICAgICAgICAgICdzaXplJzogbmF0aXZlTWluKG4sIE1BWF9BUlJBWV9MRU5HVEgpLFxuICAgICAgICAgICAgJ3R5cGUnOiBtZXRob2ROYW1lICsgKHJlc3VsdC5fX2Rpcl9fIDwgMCA/ICdSaWdodCcgOiAnJylcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfTtcblxuICAgICAgTGF6eVdyYXBwZXIucHJvdG90eXBlW21ldGhvZE5hbWUgKyAnUmlnaHQnXSA9IGZ1bmN0aW9uKG4pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmV2ZXJzZSgpW21ldGhvZE5hbWVdKG4pLnJldmVyc2UoKTtcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICAvLyBBZGQgYExhenlXcmFwcGVyYCBtZXRob2RzIHRoYXQgYWNjZXB0IGFuIGBpdGVyYXRlZWAgdmFsdWUuXG4gICAgYXJyYXlFYWNoKFsnZmlsdGVyJywgJ21hcCcsICd0YWtlV2hpbGUnXSwgZnVuY3Rpb24obWV0aG9kTmFtZSwgaW5kZXgpIHtcbiAgICAgIHZhciB0eXBlID0gaW5kZXggKyAxLFxuICAgICAgICAgIGlzRmlsdGVyID0gdHlwZSA9PSBMQVpZX0ZJTFRFUl9GTEFHIHx8IHR5cGUgPT0gTEFaWV9XSElMRV9GTEFHO1xuXG4gICAgICBMYXp5V3JhcHBlci5wcm90b3R5cGVbbWV0aG9kTmFtZV0gPSBmdW5jdGlvbihpdGVyYXRlZSkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gdGhpcy5jbG9uZSgpO1xuICAgICAgICByZXN1bHQuX19pdGVyYXRlZXNfXy5wdXNoKHtcbiAgICAgICAgICAnaXRlcmF0ZWUnOiBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMyksXG4gICAgICAgICAgJ3R5cGUnOiB0eXBlXG4gICAgICAgIH0pO1xuICAgICAgICByZXN1bHQuX19maWx0ZXJlZF9fID0gcmVzdWx0Ll9fZmlsdGVyZWRfXyB8fCBpc0ZpbHRlcjtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICAvLyBBZGQgYExhenlXcmFwcGVyYCBtZXRob2RzIGZvciBgXy5oZWFkYCBhbmQgYF8ubGFzdGAuXG4gICAgYXJyYXlFYWNoKFsnaGVhZCcsICdsYXN0J10sIGZ1bmN0aW9uKG1ldGhvZE5hbWUsIGluZGV4KSB7XG4gICAgICB2YXIgdGFrZU5hbWUgPSAndGFrZScgKyAoaW5kZXggPyAnUmlnaHQnIDogJycpO1xuXG4gICAgICBMYXp5V3JhcHBlci5wcm90b3R5cGVbbWV0aG9kTmFtZV0gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXNbdGFrZU5hbWVdKDEpLnZhbHVlKClbMF07XG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgLy8gQWRkIGBMYXp5V3JhcHBlcmAgbWV0aG9kcyBmb3IgYF8uaW5pdGlhbGAgYW5kIGBfLnRhaWxgLlxuICAgIGFycmF5RWFjaChbJ2luaXRpYWwnLCAndGFpbCddLCBmdW5jdGlvbihtZXRob2ROYW1lLCBpbmRleCkge1xuICAgICAgdmFyIGRyb3BOYW1lID0gJ2Ryb3AnICsgKGluZGV4ID8gJycgOiAnUmlnaHQnKTtcblxuICAgICAgTGF6eVdyYXBwZXIucHJvdG90eXBlW21ldGhvZE5hbWVdID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9fZmlsdGVyZWRfXyA/IG5ldyBMYXp5V3JhcHBlcih0aGlzKSA6IHRoaXNbZHJvcE5hbWVdKDEpO1xuICAgICAgfTtcbiAgICB9KTtcblxuICAgIExhenlXcmFwcGVyLnByb3RvdHlwZS5jb21wYWN0ID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5maWx0ZXIoaWRlbnRpdHkpO1xuICAgIH07XG5cbiAgICBMYXp5V3JhcHBlci5wcm90b3R5cGUuZmluZCA9IGZ1bmN0aW9uKHByZWRpY2F0ZSkge1xuICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyKHByZWRpY2F0ZSkuaGVhZCgpO1xuICAgIH07XG5cbiAgICBMYXp5V3JhcHBlci5wcm90b3R5cGUuZmluZExhc3QgPSBmdW5jdGlvbihwcmVkaWNhdGUpIHtcbiAgICAgIHJldHVybiB0aGlzLnJldmVyc2UoKS5maW5kKHByZWRpY2F0ZSk7XG4gICAgfTtcblxuICAgIExhenlXcmFwcGVyLnByb3RvdHlwZS5pbnZva2VNYXAgPSBiYXNlUmVzdChmdW5jdGlvbihwYXRoLCBhcmdzKSB7XG4gICAgICBpZiAodHlwZW9mIHBhdGggPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gbmV3IExhenlXcmFwcGVyKHRoaXMpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBiYXNlSW52b2tlKHZhbHVlLCBwYXRoLCBhcmdzKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgTGF6eVdyYXBwZXIucHJvdG90eXBlLnJlamVjdCA9IGZ1bmN0aW9uKHByZWRpY2F0ZSkge1xuICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyKG5lZ2F0ZShnZXRJdGVyYXRlZShwcmVkaWNhdGUpKSk7XG4gICAgfTtcblxuICAgIExhenlXcmFwcGVyLnByb3RvdHlwZS5zbGljZSA9IGZ1bmN0aW9uKHN0YXJ0LCBlbmQpIHtcbiAgICAgIHN0YXJ0ID0gdG9JbnRlZ2VyKHN0YXJ0KTtcblxuICAgICAgdmFyIHJlc3VsdCA9IHRoaXM7XG4gICAgICBpZiAocmVzdWx0Ll9fZmlsdGVyZWRfXyAmJiAoc3RhcnQgPiAwIHx8IGVuZCA8IDApKSB7XG4gICAgICAgIHJldHVybiBuZXcgTGF6eVdyYXBwZXIocmVzdWx0KTtcbiAgICAgIH1cbiAgICAgIGlmIChzdGFydCA8IDApIHtcbiAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnRha2VSaWdodCgtc3RhcnQpO1xuICAgICAgfSBlbHNlIGlmIChzdGFydCkge1xuICAgICAgICByZXN1bHQgPSByZXN1bHQuZHJvcChzdGFydCk7XG4gICAgICB9XG4gICAgICBpZiAoZW5kICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZW5kID0gdG9JbnRlZ2VyKGVuZCk7XG4gICAgICAgIHJlc3VsdCA9IGVuZCA8IDAgPyByZXN1bHQuZHJvcFJpZ2h0KC1lbmQpIDogcmVzdWx0LnRha2UoZW5kIC0gc3RhcnQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuXG4gICAgTGF6eVdyYXBwZXIucHJvdG90eXBlLnRha2VSaWdodFdoaWxlID0gZnVuY3Rpb24ocHJlZGljYXRlKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZXZlcnNlKCkudGFrZVdoaWxlKHByZWRpY2F0ZSkucmV2ZXJzZSgpO1xuICAgIH07XG5cbiAgICBMYXp5V3JhcHBlci5wcm90b3R5cGUudG9BcnJheSA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMudGFrZShNQVhfQVJSQVlfTEVOR1RIKTtcbiAgICB9O1xuXG4gICAgLy8gQWRkIGBMYXp5V3JhcHBlcmAgbWV0aG9kcyB0byBgbG9kYXNoLnByb3RvdHlwZWAuXG4gICAgYmFzZUZvck93bihMYXp5V3JhcHBlci5wcm90b3R5cGUsIGZ1bmN0aW9uKGZ1bmMsIG1ldGhvZE5hbWUpIHtcbiAgICAgIHZhciBjaGVja0l0ZXJhdGVlID0gL14oPzpmaWx0ZXJ8ZmluZHxtYXB8cmVqZWN0KXxXaGlsZSQvLnRlc3QobWV0aG9kTmFtZSksXG4gICAgICAgICAgaXNUYWtlciA9IC9eKD86aGVhZHxsYXN0KSQvLnRlc3QobWV0aG9kTmFtZSksXG4gICAgICAgICAgbG9kYXNoRnVuYyA9IGxvZGFzaFtpc1Rha2VyID8gKCd0YWtlJyArIChtZXRob2ROYW1lID09ICdsYXN0JyA/ICdSaWdodCcgOiAnJykpIDogbWV0aG9kTmFtZV0sXG4gICAgICAgICAgcmV0VW53cmFwcGVkID0gaXNUYWtlciB8fCAvXmZpbmQvLnRlc3QobWV0aG9kTmFtZSk7XG5cbiAgICAgIGlmICghbG9kYXNoRnVuYykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBsb2Rhc2gucHJvdG90eXBlW21ldGhvZE5hbWVdID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IHRoaXMuX193cmFwcGVkX18sXG4gICAgICAgICAgICBhcmdzID0gaXNUYWtlciA/IFsxXSA6IGFyZ3VtZW50cyxcbiAgICAgICAgICAgIGlzTGF6eSA9IHZhbHVlIGluc3RhbmNlb2YgTGF6eVdyYXBwZXIsXG4gICAgICAgICAgICBpdGVyYXRlZSA9IGFyZ3NbMF0sXG4gICAgICAgICAgICB1c2VMYXp5ID0gaXNMYXp5IHx8IGlzQXJyYXkodmFsdWUpO1xuXG4gICAgICAgIHZhciBpbnRlcmNlcHRvciA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgdmFyIHJlc3VsdCA9IGxvZGFzaEZ1bmMuYXBwbHkobG9kYXNoLCBhcnJheVB1c2goW3ZhbHVlXSwgYXJncykpO1xuICAgICAgICAgIHJldHVybiAoaXNUYWtlciAmJiBjaGFpbkFsbCkgPyByZXN1bHRbMF0gOiByZXN1bHQ7XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHVzZUxhenkgJiYgY2hlY2tJdGVyYXRlZSAmJiB0eXBlb2YgaXRlcmF0ZWUgPT0gJ2Z1bmN0aW9uJyAmJiBpdGVyYXRlZS5sZW5ndGggIT0gMSkge1xuICAgICAgICAgIC8vIEF2b2lkIGxhenkgdXNlIGlmIHRoZSBpdGVyYXRlZSBoYXMgYSBcImxlbmd0aFwiIHZhbHVlIG90aGVyIHRoYW4gYDFgLlxuICAgICAgICAgIGlzTGF6eSA9IHVzZUxhenkgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgY2hhaW5BbGwgPSB0aGlzLl9fY2hhaW5fXyxcbiAgICAgICAgICAgIGlzSHlicmlkID0gISF0aGlzLl9fYWN0aW9uc19fLmxlbmd0aCxcbiAgICAgICAgICAgIGlzVW53cmFwcGVkID0gcmV0VW53cmFwcGVkICYmICFjaGFpbkFsbCxcbiAgICAgICAgICAgIG9ubHlMYXp5ID0gaXNMYXp5ICYmICFpc0h5YnJpZDtcblxuICAgICAgICBpZiAoIXJldFVud3JhcHBlZCAmJiB1c2VMYXp5KSB7XG4gICAgICAgICAgdmFsdWUgPSBvbmx5TGF6eSA/IHZhbHVlIDogbmV3IExhenlXcmFwcGVyKHRoaXMpO1xuICAgICAgICAgIHZhciByZXN1bHQgPSBmdW5jLmFwcGx5KHZhbHVlLCBhcmdzKTtcbiAgICAgICAgICByZXN1bHQuX19hY3Rpb25zX18ucHVzaCh7ICdmdW5jJzogdGhydSwgJ2FyZ3MnOiBbaW50ZXJjZXB0b3JdLCAndGhpc0FyZyc6IHVuZGVmaW5lZCB9KTtcbiAgICAgICAgICByZXR1cm4gbmV3IExvZGFzaFdyYXBwZXIocmVzdWx0LCBjaGFpbkFsbCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzVW53cmFwcGVkICYmIG9ubHlMYXp5KSB7XG4gICAgICAgICAgcmV0dXJuIGZ1bmMuYXBwbHkodGhpcywgYXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0ID0gdGhpcy50aHJ1KGludGVyY2VwdG9yKTtcbiAgICAgICAgcmV0dXJuIGlzVW53cmFwcGVkID8gKGlzVGFrZXIgPyByZXN1bHQudmFsdWUoKVswXSA6IHJlc3VsdC52YWx1ZSgpKSA6IHJlc3VsdDtcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICAvLyBBZGQgYEFycmF5YCBtZXRob2RzIHRvIGBsb2Rhc2gucHJvdG90eXBlYC5cbiAgICBhcnJheUVhY2goWydwb3AnLCAncHVzaCcsICdzaGlmdCcsICdzb3J0JywgJ3NwbGljZScsICd1bnNoaWZ0J10sIGZ1bmN0aW9uKG1ldGhvZE5hbWUpIHtcbiAgICAgIHZhciBmdW5jID0gYXJyYXlQcm90b1ttZXRob2ROYW1lXSxcbiAgICAgICAgICBjaGFpbk5hbWUgPSAvXig/OnB1c2h8c29ydHx1bnNoaWZ0KSQvLnRlc3QobWV0aG9kTmFtZSkgPyAndGFwJyA6ICd0aHJ1JyxcbiAgICAgICAgICByZXRVbndyYXBwZWQgPSAvXig/OnBvcHxzaGlmdCkkLy50ZXN0KG1ldGhvZE5hbWUpO1xuXG4gICAgICBsb2Rhc2gucHJvdG90eXBlW21ldGhvZE5hbWVdID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBhcmdzID0gYXJndW1lbnRzO1xuICAgICAgICBpZiAocmV0VW53cmFwcGVkICYmICF0aGlzLl9fY2hhaW5fXykge1xuICAgICAgICAgIHZhciB2YWx1ZSA9IHRoaXMudmFsdWUoKTtcbiAgICAgICAgICByZXR1cm4gZnVuYy5hcHBseShpc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW10sIGFyZ3MpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzW2NoYWluTmFtZV0oZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgICByZXR1cm4gZnVuYy5hcHBseShpc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW10sIGFyZ3MpO1xuICAgICAgICB9KTtcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICAvLyBNYXAgbWluaWZpZWQgbWV0aG9kIG5hbWVzIHRvIHRoZWlyIHJlYWwgbmFtZXMuXG4gICAgYmFzZUZvck93bihMYXp5V3JhcHBlci5wcm90b3R5cGUsIGZ1bmN0aW9uKGZ1bmMsIG1ldGhvZE5hbWUpIHtcbiAgICAgIHZhciBsb2Rhc2hGdW5jID0gbG9kYXNoW21ldGhvZE5hbWVdO1xuICAgICAgaWYgKGxvZGFzaEZ1bmMpIHtcbiAgICAgICAgdmFyIGtleSA9IGxvZGFzaEZ1bmMubmFtZSArICcnO1xuICAgICAgICBpZiAoIWhhc093blByb3BlcnR5LmNhbGwocmVhbE5hbWVzLCBrZXkpKSB7XG4gICAgICAgICAgcmVhbE5hbWVzW2tleV0gPSBbXTtcbiAgICAgICAgfVxuICAgICAgICByZWFsTmFtZXNba2V5XS5wdXNoKHsgJ25hbWUnOiBtZXRob2ROYW1lLCAnZnVuYyc6IGxvZGFzaEZ1bmMgfSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZWFsTmFtZXNbY3JlYXRlSHlicmlkKHVuZGVmaW5lZCwgV1JBUF9CSU5EX0tFWV9GTEFHKS5uYW1lXSA9IFt7XG4gICAgICAnbmFtZSc6ICd3cmFwcGVyJyxcbiAgICAgICdmdW5jJzogdW5kZWZpbmVkXG4gICAgfV07XG5cbiAgICAvLyBBZGQgbWV0aG9kcyB0byBgTGF6eVdyYXBwZXJgLlxuICAgIExhenlXcmFwcGVyLnByb3RvdHlwZS5jbG9uZSA9IGxhenlDbG9uZTtcbiAgICBMYXp5V3JhcHBlci5wcm90b3R5cGUucmV2ZXJzZSA9IGxhenlSZXZlcnNlO1xuICAgIExhenlXcmFwcGVyLnByb3RvdHlwZS52YWx1ZSA9IGxhenlWYWx1ZTtcblxuICAgIC8vIEFkZCBjaGFpbiBzZXF1ZW5jZSBtZXRob2RzIHRvIHRoZSBgbG9kYXNoYCB3cmFwcGVyLlxuICAgIGxvZGFzaC5wcm90b3R5cGUuYXQgPSB3cmFwcGVyQXQ7XG4gICAgbG9kYXNoLnByb3RvdHlwZS5jaGFpbiA9IHdyYXBwZXJDaGFpbjtcbiAgICBsb2Rhc2gucHJvdG90eXBlLmNvbW1pdCA9IHdyYXBwZXJDb21taXQ7XG4gICAgbG9kYXNoLnByb3RvdHlwZS5uZXh0ID0gd3JhcHBlck5leHQ7XG4gICAgbG9kYXNoLnByb3RvdHlwZS5wbGFudCA9IHdyYXBwZXJQbGFudDtcbiAgICBsb2Rhc2gucHJvdG90eXBlLnJldmVyc2UgPSB3cmFwcGVyUmV2ZXJzZTtcbiAgICBsb2Rhc2gucHJvdG90eXBlLnRvSlNPTiA9IGxvZGFzaC5wcm90b3R5cGUudmFsdWVPZiA9IGxvZGFzaC5wcm90b3R5cGUudmFsdWUgPSB3cmFwcGVyVmFsdWU7XG5cbiAgICAvLyBBZGQgbGF6eSBhbGlhc2VzLlxuICAgIGxvZGFzaC5wcm90b3R5cGUuZmlyc3QgPSBsb2Rhc2gucHJvdG90eXBlLmhlYWQ7XG5cbiAgICBpZiAoc3ltSXRlcmF0b3IpIHtcbiAgICAgIGxvZGFzaC5wcm90b3R5cGVbc3ltSXRlcmF0b3JdID0gd3JhcHBlclRvSXRlcmF0b3I7XG4gICAgfVxuICAgIHJldHVybiBsb2Rhc2g7XG4gIH0pO1xuXG4gIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gIC8vIEV4cG9ydCBsb2Rhc2guXG4gIHZhciBfID0gcnVuSW5Db250ZXh0KCk7XG5cbiAgLy8gU29tZSBBTUQgYnVpbGQgb3B0aW1pemVycywgbGlrZSByLmpzLCBjaGVjayBmb3IgY29uZGl0aW9uIHBhdHRlcm5zIGxpa2U6XG4gIGlmICh0eXBlb2YgZGVmaW5lID09ICdmdW5jdGlvbicgJiYgdHlwZW9mIGRlZmluZS5hbWQgPT0gJ29iamVjdCcgJiYgZGVmaW5lLmFtZCkge1xuICAgIC8vIEV4cG9zZSBMb2Rhc2ggb24gdGhlIGdsb2JhbCBvYmplY3QgdG8gcHJldmVudCBlcnJvcnMgd2hlbiBMb2Rhc2ggaXNcbiAgICAvLyBsb2FkZWQgYnkgYSBzY3JpcHQgdGFnIGluIHRoZSBwcmVzZW5jZSBvZiBhbiBBTUQgbG9hZGVyLlxuICAgIC8vIFNlZSBodHRwOi8vcmVxdWlyZWpzLm9yZy9kb2NzL2Vycm9ycy5odG1sI21pc21hdGNoIGZvciBtb3JlIGRldGFpbHMuXG4gICAgLy8gVXNlIGBfLm5vQ29uZmxpY3RgIHRvIHJlbW92ZSBMb2Rhc2ggZnJvbSB0aGUgZ2xvYmFsIG9iamVjdC5cbiAgICByb290Ll8gPSBfO1xuXG4gICAgLy8gRGVmaW5lIGFzIGFuIGFub255bW91cyBtb2R1bGUgc28sIHRocm91Z2ggcGF0aCBtYXBwaW5nLCBpdCBjYW4gYmVcbiAgICAvLyByZWZlcmVuY2VkIGFzIHRoZSBcInVuZGVyc2NvcmVcIiBtb2R1bGUuXG4gICAgZGVmaW5lKGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIF87XG4gICAgfSk7XG4gIH1cbiAgLy8gQ2hlY2sgZm9yIGBleHBvcnRzYCBhZnRlciBgZGVmaW5lYCBpbiBjYXNlIGEgYnVpbGQgb3B0aW1pemVyIGFkZHMgaXQuXG4gIGVsc2UgaWYgKGZyZWVNb2R1bGUpIHtcbiAgICAvLyBFeHBvcnQgZm9yIE5vZGUuanMuXG4gICAgKGZyZWVNb2R1bGUuZXhwb3J0cyA9IF8pLl8gPSBfO1xuICAgIC8vIEV4cG9ydCBmb3IgQ29tbW9uSlMgc3VwcG9ydC5cbiAgICBmcmVlRXhwb3J0cy5fID0gXztcbiAgfVxuICBlbHNlIHtcbiAgICAvLyBFeHBvcnQgdG8gdGhlIGdsb2JhbCBvYmplY3QuXG4gICAgcm9vdC5fID0gXztcbiAgfVxufS5jYWxsKHRoaXMpKTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0EsU0FTQTtBQUNBOztBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///91\n")},function(module,exports){eval('//\n\nmodule.exports = function shallowEqual(objA, objB, compare, compareContext) {\n  var ret = compare ? compare.call(compareContext, objA, objB) : void 0;\n\n  if (ret !== void 0) {\n    return !!ret;\n  }\n\n  if (objA === objB) {\n    return true;\n  }\n\n  if (typeof objA !== "object" || !objA || typeof objB !== "object" || !objB) {\n    return false;\n  }\n\n  var keysA = Object.keys(objA);\n  var keysB = Object.keys(objB);\n\n  if (keysA.length !== keysB.length) {\n    return false;\n  }\n\n  var bHasOwnProperty = Object.prototype.hasOwnProperty.bind(objB);\n\n  // Test for A\'s keys different from B.\n  for (var idx = 0; idx < keysA.length; idx++) {\n    var key = keysA[idx];\n\n    if (!bHasOwnProperty(key)) {\n      return false;\n    }\n\n    var valueA = objA[key];\n    var valueB = objB[key];\n\n    ret = compare ? compare.call(compareContext, valueA, valueB, key) : void 0;\n\n    if (ret === false || (ret === void 0 && valueA !== valueB)) {\n      return false;\n    }\n  }\n\n  return true;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTIuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvc2hhbGxvd2VxdWFsL2luZGV4LmpzPzFiMmIiXSwic291cmNlc0NvbnRlbnQiOlsiLy9cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBzaGFsbG93RXF1YWwob2JqQSwgb2JqQiwgY29tcGFyZSwgY29tcGFyZUNvbnRleHQpIHtcbiAgdmFyIHJldCA9IGNvbXBhcmUgPyBjb21wYXJlLmNhbGwoY29tcGFyZUNvbnRleHQsIG9iakEsIG9iakIpIDogdm9pZCAwO1xuXG4gIGlmIChyZXQgIT09IHZvaWQgMCkge1xuICAgIHJldHVybiAhIXJldDtcbiAgfVxuXG4gIGlmIChvYmpBID09PSBvYmpCKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAodHlwZW9mIG9iakEgIT09IFwib2JqZWN0XCIgfHwgIW9iakEgfHwgdHlwZW9mIG9iakIgIT09IFwib2JqZWN0XCIgfHwgIW9iakIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIga2V5c0EgPSBPYmplY3Qua2V5cyhvYmpBKTtcbiAgdmFyIGtleXNCID0gT2JqZWN0LmtleXMob2JqQik7XG5cbiAgaWYgKGtleXNBLmxlbmd0aCAhPT0ga2V5c0IubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIGJIYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuYmluZChvYmpCKTtcblxuICAvLyBUZXN0IGZvciBBJ3Mga2V5cyBkaWZmZXJlbnQgZnJvbSBCLlxuICBmb3IgKHZhciBpZHggPSAwOyBpZHggPCBrZXlzQS5sZW5ndGg7IGlkeCsrKSB7XG4gICAgdmFyIGtleSA9IGtleXNBW2lkeF07XG5cbiAgICBpZiAoIWJIYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgdmFyIHZhbHVlQSA9IG9iakFba2V5XTtcbiAgICB2YXIgdmFsdWVCID0gb2JqQltrZXldO1xuXG4gICAgcmV0ID0gY29tcGFyZSA/IGNvbXBhcmUuY2FsbChjb21wYXJlQ29udGV4dCwgdmFsdWVBLCB2YWx1ZUIsIGtleSkgOiB2b2lkIDA7XG5cbiAgICBpZiAocmV0ID09PSBmYWxzZSB8fCAocmV0ID09PSB2b2lkIDAgJiYgdmFsdWVBICE9PSB2YWx1ZUIpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///92\n')},function(module,__webpack_exports__,__webpack_require__){"use strict";eval('/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return unitlessKeys; });\nvar unitlessKeys = {\n  animationIterationCount: 1,\n  aspectRatio: 1,\n  borderImageOutset: 1,\n  borderImageSlice: 1,\n  borderImageWidth: 1,\n  boxFlex: 1,\n  boxFlexGroup: 1,\n  boxOrdinalGroup: 1,\n  columnCount: 1,\n  columns: 1,\n  flex: 1,\n  flexGrow: 1,\n  flexPositive: 1,\n  flexShrink: 1,\n  flexNegative: 1,\n  flexOrder: 1,\n  gridRow: 1,\n  gridRowEnd: 1,\n  gridRowSpan: 1,\n  gridRowStart: 1,\n  gridColumn: 1,\n  gridColumnEnd: 1,\n  gridColumnSpan: 1,\n  gridColumnStart: 1,\n  msGridRow: 1,\n  msGridRowSpan: 1,\n  msGridColumn: 1,\n  msGridColumnSpan: 1,\n  fontWeight: 1,\n  lineHeight: 1,\n  opacity: 1,\n  order: 1,\n  orphans: 1,\n  tabSize: 1,\n  widows: 1,\n  zIndex: 1,\n  zoom: 1,\n  WebkitLineClamp: 1,\n  // SVG-related properties\n  fillOpacity: 1,\n  floodOpacity: 1,\n  stopOpacity: 1,\n  strokeDasharray: 1,\n  strokeDashoffset: 1,\n  strokeMiterlimit: 1,\n  strokeOpacity: 1,\n  strokeWidth: 1\n};\n\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGVtb3Rpb24vdW5pdGxlc3MvZGlzdC9lbW90aW9uLXVuaXRsZXNzLmVzbS5qcz9hZDUxIl0sInNvdXJjZXNDb250ZW50IjpbInZhciB1bml0bGVzc0tleXMgPSB7XG4gIGFuaW1hdGlvbkl0ZXJhdGlvbkNvdW50OiAxLFxuICBhc3BlY3RSYXRpbzogMSxcbiAgYm9yZGVySW1hZ2VPdXRzZXQ6IDEsXG4gIGJvcmRlckltYWdlU2xpY2U6IDEsXG4gIGJvcmRlckltYWdlV2lkdGg6IDEsXG4gIGJveEZsZXg6IDEsXG4gIGJveEZsZXhHcm91cDogMSxcbiAgYm94T3JkaW5hbEdyb3VwOiAxLFxuICBjb2x1bW5Db3VudDogMSxcbiAgY29sdW1uczogMSxcbiAgZmxleDogMSxcbiAgZmxleEdyb3c6IDEsXG4gIGZsZXhQb3NpdGl2ZTogMSxcbiAgZmxleFNocmluazogMSxcbiAgZmxleE5lZ2F0aXZlOiAxLFxuICBmbGV4T3JkZXI6IDEsXG4gIGdyaWRSb3c6IDEsXG4gIGdyaWRSb3dFbmQ6IDEsXG4gIGdyaWRSb3dTcGFuOiAxLFxuICBncmlkUm93U3RhcnQ6IDEsXG4gIGdyaWRDb2x1bW46IDEsXG4gIGdyaWRDb2x1bW5FbmQ6IDEsXG4gIGdyaWRDb2x1bW5TcGFuOiAxLFxuICBncmlkQ29sdW1uU3RhcnQ6IDEsXG4gIG1zR3JpZFJvdzogMSxcbiAgbXNHcmlkUm93U3BhbjogMSxcbiAgbXNHcmlkQ29sdW1uOiAxLFxuICBtc0dyaWRDb2x1bW5TcGFuOiAxLFxuICBmb250V2VpZ2h0OiAxLFxuICBsaW5lSGVpZ2h0OiAxLFxuICBvcGFjaXR5OiAxLFxuICBvcmRlcjogMSxcbiAgb3JwaGFuczogMSxcbiAgdGFiU2l6ZTogMSxcbiAgd2lkb3dzOiAxLFxuICB6SW5kZXg6IDEsXG4gIHpvb206IDEsXG4gIFdlYmtpdExpbmVDbGFtcDogMSxcbiAgLy8gU1ZHLXJlbGF0ZWQgcHJvcGVydGllc1xuICBmaWxsT3BhY2l0eTogMSxcbiAgZmxvb2RPcGFjaXR5OiAxLFxuICBzdG9wT3BhY2l0eTogMSxcbiAgc3Ryb2tlRGFzaGFycmF5OiAxLFxuICBzdHJva2VEYXNob2Zmc2V0OiAxLFxuICBzdHJva2VNaXRlcmxpbWl0OiAxLFxuICBzdHJva2VPcGFjaXR5OiAxLFxuICBzdHJva2VXaWR0aDogMVxufTtcblxuZXhwb3J0IHsgdW5pdGxlc3NLZXlzIGFzIGRlZmF1bHQgfTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///93\n')},function(module,exports){eval('module.exports = require("fs");//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTQuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJmc1wiP2E0MGQiXSwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiZnNcIik7Il0sIm1hcHBpbmdzIjoiQUFBQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///94\n')},function(module,__webpack_exports__,__webpack_require__){"use strict";eval('\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, "a", function() { return /* binding */ isPropValid; });\n\n// CONCATENATED MODULE: ./node_modules/@emotion/memoize/dist/emotion-memoize.esm.js\nfunction memoize(fn) {\n  var cache = Object.create(null);\n  return function (arg) {\n    if (cache[arg] === undefined) cache[arg] = fn(arg);\n    return cache[arg];\n  };\n}\n\n\n\n// CONCATENATED MODULE: ./node_modules/@emotion/is-prop-valid/dist/emotion-is-prop-valid.esm.js\n\n\nvar reactPropsRegex = /^((children|dangerouslySetInnerHTML|key|ref|autoFocus|defaultValue|defaultChecked|innerHTML|suppressContentEditableWarning|suppressHydrationWarning|valueLink|abbr|accept|acceptCharset|accessKey|action|allow|allowUserMedia|allowPaymentRequest|allowFullScreen|allowTransparency|alt|async|autoComplete|autoPlay|capture|cellPadding|cellSpacing|challenge|charSet|checked|cite|classID|className|cols|colSpan|content|contentEditable|contextMenu|controls|controlsList|coords|crossOrigin|data|dateTime|decoding|default|defer|dir|disabled|disablePictureInPicture|disableRemotePlayback|download|draggable|encType|enterKeyHint|form|formAction|formEncType|formMethod|formNoValidate|formTarget|frameBorder|headers|height|hidden|high|href|hrefLang|htmlFor|httpEquiv|id|inputMode|integrity|is|keyParams|keyType|kind|label|lang|list|loading|loop|low|marginHeight|marginWidth|max|maxLength|media|mediaGroup|method|min|minLength|multiple|muted|name|nonce|noValidate|open|optimum|pattern|placeholder|playsInline|poster|preload|profile|radioGroup|readOnly|referrerPolicy|rel|required|reversed|role|rows|rowSpan|sandbox|scope|scoped|scrolling|seamless|selected|shape|size|sizes|slot|span|spellCheck|src|srcDoc|srcLang|srcSet|start|step|style|summary|tabIndex|target|title|translate|type|useMap|value|width|wmode|wrap|about|datatype|inlist|prefix|property|resource|typeof|vocab|autoCapitalize|autoCorrect|autoSave|color|incremental|fallback|inert|itemProp|itemScope|itemType|itemID|itemRef|on|option|results|security|unselectable|accentHeight|accumulate|additive|alignmentBaseline|allowReorder|alphabetic|amplitude|arabicForm|ascent|attributeName|attributeType|autoReverse|azimuth|baseFrequency|baselineShift|baseProfile|bbox|begin|bias|by|calcMode|capHeight|clip|clipPathUnits|clipPath|clipRule|colorInterpolation|colorInterpolationFilters|colorProfile|colorRendering|contentScriptType|contentStyleType|cursor|cx|cy|d|decelerate|descent|diffuseConstant|direction|display|divisor|dominantBaseline|dur|dx|dy|edgeMode|elevation|enableBackground|end|exponent|externalResourcesRequired|fill|fillOpacity|fillRule|filter|filterRes|filterUnits|floodColor|floodOpacity|focusable|fontFamily|fontSize|fontSizeAdjust|fontStretch|fontStyle|fontVariant|fontWeight|format|from|fr|fx|fy|g1|g2|glyphName|glyphOrientationHorizontal|glyphOrientationVertical|glyphRef|gradientTransform|gradientUnits|hanging|horizAdvX|horizOriginX|ideographic|imageRendering|in|in2|intercept|k|k1|k2|k3|k4|kernelMatrix|kernelUnitLength|kerning|keyPoints|keySplines|keyTimes|lengthAdjust|letterSpacing|lightingColor|limitingConeAngle|local|markerEnd|markerMid|markerStart|markerHeight|markerUnits|markerWidth|mask|maskContentUnits|maskUnits|mathematical|mode|numOctaves|offset|opacity|operator|order|orient|orientation|origin|overflow|overlinePosition|overlineThickness|panose1|paintOrder|pathLength|patternContentUnits|patternTransform|patternUnits|pointerEvents|points|pointsAtX|pointsAtY|pointsAtZ|preserveAlpha|preserveAspectRatio|primitiveUnits|r|radius|refX|refY|renderingIntent|repeatCount|repeatDur|requiredExtensions|requiredFeatures|restart|result|rotate|rx|ry|scale|seed|shapeRendering|slope|spacing|specularConstant|specularExponent|speed|spreadMethod|startOffset|stdDeviation|stemh|stemv|stitchTiles|stopColor|stopOpacity|strikethroughPosition|strikethroughThickness|string|stroke|strokeDasharray|strokeDashoffset|strokeLinecap|strokeLinejoin|strokeMiterlimit|strokeOpacity|strokeWidth|surfaceScale|systemLanguage|tableValues|targetX|targetY|textAnchor|textDecoration|textRendering|textLength|to|transform|u1|u2|underlinePosition|underlineThickness|unicode|unicodeBidi|unicodeRange|unitsPerEm|vAlphabetic|vHanging|vIdeographic|vMathematical|values|vectorEffect|version|vertAdvY|vertOriginX|vertOriginY|viewBox|viewTarget|visibility|widths|wordSpacing|writingMode|x|xHeight|x1|x2|xChannelSelector|xlinkActuate|xlinkArcrole|xlinkHref|xlinkRole|xlinkShow|xlinkTitle|xlinkType|xmlBase|xmlns|xmlnsXlink|xmlLang|xmlSpace|y|y1|y2|yChannelSelector|z|zoomAndPan|for|class|autofocus)|(([Dd][Aa][Tt][Aa]|[Aa][Rr][Ii][Aa]|x)-.*))$/; // https://esbench.com/bench/5bfee68a4cd7e6009ef61d23\n\nvar isPropValid = /* #__PURE__ */memoize(function (prop) {\n  return reactPropsRegex.test(prop) || prop.charCodeAt(0) === 111\n  /* o */\n  && prop.charCodeAt(1) === 110\n  /* n */\n  && prop.charCodeAt(2) < 91;\n}\n/* Z+1 */\n);\n\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTUuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGVtb3Rpb24vbWVtb2l6ZS9kaXN0L2Vtb3Rpb24tbWVtb2l6ZS5lc20uanM/N2RlYyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvQGVtb3Rpb24vaXMtcHJvcC12YWxpZC9kaXN0L2Vtb3Rpb24taXMtcHJvcC12YWxpZC5lc20uanM/OTI5MyJdLCJzb3VyY2VzQ29udGVudCI6WyJmdW5jdGlvbiBtZW1vaXplKGZuKSB7XG4gIHZhciBjYWNoZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIHJldHVybiBmdW5jdGlvbiAoYXJnKSB7XG4gICAgaWYgKGNhY2hlW2FyZ10gPT09IHVuZGVmaW5lZCkgY2FjaGVbYXJnXSA9IGZuKGFyZyk7XG4gICAgcmV0dXJuIGNhY2hlW2FyZ107XG4gIH07XG59XG5cbmV4cG9ydCB7IG1lbW9pemUgYXMgZGVmYXVsdCB9O1xuIiwiaW1wb3J0IG1lbW9pemUgZnJvbSAnQGVtb3Rpb24vbWVtb2l6ZSc7XG5cbnZhciByZWFjdFByb3BzUmVnZXggPSAvXigoY2hpbGRyZW58ZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUx8a2V5fHJlZnxhdXRvRm9jdXN8ZGVmYXVsdFZhbHVlfGRlZmF1bHRDaGVja2VkfGlubmVySFRNTHxzdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5pbmd8c3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nfHZhbHVlTGlua3xhYmJyfGFjY2VwdHxhY2NlcHRDaGFyc2V0fGFjY2Vzc0tleXxhY3Rpb258YWxsb3d8YWxsb3dVc2VyTWVkaWF8YWxsb3dQYXltZW50UmVxdWVzdHxhbGxvd0Z1bGxTY3JlZW58YWxsb3dUcmFuc3BhcmVuY3l8YWx0fGFzeW5jfGF1dG9Db21wbGV0ZXxhdXRvUGxheXxjYXB0dXJlfGNlbGxQYWRkaW5nfGNlbGxTcGFjaW5nfGNoYWxsZW5nZXxjaGFyU2V0fGNoZWNrZWR8Y2l0ZXxjbGFzc0lEfGNsYXNzTmFtZXxjb2xzfGNvbFNwYW58Y29udGVudHxjb250ZW50RWRpdGFibGV8Y29udGV4dE1lbnV8Y29udHJvbHN8Y29udHJvbHNMaXN0fGNvb3Jkc3xjcm9zc09yaWdpbnxkYXRhfGRhdGVUaW1lfGRlY29kaW5nfGRlZmF1bHR8ZGVmZXJ8ZGlyfGRpc2FibGVkfGRpc2FibGVQaWN0dXJlSW5QaWN0dXJlfGRpc2FibGVSZW1vdGVQbGF5YmFja3xkb3dubG9hZHxkcmFnZ2FibGV8ZW5jVHlwZXxlbnRlcktleUhpbnR8Zm9ybXxmb3JtQWN0aW9ufGZvcm1FbmNUeXBlfGZvcm1NZXRob2R8Zm9ybU5vVmFsaWRhdGV8Zm9ybVRhcmdldHxmcmFtZUJvcmRlcnxoZWFkZXJzfGhlaWdodHxoaWRkZW58aGlnaHxocmVmfGhyZWZMYW5nfGh0bWxGb3J8aHR0cEVxdWl2fGlkfGlucHV0TW9kZXxpbnRlZ3JpdHl8aXN8a2V5UGFyYW1zfGtleVR5cGV8a2luZHxsYWJlbHxsYW5nfGxpc3R8bG9hZGluZ3xsb29wfGxvd3xtYXJnaW5IZWlnaHR8bWFyZ2luV2lkdGh8bWF4fG1heExlbmd0aHxtZWRpYXxtZWRpYUdyb3VwfG1ldGhvZHxtaW58bWluTGVuZ3RofG11bHRpcGxlfG11dGVkfG5hbWV8bm9uY2V8bm9WYWxpZGF0ZXxvcGVufG9wdGltdW18cGF0dGVybnxwbGFjZWhvbGRlcnxwbGF5c0lubGluZXxwb3N0ZXJ8cHJlbG9hZHxwcm9maWxlfHJhZGlvR3JvdXB8cmVhZE9ubHl8cmVmZXJyZXJQb2xpY3l8cmVsfHJlcXVpcmVkfHJldmVyc2VkfHJvbGV8cm93c3xyb3dTcGFufHNhbmRib3h8c2NvcGV8c2NvcGVkfHNjcm9sbGluZ3xzZWFtbGVzc3xzZWxlY3RlZHxzaGFwZXxzaXplfHNpemVzfHNsb3R8c3BhbnxzcGVsbENoZWNrfHNyY3xzcmNEb2N8c3JjTGFuZ3xzcmNTZXR8c3RhcnR8c3RlcHxzdHlsZXxzdW1tYXJ5fHRhYkluZGV4fHRhcmdldHx0aXRsZXx0cmFuc2xhdGV8dHlwZXx1c2VNYXB8dmFsdWV8d2lkdGh8d21vZGV8d3JhcHxhYm91dHxkYXRhdHlwZXxpbmxpc3R8cHJlZml4fHByb3BlcnR5fHJlc291cmNlfHR5cGVvZnx2b2NhYnxhdXRvQ2FwaXRhbGl6ZXxhdXRvQ29ycmVjdHxhdXRvU2F2ZXxjb2xvcnxpbmNyZW1lbnRhbHxmYWxsYmFja3xpbmVydHxpdGVtUHJvcHxpdGVtU2NvcGV8aXRlbVR5cGV8aXRlbUlEfGl0ZW1SZWZ8b258b3B0aW9ufHJlc3VsdHN8c2VjdXJpdHl8dW5zZWxlY3RhYmxlfGFjY2VudEhlaWdodHxhY2N1bXVsYXRlfGFkZGl0aXZlfGFsaWdubWVudEJhc2VsaW5lfGFsbG93UmVvcmRlcnxhbHBoYWJldGljfGFtcGxpdHVkZXxhcmFiaWNGb3JtfGFzY2VudHxhdHRyaWJ1dGVOYW1lfGF0dHJpYnV0ZVR5cGV8YXV0b1JldmVyc2V8YXppbXV0aHxiYXNlRnJlcXVlbmN5fGJhc2VsaW5lU2hpZnR8YmFzZVByb2ZpbGV8YmJveHxiZWdpbnxiaWFzfGJ5fGNhbGNNb2RlfGNhcEhlaWdodHxjbGlwfGNsaXBQYXRoVW5pdHN8Y2xpcFBhdGh8Y2xpcFJ1bGV8Y29sb3JJbnRlcnBvbGF0aW9ufGNvbG9ySW50ZXJwb2xhdGlvbkZpbHRlcnN8Y29sb3JQcm9maWxlfGNvbG9yUmVuZGVyaW5nfGNvbnRlbnRTY3JpcHRUeXBlfGNvbnRlbnRTdHlsZVR5cGV8Y3Vyc29yfGN4fGN5fGR8ZGVjZWxlcmF0ZXxkZXNjZW50fGRpZmZ1c2VDb25zdGFudHxkaXJlY3Rpb258ZGlzcGxheXxkaXZpc29yfGRvbWluYW50QmFzZWxpbmV8ZHVyfGR4fGR5fGVkZ2VNb2RlfGVsZXZhdGlvbnxlbmFibGVCYWNrZ3JvdW5kfGVuZHxleHBvbmVudHxleHRlcm5hbFJlc291cmNlc1JlcXVpcmVkfGZpbGx8ZmlsbE9wYWNpdHl8ZmlsbFJ1bGV8ZmlsdGVyfGZpbHRlclJlc3xmaWx0ZXJVbml0c3xmbG9vZENvbG9yfGZsb29kT3BhY2l0eXxmb2N1c2FibGV8Zm9udEZhbWlseXxmb250U2l6ZXxmb250U2l6ZUFkanVzdHxmb250U3RyZXRjaHxmb250U3R5bGV8Zm9udFZhcmlhbnR8Zm9udFdlaWdodHxmb3JtYXR8ZnJvbXxmcnxmeHxmeXxnMXxnMnxnbHlwaE5hbWV8Z2x5cGhPcmllbnRhdGlvbkhvcml6b250YWx8Z2x5cGhPcmllbnRhdGlvblZlcnRpY2FsfGdseXBoUmVmfGdyYWRpZW50VHJhbnNmb3JtfGdyYWRpZW50VW5pdHN8aGFuZ2luZ3xob3JpekFkdlh8aG9yaXpPcmlnaW5YfGlkZW9ncmFwaGljfGltYWdlUmVuZGVyaW5nfGlufGluMnxpbnRlcmNlcHR8a3xrMXxrMnxrM3xrNHxrZXJuZWxNYXRyaXh8a2VybmVsVW5pdExlbmd0aHxrZXJuaW5nfGtleVBvaW50c3xrZXlTcGxpbmVzfGtleVRpbWVzfGxlbmd0aEFkanVzdHxsZXR0ZXJTcGFjaW5nfGxpZ2h0aW5nQ29sb3J8bGltaXRpbmdDb25lQW5nbGV8bG9jYWx8bWFya2VyRW5kfG1hcmtlck1pZHxtYXJrZXJTdGFydHxtYXJrZXJIZWlnaHR8bWFya2VyVW5pdHN8bWFya2VyV2lkdGh8bWFza3xtYXNrQ29udGVudFVuaXRzfG1hc2tVbml0c3xtYXRoZW1hdGljYWx8bW9kZXxudW1PY3RhdmVzfG9mZnNldHxvcGFjaXR5fG9wZXJhdG9yfG9yZGVyfG9yaWVudHxvcmllbnRhdGlvbnxvcmlnaW58b3ZlcmZsb3d8b3ZlcmxpbmVQb3NpdGlvbnxvdmVybGluZVRoaWNrbmVzc3xwYW5vc2UxfHBhaW50T3JkZXJ8cGF0aExlbmd0aHxwYXR0ZXJuQ29udGVudFVuaXRzfHBhdHRlcm5UcmFuc2Zvcm18cGF0dGVyblVuaXRzfHBvaW50ZXJFdmVudHN8cG9pbnRzfHBvaW50c0F0WHxwb2ludHNBdFl8cG9pbnRzQXRafHByZXNlcnZlQWxwaGF8cHJlc2VydmVBc3BlY3RSYXRpb3xwcmltaXRpdmVVbml0c3xyfHJhZGl1c3xyZWZYfHJlZll8cmVuZGVyaW5nSW50ZW50fHJlcGVhdENvdW50fHJlcGVhdER1cnxyZXF1aXJlZEV4dGVuc2lvbnN8cmVxdWlyZWRGZWF0dXJlc3xyZXN0YXJ0fHJlc3VsdHxyb3RhdGV8cnh8cnl8c2NhbGV8c2VlZHxzaGFwZVJlbmRlcmluZ3xzbG9wZXxzcGFjaW5nfHNwZWN1bGFyQ29uc3RhbnR8c3BlY3VsYXJFeHBvbmVudHxzcGVlZHxzcHJlYWRNZXRob2R8c3RhcnRPZmZzZXR8c3RkRGV2aWF0aW9ufHN0ZW1ofHN0ZW12fHN0aXRjaFRpbGVzfHN0b3BDb2xvcnxzdG9wT3BhY2l0eXxzdHJpa2V0aHJvdWdoUG9zaXRpb258c3RyaWtldGhyb3VnaFRoaWNrbmVzc3xzdHJpbmd8c3Ryb2tlfHN0cm9rZURhc2hhcnJheXxzdHJva2VEYXNob2Zmc2V0fHN0cm9rZUxpbmVjYXB8c3Ryb2tlTGluZWpvaW58c3Ryb2tlTWl0ZXJsaW1pdHxzdHJva2VPcGFjaXR5fHN0cm9rZVdpZHRofHN1cmZhY2VTY2FsZXxzeXN0ZW1MYW5ndWFnZXx0YWJsZVZhbHVlc3x0YXJnZXRYfHRhcmdldFl8dGV4dEFuY2hvcnx0ZXh0RGVjb3JhdGlvbnx0ZXh0UmVuZGVyaW5nfHRleHRMZW5ndGh8dG98dHJhbnNmb3JtfHUxfHUyfHVuZGVybGluZVBvc2l0aW9ufHVuZGVybGluZVRoaWNrbmVzc3x1bmljb2RlfHVuaWNvZGVCaWRpfHVuaWNvZGVSYW5nZXx1bml0c1BlckVtfHZBbHBoYWJldGljfHZIYW5naW5nfHZJZGVvZ3JhcGhpY3x2TWF0aGVtYXRpY2FsfHZhbHVlc3x2ZWN0b3JFZmZlY3R8dmVyc2lvbnx2ZXJ0QWR2WXx2ZXJ0T3JpZ2luWHx2ZXJ0T3JpZ2luWXx2aWV3Qm94fHZpZXdUYXJnZXR8dmlzaWJpbGl0eXx3aWR0aHN8d29yZFNwYWNpbmd8d3JpdGluZ01vZGV8eHx4SGVpZ2h0fHgxfHgyfHhDaGFubmVsU2VsZWN0b3J8eGxpbmtBY3R1YXRlfHhsaW5rQXJjcm9sZXx4bGlua0hyZWZ8eGxpbmtSb2xlfHhsaW5rU2hvd3x4bGlua1RpdGxlfHhsaW5rVHlwZXx4bWxCYXNlfHhtbG5zfHhtbG5zWGxpbmt8eG1sTGFuZ3x4bWxTcGFjZXx5fHkxfHkyfHlDaGFubmVsU2VsZWN0b3J8enx6b29tQW5kUGFufGZvcnxjbGFzc3xhdXRvZm9jdXMpfCgoW0RkXVtBYV1bVHRdW0FhXXxbQWFdW1JyXVtJaV1bQWFdfHgpLS4qKSkkLzsgLy8gaHR0cHM6Ly9lc2JlbmNoLmNvbS9iZW5jaC81YmZlZTY4YTRjZDdlNjAwOWVmNjFkMjNcblxudmFyIGlzUHJvcFZhbGlkID0gLyogI19fUFVSRV9fICovbWVtb2l6ZShmdW5jdGlvbiAocHJvcCkge1xuICByZXR1cm4gcmVhY3RQcm9wc1JlZ2V4LnRlc3QocHJvcCkgfHwgcHJvcC5jaGFyQ29kZUF0KDApID09PSAxMTFcbiAgLyogbyAqL1xuICAmJiBwcm9wLmNoYXJDb2RlQXQoMSkgPT09IDExMFxuICAvKiBuICovXG4gICYmIHByb3AuY2hhckNvZGVBdCgyKSA8IDkxO1xufVxuLyogWisxICovXG4pO1xuXG5leHBvcnQgeyBpc1Byb3BWYWxpZCBhcyBkZWZhdWx0IH07XG4iXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNSQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///95\n')},function(module,exports,__webpack_require__){eval("/* WEBPACK VAR INJECTION */(function(global) {global.SC_DISABLE_SPEEDY = true;\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(21)))//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTYuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zcmMvZ2xvYmFsLmpzP2I1OTQiXSwic291cmNlc0NvbnRlbnQiOlsiZ2xvYmFsLlNDX0RJU0FCTEVfU1BFRURZID0gdHJ1ZTsiXSwibWFwcGluZ3MiOiJBQUFBO0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///96\n")},function(module,exports,__webpack_require__){"use strict";eval('/** @license React v16.14.0\n * react.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nvar l=__webpack_require__(61),n="function"===typeof Symbol&&Symbol.for,p=n?Symbol.for("react.element"):60103,q=n?Symbol.for("react.portal"):60106,r=n?Symbol.for("react.fragment"):60107,t=n?Symbol.for("react.strict_mode"):60108,u=n?Symbol.for("react.profiler"):60114,v=n?Symbol.for("react.provider"):60109,w=n?Symbol.for("react.context"):60110,x=n?Symbol.for("react.forward_ref"):60112,y=n?Symbol.for("react.suspense"):60113,z=n?Symbol.for("react.memo"):60115,A=n?Symbol.for("react.lazy"):\n60116,B="function"===typeof Symbol&&Symbol.iterator;function C(a){for(var b="https://reactjs.org/docs/error-decoder.html?invariant="+a,c=1;c<arguments.length;c++)b+="&args[]="+encodeURIComponent(arguments[c]);return"Minified React error #"+a+"; visit "+b+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."}\nvar D={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},E={};function F(a,b,c){this.props=a;this.context=b;this.refs=E;this.updater=c||D}F.prototype.isReactComponent={};F.prototype.setState=function(a,b){if("object"!==typeof a&&"function"!==typeof a&&null!=a)throw Error(C(85));this.updater.enqueueSetState(this,a,b,"setState")};F.prototype.forceUpdate=function(a){this.updater.enqueueForceUpdate(this,a,"forceUpdate")};\nfunction G(){}G.prototype=F.prototype;function H(a,b,c){this.props=a;this.context=b;this.refs=E;this.updater=c||D}var I=H.prototype=new G;I.constructor=H;l(I,F.prototype);I.isPureReactComponent=!0;var J={current:null},K=Object.prototype.hasOwnProperty,L={key:!0,ref:!0,__self:!0,__source:!0};\nfunction M(a,b,c){var e,d={},g=null,k=null;if(null!=b)for(e in void 0!==b.ref&&(k=b.ref),void 0!==b.key&&(g=""+b.key),b)K.call(b,e)&&!L.hasOwnProperty(e)&&(d[e]=b[e]);var f=arguments.length-2;if(1===f)d.children=c;else if(1<f){for(var h=Array(f),m=0;m<f;m++)h[m]=arguments[m+2];d.children=h}if(a&&a.defaultProps)for(e in f=a.defaultProps,f)void 0===d[e]&&(d[e]=f[e]);return{$$typeof:p,type:a,key:g,ref:k,props:d,_owner:J.current}}\nfunction N(a,b){return{$$typeof:p,type:a.type,key:b,ref:a.ref,props:a.props,_owner:a._owner}}function O(a){return"object"===typeof a&&null!==a&&a.$$typeof===p}function escape(a){var b={"=":"=0",":":"=2"};return"$"+(""+a).replace(/[=:]/g,function(a){return b[a]})}var P=/\\/+/g,Q=[];function R(a,b,c,e){if(Q.length){var d=Q.pop();d.result=a;d.keyPrefix=b;d.func=c;d.context=e;d.count=0;return d}return{result:a,keyPrefix:b,func:c,context:e,count:0}}\nfunction S(a){a.result=null;a.keyPrefix=null;a.func=null;a.context=null;a.count=0;10>Q.length&&Q.push(a)}\nfunction T(a,b,c,e){var d=typeof a;if("undefined"===d||"boolean"===d)a=null;var g=!1;if(null===a)g=!0;else switch(d){case "string":case "number":g=!0;break;case "object":switch(a.$$typeof){case p:case q:g=!0}}if(g)return c(e,a,""===b?"."+U(a,0):b),1;g=0;b=""===b?".":b+":";if(Array.isArray(a))for(var k=0;k<a.length;k++){d=a[k];var f=b+U(d,k);g+=T(d,f,c,e)}else if(null===a||"object"!==typeof a?f=null:(f=B&&a[B]||a["@@iterator"],f="function"===typeof f?f:null),"function"===typeof f)for(a=f.call(a),k=\n0;!(d=a.next()).done;)d=d.value,f=b+U(d,k++),g+=T(d,f,c,e);else if("object"===d)throw c=""+a,Error(C(31,"[object Object]"===c?"object with keys {"+Object.keys(a).join(", ")+"}":c,""));return g}function V(a,b,c){return null==a?0:T(a,"",b,c)}function U(a,b){return"object"===typeof a&&null!==a&&null!=a.key?escape(a.key):b.toString(36)}function W(a,b){a.func.call(a.context,b,a.count++)}\nfunction aa(a,b,c){var e=a.result,d=a.keyPrefix;a=a.func.call(a.context,b,a.count++);Array.isArray(a)?X(a,e,c,function(a){return a}):null!=a&&(O(a)&&(a=N(a,d+(!a.key||b&&b.key===a.key?"":(""+a.key).replace(P,"$&/")+"/")+c)),e.push(a))}function X(a,b,c,e,d){var g="";null!=c&&(g=(""+c).replace(P,"$&/")+"/");b=R(b,g,e,d);V(a,aa,b);S(b)}var Y={current:null};function Z(){var a=Y.current;if(null===a)throw Error(C(321));return a}\nvar ba={ReactCurrentDispatcher:Y,ReactCurrentBatchConfig:{suspense:null},ReactCurrentOwner:J,IsSomeRendererActing:{current:!1},assign:l};exports.Children={map:function(a,b,c){if(null==a)return a;var e=[];X(a,e,null,b,c);return e},forEach:function(a,b,c){if(null==a)return a;b=R(null,null,b,c);V(a,W,b);S(b)},count:function(a){return V(a,function(){return null},null)},toArray:function(a){var b=[];X(a,b,null,function(a){return a});return b},only:function(a){if(!O(a))throw Error(C(143));return a}};\nexports.Component=F;exports.Fragment=r;exports.Profiler=u;exports.PureComponent=H;exports.StrictMode=t;exports.Suspense=y;exports.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=ba;\nexports.cloneElement=function(a,b,c){if(null===a||void 0===a)throw Error(C(267,a));var e=l({},a.props),d=a.key,g=a.ref,k=a._owner;if(null!=b){void 0!==b.ref&&(g=b.ref,k=J.current);void 0!==b.key&&(d=""+b.key);if(a.type&&a.type.defaultProps)var f=a.type.defaultProps;for(h in b)K.call(b,h)&&!L.hasOwnProperty(h)&&(e[h]=void 0===b[h]&&void 0!==f?f[h]:b[h])}var h=arguments.length-2;if(1===h)e.children=c;else if(1<h){f=Array(h);for(var m=0;m<h;m++)f[m]=arguments[m+2];e.children=f}return{$$typeof:p,type:a.type,\nkey:d,ref:g,props:e,_owner:k}};exports.createContext=function(a,b){void 0===b&&(b=null);a={$$typeof:w,_calculateChangedBits:b,_currentValue:a,_currentValue2:a,_threadCount:0,Provider:null,Consumer:null};a.Provider={$$typeof:v,_context:a};return a.Consumer=a};exports.createElement=M;exports.createFactory=function(a){var b=M.bind(null,a);b.type=a;return b};exports.createRef=function(){return{current:null}};exports.forwardRef=function(a){return{$$typeof:x,render:a}};exports.isValidElement=O;\nexports.lazy=function(a){return{$$typeof:A,_ctor:a,_status:-1,_result:null}};exports.memo=function(a,b){return{$$typeof:z,type:a,compare:void 0===b?null:b}};exports.useCallback=function(a,b){return Z().useCallback(a,b)};exports.useContext=function(a,b){return Z().useContext(a,b)};exports.useDebugValue=function(){};exports.useEffect=function(a,b){return Z().useEffect(a,b)};exports.useImperativeHandle=function(a,b,c){return Z().useImperativeHandle(a,b,c)};\nexports.useLayoutEffect=function(a,b){return Z().useLayoutEffect(a,b)};exports.useMemo=function(a,b){return Z().useMemo(a,b)};exports.useReducer=function(a,b,c){return Z().useReducer(a,b,c)};exports.useRef=function(a){return Z().useRef(a)};exports.useState=function(a){return Z().useState(a)};exports.version="16.14.0";\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTcuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QvY2pzL3JlYWN0LnByb2R1Y3Rpb24ubWluLmpzP2JlMjQiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqIEBsaWNlbnNlIFJlYWN0IHYxNi4xNC4wXG4gKiByZWFjdC5wcm9kdWN0aW9uLm1pbi5qc1xuICpcbiAqIENvcHlyaWdodCAoYykgRmFjZWJvb2ssIEluYy4gYW5kIGl0cyBhZmZpbGlhdGVzLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbid1c2Ugc3RyaWN0Jzt2YXIgbD1yZXF1aXJlKFwib2JqZWN0LWFzc2lnblwiKSxuPVwiZnVuY3Rpb25cIj09PXR5cGVvZiBTeW1ib2wmJlN5bWJvbC5mb3IscD1uP1N5bWJvbC5mb3IoXCJyZWFjdC5lbGVtZW50XCIpOjYwMTAzLHE9bj9TeW1ib2wuZm9yKFwicmVhY3QucG9ydGFsXCIpOjYwMTA2LHI9bj9TeW1ib2wuZm9yKFwicmVhY3QuZnJhZ21lbnRcIik6NjAxMDcsdD1uP1N5bWJvbC5mb3IoXCJyZWFjdC5zdHJpY3RfbW9kZVwiKTo2MDEwOCx1PW4/U3ltYm9sLmZvcihcInJlYWN0LnByb2ZpbGVyXCIpOjYwMTE0LHY9bj9TeW1ib2wuZm9yKFwicmVhY3QucHJvdmlkZXJcIik6NjAxMDksdz1uP1N5bWJvbC5mb3IoXCJyZWFjdC5jb250ZXh0XCIpOjYwMTEwLHg9bj9TeW1ib2wuZm9yKFwicmVhY3QuZm9yd2FyZF9yZWZcIik6NjAxMTIseT1uP1N5bWJvbC5mb3IoXCJyZWFjdC5zdXNwZW5zZVwiKTo2MDExMyx6PW4/U3ltYm9sLmZvcihcInJlYWN0Lm1lbW9cIik6NjAxMTUsQT1uP1N5bWJvbC5mb3IoXCJyZWFjdC5sYXp5XCIpOlxuNjAxMTYsQj1cImZ1bmN0aW9uXCI9PT10eXBlb2YgU3ltYm9sJiZTeW1ib2wuaXRlcmF0b3I7ZnVuY3Rpb24gQyhhKXtmb3IodmFyIGI9XCJodHRwczovL3JlYWN0anMub3JnL2RvY3MvZXJyb3ItZGVjb2Rlci5odG1sP2ludmFyaWFudD1cIithLGM9MTtjPGFyZ3VtZW50cy5sZW5ndGg7YysrKWIrPVwiJmFyZ3NbXT1cIitlbmNvZGVVUklDb21wb25lbnQoYXJndW1lbnRzW2NdKTtyZXR1cm5cIk1pbmlmaWVkIFJlYWN0IGVycm9yICNcIithK1wiOyB2aXNpdCBcIitiK1wiIGZvciB0aGUgZnVsbCBtZXNzYWdlIG9yIHVzZSB0aGUgbm9uLW1pbmlmaWVkIGRldiBlbnZpcm9ubWVudCBmb3IgZnVsbCBlcnJvcnMgYW5kIGFkZGl0aW9uYWwgaGVscGZ1bCB3YXJuaW5ncy5cIn1cbnZhciBEPXtpc01vdW50ZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZW5xdWV1ZUZvcmNlVXBkYXRlOmZ1bmN0aW9uKCl7fSxlbnF1ZXVlUmVwbGFjZVN0YXRlOmZ1bmN0aW9uKCl7fSxlbnF1ZXVlU2V0U3RhdGU6ZnVuY3Rpb24oKXt9fSxFPXt9O2Z1bmN0aW9uIEYoYSxiLGMpe3RoaXMucHJvcHM9YTt0aGlzLmNvbnRleHQ9Yjt0aGlzLnJlZnM9RTt0aGlzLnVwZGF0ZXI9Y3x8RH1GLnByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50PXt9O0YucHJvdG90eXBlLnNldFN0YXRlPWZ1bmN0aW9uKGEsYil7aWYoXCJvYmplY3RcIiE9PXR5cGVvZiBhJiZcImZ1bmN0aW9uXCIhPT10eXBlb2YgYSYmbnVsbCE9YSl0aHJvdyBFcnJvcihDKDg1KSk7dGhpcy51cGRhdGVyLmVucXVldWVTZXRTdGF0ZSh0aGlzLGEsYixcInNldFN0YXRlXCIpfTtGLnByb3RvdHlwZS5mb3JjZVVwZGF0ZT1mdW5jdGlvbihhKXt0aGlzLnVwZGF0ZXIuZW5xdWV1ZUZvcmNlVXBkYXRlKHRoaXMsYSxcImZvcmNlVXBkYXRlXCIpfTtcbmZ1bmN0aW9uIEcoKXt9Ry5wcm90b3R5cGU9Ri5wcm90b3R5cGU7ZnVuY3Rpb24gSChhLGIsYyl7dGhpcy5wcm9wcz1hO3RoaXMuY29udGV4dD1iO3RoaXMucmVmcz1FO3RoaXMudXBkYXRlcj1jfHxEfXZhciBJPUgucHJvdG90eXBlPW5ldyBHO0kuY29uc3RydWN0b3I9SDtsKEksRi5wcm90b3R5cGUpO0kuaXNQdXJlUmVhY3RDb21wb25lbnQ9ITA7dmFyIEo9e2N1cnJlbnQ6bnVsbH0sSz1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LEw9e2tleTohMCxyZWY6ITAsX19zZWxmOiEwLF9fc291cmNlOiEwfTtcbmZ1bmN0aW9uIE0oYSxiLGMpe3ZhciBlLGQ9e30sZz1udWxsLGs9bnVsbDtpZihudWxsIT1iKWZvcihlIGluIHZvaWQgMCE9PWIucmVmJiYoaz1iLnJlZiksdm9pZCAwIT09Yi5rZXkmJihnPVwiXCIrYi5rZXkpLGIpSy5jYWxsKGIsZSkmJiFMLmhhc093blByb3BlcnR5KGUpJiYoZFtlXT1iW2VdKTt2YXIgZj1hcmd1bWVudHMubGVuZ3RoLTI7aWYoMT09PWYpZC5jaGlsZHJlbj1jO2Vsc2UgaWYoMTxmKXtmb3IodmFyIGg9QXJyYXkoZiksbT0wO208ZjttKyspaFttXT1hcmd1bWVudHNbbSsyXTtkLmNoaWxkcmVuPWh9aWYoYSYmYS5kZWZhdWx0UHJvcHMpZm9yKGUgaW4gZj1hLmRlZmF1bHRQcm9wcyxmKXZvaWQgMD09PWRbZV0mJihkW2VdPWZbZV0pO3JldHVybnskJHR5cGVvZjpwLHR5cGU6YSxrZXk6ZyxyZWY6ayxwcm9wczpkLF9vd25lcjpKLmN1cnJlbnR9fVxuZnVuY3Rpb24gTihhLGIpe3JldHVybnskJHR5cGVvZjpwLHR5cGU6YS50eXBlLGtleTpiLHJlZjphLnJlZixwcm9wczphLnByb3BzLF9vd25lcjphLl9vd25lcn19ZnVuY3Rpb24gTyhhKXtyZXR1cm5cIm9iamVjdFwiPT09dHlwZW9mIGEmJm51bGwhPT1hJiZhLiQkdHlwZW9mPT09cH1mdW5jdGlvbiBlc2NhcGUoYSl7dmFyIGI9e1wiPVwiOlwiPTBcIixcIjpcIjpcIj0yXCJ9O3JldHVyblwiJFwiKyhcIlwiK2EpLnJlcGxhY2UoL1s9Ol0vZyxmdW5jdGlvbihhKXtyZXR1cm4gYlthXX0pfXZhciBQPS9cXC8rL2csUT1bXTtmdW5jdGlvbiBSKGEsYixjLGUpe2lmKFEubGVuZ3RoKXt2YXIgZD1RLnBvcCgpO2QucmVzdWx0PWE7ZC5rZXlQcmVmaXg9YjtkLmZ1bmM9YztkLmNvbnRleHQ9ZTtkLmNvdW50PTA7cmV0dXJuIGR9cmV0dXJue3Jlc3VsdDphLGtleVByZWZpeDpiLGZ1bmM6Yyxjb250ZXh0OmUsY291bnQ6MH19XG5mdW5jdGlvbiBTKGEpe2EucmVzdWx0PW51bGw7YS5rZXlQcmVmaXg9bnVsbDthLmZ1bmM9bnVsbDthLmNvbnRleHQ9bnVsbDthLmNvdW50PTA7MTA+US5sZW5ndGgmJlEucHVzaChhKX1cbmZ1bmN0aW9uIFQoYSxiLGMsZSl7dmFyIGQ9dHlwZW9mIGE7aWYoXCJ1bmRlZmluZWRcIj09PWR8fFwiYm9vbGVhblwiPT09ZClhPW51bGw7dmFyIGc9ITE7aWYobnVsbD09PWEpZz0hMDtlbHNlIHN3aXRjaChkKXtjYXNlIFwic3RyaW5nXCI6Y2FzZSBcIm51bWJlclwiOmc9ITA7YnJlYWs7Y2FzZSBcIm9iamVjdFwiOnN3aXRjaChhLiQkdHlwZW9mKXtjYXNlIHA6Y2FzZSBxOmc9ITB9fWlmKGcpcmV0dXJuIGMoZSxhLFwiXCI9PT1iP1wiLlwiK1UoYSwwKTpiKSwxO2c9MDtiPVwiXCI9PT1iP1wiLlwiOmIrXCI6XCI7aWYoQXJyYXkuaXNBcnJheShhKSlmb3IodmFyIGs9MDtrPGEubGVuZ3RoO2srKyl7ZD1hW2tdO3ZhciBmPWIrVShkLGspO2crPVQoZCxmLGMsZSl9ZWxzZSBpZihudWxsPT09YXx8XCJvYmplY3RcIiE9PXR5cGVvZiBhP2Y9bnVsbDooZj1CJiZhW0JdfHxhW1wiQEBpdGVyYXRvclwiXSxmPVwiZnVuY3Rpb25cIj09PXR5cGVvZiBmP2Y6bnVsbCksXCJmdW5jdGlvblwiPT09dHlwZW9mIGYpZm9yKGE9Zi5jYWxsKGEpLGs9XG4wOyEoZD1hLm5leHQoKSkuZG9uZTspZD1kLnZhbHVlLGY9YitVKGQsaysrKSxnKz1UKGQsZixjLGUpO2Vsc2UgaWYoXCJvYmplY3RcIj09PWQpdGhyb3cgYz1cIlwiK2EsRXJyb3IoQygzMSxcIltvYmplY3QgT2JqZWN0XVwiPT09Yz9cIm9iamVjdCB3aXRoIGtleXMge1wiK09iamVjdC5rZXlzKGEpLmpvaW4oXCIsIFwiKStcIn1cIjpjLFwiXCIpKTtyZXR1cm4gZ31mdW5jdGlvbiBWKGEsYixjKXtyZXR1cm4gbnVsbD09YT8wOlQoYSxcIlwiLGIsYyl9ZnVuY3Rpb24gVShhLGIpe3JldHVyblwib2JqZWN0XCI9PT10eXBlb2YgYSYmbnVsbCE9PWEmJm51bGwhPWEua2V5P2VzY2FwZShhLmtleSk6Yi50b1N0cmluZygzNil9ZnVuY3Rpb24gVyhhLGIpe2EuZnVuYy5jYWxsKGEuY29udGV4dCxiLGEuY291bnQrKyl9XG5mdW5jdGlvbiBhYShhLGIsYyl7dmFyIGU9YS5yZXN1bHQsZD1hLmtleVByZWZpeDthPWEuZnVuYy5jYWxsKGEuY29udGV4dCxiLGEuY291bnQrKyk7QXJyYXkuaXNBcnJheShhKT9YKGEsZSxjLGZ1bmN0aW9uKGEpe3JldHVybiBhfSk6bnVsbCE9YSYmKE8oYSkmJihhPU4oYSxkKyghYS5rZXl8fGImJmIua2V5PT09YS5rZXk/XCJcIjooXCJcIithLmtleSkucmVwbGFjZShQLFwiJCYvXCIpK1wiL1wiKStjKSksZS5wdXNoKGEpKX1mdW5jdGlvbiBYKGEsYixjLGUsZCl7dmFyIGc9XCJcIjtudWxsIT1jJiYoZz0oXCJcIitjKS5yZXBsYWNlKFAsXCIkJi9cIikrXCIvXCIpO2I9UihiLGcsZSxkKTtWKGEsYWEsYik7UyhiKX12YXIgWT17Y3VycmVudDpudWxsfTtmdW5jdGlvbiBaKCl7dmFyIGE9WS5jdXJyZW50O2lmKG51bGw9PT1hKXRocm93IEVycm9yKEMoMzIxKSk7cmV0dXJuIGF9XG52YXIgYmE9e1JlYWN0Q3VycmVudERpc3BhdGNoZXI6WSxSZWFjdEN1cnJlbnRCYXRjaENvbmZpZzp7c3VzcGVuc2U6bnVsbH0sUmVhY3RDdXJyZW50T3duZXI6SixJc1NvbWVSZW5kZXJlckFjdGluZzp7Y3VycmVudDohMX0sYXNzaWduOmx9O2V4cG9ydHMuQ2hpbGRyZW49e21hcDpmdW5jdGlvbihhLGIsYyl7aWYobnVsbD09YSlyZXR1cm4gYTt2YXIgZT1bXTtYKGEsZSxudWxsLGIsYyk7cmV0dXJuIGV9LGZvckVhY2g6ZnVuY3Rpb24oYSxiLGMpe2lmKG51bGw9PWEpcmV0dXJuIGE7Yj1SKG51bGwsbnVsbCxiLGMpO1YoYSxXLGIpO1MoYil9LGNvdW50OmZ1bmN0aW9uKGEpe3JldHVybiBWKGEsZnVuY3Rpb24oKXtyZXR1cm4gbnVsbH0sbnVsbCl9LHRvQXJyYXk6ZnVuY3Rpb24oYSl7dmFyIGI9W107WChhLGIsbnVsbCxmdW5jdGlvbihhKXtyZXR1cm4gYX0pO3JldHVybiBifSxvbmx5OmZ1bmN0aW9uKGEpe2lmKCFPKGEpKXRocm93IEVycm9yKEMoMTQzKSk7cmV0dXJuIGF9fTtcbmV4cG9ydHMuQ29tcG9uZW50PUY7ZXhwb3J0cy5GcmFnbWVudD1yO2V4cG9ydHMuUHJvZmlsZXI9dTtleHBvcnRzLlB1cmVDb21wb25lbnQ9SDtleHBvcnRzLlN0cmljdE1vZGU9dDtleHBvcnRzLlN1c3BlbnNlPXk7ZXhwb3J0cy5fX1NFQ1JFVF9JTlRFUk5BTFNfRE9fTk9UX1VTRV9PUl9ZT1VfV0lMTF9CRV9GSVJFRD1iYTtcbmV4cG9ydHMuY2xvbmVFbGVtZW50PWZ1bmN0aW9uKGEsYixjKXtpZihudWxsPT09YXx8dm9pZCAwPT09YSl0aHJvdyBFcnJvcihDKDI2NyxhKSk7dmFyIGU9bCh7fSxhLnByb3BzKSxkPWEua2V5LGc9YS5yZWYsaz1hLl9vd25lcjtpZihudWxsIT1iKXt2b2lkIDAhPT1iLnJlZiYmKGc9Yi5yZWYsaz1KLmN1cnJlbnQpO3ZvaWQgMCE9PWIua2V5JiYoZD1cIlwiK2Iua2V5KTtpZihhLnR5cGUmJmEudHlwZS5kZWZhdWx0UHJvcHMpdmFyIGY9YS50eXBlLmRlZmF1bHRQcm9wcztmb3IoaCBpbiBiKUsuY2FsbChiLGgpJiYhTC5oYXNPd25Qcm9wZXJ0eShoKSYmKGVbaF09dm9pZCAwPT09YltoXSYmdm9pZCAwIT09Zj9mW2hdOmJbaF0pfXZhciBoPWFyZ3VtZW50cy5sZW5ndGgtMjtpZigxPT09aCllLmNoaWxkcmVuPWM7ZWxzZSBpZigxPGgpe2Y9QXJyYXkoaCk7Zm9yKHZhciBtPTA7bTxoO20rKylmW21dPWFyZ3VtZW50c1ttKzJdO2UuY2hpbGRyZW49Zn1yZXR1cm57JCR0eXBlb2Y6cCx0eXBlOmEudHlwZSxcbmtleTpkLHJlZjpnLHByb3BzOmUsX293bmVyOmt9fTtleHBvcnRzLmNyZWF0ZUNvbnRleHQ9ZnVuY3Rpb24oYSxiKXt2b2lkIDA9PT1iJiYoYj1udWxsKTthPXskJHR5cGVvZjp3LF9jYWxjdWxhdGVDaGFuZ2VkQml0czpiLF9jdXJyZW50VmFsdWU6YSxfY3VycmVudFZhbHVlMjphLF90aHJlYWRDb3VudDowLFByb3ZpZGVyOm51bGwsQ29uc3VtZXI6bnVsbH07YS5Qcm92aWRlcj17JCR0eXBlb2Y6dixfY29udGV4dDphfTtyZXR1cm4gYS5Db25zdW1lcj1hfTtleHBvcnRzLmNyZWF0ZUVsZW1lbnQ9TTtleHBvcnRzLmNyZWF0ZUZhY3Rvcnk9ZnVuY3Rpb24oYSl7dmFyIGI9TS5iaW5kKG51bGwsYSk7Yi50eXBlPWE7cmV0dXJuIGJ9O2V4cG9ydHMuY3JlYXRlUmVmPWZ1bmN0aW9uKCl7cmV0dXJue2N1cnJlbnQ6bnVsbH19O2V4cG9ydHMuZm9yd2FyZFJlZj1mdW5jdGlvbihhKXtyZXR1cm57JCR0eXBlb2Y6eCxyZW5kZXI6YX19O2V4cG9ydHMuaXNWYWxpZEVsZW1lbnQ9TztcbmV4cG9ydHMubGF6eT1mdW5jdGlvbihhKXtyZXR1cm57JCR0eXBlb2Y6QSxfY3RvcjphLF9zdGF0dXM6LTEsX3Jlc3VsdDpudWxsfX07ZXhwb3J0cy5tZW1vPWZ1bmN0aW9uKGEsYil7cmV0dXJueyQkdHlwZW9mOnosdHlwZTphLGNvbXBhcmU6dm9pZCAwPT09Yj9udWxsOmJ9fTtleHBvcnRzLnVzZUNhbGxiYWNrPWZ1bmN0aW9uKGEsYil7cmV0dXJuIFooKS51c2VDYWxsYmFjayhhLGIpfTtleHBvcnRzLnVzZUNvbnRleHQ9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gWigpLnVzZUNvbnRleHQoYSxiKX07ZXhwb3J0cy51c2VEZWJ1Z1ZhbHVlPWZ1bmN0aW9uKCl7fTtleHBvcnRzLnVzZUVmZmVjdD1mdW5jdGlvbihhLGIpe3JldHVybiBaKCkudXNlRWZmZWN0KGEsYil9O2V4cG9ydHMudXNlSW1wZXJhdGl2ZUhhbmRsZT1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIFooKS51c2VJbXBlcmF0aXZlSGFuZGxlKGEsYixjKX07XG5leHBvcnRzLnVzZUxheW91dEVmZmVjdD1mdW5jdGlvbihhLGIpe3JldHVybiBaKCkudXNlTGF5b3V0RWZmZWN0KGEsYil9O2V4cG9ydHMudXNlTWVtbz1mdW5jdGlvbihhLGIpe3JldHVybiBaKCkudXNlTWVtbyhhLGIpfTtleHBvcnRzLnVzZVJlZHVjZXI9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBaKCkudXNlUmVkdWNlcihhLGIsYyl9O2V4cG9ydHMudXNlUmVmPWZ1bmN0aW9uKGEpe3JldHVybiBaKCkudXNlUmVmKGEpfTtleHBvcnRzLnVzZVN0YXRlPWZ1bmN0aW9uKGEpe3JldHVybiBaKCkudXNlU3RhdGUoYSl9O2V4cG9ydHMudmVyc2lvbj1cIjE2LjE0LjBcIjtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///97\n')},function(module,exports,__webpack_require__){"use strict";eval('/** @license React v16.14.0\n * react-dom.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n/*\n Modernizr 3.0.0pre (Custom Build) | MIT\n*/\nvar aa=__webpack_require__(0),n=__webpack_require__(61),r=__webpack_require__(99);function u(a){for(var b="https://reactjs.org/docs/error-decoder.html?invariant="+a,c=1;c<arguments.length;c++)b+="&args[]="+encodeURIComponent(arguments[c]);return"Minified React error #"+a+"; visit "+b+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."}if(!aa)throw Error(u(227));\nfunction ba(a,b,c,d,e,f,g,h,k){var l=Array.prototype.slice.call(arguments,3);try{b.apply(c,l)}catch(m){this.onError(m)}}var da=!1,ea=null,fa=!1,ha=null,ia={onError:function(a){da=!0;ea=a}};function ja(a,b,c,d,e,f,g,h,k){da=!1;ea=null;ba.apply(ia,arguments)}function ka(a,b,c,d,e,f,g,h,k){ja.apply(this,arguments);if(da){if(da){var l=ea;da=!1;ea=null}else throw Error(u(198));fa||(fa=!0,ha=l)}}var la=null,ma=null,na=null;\nfunction oa(a,b,c){var d=a.type||"unknown-event";a.currentTarget=na(c);ka(d,b,void 0,a);a.currentTarget=null}var pa=null,qa={};\nfunction ra(){if(pa)for(var a in qa){var b=qa[a],c=pa.indexOf(a);if(!(-1<c))throw Error(u(96,a));if(!sa[c]){if(!b.extractEvents)throw Error(u(97,a));sa[c]=b;c=b.eventTypes;for(var d in c){var e=void 0;var f=c[d],g=b,h=d;if(ta.hasOwnProperty(h))throw Error(u(99,h));ta[h]=f;var k=f.phasedRegistrationNames;if(k){for(e in k)k.hasOwnProperty(e)&&ua(k[e],g,h);e=!0}else f.registrationName?(ua(f.registrationName,g,h),e=!0):e=!1;if(!e)throw Error(u(98,d,a));}}}}\nfunction ua(a,b,c){if(va[a])throw Error(u(100,a));va[a]=b;wa[a]=b.eventTypes[c].dependencies}var sa=[],ta={},va={},wa={};function xa(a){var b=!1,c;for(c in a)if(a.hasOwnProperty(c)){var d=a[c];if(!qa.hasOwnProperty(c)||qa[c]!==d){if(qa[c])throw Error(u(102,c));qa[c]=d;b=!0}}b&&ra()}var ya=!("undefined"===typeof window||"undefined"===typeof window.document||"undefined"===typeof window.document.createElement),za=null,Aa=null,Ba=null;\nfunction Ca(a){if(a=ma(a)){if("function"!==typeof za)throw Error(u(280));var b=a.stateNode;b&&(b=la(b),za(a.stateNode,a.type,b))}}function Da(a){Aa?Ba?Ba.push(a):Ba=[a]:Aa=a}function Ea(){if(Aa){var a=Aa,b=Ba;Ba=Aa=null;Ca(a);if(b)for(a=0;a<b.length;a++)Ca(b[a])}}function Fa(a,b){return a(b)}function Ga(a,b,c,d,e){return a(b,c,d,e)}function Ha(){}var Ia=Fa,Ja=!1,Ka=!1;function La(){if(null!==Aa||null!==Ba)Ha(),Ea()}\nfunction Ma(a,b,c){if(Ka)return a(b,c);Ka=!0;try{return Ia(a,b,c)}finally{Ka=!1,La()}}var Na=/^[:A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD][:A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD\\-.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040]*$/,Oa=Object.prototype.hasOwnProperty,Pa={},Qa={};\nfunction Ra(a){if(Oa.call(Qa,a))return!0;if(Oa.call(Pa,a))return!1;if(Na.test(a))return Qa[a]=!0;Pa[a]=!0;return!1}function Sa(a,b,c,d){if(null!==c&&0===c.type)return!1;switch(typeof b){case "function":case "symbol":return!0;case "boolean":if(d)return!1;if(null!==c)return!c.acceptsBooleans;a=a.toLowerCase().slice(0,5);return"data-"!==a&&"aria-"!==a;default:return!1}}\nfunction Ta(a,b,c,d){if(null===b||"undefined"===typeof b||Sa(a,b,c,d))return!0;if(d)return!1;if(null!==c)switch(c.type){case 3:return!b;case 4:return!1===b;case 5:return isNaN(b);case 6:return isNaN(b)||1>b}return!1}function v(a,b,c,d,e,f){this.acceptsBooleans=2===b||3===b||4===b;this.attributeName=d;this.attributeNamespace=e;this.mustUseProperty=c;this.propertyName=a;this.type=b;this.sanitizeURL=f}var C={};\n"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(a){C[a]=new v(a,0,!1,a,null,!1)});[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(a){var b=a[0];C[b]=new v(b,1,!1,a[1],null,!1)});["contentEditable","draggable","spellCheck","value"].forEach(function(a){C[a]=new v(a,2,!1,a.toLowerCase(),null,!1)});\n["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(a){C[a]=new v(a,2,!1,a,null,!1)});"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(a){C[a]=new v(a,3,!1,a.toLowerCase(),null,!1)});\n["checked","multiple","muted","selected"].forEach(function(a){C[a]=new v(a,3,!0,a,null,!1)});["capture","download"].forEach(function(a){C[a]=new v(a,4,!1,a,null,!1)});["cols","rows","size","span"].forEach(function(a){C[a]=new v(a,6,!1,a,null,!1)});["rowSpan","start"].forEach(function(a){C[a]=new v(a,5,!1,a.toLowerCase(),null,!1)});var Ua=/[\\-:]([a-z])/g;function Va(a){return a[1].toUpperCase()}\n"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(a){var b=a.replace(Ua,\nVa);C[b]=new v(b,1,!1,a,null,!1)});"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(a){var b=a.replace(Ua,Va);C[b]=new v(b,1,!1,a,"http://www.w3.org/1999/xlink",!1)});["xml:base","xml:lang","xml:space"].forEach(function(a){var b=a.replace(Ua,Va);C[b]=new v(b,1,!1,a,"http://www.w3.org/XML/1998/namespace",!1)});["tabIndex","crossOrigin"].forEach(function(a){C[a]=new v(a,1,!1,a.toLowerCase(),null,!1)});\nC.xlinkHref=new v("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0);["src","href","action","formAction"].forEach(function(a){C[a]=new v(a,1,!1,a.toLowerCase(),null,!0)});var Wa=aa.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;Wa.hasOwnProperty("ReactCurrentDispatcher")||(Wa.ReactCurrentDispatcher={current:null});Wa.hasOwnProperty("ReactCurrentBatchConfig")||(Wa.ReactCurrentBatchConfig={suspense:null});\nfunction Xa(a,b,c,d){var e=C.hasOwnProperty(b)?C[b]:null;var f=null!==e?0===e.type:d?!1:!(2<b.length)||"o"!==b[0]&&"O"!==b[0]||"n"!==b[1]&&"N"!==b[1]?!1:!0;f||(Ta(b,c,e,d)&&(c=null),d||null===e?Ra(b)&&(null===c?a.removeAttribute(b):a.setAttribute(b,""+c)):e.mustUseProperty?a[e.propertyName]=null===c?3===e.type?!1:"":c:(b=e.attributeName,d=e.attributeNamespace,null===c?a.removeAttribute(b):(e=e.type,c=3===e||4===e&&!0===c?"":""+c,d?a.setAttributeNS(d,b,c):a.setAttribute(b,c))))}\nvar Ya=/^(.*)[\\\\\\/]/,E="function"===typeof Symbol&&Symbol.for,Za=E?Symbol.for("react.element"):60103,$a=E?Symbol.for("react.portal"):60106,ab=E?Symbol.for("react.fragment"):60107,bb=E?Symbol.for("react.strict_mode"):60108,cb=E?Symbol.for("react.profiler"):60114,db=E?Symbol.for("react.provider"):60109,eb=E?Symbol.for("react.context"):60110,fb=E?Symbol.for("react.concurrent_mode"):60111,gb=E?Symbol.for("react.forward_ref"):60112,hb=E?Symbol.for("react.suspense"):60113,ib=E?Symbol.for("react.suspense_list"):\n60120,jb=E?Symbol.for("react.memo"):60115,kb=E?Symbol.for("react.lazy"):60116,lb=E?Symbol.for("react.block"):60121,mb="function"===typeof Symbol&&Symbol.iterator;function nb(a){if(null===a||"object"!==typeof a)return null;a=mb&&a[mb]||a["@@iterator"];return"function"===typeof a?a:null}function ob(a){if(-1===a._status){a._status=0;var b=a._ctor;b=b();a._result=b;b.then(function(b){0===a._status&&(b=b.default,a._status=1,a._result=b)},function(b){0===a._status&&(a._status=2,a._result=b)})}}\nfunction pb(a){if(null==a)return null;if("function"===typeof a)return a.displayName||a.name||null;if("string"===typeof a)return a;switch(a){case ab:return"Fragment";case $a:return"Portal";case cb:return"Profiler";case bb:return"StrictMode";case hb:return"Suspense";case ib:return"SuspenseList"}if("object"===typeof a)switch(a.$$typeof){case eb:return"Context.Consumer";case db:return"Context.Provider";case gb:var b=a.render;b=b.displayName||b.name||"";return a.displayName||(""!==b?"ForwardRef("+b+")":\n"ForwardRef");case jb:return pb(a.type);case lb:return pb(a.render);case kb:if(a=1===a._status?a._result:null)return pb(a)}return null}function qb(a){var b="";do{a:switch(a.tag){case 3:case 4:case 6:case 7:case 10:case 9:var c="";break a;default:var d=a._debugOwner,e=a._debugSource,f=pb(a.type);c=null;d&&(c=pb(d.type));d=f;f="";e?f=" (at "+e.fileName.replace(Ya,"")+":"+e.lineNumber+")":c&&(f=" (created by "+c+")");c="\\n    in "+(d||"Unknown")+f}b+=c;a=a.return}while(a);return b}\nfunction rb(a){switch(typeof a){case "boolean":case "number":case "object":case "string":case "undefined":return a;default:return""}}function sb(a){var b=a.type;return(a=a.nodeName)&&"input"===a.toLowerCase()&&("checkbox"===b||"radio"===b)}\nfunction tb(a){var b=sb(a)?"checked":"value",c=Object.getOwnPropertyDescriptor(a.constructor.prototype,b),d=""+a[b];if(!a.hasOwnProperty(b)&&"undefined"!==typeof c&&"function"===typeof c.get&&"function"===typeof c.set){var e=c.get,f=c.set;Object.defineProperty(a,b,{configurable:!0,get:function(){return e.call(this)},set:function(a){d=""+a;f.call(this,a)}});Object.defineProperty(a,b,{enumerable:c.enumerable});return{getValue:function(){return d},setValue:function(a){d=""+a},stopTracking:function(){a._valueTracker=\nnull;delete a[b]}}}}function xb(a){a._valueTracker||(a._valueTracker=tb(a))}function yb(a){if(!a)return!1;var b=a._valueTracker;if(!b)return!0;var c=b.getValue();var d="";a&&(d=sb(a)?a.checked?"true":"false":a.value);a=d;return a!==c?(b.setValue(a),!0):!1}function zb(a,b){var c=b.checked;return n({},b,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:null!=c?c:a._wrapperState.initialChecked})}\nfunction Ab(a,b){var c=null==b.defaultValue?"":b.defaultValue,d=null!=b.checked?b.checked:b.defaultChecked;c=rb(null!=b.value?b.value:c);a._wrapperState={initialChecked:d,initialValue:c,controlled:"checkbox"===b.type||"radio"===b.type?null!=b.checked:null!=b.value}}function Bb(a,b){b=b.checked;null!=b&&Xa(a,"checked",b,!1)}\nfunction Cb(a,b){Bb(a,b);var c=rb(b.value),d=b.type;if(null!=c)if("number"===d){if(0===c&&""===a.value||a.value!=c)a.value=""+c}else a.value!==""+c&&(a.value=""+c);else if("submit"===d||"reset"===d){a.removeAttribute("value");return}b.hasOwnProperty("value")?Db(a,b.type,c):b.hasOwnProperty("defaultValue")&&Db(a,b.type,rb(b.defaultValue));null==b.checked&&null!=b.defaultChecked&&(a.defaultChecked=!!b.defaultChecked)}\nfunction Eb(a,b,c){if(b.hasOwnProperty("value")||b.hasOwnProperty("defaultValue")){var d=b.type;if(!("submit"!==d&&"reset"!==d||void 0!==b.value&&null!==b.value))return;b=""+a._wrapperState.initialValue;c||b===a.value||(a.value=b);a.defaultValue=b}c=a.name;""!==c&&(a.name="");a.defaultChecked=!!a._wrapperState.initialChecked;""!==c&&(a.name=c)}\nfunction Db(a,b,c){if("number"!==b||a.ownerDocument.activeElement!==a)null==c?a.defaultValue=""+a._wrapperState.initialValue:a.defaultValue!==""+c&&(a.defaultValue=""+c)}function Fb(a){var b="";aa.Children.forEach(a,function(a){null!=a&&(b+=a)});return b}function Gb(a,b){a=n({children:void 0},b);if(b=Fb(b.children))a.children=b;return a}\nfunction Hb(a,b,c,d){a=a.options;if(b){b={};for(var e=0;e<c.length;e++)b["$"+c[e]]=!0;for(c=0;c<a.length;c++)e=b.hasOwnProperty("$"+a[c].value),a[c].selected!==e&&(a[c].selected=e),e&&d&&(a[c].defaultSelected=!0)}else{c=""+rb(c);b=null;for(e=0;e<a.length;e++){if(a[e].value===c){a[e].selected=!0;d&&(a[e].defaultSelected=!0);return}null!==b||a[e].disabled||(b=a[e])}null!==b&&(b.selected=!0)}}\nfunction Ib(a,b){if(null!=b.dangerouslySetInnerHTML)throw Error(u(91));return n({},b,{value:void 0,defaultValue:void 0,children:""+a._wrapperState.initialValue})}function Jb(a,b){var c=b.value;if(null==c){c=b.children;b=b.defaultValue;if(null!=c){if(null!=b)throw Error(u(92));if(Array.isArray(c)){if(!(1>=c.length))throw Error(u(93));c=c[0]}b=c}null==b&&(b="");c=b}a._wrapperState={initialValue:rb(c)}}\nfunction Kb(a,b){var c=rb(b.value),d=rb(b.defaultValue);null!=c&&(c=""+c,c!==a.value&&(a.value=c),null==b.defaultValue&&a.defaultValue!==c&&(a.defaultValue=c));null!=d&&(a.defaultValue=""+d)}function Lb(a){var b=a.textContent;b===a._wrapperState.initialValue&&""!==b&&null!==b&&(a.value=b)}var Mb={html:"http://www.w3.org/1999/xhtml",mathml:"http://www.w3.org/1998/Math/MathML",svg:"http://www.w3.org/2000/svg"};\nfunction Nb(a){switch(a){case "svg":return"http://www.w3.org/2000/svg";case "math":return"http://www.w3.org/1998/Math/MathML";default:return"http://www.w3.org/1999/xhtml"}}function Ob(a,b){return null==a||"http://www.w3.org/1999/xhtml"===a?Nb(b):"http://www.w3.org/2000/svg"===a&&"foreignObject"===b?"http://www.w3.org/1999/xhtml":a}\nvar Pb,Qb=function(a){return"undefined"!==typeof MSApp&&MSApp.execUnsafeLocalFunction?function(b,c,d,e){MSApp.execUnsafeLocalFunction(function(){return a(b,c,d,e)})}:a}(function(a,b){if(a.namespaceURI!==Mb.svg||"innerHTML"in a)a.innerHTML=b;else{Pb=Pb||document.createElement("div");Pb.innerHTML="<svg>"+b.valueOf().toString()+"</svg>";for(b=Pb.firstChild;a.firstChild;)a.removeChild(a.firstChild);for(;b.firstChild;)a.appendChild(b.firstChild)}});\nfunction Rb(a,b){if(b){var c=a.firstChild;if(c&&c===a.lastChild&&3===c.nodeType){c.nodeValue=b;return}}a.textContent=b}function Sb(a,b){var c={};c[a.toLowerCase()]=b.toLowerCase();c["Webkit"+a]="webkit"+b;c["Moz"+a]="moz"+b;return c}var Tb={animationend:Sb("Animation","AnimationEnd"),animationiteration:Sb("Animation","AnimationIteration"),animationstart:Sb("Animation","AnimationStart"),transitionend:Sb("Transition","TransitionEnd")},Ub={},Vb={};\nya&&(Vb=document.createElement("div").style,"AnimationEvent"in window||(delete Tb.animationend.animation,delete Tb.animationiteration.animation,delete Tb.animationstart.animation),"TransitionEvent"in window||delete Tb.transitionend.transition);function Wb(a){if(Ub[a])return Ub[a];if(!Tb[a])return a;var b=Tb[a],c;for(c in b)if(b.hasOwnProperty(c)&&c in Vb)return Ub[a]=b[c];return a}\nvar Xb=Wb("animationend"),Yb=Wb("animationiteration"),Zb=Wb("animationstart"),$b=Wb("transitionend"),ac="abort canplay canplaythrough durationchange emptied encrypted ended error loadeddata loadedmetadata loadstart pause play playing progress ratechange seeked seeking stalled suspend timeupdate volumechange waiting".split(" "),bc=new ("function"===typeof WeakMap?WeakMap:Map);function cc(a){var b=bc.get(a);void 0===b&&(b=new Map,bc.set(a,b));return b}\nfunction dc(a){var b=a,c=a;if(a.alternate)for(;b.return;)b=b.return;else{a=b;do b=a,0!==(b.effectTag&1026)&&(c=b.return),a=b.return;while(a)}return 3===b.tag?c:null}function ec(a){if(13===a.tag){var b=a.memoizedState;null===b&&(a=a.alternate,null!==a&&(b=a.memoizedState));if(null!==b)return b.dehydrated}return null}function fc(a){if(dc(a)!==a)throw Error(u(188));}\nfunction gc(a){var b=a.alternate;if(!b){b=dc(a);if(null===b)throw Error(u(188));return b!==a?null:a}for(var c=a,d=b;;){var e=c.return;if(null===e)break;var f=e.alternate;if(null===f){d=e.return;if(null!==d){c=d;continue}break}if(e.child===f.child){for(f=e.child;f;){if(f===c)return fc(e),a;if(f===d)return fc(e),b;f=f.sibling}throw Error(u(188));}if(c.return!==d.return)c=e,d=f;else{for(var g=!1,h=e.child;h;){if(h===c){g=!0;c=e;d=f;break}if(h===d){g=!0;d=e;c=f;break}h=h.sibling}if(!g){for(h=f.child;h;){if(h===\nc){g=!0;c=f;d=e;break}if(h===d){g=!0;d=f;c=e;break}h=h.sibling}if(!g)throw Error(u(189));}}if(c.alternate!==d)throw Error(u(190));}if(3!==c.tag)throw Error(u(188));return c.stateNode.current===c?a:b}function hc(a){a=gc(a);if(!a)return null;for(var b=a;;){if(5===b.tag||6===b.tag)return b;if(b.child)b.child.return=b,b=b.child;else{if(b===a)break;for(;!b.sibling;){if(!b.return||b.return===a)return null;b=b.return}b.sibling.return=b.return;b=b.sibling}}return null}\nfunction ic(a,b){if(null==b)throw Error(u(30));if(null==a)return b;if(Array.isArray(a)){if(Array.isArray(b))return a.push.apply(a,b),a;a.push(b);return a}return Array.isArray(b)?[a].concat(b):[a,b]}function jc(a,b,c){Array.isArray(a)?a.forEach(b,c):a&&b.call(c,a)}var kc=null;\nfunction lc(a){if(a){var b=a._dispatchListeners,c=a._dispatchInstances;if(Array.isArray(b))for(var d=0;d<b.length&&!a.isPropagationStopped();d++)oa(a,b[d],c[d]);else b&&oa(a,b,c);a._dispatchListeners=null;a._dispatchInstances=null;a.isPersistent()||a.constructor.release(a)}}function mc(a){null!==a&&(kc=ic(kc,a));a=kc;kc=null;if(a){jc(a,lc);if(kc)throw Error(u(95));if(fa)throw a=ha,fa=!1,ha=null,a;}}\nfunction nc(a){a=a.target||a.srcElement||window;a.correspondingUseElement&&(a=a.correspondingUseElement);return 3===a.nodeType?a.parentNode:a}function oc(a){if(!ya)return!1;a="on"+a;var b=a in document;b||(b=document.createElement("div"),b.setAttribute(a,"return;"),b="function"===typeof b[a]);return b}var pc=[];function qc(a){a.topLevelType=null;a.nativeEvent=null;a.targetInst=null;a.ancestors.length=0;10>pc.length&&pc.push(a)}\nfunction rc(a,b,c,d){if(pc.length){var e=pc.pop();e.topLevelType=a;e.eventSystemFlags=d;e.nativeEvent=b;e.targetInst=c;return e}return{topLevelType:a,eventSystemFlags:d,nativeEvent:b,targetInst:c,ancestors:[]}}\nfunction sc(a){var b=a.targetInst,c=b;do{if(!c){a.ancestors.push(c);break}var d=c;if(3===d.tag)d=d.stateNode.containerInfo;else{for(;d.return;)d=d.return;d=3!==d.tag?null:d.stateNode.containerInfo}if(!d)break;b=c.tag;5!==b&&6!==b||a.ancestors.push(c);c=tc(d)}while(c);for(c=0;c<a.ancestors.length;c++){b=a.ancestors[c];var e=nc(a.nativeEvent);d=a.topLevelType;var f=a.nativeEvent,g=a.eventSystemFlags;0===c&&(g|=64);for(var h=null,k=0;k<sa.length;k++){var l=sa[k];l&&(l=l.extractEvents(d,b,f,e,g))&&(h=\nic(h,l))}mc(h)}}function uc(a,b,c){if(!c.has(a)){switch(a){case "scroll":vc(b,"scroll",!0);break;case "focus":case "blur":vc(b,"focus",!0);vc(b,"blur",!0);c.set("blur",null);c.set("focus",null);break;case "cancel":case "close":oc(a)&&vc(b,a,!0);break;case "invalid":case "submit":case "reset":break;default:-1===ac.indexOf(a)&&F(a,b)}c.set(a,null)}}\nvar wc,xc,yc,zc=!1,Ac=[],Bc=null,Cc=null,Dc=null,Ec=new Map,Fc=new Map,Gc=[],Hc="mousedown mouseup touchcancel touchend touchstart auxclick dblclick pointercancel pointerdown pointerup dragend dragstart drop compositionend compositionstart keydown keypress keyup input textInput close cancel copy cut paste click change contextmenu reset submit".split(" "),Ic="focus blur dragenter dragleave mouseover mouseout pointerover pointerout gotpointercapture lostpointercapture".split(" ");\nfunction Jc(a,b){var c=cc(b);Hc.forEach(function(a){uc(a,b,c)});Ic.forEach(function(a){uc(a,b,c)})}function Kc(a,b,c,d,e){return{blockedOn:a,topLevelType:b,eventSystemFlags:c|32,nativeEvent:e,container:d}}\nfunction Lc(a,b){switch(a){case "focus":case "blur":Bc=null;break;case "dragenter":case "dragleave":Cc=null;break;case "mouseover":case "mouseout":Dc=null;break;case "pointerover":case "pointerout":Ec.delete(b.pointerId);break;case "gotpointercapture":case "lostpointercapture":Fc.delete(b.pointerId)}}function Mc(a,b,c,d,e,f){if(null===a||a.nativeEvent!==f)return a=Kc(b,c,d,e,f),null!==b&&(b=Nc(b),null!==b&&xc(b)),a;a.eventSystemFlags|=d;return a}\nfunction Oc(a,b,c,d,e){switch(b){case "focus":return Bc=Mc(Bc,a,b,c,d,e),!0;case "dragenter":return Cc=Mc(Cc,a,b,c,d,e),!0;case "mouseover":return Dc=Mc(Dc,a,b,c,d,e),!0;case "pointerover":var f=e.pointerId;Ec.set(f,Mc(Ec.get(f)||null,a,b,c,d,e));return!0;case "gotpointercapture":return f=e.pointerId,Fc.set(f,Mc(Fc.get(f)||null,a,b,c,d,e)),!0}return!1}\nfunction Pc(a){var b=tc(a.target);if(null!==b){var c=dc(b);if(null!==c)if(b=c.tag,13===b){if(b=ec(c),null!==b){a.blockedOn=b;r.unstable_runWithPriority(a.priority,function(){yc(c)});return}}else if(3===b&&c.stateNode.hydrate){a.blockedOn=3===c.tag?c.stateNode.containerInfo:null;return}}a.blockedOn=null}function Qc(a){if(null!==a.blockedOn)return!1;var b=Rc(a.topLevelType,a.eventSystemFlags,a.container,a.nativeEvent);if(null!==b){var c=Nc(b);null!==c&&xc(c);a.blockedOn=b;return!1}return!0}\nfunction Sc(a,b,c){Qc(a)&&c.delete(b)}function Tc(){for(zc=!1;0<Ac.length;){var a=Ac[0];if(null!==a.blockedOn){a=Nc(a.blockedOn);null!==a&&wc(a);break}var b=Rc(a.topLevelType,a.eventSystemFlags,a.container,a.nativeEvent);null!==b?a.blockedOn=b:Ac.shift()}null!==Bc&&Qc(Bc)&&(Bc=null);null!==Cc&&Qc(Cc)&&(Cc=null);null!==Dc&&Qc(Dc)&&(Dc=null);Ec.forEach(Sc);Fc.forEach(Sc)}function Uc(a,b){a.blockedOn===b&&(a.blockedOn=null,zc||(zc=!0,r.unstable_scheduleCallback(r.unstable_NormalPriority,Tc)))}\nfunction Vc(a){function b(b){return Uc(b,a)}if(0<Ac.length){Uc(Ac[0],a);for(var c=1;c<Ac.length;c++){var d=Ac[c];d.blockedOn===a&&(d.blockedOn=null)}}null!==Bc&&Uc(Bc,a);null!==Cc&&Uc(Cc,a);null!==Dc&&Uc(Dc,a);Ec.forEach(b);Fc.forEach(b);for(c=0;c<Gc.length;c++)d=Gc[c],d.blockedOn===a&&(d.blockedOn=null);for(;0<Gc.length&&(c=Gc[0],null===c.blockedOn);)Pc(c),null===c.blockedOn&&Gc.shift()}\nvar Wc={},Yc=new Map,Zc=new Map,$c=["abort","abort",Xb,"animationEnd",Yb,"animationIteration",Zb,"animationStart","canplay","canPlay","canplaythrough","canPlayThrough","durationchange","durationChange","emptied","emptied","encrypted","encrypted","ended","ended","error","error","gotpointercapture","gotPointerCapture","load","load","loadeddata","loadedData","loadedmetadata","loadedMetadata","loadstart","loadStart","lostpointercapture","lostPointerCapture","playing","playing","progress","progress","seeking",\n"seeking","stalled","stalled","suspend","suspend","timeupdate","timeUpdate",$b,"transitionEnd","waiting","waiting"];function ad(a,b){for(var c=0;c<a.length;c+=2){var d=a[c],e=a[c+1],f="on"+(e[0].toUpperCase()+e.slice(1));f={phasedRegistrationNames:{bubbled:f,captured:f+"Capture"},dependencies:[d],eventPriority:b};Zc.set(d,b);Yc.set(d,f);Wc[e]=f}}\nad("blur blur cancel cancel click click close close contextmenu contextMenu copy copy cut cut auxclick auxClick dblclick doubleClick dragend dragEnd dragstart dragStart drop drop focus focus input input invalid invalid keydown keyDown keypress keyPress keyup keyUp mousedown mouseDown mouseup mouseUp paste paste pause pause play play pointercancel pointerCancel pointerdown pointerDown pointerup pointerUp ratechange rateChange reset reset seeked seeked submit submit touchcancel touchCancel touchend touchEnd touchstart touchStart volumechange volumeChange".split(" "),0);\nad("drag drag dragenter dragEnter dragexit dragExit dragleave dragLeave dragover dragOver mousemove mouseMove mouseout mouseOut mouseover mouseOver pointermove pointerMove pointerout pointerOut pointerover pointerOver scroll scroll toggle toggle touchmove touchMove wheel wheel".split(" "),1);ad($c,2);for(var bd="change selectionchange textInput compositionstart compositionend compositionupdate".split(" "),cd=0;cd<bd.length;cd++)Zc.set(bd[cd],0);\nvar dd=r.unstable_UserBlockingPriority,ed=r.unstable_runWithPriority,fd=!0;function F(a,b){vc(b,a,!1)}function vc(a,b,c){var d=Zc.get(b);switch(void 0===d?2:d){case 0:d=gd.bind(null,b,1,a);break;case 1:d=hd.bind(null,b,1,a);break;default:d=id.bind(null,b,1,a)}c?a.addEventListener(b,d,!0):a.addEventListener(b,d,!1)}function gd(a,b,c,d){Ja||Ha();var e=id,f=Ja;Ja=!0;try{Ga(e,a,b,c,d)}finally{(Ja=f)||La()}}function hd(a,b,c,d){ed(dd,id.bind(null,a,b,c,d))}\nfunction id(a,b,c,d){if(fd)if(0<Ac.length&&-1<Hc.indexOf(a))a=Kc(null,a,b,c,d),Ac.push(a);else{var e=Rc(a,b,c,d);if(null===e)Lc(a,d);else if(-1<Hc.indexOf(a))a=Kc(e,a,b,c,d),Ac.push(a);else if(!Oc(e,a,b,c,d)){Lc(a,d);a=rc(a,d,null,b);try{Ma(sc,a)}finally{qc(a)}}}}\nfunction Rc(a,b,c,d){c=nc(d);c=tc(c);if(null!==c){var e=dc(c);if(null===e)c=null;else{var f=e.tag;if(13===f){c=ec(e);if(null!==c)return c;c=null}else if(3===f){if(e.stateNode.hydrate)return 3===e.tag?e.stateNode.containerInfo:null;c=null}else e!==c&&(c=null)}}a=rc(a,d,c,b);try{Ma(sc,a)}finally{qc(a)}return null}\nvar jd={animationIterationCount:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,\nfloodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},kd=["Webkit","ms","Moz","O"];Object.keys(jd).forEach(function(a){kd.forEach(function(b){b=b+a.charAt(0).toUpperCase()+a.substring(1);jd[b]=jd[a]})});function ld(a,b,c){return null==b||"boolean"===typeof b||""===b?"":c||"number"!==typeof b||0===b||jd.hasOwnProperty(a)&&jd[a]?(""+b).trim():b+"px"}\nfunction md(a,b){a=a.style;for(var c in b)if(b.hasOwnProperty(c)){var d=0===c.indexOf("--"),e=ld(c,b[c],d);"float"===c&&(c="cssFloat");d?a.setProperty(c,e):a[c]=e}}var nd=n({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});\nfunction od(a,b){if(b){if(nd[a]&&(null!=b.children||null!=b.dangerouslySetInnerHTML))throw Error(u(137,a,""));if(null!=b.dangerouslySetInnerHTML){if(null!=b.children)throw Error(u(60));if(!("object"===typeof b.dangerouslySetInnerHTML&&"__html"in b.dangerouslySetInnerHTML))throw Error(u(61));}if(null!=b.style&&"object"!==typeof b.style)throw Error(u(62,""));}}\nfunction pd(a,b){if(-1===a.indexOf("-"))return"string"===typeof b.is;switch(a){case "annotation-xml":case "color-profile":case "font-face":case "font-face-src":case "font-face-uri":case "font-face-format":case "font-face-name":case "missing-glyph":return!1;default:return!0}}var qd=Mb.html;function rd(a,b){a=9===a.nodeType||11===a.nodeType?a:a.ownerDocument;var c=cc(a);b=wa[b];for(var d=0;d<b.length;d++)uc(b[d],a,c)}function sd(){}\nfunction td(a){a=a||("undefined"!==typeof document?document:void 0);if("undefined"===typeof a)return null;try{return a.activeElement||a.body}catch(b){return a.body}}function ud(a){for(;a&&a.firstChild;)a=a.firstChild;return a}function vd(a,b){var c=ud(a);a=0;for(var d;c;){if(3===c.nodeType){d=a+c.textContent.length;if(a<=b&&d>=b)return{node:c,offset:b-a};a=d}a:{for(;c;){if(c.nextSibling){c=c.nextSibling;break a}c=c.parentNode}c=void 0}c=ud(c)}}\nfunction wd(a,b){return a&&b?a===b?!0:a&&3===a.nodeType?!1:b&&3===b.nodeType?wd(a,b.parentNode):"contains"in a?a.contains(b):a.compareDocumentPosition?!!(a.compareDocumentPosition(b)&16):!1:!1}function xd(){for(var a=window,b=td();b instanceof a.HTMLIFrameElement;){try{var c="string"===typeof b.contentWindow.location.href}catch(d){c=!1}if(c)a=b.contentWindow;else break;b=td(a.document)}return b}\nfunction yd(a){var b=a&&a.nodeName&&a.nodeName.toLowerCase();return b&&("input"===b&&("text"===a.type||"search"===a.type||"tel"===a.type||"url"===a.type||"password"===a.type)||"textarea"===b||"true"===a.contentEditable)}var zd="$",Ad="/$",Bd="$?",Cd="$!",Dd=null,Ed=null;function Fd(a,b){switch(a){case "button":case "input":case "select":case "textarea":return!!b.autoFocus}return!1}\nfunction Gd(a,b){return"textarea"===a||"option"===a||"noscript"===a||"string"===typeof b.children||"number"===typeof b.children||"object"===typeof b.dangerouslySetInnerHTML&&null!==b.dangerouslySetInnerHTML&&null!=b.dangerouslySetInnerHTML.__html}var Hd="function"===typeof setTimeout?setTimeout:void 0,Id="function"===typeof clearTimeout?clearTimeout:void 0;function Jd(a){for(;null!=a;a=a.nextSibling){var b=a.nodeType;if(1===b||3===b)break}return a}\nfunction Kd(a){a=a.previousSibling;for(var b=0;a;){if(8===a.nodeType){var c=a.data;if(c===zd||c===Cd||c===Bd){if(0===b)return a;b--}else c===Ad&&b++}a=a.previousSibling}return null}var Ld=Math.random().toString(36).slice(2),Md="__reactInternalInstance$"+Ld,Nd="__reactEventHandlers$"+Ld,Od="__reactContainere$"+Ld;\nfunction tc(a){var b=a[Md];if(b)return b;for(var c=a.parentNode;c;){if(b=c[Od]||c[Md]){c=b.alternate;if(null!==b.child||null!==c&&null!==c.child)for(a=Kd(a);null!==a;){if(c=a[Md])return c;a=Kd(a)}return b}a=c;c=a.parentNode}return null}function Nc(a){a=a[Md]||a[Od];return!a||5!==a.tag&&6!==a.tag&&13!==a.tag&&3!==a.tag?null:a}function Pd(a){if(5===a.tag||6===a.tag)return a.stateNode;throw Error(u(33));}function Qd(a){return a[Nd]||null}\nfunction Rd(a){do a=a.return;while(a&&5!==a.tag);return a?a:null}\nfunction Sd(a,b){var c=a.stateNode;if(!c)return null;var d=la(c);if(!d)return null;c=d[b];a:switch(b){case "onClick":case "onClickCapture":case "onDoubleClick":case "onDoubleClickCapture":case "onMouseDown":case "onMouseDownCapture":case "onMouseMove":case "onMouseMoveCapture":case "onMouseUp":case "onMouseUpCapture":case "onMouseEnter":(d=!d.disabled)||(a=a.type,d=!("button"===a||"input"===a||"select"===a||"textarea"===a));a=!d;break a;default:a=!1}if(a)return null;if(c&&"function"!==typeof c)throw Error(u(231,\nb,typeof c));return c}function Td(a,b,c){if(b=Sd(a,c.dispatchConfig.phasedRegistrationNames[b]))c._dispatchListeners=ic(c._dispatchListeners,b),c._dispatchInstances=ic(c._dispatchInstances,a)}function Ud(a){if(a&&a.dispatchConfig.phasedRegistrationNames){for(var b=a._targetInst,c=[];b;)c.push(b),b=Rd(b);for(b=c.length;0<b--;)Td(c[b],"captured",a);for(b=0;b<c.length;b++)Td(c[b],"bubbled",a)}}\nfunction Vd(a,b,c){a&&c&&c.dispatchConfig.registrationName&&(b=Sd(a,c.dispatchConfig.registrationName))&&(c._dispatchListeners=ic(c._dispatchListeners,b),c._dispatchInstances=ic(c._dispatchInstances,a))}function Wd(a){a&&a.dispatchConfig.registrationName&&Vd(a._targetInst,null,a)}function Xd(a){jc(a,Ud)}var Yd=null,Zd=null,$d=null;\nfunction ae(){if($d)return $d;var a,b=Zd,c=b.length,d,e="value"in Yd?Yd.value:Yd.textContent,f=e.length;for(a=0;a<c&&b[a]===e[a];a++);var g=c-a;for(d=1;d<=g&&b[c-d]===e[f-d];d++);return $d=e.slice(a,1<d?1-d:void 0)}function be(){return!0}function ce(){return!1}\nfunction G(a,b,c,d){this.dispatchConfig=a;this._targetInst=b;this.nativeEvent=c;a=this.constructor.Interface;for(var e in a)a.hasOwnProperty(e)&&((b=a[e])?this[e]=b(c):"target"===e?this.target=d:this[e]=c[e]);this.isDefaultPrevented=(null!=c.defaultPrevented?c.defaultPrevented:!1===c.returnValue)?be:ce;this.isPropagationStopped=ce;return this}\nn(G.prototype,{preventDefault:function(){this.defaultPrevented=!0;var a=this.nativeEvent;a&&(a.preventDefault?a.preventDefault():"unknown"!==typeof a.returnValue&&(a.returnValue=!1),this.isDefaultPrevented=be)},stopPropagation:function(){var a=this.nativeEvent;a&&(a.stopPropagation?a.stopPropagation():"unknown"!==typeof a.cancelBubble&&(a.cancelBubble=!0),this.isPropagationStopped=be)},persist:function(){this.isPersistent=be},isPersistent:ce,destructor:function(){var a=this.constructor.Interface,\nb;for(b in a)this[b]=null;this.nativeEvent=this._targetInst=this.dispatchConfig=null;this.isPropagationStopped=this.isDefaultPrevented=ce;this._dispatchInstances=this._dispatchListeners=null}});G.Interface={type:null,target:null,currentTarget:function(){return null},eventPhase:null,bubbles:null,cancelable:null,timeStamp:function(a){return a.timeStamp||Date.now()},defaultPrevented:null,isTrusted:null};\nG.extend=function(a){function b(){}function c(){return d.apply(this,arguments)}var d=this;b.prototype=d.prototype;var e=new b;n(e,c.prototype);c.prototype=e;c.prototype.constructor=c;c.Interface=n({},d.Interface,a);c.extend=d.extend;de(c);return c};de(G);function ee(a,b,c,d){if(this.eventPool.length){var e=this.eventPool.pop();this.call(e,a,b,c,d);return e}return new this(a,b,c,d)}\nfunction fe(a){if(!(a instanceof this))throw Error(u(279));a.destructor();10>this.eventPool.length&&this.eventPool.push(a)}function de(a){a.eventPool=[];a.getPooled=ee;a.release=fe}var ge=G.extend({data:null}),he=G.extend({data:null}),ie=[9,13,27,32],je=ya&&"CompositionEvent"in window,ke=null;ya&&"documentMode"in document&&(ke=document.documentMode);\nvar le=ya&&"TextEvent"in window&&!ke,me=ya&&(!je||ke&&8<ke&&11>=ke),ne=String.fromCharCode(32),oe={beforeInput:{phasedRegistrationNames:{bubbled:"onBeforeInput",captured:"onBeforeInputCapture"},dependencies:["compositionend","keypress","textInput","paste"]},compositionEnd:{phasedRegistrationNames:{bubbled:"onCompositionEnd",captured:"onCompositionEndCapture"},dependencies:"blur compositionend keydown keypress keyup mousedown".split(" ")},compositionStart:{phasedRegistrationNames:{bubbled:"onCompositionStart",\ncaptured:"onCompositionStartCapture"},dependencies:"blur compositionstart keydown keypress keyup mousedown".split(" ")},compositionUpdate:{phasedRegistrationNames:{bubbled:"onCompositionUpdate",captured:"onCompositionUpdateCapture"},dependencies:"blur compositionupdate keydown keypress keyup mousedown".split(" ")}},pe=!1;\nfunction qe(a,b){switch(a){case "keyup":return-1!==ie.indexOf(b.keyCode);case "keydown":return 229!==b.keyCode;case "keypress":case "mousedown":case "blur":return!0;default:return!1}}function re(a){a=a.detail;return"object"===typeof a&&"data"in a?a.data:null}var se=!1;function te(a,b){switch(a){case "compositionend":return re(b);case "keypress":if(32!==b.which)return null;pe=!0;return ne;case "textInput":return a=b.data,a===ne&&pe?null:a;default:return null}}\nfunction ue(a,b){if(se)return"compositionend"===a||!je&&qe(a,b)?(a=ae(),$d=Zd=Yd=null,se=!1,a):null;switch(a){case "paste":return null;case "keypress":if(!(b.ctrlKey||b.altKey||b.metaKey)||b.ctrlKey&&b.altKey){if(b.char&&1<b.char.length)return b.char;if(b.which)return String.fromCharCode(b.which)}return null;case "compositionend":return me&&"ko"!==b.locale?null:b.data;default:return null}}\nvar ve={eventTypes:oe,extractEvents:function(a,b,c,d){var e;if(je)b:{switch(a){case "compositionstart":var f=oe.compositionStart;break b;case "compositionend":f=oe.compositionEnd;break b;case "compositionupdate":f=oe.compositionUpdate;break b}f=void 0}else se?qe(a,c)&&(f=oe.compositionEnd):"keydown"===a&&229===c.keyCode&&(f=oe.compositionStart);f?(me&&"ko"!==c.locale&&(se||f!==oe.compositionStart?f===oe.compositionEnd&&se&&(e=ae()):(Yd=d,Zd="value"in Yd?Yd.value:Yd.textContent,se=!0)),f=ge.getPooled(f,\nb,c,d),e?f.data=e:(e=re(c),null!==e&&(f.data=e)),Xd(f),e=f):e=null;(a=le?te(a,c):ue(a,c))?(b=he.getPooled(oe.beforeInput,b,c,d),b.data=a,Xd(b)):b=null;return null===e?b:null===b?e:[e,b]}},we={color:!0,date:!0,datetime:!0,"datetime-local":!0,email:!0,month:!0,number:!0,password:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0};function xe(a){var b=a&&a.nodeName&&a.nodeName.toLowerCase();return"input"===b?!!we[a.type]:"textarea"===b?!0:!1}\nvar ye={change:{phasedRegistrationNames:{bubbled:"onChange",captured:"onChangeCapture"},dependencies:"blur change click focus input keydown keyup selectionchange".split(" ")}};function ze(a,b,c){a=G.getPooled(ye.change,a,b,c);a.type="change";Da(c);Xd(a);return a}var Ae=null,Be=null;function Ce(a){mc(a)}function De(a){var b=Pd(a);if(yb(b))return a}function Ee(a,b){if("change"===a)return b}var Fe=!1;ya&&(Fe=oc("input")&&(!document.documentMode||9<document.documentMode));\nfunction Ge(){Ae&&(Ae.detachEvent("onpropertychange",He),Be=Ae=null)}function He(a){if("value"===a.propertyName&&De(Be))if(a=ze(Be,a,nc(a)),Ja)mc(a);else{Ja=!0;try{Fa(Ce,a)}finally{Ja=!1,La()}}}function Ie(a,b,c){"focus"===a?(Ge(),Ae=b,Be=c,Ae.attachEvent("onpropertychange",He)):"blur"===a&&Ge()}function Je(a){if("selectionchange"===a||"keyup"===a||"keydown"===a)return De(Be)}function Ke(a,b){if("click"===a)return De(b)}function Le(a,b){if("input"===a||"change"===a)return De(b)}\nvar Me={eventTypes:ye,_isInputEventSupported:Fe,extractEvents:function(a,b,c,d){var e=b?Pd(b):window,f=e.nodeName&&e.nodeName.toLowerCase();if("select"===f||"input"===f&&"file"===e.type)var g=Ee;else if(xe(e))if(Fe)g=Le;else{g=Je;var h=Ie}else(f=e.nodeName)&&"input"===f.toLowerCase()&&("checkbox"===e.type||"radio"===e.type)&&(g=Ke);if(g&&(g=g(a,b)))return ze(g,c,d);h&&h(a,e,b);"blur"===a&&(a=e._wrapperState)&&a.controlled&&"number"===e.type&&Db(e,"number",e.value)}},Ne=G.extend({view:null,detail:null}),\nOe={Alt:"altKey",Control:"ctrlKey",Meta:"metaKey",Shift:"shiftKey"};function Pe(a){var b=this.nativeEvent;return b.getModifierState?b.getModifierState(a):(a=Oe[a])?!!b[a]:!1}function Qe(){return Pe}\nvar Re=0,Se=0,Te=!1,Ue=!1,Ve=Ne.extend({screenX:null,screenY:null,clientX:null,clientY:null,pageX:null,pageY:null,ctrlKey:null,shiftKey:null,altKey:null,metaKey:null,getModifierState:Qe,button:null,buttons:null,relatedTarget:function(a){return a.relatedTarget||(a.fromElement===a.srcElement?a.toElement:a.fromElement)},movementX:function(a){if("movementX"in a)return a.movementX;var b=Re;Re=a.screenX;return Te?"mousemove"===a.type?a.screenX-b:0:(Te=!0,0)},movementY:function(a){if("movementY"in a)return a.movementY;\nvar b=Se;Se=a.screenY;return Ue?"mousemove"===a.type?a.screenY-b:0:(Ue=!0,0)}}),We=Ve.extend({pointerId:null,width:null,height:null,pressure:null,tangentialPressure:null,tiltX:null,tiltY:null,twist:null,pointerType:null,isPrimary:null}),Xe={mouseEnter:{registrationName:"onMouseEnter",dependencies:["mouseout","mouseover"]},mouseLeave:{registrationName:"onMouseLeave",dependencies:["mouseout","mouseover"]},pointerEnter:{registrationName:"onPointerEnter",dependencies:["pointerout","pointerover"]},pointerLeave:{registrationName:"onPointerLeave",\ndependencies:["pointerout","pointerover"]}},Ye={eventTypes:Xe,extractEvents:function(a,b,c,d,e){var f="mouseover"===a||"pointerover"===a,g="mouseout"===a||"pointerout"===a;if(f&&0===(e&32)&&(c.relatedTarget||c.fromElement)||!g&&!f)return null;f=d.window===d?d:(f=d.ownerDocument)?f.defaultView||f.parentWindow:window;if(g){if(g=b,b=(b=c.relatedTarget||c.toElement)?tc(b):null,null!==b){var h=dc(b);if(b!==h||5!==b.tag&&6!==b.tag)b=null}}else g=null;if(g===b)return null;if("mouseout"===a||"mouseover"===\na){var k=Ve;var l=Xe.mouseLeave;var m=Xe.mouseEnter;var p="mouse"}else if("pointerout"===a||"pointerover"===a)k=We,l=Xe.pointerLeave,m=Xe.pointerEnter,p="pointer";a=null==g?f:Pd(g);f=null==b?f:Pd(b);l=k.getPooled(l,g,c,d);l.type=p+"leave";l.target=a;l.relatedTarget=f;c=k.getPooled(m,b,c,d);c.type=p+"enter";c.target=f;c.relatedTarget=a;d=g;p=b;if(d&&p)a:{k=d;m=p;g=0;for(a=k;a;a=Rd(a))g++;a=0;for(b=m;b;b=Rd(b))a++;for(;0<g-a;)k=Rd(k),g--;for(;0<a-g;)m=Rd(m),a--;for(;g--;){if(k===m||k===m.alternate)break a;\nk=Rd(k);m=Rd(m)}k=null}else k=null;m=k;for(k=[];d&&d!==m;){g=d.alternate;if(null!==g&&g===m)break;k.push(d);d=Rd(d)}for(d=[];p&&p!==m;){g=p.alternate;if(null!==g&&g===m)break;d.push(p);p=Rd(p)}for(p=0;p<k.length;p++)Vd(k[p],"bubbled",l);for(p=d.length;0<p--;)Vd(d[p],"captured",c);return 0===(e&64)?[l]:[l,c]}};function Ze(a,b){return a===b&&(0!==a||1/a===1/b)||a!==a&&b!==b}var $e="function"===typeof Object.is?Object.is:Ze,af=Object.prototype.hasOwnProperty;\nfunction bf(a,b){if($e(a,b))return!0;if("object"!==typeof a||null===a||"object"!==typeof b||null===b)return!1;var c=Object.keys(a),d=Object.keys(b);if(c.length!==d.length)return!1;for(d=0;d<c.length;d++)if(!af.call(b,c[d])||!$e(a[c[d]],b[c[d]]))return!1;return!0}\nvar cf=ya&&"documentMode"in document&&11>=document.documentMode,df={select:{phasedRegistrationNames:{bubbled:"onSelect",captured:"onSelectCapture"},dependencies:"blur contextmenu dragend focus keydown keyup mousedown mouseup selectionchange".split(" ")}},ef=null,ff=null,gf=null,hf=!1;\nfunction jf(a,b){var c=b.window===b?b.document:9===b.nodeType?b:b.ownerDocument;if(hf||null==ef||ef!==td(c))return null;c=ef;"selectionStart"in c&&yd(c)?c={start:c.selectionStart,end:c.selectionEnd}:(c=(c.ownerDocument&&c.ownerDocument.defaultView||window).getSelection(),c={anchorNode:c.anchorNode,anchorOffset:c.anchorOffset,focusNode:c.focusNode,focusOffset:c.focusOffset});return gf&&bf(gf,c)?null:(gf=c,a=G.getPooled(df.select,ff,a,b),a.type="select",a.target=ef,Xd(a),a)}\nvar kf={eventTypes:df,extractEvents:function(a,b,c,d,e,f){e=f||(d.window===d?d.document:9===d.nodeType?d:d.ownerDocument);if(!(f=!e)){a:{e=cc(e);f=wa.onSelect;for(var g=0;g<f.length;g++)if(!e.has(f[g])){e=!1;break a}e=!0}f=!e}if(f)return null;e=b?Pd(b):window;switch(a){case "focus":if(xe(e)||"true"===e.contentEditable)ef=e,ff=b,gf=null;break;case "blur":gf=ff=ef=null;break;case "mousedown":hf=!0;break;case "contextmenu":case "mouseup":case "dragend":return hf=!1,jf(c,d);case "selectionchange":if(cf)break;\ncase "keydown":case "keyup":return jf(c,d)}return null}},lf=G.extend({animationName:null,elapsedTime:null,pseudoElement:null}),mf=G.extend({clipboardData:function(a){return"clipboardData"in a?a.clipboardData:window.clipboardData}}),nf=Ne.extend({relatedTarget:null});function of(a){var b=a.keyCode;"charCode"in a?(a=a.charCode,0===a&&13===b&&(a=13)):a=b;10===a&&(a=13);return 32<=a||13===a?a:0}\nvar pf={Esc:"Escape",Spacebar:" ",Left:"ArrowLeft",Up:"ArrowUp",Right:"ArrowRight",Down:"ArrowDown",Del:"Delete",Win:"OS",Menu:"ContextMenu",Apps:"ContextMenu",Scroll:"ScrollLock",MozPrintableKey:"Unidentified"},qf={8:"Backspace",9:"Tab",12:"Clear",13:"Enter",16:"Shift",17:"Control",18:"Alt",19:"Pause",20:"CapsLock",27:"Escape",32:" ",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"ArrowLeft",38:"ArrowUp",39:"ArrowRight",40:"ArrowDown",45:"Insert",46:"Delete",112:"F1",113:"F2",114:"F3",115:"F4",\n116:"F5",117:"F6",118:"F7",119:"F8",120:"F9",121:"F10",122:"F11",123:"F12",144:"NumLock",145:"ScrollLock",224:"Meta"},rf=Ne.extend({key:function(a){if(a.key){var b=pf[a.key]||a.key;if("Unidentified"!==b)return b}return"keypress"===a.type?(a=of(a),13===a?"Enter":String.fromCharCode(a)):"keydown"===a.type||"keyup"===a.type?qf[a.keyCode]||"Unidentified":""},location:null,ctrlKey:null,shiftKey:null,altKey:null,metaKey:null,repeat:null,locale:null,getModifierState:Qe,charCode:function(a){return"keypress"===\na.type?of(a):0},keyCode:function(a){return"keydown"===a.type||"keyup"===a.type?a.keyCode:0},which:function(a){return"keypress"===a.type?of(a):"keydown"===a.type||"keyup"===a.type?a.keyCode:0}}),sf=Ve.extend({dataTransfer:null}),tf=Ne.extend({touches:null,targetTouches:null,changedTouches:null,altKey:null,metaKey:null,ctrlKey:null,shiftKey:null,getModifierState:Qe}),uf=G.extend({propertyName:null,elapsedTime:null,pseudoElement:null}),vf=Ve.extend({deltaX:function(a){return"deltaX"in a?a.deltaX:"wheelDeltaX"in\na?-a.wheelDeltaX:0},deltaY:function(a){return"deltaY"in a?a.deltaY:"wheelDeltaY"in a?-a.wheelDeltaY:"wheelDelta"in a?-a.wheelDelta:0},deltaZ:null,deltaMode:null}),wf={eventTypes:Wc,extractEvents:function(a,b,c,d){var e=Yc.get(a);if(!e)return null;switch(a){case "keypress":if(0===of(c))return null;case "keydown":case "keyup":a=rf;break;case "blur":case "focus":a=nf;break;case "click":if(2===c.button)return null;case "auxclick":case "dblclick":case "mousedown":case "mousemove":case "mouseup":case "mouseout":case "mouseover":case "contextmenu":a=\nVe;break;case "drag":case "dragend":case "dragenter":case "dragexit":case "dragleave":case "dragover":case "dragstart":case "drop":a=sf;break;case "touchcancel":case "touchend":case "touchmove":case "touchstart":a=tf;break;case Xb:case Yb:case Zb:a=lf;break;case $b:a=uf;break;case "scroll":a=Ne;break;case "wheel":a=vf;break;case "copy":case "cut":case "paste":a=mf;break;case "gotpointercapture":case "lostpointercapture":case "pointercancel":case "pointerdown":case "pointermove":case "pointerout":case "pointerover":case "pointerup":a=\nWe;break;default:a=G}b=a.getPooled(e,b,c,d);Xd(b);return b}};if(pa)throw Error(u(101));pa=Array.prototype.slice.call("ResponderEventPlugin SimpleEventPlugin EnterLeaveEventPlugin ChangeEventPlugin SelectEventPlugin BeforeInputEventPlugin".split(" "));ra();var xf=Nc;la=Qd;ma=xf;na=Pd;xa({SimpleEventPlugin:wf,EnterLeaveEventPlugin:Ye,ChangeEventPlugin:Me,SelectEventPlugin:kf,BeforeInputEventPlugin:ve});var yf=[],zf=-1;function H(a){0>zf||(a.current=yf[zf],yf[zf]=null,zf--)}\nfunction I(a,b){zf++;yf[zf]=a.current;a.current=b}var Af={},J={current:Af},K={current:!1},Bf=Af;function Cf(a,b){var c=a.type.contextTypes;if(!c)return Af;var d=a.stateNode;if(d&&d.__reactInternalMemoizedUnmaskedChildContext===b)return d.__reactInternalMemoizedMaskedChildContext;var e={},f;for(f in c)e[f]=b[f];d&&(a=a.stateNode,a.__reactInternalMemoizedUnmaskedChildContext=b,a.__reactInternalMemoizedMaskedChildContext=e);return e}function L(a){a=a.childContextTypes;return null!==a&&void 0!==a}\nfunction Df(){H(K);H(J)}function Ef(a,b,c){if(J.current!==Af)throw Error(u(168));I(J,b);I(K,c)}function Ff(a,b,c){var d=a.stateNode;a=b.childContextTypes;if("function"!==typeof d.getChildContext)return c;d=d.getChildContext();for(var e in d)if(!(e in a))throw Error(u(108,pb(b)||"Unknown",e));return n({},c,{},d)}function Gf(a){a=(a=a.stateNode)&&a.__reactInternalMemoizedMergedChildContext||Af;Bf=J.current;I(J,a);I(K,K.current);return!0}\nfunction Hf(a,b,c){var d=a.stateNode;if(!d)throw Error(u(169));c?(a=Ff(a,b,Bf),d.__reactInternalMemoizedMergedChildContext=a,H(K),H(J),I(J,a)):H(K);I(K,c)}\nvar If=r.unstable_runWithPriority,Jf=r.unstable_scheduleCallback,Kf=r.unstable_cancelCallback,Lf=r.unstable_requestPaint,Mf=r.unstable_now,Nf=r.unstable_getCurrentPriorityLevel,Of=r.unstable_ImmediatePriority,Pf=r.unstable_UserBlockingPriority,Qf=r.unstable_NormalPriority,Rf=r.unstable_LowPriority,Sf=r.unstable_IdlePriority,Tf={},Uf=r.unstable_shouldYield,Vf=void 0!==Lf?Lf:function(){},Wf=null,Xf=null,Yf=!1,Zf=Mf(),$f=1E4>Zf?Mf:function(){return Mf()-Zf};\nfunction ag(){switch(Nf()){case Of:return 99;case Pf:return 98;case Qf:return 97;case Rf:return 96;case Sf:return 95;default:throw Error(u(332));}}function bg(a){switch(a){case 99:return Of;case 98:return Pf;case 97:return Qf;case 96:return Rf;case 95:return Sf;default:throw Error(u(332));}}function cg(a,b){a=bg(a);return If(a,b)}function dg(a,b,c){a=bg(a);return Jf(a,b,c)}function eg(a){null===Wf?(Wf=[a],Xf=Jf(Of,fg)):Wf.push(a);return Tf}function gg(){if(null!==Xf){var a=Xf;Xf=null;Kf(a)}fg()}\nfunction fg(){if(!Yf&&null!==Wf){Yf=!0;var a=0;try{var b=Wf;cg(99,function(){for(;a<b.length;a++){var c=b[a];do c=c(!0);while(null!==c)}});Wf=null}catch(c){throw null!==Wf&&(Wf=Wf.slice(a+1)),Jf(Of,gg),c;}finally{Yf=!1}}}function hg(a,b,c){c/=10;return 1073741821-(((1073741821-a+b/10)/c|0)+1)*c}function ig(a,b){if(a&&a.defaultProps){b=n({},b);a=a.defaultProps;for(var c in a)void 0===b[c]&&(b[c]=a[c])}return b}var jg={current:null},kg=null,lg=null,mg=null;function ng(){mg=lg=kg=null}\nfunction og(a){var b=jg.current;H(jg);a.type._context._currentValue=b}function pg(a,b){for(;null!==a;){var c=a.alternate;if(a.childExpirationTime<b)a.childExpirationTime=b,null!==c&&c.childExpirationTime<b&&(c.childExpirationTime=b);else if(null!==c&&c.childExpirationTime<b)c.childExpirationTime=b;else break;a=a.return}}function qg(a,b){kg=a;mg=lg=null;a=a.dependencies;null!==a&&null!==a.firstContext&&(a.expirationTime>=b&&(rg=!0),a.firstContext=null)}\nfunction sg(a,b){if(mg!==a&&!1!==b&&0!==b){if("number"!==typeof b||1073741823===b)mg=a,b=1073741823;b={context:a,observedBits:b,next:null};if(null===lg){if(null===kg)throw Error(u(308));lg=b;kg.dependencies={expirationTime:0,firstContext:b,responders:null}}else lg=lg.next=b}return a._currentValue}var tg=!1;function ug(a){a.updateQueue={baseState:a.memoizedState,baseQueue:null,shared:{pending:null},effects:null}}\nfunction vg(a,b){a=a.updateQueue;b.updateQueue===a&&(b.updateQueue={baseState:a.baseState,baseQueue:a.baseQueue,shared:a.shared,effects:a.effects})}function wg(a,b){a={expirationTime:a,suspenseConfig:b,tag:0,payload:null,callback:null,next:null};return a.next=a}function xg(a,b){a=a.updateQueue;if(null!==a){a=a.shared;var c=a.pending;null===c?b.next=b:(b.next=c.next,c.next=b);a.pending=b}}\nfunction yg(a,b){var c=a.alternate;null!==c&&vg(c,a);a=a.updateQueue;c=a.baseQueue;null===c?(a.baseQueue=b.next=b,b.next=b):(b.next=c.next,c.next=b)}\nfunction zg(a,b,c,d){var e=a.updateQueue;tg=!1;var f=e.baseQueue,g=e.shared.pending;if(null!==g){if(null!==f){var h=f.next;f.next=g.next;g.next=h}f=g;e.shared.pending=null;h=a.alternate;null!==h&&(h=h.updateQueue,null!==h&&(h.baseQueue=g))}if(null!==f){h=f.next;var k=e.baseState,l=0,m=null,p=null,x=null;if(null!==h){var z=h;do{g=z.expirationTime;if(g<d){var ca={expirationTime:z.expirationTime,suspenseConfig:z.suspenseConfig,tag:z.tag,payload:z.payload,callback:z.callback,next:null};null===x?(p=x=\nca,m=k):x=x.next=ca;g>l&&(l=g)}else{null!==x&&(x=x.next={expirationTime:1073741823,suspenseConfig:z.suspenseConfig,tag:z.tag,payload:z.payload,callback:z.callback,next:null});Ag(g,z.suspenseConfig);a:{var D=a,t=z;g=b;ca=c;switch(t.tag){case 1:D=t.payload;if("function"===typeof D){k=D.call(ca,k,g);break a}k=D;break a;case 3:D.effectTag=D.effectTag&-4097|64;case 0:D=t.payload;g="function"===typeof D?D.call(ca,k,g):D;if(null===g||void 0===g)break a;k=n({},k,g);break a;case 2:tg=!0}}null!==z.callback&&\n(a.effectTag|=32,g=e.effects,null===g?e.effects=[z]:g.push(z))}z=z.next;if(null===z||z===h)if(g=e.shared.pending,null===g)break;else z=f.next=g.next,g.next=h,e.baseQueue=f=g,e.shared.pending=null}while(1)}null===x?m=k:x.next=p;e.baseState=m;e.baseQueue=x;Bg(l);a.expirationTime=l;a.memoizedState=k}}\nfunction Cg(a,b,c){a=b.effects;b.effects=null;if(null!==a)for(b=0;b<a.length;b++){var d=a[b],e=d.callback;if(null!==e){d.callback=null;d=e;e=c;if("function"!==typeof d)throw Error(u(191,d));d.call(e)}}}var Dg=Wa.ReactCurrentBatchConfig,Eg=(new aa.Component).refs;function Fg(a,b,c,d){b=a.memoizedState;c=c(d,b);c=null===c||void 0===c?b:n({},b,c);a.memoizedState=c;0===a.expirationTime&&(a.updateQueue.baseState=c)}\nvar Jg={isMounted:function(a){return(a=a._reactInternalFiber)?dc(a)===a:!1},enqueueSetState:function(a,b,c){a=a._reactInternalFiber;var d=Gg(),e=Dg.suspense;d=Hg(d,a,e);e=wg(d,e);e.payload=b;void 0!==c&&null!==c&&(e.callback=c);xg(a,e);Ig(a,d)},enqueueReplaceState:function(a,b,c){a=a._reactInternalFiber;var d=Gg(),e=Dg.suspense;d=Hg(d,a,e);e=wg(d,e);e.tag=1;e.payload=b;void 0!==c&&null!==c&&(e.callback=c);xg(a,e);Ig(a,d)},enqueueForceUpdate:function(a,b){a=a._reactInternalFiber;var c=Gg(),d=Dg.suspense;\nc=Hg(c,a,d);d=wg(c,d);d.tag=2;void 0!==b&&null!==b&&(d.callback=b);xg(a,d);Ig(a,c)}};function Kg(a,b,c,d,e,f,g){a=a.stateNode;return"function"===typeof a.shouldComponentUpdate?a.shouldComponentUpdate(d,f,g):b.prototype&&b.prototype.isPureReactComponent?!bf(c,d)||!bf(e,f):!0}\nfunction Lg(a,b,c){var d=!1,e=Af;var f=b.contextType;"object"===typeof f&&null!==f?f=sg(f):(e=L(b)?Bf:J.current,d=b.contextTypes,f=(d=null!==d&&void 0!==d)?Cf(a,e):Af);b=new b(c,f);a.memoizedState=null!==b.state&&void 0!==b.state?b.state:null;b.updater=Jg;a.stateNode=b;b._reactInternalFiber=a;d&&(a=a.stateNode,a.__reactInternalMemoizedUnmaskedChildContext=e,a.__reactInternalMemoizedMaskedChildContext=f);return b}\nfunction Mg(a,b,c,d){a=b.state;"function"===typeof b.componentWillReceiveProps&&b.componentWillReceiveProps(c,d);"function"===typeof b.UNSAFE_componentWillReceiveProps&&b.UNSAFE_componentWillReceiveProps(c,d);b.state!==a&&Jg.enqueueReplaceState(b,b.state,null)}\nfunction Ng(a,b,c,d){var e=a.stateNode;e.props=c;e.state=a.memoizedState;e.refs=Eg;ug(a);var f=b.contextType;"object"===typeof f&&null!==f?e.context=sg(f):(f=L(b)?Bf:J.current,e.context=Cf(a,f));zg(a,c,e,d);e.state=a.memoizedState;f=b.getDerivedStateFromProps;"function"===typeof f&&(Fg(a,b,f,c),e.state=a.memoizedState);"function"===typeof b.getDerivedStateFromProps||"function"===typeof e.getSnapshotBeforeUpdate||"function"!==typeof e.UNSAFE_componentWillMount&&"function"!==typeof e.componentWillMount||\n(b=e.state,"function"===typeof e.componentWillMount&&e.componentWillMount(),"function"===typeof e.UNSAFE_componentWillMount&&e.UNSAFE_componentWillMount(),b!==e.state&&Jg.enqueueReplaceState(e,e.state,null),zg(a,c,e,d),e.state=a.memoizedState);"function"===typeof e.componentDidMount&&(a.effectTag|=4)}var Og=Array.isArray;\nfunction Pg(a,b,c){a=c.ref;if(null!==a&&"function"!==typeof a&&"object"!==typeof a){if(c._owner){c=c._owner;if(c){if(1!==c.tag)throw Error(u(309));var d=c.stateNode}if(!d)throw Error(u(147,a));var e=""+a;if(null!==b&&null!==b.ref&&"function"===typeof b.ref&&b.ref._stringRef===e)return b.ref;b=function(a){var b=d.refs;b===Eg&&(b=d.refs={});null===a?delete b[e]:b[e]=a};b._stringRef=e;return b}if("string"!==typeof a)throw Error(u(284));if(!c._owner)throw Error(u(290,a));}return a}\nfunction Qg(a,b){if("textarea"!==a.type)throw Error(u(31,"[object Object]"===Object.prototype.toString.call(b)?"object with keys {"+Object.keys(b).join(", ")+"}":b,""));}\nfunction Rg(a){function b(b,c){if(a){var d=b.lastEffect;null!==d?(d.nextEffect=c,b.lastEffect=c):b.firstEffect=b.lastEffect=c;c.nextEffect=null;c.effectTag=8}}function c(c,d){if(!a)return null;for(;null!==d;)b(c,d),d=d.sibling;return null}function d(a,b){for(a=new Map;null!==b;)null!==b.key?a.set(b.key,b):a.set(b.index,b),b=b.sibling;return a}function e(a,b){a=Sg(a,b);a.index=0;a.sibling=null;return a}function f(b,c,d){b.index=d;if(!a)return c;d=b.alternate;if(null!==d)return d=d.index,d<c?(b.effectTag=\n2,c):d;b.effectTag=2;return c}function g(b){a&&null===b.alternate&&(b.effectTag=2);return b}function h(a,b,c,d){if(null===b||6!==b.tag)return b=Tg(c,a.mode,d),b.return=a,b;b=e(b,c);b.return=a;return b}function k(a,b,c,d){if(null!==b&&b.elementType===c.type)return d=e(b,c.props),d.ref=Pg(a,b,c),d.return=a,d;d=Ug(c.type,c.key,c.props,null,a.mode,d);d.ref=Pg(a,b,c);d.return=a;return d}function l(a,b,c,d){if(null===b||4!==b.tag||b.stateNode.containerInfo!==c.containerInfo||b.stateNode.implementation!==\nc.implementation)return b=Vg(c,a.mode,d),b.return=a,b;b=e(b,c.children||[]);b.return=a;return b}function m(a,b,c,d,f){if(null===b||7!==b.tag)return b=Wg(c,a.mode,d,f),b.return=a,b;b=e(b,c);b.return=a;return b}function p(a,b,c){if("string"===typeof b||"number"===typeof b)return b=Tg(""+b,a.mode,c),b.return=a,b;if("object"===typeof b&&null!==b){switch(b.$$typeof){case Za:return c=Ug(b.type,b.key,b.props,null,a.mode,c),c.ref=Pg(a,null,b),c.return=a,c;case $a:return b=Vg(b,a.mode,c),b.return=a,b}if(Og(b)||\nnb(b))return b=Wg(b,a.mode,c,null),b.return=a,b;Qg(a,b)}return null}function x(a,b,c,d){var e=null!==b?b.key:null;if("string"===typeof c||"number"===typeof c)return null!==e?null:h(a,b,""+c,d);if("object"===typeof c&&null!==c){switch(c.$$typeof){case Za:return c.key===e?c.type===ab?m(a,b,c.props.children,d,e):k(a,b,c,d):null;case $a:return c.key===e?l(a,b,c,d):null}if(Og(c)||nb(c))return null!==e?null:m(a,b,c,d,null);Qg(a,c)}return null}function z(a,b,c,d,e){if("string"===typeof d||"number"===typeof d)return a=\na.get(c)||null,h(b,a,""+d,e);if("object"===typeof d&&null!==d){switch(d.$$typeof){case Za:return a=a.get(null===d.key?c:d.key)||null,d.type===ab?m(b,a,d.props.children,e,d.key):k(b,a,d,e);case $a:return a=a.get(null===d.key?c:d.key)||null,l(b,a,d,e)}if(Og(d)||nb(d))return a=a.get(c)||null,m(b,a,d,e,null);Qg(b,d)}return null}function ca(e,g,h,k){for(var l=null,t=null,m=g,y=g=0,A=null;null!==m&&y<h.length;y++){m.index>y?(A=m,m=null):A=m.sibling;var q=x(e,m,h[y],k);if(null===q){null===m&&(m=A);break}a&&\nm&&null===q.alternate&&b(e,m);g=f(q,g,y);null===t?l=q:t.sibling=q;t=q;m=A}if(y===h.length)return c(e,m),l;if(null===m){for(;y<h.length;y++)m=p(e,h[y],k),null!==m&&(g=f(m,g,y),null===t?l=m:t.sibling=m,t=m);return l}for(m=d(e,m);y<h.length;y++)A=z(m,e,y,h[y],k),null!==A&&(a&&null!==A.alternate&&m.delete(null===A.key?y:A.key),g=f(A,g,y),null===t?l=A:t.sibling=A,t=A);a&&m.forEach(function(a){return b(e,a)});return l}function D(e,g,h,l){var k=nb(h);if("function"!==typeof k)throw Error(u(150));h=k.call(h);\nif(null==h)throw Error(u(151));for(var m=k=null,t=g,y=g=0,A=null,q=h.next();null!==t&&!q.done;y++,q=h.next()){t.index>y?(A=t,t=null):A=t.sibling;var D=x(e,t,q.value,l);if(null===D){null===t&&(t=A);break}a&&t&&null===D.alternate&&b(e,t);g=f(D,g,y);null===m?k=D:m.sibling=D;m=D;t=A}if(q.done)return c(e,t),k;if(null===t){for(;!q.done;y++,q=h.next())q=p(e,q.value,l),null!==q&&(g=f(q,g,y),null===m?k=q:m.sibling=q,m=q);return k}for(t=d(e,t);!q.done;y++,q=h.next())q=z(t,e,y,q.value,l),null!==q&&(a&&null!==\nq.alternate&&t.delete(null===q.key?y:q.key),g=f(q,g,y),null===m?k=q:m.sibling=q,m=q);a&&t.forEach(function(a){return b(e,a)});return k}return function(a,d,f,h){var k="object"===typeof f&&null!==f&&f.type===ab&&null===f.key;k&&(f=f.props.children);var l="object"===typeof f&&null!==f;if(l)switch(f.$$typeof){case Za:a:{l=f.key;for(k=d;null!==k;){if(k.key===l){switch(k.tag){case 7:if(f.type===ab){c(a,k.sibling);d=e(k,f.props.children);d.return=a;a=d;break a}break;default:if(k.elementType===f.type){c(a,\nk.sibling);d=e(k,f.props);d.ref=Pg(a,k,f);d.return=a;a=d;break a}}c(a,k);break}else b(a,k);k=k.sibling}f.type===ab?(d=Wg(f.props.children,a.mode,h,f.key),d.return=a,a=d):(h=Ug(f.type,f.key,f.props,null,a.mode,h),h.ref=Pg(a,d,f),h.return=a,a=h)}return g(a);case $a:a:{for(k=f.key;null!==d;){if(d.key===k)if(4===d.tag&&d.stateNode.containerInfo===f.containerInfo&&d.stateNode.implementation===f.implementation){c(a,d.sibling);d=e(d,f.children||[]);d.return=a;a=d;break a}else{c(a,d);break}else b(a,d);d=\nd.sibling}d=Vg(f,a.mode,h);d.return=a;a=d}return g(a)}if("string"===typeof f||"number"===typeof f)return f=""+f,null!==d&&6===d.tag?(c(a,d.sibling),d=e(d,f),d.return=a,a=d):(c(a,d),d=Tg(f,a.mode,h),d.return=a,a=d),g(a);if(Og(f))return ca(a,d,f,h);if(nb(f))return D(a,d,f,h);l&&Qg(a,f);if("undefined"===typeof f&&!k)switch(a.tag){case 1:case 0:throw a=a.type,Error(u(152,a.displayName||a.name||"Component"));}return c(a,d)}}var Xg=Rg(!0),Yg=Rg(!1),Zg={},$g={current:Zg},ah={current:Zg},bh={current:Zg};\nfunction ch(a){if(a===Zg)throw Error(u(174));return a}function dh(a,b){I(bh,b);I(ah,a);I($g,Zg);a=b.nodeType;switch(a){case 9:case 11:b=(b=b.documentElement)?b.namespaceURI:Ob(null,"");break;default:a=8===a?b.parentNode:b,b=a.namespaceURI||null,a=a.tagName,b=Ob(b,a)}H($g);I($g,b)}function eh(){H($g);H(ah);H(bh)}function fh(a){ch(bh.current);var b=ch($g.current);var c=Ob(b,a.type);b!==c&&(I(ah,a),I($g,c))}function gh(a){ah.current===a&&(H($g),H(ah))}var M={current:0};\nfunction hh(a){for(var b=a;null!==b;){if(13===b.tag){var c=b.memoizedState;if(null!==c&&(c=c.dehydrated,null===c||c.data===Bd||c.data===Cd))return b}else if(19===b.tag&&void 0!==b.memoizedProps.revealOrder){if(0!==(b.effectTag&64))return b}else if(null!==b.child){b.child.return=b;b=b.child;continue}if(b===a)break;for(;null===b.sibling;){if(null===b.return||b.return===a)return null;b=b.return}b.sibling.return=b.return;b=b.sibling}return null}function ih(a,b){return{responder:a,props:b}}\nvar jh=Wa.ReactCurrentDispatcher,kh=Wa.ReactCurrentBatchConfig,lh=0,N=null,O=null,P=null,mh=!1;function Q(){throw Error(u(321));}function nh(a,b){if(null===b)return!1;for(var c=0;c<b.length&&c<a.length;c++)if(!$e(a[c],b[c]))return!1;return!0}\nfunction oh(a,b,c,d,e,f){lh=f;N=b;b.memoizedState=null;b.updateQueue=null;b.expirationTime=0;jh.current=null===a||null===a.memoizedState?ph:qh;a=c(d,e);if(b.expirationTime===lh){f=0;do{b.expirationTime=0;if(!(25>f))throw Error(u(301));f+=1;P=O=null;b.updateQueue=null;jh.current=rh;a=c(d,e)}while(b.expirationTime===lh)}jh.current=sh;b=null!==O&&null!==O.next;lh=0;P=O=N=null;mh=!1;if(b)throw Error(u(300));return a}\nfunction th(){var a={memoizedState:null,baseState:null,baseQueue:null,queue:null,next:null};null===P?N.memoizedState=P=a:P=P.next=a;return P}function uh(){if(null===O){var a=N.alternate;a=null!==a?a.memoizedState:null}else a=O.next;var b=null===P?N.memoizedState:P.next;if(null!==b)P=b,O=a;else{if(null===a)throw Error(u(310));O=a;a={memoizedState:O.memoizedState,baseState:O.baseState,baseQueue:O.baseQueue,queue:O.queue,next:null};null===P?N.memoizedState=P=a:P=P.next=a}return P}\nfunction vh(a,b){return"function"===typeof b?b(a):b}\nfunction wh(a){var b=uh(),c=b.queue;if(null===c)throw Error(u(311));c.lastRenderedReducer=a;var d=O,e=d.baseQueue,f=c.pending;if(null!==f){if(null!==e){var g=e.next;e.next=f.next;f.next=g}d.baseQueue=e=f;c.pending=null}if(null!==e){e=e.next;d=d.baseState;var h=g=f=null,k=e;do{var l=k.expirationTime;if(l<lh){var m={expirationTime:k.expirationTime,suspenseConfig:k.suspenseConfig,action:k.action,eagerReducer:k.eagerReducer,eagerState:k.eagerState,next:null};null===h?(g=h=m,f=d):h=h.next=m;l>N.expirationTime&&\n(N.expirationTime=l,Bg(l))}else null!==h&&(h=h.next={expirationTime:1073741823,suspenseConfig:k.suspenseConfig,action:k.action,eagerReducer:k.eagerReducer,eagerState:k.eagerState,next:null}),Ag(l,k.suspenseConfig),d=k.eagerReducer===a?k.eagerState:a(d,k.action);k=k.next}while(null!==k&&k!==e);null===h?f=d:h.next=g;$e(d,b.memoizedState)||(rg=!0);b.memoizedState=d;b.baseState=f;b.baseQueue=h;c.lastRenderedState=d}return[b.memoizedState,c.dispatch]}\nfunction xh(a){var b=uh(),c=b.queue;if(null===c)throw Error(u(311));c.lastRenderedReducer=a;var d=c.dispatch,e=c.pending,f=b.memoizedState;if(null!==e){c.pending=null;var g=e=e.next;do f=a(f,g.action),g=g.next;while(g!==e);$e(f,b.memoizedState)||(rg=!0);b.memoizedState=f;null===b.baseQueue&&(b.baseState=f);c.lastRenderedState=f}return[f,d]}\nfunction yh(a){var b=th();"function"===typeof a&&(a=a());b.memoizedState=b.baseState=a;a=b.queue={pending:null,dispatch:null,lastRenderedReducer:vh,lastRenderedState:a};a=a.dispatch=zh.bind(null,N,a);return[b.memoizedState,a]}function Ah(a,b,c,d){a={tag:a,create:b,destroy:c,deps:d,next:null};b=N.updateQueue;null===b?(b={lastEffect:null},N.updateQueue=b,b.lastEffect=a.next=a):(c=b.lastEffect,null===c?b.lastEffect=a.next=a:(d=c.next,c.next=a,a.next=d,b.lastEffect=a));return a}\nfunction Bh(){return uh().memoizedState}function Ch(a,b,c,d){var e=th();N.effectTag|=a;e.memoizedState=Ah(1|b,c,void 0,void 0===d?null:d)}function Dh(a,b,c,d){var e=uh();d=void 0===d?null:d;var f=void 0;if(null!==O){var g=O.memoizedState;f=g.destroy;if(null!==d&&nh(d,g.deps)){Ah(b,c,f,d);return}}N.effectTag|=a;e.memoizedState=Ah(1|b,c,f,d)}function Eh(a,b){return Ch(516,4,a,b)}function Fh(a,b){return Dh(516,4,a,b)}function Gh(a,b){return Dh(4,2,a,b)}\nfunction Hh(a,b){if("function"===typeof b)return a=a(),b(a),function(){b(null)};if(null!==b&&void 0!==b)return a=a(),b.current=a,function(){b.current=null}}function Ih(a,b,c){c=null!==c&&void 0!==c?c.concat([a]):null;return Dh(4,2,Hh.bind(null,b,a),c)}function Jh(){}function Kh(a,b){th().memoizedState=[a,void 0===b?null:b];return a}function Lh(a,b){var c=uh();b=void 0===b?null:b;var d=c.memoizedState;if(null!==d&&null!==b&&nh(b,d[1]))return d[0];c.memoizedState=[a,b];return a}\nfunction Mh(a,b){var c=uh();b=void 0===b?null:b;var d=c.memoizedState;if(null!==d&&null!==b&&nh(b,d[1]))return d[0];a=a();c.memoizedState=[a,b];return a}function Nh(a,b,c){var d=ag();cg(98>d?98:d,function(){a(!0)});cg(97<d?97:d,function(){var d=kh.suspense;kh.suspense=void 0===b?null:b;try{a(!1),c()}finally{kh.suspense=d}})}\nfunction zh(a,b,c){var d=Gg(),e=Dg.suspense;d=Hg(d,a,e);e={expirationTime:d,suspenseConfig:e,action:c,eagerReducer:null,eagerState:null,next:null};var f=b.pending;null===f?e.next=e:(e.next=f.next,f.next=e);b.pending=e;f=a.alternate;if(a===N||null!==f&&f===N)mh=!0,e.expirationTime=lh,N.expirationTime=lh;else{if(0===a.expirationTime&&(null===f||0===f.expirationTime)&&(f=b.lastRenderedReducer,null!==f))try{var g=b.lastRenderedState,h=f(g,c);e.eagerReducer=f;e.eagerState=h;if($e(h,g))return}catch(k){}finally{}Ig(a,\nd)}}\nvar sh={readContext:sg,useCallback:Q,useContext:Q,useEffect:Q,useImperativeHandle:Q,useLayoutEffect:Q,useMemo:Q,useReducer:Q,useRef:Q,useState:Q,useDebugValue:Q,useResponder:Q,useDeferredValue:Q,useTransition:Q},ph={readContext:sg,useCallback:Kh,useContext:sg,useEffect:Eh,useImperativeHandle:function(a,b,c){c=null!==c&&void 0!==c?c.concat([a]):null;return Ch(4,2,Hh.bind(null,b,a),c)},useLayoutEffect:function(a,b){return Ch(4,2,a,b)},useMemo:function(a,b){var c=th();b=void 0===b?null:b;a=a();c.memoizedState=[a,\nb];return a},useReducer:function(a,b,c){var d=th();b=void 0!==c?c(b):b;d.memoizedState=d.baseState=b;a=d.queue={pending:null,dispatch:null,lastRenderedReducer:a,lastRenderedState:b};a=a.dispatch=zh.bind(null,N,a);return[d.memoizedState,a]},useRef:function(a){var b=th();a={current:a};return b.memoizedState=a},useState:yh,useDebugValue:Jh,useResponder:ih,useDeferredValue:function(a,b){var c=yh(a),d=c[0],e=c[1];Eh(function(){var c=kh.suspense;kh.suspense=void 0===b?null:b;try{e(a)}finally{kh.suspense=\nc}},[a,b]);return d},useTransition:function(a){var b=yh(!1),c=b[0];b=b[1];return[Kh(Nh.bind(null,b,a),[b,a]),c]}},qh={readContext:sg,useCallback:Lh,useContext:sg,useEffect:Fh,useImperativeHandle:Ih,useLayoutEffect:Gh,useMemo:Mh,useReducer:wh,useRef:Bh,useState:function(){return wh(vh)},useDebugValue:Jh,useResponder:ih,useDeferredValue:function(a,b){var c=wh(vh),d=c[0],e=c[1];Fh(function(){var c=kh.suspense;kh.suspense=void 0===b?null:b;try{e(a)}finally{kh.suspense=c}},[a,b]);return d},useTransition:function(a){var b=\nwh(vh),c=b[0];b=b[1];return[Lh(Nh.bind(null,b,a),[b,a]),c]}},rh={readContext:sg,useCallback:Lh,useContext:sg,useEffect:Fh,useImperativeHandle:Ih,useLayoutEffect:Gh,useMemo:Mh,useReducer:xh,useRef:Bh,useState:function(){return xh(vh)},useDebugValue:Jh,useResponder:ih,useDeferredValue:function(a,b){var c=xh(vh),d=c[0],e=c[1];Fh(function(){var c=kh.suspense;kh.suspense=void 0===b?null:b;try{e(a)}finally{kh.suspense=c}},[a,b]);return d},useTransition:function(a){var b=xh(vh),c=b[0];b=b[1];return[Lh(Nh.bind(null,\nb,a),[b,a]),c]}},Oh=null,Ph=null,Qh=!1;function Rh(a,b){var c=Sh(5,null,null,0);c.elementType="DELETED";c.type="DELETED";c.stateNode=b;c.return=a;c.effectTag=8;null!==a.lastEffect?(a.lastEffect.nextEffect=c,a.lastEffect=c):a.firstEffect=a.lastEffect=c}\nfunction Th(a,b){switch(a.tag){case 5:var c=a.type;b=1!==b.nodeType||c.toLowerCase()!==b.nodeName.toLowerCase()?null:b;return null!==b?(a.stateNode=b,!0):!1;case 6:return b=""===a.pendingProps||3!==b.nodeType?null:b,null!==b?(a.stateNode=b,!0):!1;case 13:return!1;default:return!1}}\nfunction Uh(a){if(Qh){var b=Ph;if(b){var c=b;if(!Th(a,b)){b=Jd(c.nextSibling);if(!b||!Th(a,b)){a.effectTag=a.effectTag&-1025|2;Qh=!1;Oh=a;return}Rh(Oh,c)}Oh=a;Ph=Jd(b.firstChild)}else a.effectTag=a.effectTag&-1025|2,Qh=!1,Oh=a}}function Vh(a){for(a=a.return;null!==a&&5!==a.tag&&3!==a.tag&&13!==a.tag;)a=a.return;Oh=a}\nfunction Wh(a){if(a!==Oh)return!1;if(!Qh)return Vh(a),Qh=!0,!1;var b=a.type;if(5!==a.tag||"head"!==b&&"body"!==b&&!Gd(b,a.memoizedProps))for(b=Ph;b;)Rh(a,b),b=Jd(b.nextSibling);Vh(a);if(13===a.tag){a=a.memoizedState;a=null!==a?a.dehydrated:null;if(!a)throw Error(u(317));a:{a=a.nextSibling;for(b=0;a;){if(8===a.nodeType){var c=a.data;if(c===Ad){if(0===b){Ph=Jd(a.nextSibling);break a}b--}else c!==zd&&c!==Cd&&c!==Bd||b++}a=a.nextSibling}Ph=null}}else Ph=Oh?Jd(a.stateNode.nextSibling):null;return!0}\nfunction Xh(){Ph=Oh=null;Qh=!1}var Yh=Wa.ReactCurrentOwner,rg=!1;function R(a,b,c,d){b.child=null===a?Yg(b,null,c,d):Xg(b,a.child,c,d)}function Zh(a,b,c,d,e){c=c.render;var f=b.ref;qg(b,e);d=oh(a,b,c,d,f,e);if(null!==a&&!rg)return b.updateQueue=a.updateQueue,b.effectTag&=-517,a.expirationTime<=e&&(a.expirationTime=0),$h(a,b,e);b.effectTag|=1;R(a,b,d,e);return b.child}\nfunction ai(a,b,c,d,e,f){if(null===a){var g=c.type;if("function"===typeof g&&!bi(g)&&void 0===g.defaultProps&&null===c.compare&&void 0===c.defaultProps)return b.tag=15,b.type=g,ci(a,b,g,d,e,f);a=Ug(c.type,null,d,null,b.mode,f);a.ref=b.ref;a.return=b;return b.child=a}g=a.child;if(e<f&&(e=g.memoizedProps,c=c.compare,c=null!==c?c:bf,c(e,d)&&a.ref===b.ref))return $h(a,b,f);b.effectTag|=1;a=Sg(g,d);a.ref=b.ref;a.return=b;return b.child=a}\nfunction ci(a,b,c,d,e,f){return null!==a&&bf(a.memoizedProps,d)&&a.ref===b.ref&&(rg=!1,e<f)?(b.expirationTime=a.expirationTime,$h(a,b,f)):di(a,b,c,d,f)}function ei(a,b){var c=b.ref;if(null===a&&null!==c||null!==a&&a.ref!==c)b.effectTag|=128}function di(a,b,c,d,e){var f=L(c)?Bf:J.current;f=Cf(b,f);qg(b,e);c=oh(a,b,c,d,f,e);if(null!==a&&!rg)return b.updateQueue=a.updateQueue,b.effectTag&=-517,a.expirationTime<=e&&(a.expirationTime=0),$h(a,b,e);b.effectTag|=1;R(a,b,c,e);return b.child}\nfunction fi(a,b,c,d,e){if(L(c)){var f=!0;Gf(b)}else f=!1;qg(b,e);if(null===b.stateNode)null!==a&&(a.alternate=null,b.alternate=null,b.effectTag|=2),Lg(b,c,d),Ng(b,c,d,e),d=!0;else if(null===a){var g=b.stateNode,h=b.memoizedProps;g.props=h;var k=g.context,l=c.contextType;"object"===typeof l&&null!==l?l=sg(l):(l=L(c)?Bf:J.current,l=Cf(b,l));var m=c.getDerivedStateFromProps,p="function"===typeof m||"function"===typeof g.getSnapshotBeforeUpdate;p||"function"!==typeof g.UNSAFE_componentWillReceiveProps&&\n"function"!==typeof g.componentWillReceiveProps||(h!==d||k!==l)&&Mg(b,g,d,l);tg=!1;var x=b.memoizedState;g.state=x;zg(b,d,g,e);k=b.memoizedState;h!==d||x!==k||K.current||tg?("function"===typeof m&&(Fg(b,c,m,d),k=b.memoizedState),(h=tg||Kg(b,c,h,d,x,k,l))?(p||"function"!==typeof g.UNSAFE_componentWillMount&&"function"!==typeof g.componentWillMount||("function"===typeof g.componentWillMount&&g.componentWillMount(),"function"===typeof g.UNSAFE_componentWillMount&&g.UNSAFE_componentWillMount()),"function"===\ntypeof g.componentDidMount&&(b.effectTag|=4)):("function"===typeof g.componentDidMount&&(b.effectTag|=4),b.memoizedProps=d,b.memoizedState=k),g.props=d,g.state=k,g.context=l,d=h):("function"===typeof g.componentDidMount&&(b.effectTag|=4),d=!1)}else g=b.stateNode,vg(a,b),h=b.memoizedProps,g.props=b.type===b.elementType?h:ig(b.type,h),k=g.context,l=c.contextType,"object"===typeof l&&null!==l?l=sg(l):(l=L(c)?Bf:J.current,l=Cf(b,l)),m=c.getDerivedStateFromProps,(p="function"===typeof m||"function"===\ntypeof g.getSnapshotBeforeUpdate)||"function"!==typeof g.UNSAFE_componentWillReceiveProps&&"function"!==typeof g.componentWillReceiveProps||(h!==d||k!==l)&&Mg(b,g,d,l),tg=!1,k=b.memoizedState,g.state=k,zg(b,d,g,e),x=b.memoizedState,h!==d||k!==x||K.current||tg?("function"===typeof m&&(Fg(b,c,m,d),x=b.memoizedState),(m=tg||Kg(b,c,h,d,k,x,l))?(p||"function"!==typeof g.UNSAFE_componentWillUpdate&&"function"!==typeof g.componentWillUpdate||("function"===typeof g.componentWillUpdate&&g.componentWillUpdate(d,\nx,l),"function"===typeof g.UNSAFE_componentWillUpdate&&g.UNSAFE_componentWillUpdate(d,x,l)),"function"===typeof g.componentDidUpdate&&(b.effectTag|=4),"function"===typeof g.getSnapshotBeforeUpdate&&(b.effectTag|=256)):("function"!==typeof g.componentDidUpdate||h===a.memoizedProps&&k===a.memoizedState||(b.effectTag|=4),"function"!==typeof g.getSnapshotBeforeUpdate||h===a.memoizedProps&&k===a.memoizedState||(b.effectTag|=256),b.memoizedProps=d,b.memoizedState=x),g.props=d,g.state=x,g.context=l,d=m):\n("function"!==typeof g.componentDidUpdate||h===a.memoizedProps&&k===a.memoizedState||(b.effectTag|=4),"function"!==typeof g.getSnapshotBeforeUpdate||h===a.memoizedProps&&k===a.memoizedState||(b.effectTag|=256),d=!1);return gi(a,b,c,d,f,e)}\nfunction gi(a,b,c,d,e,f){ei(a,b);var g=0!==(b.effectTag&64);if(!d&&!g)return e&&Hf(b,c,!1),$h(a,b,f);d=b.stateNode;Yh.current=b;var h=g&&"function"!==typeof c.getDerivedStateFromError?null:d.render();b.effectTag|=1;null!==a&&g?(b.child=Xg(b,a.child,null,f),b.child=Xg(b,null,h,f)):R(a,b,h,f);b.memoizedState=d.state;e&&Hf(b,c,!0);return b.child}function hi(a){var b=a.stateNode;b.pendingContext?Ef(a,b.pendingContext,b.pendingContext!==b.context):b.context&&Ef(a,b.context,!1);dh(a,b.containerInfo)}\nvar ii={dehydrated:null,retryTime:0};\nfunction ji(a,b,c){var d=b.mode,e=b.pendingProps,f=M.current,g=!1,h;(h=0!==(b.effectTag&64))||(h=0!==(f&2)&&(null===a||null!==a.memoizedState));h?(g=!0,b.effectTag&=-65):null!==a&&null===a.memoizedState||void 0===e.fallback||!0===e.unstable_avoidThisFallback||(f|=1);I(M,f&1);if(null===a){void 0!==e.fallback&&Uh(b);if(g){g=e.fallback;e=Wg(null,d,0,null);e.return=b;if(0===(b.mode&2))for(a=null!==b.memoizedState?b.child.child:b.child,e.child=a;null!==a;)a.return=e,a=a.sibling;c=Wg(g,d,c,null);c.return=\nb;e.sibling=c;b.memoizedState=ii;b.child=e;return c}d=e.children;b.memoizedState=null;return b.child=Yg(b,null,d,c)}if(null!==a.memoizedState){a=a.child;d=a.sibling;if(g){e=e.fallback;c=Sg(a,a.pendingProps);c.return=b;if(0===(b.mode&2)&&(g=null!==b.memoizedState?b.child.child:b.child,g!==a.child))for(c.child=g;null!==g;)g.return=c,g=g.sibling;d=Sg(d,e);d.return=b;c.sibling=d;c.childExpirationTime=0;b.memoizedState=ii;b.child=c;return d}c=Xg(b,a.child,e.children,c);b.memoizedState=null;return b.child=\nc}a=a.child;if(g){g=e.fallback;e=Wg(null,d,0,null);e.return=b;e.child=a;null!==a&&(a.return=e);if(0===(b.mode&2))for(a=null!==b.memoizedState?b.child.child:b.child,e.child=a;null!==a;)a.return=e,a=a.sibling;c=Wg(g,d,c,null);c.return=b;e.sibling=c;c.effectTag|=2;e.childExpirationTime=0;b.memoizedState=ii;b.child=e;return c}b.memoizedState=null;return b.child=Xg(b,a,e.children,c)}\nfunction ki(a,b){a.expirationTime<b&&(a.expirationTime=b);var c=a.alternate;null!==c&&c.expirationTime<b&&(c.expirationTime=b);pg(a.return,b)}function li(a,b,c,d,e,f){var g=a.memoizedState;null===g?a.memoizedState={isBackwards:b,rendering:null,renderingStartTime:0,last:d,tail:c,tailExpiration:0,tailMode:e,lastEffect:f}:(g.isBackwards=b,g.rendering=null,g.renderingStartTime=0,g.last=d,g.tail=c,g.tailExpiration=0,g.tailMode=e,g.lastEffect=f)}\nfunction mi(a,b,c){var d=b.pendingProps,e=d.revealOrder,f=d.tail;R(a,b,d.children,c);d=M.current;if(0!==(d&2))d=d&1|2,b.effectTag|=64;else{if(null!==a&&0!==(a.effectTag&64))a:for(a=b.child;null!==a;){if(13===a.tag)null!==a.memoizedState&&ki(a,c);else if(19===a.tag)ki(a,c);else if(null!==a.child){a.child.return=a;a=a.child;continue}if(a===b)break a;for(;null===a.sibling;){if(null===a.return||a.return===b)break a;a=a.return}a.sibling.return=a.return;a=a.sibling}d&=1}I(M,d);if(0===(b.mode&2))b.memoizedState=\nnull;else switch(e){case "forwards":c=b.child;for(e=null;null!==c;)a=c.alternate,null!==a&&null===hh(a)&&(e=c),c=c.sibling;c=e;null===c?(e=b.child,b.child=null):(e=c.sibling,c.sibling=null);li(b,!1,e,c,f,b.lastEffect);break;case "backwards":c=null;e=b.child;for(b.child=null;null!==e;){a=e.alternate;if(null!==a&&null===hh(a)){b.child=e;break}a=e.sibling;e.sibling=c;c=e;e=a}li(b,!0,c,null,f,b.lastEffect);break;case "together":li(b,!1,null,null,void 0,b.lastEffect);break;default:b.memoizedState=null}return b.child}\nfunction $h(a,b,c){null!==a&&(b.dependencies=a.dependencies);var d=b.expirationTime;0!==d&&Bg(d);if(b.childExpirationTime<c)return null;if(null!==a&&b.child!==a.child)throw Error(u(153));if(null!==b.child){a=b.child;c=Sg(a,a.pendingProps);b.child=c;for(c.return=b;null!==a.sibling;)a=a.sibling,c=c.sibling=Sg(a,a.pendingProps),c.return=b;c.sibling=null}return b.child}var ni,oi,pi,qi;\nni=function(a,b){for(var c=b.child;null!==c;){if(5===c.tag||6===c.tag)a.appendChild(c.stateNode);else if(4!==c.tag&&null!==c.child){c.child.return=c;c=c.child;continue}if(c===b)break;for(;null===c.sibling;){if(null===c.return||c.return===b)return;c=c.return}c.sibling.return=c.return;c=c.sibling}};oi=function(){};\npi=function(a,b,c,d,e){var f=a.memoizedProps;if(f!==d){var g=b.stateNode;ch($g.current);a=null;switch(c){case "input":f=zb(g,f);d=zb(g,d);a=[];break;case "option":f=Gb(g,f);d=Gb(g,d);a=[];break;case "select":f=n({},f,{value:void 0});d=n({},d,{value:void 0});a=[];break;case "textarea":f=Ib(g,f);d=Ib(g,d);a=[];break;default:"function"!==typeof f.onClick&&"function"===typeof d.onClick&&(g.onclick=sd)}od(c,d);var h,k;c=null;for(h in f)if(!d.hasOwnProperty(h)&&f.hasOwnProperty(h)&&null!=f[h])if("style"===\nh)for(k in g=f[h],g)g.hasOwnProperty(k)&&(c||(c={}),c[k]="");else"dangerouslySetInnerHTML"!==h&&"children"!==h&&"suppressContentEditableWarning"!==h&&"suppressHydrationWarning"!==h&&"autoFocus"!==h&&(va.hasOwnProperty(h)?a||(a=[]):(a=a||[]).push(h,null));for(h in d){var l=d[h];g=null!=f?f[h]:void 0;if(d.hasOwnProperty(h)&&l!==g&&(null!=l||null!=g))if("style"===h)if(g){for(k in g)!g.hasOwnProperty(k)||l&&l.hasOwnProperty(k)||(c||(c={}),c[k]="");for(k in l)l.hasOwnProperty(k)&&g[k]!==l[k]&&(c||(c={}),\nc[k]=l[k])}else c||(a||(a=[]),a.push(h,c)),c=l;else"dangerouslySetInnerHTML"===h?(l=l?l.__html:void 0,g=g?g.__html:void 0,null!=l&&g!==l&&(a=a||[]).push(h,l)):"children"===h?g===l||"string"!==typeof l&&"number"!==typeof l||(a=a||[]).push(h,""+l):"suppressContentEditableWarning"!==h&&"suppressHydrationWarning"!==h&&(va.hasOwnProperty(h)?(null!=l&&rd(e,h),a||g===l||(a=[])):(a=a||[]).push(h,l))}c&&(a=a||[]).push("style",c);e=a;if(b.updateQueue=e)b.effectTag|=4}};\nqi=function(a,b,c,d){c!==d&&(b.effectTag|=4)};function ri(a,b){switch(a.tailMode){case "hidden":b=a.tail;for(var c=null;null!==b;)null!==b.alternate&&(c=b),b=b.sibling;null===c?a.tail=null:c.sibling=null;break;case "collapsed":c=a.tail;for(var d=null;null!==c;)null!==c.alternate&&(d=c),c=c.sibling;null===d?b||null===a.tail?a.tail=null:a.tail.sibling=null:d.sibling=null}}\nfunction si(a,b,c){var d=b.pendingProps;switch(b.tag){case 2:case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return null;case 1:return L(b.type)&&Df(),null;case 3:return eh(),H(K),H(J),c=b.stateNode,c.pendingContext&&(c.context=c.pendingContext,c.pendingContext=null),null!==a&&null!==a.child||!Wh(b)||(b.effectTag|=4),oi(b),null;case 5:gh(b);c=ch(bh.current);var e=b.type;if(null!==a&&null!=b.stateNode)pi(a,b,e,d,c),a.ref!==b.ref&&(b.effectTag|=128);else{if(!d){if(null===b.stateNode)throw Error(u(166));\nreturn null}a=ch($g.current);if(Wh(b)){d=b.stateNode;e=b.type;var f=b.memoizedProps;d[Md]=b;d[Nd]=f;switch(e){case "iframe":case "object":case "embed":F("load",d);break;case "video":case "audio":for(a=0;a<ac.length;a++)F(ac[a],d);break;case "source":F("error",d);break;case "img":case "image":case "link":F("error",d);F("load",d);break;case "form":F("reset",d);F("submit",d);break;case "details":F("toggle",d);break;case "input":Ab(d,f);F("invalid",d);rd(c,"onChange");break;case "select":d._wrapperState=\n{wasMultiple:!!f.multiple};F("invalid",d);rd(c,"onChange");break;case "textarea":Jb(d,f),F("invalid",d),rd(c,"onChange")}od(e,f);a=null;for(var g in f)if(f.hasOwnProperty(g)){var h=f[g];"children"===g?"string"===typeof h?d.textContent!==h&&(a=["children",h]):"number"===typeof h&&d.textContent!==""+h&&(a=["children",""+h]):va.hasOwnProperty(g)&&null!=h&&rd(c,g)}switch(e){case "input":xb(d);Eb(d,f,!0);break;case "textarea":xb(d);Lb(d);break;case "select":case "option":break;default:"function"===typeof f.onClick&&\n(d.onclick=sd)}c=a;b.updateQueue=c;null!==c&&(b.effectTag|=4)}else{g=9===c.nodeType?c:c.ownerDocument;a===qd&&(a=Nb(e));a===qd?"script"===e?(a=g.createElement("div"),a.innerHTML="<script>\\x3c/script>",a=a.removeChild(a.firstChild)):"string"===typeof d.is?a=g.createElement(e,{is:d.is}):(a=g.createElement(e),"select"===e&&(g=a,d.multiple?g.multiple=!0:d.size&&(g.size=d.size))):a=g.createElementNS(a,e);a[Md]=b;a[Nd]=d;ni(a,b,!1,!1);b.stateNode=a;g=pd(e,d);switch(e){case "iframe":case "object":case "embed":F("load",\na);h=d;break;case "video":case "audio":for(h=0;h<ac.length;h++)F(ac[h],a);h=d;break;case "source":F("error",a);h=d;break;case "img":case "image":case "link":F("error",a);F("load",a);h=d;break;case "form":F("reset",a);F("submit",a);h=d;break;case "details":F("toggle",a);h=d;break;case "input":Ab(a,d);h=zb(a,d);F("invalid",a);rd(c,"onChange");break;case "option":h=Gb(a,d);break;case "select":a._wrapperState={wasMultiple:!!d.multiple};h=n({},d,{value:void 0});F("invalid",a);rd(c,"onChange");break;case "textarea":Jb(a,\nd);h=Ib(a,d);F("invalid",a);rd(c,"onChange");break;default:h=d}od(e,h);var k=h;for(f in k)if(k.hasOwnProperty(f)){var l=k[f];"style"===f?md(a,l):"dangerouslySetInnerHTML"===f?(l=l?l.__html:void 0,null!=l&&Qb(a,l)):"children"===f?"string"===typeof l?("textarea"!==e||""!==l)&&Rb(a,l):"number"===typeof l&&Rb(a,""+l):"suppressContentEditableWarning"!==f&&"suppressHydrationWarning"!==f&&"autoFocus"!==f&&(va.hasOwnProperty(f)?null!=l&&rd(c,f):null!=l&&Xa(a,f,l,g))}switch(e){case "input":xb(a);Eb(a,d,!1);\nbreak;case "textarea":xb(a);Lb(a);break;case "option":null!=d.value&&a.setAttribute("value",""+rb(d.value));break;case "select":a.multiple=!!d.multiple;c=d.value;null!=c?Hb(a,!!d.multiple,c,!1):null!=d.defaultValue&&Hb(a,!!d.multiple,d.defaultValue,!0);break;default:"function"===typeof h.onClick&&(a.onclick=sd)}Fd(e,d)&&(b.effectTag|=4)}null!==b.ref&&(b.effectTag|=128)}return null;case 6:if(a&&null!=b.stateNode)qi(a,b,a.memoizedProps,d);else{if("string"!==typeof d&&null===b.stateNode)throw Error(u(166));\nc=ch(bh.current);ch($g.current);Wh(b)?(c=b.stateNode,d=b.memoizedProps,c[Md]=b,c.nodeValue!==d&&(b.effectTag|=4)):(c=(9===c.nodeType?c:c.ownerDocument).createTextNode(d),c[Md]=b,b.stateNode=c)}return null;case 13:H(M);d=b.memoizedState;if(0!==(b.effectTag&64))return b.expirationTime=c,b;c=null!==d;d=!1;null===a?void 0!==b.memoizedProps.fallback&&Wh(b):(e=a.memoizedState,d=null!==e,c||null===e||(e=a.child.sibling,null!==e&&(f=b.firstEffect,null!==f?(b.firstEffect=e,e.nextEffect=f):(b.firstEffect=b.lastEffect=\ne,e.nextEffect=null),e.effectTag=8)));if(c&&!d&&0!==(b.mode&2))if(null===a&&!0!==b.memoizedProps.unstable_avoidThisFallback||0!==(M.current&1))S===ti&&(S=ui);else{if(S===ti||S===ui)S=vi;0!==wi&&null!==T&&(xi(T,U),yi(T,wi))}if(c||d)b.effectTag|=4;return null;case 4:return eh(),oi(b),null;case 10:return og(b),null;case 17:return L(b.type)&&Df(),null;case 19:H(M);d=b.memoizedState;if(null===d)return null;e=0!==(b.effectTag&64);f=d.rendering;if(null===f)if(e)ri(d,!1);else{if(S!==ti||null!==a&&0!==(a.effectTag&\n64))for(f=b.child;null!==f;){a=hh(f);if(null!==a){b.effectTag|=64;ri(d,!1);e=a.updateQueue;null!==e&&(b.updateQueue=e,b.effectTag|=4);null===d.lastEffect&&(b.firstEffect=null);b.lastEffect=d.lastEffect;for(d=b.child;null!==d;)e=d,f=c,e.effectTag&=2,e.nextEffect=null,e.firstEffect=null,e.lastEffect=null,a=e.alternate,null===a?(e.childExpirationTime=0,e.expirationTime=f,e.child=null,e.memoizedProps=null,e.memoizedState=null,e.updateQueue=null,e.dependencies=null):(e.childExpirationTime=a.childExpirationTime,\ne.expirationTime=a.expirationTime,e.child=a.child,e.memoizedProps=a.memoizedProps,e.memoizedState=a.memoizedState,e.updateQueue=a.updateQueue,f=a.dependencies,e.dependencies=null===f?null:{expirationTime:f.expirationTime,firstContext:f.firstContext,responders:f.responders}),d=d.sibling;I(M,M.current&1|2);return b.child}f=f.sibling}}else{if(!e)if(a=hh(f),null!==a){if(b.effectTag|=64,e=!0,c=a.updateQueue,null!==c&&(b.updateQueue=c,b.effectTag|=4),ri(d,!0),null===d.tail&&"hidden"===d.tailMode&&!f.alternate)return b=\nb.lastEffect=d.lastEffect,null!==b&&(b.nextEffect=null),null}else 2*$f()-d.renderingStartTime>d.tailExpiration&&1<c&&(b.effectTag|=64,e=!0,ri(d,!1),b.expirationTime=b.childExpirationTime=c-1);d.isBackwards?(f.sibling=b.child,b.child=f):(c=d.last,null!==c?c.sibling=f:b.child=f,d.last=f)}return null!==d.tail?(0===d.tailExpiration&&(d.tailExpiration=$f()+500),c=d.tail,d.rendering=c,d.tail=c.sibling,d.lastEffect=b.lastEffect,d.renderingStartTime=$f(),c.sibling=null,b=M.current,I(M,e?b&1|2:b&1),c):null}throw Error(u(156,\nb.tag));}function zi(a){switch(a.tag){case 1:L(a.type)&&Df();var b=a.effectTag;return b&4096?(a.effectTag=b&-4097|64,a):null;case 3:eh();H(K);H(J);b=a.effectTag;if(0!==(b&64))throw Error(u(285));a.effectTag=b&-4097|64;return a;case 5:return gh(a),null;case 13:return H(M),b=a.effectTag,b&4096?(a.effectTag=b&-4097|64,a):null;case 19:return H(M),null;case 4:return eh(),null;case 10:return og(a),null;default:return null}}function Ai(a,b){return{value:a,source:b,stack:qb(b)}}\nvar Bi="function"===typeof WeakSet?WeakSet:Set;function Ci(a,b){var c=b.source,d=b.stack;null===d&&null!==c&&(d=qb(c));null!==c&&pb(c.type);b=b.value;null!==a&&1===a.tag&&pb(a.type);try{console.error(b)}catch(e){setTimeout(function(){throw e;})}}function Di(a,b){try{b.props=a.memoizedProps,b.state=a.memoizedState,b.componentWillUnmount()}catch(c){Ei(a,c)}}function Fi(a){var b=a.ref;if(null!==b)if("function"===typeof b)try{b(null)}catch(c){Ei(a,c)}else b.current=null}\nfunction Gi(a,b){switch(b.tag){case 0:case 11:case 15:case 22:return;case 1:if(b.effectTag&256&&null!==a){var c=a.memoizedProps,d=a.memoizedState;a=b.stateNode;b=a.getSnapshotBeforeUpdate(b.elementType===b.type?c:ig(b.type,c),d);a.__reactInternalSnapshotBeforeUpdate=b}return;case 3:case 5:case 6:case 4:case 17:return}throw Error(u(163));}\nfunction Hi(a,b){b=b.updateQueue;b=null!==b?b.lastEffect:null;if(null!==b){var c=b=b.next;do{if((c.tag&a)===a){var d=c.destroy;c.destroy=void 0;void 0!==d&&d()}c=c.next}while(c!==b)}}function Ii(a,b){b=b.updateQueue;b=null!==b?b.lastEffect:null;if(null!==b){var c=b=b.next;do{if((c.tag&a)===a){var d=c.create;c.destroy=d()}c=c.next}while(c!==b)}}\nfunction Ji(a,b,c){switch(c.tag){case 0:case 11:case 15:case 22:Ii(3,c);return;case 1:a=c.stateNode;if(c.effectTag&4)if(null===b)a.componentDidMount();else{var d=c.elementType===c.type?b.memoizedProps:ig(c.type,b.memoizedProps);a.componentDidUpdate(d,b.memoizedState,a.__reactInternalSnapshotBeforeUpdate)}b=c.updateQueue;null!==b&&Cg(c,b,a);return;case 3:b=c.updateQueue;if(null!==b){a=null;if(null!==c.child)switch(c.child.tag){case 5:a=c.child.stateNode;break;case 1:a=c.child.stateNode}Cg(c,b,a)}return;\ncase 5:a=c.stateNode;null===b&&c.effectTag&4&&Fd(c.type,c.memoizedProps)&&a.focus();return;case 6:return;case 4:return;case 12:return;case 13:null===c.memoizedState&&(c=c.alternate,null!==c&&(c=c.memoizedState,null!==c&&(c=c.dehydrated,null!==c&&Vc(c))));return;case 19:case 17:case 20:case 21:return}throw Error(u(163));}\nfunction Ki(a,b,c){"function"===typeof Li&&Li(b);switch(b.tag){case 0:case 11:case 14:case 15:case 22:a=b.updateQueue;if(null!==a&&(a=a.lastEffect,null!==a)){var d=a.next;cg(97<c?97:c,function(){var a=d;do{var c=a.destroy;if(void 0!==c){var g=b;try{c()}catch(h){Ei(g,h)}}a=a.next}while(a!==d)})}break;case 1:Fi(b);c=b.stateNode;"function"===typeof c.componentWillUnmount&&Di(b,c);break;case 5:Fi(b);break;case 4:Mi(a,b,c)}}\nfunction Ni(a){var b=a.alternate;a.return=null;a.child=null;a.memoizedState=null;a.updateQueue=null;a.dependencies=null;a.alternate=null;a.firstEffect=null;a.lastEffect=null;a.pendingProps=null;a.memoizedProps=null;a.stateNode=null;null!==b&&Ni(b)}function Oi(a){return 5===a.tag||3===a.tag||4===a.tag}\nfunction Pi(a){a:{for(var b=a.return;null!==b;){if(Oi(b)){var c=b;break a}b=b.return}throw Error(u(160));}b=c.stateNode;switch(c.tag){case 5:var d=!1;break;case 3:b=b.containerInfo;d=!0;break;case 4:b=b.containerInfo;d=!0;break;default:throw Error(u(161));}c.effectTag&16&&(Rb(b,""),c.effectTag&=-17);a:b:for(c=a;;){for(;null===c.sibling;){if(null===c.return||Oi(c.return)){c=null;break a}c=c.return}c.sibling.return=c.return;for(c=c.sibling;5!==c.tag&&6!==c.tag&&18!==c.tag;){if(c.effectTag&2)continue b;\nif(null===c.child||4===c.tag)continue b;else c.child.return=c,c=c.child}if(!(c.effectTag&2)){c=c.stateNode;break a}}d?Qi(a,c,b):Ri(a,c,b)}\nfunction Qi(a,b,c){var d=a.tag,e=5===d||6===d;if(e)a=e?a.stateNode:a.stateNode.instance,b?8===c.nodeType?c.parentNode.insertBefore(a,b):c.insertBefore(a,b):(8===c.nodeType?(b=c.parentNode,b.insertBefore(a,c)):(b=c,b.appendChild(a)),c=c._reactRootContainer,null!==c&&void 0!==c||null!==b.onclick||(b.onclick=sd));else if(4!==d&&(a=a.child,null!==a))for(Qi(a,b,c),a=a.sibling;null!==a;)Qi(a,b,c),a=a.sibling}\nfunction Ri(a,b,c){var d=a.tag,e=5===d||6===d;if(e)a=e?a.stateNode:a.stateNode.instance,b?c.insertBefore(a,b):c.appendChild(a);else if(4!==d&&(a=a.child,null!==a))for(Ri(a,b,c),a=a.sibling;null!==a;)Ri(a,b,c),a=a.sibling}\nfunction Mi(a,b,c){for(var d=b,e=!1,f,g;;){if(!e){e=d.return;a:for(;;){if(null===e)throw Error(u(160));f=e.stateNode;switch(e.tag){case 5:g=!1;break a;case 3:f=f.containerInfo;g=!0;break a;case 4:f=f.containerInfo;g=!0;break a}e=e.return}e=!0}if(5===d.tag||6===d.tag){a:for(var h=a,k=d,l=c,m=k;;)if(Ki(h,m,l),null!==m.child&&4!==m.tag)m.child.return=m,m=m.child;else{if(m===k)break a;for(;null===m.sibling;){if(null===m.return||m.return===k)break a;m=m.return}m.sibling.return=m.return;m=m.sibling}g?(h=\nf,k=d.stateNode,8===h.nodeType?h.parentNode.removeChild(k):h.removeChild(k)):f.removeChild(d.stateNode)}else if(4===d.tag){if(null!==d.child){f=d.stateNode.containerInfo;g=!0;d.child.return=d;d=d.child;continue}}else if(Ki(a,d,c),null!==d.child){d.child.return=d;d=d.child;continue}if(d===b)break;for(;null===d.sibling;){if(null===d.return||d.return===b)return;d=d.return;4===d.tag&&(e=!1)}d.sibling.return=d.return;d=d.sibling}}\nfunction Si(a,b){switch(b.tag){case 0:case 11:case 14:case 15:case 22:Hi(3,b);return;case 1:return;case 5:var c=b.stateNode;if(null!=c){var d=b.memoizedProps,e=null!==a?a.memoizedProps:d;a=b.type;var f=b.updateQueue;b.updateQueue=null;if(null!==f){c[Nd]=d;"input"===a&&"radio"===d.type&&null!=d.name&&Bb(c,d);pd(a,e);b=pd(a,d);for(e=0;e<f.length;e+=2){var g=f[e],h=f[e+1];"style"===g?md(c,h):"dangerouslySetInnerHTML"===g?Qb(c,h):"children"===g?Rb(c,h):Xa(c,g,h,b)}switch(a){case "input":Cb(c,d);break;\ncase "textarea":Kb(c,d);break;case "select":b=c._wrapperState.wasMultiple,c._wrapperState.wasMultiple=!!d.multiple,a=d.value,null!=a?Hb(c,!!d.multiple,a,!1):b!==!!d.multiple&&(null!=d.defaultValue?Hb(c,!!d.multiple,d.defaultValue,!0):Hb(c,!!d.multiple,d.multiple?[]:"",!1))}}}return;case 6:if(null===b.stateNode)throw Error(u(162));b.stateNode.nodeValue=b.memoizedProps;return;case 3:b=b.stateNode;b.hydrate&&(b.hydrate=!1,Vc(b.containerInfo));return;case 12:return;case 13:c=b;null===b.memoizedState?\nd=!1:(d=!0,c=b.child,Ti=$f());if(null!==c)a:for(a=c;;){if(5===a.tag)f=a.stateNode,d?(f=f.style,"function"===typeof f.setProperty?f.setProperty("display","none","important"):f.display="none"):(f=a.stateNode,e=a.memoizedProps.style,e=void 0!==e&&null!==e&&e.hasOwnProperty("display")?e.display:null,f.style.display=ld("display",e));else if(6===a.tag)a.stateNode.nodeValue=d?"":a.memoizedProps;else if(13===a.tag&&null!==a.memoizedState&&null===a.memoizedState.dehydrated){f=a.child.sibling;f.return=a;a=\nf;continue}else if(null!==a.child){a.child.return=a;a=a.child;continue}if(a===c)break;for(;null===a.sibling;){if(null===a.return||a.return===c)break a;a=a.return}a.sibling.return=a.return;a=a.sibling}Ui(b);return;case 19:Ui(b);return;case 17:return}throw Error(u(163));}function Ui(a){var b=a.updateQueue;if(null!==b){a.updateQueue=null;var c=a.stateNode;null===c&&(c=a.stateNode=new Bi);b.forEach(function(b){var d=Vi.bind(null,a,b);c.has(b)||(c.add(b),b.then(d,d))})}}\nvar Wi="function"===typeof WeakMap?WeakMap:Map;function Xi(a,b,c){c=wg(c,null);c.tag=3;c.payload={element:null};var d=b.value;c.callback=function(){Yi||(Yi=!0,Zi=d);Ci(a,b)};return c}\nfunction $i(a,b,c){c=wg(c,null);c.tag=3;var d=a.type.getDerivedStateFromError;if("function"===typeof d){var e=b.value;c.payload=function(){Ci(a,b);return d(e)}}var f=a.stateNode;null!==f&&"function"===typeof f.componentDidCatch&&(c.callback=function(){"function"!==typeof d&&(null===aj?aj=new Set([this]):aj.add(this),Ci(a,b));var c=b.stack;this.componentDidCatch(b.value,{componentStack:null!==c?c:""})});return c}\nvar bj=Math.ceil,cj=Wa.ReactCurrentDispatcher,dj=Wa.ReactCurrentOwner,V=0,ej=8,fj=16,gj=32,ti=0,hj=1,ij=2,ui=3,vi=4,jj=5,W=V,T=null,X=null,U=0,S=ti,kj=null,lj=1073741823,mj=1073741823,nj=null,wi=0,oj=!1,Ti=0,pj=500,Y=null,Yi=!1,Zi=null,aj=null,qj=!1,rj=null,sj=90,tj=null,uj=0,vj=null,wj=0;function Gg(){return(W&(fj|gj))!==V?1073741821-($f()/10|0):0!==wj?wj:wj=1073741821-($f()/10|0)}\nfunction Hg(a,b,c){b=b.mode;if(0===(b&2))return 1073741823;var d=ag();if(0===(b&4))return 99===d?1073741823:1073741822;if((W&fj)!==V)return U;if(null!==c)a=hg(a,c.timeoutMs|0||5E3,250);else switch(d){case 99:a=1073741823;break;case 98:a=hg(a,150,100);break;case 97:case 96:a=hg(a,5E3,250);break;case 95:a=2;break;default:throw Error(u(326));}null!==T&&a===U&&--a;return a}\nfunction Ig(a,b){if(50<uj)throw uj=0,vj=null,Error(u(185));a=xj(a,b);if(null!==a){var c=ag();1073741823===b?(W&ej)!==V&&(W&(fj|gj))===V?yj(a):(Z(a),W===V&&gg()):Z(a);(W&4)===V||98!==c&&99!==c||(null===tj?tj=new Map([[a,b]]):(c=tj.get(a),(void 0===c||c>b)&&tj.set(a,b)))}}\nfunction xj(a,b){a.expirationTime<b&&(a.expirationTime=b);var c=a.alternate;null!==c&&c.expirationTime<b&&(c.expirationTime=b);var d=a.return,e=null;if(null===d&&3===a.tag)e=a.stateNode;else for(;null!==d;){c=d.alternate;d.childExpirationTime<b&&(d.childExpirationTime=b);null!==c&&c.childExpirationTime<b&&(c.childExpirationTime=b);if(null===d.return&&3===d.tag){e=d.stateNode;break}d=d.return}null!==e&&(T===e&&(Bg(b),S===vi&&xi(e,U)),yi(e,b));return e}\nfunction zj(a){var b=a.lastExpiredTime;if(0!==b)return b;b=a.firstPendingTime;if(!Aj(a,b))return b;var c=a.lastPingedTime;a=a.nextKnownPendingLevel;a=c>a?c:a;return 2>=a&&b!==a?0:a}\nfunction Z(a){if(0!==a.lastExpiredTime)a.callbackExpirationTime=1073741823,a.callbackPriority=99,a.callbackNode=eg(yj.bind(null,a));else{var b=zj(a),c=a.callbackNode;if(0===b)null!==c&&(a.callbackNode=null,a.callbackExpirationTime=0,a.callbackPriority=90);else{var d=Gg();1073741823===b?d=99:1===b||2===b?d=95:(d=10*(1073741821-b)-10*(1073741821-d),d=0>=d?99:250>=d?98:5250>=d?97:95);if(null!==c){var e=a.callbackPriority;if(a.callbackExpirationTime===b&&e>=d)return;c!==Tf&&Kf(c)}a.callbackExpirationTime=\nb;a.callbackPriority=d;b=1073741823===b?eg(yj.bind(null,a)):dg(d,Bj.bind(null,a),{timeout:10*(1073741821-b)-$f()});a.callbackNode=b}}}\nfunction Bj(a,b){wj=0;if(b)return b=Gg(),Cj(a,b),Z(a),null;var c=zj(a);if(0!==c){b=a.callbackNode;if((W&(fj|gj))!==V)throw Error(u(327));Dj();a===T&&c===U||Ej(a,c);if(null!==X){var d=W;W|=fj;var e=Fj();do try{Gj();break}catch(h){Hj(a,h)}while(1);ng();W=d;cj.current=e;if(S===hj)throw b=kj,Ej(a,c),xi(a,c),Z(a),b;if(null===X)switch(e=a.finishedWork=a.current.alternate,a.finishedExpirationTime=c,d=S,T=null,d){case ti:case hj:throw Error(u(345));case ij:Cj(a,2<c?2:c);break;case ui:xi(a,c);d=a.lastSuspendedTime;\nc===d&&(a.nextKnownPendingLevel=Ij(e));if(1073741823===lj&&(e=Ti+pj-$f(),10<e)){if(oj){var f=a.lastPingedTime;if(0===f||f>=c){a.lastPingedTime=c;Ej(a,c);break}}f=zj(a);if(0!==f&&f!==c)break;if(0!==d&&d!==c){a.lastPingedTime=d;break}a.timeoutHandle=Hd(Jj.bind(null,a),e);break}Jj(a);break;case vi:xi(a,c);d=a.lastSuspendedTime;c===d&&(a.nextKnownPendingLevel=Ij(e));if(oj&&(e=a.lastPingedTime,0===e||e>=c)){a.lastPingedTime=c;Ej(a,c);break}e=zj(a);if(0!==e&&e!==c)break;if(0!==d&&d!==c){a.lastPingedTime=\nd;break}1073741823!==mj?d=10*(1073741821-mj)-$f():1073741823===lj?d=0:(d=10*(1073741821-lj)-5E3,e=$f(),c=10*(1073741821-c)-e,d=e-d,0>d&&(d=0),d=(120>d?120:480>d?480:1080>d?1080:1920>d?1920:3E3>d?3E3:4320>d?4320:1960*bj(d/1960))-d,c<d&&(d=c));if(10<d){a.timeoutHandle=Hd(Jj.bind(null,a),d);break}Jj(a);break;case jj:if(1073741823!==lj&&null!==nj){f=lj;var g=nj;d=g.busyMinDurationMs|0;0>=d?d=0:(e=g.busyDelayMs|0,f=$f()-(10*(1073741821-f)-(g.timeoutMs|0||5E3)),d=f<=e?0:e+d-f);if(10<d){xi(a,c);a.timeoutHandle=\nHd(Jj.bind(null,a),d);break}}Jj(a);break;default:throw Error(u(329));}Z(a);if(a.callbackNode===b)return Bj.bind(null,a)}}return null}\nfunction yj(a){var b=a.lastExpiredTime;b=0!==b?b:1073741823;if((W&(fj|gj))!==V)throw Error(u(327));Dj();a===T&&b===U||Ej(a,b);if(null!==X){var c=W;W|=fj;var d=Fj();do try{Kj();break}catch(e){Hj(a,e)}while(1);ng();W=c;cj.current=d;if(S===hj)throw c=kj,Ej(a,b),xi(a,b),Z(a),c;if(null!==X)throw Error(u(261));a.finishedWork=a.current.alternate;a.finishedExpirationTime=b;T=null;Jj(a);Z(a)}return null}function Lj(){if(null!==tj){var a=tj;tj=null;a.forEach(function(a,c){Cj(c,a);Z(c)});gg()}}\nfunction Mj(a,b){var c=W;W|=1;try{return a(b)}finally{W=c,W===V&&gg()}}function Nj(a,b){var c=W;W&=-2;W|=ej;try{return a(b)}finally{W=c,W===V&&gg()}}\nfunction Ej(a,b){a.finishedWork=null;a.finishedExpirationTime=0;var c=a.timeoutHandle;-1!==c&&(a.timeoutHandle=-1,Id(c));if(null!==X)for(c=X.return;null!==c;){var d=c;switch(d.tag){case 1:d=d.type.childContextTypes;null!==d&&void 0!==d&&Df();break;case 3:eh();H(K);H(J);break;case 5:gh(d);break;case 4:eh();break;case 13:H(M);break;case 19:H(M);break;case 10:og(d)}c=c.return}T=a;X=Sg(a.current,null);U=b;S=ti;kj=null;mj=lj=1073741823;nj=null;wi=0;oj=!1}\nfunction Hj(a,b){do{try{ng();jh.current=sh;if(mh)for(var c=N.memoizedState;null!==c;){var d=c.queue;null!==d&&(d.pending=null);c=c.next}lh=0;P=O=N=null;mh=!1;if(null===X||null===X.return)return S=hj,kj=b,X=null;a:{var e=a,f=X.return,g=X,h=b;b=U;g.effectTag|=2048;g.firstEffect=g.lastEffect=null;if(null!==h&&"object"===typeof h&&"function"===typeof h.then){var k=h;if(0===(g.mode&2)){var l=g.alternate;l?(g.updateQueue=l.updateQueue,g.memoizedState=l.memoizedState,g.expirationTime=l.expirationTime):(g.updateQueue=\nnull,g.memoizedState=null)}var m=0!==(M.current&1),p=f;do{var x;if(x=13===p.tag){var z=p.memoizedState;if(null!==z)x=null!==z.dehydrated?!0:!1;else{var ca=p.memoizedProps;x=void 0===ca.fallback?!1:!0!==ca.unstable_avoidThisFallback?!0:m?!1:!0}}if(x){var D=p.updateQueue;if(null===D){var t=new Set;t.add(k);p.updateQueue=t}else D.add(k);if(0===(p.mode&2)){p.effectTag|=64;g.effectTag&=-2981;if(1===g.tag)if(null===g.alternate)g.tag=17;else{var y=wg(1073741823,null);y.tag=2;xg(g,y)}g.expirationTime=1073741823;\nbreak a}h=void 0;g=b;var A=e.pingCache;null===A?(A=e.pingCache=new Wi,h=new Set,A.set(k,h)):(h=A.get(k),void 0===h&&(h=new Set,A.set(k,h)));if(!h.has(g)){h.add(g);var q=Oj.bind(null,e,k,g);k.then(q,q)}p.effectTag|=4096;p.expirationTime=b;break a}p=p.return}while(null!==p);h=Error((pb(g.type)||"A React component")+" suspended while rendering, but no fallback UI was specified.\\n\\nAdd a <Suspense fallback=...> component higher in the tree to provide a loading indicator or placeholder to display."+qb(g))}S!==\njj&&(S=ij);h=Ai(h,g);p=f;do{switch(p.tag){case 3:k=h;p.effectTag|=4096;p.expirationTime=b;var B=Xi(p,k,b);yg(p,B);break a;case 1:k=h;var w=p.type,ub=p.stateNode;if(0===(p.effectTag&64)&&("function"===typeof w.getDerivedStateFromError||null!==ub&&"function"===typeof ub.componentDidCatch&&(null===aj||!aj.has(ub)))){p.effectTag|=4096;p.expirationTime=b;var vb=$i(p,k,b);yg(p,vb);break a}}p=p.return}while(null!==p)}X=Pj(X)}catch(Xc){b=Xc;continue}break}while(1)}\nfunction Fj(){var a=cj.current;cj.current=sh;return null===a?sh:a}function Ag(a,b){a<lj&&2<a&&(lj=a);null!==b&&a<mj&&2<a&&(mj=a,nj=b)}function Bg(a){a>wi&&(wi=a)}function Kj(){for(;null!==X;)X=Qj(X)}function Gj(){for(;null!==X&&!Uf();)X=Qj(X)}function Qj(a){var b=Rj(a.alternate,a,U);a.memoizedProps=a.pendingProps;null===b&&(b=Pj(a));dj.current=null;return b}\nfunction Pj(a){X=a;do{var b=X.alternate;a=X.return;if(0===(X.effectTag&2048)){b=si(b,X,U);if(1===U||1!==X.childExpirationTime){for(var c=0,d=X.child;null!==d;){var e=d.expirationTime,f=d.childExpirationTime;e>c&&(c=e);f>c&&(c=f);d=d.sibling}X.childExpirationTime=c}if(null!==b)return b;null!==a&&0===(a.effectTag&2048)&&(null===a.firstEffect&&(a.firstEffect=X.firstEffect),null!==X.lastEffect&&(null!==a.lastEffect&&(a.lastEffect.nextEffect=X.firstEffect),a.lastEffect=X.lastEffect),1<X.effectTag&&(null!==\na.lastEffect?a.lastEffect.nextEffect=X:a.firstEffect=X,a.lastEffect=X))}else{b=zi(X);if(null!==b)return b.effectTag&=2047,b;null!==a&&(a.firstEffect=a.lastEffect=null,a.effectTag|=2048)}b=X.sibling;if(null!==b)return b;X=a}while(null!==X);S===ti&&(S=jj);return null}function Ij(a){var b=a.expirationTime;a=a.childExpirationTime;return b>a?b:a}function Jj(a){var b=ag();cg(99,Sj.bind(null,a,b));return null}\nfunction Sj(a,b){do Dj();while(null!==rj);if((W&(fj|gj))!==V)throw Error(u(327));var c=a.finishedWork,d=a.finishedExpirationTime;if(null===c)return null;a.finishedWork=null;a.finishedExpirationTime=0;if(c===a.current)throw Error(u(177));a.callbackNode=null;a.callbackExpirationTime=0;a.callbackPriority=90;a.nextKnownPendingLevel=0;var e=Ij(c);a.firstPendingTime=e;d<=a.lastSuspendedTime?a.firstSuspendedTime=a.lastSuspendedTime=a.nextKnownPendingLevel=0:d<=a.firstSuspendedTime&&(a.firstSuspendedTime=\nd-1);d<=a.lastPingedTime&&(a.lastPingedTime=0);d<=a.lastExpiredTime&&(a.lastExpiredTime=0);a===T&&(X=T=null,U=0);1<c.effectTag?null!==c.lastEffect?(c.lastEffect.nextEffect=c,e=c.firstEffect):e=c:e=c.firstEffect;if(null!==e){var f=W;W|=gj;dj.current=null;Dd=fd;var g=xd();if(yd(g)){if("selectionStart"in g)var h={start:g.selectionStart,end:g.selectionEnd};else a:{h=(h=g.ownerDocument)&&h.defaultView||window;var k=h.getSelection&&h.getSelection();if(k&&0!==k.rangeCount){h=k.anchorNode;var l=k.anchorOffset,\nm=k.focusNode;k=k.focusOffset;try{h.nodeType,m.nodeType}catch(wb){h=null;break a}var p=0,x=-1,z=-1,ca=0,D=0,t=g,y=null;b:for(;;){for(var A;;){t!==h||0!==l&&3!==t.nodeType||(x=p+l);t!==m||0!==k&&3!==t.nodeType||(z=p+k);3===t.nodeType&&(p+=t.nodeValue.length);if(null===(A=t.firstChild))break;y=t;t=A}for(;;){if(t===g)break b;y===h&&++ca===l&&(x=p);y===m&&++D===k&&(z=p);if(null!==(A=t.nextSibling))break;t=y;y=t.parentNode}t=A}h=-1===x||-1===z?null:{start:x,end:z}}else h=null}h=h||{start:0,end:0}}else h=\nnull;Ed={activeElementDetached:null,focusedElem:g,selectionRange:h};fd=!1;Y=e;do try{Tj()}catch(wb){if(null===Y)throw Error(u(330));Ei(Y,wb);Y=Y.nextEffect}while(null!==Y);Y=e;do try{for(g=a,h=b;null!==Y;){var q=Y.effectTag;q&16&&Rb(Y.stateNode,"");if(q&128){var B=Y.alternate;if(null!==B){var w=B.ref;null!==w&&("function"===typeof w?w(null):w.current=null)}}switch(q&1038){case 2:Pi(Y);Y.effectTag&=-3;break;case 6:Pi(Y);Y.effectTag&=-3;Si(Y.alternate,Y);break;case 1024:Y.effectTag&=-1025;break;case 1028:Y.effectTag&=\n-1025;Si(Y.alternate,Y);break;case 4:Si(Y.alternate,Y);break;case 8:l=Y,Mi(g,l,h),Ni(l)}Y=Y.nextEffect}}catch(wb){if(null===Y)throw Error(u(330));Ei(Y,wb);Y=Y.nextEffect}while(null!==Y);w=Ed;B=xd();q=w.focusedElem;h=w.selectionRange;if(B!==q&&q&&q.ownerDocument&&wd(q.ownerDocument.documentElement,q)){null!==h&&yd(q)&&(B=h.start,w=h.end,void 0===w&&(w=B),"selectionStart"in q?(q.selectionStart=B,q.selectionEnd=Math.min(w,q.value.length)):(w=(B=q.ownerDocument||document)&&B.defaultView||window,w.getSelection&&\n(w=w.getSelection(),l=q.textContent.length,g=Math.min(h.start,l),h=void 0===h.end?g:Math.min(h.end,l),!w.extend&&g>h&&(l=h,h=g,g=l),l=vd(q,g),m=vd(q,h),l&&m&&(1!==w.rangeCount||w.anchorNode!==l.node||w.anchorOffset!==l.offset||w.focusNode!==m.node||w.focusOffset!==m.offset)&&(B=B.createRange(),B.setStart(l.node,l.offset),w.removeAllRanges(),g>h?(w.addRange(B),w.extend(m.node,m.offset)):(B.setEnd(m.node,m.offset),w.addRange(B))))));B=[];for(w=q;w=w.parentNode;)1===w.nodeType&&B.push({element:w,left:w.scrollLeft,\ntop:w.scrollTop});"function"===typeof q.focus&&q.focus();for(q=0;q<B.length;q++)w=B[q],w.element.scrollLeft=w.left,w.element.scrollTop=w.top}fd=!!Dd;Ed=Dd=null;a.current=c;Y=e;do try{for(q=a;null!==Y;){var ub=Y.effectTag;ub&36&&Ji(q,Y.alternate,Y);if(ub&128){B=void 0;var vb=Y.ref;if(null!==vb){var Xc=Y.stateNode;switch(Y.tag){case 5:B=Xc;break;default:B=Xc}"function"===typeof vb?vb(B):vb.current=B}}Y=Y.nextEffect}}catch(wb){if(null===Y)throw Error(u(330));Ei(Y,wb);Y=Y.nextEffect}while(null!==Y);Y=\nnull;Vf();W=f}else a.current=c;if(qj)qj=!1,rj=a,sj=b;else for(Y=e;null!==Y;)b=Y.nextEffect,Y.nextEffect=null,Y=b;b=a.firstPendingTime;0===b&&(aj=null);1073741823===b?a===vj?uj++:(uj=0,vj=a):uj=0;"function"===typeof Uj&&Uj(c.stateNode,d);Z(a);if(Yi)throw Yi=!1,a=Zi,Zi=null,a;if((W&ej)!==V)return null;gg();return null}function Tj(){for(;null!==Y;){var a=Y.effectTag;0!==(a&256)&&Gi(Y.alternate,Y);0===(a&512)||qj||(qj=!0,dg(97,function(){Dj();return null}));Y=Y.nextEffect}}\nfunction Dj(){if(90!==sj){var a=97<sj?97:sj;sj=90;return cg(a,Vj)}}function Vj(){if(null===rj)return!1;var a=rj;rj=null;if((W&(fj|gj))!==V)throw Error(u(331));var b=W;W|=gj;for(a=a.current.firstEffect;null!==a;){try{var c=a;if(0!==(c.effectTag&512))switch(c.tag){case 0:case 11:case 15:case 22:Hi(5,c),Ii(5,c)}}catch(d){if(null===a)throw Error(u(330));Ei(a,d)}c=a.nextEffect;a.nextEffect=null;a=c}W=b;gg();return!0}\nfunction Wj(a,b,c){b=Ai(c,b);b=Xi(a,b,1073741823);xg(a,b);a=xj(a,1073741823);null!==a&&Z(a)}function Ei(a,b){if(3===a.tag)Wj(a,a,b);else for(var c=a.return;null!==c;){if(3===c.tag){Wj(c,a,b);break}else if(1===c.tag){var d=c.stateNode;if("function"===typeof c.type.getDerivedStateFromError||"function"===typeof d.componentDidCatch&&(null===aj||!aj.has(d))){a=Ai(b,a);a=$i(c,a,1073741823);xg(c,a);c=xj(c,1073741823);null!==c&&Z(c);break}}c=c.return}}\nfunction Oj(a,b,c){var d=a.pingCache;null!==d&&d.delete(b);T===a&&U===c?S===vi||S===ui&&1073741823===lj&&$f()-Ti<pj?Ej(a,U):oj=!0:Aj(a,c)&&(b=a.lastPingedTime,0!==b&&b<c||(a.lastPingedTime=c,Z(a)))}function Vi(a,b){var c=a.stateNode;null!==c&&c.delete(b);b=0;0===b&&(b=Gg(),b=Hg(b,a,null));a=xj(a,b);null!==a&&Z(a)}var Rj;\nRj=function(a,b,c){var d=b.expirationTime;if(null!==a){var e=b.pendingProps;if(a.memoizedProps!==e||K.current)rg=!0;else{if(d<c){rg=!1;switch(b.tag){case 3:hi(b);Xh();break;case 5:fh(b);if(b.mode&4&&1!==c&&e.hidden)return b.expirationTime=b.childExpirationTime=1,null;break;case 1:L(b.type)&&Gf(b);break;case 4:dh(b,b.stateNode.containerInfo);break;case 10:d=b.memoizedProps.value;e=b.type._context;I(jg,e._currentValue);e._currentValue=d;break;case 13:if(null!==b.memoizedState){d=b.child.childExpirationTime;\nif(0!==d&&d>=c)return ji(a,b,c);I(M,M.current&1);b=$h(a,b,c);return null!==b?b.sibling:null}I(M,M.current&1);break;case 19:d=b.childExpirationTime>=c;if(0!==(a.effectTag&64)){if(d)return mi(a,b,c);b.effectTag|=64}e=b.memoizedState;null!==e&&(e.rendering=null,e.tail=null);I(M,M.current);if(!d)return null}return $h(a,b,c)}rg=!1}}else rg=!1;b.expirationTime=0;switch(b.tag){case 2:d=b.type;null!==a&&(a.alternate=null,b.alternate=null,b.effectTag|=2);a=b.pendingProps;e=Cf(b,J.current);qg(b,c);e=oh(null,\nb,d,a,e,c);b.effectTag|=1;if("object"===typeof e&&null!==e&&"function"===typeof e.render&&void 0===e.$$typeof){b.tag=1;b.memoizedState=null;b.updateQueue=null;if(L(d)){var f=!0;Gf(b)}else f=!1;b.memoizedState=null!==e.state&&void 0!==e.state?e.state:null;ug(b);var g=d.getDerivedStateFromProps;"function"===typeof g&&Fg(b,d,g,a);e.updater=Jg;b.stateNode=e;e._reactInternalFiber=b;Ng(b,d,a,c);b=gi(null,b,d,!0,f,c)}else b.tag=0,R(null,b,e,c),b=b.child;return b;case 16:a:{e=b.elementType;null!==a&&(a.alternate=\nnull,b.alternate=null,b.effectTag|=2);a=b.pendingProps;ob(e);if(1!==e._status)throw e._result;e=e._result;b.type=e;f=b.tag=Xj(e);a=ig(e,a);switch(f){case 0:b=di(null,b,e,a,c);break a;case 1:b=fi(null,b,e,a,c);break a;case 11:b=Zh(null,b,e,a,c);break a;case 14:b=ai(null,b,e,ig(e.type,a),d,c);break a}throw Error(u(306,e,""));}return b;case 0:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:ig(d,e),di(a,b,d,e,c);case 1:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:ig(d,e),fi(a,b,d,e,c);\ncase 3:hi(b);d=b.updateQueue;if(null===a||null===d)throw Error(u(282));d=b.pendingProps;e=b.memoizedState;e=null!==e?e.element:null;vg(a,b);zg(b,d,null,c);d=b.memoizedState.element;if(d===e)Xh(),b=$h(a,b,c);else{if(e=b.stateNode.hydrate)Ph=Jd(b.stateNode.containerInfo.firstChild),Oh=b,e=Qh=!0;if(e)for(c=Yg(b,null,d,c),b.child=c;c;)c.effectTag=c.effectTag&-3|1024,c=c.sibling;else R(a,b,d,c),Xh();b=b.child}return b;case 5:return fh(b),null===a&&Uh(b),d=b.type,e=b.pendingProps,f=null!==a?a.memoizedProps:\nnull,g=e.children,Gd(d,e)?g=null:null!==f&&Gd(d,f)&&(b.effectTag|=16),ei(a,b),b.mode&4&&1!==c&&e.hidden?(b.expirationTime=b.childExpirationTime=1,b=null):(R(a,b,g,c),b=b.child),b;case 6:return null===a&&Uh(b),null;case 13:return ji(a,b,c);case 4:return dh(b,b.stateNode.containerInfo),d=b.pendingProps,null===a?b.child=Xg(b,null,d,c):R(a,b,d,c),b.child;case 11:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:ig(d,e),Zh(a,b,d,e,c);case 7:return R(a,b,b.pendingProps,c),b.child;case 8:return R(a,\nb,b.pendingProps.children,c),b.child;case 12:return R(a,b,b.pendingProps.children,c),b.child;case 10:a:{d=b.type._context;e=b.pendingProps;g=b.memoizedProps;f=e.value;var h=b.type._context;I(jg,h._currentValue);h._currentValue=f;if(null!==g)if(h=g.value,f=$e(h,f)?0:("function"===typeof d._calculateChangedBits?d._calculateChangedBits(h,f):1073741823)|0,0===f){if(g.children===e.children&&!K.current){b=$h(a,b,c);break a}}else for(h=b.child,null!==h&&(h.return=b);null!==h;){var k=h.dependencies;if(null!==\nk){g=h.child;for(var l=k.firstContext;null!==l;){if(l.context===d&&0!==(l.observedBits&f)){1===h.tag&&(l=wg(c,null),l.tag=2,xg(h,l));h.expirationTime<c&&(h.expirationTime=c);l=h.alternate;null!==l&&l.expirationTime<c&&(l.expirationTime=c);pg(h.return,c);k.expirationTime<c&&(k.expirationTime=c);break}l=l.next}}else g=10===h.tag?h.type===b.type?null:h.child:h.child;if(null!==g)g.return=h;else for(g=h;null!==g;){if(g===b){g=null;break}h=g.sibling;if(null!==h){h.return=g.return;g=h;break}g=g.return}h=\ng}R(a,b,e.children,c);b=b.child}return b;case 9:return e=b.type,f=b.pendingProps,d=f.children,qg(b,c),e=sg(e,f.unstable_observedBits),d=d(e),b.effectTag|=1,R(a,b,d,c),b.child;case 14:return e=b.type,f=ig(e,b.pendingProps),f=ig(e.type,f),ai(a,b,e,f,d,c);case 15:return ci(a,b,b.type,b.pendingProps,d,c);case 17:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:ig(d,e),null!==a&&(a.alternate=null,b.alternate=null,b.effectTag|=2),b.tag=1,L(d)?(a=!0,Gf(b)):a=!1,qg(b,c),Lg(b,d,e),Ng(b,d,e,c),gi(null,\nb,d,!0,a,c);case 19:return mi(a,b,c)}throw Error(u(156,b.tag));};var Uj=null,Li=null;function Yj(a){if("undefined"===typeof __REACT_DEVTOOLS_GLOBAL_HOOK__)return!1;var b=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(b.isDisabled||!b.supportsFiber)return!0;try{var c=b.inject(a);Uj=function(a){try{b.onCommitFiberRoot(c,a,void 0,64===(a.current.effectTag&64))}catch(e){}};Li=function(a){try{b.onCommitFiberUnmount(c,a)}catch(e){}}}catch(d){}return!0}\nfunction Zj(a,b,c,d){this.tag=a;this.key=c;this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null;this.index=0;this.ref=null;this.pendingProps=b;this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null;this.mode=d;this.effectTag=0;this.lastEffect=this.firstEffect=this.nextEffect=null;this.childExpirationTime=this.expirationTime=0;this.alternate=null}function Sh(a,b,c,d){return new Zj(a,b,c,d)}\nfunction bi(a){a=a.prototype;return!(!a||!a.isReactComponent)}function Xj(a){if("function"===typeof a)return bi(a)?1:0;if(void 0!==a&&null!==a){a=a.$$typeof;if(a===gb)return 11;if(a===jb)return 14}return 2}\nfunction Sg(a,b){var c=a.alternate;null===c?(c=Sh(a.tag,b,a.key,a.mode),c.elementType=a.elementType,c.type=a.type,c.stateNode=a.stateNode,c.alternate=a,a.alternate=c):(c.pendingProps=b,c.effectTag=0,c.nextEffect=null,c.firstEffect=null,c.lastEffect=null);c.childExpirationTime=a.childExpirationTime;c.expirationTime=a.expirationTime;c.child=a.child;c.memoizedProps=a.memoizedProps;c.memoizedState=a.memoizedState;c.updateQueue=a.updateQueue;b=a.dependencies;c.dependencies=null===b?null:{expirationTime:b.expirationTime,\nfirstContext:b.firstContext,responders:b.responders};c.sibling=a.sibling;c.index=a.index;c.ref=a.ref;return c}\nfunction Ug(a,b,c,d,e,f){var g=2;d=a;if("function"===typeof a)bi(a)&&(g=1);else if("string"===typeof a)g=5;else a:switch(a){case ab:return Wg(c.children,e,f,b);case fb:g=8;e|=7;break;case bb:g=8;e|=1;break;case cb:return a=Sh(12,c,b,e|8),a.elementType=cb,a.type=cb,a.expirationTime=f,a;case hb:return a=Sh(13,c,b,e),a.type=hb,a.elementType=hb,a.expirationTime=f,a;case ib:return a=Sh(19,c,b,e),a.elementType=ib,a.expirationTime=f,a;default:if("object"===typeof a&&null!==a)switch(a.$$typeof){case db:g=\n10;break a;case eb:g=9;break a;case gb:g=11;break a;case jb:g=14;break a;case kb:g=16;d=null;break a;case lb:g=22;break a}throw Error(u(130,null==a?a:typeof a,""));}b=Sh(g,c,b,e);b.elementType=a;b.type=d;b.expirationTime=f;return b}function Wg(a,b,c,d){a=Sh(7,a,d,b);a.expirationTime=c;return a}function Tg(a,b,c){a=Sh(6,a,null,b);a.expirationTime=c;return a}\nfunction Vg(a,b,c){b=Sh(4,null!==a.children?a.children:[],a.key,b);b.expirationTime=c;b.stateNode={containerInfo:a.containerInfo,pendingChildren:null,implementation:a.implementation};return b}\nfunction ak(a,b,c){this.tag=b;this.current=null;this.containerInfo=a;this.pingCache=this.pendingChildren=null;this.finishedExpirationTime=0;this.finishedWork=null;this.timeoutHandle=-1;this.pendingContext=this.context=null;this.hydrate=c;this.callbackNode=null;this.callbackPriority=90;this.lastExpiredTime=this.lastPingedTime=this.nextKnownPendingLevel=this.lastSuspendedTime=this.firstSuspendedTime=this.firstPendingTime=0}\nfunction Aj(a,b){var c=a.firstSuspendedTime;a=a.lastSuspendedTime;return 0!==c&&c>=b&&a<=b}function xi(a,b){var c=a.firstSuspendedTime,d=a.lastSuspendedTime;c<b&&(a.firstSuspendedTime=b);if(d>b||0===c)a.lastSuspendedTime=b;b<=a.lastPingedTime&&(a.lastPingedTime=0);b<=a.lastExpiredTime&&(a.lastExpiredTime=0)}\nfunction yi(a,b){b>a.firstPendingTime&&(a.firstPendingTime=b);var c=a.firstSuspendedTime;0!==c&&(b>=c?a.firstSuspendedTime=a.lastSuspendedTime=a.nextKnownPendingLevel=0:b>=a.lastSuspendedTime&&(a.lastSuspendedTime=b+1),b>a.nextKnownPendingLevel&&(a.nextKnownPendingLevel=b))}function Cj(a,b){var c=a.lastExpiredTime;if(0===c||c>b)a.lastExpiredTime=b}\nfunction bk(a,b,c,d){var e=b.current,f=Gg(),g=Dg.suspense;f=Hg(f,e,g);a:if(c){c=c._reactInternalFiber;b:{if(dc(c)!==c||1!==c.tag)throw Error(u(170));var h=c;do{switch(h.tag){case 3:h=h.stateNode.context;break b;case 1:if(L(h.type)){h=h.stateNode.__reactInternalMemoizedMergedChildContext;break b}}h=h.return}while(null!==h);throw Error(u(171));}if(1===c.tag){var k=c.type;if(L(k)){c=Ff(c,k,h);break a}}c=h}else c=Af;null===b.context?b.context=c:b.pendingContext=c;b=wg(f,g);b.payload={element:a};d=void 0===\nd?null:d;null!==d&&(b.callback=d);xg(e,b);Ig(e,f);return f}function ck(a){a=a.current;if(!a.child)return null;switch(a.child.tag){case 5:return a.child.stateNode;default:return a.child.stateNode}}function dk(a,b){a=a.memoizedState;null!==a&&null!==a.dehydrated&&a.retryTime<b&&(a.retryTime=b)}function ek(a,b){dk(a,b);(a=a.alternate)&&dk(a,b)}\nfunction fk(a,b,c){c=null!=c&&!0===c.hydrate;var d=new ak(a,b,c),e=Sh(3,null,null,2===b?7:1===b?3:0);d.current=e;e.stateNode=d;ug(e);a[Od]=d.current;c&&0!==b&&Jc(a,9===a.nodeType?a:a.ownerDocument);this._internalRoot=d}fk.prototype.render=function(a){bk(a,this._internalRoot,null,null)};fk.prototype.unmount=function(){var a=this._internalRoot,b=a.containerInfo;bk(null,a,null,function(){b[Od]=null})};\nfunction gk(a){return!(!a||1!==a.nodeType&&9!==a.nodeType&&11!==a.nodeType&&(8!==a.nodeType||" react-mount-point-unstable "!==a.nodeValue))}function hk(a,b){b||(b=a?9===a.nodeType?a.documentElement:a.firstChild:null,b=!(!b||1!==b.nodeType||!b.hasAttribute("data-reactroot")));if(!b)for(var c;c=a.lastChild;)a.removeChild(c);return new fk(a,0,b?{hydrate:!0}:void 0)}\nfunction ik(a,b,c,d,e){var f=c._reactRootContainer;if(f){var g=f._internalRoot;if("function"===typeof e){var h=e;e=function(){var a=ck(g);h.call(a)}}bk(b,g,a,e)}else{f=c._reactRootContainer=hk(c,d);g=f._internalRoot;if("function"===typeof e){var k=e;e=function(){var a=ck(g);k.call(a)}}Nj(function(){bk(b,g,a,e)})}return ck(g)}function jk(a,b,c){var d=3<arguments.length&&void 0!==arguments[3]?arguments[3]:null;return{$$typeof:$a,key:null==d?null:""+d,children:a,containerInfo:b,implementation:c}}\nwc=function(a){if(13===a.tag){var b=hg(Gg(),150,100);Ig(a,b);ek(a,b)}};xc=function(a){13===a.tag&&(Ig(a,3),ek(a,3))};yc=function(a){if(13===a.tag){var b=Gg();b=Hg(b,a,null);Ig(a,b);ek(a,b)}};\nza=function(a,b,c){switch(b){case "input":Cb(a,c);b=c.name;if("radio"===c.type&&null!=b){for(c=a;c.parentNode;)c=c.parentNode;c=c.querySelectorAll("input[name="+JSON.stringify(""+b)+\'][type="radio"]\');for(b=0;b<c.length;b++){var d=c[b];if(d!==a&&d.form===a.form){var e=Qd(d);if(!e)throw Error(u(90));yb(d);Cb(d,e)}}}break;case "textarea":Kb(a,c);break;case "select":b=c.value,null!=b&&Hb(a,!!c.multiple,b,!1)}};Fa=Mj;\nGa=function(a,b,c,d,e){var f=W;W|=4;try{return cg(98,a.bind(null,b,c,d,e))}finally{W=f,W===V&&gg()}};Ha=function(){(W&(1|fj|gj))===V&&(Lj(),Dj())};Ia=function(a,b){var c=W;W|=2;try{return a(b)}finally{W=c,W===V&&gg()}};function kk(a,b){var c=2<arguments.length&&void 0!==arguments[2]?arguments[2]:null;if(!gk(b))throw Error(u(200));return jk(a,b,null,c)}var lk={Events:[Nc,Pd,Qd,xa,ta,Xd,function(a){jc(a,Wd)},Da,Ea,id,mc,Dj,{current:!1}]};\n(function(a){var b=a.findFiberByHostInstance;return Yj(n({},a,{overrideHookState:null,overrideProps:null,setSuspenseHandler:null,scheduleUpdate:null,currentDispatcherRef:Wa.ReactCurrentDispatcher,findHostInstanceByFiber:function(a){a=hc(a);return null===a?null:a.stateNode},findFiberByHostInstance:function(a){return b?b(a):null},findHostInstancesForRefresh:null,scheduleRefresh:null,scheduleRoot:null,setRefreshHandler:null,getCurrentFiber:null}))})({findFiberByHostInstance:tc,bundleType:0,version:"16.14.0",\nrendererPackageName:"react-dom"});exports.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=lk;exports.createPortal=kk;exports.findDOMNode=function(a){if(null==a)return null;if(1===a.nodeType)return a;var b=a._reactInternalFiber;if(void 0===b){if("function"===typeof a.render)throw Error(u(188));throw Error(u(268,Object.keys(a)));}a=hc(b);a=null===a?null:a.stateNode;return a};\nexports.flushSync=function(a,b){if((W&(fj|gj))!==V)throw Error(u(187));var c=W;W|=1;try{return cg(99,a.bind(null,b))}finally{W=c,gg()}};exports.hydrate=function(a,b,c){if(!gk(b))throw Error(u(200));return ik(null,a,b,!0,c)};exports.render=function(a,b,c){if(!gk(b))throw Error(u(200));return ik(null,a,b,!1,c)};\nexports.unmountComponentAtNode=function(a){if(!gk(a))throw Error(u(40));return a._reactRootContainer?(Nj(function(){ik(null,null,a,!1,function(){a._reactRootContainer=null;a[Od]=null})}),!0):!1};exports.unstable_batchedUpdates=Mj;exports.unstable_createPortal=function(a,b){return kk(a,b,2<arguments.length&&void 0!==arguments[2]?arguments[2]:null)};\nexports.unstable_renderSubtreeIntoContainer=function(a,b,c,d){if(!gk(c))throw Error(u(200));if(null==a||void 0===a._reactInternalFiber)throw Error(u(38));return ik(a,b,c,!1,d)};exports.version="16.14.0";\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTguanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVhY3QtZG9tL2Nqcy9yZWFjdC1kb20ucHJvZHVjdGlvbi5taW4uanM/Y2E1ZCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiogQGxpY2Vuc2UgUmVhY3QgdjE2LjE0LjBcbiAqIHJlYWN0LWRvbS5wcm9kdWN0aW9uLm1pbi5qc1xuICpcbiAqIENvcHlyaWdodCAoYykgRmFjZWJvb2ssIEluYy4gYW5kIGl0cyBhZmZpbGlhdGVzLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbi8qXG4gTW9kZXJuaXpyIDMuMC4wcHJlIChDdXN0b20gQnVpbGQpIHwgTUlUXG4qL1xuJ3VzZSBzdHJpY3QnO3ZhciBhYT1yZXF1aXJlKFwicmVhY3RcIiksbj1yZXF1aXJlKFwib2JqZWN0LWFzc2lnblwiKSxyPXJlcXVpcmUoXCJzY2hlZHVsZXJcIik7ZnVuY3Rpb24gdShhKXtmb3IodmFyIGI9XCJodHRwczovL3JlYWN0anMub3JnL2RvY3MvZXJyb3ItZGVjb2Rlci5odG1sP2ludmFyaWFudD1cIithLGM9MTtjPGFyZ3VtZW50cy5sZW5ndGg7YysrKWIrPVwiJmFyZ3NbXT1cIitlbmNvZGVVUklDb21wb25lbnQoYXJndW1lbnRzW2NdKTtyZXR1cm5cIk1pbmlmaWVkIFJlYWN0IGVycm9yICNcIithK1wiOyB2aXNpdCBcIitiK1wiIGZvciB0aGUgZnVsbCBtZXNzYWdlIG9yIHVzZSB0aGUgbm9uLW1pbmlmaWVkIGRldiBlbnZpcm9ubWVudCBmb3IgZnVsbCBlcnJvcnMgYW5kIGFkZGl0aW9uYWwgaGVscGZ1bCB3YXJuaW5ncy5cIn1pZighYWEpdGhyb3cgRXJyb3IodSgyMjcpKTtcbmZ1bmN0aW9uIGJhKGEsYixjLGQsZSxmLGcsaCxrKXt2YXIgbD1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMyk7dHJ5e2IuYXBwbHkoYyxsKX1jYXRjaChtKXt0aGlzLm9uRXJyb3IobSl9fXZhciBkYT0hMSxlYT1udWxsLGZhPSExLGhhPW51bGwsaWE9e29uRXJyb3I6ZnVuY3Rpb24oYSl7ZGE9ITA7ZWE9YX19O2Z1bmN0aW9uIGphKGEsYixjLGQsZSxmLGcsaCxrKXtkYT0hMTtlYT1udWxsO2JhLmFwcGx5KGlhLGFyZ3VtZW50cyl9ZnVuY3Rpb24ga2EoYSxiLGMsZCxlLGYsZyxoLGspe2phLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtpZihkYSl7aWYoZGEpe3ZhciBsPWVhO2RhPSExO2VhPW51bGx9ZWxzZSB0aHJvdyBFcnJvcih1KDE5OCkpO2ZhfHwoZmE9ITAsaGE9bCl9fXZhciBsYT1udWxsLG1hPW51bGwsbmE9bnVsbDtcbmZ1bmN0aW9uIG9hKGEsYixjKXt2YXIgZD1hLnR5cGV8fFwidW5rbm93bi1ldmVudFwiO2EuY3VycmVudFRhcmdldD1uYShjKTtrYShkLGIsdm9pZCAwLGEpO2EuY3VycmVudFRhcmdldD1udWxsfXZhciBwYT1udWxsLHFhPXt9O1xuZnVuY3Rpb24gcmEoKXtpZihwYSlmb3IodmFyIGEgaW4gcWEpe3ZhciBiPXFhW2FdLGM9cGEuaW5kZXhPZihhKTtpZighKC0xPGMpKXRocm93IEVycm9yKHUoOTYsYSkpO2lmKCFzYVtjXSl7aWYoIWIuZXh0cmFjdEV2ZW50cyl0aHJvdyBFcnJvcih1KDk3LGEpKTtzYVtjXT1iO2M9Yi5ldmVudFR5cGVzO2Zvcih2YXIgZCBpbiBjKXt2YXIgZT12b2lkIDA7dmFyIGY9Y1tkXSxnPWIsaD1kO2lmKHRhLmhhc093blByb3BlcnR5KGgpKXRocm93IEVycm9yKHUoOTksaCkpO3RhW2hdPWY7dmFyIGs9Zi5waGFzZWRSZWdpc3RyYXRpb25OYW1lcztpZihrKXtmb3IoZSBpbiBrKWsuaGFzT3duUHJvcGVydHkoZSkmJnVhKGtbZV0sZyxoKTtlPSEwfWVsc2UgZi5yZWdpc3RyYXRpb25OYW1lPyh1YShmLnJlZ2lzdHJhdGlvbk5hbWUsZyxoKSxlPSEwKTplPSExO2lmKCFlKXRocm93IEVycm9yKHUoOTgsZCxhKSk7fX19fVxuZnVuY3Rpb24gdWEoYSxiLGMpe2lmKHZhW2FdKXRocm93IEVycm9yKHUoMTAwLGEpKTt2YVthXT1iO3dhW2FdPWIuZXZlbnRUeXBlc1tjXS5kZXBlbmRlbmNpZXN9dmFyIHNhPVtdLHRhPXt9LHZhPXt9LHdhPXt9O2Z1bmN0aW9uIHhhKGEpe3ZhciBiPSExLGM7Zm9yKGMgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGMpKXt2YXIgZD1hW2NdO2lmKCFxYS5oYXNPd25Qcm9wZXJ0eShjKXx8cWFbY10hPT1kKXtpZihxYVtjXSl0aHJvdyBFcnJvcih1KDEwMixjKSk7cWFbY109ZDtiPSEwfX1iJiZyYSgpfXZhciB5YT0hKFwidW5kZWZpbmVkXCI9PT10eXBlb2Ygd2luZG93fHxcInVuZGVmaW5lZFwiPT09dHlwZW9mIHdpbmRvdy5kb2N1bWVudHx8XCJ1bmRlZmluZWRcIj09PXR5cGVvZiB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCksemE9bnVsbCxBYT1udWxsLEJhPW51bGw7XG5mdW5jdGlvbiBDYShhKXtpZihhPW1hKGEpKXtpZihcImZ1bmN0aW9uXCIhPT10eXBlb2YgemEpdGhyb3cgRXJyb3IodSgyODApKTt2YXIgYj1hLnN0YXRlTm9kZTtiJiYoYj1sYShiKSx6YShhLnN0YXRlTm9kZSxhLnR5cGUsYikpfX1mdW5jdGlvbiBEYShhKXtBYT9CYT9CYS5wdXNoKGEpOkJhPVthXTpBYT1hfWZ1bmN0aW9uIEVhKCl7aWYoQWEpe3ZhciBhPUFhLGI9QmE7QmE9QWE9bnVsbDtDYShhKTtpZihiKWZvcihhPTA7YTxiLmxlbmd0aDthKyspQ2EoYlthXSl9fWZ1bmN0aW9uIEZhKGEsYil7cmV0dXJuIGEoYil9ZnVuY3Rpb24gR2EoYSxiLGMsZCxlKXtyZXR1cm4gYShiLGMsZCxlKX1mdW5jdGlvbiBIYSgpe312YXIgSWE9RmEsSmE9ITEsS2E9ITE7ZnVuY3Rpb24gTGEoKXtpZihudWxsIT09QWF8fG51bGwhPT1CYSlIYSgpLEVhKCl9XG5mdW5jdGlvbiBNYShhLGIsYyl7aWYoS2EpcmV0dXJuIGEoYixjKTtLYT0hMDt0cnl7cmV0dXJuIElhKGEsYixjKX1maW5hbGx5e0thPSExLExhKCl9fXZhciBOYT0vXls6QS1aX2EtelxcdTAwQzAtXFx1MDBENlxcdTAwRDgtXFx1MDBGNlxcdTAwRjgtXFx1MDJGRlxcdTAzNzAtXFx1MDM3RFxcdTAzN0YtXFx1MUZGRlxcdTIwMEMtXFx1MjAwRFxcdTIwNzAtXFx1MjE4RlxcdTJDMDAtXFx1MkZFRlxcdTMwMDEtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZGRF1bOkEtWl9hLXpcXHUwMEMwLVxcdTAwRDZcXHUwMEQ4LVxcdTAwRjZcXHUwMEY4LVxcdTAyRkZcXHUwMzcwLVxcdTAzN0RcXHUwMzdGLVxcdTFGRkZcXHUyMDBDLVxcdTIwMERcXHUyMDcwLVxcdTIxOEZcXHUyQzAwLVxcdTJGRUZcXHUzMDAxLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRkRcXC0uMC05XFx1MDBCN1xcdTAzMDAtXFx1MDM2RlxcdTIwM0YtXFx1MjA0MF0qJC8sT2E9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxQYT17fSxRYT17fTtcbmZ1bmN0aW9uIFJhKGEpe2lmKE9hLmNhbGwoUWEsYSkpcmV0dXJuITA7aWYoT2EuY2FsbChQYSxhKSlyZXR1cm4hMTtpZihOYS50ZXN0KGEpKXJldHVybiBRYVthXT0hMDtQYVthXT0hMDtyZXR1cm4hMX1mdW5jdGlvbiBTYShhLGIsYyxkKXtpZihudWxsIT09YyYmMD09PWMudHlwZSlyZXR1cm4hMTtzd2l0Y2godHlwZW9mIGIpe2Nhc2UgXCJmdW5jdGlvblwiOmNhc2UgXCJzeW1ib2xcIjpyZXR1cm4hMDtjYXNlIFwiYm9vbGVhblwiOmlmKGQpcmV0dXJuITE7aWYobnVsbCE9PWMpcmV0dXJuIWMuYWNjZXB0c0Jvb2xlYW5zO2E9YS50b0xvd2VyQ2FzZSgpLnNsaWNlKDAsNSk7cmV0dXJuXCJkYXRhLVwiIT09YSYmXCJhcmlhLVwiIT09YTtkZWZhdWx0OnJldHVybiExfX1cbmZ1bmN0aW9uIFRhKGEsYixjLGQpe2lmKG51bGw9PT1ifHxcInVuZGVmaW5lZFwiPT09dHlwZW9mIGJ8fFNhKGEsYixjLGQpKXJldHVybiEwO2lmKGQpcmV0dXJuITE7aWYobnVsbCE9PWMpc3dpdGNoKGMudHlwZSl7Y2FzZSAzOnJldHVybiFiO2Nhc2UgNDpyZXR1cm4hMT09PWI7Y2FzZSA1OnJldHVybiBpc05hTihiKTtjYXNlIDY6cmV0dXJuIGlzTmFOKGIpfHwxPmJ9cmV0dXJuITF9ZnVuY3Rpb24gdihhLGIsYyxkLGUsZil7dGhpcy5hY2NlcHRzQm9vbGVhbnM9Mj09PWJ8fDM9PT1ifHw0PT09Yjt0aGlzLmF0dHJpYnV0ZU5hbWU9ZDt0aGlzLmF0dHJpYnV0ZU5hbWVzcGFjZT1lO3RoaXMubXVzdFVzZVByb3BlcnR5PWM7dGhpcy5wcm9wZXJ0eU5hbWU9YTt0aGlzLnR5cGU9Yjt0aGlzLnNhbml0aXplVVJMPWZ9dmFyIEM9e307XG5cImNoaWxkcmVuIGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MIGRlZmF1bHRWYWx1ZSBkZWZhdWx0Q2hlY2tlZCBpbm5lckhUTUwgc3VwcHJlc3NDb250ZW50RWRpdGFibGVXYXJuaW5nIHN1cHByZXNzSHlkcmF0aW9uV2FybmluZyBzdHlsZVwiLnNwbGl0KFwiIFwiKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe0NbYV09bmV3IHYoYSwwLCExLGEsbnVsbCwhMSl9KTtbW1wiYWNjZXB0Q2hhcnNldFwiLFwiYWNjZXB0LWNoYXJzZXRcIl0sW1wiY2xhc3NOYW1lXCIsXCJjbGFzc1wiXSxbXCJodG1sRm9yXCIsXCJmb3JcIl0sW1wiaHR0cEVxdWl2XCIsXCJodHRwLWVxdWl2XCJdXS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3ZhciBiPWFbMF07Q1tiXT1uZXcgdihiLDEsITEsYVsxXSxudWxsLCExKX0pO1tcImNvbnRlbnRFZGl0YWJsZVwiLFwiZHJhZ2dhYmxlXCIsXCJzcGVsbENoZWNrXCIsXCJ2YWx1ZVwiXS5mb3JFYWNoKGZ1bmN0aW9uKGEpe0NbYV09bmV3IHYoYSwyLCExLGEudG9Mb3dlckNhc2UoKSxudWxsLCExKX0pO1xuW1wiYXV0b1JldmVyc2VcIixcImV4dGVybmFsUmVzb3VyY2VzUmVxdWlyZWRcIixcImZvY3VzYWJsZVwiLFwicHJlc2VydmVBbHBoYVwiXS5mb3JFYWNoKGZ1bmN0aW9uKGEpe0NbYV09bmV3IHYoYSwyLCExLGEsbnVsbCwhMSl9KTtcImFsbG93RnVsbFNjcmVlbiBhc3luYyBhdXRvRm9jdXMgYXV0b1BsYXkgY29udHJvbHMgZGVmYXVsdCBkZWZlciBkaXNhYmxlZCBkaXNhYmxlUGljdHVyZUluUGljdHVyZSBmb3JtTm9WYWxpZGF0ZSBoaWRkZW4gbG9vcCBub01vZHVsZSBub1ZhbGlkYXRlIG9wZW4gcGxheXNJbmxpbmUgcmVhZE9ubHkgcmVxdWlyZWQgcmV2ZXJzZWQgc2NvcGVkIHNlYW1sZXNzIGl0ZW1TY29wZVwiLnNwbGl0KFwiIFwiKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe0NbYV09bmV3IHYoYSwzLCExLGEudG9Mb3dlckNhc2UoKSxudWxsLCExKX0pO1xuW1wiY2hlY2tlZFwiLFwibXVsdGlwbGVcIixcIm11dGVkXCIsXCJzZWxlY3RlZFwiXS5mb3JFYWNoKGZ1bmN0aW9uKGEpe0NbYV09bmV3IHYoYSwzLCEwLGEsbnVsbCwhMSl9KTtbXCJjYXB0dXJlXCIsXCJkb3dubG9hZFwiXS5mb3JFYWNoKGZ1bmN0aW9uKGEpe0NbYV09bmV3IHYoYSw0LCExLGEsbnVsbCwhMSl9KTtbXCJjb2xzXCIsXCJyb3dzXCIsXCJzaXplXCIsXCJzcGFuXCJdLmZvckVhY2goZnVuY3Rpb24oYSl7Q1thXT1uZXcgdihhLDYsITEsYSxudWxsLCExKX0pO1tcInJvd1NwYW5cIixcInN0YXJ0XCJdLmZvckVhY2goZnVuY3Rpb24oYSl7Q1thXT1uZXcgdihhLDUsITEsYS50b0xvd2VyQ2FzZSgpLG51bGwsITEpfSk7dmFyIFVhPS9bXFwtOl0oW2Etel0pL2c7ZnVuY3Rpb24gVmEoYSl7cmV0dXJuIGFbMV0udG9VcHBlckNhc2UoKX1cblwiYWNjZW50LWhlaWdodCBhbGlnbm1lbnQtYmFzZWxpbmUgYXJhYmljLWZvcm0gYmFzZWxpbmUtc2hpZnQgY2FwLWhlaWdodCBjbGlwLXBhdGggY2xpcC1ydWxlIGNvbG9yLWludGVycG9sYXRpb24gY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzIGNvbG9yLXByb2ZpbGUgY29sb3ItcmVuZGVyaW5nIGRvbWluYW50LWJhc2VsaW5lIGVuYWJsZS1iYWNrZ3JvdW5kIGZpbGwtb3BhY2l0eSBmaWxsLXJ1bGUgZmxvb2QtY29sb3IgZmxvb2Qtb3BhY2l0eSBmb250LWZhbWlseSBmb250LXNpemUgZm9udC1zaXplLWFkanVzdCBmb250LXN0cmV0Y2ggZm9udC1zdHlsZSBmb250LXZhcmlhbnQgZm9udC13ZWlnaHQgZ2x5cGgtbmFtZSBnbHlwaC1vcmllbnRhdGlvbi1ob3Jpem9udGFsIGdseXBoLW9yaWVudGF0aW9uLXZlcnRpY2FsIGhvcml6LWFkdi14IGhvcml6LW9yaWdpbi14IGltYWdlLXJlbmRlcmluZyBsZXR0ZXItc3BhY2luZyBsaWdodGluZy1jb2xvciBtYXJrZXItZW5kIG1hcmtlci1taWQgbWFya2VyLXN0YXJ0IG92ZXJsaW5lLXBvc2l0aW9uIG92ZXJsaW5lLXRoaWNrbmVzcyBwYWludC1vcmRlciBwYW5vc2UtMSBwb2ludGVyLWV2ZW50cyByZW5kZXJpbmctaW50ZW50IHNoYXBlLXJlbmRlcmluZyBzdG9wLWNvbG9yIHN0b3Atb3BhY2l0eSBzdHJpa2V0aHJvdWdoLXBvc2l0aW9uIHN0cmlrZXRocm91Z2gtdGhpY2tuZXNzIHN0cm9rZS1kYXNoYXJyYXkgc3Ryb2tlLWRhc2hvZmZzZXQgc3Ryb2tlLWxpbmVjYXAgc3Ryb2tlLWxpbmVqb2luIHN0cm9rZS1taXRlcmxpbWl0IHN0cm9rZS1vcGFjaXR5IHN0cm9rZS13aWR0aCB0ZXh0LWFuY2hvciB0ZXh0LWRlY29yYXRpb24gdGV4dC1yZW5kZXJpbmcgdW5kZXJsaW5lLXBvc2l0aW9uIHVuZGVybGluZS10aGlja25lc3MgdW5pY29kZS1iaWRpIHVuaWNvZGUtcmFuZ2UgdW5pdHMtcGVyLWVtIHYtYWxwaGFiZXRpYyB2LWhhbmdpbmcgdi1pZGVvZ3JhcGhpYyB2LW1hdGhlbWF0aWNhbCB2ZWN0b3ItZWZmZWN0IHZlcnQtYWR2LXkgdmVydC1vcmlnaW4teCB2ZXJ0LW9yaWdpbi15IHdvcmQtc3BhY2luZyB3cml0aW5nLW1vZGUgeG1sbnM6eGxpbmsgeC1oZWlnaHRcIi5zcGxpdChcIiBcIikuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgYj1hLnJlcGxhY2UoVWEsXG5WYSk7Q1tiXT1uZXcgdihiLDEsITEsYSxudWxsLCExKX0pO1wieGxpbms6YWN0dWF0ZSB4bGluazphcmNyb2xlIHhsaW5rOnJvbGUgeGxpbms6c2hvdyB4bGluazp0aXRsZSB4bGluazp0eXBlXCIuc3BsaXQoXCIgXCIpLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5yZXBsYWNlKFVhLFZhKTtDW2JdPW5ldyB2KGIsMSwhMSxhLFwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiLCExKX0pO1tcInhtbDpiYXNlXCIsXCJ4bWw6bGFuZ1wiLFwieG1sOnNwYWNlXCJdLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5yZXBsYWNlKFVhLFZhKTtDW2JdPW5ldyB2KGIsMSwhMSxhLFwiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlXCIsITEpfSk7W1widGFiSW5kZXhcIixcImNyb3NzT3JpZ2luXCJdLmZvckVhY2goZnVuY3Rpb24oYSl7Q1thXT1uZXcgdihhLDEsITEsYS50b0xvd2VyQ2FzZSgpLG51bGwsITEpfSk7XG5DLnhsaW5rSHJlZj1uZXcgdihcInhsaW5rSHJlZlwiLDEsITEsXCJ4bGluazpocmVmXCIsXCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIsITApO1tcInNyY1wiLFwiaHJlZlwiLFwiYWN0aW9uXCIsXCJmb3JtQWN0aW9uXCJdLmZvckVhY2goZnVuY3Rpb24oYSl7Q1thXT1uZXcgdihhLDEsITEsYS50b0xvd2VyQ2FzZSgpLG51bGwsITApfSk7dmFyIFdhPWFhLl9fU0VDUkVUX0lOVEVSTkFMU19ET19OT1RfVVNFX09SX1lPVV9XSUxMX0JFX0ZJUkVEO1dhLmhhc093blByb3BlcnR5KFwiUmVhY3RDdXJyZW50RGlzcGF0Y2hlclwiKXx8KFdhLlJlYWN0Q3VycmVudERpc3BhdGNoZXI9e2N1cnJlbnQ6bnVsbH0pO1dhLmhhc093blByb3BlcnR5KFwiUmVhY3RDdXJyZW50QmF0Y2hDb25maWdcIil8fChXYS5SZWFjdEN1cnJlbnRCYXRjaENvbmZpZz17c3VzcGVuc2U6bnVsbH0pO1xuZnVuY3Rpb24gWGEoYSxiLGMsZCl7dmFyIGU9Qy5oYXNPd25Qcm9wZXJ0eShiKT9DW2JdOm51bGw7dmFyIGY9bnVsbCE9PWU/MD09PWUudHlwZTpkPyExOiEoMjxiLmxlbmd0aCl8fFwib1wiIT09YlswXSYmXCJPXCIhPT1iWzBdfHxcIm5cIiE9PWJbMV0mJlwiTlwiIT09YlsxXT8hMTohMDtmfHwoVGEoYixjLGUsZCkmJihjPW51bGwpLGR8fG51bGw9PT1lP1JhKGIpJiYobnVsbD09PWM/YS5yZW1vdmVBdHRyaWJ1dGUoYik6YS5zZXRBdHRyaWJ1dGUoYixcIlwiK2MpKTplLm11c3RVc2VQcm9wZXJ0eT9hW2UucHJvcGVydHlOYW1lXT1udWxsPT09Yz8zPT09ZS50eXBlPyExOlwiXCI6YzooYj1lLmF0dHJpYnV0ZU5hbWUsZD1lLmF0dHJpYnV0ZU5hbWVzcGFjZSxudWxsPT09Yz9hLnJlbW92ZUF0dHJpYnV0ZShiKTooZT1lLnR5cGUsYz0zPT09ZXx8ND09PWUmJiEwPT09Yz9cIlwiOlwiXCIrYyxkP2Euc2V0QXR0cmlidXRlTlMoZCxiLGMpOmEuc2V0QXR0cmlidXRlKGIsYykpKSl9XG52YXIgWWE9L14oLiopW1xcXFxcXC9dLyxFPVwiZnVuY3Rpb25cIj09PXR5cGVvZiBTeW1ib2wmJlN5bWJvbC5mb3IsWmE9RT9TeW1ib2wuZm9yKFwicmVhY3QuZWxlbWVudFwiKTo2MDEwMywkYT1FP1N5bWJvbC5mb3IoXCJyZWFjdC5wb3J0YWxcIik6NjAxMDYsYWI9RT9TeW1ib2wuZm9yKFwicmVhY3QuZnJhZ21lbnRcIik6NjAxMDcsYmI9RT9TeW1ib2wuZm9yKFwicmVhY3Quc3RyaWN0X21vZGVcIik6NjAxMDgsY2I9RT9TeW1ib2wuZm9yKFwicmVhY3QucHJvZmlsZXJcIik6NjAxMTQsZGI9RT9TeW1ib2wuZm9yKFwicmVhY3QucHJvdmlkZXJcIik6NjAxMDksZWI9RT9TeW1ib2wuZm9yKFwicmVhY3QuY29udGV4dFwiKTo2MDExMCxmYj1FP1N5bWJvbC5mb3IoXCJyZWFjdC5jb25jdXJyZW50X21vZGVcIik6NjAxMTEsZ2I9RT9TeW1ib2wuZm9yKFwicmVhY3QuZm9yd2FyZF9yZWZcIik6NjAxMTIsaGI9RT9TeW1ib2wuZm9yKFwicmVhY3Quc3VzcGVuc2VcIik6NjAxMTMsaWI9RT9TeW1ib2wuZm9yKFwicmVhY3Quc3VzcGVuc2VfbGlzdFwiKTpcbjYwMTIwLGpiPUU/U3ltYm9sLmZvcihcInJlYWN0Lm1lbW9cIik6NjAxMTUsa2I9RT9TeW1ib2wuZm9yKFwicmVhY3QubGF6eVwiKTo2MDExNixsYj1FP1N5bWJvbC5mb3IoXCJyZWFjdC5ibG9ja1wiKTo2MDEyMSxtYj1cImZ1bmN0aW9uXCI9PT10eXBlb2YgU3ltYm9sJiZTeW1ib2wuaXRlcmF0b3I7ZnVuY3Rpb24gbmIoYSl7aWYobnVsbD09PWF8fFwib2JqZWN0XCIhPT10eXBlb2YgYSlyZXR1cm4gbnVsbDthPW1iJiZhW21iXXx8YVtcIkBAaXRlcmF0b3JcIl07cmV0dXJuXCJmdW5jdGlvblwiPT09dHlwZW9mIGE/YTpudWxsfWZ1bmN0aW9uIG9iKGEpe2lmKC0xPT09YS5fc3RhdHVzKXthLl9zdGF0dXM9MDt2YXIgYj1hLl9jdG9yO2I9YigpO2EuX3Jlc3VsdD1iO2IudGhlbihmdW5jdGlvbihiKXswPT09YS5fc3RhdHVzJiYoYj1iLmRlZmF1bHQsYS5fc3RhdHVzPTEsYS5fcmVzdWx0PWIpfSxmdW5jdGlvbihiKXswPT09YS5fc3RhdHVzJiYoYS5fc3RhdHVzPTIsYS5fcmVzdWx0PWIpfSl9fVxuZnVuY3Rpb24gcGIoYSl7aWYobnVsbD09YSlyZXR1cm4gbnVsbDtpZihcImZ1bmN0aW9uXCI9PT10eXBlb2YgYSlyZXR1cm4gYS5kaXNwbGF5TmFtZXx8YS5uYW1lfHxudWxsO2lmKFwic3RyaW5nXCI9PT10eXBlb2YgYSlyZXR1cm4gYTtzd2l0Y2goYSl7Y2FzZSBhYjpyZXR1cm5cIkZyYWdtZW50XCI7Y2FzZSAkYTpyZXR1cm5cIlBvcnRhbFwiO2Nhc2UgY2I6cmV0dXJuXCJQcm9maWxlclwiO2Nhc2UgYmI6cmV0dXJuXCJTdHJpY3RNb2RlXCI7Y2FzZSBoYjpyZXR1cm5cIlN1c3BlbnNlXCI7Y2FzZSBpYjpyZXR1cm5cIlN1c3BlbnNlTGlzdFwifWlmKFwib2JqZWN0XCI9PT10eXBlb2YgYSlzd2l0Y2goYS4kJHR5cGVvZil7Y2FzZSBlYjpyZXR1cm5cIkNvbnRleHQuQ29uc3VtZXJcIjtjYXNlIGRiOnJldHVyblwiQ29udGV4dC5Qcm92aWRlclwiO2Nhc2UgZ2I6dmFyIGI9YS5yZW5kZXI7Yj1iLmRpc3BsYXlOYW1lfHxiLm5hbWV8fFwiXCI7cmV0dXJuIGEuZGlzcGxheU5hbWV8fChcIlwiIT09Yj9cIkZvcndhcmRSZWYoXCIrYitcIilcIjpcblwiRm9yd2FyZFJlZlwiKTtjYXNlIGpiOnJldHVybiBwYihhLnR5cGUpO2Nhc2UgbGI6cmV0dXJuIHBiKGEucmVuZGVyKTtjYXNlIGtiOmlmKGE9MT09PWEuX3N0YXR1cz9hLl9yZXN1bHQ6bnVsbClyZXR1cm4gcGIoYSl9cmV0dXJuIG51bGx9ZnVuY3Rpb24gcWIoYSl7dmFyIGI9XCJcIjtkb3thOnN3aXRjaChhLnRhZyl7Y2FzZSAzOmNhc2UgNDpjYXNlIDY6Y2FzZSA3OmNhc2UgMTA6Y2FzZSA5OnZhciBjPVwiXCI7YnJlYWsgYTtkZWZhdWx0OnZhciBkPWEuX2RlYnVnT3duZXIsZT1hLl9kZWJ1Z1NvdXJjZSxmPXBiKGEudHlwZSk7Yz1udWxsO2QmJihjPXBiKGQudHlwZSkpO2Q9ZjtmPVwiXCI7ZT9mPVwiIChhdCBcIitlLmZpbGVOYW1lLnJlcGxhY2UoWWEsXCJcIikrXCI6XCIrZS5saW5lTnVtYmVyK1wiKVwiOmMmJihmPVwiIChjcmVhdGVkIGJ5IFwiK2MrXCIpXCIpO2M9XCJcXG4gICAgaW4gXCIrKGR8fFwiVW5rbm93blwiKStmfWIrPWM7YT1hLnJldHVybn13aGlsZShhKTtyZXR1cm4gYn1cbmZ1bmN0aW9uIHJiKGEpe3N3aXRjaCh0eXBlb2YgYSl7Y2FzZSBcImJvb2xlYW5cIjpjYXNlIFwibnVtYmVyXCI6Y2FzZSBcIm9iamVjdFwiOmNhc2UgXCJzdHJpbmdcIjpjYXNlIFwidW5kZWZpbmVkXCI6cmV0dXJuIGE7ZGVmYXVsdDpyZXR1cm5cIlwifX1mdW5jdGlvbiBzYihhKXt2YXIgYj1hLnR5cGU7cmV0dXJuKGE9YS5ub2RlTmFtZSkmJlwiaW5wdXRcIj09PWEudG9Mb3dlckNhc2UoKSYmKFwiY2hlY2tib3hcIj09PWJ8fFwicmFkaW9cIj09PWIpfVxuZnVuY3Rpb24gdGIoYSl7dmFyIGI9c2IoYSk/XCJjaGVja2VkXCI6XCJ2YWx1ZVwiLGM9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihhLmNvbnN0cnVjdG9yLnByb3RvdHlwZSxiKSxkPVwiXCIrYVtiXTtpZighYS5oYXNPd25Qcm9wZXJ0eShiKSYmXCJ1bmRlZmluZWRcIiE9PXR5cGVvZiBjJiZcImZ1bmN0aW9uXCI9PT10eXBlb2YgYy5nZXQmJlwiZnVuY3Rpb25cIj09PXR5cGVvZiBjLnNldCl7dmFyIGU9Yy5nZXQsZj1jLnNldDtPYmplY3QuZGVmaW5lUHJvcGVydHkoYSxiLHtjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGUuY2FsbCh0aGlzKX0sc2V0OmZ1bmN0aW9uKGEpe2Q9XCJcIithO2YuY2FsbCh0aGlzLGEpfX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShhLGIse2VudW1lcmFibGU6Yy5lbnVtZXJhYmxlfSk7cmV0dXJue2dldFZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIGR9LHNldFZhbHVlOmZ1bmN0aW9uKGEpe2Q9XCJcIithfSxzdG9wVHJhY2tpbmc6ZnVuY3Rpb24oKXthLl92YWx1ZVRyYWNrZXI9XG5udWxsO2RlbGV0ZSBhW2JdfX19fWZ1bmN0aW9uIHhiKGEpe2EuX3ZhbHVlVHJhY2tlcnx8KGEuX3ZhbHVlVHJhY2tlcj10YihhKSl9ZnVuY3Rpb24geWIoYSl7aWYoIWEpcmV0dXJuITE7dmFyIGI9YS5fdmFsdWVUcmFja2VyO2lmKCFiKXJldHVybiEwO3ZhciBjPWIuZ2V0VmFsdWUoKTt2YXIgZD1cIlwiO2EmJihkPXNiKGEpP2EuY2hlY2tlZD9cInRydWVcIjpcImZhbHNlXCI6YS52YWx1ZSk7YT1kO3JldHVybiBhIT09Yz8oYi5zZXRWYWx1ZShhKSwhMCk6ITF9ZnVuY3Rpb24gemIoYSxiKXt2YXIgYz1iLmNoZWNrZWQ7cmV0dXJuIG4oe30sYix7ZGVmYXVsdENoZWNrZWQ6dm9pZCAwLGRlZmF1bHRWYWx1ZTp2b2lkIDAsdmFsdWU6dm9pZCAwLGNoZWNrZWQ6bnVsbCE9Yz9jOmEuX3dyYXBwZXJTdGF0ZS5pbml0aWFsQ2hlY2tlZH0pfVxuZnVuY3Rpb24gQWIoYSxiKXt2YXIgYz1udWxsPT1iLmRlZmF1bHRWYWx1ZT9cIlwiOmIuZGVmYXVsdFZhbHVlLGQ9bnVsbCE9Yi5jaGVja2VkP2IuY2hlY2tlZDpiLmRlZmF1bHRDaGVja2VkO2M9cmIobnVsbCE9Yi52YWx1ZT9iLnZhbHVlOmMpO2EuX3dyYXBwZXJTdGF0ZT17aW5pdGlhbENoZWNrZWQ6ZCxpbml0aWFsVmFsdWU6Yyxjb250cm9sbGVkOlwiY2hlY2tib3hcIj09PWIudHlwZXx8XCJyYWRpb1wiPT09Yi50eXBlP251bGwhPWIuY2hlY2tlZDpudWxsIT1iLnZhbHVlfX1mdW5jdGlvbiBCYihhLGIpe2I9Yi5jaGVja2VkO251bGwhPWImJlhhKGEsXCJjaGVja2VkXCIsYiwhMSl9XG5mdW5jdGlvbiBDYihhLGIpe0JiKGEsYik7dmFyIGM9cmIoYi52YWx1ZSksZD1iLnR5cGU7aWYobnVsbCE9YylpZihcIm51bWJlclwiPT09ZCl7aWYoMD09PWMmJlwiXCI9PT1hLnZhbHVlfHxhLnZhbHVlIT1jKWEudmFsdWU9XCJcIitjfWVsc2UgYS52YWx1ZSE9PVwiXCIrYyYmKGEudmFsdWU9XCJcIitjKTtlbHNlIGlmKFwic3VibWl0XCI9PT1kfHxcInJlc2V0XCI9PT1kKXthLnJlbW92ZUF0dHJpYnV0ZShcInZhbHVlXCIpO3JldHVybn1iLmhhc093blByb3BlcnR5KFwidmFsdWVcIik/RGIoYSxiLnR5cGUsYyk6Yi5oYXNPd25Qcm9wZXJ0eShcImRlZmF1bHRWYWx1ZVwiKSYmRGIoYSxiLnR5cGUscmIoYi5kZWZhdWx0VmFsdWUpKTtudWxsPT1iLmNoZWNrZWQmJm51bGwhPWIuZGVmYXVsdENoZWNrZWQmJihhLmRlZmF1bHRDaGVja2VkPSEhYi5kZWZhdWx0Q2hlY2tlZCl9XG5mdW5jdGlvbiBFYihhLGIsYyl7aWYoYi5oYXNPd25Qcm9wZXJ0eShcInZhbHVlXCIpfHxiLmhhc093blByb3BlcnR5KFwiZGVmYXVsdFZhbHVlXCIpKXt2YXIgZD1iLnR5cGU7aWYoIShcInN1Ym1pdFwiIT09ZCYmXCJyZXNldFwiIT09ZHx8dm9pZCAwIT09Yi52YWx1ZSYmbnVsbCE9PWIudmFsdWUpKXJldHVybjtiPVwiXCIrYS5fd3JhcHBlclN0YXRlLmluaXRpYWxWYWx1ZTtjfHxiPT09YS52YWx1ZXx8KGEudmFsdWU9Yik7YS5kZWZhdWx0VmFsdWU9Yn1jPWEubmFtZTtcIlwiIT09YyYmKGEubmFtZT1cIlwiKTthLmRlZmF1bHRDaGVja2VkPSEhYS5fd3JhcHBlclN0YXRlLmluaXRpYWxDaGVja2VkO1wiXCIhPT1jJiYoYS5uYW1lPWMpfVxuZnVuY3Rpb24gRGIoYSxiLGMpe2lmKFwibnVtYmVyXCIhPT1ifHxhLm93bmVyRG9jdW1lbnQuYWN0aXZlRWxlbWVudCE9PWEpbnVsbD09Yz9hLmRlZmF1bHRWYWx1ZT1cIlwiK2EuX3dyYXBwZXJTdGF0ZS5pbml0aWFsVmFsdWU6YS5kZWZhdWx0VmFsdWUhPT1cIlwiK2MmJihhLmRlZmF1bHRWYWx1ZT1cIlwiK2MpfWZ1bmN0aW9uIEZiKGEpe3ZhciBiPVwiXCI7YWEuQ2hpbGRyZW4uZm9yRWFjaChhLGZ1bmN0aW9uKGEpe251bGwhPWEmJihiKz1hKX0pO3JldHVybiBifWZ1bmN0aW9uIEdiKGEsYil7YT1uKHtjaGlsZHJlbjp2b2lkIDB9LGIpO2lmKGI9RmIoYi5jaGlsZHJlbikpYS5jaGlsZHJlbj1iO3JldHVybiBhfVxuZnVuY3Rpb24gSGIoYSxiLGMsZCl7YT1hLm9wdGlvbnM7aWYoYil7Yj17fTtmb3IodmFyIGU9MDtlPGMubGVuZ3RoO2UrKyliW1wiJFwiK2NbZV1dPSEwO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspZT1iLmhhc093blByb3BlcnR5KFwiJFwiK2FbY10udmFsdWUpLGFbY10uc2VsZWN0ZWQhPT1lJiYoYVtjXS5zZWxlY3RlZD1lKSxlJiZkJiYoYVtjXS5kZWZhdWx0U2VsZWN0ZWQ9ITApfWVsc2V7Yz1cIlwiK3JiKGMpO2I9bnVsbDtmb3IoZT0wO2U8YS5sZW5ndGg7ZSsrKXtpZihhW2VdLnZhbHVlPT09Yyl7YVtlXS5zZWxlY3RlZD0hMDtkJiYoYVtlXS5kZWZhdWx0U2VsZWN0ZWQ9ITApO3JldHVybn1udWxsIT09Ynx8YVtlXS5kaXNhYmxlZHx8KGI9YVtlXSl9bnVsbCE9PWImJihiLnNlbGVjdGVkPSEwKX19XG5mdW5jdGlvbiBJYihhLGIpe2lmKG51bGwhPWIuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwpdGhyb3cgRXJyb3IodSg5MSkpO3JldHVybiBuKHt9LGIse3ZhbHVlOnZvaWQgMCxkZWZhdWx0VmFsdWU6dm9pZCAwLGNoaWxkcmVuOlwiXCIrYS5fd3JhcHBlclN0YXRlLmluaXRpYWxWYWx1ZX0pfWZ1bmN0aW9uIEpiKGEsYil7dmFyIGM9Yi52YWx1ZTtpZihudWxsPT1jKXtjPWIuY2hpbGRyZW47Yj1iLmRlZmF1bHRWYWx1ZTtpZihudWxsIT1jKXtpZihudWxsIT1iKXRocm93IEVycm9yKHUoOTIpKTtpZihBcnJheS5pc0FycmF5KGMpKXtpZighKDE+PWMubGVuZ3RoKSl0aHJvdyBFcnJvcih1KDkzKSk7Yz1jWzBdfWI9Y31udWxsPT1iJiYoYj1cIlwiKTtjPWJ9YS5fd3JhcHBlclN0YXRlPXtpbml0aWFsVmFsdWU6cmIoYyl9fVxuZnVuY3Rpb24gS2IoYSxiKXt2YXIgYz1yYihiLnZhbHVlKSxkPXJiKGIuZGVmYXVsdFZhbHVlKTtudWxsIT1jJiYoYz1cIlwiK2MsYyE9PWEudmFsdWUmJihhLnZhbHVlPWMpLG51bGw9PWIuZGVmYXVsdFZhbHVlJiZhLmRlZmF1bHRWYWx1ZSE9PWMmJihhLmRlZmF1bHRWYWx1ZT1jKSk7bnVsbCE9ZCYmKGEuZGVmYXVsdFZhbHVlPVwiXCIrZCl9ZnVuY3Rpb24gTGIoYSl7dmFyIGI9YS50ZXh0Q29udGVudDtiPT09YS5fd3JhcHBlclN0YXRlLmluaXRpYWxWYWx1ZSYmXCJcIiE9PWImJm51bGwhPT1iJiYoYS52YWx1ZT1iKX12YXIgTWI9e2h0bWw6XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sXCIsbWF0aG1sOlwiaHR0cDovL3d3dy53My5vcmcvMTk5OC9NYXRoL01hdGhNTFwiLHN2ZzpcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJ9O1xuZnVuY3Rpb24gTmIoYSl7c3dpdGNoKGEpe2Nhc2UgXCJzdmdcIjpyZXR1cm5cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI7Y2FzZSBcIm1hdGhcIjpyZXR1cm5cImh0dHA6Ly93d3cudzMub3JnLzE5OTgvTWF0aC9NYXRoTUxcIjtkZWZhdWx0OnJldHVyblwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbFwifX1mdW5jdGlvbiBPYihhLGIpe3JldHVybiBudWxsPT1hfHxcImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWxcIj09PWE/TmIoYik6XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPT09YSYmXCJmb3JlaWduT2JqZWN0XCI9PT1iP1wiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbFwiOmF9XG52YXIgUGIsUWI9ZnVuY3Rpb24oYSl7cmV0dXJuXCJ1bmRlZmluZWRcIiE9PXR5cGVvZiBNU0FwcCYmTVNBcHAuZXhlY1Vuc2FmZUxvY2FsRnVuY3Rpb24/ZnVuY3Rpb24oYixjLGQsZSl7TVNBcHAuZXhlY1Vuc2FmZUxvY2FsRnVuY3Rpb24oZnVuY3Rpb24oKXtyZXR1cm4gYShiLGMsZCxlKX0pfTphfShmdW5jdGlvbihhLGIpe2lmKGEubmFtZXNwYWNlVVJJIT09TWIuc3ZnfHxcImlubmVySFRNTFwiaW4gYSlhLmlubmVySFRNTD1iO2Vsc2V7UGI9UGJ8fGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7UGIuaW5uZXJIVE1MPVwiPHN2Zz5cIitiLnZhbHVlT2YoKS50b1N0cmluZygpK1wiPC9zdmc+XCI7Zm9yKGI9UGIuZmlyc3RDaGlsZDthLmZpcnN0Q2hpbGQ7KWEucmVtb3ZlQ2hpbGQoYS5maXJzdENoaWxkKTtmb3IoO2IuZmlyc3RDaGlsZDspYS5hcHBlbmRDaGlsZChiLmZpcnN0Q2hpbGQpfX0pO1xuZnVuY3Rpb24gUmIoYSxiKXtpZihiKXt2YXIgYz1hLmZpcnN0Q2hpbGQ7aWYoYyYmYz09PWEubGFzdENoaWxkJiYzPT09Yy5ub2RlVHlwZSl7Yy5ub2RlVmFsdWU9YjtyZXR1cm59fWEudGV4dENvbnRlbnQ9Yn1mdW5jdGlvbiBTYihhLGIpe3ZhciBjPXt9O2NbYS50b0xvd2VyQ2FzZSgpXT1iLnRvTG93ZXJDYXNlKCk7Y1tcIldlYmtpdFwiK2FdPVwid2Via2l0XCIrYjtjW1wiTW96XCIrYV09XCJtb3pcIitiO3JldHVybiBjfXZhciBUYj17YW5pbWF0aW9uZW5kOlNiKFwiQW5pbWF0aW9uXCIsXCJBbmltYXRpb25FbmRcIiksYW5pbWF0aW9uaXRlcmF0aW9uOlNiKFwiQW5pbWF0aW9uXCIsXCJBbmltYXRpb25JdGVyYXRpb25cIiksYW5pbWF0aW9uc3RhcnQ6U2IoXCJBbmltYXRpb25cIixcIkFuaW1hdGlvblN0YXJ0XCIpLHRyYW5zaXRpb25lbmQ6U2IoXCJUcmFuc2l0aW9uXCIsXCJUcmFuc2l0aW9uRW5kXCIpfSxVYj17fSxWYj17fTtcbnlhJiYoVmI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKS5zdHlsZSxcIkFuaW1hdGlvbkV2ZW50XCJpbiB3aW5kb3d8fChkZWxldGUgVGIuYW5pbWF0aW9uZW5kLmFuaW1hdGlvbixkZWxldGUgVGIuYW5pbWF0aW9uaXRlcmF0aW9uLmFuaW1hdGlvbixkZWxldGUgVGIuYW5pbWF0aW9uc3RhcnQuYW5pbWF0aW9uKSxcIlRyYW5zaXRpb25FdmVudFwiaW4gd2luZG93fHxkZWxldGUgVGIudHJhbnNpdGlvbmVuZC50cmFuc2l0aW9uKTtmdW5jdGlvbiBXYihhKXtpZihVYlthXSlyZXR1cm4gVWJbYV07aWYoIVRiW2FdKXJldHVybiBhO3ZhciBiPVRiW2FdLGM7Zm9yKGMgaW4gYilpZihiLmhhc093blByb3BlcnR5KGMpJiZjIGluIFZiKXJldHVybiBVYlthXT1iW2NdO3JldHVybiBhfVxudmFyIFhiPVdiKFwiYW5pbWF0aW9uZW5kXCIpLFliPVdiKFwiYW5pbWF0aW9uaXRlcmF0aW9uXCIpLFpiPVdiKFwiYW5pbWF0aW9uc3RhcnRcIiksJGI9V2IoXCJ0cmFuc2l0aW9uZW5kXCIpLGFjPVwiYWJvcnQgY2FucGxheSBjYW5wbGF5dGhyb3VnaCBkdXJhdGlvbmNoYW5nZSBlbXB0aWVkIGVuY3J5cHRlZCBlbmRlZCBlcnJvciBsb2FkZWRkYXRhIGxvYWRlZG1ldGFkYXRhIGxvYWRzdGFydCBwYXVzZSBwbGF5IHBsYXlpbmcgcHJvZ3Jlc3MgcmF0ZWNoYW5nZSBzZWVrZWQgc2Vla2luZyBzdGFsbGVkIHN1c3BlbmQgdGltZXVwZGF0ZSB2b2x1bWVjaGFuZ2Ugd2FpdGluZ1wiLnNwbGl0KFwiIFwiKSxiYz1uZXcgKFwiZnVuY3Rpb25cIj09PXR5cGVvZiBXZWFrTWFwP1dlYWtNYXA6TWFwKTtmdW5jdGlvbiBjYyhhKXt2YXIgYj1iYy5nZXQoYSk7dm9pZCAwPT09YiYmKGI9bmV3IE1hcCxiYy5zZXQoYSxiKSk7cmV0dXJuIGJ9XG5mdW5jdGlvbiBkYyhhKXt2YXIgYj1hLGM9YTtpZihhLmFsdGVybmF0ZSlmb3IoO2IucmV0dXJuOyliPWIucmV0dXJuO2Vsc2V7YT1iO2RvIGI9YSwwIT09KGIuZWZmZWN0VGFnJjEwMjYpJiYoYz1iLnJldHVybiksYT1iLnJldHVybjt3aGlsZShhKX1yZXR1cm4gMz09PWIudGFnP2M6bnVsbH1mdW5jdGlvbiBlYyhhKXtpZigxMz09PWEudGFnKXt2YXIgYj1hLm1lbW9pemVkU3RhdGU7bnVsbD09PWImJihhPWEuYWx0ZXJuYXRlLG51bGwhPT1hJiYoYj1hLm1lbW9pemVkU3RhdGUpKTtpZihudWxsIT09YilyZXR1cm4gYi5kZWh5ZHJhdGVkfXJldHVybiBudWxsfWZ1bmN0aW9uIGZjKGEpe2lmKGRjKGEpIT09YSl0aHJvdyBFcnJvcih1KDE4OCkpO31cbmZ1bmN0aW9uIGdjKGEpe3ZhciBiPWEuYWx0ZXJuYXRlO2lmKCFiKXtiPWRjKGEpO2lmKG51bGw9PT1iKXRocm93IEVycm9yKHUoMTg4KSk7cmV0dXJuIGIhPT1hP251bGw6YX1mb3IodmFyIGM9YSxkPWI7Oyl7dmFyIGU9Yy5yZXR1cm47aWYobnVsbD09PWUpYnJlYWs7dmFyIGY9ZS5hbHRlcm5hdGU7aWYobnVsbD09PWYpe2Q9ZS5yZXR1cm47aWYobnVsbCE9PWQpe2M9ZDtjb250aW51ZX1icmVha31pZihlLmNoaWxkPT09Zi5jaGlsZCl7Zm9yKGY9ZS5jaGlsZDtmOyl7aWYoZj09PWMpcmV0dXJuIGZjKGUpLGE7aWYoZj09PWQpcmV0dXJuIGZjKGUpLGI7Zj1mLnNpYmxpbmd9dGhyb3cgRXJyb3IodSgxODgpKTt9aWYoYy5yZXR1cm4hPT1kLnJldHVybiljPWUsZD1mO2Vsc2V7Zm9yKHZhciBnPSExLGg9ZS5jaGlsZDtoOyl7aWYoaD09PWMpe2c9ITA7Yz1lO2Q9ZjticmVha31pZihoPT09ZCl7Zz0hMDtkPWU7Yz1mO2JyZWFrfWg9aC5zaWJsaW5nfWlmKCFnKXtmb3IoaD1mLmNoaWxkO2g7KXtpZihoPT09XG5jKXtnPSEwO2M9ZjtkPWU7YnJlYWt9aWYoaD09PWQpe2c9ITA7ZD1mO2M9ZTticmVha31oPWguc2libGluZ31pZighZyl0aHJvdyBFcnJvcih1KDE4OSkpO319aWYoYy5hbHRlcm5hdGUhPT1kKXRocm93IEVycm9yKHUoMTkwKSk7fWlmKDMhPT1jLnRhZyl0aHJvdyBFcnJvcih1KDE4OCkpO3JldHVybiBjLnN0YXRlTm9kZS5jdXJyZW50PT09Yz9hOmJ9ZnVuY3Rpb24gaGMoYSl7YT1nYyhhKTtpZighYSlyZXR1cm4gbnVsbDtmb3IodmFyIGI9YTs7KXtpZig1PT09Yi50YWd8fDY9PT1iLnRhZylyZXR1cm4gYjtpZihiLmNoaWxkKWIuY2hpbGQucmV0dXJuPWIsYj1iLmNoaWxkO2Vsc2V7aWYoYj09PWEpYnJlYWs7Zm9yKDshYi5zaWJsaW5nOyl7aWYoIWIucmV0dXJufHxiLnJldHVybj09PWEpcmV0dXJuIG51bGw7Yj1iLnJldHVybn1iLnNpYmxpbmcucmV0dXJuPWIucmV0dXJuO2I9Yi5zaWJsaW5nfX1yZXR1cm4gbnVsbH1cbmZ1bmN0aW9uIGljKGEsYil7aWYobnVsbD09Yil0aHJvdyBFcnJvcih1KDMwKSk7aWYobnVsbD09YSlyZXR1cm4gYjtpZihBcnJheS5pc0FycmF5KGEpKXtpZihBcnJheS5pc0FycmF5KGIpKXJldHVybiBhLnB1c2guYXBwbHkoYSxiKSxhO2EucHVzaChiKTtyZXR1cm4gYX1yZXR1cm4gQXJyYXkuaXNBcnJheShiKT9bYV0uY29uY2F0KGIpOlthLGJdfWZ1bmN0aW9uIGpjKGEsYixjKXtBcnJheS5pc0FycmF5KGEpP2EuZm9yRWFjaChiLGMpOmEmJmIuY2FsbChjLGEpfXZhciBrYz1udWxsO1xuZnVuY3Rpb24gbGMoYSl7aWYoYSl7dmFyIGI9YS5fZGlzcGF0Y2hMaXN0ZW5lcnMsYz1hLl9kaXNwYXRjaEluc3RhbmNlcztpZihBcnJheS5pc0FycmF5KGIpKWZvcih2YXIgZD0wO2Q8Yi5sZW5ndGgmJiFhLmlzUHJvcGFnYXRpb25TdG9wcGVkKCk7ZCsrKW9hKGEsYltkXSxjW2RdKTtlbHNlIGImJm9hKGEsYixjKTthLl9kaXNwYXRjaExpc3RlbmVycz1udWxsO2EuX2Rpc3BhdGNoSW5zdGFuY2VzPW51bGw7YS5pc1BlcnNpc3RlbnQoKXx8YS5jb25zdHJ1Y3Rvci5yZWxlYXNlKGEpfX1mdW5jdGlvbiBtYyhhKXtudWxsIT09YSYmKGtjPWljKGtjLGEpKTthPWtjO2tjPW51bGw7aWYoYSl7amMoYSxsYyk7aWYoa2MpdGhyb3cgRXJyb3IodSg5NSkpO2lmKGZhKXRocm93IGE9aGEsZmE9ITEsaGE9bnVsbCxhO319XG5mdW5jdGlvbiBuYyhhKXthPWEudGFyZ2V0fHxhLnNyY0VsZW1lbnR8fHdpbmRvdzthLmNvcnJlc3BvbmRpbmdVc2VFbGVtZW50JiYoYT1hLmNvcnJlc3BvbmRpbmdVc2VFbGVtZW50KTtyZXR1cm4gMz09PWEubm9kZVR5cGU/YS5wYXJlbnROb2RlOmF9ZnVuY3Rpb24gb2MoYSl7aWYoIXlhKXJldHVybiExO2E9XCJvblwiK2E7dmFyIGI9YSBpbiBkb2N1bWVudDtifHwoYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpLGIuc2V0QXR0cmlidXRlKGEsXCJyZXR1cm47XCIpLGI9XCJmdW5jdGlvblwiPT09dHlwZW9mIGJbYV0pO3JldHVybiBifXZhciBwYz1bXTtmdW5jdGlvbiBxYyhhKXthLnRvcExldmVsVHlwZT1udWxsO2EubmF0aXZlRXZlbnQ9bnVsbDthLnRhcmdldEluc3Q9bnVsbDthLmFuY2VzdG9ycy5sZW5ndGg9MDsxMD5wYy5sZW5ndGgmJnBjLnB1c2goYSl9XG5mdW5jdGlvbiByYyhhLGIsYyxkKXtpZihwYy5sZW5ndGgpe3ZhciBlPXBjLnBvcCgpO2UudG9wTGV2ZWxUeXBlPWE7ZS5ldmVudFN5c3RlbUZsYWdzPWQ7ZS5uYXRpdmVFdmVudD1iO2UudGFyZ2V0SW5zdD1jO3JldHVybiBlfXJldHVybnt0b3BMZXZlbFR5cGU6YSxldmVudFN5c3RlbUZsYWdzOmQsbmF0aXZlRXZlbnQ6Yix0YXJnZXRJbnN0OmMsYW5jZXN0b3JzOltdfX1cbmZ1bmN0aW9uIHNjKGEpe3ZhciBiPWEudGFyZ2V0SW5zdCxjPWI7ZG97aWYoIWMpe2EuYW5jZXN0b3JzLnB1c2goYyk7YnJlYWt9dmFyIGQ9YztpZigzPT09ZC50YWcpZD1kLnN0YXRlTm9kZS5jb250YWluZXJJbmZvO2Vsc2V7Zm9yKDtkLnJldHVybjspZD1kLnJldHVybjtkPTMhPT1kLnRhZz9udWxsOmQuc3RhdGVOb2RlLmNvbnRhaW5lckluZm99aWYoIWQpYnJlYWs7Yj1jLnRhZzs1IT09YiYmNiE9PWJ8fGEuYW5jZXN0b3JzLnB1c2goYyk7Yz10YyhkKX13aGlsZShjKTtmb3IoYz0wO2M8YS5hbmNlc3RvcnMubGVuZ3RoO2MrKyl7Yj1hLmFuY2VzdG9yc1tjXTt2YXIgZT1uYyhhLm5hdGl2ZUV2ZW50KTtkPWEudG9wTGV2ZWxUeXBlO3ZhciBmPWEubmF0aXZlRXZlbnQsZz1hLmV2ZW50U3lzdGVtRmxhZ3M7MD09PWMmJihnfD02NCk7Zm9yKHZhciBoPW51bGwsaz0wO2s8c2EubGVuZ3RoO2srKyl7dmFyIGw9c2Fba107bCYmKGw9bC5leHRyYWN0RXZlbnRzKGQsYixmLGUsZykpJiYoaD1cbmljKGgsbCkpfW1jKGgpfX1mdW5jdGlvbiB1YyhhLGIsYyl7aWYoIWMuaGFzKGEpKXtzd2l0Y2goYSl7Y2FzZSBcInNjcm9sbFwiOnZjKGIsXCJzY3JvbGxcIiwhMCk7YnJlYWs7Y2FzZSBcImZvY3VzXCI6Y2FzZSBcImJsdXJcIjp2YyhiLFwiZm9jdXNcIiwhMCk7dmMoYixcImJsdXJcIiwhMCk7Yy5zZXQoXCJibHVyXCIsbnVsbCk7Yy5zZXQoXCJmb2N1c1wiLG51bGwpO2JyZWFrO2Nhc2UgXCJjYW5jZWxcIjpjYXNlIFwiY2xvc2VcIjpvYyhhKSYmdmMoYixhLCEwKTticmVhaztjYXNlIFwiaW52YWxpZFwiOmNhc2UgXCJzdWJtaXRcIjpjYXNlIFwicmVzZXRcIjpicmVhaztkZWZhdWx0Oi0xPT09YWMuaW5kZXhPZihhKSYmRihhLGIpfWMuc2V0KGEsbnVsbCl9fVxudmFyIHdjLHhjLHljLHpjPSExLEFjPVtdLEJjPW51bGwsQ2M9bnVsbCxEYz1udWxsLEVjPW5ldyBNYXAsRmM9bmV3IE1hcCxHYz1bXSxIYz1cIm1vdXNlZG93biBtb3VzZXVwIHRvdWNoY2FuY2VsIHRvdWNoZW5kIHRvdWNoc3RhcnQgYXV4Y2xpY2sgZGJsY2xpY2sgcG9pbnRlcmNhbmNlbCBwb2ludGVyZG93biBwb2ludGVydXAgZHJhZ2VuZCBkcmFnc3RhcnQgZHJvcCBjb21wb3NpdGlvbmVuZCBjb21wb3NpdGlvbnN0YXJ0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgaW5wdXQgdGV4dElucHV0IGNsb3NlIGNhbmNlbCBjb3B5IGN1dCBwYXN0ZSBjbGljayBjaGFuZ2UgY29udGV4dG1lbnUgcmVzZXQgc3VibWl0XCIuc3BsaXQoXCIgXCIpLEljPVwiZm9jdXMgYmx1ciBkcmFnZW50ZXIgZHJhZ2xlYXZlIG1vdXNlb3ZlciBtb3VzZW91dCBwb2ludGVyb3ZlciBwb2ludGVyb3V0IGdvdHBvaW50ZXJjYXB0dXJlIGxvc3Rwb2ludGVyY2FwdHVyZVwiLnNwbGl0KFwiIFwiKTtcbmZ1bmN0aW9uIEpjKGEsYil7dmFyIGM9Y2MoYik7SGMuZm9yRWFjaChmdW5jdGlvbihhKXt1YyhhLGIsYyl9KTtJYy5mb3JFYWNoKGZ1bmN0aW9uKGEpe3VjKGEsYixjKX0pfWZ1bmN0aW9uIEtjKGEsYixjLGQsZSl7cmV0dXJue2Jsb2NrZWRPbjphLHRvcExldmVsVHlwZTpiLGV2ZW50U3lzdGVtRmxhZ3M6Y3wzMixuYXRpdmVFdmVudDplLGNvbnRhaW5lcjpkfX1cbmZ1bmN0aW9uIExjKGEsYil7c3dpdGNoKGEpe2Nhc2UgXCJmb2N1c1wiOmNhc2UgXCJibHVyXCI6QmM9bnVsbDticmVhaztjYXNlIFwiZHJhZ2VudGVyXCI6Y2FzZSBcImRyYWdsZWF2ZVwiOkNjPW51bGw7YnJlYWs7Y2FzZSBcIm1vdXNlb3ZlclwiOmNhc2UgXCJtb3VzZW91dFwiOkRjPW51bGw7YnJlYWs7Y2FzZSBcInBvaW50ZXJvdmVyXCI6Y2FzZSBcInBvaW50ZXJvdXRcIjpFYy5kZWxldGUoYi5wb2ludGVySWQpO2JyZWFrO2Nhc2UgXCJnb3Rwb2ludGVyY2FwdHVyZVwiOmNhc2UgXCJsb3N0cG9pbnRlcmNhcHR1cmVcIjpGYy5kZWxldGUoYi5wb2ludGVySWQpfX1mdW5jdGlvbiBNYyhhLGIsYyxkLGUsZil7aWYobnVsbD09PWF8fGEubmF0aXZlRXZlbnQhPT1mKXJldHVybiBhPUtjKGIsYyxkLGUsZiksbnVsbCE9PWImJihiPU5jKGIpLG51bGwhPT1iJiZ4YyhiKSksYTthLmV2ZW50U3lzdGVtRmxhZ3N8PWQ7cmV0dXJuIGF9XG5mdW5jdGlvbiBPYyhhLGIsYyxkLGUpe3N3aXRjaChiKXtjYXNlIFwiZm9jdXNcIjpyZXR1cm4gQmM9TWMoQmMsYSxiLGMsZCxlKSwhMDtjYXNlIFwiZHJhZ2VudGVyXCI6cmV0dXJuIENjPU1jKENjLGEsYixjLGQsZSksITA7Y2FzZSBcIm1vdXNlb3ZlclwiOnJldHVybiBEYz1NYyhEYyxhLGIsYyxkLGUpLCEwO2Nhc2UgXCJwb2ludGVyb3ZlclwiOnZhciBmPWUucG9pbnRlcklkO0VjLnNldChmLE1jKEVjLmdldChmKXx8bnVsbCxhLGIsYyxkLGUpKTtyZXR1cm4hMDtjYXNlIFwiZ290cG9pbnRlcmNhcHR1cmVcIjpyZXR1cm4gZj1lLnBvaW50ZXJJZCxGYy5zZXQoZixNYyhGYy5nZXQoZil8fG51bGwsYSxiLGMsZCxlKSksITB9cmV0dXJuITF9XG5mdW5jdGlvbiBQYyhhKXt2YXIgYj10YyhhLnRhcmdldCk7aWYobnVsbCE9PWIpe3ZhciBjPWRjKGIpO2lmKG51bGwhPT1jKWlmKGI9Yy50YWcsMTM9PT1iKXtpZihiPWVjKGMpLG51bGwhPT1iKXthLmJsb2NrZWRPbj1iO3IudW5zdGFibGVfcnVuV2l0aFByaW9yaXR5KGEucHJpb3JpdHksZnVuY3Rpb24oKXt5YyhjKX0pO3JldHVybn19ZWxzZSBpZigzPT09YiYmYy5zdGF0ZU5vZGUuaHlkcmF0ZSl7YS5ibG9ja2VkT249Mz09PWMudGFnP2Muc3RhdGVOb2RlLmNvbnRhaW5lckluZm86bnVsbDtyZXR1cm59fWEuYmxvY2tlZE9uPW51bGx9ZnVuY3Rpb24gUWMoYSl7aWYobnVsbCE9PWEuYmxvY2tlZE9uKXJldHVybiExO3ZhciBiPVJjKGEudG9wTGV2ZWxUeXBlLGEuZXZlbnRTeXN0ZW1GbGFncyxhLmNvbnRhaW5lcixhLm5hdGl2ZUV2ZW50KTtpZihudWxsIT09Yil7dmFyIGM9TmMoYik7bnVsbCE9PWMmJnhjKGMpO2EuYmxvY2tlZE9uPWI7cmV0dXJuITF9cmV0dXJuITB9XG5mdW5jdGlvbiBTYyhhLGIsYyl7UWMoYSkmJmMuZGVsZXRlKGIpfWZ1bmN0aW9uIFRjKCl7Zm9yKHpjPSExOzA8QWMubGVuZ3RoOyl7dmFyIGE9QWNbMF07aWYobnVsbCE9PWEuYmxvY2tlZE9uKXthPU5jKGEuYmxvY2tlZE9uKTtudWxsIT09YSYmd2MoYSk7YnJlYWt9dmFyIGI9UmMoYS50b3BMZXZlbFR5cGUsYS5ldmVudFN5c3RlbUZsYWdzLGEuY29udGFpbmVyLGEubmF0aXZlRXZlbnQpO251bGwhPT1iP2EuYmxvY2tlZE9uPWI6QWMuc2hpZnQoKX1udWxsIT09QmMmJlFjKEJjKSYmKEJjPW51bGwpO251bGwhPT1DYyYmUWMoQ2MpJiYoQ2M9bnVsbCk7bnVsbCE9PURjJiZRYyhEYykmJihEYz1udWxsKTtFYy5mb3JFYWNoKFNjKTtGYy5mb3JFYWNoKFNjKX1mdW5jdGlvbiBVYyhhLGIpe2EuYmxvY2tlZE9uPT09YiYmKGEuYmxvY2tlZE9uPW51bGwsemN8fCh6Yz0hMCxyLnVuc3RhYmxlX3NjaGVkdWxlQ2FsbGJhY2soci51bnN0YWJsZV9Ob3JtYWxQcmlvcml0eSxUYykpKX1cbmZ1bmN0aW9uIFZjKGEpe2Z1bmN0aW9uIGIoYil7cmV0dXJuIFVjKGIsYSl9aWYoMDxBYy5sZW5ndGgpe1VjKEFjWzBdLGEpO2Zvcih2YXIgYz0xO2M8QWMubGVuZ3RoO2MrKyl7dmFyIGQ9QWNbY107ZC5ibG9ja2VkT249PT1hJiYoZC5ibG9ja2VkT249bnVsbCl9fW51bGwhPT1CYyYmVWMoQmMsYSk7bnVsbCE9PUNjJiZVYyhDYyxhKTtudWxsIT09RGMmJlVjKERjLGEpO0VjLmZvckVhY2goYik7RmMuZm9yRWFjaChiKTtmb3IoYz0wO2M8R2MubGVuZ3RoO2MrKylkPUdjW2NdLGQuYmxvY2tlZE9uPT09YSYmKGQuYmxvY2tlZE9uPW51bGwpO2Zvcig7MDxHYy5sZW5ndGgmJihjPUdjWzBdLG51bGw9PT1jLmJsb2NrZWRPbik7KVBjKGMpLG51bGw9PT1jLmJsb2NrZWRPbiYmR2Muc2hpZnQoKX1cbnZhciBXYz17fSxZYz1uZXcgTWFwLFpjPW5ldyBNYXAsJGM9W1wiYWJvcnRcIixcImFib3J0XCIsWGIsXCJhbmltYXRpb25FbmRcIixZYixcImFuaW1hdGlvbkl0ZXJhdGlvblwiLFpiLFwiYW5pbWF0aW9uU3RhcnRcIixcImNhbnBsYXlcIixcImNhblBsYXlcIixcImNhbnBsYXl0aHJvdWdoXCIsXCJjYW5QbGF5VGhyb3VnaFwiLFwiZHVyYXRpb25jaGFuZ2VcIixcImR1cmF0aW9uQ2hhbmdlXCIsXCJlbXB0aWVkXCIsXCJlbXB0aWVkXCIsXCJlbmNyeXB0ZWRcIixcImVuY3J5cHRlZFwiLFwiZW5kZWRcIixcImVuZGVkXCIsXCJlcnJvclwiLFwiZXJyb3JcIixcImdvdHBvaW50ZXJjYXB0dXJlXCIsXCJnb3RQb2ludGVyQ2FwdHVyZVwiLFwibG9hZFwiLFwibG9hZFwiLFwibG9hZGVkZGF0YVwiLFwibG9hZGVkRGF0YVwiLFwibG9hZGVkbWV0YWRhdGFcIixcImxvYWRlZE1ldGFkYXRhXCIsXCJsb2Fkc3RhcnRcIixcImxvYWRTdGFydFwiLFwibG9zdHBvaW50ZXJjYXB0dXJlXCIsXCJsb3N0UG9pbnRlckNhcHR1cmVcIixcInBsYXlpbmdcIixcInBsYXlpbmdcIixcInByb2dyZXNzXCIsXCJwcm9ncmVzc1wiLFwic2Vla2luZ1wiLFxuXCJzZWVraW5nXCIsXCJzdGFsbGVkXCIsXCJzdGFsbGVkXCIsXCJzdXNwZW5kXCIsXCJzdXNwZW5kXCIsXCJ0aW1ldXBkYXRlXCIsXCJ0aW1lVXBkYXRlXCIsJGIsXCJ0cmFuc2l0aW9uRW5kXCIsXCJ3YWl0aW5nXCIsXCJ3YWl0aW5nXCJdO2Z1bmN0aW9uIGFkKGEsYil7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKz0yKXt2YXIgZD1hW2NdLGU9YVtjKzFdLGY9XCJvblwiKyhlWzBdLnRvVXBwZXJDYXNlKCkrZS5zbGljZSgxKSk7Zj17cGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM6e2J1YmJsZWQ6ZixjYXB0dXJlZDpmK1wiQ2FwdHVyZVwifSxkZXBlbmRlbmNpZXM6W2RdLGV2ZW50UHJpb3JpdHk6Yn07WmMuc2V0KGQsYik7WWMuc2V0KGQsZik7V2NbZV09Zn19XG5hZChcImJsdXIgYmx1ciBjYW5jZWwgY2FuY2VsIGNsaWNrIGNsaWNrIGNsb3NlIGNsb3NlIGNvbnRleHRtZW51IGNvbnRleHRNZW51IGNvcHkgY29weSBjdXQgY3V0IGF1eGNsaWNrIGF1eENsaWNrIGRibGNsaWNrIGRvdWJsZUNsaWNrIGRyYWdlbmQgZHJhZ0VuZCBkcmFnc3RhcnQgZHJhZ1N0YXJ0IGRyb3AgZHJvcCBmb2N1cyBmb2N1cyBpbnB1dCBpbnB1dCBpbnZhbGlkIGludmFsaWQga2V5ZG93biBrZXlEb3duIGtleXByZXNzIGtleVByZXNzIGtleXVwIGtleVVwIG1vdXNlZG93biBtb3VzZURvd24gbW91c2V1cCBtb3VzZVVwIHBhc3RlIHBhc3RlIHBhdXNlIHBhdXNlIHBsYXkgcGxheSBwb2ludGVyY2FuY2VsIHBvaW50ZXJDYW5jZWwgcG9pbnRlcmRvd24gcG9pbnRlckRvd24gcG9pbnRlcnVwIHBvaW50ZXJVcCByYXRlY2hhbmdlIHJhdGVDaGFuZ2UgcmVzZXQgcmVzZXQgc2Vla2VkIHNlZWtlZCBzdWJtaXQgc3VibWl0IHRvdWNoY2FuY2VsIHRvdWNoQ2FuY2VsIHRvdWNoZW5kIHRvdWNoRW5kIHRvdWNoc3RhcnQgdG91Y2hTdGFydCB2b2x1bWVjaGFuZ2Ugdm9sdW1lQ2hhbmdlXCIuc3BsaXQoXCIgXCIpLDApO1xuYWQoXCJkcmFnIGRyYWcgZHJhZ2VudGVyIGRyYWdFbnRlciBkcmFnZXhpdCBkcmFnRXhpdCBkcmFnbGVhdmUgZHJhZ0xlYXZlIGRyYWdvdmVyIGRyYWdPdmVyIG1vdXNlbW92ZSBtb3VzZU1vdmUgbW91c2VvdXQgbW91c2VPdXQgbW91c2VvdmVyIG1vdXNlT3ZlciBwb2ludGVybW92ZSBwb2ludGVyTW92ZSBwb2ludGVyb3V0IHBvaW50ZXJPdXQgcG9pbnRlcm92ZXIgcG9pbnRlck92ZXIgc2Nyb2xsIHNjcm9sbCB0b2dnbGUgdG9nZ2xlIHRvdWNobW92ZSB0b3VjaE1vdmUgd2hlZWwgd2hlZWxcIi5zcGxpdChcIiBcIiksMSk7YWQoJGMsMik7Zm9yKHZhciBiZD1cImNoYW5nZSBzZWxlY3Rpb25jaGFuZ2UgdGV4dElucHV0IGNvbXBvc2l0aW9uc3RhcnQgY29tcG9zaXRpb25lbmQgY29tcG9zaXRpb251cGRhdGVcIi5zcGxpdChcIiBcIiksY2Q9MDtjZDxiZC5sZW5ndGg7Y2QrKylaYy5zZXQoYmRbY2RdLDApO1xudmFyIGRkPXIudW5zdGFibGVfVXNlckJsb2NraW5nUHJpb3JpdHksZWQ9ci51bnN0YWJsZV9ydW5XaXRoUHJpb3JpdHksZmQ9ITA7ZnVuY3Rpb24gRihhLGIpe3ZjKGIsYSwhMSl9ZnVuY3Rpb24gdmMoYSxiLGMpe3ZhciBkPVpjLmdldChiKTtzd2l0Y2godm9pZCAwPT09ZD8yOmQpe2Nhc2UgMDpkPWdkLmJpbmQobnVsbCxiLDEsYSk7YnJlYWs7Y2FzZSAxOmQ9aGQuYmluZChudWxsLGIsMSxhKTticmVhaztkZWZhdWx0OmQ9aWQuYmluZChudWxsLGIsMSxhKX1jP2EuYWRkRXZlbnRMaXN0ZW5lcihiLGQsITApOmEuYWRkRXZlbnRMaXN0ZW5lcihiLGQsITEpfWZ1bmN0aW9uIGdkKGEsYixjLGQpe0phfHxIYSgpO3ZhciBlPWlkLGY9SmE7SmE9ITA7dHJ5e0dhKGUsYSxiLGMsZCl9ZmluYWxseXsoSmE9Zil8fExhKCl9fWZ1bmN0aW9uIGhkKGEsYixjLGQpe2VkKGRkLGlkLmJpbmQobnVsbCxhLGIsYyxkKSl9XG5mdW5jdGlvbiBpZChhLGIsYyxkKXtpZihmZClpZigwPEFjLmxlbmd0aCYmLTE8SGMuaW5kZXhPZihhKSlhPUtjKG51bGwsYSxiLGMsZCksQWMucHVzaChhKTtlbHNle3ZhciBlPVJjKGEsYixjLGQpO2lmKG51bGw9PT1lKUxjKGEsZCk7ZWxzZSBpZigtMTxIYy5pbmRleE9mKGEpKWE9S2MoZSxhLGIsYyxkKSxBYy5wdXNoKGEpO2Vsc2UgaWYoIU9jKGUsYSxiLGMsZCkpe0xjKGEsZCk7YT1yYyhhLGQsbnVsbCxiKTt0cnl7TWEoc2MsYSl9ZmluYWxseXtxYyhhKX19fX1cbmZ1bmN0aW9uIFJjKGEsYixjLGQpe2M9bmMoZCk7Yz10YyhjKTtpZihudWxsIT09Yyl7dmFyIGU9ZGMoYyk7aWYobnVsbD09PWUpYz1udWxsO2Vsc2V7dmFyIGY9ZS50YWc7aWYoMTM9PT1mKXtjPWVjKGUpO2lmKG51bGwhPT1jKXJldHVybiBjO2M9bnVsbH1lbHNlIGlmKDM9PT1mKXtpZihlLnN0YXRlTm9kZS5oeWRyYXRlKXJldHVybiAzPT09ZS50YWc/ZS5zdGF0ZU5vZGUuY29udGFpbmVySW5mbzpudWxsO2M9bnVsbH1lbHNlIGUhPT1jJiYoYz1udWxsKX19YT1yYyhhLGQsYyxiKTt0cnl7TWEoc2MsYSl9ZmluYWxseXtxYyhhKX1yZXR1cm4gbnVsbH1cbnZhciBqZD17YW5pbWF0aW9uSXRlcmF0aW9uQ291bnQ6ITAsYm9yZGVySW1hZ2VPdXRzZXQ6ITAsYm9yZGVySW1hZ2VTbGljZTohMCxib3JkZXJJbWFnZVdpZHRoOiEwLGJveEZsZXg6ITAsYm94RmxleEdyb3VwOiEwLGJveE9yZGluYWxHcm91cDohMCxjb2x1bW5Db3VudDohMCxjb2x1bW5zOiEwLGZsZXg6ITAsZmxleEdyb3c6ITAsZmxleFBvc2l0aXZlOiEwLGZsZXhTaHJpbms6ITAsZmxleE5lZ2F0aXZlOiEwLGZsZXhPcmRlcjohMCxncmlkQXJlYTohMCxncmlkUm93OiEwLGdyaWRSb3dFbmQ6ITAsZ3JpZFJvd1NwYW46ITAsZ3JpZFJvd1N0YXJ0OiEwLGdyaWRDb2x1bW46ITAsZ3JpZENvbHVtbkVuZDohMCxncmlkQ29sdW1uU3BhbjohMCxncmlkQ29sdW1uU3RhcnQ6ITAsZm9udFdlaWdodDohMCxsaW5lQ2xhbXA6ITAsbGluZUhlaWdodDohMCxvcGFjaXR5OiEwLG9yZGVyOiEwLG9ycGhhbnM6ITAsdGFiU2l6ZTohMCx3aWRvd3M6ITAsekluZGV4OiEwLHpvb206ITAsZmlsbE9wYWNpdHk6ITAsXG5mbG9vZE9wYWNpdHk6ITAsc3RvcE9wYWNpdHk6ITAsc3Ryb2tlRGFzaGFycmF5OiEwLHN0cm9rZURhc2hvZmZzZXQ6ITAsc3Ryb2tlTWl0ZXJsaW1pdDohMCxzdHJva2VPcGFjaXR5OiEwLHN0cm9rZVdpZHRoOiEwfSxrZD1bXCJXZWJraXRcIixcIm1zXCIsXCJNb3pcIixcIk9cIl07T2JqZWN0LmtleXMoamQpLmZvckVhY2goZnVuY3Rpb24oYSl7a2QuZm9yRWFjaChmdW5jdGlvbihiKXtiPWIrYS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSthLnN1YnN0cmluZygxKTtqZFtiXT1qZFthXX0pfSk7ZnVuY3Rpb24gbGQoYSxiLGMpe3JldHVybiBudWxsPT1ifHxcImJvb2xlYW5cIj09PXR5cGVvZiBifHxcIlwiPT09Yj9cIlwiOmN8fFwibnVtYmVyXCIhPT10eXBlb2YgYnx8MD09PWJ8fGpkLmhhc093blByb3BlcnR5KGEpJiZqZFthXT8oXCJcIitiKS50cmltKCk6YitcInB4XCJ9XG5mdW5jdGlvbiBtZChhLGIpe2E9YS5zdHlsZTtmb3IodmFyIGMgaW4gYilpZihiLmhhc093blByb3BlcnR5KGMpKXt2YXIgZD0wPT09Yy5pbmRleE9mKFwiLS1cIiksZT1sZChjLGJbY10sZCk7XCJmbG9hdFwiPT09YyYmKGM9XCJjc3NGbG9hdFwiKTtkP2Euc2V0UHJvcGVydHkoYyxlKTphW2NdPWV9fXZhciBuZD1uKHttZW51aXRlbTohMH0se2FyZWE6ITAsYmFzZTohMCxicjohMCxjb2w6ITAsZW1iZWQ6ITAsaHI6ITAsaW1nOiEwLGlucHV0OiEwLGtleWdlbjohMCxsaW5rOiEwLG1ldGE6ITAscGFyYW06ITAsc291cmNlOiEwLHRyYWNrOiEwLHdicjohMH0pO1xuZnVuY3Rpb24gb2QoYSxiKXtpZihiKXtpZihuZFthXSYmKG51bGwhPWIuY2hpbGRyZW58fG51bGwhPWIuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwpKXRocm93IEVycm9yKHUoMTM3LGEsXCJcIikpO2lmKG51bGwhPWIuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwpe2lmKG51bGwhPWIuY2hpbGRyZW4pdGhyb3cgRXJyb3IodSg2MCkpO2lmKCEoXCJvYmplY3RcIj09PXR5cGVvZiBiLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MJiZcIl9faHRtbFwiaW4gYi5kYW5nZXJvdXNseVNldElubmVySFRNTCkpdGhyb3cgRXJyb3IodSg2MSkpO31pZihudWxsIT1iLnN0eWxlJiZcIm9iamVjdFwiIT09dHlwZW9mIGIuc3R5bGUpdGhyb3cgRXJyb3IodSg2MixcIlwiKSk7fX1cbmZ1bmN0aW9uIHBkKGEsYil7aWYoLTE9PT1hLmluZGV4T2YoXCItXCIpKXJldHVyblwic3RyaW5nXCI9PT10eXBlb2YgYi5pcztzd2l0Y2goYSl7Y2FzZSBcImFubm90YXRpb24teG1sXCI6Y2FzZSBcImNvbG9yLXByb2ZpbGVcIjpjYXNlIFwiZm9udC1mYWNlXCI6Y2FzZSBcImZvbnQtZmFjZS1zcmNcIjpjYXNlIFwiZm9udC1mYWNlLXVyaVwiOmNhc2UgXCJmb250LWZhY2UtZm9ybWF0XCI6Y2FzZSBcImZvbnQtZmFjZS1uYW1lXCI6Y2FzZSBcIm1pc3NpbmctZ2x5cGhcIjpyZXR1cm4hMTtkZWZhdWx0OnJldHVybiEwfX12YXIgcWQ9TWIuaHRtbDtmdW5jdGlvbiByZChhLGIpe2E9OT09PWEubm9kZVR5cGV8fDExPT09YS5ub2RlVHlwZT9hOmEub3duZXJEb2N1bWVudDt2YXIgYz1jYyhhKTtiPXdhW2JdO2Zvcih2YXIgZD0wO2Q8Yi5sZW5ndGg7ZCsrKXVjKGJbZF0sYSxjKX1mdW5jdGlvbiBzZCgpe31cbmZ1bmN0aW9uIHRkKGEpe2E9YXx8KFwidW5kZWZpbmVkXCIhPT10eXBlb2YgZG9jdW1lbnQ/ZG9jdW1lbnQ6dm9pZCAwKTtpZihcInVuZGVmaW5lZFwiPT09dHlwZW9mIGEpcmV0dXJuIG51bGw7dHJ5e3JldHVybiBhLmFjdGl2ZUVsZW1lbnR8fGEuYm9keX1jYXRjaChiKXtyZXR1cm4gYS5ib2R5fX1mdW5jdGlvbiB1ZChhKXtmb3IoO2EmJmEuZmlyc3RDaGlsZDspYT1hLmZpcnN0Q2hpbGQ7cmV0dXJuIGF9ZnVuY3Rpb24gdmQoYSxiKXt2YXIgYz11ZChhKTthPTA7Zm9yKHZhciBkO2M7KXtpZigzPT09Yy5ub2RlVHlwZSl7ZD1hK2MudGV4dENvbnRlbnQubGVuZ3RoO2lmKGE8PWImJmQ+PWIpcmV0dXJue25vZGU6YyxvZmZzZXQ6Yi1hfTthPWR9YTp7Zm9yKDtjOyl7aWYoYy5uZXh0U2libGluZyl7Yz1jLm5leHRTaWJsaW5nO2JyZWFrIGF9Yz1jLnBhcmVudE5vZGV9Yz12b2lkIDB9Yz11ZChjKX19XG5mdW5jdGlvbiB3ZChhLGIpe3JldHVybiBhJiZiP2E9PT1iPyEwOmEmJjM9PT1hLm5vZGVUeXBlPyExOmImJjM9PT1iLm5vZGVUeXBlP3dkKGEsYi5wYXJlbnROb2RlKTpcImNvbnRhaW5zXCJpbiBhP2EuY29udGFpbnMoYik6YS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbj8hIShhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGIpJjE2KTohMTohMX1mdW5jdGlvbiB4ZCgpe2Zvcih2YXIgYT13aW5kb3csYj10ZCgpO2IgaW5zdGFuY2VvZiBhLkhUTUxJRnJhbWVFbGVtZW50Oyl7dHJ5e3ZhciBjPVwic3RyaW5nXCI9PT10eXBlb2YgYi5jb250ZW50V2luZG93LmxvY2F0aW9uLmhyZWZ9Y2F0Y2goZCl7Yz0hMX1pZihjKWE9Yi5jb250ZW50V2luZG93O2Vsc2UgYnJlYWs7Yj10ZChhLmRvY3VtZW50KX1yZXR1cm4gYn1cbmZ1bmN0aW9uIHlkKGEpe3ZhciBiPWEmJmEubm9kZU5hbWUmJmEubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4gYiYmKFwiaW5wdXRcIj09PWImJihcInRleHRcIj09PWEudHlwZXx8XCJzZWFyY2hcIj09PWEudHlwZXx8XCJ0ZWxcIj09PWEudHlwZXx8XCJ1cmxcIj09PWEudHlwZXx8XCJwYXNzd29yZFwiPT09YS50eXBlKXx8XCJ0ZXh0YXJlYVwiPT09Ynx8XCJ0cnVlXCI9PT1hLmNvbnRlbnRFZGl0YWJsZSl9dmFyIHpkPVwiJFwiLEFkPVwiLyRcIixCZD1cIiQ/XCIsQ2Q9XCIkIVwiLERkPW51bGwsRWQ9bnVsbDtmdW5jdGlvbiBGZChhLGIpe3N3aXRjaChhKXtjYXNlIFwiYnV0dG9uXCI6Y2FzZSBcImlucHV0XCI6Y2FzZSBcInNlbGVjdFwiOmNhc2UgXCJ0ZXh0YXJlYVwiOnJldHVybiEhYi5hdXRvRm9jdXN9cmV0dXJuITF9XG5mdW5jdGlvbiBHZChhLGIpe3JldHVyblwidGV4dGFyZWFcIj09PWF8fFwib3B0aW9uXCI9PT1hfHxcIm5vc2NyaXB0XCI9PT1hfHxcInN0cmluZ1wiPT09dHlwZW9mIGIuY2hpbGRyZW58fFwibnVtYmVyXCI9PT10eXBlb2YgYi5jaGlsZHJlbnx8XCJvYmplY3RcIj09PXR5cGVvZiBiLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MJiZudWxsIT09Yi5kYW5nZXJvdXNseVNldElubmVySFRNTCYmbnVsbCE9Yi5kYW5nZXJvdXNseVNldElubmVySFRNTC5fX2h0bWx9dmFyIEhkPVwiZnVuY3Rpb25cIj09PXR5cGVvZiBzZXRUaW1lb3V0P3NldFRpbWVvdXQ6dm9pZCAwLElkPVwiZnVuY3Rpb25cIj09PXR5cGVvZiBjbGVhclRpbWVvdXQ/Y2xlYXJUaW1lb3V0OnZvaWQgMDtmdW5jdGlvbiBKZChhKXtmb3IoO251bGwhPWE7YT1hLm5leHRTaWJsaW5nKXt2YXIgYj1hLm5vZGVUeXBlO2lmKDE9PT1ifHwzPT09YilicmVha31yZXR1cm4gYX1cbmZ1bmN0aW9uIEtkKGEpe2E9YS5wcmV2aW91c1NpYmxpbmc7Zm9yKHZhciBiPTA7YTspe2lmKDg9PT1hLm5vZGVUeXBlKXt2YXIgYz1hLmRhdGE7aWYoYz09PXpkfHxjPT09Q2R8fGM9PT1CZCl7aWYoMD09PWIpcmV0dXJuIGE7Yi0tfWVsc2UgYz09PUFkJiZiKyt9YT1hLnByZXZpb3VzU2libGluZ31yZXR1cm4gbnVsbH12YXIgTGQ9TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMiksTWQ9XCJfX3JlYWN0SW50ZXJuYWxJbnN0YW5jZSRcIitMZCxOZD1cIl9fcmVhY3RFdmVudEhhbmRsZXJzJFwiK0xkLE9kPVwiX19yZWFjdENvbnRhaW5lcmUkXCIrTGQ7XG5mdW5jdGlvbiB0YyhhKXt2YXIgYj1hW01kXTtpZihiKXJldHVybiBiO2Zvcih2YXIgYz1hLnBhcmVudE5vZGU7Yzspe2lmKGI9Y1tPZF18fGNbTWRdKXtjPWIuYWx0ZXJuYXRlO2lmKG51bGwhPT1iLmNoaWxkfHxudWxsIT09YyYmbnVsbCE9PWMuY2hpbGQpZm9yKGE9S2QoYSk7bnVsbCE9PWE7KXtpZihjPWFbTWRdKXJldHVybiBjO2E9S2QoYSl9cmV0dXJuIGJ9YT1jO2M9YS5wYXJlbnROb2RlfXJldHVybiBudWxsfWZ1bmN0aW9uIE5jKGEpe2E9YVtNZF18fGFbT2RdO3JldHVybiFhfHw1IT09YS50YWcmJjYhPT1hLnRhZyYmMTMhPT1hLnRhZyYmMyE9PWEudGFnP251bGw6YX1mdW5jdGlvbiBQZChhKXtpZig1PT09YS50YWd8fDY9PT1hLnRhZylyZXR1cm4gYS5zdGF0ZU5vZGU7dGhyb3cgRXJyb3IodSgzMykpO31mdW5jdGlvbiBRZChhKXtyZXR1cm4gYVtOZF18fG51bGx9XG5mdW5jdGlvbiBSZChhKXtkbyBhPWEucmV0dXJuO3doaWxlKGEmJjUhPT1hLnRhZyk7cmV0dXJuIGE/YTpudWxsfVxuZnVuY3Rpb24gU2QoYSxiKXt2YXIgYz1hLnN0YXRlTm9kZTtpZighYylyZXR1cm4gbnVsbDt2YXIgZD1sYShjKTtpZighZClyZXR1cm4gbnVsbDtjPWRbYl07YTpzd2l0Y2goYil7Y2FzZSBcIm9uQ2xpY2tcIjpjYXNlIFwib25DbGlja0NhcHR1cmVcIjpjYXNlIFwib25Eb3VibGVDbGlja1wiOmNhc2UgXCJvbkRvdWJsZUNsaWNrQ2FwdHVyZVwiOmNhc2UgXCJvbk1vdXNlRG93blwiOmNhc2UgXCJvbk1vdXNlRG93bkNhcHR1cmVcIjpjYXNlIFwib25Nb3VzZU1vdmVcIjpjYXNlIFwib25Nb3VzZU1vdmVDYXB0dXJlXCI6Y2FzZSBcIm9uTW91c2VVcFwiOmNhc2UgXCJvbk1vdXNlVXBDYXB0dXJlXCI6Y2FzZSBcIm9uTW91c2VFbnRlclwiOihkPSFkLmRpc2FibGVkKXx8KGE9YS50eXBlLGQ9IShcImJ1dHRvblwiPT09YXx8XCJpbnB1dFwiPT09YXx8XCJzZWxlY3RcIj09PWF8fFwidGV4dGFyZWFcIj09PWEpKTthPSFkO2JyZWFrIGE7ZGVmYXVsdDphPSExfWlmKGEpcmV0dXJuIG51bGw7aWYoYyYmXCJmdW5jdGlvblwiIT09dHlwZW9mIGMpdGhyb3cgRXJyb3IodSgyMzEsXG5iLHR5cGVvZiBjKSk7cmV0dXJuIGN9ZnVuY3Rpb24gVGQoYSxiLGMpe2lmKGI9U2QoYSxjLmRpc3BhdGNoQ29uZmlnLnBoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzW2JdKSljLl9kaXNwYXRjaExpc3RlbmVycz1pYyhjLl9kaXNwYXRjaExpc3RlbmVycyxiKSxjLl9kaXNwYXRjaEluc3RhbmNlcz1pYyhjLl9kaXNwYXRjaEluc3RhbmNlcyxhKX1mdW5jdGlvbiBVZChhKXtpZihhJiZhLmRpc3BhdGNoQ29uZmlnLnBoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzKXtmb3IodmFyIGI9YS5fdGFyZ2V0SW5zdCxjPVtdO2I7KWMucHVzaChiKSxiPVJkKGIpO2ZvcihiPWMubGVuZ3RoOzA8Yi0tOylUZChjW2JdLFwiY2FwdHVyZWRcIixhKTtmb3IoYj0wO2I8Yy5sZW5ndGg7YisrKVRkKGNbYl0sXCJidWJibGVkXCIsYSl9fVxuZnVuY3Rpb24gVmQoYSxiLGMpe2EmJmMmJmMuZGlzcGF0Y2hDb25maWcucmVnaXN0cmF0aW9uTmFtZSYmKGI9U2QoYSxjLmRpc3BhdGNoQ29uZmlnLnJlZ2lzdHJhdGlvbk5hbWUpKSYmKGMuX2Rpc3BhdGNoTGlzdGVuZXJzPWljKGMuX2Rpc3BhdGNoTGlzdGVuZXJzLGIpLGMuX2Rpc3BhdGNoSW5zdGFuY2VzPWljKGMuX2Rpc3BhdGNoSW5zdGFuY2VzLGEpKX1mdW5jdGlvbiBXZChhKXthJiZhLmRpc3BhdGNoQ29uZmlnLnJlZ2lzdHJhdGlvbk5hbWUmJlZkKGEuX3RhcmdldEluc3QsbnVsbCxhKX1mdW5jdGlvbiBYZChhKXtqYyhhLFVkKX12YXIgWWQ9bnVsbCxaZD1udWxsLCRkPW51bGw7XG5mdW5jdGlvbiBhZSgpe2lmKCRkKXJldHVybiAkZDt2YXIgYSxiPVpkLGM9Yi5sZW5ndGgsZCxlPVwidmFsdWVcImluIFlkP1lkLnZhbHVlOllkLnRleHRDb250ZW50LGY9ZS5sZW5ndGg7Zm9yKGE9MDthPGMmJmJbYV09PT1lW2FdO2ErKyk7dmFyIGc9Yy1hO2ZvcihkPTE7ZDw9ZyYmYltjLWRdPT09ZVtmLWRdO2QrKyk7cmV0dXJuICRkPWUuc2xpY2UoYSwxPGQ/MS1kOnZvaWQgMCl9ZnVuY3Rpb24gYmUoKXtyZXR1cm4hMH1mdW5jdGlvbiBjZSgpe3JldHVybiExfVxuZnVuY3Rpb24gRyhhLGIsYyxkKXt0aGlzLmRpc3BhdGNoQ29uZmlnPWE7dGhpcy5fdGFyZ2V0SW5zdD1iO3RoaXMubmF0aXZlRXZlbnQ9YzthPXRoaXMuY29uc3RydWN0b3IuSW50ZXJmYWNlO2Zvcih2YXIgZSBpbiBhKWEuaGFzT3duUHJvcGVydHkoZSkmJigoYj1hW2VdKT90aGlzW2VdPWIoYyk6XCJ0YXJnZXRcIj09PWU/dGhpcy50YXJnZXQ9ZDp0aGlzW2VdPWNbZV0pO3RoaXMuaXNEZWZhdWx0UHJldmVudGVkPShudWxsIT1jLmRlZmF1bHRQcmV2ZW50ZWQ/Yy5kZWZhdWx0UHJldmVudGVkOiExPT09Yy5yZXR1cm5WYWx1ZSk/YmU6Y2U7dGhpcy5pc1Byb3BhZ2F0aW9uU3RvcHBlZD1jZTtyZXR1cm4gdGhpc31cbm4oRy5wcm90b3R5cGUse3ByZXZlbnREZWZhdWx0OmZ1bmN0aW9uKCl7dGhpcy5kZWZhdWx0UHJldmVudGVkPSEwO3ZhciBhPXRoaXMubmF0aXZlRXZlbnQ7YSYmKGEucHJldmVudERlZmF1bHQ/YS5wcmV2ZW50RGVmYXVsdCgpOlwidW5rbm93blwiIT09dHlwZW9mIGEucmV0dXJuVmFsdWUmJihhLnJldHVyblZhbHVlPSExKSx0aGlzLmlzRGVmYXVsdFByZXZlbnRlZD1iZSl9LHN0b3BQcm9wYWdhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMubmF0aXZlRXZlbnQ7YSYmKGEuc3RvcFByb3BhZ2F0aW9uP2Euc3RvcFByb3BhZ2F0aW9uKCk6XCJ1bmtub3duXCIhPT10eXBlb2YgYS5jYW5jZWxCdWJibGUmJihhLmNhbmNlbEJ1YmJsZT0hMCksdGhpcy5pc1Byb3BhZ2F0aW9uU3RvcHBlZD1iZSl9LHBlcnNpc3Q6ZnVuY3Rpb24oKXt0aGlzLmlzUGVyc2lzdGVudD1iZX0saXNQZXJzaXN0ZW50OmNlLGRlc3RydWN0b3I6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmNvbnN0cnVjdG9yLkludGVyZmFjZSxcbmI7Zm9yKGIgaW4gYSl0aGlzW2JdPW51bGw7dGhpcy5uYXRpdmVFdmVudD10aGlzLl90YXJnZXRJbnN0PXRoaXMuZGlzcGF0Y2hDb25maWc9bnVsbDt0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkPXRoaXMuaXNEZWZhdWx0UHJldmVudGVkPWNlO3RoaXMuX2Rpc3BhdGNoSW5zdGFuY2VzPXRoaXMuX2Rpc3BhdGNoTGlzdGVuZXJzPW51bGx9fSk7Ry5JbnRlcmZhY2U9e3R5cGU6bnVsbCx0YXJnZXQ6bnVsbCxjdXJyZW50VGFyZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIG51bGx9LGV2ZW50UGhhc2U6bnVsbCxidWJibGVzOm51bGwsY2FuY2VsYWJsZTpudWxsLHRpbWVTdGFtcDpmdW5jdGlvbihhKXtyZXR1cm4gYS50aW1lU3RhbXB8fERhdGUubm93KCl9LGRlZmF1bHRQcmV2ZW50ZWQ6bnVsbCxpc1RydXN0ZWQ6bnVsbH07XG5HLmV4dGVuZD1mdW5jdGlvbihhKXtmdW5jdGlvbiBiKCl7fWZ1bmN0aW9uIGMoKXtyZXR1cm4gZC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9dmFyIGQ9dGhpcztiLnByb3RvdHlwZT1kLnByb3RvdHlwZTt2YXIgZT1uZXcgYjtuKGUsYy5wcm90b3R5cGUpO2MucHJvdG90eXBlPWU7Yy5wcm90b3R5cGUuY29uc3RydWN0b3I9YztjLkludGVyZmFjZT1uKHt9LGQuSW50ZXJmYWNlLGEpO2MuZXh0ZW5kPWQuZXh0ZW5kO2RlKGMpO3JldHVybiBjfTtkZShHKTtmdW5jdGlvbiBlZShhLGIsYyxkKXtpZih0aGlzLmV2ZW50UG9vbC5sZW5ndGgpe3ZhciBlPXRoaXMuZXZlbnRQb29sLnBvcCgpO3RoaXMuY2FsbChlLGEsYixjLGQpO3JldHVybiBlfXJldHVybiBuZXcgdGhpcyhhLGIsYyxkKX1cbmZ1bmN0aW9uIGZlKGEpe2lmKCEoYSBpbnN0YW5jZW9mIHRoaXMpKXRocm93IEVycm9yKHUoMjc5KSk7YS5kZXN0cnVjdG9yKCk7MTA+dGhpcy5ldmVudFBvb2wubGVuZ3RoJiZ0aGlzLmV2ZW50UG9vbC5wdXNoKGEpfWZ1bmN0aW9uIGRlKGEpe2EuZXZlbnRQb29sPVtdO2EuZ2V0UG9vbGVkPWVlO2EucmVsZWFzZT1mZX12YXIgZ2U9Ry5leHRlbmQoe2RhdGE6bnVsbH0pLGhlPUcuZXh0ZW5kKHtkYXRhOm51bGx9KSxpZT1bOSwxMywyNywzMl0samU9eWEmJlwiQ29tcG9zaXRpb25FdmVudFwiaW4gd2luZG93LGtlPW51bGw7eWEmJlwiZG9jdW1lbnRNb2RlXCJpbiBkb2N1bWVudCYmKGtlPWRvY3VtZW50LmRvY3VtZW50TW9kZSk7XG52YXIgbGU9eWEmJlwiVGV4dEV2ZW50XCJpbiB3aW5kb3cmJiFrZSxtZT15YSYmKCFqZXx8a2UmJjg8a2UmJjExPj1rZSksbmU9U3RyaW5nLmZyb21DaGFyQ29kZSgzMiksb2U9e2JlZm9yZUlucHV0OntwaGFzZWRSZWdpc3RyYXRpb25OYW1lczp7YnViYmxlZDpcIm9uQmVmb3JlSW5wdXRcIixjYXB0dXJlZDpcIm9uQmVmb3JlSW5wdXRDYXB0dXJlXCJ9LGRlcGVuZGVuY2llczpbXCJjb21wb3NpdGlvbmVuZFwiLFwia2V5cHJlc3NcIixcInRleHRJbnB1dFwiLFwicGFzdGVcIl19LGNvbXBvc2l0aW9uRW5kOntwaGFzZWRSZWdpc3RyYXRpb25OYW1lczp7YnViYmxlZDpcIm9uQ29tcG9zaXRpb25FbmRcIixjYXB0dXJlZDpcIm9uQ29tcG9zaXRpb25FbmRDYXB0dXJlXCJ9LGRlcGVuZGVuY2llczpcImJsdXIgY29tcG9zaXRpb25lbmQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBtb3VzZWRvd25cIi5zcGxpdChcIiBcIil9LGNvbXBvc2l0aW9uU3RhcnQ6e3BoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzOntidWJibGVkOlwib25Db21wb3NpdGlvblN0YXJ0XCIsXG5jYXB0dXJlZDpcIm9uQ29tcG9zaXRpb25TdGFydENhcHR1cmVcIn0sZGVwZW5kZW5jaWVzOlwiYmx1ciBjb21wb3NpdGlvbnN0YXJ0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgbW91c2Vkb3duXCIuc3BsaXQoXCIgXCIpfSxjb21wb3NpdGlvblVwZGF0ZTp7cGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM6e2J1YmJsZWQ6XCJvbkNvbXBvc2l0aW9uVXBkYXRlXCIsY2FwdHVyZWQ6XCJvbkNvbXBvc2l0aW9uVXBkYXRlQ2FwdHVyZVwifSxkZXBlbmRlbmNpZXM6XCJibHVyIGNvbXBvc2l0aW9udXBkYXRlIGtleWRvd24ga2V5cHJlc3Mga2V5dXAgbW91c2Vkb3duXCIuc3BsaXQoXCIgXCIpfX0scGU9ITE7XG5mdW5jdGlvbiBxZShhLGIpe3N3aXRjaChhKXtjYXNlIFwia2V5dXBcIjpyZXR1cm4tMSE9PWllLmluZGV4T2YoYi5rZXlDb2RlKTtjYXNlIFwia2V5ZG93blwiOnJldHVybiAyMjkhPT1iLmtleUNvZGU7Y2FzZSBcImtleXByZXNzXCI6Y2FzZSBcIm1vdXNlZG93blwiOmNhc2UgXCJibHVyXCI6cmV0dXJuITA7ZGVmYXVsdDpyZXR1cm4hMX19ZnVuY3Rpb24gcmUoYSl7YT1hLmRldGFpbDtyZXR1cm5cIm9iamVjdFwiPT09dHlwZW9mIGEmJlwiZGF0YVwiaW4gYT9hLmRhdGE6bnVsbH12YXIgc2U9ITE7ZnVuY3Rpb24gdGUoYSxiKXtzd2l0Y2goYSl7Y2FzZSBcImNvbXBvc2l0aW9uZW5kXCI6cmV0dXJuIHJlKGIpO2Nhc2UgXCJrZXlwcmVzc1wiOmlmKDMyIT09Yi53aGljaClyZXR1cm4gbnVsbDtwZT0hMDtyZXR1cm4gbmU7Y2FzZSBcInRleHRJbnB1dFwiOnJldHVybiBhPWIuZGF0YSxhPT09bmUmJnBlP251bGw6YTtkZWZhdWx0OnJldHVybiBudWxsfX1cbmZ1bmN0aW9uIHVlKGEsYil7aWYoc2UpcmV0dXJuXCJjb21wb3NpdGlvbmVuZFwiPT09YXx8IWplJiZxZShhLGIpPyhhPWFlKCksJGQ9WmQ9WWQ9bnVsbCxzZT0hMSxhKTpudWxsO3N3aXRjaChhKXtjYXNlIFwicGFzdGVcIjpyZXR1cm4gbnVsbDtjYXNlIFwia2V5cHJlc3NcIjppZighKGIuY3RybEtleXx8Yi5hbHRLZXl8fGIubWV0YUtleSl8fGIuY3RybEtleSYmYi5hbHRLZXkpe2lmKGIuY2hhciYmMTxiLmNoYXIubGVuZ3RoKXJldHVybiBiLmNoYXI7aWYoYi53aGljaClyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShiLndoaWNoKX1yZXR1cm4gbnVsbDtjYXNlIFwiY29tcG9zaXRpb25lbmRcIjpyZXR1cm4gbWUmJlwia29cIiE9PWIubG9jYWxlP251bGw6Yi5kYXRhO2RlZmF1bHQ6cmV0dXJuIG51bGx9fVxudmFyIHZlPXtldmVudFR5cGVzOm9lLGV4dHJhY3RFdmVudHM6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU7aWYoamUpYjp7c3dpdGNoKGEpe2Nhc2UgXCJjb21wb3NpdGlvbnN0YXJ0XCI6dmFyIGY9b2UuY29tcG9zaXRpb25TdGFydDticmVhayBiO2Nhc2UgXCJjb21wb3NpdGlvbmVuZFwiOmY9b2UuY29tcG9zaXRpb25FbmQ7YnJlYWsgYjtjYXNlIFwiY29tcG9zaXRpb251cGRhdGVcIjpmPW9lLmNvbXBvc2l0aW9uVXBkYXRlO2JyZWFrIGJ9Zj12b2lkIDB9ZWxzZSBzZT9xZShhLGMpJiYoZj1vZS5jb21wb3NpdGlvbkVuZCk6XCJrZXlkb3duXCI9PT1hJiYyMjk9PT1jLmtleUNvZGUmJihmPW9lLmNvbXBvc2l0aW9uU3RhcnQpO2Y/KG1lJiZcImtvXCIhPT1jLmxvY2FsZSYmKHNlfHxmIT09b2UuY29tcG9zaXRpb25TdGFydD9mPT09b2UuY29tcG9zaXRpb25FbmQmJnNlJiYoZT1hZSgpKTooWWQ9ZCxaZD1cInZhbHVlXCJpbiBZZD9ZZC52YWx1ZTpZZC50ZXh0Q29udGVudCxzZT0hMCkpLGY9Z2UuZ2V0UG9vbGVkKGYsXG5iLGMsZCksZT9mLmRhdGE9ZTooZT1yZShjKSxudWxsIT09ZSYmKGYuZGF0YT1lKSksWGQoZiksZT1mKTplPW51bGw7KGE9bGU/dGUoYSxjKTp1ZShhLGMpKT8oYj1oZS5nZXRQb29sZWQob2UuYmVmb3JlSW5wdXQsYixjLGQpLGIuZGF0YT1hLFhkKGIpKTpiPW51bGw7cmV0dXJuIG51bGw9PT1lP2I6bnVsbD09PWI/ZTpbZSxiXX19LHdlPXtjb2xvcjohMCxkYXRlOiEwLGRhdGV0aW1lOiEwLFwiZGF0ZXRpbWUtbG9jYWxcIjohMCxlbWFpbDohMCxtb250aDohMCxudW1iZXI6ITAscGFzc3dvcmQ6ITAscmFuZ2U6ITAsc2VhcmNoOiEwLHRlbDohMCx0ZXh0OiEwLHRpbWU6ITAsdXJsOiEwLHdlZWs6ITB9O2Z1bmN0aW9uIHhlKGEpe3ZhciBiPWEmJmEubm9kZU5hbWUmJmEubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm5cImlucHV0XCI9PT1iPyEhd2VbYS50eXBlXTpcInRleHRhcmVhXCI9PT1iPyEwOiExfVxudmFyIHllPXtjaGFuZ2U6e3BoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzOntidWJibGVkOlwib25DaGFuZ2VcIixjYXB0dXJlZDpcIm9uQ2hhbmdlQ2FwdHVyZVwifSxkZXBlbmRlbmNpZXM6XCJibHVyIGNoYW5nZSBjbGljayBmb2N1cyBpbnB1dCBrZXlkb3duIGtleXVwIHNlbGVjdGlvbmNoYW5nZVwiLnNwbGl0KFwiIFwiKX19O2Z1bmN0aW9uIHplKGEsYixjKXthPUcuZ2V0UG9vbGVkKHllLmNoYW5nZSxhLGIsYyk7YS50eXBlPVwiY2hhbmdlXCI7RGEoYyk7WGQoYSk7cmV0dXJuIGF9dmFyIEFlPW51bGwsQmU9bnVsbDtmdW5jdGlvbiBDZShhKXttYyhhKX1mdW5jdGlvbiBEZShhKXt2YXIgYj1QZChhKTtpZih5YihiKSlyZXR1cm4gYX1mdW5jdGlvbiBFZShhLGIpe2lmKFwiY2hhbmdlXCI9PT1hKXJldHVybiBifXZhciBGZT0hMTt5YSYmKEZlPW9jKFwiaW5wdXRcIikmJighZG9jdW1lbnQuZG9jdW1lbnRNb2RlfHw5PGRvY3VtZW50LmRvY3VtZW50TW9kZSkpO1xuZnVuY3Rpb24gR2UoKXtBZSYmKEFlLmRldGFjaEV2ZW50KFwib25wcm9wZXJ0eWNoYW5nZVwiLEhlKSxCZT1BZT1udWxsKX1mdW5jdGlvbiBIZShhKXtpZihcInZhbHVlXCI9PT1hLnByb3BlcnR5TmFtZSYmRGUoQmUpKWlmKGE9emUoQmUsYSxuYyhhKSksSmEpbWMoYSk7ZWxzZXtKYT0hMDt0cnl7RmEoQ2UsYSl9ZmluYWxseXtKYT0hMSxMYSgpfX19ZnVuY3Rpb24gSWUoYSxiLGMpe1wiZm9jdXNcIj09PWE/KEdlKCksQWU9YixCZT1jLEFlLmF0dGFjaEV2ZW50KFwib25wcm9wZXJ0eWNoYW5nZVwiLEhlKSk6XCJibHVyXCI9PT1hJiZHZSgpfWZ1bmN0aW9uIEplKGEpe2lmKFwic2VsZWN0aW9uY2hhbmdlXCI9PT1hfHxcImtleXVwXCI9PT1hfHxcImtleWRvd25cIj09PWEpcmV0dXJuIERlKEJlKX1mdW5jdGlvbiBLZShhLGIpe2lmKFwiY2xpY2tcIj09PWEpcmV0dXJuIERlKGIpfWZ1bmN0aW9uIExlKGEsYil7aWYoXCJpbnB1dFwiPT09YXx8XCJjaGFuZ2VcIj09PWEpcmV0dXJuIERlKGIpfVxudmFyIE1lPXtldmVudFR5cGVzOnllLF9pc0lucHV0RXZlbnRTdXBwb3J0ZWQ6RmUsZXh0cmFjdEV2ZW50czpmdW5jdGlvbihhLGIsYyxkKXt2YXIgZT1iP1BkKGIpOndpbmRvdyxmPWUubm9kZU5hbWUmJmUubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtpZihcInNlbGVjdFwiPT09Znx8XCJpbnB1dFwiPT09ZiYmXCJmaWxlXCI9PT1lLnR5cGUpdmFyIGc9RWU7ZWxzZSBpZih4ZShlKSlpZihGZSlnPUxlO2Vsc2V7Zz1KZTt2YXIgaD1JZX1lbHNlKGY9ZS5ub2RlTmFtZSkmJlwiaW5wdXRcIj09PWYudG9Mb3dlckNhc2UoKSYmKFwiY2hlY2tib3hcIj09PWUudHlwZXx8XCJyYWRpb1wiPT09ZS50eXBlKSYmKGc9S2UpO2lmKGcmJihnPWcoYSxiKSkpcmV0dXJuIHplKGcsYyxkKTtoJiZoKGEsZSxiKTtcImJsdXJcIj09PWEmJihhPWUuX3dyYXBwZXJTdGF0ZSkmJmEuY29udHJvbGxlZCYmXCJudW1iZXJcIj09PWUudHlwZSYmRGIoZSxcIm51bWJlclwiLGUudmFsdWUpfX0sTmU9Ry5leHRlbmQoe3ZpZXc6bnVsbCxkZXRhaWw6bnVsbH0pLFxuT2U9e0FsdDpcImFsdEtleVwiLENvbnRyb2w6XCJjdHJsS2V5XCIsTWV0YTpcIm1ldGFLZXlcIixTaGlmdDpcInNoaWZ0S2V5XCJ9O2Z1bmN0aW9uIFBlKGEpe3ZhciBiPXRoaXMubmF0aXZlRXZlbnQ7cmV0dXJuIGIuZ2V0TW9kaWZpZXJTdGF0ZT9iLmdldE1vZGlmaWVyU3RhdGUoYSk6KGE9T2VbYV0pPyEhYlthXTohMX1mdW5jdGlvbiBRZSgpe3JldHVybiBQZX1cbnZhciBSZT0wLFNlPTAsVGU9ITEsVWU9ITEsVmU9TmUuZXh0ZW5kKHtzY3JlZW5YOm51bGwsc2NyZWVuWTpudWxsLGNsaWVudFg6bnVsbCxjbGllbnRZOm51bGwscGFnZVg6bnVsbCxwYWdlWTpudWxsLGN0cmxLZXk6bnVsbCxzaGlmdEtleTpudWxsLGFsdEtleTpudWxsLG1ldGFLZXk6bnVsbCxnZXRNb2RpZmllclN0YXRlOlFlLGJ1dHRvbjpudWxsLGJ1dHRvbnM6bnVsbCxyZWxhdGVkVGFyZ2V0OmZ1bmN0aW9uKGEpe3JldHVybiBhLnJlbGF0ZWRUYXJnZXR8fChhLmZyb21FbGVtZW50PT09YS5zcmNFbGVtZW50P2EudG9FbGVtZW50OmEuZnJvbUVsZW1lbnQpfSxtb3ZlbWVudFg6ZnVuY3Rpb24oYSl7aWYoXCJtb3ZlbWVudFhcImluIGEpcmV0dXJuIGEubW92ZW1lbnRYO3ZhciBiPVJlO1JlPWEuc2NyZWVuWDtyZXR1cm4gVGU/XCJtb3VzZW1vdmVcIj09PWEudHlwZT9hLnNjcmVlblgtYjowOihUZT0hMCwwKX0sbW92ZW1lbnRZOmZ1bmN0aW9uKGEpe2lmKFwibW92ZW1lbnRZXCJpbiBhKXJldHVybiBhLm1vdmVtZW50WTtcbnZhciBiPVNlO1NlPWEuc2NyZWVuWTtyZXR1cm4gVWU/XCJtb3VzZW1vdmVcIj09PWEudHlwZT9hLnNjcmVlblktYjowOihVZT0hMCwwKX19KSxXZT1WZS5leHRlbmQoe3BvaW50ZXJJZDpudWxsLHdpZHRoOm51bGwsaGVpZ2h0Om51bGwscHJlc3N1cmU6bnVsbCx0YW5nZW50aWFsUHJlc3N1cmU6bnVsbCx0aWx0WDpudWxsLHRpbHRZOm51bGwsdHdpc3Q6bnVsbCxwb2ludGVyVHlwZTpudWxsLGlzUHJpbWFyeTpudWxsfSksWGU9e21vdXNlRW50ZXI6e3JlZ2lzdHJhdGlvbk5hbWU6XCJvbk1vdXNlRW50ZXJcIixkZXBlbmRlbmNpZXM6W1wibW91c2VvdXRcIixcIm1vdXNlb3ZlclwiXX0sbW91c2VMZWF2ZTp7cmVnaXN0cmF0aW9uTmFtZTpcIm9uTW91c2VMZWF2ZVwiLGRlcGVuZGVuY2llczpbXCJtb3VzZW91dFwiLFwibW91c2VvdmVyXCJdfSxwb2ludGVyRW50ZXI6e3JlZ2lzdHJhdGlvbk5hbWU6XCJvblBvaW50ZXJFbnRlclwiLGRlcGVuZGVuY2llczpbXCJwb2ludGVyb3V0XCIsXCJwb2ludGVyb3ZlclwiXX0scG9pbnRlckxlYXZlOntyZWdpc3RyYXRpb25OYW1lOlwib25Qb2ludGVyTGVhdmVcIixcbmRlcGVuZGVuY2llczpbXCJwb2ludGVyb3V0XCIsXCJwb2ludGVyb3ZlclwiXX19LFllPXtldmVudFR5cGVzOlhlLGV4dHJhY3RFdmVudHM6ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZj1cIm1vdXNlb3ZlclwiPT09YXx8XCJwb2ludGVyb3ZlclwiPT09YSxnPVwibW91c2VvdXRcIj09PWF8fFwicG9pbnRlcm91dFwiPT09YTtpZihmJiYwPT09KGUmMzIpJiYoYy5yZWxhdGVkVGFyZ2V0fHxjLmZyb21FbGVtZW50KXx8IWcmJiFmKXJldHVybiBudWxsO2Y9ZC53aW5kb3c9PT1kP2Q6KGY9ZC5vd25lckRvY3VtZW50KT9mLmRlZmF1bHRWaWV3fHxmLnBhcmVudFdpbmRvdzp3aW5kb3c7aWYoZyl7aWYoZz1iLGI9KGI9Yy5yZWxhdGVkVGFyZ2V0fHxjLnRvRWxlbWVudCk/dGMoYik6bnVsbCxudWxsIT09Yil7dmFyIGg9ZGMoYik7aWYoYiE9PWh8fDUhPT1iLnRhZyYmNiE9PWIudGFnKWI9bnVsbH19ZWxzZSBnPW51bGw7aWYoZz09PWIpcmV0dXJuIG51bGw7aWYoXCJtb3VzZW91dFwiPT09YXx8XCJtb3VzZW92ZXJcIj09PVxuYSl7dmFyIGs9VmU7dmFyIGw9WGUubW91c2VMZWF2ZTt2YXIgbT1YZS5tb3VzZUVudGVyO3ZhciBwPVwibW91c2VcIn1lbHNlIGlmKFwicG9pbnRlcm91dFwiPT09YXx8XCJwb2ludGVyb3ZlclwiPT09YSlrPVdlLGw9WGUucG9pbnRlckxlYXZlLG09WGUucG9pbnRlckVudGVyLHA9XCJwb2ludGVyXCI7YT1udWxsPT1nP2Y6UGQoZyk7Zj1udWxsPT1iP2Y6UGQoYik7bD1rLmdldFBvb2xlZChsLGcsYyxkKTtsLnR5cGU9cCtcImxlYXZlXCI7bC50YXJnZXQ9YTtsLnJlbGF0ZWRUYXJnZXQ9ZjtjPWsuZ2V0UG9vbGVkKG0sYixjLGQpO2MudHlwZT1wK1wiZW50ZXJcIjtjLnRhcmdldD1mO2MucmVsYXRlZFRhcmdldD1hO2Q9ZztwPWI7aWYoZCYmcClhOntrPWQ7bT1wO2c9MDtmb3IoYT1rO2E7YT1SZChhKSlnKys7YT0wO2ZvcihiPW07YjtiPVJkKGIpKWErKztmb3IoOzA8Zy1hOylrPVJkKGspLGctLTtmb3IoOzA8YS1nOyltPVJkKG0pLGEtLTtmb3IoO2ctLTspe2lmKGs9PT1tfHxrPT09bS5hbHRlcm5hdGUpYnJlYWsgYTtcbms9UmQoayk7bT1SZChtKX1rPW51bGx9ZWxzZSBrPW51bGw7bT1rO2ZvcihrPVtdO2QmJmQhPT1tOyl7Zz1kLmFsdGVybmF0ZTtpZihudWxsIT09ZyYmZz09PW0pYnJlYWs7ay5wdXNoKGQpO2Q9UmQoZCl9Zm9yKGQ9W107cCYmcCE9PW07KXtnPXAuYWx0ZXJuYXRlO2lmKG51bGwhPT1nJiZnPT09bSlicmVhaztkLnB1c2gocCk7cD1SZChwKX1mb3IocD0wO3A8ay5sZW5ndGg7cCsrKVZkKGtbcF0sXCJidWJibGVkXCIsbCk7Zm9yKHA9ZC5sZW5ndGg7MDxwLS07KVZkKGRbcF0sXCJjYXB0dXJlZFwiLGMpO3JldHVybiAwPT09KGUmNjQpP1tsXTpbbCxjXX19O2Z1bmN0aW9uIFplKGEsYil7cmV0dXJuIGE9PT1iJiYoMCE9PWF8fDEvYT09PTEvYil8fGEhPT1hJiZiIT09Yn12YXIgJGU9XCJmdW5jdGlvblwiPT09dHlwZW9mIE9iamVjdC5pcz9PYmplY3QuaXM6WmUsYWY9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbmZ1bmN0aW9uIGJmKGEsYil7aWYoJGUoYSxiKSlyZXR1cm4hMDtpZihcIm9iamVjdFwiIT09dHlwZW9mIGF8fG51bGw9PT1hfHxcIm9iamVjdFwiIT09dHlwZW9mIGJ8fG51bGw9PT1iKXJldHVybiExO3ZhciBjPU9iamVjdC5rZXlzKGEpLGQ9T2JqZWN0LmtleXMoYik7aWYoYy5sZW5ndGghPT1kLmxlbmd0aClyZXR1cm4hMTtmb3IoZD0wO2Q8Yy5sZW5ndGg7ZCsrKWlmKCFhZi5jYWxsKGIsY1tkXSl8fCEkZShhW2NbZF1dLGJbY1tkXV0pKXJldHVybiExO3JldHVybiEwfVxudmFyIGNmPXlhJiZcImRvY3VtZW50TW9kZVwiaW4gZG9jdW1lbnQmJjExPj1kb2N1bWVudC5kb2N1bWVudE1vZGUsZGY9e3NlbGVjdDp7cGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM6e2J1YmJsZWQ6XCJvblNlbGVjdFwiLGNhcHR1cmVkOlwib25TZWxlY3RDYXB0dXJlXCJ9LGRlcGVuZGVuY2llczpcImJsdXIgY29udGV4dG1lbnUgZHJhZ2VuZCBmb2N1cyBrZXlkb3duIGtleXVwIG1vdXNlZG93biBtb3VzZXVwIHNlbGVjdGlvbmNoYW5nZVwiLnNwbGl0KFwiIFwiKX19LGVmPW51bGwsZmY9bnVsbCxnZj1udWxsLGhmPSExO1xuZnVuY3Rpb24gamYoYSxiKXt2YXIgYz1iLndpbmRvdz09PWI/Yi5kb2N1bWVudDo5PT09Yi5ub2RlVHlwZT9iOmIub3duZXJEb2N1bWVudDtpZihoZnx8bnVsbD09ZWZ8fGVmIT09dGQoYykpcmV0dXJuIG51bGw7Yz1lZjtcInNlbGVjdGlvblN0YXJ0XCJpbiBjJiZ5ZChjKT9jPXtzdGFydDpjLnNlbGVjdGlvblN0YXJ0LGVuZDpjLnNlbGVjdGlvbkVuZH06KGM9KGMub3duZXJEb2N1bWVudCYmYy5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3fHx3aW5kb3cpLmdldFNlbGVjdGlvbigpLGM9e2FuY2hvck5vZGU6Yy5hbmNob3JOb2RlLGFuY2hvck9mZnNldDpjLmFuY2hvck9mZnNldCxmb2N1c05vZGU6Yy5mb2N1c05vZGUsZm9jdXNPZmZzZXQ6Yy5mb2N1c09mZnNldH0pO3JldHVybiBnZiYmYmYoZ2YsYyk/bnVsbDooZ2Y9YyxhPUcuZ2V0UG9vbGVkKGRmLnNlbGVjdCxmZixhLGIpLGEudHlwZT1cInNlbGVjdFwiLGEudGFyZ2V0PWVmLFhkKGEpLGEpfVxudmFyIGtmPXtldmVudFR5cGVzOmRmLGV4dHJhY3RFdmVudHM6ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe2U9Znx8KGQud2luZG93PT09ZD9kLmRvY3VtZW50Ojk9PT1kLm5vZGVUeXBlP2Q6ZC5vd25lckRvY3VtZW50KTtpZighKGY9IWUpKXthOntlPWNjKGUpO2Y9d2Eub25TZWxlY3Q7Zm9yKHZhciBnPTA7ZzxmLmxlbmd0aDtnKyspaWYoIWUuaGFzKGZbZ10pKXtlPSExO2JyZWFrIGF9ZT0hMH1mPSFlfWlmKGYpcmV0dXJuIG51bGw7ZT1iP1BkKGIpOndpbmRvdztzd2l0Y2goYSl7Y2FzZSBcImZvY3VzXCI6aWYoeGUoZSl8fFwidHJ1ZVwiPT09ZS5jb250ZW50RWRpdGFibGUpZWY9ZSxmZj1iLGdmPW51bGw7YnJlYWs7Y2FzZSBcImJsdXJcIjpnZj1mZj1lZj1udWxsO2JyZWFrO2Nhc2UgXCJtb3VzZWRvd25cIjpoZj0hMDticmVhaztjYXNlIFwiY29udGV4dG1lbnVcIjpjYXNlIFwibW91c2V1cFwiOmNhc2UgXCJkcmFnZW5kXCI6cmV0dXJuIGhmPSExLGpmKGMsZCk7Y2FzZSBcInNlbGVjdGlvbmNoYW5nZVwiOmlmKGNmKWJyZWFrO1xuY2FzZSBcImtleWRvd25cIjpjYXNlIFwia2V5dXBcIjpyZXR1cm4gamYoYyxkKX1yZXR1cm4gbnVsbH19LGxmPUcuZXh0ZW5kKHthbmltYXRpb25OYW1lOm51bGwsZWxhcHNlZFRpbWU6bnVsbCxwc2V1ZG9FbGVtZW50Om51bGx9KSxtZj1HLmV4dGVuZCh7Y2xpcGJvYXJkRGF0YTpmdW5jdGlvbihhKXtyZXR1cm5cImNsaXBib2FyZERhdGFcImluIGE/YS5jbGlwYm9hcmREYXRhOndpbmRvdy5jbGlwYm9hcmREYXRhfX0pLG5mPU5lLmV4dGVuZCh7cmVsYXRlZFRhcmdldDpudWxsfSk7ZnVuY3Rpb24gb2YoYSl7dmFyIGI9YS5rZXlDb2RlO1wiY2hhckNvZGVcImluIGE/KGE9YS5jaGFyQ29kZSwwPT09YSYmMTM9PT1iJiYoYT0xMykpOmE9YjsxMD09PWEmJihhPTEzKTtyZXR1cm4gMzI8PWF8fDEzPT09YT9hOjB9XG52YXIgcGY9e0VzYzpcIkVzY2FwZVwiLFNwYWNlYmFyOlwiIFwiLExlZnQ6XCJBcnJvd0xlZnRcIixVcDpcIkFycm93VXBcIixSaWdodDpcIkFycm93UmlnaHRcIixEb3duOlwiQXJyb3dEb3duXCIsRGVsOlwiRGVsZXRlXCIsV2luOlwiT1NcIixNZW51OlwiQ29udGV4dE1lbnVcIixBcHBzOlwiQ29udGV4dE1lbnVcIixTY3JvbGw6XCJTY3JvbGxMb2NrXCIsTW96UHJpbnRhYmxlS2V5OlwiVW5pZGVudGlmaWVkXCJ9LHFmPXs4OlwiQmFja3NwYWNlXCIsOTpcIlRhYlwiLDEyOlwiQ2xlYXJcIiwxMzpcIkVudGVyXCIsMTY6XCJTaGlmdFwiLDE3OlwiQ29udHJvbFwiLDE4OlwiQWx0XCIsMTk6XCJQYXVzZVwiLDIwOlwiQ2Fwc0xvY2tcIiwyNzpcIkVzY2FwZVwiLDMyOlwiIFwiLDMzOlwiUGFnZVVwXCIsMzQ6XCJQYWdlRG93blwiLDM1OlwiRW5kXCIsMzY6XCJIb21lXCIsMzc6XCJBcnJvd0xlZnRcIiwzODpcIkFycm93VXBcIiwzOTpcIkFycm93UmlnaHRcIiw0MDpcIkFycm93RG93blwiLDQ1OlwiSW5zZXJ0XCIsNDY6XCJEZWxldGVcIiwxMTI6XCJGMVwiLDExMzpcIkYyXCIsMTE0OlwiRjNcIiwxMTU6XCJGNFwiLFxuMTE2OlwiRjVcIiwxMTc6XCJGNlwiLDExODpcIkY3XCIsMTE5OlwiRjhcIiwxMjA6XCJGOVwiLDEyMTpcIkYxMFwiLDEyMjpcIkYxMVwiLDEyMzpcIkYxMlwiLDE0NDpcIk51bUxvY2tcIiwxNDU6XCJTY3JvbGxMb2NrXCIsMjI0OlwiTWV0YVwifSxyZj1OZS5leHRlbmQoe2tleTpmdW5jdGlvbihhKXtpZihhLmtleSl7dmFyIGI9cGZbYS5rZXldfHxhLmtleTtpZihcIlVuaWRlbnRpZmllZFwiIT09YilyZXR1cm4gYn1yZXR1cm5cImtleXByZXNzXCI9PT1hLnR5cGU/KGE9b2YoYSksMTM9PT1hP1wiRW50ZXJcIjpTdHJpbmcuZnJvbUNoYXJDb2RlKGEpKTpcImtleWRvd25cIj09PWEudHlwZXx8XCJrZXl1cFwiPT09YS50eXBlP3FmW2Eua2V5Q29kZV18fFwiVW5pZGVudGlmaWVkXCI6XCJcIn0sbG9jYXRpb246bnVsbCxjdHJsS2V5Om51bGwsc2hpZnRLZXk6bnVsbCxhbHRLZXk6bnVsbCxtZXRhS2V5Om51bGwscmVwZWF0Om51bGwsbG9jYWxlOm51bGwsZ2V0TW9kaWZpZXJTdGF0ZTpRZSxjaGFyQ29kZTpmdW5jdGlvbihhKXtyZXR1cm5cImtleXByZXNzXCI9PT1cbmEudHlwZT9vZihhKTowfSxrZXlDb2RlOmZ1bmN0aW9uKGEpe3JldHVyblwia2V5ZG93blwiPT09YS50eXBlfHxcImtleXVwXCI9PT1hLnR5cGU/YS5rZXlDb2RlOjB9LHdoaWNoOmZ1bmN0aW9uKGEpe3JldHVyblwia2V5cHJlc3NcIj09PWEudHlwZT9vZihhKTpcImtleWRvd25cIj09PWEudHlwZXx8XCJrZXl1cFwiPT09YS50eXBlP2Eua2V5Q29kZTowfX0pLHNmPVZlLmV4dGVuZCh7ZGF0YVRyYW5zZmVyOm51bGx9KSx0Zj1OZS5leHRlbmQoe3RvdWNoZXM6bnVsbCx0YXJnZXRUb3VjaGVzOm51bGwsY2hhbmdlZFRvdWNoZXM6bnVsbCxhbHRLZXk6bnVsbCxtZXRhS2V5Om51bGwsY3RybEtleTpudWxsLHNoaWZ0S2V5Om51bGwsZ2V0TW9kaWZpZXJTdGF0ZTpRZX0pLHVmPUcuZXh0ZW5kKHtwcm9wZXJ0eU5hbWU6bnVsbCxlbGFwc2VkVGltZTpudWxsLHBzZXVkb0VsZW1lbnQ6bnVsbH0pLHZmPVZlLmV4dGVuZCh7ZGVsdGFYOmZ1bmN0aW9uKGEpe3JldHVyblwiZGVsdGFYXCJpbiBhP2EuZGVsdGFYOlwid2hlZWxEZWx0YVhcImluXG5hPy1hLndoZWVsRGVsdGFYOjB9LGRlbHRhWTpmdW5jdGlvbihhKXtyZXR1cm5cImRlbHRhWVwiaW4gYT9hLmRlbHRhWTpcIndoZWVsRGVsdGFZXCJpbiBhPy1hLndoZWVsRGVsdGFZOlwid2hlZWxEZWx0YVwiaW4gYT8tYS53aGVlbERlbHRhOjB9LGRlbHRhWjpudWxsLGRlbHRhTW9kZTpudWxsfSksd2Y9e2V2ZW50VHlwZXM6V2MsZXh0cmFjdEV2ZW50czpmdW5jdGlvbihhLGIsYyxkKXt2YXIgZT1ZYy5nZXQoYSk7aWYoIWUpcmV0dXJuIG51bGw7c3dpdGNoKGEpe2Nhc2UgXCJrZXlwcmVzc1wiOmlmKDA9PT1vZihjKSlyZXR1cm4gbnVsbDtjYXNlIFwia2V5ZG93blwiOmNhc2UgXCJrZXl1cFwiOmE9cmY7YnJlYWs7Y2FzZSBcImJsdXJcIjpjYXNlIFwiZm9jdXNcIjphPW5mO2JyZWFrO2Nhc2UgXCJjbGlja1wiOmlmKDI9PT1jLmJ1dHRvbilyZXR1cm4gbnVsbDtjYXNlIFwiYXV4Y2xpY2tcIjpjYXNlIFwiZGJsY2xpY2tcIjpjYXNlIFwibW91c2Vkb3duXCI6Y2FzZSBcIm1vdXNlbW92ZVwiOmNhc2UgXCJtb3VzZXVwXCI6Y2FzZSBcIm1vdXNlb3V0XCI6Y2FzZSBcIm1vdXNlb3ZlclwiOmNhc2UgXCJjb250ZXh0bWVudVwiOmE9XG5WZTticmVhaztjYXNlIFwiZHJhZ1wiOmNhc2UgXCJkcmFnZW5kXCI6Y2FzZSBcImRyYWdlbnRlclwiOmNhc2UgXCJkcmFnZXhpdFwiOmNhc2UgXCJkcmFnbGVhdmVcIjpjYXNlIFwiZHJhZ292ZXJcIjpjYXNlIFwiZHJhZ3N0YXJ0XCI6Y2FzZSBcImRyb3BcIjphPXNmO2JyZWFrO2Nhc2UgXCJ0b3VjaGNhbmNlbFwiOmNhc2UgXCJ0b3VjaGVuZFwiOmNhc2UgXCJ0b3VjaG1vdmVcIjpjYXNlIFwidG91Y2hzdGFydFwiOmE9dGY7YnJlYWs7Y2FzZSBYYjpjYXNlIFliOmNhc2UgWmI6YT1sZjticmVhaztjYXNlICRiOmE9dWY7YnJlYWs7Y2FzZSBcInNjcm9sbFwiOmE9TmU7YnJlYWs7Y2FzZSBcIndoZWVsXCI6YT12ZjticmVhaztjYXNlIFwiY29weVwiOmNhc2UgXCJjdXRcIjpjYXNlIFwicGFzdGVcIjphPW1mO2JyZWFrO2Nhc2UgXCJnb3Rwb2ludGVyY2FwdHVyZVwiOmNhc2UgXCJsb3N0cG9pbnRlcmNhcHR1cmVcIjpjYXNlIFwicG9pbnRlcmNhbmNlbFwiOmNhc2UgXCJwb2ludGVyZG93blwiOmNhc2UgXCJwb2ludGVybW92ZVwiOmNhc2UgXCJwb2ludGVyb3V0XCI6Y2FzZSBcInBvaW50ZXJvdmVyXCI6Y2FzZSBcInBvaW50ZXJ1cFwiOmE9XG5XZTticmVhaztkZWZhdWx0OmE9R31iPWEuZ2V0UG9vbGVkKGUsYixjLGQpO1hkKGIpO3JldHVybiBifX07aWYocGEpdGhyb3cgRXJyb3IodSgxMDEpKTtwYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChcIlJlc3BvbmRlckV2ZW50UGx1Z2luIFNpbXBsZUV2ZW50UGx1Z2luIEVudGVyTGVhdmVFdmVudFBsdWdpbiBDaGFuZ2VFdmVudFBsdWdpbiBTZWxlY3RFdmVudFBsdWdpbiBCZWZvcmVJbnB1dEV2ZW50UGx1Z2luXCIuc3BsaXQoXCIgXCIpKTtyYSgpO3ZhciB4Zj1OYztsYT1RZDttYT14ZjtuYT1QZDt4YSh7U2ltcGxlRXZlbnRQbHVnaW46d2YsRW50ZXJMZWF2ZUV2ZW50UGx1Z2luOlllLENoYW5nZUV2ZW50UGx1Z2luOk1lLFNlbGVjdEV2ZW50UGx1Z2luOmtmLEJlZm9yZUlucHV0RXZlbnRQbHVnaW46dmV9KTt2YXIgeWY9W10semY9LTE7ZnVuY3Rpb24gSChhKXswPnpmfHwoYS5jdXJyZW50PXlmW3pmXSx5Zlt6Zl09bnVsbCx6Zi0tKX1cbmZ1bmN0aW9uIEkoYSxiKXt6ZisrO3lmW3pmXT1hLmN1cnJlbnQ7YS5jdXJyZW50PWJ9dmFyIEFmPXt9LEo9e2N1cnJlbnQ6QWZ9LEs9e2N1cnJlbnQ6ITF9LEJmPUFmO2Z1bmN0aW9uIENmKGEsYil7dmFyIGM9YS50eXBlLmNvbnRleHRUeXBlcztpZighYylyZXR1cm4gQWY7dmFyIGQ9YS5zdGF0ZU5vZGU7aWYoZCYmZC5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZFVubWFza2VkQ2hpbGRDb250ZXh0PT09YilyZXR1cm4gZC5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZE1hc2tlZENoaWxkQ29udGV4dDt2YXIgZT17fSxmO2ZvcihmIGluIGMpZVtmXT1iW2ZdO2QmJihhPWEuc3RhdGVOb2RlLGEuX19yZWFjdEludGVybmFsTWVtb2l6ZWRVbm1hc2tlZENoaWxkQ29udGV4dD1iLGEuX19yZWFjdEludGVybmFsTWVtb2l6ZWRNYXNrZWRDaGlsZENvbnRleHQ9ZSk7cmV0dXJuIGV9ZnVuY3Rpb24gTChhKXthPWEuY2hpbGRDb250ZXh0VHlwZXM7cmV0dXJuIG51bGwhPT1hJiZ2b2lkIDAhPT1hfVxuZnVuY3Rpb24gRGYoKXtIKEspO0goSil9ZnVuY3Rpb24gRWYoYSxiLGMpe2lmKEouY3VycmVudCE9PUFmKXRocm93IEVycm9yKHUoMTY4KSk7SShKLGIpO0koSyxjKX1mdW5jdGlvbiBGZihhLGIsYyl7dmFyIGQ9YS5zdGF0ZU5vZGU7YT1iLmNoaWxkQ29udGV4dFR5cGVzO2lmKFwiZnVuY3Rpb25cIiE9PXR5cGVvZiBkLmdldENoaWxkQ29udGV4dClyZXR1cm4gYztkPWQuZ2V0Q2hpbGRDb250ZXh0KCk7Zm9yKHZhciBlIGluIGQpaWYoIShlIGluIGEpKXRocm93IEVycm9yKHUoMTA4LHBiKGIpfHxcIlVua25vd25cIixlKSk7cmV0dXJuIG4oe30sYyx7fSxkKX1mdW5jdGlvbiBHZihhKXthPShhPWEuc3RhdGVOb2RlKSYmYS5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZE1lcmdlZENoaWxkQ29udGV4dHx8QWY7QmY9Si5jdXJyZW50O0koSixhKTtJKEssSy5jdXJyZW50KTtyZXR1cm4hMH1cbmZ1bmN0aW9uIEhmKGEsYixjKXt2YXIgZD1hLnN0YXRlTm9kZTtpZighZCl0aHJvdyBFcnJvcih1KDE2OSkpO2M/KGE9RmYoYSxiLEJmKSxkLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkTWVyZ2VkQ2hpbGRDb250ZXh0PWEsSChLKSxIKEopLEkoSixhKSk6SChLKTtJKEssYyl9XG52YXIgSWY9ci51bnN0YWJsZV9ydW5XaXRoUHJpb3JpdHksSmY9ci51bnN0YWJsZV9zY2hlZHVsZUNhbGxiYWNrLEtmPXIudW5zdGFibGVfY2FuY2VsQ2FsbGJhY2ssTGY9ci51bnN0YWJsZV9yZXF1ZXN0UGFpbnQsTWY9ci51bnN0YWJsZV9ub3csTmY9ci51bnN0YWJsZV9nZXRDdXJyZW50UHJpb3JpdHlMZXZlbCxPZj1yLnVuc3RhYmxlX0ltbWVkaWF0ZVByaW9yaXR5LFBmPXIudW5zdGFibGVfVXNlckJsb2NraW5nUHJpb3JpdHksUWY9ci51bnN0YWJsZV9Ob3JtYWxQcmlvcml0eSxSZj1yLnVuc3RhYmxlX0xvd1ByaW9yaXR5LFNmPXIudW5zdGFibGVfSWRsZVByaW9yaXR5LFRmPXt9LFVmPXIudW5zdGFibGVfc2hvdWxkWWllbGQsVmY9dm9pZCAwIT09TGY/TGY6ZnVuY3Rpb24oKXt9LFdmPW51bGwsWGY9bnVsbCxZZj0hMSxaZj1NZigpLCRmPTFFND5aZj9NZjpmdW5jdGlvbigpe3JldHVybiBNZigpLVpmfTtcbmZ1bmN0aW9uIGFnKCl7c3dpdGNoKE5mKCkpe2Nhc2UgT2Y6cmV0dXJuIDk5O2Nhc2UgUGY6cmV0dXJuIDk4O2Nhc2UgUWY6cmV0dXJuIDk3O2Nhc2UgUmY6cmV0dXJuIDk2O2Nhc2UgU2Y6cmV0dXJuIDk1O2RlZmF1bHQ6dGhyb3cgRXJyb3IodSgzMzIpKTt9fWZ1bmN0aW9uIGJnKGEpe3N3aXRjaChhKXtjYXNlIDk5OnJldHVybiBPZjtjYXNlIDk4OnJldHVybiBQZjtjYXNlIDk3OnJldHVybiBRZjtjYXNlIDk2OnJldHVybiBSZjtjYXNlIDk1OnJldHVybiBTZjtkZWZhdWx0OnRocm93IEVycm9yKHUoMzMyKSk7fX1mdW5jdGlvbiBjZyhhLGIpe2E9YmcoYSk7cmV0dXJuIElmKGEsYil9ZnVuY3Rpb24gZGcoYSxiLGMpe2E9YmcoYSk7cmV0dXJuIEpmKGEsYixjKX1mdW5jdGlvbiBlZyhhKXtudWxsPT09V2Y/KFdmPVthXSxYZj1KZihPZixmZykpOldmLnB1c2goYSk7cmV0dXJuIFRmfWZ1bmN0aW9uIGdnKCl7aWYobnVsbCE9PVhmKXt2YXIgYT1YZjtYZj1udWxsO0tmKGEpfWZnKCl9XG5mdW5jdGlvbiBmZygpe2lmKCFZZiYmbnVsbCE9PVdmKXtZZj0hMDt2YXIgYT0wO3RyeXt2YXIgYj1XZjtjZyg5OSxmdW5jdGlvbigpe2Zvcig7YTxiLmxlbmd0aDthKyspe3ZhciBjPWJbYV07ZG8gYz1jKCEwKTt3aGlsZShudWxsIT09Yyl9fSk7V2Y9bnVsbH1jYXRjaChjKXt0aHJvdyBudWxsIT09V2YmJihXZj1XZi5zbGljZShhKzEpKSxKZihPZixnZyksYzt9ZmluYWxseXtZZj0hMX19fWZ1bmN0aW9uIGhnKGEsYixjKXtjLz0xMDtyZXR1cm4gMTA3Mzc0MTgyMS0oKCgxMDczNzQxODIxLWErYi8xMCkvY3wwKSsxKSpjfWZ1bmN0aW9uIGlnKGEsYil7aWYoYSYmYS5kZWZhdWx0UHJvcHMpe2I9bih7fSxiKTthPWEuZGVmYXVsdFByb3BzO2Zvcih2YXIgYyBpbiBhKXZvaWQgMD09PWJbY10mJihiW2NdPWFbY10pfXJldHVybiBifXZhciBqZz17Y3VycmVudDpudWxsfSxrZz1udWxsLGxnPW51bGwsbWc9bnVsbDtmdW5jdGlvbiBuZygpe21nPWxnPWtnPW51bGx9XG5mdW5jdGlvbiBvZyhhKXt2YXIgYj1qZy5jdXJyZW50O0goamcpO2EudHlwZS5fY29udGV4dC5fY3VycmVudFZhbHVlPWJ9ZnVuY3Rpb24gcGcoYSxiKXtmb3IoO251bGwhPT1hOyl7dmFyIGM9YS5hbHRlcm5hdGU7aWYoYS5jaGlsZEV4cGlyYXRpb25UaW1lPGIpYS5jaGlsZEV4cGlyYXRpb25UaW1lPWIsbnVsbCE9PWMmJmMuY2hpbGRFeHBpcmF0aW9uVGltZTxiJiYoYy5jaGlsZEV4cGlyYXRpb25UaW1lPWIpO2Vsc2UgaWYobnVsbCE9PWMmJmMuY2hpbGRFeHBpcmF0aW9uVGltZTxiKWMuY2hpbGRFeHBpcmF0aW9uVGltZT1iO2Vsc2UgYnJlYWs7YT1hLnJldHVybn19ZnVuY3Rpb24gcWcoYSxiKXtrZz1hO21nPWxnPW51bGw7YT1hLmRlcGVuZGVuY2llcztudWxsIT09YSYmbnVsbCE9PWEuZmlyc3RDb250ZXh0JiYoYS5leHBpcmF0aW9uVGltZT49YiYmKHJnPSEwKSxhLmZpcnN0Q29udGV4dD1udWxsKX1cbmZ1bmN0aW9uIHNnKGEsYil7aWYobWchPT1hJiYhMSE9PWImJjAhPT1iKXtpZihcIm51bWJlclwiIT09dHlwZW9mIGJ8fDEwNzM3NDE4MjM9PT1iKW1nPWEsYj0xMDczNzQxODIzO2I9e2NvbnRleHQ6YSxvYnNlcnZlZEJpdHM6YixuZXh0Om51bGx9O2lmKG51bGw9PT1sZyl7aWYobnVsbD09PWtnKXRocm93IEVycm9yKHUoMzA4KSk7bGc9YjtrZy5kZXBlbmRlbmNpZXM9e2V4cGlyYXRpb25UaW1lOjAsZmlyc3RDb250ZXh0OmIscmVzcG9uZGVyczpudWxsfX1lbHNlIGxnPWxnLm5leHQ9Yn1yZXR1cm4gYS5fY3VycmVudFZhbHVlfXZhciB0Zz0hMTtmdW5jdGlvbiB1ZyhhKXthLnVwZGF0ZVF1ZXVlPXtiYXNlU3RhdGU6YS5tZW1vaXplZFN0YXRlLGJhc2VRdWV1ZTpudWxsLHNoYXJlZDp7cGVuZGluZzpudWxsfSxlZmZlY3RzOm51bGx9fVxuZnVuY3Rpb24gdmcoYSxiKXthPWEudXBkYXRlUXVldWU7Yi51cGRhdGVRdWV1ZT09PWEmJihiLnVwZGF0ZVF1ZXVlPXtiYXNlU3RhdGU6YS5iYXNlU3RhdGUsYmFzZVF1ZXVlOmEuYmFzZVF1ZXVlLHNoYXJlZDphLnNoYXJlZCxlZmZlY3RzOmEuZWZmZWN0c30pfWZ1bmN0aW9uIHdnKGEsYil7YT17ZXhwaXJhdGlvblRpbWU6YSxzdXNwZW5zZUNvbmZpZzpiLHRhZzowLHBheWxvYWQ6bnVsbCxjYWxsYmFjazpudWxsLG5leHQ6bnVsbH07cmV0dXJuIGEubmV4dD1hfWZ1bmN0aW9uIHhnKGEsYil7YT1hLnVwZGF0ZVF1ZXVlO2lmKG51bGwhPT1hKXthPWEuc2hhcmVkO3ZhciBjPWEucGVuZGluZztudWxsPT09Yz9iLm5leHQ9YjooYi5uZXh0PWMubmV4dCxjLm5leHQ9Yik7YS5wZW5kaW5nPWJ9fVxuZnVuY3Rpb24geWcoYSxiKXt2YXIgYz1hLmFsdGVybmF0ZTtudWxsIT09YyYmdmcoYyxhKTthPWEudXBkYXRlUXVldWU7Yz1hLmJhc2VRdWV1ZTtudWxsPT09Yz8oYS5iYXNlUXVldWU9Yi5uZXh0PWIsYi5uZXh0PWIpOihiLm5leHQ9Yy5uZXh0LGMubmV4dD1iKX1cbmZ1bmN0aW9uIHpnKGEsYixjLGQpe3ZhciBlPWEudXBkYXRlUXVldWU7dGc9ITE7dmFyIGY9ZS5iYXNlUXVldWUsZz1lLnNoYXJlZC5wZW5kaW5nO2lmKG51bGwhPT1nKXtpZihudWxsIT09Zil7dmFyIGg9Zi5uZXh0O2YubmV4dD1nLm5leHQ7Zy5uZXh0PWh9Zj1nO2Uuc2hhcmVkLnBlbmRpbmc9bnVsbDtoPWEuYWx0ZXJuYXRlO251bGwhPT1oJiYoaD1oLnVwZGF0ZVF1ZXVlLG51bGwhPT1oJiYoaC5iYXNlUXVldWU9ZykpfWlmKG51bGwhPT1mKXtoPWYubmV4dDt2YXIgaz1lLmJhc2VTdGF0ZSxsPTAsbT1udWxsLHA9bnVsbCx4PW51bGw7aWYobnVsbCE9PWgpe3ZhciB6PWg7ZG97Zz16LmV4cGlyYXRpb25UaW1lO2lmKGc8ZCl7dmFyIGNhPXtleHBpcmF0aW9uVGltZTp6LmV4cGlyYXRpb25UaW1lLHN1c3BlbnNlQ29uZmlnOnouc3VzcGVuc2VDb25maWcsdGFnOnoudGFnLHBheWxvYWQ6ei5wYXlsb2FkLGNhbGxiYWNrOnouY2FsbGJhY2ssbmV4dDpudWxsfTtudWxsPT09eD8ocD14PVxuY2EsbT1rKTp4PXgubmV4dD1jYTtnPmwmJihsPWcpfWVsc2V7bnVsbCE9PXgmJih4PXgubmV4dD17ZXhwaXJhdGlvblRpbWU6MTA3Mzc0MTgyMyxzdXNwZW5zZUNvbmZpZzp6LnN1c3BlbnNlQ29uZmlnLHRhZzp6LnRhZyxwYXlsb2FkOnoucGF5bG9hZCxjYWxsYmFjazp6LmNhbGxiYWNrLG5leHQ6bnVsbH0pO0FnKGcsei5zdXNwZW5zZUNvbmZpZyk7YTp7dmFyIEQ9YSx0PXo7Zz1iO2NhPWM7c3dpdGNoKHQudGFnKXtjYXNlIDE6RD10LnBheWxvYWQ7aWYoXCJmdW5jdGlvblwiPT09dHlwZW9mIEQpe2s9RC5jYWxsKGNhLGssZyk7YnJlYWsgYX1rPUQ7YnJlYWsgYTtjYXNlIDM6RC5lZmZlY3RUYWc9RC5lZmZlY3RUYWcmLTQwOTd8NjQ7Y2FzZSAwOkQ9dC5wYXlsb2FkO2c9XCJmdW5jdGlvblwiPT09dHlwZW9mIEQ/RC5jYWxsKGNhLGssZyk6RDtpZihudWxsPT09Z3x8dm9pZCAwPT09ZylicmVhayBhO2s9bih7fSxrLGcpO2JyZWFrIGE7Y2FzZSAyOnRnPSEwfX1udWxsIT09ei5jYWxsYmFjayYmXG4oYS5lZmZlY3RUYWd8PTMyLGc9ZS5lZmZlY3RzLG51bGw9PT1nP2UuZWZmZWN0cz1bel06Zy5wdXNoKHopKX16PXoubmV4dDtpZihudWxsPT09enx8ej09PWgpaWYoZz1lLnNoYXJlZC5wZW5kaW5nLG51bGw9PT1nKWJyZWFrO2Vsc2Ugej1mLm5leHQ9Zy5uZXh0LGcubmV4dD1oLGUuYmFzZVF1ZXVlPWY9ZyxlLnNoYXJlZC5wZW5kaW5nPW51bGx9d2hpbGUoMSl9bnVsbD09PXg/bT1rOngubmV4dD1wO2UuYmFzZVN0YXRlPW07ZS5iYXNlUXVldWU9eDtCZyhsKTthLmV4cGlyYXRpb25UaW1lPWw7YS5tZW1vaXplZFN0YXRlPWt9fVxuZnVuY3Rpb24gQ2coYSxiLGMpe2E9Yi5lZmZlY3RzO2IuZWZmZWN0cz1udWxsO2lmKG51bGwhPT1hKWZvcihiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBkPWFbYl0sZT1kLmNhbGxiYWNrO2lmKG51bGwhPT1lKXtkLmNhbGxiYWNrPW51bGw7ZD1lO2U9YztpZihcImZ1bmN0aW9uXCIhPT10eXBlb2YgZCl0aHJvdyBFcnJvcih1KDE5MSxkKSk7ZC5jYWxsKGUpfX19dmFyIERnPVdhLlJlYWN0Q3VycmVudEJhdGNoQ29uZmlnLEVnPShuZXcgYWEuQ29tcG9uZW50KS5yZWZzO2Z1bmN0aW9uIEZnKGEsYixjLGQpe2I9YS5tZW1vaXplZFN0YXRlO2M9YyhkLGIpO2M9bnVsbD09PWN8fHZvaWQgMD09PWM/YjpuKHt9LGIsYyk7YS5tZW1vaXplZFN0YXRlPWM7MD09PWEuZXhwaXJhdGlvblRpbWUmJihhLnVwZGF0ZVF1ZXVlLmJhc2VTdGF0ZT1jKX1cbnZhciBKZz17aXNNb3VudGVkOmZ1bmN0aW9uKGEpe3JldHVybihhPWEuX3JlYWN0SW50ZXJuYWxGaWJlcik/ZGMoYSk9PT1hOiExfSxlbnF1ZXVlU2V0U3RhdGU6ZnVuY3Rpb24oYSxiLGMpe2E9YS5fcmVhY3RJbnRlcm5hbEZpYmVyO3ZhciBkPUdnKCksZT1EZy5zdXNwZW5zZTtkPUhnKGQsYSxlKTtlPXdnKGQsZSk7ZS5wYXlsb2FkPWI7dm9pZCAwIT09YyYmbnVsbCE9PWMmJihlLmNhbGxiYWNrPWMpO3hnKGEsZSk7SWcoYSxkKX0sZW5xdWV1ZVJlcGxhY2VTdGF0ZTpmdW5jdGlvbihhLGIsYyl7YT1hLl9yZWFjdEludGVybmFsRmliZXI7dmFyIGQ9R2coKSxlPURnLnN1c3BlbnNlO2Q9SGcoZCxhLGUpO2U9d2coZCxlKTtlLnRhZz0xO2UucGF5bG9hZD1iO3ZvaWQgMCE9PWMmJm51bGwhPT1jJiYoZS5jYWxsYmFjaz1jKTt4ZyhhLGUpO0lnKGEsZCl9LGVucXVldWVGb3JjZVVwZGF0ZTpmdW5jdGlvbihhLGIpe2E9YS5fcmVhY3RJbnRlcm5hbEZpYmVyO3ZhciBjPUdnKCksZD1EZy5zdXNwZW5zZTtcbmM9SGcoYyxhLGQpO2Q9d2coYyxkKTtkLnRhZz0yO3ZvaWQgMCE9PWImJm51bGwhPT1iJiYoZC5jYWxsYmFjaz1iKTt4ZyhhLGQpO0lnKGEsYyl9fTtmdW5jdGlvbiBLZyhhLGIsYyxkLGUsZixnKXthPWEuc3RhdGVOb2RlO3JldHVyblwiZnVuY3Rpb25cIj09PXR5cGVvZiBhLnNob3VsZENvbXBvbmVudFVwZGF0ZT9hLnNob3VsZENvbXBvbmVudFVwZGF0ZShkLGYsZyk6Yi5wcm90b3R5cGUmJmIucHJvdG90eXBlLmlzUHVyZVJlYWN0Q29tcG9uZW50PyFiZihjLGQpfHwhYmYoZSxmKTohMH1cbmZ1bmN0aW9uIExnKGEsYixjKXt2YXIgZD0hMSxlPUFmO3ZhciBmPWIuY29udGV4dFR5cGU7XCJvYmplY3RcIj09PXR5cGVvZiBmJiZudWxsIT09Zj9mPXNnKGYpOihlPUwoYik/QmY6Si5jdXJyZW50LGQ9Yi5jb250ZXh0VHlwZXMsZj0oZD1udWxsIT09ZCYmdm9pZCAwIT09ZCk/Q2YoYSxlKTpBZik7Yj1uZXcgYihjLGYpO2EubWVtb2l6ZWRTdGF0ZT1udWxsIT09Yi5zdGF0ZSYmdm9pZCAwIT09Yi5zdGF0ZT9iLnN0YXRlOm51bGw7Yi51cGRhdGVyPUpnO2Euc3RhdGVOb2RlPWI7Yi5fcmVhY3RJbnRlcm5hbEZpYmVyPWE7ZCYmKGE9YS5zdGF0ZU5vZGUsYS5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZFVubWFza2VkQ2hpbGRDb250ZXh0PWUsYS5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZE1hc2tlZENoaWxkQ29udGV4dD1mKTtyZXR1cm4gYn1cbmZ1bmN0aW9uIE1nKGEsYixjLGQpe2E9Yi5zdGF0ZTtcImZ1bmN0aW9uXCI9PT10eXBlb2YgYi5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzJiZiLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMoYyxkKTtcImZ1bmN0aW9uXCI9PT10eXBlb2YgYi5VTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyYmYi5VTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhjLGQpO2Iuc3RhdGUhPT1hJiZKZy5lbnF1ZXVlUmVwbGFjZVN0YXRlKGIsYi5zdGF0ZSxudWxsKX1cbmZ1bmN0aW9uIE5nKGEsYixjLGQpe3ZhciBlPWEuc3RhdGVOb2RlO2UucHJvcHM9YztlLnN0YXRlPWEubWVtb2l6ZWRTdGF0ZTtlLnJlZnM9RWc7dWcoYSk7dmFyIGY9Yi5jb250ZXh0VHlwZTtcIm9iamVjdFwiPT09dHlwZW9mIGYmJm51bGwhPT1mP2UuY29udGV4dD1zZyhmKTooZj1MKGIpP0JmOkouY3VycmVudCxlLmNvbnRleHQ9Q2YoYSxmKSk7emcoYSxjLGUsZCk7ZS5zdGF0ZT1hLm1lbW9pemVkU3RhdGU7Zj1iLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcztcImZ1bmN0aW9uXCI9PT10eXBlb2YgZiYmKEZnKGEsYixmLGMpLGUuc3RhdGU9YS5tZW1vaXplZFN0YXRlKTtcImZ1bmN0aW9uXCI9PT10eXBlb2YgYi5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHN8fFwiZnVuY3Rpb25cIj09PXR5cGVvZiBlLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlfHxcImZ1bmN0aW9uXCIhPT10eXBlb2YgZS5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50JiZcImZ1bmN0aW9uXCIhPT10eXBlb2YgZS5jb21wb25lbnRXaWxsTW91bnR8fFxuKGI9ZS5zdGF0ZSxcImZ1bmN0aW9uXCI9PT10eXBlb2YgZS5jb21wb25lbnRXaWxsTW91bnQmJmUuY29tcG9uZW50V2lsbE1vdW50KCksXCJmdW5jdGlvblwiPT09dHlwZW9mIGUuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCYmZS5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50KCksYiE9PWUuc3RhdGUmJkpnLmVucXVldWVSZXBsYWNlU3RhdGUoZSxlLnN0YXRlLG51bGwpLHpnKGEsYyxlLGQpLGUuc3RhdGU9YS5tZW1vaXplZFN0YXRlKTtcImZ1bmN0aW9uXCI9PT10eXBlb2YgZS5jb21wb25lbnREaWRNb3VudCYmKGEuZWZmZWN0VGFnfD00KX12YXIgT2c9QXJyYXkuaXNBcnJheTtcbmZ1bmN0aW9uIFBnKGEsYixjKXthPWMucmVmO2lmKG51bGwhPT1hJiZcImZ1bmN0aW9uXCIhPT10eXBlb2YgYSYmXCJvYmplY3RcIiE9PXR5cGVvZiBhKXtpZihjLl9vd25lcil7Yz1jLl9vd25lcjtpZihjKXtpZigxIT09Yy50YWcpdGhyb3cgRXJyb3IodSgzMDkpKTt2YXIgZD1jLnN0YXRlTm9kZX1pZighZCl0aHJvdyBFcnJvcih1KDE0NyxhKSk7dmFyIGU9XCJcIithO2lmKG51bGwhPT1iJiZudWxsIT09Yi5yZWYmJlwiZnVuY3Rpb25cIj09PXR5cGVvZiBiLnJlZiYmYi5yZWYuX3N0cmluZ1JlZj09PWUpcmV0dXJuIGIucmVmO2I9ZnVuY3Rpb24oYSl7dmFyIGI9ZC5yZWZzO2I9PT1FZyYmKGI9ZC5yZWZzPXt9KTtudWxsPT09YT9kZWxldGUgYltlXTpiW2VdPWF9O2IuX3N0cmluZ1JlZj1lO3JldHVybiBifWlmKFwic3RyaW5nXCIhPT10eXBlb2YgYSl0aHJvdyBFcnJvcih1KDI4NCkpO2lmKCFjLl9vd25lcil0aHJvdyBFcnJvcih1KDI5MCxhKSk7fXJldHVybiBhfVxuZnVuY3Rpb24gUWcoYSxiKXtpZihcInRleHRhcmVhXCIhPT1hLnR5cGUpdGhyb3cgRXJyb3IodSgzMSxcIltvYmplY3QgT2JqZWN0XVwiPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGIpP1wib2JqZWN0IHdpdGgga2V5cyB7XCIrT2JqZWN0LmtleXMoYikuam9pbihcIiwgXCIpK1wifVwiOmIsXCJcIikpO31cbmZ1bmN0aW9uIFJnKGEpe2Z1bmN0aW9uIGIoYixjKXtpZihhKXt2YXIgZD1iLmxhc3RFZmZlY3Q7bnVsbCE9PWQ/KGQubmV4dEVmZmVjdD1jLGIubGFzdEVmZmVjdD1jKTpiLmZpcnN0RWZmZWN0PWIubGFzdEVmZmVjdD1jO2MubmV4dEVmZmVjdD1udWxsO2MuZWZmZWN0VGFnPTh9fWZ1bmN0aW9uIGMoYyxkKXtpZighYSlyZXR1cm4gbnVsbDtmb3IoO251bGwhPT1kOyliKGMsZCksZD1kLnNpYmxpbmc7cmV0dXJuIG51bGx9ZnVuY3Rpb24gZChhLGIpe2ZvcihhPW5ldyBNYXA7bnVsbCE9PWI7KW51bGwhPT1iLmtleT9hLnNldChiLmtleSxiKTphLnNldChiLmluZGV4LGIpLGI9Yi5zaWJsaW5nO3JldHVybiBhfWZ1bmN0aW9uIGUoYSxiKXthPVNnKGEsYik7YS5pbmRleD0wO2Euc2libGluZz1udWxsO3JldHVybiBhfWZ1bmN0aW9uIGYoYixjLGQpe2IuaW5kZXg9ZDtpZighYSlyZXR1cm4gYztkPWIuYWx0ZXJuYXRlO2lmKG51bGwhPT1kKXJldHVybiBkPWQuaW5kZXgsZDxjPyhiLmVmZmVjdFRhZz1cbjIsYyk6ZDtiLmVmZmVjdFRhZz0yO3JldHVybiBjfWZ1bmN0aW9uIGcoYil7YSYmbnVsbD09PWIuYWx0ZXJuYXRlJiYoYi5lZmZlY3RUYWc9Mik7cmV0dXJuIGJ9ZnVuY3Rpb24gaChhLGIsYyxkKXtpZihudWxsPT09Ynx8NiE9PWIudGFnKXJldHVybiBiPVRnKGMsYS5tb2RlLGQpLGIucmV0dXJuPWEsYjtiPWUoYixjKTtiLnJldHVybj1hO3JldHVybiBifWZ1bmN0aW9uIGsoYSxiLGMsZCl7aWYobnVsbCE9PWImJmIuZWxlbWVudFR5cGU9PT1jLnR5cGUpcmV0dXJuIGQ9ZShiLGMucHJvcHMpLGQucmVmPVBnKGEsYixjKSxkLnJldHVybj1hLGQ7ZD1VZyhjLnR5cGUsYy5rZXksYy5wcm9wcyxudWxsLGEubW9kZSxkKTtkLnJlZj1QZyhhLGIsYyk7ZC5yZXR1cm49YTtyZXR1cm4gZH1mdW5jdGlvbiBsKGEsYixjLGQpe2lmKG51bGw9PT1ifHw0IT09Yi50YWd8fGIuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8hPT1jLmNvbnRhaW5lckluZm98fGIuc3RhdGVOb2RlLmltcGxlbWVudGF0aW9uIT09XG5jLmltcGxlbWVudGF0aW9uKXJldHVybiBiPVZnKGMsYS5tb2RlLGQpLGIucmV0dXJuPWEsYjtiPWUoYixjLmNoaWxkcmVufHxbXSk7Yi5yZXR1cm49YTtyZXR1cm4gYn1mdW5jdGlvbiBtKGEsYixjLGQsZil7aWYobnVsbD09PWJ8fDchPT1iLnRhZylyZXR1cm4gYj1XZyhjLGEubW9kZSxkLGYpLGIucmV0dXJuPWEsYjtiPWUoYixjKTtiLnJldHVybj1hO3JldHVybiBifWZ1bmN0aW9uIHAoYSxiLGMpe2lmKFwic3RyaW5nXCI9PT10eXBlb2YgYnx8XCJudW1iZXJcIj09PXR5cGVvZiBiKXJldHVybiBiPVRnKFwiXCIrYixhLm1vZGUsYyksYi5yZXR1cm49YSxiO2lmKFwib2JqZWN0XCI9PT10eXBlb2YgYiYmbnVsbCE9PWIpe3N3aXRjaChiLiQkdHlwZW9mKXtjYXNlIFphOnJldHVybiBjPVVnKGIudHlwZSxiLmtleSxiLnByb3BzLG51bGwsYS5tb2RlLGMpLGMucmVmPVBnKGEsbnVsbCxiKSxjLnJldHVybj1hLGM7Y2FzZSAkYTpyZXR1cm4gYj1WZyhiLGEubW9kZSxjKSxiLnJldHVybj1hLGJ9aWYoT2coYil8fFxubmIoYikpcmV0dXJuIGI9V2coYixhLm1vZGUsYyxudWxsKSxiLnJldHVybj1hLGI7UWcoYSxiKX1yZXR1cm4gbnVsbH1mdW5jdGlvbiB4KGEsYixjLGQpe3ZhciBlPW51bGwhPT1iP2Iua2V5Om51bGw7aWYoXCJzdHJpbmdcIj09PXR5cGVvZiBjfHxcIm51bWJlclwiPT09dHlwZW9mIGMpcmV0dXJuIG51bGwhPT1lP251bGw6aChhLGIsXCJcIitjLGQpO2lmKFwib2JqZWN0XCI9PT10eXBlb2YgYyYmbnVsbCE9PWMpe3N3aXRjaChjLiQkdHlwZW9mKXtjYXNlIFphOnJldHVybiBjLmtleT09PWU/Yy50eXBlPT09YWI/bShhLGIsYy5wcm9wcy5jaGlsZHJlbixkLGUpOmsoYSxiLGMsZCk6bnVsbDtjYXNlICRhOnJldHVybiBjLmtleT09PWU/bChhLGIsYyxkKTpudWxsfWlmKE9nKGMpfHxuYihjKSlyZXR1cm4gbnVsbCE9PWU/bnVsbDptKGEsYixjLGQsbnVsbCk7UWcoYSxjKX1yZXR1cm4gbnVsbH1mdW5jdGlvbiB6KGEsYixjLGQsZSl7aWYoXCJzdHJpbmdcIj09PXR5cGVvZiBkfHxcIm51bWJlclwiPT09dHlwZW9mIGQpcmV0dXJuIGE9XG5hLmdldChjKXx8bnVsbCxoKGIsYSxcIlwiK2QsZSk7aWYoXCJvYmplY3RcIj09PXR5cGVvZiBkJiZudWxsIT09ZCl7c3dpdGNoKGQuJCR0eXBlb2Ype2Nhc2UgWmE6cmV0dXJuIGE9YS5nZXQobnVsbD09PWQua2V5P2M6ZC5rZXkpfHxudWxsLGQudHlwZT09PWFiP20oYixhLGQucHJvcHMuY2hpbGRyZW4sZSxkLmtleSk6ayhiLGEsZCxlKTtjYXNlICRhOnJldHVybiBhPWEuZ2V0KG51bGw9PT1kLmtleT9jOmQua2V5KXx8bnVsbCxsKGIsYSxkLGUpfWlmKE9nKGQpfHxuYihkKSlyZXR1cm4gYT1hLmdldChjKXx8bnVsbCxtKGIsYSxkLGUsbnVsbCk7UWcoYixkKX1yZXR1cm4gbnVsbH1mdW5jdGlvbiBjYShlLGcsaCxrKXtmb3IodmFyIGw9bnVsbCx0PW51bGwsbT1nLHk9Zz0wLEE9bnVsbDtudWxsIT09bSYmeTxoLmxlbmd0aDt5Kyspe20uaW5kZXg+eT8oQT1tLG09bnVsbCk6QT1tLnNpYmxpbmc7dmFyIHE9eChlLG0saFt5XSxrKTtpZihudWxsPT09cSl7bnVsbD09PW0mJihtPUEpO2JyZWFrfWEmJlxubSYmbnVsbD09PXEuYWx0ZXJuYXRlJiZiKGUsbSk7Zz1mKHEsZyx5KTtudWxsPT09dD9sPXE6dC5zaWJsaW5nPXE7dD1xO209QX1pZih5PT09aC5sZW5ndGgpcmV0dXJuIGMoZSxtKSxsO2lmKG51bGw9PT1tKXtmb3IoO3k8aC5sZW5ndGg7eSsrKW09cChlLGhbeV0sayksbnVsbCE9PW0mJihnPWYobSxnLHkpLG51bGw9PT10P2w9bTp0LnNpYmxpbmc9bSx0PW0pO3JldHVybiBsfWZvcihtPWQoZSxtKTt5PGgubGVuZ3RoO3krKylBPXoobSxlLHksaFt5XSxrKSxudWxsIT09QSYmKGEmJm51bGwhPT1BLmFsdGVybmF0ZSYmbS5kZWxldGUobnVsbD09PUEua2V5P3k6QS5rZXkpLGc9ZihBLGcseSksbnVsbD09PXQ/bD1BOnQuc2libGluZz1BLHQ9QSk7YSYmbS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3JldHVybiBiKGUsYSl9KTtyZXR1cm4gbH1mdW5jdGlvbiBEKGUsZyxoLGwpe3ZhciBrPW5iKGgpO2lmKFwiZnVuY3Rpb25cIiE9PXR5cGVvZiBrKXRocm93IEVycm9yKHUoMTUwKSk7aD1rLmNhbGwoaCk7XG5pZihudWxsPT1oKXRocm93IEVycm9yKHUoMTUxKSk7Zm9yKHZhciBtPWs9bnVsbCx0PWcseT1nPTAsQT1udWxsLHE9aC5uZXh0KCk7bnVsbCE9PXQmJiFxLmRvbmU7eSsrLHE9aC5uZXh0KCkpe3QuaW5kZXg+eT8oQT10LHQ9bnVsbCk6QT10LnNpYmxpbmc7dmFyIEQ9eChlLHQscS52YWx1ZSxsKTtpZihudWxsPT09RCl7bnVsbD09PXQmJih0PUEpO2JyZWFrfWEmJnQmJm51bGw9PT1ELmFsdGVybmF0ZSYmYihlLHQpO2c9ZihELGcseSk7bnVsbD09PW0/az1EOm0uc2libGluZz1EO209RDt0PUF9aWYocS5kb25lKXJldHVybiBjKGUsdCksaztpZihudWxsPT09dCl7Zm9yKDshcS5kb25lO3krKyxxPWgubmV4dCgpKXE9cChlLHEudmFsdWUsbCksbnVsbCE9PXEmJihnPWYocSxnLHkpLG51bGw9PT1tP2s9cTptLnNpYmxpbmc9cSxtPXEpO3JldHVybiBrfWZvcih0PWQoZSx0KTshcS5kb25lO3krKyxxPWgubmV4dCgpKXE9eih0LGUseSxxLnZhbHVlLGwpLG51bGwhPT1xJiYoYSYmbnVsbCE9PVxucS5hbHRlcm5hdGUmJnQuZGVsZXRlKG51bGw9PT1xLmtleT95OnEua2V5KSxnPWYocSxnLHkpLG51bGw9PT1tP2s9cTptLnNpYmxpbmc9cSxtPXEpO2EmJnQuZm9yRWFjaChmdW5jdGlvbihhKXtyZXR1cm4gYihlLGEpfSk7cmV0dXJuIGt9cmV0dXJuIGZ1bmN0aW9uKGEsZCxmLGgpe3ZhciBrPVwib2JqZWN0XCI9PT10eXBlb2YgZiYmbnVsbCE9PWYmJmYudHlwZT09PWFiJiZudWxsPT09Zi5rZXk7ayYmKGY9Zi5wcm9wcy5jaGlsZHJlbik7dmFyIGw9XCJvYmplY3RcIj09PXR5cGVvZiBmJiZudWxsIT09ZjtpZihsKXN3aXRjaChmLiQkdHlwZW9mKXtjYXNlIFphOmE6e2w9Zi5rZXk7Zm9yKGs9ZDtudWxsIT09azspe2lmKGsua2V5PT09bCl7c3dpdGNoKGsudGFnKXtjYXNlIDc6aWYoZi50eXBlPT09YWIpe2MoYSxrLnNpYmxpbmcpO2Q9ZShrLGYucHJvcHMuY2hpbGRyZW4pO2QucmV0dXJuPWE7YT1kO2JyZWFrIGF9YnJlYWs7ZGVmYXVsdDppZihrLmVsZW1lbnRUeXBlPT09Zi50eXBlKXtjKGEsXG5rLnNpYmxpbmcpO2Q9ZShrLGYucHJvcHMpO2QucmVmPVBnKGEsayxmKTtkLnJldHVybj1hO2E9ZDticmVhayBhfX1jKGEsayk7YnJlYWt9ZWxzZSBiKGEsayk7az1rLnNpYmxpbmd9Zi50eXBlPT09YWI/KGQ9V2coZi5wcm9wcy5jaGlsZHJlbixhLm1vZGUsaCxmLmtleSksZC5yZXR1cm49YSxhPWQpOihoPVVnKGYudHlwZSxmLmtleSxmLnByb3BzLG51bGwsYS5tb2RlLGgpLGgucmVmPVBnKGEsZCxmKSxoLnJldHVybj1hLGE9aCl9cmV0dXJuIGcoYSk7Y2FzZSAkYTphOntmb3Ioaz1mLmtleTtudWxsIT09ZDspe2lmKGQua2V5PT09aylpZig0PT09ZC50YWcmJmQuc3RhdGVOb2RlLmNvbnRhaW5lckluZm89PT1mLmNvbnRhaW5lckluZm8mJmQuc3RhdGVOb2RlLmltcGxlbWVudGF0aW9uPT09Zi5pbXBsZW1lbnRhdGlvbil7YyhhLGQuc2libGluZyk7ZD1lKGQsZi5jaGlsZHJlbnx8W10pO2QucmV0dXJuPWE7YT1kO2JyZWFrIGF9ZWxzZXtjKGEsZCk7YnJlYWt9ZWxzZSBiKGEsZCk7ZD1cbmQuc2libGluZ31kPVZnKGYsYS5tb2RlLGgpO2QucmV0dXJuPWE7YT1kfXJldHVybiBnKGEpfWlmKFwic3RyaW5nXCI9PT10eXBlb2YgZnx8XCJudW1iZXJcIj09PXR5cGVvZiBmKXJldHVybiBmPVwiXCIrZixudWxsIT09ZCYmNj09PWQudGFnPyhjKGEsZC5zaWJsaW5nKSxkPWUoZCxmKSxkLnJldHVybj1hLGE9ZCk6KGMoYSxkKSxkPVRnKGYsYS5tb2RlLGgpLGQucmV0dXJuPWEsYT1kKSxnKGEpO2lmKE9nKGYpKXJldHVybiBjYShhLGQsZixoKTtpZihuYihmKSlyZXR1cm4gRChhLGQsZixoKTtsJiZRZyhhLGYpO2lmKFwidW5kZWZpbmVkXCI9PT10eXBlb2YgZiYmIWspc3dpdGNoKGEudGFnKXtjYXNlIDE6Y2FzZSAwOnRocm93IGE9YS50eXBlLEVycm9yKHUoMTUyLGEuZGlzcGxheU5hbWV8fGEubmFtZXx8XCJDb21wb25lbnRcIikpO31yZXR1cm4gYyhhLGQpfX12YXIgWGc9UmcoITApLFlnPVJnKCExKSxaZz17fSwkZz17Y3VycmVudDpaZ30sYWg9e2N1cnJlbnQ6Wmd9LGJoPXtjdXJyZW50OlpnfTtcbmZ1bmN0aW9uIGNoKGEpe2lmKGE9PT1aZyl0aHJvdyBFcnJvcih1KDE3NCkpO3JldHVybiBhfWZ1bmN0aW9uIGRoKGEsYil7SShiaCxiKTtJKGFoLGEpO0koJGcsWmcpO2E9Yi5ub2RlVHlwZTtzd2l0Y2goYSl7Y2FzZSA5OmNhc2UgMTE6Yj0oYj1iLmRvY3VtZW50RWxlbWVudCk/Yi5uYW1lc3BhY2VVUkk6T2IobnVsbCxcIlwiKTticmVhaztkZWZhdWx0OmE9OD09PWE/Yi5wYXJlbnROb2RlOmIsYj1hLm5hbWVzcGFjZVVSSXx8bnVsbCxhPWEudGFnTmFtZSxiPU9iKGIsYSl9SCgkZyk7SSgkZyxiKX1mdW5jdGlvbiBlaCgpe0goJGcpO0goYWgpO0goYmgpfWZ1bmN0aW9uIGZoKGEpe2NoKGJoLmN1cnJlbnQpO3ZhciBiPWNoKCRnLmN1cnJlbnQpO3ZhciBjPU9iKGIsYS50eXBlKTtiIT09YyYmKEkoYWgsYSksSSgkZyxjKSl9ZnVuY3Rpb24gZ2goYSl7YWguY3VycmVudD09PWEmJihIKCRnKSxIKGFoKSl9dmFyIE09e2N1cnJlbnQ6MH07XG5mdW5jdGlvbiBoaChhKXtmb3IodmFyIGI9YTtudWxsIT09Yjspe2lmKDEzPT09Yi50YWcpe3ZhciBjPWIubWVtb2l6ZWRTdGF0ZTtpZihudWxsIT09YyYmKGM9Yy5kZWh5ZHJhdGVkLG51bGw9PT1jfHxjLmRhdGE9PT1CZHx8Yy5kYXRhPT09Q2QpKXJldHVybiBifWVsc2UgaWYoMTk9PT1iLnRhZyYmdm9pZCAwIT09Yi5tZW1vaXplZFByb3BzLnJldmVhbE9yZGVyKXtpZigwIT09KGIuZWZmZWN0VGFnJjY0KSlyZXR1cm4gYn1lbHNlIGlmKG51bGwhPT1iLmNoaWxkKXtiLmNoaWxkLnJldHVybj1iO2I9Yi5jaGlsZDtjb250aW51ZX1pZihiPT09YSlicmVhaztmb3IoO251bGw9PT1iLnNpYmxpbmc7KXtpZihudWxsPT09Yi5yZXR1cm58fGIucmV0dXJuPT09YSlyZXR1cm4gbnVsbDtiPWIucmV0dXJufWIuc2libGluZy5yZXR1cm49Yi5yZXR1cm47Yj1iLnNpYmxpbmd9cmV0dXJuIG51bGx9ZnVuY3Rpb24gaWgoYSxiKXtyZXR1cm57cmVzcG9uZGVyOmEscHJvcHM6Yn19XG52YXIgamg9V2EuUmVhY3RDdXJyZW50RGlzcGF0Y2hlcixraD1XYS5SZWFjdEN1cnJlbnRCYXRjaENvbmZpZyxsaD0wLE49bnVsbCxPPW51bGwsUD1udWxsLG1oPSExO2Z1bmN0aW9uIFEoKXt0aHJvdyBFcnJvcih1KDMyMSkpO31mdW5jdGlvbiBuaChhLGIpe2lmKG51bGw9PT1iKXJldHVybiExO2Zvcih2YXIgYz0wO2M8Yi5sZW5ndGgmJmM8YS5sZW5ndGg7YysrKWlmKCEkZShhW2NdLGJbY10pKXJldHVybiExO3JldHVybiEwfVxuZnVuY3Rpb24gb2goYSxiLGMsZCxlLGYpe2xoPWY7Tj1iO2IubWVtb2l6ZWRTdGF0ZT1udWxsO2IudXBkYXRlUXVldWU9bnVsbDtiLmV4cGlyYXRpb25UaW1lPTA7amguY3VycmVudD1udWxsPT09YXx8bnVsbD09PWEubWVtb2l6ZWRTdGF0ZT9waDpxaDthPWMoZCxlKTtpZihiLmV4cGlyYXRpb25UaW1lPT09bGgpe2Y9MDtkb3tiLmV4cGlyYXRpb25UaW1lPTA7aWYoISgyNT5mKSl0aHJvdyBFcnJvcih1KDMwMSkpO2YrPTE7UD1PPW51bGw7Yi51cGRhdGVRdWV1ZT1udWxsO2poLmN1cnJlbnQ9cmg7YT1jKGQsZSl9d2hpbGUoYi5leHBpcmF0aW9uVGltZT09PWxoKX1qaC5jdXJyZW50PXNoO2I9bnVsbCE9PU8mJm51bGwhPT1PLm5leHQ7bGg9MDtQPU89Tj1udWxsO21oPSExO2lmKGIpdGhyb3cgRXJyb3IodSgzMDApKTtyZXR1cm4gYX1cbmZ1bmN0aW9uIHRoKCl7dmFyIGE9e21lbW9pemVkU3RhdGU6bnVsbCxiYXNlU3RhdGU6bnVsbCxiYXNlUXVldWU6bnVsbCxxdWV1ZTpudWxsLG5leHQ6bnVsbH07bnVsbD09PVA/Ti5tZW1vaXplZFN0YXRlPVA9YTpQPVAubmV4dD1hO3JldHVybiBQfWZ1bmN0aW9uIHVoKCl7aWYobnVsbD09PU8pe3ZhciBhPU4uYWx0ZXJuYXRlO2E9bnVsbCE9PWE/YS5tZW1vaXplZFN0YXRlOm51bGx9ZWxzZSBhPU8ubmV4dDt2YXIgYj1udWxsPT09UD9OLm1lbW9pemVkU3RhdGU6UC5uZXh0O2lmKG51bGwhPT1iKVA9YixPPWE7ZWxzZXtpZihudWxsPT09YSl0aHJvdyBFcnJvcih1KDMxMCkpO089YTthPXttZW1vaXplZFN0YXRlOk8ubWVtb2l6ZWRTdGF0ZSxiYXNlU3RhdGU6Ty5iYXNlU3RhdGUsYmFzZVF1ZXVlOk8uYmFzZVF1ZXVlLHF1ZXVlOk8ucXVldWUsbmV4dDpudWxsfTtudWxsPT09UD9OLm1lbW9pemVkU3RhdGU9UD1hOlA9UC5uZXh0PWF9cmV0dXJuIFB9XG5mdW5jdGlvbiB2aChhLGIpe3JldHVyblwiZnVuY3Rpb25cIj09PXR5cGVvZiBiP2IoYSk6Yn1cbmZ1bmN0aW9uIHdoKGEpe3ZhciBiPXVoKCksYz1iLnF1ZXVlO2lmKG51bGw9PT1jKXRocm93IEVycm9yKHUoMzExKSk7Yy5sYXN0UmVuZGVyZWRSZWR1Y2VyPWE7dmFyIGQ9TyxlPWQuYmFzZVF1ZXVlLGY9Yy5wZW5kaW5nO2lmKG51bGwhPT1mKXtpZihudWxsIT09ZSl7dmFyIGc9ZS5uZXh0O2UubmV4dD1mLm5leHQ7Zi5uZXh0PWd9ZC5iYXNlUXVldWU9ZT1mO2MucGVuZGluZz1udWxsfWlmKG51bGwhPT1lKXtlPWUubmV4dDtkPWQuYmFzZVN0YXRlO3ZhciBoPWc9Zj1udWxsLGs9ZTtkb3t2YXIgbD1rLmV4cGlyYXRpb25UaW1lO2lmKGw8bGgpe3ZhciBtPXtleHBpcmF0aW9uVGltZTprLmV4cGlyYXRpb25UaW1lLHN1c3BlbnNlQ29uZmlnOmsuc3VzcGVuc2VDb25maWcsYWN0aW9uOmsuYWN0aW9uLGVhZ2VyUmVkdWNlcjprLmVhZ2VyUmVkdWNlcixlYWdlclN0YXRlOmsuZWFnZXJTdGF0ZSxuZXh0Om51bGx9O251bGw9PT1oPyhnPWg9bSxmPWQpOmg9aC5uZXh0PW07bD5OLmV4cGlyYXRpb25UaW1lJiZcbihOLmV4cGlyYXRpb25UaW1lPWwsQmcobCkpfWVsc2UgbnVsbCE9PWgmJihoPWgubmV4dD17ZXhwaXJhdGlvblRpbWU6MTA3Mzc0MTgyMyxzdXNwZW5zZUNvbmZpZzprLnN1c3BlbnNlQ29uZmlnLGFjdGlvbjprLmFjdGlvbixlYWdlclJlZHVjZXI6ay5lYWdlclJlZHVjZXIsZWFnZXJTdGF0ZTprLmVhZ2VyU3RhdGUsbmV4dDpudWxsfSksQWcobCxrLnN1c3BlbnNlQ29uZmlnKSxkPWsuZWFnZXJSZWR1Y2VyPT09YT9rLmVhZ2VyU3RhdGU6YShkLGsuYWN0aW9uKTtrPWsubmV4dH13aGlsZShudWxsIT09ayYmayE9PWUpO251bGw9PT1oP2Y9ZDpoLm5leHQ9ZzskZShkLGIubWVtb2l6ZWRTdGF0ZSl8fChyZz0hMCk7Yi5tZW1vaXplZFN0YXRlPWQ7Yi5iYXNlU3RhdGU9ZjtiLmJhc2VRdWV1ZT1oO2MubGFzdFJlbmRlcmVkU3RhdGU9ZH1yZXR1cm5bYi5tZW1vaXplZFN0YXRlLGMuZGlzcGF0Y2hdfVxuZnVuY3Rpb24geGgoYSl7dmFyIGI9dWgoKSxjPWIucXVldWU7aWYobnVsbD09PWMpdGhyb3cgRXJyb3IodSgzMTEpKTtjLmxhc3RSZW5kZXJlZFJlZHVjZXI9YTt2YXIgZD1jLmRpc3BhdGNoLGU9Yy5wZW5kaW5nLGY9Yi5tZW1vaXplZFN0YXRlO2lmKG51bGwhPT1lKXtjLnBlbmRpbmc9bnVsbDt2YXIgZz1lPWUubmV4dDtkbyBmPWEoZixnLmFjdGlvbiksZz1nLm5leHQ7d2hpbGUoZyE9PWUpOyRlKGYsYi5tZW1vaXplZFN0YXRlKXx8KHJnPSEwKTtiLm1lbW9pemVkU3RhdGU9ZjtudWxsPT09Yi5iYXNlUXVldWUmJihiLmJhc2VTdGF0ZT1mKTtjLmxhc3RSZW5kZXJlZFN0YXRlPWZ9cmV0dXJuW2YsZF19XG5mdW5jdGlvbiB5aChhKXt2YXIgYj10aCgpO1wiZnVuY3Rpb25cIj09PXR5cGVvZiBhJiYoYT1hKCkpO2IubWVtb2l6ZWRTdGF0ZT1iLmJhc2VTdGF0ZT1hO2E9Yi5xdWV1ZT17cGVuZGluZzpudWxsLGRpc3BhdGNoOm51bGwsbGFzdFJlbmRlcmVkUmVkdWNlcjp2aCxsYXN0UmVuZGVyZWRTdGF0ZTphfTthPWEuZGlzcGF0Y2g9emguYmluZChudWxsLE4sYSk7cmV0dXJuW2IubWVtb2l6ZWRTdGF0ZSxhXX1mdW5jdGlvbiBBaChhLGIsYyxkKXthPXt0YWc6YSxjcmVhdGU6YixkZXN0cm95OmMsZGVwczpkLG5leHQ6bnVsbH07Yj1OLnVwZGF0ZVF1ZXVlO251bGw9PT1iPyhiPXtsYXN0RWZmZWN0Om51bGx9LE4udXBkYXRlUXVldWU9YixiLmxhc3RFZmZlY3Q9YS5uZXh0PWEpOihjPWIubGFzdEVmZmVjdCxudWxsPT09Yz9iLmxhc3RFZmZlY3Q9YS5uZXh0PWE6KGQ9Yy5uZXh0LGMubmV4dD1hLGEubmV4dD1kLGIubGFzdEVmZmVjdD1hKSk7cmV0dXJuIGF9XG5mdW5jdGlvbiBCaCgpe3JldHVybiB1aCgpLm1lbW9pemVkU3RhdGV9ZnVuY3Rpb24gQ2goYSxiLGMsZCl7dmFyIGU9dGgoKTtOLmVmZmVjdFRhZ3w9YTtlLm1lbW9pemVkU3RhdGU9QWgoMXxiLGMsdm9pZCAwLHZvaWQgMD09PWQ/bnVsbDpkKX1mdW5jdGlvbiBEaChhLGIsYyxkKXt2YXIgZT11aCgpO2Q9dm9pZCAwPT09ZD9udWxsOmQ7dmFyIGY9dm9pZCAwO2lmKG51bGwhPT1PKXt2YXIgZz1PLm1lbW9pemVkU3RhdGU7Zj1nLmRlc3Ryb3k7aWYobnVsbCE9PWQmJm5oKGQsZy5kZXBzKSl7QWgoYixjLGYsZCk7cmV0dXJufX1OLmVmZmVjdFRhZ3w9YTtlLm1lbW9pemVkU3RhdGU9QWgoMXxiLGMsZixkKX1mdW5jdGlvbiBFaChhLGIpe3JldHVybiBDaCg1MTYsNCxhLGIpfWZ1bmN0aW9uIEZoKGEsYil7cmV0dXJuIERoKDUxNiw0LGEsYil9ZnVuY3Rpb24gR2goYSxiKXtyZXR1cm4gRGgoNCwyLGEsYil9XG5mdW5jdGlvbiBIaChhLGIpe2lmKFwiZnVuY3Rpb25cIj09PXR5cGVvZiBiKXJldHVybiBhPWEoKSxiKGEpLGZ1bmN0aW9uKCl7YihudWxsKX07aWYobnVsbCE9PWImJnZvaWQgMCE9PWIpcmV0dXJuIGE9YSgpLGIuY3VycmVudD1hLGZ1bmN0aW9uKCl7Yi5jdXJyZW50PW51bGx9fWZ1bmN0aW9uIEloKGEsYixjKXtjPW51bGwhPT1jJiZ2b2lkIDAhPT1jP2MuY29uY2F0KFthXSk6bnVsbDtyZXR1cm4gRGgoNCwyLEhoLmJpbmQobnVsbCxiLGEpLGMpfWZ1bmN0aW9uIEpoKCl7fWZ1bmN0aW9uIEtoKGEsYil7dGgoKS5tZW1vaXplZFN0YXRlPVthLHZvaWQgMD09PWI/bnVsbDpiXTtyZXR1cm4gYX1mdW5jdGlvbiBMaChhLGIpe3ZhciBjPXVoKCk7Yj12b2lkIDA9PT1iP251bGw6Yjt2YXIgZD1jLm1lbW9pemVkU3RhdGU7aWYobnVsbCE9PWQmJm51bGwhPT1iJiZuaChiLGRbMV0pKXJldHVybiBkWzBdO2MubWVtb2l6ZWRTdGF0ZT1bYSxiXTtyZXR1cm4gYX1cbmZ1bmN0aW9uIE1oKGEsYil7dmFyIGM9dWgoKTtiPXZvaWQgMD09PWI/bnVsbDpiO3ZhciBkPWMubWVtb2l6ZWRTdGF0ZTtpZihudWxsIT09ZCYmbnVsbCE9PWImJm5oKGIsZFsxXSkpcmV0dXJuIGRbMF07YT1hKCk7Yy5tZW1vaXplZFN0YXRlPVthLGJdO3JldHVybiBhfWZ1bmN0aW9uIE5oKGEsYixjKXt2YXIgZD1hZygpO2NnKDk4PmQ/OTg6ZCxmdW5jdGlvbigpe2EoITApfSk7Y2coOTc8ZD85NzpkLGZ1bmN0aW9uKCl7dmFyIGQ9a2guc3VzcGVuc2U7a2guc3VzcGVuc2U9dm9pZCAwPT09Yj9udWxsOmI7dHJ5e2EoITEpLGMoKX1maW5hbGx5e2toLnN1c3BlbnNlPWR9fSl9XG5mdW5jdGlvbiB6aChhLGIsYyl7dmFyIGQ9R2coKSxlPURnLnN1c3BlbnNlO2Q9SGcoZCxhLGUpO2U9e2V4cGlyYXRpb25UaW1lOmQsc3VzcGVuc2VDb25maWc6ZSxhY3Rpb246YyxlYWdlclJlZHVjZXI6bnVsbCxlYWdlclN0YXRlOm51bGwsbmV4dDpudWxsfTt2YXIgZj1iLnBlbmRpbmc7bnVsbD09PWY/ZS5uZXh0PWU6KGUubmV4dD1mLm5leHQsZi5uZXh0PWUpO2IucGVuZGluZz1lO2Y9YS5hbHRlcm5hdGU7aWYoYT09PU58fG51bGwhPT1mJiZmPT09TiltaD0hMCxlLmV4cGlyYXRpb25UaW1lPWxoLE4uZXhwaXJhdGlvblRpbWU9bGg7ZWxzZXtpZigwPT09YS5leHBpcmF0aW9uVGltZSYmKG51bGw9PT1mfHwwPT09Zi5leHBpcmF0aW9uVGltZSkmJihmPWIubGFzdFJlbmRlcmVkUmVkdWNlcixudWxsIT09ZikpdHJ5e3ZhciBnPWIubGFzdFJlbmRlcmVkU3RhdGUsaD1mKGcsYyk7ZS5lYWdlclJlZHVjZXI9ZjtlLmVhZ2VyU3RhdGU9aDtpZigkZShoLGcpKXJldHVybn1jYXRjaChrKXt9ZmluYWxseXt9SWcoYSxcbmQpfX1cbnZhciBzaD17cmVhZENvbnRleHQ6c2csdXNlQ2FsbGJhY2s6USx1c2VDb250ZXh0OlEsdXNlRWZmZWN0OlEsdXNlSW1wZXJhdGl2ZUhhbmRsZTpRLHVzZUxheW91dEVmZmVjdDpRLHVzZU1lbW86USx1c2VSZWR1Y2VyOlEsdXNlUmVmOlEsdXNlU3RhdGU6USx1c2VEZWJ1Z1ZhbHVlOlEsdXNlUmVzcG9uZGVyOlEsdXNlRGVmZXJyZWRWYWx1ZTpRLHVzZVRyYW5zaXRpb246UX0scGg9e3JlYWRDb250ZXh0OnNnLHVzZUNhbGxiYWNrOktoLHVzZUNvbnRleHQ6c2csdXNlRWZmZWN0OkVoLHVzZUltcGVyYXRpdmVIYW5kbGU6ZnVuY3Rpb24oYSxiLGMpe2M9bnVsbCE9PWMmJnZvaWQgMCE9PWM/Yy5jb25jYXQoW2FdKTpudWxsO3JldHVybiBDaCg0LDIsSGguYmluZChudWxsLGIsYSksYyl9LHVzZUxheW91dEVmZmVjdDpmdW5jdGlvbihhLGIpe3JldHVybiBDaCg0LDIsYSxiKX0sdXNlTWVtbzpmdW5jdGlvbihhLGIpe3ZhciBjPXRoKCk7Yj12b2lkIDA9PT1iP251bGw6YjthPWEoKTtjLm1lbW9pemVkU3RhdGU9W2EsXG5iXTtyZXR1cm4gYX0sdXNlUmVkdWNlcjpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9dGgoKTtiPXZvaWQgMCE9PWM/YyhiKTpiO2QubWVtb2l6ZWRTdGF0ZT1kLmJhc2VTdGF0ZT1iO2E9ZC5xdWV1ZT17cGVuZGluZzpudWxsLGRpc3BhdGNoOm51bGwsbGFzdFJlbmRlcmVkUmVkdWNlcjphLGxhc3RSZW5kZXJlZFN0YXRlOmJ9O2E9YS5kaXNwYXRjaD16aC5iaW5kKG51bGwsTixhKTtyZXR1cm5bZC5tZW1vaXplZFN0YXRlLGFdfSx1c2VSZWY6ZnVuY3Rpb24oYSl7dmFyIGI9dGgoKTthPXtjdXJyZW50OmF9O3JldHVybiBiLm1lbW9pemVkU3RhdGU9YX0sdXNlU3RhdGU6eWgsdXNlRGVidWdWYWx1ZTpKaCx1c2VSZXNwb25kZXI6aWgsdXNlRGVmZXJyZWRWYWx1ZTpmdW5jdGlvbihhLGIpe3ZhciBjPXloKGEpLGQ9Y1swXSxlPWNbMV07RWgoZnVuY3Rpb24oKXt2YXIgYz1raC5zdXNwZW5zZTtraC5zdXNwZW5zZT12b2lkIDA9PT1iP251bGw6Yjt0cnl7ZShhKX1maW5hbGx5e2toLnN1c3BlbnNlPVxuY319LFthLGJdKTtyZXR1cm4gZH0sdXNlVHJhbnNpdGlvbjpmdW5jdGlvbihhKXt2YXIgYj15aCghMSksYz1iWzBdO2I9YlsxXTtyZXR1cm5bS2goTmguYmluZChudWxsLGIsYSksW2IsYV0pLGNdfX0scWg9e3JlYWRDb250ZXh0OnNnLHVzZUNhbGxiYWNrOkxoLHVzZUNvbnRleHQ6c2csdXNlRWZmZWN0OkZoLHVzZUltcGVyYXRpdmVIYW5kbGU6SWgsdXNlTGF5b3V0RWZmZWN0OkdoLHVzZU1lbW86TWgsdXNlUmVkdWNlcjp3aCx1c2VSZWY6QmgsdXNlU3RhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gd2godmgpfSx1c2VEZWJ1Z1ZhbHVlOkpoLHVzZVJlc3BvbmRlcjppaCx1c2VEZWZlcnJlZFZhbHVlOmZ1bmN0aW9uKGEsYil7dmFyIGM9d2godmgpLGQ9Y1swXSxlPWNbMV07RmgoZnVuY3Rpb24oKXt2YXIgYz1raC5zdXNwZW5zZTtraC5zdXNwZW5zZT12b2lkIDA9PT1iP251bGw6Yjt0cnl7ZShhKX1maW5hbGx5e2toLnN1c3BlbnNlPWN9fSxbYSxiXSk7cmV0dXJuIGR9LHVzZVRyYW5zaXRpb246ZnVuY3Rpb24oYSl7dmFyIGI9XG53aCh2aCksYz1iWzBdO2I9YlsxXTtyZXR1cm5bTGgoTmguYmluZChudWxsLGIsYSksW2IsYV0pLGNdfX0scmg9e3JlYWRDb250ZXh0OnNnLHVzZUNhbGxiYWNrOkxoLHVzZUNvbnRleHQ6c2csdXNlRWZmZWN0OkZoLHVzZUltcGVyYXRpdmVIYW5kbGU6SWgsdXNlTGF5b3V0RWZmZWN0OkdoLHVzZU1lbW86TWgsdXNlUmVkdWNlcjp4aCx1c2VSZWY6QmgsdXNlU3RhdGU6ZnVuY3Rpb24oKXtyZXR1cm4geGgodmgpfSx1c2VEZWJ1Z1ZhbHVlOkpoLHVzZVJlc3BvbmRlcjppaCx1c2VEZWZlcnJlZFZhbHVlOmZ1bmN0aW9uKGEsYil7dmFyIGM9eGgodmgpLGQ9Y1swXSxlPWNbMV07RmgoZnVuY3Rpb24oKXt2YXIgYz1raC5zdXNwZW5zZTtraC5zdXNwZW5zZT12b2lkIDA9PT1iP251bGw6Yjt0cnl7ZShhKX1maW5hbGx5e2toLnN1c3BlbnNlPWN9fSxbYSxiXSk7cmV0dXJuIGR9LHVzZVRyYW5zaXRpb246ZnVuY3Rpb24oYSl7dmFyIGI9eGgodmgpLGM9YlswXTtiPWJbMV07cmV0dXJuW0xoKE5oLmJpbmQobnVsbCxcbmIsYSksW2IsYV0pLGNdfX0sT2g9bnVsbCxQaD1udWxsLFFoPSExO2Z1bmN0aW9uIFJoKGEsYil7dmFyIGM9U2goNSxudWxsLG51bGwsMCk7Yy5lbGVtZW50VHlwZT1cIkRFTEVURURcIjtjLnR5cGU9XCJERUxFVEVEXCI7Yy5zdGF0ZU5vZGU9YjtjLnJldHVybj1hO2MuZWZmZWN0VGFnPTg7bnVsbCE9PWEubGFzdEVmZmVjdD8oYS5sYXN0RWZmZWN0Lm5leHRFZmZlY3Q9YyxhLmxhc3RFZmZlY3Q9Yyk6YS5maXJzdEVmZmVjdD1hLmxhc3RFZmZlY3Q9Y31cbmZ1bmN0aW9uIFRoKGEsYil7c3dpdGNoKGEudGFnKXtjYXNlIDU6dmFyIGM9YS50eXBlO2I9MSE9PWIubm9kZVR5cGV8fGMudG9Mb3dlckNhc2UoKSE9PWIubm9kZU5hbWUudG9Mb3dlckNhc2UoKT9udWxsOmI7cmV0dXJuIG51bGwhPT1iPyhhLnN0YXRlTm9kZT1iLCEwKTohMTtjYXNlIDY6cmV0dXJuIGI9XCJcIj09PWEucGVuZGluZ1Byb3BzfHwzIT09Yi5ub2RlVHlwZT9udWxsOmIsbnVsbCE9PWI/KGEuc3RhdGVOb2RlPWIsITApOiExO2Nhc2UgMTM6cmV0dXJuITE7ZGVmYXVsdDpyZXR1cm4hMX19XG5mdW5jdGlvbiBVaChhKXtpZihRaCl7dmFyIGI9UGg7aWYoYil7dmFyIGM9YjtpZighVGgoYSxiKSl7Yj1KZChjLm5leHRTaWJsaW5nKTtpZighYnx8IVRoKGEsYikpe2EuZWZmZWN0VGFnPWEuZWZmZWN0VGFnJi0xMDI1fDI7UWg9ITE7T2g9YTtyZXR1cm59UmgoT2gsYyl9T2g9YTtQaD1KZChiLmZpcnN0Q2hpbGQpfWVsc2UgYS5lZmZlY3RUYWc9YS5lZmZlY3RUYWcmLTEwMjV8MixRaD0hMSxPaD1hfX1mdW5jdGlvbiBWaChhKXtmb3IoYT1hLnJldHVybjtudWxsIT09YSYmNSE9PWEudGFnJiYzIT09YS50YWcmJjEzIT09YS50YWc7KWE9YS5yZXR1cm47T2g9YX1cbmZ1bmN0aW9uIFdoKGEpe2lmKGEhPT1PaClyZXR1cm4hMTtpZighUWgpcmV0dXJuIFZoKGEpLFFoPSEwLCExO3ZhciBiPWEudHlwZTtpZig1IT09YS50YWd8fFwiaGVhZFwiIT09YiYmXCJib2R5XCIhPT1iJiYhR2QoYixhLm1lbW9pemVkUHJvcHMpKWZvcihiPVBoO2I7KVJoKGEsYiksYj1KZChiLm5leHRTaWJsaW5nKTtWaChhKTtpZigxMz09PWEudGFnKXthPWEubWVtb2l6ZWRTdGF0ZTthPW51bGwhPT1hP2EuZGVoeWRyYXRlZDpudWxsO2lmKCFhKXRocm93IEVycm9yKHUoMzE3KSk7YTp7YT1hLm5leHRTaWJsaW5nO2ZvcihiPTA7YTspe2lmKDg9PT1hLm5vZGVUeXBlKXt2YXIgYz1hLmRhdGE7aWYoYz09PUFkKXtpZigwPT09Yil7UGg9SmQoYS5uZXh0U2libGluZyk7YnJlYWsgYX1iLS19ZWxzZSBjIT09emQmJmMhPT1DZCYmYyE9PUJkfHxiKyt9YT1hLm5leHRTaWJsaW5nfVBoPW51bGx9fWVsc2UgUGg9T2g/SmQoYS5zdGF0ZU5vZGUubmV4dFNpYmxpbmcpOm51bGw7cmV0dXJuITB9XG5mdW5jdGlvbiBYaCgpe1BoPU9oPW51bGw7UWg9ITF9dmFyIFloPVdhLlJlYWN0Q3VycmVudE93bmVyLHJnPSExO2Z1bmN0aW9uIFIoYSxiLGMsZCl7Yi5jaGlsZD1udWxsPT09YT9ZZyhiLG51bGwsYyxkKTpYZyhiLGEuY2hpbGQsYyxkKX1mdW5jdGlvbiBaaChhLGIsYyxkLGUpe2M9Yy5yZW5kZXI7dmFyIGY9Yi5yZWY7cWcoYixlKTtkPW9oKGEsYixjLGQsZixlKTtpZihudWxsIT09YSYmIXJnKXJldHVybiBiLnVwZGF0ZVF1ZXVlPWEudXBkYXRlUXVldWUsYi5lZmZlY3RUYWcmPS01MTcsYS5leHBpcmF0aW9uVGltZTw9ZSYmKGEuZXhwaXJhdGlvblRpbWU9MCksJGgoYSxiLGUpO2IuZWZmZWN0VGFnfD0xO1IoYSxiLGQsZSk7cmV0dXJuIGIuY2hpbGR9XG5mdW5jdGlvbiBhaShhLGIsYyxkLGUsZil7aWYobnVsbD09PWEpe3ZhciBnPWMudHlwZTtpZihcImZ1bmN0aW9uXCI9PT10eXBlb2YgZyYmIWJpKGcpJiZ2b2lkIDA9PT1nLmRlZmF1bHRQcm9wcyYmbnVsbD09PWMuY29tcGFyZSYmdm9pZCAwPT09Yy5kZWZhdWx0UHJvcHMpcmV0dXJuIGIudGFnPTE1LGIudHlwZT1nLGNpKGEsYixnLGQsZSxmKTthPVVnKGMudHlwZSxudWxsLGQsbnVsbCxiLm1vZGUsZik7YS5yZWY9Yi5yZWY7YS5yZXR1cm49YjtyZXR1cm4gYi5jaGlsZD1hfWc9YS5jaGlsZDtpZihlPGYmJihlPWcubWVtb2l6ZWRQcm9wcyxjPWMuY29tcGFyZSxjPW51bGwhPT1jP2M6YmYsYyhlLGQpJiZhLnJlZj09PWIucmVmKSlyZXR1cm4gJGgoYSxiLGYpO2IuZWZmZWN0VGFnfD0xO2E9U2coZyxkKTthLnJlZj1iLnJlZjthLnJldHVybj1iO3JldHVybiBiLmNoaWxkPWF9XG5mdW5jdGlvbiBjaShhLGIsYyxkLGUsZil7cmV0dXJuIG51bGwhPT1hJiZiZihhLm1lbW9pemVkUHJvcHMsZCkmJmEucmVmPT09Yi5yZWYmJihyZz0hMSxlPGYpPyhiLmV4cGlyYXRpb25UaW1lPWEuZXhwaXJhdGlvblRpbWUsJGgoYSxiLGYpKTpkaShhLGIsYyxkLGYpfWZ1bmN0aW9uIGVpKGEsYil7dmFyIGM9Yi5yZWY7aWYobnVsbD09PWEmJm51bGwhPT1jfHxudWxsIT09YSYmYS5yZWYhPT1jKWIuZWZmZWN0VGFnfD0xMjh9ZnVuY3Rpb24gZGkoYSxiLGMsZCxlKXt2YXIgZj1MKGMpP0JmOkouY3VycmVudDtmPUNmKGIsZik7cWcoYixlKTtjPW9oKGEsYixjLGQsZixlKTtpZihudWxsIT09YSYmIXJnKXJldHVybiBiLnVwZGF0ZVF1ZXVlPWEudXBkYXRlUXVldWUsYi5lZmZlY3RUYWcmPS01MTcsYS5leHBpcmF0aW9uVGltZTw9ZSYmKGEuZXhwaXJhdGlvblRpbWU9MCksJGgoYSxiLGUpO2IuZWZmZWN0VGFnfD0xO1IoYSxiLGMsZSk7cmV0dXJuIGIuY2hpbGR9XG5mdW5jdGlvbiBmaShhLGIsYyxkLGUpe2lmKEwoYykpe3ZhciBmPSEwO0dmKGIpfWVsc2UgZj0hMTtxZyhiLGUpO2lmKG51bGw9PT1iLnN0YXRlTm9kZSludWxsIT09YSYmKGEuYWx0ZXJuYXRlPW51bGwsYi5hbHRlcm5hdGU9bnVsbCxiLmVmZmVjdFRhZ3w9MiksTGcoYixjLGQpLE5nKGIsYyxkLGUpLGQ9ITA7ZWxzZSBpZihudWxsPT09YSl7dmFyIGc9Yi5zdGF0ZU5vZGUsaD1iLm1lbW9pemVkUHJvcHM7Zy5wcm9wcz1oO3ZhciBrPWcuY29udGV4dCxsPWMuY29udGV4dFR5cGU7XCJvYmplY3RcIj09PXR5cGVvZiBsJiZudWxsIT09bD9sPXNnKGwpOihsPUwoYyk/QmY6Si5jdXJyZW50LGw9Q2YoYixsKSk7dmFyIG09Yy5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMscD1cImZ1bmN0aW9uXCI9PT10eXBlb2YgbXx8XCJmdW5jdGlvblwiPT09dHlwZW9mIGcuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGU7cHx8XCJmdW5jdGlvblwiIT09dHlwZW9mIGcuVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMmJlxuXCJmdW5jdGlvblwiIT09dHlwZW9mIGcuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc3x8KGghPT1kfHxrIT09bCkmJk1nKGIsZyxkLGwpO3RnPSExO3ZhciB4PWIubWVtb2l6ZWRTdGF0ZTtnLnN0YXRlPXg7emcoYixkLGcsZSk7az1iLm1lbW9pemVkU3RhdGU7aCE9PWR8fHghPT1rfHxLLmN1cnJlbnR8fHRnPyhcImZ1bmN0aW9uXCI9PT10eXBlb2YgbSYmKEZnKGIsYyxtLGQpLGs9Yi5tZW1vaXplZFN0YXRlKSwoaD10Z3x8S2coYixjLGgsZCx4LGssbCkpPyhwfHxcImZ1bmN0aW9uXCIhPT10eXBlb2YgZy5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50JiZcImZ1bmN0aW9uXCIhPT10eXBlb2YgZy5jb21wb25lbnRXaWxsTW91bnR8fChcImZ1bmN0aW9uXCI9PT10eXBlb2YgZy5jb21wb25lbnRXaWxsTW91bnQmJmcuY29tcG9uZW50V2lsbE1vdW50KCksXCJmdW5jdGlvblwiPT09dHlwZW9mIGcuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCYmZy5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50KCkpLFwiZnVuY3Rpb25cIj09PVxudHlwZW9mIGcuY29tcG9uZW50RGlkTW91bnQmJihiLmVmZmVjdFRhZ3w9NCkpOihcImZ1bmN0aW9uXCI9PT10eXBlb2YgZy5jb21wb25lbnREaWRNb3VudCYmKGIuZWZmZWN0VGFnfD00KSxiLm1lbW9pemVkUHJvcHM9ZCxiLm1lbW9pemVkU3RhdGU9ayksZy5wcm9wcz1kLGcuc3RhdGU9ayxnLmNvbnRleHQ9bCxkPWgpOihcImZ1bmN0aW9uXCI9PT10eXBlb2YgZy5jb21wb25lbnREaWRNb3VudCYmKGIuZWZmZWN0VGFnfD00KSxkPSExKX1lbHNlIGc9Yi5zdGF0ZU5vZGUsdmcoYSxiKSxoPWIubWVtb2l6ZWRQcm9wcyxnLnByb3BzPWIudHlwZT09PWIuZWxlbWVudFR5cGU/aDppZyhiLnR5cGUsaCksaz1nLmNvbnRleHQsbD1jLmNvbnRleHRUeXBlLFwib2JqZWN0XCI9PT10eXBlb2YgbCYmbnVsbCE9PWw/bD1zZyhsKToobD1MKGMpP0JmOkouY3VycmVudCxsPUNmKGIsbCkpLG09Yy5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMsKHA9XCJmdW5jdGlvblwiPT09dHlwZW9mIG18fFwiZnVuY3Rpb25cIj09PVxudHlwZW9mIGcuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUpfHxcImZ1bmN0aW9uXCIhPT10eXBlb2YgZy5VTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyYmXCJmdW5jdGlvblwiIT09dHlwZW9mIGcuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc3x8KGghPT1kfHxrIT09bCkmJk1nKGIsZyxkLGwpLHRnPSExLGs9Yi5tZW1vaXplZFN0YXRlLGcuc3RhdGU9ayx6ZyhiLGQsZyxlKSx4PWIubWVtb2l6ZWRTdGF0ZSxoIT09ZHx8ayE9PXh8fEsuY3VycmVudHx8dGc/KFwiZnVuY3Rpb25cIj09PXR5cGVvZiBtJiYoRmcoYixjLG0sZCkseD1iLm1lbW9pemVkU3RhdGUpLChtPXRnfHxLZyhiLGMsaCxkLGsseCxsKSk/KHB8fFwiZnVuY3Rpb25cIiE9PXR5cGVvZiBnLlVOU0FGRV9jb21wb25lbnRXaWxsVXBkYXRlJiZcImZ1bmN0aW9uXCIhPT10eXBlb2YgZy5jb21wb25lbnRXaWxsVXBkYXRlfHwoXCJmdW5jdGlvblwiPT09dHlwZW9mIGcuY29tcG9uZW50V2lsbFVwZGF0ZSYmZy5jb21wb25lbnRXaWxsVXBkYXRlKGQsXG54LGwpLFwiZnVuY3Rpb25cIj09PXR5cGVvZiBnLlVOU0FGRV9jb21wb25lbnRXaWxsVXBkYXRlJiZnLlVOU0FGRV9jb21wb25lbnRXaWxsVXBkYXRlKGQseCxsKSksXCJmdW5jdGlvblwiPT09dHlwZW9mIGcuY29tcG9uZW50RGlkVXBkYXRlJiYoYi5lZmZlY3RUYWd8PTQpLFwiZnVuY3Rpb25cIj09PXR5cGVvZiBnLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlJiYoYi5lZmZlY3RUYWd8PTI1NikpOihcImZ1bmN0aW9uXCIhPT10eXBlb2YgZy5jb21wb25lbnREaWRVcGRhdGV8fGg9PT1hLm1lbW9pemVkUHJvcHMmJms9PT1hLm1lbW9pemVkU3RhdGV8fChiLmVmZmVjdFRhZ3w9NCksXCJmdW5jdGlvblwiIT09dHlwZW9mIGcuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGV8fGg9PT1hLm1lbW9pemVkUHJvcHMmJms9PT1hLm1lbW9pemVkU3RhdGV8fChiLmVmZmVjdFRhZ3w9MjU2KSxiLm1lbW9pemVkUHJvcHM9ZCxiLm1lbW9pemVkU3RhdGU9eCksZy5wcm9wcz1kLGcuc3RhdGU9eCxnLmNvbnRleHQ9bCxkPW0pOlxuKFwiZnVuY3Rpb25cIiE9PXR5cGVvZiBnLmNvbXBvbmVudERpZFVwZGF0ZXx8aD09PWEubWVtb2l6ZWRQcm9wcyYmaz09PWEubWVtb2l6ZWRTdGF0ZXx8KGIuZWZmZWN0VGFnfD00KSxcImZ1bmN0aW9uXCIhPT10eXBlb2YgZy5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZXx8aD09PWEubWVtb2l6ZWRQcm9wcyYmaz09PWEubWVtb2l6ZWRTdGF0ZXx8KGIuZWZmZWN0VGFnfD0yNTYpLGQ9ITEpO3JldHVybiBnaShhLGIsYyxkLGYsZSl9XG5mdW5jdGlvbiBnaShhLGIsYyxkLGUsZil7ZWkoYSxiKTt2YXIgZz0wIT09KGIuZWZmZWN0VGFnJjY0KTtpZighZCYmIWcpcmV0dXJuIGUmJkhmKGIsYywhMSksJGgoYSxiLGYpO2Q9Yi5zdGF0ZU5vZGU7WWguY3VycmVudD1iO3ZhciBoPWcmJlwiZnVuY3Rpb25cIiE9PXR5cGVvZiBjLmdldERlcml2ZWRTdGF0ZUZyb21FcnJvcj9udWxsOmQucmVuZGVyKCk7Yi5lZmZlY3RUYWd8PTE7bnVsbCE9PWEmJmc/KGIuY2hpbGQ9WGcoYixhLmNoaWxkLG51bGwsZiksYi5jaGlsZD1YZyhiLG51bGwsaCxmKSk6UihhLGIsaCxmKTtiLm1lbW9pemVkU3RhdGU9ZC5zdGF0ZTtlJiZIZihiLGMsITApO3JldHVybiBiLmNoaWxkfWZ1bmN0aW9uIGhpKGEpe3ZhciBiPWEuc3RhdGVOb2RlO2IucGVuZGluZ0NvbnRleHQ/RWYoYSxiLnBlbmRpbmdDb250ZXh0LGIucGVuZGluZ0NvbnRleHQhPT1iLmNvbnRleHQpOmIuY29udGV4dCYmRWYoYSxiLmNvbnRleHQsITEpO2RoKGEsYi5jb250YWluZXJJbmZvKX1cbnZhciBpaT17ZGVoeWRyYXRlZDpudWxsLHJldHJ5VGltZTowfTtcbmZ1bmN0aW9uIGppKGEsYixjKXt2YXIgZD1iLm1vZGUsZT1iLnBlbmRpbmdQcm9wcyxmPU0uY3VycmVudCxnPSExLGg7KGg9MCE9PShiLmVmZmVjdFRhZyY2NCkpfHwoaD0wIT09KGYmMikmJihudWxsPT09YXx8bnVsbCE9PWEubWVtb2l6ZWRTdGF0ZSkpO2g/KGc9ITAsYi5lZmZlY3RUYWcmPS02NSk6bnVsbCE9PWEmJm51bGw9PT1hLm1lbW9pemVkU3RhdGV8fHZvaWQgMD09PWUuZmFsbGJhY2t8fCEwPT09ZS51bnN0YWJsZV9hdm9pZFRoaXNGYWxsYmFja3x8KGZ8PTEpO0koTSxmJjEpO2lmKG51bGw9PT1hKXt2b2lkIDAhPT1lLmZhbGxiYWNrJiZVaChiKTtpZihnKXtnPWUuZmFsbGJhY2s7ZT1XZyhudWxsLGQsMCxudWxsKTtlLnJldHVybj1iO2lmKDA9PT0oYi5tb2RlJjIpKWZvcihhPW51bGwhPT1iLm1lbW9pemVkU3RhdGU/Yi5jaGlsZC5jaGlsZDpiLmNoaWxkLGUuY2hpbGQ9YTtudWxsIT09YTspYS5yZXR1cm49ZSxhPWEuc2libGluZztjPVdnKGcsZCxjLG51bGwpO2MucmV0dXJuPVxuYjtlLnNpYmxpbmc9YztiLm1lbW9pemVkU3RhdGU9aWk7Yi5jaGlsZD1lO3JldHVybiBjfWQ9ZS5jaGlsZHJlbjtiLm1lbW9pemVkU3RhdGU9bnVsbDtyZXR1cm4gYi5jaGlsZD1ZZyhiLG51bGwsZCxjKX1pZihudWxsIT09YS5tZW1vaXplZFN0YXRlKXthPWEuY2hpbGQ7ZD1hLnNpYmxpbmc7aWYoZyl7ZT1lLmZhbGxiYWNrO2M9U2coYSxhLnBlbmRpbmdQcm9wcyk7Yy5yZXR1cm49YjtpZigwPT09KGIubW9kZSYyKSYmKGc9bnVsbCE9PWIubWVtb2l6ZWRTdGF0ZT9iLmNoaWxkLmNoaWxkOmIuY2hpbGQsZyE9PWEuY2hpbGQpKWZvcihjLmNoaWxkPWc7bnVsbCE9PWc7KWcucmV0dXJuPWMsZz1nLnNpYmxpbmc7ZD1TZyhkLGUpO2QucmV0dXJuPWI7Yy5zaWJsaW5nPWQ7Yy5jaGlsZEV4cGlyYXRpb25UaW1lPTA7Yi5tZW1vaXplZFN0YXRlPWlpO2IuY2hpbGQ9YztyZXR1cm4gZH1jPVhnKGIsYS5jaGlsZCxlLmNoaWxkcmVuLGMpO2IubWVtb2l6ZWRTdGF0ZT1udWxsO3JldHVybiBiLmNoaWxkPVxuY31hPWEuY2hpbGQ7aWYoZyl7Zz1lLmZhbGxiYWNrO2U9V2cobnVsbCxkLDAsbnVsbCk7ZS5yZXR1cm49YjtlLmNoaWxkPWE7bnVsbCE9PWEmJihhLnJldHVybj1lKTtpZigwPT09KGIubW9kZSYyKSlmb3IoYT1udWxsIT09Yi5tZW1vaXplZFN0YXRlP2IuY2hpbGQuY2hpbGQ6Yi5jaGlsZCxlLmNoaWxkPWE7bnVsbCE9PWE7KWEucmV0dXJuPWUsYT1hLnNpYmxpbmc7Yz1XZyhnLGQsYyxudWxsKTtjLnJldHVybj1iO2Uuc2libGluZz1jO2MuZWZmZWN0VGFnfD0yO2UuY2hpbGRFeHBpcmF0aW9uVGltZT0wO2IubWVtb2l6ZWRTdGF0ZT1paTtiLmNoaWxkPWU7cmV0dXJuIGN9Yi5tZW1vaXplZFN0YXRlPW51bGw7cmV0dXJuIGIuY2hpbGQ9WGcoYixhLGUuY2hpbGRyZW4sYyl9XG5mdW5jdGlvbiBraShhLGIpe2EuZXhwaXJhdGlvblRpbWU8YiYmKGEuZXhwaXJhdGlvblRpbWU9Yik7dmFyIGM9YS5hbHRlcm5hdGU7bnVsbCE9PWMmJmMuZXhwaXJhdGlvblRpbWU8YiYmKGMuZXhwaXJhdGlvblRpbWU9Yik7cGcoYS5yZXR1cm4sYil9ZnVuY3Rpb24gbGkoYSxiLGMsZCxlLGYpe3ZhciBnPWEubWVtb2l6ZWRTdGF0ZTtudWxsPT09Zz9hLm1lbW9pemVkU3RhdGU9e2lzQmFja3dhcmRzOmIscmVuZGVyaW5nOm51bGwscmVuZGVyaW5nU3RhcnRUaW1lOjAsbGFzdDpkLHRhaWw6Yyx0YWlsRXhwaXJhdGlvbjowLHRhaWxNb2RlOmUsbGFzdEVmZmVjdDpmfTooZy5pc0JhY2t3YXJkcz1iLGcucmVuZGVyaW5nPW51bGwsZy5yZW5kZXJpbmdTdGFydFRpbWU9MCxnLmxhc3Q9ZCxnLnRhaWw9YyxnLnRhaWxFeHBpcmF0aW9uPTAsZy50YWlsTW9kZT1lLGcubGFzdEVmZmVjdD1mKX1cbmZ1bmN0aW9uIG1pKGEsYixjKXt2YXIgZD1iLnBlbmRpbmdQcm9wcyxlPWQucmV2ZWFsT3JkZXIsZj1kLnRhaWw7UihhLGIsZC5jaGlsZHJlbixjKTtkPU0uY3VycmVudDtpZigwIT09KGQmMikpZD1kJjF8MixiLmVmZmVjdFRhZ3w9NjQ7ZWxzZXtpZihudWxsIT09YSYmMCE9PShhLmVmZmVjdFRhZyY2NCkpYTpmb3IoYT1iLmNoaWxkO251bGwhPT1hOyl7aWYoMTM9PT1hLnRhZyludWxsIT09YS5tZW1vaXplZFN0YXRlJiZraShhLGMpO2Vsc2UgaWYoMTk9PT1hLnRhZylraShhLGMpO2Vsc2UgaWYobnVsbCE9PWEuY2hpbGQpe2EuY2hpbGQucmV0dXJuPWE7YT1hLmNoaWxkO2NvbnRpbnVlfWlmKGE9PT1iKWJyZWFrIGE7Zm9yKDtudWxsPT09YS5zaWJsaW5nOyl7aWYobnVsbD09PWEucmV0dXJufHxhLnJldHVybj09PWIpYnJlYWsgYTthPWEucmV0dXJufWEuc2libGluZy5yZXR1cm49YS5yZXR1cm47YT1hLnNpYmxpbmd9ZCY9MX1JKE0sZCk7aWYoMD09PShiLm1vZGUmMikpYi5tZW1vaXplZFN0YXRlPVxubnVsbDtlbHNlIHN3aXRjaChlKXtjYXNlIFwiZm9yd2FyZHNcIjpjPWIuY2hpbGQ7Zm9yKGU9bnVsbDtudWxsIT09YzspYT1jLmFsdGVybmF0ZSxudWxsIT09YSYmbnVsbD09PWhoKGEpJiYoZT1jKSxjPWMuc2libGluZztjPWU7bnVsbD09PWM/KGU9Yi5jaGlsZCxiLmNoaWxkPW51bGwpOihlPWMuc2libGluZyxjLnNpYmxpbmc9bnVsbCk7bGkoYiwhMSxlLGMsZixiLmxhc3RFZmZlY3QpO2JyZWFrO2Nhc2UgXCJiYWNrd2FyZHNcIjpjPW51bGw7ZT1iLmNoaWxkO2ZvcihiLmNoaWxkPW51bGw7bnVsbCE9PWU7KXthPWUuYWx0ZXJuYXRlO2lmKG51bGwhPT1hJiZudWxsPT09aGgoYSkpe2IuY2hpbGQ9ZTticmVha31hPWUuc2libGluZztlLnNpYmxpbmc9YztjPWU7ZT1hfWxpKGIsITAsYyxudWxsLGYsYi5sYXN0RWZmZWN0KTticmVhaztjYXNlIFwidG9nZXRoZXJcIjpsaShiLCExLG51bGwsbnVsbCx2b2lkIDAsYi5sYXN0RWZmZWN0KTticmVhaztkZWZhdWx0OmIubWVtb2l6ZWRTdGF0ZT1udWxsfXJldHVybiBiLmNoaWxkfVxuZnVuY3Rpb24gJGgoYSxiLGMpe251bGwhPT1hJiYoYi5kZXBlbmRlbmNpZXM9YS5kZXBlbmRlbmNpZXMpO3ZhciBkPWIuZXhwaXJhdGlvblRpbWU7MCE9PWQmJkJnKGQpO2lmKGIuY2hpbGRFeHBpcmF0aW9uVGltZTxjKXJldHVybiBudWxsO2lmKG51bGwhPT1hJiZiLmNoaWxkIT09YS5jaGlsZCl0aHJvdyBFcnJvcih1KDE1MykpO2lmKG51bGwhPT1iLmNoaWxkKXthPWIuY2hpbGQ7Yz1TZyhhLGEucGVuZGluZ1Byb3BzKTtiLmNoaWxkPWM7Zm9yKGMucmV0dXJuPWI7bnVsbCE9PWEuc2libGluZzspYT1hLnNpYmxpbmcsYz1jLnNpYmxpbmc9U2coYSxhLnBlbmRpbmdQcm9wcyksYy5yZXR1cm49YjtjLnNpYmxpbmc9bnVsbH1yZXR1cm4gYi5jaGlsZH12YXIgbmksb2kscGkscWk7XG5uaT1mdW5jdGlvbihhLGIpe2Zvcih2YXIgYz1iLmNoaWxkO251bGwhPT1jOyl7aWYoNT09PWMudGFnfHw2PT09Yy50YWcpYS5hcHBlbmRDaGlsZChjLnN0YXRlTm9kZSk7ZWxzZSBpZig0IT09Yy50YWcmJm51bGwhPT1jLmNoaWxkKXtjLmNoaWxkLnJldHVybj1jO2M9Yy5jaGlsZDtjb250aW51ZX1pZihjPT09YilicmVhaztmb3IoO251bGw9PT1jLnNpYmxpbmc7KXtpZihudWxsPT09Yy5yZXR1cm58fGMucmV0dXJuPT09YilyZXR1cm47Yz1jLnJldHVybn1jLnNpYmxpbmcucmV0dXJuPWMucmV0dXJuO2M9Yy5zaWJsaW5nfX07b2k9ZnVuY3Rpb24oKXt9O1xucGk9ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZj1hLm1lbW9pemVkUHJvcHM7aWYoZiE9PWQpe3ZhciBnPWIuc3RhdGVOb2RlO2NoKCRnLmN1cnJlbnQpO2E9bnVsbDtzd2l0Y2goYyl7Y2FzZSBcImlucHV0XCI6Zj16YihnLGYpO2Q9emIoZyxkKTthPVtdO2JyZWFrO2Nhc2UgXCJvcHRpb25cIjpmPUdiKGcsZik7ZD1HYihnLGQpO2E9W107YnJlYWs7Y2FzZSBcInNlbGVjdFwiOmY9bih7fSxmLHt2YWx1ZTp2b2lkIDB9KTtkPW4oe30sZCx7dmFsdWU6dm9pZCAwfSk7YT1bXTticmVhaztjYXNlIFwidGV4dGFyZWFcIjpmPUliKGcsZik7ZD1JYihnLGQpO2E9W107YnJlYWs7ZGVmYXVsdDpcImZ1bmN0aW9uXCIhPT10eXBlb2YgZi5vbkNsaWNrJiZcImZ1bmN0aW9uXCI9PT10eXBlb2YgZC5vbkNsaWNrJiYoZy5vbmNsaWNrPXNkKX1vZChjLGQpO3ZhciBoLGs7Yz1udWxsO2ZvcihoIGluIGYpaWYoIWQuaGFzT3duUHJvcGVydHkoaCkmJmYuaGFzT3duUHJvcGVydHkoaCkmJm51bGwhPWZbaF0paWYoXCJzdHlsZVwiPT09XG5oKWZvcihrIGluIGc9ZltoXSxnKWcuaGFzT3duUHJvcGVydHkoaykmJihjfHwoYz17fSksY1trXT1cIlwiKTtlbHNlXCJkYW5nZXJvdXNseVNldElubmVySFRNTFwiIT09aCYmXCJjaGlsZHJlblwiIT09aCYmXCJzdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5pbmdcIiE9PWgmJlwic3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nXCIhPT1oJiZcImF1dG9Gb2N1c1wiIT09aCYmKHZhLmhhc093blByb3BlcnR5KGgpP2F8fChhPVtdKTooYT1hfHxbXSkucHVzaChoLG51bGwpKTtmb3IoaCBpbiBkKXt2YXIgbD1kW2hdO2c9bnVsbCE9Zj9mW2hdOnZvaWQgMDtpZihkLmhhc093blByb3BlcnR5KGgpJiZsIT09ZyYmKG51bGwhPWx8fG51bGwhPWcpKWlmKFwic3R5bGVcIj09PWgpaWYoZyl7Zm9yKGsgaW4gZykhZy5oYXNPd25Qcm9wZXJ0eShrKXx8bCYmbC5oYXNPd25Qcm9wZXJ0eShrKXx8KGN8fChjPXt9KSxjW2tdPVwiXCIpO2ZvcihrIGluIGwpbC5oYXNPd25Qcm9wZXJ0eShrKSYmZ1trXSE9PWxba10mJihjfHwoYz17fSksXG5jW2tdPWxba10pfWVsc2UgY3x8KGF8fChhPVtdKSxhLnB1c2goaCxjKSksYz1sO2Vsc2VcImRhbmdlcm91c2x5U2V0SW5uZXJIVE1MXCI9PT1oPyhsPWw/bC5fX2h0bWw6dm9pZCAwLGc9Zz9nLl9faHRtbDp2b2lkIDAsbnVsbCE9bCYmZyE9PWwmJihhPWF8fFtdKS5wdXNoKGgsbCkpOlwiY2hpbGRyZW5cIj09PWg/Zz09PWx8fFwic3RyaW5nXCIhPT10eXBlb2YgbCYmXCJudW1iZXJcIiE9PXR5cGVvZiBsfHwoYT1hfHxbXSkucHVzaChoLFwiXCIrbCk6XCJzdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5pbmdcIiE9PWgmJlwic3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nXCIhPT1oJiYodmEuaGFzT3duUHJvcGVydHkoaCk/KG51bGwhPWwmJnJkKGUsaCksYXx8Zz09PWx8fChhPVtdKSk6KGE9YXx8W10pLnB1c2goaCxsKSl9YyYmKGE9YXx8W10pLnB1c2goXCJzdHlsZVwiLGMpO2U9YTtpZihiLnVwZGF0ZVF1ZXVlPWUpYi5lZmZlY3RUYWd8PTR9fTtcbnFpPWZ1bmN0aW9uKGEsYixjLGQpe2MhPT1kJiYoYi5lZmZlY3RUYWd8PTQpfTtmdW5jdGlvbiByaShhLGIpe3N3aXRjaChhLnRhaWxNb2RlKXtjYXNlIFwiaGlkZGVuXCI6Yj1hLnRhaWw7Zm9yKHZhciBjPW51bGw7bnVsbCE9PWI7KW51bGwhPT1iLmFsdGVybmF0ZSYmKGM9YiksYj1iLnNpYmxpbmc7bnVsbD09PWM/YS50YWlsPW51bGw6Yy5zaWJsaW5nPW51bGw7YnJlYWs7Y2FzZSBcImNvbGxhcHNlZFwiOmM9YS50YWlsO2Zvcih2YXIgZD1udWxsO251bGwhPT1jOyludWxsIT09Yy5hbHRlcm5hdGUmJihkPWMpLGM9Yy5zaWJsaW5nO251bGw9PT1kP2J8fG51bGw9PT1hLnRhaWw/YS50YWlsPW51bGw6YS50YWlsLnNpYmxpbmc9bnVsbDpkLnNpYmxpbmc9bnVsbH19XG5mdW5jdGlvbiBzaShhLGIsYyl7dmFyIGQ9Yi5wZW5kaW5nUHJvcHM7c3dpdGNoKGIudGFnKXtjYXNlIDI6Y2FzZSAxNjpjYXNlIDE1OmNhc2UgMDpjYXNlIDExOmNhc2UgNzpjYXNlIDg6Y2FzZSAxMjpjYXNlIDk6Y2FzZSAxNDpyZXR1cm4gbnVsbDtjYXNlIDE6cmV0dXJuIEwoYi50eXBlKSYmRGYoKSxudWxsO2Nhc2UgMzpyZXR1cm4gZWgoKSxIKEspLEgoSiksYz1iLnN0YXRlTm9kZSxjLnBlbmRpbmdDb250ZXh0JiYoYy5jb250ZXh0PWMucGVuZGluZ0NvbnRleHQsYy5wZW5kaW5nQ29udGV4dD1udWxsKSxudWxsIT09YSYmbnVsbCE9PWEuY2hpbGR8fCFXaChiKXx8KGIuZWZmZWN0VGFnfD00KSxvaShiKSxudWxsO2Nhc2UgNTpnaChiKTtjPWNoKGJoLmN1cnJlbnQpO3ZhciBlPWIudHlwZTtpZihudWxsIT09YSYmbnVsbCE9Yi5zdGF0ZU5vZGUpcGkoYSxiLGUsZCxjKSxhLnJlZiE9PWIucmVmJiYoYi5lZmZlY3RUYWd8PTEyOCk7ZWxzZXtpZighZCl7aWYobnVsbD09PWIuc3RhdGVOb2RlKXRocm93IEVycm9yKHUoMTY2KSk7XG5yZXR1cm4gbnVsbH1hPWNoKCRnLmN1cnJlbnQpO2lmKFdoKGIpKXtkPWIuc3RhdGVOb2RlO2U9Yi50eXBlO3ZhciBmPWIubWVtb2l6ZWRQcm9wcztkW01kXT1iO2RbTmRdPWY7c3dpdGNoKGUpe2Nhc2UgXCJpZnJhbWVcIjpjYXNlIFwib2JqZWN0XCI6Y2FzZSBcImVtYmVkXCI6RihcImxvYWRcIixkKTticmVhaztjYXNlIFwidmlkZW9cIjpjYXNlIFwiYXVkaW9cIjpmb3IoYT0wO2E8YWMubGVuZ3RoO2ErKylGKGFjW2FdLGQpO2JyZWFrO2Nhc2UgXCJzb3VyY2VcIjpGKFwiZXJyb3JcIixkKTticmVhaztjYXNlIFwiaW1nXCI6Y2FzZSBcImltYWdlXCI6Y2FzZSBcImxpbmtcIjpGKFwiZXJyb3JcIixkKTtGKFwibG9hZFwiLGQpO2JyZWFrO2Nhc2UgXCJmb3JtXCI6RihcInJlc2V0XCIsZCk7RihcInN1Ym1pdFwiLGQpO2JyZWFrO2Nhc2UgXCJkZXRhaWxzXCI6RihcInRvZ2dsZVwiLGQpO2JyZWFrO2Nhc2UgXCJpbnB1dFwiOkFiKGQsZik7RihcImludmFsaWRcIixkKTtyZChjLFwib25DaGFuZ2VcIik7YnJlYWs7Y2FzZSBcInNlbGVjdFwiOmQuX3dyYXBwZXJTdGF0ZT1cbnt3YXNNdWx0aXBsZTohIWYubXVsdGlwbGV9O0YoXCJpbnZhbGlkXCIsZCk7cmQoYyxcIm9uQ2hhbmdlXCIpO2JyZWFrO2Nhc2UgXCJ0ZXh0YXJlYVwiOkpiKGQsZiksRihcImludmFsaWRcIixkKSxyZChjLFwib25DaGFuZ2VcIil9b2QoZSxmKTthPW51bGw7Zm9yKHZhciBnIGluIGYpaWYoZi5oYXNPd25Qcm9wZXJ0eShnKSl7dmFyIGg9ZltnXTtcImNoaWxkcmVuXCI9PT1nP1wic3RyaW5nXCI9PT10eXBlb2YgaD9kLnRleHRDb250ZW50IT09aCYmKGE9W1wiY2hpbGRyZW5cIixoXSk6XCJudW1iZXJcIj09PXR5cGVvZiBoJiZkLnRleHRDb250ZW50IT09XCJcIitoJiYoYT1bXCJjaGlsZHJlblwiLFwiXCIraF0pOnZhLmhhc093blByb3BlcnR5KGcpJiZudWxsIT1oJiZyZChjLGcpfXN3aXRjaChlKXtjYXNlIFwiaW5wdXRcIjp4YihkKTtFYihkLGYsITApO2JyZWFrO2Nhc2UgXCJ0ZXh0YXJlYVwiOnhiKGQpO0xiKGQpO2JyZWFrO2Nhc2UgXCJzZWxlY3RcIjpjYXNlIFwib3B0aW9uXCI6YnJlYWs7ZGVmYXVsdDpcImZ1bmN0aW9uXCI9PT10eXBlb2YgZi5vbkNsaWNrJiZcbihkLm9uY2xpY2s9c2QpfWM9YTtiLnVwZGF0ZVF1ZXVlPWM7bnVsbCE9PWMmJihiLmVmZmVjdFRhZ3w9NCl9ZWxzZXtnPTk9PT1jLm5vZGVUeXBlP2M6Yy5vd25lckRvY3VtZW50O2E9PT1xZCYmKGE9TmIoZSkpO2E9PT1xZD9cInNjcmlwdFwiPT09ZT8oYT1nLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiksYS5pbm5lckhUTUw9XCI8c2NyaXB0PlxceDNjL3NjcmlwdD5cIixhPWEucmVtb3ZlQ2hpbGQoYS5maXJzdENoaWxkKSk6XCJzdHJpbmdcIj09PXR5cGVvZiBkLmlzP2E9Zy5jcmVhdGVFbGVtZW50KGUse2lzOmQuaXN9KTooYT1nLmNyZWF0ZUVsZW1lbnQoZSksXCJzZWxlY3RcIj09PWUmJihnPWEsZC5tdWx0aXBsZT9nLm11bHRpcGxlPSEwOmQuc2l6ZSYmKGcuc2l6ZT1kLnNpemUpKSk6YT1nLmNyZWF0ZUVsZW1lbnROUyhhLGUpO2FbTWRdPWI7YVtOZF09ZDtuaShhLGIsITEsITEpO2Iuc3RhdGVOb2RlPWE7Zz1wZChlLGQpO3N3aXRjaChlKXtjYXNlIFwiaWZyYW1lXCI6Y2FzZSBcIm9iamVjdFwiOmNhc2UgXCJlbWJlZFwiOkYoXCJsb2FkXCIsXG5hKTtoPWQ7YnJlYWs7Y2FzZSBcInZpZGVvXCI6Y2FzZSBcImF1ZGlvXCI6Zm9yKGg9MDtoPGFjLmxlbmd0aDtoKyspRihhY1toXSxhKTtoPWQ7YnJlYWs7Y2FzZSBcInNvdXJjZVwiOkYoXCJlcnJvclwiLGEpO2g9ZDticmVhaztjYXNlIFwiaW1nXCI6Y2FzZSBcImltYWdlXCI6Y2FzZSBcImxpbmtcIjpGKFwiZXJyb3JcIixhKTtGKFwibG9hZFwiLGEpO2g9ZDticmVhaztjYXNlIFwiZm9ybVwiOkYoXCJyZXNldFwiLGEpO0YoXCJzdWJtaXRcIixhKTtoPWQ7YnJlYWs7Y2FzZSBcImRldGFpbHNcIjpGKFwidG9nZ2xlXCIsYSk7aD1kO2JyZWFrO2Nhc2UgXCJpbnB1dFwiOkFiKGEsZCk7aD16YihhLGQpO0YoXCJpbnZhbGlkXCIsYSk7cmQoYyxcIm9uQ2hhbmdlXCIpO2JyZWFrO2Nhc2UgXCJvcHRpb25cIjpoPUdiKGEsZCk7YnJlYWs7Y2FzZSBcInNlbGVjdFwiOmEuX3dyYXBwZXJTdGF0ZT17d2FzTXVsdGlwbGU6ISFkLm11bHRpcGxlfTtoPW4oe30sZCx7dmFsdWU6dm9pZCAwfSk7RihcImludmFsaWRcIixhKTtyZChjLFwib25DaGFuZ2VcIik7YnJlYWs7Y2FzZSBcInRleHRhcmVhXCI6SmIoYSxcbmQpO2g9SWIoYSxkKTtGKFwiaW52YWxpZFwiLGEpO3JkKGMsXCJvbkNoYW5nZVwiKTticmVhaztkZWZhdWx0Omg9ZH1vZChlLGgpO3ZhciBrPWg7Zm9yKGYgaW4gaylpZihrLmhhc093blByb3BlcnR5KGYpKXt2YXIgbD1rW2ZdO1wic3R5bGVcIj09PWY/bWQoYSxsKTpcImRhbmdlcm91c2x5U2V0SW5uZXJIVE1MXCI9PT1mPyhsPWw/bC5fX2h0bWw6dm9pZCAwLG51bGwhPWwmJlFiKGEsbCkpOlwiY2hpbGRyZW5cIj09PWY/XCJzdHJpbmdcIj09PXR5cGVvZiBsPyhcInRleHRhcmVhXCIhPT1lfHxcIlwiIT09bCkmJlJiKGEsbCk6XCJudW1iZXJcIj09PXR5cGVvZiBsJiZSYihhLFwiXCIrbCk6XCJzdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5pbmdcIiE9PWYmJlwic3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nXCIhPT1mJiZcImF1dG9Gb2N1c1wiIT09ZiYmKHZhLmhhc093blByb3BlcnR5KGYpP251bGwhPWwmJnJkKGMsZik6bnVsbCE9bCYmWGEoYSxmLGwsZykpfXN3aXRjaChlKXtjYXNlIFwiaW5wdXRcIjp4YihhKTtFYihhLGQsITEpO1xuYnJlYWs7Y2FzZSBcInRleHRhcmVhXCI6eGIoYSk7TGIoYSk7YnJlYWs7Y2FzZSBcIm9wdGlvblwiOm51bGwhPWQudmFsdWUmJmEuc2V0QXR0cmlidXRlKFwidmFsdWVcIixcIlwiK3JiKGQudmFsdWUpKTticmVhaztjYXNlIFwic2VsZWN0XCI6YS5tdWx0aXBsZT0hIWQubXVsdGlwbGU7Yz1kLnZhbHVlO251bGwhPWM/SGIoYSwhIWQubXVsdGlwbGUsYywhMSk6bnVsbCE9ZC5kZWZhdWx0VmFsdWUmJkhiKGEsISFkLm11bHRpcGxlLGQuZGVmYXVsdFZhbHVlLCEwKTticmVhaztkZWZhdWx0OlwiZnVuY3Rpb25cIj09PXR5cGVvZiBoLm9uQ2xpY2smJihhLm9uY2xpY2s9c2QpfUZkKGUsZCkmJihiLmVmZmVjdFRhZ3w9NCl9bnVsbCE9PWIucmVmJiYoYi5lZmZlY3RUYWd8PTEyOCl9cmV0dXJuIG51bGw7Y2FzZSA2OmlmKGEmJm51bGwhPWIuc3RhdGVOb2RlKXFpKGEsYixhLm1lbW9pemVkUHJvcHMsZCk7ZWxzZXtpZihcInN0cmluZ1wiIT09dHlwZW9mIGQmJm51bGw9PT1iLnN0YXRlTm9kZSl0aHJvdyBFcnJvcih1KDE2NikpO1xuYz1jaChiaC5jdXJyZW50KTtjaCgkZy5jdXJyZW50KTtXaChiKT8oYz1iLnN0YXRlTm9kZSxkPWIubWVtb2l6ZWRQcm9wcyxjW01kXT1iLGMubm9kZVZhbHVlIT09ZCYmKGIuZWZmZWN0VGFnfD00KSk6KGM9KDk9PT1jLm5vZGVUeXBlP2M6Yy5vd25lckRvY3VtZW50KS5jcmVhdGVUZXh0Tm9kZShkKSxjW01kXT1iLGIuc3RhdGVOb2RlPWMpfXJldHVybiBudWxsO2Nhc2UgMTM6SChNKTtkPWIubWVtb2l6ZWRTdGF0ZTtpZigwIT09KGIuZWZmZWN0VGFnJjY0KSlyZXR1cm4gYi5leHBpcmF0aW9uVGltZT1jLGI7Yz1udWxsIT09ZDtkPSExO251bGw9PT1hP3ZvaWQgMCE9PWIubWVtb2l6ZWRQcm9wcy5mYWxsYmFjayYmV2goYik6KGU9YS5tZW1vaXplZFN0YXRlLGQ9bnVsbCE9PWUsY3x8bnVsbD09PWV8fChlPWEuY2hpbGQuc2libGluZyxudWxsIT09ZSYmKGY9Yi5maXJzdEVmZmVjdCxudWxsIT09Zj8oYi5maXJzdEVmZmVjdD1lLGUubmV4dEVmZmVjdD1mKTooYi5maXJzdEVmZmVjdD1iLmxhc3RFZmZlY3Q9XG5lLGUubmV4dEVmZmVjdD1udWxsKSxlLmVmZmVjdFRhZz04KSkpO2lmKGMmJiFkJiYwIT09KGIubW9kZSYyKSlpZihudWxsPT09YSYmITAhPT1iLm1lbW9pemVkUHJvcHMudW5zdGFibGVfYXZvaWRUaGlzRmFsbGJhY2t8fDAhPT0oTS5jdXJyZW50JjEpKVM9PT10aSYmKFM9dWkpO2Vsc2V7aWYoUz09PXRpfHxTPT09dWkpUz12aTswIT09d2kmJm51bGwhPT1UJiYoeGkoVCxVKSx5aShULHdpKSl9aWYoY3x8ZCliLmVmZmVjdFRhZ3w9NDtyZXR1cm4gbnVsbDtjYXNlIDQ6cmV0dXJuIGVoKCksb2koYiksbnVsbDtjYXNlIDEwOnJldHVybiBvZyhiKSxudWxsO2Nhc2UgMTc6cmV0dXJuIEwoYi50eXBlKSYmRGYoKSxudWxsO2Nhc2UgMTk6SChNKTtkPWIubWVtb2l6ZWRTdGF0ZTtpZihudWxsPT09ZClyZXR1cm4gbnVsbDtlPTAhPT0oYi5lZmZlY3RUYWcmNjQpO2Y9ZC5yZW5kZXJpbmc7aWYobnVsbD09PWYpaWYoZSlyaShkLCExKTtlbHNle2lmKFMhPT10aXx8bnVsbCE9PWEmJjAhPT0oYS5lZmZlY3RUYWcmXG42NCkpZm9yKGY9Yi5jaGlsZDtudWxsIT09Zjspe2E9aGgoZik7aWYobnVsbCE9PWEpe2IuZWZmZWN0VGFnfD02NDtyaShkLCExKTtlPWEudXBkYXRlUXVldWU7bnVsbCE9PWUmJihiLnVwZGF0ZVF1ZXVlPWUsYi5lZmZlY3RUYWd8PTQpO251bGw9PT1kLmxhc3RFZmZlY3QmJihiLmZpcnN0RWZmZWN0PW51bGwpO2IubGFzdEVmZmVjdD1kLmxhc3RFZmZlY3Q7Zm9yKGQ9Yi5jaGlsZDtudWxsIT09ZDspZT1kLGY9YyxlLmVmZmVjdFRhZyY9MixlLm5leHRFZmZlY3Q9bnVsbCxlLmZpcnN0RWZmZWN0PW51bGwsZS5sYXN0RWZmZWN0PW51bGwsYT1lLmFsdGVybmF0ZSxudWxsPT09YT8oZS5jaGlsZEV4cGlyYXRpb25UaW1lPTAsZS5leHBpcmF0aW9uVGltZT1mLGUuY2hpbGQ9bnVsbCxlLm1lbW9pemVkUHJvcHM9bnVsbCxlLm1lbW9pemVkU3RhdGU9bnVsbCxlLnVwZGF0ZVF1ZXVlPW51bGwsZS5kZXBlbmRlbmNpZXM9bnVsbCk6KGUuY2hpbGRFeHBpcmF0aW9uVGltZT1hLmNoaWxkRXhwaXJhdGlvblRpbWUsXG5lLmV4cGlyYXRpb25UaW1lPWEuZXhwaXJhdGlvblRpbWUsZS5jaGlsZD1hLmNoaWxkLGUubWVtb2l6ZWRQcm9wcz1hLm1lbW9pemVkUHJvcHMsZS5tZW1vaXplZFN0YXRlPWEubWVtb2l6ZWRTdGF0ZSxlLnVwZGF0ZVF1ZXVlPWEudXBkYXRlUXVldWUsZj1hLmRlcGVuZGVuY2llcyxlLmRlcGVuZGVuY2llcz1udWxsPT09Zj9udWxsOntleHBpcmF0aW9uVGltZTpmLmV4cGlyYXRpb25UaW1lLGZpcnN0Q29udGV4dDpmLmZpcnN0Q29udGV4dCxyZXNwb25kZXJzOmYucmVzcG9uZGVyc30pLGQ9ZC5zaWJsaW5nO0koTSxNLmN1cnJlbnQmMXwyKTtyZXR1cm4gYi5jaGlsZH1mPWYuc2libGluZ319ZWxzZXtpZighZSlpZihhPWhoKGYpLG51bGwhPT1hKXtpZihiLmVmZmVjdFRhZ3w9NjQsZT0hMCxjPWEudXBkYXRlUXVldWUsbnVsbCE9PWMmJihiLnVwZGF0ZVF1ZXVlPWMsYi5lZmZlY3RUYWd8PTQpLHJpKGQsITApLG51bGw9PT1kLnRhaWwmJlwiaGlkZGVuXCI9PT1kLnRhaWxNb2RlJiYhZi5hbHRlcm5hdGUpcmV0dXJuIGI9XG5iLmxhc3RFZmZlY3Q9ZC5sYXN0RWZmZWN0LG51bGwhPT1iJiYoYi5uZXh0RWZmZWN0PW51bGwpLG51bGx9ZWxzZSAyKiRmKCktZC5yZW5kZXJpbmdTdGFydFRpbWU+ZC50YWlsRXhwaXJhdGlvbiYmMTxjJiYoYi5lZmZlY3RUYWd8PTY0LGU9ITAscmkoZCwhMSksYi5leHBpcmF0aW9uVGltZT1iLmNoaWxkRXhwaXJhdGlvblRpbWU9Yy0xKTtkLmlzQmFja3dhcmRzPyhmLnNpYmxpbmc9Yi5jaGlsZCxiLmNoaWxkPWYpOihjPWQubGFzdCxudWxsIT09Yz9jLnNpYmxpbmc9ZjpiLmNoaWxkPWYsZC5sYXN0PWYpfXJldHVybiBudWxsIT09ZC50YWlsPygwPT09ZC50YWlsRXhwaXJhdGlvbiYmKGQudGFpbEV4cGlyYXRpb249JGYoKSs1MDApLGM9ZC50YWlsLGQucmVuZGVyaW5nPWMsZC50YWlsPWMuc2libGluZyxkLmxhc3RFZmZlY3Q9Yi5sYXN0RWZmZWN0LGQucmVuZGVyaW5nU3RhcnRUaW1lPSRmKCksYy5zaWJsaW5nPW51bGwsYj1NLmN1cnJlbnQsSShNLGU/YiYxfDI6YiYxKSxjKTpudWxsfXRocm93IEVycm9yKHUoMTU2LFxuYi50YWcpKTt9ZnVuY3Rpb24gemkoYSl7c3dpdGNoKGEudGFnKXtjYXNlIDE6TChhLnR5cGUpJiZEZigpO3ZhciBiPWEuZWZmZWN0VGFnO3JldHVybiBiJjQwOTY/KGEuZWZmZWN0VGFnPWImLTQwOTd8NjQsYSk6bnVsbDtjYXNlIDM6ZWgoKTtIKEspO0goSik7Yj1hLmVmZmVjdFRhZztpZigwIT09KGImNjQpKXRocm93IEVycm9yKHUoMjg1KSk7YS5lZmZlY3RUYWc9YiYtNDA5N3w2NDtyZXR1cm4gYTtjYXNlIDU6cmV0dXJuIGdoKGEpLG51bGw7Y2FzZSAxMzpyZXR1cm4gSChNKSxiPWEuZWZmZWN0VGFnLGImNDA5Nj8oYS5lZmZlY3RUYWc9YiYtNDA5N3w2NCxhKTpudWxsO2Nhc2UgMTk6cmV0dXJuIEgoTSksbnVsbDtjYXNlIDQ6cmV0dXJuIGVoKCksbnVsbDtjYXNlIDEwOnJldHVybiBvZyhhKSxudWxsO2RlZmF1bHQ6cmV0dXJuIG51bGx9fWZ1bmN0aW9uIEFpKGEsYil7cmV0dXJue3ZhbHVlOmEsc291cmNlOmIsc3RhY2s6cWIoYil9fVxudmFyIEJpPVwiZnVuY3Rpb25cIj09PXR5cGVvZiBXZWFrU2V0P1dlYWtTZXQ6U2V0O2Z1bmN0aW9uIENpKGEsYil7dmFyIGM9Yi5zb3VyY2UsZD1iLnN0YWNrO251bGw9PT1kJiZudWxsIT09YyYmKGQ9cWIoYykpO251bGwhPT1jJiZwYihjLnR5cGUpO2I9Yi52YWx1ZTtudWxsIT09YSYmMT09PWEudGFnJiZwYihhLnR5cGUpO3RyeXtjb25zb2xlLmVycm9yKGIpfWNhdGNoKGUpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt0aHJvdyBlO30pfX1mdW5jdGlvbiBEaShhLGIpe3RyeXtiLnByb3BzPWEubWVtb2l6ZWRQcm9wcyxiLnN0YXRlPWEubWVtb2l6ZWRTdGF0ZSxiLmNvbXBvbmVudFdpbGxVbm1vdW50KCl9Y2F0Y2goYyl7RWkoYSxjKX19ZnVuY3Rpb24gRmkoYSl7dmFyIGI9YS5yZWY7aWYobnVsbCE9PWIpaWYoXCJmdW5jdGlvblwiPT09dHlwZW9mIGIpdHJ5e2IobnVsbCl9Y2F0Y2goYyl7RWkoYSxjKX1lbHNlIGIuY3VycmVudD1udWxsfVxuZnVuY3Rpb24gR2koYSxiKXtzd2l0Y2goYi50YWcpe2Nhc2UgMDpjYXNlIDExOmNhc2UgMTU6Y2FzZSAyMjpyZXR1cm47Y2FzZSAxOmlmKGIuZWZmZWN0VGFnJjI1NiYmbnVsbCE9PWEpe3ZhciBjPWEubWVtb2l6ZWRQcm9wcyxkPWEubWVtb2l6ZWRTdGF0ZTthPWIuc3RhdGVOb2RlO2I9YS5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZShiLmVsZW1lbnRUeXBlPT09Yi50eXBlP2M6aWcoYi50eXBlLGMpLGQpO2EuX19yZWFjdEludGVybmFsU25hcHNob3RCZWZvcmVVcGRhdGU9Yn1yZXR1cm47Y2FzZSAzOmNhc2UgNTpjYXNlIDY6Y2FzZSA0OmNhc2UgMTc6cmV0dXJufXRocm93IEVycm9yKHUoMTYzKSk7fVxuZnVuY3Rpb24gSGkoYSxiKXtiPWIudXBkYXRlUXVldWU7Yj1udWxsIT09Yj9iLmxhc3RFZmZlY3Q6bnVsbDtpZihudWxsIT09Yil7dmFyIGM9Yj1iLm5leHQ7ZG97aWYoKGMudGFnJmEpPT09YSl7dmFyIGQ9Yy5kZXN0cm95O2MuZGVzdHJveT12b2lkIDA7dm9pZCAwIT09ZCYmZCgpfWM9Yy5uZXh0fXdoaWxlKGMhPT1iKX19ZnVuY3Rpb24gSWkoYSxiKXtiPWIudXBkYXRlUXVldWU7Yj1udWxsIT09Yj9iLmxhc3RFZmZlY3Q6bnVsbDtpZihudWxsIT09Yil7dmFyIGM9Yj1iLm5leHQ7ZG97aWYoKGMudGFnJmEpPT09YSl7dmFyIGQ9Yy5jcmVhdGU7Yy5kZXN0cm95PWQoKX1jPWMubmV4dH13aGlsZShjIT09Yil9fVxuZnVuY3Rpb24gSmkoYSxiLGMpe3N3aXRjaChjLnRhZyl7Y2FzZSAwOmNhc2UgMTE6Y2FzZSAxNTpjYXNlIDIyOklpKDMsYyk7cmV0dXJuO2Nhc2UgMTphPWMuc3RhdGVOb2RlO2lmKGMuZWZmZWN0VGFnJjQpaWYobnVsbD09PWIpYS5jb21wb25lbnREaWRNb3VudCgpO2Vsc2V7dmFyIGQ9Yy5lbGVtZW50VHlwZT09PWMudHlwZT9iLm1lbW9pemVkUHJvcHM6aWcoYy50eXBlLGIubWVtb2l6ZWRQcm9wcyk7YS5jb21wb25lbnREaWRVcGRhdGUoZCxiLm1lbW9pemVkU3RhdGUsYS5fX3JlYWN0SW50ZXJuYWxTbmFwc2hvdEJlZm9yZVVwZGF0ZSl9Yj1jLnVwZGF0ZVF1ZXVlO251bGwhPT1iJiZDZyhjLGIsYSk7cmV0dXJuO2Nhc2UgMzpiPWMudXBkYXRlUXVldWU7aWYobnVsbCE9PWIpe2E9bnVsbDtpZihudWxsIT09Yy5jaGlsZClzd2l0Y2goYy5jaGlsZC50YWcpe2Nhc2UgNTphPWMuY2hpbGQuc3RhdGVOb2RlO2JyZWFrO2Nhc2UgMTphPWMuY2hpbGQuc3RhdGVOb2RlfUNnKGMsYixhKX1yZXR1cm47XG5jYXNlIDU6YT1jLnN0YXRlTm9kZTtudWxsPT09YiYmYy5lZmZlY3RUYWcmNCYmRmQoYy50eXBlLGMubWVtb2l6ZWRQcm9wcykmJmEuZm9jdXMoKTtyZXR1cm47Y2FzZSA2OnJldHVybjtjYXNlIDQ6cmV0dXJuO2Nhc2UgMTI6cmV0dXJuO2Nhc2UgMTM6bnVsbD09PWMubWVtb2l6ZWRTdGF0ZSYmKGM9Yy5hbHRlcm5hdGUsbnVsbCE9PWMmJihjPWMubWVtb2l6ZWRTdGF0ZSxudWxsIT09YyYmKGM9Yy5kZWh5ZHJhdGVkLG51bGwhPT1jJiZWYyhjKSkpKTtyZXR1cm47Y2FzZSAxOTpjYXNlIDE3OmNhc2UgMjA6Y2FzZSAyMTpyZXR1cm59dGhyb3cgRXJyb3IodSgxNjMpKTt9XG5mdW5jdGlvbiBLaShhLGIsYyl7XCJmdW5jdGlvblwiPT09dHlwZW9mIExpJiZMaShiKTtzd2l0Y2goYi50YWcpe2Nhc2UgMDpjYXNlIDExOmNhc2UgMTQ6Y2FzZSAxNTpjYXNlIDIyOmE9Yi51cGRhdGVRdWV1ZTtpZihudWxsIT09YSYmKGE9YS5sYXN0RWZmZWN0LG51bGwhPT1hKSl7dmFyIGQ9YS5uZXh0O2NnKDk3PGM/OTc6YyxmdW5jdGlvbigpe3ZhciBhPWQ7ZG97dmFyIGM9YS5kZXN0cm95O2lmKHZvaWQgMCE9PWMpe3ZhciBnPWI7dHJ5e2MoKX1jYXRjaChoKXtFaShnLGgpfX1hPWEubmV4dH13aGlsZShhIT09ZCl9KX1icmVhaztjYXNlIDE6RmkoYik7Yz1iLnN0YXRlTm9kZTtcImZ1bmN0aW9uXCI9PT10eXBlb2YgYy5jb21wb25lbnRXaWxsVW5tb3VudCYmRGkoYixjKTticmVhaztjYXNlIDU6RmkoYik7YnJlYWs7Y2FzZSA0Ok1pKGEsYixjKX19XG5mdW5jdGlvbiBOaShhKXt2YXIgYj1hLmFsdGVybmF0ZTthLnJldHVybj1udWxsO2EuY2hpbGQ9bnVsbDthLm1lbW9pemVkU3RhdGU9bnVsbDthLnVwZGF0ZVF1ZXVlPW51bGw7YS5kZXBlbmRlbmNpZXM9bnVsbDthLmFsdGVybmF0ZT1udWxsO2EuZmlyc3RFZmZlY3Q9bnVsbDthLmxhc3RFZmZlY3Q9bnVsbDthLnBlbmRpbmdQcm9wcz1udWxsO2EubWVtb2l6ZWRQcm9wcz1udWxsO2Euc3RhdGVOb2RlPW51bGw7bnVsbCE9PWImJk5pKGIpfWZ1bmN0aW9uIE9pKGEpe3JldHVybiA1PT09YS50YWd8fDM9PT1hLnRhZ3x8ND09PWEudGFnfVxuZnVuY3Rpb24gUGkoYSl7YTp7Zm9yKHZhciBiPWEucmV0dXJuO251bGwhPT1iOyl7aWYoT2koYikpe3ZhciBjPWI7YnJlYWsgYX1iPWIucmV0dXJufXRocm93IEVycm9yKHUoMTYwKSk7fWI9Yy5zdGF0ZU5vZGU7c3dpdGNoKGMudGFnKXtjYXNlIDU6dmFyIGQ9ITE7YnJlYWs7Y2FzZSAzOmI9Yi5jb250YWluZXJJbmZvO2Q9ITA7YnJlYWs7Y2FzZSA0OmI9Yi5jb250YWluZXJJbmZvO2Q9ITA7YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcih1KDE2MSkpO31jLmVmZmVjdFRhZyYxNiYmKFJiKGIsXCJcIiksYy5lZmZlY3RUYWcmPS0xNyk7YTpiOmZvcihjPWE7Oyl7Zm9yKDtudWxsPT09Yy5zaWJsaW5nOyl7aWYobnVsbD09PWMucmV0dXJufHxPaShjLnJldHVybikpe2M9bnVsbDticmVhayBhfWM9Yy5yZXR1cm59Yy5zaWJsaW5nLnJldHVybj1jLnJldHVybjtmb3IoYz1jLnNpYmxpbmc7NSE9PWMudGFnJiY2IT09Yy50YWcmJjE4IT09Yy50YWc7KXtpZihjLmVmZmVjdFRhZyYyKWNvbnRpbnVlIGI7XG5pZihudWxsPT09Yy5jaGlsZHx8ND09PWMudGFnKWNvbnRpbnVlIGI7ZWxzZSBjLmNoaWxkLnJldHVybj1jLGM9Yy5jaGlsZH1pZighKGMuZWZmZWN0VGFnJjIpKXtjPWMuc3RhdGVOb2RlO2JyZWFrIGF9fWQ/UWkoYSxjLGIpOlJpKGEsYyxiKX1cbmZ1bmN0aW9uIFFpKGEsYixjKXt2YXIgZD1hLnRhZyxlPTU9PT1kfHw2PT09ZDtpZihlKWE9ZT9hLnN0YXRlTm9kZTphLnN0YXRlTm9kZS5pbnN0YW5jZSxiPzg9PT1jLm5vZGVUeXBlP2MucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoYSxiKTpjLmluc2VydEJlZm9yZShhLGIpOig4PT09Yy5ub2RlVHlwZT8oYj1jLnBhcmVudE5vZGUsYi5pbnNlcnRCZWZvcmUoYSxjKSk6KGI9YyxiLmFwcGVuZENoaWxkKGEpKSxjPWMuX3JlYWN0Um9vdENvbnRhaW5lcixudWxsIT09YyYmdm9pZCAwIT09Y3x8bnVsbCE9PWIub25jbGlja3x8KGIub25jbGljaz1zZCkpO2Vsc2UgaWYoNCE9PWQmJihhPWEuY2hpbGQsbnVsbCE9PWEpKWZvcihRaShhLGIsYyksYT1hLnNpYmxpbmc7bnVsbCE9PWE7KVFpKGEsYixjKSxhPWEuc2libGluZ31cbmZ1bmN0aW9uIFJpKGEsYixjKXt2YXIgZD1hLnRhZyxlPTU9PT1kfHw2PT09ZDtpZihlKWE9ZT9hLnN0YXRlTm9kZTphLnN0YXRlTm9kZS5pbnN0YW5jZSxiP2MuaW5zZXJ0QmVmb3JlKGEsYik6Yy5hcHBlbmRDaGlsZChhKTtlbHNlIGlmKDQhPT1kJiYoYT1hLmNoaWxkLG51bGwhPT1hKSlmb3IoUmkoYSxiLGMpLGE9YS5zaWJsaW5nO251bGwhPT1hOylSaShhLGIsYyksYT1hLnNpYmxpbmd9XG5mdW5jdGlvbiBNaShhLGIsYyl7Zm9yKHZhciBkPWIsZT0hMSxmLGc7Oyl7aWYoIWUpe2U9ZC5yZXR1cm47YTpmb3IoOzspe2lmKG51bGw9PT1lKXRocm93IEVycm9yKHUoMTYwKSk7Zj1lLnN0YXRlTm9kZTtzd2l0Y2goZS50YWcpe2Nhc2UgNTpnPSExO2JyZWFrIGE7Y2FzZSAzOmY9Zi5jb250YWluZXJJbmZvO2c9ITA7YnJlYWsgYTtjYXNlIDQ6Zj1mLmNvbnRhaW5lckluZm87Zz0hMDticmVhayBhfWU9ZS5yZXR1cm59ZT0hMH1pZig1PT09ZC50YWd8fDY9PT1kLnRhZyl7YTpmb3IodmFyIGg9YSxrPWQsbD1jLG09azs7KWlmKEtpKGgsbSxsKSxudWxsIT09bS5jaGlsZCYmNCE9PW0udGFnKW0uY2hpbGQucmV0dXJuPW0sbT1tLmNoaWxkO2Vsc2V7aWYobT09PWspYnJlYWsgYTtmb3IoO251bGw9PT1tLnNpYmxpbmc7KXtpZihudWxsPT09bS5yZXR1cm58fG0ucmV0dXJuPT09aylicmVhayBhO209bS5yZXR1cm59bS5zaWJsaW5nLnJldHVybj1tLnJldHVybjttPW0uc2libGluZ31nPyhoPVxuZixrPWQuc3RhdGVOb2RlLDg9PT1oLm5vZGVUeXBlP2gucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChrKTpoLnJlbW92ZUNoaWxkKGspKTpmLnJlbW92ZUNoaWxkKGQuc3RhdGVOb2RlKX1lbHNlIGlmKDQ9PT1kLnRhZyl7aWYobnVsbCE9PWQuY2hpbGQpe2Y9ZC5zdGF0ZU5vZGUuY29udGFpbmVySW5mbztnPSEwO2QuY2hpbGQucmV0dXJuPWQ7ZD1kLmNoaWxkO2NvbnRpbnVlfX1lbHNlIGlmKEtpKGEsZCxjKSxudWxsIT09ZC5jaGlsZCl7ZC5jaGlsZC5yZXR1cm49ZDtkPWQuY2hpbGQ7Y29udGludWV9aWYoZD09PWIpYnJlYWs7Zm9yKDtudWxsPT09ZC5zaWJsaW5nOyl7aWYobnVsbD09PWQucmV0dXJufHxkLnJldHVybj09PWIpcmV0dXJuO2Q9ZC5yZXR1cm47ND09PWQudGFnJiYoZT0hMSl9ZC5zaWJsaW5nLnJldHVybj1kLnJldHVybjtkPWQuc2libGluZ319XG5mdW5jdGlvbiBTaShhLGIpe3N3aXRjaChiLnRhZyl7Y2FzZSAwOmNhc2UgMTE6Y2FzZSAxNDpjYXNlIDE1OmNhc2UgMjI6SGkoMyxiKTtyZXR1cm47Y2FzZSAxOnJldHVybjtjYXNlIDU6dmFyIGM9Yi5zdGF0ZU5vZGU7aWYobnVsbCE9Yyl7dmFyIGQ9Yi5tZW1vaXplZFByb3BzLGU9bnVsbCE9PWE/YS5tZW1vaXplZFByb3BzOmQ7YT1iLnR5cGU7dmFyIGY9Yi51cGRhdGVRdWV1ZTtiLnVwZGF0ZVF1ZXVlPW51bGw7aWYobnVsbCE9PWYpe2NbTmRdPWQ7XCJpbnB1dFwiPT09YSYmXCJyYWRpb1wiPT09ZC50eXBlJiZudWxsIT1kLm5hbWUmJkJiKGMsZCk7cGQoYSxlKTtiPXBkKGEsZCk7Zm9yKGU9MDtlPGYubGVuZ3RoO2UrPTIpe3ZhciBnPWZbZV0saD1mW2UrMV07XCJzdHlsZVwiPT09Zz9tZChjLGgpOlwiZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUxcIj09PWc/UWIoYyxoKTpcImNoaWxkcmVuXCI9PT1nP1JiKGMsaCk6WGEoYyxnLGgsYil9c3dpdGNoKGEpe2Nhc2UgXCJpbnB1dFwiOkNiKGMsZCk7YnJlYWs7XG5jYXNlIFwidGV4dGFyZWFcIjpLYihjLGQpO2JyZWFrO2Nhc2UgXCJzZWxlY3RcIjpiPWMuX3dyYXBwZXJTdGF0ZS53YXNNdWx0aXBsZSxjLl93cmFwcGVyU3RhdGUud2FzTXVsdGlwbGU9ISFkLm11bHRpcGxlLGE9ZC52YWx1ZSxudWxsIT1hP0hiKGMsISFkLm11bHRpcGxlLGEsITEpOmIhPT0hIWQubXVsdGlwbGUmJihudWxsIT1kLmRlZmF1bHRWYWx1ZT9IYihjLCEhZC5tdWx0aXBsZSxkLmRlZmF1bHRWYWx1ZSwhMCk6SGIoYywhIWQubXVsdGlwbGUsZC5tdWx0aXBsZT9bXTpcIlwiLCExKSl9fX1yZXR1cm47Y2FzZSA2OmlmKG51bGw9PT1iLnN0YXRlTm9kZSl0aHJvdyBFcnJvcih1KDE2MikpO2Iuc3RhdGVOb2RlLm5vZGVWYWx1ZT1iLm1lbW9pemVkUHJvcHM7cmV0dXJuO2Nhc2UgMzpiPWIuc3RhdGVOb2RlO2IuaHlkcmF0ZSYmKGIuaHlkcmF0ZT0hMSxWYyhiLmNvbnRhaW5lckluZm8pKTtyZXR1cm47Y2FzZSAxMjpyZXR1cm47Y2FzZSAxMzpjPWI7bnVsbD09PWIubWVtb2l6ZWRTdGF0ZT9cbmQ9ITE6KGQ9ITAsYz1iLmNoaWxkLFRpPSRmKCkpO2lmKG51bGwhPT1jKWE6Zm9yKGE9Yzs7KXtpZig1PT09YS50YWcpZj1hLnN0YXRlTm9kZSxkPyhmPWYuc3R5bGUsXCJmdW5jdGlvblwiPT09dHlwZW9mIGYuc2V0UHJvcGVydHk/Zi5zZXRQcm9wZXJ0eShcImRpc3BsYXlcIixcIm5vbmVcIixcImltcG9ydGFudFwiKTpmLmRpc3BsYXk9XCJub25lXCIpOihmPWEuc3RhdGVOb2RlLGU9YS5tZW1vaXplZFByb3BzLnN0eWxlLGU9dm9pZCAwIT09ZSYmbnVsbCE9PWUmJmUuaGFzT3duUHJvcGVydHkoXCJkaXNwbGF5XCIpP2UuZGlzcGxheTpudWxsLGYuc3R5bGUuZGlzcGxheT1sZChcImRpc3BsYXlcIixlKSk7ZWxzZSBpZig2PT09YS50YWcpYS5zdGF0ZU5vZGUubm9kZVZhbHVlPWQ/XCJcIjphLm1lbW9pemVkUHJvcHM7ZWxzZSBpZigxMz09PWEudGFnJiZudWxsIT09YS5tZW1vaXplZFN0YXRlJiZudWxsPT09YS5tZW1vaXplZFN0YXRlLmRlaHlkcmF0ZWQpe2Y9YS5jaGlsZC5zaWJsaW5nO2YucmV0dXJuPWE7YT1cbmY7Y29udGludWV9ZWxzZSBpZihudWxsIT09YS5jaGlsZCl7YS5jaGlsZC5yZXR1cm49YTthPWEuY2hpbGQ7Y29udGludWV9aWYoYT09PWMpYnJlYWs7Zm9yKDtudWxsPT09YS5zaWJsaW5nOyl7aWYobnVsbD09PWEucmV0dXJufHxhLnJldHVybj09PWMpYnJlYWsgYTthPWEucmV0dXJufWEuc2libGluZy5yZXR1cm49YS5yZXR1cm47YT1hLnNpYmxpbmd9VWkoYik7cmV0dXJuO2Nhc2UgMTk6VWkoYik7cmV0dXJuO2Nhc2UgMTc6cmV0dXJufXRocm93IEVycm9yKHUoMTYzKSk7fWZ1bmN0aW9uIFVpKGEpe3ZhciBiPWEudXBkYXRlUXVldWU7aWYobnVsbCE9PWIpe2EudXBkYXRlUXVldWU9bnVsbDt2YXIgYz1hLnN0YXRlTm9kZTtudWxsPT09YyYmKGM9YS5zdGF0ZU5vZGU9bmV3IEJpKTtiLmZvckVhY2goZnVuY3Rpb24oYil7dmFyIGQ9VmkuYmluZChudWxsLGEsYik7Yy5oYXMoYil8fChjLmFkZChiKSxiLnRoZW4oZCxkKSl9KX19XG52YXIgV2k9XCJmdW5jdGlvblwiPT09dHlwZW9mIFdlYWtNYXA/V2Vha01hcDpNYXA7ZnVuY3Rpb24gWGkoYSxiLGMpe2M9d2coYyxudWxsKTtjLnRhZz0zO2MucGF5bG9hZD17ZWxlbWVudDpudWxsfTt2YXIgZD1iLnZhbHVlO2MuY2FsbGJhY2s9ZnVuY3Rpb24oKXtZaXx8KFlpPSEwLFppPWQpO0NpKGEsYil9O3JldHVybiBjfVxuZnVuY3Rpb24gJGkoYSxiLGMpe2M9d2coYyxudWxsKTtjLnRhZz0zO3ZhciBkPWEudHlwZS5nZXREZXJpdmVkU3RhdGVGcm9tRXJyb3I7aWYoXCJmdW5jdGlvblwiPT09dHlwZW9mIGQpe3ZhciBlPWIudmFsdWU7Yy5wYXlsb2FkPWZ1bmN0aW9uKCl7Q2koYSxiKTtyZXR1cm4gZChlKX19dmFyIGY9YS5zdGF0ZU5vZGU7bnVsbCE9PWYmJlwiZnVuY3Rpb25cIj09PXR5cGVvZiBmLmNvbXBvbmVudERpZENhdGNoJiYoYy5jYWxsYmFjaz1mdW5jdGlvbigpe1wiZnVuY3Rpb25cIiE9PXR5cGVvZiBkJiYobnVsbD09PWFqP2FqPW5ldyBTZXQoW3RoaXNdKTphai5hZGQodGhpcyksQ2koYSxiKSk7dmFyIGM9Yi5zdGFjazt0aGlzLmNvbXBvbmVudERpZENhdGNoKGIudmFsdWUse2NvbXBvbmVudFN0YWNrOm51bGwhPT1jP2M6XCJcIn0pfSk7cmV0dXJuIGN9XG52YXIgYmo9TWF0aC5jZWlsLGNqPVdhLlJlYWN0Q3VycmVudERpc3BhdGNoZXIsZGo9V2EuUmVhY3RDdXJyZW50T3duZXIsVj0wLGVqPTgsZmo9MTYsZ2o9MzIsdGk9MCxoaj0xLGlqPTIsdWk9Myx2aT00LGpqPTUsVz1WLFQ9bnVsbCxYPW51bGwsVT0wLFM9dGksa2o9bnVsbCxsaj0xMDczNzQxODIzLG1qPTEwNzM3NDE4MjMsbmo9bnVsbCx3aT0wLG9qPSExLFRpPTAscGo9NTAwLFk9bnVsbCxZaT0hMSxaaT1udWxsLGFqPW51bGwscWo9ITEscmo9bnVsbCxzaj05MCx0aj1udWxsLHVqPTAsdmo9bnVsbCx3aj0wO2Z1bmN0aW9uIEdnKCl7cmV0dXJuKFcmKGZqfGdqKSkhPT1WPzEwNzM3NDE4MjEtKCRmKCkvMTB8MCk6MCE9PXdqP3dqOndqPTEwNzM3NDE4MjEtKCRmKCkvMTB8MCl9XG5mdW5jdGlvbiBIZyhhLGIsYyl7Yj1iLm1vZGU7aWYoMD09PShiJjIpKXJldHVybiAxMDczNzQxODIzO3ZhciBkPWFnKCk7aWYoMD09PShiJjQpKXJldHVybiA5OT09PWQ/MTA3Mzc0MTgyMzoxMDczNzQxODIyO2lmKChXJmZqKSE9PVYpcmV0dXJuIFU7aWYobnVsbCE9PWMpYT1oZyhhLGMudGltZW91dE1zfDB8fDVFMywyNTApO2Vsc2Ugc3dpdGNoKGQpe2Nhc2UgOTk6YT0xMDczNzQxODIzO2JyZWFrO2Nhc2UgOTg6YT1oZyhhLDE1MCwxMDApO2JyZWFrO2Nhc2UgOTc6Y2FzZSA5NjphPWhnKGEsNUUzLDI1MCk7YnJlYWs7Y2FzZSA5NTphPTI7YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcih1KDMyNikpO31udWxsIT09VCYmYT09PVUmJi0tYTtyZXR1cm4gYX1cbmZ1bmN0aW9uIElnKGEsYil7aWYoNTA8dWopdGhyb3cgdWo9MCx2aj1udWxsLEVycm9yKHUoMTg1KSk7YT14aihhLGIpO2lmKG51bGwhPT1hKXt2YXIgYz1hZygpOzEwNzM3NDE4MjM9PT1iPyhXJmVqKSE9PVYmJihXJihmanxnaikpPT09Vj95aihhKTooWihhKSxXPT09ViYmZ2coKSk6WihhKTsoVyY0KT09PVZ8fDk4IT09YyYmOTkhPT1jfHwobnVsbD09PXRqP3RqPW5ldyBNYXAoW1thLGJdXSk6KGM9dGouZ2V0KGEpLCh2b2lkIDA9PT1jfHxjPmIpJiZ0ai5zZXQoYSxiKSkpfX1cbmZ1bmN0aW9uIHhqKGEsYil7YS5leHBpcmF0aW9uVGltZTxiJiYoYS5leHBpcmF0aW9uVGltZT1iKTt2YXIgYz1hLmFsdGVybmF0ZTtudWxsIT09YyYmYy5leHBpcmF0aW9uVGltZTxiJiYoYy5leHBpcmF0aW9uVGltZT1iKTt2YXIgZD1hLnJldHVybixlPW51bGw7aWYobnVsbD09PWQmJjM9PT1hLnRhZyllPWEuc3RhdGVOb2RlO2Vsc2UgZm9yKDtudWxsIT09ZDspe2M9ZC5hbHRlcm5hdGU7ZC5jaGlsZEV4cGlyYXRpb25UaW1lPGImJihkLmNoaWxkRXhwaXJhdGlvblRpbWU9Yik7bnVsbCE9PWMmJmMuY2hpbGRFeHBpcmF0aW9uVGltZTxiJiYoYy5jaGlsZEV4cGlyYXRpb25UaW1lPWIpO2lmKG51bGw9PT1kLnJldHVybiYmMz09PWQudGFnKXtlPWQuc3RhdGVOb2RlO2JyZWFrfWQ9ZC5yZXR1cm59bnVsbCE9PWUmJihUPT09ZSYmKEJnKGIpLFM9PT12aSYmeGkoZSxVKSkseWkoZSxiKSk7cmV0dXJuIGV9XG5mdW5jdGlvbiB6aihhKXt2YXIgYj1hLmxhc3RFeHBpcmVkVGltZTtpZigwIT09YilyZXR1cm4gYjtiPWEuZmlyc3RQZW5kaW5nVGltZTtpZighQWooYSxiKSlyZXR1cm4gYjt2YXIgYz1hLmxhc3RQaW5nZWRUaW1lO2E9YS5uZXh0S25vd25QZW5kaW5nTGV2ZWw7YT1jPmE/YzphO3JldHVybiAyPj1hJiZiIT09YT8wOmF9XG5mdW5jdGlvbiBaKGEpe2lmKDAhPT1hLmxhc3RFeHBpcmVkVGltZSlhLmNhbGxiYWNrRXhwaXJhdGlvblRpbWU9MTA3Mzc0MTgyMyxhLmNhbGxiYWNrUHJpb3JpdHk9OTksYS5jYWxsYmFja05vZGU9ZWcoeWouYmluZChudWxsLGEpKTtlbHNle3ZhciBiPXpqKGEpLGM9YS5jYWxsYmFja05vZGU7aWYoMD09PWIpbnVsbCE9PWMmJihhLmNhbGxiYWNrTm9kZT1udWxsLGEuY2FsbGJhY2tFeHBpcmF0aW9uVGltZT0wLGEuY2FsbGJhY2tQcmlvcml0eT05MCk7ZWxzZXt2YXIgZD1HZygpOzEwNzM3NDE4MjM9PT1iP2Q9OTk6MT09PWJ8fDI9PT1iP2Q9OTU6KGQ9MTAqKDEwNzM3NDE4MjEtYiktMTAqKDEwNzM3NDE4MjEtZCksZD0wPj1kPzk5OjI1MD49ZD85ODo1MjUwPj1kPzk3Ojk1KTtpZihudWxsIT09Yyl7dmFyIGU9YS5jYWxsYmFja1ByaW9yaXR5O2lmKGEuY2FsbGJhY2tFeHBpcmF0aW9uVGltZT09PWImJmU+PWQpcmV0dXJuO2MhPT1UZiYmS2YoYyl9YS5jYWxsYmFja0V4cGlyYXRpb25UaW1lPVxuYjthLmNhbGxiYWNrUHJpb3JpdHk9ZDtiPTEwNzM3NDE4MjM9PT1iP2VnKHlqLmJpbmQobnVsbCxhKSk6ZGcoZCxCai5iaW5kKG51bGwsYSkse3RpbWVvdXQ6MTAqKDEwNzM3NDE4MjEtYiktJGYoKX0pO2EuY2FsbGJhY2tOb2RlPWJ9fX1cbmZ1bmN0aW9uIEJqKGEsYil7d2o9MDtpZihiKXJldHVybiBiPUdnKCksQ2ooYSxiKSxaKGEpLG51bGw7dmFyIGM9emooYSk7aWYoMCE9PWMpe2I9YS5jYWxsYmFja05vZGU7aWYoKFcmKGZqfGdqKSkhPT1WKXRocm93IEVycm9yKHUoMzI3KSk7RGooKTthPT09VCYmYz09PVV8fEVqKGEsYyk7aWYobnVsbCE9PVgpe3ZhciBkPVc7V3w9Zmo7dmFyIGU9RmooKTtkbyB0cnl7R2ooKTticmVha31jYXRjaChoKXtIaihhLGgpfXdoaWxlKDEpO25nKCk7Vz1kO2NqLmN1cnJlbnQ9ZTtpZihTPT09aGopdGhyb3cgYj1raixFaihhLGMpLHhpKGEsYyksWihhKSxiO2lmKG51bGw9PT1YKXN3aXRjaChlPWEuZmluaXNoZWRXb3JrPWEuY3VycmVudC5hbHRlcm5hdGUsYS5maW5pc2hlZEV4cGlyYXRpb25UaW1lPWMsZD1TLFQ9bnVsbCxkKXtjYXNlIHRpOmNhc2UgaGo6dGhyb3cgRXJyb3IodSgzNDUpKTtjYXNlIGlqOkNqKGEsMjxjPzI6Yyk7YnJlYWs7Y2FzZSB1aTp4aShhLGMpO2Q9YS5sYXN0U3VzcGVuZGVkVGltZTtcbmM9PT1kJiYoYS5uZXh0S25vd25QZW5kaW5nTGV2ZWw9SWooZSkpO2lmKDEwNzM3NDE4MjM9PT1saiYmKGU9VGkrcGotJGYoKSwxMDxlKSl7aWYob2ope3ZhciBmPWEubGFzdFBpbmdlZFRpbWU7aWYoMD09PWZ8fGY+PWMpe2EubGFzdFBpbmdlZFRpbWU9YztFaihhLGMpO2JyZWFrfX1mPXpqKGEpO2lmKDAhPT1mJiZmIT09YylicmVhaztpZigwIT09ZCYmZCE9PWMpe2EubGFzdFBpbmdlZFRpbWU9ZDticmVha31hLnRpbWVvdXRIYW5kbGU9SGQoSmouYmluZChudWxsLGEpLGUpO2JyZWFrfUpqKGEpO2JyZWFrO2Nhc2Ugdmk6eGkoYSxjKTtkPWEubGFzdFN1c3BlbmRlZFRpbWU7Yz09PWQmJihhLm5leHRLbm93blBlbmRpbmdMZXZlbD1JaihlKSk7aWYob2omJihlPWEubGFzdFBpbmdlZFRpbWUsMD09PWV8fGU+PWMpKXthLmxhc3RQaW5nZWRUaW1lPWM7RWooYSxjKTticmVha31lPXpqKGEpO2lmKDAhPT1lJiZlIT09YylicmVhaztpZigwIT09ZCYmZCE9PWMpe2EubGFzdFBpbmdlZFRpbWU9XG5kO2JyZWFrfTEwNzM3NDE4MjMhPT1taj9kPTEwKigxMDczNzQxODIxLW1qKS0kZigpOjEwNzM3NDE4MjM9PT1saj9kPTA6KGQ9MTAqKDEwNzM3NDE4MjEtbGopLTVFMyxlPSRmKCksYz0xMCooMTA3Mzc0MTgyMS1jKS1lLGQ9ZS1kLDA+ZCYmKGQ9MCksZD0oMTIwPmQ/MTIwOjQ4MD5kPzQ4MDoxMDgwPmQ/MTA4MDoxOTIwPmQ/MTkyMDozRTM+ZD8zRTM6NDMyMD5kPzQzMjA6MTk2MCpiaihkLzE5NjApKS1kLGM8ZCYmKGQ9YykpO2lmKDEwPGQpe2EudGltZW91dEhhbmRsZT1IZChKai5iaW5kKG51bGwsYSksZCk7YnJlYWt9SmooYSk7YnJlYWs7Y2FzZSBqajppZigxMDczNzQxODIzIT09bGomJm51bGwhPT1uail7Zj1sajt2YXIgZz1uajtkPWcuYnVzeU1pbkR1cmF0aW9uTXN8MDswPj1kP2Q9MDooZT1nLmJ1c3lEZWxheU1zfDAsZj0kZigpLSgxMCooMTA3Mzc0MTgyMS1mKS0oZy50aW1lb3V0TXN8MHx8NUUzKSksZD1mPD1lPzA6ZStkLWYpO2lmKDEwPGQpe3hpKGEsYyk7YS50aW1lb3V0SGFuZGxlPVxuSGQoSmouYmluZChudWxsLGEpLGQpO2JyZWFrfX1KaihhKTticmVhaztkZWZhdWx0OnRocm93IEVycm9yKHUoMzI5KSk7fVooYSk7aWYoYS5jYWxsYmFja05vZGU9PT1iKXJldHVybiBCai5iaW5kKG51bGwsYSl9fXJldHVybiBudWxsfVxuZnVuY3Rpb24geWooYSl7dmFyIGI9YS5sYXN0RXhwaXJlZFRpbWU7Yj0wIT09Yj9iOjEwNzM3NDE4MjM7aWYoKFcmKGZqfGdqKSkhPT1WKXRocm93IEVycm9yKHUoMzI3KSk7RGooKTthPT09VCYmYj09PVV8fEVqKGEsYik7aWYobnVsbCE9PVgpe3ZhciBjPVc7V3w9Zmo7dmFyIGQ9RmooKTtkbyB0cnl7S2ooKTticmVha31jYXRjaChlKXtIaihhLGUpfXdoaWxlKDEpO25nKCk7Vz1jO2NqLmN1cnJlbnQ9ZDtpZihTPT09aGopdGhyb3cgYz1raixFaihhLGIpLHhpKGEsYiksWihhKSxjO2lmKG51bGwhPT1YKXRocm93IEVycm9yKHUoMjYxKSk7YS5maW5pc2hlZFdvcms9YS5jdXJyZW50LmFsdGVybmF0ZTthLmZpbmlzaGVkRXhwaXJhdGlvblRpbWU9YjtUPW51bGw7SmooYSk7WihhKX1yZXR1cm4gbnVsbH1mdW5jdGlvbiBMaigpe2lmKG51bGwhPT10ail7dmFyIGE9dGo7dGo9bnVsbDthLmZvckVhY2goZnVuY3Rpb24oYSxjKXtDaihjLGEpO1ooYyl9KTtnZygpfX1cbmZ1bmN0aW9uIE1qKGEsYil7dmFyIGM9VztXfD0xO3RyeXtyZXR1cm4gYShiKX1maW5hbGx5e1c9YyxXPT09ViYmZ2coKX19ZnVuY3Rpb24gTmooYSxiKXt2YXIgYz1XO1cmPS0yO1d8PWVqO3RyeXtyZXR1cm4gYShiKX1maW5hbGx5e1c9YyxXPT09ViYmZ2coKX19XG5mdW5jdGlvbiBFaihhLGIpe2EuZmluaXNoZWRXb3JrPW51bGw7YS5maW5pc2hlZEV4cGlyYXRpb25UaW1lPTA7dmFyIGM9YS50aW1lb3V0SGFuZGxlOy0xIT09YyYmKGEudGltZW91dEhhbmRsZT0tMSxJZChjKSk7aWYobnVsbCE9PVgpZm9yKGM9WC5yZXR1cm47bnVsbCE9PWM7KXt2YXIgZD1jO3N3aXRjaChkLnRhZyl7Y2FzZSAxOmQ9ZC50eXBlLmNoaWxkQ29udGV4dFR5cGVzO251bGwhPT1kJiZ2b2lkIDAhPT1kJiZEZigpO2JyZWFrO2Nhc2UgMzplaCgpO0goSyk7SChKKTticmVhaztjYXNlIDU6Z2goZCk7YnJlYWs7Y2FzZSA0OmVoKCk7YnJlYWs7Y2FzZSAxMzpIKE0pO2JyZWFrO2Nhc2UgMTk6SChNKTticmVhaztjYXNlIDEwOm9nKGQpfWM9Yy5yZXR1cm59VD1hO1g9U2coYS5jdXJyZW50LG51bGwpO1U9YjtTPXRpO2tqPW51bGw7bWo9bGo9MTA3Mzc0MTgyMztuaj1udWxsO3dpPTA7b2o9ITF9XG5mdW5jdGlvbiBIaihhLGIpe2Rve3RyeXtuZygpO2poLmN1cnJlbnQ9c2g7aWYobWgpZm9yKHZhciBjPU4ubWVtb2l6ZWRTdGF0ZTtudWxsIT09Yzspe3ZhciBkPWMucXVldWU7bnVsbCE9PWQmJihkLnBlbmRpbmc9bnVsbCk7Yz1jLm5leHR9bGg9MDtQPU89Tj1udWxsO21oPSExO2lmKG51bGw9PT1YfHxudWxsPT09WC5yZXR1cm4pcmV0dXJuIFM9aGosa2o9YixYPW51bGw7YTp7dmFyIGU9YSxmPVgucmV0dXJuLGc9WCxoPWI7Yj1VO2cuZWZmZWN0VGFnfD0yMDQ4O2cuZmlyc3RFZmZlY3Q9Zy5sYXN0RWZmZWN0PW51bGw7aWYobnVsbCE9PWgmJlwib2JqZWN0XCI9PT10eXBlb2YgaCYmXCJmdW5jdGlvblwiPT09dHlwZW9mIGgudGhlbil7dmFyIGs9aDtpZigwPT09KGcubW9kZSYyKSl7dmFyIGw9Zy5hbHRlcm5hdGU7bD8oZy51cGRhdGVRdWV1ZT1sLnVwZGF0ZVF1ZXVlLGcubWVtb2l6ZWRTdGF0ZT1sLm1lbW9pemVkU3RhdGUsZy5leHBpcmF0aW9uVGltZT1sLmV4cGlyYXRpb25UaW1lKTooZy51cGRhdGVRdWV1ZT1cbm51bGwsZy5tZW1vaXplZFN0YXRlPW51bGwpfXZhciBtPTAhPT0oTS5jdXJyZW50JjEpLHA9Zjtkb3t2YXIgeDtpZih4PTEzPT09cC50YWcpe3ZhciB6PXAubWVtb2l6ZWRTdGF0ZTtpZihudWxsIT09eil4PW51bGwhPT16LmRlaHlkcmF0ZWQ/ITA6ITE7ZWxzZXt2YXIgY2E9cC5tZW1vaXplZFByb3BzO3g9dm9pZCAwPT09Y2EuZmFsbGJhY2s/ITE6ITAhPT1jYS51bnN0YWJsZV9hdm9pZFRoaXNGYWxsYmFjaz8hMDptPyExOiEwfX1pZih4KXt2YXIgRD1wLnVwZGF0ZVF1ZXVlO2lmKG51bGw9PT1EKXt2YXIgdD1uZXcgU2V0O3QuYWRkKGspO3AudXBkYXRlUXVldWU9dH1lbHNlIEQuYWRkKGspO2lmKDA9PT0ocC5tb2RlJjIpKXtwLmVmZmVjdFRhZ3w9NjQ7Zy5lZmZlY3RUYWcmPS0yOTgxO2lmKDE9PT1nLnRhZylpZihudWxsPT09Zy5hbHRlcm5hdGUpZy50YWc9MTc7ZWxzZXt2YXIgeT13ZygxMDczNzQxODIzLG51bGwpO3kudGFnPTI7eGcoZyx5KX1nLmV4cGlyYXRpb25UaW1lPTEwNzM3NDE4MjM7XG5icmVhayBhfWg9dm9pZCAwO2c9Yjt2YXIgQT1lLnBpbmdDYWNoZTtudWxsPT09QT8oQT1lLnBpbmdDYWNoZT1uZXcgV2ksaD1uZXcgU2V0LEEuc2V0KGssaCkpOihoPUEuZ2V0KGspLHZvaWQgMD09PWgmJihoPW5ldyBTZXQsQS5zZXQoayxoKSkpO2lmKCFoLmhhcyhnKSl7aC5hZGQoZyk7dmFyIHE9T2ouYmluZChudWxsLGUsayxnKTtrLnRoZW4ocSxxKX1wLmVmZmVjdFRhZ3w9NDA5NjtwLmV4cGlyYXRpb25UaW1lPWI7YnJlYWsgYX1wPXAucmV0dXJufXdoaWxlKG51bGwhPT1wKTtoPUVycm9yKChwYihnLnR5cGUpfHxcIkEgUmVhY3QgY29tcG9uZW50XCIpK1wiIHN1c3BlbmRlZCB3aGlsZSByZW5kZXJpbmcsIGJ1dCBubyBmYWxsYmFjayBVSSB3YXMgc3BlY2lmaWVkLlxcblxcbkFkZCBhIDxTdXNwZW5zZSBmYWxsYmFjaz0uLi4+IGNvbXBvbmVudCBoaWdoZXIgaW4gdGhlIHRyZWUgdG8gcHJvdmlkZSBhIGxvYWRpbmcgaW5kaWNhdG9yIG9yIHBsYWNlaG9sZGVyIHRvIGRpc3BsYXkuXCIrcWIoZykpfVMhPT1cbmpqJiYoUz1paik7aD1BaShoLGcpO3A9Zjtkb3tzd2l0Y2gocC50YWcpe2Nhc2UgMzprPWg7cC5lZmZlY3RUYWd8PTQwOTY7cC5leHBpcmF0aW9uVGltZT1iO3ZhciBCPVhpKHAsayxiKTt5ZyhwLEIpO2JyZWFrIGE7Y2FzZSAxOms9aDt2YXIgdz1wLnR5cGUsdWI9cC5zdGF0ZU5vZGU7aWYoMD09PShwLmVmZmVjdFRhZyY2NCkmJihcImZ1bmN0aW9uXCI9PT10eXBlb2Ygdy5nZXREZXJpdmVkU3RhdGVGcm9tRXJyb3J8fG51bGwhPT11YiYmXCJmdW5jdGlvblwiPT09dHlwZW9mIHViLmNvbXBvbmVudERpZENhdGNoJiYobnVsbD09PWFqfHwhYWouaGFzKHViKSkpKXtwLmVmZmVjdFRhZ3w9NDA5NjtwLmV4cGlyYXRpb25UaW1lPWI7dmFyIHZiPSRpKHAsayxiKTt5ZyhwLHZiKTticmVhayBhfX1wPXAucmV0dXJufXdoaWxlKG51bGwhPT1wKX1YPVBqKFgpfWNhdGNoKFhjKXtiPVhjO2NvbnRpbnVlfWJyZWFrfXdoaWxlKDEpfVxuZnVuY3Rpb24gRmooKXt2YXIgYT1jai5jdXJyZW50O2NqLmN1cnJlbnQ9c2g7cmV0dXJuIG51bGw9PT1hP3NoOmF9ZnVuY3Rpb24gQWcoYSxiKXthPGxqJiYyPGEmJihsaj1hKTtudWxsIT09YiYmYTxtaiYmMjxhJiYobWo9YSxuaj1iKX1mdW5jdGlvbiBCZyhhKXthPndpJiYod2k9YSl9ZnVuY3Rpb24gS2ooKXtmb3IoO251bGwhPT1YOylYPVFqKFgpfWZ1bmN0aW9uIEdqKCl7Zm9yKDtudWxsIT09WCYmIVVmKCk7KVg9UWooWCl9ZnVuY3Rpb24gUWooYSl7dmFyIGI9UmooYS5hbHRlcm5hdGUsYSxVKTthLm1lbW9pemVkUHJvcHM9YS5wZW5kaW5nUHJvcHM7bnVsbD09PWImJihiPVBqKGEpKTtkai5jdXJyZW50PW51bGw7cmV0dXJuIGJ9XG5mdW5jdGlvbiBQaihhKXtYPWE7ZG97dmFyIGI9WC5hbHRlcm5hdGU7YT1YLnJldHVybjtpZigwPT09KFguZWZmZWN0VGFnJjIwNDgpKXtiPXNpKGIsWCxVKTtpZigxPT09VXx8MSE9PVguY2hpbGRFeHBpcmF0aW9uVGltZSl7Zm9yKHZhciBjPTAsZD1YLmNoaWxkO251bGwhPT1kOyl7dmFyIGU9ZC5leHBpcmF0aW9uVGltZSxmPWQuY2hpbGRFeHBpcmF0aW9uVGltZTtlPmMmJihjPWUpO2Y+YyYmKGM9Zik7ZD1kLnNpYmxpbmd9WC5jaGlsZEV4cGlyYXRpb25UaW1lPWN9aWYobnVsbCE9PWIpcmV0dXJuIGI7bnVsbCE9PWEmJjA9PT0oYS5lZmZlY3RUYWcmMjA0OCkmJihudWxsPT09YS5maXJzdEVmZmVjdCYmKGEuZmlyc3RFZmZlY3Q9WC5maXJzdEVmZmVjdCksbnVsbCE9PVgubGFzdEVmZmVjdCYmKG51bGwhPT1hLmxhc3RFZmZlY3QmJihhLmxhc3RFZmZlY3QubmV4dEVmZmVjdD1YLmZpcnN0RWZmZWN0KSxhLmxhc3RFZmZlY3Q9WC5sYXN0RWZmZWN0KSwxPFguZWZmZWN0VGFnJiYobnVsbCE9PVxuYS5sYXN0RWZmZWN0P2EubGFzdEVmZmVjdC5uZXh0RWZmZWN0PVg6YS5maXJzdEVmZmVjdD1YLGEubGFzdEVmZmVjdD1YKSl9ZWxzZXtiPXppKFgpO2lmKG51bGwhPT1iKXJldHVybiBiLmVmZmVjdFRhZyY9MjA0NyxiO251bGwhPT1hJiYoYS5maXJzdEVmZmVjdD1hLmxhc3RFZmZlY3Q9bnVsbCxhLmVmZmVjdFRhZ3w9MjA0OCl9Yj1YLnNpYmxpbmc7aWYobnVsbCE9PWIpcmV0dXJuIGI7WD1hfXdoaWxlKG51bGwhPT1YKTtTPT09dGkmJihTPWpqKTtyZXR1cm4gbnVsbH1mdW5jdGlvbiBJaihhKXt2YXIgYj1hLmV4cGlyYXRpb25UaW1lO2E9YS5jaGlsZEV4cGlyYXRpb25UaW1lO3JldHVybiBiPmE/YjphfWZ1bmN0aW9uIEpqKGEpe3ZhciBiPWFnKCk7Y2coOTksU2ouYmluZChudWxsLGEsYikpO3JldHVybiBudWxsfVxuZnVuY3Rpb24gU2ooYSxiKXtkbyBEaigpO3doaWxlKG51bGwhPT1yaik7aWYoKFcmKGZqfGdqKSkhPT1WKXRocm93IEVycm9yKHUoMzI3KSk7dmFyIGM9YS5maW5pc2hlZFdvcmssZD1hLmZpbmlzaGVkRXhwaXJhdGlvblRpbWU7aWYobnVsbD09PWMpcmV0dXJuIG51bGw7YS5maW5pc2hlZFdvcms9bnVsbDthLmZpbmlzaGVkRXhwaXJhdGlvblRpbWU9MDtpZihjPT09YS5jdXJyZW50KXRocm93IEVycm9yKHUoMTc3KSk7YS5jYWxsYmFja05vZGU9bnVsbDthLmNhbGxiYWNrRXhwaXJhdGlvblRpbWU9MDthLmNhbGxiYWNrUHJpb3JpdHk9OTA7YS5uZXh0S25vd25QZW5kaW5nTGV2ZWw9MDt2YXIgZT1JaihjKTthLmZpcnN0UGVuZGluZ1RpbWU9ZTtkPD1hLmxhc3RTdXNwZW5kZWRUaW1lP2EuZmlyc3RTdXNwZW5kZWRUaW1lPWEubGFzdFN1c3BlbmRlZFRpbWU9YS5uZXh0S25vd25QZW5kaW5nTGV2ZWw9MDpkPD1hLmZpcnN0U3VzcGVuZGVkVGltZSYmKGEuZmlyc3RTdXNwZW5kZWRUaW1lPVxuZC0xKTtkPD1hLmxhc3RQaW5nZWRUaW1lJiYoYS5sYXN0UGluZ2VkVGltZT0wKTtkPD1hLmxhc3RFeHBpcmVkVGltZSYmKGEubGFzdEV4cGlyZWRUaW1lPTApO2E9PT1UJiYoWD1UPW51bGwsVT0wKTsxPGMuZWZmZWN0VGFnP251bGwhPT1jLmxhc3RFZmZlY3Q/KGMubGFzdEVmZmVjdC5uZXh0RWZmZWN0PWMsZT1jLmZpcnN0RWZmZWN0KTplPWM6ZT1jLmZpcnN0RWZmZWN0O2lmKG51bGwhPT1lKXt2YXIgZj1XO1d8PWdqO2RqLmN1cnJlbnQ9bnVsbDtEZD1mZDt2YXIgZz14ZCgpO2lmKHlkKGcpKXtpZihcInNlbGVjdGlvblN0YXJ0XCJpbiBnKXZhciBoPXtzdGFydDpnLnNlbGVjdGlvblN0YXJ0LGVuZDpnLnNlbGVjdGlvbkVuZH07ZWxzZSBhOntoPShoPWcub3duZXJEb2N1bWVudCkmJmguZGVmYXVsdFZpZXd8fHdpbmRvdzt2YXIgaz1oLmdldFNlbGVjdGlvbiYmaC5nZXRTZWxlY3Rpb24oKTtpZihrJiYwIT09ay5yYW5nZUNvdW50KXtoPWsuYW5jaG9yTm9kZTt2YXIgbD1rLmFuY2hvck9mZnNldCxcbm09ay5mb2N1c05vZGU7az1rLmZvY3VzT2Zmc2V0O3RyeXtoLm5vZGVUeXBlLG0ubm9kZVR5cGV9Y2F0Y2god2Ipe2g9bnVsbDticmVhayBhfXZhciBwPTAseD0tMSx6PS0xLGNhPTAsRD0wLHQ9Zyx5PW51bGw7Yjpmb3IoOzspe2Zvcih2YXIgQTs7KXt0IT09aHx8MCE9PWwmJjMhPT10Lm5vZGVUeXBlfHwoeD1wK2wpO3QhPT1tfHwwIT09ayYmMyE9PXQubm9kZVR5cGV8fCh6PXArayk7Mz09PXQubm9kZVR5cGUmJihwKz10Lm5vZGVWYWx1ZS5sZW5ndGgpO2lmKG51bGw9PT0oQT10LmZpcnN0Q2hpbGQpKWJyZWFrO3k9dDt0PUF9Zm9yKDs7KXtpZih0PT09ZylicmVhayBiO3k9PT1oJiYrK2NhPT09bCYmKHg9cCk7eT09PW0mJisrRD09PWsmJih6PXApO2lmKG51bGwhPT0oQT10Lm5leHRTaWJsaW5nKSlicmVhazt0PXk7eT10LnBhcmVudE5vZGV9dD1BfWg9LTE9PT14fHwtMT09PXo/bnVsbDp7c3RhcnQ6eCxlbmQ6en19ZWxzZSBoPW51bGx9aD1ofHx7c3RhcnQ6MCxlbmQ6MH19ZWxzZSBoPVxubnVsbDtFZD17YWN0aXZlRWxlbWVudERldGFjaGVkOm51bGwsZm9jdXNlZEVsZW06ZyxzZWxlY3Rpb25SYW5nZTpofTtmZD0hMTtZPWU7ZG8gdHJ5e1RqKCl9Y2F0Y2god2Ipe2lmKG51bGw9PT1ZKXRocm93IEVycm9yKHUoMzMwKSk7RWkoWSx3Yik7WT1ZLm5leHRFZmZlY3R9d2hpbGUobnVsbCE9PVkpO1k9ZTtkbyB0cnl7Zm9yKGc9YSxoPWI7bnVsbCE9PVk7KXt2YXIgcT1ZLmVmZmVjdFRhZztxJjE2JiZSYihZLnN0YXRlTm9kZSxcIlwiKTtpZihxJjEyOCl7dmFyIEI9WS5hbHRlcm5hdGU7aWYobnVsbCE9PUIpe3ZhciB3PUIucmVmO251bGwhPT13JiYoXCJmdW5jdGlvblwiPT09dHlwZW9mIHc/dyhudWxsKTp3LmN1cnJlbnQ9bnVsbCl9fXN3aXRjaChxJjEwMzgpe2Nhc2UgMjpQaShZKTtZLmVmZmVjdFRhZyY9LTM7YnJlYWs7Y2FzZSA2OlBpKFkpO1kuZWZmZWN0VGFnJj0tMztTaShZLmFsdGVybmF0ZSxZKTticmVhaztjYXNlIDEwMjQ6WS5lZmZlY3RUYWcmPS0xMDI1O2JyZWFrO2Nhc2UgMTAyODpZLmVmZmVjdFRhZyY9XG4tMTAyNTtTaShZLmFsdGVybmF0ZSxZKTticmVhaztjYXNlIDQ6U2koWS5hbHRlcm5hdGUsWSk7YnJlYWs7Y2FzZSA4Omw9WSxNaShnLGwsaCksTmkobCl9WT1ZLm5leHRFZmZlY3R9fWNhdGNoKHdiKXtpZihudWxsPT09WSl0aHJvdyBFcnJvcih1KDMzMCkpO0VpKFksd2IpO1k9WS5uZXh0RWZmZWN0fXdoaWxlKG51bGwhPT1ZKTt3PUVkO0I9eGQoKTtxPXcuZm9jdXNlZEVsZW07aD13LnNlbGVjdGlvblJhbmdlO2lmKEIhPT1xJiZxJiZxLm93bmVyRG9jdW1lbnQmJndkKHEub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQscSkpe251bGwhPT1oJiZ5ZChxKSYmKEI9aC5zdGFydCx3PWguZW5kLHZvaWQgMD09PXcmJih3PUIpLFwic2VsZWN0aW9uU3RhcnRcImluIHE/KHEuc2VsZWN0aW9uU3RhcnQ9QixxLnNlbGVjdGlvbkVuZD1NYXRoLm1pbih3LHEudmFsdWUubGVuZ3RoKSk6KHc9KEI9cS5vd25lckRvY3VtZW50fHxkb2N1bWVudCkmJkIuZGVmYXVsdFZpZXd8fHdpbmRvdyx3LmdldFNlbGVjdGlvbiYmXG4odz13LmdldFNlbGVjdGlvbigpLGw9cS50ZXh0Q29udGVudC5sZW5ndGgsZz1NYXRoLm1pbihoLnN0YXJ0LGwpLGg9dm9pZCAwPT09aC5lbmQ/ZzpNYXRoLm1pbihoLmVuZCxsKSwhdy5leHRlbmQmJmc+aCYmKGw9aCxoPWcsZz1sKSxsPXZkKHEsZyksbT12ZChxLGgpLGwmJm0mJigxIT09dy5yYW5nZUNvdW50fHx3LmFuY2hvck5vZGUhPT1sLm5vZGV8fHcuYW5jaG9yT2Zmc2V0IT09bC5vZmZzZXR8fHcuZm9jdXNOb2RlIT09bS5ub2RlfHx3LmZvY3VzT2Zmc2V0IT09bS5vZmZzZXQpJiYoQj1CLmNyZWF0ZVJhbmdlKCksQi5zZXRTdGFydChsLm5vZGUsbC5vZmZzZXQpLHcucmVtb3ZlQWxsUmFuZ2VzKCksZz5oPyh3LmFkZFJhbmdlKEIpLHcuZXh0ZW5kKG0ubm9kZSxtLm9mZnNldCkpOihCLnNldEVuZChtLm5vZGUsbS5vZmZzZXQpLHcuYWRkUmFuZ2UoQikpKSkpKTtCPVtdO2Zvcih3PXE7dz13LnBhcmVudE5vZGU7KTE9PT13Lm5vZGVUeXBlJiZCLnB1c2goe2VsZW1lbnQ6dyxsZWZ0Oncuc2Nyb2xsTGVmdCxcbnRvcDp3LnNjcm9sbFRvcH0pO1wiZnVuY3Rpb25cIj09PXR5cGVvZiBxLmZvY3VzJiZxLmZvY3VzKCk7Zm9yKHE9MDtxPEIubGVuZ3RoO3ErKyl3PUJbcV0sdy5lbGVtZW50LnNjcm9sbExlZnQ9dy5sZWZ0LHcuZWxlbWVudC5zY3JvbGxUb3A9dy50b3B9ZmQ9ISFEZDtFZD1EZD1udWxsO2EuY3VycmVudD1jO1k9ZTtkbyB0cnl7Zm9yKHE9YTtudWxsIT09WTspe3ZhciB1Yj1ZLmVmZmVjdFRhZzt1YiYzNiYmSmkocSxZLmFsdGVybmF0ZSxZKTtpZih1YiYxMjgpe0I9dm9pZCAwO3ZhciB2Yj1ZLnJlZjtpZihudWxsIT09dmIpe3ZhciBYYz1ZLnN0YXRlTm9kZTtzd2l0Y2goWS50YWcpe2Nhc2UgNTpCPVhjO2JyZWFrO2RlZmF1bHQ6Qj1YY31cImZ1bmN0aW9uXCI9PT10eXBlb2YgdmI/dmIoQik6dmIuY3VycmVudD1CfX1ZPVkubmV4dEVmZmVjdH19Y2F0Y2god2Ipe2lmKG51bGw9PT1ZKXRocm93IEVycm9yKHUoMzMwKSk7RWkoWSx3Yik7WT1ZLm5leHRFZmZlY3R9d2hpbGUobnVsbCE9PVkpO1k9XG5udWxsO1ZmKCk7Vz1mfWVsc2UgYS5jdXJyZW50PWM7aWYocWopcWo9ITEscmo9YSxzaj1iO2Vsc2UgZm9yKFk9ZTtudWxsIT09WTspYj1ZLm5leHRFZmZlY3QsWS5uZXh0RWZmZWN0PW51bGwsWT1iO2I9YS5maXJzdFBlbmRpbmdUaW1lOzA9PT1iJiYoYWo9bnVsbCk7MTA3Mzc0MTgyMz09PWI/YT09PXZqP3VqKys6KHVqPTAsdmo9YSk6dWo9MDtcImZ1bmN0aW9uXCI9PT10eXBlb2YgVWomJlVqKGMuc3RhdGVOb2RlLGQpO1ooYSk7aWYoWWkpdGhyb3cgWWk9ITEsYT1aaSxaaT1udWxsLGE7aWYoKFcmZWopIT09VilyZXR1cm4gbnVsbDtnZygpO3JldHVybiBudWxsfWZ1bmN0aW9uIFRqKCl7Zm9yKDtudWxsIT09WTspe3ZhciBhPVkuZWZmZWN0VGFnOzAhPT0oYSYyNTYpJiZHaShZLmFsdGVybmF0ZSxZKTswPT09KGEmNTEyKXx8cWp8fChxaj0hMCxkZyg5NyxmdW5jdGlvbigpe0RqKCk7cmV0dXJuIG51bGx9KSk7WT1ZLm5leHRFZmZlY3R9fVxuZnVuY3Rpb24gRGooKXtpZig5MCE9PXNqKXt2YXIgYT05Nzxzaj85Nzpzajtzaj05MDtyZXR1cm4gY2coYSxWail9fWZ1bmN0aW9uIFZqKCl7aWYobnVsbD09PXJqKXJldHVybiExO3ZhciBhPXJqO3JqPW51bGw7aWYoKFcmKGZqfGdqKSkhPT1WKXRocm93IEVycm9yKHUoMzMxKSk7dmFyIGI9VztXfD1najtmb3IoYT1hLmN1cnJlbnQuZmlyc3RFZmZlY3Q7bnVsbCE9PWE7KXt0cnl7dmFyIGM9YTtpZigwIT09KGMuZWZmZWN0VGFnJjUxMikpc3dpdGNoKGMudGFnKXtjYXNlIDA6Y2FzZSAxMTpjYXNlIDE1OmNhc2UgMjI6SGkoNSxjKSxJaSg1LGMpfX1jYXRjaChkKXtpZihudWxsPT09YSl0aHJvdyBFcnJvcih1KDMzMCkpO0VpKGEsZCl9Yz1hLm5leHRFZmZlY3Q7YS5uZXh0RWZmZWN0PW51bGw7YT1jfVc9YjtnZygpO3JldHVybiEwfVxuZnVuY3Rpb24gV2ooYSxiLGMpe2I9QWkoYyxiKTtiPVhpKGEsYiwxMDczNzQxODIzKTt4ZyhhLGIpO2E9eGooYSwxMDczNzQxODIzKTtudWxsIT09YSYmWihhKX1mdW5jdGlvbiBFaShhLGIpe2lmKDM9PT1hLnRhZylXaihhLGEsYik7ZWxzZSBmb3IodmFyIGM9YS5yZXR1cm47bnVsbCE9PWM7KXtpZigzPT09Yy50YWcpe1dqKGMsYSxiKTticmVha31lbHNlIGlmKDE9PT1jLnRhZyl7dmFyIGQ9Yy5zdGF0ZU5vZGU7aWYoXCJmdW5jdGlvblwiPT09dHlwZW9mIGMudHlwZS5nZXREZXJpdmVkU3RhdGVGcm9tRXJyb3J8fFwiZnVuY3Rpb25cIj09PXR5cGVvZiBkLmNvbXBvbmVudERpZENhdGNoJiYobnVsbD09PWFqfHwhYWouaGFzKGQpKSl7YT1BaShiLGEpO2E9JGkoYyxhLDEwNzM3NDE4MjMpO3hnKGMsYSk7Yz14aihjLDEwNzM3NDE4MjMpO251bGwhPT1jJiZaKGMpO2JyZWFrfX1jPWMucmV0dXJufX1cbmZ1bmN0aW9uIE9qKGEsYixjKXt2YXIgZD1hLnBpbmdDYWNoZTtudWxsIT09ZCYmZC5kZWxldGUoYik7VD09PWEmJlU9PT1jP1M9PT12aXx8Uz09PXVpJiYxMDczNzQxODIzPT09bGomJiRmKCktVGk8cGo/RWooYSxVKTpvaj0hMDpBaihhLGMpJiYoYj1hLmxhc3RQaW5nZWRUaW1lLDAhPT1iJiZiPGN8fChhLmxhc3RQaW5nZWRUaW1lPWMsWihhKSkpfWZ1bmN0aW9uIFZpKGEsYil7dmFyIGM9YS5zdGF0ZU5vZGU7bnVsbCE9PWMmJmMuZGVsZXRlKGIpO2I9MDswPT09YiYmKGI9R2coKSxiPUhnKGIsYSxudWxsKSk7YT14aihhLGIpO251bGwhPT1hJiZaKGEpfXZhciBSajtcblJqPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD1iLmV4cGlyYXRpb25UaW1lO2lmKG51bGwhPT1hKXt2YXIgZT1iLnBlbmRpbmdQcm9wcztpZihhLm1lbW9pemVkUHJvcHMhPT1lfHxLLmN1cnJlbnQpcmc9ITA7ZWxzZXtpZihkPGMpe3JnPSExO3N3aXRjaChiLnRhZyl7Y2FzZSAzOmhpKGIpO1hoKCk7YnJlYWs7Y2FzZSA1OmZoKGIpO2lmKGIubW9kZSY0JiYxIT09YyYmZS5oaWRkZW4pcmV0dXJuIGIuZXhwaXJhdGlvblRpbWU9Yi5jaGlsZEV4cGlyYXRpb25UaW1lPTEsbnVsbDticmVhaztjYXNlIDE6TChiLnR5cGUpJiZHZihiKTticmVhaztjYXNlIDQ6ZGgoYixiLnN0YXRlTm9kZS5jb250YWluZXJJbmZvKTticmVhaztjYXNlIDEwOmQ9Yi5tZW1vaXplZFByb3BzLnZhbHVlO2U9Yi50eXBlLl9jb250ZXh0O0koamcsZS5fY3VycmVudFZhbHVlKTtlLl9jdXJyZW50VmFsdWU9ZDticmVhaztjYXNlIDEzOmlmKG51bGwhPT1iLm1lbW9pemVkU3RhdGUpe2Q9Yi5jaGlsZC5jaGlsZEV4cGlyYXRpb25UaW1lO1xuaWYoMCE9PWQmJmQ+PWMpcmV0dXJuIGppKGEsYixjKTtJKE0sTS5jdXJyZW50JjEpO2I9JGgoYSxiLGMpO3JldHVybiBudWxsIT09Yj9iLnNpYmxpbmc6bnVsbH1JKE0sTS5jdXJyZW50JjEpO2JyZWFrO2Nhc2UgMTk6ZD1iLmNoaWxkRXhwaXJhdGlvblRpbWU+PWM7aWYoMCE9PShhLmVmZmVjdFRhZyY2NCkpe2lmKGQpcmV0dXJuIG1pKGEsYixjKTtiLmVmZmVjdFRhZ3w9NjR9ZT1iLm1lbW9pemVkU3RhdGU7bnVsbCE9PWUmJihlLnJlbmRlcmluZz1udWxsLGUudGFpbD1udWxsKTtJKE0sTS5jdXJyZW50KTtpZighZClyZXR1cm4gbnVsbH1yZXR1cm4gJGgoYSxiLGMpfXJnPSExfX1lbHNlIHJnPSExO2IuZXhwaXJhdGlvblRpbWU9MDtzd2l0Y2goYi50YWcpe2Nhc2UgMjpkPWIudHlwZTtudWxsIT09YSYmKGEuYWx0ZXJuYXRlPW51bGwsYi5hbHRlcm5hdGU9bnVsbCxiLmVmZmVjdFRhZ3w9Mik7YT1iLnBlbmRpbmdQcm9wcztlPUNmKGIsSi5jdXJyZW50KTtxZyhiLGMpO2U9b2gobnVsbCxcbmIsZCxhLGUsYyk7Yi5lZmZlY3RUYWd8PTE7aWYoXCJvYmplY3RcIj09PXR5cGVvZiBlJiZudWxsIT09ZSYmXCJmdW5jdGlvblwiPT09dHlwZW9mIGUucmVuZGVyJiZ2b2lkIDA9PT1lLiQkdHlwZW9mKXtiLnRhZz0xO2IubWVtb2l6ZWRTdGF0ZT1udWxsO2IudXBkYXRlUXVldWU9bnVsbDtpZihMKGQpKXt2YXIgZj0hMDtHZihiKX1lbHNlIGY9ITE7Yi5tZW1vaXplZFN0YXRlPW51bGwhPT1lLnN0YXRlJiZ2b2lkIDAhPT1lLnN0YXRlP2Uuc3RhdGU6bnVsbDt1ZyhiKTt2YXIgZz1kLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcztcImZ1bmN0aW9uXCI9PT10eXBlb2YgZyYmRmcoYixkLGcsYSk7ZS51cGRhdGVyPUpnO2Iuc3RhdGVOb2RlPWU7ZS5fcmVhY3RJbnRlcm5hbEZpYmVyPWI7TmcoYixkLGEsYyk7Yj1naShudWxsLGIsZCwhMCxmLGMpfWVsc2UgYi50YWc9MCxSKG51bGwsYixlLGMpLGI9Yi5jaGlsZDtyZXR1cm4gYjtjYXNlIDE2OmE6e2U9Yi5lbGVtZW50VHlwZTtudWxsIT09YSYmKGEuYWx0ZXJuYXRlPVxubnVsbCxiLmFsdGVybmF0ZT1udWxsLGIuZWZmZWN0VGFnfD0yKTthPWIucGVuZGluZ1Byb3BzO29iKGUpO2lmKDEhPT1lLl9zdGF0dXMpdGhyb3cgZS5fcmVzdWx0O2U9ZS5fcmVzdWx0O2IudHlwZT1lO2Y9Yi50YWc9WGooZSk7YT1pZyhlLGEpO3N3aXRjaChmKXtjYXNlIDA6Yj1kaShudWxsLGIsZSxhLGMpO2JyZWFrIGE7Y2FzZSAxOmI9ZmkobnVsbCxiLGUsYSxjKTticmVhayBhO2Nhc2UgMTE6Yj1aaChudWxsLGIsZSxhLGMpO2JyZWFrIGE7Y2FzZSAxNDpiPWFpKG51bGwsYixlLGlnKGUudHlwZSxhKSxkLGMpO2JyZWFrIGF9dGhyb3cgRXJyb3IodSgzMDYsZSxcIlwiKSk7fXJldHVybiBiO2Nhc2UgMDpyZXR1cm4gZD1iLnR5cGUsZT1iLnBlbmRpbmdQcm9wcyxlPWIuZWxlbWVudFR5cGU9PT1kP2U6aWcoZCxlKSxkaShhLGIsZCxlLGMpO2Nhc2UgMTpyZXR1cm4gZD1iLnR5cGUsZT1iLnBlbmRpbmdQcm9wcyxlPWIuZWxlbWVudFR5cGU9PT1kP2U6aWcoZCxlKSxmaShhLGIsZCxlLGMpO1xuY2FzZSAzOmhpKGIpO2Q9Yi51cGRhdGVRdWV1ZTtpZihudWxsPT09YXx8bnVsbD09PWQpdGhyb3cgRXJyb3IodSgyODIpKTtkPWIucGVuZGluZ1Byb3BzO2U9Yi5tZW1vaXplZFN0YXRlO2U9bnVsbCE9PWU/ZS5lbGVtZW50Om51bGw7dmcoYSxiKTt6ZyhiLGQsbnVsbCxjKTtkPWIubWVtb2l6ZWRTdGF0ZS5lbGVtZW50O2lmKGQ9PT1lKVhoKCksYj0kaChhLGIsYyk7ZWxzZXtpZihlPWIuc3RhdGVOb2RlLmh5ZHJhdGUpUGg9SmQoYi5zdGF0ZU5vZGUuY29udGFpbmVySW5mby5maXJzdENoaWxkKSxPaD1iLGU9UWg9ITA7aWYoZSlmb3IoYz1ZZyhiLG51bGwsZCxjKSxiLmNoaWxkPWM7YzspYy5lZmZlY3RUYWc9Yy5lZmZlY3RUYWcmLTN8MTAyNCxjPWMuc2libGluZztlbHNlIFIoYSxiLGQsYyksWGgoKTtiPWIuY2hpbGR9cmV0dXJuIGI7Y2FzZSA1OnJldHVybiBmaChiKSxudWxsPT09YSYmVWgoYiksZD1iLnR5cGUsZT1iLnBlbmRpbmdQcm9wcyxmPW51bGwhPT1hP2EubWVtb2l6ZWRQcm9wczpcbm51bGwsZz1lLmNoaWxkcmVuLEdkKGQsZSk/Zz1udWxsOm51bGwhPT1mJiZHZChkLGYpJiYoYi5lZmZlY3RUYWd8PTE2KSxlaShhLGIpLGIubW9kZSY0JiYxIT09YyYmZS5oaWRkZW4/KGIuZXhwaXJhdGlvblRpbWU9Yi5jaGlsZEV4cGlyYXRpb25UaW1lPTEsYj1udWxsKTooUihhLGIsZyxjKSxiPWIuY2hpbGQpLGI7Y2FzZSA2OnJldHVybiBudWxsPT09YSYmVWgoYiksbnVsbDtjYXNlIDEzOnJldHVybiBqaShhLGIsYyk7Y2FzZSA0OnJldHVybiBkaChiLGIuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8pLGQ9Yi5wZW5kaW5nUHJvcHMsbnVsbD09PWE/Yi5jaGlsZD1YZyhiLG51bGwsZCxjKTpSKGEsYixkLGMpLGIuY2hpbGQ7Y2FzZSAxMTpyZXR1cm4gZD1iLnR5cGUsZT1iLnBlbmRpbmdQcm9wcyxlPWIuZWxlbWVudFR5cGU9PT1kP2U6aWcoZCxlKSxaaChhLGIsZCxlLGMpO2Nhc2UgNzpyZXR1cm4gUihhLGIsYi5wZW5kaW5nUHJvcHMsYyksYi5jaGlsZDtjYXNlIDg6cmV0dXJuIFIoYSxcbmIsYi5wZW5kaW5nUHJvcHMuY2hpbGRyZW4sYyksYi5jaGlsZDtjYXNlIDEyOnJldHVybiBSKGEsYixiLnBlbmRpbmdQcm9wcy5jaGlsZHJlbixjKSxiLmNoaWxkO2Nhc2UgMTA6YTp7ZD1iLnR5cGUuX2NvbnRleHQ7ZT1iLnBlbmRpbmdQcm9wcztnPWIubWVtb2l6ZWRQcm9wcztmPWUudmFsdWU7dmFyIGg9Yi50eXBlLl9jb250ZXh0O0koamcsaC5fY3VycmVudFZhbHVlKTtoLl9jdXJyZW50VmFsdWU9ZjtpZihudWxsIT09ZylpZihoPWcudmFsdWUsZj0kZShoLGYpPzA6KFwiZnVuY3Rpb25cIj09PXR5cGVvZiBkLl9jYWxjdWxhdGVDaGFuZ2VkQml0cz9kLl9jYWxjdWxhdGVDaGFuZ2VkQml0cyhoLGYpOjEwNzM3NDE4MjMpfDAsMD09PWYpe2lmKGcuY2hpbGRyZW49PT1lLmNoaWxkcmVuJiYhSy5jdXJyZW50KXtiPSRoKGEsYixjKTticmVhayBhfX1lbHNlIGZvcihoPWIuY2hpbGQsbnVsbCE9PWgmJihoLnJldHVybj1iKTtudWxsIT09aDspe3ZhciBrPWguZGVwZW5kZW5jaWVzO2lmKG51bGwhPT1cbmspe2c9aC5jaGlsZDtmb3IodmFyIGw9ay5maXJzdENvbnRleHQ7bnVsbCE9PWw7KXtpZihsLmNvbnRleHQ9PT1kJiYwIT09KGwub2JzZXJ2ZWRCaXRzJmYpKXsxPT09aC50YWcmJihsPXdnKGMsbnVsbCksbC50YWc9Mix4ZyhoLGwpKTtoLmV4cGlyYXRpb25UaW1lPGMmJihoLmV4cGlyYXRpb25UaW1lPWMpO2w9aC5hbHRlcm5hdGU7bnVsbCE9PWwmJmwuZXhwaXJhdGlvblRpbWU8YyYmKGwuZXhwaXJhdGlvblRpbWU9Yyk7cGcoaC5yZXR1cm4sYyk7ay5leHBpcmF0aW9uVGltZTxjJiYoay5leHBpcmF0aW9uVGltZT1jKTticmVha31sPWwubmV4dH19ZWxzZSBnPTEwPT09aC50YWc/aC50eXBlPT09Yi50eXBlP251bGw6aC5jaGlsZDpoLmNoaWxkO2lmKG51bGwhPT1nKWcucmV0dXJuPWg7ZWxzZSBmb3IoZz1oO251bGwhPT1nOyl7aWYoZz09PWIpe2c9bnVsbDticmVha31oPWcuc2libGluZztpZihudWxsIT09aCl7aC5yZXR1cm49Zy5yZXR1cm47Zz1oO2JyZWFrfWc9Zy5yZXR1cm59aD1cbmd9UihhLGIsZS5jaGlsZHJlbixjKTtiPWIuY2hpbGR9cmV0dXJuIGI7Y2FzZSA5OnJldHVybiBlPWIudHlwZSxmPWIucGVuZGluZ1Byb3BzLGQ9Zi5jaGlsZHJlbixxZyhiLGMpLGU9c2coZSxmLnVuc3RhYmxlX29ic2VydmVkQml0cyksZD1kKGUpLGIuZWZmZWN0VGFnfD0xLFIoYSxiLGQsYyksYi5jaGlsZDtjYXNlIDE0OnJldHVybiBlPWIudHlwZSxmPWlnKGUsYi5wZW5kaW5nUHJvcHMpLGY9aWcoZS50eXBlLGYpLGFpKGEsYixlLGYsZCxjKTtjYXNlIDE1OnJldHVybiBjaShhLGIsYi50eXBlLGIucGVuZGluZ1Byb3BzLGQsYyk7Y2FzZSAxNzpyZXR1cm4gZD1iLnR5cGUsZT1iLnBlbmRpbmdQcm9wcyxlPWIuZWxlbWVudFR5cGU9PT1kP2U6aWcoZCxlKSxudWxsIT09YSYmKGEuYWx0ZXJuYXRlPW51bGwsYi5hbHRlcm5hdGU9bnVsbCxiLmVmZmVjdFRhZ3w9MiksYi50YWc9MSxMKGQpPyhhPSEwLEdmKGIpKTphPSExLHFnKGIsYyksTGcoYixkLGUpLE5nKGIsZCxlLGMpLGdpKG51bGwsXG5iLGQsITAsYSxjKTtjYXNlIDE5OnJldHVybiBtaShhLGIsYyl9dGhyb3cgRXJyb3IodSgxNTYsYi50YWcpKTt9O3ZhciBVaj1udWxsLExpPW51bGw7ZnVuY3Rpb24gWWooYSl7aWYoXCJ1bmRlZmluZWRcIj09PXR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18pcmV0dXJuITE7dmFyIGI9X19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fO2lmKGIuaXNEaXNhYmxlZHx8IWIuc3VwcG9ydHNGaWJlcilyZXR1cm4hMDt0cnl7dmFyIGM9Yi5pbmplY3QoYSk7VWo9ZnVuY3Rpb24oYSl7dHJ5e2Iub25Db21taXRGaWJlclJvb3QoYyxhLHZvaWQgMCw2ND09PShhLmN1cnJlbnQuZWZmZWN0VGFnJjY0KSl9Y2F0Y2goZSl7fX07TGk9ZnVuY3Rpb24oYSl7dHJ5e2Iub25Db21taXRGaWJlclVubW91bnQoYyxhKX1jYXRjaChlKXt9fX1jYXRjaChkKXt9cmV0dXJuITB9XG5mdW5jdGlvbiBaaihhLGIsYyxkKXt0aGlzLnRhZz1hO3RoaXMua2V5PWM7dGhpcy5zaWJsaW5nPXRoaXMuY2hpbGQ9dGhpcy5yZXR1cm49dGhpcy5zdGF0ZU5vZGU9dGhpcy50eXBlPXRoaXMuZWxlbWVudFR5cGU9bnVsbDt0aGlzLmluZGV4PTA7dGhpcy5yZWY9bnVsbDt0aGlzLnBlbmRpbmdQcm9wcz1iO3RoaXMuZGVwZW5kZW5jaWVzPXRoaXMubWVtb2l6ZWRTdGF0ZT10aGlzLnVwZGF0ZVF1ZXVlPXRoaXMubWVtb2l6ZWRQcm9wcz1udWxsO3RoaXMubW9kZT1kO3RoaXMuZWZmZWN0VGFnPTA7dGhpcy5sYXN0RWZmZWN0PXRoaXMuZmlyc3RFZmZlY3Q9dGhpcy5uZXh0RWZmZWN0PW51bGw7dGhpcy5jaGlsZEV4cGlyYXRpb25UaW1lPXRoaXMuZXhwaXJhdGlvblRpbWU9MDt0aGlzLmFsdGVybmF0ZT1udWxsfWZ1bmN0aW9uIFNoKGEsYixjLGQpe3JldHVybiBuZXcgWmooYSxiLGMsZCl9XG5mdW5jdGlvbiBiaShhKXthPWEucHJvdG90eXBlO3JldHVybiEoIWF8fCFhLmlzUmVhY3RDb21wb25lbnQpfWZ1bmN0aW9uIFhqKGEpe2lmKFwiZnVuY3Rpb25cIj09PXR5cGVvZiBhKXJldHVybiBiaShhKT8xOjA7aWYodm9pZCAwIT09YSYmbnVsbCE9PWEpe2E9YS4kJHR5cGVvZjtpZihhPT09Z2IpcmV0dXJuIDExO2lmKGE9PT1qYilyZXR1cm4gMTR9cmV0dXJuIDJ9XG5mdW5jdGlvbiBTZyhhLGIpe3ZhciBjPWEuYWx0ZXJuYXRlO251bGw9PT1jPyhjPVNoKGEudGFnLGIsYS5rZXksYS5tb2RlKSxjLmVsZW1lbnRUeXBlPWEuZWxlbWVudFR5cGUsYy50eXBlPWEudHlwZSxjLnN0YXRlTm9kZT1hLnN0YXRlTm9kZSxjLmFsdGVybmF0ZT1hLGEuYWx0ZXJuYXRlPWMpOihjLnBlbmRpbmdQcm9wcz1iLGMuZWZmZWN0VGFnPTAsYy5uZXh0RWZmZWN0PW51bGwsYy5maXJzdEVmZmVjdD1udWxsLGMubGFzdEVmZmVjdD1udWxsKTtjLmNoaWxkRXhwaXJhdGlvblRpbWU9YS5jaGlsZEV4cGlyYXRpb25UaW1lO2MuZXhwaXJhdGlvblRpbWU9YS5leHBpcmF0aW9uVGltZTtjLmNoaWxkPWEuY2hpbGQ7Yy5tZW1vaXplZFByb3BzPWEubWVtb2l6ZWRQcm9wcztjLm1lbW9pemVkU3RhdGU9YS5tZW1vaXplZFN0YXRlO2MudXBkYXRlUXVldWU9YS51cGRhdGVRdWV1ZTtiPWEuZGVwZW5kZW5jaWVzO2MuZGVwZW5kZW5jaWVzPW51bGw9PT1iP251bGw6e2V4cGlyYXRpb25UaW1lOmIuZXhwaXJhdGlvblRpbWUsXG5maXJzdENvbnRleHQ6Yi5maXJzdENvbnRleHQscmVzcG9uZGVyczpiLnJlc3BvbmRlcnN9O2Muc2libGluZz1hLnNpYmxpbmc7Yy5pbmRleD1hLmluZGV4O2MucmVmPWEucmVmO3JldHVybiBjfVxuZnVuY3Rpb24gVWcoYSxiLGMsZCxlLGYpe3ZhciBnPTI7ZD1hO2lmKFwiZnVuY3Rpb25cIj09PXR5cGVvZiBhKWJpKGEpJiYoZz0xKTtlbHNlIGlmKFwic3RyaW5nXCI9PT10eXBlb2YgYSlnPTU7ZWxzZSBhOnN3aXRjaChhKXtjYXNlIGFiOnJldHVybiBXZyhjLmNoaWxkcmVuLGUsZixiKTtjYXNlIGZiOmc9ODtlfD03O2JyZWFrO2Nhc2UgYmI6Zz04O2V8PTE7YnJlYWs7Y2FzZSBjYjpyZXR1cm4gYT1TaCgxMixjLGIsZXw4KSxhLmVsZW1lbnRUeXBlPWNiLGEudHlwZT1jYixhLmV4cGlyYXRpb25UaW1lPWYsYTtjYXNlIGhiOnJldHVybiBhPVNoKDEzLGMsYixlKSxhLnR5cGU9aGIsYS5lbGVtZW50VHlwZT1oYixhLmV4cGlyYXRpb25UaW1lPWYsYTtjYXNlIGliOnJldHVybiBhPVNoKDE5LGMsYixlKSxhLmVsZW1lbnRUeXBlPWliLGEuZXhwaXJhdGlvblRpbWU9ZixhO2RlZmF1bHQ6aWYoXCJvYmplY3RcIj09PXR5cGVvZiBhJiZudWxsIT09YSlzd2l0Y2goYS4kJHR5cGVvZil7Y2FzZSBkYjpnPVxuMTA7YnJlYWsgYTtjYXNlIGViOmc9OTticmVhayBhO2Nhc2UgZ2I6Zz0xMTticmVhayBhO2Nhc2UgamI6Zz0xNDticmVhayBhO2Nhc2Uga2I6Zz0xNjtkPW51bGw7YnJlYWsgYTtjYXNlIGxiOmc9MjI7YnJlYWsgYX10aHJvdyBFcnJvcih1KDEzMCxudWxsPT1hP2E6dHlwZW9mIGEsXCJcIikpO31iPVNoKGcsYyxiLGUpO2IuZWxlbWVudFR5cGU9YTtiLnR5cGU9ZDtiLmV4cGlyYXRpb25UaW1lPWY7cmV0dXJuIGJ9ZnVuY3Rpb24gV2coYSxiLGMsZCl7YT1TaCg3LGEsZCxiKTthLmV4cGlyYXRpb25UaW1lPWM7cmV0dXJuIGF9ZnVuY3Rpb24gVGcoYSxiLGMpe2E9U2goNixhLG51bGwsYik7YS5leHBpcmF0aW9uVGltZT1jO3JldHVybiBhfVxuZnVuY3Rpb24gVmcoYSxiLGMpe2I9U2goNCxudWxsIT09YS5jaGlsZHJlbj9hLmNoaWxkcmVuOltdLGEua2V5LGIpO2IuZXhwaXJhdGlvblRpbWU9YztiLnN0YXRlTm9kZT17Y29udGFpbmVySW5mbzphLmNvbnRhaW5lckluZm8scGVuZGluZ0NoaWxkcmVuOm51bGwsaW1wbGVtZW50YXRpb246YS5pbXBsZW1lbnRhdGlvbn07cmV0dXJuIGJ9XG5mdW5jdGlvbiBhayhhLGIsYyl7dGhpcy50YWc9Yjt0aGlzLmN1cnJlbnQ9bnVsbDt0aGlzLmNvbnRhaW5lckluZm89YTt0aGlzLnBpbmdDYWNoZT10aGlzLnBlbmRpbmdDaGlsZHJlbj1udWxsO3RoaXMuZmluaXNoZWRFeHBpcmF0aW9uVGltZT0wO3RoaXMuZmluaXNoZWRXb3JrPW51bGw7dGhpcy50aW1lb3V0SGFuZGxlPS0xO3RoaXMucGVuZGluZ0NvbnRleHQ9dGhpcy5jb250ZXh0PW51bGw7dGhpcy5oeWRyYXRlPWM7dGhpcy5jYWxsYmFja05vZGU9bnVsbDt0aGlzLmNhbGxiYWNrUHJpb3JpdHk9OTA7dGhpcy5sYXN0RXhwaXJlZFRpbWU9dGhpcy5sYXN0UGluZ2VkVGltZT10aGlzLm5leHRLbm93blBlbmRpbmdMZXZlbD10aGlzLmxhc3RTdXNwZW5kZWRUaW1lPXRoaXMuZmlyc3RTdXNwZW5kZWRUaW1lPXRoaXMuZmlyc3RQZW5kaW5nVGltZT0wfVxuZnVuY3Rpb24gQWooYSxiKXt2YXIgYz1hLmZpcnN0U3VzcGVuZGVkVGltZTthPWEubGFzdFN1c3BlbmRlZFRpbWU7cmV0dXJuIDAhPT1jJiZjPj1iJiZhPD1ifWZ1bmN0aW9uIHhpKGEsYil7dmFyIGM9YS5maXJzdFN1c3BlbmRlZFRpbWUsZD1hLmxhc3RTdXNwZW5kZWRUaW1lO2M8YiYmKGEuZmlyc3RTdXNwZW5kZWRUaW1lPWIpO2lmKGQ+Ynx8MD09PWMpYS5sYXN0U3VzcGVuZGVkVGltZT1iO2I8PWEubGFzdFBpbmdlZFRpbWUmJihhLmxhc3RQaW5nZWRUaW1lPTApO2I8PWEubGFzdEV4cGlyZWRUaW1lJiYoYS5sYXN0RXhwaXJlZFRpbWU9MCl9XG5mdW5jdGlvbiB5aShhLGIpe2I+YS5maXJzdFBlbmRpbmdUaW1lJiYoYS5maXJzdFBlbmRpbmdUaW1lPWIpO3ZhciBjPWEuZmlyc3RTdXNwZW5kZWRUaW1lOzAhPT1jJiYoYj49Yz9hLmZpcnN0U3VzcGVuZGVkVGltZT1hLmxhc3RTdXNwZW5kZWRUaW1lPWEubmV4dEtub3duUGVuZGluZ0xldmVsPTA6Yj49YS5sYXN0U3VzcGVuZGVkVGltZSYmKGEubGFzdFN1c3BlbmRlZFRpbWU9YisxKSxiPmEubmV4dEtub3duUGVuZGluZ0xldmVsJiYoYS5uZXh0S25vd25QZW5kaW5nTGV2ZWw9YikpfWZ1bmN0aW9uIENqKGEsYil7dmFyIGM9YS5sYXN0RXhwaXJlZFRpbWU7aWYoMD09PWN8fGM+YilhLmxhc3RFeHBpcmVkVGltZT1ifVxuZnVuY3Rpb24gYmsoYSxiLGMsZCl7dmFyIGU9Yi5jdXJyZW50LGY9R2coKSxnPURnLnN1c3BlbnNlO2Y9SGcoZixlLGcpO2E6aWYoYyl7Yz1jLl9yZWFjdEludGVybmFsRmliZXI7Yjp7aWYoZGMoYykhPT1jfHwxIT09Yy50YWcpdGhyb3cgRXJyb3IodSgxNzApKTt2YXIgaD1jO2Rve3N3aXRjaChoLnRhZyl7Y2FzZSAzOmg9aC5zdGF0ZU5vZGUuY29udGV4dDticmVhayBiO2Nhc2UgMTppZihMKGgudHlwZSkpe2g9aC5zdGF0ZU5vZGUuX19yZWFjdEludGVybmFsTWVtb2l6ZWRNZXJnZWRDaGlsZENvbnRleHQ7YnJlYWsgYn19aD1oLnJldHVybn13aGlsZShudWxsIT09aCk7dGhyb3cgRXJyb3IodSgxNzEpKTt9aWYoMT09PWMudGFnKXt2YXIgaz1jLnR5cGU7aWYoTChrKSl7Yz1GZihjLGssaCk7YnJlYWsgYX19Yz1ofWVsc2UgYz1BZjtudWxsPT09Yi5jb250ZXh0P2IuY29udGV4dD1jOmIucGVuZGluZ0NvbnRleHQ9YztiPXdnKGYsZyk7Yi5wYXlsb2FkPXtlbGVtZW50OmF9O2Q9dm9pZCAwPT09XG5kP251bGw6ZDtudWxsIT09ZCYmKGIuY2FsbGJhY2s9ZCk7eGcoZSxiKTtJZyhlLGYpO3JldHVybiBmfWZ1bmN0aW9uIGNrKGEpe2E9YS5jdXJyZW50O2lmKCFhLmNoaWxkKXJldHVybiBudWxsO3N3aXRjaChhLmNoaWxkLnRhZyl7Y2FzZSA1OnJldHVybiBhLmNoaWxkLnN0YXRlTm9kZTtkZWZhdWx0OnJldHVybiBhLmNoaWxkLnN0YXRlTm9kZX19ZnVuY3Rpb24gZGsoYSxiKXthPWEubWVtb2l6ZWRTdGF0ZTtudWxsIT09YSYmbnVsbCE9PWEuZGVoeWRyYXRlZCYmYS5yZXRyeVRpbWU8YiYmKGEucmV0cnlUaW1lPWIpfWZ1bmN0aW9uIGVrKGEsYil7ZGsoYSxiKTsoYT1hLmFsdGVybmF0ZSkmJmRrKGEsYil9XG5mdW5jdGlvbiBmayhhLGIsYyl7Yz1udWxsIT1jJiYhMD09PWMuaHlkcmF0ZTt2YXIgZD1uZXcgYWsoYSxiLGMpLGU9U2goMyxudWxsLG51bGwsMj09PWI/NzoxPT09Yj8zOjApO2QuY3VycmVudD1lO2Uuc3RhdGVOb2RlPWQ7dWcoZSk7YVtPZF09ZC5jdXJyZW50O2MmJjAhPT1iJiZKYyhhLDk9PT1hLm5vZGVUeXBlP2E6YS5vd25lckRvY3VtZW50KTt0aGlzLl9pbnRlcm5hbFJvb3Q9ZH1may5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKGEpe2JrKGEsdGhpcy5faW50ZXJuYWxSb290LG51bGwsbnVsbCl9O2ZrLnByb3RvdHlwZS51bm1vdW50PWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5faW50ZXJuYWxSb290LGI9YS5jb250YWluZXJJbmZvO2JrKG51bGwsYSxudWxsLGZ1bmN0aW9uKCl7YltPZF09bnVsbH0pfTtcbmZ1bmN0aW9uIGdrKGEpe3JldHVybiEoIWF8fDEhPT1hLm5vZGVUeXBlJiY5IT09YS5ub2RlVHlwZSYmMTEhPT1hLm5vZGVUeXBlJiYoOCE9PWEubm9kZVR5cGV8fFwiIHJlYWN0LW1vdW50LXBvaW50LXVuc3RhYmxlIFwiIT09YS5ub2RlVmFsdWUpKX1mdW5jdGlvbiBoayhhLGIpe2J8fChiPWE/OT09PWEubm9kZVR5cGU/YS5kb2N1bWVudEVsZW1lbnQ6YS5maXJzdENoaWxkOm51bGwsYj0hKCFifHwxIT09Yi5ub2RlVHlwZXx8IWIuaGFzQXR0cmlidXRlKFwiZGF0YS1yZWFjdHJvb3RcIikpKTtpZighYilmb3IodmFyIGM7Yz1hLmxhc3RDaGlsZDspYS5yZW1vdmVDaGlsZChjKTtyZXR1cm4gbmV3IGZrKGEsMCxiP3toeWRyYXRlOiEwfTp2b2lkIDApfVxuZnVuY3Rpb24gaWsoYSxiLGMsZCxlKXt2YXIgZj1jLl9yZWFjdFJvb3RDb250YWluZXI7aWYoZil7dmFyIGc9Zi5faW50ZXJuYWxSb290O2lmKFwiZnVuY3Rpb25cIj09PXR5cGVvZiBlKXt2YXIgaD1lO2U9ZnVuY3Rpb24oKXt2YXIgYT1jayhnKTtoLmNhbGwoYSl9fWJrKGIsZyxhLGUpfWVsc2V7Zj1jLl9yZWFjdFJvb3RDb250YWluZXI9aGsoYyxkKTtnPWYuX2ludGVybmFsUm9vdDtpZihcImZ1bmN0aW9uXCI9PT10eXBlb2YgZSl7dmFyIGs9ZTtlPWZ1bmN0aW9uKCl7dmFyIGE9Y2soZyk7ay5jYWxsKGEpfX1OaihmdW5jdGlvbigpe2JrKGIsZyxhLGUpfSl9cmV0dXJuIGNrKGcpfWZ1bmN0aW9uIGprKGEsYixjKXt2YXIgZD0zPGFyZ3VtZW50cy5sZW5ndGgmJnZvaWQgMCE9PWFyZ3VtZW50c1szXT9hcmd1bWVudHNbM106bnVsbDtyZXR1cm57JCR0eXBlb2Y6JGEsa2V5Om51bGw9PWQ/bnVsbDpcIlwiK2QsY2hpbGRyZW46YSxjb250YWluZXJJbmZvOmIsaW1wbGVtZW50YXRpb246Y319XG53Yz1mdW5jdGlvbihhKXtpZigxMz09PWEudGFnKXt2YXIgYj1oZyhHZygpLDE1MCwxMDApO0lnKGEsYik7ZWsoYSxiKX19O3hjPWZ1bmN0aW9uKGEpezEzPT09YS50YWcmJihJZyhhLDMpLGVrKGEsMykpfTt5Yz1mdW5jdGlvbihhKXtpZigxMz09PWEudGFnKXt2YXIgYj1HZygpO2I9SGcoYixhLG51bGwpO0lnKGEsYik7ZWsoYSxiKX19O1xuemE9ZnVuY3Rpb24oYSxiLGMpe3N3aXRjaChiKXtjYXNlIFwiaW5wdXRcIjpDYihhLGMpO2I9Yy5uYW1lO2lmKFwicmFkaW9cIj09PWMudHlwZSYmbnVsbCE9Yil7Zm9yKGM9YTtjLnBhcmVudE5vZGU7KWM9Yy5wYXJlbnROb2RlO2M9Yy5xdWVyeVNlbGVjdG9yQWxsKFwiaW5wdXRbbmFtZT1cIitKU09OLnN0cmluZ2lmeShcIlwiK2IpKyddW3R5cGU9XCJyYWRpb1wiXScpO2ZvcihiPTA7YjxjLmxlbmd0aDtiKyspe3ZhciBkPWNbYl07aWYoZCE9PWEmJmQuZm9ybT09PWEuZm9ybSl7dmFyIGU9UWQoZCk7aWYoIWUpdGhyb3cgRXJyb3IodSg5MCkpO3liKGQpO0NiKGQsZSl9fX1icmVhaztjYXNlIFwidGV4dGFyZWFcIjpLYihhLGMpO2JyZWFrO2Nhc2UgXCJzZWxlY3RcIjpiPWMudmFsdWUsbnVsbCE9YiYmSGIoYSwhIWMubXVsdGlwbGUsYiwhMSl9fTtGYT1NajtcbkdhPWZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGY9VztXfD00O3RyeXtyZXR1cm4gY2coOTgsYS5iaW5kKG51bGwsYixjLGQsZSkpfWZpbmFsbHl7Vz1mLFc9PT1WJiZnZygpfX07SGE9ZnVuY3Rpb24oKXsoVyYoMXxmanxnaikpPT09ViYmKExqKCksRGooKSl9O0lhPWZ1bmN0aW9uKGEsYil7dmFyIGM9VztXfD0yO3RyeXtyZXR1cm4gYShiKX1maW5hbGx5e1c9YyxXPT09ViYmZ2coKX19O2Z1bmN0aW9uIGtrKGEsYil7dmFyIGM9Mjxhcmd1bWVudHMubGVuZ3RoJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOm51bGw7aWYoIWdrKGIpKXRocm93IEVycm9yKHUoMjAwKSk7cmV0dXJuIGprKGEsYixudWxsLGMpfXZhciBsaz17RXZlbnRzOltOYyxQZCxRZCx4YSx0YSxYZCxmdW5jdGlvbihhKXtqYyhhLFdkKX0sRGEsRWEsaWQsbWMsRGose2N1cnJlbnQ6ITF9XX07XG4oZnVuY3Rpb24oYSl7dmFyIGI9YS5maW5kRmliZXJCeUhvc3RJbnN0YW5jZTtyZXR1cm4gWWoobih7fSxhLHtvdmVycmlkZUhvb2tTdGF0ZTpudWxsLG92ZXJyaWRlUHJvcHM6bnVsbCxzZXRTdXNwZW5zZUhhbmRsZXI6bnVsbCxzY2hlZHVsZVVwZGF0ZTpudWxsLGN1cnJlbnREaXNwYXRjaGVyUmVmOldhLlJlYWN0Q3VycmVudERpc3BhdGNoZXIsZmluZEhvc3RJbnN0YW5jZUJ5RmliZXI6ZnVuY3Rpb24oYSl7YT1oYyhhKTtyZXR1cm4gbnVsbD09PWE/bnVsbDphLnN0YXRlTm9kZX0sZmluZEZpYmVyQnlIb3N0SW5zdGFuY2U6ZnVuY3Rpb24oYSl7cmV0dXJuIGI/YihhKTpudWxsfSxmaW5kSG9zdEluc3RhbmNlc0ZvclJlZnJlc2g6bnVsbCxzY2hlZHVsZVJlZnJlc2g6bnVsbCxzY2hlZHVsZVJvb3Q6bnVsbCxzZXRSZWZyZXNoSGFuZGxlcjpudWxsLGdldEN1cnJlbnRGaWJlcjpudWxsfSkpfSkoe2ZpbmRGaWJlckJ5SG9zdEluc3RhbmNlOnRjLGJ1bmRsZVR5cGU6MCx2ZXJzaW9uOlwiMTYuMTQuMFwiLFxucmVuZGVyZXJQYWNrYWdlTmFtZTpcInJlYWN0LWRvbVwifSk7ZXhwb3J0cy5fX1NFQ1JFVF9JTlRFUk5BTFNfRE9fTk9UX1VTRV9PUl9ZT1VfV0lMTF9CRV9GSVJFRD1saztleHBvcnRzLmNyZWF0ZVBvcnRhbD1raztleHBvcnRzLmZpbmRET01Ob2RlPWZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpcmV0dXJuIG51bGw7aWYoMT09PWEubm9kZVR5cGUpcmV0dXJuIGE7dmFyIGI9YS5fcmVhY3RJbnRlcm5hbEZpYmVyO2lmKHZvaWQgMD09PWIpe2lmKFwiZnVuY3Rpb25cIj09PXR5cGVvZiBhLnJlbmRlcil0aHJvdyBFcnJvcih1KDE4OCkpO3Rocm93IEVycm9yKHUoMjY4LE9iamVjdC5rZXlzKGEpKSk7fWE9aGMoYik7YT1udWxsPT09YT9udWxsOmEuc3RhdGVOb2RlO3JldHVybiBhfTtcbmV4cG9ydHMuZmx1c2hTeW5jPWZ1bmN0aW9uKGEsYil7aWYoKFcmKGZqfGdqKSkhPT1WKXRocm93IEVycm9yKHUoMTg3KSk7dmFyIGM9VztXfD0xO3RyeXtyZXR1cm4gY2coOTksYS5iaW5kKG51bGwsYikpfWZpbmFsbHl7Vz1jLGdnKCl9fTtleHBvcnRzLmh5ZHJhdGU9ZnVuY3Rpb24oYSxiLGMpe2lmKCFnayhiKSl0aHJvdyBFcnJvcih1KDIwMCkpO3JldHVybiBpayhudWxsLGEsYiwhMCxjKX07ZXhwb3J0cy5yZW5kZXI9ZnVuY3Rpb24oYSxiLGMpe2lmKCFnayhiKSl0aHJvdyBFcnJvcih1KDIwMCkpO3JldHVybiBpayhudWxsLGEsYiwhMSxjKX07XG5leHBvcnRzLnVubW91bnRDb21wb25lbnRBdE5vZGU9ZnVuY3Rpb24oYSl7aWYoIWdrKGEpKXRocm93IEVycm9yKHUoNDApKTtyZXR1cm4gYS5fcmVhY3RSb290Q29udGFpbmVyPyhOaihmdW5jdGlvbigpe2lrKG51bGwsbnVsbCxhLCExLGZ1bmN0aW9uKCl7YS5fcmVhY3RSb290Q29udGFpbmVyPW51bGw7YVtPZF09bnVsbH0pfSksITApOiExfTtleHBvcnRzLnVuc3RhYmxlX2JhdGNoZWRVcGRhdGVzPU1qO2V4cG9ydHMudW5zdGFibGVfY3JlYXRlUG9ydGFsPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGtrKGEsYiwyPGFyZ3VtZW50cy5sZW5ndGgmJnZvaWQgMCE9PWFyZ3VtZW50c1syXT9hcmd1bWVudHNbMl06bnVsbCl9O1xuZXhwb3J0cy51bnN0YWJsZV9yZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcj1mdW5jdGlvbihhLGIsYyxkKXtpZighZ2soYykpdGhyb3cgRXJyb3IodSgyMDApKTtpZihudWxsPT1hfHx2b2lkIDA9PT1hLl9yZWFjdEludGVybmFsRmliZXIpdGhyb3cgRXJyb3IodSgzOCkpO3JldHVybiBpayhhLGIsYywhMSxkKX07ZXhwb3J0cy52ZXJzaW9uPVwiMTYuMTQuMFwiO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///98\n')},function(module,exports,__webpack_require__){"use strict";eval("\n\nif (true) {\n  module.exports = __webpack_require__(100);\n} else {}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTkuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvc2NoZWR1bGVyL2luZGV4LmpzPzQwMjkiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJykge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3NjaGVkdWxlci5wcm9kdWN0aW9uLm1pbi5qcycpO1xufSBlbHNlIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9zY2hlZHVsZXIuZGV2ZWxvcG1lbnQuanMnKTtcbn1cbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUVBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///99\n")},function(module,exports,__webpack_require__){"use strict";eval('/** @license React v0.19.1\n * scheduler.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nvar f,g,h,k,l;\nif("undefined"===typeof window||"function"!==typeof MessageChannel){var p=null,q=null,t=function(){if(null!==p)try{var a=exports.unstable_now();p(!0,a);p=null}catch(b){throw setTimeout(t,0),b;}},u=Date.now();exports.unstable_now=function(){return Date.now()-u};f=function(a){null!==p?setTimeout(f,0,a):(p=a,setTimeout(t,0))};g=function(a,b){q=setTimeout(a,b)};h=function(){clearTimeout(q)};k=function(){return!1};l=exports.unstable_forceFrameRate=function(){}}else{var w=window.performance,x=window.Date,\ny=window.setTimeout,z=window.clearTimeout;if("undefined"!==typeof console){var A=window.cancelAnimationFrame;"function"!==typeof window.requestAnimationFrame&&console.error("This browser doesn\'t support requestAnimationFrame. Make sure that you load a polyfill in older browsers. https://fb.me/react-polyfills");"function"!==typeof A&&console.error("This browser doesn\'t support cancelAnimationFrame. Make sure that you load a polyfill in older browsers. https://fb.me/react-polyfills")}if("object"===\ntypeof w&&"function"===typeof w.now)exports.unstable_now=function(){return w.now()};else{var B=x.now();exports.unstable_now=function(){return x.now()-B}}var C=!1,D=null,E=-1,F=5,G=0;k=function(){return exports.unstable_now()>=G};l=function(){};exports.unstable_forceFrameRate=function(a){0>a||125<a?console.error("forceFrameRate takes a positive int between 0 and 125, forcing framerates higher than 125 fps is not unsupported"):F=0<a?Math.floor(1E3/a):5};var H=new MessageChannel,I=H.port2;H.port1.onmessage=\nfunction(){if(null!==D){var a=exports.unstable_now();G=a+F;try{D(!0,a)?I.postMessage(null):(C=!1,D=null)}catch(b){throw I.postMessage(null),b;}}else C=!1};f=function(a){D=a;C||(C=!0,I.postMessage(null))};g=function(a,b){E=y(function(){a(exports.unstable_now())},b)};h=function(){z(E);E=-1}}function J(a,b){var c=a.length;a.push(b);a:for(;;){var d=c-1>>>1,e=a[d];if(void 0!==e&&0<K(e,b))a[d]=b,a[c]=e,c=d;else break a}}function L(a){a=a[0];return void 0===a?null:a}\nfunction M(a){var b=a[0];if(void 0!==b){var c=a.pop();if(c!==b){a[0]=c;a:for(var d=0,e=a.length;d<e;){var m=2*(d+1)-1,n=a[m],v=m+1,r=a[v];if(void 0!==n&&0>K(n,c))void 0!==r&&0>K(r,n)?(a[d]=r,a[v]=c,d=v):(a[d]=n,a[m]=c,d=m);else if(void 0!==r&&0>K(r,c))a[d]=r,a[v]=c,d=v;else break a}}return b}return null}function K(a,b){var c=a.sortIndex-b.sortIndex;return 0!==c?c:a.id-b.id}var N=[],O=[],P=1,Q=null,R=3,S=!1,T=!1,U=!1;\nfunction V(a){for(var b=L(O);null!==b;){if(null===b.callback)M(O);else if(b.startTime<=a)M(O),b.sortIndex=b.expirationTime,J(N,b);else break;b=L(O)}}function W(a){U=!1;V(a);if(!T)if(null!==L(N))T=!0,f(X);else{var b=L(O);null!==b&&g(W,b.startTime-a)}}\nfunction X(a,b){T=!1;U&&(U=!1,h());S=!0;var c=R;try{V(b);for(Q=L(N);null!==Q&&(!(Q.expirationTime>b)||a&&!k());){var d=Q.callback;if(null!==d){Q.callback=null;R=Q.priorityLevel;var e=d(Q.expirationTime<=b);b=exports.unstable_now();"function"===typeof e?Q.callback=e:Q===L(N)&&M(N);V(b)}else M(N);Q=L(N)}if(null!==Q)var m=!0;else{var n=L(O);null!==n&&g(W,n.startTime-b);m=!1}return m}finally{Q=null,R=c,S=!1}}\nfunction Y(a){switch(a){case 1:return-1;case 2:return 250;case 5:return 1073741823;case 4:return 1E4;default:return 5E3}}var Z=l;exports.unstable_IdlePriority=5;exports.unstable_ImmediatePriority=1;exports.unstable_LowPriority=4;exports.unstable_NormalPriority=3;exports.unstable_Profiling=null;exports.unstable_UserBlockingPriority=2;exports.unstable_cancelCallback=function(a){a.callback=null};exports.unstable_continueExecution=function(){T||S||(T=!0,f(X))};\nexports.unstable_getCurrentPriorityLevel=function(){return R};exports.unstable_getFirstCallbackNode=function(){return L(N)};exports.unstable_next=function(a){switch(R){case 1:case 2:case 3:var b=3;break;default:b=R}var c=R;R=b;try{return a()}finally{R=c}};exports.unstable_pauseExecution=function(){};exports.unstable_requestPaint=Z;exports.unstable_runWithPriority=function(a,b){switch(a){case 1:case 2:case 3:case 4:case 5:break;default:a=3}var c=R;R=a;try{return b()}finally{R=c}};\nexports.unstable_scheduleCallback=function(a,b,c){var d=exports.unstable_now();if("object"===typeof c&&null!==c){var e=c.delay;e="number"===typeof e&&0<e?d+e:d;c="number"===typeof c.timeout?c.timeout:Y(a)}else c=Y(a),e=d;c=e+c;a={id:P++,callback:b,priorityLevel:a,startTime:e,expirationTime:c,sortIndex:-1};e>d?(a.sortIndex=e,J(O,a),null===L(N)&&a===L(O)&&(U?h():U=!0,g(W,e-d))):(a.sortIndex=c,J(N,a),T||S||(T=!0,f(X)));return a};\nexports.unstable_shouldYield=function(){var a=exports.unstable_now();V(a);var b=L(N);return b!==Q&&null!==Q&&null!==b&&null!==b.callback&&b.startTime<=a&&b.expirationTime<Q.expirationTime||k()};exports.unstable_wrapCallback=function(a){var b=R;return function(){var c=R;R=b;try{return a.apply(this,arguments)}finally{R=c}}};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTAwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3NjaGVkdWxlci9janMvc2NoZWR1bGVyLnByb2R1Y3Rpb24ubWluLmpzP2ZiMDciXSwic291cmNlc0NvbnRlbnQiOlsiLyoqIEBsaWNlbnNlIFJlYWN0IHYwLjE5LjFcbiAqIHNjaGVkdWxlci5wcm9kdWN0aW9uLm1pbi5qc1xuICpcbiAqIENvcHlyaWdodCAoYykgRmFjZWJvb2ssIEluYy4gYW5kIGl0cyBhZmZpbGlhdGVzLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbid1c2Ugc3RyaWN0Jzt2YXIgZixnLGgsayxsO1xuaWYoXCJ1bmRlZmluZWRcIj09PXR5cGVvZiB3aW5kb3d8fFwiZnVuY3Rpb25cIiE9PXR5cGVvZiBNZXNzYWdlQ2hhbm5lbCl7dmFyIHA9bnVsbCxxPW51bGwsdD1mdW5jdGlvbigpe2lmKG51bGwhPT1wKXRyeXt2YXIgYT1leHBvcnRzLnVuc3RhYmxlX25vdygpO3AoITAsYSk7cD1udWxsfWNhdGNoKGIpe3Rocm93IHNldFRpbWVvdXQodCwwKSxiO319LHU9RGF0ZS5ub3coKTtleHBvcnRzLnVuc3RhYmxlX25vdz1mdW5jdGlvbigpe3JldHVybiBEYXRlLm5vdygpLXV9O2Y9ZnVuY3Rpb24oYSl7bnVsbCE9PXA/c2V0VGltZW91dChmLDAsYSk6KHA9YSxzZXRUaW1lb3V0KHQsMCkpfTtnPWZ1bmN0aW9uKGEsYil7cT1zZXRUaW1lb3V0KGEsYil9O2g9ZnVuY3Rpb24oKXtjbGVhclRpbWVvdXQocSl9O2s9ZnVuY3Rpb24oKXtyZXR1cm4hMX07bD1leHBvcnRzLnVuc3RhYmxlX2ZvcmNlRnJhbWVSYXRlPWZ1bmN0aW9uKCl7fX1lbHNle3ZhciB3PXdpbmRvdy5wZXJmb3JtYW5jZSx4PXdpbmRvdy5EYXRlLFxueT13aW5kb3cuc2V0VGltZW91dCx6PXdpbmRvdy5jbGVhclRpbWVvdXQ7aWYoXCJ1bmRlZmluZWRcIiE9PXR5cGVvZiBjb25zb2xlKXt2YXIgQT13aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWU7XCJmdW5jdGlvblwiIT09dHlwZW9mIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUmJmNvbnNvbGUuZXJyb3IoXCJUaGlzIGJyb3dzZXIgZG9lc24ndCBzdXBwb3J0IHJlcXVlc3RBbmltYXRpb25GcmFtZS4gTWFrZSBzdXJlIHRoYXQgeW91IGxvYWQgYSBwb2x5ZmlsbCBpbiBvbGRlciBicm93c2Vycy4gaHR0cHM6Ly9mYi5tZS9yZWFjdC1wb2x5ZmlsbHNcIik7XCJmdW5jdGlvblwiIT09dHlwZW9mIEEmJmNvbnNvbGUuZXJyb3IoXCJUaGlzIGJyb3dzZXIgZG9lc24ndCBzdXBwb3J0IGNhbmNlbEFuaW1hdGlvbkZyYW1lLiBNYWtlIHN1cmUgdGhhdCB5b3UgbG9hZCBhIHBvbHlmaWxsIGluIG9sZGVyIGJyb3dzZXJzLiBodHRwczovL2ZiLm1lL3JlYWN0LXBvbHlmaWxsc1wiKX1pZihcIm9iamVjdFwiPT09XG50eXBlb2YgdyYmXCJmdW5jdGlvblwiPT09dHlwZW9mIHcubm93KWV4cG9ydHMudW5zdGFibGVfbm93PWZ1bmN0aW9uKCl7cmV0dXJuIHcubm93KCl9O2Vsc2V7dmFyIEI9eC5ub3coKTtleHBvcnRzLnVuc3RhYmxlX25vdz1mdW5jdGlvbigpe3JldHVybiB4Lm5vdygpLUJ9fXZhciBDPSExLEQ9bnVsbCxFPS0xLEY9NSxHPTA7az1mdW5jdGlvbigpe3JldHVybiBleHBvcnRzLnVuc3RhYmxlX25vdygpPj1HfTtsPWZ1bmN0aW9uKCl7fTtleHBvcnRzLnVuc3RhYmxlX2ZvcmNlRnJhbWVSYXRlPWZ1bmN0aW9uKGEpezA+YXx8MTI1PGE/Y29uc29sZS5lcnJvcihcImZvcmNlRnJhbWVSYXRlIHRha2VzIGEgcG9zaXRpdmUgaW50IGJldHdlZW4gMCBhbmQgMTI1LCBmb3JjaW5nIGZyYW1lcmF0ZXMgaGlnaGVyIHRoYW4gMTI1IGZwcyBpcyBub3QgdW5zdXBwb3J0ZWRcIik6Rj0wPGE/TWF0aC5mbG9vcigxRTMvYSk6NX07dmFyIEg9bmV3IE1lc3NhZ2VDaGFubmVsLEk9SC5wb3J0MjtILnBvcnQxLm9ubWVzc2FnZT1cbmZ1bmN0aW9uKCl7aWYobnVsbCE9PUQpe3ZhciBhPWV4cG9ydHMudW5zdGFibGVfbm93KCk7Rz1hK0Y7dHJ5e0QoITAsYSk/SS5wb3N0TWVzc2FnZShudWxsKTooQz0hMSxEPW51bGwpfWNhdGNoKGIpe3Rocm93IEkucG9zdE1lc3NhZ2UobnVsbCksYjt9fWVsc2UgQz0hMX07Zj1mdW5jdGlvbihhKXtEPWE7Q3x8KEM9ITAsSS5wb3N0TWVzc2FnZShudWxsKSl9O2c9ZnVuY3Rpb24oYSxiKXtFPXkoZnVuY3Rpb24oKXthKGV4cG9ydHMudW5zdGFibGVfbm93KCkpfSxiKX07aD1mdW5jdGlvbigpe3ooRSk7RT0tMX19ZnVuY3Rpb24gSihhLGIpe3ZhciBjPWEubGVuZ3RoO2EucHVzaChiKTthOmZvcig7Oyl7dmFyIGQ9Yy0xPj4+MSxlPWFbZF07aWYodm9pZCAwIT09ZSYmMDxLKGUsYikpYVtkXT1iLGFbY109ZSxjPWQ7ZWxzZSBicmVhayBhfX1mdW5jdGlvbiBMKGEpe2E9YVswXTtyZXR1cm4gdm9pZCAwPT09YT9udWxsOmF9XG5mdW5jdGlvbiBNKGEpe3ZhciBiPWFbMF07aWYodm9pZCAwIT09Yil7dmFyIGM9YS5wb3AoKTtpZihjIT09Yil7YVswXT1jO2E6Zm9yKHZhciBkPTAsZT1hLmxlbmd0aDtkPGU7KXt2YXIgbT0yKihkKzEpLTEsbj1hW21dLHY9bSsxLHI9YVt2XTtpZih2b2lkIDAhPT1uJiYwPksobixjKSl2b2lkIDAhPT1yJiYwPksocixuKT8oYVtkXT1yLGFbdl09YyxkPXYpOihhW2RdPW4sYVttXT1jLGQ9bSk7ZWxzZSBpZih2b2lkIDAhPT1yJiYwPksocixjKSlhW2RdPXIsYVt2XT1jLGQ9djtlbHNlIGJyZWFrIGF9fXJldHVybiBifXJldHVybiBudWxsfWZ1bmN0aW9uIEsoYSxiKXt2YXIgYz1hLnNvcnRJbmRleC1iLnNvcnRJbmRleDtyZXR1cm4gMCE9PWM/YzphLmlkLWIuaWR9dmFyIE49W10sTz1bXSxQPTEsUT1udWxsLFI9MyxTPSExLFQ9ITEsVT0hMTtcbmZ1bmN0aW9uIFYoYSl7Zm9yKHZhciBiPUwoTyk7bnVsbCE9PWI7KXtpZihudWxsPT09Yi5jYWxsYmFjaylNKE8pO2Vsc2UgaWYoYi5zdGFydFRpbWU8PWEpTShPKSxiLnNvcnRJbmRleD1iLmV4cGlyYXRpb25UaW1lLEooTixiKTtlbHNlIGJyZWFrO2I9TChPKX19ZnVuY3Rpb24gVyhhKXtVPSExO1YoYSk7aWYoIVQpaWYobnVsbCE9PUwoTikpVD0hMCxmKFgpO2Vsc2V7dmFyIGI9TChPKTtudWxsIT09YiYmZyhXLGIuc3RhcnRUaW1lLWEpfX1cbmZ1bmN0aW9uIFgoYSxiKXtUPSExO1UmJihVPSExLGgoKSk7Uz0hMDt2YXIgYz1SO3RyeXtWKGIpO2ZvcihRPUwoTik7bnVsbCE9PVEmJighKFEuZXhwaXJhdGlvblRpbWU+Yil8fGEmJiFrKCkpOyl7dmFyIGQ9US5jYWxsYmFjaztpZihudWxsIT09ZCl7US5jYWxsYmFjaz1udWxsO1I9US5wcmlvcml0eUxldmVsO3ZhciBlPWQoUS5leHBpcmF0aW9uVGltZTw9Yik7Yj1leHBvcnRzLnVuc3RhYmxlX25vdygpO1wiZnVuY3Rpb25cIj09PXR5cGVvZiBlP1EuY2FsbGJhY2s9ZTpRPT09TChOKSYmTShOKTtWKGIpfWVsc2UgTShOKTtRPUwoTil9aWYobnVsbCE9PVEpdmFyIG09ITA7ZWxzZXt2YXIgbj1MKE8pO251bGwhPT1uJiZnKFcsbi5zdGFydFRpbWUtYik7bT0hMX1yZXR1cm4gbX1maW5hbGx5e1E9bnVsbCxSPWMsUz0hMX19XG5mdW5jdGlvbiBZKGEpe3N3aXRjaChhKXtjYXNlIDE6cmV0dXJuLTE7Y2FzZSAyOnJldHVybiAyNTA7Y2FzZSA1OnJldHVybiAxMDczNzQxODIzO2Nhc2UgNDpyZXR1cm4gMUU0O2RlZmF1bHQ6cmV0dXJuIDVFM319dmFyIFo9bDtleHBvcnRzLnVuc3RhYmxlX0lkbGVQcmlvcml0eT01O2V4cG9ydHMudW5zdGFibGVfSW1tZWRpYXRlUHJpb3JpdHk9MTtleHBvcnRzLnVuc3RhYmxlX0xvd1ByaW9yaXR5PTQ7ZXhwb3J0cy51bnN0YWJsZV9Ob3JtYWxQcmlvcml0eT0zO2V4cG9ydHMudW5zdGFibGVfUHJvZmlsaW5nPW51bGw7ZXhwb3J0cy51bnN0YWJsZV9Vc2VyQmxvY2tpbmdQcmlvcml0eT0yO2V4cG9ydHMudW5zdGFibGVfY2FuY2VsQ2FsbGJhY2s9ZnVuY3Rpb24oYSl7YS5jYWxsYmFjaz1udWxsfTtleHBvcnRzLnVuc3RhYmxlX2NvbnRpbnVlRXhlY3V0aW9uPWZ1bmN0aW9uKCl7VHx8U3x8KFQ9ITAsZihYKSl9O1xuZXhwb3J0cy51bnN0YWJsZV9nZXRDdXJyZW50UHJpb3JpdHlMZXZlbD1mdW5jdGlvbigpe3JldHVybiBSfTtleHBvcnRzLnVuc3RhYmxlX2dldEZpcnN0Q2FsbGJhY2tOb2RlPWZ1bmN0aW9uKCl7cmV0dXJuIEwoTil9O2V4cG9ydHMudW5zdGFibGVfbmV4dD1mdW5jdGlvbihhKXtzd2l0Y2goUil7Y2FzZSAxOmNhc2UgMjpjYXNlIDM6dmFyIGI9MzticmVhaztkZWZhdWx0OmI9Un12YXIgYz1SO1I9Yjt0cnl7cmV0dXJuIGEoKX1maW5hbGx5e1I9Y319O2V4cG9ydHMudW5zdGFibGVfcGF1c2VFeGVjdXRpb249ZnVuY3Rpb24oKXt9O2V4cG9ydHMudW5zdGFibGVfcmVxdWVzdFBhaW50PVo7ZXhwb3J0cy51bnN0YWJsZV9ydW5XaXRoUHJpb3JpdHk9ZnVuY3Rpb24oYSxiKXtzd2l0Y2goYSl7Y2FzZSAxOmNhc2UgMjpjYXNlIDM6Y2FzZSA0OmNhc2UgNTpicmVhaztkZWZhdWx0OmE9M312YXIgYz1SO1I9YTt0cnl7cmV0dXJuIGIoKX1maW5hbGx5e1I9Y319O1xuZXhwb3J0cy51bnN0YWJsZV9zY2hlZHVsZUNhbGxiYWNrPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD1leHBvcnRzLnVuc3RhYmxlX25vdygpO2lmKFwib2JqZWN0XCI9PT10eXBlb2YgYyYmbnVsbCE9PWMpe3ZhciBlPWMuZGVsYXk7ZT1cIm51bWJlclwiPT09dHlwZW9mIGUmJjA8ZT9kK2U6ZDtjPVwibnVtYmVyXCI9PT10eXBlb2YgYy50aW1lb3V0P2MudGltZW91dDpZKGEpfWVsc2UgYz1ZKGEpLGU9ZDtjPWUrYzthPXtpZDpQKyssY2FsbGJhY2s6Yixwcmlvcml0eUxldmVsOmEsc3RhcnRUaW1lOmUsZXhwaXJhdGlvblRpbWU6Yyxzb3J0SW5kZXg6LTF9O2U+ZD8oYS5zb3J0SW5kZXg9ZSxKKE8sYSksbnVsbD09PUwoTikmJmE9PT1MKE8pJiYoVT9oKCk6VT0hMCxnKFcsZS1kKSkpOihhLnNvcnRJbmRleD1jLEooTixhKSxUfHxTfHwoVD0hMCxmKFgpKSk7cmV0dXJuIGF9O1xuZXhwb3J0cy51bnN0YWJsZV9zaG91bGRZaWVsZD1mdW5jdGlvbigpe3ZhciBhPWV4cG9ydHMudW5zdGFibGVfbm93KCk7VihhKTt2YXIgYj1MKE4pO3JldHVybiBiIT09USYmbnVsbCE9PVEmJm51bGwhPT1iJiZudWxsIT09Yi5jYWxsYmFjayYmYi5zdGFydFRpbWU8PWEmJmIuZXhwaXJhdGlvblRpbWU8US5leHBpcmF0aW9uVGltZXx8aygpfTtleHBvcnRzLnVuc3RhYmxlX3dyYXBDYWxsYmFjaz1mdW5jdGlvbihhKXt2YXIgYj1SO3JldHVybiBmdW5jdGlvbigpe3ZhciBjPVI7Uj1iO3RyeXtyZXR1cm4gYS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9ZmluYWxseXtSPWN9fX07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///100\n')},function(module,exports,__webpack_require__){eval("var api = __webpack_require__(5);\n            var content = __webpack_require__(102);\n\n            content = content.__esModule ? content.default : content;\n\n            if (typeof content === 'string') {\n              content = [[module.i, content, '']];\n            }\n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = api(content, options);\n\n\n\nmodule.exports = content.locals || {};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTAxLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BzcGVjdHJ1bS1jc3MvdmFycy9kaXN0L3NwZWN0cnVtLWdsb2JhbC5jc3M/NzAwMCJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgYXBpID0gcmVxdWlyZShcIiEuLi8uLi8uLi9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luamVjdFN0eWxlc0ludG9TdHlsZVRhZy5qc1wiKTtcbiAgICAgICAgICAgIHZhciBjb250ZW50ID0gcmVxdWlyZShcIiEhLi4vLi4vLi4vY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL3NwZWN0cnVtLWdsb2JhbC5jc3NcIik7XG5cbiAgICAgICAgICAgIGNvbnRlbnQgPSBjb250ZW50Ll9fZXNNb2R1bGUgPyBjb250ZW50LmRlZmF1bHQgOiBjb250ZW50O1xuXG4gICAgICAgICAgICBpZiAodHlwZW9mIGNvbnRlbnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgIGNvbnRlbnQgPSBbW21vZHVsZS5pZCwgY29udGVudCwgJyddXTtcbiAgICAgICAgICAgIH1cblxudmFyIG9wdGlvbnMgPSB7fTtcblxub3B0aW9ucy5pbnNlcnQgPSBcImhlYWRcIjtcbm9wdGlvbnMuc2luZ2xldG9uID0gZmFsc2U7XG5cbnZhciB1cGRhdGUgPSBhcGkoY29udGVudCwgb3B0aW9ucyk7XG5cblxuXG5tb2R1bGUuZXhwb3J0cyA9IGNvbnRlbnQubG9jYWxzIHx8IHt9OyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///101\n")},function(module,exports,__webpack_require__){eval("exports = module.exports = __webpack_require__(6)(false);\n// Module\nexports.push([module.i, \".spectrum {  /* spectrum-animationGlobals.css */\\n  --spectrum-global-animation-linear: cubic-bezier(0, 0, 1, 1);\\n  --spectrum-global-animation-duration-0: 0ms;\\n  --spectrum-global-animation-duration-100: 130ms;\\n  --spectrum-global-animation-duration-200: 160ms;\\n  --spectrum-global-animation-duration-300: 190ms;\\n  --spectrum-global-animation-duration-400: 220ms;\\n  --spectrum-global-animation-duration-500: 250ms;\\n  --spectrum-global-animation-duration-600: 300ms;\\n  --spectrum-global-animation-duration-700: 350ms;\\n  --spectrum-global-animation-duration-800: 400ms;\\n  --spectrum-global-animation-duration-900: 450ms;\\n  --spectrum-global-animation-duration-1000: 500ms;\\n  --spectrum-global-animation-duration-2000: 1000ms;\\n  --spectrum-global-animation-duration-4000: 2000ms;\\n  --spectrum-global-animation-ease-in-out: cubic-bezier(.45, 0, .40, 1);\\n  --spectrum-global-animation-ease-in: cubic-bezier(.50, 0, 1, 1);\\n  --spectrum-global-animation-ease-out: cubic-bezier(0, 0, 0.40, 1);\\n  --spectrum-global-animation-ease-linear: cubic-bezier(0, 0, 1, 1);\\n\\n\\n  /* spectrum-colorGlobals.css */\\n  --spectrum-global-color-status: Verified;\\n  --spectrum-global-color-version: 5.1.0;\\n  --spectrum-global-color-static-black: rgb(0, 0, 0);\\n  --spectrum-global-color-static-white: rgb(255, 255, 255);\\n  --spectrum-global-color-static-blue: rgb(20, 115, 230);\\n  --spectrum-global-color-static-gray-50: rgb(255, 255, 255);\\n  --spectrum-global-color-static-gray-75: rgb(255, 255, 255);\\n  --spectrum-global-color-static-gray-100: rgb(255, 255, 255);\\n  --spectrum-global-color-static-gray-200: rgb(244, 244, 244);\\n  --spectrum-global-color-static-gray-300: rgb(234, 234, 234);\\n  --spectrum-global-color-static-gray-400: rgb(211, 211, 211);\\n  --spectrum-global-color-static-gray-500: rgb(188, 188, 188);\\n  --spectrum-global-color-static-gray-600: rgb(149, 149, 149);\\n  --spectrum-global-color-static-gray-700: rgb(116, 116, 116);\\n  --spectrum-global-color-static-gray-800: rgb(80, 80, 80);\\n  --spectrum-global-color-static-gray-900: rgb(50, 50, 50);\\n  --spectrum-global-color-static-blue-200: rgb(90, 169, 250);\\n  --spectrum-global-color-static-blue-300: rgb(75, 156, 245);\\n  --spectrum-global-color-static-blue-400: rgb(55, 142, 240);\\n  --spectrum-global-color-static-blue-500: rgb(38, 128, 235);\\n  --spectrum-global-color-static-blue-600: rgb(20, 115, 230);\\n  --spectrum-global-color-static-blue-700: rgb(13, 102, 208);\\n  --spectrum-global-color-static-blue-800: rgb(9, 90, 186);\\n  --spectrum-global-color-static-red-400: rgb(236, 91, 98);\\n  --spectrum-global-color-static-red-500: rgb(227, 72, 80);\\n  --spectrum-global-color-static-red-600: rgb(215, 55, 63);\\n  --spectrum-global-color-static-red-700: rgb(201, 37, 45);\\n  --spectrum-global-color-static-red-800: rgb(187, 18, 26);\\n  --spectrum-global-color-static-orange-400: rgb(242, 148, 35);\\n  --spectrum-global-color-static-orange-500: rgb(230, 134, 25);\\n  --spectrum-global-color-static-orange-600: rgb(218, 123, 17);\\n  --spectrum-global-color-static-orange-700: rgb(203, 111, 16);\\n  --spectrum-global-color-static-orange-800: rgb(189, 100, 13);\\n  --spectrum-global-color-static-green-400: rgb(51, 171, 132);\\n  --spectrum-global-color-static-green-500: rgb(45, 157, 120);\\n  --spectrum-global-color-static-green-600: rgb(38, 142, 108);\\n  --spectrum-global-color-static-green-700: rgb(18, 128, 92);\\n  --spectrum-global-color-static-green-800: rgb(16, 113, 84);\\n  --spectrum-global-color-static-celery-200: rgb(88, 224, 111);\\n  --spectrum-global-color-static-celery-300: rgb(81, 210, 103);\\n  --spectrum-global-color-static-celery-400: rgb(75, 195, 95);\\n  --spectrum-global-color-static-celery-500: rgb(68, 181, 86);\\n  --spectrum-global-color-static-celery-600: rgb(61, 167, 78);\\n  --spectrum-global-color-static-celery-700: rgb(55, 153, 71);\\n  --spectrum-global-color-static-celery-800: rgb(49, 139, 64);\\n  --spectrum-global-color-static-chartreuse-300: rgb(155, 236, 84);\\n  --spectrum-global-color-static-chartreuse-400: rgb(142, 222, 73);\\n  --spectrum-global-color-static-chartreuse-500: rgb(133, 208, 68);\\n  --spectrum-global-color-static-chartreuse-600: rgb(124, 195, 63);\\n  --spectrum-global-color-static-chartreuse-700: rgb(115, 181, 58);\\n  --spectrum-global-color-static-chartreuse-800: rgb(106, 168, 52);\\n  --spectrum-global-color-static-yellow-200: rgb(255, 226, 46);\\n  --spectrum-global-color-static-yellow-300: rgb(250, 217, 0);\\n  --spectrum-global-color-static-yellow-400: rgb(237, 204, 0);\\n  --spectrum-global-color-static-yellow-500: rgb(223, 191, 0);\\n  --spectrum-global-color-static-yellow-600: rgb(210, 178, 0);\\n  --spectrum-global-color-static-yellow-700: rgb(196, 166, 0);\\n  --spectrum-global-color-static-yellow-800: rgb(183, 153, 0);\\n  --spectrum-global-color-static-magenta-200: rgb(245, 107, 183);\\n  --spectrum-global-color-static-magenta-300: rgb(236, 90, 170);\\n  --spectrum-global-color-static-magenta-400: rgb(226, 73, 157);\\n  --spectrum-global-color-static-magenta-500: rgb(216, 55, 144);\\n  --spectrum-global-color-static-magenta-600: rgb(202, 41, 130);\\n  --spectrum-global-color-static-magenta-700: rgb(188, 28, 116);\\n  --spectrum-global-color-static-magenta-800: rgb(174, 14, 102);\\n  --spectrum-global-color-static-fuchsia-400: rgb(207, 62, 220);\\n  --spectrum-global-color-static-fuchsia-500: rgb(192, 56, 204);\\n  --spectrum-global-color-static-fuchsia-600: rgb(177, 48, 189);\\n  --spectrum-global-color-static-fuchsia-700: rgb(162, 40, 173);\\n  --spectrum-global-color-static-fuchsia-800: rgb(147, 33, 158);\\n  --spectrum-global-color-static-purple-400: rgb(157, 100, 225);\\n  --spectrum-global-color-static-purple-500: rgb(146, 86, 217);\\n  --spectrum-global-color-static-purple-600: rgb(134, 76, 204);\\n  --spectrum-global-color-static-purple-700: rgb(122, 66, 191);\\n  --spectrum-global-color-static-purple-800: rgb(111, 56, 177);\\n  --spectrum-global-color-static-indigo-200: rgb(144, 144, 250);\\n  --spectrum-global-color-static-indigo-300: rgb(130, 130, 246);\\n  --spectrum-global-color-static-indigo-400: rgb(117, 117, 241);\\n  --spectrum-global-color-static-indigo-500: rgb(103, 103, 236);\\n  --spectrum-global-color-static-indigo-600: rgb(92, 92, 224);\\n  --spectrum-global-color-static-indigo-700: rgb(81, 81, 211);\\n  --spectrum-global-color-static-indigo-800: rgb(70, 70, 198);\\n  --spectrum-global-color-static-seafoam-200: rgb(38, 192, 199);\\n  --spectrum-global-color-static-seafoam-300: rgb(35, 178, 184);\\n  --spectrum-global-color-static-seafoam-400: rgb(32, 163, 168);\\n  --spectrum-global-color-static-seafoam-500: rgb(27, 149, 154);\\n  --spectrum-global-color-static-seafoam-600: rgb(22, 135, 140);\\n  --spectrum-global-color-static-seafoam-700: rgb(15, 121, 125);\\n  --spectrum-global-color-static-seafoam-800: rgb(9, 108, 111);\\n  --spectrum-global-color-static-transparent-white-200: rgba(255,255,255,0.1);\\n  --spectrum-global-color-static-transparent-white-300: rgba(255,255,255,0.25);\\n  --spectrum-global-color-static-transparent-white-400: rgba(255,255,255,0.4);\\n  --spectrum-global-color-static-transparent-white-500: rgba(255,255,255,0.55);\\n  --spectrum-global-color-static-transparent-white-600: rgba(255,255,255,0.7);\\n  --spectrum-global-color-static-transparent-white-700: rgba(255,255,255,0.8);\\n  --spectrum-global-color-static-transparent-white-800: rgba(255,255,255,0.9);\\n  --spectrum-global-color-static-transparent-white-900: rgb(255,255,255);\\n  --spectrum-global-color-static-transparent-black-200: rgba(0,0,0,0.1);\\n  --spectrum-global-color-static-transparent-black-300: rgba(0,0,0,0.25);\\n  --spectrum-global-color-static-transparent-black-400: rgba(0,0,0,0.4);\\n  --spectrum-global-color-static-transparent-black-500: rgba(0,0,0,0.55);\\n  --spectrum-global-color-static-transparent-black-600: rgba(0,0,0,0.7);\\n  --spectrum-global-color-static-transparent-black-700: rgba(0,0,0,0.8);\\n  --spectrum-global-color-static-transparent-black-800: rgba(0,0,0,0.9);\\n  --spectrum-global-color-static-transparent-black-900: rgb(0,0,0);\\n  --spectrum-global-color-sequential-cerulean: #E9FFF1,#C8F1E4,#A5E3D7,#82D5CA,#68C5C1,#54B4BA,#3FA2B2,#2991AC,#2280A2,#1F6D98,#1D5C8D,#1A4B83,#1A3979,#1A266F,#191264,#180057;\\n  --spectrum-global-color-sequential-forest: #FFFFDF,#E2F6BA,#C4EB95,#A4E16D,#8DD366,#77C460,#5FB65A,#48A754,#36984F,#2C894D,#237A4A,#196B47,#105C45,#094D41,#033F3E,#00313A;\\n  --spectrum-global-color-sequential-rose: #FFF4DD,#FFDDD7,#FFC5D2,#FEAECB,#FA96C4,#F57EBD,#EF64B5,#E846AD,#D238A1,#BB2E96,#A3248C,#8A1B83,#71167C,#560F74,#370B6E,#000968;\\n  --spectrum-global-color-diverging-orange-yellow-seafoam: #580000,#79260B,#9C4511,#BD651A,#DD8629,#F5AD52,#FED693,#FFFFE0,#BBE4D1,#76C7BE,#3EA8A6,#208288,#076769,#00494B,#002C2D;\\n  --spectrum-global-color-diverging-red-yellow-blue: #4A001E,#751232,#A52747,#C65154,#E47961,#F0A882,#FAD4AC,#FFFFE0,#BCE2CF,#89C0C4,#579EB9,#397AA8,#1C5796,#163771,#10194D;\\n  --spectrum-global-color-diverging-red-blue: #4A001E,#731331,#9F2945,#CC415A,#E06E85,#ED9AB0,#F8C3D9,#FAF0FF,#C6D0F2,#92B2DE,#5D94CB,#2F74B3,#265191,#163670,#0B194C;\\n\\n\\n  /* spectrum-colorSemantics.css */\\n  --spectrum-semantic-negative-background-color: var(--spectrum-global-color-static-red-700);\\n  --spectrum-semantic-negative-color-default: var(--spectrum-global-color-red-500);\\n  --spectrum-semantic-negative-color-hover: var(--spectrum-global-color-red-600);\\n  --spectrum-semantic-negative-color-dark: var(--spectrum-global-color-red-600);\\n  --spectrum-semantic-negative-border-color: var(--spectrum-global-color-red-400);\\n  --spectrum-semantic-negative-icon-color: var(--spectrum-global-color-red-600);\\n  --spectrum-semantic-negative-status-color: var(--spectrum-global-color-red-400);\\n  --spectrum-semantic-negative-text-color-large: var(--spectrum-global-color-red-500);\\n  --spectrum-semantic-negative-text-color-small: var(--spectrum-global-color-red-600);\\n  --spectrum-semantic-negative-text-color-small-hover: var(--spectrum-global-color-red-700);\\n  --spectrum-semantic-negative-text-color-small-down: var(--spectrum-global-color-red-700);\\n  --spectrum-semantic-negative-text-color-small-key-focus: var(--spectrum-global-color-red-600);\\n  --spectrum-semantic-negative-color-down: var(--spectrum-global-color-red-700);\\n  --spectrum-semantic-negative-color-key-focus: var(--spectrum-global-color-red-400);\\n  --spectrum-semantic-negative-background-color-default: var(--spectrum-global-color-static-red-600);\\n  --spectrum-semantic-negative-background-color-hover: var(--spectrum-global-color-static-red-700);\\n  --spectrum-semantic-negative-background-color-down: var(--spectrum-global-color-static-red-800);\\n  --spectrum-semantic-negative-background-color-key-focus: var(--spectrum-global-color-static-red-700);\\n  --spectrum-semantic-notice-background-color: var(--spectrum-global-color-static-orange-700);\\n  --spectrum-semantic-notice-color-default: var(--spectrum-global-color-orange-500);\\n  --spectrum-semantic-notice-color-dark: var(--spectrum-global-color-orange-600);\\n  --spectrum-semantic-notice-border-color: var(--spectrum-global-color-orange-400);\\n  --spectrum-semantic-notice-icon-color: var(--spectrum-global-color-orange-600);\\n  --spectrum-semantic-notice-status-color: var(--spectrum-global-color-orange-400);\\n  --spectrum-semantic-notice-text-color-large: var(--spectrum-global-color-orange-500);\\n  --spectrum-semantic-notice-text-color-small: var(--spectrum-global-color-orange-600);\\n  --spectrum-semantic-notice-color-down: var(--spectrum-global-color-orange-700);\\n  --spectrum-semantic-notice-color-key-focus: var(--spectrum-global-color-orange-400);\\n  --spectrum-semantic-notice-background-color-default: var(--spectrum-global-color-static-orange-600);\\n  --spectrum-semantic-notice-background-color-hover: var(--spectrum-global-color-static-orange-700);\\n  --spectrum-semantic-notice-background-color-down: var(--spectrum-global-color-static-orange-800);\\n  --spectrum-semantic-notice-background-color-key-focus: var(--spectrum-global-color-static-orange-700);\\n  --spectrum-semantic-positive-background-color: var(--spectrum-global-color-static-green-700);\\n  --spectrum-semantic-positive-color-default: var(--spectrum-global-color-green-500);\\n  --spectrum-semantic-positive-color-dark: var(--spectrum-global-color-green-600);\\n  --spectrum-semantic-positive-border-color: var(--spectrum-global-color-green-400);\\n  --spectrum-semantic-positive-icon-color: var(--spectrum-global-color-green-600);\\n  --spectrum-semantic-positive-status-color: var(--spectrum-global-color-green-400);\\n  --spectrum-semantic-positive-text-color-large: var(--spectrum-global-color-green-500);\\n  --spectrum-semantic-positive-text-color-small: var(--spectrum-global-color-green-600);\\n  --spectrum-semantic-positive-color-down: var(--spectrum-global-color-green-700);\\n  --spectrum-semantic-positive-color-key-focus: var(--spectrum-global-color-green-400);\\n  --spectrum-semantic-positive-background-color-default: var(--spectrum-global-color-static-green-700);\\n  --spectrum-semantic-positive-background-color-hover: var(--spectrum-global-color-static-green-800);\\n  --spectrum-semantic-positive-background-color-down: var(--spectrum-global-color-static-green-800);\\n  --spectrum-semantic-positive-background-color-key-focus: var(--spectrum-global-color-static-green-800);\\n  --spectrum-semantic-informative-background-color: var(--spectrum-global-color-static-blue-700);\\n  --spectrum-semantic-informative-color-default: var(--spectrum-global-color-blue-500);\\n  --spectrum-semantic-informative-color-dark: var(--spectrum-global-color-blue-600);\\n  --spectrum-semantic-informative-border-color: var(--spectrum-global-color-blue-400);\\n  --spectrum-semantic-informative-icon-color: var(--spectrum-global-color-blue-600);\\n  --spectrum-semantic-informative-status-color: var(--spectrum-global-color-blue-400);\\n  --spectrum-semantic-informative-text-color-large: var(--spectrum-global-color-blue-500);\\n  --spectrum-semantic-informative-text-color-small: var(--spectrum-global-color-blue-600);\\n  --spectrum-semantic-informative-color-down: var(--spectrum-global-color-blue-700);\\n  --spectrum-semantic-informative-color-key-focus: var(--spectrum-global-color-blue-400);\\n  --spectrum-semantic-informative-background-color-default: var(--spectrum-global-color-static-blue-600);\\n  --spectrum-semantic-informative-background-color-hover: var(--spectrum-global-color-static-blue-700);\\n  --spectrum-semantic-informative-background-color-down: var(--spectrum-global-color-static-blue-800);\\n  --spectrum-semantic-informative-background-color-key-focus: var(--spectrum-global-color-static-blue-700);\\n  --spectrum-semantic-cta-background-color-default: var(--spectrum-global-color-static-blue-600);\\n  --spectrum-semantic-cta-background-color-hover: var(--spectrum-global-color-static-blue-700);\\n  --spectrum-semantic-cta-background-color-down: var(--spectrum-global-color-static-blue-800);\\n  --spectrum-semantic-cta-background-color-key-focus: var(--spectrum-global-color-static-blue-600);\\n  --spectrum-semantic-neutral-background-color-default: var(--spectrum-global-color-static-gray-700);\\n  --spectrum-semantic-neutral-background-color-hover: var(--spectrum-global-color-static-gray-800);\\n  --spectrum-semantic-neutral-background-color-down: var(--spectrum-global-color-static-gray-900);\\n  --spectrum-semantic-neutral-background-color-key-focus: var(--spectrum-global-color-static-gray-800);\\n  --spectrum-semantic-presence-color-1: var(--spectrum-global-color-static-red-500);\\n  --spectrum-semantic-presence-color-2: var(--spectrum-global-color-static-orange-400);\\n  --spectrum-semantic-presence-color-3: var(--spectrum-global-color-static-yellow-400);\\n  --spectrum-semantic-presence-color-4: rgb(75, 204, 162);\\n  --spectrum-semantic-presence-color-5: rgb(0, 199, 255);\\n  --spectrum-semantic-presence-color-6: rgb(0, 140, 184);\\n  --spectrum-semantic-presence-color-7: rgb(126, 75, 243);\\n  --spectrum-semantic-presence-color-8: var(--spectrum-global-color-static-fuchsia-600);\\n\\n\\n  /* spectrum-dimensionGlobals.css */\\n  --spectrum-global-dimension-static-percent-50: 50%;\\n  --spectrum-global-dimension-static-percent-70: 70%;\\n  --spectrum-global-dimension-static-percent-100: 100%;\\n  --spectrum-global-dimension-static-breakpoint-xsmall: 304px;\\n  --spectrum-global-dimension-static-breakpoint-small: 768px;\\n  --spectrum-global-dimension-static-breakpoint-medium: 1280px;\\n  --spectrum-global-dimension-static-breakpoint-large: 1768px;\\n  --spectrum-global-dimension-static-breakpoint-xlarge: 2160px;\\n  --spectrum-global-dimension-static-grid-columns: 12;\\n  --spectrum-global-dimension-static-grid-fluid-width: 100%;\\n  --spectrum-global-dimension-static-grid-fixed-max-width: 1280px;\\n  --spectrum-global-dimension-static-size-0: 0px;\\n  --spectrum-global-dimension-static-size-10: 1px;\\n  --spectrum-global-dimension-static-size-25: 2px;\\n  --spectrum-global-dimension-static-size-40: 3px;\\n  --spectrum-global-dimension-static-size-50: 4px;\\n  --spectrum-global-dimension-static-size-65: 5px;\\n  --spectrum-global-dimension-static-size-75: 6px;\\n  --spectrum-global-dimension-static-size-85: 7px;\\n  --spectrum-global-dimension-static-size-100: 8px;\\n  --spectrum-global-dimension-static-size-115: 9px;\\n  --spectrum-global-dimension-static-size-125: 10px;\\n  --spectrum-global-dimension-static-size-130: 11px;\\n  --spectrum-global-dimension-static-size-150: 12px;\\n  --spectrum-global-dimension-static-size-160: 13px;\\n  --spectrum-global-dimension-static-size-175: 14px;\\n  --spectrum-global-dimension-static-size-200: 16px;\\n  --spectrum-global-dimension-static-size-225: 18px;\\n  --spectrum-global-dimension-static-size-250: 20px;\\n  --spectrum-global-dimension-static-size-275: 22px;\\n  --spectrum-global-dimension-static-size-300: 24px;\\n  --spectrum-global-dimension-static-size-325: 26px;\\n  --spectrum-global-dimension-static-size-400: 32px;\\n  --spectrum-global-dimension-static-size-450: 36px;\\n  --spectrum-global-dimension-static-size-500: 40px;\\n  --spectrum-global-dimension-static-size-550: 44px;\\n  --spectrum-global-dimension-static-size-600: 48px;\\n  --spectrum-global-dimension-static-size-700: 56px;\\n  --spectrum-global-dimension-static-size-800: 64px;\\n  --spectrum-global-dimension-static-size-900: 72px;\\n  --spectrum-global-dimension-static-size-1000: 80px;\\n  --spectrum-global-dimension-static-size-1200: 96px;\\n  --spectrum-global-dimension-static-size-1700: 136px;\\n  --spectrum-global-dimension-static-size-2400: 192px;\\n  --spectrum-global-dimension-static-size-2500: 200px;\\n  --spectrum-global-dimension-static-size-2600: 208px;\\n  --spectrum-global-dimension-static-size-2800: 224px;\\n  --spectrum-global-dimension-static-size-3200: 256px;\\n  --spectrum-global-dimension-static-size-3400: 272px;\\n  --spectrum-global-dimension-static-size-3500: 280px;\\n  --spectrum-global-dimension-static-size-3600: 288px;\\n  --spectrum-global-dimension-static-size-3800: 304px;\\n  --spectrum-global-dimension-static-size-4600: 368px;\\n  --spectrum-global-dimension-static-size-5000: 400px;\\n  --spectrum-global-dimension-static-size-6000: 480px;\\n  --spectrum-global-dimension-static-size-16000: 1280px;\\n  --spectrum-global-dimension-static-font-size-50: 11px;\\n  --spectrum-global-dimension-static-font-size-75: 12px;\\n  --spectrum-global-dimension-static-font-size-100: 14px;\\n  --spectrum-global-dimension-static-font-size-150: 15px;\\n  --spectrum-global-dimension-static-font-size-200: 16px;\\n  --spectrum-global-dimension-static-font-size-300: 18px;\\n  --spectrum-global-dimension-static-font-size-400: 20px;\\n  --spectrum-global-dimension-static-font-size-500: 22px;\\n  --spectrum-global-dimension-static-font-size-600: 25px;\\n  --spectrum-global-dimension-static-font-size-700: 28px;\\n  --spectrum-global-dimension-static-font-size-800: 32px;\\n  --spectrum-global-dimension-static-font-size-900: 36px;\\n  --spectrum-global-dimension-static-font-size-1000: 40px;\\n\\n\\n  /* spectrum-fontGlobals.css */\\n  --spectrum-global-font-family-base: adobe-clean, 'Source Sans Pro', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Ubuntu, 'Trebuchet MS', 'Lucida Grande', sans-serif;\\n  --spectrum-global-font-family-serif: adobe-clean-serif, 'Source Serif Pro', Georgia, serif;\\n  --spectrum-global-font-family-code: 'Source Code Pro', Monaco, monospace;\\n  --spectrum-global-font-weight-thin: 100;\\n  --spectrum-global-font-weight-ultra-light: 200;\\n  --spectrum-global-font-weight-light: 300;\\n  --spectrum-global-font-weight-regular: 400;\\n  --spectrum-global-font-weight-medium: 500;\\n  --spectrum-global-font-weight-semi-bold: 600;\\n  --spectrum-global-font-weight-bold: 700;\\n  --spectrum-global-font-weight-extra-bold: 800;\\n  --spectrum-global-font-weight-black: 900;\\n  --spectrum-global-font-style-regular: normal;\\n  --spectrum-global-font-style-italic: italic;\\n  --spectrum-global-font-letter-spacing-none: 0;\\n  --spectrum-global-font-letter-spacing-small: 0.0125em;\\n  --spectrum-global-font-letter-spacing-han: 0.05em;\\n  --spectrum-global-font-letter-spacing-medium: 0.06em;\\n  --spectrum-global-font-line-height-large: 1.7;\\n  --spectrum-global-font-line-height-medium: 1.5;\\n  --spectrum-global-font-line-height-small: 1.3;\\n  --spectrum-global-font-multiplier-0: 0em;\\n  --spectrum-global-font-multiplier-25: 0.25em;\\n  --spectrum-global-font-multiplier-75: 0.75em;\\n  --spectrum-global-font-font-family-ar: myriad-arabic, adobe-clean, 'Source Sans Pro', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Ubuntu, 'Trebuchet MS', 'Lucida Grande', sans-serif;\\n  --spectrum-global-font-font-family-he: myriad-hebrew, adobe-clean, 'Source Sans Pro', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Ubuntu, 'Trebuchet MS', 'Lucida Grande', sans-serif;\\n  --spectrum-global-font-font-family-zh: adobe-clean-han-traditional, source-han-traditional, 'MingLiu', 'Heiti TC Light', 'sans-serif';\\n  --spectrum-global-font-font-family-zhhans: adobe-clean-han-simplified-c, source-han-simplified-c, 'SimSun', 'Heiti SC Light', 'sans-serif';\\n  --spectrum-global-font-font-family-ko: adobe-clean-han-korean, source-han-korean, 'Malgun Gothic', 'Apple Gothic', 'sans-serif';\\n  --spectrum-global-font-font-family-ja: adobe-clean-han-japanese, 'Hiragino Kaku Gothic ProN', 'ヒラギノ角ゴ ProN W3', 'Osaka', YuGothic, 'Yu Gothic', 'メイリオ', Meiryo, 'MS Pゴシック', 'MS PGothic', 'sans-serif';\\n  --spectrum-global-font-font-family-condensed: adobe-clean-han-traditional, source-han-traditional, 'MingLiu', 'Heiti TC Light', adobe-clean, 'Source Sans Pro', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Ubuntu, 'Trebuchet MS', 'Lucida Grande', sans-serif;\\n\\n\\n  /* spectrum-staticAliases.css */\\n  --spectrum-alias-border-size-thin: var(--spectrum-global-dimension-static-size-10);\\n  --spectrum-alias-border-size-thick: var(--spectrum-global-dimension-static-size-25);\\n  --spectrum-alias-border-size-thicker: var(--spectrum-global-dimension-static-size-50);\\n  --spectrum-alias-border-size-thickest: var(--spectrum-global-dimension-static-size-100);\\n  --spectrum-alias-border-offset-thin: var(--spectrum-global-dimension-static-size-25);\\n  --spectrum-alias-border-offset-thick: var(--spectrum-global-dimension-static-size-50);\\n  --spectrum-alias-border-offset-thicker: var(--spectrum-global-dimension-static-size-100);\\n  --spectrum-alias-border-offset-thickest: var(--spectrum-global-dimension-static-size-200);\\n  --spectrum-alias-grid-baseline: var(--spectrum-global-dimension-static-size-100);\\n  --spectrum-alias-grid-gutter-xsmall: var(--spectrum-global-dimension-static-size-200);\\n  --spectrum-alias-grid-gutter-small: var(--spectrum-global-dimension-static-size-300);\\n  --spectrum-alias-grid-gutter-medium: var(--spectrum-global-dimension-static-size-400);\\n  --spectrum-alias-grid-gutter-large: var(--spectrum-global-dimension-static-size-500);\\n  --spectrum-alias-grid-gutter-xlarge: var(--spectrum-global-dimension-static-size-600);\\n  --spectrum-alias-grid-margin-xsmall: var(--spectrum-global-dimension-static-size-200);\\n  --spectrum-alias-grid-margin-small: var(--spectrum-global-dimension-static-size-300);\\n  --spectrum-alias-grid-margin-medium: var(--spectrum-global-dimension-static-size-400);\\n  --spectrum-alias-grid-margin-large: var(--spectrum-global-dimension-static-size-500);\\n  --spectrum-alias-grid-margin-xlarge: var(--spectrum-global-dimension-static-size-600);\\n  --spectrum-alias-grid-layout-region-margin-bottom-xsmall: var(--spectrum-global-dimension-static-size-200);\\n  --spectrum-alias-grid-layout-region-margin-bottom-small: var(--spectrum-global-dimension-static-size-300);\\n  --spectrum-alias-grid-layout-region-margin-bottom-medium: var(--spectrum-global-dimension-static-size-400);\\n  --spectrum-alias-grid-layout-region-margin-bottom-large: var(--spectrum-global-dimension-static-size-500);\\n  --spectrum-alias-grid-layout-region-margin-bottom-xlarge: var(--spectrum-global-dimension-static-size-600);\\n  --spectrum-alias-radial-reaction-size-default: var(--spectrum-global-dimension-static-size-550);\\n  --spectrum-alias-focus-ring-gap: var(--spectrum-global-dimension-static-size-25);\\n  --spectrum-alias-focus-ring-size: var(--spectrum-global-dimension-static-size-25);\\n  --spectrum-alias-loupe-entry-animation-duration: var(--spectrum-global-animation-duration-300);\\n  --spectrum-alias-loupe-exit-animation-duration: var(--spectrum-global-animation-duration-300);\\n  --spectrum-alias-heading-text-line-height: var(--spectrum-global-font-line-height-small);\\n  --spectrum-alias-heading-text-font-weight-regular: var(--spectrum-global-font-weight-bold);\\n  --spectrum-alias-heading-text-font-weight-regular-strong: var(--spectrum-global-font-weight-black);\\n  --spectrum-alias-heading-text-font-weight-light: var(--spectrum-global-font-weight-light);\\n  --spectrum-alias-heading-text-font-weight-light-strong: var(--spectrum-global-font-weight-bold);\\n  --spectrum-alias-heading-text-font-weight-heavy: var(--spectrum-global-font-weight-black);\\n  --spectrum-alias-heading-text-font-weight-heavy-strong: var(--spectrum-global-font-weight-black);\\n  --spectrum-alias-heading-text-font-weight-quiet: var(--spectrum-global-font-weight-light);\\n  --spectrum-alias-heading-text-font-weight-quiet-strong: var(--spectrum-global-font-weight-bold);\\n  --spectrum-alias-heading-text-font-weight-strong: var(--spectrum-global-font-weight-black);\\n  --spectrum-alias-heading-text-font-weight-strong-strong: var(--spectrum-global-font-weight-black);\\n  --spectrum-alias-heading-margin-bottom: var(--spectrum-global-font-multiplier-25);\\n  --spectrum-alias-subheading-text-font-weight: var(--spectrum-global-font-weight-bold);\\n  --spectrum-alias-subheading-text-font-weight-strong: var(--spectrum-global-font-weight-black);\\n  --spectrum-alias-body-text-font-family: var(--spectrum-global-font-family-base);\\n  --spectrum-alias-body-text-line-height: var(--spectrum-global-font-line-height-medium);\\n  --spectrum-alias-body-text-font-weight: var(--spectrum-global-font-weight-regular);\\n  --spectrum-alias-body-text-font-weight-strong: var(--spectrum-global-font-weight-bold);\\n  --spectrum-alias-body-margin-bottom: var(--spectrum-global-font-multiplier-75);\\n  --spectrum-alias-detail-text-font-weight: var(--spectrum-global-font-weight-bold);\\n  --spectrum-alias-detail-text-font-weight-regular: var(--spectrum-global-font-weight-bold);\\n  --spectrum-alias-detail-text-font-weight-light: var(--spectrum-global-font-weight-regular);\\n  --spectrum-alias-detail-text-font-weight-strong: var(--spectrum-global-font-weight-black);\\n  --spectrum-alias-article-heading-text-font-weight: var(--spectrum-global-font-weight-bold);\\n  --spectrum-alias-article-heading-text-font-weight-strong: var(--spectrum-global-font-weight-black);\\n  --spectrum-alias-article-heading-text-font-weight-quiet: var(--spectrum-global-font-weight-regular);\\n  --spectrum-alias-article-heading-text-font-weight-quiet-strong: var(--spectrum-global-font-weight-bold);\\n  --spectrum-alias-article-body-text-font-weight: var(--spectrum-global-font-weight-regular);\\n  --spectrum-alias-article-body-text-font-weight-strong: var(--spectrum-global-font-weight-black);\\n  --spectrum-alias-article-subheading-text-font-weight: var(--spectrum-global-font-weight-bold);\\n  --spectrum-alias-article-subheading-text-font-weight-strong: var(--spectrum-global-font-weight-black);\\n  --spectrum-alias-article-detail-text-font-weight: var(--spectrum-global-font-weight-regular);\\n  --spectrum-alias-article-detail-text-font-weight-strong: var(--spectrum-global-font-weight-bold);\\n  --spectrum-alias-code-text-font-family: var(--spectrum-global-font-family-code);\\n  --spectrum-alias-code-text-font-weight-regular: var(--spectrum-global-font-weight-regular);\\n  --spectrum-alias-code-text-font-weight-strong: var(--spectrum-global-font-weight-bold);\\n  --spectrum-alias-code-text-line-height: var(--spectrum-global-font-line-height-medium);\\n  --spectrum-alias-code-margin-bottom: var(--spectrum-global-font-multiplier-0);\\n  --spectrum-alias-font-family-ar: var(--spectrum-global-font-font-family-ar);\\n  --spectrum-alias-font-family-he: var(--spectrum-global-font-font-family-he);\\n  --spectrum-alias-font-family-zh: var(--spectrum-global-font-font-family-zh);\\n  --spectrum-alias-font-family-zhhans: var(--spectrum-global-font-font-family-zhhans);\\n  --spectrum-alias-font-family-ko: var(--spectrum-global-font-font-family-ko);\\n  --spectrum-alias-font-family-ja: var(--spectrum-global-font-font-family-ja);\\n  --spectrum-alias-font-family-condensed: var(--spectrum-global-font-font-family-condensed);\\n  --spectrum-alias-button-text-line-height: var(--spectrum-global-font-line-height-small);\\n  --spectrum-alias-component-text-line-height: var(--spectrum-global-font-line-height-small);\\n  --spectrum-alias-han-component-text-line-height: var(--spectrum-global-font-line-height-medium);\\n  --spectrum-alias-serif-text-font-family: var(--spectrum-global-font-family-serif);\\n  --spectrum-alias-han-heading-text-line-height: var(--spectrum-global-font-line-height-medium);\\n  --spectrum-alias-han-heading-text-font-weight-regular: var(--spectrum-global-font-weight-bold);\\n  --spectrum-alias-han-heading-text-font-weight-regular-emphasis: var(--spectrum-global-font-weight-extra-bold);\\n  --spectrum-alias-han-heading-text-font-weight-regular-strong: var(--spectrum-global-font-weight-black);\\n  --spectrum-alias-han-heading-text-font-weight-quiet-strong: var(--spectrum-global-font-weight-bold);\\n  --spectrum-alias-han-heading-text-font-weight-light: var(--spectrum-global-font-weight-light);\\n  --spectrum-alias-han-heading-text-font-weight-light-emphasis: var(--spectrum-global-font-weight-regular);\\n  --spectrum-alias-han-heading-text-font-weight-light-strong: var(--spectrum-global-font-weight-bold);\\n  --spectrum-alias-han-heading-text-font-weight-heavy: var(--spectrum-global-font-weight-black);\\n  --spectrum-alias-han-heading-text-font-weight-heavy-emphasis: var(--spectrum-global-font-weight-black);\\n  --spectrum-alias-han-heading-text-font-weight-heavy-strong: var(--spectrum-global-font-weight-black);\\n  --spectrum-alias-han-body-text-line-height: var(--spectrum-global-font-line-height-large);\\n  --spectrum-alias-han-body-text-font-weight-regular: var(--spectrum-global-font-weight-regular);\\n  --spectrum-alias-han-body-text-font-weight-emphasis: var(--spectrum-global-font-weight-bold);\\n  --spectrum-alias-han-body-text-font-weight-strong: var(--spectrum-global-font-weight-black);\\n  --spectrum-alias-han-subheading-text-font-weight-regular: var(--spectrum-global-font-weight-bold);\\n  --spectrum-alias-han-subheading-text-font-weight-emphasis: var(--spectrum-global-font-weight-extra-bold);\\n  --spectrum-alias-han-subheading-text-font-weight-strong: var(--spectrum-global-font-weight-black);\\n  --spectrum-alias-han-detail-text-font-weight: var(--spectrum-global-font-weight-regular);\\n  --spectrum-alias-han-detail-text-font-weight-emphasis: var(--spectrum-global-font-weight-bold);\\n  --spectrum-alias-han-detail-text-font-weight-strong: var(--spectrum-global-font-weight-black);\\n\\n}\\n\\n.spectrum--medium,\\n.spectrum--large {\\n  /* spectrum-dimensionAliases.css */\\n  --spectrum-alias-item-height-s: var(--spectrum-global-dimension-size-300);\\n  --spectrum-alias-item-height-m: var(--spectrum-global-dimension-size-400);\\n  --spectrum-alias-item-height-l: var(--spectrum-global-dimension-size-500);\\n  --spectrum-alias-item-height-xl: var(--spectrum-global-dimension-size-600);\\n  --spectrum-alias-item-rounded-border-radius-s: var(--spectrum-global-dimension-size-150);\\n  --spectrum-alias-item-rounded-border-radius-m: var(--spectrum-global-dimension-size-200);\\n  --spectrum-alias-item-rounded-border-radius-l: var(--spectrum-global-dimension-size-250);\\n  --spectrum-alias-item-rounded-border-radius-xl: var(--spectrum-global-dimension-size-300);\\n  --spectrum-alias-item-text-size-s: var(--spectrum-global-dimension-font-size-75);\\n  --spectrum-alias-item-text-size-m: var(--spectrum-global-dimension-font-size-100);\\n  --spectrum-alias-item-text-size-l: var(--spectrum-global-dimension-font-size-200);\\n  --spectrum-alias-item-text-size-xl: var(--spectrum-global-dimension-font-size-300);\\n  --spectrum-alias-item-text-padding-top-s: var(--spectrum-global-dimension-static-size-50);\\n  --spectrum-alias-item-text-padding-top-m: var(--spectrum-global-dimension-size-75);\\n  --spectrum-alias-item-text-padding-top-xl: var(--spectrum-global-dimension-size-150);\\n  --spectrum-alias-item-text-padding-bottom-m: var(--spectrum-global-dimension-size-115);\\n  --spectrum-alias-item-text-padding-bottom-l: var(--spectrum-global-dimension-size-130);\\n  --spectrum-alias-item-text-padding-bottom-xl: var(--spectrum-global-dimension-size-175);\\n  --spectrum-alias-item-icon-padding-top-s: var(--spectrum-global-dimension-size-50);\\n  --spectrum-alias-item-icon-padding-top-m: var(--spectrum-global-dimension-size-85);\\n  --spectrum-alias-item-icon-padding-top-l: var(--spectrum-global-dimension-size-125);\\n  --spectrum-alias-item-icon-padding-top-xl: var(--spectrum-global-dimension-size-160);\\n  --spectrum-alias-item-icon-padding-bottom-s: var(--spectrum-global-dimension-size-50);\\n  --spectrum-alias-item-icon-padding-bottom-m: var(--spectrum-global-dimension-size-85);\\n  --spectrum-alias-item-icon-padding-bottom-l: var(--spectrum-global-dimension-size-125);\\n  --spectrum-alias-item-icon-padding-bottom-xl: var(--spectrum-global-dimension-size-160);\\n  --spectrum-alias-item-padding-s: var(--spectrum-global-dimension-size-115);\\n  --spectrum-alias-item-padding-m: var(--spectrum-global-dimension-size-150);\\n  --spectrum-alias-item-padding-l: var(--spectrum-global-dimension-size-185);\\n  --spectrum-alias-item-padding-xl: var(--spectrum-global-dimension-size-225);\\n  --spectrum-alias-item-rounded-padding-s: var(--spectrum-global-dimension-size-150);\\n  --spectrum-alias-item-rounded-padding-m: var(--spectrum-global-dimension-size-200);\\n  --spectrum-alias-item-rounded-padding-l: var(--spectrum-global-dimension-size-250);\\n  --spectrum-alias-item-rounded-padding-xl: var(--spectrum-global-dimension-size-300);\\n  --spectrum-alias-item-icononly-padding-s: var(--spectrum-global-dimension-size-50);\\n  --spectrum-alias-item-icononly-padding-m: var(--spectrum-global-dimension-size-85);\\n  --spectrum-alias-item-icononly-padding-l: var(--spectrum-global-dimension-size-125);\\n  --spectrum-alias-item-icononly-padding-xl: var(--spectrum-global-dimension-size-160);\\n  --spectrum-alias-item-control-gap-s: var(--spectrum-global-dimension-size-115);\\n  --spectrum-alias-item-control-gap-m: var(--spectrum-global-dimension-size-125);\\n  --spectrum-alias-item-control-gap-l: var(--spectrum-global-dimension-size-130);\\n  --spectrum-alias-item-control-gap-xl: var(--spectrum-global-dimension-size-160);\\n  --spectrum-alias-item-workflow-icon-gap-s: var(--spectrum-global-dimension-size-85);\\n  --spectrum-alias-item-workflow-icon-gap-m: var(--spectrum-global-dimension-size-100);\\n  --spectrum-alias-item-workflow-icon-gap-l: var(--spectrum-global-dimension-size-115);\\n  --spectrum-alias-item-workflow-icon-gap-xl: var(--spectrum-global-dimension-size-125);\\n  --spectrum-alias-item-mark-gap-s: var(--spectrum-global-dimension-size-85);\\n  --spectrum-alias-item-mark-gap-m: var(--spectrum-global-dimension-size-100);\\n  --spectrum-alias-item-mark-gap-l: var(--spectrum-global-dimension-size-115);\\n  --spectrum-alias-item-mark-gap-xl: var(--spectrum-global-dimension-size-125);\\n  --spectrum-alias-item-ui-icon-gap-s: var(--spectrum-global-dimension-size-85);\\n  --spectrum-alias-item-ui-icon-gap-m: var(--spectrum-global-dimension-size-100);\\n  --spectrum-alias-item-ui-icon-gap-l: var(--spectrum-global-dimension-size-115);\\n  --spectrum-alias-item-ui-icon-gap-xl: var(--spectrum-global-dimension-size-125);\\n  --spectrum-alias-item-clearbutton-gap-s: var(--spectrum-global-dimension-size-50);\\n  --spectrum-alias-item-clearbutton-gap-m: var(--spectrum-global-dimension-size-85);\\n  --spectrum-alias-item-clearbutton-gap-l: var(--spectrum-global-dimension-size-125);\\n  --spectrum-alias-item-clearbutton-gap-xl: var(--spectrum-global-dimension-size-150);\\n  --spectrum-alias-item-workflow-padding-left-s: var(--spectrum-global-dimension-size-85);\\n  --spectrum-alias-item-workflow-padding-left-l: var(--spectrum-global-dimension-size-160);\\n  --spectrum-alias-item-workflow-padding-left-xl: var(--spectrum-global-dimension-size-185);\\n  --spectrum-alias-item-rounded-workflow-padding-left-s: var(--spectrum-global-dimension-size-125);\\n  --spectrum-alias-item-rounded-workflow-padding-left-l: var(--spectrum-global-dimension-size-225);\\n  --spectrum-alias-item-mark-padding-top-s: var(--spectrum-global-dimension-size-40);\\n  --spectrum-alias-item-mark-padding-top-l: var(--spectrum-global-dimension-size-115);\\n  --spectrum-alias-item-mark-padding-top-xl: var(--spectrum-global-dimension-size-130);\\n  --spectrum-alias-item-mark-padding-bottom-s: var(--spectrum-global-dimension-size-40);\\n  --spectrum-alias-item-mark-padding-bottom-l: var(--spectrum-global-dimension-size-115);\\n  --spectrum-alias-item-mark-padding-bottom-xl: var(--spectrum-global-dimension-size-130);\\n  --spectrum-alias-item-mark-padding-left-s: var(--spectrum-global-dimension-size-85);\\n  --spectrum-alias-item-mark-padding-left-l: var(--spectrum-global-dimension-size-160);\\n  --spectrum-alias-item-mark-padding-left-xl: var(--spectrum-global-dimension-size-185);\\n  --spectrum-alias-item-control-1-size-s: var(--spectrum-global-dimension-static-size-100);\\n  --spectrum-alias-item-control-1-size-m: var(--spectrum-global-dimension-size-100);\\n  --spectrum-alias-item-control-2-size-m: var(--spectrum-global-dimension-size-175);\\n  --spectrum-alias-item-control-2-size-l: var(--spectrum-global-dimension-size-200);\\n  --spectrum-alias-item-control-2-size-xl: var(--spectrum-global-dimension-size-225);\\n  --spectrum-alias-item-control-2-size-xxl: var(--spectrum-global-dimension-size-250);\\n  --spectrum-alias-item-control-2-border-radius-s: var(--spectrum-global-dimension-size-75);\\n  --spectrum-alias-item-control-2-border-radius-m: var(--spectrum-global-dimension-size-85);\\n  --spectrum-alias-item-control-2-border-radius-l: var(--spectrum-global-dimension-size-100);\\n  --spectrum-alias-item-control-2-border-radius-xl: var(--spectrum-global-dimension-size-115);\\n  --spectrum-alias-item-control-2-border-radius-xxl: var(--spectrum-global-dimension-size-125);\\n  --spectrum-alias-item-control-2-padding-s: var(--spectrum-global-dimension-size-75);\\n  --spectrum-alias-item-control-2-padding-m: var(--spectrum-global-dimension-size-115);\\n  --spectrum-alias-item-control-2-padding-l: var(--spectrum-global-dimension-size-150);\\n  --spectrum-alias-item-control-2-padding-xl: var(--spectrum-global-dimension-size-185);\\n  --spectrum-alias-item-control-3-height-m: var(--spectrum-global-dimension-size-175);\\n  --spectrum-alias-item-control-3-height-l: var(--spectrum-global-dimension-size-200);\\n  --spectrum-alias-item-control-3-height-xl: var(--spectrum-global-dimension-size-225);\\n  --spectrum-alias-item-control-3-border-radius-s: var(--spectrum-global-dimension-size-75);\\n  --spectrum-alias-item-control-3-border-radius-m: var(--spectrum-global-dimension-size-85);\\n  --spectrum-alias-item-control-3-border-radius-l: var(--spectrum-global-dimension-size-100);\\n  --spectrum-alias-item-control-3-border-radius-xl: var(--spectrum-global-dimension-size-115);\\n  --spectrum-alias-item-control-3-padding-s: var(--spectrum-global-dimension-size-75);\\n  --spectrum-alias-item-control-3-padding-m: var(--spectrum-global-dimension-size-115);\\n  --spectrum-alias-item-control-3-padding-l: var(--spectrum-global-dimension-size-150);\\n  --spectrum-alias-item-control-3-padding-xl: var(--spectrum-global-dimension-size-185);\\n  --spectrum-alias-item-mark-size-s: var(--spectrum-global-dimension-size-225);\\n  --spectrum-alias-item-mark-size-l: var(--spectrum-global-dimension-size-275);\\n  --spectrum-alias-item-mark-size-xl: var(--spectrum-global-dimension-size-325);\\n  --spectrum-alias-heading-xxxl-text-size: var(--spectrum-global-dimension-font-size-1300);\\n  --spectrum-alias-heading-xxl-text-size: var(--spectrum-global-dimension-font-size-1100);\\n  --spectrum-alias-heading-xl-text-size: var(--spectrum-global-dimension-font-size-900);\\n  --spectrum-alias-heading-l-text-size: var(--spectrum-global-dimension-font-size-700);\\n  --spectrum-alias-heading-m-text-size: var(--spectrum-global-dimension-font-size-500);\\n  --spectrum-alias-heading-s-text-size: var(--spectrum-global-dimension-font-size-300);\\n  --spectrum-alias-heading-xs-text-size: var(--spectrum-global-dimension-font-size-200);\\n  --spectrum-alias-heading-xxs-text-size: var(--spectrum-global-dimension-font-size-100);\\n  --spectrum-alias-heading-xxxl-margin-top: var(--spectrum-global-dimension-font-size-1200);\\n  --spectrum-alias-heading-xxl-margin-top: var(--spectrum-global-dimension-font-size-900);\\n  --spectrum-alias-heading-xl-margin-top: var(--spectrum-global-dimension-font-size-800);\\n  --spectrum-alias-heading-l-margin-top: var(--spectrum-global-dimension-font-size-600);\\n  --spectrum-alias-heading-m-margin-top: var(--spectrum-global-dimension-font-size-400);\\n  --spectrum-alias-heading-s-margin-top: var(--spectrum-global-dimension-font-size-200);\\n  --spectrum-alias-heading-xs-margin-top: var(--spectrum-global-dimension-font-size-100);\\n  --spectrum-alias-heading-xxs-margin-top: var(--spectrum-global-dimension-font-size-75);\\n  --spectrum-alias-heading-han-xxxl-text-size: var(--spectrum-global-dimension-font-size-1300);\\n  --spectrum-alias-heading-han-xxl-text-size: var(--spectrum-global-dimension-font-size-900);\\n  --spectrum-alias-heading-han-xl-text-size: var(--spectrum-global-dimension-font-size-800);\\n  --spectrum-alias-heading-han-l-text-size: var(--spectrum-global-dimension-font-size-600);\\n  --spectrum-alias-heading-han-m-text-size: var(--spectrum-global-dimension-font-size-400);\\n  --spectrum-alias-heading-han-s-text-size: var(--spectrum-global-dimension-font-size-300);\\n  --spectrum-alias-heading-han-xs-text-size: var(--spectrum-global-dimension-font-size-200);\\n  --spectrum-alias-heading-han-xxs-text-size: var(--spectrum-global-dimension-font-size-100);\\n  --spectrum-alias-heading-han-xxxl-margin-top: var(--spectrum-global-dimension-font-size-1200);\\n  --spectrum-alias-heading-han-xxl-margin-top: var(--spectrum-global-dimension-font-size-800);\\n  --spectrum-alias-heading-han-xl-margin-top: var(--spectrum-global-dimension-font-size-700);\\n  --spectrum-alias-heading-han-l-margin-top: var(--spectrum-global-dimension-font-size-500);\\n  --spectrum-alias-heading-han-m-margin-top: var(--spectrum-global-dimension-font-size-300);\\n  --spectrum-alias-heading-han-s-margin-top: var(--spectrum-global-dimension-font-size-200);\\n  --spectrum-alias-heading-han-xs-margin-top: var(--spectrum-global-dimension-font-size-100);\\n  --spectrum-alias-heading-han-xxs-margin-top: var(--spectrum-global-dimension-font-size-75);\\n  --spectrum-alias-component-border-radius: var(--spectrum-global-dimension-size-50);\\n  --spectrum-alias-component-border-radius-quiet: var(--spectrum-global-dimension-static-size-0);\\n  --spectrum-alias-component-focusring-gap: var(--spectrum-global-dimension-static-size-0);\\n  --spectrum-alias-component-focusring-gap-emphasized: var(--spectrum-global-dimension-static-size-25);\\n  --spectrum-alias-component-focusring-size: var(--spectrum-global-dimension-static-size-10);\\n  --spectrum-alias-component-focusring-size-emphasized: var(--spectrum-global-dimension-static-size-25);\\n  --spectrum-alias-component-focusring-border-radius: var(--spectrum-global-dimension-size-75);\\n  --spectrum-alias-input-border-size: var(--spectrum-global-dimension-static-size-10);\\n  --spectrum-alias-input-focusring-gap: var(--spectrum-global-dimension-static-size-0);\\n  --spectrum-alias-input-quiet-focusline-gap: var(--spectrum-global-dimension-static-size-10);\\n  --spectrum-alias-control-two-size-m: var(--spectrum-global-dimension-size-175);\\n  --spectrum-alias-control-two-size-l: var(--spectrum-global-dimension-size-200);\\n  --spectrum-alias-control-two-size-xl: var(--spectrum-global-dimension-size-225);\\n  --spectrum-alias-control-two-size-xxl: var(--spectrum-global-dimension-size-250);\\n  --spectrum-alias-control-two-border-radius-s: var(--spectrum-global-dimension-size-75);\\n  --spectrum-alias-control-two-border-radius-m: var(--spectrum-global-dimension-size-85);\\n  --spectrum-alias-control-two-border-radius-l: var(--spectrum-global-dimension-size-100);\\n  --spectrum-alias-control-two-border-radius-xl: var(--spectrum-global-dimension-size-115);\\n  --spectrum-alias-control-two-border-radius-xxl: var(--spectrum-global-dimension-size-125);\\n  --spectrum-alias-control-three-height-m: var(--spectrum-global-dimension-size-175);\\n  --spectrum-alias-control-three-height-l: var(--spectrum-global-dimension-size-200);\\n  --spectrum-alias-control-three-height-xl: var(--spectrum-global-dimension-size-225);\\n  --spectrum-alias-infieldbutton-icon-margin-y-s: var(--spectrum-global-dimension-size-50);\\n  --spectrum-alias-infieldbutton-icon-margin-y-m: var(--spectrum-global-dimension-size-85);\\n  --spectrum-alias-infieldbutton-icon-margin-y-l: var(--spectrum-global-dimension-size-125);\\n  --spectrum-alias-infieldbutton-icon-margin-y-xl: var(--spectrum-global-dimension-size-160);\\n  --spectrum-alias-infieldbutton-border-radius: var(--spectrum-global-dimension-size-50);\\n  --spectrum-alias-infieldbutton-border-radius-sided: 0;\\n  --spectrum-alias-infieldbutton-border-size: var(--spectrum-global-dimension-static-size-10);\\n  --spectrum-alias-infieldbutton-fill-padding-s: var(--spectrum-global-dimension-size-50);\\n  --spectrum-alias-infieldbutton-fill-padding-m: var(--spectrum-global-dimension-size-85);\\n  --spectrum-alias-infieldbutton-fill-padding-l: var(--spectrum-global-dimension-size-125);\\n  --spectrum-alias-infieldbutton-fill-padding-xl: var(--spectrum-global-dimension-size-160);\\n  --spectrum-alias-infieldbutton-padding-s: 0;\\n  --spectrum-alias-infieldbutton-padding-m: 0;\\n  --spectrum-alias-infieldbutton-padding-l: 0;\\n  --spectrum-alias-infieldbutton-padding-xl: 0;\\n  --spectrum-alias-infieldbutton-full-height-s: var(--spectrum-global-dimension-size-300);\\n  --spectrum-alias-infieldbutton-full-height-m: var(--spectrum-global-dimension-size-400);\\n  --spectrum-alias-infieldbutton-full-height-l: var(--spectrum-global-dimension-size-500);\\n  --spectrum-alias-infieldbutton-full-height-xl: var(--spectrum-global-dimension-size-600);\\n  --spectrum-alias-infieldbutton-half-height-s: var(--spectrum-global-dimension-size-150);\\n  --spectrum-alias-infieldbutton-half-height-m: var(--spectrum-global-dimension-size-200);\\n  --spectrum-alias-infieldbutton-half-height-l: var(--spectrum-global-dimension-size-250);\\n  --spectrum-alias-infieldbutton-half-height-xl: var(--spectrum-global-dimension-size-300);\\n  --spectrum-alias-stepperbutton-gap: 0;\\n  --spectrum-alias-stepperbutton-width-s: var(--spectrum-global-dimension-size-225);\\n  --spectrum-alias-stepperbutton-width-m: var(--spectrum-global-dimension-size-300);\\n  --spectrum-alias-stepperbutton-width-l: var(--spectrum-global-dimension-size-400);\\n  --spectrum-alias-stepperbutton-width-xl: var(--spectrum-global-dimension-size-450);\\n  --spectrum-alias-stepperbutton-icon-x-offset-s: var(--spectrum-global-dimension-size-50);\\n  --spectrum-alias-stepperbutton-icon-x-offset-m: var(--spectrum-global-dimension-size-85);\\n  --spectrum-alias-stepperbutton-icon-x-offset-l: var(--spectrum-global-dimension-size-125);\\n  --spectrum-alias-stepperbutton-icon-x-offset-xl: var(--spectrum-global-dimension-size-130);\\n  --spectrum-alias-stepperbutton-icon-y-offset-top-s: var(--spectrum-global-dimension-size-25);\\n  --spectrum-alias-stepperbutton-icon-y-offset-top-m: var(--spectrum-global-dimension-size-50);\\n  --spectrum-alias-stepperbutton-icon-y-offset-top-l: var(--spectrum-global-dimension-size-65);\\n  --spectrum-alias-stepperbutton-icon-y-offset-top-xl: var(--spectrum-global-dimension-size-75);\\n  --spectrum-alias-stepperbutton-icon-y-offset-bottom-s: var(--spectrum-global-dimension-size-10);\\n  --spectrum-alias-stepperbutton-icon-y-offset-bottom-m: var(--spectrum-global-dimension-size-25);\\n  --spectrum-alias-stepperbutton-icon-y-offset-bottom-l: var(--spectrum-global-dimension-size-40);\\n  --spectrum-alias-stepperbutton-icon-y-offset-bottom-xl: var(--spectrum-global-dimension-size-50);\\n  --spectrum-alias-stepperbutton-radius-touching: 0;\\n  --spectrum-alias-clearbutton-icon-margin-s: var(--spectrum-global-dimension-size-100);\\n  --spectrum-alias-clearbutton-icon-margin-m: var(--spectrum-global-dimension-size-150);\\n  --spectrum-alias-clearbutton-icon-margin-l: var(--spectrum-global-dimension-size-185);\\n  --spectrum-alias-clearbutton-icon-margin-xl: var(--spectrum-global-dimension-size-225);\\n  --spectrum-alias-clearbutton-border-radius: var(--spectrum-global-dimension-size-50);\\n  --spectrum-alias-pickerbutton-icononly-padding-x-s: var(--spectrum-global-dimension-size-85);\\n  --spectrum-alias-pickerbutton-icononly-padding-x-m: var(--spectrum-global-dimension-size-125);\\n  --spectrum-alias-pickerbutton-icononly-padding-x-l: var(--spectrum-global-dimension-size-160);\\n  --spectrum-alias-pickerbutton-icononly-padding-x-xl: var(--spectrum-global-dimension-size-200);\\n  --spectrum-alias-pickerbutton-icon-margin-y-s: var(--spectrum-global-dimension-size-85);\\n  --spectrum-alias-pickerbutton-icon-margin-y-m: var(--spectrum-global-dimension-size-125);\\n  --spectrum-alias-pickerbutton-icon-margin-y-l: var(--spectrum-global-dimension-size-160);\\n  --spectrum-alias-pickerbutton-icon-margin-y-xl: var(--spectrum-global-dimension-size-200);\\n  --spectrum-alias-pickerbutton-label-padding-y-s: var(--spectrum-global-dimension-size-50);\\n  --spectrum-alias-pickerbutton-label-padding-y-m: var(--spectrum-global-dimension-size-75);\\n  --spectrum-alias-pickerbutton-label-padding-y-l: var(--spectrum-global-dimension-size-115);\\n  --spectrum-alias-pickerbutton-label-padding-y-xl: var(--spectrum-global-dimension-size-150);\\n  --spectrum-alias-pickerbutton-border-radius-rounded: var(--spectrum-global-dimension-size-50);\\n  --spectrum-alias-pickerbutton-border-radius-rounded-sided: 0;\\n  --spectrum-alias-search-border-radius: var(--spectrum-global-dimension-size-50);\\n  --spectrum-alias-search-border-radius-quiet: 0;\\n  --spectrum-alias-combobox-quiet-button-offset-x: var(--spectrum-global-dimension-size-100);\\n  --spectrum-alias-thumbnail-border-radius-small: var(--spectrum-global-dimension-size-25);\\n  --spectrum-alias-actiongroup-button-gap: var(--spectrum-global-dimension-size-100);\\n  --spectrum-alias-actiongroup-button-gap-compact: var(--spectrum-global-dimension-size-0);\\n  --spectrum-alias-actiongroup-button-gap-quiet: var(--spectrum-global-dimension-size-100);\\n  --spectrum-alias-actiongroup-button-gap-quiet-compact: var(--spectrum-global-dimension-size-25);\\n  --spectrum-alias-search-padding-left-s: var(--spectrum-global-dimension-size-85);\\n  --spectrum-alias-search-padding-left-l: var(--spectrum-global-dimension-size-160);\\n  --spectrum-alias-search-padding-left-xl: var(--spectrum-global-dimension-size-185);\\n  --spectrum-alias-percent-50: 50%;\\n  --spectrum-alias-percent-70: 70%;\\n  --spectrum-alias-percent-100: 100%;\\n  --spectrum-alias-breakpoint-xsmall: 304px;\\n  --spectrum-alias-breakpoint-small: 768px;\\n  --spectrum-alias-breakpoint-medium: 1280px;\\n  --spectrum-alias-breakpoint-large: 1768px;\\n  --spectrum-alias-breakpoint-xlarge: 2160px;\\n  --spectrum-alias-grid-columns: 12;\\n  --spectrum-alias-grid-fluid-width: 100%;\\n  --spectrum-alias-grid-fixed-max-width: 1280px;\\n  --spectrum-alias-border-size-thin: var(--spectrum-global-dimension-static-size-10);\\n  --spectrum-alias-border-size-thick: var(--spectrum-global-dimension-static-size-25);\\n  --spectrum-alias-border-size-thicker: var(--spectrum-global-dimension-static-size-50);\\n  --spectrum-alias-border-size-thickest: var(--spectrum-global-dimension-static-size-100);\\n  --spectrum-alias-border-offset-thin: var(--spectrum-global-dimension-static-size-25);\\n  --spectrum-alias-border-offset-thick: var(--spectrum-global-dimension-static-size-50);\\n  --spectrum-alias-border-offset-thicker: var(--spectrum-global-dimension-static-size-100);\\n  --spectrum-alias-border-offset-thickest: var(--spectrum-global-dimension-static-size-200);\\n  --spectrum-alias-grid-baseline: var(--spectrum-global-dimension-static-size-100);\\n  --spectrum-alias-grid-gutter-xsmall: var(--spectrum-global-dimension-static-size-200);\\n  --spectrum-alias-grid-gutter-small: var(--spectrum-global-dimension-static-size-300);\\n  --spectrum-alias-grid-gutter-medium: var(--spectrum-global-dimension-static-size-400);\\n  --spectrum-alias-grid-gutter-large: var(--spectrum-global-dimension-static-size-500);\\n  --spectrum-alias-grid-gutter-xlarge: var(--spectrum-global-dimension-static-size-600);\\n  --spectrum-alias-grid-margin-xsmall: var(--spectrum-global-dimension-static-size-200);\\n  --spectrum-alias-grid-margin-small: var(--spectrum-global-dimension-static-size-300);\\n  --spectrum-alias-grid-margin-medium: var(--spectrum-global-dimension-static-size-400);\\n  --spectrum-alias-grid-margin-large: var(--spectrum-global-dimension-static-size-500);\\n  --spectrum-alias-grid-margin-xlarge: var(--spectrum-global-dimension-static-size-600);\\n  --spectrum-alias-grid-layout-region-margin-bottom-xsmall: var(--spectrum-global-dimension-static-size-200);\\n  --spectrum-alias-grid-layout-region-margin-bottom-small: var(--spectrum-global-dimension-static-size-300);\\n  --spectrum-alias-grid-layout-region-margin-bottom-medium: var(--spectrum-global-dimension-static-size-400);\\n  --spectrum-alias-grid-layout-region-margin-bottom-large: var(--spectrum-global-dimension-static-size-500);\\n  --spectrum-alias-grid-layout-region-margin-bottom-xlarge: var(--spectrum-global-dimension-static-size-600);\\n  --spectrum-alias-radial-reaction-size-default: var(--spectrum-global-dimension-static-size-550);\\n  --spectrum-alias-focus-ring-gap: var(--spectrum-global-dimension-static-size-25);\\n  --spectrum-alias-focus-ring-size: var(--spectrum-global-dimension-static-size-25);\\n  --spectrum-alias-focus-ring-gap-small: var(--spectrum-global-dimension-static-size-0);\\n  --spectrum-alias-focus-ring-size-small: var(--spectrum-global-dimension-static-size-10);\\n  --spectrum-alias-dropshadow-blur: var(--spectrum-global-dimension-size-50);\\n  --spectrum-alias-dropshadow-offset-y: var(--spectrum-global-dimension-size-10);\\n  --spectrum-alias-font-size-default: var(--spectrum-global-dimension-font-size-100);\\n  --spectrum-alias-layout-label-gap-size: var(--spectrum-global-dimension-size-100);\\n  --spectrum-alias-pill-button-text-size: var(--spectrum-global-dimension-font-size-100);\\n  --spectrum-alias-pill-button-text-baseline: var(--spectrum-global-dimension-static-size-150);\\n  --spectrum-alias-border-radius-xsmall: var(--spectrum-global-dimension-size-10);\\n  --spectrum-alias-border-radius-small: var(--spectrum-global-dimension-size-25);\\n  --spectrum-alias-border-radius-regular: var(--spectrum-global-dimension-size-50);\\n  --spectrum-alias-border-radius-medium: var(--spectrum-global-dimension-size-100);\\n  --spectrum-alias-border-radius-large: var(--spectrum-global-dimension-size-200);\\n  --spectrum-alias-border-radius-xlarge: var(--spectrum-global-dimension-size-300);\\n  --spectrum-alias-single-line-height: var(--spectrum-global-dimension-size-400);\\n  --spectrum-alias-single-line-width: var(--spectrum-global-dimension-size-2400);\\n  --spectrum-alias-workflow-icon-size-s: var(--spectrum-global-dimension-size-200);\\n  --spectrum-alias-workflow-icon-size-m: var(--spectrum-global-dimension-size-225);\\n  --spectrum-alias-workflow-icon-size-xl: var(--spectrum-global-dimension-size-275);\\n  --spectrum-alias-ui-icon-alert-size-75: var(--spectrum-global-dimension-size-200);\\n  --spectrum-alias-ui-icon-alert-size-100: var(--spectrum-global-dimension-size-225);\\n  --spectrum-alias-ui-icon-alert-size-200: var(--spectrum-global-dimension-size-250);\\n  --spectrum-alias-ui-icon-alert-size-300: var(--spectrum-global-dimension-size-275);\\n  --spectrum-alias-ui-icon-triplegripper-size-100-height: var(--spectrum-global-dimension-size-100);\\n  --spectrum-alias-ui-icon-doublegripper-size-100-width: var(--spectrum-global-dimension-size-200);\\n  --spectrum-alias-ui-icon-singlegripper-size-100-width: var(--spectrum-global-dimension-size-300);\\n  --spectrum-alias-ui-icon-cornertriangle-size-75: var(--spectrum-global-dimension-size-65);\\n  --spectrum-alias-ui-icon-cornertriangle-size-200: var(--spectrum-global-dimension-size-75);\\n  --spectrum-alias-ui-icon-asterisk-size-75: var(--spectrum-global-dimension-static-size-100);\\n  --spectrum-alias-ui-icon-asterisk-size-100: var(--spectrum-global-dimension-size-100);\\n  --spectrum-alias-avatar-size-50: var(--spectrum-global-dimension-size-200);\\n  --spectrum-alias-avatar-size-75: var(--spectrum-global-dimension-size-225);\\n  --spectrum-alias-avatar-size-200: var(--spectrum-global-dimension-size-275);\\n  --spectrum-alias-avatar-size-300: var(--spectrum-global-dimension-size-325);\\n  --spectrum-alias-avatar-size-500: var(--spectrum-global-dimension-size-400);\\n  --spectrum-alias-avatar-size-700: var(--spectrum-global-dimension-size-500);\\n  --spectrum-alias-avatar-border-size: var(--spectrum-global-dimension-size-0);\\n  --spectrum-alias-tag-border-radius: var(--spectrum-global-dimension-size-50);\\n  --spectrum-alias-tag-border-size-default: var(--spectrum-global-dimension-static-size-10);\\n  --spectrum-alias-tag-border-size-key-focus: var(--spectrum-global-dimension-static-size-25);\\n  --spectrum-alias-tag-border-size-disabled: var(--spectrum-global-dimension-size-0);\\n  --spectrum-alias-tag-border-size: var(--spectrum-global-dimension-static-size-10);\\n  --spectrum-alias-tag-padding-right-s: var(--spectrum-global-dimension-size-115);\\n  --spectrum-alias-tag-padding-right-m: var(--spectrum-global-dimension-size-150);\\n  --spectrum-alias-tag-padding-right-l: var(--spectrum-global-dimension-size-185);\\n  --spectrum-alias-tag-height-s: var(--spectrum-global-dimension-size-300);\\n  --spectrum-alias-tag-height-m: var(--spectrum-global-dimension-size-400);\\n  --spectrum-alias-tag-height-l: var(--spectrum-global-dimension-size-500);\\n  --spectrum-alias-tag-font-size-s: var(--spectrum-global-dimension-font-size-75);\\n  --spectrum-alias-tag-font-size-m: var(--spectrum-global-dimension-font-size-100);\\n  --spectrum-alias-tag-font-size-l: var(--spectrum-global-dimension-font-size-200);\\n  --spectrum-alias-tag-text-padding-top-s: var(--spectrum-global-dimension-size-50);\\n  --spectrum-alias-tag-text-padding-top-m: var(--spectrum-global-dimension-size-75);\\n  --spectrum-alias-tag-text-padding-top-l: var(--spectrum-global-dimension-size-115);\\n  --spectrum-alias-tag-icon-size-s: var(--spectrum-global-dimension-size-200);\\n  --spectrum-alias-tag-icon-size-m: var(--spectrum-global-dimension-size-225);\\n  --spectrum-alias-tag-icon-margin-top-s: var(--spectrum-global-dimension-size-50);\\n  --spectrum-alias-tag-icon-margin-top-m: var(--spectrum-global-dimension-size-85);\\n  --spectrum-alias-tag-icon-margin-top-l: var(--spectrum-global-dimension-size-125);\\n  --spectrum-alias-tag-icon-margin-right-s: var(--spectrum-global-dimension-size-85);\\n  --spectrum-alias-tag-icon-margin-right-m: var(--spectrum-global-dimension-size-100);\\n  --spectrum-alias-tag-icon-margin-right-l: var(--spectrum-global-dimension-size-115);\\n  --spectrum-alias-tag-clearbutton-width-s: var(--spectrum-global-dimension-size-300);\\n  --spectrum-alias-tag-clearbutton-width-m: var(--spectrum-global-dimension-size-400);\\n  --spectrum-alias-tag-clearbutton-width-l: var(--spectrum-global-dimension-size-500);\\n  --spectrum-alias-tag-clearbutton-icon-margin-s: var(--spectrum-global-dimension-size-100);\\n  --spectrum-alias-tag-clearbutton-icon-margin-m: var(--spectrum-global-dimension-size-150);\\n  --spectrum-alias-tag-clearbutton-icon-margin-l: var(--spectrum-global-dimension-size-185);\\n  --spectrum-alias-tag-focusring-border-radius: var(--spectrum-global-dimension-size-75);\\n  --spectrum-alias-tag-focusring-size: var(--spectrum-global-dimension-size-25);\\n  --spectrum-alias-tag-focusring-gap: var(--spectrum-global-dimension-static-size-0);\\n  --spectrum-alias-tag-focusring-gap-selected: var(--spectrum-global-dimension-size-25);\\n  --spectrum-alias-colorloupe-width: var(--spectrum-global-dimension-static-size-600);\\n  --spectrum-alias-colorloupe-height: var(--spectrum-global-dimension-static-size-800);\\n}\\n\\n.spectrum--darkest,\\n.spectrum--dark,\\n.spectrum--light,\\n.spectrum--lightest {\\n  /* spectrum-colorAliases.css */\\n  --spectrum-alias-colorhandle-outer-border-color: rgba(0,0,0,0.42);\\n  --spectrum-alias-transparent-blue-background-color-hover: rgba(13,102,208,0.15);\\n  --spectrum-alias-transparent-blue-background-color-down: rgba(9,90,186,0.3);\\n  --spectrum-alias-transparent-blue-background-color-key-focus: var(--spectrum-alias-transparent-blue-background-color-hover);\\n  --spectrum-alias-transparent-blue-background-color-mouse-focus: var(--spectrum-alias-transparent-blue-background-color-hover);\\n  --spectrum-alias-transparent-blue-background-color: var(--spectrum-alias-component-text-color-default);\\n  --spectrum-alias-transparent-red-background-color-hover: rgba(201,37,45,0.15);\\n  --spectrum-alias-transparent-red-background-color-down: rgba(187,18,26,0.3);\\n  --spectrum-alias-transparent-red-background-color-key-focus: var(--spectrum-alias-transparent-red-background-color-hover);\\n  --spectrum-alias-transparent-red-background-color-mouse-focus: var(--spectrum-alias-transparent-red-background-color-hover);\\n  --spectrum-alias-transparent-red-background-color: var(--spectrum-alias-component-text-color-default);\\n  --spectrum-alias-component-text-color-disabled: var(--spectrum-global-color-gray-500);\\n  --spectrum-alias-component-text-color-default: var(--spectrum-global-color-gray-800);\\n  --spectrum-alias-component-text-color-hover: var(--spectrum-global-color-gray-900);\\n  --spectrum-alias-component-text-color-down: var(--spectrum-global-color-gray-900);\\n  --spectrum-alias-component-text-color-key-focus: var(--spectrum-alias-component-text-color-hover);\\n  --spectrum-alias-component-text-color-mouse-focus: var(--spectrum-alias-component-text-color-hover);\\n  --spectrum-alias-component-text-color: var(--spectrum-alias-component-text-color-default);\\n  --spectrum-alias-component-text-color-selected-default: var(--spectrum-alias-component-text-color-default);\\n  --spectrum-alias-component-text-color-selected-hover: var(--spectrum-alias-component-text-color-hover);\\n  --spectrum-alias-component-text-color-selected-down: var(--spectrum-alias-component-text-color-down);\\n  --spectrum-alias-component-text-color-selected-key-focus: var(--spectrum-alias-component-text-color-key-focus);\\n  --spectrum-alias-component-text-color-selected-mouse-focus: var(--spectrum-alias-component-text-color-mouse-focus);\\n  --spectrum-alias-component-text-color-selected: var(--spectrum-alias-component-text-color-selected-default);\\n  --spectrum-alias-component-text-color-emphasized-selected-default: var(--spectrum-global-color-static-white);\\n  --spectrum-alias-component-text-color-emphasized-selected-hover: var(--spectrum-alias-component-text-color-emphasized-selected-default);\\n  --spectrum-alias-component-text-color-emphasized-selected-down: var(--spectrum-alias-component-text-color-emphasized-selected-default);\\n  --spectrum-alias-component-text-color-emphasized-selected-key-focus: var(--spectrum-alias-component-text-color-emphasized-selected-default);\\n  --spectrum-alias-component-text-color-emphasized-selected-mouse-focus: var(--spectrum-alias-component-text-color-emphasized-selected-default);\\n  --spectrum-alias-component-text-color-emphasized-selected: var(--spectrum-alias-component-text-color-emphasized-selected-default);\\n  --spectrum-alias-component-text-color-error-default: var(--spectrum-semantic-negative-text-color-small);\\n  --spectrum-alias-component-text-color-error-hover: var(--spectrum-semantic-negative-text-color-small-hover);\\n  --spectrum-alias-component-text-color-error-down: var(--spectrum-semantic-negative-text-color-small-down);\\n  --spectrum-alias-component-text-color-error-key-focus: var(--spectrum-semantic-negative-text-color-small-key-focus);\\n  --spectrum-alias-component-text-color-error-mouse-focus: var(--spectrum-semantic-negative-text-color-small-key-focus);\\n  --spectrum-alias-component-text-color-error: var(--spectrum-alias-component-text-color-error-default);\\n  --spectrum-alias-component-icon-color-disabled: var(--spectrum-alias-icon-color-disabled);\\n  --spectrum-alias-component-icon-color-default: var(--spectrum-alias-icon-color);\\n  --spectrum-alias-component-icon-color-hover: var(--spectrum-alias-icon-color-hover);\\n  --spectrum-alias-component-icon-color-down: var(--spectrum-alias-icon-color-down);\\n  --spectrum-alias-component-icon-color-key-focus: var(--spectrum-alias-icon-color-hover);\\n  --spectrum-alias-component-icon-color-mouse-focus: var(--spectrum-alias-icon-color-down);\\n  --spectrum-alias-component-icon-color: var(--spectrum-alias-component-icon-color-default);\\n  --spectrum-alias-component-icon-color-selected: var(--spectrum-alias-icon-color-selected-neutral-subdued);\\n  --spectrum-alias-component-icon-color-emphasized-selected-default: var(--spectrum-global-color-static-white);\\n  --spectrum-alias-component-icon-color-emphasized-selected-hover: var(--spectrum-alias-component-icon-color-emphasized-selected-default);\\n  --spectrum-alias-component-icon-color-emphasized-selected-down: var(--spectrum-alias-component-icon-color-emphasized-selected-default);\\n  --spectrum-alias-component-icon-color-emphasized-selected-key-focus: var(--spectrum-alias-component-icon-color-emphasized-selected-default);\\n  --spectrum-alias-component-icon-color-emphasized-selected: var(--spectrum-alias-component-icon-color-emphasized-selected-default);\\n  --spectrum-alias-component-background-color-disabled: var(--spectrum-global-color-gray-200);\\n  --spectrum-alias-component-background-color-quiet-disabled: var(--spectrum-alias-background-color-transparent);\\n  --spectrum-alias-component-background-color-quiet-selected-disabled: var(--spectrum-alias-component-background-color-disabled);\\n  --spectrum-alias-component-background-color-default: var(--spectrum-global-color-gray-75);\\n  --spectrum-alias-component-background-color-hover: var(--spectrum-global-color-gray-50);\\n  --spectrum-alias-component-background-color-down: var(--spectrum-global-color-gray-200);\\n  --spectrum-alias-component-background-color-key-focus: var(--spectrum-global-color-gray-50);\\n  --spectrum-alias-component-background-color: var(--spectrum-alias-component-background-color-default);\\n  --spectrum-alias-component-background-color-selected-default: var(--spectrum-global-color-gray-200);\\n  --spectrum-alias-component-background-color-selected-hover: var(--spectrum-global-color-gray-200);\\n  --spectrum-alias-component-background-color-selected-down: var(--spectrum-global-color-gray-200);\\n  --spectrum-alias-component-background-color-selected-key-focus: var(--spectrum-global-color-gray-200);\\n  --spectrum-alias-component-background-color-selected: var(--spectrum-alias-component-background-color-selected-default);\\n  --spectrum-alias-component-background-color-quiet-default: var(--spectrum-alias-background-color-transparent);\\n  --spectrum-alias-component-background-color-quiet-hover: var(--spectrum-alias-background-color-transparent);\\n  --spectrum-alias-component-background-color-quiet-down: var(--spectrum-global-color-gray-300);\\n  --spectrum-alias-component-background-color-quiet-key-focus: var(--spectrum-alias-background-color-transparent);\\n  --spectrum-alias-component-background-color-quiet: var(--spectrum-alias-component-background-color-quiet-default);\\n  --spectrum-alias-component-background-color-quiet-selected-default: var(--spectrum-alias-component-background-color-selected-default);\\n  --spectrum-alias-component-background-color-quiet-selected-hover: var(--spectrum-alias-component-background-color-selected-hover);\\n  --spectrum-alias-component-background-color-quiet-selected-down: var(--spectrum-alias-component-background-color-selected-down);\\n  --spectrum-alias-component-background-color-quiet-selected-key-focus: var(--spectrum-alias-component-background-color-selected-key-focus);\\n  --spectrum-alias-component-background-color-quiet-selected: var(--spectrum-alias-component-background-color-selected-default);\\n  --spectrum-alias-component-background-color-emphasized-selected-default: var(--spectrum-semantic-cta-background-color-default);\\n  --spectrum-alias-component-background-color-emphasized-selected-hover: var(--spectrum-semantic-cta-background-color-hover);\\n  --spectrum-alias-component-background-color-emphasized-selected-down: var(--spectrum-semantic-cta-background-color-down);\\n  --spectrum-alias-component-background-color-emphasized-selected-key-focus: var(--spectrum-semantic-cta-background-color-key-focus);\\n  --spectrum-alias-component-background-color-emphasized-selected: var(--spectrum-alias-component-background-color-emphasized-selected-default);\\n  --spectrum-alias-component-border-color-disabled: var(--spectrum-alias-border-color-disabled);\\n  --spectrum-alias-component-border-color-quiet-disabled: var(--spectrum-alias-border-color-transparent);\\n  --spectrum-alias-component-border-color-default: var(--spectrum-alias-border-color);\\n  --spectrum-alias-component-border-color-hover: var(--spectrum-alias-border-color-hover);\\n  --spectrum-alias-component-border-color-down: var(--spectrum-alias-border-color-down);\\n  --spectrum-alias-component-border-color-key-focus: var(--spectrum-alias-border-color-key-focus);\\n  --spectrum-alias-component-border-color: var(--spectrum-alias-component-border-color-default);\\n  --spectrum-alias-component-border-color-selected-default: var(--spectrum-alias-border-color);\\n  --spectrum-alias-component-border-color-selected-hover: var(--spectrum-alias-border-color-hover);\\n  --spectrum-alias-component-border-color-selected-down: var(--spectrum-alias-border-color-down);\\n  --spectrum-alias-component-border-color-selected-key-focus: var(--spectrum-alias-border-color-key-focus);\\n  --spectrum-alias-component-border-color-selected: var(--spectrum-alias-component-border-color-selected-default);\\n  --spectrum-alias-component-border-color-quiet-default: var(--spectrum-alias-border-color-transparent);\\n  --spectrum-alias-component-border-color-quiet-hover: var(--spectrum-alias-border-color-transparent);\\n  --spectrum-alias-component-border-color-quiet-down: var(--spectrum-alias-border-color-transparent);\\n  --spectrum-alias-component-border-color-quiet-key-focus: var(--spectrum-alias-border-color-key-focus);\\n  --spectrum-alias-component-border-color-quiet: var(--spectrum-alias-component-border-color-quiet-default);\\n  --spectrum-alias-component-border-color-quiet-selected-default: var(--spectrum-global-color-gray-200);\\n  --spectrum-alias-component-border-color-quiet-selected-hover: var(--spectrum-global-color-gray-200);\\n  --spectrum-alias-component-border-color-quiet-selected-down: var(--spectrum-global-color-gray-200);\\n  --spectrum-alias-component-border-color-quiet-selected-key-focus: var(--spectrum-alias-border-color-key-focus);\\n  --spectrum-alias-component-border-color-quiet-selected: var(--spectrum-alias-component-border-color-quiet-selected-default);\\n  --spectrum-alias-component-border-color-emphasized-selected-default: var(--spectrum-semantic-cta-background-color-default);\\n  --spectrum-alias-component-border-color-emphasized-selected-hover: var(--spectrum-semantic-cta-background-color-hover);\\n  --spectrum-alias-component-border-color-emphasized-selected-down: var(--spectrum-semantic-cta-background-color-down);\\n  --spectrum-alias-component-border-color-emphasized-selected-key-focus: var(--spectrum-semantic-cta-background-color-key-focus);\\n  --spectrum-alias-component-border-color-emphasized-selected: var(--spectrum-alias-component-border-color-emphasized-selected-default);\\n  --spectrum-alias-tag-border-color-default: var(--spectrum-alias-border-color-darker-default);\\n  --spectrum-alias-tag-border-color-hover: var(--spectrum-alias-border-color-darker-hover);\\n  --spectrum-alias-tag-border-color-down: var(--spectrum-alias-border-color-darker-hover);\\n  --spectrum-alias-tag-border-color-key-focus: var(--spectrum-alias-border-color-key-focus);\\n  --spectrum-alias-tag-border-color-error-default: var(--spectrum-semantic-negative-color-default);\\n  --spectrum-alias-tag-border-color-error-hover: var(--spectrum-semantic-negative-color-hover);\\n  --spectrum-alias-tag-border-color-error-down: var(--spectrum-semantic-negative-color-hover);\\n  --spectrum-alias-tag-border-color-error-key-focus: var(--spectrum-alias-border-color-key-focus);\\n  --spectrum-alias-tag-border-color-error-selected: var(--spectrum-semantic-negative-color-default);\\n  --spectrum-alias-tag-border-color-selected: var(--spectrum-alias-tag-background-color-selected-default);\\n  --spectrum-alias-tag-border-color: var(--spectrum-alias-tag-border-color-default);\\n  --spectrum-alias-tag-border-color-disabled: var(--spectrum-alias-border-color-disabled);\\n  --spectrum-alias-tag-border-color-error: var(--spectrum-alias-tag-border-color-error-default);\\n  --spectrum-alias-tag-text-color-default: var(--spectrum-alias-label-text-color);\\n  --spectrum-alias-tag-text-color-hover: var(--spectrum-alias-text-color-hover);\\n  --spectrum-alias-tag-text-color-down: var(--spectrum-alias-text-color-down);\\n  --spectrum-alias-tag-text-color-key-focus: var(--spectrum-alias-text-color-hover);\\n  --spectrum-alias-tag-text-color-disabled: var(--spectrum-global-color-gray-500);\\n  --spectrum-alias-tag-text-color: var(--spectrum-alias-tag-text-color-default);\\n  --spectrum-alias-tag-text-color-error-default: var(--spectrum-global-color-red-600);\\n  --spectrum-alias-tag-text-color-error-hover: var(--spectrum-global-color-red-700);\\n  --spectrum-alias-tag-text-color-error-down: var(--spectrum-global-color-red-700);\\n  --spectrum-alias-tag-text-color-error-key-focus: var(--spectrum-global-color-red-700);\\n  --spectrum-alias-tag-text-color-error: var(--spectrum-alias-tag-text-color-error-default);\\n  --spectrum-alias-tag-text-color-selected: var(--spectrum-global-color-gray-50);\\n  --spectrum-alias-tag-icon-color-default: var(--spectrum-alias-icon-color);\\n  --spectrum-alias-tag-icon-color-hover: var(--spectrum-alias-icon-color-hover);\\n  --spectrum-alias-tag-icon-color-down: var(--spectrum-alias-icon-color-down);\\n  --spectrum-alias-tag-icon-color-key-focus: var(--spectrum-alias-icon-color-hover);\\n  --spectrum-alias-tag-icon-color-disabled: var(--spectrum-alias-icon-color-disabled);\\n  --spectrum-alias-tag-icon-color: var(--spectrum-alias-tag-icon-color-default);\\n  --spectrum-alias-tag-icon-color-error: var(--spectrum-global-color-red-600);\\n  --spectrum-alias-tag-icon-color-selected: var(--spectrum-global-color-gray-50);\\n  --spectrum-alias-tag-background-color-disabled: var(--spectrum-global-color-gray-200);\\n  --spectrum-alias-tag-background-color-default: var(--spectrum-global-color-gray-50);\\n  --spectrum-alias-tag-background-color-hover: var(--spectrum-global-color-gray-50);\\n  --spectrum-alias-tag-background-color-down: var(--spectrum-global-color-gray-200);\\n  --spectrum-alias-tag-background-color-key-focus: var(--spectrum-global-color-gray-50);\\n  --spectrum-alias-tag-background-color: var(--spectrum-alias-tag-background-color-default);\\n  --spectrum-alias-tag-background-color-error-default: var(--spectrum-global-color-gray-50);\\n  --spectrum-alias-tag-background-color-error-hover: var(--spectrum-global-color-gray-50);\\n  --spectrum-alias-tag-background-color-error-down: var(--spectrum-global-color-gray-200);\\n  --spectrum-alias-tag-background-color-error-key-focus: var(--spectrum-global-color-gray-50);\\n  --spectrum-alias-tag-background-color-error: var(--spectrum-alias-tag-background-color-error-default);\\n  --spectrum-alias-tag-background-color-error-selected-default: var(--spectrum-semantic-negative-color-default);\\n  --spectrum-alias-tag-background-color-error-selected-hover: var(--spectrum-semantic-negative-color-hover);\\n  --spectrum-alias-tag-background-color-error-selected-down: var(--spectrum-semantic-negative-color-hover);\\n  --spectrum-alias-tag-background-color-error-selected-key-focus: var(--spectrum-global-color-red-600);\\n  --spectrum-alias-tag-background-color-error-selected: var(--spectrum-alias-tag-background-color-error-selected-default);\\n  --spectrum-alias-tag-background-color-selected-default: var(--spectrum-global-color-gray-700);\\n  --spectrum-alias-tag-background-color-selected-hover: var(--spectrum-global-color-gray-800);\\n  --spectrum-alias-tag-background-color-selected-down: var(--spectrum-global-color-gray-900);\\n  --spectrum-alias-tag-background-color-selected-key-focus: var(--spectrum-global-color-gray-900);\\n  --spectrum-alias-tag-background-color-selected: var(--spectrum-alias-tag-background-color-selected-default);\\n  --spectrum-alias-tag-focusring-border-color-default: transparent;\\n  --spectrum-alias-tag-focusring-border-color-key-focus: transparent;\\n  --spectrum-alias-tag-focusring-border-color-disabled: transparent;\\n  --spectrum-alias-tag-focusring-border-color-selected-key-focus: var(--spectrum-alias-focus-ring-color);\\n  --spectrum-alias-tag-focusring-border-color: var(--spectrum-alias-tag-focusring-border-color-default);\\n  --spectrum-alias-avatar-border-color-default: var(--spectrum-alias-background-color-transparent);\\n  --spectrum-alias-avatar-border-color-hover: var(--spectrum-alias-background-color-transparent);\\n  --spectrum-alias-avatar-border-color-down: var(--spectrum-alias-background-color-transparent);\\n  --spectrum-alias-avatar-border-color-key-focus: var(--spectrum-alias-background-color-transparent);\\n  --spectrum-alias-avatar-border-color: var(--spectrum-alias-avatar-border-color-default);\\n  --spectrum-alias-avatar-border-color-disabled: var(--spectrum-alias-background-color-transparent);\\n  --spectrum-alias-avatar-border-color-selected-default: var(--spectrum-alias-background-color-transparent);\\n  --spectrum-alias-avatar-border-color-selected-hover: var(--spectrum-alias-background-color-transparent);\\n  --spectrum-alias-avatar-border-color-selected-down: var(--spectrum-alias-background-color-transparent);\\n  --spectrum-alias-avatar-border-color-selected-key-focus: var(--spectrum-alias-background-color-transparent);\\n  --spectrum-alias-avatar-border-color-selected: var(--spectrum-alias-avatar-border-color-selected-default);\\n  --spectrum-alias-avatar-border-color-selected-disabled: var(--spectrum-alias-background-color-transparent);\\n  --spectrum-alias-toggle-background-color-default: var(--spectrum-global-color-gray-700);\\n  --spectrum-alias-toggle-background-color-hover: var(--spectrum-global-color-gray-800);\\n  --spectrum-alias-toggle-background-color-down: var(--spectrum-global-color-gray-900);\\n  --spectrum-alias-toggle-background-color-key-focus: var(--spectrum-global-color-gray-800);\\n  --spectrum-alias-toggle-background-color: var(--spectrum-alias-toggle-background-color-default);\\n  --spectrum-alias-toggle-background-color-emphasized-selected-default: var(--spectrum-semantic-cta-background-color-default);\\n  --spectrum-alias-toggle-background-color-emphasized-selected-hover: var(--spectrum-semantic-cta-background-color-hover);\\n  --spectrum-alias-toggle-background-color-emphasized-selected-down: var(--spectrum-semantic-cta-background-color-down);\\n  --spectrum-alias-toggle-background-color-emphasized-selected-key-focus: var(--spectrum-semantic-cta-background-color-key-focus);\\n  --spectrum-alias-toggle-background-color-emphasized-selected: var(--spectrum-alias-toggle-background-color-emphasized-selected-default);\\n  --spectrum-alias-toggle-border-color-default: var(--spectrum-global-color-gray-700);\\n  --spectrum-alias-toggle-border-color-hover: var(--spectrum-global-color-gray-800);\\n  --spectrum-alias-toggle-border-color-down: var(--spectrum-global-color-gray-900);\\n  --spectrum-alias-toggle-border-color-key-focus: var(--spectrum-global-color-gray-800);\\n  --spectrum-alias-toggle-border-color: var(--spectrum-alias-toggle-border-color-default);\\n  --spectrum-alias-toggle-icon-color-selected: var(--spectrum-global-color-gray-75);\\n  --spectrum-alias-toggle-icon-color-emphasized-selected: var(--spectrum-alias-component-icon-color-emphasized-selected-default);\\n  --spectrum-alias-button-primary-background-color-default: var(--spectrum-alias-background-color-transparent);\\n  --spectrum-alias-button-primary-background-color-hover: var(--spectrum-global-color-gray-800);\\n  --spectrum-alias-button-primary-background-color-down: var(--spectrum-global-color-gray-900);\\n  --spectrum-alias-button-primary-background-color-key-focus: var(--spectrum-global-color-gray-800);\\n  --spectrum-alias-button-primary-background-color: var(--spectrum-alias-button-primary-background-color-default);\\n  --spectrum-alias-button-primary-border-color-default: var(--spectrum-global-color-gray-800);\\n  --spectrum-alias-button-primary-border-color-hover: var(--spectrum-alias-button-primary-background-color-hover);\\n  --spectrum-alias-button-primary-border-color-down: var(--spectrum-alias-button-primary-background-color-down);\\n  --spectrum-alias-button-primary-border-color-key-focus: var(--spectrum-alias-button-primary-background-color-key-focus);\\n  --spectrum-alias-button-primary-border-color: var(--spectrum-alias-button-primary-border-color-default);\\n  --spectrum-alias-button-primary-text-color-default: var(--spectrum-global-color-gray-800);\\n  --spectrum-alias-button-primary-text-color-hover: var(--spectrum-global-color-gray-50);\\n  --spectrum-alias-button-primary-text-color-down: var(--spectrum-global-color-gray-50);\\n  --spectrum-alias-button-primary-text-color-key-focus: var(--spectrum-global-color-gray-50);\\n  --spectrum-alias-button-primary-text-color: var(--spectrum-alias-button-primary-text-color-default);\\n  --spectrum-alias-button-primary-icon-color-default: var(--spectrum-alias-button-primary-text-color-default);\\n  --spectrum-alias-button-primary-icon-color-hover: var(--spectrum-alias-button-primary-text-color-hover);\\n  --spectrum-alias-button-primary-icon-color-down: var(--spectrum-alias-button-primary-text-color-down);\\n  --spectrum-alias-button-primary-icon-color-key-focus: var(--spectrum-alias-button-primary-text-color-key-focus);\\n  --spectrum-alias-button-primary-icon-color: var(--spectrum-alias-button-primary-icon-color-default);\\n  --spectrum-alias-button-secondary-background-color-default: var(--spectrum-alias-background-color-transparent);\\n  --spectrum-alias-button-secondary-background-color-hover: var(--spectrum-global-color-gray-700);\\n  --spectrum-alias-button-secondary-background-color-down: var(--spectrum-global-color-gray-800);\\n  --spectrum-alias-button-secondary-background-color-key-focus: var(--spectrum-global-color-gray-700);\\n  --spectrum-alias-button-secondary-background-color: var(--spectrum-alias-button-secondary-background-color-default);\\n  --spectrum-alias-button-secondary-border-color-default: var(--spectrum-global-color-gray-700);\\n  --spectrum-alias-button-secondary-border-color-hover: var(--spectrum-alias-button-secondary-background-color-hover);\\n  --spectrum-alias-button-secondary-border-color-down: var(--spectrum-alias-button-secondary-background-color-down);\\n  --spectrum-alias-button-secondary-border-color-key-focus: var(--spectrum-alias-button-secondary-background-color-key-focus);\\n  --spectrum-alias-button-secondary-border-color: var(--spectrum-alias-button-secondary-border-color-default);\\n  --spectrum-alias-button-secondary-text-color-default: var(--spectrum-global-color-gray-700);\\n  --spectrum-alias-button-secondary-text-color-hover: var(--spectrum-global-color-gray-50);\\n  --spectrum-alias-button-secondary-text-color-down: var(--spectrum-global-color-gray-50);\\n  --spectrum-alias-button-secondary-text-color-key-focus: var(--spectrum-global-color-gray-50);\\n  --spectrum-alias-button-secondary-text-color: var(--spectrum-alias-button-secondary-text-color-default);\\n  --spectrum-alias-button-secondary-icon-color-default: var(--spectrum-alias-button-secondary-text-color-default);\\n  --spectrum-alias-button-secondary-icon-color-hover: var(--spectrum-alias-button-secondary-text-color-hover);\\n  --spectrum-alias-button-secondary-icon-color-down: var(--spectrum-alias-button-secondary-text-color-down);\\n  --spectrum-alias-button-secondary-icon-color-key-focus: var(--spectrum-alias-button-secondary-text-color-key-focus);\\n  --spectrum-alias-button-secondary-icon-color: var(--spectrum-alias-button-secondary-icon-color-default);\\n  --spectrum-alias-button-negative-background-color-default: var(--spectrum-alias-background-color-transparent);\\n  --spectrum-alias-button-negative-background-color-hover: var(--spectrum-semantic-negative-text-color-small);\\n  --spectrum-alias-button-negative-background-color-down: var(--spectrum-global-color-red-700);\\n  --spectrum-alias-button-negative-background-color-key-focus: var(--spectrum-semantic-negative-text-color-small);\\n  --spectrum-alias-button-negative-background-color: var(--spectrum-alias-button-negative-background-color-default);\\n  --spectrum-alias-button-negative-border-color-default: var(--spectrum-semantic-negative-text-color-small);\\n  --spectrum-alias-button-negative-border-color-hover: var(--spectrum-semantic-negative-text-color-small);\\n  --spectrum-alias-button-negative-border-color-down: var(--spectrum-global-color-red-700);\\n  --spectrum-alias-button-negative-border-color-key-focus: var(--spectrum-semantic-negative-text-color-small);\\n  --spectrum-alias-button-negative-border-color: var(--spectrum-alias-button-negative-border-color-default);\\n  --spectrum-alias-button-negative-text-color-default: var(--spectrum-semantic-negative-text-color-small);\\n  --spectrum-alias-button-negative-text-color-hover: var(--spectrum-global-color-gray-50);\\n  --spectrum-alias-button-negative-text-color-down: var(--spectrum-global-color-gray-50);\\n  --spectrum-alias-button-negative-text-color-key-focus: var(--spectrum-global-color-gray-50);\\n  --spectrum-alias-button-negative-text-color: var(--spectrum-alias-button-negative-text-color-default);\\n  --spectrum-alias-button-negative-icon-color-default: var(--spectrum-alias-button-negative-text-color-default);\\n  --spectrum-alias-button-negative-icon-color-hover: var(--spectrum-alias-button-negative-text-color-hover);\\n  --spectrum-alias-button-negative-icon-color-down: var(--spectrum-alias-button-negative-text-color-down);\\n  --spectrum-alias-button-negative-icon-color-key-focus: var(--spectrum-alias-button-negative-text-color-key-focus);\\n  --spectrum-alias-button-negative-icon-color: var(--spectrum-alias-button-negative-icon-color-default);\\n  --spectrum-alias-input-border-color-disabled: var(--spectrum-alias-border-color-transparent);\\n  --spectrum-alias-input-border-color-quiet-disabled: var(--spectrum-alias-border-color-mid);\\n  --spectrum-alias-input-border-color-default: var(--spectrum-alias-border-color);\\n  --spectrum-alias-input-border-color-hover: var(--spectrum-alias-border-color-hover);\\n  --spectrum-alias-input-border-color-down: var(--spectrum-alias-border-color-mouse-focus);\\n  --spectrum-alias-input-border-color-mouse-focus: var(--spectrum-alias-border-color-mouse-focus);\\n  --spectrum-alias-input-border-color-key-focus: var(--spectrum-alias-border-color-key-focus);\\n  --spectrum-alias-input-border-color: var(--spectrum-alias-input-border-color-default);\\n  --spectrum-alias-input-border-color-invalid-default: var(--spectrum-semantic-negative-color-default);\\n  --spectrum-alias-input-border-color-invalid-hover: var(--spectrum-semantic-negative-color-hover);\\n  --spectrum-alias-input-border-color-invalid-down: var(--spectrum-semantic-negative-color-down);\\n  --spectrum-alias-input-border-color-invalid-mouse-focus: var(--spectrum-semantic-negative-color-hover);\\n  --spectrum-alias-input-border-color-invalid-key-focus: var(--spectrum-alias-border-color-key-focus);\\n  --spectrum-alias-input-border-color-invalid: var(--spectrum-alias-input-border-color-invalid-default);\\n  --spectrum-alias-background-color-yellow-default: var(--spectrum-global-color-static-yellow-600);\\n  --spectrum-alias-background-color-yellow-hover: var(--spectrum-global-color-static-yellow-700);\\n  --spectrum-alias-background-color-yellow-key-focus: var(--spectrum-global-color-static-yellow-700);\\n  --spectrum-alias-background-color-yellow-down: var(--spectrum-global-color-static-yellow-800);\\n  --spectrum-alias-background-color-yellow: var(--spectrum-alias-background-color-yellow-default);\\n  --spectrum-alias-infieldbutton-background-color: var(--spectrum-global-color-gray-200);\\n  --spectrum-alias-infieldbutton-fill-loudnessLow-border-color-disabled: transparent;\\n  --spectrum-alias-infieldbutton-fill-loudnessMedium-border-color-disabled: transparent;\\n  --spectrum-alias-infieldbutton-fill-loudnessHigh-border-color-disabled: var(--spectrum-alias-component-background-color-disabled);\\n  --spectrum-alias-infieldbutton-fill-border-color-default: var(--spectrum-alias-input-border-color-default);\\n  --spectrum-alias-infieldbutton-fill-border-color-hover: var(--spectrum-alias-input-border-color-hover);\\n  --spectrum-alias-infieldbutton-fill-border-color-down: var(--spectrum-alias-input-border-color-down);\\n  --spectrum-alias-infieldbutton-fill-border-color-mouse-focus: var(--spectrum-alias-input-border-color-mouse-focus);\\n  --spectrum-alias-infieldbutton-fill-border-color-key-focus: var(--spectrum-alias-input-border-color-key-focus);\\n  --spectrum-alias-infieldbutton-fill-loudnessLow-background-color-default: transparent;\\n  --spectrum-alias-infieldbutton-fill-loudnessLow-background-color-hover: transparent;\\n  --spectrum-alias-infieldbutton-fill-loudnessLow-background-color-down: transparent;\\n  --spectrum-alias-infieldbutton-fill-loudnessLow-background-color-key-focus: transparent;\\n  --spectrum-alias-infieldbutton-fill-loudnessLow-background-color-disabled: transparent;\\n  --spectrum-alias-infieldbutton-fill-loudnessMedium-background-color-default: var(--spectrum-alias-infieldbutton-fill-loudnessLow-background-color-default);\\n  --spectrum-alias-infieldbutton-fill-loudnessMedium-background-color-hover: var(--spectrum-alias-infieldbutton-fill-loudnessLow-background-color-hover);\\n  --spectrum-alias-infieldbutton-fill-loudnessMedium-background-color-down: var(--spectrum-alias-infieldbutton-fill-loudnessLow-background-color-down);\\n  --spectrum-alias-infieldbutton-fill-loudnessMedium-background-color-key-focus: var(--spectrum-alias-infieldbutton-fill-loudnessLow-background-color-key-focus);\\n  --spectrum-alias-infieldbutton-fill-loudnessMedium-background-color-disabled: transparent;\\n  --spectrum-alias-infieldbutton-fill-loudnessHigh-background-color-default: var(--spectrum-alias-component-background-color-default);\\n  --spectrum-alias-infieldbutton-fill-loudnessHigh-background-color-hover: var(--spectrum-alias-component-background-color-hover);\\n  --spectrum-alias-infieldbutton-fill-loudnessHigh-background-color-down: var(--spectrum-alias-component-background-color-down);\\n  --spectrum-alias-infieldbutton-fill-loudnessHigh-background-color-key-focus: var(--spectrum-alias-component-background-color-key-focus);\\n  --spectrum-alias-infieldbutton-fill-loudnessHigh-background-color-disabled: var(--spectrum-alias-component-background-color-disabled);\\n  --spectrum-alias-actionbutton-staticBlack-border-color-default: rgba(0,0,0,0.4);\\n  --spectrum-alias-actionbutton-staticBlack-background-color-default: transparent;\\n  --spectrum-alias-actionbutton-staticBlack-border-color-hover: rgba(0,0,0,0.55);\\n  --spectrum-alias-actionbutton-staticBlack-background-color-hover: rgba(0,0,0,0.25);\\n  --spectrum-alias-actionbutton-staticBlack-border-color-down: rgba(0,0,0,0.7);\\n  --spectrum-alias-actionbutton-staticBlack-background-color-down: rgba(0,0,0,0.4);\\n  --spectrum-alias-actionbutton-staticBlack-border-color-key-focus: rgba(0,0,0,0.55);\\n  --spectrum-alias-actionbutton-staticBlack-background-color-key-focus: rgba(0,0,0,0.25);\\n  --spectrum-alias-actionbutton-staticBlack-border-color-disabled: rgba(0,0,0,0.25);\\n  --spectrum-alias-actionbutton-staticBlack-background-color-disabled: transparent;\\n  --spectrum-alias-actionbutton-staticBlack-border-color-disabled-selected: transparent;\\n  --spectrum-alias-actionbutton-staticBlack-background-color-disabled-selected: rgba(0,0,0,0.1);\\n  --spectrum-alias-actionbutton-staticWhite-border-color-default: rgba(255,255,255,0.4);\\n  --spectrum-alias-actionbutton-staticWhite-background-color-default: transparent;\\n  --spectrum-alias-actionbutton-staticWhite-border-color-hover: rgba(255,255,255,0.55);\\n  --spectrum-alias-actionbutton-staticWhite-background-color-hover: rgba(255,255,255,0.25);\\n  --spectrum-alias-actionbutton-staticWhite-border-color-down: rgba(255,255,255,0.7);\\n  --spectrum-alias-actionbutton-staticWhite-background-color-down: rgba(255,255,255,0.4);\\n  --spectrum-alias-actionbutton-staticWhite-border-color-key-focus: rgba(255,255,255,0.55);\\n  --spectrum-alias-actionbutton-staticWhite-background-color-key-focus: rgba(255,255,255,0.25);\\n  --spectrum-alias-actionbutton-staticWhite-border-color-disabled: rgba(255,255,255,0.25);\\n  --spectrum-alias-actionbutton-staticWhite-background-color-disabled: transparent;\\n  --spectrum-alias-actionbutton-staticWhite-border-color-disabled-selected: transparent;\\n  --spectrum-alias-actionbutton-staticWhite-background-color-disabled-selected: rgba(255,255,255,0.1);\\n  --spectrum-alias-tabs-divider-background-color-default: var(--spectrum-global-color-gray-300);\\n  --spectrum-alias-tabs-divider-background-color-quiet: var(--spectrum-alias-background-color-transparent);\\n  --spectrum-alias-tabitem-text-color-default: var(--spectrum-alias-label-text-color);\\n  --spectrum-alias-tabitem-text-color-hover: var(--spectrum-alias-text-color-hover);\\n  --spectrum-alias-tabitem-text-color-down: var(--spectrum-alias-text-color-down);\\n  --spectrum-alias-tabitem-text-color-key-focus: var(--spectrum-alias-text-color-hover);\\n  --spectrum-alias-tabitem-text-color-mouse-focus: var(--spectrum-alias-text-color-hover);\\n  --spectrum-alias-tabitem-text-color: var(--spectrum-alias-tabitem-text-color-default);\\n  --spectrum-alias-tabitem-text-color-selected-default: var(--spectrum-global-color-gray-900);\\n  --spectrum-alias-tabitem-text-color-selected-hover: var(--spectrum-alias-tabitem-text-color-selected-default);\\n  --spectrum-alias-tabitem-text-color-selected-down: var(--spectrum-alias-tabitem-text-color-selected-default);\\n  --spectrum-alias-tabitem-text-color-selected-key-focus: var(--spectrum-alias-tabitem-text-color-selected-default);\\n  --spectrum-alias-tabitem-text-color-selected-mouse-focus: var(--spectrum-alias-tabitem-text-color-selected-default);\\n  --spectrum-alias-tabitem-text-color-selected: var(--spectrum-alias-tabitem-text-color-selected-default);\\n  --spectrum-alias-tabitem-text-color-emphasized: var(--spectrum-alias-tabitem-text-color-default);\\n  --spectrum-alias-tabitem-text-color-emphasized-selected-default: var(--spectrum-global-color-static-blue-500);\\n  --spectrum-alias-tabitem-text-color-emphasized-selected-hover: var(--spectrum-alias-tabitem-text-color-emphasized-selected-default);\\n  --spectrum-alias-tabitem-text-color-emphasized-selected-down: var(--spectrum-alias-tabitem-text-color-emphasized-selected-default);\\n  --spectrum-alias-tabitem-text-color-emphasized-selected-key-focus: var(--spectrum-alias-tabitem-text-color-emphasized-selected-default);\\n  --spectrum-alias-tabitem-text-color-emphasized-selected-mouse-focus: var(--spectrum-alias-tabitem-text-color-emphasized-selected-default);\\n  --spectrum-alias-tabitem-text-color-emphasized-selected: var(--spectrum-alias-tabitem-text-color-emphasized-selected-default);\\n  --spectrum-alias-tabitem-selection-indicator-color-default: var(--spectrum-alias-tabitem-text-color-selected-default);\\n  --spectrum-alias-tabitem-selection-indicator-color-emphasized: var(--spectrum-alias-tabitem-text-color-emphasized-selected-default);\\n  --spectrum-alias-tabitem-icon-color-disabled: var(--spectrum-alias-text-color-disabled);\\n  --spectrum-alias-tabitem-icon-color-default: var(--spectrum-alias-icon-color);\\n  --spectrum-alias-tabitem-icon-color-hover: var(--spectrum-alias-icon-color-hover);\\n  --spectrum-alias-tabitem-icon-color-down: var(--spectrum-alias-icon-color-down);\\n  --spectrum-alias-tabitem-icon-color-key-focus: var(--spectrum-alias-icon-color-hover);\\n  --spectrum-alias-tabitem-icon-color-mouse-focus: var(--spectrum-alias-icon-color-down);\\n  --spectrum-alias-tabitem-icon-color: var(--spectrum-alias-tabitem-icon-color-default);\\n  --spectrum-alias-tabitem-icon-color-selected: var(--spectrum-alias-icon-color-selected-neutral);\\n  --spectrum-alias-tabitem-icon-color-emphasized: var(--spectrum-alias-tabitem-text-color-default);\\n  --spectrum-alias-tabitem-icon-color-emphasized-selected: var(--spectrum-alias-tabitem-text-color-emphasized-selected-default);\\n  --spectrum-alias-background-color-default: var(--spectrum-global-color-gray-100);\\n  --spectrum-alias-background-color-disabled: var(--spectrum-global-color-gray-200);\\n  --spectrum-alias-background-color-transparent: transparent;\\n  --spectrum-alias-background-color-overbackground-down: rgba(255,255,255,0.2);\\n  --spectrum-alias-background-color-quiet-overbackground-hover: rgba(255,255,255,0.1);\\n  --spectrum-alias-background-color-quiet-overbackground-down: rgba(255,255,255,0.2);\\n  --spectrum-alias-background-color-overbackground-disabled: rgba(255,255,255,0.1);\\n  --spectrum-alias-background-color-quickactions-overlay: rgba(0,0,0,0.2);\\n  --spectrum-alias-placeholder-text-color: var(--spectrum-global-color-gray-800);\\n  --spectrum-alias-placeholder-text-color-hover: var(--spectrum-global-color-gray-900);\\n  --spectrum-alias-placeholder-text-color-down: var(--spectrum-global-color-gray-900);\\n  --spectrum-alias-placeholder-text-color-selected: var(--spectrum-global-color-gray-800);\\n  --spectrum-alias-label-text-color: var(--spectrum-global-color-gray-700);\\n  --spectrum-alias-text-color: var(--spectrum-global-color-gray-800);\\n  --spectrum-alias-text-color-hover: var(--spectrum-global-color-gray-900);\\n  --spectrum-alias-text-color-down: var(--spectrum-global-color-gray-900);\\n  --spectrum-alias-text-color-key-focus: var(--spectrum-global-color-blue-600);\\n  --spectrum-alias-text-color-mouse-focus: var(--spectrum-global-color-blue-600);\\n  --spectrum-alias-text-color-disabled: var(--spectrum-global-color-gray-500);\\n  --spectrum-alias-text-color-invalid: var(--spectrum-global-color-red-500);\\n  --spectrum-alias-text-color-selected: var(--spectrum-global-color-blue-600);\\n  --spectrum-alias-text-color-selected-neutral: var(--spectrum-global-color-gray-900);\\n  --spectrum-alias-text-color-overbackground: var(--spectrum-global-color-static-white);\\n  --spectrum-alias-text-color-overbackground-disabled: rgba(255,255,255,0.2);\\n  --spectrum-alias-text-color-quiet-overbackground-disabled: rgba(255,255,255,0.2);\\n  --spectrum-alias-heading-text-color: var(--spectrum-global-color-gray-900);\\n  --spectrum-alias-link-primary-text-color-default: var(--spectrum-global-color-blue-600);\\n  --spectrum-alias-link-primary-text-color-hover: var(--spectrum-global-color-blue-600);\\n  --spectrum-alias-link-primary-text-color-down: var(--spectrum-global-color-blue-700);\\n  --spectrum-alias-link-primary-text-color-key-focus: var(--spectrum-alias-text-color-key-focus);\\n  --spectrum-alias-link-primary-text-color: var(--spectrum-alias-link-primary-text-color-default);\\n  --spectrum-alias-link-secondary-text-color-default: var(--spectrum-alias-link-primary-text-color-default);\\n  --spectrum-alias-link-secondary-text-color-hover: var(--spectrum-alias-link-primary-text-color-hover);\\n  --spectrum-alias-link-secondary-text-color-down: var(--spectrum-alias-link-primary-text-color-down);\\n  --spectrum-alias-link-secondary-text-color-key-focus: var(--spectrum-alias-link-primary-text-color-key-focus);\\n  --spectrum-alias-link-secondary-text-color: var(--spectrum-alias-link-secondary-text-color-default);\\n  --spectrum-alias-border-color: var(--spectrum-global-color-gray-400);\\n  --spectrum-alias-border-color-hover: var(--spectrum-global-color-gray-500);\\n  --spectrum-alias-border-color-down: var(--spectrum-global-color-gray-500);\\n  --spectrum-alias-border-color-key-focus: var(--spectrum-global-color-blue-400);\\n  --spectrum-alias-border-color-mouse-focus: var(--spectrum-global-color-blue-500);\\n  --spectrum-alias-border-color-disabled: var(--spectrum-global-color-gray-200);\\n  --spectrum-alias-border-color-extralight: var(--spectrum-global-color-gray-100);\\n  --spectrum-alias-border-color-light: var(--spectrum-global-color-gray-200);\\n  --spectrum-alias-border-color-mid: var(--spectrum-global-color-gray-300);\\n  --spectrum-alias-border-color-dark: var(--spectrum-global-color-gray-400);\\n  --spectrum-alias-border-color-darker-default: var(--spectrum-global-color-gray-600);\\n  --spectrum-alias-border-color-darker-hover: var(--spectrum-global-color-gray-900);\\n  --spectrum-alias-border-color-darker-down: var(--spectrum-global-color-gray-900);\\n  --spectrum-alias-border-color-transparent: transparent;\\n  --spectrum-alias-border-color-translucent-dark: rgba(0,0,0,0.05);\\n  --spectrum-alias-border-color-translucent-darker: rgba(0,0,0,0.1);\\n  --spectrum-alias-focus-color: var(--spectrum-global-color-blue-400);\\n  --spectrum-alias-focus-ring-color: var(--spectrum-alias-focus-color);\\n  --spectrum-alias-track-color-default: var(--spectrum-global-color-gray-400);\\n  --spectrum-alias-track-fill-color-overbackground: var(--spectrum-global-color-static-white);\\n  --spectrum-alias-track-color-disabled: var(--spectrum-global-color-gray-300);\\n  --spectrum-alias-thumbnail-darksquare-background-color: var(--spectrum-global-color-gray-300);\\n  --spectrum-alias-thumbnail-lightsquare-background-color: var(--spectrum-global-color-static-white);\\n  --spectrum-alias-track-color-overbackground: rgba(255,255,255,0.2);\\n  --spectrum-alias-icon-color: var(--spectrum-global-color-gray-700);\\n  --spectrum-alias-icon-color-overbackground: var(--spectrum-global-color-static-white);\\n  --spectrum-alias-icon-color-hover: var(--spectrum-global-color-gray-900);\\n  --spectrum-alias-icon-color-down: var(--spectrum-global-color-gray-900);\\n  --spectrum-alias-icon-color-key-focus: var(--spectrum-global-color-gray-900);\\n  --spectrum-alias-icon-color-disabled: var(--spectrum-global-color-gray-400);\\n  --spectrum-alias-icon-color-overbackground-disabled: rgba(255,255,255,0.2);\\n  --spectrum-alias-icon-color-quiet-overbackground-disabled: rgba(255,255,255,0.15);\\n  --spectrum-alias-icon-color-selected-neutral: var(--spectrum-global-color-gray-900);\\n  --spectrum-alias-icon-color-selected-neutral-subdued: var(--spectrum-global-color-gray-800);\\n  --spectrum-alias-icon-color-selected: var(--spectrum-global-color-blue-500);\\n  --spectrum-alias-icon-color-selected-hover: var(--spectrum-global-color-blue-600);\\n  --spectrum-alias-icon-color-selected-down: var(--spectrum-global-color-blue-700);\\n  --spectrum-alias-icon-color-selected-focus: var(--spectrum-global-color-blue-600);\\n  --spectrum-alias-image-opacity-disabled: var(--spectrum-global-color-opacity-30);\\n  --spectrum-alias-toolbar-background-color: var(--spectrum-global-color-gray-100);\\n  --spectrum-alias-code-highlight-color-default: var(--spectrum-global-color-gray-800);\\n  --spectrum-alias-code-highlight-background-color: var(--spectrum-global-color-gray-75);\\n  --spectrum-alias-code-highlight-color-keyword: var(--spectrum-global-color-fuchsia-600);\\n  --spectrum-alias-code-highlight-color-section: var(--spectrum-global-color-red-600);\\n  --spectrum-alias-code-highlight-color-literal: var(--spectrum-global-color-blue-600);\\n  --spectrum-alias-code-highlight-color-attribute: var(--spectrum-global-color-seafoam-600);\\n  --spectrum-alias-code-highlight-color-class: var(--spectrum-global-color-magenta-600);\\n  --spectrum-alias-code-highlight-color-variable: var(--spectrum-global-color-purple-600);\\n  --spectrum-alias-code-highlight-color-title: var(--spectrum-global-color-indigo-600);\\n  --spectrum-alias-code-highlight-color-string: var(--spectrum-global-color-fuchsia-600);\\n  --spectrum-alias-code-highlight-color-function: var(--spectrum-global-color-blue-600);\\n  --spectrum-alias-code-highlight-color-comment: var(--spectrum-global-color-gray-700);\\n  --spectrum-alias-categorical-color-1: var(--spectrum-global-color-static-seafoam-200);\\n  --spectrum-alias-categorical-color-2: var(--spectrum-global-color-static-indigo-700);\\n  --spectrum-alias-categorical-color-3: var(--spectrum-global-color-static-orange-500);\\n  --spectrum-alias-categorical-color-4: var(--spectrum-global-color-static-magenta-500);\\n  --spectrum-alias-categorical-color-5: var(--spectrum-global-color-static-indigo-200);\\n  --spectrum-alias-categorical-color-6: var(--spectrum-global-color-static-celery-200);\\n  --spectrum-alias-categorical-color-7: var(--spectrum-global-color-static-blue-500);\\n  --spectrum-alias-categorical-color-8: var(--spectrum-global-color-static-purple-800);\\n  --spectrum-alias-categorical-color-9: var(--spectrum-global-color-static-yellow-500);\\n  --spectrum-alias-categorical-color-10: var(--spectrum-global-color-static-orange-700);\\n  --spectrum-alias-categorical-color-11: var(--spectrum-global-color-static-green-600);\\n  --spectrum-alias-categorical-color-12: var(--spectrum-global-color-static-chartreuse-300);\\n  --spectrum-alias-categorical-color-13: var(--spectrum-global-color-static-blue-200);\\n  --spectrum-alias-categorical-color-14: var(--spectrum-global-color-static-fuchsia-500);\\n  --spectrum-alias-categorical-color-15: var(--spectrum-global-color-static-magenta-200);\\n  --spectrum-alias-categorical-color-16: var(--spectrum-global-color-static-yellow-200);\\n}\\n\", \"\"]);\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTAyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BzcGVjdHJ1bS1jc3MvdmFycy9kaXN0L3NwZWN0cnVtLWdsb2JhbC5jc3M/ZTdlNCJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiLi4vLi4vLi4vY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzXCIpKGZhbHNlKTtcbi8vIE1vZHVsZVxuZXhwb3J0cy5wdXNoKFttb2R1bGUuaWQsIFwiLnNwZWN0cnVtIHsgIC8qIHNwZWN0cnVtLWFuaW1hdGlvbkdsb2JhbHMuY3NzICovXFxuICAtLXNwZWN0cnVtLWdsb2JhbC1hbmltYXRpb24tbGluZWFyOiBjdWJpYy1iZXppZXIoMCwgMCwgMSwgMSk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1hbmltYXRpb24tZHVyYXRpb24tMDogMG1zO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtYW5pbWF0aW9uLWR1cmF0aW9uLTEwMDogMTMwbXM7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1hbmltYXRpb24tZHVyYXRpb24tMjAwOiAxNjBtcztcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWFuaW1hdGlvbi1kdXJhdGlvbi0zMDA6IDE5MG1zO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtYW5pbWF0aW9uLWR1cmF0aW9uLTQwMDogMjIwbXM7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1hbmltYXRpb24tZHVyYXRpb24tNTAwOiAyNTBtcztcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWFuaW1hdGlvbi1kdXJhdGlvbi02MDA6IDMwMG1zO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtYW5pbWF0aW9uLWR1cmF0aW9uLTcwMDogMzUwbXM7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1hbmltYXRpb24tZHVyYXRpb24tODAwOiA0MDBtcztcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWFuaW1hdGlvbi1kdXJhdGlvbi05MDA6IDQ1MG1zO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtYW5pbWF0aW9uLWR1cmF0aW9uLTEwMDA6IDUwMG1zO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtYW5pbWF0aW9uLWR1cmF0aW9uLTIwMDA6IDEwMDBtcztcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWFuaW1hdGlvbi1kdXJhdGlvbi00MDAwOiAyMDAwbXM7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1hbmltYXRpb24tZWFzZS1pbi1vdXQ6IGN1YmljLWJlemllciguNDUsIDAsIC40MCwgMSk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1hbmltYXRpb24tZWFzZS1pbjogY3ViaWMtYmV6aWVyKC41MCwgMCwgMSwgMSk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1hbmltYXRpb24tZWFzZS1vdXQ6IGN1YmljLWJlemllcigwLCAwLCAwLjQwLCAxKTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWFuaW1hdGlvbi1lYXNlLWxpbmVhcjogY3ViaWMtYmV6aWVyKDAsIDAsIDEsIDEpO1xcblxcblxcbiAgLyogc3BlY3RydW0tY29sb3JHbG9iYWxzLmNzcyAqL1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3Itc3RhdHVzOiBWZXJpZmllZDtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLXZlcnNpb246IDUuMS4wO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3Itc3RhdGljLWJsYWNrOiByZ2IoMCwgMCwgMCk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1zdGF0aWMtd2hpdGU6IHJnYigyNTUsIDI1NSwgMjU1KTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLXN0YXRpYy1ibHVlOiByZ2IoMjAsIDExNSwgMjMwKTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLXN0YXRpYy1ncmF5LTUwOiByZ2IoMjU1LCAyNTUsIDI1NSk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1zdGF0aWMtZ3JheS03NTogcmdiKDI1NSwgMjU1LCAyNTUpO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3Itc3RhdGljLWdyYXktMTAwOiByZ2IoMjU1LCAyNTUsIDI1NSk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1zdGF0aWMtZ3JheS0yMDA6IHJnYigyNDQsIDI0NCwgMjQ0KTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLXN0YXRpYy1ncmF5LTMwMDogcmdiKDIzNCwgMjM0LCAyMzQpO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3Itc3RhdGljLWdyYXktNDAwOiByZ2IoMjExLCAyMTEsIDIxMSk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1zdGF0aWMtZ3JheS01MDA6IHJnYigxODgsIDE4OCwgMTg4KTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLXN0YXRpYy1ncmF5LTYwMDogcmdiKDE0OSwgMTQ5LCAxNDkpO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3Itc3RhdGljLWdyYXktNzAwOiByZ2IoMTE2LCAxMTYsIDExNik7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1zdGF0aWMtZ3JheS04MDA6IHJnYig4MCwgODAsIDgwKTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLXN0YXRpYy1ncmF5LTkwMDogcmdiKDUwLCA1MCwgNTApO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3Itc3RhdGljLWJsdWUtMjAwOiByZ2IoOTAsIDE2OSwgMjUwKTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLXN0YXRpYy1ibHVlLTMwMDogcmdiKDc1LCAxNTYsIDI0NSk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1zdGF0aWMtYmx1ZS00MDA6IHJnYig1NSwgMTQyLCAyNDApO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3Itc3RhdGljLWJsdWUtNTAwOiByZ2IoMzgsIDEyOCwgMjM1KTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLXN0YXRpYy1ibHVlLTYwMDogcmdiKDIwLCAxMTUsIDIzMCk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1zdGF0aWMtYmx1ZS03MDA6IHJnYigxMywgMTAyLCAyMDgpO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3Itc3RhdGljLWJsdWUtODAwOiByZ2IoOSwgOTAsIDE4Nik7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1zdGF0aWMtcmVkLTQwMDogcmdiKDIzNiwgOTEsIDk4KTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLXN0YXRpYy1yZWQtNTAwOiByZ2IoMjI3LCA3MiwgODApO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3Itc3RhdGljLXJlZC02MDA6IHJnYigyMTUsIDU1LCA2Myk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1zdGF0aWMtcmVkLTcwMDogcmdiKDIwMSwgMzcsIDQ1KTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLXN0YXRpYy1yZWQtODAwOiByZ2IoMTg3LCAxOCwgMjYpO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3Itc3RhdGljLW9yYW5nZS00MDA6IHJnYigyNDIsIDE0OCwgMzUpO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3Itc3RhdGljLW9yYW5nZS01MDA6IHJnYigyMzAsIDEzNCwgMjUpO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3Itc3RhdGljLW9yYW5nZS02MDA6IHJnYigyMTgsIDEyMywgMTcpO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3Itc3RhdGljLW9yYW5nZS03MDA6IHJnYigyMDMsIDExMSwgMTYpO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3Itc3RhdGljLW9yYW5nZS04MDA6IHJnYigxODksIDEwMCwgMTMpO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3Itc3RhdGljLWdyZWVuLTQwMDogcmdiKDUxLCAxNzEsIDEzMik7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1zdGF0aWMtZ3JlZW4tNTAwOiByZ2IoNDUsIDE1NywgMTIwKTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLXN0YXRpYy1ncmVlbi02MDA6IHJnYigzOCwgMTQyLCAxMDgpO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3Itc3RhdGljLWdyZWVuLTcwMDogcmdiKDE4LCAxMjgsIDkyKTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLXN0YXRpYy1ncmVlbi04MDA6IHJnYigxNiwgMTEzLCA4NCk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1zdGF0aWMtY2VsZXJ5LTIwMDogcmdiKDg4LCAyMjQsIDExMSk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1zdGF0aWMtY2VsZXJ5LTMwMDogcmdiKDgxLCAyMTAsIDEwMyk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1zdGF0aWMtY2VsZXJ5LTQwMDogcmdiKDc1LCAxOTUsIDk1KTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLXN0YXRpYy1jZWxlcnktNTAwOiByZ2IoNjgsIDE4MSwgODYpO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3Itc3RhdGljLWNlbGVyeS02MDA6IHJnYig2MSwgMTY3LCA3OCk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1zdGF0aWMtY2VsZXJ5LTcwMDogcmdiKDU1LCAxNTMsIDcxKTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLXN0YXRpYy1jZWxlcnktODAwOiByZ2IoNDksIDEzOSwgNjQpO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3Itc3RhdGljLWNoYXJ0cmV1c2UtMzAwOiByZ2IoMTU1LCAyMzYsIDg0KTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLXN0YXRpYy1jaGFydHJldXNlLTQwMDogcmdiKDE0MiwgMjIyLCA3Myk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1zdGF0aWMtY2hhcnRyZXVzZS01MDA6IHJnYigxMzMsIDIwOCwgNjgpO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3Itc3RhdGljLWNoYXJ0cmV1c2UtNjAwOiByZ2IoMTI0LCAxOTUsIDYzKTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLXN0YXRpYy1jaGFydHJldXNlLTcwMDogcmdiKDExNSwgMTgxLCA1OCk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1zdGF0aWMtY2hhcnRyZXVzZS04MDA6IHJnYigxMDYsIDE2OCwgNTIpO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3Itc3RhdGljLXllbGxvdy0yMDA6IHJnYigyNTUsIDIyNiwgNDYpO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3Itc3RhdGljLXllbGxvdy0zMDA6IHJnYigyNTAsIDIxNywgMCk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1zdGF0aWMteWVsbG93LTQwMDogcmdiKDIzNywgMjA0LCAwKTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLXN0YXRpYy15ZWxsb3ctNTAwOiByZ2IoMjIzLCAxOTEsIDApO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3Itc3RhdGljLXllbGxvdy02MDA6IHJnYigyMTAsIDE3OCwgMCk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1zdGF0aWMteWVsbG93LTcwMDogcmdiKDE5NiwgMTY2LCAwKTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLXN0YXRpYy15ZWxsb3ctODAwOiByZ2IoMTgzLCAxNTMsIDApO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3Itc3RhdGljLW1hZ2VudGEtMjAwOiByZ2IoMjQ1LCAxMDcsIDE4Myk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1zdGF0aWMtbWFnZW50YS0zMDA6IHJnYigyMzYsIDkwLCAxNzApO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3Itc3RhdGljLW1hZ2VudGEtNDAwOiByZ2IoMjI2LCA3MywgMTU3KTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLXN0YXRpYy1tYWdlbnRhLTUwMDogcmdiKDIxNiwgNTUsIDE0NCk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1zdGF0aWMtbWFnZW50YS02MDA6IHJnYigyMDIsIDQxLCAxMzApO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3Itc3RhdGljLW1hZ2VudGEtNzAwOiByZ2IoMTg4LCAyOCwgMTE2KTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLXN0YXRpYy1tYWdlbnRhLTgwMDogcmdiKDE3NCwgMTQsIDEwMik7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1zdGF0aWMtZnVjaHNpYS00MDA6IHJnYigyMDcsIDYyLCAyMjApO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3Itc3RhdGljLWZ1Y2hzaWEtNTAwOiByZ2IoMTkyLCA1NiwgMjA0KTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLXN0YXRpYy1mdWNoc2lhLTYwMDogcmdiKDE3NywgNDgsIDE4OSk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1zdGF0aWMtZnVjaHNpYS03MDA6IHJnYigxNjIsIDQwLCAxNzMpO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3Itc3RhdGljLWZ1Y2hzaWEtODAwOiByZ2IoMTQ3LCAzMywgMTU4KTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLXN0YXRpYy1wdXJwbGUtNDAwOiByZ2IoMTU3LCAxMDAsIDIyNSk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1zdGF0aWMtcHVycGxlLTUwMDogcmdiKDE0NiwgODYsIDIxNyk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1zdGF0aWMtcHVycGxlLTYwMDogcmdiKDEzNCwgNzYsIDIwNCk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1zdGF0aWMtcHVycGxlLTcwMDogcmdiKDEyMiwgNjYsIDE5MSk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1zdGF0aWMtcHVycGxlLTgwMDogcmdiKDExMSwgNTYsIDE3Nyk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1zdGF0aWMtaW5kaWdvLTIwMDogcmdiKDE0NCwgMTQ0LCAyNTApO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3Itc3RhdGljLWluZGlnby0zMDA6IHJnYigxMzAsIDEzMCwgMjQ2KTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLXN0YXRpYy1pbmRpZ28tNDAwOiByZ2IoMTE3LCAxMTcsIDI0MSk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1zdGF0aWMtaW5kaWdvLTUwMDogcmdiKDEwMywgMTAzLCAyMzYpO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3Itc3RhdGljLWluZGlnby02MDA6IHJnYig5MiwgOTIsIDIyNCk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1zdGF0aWMtaW5kaWdvLTcwMDogcmdiKDgxLCA4MSwgMjExKTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLXN0YXRpYy1pbmRpZ28tODAwOiByZ2IoNzAsIDcwLCAxOTgpO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3Itc3RhdGljLXNlYWZvYW0tMjAwOiByZ2IoMzgsIDE5MiwgMTk5KTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLXN0YXRpYy1zZWFmb2FtLTMwMDogcmdiKDM1LCAxNzgsIDE4NCk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1zdGF0aWMtc2VhZm9hbS00MDA6IHJnYigzMiwgMTYzLCAxNjgpO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3Itc3RhdGljLXNlYWZvYW0tNTAwOiByZ2IoMjcsIDE0OSwgMTU0KTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLXN0YXRpYy1zZWFmb2FtLTYwMDogcmdiKDIyLCAxMzUsIDE0MCk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1zdGF0aWMtc2VhZm9hbS03MDA6IHJnYigxNSwgMTIxLCAxMjUpO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3Itc3RhdGljLXNlYWZvYW0tODAwOiByZ2IoOSwgMTA4LCAxMTEpO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3Itc3RhdGljLXRyYW5zcGFyZW50LXdoaXRlLTIwMDogcmdiYSgyNTUsMjU1LDI1NSwwLjEpO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3Itc3RhdGljLXRyYW5zcGFyZW50LXdoaXRlLTMwMDogcmdiYSgyNTUsMjU1LDI1NSwwLjI1KTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLXN0YXRpYy10cmFuc3BhcmVudC13aGl0ZS00MDA6IHJnYmEoMjU1LDI1NSwyNTUsMC40KTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLXN0YXRpYy10cmFuc3BhcmVudC13aGl0ZS01MDA6IHJnYmEoMjU1LDI1NSwyNTUsMC41NSk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1zdGF0aWMtdHJhbnNwYXJlbnQtd2hpdGUtNjAwOiByZ2JhKDI1NSwyNTUsMjU1LDAuNyk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1zdGF0aWMtdHJhbnNwYXJlbnQtd2hpdGUtNzAwOiByZ2JhKDI1NSwyNTUsMjU1LDAuOCk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1zdGF0aWMtdHJhbnNwYXJlbnQtd2hpdGUtODAwOiByZ2JhKDI1NSwyNTUsMjU1LDAuOSk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1zdGF0aWMtdHJhbnNwYXJlbnQtd2hpdGUtOTAwOiByZ2IoMjU1LDI1NSwyNTUpO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3Itc3RhdGljLXRyYW5zcGFyZW50LWJsYWNrLTIwMDogcmdiYSgwLDAsMCwwLjEpO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3Itc3RhdGljLXRyYW5zcGFyZW50LWJsYWNrLTMwMDogcmdiYSgwLDAsMCwwLjI1KTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLXN0YXRpYy10cmFuc3BhcmVudC1ibGFjay00MDA6IHJnYmEoMCwwLDAsMC40KTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLXN0YXRpYy10cmFuc3BhcmVudC1ibGFjay01MDA6IHJnYmEoMCwwLDAsMC41NSk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1zdGF0aWMtdHJhbnNwYXJlbnQtYmxhY2stNjAwOiByZ2JhKDAsMCwwLDAuNyk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1zdGF0aWMtdHJhbnNwYXJlbnQtYmxhY2stNzAwOiByZ2JhKDAsMCwwLDAuOCk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1zdGF0aWMtdHJhbnNwYXJlbnQtYmxhY2stODAwOiByZ2JhKDAsMCwwLDAuOSk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1zdGF0aWMtdHJhbnNwYXJlbnQtYmxhY2stOTAwOiByZ2IoMCwwLDApO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3Itc2VxdWVudGlhbC1jZXJ1bGVhbjogI0U5RkZGMSwjQzhGMUU0LCNBNUUzRDcsIzgyRDVDQSwjNjhDNUMxLCM1NEI0QkEsIzNGQTJCMiwjMjk5MUFDLCMyMjgwQTIsIzFGNkQ5OCwjMUQ1QzhELCMxQTRCODMsIzFBMzk3OSwjMUEyNjZGLCMxOTEyNjQsIzE4MDA1NztcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLXNlcXVlbnRpYWwtZm9yZXN0OiAjRkZGRkRGLCNFMkY2QkEsI0M0RUI5NSwjQTRFMTZELCM4REQzNjYsIzc3QzQ2MCwjNUZCNjVBLCM0OEE3NTQsIzM2OTg0RiwjMkM4OTRELCMyMzdBNEEsIzE5NkI0NywjMTA1QzQ1LCMwOTRENDEsIzAzM0YzRSwjMDAzMTNBO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3Itc2VxdWVudGlhbC1yb3NlOiAjRkZGNERELCNGRkRERDcsI0ZGQzVEMiwjRkVBRUNCLCNGQTk2QzQsI0Y1N0VCRCwjRUY2NEI1LCNFODQ2QUQsI0QyMzhBMSwjQkIyRTk2LCNBMzI0OEMsIzhBMUI4MywjNzExNjdDLCM1NjBGNzQsIzM3MEI2RSwjMDAwOTY4O1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItZGl2ZXJnaW5nLW9yYW5nZS15ZWxsb3ctc2VhZm9hbTogIzU4MDAwMCwjNzkyNjBCLCM5QzQ1MTEsI0JENjUxQSwjREQ4NjI5LCNGNUFENTIsI0ZFRDY5MywjRkZGRkUwLCNCQkU0RDEsIzc2QzdCRSwjM0VBOEE2LCMyMDgyODgsIzA3Njc2OSwjMDA0OTRCLCMwMDJDMkQ7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1kaXZlcmdpbmctcmVkLXllbGxvdy1ibHVlOiAjNEEwMDFFLCM3NTEyMzIsI0E1Mjc0NywjQzY1MTU0LCNFNDc5NjEsI0YwQTg4MiwjRkFENEFDLCNGRkZGRTAsI0JDRTJDRiwjODlDMEM0LCM1NzlFQjksIzM5N0FBOCwjMUM1Nzk2LCMxNjM3NzEsIzEwMTk0RDtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLWRpdmVyZ2luZy1yZWQtYmx1ZTogIzRBMDAxRSwjNzMxMzMxLCM5RjI5NDUsI0NDNDE1QSwjRTA2RTg1LCNFRDlBQjAsI0Y4QzNEOSwjRkFGMEZGLCNDNkQwRjIsIzkyQjJERSwjNUQ5NENCLCMyRjc0QjMsIzI2NTE5MSwjMTYzNjcwLCMwQjE5NEM7XFxuXFxuXFxuICAvKiBzcGVjdHJ1bS1jb2xvclNlbWFudGljcy5jc3MgKi9cXG4gIC0tc3BlY3RydW0tc2VtYW50aWMtbmVnYXRpdmUtYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLXN0YXRpYy1yZWQtNzAwKTtcXG4gIC0tc3BlY3RydW0tc2VtYW50aWMtbmVnYXRpdmUtY29sb3ItZGVmYXVsdDogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLXJlZC01MDApO1xcbiAgLS1zcGVjdHJ1bS1zZW1hbnRpYy1uZWdhdGl2ZS1jb2xvci1ob3ZlcjogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLXJlZC02MDApO1xcbiAgLS1zcGVjdHJ1bS1zZW1hbnRpYy1uZWdhdGl2ZS1jb2xvci1kYXJrOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItcmVkLTYwMCk7XFxuICAtLXNwZWN0cnVtLXNlbWFudGljLW5lZ2F0aXZlLWJvcmRlci1jb2xvcjogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLXJlZC00MDApO1xcbiAgLS1zcGVjdHJ1bS1zZW1hbnRpYy1uZWdhdGl2ZS1pY29uLWNvbG9yOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItcmVkLTYwMCk7XFxuICAtLXNwZWN0cnVtLXNlbWFudGljLW5lZ2F0aXZlLXN0YXR1cy1jb2xvcjogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLXJlZC00MDApO1xcbiAgLS1zcGVjdHJ1bS1zZW1hbnRpYy1uZWdhdGl2ZS10ZXh0LWNvbG9yLWxhcmdlOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItcmVkLTUwMCk7XFxuICAtLXNwZWN0cnVtLXNlbWFudGljLW5lZ2F0aXZlLXRleHQtY29sb3Itc21hbGw6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1yZWQtNjAwKTtcXG4gIC0tc3BlY3RydW0tc2VtYW50aWMtbmVnYXRpdmUtdGV4dC1jb2xvci1zbWFsbC1ob3ZlcjogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLXJlZC03MDApO1xcbiAgLS1zcGVjdHJ1bS1zZW1hbnRpYy1uZWdhdGl2ZS10ZXh0LWNvbG9yLXNtYWxsLWRvd246IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1yZWQtNzAwKTtcXG4gIC0tc3BlY3RydW0tc2VtYW50aWMtbmVnYXRpdmUtdGV4dC1jb2xvci1zbWFsbC1rZXktZm9jdXM6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1yZWQtNjAwKTtcXG4gIC0tc3BlY3RydW0tc2VtYW50aWMtbmVnYXRpdmUtY29sb3ItZG93bjogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLXJlZC03MDApO1xcbiAgLS1zcGVjdHJ1bS1zZW1hbnRpYy1uZWdhdGl2ZS1jb2xvci1rZXktZm9jdXM6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1yZWQtNDAwKTtcXG4gIC0tc3BlY3RydW0tc2VtYW50aWMtbmVnYXRpdmUtYmFja2dyb3VuZC1jb2xvci1kZWZhdWx0OiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3Itc3RhdGljLXJlZC02MDApO1xcbiAgLS1zcGVjdHJ1bS1zZW1hbnRpYy1uZWdhdGl2ZS1iYWNrZ3JvdW5kLWNvbG9yLWhvdmVyOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3Itc3RhdGljLXJlZC03MDApO1xcbiAgLS1zcGVjdHJ1bS1zZW1hbnRpYy1uZWdhdGl2ZS1iYWNrZ3JvdW5kLWNvbG9yLWRvd246IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1zdGF0aWMtcmVkLTgwMCk7XFxuICAtLXNwZWN0cnVtLXNlbWFudGljLW5lZ2F0aXZlLWJhY2tncm91bmQtY29sb3Ita2V5LWZvY3VzOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3Itc3RhdGljLXJlZC03MDApO1xcbiAgLS1zcGVjdHJ1bS1zZW1hbnRpYy1ub3RpY2UtYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLXN0YXRpYy1vcmFuZ2UtNzAwKTtcXG4gIC0tc3BlY3RydW0tc2VtYW50aWMtbm90aWNlLWNvbG9yLWRlZmF1bHQ6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1vcmFuZ2UtNTAwKTtcXG4gIC0tc3BlY3RydW0tc2VtYW50aWMtbm90aWNlLWNvbG9yLWRhcms6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1vcmFuZ2UtNjAwKTtcXG4gIC0tc3BlY3RydW0tc2VtYW50aWMtbm90aWNlLWJvcmRlci1jb2xvcjogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLW9yYW5nZS00MDApO1xcbiAgLS1zcGVjdHJ1bS1zZW1hbnRpYy1ub3RpY2UtaWNvbi1jb2xvcjogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLW9yYW5nZS02MDApO1xcbiAgLS1zcGVjdHJ1bS1zZW1hbnRpYy1ub3RpY2Utc3RhdHVzLWNvbG9yOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3Itb3JhbmdlLTQwMCk7XFxuICAtLXNwZWN0cnVtLXNlbWFudGljLW5vdGljZS10ZXh0LWNvbG9yLWxhcmdlOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3Itb3JhbmdlLTUwMCk7XFxuICAtLXNwZWN0cnVtLXNlbWFudGljLW5vdGljZS10ZXh0LWNvbG9yLXNtYWxsOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3Itb3JhbmdlLTYwMCk7XFxuICAtLXNwZWN0cnVtLXNlbWFudGljLW5vdGljZS1jb2xvci1kb3duOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3Itb3JhbmdlLTcwMCk7XFxuICAtLXNwZWN0cnVtLXNlbWFudGljLW5vdGljZS1jb2xvci1rZXktZm9jdXM6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1vcmFuZ2UtNDAwKTtcXG4gIC0tc3BlY3RydW0tc2VtYW50aWMtbm90aWNlLWJhY2tncm91bmQtY29sb3ItZGVmYXVsdDogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLXN0YXRpYy1vcmFuZ2UtNjAwKTtcXG4gIC0tc3BlY3RydW0tc2VtYW50aWMtbm90aWNlLWJhY2tncm91bmQtY29sb3ItaG92ZXI6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1zdGF0aWMtb3JhbmdlLTcwMCk7XFxuICAtLXNwZWN0cnVtLXNlbWFudGljLW5vdGljZS1iYWNrZ3JvdW5kLWNvbG9yLWRvd246IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1zdGF0aWMtb3JhbmdlLTgwMCk7XFxuICAtLXNwZWN0cnVtLXNlbWFudGljLW5vdGljZS1iYWNrZ3JvdW5kLWNvbG9yLWtleS1mb2N1czogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLXN0YXRpYy1vcmFuZ2UtNzAwKTtcXG4gIC0tc3BlY3RydW0tc2VtYW50aWMtcG9zaXRpdmUtYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLXN0YXRpYy1ncmVlbi03MDApO1xcbiAgLS1zcGVjdHJ1bS1zZW1hbnRpYy1wb3NpdGl2ZS1jb2xvci1kZWZhdWx0OiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItZ3JlZW4tNTAwKTtcXG4gIC0tc3BlY3RydW0tc2VtYW50aWMtcG9zaXRpdmUtY29sb3ItZGFyazogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLWdyZWVuLTYwMCk7XFxuICAtLXNwZWN0cnVtLXNlbWFudGljLXBvc2l0aXZlLWJvcmRlci1jb2xvcjogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLWdyZWVuLTQwMCk7XFxuICAtLXNwZWN0cnVtLXNlbWFudGljLXBvc2l0aXZlLWljb24tY29sb3I6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1ncmVlbi02MDApO1xcbiAgLS1zcGVjdHJ1bS1zZW1hbnRpYy1wb3NpdGl2ZS1zdGF0dXMtY29sb3I6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1ncmVlbi00MDApO1xcbiAgLS1zcGVjdHJ1bS1zZW1hbnRpYy1wb3NpdGl2ZS10ZXh0LWNvbG9yLWxhcmdlOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItZ3JlZW4tNTAwKTtcXG4gIC0tc3BlY3RydW0tc2VtYW50aWMtcG9zaXRpdmUtdGV4dC1jb2xvci1zbWFsbDogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLWdyZWVuLTYwMCk7XFxuICAtLXNwZWN0cnVtLXNlbWFudGljLXBvc2l0aXZlLWNvbG9yLWRvd246IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1ncmVlbi03MDApO1xcbiAgLS1zcGVjdHJ1bS1zZW1hbnRpYy1wb3NpdGl2ZS1jb2xvci1rZXktZm9jdXM6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1ncmVlbi00MDApO1xcbiAgLS1zcGVjdHJ1bS1zZW1hbnRpYy1wb3NpdGl2ZS1iYWNrZ3JvdW5kLWNvbG9yLWRlZmF1bHQ6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1zdGF0aWMtZ3JlZW4tNzAwKTtcXG4gIC0tc3BlY3RydW0tc2VtYW50aWMtcG9zaXRpdmUtYmFja2dyb3VuZC1jb2xvci1ob3ZlcjogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLXN0YXRpYy1ncmVlbi04MDApO1xcbiAgLS1zcGVjdHJ1bS1zZW1hbnRpYy1wb3NpdGl2ZS1iYWNrZ3JvdW5kLWNvbG9yLWRvd246IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1zdGF0aWMtZ3JlZW4tODAwKTtcXG4gIC0tc3BlY3RydW0tc2VtYW50aWMtcG9zaXRpdmUtYmFja2dyb3VuZC1jb2xvci1rZXktZm9jdXM6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1zdGF0aWMtZ3JlZW4tODAwKTtcXG4gIC0tc3BlY3RydW0tc2VtYW50aWMtaW5mb3JtYXRpdmUtYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLXN0YXRpYy1ibHVlLTcwMCk7XFxuICAtLXNwZWN0cnVtLXNlbWFudGljLWluZm9ybWF0aXZlLWNvbG9yLWRlZmF1bHQ6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1ibHVlLTUwMCk7XFxuICAtLXNwZWN0cnVtLXNlbWFudGljLWluZm9ybWF0aXZlLWNvbG9yLWRhcms6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1ibHVlLTYwMCk7XFxuICAtLXNwZWN0cnVtLXNlbWFudGljLWluZm9ybWF0aXZlLWJvcmRlci1jb2xvcjogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLWJsdWUtNDAwKTtcXG4gIC0tc3BlY3RydW0tc2VtYW50aWMtaW5mb3JtYXRpdmUtaWNvbi1jb2xvcjogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLWJsdWUtNjAwKTtcXG4gIC0tc3BlY3RydW0tc2VtYW50aWMtaW5mb3JtYXRpdmUtc3RhdHVzLWNvbG9yOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItYmx1ZS00MDApO1xcbiAgLS1zcGVjdHJ1bS1zZW1hbnRpYy1pbmZvcm1hdGl2ZS10ZXh0LWNvbG9yLWxhcmdlOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItYmx1ZS01MDApO1xcbiAgLS1zcGVjdHJ1bS1zZW1hbnRpYy1pbmZvcm1hdGl2ZS10ZXh0LWNvbG9yLXNtYWxsOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItYmx1ZS02MDApO1xcbiAgLS1zcGVjdHJ1bS1zZW1hbnRpYy1pbmZvcm1hdGl2ZS1jb2xvci1kb3duOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItYmx1ZS03MDApO1xcbiAgLS1zcGVjdHJ1bS1zZW1hbnRpYy1pbmZvcm1hdGl2ZS1jb2xvci1rZXktZm9jdXM6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1ibHVlLTQwMCk7XFxuICAtLXNwZWN0cnVtLXNlbWFudGljLWluZm9ybWF0aXZlLWJhY2tncm91bmQtY29sb3ItZGVmYXVsdDogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLXN0YXRpYy1ibHVlLTYwMCk7XFxuICAtLXNwZWN0cnVtLXNlbWFudGljLWluZm9ybWF0aXZlLWJhY2tncm91bmQtY29sb3ItaG92ZXI6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1zdGF0aWMtYmx1ZS03MDApO1xcbiAgLS1zcGVjdHJ1bS1zZW1hbnRpYy1pbmZvcm1hdGl2ZS1iYWNrZ3JvdW5kLWNvbG9yLWRvd246IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1zdGF0aWMtYmx1ZS04MDApO1xcbiAgLS1zcGVjdHJ1bS1zZW1hbnRpYy1pbmZvcm1hdGl2ZS1iYWNrZ3JvdW5kLWNvbG9yLWtleS1mb2N1czogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLXN0YXRpYy1ibHVlLTcwMCk7XFxuICAtLXNwZWN0cnVtLXNlbWFudGljLWN0YS1iYWNrZ3JvdW5kLWNvbG9yLWRlZmF1bHQ6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1zdGF0aWMtYmx1ZS02MDApO1xcbiAgLS1zcGVjdHJ1bS1zZW1hbnRpYy1jdGEtYmFja2dyb3VuZC1jb2xvci1ob3ZlcjogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLXN0YXRpYy1ibHVlLTcwMCk7XFxuICAtLXNwZWN0cnVtLXNlbWFudGljLWN0YS1iYWNrZ3JvdW5kLWNvbG9yLWRvd246IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1zdGF0aWMtYmx1ZS04MDApO1xcbiAgLS1zcGVjdHJ1bS1zZW1hbnRpYy1jdGEtYmFja2dyb3VuZC1jb2xvci1rZXktZm9jdXM6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1zdGF0aWMtYmx1ZS02MDApO1xcbiAgLS1zcGVjdHJ1bS1zZW1hbnRpYy1uZXV0cmFsLWJhY2tncm91bmQtY29sb3ItZGVmYXVsdDogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLXN0YXRpYy1ncmF5LTcwMCk7XFxuICAtLXNwZWN0cnVtLXNlbWFudGljLW5ldXRyYWwtYmFja2dyb3VuZC1jb2xvci1ob3ZlcjogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLXN0YXRpYy1ncmF5LTgwMCk7XFxuICAtLXNwZWN0cnVtLXNlbWFudGljLW5ldXRyYWwtYmFja2dyb3VuZC1jb2xvci1kb3duOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3Itc3RhdGljLWdyYXktOTAwKTtcXG4gIC0tc3BlY3RydW0tc2VtYW50aWMtbmV1dHJhbC1iYWNrZ3JvdW5kLWNvbG9yLWtleS1mb2N1czogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLXN0YXRpYy1ncmF5LTgwMCk7XFxuICAtLXNwZWN0cnVtLXNlbWFudGljLXByZXNlbmNlLWNvbG9yLTE6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1zdGF0aWMtcmVkLTUwMCk7XFxuICAtLXNwZWN0cnVtLXNlbWFudGljLXByZXNlbmNlLWNvbG9yLTI6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1zdGF0aWMtb3JhbmdlLTQwMCk7XFxuICAtLXNwZWN0cnVtLXNlbWFudGljLXByZXNlbmNlLWNvbG9yLTM6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1zdGF0aWMteWVsbG93LTQwMCk7XFxuICAtLXNwZWN0cnVtLXNlbWFudGljLXByZXNlbmNlLWNvbG9yLTQ6IHJnYig3NSwgMjA0LCAxNjIpO1xcbiAgLS1zcGVjdHJ1bS1zZW1hbnRpYy1wcmVzZW5jZS1jb2xvci01OiByZ2IoMCwgMTk5LCAyNTUpO1xcbiAgLS1zcGVjdHJ1bS1zZW1hbnRpYy1wcmVzZW5jZS1jb2xvci02OiByZ2IoMCwgMTQwLCAxODQpO1xcbiAgLS1zcGVjdHJ1bS1zZW1hbnRpYy1wcmVzZW5jZS1jb2xvci03OiByZ2IoMTI2LCA3NSwgMjQzKTtcXG4gIC0tc3BlY3RydW0tc2VtYW50aWMtcHJlc2VuY2UtY29sb3ItODogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLXN0YXRpYy1mdWNoc2lhLTYwMCk7XFxuXFxuXFxuICAvKiBzcGVjdHJ1bS1kaW1lbnNpb25HbG9iYWxzLmNzcyAqL1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXN0YXRpYy1wZXJjZW50LTUwOiA1MCU7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc3RhdGljLXBlcmNlbnQtNzA6IDcwJTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1zdGF0aWMtcGVyY2VudC0xMDA6IDEwMCU7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc3RhdGljLWJyZWFrcG9pbnQteHNtYWxsOiAzMDRweDtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1zdGF0aWMtYnJlYWtwb2ludC1zbWFsbDogNzY4cHg7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc3RhdGljLWJyZWFrcG9pbnQtbWVkaXVtOiAxMjgwcHg7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc3RhdGljLWJyZWFrcG9pbnQtbGFyZ2U6IDE3NjhweDtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1zdGF0aWMtYnJlYWtwb2ludC14bGFyZ2U6IDIxNjBweDtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1zdGF0aWMtZ3JpZC1jb2x1bW5zOiAxMjtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1zdGF0aWMtZ3JpZC1mbHVpZC13aWR0aDogMTAwJTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1zdGF0aWMtZ3JpZC1maXhlZC1tYXgtd2lkdGg6IDEyODBweDtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1zdGF0aWMtc2l6ZS0wOiAwcHg7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc3RhdGljLXNpemUtMTA6IDFweDtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1zdGF0aWMtc2l6ZS0yNTogMnB4O1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXN0YXRpYy1zaXplLTQwOiAzcHg7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc3RhdGljLXNpemUtNTA6IDRweDtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1zdGF0aWMtc2l6ZS02NTogNXB4O1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXN0YXRpYy1zaXplLTc1OiA2cHg7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc3RhdGljLXNpemUtODU6IDdweDtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1zdGF0aWMtc2l6ZS0xMDA6IDhweDtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1zdGF0aWMtc2l6ZS0xMTU6IDlweDtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1zdGF0aWMtc2l6ZS0xMjU6IDEwcHg7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc3RhdGljLXNpemUtMTMwOiAxMXB4O1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXN0YXRpYy1zaXplLTE1MDogMTJweDtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1zdGF0aWMtc2l6ZS0xNjA6IDEzcHg7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc3RhdGljLXNpemUtMTc1OiAxNHB4O1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXN0YXRpYy1zaXplLTIwMDogMTZweDtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1zdGF0aWMtc2l6ZS0yMjU6IDE4cHg7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc3RhdGljLXNpemUtMjUwOiAyMHB4O1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXN0YXRpYy1zaXplLTI3NTogMjJweDtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1zdGF0aWMtc2l6ZS0zMDA6IDI0cHg7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc3RhdGljLXNpemUtMzI1OiAyNnB4O1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXN0YXRpYy1zaXplLTQwMDogMzJweDtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1zdGF0aWMtc2l6ZS00NTA6IDM2cHg7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc3RhdGljLXNpemUtNTAwOiA0MHB4O1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXN0YXRpYy1zaXplLTU1MDogNDRweDtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1zdGF0aWMtc2l6ZS02MDA6IDQ4cHg7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc3RhdGljLXNpemUtNzAwOiA1NnB4O1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXN0YXRpYy1zaXplLTgwMDogNjRweDtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1zdGF0aWMtc2l6ZS05MDA6IDcycHg7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc3RhdGljLXNpemUtMTAwMDogODBweDtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1zdGF0aWMtc2l6ZS0xMjAwOiA5NnB4O1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXN0YXRpYy1zaXplLTE3MDA6IDEzNnB4O1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXN0YXRpYy1zaXplLTI0MDA6IDE5MnB4O1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXN0YXRpYy1zaXplLTI1MDA6IDIwMHB4O1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXN0YXRpYy1zaXplLTI2MDA6IDIwOHB4O1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXN0YXRpYy1zaXplLTI4MDA6IDIyNHB4O1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXN0YXRpYy1zaXplLTMyMDA6IDI1NnB4O1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXN0YXRpYy1zaXplLTM0MDA6IDI3MnB4O1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXN0YXRpYy1zaXplLTM1MDA6IDI4MHB4O1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXN0YXRpYy1zaXplLTM2MDA6IDI4OHB4O1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXN0YXRpYy1zaXplLTM4MDA6IDMwNHB4O1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXN0YXRpYy1zaXplLTQ2MDA6IDM2OHB4O1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXN0YXRpYy1zaXplLTUwMDA6IDQwMHB4O1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXN0YXRpYy1zaXplLTYwMDA6IDQ4MHB4O1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXN0YXRpYy1zaXplLTE2MDAwOiAxMjgwcHg7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc3RhdGljLWZvbnQtc2l6ZS01MDogMTFweDtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1zdGF0aWMtZm9udC1zaXplLTc1OiAxMnB4O1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXN0YXRpYy1mb250LXNpemUtMTAwOiAxNHB4O1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXN0YXRpYy1mb250LXNpemUtMTUwOiAxNXB4O1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXN0YXRpYy1mb250LXNpemUtMjAwOiAxNnB4O1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXN0YXRpYy1mb250LXNpemUtMzAwOiAxOHB4O1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXN0YXRpYy1mb250LXNpemUtNDAwOiAyMHB4O1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXN0YXRpYy1mb250LXNpemUtNTAwOiAyMnB4O1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXN0YXRpYy1mb250LXNpemUtNjAwOiAyNXB4O1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXN0YXRpYy1mb250LXNpemUtNzAwOiAyOHB4O1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXN0YXRpYy1mb250LXNpemUtODAwOiAzMnB4O1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXN0YXRpYy1mb250LXNpemUtOTAwOiAzNnB4O1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXN0YXRpYy1mb250LXNpemUtMTAwMDogNDBweDtcXG5cXG5cXG4gIC8qIHNwZWN0cnVtLWZvbnRHbG9iYWxzLmNzcyAqL1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtZm9udC1mYW1pbHktYmFzZTogYWRvYmUtY2xlYW4sICdTb3VyY2UgU2FucyBQcm8nLCAtYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsICdTZWdvZSBVSScsIFJvYm90bywgVWJ1bnR1LCAnVHJlYnVjaGV0IE1TJywgJ0x1Y2lkYSBHcmFuZGUnLCBzYW5zLXNlcmlmO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtZm9udC1mYW1pbHktc2VyaWY6IGFkb2JlLWNsZWFuLXNlcmlmLCAnU291cmNlIFNlcmlmIFBybycsIEdlb3JnaWEsIHNlcmlmO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtZm9udC1mYW1pbHktY29kZTogJ1NvdXJjZSBDb2RlIFBybycsIE1vbmFjbywgbW9ub3NwYWNlO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtZm9udC13ZWlnaHQtdGhpbjogMTAwO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtZm9udC13ZWlnaHQtdWx0cmEtbGlnaHQ6IDIwMDtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWZvbnQtd2VpZ2h0LWxpZ2h0OiAzMDA7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1mb250LXdlaWdodC1yZWd1bGFyOiA0MDA7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1mb250LXdlaWdodC1tZWRpdW06IDUwMDtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWZvbnQtd2VpZ2h0LXNlbWktYm9sZDogNjAwO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtZm9udC13ZWlnaHQtYm9sZDogNzAwO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtZm9udC13ZWlnaHQtZXh0cmEtYm9sZDogODAwO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtZm9udC13ZWlnaHQtYmxhY2s6IDkwMDtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWZvbnQtc3R5bGUtcmVndWxhcjogbm9ybWFsO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtZm9udC1zdHlsZS1pdGFsaWM6IGl0YWxpYztcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWZvbnQtbGV0dGVyLXNwYWNpbmctbm9uZTogMDtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWZvbnQtbGV0dGVyLXNwYWNpbmctc21hbGw6IDAuMDEyNWVtO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtZm9udC1sZXR0ZXItc3BhY2luZy1oYW46IDAuMDVlbTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWZvbnQtbGV0dGVyLXNwYWNpbmctbWVkaXVtOiAwLjA2ZW07XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1mb250LWxpbmUtaGVpZ2h0LWxhcmdlOiAxLjc7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1mb250LWxpbmUtaGVpZ2h0LW1lZGl1bTogMS41O1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtZm9udC1saW5lLWhlaWdodC1zbWFsbDogMS4zO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtZm9udC1tdWx0aXBsaWVyLTA6IDBlbTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWZvbnQtbXVsdGlwbGllci0yNTogMC4yNWVtO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtZm9udC1tdWx0aXBsaWVyLTc1OiAwLjc1ZW07XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1mb250LWZvbnQtZmFtaWx5LWFyOiBteXJpYWQtYXJhYmljLCBhZG9iZS1jbGVhbiwgJ1NvdXJjZSBTYW5zIFBybycsIC1hcHBsZS1zeXN0ZW0sIEJsaW5rTWFjU3lzdGVtRm9udCwgJ1NlZ29lIFVJJywgUm9ib3RvLCBVYnVudHUsICdUcmVidWNoZXQgTVMnLCAnTHVjaWRhIEdyYW5kZScsIHNhbnMtc2VyaWY7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1mb250LWZvbnQtZmFtaWx5LWhlOiBteXJpYWQtaGVicmV3LCBhZG9iZS1jbGVhbiwgJ1NvdXJjZSBTYW5zIFBybycsIC1hcHBsZS1zeXN0ZW0sIEJsaW5rTWFjU3lzdGVtRm9udCwgJ1NlZ29lIFVJJywgUm9ib3RvLCBVYnVudHUsICdUcmVidWNoZXQgTVMnLCAnTHVjaWRhIEdyYW5kZScsIHNhbnMtc2VyaWY7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1mb250LWZvbnQtZmFtaWx5LXpoOiBhZG9iZS1jbGVhbi1oYW4tdHJhZGl0aW9uYWwsIHNvdXJjZS1oYW4tdHJhZGl0aW9uYWwsICdNaW5nTGl1JywgJ0hlaXRpIFRDIExpZ2h0JywgJ3NhbnMtc2VyaWYnO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtZm9udC1mb250LWZhbWlseS16aGhhbnM6IGFkb2JlLWNsZWFuLWhhbi1zaW1wbGlmaWVkLWMsIHNvdXJjZS1oYW4tc2ltcGxpZmllZC1jLCAnU2ltU3VuJywgJ0hlaXRpIFNDIExpZ2h0JywgJ3NhbnMtc2VyaWYnO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtZm9udC1mb250LWZhbWlseS1rbzogYWRvYmUtY2xlYW4taGFuLWtvcmVhbiwgc291cmNlLWhhbi1rb3JlYW4sICdNYWxndW4gR290aGljJywgJ0FwcGxlIEdvdGhpYycsICdzYW5zLXNlcmlmJztcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWZvbnQtZm9udC1mYW1pbHktamE6IGFkb2JlLWNsZWFuLWhhbi1qYXBhbmVzZSwgJ0hpcmFnaW5vIEtha3UgR290aGljIFByb04nLCAn44OS44Op44Ku44OO6KeS44K0IFByb04gVzMnLCAnT3Nha2EnLCBZdUdvdGhpYywgJ1l1IEdvdGhpYycsICfjg6HjgqTjg6rjgqonLCBNZWlyeW8sICfvvK3vvLMg77yw44K044K344OD44KvJywgJ01TIFBHb3RoaWMnLCAnc2Fucy1zZXJpZic7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1mb250LWZvbnQtZmFtaWx5LWNvbmRlbnNlZDogYWRvYmUtY2xlYW4taGFuLXRyYWRpdGlvbmFsLCBzb3VyY2UtaGFuLXRyYWRpdGlvbmFsLCAnTWluZ0xpdScsICdIZWl0aSBUQyBMaWdodCcsIGFkb2JlLWNsZWFuLCAnU291cmNlIFNhbnMgUHJvJywgLWFwcGxlLXN5c3RlbSwgQmxpbmtNYWNTeXN0ZW1Gb250LCAnU2Vnb2UgVUknLCBSb2JvdG8sIFVidW50dSwgJ1RyZWJ1Y2hldCBNUycsICdMdWNpZGEgR3JhbmRlJywgc2Fucy1zZXJpZjtcXG5cXG5cXG4gIC8qIHNwZWN0cnVtLXN0YXRpY0FsaWFzZXMuY3NzICovXFxuICAtLXNwZWN0cnVtLWFsaWFzLWJvcmRlci1zaXplLXRoaW46IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc3RhdGljLXNpemUtMTApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1ib3JkZXItc2l6ZS10aGljazogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1zdGF0aWMtc2l6ZS0yNSk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWJvcmRlci1zaXplLXRoaWNrZXI6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc3RhdGljLXNpemUtNTApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1ib3JkZXItc2l6ZS10aGlja2VzdDogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1zdGF0aWMtc2l6ZS0xMDApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1ib3JkZXItb2Zmc2V0LXRoaW46IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc3RhdGljLXNpemUtMjUpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1ib3JkZXItb2Zmc2V0LXRoaWNrOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXN0YXRpYy1zaXplLTUwKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtYm9yZGVyLW9mZnNldC10aGlja2VyOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXN0YXRpYy1zaXplLTEwMCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWJvcmRlci1vZmZzZXQtdGhpY2tlc3Q6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc3RhdGljLXNpemUtMjAwKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtZ3JpZC1iYXNlbGluZTogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1zdGF0aWMtc2l6ZS0xMDApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1ncmlkLWd1dHRlci14c21hbGw6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc3RhdGljLXNpemUtMjAwKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtZ3JpZC1ndXR0ZXItc21hbGw6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc3RhdGljLXNpemUtMzAwKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtZ3JpZC1ndXR0ZXItbWVkaXVtOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXN0YXRpYy1zaXplLTQwMCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWdyaWQtZ3V0dGVyLWxhcmdlOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXN0YXRpYy1zaXplLTUwMCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWdyaWQtZ3V0dGVyLXhsYXJnZTogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1zdGF0aWMtc2l6ZS02MDApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1ncmlkLW1hcmdpbi14c21hbGw6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc3RhdGljLXNpemUtMjAwKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtZ3JpZC1tYXJnaW4tc21hbGw6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc3RhdGljLXNpemUtMzAwKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtZ3JpZC1tYXJnaW4tbWVkaXVtOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXN0YXRpYy1zaXplLTQwMCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWdyaWQtbWFyZ2luLWxhcmdlOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXN0YXRpYy1zaXplLTUwMCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWdyaWQtbWFyZ2luLXhsYXJnZTogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1zdGF0aWMtc2l6ZS02MDApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1ncmlkLWxheW91dC1yZWdpb24tbWFyZ2luLWJvdHRvbS14c21hbGw6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc3RhdGljLXNpemUtMjAwKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtZ3JpZC1sYXlvdXQtcmVnaW9uLW1hcmdpbi1ib3R0b20tc21hbGw6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc3RhdGljLXNpemUtMzAwKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtZ3JpZC1sYXlvdXQtcmVnaW9uLW1hcmdpbi1ib3R0b20tbWVkaXVtOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXN0YXRpYy1zaXplLTQwMCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWdyaWQtbGF5b3V0LXJlZ2lvbi1tYXJnaW4tYm90dG9tLWxhcmdlOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXN0YXRpYy1zaXplLTUwMCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWdyaWQtbGF5b3V0LXJlZ2lvbi1tYXJnaW4tYm90dG9tLXhsYXJnZTogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1zdGF0aWMtc2l6ZS02MDApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1yYWRpYWwtcmVhY3Rpb24tc2l6ZS1kZWZhdWx0OiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXN0YXRpYy1zaXplLTU1MCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWZvY3VzLXJpbmctZ2FwOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXN0YXRpYy1zaXplLTI1KTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtZm9jdXMtcmluZy1zaXplOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXN0YXRpYy1zaXplLTI1KTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtbG91cGUtZW50cnktYW5pbWF0aW9uLWR1cmF0aW9uOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtYW5pbWF0aW9uLWR1cmF0aW9uLTMwMCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWxvdXBlLWV4aXQtYW5pbWF0aW9uLWR1cmF0aW9uOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtYW5pbWF0aW9uLWR1cmF0aW9uLTMwMCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWhlYWRpbmctdGV4dC1saW5lLWhlaWdodDogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWZvbnQtbGluZS1oZWlnaHQtc21hbGwpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1oZWFkaW5nLXRleHQtZm9udC13ZWlnaHQtcmVndWxhcjogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWZvbnQtd2VpZ2h0LWJvbGQpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1oZWFkaW5nLXRleHQtZm9udC13ZWlnaHQtcmVndWxhci1zdHJvbmc6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1mb250LXdlaWdodC1ibGFjayk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWhlYWRpbmctdGV4dC1mb250LXdlaWdodC1saWdodDogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWZvbnQtd2VpZ2h0LWxpZ2h0KTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtaGVhZGluZy10ZXh0LWZvbnQtd2VpZ2h0LWxpZ2h0LXN0cm9uZzogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWZvbnQtd2VpZ2h0LWJvbGQpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1oZWFkaW5nLXRleHQtZm9udC13ZWlnaHQtaGVhdnk6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1mb250LXdlaWdodC1ibGFjayk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWhlYWRpbmctdGV4dC1mb250LXdlaWdodC1oZWF2eS1zdHJvbmc6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1mb250LXdlaWdodC1ibGFjayk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWhlYWRpbmctdGV4dC1mb250LXdlaWdodC1xdWlldDogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWZvbnQtd2VpZ2h0LWxpZ2h0KTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtaGVhZGluZy10ZXh0LWZvbnQtd2VpZ2h0LXF1aWV0LXN0cm9uZzogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWZvbnQtd2VpZ2h0LWJvbGQpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1oZWFkaW5nLXRleHQtZm9udC13ZWlnaHQtc3Ryb25nOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZm9udC13ZWlnaHQtYmxhY2spO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1oZWFkaW5nLXRleHQtZm9udC13ZWlnaHQtc3Ryb25nLXN0cm9uZzogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWZvbnQtd2VpZ2h0LWJsYWNrKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtaGVhZGluZy1tYXJnaW4tYm90dG9tOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZm9udC1tdWx0aXBsaWVyLTI1KTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtc3ViaGVhZGluZy10ZXh0LWZvbnQtd2VpZ2h0OiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZm9udC13ZWlnaHQtYm9sZCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLXN1YmhlYWRpbmctdGV4dC1mb250LXdlaWdodC1zdHJvbmc6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1mb250LXdlaWdodC1ibGFjayk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWJvZHktdGV4dC1mb250LWZhbWlseTogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWZvbnQtZmFtaWx5LWJhc2UpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1ib2R5LXRleHQtbGluZS1oZWlnaHQ6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1mb250LWxpbmUtaGVpZ2h0LW1lZGl1bSk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWJvZHktdGV4dC1mb250LXdlaWdodDogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWZvbnQtd2VpZ2h0LXJlZ3VsYXIpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1ib2R5LXRleHQtZm9udC13ZWlnaHQtc3Ryb25nOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZm9udC13ZWlnaHQtYm9sZCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWJvZHktbWFyZ2luLWJvdHRvbTogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWZvbnQtbXVsdGlwbGllci03NSk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWRldGFpbC10ZXh0LWZvbnQtd2VpZ2h0OiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZm9udC13ZWlnaHQtYm9sZCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWRldGFpbC10ZXh0LWZvbnQtd2VpZ2h0LXJlZ3VsYXI6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1mb250LXdlaWdodC1ib2xkKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtZGV0YWlsLXRleHQtZm9udC13ZWlnaHQtbGlnaHQ6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1mb250LXdlaWdodC1yZWd1bGFyKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtZGV0YWlsLXRleHQtZm9udC13ZWlnaHQtc3Ryb25nOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZm9udC13ZWlnaHQtYmxhY2spO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1hcnRpY2xlLWhlYWRpbmctdGV4dC1mb250LXdlaWdodDogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWZvbnQtd2VpZ2h0LWJvbGQpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1hcnRpY2xlLWhlYWRpbmctdGV4dC1mb250LXdlaWdodC1zdHJvbmc6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1mb250LXdlaWdodC1ibGFjayk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWFydGljbGUtaGVhZGluZy10ZXh0LWZvbnQtd2VpZ2h0LXF1aWV0OiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZm9udC13ZWlnaHQtcmVndWxhcik7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWFydGljbGUtaGVhZGluZy10ZXh0LWZvbnQtd2VpZ2h0LXF1aWV0LXN0cm9uZzogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWZvbnQtd2VpZ2h0LWJvbGQpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1hcnRpY2xlLWJvZHktdGV4dC1mb250LXdlaWdodDogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWZvbnQtd2VpZ2h0LXJlZ3VsYXIpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1hcnRpY2xlLWJvZHktdGV4dC1mb250LXdlaWdodC1zdHJvbmc6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1mb250LXdlaWdodC1ibGFjayk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWFydGljbGUtc3ViaGVhZGluZy10ZXh0LWZvbnQtd2VpZ2h0OiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZm9udC13ZWlnaHQtYm9sZCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWFydGljbGUtc3ViaGVhZGluZy10ZXh0LWZvbnQtd2VpZ2h0LXN0cm9uZzogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWZvbnQtd2VpZ2h0LWJsYWNrKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtYXJ0aWNsZS1kZXRhaWwtdGV4dC1mb250LXdlaWdodDogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWZvbnQtd2VpZ2h0LXJlZ3VsYXIpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1hcnRpY2xlLWRldGFpbC10ZXh0LWZvbnQtd2VpZ2h0LXN0cm9uZzogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWZvbnQtd2VpZ2h0LWJvbGQpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1jb2RlLXRleHQtZm9udC1mYW1pbHk6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1mb250LWZhbWlseS1jb2RlKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtY29kZS10ZXh0LWZvbnQtd2VpZ2h0LXJlZ3VsYXI6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1mb250LXdlaWdodC1yZWd1bGFyKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtY29kZS10ZXh0LWZvbnQtd2VpZ2h0LXN0cm9uZzogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWZvbnQtd2VpZ2h0LWJvbGQpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1jb2RlLXRleHQtbGluZS1oZWlnaHQ6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1mb250LWxpbmUtaGVpZ2h0LW1lZGl1bSk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWNvZGUtbWFyZ2luLWJvdHRvbTogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWZvbnQtbXVsdGlwbGllci0wKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtZm9udC1mYW1pbHktYXI6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1mb250LWZvbnQtZmFtaWx5LWFyKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtZm9udC1mYW1pbHktaGU6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1mb250LWZvbnQtZmFtaWx5LWhlKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtZm9udC1mYW1pbHktemg6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1mb250LWZvbnQtZmFtaWx5LXpoKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtZm9udC1mYW1pbHktemhoYW5zOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZm9udC1mb250LWZhbWlseS16aGhhbnMpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1mb250LWZhbWlseS1rbzogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWZvbnQtZm9udC1mYW1pbHkta28pO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1mb250LWZhbWlseS1qYTogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWZvbnQtZm9udC1mYW1pbHktamEpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1mb250LWZhbWlseS1jb25kZW5zZWQ6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1mb250LWZvbnQtZmFtaWx5LWNvbmRlbnNlZCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWJ1dHRvbi10ZXh0LWxpbmUtaGVpZ2h0OiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZm9udC1saW5lLWhlaWdodC1zbWFsbCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWNvbXBvbmVudC10ZXh0LWxpbmUtaGVpZ2h0OiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZm9udC1saW5lLWhlaWdodC1zbWFsbCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWhhbi1jb21wb25lbnQtdGV4dC1saW5lLWhlaWdodDogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWZvbnQtbGluZS1oZWlnaHQtbWVkaXVtKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtc2VyaWYtdGV4dC1mb250LWZhbWlseTogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWZvbnQtZmFtaWx5LXNlcmlmKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtaGFuLWhlYWRpbmctdGV4dC1saW5lLWhlaWdodDogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWZvbnQtbGluZS1oZWlnaHQtbWVkaXVtKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtaGFuLWhlYWRpbmctdGV4dC1mb250LXdlaWdodC1yZWd1bGFyOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZm9udC13ZWlnaHQtYm9sZCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWhhbi1oZWFkaW5nLXRleHQtZm9udC13ZWlnaHQtcmVndWxhci1lbXBoYXNpczogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWZvbnQtd2VpZ2h0LWV4dHJhLWJvbGQpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1oYW4taGVhZGluZy10ZXh0LWZvbnQtd2VpZ2h0LXJlZ3VsYXItc3Ryb25nOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZm9udC13ZWlnaHQtYmxhY2spO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1oYW4taGVhZGluZy10ZXh0LWZvbnQtd2VpZ2h0LXF1aWV0LXN0cm9uZzogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWZvbnQtd2VpZ2h0LWJvbGQpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1oYW4taGVhZGluZy10ZXh0LWZvbnQtd2VpZ2h0LWxpZ2h0OiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZm9udC13ZWlnaHQtbGlnaHQpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1oYW4taGVhZGluZy10ZXh0LWZvbnQtd2VpZ2h0LWxpZ2h0LWVtcGhhc2lzOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZm9udC13ZWlnaHQtcmVndWxhcik7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWhhbi1oZWFkaW5nLXRleHQtZm9udC13ZWlnaHQtbGlnaHQtc3Ryb25nOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZm9udC13ZWlnaHQtYm9sZCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWhhbi1oZWFkaW5nLXRleHQtZm9udC13ZWlnaHQtaGVhdnk6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1mb250LXdlaWdodC1ibGFjayk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWhhbi1oZWFkaW5nLXRleHQtZm9udC13ZWlnaHQtaGVhdnktZW1waGFzaXM6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1mb250LXdlaWdodC1ibGFjayk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWhhbi1oZWFkaW5nLXRleHQtZm9udC13ZWlnaHQtaGVhdnktc3Ryb25nOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZm9udC13ZWlnaHQtYmxhY2spO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1oYW4tYm9keS10ZXh0LWxpbmUtaGVpZ2h0OiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZm9udC1saW5lLWhlaWdodC1sYXJnZSk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWhhbi1ib2R5LXRleHQtZm9udC13ZWlnaHQtcmVndWxhcjogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWZvbnQtd2VpZ2h0LXJlZ3VsYXIpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1oYW4tYm9keS10ZXh0LWZvbnQtd2VpZ2h0LWVtcGhhc2lzOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZm9udC13ZWlnaHQtYm9sZCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWhhbi1ib2R5LXRleHQtZm9udC13ZWlnaHQtc3Ryb25nOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZm9udC13ZWlnaHQtYmxhY2spO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1oYW4tc3ViaGVhZGluZy10ZXh0LWZvbnQtd2VpZ2h0LXJlZ3VsYXI6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1mb250LXdlaWdodC1ib2xkKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtaGFuLXN1YmhlYWRpbmctdGV4dC1mb250LXdlaWdodC1lbXBoYXNpczogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWZvbnQtd2VpZ2h0LWV4dHJhLWJvbGQpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1oYW4tc3ViaGVhZGluZy10ZXh0LWZvbnQtd2VpZ2h0LXN0cm9uZzogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWZvbnQtd2VpZ2h0LWJsYWNrKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtaGFuLWRldGFpbC10ZXh0LWZvbnQtd2VpZ2h0OiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZm9udC13ZWlnaHQtcmVndWxhcik7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWhhbi1kZXRhaWwtdGV4dC1mb250LXdlaWdodC1lbXBoYXNpczogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWZvbnQtd2VpZ2h0LWJvbGQpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1oYW4tZGV0YWlsLXRleHQtZm9udC13ZWlnaHQtc3Ryb25nOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZm9udC13ZWlnaHQtYmxhY2spO1xcblxcbn1cXG5cXG4uc3BlY3RydW0tLW1lZGl1bSxcXG4uc3BlY3RydW0tLWxhcmdlIHtcXG4gIC8qIHNwZWN0cnVtLWRpbWVuc2lvbkFsaWFzZXMuY3NzICovXFxuICAtLXNwZWN0cnVtLWFsaWFzLWl0ZW0taGVpZ2h0LXM6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc2l6ZS0zMDApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1pdGVtLWhlaWdodC1tOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXNpemUtNDAwKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtaXRlbS1oZWlnaHQtbDogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1zaXplLTUwMCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWl0ZW0taGVpZ2h0LXhsOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXNpemUtNjAwKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtaXRlbS1yb3VuZGVkLWJvcmRlci1yYWRpdXMtczogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1zaXplLTE1MCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWl0ZW0tcm91bmRlZC1ib3JkZXItcmFkaXVzLW06IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc2l6ZS0yMDApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1pdGVtLXJvdW5kZWQtYm9yZGVyLXJhZGl1cy1sOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXNpemUtMjUwKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtaXRlbS1yb3VuZGVkLWJvcmRlci1yYWRpdXMteGw6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc2l6ZS0zMDApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1pdGVtLXRleHQtc2l6ZS1zOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLWZvbnQtc2l6ZS03NSk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWl0ZW0tdGV4dC1zaXplLW06IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tZm9udC1zaXplLTEwMCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWl0ZW0tdGV4dC1zaXplLWw6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tZm9udC1zaXplLTIwMCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWl0ZW0tdGV4dC1zaXplLXhsOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLWZvbnQtc2l6ZS0zMDApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1pdGVtLXRleHQtcGFkZGluZy10b3AtczogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1zdGF0aWMtc2l6ZS01MCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWl0ZW0tdGV4dC1wYWRkaW5nLXRvcC1tOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXNpemUtNzUpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1pdGVtLXRleHQtcGFkZGluZy10b3AteGw6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc2l6ZS0xNTApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1pdGVtLXRleHQtcGFkZGluZy1ib3R0b20tbTogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1zaXplLTExNSk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWl0ZW0tdGV4dC1wYWRkaW5nLWJvdHRvbS1sOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXNpemUtMTMwKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtaXRlbS10ZXh0LXBhZGRpbmctYm90dG9tLXhsOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXNpemUtMTc1KTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtaXRlbS1pY29uLXBhZGRpbmctdG9wLXM6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc2l6ZS01MCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWl0ZW0taWNvbi1wYWRkaW5nLXRvcC1tOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXNpemUtODUpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1pdGVtLWljb24tcGFkZGluZy10b3AtbDogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1zaXplLTEyNSk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWl0ZW0taWNvbi1wYWRkaW5nLXRvcC14bDogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1zaXplLTE2MCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWl0ZW0taWNvbi1wYWRkaW5nLWJvdHRvbS1zOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXNpemUtNTApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1pdGVtLWljb24tcGFkZGluZy1ib3R0b20tbTogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1zaXplLTg1KTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtaXRlbS1pY29uLXBhZGRpbmctYm90dG9tLWw6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc2l6ZS0xMjUpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1pdGVtLWljb24tcGFkZGluZy1ib3R0b20teGw6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc2l6ZS0xNjApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1pdGVtLXBhZGRpbmctczogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1zaXplLTExNSk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWl0ZW0tcGFkZGluZy1tOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXNpemUtMTUwKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtaXRlbS1wYWRkaW5nLWw6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc2l6ZS0xODUpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1pdGVtLXBhZGRpbmcteGw6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc2l6ZS0yMjUpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1pdGVtLXJvdW5kZWQtcGFkZGluZy1zOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXNpemUtMTUwKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtaXRlbS1yb3VuZGVkLXBhZGRpbmctbTogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1zaXplLTIwMCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWl0ZW0tcm91bmRlZC1wYWRkaW5nLWw6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc2l6ZS0yNTApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1pdGVtLXJvdW5kZWQtcGFkZGluZy14bDogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1zaXplLTMwMCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWl0ZW0taWNvbm9ubHktcGFkZGluZy1zOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXNpemUtNTApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1pdGVtLWljb25vbmx5LXBhZGRpbmctbTogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1zaXplLTg1KTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtaXRlbS1pY29ub25seS1wYWRkaW5nLWw6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc2l6ZS0xMjUpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1pdGVtLWljb25vbmx5LXBhZGRpbmcteGw6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc2l6ZS0xNjApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1pdGVtLWNvbnRyb2wtZ2FwLXM6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc2l6ZS0xMTUpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1pdGVtLWNvbnRyb2wtZ2FwLW06IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc2l6ZS0xMjUpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1pdGVtLWNvbnRyb2wtZ2FwLWw6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc2l6ZS0xMzApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1pdGVtLWNvbnRyb2wtZ2FwLXhsOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXNpemUtMTYwKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtaXRlbS13b3JrZmxvdy1pY29uLWdhcC1zOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXNpemUtODUpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1pdGVtLXdvcmtmbG93LWljb24tZ2FwLW06IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc2l6ZS0xMDApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1pdGVtLXdvcmtmbG93LWljb24tZ2FwLWw6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc2l6ZS0xMTUpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1pdGVtLXdvcmtmbG93LWljb24tZ2FwLXhsOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXNpemUtMTI1KTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtaXRlbS1tYXJrLWdhcC1zOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXNpemUtODUpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1pdGVtLW1hcmstZ2FwLW06IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc2l6ZS0xMDApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1pdGVtLW1hcmstZ2FwLWw6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc2l6ZS0xMTUpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1pdGVtLW1hcmstZ2FwLXhsOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXNpemUtMTI1KTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtaXRlbS11aS1pY29uLWdhcC1zOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXNpemUtODUpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1pdGVtLXVpLWljb24tZ2FwLW06IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc2l6ZS0xMDApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1pdGVtLXVpLWljb24tZ2FwLWw6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc2l6ZS0xMTUpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1pdGVtLXVpLWljb24tZ2FwLXhsOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXNpemUtMTI1KTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtaXRlbS1jbGVhcmJ1dHRvbi1nYXAtczogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1zaXplLTUwKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtaXRlbS1jbGVhcmJ1dHRvbi1nYXAtbTogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1zaXplLTg1KTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtaXRlbS1jbGVhcmJ1dHRvbi1nYXAtbDogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1zaXplLTEyNSk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWl0ZW0tY2xlYXJidXR0b24tZ2FwLXhsOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXNpemUtMTUwKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtaXRlbS13b3JrZmxvdy1wYWRkaW5nLWxlZnQtczogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1zaXplLTg1KTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtaXRlbS13b3JrZmxvdy1wYWRkaW5nLWxlZnQtbDogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1zaXplLTE2MCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWl0ZW0td29ya2Zsb3ctcGFkZGluZy1sZWZ0LXhsOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXNpemUtMTg1KTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtaXRlbS1yb3VuZGVkLXdvcmtmbG93LXBhZGRpbmctbGVmdC1zOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXNpemUtMTI1KTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtaXRlbS1yb3VuZGVkLXdvcmtmbG93LXBhZGRpbmctbGVmdC1sOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXNpemUtMjI1KTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtaXRlbS1tYXJrLXBhZGRpbmctdG9wLXM6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc2l6ZS00MCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWl0ZW0tbWFyay1wYWRkaW5nLXRvcC1sOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXNpemUtMTE1KTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtaXRlbS1tYXJrLXBhZGRpbmctdG9wLXhsOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXNpemUtMTMwKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtaXRlbS1tYXJrLXBhZGRpbmctYm90dG9tLXM6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc2l6ZS00MCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWl0ZW0tbWFyay1wYWRkaW5nLWJvdHRvbS1sOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXNpemUtMTE1KTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtaXRlbS1tYXJrLXBhZGRpbmctYm90dG9tLXhsOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXNpemUtMTMwKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtaXRlbS1tYXJrLXBhZGRpbmctbGVmdC1zOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXNpemUtODUpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1pdGVtLW1hcmstcGFkZGluZy1sZWZ0LWw6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc2l6ZS0xNjApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1pdGVtLW1hcmstcGFkZGluZy1sZWZ0LXhsOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXNpemUtMTg1KTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtaXRlbS1jb250cm9sLTEtc2l6ZS1zOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXN0YXRpYy1zaXplLTEwMCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWl0ZW0tY29udHJvbC0xLXNpemUtbTogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1zaXplLTEwMCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWl0ZW0tY29udHJvbC0yLXNpemUtbTogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1zaXplLTE3NSk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWl0ZW0tY29udHJvbC0yLXNpemUtbDogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1zaXplLTIwMCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWl0ZW0tY29udHJvbC0yLXNpemUteGw6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc2l6ZS0yMjUpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1pdGVtLWNvbnRyb2wtMi1zaXplLXh4bDogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1zaXplLTI1MCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWl0ZW0tY29udHJvbC0yLWJvcmRlci1yYWRpdXMtczogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1zaXplLTc1KTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtaXRlbS1jb250cm9sLTItYm9yZGVyLXJhZGl1cy1tOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXNpemUtODUpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1pdGVtLWNvbnRyb2wtMi1ib3JkZXItcmFkaXVzLWw6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc2l6ZS0xMDApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1pdGVtLWNvbnRyb2wtMi1ib3JkZXItcmFkaXVzLXhsOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXNpemUtMTE1KTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtaXRlbS1jb250cm9sLTItYm9yZGVyLXJhZGl1cy14eGw6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc2l6ZS0xMjUpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1pdGVtLWNvbnRyb2wtMi1wYWRkaW5nLXM6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc2l6ZS03NSk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWl0ZW0tY29udHJvbC0yLXBhZGRpbmctbTogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1zaXplLTExNSk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWl0ZW0tY29udHJvbC0yLXBhZGRpbmctbDogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1zaXplLTE1MCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWl0ZW0tY29udHJvbC0yLXBhZGRpbmcteGw6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc2l6ZS0xODUpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1pdGVtLWNvbnRyb2wtMy1oZWlnaHQtbTogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1zaXplLTE3NSk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWl0ZW0tY29udHJvbC0zLWhlaWdodC1sOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXNpemUtMjAwKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtaXRlbS1jb250cm9sLTMtaGVpZ2h0LXhsOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXNpemUtMjI1KTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtaXRlbS1jb250cm9sLTMtYm9yZGVyLXJhZGl1cy1zOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXNpemUtNzUpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1pdGVtLWNvbnRyb2wtMy1ib3JkZXItcmFkaXVzLW06IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc2l6ZS04NSk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWl0ZW0tY29udHJvbC0zLWJvcmRlci1yYWRpdXMtbDogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1zaXplLTEwMCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWl0ZW0tY29udHJvbC0zLWJvcmRlci1yYWRpdXMteGw6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc2l6ZS0xMTUpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1pdGVtLWNvbnRyb2wtMy1wYWRkaW5nLXM6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc2l6ZS03NSk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWl0ZW0tY29udHJvbC0zLXBhZGRpbmctbTogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1zaXplLTExNSk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWl0ZW0tY29udHJvbC0zLXBhZGRpbmctbDogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1zaXplLTE1MCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWl0ZW0tY29udHJvbC0zLXBhZGRpbmcteGw6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc2l6ZS0xODUpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1pdGVtLW1hcmstc2l6ZS1zOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXNpemUtMjI1KTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtaXRlbS1tYXJrLXNpemUtbDogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1zaXplLTI3NSk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWl0ZW0tbWFyay1zaXplLXhsOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXNpemUtMzI1KTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtaGVhZGluZy14eHhsLXRleHQtc2l6ZTogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1mb250LXNpemUtMTMwMCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWhlYWRpbmcteHhsLXRleHQtc2l6ZTogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1mb250LXNpemUtMTEwMCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWhlYWRpbmcteGwtdGV4dC1zaXplOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLWZvbnQtc2l6ZS05MDApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1oZWFkaW5nLWwtdGV4dC1zaXplOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLWZvbnQtc2l6ZS03MDApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1oZWFkaW5nLW0tdGV4dC1zaXplOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLWZvbnQtc2l6ZS01MDApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1oZWFkaW5nLXMtdGV4dC1zaXplOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLWZvbnQtc2l6ZS0zMDApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1oZWFkaW5nLXhzLXRleHQtc2l6ZTogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1mb250LXNpemUtMjAwKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtaGVhZGluZy14eHMtdGV4dC1zaXplOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLWZvbnQtc2l6ZS0xMDApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1oZWFkaW5nLXh4eGwtbWFyZ2luLXRvcDogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1mb250LXNpemUtMTIwMCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWhlYWRpbmcteHhsLW1hcmdpbi10b3A6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tZm9udC1zaXplLTkwMCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWhlYWRpbmcteGwtbWFyZ2luLXRvcDogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1mb250LXNpemUtODAwKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtaGVhZGluZy1sLW1hcmdpbi10b3A6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tZm9udC1zaXplLTYwMCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWhlYWRpbmctbS1tYXJnaW4tdG9wOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLWZvbnQtc2l6ZS00MDApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1oZWFkaW5nLXMtbWFyZ2luLXRvcDogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1mb250LXNpemUtMjAwKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtaGVhZGluZy14cy1tYXJnaW4tdG9wOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLWZvbnQtc2l6ZS0xMDApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1oZWFkaW5nLXh4cy1tYXJnaW4tdG9wOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLWZvbnQtc2l6ZS03NSk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWhlYWRpbmctaGFuLXh4eGwtdGV4dC1zaXplOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLWZvbnQtc2l6ZS0xMzAwKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtaGVhZGluZy1oYW4teHhsLXRleHQtc2l6ZTogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1mb250LXNpemUtOTAwKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtaGVhZGluZy1oYW4teGwtdGV4dC1zaXplOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLWZvbnQtc2l6ZS04MDApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1oZWFkaW5nLWhhbi1sLXRleHQtc2l6ZTogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1mb250LXNpemUtNjAwKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtaGVhZGluZy1oYW4tbS10ZXh0LXNpemU6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tZm9udC1zaXplLTQwMCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWhlYWRpbmctaGFuLXMtdGV4dC1zaXplOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLWZvbnQtc2l6ZS0zMDApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1oZWFkaW5nLWhhbi14cy10ZXh0LXNpemU6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tZm9udC1zaXplLTIwMCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWhlYWRpbmctaGFuLXh4cy10ZXh0LXNpemU6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tZm9udC1zaXplLTEwMCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWhlYWRpbmctaGFuLXh4eGwtbWFyZ2luLXRvcDogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1mb250LXNpemUtMTIwMCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWhlYWRpbmctaGFuLXh4bC1tYXJnaW4tdG9wOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLWZvbnQtc2l6ZS04MDApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1oZWFkaW5nLWhhbi14bC1tYXJnaW4tdG9wOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLWZvbnQtc2l6ZS03MDApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1oZWFkaW5nLWhhbi1sLW1hcmdpbi10b3A6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tZm9udC1zaXplLTUwMCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWhlYWRpbmctaGFuLW0tbWFyZ2luLXRvcDogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1mb250LXNpemUtMzAwKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtaGVhZGluZy1oYW4tcy1tYXJnaW4tdG9wOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLWZvbnQtc2l6ZS0yMDApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1oZWFkaW5nLWhhbi14cy1tYXJnaW4tdG9wOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLWZvbnQtc2l6ZS0xMDApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1oZWFkaW5nLWhhbi14eHMtbWFyZ2luLXRvcDogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1mb250LXNpemUtNzUpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1jb21wb25lbnQtYm9yZGVyLXJhZGl1czogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1zaXplLTUwKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtY29tcG9uZW50LWJvcmRlci1yYWRpdXMtcXVpZXQ6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc3RhdGljLXNpemUtMCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWNvbXBvbmVudC1mb2N1c3JpbmctZ2FwOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXN0YXRpYy1zaXplLTApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1jb21wb25lbnQtZm9jdXNyaW5nLWdhcC1lbXBoYXNpemVkOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXN0YXRpYy1zaXplLTI1KTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtY29tcG9uZW50LWZvY3VzcmluZy1zaXplOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXN0YXRpYy1zaXplLTEwKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtY29tcG9uZW50LWZvY3VzcmluZy1zaXplLWVtcGhhc2l6ZWQ6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc3RhdGljLXNpemUtMjUpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1jb21wb25lbnQtZm9jdXNyaW5nLWJvcmRlci1yYWRpdXM6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc2l6ZS03NSk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWlucHV0LWJvcmRlci1zaXplOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXN0YXRpYy1zaXplLTEwKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtaW5wdXQtZm9jdXNyaW5nLWdhcDogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1zdGF0aWMtc2l6ZS0wKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtaW5wdXQtcXVpZXQtZm9jdXNsaW5lLWdhcDogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1zdGF0aWMtc2l6ZS0xMCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWNvbnRyb2wtdHdvLXNpemUtbTogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1zaXplLTE3NSk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWNvbnRyb2wtdHdvLXNpemUtbDogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1zaXplLTIwMCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWNvbnRyb2wtdHdvLXNpemUteGw6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc2l6ZS0yMjUpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1jb250cm9sLXR3by1zaXplLXh4bDogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1zaXplLTI1MCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWNvbnRyb2wtdHdvLWJvcmRlci1yYWRpdXMtczogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1zaXplLTc1KTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtY29udHJvbC10d28tYm9yZGVyLXJhZGl1cy1tOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXNpemUtODUpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1jb250cm9sLXR3by1ib3JkZXItcmFkaXVzLWw6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc2l6ZS0xMDApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1jb250cm9sLXR3by1ib3JkZXItcmFkaXVzLXhsOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXNpemUtMTE1KTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtY29udHJvbC10d28tYm9yZGVyLXJhZGl1cy14eGw6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc2l6ZS0xMjUpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1jb250cm9sLXRocmVlLWhlaWdodC1tOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXNpemUtMTc1KTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtY29udHJvbC10aHJlZS1oZWlnaHQtbDogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1zaXplLTIwMCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWNvbnRyb2wtdGhyZWUtaGVpZ2h0LXhsOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXNpemUtMjI1KTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtaW5maWVsZGJ1dHRvbi1pY29uLW1hcmdpbi15LXM6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc2l6ZS01MCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWluZmllbGRidXR0b24taWNvbi1tYXJnaW4teS1tOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXNpemUtODUpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1pbmZpZWxkYnV0dG9uLWljb24tbWFyZ2luLXktbDogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1zaXplLTEyNSk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWluZmllbGRidXR0b24taWNvbi1tYXJnaW4teS14bDogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1zaXplLTE2MCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWluZmllbGRidXR0b24tYm9yZGVyLXJhZGl1czogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1zaXplLTUwKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtaW5maWVsZGJ1dHRvbi1ib3JkZXItcmFkaXVzLXNpZGVkOiAwO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1pbmZpZWxkYnV0dG9uLWJvcmRlci1zaXplOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXN0YXRpYy1zaXplLTEwKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtaW5maWVsZGJ1dHRvbi1maWxsLXBhZGRpbmctczogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1zaXplLTUwKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtaW5maWVsZGJ1dHRvbi1maWxsLXBhZGRpbmctbTogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1zaXplLTg1KTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtaW5maWVsZGJ1dHRvbi1maWxsLXBhZGRpbmctbDogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1zaXplLTEyNSk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWluZmllbGRidXR0b24tZmlsbC1wYWRkaW5nLXhsOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXNpemUtMTYwKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtaW5maWVsZGJ1dHRvbi1wYWRkaW5nLXM6IDA7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWluZmllbGRidXR0b24tcGFkZGluZy1tOiAwO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1pbmZpZWxkYnV0dG9uLXBhZGRpbmctbDogMDtcXG4gIC0tc3BlY3RydW0tYWxpYXMtaW5maWVsZGJ1dHRvbi1wYWRkaW5nLXhsOiAwO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1pbmZpZWxkYnV0dG9uLWZ1bGwtaGVpZ2h0LXM6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc2l6ZS0zMDApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1pbmZpZWxkYnV0dG9uLWZ1bGwtaGVpZ2h0LW06IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc2l6ZS00MDApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1pbmZpZWxkYnV0dG9uLWZ1bGwtaGVpZ2h0LWw6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc2l6ZS01MDApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1pbmZpZWxkYnV0dG9uLWZ1bGwtaGVpZ2h0LXhsOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXNpemUtNjAwKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtaW5maWVsZGJ1dHRvbi1oYWxmLWhlaWdodC1zOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXNpemUtMTUwKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtaW5maWVsZGJ1dHRvbi1oYWxmLWhlaWdodC1tOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXNpemUtMjAwKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtaW5maWVsZGJ1dHRvbi1oYWxmLWhlaWdodC1sOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXNpemUtMjUwKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtaW5maWVsZGJ1dHRvbi1oYWxmLWhlaWdodC14bDogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1zaXplLTMwMCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLXN0ZXBwZXJidXR0b24tZ2FwOiAwO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1zdGVwcGVyYnV0dG9uLXdpZHRoLXM6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc2l6ZS0yMjUpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1zdGVwcGVyYnV0dG9uLXdpZHRoLW06IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc2l6ZS0zMDApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1zdGVwcGVyYnV0dG9uLXdpZHRoLWw6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc2l6ZS00MDApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1zdGVwcGVyYnV0dG9uLXdpZHRoLXhsOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXNpemUtNDUwKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtc3RlcHBlcmJ1dHRvbi1pY29uLXgtb2Zmc2V0LXM6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc2l6ZS01MCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLXN0ZXBwZXJidXR0b24taWNvbi14LW9mZnNldC1tOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXNpemUtODUpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1zdGVwcGVyYnV0dG9uLWljb24teC1vZmZzZXQtbDogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1zaXplLTEyNSk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLXN0ZXBwZXJidXR0b24taWNvbi14LW9mZnNldC14bDogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1zaXplLTEzMCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLXN0ZXBwZXJidXR0b24taWNvbi15LW9mZnNldC10b3AtczogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1zaXplLTI1KTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtc3RlcHBlcmJ1dHRvbi1pY29uLXktb2Zmc2V0LXRvcC1tOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXNpemUtNTApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1zdGVwcGVyYnV0dG9uLWljb24teS1vZmZzZXQtdG9wLWw6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc2l6ZS02NSk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLXN0ZXBwZXJidXR0b24taWNvbi15LW9mZnNldC10b3AteGw6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc2l6ZS03NSk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLXN0ZXBwZXJidXR0b24taWNvbi15LW9mZnNldC1ib3R0b20tczogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1zaXplLTEwKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtc3RlcHBlcmJ1dHRvbi1pY29uLXktb2Zmc2V0LWJvdHRvbS1tOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXNpemUtMjUpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1zdGVwcGVyYnV0dG9uLWljb24teS1vZmZzZXQtYm90dG9tLWw6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc2l6ZS00MCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLXN0ZXBwZXJidXR0b24taWNvbi15LW9mZnNldC1ib3R0b20teGw6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc2l6ZS01MCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLXN0ZXBwZXJidXR0b24tcmFkaXVzLXRvdWNoaW5nOiAwO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1jbGVhcmJ1dHRvbi1pY29uLW1hcmdpbi1zOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXNpemUtMTAwKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtY2xlYXJidXR0b24taWNvbi1tYXJnaW4tbTogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1zaXplLTE1MCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWNsZWFyYnV0dG9uLWljb24tbWFyZ2luLWw6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc2l6ZS0xODUpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1jbGVhcmJ1dHRvbi1pY29uLW1hcmdpbi14bDogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1zaXplLTIyNSk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWNsZWFyYnV0dG9uLWJvcmRlci1yYWRpdXM6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc2l6ZS01MCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLXBpY2tlcmJ1dHRvbi1pY29ub25seS1wYWRkaW5nLXgtczogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1zaXplLTg1KTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtcGlja2VyYnV0dG9uLWljb25vbmx5LXBhZGRpbmcteC1tOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXNpemUtMTI1KTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtcGlja2VyYnV0dG9uLWljb25vbmx5LXBhZGRpbmcteC1sOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXNpemUtMTYwKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtcGlja2VyYnV0dG9uLWljb25vbmx5LXBhZGRpbmcteC14bDogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1zaXplLTIwMCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLXBpY2tlcmJ1dHRvbi1pY29uLW1hcmdpbi15LXM6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc2l6ZS04NSk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLXBpY2tlcmJ1dHRvbi1pY29uLW1hcmdpbi15LW06IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc2l6ZS0xMjUpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1waWNrZXJidXR0b24taWNvbi1tYXJnaW4teS1sOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXNpemUtMTYwKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtcGlja2VyYnV0dG9uLWljb24tbWFyZ2luLXkteGw6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc2l6ZS0yMDApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1waWNrZXJidXR0b24tbGFiZWwtcGFkZGluZy15LXM6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc2l6ZS01MCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLXBpY2tlcmJ1dHRvbi1sYWJlbC1wYWRkaW5nLXktbTogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1zaXplLTc1KTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtcGlja2VyYnV0dG9uLWxhYmVsLXBhZGRpbmcteS1sOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXNpemUtMTE1KTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtcGlja2VyYnV0dG9uLWxhYmVsLXBhZGRpbmcteS14bDogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1zaXplLTE1MCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLXBpY2tlcmJ1dHRvbi1ib3JkZXItcmFkaXVzLXJvdW5kZWQ6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc2l6ZS01MCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLXBpY2tlcmJ1dHRvbi1ib3JkZXItcmFkaXVzLXJvdW5kZWQtc2lkZWQ6IDA7XFxuICAtLXNwZWN0cnVtLWFsaWFzLXNlYXJjaC1ib3JkZXItcmFkaXVzOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXNpemUtNTApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1zZWFyY2gtYm9yZGVyLXJhZGl1cy1xdWlldDogMDtcXG4gIC0tc3BlY3RydW0tYWxpYXMtY29tYm9ib3gtcXVpZXQtYnV0dG9uLW9mZnNldC14OiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXNpemUtMTAwKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtdGh1bWJuYWlsLWJvcmRlci1yYWRpdXMtc21hbGw6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc2l6ZS0yNSk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWFjdGlvbmdyb3VwLWJ1dHRvbi1nYXA6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc2l6ZS0xMDApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1hY3Rpb25ncm91cC1idXR0b24tZ2FwLWNvbXBhY3Q6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc2l6ZS0wKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtYWN0aW9uZ3JvdXAtYnV0dG9uLWdhcC1xdWlldDogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1zaXplLTEwMCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWFjdGlvbmdyb3VwLWJ1dHRvbi1nYXAtcXVpZXQtY29tcGFjdDogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1zaXplLTI1KTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtc2VhcmNoLXBhZGRpbmctbGVmdC1zOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXNpemUtODUpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1zZWFyY2gtcGFkZGluZy1sZWZ0LWw6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc2l6ZS0xNjApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1zZWFyY2gtcGFkZGluZy1sZWZ0LXhsOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXNpemUtMTg1KTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtcGVyY2VudC01MDogNTAlO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1wZXJjZW50LTcwOiA3MCU7XFxuICAtLXNwZWN0cnVtLWFsaWFzLXBlcmNlbnQtMTAwOiAxMDAlO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1icmVha3BvaW50LXhzbWFsbDogMzA0cHg7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWJyZWFrcG9pbnQtc21hbGw6IDc2OHB4O1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1icmVha3BvaW50LW1lZGl1bTogMTI4MHB4O1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1icmVha3BvaW50LWxhcmdlOiAxNzY4cHg7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWJyZWFrcG9pbnQteGxhcmdlOiAyMTYwcHg7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWdyaWQtY29sdW1uczogMTI7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWdyaWQtZmx1aWQtd2lkdGg6IDEwMCU7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWdyaWQtZml4ZWQtbWF4LXdpZHRoOiAxMjgwcHg7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWJvcmRlci1zaXplLXRoaW46IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc3RhdGljLXNpemUtMTApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1ib3JkZXItc2l6ZS10aGljazogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1zdGF0aWMtc2l6ZS0yNSk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWJvcmRlci1zaXplLXRoaWNrZXI6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc3RhdGljLXNpemUtNTApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1ib3JkZXItc2l6ZS10aGlja2VzdDogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1zdGF0aWMtc2l6ZS0xMDApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1ib3JkZXItb2Zmc2V0LXRoaW46IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc3RhdGljLXNpemUtMjUpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1ib3JkZXItb2Zmc2V0LXRoaWNrOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXN0YXRpYy1zaXplLTUwKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtYm9yZGVyLW9mZnNldC10aGlja2VyOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXN0YXRpYy1zaXplLTEwMCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWJvcmRlci1vZmZzZXQtdGhpY2tlc3Q6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc3RhdGljLXNpemUtMjAwKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtZ3JpZC1iYXNlbGluZTogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1zdGF0aWMtc2l6ZS0xMDApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1ncmlkLWd1dHRlci14c21hbGw6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc3RhdGljLXNpemUtMjAwKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtZ3JpZC1ndXR0ZXItc21hbGw6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc3RhdGljLXNpemUtMzAwKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtZ3JpZC1ndXR0ZXItbWVkaXVtOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXN0YXRpYy1zaXplLTQwMCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWdyaWQtZ3V0dGVyLWxhcmdlOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXN0YXRpYy1zaXplLTUwMCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWdyaWQtZ3V0dGVyLXhsYXJnZTogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1zdGF0aWMtc2l6ZS02MDApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1ncmlkLW1hcmdpbi14c21hbGw6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc3RhdGljLXNpemUtMjAwKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtZ3JpZC1tYXJnaW4tc21hbGw6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc3RhdGljLXNpemUtMzAwKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtZ3JpZC1tYXJnaW4tbWVkaXVtOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXN0YXRpYy1zaXplLTQwMCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWdyaWQtbWFyZ2luLWxhcmdlOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXN0YXRpYy1zaXplLTUwMCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWdyaWQtbWFyZ2luLXhsYXJnZTogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1zdGF0aWMtc2l6ZS02MDApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1ncmlkLWxheW91dC1yZWdpb24tbWFyZ2luLWJvdHRvbS14c21hbGw6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc3RhdGljLXNpemUtMjAwKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtZ3JpZC1sYXlvdXQtcmVnaW9uLW1hcmdpbi1ib3R0b20tc21hbGw6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc3RhdGljLXNpemUtMzAwKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtZ3JpZC1sYXlvdXQtcmVnaW9uLW1hcmdpbi1ib3R0b20tbWVkaXVtOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXN0YXRpYy1zaXplLTQwMCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWdyaWQtbGF5b3V0LXJlZ2lvbi1tYXJnaW4tYm90dG9tLWxhcmdlOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXN0YXRpYy1zaXplLTUwMCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWdyaWQtbGF5b3V0LXJlZ2lvbi1tYXJnaW4tYm90dG9tLXhsYXJnZTogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1zdGF0aWMtc2l6ZS02MDApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1yYWRpYWwtcmVhY3Rpb24tc2l6ZS1kZWZhdWx0OiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXN0YXRpYy1zaXplLTU1MCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWZvY3VzLXJpbmctZ2FwOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXN0YXRpYy1zaXplLTI1KTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtZm9jdXMtcmluZy1zaXplOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXN0YXRpYy1zaXplLTI1KTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtZm9jdXMtcmluZy1nYXAtc21hbGw6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc3RhdGljLXNpemUtMCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWZvY3VzLXJpbmctc2l6ZS1zbWFsbDogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1zdGF0aWMtc2l6ZS0xMCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWRyb3BzaGFkb3ctYmx1cjogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1zaXplLTUwKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtZHJvcHNoYWRvdy1vZmZzZXQteTogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1zaXplLTEwKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtZm9udC1zaXplLWRlZmF1bHQ6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tZm9udC1zaXplLTEwMCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWxheW91dC1sYWJlbC1nYXAtc2l6ZTogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1zaXplLTEwMCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLXBpbGwtYnV0dG9uLXRleHQtc2l6ZTogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1mb250LXNpemUtMTAwKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtcGlsbC1idXR0b24tdGV4dC1iYXNlbGluZTogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1zdGF0aWMtc2l6ZS0xNTApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1ib3JkZXItcmFkaXVzLXhzbWFsbDogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1zaXplLTEwKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtYm9yZGVyLXJhZGl1cy1zbWFsbDogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1zaXplLTI1KTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtYm9yZGVyLXJhZGl1cy1yZWd1bGFyOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXNpemUtNTApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1ib3JkZXItcmFkaXVzLW1lZGl1bTogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1zaXplLTEwMCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWJvcmRlci1yYWRpdXMtbGFyZ2U6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc2l6ZS0yMDApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1ib3JkZXItcmFkaXVzLXhsYXJnZTogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1zaXplLTMwMCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLXNpbmdsZS1saW5lLWhlaWdodDogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1zaXplLTQwMCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLXNpbmdsZS1saW5lLXdpZHRoOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXNpemUtMjQwMCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLXdvcmtmbG93LWljb24tc2l6ZS1zOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXNpemUtMjAwKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtd29ya2Zsb3ctaWNvbi1zaXplLW06IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc2l6ZS0yMjUpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy13b3JrZmxvdy1pY29uLXNpemUteGw6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc2l6ZS0yNzUpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy11aS1pY29uLWFsZXJ0LXNpemUtNzU6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc2l6ZS0yMDApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy11aS1pY29uLWFsZXJ0LXNpemUtMTAwOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXNpemUtMjI1KTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtdWktaWNvbi1hbGVydC1zaXplLTIwMDogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1zaXplLTI1MCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLXVpLWljb24tYWxlcnQtc2l6ZS0zMDA6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc2l6ZS0yNzUpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy11aS1pY29uLXRyaXBsZWdyaXBwZXItc2l6ZS0xMDAtaGVpZ2h0OiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXNpemUtMTAwKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtdWktaWNvbi1kb3VibGVncmlwcGVyLXNpemUtMTAwLXdpZHRoOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXNpemUtMjAwKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtdWktaWNvbi1zaW5nbGVncmlwcGVyLXNpemUtMTAwLXdpZHRoOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXNpemUtMzAwKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtdWktaWNvbi1jb3JuZXJ0cmlhbmdsZS1zaXplLTc1OiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXNpemUtNjUpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy11aS1pY29uLWNvcm5lcnRyaWFuZ2xlLXNpemUtMjAwOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXNpemUtNzUpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy11aS1pY29uLWFzdGVyaXNrLXNpemUtNzU6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc3RhdGljLXNpemUtMTAwKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtdWktaWNvbi1hc3Rlcmlzay1zaXplLTEwMDogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1zaXplLTEwMCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWF2YXRhci1zaXplLTUwOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXNpemUtMjAwKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtYXZhdGFyLXNpemUtNzU6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc2l6ZS0yMjUpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1hdmF0YXItc2l6ZS0yMDA6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc2l6ZS0yNzUpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1hdmF0YXItc2l6ZS0zMDA6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc2l6ZS0zMjUpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1hdmF0YXItc2l6ZS01MDA6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc2l6ZS00MDApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1hdmF0YXItc2l6ZS03MDA6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc2l6ZS01MDApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1hdmF0YXItYm9yZGVyLXNpemU6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc2l6ZS0wKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtdGFnLWJvcmRlci1yYWRpdXM6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc2l6ZS01MCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLXRhZy1ib3JkZXItc2l6ZS1kZWZhdWx0OiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXN0YXRpYy1zaXplLTEwKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtdGFnLWJvcmRlci1zaXplLWtleS1mb2N1czogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1zdGF0aWMtc2l6ZS0yNSk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLXRhZy1ib3JkZXItc2l6ZS1kaXNhYmxlZDogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1zaXplLTApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy10YWctYm9yZGVyLXNpemU6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc3RhdGljLXNpemUtMTApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy10YWctcGFkZGluZy1yaWdodC1zOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXNpemUtMTE1KTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtdGFnLXBhZGRpbmctcmlnaHQtbTogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1zaXplLTE1MCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLXRhZy1wYWRkaW5nLXJpZ2h0LWw6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc2l6ZS0xODUpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy10YWctaGVpZ2h0LXM6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc2l6ZS0zMDApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy10YWctaGVpZ2h0LW06IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc2l6ZS00MDApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy10YWctaGVpZ2h0LWw6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc2l6ZS01MDApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy10YWctZm9udC1zaXplLXM6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tZm9udC1zaXplLTc1KTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtdGFnLWZvbnQtc2l6ZS1tOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLWZvbnQtc2l6ZS0xMDApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy10YWctZm9udC1zaXplLWw6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tZm9udC1zaXplLTIwMCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLXRhZy10ZXh0LXBhZGRpbmctdG9wLXM6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc2l6ZS01MCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLXRhZy10ZXh0LXBhZGRpbmctdG9wLW06IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc2l6ZS03NSk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLXRhZy10ZXh0LXBhZGRpbmctdG9wLWw6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc2l6ZS0xMTUpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy10YWctaWNvbi1zaXplLXM6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc2l6ZS0yMDApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy10YWctaWNvbi1zaXplLW06IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc2l6ZS0yMjUpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy10YWctaWNvbi1tYXJnaW4tdG9wLXM6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc2l6ZS01MCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLXRhZy1pY29uLW1hcmdpbi10b3AtbTogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1zaXplLTg1KTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtdGFnLWljb24tbWFyZ2luLXRvcC1sOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXNpemUtMTI1KTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtdGFnLWljb24tbWFyZ2luLXJpZ2h0LXM6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc2l6ZS04NSk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLXRhZy1pY29uLW1hcmdpbi1yaWdodC1tOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXNpemUtMTAwKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtdGFnLWljb24tbWFyZ2luLXJpZ2h0LWw6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc2l6ZS0xMTUpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy10YWctY2xlYXJidXR0b24td2lkdGgtczogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1zaXplLTMwMCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLXRhZy1jbGVhcmJ1dHRvbi13aWR0aC1tOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXNpemUtNDAwKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtdGFnLWNsZWFyYnV0dG9uLXdpZHRoLWw6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc2l6ZS01MDApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy10YWctY2xlYXJidXR0b24taWNvbi1tYXJnaW4tczogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1zaXplLTEwMCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLXRhZy1jbGVhcmJ1dHRvbi1pY29uLW1hcmdpbi1tOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXNpemUtMTUwKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtdGFnLWNsZWFyYnV0dG9uLWljb24tbWFyZ2luLWw6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc2l6ZS0xODUpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy10YWctZm9jdXNyaW5nLWJvcmRlci1yYWRpdXM6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc2l6ZS03NSk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLXRhZy1mb2N1c3Jpbmctc2l6ZTogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWRpbWVuc2lvbi1zaXplLTI1KTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtdGFnLWZvY3VzcmluZy1nYXA6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1kaW1lbnNpb24tc3RhdGljLXNpemUtMCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLXRhZy1mb2N1c3JpbmctZ2FwLXNlbGVjdGVkOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXNpemUtMjUpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1jb2xvcmxvdXBlLXdpZHRoOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXN0YXRpYy1zaXplLTYwMCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWNvbG9ybG91cGUtaGVpZ2h0OiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtZGltZW5zaW9uLXN0YXRpYy1zaXplLTgwMCk7XFxufVxcblxcbi5zcGVjdHJ1bS0tZGFya2VzdCxcXG4uc3BlY3RydW0tLWRhcmssXFxuLnNwZWN0cnVtLS1saWdodCxcXG4uc3BlY3RydW0tLWxpZ2h0ZXN0IHtcXG4gIC8qIHNwZWN0cnVtLWNvbG9yQWxpYXNlcy5jc3MgKi9cXG4gIC0tc3BlY3RydW0tYWxpYXMtY29sb3JoYW5kbGUtb3V0ZXItYm9yZGVyLWNvbG9yOiByZ2JhKDAsMCwwLDAuNDIpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy10cmFuc3BhcmVudC1ibHVlLWJhY2tncm91bmQtY29sb3ItaG92ZXI6IHJnYmEoMTMsMTAyLDIwOCwwLjE1KTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtdHJhbnNwYXJlbnQtYmx1ZS1iYWNrZ3JvdW5kLWNvbG9yLWRvd246IHJnYmEoOSw5MCwxODYsMC4zKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtdHJhbnNwYXJlbnQtYmx1ZS1iYWNrZ3JvdW5kLWNvbG9yLWtleS1mb2N1czogdmFyKC0tc3BlY3RydW0tYWxpYXMtdHJhbnNwYXJlbnQtYmx1ZS1iYWNrZ3JvdW5kLWNvbG9yLWhvdmVyKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtdHJhbnNwYXJlbnQtYmx1ZS1iYWNrZ3JvdW5kLWNvbG9yLW1vdXNlLWZvY3VzOiB2YXIoLS1zcGVjdHJ1bS1hbGlhcy10cmFuc3BhcmVudC1ibHVlLWJhY2tncm91bmQtY29sb3ItaG92ZXIpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy10cmFuc3BhcmVudC1ibHVlLWJhY2tncm91bmQtY29sb3I6IHZhcigtLXNwZWN0cnVtLWFsaWFzLWNvbXBvbmVudC10ZXh0LWNvbG9yLWRlZmF1bHQpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy10cmFuc3BhcmVudC1yZWQtYmFja2dyb3VuZC1jb2xvci1ob3ZlcjogcmdiYSgyMDEsMzcsNDUsMC4xNSk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLXRyYW5zcGFyZW50LXJlZC1iYWNrZ3JvdW5kLWNvbG9yLWRvd246IHJnYmEoMTg3LDE4LDI2LDAuMyk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLXRyYW5zcGFyZW50LXJlZC1iYWNrZ3JvdW5kLWNvbG9yLWtleS1mb2N1czogdmFyKC0tc3BlY3RydW0tYWxpYXMtdHJhbnNwYXJlbnQtcmVkLWJhY2tncm91bmQtY29sb3ItaG92ZXIpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy10cmFuc3BhcmVudC1yZWQtYmFja2dyb3VuZC1jb2xvci1tb3VzZS1mb2N1czogdmFyKC0tc3BlY3RydW0tYWxpYXMtdHJhbnNwYXJlbnQtcmVkLWJhY2tncm91bmQtY29sb3ItaG92ZXIpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy10cmFuc3BhcmVudC1yZWQtYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tc3BlY3RydW0tYWxpYXMtY29tcG9uZW50LXRleHQtY29sb3ItZGVmYXVsdCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWNvbXBvbmVudC10ZXh0LWNvbG9yLWRpc2FibGVkOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItZ3JheS01MDApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1jb21wb25lbnQtdGV4dC1jb2xvci1kZWZhdWx0OiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItZ3JheS04MDApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1jb21wb25lbnQtdGV4dC1jb2xvci1ob3ZlcjogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLWdyYXktOTAwKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtY29tcG9uZW50LXRleHQtY29sb3ItZG93bjogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLWdyYXktOTAwKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtY29tcG9uZW50LXRleHQtY29sb3Ita2V5LWZvY3VzOiB2YXIoLS1zcGVjdHJ1bS1hbGlhcy1jb21wb25lbnQtdGV4dC1jb2xvci1ob3Zlcik7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWNvbXBvbmVudC10ZXh0LWNvbG9yLW1vdXNlLWZvY3VzOiB2YXIoLS1zcGVjdHJ1bS1hbGlhcy1jb21wb25lbnQtdGV4dC1jb2xvci1ob3Zlcik7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWNvbXBvbmVudC10ZXh0LWNvbG9yOiB2YXIoLS1zcGVjdHJ1bS1hbGlhcy1jb21wb25lbnQtdGV4dC1jb2xvci1kZWZhdWx0KTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtY29tcG9uZW50LXRleHQtY29sb3Itc2VsZWN0ZWQtZGVmYXVsdDogdmFyKC0tc3BlY3RydW0tYWxpYXMtY29tcG9uZW50LXRleHQtY29sb3ItZGVmYXVsdCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWNvbXBvbmVudC10ZXh0LWNvbG9yLXNlbGVjdGVkLWhvdmVyOiB2YXIoLS1zcGVjdHJ1bS1hbGlhcy1jb21wb25lbnQtdGV4dC1jb2xvci1ob3Zlcik7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWNvbXBvbmVudC10ZXh0LWNvbG9yLXNlbGVjdGVkLWRvd246IHZhcigtLXNwZWN0cnVtLWFsaWFzLWNvbXBvbmVudC10ZXh0LWNvbG9yLWRvd24pO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1jb21wb25lbnQtdGV4dC1jb2xvci1zZWxlY3RlZC1rZXktZm9jdXM6IHZhcigtLXNwZWN0cnVtLWFsaWFzLWNvbXBvbmVudC10ZXh0LWNvbG9yLWtleS1mb2N1cyk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWNvbXBvbmVudC10ZXh0LWNvbG9yLXNlbGVjdGVkLW1vdXNlLWZvY3VzOiB2YXIoLS1zcGVjdHJ1bS1hbGlhcy1jb21wb25lbnQtdGV4dC1jb2xvci1tb3VzZS1mb2N1cyk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWNvbXBvbmVudC10ZXh0LWNvbG9yLXNlbGVjdGVkOiB2YXIoLS1zcGVjdHJ1bS1hbGlhcy1jb21wb25lbnQtdGV4dC1jb2xvci1zZWxlY3RlZC1kZWZhdWx0KTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtY29tcG9uZW50LXRleHQtY29sb3ItZW1waGFzaXplZC1zZWxlY3RlZC1kZWZhdWx0OiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3Itc3RhdGljLXdoaXRlKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtY29tcG9uZW50LXRleHQtY29sb3ItZW1waGFzaXplZC1zZWxlY3RlZC1ob3ZlcjogdmFyKC0tc3BlY3RydW0tYWxpYXMtY29tcG9uZW50LXRleHQtY29sb3ItZW1waGFzaXplZC1zZWxlY3RlZC1kZWZhdWx0KTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtY29tcG9uZW50LXRleHQtY29sb3ItZW1waGFzaXplZC1zZWxlY3RlZC1kb3duOiB2YXIoLS1zcGVjdHJ1bS1hbGlhcy1jb21wb25lbnQtdGV4dC1jb2xvci1lbXBoYXNpemVkLXNlbGVjdGVkLWRlZmF1bHQpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1jb21wb25lbnQtdGV4dC1jb2xvci1lbXBoYXNpemVkLXNlbGVjdGVkLWtleS1mb2N1czogdmFyKC0tc3BlY3RydW0tYWxpYXMtY29tcG9uZW50LXRleHQtY29sb3ItZW1waGFzaXplZC1zZWxlY3RlZC1kZWZhdWx0KTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtY29tcG9uZW50LXRleHQtY29sb3ItZW1waGFzaXplZC1zZWxlY3RlZC1tb3VzZS1mb2N1czogdmFyKC0tc3BlY3RydW0tYWxpYXMtY29tcG9uZW50LXRleHQtY29sb3ItZW1waGFzaXplZC1zZWxlY3RlZC1kZWZhdWx0KTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtY29tcG9uZW50LXRleHQtY29sb3ItZW1waGFzaXplZC1zZWxlY3RlZDogdmFyKC0tc3BlY3RydW0tYWxpYXMtY29tcG9uZW50LXRleHQtY29sb3ItZW1waGFzaXplZC1zZWxlY3RlZC1kZWZhdWx0KTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtY29tcG9uZW50LXRleHQtY29sb3ItZXJyb3ItZGVmYXVsdDogdmFyKC0tc3BlY3RydW0tc2VtYW50aWMtbmVnYXRpdmUtdGV4dC1jb2xvci1zbWFsbCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWNvbXBvbmVudC10ZXh0LWNvbG9yLWVycm9yLWhvdmVyOiB2YXIoLS1zcGVjdHJ1bS1zZW1hbnRpYy1uZWdhdGl2ZS10ZXh0LWNvbG9yLXNtYWxsLWhvdmVyKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtY29tcG9uZW50LXRleHQtY29sb3ItZXJyb3ItZG93bjogdmFyKC0tc3BlY3RydW0tc2VtYW50aWMtbmVnYXRpdmUtdGV4dC1jb2xvci1zbWFsbC1kb3duKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtY29tcG9uZW50LXRleHQtY29sb3ItZXJyb3Ita2V5LWZvY3VzOiB2YXIoLS1zcGVjdHJ1bS1zZW1hbnRpYy1uZWdhdGl2ZS10ZXh0LWNvbG9yLXNtYWxsLWtleS1mb2N1cyk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWNvbXBvbmVudC10ZXh0LWNvbG9yLWVycm9yLW1vdXNlLWZvY3VzOiB2YXIoLS1zcGVjdHJ1bS1zZW1hbnRpYy1uZWdhdGl2ZS10ZXh0LWNvbG9yLXNtYWxsLWtleS1mb2N1cyk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWNvbXBvbmVudC10ZXh0LWNvbG9yLWVycm9yOiB2YXIoLS1zcGVjdHJ1bS1hbGlhcy1jb21wb25lbnQtdGV4dC1jb2xvci1lcnJvci1kZWZhdWx0KTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtY29tcG9uZW50LWljb24tY29sb3ItZGlzYWJsZWQ6IHZhcigtLXNwZWN0cnVtLWFsaWFzLWljb24tY29sb3ItZGlzYWJsZWQpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1jb21wb25lbnQtaWNvbi1jb2xvci1kZWZhdWx0OiB2YXIoLS1zcGVjdHJ1bS1hbGlhcy1pY29uLWNvbG9yKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtY29tcG9uZW50LWljb24tY29sb3ItaG92ZXI6IHZhcigtLXNwZWN0cnVtLWFsaWFzLWljb24tY29sb3ItaG92ZXIpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1jb21wb25lbnQtaWNvbi1jb2xvci1kb3duOiB2YXIoLS1zcGVjdHJ1bS1hbGlhcy1pY29uLWNvbG9yLWRvd24pO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1jb21wb25lbnQtaWNvbi1jb2xvci1rZXktZm9jdXM6IHZhcigtLXNwZWN0cnVtLWFsaWFzLWljb24tY29sb3ItaG92ZXIpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1jb21wb25lbnQtaWNvbi1jb2xvci1tb3VzZS1mb2N1czogdmFyKC0tc3BlY3RydW0tYWxpYXMtaWNvbi1jb2xvci1kb3duKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtY29tcG9uZW50LWljb24tY29sb3I6IHZhcigtLXNwZWN0cnVtLWFsaWFzLWNvbXBvbmVudC1pY29uLWNvbG9yLWRlZmF1bHQpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1jb21wb25lbnQtaWNvbi1jb2xvci1zZWxlY3RlZDogdmFyKC0tc3BlY3RydW0tYWxpYXMtaWNvbi1jb2xvci1zZWxlY3RlZC1uZXV0cmFsLXN1YmR1ZWQpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1jb21wb25lbnQtaWNvbi1jb2xvci1lbXBoYXNpemVkLXNlbGVjdGVkLWRlZmF1bHQ6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1zdGF0aWMtd2hpdGUpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1jb21wb25lbnQtaWNvbi1jb2xvci1lbXBoYXNpemVkLXNlbGVjdGVkLWhvdmVyOiB2YXIoLS1zcGVjdHJ1bS1hbGlhcy1jb21wb25lbnQtaWNvbi1jb2xvci1lbXBoYXNpemVkLXNlbGVjdGVkLWRlZmF1bHQpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1jb21wb25lbnQtaWNvbi1jb2xvci1lbXBoYXNpemVkLXNlbGVjdGVkLWRvd246IHZhcigtLXNwZWN0cnVtLWFsaWFzLWNvbXBvbmVudC1pY29uLWNvbG9yLWVtcGhhc2l6ZWQtc2VsZWN0ZWQtZGVmYXVsdCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWNvbXBvbmVudC1pY29uLWNvbG9yLWVtcGhhc2l6ZWQtc2VsZWN0ZWQta2V5LWZvY3VzOiB2YXIoLS1zcGVjdHJ1bS1hbGlhcy1jb21wb25lbnQtaWNvbi1jb2xvci1lbXBoYXNpemVkLXNlbGVjdGVkLWRlZmF1bHQpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1jb21wb25lbnQtaWNvbi1jb2xvci1lbXBoYXNpemVkLXNlbGVjdGVkOiB2YXIoLS1zcGVjdHJ1bS1hbGlhcy1jb21wb25lbnQtaWNvbi1jb2xvci1lbXBoYXNpemVkLXNlbGVjdGVkLWRlZmF1bHQpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1jb21wb25lbnQtYmFja2dyb3VuZC1jb2xvci1kaXNhYmxlZDogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLWdyYXktMjAwKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtY29tcG9uZW50LWJhY2tncm91bmQtY29sb3ItcXVpZXQtZGlzYWJsZWQ6IHZhcigtLXNwZWN0cnVtLWFsaWFzLWJhY2tncm91bmQtY29sb3ItdHJhbnNwYXJlbnQpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1jb21wb25lbnQtYmFja2dyb3VuZC1jb2xvci1xdWlldC1zZWxlY3RlZC1kaXNhYmxlZDogdmFyKC0tc3BlY3RydW0tYWxpYXMtY29tcG9uZW50LWJhY2tncm91bmQtY29sb3ItZGlzYWJsZWQpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1jb21wb25lbnQtYmFja2dyb3VuZC1jb2xvci1kZWZhdWx0OiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItZ3JheS03NSk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWNvbXBvbmVudC1iYWNrZ3JvdW5kLWNvbG9yLWhvdmVyOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItZ3JheS01MCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWNvbXBvbmVudC1iYWNrZ3JvdW5kLWNvbG9yLWRvd246IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1ncmF5LTIwMCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWNvbXBvbmVudC1iYWNrZ3JvdW5kLWNvbG9yLWtleS1mb2N1czogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLWdyYXktNTApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1jb21wb25lbnQtYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tc3BlY3RydW0tYWxpYXMtY29tcG9uZW50LWJhY2tncm91bmQtY29sb3ItZGVmYXVsdCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWNvbXBvbmVudC1iYWNrZ3JvdW5kLWNvbG9yLXNlbGVjdGVkLWRlZmF1bHQ6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1ncmF5LTIwMCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWNvbXBvbmVudC1iYWNrZ3JvdW5kLWNvbG9yLXNlbGVjdGVkLWhvdmVyOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItZ3JheS0yMDApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1jb21wb25lbnQtYmFja2dyb3VuZC1jb2xvci1zZWxlY3RlZC1kb3duOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItZ3JheS0yMDApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1jb21wb25lbnQtYmFja2dyb3VuZC1jb2xvci1zZWxlY3RlZC1rZXktZm9jdXM6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1ncmF5LTIwMCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWNvbXBvbmVudC1iYWNrZ3JvdW5kLWNvbG9yLXNlbGVjdGVkOiB2YXIoLS1zcGVjdHJ1bS1hbGlhcy1jb21wb25lbnQtYmFja2dyb3VuZC1jb2xvci1zZWxlY3RlZC1kZWZhdWx0KTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtY29tcG9uZW50LWJhY2tncm91bmQtY29sb3ItcXVpZXQtZGVmYXVsdDogdmFyKC0tc3BlY3RydW0tYWxpYXMtYmFja2dyb3VuZC1jb2xvci10cmFuc3BhcmVudCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWNvbXBvbmVudC1iYWNrZ3JvdW5kLWNvbG9yLXF1aWV0LWhvdmVyOiB2YXIoLS1zcGVjdHJ1bS1hbGlhcy1iYWNrZ3JvdW5kLWNvbG9yLXRyYW5zcGFyZW50KTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtY29tcG9uZW50LWJhY2tncm91bmQtY29sb3ItcXVpZXQtZG93bjogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLWdyYXktMzAwKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtY29tcG9uZW50LWJhY2tncm91bmQtY29sb3ItcXVpZXQta2V5LWZvY3VzOiB2YXIoLS1zcGVjdHJ1bS1hbGlhcy1iYWNrZ3JvdW5kLWNvbG9yLXRyYW5zcGFyZW50KTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtY29tcG9uZW50LWJhY2tncm91bmQtY29sb3ItcXVpZXQ6IHZhcigtLXNwZWN0cnVtLWFsaWFzLWNvbXBvbmVudC1iYWNrZ3JvdW5kLWNvbG9yLXF1aWV0LWRlZmF1bHQpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1jb21wb25lbnQtYmFja2dyb3VuZC1jb2xvci1xdWlldC1zZWxlY3RlZC1kZWZhdWx0OiB2YXIoLS1zcGVjdHJ1bS1hbGlhcy1jb21wb25lbnQtYmFja2dyb3VuZC1jb2xvci1zZWxlY3RlZC1kZWZhdWx0KTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtY29tcG9uZW50LWJhY2tncm91bmQtY29sb3ItcXVpZXQtc2VsZWN0ZWQtaG92ZXI6IHZhcigtLXNwZWN0cnVtLWFsaWFzLWNvbXBvbmVudC1iYWNrZ3JvdW5kLWNvbG9yLXNlbGVjdGVkLWhvdmVyKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtY29tcG9uZW50LWJhY2tncm91bmQtY29sb3ItcXVpZXQtc2VsZWN0ZWQtZG93bjogdmFyKC0tc3BlY3RydW0tYWxpYXMtY29tcG9uZW50LWJhY2tncm91bmQtY29sb3Itc2VsZWN0ZWQtZG93bik7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWNvbXBvbmVudC1iYWNrZ3JvdW5kLWNvbG9yLXF1aWV0LXNlbGVjdGVkLWtleS1mb2N1czogdmFyKC0tc3BlY3RydW0tYWxpYXMtY29tcG9uZW50LWJhY2tncm91bmQtY29sb3Itc2VsZWN0ZWQta2V5LWZvY3VzKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtY29tcG9uZW50LWJhY2tncm91bmQtY29sb3ItcXVpZXQtc2VsZWN0ZWQ6IHZhcigtLXNwZWN0cnVtLWFsaWFzLWNvbXBvbmVudC1iYWNrZ3JvdW5kLWNvbG9yLXNlbGVjdGVkLWRlZmF1bHQpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1jb21wb25lbnQtYmFja2dyb3VuZC1jb2xvci1lbXBoYXNpemVkLXNlbGVjdGVkLWRlZmF1bHQ6IHZhcigtLXNwZWN0cnVtLXNlbWFudGljLWN0YS1iYWNrZ3JvdW5kLWNvbG9yLWRlZmF1bHQpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1jb21wb25lbnQtYmFja2dyb3VuZC1jb2xvci1lbXBoYXNpemVkLXNlbGVjdGVkLWhvdmVyOiB2YXIoLS1zcGVjdHJ1bS1zZW1hbnRpYy1jdGEtYmFja2dyb3VuZC1jb2xvci1ob3Zlcik7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWNvbXBvbmVudC1iYWNrZ3JvdW5kLWNvbG9yLWVtcGhhc2l6ZWQtc2VsZWN0ZWQtZG93bjogdmFyKC0tc3BlY3RydW0tc2VtYW50aWMtY3RhLWJhY2tncm91bmQtY29sb3ItZG93bik7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWNvbXBvbmVudC1iYWNrZ3JvdW5kLWNvbG9yLWVtcGhhc2l6ZWQtc2VsZWN0ZWQta2V5LWZvY3VzOiB2YXIoLS1zcGVjdHJ1bS1zZW1hbnRpYy1jdGEtYmFja2dyb3VuZC1jb2xvci1rZXktZm9jdXMpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1jb21wb25lbnQtYmFja2dyb3VuZC1jb2xvci1lbXBoYXNpemVkLXNlbGVjdGVkOiB2YXIoLS1zcGVjdHJ1bS1hbGlhcy1jb21wb25lbnQtYmFja2dyb3VuZC1jb2xvci1lbXBoYXNpemVkLXNlbGVjdGVkLWRlZmF1bHQpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1jb21wb25lbnQtYm9yZGVyLWNvbG9yLWRpc2FibGVkOiB2YXIoLS1zcGVjdHJ1bS1hbGlhcy1ib3JkZXItY29sb3ItZGlzYWJsZWQpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1jb21wb25lbnQtYm9yZGVyLWNvbG9yLXF1aWV0LWRpc2FibGVkOiB2YXIoLS1zcGVjdHJ1bS1hbGlhcy1ib3JkZXItY29sb3ItdHJhbnNwYXJlbnQpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1jb21wb25lbnQtYm9yZGVyLWNvbG9yLWRlZmF1bHQ6IHZhcigtLXNwZWN0cnVtLWFsaWFzLWJvcmRlci1jb2xvcik7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWNvbXBvbmVudC1ib3JkZXItY29sb3ItaG92ZXI6IHZhcigtLXNwZWN0cnVtLWFsaWFzLWJvcmRlci1jb2xvci1ob3Zlcik7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWNvbXBvbmVudC1ib3JkZXItY29sb3ItZG93bjogdmFyKC0tc3BlY3RydW0tYWxpYXMtYm9yZGVyLWNvbG9yLWRvd24pO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1jb21wb25lbnQtYm9yZGVyLWNvbG9yLWtleS1mb2N1czogdmFyKC0tc3BlY3RydW0tYWxpYXMtYm9yZGVyLWNvbG9yLWtleS1mb2N1cyk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWNvbXBvbmVudC1ib3JkZXItY29sb3I6IHZhcigtLXNwZWN0cnVtLWFsaWFzLWNvbXBvbmVudC1ib3JkZXItY29sb3ItZGVmYXVsdCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWNvbXBvbmVudC1ib3JkZXItY29sb3Itc2VsZWN0ZWQtZGVmYXVsdDogdmFyKC0tc3BlY3RydW0tYWxpYXMtYm9yZGVyLWNvbG9yKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtY29tcG9uZW50LWJvcmRlci1jb2xvci1zZWxlY3RlZC1ob3ZlcjogdmFyKC0tc3BlY3RydW0tYWxpYXMtYm9yZGVyLWNvbG9yLWhvdmVyKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtY29tcG9uZW50LWJvcmRlci1jb2xvci1zZWxlY3RlZC1kb3duOiB2YXIoLS1zcGVjdHJ1bS1hbGlhcy1ib3JkZXItY29sb3ItZG93bik7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWNvbXBvbmVudC1ib3JkZXItY29sb3Itc2VsZWN0ZWQta2V5LWZvY3VzOiB2YXIoLS1zcGVjdHJ1bS1hbGlhcy1ib3JkZXItY29sb3Ita2V5LWZvY3VzKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtY29tcG9uZW50LWJvcmRlci1jb2xvci1zZWxlY3RlZDogdmFyKC0tc3BlY3RydW0tYWxpYXMtY29tcG9uZW50LWJvcmRlci1jb2xvci1zZWxlY3RlZC1kZWZhdWx0KTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtY29tcG9uZW50LWJvcmRlci1jb2xvci1xdWlldC1kZWZhdWx0OiB2YXIoLS1zcGVjdHJ1bS1hbGlhcy1ib3JkZXItY29sb3ItdHJhbnNwYXJlbnQpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1jb21wb25lbnQtYm9yZGVyLWNvbG9yLXF1aWV0LWhvdmVyOiB2YXIoLS1zcGVjdHJ1bS1hbGlhcy1ib3JkZXItY29sb3ItdHJhbnNwYXJlbnQpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1jb21wb25lbnQtYm9yZGVyLWNvbG9yLXF1aWV0LWRvd246IHZhcigtLXNwZWN0cnVtLWFsaWFzLWJvcmRlci1jb2xvci10cmFuc3BhcmVudCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWNvbXBvbmVudC1ib3JkZXItY29sb3ItcXVpZXQta2V5LWZvY3VzOiB2YXIoLS1zcGVjdHJ1bS1hbGlhcy1ib3JkZXItY29sb3Ita2V5LWZvY3VzKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtY29tcG9uZW50LWJvcmRlci1jb2xvci1xdWlldDogdmFyKC0tc3BlY3RydW0tYWxpYXMtY29tcG9uZW50LWJvcmRlci1jb2xvci1xdWlldC1kZWZhdWx0KTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtY29tcG9uZW50LWJvcmRlci1jb2xvci1xdWlldC1zZWxlY3RlZC1kZWZhdWx0OiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItZ3JheS0yMDApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1jb21wb25lbnQtYm9yZGVyLWNvbG9yLXF1aWV0LXNlbGVjdGVkLWhvdmVyOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItZ3JheS0yMDApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1jb21wb25lbnQtYm9yZGVyLWNvbG9yLXF1aWV0LXNlbGVjdGVkLWRvd246IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1ncmF5LTIwMCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWNvbXBvbmVudC1ib3JkZXItY29sb3ItcXVpZXQtc2VsZWN0ZWQta2V5LWZvY3VzOiB2YXIoLS1zcGVjdHJ1bS1hbGlhcy1ib3JkZXItY29sb3Ita2V5LWZvY3VzKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtY29tcG9uZW50LWJvcmRlci1jb2xvci1xdWlldC1zZWxlY3RlZDogdmFyKC0tc3BlY3RydW0tYWxpYXMtY29tcG9uZW50LWJvcmRlci1jb2xvci1xdWlldC1zZWxlY3RlZC1kZWZhdWx0KTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtY29tcG9uZW50LWJvcmRlci1jb2xvci1lbXBoYXNpemVkLXNlbGVjdGVkLWRlZmF1bHQ6IHZhcigtLXNwZWN0cnVtLXNlbWFudGljLWN0YS1iYWNrZ3JvdW5kLWNvbG9yLWRlZmF1bHQpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1jb21wb25lbnQtYm9yZGVyLWNvbG9yLWVtcGhhc2l6ZWQtc2VsZWN0ZWQtaG92ZXI6IHZhcigtLXNwZWN0cnVtLXNlbWFudGljLWN0YS1iYWNrZ3JvdW5kLWNvbG9yLWhvdmVyKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtY29tcG9uZW50LWJvcmRlci1jb2xvci1lbXBoYXNpemVkLXNlbGVjdGVkLWRvd246IHZhcigtLXNwZWN0cnVtLXNlbWFudGljLWN0YS1iYWNrZ3JvdW5kLWNvbG9yLWRvd24pO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1jb21wb25lbnQtYm9yZGVyLWNvbG9yLWVtcGhhc2l6ZWQtc2VsZWN0ZWQta2V5LWZvY3VzOiB2YXIoLS1zcGVjdHJ1bS1zZW1hbnRpYy1jdGEtYmFja2dyb3VuZC1jb2xvci1rZXktZm9jdXMpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1jb21wb25lbnQtYm9yZGVyLWNvbG9yLWVtcGhhc2l6ZWQtc2VsZWN0ZWQ6IHZhcigtLXNwZWN0cnVtLWFsaWFzLWNvbXBvbmVudC1ib3JkZXItY29sb3ItZW1waGFzaXplZC1zZWxlY3RlZC1kZWZhdWx0KTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtdGFnLWJvcmRlci1jb2xvci1kZWZhdWx0OiB2YXIoLS1zcGVjdHJ1bS1hbGlhcy1ib3JkZXItY29sb3ItZGFya2VyLWRlZmF1bHQpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy10YWctYm9yZGVyLWNvbG9yLWhvdmVyOiB2YXIoLS1zcGVjdHJ1bS1hbGlhcy1ib3JkZXItY29sb3ItZGFya2VyLWhvdmVyKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtdGFnLWJvcmRlci1jb2xvci1kb3duOiB2YXIoLS1zcGVjdHJ1bS1hbGlhcy1ib3JkZXItY29sb3ItZGFya2VyLWhvdmVyKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtdGFnLWJvcmRlci1jb2xvci1rZXktZm9jdXM6IHZhcigtLXNwZWN0cnVtLWFsaWFzLWJvcmRlci1jb2xvci1rZXktZm9jdXMpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy10YWctYm9yZGVyLWNvbG9yLWVycm9yLWRlZmF1bHQ6IHZhcigtLXNwZWN0cnVtLXNlbWFudGljLW5lZ2F0aXZlLWNvbG9yLWRlZmF1bHQpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy10YWctYm9yZGVyLWNvbG9yLWVycm9yLWhvdmVyOiB2YXIoLS1zcGVjdHJ1bS1zZW1hbnRpYy1uZWdhdGl2ZS1jb2xvci1ob3Zlcik7XFxuICAtLXNwZWN0cnVtLWFsaWFzLXRhZy1ib3JkZXItY29sb3ItZXJyb3ItZG93bjogdmFyKC0tc3BlY3RydW0tc2VtYW50aWMtbmVnYXRpdmUtY29sb3ItaG92ZXIpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy10YWctYm9yZGVyLWNvbG9yLWVycm9yLWtleS1mb2N1czogdmFyKC0tc3BlY3RydW0tYWxpYXMtYm9yZGVyLWNvbG9yLWtleS1mb2N1cyk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLXRhZy1ib3JkZXItY29sb3ItZXJyb3Itc2VsZWN0ZWQ6IHZhcigtLXNwZWN0cnVtLXNlbWFudGljLW5lZ2F0aXZlLWNvbG9yLWRlZmF1bHQpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy10YWctYm9yZGVyLWNvbG9yLXNlbGVjdGVkOiB2YXIoLS1zcGVjdHJ1bS1hbGlhcy10YWctYmFja2dyb3VuZC1jb2xvci1zZWxlY3RlZC1kZWZhdWx0KTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtdGFnLWJvcmRlci1jb2xvcjogdmFyKC0tc3BlY3RydW0tYWxpYXMtdGFnLWJvcmRlci1jb2xvci1kZWZhdWx0KTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtdGFnLWJvcmRlci1jb2xvci1kaXNhYmxlZDogdmFyKC0tc3BlY3RydW0tYWxpYXMtYm9yZGVyLWNvbG9yLWRpc2FibGVkKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtdGFnLWJvcmRlci1jb2xvci1lcnJvcjogdmFyKC0tc3BlY3RydW0tYWxpYXMtdGFnLWJvcmRlci1jb2xvci1lcnJvci1kZWZhdWx0KTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtdGFnLXRleHQtY29sb3ItZGVmYXVsdDogdmFyKC0tc3BlY3RydW0tYWxpYXMtbGFiZWwtdGV4dC1jb2xvcik7XFxuICAtLXNwZWN0cnVtLWFsaWFzLXRhZy10ZXh0LWNvbG9yLWhvdmVyOiB2YXIoLS1zcGVjdHJ1bS1hbGlhcy10ZXh0LWNvbG9yLWhvdmVyKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtdGFnLXRleHQtY29sb3ItZG93bjogdmFyKC0tc3BlY3RydW0tYWxpYXMtdGV4dC1jb2xvci1kb3duKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtdGFnLXRleHQtY29sb3Ita2V5LWZvY3VzOiB2YXIoLS1zcGVjdHJ1bS1hbGlhcy10ZXh0LWNvbG9yLWhvdmVyKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtdGFnLXRleHQtY29sb3ItZGlzYWJsZWQ6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1ncmF5LTUwMCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLXRhZy10ZXh0LWNvbG9yOiB2YXIoLS1zcGVjdHJ1bS1hbGlhcy10YWctdGV4dC1jb2xvci1kZWZhdWx0KTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtdGFnLXRleHQtY29sb3ItZXJyb3ItZGVmYXVsdDogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLXJlZC02MDApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy10YWctdGV4dC1jb2xvci1lcnJvci1ob3ZlcjogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLXJlZC03MDApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy10YWctdGV4dC1jb2xvci1lcnJvci1kb3duOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItcmVkLTcwMCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLXRhZy10ZXh0LWNvbG9yLWVycm9yLWtleS1mb2N1czogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLXJlZC03MDApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy10YWctdGV4dC1jb2xvci1lcnJvcjogdmFyKC0tc3BlY3RydW0tYWxpYXMtdGFnLXRleHQtY29sb3ItZXJyb3ItZGVmYXVsdCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLXRhZy10ZXh0LWNvbG9yLXNlbGVjdGVkOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItZ3JheS01MCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLXRhZy1pY29uLWNvbG9yLWRlZmF1bHQ6IHZhcigtLXNwZWN0cnVtLWFsaWFzLWljb24tY29sb3IpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy10YWctaWNvbi1jb2xvci1ob3ZlcjogdmFyKC0tc3BlY3RydW0tYWxpYXMtaWNvbi1jb2xvci1ob3Zlcik7XFxuICAtLXNwZWN0cnVtLWFsaWFzLXRhZy1pY29uLWNvbG9yLWRvd246IHZhcigtLXNwZWN0cnVtLWFsaWFzLWljb24tY29sb3ItZG93bik7XFxuICAtLXNwZWN0cnVtLWFsaWFzLXRhZy1pY29uLWNvbG9yLWtleS1mb2N1czogdmFyKC0tc3BlY3RydW0tYWxpYXMtaWNvbi1jb2xvci1ob3Zlcik7XFxuICAtLXNwZWN0cnVtLWFsaWFzLXRhZy1pY29uLWNvbG9yLWRpc2FibGVkOiB2YXIoLS1zcGVjdHJ1bS1hbGlhcy1pY29uLWNvbG9yLWRpc2FibGVkKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtdGFnLWljb24tY29sb3I6IHZhcigtLXNwZWN0cnVtLWFsaWFzLXRhZy1pY29uLWNvbG9yLWRlZmF1bHQpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy10YWctaWNvbi1jb2xvci1lcnJvcjogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLXJlZC02MDApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy10YWctaWNvbi1jb2xvci1zZWxlY3RlZDogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLWdyYXktNTApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy10YWctYmFja2dyb3VuZC1jb2xvci1kaXNhYmxlZDogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLWdyYXktMjAwKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtdGFnLWJhY2tncm91bmQtY29sb3ItZGVmYXVsdDogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLWdyYXktNTApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy10YWctYmFja2dyb3VuZC1jb2xvci1ob3ZlcjogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLWdyYXktNTApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy10YWctYmFja2dyb3VuZC1jb2xvci1kb3duOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItZ3JheS0yMDApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy10YWctYmFja2dyb3VuZC1jb2xvci1rZXktZm9jdXM6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1ncmF5LTUwKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtdGFnLWJhY2tncm91bmQtY29sb3I6IHZhcigtLXNwZWN0cnVtLWFsaWFzLXRhZy1iYWNrZ3JvdW5kLWNvbG9yLWRlZmF1bHQpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy10YWctYmFja2dyb3VuZC1jb2xvci1lcnJvci1kZWZhdWx0OiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItZ3JheS01MCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLXRhZy1iYWNrZ3JvdW5kLWNvbG9yLWVycm9yLWhvdmVyOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItZ3JheS01MCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLXRhZy1iYWNrZ3JvdW5kLWNvbG9yLWVycm9yLWRvd246IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1ncmF5LTIwMCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLXRhZy1iYWNrZ3JvdW5kLWNvbG9yLWVycm9yLWtleS1mb2N1czogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLWdyYXktNTApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy10YWctYmFja2dyb3VuZC1jb2xvci1lcnJvcjogdmFyKC0tc3BlY3RydW0tYWxpYXMtdGFnLWJhY2tncm91bmQtY29sb3ItZXJyb3ItZGVmYXVsdCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLXRhZy1iYWNrZ3JvdW5kLWNvbG9yLWVycm9yLXNlbGVjdGVkLWRlZmF1bHQ6IHZhcigtLXNwZWN0cnVtLXNlbWFudGljLW5lZ2F0aXZlLWNvbG9yLWRlZmF1bHQpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy10YWctYmFja2dyb3VuZC1jb2xvci1lcnJvci1zZWxlY3RlZC1ob3ZlcjogdmFyKC0tc3BlY3RydW0tc2VtYW50aWMtbmVnYXRpdmUtY29sb3ItaG92ZXIpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy10YWctYmFja2dyb3VuZC1jb2xvci1lcnJvci1zZWxlY3RlZC1kb3duOiB2YXIoLS1zcGVjdHJ1bS1zZW1hbnRpYy1uZWdhdGl2ZS1jb2xvci1ob3Zlcik7XFxuICAtLXNwZWN0cnVtLWFsaWFzLXRhZy1iYWNrZ3JvdW5kLWNvbG9yLWVycm9yLXNlbGVjdGVkLWtleS1mb2N1czogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLXJlZC02MDApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy10YWctYmFja2dyb3VuZC1jb2xvci1lcnJvci1zZWxlY3RlZDogdmFyKC0tc3BlY3RydW0tYWxpYXMtdGFnLWJhY2tncm91bmQtY29sb3ItZXJyb3Itc2VsZWN0ZWQtZGVmYXVsdCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLXRhZy1iYWNrZ3JvdW5kLWNvbG9yLXNlbGVjdGVkLWRlZmF1bHQ6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1ncmF5LTcwMCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLXRhZy1iYWNrZ3JvdW5kLWNvbG9yLXNlbGVjdGVkLWhvdmVyOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItZ3JheS04MDApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy10YWctYmFja2dyb3VuZC1jb2xvci1zZWxlY3RlZC1kb3duOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItZ3JheS05MDApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy10YWctYmFja2dyb3VuZC1jb2xvci1zZWxlY3RlZC1rZXktZm9jdXM6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1ncmF5LTkwMCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLXRhZy1iYWNrZ3JvdW5kLWNvbG9yLXNlbGVjdGVkOiB2YXIoLS1zcGVjdHJ1bS1hbGlhcy10YWctYmFja2dyb3VuZC1jb2xvci1zZWxlY3RlZC1kZWZhdWx0KTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtdGFnLWZvY3VzcmluZy1ib3JkZXItY29sb3ItZGVmYXVsdDogdHJhbnNwYXJlbnQ7XFxuICAtLXNwZWN0cnVtLWFsaWFzLXRhZy1mb2N1c3JpbmctYm9yZGVyLWNvbG9yLWtleS1mb2N1czogdHJhbnNwYXJlbnQ7XFxuICAtLXNwZWN0cnVtLWFsaWFzLXRhZy1mb2N1c3JpbmctYm9yZGVyLWNvbG9yLWRpc2FibGVkOiB0cmFuc3BhcmVudDtcXG4gIC0tc3BlY3RydW0tYWxpYXMtdGFnLWZvY3VzcmluZy1ib3JkZXItY29sb3Itc2VsZWN0ZWQta2V5LWZvY3VzOiB2YXIoLS1zcGVjdHJ1bS1hbGlhcy1mb2N1cy1yaW5nLWNvbG9yKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtdGFnLWZvY3VzcmluZy1ib3JkZXItY29sb3I6IHZhcigtLXNwZWN0cnVtLWFsaWFzLXRhZy1mb2N1c3JpbmctYm9yZGVyLWNvbG9yLWRlZmF1bHQpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1hdmF0YXItYm9yZGVyLWNvbG9yLWRlZmF1bHQ6IHZhcigtLXNwZWN0cnVtLWFsaWFzLWJhY2tncm91bmQtY29sb3ItdHJhbnNwYXJlbnQpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1hdmF0YXItYm9yZGVyLWNvbG9yLWhvdmVyOiB2YXIoLS1zcGVjdHJ1bS1hbGlhcy1iYWNrZ3JvdW5kLWNvbG9yLXRyYW5zcGFyZW50KTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtYXZhdGFyLWJvcmRlci1jb2xvci1kb3duOiB2YXIoLS1zcGVjdHJ1bS1hbGlhcy1iYWNrZ3JvdW5kLWNvbG9yLXRyYW5zcGFyZW50KTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtYXZhdGFyLWJvcmRlci1jb2xvci1rZXktZm9jdXM6IHZhcigtLXNwZWN0cnVtLWFsaWFzLWJhY2tncm91bmQtY29sb3ItdHJhbnNwYXJlbnQpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1hdmF0YXItYm9yZGVyLWNvbG9yOiB2YXIoLS1zcGVjdHJ1bS1hbGlhcy1hdmF0YXItYm9yZGVyLWNvbG9yLWRlZmF1bHQpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1hdmF0YXItYm9yZGVyLWNvbG9yLWRpc2FibGVkOiB2YXIoLS1zcGVjdHJ1bS1hbGlhcy1iYWNrZ3JvdW5kLWNvbG9yLXRyYW5zcGFyZW50KTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtYXZhdGFyLWJvcmRlci1jb2xvci1zZWxlY3RlZC1kZWZhdWx0OiB2YXIoLS1zcGVjdHJ1bS1hbGlhcy1iYWNrZ3JvdW5kLWNvbG9yLXRyYW5zcGFyZW50KTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtYXZhdGFyLWJvcmRlci1jb2xvci1zZWxlY3RlZC1ob3ZlcjogdmFyKC0tc3BlY3RydW0tYWxpYXMtYmFja2dyb3VuZC1jb2xvci10cmFuc3BhcmVudCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWF2YXRhci1ib3JkZXItY29sb3Itc2VsZWN0ZWQtZG93bjogdmFyKC0tc3BlY3RydW0tYWxpYXMtYmFja2dyb3VuZC1jb2xvci10cmFuc3BhcmVudCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWF2YXRhci1ib3JkZXItY29sb3Itc2VsZWN0ZWQta2V5LWZvY3VzOiB2YXIoLS1zcGVjdHJ1bS1hbGlhcy1iYWNrZ3JvdW5kLWNvbG9yLXRyYW5zcGFyZW50KTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtYXZhdGFyLWJvcmRlci1jb2xvci1zZWxlY3RlZDogdmFyKC0tc3BlY3RydW0tYWxpYXMtYXZhdGFyLWJvcmRlci1jb2xvci1zZWxlY3RlZC1kZWZhdWx0KTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtYXZhdGFyLWJvcmRlci1jb2xvci1zZWxlY3RlZC1kaXNhYmxlZDogdmFyKC0tc3BlY3RydW0tYWxpYXMtYmFja2dyb3VuZC1jb2xvci10cmFuc3BhcmVudCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLXRvZ2dsZS1iYWNrZ3JvdW5kLWNvbG9yLWRlZmF1bHQ6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1ncmF5LTcwMCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLXRvZ2dsZS1iYWNrZ3JvdW5kLWNvbG9yLWhvdmVyOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItZ3JheS04MDApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy10b2dnbGUtYmFja2dyb3VuZC1jb2xvci1kb3duOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItZ3JheS05MDApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy10b2dnbGUtYmFja2dyb3VuZC1jb2xvci1rZXktZm9jdXM6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1ncmF5LTgwMCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLXRvZ2dsZS1iYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1zcGVjdHJ1bS1hbGlhcy10b2dnbGUtYmFja2dyb3VuZC1jb2xvci1kZWZhdWx0KTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtdG9nZ2xlLWJhY2tncm91bmQtY29sb3ItZW1waGFzaXplZC1zZWxlY3RlZC1kZWZhdWx0OiB2YXIoLS1zcGVjdHJ1bS1zZW1hbnRpYy1jdGEtYmFja2dyb3VuZC1jb2xvci1kZWZhdWx0KTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtdG9nZ2xlLWJhY2tncm91bmQtY29sb3ItZW1waGFzaXplZC1zZWxlY3RlZC1ob3ZlcjogdmFyKC0tc3BlY3RydW0tc2VtYW50aWMtY3RhLWJhY2tncm91bmQtY29sb3ItaG92ZXIpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy10b2dnbGUtYmFja2dyb3VuZC1jb2xvci1lbXBoYXNpemVkLXNlbGVjdGVkLWRvd246IHZhcigtLXNwZWN0cnVtLXNlbWFudGljLWN0YS1iYWNrZ3JvdW5kLWNvbG9yLWRvd24pO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy10b2dnbGUtYmFja2dyb3VuZC1jb2xvci1lbXBoYXNpemVkLXNlbGVjdGVkLWtleS1mb2N1czogdmFyKC0tc3BlY3RydW0tc2VtYW50aWMtY3RhLWJhY2tncm91bmQtY29sb3Ita2V5LWZvY3VzKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtdG9nZ2xlLWJhY2tncm91bmQtY29sb3ItZW1waGFzaXplZC1zZWxlY3RlZDogdmFyKC0tc3BlY3RydW0tYWxpYXMtdG9nZ2xlLWJhY2tncm91bmQtY29sb3ItZW1waGFzaXplZC1zZWxlY3RlZC1kZWZhdWx0KTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtdG9nZ2xlLWJvcmRlci1jb2xvci1kZWZhdWx0OiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItZ3JheS03MDApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy10b2dnbGUtYm9yZGVyLWNvbG9yLWhvdmVyOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItZ3JheS04MDApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy10b2dnbGUtYm9yZGVyLWNvbG9yLWRvd246IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1ncmF5LTkwMCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLXRvZ2dsZS1ib3JkZXItY29sb3Ita2V5LWZvY3VzOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItZ3JheS04MDApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy10b2dnbGUtYm9yZGVyLWNvbG9yOiB2YXIoLS1zcGVjdHJ1bS1hbGlhcy10b2dnbGUtYm9yZGVyLWNvbG9yLWRlZmF1bHQpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy10b2dnbGUtaWNvbi1jb2xvci1zZWxlY3RlZDogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLWdyYXktNzUpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy10b2dnbGUtaWNvbi1jb2xvci1lbXBoYXNpemVkLXNlbGVjdGVkOiB2YXIoLS1zcGVjdHJ1bS1hbGlhcy1jb21wb25lbnQtaWNvbi1jb2xvci1lbXBoYXNpemVkLXNlbGVjdGVkLWRlZmF1bHQpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1idXR0b24tcHJpbWFyeS1iYWNrZ3JvdW5kLWNvbG9yLWRlZmF1bHQ6IHZhcigtLXNwZWN0cnVtLWFsaWFzLWJhY2tncm91bmQtY29sb3ItdHJhbnNwYXJlbnQpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1idXR0b24tcHJpbWFyeS1iYWNrZ3JvdW5kLWNvbG9yLWhvdmVyOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItZ3JheS04MDApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1idXR0b24tcHJpbWFyeS1iYWNrZ3JvdW5kLWNvbG9yLWRvd246IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1ncmF5LTkwMCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWJ1dHRvbi1wcmltYXJ5LWJhY2tncm91bmQtY29sb3Ita2V5LWZvY3VzOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItZ3JheS04MDApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1idXR0b24tcHJpbWFyeS1iYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1zcGVjdHJ1bS1hbGlhcy1idXR0b24tcHJpbWFyeS1iYWNrZ3JvdW5kLWNvbG9yLWRlZmF1bHQpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1idXR0b24tcHJpbWFyeS1ib3JkZXItY29sb3ItZGVmYXVsdDogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLWdyYXktODAwKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtYnV0dG9uLXByaW1hcnktYm9yZGVyLWNvbG9yLWhvdmVyOiB2YXIoLS1zcGVjdHJ1bS1hbGlhcy1idXR0b24tcHJpbWFyeS1iYWNrZ3JvdW5kLWNvbG9yLWhvdmVyKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtYnV0dG9uLXByaW1hcnktYm9yZGVyLWNvbG9yLWRvd246IHZhcigtLXNwZWN0cnVtLWFsaWFzLWJ1dHRvbi1wcmltYXJ5LWJhY2tncm91bmQtY29sb3ItZG93bik7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWJ1dHRvbi1wcmltYXJ5LWJvcmRlci1jb2xvci1rZXktZm9jdXM6IHZhcigtLXNwZWN0cnVtLWFsaWFzLWJ1dHRvbi1wcmltYXJ5LWJhY2tncm91bmQtY29sb3Ita2V5LWZvY3VzKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtYnV0dG9uLXByaW1hcnktYm9yZGVyLWNvbG9yOiB2YXIoLS1zcGVjdHJ1bS1hbGlhcy1idXR0b24tcHJpbWFyeS1ib3JkZXItY29sb3ItZGVmYXVsdCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWJ1dHRvbi1wcmltYXJ5LXRleHQtY29sb3ItZGVmYXVsdDogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLWdyYXktODAwKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtYnV0dG9uLXByaW1hcnktdGV4dC1jb2xvci1ob3ZlcjogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLWdyYXktNTApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1idXR0b24tcHJpbWFyeS10ZXh0LWNvbG9yLWRvd246IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1ncmF5LTUwKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtYnV0dG9uLXByaW1hcnktdGV4dC1jb2xvci1rZXktZm9jdXM6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1ncmF5LTUwKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtYnV0dG9uLXByaW1hcnktdGV4dC1jb2xvcjogdmFyKC0tc3BlY3RydW0tYWxpYXMtYnV0dG9uLXByaW1hcnktdGV4dC1jb2xvci1kZWZhdWx0KTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtYnV0dG9uLXByaW1hcnktaWNvbi1jb2xvci1kZWZhdWx0OiB2YXIoLS1zcGVjdHJ1bS1hbGlhcy1idXR0b24tcHJpbWFyeS10ZXh0LWNvbG9yLWRlZmF1bHQpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1idXR0b24tcHJpbWFyeS1pY29uLWNvbG9yLWhvdmVyOiB2YXIoLS1zcGVjdHJ1bS1hbGlhcy1idXR0b24tcHJpbWFyeS10ZXh0LWNvbG9yLWhvdmVyKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtYnV0dG9uLXByaW1hcnktaWNvbi1jb2xvci1kb3duOiB2YXIoLS1zcGVjdHJ1bS1hbGlhcy1idXR0b24tcHJpbWFyeS10ZXh0LWNvbG9yLWRvd24pO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1idXR0b24tcHJpbWFyeS1pY29uLWNvbG9yLWtleS1mb2N1czogdmFyKC0tc3BlY3RydW0tYWxpYXMtYnV0dG9uLXByaW1hcnktdGV4dC1jb2xvci1rZXktZm9jdXMpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1idXR0b24tcHJpbWFyeS1pY29uLWNvbG9yOiB2YXIoLS1zcGVjdHJ1bS1hbGlhcy1idXR0b24tcHJpbWFyeS1pY29uLWNvbG9yLWRlZmF1bHQpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1idXR0b24tc2Vjb25kYXJ5LWJhY2tncm91bmQtY29sb3ItZGVmYXVsdDogdmFyKC0tc3BlY3RydW0tYWxpYXMtYmFja2dyb3VuZC1jb2xvci10cmFuc3BhcmVudCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWJ1dHRvbi1zZWNvbmRhcnktYmFja2dyb3VuZC1jb2xvci1ob3ZlcjogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLWdyYXktNzAwKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtYnV0dG9uLXNlY29uZGFyeS1iYWNrZ3JvdW5kLWNvbG9yLWRvd246IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1ncmF5LTgwMCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWJ1dHRvbi1zZWNvbmRhcnktYmFja2dyb3VuZC1jb2xvci1rZXktZm9jdXM6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1ncmF5LTcwMCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWJ1dHRvbi1zZWNvbmRhcnktYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tc3BlY3RydW0tYWxpYXMtYnV0dG9uLXNlY29uZGFyeS1iYWNrZ3JvdW5kLWNvbG9yLWRlZmF1bHQpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1idXR0b24tc2Vjb25kYXJ5LWJvcmRlci1jb2xvci1kZWZhdWx0OiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItZ3JheS03MDApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1idXR0b24tc2Vjb25kYXJ5LWJvcmRlci1jb2xvci1ob3ZlcjogdmFyKC0tc3BlY3RydW0tYWxpYXMtYnV0dG9uLXNlY29uZGFyeS1iYWNrZ3JvdW5kLWNvbG9yLWhvdmVyKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtYnV0dG9uLXNlY29uZGFyeS1ib3JkZXItY29sb3ItZG93bjogdmFyKC0tc3BlY3RydW0tYWxpYXMtYnV0dG9uLXNlY29uZGFyeS1iYWNrZ3JvdW5kLWNvbG9yLWRvd24pO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1idXR0b24tc2Vjb25kYXJ5LWJvcmRlci1jb2xvci1rZXktZm9jdXM6IHZhcigtLXNwZWN0cnVtLWFsaWFzLWJ1dHRvbi1zZWNvbmRhcnktYmFja2dyb3VuZC1jb2xvci1rZXktZm9jdXMpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1idXR0b24tc2Vjb25kYXJ5LWJvcmRlci1jb2xvcjogdmFyKC0tc3BlY3RydW0tYWxpYXMtYnV0dG9uLXNlY29uZGFyeS1ib3JkZXItY29sb3ItZGVmYXVsdCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWJ1dHRvbi1zZWNvbmRhcnktdGV4dC1jb2xvci1kZWZhdWx0OiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItZ3JheS03MDApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1idXR0b24tc2Vjb25kYXJ5LXRleHQtY29sb3ItaG92ZXI6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1ncmF5LTUwKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtYnV0dG9uLXNlY29uZGFyeS10ZXh0LWNvbG9yLWRvd246IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1ncmF5LTUwKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtYnV0dG9uLXNlY29uZGFyeS10ZXh0LWNvbG9yLWtleS1mb2N1czogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLWdyYXktNTApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1idXR0b24tc2Vjb25kYXJ5LXRleHQtY29sb3I6IHZhcigtLXNwZWN0cnVtLWFsaWFzLWJ1dHRvbi1zZWNvbmRhcnktdGV4dC1jb2xvci1kZWZhdWx0KTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtYnV0dG9uLXNlY29uZGFyeS1pY29uLWNvbG9yLWRlZmF1bHQ6IHZhcigtLXNwZWN0cnVtLWFsaWFzLWJ1dHRvbi1zZWNvbmRhcnktdGV4dC1jb2xvci1kZWZhdWx0KTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtYnV0dG9uLXNlY29uZGFyeS1pY29uLWNvbG9yLWhvdmVyOiB2YXIoLS1zcGVjdHJ1bS1hbGlhcy1idXR0b24tc2Vjb25kYXJ5LXRleHQtY29sb3ItaG92ZXIpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1idXR0b24tc2Vjb25kYXJ5LWljb24tY29sb3ItZG93bjogdmFyKC0tc3BlY3RydW0tYWxpYXMtYnV0dG9uLXNlY29uZGFyeS10ZXh0LWNvbG9yLWRvd24pO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1idXR0b24tc2Vjb25kYXJ5LWljb24tY29sb3Ita2V5LWZvY3VzOiB2YXIoLS1zcGVjdHJ1bS1hbGlhcy1idXR0b24tc2Vjb25kYXJ5LXRleHQtY29sb3Ita2V5LWZvY3VzKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtYnV0dG9uLXNlY29uZGFyeS1pY29uLWNvbG9yOiB2YXIoLS1zcGVjdHJ1bS1hbGlhcy1idXR0b24tc2Vjb25kYXJ5LWljb24tY29sb3ItZGVmYXVsdCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWJ1dHRvbi1uZWdhdGl2ZS1iYWNrZ3JvdW5kLWNvbG9yLWRlZmF1bHQ6IHZhcigtLXNwZWN0cnVtLWFsaWFzLWJhY2tncm91bmQtY29sb3ItdHJhbnNwYXJlbnQpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1idXR0b24tbmVnYXRpdmUtYmFja2dyb3VuZC1jb2xvci1ob3ZlcjogdmFyKC0tc3BlY3RydW0tc2VtYW50aWMtbmVnYXRpdmUtdGV4dC1jb2xvci1zbWFsbCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWJ1dHRvbi1uZWdhdGl2ZS1iYWNrZ3JvdW5kLWNvbG9yLWRvd246IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1yZWQtNzAwKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtYnV0dG9uLW5lZ2F0aXZlLWJhY2tncm91bmQtY29sb3Ita2V5LWZvY3VzOiB2YXIoLS1zcGVjdHJ1bS1zZW1hbnRpYy1uZWdhdGl2ZS10ZXh0LWNvbG9yLXNtYWxsKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtYnV0dG9uLW5lZ2F0aXZlLWJhY2tncm91bmQtY29sb3I6IHZhcigtLXNwZWN0cnVtLWFsaWFzLWJ1dHRvbi1uZWdhdGl2ZS1iYWNrZ3JvdW5kLWNvbG9yLWRlZmF1bHQpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1idXR0b24tbmVnYXRpdmUtYm9yZGVyLWNvbG9yLWRlZmF1bHQ6IHZhcigtLXNwZWN0cnVtLXNlbWFudGljLW5lZ2F0aXZlLXRleHQtY29sb3Itc21hbGwpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1idXR0b24tbmVnYXRpdmUtYm9yZGVyLWNvbG9yLWhvdmVyOiB2YXIoLS1zcGVjdHJ1bS1zZW1hbnRpYy1uZWdhdGl2ZS10ZXh0LWNvbG9yLXNtYWxsKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtYnV0dG9uLW5lZ2F0aXZlLWJvcmRlci1jb2xvci1kb3duOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItcmVkLTcwMCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWJ1dHRvbi1uZWdhdGl2ZS1ib3JkZXItY29sb3Ita2V5LWZvY3VzOiB2YXIoLS1zcGVjdHJ1bS1zZW1hbnRpYy1uZWdhdGl2ZS10ZXh0LWNvbG9yLXNtYWxsKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtYnV0dG9uLW5lZ2F0aXZlLWJvcmRlci1jb2xvcjogdmFyKC0tc3BlY3RydW0tYWxpYXMtYnV0dG9uLW5lZ2F0aXZlLWJvcmRlci1jb2xvci1kZWZhdWx0KTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtYnV0dG9uLW5lZ2F0aXZlLXRleHQtY29sb3ItZGVmYXVsdDogdmFyKC0tc3BlY3RydW0tc2VtYW50aWMtbmVnYXRpdmUtdGV4dC1jb2xvci1zbWFsbCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWJ1dHRvbi1uZWdhdGl2ZS10ZXh0LWNvbG9yLWhvdmVyOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItZ3JheS01MCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWJ1dHRvbi1uZWdhdGl2ZS10ZXh0LWNvbG9yLWRvd246IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1ncmF5LTUwKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtYnV0dG9uLW5lZ2F0aXZlLXRleHQtY29sb3Ita2V5LWZvY3VzOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItZ3JheS01MCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWJ1dHRvbi1uZWdhdGl2ZS10ZXh0LWNvbG9yOiB2YXIoLS1zcGVjdHJ1bS1hbGlhcy1idXR0b24tbmVnYXRpdmUtdGV4dC1jb2xvci1kZWZhdWx0KTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtYnV0dG9uLW5lZ2F0aXZlLWljb24tY29sb3ItZGVmYXVsdDogdmFyKC0tc3BlY3RydW0tYWxpYXMtYnV0dG9uLW5lZ2F0aXZlLXRleHQtY29sb3ItZGVmYXVsdCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWJ1dHRvbi1uZWdhdGl2ZS1pY29uLWNvbG9yLWhvdmVyOiB2YXIoLS1zcGVjdHJ1bS1hbGlhcy1idXR0b24tbmVnYXRpdmUtdGV4dC1jb2xvci1ob3Zlcik7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWJ1dHRvbi1uZWdhdGl2ZS1pY29uLWNvbG9yLWRvd246IHZhcigtLXNwZWN0cnVtLWFsaWFzLWJ1dHRvbi1uZWdhdGl2ZS10ZXh0LWNvbG9yLWRvd24pO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1idXR0b24tbmVnYXRpdmUtaWNvbi1jb2xvci1rZXktZm9jdXM6IHZhcigtLXNwZWN0cnVtLWFsaWFzLWJ1dHRvbi1uZWdhdGl2ZS10ZXh0LWNvbG9yLWtleS1mb2N1cyk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWJ1dHRvbi1uZWdhdGl2ZS1pY29uLWNvbG9yOiB2YXIoLS1zcGVjdHJ1bS1hbGlhcy1idXR0b24tbmVnYXRpdmUtaWNvbi1jb2xvci1kZWZhdWx0KTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtaW5wdXQtYm9yZGVyLWNvbG9yLWRpc2FibGVkOiB2YXIoLS1zcGVjdHJ1bS1hbGlhcy1ib3JkZXItY29sb3ItdHJhbnNwYXJlbnQpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1pbnB1dC1ib3JkZXItY29sb3ItcXVpZXQtZGlzYWJsZWQ6IHZhcigtLXNwZWN0cnVtLWFsaWFzLWJvcmRlci1jb2xvci1taWQpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1pbnB1dC1ib3JkZXItY29sb3ItZGVmYXVsdDogdmFyKC0tc3BlY3RydW0tYWxpYXMtYm9yZGVyLWNvbG9yKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtaW5wdXQtYm9yZGVyLWNvbG9yLWhvdmVyOiB2YXIoLS1zcGVjdHJ1bS1hbGlhcy1ib3JkZXItY29sb3ItaG92ZXIpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1pbnB1dC1ib3JkZXItY29sb3ItZG93bjogdmFyKC0tc3BlY3RydW0tYWxpYXMtYm9yZGVyLWNvbG9yLW1vdXNlLWZvY3VzKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtaW5wdXQtYm9yZGVyLWNvbG9yLW1vdXNlLWZvY3VzOiB2YXIoLS1zcGVjdHJ1bS1hbGlhcy1ib3JkZXItY29sb3ItbW91c2UtZm9jdXMpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1pbnB1dC1ib3JkZXItY29sb3Ita2V5LWZvY3VzOiB2YXIoLS1zcGVjdHJ1bS1hbGlhcy1ib3JkZXItY29sb3Ita2V5LWZvY3VzKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtaW5wdXQtYm9yZGVyLWNvbG9yOiB2YXIoLS1zcGVjdHJ1bS1hbGlhcy1pbnB1dC1ib3JkZXItY29sb3ItZGVmYXVsdCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWlucHV0LWJvcmRlci1jb2xvci1pbnZhbGlkLWRlZmF1bHQ6IHZhcigtLXNwZWN0cnVtLXNlbWFudGljLW5lZ2F0aXZlLWNvbG9yLWRlZmF1bHQpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1pbnB1dC1ib3JkZXItY29sb3ItaW52YWxpZC1ob3ZlcjogdmFyKC0tc3BlY3RydW0tc2VtYW50aWMtbmVnYXRpdmUtY29sb3ItaG92ZXIpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1pbnB1dC1ib3JkZXItY29sb3ItaW52YWxpZC1kb3duOiB2YXIoLS1zcGVjdHJ1bS1zZW1hbnRpYy1uZWdhdGl2ZS1jb2xvci1kb3duKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtaW5wdXQtYm9yZGVyLWNvbG9yLWludmFsaWQtbW91c2UtZm9jdXM6IHZhcigtLXNwZWN0cnVtLXNlbWFudGljLW5lZ2F0aXZlLWNvbG9yLWhvdmVyKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtaW5wdXQtYm9yZGVyLWNvbG9yLWludmFsaWQta2V5LWZvY3VzOiB2YXIoLS1zcGVjdHJ1bS1hbGlhcy1ib3JkZXItY29sb3Ita2V5LWZvY3VzKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtaW5wdXQtYm9yZGVyLWNvbG9yLWludmFsaWQ6IHZhcigtLXNwZWN0cnVtLWFsaWFzLWlucHV0LWJvcmRlci1jb2xvci1pbnZhbGlkLWRlZmF1bHQpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1iYWNrZ3JvdW5kLWNvbG9yLXllbGxvdy1kZWZhdWx0OiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3Itc3RhdGljLXllbGxvdy02MDApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1iYWNrZ3JvdW5kLWNvbG9yLXllbGxvdy1ob3ZlcjogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLXN0YXRpYy15ZWxsb3ctNzAwKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtYmFja2dyb3VuZC1jb2xvci15ZWxsb3cta2V5LWZvY3VzOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3Itc3RhdGljLXllbGxvdy03MDApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1iYWNrZ3JvdW5kLWNvbG9yLXllbGxvdy1kb3duOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3Itc3RhdGljLXllbGxvdy04MDApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1iYWNrZ3JvdW5kLWNvbG9yLXllbGxvdzogdmFyKC0tc3BlY3RydW0tYWxpYXMtYmFja2dyb3VuZC1jb2xvci15ZWxsb3ctZGVmYXVsdCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWluZmllbGRidXR0b24tYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLWdyYXktMjAwKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtaW5maWVsZGJ1dHRvbi1maWxsLWxvdWRuZXNzTG93LWJvcmRlci1jb2xvci1kaXNhYmxlZDogdHJhbnNwYXJlbnQ7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWluZmllbGRidXR0b24tZmlsbC1sb3VkbmVzc01lZGl1bS1ib3JkZXItY29sb3ItZGlzYWJsZWQ6IHRyYW5zcGFyZW50O1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1pbmZpZWxkYnV0dG9uLWZpbGwtbG91ZG5lc3NIaWdoLWJvcmRlci1jb2xvci1kaXNhYmxlZDogdmFyKC0tc3BlY3RydW0tYWxpYXMtY29tcG9uZW50LWJhY2tncm91bmQtY29sb3ItZGlzYWJsZWQpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1pbmZpZWxkYnV0dG9uLWZpbGwtYm9yZGVyLWNvbG9yLWRlZmF1bHQ6IHZhcigtLXNwZWN0cnVtLWFsaWFzLWlucHV0LWJvcmRlci1jb2xvci1kZWZhdWx0KTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtaW5maWVsZGJ1dHRvbi1maWxsLWJvcmRlci1jb2xvci1ob3ZlcjogdmFyKC0tc3BlY3RydW0tYWxpYXMtaW5wdXQtYm9yZGVyLWNvbG9yLWhvdmVyKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtaW5maWVsZGJ1dHRvbi1maWxsLWJvcmRlci1jb2xvci1kb3duOiB2YXIoLS1zcGVjdHJ1bS1hbGlhcy1pbnB1dC1ib3JkZXItY29sb3ItZG93bik7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWluZmllbGRidXR0b24tZmlsbC1ib3JkZXItY29sb3ItbW91c2UtZm9jdXM6IHZhcigtLXNwZWN0cnVtLWFsaWFzLWlucHV0LWJvcmRlci1jb2xvci1tb3VzZS1mb2N1cyk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWluZmllbGRidXR0b24tZmlsbC1ib3JkZXItY29sb3Ita2V5LWZvY3VzOiB2YXIoLS1zcGVjdHJ1bS1hbGlhcy1pbnB1dC1ib3JkZXItY29sb3Ita2V5LWZvY3VzKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtaW5maWVsZGJ1dHRvbi1maWxsLWxvdWRuZXNzTG93LWJhY2tncm91bmQtY29sb3ItZGVmYXVsdDogdHJhbnNwYXJlbnQ7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWluZmllbGRidXR0b24tZmlsbC1sb3VkbmVzc0xvdy1iYWNrZ3JvdW5kLWNvbG9yLWhvdmVyOiB0cmFuc3BhcmVudDtcXG4gIC0tc3BlY3RydW0tYWxpYXMtaW5maWVsZGJ1dHRvbi1maWxsLWxvdWRuZXNzTG93LWJhY2tncm91bmQtY29sb3ItZG93bjogdHJhbnNwYXJlbnQ7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWluZmllbGRidXR0b24tZmlsbC1sb3VkbmVzc0xvdy1iYWNrZ3JvdW5kLWNvbG9yLWtleS1mb2N1czogdHJhbnNwYXJlbnQ7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWluZmllbGRidXR0b24tZmlsbC1sb3VkbmVzc0xvdy1iYWNrZ3JvdW5kLWNvbG9yLWRpc2FibGVkOiB0cmFuc3BhcmVudDtcXG4gIC0tc3BlY3RydW0tYWxpYXMtaW5maWVsZGJ1dHRvbi1maWxsLWxvdWRuZXNzTWVkaXVtLWJhY2tncm91bmQtY29sb3ItZGVmYXVsdDogdmFyKC0tc3BlY3RydW0tYWxpYXMtaW5maWVsZGJ1dHRvbi1maWxsLWxvdWRuZXNzTG93LWJhY2tncm91bmQtY29sb3ItZGVmYXVsdCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWluZmllbGRidXR0b24tZmlsbC1sb3VkbmVzc01lZGl1bS1iYWNrZ3JvdW5kLWNvbG9yLWhvdmVyOiB2YXIoLS1zcGVjdHJ1bS1hbGlhcy1pbmZpZWxkYnV0dG9uLWZpbGwtbG91ZG5lc3NMb3ctYmFja2dyb3VuZC1jb2xvci1ob3Zlcik7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWluZmllbGRidXR0b24tZmlsbC1sb3VkbmVzc01lZGl1bS1iYWNrZ3JvdW5kLWNvbG9yLWRvd246IHZhcigtLXNwZWN0cnVtLWFsaWFzLWluZmllbGRidXR0b24tZmlsbC1sb3VkbmVzc0xvdy1iYWNrZ3JvdW5kLWNvbG9yLWRvd24pO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1pbmZpZWxkYnV0dG9uLWZpbGwtbG91ZG5lc3NNZWRpdW0tYmFja2dyb3VuZC1jb2xvci1rZXktZm9jdXM6IHZhcigtLXNwZWN0cnVtLWFsaWFzLWluZmllbGRidXR0b24tZmlsbC1sb3VkbmVzc0xvdy1iYWNrZ3JvdW5kLWNvbG9yLWtleS1mb2N1cyk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWluZmllbGRidXR0b24tZmlsbC1sb3VkbmVzc01lZGl1bS1iYWNrZ3JvdW5kLWNvbG9yLWRpc2FibGVkOiB0cmFuc3BhcmVudDtcXG4gIC0tc3BlY3RydW0tYWxpYXMtaW5maWVsZGJ1dHRvbi1maWxsLWxvdWRuZXNzSGlnaC1iYWNrZ3JvdW5kLWNvbG9yLWRlZmF1bHQ6IHZhcigtLXNwZWN0cnVtLWFsaWFzLWNvbXBvbmVudC1iYWNrZ3JvdW5kLWNvbG9yLWRlZmF1bHQpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1pbmZpZWxkYnV0dG9uLWZpbGwtbG91ZG5lc3NIaWdoLWJhY2tncm91bmQtY29sb3ItaG92ZXI6IHZhcigtLXNwZWN0cnVtLWFsaWFzLWNvbXBvbmVudC1iYWNrZ3JvdW5kLWNvbG9yLWhvdmVyKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtaW5maWVsZGJ1dHRvbi1maWxsLWxvdWRuZXNzSGlnaC1iYWNrZ3JvdW5kLWNvbG9yLWRvd246IHZhcigtLXNwZWN0cnVtLWFsaWFzLWNvbXBvbmVudC1iYWNrZ3JvdW5kLWNvbG9yLWRvd24pO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1pbmZpZWxkYnV0dG9uLWZpbGwtbG91ZG5lc3NIaWdoLWJhY2tncm91bmQtY29sb3Ita2V5LWZvY3VzOiB2YXIoLS1zcGVjdHJ1bS1hbGlhcy1jb21wb25lbnQtYmFja2dyb3VuZC1jb2xvci1rZXktZm9jdXMpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1pbmZpZWxkYnV0dG9uLWZpbGwtbG91ZG5lc3NIaWdoLWJhY2tncm91bmQtY29sb3ItZGlzYWJsZWQ6IHZhcigtLXNwZWN0cnVtLWFsaWFzLWNvbXBvbmVudC1iYWNrZ3JvdW5kLWNvbG9yLWRpc2FibGVkKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtYWN0aW9uYnV0dG9uLXN0YXRpY0JsYWNrLWJvcmRlci1jb2xvci1kZWZhdWx0OiByZ2JhKDAsMCwwLDAuNCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWFjdGlvbmJ1dHRvbi1zdGF0aWNCbGFjay1iYWNrZ3JvdW5kLWNvbG9yLWRlZmF1bHQ6IHRyYW5zcGFyZW50O1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1hY3Rpb25idXR0b24tc3RhdGljQmxhY2stYm9yZGVyLWNvbG9yLWhvdmVyOiByZ2JhKDAsMCwwLDAuNTUpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1hY3Rpb25idXR0b24tc3RhdGljQmxhY2stYmFja2dyb3VuZC1jb2xvci1ob3ZlcjogcmdiYSgwLDAsMCwwLjI1KTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtYWN0aW9uYnV0dG9uLXN0YXRpY0JsYWNrLWJvcmRlci1jb2xvci1kb3duOiByZ2JhKDAsMCwwLDAuNyk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWFjdGlvbmJ1dHRvbi1zdGF0aWNCbGFjay1iYWNrZ3JvdW5kLWNvbG9yLWRvd246IHJnYmEoMCwwLDAsMC40KTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtYWN0aW9uYnV0dG9uLXN0YXRpY0JsYWNrLWJvcmRlci1jb2xvci1rZXktZm9jdXM6IHJnYmEoMCwwLDAsMC41NSk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWFjdGlvbmJ1dHRvbi1zdGF0aWNCbGFjay1iYWNrZ3JvdW5kLWNvbG9yLWtleS1mb2N1czogcmdiYSgwLDAsMCwwLjI1KTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtYWN0aW9uYnV0dG9uLXN0YXRpY0JsYWNrLWJvcmRlci1jb2xvci1kaXNhYmxlZDogcmdiYSgwLDAsMCwwLjI1KTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtYWN0aW9uYnV0dG9uLXN0YXRpY0JsYWNrLWJhY2tncm91bmQtY29sb3ItZGlzYWJsZWQ6IHRyYW5zcGFyZW50O1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1hY3Rpb25idXR0b24tc3RhdGljQmxhY2stYm9yZGVyLWNvbG9yLWRpc2FibGVkLXNlbGVjdGVkOiB0cmFuc3BhcmVudDtcXG4gIC0tc3BlY3RydW0tYWxpYXMtYWN0aW9uYnV0dG9uLXN0YXRpY0JsYWNrLWJhY2tncm91bmQtY29sb3ItZGlzYWJsZWQtc2VsZWN0ZWQ6IHJnYmEoMCwwLDAsMC4xKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtYWN0aW9uYnV0dG9uLXN0YXRpY1doaXRlLWJvcmRlci1jb2xvci1kZWZhdWx0OiByZ2JhKDI1NSwyNTUsMjU1LDAuNCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWFjdGlvbmJ1dHRvbi1zdGF0aWNXaGl0ZS1iYWNrZ3JvdW5kLWNvbG9yLWRlZmF1bHQ6IHRyYW5zcGFyZW50O1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1hY3Rpb25idXR0b24tc3RhdGljV2hpdGUtYm9yZGVyLWNvbG9yLWhvdmVyOiByZ2JhKDI1NSwyNTUsMjU1LDAuNTUpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1hY3Rpb25idXR0b24tc3RhdGljV2hpdGUtYmFja2dyb3VuZC1jb2xvci1ob3ZlcjogcmdiYSgyNTUsMjU1LDI1NSwwLjI1KTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtYWN0aW9uYnV0dG9uLXN0YXRpY1doaXRlLWJvcmRlci1jb2xvci1kb3duOiByZ2JhKDI1NSwyNTUsMjU1LDAuNyk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWFjdGlvbmJ1dHRvbi1zdGF0aWNXaGl0ZS1iYWNrZ3JvdW5kLWNvbG9yLWRvd246IHJnYmEoMjU1LDI1NSwyNTUsMC40KTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtYWN0aW9uYnV0dG9uLXN0YXRpY1doaXRlLWJvcmRlci1jb2xvci1rZXktZm9jdXM6IHJnYmEoMjU1LDI1NSwyNTUsMC41NSk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWFjdGlvbmJ1dHRvbi1zdGF0aWNXaGl0ZS1iYWNrZ3JvdW5kLWNvbG9yLWtleS1mb2N1czogcmdiYSgyNTUsMjU1LDI1NSwwLjI1KTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtYWN0aW9uYnV0dG9uLXN0YXRpY1doaXRlLWJvcmRlci1jb2xvci1kaXNhYmxlZDogcmdiYSgyNTUsMjU1LDI1NSwwLjI1KTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtYWN0aW9uYnV0dG9uLXN0YXRpY1doaXRlLWJhY2tncm91bmQtY29sb3ItZGlzYWJsZWQ6IHRyYW5zcGFyZW50O1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1hY3Rpb25idXR0b24tc3RhdGljV2hpdGUtYm9yZGVyLWNvbG9yLWRpc2FibGVkLXNlbGVjdGVkOiB0cmFuc3BhcmVudDtcXG4gIC0tc3BlY3RydW0tYWxpYXMtYWN0aW9uYnV0dG9uLXN0YXRpY1doaXRlLWJhY2tncm91bmQtY29sb3ItZGlzYWJsZWQtc2VsZWN0ZWQ6IHJnYmEoMjU1LDI1NSwyNTUsMC4xKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtdGFicy1kaXZpZGVyLWJhY2tncm91bmQtY29sb3ItZGVmYXVsdDogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLWdyYXktMzAwKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtdGFicy1kaXZpZGVyLWJhY2tncm91bmQtY29sb3ItcXVpZXQ6IHZhcigtLXNwZWN0cnVtLWFsaWFzLWJhY2tncm91bmQtY29sb3ItdHJhbnNwYXJlbnQpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy10YWJpdGVtLXRleHQtY29sb3ItZGVmYXVsdDogdmFyKC0tc3BlY3RydW0tYWxpYXMtbGFiZWwtdGV4dC1jb2xvcik7XFxuICAtLXNwZWN0cnVtLWFsaWFzLXRhYml0ZW0tdGV4dC1jb2xvci1ob3ZlcjogdmFyKC0tc3BlY3RydW0tYWxpYXMtdGV4dC1jb2xvci1ob3Zlcik7XFxuICAtLXNwZWN0cnVtLWFsaWFzLXRhYml0ZW0tdGV4dC1jb2xvci1kb3duOiB2YXIoLS1zcGVjdHJ1bS1hbGlhcy10ZXh0LWNvbG9yLWRvd24pO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy10YWJpdGVtLXRleHQtY29sb3Ita2V5LWZvY3VzOiB2YXIoLS1zcGVjdHJ1bS1hbGlhcy10ZXh0LWNvbG9yLWhvdmVyKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtdGFiaXRlbS10ZXh0LWNvbG9yLW1vdXNlLWZvY3VzOiB2YXIoLS1zcGVjdHJ1bS1hbGlhcy10ZXh0LWNvbG9yLWhvdmVyKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtdGFiaXRlbS10ZXh0LWNvbG9yOiB2YXIoLS1zcGVjdHJ1bS1hbGlhcy10YWJpdGVtLXRleHQtY29sb3ItZGVmYXVsdCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLXRhYml0ZW0tdGV4dC1jb2xvci1zZWxlY3RlZC1kZWZhdWx0OiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItZ3JheS05MDApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy10YWJpdGVtLXRleHQtY29sb3Itc2VsZWN0ZWQtaG92ZXI6IHZhcigtLXNwZWN0cnVtLWFsaWFzLXRhYml0ZW0tdGV4dC1jb2xvci1zZWxlY3RlZC1kZWZhdWx0KTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtdGFiaXRlbS10ZXh0LWNvbG9yLXNlbGVjdGVkLWRvd246IHZhcigtLXNwZWN0cnVtLWFsaWFzLXRhYml0ZW0tdGV4dC1jb2xvci1zZWxlY3RlZC1kZWZhdWx0KTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtdGFiaXRlbS10ZXh0LWNvbG9yLXNlbGVjdGVkLWtleS1mb2N1czogdmFyKC0tc3BlY3RydW0tYWxpYXMtdGFiaXRlbS10ZXh0LWNvbG9yLXNlbGVjdGVkLWRlZmF1bHQpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy10YWJpdGVtLXRleHQtY29sb3Itc2VsZWN0ZWQtbW91c2UtZm9jdXM6IHZhcigtLXNwZWN0cnVtLWFsaWFzLXRhYml0ZW0tdGV4dC1jb2xvci1zZWxlY3RlZC1kZWZhdWx0KTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtdGFiaXRlbS10ZXh0LWNvbG9yLXNlbGVjdGVkOiB2YXIoLS1zcGVjdHJ1bS1hbGlhcy10YWJpdGVtLXRleHQtY29sb3Itc2VsZWN0ZWQtZGVmYXVsdCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLXRhYml0ZW0tdGV4dC1jb2xvci1lbXBoYXNpemVkOiB2YXIoLS1zcGVjdHJ1bS1hbGlhcy10YWJpdGVtLXRleHQtY29sb3ItZGVmYXVsdCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLXRhYml0ZW0tdGV4dC1jb2xvci1lbXBoYXNpemVkLXNlbGVjdGVkLWRlZmF1bHQ6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1zdGF0aWMtYmx1ZS01MDApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy10YWJpdGVtLXRleHQtY29sb3ItZW1waGFzaXplZC1zZWxlY3RlZC1ob3ZlcjogdmFyKC0tc3BlY3RydW0tYWxpYXMtdGFiaXRlbS10ZXh0LWNvbG9yLWVtcGhhc2l6ZWQtc2VsZWN0ZWQtZGVmYXVsdCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLXRhYml0ZW0tdGV4dC1jb2xvci1lbXBoYXNpemVkLXNlbGVjdGVkLWRvd246IHZhcigtLXNwZWN0cnVtLWFsaWFzLXRhYml0ZW0tdGV4dC1jb2xvci1lbXBoYXNpemVkLXNlbGVjdGVkLWRlZmF1bHQpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy10YWJpdGVtLXRleHQtY29sb3ItZW1waGFzaXplZC1zZWxlY3RlZC1rZXktZm9jdXM6IHZhcigtLXNwZWN0cnVtLWFsaWFzLXRhYml0ZW0tdGV4dC1jb2xvci1lbXBoYXNpemVkLXNlbGVjdGVkLWRlZmF1bHQpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy10YWJpdGVtLXRleHQtY29sb3ItZW1waGFzaXplZC1zZWxlY3RlZC1tb3VzZS1mb2N1czogdmFyKC0tc3BlY3RydW0tYWxpYXMtdGFiaXRlbS10ZXh0LWNvbG9yLWVtcGhhc2l6ZWQtc2VsZWN0ZWQtZGVmYXVsdCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLXRhYml0ZW0tdGV4dC1jb2xvci1lbXBoYXNpemVkLXNlbGVjdGVkOiB2YXIoLS1zcGVjdHJ1bS1hbGlhcy10YWJpdGVtLXRleHQtY29sb3ItZW1waGFzaXplZC1zZWxlY3RlZC1kZWZhdWx0KTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtdGFiaXRlbS1zZWxlY3Rpb24taW5kaWNhdG9yLWNvbG9yLWRlZmF1bHQ6IHZhcigtLXNwZWN0cnVtLWFsaWFzLXRhYml0ZW0tdGV4dC1jb2xvci1zZWxlY3RlZC1kZWZhdWx0KTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtdGFiaXRlbS1zZWxlY3Rpb24taW5kaWNhdG9yLWNvbG9yLWVtcGhhc2l6ZWQ6IHZhcigtLXNwZWN0cnVtLWFsaWFzLXRhYml0ZW0tdGV4dC1jb2xvci1lbXBoYXNpemVkLXNlbGVjdGVkLWRlZmF1bHQpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy10YWJpdGVtLWljb24tY29sb3ItZGlzYWJsZWQ6IHZhcigtLXNwZWN0cnVtLWFsaWFzLXRleHQtY29sb3ItZGlzYWJsZWQpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy10YWJpdGVtLWljb24tY29sb3ItZGVmYXVsdDogdmFyKC0tc3BlY3RydW0tYWxpYXMtaWNvbi1jb2xvcik7XFxuICAtLXNwZWN0cnVtLWFsaWFzLXRhYml0ZW0taWNvbi1jb2xvci1ob3ZlcjogdmFyKC0tc3BlY3RydW0tYWxpYXMtaWNvbi1jb2xvci1ob3Zlcik7XFxuICAtLXNwZWN0cnVtLWFsaWFzLXRhYml0ZW0taWNvbi1jb2xvci1kb3duOiB2YXIoLS1zcGVjdHJ1bS1hbGlhcy1pY29uLWNvbG9yLWRvd24pO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy10YWJpdGVtLWljb24tY29sb3Ita2V5LWZvY3VzOiB2YXIoLS1zcGVjdHJ1bS1hbGlhcy1pY29uLWNvbG9yLWhvdmVyKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtdGFiaXRlbS1pY29uLWNvbG9yLW1vdXNlLWZvY3VzOiB2YXIoLS1zcGVjdHJ1bS1hbGlhcy1pY29uLWNvbG9yLWRvd24pO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy10YWJpdGVtLWljb24tY29sb3I6IHZhcigtLXNwZWN0cnVtLWFsaWFzLXRhYml0ZW0taWNvbi1jb2xvci1kZWZhdWx0KTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtdGFiaXRlbS1pY29uLWNvbG9yLXNlbGVjdGVkOiB2YXIoLS1zcGVjdHJ1bS1hbGlhcy1pY29uLWNvbG9yLXNlbGVjdGVkLW5ldXRyYWwpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy10YWJpdGVtLWljb24tY29sb3ItZW1waGFzaXplZDogdmFyKC0tc3BlY3RydW0tYWxpYXMtdGFiaXRlbS10ZXh0LWNvbG9yLWRlZmF1bHQpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy10YWJpdGVtLWljb24tY29sb3ItZW1waGFzaXplZC1zZWxlY3RlZDogdmFyKC0tc3BlY3RydW0tYWxpYXMtdGFiaXRlbS10ZXh0LWNvbG9yLWVtcGhhc2l6ZWQtc2VsZWN0ZWQtZGVmYXVsdCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWJhY2tncm91bmQtY29sb3ItZGVmYXVsdDogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLWdyYXktMTAwKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtYmFja2dyb3VuZC1jb2xvci1kaXNhYmxlZDogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLWdyYXktMjAwKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtYmFja2dyb3VuZC1jb2xvci10cmFuc3BhcmVudDogdHJhbnNwYXJlbnQ7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWJhY2tncm91bmQtY29sb3Itb3ZlcmJhY2tncm91bmQtZG93bjogcmdiYSgyNTUsMjU1LDI1NSwwLjIpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1iYWNrZ3JvdW5kLWNvbG9yLXF1aWV0LW92ZXJiYWNrZ3JvdW5kLWhvdmVyOiByZ2JhKDI1NSwyNTUsMjU1LDAuMSk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWJhY2tncm91bmQtY29sb3ItcXVpZXQtb3ZlcmJhY2tncm91bmQtZG93bjogcmdiYSgyNTUsMjU1LDI1NSwwLjIpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1iYWNrZ3JvdW5kLWNvbG9yLW92ZXJiYWNrZ3JvdW5kLWRpc2FibGVkOiByZ2JhKDI1NSwyNTUsMjU1LDAuMSk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWJhY2tncm91bmQtY29sb3ItcXVpY2thY3Rpb25zLW92ZXJsYXk6IHJnYmEoMCwwLDAsMC4yKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtcGxhY2Vob2xkZXItdGV4dC1jb2xvcjogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLWdyYXktODAwKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtcGxhY2Vob2xkZXItdGV4dC1jb2xvci1ob3ZlcjogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLWdyYXktOTAwKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtcGxhY2Vob2xkZXItdGV4dC1jb2xvci1kb3duOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItZ3JheS05MDApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1wbGFjZWhvbGRlci10ZXh0LWNvbG9yLXNlbGVjdGVkOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItZ3JheS04MDApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1sYWJlbC10ZXh0LWNvbG9yOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItZ3JheS03MDApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy10ZXh0LWNvbG9yOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItZ3JheS04MDApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy10ZXh0LWNvbG9yLWhvdmVyOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItZ3JheS05MDApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy10ZXh0LWNvbG9yLWRvd246IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1ncmF5LTkwMCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLXRleHQtY29sb3Ita2V5LWZvY3VzOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItYmx1ZS02MDApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy10ZXh0LWNvbG9yLW1vdXNlLWZvY3VzOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItYmx1ZS02MDApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy10ZXh0LWNvbG9yLWRpc2FibGVkOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItZ3JheS01MDApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy10ZXh0LWNvbG9yLWludmFsaWQ6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1yZWQtNTAwKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtdGV4dC1jb2xvci1zZWxlY3RlZDogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLWJsdWUtNjAwKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtdGV4dC1jb2xvci1zZWxlY3RlZC1uZXV0cmFsOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItZ3JheS05MDApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy10ZXh0LWNvbG9yLW92ZXJiYWNrZ3JvdW5kOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3Itc3RhdGljLXdoaXRlKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtdGV4dC1jb2xvci1vdmVyYmFja2dyb3VuZC1kaXNhYmxlZDogcmdiYSgyNTUsMjU1LDI1NSwwLjIpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy10ZXh0LWNvbG9yLXF1aWV0LW92ZXJiYWNrZ3JvdW5kLWRpc2FibGVkOiByZ2JhKDI1NSwyNTUsMjU1LDAuMik7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWhlYWRpbmctdGV4dC1jb2xvcjogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLWdyYXktOTAwKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtbGluay1wcmltYXJ5LXRleHQtY29sb3ItZGVmYXVsdDogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLWJsdWUtNjAwKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtbGluay1wcmltYXJ5LXRleHQtY29sb3ItaG92ZXI6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1ibHVlLTYwMCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWxpbmstcHJpbWFyeS10ZXh0LWNvbG9yLWRvd246IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1ibHVlLTcwMCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWxpbmstcHJpbWFyeS10ZXh0LWNvbG9yLWtleS1mb2N1czogdmFyKC0tc3BlY3RydW0tYWxpYXMtdGV4dC1jb2xvci1rZXktZm9jdXMpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1saW5rLXByaW1hcnktdGV4dC1jb2xvcjogdmFyKC0tc3BlY3RydW0tYWxpYXMtbGluay1wcmltYXJ5LXRleHQtY29sb3ItZGVmYXVsdCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWxpbmstc2Vjb25kYXJ5LXRleHQtY29sb3ItZGVmYXVsdDogdmFyKC0tc3BlY3RydW0tYWxpYXMtbGluay1wcmltYXJ5LXRleHQtY29sb3ItZGVmYXVsdCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWxpbmstc2Vjb25kYXJ5LXRleHQtY29sb3ItaG92ZXI6IHZhcigtLXNwZWN0cnVtLWFsaWFzLWxpbmstcHJpbWFyeS10ZXh0LWNvbG9yLWhvdmVyKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtbGluay1zZWNvbmRhcnktdGV4dC1jb2xvci1kb3duOiB2YXIoLS1zcGVjdHJ1bS1hbGlhcy1saW5rLXByaW1hcnktdGV4dC1jb2xvci1kb3duKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtbGluay1zZWNvbmRhcnktdGV4dC1jb2xvci1rZXktZm9jdXM6IHZhcigtLXNwZWN0cnVtLWFsaWFzLWxpbmstcHJpbWFyeS10ZXh0LWNvbG9yLWtleS1mb2N1cyk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWxpbmstc2Vjb25kYXJ5LXRleHQtY29sb3I6IHZhcigtLXNwZWN0cnVtLWFsaWFzLWxpbmstc2Vjb25kYXJ5LXRleHQtY29sb3ItZGVmYXVsdCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWJvcmRlci1jb2xvcjogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLWdyYXktNDAwKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtYm9yZGVyLWNvbG9yLWhvdmVyOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItZ3JheS01MDApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1ib3JkZXItY29sb3ItZG93bjogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLWdyYXktNTAwKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtYm9yZGVyLWNvbG9yLWtleS1mb2N1czogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLWJsdWUtNDAwKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtYm9yZGVyLWNvbG9yLW1vdXNlLWZvY3VzOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItYmx1ZS01MDApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1ib3JkZXItY29sb3ItZGlzYWJsZWQ6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1ncmF5LTIwMCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWJvcmRlci1jb2xvci1leHRyYWxpZ2h0OiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItZ3JheS0xMDApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1ib3JkZXItY29sb3ItbGlnaHQ6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1ncmF5LTIwMCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWJvcmRlci1jb2xvci1taWQ6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1ncmF5LTMwMCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWJvcmRlci1jb2xvci1kYXJrOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItZ3JheS00MDApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1ib3JkZXItY29sb3ItZGFya2VyLWRlZmF1bHQ6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1ncmF5LTYwMCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWJvcmRlci1jb2xvci1kYXJrZXItaG92ZXI6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1ncmF5LTkwMCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWJvcmRlci1jb2xvci1kYXJrZXItZG93bjogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLWdyYXktOTAwKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtYm9yZGVyLWNvbG9yLXRyYW5zcGFyZW50OiB0cmFuc3BhcmVudDtcXG4gIC0tc3BlY3RydW0tYWxpYXMtYm9yZGVyLWNvbG9yLXRyYW5zbHVjZW50LWRhcms6IHJnYmEoMCwwLDAsMC4wNSk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWJvcmRlci1jb2xvci10cmFuc2x1Y2VudC1kYXJrZXI6IHJnYmEoMCwwLDAsMC4xKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtZm9jdXMtY29sb3I6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1ibHVlLTQwMCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWZvY3VzLXJpbmctY29sb3I6IHZhcigtLXNwZWN0cnVtLWFsaWFzLWZvY3VzLWNvbG9yKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtdHJhY2stY29sb3ItZGVmYXVsdDogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLWdyYXktNDAwKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtdHJhY2stZmlsbC1jb2xvci1vdmVyYmFja2dyb3VuZDogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLXN0YXRpYy13aGl0ZSk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLXRyYWNrLWNvbG9yLWRpc2FibGVkOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItZ3JheS0zMDApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy10aHVtYm5haWwtZGFya3NxdWFyZS1iYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItZ3JheS0zMDApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy10aHVtYm5haWwtbGlnaHRzcXVhcmUtYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLXN0YXRpYy13aGl0ZSk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLXRyYWNrLWNvbG9yLW92ZXJiYWNrZ3JvdW5kOiByZ2JhKDI1NSwyNTUsMjU1LDAuMik7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWljb24tY29sb3I6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1ncmF5LTcwMCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWljb24tY29sb3Itb3ZlcmJhY2tncm91bmQ6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1zdGF0aWMtd2hpdGUpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1pY29uLWNvbG9yLWhvdmVyOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItZ3JheS05MDApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1pY29uLWNvbG9yLWRvd246IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1ncmF5LTkwMCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWljb24tY29sb3Ita2V5LWZvY3VzOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItZ3JheS05MDApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1pY29uLWNvbG9yLWRpc2FibGVkOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItZ3JheS00MDApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1pY29uLWNvbG9yLW92ZXJiYWNrZ3JvdW5kLWRpc2FibGVkOiByZ2JhKDI1NSwyNTUsMjU1LDAuMik7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWljb24tY29sb3ItcXVpZXQtb3ZlcmJhY2tncm91bmQtZGlzYWJsZWQ6IHJnYmEoMjU1LDI1NSwyNTUsMC4xNSk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWljb24tY29sb3Itc2VsZWN0ZWQtbmV1dHJhbDogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLWdyYXktOTAwKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtaWNvbi1jb2xvci1zZWxlY3RlZC1uZXV0cmFsLXN1YmR1ZWQ6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1ncmF5LTgwMCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWljb24tY29sb3Itc2VsZWN0ZWQ6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1ibHVlLTUwMCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWljb24tY29sb3Itc2VsZWN0ZWQtaG92ZXI6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1ibHVlLTYwMCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWljb24tY29sb3Itc2VsZWN0ZWQtZG93bjogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLWJsdWUtNzAwKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtaWNvbi1jb2xvci1zZWxlY3RlZC1mb2N1czogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLWJsdWUtNjAwKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtaW1hZ2Utb3BhY2l0eS1kaXNhYmxlZDogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLW9wYWNpdHktMzApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy10b29sYmFyLWJhY2tncm91bmQtY29sb3I6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1ncmF5LTEwMCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWNvZGUtaGlnaGxpZ2h0LWNvbG9yLWRlZmF1bHQ6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1ncmF5LTgwMCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWNvZGUtaGlnaGxpZ2h0LWJhY2tncm91bmQtY29sb3I6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1ncmF5LTc1KTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtY29kZS1oaWdobGlnaHQtY29sb3Ita2V5d29yZDogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLWZ1Y2hzaWEtNjAwKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtY29kZS1oaWdobGlnaHQtY29sb3Itc2VjdGlvbjogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLXJlZC02MDApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1jb2RlLWhpZ2hsaWdodC1jb2xvci1saXRlcmFsOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItYmx1ZS02MDApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1jb2RlLWhpZ2hsaWdodC1jb2xvci1hdHRyaWJ1dGU6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1zZWFmb2FtLTYwMCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWNvZGUtaGlnaGxpZ2h0LWNvbG9yLWNsYXNzOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItbWFnZW50YS02MDApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1jb2RlLWhpZ2hsaWdodC1jb2xvci12YXJpYWJsZTogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLXB1cnBsZS02MDApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1jb2RlLWhpZ2hsaWdodC1jb2xvci10aXRsZTogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLWluZGlnby02MDApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1jb2RlLWhpZ2hsaWdodC1jb2xvci1zdHJpbmc6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1mdWNoc2lhLTYwMCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWNvZGUtaGlnaGxpZ2h0LWNvbG9yLWZ1bmN0aW9uOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItYmx1ZS02MDApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1jb2RlLWhpZ2hsaWdodC1jb2xvci1jb21tZW50OiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItZ3JheS03MDApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1jYXRlZ29yaWNhbC1jb2xvci0xOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3Itc3RhdGljLXNlYWZvYW0tMjAwKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtY2F0ZWdvcmljYWwtY29sb3ItMjogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLXN0YXRpYy1pbmRpZ28tNzAwKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtY2F0ZWdvcmljYWwtY29sb3ItMzogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLXN0YXRpYy1vcmFuZ2UtNTAwKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtY2F0ZWdvcmljYWwtY29sb3ItNDogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLXN0YXRpYy1tYWdlbnRhLTUwMCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWNhdGVnb3JpY2FsLWNvbG9yLTU6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1zdGF0aWMtaW5kaWdvLTIwMCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWNhdGVnb3JpY2FsLWNvbG9yLTY6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1zdGF0aWMtY2VsZXJ5LTIwMCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWNhdGVnb3JpY2FsLWNvbG9yLTc6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1zdGF0aWMtYmx1ZS01MDApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1jYXRlZ29yaWNhbC1jb2xvci04OiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3Itc3RhdGljLXB1cnBsZS04MDApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1jYXRlZ29yaWNhbC1jb2xvci05OiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3Itc3RhdGljLXllbGxvdy01MDApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1jYXRlZ29yaWNhbC1jb2xvci0xMDogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLXN0YXRpYy1vcmFuZ2UtNzAwKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtY2F0ZWdvcmljYWwtY29sb3ItMTE6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1zdGF0aWMtZ3JlZW4tNjAwKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtY2F0ZWdvcmljYWwtY29sb3ItMTI6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1zdGF0aWMtY2hhcnRyZXVzZS0zMDApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1jYXRlZ29yaWNhbC1jb2xvci0xMzogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLXN0YXRpYy1ibHVlLTIwMCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWNhdGVnb3JpY2FsLWNvbG9yLTE0OiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3Itc3RhdGljLWZ1Y2hzaWEtNTAwKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtY2F0ZWdvcmljYWwtY29sb3ItMTU6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1zdGF0aWMtbWFnZW50YS0yMDApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1jYXRlZ29yaWNhbC1jb2xvci0xNjogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLXN0YXRpYy15ZWxsb3ctMjAwKTtcXG59XFxuXCIsIFwiXCJdKTtcblxuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///102\n")},function(module,exports,__webpack_require__){eval("var api = __webpack_require__(5);\n            var content = __webpack_require__(104);\n\n            content = content.__esModule ? content.default : content;\n\n            if (typeof content === 'string') {\n              content = [[module.i, content, '']];\n            }\n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = api(content, options);\n\n\n\nmodule.exports = content.locals || {};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTAzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BzcGVjdHJ1bS1jc3MvdmFycy9kaXN0L3NwZWN0cnVtLWxpZ2h0LmNzcz9kNGRmIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBhcGkgPSByZXF1aXJlKFwiIS4uLy4uLy4uL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzXCIpO1xuICAgICAgICAgICAgdmFyIGNvbnRlbnQgPSByZXF1aXJlKFwiISEuLi8uLi8uLi9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vc3BlY3RydW0tbGlnaHQuY3NzXCIpO1xuXG4gICAgICAgICAgICBjb250ZW50ID0gY29udGVudC5fX2VzTW9kdWxlID8gY29udGVudC5kZWZhdWx0IDogY29udGVudDtcblxuICAgICAgICAgICAgaWYgKHR5cGVvZiBjb250ZW50ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICBjb250ZW50ID0gW1ttb2R1bGUuaWQsIGNvbnRlbnQsICcnXV07XG4gICAgICAgICAgICB9XG5cbnZhciBvcHRpb25zID0ge307XG5cbm9wdGlvbnMuaW5zZXJ0ID0gXCJoZWFkXCI7XG5vcHRpb25zLnNpbmdsZXRvbiA9IGZhbHNlO1xuXG52YXIgdXBkYXRlID0gYXBpKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5cblxubW9kdWxlLmV4cG9ydHMgPSBjb250ZW50LmxvY2FscyB8fCB7fTsiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///103\n")},function(module,exports,__webpack_require__){eval('exports = module.exports = __webpack_require__(6)(false);\n// Module\nexports.push([module.i, ".spectrum--light {\\n  --spectrum-global-color-status: Verified;\\n  --spectrum-global-color-version: 5.1.0;\\n  --spectrum-global-color-opacity-100: 1;\\n  --spectrum-global-color-opacity-90: 0.9;\\n  --spectrum-global-color-opacity-80: 0.8;\\n  --spectrum-global-color-opacity-70: 0.7;\\n  --spectrum-global-color-opacity-60: 0.6;\\n  --spectrum-global-color-opacity-55: 0.55;\\n  --spectrum-global-color-opacity-50: 0.5;\\n  --spectrum-global-color-opacity-42: 0.42;\\n  --spectrum-global-color-opacity-40: 0.4;\\n  --spectrum-global-color-opacity-30: 0.3;\\n  --spectrum-global-color-opacity-25: 0.25;\\n  --spectrum-global-color-opacity-20: 0.2;\\n  --spectrum-global-color-opacity-15: 0.15;\\n  --spectrum-global-color-opacity-10: 0.1;\\n  --spectrum-global-color-opacity-8: 0.08;\\n  --spectrum-global-color-opacity-7: 0.07;\\n  --spectrum-global-color-opacity-6: 0.06;\\n  --spectrum-global-color-opacity-5: 0.05;\\n  --spectrum-global-color-opacity-4: 0.04;\\n  --spectrum-global-color-opacity-0: 0.00;\\n  --spectrum-global-color-celery-400: rgb(68, 181, 86);\\n  --spectrum-global-color-celery-500: rgb(61, 167, 78);\\n  --spectrum-global-color-celery-600: rgb(55, 153, 71);\\n  --spectrum-global-color-celery-700: rgb(49, 139, 64);\\n  --spectrum-global-color-chartreuse-400: rgb(133, 208, 68);\\n  --spectrum-global-color-chartreuse-500: rgb(124, 195, 63);\\n  --spectrum-global-color-chartreuse-600: rgb(115, 181, 58);\\n  --spectrum-global-color-chartreuse-700: rgb(106, 168, 52);\\n  --spectrum-global-color-yellow-400: rgb(223, 191, 0);\\n  --spectrum-global-color-yellow-500: rgb(210, 178, 0);\\n  --spectrum-global-color-yellow-600: rgb(196, 166, 0);\\n  --spectrum-global-color-yellow-700: rgb(183, 153, 0);\\n  --spectrum-global-color-magenta-400: rgb(216, 55, 144);\\n  --spectrum-global-color-magenta-500: rgb(206, 39, 131);\\n  --spectrum-global-color-magenta-600: rgb(188, 28, 116);\\n  --spectrum-global-color-magenta-700: rgb(174, 14, 102);\\n  --spectrum-global-color-fuchsia-400: rgb(192, 56, 204);\\n  --spectrum-global-color-fuchsia-500: rgb(177, 48, 189);\\n  --spectrum-global-color-fuchsia-600: rgb(162, 40, 173);\\n  --spectrum-global-color-fuchsia-700: rgb(147, 33, 158);\\n  --spectrum-global-color-purple-400: rgb(146, 86, 217);\\n  --spectrum-global-color-purple-500: rgb(134, 76, 204);\\n  --spectrum-global-color-purple-600: rgb(122, 66, 191);\\n  --spectrum-global-color-purple-700: rgb(111, 56, 177);\\n  --spectrum-global-color-indigo-400: rgb(103, 103, 236);\\n  --spectrum-global-color-indigo-500: rgb(92, 92, 224);\\n  --spectrum-global-color-indigo-600: rgb(81, 81, 211);\\n  --spectrum-global-color-indigo-700: rgb(70, 70, 198);\\n  --spectrum-global-color-seafoam-400: rgb(27, 149, 154);\\n  --spectrum-global-color-seafoam-500: rgb(22, 135, 140);\\n  --spectrum-global-color-seafoam-600: rgb(15, 121, 125);\\n  --spectrum-global-color-seafoam-700: rgb(9, 108, 111);\\n  --spectrum-global-color-red-400: rgb(227, 72, 80);\\n  --spectrum-global-color-red-500: rgb(215, 55, 63);\\n  --spectrum-global-color-red-600: rgb(201, 37, 45);\\n  --spectrum-global-color-red-700: rgb(187, 18, 26);\\n  --spectrum-global-color-orange-400: rgb(230, 134, 25);\\n  --spectrum-global-color-orange-500: rgb(218, 123, 17);\\n  --spectrum-global-color-orange-600: rgb(203, 111, 16);\\n  --spectrum-global-color-orange-700: rgb(189, 100, 13);\\n  --spectrum-global-color-green-400: rgb(45, 157, 120);\\n  --spectrum-global-color-green-500: rgb(38, 142, 108);\\n  --spectrum-global-color-green-600: rgb(18, 128, 92);\\n  --spectrum-global-color-green-700: rgb(16, 113, 84);\\n  --spectrum-global-color-blue-400: rgb(38, 128, 235);\\n  --spectrum-global-color-blue-500: rgb(20, 115, 230);\\n  --spectrum-global-color-blue-600: rgb(13, 102, 208);\\n  --spectrum-global-color-blue-700: rgb(9, 90, 186);\\n  --spectrum-global-color-gray-50: rgb(255, 255, 255);\\n  --spectrum-global-color-gray-75: rgb(250, 250, 250);\\n  --spectrum-global-color-gray-100: rgb(245, 245, 245);\\n  --spectrum-global-color-gray-200: rgb(234, 234, 234);\\n  --spectrum-global-color-gray-300: rgb(225, 225, 225);\\n  --spectrum-global-color-gray-400: rgb(202, 202, 202);\\n  --spectrum-global-color-gray-500: rgb(179, 179, 179);\\n  --spectrum-global-color-gray-600: rgb(142, 142, 142);\\n  --spectrum-global-color-gray-700: rgb(110, 110, 110);\\n  --spectrum-global-color-gray-800: rgb(75, 75, 75);\\n  --spectrum-global-color-gray-900: rgb(44, 44, 44);\\n  --spectrum-alias-background-color-primary: var(--spectrum-global-color-gray-50);\\n  --spectrum-alias-background-color-secondary: var(--spectrum-global-color-gray-100);\\n  --spectrum-alias-background-color-tertiary: var(--spectrum-global-color-gray-300);\\n  --spectrum-alias-background-color-modal-overlay: rgba(0,0,0,0.4);\\n  --spectrum-alias-dropshadow-color: rgba(0,0,0,0.15);\\n  --spectrum-alias-background-color-hover-overlay: rgba(44,44,44,0.04);\\n  --spectrum-alias-highlight-hover: rgba(44,44,44,0.06);\\n  --spectrum-alias-highlight-down: rgba(44,44,44,0.1);\\n  --spectrum-alias-highlight-selected: rgba(20,115,230,0.1);\\n  --spectrum-alias-highlight-selected-hover: rgba(20,115,230,0.2);\\n  --spectrum-alias-text-highlight-color: rgba(20,115,230,0.2);\\n  --spectrum-alias-background-color-quickactions: rgba(245,245,245,0.9);\\n  --spectrum-alias-border-color-selected: var(--spectrum-global-color-blue-500);\\n  --spectrum-alias-border-color-translucent: rgba(44,44,44,0.1);\\n  --spectrum-alias-radial-reaction-color-default: rgba(75,75,75,0.6);\\n  --spectrum-alias-pasteboard-background-color: var(--spectrum-global-color-gray-300);\\n  --spectrum-alias-appframe-border-color: var(--spectrum-global-color-gray-300);\\n  --spectrum-alias-appframe-separator-color: var(--spectrum-global-color-gray-300);\\n  --spectrum-slider-s-tick-editable-radial-reaction-color: rgba(75,75,75,0.6);\\n  --spectrum-slider-s-ramp-tick-editable-radial-reaction-color: rgba(75,75,75,0.6);\\n  --spectrum-slider-s-range-tick-editable-radial-reaction-color: rgba(75,75,75,0.6);\\n  --spectrum-slider-s-tick-radial-reaction-color: rgba(75,75,75,0.6);\\n  --spectrum-slider-s-ramp-tick-radial-reaction-color: rgba(75,75,75,0.6);\\n  --spectrum-slider-s-range-tick-radial-reaction-color: rgba(75,75,75,0.6);\\n  --spectrum-slider-s-editable-radial-reaction-color: rgba(75,75,75,0.6);\\n  --spectrum-slider-s-ramp-editable-radial-reaction-color: rgba(75,75,75,0.6);\\n  --spectrum-slider-s-range-editable-radial-reaction-color: rgba(75,75,75,0.6);\\n  --spectrum-slider-s-radial-reaction-color: rgba(75,75,75,0.6);\\n  --spectrum-slider-s-ramp-radial-reaction-color: rgba(75,75,75,0.6);\\n  --spectrum-slider-s-range-radial-reaction-color: rgba(75,75,75,0.6);\\n  --spectrum-slider-m-tick-editable-radial-reaction-color: rgba(75,75,75,0.6);\\n  --spectrum-slider-m-ramp-tick-editable-radial-reaction-color: rgba(75,75,75,0.6);\\n  --spectrum-slider-m-range-tick-editable-radial-reaction-color: rgba(75,75,75,0.6);\\n  --spectrum-slider-m-tick-radial-reaction-color: rgba(75,75,75,0.6);\\n  --spectrum-slider-m-ramp-tick-radial-reaction-color: rgba(75,75,75,0.6);\\n  --spectrum-slider-m-range-tick-radial-reaction-color: rgba(75,75,75,0.6);\\n  --spectrum-slider-m-editable-radial-reaction-color: rgba(75,75,75,0.6);\\n  --spectrum-slider-m-ramp-editable-radial-reaction-color: rgba(75,75,75,0.6);\\n  --spectrum-slider-m-range-editable-radial-reaction-color: rgba(75,75,75,0.6);\\n  --spectrum-slider-m-radial-reaction-color: rgba(75,75,75,0.6);\\n  --spectrum-slider-m-ramp-radial-reaction-color: rgba(75,75,75,0.6);\\n  --spectrum-slider-m-range-radial-reaction-color: rgba(75,75,75,0.6);\\n  --spectrum-slider-l-tick-editable-radial-reaction-color: rgba(75,75,75,0.6);\\n  --spectrum-slider-l-ramp-tick-editable-radial-reaction-color: rgba(75,75,75,0.6);\\n  --spectrum-slider-l-range-tick-editable-radial-reaction-color: rgba(75,75,75,0.6);\\n  --spectrum-slider-l-tick-radial-reaction-color: rgba(75,75,75,0.6);\\n  --spectrum-slider-l-ramp-tick-radial-reaction-color: rgba(75,75,75,0.6);\\n  --spectrum-slider-l-range-tick-radial-reaction-color: rgba(75,75,75,0.6);\\n  --spectrum-slider-l-editable-radial-reaction-color: rgba(75,75,75,0.6);\\n  --spectrum-slider-l-ramp-editable-radial-reaction-color: rgba(75,75,75,0.6);\\n  --spectrum-slider-l-range-editable-radial-reaction-color: rgba(75,75,75,0.6);\\n  --spectrum-slider-l-radial-reaction-color: rgba(75,75,75,0.6);\\n  --spectrum-slider-l-ramp-radial-reaction-color: rgba(75,75,75,0.6);\\n  --spectrum-slider-l-range-radial-reaction-color: rgba(75,75,75,0.6);\\n  --spectrum-slider-xl-tick-editable-radial-reaction-color: rgba(75,75,75,0.6);\\n  --spectrum-slider-xl-ramp-tick-editable-radial-reaction-color: rgba(75,75,75,0.6);\\n  --spectrum-slider-xl-range-tick-editable-radial-reaction-color: rgba(75,75,75,0.6);\\n  --spectrum-slider-xl-tick-radial-reaction-color: rgba(75,75,75,0.6);\\n  --spectrum-slider-xl-ramp-tick-radial-reaction-color: rgba(75,75,75,0.6);\\n  --spectrum-slider-xl-range-tick-radial-reaction-color: rgba(75,75,75,0.6);\\n  --spectrum-slider-xl-editable-radial-reaction-color: rgba(75,75,75,0.6);\\n  --spectrum-slider-xl-ramp-editable-radial-reaction-color: rgba(75,75,75,0.6);\\n  --spectrum-slider-xl-range-editable-radial-reaction-color: rgba(75,75,75,0.6);\\n  --spectrum-slider-xl-radial-reaction-color: rgba(75,75,75,0.6);\\n  --spectrum-slider-xl-ramp-radial-reaction-color: rgba(75,75,75,0.6);\\n  --spectrum-slider-xl-range-radial-reaction-color: rgba(75,75,75,0.6);\\n  --spectrum-well-background-color: rgba(75,75,75,0.02);\\n  --spectrum-well-border-color: rgba(44,44,44,0.05);\\n  --spectrum-scrollbar-mac-s-track-background-color: var(--spectrum-global-color-gray-75);\\n  --spectrum-scrollbar-mac-m-track-background-color: var(--spectrum-global-color-gray-75);\\n  --spectrum-scrollbar-mac-l-track-background-color: var(--spectrum-global-color-gray-75);\\n}\\n", ""]);\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTA0LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BzcGVjdHJ1bS1jc3MvdmFycy9kaXN0L3NwZWN0cnVtLWxpZ2h0LmNzcz9hZjMzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCIuLi8uLi8uLi9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIikoZmFsc2UpO1xuLy8gTW9kdWxlXG5leHBvcnRzLnB1c2goW21vZHVsZS5pZCwgXCIuc3BlY3RydW0tLWxpZ2h0IHtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLXN0YXR1czogVmVyaWZpZWQ7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci12ZXJzaW9uOiA1LjEuMDtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLW9wYWNpdHktMTAwOiAxO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3Itb3BhY2l0eS05MDogMC45O1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3Itb3BhY2l0eS04MDogMC44O1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3Itb3BhY2l0eS03MDogMC43O1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3Itb3BhY2l0eS02MDogMC42O1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3Itb3BhY2l0eS01NTogMC41NTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLW9wYWNpdHktNTA6IDAuNTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLW9wYWNpdHktNDI6IDAuNDI7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1vcGFjaXR5LTQwOiAwLjQ7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1vcGFjaXR5LTMwOiAwLjM7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1vcGFjaXR5LTI1OiAwLjI1O1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3Itb3BhY2l0eS0yMDogMC4yO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3Itb3BhY2l0eS0xNTogMC4xNTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLW9wYWNpdHktMTA6IDAuMTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLW9wYWNpdHktODogMC4wODtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLW9wYWNpdHktNzogMC4wNztcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLW9wYWNpdHktNjogMC4wNjtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLW9wYWNpdHktNTogMC4wNTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLW9wYWNpdHktNDogMC4wNDtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLW9wYWNpdHktMDogMC4wMDtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLWNlbGVyeS00MDA6IHJnYig2OCwgMTgxLCA4Nik7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1jZWxlcnktNTAwOiByZ2IoNjEsIDE2NywgNzgpO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItY2VsZXJ5LTYwMDogcmdiKDU1LCAxNTMsIDcxKTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLWNlbGVyeS03MDA6IHJnYig0OSwgMTM5LCA2NCk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1jaGFydHJldXNlLTQwMDogcmdiKDEzMywgMjA4LCA2OCk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1jaGFydHJldXNlLTUwMDogcmdiKDEyNCwgMTk1LCA2Myk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1jaGFydHJldXNlLTYwMDogcmdiKDExNSwgMTgxLCA1OCk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1jaGFydHJldXNlLTcwMDogcmdiKDEwNiwgMTY4LCA1Mik7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci15ZWxsb3ctNDAwOiByZ2IoMjIzLCAxOTEsIDApO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3IteWVsbG93LTUwMDogcmdiKDIxMCwgMTc4LCAwKTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLXllbGxvdy02MDA6IHJnYigxOTYsIDE2NiwgMCk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci15ZWxsb3ctNzAwOiByZ2IoMTgzLCAxNTMsIDApO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItbWFnZW50YS00MDA6IHJnYigyMTYsIDU1LCAxNDQpO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItbWFnZW50YS01MDA6IHJnYigyMDYsIDM5LCAxMzEpO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItbWFnZW50YS02MDA6IHJnYigxODgsIDI4LCAxMTYpO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItbWFnZW50YS03MDA6IHJnYigxNzQsIDE0LCAxMDIpO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItZnVjaHNpYS00MDA6IHJnYigxOTIsIDU2LCAyMDQpO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItZnVjaHNpYS01MDA6IHJnYigxNzcsIDQ4LCAxODkpO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItZnVjaHNpYS02MDA6IHJnYigxNjIsIDQwLCAxNzMpO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItZnVjaHNpYS03MDA6IHJnYigxNDcsIDMzLCAxNTgpO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItcHVycGxlLTQwMDogcmdiKDE0NiwgODYsIDIxNyk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1wdXJwbGUtNTAwOiByZ2IoMTM0LCA3NiwgMjA0KTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLXB1cnBsZS02MDA6IHJnYigxMjIsIDY2LCAxOTEpO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItcHVycGxlLTcwMDogcmdiKDExMSwgNTYsIDE3Nyk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1pbmRpZ28tNDAwOiByZ2IoMTAzLCAxMDMsIDIzNik7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1pbmRpZ28tNTAwOiByZ2IoOTIsIDkyLCAyMjQpO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItaW5kaWdvLTYwMDogcmdiKDgxLCA4MSwgMjExKTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLWluZGlnby03MDA6IHJnYig3MCwgNzAsIDE5OCk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1zZWFmb2FtLTQwMDogcmdiKDI3LCAxNDksIDE1NCk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1zZWFmb2FtLTUwMDogcmdiKDIyLCAxMzUsIDE0MCk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1zZWFmb2FtLTYwMDogcmdiKDE1LCAxMjEsIDEyNSk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1zZWFmb2FtLTcwMDogcmdiKDksIDEwOCwgMTExKTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLXJlZC00MDA6IHJnYigyMjcsIDcyLCA4MCk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1yZWQtNTAwOiByZ2IoMjE1LCA1NSwgNjMpO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItcmVkLTYwMDogcmdiKDIwMSwgMzcsIDQ1KTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLXJlZC03MDA6IHJnYigxODcsIDE4LCAyNik7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1vcmFuZ2UtNDAwOiByZ2IoMjMwLCAxMzQsIDI1KTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLW9yYW5nZS01MDA6IHJnYigyMTgsIDEyMywgMTcpO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3Itb3JhbmdlLTYwMDogcmdiKDIwMywgMTExLCAxNik7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1vcmFuZ2UtNzAwOiByZ2IoMTg5LCAxMDAsIDEzKTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLWdyZWVuLTQwMDogcmdiKDQ1LCAxNTcsIDEyMCk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1ncmVlbi01MDA6IHJnYigzOCwgMTQyLCAxMDgpO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItZ3JlZW4tNjAwOiByZ2IoMTgsIDEyOCwgOTIpO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItZ3JlZW4tNzAwOiByZ2IoMTYsIDExMywgODQpO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItYmx1ZS00MDA6IHJnYigzOCwgMTI4LCAyMzUpO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItYmx1ZS01MDA6IHJnYigyMCwgMTE1LCAyMzApO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItYmx1ZS02MDA6IHJnYigxMywgMTAyLCAyMDgpO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItYmx1ZS03MDA6IHJnYig5LCA5MCwgMTg2KTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLWdyYXktNTA6IHJnYigyNTUsIDI1NSwgMjU1KTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLWdyYXktNzU6IHJnYigyNTAsIDI1MCwgMjUwKTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLWdyYXktMTAwOiByZ2IoMjQ1LCAyNDUsIDI0NSk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1ncmF5LTIwMDogcmdiKDIzNCwgMjM0LCAyMzQpO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItZ3JheS0zMDA6IHJnYigyMjUsIDIyNSwgMjI1KTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLWdyYXktNDAwOiByZ2IoMjAyLCAyMDIsIDIwMik7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1ncmF5LTUwMDogcmdiKDE3OSwgMTc5LCAxNzkpO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItZ3JheS02MDA6IHJnYigxNDIsIDE0MiwgMTQyKTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLWdyYXktNzAwOiByZ2IoMTEwLCAxMTAsIDExMCk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1ncmF5LTgwMDogcmdiKDc1LCA3NSwgNzUpO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItZ3JheS05MDA6IHJnYig0NCwgNDQsIDQ0KTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtYmFja2dyb3VuZC1jb2xvci1wcmltYXJ5OiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItZ3JheS01MCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWJhY2tncm91bmQtY29sb3Itc2Vjb25kYXJ5OiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItZ3JheS0xMDApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1iYWNrZ3JvdW5kLWNvbG9yLXRlcnRpYXJ5OiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItZ3JheS0zMDApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1iYWNrZ3JvdW5kLWNvbG9yLW1vZGFsLW92ZXJsYXk6IHJnYmEoMCwwLDAsMC40KTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtZHJvcHNoYWRvdy1jb2xvcjogcmdiYSgwLDAsMCwwLjE1KTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtYmFja2dyb3VuZC1jb2xvci1ob3Zlci1vdmVybGF5OiByZ2JhKDQ0LDQ0LDQ0LDAuMDQpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1oaWdobGlnaHQtaG92ZXI6IHJnYmEoNDQsNDQsNDQsMC4wNik7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWhpZ2hsaWdodC1kb3duOiByZ2JhKDQ0LDQ0LDQ0LDAuMSk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWhpZ2hsaWdodC1zZWxlY3RlZDogcmdiYSgyMCwxMTUsMjMwLDAuMSk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWhpZ2hsaWdodC1zZWxlY3RlZC1ob3ZlcjogcmdiYSgyMCwxMTUsMjMwLDAuMik7XFxuICAtLXNwZWN0cnVtLWFsaWFzLXRleHQtaGlnaGxpZ2h0LWNvbG9yOiByZ2JhKDIwLDExNSwyMzAsMC4yKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtYmFja2dyb3VuZC1jb2xvci1xdWlja2FjdGlvbnM6IHJnYmEoMjQ1LDI0NSwyNDUsMC45KTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtYm9yZGVyLWNvbG9yLXNlbGVjdGVkOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItYmx1ZS01MDApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1ib3JkZXItY29sb3ItdHJhbnNsdWNlbnQ6IHJnYmEoNDQsNDQsNDQsMC4xKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtcmFkaWFsLXJlYWN0aW9uLWNvbG9yLWRlZmF1bHQ6IHJnYmEoNzUsNzUsNzUsMC42KTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtcGFzdGVib2FyZC1iYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItZ3JheS0zMDApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1hcHBmcmFtZS1ib3JkZXItY29sb3I6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1ncmF5LTMwMCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWFwcGZyYW1lLXNlcGFyYXRvci1jb2xvcjogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLWdyYXktMzAwKTtcXG4gIC0tc3BlY3RydW0tc2xpZGVyLXMtdGljay1lZGl0YWJsZS1yYWRpYWwtcmVhY3Rpb24tY29sb3I6IHJnYmEoNzUsNzUsNzUsMC42KTtcXG4gIC0tc3BlY3RydW0tc2xpZGVyLXMtcmFtcC10aWNrLWVkaXRhYmxlLXJhZGlhbC1yZWFjdGlvbi1jb2xvcjogcmdiYSg3NSw3NSw3NSwwLjYpO1xcbiAgLS1zcGVjdHJ1bS1zbGlkZXItcy1yYW5nZS10aWNrLWVkaXRhYmxlLXJhZGlhbC1yZWFjdGlvbi1jb2xvcjogcmdiYSg3NSw3NSw3NSwwLjYpO1xcbiAgLS1zcGVjdHJ1bS1zbGlkZXItcy10aWNrLXJhZGlhbC1yZWFjdGlvbi1jb2xvcjogcmdiYSg3NSw3NSw3NSwwLjYpO1xcbiAgLS1zcGVjdHJ1bS1zbGlkZXItcy1yYW1wLXRpY2stcmFkaWFsLXJlYWN0aW9uLWNvbG9yOiByZ2JhKDc1LDc1LDc1LDAuNik7XFxuICAtLXNwZWN0cnVtLXNsaWRlci1zLXJhbmdlLXRpY2stcmFkaWFsLXJlYWN0aW9uLWNvbG9yOiByZ2JhKDc1LDc1LDc1LDAuNik7XFxuICAtLXNwZWN0cnVtLXNsaWRlci1zLWVkaXRhYmxlLXJhZGlhbC1yZWFjdGlvbi1jb2xvcjogcmdiYSg3NSw3NSw3NSwwLjYpO1xcbiAgLS1zcGVjdHJ1bS1zbGlkZXItcy1yYW1wLWVkaXRhYmxlLXJhZGlhbC1yZWFjdGlvbi1jb2xvcjogcmdiYSg3NSw3NSw3NSwwLjYpO1xcbiAgLS1zcGVjdHJ1bS1zbGlkZXItcy1yYW5nZS1lZGl0YWJsZS1yYWRpYWwtcmVhY3Rpb24tY29sb3I6IHJnYmEoNzUsNzUsNzUsMC42KTtcXG4gIC0tc3BlY3RydW0tc2xpZGVyLXMtcmFkaWFsLXJlYWN0aW9uLWNvbG9yOiByZ2JhKDc1LDc1LDc1LDAuNik7XFxuICAtLXNwZWN0cnVtLXNsaWRlci1zLXJhbXAtcmFkaWFsLXJlYWN0aW9uLWNvbG9yOiByZ2JhKDc1LDc1LDc1LDAuNik7XFxuICAtLXNwZWN0cnVtLXNsaWRlci1zLXJhbmdlLXJhZGlhbC1yZWFjdGlvbi1jb2xvcjogcmdiYSg3NSw3NSw3NSwwLjYpO1xcbiAgLS1zcGVjdHJ1bS1zbGlkZXItbS10aWNrLWVkaXRhYmxlLXJhZGlhbC1yZWFjdGlvbi1jb2xvcjogcmdiYSg3NSw3NSw3NSwwLjYpO1xcbiAgLS1zcGVjdHJ1bS1zbGlkZXItbS1yYW1wLXRpY2stZWRpdGFibGUtcmFkaWFsLXJlYWN0aW9uLWNvbG9yOiByZ2JhKDc1LDc1LDc1LDAuNik7XFxuICAtLXNwZWN0cnVtLXNsaWRlci1tLXJhbmdlLXRpY2stZWRpdGFibGUtcmFkaWFsLXJlYWN0aW9uLWNvbG9yOiByZ2JhKDc1LDc1LDc1LDAuNik7XFxuICAtLXNwZWN0cnVtLXNsaWRlci1tLXRpY2stcmFkaWFsLXJlYWN0aW9uLWNvbG9yOiByZ2JhKDc1LDc1LDc1LDAuNik7XFxuICAtLXNwZWN0cnVtLXNsaWRlci1tLXJhbXAtdGljay1yYWRpYWwtcmVhY3Rpb24tY29sb3I6IHJnYmEoNzUsNzUsNzUsMC42KTtcXG4gIC0tc3BlY3RydW0tc2xpZGVyLW0tcmFuZ2UtdGljay1yYWRpYWwtcmVhY3Rpb24tY29sb3I6IHJnYmEoNzUsNzUsNzUsMC42KTtcXG4gIC0tc3BlY3RydW0tc2xpZGVyLW0tZWRpdGFibGUtcmFkaWFsLXJlYWN0aW9uLWNvbG9yOiByZ2JhKDc1LDc1LDc1LDAuNik7XFxuICAtLXNwZWN0cnVtLXNsaWRlci1tLXJhbXAtZWRpdGFibGUtcmFkaWFsLXJlYWN0aW9uLWNvbG9yOiByZ2JhKDc1LDc1LDc1LDAuNik7XFxuICAtLXNwZWN0cnVtLXNsaWRlci1tLXJhbmdlLWVkaXRhYmxlLXJhZGlhbC1yZWFjdGlvbi1jb2xvcjogcmdiYSg3NSw3NSw3NSwwLjYpO1xcbiAgLS1zcGVjdHJ1bS1zbGlkZXItbS1yYWRpYWwtcmVhY3Rpb24tY29sb3I6IHJnYmEoNzUsNzUsNzUsMC42KTtcXG4gIC0tc3BlY3RydW0tc2xpZGVyLW0tcmFtcC1yYWRpYWwtcmVhY3Rpb24tY29sb3I6IHJnYmEoNzUsNzUsNzUsMC42KTtcXG4gIC0tc3BlY3RydW0tc2xpZGVyLW0tcmFuZ2UtcmFkaWFsLXJlYWN0aW9uLWNvbG9yOiByZ2JhKDc1LDc1LDc1LDAuNik7XFxuICAtLXNwZWN0cnVtLXNsaWRlci1sLXRpY2stZWRpdGFibGUtcmFkaWFsLXJlYWN0aW9uLWNvbG9yOiByZ2JhKDc1LDc1LDc1LDAuNik7XFxuICAtLXNwZWN0cnVtLXNsaWRlci1sLXJhbXAtdGljay1lZGl0YWJsZS1yYWRpYWwtcmVhY3Rpb24tY29sb3I6IHJnYmEoNzUsNzUsNzUsMC42KTtcXG4gIC0tc3BlY3RydW0tc2xpZGVyLWwtcmFuZ2UtdGljay1lZGl0YWJsZS1yYWRpYWwtcmVhY3Rpb24tY29sb3I6IHJnYmEoNzUsNzUsNzUsMC42KTtcXG4gIC0tc3BlY3RydW0tc2xpZGVyLWwtdGljay1yYWRpYWwtcmVhY3Rpb24tY29sb3I6IHJnYmEoNzUsNzUsNzUsMC42KTtcXG4gIC0tc3BlY3RydW0tc2xpZGVyLWwtcmFtcC10aWNrLXJhZGlhbC1yZWFjdGlvbi1jb2xvcjogcmdiYSg3NSw3NSw3NSwwLjYpO1xcbiAgLS1zcGVjdHJ1bS1zbGlkZXItbC1yYW5nZS10aWNrLXJhZGlhbC1yZWFjdGlvbi1jb2xvcjogcmdiYSg3NSw3NSw3NSwwLjYpO1xcbiAgLS1zcGVjdHJ1bS1zbGlkZXItbC1lZGl0YWJsZS1yYWRpYWwtcmVhY3Rpb24tY29sb3I6IHJnYmEoNzUsNzUsNzUsMC42KTtcXG4gIC0tc3BlY3RydW0tc2xpZGVyLWwtcmFtcC1lZGl0YWJsZS1yYWRpYWwtcmVhY3Rpb24tY29sb3I6IHJnYmEoNzUsNzUsNzUsMC42KTtcXG4gIC0tc3BlY3RydW0tc2xpZGVyLWwtcmFuZ2UtZWRpdGFibGUtcmFkaWFsLXJlYWN0aW9uLWNvbG9yOiByZ2JhKDc1LDc1LDc1LDAuNik7XFxuICAtLXNwZWN0cnVtLXNsaWRlci1sLXJhZGlhbC1yZWFjdGlvbi1jb2xvcjogcmdiYSg3NSw3NSw3NSwwLjYpO1xcbiAgLS1zcGVjdHJ1bS1zbGlkZXItbC1yYW1wLXJhZGlhbC1yZWFjdGlvbi1jb2xvcjogcmdiYSg3NSw3NSw3NSwwLjYpO1xcbiAgLS1zcGVjdHJ1bS1zbGlkZXItbC1yYW5nZS1yYWRpYWwtcmVhY3Rpb24tY29sb3I6IHJnYmEoNzUsNzUsNzUsMC42KTtcXG4gIC0tc3BlY3RydW0tc2xpZGVyLXhsLXRpY2stZWRpdGFibGUtcmFkaWFsLXJlYWN0aW9uLWNvbG9yOiByZ2JhKDc1LDc1LDc1LDAuNik7XFxuICAtLXNwZWN0cnVtLXNsaWRlci14bC1yYW1wLXRpY2stZWRpdGFibGUtcmFkaWFsLXJlYWN0aW9uLWNvbG9yOiByZ2JhKDc1LDc1LDc1LDAuNik7XFxuICAtLXNwZWN0cnVtLXNsaWRlci14bC1yYW5nZS10aWNrLWVkaXRhYmxlLXJhZGlhbC1yZWFjdGlvbi1jb2xvcjogcmdiYSg3NSw3NSw3NSwwLjYpO1xcbiAgLS1zcGVjdHJ1bS1zbGlkZXIteGwtdGljay1yYWRpYWwtcmVhY3Rpb24tY29sb3I6IHJnYmEoNzUsNzUsNzUsMC42KTtcXG4gIC0tc3BlY3RydW0tc2xpZGVyLXhsLXJhbXAtdGljay1yYWRpYWwtcmVhY3Rpb24tY29sb3I6IHJnYmEoNzUsNzUsNzUsMC42KTtcXG4gIC0tc3BlY3RydW0tc2xpZGVyLXhsLXJhbmdlLXRpY2stcmFkaWFsLXJlYWN0aW9uLWNvbG9yOiByZ2JhKDc1LDc1LDc1LDAuNik7XFxuICAtLXNwZWN0cnVtLXNsaWRlci14bC1lZGl0YWJsZS1yYWRpYWwtcmVhY3Rpb24tY29sb3I6IHJnYmEoNzUsNzUsNzUsMC42KTtcXG4gIC0tc3BlY3RydW0tc2xpZGVyLXhsLXJhbXAtZWRpdGFibGUtcmFkaWFsLXJlYWN0aW9uLWNvbG9yOiByZ2JhKDc1LDc1LDc1LDAuNik7XFxuICAtLXNwZWN0cnVtLXNsaWRlci14bC1yYW5nZS1lZGl0YWJsZS1yYWRpYWwtcmVhY3Rpb24tY29sb3I6IHJnYmEoNzUsNzUsNzUsMC42KTtcXG4gIC0tc3BlY3RydW0tc2xpZGVyLXhsLXJhZGlhbC1yZWFjdGlvbi1jb2xvcjogcmdiYSg3NSw3NSw3NSwwLjYpO1xcbiAgLS1zcGVjdHJ1bS1zbGlkZXIteGwtcmFtcC1yYWRpYWwtcmVhY3Rpb24tY29sb3I6IHJnYmEoNzUsNzUsNzUsMC42KTtcXG4gIC0tc3BlY3RydW0tc2xpZGVyLXhsLXJhbmdlLXJhZGlhbC1yZWFjdGlvbi1jb2xvcjogcmdiYSg3NSw3NSw3NSwwLjYpO1xcbiAgLS1zcGVjdHJ1bS13ZWxsLWJhY2tncm91bmQtY29sb3I6IHJnYmEoNzUsNzUsNzUsMC4wMik7XFxuICAtLXNwZWN0cnVtLXdlbGwtYm9yZGVyLWNvbG9yOiByZ2JhKDQ0LDQ0LDQ0LDAuMDUpO1xcbiAgLS1zcGVjdHJ1bS1zY3JvbGxiYXItbWFjLXMtdHJhY2stYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLWdyYXktNzUpO1xcbiAgLS1zcGVjdHJ1bS1zY3JvbGxiYXItbWFjLW0tdHJhY2stYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLWdyYXktNzUpO1xcbiAgLS1zcGVjdHJ1bS1zY3JvbGxiYXItbWFjLWwtdHJhY2stYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLWdyYXktNzUpO1xcbn1cXG5cIiwgXCJcIl0pO1xuXG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///104\n')},function(module,exports,__webpack_require__){eval("var api = __webpack_require__(5);\n            var content = __webpack_require__(106);\n\n            content = content.__esModule ? content.default : content;\n\n            if (typeof content === 'string') {\n              content = [[module.i, content, '']];\n            }\n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = api(content, options);\n\n\n\nmodule.exports = content.locals || {};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTA1LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BzcGVjdHJ1bS1jc3MvdmFycy9kaXN0L3NwZWN0cnVtLWxpZ2h0ZXN0LmNzcz9hYzYzIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBhcGkgPSByZXF1aXJlKFwiIS4uLy4uLy4uL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzXCIpO1xuICAgICAgICAgICAgdmFyIGNvbnRlbnQgPSByZXF1aXJlKFwiISEuLi8uLi8uLi9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vc3BlY3RydW0tbGlnaHRlc3QuY3NzXCIpO1xuXG4gICAgICAgICAgICBjb250ZW50ID0gY29udGVudC5fX2VzTW9kdWxlID8gY29udGVudC5kZWZhdWx0IDogY29udGVudDtcblxuICAgICAgICAgICAgaWYgKHR5cGVvZiBjb250ZW50ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICBjb250ZW50ID0gW1ttb2R1bGUuaWQsIGNvbnRlbnQsICcnXV07XG4gICAgICAgICAgICB9XG5cbnZhciBvcHRpb25zID0ge307XG5cbm9wdGlvbnMuaW5zZXJ0ID0gXCJoZWFkXCI7XG5vcHRpb25zLnNpbmdsZXRvbiA9IGZhbHNlO1xuXG52YXIgdXBkYXRlID0gYXBpKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5cblxubW9kdWxlLmV4cG9ydHMgPSBjb250ZW50LmxvY2FscyB8fCB7fTsiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///105\n")},function(module,exports,__webpack_require__){eval('exports = module.exports = __webpack_require__(6)(false);\n// Module\nexports.push([module.i, ".spectrum--lightest {\\n  --spectrum-global-color-status: Verified;\\n  --spectrum-global-color-version: 5.1.0;\\n  --spectrum-global-color-opacity-100: 1;\\n  --spectrum-global-color-opacity-90: 0.9;\\n  --spectrum-global-color-opacity-80: 0.8;\\n  --spectrum-global-color-opacity-70: 0.7;\\n  --spectrum-global-color-opacity-60: 0.6;\\n  --spectrum-global-color-opacity-55: 0.55;\\n  --spectrum-global-color-opacity-50: 0.5;\\n  --spectrum-global-color-opacity-42: 0.42;\\n  --spectrum-global-color-opacity-40: 0.4;\\n  --spectrum-global-color-opacity-30: 0.3;\\n  --spectrum-global-color-opacity-25: 0.25;\\n  --spectrum-global-color-opacity-20: 0.2;\\n  --spectrum-global-color-opacity-15: 0.15;\\n  --spectrum-global-color-opacity-10: 0.1;\\n  --spectrum-global-color-opacity-8: 0.08;\\n  --spectrum-global-color-opacity-7: 0.07;\\n  --spectrum-global-color-opacity-6: 0.06;\\n  --spectrum-global-color-opacity-5: 0.05;\\n  --spectrum-global-color-opacity-4: 0.04;\\n  --spectrum-global-color-opacity-0: 0.00;\\n  --spectrum-global-color-celery-400: rgb(75, 195, 95);\\n  --spectrum-global-color-celery-500: rgb(68, 181, 86);\\n  --spectrum-global-color-celery-600: rgb(61, 167, 78);\\n  --spectrum-global-color-celery-700: rgb(55, 153, 71);\\n  --spectrum-global-color-chartreuse-400: rgb(142, 222, 73);\\n  --spectrum-global-color-chartreuse-500: rgb(133, 208, 68);\\n  --spectrum-global-color-chartreuse-600: rgb(124, 195, 63);\\n  --spectrum-global-color-chartreuse-700: rgb(115, 181, 58);\\n  --spectrum-global-color-yellow-400: rgb(237, 204, 0);\\n  --spectrum-global-color-yellow-500: rgb(223, 191, 0);\\n  --spectrum-global-color-yellow-600: rgb(210, 178, 0);\\n  --spectrum-global-color-yellow-700: rgb(196, 166, 0);\\n  --spectrum-global-color-magenta-400: rgb(226, 73, 157);\\n  --spectrum-global-color-magenta-500: rgb(216, 55, 144);\\n  --spectrum-global-color-magenta-600: rgb(202, 41, 130);\\n  --spectrum-global-color-magenta-700: rgb(188, 28, 116);\\n  --spectrum-global-color-fuchsia-400: rgb(207, 62, 220);\\n  --spectrum-global-color-fuchsia-500: rgb(192, 56, 204);\\n  --spectrum-global-color-fuchsia-600: rgb(177, 48, 189);\\n  --spectrum-global-color-fuchsia-700: rgb(162, 40, 173);\\n  --spectrum-global-color-purple-400: rgb(157, 100, 225);\\n  --spectrum-global-color-purple-500: rgb(146, 86, 217);\\n  --spectrum-global-color-purple-600: rgb(134, 76, 204);\\n  --spectrum-global-color-purple-700: rgb(122, 66, 191);\\n  --spectrum-global-color-indigo-400: rgb(117, 117, 241);\\n  --spectrum-global-color-indigo-500: rgb(103, 103, 236);\\n  --spectrum-global-color-indigo-600: rgb(92, 92, 224);\\n  --spectrum-global-color-indigo-700: rgb(81, 81, 211);\\n  --spectrum-global-color-seafoam-400: rgb(32, 163, 168);\\n  --spectrum-global-color-seafoam-500: rgb(27, 149, 154);\\n  --spectrum-global-color-seafoam-600: rgb(22, 135, 140);\\n  --spectrum-global-color-seafoam-700: rgb(15, 121, 125);\\n  --spectrum-global-color-red-400: rgb(236, 91, 98);\\n  --spectrum-global-color-red-500: rgb(227, 72, 80);\\n  --spectrum-global-color-red-600: rgb(215, 55, 63);\\n  --spectrum-global-color-red-700: rgb(201, 37, 45);\\n  --spectrum-global-color-orange-400: rgb(242, 148, 35);\\n  --spectrum-global-color-orange-500: rgb(230, 134, 25);\\n  --spectrum-global-color-orange-600: rgb(218, 123, 17);\\n  --spectrum-global-color-orange-700: rgb(203, 111, 16);\\n  --spectrum-global-color-green-400: rgb(51, 171, 132);\\n  --spectrum-global-color-green-500: rgb(45, 157, 120);\\n  --spectrum-global-color-green-600: rgb(38, 142, 108);\\n  --spectrum-global-color-green-700: rgb(18, 128, 92);\\n  --spectrum-global-color-blue-400: rgb(55, 142, 240);\\n  --spectrum-global-color-blue-500: rgb(38, 128, 235);\\n  --spectrum-global-color-blue-600: rgb(20, 115, 230);\\n  --spectrum-global-color-blue-700: rgb(13, 102, 208);\\n  --spectrum-global-color-gray-50: rgb(255, 255, 255);\\n  --spectrum-global-color-gray-75: rgb(255, 255, 255);\\n  --spectrum-global-color-gray-100: rgb(255, 255, 255);\\n  --spectrum-global-color-gray-200: rgb(244, 244, 244);\\n  --spectrum-global-color-gray-300: rgb(234, 234, 234);\\n  --spectrum-global-color-gray-400: rgb(211, 211, 211);\\n  --spectrum-global-color-gray-500: rgb(188, 188, 188);\\n  --spectrum-global-color-gray-600: rgb(149, 149, 149);\\n  --spectrum-global-color-gray-700: rgb(116, 116, 116);\\n  --spectrum-global-color-gray-800: rgb(80, 80, 80);\\n  --spectrum-global-color-gray-900: rgb(50, 50, 50);\\n  --spectrum-alias-background-color-primary: var(--spectrum-global-color-gray-50);\\n  --spectrum-alias-background-color-secondary: var(--spectrum-global-color-gray-100);\\n  --spectrum-alias-background-color-tertiary: var(--spectrum-global-color-gray-300);\\n  --spectrum-alias-background-color-modal-overlay: rgba(0,0,0,0.4);\\n  --spectrum-alias-dropshadow-color: rgba(0,0,0,0.15);\\n  --spectrum-alias-background-color-hover-overlay: rgba(50,50,50,0.04);\\n  --spectrum-alias-highlight-hover: rgba(50,50,50,0.06);\\n  --spectrum-alias-highlight-down: rgba(50,50,50,0.1);\\n  --spectrum-alias-highlight-selected: rgba(38,128,235,0.1);\\n  --spectrum-alias-highlight-selected-hover: rgba(38,128,235,0.2);\\n  --spectrum-alias-text-highlight-color: rgba(38,128,235,0.2);\\n  --spectrum-alias-background-color-quickactions: rgba(255,255,255,0.9);\\n  --spectrum-alias-border-color-selected: var(--spectrum-global-color-blue-500);\\n  --spectrum-alias-border-color-translucent: rgba(50,50,50,0.1);\\n  --spectrum-alias-radial-reaction-color-default: rgba(80,80,80,0.6);\\n  --spectrum-alias-pasteboard-background-color: var(--spectrum-global-color-gray-300);\\n  --spectrum-alias-appframe-border-color: var(--spectrum-global-color-gray-300);\\n  --spectrum-alias-appframe-separator-color: var(--spectrum-global-color-gray-300);\\n  --spectrum-slider-s-tick-editable-radial-reaction-color: rgba(80,80,80,0.6);\\n  --spectrum-slider-s-ramp-tick-editable-radial-reaction-color: rgba(80,80,80,0.6);\\n  --spectrum-slider-s-range-tick-editable-radial-reaction-color: rgba(80,80,80,0.6);\\n  --spectrum-slider-s-tick-radial-reaction-color: rgba(80,80,80,0.6);\\n  --spectrum-slider-s-ramp-tick-radial-reaction-color: rgba(80,80,80,0.6);\\n  --spectrum-slider-s-range-tick-radial-reaction-color: rgba(80,80,80,0.6);\\n  --spectrum-slider-s-editable-radial-reaction-color: rgba(80,80,80,0.6);\\n  --spectrum-slider-s-ramp-editable-radial-reaction-color: rgba(80,80,80,0.6);\\n  --spectrum-slider-s-range-editable-radial-reaction-color: rgba(80,80,80,0.6);\\n  --spectrum-slider-s-radial-reaction-color: rgba(80,80,80,0.6);\\n  --spectrum-slider-s-ramp-radial-reaction-color: rgba(80,80,80,0.6);\\n  --spectrum-slider-s-range-radial-reaction-color: rgba(80,80,80,0.6);\\n  --spectrum-slider-m-tick-editable-radial-reaction-color: rgba(80,80,80,0.6);\\n  --spectrum-slider-m-ramp-tick-editable-radial-reaction-color: rgba(80,80,80,0.6);\\n  --spectrum-slider-m-range-tick-editable-radial-reaction-color: rgba(80,80,80,0.6);\\n  --spectrum-slider-m-tick-radial-reaction-color: rgba(80,80,80,0.6);\\n  --spectrum-slider-m-ramp-tick-radial-reaction-color: rgba(80,80,80,0.6);\\n  --spectrum-slider-m-range-tick-radial-reaction-color: rgba(80,80,80,0.6);\\n  --spectrum-slider-m-editable-radial-reaction-color: rgba(80,80,80,0.6);\\n  --spectrum-slider-m-ramp-editable-radial-reaction-color: rgba(80,80,80,0.6);\\n  --spectrum-slider-m-range-editable-radial-reaction-color: rgba(80,80,80,0.6);\\n  --spectrum-slider-m-radial-reaction-color: rgba(80,80,80,0.6);\\n  --spectrum-slider-m-ramp-radial-reaction-color: rgba(80,80,80,0.6);\\n  --spectrum-slider-m-range-radial-reaction-color: rgba(80,80,80,0.6);\\n  --spectrum-slider-l-tick-editable-radial-reaction-color: rgba(80,80,80,0.6);\\n  --spectrum-slider-l-ramp-tick-editable-radial-reaction-color: rgba(80,80,80,0.6);\\n  --spectrum-slider-l-range-tick-editable-radial-reaction-color: rgba(80,80,80,0.6);\\n  --spectrum-slider-l-tick-radial-reaction-color: rgba(80,80,80,0.6);\\n  --spectrum-slider-l-ramp-tick-radial-reaction-color: rgba(80,80,80,0.6);\\n  --spectrum-slider-l-range-tick-radial-reaction-color: rgba(80,80,80,0.6);\\n  --spectrum-slider-l-editable-radial-reaction-color: rgba(80,80,80,0.6);\\n  --spectrum-slider-l-ramp-editable-radial-reaction-color: rgba(80,80,80,0.6);\\n  --spectrum-slider-l-range-editable-radial-reaction-color: rgba(80,80,80,0.6);\\n  --spectrum-slider-l-radial-reaction-color: rgba(80,80,80,0.6);\\n  --spectrum-slider-l-ramp-radial-reaction-color: rgba(80,80,80,0.6);\\n  --spectrum-slider-l-range-radial-reaction-color: rgba(80,80,80,0.6);\\n  --spectrum-slider-xl-tick-editable-radial-reaction-color: rgba(80,80,80,0.6);\\n  --spectrum-slider-xl-ramp-tick-editable-radial-reaction-color: rgba(80,80,80,0.6);\\n  --spectrum-slider-xl-range-tick-editable-radial-reaction-color: rgba(80,80,80,0.6);\\n  --spectrum-slider-xl-tick-radial-reaction-color: rgba(80,80,80,0.6);\\n  --spectrum-slider-xl-ramp-tick-radial-reaction-color: rgba(80,80,80,0.6);\\n  --spectrum-slider-xl-range-tick-radial-reaction-color: rgba(80,80,80,0.6);\\n  --spectrum-slider-xl-editable-radial-reaction-color: rgba(80,80,80,0.6);\\n  --spectrum-slider-xl-ramp-editable-radial-reaction-color: rgba(80,80,80,0.6);\\n  --spectrum-slider-xl-range-editable-radial-reaction-color: rgba(80,80,80,0.6);\\n  --spectrum-slider-xl-radial-reaction-color: rgba(80,80,80,0.6);\\n  --spectrum-slider-xl-ramp-radial-reaction-color: rgba(80,80,80,0.6);\\n  --spectrum-slider-xl-range-radial-reaction-color: rgba(80,80,80,0.6);\\n  --spectrum-well-background-color: rgba(80,80,80,0.02);\\n  --spectrum-well-border-color: rgba(50,50,50,0.05);\\n}\\n", ""]);\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTA2LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BzcGVjdHJ1bS1jc3MvdmFycy9kaXN0L3NwZWN0cnVtLWxpZ2h0ZXN0LmNzcz9jMzMzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCIuLi8uLi8uLi9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIikoZmFsc2UpO1xuLy8gTW9kdWxlXG5leHBvcnRzLnB1c2goW21vZHVsZS5pZCwgXCIuc3BlY3RydW0tLWxpZ2h0ZXN0IHtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLXN0YXR1czogVmVyaWZpZWQ7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci12ZXJzaW9uOiA1LjEuMDtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLW9wYWNpdHktMTAwOiAxO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3Itb3BhY2l0eS05MDogMC45O1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3Itb3BhY2l0eS04MDogMC44O1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3Itb3BhY2l0eS03MDogMC43O1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3Itb3BhY2l0eS02MDogMC42O1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3Itb3BhY2l0eS01NTogMC41NTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLW9wYWNpdHktNTA6IDAuNTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLW9wYWNpdHktNDI6IDAuNDI7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1vcGFjaXR5LTQwOiAwLjQ7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1vcGFjaXR5LTMwOiAwLjM7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1vcGFjaXR5LTI1OiAwLjI1O1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3Itb3BhY2l0eS0yMDogMC4yO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3Itb3BhY2l0eS0xNTogMC4xNTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLW9wYWNpdHktMTA6IDAuMTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLW9wYWNpdHktODogMC4wODtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLW9wYWNpdHktNzogMC4wNztcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLW9wYWNpdHktNjogMC4wNjtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLW9wYWNpdHktNTogMC4wNTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLW9wYWNpdHktNDogMC4wNDtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLW9wYWNpdHktMDogMC4wMDtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLWNlbGVyeS00MDA6IHJnYig3NSwgMTk1LCA5NSk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1jZWxlcnktNTAwOiByZ2IoNjgsIDE4MSwgODYpO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItY2VsZXJ5LTYwMDogcmdiKDYxLCAxNjcsIDc4KTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLWNlbGVyeS03MDA6IHJnYig1NSwgMTUzLCA3MSk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1jaGFydHJldXNlLTQwMDogcmdiKDE0MiwgMjIyLCA3Myk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1jaGFydHJldXNlLTUwMDogcmdiKDEzMywgMjA4LCA2OCk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1jaGFydHJldXNlLTYwMDogcmdiKDEyNCwgMTk1LCA2Myk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1jaGFydHJldXNlLTcwMDogcmdiKDExNSwgMTgxLCA1OCk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci15ZWxsb3ctNDAwOiByZ2IoMjM3LCAyMDQsIDApO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3IteWVsbG93LTUwMDogcmdiKDIyMywgMTkxLCAwKTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLXllbGxvdy02MDA6IHJnYigyMTAsIDE3OCwgMCk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci15ZWxsb3ctNzAwOiByZ2IoMTk2LCAxNjYsIDApO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItbWFnZW50YS00MDA6IHJnYigyMjYsIDczLCAxNTcpO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItbWFnZW50YS01MDA6IHJnYigyMTYsIDU1LCAxNDQpO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItbWFnZW50YS02MDA6IHJnYigyMDIsIDQxLCAxMzApO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItbWFnZW50YS03MDA6IHJnYigxODgsIDI4LCAxMTYpO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItZnVjaHNpYS00MDA6IHJnYigyMDcsIDYyLCAyMjApO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItZnVjaHNpYS01MDA6IHJnYigxOTIsIDU2LCAyMDQpO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItZnVjaHNpYS02MDA6IHJnYigxNzcsIDQ4LCAxODkpO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItZnVjaHNpYS03MDA6IHJnYigxNjIsIDQwLCAxNzMpO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItcHVycGxlLTQwMDogcmdiKDE1NywgMTAwLCAyMjUpO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItcHVycGxlLTUwMDogcmdiKDE0NiwgODYsIDIxNyk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1wdXJwbGUtNjAwOiByZ2IoMTM0LCA3NiwgMjA0KTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLXB1cnBsZS03MDA6IHJnYigxMjIsIDY2LCAxOTEpO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItaW5kaWdvLTQwMDogcmdiKDExNywgMTE3LCAyNDEpO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItaW5kaWdvLTUwMDogcmdiKDEwMywgMTAzLCAyMzYpO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItaW5kaWdvLTYwMDogcmdiKDkyLCA5MiwgMjI0KTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLWluZGlnby03MDA6IHJnYig4MSwgODEsIDIxMSk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1zZWFmb2FtLTQwMDogcmdiKDMyLCAxNjMsIDE2OCk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1zZWFmb2FtLTUwMDogcmdiKDI3LCAxNDksIDE1NCk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1zZWFmb2FtLTYwMDogcmdiKDIyLCAxMzUsIDE0MCk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1zZWFmb2FtLTcwMDogcmdiKDE1LCAxMjEsIDEyNSk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1yZWQtNDAwOiByZ2IoMjM2LCA5MSwgOTgpO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItcmVkLTUwMDogcmdiKDIyNywgNzIsIDgwKTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLXJlZC02MDA6IHJnYigyMTUsIDU1LCA2Myk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1yZWQtNzAwOiByZ2IoMjAxLCAzNywgNDUpO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3Itb3JhbmdlLTQwMDogcmdiKDI0MiwgMTQ4LCAzNSk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1vcmFuZ2UtNTAwOiByZ2IoMjMwLCAxMzQsIDI1KTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLW9yYW5nZS02MDA6IHJnYigyMTgsIDEyMywgMTcpO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3Itb3JhbmdlLTcwMDogcmdiKDIwMywgMTExLCAxNik7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1ncmVlbi00MDA6IHJnYig1MSwgMTcxLCAxMzIpO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItZ3JlZW4tNTAwOiByZ2IoNDUsIDE1NywgMTIwKTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLWdyZWVuLTYwMDogcmdiKDM4LCAxNDIsIDEwOCk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1ncmVlbi03MDA6IHJnYigxOCwgMTI4LCA5Mik7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1ibHVlLTQwMDogcmdiKDU1LCAxNDIsIDI0MCk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1ibHVlLTUwMDogcmdiKDM4LCAxMjgsIDIzNSk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1ibHVlLTYwMDogcmdiKDIwLCAxMTUsIDIzMCk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1ibHVlLTcwMDogcmdiKDEzLCAxMDIsIDIwOCk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1ncmF5LTUwOiByZ2IoMjU1LCAyNTUsIDI1NSk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1ncmF5LTc1OiByZ2IoMjU1LCAyNTUsIDI1NSk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1ncmF5LTEwMDogcmdiKDI1NSwgMjU1LCAyNTUpO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItZ3JheS0yMDA6IHJnYigyNDQsIDI0NCwgMjQ0KTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLWdyYXktMzAwOiByZ2IoMjM0LCAyMzQsIDIzNCk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1ncmF5LTQwMDogcmdiKDIxMSwgMjExLCAyMTEpO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItZ3JheS01MDA6IHJnYigxODgsIDE4OCwgMTg4KTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLWdyYXktNjAwOiByZ2IoMTQ5LCAxNDksIDE0OSk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1ncmF5LTcwMDogcmdiKDExNiwgMTE2LCAxMTYpO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItZ3JheS04MDA6IHJnYig4MCwgODAsIDgwKTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLWdyYXktOTAwOiByZ2IoNTAsIDUwLCA1MCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWJhY2tncm91bmQtY29sb3ItcHJpbWFyeTogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLWdyYXktNTApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1iYWNrZ3JvdW5kLWNvbG9yLXNlY29uZGFyeTogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLWdyYXktMTAwKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtYmFja2dyb3VuZC1jb2xvci10ZXJ0aWFyeTogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLWdyYXktMzAwKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtYmFja2dyb3VuZC1jb2xvci1tb2RhbC1vdmVybGF5OiByZ2JhKDAsMCwwLDAuNCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWRyb3BzaGFkb3ctY29sb3I6IHJnYmEoMCwwLDAsMC4xNSk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWJhY2tncm91bmQtY29sb3ItaG92ZXItb3ZlcmxheTogcmdiYSg1MCw1MCw1MCwwLjA0KTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtaGlnaGxpZ2h0LWhvdmVyOiByZ2JhKDUwLDUwLDUwLDAuMDYpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1oaWdobGlnaHQtZG93bjogcmdiYSg1MCw1MCw1MCwwLjEpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1oaWdobGlnaHQtc2VsZWN0ZWQ6IHJnYmEoMzgsMTI4LDIzNSwwLjEpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1oaWdobGlnaHQtc2VsZWN0ZWQtaG92ZXI6IHJnYmEoMzgsMTI4LDIzNSwwLjIpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy10ZXh0LWhpZ2hsaWdodC1jb2xvcjogcmdiYSgzOCwxMjgsMjM1LDAuMik7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWJhY2tncm91bmQtY29sb3ItcXVpY2thY3Rpb25zOiByZ2JhKDI1NSwyNTUsMjU1LDAuOSk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWJvcmRlci1jb2xvci1zZWxlY3RlZDogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLWJsdWUtNTAwKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtYm9yZGVyLWNvbG9yLXRyYW5zbHVjZW50OiByZ2JhKDUwLDUwLDUwLDAuMSk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLXJhZGlhbC1yZWFjdGlvbi1jb2xvci1kZWZhdWx0OiByZ2JhKDgwLDgwLDgwLDAuNik7XFxuICAtLXNwZWN0cnVtLWFsaWFzLXBhc3RlYm9hcmQtYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLWdyYXktMzAwKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtYXBwZnJhbWUtYm9yZGVyLWNvbG9yOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItZ3JheS0zMDApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1hcHBmcmFtZS1zZXBhcmF0b3ItY29sb3I6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1ncmF5LTMwMCk7XFxuICAtLXNwZWN0cnVtLXNsaWRlci1zLXRpY2stZWRpdGFibGUtcmFkaWFsLXJlYWN0aW9uLWNvbG9yOiByZ2JhKDgwLDgwLDgwLDAuNik7XFxuICAtLXNwZWN0cnVtLXNsaWRlci1zLXJhbXAtdGljay1lZGl0YWJsZS1yYWRpYWwtcmVhY3Rpb24tY29sb3I6IHJnYmEoODAsODAsODAsMC42KTtcXG4gIC0tc3BlY3RydW0tc2xpZGVyLXMtcmFuZ2UtdGljay1lZGl0YWJsZS1yYWRpYWwtcmVhY3Rpb24tY29sb3I6IHJnYmEoODAsODAsODAsMC42KTtcXG4gIC0tc3BlY3RydW0tc2xpZGVyLXMtdGljay1yYWRpYWwtcmVhY3Rpb24tY29sb3I6IHJnYmEoODAsODAsODAsMC42KTtcXG4gIC0tc3BlY3RydW0tc2xpZGVyLXMtcmFtcC10aWNrLXJhZGlhbC1yZWFjdGlvbi1jb2xvcjogcmdiYSg4MCw4MCw4MCwwLjYpO1xcbiAgLS1zcGVjdHJ1bS1zbGlkZXItcy1yYW5nZS10aWNrLXJhZGlhbC1yZWFjdGlvbi1jb2xvcjogcmdiYSg4MCw4MCw4MCwwLjYpO1xcbiAgLS1zcGVjdHJ1bS1zbGlkZXItcy1lZGl0YWJsZS1yYWRpYWwtcmVhY3Rpb24tY29sb3I6IHJnYmEoODAsODAsODAsMC42KTtcXG4gIC0tc3BlY3RydW0tc2xpZGVyLXMtcmFtcC1lZGl0YWJsZS1yYWRpYWwtcmVhY3Rpb24tY29sb3I6IHJnYmEoODAsODAsODAsMC42KTtcXG4gIC0tc3BlY3RydW0tc2xpZGVyLXMtcmFuZ2UtZWRpdGFibGUtcmFkaWFsLXJlYWN0aW9uLWNvbG9yOiByZ2JhKDgwLDgwLDgwLDAuNik7XFxuICAtLXNwZWN0cnVtLXNsaWRlci1zLXJhZGlhbC1yZWFjdGlvbi1jb2xvcjogcmdiYSg4MCw4MCw4MCwwLjYpO1xcbiAgLS1zcGVjdHJ1bS1zbGlkZXItcy1yYW1wLXJhZGlhbC1yZWFjdGlvbi1jb2xvcjogcmdiYSg4MCw4MCw4MCwwLjYpO1xcbiAgLS1zcGVjdHJ1bS1zbGlkZXItcy1yYW5nZS1yYWRpYWwtcmVhY3Rpb24tY29sb3I6IHJnYmEoODAsODAsODAsMC42KTtcXG4gIC0tc3BlY3RydW0tc2xpZGVyLW0tdGljay1lZGl0YWJsZS1yYWRpYWwtcmVhY3Rpb24tY29sb3I6IHJnYmEoODAsODAsODAsMC42KTtcXG4gIC0tc3BlY3RydW0tc2xpZGVyLW0tcmFtcC10aWNrLWVkaXRhYmxlLXJhZGlhbC1yZWFjdGlvbi1jb2xvcjogcmdiYSg4MCw4MCw4MCwwLjYpO1xcbiAgLS1zcGVjdHJ1bS1zbGlkZXItbS1yYW5nZS10aWNrLWVkaXRhYmxlLXJhZGlhbC1yZWFjdGlvbi1jb2xvcjogcmdiYSg4MCw4MCw4MCwwLjYpO1xcbiAgLS1zcGVjdHJ1bS1zbGlkZXItbS10aWNrLXJhZGlhbC1yZWFjdGlvbi1jb2xvcjogcmdiYSg4MCw4MCw4MCwwLjYpO1xcbiAgLS1zcGVjdHJ1bS1zbGlkZXItbS1yYW1wLXRpY2stcmFkaWFsLXJlYWN0aW9uLWNvbG9yOiByZ2JhKDgwLDgwLDgwLDAuNik7XFxuICAtLXNwZWN0cnVtLXNsaWRlci1tLXJhbmdlLXRpY2stcmFkaWFsLXJlYWN0aW9uLWNvbG9yOiByZ2JhKDgwLDgwLDgwLDAuNik7XFxuICAtLXNwZWN0cnVtLXNsaWRlci1tLWVkaXRhYmxlLXJhZGlhbC1yZWFjdGlvbi1jb2xvcjogcmdiYSg4MCw4MCw4MCwwLjYpO1xcbiAgLS1zcGVjdHJ1bS1zbGlkZXItbS1yYW1wLWVkaXRhYmxlLXJhZGlhbC1yZWFjdGlvbi1jb2xvcjogcmdiYSg4MCw4MCw4MCwwLjYpO1xcbiAgLS1zcGVjdHJ1bS1zbGlkZXItbS1yYW5nZS1lZGl0YWJsZS1yYWRpYWwtcmVhY3Rpb24tY29sb3I6IHJnYmEoODAsODAsODAsMC42KTtcXG4gIC0tc3BlY3RydW0tc2xpZGVyLW0tcmFkaWFsLXJlYWN0aW9uLWNvbG9yOiByZ2JhKDgwLDgwLDgwLDAuNik7XFxuICAtLXNwZWN0cnVtLXNsaWRlci1tLXJhbXAtcmFkaWFsLXJlYWN0aW9uLWNvbG9yOiByZ2JhKDgwLDgwLDgwLDAuNik7XFxuICAtLXNwZWN0cnVtLXNsaWRlci1tLXJhbmdlLXJhZGlhbC1yZWFjdGlvbi1jb2xvcjogcmdiYSg4MCw4MCw4MCwwLjYpO1xcbiAgLS1zcGVjdHJ1bS1zbGlkZXItbC10aWNrLWVkaXRhYmxlLXJhZGlhbC1yZWFjdGlvbi1jb2xvcjogcmdiYSg4MCw4MCw4MCwwLjYpO1xcbiAgLS1zcGVjdHJ1bS1zbGlkZXItbC1yYW1wLXRpY2stZWRpdGFibGUtcmFkaWFsLXJlYWN0aW9uLWNvbG9yOiByZ2JhKDgwLDgwLDgwLDAuNik7XFxuICAtLXNwZWN0cnVtLXNsaWRlci1sLXJhbmdlLXRpY2stZWRpdGFibGUtcmFkaWFsLXJlYWN0aW9uLWNvbG9yOiByZ2JhKDgwLDgwLDgwLDAuNik7XFxuICAtLXNwZWN0cnVtLXNsaWRlci1sLXRpY2stcmFkaWFsLXJlYWN0aW9uLWNvbG9yOiByZ2JhKDgwLDgwLDgwLDAuNik7XFxuICAtLXNwZWN0cnVtLXNsaWRlci1sLXJhbXAtdGljay1yYWRpYWwtcmVhY3Rpb24tY29sb3I6IHJnYmEoODAsODAsODAsMC42KTtcXG4gIC0tc3BlY3RydW0tc2xpZGVyLWwtcmFuZ2UtdGljay1yYWRpYWwtcmVhY3Rpb24tY29sb3I6IHJnYmEoODAsODAsODAsMC42KTtcXG4gIC0tc3BlY3RydW0tc2xpZGVyLWwtZWRpdGFibGUtcmFkaWFsLXJlYWN0aW9uLWNvbG9yOiByZ2JhKDgwLDgwLDgwLDAuNik7XFxuICAtLXNwZWN0cnVtLXNsaWRlci1sLXJhbXAtZWRpdGFibGUtcmFkaWFsLXJlYWN0aW9uLWNvbG9yOiByZ2JhKDgwLDgwLDgwLDAuNik7XFxuICAtLXNwZWN0cnVtLXNsaWRlci1sLXJhbmdlLWVkaXRhYmxlLXJhZGlhbC1yZWFjdGlvbi1jb2xvcjogcmdiYSg4MCw4MCw4MCwwLjYpO1xcbiAgLS1zcGVjdHJ1bS1zbGlkZXItbC1yYWRpYWwtcmVhY3Rpb24tY29sb3I6IHJnYmEoODAsODAsODAsMC42KTtcXG4gIC0tc3BlY3RydW0tc2xpZGVyLWwtcmFtcC1yYWRpYWwtcmVhY3Rpb24tY29sb3I6IHJnYmEoODAsODAsODAsMC42KTtcXG4gIC0tc3BlY3RydW0tc2xpZGVyLWwtcmFuZ2UtcmFkaWFsLXJlYWN0aW9uLWNvbG9yOiByZ2JhKDgwLDgwLDgwLDAuNik7XFxuICAtLXNwZWN0cnVtLXNsaWRlci14bC10aWNrLWVkaXRhYmxlLXJhZGlhbC1yZWFjdGlvbi1jb2xvcjogcmdiYSg4MCw4MCw4MCwwLjYpO1xcbiAgLS1zcGVjdHJ1bS1zbGlkZXIteGwtcmFtcC10aWNrLWVkaXRhYmxlLXJhZGlhbC1yZWFjdGlvbi1jb2xvcjogcmdiYSg4MCw4MCw4MCwwLjYpO1xcbiAgLS1zcGVjdHJ1bS1zbGlkZXIteGwtcmFuZ2UtdGljay1lZGl0YWJsZS1yYWRpYWwtcmVhY3Rpb24tY29sb3I6IHJnYmEoODAsODAsODAsMC42KTtcXG4gIC0tc3BlY3RydW0tc2xpZGVyLXhsLXRpY2stcmFkaWFsLXJlYWN0aW9uLWNvbG9yOiByZ2JhKDgwLDgwLDgwLDAuNik7XFxuICAtLXNwZWN0cnVtLXNsaWRlci14bC1yYW1wLXRpY2stcmFkaWFsLXJlYWN0aW9uLWNvbG9yOiByZ2JhKDgwLDgwLDgwLDAuNik7XFxuICAtLXNwZWN0cnVtLXNsaWRlci14bC1yYW5nZS10aWNrLXJhZGlhbC1yZWFjdGlvbi1jb2xvcjogcmdiYSg4MCw4MCw4MCwwLjYpO1xcbiAgLS1zcGVjdHJ1bS1zbGlkZXIteGwtZWRpdGFibGUtcmFkaWFsLXJlYWN0aW9uLWNvbG9yOiByZ2JhKDgwLDgwLDgwLDAuNik7XFxuICAtLXNwZWN0cnVtLXNsaWRlci14bC1yYW1wLWVkaXRhYmxlLXJhZGlhbC1yZWFjdGlvbi1jb2xvcjogcmdiYSg4MCw4MCw4MCwwLjYpO1xcbiAgLS1zcGVjdHJ1bS1zbGlkZXIteGwtcmFuZ2UtZWRpdGFibGUtcmFkaWFsLXJlYWN0aW9uLWNvbG9yOiByZ2JhKDgwLDgwLDgwLDAuNik7XFxuICAtLXNwZWN0cnVtLXNsaWRlci14bC1yYWRpYWwtcmVhY3Rpb24tY29sb3I6IHJnYmEoODAsODAsODAsMC42KTtcXG4gIC0tc3BlY3RydW0tc2xpZGVyLXhsLXJhbXAtcmFkaWFsLXJlYWN0aW9uLWNvbG9yOiByZ2JhKDgwLDgwLDgwLDAuNik7XFxuICAtLXNwZWN0cnVtLXNsaWRlci14bC1yYW5nZS1yYWRpYWwtcmVhY3Rpb24tY29sb3I6IHJnYmEoODAsODAsODAsMC42KTtcXG4gIC0tc3BlY3RydW0td2VsbC1iYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDgwLDgwLDgwLDAuMDIpO1xcbiAgLS1zcGVjdHJ1bS13ZWxsLWJvcmRlci1jb2xvcjogcmdiYSg1MCw1MCw1MCwwLjA1KTtcXG59XFxuXCIsIFwiXCJdKTtcblxuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///106\n')},function(module,exports,__webpack_require__){eval("var api = __webpack_require__(5);\n            var content = __webpack_require__(108);\n\n            content = content.__esModule ? content.default : content;\n\n            if (typeof content === 'string') {\n              content = [[module.i, content, '']];\n            }\n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = api(content, options);\n\n\n\nmodule.exports = content.locals || {};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTA3LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BzcGVjdHJ1bS1jc3MvdmFycy9kaXN0L3NwZWN0cnVtLWRhcmsuY3NzP2ZjZmEiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGFwaSA9IHJlcXVpcmUoXCIhLi4vLi4vLi4vc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanNcIik7XG4gICAgICAgICAgICB2YXIgY29udGVudCA9IHJlcXVpcmUoXCIhIS4uLy4uLy4uL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9zcGVjdHJ1bS1kYXJrLmNzc1wiKTtcblxuICAgICAgICAgICAgY29udGVudCA9IGNvbnRlbnQuX19lc01vZHVsZSA/IGNvbnRlbnQuZGVmYXVsdCA6IGNvbnRlbnQ7XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgY29udGVudCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgY29udGVudCA9IFtbbW9kdWxlLmlkLCBjb250ZW50LCAnJ11dO1xuICAgICAgICAgICAgfVxuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLmluc2VydCA9IFwiaGVhZFwiO1xub3B0aW9ucy5zaW5nbGV0b24gPSBmYWxzZTtcblxudmFyIHVwZGF0ZSA9IGFwaShjb250ZW50LCBvcHRpb25zKTtcblxuXG5cbm1vZHVsZS5leHBvcnRzID0gY29udGVudC5sb2NhbHMgfHwge307Il0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///107\n")},function(module,exports,__webpack_require__){eval('exports = module.exports = __webpack_require__(6)(false);\n// Module\nexports.push([module.i, ".spectrum--dark {\\n  --spectrum-global-color-status: Verified;\\n  --spectrum-global-color-version: 5.1.0;\\n  --spectrum-global-color-opacity-100: 1;\\n  --spectrum-global-color-opacity-90: 0.9;\\n  --spectrum-global-color-opacity-80: 0.8;\\n  --spectrum-global-color-opacity-70: 0.7;\\n  --spectrum-global-color-opacity-60: 0.6;\\n  --spectrum-global-color-opacity-55: 0.55;\\n  --spectrum-global-color-opacity-50: 0.5;\\n  --spectrum-global-color-opacity-42: 0.42;\\n  --spectrum-global-color-opacity-40: 0.4;\\n  --spectrum-global-color-opacity-30: 0.3;\\n  --spectrum-global-color-opacity-25: 0.25;\\n  --spectrum-global-color-opacity-20: 0.2;\\n  --spectrum-global-color-opacity-15: 0.15;\\n  --spectrum-global-color-opacity-10: 0.1;\\n  --spectrum-global-color-opacity-8: 0.08;\\n  --spectrum-global-color-opacity-7: 0.07;\\n  --spectrum-global-color-opacity-6: 0.06;\\n  --spectrum-global-color-opacity-5: 0.05;\\n  --spectrum-global-color-opacity-4: 0.04;\\n  --spectrum-global-color-opacity-0: 0.00;\\n  --spectrum-global-color-celery-400: rgb(68, 181, 86);\\n  --spectrum-global-color-celery-500: rgb(75, 195, 95);\\n  --spectrum-global-color-celery-600: rgb(81, 210, 103);\\n  --spectrum-global-color-celery-700: rgb(88, 224, 111);\\n  --spectrum-global-color-chartreuse-400: rgb(133, 208, 68);\\n  --spectrum-global-color-chartreuse-500: rgb(142, 222, 73);\\n  --spectrum-global-color-chartreuse-600: rgb(155, 236, 84);\\n  --spectrum-global-color-chartreuse-700: rgb(163, 248, 88);\\n  --spectrum-global-color-yellow-400: rgb(223, 191, 0);\\n  --spectrum-global-color-yellow-500: rgb(237, 204, 0);\\n  --spectrum-global-color-yellow-600: rgb(250, 217, 0);\\n  --spectrum-global-color-yellow-700: rgb(255, 226, 46);\\n  --spectrum-global-color-magenta-400: rgb(216, 55, 144);\\n  --spectrum-global-color-magenta-500: rgb(226, 73, 157);\\n  --spectrum-global-color-magenta-600: rgb(236, 90, 170);\\n  --spectrum-global-color-magenta-700: rgb(245, 107, 183);\\n  --spectrum-global-color-fuchsia-400: rgb(192, 56, 204);\\n  --spectrum-global-color-fuchsia-500: rgb(207, 62, 220);\\n  --spectrum-global-color-fuchsia-600: rgb(217, 81, 229);\\n  --spectrum-global-color-fuchsia-700: rgb(227, 102, 239);\\n  --spectrum-global-color-purple-400: rgb(146, 86, 217);\\n  --spectrum-global-color-purple-500: rgb(157, 100, 225);\\n  --spectrum-global-color-purple-600: rgb(168, 115, 233);\\n  --spectrum-global-color-purple-700: rgb(180, 131, 240);\\n  --spectrum-global-color-indigo-400: rgb(103, 103, 236);\\n  --spectrum-global-color-indigo-500: rgb(117, 117, 241);\\n  --spectrum-global-color-indigo-600: rgb(130, 130, 246);\\n  --spectrum-global-color-indigo-700: rgb(144, 144, 250);\\n  --spectrum-global-color-seafoam-400: rgb(27, 149, 154);\\n  --spectrum-global-color-seafoam-500: rgb(32, 163, 168);\\n  --spectrum-global-color-seafoam-600: rgb(35, 178, 184);\\n  --spectrum-global-color-seafoam-700: rgb(38, 192, 199);\\n  --spectrum-global-color-red-400: rgb(227, 72, 80);\\n  --spectrum-global-color-red-500: rgb(236, 91, 98);\\n  --spectrum-global-color-red-600: rgb(247, 109, 116);\\n  --spectrum-global-color-red-700: rgb(255, 123, 130);\\n  --spectrum-global-color-orange-400: rgb(230, 134, 25);\\n  --spectrum-global-color-orange-500: rgb(242, 148, 35);\\n  --spectrum-global-color-orange-600: rgb(249, 164, 63);\\n  --spectrum-global-color-orange-700: rgb(255, 181, 91);\\n  --spectrum-global-color-green-400: rgb(45, 157, 120);\\n  --spectrum-global-color-green-500: rgb(51, 171, 132);\\n  --spectrum-global-color-green-600: rgb(57, 185, 144);\\n  --spectrum-global-color-green-700: rgb(63, 200, 156);\\n  --spectrum-global-color-blue-400: rgb(38, 128, 235);\\n  --spectrum-global-color-blue-500: rgb(55, 142, 240);\\n  --spectrum-global-color-blue-600: rgb(75, 156, 245);\\n  --spectrum-global-color-blue-700: rgb(90, 169, 250);\\n  --spectrum-global-color-gray-50: rgb(37, 37, 37);\\n  --spectrum-global-color-gray-75: rgb(47, 47, 47);\\n  --spectrum-global-color-gray-100: rgb(50, 50, 50);\\n  --spectrum-global-color-gray-200: rgb(62, 62, 62);\\n  --spectrum-global-color-gray-300: rgb(74, 74, 74);\\n  --spectrum-global-color-gray-400: rgb(90, 90, 90);\\n  --spectrum-global-color-gray-500: rgb(110, 110, 110);\\n  --spectrum-global-color-gray-600: rgb(144, 144, 144);\\n  --spectrum-global-color-gray-700: rgb(185, 185, 185);\\n  --spectrum-global-color-gray-800: rgb(227, 227, 227);\\n  --spectrum-global-color-gray-900: rgb(255, 255, 255);\\n  --spectrum-alias-background-color-primary: var(--spectrum-global-color-gray-100);\\n  --spectrum-alias-background-color-secondary: var(--spectrum-global-color-gray-75);\\n  --spectrum-alias-background-color-tertiary: var(--spectrum-global-color-gray-50);\\n  --spectrum-alias-background-color-modal-overlay: rgba(0,0,0,0.5);\\n  --spectrum-alias-dropshadow-color: rgba(0,0,0,0.5);\\n  --spectrum-alias-background-color-hover-overlay: rgba(255,255,255,0.06);\\n  --spectrum-alias-highlight-hover: rgba(255,255,255,0.07);\\n  --spectrum-alias-highlight-down: rgba(255,255,255,0.1);\\n  --spectrum-alias-highlight-selected: rgba(55,142,240,0.15);\\n  --spectrum-alias-highlight-selected-hover: rgba(55,142,240,0.25);\\n  --spectrum-alias-text-highlight-color: rgba(55,142,240,0.25);\\n  --spectrum-alias-background-color-quickactions: rgba(50,50,50,0.9);\\n  --spectrum-alias-border-color-selected: var(--spectrum-global-color-blue-600);\\n  --spectrum-alias-border-color-translucent: rgba(255,255,255,0.1);\\n  --spectrum-alias-radial-reaction-color-default: rgba(227,227,227,0.6);\\n  --spectrum-alias-pasteboard-background-color: var(--spectrum-global-color-gray-50);\\n  --spectrum-alias-appframe-border-color: var(--spectrum-global-color-gray-50);\\n  --spectrum-alias-appframe-separator-color: var(--spectrum-global-color-gray-50);\\n  --spectrum-scrollbar-mac-s-track-background-color: var(--spectrum-global-color-gray-100);\\n  --spectrum-scrollbar-mac-m-track-background-color: var(--spectrum-global-color-gray-100);\\n  --spectrum-scrollbar-mac-l-track-background-color: var(--spectrum-global-color-gray-100);\\n  --spectrum-slider-s-tick-editable-radial-reaction-color: rgba(227,227,227,0.6);\\n  --spectrum-slider-s-ramp-tick-editable-radial-reaction-color: rgba(227,227,227,0.6);\\n  --spectrum-slider-s-range-tick-editable-radial-reaction-color: rgba(227,227,227,0.6);\\n  --spectrum-slider-s-tick-radial-reaction-color: rgba(227,227,227,0.6);\\n  --spectrum-slider-s-ramp-tick-radial-reaction-color: rgba(227,227,227,0.6);\\n  --spectrum-slider-s-range-tick-radial-reaction-color: rgba(227,227,227,0.6);\\n  --spectrum-slider-s-editable-radial-reaction-color: rgba(227,227,227,0.6);\\n  --spectrum-slider-s-ramp-editable-radial-reaction-color: rgba(227,227,227,0.6);\\n  --spectrum-slider-s-range-editable-radial-reaction-color: rgba(227,227,227,0.6);\\n  --spectrum-slider-s-radial-reaction-color: rgba(227,227,227,0.6);\\n  --spectrum-slider-s-ramp-radial-reaction-color: rgba(227,227,227,0.6);\\n  --spectrum-slider-s-range-radial-reaction-color: rgba(227,227,227,0.6);\\n  --spectrum-slider-m-tick-editable-radial-reaction-color: rgba(227,227,227,0.6);\\n  --spectrum-slider-m-ramp-tick-editable-radial-reaction-color: rgba(227,227,227,0.6);\\n  --spectrum-slider-m-range-tick-editable-radial-reaction-color: rgba(227,227,227,0.6);\\n  --spectrum-slider-m-tick-radial-reaction-color: rgba(227,227,227,0.6);\\n  --spectrum-slider-m-ramp-tick-radial-reaction-color: rgba(227,227,227,0.6);\\n  --spectrum-slider-m-range-tick-radial-reaction-color: rgba(227,227,227,0.6);\\n  --spectrum-slider-m-editable-radial-reaction-color: rgba(227,227,227,0.6);\\n  --spectrum-slider-m-ramp-editable-radial-reaction-color: rgba(227,227,227,0.6);\\n  --spectrum-slider-m-range-editable-radial-reaction-color: rgba(227,227,227,0.6);\\n  --spectrum-slider-m-radial-reaction-color: rgba(227,227,227,0.6);\\n  --spectrum-slider-m-ramp-radial-reaction-color: rgba(227,227,227,0.6);\\n  --spectrum-slider-m-range-radial-reaction-color: rgba(227,227,227,0.6);\\n  --spectrum-slider-l-tick-editable-radial-reaction-color: rgba(227,227,227,0.6);\\n  --spectrum-slider-l-ramp-tick-editable-radial-reaction-color: rgba(227,227,227,0.6);\\n  --spectrum-slider-l-range-tick-editable-radial-reaction-color: rgba(227,227,227,0.6);\\n  --spectrum-slider-l-tick-radial-reaction-color: rgba(227,227,227,0.6);\\n  --spectrum-slider-l-ramp-tick-radial-reaction-color: rgba(227,227,227,0.6);\\n  --spectrum-slider-l-range-tick-radial-reaction-color: rgba(227,227,227,0.6);\\n  --spectrum-slider-l-editable-radial-reaction-color: rgba(227,227,227,0.6);\\n  --spectrum-slider-l-ramp-editable-radial-reaction-color: rgba(227,227,227,0.6);\\n  --spectrum-slider-l-range-editable-radial-reaction-color: rgba(227,227,227,0.6);\\n  --spectrum-slider-l-radial-reaction-color: rgba(227,227,227,0.6);\\n  --spectrum-slider-l-ramp-radial-reaction-color: rgba(227,227,227,0.6);\\n  --spectrum-slider-l-range-radial-reaction-color: rgba(227,227,227,0.6);\\n  --spectrum-slider-xl-tick-editable-radial-reaction-color: rgba(227,227,227,0.6);\\n  --spectrum-slider-xl-ramp-tick-editable-radial-reaction-color: rgba(227,227,227,0.6);\\n  --spectrum-slider-xl-range-tick-editable-radial-reaction-color: rgba(227,227,227,0.6);\\n  --spectrum-slider-xl-tick-radial-reaction-color: rgba(227,227,227,0.6);\\n  --spectrum-slider-xl-ramp-tick-radial-reaction-color: rgba(227,227,227,0.6);\\n  --spectrum-slider-xl-range-tick-radial-reaction-color: rgba(227,227,227,0.6);\\n  --spectrum-slider-xl-editable-radial-reaction-color: rgba(227,227,227,0.6);\\n  --spectrum-slider-xl-ramp-editable-radial-reaction-color: rgba(227,227,227,0.6);\\n  --spectrum-slider-xl-range-editable-radial-reaction-color: rgba(227,227,227,0.6);\\n  --spectrum-slider-xl-radial-reaction-color: rgba(227,227,227,0.6);\\n  --spectrum-slider-xl-ramp-radial-reaction-color: rgba(227,227,227,0.6);\\n  --spectrum-slider-xl-range-radial-reaction-color: rgba(227,227,227,0.6);\\n  --spectrum-well-background-color: rgba(227,227,227,0.02);\\n  --spectrum-well-border-color: rgba(255,255,255,0.05);\\n}\\n", ""]);\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTA4LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BzcGVjdHJ1bS1jc3MvdmFycy9kaXN0L3NwZWN0cnVtLWRhcmsuY3NzPzQ2OTYiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIi4uLy4uLy4uL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qc1wiKShmYWxzZSk7XG4vLyBNb2R1bGVcbmV4cG9ydHMucHVzaChbbW9kdWxlLmlkLCBcIi5zcGVjdHJ1bS0tZGFyayB7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1zdGF0dXM6IFZlcmlmaWVkO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItdmVyc2lvbjogNS4xLjA7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1vcGFjaXR5LTEwMDogMTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLW9wYWNpdHktOTA6IDAuOTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLW9wYWNpdHktODA6IDAuODtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLW9wYWNpdHktNzA6IDAuNztcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLW9wYWNpdHktNjA6IDAuNjtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLW9wYWNpdHktNTU6IDAuNTU7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1vcGFjaXR5LTUwOiAwLjU7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1vcGFjaXR5LTQyOiAwLjQyO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3Itb3BhY2l0eS00MDogMC40O1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3Itb3BhY2l0eS0zMDogMC4zO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3Itb3BhY2l0eS0yNTogMC4yNTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLW9wYWNpdHktMjA6IDAuMjtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLW9wYWNpdHktMTU6IDAuMTU7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1vcGFjaXR5LTEwOiAwLjE7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1vcGFjaXR5LTg6IDAuMDg7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1vcGFjaXR5LTc6IDAuMDc7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1vcGFjaXR5LTY6IDAuMDY7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1vcGFjaXR5LTU6IDAuMDU7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1vcGFjaXR5LTQ6IDAuMDQ7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1vcGFjaXR5LTA6IDAuMDA7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1jZWxlcnktNDAwOiByZ2IoNjgsIDE4MSwgODYpO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItY2VsZXJ5LTUwMDogcmdiKDc1LCAxOTUsIDk1KTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLWNlbGVyeS02MDA6IHJnYig4MSwgMjEwLCAxMDMpO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItY2VsZXJ5LTcwMDogcmdiKDg4LCAyMjQsIDExMSk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1jaGFydHJldXNlLTQwMDogcmdiKDEzMywgMjA4LCA2OCk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1jaGFydHJldXNlLTUwMDogcmdiKDE0MiwgMjIyLCA3Myk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1jaGFydHJldXNlLTYwMDogcmdiKDE1NSwgMjM2LCA4NCk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1jaGFydHJldXNlLTcwMDogcmdiKDE2MywgMjQ4LCA4OCk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci15ZWxsb3ctNDAwOiByZ2IoMjIzLCAxOTEsIDApO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3IteWVsbG93LTUwMDogcmdiKDIzNywgMjA0LCAwKTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLXllbGxvdy02MDA6IHJnYigyNTAsIDIxNywgMCk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci15ZWxsb3ctNzAwOiByZ2IoMjU1LCAyMjYsIDQ2KTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLW1hZ2VudGEtNDAwOiByZ2IoMjE2LCA1NSwgMTQ0KTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLW1hZ2VudGEtNTAwOiByZ2IoMjI2LCA3MywgMTU3KTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLW1hZ2VudGEtNjAwOiByZ2IoMjM2LCA5MCwgMTcwKTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLW1hZ2VudGEtNzAwOiByZ2IoMjQ1LCAxMDcsIDE4Myk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1mdWNoc2lhLTQwMDogcmdiKDE5MiwgNTYsIDIwNCk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1mdWNoc2lhLTUwMDogcmdiKDIwNywgNjIsIDIyMCk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1mdWNoc2lhLTYwMDogcmdiKDIxNywgODEsIDIyOSk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1mdWNoc2lhLTcwMDogcmdiKDIyNywgMTAyLCAyMzkpO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItcHVycGxlLTQwMDogcmdiKDE0NiwgODYsIDIxNyk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1wdXJwbGUtNTAwOiByZ2IoMTU3LCAxMDAsIDIyNSk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1wdXJwbGUtNjAwOiByZ2IoMTY4LCAxMTUsIDIzMyk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1wdXJwbGUtNzAwOiByZ2IoMTgwLCAxMzEsIDI0MCk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1pbmRpZ28tNDAwOiByZ2IoMTAzLCAxMDMsIDIzNik7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1pbmRpZ28tNTAwOiByZ2IoMTE3LCAxMTcsIDI0MSk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1pbmRpZ28tNjAwOiByZ2IoMTMwLCAxMzAsIDI0Nik7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1pbmRpZ28tNzAwOiByZ2IoMTQ0LCAxNDQsIDI1MCk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1zZWFmb2FtLTQwMDogcmdiKDI3LCAxNDksIDE1NCk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1zZWFmb2FtLTUwMDogcmdiKDMyLCAxNjMsIDE2OCk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1zZWFmb2FtLTYwMDogcmdiKDM1LCAxNzgsIDE4NCk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1zZWFmb2FtLTcwMDogcmdiKDM4LCAxOTIsIDE5OSk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1yZWQtNDAwOiByZ2IoMjI3LCA3MiwgODApO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItcmVkLTUwMDogcmdiKDIzNiwgOTEsIDk4KTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLXJlZC02MDA6IHJnYigyNDcsIDEwOSwgMTE2KTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLXJlZC03MDA6IHJnYigyNTUsIDEyMywgMTMwKTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLW9yYW5nZS00MDA6IHJnYigyMzAsIDEzNCwgMjUpO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3Itb3JhbmdlLTUwMDogcmdiKDI0MiwgMTQ4LCAzNSk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1vcmFuZ2UtNjAwOiByZ2IoMjQ5LCAxNjQsIDYzKTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLW9yYW5nZS03MDA6IHJnYigyNTUsIDE4MSwgOTEpO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItZ3JlZW4tNDAwOiByZ2IoNDUsIDE1NywgMTIwKTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLWdyZWVuLTUwMDogcmdiKDUxLCAxNzEsIDEzMik7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1ncmVlbi02MDA6IHJnYig1NywgMTg1LCAxNDQpO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItZ3JlZW4tNzAwOiByZ2IoNjMsIDIwMCwgMTU2KTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLWJsdWUtNDAwOiByZ2IoMzgsIDEyOCwgMjM1KTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLWJsdWUtNTAwOiByZ2IoNTUsIDE0MiwgMjQwKTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLWJsdWUtNjAwOiByZ2IoNzUsIDE1NiwgMjQ1KTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLWJsdWUtNzAwOiByZ2IoOTAsIDE2OSwgMjUwKTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLWdyYXktNTA6IHJnYigzNywgMzcsIDM3KTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLWdyYXktNzU6IHJnYig0NywgNDcsIDQ3KTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLWdyYXktMTAwOiByZ2IoNTAsIDUwLCA1MCk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1ncmF5LTIwMDogcmdiKDYyLCA2MiwgNjIpO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItZ3JheS0zMDA6IHJnYig3NCwgNzQsIDc0KTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLWdyYXktNDAwOiByZ2IoOTAsIDkwLCA5MCk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1ncmF5LTUwMDogcmdiKDExMCwgMTEwLCAxMTApO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItZ3JheS02MDA6IHJnYigxNDQsIDE0NCwgMTQ0KTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLWdyYXktNzAwOiByZ2IoMTg1LCAxODUsIDE4NSk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1ncmF5LTgwMDogcmdiKDIyNywgMjI3LCAyMjcpO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItZ3JheS05MDA6IHJnYigyNTUsIDI1NSwgMjU1KTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtYmFja2dyb3VuZC1jb2xvci1wcmltYXJ5OiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItZ3JheS0xMDApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1iYWNrZ3JvdW5kLWNvbG9yLXNlY29uZGFyeTogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLWdyYXktNzUpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1iYWNrZ3JvdW5kLWNvbG9yLXRlcnRpYXJ5OiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItZ3JheS01MCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWJhY2tncm91bmQtY29sb3ItbW9kYWwtb3ZlcmxheTogcmdiYSgwLDAsMCwwLjUpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1kcm9wc2hhZG93LWNvbG9yOiByZ2JhKDAsMCwwLDAuNSk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWJhY2tncm91bmQtY29sb3ItaG92ZXItb3ZlcmxheTogcmdiYSgyNTUsMjU1LDI1NSwwLjA2KTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtaGlnaGxpZ2h0LWhvdmVyOiByZ2JhKDI1NSwyNTUsMjU1LDAuMDcpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1oaWdobGlnaHQtZG93bjogcmdiYSgyNTUsMjU1LDI1NSwwLjEpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1oaWdobGlnaHQtc2VsZWN0ZWQ6IHJnYmEoNTUsMTQyLDI0MCwwLjE1KTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtaGlnaGxpZ2h0LXNlbGVjdGVkLWhvdmVyOiByZ2JhKDU1LDE0MiwyNDAsMC4yNSk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLXRleHQtaGlnaGxpZ2h0LWNvbG9yOiByZ2JhKDU1LDE0MiwyNDAsMC4yNSk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWJhY2tncm91bmQtY29sb3ItcXVpY2thY3Rpb25zOiByZ2JhKDUwLDUwLDUwLDAuOSk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWJvcmRlci1jb2xvci1zZWxlY3RlZDogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLWJsdWUtNjAwKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtYm9yZGVyLWNvbG9yLXRyYW5zbHVjZW50OiByZ2JhKDI1NSwyNTUsMjU1LDAuMSk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLXJhZGlhbC1yZWFjdGlvbi1jb2xvci1kZWZhdWx0OiByZ2JhKDIyNywyMjcsMjI3LDAuNik7XFxuICAtLXNwZWN0cnVtLWFsaWFzLXBhc3RlYm9hcmQtYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLWdyYXktNTApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1hcHBmcmFtZS1ib3JkZXItY29sb3I6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1ncmF5LTUwKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtYXBwZnJhbWUtc2VwYXJhdG9yLWNvbG9yOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItZ3JheS01MCk7XFxuICAtLXNwZWN0cnVtLXNjcm9sbGJhci1tYWMtcy10cmFjay1iYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItZ3JheS0xMDApO1xcbiAgLS1zcGVjdHJ1bS1zY3JvbGxiYXItbWFjLW0tdHJhY2stYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLWdyYXktMTAwKTtcXG4gIC0tc3BlY3RydW0tc2Nyb2xsYmFyLW1hYy1sLXRyYWNrLWJhY2tncm91bmQtY29sb3I6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1ncmF5LTEwMCk7XFxuICAtLXNwZWN0cnVtLXNsaWRlci1zLXRpY2stZWRpdGFibGUtcmFkaWFsLXJlYWN0aW9uLWNvbG9yOiByZ2JhKDIyNywyMjcsMjI3LDAuNik7XFxuICAtLXNwZWN0cnVtLXNsaWRlci1zLXJhbXAtdGljay1lZGl0YWJsZS1yYWRpYWwtcmVhY3Rpb24tY29sb3I6IHJnYmEoMjI3LDIyNywyMjcsMC42KTtcXG4gIC0tc3BlY3RydW0tc2xpZGVyLXMtcmFuZ2UtdGljay1lZGl0YWJsZS1yYWRpYWwtcmVhY3Rpb24tY29sb3I6IHJnYmEoMjI3LDIyNywyMjcsMC42KTtcXG4gIC0tc3BlY3RydW0tc2xpZGVyLXMtdGljay1yYWRpYWwtcmVhY3Rpb24tY29sb3I6IHJnYmEoMjI3LDIyNywyMjcsMC42KTtcXG4gIC0tc3BlY3RydW0tc2xpZGVyLXMtcmFtcC10aWNrLXJhZGlhbC1yZWFjdGlvbi1jb2xvcjogcmdiYSgyMjcsMjI3LDIyNywwLjYpO1xcbiAgLS1zcGVjdHJ1bS1zbGlkZXItcy1yYW5nZS10aWNrLXJhZGlhbC1yZWFjdGlvbi1jb2xvcjogcmdiYSgyMjcsMjI3LDIyNywwLjYpO1xcbiAgLS1zcGVjdHJ1bS1zbGlkZXItcy1lZGl0YWJsZS1yYWRpYWwtcmVhY3Rpb24tY29sb3I6IHJnYmEoMjI3LDIyNywyMjcsMC42KTtcXG4gIC0tc3BlY3RydW0tc2xpZGVyLXMtcmFtcC1lZGl0YWJsZS1yYWRpYWwtcmVhY3Rpb24tY29sb3I6IHJnYmEoMjI3LDIyNywyMjcsMC42KTtcXG4gIC0tc3BlY3RydW0tc2xpZGVyLXMtcmFuZ2UtZWRpdGFibGUtcmFkaWFsLXJlYWN0aW9uLWNvbG9yOiByZ2JhKDIyNywyMjcsMjI3LDAuNik7XFxuICAtLXNwZWN0cnVtLXNsaWRlci1zLXJhZGlhbC1yZWFjdGlvbi1jb2xvcjogcmdiYSgyMjcsMjI3LDIyNywwLjYpO1xcbiAgLS1zcGVjdHJ1bS1zbGlkZXItcy1yYW1wLXJhZGlhbC1yZWFjdGlvbi1jb2xvcjogcmdiYSgyMjcsMjI3LDIyNywwLjYpO1xcbiAgLS1zcGVjdHJ1bS1zbGlkZXItcy1yYW5nZS1yYWRpYWwtcmVhY3Rpb24tY29sb3I6IHJnYmEoMjI3LDIyNywyMjcsMC42KTtcXG4gIC0tc3BlY3RydW0tc2xpZGVyLW0tdGljay1lZGl0YWJsZS1yYWRpYWwtcmVhY3Rpb24tY29sb3I6IHJnYmEoMjI3LDIyNywyMjcsMC42KTtcXG4gIC0tc3BlY3RydW0tc2xpZGVyLW0tcmFtcC10aWNrLWVkaXRhYmxlLXJhZGlhbC1yZWFjdGlvbi1jb2xvcjogcmdiYSgyMjcsMjI3LDIyNywwLjYpO1xcbiAgLS1zcGVjdHJ1bS1zbGlkZXItbS1yYW5nZS10aWNrLWVkaXRhYmxlLXJhZGlhbC1yZWFjdGlvbi1jb2xvcjogcmdiYSgyMjcsMjI3LDIyNywwLjYpO1xcbiAgLS1zcGVjdHJ1bS1zbGlkZXItbS10aWNrLXJhZGlhbC1yZWFjdGlvbi1jb2xvcjogcmdiYSgyMjcsMjI3LDIyNywwLjYpO1xcbiAgLS1zcGVjdHJ1bS1zbGlkZXItbS1yYW1wLXRpY2stcmFkaWFsLXJlYWN0aW9uLWNvbG9yOiByZ2JhKDIyNywyMjcsMjI3LDAuNik7XFxuICAtLXNwZWN0cnVtLXNsaWRlci1tLXJhbmdlLXRpY2stcmFkaWFsLXJlYWN0aW9uLWNvbG9yOiByZ2JhKDIyNywyMjcsMjI3LDAuNik7XFxuICAtLXNwZWN0cnVtLXNsaWRlci1tLWVkaXRhYmxlLXJhZGlhbC1yZWFjdGlvbi1jb2xvcjogcmdiYSgyMjcsMjI3LDIyNywwLjYpO1xcbiAgLS1zcGVjdHJ1bS1zbGlkZXItbS1yYW1wLWVkaXRhYmxlLXJhZGlhbC1yZWFjdGlvbi1jb2xvcjogcmdiYSgyMjcsMjI3LDIyNywwLjYpO1xcbiAgLS1zcGVjdHJ1bS1zbGlkZXItbS1yYW5nZS1lZGl0YWJsZS1yYWRpYWwtcmVhY3Rpb24tY29sb3I6IHJnYmEoMjI3LDIyNywyMjcsMC42KTtcXG4gIC0tc3BlY3RydW0tc2xpZGVyLW0tcmFkaWFsLXJlYWN0aW9uLWNvbG9yOiByZ2JhKDIyNywyMjcsMjI3LDAuNik7XFxuICAtLXNwZWN0cnVtLXNsaWRlci1tLXJhbXAtcmFkaWFsLXJlYWN0aW9uLWNvbG9yOiByZ2JhKDIyNywyMjcsMjI3LDAuNik7XFxuICAtLXNwZWN0cnVtLXNsaWRlci1tLXJhbmdlLXJhZGlhbC1yZWFjdGlvbi1jb2xvcjogcmdiYSgyMjcsMjI3LDIyNywwLjYpO1xcbiAgLS1zcGVjdHJ1bS1zbGlkZXItbC10aWNrLWVkaXRhYmxlLXJhZGlhbC1yZWFjdGlvbi1jb2xvcjogcmdiYSgyMjcsMjI3LDIyNywwLjYpO1xcbiAgLS1zcGVjdHJ1bS1zbGlkZXItbC1yYW1wLXRpY2stZWRpdGFibGUtcmFkaWFsLXJlYWN0aW9uLWNvbG9yOiByZ2JhKDIyNywyMjcsMjI3LDAuNik7XFxuICAtLXNwZWN0cnVtLXNsaWRlci1sLXJhbmdlLXRpY2stZWRpdGFibGUtcmFkaWFsLXJlYWN0aW9uLWNvbG9yOiByZ2JhKDIyNywyMjcsMjI3LDAuNik7XFxuICAtLXNwZWN0cnVtLXNsaWRlci1sLXRpY2stcmFkaWFsLXJlYWN0aW9uLWNvbG9yOiByZ2JhKDIyNywyMjcsMjI3LDAuNik7XFxuICAtLXNwZWN0cnVtLXNsaWRlci1sLXJhbXAtdGljay1yYWRpYWwtcmVhY3Rpb24tY29sb3I6IHJnYmEoMjI3LDIyNywyMjcsMC42KTtcXG4gIC0tc3BlY3RydW0tc2xpZGVyLWwtcmFuZ2UtdGljay1yYWRpYWwtcmVhY3Rpb24tY29sb3I6IHJnYmEoMjI3LDIyNywyMjcsMC42KTtcXG4gIC0tc3BlY3RydW0tc2xpZGVyLWwtZWRpdGFibGUtcmFkaWFsLXJlYWN0aW9uLWNvbG9yOiByZ2JhKDIyNywyMjcsMjI3LDAuNik7XFxuICAtLXNwZWN0cnVtLXNsaWRlci1sLXJhbXAtZWRpdGFibGUtcmFkaWFsLXJlYWN0aW9uLWNvbG9yOiByZ2JhKDIyNywyMjcsMjI3LDAuNik7XFxuICAtLXNwZWN0cnVtLXNsaWRlci1sLXJhbmdlLWVkaXRhYmxlLXJhZGlhbC1yZWFjdGlvbi1jb2xvcjogcmdiYSgyMjcsMjI3LDIyNywwLjYpO1xcbiAgLS1zcGVjdHJ1bS1zbGlkZXItbC1yYWRpYWwtcmVhY3Rpb24tY29sb3I6IHJnYmEoMjI3LDIyNywyMjcsMC42KTtcXG4gIC0tc3BlY3RydW0tc2xpZGVyLWwtcmFtcC1yYWRpYWwtcmVhY3Rpb24tY29sb3I6IHJnYmEoMjI3LDIyNywyMjcsMC42KTtcXG4gIC0tc3BlY3RydW0tc2xpZGVyLWwtcmFuZ2UtcmFkaWFsLXJlYWN0aW9uLWNvbG9yOiByZ2JhKDIyNywyMjcsMjI3LDAuNik7XFxuICAtLXNwZWN0cnVtLXNsaWRlci14bC10aWNrLWVkaXRhYmxlLXJhZGlhbC1yZWFjdGlvbi1jb2xvcjogcmdiYSgyMjcsMjI3LDIyNywwLjYpO1xcbiAgLS1zcGVjdHJ1bS1zbGlkZXIteGwtcmFtcC10aWNrLWVkaXRhYmxlLXJhZGlhbC1yZWFjdGlvbi1jb2xvcjogcmdiYSgyMjcsMjI3LDIyNywwLjYpO1xcbiAgLS1zcGVjdHJ1bS1zbGlkZXIteGwtcmFuZ2UtdGljay1lZGl0YWJsZS1yYWRpYWwtcmVhY3Rpb24tY29sb3I6IHJnYmEoMjI3LDIyNywyMjcsMC42KTtcXG4gIC0tc3BlY3RydW0tc2xpZGVyLXhsLXRpY2stcmFkaWFsLXJlYWN0aW9uLWNvbG9yOiByZ2JhKDIyNywyMjcsMjI3LDAuNik7XFxuICAtLXNwZWN0cnVtLXNsaWRlci14bC1yYW1wLXRpY2stcmFkaWFsLXJlYWN0aW9uLWNvbG9yOiByZ2JhKDIyNywyMjcsMjI3LDAuNik7XFxuICAtLXNwZWN0cnVtLXNsaWRlci14bC1yYW5nZS10aWNrLXJhZGlhbC1yZWFjdGlvbi1jb2xvcjogcmdiYSgyMjcsMjI3LDIyNywwLjYpO1xcbiAgLS1zcGVjdHJ1bS1zbGlkZXIteGwtZWRpdGFibGUtcmFkaWFsLXJlYWN0aW9uLWNvbG9yOiByZ2JhKDIyNywyMjcsMjI3LDAuNik7XFxuICAtLXNwZWN0cnVtLXNsaWRlci14bC1yYW1wLWVkaXRhYmxlLXJhZGlhbC1yZWFjdGlvbi1jb2xvcjogcmdiYSgyMjcsMjI3LDIyNywwLjYpO1xcbiAgLS1zcGVjdHJ1bS1zbGlkZXIteGwtcmFuZ2UtZWRpdGFibGUtcmFkaWFsLXJlYWN0aW9uLWNvbG9yOiByZ2JhKDIyNywyMjcsMjI3LDAuNik7XFxuICAtLXNwZWN0cnVtLXNsaWRlci14bC1yYWRpYWwtcmVhY3Rpb24tY29sb3I6IHJnYmEoMjI3LDIyNywyMjcsMC42KTtcXG4gIC0tc3BlY3RydW0tc2xpZGVyLXhsLXJhbXAtcmFkaWFsLXJlYWN0aW9uLWNvbG9yOiByZ2JhKDIyNywyMjcsMjI3LDAuNik7XFxuICAtLXNwZWN0cnVtLXNsaWRlci14bC1yYW5nZS1yYWRpYWwtcmVhY3Rpb24tY29sb3I6IHJnYmEoMjI3LDIyNywyMjcsMC42KTtcXG4gIC0tc3BlY3RydW0td2VsbC1iYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDIyNywyMjcsMjI3LDAuMDIpO1xcbiAgLS1zcGVjdHJ1bS13ZWxsLWJvcmRlci1jb2xvcjogcmdiYSgyNTUsMjU1LDI1NSwwLjA1KTtcXG59XFxuXCIsIFwiXCJdKTtcblxuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///108\n')},function(module,exports,__webpack_require__){eval("var api = __webpack_require__(5);\n            var content = __webpack_require__(110);\n\n            content = content.__esModule ? content.default : content;\n\n            if (typeof content === 'string') {\n              content = [[module.i, content, '']];\n            }\n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = api(content, options);\n\n\n\nmodule.exports = content.locals || {};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTA5LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BzcGVjdHJ1bS1jc3MvdmFycy9kaXN0L3NwZWN0cnVtLWRhcmtlc3QuY3NzP2JhOGMiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGFwaSA9IHJlcXVpcmUoXCIhLi4vLi4vLi4vc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanNcIik7XG4gICAgICAgICAgICB2YXIgY29udGVudCA9IHJlcXVpcmUoXCIhIS4uLy4uLy4uL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9zcGVjdHJ1bS1kYXJrZXN0LmNzc1wiKTtcblxuICAgICAgICAgICAgY29udGVudCA9IGNvbnRlbnQuX19lc01vZHVsZSA/IGNvbnRlbnQuZGVmYXVsdCA6IGNvbnRlbnQ7XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgY29udGVudCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgY29udGVudCA9IFtbbW9kdWxlLmlkLCBjb250ZW50LCAnJ11dO1xuICAgICAgICAgICAgfVxuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLmluc2VydCA9IFwiaGVhZFwiO1xub3B0aW9ucy5zaW5nbGV0b24gPSBmYWxzZTtcblxudmFyIHVwZGF0ZSA9IGFwaShjb250ZW50LCBvcHRpb25zKTtcblxuXG5cbm1vZHVsZS5leHBvcnRzID0gY29udGVudC5sb2NhbHMgfHwge307Il0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///109\n")},function(module,exports,__webpack_require__){eval('exports = module.exports = __webpack_require__(6)(false);\n// Module\nexports.push([module.i, ".spectrum--darkest {\\n  --spectrum-global-color-status: Verified;\\n  --spectrum-global-color-version: 5.1.0;\\n  --spectrum-global-color-opacity-100: 1;\\n  --spectrum-global-color-opacity-90: 0.9;\\n  --spectrum-global-color-opacity-80: 0.8;\\n  --spectrum-global-color-opacity-70: 0.7;\\n  --spectrum-global-color-opacity-60: 0.6;\\n  --spectrum-global-color-opacity-55: 0.55;\\n  --spectrum-global-color-opacity-50: 0.5;\\n  --spectrum-global-color-opacity-42: 0.42;\\n  --spectrum-global-color-opacity-40: 0.4;\\n  --spectrum-global-color-opacity-30: 0.3;\\n  --spectrum-global-color-opacity-25: 0.25;\\n  --spectrum-global-color-opacity-20: 0.2;\\n  --spectrum-global-color-opacity-15: 0.15;\\n  --spectrum-global-color-opacity-10: 0.1;\\n  --spectrum-global-color-opacity-8: 0.08;\\n  --spectrum-global-color-opacity-7: 0.07;\\n  --spectrum-global-color-opacity-6: 0.06;\\n  --spectrum-global-color-opacity-5: 0.05;\\n  --spectrum-global-color-opacity-4: 0.04;\\n  --spectrum-global-color-opacity-0: 0.00;\\n  --spectrum-global-color-celery-400: rgb(61, 167, 78);\\n  --spectrum-global-color-celery-500: rgb(68, 181, 86);\\n  --spectrum-global-color-celery-600: rgb(75, 195, 95);\\n  --spectrum-global-color-celery-700: rgb(81, 210, 103);\\n  --spectrum-global-color-chartreuse-400: rgb(124, 195, 63);\\n  --spectrum-global-color-chartreuse-500: rgb(133, 208, 68);\\n  --spectrum-global-color-chartreuse-600: rgb(142, 222, 73);\\n  --spectrum-global-color-chartreuse-700: rgb(155, 236, 84);\\n  --spectrum-global-color-yellow-400: rgb(210, 178, 0);\\n  --spectrum-global-color-yellow-500: rgb(223, 191, 0);\\n  --spectrum-global-color-yellow-600: rgb(237, 204, 0);\\n  --spectrum-global-color-yellow-700: rgb(250, 217, 0);\\n  --spectrum-global-color-magenta-400: rgb(202, 41, 150);\\n  --spectrum-global-color-magenta-500: rgb(216, 55, 144);\\n  --spectrum-global-color-magenta-600: rgb(226, 73, 157);\\n  --spectrum-global-color-magenta-700: rgb(236, 90, 170);\\n  --spectrum-global-color-fuchsia-400: rgb(177, 48, 189);\\n  --spectrum-global-color-fuchsia-500: rgb(192, 56, 204);\\n  --spectrum-global-color-fuchsia-600: rgb(207, 62, 220);\\n  --spectrum-global-color-fuchsia-700: rgb(217, 81, 229);\\n  --spectrum-global-color-purple-400: rgb(134, 76, 204);\\n  --spectrum-global-color-purple-500: rgb(146, 86, 217);\\n  --spectrum-global-color-purple-600: rgb(157, 100, 225);\\n  --spectrum-global-color-purple-700: rgb(168, 115, 223);\\n  --spectrum-global-color-indigo-400: rgb(92, 92, 224);\\n  --spectrum-global-color-indigo-500: rgb(103, 103, 236);\\n  --spectrum-global-color-indigo-600: rgb(117, 117, 241);\\n  --spectrum-global-color-indigo-700: rgb(130, 130, 246);\\n  --spectrum-global-color-seafoam-400: rgb(22, 135, 140);\\n  --spectrum-global-color-seafoam-500: rgb(27, 149, 154);\\n  --spectrum-global-color-seafoam-600: rgb(32, 163, 168);\\n  --spectrum-global-color-seafoam-700: rgb(35, 178, 184);\\n  --spectrum-global-color-red-400: rgb(215, 55, 63);\\n  --spectrum-global-color-red-500: rgb(227, 72, 80);\\n  --spectrum-global-color-red-600: rgb(236, 91, 98);\\n  --spectrum-global-color-red-700: rgb(247, 109, 116);\\n  --spectrum-global-color-orange-400: rgb(218, 123, 17);\\n  --spectrum-global-color-orange-500: rgb(230, 134, 25);\\n  --spectrum-global-color-orange-600: rgb(242, 148, 35);\\n  --spectrum-global-color-orange-700: rgb(249, 164, 63);\\n  --spectrum-global-color-green-400: rgb(38, 142, 108);\\n  --spectrum-global-color-green-500: rgb(45, 157, 120);\\n  --spectrum-global-color-green-600: rgb(51, 171, 132);\\n  --spectrum-global-color-green-700: rgb(57, 185, 144);\\n  --spectrum-global-color-blue-400: rgb(20, 115, 230);\\n  --spectrum-global-color-blue-500: rgb(38, 128, 235);\\n  --spectrum-global-color-blue-600: rgb(55, 142, 240);\\n  --spectrum-global-color-blue-700: rgb(75, 156, 245);\\n  --spectrum-global-color-gray-50: rgb(8, 8, 8);\\n  --spectrum-global-color-gray-75: rgb(26, 26, 26);\\n  --spectrum-global-color-gray-100: rgb(30, 30, 30);\\n  --spectrum-global-color-gray-200: rgb(44, 44, 44);\\n  --spectrum-global-color-gray-300: rgb(57, 57, 57);\\n  --spectrum-global-color-gray-400: rgb(73, 73, 73);\\n  --spectrum-global-color-gray-500: rgb(92, 92, 92);\\n  --spectrum-global-color-gray-600: rgb(124, 124, 124);\\n  --spectrum-global-color-gray-700: rgb(162, 162, 162);\\n  --spectrum-global-color-gray-800: rgb(200, 200, 200);\\n  --spectrum-global-color-gray-900: rgb(239, 239, 239);\\n  --spectrum-alias-background-color-primary: var(--spectrum-global-color-gray-100);\\n  --spectrum-alias-background-color-secondary: var(--spectrum-global-color-gray-75);\\n  --spectrum-alias-background-color-tertiary: var(--spectrum-global-color-gray-50);\\n  --spectrum-alias-background-color-modal-overlay: rgba(0,0,0,0.6);\\n  --spectrum-alias-dropshadow-color: rgba(0,0,0,0.8);\\n  --spectrum-alias-background-color-hover-overlay: rgba(239,239,239,0.08);\\n  --spectrum-alias-highlight-hover: rgba(239,239,239,0.08);\\n  --spectrum-alias-highlight-down: rgba(239,239,239,0.15);\\n  --spectrum-alias-highlight-selected: rgba(38,128,235,0.2);\\n  --spectrum-alias-highlight-selected-hover: rgba(38,128,235,0.3);\\n  --spectrum-alias-text-highlight-color: rgba(38,128,235,0.3);\\n  --spectrum-alias-background-color-quickactions: rgba(30,30,30,0.9);\\n  --spectrum-alias-border-color-selected: var(--spectrum-global-color-blue-600);\\n  --spectrum-alias-border-color-translucent: rgba(239,239,239,0.1);\\n  --spectrum-alias-radial-reaction-color-default: rgba(200,200,200,0.6);\\n  --spectrum-alias-pasteboard-background-color: var(--spectrum-global-color-gray-50);\\n  --spectrum-alias-appframe-border-color: var(--spectrum-global-color-gray-50);\\n  --spectrum-alias-appframe-separator-color: var(--spectrum-global-color-gray-50);\\n  --spectrum-scrollbar-mac-s-track-background-color: var(--spectrum-global-color-gray-100);\\n  --spectrum-scrollbar-mac-m-track-background-color: var(--spectrum-global-color-gray-100);\\n  --spectrum-scrollbar-mac-l-track-background-color: var(--spectrum-global-color-gray-100);\\n  --spectrum-slider-s-tick-editable-radial-reaction-color: rgba(200,200,200,0.6);\\n  --spectrum-slider-s-ramp-tick-editable-radial-reaction-color: rgba(200,200,200,0.6);\\n  --spectrum-slider-s-range-tick-editable-radial-reaction-color: rgba(200,200,200,0.6);\\n  --spectrum-slider-s-tick-radial-reaction-color: rgba(200,200,200,0.6);\\n  --spectrum-slider-s-ramp-tick-radial-reaction-color: rgba(200,200,200,0.6);\\n  --spectrum-slider-s-range-tick-radial-reaction-color: rgba(200,200,200,0.6);\\n  --spectrum-slider-s-editable-radial-reaction-color: rgba(200,200,200,0.6);\\n  --spectrum-slider-s-ramp-editable-radial-reaction-color: rgba(200,200,200,0.6);\\n  --spectrum-slider-s-range-editable-radial-reaction-color: rgba(200,200,200,0.6);\\n  --spectrum-slider-s-radial-reaction-color: rgba(200,200,200,0.6);\\n  --spectrum-slider-s-ramp-radial-reaction-color: rgba(200,200,200,0.6);\\n  --spectrum-slider-s-range-radial-reaction-color: rgba(200,200,200,0.6);\\n  --spectrum-slider-m-tick-editable-radial-reaction-color: rgba(200,200,200,0.6);\\n  --spectrum-slider-m-ramp-tick-editable-radial-reaction-color: rgba(200,200,200,0.6);\\n  --spectrum-slider-m-range-tick-editable-radial-reaction-color: rgba(200,200,200,0.6);\\n  --spectrum-slider-m-tick-radial-reaction-color: rgba(200,200,200,0.6);\\n  --spectrum-slider-m-ramp-tick-radial-reaction-color: rgba(200,200,200,0.6);\\n  --spectrum-slider-m-range-tick-radial-reaction-color: rgba(200,200,200,0.6);\\n  --spectrum-slider-m-editable-radial-reaction-color: rgba(200,200,200,0.6);\\n  --spectrum-slider-m-ramp-editable-radial-reaction-color: rgba(200,200,200,0.6);\\n  --spectrum-slider-m-range-editable-radial-reaction-color: rgba(200,200,200,0.6);\\n  --spectrum-slider-m-radial-reaction-color: rgba(200,200,200,0.6);\\n  --spectrum-slider-m-ramp-radial-reaction-color: rgba(200,200,200,0.6);\\n  --spectrum-slider-m-range-radial-reaction-color: rgba(200,200,200,0.6);\\n  --spectrum-slider-l-tick-editable-radial-reaction-color: rgba(200,200,200,0.6);\\n  --spectrum-slider-l-ramp-tick-editable-radial-reaction-color: rgba(200,200,200,0.6);\\n  --spectrum-slider-l-range-tick-editable-radial-reaction-color: rgba(200,200,200,0.6);\\n  --spectrum-slider-l-tick-radial-reaction-color: rgba(200,200,200,0.6);\\n  --spectrum-slider-l-ramp-tick-radial-reaction-color: rgba(200,200,200,0.6);\\n  --spectrum-slider-l-range-tick-radial-reaction-color: rgba(200,200,200,0.6);\\n  --spectrum-slider-l-editable-radial-reaction-color: rgba(200,200,200,0.6);\\n  --spectrum-slider-l-ramp-editable-radial-reaction-color: rgba(200,200,200,0.6);\\n  --spectrum-slider-l-range-editable-radial-reaction-color: rgba(200,200,200,0.6);\\n  --spectrum-slider-l-radial-reaction-color: rgba(200,200,200,0.6);\\n  --spectrum-slider-l-ramp-radial-reaction-color: rgba(200,200,200,0.6);\\n  --spectrum-slider-l-range-radial-reaction-color: rgba(200,200,200,0.6);\\n  --spectrum-slider-xl-tick-editable-radial-reaction-color: rgba(200,200,200,0.6);\\n  --spectrum-slider-xl-ramp-tick-editable-radial-reaction-color: rgba(200,200,200,0.6);\\n  --spectrum-slider-xl-range-tick-editable-radial-reaction-color: rgba(200,200,200,0.6);\\n  --spectrum-slider-xl-tick-radial-reaction-color: rgba(200,200,200,0.6);\\n  --spectrum-slider-xl-ramp-tick-radial-reaction-color: rgba(200,200,200,0.6);\\n  --spectrum-slider-xl-range-tick-radial-reaction-color: rgba(200,200,200,0.6);\\n  --spectrum-slider-xl-editable-radial-reaction-color: rgba(200,200,200,0.6);\\n  --spectrum-slider-xl-ramp-editable-radial-reaction-color: rgba(200,200,200,0.6);\\n  --spectrum-slider-xl-range-editable-radial-reaction-color: rgba(200,200,200,0.6);\\n  --spectrum-slider-xl-radial-reaction-color: rgba(200,200,200,0.6);\\n  --spectrum-slider-xl-ramp-radial-reaction-color: rgba(200,200,200,0.6);\\n  --spectrum-slider-xl-range-radial-reaction-color: rgba(200,200,200,0.6);\\n  --spectrum-well-background-color: rgba(200,200,200,0.02);\\n  --spectrum-well-border-color: rgba(239,239,239,0.05);\\n}\\n", ""]);\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTEwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BzcGVjdHJ1bS1jc3MvdmFycy9kaXN0L3NwZWN0cnVtLWRhcmtlc3QuY3NzP2YyODMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIi4uLy4uLy4uL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qc1wiKShmYWxzZSk7XG4vLyBNb2R1bGVcbmV4cG9ydHMucHVzaChbbW9kdWxlLmlkLCBcIi5zcGVjdHJ1bS0tZGFya2VzdCB7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1zdGF0dXM6IFZlcmlmaWVkO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItdmVyc2lvbjogNS4xLjA7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1vcGFjaXR5LTEwMDogMTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLW9wYWNpdHktOTA6IDAuOTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLW9wYWNpdHktODA6IDAuODtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLW9wYWNpdHktNzA6IDAuNztcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLW9wYWNpdHktNjA6IDAuNjtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLW9wYWNpdHktNTU6IDAuNTU7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1vcGFjaXR5LTUwOiAwLjU7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1vcGFjaXR5LTQyOiAwLjQyO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3Itb3BhY2l0eS00MDogMC40O1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3Itb3BhY2l0eS0zMDogMC4zO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3Itb3BhY2l0eS0yNTogMC4yNTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLW9wYWNpdHktMjA6IDAuMjtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLW9wYWNpdHktMTU6IDAuMTU7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1vcGFjaXR5LTEwOiAwLjE7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1vcGFjaXR5LTg6IDAuMDg7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1vcGFjaXR5LTc6IDAuMDc7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1vcGFjaXR5LTY6IDAuMDY7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1vcGFjaXR5LTU6IDAuMDU7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1vcGFjaXR5LTQ6IDAuMDQ7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1vcGFjaXR5LTA6IDAuMDA7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1jZWxlcnktNDAwOiByZ2IoNjEsIDE2NywgNzgpO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItY2VsZXJ5LTUwMDogcmdiKDY4LCAxODEsIDg2KTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLWNlbGVyeS02MDA6IHJnYig3NSwgMTk1LCA5NSk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1jZWxlcnktNzAwOiByZ2IoODEsIDIxMCwgMTAzKTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLWNoYXJ0cmV1c2UtNDAwOiByZ2IoMTI0LCAxOTUsIDYzKTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLWNoYXJ0cmV1c2UtNTAwOiByZ2IoMTMzLCAyMDgsIDY4KTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLWNoYXJ0cmV1c2UtNjAwOiByZ2IoMTQyLCAyMjIsIDczKTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLWNoYXJ0cmV1c2UtNzAwOiByZ2IoMTU1LCAyMzYsIDg0KTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLXllbGxvdy00MDA6IHJnYigyMTAsIDE3OCwgMCk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci15ZWxsb3ctNTAwOiByZ2IoMjIzLCAxOTEsIDApO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3IteWVsbG93LTYwMDogcmdiKDIzNywgMjA0LCAwKTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLXllbGxvdy03MDA6IHJnYigyNTAsIDIxNywgMCk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1tYWdlbnRhLTQwMDogcmdiKDIwMiwgNDEsIDE1MCk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1tYWdlbnRhLTUwMDogcmdiKDIxNiwgNTUsIDE0NCk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1tYWdlbnRhLTYwMDogcmdiKDIyNiwgNzMsIDE1Nyk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1tYWdlbnRhLTcwMDogcmdiKDIzNiwgOTAsIDE3MCk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1mdWNoc2lhLTQwMDogcmdiKDE3NywgNDgsIDE4OSk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1mdWNoc2lhLTUwMDogcmdiKDE5MiwgNTYsIDIwNCk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1mdWNoc2lhLTYwMDogcmdiKDIwNywgNjIsIDIyMCk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1mdWNoc2lhLTcwMDogcmdiKDIxNywgODEsIDIyOSk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1wdXJwbGUtNDAwOiByZ2IoMTM0LCA3NiwgMjA0KTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLXB1cnBsZS01MDA6IHJnYigxNDYsIDg2LCAyMTcpO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItcHVycGxlLTYwMDogcmdiKDE1NywgMTAwLCAyMjUpO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItcHVycGxlLTcwMDogcmdiKDE2OCwgMTE1LCAyMjMpO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItaW5kaWdvLTQwMDogcmdiKDkyLCA5MiwgMjI0KTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLWluZGlnby01MDA6IHJnYigxMDMsIDEwMywgMjM2KTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLWluZGlnby02MDA6IHJnYigxMTcsIDExNywgMjQxKTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLWluZGlnby03MDA6IHJnYigxMzAsIDEzMCwgMjQ2KTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLXNlYWZvYW0tNDAwOiByZ2IoMjIsIDEzNSwgMTQwKTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLXNlYWZvYW0tNTAwOiByZ2IoMjcsIDE0OSwgMTU0KTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLXNlYWZvYW0tNjAwOiByZ2IoMzIsIDE2MywgMTY4KTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLXNlYWZvYW0tNzAwOiByZ2IoMzUsIDE3OCwgMTg0KTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLXJlZC00MDA6IHJnYigyMTUsIDU1LCA2Myk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1yZWQtNTAwOiByZ2IoMjI3LCA3MiwgODApO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItcmVkLTYwMDogcmdiKDIzNiwgOTEsIDk4KTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLXJlZC03MDA6IHJnYigyNDcsIDEwOSwgMTE2KTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLW9yYW5nZS00MDA6IHJnYigyMTgsIDEyMywgMTcpO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3Itb3JhbmdlLTUwMDogcmdiKDIzMCwgMTM0LCAyNSk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1vcmFuZ2UtNjAwOiByZ2IoMjQyLCAxNDgsIDM1KTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLW9yYW5nZS03MDA6IHJnYigyNDksIDE2NCwgNjMpO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItZ3JlZW4tNDAwOiByZ2IoMzgsIDE0MiwgMTA4KTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLWdyZWVuLTUwMDogcmdiKDQ1LCAxNTcsIDEyMCk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1ncmVlbi02MDA6IHJnYig1MSwgMTcxLCAxMzIpO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItZ3JlZW4tNzAwOiByZ2IoNTcsIDE4NSwgMTQ0KTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLWJsdWUtNDAwOiByZ2IoMjAsIDExNSwgMjMwKTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLWJsdWUtNTAwOiByZ2IoMzgsIDEyOCwgMjM1KTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLWJsdWUtNjAwOiByZ2IoNTUsIDE0MiwgMjQwKTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLWJsdWUtNzAwOiByZ2IoNzUsIDE1NiwgMjQ1KTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLWdyYXktNTA6IHJnYig4LCA4LCA4KTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLWdyYXktNzU6IHJnYigyNiwgMjYsIDI2KTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLWdyYXktMTAwOiByZ2IoMzAsIDMwLCAzMCk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1ncmF5LTIwMDogcmdiKDQ0LCA0NCwgNDQpO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItZ3JheS0zMDA6IHJnYig1NywgNTcsIDU3KTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLWdyYXktNDAwOiByZ2IoNzMsIDczLCA3Myk7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1ncmF5LTUwMDogcmdiKDkyLCA5MiwgOTIpO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItZ3JheS02MDA6IHJnYigxMjQsIDEyNCwgMTI0KTtcXG4gIC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLWdyYXktNzAwOiByZ2IoMTYyLCAxNjIsIDE2Mik7XFxuICAtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1ncmF5LTgwMDogcmdiKDIwMCwgMjAwLCAyMDApO1xcbiAgLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItZ3JheS05MDA6IHJnYigyMzksIDIzOSwgMjM5KTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtYmFja2dyb3VuZC1jb2xvci1wcmltYXJ5OiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItZ3JheS0xMDApO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1iYWNrZ3JvdW5kLWNvbG9yLXNlY29uZGFyeTogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLWdyYXktNzUpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1iYWNrZ3JvdW5kLWNvbG9yLXRlcnRpYXJ5OiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItZ3JheS01MCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWJhY2tncm91bmQtY29sb3ItbW9kYWwtb3ZlcmxheTogcmdiYSgwLDAsMCwwLjYpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1kcm9wc2hhZG93LWNvbG9yOiByZ2JhKDAsMCwwLDAuOCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWJhY2tncm91bmQtY29sb3ItaG92ZXItb3ZlcmxheTogcmdiYSgyMzksMjM5LDIzOSwwLjA4KTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtaGlnaGxpZ2h0LWhvdmVyOiByZ2JhKDIzOSwyMzksMjM5LDAuMDgpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1oaWdobGlnaHQtZG93bjogcmdiYSgyMzksMjM5LDIzOSwwLjE1KTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtaGlnaGxpZ2h0LXNlbGVjdGVkOiByZ2JhKDM4LDEyOCwyMzUsMC4yKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtaGlnaGxpZ2h0LXNlbGVjdGVkLWhvdmVyOiByZ2JhKDM4LDEyOCwyMzUsMC4zKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtdGV4dC1oaWdobGlnaHQtY29sb3I6IHJnYmEoMzgsMTI4LDIzNSwwLjMpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1iYWNrZ3JvdW5kLWNvbG9yLXF1aWNrYWN0aW9uczogcmdiYSgzMCwzMCwzMCwwLjkpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1ib3JkZXItY29sb3Itc2VsZWN0ZWQ6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1ibHVlLTYwMCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWJvcmRlci1jb2xvci10cmFuc2x1Y2VudDogcmdiYSgyMzksMjM5LDIzOSwwLjEpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1yYWRpYWwtcmVhY3Rpb24tY29sb3ItZGVmYXVsdDogcmdiYSgyMDAsMjAwLDIwMCwwLjYpO1xcbiAgLS1zcGVjdHJ1bS1hbGlhcy1wYXN0ZWJvYXJkLWJhY2tncm91bmQtY29sb3I6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1ncmF5LTUwKTtcXG4gIC0tc3BlY3RydW0tYWxpYXMtYXBwZnJhbWUtYm9yZGVyLWNvbG9yOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItZ3JheS01MCk7XFxuICAtLXNwZWN0cnVtLWFsaWFzLWFwcGZyYW1lLXNlcGFyYXRvci1jb2xvcjogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLWdyYXktNTApO1xcbiAgLS1zcGVjdHJ1bS1zY3JvbGxiYXItbWFjLXMtdHJhY2stYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLWdyYXktMTAwKTtcXG4gIC0tc3BlY3RydW0tc2Nyb2xsYmFyLW1hYy1tLXRyYWNrLWJhY2tncm91bmQtY29sb3I6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1ncmF5LTEwMCk7XFxuICAtLXNwZWN0cnVtLXNjcm9sbGJhci1tYWMtbC10cmFjay1iYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItZ3JheS0xMDApO1xcbiAgLS1zcGVjdHJ1bS1zbGlkZXItcy10aWNrLWVkaXRhYmxlLXJhZGlhbC1yZWFjdGlvbi1jb2xvcjogcmdiYSgyMDAsMjAwLDIwMCwwLjYpO1xcbiAgLS1zcGVjdHJ1bS1zbGlkZXItcy1yYW1wLXRpY2stZWRpdGFibGUtcmFkaWFsLXJlYWN0aW9uLWNvbG9yOiByZ2JhKDIwMCwyMDAsMjAwLDAuNik7XFxuICAtLXNwZWN0cnVtLXNsaWRlci1zLXJhbmdlLXRpY2stZWRpdGFibGUtcmFkaWFsLXJlYWN0aW9uLWNvbG9yOiByZ2JhKDIwMCwyMDAsMjAwLDAuNik7XFxuICAtLXNwZWN0cnVtLXNsaWRlci1zLXRpY2stcmFkaWFsLXJlYWN0aW9uLWNvbG9yOiByZ2JhKDIwMCwyMDAsMjAwLDAuNik7XFxuICAtLXNwZWN0cnVtLXNsaWRlci1zLXJhbXAtdGljay1yYWRpYWwtcmVhY3Rpb24tY29sb3I6IHJnYmEoMjAwLDIwMCwyMDAsMC42KTtcXG4gIC0tc3BlY3RydW0tc2xpZGVyLXMtcmFuZ2UtdGljay1yYWRpYWwtcmVhY3Rpb24tY29sb3I6IHJnYmEoMjAwLDIwMCwyMDAsMC42KTtcXG4gIC0tc3BlY3RydW0tc2xpZGVyLXMtZWRpdGFibGUtcmFkaWFsLXJlYWN0aW9uLWNvbG9yOiByZ2JhKDIwMCwyMDAsMjAwLDAuNik7XFxuICAtLXNwZWN0cnVtLXNsaWRlci1zLXJhbXAtZWRpdGFibGUtcmFkaWFsLXJlYWN0aW9uLWNvbG9yOiByZ2JhKDIwMCwyMDAsMjAwLDAuNik7XFxuICAtLXNwZWN0cnVtLXNsaWRlci1zLXJhbmdlLWVkaXRhYmxlLXJhZGlhbC1yZWFjdGlvbi1jb2xvcjogcmdiYSgyMDAsMjAwLDIwMCwwLjYpO1xcbiAgLS1zcGVjdHJ1bS1zbGlkZXItcy1yYWRpYWwtcmVhY3Rpb24tY29sb3I6IHJnYmEoMjAwLDIwMCwyMDAsMC42KTtcXG4gIC0tc3BlY3RydW0tc2xpZGVyLXMtcmFtcC1yYWRpYWwtcmVhY3Rpb24tY29sb3I6IHJnYmEoMjAwLDIwMCwyMDAsMC42KTtcXG4gIC0tc3BlY3RydW0tc2xpZGVyLXMtcmFuZ2UtcmFkaWFsLXJlYWN0aW9uLWNvbG9yOiByZ2JhKDIwMCwyMDAsMjAwLDAuNik7XFxuICAtLXNwZWN0cnVtLXNsaWRlci1tLXRpY2stZWRpdGFibGUtcmFkaWFsLXJlYWN0aW9uLWNvbG9yOiByZ2JhKDIwMCwyMDAsMjAwLDAuNik7XFxuICAtLXNwZWN0cnVtLXNsaWRlci1tLXJhbXAtdGljay1lZGl0YWJsZS1yYWRpYWwtcmVhY3Rpb24tY29sb3I6IHJnYmEoMjAwLDIwMCwyMDAsMC42KTtcXG4gIC0tc3BlY3RydW0tc2xpZGVyLW0tcmFuZ2UtdGljay1lZGl0YWJsZS1yYWRpYWwtcmVhY3Rpb24tY29sb3I6IHJnYmEoMjAwLDIwMCwyMDAsMC42KTtcXG4gIC0tc3BlY3RydW0tc2xpZGVyLW0tdGljay1yYWRpYWwtcmVhY3Rpb24tY29sb3I6IHJnYmEoMjAwLDIwMCwyMDAsMC42KTtcXG4gIC0tc3BlY3RydW0tc2xpZGVyLW0tcmFtcC10aWNrLXJhZGlhbC1yZWFjdGlvbi1jb2xvcjogcmdiYSgyMDAsMjAwLDIwMCwwLjYpO1xcbiAgLS1zcGVjdHJ1bS1zbGlkZXItbS1yYW5nZS10aWNrLXJhZGlhbC1yZWFjdGlvbi1jb2xvcjogcmdiYSgyMDAsMjAwLDIwMCwwLjYpO1xcbiAgLS1zcGVjdHJ1bS1zbGlkZXItbS1lZGl0YWJsZS1yYWRpYWwtcmVhY3Rpb24tY29sb3I6IHJnYmEoMjAwLDIwMCwyMDAsMC42KTtcXG4gIC0tc3BlY3RydW0tc2xpZGVyLW0tcmFtcC1lZGl0YWJsZS1yYWRpYWwtcmVhY3Rpb24tY29sb3I6IHJnYmEoMjAwLDIwMCwyMDAsMC42KTtcXG4gIC0tc3BlY3RydW0tc2xpZGVyLW0tcmFuZ2UtZWRpdGFibGUtcmFkaWFsLXJlYWN0aW9uLWNvbG9yOiByZ2JhKDIwMCwyMDAsMjAwLDAuNik7XFxuICAtLXNwZWN0cnVtLXNsaWRlci1tLXJhZGlhbC1yZWFjdGlvbi1jb2xvcjogcmdiYSgyMDAsMjAwLDIwMCwwLjYpO1xcbiAgLS1zcGVjdHJ1bS1zbGlkZXItbS1yYW1wLXJhZGlhbC1yZWFjdGlvbi1jb2xvcjogcmdiYSgyMDAsMjAwLDIwMCwwLjYpO1xcbiAgLS1zcGVjdHJ1bS1zbGlkZXItbS1yYW5nZS1yYWRpYWwtcmVhY3Rpb24tY29sb3I6IHJnYmEoMjAwLDIwMCwyMDAsMC42KTtcXG4gIC0tc3BlY3RydW0tc2xpZGVyLWwtdGljay1lZGl0YWJsZS1yYWRpYWwtcmVhY3Rpb24tY29sb3I6IHJnYmEoMjAwLDIwMCwyMDAsMC42KTtcXG4gIC0tc3BlY3RydW0tc2xpZGVyLWwtcmFtcC10aWNrLWVkaXRhYmxlLXJhZGlhbC1yZWFjdGlvbi1jb2xvcjogcmdiYSgyMDAsMjAwLDIwMCwwLjYpO1xcbiAgLS1zcGVjdHJ1bS1zbGlkZXItbC1yYW5nZS10aWNrLWVkaXRhYmxlLXJhZGlhbC1yZWFjdGlvbi1jb2xvcjogcmdiYSgyMDAsMjAwLDIwMCwwLjYpO1xcbiAgLS1zcGVjdHJ1bS1zbGlkZXItbC10aWNrLXJhZGlhbC1yZWFjdGlvbi1jb2xvcjogcmdiYSgyMDAsMjAwLDIwMCwwLjYpO1xcbiAgLS1zcGVjdHJ1bS1zbGlkZXItbC1yYW1wLXRpY2stcmFkaWFsLXJlYWN0aW9uLWNvbG9yOiByZ2JhKDIwMCwyMDAsMjAwLDAuNik7XFxuICAtLXNwZWN0cnVtLXNsaWRlci1sLXJhbmdlLXRpY2stcmFkaWFsLXJlYWN0aW9uLWNvbG9yOiByZ2JhKDIwMCwyMDAsMjAwLDAuNik7XFxuICAtLXNwZWN0cnVtLXNsaWRlci1sLWVkaXRhYmxlLXJhZGlhbC1yZWFjdGlvbi1jb2xvcjogcmdiYSgyMDAsMjAwLDIwMCwwLjYpO1xcbiAgLS1zcGVjdHJ1bS1zbGlkZXItbC1yYW1wLWVkaXRhYmxlLXJhZGlhbC1yZWFjdGlvbi1jb2xvcjogcmdiYSgyMDAsMjAwLDIwMCwwLjYpO1xcbiAgLS1zcGVjdHJ1bS1zbGlkZXItbC1yYW5nZS1lZGl0YWJsZS1yYWRpYWwtcmVhY3Rpb24tY29sb3I6IHJnYmEoMjAwLDIwMCwyMDAsMC42KTtcXG4gIC0tc3BlY3RydW0tc2xpZGVyLWwtcmFkaWFsLXJlYWN0aW9uLWNvbG9yOiByZ2JhKDIwMCwyMDAsMjAwLDAuNik7XFxuICAtLXNwZWN0cnVtLXNsaWRlci1sLXJhbXAtcmFkaWFsLXJlYWN0aW9uLWNvbG9yOiByZ2JhKDIwMCwyMDAsMjAwLDAuNik7XFxuICAtLXNwZWN0cnVtLXNsaWRlci1sLXJhbmdlLXJhZGlhbC1yZWFjdGlvbi1jb2xvcjogcmdiYSgyMDAsMjAwLDIwMCwwLjYpO1xcbiAgLS1zcGVjdHJ1bS1zbGlkZXIteGwtdGljay1lZGl0YWJsZS1yYWRpYWwtcmVhY3Rpb24tY29sb3I6IHJnYmEoMjAwLDIwMCwyMDAsMC42KTtcXG4gIC0tc3BlY3RydW0tc2xpZGVyLXhsLXJhbXAtdGljay1lZGl0YWJsZS1yYWRpYWwtcmVhY3Rpb24tY29sb3I6IHJnYmEoMjAwLDIwMCwyMDAsMC42KTtcXG4gIC0tc3BlY3RydW0tc2xpZGVyLXhsLXJhbmdlLXRpY2stZWRpdGFibGUtcmFkaWFsLXJlYWN0aW9uLWNvbG9yOiByZ2JhKDIwMCwyMDAsMjAwLDAuNik7XFxuICAtLXNwZWN0cnVtLXNsaWRlci14bC10aWNrLXJhZGlhbC1yZWFjdGlvbi1jb2xvcjogcmdiYSgyMDAsMjAwLDIwMCwwLjYpO1xcbiAgLS1zcGVjdHJ1bS1zbGlkZXIteGwtcmFtcC10aWNrLXJhZGlhbC1yZWFjdGlvbi1jb2xvcjogcmdiYSgyMDAsMjAwLDIwMCwwLjYpO1xcbiAgLS1zcGVjdHJ1bS1zbGlkZXIteGwtcmFuZ2UtdGljay1yYWRpYWwtcmVhY3Rpb24tY29sb3I6IHJnYmEoMjAwLDIwMCwyMDAsMC42KTtcXG4gIC0tc3BlY3RydW0tc2xpZGVyLXhsLWVkaXRhYmxlLXJhZGlhbC1yZWFjdGlvbi1jb2xvcjogcmdiYSgyMDAsMjAwLDIwMCwwLjYpO1xcbiAgLS1zcGVjdHJ1bS1zbGlkZXIteGwtcmFtcC1lZGl0YWJsZS1yYWRpYWwtcmVhY3Rpb24tY29sb3I6IHJnYmEoMjAwLDIwMCwyMDAsMC42KTtcXG4gIC0tc3BlY3RydW0tc2xpZGVyLXhsLXJhbmdlLWVkaXRhYmxlLXJhZGlhbC1yZWFjdGlvbi1jb2xvcjogcmdiYSgyMDAsMjAwLDIwMCwwLjYpO1xcbiAgLS1zcGVjdHJ1bS1zbGlkZXIteGwtcmFkaWFsLXJlYWN0aW9uLWNvbG9yOiByZ2JhKDIwMCwyMDAsMjAwLDAuNik7XFxuICAtLXNwZWN0cnVtLXNsaWRlci14bC1yYW1wLXJhZGlhbC1yZWFjdGlvbi1jb2xvcjogcmdiYSgyMDAsMjAwLDIwMCwwLjYpO1xcbiAgLS1zcGVjdHJ1bS1zbGlkZXIteGwtcmFuZ2UtcmFkaWFsLXJlYWN0aW9uLWNvbG9yOiByZ2JhKDIwMCwyMDAsMjAwLDAuNik7XFxuICAtLXNwZWN0cnVtLXdlbGwtYmFja2dyb3VuZC1jb2xvcjogcmdiYSgyMDAsMjAwLDIwMCwwLjAyKTtcXG4gIC0tc3BlY3RydW0td2VsbC1ib3JkZXItY29sb3I6IHJnYmEoMjM5LDIzOSwyMzksMC4wNSk7XFxufVxcblwiLCBcIlwiXSk7XG5cbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///110\n')},function(module,exports,__webpack_require__){eval("var api = __webpack_require__(5);\n            var content = __webpack_require__(112);\n\n            content = content.__esModule ? content.default : content;\n\n            if (typeof content === 'string') {\n              content = [[module.i, content, '']];\n            }\n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = api(content, options);\n\n\n\nmodule.exports = content.locals || {};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTExLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vc3JjL3N0eWxlcy5jc3M/NDRiMiJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgYXBpID0gcmVxdWlyZShcIiEuLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanNcIik7XG4gICAgICAgICAgICB2YXIgY29udGVudCA9IHJlcXVpcmUoXCIhIS4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vc3R5bGVzLmNzc1wiKTtcblxuICAgICAgICAgICAgY29udGVudCA9IGNvbnRlbnQuX19lc01vZHVsZSA/IGNvbnRlbnQuZGVmYXVsdCA6IGNvbnRlbnQ7XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgY29udGVudCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgY29udGVudCA9IFtbbW9kdWxlLmlkLCBjb250ZW50LCAnJ11dO1xuICAgICAgICAgICAgfVxuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLmluc2VydCA9IFwiaGVhZFwiO1xub3B0aW9ucy5zaW5nbGV0b24gPSBmYWxzZTtcblxudmFyIHVwZGF0ZSA9IGFwaShjb250ZW50LCBvcHRpb25zKTtcblxuXG5cbm1vZHVsZS5leHBvcnRzID0gY29udGVudC5sb2NhbHMgfHwge307Il0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///111\n")},function(module,exports,__webpack_require__){eval('exports = module.exports = __webpack_require__(6)(false);\n// Module\nexports.push([module.i, "#root {\\n  align-items: center;\\n  display: flex;\\n  flex: 1 0 auto;\\n  flex-direction: column;\\n  height: 100%;\\n  justify-content: center;\\n  left: 0;\\n  padding: 0;\\n  position: fixed;\\n  right: 0;\\n  top: 0;\\n  width: 100%;\\n  z-index: 1;\\n  font-family: \\"adobe-clean\\", -apple-system, BlinkMacSystemFont,\\n    \\"Helvetica Neue\\", sans-serif;\\n}\\n", ""]);\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTEyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vc3JjL3N0eWxlcy5jc3M/ZTlhYSJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qc1wiKShmYWxzZSk7XG4vLyBNb2R1bGVcbmV4cG9ydHMucHVzaChbbW9kdWxlLmlkLCBcIiNyb290IHtcXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxuICBkaXNwbGF5OiBmbGV4O1xcbiAgZmxleDogMSAwIGF1dG87XFxuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xcbiAgaGVpZ2h0OiAxMDAlO1xcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XFxuICBsZWZ0OiAwO1xcbiAgcGFkZGluZzogMDtcXG4gIHBvc2l0aW9uOiBmaXhlZDtcXG4gIHJpZ2h0OiAwO1xcbiAgdG9wOiAwO1xcbiAgd2lkdGg6IDEwMCU7XFxuICB6LWluZGV4OiAxO1xcbiAgZm9udC1mYW1pbHk6IFxcXCJhZG9iZS1jbGVhblxcXCIsIC1hcHBsZS1zeXN0ZW0sIEJsaW5rTWFjU3lzdGVtRm9udCxcXG4gICAgXFxcIkhlbHZldGljYSBOZXVlXFxcIiwgc2Fucy1zZXJpZjtcXG59XFxuXCIsIFwiXCJdKTtcblxuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///112\n')},function(module,exports,__webpack_require__){eval("var api = __webpack_require__(5);\n            var content = __webpack_require__(114);\n\n            content = content.__esModule ? content.default : content;\n\n            if (typeof content === 'string') {\n              content = [[module.i, content, '']];\n            }\n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = api(content, options);\n\n\n\nmodule.exports = content.locals || {};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTEzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vc3JjL2NvbXBvbmVudHMvY3NzL1NoYXJlUGFuZWwuY3NzPzQwYmYiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGFwaSA9IHJlcXVpcmUoXCIhLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzXCIpO1xuICAgICAgICAgICAgdmFyIGNvbnRlbnQgPSByZXF1aXJlKFwiISEuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL1NoYXJlUGFuZWwuY3NzXCIpO1xuXG4gICAgICAgICAgICBjb250ZW50ID0gY29udGVudC5fX2VzTW9kdWxlID8gY29udGVudC5kZWZhdWx0IDogY29udGVudDtcblxuICAgICAgICAgICAgaWYgKHR5cGVvZiBjb250ZW50ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICBjb250ZW50ID0gW1ttb2R1bGUuaWQsIGNvbnRlbnQsICcnXV07XG4gICAgICAgICAgICB9XG5cbnZhciBvcHRpb25zID0ge307XG5cbm9wdGlvbnMuaW5zZXJ0ID0gXCJoZWFkXCI7XG5vcHRpb25zLnNpbmdsZXRvbiA9IGZhbHNlO1xuXG52YXIgdXBkYXRlID0gYXBpKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5cblxubW9kdWxlLmV4cG9ydHMgPSBjb250ZW50LmxvY2FscyB8fCB7fTsiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///113\n")},function(module,exports,__webpack_require__){eval('exports = module.exports = __webpack_require__(6)(false);\n// Module\nexports.push([module.i, "#ps-dialog {\\n  z-index: 1;\\n  position: absolute;\\n  padding: 8px 0px 8px 0px;\\n  background-color: var(--uxp-host-background-color);\\n  border-radius: 4px;\\n}\\n\\n/* \\n On Mac we get a default border when the dialog opens and in focus.\\n On Windows we don\'t get any such behavior, so we add a border manually.\\n */\\n.dialog-border {\\n  border-color: var(--uxp-host-border-color);\\n  border-style: solid;\\n  border-width: 1px;\\n}\\n\\n.menu-item {\\n  width: 290px;\\n  height: 48px;\\n  display: flex;\\n  align-items: center;\\n}\\n\\n.icon-container {\\n  margin: 15px 12px 15px 18px;\\n  width: 18px;\\n  height: 18px;\\n}\\n\\n.text-container {\\n  display: flex;\\n  flex-direction: column;\\n  justify-content: center;\\n}\\n\\n.text-title {\\n  color: var(--spectrum-global-color-gray-900);\\n  font-size: 14px;\\n  white-space: nowrap;\\n  overflow: hidden !important;\\n  text-overflow: ellipsis;\\n}\\n\\n.text-detail {\\n  font-style: italic;\\n  color: var(--spectrum-global-color-gray-700);\\n  font-size: 12px;\\n  white-space: nowrap;\\n  overflow: hidden !important;\\n  text-overflow: ellipsis;\\n}\\n\\n.text-title-disabled {\\n  color: var(--spectrum-global-color-gray-600);\\n  font-size: 14px;\\n  white-space: nowrap;\\n  overflow: hidden !important;\\n  text-overflow: ellipsis;\\n}\\n\\n.text-detail-disabled {\\n  font-style: italic;\\n  color: var(--spectrum-global-color-gray-600);\\n  font-size: 12px;\\n  white-space: nowrap;\\n  overflow: hidden !important;\\n  text-overflow: ellipsis;\\n}\\n\\nsp-menu-item {\\n  padding: 0px;\\n}\\n\\nimg {\\n  max-width: 100%;\\n  max-height: 100%;\\n}\\n\\n.next-container {\\n  height: 18px;\\n  width: 18px;\\n  margin-right: 15px;\\n  margin-left: auto;\\n  padding: 2px;\\n}\\n\\n.icon-style {\\n  fill: var(--spectrum-global-color-gray-900);\\n}\\n\\n.icon-style-disabled {\\n  fill: var(--spectrum-global-color-gray-600);\\n}\\n\\n.error-style{\\n  color: #ea3829;\\n}\\n\\n", ""]);\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTE0LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vc3JjL2NvbXBvbmVudHMvY3NzL1NoYXJlUGFuZWwuY3NzPzc2YzciXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIikoZmFsc2UpO1xuLy8gTW9kdWxlXG5leHBvcnRzLnB1c2goW21vZHVsZS5pZCwgXCIjcHMtZGlhbG9nIHtcXG4gIHotaW5kZXg6IDE7XFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICBwYWRkaW5nOiA4cHggMHB4IDhweCAwcHg7XFxuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS11eHAtaG9zdC1iYWNrZ3JvdW5kLWNvbG9yKTtcXG4gIGJvcmRlci1yYWRpdXM6IDRweDtcXG59XFxuXFxuLyogXFxuIE9uIE1hYyB3ZSBnZXQgYSBkZWZhdWx0IGJvcmRlciB3aGVuIHRoZSBkaWFsb2cgb3BlbnMgYW5kIGluIGZvY3VzLlxcbiBPbiBXaW5kb3dzIHdlIGRvbid0IGdldCBhbnkgc3VjaCBiZWhhdmlvciwgc28gd2UgYWRkIGEgYm9yZGVyIG1hbnVhbGx5LlxcbiAqL1xcbi5kaWFsb2ctYm9yZGVyIHtcXG4gIGJvcmRlci1jb2xvcjogdmFyKC0tdXhwLWhvc3QtYm9yZGVyLWNvbG9yKTtcXG4gIGJvcmRlci1zdHlsZTogc29saWQ7XFxuICBib3JkZXItd2lkdGg6IDFweDtcXG59XFxuXFxuLm1lbnUtaXRlbSB7XFxuICB3aWR0aDogMjkwcHg7XFxuICBoZWlnaHQ6IDQ4cHg7XFxuICBkaXNwbGF5OiBmbGV4O1xcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXG59XFxuXFxuLmljb24tY29udGFpbmVyIHtcXG4gIG1hcmdpbjogMTVweCAxMnB4IDE1cHggMThweDtcXG4gIHdpZHRoOiAxOHB4O1xcbiAgaGVpZ2h0OiAxOHB4O1xcbn1cXG5cXG4udGV4dC1jb250YWluZXIge1xcbiAgZGlzcGxheTogZmxleDtcXG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XFxuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcXG59XFxuXFxuLnRleHQtdGl0bGUge1xcbiAgY29sb3I6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1ncmF5LTkwMCk7XFxuICBmb250LXNpemU6IDE0cHg7XFxuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xcbiAgb3ZlcmZsb3c6IGhpZGRlbiAhaW1wb3J0YW50O1xcbiAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XFxufVxcblxcbi50ZXh0LWRldGFpbCB7XFxuICBmb250LXN0eWxlOiBpdGFsaWM7XFxuICBjb2xvcjogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLWdyYXktNzAwKTtcXG4gIGZvbnQtc2l6ZTogMTJweDtcXG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XFxuICBvdmVyZmxvdzogaGlkZGVuICFpbXBvcnRhbnQ7XFxuICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcXG59XFxuXFxuLnRleHQtdGl0bGUtZGlzYWJsZWQge1xcbiAgY29sb3I6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1ncmF5LTYwMCk7XFxuICBmb250LXNpemU6IDE0cHg7XFxuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xcbiAgb3ZlcmZsb3c6IGhpZGRlbiAhaW1wb3J0YW50O1xcbiAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XFxufVxcblxcbi50ZXh0LWRldGFpbC1kaXNhYmxlZCB7XFxuICBmb250LXN0eWxlOiBpdGFsaWM7XFxuICBjb2xvcjogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLWdyYXktNjAwKTtcXG4gIGZvbnQtc2l6ZTogMTJweDtcXG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XFxuICBvdmVyZmxvdzogaGlkZGVuICFpbXBvcnRhbnQ7XFxuICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcXG59XFxuXFxuc3AtbWVudS1pdGVtIHtcXG4gIHBhZGRpbmc6IDBweDtcXG59XFxuXFxuaW1nIHtcXG4gIG1heC13aWR0aDogMTAwJTtcXG4gIG1heC1oZWlnaHQ6IDEwMCU7XFxufVxcblxcbi5uZXh0LWNvbnRhaW5lciB7XFxuICBoZWlnaHQ6IDE4cHg7XFxuICB3aWR0aDogMThweDtcXG4gIG1hcmdpbi1yaWdodDogMTVweDtcXG4gIG1hcmdpbi1sZWZ0OiBhdXRvO1xcbiAgcGFkZGluZzogMnB4O1xcbn1cXG5cXG4uaWNvbi1zdHlsZSB7XFxuICBmaWxsOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItZ3JheS05MDApO1xcbn1cXG5cXG4uaWNvbi1zdHlsZS1kaXNhYmxlZCB7XFxuICBmaWxsOiB2YXIoLS1zcGVjdHJ1bS1nbG9iYWwtY29sb3ItZ3JheS02MDApO1xcbn1cXG5cXG4uZXJyb3Itc3R5bGV7XFxuICBjb2xvcjogI2VhMzgyOTtcXG59XFxuXFxuXCIsIFwiXCJdKTtcblxuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///114\n')},function(module,exports){eval('module.exports = function(module) {\n\tif (!module.webpackPolyfill) {\n\t\tmodule.deprecate = function() {};\n\t\tmodule.paths = [];\n\t\t// module.parent = undefined by default\n\t\tif (!module.children) module.children = [];\n\t\tObject.defineProperty(module, "loaded", {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn module.l;\n\t\t\t}\n\t\t});\n\t\tObject.defineProperty(module, "id", {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn module.i;\n\t\t\t}\n\t\t});\n\t\tmodule.webpackPolyfill = 1;\n\t}\n\treturn module;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTE1LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLyh3ZWJwYWNrKS9idWlsZGluL21vZHVsZS5qcz9jZWQyIl0sInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24obW9kdWxlKSB7XG5cdGlmICghbW9kdWxlLndlYnBhY2tQb2x5ZmlsbCkge1xuXHRcdG1vZHVsZS5kZXByZWNhdGUgPSBmdW5jdGlvbigpIHt9O1xuXHRcdG1vZHVsZS5wYXRocyA9IFtdO1xuXHRcdC8vIG1vZHVsZS5wYXJlbnQgPSB1bmRlZmluZWQgYnkgZGVmYXVsdFxuXHRcdGlmICghbW9kdWxlLmNoaWxkcmVuKSBtb2R1bGUuY2hpbGRyZW4gPSBbXTtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobW9kdWxlLCBcImxvYWRlZFwiLCB7XG5cdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRcdFx0Z2V0OiBmdW5jdGlvbigpIHtcblx0XHRcdFx0cmV0dXJuIG1vZHVsZS5sO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShtb2R1bGUsIFwiaWRcIiwge1xuXHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcblx0XHRcdGdldDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJldHVybiBtb2R1bGUuaTtcblx0XHRcdH1cblx0XHR9KTtcblx0XHRtb2R1bGUud2VicGFja1BvbHlmaWxsID0gMTtcblx0fVxuXHRyZXR1cm4gbW9kdWxlO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///115\n')},function(module,exports,__webpack_require__){eval('var map = {\n\t"./cs/strings.json": 117,\n\t"./da/strings.json": 118,\n\t"./de/strings.json": 119,\n\t"./en/strings.json": 120,\n\t"./es/strings.json": 121,\n\t"./fi/strings.json": 122,\n\t"./fr/strings.json": 123,\n\t"./hu/strings.json": 124,\n\t"./id/strings.json": 125,\n\t"./it/strings.json": 126,\n\t"./ja/strings.json": 127,\n\t"./ko/strings.json": 128,\n\t"./nb/strings.json": 129,\n\t"./nl/strings.json": 130,\n\t"./pl/strings.json": 131,\n\t"./pt/strings.json": 132,\n\t"./ru/strings.json": 133,\n\t"./sv/strings.json": 134,\n\t"./th/strings.json": 135,\n\t"./tr/strings.json": 136,\n\t"./uk/strings.json": 137,\n\t"./vi/strings.json": 138,\n\t"./zh-CN/strings.json": 139,\n\t"./zh-TW/strings.json": 140\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error("Cannot find module \'" + req + "\'");\n\t\te.code = \'MODULE_NOT_FOUND\';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 116;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTE2LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vc3JjL2Fzc2V0cy9ubHMgc3luYyBeXFwuXFwvLipcXC5qc29uJD80NjgyIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBtYXAgPSB7XG5cdFwiLi9jcy9zdHJpbmdzLmpzb25cIjogMTE3LFxuXHRcIi4vZGEvc3RyaW5ncy5qc29uXCI6IDExOCxcblx0XCIuL2RlL3N0cmluZ3MuanNvblwiOiAxMTksXG5cdFwiLi9lbi9zdHJpbmdzLmpzb25cIjogMTIwLFxuXHRcIi4vZXMvc3RyaW5ncy5qc29uXCI6IDEyMSxcblx0XCIuL2ZpL3N0cmluZ3MuanNvblwiOiAxMjIsXG5cdFwiLi9mci9zdHJpbmdzLmpzb25cIjogMTIzLFxuXHRcIi4vaHUvc3RyaW5ncy5qc29uXCI6IDEyNCxcblx0XCIuL2lkL3N0cmluZ3MuanNvblwiOiAxMjUsXG5cdFwiLi9pdC9zdHJpbmdzLmpzb25cIjogMTI2LFxuXHRcIi4vamEvc3RyaW5ncy5qc29uXCI6IDEyNyxcblx0XCIuL2tvL3N0cmluZ3MuanNvblwiOiAxMjgsXG5cdFwiLi9uYi9zdHJpbmdzLmpzb25cIjogMTI5LFxuXHRcIi4vbmwvc3RyaW5ncy5qc29uXCI6IDEzMCxcblx0XCIuL3BsL3N0cmluZ3MuanNvblwiOiAxMzEsXG5cdFwiLi9wdC9zdHJpbmdzLmpzb25cIjogMTMyLFxuXHRcIi4vcnUvc3RyaW5ncy5qc29uXCI6IDEzMyxcblx0XCIuL3N2L3N0cmluZ3MuanNvblwiOiAxMzQsXG5cdFwiLi90aC9zdHJpbmdzLmpzb25cIjogMTM1LFxuXHRcIi4vdHIvc3RyaW5ncy5qc29uXCI6IDEzNixcblx0XCIuL3VrL3N0cmluZ3MuanNvblwiOiAxMzcsXG5cdFwiLi92aS9zdHJpbmdzLmpzb25cIjogMTM4LFxuXHRcIi4vemgtQ04vc3RyaW5ncy5qc29uXCI6IDEzOSxcblx0XCIuL3poLVRXL3N0cmluZ3MuanNvblwiOiAxNDBcbn07XG5cblxuZnVuY3Rpb24gd2VicGFja0NvbnRleHQocmVxKSB7XG5cdHZhciBpZCA9IHdlYnBhY2tDb250ZXh0UmVzb2x2ZShyZXEpO1xuXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhpZCk7XG59XG5mdW5jdGlvbiB3ZWJwYWNrQ29udGV4dFJlc29sdmUocmVxKSB7XG5cdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8obWFwLCByZXEpKSB7XG5cdFx0dmFyIGUgPSBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiICsgcmVxICsgXCInXCIpO1xuXHRcdGUuY29kZSA9ICdNT0RVTEVfTk9UX0ZPVU5EJztcblx0XHR0aHJvdyBlO1xuXHR9XG5cdHJldHVybiBtYXBbcmVxXTtcbn1cbndlYnBhY2tDb250ZXh0LmtleXMgPSBmdW5jdGlvbiB3ZWJwYWNrQ29udGV4dEtleXMoKSB7XG5cdHJldHVybiBPYmplY3Qua2V5cyhtYXApO1xufTtcbndlYnBhY2tDb250ZXh0LnJlc29sdmUgPSB3ZWJwYWNrQ29udGV4dFJlc29sdmU7XG5tb2R1bGUuZXhwb3J0cyA9IHdlYnBhY2tDb250ZXh0O1xud2VicGFja0NvbnRleHQuaWQgPSAxMTY7Il0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///116\n')},function(module){eval('module.exports = JSON.parse("{\\"SLACK_TITLE\\":\\"Sdílet přes Slack\\",\\"SLACK_DESCRIPTION\\":\\"Sdílejte svou práci se službou Slack\\",\\"SLACK_PANEL_HEADING\\":\\"Sdílet přes Slack\\",\\"CANCEL\\":\\"Zrušit\\",\\"FORMAT_LABEL\\":\\"Formát ke sdílení\\",\\"FORMAT_PLACEHOLDER\\":\\"Výběr formátu souboru\\",\\"FORMAT_DESCRIPTION_START\\":\\"Soubor bude sdílen v  \\",\\"FORMAT_DESCRIPTION_END\\":\\" formátu.\\",\\"DESTINATION_LABEL\\":\\"Cíl\\",\\"DESTINATION_PLACEHOLDER\\":\\"Vyhledávání podle názvu nebo kanálu\\",\\"MESSAGE_LABEL\\":\\"Zpráva (volitelné)\\",\\"MESSAGE_PLACEHOLDER\\":\\"Máte-li náladu, připište zprávu.\\",\\"SHARE\\":\\"Sdílet\\",\\"REFRESH_CONTACTS\\":\\"Obnovit kontakty\\",\\"LOGOUT\\":\\"Odhlásit se\\",\\"SIGNIN\\":\\"Přihlásit se\\",\\"SIGNIN_HEADING\\":\\"Přihlaste se a sdílejte přes Slack\\",\\"SIGNIN_DESCRIPTION\\":\\"Ke sdílení souboru potřebuje Photoshop přístup k informacím o kontaktech a kanálech Slack.\\",\\"SIGNIN_LOADING\\":\\"Přihlaste se do služby Slack v prohlížeči\\",\\"SENDING_TITLE\\":\\"Odesílání do služby Slack...\\",\\"TOAST_SHARE_SUCCESS\\":\\"je úspěšně sdíleno\\",\\"TOAST_SHARE_ERROR\\":\\"nelze sdílet\\",\\"TOAST_NETWORK_ERROR\\":\\"Problém se sítí, zkuste to znovu později\\",\\"TOAST_SIGNIN_ERROR\\":\\"Přihlášení se nezdařilo. Zkuste to znovu.\\",\\"OFFLINE_TITLE\\":\\"Offline\\",\\"OFFLINE_DESCRIPTION\\":\\"Chcete-li používat naše služby sdílení, znovu se připojte k internetu.\\",\\"LOADING_CONTACTS_TITLE\\":\\"Načítání ze služby Slack...\\",\\"INVITE_TITLE\\":\\"Pozvat k úpravám\\",\\"INVITE_DESCRIPTION\\":\\"Spolupráce s ostatními na souboru\\",\\"REVIEW_TITLE\\":\\"Sdílet ke kontrole\\",\\"REVIEW_DESCRIPTION\\":\\"Vytvoření odkazu pro získání zpětné vazby\\",\\"REVIEW_DISABLED_GENERIC\\":\\"Připravujeme\\",\\"REVIEW_DISABLED_SHARED_DOC\\":\\"Připravujeme pro sdílené soubory\\",\\"SEND_TO_APPS_TITLE\\":\\"Odeslat do aplikací\\",\\"SEND_TO_APPS_DESCRIPTION\\":\\"Odešlete kopii do externí aplikace\\",\\"QUICK_EXPORT_TITLE\\":\\"Rychle exportovat jako\\",\\"QUICK_EXPORT_DESCRIPTION\\":\\"Export jedním kliknutím\\",\\"SIZE_SETTING_TITLE\\":\\"Nastavení velikosti\\",\\"FORMAT_DESCRIPTION\\":\\"Formát ke sdílení\\",\\"SHARING_DESCRIPTION_PREFIX\\":\\"Sdílení:\\",\\"SHARING_DESCRIPTION_SUFFIX\\":\\"formát\\",\\"SIZE_ORIGINAL\\":\\"Originál\\",\\"SIZE_SMALL\\":\\"Malá\\",\\"COPY_TO_CLIPBOARD_TITLE\\":\\"Kopírovat do schránky\\",\\"COPY_TO_CLIPBOARD_TOOLTIP\\":\\"Soubory PSD nelze zkopírovat do schránky. Zkuste místo toho použít PNG nebo JPG.\\",\\"COPY_TO_CLIPBOARD_SUCCESS\\":\\"Obrázek byl zkopírován do schránky\\",\\"DIMENSION_ORIGINAL_SUFFIX\\":\\"Původní velikost\\",\\"DIMENSION_SMALL_SUFFIX\\":\\"originálu\\",\\"CHARACTERS_REMAINING\\":\\"Zbývajících znaků\\",\\"OTHER_APPS_TITLE\\":\\"Další aplikace\\",\\"REVIEW_DISABLED_DESCRIPTION\\":\\"Pokračujte uložením jako nový soubor\\"}");//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTE3LmpzIiwic291cmNlcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///117\n')},function(module){eval('module.exports = JSON.parse("{\\"SLACK_TITLE\\":\\"Del via Slack\\",\\"SLACK_DESCRIPTION\\":\\"Del dit arbejde på Slack\\",\\"SLACK_PANEL_HEADING\\":\\"Del på Slack\\",\\"CANCEL\\":\\"Annuller\\",\\"FORMAT_LABEL\\":\\"Format, der skal deles\\",\\"FORMAT_PLACEHOLDER\\":\\"Vælg filformat\\",\\"FORMAT_DESCRIPTION_START\\":\\"Filen deles som\\",\\"FORMAT_DESCRIPTION_END\\":\\" format.\\",\\"DESTINATION_LABEL\\":\\"Mål\\",\\"DESTINATION_PLACEHOLDER\\":\\"Søg efter navn eller kanal\\",\\"MESSAGE_LABEL\\":\\"Besked (valgfrit)\\",\\"MESSAGE_PLACEHOLDER\\":\\"Skriv eventuelt en besked her.\\",\\"SHARE\\":\\"Del\\",\\"REFRESH_CONTACTS\\":\\"Genindlæs kontakter\\",\\"LOGOUT\\":\\"Log ud\\",\\"SIGNIN\\":\\"Log ind\\",\\"SIGNIN_HEADING\\":\\"Log ind for at dele på Slack\\",\\"SIGNIN_DESCRIPTION\\":\\"Photoshop skal have adgang til dine Slack-kontakter og kanaloplysninger for at dele filen.\\",\\"SIGNIN_LOADING\\":\\"Log ind på Slack i din browser\\",\\"SENDING_TITLE\\":\\"Sender til Slack...\\",\\"TOAST_SHARE_SUCCESS\\":\\"er blevet delt\\",\\"TOAST_SHARE_ERROR\\":\\"kunne ikke deles\\",\\"TOAST_NETWORK_ERROR\\":\\"Netværksproblem, prøv igen senere\\",\\"TOAST_SIGNIN_ERROR\\":\\"Kunne ikke logge ind. Prøv igen.\\",\\"OFFLINE_TITLE\\":\\"Offline\\",\\"OFFLINE_DESCRIPTION\\":\\"Opret forbindelse til internettet igen for at bruge vores delingsfunktion.\\",\\"LOADING_CONTACTS_TITLE\\":\\"Indlæser fra Slack...\\",\\"INVITE_TITLE\\":\\"Inviter til at redigere\\",\\"INVITE_DESCRIPTION\\":\\"Arbejd sammen med andre i din fil\\",\\"REVIEW_TITLE\\":\\"Del til gennemgang\\",\\"REVIEW_DESCRIPTION\\":\\"Opret et link for at få feedback\\",\\"REVIEW_DISABLED_GENERIC\\":\\"Kommer snart\\",\\"REVIEW_DISABLED_SHARED_DOC\\":\\"Kommer snart for delte filer\\",\\"SEND_TO_APPS_TITLE\\":\\"Send til apps\\",\\"SEND_TO_APPS_DESCRIPTION\\":\\"Send en kopi til en ekstern app\\",\\"QUICK_EXPORT_TITLE\\":\\"Hurtigeksport som\\",\\"QUICK_EXPORT_DESCRIPTION\\":\\"Eksport med et klik\\",\\"SIZE_SETTING_TITLE\\":\\"Størrelsesindstillinger\\",\\"FORMAT_DESCRIPTION\\":\\"Format, der skal deles\\",\\"SHARING_DESCRIPTION_PREFIX\\":\\"Deler i\\",\\"SHARING_DESCRIPTION_SUFFIX\\":\\"format\\",\\"SIZE_ORIGINAL\\":\\"Original\\",\\"SIZE_SMALL\\":\\"Lille\\",\\"COPY_TO_CLIPBOARD_TITLE\\":\\"Kopiér til udklipsholder\\",\\"COPY_TO_CLIPBOARD_TOOLTIP\\":\\"PSD-filer kan ikke kopieres til udklipsholderen. Prøv at bruge PNG eller JPG i stedet.\\",\\"COPY_TO_CLIPBOARD_SUCCESS\\":\\"Billede kopieret til udklipsholder\\",\\"DIMENSION_ORIGINAL_SUFFIX\\":\\"Original størrelse\\",\\"DIMENSION_SMALL_SUFFIX\\":\\"af original\\",\\"CHARACTERS_REMAINING\\":\\"Tegn tilbage\\",\\"OTHER_APPS_TITLE\\":\\"Andre apps\\",\\"REVIEW_DISABLED_DESCRIPTION\\":\\"Gem som en ny fil for at fortsætte\\"}");//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTE4LmpzIiwic291cmNlcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///118\n')},function(module){eval('module.exports = JSON.parse("{\\"SLACK_TITLE\\":\\"Über Slack freigeben\\",\\"SLACK_DESCRIPTION\\":\\"Deine Arbeit auf Slack freigeben\\",\\"SLACK_PANEL_HEADING\\":\\"Auf Slack freigeben\\",\\"CANCEL\\":\\"Abbrechen\\",\\"FORMAT_LABEL\\":\\"Zu teilendes Format\\",\\"FORMAT_PLACEHOLDER\\":\\"Dateiformat wählen\\",\\"FORMAT_DESCRIPTION_START\\":\\"Die Datei wird freigegeben in \\",\\"FORMAT_DESCRIPTION_END\\":\\" Format.\\",\\"DESTINATION_LABEL\\":\\"Ziel\\",\\"DESTINATION_PLACEHOLDER\\":\\"Nach Name oder Kanal suchen\\",\\"MESSAGE_LABEL\\":\\"Nachricht (optional)\\",\\"MESSAGE_PLACEHOLDER\\":\\"Gib hier eine Nachricht ein, wenn du möchtest.\\",\\"SHARE\\":\\"Freigeben\\",\\"REFRESH_CONTACTS\\":\\"Kontakte aktualisieren\\",\\"LOGOUT\\":\\"Abmelden\\",\\"SIGNIN\\":\\"Anmelden\\",\\"SIGNIN_HEADING\\":\\"Anmelden, um auf Slack freizugeben\\",\\"SIGNIN_DESCRIPTION\\":\\"Um die Datei freizugeben, benötigt Photoshop Zugriff auf deine Slack-Kontakte und Kanalinformationen.\\",\\"SIGNIN_LOADING\\":\\"Bei Slack in deinem Browser anmelden\\",\\"SENDING_TITLE\\":\\"Wird an Slack gesendet...\\",\\"TOAST_SHARE_SUCCESS\\":\\"ist erfolgreich freigegeben\\",\\"TOAST_SHARE_ERROR\\":\\"konnte nicht freigegeben werden\\",\\"TOAST_NETWORK_ERROR\\":\\"Netzwerkfehler, versuche es später erneut\\",\\"TOAST_SIGNIN_ERROR\\":\\"Anmeldung fehlgeschlagen. Versuche es erneut.\\",\\"OFFLINE_TITLE\\":\\"Offline\\",\\"OFFLINE_DESCRIPTION\\":\\"Stelle erneut eine Verbindung zum Internet her, um unsere Freigabedienste zu nutzen.\\",\\"LOADING_CONTACTS_TITLE\\":\\"Wird aus Slack geladen...\\",\\"INVITE_TITLE\\":\\"Zum Bearbeiten einladen\\",\\"INVITE_DESCRIPTION\\":\\"Arbeite mit anderen an deiner Datei\\",\\"REVIEW_TITLE\\":\\"Zur Überprüfung freigeben\\",\\"REVIEW_DESCRIPTION\\":\\"Link erstellen, um Feedback zu erfassen\\",\\"REVIEW_DISABLED_GENERIC\\":\\"Demnächst verfügbar\\",\\"REVIEW_DISABLED_SHARED_DOC\\":\\"In Kürze verfügbar für freigegebene Dateien\\",\\"SEND_TO_APPS_TITLE\\":\\"An Apps senden\\",\\"SEND_TO_APPS_DESCRIPTION\\":\\"Kopie an eine externe App senden\\",\\"QUICK_EXPORT_TITLE\\":\\"Schnell-Export als\\",\\"QUICK_EXPORT_DESCRIPTION\\":\\"Ein-Klick-Export\\",\\"SIZE_SETTING_TITLE\\":\\"Größeneinstellungen\\",\\"FORMAT_DESCRIPTION\\":\\"Zu teilendes Format\\",\\"SHARING_DESCRIPTION_PREFIX\\":\\"Teilen in\\",\\"SHARING_DESCRIPTION_SUFFIX\\":\\"Format\\",\\"SIZE_ORIGINAL\\":\\"Original\\",\\"SIZE_SMALL\\":\\"Klein\\",\\"COPY_TO_CLIPBOARD_TITLE\\":\\"In Zwischenablage kopieren\\",\\"COPY_TO_CLIPBOARD_TOOLTIP\\":\\"PSD-Dateien können nicht in die Zwischenablage kopiert werden. Versuche es mit einer PNG- oder JPG-Datei.\\",\\"COPY_TO_CLIPBOARD_SUCCESS\\":\\"Bild in Zwischenablage kopiert\\",\\"DIMENSION_ORIGINAL_SUFFIX\\":\\"Originalgröße\\",\\"DIMENSION_SMALL_SUFFIX\\":\\"des Originals\\",\\"CHARACTERS_REMAINING\\":\\"Verbleibende Zeichen\\",\\"OTHER_APPS_TITLE\\":\\"Andere Apps\\",\\"REVIEW_DISABLED_DESCRIPTION\\":\\"Als neue Datei speichern, um fortzufahren\\"}");//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTE5LmpzIiwic291cmNlcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///119\n')},function(module){eval('module.exports = JSON.parse("{\\"SLACK_TITLE\\":\\"Share via Slack\\",\\"SLACK_DESCRIPTION\\":\\"Share your work to Slack\\",\\"SLACK_PANEL_HEADING\\":\\"Share to Slack\\",\\"CANCEL\\":\\"Cancel\\",\\"FORMAT_LABEL\\":\\"Format to share\\",\\"FORMAT_PLACEHOLDER\\":\\"Choose file format\\",\\"FORMAT_DESCRIPTION_START\\":\\"The file will be shared in \\",\\"FORMAT_DESCRIPTION_END\\":\\" format.\\",\\"DESTINATION_LABEL\\":\\"Destination\\",\\"DESTINATION_PLACEHOLDER\\":\\"Search by name or channel\\",\\"MESSAGE_LABEL\\":\\"Message (optional)\\",\\"MESSAGE_PLACEHOLDER\\":\\"Type a message here, if you’d like!\\",\\"SHARE\\":\\"Share\\",\\"REFRESH_CONTACTS\\":\\"Refresh contacts\\",\\"LOGOUT\\":\\"Log out\\",\\"SIGNIN\\":\\"Sign in\\",\\"SIGNIN_HEADING\\":\\"Sign in to share to Slack\\",\\"SIGNIN_DESCRIPTION\\":\\"To share the file, Photoshop needs access to your Slack contacts and channels information.\\",\\"SIGNIN_LOADING\\":\\"Sign in to Slack in your browser\\",\\"SENDING_TITLE\\":\\"Sending to Slack...\\",\\"TOAST_SHARE_SUCCESS\\":\\"is shared successfully\\",\\"TOAST_SHARE_ERROR\\":\\"could not be shared\\",\\"TOAST_NETWORK_ERROR\\":\\"Network issue, please try again later\\",\\"TOAST_SIGNIN_ERROR\\":\\"Sign in failed. Please try again.\\",\\"OFFLINE_TITLE\\":\\"Offline\\",\\"OFFLINE_DESCRIPTION\\":\\"Please reconnect to the internet in order to use our share services.\\",\\"LOADING_CONTACTS_TITLE\\":\\"Loading from Slack...\\",\\"INVITE_TITLE\\":\\"Invite to edit\\",\\"INVITE_DESCRIPTION\\":\\"Work with others in your file\\",\\"REVIEW_TITLE\\":\\"Share for review\\",\\"REVIEW_DESCRIPTION\\":\\"Create a link to capture feedback\\",\\"REVIEW_DISABLED_GENERIC\\":\\"Coming soon\\",\\"REVIEW_DISABLED_SHARED_DOC\\":\\"Coming soon for shared files\\",\\"SEND_TO_APPS_TITLE\\":\\"Send to apps\\",\\"SEND_TO_APPS_DESCRIPTION\\":\\"Send a copy to an external app\\",\\"QUICK_EXPORT_TITLE\\":\\"Quick export as\\",\\"QUICK_EXPORT_DESCRIPTION\\":\\"One-click export\\",\\"SIZE_SETTING_TITLE\\":\\"Size settings\\",\\"FORMAT_DESCRIPTION\\":\\"Format to share\\",\\"SHARING_DESCRIPTION_PREFIX\\":\\"Sharing in\\",\\"SHARING_DESCRIPTION_SUFFIX\\":\\"format\\",\\"SIZE_ORIGINAL\\":\\"Original\\",\\"SIZE_SMALL\\":\\"Small\\",\\"COPY_TO_CLIPBOARD_TITLE\\":\\"Copy to clipboard\\",\\"COPY_TO_CLIPBOARD_TOOLTIP\\":\\"PSD files can\'t be copied to clipboard. Try using PNG or JPG instead.\\",\\"COPY_TO_CLIPBOARD_SUCCESS\\":\\"Image copied to clipboard\\",\\"DIMENSION_ORIGINAL_SUFFIX\\":\\"Original size\\",\\"DIMENSION_SMALL_SUFFIX\\":\\"of original\\",\\"CHARACTERS_REMAINING\\":\\"Characters remaining\\",\\"OTHER_APPS_TITLE\\":\\"Other Apps\\",\\"REVIEW_DISABLED_DESCRIPTION\\":\\"Save as a new file to continue\\",\\"ANIMATE_IN_FIREFLY_TITLE\\":\\"Generate video in Firefly\\",\\"ANIMATE_IN_FIREFLY_DESCRIPTION\\":\\"Transform image to video\\"}");//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTIwLmpzIiwic291cmNlcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///120\n')},function(module){eval('module.exports = JSON.parse("{\\"SLACK_TITLE\\":\\"Compartir a través de Slack\\",\\"SLACK_DESCRIPTION\\":\\"Comparta su trabajo con Slack\\",\\"SLACK_PANEL_HEADING\\":\\"Compartir en Slack\\",\\"CANCEL\\":\\"Cancelar\\",\\"FORMAT_LABEL\\":\\"Aplicar formato para compartir\\",\\"FORMAT_PLACEHOLDER\\":\\"Elegir formato de archivo\\",\\"FORMAT_DESCRIPTION_START\\":\\"El archivo se compartirá en \\",\\"FORMAT_DESCRIPTION_END\\":\\".\\",\\"DESTINATION_LABEL\\":\\"Destino\\",\\"DESTINATION_PLACEHOLDER\\":\\"Buscar por nombre o canal\\",\\"MESSAGE_LABEL\\":\\"Mensaje (opcional)\\",\\"MESSAGE_PLACEHOLDER\\":\\"Escriba un mensaje aquí, si lo desea.\\",\\"SHARE\\":\\"Compartir\\",\\"REFRESH_CONTACTS\\":\\"Actualizar contactos\\",\\"LOGOUT\\":\\"Cerrar sesión\\",\\"SIGNIN\\":\\"Iniciar sesión\\",\\"SIGNIN_HEADING\\":\\"Inicie sesión para compartir en Slack\\",\\"SIGNIN_DESCRIPTION\\":\\"Para compartir el archivo, Photoshop necesita acceso a la información de los contactos y canales de Slack.\\",\\"SIGNIN_LOADING\\":\\"Inicie sesión en Slack en su navegador\\",\\"SENDING_TITLE\\":\\"Enviando a Slack...\\",\\"TOAST_SHARE_SUCCESS\\":\\"se ha compartido correctamente\\",\\"TOAST_SHARE_ERROR\\":\\"no se ha podido compartir\\",\\"TOAST_NETWORK_ERROR\\":\\"Problema de red, inténtelo de nuevo más tarde\\",\\"TOAST_SIGNIN_ERROR\\":\\"Error de inicio de sesión. Inténtelo de nuevo.\\",\\"OFFLINE_TITLE\\":\\"Sin conexión\\",\\"OFFLINE_DESCRIPTION\\":\\"Vuelva a conectarse a Internet para utilizar nuestros servicios compartidos.\\",\\"LOADING_CONTACTS_TITLE\\":\\"Cargando desde Slack...\\",\\"INVITE_TITLE\\":\\"Invitar a editar\\",\\"INVITE_DESCRIPTION\\":\\"Trabajar con otros usuarios en su archivo\\",\\"REVIEW_TITLE\\":\\"Compartir para revisión\\",\\"REVIEW_DESCRIPTION\\":\\"Crear un enlace para recoger comentarios\\",\\"REVIEW_DISABLED_GENERIC\\":\\"Próximamente\\",\\"REVIEW_DISABLED_SHARED_DOC\\":\\"Próximamente para los archivos compartidos\\",\\"SEND_TO_APPS_TITLE\\":\\"Enviar a aplicaciones\\",\\"SEND_TO_APPS_DESCRIPTION\\":\\"Enviar una copia a una aplicación externa\\",\\"QUICK_EXPORT_TITLE\\":\\"Exportación rápida como\\",\\"QUICK_EXPORT_DESCRIPTION\\":\\"Exportación con un solo clic\\",\\"SIZE_SETTING_TITLE\\":\\"Ajustes de tamaño\\",\\"FORMAT_DESCRIPTION\\":\\"Aplicar formato para compartir\\",\\"SHARING_DESCRIPTION_PREFIX\\":\\"Compartiendo en\\",\\"SHARING_DESCRIPTION_SUFFIX\\":\\"formato\\",\\"SIZE_ORIGINAL\\":\\"Original\\",\\"SIZE_SMALL\\":\\"Pequeño\\",\\"COPY_TO_CLIPBOARD_TITLE\\":\\"Copiar en el portapapeles\\",\\"COPY_TO_CLIPBOARD_TOOLTIP\\":\\"Los archivos PSD no se pueden copiar en el portapapeles. Utilice un PNG o JPG en su lugar.\\",\\"COPY_TO_CLIPBOARD_SUCCESS\\":\\"Imagen copiada en el portapapeles\\",\\"DIMENSION_ORIGINAL_SUFFIX\\":\\"Tamaño original\\",\\"DIMENSION_SMALL_SUFFIX\\":\\"del original\\",\\"CHARACTERS_REMAINING\\":\\"Caracteres restantes\\",\\"OTHER_APPS_TITLE\\":\\"Otras aplicaciones\\",\\"REVIEW_DISABLED_DESCRIPTION\\":\\"Guardar como un archivo nuevo para continuar\\"}");//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTIxLmpzIiwic291cmNlcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///121\n')},function(module){eval('module.exports = JSON.parse("{\\"SLACK_TITLE\\":\\"Jaa Slackin kautta\\",\\"SLACK_DESCRIPTION\\":\\"Jaa työsi Slackissa\\",\\"SLACK_PANEL_HEADING\\":\\"Jaa Slackissa\\",\\"CANCEL\\":\\"Peruuta\\",\\"FORMAT_LABEL\\":\\"Jaettava muoto\\",\\"FORMAT_PLACEHOLDER\\":\\"Valitse tiedostomuoto\\",\\"FORMAT_DESCRIPTION_START\\":\\"Tiedosto jaetaan muodossa\\",\\"FORMAT_DESCRIPTION_END\\":\\".\\",\\"DESTINATION_LABEL\\":\\"Kohde\\",\\"DESTINATION_PLACEHOLDER\\":\\"Etsi nimen tai kanavan perusteella\\",\\"MESSAGE_LABEL\\":\\"Viesti (valinnainen)\\",\\"MESSAGE_PLACEHOLDER\\":\\"Kirjoita halutessasi tähän viesti.\\",\\"SHARE\\":\\"Jaa\\",\\"REFRESH_CONTACTS\\":\\"Päivitä yhteystiedot\\",\\"LOGOUT\\":\\"Kirjaudu ulos\\",\\"SIGNIN\\":\\"Kirjaudu sisään\\",\\"SIGNIN_HEADING\\":\\"Kirjaudu sisään Slackissa jakamista varten\\",\\"SIGNIN_DESCRIPTION\\":\\"Photoshop tarvitsee pääsyn Slack-yhteystietojen ja -kanavien tietoihin, jotta tiedosto voidaan jakaa.\\",\\"SIGNIN_LOADING\\":\\"Kirjaudu sisään Slackiin selaimella\\",\\"SENDING_TITLE\\":\\"Lähetetään Slackiin...\\",\\"TOAST_SHARE_SUCCESS\\":\\"on jaettu\\",\\"TOAST_SHARE_ERROR\\":\\"ei voitu jakaa\\",\\"TOAST_NETWORK_ERROR\\":\\"Verkkoyhteysongelma, yritä myöhemmin uudelleen\\",\\"TOAST_SIGNIN_ERROR\\":\\"Sisäänkirjautuminen epäonnistui. Yritä uudelleen.\\",\\"OFFLINE_TITLE\\":\\"Offline\\",\\"OFFLINE_DESCRIPTION\\":\\"Yhdistä uudelleen internetiin, jotta voit käyttää jakamispalvelujamme.\\",\\"LOADING_CONTACTS_TITLE\\":\\"Ladataan Slackista...\\",\\"INVITE_TITLE\\":\\"Kutsu muokkaamaan\\",\\"INVITE_DESCRIPTION\\":\\"Työstä tiedostoa muiden kanssa\\",\\"REVIEW_TITLE\\":\\"Jaa tarkistusta varten\\",\\"REVIEW_DESCRIPTION\\":\\"Luo linkki palautteen antamista varten\\",\\"REVIEW_DISABLED_GENERIC\\":\\"Tulossa pian\\",\\"REVIEW_DISABLED_SHARED_DOC\\":\\"Tulossa pian jaettuihin tiedostoihin\\",\\"SEND_TO_APPS_TITLE\\":\\"Lähetä sovelluksiin\\",\\"SEND_TO_APPS_DESCRIPTION\\":\\"Lähetä kopio ulkoiseen sovellukseen\\",\\"QUICK_EXPORT_TITLE\\":\\"Pikavienti muodossa\\",\\"QUICK_EXPORT_DESCRIPTION\\":\\"Vienti napsauttamalla\\",\\"SIZE_SETTING_TITLE\\":\\"Kokoasetukset\\",\\"FORMAT_DESCRIPTION\\":\\"Jaettava muoto\\",\\"SHARING_DESCRIPTION_PREFIX\\":\\"Jaetaan koossa\\",\\"SHARING_DESCRIPTION_SUFFIX\\":\\"muoto\\",\\"SIZE_ORIGINAL\\":\\"Alkuperäinen\\",\\"SIZE_SMALL\\":\\"Pieni\\",\\"COPY_TO_CLIPBOARD_TITLE\\":\\"Kopioi leikepöydälle\\",\\"COPY_TO_CLIPBOARD_TOOLTIP\\":\\"PSD-tiedostoja ei voi kopioi leikepöydälle. Kokeile PNG- tai JPG-muotoa.\\",\\"COPY_TO_CLIPBOARD_SUCCESS\\":\\"Kuva kopioitu leikepöydälle\\",\\"DIMENSION_ORIGINAL_SUFFIX\\":\\"Alkuperäinen koko\\",\\"DIMENSION_SMALL_SUFFIX\\":\\"alkuperäisestä\\",\\"CHARACTERS_REMAINING\\":\\"Jäljellä olevat merkit\\",\\"OTHER_APPS_TITLE\\":\\"Muut sovellukset\\",\\"REVIEW_DISABLED_DESCRIPTION\\":\\"Jatka tallentamalla uutena tiedostona\\"}");//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTIyLmpzIiwic291cmNlcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///122\n')},function(module){eval('module.exports = JSON.parse("{\\"SLACK_TITLE\\":\\"Partager via Slack\\",\\"SLACK_DESCRIPTION\\":\\"Partagez votre travail sur Slack\\",\\"SLACK_PANEL_HEADING\\":\\"Partager sur Slack\\",\\"CANCEL\\":\\"Annuler\\",\\"FORMAT_LABEL\\":\\"Format à partager\\",\\"FORMAT_PLACEHOLDER\\":\\"Choisir un format de fichier\\",\\"FORMAT_DESCRIPTION_START\\":\\"Le fichier sera partagé dans \\",\\"FORMAT_DESCRIPTION_END\\":\\" format.\\",\\"DESTINATION_LABEL\\":\\"Destination\\",\\"DESTINATION_PLACEHOLDER\\":\\"Rechercher par nom ou canal\\",\\"MESSAGE_LABEL\\":\\"Message (facultatif)\\",\\"MESSAGE_PLACEHOLDER\\":\\"Saisissez un message ici, si vous le souhaitez !\\",\\"SHARE\\":\\"Partager\\",\\"REFRESH_CONTACTS\\":\\"Actualiser les contacts\\",\\"LOGOUT\\":\\"Déconnexion\\",\\"SIGNIN\\":\\"Se connecter\\",\\"SIGNIN_HEADING\\":\\"Connectez-vous pour partager sur Slack\\",\\"SIGNIN_DESCRIPTION\\":\\"Pour partager le fichier, Photoshop doit avoir accès à vos contacts Slack et aux informations sur les canaux.\\",\\"SIGNIN_LOADING\\":\\"Connectez-vous à Slack dans votre navigateur\\",\\"SENDING_TITLE\\":\\"Envoi dans Slack...\\",\\"TOAST_SHARE_SUCCESS\\":\\"partagé avec succès.\\",\\"TOAST_SHARE_ERROR\\":\\"impossible de partager\\",\\"TOAST_NETWORK_ERROR\\":\\"Problème de réseau, veuillez réessayer ultérieurement\\",\\"TOAST_SIGNIN_ERROR\\":\\"Connexion impossible. Veuillez réessayer ultérieurement.\\",\\"OFFLINE_TITLE\\":\\"Déconnecté\\",\\"OFFLINE_DESCRIPTION\\":\\"Veuillez vous reconnecter à Internet pour utiliser nos services de partage.\\",\\"LOADING_CONTACTS_TITLE\\":\\"Chargement depuis Slack...\\",\\"INVITE_TITLE\\":\\"Inviter à modifier\\",\\"INVITE_DESCRIPTION\\":\\"Travaillez avec d\'autres pers. dans votre fichier\\",\\"REVIEW_TITLE\\":\\"Partager pour révision\\",\\"REVIEW_DESCRIPTION\\":\\"Créez un lien pour recueillir les commentaires\\",\\"REVIEW_DISABLED_GENERIC\\":\\"Bientôt disponible\\",\\"REVIEW_DISABLED_SHARED_DOC\\":\\"Bientôt disponible pour les fichiers partagés\\",\\"SEND_TO_APPS_TITLE\\":\\"Envoyer aux applications\\",\\"SEND_TO_APPS_DESCRIPTION\\":\\"Envoyer une copie à une application externe\\",\\"QUICK_EXPORT_TITLE\\":\\"Exportation rapide au format\\",\\"QUICK_EXPORT_DESCRIPTION\\":\\"Exportation en un clic\\",\\"SIZE_SETTING_TITLE\\":\\"Paramètres de taille\\",\\"FORMAT_DESCRIPTION\\":\\"Format à partager\\",\\"SHARING_DESCRIPTION_PREFIX\\":\\"Partage en\\",\\"SHARING_DESCRIPTION_SUFFIX\\":\\"format\\",\\"SIZE_ORIGINAL\\":\\"Original\\",\\"SIZE_SMALL\\":\\"Petit\\",\\"COPY_TO_CLIPBOARD_TITLE\\":\\"Copier dans le Presse-papiers\\",\\"COPY_TO_CLIPBOARD_TOOLTIP\\":\\"Les fichiers PSD ne peuvent pas être copiés dans le presse-papiers. Essayez plutôt d’utiliser le format PNG ou JPG.\\",\\"COPY_TO_CLIPBOARD_SUCCESS\\":\\"Image copiée dans le presse-papiers\\",\\"DIMENSION_ORIGINAL_SUFFIX\\":\\"Taille d’origine\\",\\"DIMENSION_SMALL_SUFFIX\\":\\"de l’original\\",\\"CHARACTERS_REMAINING\\":\\"Caractères restants\\",\\"OTHER_APPS_TITLE\\":\\"Autres applications\\",\\"REVIEW_DISABLED_DESCRIPTION\\":\\"Enregistrer en tant que nouveau fichier pour continuer\\"}");//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTIzLmpzIiwic291cmNlcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///123\n')},function(module){eval('module.exports = JSON.parse("{\\"SLACK_TITLE\\":\\"Megosztás a Slack alkalmazásban\\",\\"SLACK_DESCRIPTION\\":\\"Ossza meg munkáját a Slackben\\",\\"SLACK_PANEL_HEADING\\":\\"Megosztás a Slack alkalmazásban\\",\\"CANCEL\\":\\"Mégse\\",\\"FORMAT_LABEL\\":\\"Megosztás formátuma\\",\\"FORMAT_PLACEHOLDER\\":\\"Válassza ki a fájlformátumot\\",\\"FORMAT_DESCRIPTION_START\\":\\"A fájl megosztásra kerül itt: \\",\\"FORMAT_DESCRIPTION_END\\":\\" formátumban.\\",\\"DESTINATION_LABEL\\":\\"Cél\\",\\"DESTINATION_PLACEHOLDER\\":\\"Keresés név vagy csatorna alapján\\",\\"MESSAGE_LABEL\\":\\"Üzenet (opcionális)\\",\\"MESSAGE_PLACEHOLDER\\":\\"Ha szeretne, írjon ide egy üzenetet!\\",\\"SHARE\\":\\"Megosztás\\",\\"REFRESH_CONTACTS\\":\\"Névjegyek frissítése\\",\\"LOGOUT\\":\\"Kijelentkezés\\",\\"SIGNIN\\":\\"Bejelentkezés\\",\\"SIGNIN_HEADING\\":\\"Jelentkezzen be a Slackben történő megosztáshoz\\",\\"SIGNIN_DESCRIPTION\\":\\"A fájl megosztásához a Photoshopnak hozzáférésre van szüksége a Slack-névjegyeivel és -csatornáival kapcsolatos információkra.\\",\\"SIGNIN_LOADING\\":\\"Jelentkezzen be a Slack alkalmazásba böngészőjében\\",\\"SENDING_TITLE\\":\\"Küldés a Slackbe...\\",\\"TOAST_SHARE_SUCCESS\\":\\"sikeresen megosztva\\",\\"TOAST_SHARE_ERROR\\":\\"nem lehetett megosztani\\",\\"TOAST_NETWORK_ERROR\\":\\"Hálózati hiba, kérjük, próbálja újra később\\",\\"TOAST_SIGNIN_ERROR\\":\\"A bejelentkezés sikertelen volt. Kérjük, próbálja újra.\\",\\"OFFLINE_TITLE\\":\\"Kapcsolat nélküli\\",\\"OFFLINE_DESCRIPTION\\":\\"Kérjük, csatlakozzon újra az internetre megosztási szolgáltatásaink használatához.\\",\\"LOADING_CONTACTS_TITLE\\":\\"Betöltés a Slackről...\\",\\"INVITE_TITLE\\":\\"Meghívás szerkesztésre\\",\\"INVITE_DESCRIPTION\\":\\"Közös munka a fájlokon\\",\\"REVIEW_TITLE\\":\\"Megosztás véleményezésre\\",\\"REVIEW_DESCRIPTION\\":\\"Hivatkozás létrehozása visszajelzéshez\\",\\"REVIEW_DISABLED_GENERIC\\":\\"Hamarosan\\",\\"REVIEW_DISABLED_SHARED_DOC\\":\\"Hamarosan már a megosztott fájlokhoz is\\",\\"SEND_TO_APPS_TITLE\\":\\"Küldés az alkalmazásokba\\",\\"SEND_TO_APPS_DESCRIPTION\\":\\"Másolat küldése külső alkalmazásba\\",\\"QUICK_EXPORT_TITLE\\":\\"Gyors exportálás mint:\\",\\"QUICK_EXPORT_DESCRIPTION\\":\\"Egykattintásos exportálás\\",\\"SIZE_SETTING_TITLE\\":\\"Méretbeállítások\\",\\"FORMAT_DESCRIPTION\\":\\"Megosztás formátuma\\",\\"SHARING_DESCRIPTION_PREFIX\\":\\"Megosztás:\\",\\"SHARING_DESCRIPTION_SUFFIX\\":\\"formátum\\",\\"SIZE_ORIGINAL\\":\\"Eredeti\\",\\"SIZE_SMALL\\":\\"Kicsi\\",\\"COPY_TO_CLIPBOARD_TITLE\\":\\"Másolás a vágólapra\\",\\"COPY_TO_CLIPBOARD_TOOLTIP\\":\\"A PSD-fájlok nem másolhatók a vágólapra. Próbálkozzon PNG vagy JPG formátummal.\\",\\"COPY_TO_CLIPBOARD_SUCCESS\\":\\"Kép másolva a vágólapra\\",\\"DIMENSION_ORIGINAL_SUFFIX\\":\\"Eredeti méret\\",\\"DIMENSION_SMALL_SUFFIX\\":\\"az eredetiből\\",\\"CHARACTERS_REMAINING\\":\\"Fennmaradó karakterek\\",\\"OTHER_APPS_TITLE\\":\\"Egyéb alkalmazások\\",\\"REVIEW_DISABLED_DESCRIPTION\\":\\"Mentse el új fájlként a folytatáshoz\\"}");//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTI0LmpzIiwic291cmNlcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///124\n')},function(module){eval('module.exports = JSON.parse("{\\"SLACK_TITLE\\":\\"Bagikan melalui Slack\\",\\"SLACK_DESCRIPTION\\":\\"Bagikan pekerjaan Anda ke Slack\\",\\"SLACK_PANEL_HEADING\\":\\"Bagikan ke Slack\\",\\"CANCEL\\":\\"Batalkan\\",\\"FORMAT_LABEL\\":\\"Format untuk berbagi\\",\\"FORMAT_PLACEHOLDER\\":\\"Pilih format file\\",\\"FORMAT_DESCRIPTION_START\\":\\"File akan dibagikan di \\",\\"FORMAT_DESCRIPTION_END\\":\\" format\\",\\"DESTINATION_LABEL\\":\\"Tujuan\\",\\"DESTINATION_PLACEHOLDER\\":\\"Cari berdasarkan nama atau saluran\\",\\"MESSAGE_LABEL\\":\\"Pesan (opsional)\\",\\"MESSAGE_PLACEHOLDER\\":\\"Ketik pesan di sini, jika ingin mau!\\",\\"SHARE\\":\\"Bagikan\\",\\"REFRESH_CONTACTS\\":\\"Segarkan kontak\\",\\"LOGOUT\\":\\"Logout\\",\\"SIGNIN\\":\\"Login\\",\\"SIGNIN_HEADING\\":\\"Login untuk berbagi ke Slack\\",\\"SIGNIN_DESCRIPTION\\":\\"Untuk berbagi file, Photoshop memerlukan akses ke kontak Slack dan informasi saluran Anda.\\",\\"SIGNIN_LOADING\\":\\"Login ke Slack di browser Anda\\",\\"SENDING_TITLE\\":\\"Mengirim ke Slack...\\",\\"TOAST_SHARE_SUCCESS\\":\\"berhasil dibagikan\\",\\"TOAST_SHARE_ERROR\\":\\"tidak dapat dibagikan\\",\\"TOAST_NETWORK_ERROR\\":\\"Masalah jaringan, coba lagi nanti\\",\\"TOAST_SIGNIN_ERROR\\":\\"Gagal login. Coba lagi.\\",\\"OFFLINE_TITLE\\":\\"Offline\\",\\"OFFLINE_DESCRIPTION\\":\\"Hubungkan kembali ke internet untuk menggunakan layanan berbagi kami.\\",\\"LOADING_CONTACTS_TITLE\\":\\"Memuat dari Slack...\\",\\"INVITE_TITLE\\":\\"Undang untuk mengedit\\",\\"INVITE_DESCRIPTION\\":\\"Bekerja sama dengan orang lain di file Anda\\",\\"REVIEW_TITLE\\":\\"Bagikan untuk ditinjau\\",\\"REVIEW_DESCRIPTION\\":\\"Buat tautan untuk mengambil umpan balik\\",\\"REVIEW_DISABLED_GENERIC\\":\\"Segera hadir\\",\\"REVIEW_DISABLED_SHARED_DOC\\":\\"Akan segera hadir untuk file bersama\\",\\"SEND_TO_APPS_TITLE\\":\\"Kirim ke aplikasi\\",\\"SEND_TO_APPS_DESCRIPTION\\":\\"Kirim salinan ke aplikasi eksternal\\",\\"QUICK_EXPORT_TITLE\\":\\"Ekspor cepat sebagai\\",\\"QUICK_EXPORT_DESCRIPTION\\":\\"Ekspor sekali klik\\",\\"SIZE_SETTING_TITLE\\":\\"Pengaturan ukuran\\",\\"FORMAT_DESCRIPTION\\":\\"Format untuk berbagi\\",\\"SHARING_DESCRIPTION_PREFIX\\":\\"Berbagi di\\",\\"SHARING_DESCRIPTION_SUFFIX\\":\\"format\\",\\"SIZE_ORIGINAL\\":\\"Asli\\",\\"SIZE_SMALL\\":\\"Kecil\\",\\"COPY_TO_CLIPBOARD_TITLE\\":\\"Salin ke clipboard\\",\\"COPY_TO_CLIPBOARD_TOOLTIP\\":\\"File PSD tidak dapat disalin ke clipboard. Coba gunakan PNG atau JPG sebagai gantinya.\\",\\"COPY_TO_CLIPBOARD_SUCCESS\\":\\"Gambar disalin ke clipboard\\",\\"DIMENSION_ORIGINAL_SUFFIX\\":\\"Ukuran asli\\",\\"DIMENSION_SMALL_SUFFIX\\":\\"versi asli\\",\\"CHARACTERS_REMAINING\\":\\"Sisa karakter\\",\\"OTHER_APPS_TITLE\\":\\"Aplikasi Lain\\",\\"REVIEW_DISABLED_DESCRIPTION\\":\\"Simpan sebagai file baru untuk melanjutkan\\"}");//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTI1LmpzIiwic291cmNlcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///125\n')},function(module){eval('module.exports = JSON.parse("{\\"SLACK_TITLE\\":\\"Condividi tramite Slack\\",\\"SLACK_DESCRIPTION\\":\\"Condividete il vostro lavoro in Slack\\",\\"SLACK_PANEL_HEADING\\":\\"Condividi in Slack\\",\\"CANCEL\\":\\"Annulla\\",\\"FORMAT_LABEL\\":\\"Formato da condividere\\",\\"FORMAT_PLACEHOLDER\\":\\"Scegli formato file\\",\\"FORMAT_DESCRIPTION_START\\":\\"Il file verrà condiviso in formato\\",\\"FORMAT_DESCRIPTION_END\\":\\".\\",\\"DESTINATION_LABEL\\":\\"Destinazione\\",\\"DESTINATION_PLACEHOLDER\\":\\"Cercate per nome o canale\\",\\"MESSAGE_LABEL\\":\\"Messaggio (facoltativo)\\",\\"MESSAGE_PLACEHOLDER\\":\\"Digitate qui un messaggio, se volete!\\",\\"SHARE\\":\\"Condividi\\",\\"REFRESH_CONTACTS\\":\\"Aggiorna contatti\\",\\"LOGOUT\\":\\"Disconnetti.\\",\\"SIGNIN\\":\\"Accedi\\",\\"SIGNIN_HEADING\\":\\"Accedete per condividere in Slack\\",\\"SIGNIN_DESCRIPTION\\":\\"Per condividere il file, Photoshop deve accedere alle informazioni dei contatti e dei canali Slack.\\",\\"SIGNIN_LOADING\\":\\"Accedete a Slack dal browser\\",\\"SENDING_TITLE\\":\\"Invio a Slack in corso...\\",\\"TOAST_SHARE_SUCCESS\\":\\"condiviso correttamente\\",\\"TOAST_SHARE_ERROR\\":\\"impossibile condividere\\",\\"TOAST_NETWORK_ERROR\\":\\"Problema di rete, riprovate più tardi\\",\\"TOAST_SIGNIN_ERROR\\":\\"Accesso non riuscito. Riprovate.\\",\\"OFFLINE_TITLE\\":\\"Non in linea\\",\\"OFFLINE_DESCRIPTION\\":\\"Per utilizzare i nostri servizi di condivisione, riconnettetevi a Internet.\\",\\"LOADING_CONTACTS_TITLE\\":\\"Caricamento da Slack in corso...\\",\\"INVITE_TITLE\\":\\"Invita a modificare\\",\\"INVITE_DESCRIPTION\\":\\"Lavora con altri utenti nello stesso file\\",\\"REVIEW_TITLE\\":\\"Condividi per revisione\\",\\"REVIEW_DESCRIPTION\\":\\"Crea collegamento per ottenere feedback\\",\\"REVIEW_DISABLED_GENERIC\\":\\"Disponibile a breve\\",\\"REVIEW_DISABLED_SHARED_DOC\\":\\"Disponibile a breve per i file condivisi\\",\\"SEND_TO_APPS_TITLE\\":\\"Invia alle app\\",\\"SEND_TO_APPS_DESCRIPTION\\":\\"Invia una copia a un\'app esterna\\",\\"QUICK_EXPORT_TITLE\\":\\"Esportazione rapida come\\",\\"QUICK_EXPORT_DESCRIPTION\\":\\"Esportazione con un clic\\",\\"SIZE_SETTING_TITLE\\":\\"Impostazioni delle dimensioni\\",\\"FORMAT_DESCRIPTION\\":\\"Formato da condividere\\",\\"SHARING_DESCRIPTION_PREFIX\\":\\"Condivisione in\\",\\"SHARING_DESCRIPTION_SUFFIX\\":\\"formato\\",\\"SIZE_ORIGINAL\\":\\"Originale\\",\\"SIZE_SMALL\\":\\"Piccola\\",\\"COPY_TO_CLIPBOARD_TITLE\\":\\"Copia negli appunti\\",\\"COPY_TO_CLIPBOARD_TOOLTIP\\":\\"I file PSD non possono essere copiati negli appunti. Provate a usare file PNG o JPG.\\",\\"COPY_TO_CLIPBOARD_SUCCESS\\":\\"Immagine copiata negli appunti\\",\\"DIMENSION_ORIGINAL_SUFFIX\\":\\"Dimensioni originali\\",\\"DIMENSION_SMALL_SUFFIX\\":\\"dell\'originale\\",\\"CHARACTERS_REMAINING\\":\\"Caratteri rimanenti\\",\\"OTHER_APPS_TITLE\\":\\"Altre app\\",\\"REVIEW_DISABLED_DESCRIPTION\\":\\"Salvate come nuovo file per continuare\\"}");//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTI2LmpzIiwic291cmNlcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///126\n')},function(module){eval('module.exports = JSON.parse("{\\"SLACK_TITLE\\":\\"Slack で共有\\",\\"SLACK_DESCRIPTION\\":\\"自分の作品を Slack に共有\\",\\"SLACK_PANEL_HEADING\\":\\"Slack に共有\\",\\"CANCEL\\":\\"キャンセル\\",\\"FORMAT_LABEL\\":\\"共有する形式\\",\\"FORMAT_PLACEHOLDER\\":\\"ファイル形式を選択\\",\\"FORMAT_DESCRIPTION_START\\":\\"ファイルは次の方法で共有されます :\\",\\"FORMAT_DESCRIPTION_END\\":\\"形式\\",\\"DESTINATION_LABEL\\":\\"緯度・軽度\\",\\"DESTINATION_PLACEHOLDER\\":\\"名前またはチャンネルで検索\\",\\"MESSAGE_LABEL\\":\\"メッセージ (任意)\\",\\"MESSAGE_PLACEHOLDER\\":\\"よろしければ、こちらにメッセージを入力してください。\\",\\"SHARE\\":\\"共有\\",\\"REFRESH_CONTACTS\\":\\"連絡先を更新\\",\\"LOGOUT\\":\\"ログアウト\\",\\"SIGNIN\\":\\"ログイン\\",\\"SIGNIN_HEADING\\":\\"ログインして Slack に共有\\",\\"SIGNIN_DESCRIPTION\\":\\"ファイルを共有するため、Photoshop が Slack の連絡先とチャンネル情報にアクセスする必要があります。\\",\\"SIGNIN_LOADING\\":\\"ブラウザーの Slack にログイン\\",\\"SENDING_TITLE\\":\\"Slack に送信中...\\",\\"TOAST_SHARE_SUCCESS\\":\\"正常に共有されています\\",\\"TOAST_SHARE_ERROR\\":\\"共有できませんでした\\",\\"TOAST_NETWORK_ERROR\\":\\"ネットワークの問題。後でもう一度試してください\\",\\"TOAST_SIGNIN_ERROR\\":\\"ログインに失敗しました。再試行してください。\\",\\"OFFLINE_TITLE\\":\\"オフライン\\",\\"OFFLINE_DESCRIPTION\\":\\"共有サービスを使用するため、インターネットに再接続してください。\\",\\"LOADING_CONTACTS_TITLE\\":\\"Slack から読み込み中...\\",\\"INVITE_TITLE\\":\\"編集に招待\\",\\"INVITE_DESCRIPTION\\":\\"ファイルで他のユーザーと共同作業\\",\\"REVIEW_TITLE\\":\\"レビュー用に共有\\",\\"REVIEW_DESCRIPTION\\":\\"リンクを作成してフィードバックを収集\\",\\"REVIEW_DISABLED_GENERIC\\":\\"近日リリース\\",\\"REVIEW_DISABLED_SHARED_DOC\\":\\"共有ファイルがまもなく利用可能\\",\\"SEND_TO_APPS_TITLE\\":\\"アプリに送信\\",\\"SEND_TO_APPS_DESCRIPTION\\":\\"コピーを外部アプリに送信\\",\\"QUICK_EXPORT_TITLE\\":\\"クイック書き出し形式 :\\",\\"QUICK_EXPORT_DESCRIPTION\\":\\"ワンクリックで書き出し\\",\\"SIZE_SETTING_TITLE\\":\\"サイズ設定\\",\\"FORMAT_DESCRIPTION\\":\\"共有する形式\\",\\"SHARING_DESCRIPTION_PREFIX\\":\\"次で共有 :\\",\\"SHARING_DESCRIPTION_SUFFIX\\":\\"ファイル形式\\",\\"SIZE_ORIGINAL\\":\\"元画像\\",\\"SIZE_SMALL\\":\\"小\\",\\"COPY_TO_CLIPBOARD_TITLE\\":\\"クリップボードにコピー\\",\\"COPY_TO_CLIPBOARD_TOOLTIP\\":\\"PSD ファイルをクリップボードにコピーできません。PNG または JPG を使用してみてください。\\",\\"COPY_TO_CLIPBOARD_SUCCESS\\":\\"画像がクリップボードにコピーされました\\",\\"DIMENSION_ORIGINAL_SUFFIX\\":\\"元のサイズ\\",\\"DIMENSION_SMALL_SUFFIX\\":\\": オリジナル\\",\\"CHARACTERS_REMAINING\\":\\"残りの文字数\\",\\"OTHER_APPS_TITLE\\":\\"その他のアプリ\\",\\"REVIEW_DISABLED_DESCRIPTION\\":\\"新しいファイルとして保存して続行\\"}");//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTI3LmpzIiwic291cmNlcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///127\n')},function(module){eval('module.exports = JSON.parse("{\\"SLACK_TITLE\\":\\"Slack을 통해 공유\\",\\"SLACK_DESCRIPTION\\":\\"Slack에 작업 공유\\",\\"SLACK_PANEL_HEADING\\":\\"Slack에 공유\\",\\"CANCEL\\":\\"취소\\",\\"FORMAT_LABEL\\":\\"공유할 형식\\",\\"FORMAT_PLACEHOLDER\\":\\"파일 형식 선택\\",\\"FORMAT_DESCRIPTION_START\\":\\"파일이 다음에 공유됩니다. \\",\\"FORMAT_DESCRIPTION_END\\":\\" 포맷.\\",\\"DESTINATION_LABEL\\":\\"대상\\",\\"DESTINATION_PLACEHOLDER\\":\\"이름 또는 채널로 검색\\",\\"MESSAGE_LABEL\\":\\"메시지(선택 사항)\\",\\"MESSAGE_PLACEHOLDER\\":\\"원하는 경우 여기에 메시지를 입력하세요!\\",\\"SHARE\\":\\"공유\\",\\"REFRESH_CONTACTS\\":\\"연락처 새로 고침\\",\\"LOGOUT\\":\\"로그아웃\\",\\"SIGNIN\\":\\"로그인\\",\\"SIGNIN_HEADING\\":\\"로그인하여 Slack에 공유\\",\\"SIGNIN_DESCRIPTION\\":\\"파일을 공유하려면 Photoshop에서 Slack 연락처 및 채널 정보에 액세스해야 합니다.\\",\\"SIGNIN_LOADING\\":\\"브라우저에서 Slack에 로그인\\",\\"SENDING_TITLE\\":\\"Slack으로 전송 중...\\",\\"TOAST_SHARE_SUCCESS\\":\\"공유가 완료되었습니다.\\",\\"TOAST_SHARE_ERROR\\":\\"공유할 수 없음\\",\\"TOAST_NETWORK_ERROR\\":\\"네트워크 문제입니다. 나중에 다시 시도하세요.\\",\\"TOAST_SIGNIN_ERROR\\":\\"로그인하지 못했습니다. 다시 시도해 주세요.\\",\\"OFFLINE_TITLE\\":\\"오프라인\\",\\"OFFLINE_DESCRIPTION\\":\\"공유 서비스를 사용하려면 인터넷에 다시 연결하세요.\\",\\"LOADING_CONTACTS_TITLE\\":\\"Slack에서 로드 중...\\",\\"INVITE_TITLE\\":\\"편집하도록 초대\\",\\"INVITE_DESCRIPTION\\":\\"다른 사용자와 파일 작업\\",\\"REVIEW_TITLE\\":\\"검토용으로 공유\\",\\"REVIEW_DESCRIPTION\\":\\"피드백을 캡처할 링크 만들기\\",\\"REVIEW_DISABLED_GENERIC\\":\\"곧 출시 예정\\",\\"REVIEW_DISABLED_SHARED_DOC\\":\\"공유 파일 제공 예정\\",\\"SEND_TO_APPS_TITLE\\":\\"앱으로 전송\\",\\"SEND_TO_APPS_DESCRIPTION\\":\\"외부 앱으로 사본 보내기\\",\\"QUICK_EXPORT_TITLE\\":\\"빠른 내보내기 형식\\",\\"QUICK_EXPORT_DESCRIPTION\\":\\"원클릭 내보내기\\",\\"SIZE_SETTING_TITLE\\":\\"크기 설정\\",\\"FORMAT_DESCRIPTION\\":\\"공유할 형식\\",\\"SHARING_DESCRIPTION_PREFIX\\":\\"공유 위치\\",\\"SHARING_DESCRIPTION_SUFFIX\\":\\"형식\\",\\"SIZE_ORIGINAL\\":\\"원본\\",\\"SIZE_SMALL\\":\\"소\\",\\"COPY_TO_CLIPBOARD_TITLE\\":\\"클립보드에 복사\\",\\"COPY_TO_CLIPBOARD_TOOLTIP\\":\\"PSD 파일을 클립보드에 복사할 수 없습니다. 대신 PNG나 JPG를 사용해 보세요.\\",\\"COPY_TO_CLIPBOARD_SUCCESS\\":\\"이미지가 클립보드에 복사됨\\",\\"DIMENSION_ORIGINAL_SUFFIX\\":\\"원래 크기\\",\\"DIMENSION_SMALL_SUFFIX\\":\\"원본\\",\\"CHARACTERS_REMAINING\\":\\"남은 문자\\",\\"OTHER_APPS_TITLE\\":\\"기타 앱\\",\\"REVIEW_DISABLED_DESCRIPTION\\":\\"계속하려면 새 파일로 저장\\"}");//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTI4LmpzIiwic291cmNlcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///128\n')},function(module){eval('module.exports = JSON.parse("{\\"SLACK_TITLE\\":\\"Del via Slack\\",\\"SLACK_DESCRIPTION\\":\\"Del arbeidet ditt til Slack\\",\\"SLACK_PANEL_HEADING\\":\\"Del til Slack\\",\\"CANCEL\\":\\"Avbryt\\",\\"FORMAT_LABEL\\":\\"Format for deling\\",\\"FORMAT_PLACEHOLDER\\":\\"Velg filformat\\",\\"FORMAT_DESCRIPTION_START\\":\\"Filen kan deles i \\",\\"FORMAT_DESCRIPTION_END\\":\\" format.\\",\\"DESTINATION_LABEL\\":\\"Mål\\",\\"DESTINATION_PLACEHOLDER\\":\\"Søk etter navn eller kanal\\",\\"MESSAGE_LABEL\\":\\"Melding (valgfritt)\\",\\"MESSAGE_PLACEHOLDER\\":\\"Skriv inn en melding her hvis du vil.\\",\\"SHARE\\":\\"Del\\",\\"REFRESH_CONTACTS\\":\\"Oppdater kontakter\\",\\"LOGOUT\\":\\"Logg av\\",\\"SIGNIN\\":\\"Logg på\\",\\"SIGNIN_HEADING\\":\\"Logg på for å dele til Slack\\",\\"SIGNIN_DESCRIPTION\\":\\"Hvis du vil dele filen, trenger Photoshop tilgang til Slack-kontaktene dine og kanalinformasjon.\\",\\"SIGNIN_LOADING\\":\\"Logg på Slack i nettleseren din\\",\\"SENDING_TITLE\\":\\"Sender til Slack ...\\",\\"TOAST_SHARE_SUCCESS\\":\\"ble delt\\",\\"TOAST_SHARE_ERROR\\":\\"kunne ikke deles\\",\\"TOAST_NETWORK_ERROR\\":\\"Problem med nettverket. Prøv igjen senere.\\",\\"TOAST_SIGNIN_ERROR\\":\\"Pålogging mislyktes. Prøv igjen.\\",\\"OFFLINE_TITLE\\":\\"Frakoblet\\",\\"OFFLINE_DESCRIPTION\\":\\"Koble til internett igjen for å kunne bruke delingstjenestene våre.\\",\\"LOADING_CONTACTS_TITLE\\":\\"Laster fra Slack ...\\",\\"INVITE_TITLE\\":\\"Inviter andre til å redigere\\",\\"INVITE_DESCRIPTION\\":\\"Jobb med andre i filen din\\",\\"REVIEW_TITLE\\":\\"Del for gjennomgang\\",\\"REVIEW_DESCRIPTION\\":\\"Opprett en kobling for å få tilbakemeldinger\\",\\"REVIEW_DISABLED_GENERIC\\":\\"Kommer snart\\",\\"REVIEW_DISABLED_SHARED_DOC\\":\\"Kommer snart for delte filer\\",\\"SEND_TO_APPS_TITLE\\":\\"Send til apper\\",\\"SEND_TO_APPS_DESCRIPTION\\":\\"Send en kopi til en ekstern app\\",\\"QUICK_EXPORT_TITLE\\":\\"Hurtigeksporter som\\",\\"QUICK_EXPORT_DESCRIPTION\\":\\"Eksporter med ett klikk\\",\\"SIZE_SETTING_TITLE\\":\\"Størrelsesinnstillinger\\",\\"FORMAT_DESCRIPTION\\":\\"Format for deling\\",\\"SHARING_DESCRIPTION_PREFIX\\":\\"Deler i\\",\\"SHARING_DESCRIPTION_SUFFIX\\":\\"format\\",\\"SIZE_ORIGINAL\\":\\"Original\\",\\"SIZE_SMALL\\":\\"Liten\\",\\"COPY_TO_CLIPBOARD_TITLE\\":\\"Kopier til utklippstavlen\\",\\"COPY_TO_CLIPBOARD_TOOLTIP\\":\\"PSD-filer kan ikke kopieres til utklippstavlen. Prøv å bruke PNG eller JPG i stedet.\\",\\"COPY_TO_CLIPBOARD_SUCCESS\\":\\"Bilde kopiert til utklippstavlen\\",\\"DIMENSION_ORIGINAL_SUFFIX\\":\\"Original størrelse\\",\\"DIMENSION_SMALL_SUFFIX\\":\\"av original\\",\\"CHARACTERS_REMAINING\\":\\"Gjenværende tegn\\",\\"OTHER_APPS_TITLE\\":\\"Andre apper\\",\\"REVIEW_DISABLED_DESCRIPTION\\":\\"Lagre som ny fil for å fortsette\\"}");//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTI5LmpzIiwic291cmNlcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///129\n')},function(module){eval('module.exports = JSON.parse("{\\"SLACK_TITLE\\":\\"Delen via Slack\\",\\"SLACK_DESCRIPTION\\":\\"Uw werk delen op Slack\\",\\"SLACK_PANEL_HEADING\\":\\"Delen op Slack\\",\\"CANCEL\\":\\"Annuleren\\",\\"FORMAT_LABEL\\":\\"Indeling voor delen\\",\\"FORMAT_PLACEHOLDER\\":\\"Kies een bestandsindeling\\",\\"FORMAT_DESCRIPTION_START\\":\\"Het bestand wordt gedeeld in de indeling\\",\\"FORMAT_DESCRIPTION_END\\":\\".\\",\\"DESTINATION_LABEL\\":\\"Bestemming\\",\\"DESTINATION_PLACEHOLDER\\":\\"Zoeken op naam of kanaal\\",\\"MESSAGE_LABEL\\":\\"Bericht (optioneel)\\",\\"MESSAGE_PLACEHOLDER\\":\\"Typ hier een bericht als u dat wilt.\\",\\"SHARE\\":\\"Delen\\",\\"REFRESH_CONTACTS\\":\\"Contactpersonen vernieuwen\\",\\"LOGOUT\\":\\"Afmelden\\",\\"SIGNIN\\":\\"Aanmelden\\",\\"SIGNIN_HEADING\\":\\"Meld u aan om te delen op Slack\\",\\"SIGNIN_DESCRIPTION\\":\\"Als u het bestand wilt delen, heeft Photoshop toegang nodig tot de gegevens van uw Slack-contactpersonen en -kanalen.\\",\\"SIGNIN_LOADING\\":\\"Aanmelden bij Slack in uw browser\\",\\"SENDING_TITLE\\":\\"Verzenden naar Slack...\\",\\"TOAST_SHARE_SUCCESS\\":\\"is gedeeld\\",\\"TOAST_SHARE_ERROR\\":\\"kan niet worden gedeeld\\",\\"TOAST_NETWORK_ERROR\\":\\"Netwerkprobleem, probeer het later opnieuw\\",\\"TOAST_SIGNIN_ERROR\\":\\"Aanmelden mislukt. Probeer het opnieuw.\\",\\"OFFLINE_TITLE\\":\\"Offline\\",\\"OFFLINE_DESCRIPTION\\":\\"Maak opnieuw verbinding met internet om gebruik te maken van onze deelservices.\\",\\"LOADING_CONTACTS_TITLE\\":\\"Laden uit Slack...\\",\\"INVITE_TITLE\\":\\"Uitnodigen om te bewerken\\",\\"INVITE_DESCRIPTION\\":\\"Met anderen werken in uw bestand\\",\\"REVIEW_TITLE\\":\\"Delen voor revisie\\",\\"REVIEW_DESCRIPTION\\":\\"Een koppeling maken om feedback te verzamelen\\",\\"REVIEW_DISABLED_GENERIC\\":\\"Binnenkort beschikbaar\\",\\"REVIEW_DISABLED_SHARED_DOC\\":\\"Binnenkort beschikbaar voor gedeelde bestanden\\",\\"SEND_TO_APPS_TITLE\\":\\"Verzenden naar apps\\",\\"SEND_TO_APPS_DESCRIPTION\\":\\"Kopie verzenden naar een externe app\\",\\"QUICK_EXPORT_TITLE\\":\\"Snel exporteren als\\",\\"QUICK_EXPORT_DESCRIPTION\\":\\"Exporteren met één klik\\",\\"SIZE_SETTING_TITLE\\":\\"Instellingen voor grootte\\",\\"FORMAT_DESCRIPTION\\":\\"Indeling voor delen\\",\\"SHARING_DESCRIPTION_PREFIX\\":\\"Delen in\\",\\"SHARING_DESCRIPTION_SUFFIX\\":\\"Formaat\\",\\"SIZE_ORIGINAL\\":\\"Origineel\\",\\"SIZE_SMALL\\":\\"Klein\\",\\"COPY_TO_CLIPBOARD_TITLE\\":\\"Naar klembord kopiëren\\",\\"COPY_TO_CLIPBOARD_TOOLTIP\\":\\"PSD-bestanden kunnen niet naar het klembord worden gekopieerd. Probeer in plaats daarvan PNG of JPG.\\",\\"COPY_TO_CLIPBOARD_SUCCESS\\":\\"Afbeelding naar klembord gekopieerd\\",\\"DIMENSION_ORIGINAL_SUFFIX\\":\\"Oorspronkelijke grootte\\",\\"DIMENSION_SMALL_SUFFIX\\":\\"van origineel\\",\\"CHARACTERS_REMAINING\\":\\"Resterende tekens\\",\\"OTHER_APPS_TITLE\\":\\"Andere apps\\",\\"REVIEW_DISABLED_DESCRIPTION\\":\\"Opslaan als een nieuw bestand om door te gaan\\"}");//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTMwLmpzIiwic291cmNlcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///130\n')},function(module){eval('module.exports = JSON.parse("{\\"SLACK_TITLE\\":\\"Udostępnij przez Slacka\\",\\"SLACK_DESCRIPTION\\":\\"Udostępnij swoją pracę na Slacku\\",\\"SLACK_PANEL_HEADING\\":\\"Udostępnij na Slacku\\",\\"CANCEL\\":\\"Anuluj\\",\\"FORMAT_LABEL\\":\\"Format do udostępnienia\\",\\"FORMAT_PLACEHOLDER\\":\\"Wybierz format pliku\\",\\"FORMAT_DESCRIPTION_START\\":\\"Plik zostanie udostępniony w: \\",\\"FORMAT_DESCRIPTION_END\\":\\" (format).\\",\\"DESTINATION_LABEL\\":\\"Miejsce docelowe\\",\\"DESTINATION_PLACEHOLDER\\":\\"Wyszukaj według nazwy lub kanału\\",\\"MESSAGE_LABEL\\":\\"Wiadomość (opcjonalnie)\\",\\"MESSAGE_PLACEHOLDER\\":\\"Wpisz tutaj wiadomość, jeśli chcesz!\\",\\"SHARE\\":\\"Udostępnij\\",\\"REFRESH_CONTACTS\\":\\"Odśwież kontakty\\",\\"LOGOUT\\":\\"Wyloguj się\\",\\"SIGNIN\\":\\"Zaloguj się\\",\\"SIGNIN_HEADING\\":\\"Zaloguj się, aby udostępnić na Slacku\\",\\"SIGNIN_DESCRIPTION\\":\\"Aby udostępnić plik, program Photoshop potrzebuje dostępu do kontaktów i informacji o kanałach na Slacku.\\",\\"SIGNIN_LOADING\\":\\"Zaloguj się do Slacka w przeglądarce\\",\\"SENDING_TITLE\\":\\"Wysyłanie do Slacka…\\",\\"TOAST_SHARE_SUCCESS\\":\\"— udostępniono pomyślnie\\",\\"TOAST_SHARE_ERROR\\":\\"— nie można udostępnić\\",\\"TOAST_NETWORK_ERROR\\":\\"Problem z siecią, spróbuj ponownie później\\",\\"TOAST_SIGNIN_ERROR\\":\\"Logowanie nie powiodło się. Spróbuj ponownie.\\",\\"OFFLINE_TITLE\\":\\"Offline\\",\\"OFFLINE_DESCRIPTION\\":\\"Połącz się ponownie z Internetem, aby skorzystać z naszych usług udostępniania.\\",\\"LOADING_CONTACTS_TITLE\\":\\"Ładowanie ze Slacka…\\",\\"INVITE_TITLE\\":\\"Zaproszenie do edycji\\",\\"INVITE_DESCRIPTION\\":\\"Pracuj nad plikiem z innymi\\",\\"REVIEW_TITLE\\":\\"Udostępnij do recenzji\\",\\"REVIEW_DESCRIPTION\\":\\"Utwórz łącze w celu uzyskania opinii\\",\\"REVIEW_DISABLED_GENERIC\\":\\"Już wkrótce\\",\\"REVIEW_DISABLED_SHARED_DOC\\":\\"Już wkrótce dla plików udostępnionych\\",\\"SEND_TO_APPS_TITLE\\":\\"Prześlij do aplikacji\\",\\"SEND_TO_APPS_DESCRIPTION\\":\\"Wyślij kopię do aplikacji zewnętrznej\\",\\"QUICK_EXPORT_TITLE\\":\\"Szybki eksport jako\\",\\"QUICK_EXPORT_DESCRIPTION\\":\\"Błyskawiczny eksport\\",\\"SIZE_SETTING_TITLE\\":\\"Ustawienia rozmiaru\\",\\"FORMAT_DESCRIPTION\\":\\"Format do udostępnienia\\",\\"SHARING_DESCRIPTION_PREFIX\\":\\"Udostępnianie w\\",\\"SHARING_DESCRIPTION_SUFFIX\\":\\"format\\",\\"SIZE_ORIGINAL\\":\\"Oryginalny\\",\\"SIZE_SMALL\\":\\"Mały\\",\\"COPY_TO_CLIPBOARD_TITLE\\":\\"Kopiuj do schowka\\",\\"COPY_TO_CLIPBOARD_TOOLTIP\\":\\"Nie można skopiować plików PSD do schowka. Zamiast tego spróbuj użyć plików PNG lub JPG.\\",\\"COPY_TO_CLIPBOARD_SUCCESS\\":\\"Skopiowano obraz do schowka\\",\\"DIMENSION_ORIGINAL_SUFFIX\\":\\"Oryginalny rozmiar\\",\\"DIMENSION_SMALL_SUFFIX\\":\\"z oryginału\\",\\"CHARACTERS_REMAINING\\":\\"Pozostałe znaki\\",\\"OTHER_APPS_TITLE\\":\\"Inne aplikacje\\",\\"REVIEW_DISABLED_DESCRIPTION\\":\\"Zapisz jako nowy plik, aby kontynuować\\"}");//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTMxLmpzIiwic291cmNlcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///131\n')},function(module){eval('module.exports = JSON.parse("{\\"SLACK_TITLE\\":\\"Compartilhar através do Slack\\",\\"SLACK_DESCRIPTION\\":\\"Compartilhe seu trabalho com o Slack\\",\\"SLACK_PANEL_HEADING\\":\\"Compartilhar com o Slack\\",\\"CANCEL\\":\\"Cancelar\\",\\"FORMAT_LABEL\\":\\"Formatar para compartilhar\\",\\"FORMAT_PLACEHOLDER\\":\\"Escolha um formato de arquivo\\",\\"FORMAT_DESCRIPTION_START\\":\\"O arquivo será compartilhado no \\",\\"FORMAT_DESCRIPTION_END\\":\\" formato.\\",\\"DESTINATION_LABEL\\":\\"Destino\\",\\"DESTINATION_PLACEHOLDER\\":\\"Pesquise por nome ou canal\\",\\"MESSAGE_LABEL\\":\\"Mensagem (opcional)\\",\\"MESSAGE_PLACEHOLDER\\":\\"Digite uma mensagem aqui, se você quiser.\\",\\"SHARE\\":\\"Compartilhar\\",\\"REFRESH_CONTACTS\\":\\"Atualizar contatos\\",\\"LOGOUT\\":\\"Fazer logoff\\",\\"SIGNIN\\":\\"Login\\",\\"SIGNIN_HEADING\\":\\"Faça logon para compartilhar no Slack\\",\\"SIGNIN_DESCRIPTION\\":\\"Para compartilhar o arquivo, o Photoshop precisa de acesso às informações de seus contatos e canais do Slack.\\",\\"SIGNIN_LOADING\\":\\"Faça login no Slack em seu navegador\\",\\"SENDING_TITLE\\":\\"Enviando para o Slack...\\",\\"TOAST_SHARE_SUCCESS\\":\\"foi compartilhado com sucesso\\",\\"TOAST_SHARE_ERROR\\":\\"não pôde ser compartilhado\\",\\"TOAST_NETWORK_ERROR\\":\\"Problema de rede, tente novamente mais tarde\\",\\"TOAST_SIGNIN_ERROR\\":\\"Falha ao fazer logon. Tente novamente.\\",\\"OFFLINE_TITLE\\":\\"Off-line\\",\\"OFFLINE_DESCRIPTION\\":\\"Reconecte-se à Internet para usar nossos serviços de compartilhamento.\\",\\"LOADING_CONTACTS_TITLE\\":\\"Carregando a partir do Slack...\\",\\"INVITE_TITLE\\":\\"Convidar para editar\\",\\"INVITE_DESCRIPTION\\":\\"Trabalhe com outras pessoas em seu arquivo\\",\\"REVIEW_TITLE\\":\\"Compartilhar para revisão\\",\\"REVIEW_DESCRIPTION\\":\\"Crie um link para capturar feedback\\",\\"REVIEW_DISABLED_GENERIC\\":\\"Em breve\\",\\"REVIEW_DISABLED_SHARED_DOC\\":\\"Em breve para arquivos compartilhados\\",\\"SEND_TO_APPS_TITLE\\":\\"Enviar para os aplicativos\\",\\"SEND_TO_APPS_DESCRIPTION\\":\\"Enviar uma cópia para aplic. externo\\",\\"QUICK_EXPORT_TITLE\\":\\"Exportação rápida como\\",\\"QUICK_EXPORT_DESCRIPTION\\":\\"Exportação com um clique\\",\\"SIZE_SETTING_TITLE\\":\\"Configurações de tamanho\\",\\"FORMAT_DESCRIPTION\\":\\"Formatar para compartilhar\\",\\"SHARING_DESCRIPTION_PREFIX\\":\\"Compartilhando em\\",\\"SHARING_DESCRIPTION_SUFFIX\\":\\"formato\\",\\"SIZE_ORIGINAL\\":\\"Original\\",\\"SIZE_SMALL\\":\\"Pequeno\\",\\"COPY_TO_CLIPBOARD_TITLE\\":\\"Copiar para área de transferência\\",\\"COPY_TO_CLIPBOARD_TOOLTIP\\":\\"Os arquivos PSD não podem ser copiados para a área de transferência. Tente usar PNG ou JPG.\\",\\"COPY_TO_CLIPBOARD_SUCCESS\\":\\"Imagem copiada para a área de transferência.\\",\\"DIMENSION_ORIGINAL_SUFFIX\\":\\"Tamanho original\\",\\"DIMENSION_SMALL_SUFFIX\\":\\"do original\\",\\"CHARACTERS_REMAINING\\":\\"Caracteres restantes:\\",\\"OTHER_APPS_TITLE\\":\\"Outros aplicativos\\",\\"REVIEW_DISABLED_DESCRIPTION\\":\\"Salvar como um novo arquivo para continuar\\"}");//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTMyLmpzIiwic291cmNlcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///132\n')},function(module){eval('module.exports = JSON.parse("{\\"SLACK_TITLE\\":\\"Поделиться через Slack\\",\\"SLACK_DESCRIPTION\\":\\"Поделитесь работой в Slack\\",\\"SLACK_PANEL_HEADING\\":\\"Поделиться в Slack\\",\\"CANCEL\\":\\"Отмена\\",\\"FORMAT_LABEL\\":\\"Формат для доступа\\",\\"FORMAT_PLACEHOLDER\\":\\"Выберите формат файла\\",\\"FORMAT_DESCRIPTION_START\\":\\"Файл будет открыт для доступа в формате \\",\\"FORMAT_DESCRIPTION_END\\":\\" .\\",\\"DESTINATION_LABEL\\":\\"Место назначения\\",\\"DESTINATION_PLACEHOLDER\\":\\"Поиск по имени или каналу\\",\\"MESSAGE_LABEL\\":\\"Сообщение (необязательно)\\",\\"MESSAGE_PLACEHOLDER\\":\\"Если хотите, введите здесь сообщение.\\",\\"SHARE\\":\\"Поделиться\\",\\"REFRESH_CONTACTS\\":\\"Обновить контакты\\",\\"LOGOUT\\":\\"Выйти\\",\\"SIGNIN\\":\\"Войти\\",\\"SIGNIN_HEADING\\":\\"Войдите, чтобы поделиться в Slack\\",\\"SIGNIN_DESCRIPTION\\":\\"Чтобы поделиться файлом, предоставьте программе Photoshop доступ к вашим контактам Slack и сведениям о канале.\\",\\"SIGNIN_LOADING\\":\\"Войдите в Slack в браузере\\",\\"SENDING_TITLE\\":\\"Отправка в Slack...\\",\\"TOAST_SHARE_SUCCESS\\":\\"— доступ предоставлен\\",\\"TOAST_SHARE_ERROR\\":\\"— не удалось предоставить доступ\\",\\"TOAST_NETWORK_ERROR\\":\\"Ошибка сети. Повторите попытку позже\\",\\"TOAST_SIGNIN_ERROR\\":\\"Сбой входа. Повторите попытку.\\",\\"OFFLINE_TITLE\\":\\"Автономно\\",\\"OFFLINE_DESCRIPTION\\":\\"Повторно подключитесь к Интернету, чтобы использовать сервисы предоставления доступа\\",\\"LOADING_CONTACTS_TITLE\\":\\"Загрузка из Slack...\\",\\"INVITE_TITLE\\":\\"Пригласить для редактирования\\",\\"INVITE_DESCRIPTION\\":\\"Совместная работа в вашем файле\\",\\"REVIEW_TITLE\\":\\"Поделиться для проверки\\",\\"REVIEW_DESCRIPTION\\":\\"Создайте ссылку, чтобы получить отзывы\\",\\"REVIEW_DISABLED_GENERIC\\":\\"В ближайшее время\\",\\"REVIEW_DISABLED_SHARED_DOC\\":\\"Скоро для общих файлов\\",\\"SEND_TO_APPS_TITLE\\":\\"Отправить в приложения\\",\\"SEND_TO_APPS_DESCRIPTION\\":\\"Отправить копию\\",\\"QUICK_EXPORT_TITLE\\":\\"Быстрый экспорт как\\",\\"QUICK_EXPORT_DESCRIPTION\\":\\"Экспорт в один клик\\",\\"SIZE_SETTING_TITLE\\":\\"Настройки размера\\",\\"FORMAT_DESCRIPTION\\":\\"Формат для доступа\\",\\"SHARING_DESCRIPTION_PREFIX\\":\\"Предоставление доступа в\\",\\"SHARING_DESCRIPTION_SUFFIX\\":\\"формат\\",\\"SIZE_ORIGINAL\\":\\"Исходное\\",\\"SIZE_SMALL\\":\\"Малая\\",\\"COPY_TO_CLIPBOARD_TITLE\\":\\"Копировать в буфер обмена\\",\\"COPY_TO_CLIPBOARD_TOOLTIP\\":\\"Файлы PSD невозможно скопировать в буфер обмена. Попробуйте формат PNG или JPG.\\",\\"COPY_TO_CLIPBOARD_SUCCESS\\":\\"Изображение скопировано в буфер обмена\\",\\"DIMENSION_ORIGINAL_SUFFIX\\":\\"Исходный размер\\",\\"DIMENSION_SMALL_SUFFIX\\":\\"оригинала\\",\\"CHARACTERS_REMAINING\\":\\"Осталось символов\\",\\"OTHER_APPS_TITLE\\":\\"Другие приложения\\",\\"REVIEW_DISABLED_DESCRIPTION\\":\\"Сохранить как новый файл и продолжить\\"}");//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTMzLmpzIiwic291cmNlcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///133\n')},function(module){eval('module.exports = JSON.parse("{\\"SLACK_TITLE\\":\\"Dela via Slack\\",\\"SLACK_DESCRIPTION\\":\\"Dela med dig av ditt arbete till Slack\\",\\"SLACK_PANEL_HEADING\\":\\"Dela till Slack\\",\\"CANCEL\\":\\"Avbryt\\",\\"FORMAT_LABEL\\":\\"Format att dela\\",\\"FORMAT_PLACEHOLDER\\":\\"Välj filformat\\",\\"FORMAT_DESCRIPTION_START\\":\\"Filen delas i \\",\\"FORMAT_DESCRIPTION_END\\":\\"-format.\\",\\"DESTINATION_LABEL\\":\\"Mål\\",\\"DESTINATION_PLACEHOLDER\\":\\"Sök efter namn eller kanal\\",\\"MESSAGE_LABEL\\":\\"Meddelande (valfritt)\\",\\"MESSAGE_PLACEHOLDER\\":\\"Skriv ett meddelande här, om du vill!\\",\\"SHARE\\":\\"Dela\\",\\"REFRESH_CONTACTS\\":\\"Uppdatera kontakter\\",\\"LOGOUT\\":\\"Logga ut\\",\\"SIGNIN\\":\\"Logga in\\",\\"SIGNIN_HEADING\\":\\"Logga in för att dela till Slack\\",\\"SIGNIN_DESCRIPTION\\":\\"Om du vill dela filen måste Photoshop ha åtkomst till informationen om Slack-kontakter och -kanaler.\\",\\"SIGNIN_LOADING\\":\\"Logga in på Slack i webbläsaren\\",\\"SENDING_TITLE\\":\\"Skickar till Slack...\\",\\"TOAST_SHARE_SUCCESS\\":\\"har delats\\",\\"TOAST_SHARE_ERROR\\":\\"kunde inte delas\\",\\"TOAST_NETWORK_ERROR\\":\\"Nätverksproblem, försök igen senare\\",\\"TOAST_SIGNIN_ERROR\\":\\"Inloggningen misslyckades. Försök igen.\\",\\"OFFLINE_TITLE\\":\\"Offline\\",\\"OFFLINE_DESCRIPTION\\":\\"Återanslut till internet för att kunna använda våra delningstjänster.\\",\\"LOADING_CONTACTS_TITLE\\":\\"Läser in från Slack...\\",\\"INVITE_TITLE\\":\\"Bjud in att redigera\\",\\"INVITE_DESCRIPTION\\":\\"Arbeta med andra i filen\\",\\"REVIEW_TITLE\\":\\"Dela för granskning\\",\\"REVIEW_DESCRIPTION\\":\\"Skapa en länk för att samla in feedback\\",\\"REVIEW_DISABLED_GENERIC\\":\\"Kommer snart\\",\\"REVIEW_DISABLED_SHARED_DOC\\":\\"Snart tillgängligt för delade filer\\",\\"SEND_TO_APPS_TITLE\\":\\"Skicka till appar\\",\\"SEND_TO_APPS_DESCRIPTION\\":\\"Skicka en kopia till en extern app\\",\\"QUICK_EXPORT_TITLE\\":\\"Snabbexportera som\\",\\"QUICK_EXPORT_DESCRIPTION\\":\\"Exportera med ett klick\\",\\"SIZE_SETTING_TITLE\\":\\"Storleksinställningar\\",\\"FORMAT_DESCRIPTION\\":\\"Format att dela\\",\\"SHARING_DESCRIPTION_PREFIX\\":\\"Delas i\\",\\"SHARING_DESCRIPTION_SUFFIX\\":\\"format\\",\\"SIZE_ORIGINAL\\":\\"Original\\",\\"SIZE_SMALL\\":\\"Liten\\",\\"COPY_TO_CLIPBOARD_TITLE\\":\\"Kopiera till Urklipp\\",\\"COPY_TO_CLIPBOARD_TOOLTIP\\":\\"PSD-filer kan inte kopieras till urklipp. Försök använda PNG eller JPG istället.\\",\\"COPY_TO_CLIPBOARD_SUCCESS\\":\\"Bild har kopierats till Urklipp\\",\\"DIMENSION_ORIGINAL_SUFFIX\\":\\"Ursprunglig storlek\\",\\"DIMENSION_SMALL_SUFFIX\\":\\"av originalet\\",\\"CHARACTERS_REMAINING\\":\\"Återstående tecken\\",\\"OTHER_APPS_TITLE\\":\\"Andra appar\\",\\"REVIEW_DISABLED_DESCRIPTION\\":\\"Spara som en ny fil för att fortsätta\\"}");//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTM0LmpzIiwic291cmNlcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///134\n')},function(module){eval('module.exports = JSON.parse("{\\"SLACK_TITLE\\":\\"[19472873] _üShare via Slack\\",\\"SLACK_DESCRIPTION\\":\\"[19472871] _üShare your work to Slack\\",\\"SLACK_PANEL_HEADING\\":\\"[19472872] _üShare to Slack\\",\\"CANCEL\\":\\"ยกเลิก\\",\\"FORMAT_LABEL\\":\\"[19472850] _üFormat to share\\",\\"FORMAT_PLACEHOLDER\\":\\"[19472851] _üChoose file format\\",\\"FORMAT_DESCRIPTION_START\\":\\"[19472849] _üThe file will be shared in \\",\\"FORMAT_DESCRIPTION_END\\":\\"[19472848] _ü format.\\",\\"DESTINATION_LABEL\\":\\"[19472846] _üDestination\\",\\"DESTINATION_PLACEHOLDER\\":\\"[19472847] _üSearch by name or channel\\",\\"MESSAGE_LABEL\\":\\"[19472856] _üMessage (optional)\\",\\"MESSAGE_PLACEHOLDER\\":\\"[19472857] _üType a message here, if you’d like!\\",\\"SHARE\\":\\"แบ่งปัน\\",\\"REFRESH_CONTACTS\\":\\"[19472860] _üRefresh contacts\\",\\"LOGOUT\\":\\"[19472855] _üLog out\\",\\"SIGNIN\\":\\"[19472867] _üSign in\\",\\"SIGNIN_HEADING\\":\\"[19472869] _üSign in to share to Slack\\",\\"SIGNIN_DESCRIPTION\\":\\"[19472868] _üTo share the file, Photoshop needs access to your Slack contacts and channels information.\\",\\"SIGNIN_LOADING\\":\\"[19472870] _üSign in to Slack in your browser\\",\\"SENDING_TITLE\\":\\"[19472865] _üSending to Slack...\\",\\"TOAST_SHARE_SUCCESS\\":\\"[19472876] _üis shared successfully\\",\\"TOAST_SHARE_ERROR\\":\\"[19472875] _ücould not be shared\\",\\"TOAST_NETWORK_ERROR\\":\\"[19472874] _üNetwork issue, please try again later\\",\\"TOAST_SIGNIN_ERROR\\":\\"[19472877] _üSign in failed. Please try again.\\",\\"OFFLINE_TITLE\\":\\"[19472859] _üOffline\\",\\"OFFLINE_DESCRIPTION\\":\\"[19472858] _üPlease reconnect to the internet in order to use our share services.\\",\\"LOADING_CONTACTS_TITLE\\":\\"[19472854] _üLoading from Slack...\\",\\"INVITE_TITLE\\":\\"[19472853] _üInvite to edit\\",\\"INVITE_DESCRIPTION\\":\\"[19472852] _üWork with others in your file\\",\\"REVIEW_TITLE\\":\\"[19472864] _üShare for review\\",\\"REVIEW_DESCRIPTION\\":\\"[19472861] _üCreate a link to capture feedback\\",\\"REVIEW_DISABLED_GENERIC\\":\\"เร็วๆ นี้\\",\\"REVIEW_DISABLED_SHARED_DOC\\":\\"[19472863] _üComing soon for shared files\\",\\"SEND_TO_APPS_TITLE\\":\\"[19821418] _üSend to apps\\",\\"SEND_TO_APPS_DESCRIPTION\\":\\"[19821417] _üSend a copy to an external app\\",\\"QUICK_EXPORT_TITLE\\":\\"[19821416] _üQuick export as\\",\\"QUICK_EXPORT_DESCRIPTION\\":\\"[19821415] _üOne-click export\\",\\"SIZE_SETTING_TITLE\\":\\"[19821422] _üSize settings\\",\\"FORMAT_DESCRIPTION\\":\\"[19821414] _üFormat to share\\",\\"SHARING_DESCRIPTION_PREFIX\\":\\"[19821419] _üSharing in\\",\\"SHARING_DESCRIPTION_SUFFIX\\":\\"[19821420] _üformat\\",\\"SIZE_ORIGINAL\\":\\"[19821421] _üOriginal\\",\\"SIZE_SMALL\\":\\"[19821423] _üSmall\\",\\"COPY_TO_CLIPBOARD_TITLE\\":\\"[19821410] _üCopy to clipboard\\",\\"COPY_TO_CLIPBOARD_TOOLTIP\\":\\"[19821411] _üPSD files can\'t be copied to clipboard. Try using PNG or JPG instead.\\",\\"COPY_TO_CLIPBOARD_SUCCESS\\":\\"[19821409] _üImage copied to clipboard\\",\\"DIMENSION_ORIGINAL_SUFFIX\\":\\"[19821412] _üOriginal size\\",\\"DIMENSION_SMALL_SUFFIX\\":\\"[19821413] _üof original\\",\\"CHARACTERS_REMAINING\\":\\"[19912265] _üCharacters remaining\\",\\"OTHER_APPS_TITLE\\":\\"[19912266] _üOther Apps\\",\\"REVIEW_DISABLED_DESCRIPTION\\":\\"[19960397] _üSave as a new file to continue\\"}");//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTM1LmpzIiwic291cmNlcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///135\n')},function(module){eval('module.exports = JSON.parse("{\\"SLACK_TITLE\\":\\"Slack üzerinden Paylaş\\",\\"SLACK_DESCRIPTION\\":\\"Çalışmanızı Slack\'te paylaşın\\",\\"SLACK_PANEL_HEADING\\":\\"Slack\'te Paylaş\\",\\"CANCEL\\":\\"İptal\\",\\"FORMAT_LABEL\\":\\"Paylaşılacak format\\",\\"FORMAT_PLACEHOLDER\\":\\"Dosya formatını seç\\",\\"FORMAT_DESCRIPTION_START\\":\\"Dosya\\",\\"FORMAT_DESCRIPTION_END\\":\\"formatında paylaşılacak.\\",\\"DESTINATION_LABEL\\":\\"Hedef\\",\\"DESTINATION_PLACEHOLDER\\":\\"Ada veya kanala göre ara\\",\\"MESSAGE_LABEL\\":\\"Mesaj (isteğe bağlı)\\",\\"MESSAGE_PLACEHOLDER\\":\\"İsterseniz buraya bir mesaj yazın!\\",\\"SHARE\\":\\"Paylaş\\",\\"REFRESH_CONTACTS\\":\\"Kişileri yenile\\",\\"LOGOUT\\":\\"Oturumu kapat\\",\\"SIGNIN\\":\\"Giriş yap\\",\\"SIGNIN_HEADING\\":\\"Slack\'te paylaşmak için giriş yap\\",\\"SIGNIN_DESCRIPTION\\":\\"Dosyayı paylaşmak için Photoshop\'un Slack kişilerinize ve kanal bilgilerinize erişmesi gerekiyor.\\",\\"SIGNIN_LOADING\\":\\"Tarayıcınızda Slack\'e giriş yapın\\",\\"SENDING_TITLE\\":\\"Slack\'e gönderiliyor...\\",\\"TOAST_SHARE_SUCCESS\\":\\"başarıyla paylaşıldı\\",\\"TOAST_SHARE_ERROR\\":\\"paylaşılamadı\\",\\"TOAST_NETWORK_ERROR\\":\\"Ağ sorunu, lütfen daha sonra tekrar deneyin\\",\\"TOAST_SIGNIN_ERROR\\":\\"Giriş yapma başarısız. Lütfen tekrar deneyin.\\",\\"OFFLINE_TITLE\\":\\"Çevrimdışı\\",\\"OFFLINE_DESCRIPTION\\":\\"Paylaşma hizmetlerimizi kullanmak için lütfen internete yeniden bağlanın.\\",\\"LOADING_CONTACTS_TITLE\\":\\"Slack\'ten yükleniyor...\\",\\"INVITE_TITLE\\":\\"Düzenlemeye davet et\\",\\"INVITE_DESCRIPTION\\":\\"Dosyanızda başkalarıyla birlikte çalışın\\",\\"REVIEW_TITLE\\":\\"İnceleme için paylaş\\",\\"REVIEW_DESCRIPTION\\":\\"Geri bildirim almak için bir bağlantı oluşturun\\",\\"REVIEW_DISABLED_GENERIC\\":\\"Çok yakında sizlerle\\",\\"REVIEW_DISABLED_SHARED_DOC\\":\\"Çok yakında paylaşılan dosyalar için sunulacak\\",\\"SEND_TO_APPS_TITLE\\":\\"Uygulamalara gönder\\",\\"SEND_TO_APPS_DESCRIPTION\\":\\"Harici bir uygulamaya kopyasını gönderin\\",\\"QUICK_EXPORT_TITLE\\":\\"Hızlı farklı dışa aktar:\\",\\"QUICK_EXPORT_DESCRIPTION\\":\\"Tek tıklatmayla dışa aktarma\\",\\"SIZE_SETTING_TITLE\\":\\"Boyut ayarları\\",\\"FORMAT_DESCRIPTION\\":\\"Paylaşılacak format\\",\\"SHARING_DESCRIPTION_PREFIX\\":\\"Paylaşılıyor:\\",\\"SHARING_DESCRIPTION_SUFFIX\\":\\"format\\",\\"SIZE_ORIGINAL\\":\\"Orijinal\\",\\"SIZE_SMALL\\":\\"Küçük\\",\\"COPY_TO_CLIPBOARD_TITLE\\":\\"Panoya kopyala\\",\\"COPY_TO_CLIPBOARD_TOOLTIP\\":\\"PSD dosyaları panoya kopyalanamıyor. Bunun yerine PNG veya JPG kullanmayı deneyin.\\",\\"COPY_TO_CLIPBOARD_SUCCESS\\":\\"Görüntü panoya kopyalandı\\",\\"DIMENSION_ORIGINAL_SUFFIX\\":\\"Orijinal boyut\\",\\"DIMENSION_SMALL_SUFFIX\\":\\"orijinalin\\",\\"CHARACTERS_REMAINING\\":\\"Kalan karakter\\",\\"OTHER_APPS_TITLE\\":\\"Diğer Uygulamalar\\",\\"REVIEW_DISABLED_DESCRIPTION\\":\\"Devam etmek için yeni bir dosya olarak kaydedin\\"}");//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTM2LmpzIiwic291cmNlcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///136\n')},function(module){eval('module.exports = JSON.parse("{\\"SLACK_TITLE\\":\\"Надіслати через Slack\\",\\"SLACK_DESCRIPTION\\":\\"Діліться своїми роботами через Slack\\",\\"SLACK_PANEL_HEADING\\":\\"Надіслати в Slack\\",\\"CANCEL\\":\\"Скасувати\\",\\"FORMAT_LABEL\\":\\"Формат для надсилання\\",\\"FORMAT_PLACEHOLDER\\":\\"Виберіть формат файлу\\",\\"FORMAT_DESCRIPTION_START\\":\\"Файл буде передано через \\",\\"FORMAT_DESCRIPTION_END\\":\\" формат.\\",\\"DESTINATION_LABEL\\":\\"Цільовий пункт\\",\\"DESTINATION_PLACEHOLDER\\":\\"Пошук за іменем або каналом\\",\\"MESSAGE_LABEL\\":\\"Повідомлення (необов’язково)\\",\\"MESSAGE_PLACEHOLDER\\":\\"За потреби тут можна ввести повідомлення.\\",\\"SHARE\\":\\"Ділитися\\",\\"REFRESH_CONTACTS\\":\\"Оновити контакти\\",\\"LOGOUT\\":\\"Вихід\\",\\"SIGNIN\\":\\"Вхід\\",\\"SIGNIN_HEADING\\":\\"Увійдіть у систему, щоб надсилати файли в Slack\\",\\"SIGNIN_DESCRIPTION\\":\\"Щоб надіслати файл, програмі Photoshop потрібен доступ до контактів і каналів Slack.\\",\\"SIGNIN_LOADING\\":\\"Увійдіть у Slack через браузер\\",\\"SENDING_TITLE\\":\\"Надсилання в Slack...\\",\\"TOAST_SHARE_SUCCESS\\":\\"надіслано\\",\\"TOAST_SHARE_ERROR\\":\\"неможливо надіслати\\",\\"TOAST_NETWORK_ERROR\\":\\"Збій мережі. Спробуйте ще раз пізніше\\",\\"TOAST_SIGNIN_ERROR\\":\\"Помилка входу. Спробуйте ще раз.\\",\\"OFFLINE_TITLE\\":\\"Автономно\\",\\"OFFLINE_DESCRIPTION\\":\\"Установіть підключення до Інтернету, щоб скористатися сервісом надсилання.\\",\\"LOADING_CONTACTS_TITLE\\":\\"Завантаження зі Slack...\\",\\"INVITE_TITLE\\":\\"Запросити для редагування\\",\\"INVITE_DESCRIPTION\\":\\"Працюйте з іншими у своєму файлі\\",\\"REVIEW_TITLE\\":\\"Поділитися для перегляду\\",\\"REVIEW_DESCRIPTION\\":\\"Створіть посилання для отримання відгуків\\",\\"REVIEW_DISABLED_GENERIC\\":\\"Незабаром\\",\\"REVIEW_DISABLED_SHARED_DOC\\":\\"Незабаром для спільних файлів\\",\\"SEND_TO_APPS_TITLE\\":\\"Надіслати в програми\\",\\"SEND_TO_APPS_DESCRIPTION\\":\\"Надіслати копію у зовнішню програму\\",\\"QUICK_EXPORT_TITLE\\":\\"Швидкий експорт як\\",\\"QUICK_EXPORT_DESCRIPTION\\":\\"Експорт в одне натискання\\",\\"SIZE_SETTING_TITLE\\":\\"Налаштування розміру\\",\\"FORMAT_DESCRIPTION\\":\\"Формат для надсилання\\",\\"SHARING_DESCRIPTION_PREFIX\\":\\"Поділитися в\\",\\"SHARING_DESCRIPTION_SUFFIX\\":\\"формат\\",\\"SIZE_ORIGINAL\\":\\"Оригінал\\",\\"SIZE_SMALL\\":\\"Дрібний\\",\\"COPY_TO_CLIPBOARD_TITLE\\":\\"Копіювати до буфера обміну\\",\\"COPY_TO_CLIPBOARD_TOOLTIP\\":\\"PSD-файли не можна скопіювати до буфера обміну. Спробуйте використовувати PNG або JPG.\\",\\"COPY_TO_CLIPBOARD_SUCCESS\\":\\"Зображення скопійовано до буфера обміну\\",\\"DIMENSION_ORIGINAL_SUFFIX\\":\\"Вихідний розмір\\",\\"DIMENSION_SMALL_SUFFIX\\":\\"оригінал\\",\\"CHARACTERS_REMAINING\\":\\"Cимволів залишилось\\",\\"OTHER_APPS_TITLE\\":\\"Інші програми\\",\\"REVIEW_DISABLED_DESCRIPTION\\":\\"Збережіть як новий файл, щоб продовжити\\"}");//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTM3LmpzIiwic291cmNlcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///137\n')},function(module){eval('module.exports = JSON.parse("{\\"SLACK_TITLE\\":\\"Chia sẻ qua Slack\\",\\"SLACK_DESCRIPTION\\":\\"Chia sẻ tác phẩm của bạn đến Slack\\",\\"SLACK_PANEL_HEADING\\":\\"Chia sẻ đến Slack\\",\\"CANCEL\\":\\"Hủy\\",\\"FORMAT_LABEL\\":\\"Định dạng để chia sẻ\\",\\"FORMAT_PLACEHOLDER\\":\\"Chọn định dạng tập tin\\",\\"FORMAT_DESCRIPTION_START\\":\\"Tập tin sẽ được chia sẻ ở định dạng \\",\\"FORMAT_DESCRIPTION_END\\":\\".\\",\\"DESTINATION_LABEL\\":\\"Điểm đến\\",\\"DESTINATION_PLACEHOLDER\\":\\"Tìm kiếm theo tên hoặc kênh\\",\\"MESSAGE_LABEL\\":\\"Lời nhắn (không bắt buộc)\\",\\"MESSAGE_PLACEHOLDER\\":\\"Nhập lời nhắn ở đây nếu bạn muốn!\\",\\"SHARE\\":\\"Chia sẻ\\",\\"REFRESH_CONTACTS\\":\\"Làm mới danh bạ\\",\\"LOGOUT\\":\\"Đăng xuất\\",\\"SIGNIN\\":\\"Đăng nhập\\",\\"SIGNIN_HEADING\\":\\"Đăng nhập để chia sẻ đến Slack\\",\\"SIGNIN_DESCRIPTION\\":\\"Để chia sẻ tập tin, Photoshop cần truy cập danh bạ Slack và thông tin kênh của bạn.\\",\\"SIGNIN_LOADING\\":\\"Đăng nhập Slack trên trình duyệt của bạn\\",\\"SENDING_TITLE\\":\\"Đang gửi đến Slack...\\",\\"TOAST_SHARE_SUCCESS\\":\\"đã chia sẻ thành công\\",\\"TOAST_SHARE_ERROR\\":\\"không thể chia sẻ\\",\\"TOAST_NETWORK_ERROR\\":\\"Lỗi mạng, vui lòng thử lại sau\\",\\"TOAST_SIGNIN_ERROR\\":\\"Đăng nhập không thành công. Vui lòng thử lại.\\",\\"OFFLINE_TITLE\\":\\"Ngoại tuyến\\",\\"OFFLINE_DESCRIPTION\\":\\"Vui lòng kết nối lại với internet để sử dụng dịch vụ chia sẻ của chúng tôi.\\",\\"LOADING_CONTACTS_TITLE\\":\\"Đang tải từ Slack...\\",\\"INVITE_TITLE\\":\\"Mời chỉnh sửa\\",\\"INVITE_DESCRIPTION\\":\\"Làm việc với những người khác trên tập tin của bạn\\",\\"REVIEW_TITLE\\":\\"Chia sẻ để xem xét\\",\\"REVIEW_DESCRIPTION\\":\\"Tạo liên kết để ghi lại phản hồi\\",\\"REVIEW_DISABLED_GENERIC\\":\\"Sắp ra mắt\\",\\"REVIEW_DISABLED_SHARED_DOC\\":\\"Sắp ra mắt cho tập tin chia sẻ\\",\\"SEND_TO_APPS_TITLE\\":\\"Gửi đến các ứng dụng\\",\\"SEND_TO_APPS_DESCRIPTION\\":\\"Gửi một bản sao đến ứng dụng bên ngoài\\",\\"QUICK_EXPORT_TITLE\\":\\"Xuất nhanh dưới dạng\\",\\"QUICK_EXPORT_DESCRIPTION\\":\\"Xuất trong một cú nhấp chuột\\",\\"SIZE_SETTING_TITLE\\":\\"Cài đặt kích thước\\",\\"FORMAT_DESCRIPTION\\":\\"Định dạng để chia sẻ\\",\\"SHARING_DESCRIPTION_PREFIX\\":\\"Chia sẻ ở định dạng\\",\\"SHARING_DESCRIPTION_SUFFIX\\":\\"định dạng\\",\\"SIZE_ORIGINAL\\":\\"Gốc\\",\\"SIZE_SMALL\\":\\"Nhỏ\\",\\"COPY_TO_CLIPBOARD_TITLE\\":\\"Sao chép vào bộ nhớ tạm\\",\\"COPY_TO_CLIPBOARD_TOOLTIP\\":\\"Không thể sao chép tập tin PSD vào bộ nhớ tạm. Hãy thử dùng tập tin PNG hoặc JPG.\\",\\"COPY_TO_CLIPBOARD_SUCCESS\\":\\"Đã sao chép hình ảnh vào bộ nhớ tạm\\",\\"DIMENSION_ORIGINAL_SUFFIX\\":\\"Kích thước gốc\\",\\"DIMENSION_SMALL_SUFFIX\\":\\"của bản gốc\\",\\"CHARACTERS_REMAINING\\":\\"Ký tự còn lại\\",\\"OTHER_APPS_TITLE\\":\\"Ứng dụng khác\\",\\"REVIEW_DISABLED_DESCRIPTION\\":\\"Lưu dưới dạng tập tin mới để tiếp tục\\"}");//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTM4LmpzIiwic291cmNlcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///138\n')},function(module){eval('module.exports = JSON.parse("{\\"SLACK_TITLE\\":\\"通过 Slack 共享\\",\\"SLACK_DESCRIPTION\\":\\"将您的作品共享到 Slack\\",\\"SLACK_PANEL_HEADING\\":\\"共享到 Slack\\",\\"CANCEL\\":\\"取消\\",\\"FORMAT_LABEL\\":\\"共享格式\\",\\"FORMAT_PLACEHOLDER\\":\\"选择文件格式\\",\\"FORMAT_DESCRIPTION_START\\":\\"文件将共享为\\",\\"FORMAT_DESCRIPTION_END\\":\\" 格式。\\",\\"DESTINATION_LABEL\\":\\"目标\\",\\"DESTINATION_PLACEHOLDER\\":\\"按名称或渠道搜索\\",\\"MESSAGE_LABEL\\":\\"消息(可选)\\",\\"MESSAGE_PLACEHOLDER\\":\\"如果需要,请在此处键入消息!\\",\\"SHARE\\":\\"共享\\",\\"REFRESH_CONTACTS\\":\\"刷新联系人\\",\\"LOGOUT\\":\\"注销\\",\\"SIGNIN\\":\\"登录\\",\\"SIGNIN_HEADING\\":\\"登录以共享到 Slack\\",\\"SIGNIN_DESCRIPTION\\":\\"要共享文件,Photoshop 需要访问您的 Slack 联系人和渠道信息。\\",\\"SIGNIN_LOADING\\":\\"在浏览器中登录 Slack\\",\\"SENDING_TITLE\\":\\"正在发送至 Slack...\\",\\"TOAST_SHARE_SUCCESS\\":\\"共享成功\\",\\"TOAST_SHARE_ERROR\\":\\"无法共享\\",\\"TOAST_NETWORK_ERROR\\":\\"网络问题,请稍后重试\\",\\"TOAST_SIGNIN_ERROR\\":\\"登录失败。请重试。\\",\\"OFFLINE_TITLE\\":\\"脱机\\",\\"OFFLINE_DESCRIPTION\\":\\"请重新连接到互联网以使用我们的共享服务。\\",\\"LOADING_CONTACTS_TITLE\\":\\"正在从 Slack 加载...\\",\\"INVITE_TITLE\\":\\"邀请参与编辑\\",\\"INVITE_DESCRIPTION\\":\\"在文件中与他人协作\\",\\"REVIEW_TITLE\\":\\"共享以供审阅\\",\\"REVIEW_DESCRIPTION\\":\\"创建用于获取反馈的链接\\",\\"REVIEW_DISABLED_GENERIC\\":\\"即将推出\\",\\"REVIEW_DISABLED_SHARED_DOC\\":\\"即将为共享文件推出\\",\\"SEND_TO_APPS_TITLE\\":\\"发送到应用程序\\",\\"SEND_TO_APPS_DESCRIPTION\\":\\"将副本发送到外部应用程序\\",\\"QUICK_EXPORT_TITLE\\":\\"快速导出为\\",\\"QUICK_EXPORT_DESCRIPTION\\":\\"一键导出\\",\\"SIZE_SETTING_TITLE\\":\\"大小设置\\",\\"FORMAT_DESCRIPTION\\":\\"共享格式\\",\\"SHARING_DESCRIPTION_PREFIX\\":\\"共享格式\\",\\"SHARING_DESCRIPTION_SUFFIX\\":\\"格式\\",\\"SIZE_ORIGINAL\\":\\"原稿\\",\\"SIZE_SMALL\\":\\"小\\",\\"COPY_TO_CLIPBOARD_TITLE\\":\\"复制到剪贴板\\",\\"COPY_TO_CLIPBOARD_TOOLTIP\\":\\"PSD 文件无法复制到剪贴板。请尝试改用 PNG 或 JPG 文件。\\",\\"COPY_TO_CLIPBOARD_SUCCESS\\":\\"图像已复制到剪贴板\\",\\"DIMENSION_ORIGINAL_SUFFIX\\":\\"原始大小\\",\\"DIMENSION_SMALL_SUFFIX\\":\\"原图\\",\\"CHARACTERS_REMAINING\\":\\"剩余字符\\",\\"OTHER_APPS_TITLE\\":\\"其他应用程序\\",\\"REVIEW_DISABLED_DESCRIPTION\\":\\"另存为新文件以继续操作\\"}");//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTM5LmpzIiwic291cmNlcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///139\n')},function(module){eval('module.exports = JSON.parse("{\\"SLACK_TITLE\\":\\"透過 Slack 共用\\",\\"SLACK_DESCRIPTION\\":\\"將工作共用到 Slack\\",\\"SLACK_PANEL_HEADING\\":\\"共用到 Slack\\",\\"CANCEL\\":\\"取消\\",\\"FORMAT_LABEL\\":\\"要共用的格式\\",\\"FORMAT_PLACEHOLDER\\":\\"選擇檔案格式\\",\\"FORMAT_DESCRIPTION_START\\":\\"檔案共用格式:\\",\\"FORMAT_DESCRIPTION_END\\":\\" 格式。\\",\\"DESTINATION_LABEL\\":\\"目的地\\",\\"DESTINATION_PLACEHOLDER\\":\\"依名稱或頻道搜尋\\",\\"MESSAGE_LABEL\\":\\"訊息 (選用)\\",\\"MESSAGE_PLACEHOLDER\\":\\"如果您想,可以在這裡輸入訊息!\\",\\"SHARE\\":\\"共用\\",\\"REFRESH_CONTACTS\\":\\"重新整理聯絡人\\",\\"LOGOUT\\":\\"登出\\",\\"SIGNIN\\":\\"登入\\",\\"SIGNIN_HEADING\\":\\"登入以共用到 Slack\\",\\"SIGNIN_DESCRIPTION\\":\\"若要共用檔案,Photoshop 需要存取您的 Slack 聯絡人和頻道資訊。\\",\\"SIGNIN_LOADING\\":\\"在瀏覽器登入 Slack\\",\\"SENDING_TITLE\\":\\"正在傳送至 Slack…\\",\\"TOAST_SHARE_SUCCESS\\":\\"已成功共用\\",\\"TOAST_SHARE_ERROR\\":\\"無法共用\\",\\"TOAST_NETWORK_ERROR\\":\\"發生網路問題,請稍後再試一次\\",\\"TOAST_SIGNIN_ERROR\\":\\"登入失敗。請再試一次。\\",\\"OFFLINE_TITLE\\":\\"離線\\",\\"OFFLINE_DESCRIPTION\\":\\"請重新連線至網際網路以便使用共用服務。\\",\\"LOADING_CONTACTS_TITLE\\":\\"正在從 Slack 載入…\\",\\"INVITE_TITLE\\":\\"邀請參與編輯\\",\\"INVITE_DESCRIPTION\\":\\"與其他人一起在檔案中工作\\",\\"REVIEW_TITLE\\":\\"共用以供審核\\",\\"REVIEW_DESCRIPTION\\":\\"建立連結以擷取意見回饋\\",\\"REVIEW_DISABLED_GENERIC\\":\\"即將推出\\",\\"REVIEW_DISABLED_SHARED_DOC\\":\\"即將推出適用於共用檔案的功能\\",\\"SEND_TO_APPS_TITLE\\":\\"傳送至應用程式\\",\\"SEND_TO_APPS_DESCRIPTION\\":\\"傳送副本至外部應用程式\\",\\"QUICK_EXPORT_TITLE\\":\\"快速轉存為\\",\\"QUICK_EXPORT_DESCRIPTION\\":\\"一鍵轉存\\",\\"SIZE_SETTING_TITLE\\":\\"大小設定\\",\\"FORMAT_DESCRIPTION\\":\\"要共用的格式\\",\\"SHARING_DESCRIPTION_PREFIX\\":\\"共用:\\",\\"SHARING_DESCRIPTION_SUFFIX\\":\\"格式\\",\\"SIZE_ORIGINAL\\":\\"原稿\\",\\"SIZE_SMALL\\":\\"小\\",\\"COPY_TO_CLIPBOARD_TITLE\\":\\"複製到剪貼簿\\",\\"COPY_TO_CLIPBOARD_TOOLTIP\\":\\"PSD 檔案無法複製到剪貼簿。請嘗試改用 PNG 或 JPG。\\",\\"COPY_TO_CLIPBOARD_SUCCESS\\":\\"影像已複製到剪貼簿\\",\\"DIMENSION_ORIGINAL_SUFFIX\\":\\"原始大小\\",\\"DIMENSION_SMALL_SUFFIX\\":\\" (占原始大小的比例)\\",\\"CHARACTERS_REMAINING\\":\\"剩餘字元\\",\\"OTHER_APPS_TITLE\\":\\"其他應用程式\\",\\"REVIEW_DISABLED_DESCRIPTION\\":\\"另存為新檔案以繼續\\"}");//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTQwLmpzIiwic291cmNlcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///140\n')},function(module,exports,__webpack_require__){eval('exports = module.exports = __webpack_require__(6)(false);\n// Module\nexports.push([module.i, ":root {\\n    --info-color: #0469E3;\\n    --success-color: #007E50;\\n    --warning-color: #BF742D;\\n    --error-color: red;\\n    --icon-color: white;\\n    --toast-border: #707070;\\n    --button-border-fill: #FFFFFF40;\\n}\\n\\n#slack-dialog {\\n    z-index: 1;\\n    position: absolute;\\n    background-color: var(--uxp-host-background-color);\\n    border-radius: 4px;\\n    display: flex;\\n    flex-direction: column;\\n    max-height: 525px;\\n}\\n\\n#local-share-dialog {\\n    z-index: 1;\\n    position: absolute;\\n    background-color: var(--uxp-host-background-color);\\n    border-radius: 4px;\\n    display: flex;\\n    flex-direction: column;\\n    max-height: 525px;\\n}\\n\\n#settings-dialog {\\n    z-index: 1;\\n    position: absolute;\\n    background-color: var(--uxp-host-background-color);\\n    border-radius: 4px;\\n    display: flex;\\n    flex-direction: column;\\n    max-height: 525px;\\n}\\n\\n.icon-style {\\n    fill: var(--spectrum-global-color-gray-900);\\n}\\n\\n.icon-style-stroke {\\n    stroke: var(--spectrum-global-color-gray-900);\\n}\\n\\n.format-menu>sp-menu-item {\\n    padding: 10px;\\n}\\n\\n.container {\\n    display: flex;\\n    justify-content: space-between;\\n    align-items: center;\\n    width: 100%;\\n    padding: 10px 0 10px 10px;\\n}\\n\\n.menu-container {\\n    display: flex;\\n    justify-content: space-between;\\n    align-items: center;\\n    width: 100%;\\n}\\n", ""]);\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTQxLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vc3JjL2NvbXBvbmVudHMvY3NzL3N0eWxlLmNzcz80ODA2Il0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzXCIpKGZhbHNlKTtcbi8vIE1vZHVsZVxuZXhwb3J0cy5wdXNoKFttb2R1bGUuaWQsIFwiOnJvb3Qge1xcbiAgICAtLWluZm8tY29sb3I6ICMwNDY5RTM7XFxuICAgIC0tc3VjY2Vzcy1jb2xvcjogIzAwN0U1MDtcXG4gICAgLS13YXJuaW5nLWNvbG9yOiAjQkY3NDJEO1xcbiAgICAtLWVycm9yLWNvbG9yOiByZWQ7XFxuICAgIC0taWNvbi1jb2xvcjogd2hpdGU7XFxuICAgIC0tdG9hc3QtYm9yZGVyOiAjNzA3MDcwO1xcbiAgICAtLWJ1dHRvbi1ib3JkZXItZmlsbDogI0ZGRkZGRjQwO1xcbn1cXG5cXG4jc2xhY2stZGlhbG9nIHtcXG4gICAgei1pbmRleDogMTtcXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS11eHAtaG9zdC1iYWNrZ3JvdW5kLWNvbG9yKTtcXG4gICAgYm9yZGVyLXJhZGl1czogNHB4O1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xcbiAgICBtYXgtaGVpZ2h0OiA1MjVweDtcXG59XFxuXFxuI2xvY2FsLXNoYXJlLWRpYWxvZyB7XFxuICAgIHotaW5kZXg6IDE7XFxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tdXhwLWhvc3QtYmFja2dyb3VuZC1jb2xvcik7XFxuICAgIGJvcmRlci1yYWRpdXM6IDRweDtcXG4gICAgZGlzcGxheTogZmxleDtcXG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcXG4gICAgbWF4LWhlaWdodDogNTI1cHg7XFxufVxcblxcbiNzZXR0aW5ncy1kaWFsb2cge1xcbiAgICB6LWluZGV4OiAxO1xcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXV4cC1ob3N0LWJhY2tncm91bmQtY29sb3IpO1xcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7XFxuICAgIGRpc3BsYXk6IGZsZXg7XFxuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XFxuICAgIG1heC1oZWlnaHQ6IDUyNXB4O1xcbn1cXG5cXG4uaWNvbi1zdHlsZSB7XFxuICAgIGZpbGw6IHZhcigtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1ncmF5LTkwMCk7XFxufVxcblxcbi5pY29uLXN0eWxlLXN0cm9rZSB7XFxuICAgIHN0cm9rZTogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLWdyYXktOTAwKTtcXG59XFxuXFxuLmZvcm1hdC1tZW51PnNwLW1lbnUtaXRlbSB7XFxuICAgIHBhZGRpbmc6IDEwcHg7XFxufVxcblxcbi5jb250YWluZXIge1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxuICAgIHdpZHRoOiAxMDAlO1xcbiAgICBwYWRkaW5nOiAxMHB4IDAgMTBweCAxMHB4O1xcbn1cXG5cXG4ubWVudS1jb250YWluZXIge1xcbiAgICBkaXNwbGF5OiBmbGV4O1xcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XFxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxuICAgIHdpZHRoOiAxMDAlO1xcbn1cXG5cIiwgXCJcIl0pO1xuXG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///141\n')},function(module,exports,__webpack_require__){"use strict";eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = needsNative;\n\nfunction needsNative() {\n  const uxp = window.require && window.require('uxp');\n\n  return uxp && uxp.host ? uxp.host.isDrover || uxp.host.name === 'Photoshop' || uxp.host.name === 'Illustrator' : false;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTQyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0b3JxLW5hdGl2ZS9yZWFjdC1zcGVjdHJ1bS91dGlscy9uZWVkc05hdGl2ZS5qcz9jZDFjIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gbmVlZHNOYXRpdmU7XG5cbmZ1bmN0aW9uIG5lZWRzTmF0aXZlKCkge1xuICBjb25zdCB1eHAgPSB3aW5kb3cucmVxdWlyZSAmJiB3aW5kb3cucmVxdWlyZSgndXhwJyk7XG5cbiAgcmV0dXJuIHV4cCAmJiB1eHAuaG9zdCA/IHV4cC5ob3N0LmlzRHJvdmVyIHx8IHV4cC5ob3N0Lm5hbWUgPT09ICdQaG90b3Nob3AnIHx8IHV4cC5ob3N0Lm5hbWUgPT09ICdJbGx1c3RyYXRvcicgOiBmYWxzZTtcbn1cbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///142\n")},function(module,exports,__webpack_require__){"use strict";eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _Wait = __webpack_require__(63);\n\nvar _dna = _interopRequireDefault(__webpack_require__(161));\n\nvar _filterDOMProps = _interopRequireDefault(__webpack_require__(34));\n\nvar _propTypes = _interopRequireDefault(__webpack_require__(47));\n\nvar _react = _interopRequireWildcard(__webpack_require__(0));\n\nvar _UxpProvider = __webpack_require__(162);\n\n__webpack_require__(231);\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\n/* sigmoidFactory\n *\n * Generate an ease-in-out function with desired steepness.\n * Accompanying article: https://medium.com/analytic-animations/ease-in-out-the-sigmoid-factory-c5116d8abce9\n *\n * Required:\n *   k: (float != 0), sharpness of ease\n *\n * Return: f(t), t in 0..1\n */\nfunction sigmoidFactory(k) {\n  function base(t) {\n    return 1 / (1 + Math.exp(-k * t)) - 0.5;\n  }\n\n  var correction = 0.5 / base(1);\n  return function (t) {\n    t = clamp(t, 0, 1);\n    return correction * base(2 * t - 1) + 0.5;\n  };\n}\n\nfunction getViewBoxAttribute(height, width) {\n  return '0 0 ' + height.replace(/px/gi, '') + ' ' + width.replace(/px/gi, '');\n}\n\nfunction clamp(val, lower, upper) {\n  return Math.max(Math.min(val, upper), lower);\n}\n\nfunction getSvgArc(radius, startAngleDegrees, finishAngleDegrees) {\n  if (finishAngleDegrees < startAngleDegrees) {\n    finishAngleDegrees += 360;\n  }\n\n  let arcLengthDegrees = finishAngleDegrees - startAngleDegrees;\n\n  if (arcLengthDegrees >= 360) {\n    // draw a complete circle with two arcs\n    return `M ${radius * 2} ${radius} A ${radius} ${radius} 0 0 1 0 ${radius} A ${radius} ${radius} 0 0 1 ${radius * 2} ${radius}`;\n  }\n\n  let startAngle = 2 * Math.PI * (startAngleDegrees / 360);\n  let finishAngle = 2 * Math.PI * (finishAngleDegrees / 360);\n  let zeroAngle = -Math.PI / 2.2;\n  let x0 = radius + radius * Math.cos(startAngle + zeroAngle);\n  let y0 = radius + radius * Math.sin(startAngle + zeroAngle);\n  let x1 = radius + radius * Math.cos(finishAngle + zeroAngle);\n  let y1 = radius + radius * Math.sin(finishAngle + zeroAngle);\n  return `M ${x0} ${y0} A ${radius} ${radius} 0 ${arcLengthDegrees >= 180 ? 1 : 0} 1 ${x1} ${y1}`;\n}\n\nfunction getArcAngles(alpha\n/* 0 to 1 */\n) {\n  // most easing functions start and stop at zero which doesn't look good here.\n  // we want the animation sections to slow down but never completely stop.\n  // we are using the sigmoidFactory functions because it allows us to control the starting and stopping speeds\n  // and allow allow the slope of the function to remain positive at alpha = 0 and alpha = 1\n  let start = sigmoidFactory(4)(alpha) * 360;\n  let finish = sigmoidFactory(5.5)((alpha + 0.4) % 1) * 360;\n\n  if (start < 0) {\n    start += 1;\n  }\n\n  if (finish < start) {\n    finish += 1;\n  }\n\n  return [start, finish];\n}\n\nconst sizeToDnaVariantMap = {\n  L: {\n    determinate: 'large',\n    indeterminate: 'large',\n    overBackground: 'large-over-background'\n  },\n  M: {\n    determinate: 'medium',\n    indeterminate: 'medium',\n    overBackground: 'medium-over-background'\n  },\n  S: {\n    determinate: 'small',\n    indeterminate: 'small',\n    overBackground: 'small-over-background'\n  }\n};\n\nclass UxpWait extends _react.Component {\n  constructor(props) {\n    super(props);\n\n    this.tick = () => {\n      this.animId = requestAnimationFrame(() => {\n        let value = (this.getValue() + 1.8) % 100;\n        this.setState({\n          value\n        });\n        this.tick();\n      });\n    };\n\n    this.removeAnimation = () => {\n      if (this.animId) {\n        cancelAnimationFrame(this.animId);\n        this.animId = null;\n      }\n    };\n\n    this.animId = null;\n  }\n\n  getValue() {\n    if (this.props && this.props.value) {\n      return this.props.value;\n    }\n\n    if (this.state && this.state.value) {\n      return this.state.value;\n    }\n\n    return 0;\n  }\n\n  componentDidMount() {\n    this.tick();\n  }\n\n  componentWillUnmount() {\n    this.removeAnimation();\n  }\n\n  render() {\n    let _this$props = this.props,\n        {\n      size = 'M',\n      className,\n\n      /* eslint-disable-next-line */\n      indeterminate = true,\n      centered = false,\n      variant = indeterminate ? _Wait.INDETERMINATE : _Wait.DETERMINATE\n    } = _this$props,\n        otherProps = _objectWithoutProperties(_this$props, [\"size\", \"className\", \"indeterminate\", \"centered\", \"variant\"]);\n\n    let startAngle, finishAngle;\n    let value = this.getValue(); // Using workaround for now as rgba is not working with stroke attribute.\n\n    let strokeOpacity = variant === 'overBackground' ? '0.2' : '1.0';\n\n    if (indeterminate && variant !== _Wait.DETERMINATE) {\n      //  we don't know how long it will take so we\n      //  do a continual looping animation\n      [startAngle, finishAngle] = getArcAngles(value / 100);\n    } else {\n      //  we know how long it will take based on value being set so we\n      //  use the value to display from 0 to full 360\n      startAngle = 0;\n      finishAngle = this.props.value / 100 * 360;\n    }\n\n    return /*#__PURE__*/_react.default.createElement(_UxpProvider.SpectrumContext.Consumer, null, ({\n      scale,\n      theme\n    } = {}) => {\n      const genome = _dna.default.elements[theme][scale].circleloader[sizeToDnaVariantMap[size][variant]];\n      const spectrumTrackColor = genome.states.default['track-color'];\n      const spectrumFillColor = genome.states.default['track-fill-color'];\n      let strokeWidth = parseInt(genome.dimensions['border-size'].slice(0, -2), 10); // remove trailing px\n\n      let width = parseInt(genome.dimensions.width.slice(0, -2), 10); // remove trailing px\n\n      let radius = width / 2 - strokeWidth;\n      let translateBy = Math.floor(strokeWidth / 2 + 1);\n      let variantClass = `circleLoader--${sizeToDnaVariantMap[size]['indeterminate']}`;\n      return /*#__PURE__*/_react.default.createElement(\"div\", {\n        className: `spectrum-CircleLoader ${variantClass} ${className} ${centered ? 'react-spectrum-Wait--centered' : ''}`\n      }, /*#__PURE__*/_react.default.createElement(\"svg\", _extends({\n        viewBox: getViewBoxAttribute(genome.dimensions.height, genome.dimensions.width),\n        className: variantClass\n        /* we need variantClass on both the container and the svg elements */\n\n      }, (0, _filterDOMProps.default)(otherProps)), /*#__PURE__*/_react.default.createElement(\"path\", {\n        d: getSvgArc(radius, 0, 360),\n        stroke: spectrumTrackColor,\n        strokeOpacity: strokeOpacity,\n        fill: \"transparent\",\n        strokeWidth: strokeWidth,\n        transform: `translate(${translateBy}, ${translateBy})`\n      }), /*#__PURE__*/_react.default.createElement(\"path\", {\n        d: getSvgArc(radius, startAngle, finishAngle),\n        stroke: spectrumFillColor,\n        fill: \"transparent\",\n        strokeWidth: strokeWidth + 1,\n        transform: `translate(${translateBy}, ${translateBy})`\n      })));\n    });\n  }\n\n}\n\nexports.default = UxpWait;\nUxpWait.propTypes = {\n  /** Whether to center the Wait compnent in the parent container. */\n  centered: _propTypes.default.bool,\n\n  /** Custom CSS class to add to the Wait component */\n  className: _propTypes.default.string,\n\n  /**\n   * Boolean to determine if the Wait component should endlessly spin (indeterminate) or\n   * if it should be controlled manually.\n   */\n  indeterminate: _propTypes.default.bool,\n\n  /** Size of the Wait component */\n  size: _propTypes.default.string,\n\n  /** Adjust the filled portion of the Wait component to a determined value */\n  value: _propTypes.default.number,\n\n  /**\n  * The variant of Wait to display.\n  */\n  variant: _propTypes.default.string\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTQzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0b3JxLW5hdGl2ZS9yZWFjdC1zcGVjdHJ1bS9XYWl0L2pzL1V4cFdhaXQuanM/OTRkZCJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcblxudmFyIF9XYWl0ID0gcmVxdWlyZShcIi4vV2FpdFwiKTtcblxudmFyIF9kbmEgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi8uLi91dGlscy9kbmFcIikpO1xuXG52YXIgX2ZpbHRlckRPTVByb3BzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vLi4vdXRpbHMvZmlsdGVyRE9NUHJvcHNcIikpO1xuXG52YXIgX3Byb3BUeXBlcyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInByb3AtdHlwZXNcIikpO1xuXG52YXIgX3JlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9VeHBQcm92aWRlciA9IHJlcXVpcmUoXCIuLi8uLi9Qcm92aWRlci9qcy9VeHBQcm92aWRlclwiKTtcblxucmVxdWlyZShcIi4uL3V4cC1zdHlsZS9pbmRleC5jc3NcIik7XG5cbmZ1bmN0aW9uIF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSgpIHsgaWYgKHR5cGVvZiBXZWFrTWFwICE9PSBcImZ1bmN0aW9uXCIpIHJldHVybiBudWxsOyB2YXIgY2FjaGUgPSBuZXcgV2Vha01hcCgpOyBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBjYWNoZTsgfTsgcmV0dXJuIGNhY2hlOyB9XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKG9iaikgeyBpZiAob2JqICYmIG9iai5fX2VzTW9kdWxlKSB7IHJldHVybiBvYmo7IH0gaWYgKG9iaiA9PT0gbnVsbCB8fCB0eXBlb2Ygb2JqICE9PSBcIm9iamVjdFwiICYmIHR5cGVvZiBvYmogIT09IFwiZnVuY3Rpb25cIikgeyByZXR1cm4geyBkZWZhdWx0OiBvYmogfTsgfSB2YXIgY2FjaGUgPSBfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUoKTsgaWYgKGNhY2hlICYmIGNhY2hlLmhhcyhvYmopKSB7IHJldHVybiBjYWNoZS5nZXQob2JqKTsgfSB2YXIgbmV3T2JqID0ge307IHZhciBoYXNQcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3QuZGVmaW5lUHJvcGVydHkgJiYgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjsgZm9yICh2YXIga2V5IGluIG9iaikgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSkgeyB2YXIgZGVzYyA9IGhhc1Byb3BlcnR5RGVzY3JpcHRvciA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqLCBrZXkpIDogbnVsbDsgaWYgKGRlc2MgJiYgKGRlc2MuZ2V0IHx8IGRlc2Muc2V0KSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkobmV3T2JqLCBrZXksIGRlc2MpOyB9IGVsc2UgeyBuZXdPYmpba2V5XSA9IG9ialtrZXldOyB9IH0gfSBuZXdPYmouZGVmYXVsdCA9IG9iajsgaWYgKGNhY2hlKSB7IGNhY2hlLnNldChvYmosIG5ld09iaik7IH0gcmV0dXJuIG5ld09iajsgfVxuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5mdW5jdGlvbiBfZXh0ZW5kcygpIHsgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uICh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTsgZm9yICh2YXIga2V5IGluIHNvdXJjZSkgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkgeyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IH0gfSByZXR1cm4gdGFyZ2V0OyB9OyByZXR1cm4gX2V4dGVuZHMuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgfVxuXG5mdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoc291cmNlLCBleGNsdWRlZCkgeyBpZiAoc291cmNlID09IG51bGwpIHJldHVybiB7fTsgdmFyIHRhcmdldCA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKHNvdXJjZSwgZXhjbHVkZWQpOyB2YXIga2V5LCBpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgc291cmNlU3ltYm9sS2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoc291cmNlKTsgZm9yIChpID0gMDsgaSA8IHNvdXJjZVN5bWJvbEtleXMubGVuZ3RoOyBpKyspIHsga2V5ID0gc291cmNlU3ltYm9sS2V5c1tpXTsgaWYgKGV4Y2x1ZGVkLmluZGV4T2Yoa2V5KSA+PSAwKSBjb250aW51ZTsgaWYgKCFPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoc291cmNlLCBrZXkpKSBjb250aW51ZTsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IHJldHVybiB0YXJnZXQ7IH1cblxuZnVuY3Rpb24gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2Uoc291cmNlLCBleGNsdWRlZCkgeyBpZiAoc291cmNlID09IG51bGwpIHJldHVybiB7fTsgdmFyIHRhcmdldCA9IHt9OyB2YXIgc291cmNlS2V5cyA9IE9iamVjdC5rZXlzKHNvdXJjZSk7IHZhciBrZXksIGk7IGZvciAoaSA9IDA7IGkgPCBzb3VyY2VLZXlzLmxlbmd0aDsgaSsrKSB7IGtleSA9IHNvdXJjZUtleXNbaV07IGlmIChleGNsdWRlZC5pbmRleE9mKGtleSkgPj0gMCkgY29udGludWU7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gcmV0dXJuIHRhcmdldDsgfVxuXG4vKiBzaWdtb2lkRmFjdG9yeVxuICpcbiAqIEdlbmVyYXRlIGFuIGVhc2UtaW4tb3V0IGZ1bmN0aW9uIHdpdGggZGVzaXJlZCBzdGVlcG5lc3MuXG4gKiBBY2NvbXBhbnlpbmcgYXJ0aWNsZTogaHR0cHM6Ly9tZWRpdW0uY29tL2FuYWx5dGljLWFuaW1hdGlvbnMvZWFzZS1pbi1vdXQtdGhlLXNpZ21vaWQtZmFjdG9yeS1jNTExNmQ4YWJjZTlcbiAqXG4gKiBSZXF1aXJlZDpcbiAqICAgazogKGZsb2F0ICE9IDApLCBzaGFycG5lc3Mgb2YgZWFzZVxuICpcbiAqIFJldHVybjogZih0KSwgdCBpbiAwLi4xXG4gKi9cbmZ1bmN0aW9uIHNpZ21vaWRGYWN0b3J5KGspIHtcbiAgZnVuY3Rpb24gYmFzZSh0KSB7XG4gICAgcmV0dXJuIDEgLyAoMSArIE1hdGguZXhwKC1rICogdCkpIC0gMC41O1xuICB9XG5cbiAgdmFyIGNvcnJlY3Rpb24gPSAwLjUgLyBiYXNlKDEpO1xuICByZXR1cm4gZnVuY3Rpb24gKHQpIHtcbiAgICB0ID0gY2xhbXAodCwgMCwgMSk7XG4gICAgcmV0dXJuIGNvcnJlY3Rpb24gKiBiYXNlKDIgKiB0IC0gMSkgKyAwLjU7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGdldFZpZXdCb3hBdHRyaWJ1dGUoaGVpZ2h0LCB3aWR0aCkge1xuICByZXR1cm4gJzAgMCAnICsgaGVpZ2h0LnJlcGxhY2UoL3B4L2dpLCAnJykgKyAnICcgKyB3aWR0aC5yZXBsYWNlKC9weC9naSwgJycpO1xufVxuXG5mdW5jdGlvbiBjbGFtcCh2YWwsIGxvd2VyLCB1cHBlcikge1xuICByZXR1cm4gTWF0aC5tYXgoTWF0aC5taW4odmFsLCB1cHBlciksIGxvd2VyKTtcbn1cblxuZnVuY3Rpb24gZ2V0U3ZnQXJjKHJhZGl1cywgc3RhcnRBbmdsZURlZ3JlZXMsIGZpbmlzaEFuZ2xlRGVncmVlcykge1xuICBpZiAoZmluaXNoQW5nbGVEZWdyZWVzIDwgc3RhcnRBbmdsZURlZ3JlZXMpIHtcbiAgICBmaW5pc2hBbmdsZURlZ3JlZXMgKz0gMzYwO1xuICB9XG5cbiAgbGV0IGFyY0xlbmd0aERlZ3JlZXMgPSBmaW5pc2hBbmdsZURlZ3JlZXMgLSBzdGFydEFuZ2xlRGVncmVlcztcblxuICBpZiAoYXJjTGVuZ3RoRGVncmVlcyA+PSAzNjApIHtcbiAgICAvLyBkcmF3IGEgY29tcGxldGUgY2lyY2xlIHdpdGggdHdvIGFyY3NcbiAgICByZXR1cm4gYE0gJHtyYWRpdXMgKiAyfSAke3JhZGl1c30gQSAke3JhZGl1c30gJHtyYWRpdXN9IDAgMCAxIDAgJHtyYWRpdXN9IEEgJHtyYWRpdXN9ICR7cmFkaXVzfSAwIDAgMSAke3JhZGl1cyAqIDJ9ICR7cmFkaXVzfWA7XG4gIH1cblxuICBsZXQgc3RhcnRBbmdsZSA9IDIgKiBNYXRoLlBJICogKHN0YXJ0QW5nbGVEZWdyZWVzIC8gMzYwKTtcbiAgbGV0IGZpbmlzaEFuZ2xlID0gMiAqIE1hdGguUEkgKiAoZmluaXNoQW5nbGVEZWdyZWVzIC8gMzYwKTtcbiAgbGV0IHplcm9BbmdsZSA9IC1NYXRoLlBJIC8gMi4yO1xuICBsZXQgeDAgPSByYWRpdXMgKyByYWRpdXMgKiBNYXRoLmNvcyhzdGFydEFuZ2xlICsgemVyb0FuZ2xlKTtcbiAgbGV0IHkwID0gcmFkaXVzICsgcmFkaXVzICogTWF0aC5zaW4oc3RhcnRBbmdsZSArIHplcm9BbmdsZSk7XG4gIGxldCB4MSA9IHJhZGl1cyArIHJhZGl1cyAqIE1hdGguY29zKGZpbmlzaEFuZ2xlICsgemVyb0FuZ2xlKTtcbiAgbGV0IHkxID0gcmFkaXVzICsgcmFkaXVzICogTWF0aC5zaW4oZmluaXNoQW5nbGUgKyB6ZXJvQW5nbGUpO1xuICByZXR1cm4gYE0gJHt4MH0gJHt5MH0gQSAke3JhZGl1c30gJHtyYWRpdXN9IDAgJHthcmNMZW5ndGhEZWdyZWVzID49IDE4MCA/IDEgOiAwfSAxICR7eDF9ICR7eTF9YDtcbn1cblxuZnVuY3Rpb24gZ2V0QXJjQW5nbGVzKGFscGhhXG4vKiAwIHRvIDEgKi9cbikge1xuICAvLyBtb3N0IGVhc2luZyBmdW5jdGlvbnMgc3RhcnQgYW5kIHN0b3AgYXQgemVybyB3aGljaCBkb2Vzbid0IGxvb2sgZ29vZCBoZXJlLlxuICAvLyB3ZSB3YW50IHRoZSBhbmltYXRpb24gc2VjdGlvbnMgdG8gc2xvdyBkb3duIGJ1dCBuZXZlciBjb21wbGV0ZWx5IHN0b3AuXG4gIC8vIHdlIGFyZSB1c2luZyB0aGUgc2lnbW9pZEZhY3RvcnkgZnVuY3Rpb25zIGJlY2F1c2UgaXQgYWxsb3dzIHVzIHRvIGNvbnRyb2wgdGhlIHN0YXJ0aW5nIGFuZCBzdG9wcGluZyBzcGVlZHNcbiAgLy8gYW5kIGFsbG93IGFsbG93IHRoZSBzbG9wZSBvZiB0aGUgZnVuY3Rpb24gdG8gcmVtYWluIHBvc2l0aXZlIGF0IGFscGhhID0gMCBhbmQgYWxwaGEgPSAxXG4gIGxldCBzdGFydCA9IHNpZ21vaWRGYWN0b3J5KDQpKGFscGhhKSAqIDM2MDtcbiAgbGV0IGZpbmlzaCA9IHNpZ21vaWRGYWN0b3J5KDUuNSkoKGFscGhhICsgMC40KSAlIDEpICogMzYwO1xuXG4gIGlmIChzdGFydCA8IDApIHtcbiAgICBzdGFydCArPSAxO1xuICB9XG5cbiAgaWYgKGZpbmlzaCA8IHN0YXJ0KSB7XG4gICAgZmluaXNoICs9IDE7XG4gIH1cblxuICByZXR1cm4gW3N0YXJ0LCBmaW5pc2hdO1xufVxuXG5jb25zdCBzaXplVG9EbmFWYXJpYW50TWFwID0ge1xuICBMOiB7XG4gICAgZGV0ZXJtaW5hdGU6ICdsYXJnZScsXG4gICAgaW5kZXRlcm1pbmF0ZTogJ2xhcmdlJyxcbiAgICBvdmVyQmFja2dyb3VuZDogJ2xhcmdlLW92ZXItYmFja2dyb3VuZCdcbiAgfSxcbiAgTToge1xuICAgIGRldGVybWluYXRlOiAnbWVkaXVtJyxcbiAgICBpbmRldGVybWluYXRlOiAnbWVkaXVtJyxcbiAgICBvdmVyQmFja2dyb3VuZDogJ21lZGl1bS1vdmVyLWJhY2tncm91bmQnXG4gIH0sXG4gIFM6IHtcbiAgICBkZXRlcm1pbmF0ZTogJ3NtYWxsJyxcbiAgICBpbmRldGVybWluYXRlOiAnc21hbGwnLFxuICAgIG92ZXJCYWNrZ3JvdW5kOiAnc21hbGwtb3Zlci1iYWNrZ3JvdW5kJ1xuICB9XG59O1xuXG5jbGFzcyBVeHBXYWl0IGV4dGVuZHMgX3JlYWN0LkNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuXG4gICAgdGhpcy50aWNrID0gKCkgPT4ge1xuICAgICAgdGhpcy5hbmltSWQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICBsZXQgdmFsdWUgPSAodGhpcy5nZXRWYWx1ZSgpICsgMS44KSAlIDEwMDtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgdmFsdWVcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMudGljaygpO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIHRoaXMucmVtb3ZlQW5pbWF0aW9uID0gKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuYW5pbUlkKSB7XG4gICAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuYW5pbUlkKTtcbiAgICAgICAgdGhpcy5hbmltSWQgPSBudWxsO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB0aGlzLmFuaW1JZCA9IG51bGw7XG4gIH1cblxuICBnZXRWYWx1ZSgpIHtcbiAgICBpZiAodGhpcy5wcm9wcyAmJiB0aGlzLnByb3BzLnZhbHVlKSB7XG4gICAgICByZXR1cm4gdGhpcy5wcm9wcy52YWx1ZTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zdGF0ZSAmJiB0aGlzLnN0YXRlLnZhbHVlKSB7XG4gICAgICByZXR1cm4gdGhpcy5zdGF0ZS52YWx1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgIHRoaXMudGljaygpO1xuICB9XG5cbiAgY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgdGhpcy5yZW1vdmVBbmltYXRpb24oKTtcbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICBsZXQgX3RoaXMkcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICB7XG4gICAgICBzaXplID0gJ00nLFxuICAgICAgY2xhc3NOYW1lLFxuXG4gICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgKi9cbiAgICAgIGluZGV0ZXJtaW5hdGUgPSB0cnVlLFxuICAgICAgY2VudGVyZWQgPSBmYWxzZSxcbiAgICAgIHZhcmlhbnQgPSBpbmRldGVybWluYXRlID8gX1dhaXQuSU5ERVRFUk1JTkFURSA6IF9XYWl0LkRFVEVSTUlOQVRFXG4gICAgfSA9IF90aGlzJHByb3BzLFxuICAgICAgICBvdGhlclByb3BzID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKF90aGlzJHByb3BzLCBbXCJzaXplXCIsIFwiY2xhc3NOYW1lXCIsIFwiaW5kZXRlcm1pbmF0ZVwiLCBcImNlbnRlcmVkXCIsIFwidmFyaWFudFwiXSk7XG5cbiAgICBsZXQgc3RhcnRBbmdsZSwgZmluaXNoQW5nbGU7XG4gICAgbGV0IHZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOyAvLyBVc2luZyB3b3JrYXJvdW5kIGZvciBub3cgYXMgcmdiYSBpcyBub3Qgd29ya2luZyB3aXRoIHN0cm9rZSBhdHRyaWJ1dGUuXG5cbiAgICBsZXQgc3Ryb2tlT3BhY2l0eSA9IHZhcmlhbnQgPT09ICdvdmVyQmFja2dyb3VuZCcgPyAnMC4yJyA6ICcxLjAnO1xuXG4gICAgaWYgKGluZGV0ZXJtaW5hdGUgJiYgdmFyaWFudCAhPT0gX1dhaXQuREVURVJNSU5BVEUpIHtcbiAgICAgIC8vICB3ZSBkb24ndCBrbm93IGhvdyBsb25nIGl0IHdpbGwgdGFrZSBzbyB3ZVxuICAgICAgLy8gIGRvIGEgY29udGludWFsIGxvb3BpbmcgYW5pbWF0aW9uXG4gICAgICBbc3RhcnRBbmdsZSwgZmluaXNoQW5nbGVdID0gZ2V0QXJjQW5nbGVzKHZhbHVlIC8gMTAwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gIHdlIGtub3cgaG93IGxvbmcgaXQgd2lsbCB0YWtlIGJhc2VkIG9uIHZhbHVlIGJlaW5nIHNldCBzbyB3ZVxuICAgICAgLy8gIHVzZSB0aGUgdmFsdWUgdG8gZGlzcGxheSBmcm9tIDAgdG8gZnVsbCAzNjBcbiAgICAgIHN0YXJ0QW5nbGUgPSAwO1xuICAgICAgZmluaXNoQW5nbGUgPSB0aGlzLnByb3BzLnZhbHVlIC8gMTAwICogMzYwO1xuICAgIH1cblxuICAgIHJldHVybiAvKiNfX1BVUkVfXyovX3JlYWN0LmRlZmF1bHQuY3JlYXRlRWxlbWVudChfVXhwUHJvdmlkZXIuU3BlY3RydW1Db250ZXh0LkNvbnN1bWVyLCBudWxsLCAoe1xuICAgICAgc2NhbGUsXG4gICAgICB0aGVtZVxuICAgIH0gPSB7fSkgPT4ge1xuICAgICAgY29uc3QgZ2Vub21lID0gX2RuYS5kZWZhdWx0LmVsZW1lbnRzW3RoZW1lXVtzY2FsZV0uY2lyY2xlbG9hZGVyW3NpemVUb0RuYVZhcmlhbnRNYXBbc2l6ZV1bdmFyaWFudF1dO1xuICAgICAgY29uc3Qgc3BlY3RydW1UcmFja0NvbG9yID0gZ2Vub21lLnN0YXRlcy5kZWZhdWx0Wyd0cmFjay1jb2xvciddO1xuICAgICAgY29uc3Qgc3BlY3RydW1GaWxsQ29sb3IgPSBnZW5vbWUuc3RhdGVzLmRlZmF1bHRbJ3RyYWNrLWZpbGwtY29sb3InXTtcbiAgICAgIGxldCBzdHJva2VXaWR0aCA9IHBhcnNlSW50KGdlbm9tZS5kaW1lbnNpb25zWydib3JkZXItc2l6ZSddLnNsaWNlKDAsIC0yKSwgMTApOyAvLyByZW1vdmUgdHJhaWxpbmcgcHhcblxuICAgICAgbGV0IHdpZHRoID0gcGFyc2VJbnQoZ2Vub21lLmRpbWVuc2lvbnMud2lkdGguc2xpY2UoMCwgLTIpLCAxMCk7IC8vIHJlbW92ZSB0cmFpbGluZyBweFxuXG4gICAgICBsZXQgcmFkaXVzID0gd2lkdGggLyAyIC0gc3Ryb2tlV2lkdGg7XG4gICAgICBsZXQgdHJhbnNsYXRlQnkgPSBNYXRoLmZsb29yKHN0cm9rZVdpZHRoIC8gMiArIDEpO1xuICAgICAgbGV0IHZhcmlhbnRDbGFzcyA9IGBjaXJjbGVMb2FkZXItLSR7c2l6ZVRvRG5hVmFyaWFudE1hcFtzaXplXVsnaW5kZXRlcm1pbmF0ZSddfWA7XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL19yZWFjdC5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBjbGFzc05hbWU6IGBzcGVjdHJ1bS1DaXJjbGVMb2FkZXIgJHt2YXJpYW50Q2xhc3N9ICR7Y2xhc3NOYW1lfSAke2NlbnRlcmVkID8gJ3JlYWN0LXNwZWN0cnVtLVdhaXQtLWNlbnRlcmVkJyA6ICcnfWBcbiAgICAgIH0sIC8qI19fUFVSRV9fKi9fcmVhY3QuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIF9leHRlbmRzKHtcbiAgICAgICAgdmlld0JveDogZ2V0Vmlld0JveEF0dHJpYnV0ZShnZW5vbWUuZGltZW5zaW9ucy5oZWlnaHQsIGdlbm9tZS5kaW1lbnNpb25zLndpZHRoKSxcbiAgICAgICAgY2xhc3NOYW1lOiB2YXJpYW50Q2xhc3NcbiAgICAgICAgLyogd2UgbmVlZCB2YXJpYW50Q2xhc3Mgb24gYm90aCB0aGUgY29udGFpbmVyIGFuZCB0aGUgc3ZnIGVsZW1lbnRzICovXG5cbiAgICAgIH0sICgwLCBfZmlsdGVyRE9NUHJvcHMuZGVmYXVsdCkob3RoZXJQcm9wcykpLCAvKiNfX1BVUkVfXyovX3JlYWN0LmRlZmF1bHQuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgICAgICBkOiBnZXRTdmdBcmMocmFkaXVzLCAwLCAzNjApLFxuICAgICAgICBzdHJva2U6IHNwZWN0cnVtVHJhY2tDb2xvcixcbiAgICAgICAgc3Ryb2tlT3BhY2l0eTogc3Ryb2tlT3BhY2l0eSxcbiAgICAgICAgZmlsbDogXCJ0cmFuc3BhcmVudFwiLFxuICAgICAgICBzdHJva2VXaWR0aDogc3Ryb2tlV2lkdGgsXG4gICAgICAgIHRyYW5zZm9ybTogYHRyYW5zbGF0ZSgke3RyYW5zbGF0ZUJ5fSwgJHt0cmFuc2xhdGVCeX0pYFxuICAgICAgfSksIC8qI19fUFVSRV9fKi9fcmVhY3QuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgICAgIGQ6IGdldFN2Z0FyYyhyYWRpdXMsIHN0YXJ0QW5nbGUsIGZpbmlzaEFuZ2xlKSxcbiAgICAgICAgc3Ryb2tlOiBzcGVjdHJ1bUZpbGxDb2xvcixcbiAgICAgICAgZmlsbDogXCJ0cmFuc3BhcmVudFwiLFxuICAgICAgICBzdHJva2VXaWR0aDogc3Ryb2tlV2lkdGggKyAxLFxuICAgICAgICB0cmFuc2Zvcm06IGB0cmFuc2xhdGUoJHt0cmFuc2xhdGVCeX0sICR7dHJhbnNsYXRlQnl9KWBcbiAgICAgIH0pKSk7XG4gICAgfSk7XG4gIH1cblxufVxuXG5leHBvcnRzLmRlZmF1bHQgPSBVeHBXYWl0O1xuVXhwV2FpdC5wcm9wVHlwZXMgPSB7XG4gIC8qKiBXaGV0aGVyIHRvIGNlbnRlciB0aGUgV2FpdCBjb21wbmVudCBpbiB0aGUgcGFyZW50IGNvbnRhaW5lci4gKi9cbiAgY2VudGVyZWQ6IF9wcm9wVHlwZXMuZGVmYXVsdC5ib29sLFxuXG4gIC8qKiBDdXN0b20gQ1NTIGNsYXNzIHRvIGFkZCB0byB0aGUgV2FpdCBjb21wb25lbnQgKi9cbiAgY2xhc3NOYW1lOiBfcHJvcFR5cGVzLmRlZmF1bHQuc3RyaW5nLFxuXG4gIC8qKlxuICAgKiBCb29sZWFuIHRvIGRldGVybWluZSBpZiB0aGUgV2FpdCBjb21wb25lbnQgc2hvdWxkIGVuZGxlc3NseSBzcGluIChpbmRldGVybWluYXRlKSBvclxuICAgKiBpZiBpdCBzaG91bGQgYmUgY29udHJvbGxlZCBtYW51YWxseS5cbiAgICovXG4gIGluZGV0ZXJtaW5hdGU6IF9wcm9wVHlwZXMuZGVmYXVsdC5ib29sLFxuXG4gIC8qKiBTaXplIG9mIHRoZSBXYWl0IGNvbXBvbmVudCAqL1xuICBzaXplOiBfcHJvcFR5cGVzLmRlZmF1bHQuc3RyaW5nLFxuXG4gIC8qKiBBZGp1c3QgdGhlIGZpbGxlZCBwb3J0aW9uIG9mIHRoZSBXYWl0IGNvbXBvbmVudCB0byBhIGRldGVybWluZWQgdmFsdWUgKi9cbiAgdmFsdWU6IF9wcm9wVHlwZXMuZGVmYXVsdC5udW1iZXIsXG5cbiAgLyoqXG4gICogVGhlIHZhcmlhbnQgb2YgV2FpdCB0byBkaXNwbGF5LlxuICAqL1xuICB2YXJpYW50OiBfcHJvcFR5cGVzLmRlZmF1bHQuc3RyaW5nXG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///143\n")},function(module,exports,__webpack_require__){"use strict";eval("/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\n\nvar ReactPropTypesSecret = __webpack_require__(145);\n\nfunction emptyFunction() {}\nfunction emptyFunctionWithReset() {}\nemptyFunctionWithReset.resetWarningCache = emptyFunction;\n\nmodule.exports = function() {\n  function shim(props, propName, componentName, location, propFullName, secret) {\n    if (secret === ReactPropTypesSecret) {\n      // It is still safe when called from React.\n      return;\n    }\n    var err = new Error(\n      'Calling PropTypes validators directly is not supported by the `prop-types` package. ' +\n      'Use PropTypes.checkPropTypes() to call them. ' +\n      'Read more at http://fb.me/use-check-prop-types'\n    );\n    err.name = 'Invariant Violation';\n    throw err;\n  };\n  shim.isRequired = shim;\n  function getShim() {\n    return shim;\n  };\n  // Important!\n  // Keep this list in sync with production version in `./factoryWithTypeCheckers.js`.\n  var ReactPropTypes = {\n    array: shim,\n    bigint: shim,\n    bool: shim,\n    func: shim,\n    number: shim,\n    object: shim,\n    string: shim,\n    symbol: shim,\n\n    any: shim,\n    arrayOf: getShim,\n    element: shim,\n    elementType: shim,\n    instanceOf: getShim,\n    node: shim,\n    objectOf: getShim,\n    oneOf: getShim,\n    oneOfType: getShim,\n    shape: getShim,\n    exact: getShim,\n\n    checkPropTypes: emptyFunctionWithReset,\n    resetWarningCache: emptyFunction\n  };\n\n  ReactPropTypes.PropTypes = ReactPropTypes;\n\n  return ReactPropTypes;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTQ0LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3Byb3AtdHlwZXMvZmFjdG9yeVdpdGhUaHJvd2luZ1NoaW1zLmpzP2Q3YTAiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBSZWFjdFByb3BUeXBlc1NlY3JldCA9IHJlcXVpcmUoJy4vbGliL1JlYWN0UHJvcFR5cGVzU2VjcmV0Jyk7XG5cbmZ1bmN0aW9uIGVtcHR5RnVuY3Rpb24oKSB7fVxuZnVuY3Rpb24gZW1wdHlGdW5jdGlvbldpdGhSZXNldCgpIHt9XG5lbXB0eUZ1bmN0aW9uV2l0aFJlc2V0LnJlc2V0V2FybmluZ0NhY2hlID0gZW1wdHlGdW5jdGlvbjtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbigpIHtcbiAgZnVuY3Rpb24gc2hpbShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUsIHNlY3JldCkge1xuICAgIGlmIChzZWNyZXQgPT09IFJlYWN0UHJvcFR5cGVzU2VjcmV0KSB7XG4gICAgICAvLyBJdCBpcyBzdGlsbCBzYWZlIHdoZW4gY2FsbGVkIGZyb20gUmVhY3QuXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBlcnIgPSBuZXcgRXJyb3IoXG4gICAgICAnQ2FsbGluZyBQcm9wVHlwZXMgdmFsaWRhdG9ycyBkaXJlY3RseSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBgcHJvcC10eXBlc2AgcGFja2FnZS4gJyArXG4gICAgICAnVXNlIFByb3BUeXBlcy5jaGVja1Byb3BUeXBlcygpIHRvIGNhbGwgdGhlbS4gJyArXG4gICAgICAnUmVhZCBtb3JlIGF0IGh0dHA6Ly9mYi5tZS91c2UtY2hlY2stcHJvcC10eXBlcydcbiAgICApO1xuICAgIGVyci5uYW1lID0gJ0ludmFyaWFudCBWaW9sYXRpb24nO1xuICAgIHRocm93IGVycjtcbiAgfTtcbiAgc2hpbS5pc1JlcXVpcmVkID0gc2hpbTtcbiAgZnVuY3Rpb24gZ2V0U2hpbSgpIHtcbiAgICByZXR1cm4gc2hpbTtcbiAgfTtcbiAgLy8gSW1wb3J0YW50IVxuICAvLyBLZWVwIHRoaXMgbGlzdCBpbiBzeW5jIHdpdGggcHJvZHVjdGlvbiB2ZXJzaW9uIGluIGAuL2ZhY3RvcnlXaXRoVHlwZUNoZWNrZXJzLmpzYC5cbiAgdmFyIFJlYWN0UHJvcFR5cGVzID0ge1xuICAgIGFycmF5OiBzaGltLFxuICAgIGJpZ2ludDogc2hpbSxcbiAgICBib29sOiBzaGltLFxuICAgIGZ1bmM6IHNoaW0sXG4gICAgbnVtYmVyOiBzaGltLFxuICAgIG9iamVjdDogc2hpbSxcbiAgICBzdHJpbmc6IHNoaW0sXG4gICAgc3ltYm9sOiBzaGltLFxuXG4gICAgYW55OiBzaGltLFxuICAgIGFycmF5T2Y6IGdldFNoaW0sXG4gICAgZWxlbWVudDogc2hpbSxcbiAgICBlbGVtZW50VHlwZTogc2hpbSxcbiAgICBpbnN0YW5jZU9mOiBnZXRTaGltLFxuICAgIG5vZGU6IHNoaW0sXG4gICAgb2JqZWN0T2Y6IGdldFNoaW0sXG4gICAgb25lT2Y6IGdldFNoaW0sXG4gICAgb25lT2ZUeXBlOiBnZXRTaGltLFxuICAgIHNoYXBlOiBnZXRTaGltLFxuICAgIGV4YWN0OiBnZXRTaGltLFxuXG4gICAgY2hlY2tQcm9wVHlwZXM6IGVtcHR5RnVuY3Rpb25XaXRoUmVzZXQsXG4gICAgcmVzZXRXYXJuaW5nQ2FjaGU6IGVtcHR5RnVuY3Rpb25cbiAgfTtcblxuICBSZWFjdFByb3BUeXBlcy5Qcm9wVHlwZXMgPSBSZWFjdFByb3BUeXBlcztcblxuICByZXR1cm4gUmVhY3RQcm9wVHlwZXM7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///144\n")},function(module,exports,__webpack_require__){"use strict";eval("/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\n\nvar ReactPropTypesSecret = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED';\n\nmodule.exports = ReactPropTypesSecret;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTQ1LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3Byb3AtdHlwZXMvbGliL1JlYWN0UHJvcFR5cGVzU2VjcmV0LmpzPzU5YjAiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBSZWFjdFByb3BUeXBlc1NlY3JldCA9ICdTRUNSRVRfRE9fTk9UX1BBU1NfVEhJU19PUl9ZT1VfV0lMTF9CRV9GSVJFRCc7XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhY3RQcm9wVHlwZXNTZWNyZXQ7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///145\n")},function(module,exports,__webpack_require__){eval("var api = __webpack_require__(5);\n            var content = __webpack_require__(147);\n\n            content = content.__esModule ? content.default : content;\n\n            if (typeof content === 'string') {\n              content = [[module.i, content, '']];\n            }\n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = api(content, options);\n\n\n\nmodule.exports = content.locals || {};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTQ2LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0b3JxLW5hdGl2ZS9yZWFjdC1zcGVjdHJ1bS9XYWl0L3N0eWxlL2luZGV4LmNzcz80M2QwIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBhcGkgPSByZXF1aXJlKFwiIS4uLy4uLy4uLy4uL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzXCIpO1xuICAgICAgICAgICAgdmFyIGNvbnRlbnQgPSByZXF1aXJlKFwiISEuLi8uLi8uLi8uLi9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vaW5kZXguY3NzXCIpO1xuXG4gICAgICAgICAgICBjb250ZW50ID0gY29udGVudC5fX2VzTW9kdWxlID8gY29udGVudC5kZWZhdWx0IDogY29udGVudDtcblxuICAgICAgICAgICAgaWYgKHR5cGVvZiBjb250ZW50ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICBjb250ZW50ID0gW1ttb2R1bGUuaWQsIGNvbnRlbnQsICcnXV07XG4gICAgICAgICAgICB9XG5cbnZhciBvcHRpb25zID0ge307XG5cbm9wdGlvbnMuaW5zZXJ0ID0gXCJoZWFkXCI7XG5vcHRpb25zLnNpbmdsZXRvbiA9IGZhbHNlO1xuXG52YXIgdXBkYXRlID0gYXBpKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5cblxubW9kdWxlLmV4cG9ydHMgPSBjb250ZW50LmxvY2FscyB8fCB7fTsiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///146\n")},function(module,exports,__webpack_require__){eval('exports = module.exports = __webpack_require__(6)(false);\n// Module\nexports.push([module.i, "/*************************************************************************\\n* ADOBE CONFIDENTIAL\\n* ___________________\\n*\\n* Copyright 2019 Adobe\\n* All Rights Reserved.\\n*\\n* NOTICE: All information contained herein is, and remains\\n* the property of Adobe and its suppliers, if any. The intellectual\\n* and technical concepts contained herein are proprietary to Adobe\\n* and its suppliers and are protected by all applicable intellectual\\n* property laws, including trade secret and copyright laws.\\n* Dissemination of this information or reproduction of this material\\n* is strictly forbidden unless prior written permission is obtained\\n* from Adobe.\\n**************************************************************************/\\n\\n.spectrum-CircleLoader.react-spectrum-Wait--centered {\\n  position: absolute;\\n  top: 50%;\\n  left: 50%;\\n  transform: translate(-50%, -50%);\\n}", ""]);\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTQ3LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0b3JxLW5hdGl2ZS9yZWFjdC1zcGVjdHJ1bS9XYWl0L3N0eWxlL2luZGV4LmNzcz80NjAyIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCIuLi8uLi8uLi8uLi9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIikoZmFsc2UpO1xuLy8gTW9kdWxlXG5leHBvcnRzLnB1c2goW21vZHVsZS5pZCwgXCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxcbiogQURPQkUgQ09ORklERU5USUFMXFxuKiBfX19fX19fX19fX19fX19fX19fXFxuKlxcbiogQ29weXJpZ2h0IDIwMTkgQWRvYmVcXG4qIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXFxuKlxcbiogTk9USUNFOiBBbGwgaW5mb3JtYXRpb24gY29udGFpbmVkIGhlcmVpbiBpcywgYW5kIHJlbWFpbnNcXG4qIHRoZSBwcm9wZXJ0eSBvZiBBZG9iZSBhbmQgaXRzIHN1cHBsaWVycywgaWYgYW55LiBUaGUgaW50ZWxsZWN0dWFsXFxuKiBhbmQgdGVjaG5pY2FsIGNvbmNlcHRzIGNvbnRhaW5lZCBoZXJlaW4gYXJlIHByb3ByaWV0YXJ5IHRvIEFkb2JlXFxuKiBhbmQgaXRzIHN1cHBsaWVycyBhbmQgYXJlIHByb3RlY3RlZCBieSBhbGwgYXBwbGljYWJsZSBpbnRlbGxlY3R1YWxcXG4qIHByb3BlcnR5IGxhd3MsIGluY2x1ZGluZyB0cmFkZSBzZWNyZXQgYW5kIGNvcHlyaWdodCBsYXdzLlxcbiogRGlzc2VtaW5hdGlvbiBvZiB0aGlzIGluZm9ybWF0aW9uIG9yIHJlcHJvZHVjdGlvbiBvZiB0aGlzIG1hdGVyaWFsXFxuKiBpcyBzdHJpY3RseSBmb3JiaWRkZW4gdW5sZXNzIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBpcyBvYnRhaW5lZFxcbiogZnJvbSBBZG9iZS5cXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cXG5cXG4uc3BlY3RydW0tQ2lyY2xlTG9hZGVyLnJlYWN0LXNwZWN0cnVtLVdhaXQtLWNlbnRlcmVkIHtcXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcXG4gIHRvcDogNTAlO1xcbiAgbGVmdDogNTAlO1xcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XFxufVwiLCBcIlwiXSk7XG5cbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///147\n')},function(module,exports,__webpack_require__){eval('exports = module.exports = __webpack_require__(6)(false);\n// Module\nexports.push([module.i, ".spectrum-CircleLoader--indeterminate-fill-submask-2 {\\n  animation: 1s infinite linear spectrum-fill-mask-2;\\n}\\n@keyframes spectrum-fill-mask-1 {\\n  0% {\\n    transform: rotate(90deg);\\n  }\\n\\n  1.69% {\\n    transform: rotate(72.3deg);\\n  }\\n\\n  3.39% {\\n    transform: rotate(55.5deg);\\n  }\\n\\n  5.08% {\\n    transform: rotate(40.3deg);\\n  }\\n\\n  6.78% {\\n    transform: rotate(25deg);\\n  }\\n\\n  8.47% {\\n    transform: rotate(10.6deg);\\n  }\\n\\n  10.17% {\\n    transform: rotate(0deg);\\n  }\\n\\n  11.86% {\\n    transform: rotate(0deg);\\n  }\\n\\n  13.56% {\\n    transform: rotate(0deg);\\n  }\\n\\n  15.25% {\\n    transform: rotate(0deg);\\n  }\\n\\n  16.95% {\\n    transform: rotate(0deg);\\n  }\\n\\n  18.64% {\\n    transform: rotate(0deg);\\n  }\\n\\n  20.34% {\\n    transform: rotate(0deg);\\n  }\\n\\n  22.03% {\\n    transform: rotate(0deg);\\n  }\\n\\n  23.73% {\\n    transform: rotate(0deg);\\n  }\\n\\n  25.42% {\\n    transform: rotate(0deg);\\n  }\\n\\n  27.12% {\\n    transform: rotate(0deg);\\n  }\\n\\n  28.81% {\\n    transform: rotate(0deg);\\n  }\\n\\n  30.51% {\\n    transform: rotate(0deg);\\n  }\\n\\n  32.2% {\\n    transform: rotate(0deg);\\n  }\\n\\n  33.9% {\\n    transform: rotate(0deg);\\n  }\\n\\n  35.59% {\\n    transform: rotate(0deg);\\n  }\\n\\n  37.29% {\\n    transform: rotate(0deg);\\n  }\\n\\n  38.98% {\\n    transform: rotate(0deg);\\n  }\\n\\n  40.68% {\\n    transform: rotate(0deg);\\n  }\\n\\n  42.37% {\\n    transform: rotate(5.3deg);\\n  }\\n\\n  44.07% {\\n    transform: rotate(13.4deg);\\n  }\\n\\n  45.76% {\\n    transform: rotate(20.6deg);\\n  }\\n\\n  47.46% {\\n    transform: rotate(29deg);\\n  }\\n\\n  49.15% {\\n    transform: rotate(36.5deg);\\n  }\\n\\n  50.85% {\\n    transform: rotate(42.6deg);\\n  }\\n\\n  52.54% {\\n    transform: rotate(48.8deg);\\n  }\\n\\n  54.24% {\\n    transform: rotate(54.2deg);\\n  }\\n\\n  55.93% {\\n    transform: rotate(59.4deg);\\n  }\\n\\n  57.63% {\\n    transform: rotate(63.2deg);\\n  }\\n\\n  59.32% {\\n    transform: rotate(67.2deg);\\n  }\\n\\n  61.02% {\\n    transform: rotate(70.8deg);\\n  }\\n\\n  62.71% {\\n    transform: rotate(73.8deg);\\n  }\\n\\n  64.41% {\\n    transform: rotate(76.2deg);\\n  }\\n\\n  66.1% {\\n    transform: rotate(78.7deg);\\n  }\\n\\n  67.8% {\\n    transform: rotate(80.6deg);\\n  }\\n\\n  69.49% {\\n    transform: rotate(82.6deg);\\n  }\\n\\n  71.19% {\\n    transform: rotate(83.7deg);\\n  }\\n\\n  72.88% {\\n    transform: rotate(85deg);\\n  }\\n\\n  74.58% {\\n    transform: rotate(86.3deg);\\n  }\\n\\n  76.27% {\\n    transform: rotate(87deg);\\n  }\\n\\n  77.97% {\\n    transform: rotate(87.7deg);\\n  }\\n\\n  79.66% {\\n    transform: rotate(88.3deg);\\n  }\\n\\n  81.36% {\\n    transform: rotate(88.6deg);\\n  }\\n\\n  83.05% {\\n    transform: rotate(89.2deg);\\n  }\\n\\n  84.75% {\\n    transform: rotate(89.2deg);\\n  }\\n\\n  86.44% {\\n    transform: rotate(89.5deg);\\n  }\\n\\n  88.14% {\\n    transform: rotate(89.9deg);\\n  }\\n\\n  89.83% {\\n    transform: rotate(89.7deg);\\n  }\\n\\n  91.53% {\\n    transform: rotate(90.1deg);\\n  }\\n\\n  93.22% {\\n    transform: rotate(90.2deg);\\n  }\\n\\n  94.92% {\\n    transform: rotate(90.1deg);\\n  }\\n\\n  96.61% {\\n    transform: rotate(90deg);\\n  }\\n\\n  98.31% {\\n    transform: rotate(89.8deg);\\n  }\\n\\n  100% {\\n    transform: rotate(90deg);\\n  }\\n}\\n@keyframes spectrum-fill-mask-2 {\\n  0% {\\n    transform: rotate(180deg);\\n  }\\n\\n  1.69% {\\n    transform: rotate(180deg);\\n  }\\n\\n  3.39% {\\n    transform: rotate(180deg);\\n  }\\n\\n  5.08% {\\n    transform: rotate(180deg);\\n  }\\n\\n  6.78% {\\n    transform: rotate(180deg);\\n  }\\n\\n  8.47% {\\n    transform: rotate(180deg);\\n  }\\n\\n  10.17% {\\n    transform: rotate(179.2deg);\\n  }\\n\\n  11.86% {\\n    transform: rotate(164deg);\\n  }\\n\\n  13.56% {\\n    transform: rotate(151.8deg);\\n  }\\n\\n  15.25% {\\n    transform: rotate(140.8deg);\\n  }\\n\\n  16.95% {\\n    transform: rotate(130.3deg);\\n  }\\n\\n  18.64% {\\n    transform: rotate(120.4deg);\\n  }\\n\\n  20.34% {\\n    transform: rotate(110.8deg);\\n  }\\n\\n  22.03% {\\n    transform: rotate(101.6deg);\\n  }\\n\\n  23.73% {\\n    transform: rotate(93.5deg);\\n  }\\n\\n  25.42% {\\n    transform: rotate(85.4deg);\\n  }\\n\\n  27.12% {\\n    transform: rotate(78.1deg);\\n  }\\n\\n  28.81% {\\n    transform: rotate(71.2deg);\\n  }\\n\\n  30.51% {\\n    transform: rotate(89.1deg);\\n  }\\n\\n  32.2% {\\n    transform: rotate(105.5deg);\\n  }\\n\\n  33.9% {\\n    transform: rotate(121.3deg);\\n  }\\n\\n  35.59% {\\n    transform: rotate(135.5deg);\\n  }\\n\\n  37.29% {\\n    transform: rotate(148.4deg);\\n  }\\n\\n  38.98% {\\n    transform: rotate(161deg);\\n  }\\n\\n  40.68% {\\n    transform: rotate(173.5deg);\\n  }\\n\\n  42.37% {\\n    transform: rotate(180deg);\\n  }\\n\\n  44.07% {\\n    transform: rotate(180deg);\\n  }\\n\\n  45.76% {\\n    transform: rotate(180deg);\\n  }\\n\\n  47.46% {\\n    transform: rotate(180deg);\\n  }\\n\\n  49.15% {\\n    transform: rotate(180deg);\\n  }\\n\\n  50.85% {\\n    transform: rotate(180deg);\\n  }\\n\\n  52.54% {\\n    transform: rotate(180deg);\\n  }\\n\\n  54.24% {\\n    transform: rotate(180deg);\\n  }\\n\\n  55.93% {\\n    transform: rotate(180deg);\\n  }\\n\\n  57.63% {\\n    transform: rotate(180deg);\\n  }\\n\\n  59.32% {\\n    transform: rotate(180deg);\\n  }\\n\\n  61.02% {\\n    transform: rotate(180deg);\\n  }\\n\\n  62.71% {\\n    transform: rotate(180deg);\\n  }\\n\\n  64.41% {\\n    transform: rotate(180deg);\\n  }\\n\\n  66.1% {\\n    transform: rotate(180deg);\\n  }\\n\\n  67.8% {\\n    transform: rotate(180deg);\\n  }\\n\\n  69.49% {\\n    transform: rotate(180deg);\\n  }\\n\\n  71.19% {\\n    transform: rotate(180deg);\\n  }\\n\\n  72.88% {\\n    transform: rotate(180deg);\\n  }\\n\\n  74.58% {\\n    transform: rotate(180deg);\\n  }\\n\\n  76.27% {\\n    transform: rotate(180deg);\\n  }\\n\\n  77.97% {\\n    transform: rotate(180deg);\\n  }\\n\\n  79.66% {\\n    transform: rotate(180deg);\\n  }\\n\\n  81.36% {\\n    transform: rotate(180deg);\\n  }\\n\\n  83.05% {\\n    transform: rotate(180deg);\\n  }\\n\\n  84.75% {\\n    transform: rotate(180deg);\\n  }\\n\\n  86.44% {\\n    transform: rotate(180deg);\\n  }\\n\\n  88.14% {\\n    transform: rotate(180deg);\\n  }\\n\\n  89.83% {\\n    transform: rotate(180deg);\\n  }\\n\\n  91.53% {\\n    transform: rotate(180deg);\\n  }\\n\\n  93.22% {\\n    transform: rotate(180deg);\\n  }\\n\\n  94.92% {\\n    transform: rotate(180deg);\\n  }\\n\\n  96.61% {\\n    transform: rotate(180deg);\\n  }\\n\\n  98.31% {\\n    transform: rotate(180deg);\\n  }\\n\\n  100% {\\n    transform: rotate(180deg);\\n  }\\n}\\n@keyframes spectrum-fills-rotate {\\n  0% {transform: rotate(-90deg)}\\n  100% {transform: rotate(270deg)}\\n}\\n.spectrum-CircleLoader {\\n  display: inline-block;\\n  width: 32px;\\n  height: 32px;\\n  position: relative;\\n  direction: ltr;\\n}\\n.spectrum-CircleLoader-track {\\n  box-sizing: border-box;\\n  width: 32px;\\n  height: 32px;\\n  border-style: solid;\\n  border-width: 3px;\\n  border-radius: 32px;\\n}\\n.spectrum-CircleLoader-fills {\\n  position: absolute;\\n  top: 0;\\n  left: 0;\\n  width: 100%;\\n  height: 100%;\\n}\\n.spectrum-CircleLoader-fill {\\n  box-sizing: border-box;\\n  width: 32px;\\n  height: 32px;\\n  border-style: solid;\\n  border-width: 3px;\\n  border-radius: 32px;\\n}\\n.spectrum-CircleLoader-fillMask1,\\n.spectrum-CircleLoader-fillMask2 {\\n  width: 50%;\\n  height: 100%;\\n  transform-origin: 100% center;\\n  transform: rotate(180deg);\\n  overflow: hidden;\\n  position: absolute;\\n}\\n.spectrum-CircleLoader-fillSubMask1,\\n.spectrum-CircleLoader-fillSubMask2 {\\n  width: 100%;\\n  height: 100%;\\n  transform-origin: 100% center;\\n  overflow: hidden;\\n  transform: rotate(-180deg);\\n}\\n.spectrum-CircleLoader-fillMask2 {\\n  transform: rotate(0deg);\\n}\\n.spectrum-CircleLoader--small {\\n  width: 16px;\\n  height: 16px;\\n}\\n.spectrum-CircleLoader--small .spectrum-CircleLoader-track {\\n    width: 16px;\\n    height: 16px;\\n    border-style: solid;\\n    border-width: 2px;\\n    border-radius: 16px;\\n  }\\n.spectrum-CircleLoader--small .spectrum-CircleLoader-fill {\\n    width: 16px;\\n    height: 16px;\\n    border-style: solid;\\n    border-width: 2px;\\n    border-radius: 16px;\\n  }\\n.spectrum-CircleLoader--large {\\n  width: 64px;\\n  height: 64px;\\n}\\n.spectrum-CircleLoader--large .spectrum-CircleLoader-track {\\n    width: 64px;\\n    height: 64px;\\n    border-style: solid;\\n    border-width: 4px;\\n    border-radius: 64px;\\n  }\\n.spectrum-CircleLoader--large .spectrum-CircleLoader-fill {\\n    width: 64px;\\n    height: 64px;\\n    border-style: solid;\\n    border-width: 4px;\\n    border-radius: 64px;\\n  }\\n.spectrum-CircleLoader--indeterminate .spectrum-CircleLoader-fills {\\n    will-change: transform;\\n    transform: translateZ(0);\\n    animation: 1s infinite cubic-bezier(.25,.78,.48,.89) spectrum-fills-rotate;\\n    transform-origin: center;\\n  }\\n.spectrum-CircleLoader--indeterminate .spectrum-CircleLoader-fillSubMask1 {\\n    will-change: transform;\\n    transform: translateZ(0);\\n    animation: 1s infinite linear spectrum-fill-mask-1;\\n  }\\n.spectrum-CircleLoader--indeterminate .spectrum-CircleLoader-fillSubMask2 {\\n    will-change: transform;\\n    transform: translateZ(0);\\n    animation: 1s infinite linear spectrum-fill-mask-2;\\n  }\\n", ""]);\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTQ4LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhZG9iZS9zcGVjdHJ1bS1jc3MvZGlzdC9jb21wb25lbnRzL2NpcmNsZWxvYWRlci9pbmRleC5jc3M/YzIzYiJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiLi4vLi4vLi4vLi4vLi4vY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzXCIpKGZhbHNlKTtcbi8vIE1vZHVsZVxuZXhwb3J0cy5wdXNoKFttb2R1bGUuaWQsIFwiLnNwZWN0cnVtLUNpcmNsZUxvYWRlci0taW5kZXRlcm1pbmF0ZS1maWxsLXN1Ym1hc2stMiB7XFxuICBhbmltYXRpb246IDFzIGluZmluaXRlIGxpbmVhciBzcGVjdHJ1bS1maWxsLW1hc2stMjtcXG59XFxuQGtleWZyYW1lcyBzcGVjdHJ1bS1maWxsLW1hc2stMSB7XFxuICAwJSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDkwZGVnKTtcXG4gIH1cXG5cXG4gIDEuNjklIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoNzIuM2RlZyk7XFxuICB9XFxuXFxuICAzLjM5JSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDU1LjVkZWcpO1xcbiAgfVxcblxcbiAgNS4wOCUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSg0MC4zZGVnKTtcXG4gIH1cXG5cXG4gIDYuNzglIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMjVkZWcpO1xcbiAgfVxcblxcbiAgOC40NyUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxMC42ZGVnKTtcXG4gIH1cXG5cXG4gIDEwLjE3JSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDBkZWcpO1xcbiAgfVxcblxcbiAgMTEuODYlIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7XFxuICB9XFxuXFxuICAxMy41NiUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTtcXG4gIH1cXG5cXG4gIDE1LjI1JSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDBkZWcpO1xcbiAgfVxcblxcbiAgMTYuOTUlIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7XFxuICB9XFxuXFxuICAxOC42NCUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTtcXG4gIH1cXG5cXG4gIDIwLjM0JSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDBkZWcpO1xcbiAgfVxcblxcbiAgMjIuMDMlIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7XFxuICB9XFxuXFxuICAyMy43MyUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTtcXG4gIH1cXG5cXG4gIDI1LjQyJSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDBkZWcpO1xcbiAgfVxcblxcbiAgMjcuMTIlIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7XFxuICB9XFxuXFxuICAyOC44MSUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTtcXG4gIH1cXG5cXG4gIDMwLjUxJSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDBkZWcpO1xcbiAgfVxcblxcbiAgMzIuMiUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTtcXG4gIH1cXG5cXG4gIDMzLjklIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7XFxuICB9XFxuXFxuICAzNS41OSUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTtcXG4gIH1cXG5cXG4gIDM3LjI5JSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDBkZWcpO1xcbiAgfVxcblxcbiAgMzguOTglIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7XFxuICB9XFxuXFxuICA0MC42OCUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTtcXG4gIH1cXG5cXG4gIDQyLjM3JSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDUuM2RlZyk7XFxuICB9XFxuXFxuICA0NC4wNyUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxMy40ZGVnKTtcXG4gIH1cXG5cXG4gIDQ1Ljc2JSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDIwLjZkZWcpO1xcbiAgfVxcblxcbiAgNDcuNDYlIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMjlkZWcpO1xcbiAgfVxcblxcbiAgNDkuMTUlIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMzYuNWRlZyk7XFxuICB9XFxuXFxuICA1MC44NSUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSg0Mi42ZGVnKTtcXG4gIH1cXG5cXG4gIDUyLjU0JSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDQ4LjhkZWcpO1xcbiAgfVxcblxcbiAgNTQuMjQlIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoNTQuMmRlZyk7XFxuICB9XFxuXFxuICA1NS45MyUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSg1OS40ZGVnKTtcXG4gIH1cXG5cXG4gIDU3LjYzJSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDYzLjJkZWcpO1xcbiAgfVxcblxcbiAgNTkuMzIlIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoNjcuMmRlZyk7XFxuICB9XFxuXFxuICA2MS4wMiUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSg3MC44ZGVnKTtcXG4gIH1cXG5cXG4gIDYyLjcxJSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDczLjhkZWcpO1xcbiAgfVxcblxcbiAgNjQuNDElIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoNzYuMmRlZyk7XFxuICB9XFxuXFxuICA2Ni4xJSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDc4LjdkZWcpO1xcbiAgfVxcblxcbiAgNjcuOCUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSg4MC42ZGVnKTtcXG4gIH1cXG5cXG4gIDY5LjQ5JSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDgyLjZkZWcpO1xcbiAgfVxcblxcbiAgNzEuMTklIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoODMuN2RlZyk7XFxuICB9XFxuXFxuICA3Mi44OCUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSg4NWRlZyk7XFxuICB9XFxuXFxuICA3NC41OCUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSg4Ni4zZGVnKTtcXG4gIH1cXG5cXG4gIDc2LjI3JSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDg3ZGVnKTtcXG4gIH1cXG5cXG4gIDc3Ljk3JSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDg3LjdkZWcpO1xcbiAgfVxcblxcbiAgNzkuNjYlIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoODguM2RlZyk7XFxuICB9XFxuXFxuICA4MS4zNiUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSg4OC42ZGVnKTtcXG4gIH1cXG5cXG4gIDgzLjA1JSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDg5LjJkZWcpO1xcbiAgfVxcblxcbiAgODQuNzUlIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoODkuMmRlZyk7XFxuICB9XFxuXFxuICA4Ni40NCUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSg4OS41ZGVnKTtcXG4gIH1cXG5cXG4gIDg4LjE0JSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDg5LjlkZWcpO1xcbiAgfVxcblxcbiAgODkuODMlIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoODkuN2RlZyk7XFxuICB9XFxuXFxuICA5MS41MyUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSg5MC4xZGVnKTtcXG4gIH1cXG5cXG4gIDkzLjIyJSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDkwLjJkZWcpO1xcbiAgfVxcblxcbiAgOTQuOTIlIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoOTAuMWRlZyk7XFxuICB9XFxuXFxuICA5Ni42MSUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSg5MGRlZyk7XFxuICB9XFxuXFxuICA5OC4zMSUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSg4OS44ZGVnKTtcXG4gIH1cXG5cXG4gIDEwMCUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSg5MGRlZyk7XFxuICB9XFxufVxcbkBrZXlmcmFtZXMgc3BlY3RydW0tZmlsbC1tYXNrLTIge1xcbiAgMCUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpO1xcbiAgfVxcblxcbiAgMS42OSUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpO1xcbiAgfVxcblxcbiAgMy4zOSUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpO1xcbiAgfVxcblxcbiAgNS4wOCUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpO1xcbiAgfVxcblxcbiAgNi43OCUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpO1xcbiAgfVxcblxcbiAgOC40NyUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpO1xcbiAgfVxcblxcbiAgMTAuMTclIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMTc5LjJkZWcpO1xcbiAgfVxcblxcbiAgMTEuODYlIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMTY0ZGVnKTtcXG4gIH1cXG5cXG4gIDEzLjU2JSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDE1MS44ZGVnKTtcXG4gIH1cXG5cXG4gIDE1LjI1JSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDE0MC44ZGVnKTtcXG4gIH1cXG5cXG4gIDE2Ljk1JSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDEzMC4zZGVnKTtcXG4gIH1cXG5cXG4gIDE4LjY0JSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDEyMC40ZGVnKTtcXG4gIH1cXG5cXG4gIDIwLjM0JSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDExMC44ZGVnKTtcXG4gIH1cXG5cXG4gIDIyLjAzJSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDEwMS42ZGVnKTtcXG4gIH1cXG5cXG4gIDIzLjczJSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDkzLjVkZWcpO1xcbiAgfVxcblxcbiAgMjUuNDIlIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoODUuNGRlZyk7XFxuICB9XFxuXFxuICAyNy4xMiUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSg3OC4xZGVnKTtcXG4gIH1cXG5cXG4gIDI4LjgxJSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDcxLjJkZWcpO1xcbiAgfVxcblxcbiAgMzAuNTElIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoODkuMWRlZyk7XFxuICB9XFxuXFxuICAzMi4yJSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDEwNS41ZGVnKTtcXG4gIH1cXG5cXG4gIDMzLjklIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMTIxLjNkZWcpO1xcbiAgfVxcblxcbiAgMzUuNTklIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMTM1LjVkZWcpO1xcbiAgfVxcblxcbiAgMzcuMjklIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMTQ4LjRkZWcpO1xcbiAgfVxcblxcbiAgMzguOTglIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMTYxZGVnKTtcXG4gIH1cXG5cXG4gIDQwLjY4JSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDE3My41ZGVnKTtcXG4gIH1cXG5cXG4gIDQyLjM3JSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDE4MGRlZyk7XFxuICB9XFxuXFxuICA0NC4wNyUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpO1xcbiAgfVxcblxcbiAgNDUuNzYlIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMTgwZGVnKTtcXG4gIH1cXG5cXG4gIDQ3LjQ2JSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDE4MGRlZyk7XFxuICB9XFxuXFxuICA0OS4xNSUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpO1xcbiAgfVxcblxcbiAgNTAuODUlIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMTgwZGVnKTtcXG4gIH1cXG5cXG4gIDUyLjU0JSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDE4MGRlZyk7XFxuICB9XFxuXFxuICA1NC4yNCUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpO1xcbiAgfVxcblxcbiAgNTUuOTMlIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMTgwZGVnKTtcXG4gIH1cXG5cXG4gIDU3LjYzJSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDE4MGRlZyk7XFxuICB9XFxuXFxuICA1OS4zMiUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpO1xcbiAgfVxcblxcbiAgNjEuMDIlIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMTgwZGVnKTtcXG4gIH1cXG5cXG4gIDYyLjcxJSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDE4MGRlZyk7XFxuICB9XFxuXFxuICA2NC40MSUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpO1xcbiAgfVxcblxcbiAgNjYuMSUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpO1xcbiAgfVxcblxcbiAgNjcuOCUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpO1xcbiAgfVxcblxcbiAgNjkuNDklIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMTgwZGVnKTtcXG4gIH1cXG5cXG4gIDcxLjE5JSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDE4MGRlZyk7XFxuICB9XFxuXFxuICA3Mi44OCUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpO1xcbiAgfVxcblxcbiAgNzQuNTglIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMTgwZGVnKTtcXG4gIH1cXG5cXG4gIDc2LjI3JSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDE4MGRlZyk7XFxuICB9XFxuXFxuICA3Ny45NyUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpO1xcbiAgfVxcblxcbiAgNzkuNjYlIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMTgwZGVnKTtcXG4gIH1cXG5cXG4gIDgxLjM2JSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDE4MGRlZyk7XFxuICB9XFxuXFxuICA4My4wNSUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpO1xcbiAgfVxcblxcbiAgODQuNzUlIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMTgwZGVnKTtcXG4gIH1cXG5cXG4gIDg2LjQ0JSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDE4MGRlZyk7XFxuICB9XFxuXFxuICA4OC4xNCUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpO1xcbiAgfVxcblxcbiAgODkuODMlIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMTgwZGVnKTtcXG4gIH1cXG5cXG4gIDkxLjUzJSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDE4MGRlZyk7XFxuICB9XFxuXFxuICA5My4yMiUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpO1xcbiAgfVxcblxcbiAgOTQuOTIlIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMTgwZGVnKTtcXG4gIH1cXG5cXG4gIDk2LjYxJSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDE4MGRlZyk7XFxuICB9XFxuXFxuICA5OC4zMSUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpO1xcbiAgfVxcblxcbiAgMTAwJSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDE4MGRlZyk7XFxuICB9XFxufVxcbkBrZXlmcmFtZXMgc3BlY3RydW0tZmlsbHMtcm90YXRlIHtcXG4gIDAlIHt0cmFuc2Zvcm06IHJvdGF0ZSgtOTBkZWcpfVxcbiAgMTAwJSB7dHJhbnNmb3JtOiByb3RhdGUoMjcwZGVnKX1cXG59XFxuLnNwZWN0cnVtLUNpcmNsZUxvYWRlciB7XFxuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxuICB3aWR0aDogMzJweDtcXG4gIGhlaWdodDogMzJweDtcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gIGRpcmVjdGlvbjogbHRyO1xcbn1cXG4uc3BlY3RydW0tQ2lyY2xlTG9hZGVyLXRyYWNrIHtcXG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XFxuICB3aWR0aDogMzJweDtcXG4gIGhlaWdodDogMzJweDtcXG4gIGJvcmRlci1zdHlsZTogc29saWQ7XFxuICBib3JkZXItd2lkdGg6IDNweDtcXG4gIGJvcmRlci1yYWRpdXM6IDMycHg7XFxufVxcbi5zcGVjdHJ1bS1DaXJjbGVMb2FkZXItZmlsbHMge1xcbiAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgdG9wOiAwO1xcbiAgbGVmdDogMDtcXG4gIHdpZHRoOiAxMDAlO1xcbiAgaGVpZ2h0OiAxMDAlO1xcbn1cXG4uc3BlY3RydW0tQ2lyY2xlTG9hZGVyLWZpbGwge1xcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXG4gIHdpZHRoOiAzMnB4O1xcbiAgaGVpZ2h0OiAzMnB4O1xcbiAgYm9yZGVyLXN0eWxlOiBzb2xpZDtcXG4gIGJvcmRlci13aWR0aDogM3B4O1xcbiAgYm9yZGVyLXJhZGl1czogMzJweDtcXG59XFxuLnNwZWN0cnVtLUNpcmNsZUxvYWRlci1maWxsTWFzazEsXFxuLnNwZWN0cnVtLUNpcmNsZUxvYWRlci1maWxsTWFzazIge1xcbiAgd2lkdGg6IDUwJTtcXG4gIGhlaWdodDogMTAwJTtcXG4gIHRyYW5zZm9ybS1vcmlnaW46IDEwMCUgY2VudGVyO1xcbiAgdHJhbnNmb3JtOiByb3RhdGUoMTgwZGVnKTtcXG4gIG92ZXJmbG93OiBoaWRkZW47XFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxufVxcbi5zcGVjdHJ1bS1DaXJjbGVMb2FkZXItZmlsbFN1Yk1hc2sxLFxcbi5zcGVjdHJ1bS1DaXJjbGVMb2FkZXItZmlsbFN1Yk1hc2syIHtcXG4gIHdpZHRoOiAxMDAlO1xcbiAgaGVpZ2h0OiAxMDAlO1xcbiAgdHJhbnNmb3JtLW9yaWdpbjogMTAwJSBjZW50ZXI7XFxuICBvdmVyZmxvdzogaGlkZGVuO1xcbiAgdHJhbnNmb3JtOiByb3RhdGUoLTE4MGRlZyk7XFxufVxcbi5zcGVjdHJ1bS1DaXJjbGVMb2FkZXItZmlsbE1hc2syIHtcXG4gIHRyYW5zZm9ybTogcm90YXRlKDBkZWcpO1xcbn1cXG4uc3BlY3RydW0tQ2lyY2xlTG9hZGVyLS1zbWFsbCB7XFxuICB3aWR0aDogMTZweDtcXG4gIGhlaWdodDogMTZweDtcXG59XFxuLnNwZWN0cnVtLUNpcmNsZUxvYWRlci0tc21hbGwgLnNwZWN0cnVtLUNpcmNsZUxvYWRlci10cmFjayB7XFxuICAgIHdpZHRoOiAxNnB4O1xcbiAgICBoZWlnaHQ6IDE2cHg7XFxuICAgIGJvcmRlci1zdHlsZTogc29saWQ7XFxuICAgIGJvcmRlci13aWR0aDogMnB4O1xcbiAgICBib3JkZXItcmFkaXVzOiAxNnB4O1xcbiAgfVxcbi5zcGVjdHJ1bS1DaXJjbGVMb2FkZXItLXNtYWxsIC5zcGVjdHJ1bS1DaXJjbGVMb2FkZXItZmlsbCB7XFxuICAgIHdpZHRoOiAxNnB4O1xcbiAgICBoZWlnaHQ6IDE2cHg7XFxuICAgIGJvcmRlci1zdHlsZTogc29saWQ7XFxuICAgIGJvcmRlci13aWR0aDogMnB4O1xcbiAgICBib3JkZXItcmFkaXVzOiAxNnB4O1xcbiAgfVxcbi5zcGVjdHJ1bS1DaXJjbGVMb2FkZXItLWxhcmdlIHtcXG4gIHdpZHRoOiA2NHB4O1xcbiAgaGVpZ2h0OiA2NHB4O1xcbn1cXG4uc3BlY3RydW0tQ2lyY2xlTG9hZGVyLS1sYXJnZSAuc3BlY3RydW0tQ2lyY2xlTG9hZGVyLXRyYWNrIHtcXG4gICAgd2lkdGg6IDY0cHg7XFxuICAgIGhlaWdodDogNjRweDtcXG4gICAgYm9yZGVyLXN0eWxlOiBzb2xpZDtcXG4gICAgYm9yZGVyLXdpZHRoOiA0cHg7XFxuICAgIGJvcmRlci1yYWRpdXM6IDY0cHg7XFxuICB9XFxuLnNwZWN0cnVtLUNpcmNsZUxvYWRlci0tbGFyZ2UgLnNwZWN0cnVtLUNpcmNsZUxvYWRlci1maWxsIHtcXG4gICAgd2lkdGg6IDY0cHg7XFxuICAgIGhlaWdodDogNjRweDtcXG4gICAgYm9yZGVyLXN0eWxlOiBzb2xpZDtcXG4gICAgYm9yZGVyLXdpZHRoOiA0cHg7XFxuICAgIGJvcmRlci1yYWRpdXM6IDY0cHg7XFxuICB9XFxuLnNwZWN0cnVtLUNpcmNsZUxvYWRlci0taW5kZXRlcm1pbmF0ZSAuc3BlY3RydW0tQ2lyY2xlTG9hZGVyLWZpbGxzIHtcXG4gICAgd2lsbC1jaGFuZ2U6IHRyYW5zZm9ybTtcXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVaKDApO1xcbiAgICBhbmltYXRpb246IDFzIGluZmluaXRlIGN1YmljLWJlemllciguMjUsLjc4LC40OCwuODkpIHNwZWN0cnVtLWZpbGxzLXJvdGF0ZTtcXG4gICAgdHJhbnNmb3JtLW9yaWdpbjogY2VudGVyO1xcbiAgfVxcbi5zcGVjdHJ1bS1DaXJjbGVMb2FkZXItLWluZGV0ZXJtaW5hdGUgLnNwZWN0cnVtLUNpcmNsZUxvYWRlci1maWxsU3ViTWFzazEge1xcbiAgICB3aWxsLWNoYW5nZTogdHJhbnNmb3JtO1xcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVooMCk7XFxuICAgIGFuaW1hdGlvbjogMXMgaW5maW5pdGUgbGluZWFyIHNwZWN0cnVtLWZpbGwtbWFzay0xO1xcbiAgfVxcbi5zcGVjdHJ1bS1DaXJjbGVMb2FkZXItLWluZGV0ZXJtaW5hdGUgLnNwZWN0cnVtLUNpcmNsZUxvYWRlci1maWxsU3ViTWFzazIge1xcbiAgICB3aWxsLWNoYW5nZTogdHJhbnNmb3JtO1xcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVooMCk7XFxuICAgIGFuaW1hdGlvbjogMXMgaW5maW5pdGUgbGluZWFyIHNwZWN0cnVtLWZpbGwtbWFzay0yO1xcbiAgfVxcblwiLCBcIlwiXSk7XG5cbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///148\n')},function(module,exports,__webpack_require__){eval("var api = __webpack_require__(5);\n            var content = __webpack_require__(150);\n\n            content = content.__esModule ? content.default : content;\n\n            if (typeof content === 'string') {\n              content = [[module.i, content, '']];\n            }\n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = api(content, options);\n\n\n\nmodule.exports = content.locals || {};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTQ5LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhZG9iZS9zcGVjdHJ1bS1jc3MvZGlzdC9jb21wb25lbnRzL2NpcmNsZWxvYWRlci9pbmRleC1kaWZmLmNzcz84OGU3Il0sInNvdXJjZXNDb250ZW50IjpbInZhciBhcGkgPSByZXF1aXJlKFwiIS4uLy4uLy4uLy4uLy4uL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzXCIpO1xuICAgICAgICAgICAgdmFyIGNvbnRlbnQgPSByZXF1aXJlKFwiISEuLi8uLi8uLi8uLi8uLi9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vaW5kZXgtZGlmZi5jc3NcIik7XG5cbiAgICAgICAgICAgIGNvbnRlbnQgPSBjb250ZW50Ll9fZXNNb2R1bGUgPyBjb250ZW50LmRlZmF1bHQgOiBjb250ZW50O1xuXG4gICAgICAgICAgICBpZiAodHlwZW9mIGNvbnRlbnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgIGNvbnRlbnQgPSBbW21vZHVsZS5pZCwgY29udGVudCwgJyddXTtcbiAgICAgICAgICAgIH1cblxudmFyIG9wdGlvbnMgPSB7fTtcblxub3B0aW9ucy5pbnNlcnQgPSBcImhlYWRcIjtcbm9wdGlvbnMuc2luZ2xldG9uID0gZmFsc2U7XG5cbnZhciB1cGRhdGUgPSBhcGkoY29udGVudCwgb3B0aW9ucyk7XG5cblxuXG5tb2R1bGUuZXhwb3J0cyA9IGNvbnRlbnQubG9jYWxzIHx8IHt9OyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///149\n")},function(module,exports,__webpack_require__){eval('exports = module.exports = __webpack_require__(6)(false);\n// Module\nexports.push([module.i, ".spectrum--large {\\n@keyframes spectrum-fill-mask-1 {\\n  0% {\\n    transform: rotate(90deg);\\n  }\\n\\n  1.69% {\\n    transform: rotate(72.3deg);\\n  }\\n\\n  3.39% {\\n    transform: rotate(55.5deg);\\n  }\\n\\n  5.08% {\\n    transform: rotate(40.3deg);\\n  }\\n\\n  6.78% {\\n    transform: rotate(25deg);\\n  }\\n\\n  8.47% {\\n    transform: rotate(10.6deg);\\n  }\\n\\n  10.17% {\\n    transform: rotate(0deg);\\n  }\\n\\n  11.86% {\\n    transform: rotate(0deg);\\n  }\\n\\n  13.56% {\\n    transform: rotate(0deg);\\n  }\\n\\n  15.25% {\\n    transform: rotate(0deg);\\n  }\\n\\n  16.95% {\\n    transform: rotate(0deg);\\n  }\\n\\n  18.64% {\\n    transform: rotate(0deg);\\n  }\\n\\n  20.34% {\\n    transform: rotate(0deg);\\n  }\\n\\n  22.03% {\\n    transform: rotate(0deg);\\n  }\\n\\n  23.73% {\\n    transform: rotate(0deg);\\n  }\\n\\n  25.42% {\\n    transform: rotate(0deg);\\n  }\\n\\n  27.12% {\\n    transform: rotate(0deg);\\n  }\\n\\n  28.81% {\\n    transform: rotate(0deg);\\n  }\\n\\n  30.51% {\\n    transform: rotate(0deg);\\n  }\\n\\n  32.2% {\\n    transform: rotate(0deg);\\n  }\\n\\n  33.9% {\\n    transform: rotate(0deg);\\n  }\\n\\n  35.59% {\\n    transform: rotate(0deg);\\n  }\\n\\n  37.29% {\\n    transform: rotate(0deg);\\n  }\\n\\n  38.98% {\\n    transform: rotate(0deg);\\n  }\\n\\n  40.68% {\\n    transform: rotate(0deg);\\n  }\\n\\n  42.37% {\\n    transform: rotate(5.3deg);\\n  }\\n\\n  44.07% {\\n    transform: rotate(13.4deg);\\n  }\\n\\n  45.76% {\\n    transform: rotate(20.6deg);\\n  }\\n\\n  47.46% {\\n    transform: rotate(29deg);\\n  }\\n\\n  49.15% {\\n    transform: rotate(36.5deg);\\n  }\\n\\n  50.85% {\\n    transform: rotate(42.6deg);\\n  }\\n\\n  52.54% {\\n    transform: rotate(48.8deg);\\n  }\\n\\n  54.24% {\\n    transform: rotate(54.2deg);\\n  }\\n\\n  55.93% {\\n    transform: rotate(59.4deg);\\n  }\\n\\n  57.63% {\\n    transform: rotate(63.2deg);\\n  }\\n\\n  59.32% {\\n    transform: rotate(67.2deg);\\n  }\\n\\n  61.02% {\\n    transform: rotate(70.8deg);\\n  }\\n\\n  62.71% {\\n    transform: rotate(73.8deg);\\n  }\\n\\n  64.41% {\\n    transform: rotate(76.2deg);\\n  }\\n\\n  66.1% {\\n    transform: rotate(78.7deg);\\n  }\\n\\n  67.8% {\\n    transform: rotate(80.6deg);\\n  }\\n\\n  69.49% {\\n    transform: rotate(82.6deg);\\n  }\\n\\n  71.19% {\\n    transform: rotate(83.7deg);\\n  }\\n\\n  72.88% {\\n    transform: rotate(85deg);\\n  }\\n\\n  74.58% {\\n    transform: rotate(86.3deg);\\n  }\\n\\n  76.27% {\\n    transform: rotate(87deg);\\n  }\\n\\n  77.97% {\\n    transform: rotate(87.7deg);\\n  }\\n\\n  79.66% {\\n    transform: rotate(88.3deg);\\n  }\\n\\n  81.36% {\\n    transform: rotate(88.6deg);\\n  }\\n\\n  83.05% {\\n    transform: rotate(89.2deg);\\n  }\\n\\n  84.75% {\\n    transform: rotate(89.2deg);\\n  }\\n\\n  86.44% {\\n    transform: rotate(89.5deg);\\n  }\\n\\n  88.14% {\\n    transform: rotate(89.9deg);\\n  }\\n\\n  89.83% {\\n    transform: rotate(89.7deg);\\n  }\\n\\n  91.53% {\\n    transform: rotate(90.1deg);\\n  }\\n\\n  93.22% {\\n    transform: rotate(90.2deg);\\n  }\\n\\n  94.92% {\\n    transform: rotate(90.1deg);\\n  }\\n\\n  96.61% {\\n    transform: rotate(90deg);\\n  }\\n\\n  98.31% {\\n    transform: rotate(89.8deg);\\n  }\\n\\n  100% {\\n    transform: rotate(90deg);\\n  }\\n}\\n@keyframes spectrum-fill-mask-2 {\\n  0% {\\n    transform: rotate(180deg);\\n  }\\n\\n  1.69% {\\n    transform: rotate(180deg);\\n  }\\n\\n  3.39% {\\n    transform: rotate(180deg);\\n  }\\n\\n  5.08% {\\n    transform: rotate(180deg);\\n  }\\n\\n  6.78% {\\n    transform: rotate(180deg);\\n  }\\n\\n  8.47% {\\n    transform: rotate(180deg);\\n  }\\n\\n  10.17% {\\n    transform: rotate(179.2deg);\\n  }\\n\\n  11.86% {\\n    transform: rotate(164deg);\\n  }\\n\\n  13.56% {\\n    transform: rotate(151.8deg);\\n  }\\n\\n  15.25% {\\n    transform: rotate(140.8deg);\\n  }\\n\\n  16.95% {\\n    transform: rotate(130.3deg);\\n  }\\n\\n  18.64% {\\n    transform: rotate(120.4deg);\\n  }\\n\\n  20.34% {\\n    transform: rotate(110.8deg);\\n  }\\n\\n  22.03% {\\n    transform: rotate(101.6deg);\\n  }\\n\\n  23.73% {\\n    transform: rotate(93.5deg);\\n  }\\n\\n  25.42% {\\n    transform: rotate(85.4deg);\\n  }\\n\\n  27.12% {\\n    transform: rotate(78.1deg);\\n  }\\n\\n  28.81% {\\n    transform: rotate(71.2deg);\\n  }\\n\\n  30.51% {\\n    transform: rotate(89.1deg);\\n  }\\n\\n  32.2% {\\n    transform: rotate(105.5deg);\\n  }\\n\\n  33.9% {\\n    transform: rotate(121.3deg);\\n  }\\n\\n  35.59% {\\n    transform: rotate(135.5deg);\\n  }\\n\\n  37.29% {\\n    transform: rotate(148.4deg);\\n  }\\n\\n  38.98% {\\n    transform: rotate(161deg);\\n  }\\n\\n  40.68% {\\n    transform: rotate(173.5deg);\\n  }\\n\\n  42.37% {\\n    transform: rotate(180deg);\\n  }\\n\\n  44.07% {\\n    transform: rotate(180deg);\\n  }\\n\\n  45.76% {\\n    transform: rotate(180deg);\\n  }\\n\\n  47.46% {\\n    transform: rotate(180deg);\\n  }\\n\\n  49.15% {\\n    transform: rotate(180deg);\\n  }\\n\\n  50.85% {\\n    transform: rotate(180deg);\\n  }\\n\\n  52.54% {\\n    transform: rotate(180deg);\\n  }\\n\\n  54.24% {\\n    transform: rotate(180deg);\\n  }\\n\\n  55.93% {\\n    transform: rotate(180deg);\\n  }\\n\\n  57.63% {\\n    transform: rotate(180deg);\\n  }\\n\\n  59.32% {\\n    transform: rotate(180deg);\\n  }\\n\\n  61.02% {\\n    transform: rotate(180deg);\\n  }\\n\\n  62.71% {\\n    transform: rotate(180deg);\\n  }\\n\\n  64.41% {\\n    transform: rotate(180deg);\\n  }\\n\\n  66.1% {\\n    transform: rotate(180deg);\\n  }\\n\\n  67.8% {\\n    transform: rotate(180deg);\\n  }\\n\\n  69.49% {\\n    transform: rotate(180deg);\\n  }\\n\\n  71.19% {\\n    transform: rotate(180deg);\\n  }\\n\\n  72.88% {\\n    transform: rotate(180deg);\\n  }\\n\\n  74.58% {\\n    transform: rotate(180deg);\\n  }\\n\\n  76.27% {\\n    transform: rotate(180deg);\\n  }\\n\\n  77.97% {\\n    transform: rotate(180deg);\\n  }\\n\\n  79.66% {\\n    transform: rotate(180deg);\\n  }\\n\\n  81.36% {\\n    transform: rotate(180deg);\\n  }\\n\\n  83.05% {\\n    transform: rotate(180deg);\\n  }\\n\\n  84.75% {\\n    transform: rotate(180deg);\\n  }\\n\\n  86.44% {\\n    transform: rotate(180deg);\\n  }\\n\\n  88.14% {\\n    transform: rotate(180deg);\\n  }\\n\\n  89.83% {\\n    transform: rotate(180deg);\\n  }\\n\\n  91.53% {\\n    transform: rotate(180deg);\\n  }\\n\\n  93.22% {\\n    transform: rotate(180deg);\\n  }\\n\\n  94.92% {\\n    transform: rotate(180deg);\\n  }\\n\\n  96.61% {\\n    transform: rotate(180deg);\\n  }\\n\\n  98.31% {\\n    transform: rotate(180deg);\\n  }\\n\\n  100% {\\n    transform: rotate(180deg);\\n  }\\n}\\n@keyframes spectrum-fills-rotate {\\n  0% {transform: rotate(-90deg)}\\n  100% {transform: rotate(270deg)}\\n}\\n\\n}\\n.spectrum--large .spectrum-CircleLoader--indeterminate-fill-submask-2 {\\n  animation: 1s infinite linear spectrum-fill-mask-2;\\n}\\n.spectrum--large .spectrum-CircleLoader {\\n  width: 32px;\\n  height: 32px;\\n}\\n.spectrum--large .spectrum-CircleLoader-track {\\n  width: 32px;\\n  height: 32px;\\n  border-width: 4px;\\n  border-radius: 32px;\\n}\\n.spectrum--large .spectrum-CircleLoader-fill {\\n  width: 32px;\\n  height: 32px;\\n  border-width: 4px;\\n  border-radius: 32px;\\n}\\n.spectrum--large .spectrum-CircleLoader--small {\\n  width: 16px;\\n  height: 16px;\\n}\\n.spectrum--large .spectrum-CircleLoader--small .spectrum-CircleLoader-track {\\n    width: 16px;\\n    height: 16px;\\n    border-width: 3px;\\n    border-radius: 16px;\\n  }\\n.spectrum--large .spectrum-CircleLoader--small .spectrum-CircleLoader-fill {\\n    width: 16px;\\n    height: 16px;\\n    border-width: 3px;\\n    border-radius: 16px;\\n  }\\n.spectrum--large .spectrum-CircleLoader--large {\\n  width: 80px;\\n  height: 80px;\\n}\\n.spectrum--large .spectrum-CircleLoader--large .spectrum-CircleLoader-track {\\n    width: 80px;\\n    height: 80px;\\n    border-width: 5px;\\n    border-radius: 80px;\\n  }\\n.spectrum--large .spectrum-CircleLoader--large .spectrum-CircleLoader-fill {\\n    width: 80px;\\n    height: 80px;\\n    border-width: 5px;\\n    border-radius: 80px;\\n  }\\n", ""]);\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTUwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhZG9iZS9zcGVjdHJ1bS1jc3MvZGlzdC9jb21wb25lbnRzL2NpcmNsZWxvYWRlci9pbmRleC1kaWZmLmNzcz8zMjdkIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCIuLi8uLi8uLi8uLi8uLi9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIikoZmFsc2UpO1xuLy8gTW9kdWxlXG5leHBvcnRzLnB1c2goW21vZHVsZS5pZCwgXCIuc3BlY3RydW0tLWxhcmdlIHtcXG5Aa2V5ZnJhbWVzIHNwZWN0cnVtLWZpbGwtbWFzay0xIHtcXG4gIDAlIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoOTBkZWcpO1xcbiAgfVxcblxcbiAgMS42OSUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSg3Mi4zZGVnKTtcXG4gIH1cXG5cXG4gIDMuMzklIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoNTUuNWRlZyk7XFxuICB9XFxuXFxuICA1LjA4JSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDQwLjNkZWcpO1xcbiAgfVxcblxcbiAgNi43OCUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgyNWRlZyk7XFxuICB9XFxuXFxuICA4LjQ3JSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDEwLjZkZWcpO1xcbiAgfVxcblxcbiAgMTAuMTclIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7XFxuICB9XFxuXFxuICAxMS44NiUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTtcXG4gIH1cXG5cXG4gIDEzLjU2JSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDBkZWcpO1xcbiAgfVxcblxcbiAgMTUuMjUlIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7XFxuICB9XFxuXFxuICAxNi45NSUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTtcXG4gIH1cXG5cXG4gIDE4LjY0JSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDBkZWcpO1xcbiAgfVxcblxcbiAgMjAuMzQlIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7XFxuICB9XFxuXFxuICAyMi4wMyUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTtcXG4gIH1cXG5cXG4gIDIzLjczJSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDBkZWcpO1xcbiAgfVxcblxcbiAgMjUuNDIlIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7XFxuICB9XFxuXFxuICAyNy4xMiUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTtcXG4gIH1cXG5cXG4gIDI4LjgxJSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDBkZWcpO1xcbiAgfVxcblxcbiAgMzAuNTElIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7XFxuICB9XFxuXFxuICAzMi4yJSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDBkZWcpO1xcbiAgfVxcblxcbiAgMzMuOSUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTtcXG4gIH1cXG5cXG4gIDM1LjU5JSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDBkZWcpO1xcbiAgfVxcblxcbiAgMzcuMjklIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7XFxuICB9XFxuXFxuICAzOC45OCUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTtcXG4gIH1cXG5cXG4gIDQwLjY4JSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDBkZWcpO1xcbiAgfVxcblxcbiAgNDIuMzclIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoNS4zZGVnKTtcXG4gIH1cXG5cXG4gIDQ0LjA3JSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDEzLjRkZWcpO1xcbiAgfVxcblxcbiAgNDUuNzYlIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMjAuNmRlZyk7XFxuICB9XFxuXFxuICA0Ny40NiUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgyOWRlZyk7XFxuICB9XFxuXFxuICA0OS4xNSUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgzNi41ZGVnKTtcXG4gIH1cXG5cXG4gIDUwLjg1JSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDQyLjZkZWcpO1xcbiAgfVxcblxcbiAgNTIuNTQlIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoNDguOGRlZyk7XFxuICB9XFxuXFxuICA1NC4yNCUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSg1NC4yZGVnKTtcXG4gIH1cXG5cXG4gIDU1LjkzJSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDU5LjRkZWcpO1xcbiAgfVxcblxcbiAgNTcuNjMlIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoNjMuMmRlZyk7XFxuICB9XFxuXFxuICA1OS4zMiUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSg2Ny4yZGVnKTtcXG4gIH1cXG5cXG4gIDYxLjAyJSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDcwLjhkZWcpO1xcbiAgfVxcblxcbiAgNjIuNzElIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoNzMuOGRlZyk7XFxuICB9XFxuXFxuICA2NC40MSUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSg3Ni4yZGVnKTtcXG4gIH1cXG5cXG4gIDY2LjElIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoNzguN2RlZyk7XFxuICB9XFxuXFxuICA2Ny44JSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDgwLjZkZWcpO1xcbiAgfVxcblxcbiAgNjkuNDklIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoODIuNmRlZyk7XFxuICB9XFxuXFxuICA3MS4xOSUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSg4My43ZGVnKTtcXG4gIH1cXG5cXG4gIDcyLjg4JSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDg1ZGVnKTtcXG4gIH1cXG5cXG4gIDc0LjU4JSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDg2LjNkZWcpO1xcbiAgfVxcblxcbiAgNzYuMjclIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoODdkZWcpO1xcbiAgfVxcblxcbiAgNzcuOTclIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoODcuN2RlZyk7XFxuICB9XFxuXFxuICA3OS42NiUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSg4OC4zZGVnKTtcXG4gIH1cXG5cXG4gIDgxLjM2JSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDg4LjZkZWcpO1xcbiAgfVxcblxcbiAgODMuMDUlIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoODkuMmRlZyk7XFxuICB9XFxuXFxuICA4NC43NSUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSg4OS4yZGVnKTtcXG4gIH1cXG5cXG4gIDg2LjQ0JSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDg5LjVkZWcpO1xcbiAgfVxcblxcbiAgODguMTQlIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoODkuOWRlZyk7XFxuICB9XFxuXFxuICA4OS44MyUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSg4OS43ZGVnKTtcXG4gIH1cXG5cXG4gIDkxLjUzJSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDkwLjFkZWcpO1xcbiAgfVxcblxcbiAgOTMuMjIlIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoOTAuMmRlZyk7XFxuICB9XFxuXFxuICA5NC45MiUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSg5MC4xZGVnKTtcXG4gIH1cXG5cXG4gIDk2LjYxJSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDkwZGVnKTtcXG4gIH1cXG5cXG4gIDk4LjMxJSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDg5LjhkZWcpO1xcbiAgfVxcblxcbiAgMTAwJSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDkwZGVnKTtcXG4gIH1cXG59XFxuQGtleWZyYW1lcyBzcGVjdHJ1bS1maWxsLW1hc2stMiB7XFxuICAwJSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDE4MGRlZyk7XFxuICB9XFxuXFxuICAxLjY5JSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDE4MGRlZyk7XFxuICB9XFxuXFxuICAzLjM5JSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDE4MGRlZyk7XFxuICB9XFxuXFxuICA1LjA4JSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDE4MGRlZyk7XFxuICB9XFxuXFxuICA2Ljc4JSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDE4MGRlZyk7XFxuICB9XFxuXFxuICA4LjQ3JSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDE4MGRlZyk7XFxuICB9XFxuXFxuICAxMC4xNyUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxNzkuMmRlZyk7XFxuICB9XFxuXFxuICAxMS44NiUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxNjRkZWcpO1xcbiAgfVxcblxcbiAgMTMuNTYlIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMTUxLjhkZWcpO1xcbiAgfVxcblxcbiAgMTUuMjUlIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMTQwLjhkZWcpO1xcbiAgfVxcblxcbiAgMTYuOTUlIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMTMwLjNkZWcpO1xcbiAgfVxcblxcbiAgMTguNjQlIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMTIwLjRkZWcpO1xcbiAgfVxcblxcbiAgMjAuMzQlIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMTEwLjhkZWcpO1xcbiAgfVxcblxcbiAgMjIuMDMlIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMTAxLjZkZWcpO1xcbiAgfVxcblxcbiAgMjMuNzMlIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoOTMuNWRlZyk7XFxuICB9XFxuXFxuICAyNS40MiUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSg4NS40ZGVnKTtcXG4gIH1cXG5cXG4gIDI3LjEyJSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDc4LjFkZWcpO1xcbiAgfVxcblxcbiAgMjguODElIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoNzEuMmRlZyk7XFxuICB9XFxuXFxuICAzMC41MSUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSg4OS4xZGVnKTtcXG4gIH1cXG5cXG4gIDMyLjIlIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMTA1LjVkZWcpO1xcbiAgfVxcblxcbiAgMzMuOSUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxMjEuM2RlZyk7XFxuICB9XFxuXFxuICAzNS41OSUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxMzUuNWRlZyk7XFxuICB9XFxuXFxuICAzNy4yOSUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxNDguNGRlZyk7XFxuICB9XFxuXFxuICAzOC45OCUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxNjFkZWcpO1xcbiAgfVxcblxcbiAgNDAuNjglIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMTczLjVkZWcpO1xcbiAgfVxcblxcbiAgNDIuMzclIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMTgwZGVnKTtcXG4gIH1cXG5cXG4gIDQ0LjA3JSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDE4MGRlZyk7XFxuICB9XFxuXFxuICA0NS43NiUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpO1xcbiAgfVxcblxcbiAgNDcuNDYlIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMTgwZGVnKTtcXG4gIH1cXG5cXG4gIDQ5LjE1JSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDE4MGRlZyk7XFxuICB9XFxuXFxuICA1MC44NSUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpO1xcbiAgfVxcblxcbiAgNTIuNTQlIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMTgwZGVnKTtcXG4gIH1cXG5cXG4gIDU0LjI0JSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDE4MGRlZyk7XFxuICB9XFxuXFxuICA1NS45MyUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpO1xcbiAgfVxcblxcbiAgNTcuNjMlIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMTgwZGVnKTtcXG4gIH1cXG5cXG4gIDU5LjMyJSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDE4MGRlZyk7XFxuICB9XFxuXFxuICA2MS4wMiUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpO1xcbiAgfVxcblxcbiAgNjIuNzElIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMTgwZGVnKTtcXG4gIH1cXG5cXG4gIDY0LjQxJSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDE4MGRlZyk7XFxuICB9XFxuXFxuICA2Ni4xJSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDE4MGRlZyk7XFxuICB9XFxuXFxuICA2Ny44JSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDE4MGRlZyk7XFxuICB9XFxuXFxuICA2OS40OSUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpO1xcbiAgfVxcblxcbiAgNzEuMTklIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMTgwZGVnKTtcXG4gIH1cXG5cXG4gIDcyLjg4JSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDE4MGRlZyk7XFxuICB9XFxuXFxuICA3NC41OCUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpO1xcbiAgfVxcblxcbiAgNzYuMjclIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMTgwZGVnKTtcXG4gIH1cXG5cXG4gIDc3Ljk3JSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDE4MGRlZyk7XFxuICB9XFxuXFxuICA3OS42NiUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpO1xcbiAgfVxcblxcbiAgODEuMzYlIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMTgwZGVnKTtcXG4gIH1cXG5cXG4gIDgzLjA1JSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDE4MGRlZyk7XFxuICB9XFxuXFxuICA4NC43NSUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpO1xcbiAgfVxcblxcbiAgODYuNDQlIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMTgwZGVnKTtcXG4gIH1cXG5cXG4gIDg4LjE0JSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDE4MGRlZyk7XFxuICB9XFxuXFxuICA4OS44MyUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpO1xcbiAgfVxcblxcbiAgOTEuNTMlIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMTgwZGVnKTtcXG4gIH1cXG5cXG4gIDkzLjIyJSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDE4MGRlZyk7XFxuICB9XFxuXFxuICA5NC45MiUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpO1xcbiAgfVxcblxcbiAgOTYuNjElIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMTgwZGVnKTtcXG4gIH1cXG5cXG4gIDk4LjMxJSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDE4MGRlZyk7XFxuICB9XFxuXFxuICAxMDAlIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMTgwZGVnKTtcXG4gIH1cXG59XFxuQGtleWZyYW1lcyBzcGVjdHJ1bS1maWxscy1yb3RhdGUge1xcbiAgMCUge3RyYW5zZm9ybTogcm90YXRlKC05MGRlZyl9XFxuICAxMDAlIHt0cmFuc2Zvcm06IHJvdGF0ZSgyNzBkZWcpfVxcbn1cXG5cXG59XFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW0tQ2lyY2xlTG9hZGVyLS1pbmRldGVybWluYXRlLWZpbGwtc3VibWFzay0yIHtcXG4gIGFuaW1hdGlvbjogMXMgaW5maW5pdGUgbGluZWFyIHNwZWN0cnVtLWZpbGwtbWFzay0yO1xcbn1cXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bS1DaXJjbGVMb2FkZXIge1xcbiAgd2lkdGg6IDMycHg7XFxuICBoZWlnaHQ6IDMycHg7XFxufVxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtLUNpcmNsZUxvYWRlci10cmFjayB7XFxuICB3aWR0aDogMzJweDtcXG4gIGhlaWdodDogMzJweDtcXG4gIGJvcmRlci13aWR0aDogNHB4O1xcbiAgYm9yZGVyLXJhZGl1czogMzJweDtcXG59XFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW0tQ2lyY2xlTG9hZGVyLWZpbGwge1xcbiAgd2lkdGg6IDMycHg7XFxuICBoZWlnaHQ6IDMycHg7XFxuICBib3JkZXItd2lkdGg6IDRweDtcXG4gIGJvcmRlci1yYWRpdXM6IDMycHg7XFxufVxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtLUNpcmNsZUxvYWRlci0tc21hbGwge1xcbiAgd2lkdGg6IDE2cHg7XFxuICBoZWlnaHQ6IDE2cHg7XFxufVxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtLUNpcmNsZUxvYWRlci0tc21hbGwgLnNwZWN0cnVtLUNpcmNsZUxvYWRlci10cmFjayB7XFxuICAgIHdpZHRoOiAxNnB4O1xcbiAgICBoZWlnaHQ6IDE2cHg7XFxuICAgIGJvcmRlci13aWR0aDogM3B4O1xcbiAgICBib3JkZXItcmFkaXVzOiAxNnB4O1xcbiAgfVxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtLUNpcmNsZUxvYWRlci0tc21hbGwgLnNwZWN0cnVtLUNpcmNsZUxvYWRlci1maWxsIHtcXG4gICAgd2lkdGg6IDE2cHg7XFxuICAgIGhlaWdodDogMTZweDtcXG4gICAgYm9yZGVyLXdpZHRoOiAzcHg7XFxuICAgIGJvcmRlci1yYWRpdXM6IDE2cHg7XFxuICB9XFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW0tQ2lyY2xlTG9hZGVyLS1sYXJnZSB7XFxuICB3aWR0aDogODBweDtcXG4gIGhlaWdodDogODBweDtcXG59XFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW0tQ2lyY2xlTG9hZGVyLS1sYXJnZSAuc3BlY3RydW0tQ2lyY2xlTG9hZGVyLXRyYWNrIHtcXG4gICAgd2lkdGg6IDgwcHg7XFxuICAgIGhlaWdodDogODBweDtcXG4gICAgYm9yZGVyLXdpZHRoOiA1cHg7XFxuICAgIGJvcmRlci1yYWRpdXM6IDgwcHg7XFxuICB9XFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW0tQ2lyY2xlTG9hZGVyLS1sYXJnZSAuc3BlY3RydW0tQ2lyY2xlTG9hZGVyLWZpbGwge1xcbiAgICB3aWR0aDogODBweDtcXG4gICAgaGVpZ2h0OiA4MHB4O1xcbiAgICBib3JkZXItd2lkdGg6IDVweDtcXG4gICAgYm9yZGVyLXJhZGl1czogODBweDtcXG4gIH1cXG5cIiwgXCJcIl0pO1xuXG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///150\n')},function(module,exports,__webpack_require__){eval("var api = __webpack_require__(5);\n            var content = __webpack_require__(152);\n\n            content = content.__esModule ? content.default : content;\n\n            if (typeof content === 'string') {\n              content = [[module.i, content, '']];\n            }\n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = api(content, options);\n\n\n\nmodule.exports = content.locals || {};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTUxLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhZG9iZS9zcGVjdHJ1bS1jc3MvZGlzdC9jb21wb25lbnRzL2NpcmNsZWxvYWRlci9pbmRleC1sZy5jc3M/MWExNiJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgYXBpID0gcmVxdWlyZShcIiEuLi8uLi8uLi8uLi8uLi9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luamVjdFN0eWxlc0ludG9TdHlsZVRhZy5qc1wiKTtcbiAgICAgICAgICAgIHZhciBjb250ZW50ID0gcmVxdWlyZShcIiEhLi4vLi4vLi4vLi4vLi4vY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL2luZGV4LWxnLmNzc1wiKTtcblxuICAgICAgICAgICAgY29udGVudCA9IGNvbnRlbnQuX19lc01vZHVsZSA/IGNvbnRlbnQuZGVmYXVsdCA6IGNvbnRlbnQ7XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgY29udGVudCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgY29udGVudCA9IFtbbW9kdWxlLmlkLCBjb250ZW50LCAnJ11dO1xuICAgICAgICAgICAgfVxuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLmluc2VydCA9IFwiaGVhZFwiO1xub3B0aW9ucy5zaW5nbGV0b24gPSBmYWxzZTtcblxudmFyIHVwZGF0ZSA9IGFwaShjb250ZW50LCBvcHRpb25zKTtcblxuXG5cbm1vZHVsZS5leHBvcnRzID0gY29udGVudC5sb2NhbHMgfHwge307Il0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///151\n")},function(module,exports,__webpack_require__){eval('exports = module.exports = __webpack_require__(6)(false);\n// Module\nexports.push([module.i, ".spectrum-CircleLoader--indeterminate-fill-submask-2 {\\n  animation: 1s infinite linear spectrum-fill-mask-2;\\n}\\n@keyframes spectrum-fill-mask-1 {\\n  0% {\\n    transform: rotate(90deg);\\n  }\\n\\n  1.69% {\\n    transform: rotate(72.3deg);\\n  }\\n\\n  3.39% {\\n    transform: rotate(55.5deg);\\n  }\\n\\n  5.08% {\\n    transform: rotate(40.3deg);\\n  }\\n\\n  6.78% {\\n    transform: rotate(25deg);\\n  }\\n\\n  8.47% {\\n    transform: rotate(10.6deg);\\n  }\\n\\n  10.17% {\\n    transform: rotate(0deg);\\n  }\\n\\n  11.86% {\\n    transform: rotate(0deg);\\n  }\\n\\n  13.56% {\\n    transform: rotate(0deg);\\n  }\\n\\n  15.25% {\\n    transform: rotate(0deg);\\n  }\\n\\n  16.95% {\\n    transform: rotate(0deg);\\n  }\\n\\n  18.64% {\\n    transform: rotate(0deg);\\n  }\\n\\n  20.34% {\\n    transform: rotate(0deg);\\n  }\\n\\n  22.03% {\\n    transform: rotate(0deg);\\n  }\\n\\n  23.73% {\\n    transform: rotate(0deg);\\n  }\\n\\n  25.42% {\\n    transform: rotate(0deg);\\n  }\\n\\n  27.12% {\\n    transform: rotate(0deg);\\n  }\\n\\n  28.81% {\\n    transform: rotate(0deg);\\n  }\\n\\n  30.51% {\\n    transform: rotate(0deg);\\n  }\\n\\n  32.2% {\\n    transform: rotate(0deg);\\n  }\\n\\n  33.9% {\\n    transform: rotate(0deg);\\n  }\\n\\n  35.59% {\\n    transform: rotate(0deg);\\n  }\\n\\n  37.29% {\\n    transform: rotate(0deg);\\n  }\\n\\n  38.98% {\\n    transform: rotate(0deg);\\n  }\\n\\n  40.68% {\\n    transform: rotate(0deg);\\n  }\\n\\n  42.37% {\\n    transform: rotate(5.3deg);\\n  }\\n\\n  44.07% {\\n    transform: rotate(13.4deg);\\n  }\\n\\n  45.76% {\\n    transform: rotate(20.6deg);\\n  }\\n\\n  47.46% {\\n    transform: rotate(29deg);\\n  }\\n\\n  49.15% {\\n    transform: rotate(36.5deg);\\n  }\\n\\n  50.85% {\\n    transform: rotate(42.6deg);\\n  }\\n\\n  52.54% {\\n    transform: rotate(48.8deg);\\n  }\\n\\n  54.24% {\\n    transform: rotate(54.2deg);\\n  }\\n\\n  55.93% {\\n    transform: rotate(59.4deg);\\n  }\\n\\n  57.63% {\\n    transform: rotate(63.2deg);\\n  }\\n\\n  59.32% {\\n    transform: rotate(67.2deg);\\n  }\\n\\n  61.02% {\\n    transform: rotate(70.8deg);\\n  }\\n\\n  62.71% {\\n    transform: rotate(73.8deg);\\n  }\\n\\n  64.41% {\\n    transform: rotate(76.2deg);\\n  }\\n\\n  66.1% {\\n    transform: rotate(78.7deg);\\n  }\\n\\n  67.8% {\\n    transform: rotate(80.6deg);\\n  }\\n\\n  69.49% {\\n    transform: rotate(82.6deg);\\n  }\\n\\n  71.19% {\\n    transform: rotate(83.7deg);\\n  }\\n\\n  72.88% {\\n    transform: rotate(85deg);\\n  }\\n\\n  74.58% {\\n    transform: rotate(86.3deg);\\n  }\\n\\n  76.27% {\\n    transform: rotate(87deg);\\n  }\\n\\n  77.97% {\\n    transform: rotate(87.7deg);\\n  }\\n\\n  79.66% {\\n    transform: rotate(88.3deg);\\n  }\\n\\n  81.36% {\\n    transform: rotate(88.6deg);\\n  }\\n\\n  83.05% {\\n    transform: rotate(89.2deg);\\n  }\\n\\n  84.75% {\\n    transform: rotate(89.2deg);\\n  }\\n\\n  86.44% {\\n    transform: rotate(89.5deg);\\n  }\\n\\n  88.14% {\\n    transform: rotate(89.9deg);\\n  }\\n\\n  89.83% {\\n    transform: rotate(89.7deg);\\n  }\\n\\n  91.53% {\\n    transform: rotate(90.1deg);\\n  }\\n\\n  93.22% {\\n    transform: rotate(90.2deg);\\n  }\\n\\n  94.92% {\\n    transform: rotate(90.1deg);\\n  }\\n\\n  96.61% {\\n    transform: rotate(90deg);\\n  }\\n\\n  98.31% {\\n    transform: rotate(89.8deg);\\n  }\\n\\n  100% {\\n    transform: rotate(90deg);\\n  }\\n}\\n@keyframes spectrum-fill-mask-2 {\\n  0% {\\n    transform: rotate(180deg);\\n  }\\n\\n  1.69% {\\n    transform: rotate(180deg);\\n  }\\n\\n  3.39% {\\n    transform: rotate(180deg);\\n  }\\n\\n  5.08% {\\n    transform: rotate(180deg);\\n  }\\n\\n  6.78% {\\n    transform: rotate(180deg);\\n  }\\n\\n  8.47% {\\n    transform: rotate(180deg);\\n  }\\n\\n  10.17% {\\n    transform: rotate(179.2deg);\\n  }\\n\\n  11.86% {\\n    transform: rotate(164deg);\\n  }\\n\\n  13.56% {\\n    transform: rotate(151.8deg);\\n  }\\n\\n  15.25% {\\n    transform: rotate(140.8deg);\\n  }\\n\\n  16.95% {\\n    transform: rotate(130.3deg);\\n  }\\n\\n  18.64% {\\n    transform: rotate(120.4deg);\\n  }\\n\\n  20.34% {\\n    transform: rotate(110.8deg);\\n  }\\n\\n  22.03% {\\n    transform: rotate(101.6deg);\\n  }\\n\\n  23.73% {\\n    transform: rotate(93.5deg);\\n  }\\n\\n  25.42% {\\n    transform: rotate(85.4deg);\\n  }\\n\\n  27.12% {\\n    transform: rotate(78.1deg);\\n  }\\n\\n  28.81% {\\n    transform: rotate(71.2deg);\\n  }\\n\\n  30.51% {\\n    transform: rotate(89.1deg);\\n  }\\n\\n  32.2% {\\n    transform: rotate(105.5deg);\\n  }\\n\\n  33.9% {\\n    transform: rotate(121.3deg);\\n  }\\n\\n  35.59% {\\n    transform: rotate(135.5deg);\\n  }\\n\\n  37.29% {\\n    transform: rotate(148.4deg);\\n  }\\n\\n  38.98% {\\n    transform: rotate(161deg);\\n  }\\n\\n  40.68% {\\n    transform: rotate(173.5deg);\\n  }\\n\\n  42.37% {\\n    transform: rotate(180deg);\\n  }\\n\\n  44.07% {\\n    transform: rotate(180deg);\\n  }\\n\\n  45.76% {\\n    transform: rotate(180deg);\\n  }\\n\\n  47.46% {\\n    transform: rotate(180deg);\\n  }\\n\\n  49.15% {\\n    transform: rotate(180deg);\\n  }\\n\\n  50.85% {\\n    transform: rotate(180deg);\\n  }\\n\\n  52.54% {\\n    transform: rotate(180deg);\\n  }\\n\\n  54.24% {\\n    transform: rotate(180deg);\\n  }\\n\\n  55.93% {\\n    transform: rotate(180deg);\\n  }\\n\\n  57.63% {\\n    transform: rotate(180deg);\\n  }\\n\\n  59.32% {\\n    transform: rotate(180deg);\\n  }\\n\\n  61.02% {\\n    transform: rotate(180deg);\\n  }\\n\\n  62.71% {\\n    transform: rotate(180deg);\\n  }\\n\\n  64.41% {\\n    transform: rotate(180deg);\\n  }\\n\\n  66.1% {\\n    transform: rotate(180deg);\\n  }\\n\\n  67.8% {\\n    transform: rotate(180deg);\\n  }\\n\\n  69.49% {\\n    transform: rotate(180deg);\\n  }\\n\\n  71.19% {\\n    transform: rotate(180deg);\\n  }\\n\\n  72.88% {\\n    transform: rotate(180deg);\\n  }\\n\\n  74.58% {\\n    transform: rotate(180deg);\\n  }\\n\\n  76.27% {\\n    transform: rotate(180deg);\\n  }\\n\\n  77.97% {\\n    transform: rotate(180deg);\\n  }\\n\\n  79.66% {\\n    transform: rotate(180deg);\\n  }\\n\\n  81.36% {\\n    transform: rotate(180deg);\\n  }\\n\\n  83.05% {\\n    transform: rotate(180deg);\\n  }\\n\\n  84.75% {\\n    transform: rotate(180deg);\\n  }\\n\\n  86.44% {\\n    transform: rotate(180deg);\\n  }\\n\\n  88.14% {\\n    transform: rotate(180deg);\\n  }\\n\\n  89.83% {\\n    transform: rotate(180deg);\\n  }\\n\\n  91.53% {\\n    transform: rotate(180deg);\\n  }\\n\\n  93.22% {\\n    transform: rotate(180deg);\\n  }\\n\\n  94.92% {\\n    transform: rotate(180deg);\\n  }\\n\\n  96.61% {\\n    transform: rotate(180deg);\\n  }\\n\\n  98.31% {\\n    transform: rotate(180deg);\\n  }\\n\\n  100% {\\n    transform: rotate(180deg);\\n  }\\n}\\n@keyframes spectrum-fills-rotate {\\n  0% {transform: rotate(-90deg)}\\n  100% {transform: rotate(270deg)}\\n}\\n.spectrum-CircleLoader {\\n  display: inline-block;\\n  width: 32px;\\n  height: 32px;\\n  position: relative;\\n  direction: ltr;\\n}\\n.spectrum-CircleLoader-track {\\n  box-sizing: border-box;\\n  width: 32px;\\n  height: 32px;\\n  border-style: solid;\\n  border-width: 4px;\\n  border-radius: 32px;\\n}\\n.spectrum-CircleLoader-fills {\\n  position: absolute;\\n  top: 0;\\n  left: 0;\\n  width: 100%;\\n  height: 100%;\\n}\\n.spectrum-CircleLoader-fill {\\n  box-sizing: border-box;\\n  width: 32px;\\n  height: 32px;\\n  border-style: solid;\\n  border-width: 4px;\\n  border-radius: 32px;\\n}\\n.spectrum-CircleLoader-fillMask1,\\n.spectrum-CircleLoader-fillMask2 {\\n  width: 50%;\\n  height: 100%;\\n  transform-origin: 100% center;\\n  transform: rotate(180deg);\\n  overflow: hidden;\\n  position: absolute;\\n}\\n.spectrum-CircleLoader-fillSubMask1,\\n.spectrum-CircleLoader-fillSubMask2 {\\n  width: 100%;\\n  height: 100%;\\n  transform-origin: 100% center;\\n  overflow: hidden;\\n  transform: rotate(-180deg);\\n}\\n.spectrum-CircleLoader-fillMask2 {\\n  transform: rotate(0deg);\\n}\\n.spectrum-CircleLoader--small {\\n  width: 16px;\\n  height: 16px;\\n}\\n.spectrum-CircleLoader--small .spectrum-CircleLoader-track {\\n    width: 16px;\\n    height: 16px;\\n    border-style: solid;\\n    border-width: 3px;\\n    border-radius: 16px;\\n  }\\n.spectrum-CircleLoader--small .spectrum-CircleLoader-fill {\\n    width: 16px;\\n    height: 16px;\\n    border-style: solid;\\n    border-width: 3px;\\n    border-radius: 16px;\\n  }\\n.spectrum-CircleLoader--large {\\n  width: 80px;\\n  height: 80px;\\n}\\n.spectrum-CircleLoader--large .spectrum-CircleLoader-track {\\n    width: 80px;\\n    height: 80px;\\n    border-style: solid;\\n    border-width: 5px;\\n    border-radius: 80px;\\n  }\\n.spectrum-CircleLoader--large .spectrum-CircleLoader-fill {\\n    width: 80px;\\n    height: 80px;\\n    border-style: solid;\\n    border-width: 5px;\\n    border-radius: 80px;\\n  }\\n.spectrum-CircleLoader--indeterminate .spectrum-CircleLoader-fills {\\n    will-change: transform;\\n    transform: translateZ(0);\\n    animation: 1s infinite cubic-bezier(.25,.78,.48,.89) spectrum-fills-rotate;\\n    transform-origin: center;\\n  }\\n.spectrum-CircleLoader--indeterminate .spectrum-CircleLoader-fillSubMask1 {\\n    will-change: transform;\\n    transform: translateZ(0);\\n    animation: 1s infinite linear spectrum-fill-mask-1;\\n  }\\n.spectrum-CircleLoader--indeterminate .spectrum-CircleLoader-fillSubMask2 {\\n    will-change: transform;\\n    transform: translateZ(0);\\n    animation: 1s infinite linear spectrum-fill-mask-2;\\n  }\\n", ""]);\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTUyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhZG9iZS9zcGVjdHJ1bS1jc3MvZGlzdC9jb21wb25lbnRzL2NpcmNsZWxvYWRlci9pbmRleC1sZy5jc3M/Y2MxMiJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiLi4vLi4vLi4vLi4vLi4vY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzXCIpKGZhbHNlKTtcbi8vIE1vZHVsZVxuZXhwb3J0cy5wdXNoKFttb2R1bGUuaWQsIFwiLnNwZWN0cnVtLUNpcmNsZUxvYWRlci0taW5kZXRlcm1pbmF0ZS1maWxsLXN1Ym1hc2stMiB7XFxuICBhbmltYXRpb246IDFzIGluZmluaXRlIGxpbmVhciBzcGVjdHJ1bS1maWxsLW1hc2stMjtcXG59XFxuQGtleWZyYW1lcyBzcGVjdHJ1bS1maWxsLW1hc2stMSB7XFxuICAwJSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDkwZGVnKTtcXG4gIH1cXG5cXG4gIDEuNjklIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoNzIuM2RlZyk7XFxuICB9XFxuXFxuICAzLjM5JSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDU1LjVkZWcpO1xcbiAgfVxcblxcbiAgNS4wOCUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSg0MC4zZGVnKTtcXG4gIH1cXG5cXG4gIDYuNzglIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMjVkZWcpO1xcbiAgfVxcblxcbiAgOC40NyUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxMC42ZGVnKTtcXG4gIH1cXG5cXG4gIDEwLjE3JSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDBkZWcpO1xcbiAgfVxcblxcbiAgMTEuODYlIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7XFxuICB9XFxuXFxuICAxMy41NiUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTtcXG4gIH1cXG5cXG4gIDE1LjI1JSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDBkZWcpO1xcbiAgfVxcblxcbiAgMTYuOTUlIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7XFxuICB9XFxuXFxuICAxOC42NCUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTtcXG4gIH1cXG5cXG4gIDIwLjM0JSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDBkZWcpO1xcbiAgfVxcblxcbiAgMjIuMDMlIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7XFxuICB9XFxuXFxuICAyMy43MyUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTtcXG4gIH1cXG5cXG4gIDI1LjQyJSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDBkZWcpO1xcbiAgfVxcblxcbiAgMjcuMTIlIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7XFxuICB9XFxuXFxuICAyOC44MSUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTtcXG4gIH1cXG5cXG4gIDMwLjUxJSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDBkZWcpO1xcbiAgfVxcblxcbiAgMzIuMiUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTtcXG4gIH1cXG5cXG4gIDMzLjklIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7XFxuICB9XFxuXFxuICAzNS41OSUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTtcXG4gIH1cXG5cXG4gIDM3LjI5JSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDBkZWcpO1xcbiAgfVxcblxcbiAgMzguOTglIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7XFxuICB9XFxuXFxuICA0MC42OCUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTtcXG4gIH1cXG5cXG4gIDQyLjM3JSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDUuM2RlZyk7XFxuICB9XFxuXFxuICA0NC4wNyUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxMy40ZGVnKTtcXG4gIH1cXG5cXG4gIDQ1Ljc2JSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDIwLjZkZWcpO1xcbiAgfVxcblxcbiAgNDcuNDYlIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMjlkZWcpO1xcbiAgfVxcblxcbiAgNDkuMTUlIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMzYuNWRlZyk7XFxuICB9XFxuXFxuICA1MC44NSUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSg0Mi42ZGVnKTtcXG4gIH1cXG5cXG4gIDUyLjU0JSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDQ4LjhkZWcpO1xcbiAgfVxcblxcbiAgNTQuMjQlIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoNTQuMmRlZyk7XFxuICB9XFxuXFxuICA1NS45MyUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSg1OS40ZGVnKTtcXG4gIH1cXG5cXG4gIDU3LjYzJSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDYzLjJkZWcpO1xcbiAgfVxcblxcbiAgNTkuMzIlIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoNjcuMmRlZyk7XFxuICB9XFxuXFxuICA2MS4wMiUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSg3MC44ZGVnKTtcXG4gIH1cXG5cXG4gIDYyLjcxJSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDczLjhkZWcpO1xcbiAgfVxcblxcbiAgNjQuNDElIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoNzYuMmRlZyk7XFxuICB9XFxuXFxuICA2Ni4xJSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDc4LjdkZWcpO1xcbiAgfVxcblxcbiAgNjcuOCUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSg4MC42ZGVnKTtcXG4gIH1cXG5cXG4gIDY5LjQ5JSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDgyLjZkZWcpO1xcbiAgfVxcblxcbiAgNzEuMTklIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoODMuN2RlZyk7XFxuICB9XFxuXFxuICA3Mi44OCUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSg4NWRlZyk7XFxuICB9XFxuXFxuICA3NC41OCUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSg4Ni4zZGVnKTtcXG4gIH1cXG5cXG4gIDc2LjI3JSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDg3ZGVnKTtcXG4gIH1cXG5cXG4gIDc3Ljk3JSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDg3LjdkZWcpO1xcbiAgfVxcblxcbiAgNzkuNjYlIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoODguM2RlZyk7XFxuICB9XFxuXFxuICA4MS4zNiUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSg4OC42ZGVnKTtcXG4gIH1cXG5cXG4gIDgzLjA1JSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDg5LjJkZWcpO1xcbiAgfVxcblxcbiAgODQuNzUlIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoODkuMmRlZyk7XFxuICB9XFxuXFxuICA4Ni40NCUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSg4OS41ZGVnKTtcXG4gIH1cXG5cXG4gIDg4LjE0JSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDg5LjlkZWcpO1xcbiAgfVxcblxcbiAgODkuODMlIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoODkuN2RlZyk7XFxuICB9XFxuXFxuICA5MS41MyUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSg5MC4xZGVnKTtcXG4gIH1cXG5cXG4gIDkzLjIyJSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDkwLjJkZWcpO1xcbiAgfVxcblxcbiAgOTQuOTIlIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoOTAuMWRlZyk7XFxuICB9XFxuXFxuICA5Ni42MSUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSg5MGRlZyk7XFxuICB9XFxuXFxuICA5OC4zMSUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSg4OS44ZGVnKTtcXG4gIH1cXG5cXG4gIDEwMCUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSg5MGRlZyk7XFxuICB9XFxufVxcbkBrZXlmcmFtZXMgc3BlY3RydW0tZmlsbC1tYXNrLTIge1xcbiAgMCUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpO1xcbiAgfVxcblxcbiAgMS42OSUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpO1xcbiAgfVxcblxcbiAgMy4zOSUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpO1xcbiAgfVxcblxcbiAgNS4wOCUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpO1xcbiAgfVxcblxcbiAgNi43OCUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpO1xcbiAgfVxcblxcbiAgOC40NyUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpO1xcbiAgfVxcblxcbiAgMTAuMTclIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMTc5LjJkZWcpO1xcbiAgfVxcblxcbiAgMTEuODYlIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMTY0ZGVnKTtcXG4gIH1cXG5cXG4gIDEzLjU2JSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDE1MS44ZGVnKTtcXG4gIH1cXG5cXG4gIDE1LjI1JSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDE0MC44ZGVnKTtcXG4gIH1cXG5cXG4gIDE2Ljk1JSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDEzMC4zZGVnKTtcXG4gIH1cXG5cXG4gIDE4LjY0JSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDEyMC40ZGVnKTtcXG4gIH1cXG5cXG4gIDIwLjM0JSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDExMC44ZGVnKTtcXG4gIH1cXG5cXG4gIDIyLjAzJSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDEwMS42ZGVnKTtcXG4gIH1cXG5cXG4gIDIzLjczJSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDkzLjVkZWcpO1xcbiAgfVxcblxcbiAgMjUuNDIlIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoODUuNGRlZyk7XFxuICB9XFxuXFxuICAyNy4xMiUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSg3OC4xZGVnKTtcXG4gIH1cXG5cXG4gIDI4LjgxJSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDcxLjJkZWcpO1xcbiAgfVxcblxcbiAgMzAuNTElIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoODkuMWRlZyk7XFxuICB9XFxuXFxuICAzMi4yJSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDEwNS41ZGVnKTtcXG4gIH1cXG5cXG4gIDMzLjklIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMTIxLjNkZWcpO1xcbiAgfVxcblxcbiAgMzUuNTklIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMTM1LjVkZWcpO1xcbiAgfVxcblxcbiAgMzcuMjklIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMTQ4LjRkZWcpO1xcbiAgfVxcblxcbiAgMzguOTglIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMTYxZGVnKTtcXG4gIH1cXG5cXG4gIDQwLjY4JSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDE3My41ZGVnKTtcXG4gIH1cXG5cXG4gIDQyLjM3JSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDE4MGRlZyk7XFxuICB9XFxuXFxuICA0NC4wNyUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpO1xcbiAgfVxcblxcbiAgNDUuNzYlIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMTgwZGVnKTtcXG4gIH1cXG5cXG4gIDQ3LjQ2JSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDE4MGRlZyk7XFxuICB9XFxuXFxuICA0OS4xNSUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpO1xcbiAgfVxcblxcbiAgNTAuODUlIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMTgwZGVnKTtcXG4gIH1cXG5cXG4gIDUyLjU0JSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDE4MGRlZyk7XFxuICB9XFxuXFxuICA1NC4yNCUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpO1xcbiAgfVxcblxcbiAgNTUuOTMlIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMTgwZGVnKTtcXG4gIH1cXG5cXG4gIDU3LjYzJSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDE4MGRlZyk7XFxuICB9XFxuXFxuICA1OS4zMiUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpO1xcbiAgfVxcblxcbiAgNjEuMDIlIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMTgwZGVnKTtcXG4gIH1cXG5cXG4gIDYyLjcxJSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDE4MGRlZyk7XFxuICB9XFxuXFxuICA2NC40MSUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpO1xcbiAgfVxcblxcbiAgNjYuMSUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpO1xcbiAgfVxcblxcbiAgNjcuOCUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpO1xcbiAgfVxcblxcbiAgNjkuNDklIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMTgwZGVnKTtcXG4gIH1cXG5cXG4gIDcxLjE5JSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDE4MGRlZyk7XFxuICB9XFxuXFxuICA3Mi44OCUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpO1xcbiAgfVxcblxcbiAgNzQuNTglIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMTgwZGVnKTtcXG4gIH1cXG5cXG4gIDc2LjI3JSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDE4MGRlZyk7XFxuICB9XFxuXFxuICA3Ny45NyUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpO1xcbiAgfVxcblxcbiAgNzkuNjYlIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMTgwZGVnKTtcXG4gIH1cXG5cXG4gIDgxLjM2JSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDE4MGRlZyk7XFxuICB9XFxuXFxuICA4My4wNSUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpO1xcbiAgfVxcblxcbiAgODQuNzUlIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMTgwZGVnKTtcXG4gIH1cXG5cXG4gIDg2LjQ0JSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDE4MGRlZyk7XFxuICB9XFxuXFxuICA4OC4xNCUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpO1xcbiAgfVxcblxcbiAgODkuODMlIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMTgwZGVnKTtcXG4gIH1cXG5cXG4gIDkxLjUzJSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDE4MGRlZyk7XFxuICB9XFxuXFxuICA5My4yMiUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpO1xcbiAgfVxcblxcbiAgOTQuOTIlIHtcXG4gICAgdHJhbnNmb3JtOiByb3RhdGUoMTgwZGVnKTtcXG4gIH1cXG5cXG4gIDk2LjYxJSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDE4MGRlZyk7XFxuICB9XFxuXFxuICA5OC4zMSUge1xcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpO1xcbiAgfVxcblxcbiAgMTAwJSB7XFxuICAgIHRyYW5zZm9ybTogcm90YXRlKDE4MGRlZyk7XFxuICB9XFxufVxcbkBrZXlmcmFtZXMgc3BlY3RydW0tZmlsbHMtcm90YXRlIHtcXG4gIDAlIHt0cmFuc2Zvcm06IHJvdGF0ZSgtOTBkZWcpfVxcbiAgMTAwJSB7dHJhbnNmb3JtOiByb3RhdGUoMjcwZGVnKX1cXG59XFxuLnNwZWN0cnVtLUNpcmNsZUxvYWRlciB7XFxuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxuICB3aWR0aDogMzJweDtcXG4gIGhlaWdodDogMzJweDtcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG4gIGRpcmVjdGlvbjogbHRyO1xcbn1cXG4uc3BlY3RydW0tQ2lyY2xlTG9hZGVyLXRyYWNrIHtcXG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XFxuICB3aWR0aDogMzJweDtcXG4gIGhlaWdodDogMzJweDtcXG4gIGJvcmRlci1zdHlsZTogc29saWQ7XFxuICBib3JkZXItd2lkdGg6IDRweDtcXG4gIGJvcmRlci1yYWRpdXM6IDMycHg7XFxufVxcbi5zcGVjdHJ1bS1DaXJjbGVMb2FkZXItZmlsbHMge1xcbiAgcG9zaXRpb246IGFic29sdXRlO1xcbiAgdG9wOiAwO1xcbiAgbGVmdDogMDtcXG4gIHdpZHRoOiAxMDAlO1xcbiAgaGVpZ2h0OiAxMDAlO1xcbn1cXG4uc3BlY3RydW0tQ2lyY2xlTG9hZGVyLWZpbGwge1xcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXG4gIHdpZHRoOiAzMnB4O1xcbiAgaGVpZ2h0OiAzMnB4O1xcbiAgYm9yZGVyLXN0eWxlOiBzb2xpZDtcXG4gIGJvcmRlci13aWR0aDogNHB4O1xcbiAgYm9yZGVyLXJhZGl1czogMzJweDtcXG59XFxuLnNwZWN0cnVtLUNpcmNsZUxvYWRlci1maWxsTWFzazEsXFxuLnNwZWN0cnVtLUNpcmNsZUxvYWRlci1maWxsTWFzazIge1xcbiAgd2lkdGg6IDUwJTtcXG4gIGhlaWdodDogMTAwJTtcXG4gIHRyYW5zZm9ybS1vcmlnaW46IDEwMCUgY2VudGVyO1xcbiAgdHJhbnNmb3JtOiByb3RhdGUoMTgwZGVnKTtcXG4gIG92ZXJmbG93OiBoaWRkZW47XFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxufVxcbi5zcGVjdHJ1bS1DaXJjbGVMb2FkZXItZmlsbFN1Yk1hc2sxLFxcbi5zcGVjdHJ1bS1DaXJjbGVMb2FkZXItZmlsbFN1Yk1hc2syIHtcXG4gIHdpZHRoOiAxMDAlO1xcbiAgaGVpZ2h0OiAxMDAlO1xcbiAgdHJhbnNmb3JtLW9yaWdpbjogMTAwJSBjZW50ZXI7XFxuICBvdmVyZmxvdzogaGlkZGVuO1xcbiAgdHJhbnNmb3JtOiByb3RhdGUoLTE4MGRlZyk7XFxufVxcbi5zcGVjdHJ1bS1DaXJjbGVMb2FkZXItZmlsbE1hc2syIHtcXG4gIHRyYW5zZm9ybTogcm90YXRlKDBkZWcpO1xcbn1cXG4uc3BlY3RydW0tQ2lyY2xlTG9hZGVyLS1zbWFsbCB7XFxuICB3aWR0aDogMTZweDtcXG4gIGhlaWdodDogMTZweDtcXG59XFxuLnNwZWN0cnVtLUNpcmNsZUxvYWRlci0tc21hbGwgLnNwZWN0cnVtLUNpcmNsZUxvYWRlci10cmFjayB7XFxuICAgIHdpZHRoOiAxNnB4O1xcbiAgICBoZWlnaHQ6IDE2cHg7XFxuICAgIGJvcmRlci1zdHlsZTogc29saWQ7XFxuICAgIGJvcmRlci13aWR0aDogM3B4O1xcbiAgICBib3JkZXItcmFkaXVzOiAxNnB4O1xcbiAgfVxcbi5zcGVjdHJ1bS1DaXJjbGVMb2FkZXItLXNtYWxsIC5zcGVjdHJ1bS1DaXJjbGVMb2FkZXItZmlsbCB7XFxuICAgIHdpZHRoOiAxNnB4O1xcbiAgICBoZWlnaHQ6IDE2cHg7XFxuICAgIGJvcmRlci1zdHlsZTogc29saWQ7XFxuICAgIGJvcmRlci13aWR0aDogM3B4O1xcbiAgICBib3JkZXItcmFkaXVzOiAxNnB4O1xcbiAgfVxcbi5zcGVjdHJ1bS1DaXJjbGVMb2FkZXItLWxhcmdlIHtcXG4gIHdpZHRoOiA4MHB4O1xcbiAgaGVpZ2h0OiA4MHB4O1xcbn1cXG4uc3BlY3RydW0tQ2lyY2xlTG9hZGVyLS1sYXJnZSAuc3BlY3RydW0tQ2lyY2xlTG9hZGVyLXRyYWNrIHtcXG4gICAgd2lkdGg6IDgwcHg7XFxuICAgIGhlaWdodDogODBweDtcXG4gICAgYm9yZGVyLXN0eWxlOiBzb2xpZDtcXG4gICAgYm9yZGVyLXdpZHRoOiA1cHg7XFxuICAgIGJvcmRlci1yYWRpdXM6IDgwcHg7XFxuICB9XFxuLnNwZWN0cnVtLUNpcmNsZUxvYWRlci0tbGFyZ2UgLnNwZWN0cnVtLUNpcmNsZUxvYWRlci1maWxsIHtcXG4gICAgd2lkdGg6IDgwcHg7XFxuICAgIGhlaWdodDogODBweDtcXG4gICAgYm9yZGVyLXN0eWxlOiBzb2xpZDtcXG4gICAgYm9yZGVyLXdpZHRoOiA1cHg7XFxuICAgIGJvcmRlci1yYWRpdXM6IDgwcHg7XFxuICB9XFxuLnNwZWN0cnVtLUNpcmNsZUxvYWRlci0taW5kZXRlcm1pbmF0ZSAuc3BlY3RydW0tQ2lyY2xlTG9hZGVyLWZpbGxzIHtcXG4gICAgd2lsbC1jaGFuZ2U6IHRyYW5zZm9ybTtcXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVaKDApO1xcbiAgICBhbmltYXRpb246IDFzIGluZmluaXRlIGN1YmljLWJlemllciguMjUsLjc4LC40OCwuODkpIHNwZWN0cnVtLWZpbGxzLXJvdGF0ZTtcXG4gICAgdHJhbnNmb3JtLW9yaWdpbjogY2VudGVyO1xcbiAgfVxcbi5zcGVjdHJ1bS1DaXJjbGVMb2FkZXItLWluZGV0ZXJtaW5hdGUgLnNwZWN0cnVtLUNpcmNsZUxvYWRlci1maWxsU3ViTWFzazEge1xcbiAgICB3aWxsLWNoYW5nZTogdHJhbnNmb3JtO1xcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVooMCk7XFxuICAgIGFuaW1hdGlvbjogMXMgaW5maW5pdGUgbGluZWFyIHNwZWN0cnVtLWZpbGwtbWFzay0xO1xcbiAgfVxcbi5zcGVjdHJ1bS1DaXJjbGVMb2FkZXItLWluZGV0ZXJtaW5hdGUgLnNwZWN0cnVtLUNpcmNsZUxvYWRlci1maWxsU3ViTWFzazIge1xcbiAgICB3aWxsLWNoYW5nZTogdHJhbnNmb3JtO1xcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVooMCk7XFxuICAgIGFuaW1hdGlvbjogMXMgaW5maW5pdGUgbGluZWFyIHNwZWN0cnVtLWZpbGwtbWFzay0yO1xcbiAgfVxcblwiLCBcIlwiXSk7XG5cbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///152\n')},function(module,exports,__webpack_require__){eval("var api = __webpack_require__(5);\n            var content = __webpack_require__(154);\n\n            content = content.__esModule ? content.default : content;\n\n            if (typeof content === 'string') {\n              content = [[module.i, content, '']];\n            }\n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = api(content, options);\n\n\n\nmodule.exports = content.locals || {};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTUzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhZG9iZS9zcGVjdHJ1bS1jc3MvZGlzdC9jb21wb25lbnRzL2NpcmNsZWxvYWRlci9tdWx0aVN0b3BzL2xpZ2h0LmNzcz82Yzc5Il0sInNvdXJjZXNDb250ZW50IjpbInZhciBhcGkgPSByZXF1aXJlKFwiIS4uLy4uLy4uLy4uLy4uLy4uL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzXCIpO1xuICAgICAgICAgICAgdmFyIGNvbnRlbnQgPSByZXF1aXJlKFwiISEuLi8uLi8uLi8uLi8uLi8uLi9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vbGlnaHQuY3NzXCIpO1xuXG4gICAgICAgICAgICBjb250ZW50ID0gY29udGVudC5fX2VzTW9kdWxlID8gY29udGVudC5kZWZhdWx0IDogY29udGVudDtcblxuICAgICAgICAgICAgaWYgKHR5cGVvZiBjb250ZW50ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICBjb250ZW50ID0gW1ttb2R1bGUuaWQsIGNvbnRlbnQsICcnXV07XG4gICAgICAgICAgICB9XG5cbnZhciBvcHRpb25zID0ge307XG5cbm9wdGlvbnMuaW5zZXJ0ID0gXCJoZWFkXCI7XG5vcHRpb25zLnNpbmdsZXRvbiA9IGZhbHNlO1xuXG52YXIgdXBkYXRlID0gYXBpKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5cblxubW9kdWxlLmV4cG9ydHMgPSBjb250ZW50LmxvY2FscyB8fCB7fTsiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///153\n")},function(module,exports,__webpack_require__){eval('exports = module.exports = __webpack_require__(6)(false);\n// Module\nexports.push([module.i, ".spectrum--light .spectrum-CircleLoader-track {\\n  border-color: rgb(225, 225, 225);\\n}\\n.spectrum--light .spectrum-CircleLoader-fill {\\n  border-color: rgb(20, 115, 230);\\n}\\n.spectrum--light .spectrum-CircleLoader--overBackground .spectrum-CircleLoader-track {\\n    border-color: rgba(255,255,255,0.2);\\n  }\\n.spectrum--light .spectrum-CircleLoader--overBackground .spectrum-CircleLoader-fill {\\n    border-color: rgb(255, 255, 255);\\n  }\\n.spectrum--light .spectrum-CircleLoader--indeterminate.spectrum-CircleLoader--overBackground .spectrum-CircleLoader-track {\\n    border-color: rgba(255,255,255,0.2);\\n  }\\n.spectrum--light .spectrum-CircleLoader--indeterminate.spectrum-CircleLoader--overBackground .spectrum-CircleLoader-fill {\\n    border-color: rgb(255, 255, 255);\\n  }\\n", ""]);\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTU0LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhZG9iZS9zcGVjdHJ1bS1jc3MvZGlzdC9jb21wb25lbnRzL2NpcmNsZWxvYWRlci9tdWx0aVN0b3BzL2xpZ2h0LmNzcz82ZjUxIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCIuLi8uLi8uLi8uLi8uLi8uLi9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIikoZmFsc2UpO1xuLy8gTW9kdWxlXG5leHBvcnRzLnB1c2goW21vZHVsZS5pZCwgXCIuc3BlY3RydW0tLWxpZ2h0IC5zcGVjdHJ1bS1DaXJjbGVMb2FkZXItdHJhY2sge1xcbiAgYm9yZGVyLWNvbG9yOiByZ2IoMjI1LCAyMjUsIDIyNSk7XFxufVxcbi5zcGVjdHJ1bS0tbGlnaHQgLnNwZWN0cnVtLUNpcmNsZUxvYWRlci1maWxsIHtcXG4gIGJvcmRlci1jb2xvcjogcmdiKDIwLCAxMTUsIDIzMCk7XFxufVxcbi5zcGVjdHJ1bS0tbGlnaHQgLnNwZWN0cnVtLUNpcmNsZUxvYWRlci0tb3ZlckJhY2tncm91bmQgLnNwZWN0cnVtLUNpcmNsZUxvYWRlci10cmFjayB7XFxuICAgIGJvcmRlci1jb2xvcjogcmdiYSgyNTUsMjU1LDI1NSwwLjIpO1xcbiAgfVxcbi5zcGVjdHJ1bS0tbGlnaHQgLnNwZWN0cnVtLUNpcmNsZUxvYWRlci0tb3ZlckJhY2tncm91bmQgLnNwZWN0cnVtLUNpcmNsZUxvYWRlci1maWxsIHtcXG4gICAgYm9yZGVyLWNvbG9yOiByZ2IoMjU1LCAyNTUsIDI1NSk7XFxuICB9XFxuLnNwZWN0cnVtLS1saWdodCAuc3BlY3RydW0tQ2lyY2xlTG9hZGVyLS1pbmRldGVybWluYXRlLnNwZWN0cnVtLUNpcmNsZUxvYWRlci0tb3ZlckJhY2tncm91bmQgLnNwZWN0cnVtLUNpcmNsZUxvYWRlci10cmFjayB7XFxuICAgIGJvcmRlci1jb2xvcjogcmdiYSgyNTUsMjU1LDI1NSwwLjIpO1xcbiAgfVxcbi5zcGVjdHJ1bS0tbGlnaHQgLnNwZWN0cnVtLUNpcmNsZUxvYWRlci0taW5kZXRlcm1pbmF0ZS5zcGVjdHJ1bS1DaXJjbGVMb2FkZXItLW92ZXJCYWNrZ3JvdW5kIC5zcGVjdHJ1bS1DaXJjbGVMb2FkZXItZmlsbCB7XFxuICAgIGJvcmRlci1jb2xvcjogcmdiKDI1NSwgMjU1LCAyNTUpO1xcbiAgfVxcblwiLCBcIlwiXSk7XG5cbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///154\n')},function(module,exports,__webpack_require__){eval("var api = __webpack_require__(5);\n            var content = __webpack_require__(156);\n\n            content = content.__esModule ? content.default : content;\n\n            if (typeof content === 'string') {\n              content = [[module.i, content, '']];\n            }\n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = api(content, options);\n\n\n\nmodule.exports = content.locals || {};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTU1LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhZG9iZS9zcGVjdHJ1bS1jc3MvZGlzdC9jb21wb25lbnRzL2NpcmNsZWxvYWRlci9tdWx0aVN0b3BzL2RhcmsuY3NzP2Q3YWIiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGFwaSA9IHJlcXVpcmUoXCIhLi4vLi4vLi4vLi4vLi4vLi4vc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanNcIik7XG4gICAgICAgICAgICB2YXIgY29udGVudCA9IHJlcXVpcmUoXCIhIS4uLy4uLy4uLy4uLy4uLy4uL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9kYXJrLmNzc1wiKTtcblxuICAgICAgICAgICAgY29udGVudCA9IGNvbnRlbnQuX19lc01vZHVsZSA/IGNvbnRlbnQuZGVmYXVsdCA6IGNvbnRlbnQ7XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgY29udGVudCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgY29udGVudCA9IFtbbW9kdWxlLmlkLCBjb250ZW50LCAnJ11dO1xuICAgICAgICAgICAgfVxuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLmluc2VydCA9IFwiaGVhZFwiO1xub3B0aW9ucy5zaW5nbGV0b24gPSBmYWxzZTtcblxudmFyIHVwZGF0ZSA9IGFwaShjb250ZW50LCBvcHRpb25zKTtcblxuXG5cbm1vZHVsZS5leHBvcnRzID0gY29udGVudC5sb2NhbHMgfHwge307Il0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///155\n")},function(module,exports,__webpack_require__){eval('exports = module.exports = __webpack_require__(6)(false);\n// Module\nexports.push([module.i, ".spectrum--dark .spectrum-CircleLoader-track {\\n  border-color: rgb(74, 74, 74);\\n}\\n.spectrum--dark .spectrum-CircleLoader-fill {\\n  border-color: rgb(55, 142, 240);\\n}\\n.spectrum--dark .spectrum-CircleLoader--overBackground .spectrum-CircleLoader-track {\\n    border-color: rgba(255,255,255,0.2);\\n  }\\n.spectrum--dark .spectrum-CircleLoader--overBackground .spectrum-CircleLoader-fill {\\n    border-color: rgb(255, 255, 255);\\n  }\\n.spectrum--dark .spectrum-CircleLoader--indeterminate.spectrum-CircleLoader--overBackground .spectrum-CircleLoader-track {\\n    border-color: rgba(255,255,255,0.2);\\n  }\\n.spectrum--dark .spectrum-CircleLoader--indeterminate.spectrum-CircleLoader--overBackground .spectrum-CircleLoader-fill {\\n    border-color: rgb(255, 255, 255);\\n  }\\n", ""]);\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTU2LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhZG9iZS9zcGVjdHJ1bS1jc3MvZGlzdC9jb21wb25lbnRzL2NpcmNsZWxvYWRlci9tdWx0aVN0b3BzL2RhcmsuY3NzP2Y5OGUiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIi4uLy4uLy4uLy4uLy4uLy4uL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qc1wiKShmYWxzZSk7XG4vLyBNb2R1bGVcbmV4cG9ydHMucHVzaChbbW9kdWxlLmlkLCBcIi5zcGVjdHJ1bS0tZGFyayAuc3BlY3RydW0tQ2lyY2xlTG9hZGVyLXRyYWNrIHtcXG4gIGJvcmRlci1jb2xvcjogcmdiKDc0LCA3NCwgNzQpO1xcbn1cXG4uc3BlY3RydW0tLWRhcmsgLnNwZWN0cnVtLUNpcmNsZUxvYWRlci1maWxsIHtcXG4gIGJvcmRlci1jb2xvcjogcmdiKDU1LCAxNDIsIDI0MCk7XFxufVxcbi5zcGVjdHJ1bS0tZGFyayAuc3BlY3RydW0tQ2lyY2xlTG9hZGVyLS1vdmVyQmFja2dyb3VuZCAuc3BlY3RydW0tQ2lyY2xlTG9hZGVyLXRyYWNrIHtcXG4gICAgYm9yZGVyLWNvbG9yOiByZ2JhKDI1NSwyNTUsMjU1LDAuMik7XFxuICB9XFxuLnNwZWN0cnVtLS1kYXJrIC5zcGVjdHJ1bS1DaXJjbGVMb2FkZXItLW92ZXJCYWNrZ3JvdW5kIC5zcGVjdHJ1bS1DaXJjbGVMb2FkZXItZmlsbCB7XFxuICAgIGJvcmRlci1jb2xvcjogcmdiKDI1NSwgMjU1LCAyNTUpO1xcbiAgfVxcbi5zcGVjdHJ1bS0tZGFyayAuc3BlY3RydW0tQ2lyY2xlTG9hZGVyLS1pbmRldGVybWluYXRlLnNwZWN0cnVtLUNpcmNsZUxvYWRlci0tb3ZlckJhY2tncm91bmQgLnNwZWN0cnVtLUNpcmNsZUxvYWRlci10cmFjayB7XFxuICAgIGJvcmRlci1jb2xvcjogcmdiYSgyNTUsMjU1LDI1NSwwLjIpO1xcbiAgfVxcbi5zcGVjdHJ1bS0tZGFyayAuc3BlY3RydW0tQ2lyY2xlTG9hZGVyLS1pbmRldGVybWluYXRlLnNwZWN0cnVtLUNpcmNsZUxvYWRlci0tb3ZlckJhY2tncm91bmQgLnNwZWN0cnVtLUNpcmNsZUxvYWRlci1maWxsIHtcXG4gICAgYm9yZGVyLWNvbG9yOiByZ2IoMjU1LCAyNTUsIDI1NSk7XFxuICB9XFxuXCIsIFwiXCJdKTtcblxuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///156\n')},function(module,exports,__webpack_require__){eval("var api = __webpack_require__(5);\n            var content = __webpack_require__(158);\n\n            content = content.__esModule ? content.default : content;\n\n            if (typeof content === 'string') {\n              content = [[module.i, content, '']];\n            }\n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = api(content, options);\n\n\n\nmodule.exports = content.locals || {};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTU3LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhZG9iZS9zcGVjdHJ1bS1jc3MvZGlzdC9jb21wb25lbnRzL2NpcmNsZWxvYWRlci9tdWx0aVN0b3BzL2xpZ2h0ZXN0LmNzcz8zYzk1Il0sInNvdXJjZXNDb250ZW50IjpbInZhciBhcGkgPSByZXF1aXJlKFwiIS4uLy4uLy4uLy4uLy4uLy4uL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzXCIpO1xuICAgICAgICAgICAgdmFyIGNvbnRlbnQgPSByZXF1aXJlKFwiISEuLi8uLi8uLi8uLi8uLi8uLi9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vbGlnaHRlc3QuY3NzXCIpO1xuXG4gICAgICAgICAgICBjb250ZW50ID0gY29udGVudC5fX2VzTW9kdWxlID8gY29udGVudC5kZWZhdWx0IDogY29udGVudDtcblxuICAgICAgICAgICAgaWYgKHR5cGVvZiBjb250ZW50ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICBjb250ZW50ID0gW1ttb2R1bGUuaWQsIGNvbnRlbnQsICcnXV07XG4gICAgICAgICAgICB9XG5cbnZhciBvcHRpb25zID0ge307XG5cbm9wdGlvbnMuaW5zZXJ0ID0gXCJoZWFkXCI7XG5vcHRpb25zLnNpbmdsZXRvbiA9IGZhbHNlO1xuXG52YXIgdXBkYXRlID0gYXBpKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5cblxubW9kdWxlLmV4cG9ydHMgPSBjb250ZW50LmxvY2FscyB8fCB7fTsiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///157\n")},function(module,exports,__webpack_require__){eval('exports = module.exports = __webpack_require__(6)(false);\n// Module\nexports.push([module.i, ".spectrum--lightest .spectrum-CircleLoader-track {\\n  border-color: rgb(234, 234, 234);\\n}\\n.spectrum--lightest .spectrum-CircleLoader-fill {\\n  border-color: rgb(38, 128, 235);\\n}\\n.spectrum--lightest .spectrum-CircleLoader--overBackground .spectrum-CircleLoader-track {\\n    border-color: rgba(255,255,255,0.2);\\n  }\\n.spectrum--lightest .spectrum-CircleLoader--overBackground .spectrum-CircleLoader-fill {\\n    border-color: rgb(255, 255, 255);\\n  }\\n.spectrum--lightest .spectrum-CircleLoader--indeterminate.spectrum-CircleLoader--overBackground .spectrum-CircleLoader-track {\\n    border-color: rgba(255,255,255,0.2);\\n  }\\n.spectrum--lightest .spectrum-CircleLoader--indeterminate.spectrum-CircleLoader--overBackground .spectrum-CircleLoader-fill {\\n    border-color: rgb(255, 255, 255);\\n  }\\n", ""]);\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTU4LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhZG9iZS9zcGVjdHJ1bS1jc3MvZGlzdC9jb21wb25lbnRzL2NpcmNsZWxvYWRlci9tdWx0aVN0b3BzL2xpZ2h0ZXN0LmNzcz9lYTJiIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCIuLi8uLi8uLi8uLi8uLi8uLi9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIikoZmFsc2UpO1xuLy8gTW9kdWxlXG5leHBvcnRzLnB1c2goW21vZHVsZS5pZCwgXCIuc3BlY3RydW0tLWxpZ2h0ZXN0IC5zcGVjdHJ1bS1DaXJjbGVMb2FkZXItdHJhY2sge1xcbiAgYm9yZGVyLWNvbG9yOiByZ2IoMjM0LCAyMzQsIDIzNCk7XFxufVxcbi5zcGVjdHJ1bS0tbGlnaHRlc3QgLnNwZWN0cnVtLUNpcmNsZUxvYWRlci1maWxsIHtcXG4gIGJvcmRlci1jb2xvcjogcmdiKDM4LCAxMjgsIDIzNSk7XFxufVxcbi5zcGVjdHJ1bS0tbGlnaHRlc3QgLnNwZWN0cnVtLUNpcmNsZUxvYWRlci0tb3ZlckJhY2tncm91bmQgLnNwZWN0cnVtLUNpcmNsZUxvYWRlci10cmFjayB7XFxuICAgIGJvcmRlci1jb2xvcjogcmdiYSgyNTUsMjU1LDI1NSwwLjIpO1xcbiAgfVxcbi5zcGVjdHJ1bS0tbGlnaHRlc3QgLnNwZWN0cnVtLUNpcmNsZUxvYWRlci0tb3ZlckJhY2tncm91bmQgLnNwZWN0cnVtLUNpcmNsZUxvYWRlci1maWxsIHtcXG4gICAgYm9yZGVyLWNvbG9yOiByZ2IoMjU1LCAyNTUsIDI1NSk7XFxuICB9XFxuLnNwZWN0cnVtLS1saWdodGVzdCAuc3BlY3RydW0tQ2lyY2xlTG9hZGVyLS1pbmRldGVybWluYXRlLnNwZWN0cnVtLUNpcmNsZUxvYWRlci0tb3ZlckJhY2tncm91bmQgLnNwZWN0cnVtLUNpcmNsZUxvYWRlci10cmFjayB7XFxuICAgIGJvcmRlci1jb2xvcjogcmdiYSgyNTUsMjU1LDI1NSwwLjIpO1xcbiAgfVxcbi5zcGVjdHJ1bS0tbGlnaHRlc3QgLnNwZWN0cnVtLUNpcmNsZUxvYWRlci0taW5kZXRlcm1pbmF0ZS5zcGVjdHJ1bS1DaXJjbGVMb2FkZXItLW92ZXJCYWNrZ3JvdW5kIC5zcGVjdHJ1bS1DaXJjbGVMb2FkZXItZmlsbCB7XFxuICAgIGJvcmRlci1jb2xvcjogcmdiKDI1NSwgMjU1LCAyNTUpO1xcbiAgfVxcblwiLCBcIlwiXSk7XG5cbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///158\n')},function(module,exports,__webpack_require__){eval("var api = __webpack_require__(5);\n            var content = __webpack_require__(160);\n\n            content = content.__esModule ? content.default : content;\n\n            if (typeof content === 'string') {\n              content = [[module.i, content, '']];\n            }\n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = api(content, options);\n\n\n\nmodule.exports = content.locals || {};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTU5LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhZG9iZS9zcGVjdHJ1bS1jc3MvZGlzdC9jb21wb25lbnRzL2NpcmNsZWxvYWRlci9tdWx0aVN0b3BzL2Rhcmtlc3QuY3NzP2E1ODYiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGFwaSA9IHJlcXVpcmUoXCIhLi4vLi4vLi4vLi4vLi4vLi4vc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanNcIik7XG4gICAgICAgICAgICB2YXIgY29udGVudCA9IHJlcXVpcmUoXCIhIS4uLy4uLy4uLy4uLy4uLy4uL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9kYXJrZXN0LmNzc1wiKTtcblxuICAgICAgICAgICAgY29udGVudCA9IGNvbnRlbnQuX19lc01vZHVsZSA/IGNvbnRlbnQuZGVmYXVsdCA6IGNvbnRlbnQ7XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgY29udGVudCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgY29udGVudCA9IFtbbW9kdWxlLmlkLCBjb250ZW50LCAnJ11dO1xuICAgICAgICAgICAgfVxuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLmluc2VydCA9IFwiaGVhZFwiO1xub3B0aW9ucy5zaW5nbGV0b24gPSBmYWxzZTtcblxudmFyIHVwZGF0ZSA9IGFwaShjb250ZW50LCBvcHRpb25zKTtcblxuXG5cbm1vZHVsZS5leHBvcnRzID0gY29udGVudC5sb2NhbHMgfHwge307Il0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///159\n")},function(module,exports,__webpack_require__){eval('exports = module.exports = __webpack_require__(6)(false);\n// Module\nexports.push([module.i, ".spectrum--darkest .spectrum-CircleLoader-track {\\n  border-color: rgb(57, 57, 57);\\n}\\n.spectrum--darkest .spectrum-CircleLoader-fill {\\n  border-color: rgb(38, 128, 235);\\n}\\n.spectrum--darkest .spectrum-CircleLoader--overBackground .spectrum-CircleLoader-track {\\n    border-color: rgba(255,255,255,0.2);\\n  }\\n.spectrum--darkest .spectrum-CircleLoader--overBackground .spectrum-CircleLoader-fill {\\n    border-color: rgb(255, 255, 255);\\n  }\\n.spectrum--darkest .spectrum-CircleLoader--indeterminate.spectrum-CircleLoader--overBackground .spectrum-CircleLoader-track {\\n    border-color: rgba(255,255,255,0.2);\\n  }\\n.spectrum--darkest .spectrum-CircleLoader--indeterminate.spectrum-CircleLoader--overBackground .spectrum-CircleLoader-fill {\\n    border-color: rgb(255, 255, 255);\\n  }\\n", ""]);\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTYwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhZG9iZS9zcGVjdHJ1bS1jc3MvZGlzdC9jb21wb25lbnRzL2NpcmNsZWxvYWRlci9tdWx0aVN0b3BzL2Rhcmtlc3QuY3NzPzJmNDUiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIi4uLy4uLy4uLy4uLy4uLy4uL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qc1wiKShmYWxzZSk7XG4vLyBNb2R1bGVcbmV4cG9ydHMucHVzaChbbW9kdWxlLmlkLCBcIi5zcGVjdHJ1bS0tZGFya2VzdCAuc3BlY3RydW0tQ2lyY2xlTG9hZGVyLXRyYWNrIHtcXG4gIGJvcmRlci1jb2xvcjogcmdiKDU3LCA1NywgNTcpO1xcbn1cXG4uc3BlY3RydW0tLWRhcmtlc3QgLnNwZWN0cnVtLUNpcmNsZUxvYWRlci1maWxsIHtcXG4gIGJvcmRlci1jb2xvcjogcmdiKDM4LCAxMjgsIDIzNSk7XFxufVxcbi5zcGVjdHJ1bS0tZGFya2VzdCAuc3BlY3RydW0tQ2lyY2xlTG9hZGVyLS1vdmVyQmFja2dyb3VuZCAuc3BlY3RydW0tQ2lyY2xlTG9hZGVyLXRyYWNrIHtcXG4gICAgYm9yZGVyLWNvbG9yOiByZ2JhKDI1NSwyNTUsMjU1LDAuMik7XFxuICB9XFxuLnNwZWN0cnVtLS1kYXJrZXN0IC5zcGVjdHJ1bS1DaXJjbGVMb2FkZXItLW92ZXJCYWNrZ3JvdW5kIC5zcGVjdHJ1bS1DaXJjbGVMb2FkZXItZmlsbCB7XFxuICAgIGJvcmRlci1jb2xvcjogcmdiKDI1NSwgMjU1LCAyNTUpO1xcbiAgfVxcbi5zcGVjdHJ1bS0tZGFya2VzdCAuc3BlY3RydW0tQ2lyY2xlTG9hZGVyLS1pbmRldGVybWluYXRlLnNwZWN0cnVtLUNpcmNsZUxvYWRlci0tb3ZlckJhY2tncm91bmQgLnNwZWN0cnVtLUNpcmNsZUxvYWRlci10cmFjayB7XFxuICAgIGJvcmRlci1jb2xvcjogcmdiYSgyNTUsMjU1LDI1NSwwLjIpO1xcbiAgfVxcbi5zcGVjdHJ1bS0tZGFya2VzdCAuc3BlY3RydW0tQ2lyY2xlTG9hZGVyLS1pbmRldGVybWluYXRlLnNwZWN0cnVtLUNpcmNsZUxvYWRlci0tb3ZlckJhY2tncm91bmQgLnNwZWN0cnVtLUNpcmNsZUxvYWRlci1maWxsIHtcXG4gICAgYm9yZGVyLWNvbG9yOiByZ2IoMjU1LCAyNTUsIDI1NSk7XFxuICB9XFxuXCIsIFwiXCJdKTtcblxuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///160\n')},function(module,exports,__webpack_require__){"use strict";eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n// ////////////////////////////////////////////////////////////////////\n//  DO NOT modify this file by hand.\n//  contents generated by extract-dna.js\n// ////////////////////////////////////////////////////////////////////\nvar _default = {\n  'elements': {\n    'lightest': {\n      'medium': {\n        'circleloader': {\n          'large': {\n            'states': {\n              'default': {\n                'text-color': 'rgb(80, 80, 80)',\n                'track-color': 'rgb(234, 234, 234)',\n                'track-fill-color': 'rgb(38, 128, 235)'\n              }\n            },\n            'dimensions': {\n              'height': '64px',\n              'width': '64px',\n              'border-size': '4px'\n            }\n          },\n          'large-over-background': {\n            'states': {\n              'default': {\n                'text-color': 'rgb(255, 255, 255)',\n                'track-color': 'rgba(255,255,255,0.2)',\n                'track-fill-color': 'rgb(255, 255, 255)'\n              }\n            },\n            'dimensions': {\n              'height': '64px',\n              'width': '64px',\n              'border-size': '4px'\n            }\n          },\n          'medium': {\n            'states': {\n              'default': {\n                'text-color': 'rgb(80, 80, 80)',\n                'track-color': 'rgb(234, 234, 234)',\n                'track-fill-color': 'rgb(38, 128, 235)'\n              }\n            },\n            'dimensions': {\n              'height': '32px',\n              'width': '32px',\n              'border-size': '3px'\n            }\n          },\n          'medium-over-background': {\n            'states': {\n              'default': {\n                'text-color': 'rgb(255, 255, 255)',\n                'track-color': 'rgba(255,255,255,0.2)',\n                'track-fill-color': 'rgb(255, 255, 255)'\n              }\n            },\n            'dimensions': {\n              'height': '32px',\n              'width': '32px',\n              'border-size': '3px'\n            }\n          },\n          'small': {\n            'states': {\n              'default': {\n                'text-color': 'rgb(80, 80, 80)',\n                'track-color': 'rgb(234, 234, 234)',\n                'track-fill-color': 'rgb(38, 128, 235)'\n              }\n            },\n            'dimensions': {\n              'height': '16px',\n              'width': '16px',\n              'border-size': '2px'\n            }\n          },\n          'small-over-background': {\n            'states': {\n              'default': {\n                'text-color': 'rgb(255, 255, 255)',\n                'track-color': 'rgba(255,255,255,0.2)',\n                'track-fill-color': 'rgb(255, 255, 255)'\n              }\n            },\n            'dimensions': {\n              'height': '16px',\n              'width': '16px',\n              'border-size': '2px'\n            }\n          }\n        },\n        'coachmark': {\n          'default': {\n            'dimensions': {\n              'indicator-ring-border-size': '2px',\n              'animation-indicator-ring-duration': '3000ms',\n              'animation-indicator-keyframe-50-opacity': '0.6',\n              'indicator-ring-diameter': '16px'\n            },\n            'states': {\n              'default': {\n                'indicator-ring-default-color': 'rgb(55, 142, 240)'\n              }\n            }\n          },\n          'quiet': {\n            'dimensions': {\n              'indicator-ring-border-size': '2px',\n              'animation-indicator-ring-duration': '3000ms',\n              'animation-indicator-keyframe-50-opacity': '0.6',\n              'indicator-ring-diameter': '8px'\n            },\n            'states': {\n              'default': {\n                'indicator-ring-default-color': 'rgb(55, 142, 240)'\n              }\n            }\n          }\n        },\n        'popover': {\n          'default': {\n            'states': {\n              'default': {\n                'background-color': 'rgb(255, 255, 255)',\n                'border-color': 'rgb(211, 211, 211)'\n              }\n            }\n          }\n        },\n        'sidenav': {\n          'default': {\n            'states': {\n              'key-focus': {\n                'item-border-color': 'rgb(55, 142, 240)'\n              }\n            }\n          },\n          'multilevel': {\n            'states': {\n              'key-focus': {\n                'item-border-color': 'rgb(55, 142, 240)'\n              }\n            }\n          }\n        },\n        'textfield': {\n          'default': {\n            'states': {\n              'default': {\n                'background-color': 'rgb(255, 255, 255)',\n                'border-color': 'rgb(234, 234, 234)'\n              },\n              'disabled': {\n                'background-color': 'rgb(244, 244, 244)',\n                'border-color': 'transparent'\n              },\n              'mouse-focus': {\n                'background-color': 'rgb(255, 255, 255)',\n                'border-color': 'rgb(38, 128, 235)'\n              }\n            }\n          },\n          'quiet': {\n            'states': {\n              'default': {\n                'background-color': 'transparent',\n                'border-color': 'rgb(234, 234, 234)'\n              },\n              'disabled': {\n                'background-color': 'transparent',\n                'border-color': 'rgb(234, 234, 234)'\n              },\n              'mouse-focus': {\n                'background-color': 'transparent',\n                'border-color': 'rgb(38, 128, 235)'\n              }\n            }\n          }\n        },\n        'tooltip': {\n          'default': {\n            'states': {\n              'default': {\n                'tip-color': 'rgb(116, 116, 116)'\n              }\n            }\n          },\n          'info': {\n            'states': {\n              'default': {\n                'tip-color': 'rgb(13, 102, 208)'\n              }\n            }\n          },\n          'negative': {\n            'states': {\n              'default': {\n                'tip-color': 'rgb(201, 37, 45)'\n              }\n            }\n          },\n          'positive': {\n            'states': {\n              'default': {\n                'tip-color': 'rgb(18, 128, 92)'\n              }\n            }\n          }\n        }\n      },\n      'large': {\n        'circleloader': {\n          'large': {\n            'states': {\n              'default': {\n                'text-color': 'rgb(80, 80, 80)',\n                'track-color': 'rgb(234, 234, 234)',\n                'track-fill-color': 'rgb(38, 128, 235)'\n              }\n            },\n            'dimensions': {\n              'height': '80px',\n              'width': '80px',\n              'border-size': '5px'\n            }\n          },\n          'large-over-background': {\n            'states': {\n              'default': {\n                'text-color': 'rgb(255, 255, 255)',\n                'track-color': 'rgba(255,255,255,0.2)',\n                'track-fill-color': 'rgb(255, 255, 255)'\n              }\n            },\n            'dimensions': {\n              'height': '80px',\n              'width': '80px',\n              'border-size': '5px'\n            }\n          },\n          'medium': {\n            'states': {\n              'default': {\n                'text-color': 'rgb(80, 80, 80)',\n                'track-color': 'rgb(234, 234, 234)',\n                'track-fill-color': 'rgb(38, 128, 235)'\n              }\n            },\n            'dimensions': {\n              'height': '40px',\n              'width': '40px',\n              'border-size': '4px'\n            }\n          },\n          'medium-over-background': {\n            'states': {\n              'default': {\n                'text-color': 'rgb(255, 255, 255)',\n                'track-color': 'rgba(255,255,255,0.2)',\n                'track-fill-color': 'rgb(255, 255, 255)'\n              }\n            },\n            'dimensions': {\n              'height': '40px',\n              'width': '40px',\n              'border-size': '4px'\n            }\n          },\n          'small': {\n            'states': {\n              'default': {\n                'text-color': 'rgb(80, 80, 80)',\n                'track-color': 'rgb(234, 234, 234)',\n                'track-fill-color': 'rgb(38, 128, 235)'\n              }\n            },\n            'dimensions': {\n              'height': '20px',\n              'width': '20px',\n              'border-size': '3px'\n            }\n          },\n          'small-over-background': {\n            'states': {\n              'default': {\n                'text-color': 'rgb(255, 255, 255)',\n                'track-color': 'rgba(255,255,255,0.2)',\n                'track-fill-color': 'rgb(255, 255, 255)'\n              }\n            },\n            'dimensions': {\n              'height': '20px',\n              'width': '20px',\n              'border-size': '3px'\n            }\n          }\n        },\n        'coachmark': {\n          'default': {\n            'dimensions': {\n              'indicator-ring-border-size': '2px',\n              'animation-indicator-ring-duration': '3000ms',\n              'animation-indicator-keyframe-50-opacity': '0.6',\n              'indicator-ring-diameter': '20px'\n            },\n            'states': {\n              'default': {\n                'indicator-ring-default-color': 'rgb(55, 142, 240)'\n              }\n            }\n          },\n          'quiet': {\n            'dimensions': {\n              'indicator-ring-border-size': '2px',\n              'animation-indicator-ring-duration': '3000ms',\n              'animation-indicator-keyframe-50-opacity': '0.6',\n              'indicator-ring-diameter': '10px'\n            },\n            'states': {\n              'default': {\n                'indicator-ring-default-color': 'rgb(55, 142, 240)'\n              }\n            }\n          }\n        },\n        'popover': {\n          'default': {\n            'states': {\n              'default': {\n                'background-color': 'rgb(255, 255, 255)',\n                'border-color': 'rgb(211, 211, 211)'\n              }\n            }\n          }\n        },\n        'sidenav': {\n          'default': {\n            'states': {\n              'key-focus': {\n                'item-border-color': 'rgb(55, 142, 240)'\n              }\n            }\n          },\n          'multilevel': {\n            'states': {\n              'key-focus': {\n                'item-border-color': 'rgb(55, 142, 240)'\n              }\n            }\n          }\n        },\n        'textfield': {\n          'default': {\n            'states': {\n              'default': {\n                'background-color': 'rgb(255, 255, 255)',\n                'border-color': 'rgb(234, 234, 234)'\n              },\n              'disabled': {\n                'background-color': 'rgb(244, 244, 244)',\n                'border-color': 'transparent'\n              },\n              'mouse-focus': {\n                'background-color': 'rgb(255, 255, 255)',\n                'border-color': 'rgb(38, 128, 235)'\n              }\n            }\n          },\n          'quiet': {\n            'states': {\n              'default': {\n                'background-color': 'transparent',\n                'border-color': 'rgb(234, 234, 234)'\n              },\n              'disabled': {\n                'background-color': 'transparent',\n                'border-color': 'rgb(234, 234, 234)'\n              },\n              'mouse-focus': {\n                'background-color': 'transparent',\n                'border-color': 'rgb(38, 128, 235)'\n              }\n            }\n          }\n        },\n        'tooltip': {\n          'default': {\n            'states': {\n              'default': {\n                'tip-color': 'rgb(116, 116, 116)'\n              }\n            }\n          },\n          'info': {\n            'states': {\n              'default': {\n                'tip-color': 'rgb(13, 102, 208)'\n              }\n            }\n          },\n          'negative': {\n            'states': {\n              'default': {\n                'tip-color': 'rgb(201, 37, 45)'\n              }\n            }\n          },\n          'positive': {\n            'states': {\n              'default': {\n                'tip-color': 'rgb(18, 128, 92)'\n              }\n            }\n          }\n        }\n      }\n    },\n    'light': {\n      'medium': {\n        'circleloader': {\n          'large': {\n            'states': {\n              'default': {\n                'text-color': 'rgb(75, 75, 75)',\n                'track-color': 'rgb(225, 225, 225)',\n                'track-fill-color': 'rgb(20, 115, 230)'\n              }\n            },\n            'dimensions': {\n              'height': '64px',\n              'width': '64px',\n              'border-size': '4px'\n            }\n          },\n          'large-over-background': {\n            'states': {\n              'default': {\n                'text-color': 'rgb(255, 255, 255)',\n                'track-color': 'rgba(255,255,255,0.2)',\n                'track-fill-color': 'rgb(255, 255, 255)'\n              }\n            },\n            'dimensions': {\n              'height': '64px',\n              'width': '64px',\n              'border-size': '4px'\n            }\n          },\n          'medium': {\n            'states': {\n              'default': {\n                'text-color': 'rgb(75, 75, 75)',\n                'track-color': 'rgb(225, 225, 225)',\n                'track-fill-color': 'rgb(20, 115, 230)'\n              }\n            },\n            'dimensions': {\n              'height': '32px',\n              'width': '32px',\n              'border-size': '3px'\n            }\n          },\n          'medium-over-background': {\n            'states': {\n              'default': {\n                'text-color': 'rgb(255, 255, 255)',\n                'track-color': 'rgba(255,255,255,0.2)',\n                'track-fill-color': 'rgb(255, 255, 255)'\n              }\n            },\n            'dimensions': {\n              'height': '32px',\n              'width': '32px',\n              'border-size': '3px'\n            }\n          },\n          'small': {\n            'states': {\n              'default': {\n                'text-color': 'rgb(75, 75, 75)',\n                'track-color': 'rgb(225, 225, 225)',\n                'track-fill-color': 'rgb(20, 115, 230)'\n              }\n            },\n            'dimensions': {\n              'height': '16px',\n              'width': '16px',\n              'border-size': '2px'\n            }\n          },\n          'small-over-background': {\n            'states': {\n              'default': {\n                'text-color': 'rgb(255, 255, 255)',\n                'track-color': 'rgba(255,255,255,0.2)',\n                'track-fill-color': 'rgb(255, 255, 255)'\n              }\n            },\n            'dimensions': {\n              'height': '16px',\n              'width': '16px',\n              'border-size': '2px'\n            }\n          }\n        },\n        'coachmark': {\n          'default': {\n            'dimensions': {\n              'indicator-ring-border-size': '2px',\n              'animation-indicator-ring-duration': '3000ms',\n              'animation-indicator-keyframe-50-opacity': '0.6',\n              'indicator-ring-diameter': '16px'\n            },\n            'states': {\n              'default': {\n                'indicator-ring-default-color': 'rgb(38, 128, 235)'\n              }\n            }\n          },\n          'quiet': {\n            'dimensions': {\n              'indicator-ring-border-size': '2px',\n              'animation-indicator-ring-duration': '3000ms',\n              'animation-indicator-keyframe-50-opacity': '0.6',\n              'indicator-ring-diameter': '8px'\n            },\n            'states': {\n              'default': {\n                'indicator-ring-default-color': 'rgb(38, 128, 235)'\n              }\n            }\n          }\n        },\n        'popover': {\n          'default': {\n            'states': {\n              'default': {\n                'background-color': 'rgb(255, 255, 255)',\n                'border-color': 'rgb(202, 202, 202)'\n              }\n            }\n          }\n        },\n        'sidenav': {\n          'default': {\n            'states': {\n              'key-focus': {\n                'item-border-color': 'rgb(38, 128, 235)'\n              }\n            }\n          },\n          'multilevel': {\n            'states': {\n              'key-focus': {\n                'item-border-color': 'rgb(38, 128, 235)'\n              }\n            }\n          }\n        },\n        'textfield': {\n          'default': {\n            'states': {\n              'default': {\n                'background-color': 'rgb(255, 255, 255)',\n                'border-color': 'rgb(225, 225, 225)'\n              },\n              'disabled': {\n                'background-color': 'rgb(234, 234, 234)',\n                'border-color': 'transparent'\n              },\n              'mouse-focus': {\n                'background-color': 'rgb(255, 255, 255)',\n                'border-color': 'rgb(20, 115, 230)'\n              }\n            }\n          },\n          'quiet': {\n            'states': {\n              'default': {\n                'background-color': 'transparent',\n                'border-color': 'rgb(225, 225, 225)'\n              },\n              'disabled': {\n                'background-color': 'transparent',\n                'border-color': 'rgb(225, 225, 225)'\n              },\n              'mouse-focus': {\n                'background-color': 'transparent',\n                'border-color': 'rgb(20, 115, 230)'\n              }\n            }\n          }\n        },\n        'tooltip': {\n          'default': {\n            'states': {\n              'default': {\n                'tip-color': 'rgb(116, 116, 116)'\n              }\n            }\n          },\n          'info': {\n            'states': {\n              'default': {\n                'tip-color': 'rgb(13, 102, 208)'\n              }\n            }\n          },\n          'negative': {\n            'states': {\n              'default': {\n                'tip-color': 'rgb(201, 37, 45)'\n              }\n            }\n          },\n          'positive': {\n            'states': {\n              'default': {\n                'tip-color': 'rgb(18, 128, 92)'\n              }\n            }\n          }\n        }\n      },\n      'large': {\n        'circleloader': {\n          'large': {\n            'states': {\n              'default': {\n                'text-color': 'rgb(75, 75, 75)',\n                'track-color': 'rgb(225, 225, 225)',\n                'track-fill-color': 'rgb(20, 115, 230)'\n              }\n            },\n            'dimensions': {\n              'height': '80px',\n              'width': '80px',\n              'border-size': '5px'\n            }\n          },\n          'large-over-background': {\n            'states': {\n              'default': {\n                'text-color': 'rgb(255, 255, 255)',\n                'track-color': 'rgba(255,255,255,0.2)',\n                'track-fill-color': 'rgb(255, 255, 255)'\n              }\n            },\n            'dimensions': {\n              'height': '80px',\n              'width': '80px',\n              'border-size': '5px'\n            }\n          },\n          'medium': {\n            'states': {\n              'default': {\n                'text-color': 'rgb(75, 75, 75)',\n                'track-color': 'rgb(225, 225, 225)',\n                'track-fill-color': 'rgb(20, 115, 230)'\n              }\n            },\n            'dimensions': {\n              'height': '40px',\n              'width': '40px',\n              'border-size': '4px'\n            }\n          },\n          'medium-over-background': {\n            'states': {\n              'default': {\n                'text-color': 'rgb(255, 255, 255)',\n                'track-color': 'rgba(255,255,255,0.2)',\n                'track-fill-color': 'rgb(255, 255, 255)'\n              }\n            },\n            'dimensions': {\n              'height': '40px',\n              'width': '40px',\n              'border-size': '4px'\n            }\n          },\n          'small': {\n            'states': {\n              'default': {\n                'text-color': 'rgb(75, 75, 75)',\n                'track-color': 'rgb(225, 225, 225)',\n                'track-fill-color': 'rgb(20, 115, 230)'\n              }\n            },\n            'dimensions': {\n              'height': '20px',\n              'width': '20px',\n              'border-size': '3px'\n            }\n          },\n          'small-over-background': {\n            'states': {\n              'default': {\n                'text-color': 'rgb(255, 255, 255)',\n                'track-color': 'rgba(255,255,255,0.2)',\n                'track-fill-color': 'rgb(255, 255, 255)'\n              }\n            },\n            'dimensions': {\n              'height': '20px',\n              'width': '20px',\n              'border-size': '3px'\n            }\n          }\n        },\n        'coachmark': {\n          'default': {\n            'dimensions': {\n              'indicator-ring-border-size': '2px',\n              'animation-indicator-ring-duration': '3000ms',\n              'animation-indicator-keyframe-50-opacity': '0.6',\n              'indicator-ring-diameter': '20px'\n            },\n            'states': {\n              'default': {\n                'indicator-ring-default-color': 'rgb(38, 128, 235)'\n              }\n            }\n          },\n          'quiet': {\n            'dimensions': {\n              'indicator-ring-border-size': '2px',\n              'animation-indicator-ring-duration': '3000ms',\n              'animation-indicator-keyframe-50-opacity': '0.6',\n              'indicator-ring-diameter': '10px'\n            },\n            'states': {\n              'default': {\n                'indicator-ring-default-color': 'rgb(38, 128, 235)'\n              }\n            }\n          }\n        },\n        'popover': {\n          'default': {\n            'states': {\n              'default': {\n                'background-color': 'rgb(255, 255, 255)',\n                'border-color': 'rgb(202, 202, 202)'\n              }\n            }\n          }\n        },\n        'sidenav': {\n          'default': {\n            'states': {\n              'key-focus': {\n                'item-border-color': 'rgb(38, 128, 235)'\n              }\n            }\n          },\n          'multilevel': {\n            'states': {\n              'key-focus': {\n                'item-border-color': 'rgb(38, 128, 235)'\n              }\n            }\n          }\n        },\n        'textfield': {\n          'default': {\n            'states': {\n              'default': {\n                'background-color': 'rgb(255, 255, 255)',\n                'border-color': 'rgb(225, 225, 225)'\n              },\n              'disabled': {\n                'background-color': 'rgb(234, 234, 234)',\n                'border-color': 'transparent'\n              },\n              'mouse-focus': {\n                'background-color': 'rgb(255, 255, 255)',\n                'border-color': 'rgb(20, 115, 230)'\n              }\n            }\n          },\n          'quiet': {\n            'states': {\n              'default': {\n                'background-color': 'transparent',\n                'border-color': 'rgb(225, 225, 225)'\n              },\n              'disabled': {\n                'background-color': 'transparent',\n                'border-color': 'rgb(225, 225, 225)'\n              },\n              'mouse-focus': {\n                'background-color': 'transparent',\n                'border-color': 'rgb(20, 115, 230)'\n              }\n            }\n          }\n        },\n        'tooltip': {\n          'default': {\n            'states': {\n              'default': {\n                'tip-color': 'rgb(116, 116, 116)'\n              }\n            }\n          },\n          'info': {\n            'states': {\n              'default': {\n                'tip-color': 'rgb(13, 102, 208)'\n              }\n            }\n          },\n          'negative': {\n            'states': {\n              'default': {\n                'tip-color': 'rgb(201, 37, 45)'\n              }\n            }\n          },\n          'positive': {\n            'states': {\n              'default': {\n                'tip-color': 'rgb(18, 128, 92)'\n              }\n            }\n          }\n        }\n      }\n    },\n    'dark': {\n      'medium': {\n        'circleloader': {\n          'large': {\n            'states': {\n              'default': {\n                'text-color': 'rgb(227, 227, 227)',\n                'track-color': 'rgb(74, 74, 74)',\n                'track-fill-color': 'rgb(55, 142, 240)'\n              }\n            },\n            'dimensions': {\n              'height': '64px',\n              'width': '64px',\n              'border-size': '4px'\n            }\n          },\n          'large-over-background': {\n            'states': {\n              'default': {\n                'text-color': 'rgb(255, 255, 255)',\n                'track-color': 'rgba(255,255,255,0.2)',\n                'track-fill-color': 'rgb(255, 255, 255)'\n              }\n            },\n            'dimensions': {\n              'height': '64px',\n              'width': '64px',\n              'border-size': '4px'\n            }\n          },\n          'medium': {\n            'states': {\n              'default': {\n                'text-color': 'rgb(227, 227, 227)',\n                'track-color': 'rgb(74, 74, 74)',\n                'track-fill-color': 'rgb(55, 142, 240)'\n              }\n            },\n            'dimensions': {\n              'height': '32px',\n              'width': '32px',\n              'border-size': '3px'\n            }\n          },\n          'medium-over-background': {\n            'states': {\n              'default': {\n                'text-color': 'rgb(255, 255, 255)',\n                'track-color': 'rgba(255,255,255,0.2)',\n                'track-fill-color': 'rgb(255, 255, 255)'\n              }\n            },\n            'dimensions': {\n              'height': '32px',\n              'width': '32px',\n              'border-size': '3px'\n            }\n          },\n          'small': {\n            'states': {\n              'default': {\n                'text-color': 'rgb(227, 227, 227)',\n                'track-color': 'rgb(74, 74, 74)',\n                'track-fill-color': 'rgb(55, 142, 240)'\n              }\n            },\n            'dimensions': {\n              'height': '16px',\n              'width': '16px',\n              'border-size': '2px'\n            }\n          },\n          'small-over-background': {\n            'states': {\n              'default': {\n                'text-color': 'rgb(255, 255, 255)',\n                'track-color': 'rgba(255,255,255,0.2)',\n                'track-fill-color': 'rgb(255, 255, 255)'\n              }\n            },\n            'dimensions': {\n              'height': '16px',\n              'width': '16px',\n              'border-size': '2px'\n            }\n          }\n        },\n        'coachmark': {\n          'default': {\n            'dimensions': {\n              'indicator-ring-border-size': '2px',\n              'animation-indicator-ring-duration': '3000ms',\n              'animation-indicator-keyframe-50-opacity': '0.6',\n              'indicator-ring-diameter': '16px'\n            },\n            'states': {\n              'default': {\n                'indicator-ring-default-color': 'rgb(38, 128, 235)'\n              }\n            }\n          },\n          'quiet': {\n            'dimensions': {\n              'indicator-ring-border-size': '2px',\n              'animation-indicator-ring-duration': '3000ms',\n              'animation-indicator-keyframe-50-opacity': '0.6',\n              'indicator-ring-diameter': '8px'\n            },\n            'states': {\n              'default': {\n                'indicator-ring-default-color': 'rgb(38, 128, 235)'\n              }\n            }\n          }\n        },\n        'popover': {\n          'default': {\n            'states': {\n              'default': {\n                'background-color': 'rgb(37, 37, 37)',\n                'border-color': 'rgb(90, 90, 90)'\n              }\n            }\n          }\n        },\n        'sidenav': {\n          'default': {\n            'states': {\n              'key-focus': {\n                'item-border-color': 'rgb(38, 128, 235)'\n              }\n            }\n          },\n          'multilevel': {\n            'states': {\n              'key-focus': {\n                'item-border-color': 'rgb(38, 128, 235)'\n              }\n            }\n          }\n        },\n        'textfield': {\n          'default': {\n            'states': {\n              'default': {\n                'background-color': 'rgb(37, 37, 37)',\n                'border-color': 'rgb(74, 74, 74)'\n              },\n              'disabled': {\n                'background-color': 'rgb(62, 62, 62)',\n                'border-color': 'transparent'\n              },\n              'mouse-focus': {\n                'background-color': 'rgb(37, 37, 37)',\n                'border-color': 'rgb(55, 142, 240)'\n              }\n            }\n          },\n          'quiet': {\n            'states': {\n              'default': {\n                'background-color': 'transparent',\n                'border-color': 'rgb(74, 74, 74)'\n              },\n              'disabled': {\n                'background-color': 'transparent',\n                'border-color': 'rgb(74, 74, 74)'\n              },\n              'mouse-focus': {\n                'background-color': 'transparent',\n                'border-color': 'rgb(55, 142, 240)'\n              }\n            }\n          }\n        },\n        'tooltip': {\n          'default': {\n            'states': {\n              'default': {\n                'tip-color': 'rgb(116, 116, 116)'\n              }\n            }\n          },\n          'info': {\n            'states': {\n              'default': {\n                'tip-color': 'rgb(13, 102, 208)'\n              }\n            }\n          },\n          'negative': {\n            'states': {\n              'default': {\n                'tip-color': 'rgb(201, 37, 45)'\n              }\n            }\n          },\n          'positive': {\n            'states': {\n              'default': {\n                'tip-color': 'rgb(18, 128, 92)'\n              }\n            }\n          }\n        }\n      },\n      'large': {\n        'circleloader': {\n          'large': {\n            'states': {\n              'default': {\n                'text-color': 'rgb(227, 227, 227)',\n                'track-color': 'rgb(74, 74, 74)',\n                'track-fill-color': 'rgb(55, 142, 240)'\n              }\n            },\n            'dimensions': {\n              'height': '80px',\n              'width': '80px',\n              'border-size': '5px'\n            }\n          },\n          'large-over-background': {\n            'states': {\n              'default': {\n                'text-color': 'rgb(255, 255, 255)',\n                'track-color': 'rgba(255,255,255,0.2)',\n                'track-fill-color': 'rgb(255, 255, 255)'\n              }\n            },\n            'dimensions': {\n              'height': '80px',\n              'width': '80px',\n              'border-size': '5px'\n            }\n          },\n          'medium': {\n            'states': {\n              'default': {\n                'text-color': 'rgb(227, 227, 227)',\n                'track-color': 'rgb(74, 74, 74)',\n                'track-fill-color': 'rgb(55, 142, 240)'\n              }\n            },\n            'dimensions': {\n              'height': '40px',\n              'width': '40px',\n              'border-size': '4px'\n            }\n          },\n          'medium-over-background': {\n            'states': {\n              'default': {\n                'text-color': 'rgb(255, 255, 255)',\n                'track-color': 'rgba(255,255,255,0.2)',\n                'track-fill-color': 'rgb(255, 255, 255)'\n              }\n            },\n            'dimensions': {\n              'height': '40px',\n              'width': '40px',\n              'border-size': '4px'\n            }\n          },\n          'small': {\n            'states': {\n              'default': {\n                'text-color': 'rgb(227, 227, 227)',\n                'track-color': 'rgb(74, 74, 74)',\n                'track-fill-color': 'rgb(55, 142, 240)'\n              }\n            },\n            'dimensions': {\n              'height': '20px',\n              'width': '20px',\n              'border-size': '3px'\n            }\n          },\n          'small-over-background': {\n            'states': {\n              'default': {\n                'text-color': 'rgb(255, 255, 255)',\n                'track-color': 'rgba(255,255,255,0.2)',\n                'track-fill-color': 'rgb(255, 255, 255)'\n              }\n            },\n            'dimensions': {\n              'height': '20px',\n              'width': '20px',\n              'border-size': '3px'\n            }\n          }\n        },\n        'coachmark': {\n          'default': {\n            'dimensions': {\n              'indicator-ring-border-size': '2px',\n              'animation-indicator-ring-duration': '3000ms',\n              'animation-indicator-keyframe-50-opacity': '0.6',\n              'indicator-ring-diameter': '20px'\n            },\n            'states': {\n              'default': {\n                'indicator-ring-default-color': 'rgb(38, 128, 235)'\n              }\n            }\n          },\n          'quiet': {\n            'dimensions': {\n              'indicator-ring-border-size': '2px',\n              'animation-indicator-ring-duration': '3000ms',\n              'animation-indicator-keyframe-50-opacity': '0.6',\n              'indicator-ring-diameter': '10px'\n            },\n            'states': {\n              'default': {\n                'indicator-ring-default-color': 'rgb(38, 128, 235)'\n              }\n            }\n          }\n        },\n        'popover': {\n          'default': {\n            'states': {\n              'default': {\n                'background-color': 'rgb(37, 37, 37)',\n                'border-color': 'rgb(90, 90, 90)'\n              }\n            }\n          }\n        },\n        'sidenav': {\n          'default': {\n            'states': {\n              'key-focus': {\n                'item-border-color': 'rgb(38, 128, 235)'\n              }\n            }\n          },\n          'multilevel': {\n            'states': {\n              'key-focus': {\n                'item-border-color': 'rgb(38, 128, 235)'\n              }\n            }\n          }\n        },\n        'textfield': {\n          'default': {\n            'states': {\n              'default': {\n                'background-color': 'rgb(37, 37, 37)',\n                'border-color': 'rgb(74, 74, 74)'\n              },\n              'disabled': {\n                'background-color': 'rgb(62, 62, 62)',\n                'border-color': 'transparent'\n              },\n              'mouse-focus': {\n                'background-color': 'rgb(37, 37, 37)',\n                'border-color': 'rgb(55, 142, 240)'\n              }\n            }\n          },\n          'quiet': {\n            'states': {\n              'default': {\n                'background-color': 'transparent',\n                'border-color': 'rgb(74, 74, 74)'\n              },\n              'disabled': {\n                'background-color': 'transparent',\n                'border-color': 'rgb(74, 74, 74)'\n              },\n              'mouse-focus': {\n                'background-color': 'transparent',\n                'border-color': 'rgb(55, 142, 240)'\n              }\n            }\n          }\n        },\n        'tooltip': {\n          'default': {\n            'states': {\n              'default': {\n                'tip-color': 'rgb(116, 116, 116)'\n              }\n            }\n          },\n          'info': {\n            'states': {\n              'default': {\n                'tip-color': 'rgb(13, 102, 208)'\n              }\n            }\n          },\n          'negative': {\n            'states': {\n              'default': {\n                'tip-color': 'rgb(201, 37, 45)'\n              }\n            }\n          },\n          'positive': {\n            'states': {\n              'default': {\n                'tip-color': 'rgb(18, 128, 92)'\n              }\n            }\n          }\n        }\n      }\n    },\n    'darkest': {\n      'medium': {\n        'circleloader': {\n          'large': {\n            'states': {\n              'default': {\n                'text-color': 'rgb(200, 200, 200)',\n                'track-color': 'rgb(57, 57, 57)',\n                'track-fill-color': 'rgb(38, 128, 235)'\n              }\n            },\n            'dimensions': {\n              'height': '64px',\n              'width': '64px',\n              'border-size': '4px'\n            }\n          },\n          'large-over-background': {\n            'states': {\n              'default': {\n                'text-color': 'rgb(255, 255, 255)',\n                'track-color': 'rgba(255,255,255,0.2)',\n                'track-fill-color': 'rgb(255, 255, 255)'\n              }\n            },\n            'dimensions': {\n              'height': '64px',\n              'width': '64px',\n              'border-size': '4px'\n            }\n          },\n          'medium': {\n            'states': {\n              'default': {\n                'text-color': 'rgb(200, 200, 200)',\n                'track-color': 'rgb(57, 57, 57)',\n                'track-fill-color': 'rgb(38, 128, 235)'\n              }\n            },\n            'dimensions': {\n              'height': '32px',\n              'width': '32px',\n              'border-size': '3px'\n            }\n          },\n          'medium-over-background': {\n            'states': {\n              'default': {\n                'text-color': 'rgb(255, 255, 255)',\n                'track-color': 'rgba(255,255,255,0.2)',\n                'track-fill-color': 'rgb(255, 255, 255)'\n              }\n            },\n            'dimensions': {\n              'height': '32px',\n              'width': '32px',\n              'border-size': '3px'\n            }\n          },\n          'small': {\n            'states': {\n              'default': {\n                'text-color': 'rgb(200, 200, 200)',\n                'track-color': 'rgb(57, 57, 57)',\n                'track-fill-color': 'rgb(38, 128, 235)'\n              }\n            },\n            'dimensions': {\n              'height': '16px',\n              'width': '16px',\n              'border-size': '2px'\n            }\n          },\n          'small-over-background': {\n            'states': {\n              'default': {\n                'text-color': 'rgb(255, 255, 255)',\n                'track-color': 'rgba(255,255,255,0.2)',\n                'track-fill-color': 'rgb(255, 255, 255)'\n              }\n            },\n            'dimensions': {\n              'height': '16px',\n              'width': '16px',\n              'border-size': '2px'\n            }\n          }\n        },\n        'coachmark': {\n          'default': {\n            'dimensions': {\n              'indicator-ring-border-size': '2px',\n              'animation-indicator-ring-duration': '3000ms',\n              'animation-indicator-keyframe-50-opacity': '0.6',\n              'indicator-ring-diameter': '16px'\n            },\n            'states': {\n              'default': {\n                'indicator-ring-default-color': 'rgb(20, 115, 230)'\n              }\n            }\n          },\n          'quiet': {\n            'dimensions': {\n              'indicator-ring-border-size': '2px',\n              'animation-indicator-ring-duration': '3000ms',\n              'animation-indicator-keyframe-50-opacity': '0.6',\n              'indicator-ring-diameter': '8px'\n            },\n            'states': {\n              'default': {\n                'indicator-ring-default-color': 'rgb(20, 115, 230)'\n              }\n            }\n          }\n        },\n        'popover': {\n          'default': {\n            'states': {\n              'default': {\n                'background-color': 'rgb(8, 8, 8)',\n                'border-color': 'rgb(73, 73, 73)'\n              }\n            }\n          }\n        },\n        'sidenav': {\n          'default': {\n            'states': {\n              'key-focus': {\n                'item-border-color': 'rgb(20, 115, 230)'\n              }\n            }\n          },\n          'multilevel': {\n            'states': {\n              'key-focus': {\n                'item-border-color': 'rgb(20, 115, 230)'\n              }\n            }\n          }\n        },\n        'textfield': {\n          'default': {\n            'states': {\n              'default': {\n                'background-color': 'rgb(8, 8, 8)',\n                'border-color': 'rgb(57, 57, 57)'\n              },\n              'disabled': {\n                'background-color': 'rgb(44, 44, 44)',\n                'border-color': 'transparent'\n              },\n              'mouse-focus': {\n                'background-color': 'rgb(8, 8, 8)',\n                'border-color': 'rgb(38, 128, 235)'\n              }\n            }\n          },\n          'quiet': {\n            'states': {\n              'default': {\n                'background-color': 'transparent',\n                'border-color': 'rgb(57, 57, 57)'\n              },\n              'disabled': {\n                'background-color': 'transparent',\n                'border-color': 'rgb(57, 57, 57)'\n              },\n              'mouse-focus': {\n                'background-color': 'transparent',\n                'border-color': 'rgb(38, 128, 235)'\n              }\n            }\n          }\n        },\n        'tooltip': {\n          'default': {\n            'states': {\n              'default': {\n                'tip-color': 'rgb(116, 116, 116)'\n              }\n            }\n          },\n          'info': {\n            'states': {\n              'default': {\n                'tip-color': 'rgb(13, 102, 208)'\n              }\n            }\n          },\n          'negative': {\n            'states': {\n              'default': {\n                'tip-color': 'rgb(201, 37, 45)'\n              }\n            }\n          },\n          'positive': {\n            'states': {\n              'default': {\n                'tip-color': 'rgb(18, 128, 92)'\n              }\n            }\n          }\n        }\n      },\n      'large': {\n        'circleloader': {\n          'large': {\n            'states': {\n              'default': {\n                'text-color': 'rgb(200, 200, 200)',\n                'track-color': 'rgb(57, 57, 57)',\n                'track-fill-color': 'rgb(38, 128, 235)'\n              }\n            },\n            'dimensions': {\n              'height': '80px',\n              'width': '80px',\n              'border-size': '5px'\n            }\n          },\n          'large-over-background': {\n            'states': {\n              'default': {\n                'text-color': 'rgb(255, 255, 255)',\n                'track-color': 'rgba(255,255,255,0.2)',\n                'track-fill-color': 'rgb(255, 255, 255)'\n              }\n            },\n            'dimensions': {\n              'height': '80px',\n              'width': '80px',\n              'border-size': '5px'\n            }\n          },\n          'medium': {\n            'states': {\n              'default': {\n                'text-color': 'rgb(200, 200, 200)',\n                'track-color': 'rgb(57, 57, 57)',\n                'track-fill-color': 'rgb(38, 128, 235)'\n              }\n            },\n            'dimensions': {\n              'height': '40px',\n              'width': '40px',\n              'border-size': '4px'\n            }\n          },\n          'medium-over-background': {\n            'states': {\n              'default': {\n                'text-color': 'rgb(255, 255, 255)',\n                'track-color': 'rgba(255,255,255,0.2)',\n                'track-fill-color': 'rgb(255, 255, 255)'\n              }\n            },\n            'dimensions': {\n              'height': '40px',\n              'width': '40px',\n              'border-size': '4px'\n            }\n          },\n          'small': {\n            'states': {\n              'default': {\n                'text-color': 'rgb(200, 200, 200)',\n                'track-color': 'rgb(57, 57, 57)',\n                'track-fill-color': 'rgb(38, 128, 235)'\n              }\n            },\n            'dimensions': {\n              'height': '20px',\n              'width': '20px',\n              'border-size': '3px'\n            }\n          },\n          'small-over-background': {\n            'states': {\n              'default': {\n                'text-color': 'rgb(255, 255, 255)',\n                'track-color': 'rgba(255,255,255,0.2)',\n                'track-fill-color': 'rgb(255, 255, 255)'\n              }\n            },\n            'dimensions': {\n              'height': '20px',\n              'width': '20px',\n              'border-size': '3px'\n            }\n          }\n        },\n        'coachmark': {\n          'default': {\n            'dimensions': {\n              'indicator-ring-border-size': '2px',\n              'animation-indicator-ring-duration': '3000ms',\n              'animation-indicator-keyframe-50-opacity': '0.6',\n              'indicator-ring-diameter': '20px'\n            },\n            'states': {\n              'default': {\n                'indicator-ring-default-color': 'rgb(20, 115, 230)'\n              }\n            }\n          },\n          'quiet': {\n            'dimensions': {\n              'indicator-ring-border-size': '2px',\n              'animation-indicator-ring-duration': '3000ms',\n              'animation-indicator-keyframe-50-opacity': '0.6',\n              'indicator-ring-diameter': '10px'\n            },\n            'states': {\n              'default': {\n                'indicator-ring-default-color': 'rgb(20, 115, 230)'\n              }\n            }\n          }\n        },\n        'popover': {\n          'default': {\n            'states': {\n              'default': {\n                'background-color': 'rgb(8, 8, 8)',\n                'border-color': 'rgb(73, 73, 73)'\n              }\n            }\n          }\n        },\n        'sidenav': {\n          'default': {\n            'states': {\n              'key-focus': {\n                'item-border-color': 'rgb(20, 115, 230)'\n              }\n            }\n          },\n          'multilevel': {\n            'states': {\n              'key-focus': {\n                'item-border-color': 'rgb(20, 115, 230)'\n              }\n            }\n          }\n        },\n        'textfield': {\n          'default': {\n            'states': {\n              'default': {\n                'background-color': 'rgb(8, 8, 8)',\n                'border-color': 'rgb(57, 57, 57)'\n              },\n              'disabled': {\n                'background-color': 'rgb(44, 44, 44)',\n                'border-color': 'transparent'\n              },\n              'mouse-focus': {\n                'background-color': 'rgb(8, 8, 8)',\n                'border-color': 'rgb(38, 128, 235)'\n              }\n            }\n          },\n          'quiet': {\n            'states': {\n              'default': {\n                'background-color': 'transparent',\n                'border-color': 'rgb(57, 57, 57)'\n              },\n              'disabled': {\n                'background-color': 'transparent',\n                'border-color': 'rgb(57, 57, 57)'\n              },\n              'mouse-focus': {\n                'background-color': 'transparent',\n                'border-color': 'rgb(38, 128, 235)'\n              }\n            }\n          }\n        },\n        'tooltip': {\n          'default': {\n            'states': {\n              'default': {\n                'tip-color': 'rgb(116, 116, 116)'\n              }\n            }\n          },\n          'info': {\n            'states': {\n              'default': {\n                'tip-color': 'rgb(13, 102, 208)'\n              }\n            }\n          },\n          'negative': {\n            'states': {\n              'default': {\n                'tip-color': 'rgb(201, 37, 45)'\n              }\n            }\n          },\n          'positive': {\n            'states': {\n              'default': {\n                'tip-color': 'rgb(18, 128, 92)'\n              }\n            }\n          }\n        }\n      }\n    }\n  }\n};\nexports.default = _default;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTYxLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0b3JxLW5hdGl2ZS9yZWFjdC1zcGVjdHJ1bS91dGlscy9kbmEuanM/OTc4YiJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbi8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyAgRE8gTk9UIG1vZGlmeSB0aGlzIGZpbGUgYnkgaGFuZC5cbi8vICBjb250ZW50cyBnZW5lcmF0ZWQgYnkgZXh0cmFjdC1kbmEuanNcbi8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG52YXIgX2RlZmF1bHQgPSB7XG4gICdlbGVtZW50cyc6IHtcbiAgICAnbGlnaHRlc3QnOiB7XG4gICAgICAnbWVkaXVtJzoge1xuICAgICAgICAnY2lyY2xlbG9hZGVyJzoge1xuICAgICAgICAgICdsYXJnZSc6IHtcbiAgICAgICAgICAgICdzdGF0ZXMnOiB7XG4gICAgICAgICAgICAgICdkZWZhdWx0Jzoge1xuICAgICAgICAgICAgICAgICd0ZXh0LWNvbG9yJzogJ3JnYig4MCwgODAsIDgwKScsXG4gICAgICAgICAgICAgICAgJ3RyYWNrLWNvbG9yJzogJ3JnYigyMzQsIDIzNCwgMjM0KScsXG4gICAgICAgICAgICAgICAgJ3RyYWNrLWZpbGwtY29sb3InOiAncmdiKDM4LCAxMjgsIDIzNSknXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnZGltZW5zaW9ucyc6IHtcbiAgICAgICAgICAgICAgJ2hlaWdodCc6ICc2NHB4JyxcbiAgICAgICAgICAgICAgJ3dpZHRoJzogJzY0cHgnLFxuICAgICAgICAgICAgICAnYm9yZGVyLXNpemUnOiAnNHB4J1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgJ2xhcmdlLW92ZXItYmFja2dyb3VuZCc6IHtcbiAgICAgICAgICAgICdzdGF0ZXMnOiB7XG4gICAgICAgICAgICAgICdkZWZhdWx0Jzoge1xuICAgICAgICAgICAgICAgICd0ZXh0LWNvbG9yJzogJ3JnYigyNTUsIDI1NSwgMjU1KScsXG4gICAgICAgICAgICAgICAgJ3RyYWNrLWNvbG9yJzogJ3JnYmEoMjU1LDI1NSwyNTUsMC4yKScsXG4gICAgICAgICAgICAgICAgJ3RyYWNrLWZpbGwtY29sb3InOiAncmdiKDI1NSwgMjU1LCAyNTUpJ1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ2RpbWVuc2lvbnMnOiB7XG4gICAgICAgICAgICAgICdoZWlnaHQnOiAnNjRweCcsXG4gICAgICAgICAgICAgICd3aWR0aCc6ICc2NHB4JyxcbiAgICAgICAgICAgICAgJ2JvcmRlci1zaXplJzogJzRweCdcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgICdtZWRpdW0nOiB7XG4gICAgICAgICAgICAnc3RhdGVzJzoge1xuICAgICAgICAgICAgICAnZGVmYXVsdCc6IHtcbiAgICAgICAgICAgICAgICAndGV4dC1jb2xvcic6ICdyZ2IoODAsIDgwLCA4MCknLFxuICAgICAgICAgICAgICAgICd0cmFjay1jb2xvcic6ICdyZ2IoMjM0LCAyMzQsIDIzNCknLFxuICAgICAgICAgICAgICAgICd0cmFjay1maWxsLWNvbG9yJzogJ3JnYigzOCwgMTI4LCAyMzUpJ1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ2RpbWVuc2lvbnMnOiB7XG4gICAgICAgICAgICAgICdoZWlnaHQnOiAnMzJweCcsXG4gICAgICAgICAgICAgICd3aWR0aCc6ICczMnB4JyxcbiAgICAgICAgICAgICAgJ2JvcmRlci1zaXplJzogJzNweCdcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgICdtZWRpdW0tb3Zlci1iYWNrZ3JvdW5kJzoge1xuICAgICAgICAgICAgJ3N0YXRlcyc6IHtcbiAgICAgICAgICAgICAgJ2RlZmF1bHQnOiB7XG4gICAgICAgICAgICAgICAgJ3RleHQtY29sb3InOiAncmdiKDI1NSwgMjU1LCAyNTUpJyxcbiAgICAgICAgICAgICAgICAndHJhY2stY29sb3InOiAncmdiYSgyNTUsMjU1LDI1NSwwLjIpJyxcbiAgICAgICAgICAgICAgICAndHJhY2stZmlsbC1jb2xvcic6ICdyZ2IoMjU1LCAyNTUsIDI1NSknXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnZGltZW5zaW9ucyc6IHtcbiAgICAgICAgICAgICAgJ2hlaWdodCc6ICczMnB4JyxcbiAgICAgICAgICAgICAgJ3dpZHRoJzogJzMycHgnLFxuICAgICAgICAgICAgICAnYm9yZGVyLXNpemUnOiAnM3B4J1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgJ3NtYWxsJzoge1xuICAgICAgICAgICAgJ3N0YXRlcyc6IHtcbiAgICAgICAgICAgICAgJ2RlZmF1bHQnOiB7XG4gICAgICAgICAgICAgICAgJ3RleHQtY29sb3InOiAncmdiKDgwLCA4MCwgODApJyxcbiAgICAgICAgICAgICAgICAndHJhY2stY29sb3InOiAncmdiKDIzNCwgMjM0LCAyMzQpJyxcbiAgICAgICAgICAgICAgICAndHJhY2stZmlsbC1jb2xvcic6ICdyZ2IoMzgsIDEyOCwgMjM1KSdcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdkaW1lbnNpb25zJzoge1xuICAgICAgICAgICAgICAnaGVpZ2h0JzogJzE2cHgnLFxuICAgICAgICAgICAgICAnd2lkdGgnOiAnMTZweCcsXG4gICAgICAgICAgICAgICdib3JkZXItc2l6ZSc6ICcycHgnXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICAnc21hbGwtb3Zlci1iYWNrZ3JvdW5kJzoge1xuICAgICAgICAgICAgJ3N0YXRlcyc6IHtcbiAgICAgICAgICAgICAgJ2RlZmF1bHQnOiB7XG4gICAgICAgICAgICAgICAgJ3RleHQtY29sb3InOiAncmdiKDI1NSwgMjU1LCAyNTUpJyxcbiAgICAgICAgICAgICAgICAndHJhY2stY29sb3InOiAncmdiYSgyNTUsMjU1LDI1NSwwLjIpJyxcbiAgICAgICAgICAgICAgICAndHJhY2stZmlsbC1jb2xvcic6ICdyZ2IoMjU1LCAyNTUsIDI1NSknXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnZGltZW5zaW9ucyc6IHtcbiAgICAgICAgICAgICAgJ2hlaWdodCc6ICcxNnB4JyxcbiAgICAgICAgICAgICAgJ3dpZHRoJzogJzE2cHgnLFxuICAgICAgICAgICAgICAnYm9yZGVyLXNpemUnOiAnMnB4J1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgJ2NvYWNobWFyayc6IHtcbiAgICAgICAgICAnZGVmYXVsdCc6IHtcbiAgICAgICAgICAgICdkaW1lbnNpb25zJzoge1xuICAgICAgICAgICAgICAnaW5kaWNhdG9yLXJpbmctYm9yZGVyLXNpemUnOiAnMnB4JyxcbiAgICAgICAgICAgICAgJ2FuaW1hdGlvbi1pbmRpY2F0b3ItcmluZy1kdXJhdGlvbic6ICczMDAwbXMnLFxuICAgICAgICAgICAgICAnYW5pbWF0aW9uLWluZGljYXRvci1rZXlmcmFtZS01MC1vcGFjaXR5JzogJzAuNicsXG4gICAgICAgICAgICAgICdpbmRpY2F0b3ItcmluZy1kaWFtZXRlcic6ICcxNnB4J1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdzdGF0ZXMnOiB7XG4gICAgICAgICAgICAgICdkZWZhdWx0Jzoge1xuICAgICAgICAgICAgICAgICdpbmRpY2F0b3ItcmluZy1kZWZhdWx0LWNvbG9yJzogJ3JnYig1NSwgMTQyLCAyNDApJ1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICAncXVpZXQnOiB7XG4gICAgICAgICAgICAnZGltZW5zaW9ucyc6IHtcbiAgICAgICAgICAgICAgJ2luZGljYXRvci1yaW5nLWJvcmRlci1zaXplJzogJzJweCcsXG4gICAgICAgICAgICAgICdhbmltYXRpb24taW5kaWNhdG9yLXJpbmctZHVyYXRpb24nOiAnMzAwMG1zJyxcbiAgICAgICAgICAgICAgJ2FuaW1hdGlvbi1pbmRpY2F0b3Ita2V5ZnJhbWUtNTAtb3BhY2l0eSc6ICcwLjYnLFxuICAgICAgICAgICAgICAnaW5kaWNhdG9yLXJpbmctZGlhbWV0ZXInOiAnOHB4J1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdzdGF0ZXMnOiB7XG4gICAgICAgICAgICAgICdkZWZhdWx0Jzoge1xuICAgICAgICAgICAgICAgICdpbmRpY2F0b3ItcmluZy1kZWZhdWx0LWNvbG9yJzogJ3JnYig1NSwgMTQyLCAyNDApJ1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICAncG9wb3Zlcic6IHtcbiAgICAgICAgICAnZGVmYXVsdCc6IHtcbiAgICAgICAgICAgICdzdGF0ZXMnOiB7XG4gICAgICAgICAgICAgICdkZWZhdWx0Jzoge1xuICAgICAgICAgICAgICAgICdiYWNrZ3JvdW5kLWNvbG9yJzogJ3JnYigyNTUsIDI1NSwgMjU1KScsXG4gICAgICAgICAgICAgICAgJ2JvcmRlci1jb2xvcic6ICdyZ2IoMjExLCAyMTEsIDIxMSknXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgICdzaWRlbmF2Jzoge1xuICAgICAgICAgICdkZWZhdWx0Jzoge1xuICAgICAgICAgICAgJ3N0YXRlcyc6IHtcbiAgICAgICAgICAgICAgJ2tleS1mb2N1cyc6IHtcbiAgICAgICAgICAgICAgICAnaXRlbS1ib3JkZXItY29sb3InOiAncmdiKDU1LCAxNDIsIDI0MCknXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgICdtdWx0aWxldmVsJzoge1xuICAgICAgICAgICAgJ3N0YXRlcyc6IHtcbiAgICAgICAgICAgICAgJ2tleS1mb2N1cyc6IHtcbiAgICAgICAgICAgICAgICAnaXRlbS1ib3JkZXItY29sb3InOiAncmdiKDU1LCAxNDIsIDI0MCknXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgICd0ZXh0ZmllbGQnOiB7XG4gICAgICAgICAgJ2RlZmF1bHQnOiB7XG4gICAgICAgICAgICAnc3RhdGVzJzoge1xuICAgICAgICAgICAgICAnZGVmYXVsdCc6IHtcbiAgICAgICAgICAgICAgICAnYmFja2dyb3VuZC1jb2xvcic6ICdyZ2IoMjU1LCAyNTUsIDI1NSknLFxuICAgICAgICAgICAgICAgICdib3JkZXItY29sb3InOiAncmdiKDIzNCwgMjM0LCAyMzQpJ1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAnZGlzYWJsZWQnOiB7XG4gICAgICAgICAgICAgICAgJ2JhY2tncm91bmQtY29sb3InOiAncmdiKDI0NCwgMjQ0LCAyNDQpJyxcbiAgICAgICAgICAgICAgICAnYm9yZGVyLWNvbG9yJzogJ3RyYW5zcGFyZW50J1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAnbW91c2UtZm9jdXMnOiB7XG4gICAgICAgICAgICAgICAgJ2JhY2tncm91bmQtY29sb3InOiAncmdiKDI1NSwgMjU1LCAyNTUpJyxcbiAgICAgICAgICAgICAgICAnYm9yZGVyLWNvbG9yJzogJ3JnYigzOCwgMTI4LCAyMzUpJ1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICAncXVpZXQnOiB7XG4gICAgICAgICAgICAnc3RhdGVzJzoge1xuICAgICAgICAgICAgICAnZGVmYXVsdCc6IHtcbiAgICAgICAgICAgICAgICAnYmFja2dyb3VuZC1jb2xvcic6ICd0cmFuc3BhcmVudCcsXG4gICAgICAgICAgICAgICAgJ2JvcmRlci1jb2xvcic6ICdyZ2IoMjM0LCAyMzQsIDIzNCknXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICdkaXNhYmxlZCc6IHtcbiAgICAgICAgICAgICAgICAnYmFja2dyb3VuZC1jb2xvcic6ICd0cmFuc3BhcmVudCcsXG4gICAgICAgICAgICAgICAgJ2JvcmRlci1jb2xvcic6ICdyZ2IoMjM0LCAyMzQsIDIzNCknXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICdtb3VzZS1mb2N1cyc6IHtcbiAgICAgICAgICAgICAgICAnYmFja2dyb3VuZC1jb2xvcic6ICd0cmFuc3BhcmVudCcsXG4gICAgICAgICAgICAgICAgJ2JvcmRlci1jb2xvcic6ICdyZ2IoMzgsIDEyOCwgMjM1KSdcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgJ3Rvb2x0aXAnOiB7XG4gICAgICAgICAgJ2RlZmF1bHQnOiB7XG4gICAgICAgICAgICAnc3RhdGVzJzoge1xuICAgICAgICAgICAgICAnZGVmYXVsdCc6IHtcbiAgICAgICAgICAgICAgICAndGlwLWNvbG9yJzogJ3JnYigxMTYsIDExNiwgMTE2KSdcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgJ2luZm8nOiB7XG4gICAgICAgICAgICAnc3RhdGVzJzoge1xuICAgICAgICAgICAgICAnZGVmYXVsdCc6IHtcbiAgICAgICAgICAgICAgICAndGlwLWNvbG9yJzogJ3JnYigxMywgMTAyLCAyMDgpJ1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICAnbmVnYXRpdmUnOiB7XG4gICAgICAgICAgICAnc3RhdGVzJzoge1xuICAgICAgICAgICAgICAnZGVmYXVsdCc6IHtcbiAgICAgICAgICAgICAgICAndGlwLWNvbG9yJzogJ3JnYigyMDEsIDM3LCA0NSknXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgICdwb3NpdGl2ZSc6IHtcbiAgICAgICAgICAgICdzdGF0ZXMnOiB7XG4gICAgICAgICAgICAgICdkZWZhdWx0Jzoge1xuICAgICAgICAgICAgICAgICd0aXAtY29sb3InOiAncmdiKDE4LCAxMjgsIDkyKSdcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgICdsYXJnZSc6IHtcbiAgICAgICAgJ2NpcmNsZWxvYWRlcic6IHtcbiAgICAgICAgICAnbGFyZ2UnOiB7XG4gICAgICAgICAgICAnc3RhdGVzJzoge1xuICAgICAgICAgICAgICAnZGVmYXVsdCc6IHtcbiAgICAgICAgICAgICAgICAndGV4dC1jb2xvcic6ICdyZ2IoODAsIDgwLCA4MCknLFxuICAgICAgICAgICAgICAgICd0cmFjay1jb2xvcic6ICdyZ2IoMjM0LCAyMzQsIDIzNCknLFxuICAgICAgICAgICAgICAgICd0cmFjay1maWxsLWNvbG9yJzogJ3JnYigzOCwgMTI4LCAyMzUpJ1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ2RpbWVuc2lvbnMnOiB7XG4gICAgICAgICAgICAgICdoZWlnaHQnOiAnODBweCcsXG4gICAgICAgICAgICAgICd3aWR0aCc6ICc4MHB4JyxcbiAgICAgICAgICAgICAgJ2JvcmRlci1zaXplJzogJzVweCdcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgICdsYXJnZS1vdmVyLWJhY2tncm91bmQnOiB7XG4gICAgICAgICAgICAnc3RhdGVzJzoge1xuICAgICAgICAgICAgICAnZGVmYXVsdCc6IHtcbiAgICAgICAgICAgICAgICAndGV4dC1jb2xvcic6ICdyZ2IoMjU1LCAyNTUsIDI1NSknLFxuICAgICAgICAgICAgICAgICd0cmFjay1jb2xvcic6ICdyZ2JhKDI1NSwyNTUsMjU1LDAuMiknLFxuICAgICAgICAgICAgICAgICd0cmFjay1maWxsLWNvbG9yJzogJ3JnYigyNTUsIDI1NSwgMjU1KSdcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdkaW1lbnNpb25zJzoge1xuICAgICAgICAgICAgICAnaGVpZ2h0JzogJzgwcHgnLFxuICAgICAgICAgICAgICAnd2lkdGgnOiAnODBweCcsXG4gICAgICAgICAgICAgICdib3JkZXItc2l6ZSc6ICc1cHgnXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICAnbWVkaXVtJzoge1xuICAgICAgICAgICAgJ3N0YXRlcyc6IHtcbiAgICAgICAgICAgICAgJ2RlZmF1bHQnOiB7XG4gICAgICAgICAgICAgICAgJ3RleHQtY29sb3InOiAncmdiKDgwLCA4MCwgODApJyxcbiAgICAgICAgICAgICAgICAndHJhY2stY29sb3InOiAncmdiKDIzNCwgMjM0LCAyMzQpJyxcbiAgICAgICAgICAgICAgICAndHJhY2stZmlsbC1jb2xvcic6ICdyZ2IoMzgsIDEyOCwgMjM1KSdcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdkaW1lbnNpb25zJzoge1xuICAgICAgICAgICAgICAnaGVpZ2h0JzogJzQwcHgnLFxuICAgICAgICAgICAgICAnd2lkdGgnOiAnNDBweCcsXG4gICAgICAgICAgICAgICdib3JkZXItc2l6ZSc6ICc0cHgnXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICAnbWVkaXVtLW92ZXItYmFja2dyb3VuZCc6IHtcbiAgICAgICAgICAgICdzdGF0ZXMnOiB7XG4gICAgICAgICAgICAgICdkZWZhdWx0Jzoge1xuICAgICAgICAgICAgICAgICd0ZXh0LWNvbG9yJzogJ3JnYigyNTUsIDI1NSwgMjU1KScsXG4gICAgICAgICAgICAgICAgJ3RyYWNrLWNvbG9yJzogJ3JnYmEoMjU1LDI1NSwyNTUsMC4yKScsXG4gICAgICAgICAgICAgICAgJ3RyYWNrLWZpbGwtY29sb3InOiAncmdiKDI1NSwgMjU1LCAyNTUpJ1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ2RpbWVuc2lvbnMnOiB7XG4gICAgICAgICAgICAgICdoZWlnaHQnOiAnNDBweCcsXG4gICAgICAgICAgICAgICd3aWR0aCc6ICc0MHB4JyxcbiAgICAgICAgICAgICAgJ2JvcmRlci1zaXplJzogJzRweCdcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgICdzbWFsbCc6IHtcbiAgICAgICAgICAgICdzdGF0ZXMnOiB7XG4gICAgICAgICAgICAgICdkZWZhdWx0Jzoge1xuICAgICAgICAgICAgICAgICd0ZXh0LWNvbG9yJzogJ3JnYig4MCwgODAsIDgwKScsXG4gICAgICAgICAgICAgICAgJ3RyYWNrLWNvbG9yJzogJ3JnYigyMzQsIDIzNCwgMjM0KScsXG4gICAgICAgICAgICAgICAgJ3RyYWNrLWZpbGwtY29sb3InOiAncmdiKDM4LCAxMjgsIDIzNSknXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnZGltZW5zaW9ucyc6IHtcbiAgICAgICAgICAgICAgJ2hlaWdodCc6ICcyMHB4JyxcbiAgICAgICAgICAgICAgJ3dpZHRoJzogJzIwcHgnLFxuICAgICAgICAgICAgICAnYm9yZGVyLXNpemUnOiAnM3B4J1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgJ3NtYWxsLW92ZXItYmFja2dyb3VuZCc6IHtcbiAgICAgICAgICAgICdzdGF0ZXMnOiB7XG4gICAgICAgICAgICAgICdkZWZhdWx0Jzoge1xuICAgICAgICAgICAgICAgICd0ZXh0LWNvbG9yJzogJ3JnYigyNTUsIDI1NSwgMjU1KScsXG4gICAgICAgICAgICAgICAgJ3RyYWNrLWNvbG9yJzogJ3JnYmEoMjU1LDI1NSwyNTUsMC4yKScsXG4gICAgICAgICAgICAgICAgJ3RyYWNrLWZpbGwtY29sb3InOiAncmdiKDI1NSwgMjU1LCAyNTUpJ1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ2RpbWVuc2lvbnMnOiB7XG4gICAgICAgICAgICAgICdoZWlnaHQnOiAnMjBweCcsXG4gICAgICAgICAgICAgICd3aWR0aCc6ICcyMHB4JyxcbiAgICAgICAgICAgICAgJ2JvcmRlci1zaXplJzogJzNweCdcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgICdjb2FjaG1hcmsnOiB7XG4gICAgICAgICAgJ2RlZmF1bHQnOiB7XG4gICAgICAgICAgICAnZGltZW5zaW9ucyc6IHtcbiAgICAgICAgICAgICAgJ2luZGljYXRvci1yaW5nLWJvcmRlci1zaXplJzogJzJweCcsXG4gICAgICAgICAgICAgICdhbmltYXRpb24taW5kaWNhdG9yLXJpbmctZHVyYXRpb24nOiAnMzAwMG1zJyxcbiAgICAgICAgICAgICAgJ2FuaW1hdGlvbi1pbmRpY2F0b3Ita2V5ZnJhbWUtNTAtb3BhY2l0eSc6ICcwLjYnLFxuICAgICAgICAgICAgICAnaW5kaWNhdG9yLXJpbmctZGlhbWV0ZXInOiAnMjBweCdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnc3RhdGVzJzoge1xuICAgICAgICAgICAgICAnZGVmYXVsdCc6IHtcbiAgICAgICAgICAgICAgICAnaW5kaWNhdG9yLXJpbmctZGVmYXVsdC1jb2xvcic6ICdyZ2IoNTUsIDE0MiwgMjQwKSdcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgJ3F1aWV0Jzoge1xuICAgICAgICAgICAgJ2RpbWVuc2lvbnMnOiB7XG4gICAgICAgICAgICAgICdpbmRpY2F0b3ItcmluZy1ib3JkZXItc2l6ZSc6ICcycHgnLFxuICAgICAgICAgICAgICAnYW5pbWF0aW9uLWluZGljYXRvci1yaW5nLWR1cmF0aW9uJzogJzMwMDBtcycsXG4gICAgICAgICAgICAgICdhbmltYXRpb24taW5kaWNhdG9yLWtleWZyYW1lLTUwLW9wYWNpdHknOiAnMC42JyxcbiAgICAgICAgICAgICAgJ2luZGljYXRvci1yaW5nLWRpYW1ldGVyJzogJzEwcHgnXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ3N0YXRlcyc6IHtcbiAgICAgICAgICAgICAgJ2RlZmF1bHQnOiB7XG4gICAgICAgICAgICAgICAgJ2luZGljYXRvci1yaW5nLWRlZmF1bHQtY29sb3InOiAncmdiKDU1LCAxNDIsIDI0MCknXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgICdwb3BvdmVyJzoge1xuICAgICAgICAgICdkZWZhdWx0Jzoge1xuICAgICAgICAgICAgJ3N0YXRlcyc6IHtcbiAgICAgICAgICAgICAgJ2RlZmF1bHQnOiB7XG4gICAgICAgICAgICAgICAgJ2JhY2tncm91bmQtY29sb3InOiAncmdiKDI1NSwgMjU1LCAyNTUpJyxcbiAgICAgICAgICAgICAgICAnYm9yZGVyLWNvbG9yJzogJ3JnYigyMTEsIDIxMSwgMjExKSdcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgJ3NpZGVuYXYnOiB7XG4gICAgICAgICAgJ2RlZmF1bHQnOiB7XG4gICAgICAgICAgICAnc3RhdGVzJzoge1xuICAgICAgICAgICAgICAna2V5LWZvY3VzJzoge1xuICAgICAgICAgICAgICAgICdpdGVtLWJvcmRlci1jb2xvcic6ICdyZ2IoNTUsIDE0MiwgMjQwKSdcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgJ211bHRpbGV2ZWwnOiB7XG4gICAgICAgICAgICAnc3RhdGVzJzoge1xuICAgICAgICAgICAgICAna2V5LWZvY3VzJzoge1xuICAgICAgICAgICAgICAgICdpdGVtLWJvcmRlci1jb2xvcic6ICdyZ2IoNTUsIDE0MiwgMjQwKSdcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgJ3RleHRmaWVsZCc6IHtcbiAgICAgICAgICAnZGVmYXVsdCc6IHtcbiAgICAgICAgICAgICdzdGF0ZXMnOiB7XG4gICAgICAgICAgICAgICdkZWZhdWx0Jzoge1xuICAgICAgICAgICAgICAgICdiYWNrZ3JvdW5kLWNvbG9yJzogJ3JnYigyNTUsIDI1NSwgMjU1KScsXG4gICAgICAgICAgICAgICAgJ2JvcmRlci1jb2xvcic6ICdyZ2IoMjM0LCAyMzQsIDIzNCknXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICdkaXNhYmxlZCc6IHtcbiAgICAgICAgICAgICAgICAnYmFja2dyb3VuZC1jb2xvcic6ICdyZ2IoMjQ0LCAyNDQsIDI0NCknLFxuICAgICAgICAgICAgICAgICdib3JkZXItY29sb3InOiAndHJhbnNwYXJlbnQnXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICdtb3VzZS1mb2N1cyc6IHtcbiAgICAgICAgICAgICAgICAnYmFja2dyb3VuZC1jb2xvcic6ICdyZ2IoMjU1LCAyNTUsIDI1NSknLFxuICAgICAgICAgICAgICAgICdib3JkZXItY29sb3InOiAncmdiKDM4LCAxMjgsIDIzNSknXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgICdxdWlldCc6IHtcbiAgICAgICAgICAgICdzdGF0ZXMnOiB7XG4gICAgICAgICAgICAgICdkZWZhdWx0Jzoge1xuICAgICAgICAgICAgICAgICdiYWNrZ3JvdW5kLWNvbG9yJzogJ3RyYW5zcGFyZW50JyxcbiAgICAgICAgICAgICAgICAnYm9yZGVyLWNvbG9yJzogJ3JnYigyMzQsIDIzNCwgMjM0KSdcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgJ2Rpc2FibGVkJzoge1xuICAgICAgICAgICAgICAgICdiYWNrZ3JvdW5kLWNvbG9yJzogJ3RyYW5zcGFyZW50JyxcbiAgICAgICAgICAgICAgICAnYm9yZGVyLWNvbG9yJzogJ3JnYigyMzQsIDIzNCwgMjM0KSdcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgJ21vdXNlLWZvY3VzJzoge1xuICAgICAgICAgICAgICAgICdiYWNrZ3JvdW5kLWNvbG9yJzogJ3RyYW5zcGFyZW50JyxcbiAgICAgICAgICAgICAgICAnYm9yZGVyLWNvbG9yJzogJ3JnYigzOCwgMTI4LCAyMzUpJ1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICAndG9vbHRpcCc6IHtcbiAgICAgICAgICAnZGVmYXVsdCc6IHtcbiAgICAgICAgICAgICdzdGF0ZXMnOiB7XG4gICAgICAgICAgICAgICdkZWZhdWx0Jzoge1xuICAgICAgICAgICAgICAgICd0aXAtY29sb3InOiAncmdiKDExNiwgMTE2LCAxMTYpJ1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICAnaW5mbyc6IHtcbiAgICAgICAgICAgICdzdGF0ZXMnOiB7XG4gICAgICAgICAgICAgICdkZWZhdWx0Jzoge1xuICAgICAgICAgICAgICAgICd0aXAtY29sb3InOiAncmdiKDEzLCAxMDIsIDIwOCknXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgICduZWdhdGl2ZSc6IHtcbiAgICAgICAgICAgICdzdGF0ZXMnOiB7XG4gICAgICAgICAgICAgICdkZWZhdWx0Jzoge1xuICAgICAgICAgICAgICAgICd0aXAtY29sb3InOiAncmdiKDIwMSwgMzcsIDQ1KSdcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgJ3Bvc2l0aXZlJzoge1xuICAgICAgICAgICAgJ3N0YXRlcyc6IHtcbiAgICAgICAgICAgICAgJ2RlZmF1bHQnOiB7XG4gICAgICAgICAgICAgICAgJ3RpcC1jb2xvcic6ICdyZ2IoMTgsIDEyOCwgOTIpJ1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICAnbGlnaHQnOiB7XG4gICAgICAnbWVkaXVtJzoge1xuICAgICAgICAnY2lyY2xlbG9hZGVyJzoge1xuICAgICAgICAgICdsYXJnZSc6IHtcbiAgICAgICAgICAgICdzdGF0ZXMnOiB7XG4gICAgICAgICAgICAgICdkZWZhdWx0Jzoge1xuICAgICAgICAgICAgICAgICd0ZXh0LWNvbG9yJzogJ3JnYig3NSwgNzUsIDc1KScsXG4gICAgICAgICAgICAgICAgJ3RyYWNrLWNvbG9yJzogJ3JnYigyMjUsIDIyNSwgMjI1KScsXG4gICAgICAgICAgICAgICAgJ3RyYWNrLWZpbGwtY29sb3InOiAncmdiKDIwLCAxMTUsIDIzMCknXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnZGltZW5zaW9ucyc6IHtcbiAgICAgICAgICAgICAgJ2hlaWdodCc6ICc2NHB4JyxcbiAgICAgICAgICAgICAgJ3dpZHRoJzogJzY0cHgnLFxuICAgICAgICAgICAgICAnYm9yZGVyLXNpemUnOiAnNHB4J1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgJ2xhcmdlLW92ZXItYmFja2dyb3VuZCc6IHtcbiAgICAgICAgICAgICdzdGF0ZXMnOiB7XG4gICAgICAgICAgICAgICdkZWZhdWx0Jzoge1xuICAgICAgICAgICAgICAgICd0ZXh0LWNvbG9yJzogJ3JnYigyNTUsIDI1NSwgMjU1KScsXG4gICAgICAgICAgICAgICAgJ3RyYWNrLWNvbG9yJzogJ3JnYmEoMjU1LDI1NSwyNTUsMC4yKScsXG4gICAgICAgICAgICAgICAgJ3RyYWNrLWZpbGwtY29sb3InOiAncmdiKDI1NSwgMjU1LCAyNTUpJ1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ2RpbWVuc2lvbnMnOiB7XG4gICAgICAgICAgICAgICdoZWlnaHQnOiAnNjRweCcsXG4gICAgICAgICAgICAgICd3aWR0aCc6ICc2NHB4JyxcbiAgICAgICAgICAgICAgJ2JvcmRlci1zaXplJzogJzRweCdcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgICdtZWRpdW0nOiB7XG4gICAgICAgICAgICAnc3RhdGVzJzoge1xuICAgICAgICAgICAgICAnZGVmYXVsdCc6IHtcbiAgICAgICAgICAgICAgICAndGV4dC1jb2xvcic6ICdyZ2IoNzUsIDc1LCA3NSknLFxuICAgICAgICAgICAgICAgICd0cmFjay1jb2xvcic6ICdyZ2IoMjI1LCAyMjUsIDIyNSknLFxuICAgICAgICAgICAgICAgICd0cmFjay1maWxsLWNvbG9yJzogJ3JnYigyMCwgMTE1LCAyMzApJ1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ2RpbWVuc2lvbnMnOiB7XG4gICAgICAgICAgICAgICdoZWlnaHQnOiAnMzJweCcsXG4gICAgICAgICAgICAgICd3aWR0aCc6ICczMnB4JyxcbiAgICAgICAgICAgICAgJ2JvcmRlci1zaXplJzogJzNweCdcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgICdtZWRpdW0tb3Zlci1iYWNrZ3JvdW5kJzoge1xuICAgICAgICAgICAgJ3N0YXRlcyc6IHtcbiAgICAgICAgICAgICAgJ2RlZmF1bHQnOiB7XG4gICAgICAgICAgICAgICAgJ3RleHQtY29sb3InOiAncmdiKDI1NSwgMjU1LCAyNTUpJyxcbiAgICAgICAgICAgICAgICAndHJhY2stY29sb3InOiAncmdiYSgyNTUsMjU1LDI1NSwwLjIpJyxcbiAgICAgICAgICAgICAgICAndHJhY2stZmlsbC1jb2xvcic6ICdyZ2IoMjU1LCAyNTUsIDI1NSknXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnZGltZW5zaW9ucyc6IHtcbiAgICAgICAgICAgICAgJ2hlaWdodCc6ICczMnB4JyxcbiAgICAgICAgICAgICAgJ3dpZHRoJzogJzMycHgnLFxuICAgICAgICAgICAgICAnYm9yZGVyLXNpemUnOiAnM3B4J1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgJ3NtYWxsJzoge1xuICAgICAgICAgICAgJ3N0YXRlcyc6IHtcbiAgICAgICAgICAgICAgJ2RlZmF1bHQnOiB7XG4gICAgICAgICAgICAgICAgJ3RleHQtY29sb3InOiAncmdiKDc1LCA3NSwgNzUpJyxcbiAgICAgICAgICAgICAgICAndHJhY2stY29sb3InOiAncmdiKDIyNSwgMjI1LCAyMjUpJyxcbiAgICAgICAgICAgICAgICAndHJhY2stZmlsbC1jb2xvcic6ICdyZ2IoMjAsIDExNSwgMjMwKSdcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdkaW1lbnNpb25zJzoge1xuICAgICAgICAgICAgICAnaGVpZ2h0JzogJzE2cHgnLFxuICAgICAgICAgICAgICAnd2lkdGgnOiAnMTZweCcsXG4gICAgICAgICAgICAgICdib3JkZXItc2l6ZSc6ICcycHgnXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICAnc21hbGwtb3Zlci1iYWNrZ3JvdW5kJzoge1xuICAgICAgICAgICAgJ3N0YXRlcyc6IHtcbiAgICAgICAgICAgICAgJ2RlZmF1bHQnOiB7XG4gICAgICAgICAgICAgICAgJ3RleHQtY29sb3InOiAncmdiKDI1NSwgMjU1LCAyNTUpJyxcbiAgICAgICAgICAgICAgICAndHJhY2stY29sb3InOiAncmdiYSgyNTUsMjU1LDI1NSwwLjIpJyxcbiAgICAgICAgICAgICAgICAndHJhY2stZmlsbC1jb2xvcic6ICdyZ2IoMjU1LCAyNTUsIDI1NSknXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnZGltZW5zaW9ucyc6IHtcbiAgICAgICAgICAgICAgJ2hlaWdodCc6ICcxNnB4JyxcbiAgICAgICAgICAgICAgJ3dpZHRoJzogJzE2cHgnLFxuICAgICAgICAgICAgICAnYm9yZGVyLXNpemUnOiAnMnB4J1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgJ2NvYWNobWFyayc6IHtcbiAgICAgICAgICAnZGVmYXVsdCc6IHtcbiAgICAgICAgICAgICdkaW1lbnNpb25zJzoge1xuICAgICAgICAgICAgICAnaW5kaWNhdG9yLXJpbmctYm9yZGVyLXNpemUnOiAnMnB4JyxcbiAgICAgICAgICAgICAgJ2FuaW1hdGlvbi1pbmRpY2F0b3ItcmluZy1kdXJhdGlvbic6ICczMDAwbXMnLFxuICAgICAgICAgICAgICAnYW5pbWF0aW9uLWluZGljYXRvci1rZXlmcmFtZS01MC1vcGFjaXR5JzogJzAuNicsXG4gICAgICAgICAgICAgICdpbmRpY2F0b3ItcmluZy1kaWFtZXRlcic6ICcxNnB4J1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdzdGF0ZXMnOiB7XG4gICAgICAgICAgICAgICdkZWZhdWx0Jzoge1xuICAgICAgICAgICAgICAgICdpbmRpY2F0b3ItcmluZy1kZWZhdWx0LWNvbG9yJzogJ3JnYigzOCwgMTI4LCAyMzUpJ1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICAncXVpZXQnOiB7XG4gICAgICAgICAgICAnZGltZW5zaW9ucyc6IHtcbiAgICAgICAgICAgICAgJ2luZGljYXRvci1yaW5nLWJvcmRlci1zaXplJzogJzJweCcsXG4gICAgICAgICAgICAgICdhbmltYXRpb24taW5kaWNhdG9yLXJpbmctZHVyYXRpb24nOiAnMzAwMG1zJyxcbiAgICAgICAgICAgICAgJ2FuaW1hdGlvbi1pbmRpY2F0b3Ita2V5ZnJhbWUtNTAtb3BhY2l0eSc6ICcwLjYnLFxuICAgICAgICAgICAgICAnaW5kaWNhdG9yLXJpbmctZGlhbWV0ZXInOiAnOHB4J1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdzdGF0ZXMnOiB7XG4gICAgICAgICAgICAgICdkZWZhdWx0Jzoge1xuICAgICAgICAgICAgICAgICdpbmRpY2F0b3ItcmluZy1kZWZhdWx0LWNvbG9yJzogJ3JnYigzOCwgMTI4LCAyMzUpJ1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICAncG9wb3Zlcic6IHtcbiAgICAgICAgICAnZGVmYXVsdCc6IHtcbiAgICAgICAgICAgICdzdGF0ZXMnOiB7XG4gICAgICAgICAgICAgICdkZWZhdWx0Jzoge1xuICAgICAgICAgICAgICAgICdiYWNrZ3JvdW5kLWNvbG9yJzogJ3JnYigyNTUsIDI1NSwgMjU1KScsXG4gICAgICAgICAgICAgICAgJ2JvcmRlci1jb2xvcic6ICdyZ2IoMjAyLCAyMDIsIDIwMiknXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgICdzaWRlbmF2Jzoge1xuICAgICAgICAgICdkZWZhdWx0Jzoge1xuICAgICAgICAgICAgJ3N0YXRlcyc6IHtcbiAgICAgICAgICAgICAgJ2tleS1mb2N1cyc6IHtcbiAgICAgICAgICAgICAgICAnaXRlbS1ib3JkZXItY29sb3InOiAncmdiKDM4LCAxMjgsIDIzNSknXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgICdtdWx0aWxldmVsJzoge1xuICAgICAgICAgICAgJ3N0YXRlcyc6IHtcbiAgICAgICAgICAgICAgJ2tleS1mb2N1cyc6IHtcbiAgICAgICAgICAgICAgICAnaXRlbS1ib3JkZXItY29sb3InOiAncmdiKDM4LCAxMjgsIDIzNSknXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgICd0ZXh0ZmllbGQnOiB7XG4gICAgICAgICAgJ2RlZmF1bHQnOiB7XG4gICAgICAgICAgICAnc3RhdGVzJzoge1xuICAgICAgICAgICAgICAnZGVmYXVsdCc6IHtcbiAgICAgICAgICAgICAgICAnYmFja2dyb3VuZC1jb2xvcic6ICdyZ2IoMjU1LCAyNTUsIDI1NSknLFxuICAgICAgICAgICAgICAgICdib3JkZXItY29sb3InOiAncmdiKDIyNSwgMjI1LCAyMjUpJ1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAnZGlzYWJsZWQnOiB7XG4gICAgICAgICAgICAgICAgJ2JhY2tncm91bmQtY29sb3InOiAncmdiKDIzNCwgMjM0LCAyMzQpJyxcbiAgICAgICAgICAgICAgICAnYm9yZGVyLWNvbG9yJzogJ3RyYW5zcGFyZW50J1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAnbW91c2UtZm9jdXMnOiB7XG4gICAgICAgICAgICAgICAgJ2JhY2tncm91bmQtY29sb3InOiAncmdiKDI1NSwgMjU1LCAyNTUpJyxcbiAgICAgICAgICAgICAgICAnYm9yZGVyLWNvbG9yJzogJ3JnYigyMCwgMTE1LCAyMzApJ1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICAncXVpZXQnOiB7XG4gICAgICAgICAgICAnc3RhdGVzJzoge1xuICAgICAgICAgICAgICAnZGVmYXVsdCc6IHtcbiAgICAgICAgICAgICAgICAnYmFja2dyb3VuZC1jb2xvcic6ICd0cmFuc3BhcmVudCcsXG4gICAgICAgICAgICAgICAgJ2JvcmRlci1jb2xvcic6ICdyZ2IoMjI1LCAyMjUsIDIyNSknXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICdkaXNhYmxlZCc6IHtcbiAgICAgICAgICAgICAgICAnYmFja2dyb3VuZC1jb2xvcic6ICd0cmFuc3BhcmVudCcsXG4gICAgICAgICAgICAgICAgJ2JvcmRlci1jb2xvcic6ICdyZ2IoMjI1LCAyMjUsIDIyNSknXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICdtb3VzZS1mb2N1cyc6IHtcbiAgICAgICAgICAgICAgICAnYmFja2dyb3VuZC1jb2xvcic6ICd0cmFuc3BhcmVudCcsXG4gICAgICAgICAgICAgICAgJ2JvcmRlci1jb2xvcic6ICdyZ2IoMjAsIDExNSwgMjMwKSdcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgJ3Rvb2x0aXAnOiB7XG4gICAgICAgICAgJ2RlZmF1bHQnOiB7XG4gICAgICAgICAgICAnc3RhdGVzJzoge1xuICAgICAgICAgICAgICAnZGVmYXVsdCc6IHtcbiAgICAgICAgICAgICAgICAndGlwLWNvbG9yJzogJ3JnYigxMTYsIDExNiwgMTE2KSdcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgJ2luZm8nOiB7XG4gICAgICAgICAgICAnc3RhdGVzJzoge1xuICAgICAgICAgICAgICAnZGVmYXVsdCc6IHtcbiAgICAgICAgICAgICAgICAndGlwLWNvbG9yJzogJ3JnYigxMywgMTAyLCAyMDgpJ1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICAnbmVnYXRpdmUnOiB7XG4gICAgICAgICAgICAnc3RhdGVzJzoge1xuICAgICAgICAgICAgICAnZGVmYXVsdCc6IHtcbiAgICAgICAgICAgICAgICAndGlwLWNvbG9yJzogJ3JnYigyMDEsIDM3LCA0NSknXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgICdwb3NpdGl2ZSc6IHtcbiAgICAgICAgICAgICdzdGF0ZXMnOiB7XG4gICAgICAgICAgICAgICdkZWZhdWx0Jzoge1xuICAgICAgICAgICAgICAgICd0aXAtY29sb3InOiAncmdiKDE4LCAxMjgsIDkyKSdcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgICdsYXJnZSc6IHtcbiAgICAgICAgJ2NpcmNsZWxvYWRlcic6IHtcbiAgICAgICAgICAnbGFyZ2UnOiB7XG4gICAgICAgICAgICAnc3RhdGVzJzoge1xuICAgICAgICAgICAgICAnZGVmYXVsdCc6IHtcbiAgICAgICAgICAgICAgICAndGV4dC1jb2xvcic6ICdyZ2IoNzUsIDc1LCA3NSknLFxuICAgICAgICAgICAgICAgICd0cmFjay1jb2xvcic6ICdyZ2IoMjI1LCAyMjUsIDIyNSknLFxuICAgICAgICAgICAgICAgICd0cmFjay1maWxsLWNvbG9yJzogJ3JnYigyMCwgMTE1LCAyMzApJ1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ2RpbWVuc2lvbnMnOiB7XG4gICAgICAgICAgICAgICdoZWlnaHQnOiAnODBweCcsXG4gICAgICAgICAgICAgICd3aWR0aCc6ICc4MHB4JyxcbiAgICAgICAgICAgICAgJ2JvcmRlci1zaXplJzogJzVweCdcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgICdsYXJnZS1vdmVyLWJhY2tncm91bmQnOiB7XG4gICAgICAgICAgICAnc3RhdGVzJzoge1xuICAgICAgICAgICAgICAnZGVmYXVsdCc6IHtcbiAgICAgICAgICAgICAgICAndGV4dC1jb2xvcic6ICdyZ2IoMjU1LCAyNTUsIDI1NSknLFxuICAgICAgICAgICAgICAgICd0cmFjay1jb2xvcic6ICdyZ2JhKDI1NSwyNTUsMjU1LDAuMiknLFxuICAgICAgICAgICAgICAgICd0cmFjay1maWxsLWNvbG9yJzogJ3JnYigyNTUsIDI1NSwgMjU1KSdcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdkaW1lbnNpb25zJzoge1xuICAgICAgICAgICAgICAnaGVpZ2h0JzogJzgwcHgnLFxuICAgICAgICAgICAgICAnd2lkdGgnOiAnODBweCcsXG4gICAgICAgICAgICAgICdib3JkZXItc2l6ZSc6ICc1cHgnXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICAnbWVkaXVtJzoge1xuICAgICAgICAgICAgJ3N0YXRlcyc6IHtcbiAgICAgICAgICAgICAgJ2RlZmF1bHQnOiB7XG4gICAgICAgICAgICAgICAgJ3RleHQtY29sb3InOiAncmdiKDc1LCA3NSwgNzUpJyxcbiAgICAgICAgICAgICAgICAndHJhY2stY29sb3InOiAncmdiKDIyNSwgMjI1LCAyMjUpJyxcbiAgICAgICAgICAgICAgICAndHJhY2stZmlsbC1jb2xvcic6ICdyZ2IoMjAsIDExNSwgMjMwKSdcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdkaW1lbnNpb25zJzoge1xuICAgICAgICAgICAgICAnaGVpZ2h0JzogJzQwcHgnLFxuICAgICAgICAgICAgICAnd2lkdGgnOiAnNDBweCcsXG4gICAgICAgICAgICAgICdib3JkZXItc2l6ZSc6ICc0cHgnXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICAnbWVkaXVtLW92ZXItYmFja2dyb3VuZCc6IHtcbiAgICAgICAgICAgICdzdGF0ZXMnOiB7XG4gICAgICAgICAgICAgICdkZWZhdWx0Jzoge1xuICAgICAgICAgICAgICAgICd0ZXh0LWNvbG9yJzogJ3JnYigyNTUsIDI1NSwgMjU1KScsXG4gICAgICAgICAgICAgICAgJ3RyYWNrLWNvbG9yJzogJ3JnYmEoMjU1LDI1NSwyNTUsMC4yKScsXG4gICAgICAgICAgICAgICAgJ3RyYWNrLWZpbGwtY29sb3InOiAncmdiKDI1NSwgMjU1LCAyNTUpJ1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ2RpbWVuc2lvbnMnOiB7XG4gICAgICAgICAgICAgICdoZWlnaHQnOiAnNDBweCcsXG4gICAgICAgICAgICAgICd3aWR0aCc6ICc0MHB4JyxcbiAgICAgICAgICAgICAgJ2JvcmRlci1zaXplJzogJzRweCdcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgICdzbWFsbCc6IHtcbiAgICAgICAgICAgICdzdGF0ZXMnOiB7XG4gICAgICAgICAgICAgICdkZWZhdWx0Jzoge1xuICAgICAgICAgICAgICAgICd0ZXh0LWNvbG9yJzogJ3JnYig3NSwgNzUsIDc1KScsXG4gICAgICAgICAgICAgICAgJ3RyYWNrLWNvbG9yJzogJ3JnYigyMjUsIDIyNSwgMjI1KScsXG4gICAgICAgICAgICAgICAgJ3RyYWNrLWZpbGwtY29sb3InOiAncmdiKDIwLCAxMTUsIDIzMCknXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnZGltZW5zaW9ucyc6IHtcbiAgICAgICAgICAgICAgJ2hlaWdodCc6ICcyMHB4JyxcbiAgICAgICAgICAgICAgJ3dpZHRoJzogJzIwcHgnLFxuICAgICAgICAgICAgICAnYm9yZGVyLXNpemUnOiAnM3B4J1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgJ3NtYWxsLW92ZXItYmFja2dyb3VuZCc6IHtcbiAgICAgICAgICAgICdzdGF0ZXMnOiB7XG4gICAgICAgICAgICAgICdkZWZhdWx0Jzoge1xuICAgICAgICAgICAgICAgICd0ZXh0LWNvbG9yJzogJ3JnYigyNTUsIDI1NSwgMjU1KScsXG4gICAgICAgICAgICAgICAgJ3RyYWNrLWNvbG9yJzogJ3JnYmEoMjU1LDI1NSwyNTUsMC4yKScsXG4gICAgICAgICAgICAgICAgJ3RyYWNrLWZpbGwtY29sb3InOiAncmdiKDI1NSwgMjU1LCAyNTUpJ1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ2RpbWVuc2lvbnMnOiB7XG4gICAgICAgICAgICAgICdoZWlnaHQnOiAnMjBweCcsXG4gICAgICAgICAgICAgICd3aWR0aCc6ICcyMHB4JyxcbiAgICAgICAgICAgICAgJ2JvcmRlci1zaXplJzogJzNweCdcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgICdjb2FjaG1hcmsnOiB7XG4gICAgICAgICAgJ2RlZmF1bHQnOiB7XG4gICAgICAgICAgICAnZGltZW5zaW9ucyc6IHtcbiAgICAgICAgICAgICAgJ2luZGljYXRvci1yaW5nLWJvcmRlci1zaXplJzogJzJweCcsXG4gICAgICAgICAgICAgICdhbmltYXRpb24taW5kaWNhdG9yLXJpbmctZHVyYXRpb24nOiAnMzAwMG1zJyxcbiAgICAgICAgICAgICAgJ2FuaW1hdGlvbi1pbmRpY2F0b3Ita2V5ZnJhbWUtNTAtb3BhY2l0eSc6ICcwLjYnLFxuICAgICAgICAgICAgICAnaW5kaWNhdG9yLXJpbmctZGlhbWV0ZXInOiAnMjBweCdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnc3RhdGVzJzoge1xuICAgICAgICAgICAgICAnZGVmYXVsdCc6IHtcbiAgICAgICAgICAgICAgICAnaW5kaWNhdG9yLXJpbmctZGVmYXVsdC1jb2xvcic6ICdyZ2IoMzgsIDEyOCwgMjM1KSdcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgJ3F1aWV0Jzoge1xuICAgICAgICAgICAgJ2RpbWVuc2lvbnMnOiB7XG4gICAgICAgICAgICAgICdpbmRpY2F0b3ItcmluZy1ib3JkZXItc2l6ZSc6ICcycHgnLFxuICAgICAgICAgICAgICAnYW5pbWF0aW9uLWluZGljYXRvci1yaW5nLWR1cmF0aW9uJzogJzMwMDBtcycsXG4gICAgICAgICAgICAgICdhbmltYXRpb24taW5kaWNhdG9yLWtleWZyYW1lLTUwLW9wYWNpdHknOiAnMC42JyxcbiAgICAgICAgICAgICAgJ2luZGljYXRvci1yaW5nLWRpYW1ldGVyJzogJzEwcHgnXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ3N0YXRlcyc6IHtcbiAgICAgICAgICAgICAgJ2RlZmF1bHQnOiB7XG4gICAgICAgICAgICAgICAgJ2luZGljYXRvci1yaW5nLWRlZmF1bHQtY29sb3InOiAncmdiKDM4LCAxMjgsIDIzNSknXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgICdwb3BvdmVyJzoge1xuICAgICAgICAgICdkZWZhdWx0Jzoge1xuICAgICAgICAgICAgJ3N0YXRlcyc6IHtcbiAgICAgICAgICAgICAgJ2RlZmF1bHQnOiB7XG4gICAgICAgICAgICAgICAgJ2JhY2tncm91bmQtY29sb3InOiAncmdiKDI1NSwgMjU1LCAyNTUpJyxcbiAgICAgICAgICAgICAgICAnYm9yZGVyLWNvbG9yJzogJ3JnYigyMDIsIDIwMiwgMjAyKSdcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgJ3NpZGVuYXYnOiB7XG4gICAgICAgICAgJ2RlZmF1bHQnOiB7XG4gICAgICAgICAgICAnc3RhdGVzJzoge1xuICAgICAgICAgICAgICAna2V5LWZvY3VzJzoge1xuICAgICAgICAgICAgICAgICdpdGVtLWJvcmRlci1jb2xvcic6ICdyZ2IoMzgsIDEyOCwgMjM1KSdcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgJ211bHRpbGV2ZWwnOiB7XG4gICAgICAgICAgICAnc3RhdGVzJzoge1xuICAgICAgICAgICAgICAna2V5LWZvY3VzJzoge1xuICAgICAgICAgICAgICAgICdpdGVtLWJvcmRlci1jb2xvcic6ICdyZ2IoMzgsIDEyOCwgMjM1KSdcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgJ3RleHRmaWVsZCc6IHtcbiAgICAgICAgICAnZGVmYXVsdCc6IHtcbiAgICAgICAgICAgICdzdGF0ZXMnOiB7XG4gICAgICAgICAgICAgICdkZWZhdWx0Jzoge1xuICAgICAgICAgICAgICAgICdiYWNrZ3JvdW5kLWNvbG9yJzogJ3JnYigyNTUsIDI1NSwgMjU1KScsXG4gICAgICAgICAgICAgICAgJ2JvcmRlci1jb2xvcic6ICdyZ2IoMjI1LCAyMjUsIDIyNSknXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICdkaXNhYmxlZCc6IHtcbiAgICAgICAgICAgICAgICAnYmFja2dyb3VuZC1jb2xvcic6ICdyZ2IoMjM0LCAyMzQsIDIzNCknLFxuICAgICAgICAgICAgICAgICdib3JkZXItY29sb3InOiAndHJhbnNwYXJlbnQnXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICdtb3VzZS1mb2N1cyc6IHtcbiAgICAgICAgICAgICAgICAnYmFja2dyb3VuZC1jb2xvcic6ICdyZ2IoMjU1LCAyNTUsIDI1NSknLFxuICAgICAgICAgICAgICAgICdib3JkZXItY29sb3InOiAncmdiKDIwLCAxMTUsIDIzMCknXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgICdxdWlldCc6IHtcbiAgICAgICAgICAgICdzdGF0ZXMnOiB7XG4gICAgICAgICAgICAgICdkZWZhdWx0Jzoge1xuICAgICAgICAgICAgICAgICdiYWNrZ3JvdW5kLWNvbG9yJzogJ3RyYW5zcGFyZW50JyxcbiAgICAgICAgICAgICAgICAnYm9yZGVyLWNvbG9yJzogJ3JnYigyMjUsIDIyNSwgMjI1KSdcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgJ2Rpc2FibGVkJzoge1xuICAgICAgICAgICAgICAgICdiYWNrZ3JvdW5kLWNvbG9yJzogJ3RyYW5zcGFyZW50JyxcbiAgICAgICAgICAgICAgICAnYm9yZGVyLWNvbG9yJzogJ3JnYigyMjUsIDIyNSwgMjI1KSdcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgJ21vdXNlLWZvY3VzJzoge1xuICAgICAgICAgICAgICAgICdiYWNrZ3JvdW5kLWNvbG9yJzogJ3RyYW5zcGFyZW50JyxcbiAgICAgICAgICAgICAgICAnYm9yZGVyLWNvbG9yJzogJ3JnYigyMCwgMTE1LCAyMzApJ1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICAndG9vbHRpcCc6IHtcbiAgICAgICAgICAnZGVmYXVsdCc6IHtcbiAgICAgICAgICAgICdzdGF0ZXMnOiB7XG4gICAgICAgICAgICAgICdkZWZhdWx0Jzoge1xuICAgICAgICAgICAgICAgICd0aXAtY29sb3InOiAncmdiKDExNiwgMTE2LCAxMTYpJ1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICAnaW5mbyc6IHtcbiAgICAgICAgICAgICdzdGF0ZXMnOiB7XG4gICAgICAgICAgICAgICdkZWZhdWx0Jzoge1xuICAgICAgICAgICAgICAgICd0aXAtY29sb3InOiAncmdiKDEzLCAxMDIsIDIwOCknXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgICduZWdhdGl2ZSc6IHtcbiAgICAgICAgICAgICdzdGF0ZXMnOiB7XG4gICAgICAgICAgICAgICdkZWZhdWx0Jzoge1xuICAgICAgICAgICAgICAgICd0aXAtY29sb3InOiAncmdiKDIwMSwgMzcsIDQ1KSdcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgJ3Bvc2l0aXZlJzoge1xuICAgICAgICAgICAgJ3N0YXRlcyc6IHtcbiAgICAgICAgICAgICAgJ2RlZmF1bHQnOiB7XG4gICAgICAgICAgICAgICAgJ3RpcC1jb2xvcic6ICdyZ2IoMTgsIDEyOCwgOTIpJ1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICAnZGFyayc6IHtcbiAgICAgICdtZWRpdW0nOiB7XG4gICAgICAgICdjaXJjbGVsb2FkZXInOiB7XG4gICAgICAgICAgJ2xhcmdlJzoge1xuICAgICAgICAgICAgJ3N0YXRlcyc6IHtcbiAgICAgICAgICAgICAgJ2RlZmF1bHQnOiB7XG4gICAgICAgICAgICAgICAgJ3RleHQtY29sb3InOiAncmdiKDIyNywgMjI3LCAyMjcpJyxcbiAgICAgICAgICAgICAgICAndHJhY2stY29sb3InOiAncmdiKDc0LCA3NCwgNzQpJyxcbiAgICAgICAgICAgICAgICAndHJhY2stZmlsbC1jb2xvcic6ICdyZ2IoNTUsIDE0MiwgMjQwKSdcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdkaW1lbnNpb25zJzoge1xuICAgICAgICAgICAgICAnaGVpZ2h0JzogJzY0cHgnLFxuICAgICAgICAgICAgICAnd2lkdGgnOiAnNjRweCcsXG4gICAgICAgICAgICAgICdib3JkZXItc2l6ZSc6ICc0cHgnXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICAnbGFyZ2Utb3Zlci1iYWNrZ3JvdW5kJzoge1xuICAgICAgICAgICAgJ3N0YXRlcyc6IHtcbiAgICAgICAgICAgICAgJ2RlZmF1bHQnOiB7XG4gICAgICAgICAgICAgICAgJ3RleHQtY29sb3InOiAncmdiKDI1NSwgMjU1LCAyNTUpJyxcbiAgICAgICAgICAgICAgICAndHJhY2stY29sb3InOiAncmdiYSgyNTUsMjU1LDI1NSwwLjIpJyxcbiAgICAgICAgICAgICAgICAndHJhY2stZmlsbC1jb2xvcic6ICdyZ2IoMjU1LCAyNTUsIDI1NSknXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnZGltZW5zaW9ucyc6IHtcbiAgICAgICAgICAgICAgJ2hlaWdodCc6ICc2NHB4JyxcbiAgICAgICAgICAgICAgJ3dpZHRoJzogJzY0cHgnLFxuICAgICAgICAgICAgICAnYm9yZGVyLXNpemUnOiAnNHB4J1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgJ21lZGl1bSc6IHtcbiAgICAgICAgICAgICdzdGF0ZXMnOiB7XG4gICAgICAgICAgICAgICdkZWZhdWx0Jzoge1xuICAgICAgICAgICAgICAgICd0ZXh0LWNvbG9yJzogJ3JnYigyMjcsIDIyNywgMjI3KScsXG4gICAgICAgICAgICAgICAgJ3RyYWNrLWNvbG9yJzogJ3JnYig3NCwgNzQsIDc0KScsXG4gICAgICAgICAgICAgICAgJ3RyYWNrLWZpbGwtY29sb3InOiAncmdiKDU1LCAxNDIsIDI0MCknXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnZGltZW5zaW9ucyc6IHtcbiAgICAgICAgICAgICAgJ2hlaWdodCc6ICczMnB4JyxcbiAgICAgICAgICAgICAgJ3dpZHRoJzogJzMycHgnLFxuICAgICAgICAgICAgICAnYm9yZGVyLXNpemUnOiAnM3B4J1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgJ21lZGl1bS1vdmVyLWJhY2tncm91bmQnOiB7XG4gICAgICAgICAgICAnc3RhdGVzJzoge1xuICAgICAgICAgICAgICAnZGVmYXVsdCc6IHtcbiAgICAgICAgICAgICAgICAndGV4dC1jb2xvcic6ICdyZ2IoMjU1LCAyNTUsIDI1NSknLFxuICAgICAgICAgICAgICAgICd0cmFjay1jb2xvcic6ICdyZ2JhKDI1NSwyNTUsMjU1LDAuMiknLFxuICAgICAgICAgICAgICAgICd0cmFjay1maWxsLWNvbG9yJzogJ3JnYigyNTUsIDI1NSwgMjU1KSdcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdkaW1lbnNpb25zJzoge1xuICAgICAgICAgICAgICAnaGVpZ2h0JzogJzMycHgnLFxuICAgICAgICAgICAgICAnd2lkdGgnOiAnMzJweCcsXG4gICAgICAgICAgICAgICdib3JkZXItc2l6ZSc6ICczcHgnXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICAnc21hbGwnOiB7XG4gICAgICAgICAgICAnc3RhdGVzJzoge1xuICAgICAgICAgICAgICAnZGVmYXVsdCc6IHtcbiAgICAgICAgICAgICAgICAndGV4dC1jb2xvcic6ICdyZ2IoMjI3LCAyMjcsIDIyNyknLFxuICAgICAgICAgICAgICAgICd0cmFjay1jb2xvcic6ICdyZ2IoNzQsIDc0LCA3NCknLFxuICAgICAgICAgICAgICAgICd0cmFjay1maWxsLWNvbG9yJzogJ3JnYig1NSwgMTQyLCAyNDApJ1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ2RpbWVuc2lvbnMnOiB7XG4gICAgICAgICAgICAgICdoZWlnaHQnOiAnMTZweCcsXG4gICAgICAgICAgICAgICd3aWR0aCc6ICcxNnB4JyxcbiAgICAgICAgICAgICAgJ2JvcmRlci1zaXplJzogJzJweCdcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgICdzbWFsbC1vdmVyLWJhY2tncm91bmQnOiB7XG4gICAgICAgICAgICAnc3RhdGVzJzoge1xuICAgICAgICAgICAgICAnZGVmYXVsdCc6IHtcbiAgICAgICAgICAgICAgICAndGV4dC1jb2xvcic6ICdyZ2IoMjU1LCAyNTUsIDI1NSknLFxuICAgICAgICAgICAgICAgICd0cmFjay1jb2xvcic6ICdyZ2JhKDI1NSwyNTUsMjU1LDAuMiknLFxuICAgICAgICAgICAgICAgICd0cmFjay1maWxsLWNvbG9yJzogJ3JnYigyNTUsIDI1NSwgMjU1KSdcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdkaW1lbnNpb25zJzoge1xuICAgICAgICAgICAgICAnaGVpZ2h0JzogJzE2cHgnLFxuICAgICAgICAgICAgICAnd2lkdGgnOiAnMTZweCcsXG4gICAgICAgICAgICAgICdib3JkZXItc2l6ZSc6ICcycHgnXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICAnY29hY2htYXJrJzoge1xuICAgICAgICAgICdkZWZhdWx0Jzoge1xuICAgICAgICAgICAgJ2RpbWVuc2lvbnMnOiB7XG4gICAgICAgICAgICAgICdpbmRpY2F0b3ItcmluZy1ib3JkZXItc2l6ZSc6ICcycHgnLFxuICAgICAgICAgICAgICAnYW5pbWF0aW9uLWluZGljYXRvci1yaW5nLWR1cmF0aW9uJzogJzMwMDBtcycsXG4gICAgICAgICAgICAgICdhbmltYXRpb24taW5kaWNhdG9yLWtleWZyYW1lLTUwLW9wYWNpdHknOiAnMC42JyxcbiAgICAgICAgICAgICAgJ2luZGljYXRvci1yaW5nLWRpYW1ldGVyJzogJzE2cHgnXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ3N0YXRlcyc6IHtcbiAgICAgICAgICAgICAgJ2RlZmF1bHQnOiB7XG4gICAgICAgICAgICAgICAgJ2luZGljYXRvci1yaW5nLWRlZmF1bHQtY29sb3InOiAncmdiKDM4LCAxMjgsIDIzNSknXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgICdxdWlldCc6IHtcbiAgICAgICAgICAgICdkaW1lbnNpb25zJzoge1xuICAgICAgICAgICAgICAnaW5kaWNhdG9yLXJpbmctYm9yZGVyLXNpemUnOiAnMnB4JyxcbiAgICAgICAgICAgICAgJ2FuaW1hdGlvbi1pbmRpY2F0b3ItcmluZy1kdXJhdGlvbic6ICczMDAwbXMnLFxuICAgICAgICAgICAgICAnYW5pbWF0aW9uLWluZGljYXRvci1rZXlmcmFtZS01MC1vcGFjaXR5JzogJzAuNicsXG4gICAgICAgICAgICAgICdpbmRpY2F0b3ItcmluZy1kaWFtZXRlcic6ICc4cHgnXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ3N0YXRlcyc6IHtcbiAgICAgICAgICAgICAgJ2RlZmF1bHQnOiB7XG4gICAgICAgICAgICAgICAgJ2luZGljYXRvci1yaW5nLWRlZmF1bHQtY29sb3InOiAncmdiKDM4LCAxMjgsIDIzNSknXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgICdwb3BvdmVyJzoge1xuICAgICAgICAgICdkZWZhdWx0Jzoge1xuICAgICAgICAgICAgJ3N0YXRlcyc6IHtcbiAgICAgICAgICAgICAgJ2RlZmF1bHQnOiB7XG4gICAgICAgICAgICAgICAgJ2JhY2tncm91bmQtY29sb3InOiAncmdiKDM3LCAzNywgMzcpJyxcbiAgICAgICAgICAgICAgICAnYm9yZGVyLWNvbG9yJzogJ3JnYig5MCwgOTAsIDkwKSdcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgJ3NpZGVuYXYnOiB7XG4gICAgICAgICAgJ2RlZmF1bHQnOiB7XG4gICAgICAgICAgICAnc3RhdGVzJzoge1xuICAgICAgICAgICAgICAna2V5LWZvY3VzJzoge1xuICAgICAgICAgICAgICAgICdpdGVtLWJvcmRlci1jb2xvcic6ICdyZ2IoMzgsIDEyOCwgMjM1KSdcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgJ211bHRpbGV2ZWwnOiB7XG4gICAgICAgICAgICAnc3RhdGVzJzoge1xuICAgICAgICAgICAgICAna2V5LWZvY3VzJzoge1xuICAgICAgICAgICAgICAgICdpdGVtLWJvcmRlci1jb2xvcic6ICdyZ2IoMzgsIDEyOCwgMjM1KSdcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgJ3RleHRmaWVsZCc6IHtcbiAgICAgICAgICAnZGVmYXVsdCc6IHtcbiAgICAgICAgICAgICdzdGF0ZXMnOiB7XG4gICAgICAgICAgICAgICdkZWZhdWx0Jzoge1xuICAgICAgICAgICAgICAgICdiYWNrZ3JvdW5kLWNvbG9yJzogJ3JnYigzNywgMzcsIDM3KScsXG4gICAgICAgICAgICAgICAgJ2JvcmRlci1jb2xvcic6ICdyZ2IoNzQsIDc0LCA3NCknXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICdkaXNhYmxlZCc6IHtcbiAgICAgICAgICAgICAgICAnYmFja2dyb3VuZC1jb2xvcic6ICdyZ2IoNjIsIDYyLCA2MiknLFxuICAgICAgICAgICAgICAgICdib3JkZXItY29sb3InOiAndHJhbnNwYXJlbnQnXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICdtb3VzZS1mb2N1cyc6IHtcbiAgICAgICAgICAgICAgICAnYmFja2dyb3VuZC1jb2xvcic6ICdyZ2IoMzcsIDM3LCAzNyknLFxuICAgICAgICAgICAgICAgICdib3JkZXItY29sb3InOiAncmdiKDU1LCAxNDIsIDI0MCknXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgICdxdWlldCc6IHtcbiAgICAgICAgICAgICdzdGF0ZXMnOiB7XG4gICAgICAgICAgICAgICdkZWZhdWx0Jzoge1xuICAgICAgICAgICAgICAgICdiYWNrZ3JvdW5kLWNvbG9yJzogJ3RyYW5zcGFyZW50JyxcbiAgICAgICAgICAgICAgICAnYm9yZGVyLWNvbG9yJzogJ3JnYig3NCwgNzQsIDc0KSdcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgJ2Rpc2FibGVkJzoge1xuICAgICAgICAgICAgICAgICdiYWNrZ3JvdW5kLWNvbG9yJzogJ3RyYW5zcGFyZW50JyxcbiAgICAgICAgICAgICAgICAnYm9yZGVyLWNvbG9yJzogJ3JnYig3NCwgNzQsIDc0KSdcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgJ21vdXNlLWZvY3VzJzoge1xuICAgICAgICAgICAgICAgICdiYWNrZ3JvdW5kLWNvbG9yJzogJ3RyYW5zcGFyZW50JyxcbiAgICAgICAgICAgICAgICAnYm9yZGVyLWNvbG9yJzogJ3JnYig1NSwgMTQyLCAyNDApJ1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICAndG9vbHRpcCc6IHtcbiAgICAgICAgICAnZGVmYXVsdCc6IHtcbiAgICAgICAgICAgICdzdGF0ZXMnOiB7XG4gICAgICAgICAgICAgICdkZWZhdWx0Jzoge1xuICAgICAgICAgICAgICAgICd0aXAtY29sb3InOiAncmdiKDExNiwgMTE2LCAxMTYpJ1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICAnaW5mbyc6IHtcbiAgICAgICAgICAgICdzdGF0ZXMnOiB7XG4gICAgICAgICAgICAgICdkZWZhdWx0Jzoge1xuICAgICAgICAgICAgICAgICd0aXAtY29sb3InOiAncmdiKDEzLCAxMDIsIDIwOCknXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgICduZWdhdGl2ZSc6IHtcbiAgICAgICAgICAgICdzdGF0ZXMnOiB7XG4gICAgICAgICAgICAgICdkZWZhdWx0Jzoge1xuICAgICAgICAgICAgICAgICd0aXAtY29sb3InOiAncmdiKDIwMSwgMzcsIDQ1KSdcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgJ3Bvc2l0aXZlJzoge1xuICAgICAgICAgICAgJ3N0YXRlcyc6IHtcbiAgICAgICAgICAgICAgJ2RlZmF1bHQnOiB7XG4gICAgICAgICAgICAgICAgJ3RpcC1jb2xvcic6ICdyZ2IoMTgsIDEyOCwgOTIpJ1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgJ2xhcmdlJzoge1xuICAgICAgICAnY2lyY2xlbG9hZGVyJzoge1xuICAgICAgICAgICdsYXJnZSc6IHtcbiAgICAgICAgICAgICdzdGF0ZXMnOiB7XG4gICAgICAgICAgICAgICdkZWZhdWx0Jzoge1xuICAgICAgICAgICAgICAgICd0ZXh0LWNvbG9yJzogJ3JnYigyMjcsIDIyNywgMjI3KScsXG4gICAgICAgICAgICAgICAgJ3RyYWNrLWNvbG9yJzogJ3JnYig3NCwgNzQsIDc0KScsXG4gICAgICAgICAgICAgICAgJ3RyYWNrLWZpbGwtY29sb3InOiAncmdiKDU1LCAxNDIsIDI0MCknXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnZGltZW5zaW9ucyc6IHtcbiAgICAgICAgICAgICAgJ2hlaWdodCc6ICc4MHB4JyxcbiAgICAgICAgICAgICAgJ3dpZHRoJzogJzgwcHgnLFxuICAgICAgICAgICAgICAnYm9yZGVyLXNpemUnOiAnNXB4J1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgJ2xhcmdlLW92ZXItYmFja2dyb3VuZCc6IHtcbiAgICAgICAgICAgICdzdGF0ZXMnOiB7XG4gICAgICAgICAgICAgICdkZWZhdWx0Jzoge1xuICAgICAgICAgICAgICAgICd0ZXh0LWNvbG9yJzogJ3JnYigyNTUsIDI1NSwgMjU1KScsXG4gICAgICAgICAgICAgICAgJ3RyYWNrLWNvbG9yJzogJ3JnYmEoMjU1LDI1NSwyNTUsMC4yKScsXG4gICAgICAgICAgICAgICAgJ3RyYWNrLWZpbGwtY29sb3InOiAncmdiKDI1NSwgMjU1LCAyNTUpJ1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ2RpbWVuc2lvbnMnOiB7XG4gICAgICAgICAgICAgICdoZWlnaHQnOiAnODBweCcsXG4gICAgICAgICAgICAgICd3aWR0aCc6ICc4MHB4JyxcbiAgICAgICAgICAgICAgJ2JvcmRlci1zaXplJzogJzVweCdcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgICdtZWRpdW0nOiB7XG4gICAgICAgICAgICAnc3RhdGVzJzoge1xuICAgICAgICAgICAgICAnZGVmYXVsdCc6IHtcbiAgICAgICAgICAgICAgICAndGV4dC1jb2xvcic6ICdyZ2IoMjI3LCAyMjcsIDIyNyknLFxuICAgICAgICAgICAgICAgICd0cmFjay1jb2xvcic6ICdyZ2IoNzQsIDc0LCA3NCknLFxuICAgICAgICAgICAgICAgICd0cmFjay1maWxsLWNvbG9yJzogJ3JnYig1NSwgMTQyLCAyNDApJ1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ2RpbWVuc2lvbnMnOiB7XG4gICAgICAgICAgICAgICdoZWlnaHQnOiAnNDBweCcsXG4gICAgICAgICAgICAgICd3aWR0aCc6ICc0MHB4JyxcbiAgICAgICAgICAgICAgJ2JvcmRlci1zaXplJzogJzRweCdcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgICdtZWRpdW0tb3Zlci1iYWNrZ3JvdW5kJzoge1xuICAgICAgICAgICAgJ3N0YXRlcyc6IHtcbiAgICAgICAgICAgICAgJ2RlZmF1bHQnOiB7XG4gICAgICAgICAgICAgICAgJ3RleHQtY29sb3InOiAncmdiKDI1NSwgMjU1LCAyNTUpJyxcbiAgICAgICAgICAgICAgICAndHJhY2stY29sb3InOiAncmdiYSgyNTUsMjU1LDI1NSwwLjIpJyxcbiAgICAgICAgICAgICAgICAndHJhY2stZmlsbC1jb2xvcic6ICdyZ2IoMjU1LCAyNTUsIDI1NSknXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnZGltZW5zaW9ucyc6IHtcbiAgICAgICAgICAgICAgJ2hlaWdodCc6ICc0MHB4JyxcbiAgICAgICAgICAgICAgJ3dpZHRoJzogJzQwcHgnLFxuICAgICAgICAgICAgICAnYm9yZGVyLXNpemUnOiAnNHB4J1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgJ3NtYWxsJzoge1xuICAgICAgICAgICAgJ3N0YXRlcyc6IHtcbiAgICAgICAgICAgICAgJ2RlZmF1bHQnOiB7XG4gICAgICAgICAgICAgICAgJ3RleHQtY29sb3InOiAncmdiKDIyNywgMjI3LCAyMjcpJyxcbiAgICAgICAgICAgICAgICAndHJhY2stY29sb3InOiAncmdiKDc0LCA3NCwgNzQpJyxcbiAgICAgICAgICAgICAgICAndHJhY2stZmlsbC1jb2xvcic6ICdyZ2IoNTUsIDE0MiwgMjQwKSdcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdkaW1lbnNpb25zJzoge1xuICAgICAgICAgICAgICAnaGVpZ2h0JzogJzIwcHgnLFxuICAgICAgICAgICAgICAnd2lkdGgnOiAnMjBweCcsXG4gICAgICAgICAgICAgICdib3JkZXItc2l6ZSc6ICczcHgnXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICAnc21hbGwtb3Zlci1iYWNrZ3JvdW5kJzoge1xuICAgICAgICAgICAgJ3N0YXRlcyc6IHtcbiAgICAgICAgICAgICAgJ2RlZmF1bHQnOiB7XG4gICAgICAgICAgICAgICAgJ3RleHQtY29sb3InOiAncmdiKDI1NSwgMjU1LCAyNTUpJyxcbiAgICAgICAgICAgICAgICAndHJhY2stY29sb3InOiAncmdiYSgyNTUsMjU1LDI1NSwwLjIpJyxcbiAgICAgICAgICAgICAgICAndHJhY2stZmlsbC1jb2xvcic6ICdyZ2IoMjU1LCAyNTUsIDI1NSknXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnZGltZW5zaW9ucyc6IHtcbiAgICAgICAgICAgICAgJ2hlaWdodCc6ICcyMHB4JyxcbiAgICAgICAgICAgICAgJ3dpZHRoJzogJzIwcHgnLFxuICAgICAgICAgICAgICAnYm9yZGVyLXNpemUnOiAnM3B4J1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgJ2NvYWNobWFyayc6IHtcbiAgICAgICAgICAnZGVmYXVsdCc6IHtcbiAgICAgICAgICAgICdkaW1lbnNpb25zJzoge1xuICAgICAgICAgICAgICAnaW5kaWNhdG9yLXJpbmctYm9yZGVyLXNpemUnOiAnMnB4JyxcbiAgICAgICAgICAgICAgJ2FuaW1hdGlvbi1pbmRpY2F0b3ItcmluZy1kdXJhdGlvbic6ICczMDAwbXMnLFxuICAgICAgICAgICAgICAnYW5pbWF0aW9uLWluZGljYXRvci1rZXlmcmFtZS01MC1vcGFjaXR5JzogJzAuNicsXG4gICAgICAgICAgICAgICdpbmRpY2F0b3ItcmluZy1kaWFtZXRlcic6ICcyMHB4J1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdzdGF0ZXMnOiB7XG4gICAgICAgICAgICAgICdkZWZhdWx0Jzoge1xuICAgICAgICAgICAgICAgICdpbmRpY2F0b3ItcmluZy1kZWZhdWx0LWNvbG9yJzogJ3JnYigzOCwgMTI4LCAyMzUpJ1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICAncXVpZXQnOiB7XG4gICAgICAgICAgICAnZGltZW5zaW9ucyc6IHtcbiAgICAgICAgICAgICAgJ2luZGljYXRvci1yaW5nLWJvcmRlci1zaXplJzogJzJweCcsXG4gICAgICAgICAgICAgICdhbmltYXRpb24taW5kaWNhdG9yLXJpbmctZHVyYXRpb24nOiAnMzAwMG1zJyxcbiAgICAgICAgICAgICAgJ2FuaW1hdGlvbi1pbmRpY2F0b3Ita2V5ZnJhbWUtNTAtb3BhY2l0eSc6ICcwLjYnLFxuICAgICAgICAgICAgICAnaW5kaWNhdG9yLXJpbmctZGlhbWV0ZXInOiAnMTBweCdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnc3RhdGVzJzoge1xuICAgICAgICAgICAgICAnZGVmYXVsdCc6IHtcbiAgICAgICAgICAgICAgICAnaW5kaWNhdG9yLXJpbmctZGVmYXVsdC1jb2xvcic6ICdyZ2IoMzgsIDEyOCwgMjM1KSdcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgJ3BvcG92ZXInOiB7XG4gICAgICAgICAgJ2RlZmF1bHQnOiB7XG4gICAgICAgICAgICAnc3RhdGVzJzoge1xuICAgICAgICAgICAgICAnZGVmYXVsdCc6IHtcbiAgICAgICAgICAgICAgICAnYmFja2dyb3VuZC1jb2xvcic6ICdyZ2IoMzcsIDM3LCAzNyknLFxuICAgICAgICAgICAgICAgICdib3JkZXItY29sb3InOiAncmdiKDkwLCA5MCwgOTApJ1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICAnc2lkZW5hdic6IHtcbiAgICAgICAgICAnZGVmYXVsdCc6IHtcbiAgICAgICAgICAgICdzdGF0ZXMnOiB7XG4gICAgICAgICAgICAgICdrZXktZm9jdXMnOiB7XG4gICAgICAgICAgICAgICAgJ2l0ZW0tYm9yZGVyLWNvbG9yJzogJ3JnYigzOCwgMTI4LCAyMzUpJ1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICAnbXVsdGlsZXZlbCc6IHtcbiAgICAgICAgICAgICdzdGF0ZXMnOiB7XG4gICAgICAgICAgICAgICdrZXktZm9jdXMnOiB7XG4gICAgICAgICAgICAgICAgJ2l0ZW0tYm9yZGVyLWNvbG9yJzogJ3JnYigzOCwgMTI4LCAyMzUpJ1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICAndGV4dGZpZWxkJzoge1xuICAgICAgICAgICdkZWZhdWx0Jzoge1xuICAgICAgICAgICAgJ3N0YXRlcyc6IHtcbiAgICAgICAgICAgICAgJ2RlZmF1bHQnOiB7XG4gICAgICAgICAgICAgICAgJ2JhY2tncm91bmQtY29sb3InOiAncmdiKDM3LCAzNywgMzcpJyxcbiAgICAgICAgICAgICAgICAnYm9yZGVyLWNvbG9yJzogJ3JnYig3NCwgNzQsIDc0KSdcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgJ2Rpc2FibGVkJzoge1xuICAgICAgICAgICAgICAgICdiYWNrZ3JvdW5kLWNvbG9yJzogJ3JnYig2MiwgNjIsIDYyKScsXG4gICAgICAgICAgICAgICAgJ2JvcmRlci1jb2xvcic6ICd0cmFuc3BhcmVudCdcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgJ21vdXNlLWZvY3VzJzoge1xuICAgICAgICAgICAgICAgICdiYWNrZ3JvdW5kLWNvbG9yJzogJ3JnYigzNywgMzcsIDM3KScsXG4gICAgICAgICAgICAgICAgJ2JvcmRlci1jb2xvcic6ICdyZ2IoNTUsIDE0MiwgMjQwKSdcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgJ3F1aWV0Jzoge1xuICAgICAgICAgICAgJ3N0YXRlcyc6IHtcbiAgICAgICAgICAgICAgJ2RlZmF1bHQnOiB7XG4gICAgICAgICAgICAgICAgJ2JhY2tncm91bmQtY29sb3InOiAndHJhbnNwYXJlbnQnLFxuICAgICAgICAgICAgICAgICdib3JkZXItY29sb3InOiAncmdiKDc0LCA3NCwgNzQpJ1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAnZGlzYWJsZWQnOiB7XG4gICAgICAgICAgICAgICAgJ2JhY2tncm91bmQtY29sb3InOiAndHJhbnNwYXJlbnQnLFxuICAgICAgICAgICAgICAgICdib3JkZXItY29sb3InOiAncmdiKDc0LCA3NCwgNzQpJ1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAnbW91c2UtZm9jdXMnOiB7XG4gICAgICAgICAgICAgICAgJ2JhY2tncm91bmQtY29sb3InOiAndHJhbnNwYXJlbnQnLFxuICAgICAgICAgICAgICAgICdib3JkZXItY29sb3InOiAncmdiKDU1LCAxNDIsIDI0MCknXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgICd0b29sdGlwJzoge1xuICAgICAgICAgICdkZWZhdWx0Jzoge1xuICAgICAgICAgICAgJ3N0YXRlcyc6IHtcbiAgICAgICAgICAgICAgJ2RlZmF1bHQnOiB7XG4gICAgICAgICAgICAgICAgJ3RpcC1jb2xvcic6ICdyZ2IoMTE2LCAxMTYsIDExNiknXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgICdpbmZvJzoge1xuICAgICAgICAgICAgJ3N0YXRlcyc6IHtcbiAgICAgICAgICAgICAgJ2RlZmF1bHQnOiB7XG4gICAgICAgICAgICAgICAgJ3RpcC1jb2xvcic6ICdyZ2IoMTMsIDEwMiwgMjA4KSdcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgJ25lZ2F0aXZlJzoge1xuICAgICAgICAgICAgJ3N0YXRlcyc6IHtcbiAgICAgICAgICAgICAgJ2RlZmF1bHQnOiB7XG4gICAgICAgICAgICAgICAgJ3RpcC1jb2xvcic6ICdyZ2IoMjAxLCAzNywgNDUpJ1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICAncG9zaXRpdmUnOiB7XG4gICAgICAgICAgICAnc3RhdGVzJzoge1xuICAgICAgICAgICAgICAnZGVmYXVsdCc6IHtcbiAgICAgICAgICAgICAgICAndGlwLWNvbG9yJzogJ3JnYigxOCwgMTI4LCA5MiknXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgICdkYXJrZXN0Jzoge1xuICAgICAgJ21lZGl1bSc6IHtcbiAgICAgICAgJ2NpcmNsZWxvYWRlcic6IHtcbiAgICAgICAgICAnbGFyZ2UnOiB7XG4gICAgICAgICAgICAnc3RhdGVzJzoge1xuICAgICAgICAgICAgICAnZGVmYXVsdCc6IHtcbiAgICAgICAgICAgICAgICAndGV4dC1jb2xvcic6ICdyZ2IoMjAwLCAyMDAsIDIwMCknLFxuICAgICAgICAgICAgICAgICd0cmFjay1jb2xvcic6ICdyZ2IoNTcsIDU3LCA1NyknLFxuICAgICAgICAgICAgICAgICd0cmFjay1maWxsLWNvbG9yJzogJ3JnYigzOCwgMTI4LCAyMzUpJ1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ2RpbWVuc2lvbnMnOiB7XG4gICAgICAgICAgICAgICdoZWlnaHQnOiAnNjRweCcsXG4gICAgICAgICAgICAgICd3aWR0aCc6ICc2NHB4JyxcbiAgICAgICAgICAgICAgJ2JvcmRlci1zaXplJzogJzRweCdcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgICdsYXJnZS1vdmVyLWJhY2tncm91bmQnOiB7XG4gICAgICAgICAgICAnc3RhdGVzJzoge1xuICAgICAgICAgICAgICAnZGVmYXVsdCc6IHtcbiAgICAgICAgICAgICAgICAndGV4dC1jb2xvcic6ICdyZ2IoMjU1LCAyNTUsIDI1NSknLFxuICAgICAgICAgICAgICAgICd0cmFjay1jb2xvcic6ICdyZ2JhKDI1NSwyNTUsMjU1LDAuMiknLFxuICAgICAgICAgICAgICAgICd0cmFjay1maWxsLWNvbG9yJzogJ3JnYigyNTUsIDI1NSwgMjU1KSdcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdkaW1lbnNpb25zJzoge1xuICAgICAgICAgICAgICAnaGVpZ2h0JzogJzY0cHgnLFxuICAgICAgICAgICAgICAnd2lkdGgnOiAnNjRweCcsXG4gICAgICAgICAgICAgICdib3JkZXItc2l6ZSc6ICc0cHgnXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICAnbWVkaXVtJzoge1xuICAgICAgICAgICAgJ3N0YXRlcyc6IHtcbiAgICAgICAgICAgICAgJ2RlZmF1bHQnOiB7XG4gICAgICAgICAgICAgICAgJ3RleHQtY29sb3InOiAncmdiKDIwMCwgMjAwLCAyMDApJyxcbiAgICAgICAgICAgICAgICAndHJhY2stY29sb3InOiAncmdiKDU3LCA1NywgNTcpJyxcbiAgICAgICAgICAgICAgICAndHJhY2stZmlsbC1jb2xvcic6ICdyZ2IoMzgsIDEyOCwgMjM1KSdcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdkaW1lbnNpb25zJzoge1xuICAgICAgICAgICAgICAnaGVpZ2h0JzogJzMycHgnLFxuICAgICAgICAgICAgICAnd2lkdGgnOiAnMzJweCcsXG4gICAgICAgICAgICAgICdib3JkZXItc2l6ZSc6ICczcHgnXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICAnbWVkaXVtLW92ZXItYmFja2dyb3VuZCc6IHtcbiAgICAgICAgICAgICdzdGF0ZXMnOiB7XG4gICAgICAgICAgICAgICdkZWZhdWx0Jzoge1xuICAgICAgICAgICAgICAgICd0ZXh0LWNvbG9yJzogJ3JnYigyNTUsIDI1NSwgMjU1KScsXG4gICAgICAgICAgICAgICAgJ3RyYWNrLWNvbG9yJzogJ3JnYmEoMjU1LDI1NSwyNTUsMC4yKScsXG4gICAgICAgICAgICAgICAgJ3RyYWNrLWZpbGwtY29sb3InOiAncmdiKDI1NSwgMjU1LCAyNTUpJ1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ2RpbWVuc2lvbnMnOiB7XG4gICAgICAgICAgICAgICdoZWlnaHQnOiAnMzJweCcsXG4gICAgICAgICAgICAgICd3aWR0aCc6ICczMnB4JyxcbiAgICAgICAgICAgICAgJ2JvcmRlci1zaXplJzogJzNweCdcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgICdzbWFsbCc6IHtcbiAgICAgICAgICAgICdzdGF0ZXMnOiB7XG4gICAgICAgICAgICAgICdkZWZhdWx0Jzoge1xuICAgICAgICAgICAgICAgICd0ZXh0LWNvbG9yJzogJ3JnYigyMDAsIDIwMCwgMjAwKScsXG4gICAgICAgICAgICAgICAgJ3RyYWNrLWNvbG9yJzogJ3JnYig1NywgNTcsIDU3KScsXG4gICAgICAgICAgICAgICAgJ3RyYWNrLWZpbGwtY29sb3InOiAncmdiKDM4LCAxMjgsIDIzNSknXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnZGltZW5zaW9ucyc6IHtcbiAgICAgICAgICAgICAgJ2hlaWdodCc6ICcxNnB4JyxcbiAgICAgICAgICAgICAgJ3dpZHRoJzogJzE2cHgnLFxuICAgICAgICAgICAgICAnYm9yZGVyLXNpemUnOiAnMnB4J1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgJ3NtYWxsLW92ZXItYmFja2dyb3VuZCc6IHtcbiAgICAgICAgICAgICdzdGF0ZXMnOiB7XG4gICAgICAgICAgICAgICdkZWZhdWx0Jzoge1xuICAgICAgICAgICAgICAgICd0ZXh0LWNvbG9yJzogJ3JnYigyNTUsIDI1NSwgMjU1KScsXG4gICAgICAgICAgICAgICAgJ3RyYWNrLWNvbG9yJzogJ3JnYmEoMjU1LDI1NSwyNTUsMC4yKScsXG4gICAgICAgICAgICAgICAgJ3RyYWNrLWZpbGwtY29sb3InOiAncmdiKDI1NSwgMjU1LCAyNTUpJ1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ2RpbWVuc2lvbnMnOiB7XG4gICAgICAgICAgICAgICdoZWlnaHQnOiAnMTZweCcsXG4gICAgICAgICAgICAgICd3aWR0aCc6ICcxNnB4JyxcbiAgICAgICAgICAgICAgJ2JvcmRlci1zaXplJzogJzJweCdcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgICdjb2FjaG1hcmsnOiB7XG4gICAgICAgICAgJ2RlZmF1bHQnOiB7XG4gICAgICAgICAgICAnZGltZW5zaW9ucyc6IHtcbiAgICAgICAgICAgICAgJ2luZGljYXRvci1yaW5nLWJvcmRlci1zaXplJzogJzJweCcsXG4gICAgICAgICAgICAgICdhbmltYXRpb24taW5kaWNhdG9yLXJpbmctZHVyYXRpb24nOiAnMzAwMG1zJyxcbiAgICAgICAgICAgICAgJ2FuaW1hdGlvbi1pbmRpY2F0b3Ita2V5ZnJhbWUtNTAtb3BhY2l0eSc6ICcwLjYnLFxuICAgICAgICAgICAgICAnaW5kaWNhdG9yLXJpbmctZGlhbWV0ZXInOiAnMTZweCdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnc3RhdGVzJzoge1xuICAgICAgICAgICAgICAnZGVmYXVsdCc6IHtcbiAgICAgICAgICAgICAgICAnaW5kaWNhdG9yLXJpbmctZGVmYXVsdC1jb2xvcic6ICdyZ2IoMjAsIDExNSwgMjMwKSdcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgJ3F1aWV0Jzoge1xuICAgICAgICAgICAgJ2RpbWVuc2lvbnMnOiB7XG4gICAgICAgICAgICAgICdpbmRpY2F0b3ItcmluZy1ib3JkZXItc2l6ZSc6ICcycHgnLFxuICAgICAgICAgICAgICAnYW5pbWF0aW9uLWluZGljYXRvci1yaW5nLWR1cmF0aW9uJzogJzMwMDBtcycsXG4gICAgICAgICAgICAgICdhbmltYXRpb24taW5kaWNhdG9yLWtleWZyYW1lLTUwLW9wYWNpdHknOiAnMC42JyxcbiAgICAgICAgICAgICAgJ2luZGljYXRvci1yaW5nLWRpYW1ldGVyJzogJzhweCdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnc3RhdGVzJzoge1xuICAgICAgICAgICAgICAnZGVmYXVsdCc6IHtcbiAgICAgICAgICAgICAgICAnaW5kaWNhdG9yLXJpbmctZGVmYXVsdC1jb2xvcic6ICdyZ2IoMjAsIDExNSwgMjMwKSdcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgJ3BvcG92ZXInOiB7XG4gICAgICAgICAgJ2RlZmF1bHQnOiB7XG4gICAgICAgICAgICAnc3RhdGVzJzoge1xuICAgICAgICAgICAgICAnZGVmYXVsdCc6IHtcbiAgICAgICAgICAgICAgICAnYmFja2dyb3VuZC1jb2xvcic6ICdyZ2IoOCwgOCwgOCknLFxuICAgICAgICAgICAgICAgICdib3JkZXItY29sb3InOiAncmdiKDczLCA3MywgNzMpJ1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICAnc2lkZW5hdic6IHtcbiAgICAgICAgICAnZGVmYXVsdCc6IHtcbiAgICAgICAgICAgICdzdGF0ZXMnOiB7XG4gICAgICAgICAgICAgICdrZXktZm9jdXMnOiB7XG4gICAgICAgICAgICAgICAgJ2l0ZW0tYm9yZGVyLWNvbG9yJzogJ3JnYigyMCwgMTE1LCAyMzApJ1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICAnbXVsdGlsZXZlbCc6IHtcbiAgICAgICAgICAgICdzdGF0ZXMnOiB7XG4gICAgICAgICAgICAgICdrZXktZm9jdXMnOiB7XG4gICAgICAgICAgICAgICAgJ2l0ZW0tYm9yZGVyLWNvbG9yJzogJ3JnYigyMCwgMTE1LCAyMzApJ1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICAndGV4dGZpZWxkJzoge1xuICAgICAgICAgICdkZWZhdWx0Jzoge1xuICAgICAgICAgICAgJ3N0YXRlcyc6IHtcbiAgICAgICAgICAgICAgJ2RlZmF1bHQnOiB7XG4gICAgICAgICAgICAgICAgJ2JhY2tncm91bmQtY29sb3InOiAncmdiKDgsIDgsIDgpJyxcbiAgICAgICAgICAgICAgICAnYm9yZGVyLWNvbG9yJzogJ3JnYig1NywgNTcsIDU3KSdcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgJ2Rpc2FibGVkJzoge1xuICAgICAgICAgICAgICAgICdiYWNrZ3JvdW5kLWNvbG9yJzogJ3JnYig0NCwgNDQsIDQ0KScsXG4gICAgICAgICAgICAgICAgJ2JvcmRlci1jb2xvcic6ICd0cmFuc3BhcmVudCdcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgJ21vdXNlLWZvY3VzJzoge1xuICAgICAgICAgICAgICAgICdiYWNrZ3JvdW5kLWNvbG9yJzogJ3JnYig4LCA4LCA4KScsXG4gICAgICAgICAgICAgICAgJ2JvcmRlci1jb2xvcic6ICdyZ2IoMzgsIDEyOCwgMjM1KSdcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgJ3F1aWV0Jzoge1xuICAgICAgICAgICAgJ3N0YXRlcyc6IHtcbiAgICAgICAgICAgICAgJ2RlZmF1bHQnOiB7XG4gICAgICAgICAgICAgICAgJ2JhY2tncm91bmQtY29sb3InOiAndHJhbnNwYXJlbnQnLFxuICAgICAgICAgICAgICAgICdib3JkZXItY29sb3InOiAncmdiKDU3LCA1NywgNTcpJ1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAnZGlzYWJsZWQnOiB7XG4gICAgICAgICAgICAgICAgJ2JhY2tncm91bmQtY29sb3InOiAndHJhbnNwYXJlbnQnLFxuICAgICAgICAgICAgICAgICdib3JkZXItY29sb3InOiAncmdiKDU3LCA1NywgNTcpJ1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAnbW91c2UtZm9jdXMnOiB7XG4gICAgICAgICAgICAgICAgJ2JhY2tncm91bmQtY29sb3InOiAndHJhbnNwYXJlbnQnLFxuICAgICAgICAgICAgICAgICdib3JkZXItY29sb3InOiAncmdiKDM4LCAxMjgsIDIzNSknXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgICd0b29sdGlwJzoge1xuICAgICAgICAgICdkZWZhdWx0Jzoge1xuICAgICAgICAgICAgJ3N0YXRlcyc6IHtcbiAgICAgICAgICAgICAgJ2RlZmF1bHQnOiB7XG4gICAgICAgICAgICAgICAgJ3RpcC1jb2xvcic6ICdyZ2IoMTE2LCAxMTYsIDExNiknXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgICdpbmZvJzoge1xuICAgICAgICAgICAgJ3N0YXRlcyc6IHtcbiAgICAgICAgICAgICAgJ2RlZmF1bHQnOiB7XG4gICAgICAgICAgICAgICAgJ3RpcC1jb2xvcic6ICdyZ2IoMTMsIDEwMiwgMjA4KSdcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgJ25lZ2F0aXZlJzoge1xuICAgICAgICAgICAgJ3N0YXRlcyc6IHtcbiAgICAgICAgICAgICAgJ2RlZmF1bHQnOiB7XG4gICAgICAgICAgICAgICAgJ3RpcC1jb2xvcic6ICdyZ2IoMjAxLCAzNywgNDUpJ1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICAncG9zaXRpdmUnOiB7XG4gICAgICAgICAgICAnc3RhdGVzJzoge1xuICAgICAgICAgICAgICAnZGVmYXVsdCc6IHtcbiAgICAgICAgICAgICAgICAndGlwLWNvbG9yJzogJ3JnYigxOCwgMTI4LCA5MiknXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAnbGFyZ2UnOiB7XG4gICAgICAgICdjaXJjbGVsb2FkZXInOiB7XG4gICAgICAgICAgJ2xhcmdlJzoge1xuICAgICAgICAgICAgJ3N0YXRlcyc6IHtcbiAgICAgICAgICAgICAgJ2RlZmF1bHQnOiB7XG4gICAgICAgICAgICAgICAgJ3RleHQtY29sb3InOiAncmdiKDIwMCwgMjAwLCAyMDApJyxcbiAgICAgICAgICAgICAgICAndHJhY2stY29sb3InOiAncmdiKDU3LCA1NywgNTcpJyxcbiAgICAgICAgICAgICAgICAndHJhY2stZmlsbC1jb2xvcic6ICdyZ2IoMzgsIDEyOCwgMjM1KSdcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdkaW1lbnNpb25zJzoge1xuICAgICAgICAgICAgICAnaGVpZ2h0JzogJzgwcHgnLFxuICAgICAgICAgICAgICAnd2lkdGgnOiAnODBweCcsXG4gICAgICAgICAgICAgICdib3JkZXItc2l6ZSc6ICc1cHgnXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICAnbGFyZ2Utb3Zlci1iYWNrZ3JvdW5kJzoge1xuICAgICAgICAgICAgJ3N0YXRlcyc6IHtcbiAgICAgICAgICAgICAgJ2RlZmF1bHQnOiB7XG4gICAgICAgICAgICAgICAgJ3RleHQtY29sb3InOiAncmdiKDI1NSwgMjU1LCAyNTUpJyxcbiAgICAgICAgICAgICAgICAndHJhY2stY29sb3InOiAncmdiYSgyNTUsMjU1LDI1NSwwLjIpJyxcbiAgICAgICAgICAgICAgICAndHJhY2stZmlsbC1jb2xvcic6ICdyZ2IoMjU1LCAyNTUsIDI1NSknXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnZGltZW5zaW9ucyc6IHtcbiAgICAgICAgICAgICAgJ2hlaWdodCc6ICc4MHB4JyxcbiAgICAgICAgICAgICAgJ3dpZHRoJzogJzgwcHgnLFxuICAgICAgICAgICAgICAnYm9yZGVyLXNpemUnOiAnNXB4J1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgJ21lZGl1bSc6IHtcbiAgICAgICAgICAgICdzdGF0ZXMnOiB7XG4gICAgICAgICAgICAgICdkZWZhdWx0Jzoge1xuICAgICAgICAgICAgICAgICd0ZXh0LWNvbG9yJzogJ3JnYigyMDAsIDIwMCwgMjAwKScsXG4gICAgICAgICAgICAgICAgJ3RyYWNrLWNvbG9yJzogJ3JnYig1NywgNTcsIDU3KScsXG4gICAgICAgICAgICAgICAgJ3RyYWNrLWZpbGwtY29sb3InOiAncmdiKDM4LCAxMjgsIDIzNSknXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnZGltZW5zaW9ucyc6IHtcbiAgICAgICAgICAgICAgJ2hlaWdodCc6ICc0MHB4JyxcbiAgICAgICAgICAgICAgJ3dpZHRoJzogJzQwcHgnLFxuICAgICAgICAgICAgICAnYm9yZGVyLXNpemUnOiAnNHB4J1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgJ21lZGl1bS1vdmVyLWJhY2tncm91bmQnOiB7XG4gICAgICAgICAgICAnc3RhdGVzJzoge1xuICAgICAgICAgICAgICAnZGVmYXVsdCc6IHtcbiAgICAgICAgICAgICAgICAndGV4dC1jb2xvcic6ICdyZ2IoMjU1LCAyNTUsIDI1NSknLFxuICAgICAgICAgICAgICAgICd0cmFjay1jb2xvcic6ICdyZ2JhKDI1NSwyNTUsMjU1LDAuMiknLFxuICAgICAgICAgICAgICAgICd0cmFjay1maWxsLWNvbG9yJzogJ3JnYigyNTUsIDI1NSwgMjU1KSdcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdkaW1lbnNpb25zJzoge1xuICAgICAgICAgICAgICAnaGVpZ2h0JzogJzQwcHgnLFxuICAgICAgICAgICAgICAnd2lkdGgnOiAnNDBweCcsXG4gICAgICAgICAgICAgICdib3JkZXItc2l6ZSc6ICc0cHgnXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICAnc21hbGwnOiB7XG4gICAgICAgICAgICAnc3RhdGVzJzoge1xuICAgICAgICAgICAgICAnZGVmYXVsdCc6IHtcbiAgICAgICAgICAgICAgICAndGV4dC1jb2xvcic6ICdyZ2IoMjAwLCAyMDAsIDIwMCknLFxuICAgICAgICAgICAgICAgICd0cmFjay1jb2xvcic6ICdyZ2IoNTcsIDU3LCA1NyknLFxuICAgICAgICAgICAgICAgICd0cmFjay1maWxsLWNvbG9yJzogJ3JnYigzOCwgMTI4LCAyMzUpJ1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ2RpbWVuc2lvbnMnOiB7XG4gICAgICAgICAgICAgICdoZWlnaHQnOiAnMjBweCcsXG4gICAgICAgICAgICAgICd3aWR0aCc6ICcyMHB4JyxcbiAgICAgICAgICAgICAgJ2JvcmRlci1zaXplJzogJzNweCdcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgICdzbWFsbC1vdmVyLWJhY2tncm91bmQnOiB7XG4gICAgICAgICAgICAnc3RhdGVzJzoge1xuICAgICAgICAgICAgICAnZGVmYXVsdCc6IHtcbiAgICAgICAgICAgICAgICAndGV4dC1jb2xvcic6ICdyZ2IoMjU1LCAyNTUsIDI1NSknLFxuICAgICAgICAgICAgICAgICd0cmFjay1jb2xvcic6ICdyZ2JhKDI1NSwyNTUsMjU1LDAuMiknLFxuICAgICAgICAgICAgICAgICd0cmFjay1maWxsLWNvbG9yJzogJ3JnYigyNTUsIDI1NSwgMjU1KSdcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdkaW1lbnNpb25zJzoge1xuICAgICAgICAgICAgICAnaGVpZ2h0JzogJzIwcHgnLFxuICAgICAgICAgICAgICAnd2lkdGgnOiAnMjBweCcsXG4gICAgICAgICAgICAgICdib3JkZXItc2l6ZSc6ICczcHgnXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICAnY29hY2htYXJrJzoge1xuICAgICAgICAgICdkZWZhdWx0Jzoge1xuICAgICAgICAgICAgJ2RpbWVuc2lvbnMnOiB7XG4gICAgICAgICAgICAgICdpbmRpY2F0b3ItcmluZy1ib3JkZXItc2l6ZSc6ICcycHgnLFxuICAgICAgICAgICAgICAnYW5pbWF0aW9uLWluZGljYXRvci1yaW5nLWR1cmF0aW9uJzogJzMwMDBtcycsXG4gICAgICAgICAgICAgICdhbmltYXRpb24taW5kaWNhdG9yLWtleWZyYW1lLTUwLW9wYWNpdHknOiAnMC42JyxcbiAgICAgICAgICAgICAgJ2luZGljYXRvci1yaW5nLWRpYW1ldGVyJzogJzIwcHgnXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ3N0YXRlcyc6IHtcbiAgICAgICAgICAgICAgJ2RlZmF1bHQnOiB7XG4gICAgICAgICAgICAgICAgJ2luZGljYXRvci1yaW5nLWRlZmF1bHQtY29sb3InOiAncmdiKDIwLCAxMTUsIDIzMCknXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgICdxdWlldCc6IHtcbiAgICAgICAgICAgICdkaW1lbnNpb25zJzoge1xuICAgICAgICAgICAgICAnaW5kaWNhdG9yLXJpbmctYm9yZGVyLXNpemUnOiAnMnB4JyxcbiAgICAgICAgICAgICAgJ2FuaW1hdGlvbi1pbmRpY2F0b3ItcmluZy1kdXJhdGlvbic6ICczMDAwbXMnLFxuICAgICAgICAgICAgICAnYW5pbWF0aW9uLWluZGljYXRvci1rZXlmcmFtZS01MC1vcGFjaXR5JzogJzAuNicsXG4gICAgICAgICAgICAgICdpbmRpY2F0b3ItcmluZy1kaWFtZXRlcic6ICcxMHB4J1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdzdGF0ZXMnOiB7XG4gICAgICAgICAgICAgICdkZWZhdWx0Jzoge1xuICAgICAgICAgICAgICAgICdpbmRpY2F0b3ItcmluZy1kZWZhdWx0LWNvbG9yJzogJ3JnYigyMCwgMTE1LCAyMzApJ1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICAncG9wb3Zlcic6IHtcbiAgICAgICAgICAnZGVmYXVsdCc6IHtcbiAgICAgICAgICAgICdzdGF0ZXMnOiB7XG4gICAgICAgICAgICAgICdkZWZhdWx0Jzoge1xuICAgICAgICAgICAgICAgICdiYWNrZ3JvdW5kLWNvbG9yJzogJ3JnYig4LCA4LCA4KScsXG4gICAgICAgICAgICAgICAgJ2JvcmRlci1jb2xvcic6ICdyZ2IoNzMsIDczLCA3MyknXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgICdzaWRlbmF2Jzoge1xuICAgICAgICAgICdkZWZhdWx0Jzoge1xuICAgICAgICAgICAgJ3N0YXRlcyc6IHtcbiAgICAgICAgICAgICAgJ2tleS1mb2N1cyc6IHtcbiAgICAgICAgICAgICAgICAnaXRlbS1ib3JkZXItY29sb3InOiAncmdiKDIwLCAxMTUsIDIzMCknXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgICdtdWx0aWxldmVsJzoge1xuICAgICAgICAgICAgJ3N0YXRlcyc6IHtcbiAgICAgICAgICAgICAgJ2tleS1mb2N1cyc6IHtcbiAgICAgICAgICAgICAgICAnaXRlbS1ib3JkZXItY29sb3InOiAncmdiKDIwLCAxMTUsIDIzMCknXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgICd0ZXh0ZmllbGQnOiB7XG4gICAgICAgICAgJ2RlZmF1bHQnOiB7XG4gICAgICAgICAgICAnc3RhdGVzJzoge1xuICAgICAgICAgICAgICAnZGVmYXVsdCc6IHtcbiAgICAgICAgICAgICAgICAnYmFja2dyb3VuZC1jb2xvcic6ICdyZ2IoOCwgOCwgOCknLFxuICAgICAgICAgICAgICAgICdib3JkZXItY29sb3InOiAncmdiKDU3LCA1NywgNTcpJ1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAnZGlzYWJsZWQnOiB7XG4gICAgICAgICAgICAgICAgJ2JhY2tncm91bmQtY29sb3InOiAncmdiKDQ0LCA0NCwgNDQpJyxcbiAgICAgICAgICAgICAgICAnYm9yZGVyLWNvbG9yJzogJ3RyYW5zcGFyZW50J1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAnbW91c2UtZm9jdXMnOiB7XG4gICAgICAgICAgICAgICAgJ2JhY2tncm91bmQtY29sb3InOiAncmdiKDgsIDgsIDgpJyxcbiAgICAgICAgICAgICAgICAnYm9yZGVyLWNvbG9yJzogJ3JnYigzOCwgMTI4LCAyMzUpJ1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICAncXVpZXQnOiB7XG4gICAgICAgICAgICAnc3RhdGVzJzoge1xuICAgICAgICAgICAgICAnZGVmYXVsdCc6IHtcbiAgICAgICAgICAgICAgICAnYmFja2dyb3VuZC1jb2xvcic6ICd0cmFuc3BhcmVudCcsXG4gICAgICAgICAgICAgICAgJ2JvcmRlci1jb2xvcic6ICdyZ2IoNTcsIDU3LCA1NyknXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICdkaXNhYmxlZCc6IHtcbiAgICAgICAgICAgICAgICAnYmFja2dyb3VuZC1jb2xvcic6ICd0cmFuc3BhcmVudCcsXG4gICAgICAgICAgICAgICAgJ2JvcmRlci1jb2xvcic6ICdyZ2IoNTcsIDU3LCA1NyknXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICdtb3VzZS1mb2N1cyc6IHtcbiAgICAgICAgICAgICAgICAnYmFja2dyb3VuZC1jb2xvcic6ICd0cmFuc3BhcmVudCcsXG4gICAgICAgICAgICAgICAgJ2JvcmRlci1jb2xvcic6ICdyZ2IoMzgsIDEyOCwgMjM1KSdcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgJ3Rvb2x0aXAnOiB7XG4gICAgICAgICAgJ2RlZmF1bHQnOiB7XG4gICAgICAgICAgICAnc3RhdGVzJzoge1xuICAgICAgICAgICAgICAnZGVmYXVsdCc6IHtcbiAgICAgICAgICAgICAgICAndGlwLWNvbG9yJzogJ3JnYigxMTYsIDExNiwgMTE2KSdcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgJ2luZm8nOiB7XG4gICAgICAgICAgICAnc3RhdGVzJzoge1xuICAgICAgICAgICAgICAnZGVmYXVsdCc6IHtcbiAgICAgICAgICAgICAgICAndGlwLWNvbG9yJzogJ3JnYigxMywgMTAyLCAyMDgpJ1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICAnbmVnYXRpdmUnOiB7XG4gICAgICAgICAgICAnc3RhdGVzJzoge1xuICAgICAgICAgICAgICAnZGVmYXVsdCc6IHtcbiAgICAgICAgICAgICAgICAndGlwLWNvbG9yJzogJ3JnYigyMDEsIDM3LCA0NSknXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgICdwb3NpdGl2ZSc6IHtcbiAgICAgICAgICAgICdzdGF0ZXMnOiB7XG4gICAgICAgICAgICAgICdkZWZhdWx0Jzoge1xuICAgICAgICAgICAgICAgICd0aXAtY29sb3InOiAncmdiKDE4LCAxMjgsIDkyKSdcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufTtcbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///161\n")},function(module,exports,__webpack_require__){"use strict";eval("/* WEBPACK VAR INJECTION */(function(process) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = exports.SpectrumContext = void 0;\n\nvar _classnames = _interopRequireDefault(__webpack_require__(46));\n\nvar _filterDOMProps = _interopRequireDefault(__webpack_require__(34));\n\nvar _featureFlag = __webpack_require__(163);\n\nvar _hostStyleConfig = _interopRequireDefault(__webpack_require__(190));\n\nvar _ownerDocument = _interopRequireDefault(__webpack_require__(191));\n\nvar _Provider = _interopRequireDefault(__webpack_require__(193));\n\nvar _react = _interopRequireDefault(__webpack_require__(0));\n\nvar _reactDom = _interopRequireDefault(__webpack_require__(15));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\nif (process.env.SCALE_MEDIUM && process.env.SCALE_LARGE) {\n  __webpack_require__(40);\n\n  __webpack_require__(71);\n} else if (process.env.SCALE_LARGE) {\n  __webpack_require__(72);\n} else {\n  __webpack_require__(40);\n}\n\nif (!process.env.THEME_LIGHT && !process.env.THEME_DARK && !process.env.THEME_LIGHTEST && !process.env.THEME_DARKEST || process.env.THEME_LIGHT) __webpack_require__(73);\nif (!process.env.THEME_LIGHT && !process.env.THEME_DARK && !process.env.THEME_LIGHTEST && !process.env.THEME_DARKEST || process.env.THEME_DARK) __webpack_require__(74);\nif (!process.env.THEME_LIGHT && !process.env.THEME_DARK && !process.env.THEME_LIGHTEST && !process.env.THEME_DARKEST || process.env.THEME_LIGHTEST) __webpack_require__(75);\nif (!process.env.THEME_LIGHT && !process.env.THEME_DARK && !process.env.THEME_LIGHTEST && !process.env.THEME_DARKEST || process.env.THEME_DARKEST) __webpack_require__(76);\nconst featureFlagsState = (0, _featureFlag.getFeatureFlags)();\n\nconst SpectrumContext = /*#__PURE__*/_react.default.createContext({\n  theme: 'light',\n  scale: 'medium',\n  productId: 'default',\n  boundariesElement: () => (0, _ownerDocument.default)(void 0).body,\n  disableNativeControls: false,\n  overlay: null,\n  featureFlags: featureFlagsState\n});\n\nexports.SpectrumContext = SpectrumContext;\n\nclass UxpProvider extends _Provider.default {\n  constructor(props) {\n    super(props);\n    this.state = {\n      overlay: {\n        overlayRef: null,\n        data: {\n          visible: false,\n          callback: undefined,\n          boundingRect: null\n        }\n      }\n    };\n  }\n\n  setOverlay(overlayRef, data) {\n    this.setState({\n      overlay: {\n        overlayRef,\n        data\n      }\n    });\n  }\n\n  configureTypekit() {// Do nothing for Uxp - skip loading typekit for UXP\n  }\n\n  componentDidMount() {\n    // use this prop to use any host specified theme in your extension, by default no host styling is applied\n    if (this.props.useHostThemes) {\n      (0, _hostStyleConfig.default)();\n    }\n\n    this.providerRef.setAttribute('setOverlay', this.setOverlay.bind(this));\n  }\n\n  render() {\n    let _this$props = this.props,\n        {\n      theme = 'light',\n      scale = 'medium',\n      productId = '',\n      disableNativeControls,\n      boundariesElement,\n      className,\n      style: otherStyles = {},\n      children,\n      locale,\n      featureFlags = featureFlagsState\n    } = _this$props,\n        otherProps = _objectWithoutProperties(_this$props, [\"theme\", \"scale\", \"productId\", \"disableNativeControls\", \"boundariesElement\", \"className\", \"style\", \"children\", \"locale\", \"featureFlags\"]);\n\n    const {\n      overlay\n    } = this.state;\n    return /*#__PURE__*/_react.default.createElement(SpectrumContext.Provider, {\n      value: {\n        theme,\n        scale,\n        productId,\n        boundariesElement,\n        disableNativeControls,\n        overlay,\n        featureFlags\n      }\n    }, /*#__PURE__*/_react.default.createElement(\"div\", _extends({\n      // Truncate locales like zh-CN, zh-TW to zh to match with the CSS selector.\n      lang: locale == null ? 'en' : locale.substring(0, 2),\n      ref: r => this.providerRef = r\n    }, (0, _filterDOMProps.default)(otherProps), {\n      style: Object.assign({}, otherStyles),\n      className: (0, _classnames.default)('react-spectrum-provider', `spectrum--${theme}`, className, `spectrum--${scale}`, 'spectrum', 'spectrum--override')\n    }), typeof children !== 'string' && children));\n  }\n\n}\n\nexports.default = UxpProvider;\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(16)))//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTYyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0b3JxLW5hdGl2ZS9yZWFjdC1zcGVjdHJ1bS9Qcm92aWRlci9qcy9VeHBQcm92aWRlci5qcz9jNzMyIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gZXhwb3J0cy5TcGVjdHJ1bUNvbnRleHQgPSB2b2lkIDA7XG5cbnZhciBfY2xhc3NuYW1lcyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcImNsYXNzbmFtZXNcIikpO1xuXG52YXIgX2ZpbHRlckRPTVByb3BzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vLi4vdXRpbHMvZmlsdGVyRE9NUHJvcHNcIikpO1xuXG52YXIgX2ZlYXR1cmVGbGFnID0gcmVxdWlyZShcIi4uLy4uL3V0aWxzL2ZlYXR1cmVGbGFnXCIpO1xuXG52YXIgX2hvc3RTdHlsZUNvbmZpZyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uLy4uL3V0aWxzL2hvc3RTdHlsZUNvbmZpZ1wiKSk7XG5cbnZhciBfb3duZXJEb2N1bWVudCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJlYWN0LW92ZXJsYXlzL2xpYi91dGlscy9vd25lckRvY3VtZW50XCIpKTtcblxudmFyIF9Qcm92aWRlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vUHJvdmlkZXJcIikpO1xuXG52YXIgX3JlYWN0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicmVhY3RcIikpO1xuXG52YXIgX3JlYWN0RG9tID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicmVhY3QtZG9tXCIpKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuZnVuY3Rpb24gX2V4dGVuZHMoKSB7IF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTsgcmV0dXJuIF9leHRlbmRzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH1cblxuZnVuY3Rpb24gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKHNvdXJjZSwgZXhjbHVkZWQpIHsgaWYgKHNvdXJjZSA9PSBudWxsKSByZXR1cm4ge307IHZhciB0YXJnZXQgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShzb3VyY2UsIGV4Y2x1ZGVkKTsgdmFyIGtleSwgaTsgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsgdmFyIHNvdXJjZVN5bWJvbEtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHNvdXJjZSk7IGZvciAoaSA9IDA7IGkgPCBzb3VyY2VTeW1ib2xLZXlzLmxlbmd0aDsgaSsrKSB7IGtleSA9IHNvdXJjZVN5bWJvbEtleXNbaV07IGlmIChleGNsdWRlZC5pbmRleE9mKGtleSkgPj0gMCkgY29udGludWU7IGlmICghT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHNvdXJjZSwga2V5KSkgY29udGludWU7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmZ1bmN0aW9uIF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKHNvdXJjZSwgZXhjbHVkZWQpIHsgaWYgKHNvdXJjZSA9PSBudWxsKSByZXR1cm4ge307IHZhciB0YXJnZXQgPSB7fTsgdmFyIHNvdXJjZUtleXMgPSBPYmplY3Qua2V5cyhzb3VyY2UpOyB2YXIga2V5LCBpOyBmb3IgKGkgPSAwOyBpIDwgc291cmNlS2V5cy5sZW5ndGg7IGkrKykgeyBrZXkgPSBzb3VyY2VLZXlzW2ldOyBpZiAoZXhjbHVkZWQuaW5kZXhPZihrZXkpID49IDApIGNvbnRpbnVlOyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IHJldHVybiB0YXJnZXQ7IH1cblxuaWYgKHByb2Nlc3MuZW52LlNDQUxFX01FRElVTSAmJiBwcm9jZXNzLmVudi5TQ0FMRV9MQVJHRSkge1xuICByZXF1aXJlKFwiLi4vLi4vc3BlY3RydW0tY3NzLW92ZXJyaWRlcy90eXBvZ3JhcGh5L2luZGV4LmNzc1wiKTtcblxuICByZXF1aXJlKFwiLi4vLi4vc3BlY3RydW0tY3NzLW92ZXJyaWRlcy90eXBvZ3JhcGh5L2luZGV4LWRpZmYuY3NzXCIpO1xufSBlbHNlIGlmIChwcm9jZXNzLmVudi5TQ0FMRV9MQVJHRSkge1xuICByZXF1aXJlKFwiLi4vLi4vc3BlY3RydW0tY3NzLW92ZXJyaWRlcy90eXBvZ3JhcGh5L2luZGV4LWxnLmNzc1wiKTtcbn0gZWxzZSB7XG4gIHJlcXVpcmUoXCIuLi8uLi9zcGVjdHJ1bS1jc3Mtb3ZlcnJpZGVzL3R5cG9ncmFwaHkvaW5kZXguY3NzXCIpO1xufVxuXG5pZiAoIXByb2Nlc3MuZW52LlRIRU1FX0xJR0hUICYmICFwcm9jZXNzLmVudi5USEVNRV9EQVJLICYmICFwcm9jZXNzLmVudi5USEVNRV9MSUdIVEVTVCAmJiAhcHJvY2Vzcy5lbnYuVEhFTUVfREFSS0VTVCB8fCBwcm9jZXNzLmVudi5USEVNRV9MSUdIVCkgcmVxdWlyZShcIi4uLy4uL3NwZWN0cnVtLWNzcy1vdmVycmlkZXMvdHlwb2dyYXBoeS9tdWx0aVN0b3BzL2xpZ2h0LmNzc1wiKTtcbmlmICghcHJvY2Vzcy5lbnYuVEhFTUVfTElHSFQgJiYgIXByb2Nlc3MuZW52LlRIRU1FX0RBUksgJiYgIXByb2Nlc3MuZW52LlRIRU1FX0xJR0hURVNUICYmICFwcm9jZXNzLmVudi5USEVNRV9EQVJLRVNUIHx8IHByb2Nlc3MuZW52LlRIRU1FX0RBUkspIHJlcXVpcmUoXCIuLi8uLi9zcGVjdHJ1bS1jc3Mtb3ZlcnJpZGVzL3R5cG9ncmFwaHkvbXVsdGlTdG9wcy9kYXJrLmNzc1wiKTtcbmlmICghcHJvY2Vzcy5lbnYuVEhFTUVfTElHSFQgJiYgIXByb2Nlc3MuZW52LlRIRU1FX0RBUksgJiYgIXByb2Nlc3MuZW52LlRIRU1FX0xJR0hURVNUICYmICFwcm9jZXNzLmVudi5USEVNRV9EQVJLRVNUIHx8IHByb2Nlc3MuZW52LlRIRU1FX0xJR0hURVNUKSByZXF1aXJlKFwiLi4vLi4vc3BlY3RydW0tY3NzLW92ZXJyaWRlcy90eXBvZ3JhcGh5L211bHRpU3RvcHMvbGlnaHRlc3QuY3NzXCIpO1xuaWYgKCFwcm9jZXNzLmVudi5USEVNRV9MSUdIVCAmJiAhcHJvY2Vzcy5lbnYuVEhFTUVfREFSSyAmJiAhcHJvY2Vzcy5lbnYuVEhFTUVfTElHSFRFU1QgJiYgIXByb2Nlc3MuZW52LlRIRU1FX0RBUktFU1QgfHwgcHJvY2Vzcy5lbnYuVEhFTUVfREFSS0VTVCkgcmVxdWlyZShcIi4uLy4uL3NwZWN0cnVtLWNzcy1vdmVycmlkZXMvdHlwb2dyYXBoeS9tdWx0aVN0b3BzL2Rhcmtlc3QuY3NzXCIpO1xuY29uc3QgZmVhdHVyZUZsYWdzU3RhdGUgPSAoMCwgX2ZlYXR1cmVGbGFnLmdldEZlYXR1cmVGbGFncykoKTtcblxuY29uc3QgU3BlY3RydW1Db250ZXh0ID0gLyojX19QVVJFX18qL19yZWFjdC5kZWZhdWx0LmNyZWF0ZUNvbnRleHQoe1xuICB0aGVtZTogJ2xpZ2h0JyxcbiAgc2NhbGU6ICdtZWRpdW0nLFxuICBwcm9kdWN0SWQ6ICdkZWZhdWx0JyxcbiAgYm91bmRhcmllc0VsZW1lbnQ6ICgpID0+ICgwLCBfb3duZXJEb2N1bWVudC5kZWZhdWx0KSh2b2lkIDApLmJvZHksXG4gIGRpc2FibGVOYXRpdmVDb250cm9sczogZmFsc2UsXG4gIG92ZXJsYXk6IG51bGwsXG4gIGZlYXR1cmVGbGFnczogZmVhdHVyZUZsYWdzU3RhdGVcbn0pO1xuXG5leHBvcnRzLlNwZWN0cnVtQ29udGV4dCA9IFNwZWN0cnVtQ29udGV4dDtcblxuY2xhc3MgVXhwUHJvdmlkZXIgZXh0ZW5kcyBfUHJvdmlkZXIuZGVmYXVsdCB7XG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICBvdmVybGF5OiB7XG4gICAgICAgIG92ZXJsYXlSZWY6IG51bGwsXG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICB2aXNpYmxlOiBmYWxzZSxcbiAgICAgICAgICBjYWxsYmFjazogdW5kZWZpbmVkLFxuICAgICAgICAgIGJvdW5kaW5nUmVjdDogbnVsbFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIHNldE92ZXJsYXkob3ZlcmxheVJlZiwgZGF0YSkge1xuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgb3ZlcmxheToge1xuICAgICAgICBvdmVybGF5UmVmLFxuICAgICAgICBkYXRhXG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBjb25maWd1cmVUeXBla2l0KCkgey8vIERvIG5vdGhpbmcgZm9yIFV4cCAtIHNraXAgbG9hZGluZyB0eXBla2l0IGZvciBVWFBcbiAgfVxuXG4gIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgIC8vIHVzZSB0aGlzIHByb3AgdG8gdXNlIGFueSBob3N0IHNwZWNpZmllZCB0aGVtZSBpbiB5b3VyIGV4dGVuc2lvbiwgYnkgZGVmYXVsdCBubyBob3N0IHN0eWxpbmcgaXMgYXBwbGllZFxuICAgIGlmICh0aGlzLnByb3BzLnVzZUhvc3RUaGVtZXMpIHtcbiAgICAgICgwLCBfaG9zdFN0eWxlQ29uZmlnLmRlZmF1bHQpKCk7XG4gICAgfVxuXG4gICAgdGhpcy5wcm92aWRlclJlZi5zZXRBdHRyaWJ1dGUoJ3NldE92ZXJsYXknLCB0aGlzLnNldE92ZXJsYXkuYmluZCh0aGlzKSk7XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgbGV0IF90aGlzJHByb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAge1xuICAgICAgdGhlbWUgPSAnbGlnaHQnLFxuICAgICAgc2NhbGUgPSAnbWVkaXVtJyxcbiAgICAgIHByb2R1Y3RJZCA9ICcnLFxuICAgICAgZGlzYWJsZU5hdGl2ZUNvbnRyb2xzLFxuICAgICAgYm91bmRhcmllc0VsZW1lbnQsXG4gICAgICBjbGFzc05hbWUsXG4gICAgICBzdHlsZTogb3RoZXJTdHlsZXMgPSB7fSxcbiAgICAgIGNoaWxkcmVuLFxuICAgICAgbG9jYWxlLFxuICAgICAgZmVhdHVyZUZsYWdzID0gZmVhdHVyZUZsYWdzU3RhdGVcbiAgICB9ID0gX3RoaXMkcHJvcHMsXG4gICAgICAgIG90aGVyUHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX3RoaXMkcHJvcHMsIFtcInRoZW1lXCIsIFwic2NhbGVcIiwgXCJwcm9kdWN0SWRcIiwgXCJkaXNhYmxlTmF0aXZlQ29udHJvbHNcIiwgXCJib3VuZGFyaWVzRWxlbWVudFwiLCBcImNsYXNzTmFtZVwiLCBcInN0eWxlXCIsIFwiY2hpbGRyZW5cIiwgXCJsb2NhbGVcIiwgXCJmZWF0dXJlRmxhZ3NcIl0pO1xuXG4gICAgY29uc3Qge1xuICAgICAgb3ZlcmxheVxuICAgIH0gPSB0aGlzLnN0YXRlO1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovX3JlYWN0LmRlZmF1bHQuY3JlYXRlRWxlbWVudChTcGVjdHJ1bUNvbnRleHQuUHJvdmlkZXIsIHtcbiAgICAgIHZhbHVlOiB7XG4gICAgICAgIHRoZW1lLFxuICAgICAgICBzY2FsZSxcbiAgICAgICAgcHJvZHVjdElkLFxuICAgICAgICBib3VuZGFyaWVzRWxlbWVudCxcbiAgICAgICAgZGlzYWJsZU5hdGl2ZUNvbnRyb2xzLFxuICAgICAgICBvdmVybGF5LFxuICAgICAgICBmZWF0dXJlRmxhZ3NcbiAgICAgIH1cbiAgICB9LCAvKiNfX1BVUkVfXyovX3JlYWN0LmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLCBfZXh0ZW5kcyh7XG4gICAgICAvLyBUcnVuY2F0ZSBsb2NhbGVzIGxpa2UgemgtQ04sIHpoLVRXIHRvIHpoIHRvIG1hdGNoIHdpdGggdGhlIENTUyBzZWxlY3Rvci5cbiAgICAgIGxhbmc6IGxvY2FsZSA9PSBudWxsID8gJ2VuJyA6IGxvY2FsZS5zdWJzdHJpbmcoMCwgMiksXG4gICAgICByZWY6IHIgPT4gdGhpcy5wcm92aWRlclJlZiA9IHJcbiAgICB9LCAoMCwgX2ZpbHRlckRPTVByb3BzLmRlZmF1bHQpKG90aGVyUHJvcHMpLCB7XG4gICAgICBzdHlsZTogT2JqZWN0LmFzc2lnbih7fSwgb3RoZXJTdHlsZXMpLFxuICAgICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXMuZGVmYXVsdCkoJ3JlYWN0LXNwZWN0cnVtLXByb3ZpZGVyJywgYHNwZWN0cnVtLS0ke3RoZW1lfWAsIGNsYXNzTmFtZSwgYHNwZWN0cnVtLS0ke3NjYWxlfWAsICdzcGVjdHJ1bScsICdzcGVjdHJ1bS0tb3ZlcnJpZGUnKVxuICAgIH0pLCB0eXBlb2YgY2hpbGRyZW4gIT09ICdzdHJpbmcnICYmIGNoaWxkcmVuKSk7XG4gIH1cblxufVxuXG5leHBvcnRzLmRlZmF1bHQgPSBVeHBQcm92aWRlcjtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///162\n")},function(module,exports,__webpack_require__){"use strict";eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.getFeatureFlags = getFeatureFlags;\n\nvar _torqVersion = _interopRequireDefault(__webpack_require__(164));\n\nvar _UxpOptions = __webpack_require__(62);\n\nvar _semver = _interopRequireDefault(__webpack_require__(165));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/*************************************************************************\n* ADOBE CONFIDENTIAL\n* ___________________\n*\n* Copyright 2024 Adobe\n* All Rights Reserved.\n*\n* NOTICE: All information contained herein is, and remains\n* the property of Adobe and its suppliers, if any. The intellectual\n* and technical concepts contained herein are proprietary to Adobe\n* and its suppliers and are protected by all applicable intellectual\n* property laws, including trade secret and copyright laws.\n* Dissemination of this information or reproduction of this material\n* is strictly forbidden unless prior written permission is obtained\n* from Adobe.\n**************************************************************************/\n\n/**\n * Retrieves the feature flags based on the manifest file.\n * @returns {Object} An object containing the feature flags.\n */\nconst SUPPORTED_UXP_VERSION = {\n  cssNext: {\n    boxShadow: '7.2.0',\n    transformFunctions: {\n      rotate: '7.2.0',\n      scale: '8.0.0',\n      scaleX: '8.0.0',\n      scaleY: '8.0.0'\n    },\n    transformProperties: {\n      translate: '8.0.0',\n      transformOrigin: '8.0.0'\n    }\n  },\n  updatedResizeBehavior: '8.0.0'\n};\n/**\n * Applies feature flags based on version comparison\n * @param {Object} obj - The object to apply flags to\n * @param {Object} supportedUxpVersion - The supported UXP version object\n * @param {string} currentVersion - The current UXP version\n * @returns {Object} - The object with applied feature flags\n */\n\nconst applyFeatureFlags = (obj, supportedUxpVersion, currentVersion) => {\n  if (typeof obj !== 'object' || obj === null) {\n    // Handle primitive value\n    return _semver.default.gte(currentVersion, supportedUxpVersion);\n  } // handle  nested objects and booleans\n\n\n  for (let key in obj) {\n    if (typeof obj[key] === 'object') {\n      obj[key] = applyFeatureFlags(obj[key], supportedUxpVersion[key], currentVersion);\n    } else if (typeof obj[key] === 'boolean') {\n      obj[key] = _semver.default.gte(currentVersion, supportedUxpVersion[key]);\n    }\n  }\n\n  return obj;\n};\n\nfunction getFeatureFlags() {\n  const torqVersion = (0, _torqVersion.default)();\n  const torqVersionString = `${torqVersion[0]}.${torqVersion[1]}.${torqVersion[2]}`;\n  let featureFlags = {\n    cssNext: {\n      boxShadow: false,\n      transformFunctions: {\n        rotate: false,\n        scale: false,\n        scaleX: false,\n        scaleY: false\n      },\n      transformProperties: {\n        translate: false,\n        transformOrigin: false\n      }\n    },\n    updatedResizeBehavior: false\n  };\n\n  if (_UxpOptions.isUxp) {\n    try {\n      const manifestFile = window.require('fs').readFileSync('plugin:/manifest.json', {\n        encoding: 'utf-8'\n      });\n\n      if (!manifestFile) {\n        throw new Error('Manifest file not found.');\n      }\n\n      const manifestObj = JSON.parse(manifestFile);\n      const featureFlagsObj = manifestObj['featureFlags'];\n\n      if (featureFlagsObj !== null && featureFlagsObj !== void 0 && featureFlagsObj.enableSWCSupport) {\n        featureFlags = applyFeatureFlags(featureFlags, SUPPORTED_UXP_VERSION, torqVersionString);\n      } else {\n        if (featureFlagsObj !== null && featureFlagsObj !== void 0 && featureFlagsObj.enableUpdatedResizeBehavior) {\n          featureFlags.updatedResizeBehavior = applyFeatureFlags(featureFlags.updatedResizeBehavior, SUPPORTED_UXP_VERSION.updatedResizeBehavior, torqVersionString);\n        }\n\n        if ((featureFlagsObj === null || featureFlagsObj === void 0 ? void 0 : featureFlagsObj.CSSNextSupport) === true) {\n          featureFlags.cssNext = applyFeatureFlags(featureFlags.cssNext, SUPPORTED_UXP_VERSION.cssNext, torqVersionString);\n        }\n\n        if (Array.isArray(featureFlagsObj === null || featureFlagsObj === void 0 ? void 0 : featureFlagsObj.CSSNextSupport)) {\n          featureFlags.cssNext = Object.fromEntries(Object.entries(featureFlags.cssNext).map(([key, value]) => {\n            if (featureFlagsObj !== null && featureFlagsObj !== void 0 && featureFlagsObj.CSSNextSupport.includes(key)) {\n              const transformedValue = applyFeatureFlags(value, SUPPORTED_UXP_VERSION.cssNext[key], torqVersionString);\n              return [key, transformedValue];\n            }\n\n            return [key, value];\n          }));\n        }\n      }\n    } catch (error) {\n      console.error('Error fetching the feature flags:', error);\n    }\n  }\n\n  return Object.freeze(featureFlags);\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTYzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0b3JxLW5hdGl2ZS9yZWFjdC1zcGVjdHJ1bS91dGlscy9mZWF0dXJlRmxhZy5qcz9iMzM1Il0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5nZXRGZWF0dXJlRmxhZ3MgPSBnZXRGZWF0dXJlRmxhZ3M7XG5cbnZhciBfdG9ycVZlcnNpb24gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi91dGlscy90b3JxVmVyc2lvblwiKSk7XG5cbnZhciBfVXhwT3B0aW9ucyA9IHJlcXVpcmUoXCIuL1V4cE9wdGlvbnNcIik7XG5cbnZhciBfc2VtdmVyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwic2VtdmVyXCIpKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiogQURPQkUgQ09ORklERU5USUFMXG4qIF9fX19fX19fX19fX19fX19fX19cbipcbiogQ29weXJpZ2h0IDIwMjQgQWRvYmVcbiogQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbipcbiogTk9USUNFOiBBbGwgaW5mb3JtYXRpb24gY29udGFpbmVkIGhlcmVpbiBpcywgYW5kIHJlbWFpbnNcbiogdGhlIHByb3BlcnR5IG9mIEFkb2JlIGFuZCBpdHMgc3VwcGxpZXJzLCBpZiBhbnkuIFRoZSBpbnRlbGxlY3R1YWxcbiogYW5kIHRlY2huaWNhbCBjb25jZXB0cyBjb250YWluZWQgaGVyZWluIGFyZSBwcm9wcmlldGFyeSB0byBBZG9iZVxuKiBhbmQgaXRzIHN1cHBsaWVycyBhbmQgYXJlIHByb3RlY3RlZCBieSBhbGwgYXBwbGljYWJsZSBpbnRlbGxlY3R1YWxcbiogcHJvcGVydHkgbGF3cywgaW5jbHVkaW5nIHRyYWRlIHNlY3JldCBhbmQgY29weXJpZ2h0IGxhd3MuXG4qIERpc3NlbWluYXRpb24gb2YgdGhpcyBpbmZvcm1hdGlvbiBvciByZXByb2R1Y3Rpb24gb2YgdGhpcyBtYXRlcmlhbFxuKiBpcyBzdHJpY3RseSBmb3JiaWRkZW4gdW5sZXNzIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBpcyBvYnRhaW5lZFxuKiBmcm9tIEFkb2JlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSBmZWF0dXJlIGZsYWdzIGJhc2VkIG9uIHRoZSBtYW5pZmVzdCBmaWxlLlxuICogQHJldHVybnMge09iamVjdH0gQW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGZlYXR1cmUgZmxhZ3MuXG4gKi9cbmNvbnN0IFNVUFBPUlRFRF9VWFBfVkVSU0lPTiA9IHtcbiAgY3NzTmV4dDoge1xuICAgIGJveFNoYWRvdzogJzcuMi4wJyxcbiAgICB0cmFuc2Zvcm1GdW5jdGlvbnM6IHtcbiAgICAgIHJvdGF0ZTogJzcuMi4wJyxcbiAgICAgIHNjYWxlOiAnOC4wLjAnLFxuICAgICAgc2NhbGVYOiAnOC4wLjAnLFxuICAgICAgc2NhbGVZOiAnOC4wLjAnXG4gICAgfSxcbiAgICB0cmFuc2Zvcm1Qcm9wZXJ0aWVzOiB7XG4gICAgICB0cmFuc2xhdGU6ICc4LjAuMCcsXG4gICAgICB0cmFuc2Zvcm1PcmlnaW46ICc4LjAuMCdcbiAgICB9XG4gIH0sXG4gIHVwZGF0ZWRSZXNpemVCZWhhdmlvcjogJzguMC4wJ1xufTtcbi8qKlxuICogQXBwbGllcyBmZWF0dXJlIGZsYWdzIGJhc2VkIG9uIHZlcnNpb24gY29tcGFyaXNvblxuICogQHBhcmFtIHtPYmplY3R9IG9iaiAtIFRoZSBvYmplY3QgdG8gYXBwbHkgZmxhZ3MgdG9cbiAqIEBwYXJhbSB7T2JqZWN0fSBzdXBwb3J0ZWRVeHBWZXJzaW9uIC0gVGhlIHN1cHBvcnRlZCBVWFAgdmVyc2lvbiBvYmplY3RcbiAqIEBwYXJhbSB7c3RyaW5nfSBjdXJyZW50VmVyc2lvbiAtIFRoZSBjdXJyZW50IFVYUCB2ZXJzaW9uXG4gKiBAcmV0dXJucyB7T2JqZWN0fSAtIFRoZSBvYmplY3Qgd2l0aCBhcHBsaWVkIGZlYXR1cmUgZmxhZ3NcbiAqL1xuXG5jb25zdCBhcHBseUZlYXR1cmVGbGFncyA9IChvYmosIHN1cHBvcnRlZFV4cFZlcnNpb24sIGN1cnJlbnRWZXJzaW9uKSA9PiB7XG4gIGlmICh0eXBlb2Ygb2JqICE9PSAnb2JqZWN0JyB8fCBvYmogPT09IG51bGwpIHtcbiAgICAvLyBIYW5kbGUgcHJpbWl0aXZlIHZhbHVlXG4gICAgcmV0dXJuIF9zZW12ZXIuZGVmYXVsdC5ndGUoY3VycmVudFZlcnNpb24sIHN1cHBvcnRlZFV4cFZlcnNpb24pO1xuICB9IC8vIGhhbmRsZSAgbmVzdGVkIG9iamVjdHMgYW5kIGJvb2xlYW5zXG5cblxuICBmb3IgKGxldCBrZXkgaW4gb2JqKSB7XG4gICAgaWYgKHR5cGVvZiBvYmpba2V5XSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIG9ialtrZXldID0gYXBwbHlGZWF0dXJlRmxhZ3Mob2JqW2tleV0sIHN1cHBvcnRlZFV4cFZlcnNpb25ba2V5XSwgY3VycmVudFZlcnNpb24pO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIG9ialtrZXldID09PSAnYm9vbGVhbicpIHtcbiAgICAgIG9ialtrZXldID0gX3NlbXZlci5kZWZhdWx0Lmd0ZShjdXJyZW50VmVyc2lvbiwgc3VwcG9ydGVkVXhwVmVyc2lvbltrZXldKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gb2JqO1xufTtcblxuZnVuY3Rpb24gZ2V0RmVhdHVyZUZsYWdzKCkge1xuICBjb25zdCB0b3JxVmVyc2lvbiA9ICgwLCBfdG9ycVZlcnNpb24uZGVmYXVsdCkoKTtcbiAgY29uc3QgdG9ycVZlcnNpb25TdHJpbmcgPSBgJHt0b3JxVmVyc2lvblswXX0uJHt0b3JxVmVyc2lvblsxXX0uJHt0b3JxVmVyc2lvblsyXX1gO1xuICBsZXQgZmVhdHVyZUZsYWdzID0ge1xuICAgIGNzc05leHQ6IHtcbiAgICAgIGJveFNoYWRvdzogZmFsc2UsXG4gICAgICB0cmFuc2Zvcm1GdW5jdGlvbnM6IHtcbiAgICAgICAgcm90YXRlOiBmYWxzZSxcbiAgICAgICAgc2NhbGU6IGZhbHNlLFxuICAgICAgICBzY2FsZVg6IGZhbHNlLFxuICAgICAgICBzY2FsZVk6IGZhbHNlXG4gICAgICB9LFxuICAgICAgdHJhbnNmb3JtUHJvcGVydGllczoge1xuICAgICAgICB0cmFuc2xhdGU6IGZhbHNlLFxuICAgICAgICB0cmFuc2Zvcm1PcmlnaW46IGZhbHNlXG4gICAgICB9XG4gICAgfSxcbiAgICB1cGRhdGVkUmVzaXplQmVoYXZpb3I6IGZhbHNlXG4gIH07XG5cbiAgaWYgKF9VeHBPcHRpb25zLmlzVXhwKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG1hbmlmZXN0RmlsZSA9IHdpbmRvdy5yZXF1aXJlKCdmcycpLnJlYWRGaWxlU3luYygncGx1Z2luOi9tYW5pZmVzdC5qc29uJywge1xuICAgICAgICBlbmNvZGluZzogJ3V0Zi04J1xuICAgICAgfSk7XG5cbiAgICAgIGlmICghbWFuaWZlc3RGaWxlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTWFuaWZlc3QgZmlsZSBub3QgZm91bmQuJyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG1hbmlmZXN0T2JqID0gSlNPTi5wYXJzZShtYW5pZmVzdEZpbGUpO1xuICAgICAgY29uc3QgZmVhdHVyZUZsYWdzT2JqID0gbWFuaWZlc3RPYmpbJ2ZlYXR1cmVGbGFncyddO1xuXG4gICAgICBpZiAoZmVhdHVyZUZsYWdzT2JqICE9PSBudWxsICYmIGZlYXR1cmVGbGFnc09iaiAhPT0gdm9pZCAwICYmIGZlYXR1cmVGbGFnc09iai5lbmFibGVTV0NTdXBwb3J0KSB7XG4gICAgICAgIGZlYXR1cmVGbGFncyA9IGFwcGx5RmVhdHVyZUZsYWdzKGZlYXR1cmVGbGFncywgU1VQUE9SVEVEX1VYUF9WRVJTSU9OLCB0b3JxVmVyc2lvblN0cmluZyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoZmVhdHVyZUZsYWdzT2JqICE9PSBudWxsICYmIGZlYXR1cmVGbGFnc09iaiAhPT0gdm9pZCAwICYmIGZlYXR1cmVGbGFnc09iai5lbmFibGVVcGRhdGVkUmVzaXplQmVoYXZpb3IpIHtcbiAgICAgICAgICBmZWF0dXJlRmxhZ3MudXBkYXRlZFJlc2l6ZUJlaGF2aW9yID0gYXBwbHlGZWF0dXJlRmxhZ3MoZmVhdHVyZUZsYWdzLnVwZGF0ZWRSZXNpemVCZWhhdmlvciwgU1VQUE9SVEVEX1VYUF9WRVJTSU9OLnVwZGF0ZWRSZXNpemVCZWhhdmlvciwgdG9ycVZlcnNpb25TdHJpbmcpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKChmZWF0dXJlRmxhZ3NPYmogPT09IG51bGwgfHwgZmVhdHVyZUZsYWdzT2JqID09PSB2b2lkIDAgPyB2b2lkIDAgOiBmZWF0dXJlRmxhZ3NPYmouQ1NTTmV4dFN1cHBvcnQpID09PSB0cnVlKSB7XG4gICAgICAgICAgZmVhdHVyZUZsYWdzLmNzc05leHQgPSBhcHBseUZlYXR1cmVGbGFncyhmZWF0dXJlRmxhZ3MuY3NzTmV4dCwgU1VQUE9SVEVEX1VYUF9WRVJTSU9OLmNzc05leHQsIHRvcnFWZXJzaW9uU3RyaW5nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGZlYXR1cmVGbGFnc09iaiA9PT0gbnVsbCB8fCBmZWF0dXJlRmxhZ3NPYmogPT09IHZvaWQgMCA/IHZvaWQgMCA6IGZlYXR1cmVGbGFnc09iai5DU1NOZXh0U3VwcG9ydCkpIHtcbiAgICAgICAgICBmZWF0dXJlRmxhZ3MuY3NzTmV4dCA9IE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhmZWF0dXJlRmxhZ3MuY3NzTmV4dCkubWFwKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgICAgIGlmIChmZWF0dXJlRmxhZ3NPYmogIT09IG51bGwgJiYgZmVhdHVyZUZsYWdzT2JqICE9PSB2b2lkIDAgJiYgZmVhdHVyZUZsYWdzT2JqLkNTU05leHRTdXBwb3J0LmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgICAgICAgY29uc3QgdHJhbnNmb3JtZWRWYWx1ZSA9IGFwcGx5RmVhdHVyZUZsYWdzKHZhbHVlLCBTVVBQT1JURURfVVhQX1ZFUlNJT04uY3NzTmV4dFtrZXldLCB0b3JxVmVyc2lvblN0cmluZyk7XG4gICAgICAgICAgICAgIHJldHVybiBba2V5LCB0cmFuc2Zvcm1lZFZhbHVlXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIFtrZXksIHZhbHVlXTtcbiAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZmV0Y2hpbmcgdGhlIGZlYXR1cmUgZmxhZ3M6JywgZXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBPYmplY3QuZnJlZXplKGZlYXR1cmVGbGFncyk7XG59XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///163\n")},function(module,exports,__webpack_require__){"use strict";eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = getTorqVersion;\n\n/*************************************************************************\n* ADOBE CONFIDENTIAL\n* ___________________\n*\n* Copyright 2019 Adobe\n* All Rights Reserved.\n*\n* NOTICE: All information contained herein is, and remains\n* the property of Adobe and its suppliers, if any. The intellectual\n* and technical concepts contained herein are proprietary to Adobe\n* and its suppliers and are protected by all applicable intellectual\n* property laws, including trade secret and copyright laws.\n* Dissemination of this information or reproduction of this material\n* is strictly forbidden unless prior written permission is obtained\n* from Adobe.\n**************************************************************************/\nfunction getTorqVersion() {\n  if (window.require('uxp').versions.torq) {\n    let uxpVersion = window.require('uxp').versions.torq;\n\n    var versions = uxpVersion.match(/^([^.]+)\\.([^.]+)\\.(.*?)$/);\n    let majorVersion = parseInt(versions[1].replace(/[^0-9]/g, ''), 10);\n    let minorVersion = parseInt(versions[2], 10);\n    let patchVersion = versions[3] ? parseInt(versions[3].replace(/[^0-9]/g, ''), 10) : 0; // apply a 0 if the patch version is not present    \n\n    return [majorVersion, minorVersion, patchVersion];\n  }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTY0LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0b3JxLW5hdGl2ZS9yZWFjdC1zcGVjdHJ1bS91dGlscy90b3JxVmVyc2lvbi5qcz85NDgxIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gZ2V0VG9ycVZlcnNpb247XG5cbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4qIEFET0JFIENPTkZJREVOVElBTFxuKiBfX19fX19fX19fX19fX19fX19fXG4qXG4qIENvcHlyaWdodCAyMDE5IEFkb2JlXG4qIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4qXG4qIE5PVElDRTogQWxsIGluZm9ybWF0aW9uIGNvbnRhaW5lZCBoZXJlaW4gaXMsIGFuZCByZW1haW5zXG4qIHRoZSBwcm9wZXJ0eSBvZiBBZG9iZSBhbmQgaXRzIHN1cHBsaWVycywgaWYgYW55LiBUaGUgaW50ZWxsZWN0dWFsXG4qIGFuZCB0ZWNobmljYWwgY29uY2VwdHMgY29udGFpbmVkIGhlcmVpbiBhcmUgcHJvcHJpZXRhcnkgdG8gQWRvYmVcbiogYW5kIGl0cyBzdXBwbGllcnMgYW5kIGFyZSBwcm90ZWN0ZWQgYnkgYWxsIGFwcGxpY2FibGUgaW50ZWxsZWN0dWFsXG4qIHByb3BlcnR5IGxhd3MsIGluY2x1ZGluZyB0cmFkZSBzZWNyZXQgYW5kIGNvcHlyaWdodCBsYXdzLlxuKiBEaXNzZW1pbmF0aW9uIG9mIHRoaXMgaW5mb3JtYXRpb24gb3IgcmVwcm9kdWN0aW9uIG9mIHRoaXMgbWF0ZXJpYWxcbiogaXMgc3RyaWN0bHkgZm9yYmlkZGVuIHVubGVzcyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gaXMgb2J0YWluZWRcbiogZnJvbSBBZG9iZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuZnVuY3Rpb24gZ2V0VG9ycVZlcnNpb24oKSB7XG4gIGlmICh3aW5kb3cucmVxdWlyZSgndXhwJykudmVyc2lvbnMudG9ycSkge1xuICAgIGxldCB1eHBWZXJzaW9uID0gd2luZG93LnJlcXVpcmUoJ3V4cCcpLnZlcnNpb25zLnRvcnE7XG5cbiAgICB2YXIgdmVyc2lvbnMgPSB1eHBWZXJzaW9uLm1hdGNoKC9eKFteLl0rKVxcLihbXi5dKylcXC4oLio/KSQvKTtcbiAgICBsZXQgbWFqb3JWZXJzaW9uID0gcGFyc2VJbnQodmVyc2lvbnNbMV0ucmVwbGFjZSgvW14wLTldL2csICcnKSwgMTApO1xuICAgIGxldCBtaW5vclZlcnNpb24gPSBwYXJzZUludCh2ZXJzaW9uc1syXSwgMTApO1xuICAgIGxldCBwYXRjaFZlcnNpb24gPSB2ZXJzaW9uc1szXSA/IHBhcnNlSW50KHZlcnNpb25zWzNdLnJlcGxhY2UoL1teMC05XS9nLCAnJyksIDEwKSA6IDA7IC8vIGFwcGx5IGEgMCBpZiB0aGUgcGF0Y2ggdmVyc2lvbiBpcyBub3QgcHJlc2VudCAgICBcblxuICAgIHJldHVybiBbbWFqb3JWZXJzaW9uLCBtaW5vclZlcnNpb24sIHBhdGNoVmVyc2lvbl07XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///164\n")},function(module,exports,__webpack_require__){eval("// just pre-load all the stuff that index.js lazily exports\nconst internalRe = __webpack_require__(29)\nconst constants = __webpack_require__(35)\nconst SemVer = __webpack_require__(10)\nconst identifiers = __webpack_require__(65)\nconst parse = __webpack_require__(26)\nconst valid = __webpack_require__(166)\nconst clean = __webpack_require__(167)\nconst inc = __webpack_require__(168)\nconst diff = __webpack_require__(169)\nconst major = __webpack_require__(170)\nconst minor = __webpack_require__(171)\nconst patch = __webpack_require__(172)\nconst prerelease = __webpack_require__(173)\nconst compare = __webpack_require__(11)\nconst rcompare = __webpack_require__(174)\nconst compareLoose = __webpack_require__(175)\nconst compareBuild = __webpack_require__(49)\nconst sort = __webpack_require__(176)\nconst rsort = __webpack_require__(177)\nconst gt = __webpack_require__(37)\nconst lt = __webpack_require__(50)\nconst eq = __webpack_require__(66)\nconst neq = __webpack_require__(67)\nconst gte = __webpack_require__(51)\nconst lte = __webpack_require__(52)\nconst cmp = __webpack_require__(68)\nconst coerce = __webpack_require__(178)\nconst Comparator = __webpack_require__(38)\nconst Range = __webpack_require__(12)\nconst satisfies = __webpack_require__(39)\nconst toComparators = __webpack_require__(180)\nconst maxSatisfying = __webpack_require__(181)\nconst minSatisfying = __webpack_require__(182)\nconst minVersion = __webpack_require__(183)\nconst validRange = __webpack_require__(184)\nconst outside = __webpack_require__(53)\nconst gtr = __webpack_require__(185)\nconst ltr = __webpack_require__(186)\nconst intersects = __webpack_require__(187)\nconst simplifyRange = __webpack_require__(188)\nconst subset = __webpack_require__(189)\nmodule.exports = {\n  parse,\n  valid,\n  clean,\n  inc,\n  diff,\n  major,\n  minor,\n  patch,\n  prerelease,\n  compare,\n  rcompare,\n  compareLoose,\n  compareBuild,\n  sort,\n  rsort,\n  gt,\n  lt,\n  eq,\n  neq,\n  gte,\n  lte,\n  cmp,\n  coerce,\n  Comparator,\n  Range,\n  satisfies,\n  toComparators,\n  maxSatisfying,\n  minSatisfying,\n  minVersion,\n  validRange,\n  outside,\n  gtr,\n  ltr,\n  intersects,\n  simplifyRange,\n  subset,\n  SemVer,\n  re: internalRe.re,\n  src: internalRe.src,\n  tokens: internalRe.t,\n  SEMVER_SPEC_VERSION: constants.SEMVER_SPEC_VERSION,\n  RELEASE_TYPES: constants.RELEASE_TYPES,\n  compareIdentifiers: identifiers.compareIdentifiers,\n  rcompareIdentifiers: identifiers.rcompareIdentifiers,\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTY1LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0b3JxLW5hdGl2ZS9yZWFjdC1zcGVjdHJ1bS9ub2RlX21vZHVsZXMvc2VtdmVyL2luZGV4LmpzPzVhZTUiXSwic291cmNlc0NvbnRlbnQiOlsiLy8ganVzdCBwcmUtbG9hZCBhbGwgdGhlIHN0dWZmIHRoYXQgaW5kZXguanMgbGF6aWx5IGV4cG9ydHNcbmNvbnN0IGludGVybmFsUmUgPSByZXF1aXJlKCcuL2ludGVybmFsL3JlJylcbmNvbnN0IGNvbnN0YW50cyA9IHJlcXVpcmUoJy4vaW50ZXJuYWwvY29uc3RhbnRzJylcbmNvbnN0IFNlbVZlciA9IHJlcXVpcmUoJy4vY2xhc3Nlcy9zZW12ZXInKVxuY29uc3QgaWRlbnRpZmllcnMgPSByZXF1aXJlKCcuL2ludGVybmFsL2lkZW50aWZpZXJzJylcbmNvbnN0IHBhcnNlID0gcmVxdWlyZSgnLi9mdW5jdGlvbnMvcGFyc2UnKVxuY29uc3QgdmFsaWQgPSByZXF1aXJlKCcuL2Z1bmN0aW9ucy92YWxpZCcpXG5jb25zdCBjbGVhbiA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL2NsZWFuJylcbmNvbnN0IGluYyA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL2luYycpXG5jb25zdCBkaWZmID0gcmVxdWlyZSgnLi9mdW5jdGlvbnMvZGlmZicpXG5jb25zdCBtYWpvciA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL21ham9yJylcbmNvbnN0IG1pbm9yID0gcmVxdWlyZSgnLi9mdW5jdGlvbnMvbWlub3InKVxuY29uc3QgcGF0Y2ggPSByZXF1aXJlKCcuL2Z1bmN0aW9ucy9wYXRjaCcpXG5jb25zdCBwcmVyZWxlYXNlID0gcmVxdWlyZSgnLi9mdW5jdGlvbnMvcHJlcmVsZWFzZScpXG5jb25zdCBjb21wYXJlID0gcmVxdWlyZSgnLi9mdW5jdGlvbnMvY29tcGFyZScpXG5jb25zdCByY29tcGFyZSA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL3Jjb21wYXJlJylcbmNvbnN0IGNvbXBhcmVMb29zZSA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL2NvbXBhcmUtbG9vc2UnKVxuY29uc3QgY29tcGFyZUJ1aWxkID0gcmVxdWlyZSgnLi9mdW5jdGlvbnMvY29tcGFyZS1idWlsZCcpXG5jb25zdCBzb3J0ID0gcmVxdWlyZSgnLi9mdW5jdGlvbnMvc29ydCcpXG5jb25zdCByc29ydCA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL3Jzb3J0JylcbmNvbnN0IGd0ID0gcmVxdWlyZSgnLi9mdW5jdGlvbnMvZ3QnKVxuY29uc3QgbHQgPSByZXF1aXJlKCcuL2Z1bmN0aW9ucy9sdCcpXG5jb25zdCBlcSA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL2VxJylcbmNvbnN0IG5lcSA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL25lcScpXG5jb25zdCBndGUgPSByZXF1aXJlKCcuL2Z1bmN0aW9ucy9ndGUnKVxuY29uc3QgbHRlID0gcmVxdWlyZSgnLi9mdW5jdGlvbnMvbHRlJylcbmNvbnN0IGNtcCA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL2NtcCcpXG5jb25zdCBjb2VyY2UgPSByZXF1aXJlKCcuL2Z1bmN0aW9ucy9jb2VyY2UnKVxuY29uc3QgQ29tcGFyYXRvciA9IHJlcXVpcmUoJy4vY2xhc3Nlcy9jb21wYXJhdG9yJylcbmNvbnN0IFJhbmdlID0gcmVxdWlyZSgnLi9jbGFzc2VzL3JhbmdlJylcbmNvbnN0IHNhdGlzZmllcyA9IHJlcXVpcmUoJy4vZnVuY3Rpb25zL3NhdGlzZmllcycpXG5jb25zdCB0b0NvbXBhcmF0b3JzID0gcmVxdWlyZSgnLi9yYW5nZXMvdG8tY29tcGFyYXRvcnMnKVxuY29uc3QgbWF4U2F0aXNmeWluZyA9IHJlcXVpcmUoJy4vcmFuZ2VzL21heC1zYXRpc2Z5aW5nJylcbmNvbnN0IG1pblNhdGlzZnlpbmcgPSByZXF1aXJlKCcuL3Jhbmdlcy9taW4tc2F0aXNmeWluZycpXG5jb25zdCBtaW5WZXJzaW9uID0gcmVxdWlyZSgnLi9yYW5nZXMvbWluLXZlcnNpb24nKVxuY29uc3QgdmFsaWRSYW5nZSA9IHJlcXVpcmUoJy4vcmFuZ2VzL3ZhbGlkJylcbmNvbnN0IG91dHNpZGUgPSByZXF1aXJlKCcuL3Jhbmdlcy9vdXRzaWRlJylcbmNvbnN0IGd0ciA9IHJlcXVpcmUoJy4vcmFuZ2VzL2d0cicpXG5jb25zdCBsdHIgPSByZXF1aXJlKCcuL3Jhbmdlcy9sdHInKVxuY29uc3QgaW50ZXJzZWN0cyA9IHJlcXVpcmUoJy4vcmFuZ2VzL2ludGVyc2VjdHMnKVxuY29uc3Qgc2ltcGxpZnlSYW5nZSA9IHJlcXVpcmUoJy4vcmFuZ2VzL3NpbXBsaWZ5JylcbmNvbnN0IHN1YnNldCA9IHJlcXVpcmUoJy4vcmFuZ2VzL3N1YnNldCcpXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgcGFyc2UsXG4gIHZhbGlkLFxuICBjbGVhbixcbiAgaW5jLFxuICBkaWZmLFxuICBtYWpvcixcbiAgbWlub3IsXG4gIHBhdGNoLFxuICBwcmVyZWxlYXNlLFxuICBjb21wYXJlLFxuICByY29tcGFyZSxcbiAgY29tcGFyZUxvb3NlLFxuICBjb21wYXJlQnVpbGQsXG4gIHNvcnQsXG4gIHJzb3J0LFxuICBndCxcbiAgbHQsXG4gIGVxLFxuICBuZXEsXG4gIGd0ZSxcbiAgbHRlLFxuICBjbXAsXG4gIGNvZXJjZSxcbiAgQ29tcGFyYXRvcixcbiAgUmFuZ2UsXG4gIHNhdGlzZmllcyxcbiAgdG9Db21wYXJhdG9ycyxcbiAgbWF4U2F0aXNmeWluZyxcbiAgbWluU2F0aXNmeWluZyxcbiAgbWluVmVyc2lvbixcbiAgdmFsaWRSYW5nZSxcbiAgb3V0c2lkZSxcbiAgZ3RyLFxuICBsdHIsXG4gIGludGVyc2VjdHMsXG4gIHNpbXBsaWZ5UmFuZ2UsXG4gIHN1YnNldCxcbiAgU2VtVmVyLFxuICByZTogaW50ZXJuYWxSZS5yZSxcbiAgc3JjOiBpbnRlcm5hbFJlLnNyYyxcbiAgdG9rZW5zOiBpbnRlcm5hbFJlLnQsXG4gIFNFTVZFUl9TUEVDX1ZFUlNJT046IGNvbnN0YW50cy5TRU1WRVJfU1BFQ19WRVJTSU9OLFxuICBSRUxFQVNFX1RZUEVTOiBjb25zdGFudHMuUkVMRUFTRV9UWVBFUyxcbiAgY29tcGFyZUlkZW50aWZpZXJzOiBpZGVudGlmaWVycy5jb21wYXJlSWRlbnRpZmllcnMsXG4gIHJjb21wYXJlSWRlbnRpZmllcnM6IGlkZW50aWZpZXJzLnJjb21wYXJlSWRlbnRpZmllcnMsXG59XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///165\n")},function(module,exports,__webpack_require__){eval("const parse = __webpack_require__(26)\nconst valid = (version, options) => {\n  const v = parse(version, options)\n  return v ? v.version : null\n}\nmodule.exports = valid\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTY2LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0b3JxLW5hdGl2ZS9yZWFjdC1zcGVjdHJ1bS9ub2RlX21vZHVsZXMvc2VtdmVyL2Z1bmN0aW9ucy92YWxpZC5qcz82Y2JhIl0sInNvdXJjZXNDb250ZW50IjpbImNvbnN0IHBhcnNlID0gcmVxdWlyZSgnLi9wYXJzZScpXG5jb25zdCB2YWxpZCA9ICh2ZXJzaW9uLCBvcHRpb25zKSA9PiB7XG4gIGNvbnN0IHYgPSBwYXJzZSh2ZXJzaW9uLCBvcHRpb25zKVxuICByZXR1cm4gdiA/IHYudmVyc2lvbiA6IG51bGxcbn1cbm1vZHVsZS5leHBvcnRzID0gdmFsaWRcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///166\n")},function(module,exports,__webpack_require__){eval("const parse = __webpack_require__(26)\nconst clean = (version, options) => {\n  const s = parse(version.trim().replace(/^[=v]+/, ''), options)\n  return s ? s.version : null\n}\nmodule.exports = clean\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTY3LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0b3JxLW5hdGl2ZS9yZWFjdC1zcGVjdHJ1bS9ub2RlX21vZHVsZXMvc2VtdmVyL2Z1bmN0aW9ucy9jbGVhbi5qcz9jYmRmIl0sInNvdXJjZXNDb250ZW50IjpbImNvbnN0IHBhcnNlID0gcmVxdWlyZSgnLi9wYXJzZScpXG5jb25zdCBjbGVhbiA9ICh2ZXJzaW9uLCBvcHRpb25zKSA9PiB7XG4gIGNvbnN0IHMgPSBwYXJzZSh2ZXJzaW9uLnRyaW0oKS5yZXBsYWNlKC9eWz12XSsvLCAnJyksIG9wdGlvbnMpXG4gIHJldHVybiBzID8gcy52ZXJzaW9uIDogbnVsbFxufVxubW9kdWxlLmV4cG9ydHMgPSBjbGVhblxuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///167\n")},function(module,exports,__webpack_require__){eval("const SemVer = __webpack_require__(10)\n\nconst inc = (version, release, options, identifier, identifierBase) => {\n  if (typeof (options) === 'string') {\n    identifierBase = identifier\n    identifier = options\n    options = undefined\n  }\n\n  try {\n    return new SemVer(\n      version instanceof SemVer ? version.version : version,\n      options\n    ).inc(release, identifier, identifierBase).version\n  } catch (er) {\n    return null\n  }\n}\nmodule.exports = inc\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTY4LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0b3JxLW5hdGl2ZS9yZWFjdC1zcGVjdHJ1bS9ub2RlX21vZHVsZXMvc2VtdmVyL2Z1bmN0aW9ucy9pbmMuanM/OGRmZSJdLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBTZW1WZXIgPSByZXF1aXJlKCcuLi9jbGFzc2VzL3NlbXZlcicpXG5cbmNvbnN0IGluYyA9ICh2ZXJzaW9uLCByZWxlYXNlLCBvcHRpb25zLCBpZGVudGlmaWVyLCBpZGVudGlmaWVyQmFzZSkgPT4ge1xuICBpZiAodHlwZW9mIChvcHRpb25zKSA9PT0gJ3N0cmluZycpIHtcbiAgICBpZGVudGlmaWVyQmFzZSA9IGlkZW50aWZpZXJcbiAgICBpZGVudGlmaWVyID0gb3B0aW9uc1xuICAgIG9wdGlvbnMgPSB1bmRlZmluZWRcbiAgfVxuXG4gIHRyeSB7XG4gICAgcmV0dXJuIG5ldyBTZW1WZXIoXG4gICAgICB2ZXJzaW9uIGluc3RhbmNlb2YgU2VtVmVyID8gdmVyc2lvbi52ZXJzaW9uIDogdmVyc2lvbixcbiAgICAgIG9wdGlvbnNcbiAgICApLmluYyhyZWxlYXNlLCBpZGVudGlmaWVyLCBpZGVudGlmaWVyQmFzZSkudmVyc2lvblxuICB9IGNhdGNoIChlcikge1xuICAgIHJldHVybiBudWxsXG4gIH1cbn1cbm1vZHVsZS5leHBvcnRzID0gaW5jXG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///168\n")},function(module,exports,__webpack_require__){eval("const parse = __webpack_require__(26)\n\nconst diff = (version1, version2) => {\n  const v1 = parse(version1, null, true)\n  const v2 = parse(version2, null, true)\n  const comparison = v1.compare(v2)\n\n  if (comparison === 0) {\n    return null\n  }\n\n  const v1Higher = comparison > 0\n  const highVersion = v1Higher ? v1 : v2\n  const lowVersion = v1Higher ? v2 : v1\n  const highHasPre = !!highVersion.prerelease.length\n  const lowHasPre = !!lowVersion.prerelease.length\n\n  if (lowHasPre && !highHasPre) {\n    // Going from prerelease -> no prerelease requires some special casing\n\n    // If the low version has only a major, then it will always be a major\n    // Some examples:\n    // 1.0.0-1 -> 1.0.0\n    // 1.0.0-1 -> 1.1.1\n    // 1.0.0-1 -> 2.0.0\n    if (!lowVersion.patch && !lowVersion.minor) {\n      return 'major'\n    }\n\n    // If the main part has no difference\n    if (lowVersion.compareMain(highVersion) === 0) {\n      if (lowVersion.minor && !lowVersion.patch) {\n        return 'minor'\n      }\n      return 'patch'\n    }\n  }\n\n  // add the `pre` prefix if we are going to a prerelease version\n  const prefix = highHasPre ? 'pre' : ''\n\n  if (v1.major !== v2.major) {\n    return prefix + 'major'\n  }\n\n  if (v1.minor !== v2.minor) {\n    return prefix + 'minor'\n  }\n\n  if (v1.patch !== v2.patch) {\n    return prefix + 'patch'\n  }\n\n  // high and low are preleases\n  return 'prerelease'\n}\n\nmodule.exports = diff\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTY5LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0b3JxLW5hdGl2ZS9yZWFjdC1zcGVjdHJ1bS9ub2RlX21vZHVsZXMvc2VtdmVyL2Z1bmN0aW9ucy9kaWZmLmpzPzlmZDIiXSwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgcGFyc2UgPSByZXF1aXJlKCcuL3BhcnNlLmpzJylcblxuY29uc3QgZGlmZiA9ICh2ZXJzaW9uMSwgdmVyc2lvbjIpID0+IHtcbiAgY29uc3QgdjEgPSBwYXJzZSh2ZXJzaW9uMSwgbnVsbCwgdHJ1ZSlcbiAgY29uc3QgdjIgPSBwYXJzZSh2ZXJzaW9uMiwgbnVsbCwgdHJ1ZSlcbiAgY29uc3QgY29tcGFyaXNvbiA9IHYxLmNvbXBhcmUodjIpXG5cbiAgaWYgKGNvbXBhcmlzb24gPT09IDApIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgY29uc3QgdjFIaWdoZXIgPSBjb21wYXJpc29uID4gMFxuICBjb25zdCBoaWdoVmVyc2lvbiA9IHYxSGlnaGVyID8gdjEgOiB2MlxuICBjb25zdCBsb3dWZXJzaW9uID0gdjFIaWdoZXIgPyB2MiA6IHYxXG4gIGNvbnN0IGhpZ2hIYXNQcmUgPSAhIWhpZ2hWZXJzaW9uLnByZXJlbGVhc2UubGVuZ3RoXG4gIGNvbnN0IGxvd0hhc1ByZSA9ICEhbG93VmVyc2lvbi5wcmVyZWxlYXNlLmxlbmd0aFxuXG4gIGlmIChsb3dIYXNQcmUgJiYgIWhpZ2hIYXNQcmUpIHtcbiAgICAvLyBHb2luZyBmcm9tIHByZXJlbGVhc2UgLT4gbm8gcHJlcmVsZWFzZSByZXF1aXJlcyBzb21lIHNwZWNpYWwgY2FzaW5nXG5cbiAgICAvLyBJZiB0aGUgbG93IHZlcnNpb24gaGFzIG9ubHkgYSBtYWpvciwgdGhlbiBpdCB3aWxsIGFsd2F5cyBiZSBhIG1ham9yXG4gICAgLy8gU29tZSBleGFtcGxlczpcbiAgICAvLyAxLjAuMC0xIC0+IDEuMC4wXG4gICAgLy8gMS4wLjAtMSAtPiAxLjEuMVxuICAgIC8vIDEuMC4wLTEgLT4gMi4wLjBcbiAgICBpZiAoIWxvd1ZlcnNpb24ucGF0Y2ggJiYgIWxvd1ZlcnNpb24ubWlub3IpIHtcbiAgICAgIHJldHVybiAnbWFqb3InXG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIG1haW4gcGFydCBoYXMgbm8gZGlmZmVyZW5jZVxuICAgIGlmIChsb3dWZXJzaW9uLmNvbXBhcmVNYWluKGhpZ2hWZXJzaW9uKSA9PT0gMCkge1xuICAgICAgaWYgKGxvd1ZlcnNpb24ubWlub3IgJiYgIWxvd1ZlcnNpb24ucGF0Y2gpIHtcbiAgICAgICAgcmV0dXJuICdtaW5vcidcbiAgICAgIH1cbiAgICAgIHJldHVybiAncGF0Y2gnXG4gICAgfVxuICB9XG5cbiAgLy8gYWRkIHRoZSBgcHJlYCBwcmVmaXggaWYgd2UgYXJlIGdvaW5nIHRvIGEgcHJlcmVsZWFzZSB2ZXJzaW9uXG4gIGNvbnN0IHByZWZpeCA9IGhpZ2hIYXNQcmUgPyAncHJlJyA6ICcnXG5cbiAgaWYgKHYxLm1ham9yICE9PSB2Mi5tYWpvcikge1xuICAgIHJldHVybiBwcmVmaXggKyAnbWFqb3InXG4gIH1cblxuICBpZiAodjEubWlub3IgIT09IHYyLm1pbm9yKSB7XG4gICAgcmV0dXJuIHByZWZpeCArICdtaW5vcidcbiAgfVxuXG4gIGlmICh2MS5wYXRjaCAhPT0gdjIucGF0Y2gpIHtcbiAgICByZXR1cm4gcHJlZml4ICsgJ3BhdGNoJ1xuICB9XG5cbiAgLy8gaGlnaCBhbmQgbG93IGFyZSBwcmVsZWFzZXNcbiAgcmV0dXJuICdwcmVyZWxlYXNlJ1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGRpZmZcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///169\n")},function(module,exports,__webpack_require__){eval("const SemVer = __webpack_require__(10)\nconst major = (a, loose) => new SemVer(a, loose).major\nmodule.exports = major\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTcwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0b3JxLW5hdGl2ZS9yZWFjdC1zcGVjdHJ1bS9ub2RlX21vZHVsZXMvc2VtdmVyL2Z1bmN0aW9ucy9tYWpvci5qcz83NDc4Il0sInNvdXJjZXNDb250ZW50IjpbImNvbnN0IFNlbVZlciA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvc2VtdmVyJylcbmNvbnN0IG1ham9yID0gKGEsIGxvb3NlKSA9PiBuZXcgU2VtVmVyKGEsIGxvb3NlKS5tYWpvclxubW9kdWxlLmV4cG9ydHMgPSBtYWpvclxuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///170\n")},function(module,exports,__webpack_require__){eval("const SemVer = __webpack_require__(10)\nconst minor = (a, loose) => new SemVer(a, loose).minor\nmodule.exports = minor\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTcxLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0b3JxLW5hdGl2ZS9yZWFjdC1zcGVjdHJ1bS9ub2RlX21vZHVsZXMvc2VtdmVyL2Z1bmN0aW9ucy9taW5vci5qcz8zNjljIl0sInNvdXJjZXNDb250ZW50IjpbImNvbnN0IFNlbVZlciA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvc2VtdmVyJylcbmNvbnN0IG1pbm9yID0gKGEsIGxvb3NlKSA9PiBuZXcgU2VtVmVyKGEsIGxvb3NlKS5taW5vclxubW9kdWxlLmV4cG9ydHMgPSBtaW5vclxuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///171\n")},function(module,exports,__webpack_require__){eval("const SemVer = __webpack_require__(10)\nconst patch = (a, loose) => new SemVer(a, loose).patch\nmodule.exports = patch\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTcyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0b3JxLW5hdGl2ZS9yZWFjdC1zcGVjdHJ1bS9ub2RlX21vZHVsZXMvc2VtdmVyL2Z1bmN0aW9ucy9wYXRjaC5qcz8xNWQwIl0sInNvdXJjZXNDb250ZW50IjpbImNvbnN0IFNlbVZlciA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvc2VtdmVyJylcbmNvbnN0IHBhdGNoID0gKGEsIGxvb3NlKSA9PiBuZXcgU2VtVmVyKGEsIGxvb3NlKS5wYXRjaFxubW9kdWxlLmV4cG9ydHMgPSBwYXRjaFxuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///172\n")},function(module,exports,__webpack_require__){eval("const parse = __webpack_require__(26)\nconst prerelease = (version, options) => {\n  const parsed = parse(version, options)\n  return (parsed && parsed.prerelease.length) ? parsed.prerelease : null\n}\nmodule.exports = prerelease\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTczLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0b3JxLW5hdGl2ZS9yZWFjdC1zcGVjdHJ1bS9ub2RlX21vZHVsZXMvc2VtdmVyL2Z1bmN0aW9ucy9wcmVyZWxlYXNlLmpzPzZlNjYiXSwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgcGFyc2UgPSByZXF1aXJlKCcuL3BhcnNlJylcbmNvbnN0IHByZXJlbGVhc2UgPSAodmVyc2lvbiwgb3B0aW9ucykgPT4ge1xuICBjb25zdCBwYXJzZWQgPSBwYXJzZSh2ZXJzaW9uLCBvcHRpb25zKVxuICByZXR1cm4gKHBhcnNlZCAmJiBwYXJzZWQucHJlcmVsZWFzZS5sZW5ndGgpID8gcGFyc2VkLnByZXJlbGVhc2UgOiBudWxsXG59XG5tb2R1bGUuZXhwb3J0cyA9IHByZXJlbGVhc2VcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///173\n")},function(module,exports,__webpack_require__){eval("const compare = __webpack_require__(11)\nconst rcompare = (a, b, loose) => compare(b, a, loose)\nmodule.exports = rcompare\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTc0LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0b3JxLW5hdGl2ZS9yZWFjdC1zcGVjdHJ1bS9ub2RlX21vZHVsZXMvc2VtdmVyL2Z1bmN0aW9ucy9yY29tcGFyZS5qcz8wZWQ1Il0sInNvdXJjZXNDb250ZW50IjpbImNvbnN0IGNvbXBhcmUgPSByZXF1aXJlKCcuL2NvbXBhcmUnKVxuY29uc3QgcmNvbXBhcmUgPSAoYSwgYiwgbG9vc2UpID0+IGNvbXBhcmUoYiwgYSwgbG9vc2UpXG5tb2R1bGUuZXhwb3J0cyA9IHJjb21wYXJlXG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///174\n")},function(module,exports,__webpack_require__){eval("const compare = __webpack_require__(11)\nconst compareLoose = (a, b) => compare(a, b, true)\nmodule.exports = compareLoose\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTc1LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0b3JxLW5hdGl2ZS9yZWFjdC1zcGVjdHJ1bS9ub2RlX21vZHVsZXMvc2VtdmVyL2Z1bmN0aW9ucy9jb21wYXJlLWxvb3NlLmpzPzQ4MmIiXSwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgY29tcGFyZSA9IHJlcXVpcmUoJy4vY29tcGFyZScpXG5jb25zdCBjb21wYXJlTG9vc2UgPSAoYSwgYikgPT4gY29tcGFyZShhLCBiLCB0cnVlKVxubW9kdWxlLmV4cG9ydHMgPSBjb21wYXJlTG9vc2VcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///175\n")},function(module,exports,__webpack_require__){eval("const compareBuild = __webpack_require__(49)\nconst sort = (list, loose) => list.sort((a, b) => compareBuild(a, b, loose))\nmodule.exports = sort\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTc2LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0b3JxLW5hdGl2ZS9yZWFjdC1zcGVjdHJ1bS9ub2RlX21vZHVsZXMvc2VtdmVyL2Z1bmN0aW9ucy9zb3J0LmpzPzhhODYiXSwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgY29tcGFyZUJ1aWxkID0gcmVxdWlyZSgnLi9jb21wYXJlLWJ1aWxkJylcbmNvbnN0IHNvcnQgPSAobGlzdCwgbG9vc2UpID0+IGxpc3Quc29ydCgoYSwgYikgPT4gY29tcGFyZUJ1aWxkKGEsIGIsIGxvb3NlKSlcbm1vZHVsZS5leHBvcnRzID0gc29ydFxuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///176\n")},function(module,exports,__webpack_require__){eval("const compareBuild = __webpack_require__(49)\nconst rsort = (list, loose) => list.sort((a, b) => compareBuild(b, a, loose))\nmodule.exports = rsort\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTc3LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0b3JxLW5hdGl2ZS9yZWFjdC1zcGVjdHJ1bS9ub2RlX21vZHVsZXMvc2VtdmVyL2Z1bmN0aW9ucy9yc29ydC5qcz81MDUzIl0sInNvdXJjZXNDb250ZW50IjpbImNvbnN0IGNvbXBhcmVCdWlsZCA9IHJlcXVpcmUoJy4vY29tcGFyZS1idWlsZCcpXG5jb25zdCByc29ydCA9IChsaXN0LCBsb29zZSkgPT4gbGlzdC5zb3J0KChhLCBiKSA9PiBjb21wYXJlQnVpbGQoYiwgYSwgbG9vc2UpKVxubW9kdWxlLmV4cG9ydHMgPSByc29ydFxuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///177\n")},function(module,exports,__webpack_require__){eval("const SemVer = __webpack_require__(10)\nconst parse = __webpack_require__(26)\nconst { safeRe: re, t } = __webpack_require__(29)\n\nconst coerce = (version, options) => {\n  if (version instanceof SemVer) {\n    return version\n  }\n\n  if (typeof version === 'number') {\n    version = String(version)\n  }\n\n  if (typeof version !== 'string') {\n    return null\n  }\n\n  options = options || {}\n\n  let match = null\n  if (!options.rtl) {\n    match = version.match(options.includePrerelease ? re[t.COERCEFULL] : re[t.COERCE])\n  } else {\n    // Find the right-most coercible string that does not share\n    // a terminus with a more left-ward coercible string.\n    // Eg, '1.2.3.4' wants to coerce '2.3.4', not '3.4' or '4'\n    // With includePrerelease option set, '1.2.3.4-rc' wants to coerce '2.3.4-rc', not '2.3.4'\n    //\n    // Walk through the string checking with a /g regexp\n    // Manually set the index so as to pick up overlapping matches.\n    // Stop when we get a match that ends at the string end, since no\n    // coercible string can be more right-ward without the same terminus.\n    const coerceRtlRegex = options.includePrerelease ? re[t.COERCERTLFULL] : re[t.COERCERTL]\n    let next\n    while ((next = coerceRtlRegex.exec(version)) &&\n        (!match || match.index + match[0].length !== version.length)\n    ) {\n      if (!match ||\n            next.index + next[0].length !== match.index + match[0].length) {\n        match = next\n      }\n      coerceRtlRegex.lastIndex = next.index + next[1].length + next[2].length\n    }\n    // leave it in a clean state\n    coerceRtlRegex.lastIndex = -1\n  }\n\n  if (match === null) {\n    return null\n  }\n\n  const major = match[2]\n  const minor = match[3] || '0'\n  const patch = match[4] || '0'\n  const prerelease = options.includePrerelease && match[5] ? `-${match[5]}` : ''\n  const build = options.includePrerelease && match[6] ? `+${match[6]}` : ''\n\n  return parse(`${major}.${minor}.${patch}${prerelease}${build}`, options)\n}\nmodule.exports = coerce\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTc4LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0b3JxLW5hdGl2ZS9yZWFjdC1zcGVjdHJ1bS9ub2RlX21vZHVsZXMvc2VtdmVyL2Z1bmN0aW9ucy9jb2VyY2UuanM/NWRiZSJdLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBTZW1WZXIgPSByZXF1aXJlKCcuLi9jbGFzc2VzL3NlbXZlcicpXG5jb25zdCBwYXJzZSA9IHJlcXVpcmUoJy4vcGFyc2UnKVxuY29uc3QgeyBzYWZlUmU6IHJlLCB0IH0gPSByZXF1aXJlKCcuLi9pbnRlcm5hbC9yZScpXG5cbmNvbnN0IGNvZXJjZSA9ICh2ZXJzaW9uLCBvcHRpb25zKSA9PiB7XG4gIGlmICh2ZXJzaW9uIGluc3RhbmNlb2YgU2VtVmVyKSB7XG4gICAgcmV0dXJuIHZlcnNpb25cbiAgfVxuXG4gIGlmICh0eXBlb2YgdmVyc2lvbiA9PT0gJ251bWJlcicpIHtcbiAgICB2ZXJzaW9uID0gU3RyaW5nKHZlcnNpb24pXG4gIH1cblxuICBpZiAodHlwZW9mIHZlcnNpb24gIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9XG5cbiAgbGV0IG1hdGNoID0gbnVsbFxuICBpZiAoIW9wdGlvbnMucnRsKSB7XG4gICAgbWF0Y2ggPSB2ZXJzaW9uLm1hdGNoKG9wdGlvbnMuaW5jbHVkZVByZXJlbGVhc2UgPyByZVt0LkNPRVJDRUZVTExdIDogcmVbdC5DT0VSQ0VdKVxuICB9IGVsc2Uge1xuICAgIC8vIEZpbmQgdGhlIHJpZ2h0LW1vc3QgY29lcmNpYmxlIHN0cmluZyB0aGF0IGRvZXMgbm90IHNoYXJlXG4gICAgLy8gYSB0ZXJtaW51cyB3aXRoIGEgbW9yZSBsZWZ0LXdhcmQgY29lcmNpYmxlIHN0cmluZy5cbiAgICAvLyBFZywgJzEuMi4zLjQnIHdhbnRzIHRvIGNvZXJjZSAnMi4zLjQnLCBub3QgJzMuNCcgb3IgJzQnXG4gICAgLy8gV2l0aCBpbmNsdWRlUHJlcmVsZWFzZSBvcHRpb24gc2V0LCAnMS4yLjMuNC1yYycgd2FudHMgdG8gY29lcmNlICcyLjMuNC1yYycsIG5vdCAnMi4zLjQnXG4gICAgLy9cbiAgICAvLyBXYWxrIHRocm91Z2ggdGhlIHN0cmluZyBjaGVja2luZyB3aXRoIGEgL2cgcmVnZXhwXG4gICAgLy8gTWFudWFsbHkgc2V0IHRoZSBpbmRleCBzbyBhcyB0byBwaWNrIHVwIG92ZXJsYXBwaW5nIG1hdGNoZXMuXG4gICAgLy8gU3RvcCB3aGVuIHdlIGdldCBhIG1hdGNoIHRoYXQgZW5kcyBhdCB0aGUgc3RyaW5nIGVuZCwgc2luY2Ugbm9cbiAgICAvLyBjb2VyY2libGUgc3RyaW5nIGNhbiBiZSBtb3JlIHJpZ2h0LXdhcmQgd2l0aG91dCB0aGUgc2FtZSB0ZXJtaW51cy5cbiAgICBjb25zdCBjb2VyY2VSdGxSZWdleCA9IG9wdGlvbnMuaW5jbHVkZVByZXJlbGVhc2UgPyByZVt0LkNPRVJDRVJUTEZVTExdIDogcmVbdC5DT0VSQ0VSVExdXG4gICAgbGV0IG5leHRcbiAgICB3aGlsZSAoKG5leHQgPSBjb2VyY2VSdGxSZWdleC5leGVjKHZlcnNpb24pKSAmJlxuICAgICAgICAoIW1hdGNoIHx8IG1hdGNoLmluZGV4ICsgbWF0Y2hbMF0ubGVuZ3RoICE9PSB2ZXJzaW9uLmxlbmd0aClcbiAgICApIHtcbiAgICAgIGlmICghbWF0Y2ggfHxcbiAgICAgICAgICAgIG5leHQuaW5kZXggKyBuZXh0WzBdLmxlbmd0aCAhPT0gbWF0Y2guaW5kZXggKyBtYXRjaFswXS5sZW5ndGgpIHtcbiAgICAgICAgbWF0Y2ggPSBuZXh0XG4gICAgICB9XG4gICAgICBjb2VyY2VSdGxSZWdleC5sYXN0SW5kZXggPSBuZXh0LmluZGV4ICsgbmV4dFsxXS5sZW5ndGggKyBuZXh0WzJdLmxlbmd0aFxuICAgIH1cbiAgICAvLyBsZWF2ZSBpdCBpbiBhIGNsZWFuIHN0YXRlXG4gICAgY29lcmNlUnRsUmVnZXgubGFzdEluZGV4ID0gLTFcbiAgfVxuXG4gIGlmIChtYXRjaCA9PT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICBjb25zdCBtYWpvciA9IG1hdGNoWzJdXG4gIGNvbnN0IG1pbm9yID0gbWF0Y2hbM10gfHwgJzAnXG4gIGNvbnN0IHBhdGNoID0gbWF0Y2hbNF0gfHwgJzAnXG4gIGNvbnN0IHByZXJlbGVhc2UgPSBvcHRpb25zLmluY2x1ZGVQcmVyZWxlYXNlICYmIG1hdGNoWzVdID8gYC0ke21hdGNoWzVdfWAgOiAnJ1xuICBjb25zdCBidWlsZCA9IG9wdGlvbnMuaW5jbHVkZVByZXJlbGVhc2UgJiYgbWF0Y2hbNl0gPyBgKyR7bWF0Y2hbNl19YCA6ICcnXG5cbiAgcmV0dXJuIHBhcnNlKGAke21ham9yfS4ke21pbm9yfS4ke3BhdGNofSR7cHJlcmVsZWFzZX0ke2J1aWxkfWAsIG9wdGlvbnMpXG59XG5tb2R1bGUuZXhwb3J0cyA9IGNvZXJjZVxuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///178\n")},function(module,exports){eval("class LRUCache {\n  constructor () {\n    this.max = 1000\n    this.map = new Map()\n  }\n\n  get (key) {\n    const value = this.map.get(key)\n    if (value === undefined) {\n      return undefined\n    } else {\n      // Remove the key from the map and add it to the end\n      this.map.delete(key)\n      this.map.set(key, value)\n      return value\n    }\n  }\n\n  delete (key) {\n    return this.map.delete(key)\n  }\n\n  set (key, value) {\n    const deleted = this.delete(key)\n\n    if (!deleted && value !== undefined) {\n      // If cache is full, delete the least recently used item\n      if (this.map.size >= this.max) {\n        const firstKey = this.map.keys().next().value\n        this.delete(firstKey)\n      }\n\n      this.map.set(key, value)\n    }\n\n    return this\n  }\n}\n\nmodule.exports = LRUCache\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTc5LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0b3JxLW5hdGl2ZS9yZWFjdC1zcGVjdHJ1bS9ub2RlX21vZHVsZXMvc2VtdmVyL2ludGVybmFsL2xydWNhY2hlLmpzP2JjY2EiXSwic291cmNlc0NvbnRlbnQiOlsiY2xhc3MgTFJVQ2FjaGUge1xuICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgdGhpcy5tYXggPSAxMDAwXG4gICAgdGhpcy5tYXAgPSBuZXcgTWFwKClcbiAgfVxuXG4gIGdldCAoa2V5KSB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLm1hcC5nZXQoa2V5KVxuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFJlbW92ZSB0aGUga2V5IGZyb20gdGhlIG1hcCBhbmQgYWRkIGl0IHRvIHRoZSBlbmRcbiAgICAgIHRoaXMubWFwLmRlbGV0ZShrZXkpXG4gICAgICB0aGlzLm1hcC5zZXQoa2V5LCB2YWx1ZSlcbiAgICAgIHJldHVybiB2YWx1ZVxuICAgIH1cbiAgfVxuXG4gIGRlbGV0ZSAoa2V5KSB7XG4gICAgcmV0dXJuIHRoaXMubWFwLmRlbGV0ZShrZXkpXG4gIH1cblxuICBzZXQgKGtleSwgdmFsdWUpIHtcbiAgICBjb25zdCBkZWxldGVkID0gdGhpcy5kZWxldGUoa2V5KVxuXG4gICAgaWYgKCFkZWxldGVkICYmIHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIElmIGNhY2hlIGlzIGZ1bGwsIGRlbGV0ZSB0aGUgbGVhc3QgcmVjZW50bHkgdXNlZCBpdGVtXG4gICAgICBpZiAodGhpcy5tYXAuc2l6ZSA+PSB0aGlzLm1heCkge1xuICAgICAgICBjb25zdCBmaXJzdEtleSA9IHRoaXMubWFwLmtleXMoKS5uZXh0KCkudmFsdWVcbiAgICAgICAgdGhpcy5kZWxldGUoZmlyc3RLZXkpXG4gICAgICB9XG5cbiAgICAgIHRoaXMubWFwLnNldChrZXksIHZhbHVlKVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBMUlVDYWNoZVxuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///179\n")},function(module,exports,__webpack_require__){eval("const Range = __webpack_require__(12)\n\n// Mostly just for testing and legacy API reasons\nconst toComparators = (range, options) =>\n  new Range(range, options).set\n    .map(comp => comp.map(c => c.value).join(' ').trim().split(' '))\n\nmodule.exports = toComparators\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTgwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0b3JxLW5hdGl2ZS9yZWFjdC1zcGVjdHJ1bS9ub2RlX21vZHVsZXMvc2VtdmVyL3Jhbmdlcy90by1jb21wYXJhdG9ycy5qcz9iODQ1Il0sInNvdXJjZXNDb250ZW50IjpbImNvbnN0IFJhbmdlID0gcmVxdWlyZSgnLi4vY2xhc3Nlcy9yYW5nZScpXG5cbi8vIE1vc3RseSBqdXN0IGZvciB0ZXN0aW5nIGFuZCBsZWdhY3kgQVBJIHJlYXNvbnNcbmNvbnN0IHRvQ29tcGFyYXRvcnMgPSAocmFuZ2UsIG9wdGlvbnMpID0+XG4gIG5ldyBSYW5nZShyYW5nZSwgb3B0aW9ucykuc2V0XG4gICAgLm1hcChjb21wID0+IGNvbXAubWFwKGMgPT4gYy52YWx1ZSkuam9pbignICcpLnRyaW0oKS5zcGxpdCgnICcpKVxuXG5tb2R1bGUuZXhwb3J0cyA9IHRvQ29tcGFyYXRvcnNcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///180\n")},function(module,exports,__webpack_require__){eval("const SemVer = __webpack_require__(10)\nconst Range = __webpack_require__(12)\n\nconst maxSatisfying = (versions, range, options) => {\n  let max = null\n  let maxSV = null\n  let rangeObj = null\n  try {\n    rangeObj = new Range(range, options)\n  } catch (er) {\n    return null\n  }\n  versions.forEach((v) => {\n    if (rangeObj.test(v)) {\n      // satisfies(v, range, options)\n      if (!max || maxSV.compare(v) === -1) {\n        // compare(max, v, true)\n        max = v\n        maxSV = new SemVer(max, options)\n      }\n    }\n  })\n  return max\n}\nmodule.exports = maxSatisfying\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTgxLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0b3JxLW5hdGl2ZS9yZWFjdC1zcGVjdHJ1bS9ub2RlX21vZHVsZXMvc2VtdmVyL3Jhbmdlcy9tYXgtc2F0aXNmeWluZy5qcz8yZTQ4Il0sInNvdXJjZXNDb250ZW50IjpbImNvbnN0IFNlbVZlciA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvc2VtdmVyJylcbmNvbnN0IFJhbmdlID0gcmVxdWlyZSgnLi4vY2xhc3Nlcy9yYW5nZScpXG5cbmNvbnN0IG1heFNhdGlzZnlpbmcgPSAodmVyc2lvbnMsIHJhbmdlLCBvcHRpb25zKSA9PiB7XG4gIGxldCBtYXggPSBudWxsXG4gIGxldCBtYXhTViA9IG51bGxcbiAgbGV0IHJhbmdlT2JqID0gbnVsbFxuICB0cnkge1xuICAgIHJhbmdlT2JqID0gbmV3IFJhbmdlKHJhbmdlLCBvcHRpb25zKVxuICB9IGNhdGNoIChlcikge1xuICAgIHJldHVybiBudWxsXG4gIH1cbiAgdmVyc2lvbnMuZm9yRWFjaCgodikgPT4ge1xuICAgIGlmIChyYW5nZU9iai50ZXN0KHYpKSB7XG4gICAgICAvLyBzYXRpc2ZpZXModiwgcmFuZ2UsIG9wdGlvbnMpXG4gICAgICBpZiAoIW1heCB8fCBtYXhTVi5jb21wYXJlKHYpID09PSAtMSkge1xuICAgICAgICAvLyBjb21wYXJlKG1heCwgdiwgdHJ1ZSlcbiAgICAgICAgbWF4ID0gdlxuICAgICAgICBtYXhTViA9IG5ldyBTZW1WZXIobWF4LCBvcHRpb25zKVxuICAgICAgfVxuICAgIH1cbiAgfSlcbiAgcmV0dXJuIG1heFxufVxubW9kdWxlLmV4cG9ydHMgPSBtYXhTYXRpc2Z5aW5nXG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///181\n")},function(module,exports,__webpack_require__){eval("const SemVer = __webpack_require__(10)\nconst Range = __webpack_require__(12)\nconst minSatisfying = (versions, range, options) => {\n  let min = null\n  let minSV = null\n  let rangeObj = null\n  try {\n    rangeObj = new Range(range, options)\n  } catch (er) {\n    return null\n  }\n  versions.forEach((v) => {\n    if (rangeObj.test(v)) {\n      // satisfies(v, range, options)\n      if (!min || minSV.compare(v) === 1) {\n        // compare(min, v, true)\n        min = v\n        minSV = new SemVer(min, options)\n      }\n    }\n  })\n  return min\n}\nmodule.exports = minSatisfying\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTgyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0b3JxLW5hdGl2ZS9yZWFjdC1zcGVjdHJ1bS9ub2RlX21vZHVsZXMvc2VtdmVyL3Jhbmdlcy9taW4tc2F0aXNmeWluZy5qcz84YzFhIl0sInNvdXJjZXNDb250ZW50IjpbImNvbnN0IFNlbVZlciA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvc2VtdmVyJylcbmNvbnN0IFJhbmdlID0gcmVxdWlyZSgnLi4vY2xhc3Nlcy9yYW5nZScpXG5jb25zdCBtaW5TYXRpc2Z5aW5nID0gKHZlcnNpb25zLCByYW5nZSwgb3B0aW9ucykgPT4ge1xuICBsZXQgbWluID0gbnVsbFxuICBsZXQgbWluU1YgPSBudWxsXG4gIGxldCByYW5nZU9iaiA9IG51bGxcbiAgdHJ5IHtcbiAgICByYW5nZU9iaiA9IG5ldyBSYW5nZShyYW5nZSwgb3B0aW9ucylcbiAgfSBjYXRjaCAoZXIpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG4gIHZlcnNpb25zLmZvckVhY2goKHYpID0+IHtcbiAgICBpZiAocmFuZ2VPYmoudGVzdCh2KSkge1xuICAgICAgLy8gc2F0aXNmaWVzKHYsIHJhbmdlLCBvcHRpb25zKVxuICAgICAgaWYgKCFtaW4gfHwgbWluU1YuY29tcGFyZSh2KSA9PT0gMSkge1xuICAgICAgICAvLyBjb21wYXJlKG1pbiwgdiwgdHJ1ZSlcbiAgICAgICAgbWluID0gdlxuICAgICAgICBtaW5TViA9IG5ldyBTZW1WZXIobWluLCBvcHRpb25zKVxuICAgICAgfVxuICAgIH1cbiAgfSlcbiAgcmV0dXJuIG1pblxufVxubW9kdWxlLmV4cG9ydHMgPSBtaW5TYXRpc2Z5aW5nXG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///182\n")},function(module,exports,__webpack_require__){eval("const SemVer = __webpack_require__(10)\nconst Range = __webpack_require__(12)\nconst gt = __webpack_require__(37)\n\nconst minVersion = (range, loose) => {\n  range = new Range(range, loose)\n\n  let minver = new SemVer('0.0.0')\n  if (range.test(minver)) {\n    return minver\n  }\n\n  minver = new SemVer('0.0.0-0')\n  if (range.test(minver)) {\n    return minver\n  }\n\n  minver = null\n  for (let i = 0; i < range.set.length; ++i) {\n    const comparators = range.set[i]\n\n    let setMin = null\n    comparators.forEach((comparator) => {\n      // Clone to avoid manipulating the comparator's semver object.\n      const compver = new SemVer(comparator.semver.version)\n      switch (comparator.operator) {\n        case '>':\n          if (compver.prerelease.length === 0) {\n            compver.patch++\n          } else {\n            compver.prerelease.push(0)\n          }\n          compver.raw = compver.format()\n          /* fallthrough */\n        case '':\n        case '>=':\n          if (!setMin || gt(compver, setMin)) {\n            setMin = compver\n          }\n          break\n        case '<':\n        case '<=':\n          /* Ignore maximum versions */\n          break\n        /* istanbul ignore next */\n        default:\n          throw new Error(`Unexpected operation: ${comparator.operator}`)\n      }\n    })\n    if (setMin && (!minver || gt(minver, setMin))) {\n      minver = setMin\n    }\n  }\n\n  if (minver && range.test(minver)) {\n    return minver\n  }\n\n  return null\n}\nmodule.exports = minVersion\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTgzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0b3JxLW5hdGl2ZS9yZWFjdC1zcGVjdHJ1bS9ub2RlX21vZHVsZXMvc2VtdmVyL3Jhbmdlcy9taW4tdmVyc2lvbi5qcz84OTgzIl0sInNvdXJjZXNDb250ZW50IjpbImNvbnN0IFNlbVZlciA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvc2VtdmVyJylcbmNvbnN0IFJhbmdlID0gcmVxdWlyZSgnLi4vY2xhc3Nlcy9yYW5nZScpXG5jb25zdCBndCA9IHJlcXVpcmUoJy4uL2Z1bmN0aW9ucy9ndCcpXG5cbmNvbnN0IG1pblZlcnNpb24gPSAocmFuZ2UsIGxvb3NlKSA9PiB7XG4gIHJhbmdlID0gbmV3IFJhbmdlKHJhbmdlLCBsb29zZSlcblxuICBsZXQgbWludmVyID0gbmV3IFNlbVZlcignMC4wLjAnKVxuICBpZiAocmFuZ2UudGVzdChtaW52ZXIpKSB7XG4gICAgcmV0dXJuIG1pbnZlclxuICB9XG5cbiAgbWludmVyID0gbmV3IFNlbVZlcignMC4wLjAtMCcpXG4gIGlmIChyYW5nZS50ZXN0KG1pbnZlcikpIHtcbiAgICByZXR1cm4gbWludmVyXG4gIH1cblxuICBtaW52ZXIgPSBudWxsXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcmFuZ2Uuc2V0Lmxlbmd0aDsgKytpKSB7XG4gICAgY29uc3QgY29tcGFyYXRvcnMgPSByYW5nZS5zZXRbaV1cblxuICAgIGxldCBzZXRNaW4gPSBudWxsXG4gICAgY29tcGFyYXRvcnMuZm9yRWFjaCgoY29tcGFyYXRvcikgPT4ge1xuICAgICAgLy8gQ2xvbmUgdG8gYXZvaWQgbWFuaXB1bGF0aW5nIHRoZSBjb21wYXJhdG9yJ3Mgc2VtdmVyIG9iamVjdC5cbiAgICAgIGNvbnN0IGNvbXB2ZXIgPSBuZXcgU2VtVmVyKGNvbXBhcmF0b3Iuc2VtdmVyLnZlcnNpb24pXG4gICAgICBzd2l0Y2ggKGNvbXBhcmF0b3Iub3BlcmF0b3IpIHtcbiAgICAgICAgY2FzZSAnPic6XG4gICAgICAgICAgaWYgKGNvbXB2ZXIucHJlcmVsZWFzZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGNvbXB2ZXIucGF0Y2grK1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb21wdmVyLnByZXJlbGVhc2UucHVzaCgwKVxuICAgICAgICAgIH1cbiAgICAgICAgICBjb21wdmVyLnJhdyA9IGNvbXB2ZXIuZm9ybWF0KClcbiAgICAgICAgICAvKiBmYWxsdGhyb3VnaCAqL1xuICAgICAgICBjYXNlICcnOlxuICAgICAgICBjYXNlICc+PSc6XG4gICAgICAgICAgaWYgKCFzZXRNaW4gfHwgZ3QoY29tcHZlciwgc2V0TWluKSkge1xuICAgICAgICAgICAgc2V0TWluID0gY29tcHZlclxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlICc8JzpcbiAgICAgICAgY2FzZSAnPD0nOlxuICAgICAgICAgIC8qIElnbm9yZSBtYXhpbXVtIHZlcnNpb25zICovXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgb3BlcmF0aW9uOiAke2NvbXBhcmF0b3Iub3BlcmF0b3J9YClcbiAgICAgIH1cbiAgICB9KVxuICAgIGlmIChzZXRNaW4gJiYgKCFtaW52ZXIgfHwgZ3QobWludmVyLCBzZXRNaW4pKSkge1xuICAgICAgbWludmVyID0gc2V0TWluXG4gICAgfVxuICB9XG5cbiAgaWYgKG1pbnZlciAmJiByYW5nZS50ZXN0KG1pbnZlcikpIHtcbiAgICByZXR1cm4gbWludmVyXG4gIH1cblxuICByZXR1cm4gbnVsbFxufVxubW9kdWxlLmV4cG9ydHMgPSBtaW5WZXJzaW9uXG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///183\n")},function(module,exports,__webpack_require__){eval("const Range = __webpack_require__(12)\nconst validRange = (range, options) => {\n  try {\n    // Return '*' instead of '' so that truthiness works.\n    // This will throw if it's invalid anyway\n    return new Range(range, options).range || '*'\n  } catch (er) {\n    return null\n  }\n}\nmodule.exports = validRange\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTg0LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0b3JxLW5hdGl2ZS9yZWFjdC1zcGVjdHJ1bS9ub2RlX21vZHVsZXMvc2VtdmVyL3Jhbmdlcy92YWxpZC5qcz9jZjUzIl0sInNvdXJjZXNDb250ZW50IjpbImNvbnN0IFJhbmdlID0gcmVxdWlyZSgnLi4vY2xhc3Nlcy9yYW5nZScpXG5jb25zdCB2YWxpZFJhbmdlID0gKHJhbmdlLCBvcHRpb25zKSA9PiB7XG4gIHRyeSB7XG4gICAgLy8gUmV0dXJuICcqJyBpbnN0ZWFkIG9mICcnIHNvIHRoYXQgdHJ1dGhpbmVzcyB3b3Jrcy5cbiAgICAvLyBUaGlzIHdpbGwgdGhyb3cgaWYgaXQncyBpbnZhbGlkIGFueXdheVxuICAgIHJldHVybiBuZXcgUmFuZ2UocmFuZ2UsIG9wdGlvbnMpLnJhbmdlIHx8ICcqJ1xuICB9IGNhdGNoIChlcikge1xuICAgIHJldHVybiBudWxsXG4gIH1cbn1cbm1vZHVsZS5leHBvcnRzID0gdmFsaWRSYW5nZVxuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///184\n")},function(module,exports,__webpack_require__){eval("// Determine if version is greater than all the versions possible in the range.\nconst outside = __webpack_require__(53)\nconst gtr = (version, range, options) => outside(version, range, '>', options)\nmodule.exports = gtr\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTg1LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0b3JxLW5hdGl2ZS9yZWFjdC1zcGVjdHJ1bS9ub2RlX21vZHVsZXMvc2VtdmVyL3Jhbmdlcy9ndHIuanM/MTk5YyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBEZXRlcm1pbmUgaWYgdmVyc2lvbiBpcyBncmVhdGVyIHRoYW4gYWxsIHRoZSB2ZXJzaW9ucyBwb3NzaWJsZSBpbiB0aGUgcmFuZ2UuXG5jb25zdCBvdXRzaWRlID0gcmVxdWlyZSgnLi9vdXRzaWRlJylcbmNvbnN0IGd0ciA9ICh2ZXJzaW9uLCByYW5nZSwgb3B0aW9ucykgPT4gb3V0c2lkZSh2ZXJzaW9uLCByYW5nZSwgJz4nLCBvcHRpb25zKVxubW9kdWxlLmV4cG9ydHMgPSBndHJcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///185\n")},function(module,exports,__webpack_require__){eval("const outside = __webpack_require__(53)\n// Determine if version is less than all the versions possible in the range\nconst ltr = (version, range, options) => outside(version, range, '<', options)\nmodule.exports = ltr\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTg2LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0b3JxLW5hdGl2ZS9yZWFjdC1zcGVjdHJ1bS9ub2RlX21vZHVsZXMvc2VtdmVyL3Jhbmdlcy9sdHIuanM/ZmJiMCJdLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBvdXRzaWRlID0gcmVxdWlyZSgnLi9vdXRzaWRlJylcbi8vIERldGVybWluZSBpZiB2ZXJzaW9uIGlzIGxlc3MgdGhhbiBhbGwgdGhlIHZlcnNpb25zIHBvc3NpYmxlIGluIHRoZSByYW5nZVxuY29uc3QgbHRyID0gKHZlcnNpb24sIHJhbmdlLCBvcHRpb25zKSA9PiBvdXRzaWRlKHZlcnNpb24sIHJhbmdlLCAnPCcsIG9wdGlvbnMpXG5tb2R1bGUuZXhwb3J0cyA9IGx0clxuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///186\n")},function(module,exports,__webpack_require__){eval("const Range = __webpack_require__(12)\nconst intersects = (r1, r2, options) => {\n  r1 = new Range(r1, options)\n  r2 = new Range(r2, options)\n  return r1.intersects(r2, options)\n}\nmodule.exports = intersects\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTg3LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0b3JxLW5hdGl2ZS9yZWFjdC1zcGVjdHJ1bS9ub2RlX21vZHVsZXMvc2VtdmVyL3Jhbmdlcy9pbnRlcnNlY3RzLmpzPzYwOGUiXSwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgUmFuZ2UgPSByZXF1aXJlKCcuLi9jbGFzc2VzL3JhbmdlJylcbmNvbnN0IGludGVyc2VjdHMgPSAocjEsIHIyLCBvcHRpb25zKSA9PiB7XG4gIHIxID0gbmV3IFJhbmdlKHIxLCBvcHRpb25zKVxuICByMiA9IG5ldyBSYW5nZShyMiwgb3B0aW9ucylcbiAgcmV0dXJuIHIxLmludGVyc2VjdHMocjIsIG9wdGlvbnMpXG59XG5tb2R1bGUuZXhwb3J0cyA9IGludGVyc2VjdHNcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///187\n")},function(module,exports,__webpack_require__){eval("// given a set of versions and a range, create a \"simplified\" range\n// that includes the same versions that the original range does\n// If the original range is shorter than the simplified one, return that.\nconst satisfies = __webpack_require__(39)\nconst compare = __webpack_require__(11)\nmodule.exports = (versions, range, options) => {\n  const set = []\n  let first = null\n  let prev = null\n  const v = versions.sort((a, b) => compare(a, b, options))\n  for (const version of v) {\n    const included = satisfies(version, range, options)\n    if (included) {\n      prev = version\n      if (!first) {\n        first = version\n      }\n    } else {\n      if (prev) {\n        set.push([first, prev])\n      }\n      prev = null\n      first = null\n    }\n  }\n  if (first) {\n    set.push([first, null])\n  }\n\n  const ranges = []\n  for (const [min, max] of set) {\n    if (min === max) {\n      ranges.push(min)\n    } else if (!max && min === v[0]) {\n      ranges.push('*')\n    } else if (!max) {\n      ranges.push(`>=${min}`)\n    } else if (min === v[0]) {\n      ranges.push(`<=${max}`)\n    } else {\n      ranges.push(`${min} - ${max}`)\n    }\n  }\n  const simplified = ranges.join(' || ')\n  const original = typeof range.raw === 'string' ? range.raw : String(range)\n  return simplified.length < original.length ? simplified : range\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTg4LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0b3JxLW5hdGl2ZS9yZWFjdC1zcGVjdHJ1bS9ub2RlX21vZHVsZXMvc2VtdmVyL3Jhbmdlcy9zaW1wbGlmeS5qcz85NmI4Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIGdpdmVuIGEgc2V0IG9mIHZlcnNpb25zIGFuZCBhIHJhbmdlLCBjcmVhdGUgYSBcInNpbXBsaWZpZWRcIiByYW5nZVxuLy8gdGhhdCBpbmNsdWRlcyB0aGUgc2FtZSB2ZXJzaW9ucyB0aGF0IHRoZSBvcmlnaW5hbCByYW5nZSBkb2VzXG4vLyBJZiB0aGUgb3JpZ2luYWwgcmFuZ2UgaXMgc2hvcnRlciB0aGFuIHRoZSBzaW1wbGlmaWVkIG9uZSwgcmV0dXJuIHRoYXQuXG5jb25zdCBzYXRpc2ZpZXMgPSByZXF1aXJlKCcuLi9mdW5jdGlvbnMvc2F0aXNmaWVzLmpzJylcbmNvbnN0IGNvbXBhcmUgPSByZXF1aXJlKCcuLi9mdW5jdGlvbnMvY29tcGFyZS5qcycpXG5tb2R1bGUuZXhwb3J0cyA9ICh2ZXJzaW9ucywgcmFuZ2UsIG9wdGlvbnMpID0+IHtcbiAgY29uc3Qgc2V0ID0gW11cbiAgbGV0IGZpcnN0ID0gbnVsbFxuICBsZXQgcHJldiA9IG51bGxcbiAgY29uc3QgdiA9IHZlcnNpb25zLnNvcnQoKGEsIGIpID0+IGNvbXBhcmUoYSwgYiwgb3B0aW9ucykpXG4gIGZvciAoY29uc3QgdmVyc2lvbiBvZiB2KSB7XG4gICAgY29uc3QgaW5jbHVkZWQgPSBzYXRpc2ZpZXModmVyc2lvbiwgcmFuZ2UsIG9wdGlvbnMpXG4gICAgaWYgKGluY2x1ZGVkKSB7XG4gICAgICBwcmV2ID0gdmVyc2lvblxuICAgICAgaWYgKCFmaXJzdCkge1xuICAgICAgICBmaXJzdCA9IHZlcnNpb25cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHByZXYpIHtcbiAgICAgICAgc2V0LnB1c2goW2ZpcnN0LCBwcmV2XSlcbiAgICAgIH1cbiAgICAgIHByZXYgPSBudWxsXG4gICAgICBmaXJzdCA9IG51bGxcbiAgICB9XG4gIH1cbiAgaWYgKGZpcnN0KSB7XG4gICAgc2V0LnB1c2goW2ZpcnN0LCBudWxsXSlcbiAgfVxuXG4gIGNvbnN0IHJhbmdlcyA9IFtdXG4gIGZvciAoY29uc3QgW21pbiwgbWF4XSBvZiBzZXQpIHtcbiAgICBpZiAobWluID09PSBtYXgpIHtcbiAgICAgIHJhbmdlcy5wdXNoKG1pbilcbiAgICB9IGVsc2UgaWYgKCFtYXggJiYgbWluID09PSB2WzBdKSB7XG4gICAgICByYW5nZXMucHVzaCgnKicpXG4gICAgfSBlbHNlIGlmICghbWF4KSB7XG4gICAgICByYW5nZXMucHVzaChgPj0ke21pbn1gKVxuICAgIH0gZWxzZSBpZiAobWluID09PSB2WzBdKSB7XG4gICAgICByYW5nZXMucHVzaChgPD0ke21heH1gKVxuICAgIH0gZWxzZSB7XG4gICAgICByYW5nZXMucHVzaChgJHttaW59IC0gJHttYXh9YClcbiAgICB9XG4gIH1cbiAgY29uc3Qgc2ltcGxpZmllZCA9IHJhbmdlcy5qb2luKCcgfHwgJylcbiAgY29uc3Qgb3JpZ2luYWwgPSB0eXBlb2YgcmFuZ2UucmF3ID09PSAnc3RyaW5nJyA/IHJhbmdlLnJhdyA6IFN0cmluZyhyYW5nZSlcbiAgcmV0dXJuIHNpbXBsaWZpZWQubGVuZ3RoIDwgb3JpZ2luYWwubGVuZ3RoID8gc2ltcGxpZmllZCA6IHJhbmdlXG59XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///188\n")},function(module,exports,__webpack_require__){eval("const Range = __webpack_require__(12)\nconst Comparator = __webpack_require__(38)\nconst { ANY } = Comparator\nconst satisfies = __webpack_require__(39)\nconst compare = __webpack_require__(11)\n\n// Complex range `r1 || r2 || ...` is a subset of `R1 || R2 || ...` iff:\n// - Every simple range `r1, r2, ...` is a null set, OR\n// - Every simple range `r1, r2, ...` which is not a null set is a subset of\n//   some `R1, R2, ...`\n//\n// Simple range `c1 c2 ...` is a subset of simple range `C1 C2 ...` iff:\n// - If c is only the ANY comparator\n//   - If C is only the ANY comparator, return true\n//   - Else if in prerelease mode, return false\n//   - else replace c with `[>=0.0.0]`\n// - If C is only the ANY comparator\n//   - if in prerelease mode, return true\n//   - else replace C with `[>=0.0.0]`\n// - Let EQ be the set of = comparators in c\n// - If EQ is more than one, return true (null set)\n// - Let GT be the highest > or >= comparator in c\n// - Let LT be the lowest < or <= comparator in c\n// - If GT and LT, and GT.semver > LT.semver, return true (null set)\n// - If any C is a = range, and GT or LT are set, return false\n// - If EQ\n//   - If GT, and EQ does not satisfy GT, return true (null set)\n//   - If LT, and EQ does not satisfy LT, return true (null set)\n//   - If EQ satisfies every C, return true\n//   - Else return false\n// - If GT\n//   - If GT.semver is lower than any > or >= comp in C, return false\n//   - If GT is >=, and GT.semver does not satisfy every C, return false\n//   - If GT.semver has a prerelease, and not in prerelease mode\n//     - If no C has a prerelease and the GT.semver tuple, return false\n// - If LT\n//   - If LT.semver is greater than any < or <= comp in C, return false\n//   - If LT is <=, and LT.semver does not satisfy every C, return false\n//   - If GT.semver has a prerelease, and not in prerelease mode\n//     - If no C has a prerelease and the LT.semver tuple, return false\n// - Else return true\n\nconst subset = (sub, dom, options = {}) => {\n  if (sub === dom) {\n    return true\n  }\n\n  sub = new Range(sub, options)\n  dom = new Range(dom, options)\n  let sawNonNull = false\n\n  OUTER: for (const simpleSub of sub.set) {\n    for (const simpleDom of dom.set) {\n      const isSub = simpleSubset(simpleSub, simpleDom, options)\n      sawNonNull = sawNonNull || isSub !== null\n      if (isSub) {\n        continue OUTER\n      }\n    }\n    // the null set is a subset of everything, but null simple ranges in\n    // a complex range should be ignored.  so if we saw a non-null range,\n    // then we know this isn't a subset, but if EVERY simple range was null,\n    // then it is a subset.\n    if (sawNonNull) {\n      return false\n    }\n  }\n  return true\n}\n\nconst minimumVersionWithPreRelease = [new Comparator('>=0.0.0-0')]\nconst minimumVersion = [new Comparator('>=0.0.0')]\n\nconst simpleSubset = (sub, dom, options) => {\n  if (sub === dom) {\n    return true\n  }\n\n  if (sub.length === 1 && sub[0].semver === ANY) {\n    if (dom.length === 1 && dom[0].semver === ANY) {\n      return true\n    } else if (options.includePrerelease) {\n      sub = minimumVersionWithPreRelease\n    } else {\n      sub = minimumVersion\n    }\n  }\n\n  if (dom.length === 1 && dom[0].semver === ANY) {\n    if (options.includePrerelease) {\n      return true\n    } else {\n      dom = minimumVersion\n    }\n  }\n\n  const eqSet = new Set()\n  let gt, lt\n  for (const c of sub) {\n    if (c.operator === '>' || c.operator === '>=') {\n      gt = higherGT(gt, c, options)\n    } else if (c.operator === '<' || c.operator === '<=') {\n      lt = lowerLT(lt, c, options)\n    } else {\n      eqSet.add(c.semver)\n    }\n  }\n\n  if (eqSet.size > 1) {\n    return null\n  }\n\n  let gtltComp\n  if (gt && lt) {\n    gtltComp = compare(gt.semver, lt.semver, options)\n    if (gtltComp > 0) {\n      return null\n    } else if (gtltComp === 0 && (gt.operator !== '>=' || lt.operator !== '<=')) {\n      return null\n    }\n  }\n\n  // will iterate one or zero times\n  for (const eq of eqSet) {\n    if (gt && !satisfies(eq, String(gt), options)) {\n      return null\n    }\n\n    if (lt && !satisfies(eq, String(lt), options)) {\n      return null\n    }\n\n    for (const c of dom) {\n      if (!satisfies(eq, String(c), options)) {\n        return false\n      }\n    }\n\n    return true\n  }\n\n  let higher, lower\n  let hasDomLT, hasDomGT\n  // if the subset has a prerelease, we need a comparator in the superset\n  // with the same tuple and a prerelease, or it's not a subset\n  let needDomLTPre = lt &&\n    !options.includePrerelease &&\n    lt.semver.prerelease.length ? lt.semver : false\n  let needDomGTPre = gt &&\n    !options.includePrerelease &&\n    gt.semver.prerelease.length ? gt.semver : false\n  // exception: <1.2.3-0 is the same as <1.2.3\n  if (needDomLTPre && needDomLTPre.prerelease.length === 1 &&\n      lt.operator === '<' && needDomLTPre.prerelease[0] === 0) {\n    needDomLTPre = false\n  }\n\n  for (const c of dom) {\n    hasDomGT = hasDomGT || c.operator === '>' || c.operator === '>='\n    hasDomLT = hasDomLT || c.operator === '<' || c.operator === '<='\n    if (gt) {\n      if (needDomGTPre) {\n        if (c.semver.prerelease && c.semver.prerelease.length &&\n            c.semver.major === needDomGTPre.major &&\n            c.semver.minor === needDomGTPre.minor &&\n            c.semver.patch === needDomGTPre.patch) {\n          needDomGTPre = false\n        }\n      }\n      if (c.operator === '>' || c.operator === '>=') {\n        higher = higherGT(gt, c, options)\n        if (higher === c && higher !== gt) {\n          return false\n        }\n      } else if (gt.operator === '>=' && !satisfies(gt.semver, String(c), options)) {\n        return false\n      }\n    }\n    if (lt) {\n      if (needDomLTPre) {\n        if (c.semver.prerelease && c.semver.prerelease.length &&\n            c.semver.major === needDomLTPre.major &&\n            c.semver.minor === needDomLTPre.minor &&\n            c.semver.patch === needDomLTPre.patch) {\n          needDomLTPre = false\n        }\n      }\n      if (c.operator === '<' || c.operator === '<=') {\n        lower = lowerLT(lt, c, options)\n        if (lower === c && lower !== lt) {\n          return false\n        }\n      } else if (lt.operator === '<=' && !satisfies(lt.semver, String(c), options)) {\n        return false\n      }\n    }\n    if (!c.operator && (lt || gt) && gtltComp !== 0) {\n      return false\n    }\n  }\n\n  // if there was a < or >, and nothing in the dom, then must be false\n  // UNLESS it was limited by another range in the other direction.\n  // Eg, >1.0.0 <1.0.1 is still a subset of <2.0.0\n  if (gt && hasDomLT && !lt && gtltComp !== 0) {\n    return false\n  }\n\n  if (lt && hasDomGT && !gt && gtltComp !== 0) {\n    return false\n  }\n\n  // we needed a prerelease range in a specific tuple, but didn't get one\n  // then this isn't a subset.  eg >=1.2.3-pre is not a subset of >=1.0.0,\n  // because it includes prereleases in the 1.2.3 tuple\n  if (needDomGTPre || needDomLTPre) {\n    return false\n  }\n\n  return true\n}\n\n// >=1.2.3 is lower than >1.2.3\nconst higherGT = (a, b, options) => {\n  if (!a) {\n    return b\n  }\n  const comp = compare(a.semver, b.semver, options)\n  return comp > 0 ? a\n    : comp < 0 ? b\n    : b.operator === '>' && a.operator === '>=' ? b\n    : a\n}\n\n// <=1.2.3 is higher than <1.2.3\nconst lowerLT = (a, b, options) => {\n  if (!a) {\n    return b\n  }\n  const comp = compare(a.semver, b.semver, options)\n  return comp < 0 ? a\n    : comp > 0 ? b\n    : b.operator === '<' && a.operator === '<=' ? b\n    : a\n}\n\nmodule.exports = subset\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTg5LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0b3JxLW5hdGl2ZS9yZWFjdC1zcGVjdHJ1bS9ub2RlX21vZHVsZXMvc2VtdmVyL3Jhbmdlcy9zdWJzZXQuanM/YjNkYSJdLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBSYW5nZSA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvcmFuZ2UuanMnKVxuY29uc3QgQ29tcGFyYXRvciA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvY29tcGFyYXRvci5qcycpXG5jb25zdCB7IEFOWSB9ID0gQ29tcGFyYXRvclxuY29uc3Qgc2F0aXNmaWVzID0gcmVxdWlyZSgnLi4vZnVuY3Rpb25zL3NhdGlzZmllcy5qcycpXG5jb25zdCBjb21wYXJlID0gcmVxdWlyZSgnLi4vZnVuY3Rpb25zL2NvbXBhcmUuanMnKVxuXG4vLyBDb21wbGV4IHJhbmdlIGByMSB8fCByMiB8fCAuLi5gIGlzIGEgc3Vic2V0IG9mIGBSMSB8fCBSMiB8fCAuLi5gIGlmZjpcbi8vIC0gRXZlcnkgc2ltcGxlIHJhbmdlIGByMSwgcjIsIC4uLmAgaXMgYSBudWxsIHNldCwgT1Jcbi8vIC0gRXZlcnkgc2ltcGxlIHJhbmdlIGByMSwgcjIsIC4uLmAgd2hpY2ggaXMgbm90IGEgbnVsbCBzZXQgaXMgYSBzdWJzZXQgb2Zcbi8vICAgc29tZSBgUjEsIFIyLCAuLi5gXG4vL1xuLy8gU2ltcGxlIHJhbmdlIGBjMSBjMiAuLi5gIGlzIGEgc3Vic2V0IG9mIHNpbXBsZSByYW5nZSBgQzEgQzIgLi4uYCBpZmY6XG4vLyAtIElmIGMgaXMgb25seSB0aGUgQU5ZIGNvbXBhcmF0b3Jcbi8vICAgLSBJZiBDIGlzIG9ubHkgdGhlIEFOWSBjb21wYXJhdG9yLCByZXR1cm4gdHJ1ZVxuLy8gICAtIEVsc2UgaWYgaW4gcHJlcmVsZWFzZSBtb2RlLCByZXR1cm4gZmFsc2Vcbi8vICAgLSBlbHNlIHJlcGxhY2UgYyB3aXRoIGBbPj0wLjAuMF1gXG4vLyAtIElmIEMgaXMgb25seSB0aGUgQU5ZIGNvbXBhcmF0b3Jcbi8vICAgLSBpZiBpbiBwcmVyZWxlYXNlIG1vZGUsIHJldHVybiB0cnVlXG4vLyAgIC0gZWxzZSByZXBsYWNlIEMgd2l0aCBgWz49MC4wLjBdYFxuLy8gLSBMZXQgRVEgYmUgdGhlIHNldCBvZiA9IGNvbXBhcmF0b3JzIGluIGNcbi8vIC0gSWYgRVEgaXMgbW9yZSB0aGFuIG9uZSwgcmV0dXJuIHRydWUgKG51bGwgc2V0KVxuLy8gLSBMZXQgR1QgYmUgdGhlIGhpZ2hlc3QgPiBvciA+PSBjb21wYXJhdG9yIGluIGNcbi8vIC0gTGV0IExUIGJlIHRoZSBsb3dlc3QgPCBvciA8PSBjb21wYXJhdG9yIGluIGNcbi8vIC0gSWYgR1QgYW5kIExULCBhbmQgR1Quc2VtdmVyID4gTFQuc2VtdmVyLCByZXR1cm4gdHJ1ZSAobnVsbCBzZXQpXG4vLyAtIElmIGFueSBDIGlzIGEgPSByYW5nZSwgYW5kIEdUIG9yIExUIGFyZSBzZXQsIHJldHVybiBmYWxzZVxuLy8gLSBJZiBFUVxuLy8gICAtIElmIEdULCBhbmQgRVEgZG9lcyBub3Qgc2F0aXNmeSBHVCwgcmV0dXJuIHRydWUgKG51bGwgc2V0KVxuLy8gICAtIElmIExULCBhbmQgRVEgZG9lcyBub3Qgc2F0aXNmeSBMVCwgcmV0dXJuIHRydWUgKG51bGwgc2V0KVxuLy8gICAtIElmIEVRIHNhdGlzZmllcyBldmVyeSBDLCByZXR1cm4gdHJ1ZVxuLy8gICAtIEVsc2UgcmV0dXJuIGZhbHNlXG4vLyAtIElmIEdUXG4vLyAgIC0gSWYgR1Quc2VtdmVyIGlzIGxvd2VyIHRoYW4gYW55ID4gb3IgPj0gY29tcCBpbiBDLCByZXR1cm4gZmFsc2Vcbi8vICAgLSBJZiBHVCBpcyA+PSwgYW5kIEdULnNlbXZlciBkb2VzIG5vdCBzYXRpc2Z5IGV2ZXJ5IEMsIHJldHVybiBmYWxzZVxuLy8gICAtIElmIEdULnNlbXZlciBoYXMgYSBwcmVyZWxlYXNlLCBhbmQgbm90IGluIHByZXJlbGVhc2UgbW9kZVxuLy8gICAgIC0gSWYgbm8gQyBoYXMgYSBwcmVyZWxlYXNlIGFuZCB0aGUgR1Quc2VtdmVyIHR1cGxlLCByZXR1cm4gZmFsc2Vcbi8vIC0gSWYgTFRcbi8vICAgLSBJZiBMVC5zZW12ZXIgaXMgZ3JlYXRlciB0aGFuIGFueSA8IG9yIDw9IGNvbXAgaW4gQywgcmV0dXJuIGZhbHNlXG4vLyAgIC0gSWYgTFQgaXMgPD0sIGFuZCBMVC5zZW12ZXIgZG9lcyBub3Qgc2F0aXNmeSBldmVyeSBDLCByZXR1cm4gZmFsc2Vcbi8vICAgLSBJZiBHVC5zZW12ZXIgaGFzIGEgcHJlcmVsZWFzZSwgYW5kIG5vdCBpbiBwcmVyZWxlYXNlIG1vZGVcbi8vICAgICAtIElmIG5vIEMgaGFzIGEgcHJlcmVsZWFzZSBhbmQgdGhlIExULnNlbXZlciB0dXBsZSwgcmV0dXJuIGZhbHNlXG4vLyAtIEVsc2UgcmV0dXJuIHRydWVcblxuY29uc3Qgc3Vic2V0ID0gKHN1YiwgZG9tLCBvcHRpb25zID0ge30pID0+IHtcbiAgaWYgKHN1YiA9PT0gZG9tKSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIHN1YiA9IG5ldyBSYW5nZShzdWIsIG9wdGlvbnMpXG4gIGRvbSA9IG5ldyBSYW5nZShkb20sIG9wdGlvbnMpXG4gIGxldCBzYXdOb25OdWxsID0gZmFsc2VcblxuICBPVVRFUjogZm9yIChjb25zdCBzaW1wbGVTdWIgb2Ygc3ViLnNldCkge1xuICAgIGZvciAoY29uc3Qgc2ltcGxlRG9tIG9mIGRvbS5zZXQpIHtcbiAgICAgIGNvbnN0IGlzU3ViID0gc2ltcGxlU3Vic2V0KHNpbXBsZVN1Yiwgc2ltcGxlRG9tLCBvcHRpb25zKVxuICAgICAgc2F3Tm9uTnVsbCA9IHNhd05vbk51bGwgfHwgaXNTdWIgIT09IG51bGxcbiAgICAgIGlmIChpc1N1Yikge1xuICAgICAgICBjb250aW51ZSBPVVRFUlxuICAgICAgfVxuICAgIH1cbiAgICAvLyB0aGUgbnVsbCBzZXQgaXMgYSBzdWJzZXQgb2YgZXZlcnl0aGluZywgYnV0IG51bGwgc2ltcGxlIHJhbmdlcyBpblxuICAgIC8vIGEgY29tcGxleCByYW5nZSBzaG91bGQgYmUgaWdub3JlZC4gIHNvIGlmIHdlIHNhdyBhIG5vbi1udWxsIHJhbmdlLFxuICAgIC8vIHRoZW4gd2Uga25vdyB0aGlzIGlzbid0IGEgc3Vic2V0LCBidXQgaWYgRVZFUlkgc2ltcGxlIHJhbmdlIHdhcyBudWxsLFxuICAgIC8vIHRoZW4gaXQgaXMgYSBzdWJzZXQuXG4gICAgaWYgKHNhd05vbk51bGwpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZVxufVxuXG5jb25zdCBtaW5pbXVtVmVyc2lvbldpdGhQcmVSZWxlYXNlID0gW25ldyBDb21wYXJhdG9yKCc+PTAuMC4wLTAnKV1cbmNvbnN0IG1pbmltdW1WZXJzaW9uID0gW25ldyBDb21wYXJhdG9yKCc+PTAuMC4wJyldXG5cbmNvbnN0IHNpbXBsZVN1YnNldCA9IChzdWIsIGRvbSwgb3B0aW9ucykgPT4ge1xuICBpZiAoc3ViID09PSBkb20pIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgaWYgKHN1Yi5sZW5ndGggPT09IDEgJiYgc3ViWzBdLnNlbXZlciA9PT0gQU5ZKSB7XG4gICAgaWYgKGRvbS5sZW5ndGggPT09IDEgJiYgZG9tWzBdLnNlbXZlciA9PT0gQU5ZKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH0gZWxzZSBpZiAob3B0aW9ucy5pbmNsdWRlUHJlcmVsZWFzZSkge1xuICAgICAgc3ViID0gbWluaW11bVZlcnNpb25XaXRoUHJlUmVsZWFzZVxuICAgIH0gZWxzZSB7XG4gICAgICBzdWIgPSBtaW5pbXVtVmVyc2lvblxuICAgIH1cbiAgfVxuXG4gIGlmIChkb20ubGVuZ3RoID09PSAxICYmIGRvbVswXS5zZW12ZXIgPT09IEFOWSkge1xuICAgIGlmIChvcHRpb25zLmluY2x1ZGVQcmVyZWxlYXNlKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH0gZWxzZSB7XG4gICAgICBkb20gPSBtaW5pbXVtVmVyc2lvblxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGVxU2V0ID0gbmV3IFNldCgpXG4gIGxldCBndCwgbHRcbiAgZm9yIChjb25zdCBjIG9mIHN1Yikge1xuICAgIGlmIChjLm9wZXJhdG9yID09PSAnPicgfHwgYy5vcGVyYXRvciA9PT0gJz49Jykge1xuICAgICAgZ3QgPSBoaWdoZXJHVChndCwgYywgb3B0aW9ucylcbiAgICB9IGVsc2UgaWYgKGMub3BlcmF0b3IgPT09ICc8JyB8fCBjLm9wZXJhdG9yID09PSAnPD0nKSB7XG4gICAgICBsdCA9IGxvd2VyTFQobHQsIGMsIG9wdGlvbnMpXG4gICAgfSBlbHNlIHtcbiAgICAgIGVxU2V0LmFkZChjLnNlbXZlcilcbiAgICB9XG4gIH1cblxuICBpZiAoZXFTZXQuc2l6ZSA+IDEpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgbGV0IGd0bHRDb21wXG4gIGlmIChndCAmJiBsdCkge1xuICAgIGd0bHRDb21wID0gY29tcGFyZShndC5zZW12ZXIsIGx0LnNlbXZlciwgb3B0aW9ucylcbiAgICBpZiAoZ3RsdENvbXAgPiAwKSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH0gZWxzZSBpZiAoZ3RsdENvbXAgPT09IDAgJiYgKGd0Lm9wZXJhdG9yICE9PSAnPj0nIHx8IGx0Lm9wZXJhdG9yICE9PSAnPD0nKSkge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG4gIH1cblxuICAvLyB3aWxsIGl0ZXJhdGUgb25lIG9yIHplcm8gdGltZXNcbiAgZm9yIChjb25zdCBlcSBvZiBlcVNldCkge1xuICAgIGlmIChndCAmJiAhc2F0aXNmaWVzKGVxLCBTdHJpbmcoZ3QpLCBvcHRpb25zKSkge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICBpZiAobHQgJiYgIXNhdGlzZmllcyhlcSwgU3RyaW5nKGx0KSwgb3B0aW9ucykpIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBjIG9mIGRvbSkge1xuICAgICAgaWYgKCFzYXRpc2ZpZXMoZXEsIFN0cmluZyhjKSwgb3B0aW9ucykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIGxldCBoaWdoZXIsIGxvd2VyXG4gIGxldCBoYXNEb21MVCwgaGFzRG9tR1RcbiAgLy8gaWYgdGhlIHN1YnNldCBoYXMgYSBwcmVyZWxlYXNlLCB3ZSBuZWVkIGEgY29tcGFyYXRvciBpbiB0aGUgc3VwZXJzZXRcbiAgLy8gd2l0aCB0aGUgc2FtZSB0dXBsZSBhbmQgYSBwcmVyZWxlYXNlLCBvciBpdCdzIG5vdCBhIHN1YnNldFxuICBsZXQgbmVlZERvbUxUUHJlID0gbHQgJiZcbiAgICAhb3B0aW9ucy5pbmNsdWRlUHJlcmVsZWFzZSAmJlxuICAgIGx0LnNlbXZlci5wcmVyZWxlYXNlLmxlbmd0aCA/IGx0LnNlbXZlciA6IGZhbHNlXG4gIGxldCBuZWVkRG9tR1RQcmUgPSBndCAmJlxuICAgICFvcHRpb25zLmluY2x1ZGVQcmVyZWxlYXNlICYmXG4gICAgZ3Quc2VtdmVyLnByZXJlbGVhc2UubGVuZ3RoID8gZ3Quc2VtdmVyIDogZmFsc2VcbiAgLy8gZXhjZXB0aW9uOiA8MS4yLjMtMCBpcyB0aGUgc2FtZSBhcyA8MS4yLjNcbiAgaWYgKG5lZWREb21MVFByZSAmJiBuZWVkRG9tTFRQcmUucHJlcmVsZWFzZS5sZW5ndGggPT09IDEgJiZcbiAgICAgIGx0Lm9wZXJhdG9yID09PSAnPCcgJiYgbmVlZERvbUxUUHJlLnByZXJlbGVhc2VbMF0gPT09IDApIHtcbiAgICBuZWVkRG9tTFRQcmUgPSBmYWxzZVxuICB9XG5cbiAgZm9yIChjb25zdCBjIG9mIGRvbSkge1xuICAgIGhhc0RvbUdUID0gaGFzRG9tR1QgfHwgYy5vcGVyYXRvciA9PT0gJz4nIHx8IGMub3BlcmF0b3IgPT09ICc+PSdcbiAgICBoYXNEb21MVCA9IGhhc0RvbUxUIHx8IGMub3BlcmF0b3IgPT09ICc8JyB8fCBjLm9wZXJhdG9yID09PSAnPD0nXG4gICAgaWYgKGd0KSB7XG4gICAgICBpZiAobmVlZERvbUdUUHJlKSB7XG4gICAgICAgIGlmIChjLnNlbXZlci5wcmVyZWxlYXNlICYmIGMuc2VtdmVyLnByZXJlbGVhc2UubGVuZ3RoICYmXG4gICAgICAgICAgICBjLnNlbXZlci5tYWpvciA9PT0gbmVlZERvbUdUUHJlLm1ham9yICYmXG4gICAgICAgICAgICBjLnNlbXZlci5taW5vciA9PT0gbmVlZERvbUdUUHJlLm1pbm9yICYmXG4gICAgICAgICAgICBjLnNlbXZlci5wYXRjaCA9PT0gbmVlZERvbUdUUHJlLnBhdGNoKSB7XG4gICAgICAgICAgbmVlZERvbUdUUHJlID0gZmFsc2VcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGMub3BlcmF0b3IgPT09ICc+JyB8fCBjLm9wZXJhdG9yID09PSAnPj0nKSB7XG4gICAgICAgIGhpZ2hlciA9IGhpZ2hlckdUKGd0LCBjLCBvcHRpb25zKVxuICAgICAgICBpZiAoaGlnaGVyID09PSBjICYmIGhpZ2hlciAhPT0gZ3QpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChndC5vcGVyYXRvciA9PT0gJz49JyAmJiAhc2F0aXNmaWVzKGd0LnNlbXZlciwgU3RyaW5nKGMpLCBvcHRpb25zKSkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGx0KSB7XG4gICAgICBpZiAobmVlZERvbUxUUHJlKSB7XG4gICAgICAgIGlmIChjLnNlbXZlci5wcmVyZWxlYXNlICYmIGMuc2VtdmVyLnByZXJlbGVhc2UubGVuZ3RoICYmXG4gICAgICAgICAgICBjLnNlbXZlci5tYWpvciA9PT0gbmVlZERvbUxUUHJlLm1ham9yICYmXG4gICAgICAgICAgICBjLnNlbXZlci5taW5vciA9PT0gbmVlZERvbUxUUHJlLm1pbm9yICYmXG4gICAgICAgICAgICBjLnNlbXZlci5wYXRjaCA9PT0gbmVlZERvbUxUUHJlLnBhdGNoKSB7XG4gICAgICAgICAgbmVlZERvbUxUUHJlID0gZmFsc2VcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGMub3BlcmF0b3IgPT09ICc8JyB8fCBjLm9wZXJhdG9yID09PSAnPD0nKSB7XG4gICAgICAgIGxvd2VyID0gbG93ZXJMVChsdCwgYywgb3B0aW9ucylcbiAgICAgICAgaWYgKGxvd2VyID09PSBjICYmIGxvd2VyICE9PSBsdCkge1xuICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGx0Lm9wZXJhdG9yID09PSAnPD0nICYmICFzYXRpc2ZpZXMobHQuc2VtdmVyLCBTdHJpbmcoYyksIG9wdGlvbnMpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIWMub3BlcmF0b3IgJiYgKGx0IHx8IGd0KSAmJiBndGx0Q29tcCAhPT0gMCkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICB9XG5cbiAgLy8gaWYgdGhlcmUgd2FzIGEgPCBvciA+LCBhbmQgbm90aGluZyBpbiB0aGUgZG9tLCB0aGVuIG11c3QgYmUgZmFsc2VcbiAgLy8gVU5MRVNTIGl0IHdhcyBsaW1pdGVkIGJ5IGFub3RoZXIgcmFuZ2UgaW4gdGhlIG90aGVyIGRpcmVjdGlvbi5cbiAgLy8gRWcsID4xLjAuMCA8MS4wLjEgaXMgc3RpbGwgYSBzdWJzZXQgb2YgPDIuMC4wXG4gIGlmIChndCAmJiBoYXNEb21MVCAmJiAhbHQgJiYgZ3RsdENvbXAgIT09IDApIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGlmIChsdCAmJiBoYXNEb21HVCAmJiAhZ3QgJiYgZ3RsdENvbXAgIT09IDApIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8vIHdlIG5lZWRlZCBhIHByZXJlbGVhc2UgcmFuZ2UgaW4gYSBzcGVjaWZpYyB0dXBsZSwgYnV0IGRpZG4ndCBnZXQgb25lXG4gIC8vIHRoZW4gdGhpcyBpc24ndCBhIHN1YnNldC4gIGVnID49MS4yLjMtcHJlIGlzIG5vdCBhIHN1YnNldCBvZiA+PTEuMC4wLFxuICAvLyBiZWNhdXNlIGl0IGluY2x1ZGVzIHByZXJlbGVhc2VzIGluIHRoZSAxLjIuMyB0dXBsZVxuICBpZiAobmVlZERvbUdUUHJlIHx8IG5lZWREb21MVFByZSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgcmV0dXJuIHRydWVcbn1cblxuLy8gPj0xLjIuMyBpcyBsb3dlciB0aGFuID4xLjIuM1xuY29uc3QgaGlnaGVyR1QgPSAoYSwgYiwgb3B0aW9ucykgPT4ge1xuICBpZiAoIWEpIHtcbiAgICByZXR1cm4gYlxuICB9XG4gIGNvbnN0IGNvbXAgPSBjb21wYXJlKGEuc2VtdmVyLCBiLnNlbXZlciwgb3B0aW9ucylcbiAgcmV0dXJuIGNvbXAgPiAwID8gYVxuICAgIDogY29tcCA8IDAgPyBiXG4gICAgOiBiLm9wZXJhdG9yID09PSAnPicgJiYgYS5vcGVyYXRvciA9PT0gJz49JyA/IGJcbiAgICA6IGFcbn1cblxuLy8gPD0xLjIuMyBpcyBoaWdoZXIgdGhhbiA8MS4yLjNcbmNvbnN0IGxvd2VyTFQgPSAoYSwgYiwgb3B0aW9ucykgPT4ge1xuICBpZiAoIWEpIHtcbiAgICByZXR1cm4gYlxuICB9XG4gIGNvbnN0IGNvbXAgPSBjb21wYXJlKGEuc2VtdmVyLCBiLnNlbXZlciwgb3B0aW9ucylcbiAgcmV0dXJuIGNvbXAgPCAwID8gYVxuICAgIDogY29tcCA+IDAgPyBiXG4gICAgOiBiLm9wZXJhdG9yID09PSAnPCcgJiYgYS5vcGVyYXRvciA9PT0gJzw9JyA/IGJcbiAgICA6IGFcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzdWJzZXRcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///189\n")},function(module,exports,__webpack_require__){"use strict";eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = hostStyleConfig;\n\nfunction hostStyleConfig() {\n  const uxp = window.require && window.require('uxp');\n\n  const product = uxp && uxp.host ? uxp.host.name : 'Browser';\n\n  switch (product) {\n    case 'Illustrator':\n      addIllustratorStyles();\n\n      if (window.navigator.platform === 'darwin') {\n        addIllustratorMacOverride();\n      }\n\n      break;\n\n    case 'Photoshop':\n      addPhotoshopStyles();\n      break;\n\n    default:\n      return null;\n  }\n}\n\nfunction addIllustratorMacOverride() {\n  let css = `.react-spectrum-provider:lang(zh-Hant) .spectrum-Menu-item {\n        font-size: 13px;\n    }\n    \n    .react-spectrum-provider:lang(zh-Hant) .spectrum-Textfield {\n        font-size: 13px;\n    } \n    \n    .react-spectrum-provider:lang(zh-Hans) .spectrum-Menu-item {\n        font-size: 13px;\n    }\n    \n    .react-spectrum-provider:lang(zh-Hans) .spectrum-Textfield {\n        font-size: 13px;\n    }\n    `;\n  let head = document.head || document.getElementsByTagName('head')[0];\n  let style = document.createElement('style');\n  head.appendChild(style);\n  style.type = 'text/css';\n  style.appendChild(document.createTextNode(css));\n}\n\nfunction addIllustratorStyles() {\n  let css = `:root {\n        --host-background-color-darkest: #323232;\n        --host-background-color-dark: #535353;\n        --host-background-color-light: #B8B8B8;\n        --host-background-color-lightest: #F0F0F0;\n    }\n    \n    .react-spectrum-provider {\n        font-family: Lucida Grande, Tahoma, sans-serif !important;\n    }\n    \n    .react-spectrum-provider:lang(ja) {\n        font-family: HiraKakuProN-W3, Meiryo, sans-serif !important;\n    }\n    \n    .react-spectrum-provider:lang(zh-Hant) {\n        font-family: LiHeiPro, Tahoma, sans-serif !important;\n    }\n    \n    .react-spectrum-provider:lang(zh-Hans) {\n        font-family: STXihei, SimSun, sans-serif !important;\n    }\n    \n    .react-spectrum-provider:lang(ko) {\n        font-family: AppleGothic, Malgun Gothic, sans-serif !important;\n    }\n    \n    .react-spectrum-provider.spectrum--darkest {\n        background-color: #323232;\n    }\n    \n    .react-spectrum-provider.spectrum--dark {\n        background-color: #535353;\n    }\n    \n    .react-spectrum-provider.spectrum--light {\n        background-color: #B8B8B8;\n    }\n    \n    .react-spectrum-provider.spectrum--lightest {\n        background-color: #F0F0F0;\n    }\n    \n    .react-spectrum-provider .spectrum-Menu-item {\n        font-size: 10px;\n    }\n    \n    .react-spectrum-provider .spectrum-Textfield {\n        font-size: 10px;\n    } \n    \n    .react-spectrum-provider:lang(ja) .spectrum-Menu-item {\n        font-size: 12px;\n    }\n    \n    .react-spectrum-provider:lang(ja) .spectrum-Textfield {\n        font-size: 12px;\n    } \n    \n    .react-spectrum-provider:lang(zh-Hant) .spectrum-Menu-item {\n        font-size: 12px;\n    }\n    \n    .react-spectrum-provider:lang(zh-Hant) .spectrum-Textfield {\n        font-size: 12px;\n    } \n    \n    .react-spectrum-provider:lang(zh-Hans) .spectrum-Menu-item {\n        font-size: 12px;\n    }\n    \n    .react-spectrum-provider:lang(zh-Hans) .spectrum-Textfield {\n        font-size: 12px;\n    }\n    \n    .react-spectrum-provider.spectrum--lightest .spectrum-Menu, .react-spectrum-provider.spectrum--lightest .spectrum-Menu-item, .react-spectrum-provider.spectrum--lightest .spectrum-Popover {\n        background-color: rgb(240, 240, 240);\n    }\n    \n    .react-spectrum-provider.spectrum--light .spectrum-Menu, .react-spectrum-provider.spectrum--light .spectrum-Menu-item, .react-spectrum-provider.spectrum--light .spectrum-Popover {\n        background-color: rgb(184, 184, 184);\n    }\n    \n    .react-spectrum-provider.spectrum--dark .spectrum-Menu, .react-spectrum-provider.spectrum--dark .spectrum-Menu-item, .react-spectrum-provider.spectrum--dark .spectrum-Popover {\n        background-color: rgb(83, 83, 83);\n    }\n    \n    .react-spectrum-provider.spectrum--darkest .spectrum-Menu, .react-spectrum-provider.spectrum--darkest .spectrum-Menu-item, .react-spectrum-provider.spectrum--darkest .spectrum-Popover {\n        background-color: rgb(50, 50, 50);\n    }\n    \n    .react-spectrum-provider.spectrum--lightest .spectrum-Menu-item:hover {\n        background-color: rgb(220, 220, 220);\n        color: rgb(72, 72, 72);\n    }\n    \n    .react-spectrum-provider.spectrum--light .spectrum-Menu-item:hover {\n        background-color: rgb(167, 167, 167);\n        color: rgb(34, 34, 34);\n    }\n    \n    .react-spectrum-provider.spectrum--dark .spectrum-Menu-item:hover {\n        background-color: rgb(95, 95, 95);\n        color: rgb(255, 255, 255);\n    }\n    \n    .react-spectrum-provider.spectrum--darkest .spectrum-Menu-item:hover {\n        background-color: rgb(62, 62, 62);\n        color: rgb(205, 205, 205);\n    }\n    \n    .react-spectrum-provider.spectrum--lightest .spectrum-Textfield, .react-spectrum-provider.spectrum--lightest .spectrum-Textfield .inputText {\n        background-color: rgb(255, 255, 255) !important;\n        color: rgb(72, 72, 72);\n    }\n    \n    .react-spectrum-provider.spectrum--light .spectrum-Textfield, .react-spectrum-provider.spectrum--light .spectrum-Textfield .inputText {\n        background-color: rgb(226, 226, 226) !important;\n        color: rgb(34, 34, 34);\n    }\n    \n    .react-spectrum-provider.spectrum--dark .spectrum-Textfield, .react-spectrum-provider.spectrum--dark .spectrum-Textfield .inputText {\n        background-color: rgb(255, 255, 255) !important;\n        color: rgb(75, 75, 75);\n    }\n    \n    .react-spectrum-provider.spectrum--darkest .spectrum-Textfield, .react-spectrum-provider.spectrum--darkest .spectrum-Textfield .inputText {\n        background-color: rgb(252, 252, 252) !important;\n        color: rgb(42, 42, 42);\n    }\n    `;\n  let head = document.head || document.getElementsByTagName('head')[0];\n  let style = document.createElement('style');\n  head.appendChild(style);\n  style.type = 'text/css';\n  style.appendChild(document.createTextNode(css));\n}\n\nfunction addPhotoshopStyles() {\n  let css = `\n    \n    .react-spectrum-provider {\n        background-color: var(--uxp-host-background-color);\n    }\n    \n    .react-spectrum-provider .spectrum-Menu-item, .react-spectrum-provider .spectrum-Textfield {\n        font-size: 10px;\n        color: var(--uxp-host-text-color);\n    }\n    \n    .react-spectrum-provider .spectrum-Menu, .react-spectrum-provider .spectrum-Menu-item, .react-spectrum-provider .spectrum-Popover {\n        background-color: var(--uxp-host-background-color);\n    }\n    \n    .react-spectrum-provider .spectrum-Menu-item:hover {\n        background-color: var(--uxp-host-link-text-color);\n        color: #FFFFFF;\n    }\n\n    .react-spectrum-provider .spectrum-Textfield, .react-spectrum-provider .spectrum-Textfield .inputText {\n        background-color: var(--uxp-host-background-color) !important;\n    }\n    \n    `;\n  let head = document.head || document.getElementsByTagName('head')[0];\n  let style = document.createElement('style');\n  head.appendChild(style);\n  style.type = 'text/css';\n  style.appendChild(document.createTextNode(css));\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTkwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0b3JxLW5hdGl2ZS9yZWFjdC1zcGVjdHJ1bS91dGlscy9ob3N0U3R5bGVDb25maWcuanM/NGZhZCJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IGhvc3RTdHlsZUNvbmZpZztcblxuZnVuY3Rpb24gaG9zdFN0eWxlQ29uZmlnKCkge1xuICBjb25zdCB1eHAgPSB3aW5kb3cucmVxdWlyZSAmJiB3aW5kb3cucmVxdWlyZSgndXhwJyk7XG5cbiAgY29uc3QgcHJvZHVjdCA9IHV4cCAmJiB1eHAuaG9zdCA/IHV4cC5ob3N0Lm5hbWUgOiAnQnJvd3Nlcic7XG5cbiAgc3dpdGNoIChwcm9kdWN0KSB7XG4gICAgY2FzZSAnSWxsdXN0cmF0b3InOlxuICAgICAgYWRkSWxsdXN0cmF0b3JTdHlsZXMoKTtcblxuICAgICAgaWYgKHdpbmRvdy5uYXZpZ2F0b3IucGxhdGZvcm0gPT09ICdkYXJ3aW4nKSB7XG4gICAgICAgIGFkZElsbHVzdHJhdG9yTWFjT3ZlcnJpZGUoKTtcbiAgICAgIH1cblxuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdQaG90b3Nob3AnOlxuICAgICAgYWRkUGhvdG9zaG9wU3R5bGVzKCk7XG4gICAgICBicmVhaztcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5mdW5jdGlvbiBhZGRJbGx1c3RyYXRvck1hY092ZXJyaWRlKCkge1xuICBsZXQgY3NzID0gYC5yZWFjdC1zcGVjdHJ1bS1wcm92aWRlcjpsYW5nKHpoLUhhbnQpIC5zcGVjdHJ1bS1NZW51LWl0ZW0ge1xuICAgICAgICBmb250LXNpemU6IDEzcHg7XG4gICAgfVxuICAgIFxuICAgIC5yZWFjdC1zcGVjdHJ1bS1wcm92aWRlcjpsYW5nKHpoLUhhbnQpIC5zcGVjdHJ1bS1UZXh0ZmllbGQge1xuICAgICAgICBmb250LXNpemU6IDEzcHg7XG4gICAgfSBcbiAgICBcbiAgICAucmVhY3Qtc3BlY3RydW0tcHJvdmlkZXI6bGFuZyh6aC1IYW5zKSAuc3BlY3RydW0tTWVudS1pdGVtIHtcbiAgICAgICAgZm9udC1zaXplOiAxM3B4O1xuICAgIH1cbiAgICBcbiAgICAucmVhY3Qtc3BlY3RydW0tcHJvdmlkZXI6bGFuZyh6aC1IYW5zKSAuc3BlY3RydW0tVGV4dGZpZWxkIHtcbiAgICAgICAgZm9udC1zaXplOiAxM3B4O1xuICAgIH1cbiAgICBgO1xuICBsZXQgaGVhZCA9IGRvY3VtZW50LmhlYWQgfHwgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2hlYWQnKVswXTtcbiAgbGV0IHN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgaGVhZC5hcHBlbmRDaGlsZChzdHlsZSk7XG4gIHN0eWxlLnR5cGUgPSAndGV4dC9jc3MnO1xuICBzdHlsZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjc3MpKTtcbn1cblxuZnVuY3Rpb24gYWRkSWxsdXN0cmF0b3JTdHlsZXMoKSB7XG4gIGxldCBjc3MgPSBgOnJvb3Qge1xuICAgICAgICAtLWhvc3QtYmFja2dyb3VuZC1jb2xvci1kYXJrZXN0OiAjMzIzMjMyO1xuICAgICAgICAtLWhvc3QtYmFja2dyb3VuZC1jb2xvci1kYXJrOiAjNTM1MzUzO1xuICAgICAgICAtLWhvc3QtYmFja2dyb3VuZC1jb2xvci1saWdodDogI0I4QjhCODtcbiAgICAgICAgLS1ob3N0LWJhY2tncm91bmQtY29sb3ItbGlnaHRlc3Q6ICNGMEYwRjA7XG4gICAgfVxuICAgIFxuICAgIC5yZWFjdC1zcGVjdHJ1bS1wcm92aWRlciB7XG4gICAgICAgIGZvbnQtZmFtaWx5OiBMdWNpZGEgR3JhbmRlLCBUYWhvbWEsIHNhbnMtc2VyaWYgIWltcG9ydGFudDtcbiAgICB9XG4gICAgXG4gICAgLnJlYWN0LXNwZWN0cnVtLXByb3ZpZGVyOmxhbmcoamEpIHtcbiAgICAgICAgZm9udC1mYW1pbHk6IEhpcmFLYWt1UHJvTi1XMywgTWVpcnlvLCBzYW5zLXNlcmlmICFpbXBvcnRhbnQ7XG4gICAgfVxuICAgIFxuICAgIC5yZWFjdC1zcGVjdHJ1bS1wcm92aWRlcjpsYW5nKHpoLUhhbnQpIHtcbiAgICAgICAgZm9udC1mYW1pbHk6IExpSGVpUHJvLCBUYWhvbWEsIHNhbnMtc2VyaWYgIWltcG9ydGFudDtcbiAgICB9XG4gICAgXG4gICAgLnJlYWN0LXNwZWN0cnVtLXByb3ZpZGVyOmxhbmcoemgtSGFucykge1xuICAgICAgICBmb250LWZhbWlseTogU1RYaWhlaSwgU2ltU3VuLCBzYW5zLXNlcmlmICFpbXBvcnRhbnQ7XG4gICAgfVxuICAgIFxuICAgIC5yZWFjdC1zcGVjdHJ1bS1wcm92aWRlcjpsYW5nKGtvKSB7XG4gICAgICAgIGZvbnQtZmFtaWx5OiBBcHBsZUdvdGhpYywgTWFsZ3VuIEdvdGhpYywgc2Fucy1zZXJpZiAhaW1wb3J0YW50O1xuICAgIH1cbiAgICBcbiAgICAucmVhY3Qtc3BlY3RydW0tcHJvdmlkZXIuc3BlY3RydW0tLWRhcmtlc3Qge1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMzIzMjMyO1xuICAgIH1cbiAgICBcbiAgICAucmVhY3Qtc3BlY3RydW0tcHJvdmlkZXIuc3BlY3RydW0tLWRhcmsge1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjNTM1MzUzO1xuICAgIH1cbiAgICBcbiAgICAucmVhY3Qtc3BlY3RydW0tcHJvdmlkZXIuc3BlY3RydW0tLWxpZ2h0IHtcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI0I4QjhCODtcbiAgICB9XG4gICAgXG4gICAgLnJlYWN0LXNwZWN0cnVtLXByb3ZpZGVyLnNwZWN0cnVtLS1saWdodGVzdCB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNGMEYwRjA7XG4gICAgfVxuICAgIFxuICAgIC5yZWFjdC1zcGVjdHJ1bS1wcm92aWRlciAuc3BlY3RydW0tTWVudS1pdGVtIHtcbiAgICAgICAgZm9udC1zaXplOiAxMHB4O1xuICAgIH1cbiAgICBcbiAgICAucmVhY3Qtc3BlY3RydW0tcHJvdmlkZXIgLnNwZWN0cnVtLVRleHRmaWVsZCB7XG4gICAgICAgIGZvbnQtc2l6ZTogMTBweDtcbiAgICB9IFxuICAgIFxuICAgIC5yZWFjdC1zcGVjdHJ1bS1wcm92aWRlcjpsYW5nKGphKSAuc3BlY3RydW0tTWVudS1pdGVtIHtcbiAgICAgICAgZm9udC1zaXplOiAxMnB4O1xuICAgIH1cbiAgICBcbiAgICAucmVhY3Qtc3BlY3RydW0tcHJvdmlkZXI6bGFuZyhqYSkgLnNwZWN0cnVtLVRleHRmaWVsZCB7XG4gICAgICAgIGZvbnQtc2l6ZTogMTJweDtcbiAgICB9IFxuICAgIFxuICAgIC5yZWFjdC1zcGVjdHJ1bS1wcm92aWRlcjpsYW5nKHpoLUhhbnQpIC5zcGVjdHJ1bS1NZW51LWl0ZW0ge1xuICAgICAgICBmb250LXNpemU6IDEycHg7XG4gICAgfVxuICAgIFxuICAgIC5yZWFjdC1zcGVjdHJ1bS1wcm92aWRlcjpsYW5nKHpoLUhhbnQpIC5zcGVjdHJ1bS1UZXh0ZmllbGQge1xuICAgICAgICBmb250LXNpemU6IDEycHg7XG4gICAgfSBcbiAgICBcbiAgICAucmVhY3Qtc3BlY3RydW0tcHJvdmlkZXI6bGFuZyh6aC1IYW5zKSAuc3BlY3RydW0tTWVudS1pdGVtIHtcbiAgICAgICAgZm9udC1zaXplOiAxMnB4O1xuICAgIH1cbiAgICBcbiAgICAucmVhY3Qtc3BlY3RydW0tcHJvdmlkZXI6bGFuZyh6aC1IYW5zKSAuc3BlY3RydW0tVGV4dGZpZWxkIHtcbiAgICAgICAgZm9udC1zaXplOiAxMnB4O1xuICAgIH1cbiAgICBcbiAgICAucmVhY3Qtc3BlY3RydW0tcHJvdmlkZXIuc3BlY3RydW0tLWxpZ2h0ZXN0IC5zcGVjdHJ1bS1NZW51LCAucmVhY3Qtc3BlY3RydW0tcHJvdmlkZXIuc3BlY3RydW0tLWxpZ2h0ZXN0IC5zcGVjdHJ1bS1NZW51LWl0ZW0sIC5yZWFjdC1zcGVjdHJ1bS1wcm92aWRlci5zcGVjdHJ1bS0tbGlnaHRlc3QgLnNwZWN0cnVtLVBvcG92ZXIge1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjQwLCAyNDAsIDI0MCk7XG4gICAgfVxuICAgIFxuICAgIC5yZWFjdC1zcGVjdHJ1bS1wcm92aWRlci5zcGVjdHJ1bS0tbGlnaHQgLnNwZWN0cnVtLU1lbnUsIC5yZWFjdC1zcGVjdHJ1bS1wcm92aWRlci5zcGVjdHJ1bS0tbGlnaHQgLnNwZWN0cnVtLU1lbnUtaXRlbSwgLnJlYWN0LXNwZWN0cnVtLXByb3ZpZGVyLnNwZWN0cnVtLS1saWdodCAuc3BlY3RydW0tUG9wb3ZlciB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IHJnYigxODQsIDE4NCwgMTg0KTtcbiAgICB9XG4gICAgXG4gICAgLnJlYWN0LXNwZWN0cnVtLXByb3ZpZGVyLnNwZWN0cnVtLS1kYXJrIC5zcGVjdHJ1bS1NZW51LCAucmVhY3Qtc3BlY3RydW0tcHJvdmlkZXIuc3BlY3RydW0tLWRhcmsgLnNwZWN0cnVtLU1lbnUtaXRlbSwgLnJlYWN0LXNwZWN0cnVtLXByb3ZpZGVyLnNwZWN0cnVtLS1kYXJrIC5zcGVjdHJ1bS1Qb3BvdmVyIHtcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDgzLCA4MywgODMpO1xuICAgIH1cbiAgICBcbiAgICAucmVhY3Qtc3BlY3RydW0tcHJvdmlkZXIuc3BlY3RydW0tLWRhcmtlc3QgLnNwZWN0cnVtLU1lbnUsIC5yZWFjdC1zcGVjdHJ1bS1wcm92aWRlci5zcGVjdHJ1bS0tZGFya2VzdCAuc3BlY3RydW0tTWVudS1pdGVtLCAucmVhY3Qtc3BlY3RydW0tcHJvdmlkZXIuc3BlY3RydW0tLWRhcmtlc3QgLnNwZWN0cnVtLVBvcG92ZXIge1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoNTAsIDUwLCA1MCk7XG4gICAgfVxuICAgIFxuICAgIC5yZWFjdC1zcGVjdHJ1bS1wcm92aWRlci5zcGVjdHJ1bS0tbGlnaHRlc3QgLnNwZWN0cnVtLU1lbnUtaXRlbTpob3ZlciB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IHJnYigyMjAsIDIyMCwgMjIwKTtcbiAgICAgICAgY29sb3I6IHJnYig3MiwgNzIsIDcyKTtcbiAgICB9XG4gICAgXG4gICAgLnJlYWN0LXNwZWN0cnVtLXByb3ZpZGVyLnNwZWN0cnVtLS1saWdodCAuc3BlY3RydW0tTWVudS1pdGVtOmhvdmVyIHtcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDE2NywgMTY3LCAxNjcpO1xuICAgICAgICBjb2xvcjogcmdiKDM0LCAzNCwgMzQpO1xuICAgIH1cbiAgICBcbiAgICAucmVhY3Qtc3BlY3RydW0tcHJvdmlkZXIuc3BlY3RydW0tLWRhcmsgLnNwZWN0cnVtLU1lbnUtaXRlbTpob3ZlciB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IHJnYig5NSwgOTUsIDk1KTtcbiAgICAgICAgY29sb3I6IHJnYigyNTUsIDI1NSwgMjU1KTtcbiAgICB9XG4gICAgXG4gICAgLnJlYWN0LXNwZWN0cnVtLXByb3ZpZGVyLnNwZWN0cnVtLS1kYXJrZXN0IC5zcGVjdHJ1bS1NZW51LWl0ZW06aG92ZXIge1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoNjIsIDYyLCA2Mik7XG4gICAgICAgIGNvbG9yOiByZ2IoMjA1LCAyMDUsIDIwNSk7XG4gICAgfVxuICAgIFxuICAgIC5yZWFjdC1zcGVjdHJ1bS1wcm92aWRlci5zcGVjdHJ1bS0tbGlnaHRlc3QgLnNwZWN0cnVtLVRleHRmaWVsZCwgLnJlYWN0LXNwZWN0cnVtLXByb3ZpZGVyLnNwZWN0cnVtLS1saWdodGVzdCAuc3BlY3RydW0tVGV4dGZpZWxkIC5pbnB1dFRleHQge1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjU1LCAyNTUsIDI1NSkgIWltcG9ydGFudDtcbiAgICAgICAgY29sb3I6IHJnYig3MiwgNzIsIDcyKTtcbiAgICB9XG4gICAgXG4gICAgLnJlYWN0LXNwZWN0cnVtLXByb3ZpZGVyLnNwZWN0cnVtLS1saWdodCAuc3BlY3RydW0tVGV4dGZpZWxkLCAucmVhY3Qtc3BlY3RydW0tcHJvdmlkZXIuc3BlY3RydW0tLWxpZ2h0IC5zcGVjdHJ1bS1UZXh0ZmllbGQgLmlucHV0VGV4dCB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IHJnYigyMjYsIDIyNiwgMjI2KSAhaW1wb3J0YW50O1xuICAgICAgICBjb2xvcjogcmdiKDM0LCAzNCwgMzQpO1xuICAgIH1cbiAgICBcbiAgICAucmVhY3Qtc3BlY3RydW0tcHJvdmlkZXIuc3BlY3RydW0tLWRhcmsgLnNwZWN0cnVtLVRleHRmaWVsZCwgLnJlYWN0LXNwZWN0cnVtLXByb3ZpZGVyLnNwZWN0cnVtLS1kYXJrIC5zcGVjdHJ1bS1UZXh0ZmllbGQgLmlucHV0VGV4dCB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IHJnYigyNTUsIDI1NSwgMjU1KSAhaW1wb3J0YW50O1xuICAgICAgICBjb2xvcjogcmdiKDc1LCA3NSwgNzUpO1xuICAgIH1cbiAgICBcbiAgICAucmVhY3Qtc3BlY3RydW0tcHJvdmlkZXIuc3BlY3RydW0tLWRhcmtlc3QgLnNwZWN0cnVtLVRleHRmaWVsZCwgLnJlYWN0LXNwZWN0cnVtLXByb3ZpZGVyLnNwZWN0cnVtLS1kYXJrZXN0IC5zcGVjdHJ1bS1UZXh0ZmllbGQgLmlucHV0VGV4dCB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IHJnYigyNTIsIDI1MiwgMjUyKSAhaW1wb3J0YW50O1xuICAgICAgICBjb2xvcjogcmdiKDQyLCA0MiwgNDIpO1xuICAgIH1cbiAgICBgO1xuICBsZXQgaGVhZCA9IGRvY3VtZW50LmhlYWQgfHwgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2hlYWQnKVswXTtcbiAgbGV0IHN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgaGVhZC5hcHBlbmRDaGlsZChzdHlsZSk7XG4gIHN0eWxlLnR5cGUgPSAndGV4dC9jc3MnO1xuICBzdHlsZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjc3MpKTtcbn1cblxuZnVuY3Rpb24gYWRkUGhvdG9zaG9wU3R5bGVzKCkge1xuICBsZXQgY3NzID0gYFxuICAgIFxuICAgIC5yZWFjdC1zcGVjdHJ1bS1wcm92aWRlciB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXV4cC1ob3N0LWJhY2tncm91bmQtY29sb3IpO1xuICAgIH1cbiAgICBcbiAgICAucmVhY3Qtc3BlY3RydW0tcHJvdmlkZXIgLnNwZWN0cnVtLU1lbnUtaXRlbSwgLnJlYWN0LXNwZWN0cnVtLXByb3ZpZGVyIC5zcGVjdHJ1bS1UZXh0ZmllbGQge1xuICAgICAgICBmb250LXNpemU6IDEwcHg7XG4gICAgICAgIGNvbG9yOiB2YXIoLS11eHAtaG9zdC10ZXh0LWNvbG9yKTtcbiAgICB9XG4gICAgXG4gICAgLnJlYWN0LXNwZWN0cnVtLXByb3ZpZGVyIC5zcGVjdHJ1bS1NZW51LCAucmVhY3Qtc3BlY3RydW0tcHJvdmlkZXIgLnNwZWN0cnVtLU1lbnUtaXRlbSwgLnJlYWN0LXNwZWN0cnVtLXByb3ZpZGVyIC5zcGVjdHJ1bS1Qb3BvdmVyIHtcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tdXhwLWhvc3QtYmFja2dyb3VuZC1jb2xvcik7XG4gICAgfVxuICAgIFxuICAgIC5yZWFjdC1zcGVjdHJ1bS1wcm92aWRlciAuc3BlY3RydW0tTWVudS1pdGVtOmhvdmVyIHtcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tdXhwLWhvc3QtbGluay10ZXh0LWNvbG9yKTtcbiAgICAgICAgY29sb3I6ICNGRkZGRkY7XG4gICAgfVxuXG4gICAgLnJlYWN0LXNwZWN0cnVtLXByb3ZpZGVyIC5zcGVjdHJ1bS1UZXh0ZmllbGQsIC5yZWFjdC1zcGVjdHJ1bS1wcm92aWRlciAuc3BlY3RydW0tVGV4dGZpZWxkIC5pbnB1dFRleHQge1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS11eHAtaG9zdC1iYWNrZ3JvdW5kLWNvbG9yKSAhaW1wb3J0YW50O1xuICAgIH1cbiAgICBcbiAgICBgO1xuICBsZXQgaGVhZCA9IGRvY3VtZW50LmhlYWQgfHwgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2hlYWQnKVswXTtcbiAgbGV0IHN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgaGVhZC5hcHBlbmRDaGlsZChzdHlsZSk7XG4gIHN0eWxlLnR5cGUgPSAndGV4dC9jc3MnO1xuICBzdHlsZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjc3MpKTtcbn1cbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///190\n")},function(module,exports,__webpack_require__){"use strict";eval("\n\nexports.__esModule = true;\n\nexports.default = function (componentOrElement) {\n  return (0, _ownerDocument2.default)(_reactDom2.default.findDOMNode(componentOrElement));\n};\n\nvar _reactDom = __webpack_require__(15);\n\nvar _reactDom2 = _interopRequireDefault(_reactDom);\n\nvar _ownerDocument = __webpack_require__(192);\n\nvar _ownerDocument2 = _interopRequireDefault(_ownerDocument);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nmodule.exports = exports['default'];//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTkxLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3JlYWN0LW92ZXJsYXlzL2xpYi91dGlscy9vd25lckRvY3VtZW50LmpzP2NmZDEiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG5leHBvcnRzLmRlZmF1bHQgPSBmdW5jdGlvbiAoY29tcG9uZW50T3JFbGVtZW50KSB7XG4gIHJldHVybiAoMCwgX293bmVyRG9jdW1lbnQyLmRlZmF1bHQpKF9yZWFjdERvbTIuZGVmYXVsdC5maW5kRE9NTm9kZShjb21wb25lbnRPckVsZW1lbnQpKTtcbn07XG5cbnZhciBfcmVhY3REb20gPSByZXF1aXJlKCdyZWFjdC1kb20nKTtcblxudmFyIF9yZWFjdERvbTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdERvbSk7XG5cbnZhciBfb3duZXJEb2N1bWVudCA9IHJlcXVpcmUoJ2RvbS1oZWxwZXJzL293bmVyRG9jdW1lbnQnKTtcblxudmFyIF9vd25lckRvY3VtZW50MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX293bmVyRG9jdW1lbnQpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///191\n")},function(module,exports,__webpack_require__){"use strict";eval('\n\nexports.__esModule = true;\nexports.default = ownerDocument;\n\nfunction ownerDocument(node) {\n  return node && node.ownerDocument || document;\n}\n\nmodule.exports = exports["default"];//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTkyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2RvbS1oZWxwZXJzL293bmVyRG9jdW1lbnQuanM/YTM4ZCJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHMuZGVmYXVsdCA9IG93bmVyRG9jdW1lbnQ7XG5cbmZ1bmN0aW9uIG93bmVyRG9jdW1lbnQobm9kZSkge1xuICByZXR1cm4gbm9kZSAmJiBub2RlLm93bmVyRG9jdW1lbnQgfHwgZG9jdW1lbnQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1tcImRlZmF1bHRcIl07Il0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///192\n')},function(module,exports,__webpack_require__){"use strict";eval("/* WEBPACK VAR INJECTION */(function(process) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = void 0;\n\nvar _classnames = _interopRequireDefault(__webpack_require__(46));\n\nvar _configureTypekit = _interopRequireDefault(__webpack_require__(194));\n\nvar _convertUnsafeMethod = _interopRequireDefault(__webpack_require__(195));\n\nvar _filterDOMProps = _interopRequireDefault(__webpack_require__(34));\n\nvar _propTypes = _interopRequireDefault(__webpack_require__(47));\n\nvar _react = _interopRequireWildcard(__webpack_require__(0));\n\nvar _intl = __webpack_require__(197);\n\nvar _state = __webpack_require__(207);\n\n__webpack_require__(208);\n\n__webpack_require__(209);\n\nvar _class, _class2, _temp;\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\nif (process.env.SCALE_MEDIUM && process.env.SCALE_LARGE) {\n  __webpack_require__(70);\n\n  __webpack_require__(212);\n} else if (process.env.SCALE_LARGE) {\n  __webpack_require__(214);\n} else {\n  __webpack_require__(70);\n}\n\nif (!process.env.THEME_LIGHT && !process.env.THEME_DARK && !process.env.THEME_LIGHTEST && !process.env.THEME_DARKEST || process.env.THEME_LIGHT) __webpack_require__(216);\nif (!process.env.THEME_LIGHT && !process.env.THEME_DARK && !process.env.THEME_LIGHTEST && !process.env.THEME_DARKEST || process.env.THEME_DARK) __webpack_require__(218);\nif (!process.env.THEME_LIGHT && !process.env.THEME_DARK && !process.env.THEME_LIGHTEST && !process.env.THEME_DARKEST || process.env.THEME_LIGHTEST) __webpack_require__(220);\nif (!process.env.THEME_LIGHT && !process.env.THEME_DARK && !process.env.THEME_LIGHTEST && !process.env.THEME_DARKEST || process.env.THEME_DARKEST) __webpack_require__(222);\n\nif (process.env.SCALE_MEDIUM && process.env.SCALE_LARGE) {\n  __webpack_require__(40);\n\n  __webpack_require__(71);\n} else if (process.env.SCALE_LARGE) {\n  __webpack_require__(72);\n} else {\n  __webpack_require__(40);\n}\n\nif (!process.env.THEME_LIGHT && !process.env.THEME_DARK && !process.env.THEME_LIGHTEST && !process.env.THEME_DARKEST || process.env.THEME_LIGHT) __webpack_require__(73);\nif (!process.env.THEME_LIGHT && !process.env.THEME_DARK && !process.env.THEME_LIGHTEST && !process.env.THEME_DARKEST || process.env.THEME_DARK) __webpack_require__(74);\nif (!process.env.THEME_LIGHT && !process.env.THEME_DARK && !process.env.THEME_LIGHTEST && !process.env.THEME_DARKEST || process.env.THEME_LIGHTEST) __webpack_require__(75);\nif (!process.env.THEME_LIGHT && !process.env.THEME_DARK && !process.env.THEME_LIGHTEST && !process.env.THEME_DARKEST || process.env.THEME_DARKEST) __webpack_require__(76);\n\nlet Provider = (0, _convertUnsafeMethod.default)(_class = (_temp = _class2 = class Provider extends _react.Component {\n  // Expose the current theme etc. on the context for children to read if needed.\n  constructor(props) {\n    super(props);\n\n    if (props.locale) {\n      (0, _intl.setLocale)(props.locale);\n    }\n\n    this.configureTypekit();\n  }\n\n  configureTypekit() {\n    if (process.browser) {\n      (0, _configureTypekit.default)(this.props.typekitId);\n    }\n\n    if (this.props.toastPlacement) {\n      (0, _state.setToastPlacement)(this.props.toastPlacement);\n    }\n  }\n\n  UNSAFE_componentWillReceiveProps(nextProps) {\n    if ('locale' in nextProps) {\n      (0, _intl.setLocale)(nextProps.locale);\n    }\n\n    if (nextProps.toastPlacement) {\n      (0, _state.setToastPlacement)(nextProps.toastPlacement);\n    }\n  }\n\n  getChildContext() {\n    return {\n      theme: this.props.theme,\n      scale: this.props.scale,\n      locale: this.props.locale\n    };\n  }\n\n  render() {\n    let _this$props = this.props,\n        {\n      theme,\n      className,\n      children,\n      scale\n    } = _this$props,\n        props = _objectWithoutProperties(_this$props, [\"theme\", \"className\", \"children\", \"scale\"]);\n\n    return /*#__PURE__*/_react.default.createElement(\"div\", _extends({\n      className: (0, _classnames.default)(className, 'react-spectrum-provider', 'spectrum', `spectrum--${theme}`, `spectrum--${scale}`)\n    }, (0, _filterDOMProps.default)(props)), children);\n  }\n\n}, _class2.propTypes = {\n  /**\n   * Theme.\n   */\n  theme: _propTypes.default.oneOf(['light', 'lightest', 'dark', 'darkest']),\n\n  /**\n   * Scale.\n   */\n  scale: _propTypes.default.oneOf(['medium', 'large']),\n\n  /**\n   * The placement of the toasts. By default position is top- shorthand for \"top center\".\n   */\n  toastPlacement: _propTypes.default.oneOf(['top', 'top left', 'top center', 'top right', 'bottom', 'bottom left', 'bottom center', 'bottom right']),\n\n  /**\n   * Type kit ID. This is required and products must get their own id's.\n   * https://typekit.com/account/kits\n   * There is a default provided, but it's only intended for prototyping work.\n   */\n  typekitId: _propTypes.default.string,\n\n  /**\n   * Locale, takes format primary-region ex. en-US, cs-CZ\n   */\n  locale: _propTypes.default.string,\n\n  /**\n   * CSS class name.\n   */\n  className: _propTypes.default.string\n}, _class2.defaultProps = {\n  theme: 'light',\n  scale: 'medium',\n  typekitId: 'ruf7eed'\n}, _class2.childContextTypes = {\n  theme: _propTypes.default.oneOf(['light', 'lightest', 'dark', 'darkest']),\n  scale: _propTypes.default.oneOf(['medium', 'large']),\n  locale: _propTypes.default.string\n}, _temp)) || _class;\n\nexports.default = Provider;\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(16)))//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTkzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0b3JxLW5hdGl2ZS9yZWFjdC1zcGVjdHJ1bS9Qcm92aWRlci9qcy9Qcm92aWRlci5qcz8zZTBjIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuXG52YXIgX2NsYXNzbmFtZXMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJjbGFzc25hbWVzXCIpKTtcblxudmFyIF9jb25maWd1cmVUeXBla2l0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vLi4vdXRpbHMvY29uZmlndXJlVHlwZWtpdFwiKSk7XG5cbnZhciBfY29udmVydFVuc2FmZU1ldGhvZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uLy4uL3V0aWxzL2NvbnZlcnRVbnNhZmVNZXRob2RcIikpO1xuXG52YXIgX2ZpbHRlckRPTVByb3BzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vLi4vdXRpbHMvZmlsdGVyRE9NUHJvcHNcIikpO1xuXG52YXIgX3Byb3BUeXBlcyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInByb3AtdHlwZXNcIikpO1xuXG52YXIgX3JlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcblxudmFyIF9pbnRsID0gcmVxdWlyZShcIi4uLy4uL3V0aWxzL2ludGxcIik7XG5cbnZhciBfc3RhdGUgPSByZXF1aXJlKFwiLi4vLi4vVG9hc3QvanMvc3RhdGVcIik7XG5cbnJlcXVpcmUoXCIuLi8uLi9mb2N1cy1yaW5nLXBvbHlmaWxsXCIpO1xuXG5yZXF1aXJlKFwiLi4vc3R5bGUvaW5kZXguY3NzXCIpO1xuXG52YXIgX2NsYXNzLCBfY2xhc3MyLCBfdGVtcDtcblxuZnVuY3Rpb24gX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlKCkgeyBpZiAodHlwZW9mIFdlYWtNYXAgIT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIG51bGw7IHZhciBjYWNoZSA9IG5ldyBXZWFrTWFwKCk7IF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNhY2hlOyB9OyByZXR1cm4gY2FjaGU7IH1cblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQob2JqKSB7IGlmIChvYmogJiYgb2JqLl9fZXNNb2R1bGUpIHsgcmV0dXJuIG9iajsgfSBpZiAob2JqID09PSBudWxsIHx8IHR5cGVvZiBvYmogIT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIG9iaiAhPT0gXCJmdW5jdGlvblwiKSB7IHJldHVybiB7IGRlZmF1bHQ6IG9iaiB9OyB9IHZhciBjYWNoZSA9IF9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSgpOyBpZiAoY2FjaGUgJiYgY2FjaGUuaGFzKG9iaikpIHsgcmV0dXJuIGNhY2hlLmdldChvYmopOyB9IHZhciBuZXdPYmogPSB7fTsgdmFyIGhhc1Byb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSAmJiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOyBmb3IgKHZhciBrZXkgaW4gb2JqKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKSB7IHZhciBkZXNjID0gaGFzUHJvcGVydHlEZXNjcmlwdG9yID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmosIGtleSkgOiBudWxsOyBpZiAoZGVzYyAmJiAoZGVzYy5nZXQgfHwgZGVzYy5zZXQpKSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuZXdPYmosIGtleSwgZGVzYyk7IH0gZWxzZSB7IG5ld09ialtrZXldID0gb2JqW2tleV07IH0gfSB9IG5ld09iai5kZWZhdWx0ID0gb2JqOyBpZiAoY2FjaGUpIHsgY2FjaGUuc2V0KG9iaiwgbmV3T2JqKTsgfSByZXR1cm4gbmV3T2JqOyB9XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIF9leHRlbmRzKCkgeyBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldOyBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gfSB9IHJldHVybiB0YXJnZXQ7IH07IHJldHVybiBfZXh0ZW5kcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9XG5cbmZ1bmN0aW9uIF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhzb3VyY2UsIGV4Y2x1ZGVkKSB7IGlmIChzb3VyY2UgPT0gbnVsbCkgcmV0dXJuIHt9OyB2YXIgdGFyZ2V0ID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2Uoc291cmNlLCBleGNsdWRlZCk7IHZhciBrZXksIGk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBzb3VyY2VTeW1ib2xLZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzb3VyY2UpOyBmb3IgKGkgPSAwOyBpIDwgc291cmNlU3ltYm9sS2V5cy5sZW5ndGg7IGkrKykgeyBrZXkgPSBzb3VyY2VTeW1ib2xLZXlzW2ldOyBpZiAoZXhjbHVkZWQuaW5kZXhPZihrZXkpID49IDApIGNvbnRpbnVlOyBpZiAoIU9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzb3VyY2UsIGtleSkpIGNvbnRpbnVlOyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5mdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShzb3VyY2UsIGV4Y2x1ZGVkKSB7IGlmIChzb3VyY2UgPT0gbnVsbCkgcmV0dXJuIHt9OyB2YXIgdGFyZ2V0ID0ge307IHZhciBzb3VyY2VLZXlzID0gT2JqZWN0LmtleXMoc291cmNlKTsgdmFyIGtleSwgaTsgZm9yIChpID0gMDsgaSA8IHNvdXJjZUtleXMubGVuZ3RoOyBpKyspIHsga2V5ID0gc291cmNlS2V5c1tpXTsgaWYgKGV4Y2x1ZGVkLmluZGV4T2Yoa2V5KSA+PSAwKSBjb250aW51ZTsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmlmIChwcm9jZXNzLmVudi5TQ0FMRV9NRURJVU0gJiYgcHJvY2Vzcy5lbnYuU0NBTEVfTEFSR0UpIHtcbiAgcmVxdWlyZShcIkBhZG9iZS9zcGVjdHJ1bS1jc3MvZGlzdC9jb21wb25lbnRzL3BhZ2UvaW5kZXguY3NzXCIpO1xuXG4gIHJlcXVpcmUoXCJAYWRvYmUvc3BlY3RydW0tY3NzL2Rpc3QvY29tcG9uZW50cy9wYWdlL2luZGV4LWRpZmYuY3NzXCIpO1xufSBlbHNlIGlmIChwcm9jZXNzLmVudi5TQ0FMRV9MQVJHRSkge1xuICByZXF1aXJlKFwiQGFkb2JlL3NwZWN0cnVtLWNzcy9kaXN0L2NvbXBvbmVudHMvcGFnZS9pbmRleC1sZy5jc3NcIik7XG59IGVsc2Uge1xuICByZXF1aXJlKFwiQGFkb2JlL3NwZWN0cnVtLWNzcy9kaXN0L2NvbXBvbmVudHMvcGFnZS9pbmRleC5jc3NcIik7XG59XG5cbmlmICghcHJvY2Vzcy5lbnYuVEhFTUVfTElHSFQgJiYgIXByb2Nlc3MuZW52LlRIRU1FX0RBUksgJiYgIXByb2Nlc3MuZW52LlRIRU1FX0xJR0hURVNUICYmICFwcm9jZXNzLmVudi5USEVNRV9EQVJLRVNUIHx8IHByb2Nlc3MuZW52LlRIRU1FX0xJR0hUKSByZXF1aXJlKFwiQGFkb2JlL3NwZWN0cnVtLWNzcy9kaXN0L2NvbXBvbmVudHMvcGFnZS9tdWx0aVN0b3BzL2xpZ2h0LmNzc1wiKTtcbmlmICghcHJvY2Vzcy5lbnYuVEhFTUVfTElHSFQgJiYgIXByb2Nlc3MuZW52LlRIRU1FX0RBUksgJiYgIXByb2Nlc3MuZW52LlRIRU1FX0xJR0hURVNUICYmICFwcm9jZXNzLmVudi5USEVNRV9EQVJLRVNUIHx8IHByb2Nlc3MuZW52LlRIRU1FX0RBUkspIHJlcXVpcmUoXCJAYWRvYmUvc3BlY3RydW0tY3NzL2Rpc3QvY29tcG9uZW50cy9wYWdlL211bHRpU3RvcHMvZGFyay5jc3NcIik7XG5pZiAoIXByb2Nlc3MuZW52LlRIRU1FX0xJR0hUICYmICFwcm9jZXNzLmVudi5USEVNRV9EQVJLICYmICFwcm9jZXNzLmVudi5USEVNRV9MSUdIVEVTVCAmJiAhcHJvY2Vzcy5lbnYuVEhFTUVfREFSS0VTVCB8fCBwcm9jZXNzLmVudi5USEVNRV9MSUdIVEVTVCkgcmVxdWlyZShcIkBhZG9iZS9zcGVjdHJ1bS1jc3MvZGlzdC9jb21wb25lbnRzL3BhZ2UvbXVsdGlTdG9wcy9saWdodGVzdC5jc3NcIik7XG5pZiAoIXByb2Nlc3MuZW52LlRIRU1FX0xJR0hUICYmICFwcm9jZXNzLmVudi5USEVNRV9EQVJLICYmICFwcm9jZXNzLmVudi5USEVNRV9MSUdIVEVTVCAmJiAhcHJvY2Vzcy5lbnYuVEhFTUVfREFSS0VTVCB8fCBwcm9jZXNzLmVudi5USEVNRV9EQVJLRVNUKSByZXF1aXJlKFwiQGFkb2JlL3NwZWN0cnVtLWNzcy9kaXN0L2NvbXBvbmVudHMvcGFnZS9tdWx0aVN0b3BzL2Rhcmtlc3QuY3NzXCIpO1xuXG5pZiAocHJvY2Vzcy5lbnYuU0NBTEVfTUVESVVNICYmIHByb2Nlc3MuZW52LlNDQUxFX0xBUkdFKSB7XG4gIHJlcXVpcmUoXCIuLi8uLi9zcGVjdHJ1bS1jc3Mtb3ZlcnJpZGVzL3R5cG9ncmFwaHkvaW5kZXguY3NzXCIpO1xuXG4gIHJlcXVpcmUoXCIuLi8uLi9zcGVjdHJ1bS1jc3Mtb3ZlcnJpZGVzL3R5cG9ncmFwaHkvaW5kZXgtZGlmZi5jc3NcIik7XG59IGVsc2UgaWYgKHByb2Nlc3MuZW52LlNDQUxFX0xBUkdFKSB7XG4gIHJlcXVpcmUoXCIuLi8uLi9zcGVjdHJ1bS1jc3Mtb3ZlcnJpZGVzL3R5cG9ncmFwaHkvaW5kZXgtbGcuY3NzXCIpO1xufSBlbHNlIHtcbiAgcmVxdWlyZShcIi4uLy4uL3NwZWN0cnVtLWNzcy1vdmVycmlkZXMvdHlwb2dyYXBoeS9pbmRleC5jc3NcIik7XG59XG5cbmlmICghcHJvY2Vzcy5lbnYuVEhFTUVfTElHSFQgJiYgIXByb2Nlc3MuZW52LlRIRU1FX0RBUksgJiYgIXByb2Nlc3MuZW52LlRIRU1FX0xJR0hURVNUICYmICFwcm9jZXNzLmVudi5USEVNRV9EQVJLRVNUIHx8IHByb2Nlc3MuZW52LlRIRU1FX0xJR0hUKSByZXF1aXJlKFwiLi4vLi4vc3BlY3RydW0tY3NzLW92ZXJyaWRlcy90eXBvZ3JhcGh5L211bHRpU3RvcHMvbGlnaHQuY3NzXCIpO1xuaWYgKCFwcm9jZXNzLmVudi5USEVNRV9MSUdIVCAmJiAhcHJvY2Vzcy5lbnYuVEhFTUVfREFSSyAmJiAhcHJvY2Vzcy5lbnYuVEhFTUVfTElHSFRFU1QgJiYgIXByb2Nlc3MuZW52LlRIRU1FX0RBUktFU1QgfHwgcHJvY2Vzcy5lbnYuVEhFTUVfREFSSykgcmVxdWlyZShcIi4uLy4uL3NwZWN0cnVtLWNzcy1vdmVycmlkZXMvdHlwb2dyYXBoeS9tdWx0aVN0b3BzL2RhcmsuY3NzXCIpO1xuaWYgKCFwcm9jZXNzLmVudi5USEVNRV9MSUdIVCAmJiAhcHJvY2Vzcy5lbnYuVEhFTUVfREFSSyAmJiAhcHJvY2Vzcy5lbnYuVEhFTUVfTElHSFRFU1QgJiYgIXByb2Nlc3MuZW52LlRIRU1FX0RBUktFU1QgfHwgcHJvY2Vzcy5lbnYuVEhFTUVfTElHSFRFU1QpIHJlcXVpcmUoXCIuLi8uLi9zcGVjdHJ1bS1jc3Mtb3ZlcnJpZGVzL3R5cG9ncmFwaHkvbXVsdGlTdG9wcy9saWdodGVzdC5jc3NcIik7XG5pZiAoIXByb2Nlc3MuZW52LlRIRU1FX0xJR0hUICYmICFwcm9jZXNzLmVudi5USEVNRV9EQVJLICYmICFwcm9jZXNzLmVudi5USEVNRV9MSUdIVEVTVCAmJiAhcHJvY2Vzcy5lbnYuVEhFTUVfREFSS0VTVCB8fCBwcm9jZXNzLmVudi5USEVNRV9EQVJLRVNUKSByZXF1aXJlKFwiLi4vLi4vc3BlY3RydW0tY3NzLW92ZXJyaWRlcy90eXBvZ3JhcGh5L211bHRpU3RvcHMvZGFya2VzdC5jc3NcIik7XG5cbmxldCBQcm92aWRlciA9ICgwLCBfY29udmVydFVuc2FmZU1ldGhvZC5kZWZhdWx0KShfY2xhc3MgPSAoX3RlbXAgPSBfY2xhc3MyID0gY2xhc3MgUHJvdmlkZXIgZXh0ZW5kcyBfcmVhY3QuQ29tcG9uZW50IHtcbiAgLy8gRXhwb3NlIHRoZSBjdXJyZW50IHRoZW1lIGV0Yy4gb24gdGhlIGNvbnRleHQgZm9yIGNoaWxkcmVuIHRvIHJlYWQgaWYgbmVlZGVkLlxuICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcblxuICAgIGlmIChwcm9wcy5sb2NhbGUpIHtcbiAgICAgICgwLCBfaW50bC5zZXRMb2NhbGUpKHByb3BzLmxvY2FsZSk7XG4gICAgfVxuXG4gICAgdGhpcy5jb25maWd1cmVUeXBla2l0KCk7XG4gIH1cblxuICBjb25maWd1cmVUeXBla2l0KCkge1xuICAgIGlmIChwcm9jZXNzLmJyb3dzZXIpIHtcbiAgICAgICgwLCBfY29uZmlndXJlVHlwZWtpdC5kZWZhdWx0KSh0aGlzLnByb3BzLnR5cGVraXRJZCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucHJvcHMudG9hc3RQbGFjZW1lbnQpIHtcbiAgICAgICgwLCBfc3RhdGUuc2V0VG9hc3RQbGFjZW1lbnQpKHRoaXMucHJvcHMudG9hc3RQbGFjZW1lbnQpO1xuICAgIH1cbiAgfVxuXG4gIFVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG5leHRQcm9wcykge1xuICAgIGlmICgnbG9jYWxlJyBpbiBuZXh0UHJvcHMpIHtcbiAgICAgICgwLCBfaW50bC5zZXRMb2NhbGUpKG5leHRQcm9wcy5sb2NhbGUpO1xuICAgIH1cblxuICAgIGlmIChuZXh0UHJvcHMudG9hc3RQbGFjZW1lbnQpIHtcbiAgICAgICgwLCBfc3RhdGUuc2V0VG9hc3RQbGFjZW1lbnQpKG5leHRQcm9wcy50b2FzdFBsYWNlbWVudCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0Q2hpbGRDb250ZXh0KCkge1xuICAgIHJldHVybiB7XG4gICAgICB0aGVtZTogdGhpcy5wcm9wcy50aGVtZSxcbiAgICAgIHNjYWxlOiB0aGlzLnByb3BzLnNjYWxlLFxuICAgICAgbG9jYWxlOiB0aGlzLnByb3BzLmxvY2FsZVxuICAgIH07XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgbGV0IF90aGlzJHByb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAge1xuICAgICAgdGhlbWUsXG4gICAgICBjbGFzc05hbWUsXG4gICAgICBjaGlsZHJlbixcbiAgICAgIHNjYWxlXG4gICAgfSA9IF90aGlzJHByb3BzLFxuICAgICAgICBwcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfdGhpcyRwcm9wcywgW1widGhlbWVcIiwgXCJjbGFzc05hbWVcIiwgXCJjaGlsZHJlblwiLCBcInNjYWxlXCJdKTtcblxuICAgIHJldHVybiAvKiNfX1BVUkVfXyovX3JlYWN0LmRlZmF1bHQuY3JlYXRlRWxlbWVudChcImRpdlwiLCBfZXh0ZW5kcyh7XG4gICAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lcy5kZWZhdWx0KShjbGFzc05hbWUsICdyZWFjdC1zcGVjdHJ1bS1wcm92aWRlcicsICdzcGVjdHJ1bScsIGBzcGVjdHJ1bS0tJHt0aGVtZX1gLCBgc3BlY3RydW0tLSR7c2NhbGV9YClcbiAgICB9LCAoMCwgX2ZpbHRlckRPTVByb3BzLmRlZmF1bHQpKHByb3BzKSksIGNoaWxkcmVuKTtcbiAgfVxuXG59LCBfY2xhc3MyLnByb3BUeXBlcyA9IHtcbiAgLyoqXG4gICAqIFRoZW1lLlxuICAgKi9cbiAgdGhlbWU6IF9wcm9wVHlwZXMuZGVmYXVsdC5vbmVPZihbJ2xpZ2h0JywgJ2xpZ2h0ZXN0JywgJ2RhcmsnLCAnZGFya2VzdCddKSxcblxuICAvKipcbiAgICogU2NhbGUuXG4gICAqL1xuICBzY2FsZTogX3Byb3BUeXBlcy5kZWZhdWx0Lm9uZU9mKFsnbWVkaXVtJywgJ2xhcmdlJ10pLFxuXG4gIC8qKlxuICAgKiBUaGUgcGxhY2VtZW50IG9mIHRoZSB0b2FzdHMuIEJ5IGRlZmF1bHQgcG9zaXRpb24gaXMgdG9wLSBzaG9ydGhhbmQgZm9yIFwidG9wIGNlbnRlclwiLlxuICAgKi9cbiAgdG9hc3RQbGFjZW1lbnQ6IF9wcm9wVHlwZXMuZGVmYXVsdC5vbmVPZihbJ3RvcCcsICd0b3AgbGVmdCcsICd0b3AgY2VudGVyJywgJ3RvcCByaWdodCcsICdib3R0b20nLCAnYm90dG9tIGxlZnQnLCAnYm90dG9tIGNlbnRlcicsICdib3R0b20gcmlnaHQnXSksXG5cbiAgLyoqXG4gICAqIFR5cGUga2l0IElELiBUaGlzIGlzIHJlcXVpcmVkIGFuZCBwcm9kdWN0cyBtdXN0IGdldCB0aGVpciBvd24gaWQncy5cbiAgICogaHR0cHM6Ly90eXBla2l0LmNvbS9hY2NvdW50L2tpdHNcbiAgICogVGhlcmUgaXMgYSBkZWZhdWx0IHByb3ZpZGVkLCBidXQgaXQncyBvbmx5IGludGVuZGVkIGZvciBwcm90b3R5cGluZyB3b3JrLlxuICAgKi9cbiAgdHlwZWtpdElkOiBfcHJvcFR5cGVzLmRlZmF1bHQuc3RyaW5nLFxuXG4gIC8qKlxuICAgKiBMb2NhbGUsIHRha2VzIGZvcm1hdCBwcmltYXJ5LXJlZ2lvbiBleC4gZW4tVVMsIGNzLUNaXG4gICAqL1xuICBsb2NhbGU6IF9wcm9wVHlwZXMuZGVmYXVsdC5zdHJpbmcsXG5cbiAgLyoqXG4gICAqIENTUyBjbGFzcyBuYW1lLlxuICAgKi9cbiAgY2xhc3NOYW1lOiBfcHJvcFR5cGVzLmRlZmF1bHQuc3RyaW5nXG59LCBfY2xhc3MyLmRlZmF1bHRQcm9wcyA9IHtcbiAgdGhlbWU6ICdsaWdodCcsXG4gIHNjYWxlOiAnbWVkaXVtJyxcbiAgdHlwZWtpdElkOiAncnVmN2VlZCdcbn0sIF9jbGFzczIuY2hpbGRDb250ZXh0VHlwZXMgPSB7XG4gIHRoZW1lOiBfcHJvcFR5cGVzLmRlZmF1bHQub25lT2YoWydsaWdodCcsICdsaWdodGVzdCcsICdkYXJrJywgJ2Rhcmtlc3QnXSksXG4gIHNjYWxlOiBfcHJvcFR5cGVzLmRlZmF1bHQub25lT2YoWydtZWRpdW0nLCAnbGFyZ2UnXSksXG4gIGxvY2FsZTogX3Byb3BUeXBlcy5kZWZhdWx0LnN0cmluZ1xufSwgX3RlbXApKSB8fCBfY2xhc3M7XG5cbmV4cG9ydHMuZGVmYXVsdCA9IFByb3ZpZGVyO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///193\n")},function(module,exports,__webpack_require__){"use strict";eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = configureTypekit;\n\n/*************************************************************************\n* ADOBE CONFIDENTIAL\n* ___________________\n*\n* Copyright 2019 Adobe\n* All Rights Reserved.\n*\n* NOTICE: All information contained herein is, and remains\n* the property of Adobe and its suppliers, if any. The intellectual\n* and technical concepts contained herein are proprietary to Adobe\n* and its suppliers and are protected by all applicable intellectual\n* property laws, including trade secret and copyright laws.\n* Dissemination of this information or reproduction of this material\n* is strictly forbidden unless prior written permission is obtained\n* from Adobe.\n**************************************************************************/\nfunction configureTypekit(typeKitId) {\n  const config = {\n    kitId: typeKitId,\n    scriptTimeout: 3000\n  };\n\n  if (!window.Typekit) {\n    // we load the typescript only once\n    const h = document.getElementsByTagName('html')[0];\n    h.className += ' wf-loading';\n    const t = setTimeout(() => {\n      h.className = h.className.replace(/(\\s|^)wf-loading(\\s|$)/g, ' ');\n      h.className += ' wf-inactive';\n    }, config.scriptTimeout);\n    const tk = document.createElement('script');\n    let d = false;\n    tk.src = `https://use.typekit.net/${config.kitId}.js`;\n    tk.type = 'text/javascript';\n    tk.async = 'true';\n\n    tk.onload = tk.onreadystatechange = function onload() {\n      const a = this.readyState;\n\n      if (d || a && a !== 'complete' && a !== 'loaded') {\n        return;\n      }\n\n      d = true;\n      clearTimeout(t);\n\n      try {\n        window.Typekit.load(config);\n      } catch (b) {\n        /* empty */\n      }\n    };\n\n    const s = document.getElementsByTagName('script')[0];\n    s.parentNode.insertBefore(tk, s);\n  }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTk0LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0b3JxLW5hdGl2ZS9yZWFjdC1zcGVjdHJ1bS91dGlscy9jb25maWd1cmVUeXBla2l0LmpzPzMyMjciXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSBjb25maWd1cmVUeXBla2l0O1xuXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuKiBBRE9CRSBDT05GSURFTlRJQUxcbiogX19fX19fX19fX19fX19fX19fX1xuKlxuKiBDb3B5cmlnaHQgMjAxOSBBZG9iZVxuKiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuKlxuKiBOT1RJQ0U6IEFsbCBpbmZvcm1hdGlvbiBjb250YWluZWQgaGVyZWluIGlzLCBhbmQgcmVtYWluc1xuKiB0aGUgcHJvcGVydHkgb2YgQWRvYmUgYW5kIGl0cyBzdXBwbGllcnMsIGlmIGFueS4gVGhlIGludGVsbGVjdHVhbFxuKiBhbmQgdGVjaG5pY2FsIGNvbmNlcHRzIGNvbnRhaW5lZCBoZXJlaW4gYXJlIHByb3ByaWV0YXJ5IHRvIEFkb2JlXG4qIGFuZCBpdHMgc3VwcGxpZXJzIGFuZCBhcmUgcHJvdGVjdGVkIGJ5IGFsbCBhcHBsaWNhYmxlIGludGVsbGVjdHVhbFxuKiBwcm9wZXJ0eSBsYXdzLCBpbmNsdWRpbmcgdHJhZGUgc2VjcmV0IGFuZCBjb3B5cmlnaHQgbGF3cy5cbiogRGlzc2VtaW5hdGlvbiBvZiB0aGlzIGluZm9ybWF0aW9uIG9yIHJlcHJvZHVjdGlvbiBvZiB0aGlzIG1hdGVyaWFsXG4qIGlzIHN0cmljdGx5IGZvcmJpZGRlbiB1bmxlc3MgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIGlzIG9idGFpbmVkXG4qIGZyb20gQWRvYmUuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbmZ1bmN0aW9uIGNvbmZpZ3VyZVR5cGVraXQodHlwZUtpdElkKSB7XG4gIGNvbnN0IGNvbmZpZyA9IHtcbiAgICBraXRJZDogdHlwZUtpdElkLFxuICAgIHNjcmlwdFRpbWVvdXQ6IDMwMDBcbiAgfTtcblxuICBpZiAoIXdpbmRvdy5UeXBla2l0KSB7XG4gICAgLy8gd2UgbG9hZCB0aGUgdHlwZXNjcmlwdCBvbmx5IG9uY2VcbiAgICBjb25zdCBoID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2h0bWwnKVswXTtcbiAgICBoLmNsYXNzTmFtZSArPSAnIHdmLWxvYWRpbmcnO1xuICAgIGNvbnN0IHQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGguY2xhc3NOYW1lID0gaC5jbGFzc05hbWUucmVwbGFjZSgvKFxcc3xeKXdmLWxvYWRpbmcoXFxzfCQpL2csICcgJyk7XG4gICAgICBoLmNsYXNzTmFtZSArPSAnIHdmLWluYWN0aXZlJztcbiAgICB9LCBjb25maWcuc2NyaXB0VGltZW91dCk7XG4gICAgY29uc3QgdGsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcbiAgICBsZXQgZCA9IGZhbHNlO1xuICAgIHRrLnNyYyA9IGBodHRwczovL3VzZS50eXBla2l0Lm5ldC8ke2NvbmZpZy5raXRJZH0uanNgO1xuICAgIHRrLnR5cGUgPSAndGV4dC9qYXZhc2NyaXB0JztcbiAgICB0ay5hc3luYyA9ICd0cnVlJztcblxuICAgIHRrLm9ubG9hZCA9IHRrLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uIG9ubG9hZCgpIHtcbiAgICAgIGNvbnN0IGEgPSB0aGlzLnJlYWR5U3RhdGU7XG5cbiAgICAgIGlmIChkIHx8IGEgJiYgYSAhPT0gJ2NvbXBsZXRlJyAmJiBhICE9PSAnbG9hZGVkJykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGQgPSB0cnVlO1xuICAgICAgY2xlYXJUaW1lb3V0KHQpO1xuXG4gICAgICB0cnkge1xuICAgICAgICB3aW5kb3cuVHlwZWtpdC5sb2FkKGNvbmZpZyk7XG4gICAgICB9IGNhdGNoIChiKSB7XG4gICAgICAgIC8qIGVtcHR5ICovXG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IHMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnc2NyaXB0JylbMF07XG4gICAgcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aywgcyk7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///194\n")},function(module,exports,__webpack_require__){"use strict";eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = convertUnsafeMethod;\n\nvar _semverCompare = _interopRequireDefault(__webpack_require__(196));\n\nvar _react = _interopRequireDefault(__webpack_require__(0));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/*************************************************************************\n* ADOBE CONFIDENTIAL\n* ___________________\n*\n* Copyright 2019 Adobe\n* All Rights Reserved.\n*\n* NOTICE: All information contained herein is, and remains\n* the property of Adobe and its suppliers, if any. The intellectual\n* and technical concepts contained herein are proprietary to Adobe\n* and its suppliers and are protected by all applicable intellectual\n* property laws, including trade secret and copyright laws.\n* Dissemination of this information or reproduction of this material\n* is strictly forbidden unless prior written permission is obtained\n* from Adobe.\n**************************************************************************/\n\n/**\n * This is a decorator that converts UNSAFE React lifecycle methods to their pre-React 16.3.0 variant\n*/\nfunction convertUnsafeMethod(WrappedComponent) {\n  const proto = WrappedComponent.prototype;\n  const UNSAFE_componentWillUpdate = proto.UNSAFE_componentWillUpdate;\n  const UNSAFE_componentWillMount = proto.UNSAFE_componentWillMount;\n  const UNSAFE_componentWillReceiveProps = proto.UNSAFE_componentWillReceiveProps;\n\n  if ((0, _semverCompare.default)(_react.default.version, '16.3.0') === -1) {\n    if (UNSAFE_componentWillUpdate) {\n      proto.componentWillUpdate = function (props, state) {\n        UNSAFE_componentWillUpdate.apply(this, arguments);\n      };\n    }\n\n    if (UNSAFE_componentWillMount) {\n      proto.componentWillMount = function () {\n        UNSAFE_componentWillMount.apply(this, arguments);\n      };\n    }\n\n    if (UNSAFE_componentWillReceiveProps) {\n      proto.componentWillReceiveProps = function (props) {\n        UNSAFE_componentWillReceiveProps.apply(this, arguments);\n      };\n    }\n  }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTk1LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0b3JxLW5hdGl2ZS9yZWFjdC1zcGVjdHJ1bS91dGlscy9jb252ZXJ0VW5zYWZlTWV0aG9kLmpzP2U5MzciXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSBjb252ZXJ0VW5zYWZlTWV0aG9kO1xuXG52YXIgX3NlbXZlckNvbXBhcmUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJzZW12ZXItY29tcGFyZVwiKSk7XG5cbnZhciBfcmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyZWFjdFwiKSk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4qIEFET0JFIENPTkZJREVOVElBTFxuKiBfX19fX19fX19fX19fX19fX19fXG4qXG4qIENvcHlyaWdodCAyMDE5IEFkb2JlXG4qIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4qXG4qIE5PVElDRTogQWxsIGluZm9ybWF0aW9uIGNvbnRhaW5lZCBoZXJlaW4gaXMsIGFuZCByZW1haW5zXG4qIHRoZSBwcm9wZXJ0eSBvZiBBZG9iZSBhbmQgaXRzIHN1cHBsaWVycywgaWYgYW55LiBUaGUgaW50ZWxsZWN0dWFsXG4qIGFuZCB0ZWNobmljYWwgY29uY2VwdHMgY29udGFpbmVkIGhlcmVpbiBhcmUgcHJvcHJpZXRhcnkgdG8gQWRvYmVcbiogYW5kIGl0cyBzdXBwbGllcnMgYW5kIGFyZSBwcm90ZWN0ZWQgYnkgYWxsIGFwcGxpY2FibGUgaW50ZWxsZWN0dWFsXG4qIHByb3BlcnR5IGxhd3MsIGluY2x1ZGluZyB0cmFkZSBzZWNyZXQgYW5kIGNvcHlyaWdodCBsYXdzLlxuKiBEaXNzZW1pbmF0aW9uIG9mIHRoaXMgaW5mb3JtYXRpb24gb3IgcmVwcm9kdWN0aW9uIG9mIHRoaXMgbWF0ZXJpYWxcbiogaXMgc3RyaWN0bHkgZm9yYmlkZGVuIHVubGVzcyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gaXMgb2J0YWluZWRcbiogZnJvbSBBZG9iZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4vKipcbiAqIFRoaXMgaXMgYSBkZWNvcmF0b3IgdGhhdCBjb252ZXJ0cyBVTlNBRkUgUmVhY3QgbGlmZWN5Y2xlIG1ldGhvZHMgdG8gdGhlaXIgcHJlLVJlYWN0IDE2LjMuMCB2YXJpYW50XG4qL1xuZnVuY3Rpb24gY29udmVydFVuc2FmZU1ldGhvZChXcmFwcGVkQ29tcG9uZW50KSB7XG4gIGNvbnN0IHByb3RvID0gV3JhcHBlZENvbXBvbmVudC5wcm90b3R5cGU7XG4gIGNvbnN0IFVOU0FGRV9jb21wb25lbnRXaWxsVXBkYXRlID0gcHJvdG8uVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGU7XG4gIGNvbnN0IFVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQgPSBwcm90by5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50O1xuICBjb25zdCBVTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyA9IHByb3RvLlVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzO1xuXG4gIGlmICgoMCwgX3NlbXZlckNvbXBhcmUuZGVmYXVsdCkoX3JlYWN0LmRlZmF1bHQudmVyc2lvbiwgJzE2LjMuMCcpID09PSAtMSkge1xuICAgIGlmIChVTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZSkge1xuICAgICAgcHJvdG8uY29tcG9uZW50V2lsbFVwZGF0ZSA9IGZ1bmN0aW9uIChwcm9wcywgc3RhdGUpIHtcbiAgICAgICAgVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKFVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQpIHtcbiAgICAgIHByb3RvLmNvbXBvbmVudFdpbGxNb3VudCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAoVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMpIHtcbiAgICAgIHByb3RvLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgPSBmdW5jdGlvbiAocHJvcHMpIHtcbiAgICAgICAgVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH07XG4gICAgfVxuICB9XG59XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///195\n")},function(module,exports){eval("module.exports = function cmp (a, b) {\n    var pa = a.split('.');\n    var pb = b.split('.');\n    for (var i = 0; i < 3; i++) {\n        var na = Number(pa[i]);\n        var nb = Number(pb[i]);\n        if (na > nb) return 1;\n        if (nb > na) return -1;\n        if (!isNaN(na) && isNaN(nb)) return 1;\n        if (isNaN(na) && !isNaN(nb)) return -1;\n    }\n    return 0;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTk2LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3NlbXZlci1jb21wYXJlL2luZGV4LmpzP2M5YzkiXSwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBjbXAgKGEsIGIpIHtcbiAgICB2YXIgcGEgPSBhLnNwbGl0KCcuJyk7XG4gICAgdmFyIHBiID0gYi5zcGxpdCgnLicpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMzsgaSsrKSB7XG4gICAgICAgIHZhciBuYSA9IE51bWJlcihwYVtpXSk7XG4gICAgICAgIHZhciBuYiA9IE51bWJlcihwYltpXSk7XG4gICAgICAgIGlmIChuYSA+IG5iKSByZXR1cm4gMTtcbiAgICAgICAgaWYgKG5iID4gbmEpIHJldHVybiAtMTtcbiAgICAgICAgaWYgKCFpc05hTihuYSkgJiYgaXNOYU4obmIpKSByZXR1cm4gMTtcbiAgICAgICAgaWYgKGlzTmFOKG5hKSAmJiAhaXNOYU4obmIpKSByZXR1cm4gLTE7XG4gICAgfVxuICAgIHJldHVybiAwO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///196\n")},function(module,exports,__webpack_require__){"use strict";eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.setLocale = setLocale;\nexports.getLocale = getLocale;\nexports.messageFormatter = messageFormatter;\nexports.defaultLocale = void 0;\n\nvar _intlMessageformat = _interopRequireDefault(__webpack_require__(198));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/*************************************************************************\n* ADOBE CONFIDENTIAL\n* ___________________\n*\n* Copyright 2019 Adobe\n* All Rights Reserved.\n*\n* NOTICE: All information contained herein is, and remains\n* the property of Adobe and its suppliers, if any. The intellectual\n* and technical concepts contained herein are proprietary to Adobe\n* and its suppliers and are protected by all applicable intellectual\n* property laws, including trade secret and copyright laws.\n* Dissemination of this information or reproduction of this material\n* is strictly forbidden unless prior written permission is obtained\n* from Adobe.\n**************************************************************************/\nconst defaultLocale = typeof navigator !== 'undefined' && (navigator.language || navigator.userLanguage) || 'en-US';\nexports.defaultLocale = defaultLocale;\nlet currentLocale = defaultLocale;\n\nfunction setLocale(locale) {\n  currentLocale = locale;\n}\n\nfunction getLocale() {\n  return currentLocale;\n}\n\nfunction messageFormatter(strings) {\n  let cache = {};\n  return function formatMessage(key, variables, formats) {\n    let message = cache[key + '.' + currentLocale];\n\n    if (!message) {\n      let localeStrings = strings[currentLocale] || strings['en-US'];\n      let msg = localeStrings[key];\n\n      if (!msg) {\n        throw new Error(`Could not find intl message ${key} in ${currentLocale} locale`);\n      }\n\n      message = new _intlMessageformat.default(msg, currentLocale, formats);\n      cache[key] = message;\n    }\n\n    return message.format(variables);\n  };\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTk3LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0b3JxLW5hdGl2ZS9yZWFjdC1zcGVjdHJ1bS91dGlscy9pbnRsLmpzPzI3YWYiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLnNldExvY2FsZSA9IHNldExvY2FsZTtcbmV4cG9ydHMuZ2V0TG9jYWxlID0gZ2V0TG9jYWxlO1xuZXhwb3J0cy5tZXNzYWdlRm9ybWF0dGVyID0gbWVzc2FnZUZvcm1hdHRlcjtcbmV4cG9ydHMuZGVmYXVsdExvY2FsZSA9IHZvaWQgMDtcblxudmFyIF9pbnRsTWVzc2FnZWZvcm1hdCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcImludGwtbWVzc2FnZWZvcm1hdFwiKSk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4qIEFET0JFIENPTkZJREVOVElBTFxuKiBfX19fX19fX19fX19fX19fX19fXG4qXG4qIENvcHlyaWdodCAyMDE5IEFkb2JlXG4qIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4qXG4qIE5PVElDRTogQWxsIGluZm9ybWF0aW9uIGNvbnRhaW5lZCBoZXJlaW4gaXMsIGFuZCByZW1haW5zXG4qIHRoZSBwcm9wZXJ0eSBvZiBBZG9iZSBhbmQgaXRzIHN1cHBsaWVycywgaWYgYW55LiBUaGUgaW50ZWxsZWN0dWFsXG4qIGFuZCB0ZWNobmljYWwgY29uY2VwdHMgY29udGFpbmVkIGhlcmVpbiBhcmUgcHJvcHJpZXRhcnkgdG8gQWRvYmVcbiogYW5kIGl0cyBzdXBwbGllcnMgYW5kIGFyZSBwcm90ZWN0ZWQgYnkgYWxsIGFwcGxpY2FibGUgaW50ZWxsZWN0dWFsXG4qIHByb3BlcnR5IGxhd3MsIGluY2x1ZGluZyB0cmFkZSBzZWNyZXQgYW5kIGNvcHlyaWdodCBsYXdzLlxuKiBEaXNzZW1pbmF0aW9uIG9mIHRoaXMgaW5mb3JtYXRpb24gb3IgcmVwcm9kdWN0aW9uIG9mIHRoaXMgbWF0ZXJpYWxcbiogaXMgc3RyaWN0bHkgZm9yYmlkZGVuIHVubGVzcyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gaXMgb2J0YWluZWRcbiogZnJvbSBBZG9iZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuY29uc3QgZGVmYXVsdExvY2FsZSA9IHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnICYmIChuYXZpZ2F0b3IubGFuZ3VhZ2UgfHwgbmF2aWdhdG9yLnVzZXJMYW5ndWFnZSkgfHwgJ2VuLVVTJztcbmV4cG9ydHMuZGVmYXVsdExvY2FsZSA9IGRlZmF1bHRMb2NhbGU7XG5sZXQgY3VycmVudExvY2FsZSA9IGRlZmF1bHRMb2NhbGU7XG5cbmZ1bmN0aW9uIHNldExvY2FsZShsb2NhbGUpIHtcbiAgY3VycmVudExvY2FsZSA9IGxvY2FsZTtcbn1cblxuZnVuY3Rpb24gZ2V0TG9jYWxlKCkge1xuICByZXR1cm4gY3VycmVudExvY2FsZTtcbn1cblxuZnVuY3Rpb24gbWVzc2FnZUZvcm1hdHRlcihzdHJpbmdzKSB7XG4gIGxldCBjYWNoZSA9IHt9O1xuICByZXR1cm4gZnVuY3Rpb24gZm9ybWF0TWVzc2FnZShrZXksIHZhcmlhYmxlcywgZm9ybWF0cykge1xuICAgIGxldCBtZXNzYWdlID0gY2FjaGVba2V5ICsgJy4nICsgY3VycmVudExvY2FsZV07XG5cbiAgICBpZiAoIW1lc3NhZ2UpIHtcbiAgICAgIGxldCBsb2NhbGVTdHJpbmdzID0gc3RyaW5nc1tjdXJyZW50TG9jYWxlXSB8fCBzdHJpbmdzWydlbi1VUyddO1xuICAgICAgbGV0IG1zZyA9IGxvY2FsZVN0cmluZ3Nba2V5XTtcblxuICAgICAgaWYgKCFtc2cpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZmluZCBpbnRsIG1lc3NhZ2UgJHtrZXl9IGluICR7Y3VycmVudExvY2FsZX0gbG9jYWxlYCk7XG4gICAgICB9XG5cbiAgICAgIG1lc3NhZ2UgPSBuZXcgX2ludGxNZXNzYWdlZm9ybWF0LmRlZmF1bHQobXNnLCBjdXJyZW50TG9jYWxlLCBmb3JtYXRzKTtcbiAgICAgIGNhY2hlW2tleV0gPSBtZXNzYWdlO1xuICAgIH1cblxuICAgIHJldHVybiBtZXNzYWdlLmZvcm1hdCh2YXJpYWJsZXMpO1xuICB9O1xufVxuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///197\n")},function(module,exports,__webpack_require__){"use strict";eval("/* jshint node:true */\n\n\n\nvar IntlMessageFormat = __webpack_require__(199)['default'];\n\n// Add all locale data to `IntlMessageFormat`. This module will be ignored when\n// bundling for the browser with Browserify/Webpack.\n__webpack_require__(206);\n\n// Re-export `IntlMessageFormat` as the CommonJS default exports with all the\n// locale data registered, and with English set as the default locale. Define\n// the `default` prop for use with other compiled ES6 Modules.\nexports = module.exports = IntlMessageFormat;\nexports['default'] = exports;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTk4LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2ludGwtbWVzc2FnZWZvcm1hdC9pbmRleC5qcz9kOTQwIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIGpzaGludCBub2RlOnRydWUgKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgSW50bE1lc3NhZ2VGb3JtYXQgPSByZXF1aXJlKCcuL2xpYi9tYWluJylbJ2RlZmF1bHQnXTtcblxuLy8gQWRkIGFsbCBsb2NhbGUgZGF0YSB0byBgSW50bE1lc3NhZ2VGb3JtYXRgLiBUaGlzIG1vZHVsZSB3aWxsIGJlIGlnbm9yZWQgd2hlblxuLy8gYnVuZGxpbmcgZm9yIHRoZSBicm93c2VyIHdpdGggQnJvd3NlcmlmeS9XZWJwYWNrLlxucmVxdWlyZSgnLi9saWIvbG9jYWxlcycpO1xuXG4vLyBSZS1leHBvcnQgYEludGxNZXNzYWdlRm9ybWF0YCBhcyB0aGUgQ29tbW9uSlMgZGVmYXVsdCBleHBvcnRzIHdpdGggYWxsIHRoZVxuLy8gbG9jYWxlIGRhdGEgcmVnaXN0ZXJlZCwgYW5kIHdpdGggRW5nbGlzaCBzZXQgYXMgdGhlIGRlZmF1bHQgbG9jYWxlLiBEZWZpbmVcbi8vIHRoZSBgZGVmYXVsdGAgcHJvcCBmb3IgdXNlIHdpdGggb3RoZXIgY29tcGlsZWQgRVM2IE1vZHVsZXMuXG5leHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBJbnRsTWVzc2FnZUZvcm1hdDtcbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IGV4cG9ydHM7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///198\n")},function(module,exports,__webpack_require__){"use strict";eval('/* jslint esnext: true */\n\n\nvar src$core$$ = __webpack_require__(200), src$en$$ = __webpack_require__(205);\n\nsrc$core$$["default"].__addLocaleData(src$en$$["default"]);\nsrc$core$$["default"].defaultLocale = \'en\';\n\nexports["default"] = src$core$$["default"];\n\n//# sourceMappingURL=main.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTk5LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2ludGwtbWVzc2FnZWZvcm1hdC9saWIvbWFpbi5qcz85NTUwIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIGpzbGludCBlc25leHQ6IHRydWUgKi9cblxuXCJ1c2Ugc3RyaWN0XCI7XG52YXIgc3JjJGNvcmUkJCA9IHJlcXVpcmUoXCIuL2NvcmVcIiksIHNyYyRlbiQkID0gcmVxdWlyZShcIi4vZW5cIik7XG5cbnNyYyRjb3JlJCRbXCJkZWZhdWx0XCJdLl9fYWRkTG9jYWxlRGF0YShzcmMkZW4kJFtcImRlZmF1bHRcIl0pO1xuc3JjJGNvcmUkJFtcImRlZmF1bHRcIl0uZGVmYXVsdExvY2FsZSA9ICdlbic7XG5cbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gc3JjJGNvcmUkJFtcImRlZmF1bHRcIl07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1haW4uanMubWFwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///199\n')},function(module,exports,__webpack_require__){"use strict";eval("/*\nCopyright (c) 2014, Yahoo! Inc. All rights reserved.\nCopyrights licensed under the New BSD License.\nSee the accompanying LICENSE file for terms.\n*/\n\n/* jslint esnext: true */\n\n\nvar src$utils$$ = __webpack_require__(69), src$es5$$ = __webpack_require__(201), src$compiler$$ = __webpack_require__(202), intl$messageformat$parser$$ = __webpack_require__(203);\nexports[\"default\"] = MessageFormat;\n\n// -- MessageFormat --------------------------------------------------------\n\nfunction MessageFormat(message, locales, formats) {\n    // Parse string messages into an AST.\n    var ast = typeof message === 'string' ?\n            MessageFormat.__parse(message) : message;\n\n    if (!(ast && ast.type === 'messageFormatPattern')) {\n        throw new TypeError('A message must be provided as a String or AST.');\n    }\n\n    // Creates a new object with the specified `formats` merged with the default\n    // formats.\n    formats = this._mergeFormats(MessageFormat.formats, formats);\n\n    // Defined first because it's used to build the format pattern.\n    src$es5$$.defineProperty(this, '_locale',  {value: this._resolveLocale(locales)});\n\n    // Compile the `ast` to a pattern that is highly optimized for repeated\n    // `format()` invocations. **Note:** This passes the `locales` set provided\n    // to the constructor instead of just the resolved locale.\n    var pluralFn = this._findPluralRuleFunction(this._locale);\n    var pattern  = this._compilePattern(ast, locales, formats, pluralFn);\n\n    // \"Bind\" `format()` method to `this` so it can be passed by reference like\n    // the other `Intl` APIs.\n    var messageFormat = this;\n    this.format = function (values) {\n      try {\n        return messageFormat._format(pattern, values);\n      } catch (e) {\n        if (e.variableId) {\n          throw new Error(\n            'The intl string context variable \\'' + e.variableId + '\\'' +\n            ' was not provided to the string \\'' + message + '\\''\n          );\n        } else {\n          throw e;\n        }\n      }\n    };\n}\n\n// Default format options used as the prototype of the `formats` provided to the\n// constructor. These are used when constructing the internal Intl.NumberFormat\n// and Intl.DateTimeFormat instances.\nsrc$es5$$.defineProperty(MessageFormat, 'formats', {\n    enumerable: true,\n\n    value: {\n        number: {\n            'currency': {\n                style: 'currency'\n            },\n\n            'percent': {\n                style: 'percent'\n            }\n        },\n\n        date: {\n            'short': {\n                month: 'numeric',\n                day  : 'numeric',\n                year : '2-digit'\n            },\n\n            'medium': {\n                month: 'short',\n                day  : 'numeric',\n                year : 'numeric'\n            },\n\n            'long': {\n                month: 'long',\n                day  : 'numeric',\n                year : 'numeric'\n            },\n\n            'full': {\n                weekday: 'long',\n                month  : 'long',\n                day    : 'numeric',\n                year   : 'numeric'\n            }\n        },\n\n        time: {\n            'short': {\n                hour  : 'numeric',\n                minute: 'numeric'\n            },\n\n            'medium':  {\n                hour  : 'numeric',\n                minute: 'numeric',\n                second: 'numeric'\n            },\n\n            'long': {\n                hour        : 'numeric',\n                minute      : 'numeric',\n                second      : 'numeric',\n                timeZoneName: 'short'\n            },\n\n            'full': {\n                hour        : 'numeric',\n                minute      : 'numeric',\n                second      : 'numeric',\n                timeZoneName: 'short'\n            }\n        }\n    }\n});\n\n// Define internal private properties for dealing with locale data.\nsrc$es5$$.defineProperty(MessageFormat, '__localeData__', {value: src$es5$$.objCreate(null)});\nsrc$es5$$.defineProperty(MessageFormat, '__addLocaleData', {value: function (data) {\n    if (!(data && data.locale)) {\n        throw new Error(\n            'Locale data provided to IntlMessageFormat is missing a ' +\n            '`locale` property'\n        );\n    }\n\n    MessageFormat.__localeData__[data.locale.toLowerCase()] = data;\n}});\n\n// Defines `__parse()` static method as an exposed private.\nsrc$es5$$.defineProperty(MessageFormat, '__parse', {value: intl$messageformat$parser$$[\"default\"].parse});\n\n// Define public `defaultLocale` property which defaults to English, but can be\n// set by the developer.\nsrc$es5$$.defineProperty(MessageFormat, 'defaultLocale', {\n    enumerable: true,\n    writable  : true,\n    value     : undefined\n});\n\nMessageFormat.prototype.resolvedOptions = function () {\n    // TODO: Provide anything else?\n    return {\n        locale: this._locale\n    };\n};\n\nMessageFormat.prototype._compilePattern = function (ast, locales, formats, pluralFn) {\n    var compiler = new src$compiler$$[\"default\"](locales, formats, pluralFn);\n    return compiler.compile(ast);\n};\n\nMessageFormat.prototype._findPluralRuleFunction = function (locale) {\n    var localeData = MessageFormat.__localeData__;\n    var data       = localeData[locale.toLowerCase()];\n\n    // The locale data is de-duplicated, so we have to traverse the locale's\n    // hierarchy until we find a `pluralRuleFunction` to return.\n    while (data) {\n        if (data.pluralRuleFunction) {\n            return data.pluralRuleFunction;\n        }\n\n        data = data.parentLocale && localeData[data.parentLocale.toLowerCase()];\n    }\n\n    throw new Error(\n        'Locale data added to IntlMessageFormat is missing a ' +\n        '`pluralRuleFunction` for :' + locale\n    );\n};\n\nMessageFormat.prototype._format = function (pattern, values) {\n    var result = '',\n        i, len, part, id, value, err;\n\n    for (i = 0, len = pattern.length; i < len; i += 1) {\n        part = pattern[i];\n\n        // Exist early for string parts.\n        if (typeof part === 'string') {\n            result += part;\n            continue;\n        }\n\n        id = part.id;\n\n        // Enforce that all required values are provided by the caller.\n        if (!(values && src$utils$$.hop.call(values, id))) {\n          err = new Error('A value must be provided for: ' + id);\n          err.variableId = id;\n          throw err;\n        }\n\n        value = values[id];\n\n        // Recursively format plural and select parts' option — which can be a\n        // nested pattern structure. The choosing of the option to use is\n        // abstracted-by and delegated-to the part helper object.\n        if (part.options) {\n            result += this._format(part.getOption(value), values);\n        } else {\n            result += part.format(value);\n        }\n    }\n\n    return result;\n};\n\nMessageFormat.prototype._mergeFormats = function (defaults, formats) {\n    var mergedFormats = {},\n        type, mergedType;\n\n    for (type in defaults) {\n        if (!src$utils$$.hop.call(defaults, type)) { continue; }\n\n        mergedFormats[type] = mergedType = src$es5$$.objCreate(defaults[type]);\n\n        if (formats && src$utils$$.hop.call(formats, type)) {\n            src$utils$$.extend(mergedType, formats[type]);\n        }\n    }\n\n    return mergedFormats;\n};\n\nMessageFormat.prototype._resolveLocale = function (locales) {\n    if (typeof locales === 'string') {\n        locales = [locales];\n    }\n\n    // Create a copy of the array so we can push on the default locale.\n    locales = (locales || []).concat(MessageFormat.defaultLocale);\n\n    var localeData = MessageFormat.__localeData__;\n    var i, len, localeParts, data;\n\n    // Using the set of locales + the default locale, we look for the first one\n    // which that has been registered. When data does not exist for a locale, we\n    // traverse its ancestors to find something that's been registered within\n    // its hierarchy of locales. Since we lack the proper `parentLocale` data\n    // here, we must take a naive approach to traversal.\n    for (i = 0, len = locales.length; i < len; i += 1) {\n        localeParts = locales[i].toLowerCase().split('-');\n\n        while (localeParts.length) {\n            data = localeData[localeParts.join('-')];\n            if (data) {\n                // Return the normalized locale string; e.g., we return \"en-US\",\n                // instead of \"en-us\".\n                return data.locale;\n            }\n\n            localeParts.pop();\n        }\n    }\n\n    var defaultLocale = locales.pop();\n    throw new Error(\n        'No locale data has been added to IntlMessageFormat for: ' +\n        locales.join(', ') + ', or the default locale: ' + defaultLocale\n    );\n};\n\n//# sourceMappingURL=core.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjAwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2ludGwtbWVzc2FnZWZvcm1hdC9saWIvY29yZS5qcz83Y2QyIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXG5Db3B5cmlnaHQgKGMpIDIwMTQsIFlhaG9vISBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5Db3B5cmlnaHRzIGxpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIExpY2Vuc2UuXG5TZWUgdGhlIGFjY29tcGFueWluZyBMSUNFTlNFIGZpbGUgZm9yIHRlcm1zLlxuKi9cblxuLyoganNsaW50IGVzbmV4dDogdHJ1ZSAqL1xuXG5cInVzZSBzdHJpY3RcIjtcbnZhciBzcmMkdXRpbHMkJCA9IHJlcXVpcmUoXCIuL3V0aWxzXCIpLCBzcmMkZXM1JCQgPSByZXF1aXJlKFwiLi9lczVcIiksIHNyYyRjb21waWxlciQkID0gcmVxdWlyZShcIi4vY29tcGlsZXJcIiksIGludGwkbWVzc2FnZWZvcm1hdCRwYXJzZXIkJCA9IHJlcXVpcmUoXCJpbnRsLW1lc3NhZ2Vmb3JtYXQtcGFyc2VyXCIpO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBNZXNzYWdlRm9ybWF0O1xuXG4vLyAtLSBNZXNzYWdlRm9ybWF0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmZ1bmN0aW9uIE1lc3NhZ2VGb3JtYXQobWVzc2FnZSwgbG9jYWxlcywgZm9ybWF0cykge1xuICAgIC8vIFBhcnNlIHN0cmluZyBtZXNzYWdlcyBpbnRvIGFuIEFTVC5cbiAgICB2YXIgYXN0ID0gdHlwZW9mIG1lc3NhZ2UgPT09ICdzdHJpbmcnID9cbiAgICAgICAgICAgIE1lc3NhZ2VGb3JtYXQuX19wYXJzZShtZXNzYWdlKSA6IG1lc3NhZ2U7XG5cbiAgICBpZiAoIShhc3QgJiYgYXN0LnR5cGUgPT09ICdtZXNzYWdlRm9ybWF0UGF0dGVybicpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0EgbWVzc2FnZSBtdXN0IGJlIHByb3ZpZGVkIGFzIGEgU3RyaW5nIG9yIEFTVC4nKTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGVzIGEgbmV3IG9iamVjdCB3aXRoIHRoZSBzcGVjaWZpZWQgYGZvcm1hdHNgIG1lcmdlZCB3aXRoIHRoZSBkZWZhdWx0XG4gICAgLy8gZm9ybWF0cy5cbiAgICBmb3JtYXRzID0gdGhpcy5fbWVyZ2VGb3JtYXRzKE1lc3NhZ2VGb3JtYXQuZm9ybWF0cywgZm9ybWF0cyk7XG5cbiAgICAvLyBEZWZpbmVkIGZpcnN0IGJlY2F1c2UgaXQncyB1c2VkIHRvIGJ1aWxkIHRoZSBmb3JtYXQgcGF0dGVybi5cbiAgICBzcmMkZXM1JCQuZGVmaW5lUHJvcGVydHkodGhpcywgJ19sb2NhbGUnLCAge3ZhbHVlOiB0aGlzLl9yZXNvbHZlTG9jYWxlKGxvY2FsZXMpfSk7XG5cbiAgICAvLyBDb21waWxlIHRoZSBgYXN0YCB0byBhIHBhdHRlcm4gdGhhdCBpcyBoaWdobHkgb3B0aW1pemVkIGZvciByZXBlYXRlZFxuICAgIC8vIGBmb3JtYXQoKWAgaW52b2NhdGlvbnMuICoqTm90ZToqKiBUaGlzIHBhc3NlcyB0aGUgYGxvY2FsZXNgIHNldCBwcm92aWRlZFxuICAgIC8vIHRvIHRoZSBjb25zdHJ1Y3RvciBpbnN0ZWFkIG9mIGp1c3QgdGhlIHJlc29sdmVkIGxvY2FsZS5cbiAgICB2YXIgcGx1cmFsRm4gPSB0aGlzLl9maW5kUGx1cmFsUnVsZUZ1bmN0aW9uKHRoaXMuX2xvY2FsZSk7XG4gICAgdmFyIHBhdHRlcm4gID0gdGhpcy5fY29tcGlsZVBhdHRlcm4oYXN0LCBsb2NhbGVzLCBmb3JtYXRzLCBwbHVyYWxGbik7XG5cbiAgICAvLyBcIkJpbmRcIiBgZm9ybWF0KClgIG1ldGhvZCB0byBgdGhpc2Agc28gaXQgY2FuIGJlIHBhc3NlZCBieSByZWZlcmVuY2UgbGlrZVxuICAgIC8vIHRoZSBvdGhlciBgSW50bGAgQVBJcy5cbiAgICB2YXIgbWVzc2FnZUZvcm1hdCA9IHRoaXM7XG4gICAgdGhpcy5mb3JtYXQgPSBmdW5jdGlvbiAodmFsdWVzKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gbWVzc2FnZUZvcm1hdC5fZm9ybWF0KHBhdHRlcm4sIHZhbHVlcyk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmIChlLnZhcmlhYmxlSWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAnVGhlIGludGwgc3RyaW5nIGNvbnRleHQgdmFyaWFibGUgXFwnJyArIGUudmFyaWFibGVJZCArICdcXCcnICtcbiAgICAgICAgICAgICcgd2FzIG5vdCBwcm92aWRlZCB0byB0aGUgc3RyaW5nIFxcJycgKyBtZXNzYWdlICsgJ1xcJydcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xufVxuXG4vLyBEZWZhdWx0IGZvcm1hdCBvcHRpb25zIHVzZWQgYXMgdGhlIHByb3RvdHlwZSBvZiB0aGUgYGZvcm1hdHNgIHByb3ZpZGVkIHRvIHRoZVxuLy8gY29uc3RydWN0b3IuIFRoZXNlIGFyZSB1c2VkIHdoZW4gY29uc3RydWN0aW5nIHRoZSBpbnRlcm5hbCBJbnRsLk51bWJlckZvcm1hdFxuLy8gYW5kIEludGwuRGF0ZVRpbWVGb3JtYXQgaW5zdGFuY2VzLlxuc3JjJGVzNSQkLmRlZmluZVByb3BlcnR5KE1lc3NhZ2VGb3JtYXQsICdmb3JtYXRzJywge1xuICAgIGVudW1lcmFibGU6IHRydWUsXG5cbiAgICB2YWx1ZToge1xuICAgICAgICBudW1iZXI6IHtcbiAgICAgICAgICAgICdjdXJyZW5jeSc6IHtcbiAgICAgICAgICAgICAgICBzdHlsZTogJ2N1cnJlbmN5J1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgJ3BlcmNlbnQnOiB7XG4gICAgICAgICAgICAgICAgc3R5bGU6ICdwZXJjZW50J1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIGRhdGU6IHtcbiAgICAgICAgICAgICdzaG9ydCc6IHtcbiAgICAgICAgICAgICAgICBtb250aDogJ251bWVyaWMnLFxuICAgICAgICAgICAgICAgIGRheSAgOiAnbnVtZXJpYycsXG4gICAgICAgICAgICAgICAgeWVhciA6ICcyLWRpZ2l0J1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgJ21lZGl1bSc6IHtcbiAgICAgICAgICAgICAgICBtb250aDogJ3Nob3J0JyxcbiAgICAgICAgICAgICAgICBkYXkgIDogJ251bWVyaWMnLFxuICAgICAgICAgICAgICAgIHllYXIgOiAnbnVtZXJpYydcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgICdsb25nJzoge1xuICAgICAgICAgICAgICAgIG1vbnRoOiAnbG9uZycsXG4gICAgICAgICAgICAgICAgZGF5ICA6ICdudW1lcmljJyxcbiAgICAgICAgICAgICAgICB5ZWFyIDogJ251bWVyaWMnXG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAnZnVsbCc6IHtcbiAgICAgICAgICAgICAgICB3ZWVrZGF5OiAnbG9uZycsXG4gICAgICAgICAgICAgICAgbW9udGggIDogJ2xvbmcnLFxuICAgICAgICAgICAgICAgIGRheSAgICA6ICdudW1lcmljJyxcbiAgICAgICAgICAgICAgICB5ZWFyICAgOiAnbnVtZXJpYydcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICB0aW1lOiB7XG4gICAgICAgICAgICAnc2hvcnQnOiB7XG4gICAgICAgICAgICAgICAgaG91ciAgOiAnbnVtZXJpYycsXG4gICAgICAgICAgICAgICAgbWludXRlOiAnbnVtZXJpYydcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgICdtZWRpdW0nOiAge1xuICAgICAgICAgICAgICAgIGhvdXIgIDogJ251bWVyaWMnLFxuICAgICAgICAgICAgICAgIG1pbnV0ZTogJ251bWVyaWMnLFxuICAgICAgICAgICAgICAgIHNlY29uZDogJ251bWVyaWMnXG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAnbG9uZyc6IHtcbiAgICAgICAgICAgICAgICBob3VyICAgICAgICA6ICdudW1lcmljJyxcbiAgICAgICAgICAgICAgICBtaW51dGUgICAgICA6ICdudW1lcmljJyxcbiAgICAgICAgICAgICAgICBzZWNvbmQgICAgICA6ICdudW1lcmljJyxcbiAgICAgICAgICAgICAgICB0aW1lWm9uZU5hbWU6ICdzaG9ydCdcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgICdmdWxsJzoge1xuICAgICAgICAgICAgICAgIGhvdXIgICAgICAgIDogJ251bWVyaWMnLFxuICAgICAgICAgICAgICAgIG1pbnV0ZSAgICAgIDogJ251bWVyaWMnLFxuICAgICAgICAgICAgICAgIHNlY29uZCAgICAgIDogJ251bWVyaWMnLFxuICAgICAgICAgICAgICAgIHRpbWVab25lTmFtZTogJ3Nob3J0J1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufSk7XG5cbi8vIERlZmluZSBpbnRlcm5hbCBwcml2YXRlIHByb3BlcnRpZXMgZm9yIGRlYWxpbmcgd2l0aCBsb2NhbGUgZGF0YS5cbnNyYyRlczUkJC5kZWZpbmVQcm9wZXJ0eShNZXNzYWdlRm9ybWF0LCAnX19sb2NhbGVEYXRhX18nLCB7dmFsdWU6IHNyYyRlczUkJC5vYmpDcmVhdGUobnVsbCl9KTtcbnNyYyRlczUkJC5kZWZpbmVQcm9wZXJ0eShNZXNzYWdlRm9ybWF0LCAnX19hZGRMb2NhbGVEYXRhJywge3ZhbHVlOiBmdW5jdGlvbiAoZGF0YSkge1xuICAgIGlmICghKGRhdGEgJiYgZGF0YS5sb2NhbGUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICdMb2NhbGUgZGF0YSBwcm92aWRlZCB0byBJbnRsTWVzc2FnZUZvcm1hdCBpcyBtaXNzaW5nIGEgJyArXG4gICAgICAgICAgICAnYGxvY2FsZWAgcHJvcGVydHknXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgTWVzc2FnZUZvcm1hdC5fX2xvY2FsZURhdGFfX1tkYXRhLmxvY2FsZS50b0xvd2VyQ2FzZSgpXSA9IGRhdGE7XG59fSk7XG5cbi8vIERlZmluZXMgYF9fcGFyc2UoKWAgc3RhdGljIG1ldGhvZCBhcyBhbiBleHBvc2VkIHByaXZhdGUuXG5zcmMkZXM1JCQuZGVmaW5lUHJvcGVydHkoTWVzc2FnZUZvcm1hdCwgJ19fcGFyc2UnLCB7dmFsdWU6IGludGwkbWVzc2FnZWZvcm1hdCRwYXJzZXIkJFtcImRlZmF1bHRcIl0ucGFyc2V9KTtcblxuLy8gRGVmaW5lIHB1YmxpYyBgZGVmYXVsdExvY2FsZWAgcHJvcGVydHkgd2hpY2ggZGVmYXVsdHMgdG8gRW5nbGlzaCwgYnV0IGNhbiBiZVxuLy8gc2V0IGJ5IHRoZSBkZXZlbG9wZXIuXG5zcmMkZXM1JCQuZGVmaW5lUHJvcGVydHkoTWVzc2FnZUZvcm1hdCwgJ2RlZmF1bHRMb2NhbGUnLCB7XG4gICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICB3cml0YWJsZSAgOiB0cnVlLFxuICAgIHZhbHVlICAgICA6IHVuZGVmaW5lZFxufSk7XG5cbk1lc3NhZ2VGb3JtYXQucHJvdG90eXBlLnJlc29sdmVkT3B0aW9ucyA9IGZ1bmN0aW9uICgpIHtcbiAgICAvLyBUT0RPOiBQcm92aWRlIGFueXRoaW5nIGVsc2U/XG4gICAgcmV0dXJuIHtcbiAgICAgICAgbG9jYWxlOiB0aGlzLl9sb2NhbGVcbiAgICB9O1xufTtcblxuTWVzc2FnZUZvcm1hdC5wcm90b3R5cGUuX2NvbXBpbGVQYXR0ZXJuID0gZnVuY3Rpb24gKGFzdCwgbG9jYWxlcywgZm9ybWF0cywgcGx1cmFsRm4pIHtcbiAgICB2YXIgY29tcGlsZXIgPSBuZXcgc3JjJGNvbXBpbGVyJCRbXCJkZWZhdWx0XCJdKGxvY2FsZXMsIGZvcm1hdHMsIHBsdXJhbEZuKTtcbiAgICByZXR1cm4gY29tcGlsZXIuY29tcGlsZShhc3QpO1xufTtcblxuTWVzc2FnZUZvcm1hdC5wcm90b3R5cGUuX2ZpbmRQbHVyYWxSdWxlRnVuY3Rpb24gPSBmdW5jdGlvbiAobG9jYWxlKSB7XG4gICAgdmFyIGxvY2FsZURhdGEgPSBNZXNzYWdlRm9ybWF0Ll9fbG9jYWxlRGF0YV9fO1xuICAgIHZhciBkYXRhICAgICAgID0gbG9jYWxlRGF0YVtsb2NhbGUudG9Mb3dlckNhc2UoKV07XG5cbiAgICAvLyBUaGUgbG9jYWxlIGRhdGEgaXMgZGUtZHVwbGljYXRlZCwgc28gd2UgaGF2ZSB0byB0cmF2ZXJzZSB0aGUgbG9jYWxlJ3NcbiAgICAvLyBoaWVyYXJjaHkgdW50aWwgd2UgZmluZCBhIGBwbHVyYWxSdWxlRnVuY3Rpb25gIHRvIHJldHVybi5cbiAgICB3aGlsZSAoZGF0YSkge1xuICAgICAgICBpZiAoZGF0YS5wbHVyYWxSdWxlRnVuY3Rpb24pIHtcbiAgICAgICAgICAgIHJldHVybiBkYXRhLnBsdXJhbFJ1bGVGdW5jdGlvbjtcbiAgICAgICAgfVxuXG4gICAgICAgIGRhdGEgPSBkYXRhLnBhcmVudExvY2FsZSAmJiBsb2NhbGVEYXRhW2RhdGEucGFyZW50TG9jYWxlLnRvTG93ZXJDYXNlKCldO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ0xvY2FsZSBkYXRhIGFkZGVkIHRvIEludGxNZXNzYWdlRm9ybWF0IGlzIG1pc3NpbmcgYSAnICtcbiAgICAgICAgJ2BwbHVyYWxSdWxlRnVuY3Rpb25gIGZvciA6JyArIGxvY2FsZVxuICAgICk7XG59O1xuXG5NZXNzYWdlRm9ybWF0LnByb3RvdHlwZS5fZm9ybWF0ID0gZnVuY3Rpb24gKHBhdHRlcm4sIHZhbHVlcykge1xuICAgIHZhciByZXN1bHQgPSAnJyxcbiAgICAgICAgaSwgbGVuLCBwYXJ0LCBpZCwgdmFsdWUsIGVycjtcblxuICAgIGZvciAoaSA9IDAsIGxlbiA9IHBhdHRlcm4ubGVuZ3RoOyBpIDwgbGVuOyBpICs9IDEpIHtcbiAgICAgICAgcGFydCA9IHBhdHRlcm5baV07XG5cbiAgICAgICAgLy8gRXhpc3QgZWFybHkgZm9yIHN0cmluZyBwYXJ0cy5cbiAgICAgICAgaWYgKHR5cGVvZiBwYXJ0ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmVzdWx0ICs9IHBhcnQ7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlkID0gcGFydC5pZDtcblxuICAgICAgICAvLyBFbmZvcmNlIHRoYXQgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgcHJvdmlkZWQgYnkgdGhlIGNhbGxlci5cbiAgICAgICAgaWYgKCEodmFsdWVzICYmIHNyYyR1dGlscyQkLmhvcC5jYWxsKHZhbHVlcywgaWQpKSkge1xuICAgICAgICAgIGVyciA9IG5ldyBFcnJvcignQSB2YWx1ZSBtdXN0IGJlIHByb3ZpZGVkIGZvcjogJyArIGlkKTtcbiAgICAgICAgICBlcnIudmFyaWFibGVJZCA9IGlkO1xuICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhbHVlID0gdmFsdWVzW2lkXTtcblxuICAgICAgICAvLyBSZWN1cnNpdmVseSBmb3JtYXQgcGx1cmFsIGFuZCBzZWxlY3QgcGFydHMnIG9wdGlvbiDigJQgd2hpY2ggY2FuIGJlIGFcbiAgICAgICAgLy8gbmVzdGVkIHBhdHRlcm4gc3RydWN0dXJlLiBUaGUgY2hvb3Npbmcgb2YgdGhlIG9wdGlvbiB0byB1c2UgaXNcbiAgICAgICAgLy8gYWJzdHJhY3RlZC1ieSBhbmQgZGVsZWdhdGVkLXRvIHRoZSBwYXJ0IGhlbHBlciBvYmplY3QuXG4gICAgICAgIGlmIChwYXJ0Lm9wdGlvbnMpIHtcbiAgICAgICAgICAgIHJlc3VsdCArPSB0aGlzLl9mb3JtYXQocGFydC5nZXRPcHRpb24odmFsdWUpLCB2YWx1ZXMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzdWx0ICs9IHBhcnQuZm9ybWF0KHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG59O1xuXG5NZXNzYWdlRm9ybWF0LnByb3RvdHlwZS5fbWVyZ2VGb3JtYXRzID0gZnVuY3Rpb24gKGRlZmF1bHRzLCBmb3JtYXRzKSB7XG4gICAgdmFyIG1lcmdlZEZvcm1hdHMgPSB7fSxcbiAgICAgICAgdHlwZSwgbWVyZ2VkVHlwZTtcblxuICAgIGZvciAodHlwZSBpbiBkZWZhdWx0cykge1xuICAgICAgICBpZiAoIXNyYyR1dGlscyQkLmhvcC5jYWxsKGRlZmF1bHRzLCB0eXBlKSkgeyBjb250aW51ZTsgfVxuXG4gICAgICAgIG1lcmdlZEZvcm1hdHNbdHlwZV0gPSBtZXJnZWRUeXBlID0gc3JjJGVzNSQkLm9iakNyZWF0ZShkZWZhdWx0c1t0eXBlXSk7XG5cbiAgICAgICAgaWYgKGZvcm1hdHMgJiYgc3JjJHV0aWxzJCQuaG9wLmNhbGwoZm9ybWF0cywgdHlwZSkpIHtcbiAgICAgICAgICAgIHNyYyR1dGlscyQkLmV4dGVuZChtZXJnZWRUeXBlLCBmb3JtYXRzW3R5cGVdKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBtZXJnZWRGb3JtYXRzO1xufTtcblxuTWVzc2FnZUZvcm1hdC5wcm90b3R5cGUuX3Jlc29sdmVMb2NhbGUgPSBmdW5jdGlvbiAobG9jYWxlcykge1xuICAgIGlmICh0eXBlb2YgbG9jYWxlcyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgbG9jYWxlcyA9IFtsb2NhbGVzXTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgYSBjb3B5IG9mIHRoZSBhcnJheSBzbyB3ZSBjYW4gcHVzaCBvbiB0aGUgZGVmYXVsdCBsb2NhbGUuXG4gICAgbG9jYWxlcyA9IChsb2NhbGVzIHx8IFtdKS5jb25jYXQoTWVzc2FnZUZvcm1hdC5kZWZhdWx0TG9jYWxlKTtcblxuICAgIHZhciBsb2NhbGVEYXRhID0gTWVzc2FnZUZvcm1hdC5fX2xvY2FsZURhdGFfXztcbiAgICB2YXIgaSwgbGVuLCBsb2NhbGVQYXJ0cywgZGF0YTtcblxuICAgIC8vIFVzaW5nIHRoZSBzZXQgb2YgbG9jYWxlcyArIHRoZSBkZWZhdWx0IGxvY2FsZSwgd2UgbG9vayBmb3IgdGhlIGZpcnN0IG9uZVxuICAgIC8vIHdoaWNoIHRoYXQgaGFzIGJlZW4gcmVnaXN0ZXJlZC4gV2hlbiBkYXRhIGRvZXMgbm90IGV4aXN0IGZvciBhIGxvY2FsZSwgd2VcbiAgICAvLyB0cmF2ZXJzZSBpdHMgYW5jZXN0b3JzIHRvIGZpbmQgc29tZXRoaW5nIHRoYXQncyBiZWVuIHJlZ2lzdGVyZWQgd2l0aGluXG4gICAgLy8gaXRzIGhpZXJhcmNoeSBvZiBsb2NhbGVzLiBTaW5jZSB3ZSBsYWNrIHRoZSBwcm9wZXIgYHBhcmVudExvY2FsZWAgZGF0YVxuICAgIC8vIGhlcmUsIHdlIG11c3QgdGFrZSBhIG5haXZlIGFwcHJvYWNoIHRvIHRyYXZlcnNhbC5cbiAgICBmb3IgKGkgPSAwLCBsZW4gPSBsb2NhbGVzLmxlbmd0aDsgaSA8IGxlbjsgaSArPSAxKSB7XG4gICAgICAgIGxvY2FsZVBhcnRzID0gbG9jYWxlc1tpXS50b0xvd2VyQ2FzZSgpLnNwbGl0KCctJyk7XG5cbiAgICAgICAgd2hpbGUgKGxvY2FsZVBhcnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgZGF0YSA9IGxvY2FsZURhdGFbbG9jYWxlUGFydHMuam9pbignLScpXTtcbiAgICAgICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgICAgICAgLy8gUmV0dXJuIHRoZSBub3JtYWxpemVkIGxvY2FsZSBzdHJpbmc7IGUuZy4sIHdlIHJldHVybiBcImVuLVVTXCIsXG4gICAgICAgICAgICAgICAgLy8gaW5zdGVhZCBvZiBcImVuLXVzXCIuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGRhdGEubG9jYWxlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsb2NhbGVQYXJ0cy5wb3AoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciBkZWZhdWx0TG9jYWxlID0gbG9jYWxlcy5wb3AoKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdObyBsb2NhbGUgZGF0YSBoYXMgYmVlbiBhZGRlZCB0byBJbnRsTWVzc2FnZUZvcm1hdCBmb3I6ICcgK1xuICAgICAgICBsb2NhbGVzLmpvaW4oJywgJykgKyAnLCBvciB0aGUgZGVmYXVsdCBsb2NhbGU6ICcgKyBkZWZhdWx0TG9jYWxlXG4gICAgKTtcbn07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvcmUuanMubWFwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///200\n")},function(module,exports,__webpack_require__){"use strict";eval("/*\nCopyright (c) 2014, Yahoo! Inc. All rights reserved.\nCopyrights licensed under the New BSD License.\nSee the accompanying LICENSE file for terms.\n*/\n\n/* jslint esnext: true */\n\n\nvar src$utils$$ = __webpack_require__(69);\n\n// Purposely using the same implementation as the Intl.js `Intl` polyfill.\n// Copyright 2013 Andy Earnshaw, MIT License\n\nvar realDefineProp = (function () {\n    try { return !!Object.defineProperty({}, 'a', {}); }\n    catch (e) { return false; }\n})();\n\nvar es3 = !realDefineProp && !Object.prototype.__defineGetter__;\n\nvar defineProperty = realDefineProp ? Object.defineProperty :\n        function (obj, name, desc) {\n\n    if ('get' in desc && obj.__defineGetter__) {\n        obj.__defineGetter__(name, desc.get);\n    } else if (!src$utils$$.hop.call(obj, name) || 'value' in desc) {\n        obj[name] = desc.value;\n    }\n};\n\nvar objCreate = Object.create || function (proto, props) {\n    var obj, k;\n\n    function F() {}\n    F.prototype = proto;\n    obj = new F();\n\n    for (k in props) {\n        if (src$utils$$.hop.call(props, k)) {\n            defineProperty(obj, k, props[k]);\n        }\n    }\n\n    return obj;\n};\n\nexports.defineProperty = defineProperty, exports.objCreate = objCreate;\n\n//# sourceMappingURL=es5.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjAxLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2ludGwtbWVzc2FnZWZvcm1hdC9saWIvZXM1LmpzPzY4NjIiXSwic291cmNlc0NvbnRlbnQiOlsiLypcbkNvcHlyaWdodCAoYykgMjAxNCwgWWFob28hIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbkNvcHlyaWdodHMgbGljZW5zZWQgdW5kZXIgdGhlIE5ldyBCU0QgTGljZW5zZS5cblNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4qL1xuXG4vKiBqc2xpbnQgZXNuZXh0OiB0cnVlICovXG5cblwidXNlIHN0cmljdFwiO1xudmFyIHNyYyR1dGlscyQkID0gcmVxdWlyZShcIi4vdXRpbHNcIik7XG5cbi8vIFB1cnBvc2VseSB1c2luZyB0aGUgc2FtZSBpbXBsZW1lbnRhdGlvbiBhcyB0aGUgSW50bC5qcyBgSW50bGAgcG9seWZpbGwuXG4vLyBDb3B5cmlnaHQgMjAxMyBBbmR5IEVhcm5zaGF3LCBNSVQgTGljZW5zZVxuXG52YXIgcmVhbERlZmluZVByb3AgPSAoZnVuY3Rpb24gKCkge1xuICAgIHRyeSB7IHJldHVybiAhIU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwgJ2EnLCB7fSk7IH1cbiAgICBjYXRjaCAoZSkgeyByZXR1cm4gZmFsc2U7IH1cbn0pKCk7XG5cbnZhciBlczMgPSAhcmVhbERlZmluZVByb3AgJiYgIU9iamVjdC5wcm90b3R5cGUuX19kZWZpbmVHZXR0ZXJfXztcblxudmFyIGRlZmluZVByb3BlcnR5ID0gcmVhbERlZmluZVByb3AgPyBPYmplY3QuZGVmaW5lUHJvcGVydHkgOlxuICAgICAgICBmdW5jdGlvbiAob2JqLCBuYW1lLCBkZXNjKSB7XG5cbiAgICBpZiAoJ2dldCcgaW4gZGVzYyAmJiBvYmouX19kZWZpbmVHZXR0ZXJfXykge1xuICAgICAgICBvYmouX19kZWZpbmVHZXR0ZXJfXyhuYW1lLCBkZXNjLmdldCk7XG4gICAgfSBlbHNlIGlmICghc3JjJHV0aWxzJCQuaG9wLmNhbGwob2JqLCBuYW1lKSB8fCAndmFsdWUnIGluIGRlc2MpIHtcbiAgICAgICAgb2JqW25hbWVdID0gZGVzYy52YWx1ZTtcbiAgICB9XG59O1xuXG52YXIgb2JqQ3JlYXRlID0gT2JqZWN0LmNyZWF0ZSB8fCBmdW5jdGlvbiAocHJvdG8sIHByb3BzKSB7XG4gICAgdmFyIG9iaiwgaztcblxuICAgIGZ1bmN0aW9uIEYoKSB7fVxuICAgIEYucHJvdG90eXBlID0gcHJvdG87XG4gICAgb2JqID0gbmV3IEYoKTtcblxuICAgIGZvciAoayBpbiBwcm9wcykge1xuICAgICAgICBpZiAoc3JjJHV0aWxzJCQuaG9wLmNhbGwocHJvcHMsIGspKSB7XG4gICAgICAgICAgICBkZWZpbmVQcm9wZXJ0eShvYmosIGssIHByb3BzW2tdKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBvYmo7XG59O1xuXG5leHBvcnRzLmRlZmluZVByb3BlcnR5ID0gZGVmaW5lUHJvcGVydHksIGV4cG9ydHMub2JqQ3JlYXRlID0gb2JqQ3JlYXRlO1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1lczUuanMubWFwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///201\n")},function(module,exports,__webpack_require__){"use strict";eval("/*\nCopyright (c) 2014, Yahoo! Inc. All rights reserved.\nCopyrights licensed under the New BSD License.\nSee the accompanying LICENSE file for terms.\n*/\n\n/* jslint esnext: true */\n\n\nexports[\"default\"] = Compiler;\n\nfunction Compiler(locales, formats, pluralFn) {\n    this.locales  = locales;\n    this.formats  = formats;\n    this.pluralFn = pluralFn;\n}\n\nCompiler.prototype.compile = function (ast) {\n    this.pluralStack        = [];\n    this.currentPlural      = null;\n    this.pluralNumberFormat = null;\n\n    return this.compileMessage(ast);\n};\n\nCompiler.prototype.compileMessage = function (ast) {\n    if (!(ast && ast.type === 'messageFormatPattern')) {\n        throw new Error('Message AST is not of type: \"messageFormatPattern\"');\n    }\n\n    var elements = ast.elements,\n        pattern  = [];\n\n    var i, len, element;\n\n    for (i = 0, len = elements.length; i < len; i += 1) {\n        element = elements[i];\n\n        switch (element.type) {\n            case 'messageTextElement':\n                pattern.push(this.compileMessageText(element));\n                break;\n\n            case 'argumentElement':\n                pattern.push(this.compileArgument(element));\n                break;\n\n            default:\n                throw new Error('Message element does not have a valid type');\n        }\n    }\n\n    return pattern;\n};\n\nCompiler.prototype.compileMessageText = function (element) {\n    // When this `element` is part of plural sub-pattern and its value contains\n    // an unescaped '#', use a `PluralOffsetString` helper to properly output\n    // the number with the correct offset in the string.\n    if (this.currentPlural && /(^|[^\\\\])#/g.test(element.value)) {\n        // Create a cache a NumberFormat instance that can be reused for any\n        // PluralOffsetString instance in this message.\n        if (!this.pluralNumberFormat) {\n            this.pluralNumberFormat = new Intl.NumberFormat(this.locales);\n        }\n\n        return new PluralOffsetString(\n                this.currentPlural.id,\n                this.currentPlural.format.offset,\n                this.pluralNumberFormat,\n                element.value);\n    }\n\n    // Unescape the escaped '#'s in the message text.\n    return element.value.replace(/\\\\#/g, '#');\n};\n\nCompiler.prototype.compileArgument = function (element) {\n    var format = element.format;\n\n    if (!format) {\n        return new StringFormat(element.id);\n    }\n\n    var formats  = this.formats,\n        locales  = this.locales,\n        pluralFn = this.pluralFn,\n        options;\n\n    switch (format.type) {\n        case 'numberFormat':\n            options = formats.number[format.style];\n            return {\n                id    : element.id,\n                format: new Intl.NumberFormat(locales, options).format\n            };\n\n        case 'dateFormat':\n            options = formats.date[format.style];\n            return {\n                id    : element.id,\n                format: new Intl.DateTimeFormat(locales, options).format\n            };\n\n        case 'timeFormat':\n            options = formats.time[format.style];\n            return {\n                id    : element.id,\n                format: new Intl.DateTimeFormat(locales, options).format\n            };\n\n        case 'pluralFormat':\n            options = this.compileOptions(element);\n            return new PluralFormat(\n                element.id, format.ordinal, format.offset, options, pluralFn\n            );\n\n        case 'selectFormat':\n            options = this.compileOptions(element);\n            return new SelectFormat(element.id, options);\n\n        default:\n            throw new Error('Message element does not have a valid format type');\n    }\n};\n\nCompiler.prototype.compileOptions = function (element) {\n    var format      = element.format,\n        options     = format.options,\n        optionsHash = {};\n\n    // Save the current plural element, if any, then set it to a new value when\n    // compiling the options sub-patterns. This conforms the spec's algorithm\n    // for handling `\"#\"` syntax in message text.\n    this.pluralStack.push(this.currentPlural);\n    this.currentPlural = format.type === 'pluralFormat' ? element : null;\n\n    var i, len, option;\n\n    for (i = 0, len = options.length; i < len; i += 1) {\n        option = options[i];\n\n        // Compile the sub-pattern and save it under the options's selector.\n        optionsHash[option.selector] = this.compileMessage(option.value);\n    }\n\n    // Pop the plural stack to put back the original current plural value.\n    this.currentPlural = this.pluralStack.pop();\n\n    return optionsHash;\n};\n\n// -- Compiler Helper Classes --------------------------------------------------\n\nfunction StringFormat(id) {\n    this.id = id;\n}\n\nStringFormat.prototype.format = function (value) {\n    if (!value && typeof value !== 'number') {\n        return '';\n    }\n\n    return typeof value === 'string' ? value : String(value);\n};\n\nfunction PluralFormat(id, useOrdinal, offset, options, pluralFn) {\n    this.id         = id;\n    this.useOrdinal = useOrdinal;\n    this.offset     = offset;\n    this.options    = options;\n    this.pluralFn   = pluralFn;\n}\n\nPluralFormat.prototype.getOption = function (value) {\n    var options = this.options;\n\n    var option = options['=' + value] ||\n            options[this.pluralFn(value - this.offset, this.useOrdinal)];\n\n    return option || options.other;\n};\n\nfunction PluralOffsetString(id, offset, numberFormat, string) {\n    this.id           = id;\n    this.offset       = offset;\n    this.numberFormat = numberFormat;\n    this.string       = string;\n}\n\nPluralOffsetString.prototype.format = function (value) {\n    var number = this.numberFormat.format(value - this.offset);\n\n    return this.string\n            .replace(/(^|[^\\\\])#/g, '$1' + number)\n            .replace(/\\\\#/g, '#');\n};\n\nfunction SelectFormat(id, options) {\n    this.id      = id;\n    this.options = options;\n}\n\nSelectFormat.prototype.getOption = function (value) {\n    var options = this.options;\n    return options[value] || options.other;\n};\n\n//# sourceMappingURL=compiler.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjAyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2ludGwtbWVzc2FnZWZvcm1hdC9saWIvY29tcGlsZXIuanM/NWQ0NyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuQ29weXJpZ2h0IChjKSAyMDE0LCBZYWhvbyEgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBMaWNlbnNlLlxuU2VlIHRoZSBhY2NvbXBhbnlpbmcgTElDRU5TRSBmaWxlIGZvciB0ZXJtcy5cbiovXG5cbi8qIGpzbGludCBlc25leHQ6IHRydWUgKi9cblxuXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IENvbXBpbGVyO1xuXG5mdW5jdGlvbiBDb21waWxlcihsb2NhbGVzLCBmb3JtYXRzLCBwbHVyYWxGbikge1xuICAgIHRoaXMubG9jYWxlcyAgPSBsb2NhbGVzO1xuICAgIHRoaXMuZm9ybWF0cyAgPSBmb3JtYXRzO1xuICAgIHRoaXMucGx1cmFsRm4gPSBwbHVyYWxGbjtcbn1cblxuQ29tcGlsZXIucHJvdG90eXBlLmNvbXBpbGUgPSBmdW5jdGlvbiAoYXN0KSB7XG4gICAgdGhpcy5wbHVyYWxTdGFjayAgICAgICAgPSBbXTtcbiAgICB0aGlzLmN1cnJlbnRQbHVyYWwgICAgICA9IG51bGw7XG4gICAgdGhpcy5wbHVyYWxOdW1iZXJGb3JtYXQgPSBudWxsO1xuXG4gICAgcmV0dXJuIHRoaXMuY29tcGlsZU1lc3NhZ2UoYXN0KTtcbn07XG5cbkNvbXBpbGVyLnByb3RvdHlwZS5jb21waWxlTWVzc2FnZSA9IGZ1bmN0aW9uIChhc3QpIHtcbiAgICBpZiAoIShhc3QgJiYgYXN0LnR5cGUgPT09ICdtZXNzYWdlRm9ybWF0UGF0dGVybicpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTWVzc2FnZSBBU1QgaXMgbm90IG9mIHR5cGU6IFwibWVzc2FnZUZvcm1hdFBhdHRlcm5cIicpO1xuICAgIH1cblxuICAgIHZhciBlbGVtZW50cyA9IGFzdC5lbGVtZW50cyxcbiAgICAgICAgcGF0dGVybiAgPSBbXTtcblxuICAgIHZhciBpLCBsZW4sIGVsZW1lbnQ7XG5cbiAgICBmb3IgKGkgPSAwLCBsZW4gPSBlbGVtZW50cy5sZW5ndGg7IGkgPCBsZW47IGkgKz0gMSkge1xuICAgICAgICBlbGVtZW50ID0gZWxlbWVudHNbaV07XG5cbiAgICAgICAgc3dpdGNoIChlbGVtZW50LnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ21lc3NhZ2VUZXh0RWxlbWVudCc6XG4gICAgICAgICAgICAgICAgcGF0dGVybi5wdXNoKHRoaXMuY29tcGlsZU1lc3NhZ2VUZXh0KGVsZW1lbnQpKTtcbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSAnYXJndW1lbnRFbGVtZW50JzpcbiAgICAgICAgICAgICAgICBwYXR0ZXJuLnB1c2godGhpcy5jb21waWxlQXJndW1lbnQoZWxlbWVudCkpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTWVzc2FnZSBlbGVtZW50IGRvZXMgbm90IGhhdmUgYSB2YWxpZCB0eXBlJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcGF0dGVybjtcbn07XG5cbkNvbXBpbGVyLnByb3RvdHlwZS5jb21waWxlTWVzc2FnZVRleHQgPSBmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgIC8vIFdoZW4gdGhpcyBgZWxlbWVudGAgaXMgcGFydCBvZiBwbHVyYWwgc3ViLXBhdHRlcm4gYW5kIGl0cyB2YWx1ZSBjb250YWluc1xuICAgIC8vIGFuIHVuZXNjYXBlZCAnIycsIHVzZSBhIGBQbHVyYWxPZmZzZXRTdHJpbmdgIGhlbHBlciB0byBwcm9wZXJseSBvdXRwdXRcbiAgICAvLyB0aGUgbnVtYmVyIHdpdGggdGhlIGNvcnJlY3Qgb2Zmc2V0IGluIHRoZSBzdHJpbmcuXG4gICAgaWYgKHRoaXMuY3VycmVudFBsdXJhbCAmJiAvKF58W15cXFxcXSkjL2cudGVzdChlbGVtZW50LnZhbHVlKSkge1xuICAgICAgICAvLyBDcmVhdGUgYSBjYWNoZSBhIE51bWJlckZvcm1hdCBpbnN0YW5jZSB0aGF0IGNhbiBiZSByZXVzZWQgZm9yIGFueVxuICAgICAgICAvLyBQbHVyYWxPZmZzZXRTdHJpbmcgaW5zdGFuY2UgaW4gdGhpcyBtZXNzYWdlLlxuICAgICAgICBpZiAoIXRoaXMucGx1cmFsTnVtYmVyRm9ybWF0KSB7XG4gICAgICAgICAgICB0aGlzLnBsdXJhbE51bWJlckZvcm1hdCA9IG5ldyBJbnRsLk51bWJlckZvcm1hdCh0aGlzLmxvY2FsZXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBQbHVyYWxPZmZzZXRTdHJpbmcoXG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50UGx1cmFsLmlkLFxuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudFBsdXJhbC5mb3JtYXQub2Zmc2V0LFxuICAgICAgICAgICAgICAgIHRoaXMucGx1cmFsTnVtYmVyRm9ybWF0LFxuICAgICAgICAgICAgICAgIGVsZW1lbnQudmFsdWUpO1xuICAgIH1cblxuICAgIC8vIFVuZXNjYXBlIHRoZSBlc2NhcGVkICcjJ3MgaW4gdGhlIG1lc3NhZ2UgdGV4dC5cbiAgICByZXR1cm4gZWxlbWVudC52YWx1ZS5yZXBsYWNlKC9cXFxcIy9nLCAnIycpO1xufTtcblxuQ29tcGlsZXIucHJvdG90eXBlLmNvbXBpbGVBcmd1bWVudCA9IGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgdmFyIGZvcm1hdCA9IGVsZW1lbnQuZm9ybWF0O1xuXG4gICAgaWYgKCFmb3JtYXQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdGb3JtYXQoZWxlbWVudC5pZCk7XG4gICAgfVxuXG4gICAgdmFyIGZvcm1hdHMgID0gdGhpcy5mb3JtYXRzLFxuICAgICAgICBsb2NhbGVzICA9IHRoaXMubG9jYWxlcyxcbiAgICAgICAgcGx1cmFsRm4gPSB0aGlzLnBsdXJhbEZuLFxuICAgICAgICBvcHRpb25zO1xuXG4gICAgc3dpdGNoIChmb3JtYXQudHlwZSkge1xuICAgICAgICBjYXNlICdudW1iZXJGb3JtYXQnOlxuICAgICAgICAgICAgb3B0aW9ucyA9IGZvcm1hdHMubnVtYmVyW2Zvcm1hdC5zdHlsZV07XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGlkICAgIDogZWxlbWVudC5pZCxcbiAgICAgICAgICAgICAgICBmb3JtYXQ6IG5ldyBJbnRsLk51bWJlckZvcm1hdChsb2NhbGVzLCBvcHRpb25zKS5mb3JtYXRcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgY2FzZSAnZGF0ZUZvcm1hdCc6XG4gICAgICAgICAgICBvcHRpb25zID0gZm9ybWF0cy5kYXRlW2Zvcm1hdC5zdHlsZV07XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGlkICAgIDogZWxlbWVudC5pZCxcbiAgICAgICAgICAgICAgICBmb3JtYXQ6IG5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KGxvY2FsZXMsIG9wdGlvbnMpLmZvcm1hdFxuICAgICAgICAgICAgfTtcblxuICAgICAgICBjYXNlICd0aW1lRm9ybWF0JzpcbiAgICAgICAgICAgIG9wdGlvbnMgPSBmb3JtYXRzLnRpbWVbZm9ybWF0LnN0eWxlXTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgaWQgICAgOiBlbGVtZW50LmlkLFxuICAgICAgICAgICAgICAgIGZvcm1hdDogbmV3IEludGwuRGF0ZVRpbWVGb3JtYXQobG9jYWxlcywgb3B0aW9ucykuZm9ybWF0XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgIGNhc2UgJ3BsdXJhbEZvcm1hdCc6XG4gICAgICAgICAgICBvcHRpb25zID0gdGhpcy5jb21waWxlT3B0aW9ucyhlbGVtZW50KTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUGx1cmFsRm9ybWF0KFxuICAgICAgICAgICAgICAgIGVsZW1lbnQuaWQsIGZvcm1hdC5vcmRpbmFsLCBmb3JtYXQub2Zmc2V0LCBvcHRpb25zLCBwbHVyYWxGblxuICAgICAgICAgICAgKTtcblxuICAgICAgICBjYXNlICdzZWxlY3RGb3JtYXQnOlxuICAgICAgICAgICAgb3B0aW9ucyA9IHRoaXMuY29tcGlsZU9wdGlvbnMoZWxlbWVudCk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFNlbGVjdEZvcm1hdChlbGVtZW50LmlkLCBvcHRpb25zKTtcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNZXNzYWdlIGVsZW1lbnQgZG9lcyBub3QgaGF2ZSBhIHZhbGlkIGZvcm1hdCB0eXBlJyk7XG4gICAgfVxufTtcblxuQ29tcGlsZXIucHJvdG90eXBlLmNvbXBpbGVPcHRpb25zID0gZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICB2YXIgZm9ybWF0ICAgICAgPSBlbGVtZW50LmZvcm1hdCxcbiAgICAgICAgb3B0aW9ucyAgICAgPSBmb3JtYXQub3B0aW9ucyxcbiAgICAgICAgb3B0aW9uc0hhc2ggPSB7fTtcblxuICAgIC8vIFNhdmUgdGhlIGN1cnJlbnQgcGx1cmFsIGVsZW1lbnQsIGlmIGFueSwgdGhlbiBzZXQgaXQgdG8gYSBuZXcgdmFsdWUgd2hlblxuICAgIC8vIGNvbXBpbGluZyB0aGUgb3B0aW9ucyBzdWItcGF0dGVybnMuIFRoaXMgY29uZm9ybXMgdGhlIHNwZWMncyBhbGdvcml0aG1cbiAgICAvLyBmb3IgaGFuZGxpbmcgYFwiI1wiYCBzeW50YXggaW4gbWVzc2FnZSB0ZXh0LlxuICAgIHRoaXMucGx1cmFsU3RhY2sucHVzaCh0aGlzLmN1cnJlbnRQbHVyYWwpO1xuICAgIHRoaXMuY3VycmVudFBsdXJhbCA9IGZvcm1hdC50eXBlID09PSAncGx1cmFsRm9ybWF0JyA/IGVsZW1lbnQgOiBudWxsO1xuXG4gICAgdmFyIGksIGxlbiwgb3B0aW9uO1xuXG4gICAgZm9yIChpID0gMCwgbGVuID0gb3B0aW9ucy5sZW5ndGg7IGkgPCBsZW47IGkgKz0gMSkge1xuICAgICAgICBvcHRpb24gPSBvcHRpb25zW2ldO1xuXG4gICAgICAgIC8vIENvbXBpbGUgdGhlIHN1Yi1wYXR0ZXJuIGFuZCBzYXZlIGl0IHVuZGVyIHRoZSBvcHRpb25zJ3Mgc2VsZWN0b3IuXG4gICAgICAgIG9wdGlvbnNIYXNoW29wdGlvbi5zZWxlY3Rvcl0gPSB0aGlzLmNvbXBpbGVNZXNzYWdlKG9wdGlvbi52YWx1ZSk7XG4gICAgfVxuXG4gICAgLy8gUG9wIHRoZSBwbHVyYWwgc3RhY2sgdG8gcHV0IGJhY2sgdGhlIG9yaWdpbmFsIGN1cnJlbnQgcGx1cmFsIHZhbHVlLlxuICAgIHRoaXMuY3VycmVudFBsdXJhbCA9IHRoaXMucGx1cmFsU3RhY2sucG9wKCk7XG5cbiAgICByZXR1cm4gb3B0aW9uc0hhc2g7XG59O1xuXG4vLyAtLSBDb21waWxlciBIZWxwZXIgQ2xhc3NlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5mdW5jdGlvbiBTdHJpbmdGb3JtYXQoaWQpIHtcbiAgICB0aGlzLmlkID0gaWQ7XG59XG5cblN0cmluZ0Zvcm1hdC5wcm90b3R5cGUuZm9ybWF0ID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgaWYgKCF2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgIT09ICdudW1iZXInKSB7XG4gICAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHZhbHVlIDogU3RyaW5nKHZhbHVlKTtcbn07XG5cbmZ1bmN0aW9uIFBsdXJhbEZvcm1hdChpZCwgdXNlT3JkaW5hbCwgb2Zmc2V0LCBvcHRpb25zLCBwbHVyYWxGbikge1xuICAgIHRoaXMuaWQgICAgICAgICA9IGlkO1xuICAgIHRoaXMudXNlT3JkaW5hbCA9IHVzZU9yZGluYWw7XG4gICAgdGhpcy5vZmZzZXQgICAgID0gb2Zmc2V0O1xuICAgIHRoaXMub3B0aW9ucyAgICA9IG9wdGlvbnM7XG4gICAgdGhpcy5wbHVyYWxGbiAgID0gcGx1cmFsRm47XG59XG5cblBsdXJhbEZvcm1hdC5wcm90b3R5cGUuZ2V0T3B0aW9uID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgdmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG5cbiAgICB2YXIgb3B0aW9uID0gb3B0aW9uc1snPScgKyB2YWx1ZV0gfHxcbiAgICAgICAgICAgIG9wdGlvbnNbdGhpcy5wbHVyYWxGbih2YWx1ZSAtIHRoaXMub2Zmc2V0LCB0aGlzLnVzZU9yZGluYWwpXTtcblxuICAgIHJldHVybiBvcHRpb24gfHwgb3B0aW9ucy5vdGhlcjtcbn07XG5cbmZ1bmN0aW9uIFBsdXJhbE9mZnNldFN0cmluZyhpZCwgb2Zmc2V0LCBudW1iZXJGb3JtYXQsIHN0cmluZykge1xuICAgIHRoaXMuaWQgICAgICAgICAgID0gaWQ7XG4gICAgdGhpcy5vZmZzZXQgICAgICAgPSBvZmZzZXQ7XG4gICAgdGhpcy5udW1iZXJGb3JtYXQgPSBudW1iZXJGb3JtYXQ7XG4gICAgdGhpcy5zdHJpbmcgICAgICAgPSBzdHJpbmc7XG59XG5cblBsdXJhbE9mZnNldFN0cmluZy5wcm90b3R5cGUuZm9ybWF0ID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgdmFyIG51bWJlciA9IHRoaXMubnVtYmVyRm9ybWF0LmZvcm1hdCh2YWx1ZSAtIHRoaXMub2Zmc2V0KTtcblxuICAgIHJldHVybiB0aGlzLnN0cmluZ1xuICAgICAgICAgICAgLnJlcGxhY2UoLyhefFteXFxcXF0pIy9nLCAnJDEnICsgbnVtYmVyKVxuICAgICAgICAgICAgLnJlcGxhY2UoL1xcXFwjL2csICcjJyk7XG59O1xuXG5mdW5jdGlvbiBTZWxlY3RGb3JtYXQoaWQsIG9wdGlvbnMpIHtcbiAgICB0aGlzLmlkICAgICAgPSBpZDtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xufVxuXG5TZWxlY3RGb3JtYXQucHJvdG90eXBlLmdldE9wdGlvbiA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuICAgIHJldHVybiBvcHRpb25zW3ZhbHVlXSB8fCBvcHRpb25zLm90aGVyO1xufTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29tcGlsZXIuanMubWFwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///202\n")},function(module,exports,__webpack_require__){"use strict";eval("\n\nexports = module.exports = __webpack_require__(204)['default'];\nexports['default'] = exports;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjAzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2ludGwtbWVzc2FnZWZvcm1hdC1wYXJzZXIvaW5kZXguanM/NjcyZSJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vbGliL3BhcnNlcicpWydkZWZhdWx0J107XG5leHBvcnRzWydkZWZhdWx0J10gPSBleHBvcnRzO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///203\n")},function(module,exports,__webpack_require__){"use strict";eval('\n\nexports["default"] = (function() {\n  "use strict";\n\n  /*\n   * Generated by PEG.js 0.9.0.\n   *\n   * http://pegjs.org/\n   */\n\n  function peg$subclass(child, parent) {\n    function ctor() { this.constructor = child; }\n    ctor.prototype = parent.prototype;\n    child.prototype = new ctor();\n  }\n\n  function peg$SyntaxError(message, expected, found, location) {\n    this.message  = message;\n    this.expected = expected;\n    this.found    = found;\n    this.location = location;\n    this.name     = "SyntaxError";\n\n    if (typeof Error.captureStackTrace === "function") {\n      Error.captureStackTrace(this, peg$SyntaxError);\n    }\n  }\n\n  peg$subclass(peg$SyntaxError, Error);\n\n  function peg$parse(input) {\n    var options = arguments.length > 1 ? arguments[1] : {},\n        parser  = this,\n\n        peg$FAILED = {},\n\n        peg$startRuleFunctions = { start: peg$parsestart },\n        peg$startRuleFunction  = peg$parsestart,\n\n        peg$c0 = function(elements) {\n                return {\n                    type    : \'messageFormatPattern\',\n                    elements: elements,\n                    location: location()\n                };\n            },\n        peg$c1 = function(text) {\n                var string = \'\',\n                    i, j, outerLen, inner, innerLen;\n\n                for (i = 0, outerLen = text.length; i < outerLen; i += 1) {\n                    inner = text[i];\n\n                    for (j = 0, innerLen = inner.length; j < innerLen; j += 1) {\n                        string += inner[j];\n                    }\n                }\n\n                return string;\n            },\n        peg$c2 = function(messageText) {\n                return {\n                    type : \'messageTextElement\',\n                    value: messageText,\n                    location: location()\n                };\n            },\n        peg$c3 = /^[^ \\t\\n\\r,.+={}#]/,\n        peg$c4 = { type: "class", value: "[^ \\\\t\\\\n\\\\r,.+={}#]", description: "[^ \\\\t\\\\n\\\\r,.+={}#]" },\n        peg$c5 = "{",\n        peg$c6 = { type: "literal", value: "{", description: "\\"{\\"" },\n        peg$c7 = ",",\n        peg$c8 = { type: "literal", value: ",", description: "\\",\\"" },\n        peg$c9 = "}",\n        peg$c10 = { type: "literal", value: "}", description: "\\"}\\"" },\n        peg$c11 = function(id, format) {\n                return {\n                    type  : \'argumentElement\',\n                    id    : id,\n                    format: format && format[2],\n                    location: location()\n                };\n            },\n        peg$c12 = "number",\n        peg$c13 = { type: "literal", value: "number", description: "\\"number\\"" },\n        peg$c14 = "date",\n        peg$c15 = { type: "literal", value: "date", description: "\\"date\\"" },\n        peg$c16 = "time",\n        peg$c17 = { type: "literal", value: "time", description: "\\"time\\"" },\n        peg$c18 = function(type, style) {\n                return {\n                    type : type + \'Format\',\n                    style: style && style[2],\n                    location: location()\n                };\n            },\n        peg$c19 = "plural",\n        peg$c20 = { type: "literal", value: "plural", description: "\\"plural\\"" },\n        peg$c21 = function(pluralStyle) {\n                return {\n                    type   : pluralStyle.type,\n                    ordinal: false,\n                    offset : pluralStyle.offset || 0,\n                    options: pluralStyle.options,\n                    location: location()\n                };\n            },\n        peg$c22 = "selectordinal",\n        peg$c23 = { type: "literal", value: "selectordinal", description: "\\"selectordinal\\"" },\n        peg$c24 = function(pluralStyle) {\n                return {\n                    type   : pluralStyle.type,\n                    ordinal: true,\n                    offset : pluralStyle.offset || 0,\n                    options: pluralStyle.options,\n                    location: location()\n                }\n            },\n        peg$c25 = "select",\n        peg$c26 = { type: "literal", value: "select", description: "\\"select\\"" },\n        peg$c27 = function(options) {\n                return {\n                    type   : \'selectFormat\',\n                    options: options,\n                    location: location()\n                };\n            },\n        peg$c28 = "=",\n        peg$c29 = { type: "literal", value: "=", description: "\\"=\\"" },\n        peg$c30 = function(selector, pattern) {\n                return {\n                    type    : \'optionalFormatPattern\',\n                    selector: selector,\n                    value   : pattern,\n                    location: location()\n                };\n            },\n        peg$c31 = "offset:",\n        peg$c32 = { type: "literal", value: "offset:", description: "\\"offset:\\"" },\n        peg$c33 = function(number) {\n                return number;\n            },\n        peg$c34 = function(offset, options) {\n                return {\n                    type   : \'pluralFormat\',\n                    offset : offset,\n                    options: options,\n                    location: location()\n                };\n            },\n        peg$c35 = { type: "other", description: "whitespace" },\n        peg$c36 = /^[ \\t\\n\\r]/,\n        peg$c37 = { type: "class", value: "[ \\\\t\\\\n\\\\r]", description: "[ \\\\t\\\\n\\\\r]" },\n        peg$c38 = { type: "other", description: "optionalWhitespace" },\n        peg$c39 = /^[0-9]/,\n        peg$c40 = { type: "class", value: "[0-9]", description: "[0-9]" },\n        peg$c41 = /^[0-9a-f]/i,\n        peg$c42 = { type: "class", value: "[0-9a-f]i", description: "[0-9a-f]i" },\n        peg$c43 = "0",\n        peg$c44 = { type: "literal", value: "0", description: "\\"0\\"" },\n        peg$c45 = /^[1-9]/,\n        peg$c46 = { type: "class", value: "[1-9]", description: "[1-9]" },\n        peg$c47 = function(digits) {\n            return parseInt(digits, 10);\n        },\n        peg$c48 = /^[^{}\\\\\\0-\\x1F \\t\\n\\r]/,\n        peg$c49 = { type: "class", value: "[^{}\\\\\\\\\\\\0-\\\\x1F\\\\x7f \\\\t\\\\n\\\\r]", description: "[^{}\\\\\\\\\\\\0-\\\\x1F\\\\x7f \\\\t\\\\n\\\\r]" },\n        peg$c50 = "\\\\\\\\",\n        peg$c51 = { type: "literal", value: "\\\\\\\\", description: "\\"\\\\\\\\\\\\\\\\\\"" },\n        peg$c52 = function() { return \'\\\\\'; },\n        peg$c53 = "\\\\#",\n        peg$c54 = { type: "literal", value: "\\\\#", description: "\\"\\\\\\\\#\\"" },\n        peg$c55 = function() { return \'\\\\#\'; },\n        peg$c56 = "\\\\{",\n        peg$c57 = { type: "literal", value: "\\\\{", description: "\\"\\\\\\\\{\\"" },\n        peg$c58 = function() { return \'\\u007B\'; },\n        peg$c59 = "\\\\}",\n        peg$c60 = { type: "literal", value: "\\\\}", description: "\\"\\\\\\\\}\\"" },\n        peg$c61 = function() { return \'\\u007D\'; },\n        peg$c62 = "\\\\u",\n        peg$c63 = { type: "literal", value: "\\\\u", description: "\\"\\\\\\\\u\\"" },\n        peg$c64 = function(digits) {\n                return String.fromCharCode(parseInt(digits, 16));\n            },\n        peg$c65 = function(chars) { return chars.join(\'\'); },\n\n        peg$currPos          = 0,\n        peg$savedPos         = 0,\n        peg$posDetailsCache  = [{ line: 1, column: 1, seenCR: false }],\n        peg$maxFailPos       = 0,\n        peg$maxFailExpected  = [],\n        peg$silentFails      = 0,\n\n        peg$result;\n\n    if ("startRule" in options) {\n      if (!(options.startRule in peg$startRuleFunctions)) {\n        throw new Error("Can\'t start parsing from rule \\"" + options.startRule + "\\".");\n      }\n\n      peg$startRuleFunction = peg$startRuleFunctions[options.startRule];\n    }\n\n    function text() {\n      return input.substring(peg$savedPos, peg$currPos);\n    }\n\n    function location() {\n      return peg$computeLocation(peg$savedPos, peg$currPos);\n    }\n\n    function expected(description) {\n      throw peg$buildException(\n        null,\n        [{ type: "other", description: description }],\n        input.substring(peg$savedPos, peg$currPos),\n        peg$computeLocation(peg$savedPos, peg$currPos)\n      );\n    }\n\n    function error(message) {\n      throw peg$buildException(\n        message,\n        null,\n        input.substring(peg$savedPos, peg$currPos),\n        peg$computeLocation(peg$savedPos, peg$currPos)\n      );\n    }\n\n    function peg$computePosDetails(pos) {\n      var details = peg$posDetailsCache[pos],\n          p, ch;\n\n      if (details) {\n        return details;\n      } else {\n        p = pos - 1;\n        while (!peg$posDetailsCache[p]) {\n          p--;\n        }\n\n        details = peg$posDetailsCache[p];\n        details = {\n          line:   details.line,\n          column: details.column,\n          seenCR: details.seenCR\n        };\n\n        while (p < pos) {\n          ch = input.charAt(p);\n          if (ch === "\\n") {\n            if (!details.seenCR) { details.line++; }\n            details.column = 1;\n            details.seenCR = false;\n          } else if (ch === "\\r" || ch === "\\u2028" || ch === "\\u2029") {\n            details.line++;\n            details.column = 1;\n            details.seenCR = true;\n          } else {\n            details.column++;\n            details.seenCR = false;\n          }\n\n          p++;\n        }\n\n        peg$posDetailsCache[pos] = details;\n        return details;\n      }\n    }\n\n    function peg$computeLocation(startPos, endPos) {\n      var startPosDetails = peg$computePosDetails(startPos),\n          endPosDetails   = peg$computePosDetails(endPos);\n\n      return {\n        start: {\n          offset: startPos,\n          line:   startPosDetails.line,\n          column: startPosDetails.column\n        },\n        end: {\n          offset: endPos,\n          line:   endPosDetails.line,\n          column: endPosDetails.column\n        }\n      };\n    }\n\n    function peg$fail(expected) {\n      if (peg$currPos < peg$maxFailPos) { return; }\n\n      if (peg$currPos > peg$maxFailPos) {\n        peg$maxFailPos = peg$currPos;\n        peg$maxFailExpected = [];\n      }\n\n      peg$maxFailExpected.push(expected);\n    }\n\n    function peg$buildException(message, expected, found, location) {\n      function cleanupExpected(expected) {\n        var i = 1;\n\n        expected.sort(function(a, b) {\n          if (a.description < b.description) {\n            return -1;\n          } else if (a.description > b.description) {\n            return 1;\n          } else {\n            return 0;\n          }\n        });\n\n        while (i < expected.length) {\n          if (expected[i - 1] === expected[i]) {\n            expected.splice(i, 1);\n          } else {\n            i++;\n          }\n        }\n      }\n\n      function buildMessage(expected, found) {\n        function stringEscape(s) {\n          function hex(ch) { return ch.charCodeAt(0).toString(16).toUpperCase(); }\n\n          return s\n            .replace(/\\\\/g,   \'\\\\\\\\\')\n            .replace(/"/g,    \'\\\\"\')\n            .replace(/\\x08/g, \'\\\\b\')\n            .replace(/\\t/g,   \'\\\\t\')\n            .replace(/\\n/g,   \'\\\\n\')\n            .replace(/\\f/g,   \'\\\\f\')\n            .replace(/\\r/g,   \'\\\\r\')\n            .replace(/[\\x00-\\x07\\x0B\\x0E\\x0F]/g, function(ch) { return \'\\\\x0\' + hex(ch); })\n            .replace(/[\\x10-\\x1F\\x80-\\xFF]/g,    function(ch) { return \'\\\\x\'  + hex(ch); })\n            .replace(/[\\u0100-\\u0FFF]/g,         function(ch) { return \'\\\\u0\' + hex(ch); })\n            .replace(/[\\u1000-\\uFFFF]/g,         function(ch) { return \'\\\\u\'  + hex(ch); });\n        }\n\n        var expectedDescs = new Array(expected.length),\n            expectedDesc, foundDesc, i;\n\n        for (i = 0; i < expected.length; i++) {\n          expectedDescs[i] = expected[i].description;\n        }\n\n        expectedDesc = expected.length > 1\n          ? expectedDescs.slice(0, -1).join(", ")\n              + " or "\n              + expectedDescs[expected.length - 1]\n          : expectedDescs[0];\n\n        foundDesc = found ? "\\"" + stringEscape(found) + "\\"" : "end of input";\n\n        return "Expected " + expectedDesc + " but " + foundDesc + " found.";\n      }\n\n      if (expected !== null) {\n        cleanupExpected(expected);\n      }\n\n      return new peg$SyntaxError(\n        message !== null ? message : buildMessage(expected, found),\n        expected,\n        found,\n        location\n      );\n    }\n\n    function peg$parsestart() {\n      var s0;\n\n      s0 = peg$parsemessageFormatPattern();\n\n      return s0;\n    }\n\n    function peg$parsemessageFormatPattern() {\n      var s0, s1, s2;\n\n      s0 = peg$currPos;\n      s1 = [];\n      s2 = peg$parsemessageFormatElement();\n      while (s2 !== peg$FAILED) {\n        s1.push(s2);\n        s2 = peg$parsemessageFormatElement();\n      }\n      if (s1 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s1 = peg$c0(s1);\n      }\n      s0 = s1;\n\n      return s0;\n    }\n\n    function peg$parsemessageFormatElement() {\n      var s0;\n\n      s0 = peg$parsemessageTextElement();\n      if (s0 === peg$FAILED) {\n        s0 = peg$parseargumentElement();\n      }\n\n      return s0;\n    }\n\n    function peg$parsemessageText() {\n      var s0, s1, s2, s3, s4, s5;\n\n      s0 = peg$currPos;\n      s1 = [];\n      s2 = peg$currPos;\n      s3 = peg$parse_();\n      if (s3 !== peg$FAILED) {\n        s4 = peg$parsechars();\n        if (s4 !== peg$FAILED) {\n          s5 = peg$parse_();\n          if (s5 !== peg$FAILED) {\n            s3 = [s3, s4, s5];\n            s2 = s3;\n          } else {\n            peg$currPos = s2;\n            s2 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s2;\n          s2 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s2;\n        s2 = peg$FAILED;\n      }\n      if (s2 !== peg$FAILED) {\n        while (s2 !== peg$FAILED) {\n          s1.push(s2);\n          s2 = peg$currPos;\n          s3 = peg$parse_();\n          if (s3 !== peg$FAILED) {\n            s4 = peg$parsechars();\n            if (s4 !== peg$FAILED) {\n              s5 = peg$parse_();\n              if (s5 !== peg$FAILED) {\n                s3 = [s3, s4, s5];\n                s2 = s3;\n              } else {\n                peg$currPos = s2;\n                s2 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s2;\n              s2 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s2;\n            s2 = peg$FAILED;\n          }\n        }\n      } else {\n        s1 = peg$FAILED;\n      }\n      if (s1 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s1 = peg$c1(s1);\n      }\n      s0 = s1;\n      if (s0 === peg$FAILED) {\n        s0 = peg$currPos;\n        s1 = peg$parsews();\n        if (s1 !== peg$FAILED) {\n          s0 = input.substring(s0, peg$currPos);\n        } else {\n          s0 = s1;\n        }\n      }\n\n      return s0;\n    }\n\n    function peg$parsemessageTextElement() {\n      var s0, s1;\n\n      s0 = peg$currPos;\n      s1 = peg$parsemessageText();\n      if (s1 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s1 = peg$c2(s1);\n      }\n      s0 = s1;\n\n      return s0;\n    }\n\n    function peg$parseargument() {\n      var s0, s1, s2;\n\n      s0 = peg$parsenumber();\n      if (s0 === peg$FAILED) {\n        s0 = peg$currPos;\n        s1 = [];\n        if (peg$c3.test(input.charAt(peg$currPos))) {\n          s2 = input.charAt(peg$currPos);\n          peg$currPos++;\n        } else {\n          s2 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$c4); }\n        }\n        if (s2 !== peg$FAILED) {\n          while (s2 !== peg$FAILED) {\n            s1.push(s2);\n            if (peg$c3.test(input.charAt(peg$currPos))) {\n              s2 = input.charAt(peg$currPos);\n              peg$currPos++;\n            } else {\n              s2 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$c4); }\n            }\n          }\n        } else {\n          s1 = peg$FAILED;\n        }\n        if (s1 !== peg$FAILED) {\n          s0 = input.substring(s0, peg$currPos);\n        } else {\n          s0 = s1;\n        }\n      }\n\n      return s0;\n    }\n\n    function peg$parseargumentElement() {\n      var s0, s1, s2, s3, s4, s5, s6, s7, s8;\n\n      s0 = peg$currPos;\n      if (input.charCodeAt(peg$currPos) === 123) {\n        s1 = peg$c5;\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$c6); }\n      }\n      if (s1 !== peg$FAILED) {\n        s2 = peg$parse_();\n        if (s2 !== peg$FAILED) {\n          s3 = peg$parseargument();\n          if (s3 !== peg$FAILED) {\n            s4 = peg$parse_();\n            if (s4 !== peg$FAILED) {\n              s5 = peg$currPos;\n              if (input.charCodeAt(peg$currPos) === 44) {\n                s6 = peg$c7;\n                peg$currPos++;\n              } else {\n                s6 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$c8); }\n              }\n              if (s6 !== peg$FAILED) {\n                s7 = peg$parse_();\n                if (s7 !== peg$FAILED) {\n                  s8 = peg$parseelementFormat();\n                  if (s8 !== peg$FAILED) {\n                    s6 = [s6, s7, s8];\n                    s5 = s6;\n                  } else {\n                    peg$currPos = s5;\n                    s5 = peg$FAILED;\n                  }\n                } else {\n                  peg$currPos = s5;\n                  s5 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s5;\n                s5 = peg$FAILED;\n              }\n              if (s5 === peg$FAILED) {\n                s5 = null;\n              }\n              if (s5 !== peg$FAILED) {\n                s6 = peg$parse_();\n                if (s6 !== peg$FAILED) {\n                  if (input.charCodeAt(peg$currPos) === 125) {\n                    s7 = peg$c9;\n                    peg$currPos++;\n                  } else {\n                    s7 = peg$FAILED;\n                    if (peg$silentFails === 0) { peg$fail(peg$c10); }\n                  }\n                  if (s7 !== peg$FAILED) {\n                    peg$savedPos = s0;\n                    s1 = peg$c11(s3, s5);\n                    s0 = s1;\n                  } else {\n                    peg$currPos = s0;\n                    s0 = peg$FAILED;\n                  }\n                } else {\n                  peg$currPos = s0;\n                  s0 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n\n      return s0;\n    }\n\n    function peg$parseelementFormat() {\n      var s0;\n\n      s0 = peg$parsesimpleFormat();\n      if (s0 === peg$FAILED) {\n        s0 = peg$parsepluralFormat();\n        if (s0 === peg$FAILED) {\n          s0 = peg$parseselectOrdinalFormat();\n          if (s0 === peg$FAILED) {\n            s0 = peg$parseselectFormat();\n          }\n        }\n      }\n\n      return s0;\n    }\n\n    function peg$parsesimpleFormat() {\n      var s0, s1, s2, s3, s4, s5, s6;\n\n      s0 = peg$currPos;\n      if (input.substr(peg$currPos, 6) === peg$c12) {\n        s1 = peg$c12;\n        peg$currPos += 6;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$c13); }\n      }\n      if (s1 === peg$FAILED) {\n        if (input.substr(peg$currPos, 4) === peg$c14) {\n          s1 = peg$c14;\n          peg$currPos += 4;\n        } else {\n          s1 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$c15); }\n        }\n        if (s1 === peg$FAILED) {\n          if (input.substr(peg$currPos, 4) === peg$c16) {\n            s1 = peg$c16;\n            peg$currPos += 4;\n          } else {\n            s1 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$c17); }\n          }\n        }\n      }\n      if (s1 !== peg$FAILED) {\n        s2 = peg$parse_();\n        if (s2 !== peg$FAILED) {\n          s3 = peg$currPos;\n          if (input.charCodeAt(peg$currPos) === 44) {\n            s4 = peg$c7;\n            peg$currPos++;\n          } else {\n            s4 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$c8); }\n          }\n          if (s4 !== peg$FAILED) {\n            s5 = peg$parse_();\n            if (s5 !== peg$FAILED) {\n              s6 = peg$parsechars();\n              if (s6 !== peg$FAILED) {\n                s4 = [s4, s5, s6];\n                s3 = s4;\n              } else {\n                peg$currPos = s3;\n                s3 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s3;\n              s3 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s3;\n            s3 = peg$FAILED;\n          }\n          if (s3 === peg$FAILED) {\n            s3 = null;\n          }\n          if (s3 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s1 = peg$c18(s1, s3);\n            s0 = s1;\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n\n      return s0;\n    }\n\n    function peg$parsepluralFormat() {\n      var s0, s1, s2, s3, s4, s5;\n\n      s0 = peg$currPos;\n      if (input.substr(peg$currPos, 6) === peg$c19) {\n        s1 = peg$c19;\n        peg$currPos += 6;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$c20); }\n      }\n      if (s1 !== peg$FAILED) {\n        s2 = peg$parse_();\n        if (s2 !== peg$FAILED) {\n          if (input.charCodeAt(peg$currPos) === 44) {\n            s3 = peg$c7;\n            peg$currPos++;\n          } else {\n            s3 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$c8); }\n          }\n          if (s3 !== peg$FAILED) {\n            s4 = peg$parse_();\n            if (s4 !== peg$FAILED) {\n              s5 = peg$parsepluralStyle();\n              if (s5 !== peg$FAILED) {\n                peg$savedPos = s0;\n                s1 = peg$c21(s5);\n                s0 = s1;\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n\n      return s0;\n    }\n\n    function peg$parseselectOrdinalFormat() {\n      var s0, s1, s2, s3, s4, s5;\n\n      s0 = peg$currPos;\n      if (input.substr(peg$currPos, 13) === peg$c22) {\n        s1 = peg$c22;\n        peg$currPos += 13;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$c23); }\n      }\n      if (s1 !== peg$FAILED) {\n        s2 = peg$parse_();\n        if (s2 !== peg$FAILED) {\n          if (input.charCodeAt(peg$currPos) === 44) {\n            s3 = peg$c7;\n            peg$currPos++;\n          } else {\n            s3 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$c8); }\n          }\n          if (s3 !== peg$FAILED) {\n            s4 = peg$parse_();\n            if (s4 !== peg$FAILED) {\n              s5 = peg$parsepluralStyle();\n              if (s5 !== peg$FAILED) {\n                peg$savedPos = s0;\n                s1 = peg$c24(s5);\n                s0 = s1;\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n\n      return s0;\n    }\n\n    function peg$parseselectFormat() {\n      var s0, s1, s2, s3, s4, s5, s6;\n\n      s0 = peg$currPos;\n      if (input.substr(peg$currPos, 6) === peg$c25) {\n        s1 = peg$c25;\n        peg$currPos += 6;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$c26); }\n      }\n      if (s1 !== peg$FAILED) {\n        s2 = peg$parse_();\n        if (s2 !== peg$FAILED) {\n          if (input.charCodeAt(peg$currPos) === 44) {\n            s3 = peg$c7;\n            peg$currPos++;\n          } else {\n            s3 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$c8); }\n          }\n          if (s3 !== peg$FAILED) {\n            s4 = peg$parse_();\n            if (s4 !== peg$FAILED) {\n              s5 = [];\n              s6 = peg$parseoptionalFormatPattern();\n              if (s6 !== peg$FAILED) {\n                while (s6 !== peg$FAILED) {\n                  s5.push(s6);\n                  s6 = peg$parseoptionalFormatPattern();\n                }\n              } else {\n                s5 = peg$FAILED;\n              }\n              if (s5 !== peg$FAILED) {\n                peg$savedPos = s0;\n                s1 = peg$c27(s5);\n                s0 = s1;\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n\n      return s0;\n    }\n\n    function peg$parseselector() {\n      var s0, s1, s2, s3;\n\n      s0 = peg$currPos;\n      s1 = peg$currPos;\n      if (input.charCodeAt(peg$currPos) === 61) {\n        s2 = peg$c28;\n        peg$currPos++;\n      } else {\n        s2 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$c29); }\n      }\n      if (s2 !== peg$FAILED) {\n        s3 = peg$parsenumber();\n        if (s3 !== peg$FAILED) {\n          s2 = [s2, s3];\n          s1 = s2;\n        } else {\n          peg$currPos = s1;\n          s1 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s1;\n        s1 = peg$FAILED;\n      }\n      if (s1 !== peg$FAILED) {\n        s0 = input.substring(s0, peg$currPos);\n      } else {\n        s0 = s1;\n      }\n      if (s0 === peg$FAILED) {\n        s0 = peg$parsechars();\n      }\n\n      return s0;\n    }\n\n    function peg$parseoptionalFormatPattern() {\n      var s0, s1, s2, s3, s4, s5, s6, s7, s8;\n\n      s0 = peg$currPos;\n      s1 = peg$parse_();\n      if (s1 !== peg$FAILED) {\n        s2 = peg$parseselector();\n        if (s2 !== peg$FAILED) {\n          s3 = peg$parse_();\n          if (s3 !== peg$FAILED) {\n            if (input.charCodeAt(peg$currPos) === 123) {\n              s4 = peg$c5;\n              peg$currPos++;\n            } else {\n              s4 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$c6); }\n            }\n            if (s4 !== peg$FAILED) {\n              s5 = peg$parse_();\n              if (s5 !== peg$FAILED) {\n                s6 = peg$parsemessageFormatPattern();\n                if (s6 !== peg$FAILED) {\n                  s7 = peg$parse_();\n                  if (s7 !== peg$FAILED) {\n                    if (input.charCodeAt(peg$currPos) === 125) {\n                      s8 = peg$c9;\n                      peg$currPos++;\n                    } else {\n                      s8 = peg$FAILED;\n                      if (peg$silentFails === 0) { peg$fail(peg$c10); }\n                    }\n                    if (s8 !== peg$FAILED) {\n                      peg$savedPos = s0;\n                      s1 = peg$c30(s2, s6);\n                      s0 = s1;\n                    } else {\n                      peg$currPos = s0;\n                      s0 = peg$FAILED;\n                    }\n                  } else {\n                    peg$currPos = s0;\n                    s0 = peg$FAILED;\n                  }\n                } else {\n                  peg$currPos = s0;\n                  s0 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n\n      return s0;\n    }\n\n    function peg$parseoffset() {\n      var s0, s1, s2, s3;\n\n      s0 = peg$currPos;\n      if (input.substr(peg$currPos, 7) === peg$c31) {\n        s1 = peg$c31;\n        peg$currPos += 7;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$c32); }\n      }\n      if (s1 !== peg$FAILED) {\n        s2 = peg$parse_();\n        if (s2 !== peg$FAILED) {\n          s3 = peg$parsenumber();\n          if (s3 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s1 = peg$c33(s3);\n            s0 = s1;\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n\n      return s0;\n    }\n\n    function peg$parsepluralStyle() {\n      var s0, s1, s2, s3, s4;\n\n      s0 = peg$currPos;\n      s1 = peg$parseoffset();\n      if (s1 === peg$FAILED) {\n        s1 = null;\n      }\n      if (s1 !== peg$FAILED) {\n        s2 = peg$parse_();\n        if (s2 !== peg$FAILED) {\n          s3 = [];\n          s4 = peg$parseoptionalFormatPattern();\n          if (s4 !== peg$FAILED) {\n            while (s4 !== peg$FAILED) {\n              s3.push(s4);\n              s4 = peg$parseoptionalFormatPattern();\n            }\n          } else {\n            s3 = peg$FAILED;\n          }\n          if (s3 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s1 = peg$c34(s1, s3);\n            s0 = s1;\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n\n      return s0;\n    }\n\n    function peg$parsews() {\n      var s0, s1;\n\n      peg$silentFails++;\n      s0 = [];\n      if (peg$c36.test(input.charAt(peg$currPos))) {\n        s1 = input.charAt(peg$currPos);\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$c37); }\n      }\n      if (s1 !== peg$FAILED) {\n        while (s1 !== peg$FAILED) {\n          s0.push(s1);\n          if (peg$c36.test(input.charAt(peg$currPos))) {\n            s1 = input.charAt(peg$currPos);\n            peg$currPos++;\n          } else {\n            s1 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$c37); }\n          }\n        }\n      } else {\n        s0 = peg$FAILED;\n      }\n      peg$silentFails--;\n      if (s0 === peg$FAILED) {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$c35); }\n      }\n\n      return s0;\n    }\n\n    function peg$parse_() {\n      var s0, s1, s2;\n\n      peg$silentFails++;\n      s0 = peg$currPos;\n      s1 = [];\n      s2 = peg$parsews();\n      while (s2 !== peg$FAILED) {\n        s1.push(s2);\n        s2 = peg$parsews();\n      }\n      if (s1 !== peg$FAILED) {\n        s0 = input.substring(s0, peg$currPos);\n      } else {\n        s0 = s1;\n      }\n      peg$silentFails--;\n      if (s0 === peg$FAILED) {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$c38); }\n      }\n\n      return s0;\n    }\n\n    function peg$parsedigit() {\n      var s0;\n\n      if (peg$c39.test(input.charAt(peg$currPos))) {\n        s0 = input.charAt(peg$currPos);\n        peg$currPos++;\n      } else {\n        s0 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$c40); }\n      }\n\n      return s0;\n    }\n\n    function peg$parsehexDigit() {\n      var s0;\n\n      if (peg$c41.test(input.charAt(peg$currPos))) {\n        s0 = input.charAt(peg$currPos);\n        peg$currPos++;\n      } else {\n        s0 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$c42); }\n      }\n\n      return s0;\n    }\n\n    function peg$parsenumber() {\n      var s0, s1, s2, s3, s4, s5;\n\n      s0 = peg$currPos;\n      if (input.charCodeAt(peg$currPos) === 48) {\n        s1 = peg$c43;\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$c44); }\n      }\n      if (s1 === peg$FAILED) {\n        s1 = peg$currPos;\n        s2 = peg$currPos;\n        if (peg$c45.test(input.charAt(peg$currPos))) {\n          s3 = input.charAt(peg$currPos);\n          peg$currPos++;\n        } else {\n          s3 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$c46); }\n        }\n        if (s3 !== peg$FAILED) {\n          s4 = [];\n          s5 = peg$parsedigit();\n          while (s5 !== peg$FAILED) {\n            s4.push(s5);\n            s5 = peg$parsedigit();\n          }\n          if (s4 !== peg$FAILED) {\n            s3 = [s3, s4];\n            s2 = s3;\n          } else {\n            peg$currPos = s2;\n            s2 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s2;\n          s2 = peg$FAILED;\n        }\n        if (s2 !== peg$FAILED) {\n          s1 = input.substring(s1, peg$currPos);\n        } else {\n          s1 = s2;\n        }\n      }\n      if (s1 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s1 = peg$c47(s1);\n      }\n      s0 = s1;\n\n      return s0;\n    }\n\n    function peg$parsechar() {\n      var s0, s1, s2, s3, s4, s5, s6, s7;\n\n      if (peg$c48.test(input.charAt(peg$currPos))) {\n        s0 = input.charAt(peg$currPos);\n        peg$currPos++;\n      } else {\n        s0 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$c49); }\n      }\n      if (s0 === peg$FAILED) {\n        s0 = peg$currPos;\n        if (input.substr(peg$currPos, 2) === peg$c50) {\n          s1 = peg$c50;\n          peg$currPos += 2;\n        } else {\n          s1 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$c51); }\n        }\n        if (s1 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s1 = peg$c52();\n        }\n        s0 = s1;\n        if (s0 === peg$FAILED) {\n          s0 = peg$currPos;\n          if (input.substr(peg$currPos, 2) === peg$c53) {\n            s1 = peg$c53;\n            peg$currPos += 2;\n          } else {\n            s1 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$c54); }\n          }\n          if (s1 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s1 = peg$c55();\n          }\n          s0 = s1;\n          if (s0 === peg$FAILED) {\n            s0 = peg$currPos;\n            if (input.substr(peg$currPos, 2) === peg$c56) {\n              s1 = peg$c56;\n              peg$currPos += 2;\n            } else {\n              s1 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$c57); }\n            }\n            if (s1 !== peg$FAILED) {\n              peg$savedPos = s0;\n              s1 = peg$c58();\n            }\n            s0 = s1;\n            if (s0 === peg$FAILED) {\n              s0 = peg$currPos;\n              if (input.substr(peg$currPos, 2) === peg$c59) {\n                s1 = peg$c59;\n                peg$currPos += 2;\n              } else {\n                s1 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$c60); }\n              }\n              if (s1 !== peg$FAILED) {\n                peg$savedPos = s0;\n                s1 = peg$c61();\n              }\n              s0 = s1;\n              if (s0 === peg$FAILED) {\n                s0 = peg$currPos;\n                if (input.substr(peg$currPos, 2) === peg$c62) {\n                  s1 = peg$c62;\n                  peg$currPos += 2;\n                } else {\n                  s1 = peg$FAILED;\n                  if (peg$silentFails === 0) { peg$fail(peg$c63); }\n                }\n                if (s1 !== peg$FAILED) {\n                  s2 = peg$currPos;\n                  s3 = peg$currPos;\n                  s4 = peg$parsehexDigit();\n                  if (s4 !== peg$FAILED) {\n                    s5 = peg$parsehexDigit();\n                    if (s5 !== peg$FAILED) {\n                      s6 = peg$parsehexDigit();\n                      if (s6 !== peg$FAILED) {\n                        s7 = peg$parsehexDigit();\n                        if (s7 !== peg$FAILED) {\n                          s4 = [s4, s5, s6, s7];\n                          s3 = s4;\n                        } else {\n                          peg$currPos = s3;\n                          s3 = peg$FAILED;\n                        }\n                      } else {\n                        peg$currPos = s3;\n                        s3 = peg$FAILED;\n                      }\n                    } else {\n                      peg$currPos = s3;\n                      s3 = peg$FAILED;\n                    }\n                  } else {\n                    peg$currPos = s3;\n                    s3 = peg$FAILED;\n                  }\n                  if (s3 !== peg$FAILED) {\n                    s2 = input.substring(s2, peg$currPos);\n                  } else {\n                    s2 = s3;\n                  }\n                  if (s2 !== peg$FAILED) {\n                    peg$savedPos = s0;\n                    s1 = peg$c64(s2);\n                    s0 = s1;\n                  } else {\n                    peg$currPos = s0;\n                    s0 = peg$FAILED;\n                  }\n                } else {\n                  peg$currPos = s0;\n                  s0 = peg$FAILED;\n                }\n              }\n            }\n          }\n        }\n      }\n\n      return s0;\n    }\n\n    function peg$parsechars() {\n      var s0, s1, s2;\n\n      s0 = peg$currPos;\n      s1 = [];\n      s2 = peg$parsechar();\n      if (s2 !== peg$FAILED) {\n        while (s2 !== peg$FAILED) {\n          s1.push(s2);\n          s2 = peg$parsechar();\n        }\n      } else {\n        s1 = peg$FAILED;\n      }\n      if (s1 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s1 = peg$c65(s1);\n      }\n      s0 = s1;\n\n      return s0;\n    }\n\n    peg$result = peg$startRuleFunction();\n\n    if (peg$result !== peg$FAILED && peg$currPos === input.length) {\n      return peg$result;\n    } else {\n      if (peg$result !== peg$FAILED && peg$currPos < input.length) {\n        peg$fail({ type: "end", description: "end of input" });\n      }\n\n      throw peg$buildException(\n        null,\n        peg$maxFailExpected,\n        peg$maxFailPos < input.length ? input.charAt(peg$maxFailPos) : null,\n        peg$maxFailPos < input.length\n          ? peg$computeLocation(peg$maxFailPos, peg$maxFailPos + 1)\n          : peg$computeLocation(peg$maxFailPos, peg$maxFailPos)\n      );\n    }\n  }\n\n  return {\n    SyntaxError: peg$SyntaxError,\n    parse:       peg$parse\n  };\n})();\n\n//# sourceMappingURL=parser.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjA0LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2ludGwtbWVzc2FnZWZvcm1hdC1wYXJzZXIvbGliL3BhcnNlci5qcz9hMGViIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IChmdW5jdGlvbigpIHtcbiAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgLypcbiAgICogR2VuZXJhdGVkIGJ5IFBFRy5qcyAwLjkuMC5cbiAgICpcbiAgICogaHR0cDovL3BlZ2pzLm9yZy9cbiAgICovXG5cbiAgZnVuY3Rpb24gcGVnJHN1YmNsYXNzKGNoaWxkLCBwYXJlbnQpIHtcbiAgICBmdW5jdGlvbiBjdG9yKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gY2hpbGQ7IH1cbiAgICBjdG9yLnByb3RvdHlwZSA9IHBhcmVudC5wcm90b3R5cGU7XG4gICAgY2hpbGQucHJvdG90eXBlID0gbmV3IGN0b3IoKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBlZyRTeW50YXhFcnJvcihtZXNzYWdlLCBleHBlY3RlZCwgZm91bmQsIGxvY2F0aW9uKSB7XG4gICAgdGhpcy5tZXNzYWdlICA9IG1lc3NhZ2U7XG4gICAgdGhpcy5leHBlY3RlZCA9IGV4cGVjdGVkO1xuICAgIHRoaXMuZm91bmQgICAgPSBmb3VuZDtcbiAgICB0aGlzLmxvY2F0aW9uID0gbG9jYXRpb247XG4gICAgdGhpcy5uYW1lICAgICA9IFwiU3ludGF4RXJyb3JcIjtcblxuICAgIGlmICh0eXBlb2YgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgcGVnJFN5bnRheEVycm9yKTtcbiAgICB9XG4gIH1cblxuICBwZWckc3ViY2xhc3MocGVnJFN5bnRheEVycm9yLCBFcnJvcik7XG5cbiAgZnVuY3Rpb24gcGVnJHBhcnNlKGlucHV0KSB7XG4gICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHt9LFxuICAgICAgICBwYXJzZXIgID0gdGhpcyxcblxuICAgICAgICBwZWckRkFJTEVEID0ge30sXG5cbiAgICAgICAgcGVnJHN0YXJ0UnVsZUZ1bmN0aW9ucyA9IHsgc3RhcnQ6IHBlZyRwYXJzZXN0YXJ0IH0sXG4gICAgICAgIHBlZyRzdGFydFJ1bGVGdW5jdGlvbiAgPSBwZWckcGFyc2VzdGFydCxcblxuICAgICAgICBwZWckYzAgPSBmdW5jdGlvbihlbGVtZW50cykge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGUgICAgOiAnbWVzc2FnZUZvcm1hdFBhdHRlcm4nLFxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50czogZWxlbWVudHMsXG4gICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uOiBsb2NhdGlvbigpXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIHBlZyRjMSA9IGZ1bmN0aW9uKHRleHQpIHtcbiAgICAgICAgICAgICAgICB2YXIgc3RyaW5nID0gJycsXG4gICAgICAgICAgICAgICAgICAgIGksIGosIG91dGVyTGVuLCBpbm5lciwgaW5uZXJMZW47XG5cbiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwLCBvdXRlckxlbiA9IHRleHQubGVuZ3RoOyBpIDwgb3V0ZXJMZW47IGkgKz0gMSkge1xuICAgICAgICAgICAgICAgICAgICBpbm5lciA9IHRleHRbaV07XG5cbiAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gMCwgaW5uZXJMZW4gPSBpbm5lci5sZW5ndGg7IGogPCBpbm5lckxlbjsgaiArPSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgKz0gaW5uZXJbal07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gc3RyaW5nO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgcGVnJGMyID0gZnVuY3Rpb24obWVzc2FnZVRleHQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICB0eXBlIDogJ21lc3NhZ2VUZXh0RWxlbWVudCcsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBtZXNzYWdlVGV4dCxcbiAgICAgICAgICAgICAgICAgICAgbG9jYXRpb246IGxvY2F0aW9uKClcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgcGVnJGMzID0gL15bXiBcXHRcXG5cXHIsLis9e30jXS8sXG4gICAgICAgIHBlZyRjNCA9IHsgdHlwZTogXCJjbGFzc1wiLCB2YWx1ZTogXCJbXiBcXFxcdFxcXFxuXFxcXHIsLis9e30jXVwiLCBkZXNjcmlwdGlvbjogXCJbXiBcXFxcdFxcXFxuXFxcXHIsLis9e30jXVwiIH0sXG4gICAgICAgIHBlZyRjNSA9IFwie1wiLFxuICAgICAgICBwZWckYzYgPSB7IHR5cGU6IFwibGl0ZXJhbFwiLCB2YWx1ZTogXCJ7XCIsIGRlc2NyaXB0aW9uOiBcIlxcXCJ7XFxcIlwiIH0sXG4gICAgICAgIHBlZyRjNyA9IFwiLFwiLFxuICAgICAgICBwZWckYzggPSB7IHR5cGU6IFwibGl0ZXJhbFwiLCB2YWx1ZTogXCIsXCIsIGRlc2NyaXB0aW9uOiBcIlxcXCIsXFxcIlwiIH0sXG4gICAgICAgIHBlZyRjOSA9IFwifVwiLFxuICAgICAgICBwZWckYzEwID0geyB0eXBlOiBcImxpdGVyYWxcIiwgdmFsdWU6IFwifVwiLCBkZXNjcmlwdGlvbjogXCJcXFwifVxcXCJcIiB9LFxuICAgICAgICBwZWckYzExID0gZnVuY3Rpb24oaWQsIGZvcm1hdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGUgIDogJ2FyZ3VtZW50RWxlbWVudCcsXG4gICAgICAgICAgICAgICAgICAgIGlkICAgIDogaWQsXG4gICAgICAgICAgICAgICAgICAgIGZvcm1hdDogZm9ybWF0ICYmIGZvcm1hdFsyXSxcbiAgICAgICAgICAgICAgICAgICAgbG9jYXRpb246IGxvY2F0aW9uKClcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgcGVnJGMxMiA9IFwibnVtYmVyXCIsXG4gICAgICAgIHBlZyRjMTMgPSB7IHR5cGU6IFwibGl0ZXJhbFwiLCB2YWx1ZTogXCJudW1iZXJcIiwgZGVzY3JpcHRpb246IFwiXFxcIm51bWJlclxcXCJcIiB9LFxuICAgICAgICBwZWckYzE0ID0gXCJkYXRlXCIsXG4gICAgICAgIHBlZyRjMTUgPSB7IHR5cGU6IFwibGl0ZXJhbFwiLCB2YWx1ZTogXCJkYXRlXCIsIGRlc2NyaXB0aW9uOiBcIlxcXCJkYXRlXFxcIlwiIH0sXG4gICAgICAgIHBlZyRjMTYgPSBcInRpbWVcIixcbiAgICAgICAgcGVnJGMxNyA9IHsgdHlwZTogXCJsaXRlcmFsXCIsIHZhbHVlOiBcInRpbWVcIiwgZGVzY3JpcHRpb246IFwiXFxcInRpbWVcXFwiXCIgfSxcbiAgICAgICAgcGVnJGMxOCA9IGZ1bmN0aW9uKHR5cGUsIHN0eWxlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZSA6IHR5cGUgKyAnRm9ybWF0JyxcbiAgICAgICAgICAgICAgICAgICAgc3R5bGU6IHN0eWxlICYmIHN0eWxlWzJdLFxuICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbjogbG9jYXRpb24oKVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9LFxuICAgICAgICBwZWckYzE5ID0gXCJwbHVyYWxcIixcbiAgICAgICAgcGVnJGMyMCA9IHsgdHlwZTogXCJsaXRlcmFsXCIsIHZhbHVlOiBcInBsdXJhbFwiLCBkZXNjcmlwdGlvbjogXCJcXFwicGx1cmFsXFxcIlwiIH0sXG4gICAgICAgIHBlZyRjMjEgPSBmdW5jdGlvbihwbHVyYWxTdHlsZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGUgICA6IHBsdXJhbFN0eWxlLnR5cGUsXG4gICAgICAgICAgICAgICAgICAgIG9yZGluYWw6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBvZmZzZXQgOiBwbHVyYWxTdHlsZS5vZmZzZXQgfHwgMCxcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9uczogcGx1cmFsU3R5bGUub3B0aW9ucyxcbiAgICAgICAgICAgICAgICAgICAgbG9jYXRpb246IGxvY2F0aW9uKClcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgcGVnJGMyMiA9IFwic2VsZWN0b3JkaW5hbFwiLFxuICAgICAgICBwZWckYzIzID0geyB0eXBlOiBcImxpdGVyYWxcIiwgdmFsdWU6IFwic2VsZWN0b3JkaW5hbFwiLCBkZXNjcmlwdGlvbjogXCJcXFwic2VsZWN0b3JkaW5hbFxcXCJcIiB9LFxuICAgICAgICBwZWckYzI0ID0gZnVuY3Rpb24ocGx1cmFsU3R5bGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICB0eXBlICAgOiBwbHVyYWxTdHlsZS50eXBlLFxuICAgICAgICAgICAgICAgICAgICBvcmRpbmFsOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBvZmZzZXQgOiBwbHVyYWxTdHlsZS5vZmZzZXQgfHwgMCxcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9uczogcGx1cmFsU3R5bGUub3B0aW9ucyxcbiAgICAgICAgICAgICAgICAgICAgbG9jYXRpb246IGxvY2F0aW9uKClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICBwZWckYzI1ID0gXCJzZWxlY3RcIixcbiAgICAgICAgcGVnJGMyNiA9IHsgdHlwZTogXCJsaXRlcmFsXCIsIHZhbHVlOiBcInNlbGVjdFwiLCBkZXNjcmlwdGlvbjogXCJcXFwic2VsZWN0XFxcIlwiIH0sXG4gICAgICAgIHBlZyRjMjcgPSBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZSAgIDogJ3NlbGVjdEZvcm1hdCcsXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnM6IG9wdGlvbnMsXG4gICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uOiBsb2NhdGlvbigpXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIHBlZyRjMjggPSBcIj1cIixcbiAgICAgICAgcGVnJGMyOSA9IHsgdHlwZTogXCJsaXRlcmFsXCIsIHZhbHVlOiBcIj1cIiwgZGVzY3JpcHRpb246IFwiXFxcIj1cXFwiXCIgfSxcbiAgICAgICAgcGVnJGMzMCA9IGZ1bmN0aW9uKHNlbGVjdG9yLCBwYXR0ZXJuKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZSAgICA6ICdvcHRpb25hbEZvcm1hdFBhdHRlcm4nLFxuICAgICAgICAgICAgICAgICAgICBzZWxlY3Rvcjogc2VsZWN0b3IsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlICAgOiBwYXR0ZXJuLFxuICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbjogbG9jYXRpb24oKVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9LFxuICAgICAgICBwZWckYzMxID0gXCJvZmZzZXQ6XCIsXG4gICAgICAgIHBlZyRjMzIgPSB7IHR5cGU6IFwibGl0ZXJhbFwiLCB2YWx1ZTogXCJvZmZzZXQ6XCIsIGRlc2NyaXB0aW9uOiBcIlxcXCJvZmZzZXQ6XFxcIlwiIH0sXG4gICAgICAgIHBlZyRjMzMgPSBmdW5jdGlvbihudW1iZXIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgcGVnJGMzNCA9IGZ1bmN0aW9uKG9mZnNldCwgb3B0aW9ucykge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGUgICA6ICdwbHVyYWxGb3JtYXQnLFxuICAgICAgICAgICAgICAgICAgICBvZmZzZXQgOiBvZmZzZXQsXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnM6IG9wdGlvbnMsXG4gICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uOiBsb2NhdGlvbigpXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIHBlZyRjMzUgPSB7IHR5cGU6IFwib3RoZXJcIiwgZGVzY3JpcHRpb246IFwid2hpdGVzcGFjZVwiIH0sXG4gICAgICAgIHBlZyRjMzYgPSAvXlsgXFx0XFxuXFxyXS8sXG4gICAgICAgIHBlZyRjMzcgPSB7IHR5cGU6IFwiY2xhc3NcIiwgdmFsdWU6IFwiWyBcXFxcdFxcXFxuXFxcXHJdXCIsIGRlc2NyaXB0aW9uOiBcIlsgXFxcXHRcXFxcblxcXFxyXVwiIH0sXG4gICAgICAgIHBlZyRjMzggPSB7IHR5cGU6IFwib3RoZXJcIiwgZGVzY3JpcHRpb246IFwib3B0aW9uYWxXaGl0ZXNwYWNlXCIgfSxcbiAgICAgICAgcGVnJGMzOSA9IC9eWzAtOV0vLFxuICAgICAgICBwZWckYzQwID0geyB0eXBlOiBcImNsYXNzXCIsIHZhbHVlOiBcIlswLTldXCIsIGRlc2NyaXB0aW9uOiBcIlswLTldXCIgfSxcbiAgICAgICAgcGVnJGM0MSA9IC9eWzAtOWEtZl0vaSxcbiAgICAgICAgcGVnJGM0MiA9IHsgdHlwZTogXCJjbGFzc1wiLCB2YWx1ZTogXCJbMC05YS1mXWlcIiwgZGVzY3JpcHRpb246IFwiWzAtOWEtZl1pXCIgfSxcbiAgICAgICAgcGVnJGM0MyA9IFwiMFwiLFxuICAgICAgICBwZWckYzQ0ID0geyB0eXBlOiBcImxpdGVyYWxcIiwgdmFsdWU6IFwiMFwiLCBkZXNjcmlwdGlvbjogXCJcXFwiMFxcXCJcIiB9LFxuICAgICAgICBwZWckYzQ1ID0gL15bMS05XS8sXG4gICAgICAgIHBlZyRjNDYgPSB7IHR5cGU6IFwiY2xhc3NcIiwgdmFsdWU6IFwiWzEtOV1cIiwgZGVzY3JpcHRpb246IFwiWzEtOV1cIiB9LFxuICAgICAgICBwZWckYzQ3ID0gZnVuY3Rpb24oZGlnaXRzKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VJbnQoZGlnaXRzLCAxMCk7XG4gICAgICAgIH0sXG4gICAgICAgIHBlZyRjNDggPSAvXltee31cXFxcXFwwLVxceDFGfyBcXHRcXG5cXHJdLyxcbiAgICAgICAgcGVnJGM0OSA9IHsgdHlwZTogXCJjbGFzc1wiLCB2YWx1ZTogXCJbXnt9XFxcXFxcXFxcXFxcMC1cXFxceDFGXFxcXHg3ZiBcXFxcdFxcXFxuXFxcXHJdXCIsIGRlc2NyaXB0aW9uOiBcIltee31cXFxcXFxcXFxcXFwwLVxcXFx4MUZcXFxceDdmIFxcXFx0XFxcXG5cXFxccl1cIiB9LFxuICAgICAgICBwZWckYzUwID0gXCJcXFxcXFxcXFwiLFxuICAgICAgICBwZWckYzUxID0geyB0eXBlOiBcImxpdGVyYWxcIiwgdmFsdWU6IFwiXFxcXFxcXFxcIiwgZGVzY3JpcHRpb246IFwiXFxcIlxcXFxcXFxcXFxcXFxcXFxcXFwiXCIgfSxcbiAgICAgICAgcGVnJGM1MiA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gJ1xcXFwnOyB9LFxuICAgICAgICBwZWckYzUzID0gXCJcXFxcI1wiLFxuICAgICAgICBwZWckYzU0ID0geyB0eXBlOiBcImxpdGVyYWxcIiwgdmFsdWU6IFwiXFxcXCNcIiwgZGVzY3JpcHRpb246IFwiXFxcIlxcXFxcXFxcI1xcXCJcIiB9LFxuICAgICAgICBwZWckYzU1ID0gZnVuY3Rpb24oKSB7IHJldHVybiAnXFxcXCMnOyB9LFxuICAgICAgICBwZWckYzU2ID0gXCJcXFxce1wiLFxuICAgICAgICBwZWckYzU3ID0geyB0eXBlOiBcImxpdGVyYWxcIiwgdmFsdWU6IFwiXFxcXHtcIiwgZGVzY3JpcHRpb246IFwiXFxcIlxcXFxcXFxce1xcXCJcIiB9LFxuICAgICAgICBwZWckYzU4ID0gZnVuY3Rpb24oKSB7IHJldHVybiAnXFx1MDA3Qic7IH0sXG4gICAgICAgIHBlZyRjNTkgPSBcIlxcXFx9XCIsXG4gICAgICAgIHBlZyRjNjAgPSB7IHR5cGU6IFwibGl0ZXJhbFwiLCB2YWx1ZTogXCJcXFxcfVwiLCBkZXNjcmlwdGlvbjogXCJcXFwiXFxcXFxcXFx9XFxcIlwiIH0sXG4gICAgICAgIHBlZyRjNjEgPSBmdW5jdGlvbigpIHsgcmV0dXJuICdcXHUwMDdEJzsgfSxcbiAgICAgICAgcGVnJGM2MiA9IFwiXFxcXHVcIixcbiAgICAgICAgcGVnJGM2MyA9IHsgdHlwZTogXCJsaXRlcmFsXCIsIHZhbHVlOiBcIlxcXFx1XCIsIGRlc2NyaXB0aW9uOiBcIlxcXCJcXFxcXFxcXHVcXFwiXCIgfSxcbiAgICAgICAgcGVnJGM2NCA9IGZ1bmN0aW9uKGRpZ2l0cykge1xuICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKHBhcnNlSW50KGRpZ2l0cywgMTYpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIHBlZyRjNjUgPSBmdW5jdGlvbihjaGFycykgeyByZXR1cm4gY2hhcnMuam9pbignJyk7IH0sXG5cbiAgICAgICAgcGVnJGN1cnJQb3MgICAgICAgICAgPSAwLFxuICAgICAgICBwZWckc2F2ZWRQb3MgICAgICAgICA9IDAsXG4gICAgICAgIHBlZyRwb3NEZXRhaWxzQ2FjaGUgID0gW3sgbGluZTogMSwgY29sdW1uOiAxLCBzZWVuQ1I6IGZhbHNlIH1dLFxuICAgICAgICBwZWckbWF4RmFpbFBvcyAgICAgICA9IDAsXG4gICAgICAgIHBlZyRtYXhGYWlsRXhwZWN0ZWQgID0gW10sXG4gICAgICAgIHBlZyRzaWxlbnRGYWlscyAgICAgID0gMCxcblxuICAgICAgICBwZWckcmVzdWx0O1xuXG4gICAgaWYgKFwic3RhcnRSdWxlXCIgaW4gb3B0aW9ucykge1xuICAgICAgaWYgKCEob3B0aW9ucy5zdGFydFJ1bGUgaW4gcGVnJHN0YXJ0UnVsZUZ1bmN0aW9ucykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2FuJ3Qgc3RhcnQgcGFyc2luZyBmcm9tIHJ1bGUgXFxcIlwiICsgb3B0aW9ucy5zdGFydFJ1bGUgKyBcIlxcXCIuXCIpO1xuICAgICAgfVxuXG4gICAgICBwZWckc3RhcnRSdWxlRnVuY3Rpb24gPSBwZWckc3RhcnRSdWxlRnVuY3Rpb25zW29wdGlvbnMuc3RhcnRSdWxlXTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB0ZXh0KCkge1xuICAgICAgcmV0dXJuIGlucHV0LnN1YnN0cmluZyhwZWckc2F2ZWRQb3MsIHBlZyRjdXJyUG9zKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsb2NhdGlvbigpIHtcbiAgICAgIHJldHVybiBwZWckY29tcHV0ZUxvY2F0aW9uKHBlZyRzYXZlZFBvcywgcGVnJGN1cnJQb3MpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGV4cGVjdGVkKGRlc2NyaXB0aW9uKSB7XG4gICAgICB0aHJvdyBwZWckYnVpbGRFeGNlcHRpb24oXG4gICAgICAgIG51bGwsXG4gICAgICAgIFt7IHR5cGU6IFwib3RoZXJcIiwgZGVzY3JpcHRpb246IGRlc2NyaXB0aW9uIH1dLFxuICAgICAgICBpbnB1dC5zdWJzdHJpbmcocGVnJHNhdmVkUG9zLCBwZWckY3VyclBvcyksXG4gICAgICAgIHBlZyRjb21wdXRlTG9jYXRpb24ocGVnJHNhdmVkUG9zLCBwZWckY3VyclBvcylcbiAgICAgICk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZXJyb3IobWVzc2FnZSkge1xuICAgICAgdGhyb3cgcGVnJGJ1aWxkRXhjZXB0aW9uKFxuICAgICAgICBtZXNzYWdlLFxuICAgICAgICBudWxsLFxuICAgICAgICBpbnB1dC5zdWJzdHJpbmcocGVnJHNhdmVkUG9zLCBwZWckY3VyclBvcyksXG4gICAgICAgIHBlZyRjb21wdXRlTG9jYXRpb24ocGVnJHNhdmVkUG9zLCBwZWckY3VyclBvcylcbiAgICAgICk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcGVnJGNvbXB1dGVQb3NEZXRhaWxzKHBvcykge1xuICAgICAgdmFyIGRldGFpbHMgPSBwZWckcG9zRGV0YWlsc0NhY2hlW3Bvc10sXG4gICAgICAgICAgcCwgY2g7XG5cbiAgICAgIGlmIChkZXRhaWxzKSB7XG4gICAgICAgIHJldHVybiBkZXRhaWxzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcCA9IHBvcyAtIDE7XG4gICAgICAgIHdoaWxlICghcGVnJHBvc0RldGFpbHNDYWNoZVtwXSkge1xuICAgICAgICAgIHAtLTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRldGFpbHMgPSBwZWckcG9zRGV0YWlsc0NhY2hlW3BdO1xuICAgICAgICBkZXRhaWxzID0ge1xuICAgICAgICAgIGxpbmU6ICAgZGV0YWlscy5saW5lLFxuICAgICAgICAgIGNvbHVtbjogZGV0YWlscy5jb2x1bW4sXG4gICAgICAgICAgc2VlbkNSOiBkZXRhaWxzLnNlZW5DUlxuICAgICAgICB9O1xuXG4gICAgICAgIHdoaWxlIChwIDwgcG9zKSB7XG4gICAgICAgICAgY2ggPSBpbnB1dC5jaGFyQXQocCk7XG4gICAgICAgICAgaWYgKGNoID09PSBcIlxcblwiKSB7XG4gICAgICAgICAgICBpZiAoIWRldGFpbHMuc2VlbkNSKSB7IGRldGFpbHMubGluZSsrOyB9XG4gICAgICAgICAgICBkZXRhaWxzLmNvbHVtbiA9IDE7XG4gICAgICAgICAgICBkZXRhaWxzLnNlZW5DUiA9IGZhbHNlO1xuICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT09IFwiXFxyXCIgfHwgY2ggPT09IFwiXFx1MjAyOFwiIHx8IGNoID09PSBcIlxcdTIwMjlcIikge1xuICAgICAgICAgICAgZGV0YWlscy5saW5lKys7XG4gICAgICAgICAgICBkZXRhaWxzLmNvbHVtbiA9IDE7XG4gICAgICAgICAgICBkZXRhaWxzLnNlZW5DUiA9IHRydWU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRldGFpbHMuY29sdW1uKys7XG4gICAgICAgICAgICBkZXRhaWxzLnNlZW5DUiA9IGZhbHNlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHArKztcbiAgICAgICAgfVxuXG4gICAgICAgIHBlZyRwb3NEZXRhaWxzQ2FjaGVbcG9zXSA9IGRldGFpbHM7XG4gICAgICAgIHJldHVybiBkZXRhaWxzO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHBlZyRjb21wdXRlTG9jYXRpb24oc3RhcnRQb3MsIGVuZFBvcykge1xuICAgICAgdmFyIHN0YXJ0UG9zRGV0YWlscyA9IHBlZyRjb21wdXRlUG9zRGV0YWlscyhzdGFydFBvcyksXG4gICAgICAgICAgZW5kUG9zRGV0YWlscyAgID0gcGVnJGNvbXB1dGVQb3NEZXRhaWxzKGVuZFBvcyk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN0YXJ0OiB7XG4gICAgICAgICAgb2Zmc2V0OiBzdGFydFBvcyxcbiAgICAgICAgICBsaW5lOiAgIHN0YXJ0UG9zRGV0YWlscy5saW5lLFxuICAgICAgICAgIGNvbHVtbjogc3RhcnRQb3NEZXRhaWxzLmNvbHVtblxuICAgICAgICB9LFxuICAgICAgICBlbmQ6IHtcbiAgICAgICAgICBvZmZzZXQ6IGVuZFBvcyxcbiAgICAgICAgICBsaW5lOiAgIGVuZFBvc0RldGFpbHMubGluZSxcbiAgICAgICAgICBjb2x1bW46IGVuZFBvc0RldGFpbHMuY29sdW1uXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcGVnJGZhaWwoZXhwZWN0ZWQpIHtcbiAgICAgIGlmIChwZWckY3VyclBvcyA8IHBlZyRtYXhGYWlsUG9zKSB7IHJldHVybjsgfVxuXG4gICAgICBpZiAocGVnJGN1cnJQb3MgPiBwZWckbWF4RmFpbFBvcykge1xuICAgICAgICBwZWckbWF4RmFpbFBvcyA9IHBlZyRjdXJyUG9zO1xuICAgICAgICBwZWckbWF4RmFpbEV4cGVjdGVkID0gW107XG4gICAgICB9XG5cbiAgICAgIHBlZyRtYXhGYWlsRXhwZWN0ZWQucHVzaChleHBlY3RlZCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcGVnJGJ1aWxkRXhjZXB0aW9uKG1lc3NhZ2UsIGV4cGVjdGVkLCBmb3VuZCwgbG9jYXRpb24pIHtcbiAgICAgIGZ1bmN0aW9uIGNsZWFudXBFeHBlY3RlZChleHBlY3RlZCkge1xuICAgICAgICB2YXIgaSA9IDE7XG5cbiAgICAgICAgZXhwZWN0ZWQuc29ydChmdW5jdGlvbihhLCBiKSB7XG4gICAgICAgICAgaWYgKGEuZGVzY3JpcHRpb24gPCBiLmRlc2NyaXB0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgICAgfSBlbHNlIGlmIChhLmRlc2NyaXB0aW9uID4gYi5kZXNjcmlwdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgd2hpbGUgKGkgPCBleHBlY3RlZC5sZW5ndGgpIHtcbiAgICAgICAgICBpZiAoZXhwZWN0ZWRbaSAtIDFdID09PSBleHBlY3RlZFtpXSkge1xuICAgICAgICAgICAgZXhwZWN0ZWQuc3BsaWNlKGksIDEpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpKys7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGJ1aWxkTWVzc2FnZShleHBlY3RlZCwgZm91bmQpIHtcbiAgICAgICAgZnVuY3Rpb24gc3RyaW5nRXNjYXBlKHMpIHtcbiAgICAgICAgICBmdW5jdGlvbiBoZXgoY2gpIHsgcmV0dXJuIGNoLmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCk7IH1cblxuICAgICAgICAgIHJldHVybiBzXG4gICAgICAgICAgICAucmVwbGFjZSgvXFxcXC9nLCAgICdcXFxcXFxcXCcpXG4gICAgICAgICAgICAucmVwbGFjZSgvXCIvZywgICAgJ1xcXFxcIicpXG4gICAgICAgICAgICAucmVwbGFjZSgvXFx4MDgvZywgJ1xcXFxiJylcbiAgICAgICAgICAgIC5yZXBsYWNlKC9cXHQvZywgICAnXFxcXHQnKVxuICAgICAgICAgICAgLnJlcGxhY2UoL1xcbi9nLCAgICdcXFxcbicpXG4gICAgICAgICAgICAucmVwbGFjZSgvXFxmL2csICAgJ1xcXFxmJylcbiAgICAgICAgICAgIC5yZXBsYWNlKC9cXHIvZywgICAnXFxcXHInKVxuICAgICAgICAgICAgLnJlcGxhY2UoL1tcXHgwMC1cXHgwN1xceDBCXFx4MEVcXHgwRl0vZywgZnVuY3Rpb24oY2gpIHsgcmV0dXJuICdcXFxceDAnICsgaGV4KGNoKTsgfSlcbiAgICAgICAgICAgIC5yZXBsYWNlKC9bXFx4MTAtXFx4MUZcXHg4MC1cXHhGRl0vZywgICAgZnVuY3Rpb24oY2gpIHsgcmV0dXJuICdcXFxceCcgICsgaGV4KGNoKTsgfSlcbiAgICAgICAgICAgIC5yZXBsYWNlKC9bXFx1MDEwMC1cXHUwRkZGXS9nLCAgICAgICAgIGZ1bmN0aW9uKGNoKSB7IHJldHVybiAnXFxcXHUwJyArIGhleChjaCk7IH0pXG4gICAgICAgICAgICAucmVwbGFjZSgvW1xcdTEwMDAtXFx1RkZGRl0vZywgICAgICAgICBmdW5jdGlvbihjaCkgeyByZXR1cm4gJ1xcXFx1JyAgKyBoZXgoY2gpOyB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBleHBlY3RlZERlc2NzID0gbmV3IEFycmF5KGV4cGVjdGVkLmxlbmd0aCksXG4gICAgICAgICAgICBleHBlY3RlZERlc2MsIGZvdW5kRGVzYywgaTtcblxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZXhwZWN0ZWQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBleHBlY3RlZERlc2NzW2ldID0gZXhwZWN0ZWRbaV0uZGVzY3JpcHRpb247XG4gICAgICAgIH1cblxuICAgICAgICBleHBlY3RlZERlc2MgPSBleHBlY3RlZC5sZW5ndGggPiAxXG4gICAgICAgICAgPyBleHBlY3RlZERlc2NzLnNsaWNlKDAsIC0xKS5qb2luKFwiLCBcIilcbiAgICAgICAgICAgICAgKyBcIiBvciBcIlxuICAgICAgICAgICAgICArIGV4cGVjdGVkRGVzY3NbZXhwZWN0ZWQubGVuZ3RoIC0gMV1cbiAgICAgICAgICA6IGV4cGVjdGVkRGVzY3NbMF07XG5cbiAgICAgICAgZm91bmREZXNjID0gZm91bmQgPyBcIlxcXCJcIiArIHN0cmluZ0VzY2FwZShmb3VuZCkgKyBcIlxcXCJcIiA6IFwiZW5kIG9mIGlucHV0XCI7XG5cbiAgICAgICAgcmV0dXJuIFwiRXhwZWN0ZWQgXCIgKyBleHBlY3RlZERlc2MgKyBcIiBidXQgXCIgKyBmb3VuZERlc2MgKyBcIiBmb3VuZC5cIjtcbiAgICAgIH1cblxuICAgICAgaWYgKGV4cGVjdGVkICE9PSBudWxsKSB7XG4gICAgICAgIGNsZWFudXBFeHBlY3RlZChleHBlY3RlZCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXcgcGVnJFN5bnRheEVycm9yKFxuICAgICAgICBtZXNzYWdlICE9PSBudWxsID8gbWVzc2FnZSA6IGJ1aWxkTWVzc2FnZShleHBlY3RlZCwgZm91bmQpLFxuICAgICAgICBleHBlY3RlZCxcbiAgICAgICAgZm91bmQsXG4gICAgICAgIGxvY2F0aW9uXG4gICAgICApO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHBlZyRwYXJzZXN0YXJ0KCkge1xuICAgICAgdmFyIHMwO1xuXG4gICAgICBzMCA9IHBlZyRwYXJzZW1lc3NhZ2VGb3JtYXRQYXR0ZXJuKCk7XG5cbiAgICAgIHJldHVybiBzMDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwZWckcGFyc2VtZXNzYWdlRm9ybWF0UGF0dGVybigpIHtcbiAgICAgIHZhciBzMCwgczEsIHMyO1xuXG4gICAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgICAgczEgPSBbXTtcbiAgICAgIHMyID0gcGVnJHBhcnNlbWVzc2FnZUZvcm1hdEVsZW1lbnQoKTtcbiAgICAgIHdoaWxlIChzMiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzMS5wdXNoKHMyKTtcbiAgICAgICAgczIgPSBwZWckcGFyc2VtZXNzYWdlRm9ybWF0RWxlbWVudCgpO1xuICAgICAgfVxuICAgICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgICBzMSA9IHBlZyRjMChzMSk7XG4gICAgICB9XG4gICAgICBzMCA9IHMxO1xuXG4gICAgICByZXR1cm4gczA7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcGVnJHBhcnNlbWVzc2FnZUZvcm1hdEVsZW1lbnQoKSB7XG4gICAgICB2YXIgczA7XG5cbiAgICAgIHMwID0gcGVnJHBhcnNlbWVzc2FnZVRleHRFbGVtZW50KCk7XG4gICAgICBpZiAoczAgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczAgPSBwZWckcGFyc2Vhcmd1bWVudEVsZW1lbnQoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHMwO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHBlZyRwYXJzZW1lc3NhZ2VUZXh0KCkge1xuICAgICAgdmFyIHMwLCBzMSwgczIsIHMzLCBzNCwgczU7XG5cbiAgICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgICBzMSA9IFtdO1xuICAgICAgczIgPSBwZWckY3VyclBvcztcbiAgICAgIHMzID0gcGVnJHBhcnNlXygpO1xuICAgICAgaWYgKHMzICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHM0ID0gcGVnJHBhcnNlY2hhcnMoKTtcbiAgICAgICAgaWYgKHM0ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgczUgPSBwZWckcGFyc2VfKCk7XG4gICAgICAgICAgaWYgKHM1ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICBzMyA9IFtzMywgczQsIHM1XTtcbiAgICAgICAgICAgIHMyID0gczM7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczI7XG4gICAgICAgICAgICBzMiA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBlZyRjdXJyUG9zID0gczI7XG4gICAgICAgICAgczIgPSBwZWckRkFJTEVEO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwZWckY3VyclBvcyA9IHMyO1xuICAgICAgICBzMiA9IHBlZyRGQUlMRUQ7XG4gICAgICB9XG4gICAgICBpZiAoczIgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgd2hpbGUgKHMyICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgczEucHVzaChzMik7XG4gICAgICAgICAgczIgPSBwZWckY3VyclBvcztcbiAgICAgICAgICBzMyA9IHBlZyRwYXJzZV8oKTtcbiAgICAgICAgICBpZiAoczMgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgIHM0ID0gcGVnJHBhcnNlY2hhcnMoKTtcbiAgICAgICAgICAgIGlmIChzNCAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICBzNSA9IHBlZyRwYXJzZV8oKTtcbiAgICAgICAgICAgICAgaWYgKHM1ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgICAgczMgPSBbczMsIHM0LCBzNV07XG4gICAgICAgICAgICAgICAgczIgPSBzMztcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMyO1xuICAgICAgICAgICAgICAgIHMyID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMjtcbiAgICAgICAgICAgICAgczIgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwZWckY3VyclBvcyA9IHMyO1xuICAgICAgICAgICAgczIgPSBwZWckRkFJTEVEO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgfVxuICAgICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgICBzMSA9IHBlZyRjMShzMSk7XG4gICAgICB9XG4gICAgICBzMCA9IHMxO1xuICAgICAgaWYgKHMwID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgICAgIHMxID0gcGVnJHBhcnNld3MoKTtcbiAgICAgICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgczAgPSBpbnB1dC5zdWJzdHJpbmcoczAsIHBlZyRjdXJyUG9zKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzMCA9IHMxO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzMDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwZWckcGFyc2VtZXNzYWdlVGV4dEVsZW1lbnQoKSB7XG4gICAgICB2YXIgczAsIHMxO1xuXG4gICAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgICAgczEgPSBwZWckcGFyc2VtZXNzYWdlVGV4dCgpO1xuICAgICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgICBzMSA9IHBlZyRjMihzMSk7XG4gICAgICB9XG4gICAgICBzMCA9IHMxO1xuXG4gICAgICByZXR1cm4gczA7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcGVnJHBhcnNlYXJndW1lbnQoKSB7XG4gICAgICB2YXIgczAsIHMxLCBzMjtcblxuICAgICAgczAgPSBwZWckcGFyc2VudW1iZXIoKTtcbiAgICAgIGlmIChzMCA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgICAgICBzMSA9IFtdO1xuICAgICAgICBpZiAocGVnJGMzLnRlc3QoaW5wdXQuY2hhckF0KHBlZyRjdXJyUG9zKSkpIHtcbiAgICAgICAgICBzMiA9IGlucHV0LmNoYXJBdChwZWckY3VyclBvcyk7XG4gICAgICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzMiA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzQpOyB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHMyICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgd2hpbGUgKHMyICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICBzMS5wdXNoKHMyKTtcbiAgICAgICAgICAgIGlmIChwZWckYzMudGVzdChpbnB1dC5jaGFyQXQocGVnJGN1cnJQb3MpKSkge1xuICAgICAgICAgICAgICBzMiA9IGlucHV0LmNoYXJBdChwZWckY3VyclBvcyk7XG4gICAgICAgICAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzMiA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGM0KTsgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgczAgPSBpbnB1dC5zdWJzdHJpbmcoczAsIHBlZyRjdXJyUG9zKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzMCA9IHMxO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzMDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwZWckcGFyc2Vhcmd1bWVudEVsZW1lbnQoKSB7XG4gICAgICB2YXIgczAsIHMxLCBzMiwgczMsIHM0LCBzNSwgczYsIHM3LCBzODtcblxuICAgICAgczAgPSBwZWckY3VyclBvcztcbiAgICAgIGlmIChpbnB1dC5jaGFyQ29kZUF0KHBlZyRjdXJyUG9zKSA9PT0gMTIzKSB7XG4gICAgICAgIHMxID0gcGVnJGM1O1xuICAgICAgICBwZWckY3VyclBvcysrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjNik7IH1cbiAgICAgIH1cbiAgICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzMiA9IHBlZyRwYXJzZV8oKTtcbiAgICAgICAgaWYgKHMyICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgczMgPSBwZWckcGFyc2Vhcmd1bWVudCgpO1xuICAgICAgICAgIGlmIChzMyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgczQgPSBwZWckcGFyc2VfKCk7XG4gICAgICAgICAgICBpZiAoczQgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgczUgPSBwZWckY3VyclBvcztcbiAgICAgICAgICAgICAgaWYgKGlucHV0LmNoYXJDb2RlQXQocGVnJGN1cnJQb3MpID09PSA0NCkge1xuICAgICAgICAgICAgICAgIHM2ID0gcGVnJGM3O1xuICAgICAgICAgICAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgczYgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGM4KTsgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChzNiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICAgIHM3ID0gcGVnJHBhcnNlXygpO1xuICAgICAgICAgICAgICAgIGlmIChzNyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICAgICAgczggPSBwZWckcGFyc2VlbGVtZW50Rm9ybWF0KCk7XG4gICAgICAgICAgICAgICAgICBpZiAoczggIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgICAgICAgczYgPSBbczYsIHM3LCBzOF07XG4gICAgICAgICAgICAgICAgICAgIHM1ID0gczY7XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHM1O1xuICAgICAgICAgICAgICAgICAgICBzNSA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczU7XG4gICAgICAgICAgICAgICAgICBzNSA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczU7XG4gICAgICAgICAgICAgICAgczUgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChzNSA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICAgIHM1ID0gbnVsbDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoczUgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgICBzNiA9IHBlZyRwYXJzZV8oKTtcbiAgICAgICAgICAgICAgICBpZiAoczYgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgICAgIGlmIChpbnB1dC5jaGFyQ29kZUF0KHBlZyRjdXJyUG9zKSA9PT0gMTI1KSB7XG4gICAgICAgICAgICAgICAgICAgIHM3ID0gcGVnJGM5O1xuICAgICAgICAgICAgICAgICAgICBwZWckY3VyclBvcysrO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgczcgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjMTApOyB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBpZiAoczcgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICAgICAgICAgICAgICAgIHMxID0gcGVnJGMxMShzMywgczUpO1xuICAgICAgICAgICAgICAgICAgICBzMCA9IHMxO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICAgICAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgICAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gczA7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcGVnJHBhcnNlZWxlbWVudEZvcm1hdCgpIHtcbiAgICAgIHZhciBzMDtcblxuICAgICAgczAgPSBwZWckcGFyc2VzaW1wbGVGb3JtYXQoKTtcbiAgICAgIGlmIChzMCA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzMCA9IHBlZyRwYXJzZXBsdXJhbEZvcm1hdCgpO1xuICAgICAgICBpZiAoczAgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICBzMCA9IHBlZyRwYXJzZXNlbGVjdE9yZGluYWxGb3JtYXQoKTtcbiAgICAgICAgICBpZiAoczAgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgIHMwID0gcGVnJHBhcnNlc2VsZWN0Rm9ybWF0KCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzMDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwZWckcGFyc2VzaW1wbGVGb3JtYXQoKSB7XG4gICAgICB2YXIgczAsIHMxLCBzMiwgczMsIHM0LCBzNSwgczY7XG5cbiAgICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgICBpZiAoaW5wdXQuc3Vic3RyKHBlZyRjdXJyUG9zLCA2KSA9PT0gcGVnJGMxMikge1xuICAgICAgICBzMSA9IHBlZyRjMTI7XG4gICAgICAgIHBlZyRjdXJyUG9zICs9IDY7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGMxMyk7IH1cbiAgICAgIH1cbiAgICAgIGlmIChzMSA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBpZiAoaW5wdXQuc3Vic3RyKHBlZyRjdXJyUG9zLCA0KSA9PT0gcGVnJGMxNCkge1xuICAgICAgICAgIHMxID0gcGVnJGMxNDtcbiAgICAgICAgICBwZWckY3VyclBvcyArPSA0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjMTUpOyB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHMxID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgaWYgKGlucHV0LnN1YnN0cihwZWckY3VyclBvcywgNCkgPT09IHBlZyRjMTYpIHtcbiAgICAgICAgICAgIHMxID0gcGVnJGMxNjtcbiAgICAgICAgICAgIHBlZyRjdXJyUG9zICs9IDQ7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGMxNyk7IH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzMiA9IHBlZyRwYXJzZV8oKTtcbiAgICAgICAgaWYgKHMyICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgczMgPSBwZWckY3VyclBvcztcbiAgICAgICAgICBpZiAoaW5wdXQuY2hhckNvZGVBdChwZWckY3VyclBvcykgPT09IDQ0KSB7XG4gICAgICAgICAgICBzNCA9IHBlZyRjNztcbiAgICAgICAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHM0ID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGM4KTsgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoczQgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgIHM1ID0gcGVnJHBhcnNlXygpO1xuICAgICAgICAgICAgaWYgKHM1ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgIHM2ID0gcGVnJHBhcnNlY2hhcnMoKTtcbiAgICAgICAgICAgICAgaWYgKHM2ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgICAgczQgPSBbczQsIHM1LCBzNl07XG4gICAgICAgICAgICAgICAgczMgPSBzNDtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICAgICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMztcbiAgICAgICAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoczMgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgIHMzID0gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHMzICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgICAgICAgIHMxID0gcGVnJGMxOChzMSwgczMpO1xuICAgICAgICAgICAgczAgPSBzMTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHMwO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHBlZyRwYXJzZXBsdXJhbEZvcm1hdCgpIHtcbiAgICAgIHZhciBzMCwgczEsIHMyLCBzMywgczQsIHM1O1xuXG4gICAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgICAgaWYgKGlucHV0LnN1YnN0cihwZWckY3VyclBvcywgNikgPT09IHBlZyRjMTkpIHtcbiAgICAgICAgczEgPSBwZWckYzE5O1xuICAgICAgICBwZWckY3VyclBvcyArPSA2O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjMjApOyB9XG4gICAgICB9XG4gICAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczIgPSBwZWckcGFyc2VfKCk7XG4gICAgICAgIGlmIChzMiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIGlmIChpbnB1dC5jaGFyQ29kZUF0KHBlZyRjdXJyUG9zKSA9PT0gNDQpIHtcbiAgICAgICAgICAgIHMzID0gcGVnJGM3O1xuICAgICAgICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzgpOyB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzMyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgczQgPSBwZWckcGFyc2VfKCk7XG4gICAgICAgICAgICBpZiAoczQgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgczUgPSBwZWckcGFyc2VwbHVyYWxTdHlsZSgpO1xuICAgICAgICAgICAgICBpZiAoczUgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgICAgICAgICAgICBzMSA9IHBlZyRjMjEoczUpO1xuICAgICAgICAgICAgICAgIHMwID0gczE7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHMwO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHBlZyRwYXJzZXNlbGVjdE9yZGluYWxGb3JtYXQoKSB7XG4gICAgICB2YXIgczAsIHMxLCBzMiwgczMsIHM0LCBzNTtcblxuICAgICAgczAgPSBwZWckY3VyclBvcztcbiAgICAgIGlmIChpbnB1dC5zdWJzdHIocGVnJGN1cnJQb3MsIDEzKSA9PT0gcGVnJGMyMikge1xuICAgICAgICBzMSA9IHBlZyRjMjI7XG4gICAgICAgIHBlZyRjdXJyUG9zICs9IDEzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjMjMpOyB9XG4gICAgICB9XG4gICAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczIgPSBwZWckcGFyc2VfKCk7XG4gICAgICAgIGlmIChzMiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIGlmIChpbnB1dC5jaGFyQ29kZUF0KHBlZyRjdXJyUG9zKSA9PT0gNDQpIHtcbiAgICAgICAgICAgIHMzID0gcGVnJGM3O1xuICAgICAgICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzgpOyB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzMyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgczQgPSBwZWckcGFyc2VfKCk7XG4gICAgICAgICAgICBpZiAoczQgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgczUgPSBwZWckcGFyc2VwbHVyYWxTdHlsZSgpO1xuICAgICAgICAgICAgICBpZiAoczUgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgICAgICAgICAgICBzMSA9IHBlZyRjMjQoczUpO1xuICAgICAgICAgICAgICAgIHMwID0gczE7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHMwO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHBlZyRwYXJzZXNlbGVjdEZvcm1hdCgpIHtcbiAgICAgIHZhciBzMCwgczEsIHMyLCBzMywgczQsIHM1LCBzNjtcblxuICAgICAgczAgPSBwZWckY3VyclBvcztcbiAgICAgIGlmIChpbnB1dC5zdWJzdHIocGVnJGN1cnJQb3MsIDYpID09PSBwZWckYzI1KSB7XG4gICAgICAgIHMxID0gcGVnJGMyNTtcbiAgICAgICAgcGVnJGN1cnJQb3MgKz0gNjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzI2KTsgfVxuICAgICAgfVxuICAgICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMyID0gcGVnJHBhcnNlXygpO1xuICAgICAgICBpZiAoczIgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICBpZiAoaW5wdXQuY2hhckNvZGVBdChwZWckY3VyclBvcykgPT09IDQ0KSB7XG4gICAgICAgICAgICBzMyA9IHBlZyRjNztcbiAgICAgICAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGM4KTsgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoczMgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgIHM0ID0gcGVnJHBhcnNlXygpO1xuICAgICAgICAgICAgaWYgKHM0ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgIHM1ID0gW107XG4gICAgICAgICAgICAgIHM2ID0gcGVnJHBhcnNlb3B0aW9uYWxGb3JtYXRQYXR0ZXJuKCk7XG4gICAgICAgICAgICAgIGlmIChzNiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICAgIHdoaWxlIChzNiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICAgICAgczUucHVzaChzNik7XG4gICAgICAgICAgICAgICAgICBzNiA9IHBlZyRwYXJzZW9wdGlvbmFsRm9ybWF0UGF0dGVybigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzNSA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKHM1ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICAgICAgICAgICAgczEgPSBwZWckYzI3KHM1KTtcbiAgICAgICAgICAgICAgICBzMCA9IHMxO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgICAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzMDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwZWckcGFyc2VzZWxlY3RvcigpIHtcbiAgICAgIHZhciBzMCwgczEsIHMyLCBzMztcblxuICAgICAgczAgPSBwZWckY3VyclBvcztcbiAgICAgIHMxID0gcGVnJGN1cnJQb3M7XG4gICAgICBpZiAoaW5wdXQuY2hhckNvZGVBdChwZWckY3VyclBvcykgPT09IDYxKSB7XG4gICAgICAgIHMyID0gcGVnJGMyODtcbiAgICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHMyID0gcGVnJEZBSUxFRDtcbiAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzI5KTsgfVxuICAgICAgfVxuICAgICAgaWYgKHMyICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMzID0gcGVnJHBhcnNlbnVtYmVyKCk7XG4gICAgICAgIGlmIChzMyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHMyID0gW3MyLCBzM107XG4gICAgICAgICAgczEgPSBzMjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwZWckY3VyclBvcyA9IHMxO1xuICAgICAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGVnJGN1cnJQb3MgPSBzMTtcbiAgICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgfVxuICAgICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMwID0gaW5wdXQuc3Vic3RyaW5nKHMwLCBwZWckY3VyclBvcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzMCA9IHMxO1xuICAgICAgfVxuICAgICAgaWYgKHMwID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMwID0gcGVnJHBhcnNlY2hhcnMoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHMwO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHBlZyRwYXJzZW9wdGlvbmFsRm9ybWF0UGF0dGVybigpIHtcbiAgICAgIHZhciBzMCwgczEsIHMyLCBzMywgczQsIHM1LCBzNiwgczcsIHM4O1xuXG4gICAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgICAgczEgPSBwZWckcGFyc2VfKCk7XG4gICAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczIgPSBwZWckcGFyc2VzZWxlY3RvcigpO1xuICAgICAgICBpZiAoczIgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICBzMyA9IHBlZyRwYXJzZV8oKTtcbiAgICAgICAgICBpZiAoczMgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgIGlmIChpbnB1dC5jaGFyQ29kZUF0KHBlZyRjdXJyUG9zKSA9PT0gMTIzKSB7XG4gICAgICAgICAgICAgIHM0ID0gcGVnJGM1O1xuICAgICAgICAgICAgICBwZWckY3VyclBvcysrO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgczQgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjNik7IH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzNCAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICBzNSA9IHBlZyRwYXJzZV8oKTtcbiAgICAgICAgICAgICAgaWYgKHM1ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgICAgczYgPSBwZWckcGFyc2VtZXNzYWdlRm9ybWF0UGF0dGVybigpO1xuICAgICAgICAgICAgICAgIGlmIChzNiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICAgICAgczcgPSBwZWckcGFyc2VfKCk7XG4gICAgICAgICAgICAgICAgICBpZiAoczcgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0LmNoYXJDb2RlQXQocGVnJGN1cnJQb3MpID09PSAxMjUpIHtcbiAgICAgICAgICAgICAgICAgICAgICBzOCA9IHBlZyRjOTtcbiAgICAgICAgICAgICAgICAgICAgICBwZWckY3VyclBvcysrO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIHM4ID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjMTApOyB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHM4ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgICAgICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICAgICAgICAgICAgICAgICAgczEgPSBwZWckYzMwKHMyLCBzNik7XG4gICAgICAgICAgICAgICAgICAgICAgczAgPSBzMTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgICAgICAgICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICAgICAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgICAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gczA7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcGVnJHBhcnNlb2Zmc2V0KCkge1xuICAgICAgdmFyIHMwLCBzMSwgczIsIHMzO1xuXG4gICAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgICAgaWYgKGlucHV0LnN1YnN0cihwZWckY3VyclBvcywgNykgPT09IHBlZyRjMzEpIHtcbiAgICAgICAgczEgPSBwZWckYzMxO1xuICAgICAgICBwZWckY3VyclBvcyArPSA3O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjMzIpOyB9XG4gICAgICB9XG4gICAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczIgPSBwZWckcGFyc2VfKCk7XG4gICAgICAgIGlmIChzMiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHMzID0gcGVnJHBhcnNlbnVtYmVyKCk7XG4gICAgICAgICAgaWYgKHMzICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgICAgICAgIHMxID0gcGVnJGMzMyhzMyk7XG4gICAgICAgICAgICBzMCA9IHMxO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gczA7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcGVnJHBhcnNlcGx1cmFsU3R5bGUoKSB7XG4gICAgICB2YXIgczAsIHMxLCBzMiwgczMsIHM0O1xuXG4gICAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgICAgczEgPSBwZWckcGFyc2VvZmZzZXQoKTtcbiAgICAgIGlmIChzMSA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzMSA9IG51bGw7XG4gICAgICB9XG4gICAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczIgPSBwZWckcGFyc2VfKCk7XG4gICAgICAgIGlmIChzMiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHMzID0gW107XG4gICAgICAgICAgczQgPSBwZWckcGFyc2VvcHRpb25hbEZvcm1hdFBhdHRlcm4oKTtcbiAgICAgICAgICBpZiAoczQgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgIHdoaWxlIChzNCAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICBzMy5wdXNoKHM0KTtcbiAgICAgICAgICAgICAgczQgPSBwZWckcGFyc2VvcHRpb25hbEZvcm1hdFBhdHRlcm4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoczMgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgICAgICAgczEgPSBwZWckYzM0KHMxLCBzMyk7XG4gICAgICAgICAgICBzMCA9IHMxO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gczA7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcGVnJHBhcnNld3MoKSB7XG4gICAgICB2YXIgczAsIHMxO1xuXG4gICAgICBwZWckc2lsZW50RmFpbHMrKztcbiAgICAgIHMwID0gW107XG4gICAgICBpZiAocGVnJGMzNi50ZXN0KGlucHV0LmNoYXJBdChwZWckY3VyclBvcykpKSB7XG4gICAgICAgIHMxID0gaW5wdXQuY2hhckF0KHBlZyRjdXJyUG9zKTtcbiAgICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzM3KTsgfVxuICAgICAgfVxuICAgICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHdoaWxlIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHMwLnB1c2goczEpO1xuICAgICAgICAgIGlmIChwZWckYzM2LnRlc3QoaW5wdXQuY2hhckF0KHBlZyRjdXJyUG9zKSkpIHtcbiAgICAgICAgICAgIHMxID0gaW5wdXQuY2hhckF0KHBlZyRjdXJyUG9zKTtcbiAgICAgICAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGMzNyk7IH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgIH1cbiAgICAgIHBlZyRzaWxlbnRGYWlscy0tO1xuICAgICAgaWYgKHMwID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzM1KTsgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gczA7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcGVnJHBhcnNlXygpIHtcbiAgICAgIHZhciBzMCwgczEsIHMyO1xuXG4gICAgICBwZWckc2lsZW50RmFpbHMrKztcbiAgICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgICBzMSA9IFtdO1xuICAgICAgczIgPSBwZWckcGFyc2V3cygpO1xuICAgICAgd2hpbGUgKHMyICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMxLnB1c2goczIpO1xuICAgICAgICBzMiA9IHBlZyRwYXJzZXdzKCk7XG4gICAgICB9XG4gICAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczAgPSBpbnB1dC5zdWJzdHJpbmcoczAsIHBlZyRjdXJyUG9zKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHMwID0gczE7XG4gICAgICB9XG4gICAgICBwZWckc2lsZW50RmFpbHMtLTtcbiAgICAgIGlmIChzMCA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGMzOCk7IH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHMwO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHBlZyRwYXJzZWRpZ2l0KCkge1xuICAgICAgdmFyIHMwO1xuXG4gICAgICBpZiAocGVnJGMzOS50ZXN0KGlucHV0LmNoYXJBdChwZWckY3VyclBvcykpKSB7XG4gICAgICAgIHMwID0gaW5wdXQuY2hhckF0KHBlZyRjdXJyUG9zKTtcbiAgICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzQwKTsgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gczA7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcGVnJHBhcnNlaGV4RGlnaXQoKSB7XG4gICAgICB2YXIgczA7XG5cbiAgICAgIGlmIChwZWckYzQxLnRlc3QoaW5wdXQuY2hhckF0KHBlZyRjdXJyUG9zKSkpIHtcbiAgICAgICAgczAgPSBpbnB1dC5jaGFyQXQocGVnJGN1cnJQb3MpO1xuICAgICAgICBwZWckY3VyclBvcysrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjNDIpOyB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzMDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwZWckcGFyc2VudW1iZXIoKSB7XG4gICAgICB2YXIgczAsIHMxLCBzMiwgczMsIHM0LCBzNTtcblxuICAgICAgczAgPSBwZWckY3VyclBvcztcbiAgICAgIGlmIChpbnB1dC5jaGFyQ29kZUF0KHBlZyRjdXJyUG9zKSA9PT0gNDgpIHtcbiAgICAgICAgczEgPSBwZWckYzQzO1xuICAgICAgICBwZWckY3VyclBvcysrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjNDQpOyB9XG4gICAgICB9XG4gICAgICBpZiAoczEgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczEgPSBwZWckY3VyclBvcztcbiAgICAgICAgczIgPSBwZWckY3VyclBvcztcbiAgICAgICAgaWYgKHBlZyRjNDUudGVzdChpbnB1dC5jaGFyQXQocGVnJGN1cnJQb3MpKSkge1xuICAgICAgICAgIHMzID0gaW5wdXQuY2hhckF0KHBlZyRjdXJyUG9zKTtcbiAgICAgICAgICBwZWckY3VyclBvcysrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjNDYpOyB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHMzICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgczQgPSBbXTtcbiAgICAgICAgICBzNSA9IHBlZyRwYXJzZWRpZ2l0KCk7XG4gICAgICAgICAgd2hpbGUgKHM1ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICBzNC5wdXNoKHM1KTtcbiAgICAgICAgICAgIHM1ID0gcGVnJHBhcnNlZGlnaXQoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHM0ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICBzMyA9IFtzMywgczRdO1xuICAgICAgICAgICAgczIgPSBzMztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMjtcbiAgICAgICAgICAgIHMyID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMjtcbiAgICAgICAgICBzMiA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHMyICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgczEgPSBpbnB1dC5zdWJzdHJpbmcoczEsIHBlZyRjdXJyUG9zKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzMSA9IHMyO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICAgIHMxID0gcGVnJGM0NyhzMSk7XG4gICAgICB9XG4gICAgICBzMCA9IHMxO1xuXG4gICAgICByZXR1cm4gczA7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcGVnJHBhcnNlY2hhcigpIHtcbiAgICAgIHZhciBzMCwgczEsIHMyLCBzMywgczQsIHM1LCBzNiwgczc7XG5cbiAgICAgIGlmIChwZWckYzQ4LnRlc3QoaW5wdXQuY2hhckF0KHBlZyRjdXJyUG9zKSkpIHtcbiAgICAgICAgczAgPSBpbnB1dC5jaGFyQXQocGVnJGN1cnJQb3MpO1xuICAgICAgICBwZWckY3VyclBvcysrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjNDkpOyB9XG4gICAgICB9XG4gICAgICBpZiAoczAgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczAgPSBwZWckY3VyclBvcztcbiAgICAgICAgaWYgKGlucHV0LnN1YnN0cihwZWckY3VyclBvcywgMikgPT09IHBlZyRjNTApIHtcbiAgICAgICAgICBzMSA9IHBlZyRjNTA7XG4gICAgICAgICAgcGVnJGN1cnJQb3MgKz0gMjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzUxKTsgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgICAgIHMxID0gcGVnJGM1MigpO1xuICAgICAgICB9XG4gICAgICAgIHMwID0gczE7XG4gICAgICAgIGlmIChzMCA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgICAgICAgaWYgKGlucHV0LnN1YnN0cihwZWckY3VyclBvcywgMikgPT09IHBlZyRjNTMpIHtcbiAgICAgICAgICAgIHMxID0gcGVnJGM1MztcbiAgICAgICAgICAgIHBlZyRjdXJyUG9zICs9IDI7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGM1NCk7IH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgICAgICAgIHMxID0gcGVnJGM1NSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzMCA9IHMxO1xuICAgICAgICAgIGlmIChzMCA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgczAgPSBwZWckY3VyclBvcztcbiAgICAgICAgICAgIGlmIChpbnB1dC5zdWJzdHIocGVnJGN1cnJQb3MsIDIpID09PSBwZWckYzU2KSB7XG4gICAgICAgICAgICAgIHMxID0gcGVnJGM1NjtcbiAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgKz0gMjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzU3KTsgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgICAgICAgICBzMSA9IHBlZyRjNTgoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHMwID0gczE7XG4gICAgICAgICAgICBpZiAoczAgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgczAgPSBwZWckY3VyclBvcztcbiAgICAgICAgICAgICAgaWYgKGlucHV0LnN1YnN0cihwZWckY3VyclBvcywgMikgPT09IHBlZyRjNTkpIHtcbiAgICAgICAgICAgICAgICBzMSA9IHBlZyRjNTk7XG4gICAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgKz0gMjtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzYwKTsgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgICAgICAgICAgIHMxID0gcGVnJGM2MSgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHMwID0gczE7XG4gICAgICAgICAgICAgIGlmIChzMCA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgICAgICAgICAgICAgaWYgKGlucHV0LnN1YnN0cihwZWckY3VyclBvcywgMikgPT09IHBlZyRjNjIpIHtcbiAgICAgICAgICAgICAgICAgIHMxID0gcGVnJGM2MjtcbiAgICAgICAgICAgICAgICAgIHBlZyRjdXJyUG9zICs9IDI7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGM2Myk7IH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgICAgICBzMiA9IHBlZyRjdXJyUG9zO1xuICAgICAgICAgICAgICAgICAgczMgPSBwZWckY3VyclBvcztcbiAgICAgICAgICAgICAgICAgIHM0ID0gcGVnJHBhcnNlaGV4RGlnaXQoKTtcbiAgICAgICAgICAgICAgICAgIGlmIChzNCAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICAgICAgICBzNSA9IHBlZyRwYXJzZWhleERpZ2l0KCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzNSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICAgICAgICAgIHM2ID0gcGVnJHBhcnNlaGV4RGlnaXQoKTtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoczYgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHM3ID0gcGVnJHBhcnNlaGV4RGlnaXQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzNyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBzNCA9IFtzNCwgczUsIHM2LCBzN107XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHMzID0gczQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgICAgICAgICAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgICAgICAgICAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICAgICAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBpZiAoczMgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgICAgICAgczIgPSBpbnB1dC5zdWJzdHJpbmcoczIsIHBlZyRjdXJyUG9zKTtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHMyID0gczM7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBpZiAoczIgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICAgICAgICAgICAgICAgIHMxID0gcGVnJGM2NChzMik7XG4gICAgICAgICAgICAgICAgICAgIHMwID0gczE7XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgICAgICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgICAgICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzMDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwZWckcGFyc2VjaGFycygpIHtcbiAgICAgIHZhciBzMCwgczEsIHMyO1xuXG4gICAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgICAgczEgPSBbXTtcbiAgICAgIHMyID0gcGVnJHBhcnNlY2hhcigpO1xuICAgICAgaWYgKHMyICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHdoaWxlIChzMiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHMxLnB1c2goczIpO1xuICAgICAgICAgIHMyID0gcGVnJHBhcnNlY2hhcigpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICB9XG4gICAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICAgIHMxID0gcGVnJGM2NShzMSk7XG4gICAgICB9XG4gICAgICBzMCA9IHMxO1xuXG4gICAgICByZXR1cm4gczA7XG4gICAgfVxuXG4gICAgcGVnJHJlc3VsdCA9IHBlZyRzdGFydFJ1bGVGdW5jdGlvbigpO1xuXG4gICAgaWYgKHBlZyRyZXN1bHQgIT09IHBlZyRGQUlMRUQgJiYgcGVnJGN1cnJQb3MgPT09IGlucHV0Lmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHBlZyRyZXN1bHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChwZWckcmVzdWx0ICE9PSBwZWckRkFJTEVEICYmIHBlZyRjdXJyUG9zIDwgaW5wdXQubGVuZ3RoKSB7XG4gICAgICAgIHBlZyRmYWlsKHsgdHlwZTogXCJlbmRcIiwgZGVzY3JpcHRpb246IFwiZW5kIG9mIGlucHV0XCIgfSk7XG4gICAgICB9XG5cbiAgICAgIHRocm93IHBlZyRidWlsZEV4Y2VwdGlvbihcbiAgICAgICAgbnVsbCxcbiAgICAgICAgcGVnJG1heEZhaWxFeHBlY3RlZCxcbiAgICAgICAgcGVnJG1heEZhaWxQb3MgPCBpbnB1dC5sZW5ndGggPyBpbnB1dC5jaGFyQXQocGVnJG1heEZhaWxQb3MpIDogbnVsbCxcbiAgICAgICAgcGVnJG1heEZhaWxQb3MgPCBpbnB1dC5sZW5ndGhcbiAgICAgICAgICA/IHBlZyRjb21wdXRlTG9jYXRpb24ocGVnJG1heEZhaWxQb3MsIHBlZyRtYXhGYWlsUG9zICsgMSlcbiAgICAgICAgICA6IHBlZyRjb21wdXRlTG9jYXRpb24ocGVnJG1heEZhaWxQb3MsIHBlZyRtYXhGYWlsUG9zKVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIFN5bnRheEVycm9yOiBwZWckU3ludGF4RXJyb3IsXG4gICAgcGFyc2U6ICAgICAgIHBlZyRwYXJzZVxuICB9O1xufSkoKTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cGFyc2VyLmpzLm1hcCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///204\n')},function(module,exports,__webpack_require__){"use strict";eval('// GENERATED FILE\n\nexports["default"] = {"locale":"en","pluralRuleFunction":function (n,ord){var s=String(n).split("."),v0=!s[1],t0=Number(s[0])==n,n10=t0&&s[0].slice(-1),n100=t0&&s[0].slice(-2);if(ord)return n10==1&&n100!=11?"one":n10==2&&n100!=12?"two":n10==3&&n100!=13?"few":"other";return n==1&&v0?"one":"other"}};\n\n//# sourceMappingURL=en.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjA1LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2ludGwtbWVzc2FnZWZvcm1hdC9saWIvZW4uanM/NDc5OCJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBHRU5FUkFURUQgRklMRVxuXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IHtcImxvY2FsZVwiOlwiZW5cIixcInBsdXJhbFJ1bGVGdW5jdGlvblwiOmZ1bmN0aW9uIChuLG9yZCl7dmFyIHM9U3RyaW5nKG4pLnNwbGl0KFwiLlwiKSx2MD0hc1sxXSx0MD1OdW1iZXIoc1swXSk9PW4sbjEwPXQwJiZzWzBdLnNsaWNlKC0xKSxuMTAwPXQwJiZzWzBdLnNsaWNlKC0yKTtpZihvcmQpcmV0dXJuIG4xMD09MSYmbjEwMCE9MTE/XCJvbmVcIjpuMTA9PTImJm4xMDAhPTEyP1widHdvXCI6bjEwPT0zJiZuMTAwIT0xMz9cImZld1wiOlwib3RoZXJcIjtyZXR1cm4gbj09MSYmdjA/XCJvbmVcIjpcIm90aGVyXCJ9fTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZW4uanMubWFwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///205\n')},function(module,exports){eval("/* (ignored) *///# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjA2LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbGliL2xvY2FsZXMgKGlnbm9yZWQpPzAwYjMiXSwic291cmNlc0NvbnRlbnQiOlsiLyogKGlnbm9yZWQpICovIl0sIm1hcHBpbmdzIjoiQUFBQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///206\n")},function(module,exports,__webpack_require__){"use strict";eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.setToastPlacement = setToastPlacement;\nexports.TOAST_PLACEMENT = exports.TOAST_CONTAINERS = void 0;\n\n/*************************************************************************\n* ADOBE CONFIDENTIAL\n* ___________________\n*\n* Copyright 2019 Adobe\n* All Rights Reserved.\n*\n* NOTICE: All information contained herein is, and remains\n* the property of Adobe and its suppliers, if any. The intellectual\n* and technical concepts contained herein are proprietary to Adobe\n* and its suppliers and are protected by all applicable intellectual\n* property laws, including trade secret and copyright laws.\n* Dissemination of this information or reproduction of this material\n* is strictly forbidden unless prior written permission is obtained\n* from Adobe.\n**************************************************************************/\nconst TOAST_CONTAINERS = new Map();\nexports.TOAST_CONTAINERS = TOAST_CONTAINERS;\nlet TOAST_PLACEMENT = 'top center';\nexports.TOAST_PLACEMENT = TOAST_PLACEMENT;\n\nfunction setToastPlacement(placement) {\n  exports.TOAST_PLACEMENT = TOAST_PLACEMENT = placement;\n\n  for (let container of TOAST_CONTAINERS.values()) {\n    container.setState({\n      placement\n    });\n  }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjA3LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0b3JxLW5hdGl2ZS9yZWFjdC1zcGVjdHJ1bS9Ub2FzdC9qcy9zdGF0ZS5qcz8yMjBkIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5zZXRUb2FzdFBsYWNlbWVudCA9IHNldFRvYXN0UGxhY2VtZW50O1xuZXhwb3J0cy5UT0FTVF9QTEFDRU1FTlQgPSBleHBvcnRzLlRPQVNUX0NPTlRBSU5FUlMgPSB2b2lkIDA7XG5cbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4qIEFET0JFIENPTkZJREVOVElBTFxuKiBfX19fX19fX19fX19fX19fX19fXG4qXG4qIENvcHlyaWdodCAyMDE5IEFkb2JlXG4qIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4qXG4qIE5PVElDRTogQWxsIGluZm9ybWF0aW9uIGNvbnRhaW5lZCBoZXJlaW4gaXMsIGFuZCByZW1haW5zXG4qIHRoZSBwcm9wZXJ0eSBvZiBBZG9iZSBhbmQgaXRzIHN1cHBsaWVycywgaWYgYW55LiBUaGUgaW50ZWxsZWN0dWFsXG4qIGFuZCB0ZWNobmljYWwgY29uY2VwdHMgY29udGFpbmVkIGhlcmVpbiBhcmUgcHJvcHJpZXRhcnkgdG8gQWRvYmVcbiogYW5kIGl0cyBzdXBwbGllcnMgYW5kIGFyZSBwcm90ZWN0ZWQgYnkgYWxsIGFwcGxpY2FibGUgaW50ZWxsZWN0dWFsXG4qIHByb3BlcnR5IGxhd3MsIGluY2x1ZGluZyB0cmFkZSBzZWNyZXQgYW5kIGNvcHlyaWdodCBsYXdzLlxuKiBEaXNzZW1pbmF0aW9uIG9mIHRoaXMgaW5mb3JtYXRpb24gb3IgcmVwcm9kdWN0aW9uIG9mIHRoaXMgbWF0ZXJpYWxcbiogaXMgc3RyaWN0bHkgZm9yYmlkZGVuIHVubGVzcyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gaXMgb2J0YWluZWRcbiogZnJvbSBBZG9iZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuY29uc3QgVE9BU1RfQ09OVEFJTkVSUyA9IG5ldyBNYXAoKTtcbmV4cG9ydHMuVE9BU1RfQ09OVEFJTkVSUyA9IFRPQVNUX0NPTlRBSU5FUlM7XG5sZXQgVE9BU1RfUExBQ0VNRU5UID0gJ3RvcCBjZW50ZXInO1xuZXhwb3J0cy5UT0FTVF9QTEFDRU1FTlQgPSBUT0FTVF9QTEFDRU1FTlQ7XG5cbmZ1bmN0aW9uIHNldFRvYXN0UGxhY2VtZW50KHBsYWNlbWVudCkge1xuICBleHBvcnRzLlRPQVNUX1BMQUNFTUVOVCA9IFRPQVNUX1BMQUNFTUVOVCA9IHBsYWNlbWVudDtcblxuICBmb3IgKGxldCBjb250YWluZXIgb2YgVE9BU1RfQ09OVEFJTkVSUy52YWx1ZXMoKSkge1xuICAgIGNvbnRhaW5lci5zZXRTdGF0ZSh7XG4gICAgICBwbGFjZW1lbnRcbiAgICB9KTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///207\n")},function(module,exports){eval("/**\n *  Copyright 2018 Adobe. All rights reserved.\n *  This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n *  you may not use this file except in compliance with the License. You may obtain a copy\n *  of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software distributed under\n *  the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n *  OF ANY KIND, either express or implied. See the License for the specific language\n *  governing permissions and limitations under the License.\n */\n\n// Provides explicit indication of elements receiving focus through keyboard interaction rather than mouse or touch.\n(function(doc) {\n  // In case file is imported in SSR context, don't polyfill anything\n  if (!doc) {\n    return;\n  }\n\n  var NAVIGATION_KEYS = [\n    'Tab',\n    'ArrowUp',\n    'ArrowRight',\n    'ArrowDown',\n    'ArrowLeft',\n    'Home',\n    'End',\n    'PageUp',\n    'PageDown',\n    'Enter',\n    ' ',\n    'Escape',\n\n    /* IE9 and Firefox < 37 */\n    'Up',\n    'Right',\n    'Down',\n    'Left',\n    'Esc'\n  ];\n  var TEXT_INPUT_TYPES = [\n    'text',\n    'date',\n    'datetime-local',\n    'email',\n    'month',\n    'number',\n    'password',\n    'search',\n    'tel',\n    'time',\n    'url',\n    'week'\n  ];\n  var keyboardFocus = false;\n  var elements = doc.getElementsByClassName('focus-ring');\n\n  function onKeydownHandler(event) {\n    if (event.ctrlKey || event.altKey || event.metaKey || NAVIGATION_KEYS.indexOf(event.key) === -1) {\n      return;\n    }\n    keyboardFocus = true;\n\n    if (doc.activeElement &&\n        doc.activeElement !== doc.body &&\n        doc.activeElement.tagName !== 'TEXTAREA' &&\n        !(doc.activeElement.tagName === 'INPUT' &&\n          TEXT_INPUT_TYPES.indexOf(doc.activeElement.type) !== -1)) {\n      doc.activeElement.classList.add('focus-ring');\n    }\n  }\n\n  function onMousedownHandler() {\n    keyboardFocus = false;\n\n    for (var i = 0; i < elements.length; i++) {\n      elements[i].classList.remove('focus-ring');\n    }\n\n  }\n\n  function onFocusHandler(event) {\n    var classList = event.target.classList;\n    if (classList && keyboardFocus) {\n      classList.add('focus-ring');\n    }\n  }\n\n  function onBlurHandler(event) {\n    var classList = event.target.classList;\n    classList && classList.remove('focus-ring');\n  }\n\n  doc.addEventListener('keydown', onKeydownHandler, true);\n  doc.addEventListener('mousedown', onMousedownHandler, true);\n  doc.addEventListener('focus', onFocusHandler, true);\n  doc.addEventListener('blur', onBlurHandler, true);\n})(typeof window === \"undefined\" ? undefined : document);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjA4LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0b3JxLW5hdGl2ZS9yZWFjdC1zcGVjdHJ1bS9mb2N1cy1yaW5nLXBvbHlmaWxsL2luZGV4LmpzPzEzYTkiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiAgQ29weXJpZ2h0IDIwMTggQWRvYmUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5XG4gKiAgb2YgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXJcbiAqICB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBSRVBSRVNFTlRBVElPTlNcbiAqICBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2VcbiAqICBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbi8vIFByb3ZpZGVzIGV4cGxpY2l0IGluZGljYXRpb24gb2YgZWxlbWVudHMgcmVjZWl2aW5nIGZvY3VzIHRocm91Z2gga2V5Ym9hcmQgaW50ZXJhY3Rpb24gcmF0aGVyIHRoYW4gbW91c2Ugb3IgdG91Y2guXG4oZnVuY3Rpb24oZG9jKSB7XG4gIC8vIEluIGNhc2UgZmlsZSBpcyBpbXBvcnRlZCBpbiBTU1IgY29udGV4dCwgZG9uJ3QgcG9seWZpbGwgYW55dGhpbmdcbiAgaWYgKCFkb2MpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgTkFWSUdBVElPTl9LRVlTID0gW1xuICAgICdUYWInLFxuICAgICdBcnJvd1VwJyxcbiAgICAnQXJyb3dSaWdodCcsXG4gICAgJ0Fycm93RG93bicsXG4gICAgJ0Fycm93TGVmdCcsXG4gICAgJ0hvbWUnLFxuICAgICdFbmQnLFxuICAgICdQYWdlVXAnLFxuICAgICdQYWdlRG93bicsXG4gICAgJ0VudGVyJyxcbiAgICAnICcsXG4gICAgJ0VzY2FwZScsXG5cbiAgICAvKiBJRTkgYW5kIEZpcmVmb3ggPCAzNyAqL1xuICAgICdVcCcsXG4gICAgJ1JpZ2h0JyxcbiAgICAnRG93bicsXG4gICAgJ0xlZnQnLFxuICAgICdFc2MnXG4gIF07XG4gIHZhciBURVhUX0lOUFVUX1RZUEVTID0gW1xuICAgICd0ZXh0JyxcbiAgICAnZGF0ZScsXG4gICAgJ2RhdGV0aW1lLWxvY2FsJyxcbiAgICAnZW1haWwnLFxuICAgICdtb250aCcsXG4gICAgJ251bWJlcicsXG4gICAgJ3Bhc3N3b3JkJyxcbiAgICAnc2VhcmNoJyxcbiAgICAndGVsJyxcbiAgICAndGltZScsXG4gICAgJ3VybCcsXG4gICAgJ3dlZWsnXG4gIF07XG4gIHZhciBrZXlib2FyZEZvY3VzID0gZmFsc2U7XG4gIHZhciBlbGVtZW50cyA9IGRvYy5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdmb2N1cy1yaW5nJyk7XG5cbiAgZnVuY3Rpb24gb25LZXlkb3duSGFuZGxlcihldmVudCkge1xuICAgIGlmIChldmVudC5jdHJsS2V5IHx8IGV2ZW50LmFsdEtleSB8fCBldmVudC5tZXRhS2V5IHx8IE5BVklHQVRJT05fS0VZUy5pbmRleE9mKGV2ZW50LmtleSkgPT09IC0xKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGtleWJvYXJkRm9jdXMgPSB0cnVlO1xuXG4gICAgaWYgKGRvYy5hY3RpdmVFbGVtZW50ICYmXG4gICAgICAgIGRvYy5hY3RpdmVFbGVtZW50ICE9PSBkb2MuYm9keSAmJlxuICAgICAgICBkb2MuYWN0aXZlRWxlbWVudC50YWdOYW1lICE9PSAnVEVYVEFSRUEnICYmXG4gICAgICAgICEoZG9jLmFjdGl2ZUVsZW1lbnQudGFnTmFtZSA9PT0gJ0lOUFVUJyAmJlxuICAgICAgICAgIFRFWFRfSU5QVVRfVFlQRVMuaW5kZXhPZihkb2MuYWN0aXZlRWxlbWVudC50eXBlKSAhPT0gLTEpKSB7XG4gICAgICBkb2MuYWN0aXZlRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdmb2N1cy1yaW5nJyk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gb25Nb3VzZWRvd25IYW5kbGVyKCkge1xuICAgIGtleWJvYXJkRm9jdXMgPSBmYWxzZTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGVsZW1lbnRzW2ldLmNsYXNzTGlzdC5yZW1vdmUoJ2ZvY3VzLXJpbmcnKTtcbiAgICB9XG5cbiAgfVxuXG4gIGZ1bmN0aW9uIG9uRm9jdXNIYW5kbGVyKGV2ZW50KSB7XG4gICAgdmFyIGNsYXNzTGlzdCA9IGV2ZW50LnRhcmdldC5jbGFzc0xpc3Q7XG4gICAgaWYgKGNsYXNzTGlzdCAmJiBrZXlib2FyZEZvY3VzKSB7XG4gICAgICBjbGFzc0xpc3QuYWRkKCdmb2N1cy1yaW5nJyk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gb25CbHVySGFuZGxlcihldmVudCkge1xuICAgIHZhciBjbGFzc0xpc3QgPSBldmVudC50YXJnZXQuY2xhc3NMaXN0O1xuICAgIGNsYXNzTGlzdCAmJiBjbGFzc0xpc3QucmVtb3ZlKCdmb2N1cy1yaW5nJyk7XG4gIH1cblxuICBkb2MuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIG9uS2V5ZG93bkhhbmRsZXIsIHRydWUpO1xuICBkb2MuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgb25Nb3VzZWRvd25IYW5kbGVyLCB0cnVlKTtcbiAgZG9jLmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzJywgb25Gb2N1c0hhbmRsZXIsIHRydWUpO1xuICBkb2MuYWRkRXZlbnRMaXN0ZW5lcignYmx1cicsIG9uQmx1ckhhbmRsZXIsIHRydWUpO1xufSkodHlwZW9mIHdpbmRvdyA9PT0gXCJ1bmRlZmluZWRcIiA/IHVuZGVmaW5lZCA6IGRvY3VtZW50KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///208\n")},function(module,exports,__webpack_require__){eval("var api = __webpack_require__(5);\n            var content = __webpack_require__(210);\n\n            content = content.__esModule ? content.default : content;\n\n            if (typeof content === 'string') {\n              content = [[module.i, content, '']];\n            }\n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = api(content, options);\n\n\n\nmodule.exports = content.locals || {};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjA5LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0b3JxLW5hdGl2ZS9yZWFjdC1zcGVjdHJ1bS9Qcm92aWRlci9zdHlsZS9pbmRleC5jc3M/ZWYzZCJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgYXBpID0gcmVxdWlyZShcIiEuLi8uLi8uLi8uLi9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luamVjdFN0eWxlc0ludG9TdHlsZVRhZy5qc1wiKTtcbiAgICAgICAgICAgIHZhciBjb250ZW50ID0gcmVxdWlyZShcIiEhLi4vLi4vLi4vLi4vY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL2luZGV4LmNzc1wiKTtcblxuICAgICAgICAgICAgY29udGVudCA9IGNvbnRlbnQuX19lc01vZHVsZSA/IGNvbnRlbnQuZGVmYXVsdCA6IGNvbnRlbnQ7XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgY29udGVudCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgY29udGVudCA9IFtbbW9kdWxlLmlkLCBjb250ZW50LCAnJ11dO1xuICAgICAgICAgICAgfVxuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLmluc2VydCA9IFwiaGVhZFwiO1xub3B0aW9ucy5zaW5nbGV0b24gPSBmYWxzZTtcblxudmFyIHVwZGF0ZSA9IGFwaShjb250ZW50LCBvcHRpb25zKTtcblxuXG5cbm1vZHVsZS5leHBvcnRzID0gY29udGVudC5sb2NhbHMgfHwge307Il0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///209\n")},function(module,exports,__webpack_require__){eval('exports = module.exports = __webpack_require__(6)(false);\n// Module\nexports.push([module.i, "/*************************************************************************\\n* ADOBE CONFIDENTIAL\\n* ___________________\\n*\\n* Copyright 2019 Adobe\\n* All Rights Reserved.\\n*\\n* NOTICE: All information contained herein is, and remains\\n* the property of Adobe and its suppliers, if any. The intellectual\\n* and technical concepts contained herein are proprietary to Adobe\\n* and its suppliers and are protected by all applicable intellectual\\n* property laws, including trade secret and copyright laws.\\n* Dissemination of this information or reproduction of this material\\n* is strictly forbidden unless prior written permission is obtained\\n* from Adobe.\\n**************************************************************************/\\n\\n.react-spectrum-provider {\\n  position: relative;\\n}\\n\\n.spectrum--override {\\n  font-family: \'Adobe Clean\', \\"Source Sans Pro\\", -apple-system, BlinkMacSystemFont, \\"Segoe UI\\", Roboto, sans-serif !important;\\n}\\n\\n.spectrum--override:lang(zh),\\n.spectrum--override:lang(ko),\\n.spectrum--override:lang(ja) {\\n  font-family: \'Adobe Clean Han\', -apple-system, BlinkMacSystemFont, \\"Segoe UI\\", Roboto, sans-serif !important;\\n}\\n\\n.react-spectrum-uxp-cssNext,\\n.react-spectrum-uxp-cssNext:before,\\n.react-spectrum-uxp-cssNext:after {\\n  box-shadow: none !important;\\n}", ""]);\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjEwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0b3JxLW5hdGl2ZS9yZWFjdC1zcGVjdHJ1bS9Qcm92aWRlci9zdHlsZS9pbmRleC5jc3M/NzM3NCJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiLi4vLi4vLi4vLi4vY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzXCIpKGZhbHNlKTtcbi8vIE1vZHVsZVxuZXhwb3J0cy5wdXNoKFttb2R1bGUuaWQsIFwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcXG4qIEFET0JFIENPTkZJREVOVElBTFxcbiogX19fX19fX19fX19fX19fX19fX1xcbipcXG4qIENvcHlyaWdodCAyMDE5IEFkb2JlXFxuKiBBbGwgUmlnaHRzIFJlc2VydmVkLlxcbipcXG4qIE5PVElDRTogQWxsIGluZm9ybWF0aW9uIGNvbnRhaW5lZCBoZXJlaW4gaXMsIGFuZCByZW1haW5zXFxuKiB0aGUgcHJvcGVydHkgb2YgQWRvYmUgYW5kIGl0cyBzdXBwbGllcnMsIGlmIGFueS4gVGhlIGludGVsbGVjdHVhbFxcbiogYW5kIHRlY2huaWNhbCBjb25jZXB0cyBjb250YWluZWQgaGVyZWluIGFyZSBwcm9wcmlldGFyeSB0byBBZG9iZVxcbiogYW5kIGl0cyBzdXBwbGllcnMgYW5kIGFyZSBwcm90ZWN0ZWQgYnkgYWxsIGFwcGxpY2FibGUgaW50ZWxsZWN0dWFsXFxuKiBwcm9wZXJ0eSBsYXdzLCBpbmNsdWRpbmcgdHJhZGUgc2VjcmV0IGFuZCBjb3B5cmlnaHQgbGF3cy5cXG4qIERpc3NlbWluYXRpb24gb2YgdGhpcyBpbmZvcm1hdGlvbiBvciByZXByb2R1Y3Rpb24gb2YgdGhpcyBtYXRlcmlhbFxcbiogaXMgc3RyaWN0bHkgZm9yYmlkZGVuIHVubGVzcyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gaXMgb2J0YWluZWRcXG4qIGZyb20gQWRvYmUuXFxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXFxuXFxuLnJlYWN0LXNwZWN0cnVtLXByb3ZpZGVyIHtcXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcXG59XFxuXFxuLnNwZWN0cnVtLS1vdmVycmlkZSB7XFxuICBmb250LWZhbWlseTogJ0Fkb2JlIENsZWFuJywgXFxcIlNvdXJjZSBTYW5zIFByb1xcXCIsIC1hcHBsZS1zeXN0ZW0sIEJsaW5rTWFjU3lzdGVtRm9udCwgXFxcIlNlZ29lIFVJXFxcIiwgUm9ib3RvLCBzYW5zLXNlcmlmICFpbXBvcnRhbnQ7XFxufVxcblxcbi5zcGVjdHJ1bS0tb3ZlcnJpZGU6bGFuZyh6aCksXFxuLnNwZWN0cnVtLS1vdmVycmlkZTpsYW5nKGtvKSxcXG4uc3BlY3RydW0tLW92ZXJyaWRlOmxhbmcoamEpIHtcXG4gIGZvbnQtZmFtaWx5OiAnQWRvYmUgQ2xlYW4gSGFuJywgLWFwcGxlLXN5c3RlbSwgQmxpbmtNYWNTeXN0ZW1Gb250LCBcXFwiU2Vnb2UgVUlcXFwiLCBSb2JvdG8sIHNhbnMtc2VyaWYgIWltcG9ydGFudDtcXG59XFxuXFxuLnJlYWN0LXNwZWN0cnVtLXV4cC1jc3NOZXh0LFxcbi5yZWFjdC1zcGVjdHJ1bS11eHAtY3NzTmV4dDpiZWZvcmUsXFxuLnJlYWN0LXNwZWN0cnVtLXV4cC1jc3NOZXh0OmFmdGVyIHtcXG4gIGJveC1zaGFkb3c6IG5vbmUgIWltcG9ydGFudDtcXG59XCIsIFwiXCJdKTtcblxuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///210\n')},function(module,exports,__webpack_require__){eval('exports = module.exports = __webpack_require__(6)(false);\n// Module\nexports.push([module.i, "\\n", ""]);\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjExLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhZG9iZS9zcGVjdHJ1bS1jc3MvZGlzdC9jb21wb25lbnRzL3BhZ2UvaW5kZXguY3NzP2M0NGIiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIi4uLy4uLy4uLy4uLy4uL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qc1wiKShmYWxzZSk7XG4vLyBNb2R1bGVcbmV4cG9ydHMucHVzaChbbW9kdWxlLmlkLCBcIlxcblwiLCBcIlwiXSk7XG5cbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///211\n')},function(module,exports,__webpack_require__){eval("var api = __webpack_require__(5);\n            var content = __webpack_require__(213);\n\n            content = content.__esModule ? content.default : content;\n\n            if (typeof content === 'string') {\n              content = [[module.i, content, '']];\n            }\n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = api(content, options);\n\n\n\nmodule.exports = content.locals || {};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjEyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhZG9iZS9zcGVjdHJ1bS1jc3MvZGlzdC9jb21wb25lbnRzL3BhZ2UvaW5kZXgtZGlmZi5jc3M/ZDc0YiJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgYXBpID0gcmVxdWlyZShcIiEuLi8uLi8uLi8uLi8uLi9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luamVjdFN0eWxlc0ludG9TdHlsZVRhZy5qc1wiKTtcbiAgICAgICAgICAgIHZhciBjb250ZW50ID0gcmVxdWlyZShcIiEhLi4vLi4vLi4vLi4vLi4vY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL2luZGV4LWRpZmYuY3NzXCIpO1xuXG4gICAgICAgICAgICBjb250ZW50ID0gY29udGVudC5fX2VzTW9kdWxlID8gY29udGVudC5kZWZhdWx0IDogY29udGVudDtcblxuICAgICAgICAgICAgaWYgKHR5cGVvZiBjb250ZW50ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICBjb250ZW50ID0gW1ttb2R1bGUuaWQsIGNvbnRlbnQsICcnXV07XG4gICAgICAgICAgICB9XG5cbnZhciBvcHRpb25zID0ge307XG5cbm9wdGlvbnMuaW5zZXJ0ID0gXCJoZWFkXCI7XG5vcHRpb25zLnNpbmdsZXRvbiA9IGZhbHNlO1xuXG52YXIgdXBkYXRlID0gYXBpKGNvbnRlbnQsIG9wdGlvbnMpO1xuXG5cblxubW9kdWxlLmV4cG9ydHMgPSBjb250ZW50LmxvY2FscyB8fCB7fTsiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///212\n")},function(module,exports,__webpack_require__){eval('exports = module.exports = __webpack_require__(6)(false);\n// Module\nexports.push([module.i, "\\n", ""]);\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjEzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhZG9iZS9zcGVjdHJ1bS1jc3MvZGlzdC9jb21wb25lbnRzL3BhZ2UvaW5kZXgtZGlmZi5jc3M/Yjc4ZCJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiLi4vLi4vLi4vLi4vLi4vY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzXCIpKGZhbHNlKTtcbi8vIE1vZHVsZVxuZXhwb3J0cy5wdXNoKFttb2R1bGUuaWQsIFwiXFxuXCIsIFwiXCJdKTtcblxuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///213\n')},function(module,exports,__webpack_require__){eval("var api = __webpack_require__(5);\n            var content = __webpack_require__(215);\n\n            content = content.__esModule ? content.default : content;\n\n            if (typeof content === 'string') {\n              content = [[module.i, content, '']];\n            }\n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = api(content, options);\n\n\n\nmodule.exports = content.locals || {};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjE0LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhZG9iZS9zcGVjdHJ1bS1jc3MvZGlzdC9jb21wb25lbnRzL3BhZ2UvaW5kZXgtbGcuY3NzPzFmMmQiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGFwaSA9IHJlcXVpcmUoXCIhLi4vLi4vLi4vLi4vLi4vc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanNcIik7XG4gICAgICAgICAgICB2YXIgY29udGVudCA9IHJlcXVpcmUoXCIhIS4uLy4uLy4uLy4uLy4uL2Nzcy1sb2FkZXIvZGlzdC9janMuanMhLi9pbmRleC1sZy5jc3NcIik7XG5cbiAgICAgICAgICAgIGNvbnRlbnQgPSBjb250ZW50Ll9fZXNNb2R1bGUgPyBjb250ZW50LmRlZmF1bHQgOiBjb250ZW50O1xuXG4gICAgICAgICAgICBpZiAodHlwZW9mIGNvbnRlbnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgIGNvbnRlbnQgPSBbW21vZHVsZS5pZCwgY29udGVudCwgJyddXTtcbiAgICAgICAgICAgIH1cblxudmFyIG9wdGlvbnMgPSB7fTtcblxub3B0aW9ucy5pbnNlcnQgPSBcImhlYWRcIjtcbm9wdGlvbnMuc2luZ2xldG9uID0gZmFsc2U7XG5cbnZhciB1cGRhdGUgPSBhcGkoY29udGVudCwgb3B0aW9ucyk7XG5cblxuXG5tb2R1bGUuZXhwb3J0cyA9IGNvbnRlbnQubG9jYWxzIHx8IHt9OyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///214\n")},function(module,exports,__webpack_require__){eval('exports = module.exports = __webpack_require__(6)(false);\n// Module\nexports.push([module.i, "\\n", ""]);\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjE1LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhZG9iZS9zcGVjdHJ1bS1jc3MvZGlzdC9jb21wb25lbnRzL3BhZ2UvaW5kZXgtbGcuY3NzP2VjOGEiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIi4uLy4uLy4uLy4uLy4uL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qc1wiKShmYWxzZSk7XG4vLyBNb2R1bGVcbmV4cG9ydHMucHVzaChbbW9kdWxlLmlkLCBcIlxcblwiLCBcIlwiXSk7XG5cbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///215\n')},function(module,exports,__webpack_require__){eval("var api = __webpack_require__(5);\n            var content = __webpack_require__(217);\n\n            content = content.__esModule ? content.default : content;\n\n            if (typeof content === 'string') {\n              content = [[module.i, content, '']];\n            }\n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = api(content, options);\n\n\n\nmodule.exports = content.locals || {};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjE2LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhZG9iZS9zcGVjdHJ1bS1jc3MvZGlzdC9jb21wb25lbnRzL3BhZ2UvbXVsdGlTdG9wcy9saWdodC5jc3M/ZjBjNiJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgYXBpID0gcmVxdWlyZShcIiEuLi8uLi8uLi8uLi8uLi8uLi9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luamVjdFN0eWxlc0ludG9TdHlsZVRhZy5qc1wiKTtcbiAgICAgICAgICAgIHZhciBjb250ZW50ID0gcmVxdWlyZShcIiEhLi4vLi4vLi4vLi4vLi4vLi4vY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL2xpZ2h0LmNzc1wiKTtcblxuICAgICAgICAgICAgY29udGVudCA9IGNvbnRlbnQuX19lc01vZHVsZSA/IGNvbnRlbnQuZGVmYXVsdCA6IGNvbnRlbnQ7XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgY29udGVudCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgY29udGVudCA9IFtbbW9kdWxlLmlkLCBjb250ZW50LCAnJ11dO1xuICAgICAgICAgICAgfVxuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLmluc2VydCA9IFwiaGVhZFwiO1xub3B0aW9ucy5zaW5nbGV0b24gPSBmYWxzZTtcblxudmFyIHVwZGF0ZSA9IGFwaShjb250ZW50LCBvcHRpb25zKTtcblxuXG5cbm1vZHVsZS5leHBvcnRzID0gY29udGVudC5sb2NhbHMgfHwge307Il0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///216\n")},function(module,exports,__webpack_require__){eval('exports = module.exports = __webpack_require__(6)(false);\n// Module\nexports.push([module.i, ".spectrum--light  {\\n  background-color: rgb(245, 245, 245);\\n  -webkit-tap-highlight-color: rgba(0,0,0,0);\\n}\\n", ""]);\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjE3LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhZG9iZS9zcGVjdHJ1bS1jc3MvZGlzdC9jb21wb25lbnRzL3BhZ2UvbXVsdGlTdG9wcy9saWdodC5jc3M/NzZkZSJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiLi4vLi4vLi4vLi4vLi4vLi4vY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzXCIpKGZhbHNlKTtcbi8vIE1vZHVsZVxuZXhwb3J0cy5wdXNoKFttb2R1bGUuaWQsIFwiLnNwZWN0cnVtLS1saWdodCAge1xcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDI0NSwgMjQ1LCAyNDUpO1xcbiAgLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOiByZ2JhKDAsMCwwLDApO1xcbn1cXG5cIiwgXCJcIl0pO1xuXG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///217\n')},function(module,exports,__webpack_require__){eval("var api = __webpack_require__(5);\n            var content = __webpack_require__(219);\n\n            content = content.__esModule ? content.default : content;\n\n            if (typeof content === 'string') {\n              content = [[module.i, content, '']];\n            }\n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = api(content, options);\n\n\n\nmodule.exports = content.locals || {};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjE4LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhZG9iZS9zcGVjdHJ1bS1jc3MvZGlzdC9jb21wb25lbnRzL3BhZ2UvbXVsdGlTdG9wcy9kYXJrLmNzcz8zMmM3Il0sInNvdXJjZXNDb250ZW50IjpbInZhciBhcGkgPSByZXF1aXJlKFwiIS4uLy4uLy4uLy4uLy4uLy4uL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzXCIpO1xuICAgICAgICAgICAgdmFyIGNvbnRlbnQgPSByZXF1aXJlKFwiISEuLi8uLi8uLi8uLi8uLi8uLi9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vZGFyay5jc3NcIik7XG5cbiAgICAgICAgICAgIGNvbnRlbnQgPSBjb250ZW50Ll9fZXNNb2R1bGUgPyBjb250ZW50LmRlZmF1bHQgOiBjb250ZW50O1xuXG4gICAgICAgICAgICBpZiAodHlwZW9mIGNvbnRlbnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgIGNvbnRlbnQgPSBbW21vZHVsZS5pZCwgY29udGVudCwgJyddXTtcbiAgICAgICAgICAgIH1cblxudmFyIG9wdGlvbnMgPSB7fTtcblxub3B0aW9ucy5pbnNlcnQgPSBcImhlYWRcIjtcbm9wdGlvbnMuc2luZ2xldG9uID0gZmFsc2U7XG5cbnZhciB1cGRhdGUgPSBhcGkoY29udGVudCwgb3B0aW9ucyk7XG5cblxuXG5tb2R1bGUuZXhwb3J0cyA9IGNvbnRlbnQubG9jYWxzIHx8IHt9OyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///218\n")},function(module,exports,__webpack_require__){eval('exports = module.exports = __webpack_require__(6)(false);\n// Module\nexports.push([module.i, ".spectrum--dark  {\\n  background-color: rgb(50, 50, 50);\\n  -webkit-tap-highlight-color: rgba(0,0,0,0);\\n}\\n", ""]);\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjE5LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhZG9iZS9zcGVjdHJ1bS1jc3MvZGlzdC9jb21wb25lbnRzL3BhZ2UvbXVsdGlTdG9wcy9kYXJrLmNzcz9kNDQyIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCIuLi8uLi8uLi8uLi8uLi8uLi9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIikoZmFsc2UpO1xuLy8gTW9kdWxlXG5leHBvcnRzLnB1c2goW21vZHVsZS5pZCwgXCIuc3BlY3RydW0tLWRhcmsgIHtcXG4gIGJhY2tncm91bmQtY29sb3I6IHJnYig1MCwgNTAsIDUwKTtcXG4gIC13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjogcmdiYSgwLDAsMCwwKTtcXG59XFxuXCIsIFwiXCJdKTtcblxuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///219\n')},function(module,exports,__webpack_require__){eval("var api = __webpack_require__(5);\n            var content = __webpack_require__(221);\n\n            content = content.__esModule ? content.default : content;\n\n            if (typeof content === 'string') {\n              content = [[module.i, content, '']];\n            }\n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = api(content, options);\n\n\n\nmodule.exports = content.locals || {};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjIwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhZG9iZS9zcGVjdHJ1bS1jc3MvZGlzdC9jb21wb25lbnRzL3BhZ2UvbXVsdGlTdG9wcy9saWdodGVzdC5jc3M/OTMyMiJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgYXBpID0gcmVxdWlyZShcIiEuLi8uLi8uLi8uLi8uLi8uLi9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luamVjdFN0eWxlc0ludG9TdHlsZVRhZy5qc1wiKTtcbiAgICAgICAgICAgIHZhciBjb250ZW50ID0gcmVxdWlyZShcIiEhLi4vLi4vLi4vLi4vLi4vLi4vY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL2xpZ2h0ZXN0LmNzc1wiKTtcblxuICAgICAgICAgICAgY29udGVudCA9IGNvbnRlbnQuX19lc01vZHVsZSA/IGNvbnRlbnQuZGVmYXVsdCA6IGNvbnRlbnQ7XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgY29udGVudCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgY29udGVudCA9IFtbbW9kdWxlLmlkLCBjb250ZW50LCAnJ11dO1xuICAgICAgICAgICAgfVxuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLmluc2VydCA9IFwiaGVhZFwiO1xub3B0aW9ucy5zaW5nbGV0b24gPSBmYWxzZTtcblxudmFyIHVwZGF0ZSA9IGFwaShjb250ZW50LCBvcHRpb25zKTtcblxuXG5cbm1vZHVsZS5leHBvcnRzID0gY29udGVudC5sb2NhbHMgfHwge307Il0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///220\n")},function(module,exports,__webpack_require__){eval('exports = module.exports = __webpack_require__(6)(false);\n// Module\nexports.push([module.i, ".spectrum--lightest  {\\n  background-color: rgb(255, 255, 255);\\n  -webkit-tap-highlight-color: rgba(0,0,0,0);\\n}\\n", ""]);\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjIxLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhZG9iZS9zcGVjdHJ1bS1jc3MvZGlzdC9jb21wb25lbnRzL3BhZ2UvbXVsdGlTdG9wcy9saWdodGVzdC5jc3M/Nzk0ZSJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiLi4vLi4vLi4vLi4vLi4vLi4vY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzXCIpKGZhbHNlKTtcbi8vIE1vZHVsZVxuZXhwb3J0cy5wdXNoKFttb2R1bGUuaWQsIFwiLnNwZWN0cnVtLS1saWdodGVzdCAge1xcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDI1NSwgMjU1LCAyNTUpO1xcbiAgLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOiByZ2JhKDAsMCwwLDApO1xcbn1cXG5cIiwgXCJcIl0pO1xuXG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///221\n')},function(module,exports,__webpack_require__){eval("var api = __webpack_require__(5);\n            var content = __webpack_require__(223);\n\n            content = content.__esModule ? content.default : content;\n\n            if (typeof content === 'string') {\n              content = [[module.i, content, '']];\n            }\n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = api(content, options);\n\n\n\nmodule.exports = content.locals || {};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjIyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhZG9iZS9zcGVjdHJ1bS1jc3MvZGlzdC9jb21wb25lbnRzL3BhZ2UvbXVsdGlTdG9wcy9kYXJrZXN0LmNzcz9jMjVhIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBhcGkgPSByZXF1aXJlKFwiIS4uLy4uLy4uLy4uLy4uLy4uL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzXCIpO1xuICAgICAgICAgICAgdmFyIGNvbnRlbnQgPSByZXF1aXJlKFwiISEuLi8uLi8uLi8uLi8uLi8uLi9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzIS4vZGFya2VzdC5jc3NcIik7XG5cbiAgICAgICAgICAgIGNvbnRlbnQgPSBjb250ZW50Ll9fZXNNb2R1bGUgPyBjb250ZW50LmRlZmF1bHQgOiBjb250ZW50O1xuXG4gICAgICAgICAgICBpZiAodHlwZW9mIGNvbnRlbnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgIGNvbnRlbnQgPSBbW21vZHVsZS5pZCwgY29udGVudCwgJyddXTtcbiAgICAgICAgICAgIH1cblxudmFyIG9wdGlvbnMgPSB7fTtcblxub3B0aW9ucy5pbnNlcnQgPSBcImhlYWRcIjtcbm9wdGlvbnMuc2luZ2xldG9uID0gZmFsc2U7XG5cbnZhciB1cGRhdGUgPSBhcGkoY29udGVudCwgb3B0aW9ucyk7XG5cblxuXG5tb2R1bGUuZXhwb3J0cyA9IGNvbnRlbnQubG9jYWxzIHx8IHt9OyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///222\n")},function(module,exports,__webpack_require__){eval('exports = module.exports = __webpack_require__(6)(false);\n// Module\nexports.push([module.i, ".spectrum--darkest  {\\n  background-color: rgb(30, 30, 30);\\n  -webkit-tap-highlight-color: rgba(0,0,0,0);\\n}\\n", ""]);\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjIzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0BhZG9iZS9zcGVjdHJ1bS1jc3MvZGlzdC9jb21wb25lbnRzL3BhZ2UvbXVsdGlTdG9wcy9kYXJrZXN0LmNzcz8yZDgxIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCIuLi8uLi8uLi8uLi8uLi8uLi9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIikoZmFsc2UpO1xuLy8gTW9kdWxlXG5leHBvcnRzLnB1c2goW21vZHVsZS5pZCwgXCIuc3BlY3RydW0tLWRhcmtlc3QgIHtcXG4gIGJhY2tncm91bmQtY29sb3I6IHJnYigzMCwgMzAsIDMwKTtcXG4gIC13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjogcmdiYSgwLDAsMCwwKTtcXG59XFxuXCIsIFwiXCJdKTtcblxuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///223\n')},function(module,exports,__webpack_require__){eval('exports = module.exports = __webpack_require__(6)(false);\n// Module\nexports.push([module.i, "/* generated from dna-version: 5.0.1 */\\n/* generated from dna-version: 5.0.1 */\\n.spectrum {\\n  font-family: adobe-clean, \\"Source Sans Pro\\", -apple-system, BlinkMacSystemFont, \\"Segoe UI\\", Roboto, sans-serif;\\n  font-size: 14px;\\n}\\n.spectrum:lang(zh-Hans) {\\n    font-family: adobe-clean-han-japanese, -apple-system, BlinkMacSystemFont, \\"Segoe UI\\", Roboto, sans-serif;\\n  }\\n.spectrum:lang(zh) {\\n    font-family: adobe-clean-han-japanese, -apple-system, BlinkMacSystemFont, \\"Segoe UI\\", Roboto, sans-serif;\\n  }\\n.spectrum:lang(ko) {\\n    font-family: adobe-clean-han-japanese, -apple-system, BlinkMacSystemFont, \\"Segoe UI\\", Roboto, sans-serif;\\n  }\\n.spectrum:lang(ja) {\\n    font-family: adobe-clean-han-japanese, -apple-system, BlinkMacSystemFont, \\"Segoe UI\\", Roboto, sans-serif;\\n  }\\n.spectrum-Body1 {\\n          font-size: 20px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          margin-bottom: 16px;\\n          margin-top: 8px;\\n        }\\n.spectrum-Body1 em {\\n              font-size: 20px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: italic;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Body1 strong {\\n              font-size: 20px;\\n  font-weight: 700;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Body2,\\n.spectrum-Body--large {\\n          font-size: 18px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          margin-bottom: 16px;\\n          margin-top: 8px;\\n        }\\n.spectrum-Body2 em,\\n.spectrum-Body--large em {\\n              font-size: 18px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: italic;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Body2 strong,\\n.spectrum-Body--large strong {\\n              font-size: 18px;\\n  font-weight: 700;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Body3 {\\n          font-size: 16px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          margin-bottom: 16px;\\n          margin-top: 8px;\\n        }\\n.spectrum-Body3 em {\\n              font-size: 16px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: italic;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Body3 strong {\\n              font-size: 16px;\\n  font-weight: 700;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Body4,\\n.spectrum-Body--secondary {\\n          font-size: 14px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          margin-bottom: 16px;\\n          margin-top: 8px;\\n        }\\n.spectrum-Body4 em,\\n.spectrum-Body--secondary em {\\n              font-size: 14px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: italic;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Body4 strong,\\n.spectrum-Body--secondary strong {\\n              font-size: 14px;\\n  font-weight: 700;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Body5,\\n.spectrum-Body--small {\\n          font-size: 12px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          margin-bottom: 16px;\\n          margin-top: 8px;\\n        }\\n.spectrum-Body5 em,\\n.spectrum-Body--small em {\\n              font-size: 12px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: italic;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Body5 strong,\\n.spectrum-Body--small strong {\\n              font-size: 12px;\\n  font-weight: 700;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Heading1 {\\n          font-size: 36px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          margin-bottom: 8px;\\n          margin-top: 8px;\\n        }\\n.spectrum-Heading1 em {\\n              font-size: 36px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: italic;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Heading1 strong {\\n              font-size: 36px;\\n  font-weight: 900;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Heading2 {\\n          font-size: 28px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          margin-bottom: 8px;\\n          margin-top: 8px;\\n        }\\n.spectrum-Heading2 em {\\n              font-size: 28px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: italic;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Heading2 strong {\\n              font-size: 28px;\\n  font-weight: 900;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Heading3 {\\n          font-size: 22px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          margin-bottom: 8px;\\n          margin-top: 8px;\\n        }\\n.spectrum-Heading3 em {\\n              font-size: 22px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: italic;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Heading3 strong {\\n              font-size: 22px;\\n  font-weight: 900;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Heading4,\\n.spectrum-Heading--subtitle1 {\\n          font-size: 18px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          margin-bottom: 8px;\\n          margin-top: 8px;\\n        }\\n.spectrum-Heading4 em,\\n.spectrum-Heading--subtitle1 em {\\n              font-size: 18px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: italic;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Heading4 strong,\\n.spectrum-Heading--subtitle1 strong {\\n              font-size: 18px;\\n  font-weight: 900;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Heading5 {\\n          font-size: 16px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          margin-bottom: 8px;\\n          margin-top: 8px;\\n        }\\n.spectrum-Heading5 em {\\n              font-size: 16px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: italic;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Heading5 strong {\\n              font-size: 16px;\\n  font-weight: 900;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Heading6,\\n.spectrum-Heading--subtitle2 {\\n          font-size: 14px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          margin-bottom: 8px;\\n          margin-top: 8px;\\n        }\\n.spectrum-Heading6 em,\\n.spectrum-Heading--subtitle2 em {\\n              font-size: 14px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: italic;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Heading6 strong,\\n.spectrum-Heading--subtitle2 strong {\\n              font-size: 14px;\\n  font-weight: 900;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Subheading,\\n.spectrum-Heading--subtitle3 {\\n          font-size: 11px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0.06em;\\n  text-transform: uppercase;\\n\\n          margin-bottom: 8px;\\n          margin-top: 8px;\\n        }\\n.spectrum-Subheading em,\\n.spectrum-Heading--subtitle3 em {\\n              font-size: 11px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: italic;\\n  letter-spacing: 0.06em;\\n  text-transform: uppercase;\\n\\n          }\\n.spectrum-Subheading strong,\\n.spectrum-Heading--subtitle3 strong {\\n              font-size: 11px;\\n  font-weight: 900;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0.06em;\\n  text-transform: uppercase;\\n\\n          }\\n.spectrum-Detail {\\n          font-size: 11px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.06em;\\n  text-transform: uppercase;\\n\\n          margin-bottom: 16px;\\n          margin-top: 8px;\\n        }\\n.spectrum-Detail em {\\n              font-size: 11px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: italic;\\n  letter-spacing: 0.06em;\\n  text-transform: uppercase;\\n\\n          }\\n.spectrum-Detail strong {\\n              font-size: 11px;\\n  font-weight: 700;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.06em;\\n  text-transform: uppercase;\\n\\n          }\\n.spectrum-Heading1--quiet {\\n          font-size: 36px;\\n  font-weight: 300;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          margin-bottom: 8px;\\n          margin-top: 8px;\\n        }\\n.spectrum-Heading1--quiet em {\\n              font-size: 36px;\\n  font-weight: 300;\\n  line-height: 1.3;\\n  font-style: italic;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Heading1--quiet strong {\\n              font-size: 36px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Heading2--quiet,\\n.spectrum-Heading--pageTitle {\\n          font-size: 28px;\\n  font-weight: 300;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          margin-bottom: 8px;\\n          margin-top: 8px;\\n        }\\n.spectrum-Heading2--quiet em,\\n.spectrum-Heading--pageTitle em {\\n              font-size: 28px;\\n  font-weight: 300;\\n  line-height: 1.3;\\n  font-style: italic;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Heading2--quiet strong,\\n.spectrum-Heading--pageTitle strong {\\n              font-size: 28px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Heading1--strong {\\n          font-size: 36px;\\n  font-weight: 900;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          margin-bottom: 8px;\\n          margin-top: 8px;\\n        }\\n.spectrum-Heading1--strong em {\\n              font-size: 36px;\\n  font-weight: 900;\\n  line-height: 1.3;\\n  font-style: italic;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Heading1--strong strong {\\n              font-size: 36px;\\n  font-weight: 900;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Heading2--strong {\\n          font-size: 28px;\\n  font-weight: 900;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          margin-bottom: 8px;\\n          margin-top: 8px;\\n        }\\n.spectrum-Heading2--strong em {\\n              font-size: 28px;\\n  font-weight: 900;\\n  line-height: 1.3;\\n  font-style: italic;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Heading2--strong strong {\\n              font-size: 28px;\\n  font-weight: 900;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Heading1--display {\\n          font-size: 45px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          margin-bottom: 8px;\\n          margin-top: 8px;\\n        }\\n.spectrum-Heading1--display em {\\n              font-size: 45px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: italic;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Heading1--display strong {\\n              font-size: 45px;\\n  font-weight: 900;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Heading2--display {\\n          font-size: 40px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          margin-bottom: 8px;\\n          margin-top: 8px;\\n        }\\n.spectrum-Heading2--display em {\\n              font-size: 40px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: italic;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Heading2--display strong {\\n              font-size: 40px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Heading1--display.spectrum-Heading1--strong {\\n          font-size: 45px;\\n  font-weight: 900;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          margin-bottom: 8px;\\n          margin-top: 8px;\\n        }\\n.spectrum-Heading1--display.spectrum-Heading1--strong em {\\n              font-size: 45px;\\n  font-weight: 900;\\n  line-height: 1.3;\\n  font-style: italic;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Heading1--display.spectrum-Heading1--strong strong {\\n              font-size: 45px;\\n  font-weight: 900;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Heading2--display.spectrum-Heading2--strong {\\n          font-size: 40px;\\n  font-weight: 900;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          margin-bottom: 8px;\\n          margin-top: 8px;\\n        }\\n.spectrum-Heading2--display.spectrum-Heading2--strong em {\\n              font-size: 40px;\\n  font-weight: 900;\\n  line-height: 1.3;\\n  font-style: italic;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Heading2--display.spectrum-Heading2--strong strong {\\n              font-size: 40px;\\n  font-weight: 900;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Heading1--display.spectrum-Heading1--quiet {\\n          font-size: 45px;\\n  font-weight: 300;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          margin-bottom: 8px;\\n          margin-top: 8px;\\n        }\\n.spectrum-Heading1--display.spectrum-Heading1--quiet em {\\n              font-size: 45px;\\n  font-weight: 300;\\n  line-height: 1.3;\\n  font-style: italic;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Heading1--display.spectrum-Heading1--quiet strong {\\n              font-size: 45px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Heading2--display.spectrum-Heading2--quiet,\\n.spectrum-Heading--display {\\n          font-size: 40px;\\n  font-weight: 300;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          margin-bottom: 8px;\\n          margin-top: 8px;\\n        }\\n.spectrum-Heading2--display.spectrum-Heading2--quiet em,\\n.spectrum-Heading--display em {\\n              font-size: 40px;\\n  font-weight: 300;\\n  line-height: 1.3;\\n  font-style: italic;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Heading2--display.spectrum-Heading2--quiet strong,\\n.spectrum-Heading--display strong {\\n              font-size: 40px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Article {\\n  font-family: Adobe Clean Serif, Times New Roman, serif;\\n}\\n.spectrum-Article .spectrum-Body1 {\\n          font-size: 20px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          margin-bottom: 16px;\\n          margin-top: 8px;\\n        }\\n.spectrum-Article .spectrum-Body1 em {\\n              font-size: 20px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: italic;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Article .spectrum-Body1 strong {\\n              font-size: 20px;\\n  font-weight: 900;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Article .spectrum-Body2,\\n.spectrum-Article .spectrum-Body--large {\\n          font-size: 18px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          margin-bottom: 16px;\\n          margin-top: 8px;\\n        }\\n.spectrum-Article .spectrum-Body2 em,\\n.spectrum-Article .spectrum-Body--large em {\\n              font-size: 18px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: italic;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Article .spectrum-Body2 strong,\\n.spectrum-Article .spectrum-Body--large strong {\\n              font-size: 18px;\\n  font-weight: 900;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Article .spectrum-Body3 {\\n          font-size: 16px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          margin-bottom: 16px;\\n          margin-top: 8px;\\n        }\\n.spectrum-Article .spectrum-Body3 em {\\n              font-size: 16px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: italic;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Article .spectrum-Body3 strong {\\n              font-size: 16px;\\n  font-weight: 900;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Article .spectrum-Body4,\\n.spectrum-Article .spectrum-Body--secondary {\\n          font-size: 14px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          margin-bottom: 16px;\\n          margin-top: 8px;\\n        }\\n.spectrum-Article .spectrum-Body4 em,\\n.spectrum-Article .spectrum-Body--secondary em {\\n              font-size: 14px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: italic;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Article .spectrum-Body4 strong,\\n.spectrum-Article .spectrum-Body--secondary strong {\\n              font-size: 14px;\\n  font-weight: 900;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Article .spectrum-Body5,\\n.spectrum-Article .spectrum-Body--small {\\n          font-size: 12px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          margin-bottom: 16px;\\n          margin-top: 8px;\\n        }\\n.spectrum-Article .spectrum-Body5 em,\\n.spectrum-Article .spectrum-Body--small em {\\n              font-size: 12px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: italic;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Article .spectrum-Body5 strong,\\n.spectrum-Article .spectrum-Body--small strong {\\n              font-size: 12px;\\n  font-weight: 900;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Article .spectrum-Heading1 {\\n          font-size: 36px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          margin-bottom: 8px;\\n          margin-top: 8px;\\n        }\\n.spectrum-Article .spectrum-Heading1 em {\\n              font-size: 36px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: italic;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Article .spectrum-Heading1 strong {\\n              font-size: 36px;\\n  font-weight: 900;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Article .spectrum-Heading2 {\\n          font-size: 28px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          margin-bottom: 8px;\\n          margin-top: 8px;\\n        }\\n.spectrum-Article .spectrum-Heading2 em {\\n              font-size: 28px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: italic;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Article .spectrum-Heading2 strong {\\n              font-size: 28px;\\n  font-weight: 900;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Article .spectrum-Heading3 {\\n          font-size: 22px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          margin-bottom: 8px;\\n          margin-top: 8px;\\n        }\\n.spectrum-Article .spectrum-Heading3 em {\\n              font-size: 22px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: italic;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Article .spectrum-Heading3 strong {\\n              font-size: 22px;\\n  font-weight: 900;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Article .spectrum-Heading4,\\n.spectrum-Article .spectrum-Heading--subtitle1 {\\n          font-size: 18px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          margin-bottom: 8px;\\n          margin-top: 8px;\\n        }\\n.spectrum-Article .spectrum-Heading4 em,\\n.spectrum-Article .spectrum-Heading--subtitle1 em {\\n              font-size: 18px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: italic;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Article .spectrum-Heading4 strong,\\n.spectrum-Article .spectrum-Heading--subtitle1 strong {\\n              font-size: 18px;\\n  font-weight: 900;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Article .spectrum-Heading5 {\\n          font-size: 16px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          margin-bottom: 8px;\\n          margin-top: 8px;\\n        }\\n.spectrum-Article .spectrum-Heading5 em {\\n              font-size: 16px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: italic;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Article .spectrum-Heading5 strong {\\n              font-size: 16px;\\n  font-weight: 900;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Article .spectrum-Heading6,\\n.spectrum-Article .spectrum-Heading--subtitle2 {\\n          font-size: 14px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          margin-bottom: 8px;\\n          margin-top: 8px;\\n        }\\n.spectrum-Article .spectrum-Heading6 em,\\n.spectrum-Article .spectrum-Heading--subtitle2 em {\\n              font-size: 14px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: italic;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Article .spectrum-Heading6 strong,\\n.spectrum-Article .spectrum-Heading--subtitle2 strong {\\n              font-size: 14px;\\n  font-weight: 900;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Article .spectrum-Subheading,\\n.spectrum-Article .spectrum-Heading--subtitle3 {\\n          font-size: 11px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0.06em;\\n  text-transform: uppercase;\\n\\n          margin-bottom: 8px;\\n          margin-top: 8px;\\n        }\\n.spectrum-Article .spectrum-Subheading em,\\n.spectrum-Article .spectrum-Heading--subtitle3 em {\\n              font-size: 11px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: italic;\\n  letter-spacing: 0.06em;\\n  text-transform: uppercase;\\n\\n          }\\n.spectrum-Article .spectrum-Subheading strong,\\n.spectrum-Article .spectrum-Heading--subtitle3 strong {\\n              font-size: 11px;\\n  font-weight: 900;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0.06em;\\n  text-transform: uppercase;\\n\\n          }\\n.spectrum-Article .spectrum-Detail {\\n          font-size: 11px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.06em;\\n  text-transform: uppercase;\\n\\n          margin-bottom: 16px;\\n          margin-top: 8px;\\n        }\\n.spectrum-Article .spectrum-Detail em {\\n              font-size: 11px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: italic;\\n  letter-spacing: 0.06em;\\n  text-transform: uppercase;\\n\\n          }\\n.spectrum-Article .spectrum-Detail strong {\\n              font-size: 11px;\\n  font-weight: 700;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.06em;\\n  text-transform: uppercase;\\n\\n          }\\n.spectrum-Article .spectrum-Heading1--quiet {\\n          font-size: 36px;\\n  font-weight: 400;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          margin-bottom: 8px;\\n          margin-top: 8px;\\n        }\\n.spectrum-Article .spectrum-Heading1--quiet em {\\n              font-size: 36px;\\n  font-weight: 400;\\n  line-height: 1.3;\\n  font-style: italic;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Article .spectrum-Heading1--quiet strong {\\n              font-size: 36px;\\n  font-weight: 900;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Article .spectrum-Heading2--quiet,\\n.spectrum-Article .spectrum-Heading--pageTitle {\\n          font-size: 28px;\\n  font-weight: 400;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          margin-bottom: 8px;\\n          margin-top: 8px;\\n        }\\n.spectrum-Article .spectrum-Heading2--quiet em,\\n.spectrum-Article .spectrum-Heading--pageTitle em {\\n              font-size: 28px;\\n  font-weight: 400;\\n  line-height: 1.3;\\n  font-style: italic;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Article .spectrum-Heading2--quiet strong,\\n.spectrum-Article .spectrum-Heading--pageTitle strong {\\n              font-size: 28px;\\n  font-weight: 900;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Article .spectrum-Heading1--display {\\n          font-size: 45px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          margin-bottom: 8px;\\n          margin-top: 8px;\\n        }\\n.spectrum-Article .spectrum-Heading1--display em {\\n              font-size: 45px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: italic;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Article .spectrum-Heading1--display strong {\\n              font-size: 45px;\\n  font-weight: 900;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Article .spectrum-Heading2--display {\\n          font-size: 40px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          margin-bottom: 8px;\\n          margin-top: 8px;\\n        }\\n.spectrum-Article .spectrum-Heading2--display em {\\n              font-size: 40px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: italic;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Article .spectrum-Heading2--display strong {\\n              font-size: 40px;\\n  font-weight: 900;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Article .spectrum-Heading1--display.spectrum-Heading1--quiet {\\n          font-size: 45px;\\n  font-weight: 400;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          margin-bottom: 8px;\\n          margin-top: 8px;\\n        }\\n.spectrum-Article .spectrum-Heading1--display.spectrum-Heading1--quiet em {\\n              font-size: 45px;\\n  font-weight: 400;\\n  line-height: 1.3;\\n  font-style: italic;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Article .spectrum-Heading1--display.spectrum-Heading1--quiet strong {\\n              font-size: 45px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Article .spectrum-Heading2--display.spectrum-Heading2--quiet,\\n.spectrum-Article .spectrum-Heading--display {\\n          font-size: 40px;\\n  font-weight: 400;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          margin-bottom: 8px;\\n          margin-top: 8px;\\n        }\\n.spectrum-Article .spectrum-Heading2--display.spectrum-Heading2--quiet em,\\n.spectrum-Article .spectrum-Heading--display em {\\n              font-size: 40px;\\n  font-weight: 400;\\n  line-height: 1.3;\\n  font-style: italic;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Article .spectrum-Heading2--display.spectrum-Heading2--quiet strong,\\n.spectrum-Article .spectrum-Heading--display strong {\\n              font-size: 40px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          }\\n.spectrum:lang(ja) .spectrum-Body1, .spectrum:lang(ko) .spectrum-Body1, .spectrum:lang(zh) .spectrum-Body1 {\\n          font-size: 20px;\\n  font-weight: 400;\\n  line-height: 1.7;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          margin-bottom: 16px;\\n          margin-top: 8px;\\n        }\\n.spectrum:lang(ja) .spectrum-Body1 em, .spectrum:lang(ko) .spectrum-Body1 em, .spectrum:lang(zh) .spectrum-Body1 em {\\n              font-size: 20px;\\n  font-weight: 700;\\n  line-height: 1.7;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum:lang(ja) .spectrum-Body1 strong, .spectrum:lang(ko) .spectrum-Body1 strong, .spectrum:lang(zh) .spectrum-Body1 strong {\\n              font-size: 20px;\\n  font-weight: 900;\\n  line-height: 1.7;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum:lang(ja) .spectrum-Body2,\\n.spectrum:lang(ko) .spectrum-Body2,\\n.spectrum:lang(zh) .spectrum-Body2,\\n.spectrum:lang(ja) .spectrum-Body--large,\\n.spectrum:lang(ko) .spectrum-Body--large,\\n.spectrum:lang(zh) .spectrum-Body--large {\\n          font-size: 18px;\\n  font-weight: 400;\\n  line-height: 1.7;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          margin-bottom: 16px;\\n          margin-top: 8px;\\n        }\\n.spectrum:lang(ja) .spectrum-Body2 em,\\n.spectrum:lang(ko) .spectrum-Body2 em,\\n.spectrum:lang(zh) .spectrum-Body2 em,\\n.spectrum:lang(ja) .spectrum-Body--large em,\\n.spectrum:lang(ko) .spectrum-Body--large em,\\n.spectrum:lang(zh) .spectrum-Body--large em {\\n              font-size: 18px;\\n  font-weight: 700;\\n  line-height: 1.7;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum:lang(ja) .spectrum-Body2 strong,\\n.spectrum:lang(ko) .spectrum-Body2 strong,\\n.spectrum:lang(zh) .spectrum-Body2 strong,\\n.spectrum:lang(ja) .spectrum-Body--large strong,\\n.spectrum:lang(ko) .spectrum-Body--large strong,\\n.spectrum:lang(zh) .spectrum-Body--large strong {\\n              font-size: 18px;\\n  font-weight: 900;\\n  line-height: 1.7;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum:lang(ja) .spectrum-Body3, .spectrum:lang(ko) .spectrum-Body3, .spectrum:lang(zh) .spectrum-Body3 {\\n          font-size: 16px;\\n  font-weight: 400;\\n  line-height: 1.7;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          margin-bottom: 16px;\\n          margin-top: 8px;\\n        }\\n.spectrum:lang(ja) .spectrum-Body3 em, .spectrum:lang(ko) .spectrum-Body3 em, .spectrum:lang(zh) .spectrum-Body3 em {\\n              font-size: 16px;\\n  font-weight: 700;\\n  line-height: 1.7;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum:lang(ja) .spectrum-Body3 strong, .spectrum:lang(ko) .spectrum-Body3 strong, .spectrum:lang(zh) .spectrum-Body3 strong {\\n              font-size: 16px;\\n  font-weight: 900;\\n  line-height: 1.7;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum:lang(ja) .spectrum-Body4,\\n.spectrum:lang(ko) .spectrum-Body4,\\n.spectrum:lang(zh) .spectrum-Body4,\\n.spectrum:lang(ja) .spectrum-Body--secondary,\\n.spectrum:lang(ko) .spectrum-Body--secondary,\\n.spectrum:lang(zh) .spectrum-Body--secondary {\\n          font-size: 14px;\\n  font-weight: 400;\\n  line-height: 1.7;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          margin-bottom: 16px;\\n          margin-top: 8px;\\n        }\\n.spectrum:lang(ja) .spectrum-Body4 em,\\n.spectrum:lang(ko) .spectrum-Body4 em,\\n.spectrum:lang(zh) .spectrum-Body4 em,\\n.spectrum:lang(ja) .spectrum-Body--secondary em,\\n.spectrum:lang(ko) .spectrum-Body--secondary em,\\n.spectrum:lang(zh) .spectrum-Body--secondary em {\\n              font-size: 14px;\\n  font-weight: 700;\\n  line-height: 1.7;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum:lang(ja) .spectrum-Body4 strong,\\n.spectrum:lang(ko) .spectrum-Body4 strong,\\n.spectrum:lang(zh) .spectrum-Body4 strong,\\n.spectrum:lang(ja) .spectrum-Body--secondary strong,\\n.spectrum:lang(ko) .spectrum-Body--secondary strong,\\n.spectrum:lang(zh) .spectrum-Body--secondary strong {\\n              font-size: 14px;\\n  font-weight: 900;\\n  line-height: 1.7;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum:lang(ja) .spectrum-Body5,\\n.spectrum:lang(ko) .spectrum-Body5,\\n.spectrum:lang(zh) .spectrum-Body5,\\n.spectrum:lang(ja) .spectrum-Body--small,\\n.spectrum:lang(ko) .spectrum-Body--small,\\n.spectrum:lang(zh) .spectrum-Body--small {\\n          font-size: 12px;\\n  font-weight: 400;\\n  line-height: 1.7;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          margin-bottom: 16px;\\n          margin-top: 8px;\\n        }\\n.spectrum:lang(ja) .spectrum-Body5 em,\\n.spectrum:lang(ko) .spectrum-Body5 em,\\n.spectrum:lang(zh) .spectrum-Body5 em,\\n.spectrum:lang(ja) .spectrum-Body--small em,\\n.spectrum:lang(ko) .spectrum-Body--small em,\\n.spectrum:lang(zh) .spectrum-Body--small em {\\n              font-size: 12px;\\n  font-weight: 700;\\n  line-height: 1.7;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum:lang(ja) .spectrum-Body5 strong,\\n.spectrum:lang(ko) .spectrum-Body5 strong,\\n.spectrum:lang(zh) .spectrum-Body5 strong,\\n.spectrum:lang(ja) .spectrum-Body--small strong,\\n.spectrum:lang(ko) .spectrum-Body--small strong,\\n.spectrum:lang(zh) .spectrum-Body--small strong {\\n              font-size: 12px;\\n  font-weight: 900;\\n  line-height: 1.7;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum:lang(ja) .spectrum-Heading1, .spectrum:lang(ko) .spectrum-Heading1, .spectrum:lang(zh) .spectrum-Heading1 {\\n          font-size: 32px;\\n  font-weight: 700;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          margin-bottom: 8px;\\n          margin-top: 8px;\\n        }\\n.spectrum:lang(ja) .spectrum-Heading1 em, .spectrum:lang(ko) .spectrum-Heading1 em, .spectrum:lang(zh) .spectrum-Heading1 em {\\n              font-size: 32px;\\n  font-weight: 800;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum:lang(ja) .spectrum-Heading1 strong, .spectrum:lang(ko) .spectrum-Heading1 strong, .spectrum:lang(zh) .spectrum-Heading1 strong {\\n              font-size: 32px;\\n  font-weight: 900;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum:lang(ja) .spectrum-Heading2, .spectrum:lang(ko) .spectrum-Heading2, .spectrum:lang(zh) .spectrum-Heading2 {\\n          font-size: 25px;\\n  font-weight: 700;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          margin-bottom: 8px;\\n          margin-top: 8px;\\n        }\\n.spectrum:lang(ja) .spectrum-Heading2 em, .spectrum:lang(ko) .spectrum-Heading2 em, .spectrum:lang(zh) .spectrum-Heading2 em {\\n              font-size: 25px;\\n  font-weight: 800;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum:lang(ja) .spectrum-Heading2 strong, .spectrum:lang(ko) .spectrum-Heading2 strong, .spectrum:lang(zh) .spectrum-Heading2 strong {\\n              font-size: 25px;\\n  font-weight: 900;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum:lang(ja) .spectrum-Heading3, .spectrum:lang(ko) .spectrum-Heading3, .spectrum:lang(zh) .spectrum-Heading3 {\\n          font-size: 20px;\\n  font-weight: 700;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          margin-bottom: 8px;\\n          margin-top: 8px;\\n        }\\n.spectrum:lang(ja) .spectrum-Heading3 em, .spectrum:lang(ko) .spectrum-Heading3 em, .spectrum:lang(zh) .spectrum-Heading3 em {\\n              font-size: 20px;\\n  font-weight: 800;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum:lang(ja) .spectrum-Heading3 strong, .spectrum:lang(ko) .spectrum-Heading3 strong, .spectrum:lang(zh) .spectrum-Heading3 strong {\\n              font-size: 20px;\\n  font-weight: 900;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum:lang(ja) .spectrum-Heading4,\\n.spectrum:lang(ko) .spectrum-Heading4,\\n.spectrum:lang(zh) .spectrum-Heading4,\\n.spectrum:lang(ja) .spectrum-Heading--subtitle1,\\n.spectrum:lang(ko) .spectrum-Heading--subtitle1,\\n.spectrum:lang(zh) .spectrum-Heading--subtitle1 {\\n          font-size: 18px;\\n  font-weight: 700;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          margin-bottom: 8px;\\n          margin-top: 8px;\\n        }\\n.spectrum:lang(ja) .spectrum-Heading4 em,\\n.spectrum:lang(ko) .spectrum-Heading4 em,\\n.spectrum:lang(zh) .spectrum-Heading4 em,\\n.spectrum:lang(ja) .spectrum-Heading--subtitle1 em,\\n.spectrum:lang(ko) .spectrum-Heading--subtitle1 em,\\n.spectrum:lang(zh) .spectrum-Heading--subtitle1 em {\\n              font-size: 18px;\\n  font-weight: 800;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum:lang(ja) .spectrum-Heading4 strong,\\n.spectrum:lang(ko) .spectrum-Heading4 strong,\\n.spectrum:lang(zh) .spectrum-Heading4 strong,\\n.spectrum:lang(ja) .spectrum-Heading--subtitle1 strong,\\n.spectrum:lang(ko) .spectrum-Heading--subtitle1 strong,\\n.spectrum:lang(zh) .spectrum-Heading--subtitle1 strong {\\n              font-size: 18px;\\n  font-weight: 900;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum:lang(ja) .spectrum-Heading5, .spectrum:lang(ko) .spectrum-Heading5, .spectrum:lang(zh) .spectrum-Heading5 {\\n          font-size: 16px;\\n  font-weight: 700;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          margin-bottom: 8px;\\n          margin-top: 8px;\\n        }\\n.spectrum:lang(ja) .spectrum-Heading5 em, .spectrum:lang(ko) .spectrum-Heading5 em, .spectrum:lang(zh) .spectrum-Heading5 em {\\n              font-size: 16px;\\n  font-weight: 800;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum:lang(ja) .spectrum-Heading5 strong, .spectrum:lang(ko) .spectrum-Heading5 strong, .spectrum:lang(zh) .spectrum-Heading5 strong {\\n              font-size: 16px;\\n  font-weight: 900;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum:lang(ja) .spectrum-Heading6,\\n.spectrum:lang(ko) .spectrum-Heading6,\\n.spectrum:lang(zh) .spectrum-Heading6,\\n.spectrum:lang(ja) .spectrum-Heading--subtitle2,\\n.spectrum:lang(ko) .spectrum-Heading--subtitle2,\\n.spectrum:lang(zh) .spectrum-Heading--subtitle2 {\\n          font-size: 14px;\\n  font-weight: 700;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          margin-bottom: 8px;\\n          margin-top: 8px;\\n        }\\n.spectrum:lang(ja) .spectrum-Heading6 em,\\n.spectrum:lang(ko) .spectrum-Heading6 em,\\n.spectrum:lang(zh) .spectrum-Heading6 em,\\n.spectrum:lang(ja) .spectrum-Heading--subtitle2 em,\\n.spectrum:lang(ko) .spectrum-Heading--subtitle2 em,\\n.spectrum:lang(zh) .spectrum-Heading--subtitle2 em {\\n              font-size: 14px;\\n  font-weight: 800;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum:lang(ja) .spectrum-Heading6 strong,\\n.spectrum:lang(ko) .spectrum-Heading6 strong,\\n.spectrum:lang(zh) .spectrum-Heading6 strong,\\n.spectrum:lang(ja) .spectrum-Heading--subtitle2 strong,\\n.spectrum:lang(ko) .spectrum-Heading--subtitle2 strong,\\n.spectrum:lang(zh) .spectrum-Heading--subtitle2 strong {\\n              font-size: 14px;\\n  font-weight: 900;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum:lang(ja) .spectrum-Subheading,\\n.spectrum:lang(ko) .spectrum-Subheading,\\n.spectrum:lang(zh) .spectrum-Subheading,\\n.spectrum:lang(ja) .spectrum-Heading--subtitle3,\\n.spectrum:lang(ko) .spectrum-Heading--subtitle3,\\n.spectrum:lang(zh) .spectrum-Heading--subtitle3 {\\n          font-size: 11px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0.06em;\\n  text-transform: uppercase;\\n\\n          margin-bottom: 8px;\\n          margin-top: 8px;\\n        }\\n.spectrum:lang(ja) .spectrum-Subheading em,\\n.spectrum:lang(ko) .spectrum-Subheading em,\\n.spectrum:lang(zh) .spectrum-Subheading em,\\n.spectrum:lang(ja) .spectrum-Heading--subtitle3 em,\\n.spectrum:lang(ko) .spectrum-Heading--subtitle3 em,\\n.spectrum:lang(zh) .spectrum-Heading--subtitle3 em {\\n              font-size: 11px;\\n  font-weight: 800;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0.06em;\\n  text-transform: uppercase;\\n\\n          }\\n.spectrum:lang(ja) .spectrum-Subheading strong,\\n.spectrum:lang(ko) .spectrum-Subheading strong,\\n.spectrum:lang(zh) .spectrum-Subheading strong,\\n.spectrum:lang(ja) .spectrum-Heading--subtitle3 strong,\\n.spectrum:lang(ko) .spectrum-Heading--subtitle3 strong,\\n.spectrum:lang(zh) .spectrum-Heading--subtitle3 strong {\\n              font-size: 11px;\\n  font-weight: 900;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0.06em;\\n  text-transform: uppercase;\\n\\n          }\\n.spectrum:lang(ja) .spectrum-Detail, .spectrum:lang(ko) .spectrum-Detail, .spectrum:lang(zh) .spectrum-Detail {\\n          font-size: 11px;\\n  font-weight: 400;\\n  line-height: 1.7;\\n  font-style: normal;\\n  letter-spacing: 0.06em;\\n  text-transform: uppercase;\\n\\n          margin-bottom: 16px;\\n          margin-top: 8px;\\n        }\\n.spectrum:lang(ja) .spectrum-Detail em, .spectrum:lang(ko) .spectrum-Detail em, .spectrum:lang(zh) .spectrum-Detail em {\\n              font-size: 11px;\\n  font-weight: 400;\\n  line-height: 1.7;\\n  font-style: normal;\\n  letter-spacing: 0.06em;\\n  text-transform: uppercase;\\n\\n          }\\n.spectrum:lang(ja) .spectrum-Detail strong, .spectrum:lang(ko) .spectrum-Detail strong, .spectrum:lang(zh) .spectrum-Detail strong {\\n              font-size: 11px;\\n  font-weight: 900;\\n  line-height: 1.7;\\n  font-style: normal;\\n  letter-spacing: 0.06em;\\n  text-transform: uppercase;\\n\\n          }\\n.spectrum:lang(ja) .spectrum-Heading1--quiet, .spectrum:lang(ko) .spectrum-Heading1--quiet, .spectrum:lang(zh) .spectrum-Heading1--quiet {\\n          font-size: 32px;\\n  font-weight: 300;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          margin-bottom: 8px;\\n          margin-top: 8px;\\n        }\\n.spectrum:lang(ja) .spectrum-Heading1--quiet em, .spectrum:lang(ko) .spectrum-Heading1--quiet em, .spectrum:lang(zh) .spectrum-Heading1--quiet em {\\n              font-size: 32px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum:lang(ja) .spectrum-Heading1--quiet strong, .spectrum:lang(ko) .spectrum-Heading1--quiet strong, .spectrum:lang(zh) .spectrum-Heading1--quiet strong {\\n              font-size: 32px;\\n  font-weight: 700;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum:lang(ja) .spectrum-Heading2--quiet,\\n.spectrum:lang(ko) .spectrum-Heading2--quiet,\\n.spectrum:lang(zh) .spectrum-Heading2--quiet,\\n.spectrum:lang(ja) .spectrum-Heading--pageTitle,\\n.spectrum:lang(ko) .spectrum-Heading--pageTitle,\\n.spectrum:lang(zh) .spectrum-Heading--pageTitle {\\n          font-size: 25px;\\n  font-weight: 300;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          margin-bottom: 8px;\\n          margin-top: 8px;\\n        }\\n.spectrum:lang(ja) .spectrum-Heading2--quiet em,\\n.spectrum:lang(ko) .spectrum-Heading2--quiet em,\\n.spectrum:lang(zh) .spectrum-Heading2--quiet em,\\n.spectrum:lang(ja) .spectrum-Heading--pageTitle em,\\n.spectrum:lang(ko) .spectrum-Heading--pageTitle em,\\n.spectrum:lang(zh) .spectrum-Heading--pageTitle em {\\n              font-size: 25px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum:lang(ja) .spectrum-Heading2--quiet strong,\\n.spectrum:lang(ko) .spectrum-Heading2--quiet strong,\\n.spectrum:lang(zh) .spectrum-Heading2--quiet strong,\\n.spectrum:lang(ja) .spectrum-Heading--pageTitle strong,\\n.spectrum:lang(ko) .spectrum-Heading--pageTitle strong,\\n.spectrum:lang(zh) .spectrum-Heading--pageTitle strong {\\n              font-size: 25px;\\n  font-weight: 700;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum:lang(ja) .spectrum-Heading1--strong, .spectrum:lang(ko) .spectrum-Heading1--strong, .spectrum:lang(zh) .spectrum-Heading1--strong {\\n          font-size: 32px;\\n  font-weight: 900;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          margin-bottom: 8px;\\n          margin-top: 8px;\\n        }\\n.spectrum:lang(ja) .spectrum-Heading1--strong em, .spectrum:lang(ko) .spectrum-Heading1--strong em, .spectrum:lang(zh) .spectrum-Heading1--strong em {\\n              font-size: 32px;\\n  font-weight: 900;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum:lang(ja) .spectrum-Heading1--strong strong, .spectrum:lang(ko) .spectrum-Heading1--strong strong, .spectrum:lang(zh) .spectrum-Heading1--strong strong {\\n              font-size: 32px;\\n  font-weight: 900;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum:lang(ja) .spectrum-Heading2--strong, .spectrum:lang(ko) .spectrum-Heading2--strong, .spectrum:lang(zh) .spectrum-Heading2--strong {\\n          font-size: 25px;\\n  font-weight: 900;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          margin-bottom: 8px;\\n          margin-top: 8px;\\n        }\\n.spectrum:lang(ja) .spectrum-Heading2--strong em, .spectrum:lang(ko) .spectrum-Heading2--strong em, .spectrum:lang(zh) .spectrum-Heading2--strong em {\\n              font-size: 25px;\\n  font-weight: 900;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum:lang(ja) .spectrum-Heading2--strong strong, .spectrum:lang(ko) .spectrum-Heading2--strong strong, .spectrum:lang(zh) .spectrum-Heading2--strong strong {\\n              font-size: 25px;\\n  font-weight: 900;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum:lang(ja) .spectrum-Heading1--display, .spectrum:lang(ko) .spectrum-Heading1--display, .spectrum:lang(zh) .spectrum-Heading1--display {\\n          font-size: 40px;\\n  font-weight: 700;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          margin-bottom: 8px;\\n          margin-top: 8px;\\n        }\\n.spectrum:lang(ja) .spectrum-Heading1--display em, .spectrum:lang(ko) .spectrum-Heading1--display em, .spectrum:lang(zh) .spectrum-Heading1--display em {\\n              font-size: 40px;\\n  font-weight: 800;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum:lang(ja) .spectrum-Heading1--display strong, .spectrum:lang(ko) .spectrum-Heading1--display strong, .spectrum:lang(zh) .spectrum-Heading1--display strong {\\n              font-size: 40px;\\n  font-weight: 900;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum:lang(ja) .spectrum-Heading2--display, .spectrum:lang(ko) .spectrum-Heading2--display, .spectrum:lang(zh) .spectrum-Heading2--display {\\n          font-size: 36px;\\n  font-weight: 700;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          margin-bottom: 8px;\\n          margin-top: 8px;\\n        }\\n.spectrum:lang(ja) .spectrum-Heading2--display em, .spectrum:lang(ko) .spectrum-Heading2--display em, .spectrum:lang(zh) .spectrum-Heading2--display em {\\n              font-size: 36px;\\n  font-weight: 800;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum:lang(ja) .spectrum-Heading2--display strong, .spectrum:lang(ko) .spectrum-Heading2--display strong, .spectrum:lang(zh) .spectrum-Heading2--display strong {\\n              font-size: 36px;\\n  font-weight: 900;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum:lang(ja) .spectrum-Heading1--display.spectrum-Heading1--strong, .spectrum:lang(ko) .spectrum-Heading1--display.spectrum-Heading1--strong, .spectrum:lang(zh) .spectrum-Heading1--display.spectrum-Heading1--strong {\\n          font-size: 40px;\\n  font-weight: 900;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          margin-bottom: 8px;\\n          margin-top: 8px;\\n        }\\n.spectrum:lang(ja) .spectrum-Heading1--display.spectrum-Heading1--strong em, .spectrum:lang(ko) .spectrum-Heading1--display.spectrum-Heading1--strong em, .spectrum:lang(zh) .spectrum-Heading1--display.spectrum-Heading1--strong em {\\n              font-size: 40px;\\n  font-weight: 900;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum:lang(ja) .spectrum-Heading1--display.spectrum-Heading1--strong strong, .spectrum:lang(ko) .spectrum-Heading1--display.spectrum-Heading1--strong strong, .spectrum:lang(zh) .spectrum-Heading1--display.spectrum-Heading1--strong strong {\\n              font-size: 40px;\\n  font-weight: 900;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum:lang(ja) .spectrum-Heading2--display.spectrum-Heading2--strong, .spectrum:lang(ko) .spectrum-Heading2--display.spectrum-Heading2--strong, .spectrum:lang(zh) .spectrum-Heading2--display.spectrum-Heading2--strong {\\n          font-size: 36px;\\n  font-weight: 900;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          margin-bottom: 8px;\\n          margin-top: 8px;\\n        }\\n.spectrum:lang(ja) .spectrum-Heading2--display.spectrum-Heading2--strong em, .spectrum:lang(ko) .spectrum-Heading2--display.spectrum-Heading2--strong em, .spectrum:lang(zh) .spectrum-Heading2--display.spectrum-Heading2--strong em {\\n              font-size: 36px;\\n  font-weight: 900;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum:lang(ja) .spectrum-Heading2--display.spectrum-Heading2--strong strong, .spectrum:lang(ko) .spectrum-Heading2--display.spectrum-Heading2--strong strong, .spectrum:lang(zh) .spectrum-Heading2--display.spectrum-Heading2--strong strong {\\n              font-size: 36px;\\n  font-weight: 900;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum:lang(ja) .spectrum-Heading1--display.spectrum-Heading1--quiet, .spectrum:lang(ko) .spectrum-Heading1--display.spectrum-Heading1--quiet, .spectrum:lang(zh) .spectrum-Heading1--display.spectrum-Heading1--quiet {\\n          font-size: 40px;\\n  font-weight: 300;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          margin-bottom: 8px;\\n          margin-top: 8px;\\n        }\\n.spectrum:lang(ja) .spectrum-Heading1--display.spectrum-Heading1--quiet em, .spectrum:lang(ko) .spectrum-Heading1--display.spectrum-Heading1--quiet em, .spectrum:lang(zh) .spectrum-Heading1--display.spectrum-Heading1--quiet em {\\n              font-size: 40px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum:lang(ja) .spectrum-Heading1--display.spectrum-Heading1--quiet strong, .spectrum:lang(ko) .spectrum-Heading1--display.spectrum-Heading1--quiet strong, .spectrum:lang(zh) .spectrum-Heading1--display.spectrum-Heading1--quiet strong {\\n              font-size: 40px;\\n  font-weight: 700;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum:lang(ja) .spectrum-Heading2--display.spectrum-Heading2--quiet,\\n.spectrum:lang(ko) .spectrum-Heading2--display.spectrum-Heading2--quiet,\\n.spectrum:lang(zh) .spectrum-Heading2--display.spectrum-Heading2--quiet,\\n.spectrum:lang(ja) .spectrum-Heading--display,\\n.spectrum:lang(ko) .spectrum-Heading--display,\\n.spectrum:lang(zh) .spectrum-Heading--display {\\n          font-size: 36px;\\n  font-weight: 300;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          margin-bottom: 8px;\\n          margin-top: 8px;\\n        }\\n.spectrum:lang(ja) .spectrum-Heading2--display.spectrum-Heading2--quiet em,\\n.spectrum:lang(ko) .spectrum-Heading2--display.spectrum-Heading2--quiet em,\\n.spectrum:lang(zh) .spectrum-Heading2--display.spectrum-Heading2--quiet em,\\n.spectrum:lang(ja) .spectrum-Heading--display em,\\n.spectrum:lang(ko) .spectrum-Heading--display em,\\n.spectrum:lang(zh) .spectrum-Heading--display em {\\n              font-size: 36px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum:lang(ja) .spectrum-Heading2--display.spectrum-Heading2--quiet strong,\\n.spectrum:lang(ko) .spectrum-Heading2--display.spectrum-Heading2--quiet strong,\\n.spectrum:lang(zh) .spectrum-Heading2--display.spectrum-Heading2--quiet strong,\\n.spectrum:lang(ja) .spectrum-Heading--display strong,\\n.spectrum:lang(ko) .spectrum-Heading--display strong,\\n.spectrum:lang(zh) .spectrum-Heading--display strong {\\n              font-size: 36px;\\n  font-weight: 700;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Code1 {\\n          font-size: 20px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0;\\n\\n          margin-bottom: 16px;\\n          margin-top: 8px;\\n  font-family: Source Code Pro, Monaco, monospace;\\n        }\\n.spectrum-Code1 em {\\n              font-size: 20px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: italic;\\n  letter-spacing: 0;\\n\\n          }\\n.spectrum-Code1 strong {\\n              font-size: 20px;\\n  font-weight: 700;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0;\\n\\n          }\\n.spectrum-Code2 {\\n          font-size: 18px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0;\\n\\n          margin-bottom: 16px;\\n          margin-top: 8px;\\n  font-family: Source Code Pro, Monaco, monospace;\\n        }\\n.spectrum-Code2 em {\\n              font-size: 18px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: italic;\\n  letter-spacing: 0;\\n\\n          }\\n.spectrum-Code2 strong {\\n              font-size: 18px;\\n  font-weight: 700;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0;\\n\\n          }\\n.spectrum-Code3 {\\n          font-size: 16px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0;\\n\\n          margin-bottom: 16px;\\n          margin-top: 8px;\\n  font-family: Source Code Pro, Monaco, monospace;\\n        }\\n.spectrum-Code3 em {\\n              font-size: 16px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: italic;\\n  letter-spacing: 0;\\n\\n          }\\n.spectrum-Code3 strong {\\n              font-size: 16px;\\n  font-weight: 700;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0;\\n\\n          }\\n.spectrum-Code4 {\\n          font-size: 14px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0;\\n\\n          margin-bottom: 16px;\\n          margin-top: 8px;\\n  font-family: Source Code Pro, Monaco, monospace;\\n        }\\n.spectrum-Code4 em {\\n              font-size: 14px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: italic;\\n  letter-spacing: 0;\\n\\n          }\\n.spectrum-Code4 strong {\\n              font-size: 14px;\\n  font-weight: 700;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0;\\n\\n          }\\n.spectrum-Code5 {\\n          font-size: 12px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0;\\n\\n          margin-bottom: 16px;\\n          margin-top: 8px;\\n  font-family: Source Code Pro, Monaco, monospace;\\n        }\\n.spectrum-Code5 em {\\n              font-size: 12px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: italic;\\n  letter-spacing: 0;\\n\\n          }\\n.spectrum-Code5 strong {\\n              font-size: 12px;\\n  font-weight: 700;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0;\\n\\n          }\\n/* topdoc\\n{{ typography/typography-default.yml }}\\n*/\\n/* topdoc\\n{{ typography/typography-deprecated.yml }}\\n*/\\n/* topdoc\\n{{ typography/typography-article.yml }}\\n*/\\n/* topdoc\\n{{ typography/typography-han.yml }}\\n*/\\n/* topdoc\\n{{ typography/typography-heading.yml }}\\n*/\\n/* topdoc\\n{{ typography/typography-heading-quiet.yml }}\\n*/\\n/* topdoc\\n{{ typography/typography-heading-strong.yml }}\\n*/\\n/* topdoc\\n{{ typography/typography-display.yml }}\\n*/\\n/* topdoc\\n{{ typography/typography-display-quiet.yml }}\\n*/\\n/* topdoc\\n{{ typography/typography-display-strong.yml }}\\n*/\\n/* topdoc\\n{{ typography/typography-body.yml }}\\n*/\\n/* topdoc\\n{{ typography/typography-code.yml }}\\n*/\\n.spectrum,\\n.spectrum-Body {\\n  font-size: 14px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: normal;\\n}\\n.spectrum-Body--italic {\\n  font-style: italic;\\n}\\n", ""]);\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjI0LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0b3JxLW5hdGl2ZS9yZWFjdC1zcGVjdHJ1bS9zcGVjdHJ1bS1jc3Mtb3ZlcnJpZGVzL3R5cG9ncmFwaHkvaW5kZXguY3NzPzlhZjgiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIi4uLy4uLy4uLy4uL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qc1wiKShmYWxzZSk7XG4vLyBNb2R1bGVcbmV4cG9ydHMucHVzaChbbW9kdWxlLmlkLCBcIi8qIGdlbmVyYXRlZCBmcm9tIGRuYS12ZXJzaW9uOiA1LjAuMSAqL1xcbi8qIGdlbmVyYXRlZCBmcm9tIGRuYS12ZXJzaW9uOiA1LjAuMSAqL1xcbi5zcGVjdHJ1bSB7XFxuICBmb250LWZhbWlseTogYWRvYmUtY2xlYW4sIFxcXCJTb3VyY2UgU2FucyBQcm9cXFwiLCAtYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsIFxcXCJTZWdvZSBVSVxcXCIsIFJvYm90bywgc2Fucy1zZXJpZjtcXG4gIGZvbnQtc2l6ZTogMTRweDtcXG59XFxuLnNwZWN0cnVtOmxhbmcoemgtSGFucykge1xcbiAgICBmb250LWZhbWlseTogYWRvYmUtY2xlYW4taGFuLWphcGFuZXNlLCAtYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsIFxcXCJTZWdvZSBVSVxcXCIsIFJvYm90bywgc2Fucy1zZXJpZjtcXG4gIH1cXG4uc3BlY3RydW06bGFuZyh6aCkge1xcbiAgICBmb250LWZhbWlseTogYWRvYmUtY2xlYW4taGFuLWphcGFuZXNlLCAtYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsIFxcXCJTZWdvZSBVSVxcXCIsIFJvYm90bywgc2Fucy1zZXJpZjtcXG4gIH1cXG4uc3BlY3RydW06bGFuZyhrbykge1xcbiAgICBmb250LWZhbWlseTogYWRvYmUtY2xlYW4taGFuLWphcGFuZXNlLCAtYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsIFxcXCJTZWdvZSBVSVxcXCIsIFJvYm90bywgc2Fucy1zZXJpZjtcXG4gIH1cXG4uc3BlY3RydW06bGFuZyhqYSkge1xcbiAgICBmb250LWZhbWlseTogYWRvYmUtY2xlYW4taGFuLWphcGFuZXNlLCAtYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsIFxcXCJTZWdvZSBVSVxcXCIsIFJvYm90bywgc2Fucy1zZXJpZjtcXG4gIH1cXG4uc3BlY3RydW0tQm9keTEge1xcbiAgICAgICAgICBmb250LXNpemU6IDIwcHg7XFxuICBmb250LXdlaWdodDogNDAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIG1hcmdpbi1ib3R0b206IDE2cHg7XFxuICAgICAgICAgIG1hcmdpbi10b3A6IDhweDtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tQm9keTEgZW0ge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiAyMHB4O1xcbiAgZm9udC13ZWlnaHQ6IDQwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjU7XFxuICBmb250LXN0eWxlOiBpdGFsaWM7XFxuICBsZXR0ZXItc3BhY2luZzogMDtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtLUJvZHkxIHN0cm9uZyB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDIwcHg7XFxuICBmb250LXdlaWdodDogNzAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW0tQm9keTIsXFxuLnNwZWN0cnVtLUJvZHktLWxhcmdlIHtcXG4gICAgICAgICAgZm9udC1zaXplOiAxOHB4O1xcbiAgZm9udC13ZWlnaHQ6IDQwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjU7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMDtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICBtYXJnaW4tYm90dG9tOiAxNnB4O1xcbiAgICAgICAgICBtYXJnaW4tdG9wOiA4cHg7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLUJvZHkyIGVtLFxcbi5zcGVjdHJ1bS1Cb2R5LS1sYXJnZSBlbSB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDE4cHg7XFxuICBmb250LXdlaWdodDogNDAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gIGZvbnQtc3R5bGU6IGl0YWxpYztcXG4gIGxldHRlci1zcGFjaW5nOiAwO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW0tQm9keTIgc3Ryb25nLFxcbi5zcGVjdHJ1bS1Cb2R5LS1sYXJnZSBzdHJvbmcge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiAxOHB4O1xcbiAgZm9udC13ZWlnaHQ6IDcwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjU7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMDtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtLUJvZHkzIHtcXG4gICAgICAgICAgZm9udC1zaXplOiAxNnB4O1xcbiAgZm9udC13ZWlnaHQ6IDQwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjU7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMDtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICBtYXJnaW4tYm90dG9tOiAxNnB4O1xcbiAgICAgICAgICBtYXJnaW4tdG9wOiA4cHg7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLUJvZHkzIGVtIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogMTZweDtcXG4gIGZvbnQtd2VpZ2h0OiA0MDA7XFxuICBsaW5lLWhlaWdodDogMS41O1xcbiAgZm9udC1zdHlsZTogaXRhbGljO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDA7XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bS1Cb2R5MyBzdHJvbmcge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiAxNnB4O1xcbiAgZm9udC13ZWlnaHQ6IDcwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjU7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMDtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtLUJvZHk0LFxcbi5zcGVjdHJ1bS1Cb2R5LS1zZWNvbmRhcnkge1xcbiAgICAgICAgICBmb250LXNpemU6IDE0cHg7XFxuICBmb250LXdlaWdodDogNDAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIG1hcmdpbi1ib3R0b206IDE2cHg7XFxuICAgICAgICAgIG1hcmdpbi10b3A6IDhweDtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tQm9keTQgZW0sXFxuLnNwZWN0cnVtLUJvZHktLXNlY29uZGFyeSBlbSB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDE0cHg7XFxuICBmb250LXdlaWdodDogNDAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gIGZvbnQtc3R5bGU6IGl0YWxpYztcXG4gIGxldHRlci1zcGFjaW5nOiAwO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW0tQm9keTQgc3Ryb25nLFxcbi5zcGVjdHJ1bS1Cb2R5LS1zZWNvbmRhcnkgc3Ryb25nIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogMTRweDtcXG4gIGZvbnQtd2VpZ2h0OiA3MDA7XFxuICBsaW5lLWhlaWdodDogMS41O1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDA7XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bS1Cb2R5NSxcXG4uc3BlY3RydW0tQm9keS0tc21hbGwge1xcbiAgICAgICAgICBmb250LXNpemU6IDEycHg7XFxuICBmb250LXdlaWdodDogNDAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIG1hcmdpbi1ib3R0b206IDE2cHg7XFxuICAgICAgICAgIG1hcmdpbi10b3A6IDhweDtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tQm9keTUgZW0sXFxuLnNwZWN0cnVtLUJvZHktLXNtYWxsIGVtIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogMTJweDtcXG4gIGZvbnQtd2VpZ2h0OiA0MDA7XFxuICBsaW5lLWhlaWdodDogMS41O1xcbiAgZm9udC1zdHlsZTogaXRhbGljO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDA7XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bS1Cb2R5NSBzdHJvbmcsXFxuLnNwZWN0cnVtLUJvZHktLXNtYWxsIHN0cm9uZyB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDEycHg7XFxuICBmb250LXdlaWdodDogNzAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW0tSGVhZGluZzEge1xcbiAgICAgICAgICBmb250LXNpemU6IDM2cHg7XFxuICBmb250LXdlaWdodDogNzAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuMztcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIG1hcmdpbi1ib3R0b206IDhweDtcXG4gICAgICAgICAgbWFyZ2luLXRvcDogOHB4O1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS1IZWFkaW5nMSBlbSB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDM2cHg7XFxuICBmb250LXdlaWdodDogNzAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuMztcXG4gIGZvbnQtc3R5bGU6IGl0YWxpYztcXG4gIGxldHRlci1zcGFjaW5nOiAwO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW0tSGVhZGluZzEgc3Ryb25nIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogMzZweDtcXG4gIGZvbnQtd2VpZ2h0OiA5MDA7XFxuICBsaW5lLWhlaWdodDogMS4zO1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDA7XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bS1IZWFkaW5nMiB7XFxuICAgICAgICAgIGZvbnQtc2l6ZTogMjhweDtcXG4gIGZvbnQtd2VpZ2h0OiA3MDA7XFxuICBsaW5lLWhlaWdodDogMS4zO1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDA7XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgbWFyZ2luLWJvdHRvbTogOHB4O1xcbiAgICAgICAgICBtYXJnaW4tdG9wOiA4cHg7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLUhlYWRpbmcyIGVtIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogMjhweDtcXG4gIGZvbnQtd2VpZ2h0OiA3MDA7XFxuICBsaW5lLWhlaWdodDogMS4zO1xcbiAgZm9udC1zdHlsZTogaXRhbGljO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDA7XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bS1IZWFkaW5nMiBzdHJvbmcge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiAyOHB4O1xcbiAgZm9udC13ZWlnaHQ6IDkwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjM7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMDtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtLUhlYWRpbmczIHtcXG4gICAgICAgICAgZm9udC1zaXplOiAyMnB4O1xcbiAgZm9udC13ZWlnaHQ6IDcwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjM7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMDtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICBtYXJnaW4tYm90dG9tOiA4cHg7XFxuICAgICAgICAgIG1hcmdpbi10b3A6IDhweDtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tSGVhZGluZzMgZW0ge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiAyMnB4O1xcbiAgZm9udC13ZWlnaHQ6IDcwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjM7XFxuICBmb250LXN0eWxlOiBpdGFsaWM7XFxuICBsZXR0ZXItc3BhY2luZzogMDtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtLUhlYWRpbmczIHN0cm9uZyB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDIycHg7XFxuICBmb250LXdlaWdodDogOTAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuMztcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW0tSGVhZGluZzQsXFxuLnNwZWN0cnVtLUhlYWRpbmctLXN1YnRpdGxlMSB7XFxuICAgICAgICAgIGZvbnQtc2l6ZTogMThweDtcXG4gIGZvbnQtd2VpZ2h0OiA3MDA7XFxuICBsaW5lLWhlaWdodDogMS4zO1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDA7XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgbWFyZ2luLWJvdHRvbTogOHB4O1xcbiAgICAgICAgICBtYXJnaW4tdG9wOiA4cHg7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLUhlYWRpbmc0IGVtLFxcbi5zcGVjdHJ1bS1IZWFkaW5nLS1zdWJ0aXRsZTEgZW0ge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiAxOHB4O1xcbiAgZm9udC13ZWlnaHQ6IDcwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjM7XFxuICBmb250LXN0eWxlOiBpdGFsaWM7XFxuICBsZXR0ZXItc3BhY2luZzogMDtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtLUhlYWRpbmc0IHN0cm9uZyxcXG4uc3BlY3RydW0tSGVhZGluZy0tc3VidGl0bGUxIHN0cm9uZyB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDE4cHg7XFxuICBmb250LXdlaWdodDogOTAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuMztcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW0tSGVhZGluZzUge1xcbiAgICAgICAgICBmb250LXNpemU6IDE2cHg7XFxuICBmb250LXdlaWdodDogNzAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuMztcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIG1hcmdpbi1ib3R0b206IDhweDtcXG4gICAgICAgICAgbWFyZ2luLXRvcDogOHB4O1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS1IZWFkaW5nNSBlbSB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDE2cHg7XFxuICBmb250LXdlaWdodDogNzAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuMztcXG4gIGZvbnQtc3R5bGU6IGl0YWxpYztcXG4gIGxldHRlci1zcGFjaW5nOiAwO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW0tSGVhZGluZzUgc3Ryb25nIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogMTZweDtcXG4gIGZvbnQtd2VpZ2h0OiA5MDA7XFxuICBsaW5lLWhlaWdodDogMS4zO1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDA7XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bS1IZWFkaW5nNixcXG4uc3BlY3RydW0tSGVhZGluZy0tc3VidGl0bGUyIHtcXG4gICAgICAgICAgZm9udC1zaXplOiAxNHB4O1xcbiAgZm9udC13ZWlnaHQ6IDcwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjM7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMDtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICBtYXJnaW4tYm90dG9tOiA4cHg7XFxuICAgICAgICAgIG1hcmdpbi10b3A6IDhweDtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tSGVhZGluZzYgZW0sXFxuLnNwZWN0cnVtLUhlYWRpbmctLXN1YnRpdGxlMiBlbSB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDE0cHg7XFxuICBmb250LXdlaWdodDogNzAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuMztcXG4gIGZvbnQtc3R5bGU6IGl0YWxpYztcXG4gIGxldHRlci1zcGFjaW5nOiAwO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW0tSGVhZGluZzYgc3Ryb25nLFxcbi5zcGVjdHJ1bS1IZWFkaW5nLS1zdWJ0aXRsZTIgc3Ryb25nIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogMTRweDtcXG4gIGZvbnQtd2VpZ2h0OiA5MDA7XFxuICBsaW5lLWhlaWdodDogMS4zO1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDA7XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bS1TdWJoZWFkaW5nLFxcbi5zcGVjdHJ1bS1IZWFkaW5nLS1zdWJ0aXRsZTMge1xcbiAgICAgICAgICBmb250LXNpemU6IDExcHg7XFxuICBmb250LXdlaWdodDogNzAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuMztcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjA2ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xcblxcbiAgICAgICAgICBtYXJnaW4tYm90dG9tOiA4cHg7XFxuICAgICAgICAgIG1hcmdpbi10b3A6IDhweDtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tU3ViaGVhZGluZyBlbSxcXG4uc3BlY3RydW0tSGVhZGluZy0tc3VidGl0bGUzIGVtIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogMTFweDtcXG4gIGZvbnQtd2VpZ2h0OiA3MDA7XFxuICBsaW5lLWhlaWdodDogMS4zO1xcbiAgZm9udC1zdHlsZTogaXRhbGljO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDZlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW0tU3ViaGVhZGluZyBzdHJvbmcsXFxuLnNwZWN0cnVtLUhlYWRpbmctLXN1YnRpdGxlMyBzdHJvbmcge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiAxMXB4O1xcbiAgZm9udC13ZWlnaHQ6IDkwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjM7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wNmVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bS1EZXRhaWwge1xcbiAgICAgICAgICBmb250LXNpemU6IDExcHg7XFxuICBmb250LXdlaWdodDogNDAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjA2ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xcblxcbiAgICAgICAgICBtYXJnaW4tYm90dG9tOiAxNnB4O1xcbiAgICAgICAgICBtYXJnaW4tdG9wOiA4cHg7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLURldGFpbCBlbSB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDExcHg7XFxuICBmb250LXdlaWdodDogNDAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gIGZvbnQtc3R5bGU6IGl0YWxpYztcXG4gIGxldHRlci1zcGFjaW5nOiAwLjA2ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtLURldGFpbCBzdHJvbmcge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiAxMXB4O1xcbiAgZm9udC13ZWlnaHQ6IDcwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjU7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wNmVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bS1IZWFkaW5nMS0tcXVpZXQge1xcbiAgICAgICAgICBmb250LXNpemU6IDM2cHg7XFxuICBmb250LXdlaWdodDogMzAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuMztcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIG1hcmdpbi1ib3R0b206IDhweDtcXG4gICAgICAgICAgbWFyZ2luLXRvcDogOHB4O1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS1IZWFkaW5nMS0tcXVpZXQgZW0ge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiAzNnB4O1xcbiAgZm9udC13ZWlnaHQ6IDMwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjM7XFxuICBmb250LXN0eWxlOiBpdGFsaWM7XFxuICBsZXR0ZXItc3BhY2luZzogMDtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtLUhlYWRpbmcxLS1xdWlldCBzdHJvbmcge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiAzNnB4O1xcbiAgZm9udC13ZWlnaHQ6IDcwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjM7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMDtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtLUhlYWRpbmcyLS1xdWlldCxcXG4uc3BlY3RydW0tSGVhZGluZy0tcGFnZVRpdGxlIHtcXG4gICAgICAgICAgZm9udC1zaXplOiAyOHB4O1xcbiAgZm9udC13ZWlnaHQ6IDMwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjM7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMDtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICBtYXJnaW4tYm90dG9tOiA4cHg7XFxuICAgICAgICAgIG1hcmdpbi10b3A6IDhweDtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tSGVhZGluZzItLXF1aWV0IGVtLFxcbi5zcGVjdHJ1bS1IZWFkaW5nLS1wYWdlVGl0bGUgZW0ge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiAyOHB4O1xcbiAgZm9udC13ZWlnaHQ6IDMwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjM7XFxuICBmb250LXN0eWxlOiBpdGFsaWM7XFxuICBsZXR0ZXItc3BhY2luZzogMDtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtLUhlYWRpbmcyLS1xdWlldCBzdHJvbmcsXFxuLnNwZWN0cnVtLUhlYWRpbmctLXBhZ2VUaXRsZSBzdHJvbmcge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiAyOHB4O1xcbiAgZm9udC13ZWlnaHQ6IDcwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjM7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMDtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtLUhlYWRpbmcxLS1zdHJvbmcge1xcbiAgICAgICAgICBmb250LXNpemU6IDM2cHg7XFxuICBmb250LXdlaWdodDogOTAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuMztcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIG1hcmdpbi1ib3R0b206IDhweDtcXG4gICAgICAgICAgbWFyZ2luLXRvcDogOHB4O1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS1IZWFkaW5nMS0tc3Ryb25nIGVtIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogMzZweDtcXG4gIGZvbnQtd2VpZ2h0OiA5MDA7XFxuICBsaW5lLWhlaWdodDogMS4zO1xcbiAgZm9udC1zdHlsZTogaXRhbGljO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDA7XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bS1IZWFkaW5nMS0tc3Ryb25nIHN0cm9uZyB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDM2cHg7XFxuICBmb250LXdlaWdodDogOTAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuMztcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW0tSGVhZGluZzItLXN0cm9uZyB7XFxuICAgICAgICAgIGZvbnQtc2l6ZTogMjhweDtcXG4gIGZvbnQtd2VpZ2h0OiA5MDA7XFxuICBsaW5lLWhlaWdodDogMS4zO1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDA7XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgbWFyZ2luLWJvdHRvbTogOHB4O1xcbiAgICAgICAgICBtYXJnaW4tdG9wOiA4cHg7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLUhlYWRpbmcyLS1zdHJvbmcgZW0ge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiAyOHB4O1xcbiAgZm9udC13ZWlnaHQ6IDkwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjM7XFxuICBmb250LXN0eWxlOiBpdGFsaWM7XFxuICBsZXR0ZXItc3BhY2luZzogMDtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtLUhlYWRpbmcyLS1zdHJvbmcgc3Ryb25nIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogMjhweDtcXG4gIGZvbnQtd2VpZ2h0OiA5MDA7XFxuICBsaW5lLWhlaWdodDogMS4zO1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDA7XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bS1IZWFkaW5nMS0tZGlzcGxheSB7XFxuICAgICAgICAgIGZvbnQtc2l6ZTogNDVweDtcXG4gIGZvbnQtd2VpZ2h0OiA3MDA7XFxuICBsaW5lLWhlaWdodDogMS4zO1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDA7XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgbWFyZ2luLWJvdHRvbTogOHB4O1xcbiAgICAgICAgICBtYXJnaW4tdG9wOiA4cHg7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLUhlYWRpbmcxLS1kaXNwbGF5IGVtIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogNDVweDtcXG4gIGZvbnQtd2VpZ2h0OiA3MDA7XFxuICBsaW5lLWhlaWdodDogMS4zO1xcbiAgZm9udC1zdHlsZTogaXRhbGljO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDA7XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bS1IZWFkaW5nMS0tZGlzcGxheSBzdHJvbmcge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiA0NXB4O1xcbiAgZm9udC13ZWlnaHQ6IDkwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjM7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMDtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtLUhlYWRpbmcyLS1kaXNwbGF5IHtcXG4gICAgICAgICAgZm9udC1zaXplOiA0MHB4O1xcbiAgZm9udC13ZWlnaHQ6IDcwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjM7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMDtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICBtYXJnaW4tYm90dG9tOiA4cHg7XFxuICAgICAgICAgIG1hcmdpbi10b3A6IDhweDtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tSGVhZGluZzItLWRpc3BsYXkgZW0ge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiA0MHB4O1xcbiAgZm9udC13ZWlnaHQ6IDcwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjM7XFxuICBmb250LXN0eWxlOiBpdGFsaWM7XFxuICBsZXR0ZXItc3BhY2luZzogMDtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtLUhlYWRpbmcyLS1kaXNwbGF5IHN0cm9uZyB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDQwcHg7XFxuICBmb250LXdlaWdodDogNzAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuMztcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW0tSGVhZGluZzEtLWRpc3BsYXkuc3BlY3RydW0tSGVhZGluZzEtLXN0cm9uZyB7XFxuICAgICAgICAgIGZvbnQtc2l6ZTogNDVweDtcXG4gIGZvbnQtd2VpZ2h0OiA5MDA7XFxuICBsaW5lLWhlaWdodDogMS4zO1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDA7XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgbWFyZ2luLWJvdHRvbTogOHB4O1xcbiAgICAgICAgICBtYXJnaW4tdG9wOiA4cHg7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLUhlYWRpbmcxLS1kaXNwbGF5LnNwZWN0cnVtLUhlYWRpbmcxLS1zdHJvbmcgZW0ge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiA0NXB4O1xcbiAgZm9udC13ZWlnaHQ6IDkwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjM7XFxuICBmb250LXN0eWxlOiBpdGFsaWM7XFxuICBsZXR0ZXItc3BhY2luZzogMDtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtLUhlYWRpbmcxLS1kaXNwbGF5LnNwZWN0cnVtLUhlYWRpbmcxLS1zdHJvbmcgc3Ryb25nIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogNDVweDtcXG4gIGZvbnQtd2VpZ2h0OiA5MDA7XFxuICBsaW5lLWhlaWdodDogMS4zO1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDA7XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bS1IZWFkaW5nMi0tZGlzcGxheS5zcGVjdHJ1bS1IZWFkaW5nMi0tc3Ryb25nIHtcXG4gICAgICAgICAgZm9udC1zaXplOiA0MHB4O1xcbiAgZm9udC13ZWlnaHQ6IDkwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjM7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMDtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICBtYXJnaW4tYm90dG9tOiA4cHg7XFxuICAgICAgICAgIG1hcmdpbi10b3A6IDhweDtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tSGVhZGluZzItLWRpc3BsYXkuc3BlY3RydW0tSGVhZGluZzItLXN0cm9uZyBlbSB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDQwcHg7XFxuICBmb250LXdlaWdodDogOTAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuMztcXG4gIGZvbnQtc3R5bGU6IGl0YWxpYztcXG4gIGxldHRlci1zcGFjaW5nOiAwO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW0tSGVhZGluZzItLWRpc3BsYXkuc3BlY3RydW0tSGVhZGluZzItLXN0cm9uZyBzdHJvbmcge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiA0MHB4O1xcbiAgZm9udC13ZWlnaHQ6IDkwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjM7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMDtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtLUhlYWRpbmcxLS1kaXNwbGF5LnNwZWN0cnVtLUhlYWRpbmcxLS1xdWlldCB7XFxuICAgICAgICAgIGZvbnQtc2l6ZTogNDVweDtcXG4gIGZvbnQtd2VpZ2h0OiAzMDA7XFxuICBsaW5lLWhlaWdodDogMS4zO1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDA7XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgbWFyZ2luLWJvdHRvbTogOHB4O1xcbiAgICAgICAgICBtYXJnaW4tdG9wOiA4cHg7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLUhlYWRpbmcxLS1kaXNwbGF5LnNwZWN0cnVtLUhlYWRpbmcxLS1xdWlldCBlbSB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDQ1cHg7XFxuICBmb250LXdlaWdodDogMzAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuMztcXG4gIGZvbnQtc3R5bGU6IGl0YWxpYztcXG4gIGxldHRlci1zcGFjaW5nOiAwO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW0tSGVhZGluZzEtLWRpc3BsYXkuc3BlY3RydW0tSGVhZGluZzEtLXF1aWV0IHN0cm9uZyB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDQ1cHg7XFxuICBmb250LXdlaWdodDogNzAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuMztcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW0tSGVhZGluZzItLWRpc3BsYXkuc3BlY3RydW0tSGVhZGluZzItLXF1aWV0LFxcbi5zcGVjdHJ1bS1IZWFkaW5nLS1kaXNwbGF5IHtcXG4gICAgICAgICAgZm9udC1zaXplOiA0MHB4O1xcbiAgZm9udC13ZWlnaHQ6IDMwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjM7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMDtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICBtYXJnaW4tYm90dG9tOiA4cHg7XFxuICAgICAgICAgIG1hcmdpbi10b3A6IDhweDtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tSGVhZGluZzItLWRpc3BsYXkuc3BlY3RydW0tSGVhZGluZzItLXF1aWV0IGVtLFxcbi5zcGVjdHJ1bS1IZWFkaW5nLS1kaXNwbGF5IGVtIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogNDBweDtcXG4gIGZvbnQtd2VpZ2h0OiAzMDA7XFxuICBsaW5lLWhlaWdodDogMS4zO1xcbiAgZm9udC1zdHlsZTogaXRhbGljO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDA7XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bS1IZWFkaW5nMi0tZGlzcGxheS5zcGVjdHJ1bS1IZWFkaW5nMi0tcXVpZXQgc3Ryb25nLFxcbi5zcGVjdHJ1bS1IZWFkaW5nLS1kaXNwbGF5IHN0cm9uZyB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDQwcHg7XFxuICBmb250LXdlaWdodDogNzAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuMztcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW0tQXJ0aWNsZSB7XFxuICBmb250LWZhbWlseTogQWRvYmUgQ2xlYW4gU2VyaWYsIFRpbWVzIE5ldyBSb21hbiwgc2VyaWY7XFxufVxcbi5zcGVjdHJ1bS1BcnRpY2xlIC5zcGVjdHJ1bS1Cb2R5MSB7XFxuICAgICAgICAgIGZvbnQtc2l6ZTogMjBweDtcXG4gIGZvbnQtd2VpZ2h0OiA0MDA7XFxuICBsaW5lLWhlaWdodDogMS41O1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDEyNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIG1hcmdpbi1ib3R0b206IDE2cHg7XFxuICAgICAgICAgIG1hcmdpbi10b3A6IDhweDtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tQXJ0aWNsZSAuc3BlY3RydW0tQm9keTEgZW0ge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiAyMHB4O1xcbiAgZm9udC13ZWlnaHQ6IDQwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjU7XFxuICBmb250LXN0eWxlOiBpdGFsaWM7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wMTI1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bS1BcnRpY2xlIC5zcGVjdHJ1bS1Cb2R5MSBzdHJvbmcge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiAyMHB4O1xcbiAgZm9udC13ZWlnaHQ6IDkwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjU7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wMTI1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bS1BcnRpY2xlIC5zcGVjdHJ1bS1Cb2R5MixcXG4uc3BlY3RydW0tQXJ0aWNsZSAuc3BlY3RydW0tQm9keS0tbGFyZ2Uge1xcbiAgICAgICAgICBmb250LXNpemU6IDE4cHg7XFxuICBmb250LXdlaWdodDogNDAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjAxMjVlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICBtYXJnaW4tYm90dG9tOiAxNnB4O1xcbiAgICAgICAgICBtYXJnaW4tdG9wOiA4cHg7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLUJvZHkyIGVtLFxcbi5zcGVjdHJ1bS1BcnRpY2xlIC5zcGVjdHJ1bS1Cb2R5LS1sYXJnZSBlbSB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDE4cHg7XFxuICBmb250LXdlaWdodDogNDAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gIGZvbnQtc3R5bGU6IGl0YWxpYztcXG4gIGxldHRlci1zcGFjaW5nOiAwLjAxMjVlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLUJvZHkyIHN0cm9uZyxcXG4uc3BlY3RydW0tQXJ0aWNsZSAuc3BlY3RydW0tQm9keS0tbGFyZ2Ugc3Ryb25nIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogMThweDtcXG4gIGZvbnQtd2VpZ2h0OiA5MDA7XFxuICBsaW5lLWhlaWdodDogMS41O1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDEyNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW0tQXJ0aWNsZSAuc3BlY3RydW0tQm9keTMge1xcbiAgICAgICAgICBmb250LXNpemU6IDE2cHg7XFxuICBmb250LXdlaWdodDogNDAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjAxMjVlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICBtYXJnaW4tYm90dG9tOiAxNnB4O1xcbiAgICAgICAgICBtYXJnaW4tdG9wOiA4cHg7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLUJvZHkzIGVtIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogMTZweDtcXG4gIGZvbnQtd2VpZ2h0OiA0MDA7XFxuICBsaW5lLWhlaWdodDogMS41O1xcbiAgZm9udC1zdHlsZTogaXRhbGljO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDEyNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW0tQXJ0aWNsZSAuc3BlY3RydW0tQm9keTMgc3Ryb25nIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogMTZweDtcXG4gIGZvbnQtd2VpZ2h0OiA5MDA7XFxuICBsaW5lLWhlaWdodDogMS41O1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDEyNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW0tQXJ0aWNsZSAuc3BlY3RydW0tQm9keTQsXFxuLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLUJvZHktLXNlY29uZGFyeSB7XFxuICAgICAgICAgIGZvbnQtc2l6ZTogMTRweDtcXG4gIGZvbnQtd2VpZ2h0OiA0MDA7XFxuICBsaW5lLWhlaWdodDogMS41O1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDEyNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIG1hcmdpbi1ib3R0b206IDE2cHg7XFxuICAgICAgICAgIG1hcmdpbi10b3A6IDhweDtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tQXJ0aWNsZSAuc3BlY3RydW0tQm9keTQgZW0sXFxuLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLUJvZHktLXNlY29uZGFyeSBlbSB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDE0cHg7XFxuICBmb250LXdlaWdodDogNDAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gIGZvbnQtc3R5bGU6IGl0YWxpYztcXG4gIGxldHRlci1zcGFjaW5nOiAwLjAxMjVlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLUJvZHk0IHN0cm9uZyxcXG4uc3BlY3RydW0tQXJ0aWNsZSAuc3BlY3RydW0tQm9keS0tc2Vjb25kYXJ5IHN0cm9uZyB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDE0cHg7XFxuICBmb250LXdlaWdodDogOTAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjAxMjVlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLUJvZHk1LFxcbi5zcGVjdHJ1bS1BcnRpY2xlIC5zcGVjdHJ1bS1Cb2R5LS1zbWFsbCB7XFxuICAgICAgICAgIGZvbnQtc2l6ZTogMTJweDtcXG4gIGZvbnQtd2VpZ2h0OiA0MDA7XFxuICBsaW5lLWhlaWdodDogMS41O1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDEyNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIG1hcmdpbi1ib3R0b206IDE2cHg7XFxuICAgICAgICAgIG1hcmdpbi10b3A6IDhweDtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tQXJ0aWNsZSAuc3BlY3RydW0tQm9keTUgZW0sXFxuLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLUJvZHktLXNtYWxsIGVtIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogMTJweDtcXG4gIGZvbnQtd2VpZ2h0OiA0MDA7XFxuICBsaW5lLWhlaWdodDogMS41O1xcbiAgZm9udC1zdHlsZTogaXRhbGljO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDEyNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW0tQXJ0aWNsZSAuc3BlY3RydW0tQm9keTUgc3Ryb25nLFxcbi5zcGVjdHJ1bS1BcnRpY2xlIC5zcGVjdHJ1bS1Cb2R5LS1zbWFsbCBzdHJvbmcge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiAxMnB4O1xcbiAgZm9udC13ZWlnaHQ6IDkwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjU7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wMTI1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bS1BcnRpY2xlIC5zcGVjdHJ1bS1IZWFkaW5nMSB7XFxuICAgICAgICAgIGZvbnQtc2l6ZTogMzZweDtcXG4gIGZvbnQtd2VpZ2h0OiA3MDA7XFxuICBsaW5lLWhlaWdodDogMS4zO1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDEyNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIG1hcmdpbi1ib3R0b206IDhweDtcXG4gICAgICAgICAgbWFyZ2luLXRvcDogOHB4O1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS1BcnRpY2xlIC5zcGVjdHJ1bS1IZWFkaW5nMSBlbSB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDM2cHg7XFxuICBmb250LXdlaWdodDogNzAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuMztcXG4gIGZvbnQtc3R5bGU6IGl0YWxpYztcXG4gIGxldHRlci1zcGFjaW5nOiAwLjAxMjVlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLUhlYWRpbmcxIHN0cm9uZyB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDM2cHg7XFxuICBmb250LXdlaWdodDogOTAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuMztcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjAxMjVlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLUhlYWRpbmcyIHtcXG4gICAgICAgICAgZm9udC1zaXplOiAyOHB4O1xcbiAgZm9udC13ZWlnaHQ6IDcwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjM7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wMTI1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgbWFyZ2luLWJvdHRvbTogOHB4O1xcbiAgICAgICAgICBtYXJnaW4tdG9wOiA4cHg7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLUhlYWRpbmcyIGVtIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogMjhweDtcXG4gIGZvbnQtd2VpZ2h0OiA3MDA7XFxuICBsaW5lLWhlaWdodDogMS4zO1xcbiAgZm9udC1zdHlsZTogaXRhbGljO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDEyNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW0tQXJ0aWNsZSAuc3BlY3RydW0tSGVhZGluZzIgc3Ryb25nIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogMjhweDtcXG4gIGZvbnQtd2VpZ2h0OiA5MDA7XFxuICBsaW5lLWhlaWdodDogMS4zO1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDEyNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW0tQXJ0aWNsZSAuc3BlY3RydW0tSGVhZGluZzMge1xcbiAgICAgICAgICBmb250LXNpemU6IDIycHg7XFxuICBmb250LXdlaWdodDogNzAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuMztcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjAxMjVlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICBtYXJnaW4tYm90dG9tOiA4cHg7XFxuICAgICAgICAgIG1hcmdpbi10b3A6IDhweDtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tQXJ0aWNsZSAuc3BlY3RydW0tSGVhZGluZzMgZW0ge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiAyMnB4O1xcbiAgZm9udC13ZWlnaHQ6IDcwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjM7XFxuICBmb250LXN0eWxlOiBpdGFsaWM7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wMTI1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bS1BcnRpY2xlIC5zcGVjdHJ1bS1IZWFkaW5nMyBzdHJvbmcge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiAyMnB4O1xcbiAgZm9udC13ZWlnaHQ6IDkwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjM7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wMTI1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bS1BcnRpY2xlIC5zcGVjdHJ1bS1IZWFkaW5nNCxcXG4uc3BlY3RydW0tQXJ0aWNsZSAuc3BlY3RydW0tSGVhZGluZy0tc3VidGl0bGUxIHtcXG4gICAgICAgICAgZm9udC1zaXplOiAxOHB4O1xcbiAgZm9udC13ZWlnaHQ6IDcwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjM7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wMTI1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgbWFyZ2luLWJvdHRvbTogOHB4O1xcbiAgICAgICAgICBtYXJnaW4tdG9wOiA4cHg7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLUhlYWRpbmc0IGVtLFxcbi5zcGVjdHJ1bS1BcnRpY2xlIC5zcGVjdHJ1bS1IZWFkaW5nLS1zdWJ0aXRsZTEgZW0ge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiAxOHB4O1xcbiAgZm9udC13ZWlnaHQ6IDcwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjM7XFxuICBmb250LXN0eWxlOiBpdGFsaWM7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wMTI1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bS1BcnRpY2xlIC5zcGVjdHJ1bS1IZWFkaW5nNCBzdHJvbmcsXFxuLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLUhlYWRpbmctLXN1YnRpdGxlMSBzdHJvbmcge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiAxOHB4O1xcbiAgZm9udC13ZWlnaHQ6IDkwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjM7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wMTI1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bS1BcnRpY2xlIC5zcGVjdHJ1bS1IZWFkaW5nNSB7XFxuICAgICAgICAgIGZvbnQtc2l6ZTogMTZweDtcXG4gIGZvbnQtd2VpZ2h0OiA3MDA7XFxuICBsaW5lLWhlaWdodDogMS4zO1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDEyNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIG1hcmdpbi1ib3R0b206IDhweDtcXG4gICAgICAgICAgbWFyZ2luLXRvcDogOHB4O1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS1BcnRpY2xlIC5zcGVjdHJ1bS1IZWFkaW5nNSBlbSB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDE2cHg7XFxuICBmb250LXdlaWdodDogNzAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuMztcXG4gIGZvbnQtc3R5bGU6IGl0YWxpYztcXG4gIGxldHRlci1zcGFjaW5nOiAwLjAxMjVlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLUhlYWRpbmc1IHN0cm9uZyB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDE2cHg7XFxuICBmb250LXdlaWdodDogOTAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuMztcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjAxMjVlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLUhlYWRpbmc2LFxcbi5zcGVjdHJ1bS1BcnRpY2xlIC5zcGVjdHJ1bS1IZWFkaW5nLS1zdWJ0aXRsZTIge1xcbiAgICAgICAgICBmb250LXNpemU6IDE0cHg7XFxuICBmb250LXdlaWdodDogNzAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuMztcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjAxMjVlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICBtYXJnaW4tYm90dG9tOiA4cHg7XFxuICAgICAgICAgIG1hcmdpbi10b3A6IDhweDtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tQXJ0aWNsZSAuc3BlY3RydW0tSGVhZGluZzYgZW0sXFxuLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLUhlYWRpbmctLXN1YnRpdGxlMiBlbSB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDE0cHg7XFxuICBmb250LXdlaWdodDogNzAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuMztcXG4gIGZvbnQtc3R5bGU6IGl0YWxpYztcXG4gIGxldHRlci1zcGFjaW5nOiAwLjAxMjVlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLUhlYWRpbmc2IHN0cm9uZyxcXG4uc3BlY3RydW0tQXJ0aWNsZSAuc3BlY3RydW0tSGVhZGluZy0tc3VidGl0bGUyIHN0cm9uZyB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDE0cHg7XFxuICBmb250LXdlaWdodDogOTAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuMztcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjAxMjVlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLVN1YmhlYWRpbmcsXFxuLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLUhlYWRpbmctLXN1YnRpdGxlMyB7XFxuICAgICAgICAgIGZvbnQtc2l6ZTogMTFweDtcXG4gIGZvbnQtd2VpZ2h0OiA3MDA7XFxuICBsaW5lLWhlaWdodDogMS4zO1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDZlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XFxuXFxuICAgICAgICAgIG1hcmdpbi1ib3R0b206IDhweDtcXG4gICAgICAgICAgbWFyZ2luLXRvcDogOHB4O1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS1BcnRpY2xlIC5zcGVjdHJ1bS1TdWJoZWFkaW5nIGVtLFxcbi5zcGVjdHJ1bS1BcnRpY2xlIC5zcGVjdHJ1bS1IZWFkaW5nLS1zdWJ0aXRsZTMgZW0ge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiAxMXB4O1xcbiAgZm9udC13ZWlnaHQ6IDcwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjM7XFxuICBmb250LXN0eWxlOiBpdGFsaWM7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wNmVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bS1BcnRpY2xlIC5zcGVjdHJ1bS1TdWJoZWFkaW5nIHN0cm9uZyxcXG4uc3BlY3RydW0tQXJ0aWNsZSAuc3BlY3RydW0tSGVhZGluZy0tc3VidGl0bGUzIHN0cm9uZyB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDExcHg7XFxuICBmb250LXdlaWdodDogOTAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuMztcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjA2ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLURldGFpbCB7XFxuICAgICAgICAgIGZvbnQtc2l6ZTogMTFweDtcXG4gIGZvbnQtd2VpZ2h0OiA0MDA7XFxuICBsaW5lLWhlaWdodDogMS41O1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDZlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XFxuXFxuICAgICAgICAgIG1hcmdpbi1ib3R0b206IDE2cHg7XFxuICAgICAgICAgIG1hcmdpbi10b3A6IDhweDtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tQXJ0aWNsZSAuc3BlY3RydW0tRGV0YWlsIGVtIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogMTFweDtcXG4gIGZvbnQtd2VpZ2h0OiA0MDA7XFxuICBsaW5lLWhlaWdodDogMS41O1xcbiAgZm9udC1zdHlsZTogaXRhbGljO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDZlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW0tQXJ0aWNsZSAuc3BlY3RydW0tRGV0YWlsIHN0cm9uZyB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDExcHg7XFxuICBmb250LXdlaWdodDogNzAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjA2ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLUhlYWRpbmcxLS1xdWlldCB7XFxuICAgICAgICAgIGZvbnQtc2l6ZTogMzZweDtcXG4gIGZvbnQtd2VpZ2h0OiA0MDA7XFxuICBsaW5lLWhlaWdodDogMS4zO1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDEyNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIG1hcmdpbi1ib3R0b206IDhweDtcXG4gICAgICAgICAgbWFyZ2luLXRvcDogOHB4O1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS1BcnRpY2xlIC5zcGVjdHJ1bS1IZWFkaW5nMS0tcXVpZXQgZW0ge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiAzNnB4O1xcbiAgZm9udC13ZWlnaHQ6IDQwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjM7XFxuICBmb250LXN0eWxlOiBpdGFsaWM7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wMTI1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bS1BcnRpY2xlIC5zcGVjdHJ1bS1IZWFkaW5nMS0tcXVpZXQgc3Ryb25nIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogMzZweDtcXG4gIGZvbnQtd2VpZ2h0OiA5MDA7XFxuICBsaW5lLWhlaWdodDogMS4zO1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDEyNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW0tQXJ0aWNsZSAuc3BlY3RydW0tSGVhZGluZzItLXF1aWV0LFxcbi5zcGVjdHJ1bS1BcnRpY2xlIC5zcGVjdHJ1bS1IZWFkaW5nLS1wYWdlVGl0bGUge1xcbiAgICAgICAgICBmb250LXNpemU6IDI4cHg7XFxuICBmb250LXdlaWdodDogNDAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuMztcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjAxMjVlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICBtYXJnaW4tYm90dG9tOiA4cHg7XFxuICAgICAgICAgIG1hcmdpbi10b3A6IDhweDtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tQXJ0aWNsZSAuc3BlY3RydW0tSGVhZGluZzItLXF1aWV0IGVtLFxcbi5zcGVjdHJ1bS1BcnRpY2xlIC5zcGVjdHJ1bS1IZWFkaW5nLS1wYWdlVGl0bGUgZW0ge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiAyOHB4O1xcbiAgZm9udC13ZWlnaHQ6IDQwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjM7XFxuICBmb250LXN0eWxlOiBpdGFsaWM7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wMTI1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bS1BcnRpY2xlIC5zcGVjdHJ1bS1IZWFkaW5nMi0tcXVpZXQgc3Ryb25nLFxcbi5zcGVjdHJ1bS1BcnRpY2xlIC5zcGVjdHJ1bS1IZWFkaW5nLS1wYWdlVGl0bGUgc3Ryb25nIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogMjhweDtcXG4gIGZvbnQtd2VpZ2h0OiA5MDA7XFxuICBsaW5lLWhlaWdodDogMS4zO1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDEyNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW0tQXJ0aWNsZSAuc3BlY3RydW0tSGVhZGluZzEtLWRpc3BsYXkge1xcbiAgICAgICAgICBmb250LXNpemU6IDQ1cHg7XFxuICBmb250LXdlaWdodDogNzAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuMztcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjAxMjVlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICBtYXJnaW4tYm90dG9tOiA4cHg7XFxuICAgICAgICAgIG1hcmdpbi10b3A6IDhweDtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tQXJ0aWNsZSAuc3BlY3RydW0tSGVhZGluZzEtLWRpc3BsYXkgZW0ge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiA0NXB4O1xcbiAgZm9udC13ZWlnaHQ6IDcwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjM7XFxuICBmb250LXN0eWxlOiBpdGFsaWM7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wMTI1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bS1BcnRpY2xlIC5zcGVjdHJ1bS1IZWFkaW5nMS0tZGlzcGxheSBzdHJvbmcge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiA0NXB4O1xcbiAgZm9udC13ZWlnaHQ6IDkwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjM7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wMTI1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bS1BcnRpY2xlIC5zcGVjdHJ1bS1IZWFkaW5nMi0tZGlzcGxheSB7XFxuICAgICAgICAgIGZvbnQtc2l6ZTogNDBweDtcXG4gIGZvbnQtd2VpZ2h0OiA3MDA7XFxuICBsaW5lLWhlaWdodDogMS4zO1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDEyNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIG1hcmdpbi1ib3R0b206IDhweDtcXG4gICAgICAgICAgbWFyZ2luLXRvcDogOHB4O1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS1BcnRpY2xlIC5zcGVjdHJ1bS1IZWFkaW5nMi0tZGlzcGxheSBlbSB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDQwcHg7XFxuICBmb250LXdlaWdodDogNzAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuMztcXG4gIGZvbnQtc3R5bGU6IGl0YWxpYztcXG4gIGxldHRlci1zcGFjaW5nOiAwLjAxMjVlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLUhlYWRpbmcyLS1kaXNwbGF5IHN0cm9uZyB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDQwcHg7XFxuICBmb250LXdlaWdodDogOTAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuMztcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjAxMjVlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLUhlYWRpbmcxLS1kaXNwbGF5LnNwZWN0cnVtLUhlYWRpbmcxLS1xdWlldCB7XFxuICAgICAgICAgIGZvbnQtc2l6ZTogNDVweDtcXG4gIGZvbnQtd2VpZ2h0OiA0MDA7XFxuICBsaW5lLWhlaWdodDogMS4zO1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDEyNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIG1hcmdpbi1ib3R0b206IDhweDtcXG4gICAgICAgICAgbWFyZ2luLXRvcDogOHB4O1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS1BcnRpY2xlIC5zcGVjdHJ1bS1IZWFkaW5nMS0tZGlzcGxheS5zcGVjdHJ1bS1IZWFkaW5nMS0tcXVpZXQgZW0ge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiA0NXB4O1xcbiAgZm9udC13ZWlnaHQ6IDQwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjM7XFxuICBmb250LXN0eWxlOiBpdGFsaWM7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wMTI1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bS1BcnRpY2xlIC5zcGVjdHJ1bS1IZWFkaW5nMS0tZGlzcGxheS5zcGVjdHJ1bS1IZWFkaW5nMS0tcXVpZXQgc3Ryb25nIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogNDVweDtcXG4gIGZvbnQtd2VpZ2h0OiA3MDA7XFxuICBsaW5lLWhlaWdodDogMS4zO1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDEyNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW0tQXJ0aWNsZSAuc3BlY3RydW0tSGVhZGluZzItLWRpc3BsYXkuc3BlY3RydW0tSGVhZGluZzItLXF1aWV0LFxcbi5zcGVjdHJ1bS1BcnRpY2xlIC5zcGVjdHJ1bS1IZWFkaW5nLS1kaXNwbGF5IHtcXG4gICAgICAgICAgZm9udC1zaXplOiA0MHB4O1xcbiAgZm9udC13ZWlnaHQ6IDQwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjM7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wMTI1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgbWFyZ2luLWJvdHRvbTogOHB4O1xcbiAgICAgICAgICBtYXJnaW4tdG9wOiA4cHg7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLUhlYWRpbmcyLS1kaXNwbGF5LnNwZWN0cnVtLUhlYWRpbmcyLS1xdWlldCBlbSxcXG4uc3BlY3RydW0tQXJ0aWNsZSAuc3BlY3RydW0tSGVhZGluZy0tZGlzcGxheSBlbSB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDQwcHg7XFxuICBmb250LXdlaWdodDogNDAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuMztcXG4gIGZvbnQtc3R5bGU6IGl0YWxpYztcXG4gIGxldHRlci1zcGFjaW5nOiAwLjAxMjVlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLUhlYWRpbmcyLS1kaXNwbGF5LnNwZWN0cnVtLUhlYWRpbmcyLS1xdWlldCBzdHJvbmcsXFxuLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLUhlYWRpbmctLWRpc3BsYXkgc3Ryb25nIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogNDBweDtcXG4gIGZvbnQtd2VpZ2h0OiA3MDA7XFxuICBsaW5lLWhlaWdodDogMS4zO1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDEyNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW06bGFuZyhqYSkgLnNwZWN0cnVtLUJvZHkxLCAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUJvZHkxLCAuc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLUJvZHkxIHtcXG4gICAgICAgICAgZm9udC1zaXplOiAyMHB4O1xcbiAgZm9udC13ZWlnaHQ6IDQwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjc7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIG1hcmdpbi1ib3R0b206IDE2cHg7XFxuICAgICAgICAgIG1hcmdpbi10b3A6IDhweDtcXG4gICAgICAgIH1cXG4uc3BlY3RydW06bGFuZyhqYSkgLnNwZWN0cnVtLUJvZHkxIGVtLCAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUJvZHkxIGVtLCAuc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLUJvZHkxIGVtIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogMjBweDtcXG4gIGZvbnQtd2VpZ2h0OiA3MDA7XFxuICBsaW5lLWhlaWdodDogMS43O1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDVlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1Cb2R5MSBzdHJvbmcsIC5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tQm9keTEgc3Ryb25nLCAuc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLUJvZHkxIHN0cm9uZyB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDIwcHg7XFxuICBmb250LXdlaWdodDogOTAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNztcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjA1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tQm9keTIsXFxuLnNwZWN0cnVtOmxhbmcoa28pIC5zcGVjdHJ1bS1Cb2R5MixcXG4uc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLUJvZHkyLFxcbi5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tQm9keS0tbGFyZ2UsXFxuLnNwZWN0cnVtOmxhbmcoa28pIC5zcGVjdHJ1bS1Cb2R5LS1sYXJnZSxcXG4uc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLUJvZHktLWxhcmdlIHtcXG4gICAgICAgICAgZm9udC1zaXplOiAxOHB4O1xcbiAgZm9udC13ZWlnaHQ6IDQwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjc7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIG1hcmdpbi1ib3R0b206IDE2cHg7XFxuICAgICAgICAgIG1hcmdpbi10b3A6IDhweDtcXG4gICAgICAgIH1cXG4uc3BlY3RydW06bGFuZyhqYSkgLnNwZWN0cnVtLUJvZHkyIGVtLFxcbi5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tQm9keTIgZW0sXFxuLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1Cb2R5MiBlbSxcXG4uc3BlY3RydW06bGFuZyhqYSkgLnNwZWN0cnVtLUJvZHktLWxhcmdlIGVtLFxcbi5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tQm9keS0tbGFyZ2UgZW0sXFxuLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1Cb2R5LS1sYXJnZSBlbSB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDE4cHg7XFxuICBmb250LXdlaWdodDogNzAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNztcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjA1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tQm9keTIgc3Ryb25nLFxcbi5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tQm9keTIgc3Ryb25nLFxcbi5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tQm9keTIgc3Ryb25nLFxcbi5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tQm9keS0tbGFyZ2Ugc3Ryb25nLFxcbi5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tQm9keS0tbGFyZ2Ugc3Ryb25nLFxcbi5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tQm9keS0tbGFyZ2Ugc3Ryb25nIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogMThweDtcXG4gIGZvbnQtd2VpZ2h0OiA5MDA7XFxuICBsaW5lLWhlaWdodDogMS43O1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDVlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1Cb2R5MywgLnNwZWN0cnVtOmxhbmcoa28pIC5zcGVjdHJ1bS1Cb2R5MywgLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1Cb2R5MyB7XFxuICAgICAgICAgIGZvbnQtc2l6ZTogMTZweDtcXG4gIGZvbnQtd2VpZ2h0OiA0MDA7XFxuICBsaW5lLWhlaWdodDogMS43O1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDVlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICBtYXJnaW4tYm90dG9tOiAxNnB4O1xcbiAgICAgICAgICBtYXJnaW4tdG9wOiA4cHg7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1Cb2R5MyBlbSwgLnNwZWN0cnVtOmxhbmcoa28pIC5zcGVjdHJ1bS1Cb2R5MyBlbSwgLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1Cb2R5MyBlbSB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDE2cHg7XFxuICBmb250LXdlaWdodDogNzAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNztcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjA1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tQm9keTMgc3Ryb25nLCAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUJvZHkzIHN0cm9uZywgLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1Cb2R5MyBzdHJvbmcge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiAxNnB4O1xcbiAgZm9udC13ZWlnaHQ6IDkwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjc7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW06bGFuZyhqYSkgLnNwZWN0cnVtLUJvZHk0LFxcbi5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tQm9keTQsXFxuLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1Cb2R5NCxcXG4uc3BlY3RydW06bGFuZyhqYSkgLnNwZWN0cnVtLUJvZHktLXNlY29uZGFyeSxcXG4uc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUJvZHktLXNlY29uZGFyeSxcXG4uc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLUJvZHktLXNlY29uZGFyeSB7XFxuICAgICAgICAgIGZvbnQtc2l6ZTogMTRweDtcXG4gIGZvbnQtd2VpZ2h0OiA0MDA7XFxuICBsaW5lLWhlaWdodDogMS43O1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDVlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICBtYXJnaW4tYm90dG9tOiAxNnB4O1xcbiAgICAgICAgICBtYXJnaW4tdG9wOiA4cHg7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1Cb2R5NCBlbSxcXG4uc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUJvZHk0IGVtLFxcbi5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tQm9keTQgZW0sXFxuLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1Cb2R5LS1zZWNvbmRhcnkgZW0sXFxuLnNwZWN0cnVtOmxhbmcoa28pIC5zcGVjdHJ1bS1Cb2R5LS1zZWNvbmRhcnkgZW0sXFxuLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1Cb2R5LS1zZWNvbmRhcnkgZW0ge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiAxNHB4O1xcbiAgZm9udC13ZWlnaHQ6IDcwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjc7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW06bGFuZyhqYSkgLnNwZWN0cnVtLUJvZHk0IHN0cm9uZyxcXG4uc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUJvZHk0IHN0cm9uZyxcXG4uc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLUJvZHk0IHN0cm9uZyxcXG4uc3BlY3RydW06bGFuZyhqYSkgLnNwZWN0cnVtLUJvZHktLXNlY29uZGFyeSBzdHJvbmcsXFxuLnNwZWN0cnVtOmxhbmcoa28pIC5zcGVjdHJ1bS1Cb2R5LS1zZWNvbmRhcnkgc3Ryb25nLFxcbi5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tQm9keS0tc2Vjb25kYXJ5IHN0cm9uZyB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDE0cHg7XFxuICBmb250LXdlaWdodDogOTAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNztcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjA1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tQm9keTUsXFxuLnNwZWN0cnVtOmxhbmcoa28pIC5zcGVjdHJ1bS1Cb2R5NSxcXG4uc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLUJvZHk1LFxcbi5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tQm9keS0tc21hbGwsXFxuLnNwZWN0cnVtOmxhbmcoa28pIC5zcGVjdHJ1bS1Cb2R5LS1zbWFsbCxcXG4uc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLUJvZHktLXNtYWxsIHtcXG4gICAgICAgICAgZm9udC1zaXplOiAxMnB4O1xcbiAgZm9udC13ZWlnaHQ6IDQwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjc7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIG1hcmdpbi1ib3R0b206IDE2cHg7XFxuICAgICAgICAgIG1hcmdpbi10b3A6IDhweDtcXG4gICAgICAgIH1cXG4uc3BlY3RydW06bGFuZyhqYSkgLnNwZWN0cnVtLUJvZHk1IGVtLFxcbi5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tQm9keTUgZW0sXFxuLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1Cb2R5NSBlbSxcXG4uc3BlY3RydW06bGFuZyhqYSkgLnNwZWN0cnVtLUJvZHktLXNtYWxsIGVtLFxcbi5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tQm9keS0tc21hbGwgZW0sXFxuLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1Cb2R5LS1zbWFsbCBlbSB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDEycHg7XFxuICBmb250LXdlaWdodDogNzAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNztcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjA1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tQm9keTUgc3Ryb25nLFxcbi5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tQm9keTUgc3Ryb25nLFxcbi5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tQm9keTUgc3Ryb25nLFxcbi5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tQm9keS0tc21hbGwgc3Ryb25nLFxcbi5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tQm9keS0tc21hbGwgc3Ryb25nLFxcbi5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tQm9keS0tc21hbGwgc3Ryb25nIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogMTJweDtcXG4gIGZvbnQtd2VpZ2h0OiA5MDA7XFxuICBsaW5lLWhlaWdodDogMS43O1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDVlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1IZWFkaW5nMSwgLnNwZWN0cnVtOmxhbmcoa28pIC5zcGVjdHJ1bS1IZWFkaW5nMSwgLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1IZWFkaW5nMSB7XFxuICAgICAgICAgIGZvbnQtc2l6ZTogMzJweDtcXG4gIGZvbnQtd2VpZ2h0OiA3MDA7XFxuICBsaW5lLWhlaWdodDogMS41O1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDVlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICBtYXJnaW4tYm90dG9tOiA4cHg7XFxuICAgICAgICAgIG1hcmdpbi10b3A6IDhweDtcXG4gICAgICAgIH1cXG4uc3BlY3RydW06bGFuZyhqYSkgLnNwZWN0cnVtLUhlYWRpbmcxIGVtLCAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUhlYWRpbmcxIGVtLCAuc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLUhlYWRpbmcxIGVtIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogMzJweDtcXG4gIGZvbnQtd2VpZ2h0OiA4MDA7XFxuICBsaW5lLWhlaWdodDogMS41O1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDVlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1IZWFkaW5nMSBzdHJvbmcsIC5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tSGVhZGluZzEgc3Ryb25nLCAuc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLUhlYWRpbmcxIHN0cm9uZyB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDMycHg7XFxuICBmb250LXdlaWdodDogOTAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjA1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tSGVhZGluZzIsIC5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tSGVhZGluZzIsIC5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tSGVhZGluZzIge1xcbiAgICAgICAgICBmb250LXNpemU6IDI1cHg7XFxuICBmb250LXdlaWdodDogNzAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjA1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgbWFyZ2luLWJvdHRvbTogOHB4O1xcbiAgICAgICAgICBtYXJnaW4tdG9wOiA4cHg7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1IZWFkaW5nMiBlbSwgLnNwZWN0cnVtOmxhbmcoa28pIC5zcGVjdHJ1bS1IZWFkaW5nMiBlbSwgLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1IZWFkaW5nMiBlbSB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDI1cHg7XFxuICBmb250LXdlaWdodDogODAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjA1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tSGVhZGluZzIgc3Ryb25nLCAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUhlYWRpbmcyIHN0cm9uZywgLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1IZWFkaW5nMiBzdHJvbmcge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiAyNXB4O1xcbiAgZm9udC13ZWlnaHQ6IDkwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjU7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW06bGFuZyhqYSkgLnNwZWN0cnVtLUhlYWRpbmczLCAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUhlYWRpbmczLCAuc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLUhlYWRpbmczIHtcXG4gICAgICAgICAgZm9udC1zaXplOiAyMHB4O1xcbiAgZm9udC13ZWlnaHQ6IDcwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjU7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIG1hcmdpbi1ib3R0b206IDhweDtcXG4gICAgICAgICAgbWFyZ2luLXRvcDogOHB4O1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tSGVhZGluZzMgZW0sIC5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tSGVhZGluZzMgZW0sIC5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tSGVhZGluZzMgZW0ge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiAyMHB4O1xcbiAgZm9udC13ZWlnaHQ6IDgwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjU7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW06bGFuZyhqYSkgLnNwZWN0cnVtLUhlYWRpbmczIHN0cm9uZywgLnNwZWN0cnVtOmxhbmcoa28pIC5zcGVjdHJ1bS1IZWFkaW5nMyBzdHJvbmcsIC5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tSGVhZGluZzMgc3Ryb25nIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogMjBweDtcXG4gIGZvbnQtd2VpZ2h0OiA5MDA7XFxuICBsaW5lLWhlaWdodDogMS41O1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDVlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1IZWFkaW5nNCxcXG4uc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUhlYWRpbmc0LFxcbi5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tSGVhZGluZzQsXFxuLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1IZWFkaW5nLS1zdWJ0aXRsZTEsXFxuLnNwZWN0cnVtOmxhbmcoa28pIC5zcGVjdHJ1bS1IZWFkaW5nLS1zdWJ0aXRsZTEsXFxuLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1IZWFkaW5nLS1zdWJ0aXRsZTEge1xcbiAgICAgICAgICBmb250LXNpemU6IDE4cHg7XFxuICBmb250LXdlaWdodDogNzAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjA1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgbWFyZ2luLWJvdHRvbTogOHB4O1xcbiAgICAgICAgICBtYXJnaW4tdG9wOiA4cHg7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1IZWFkaW5nNCBlbSxcXG4uc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUhlYWRpbmc0IGVtLFxcbi5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tSGVhZGluZzQgZW0sXFxuLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1IZWFkaW5nLS1zdWJ0aXRsZTEgZW0sXFxuLnNwZWN0cnVtOmxhbmcoa28pIC5zcGVjdHJ1bS1IZWFkaW5nLS1zdWJ0aXRsZTEgZW0sXFxuLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1IZWFkaW5nLS1zdWJ0aXRsZTEgZW0ge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiAxOHB4O1xcbiAgZm9udC13ZWlnaHQ6IDgwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjU7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW06bGFuZyhqYSkgLnNwZWN0cnVtLUhlYWRpbmc0IHN0cm9uZyxcXG4uc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUhlYWRpbmc0IHN0cm9uZyxcXG4uc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLUhlYWRpbmc0IHN0cm9uZyxcXG4uc3BlY3RydW06bGFuZyhqYSkgLnNwZWN0cnVtLUhlYWRpbmctLXN1YnRpdGxlMSBzdHJvbmcsXFxuLnNwZWN0cnVtOmxhbmcoa28pIC5zcGVjdHJ1bS1IZWFkaW5nLS1zdWJ0aXRsZTEgc3Ryb25nLFxcbi5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tSGVhZGluZy0tc3VidGl0bGUxIHN0cm9uZyB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDE4cHg7XFxuICBmb250LXdlaWdodDogOTAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjA1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tSGVhZGluZzUsIC5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tSGVhZGluZzUsIC5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tSGVhZGluZzUge1xcbiAgICAgICAgICBmb250LXNpemU6IDE2cHg7XFxuICBmb250LXdlaWdodDogNzAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjA1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgbWFyZ2luLWJvdHRvbTogOHB4O1xcbiAgICAgICAgICBtYXJnaW4tdG9wOiA4cHg7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1IZWFkaW5nNSBlbSwgLnNwZWN0cnVtOmxhbmcoa28pIC5zcGVjdHJ1bS1IZWFkaW5nNSBlbSwgLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1IZWFkaW5nNSBlbSB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDE2cHg7XFxuICBmb250LXdlaWdodDogODAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjA1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tSGVhZGluZzUgc3Ryb25nLCAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUhlYWRpbmc1IHN0cm9uZywgLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1IZWFkaW5nNSBzdHJvbmcge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiAxNnB4O1xcbiAgZm9udC13ZWlnaHQ6IDkwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjU7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW06bGFuZyhqYSkgLnNwZWN0cnVtLUhlYWRpbmc2LFxcbi5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tSGVhZGluZzYsXFxuLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1IZWFkaW5nNixcXG4uc3BlY3RydW06bGFuZyhqYSkgLnNwZWN0cnVtLUhlYWRpbmctLXN1YnRpdGxlMixcXG4uc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUhlYWRpbmctLXN1YnRpdGxlMixcXG4uc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLUhlYWRpbmctLXN1YnRpdGxlMiB7XFxuICAgICAgICAgIGZvbnQtc2l6ZTogMTRweDtcXG4gIGZvbnQtd2VpZ2h0OiA3MDA7XFxuICBsaW5lLWhlaWdodDogMS41O1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDVlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICBtYXJnaW4tYm90dG9tOiA4cHg7XFxuICAgICAgICAgIG1hcmdpbi10b3A6IDhweDtcXG4gICAgICAgIH1cXG4uc3BlY3RydW06bGFuZyhqYSkgLnNwZWN0cnVtLUhlYWRpbmc2IGVtLFxcbi5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tSGVhZGluZzYgZW0sXFxuLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1IZWFkaW5nNiBlbSxcXG4uc3BlY3RydW06bGFuZyhqYSkgLnNwZWN0cnVtLUhlYWRpbmctLXN1YnRpdGxlMiBlbSxcXG4uc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUhlYWRpbmctLXN1YnRpdGxlMiBlbSxcXG4uc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLUhlYWRpbmctLXN1YnRpdGxlMiBlbSB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDE0cHg7XFxuICBmb250LXdlaWdodDogODAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjA1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tSGVhZGluZzYgc3Ryb25nLFxcbi5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tSGVhZGluZzYgc3Ryb25nLFxcbi5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tSGVhZGluZzYgc3Ryb25nLFxcbi5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tSGVhZGluZy0tc3VidGl0bGUyIHN0cm9uZyxcXG4uc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUhlYWRpbmctLXN1YnRpdGxlMiBzdHJvbmcsXFxuLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1IZWFkaW5nLS1zdWJ0aXRsZTIgc3Ryb25nIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogMTRweDtcXG4gIGZvbnQtd2VpZ2h0OiA5MDA7XFxuICBsaW5lLWhlaWdodDogMS41O1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDVlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1TdWJoZWFkaW5nLFxcbi5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tU3ViaGVhZGluZyxcXG4uc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLVN1YmhlYWRpbmcsXFxuLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1IZWFkaW5nLS1zdWJ0aXRsZTMsXFxuLnNwZWN0cnVtOmxhbmcoa28pIC5zcGVjdHJ1bS1IZWFkaW5nLS1zdWJ0aXRsZTMsXFxuLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1IZWFkaW5nLS1zdWJ0aXRsZTMge1xcbiAgICAgICAgICBmb250LXNpemU6IDExcHg7XFxuICBmb250LXdlaWdodDogNzAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuMztcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjA2ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xcblxcbiAgICAgICAgICBtYXJnaW4tYm90dG9tOiA4cHg7XFxuICAgICAgICAgIG1hcmdpbi10b3A6IDhweDtcXG4gICAgICAgIH1cXG4uc3BlY3RydW06bGFuZyhqYSkgLnNwZWN0cnVtLVN1YmhlYWRpbmcgZW0sXFxuLnNwZWN0cnVtOmxhbmcoa28pIC5zcGVjdHJ1bS1TdWJoZWFkaW5nIGVtLFxcbi5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tU3ViaGVhZGluZyBlbSxcXG4uc3BlY3RydW06bGFuZyhqYSkgLnNwZWN0cnVtLUhlYWRpbmctLXN1YnRpdGxlMyBlbSxcXG4uc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUhlYWRpbmctLXN1YnRpdGxlMyBlbSxcXG4uc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLUhlYWRpbmctLXN1YnRpdGxlMyBlbSB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDExcHg7XFxuICBmb250LXdlaWdodDogODAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuMztcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjA2ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1TdWJoZWFkaW5nIHN0cm9uZyxcXG4uc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLVN1YmhlYWRpbmcgc3Ryb25nLFxcbi5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tU3ViaGVhZGluZyBzdHJvbmcsXFxuLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1IZWFkaW5nLS1zdWJ0aXRsZTMgc3Ryb25nLFxcbi5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tSGVhZGluZy0tc3VidGl0bGUzIHN0cm9uZyxcXG4uc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLUhlYWRpbmctLXN1YnRpdGxlMyBzdHJvbmcge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiAxMXB4O1xcbiAgZm9udC13ZWlnaHQ6IDkwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjM7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wNmVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tRGV0YWlsLCAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLURldGFpbCwgLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1EZXRhaWwge1xcbiAgICAgICAgICBmb250LXNpemU6IDExcHg7XFxuICBmb250LXdlaWdodDogNDAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNztcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjA2ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xcblxcbiAgICAgICAgICBtYXJnaW4tYm90dG9tOiAxNnB4O1xcbiAgICAgICAgICBtYXJnaW4tdG9wOiA4cHg7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1EZXRhaWwgZW0sIC5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tRGV0YWlsIGVtLCAuc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLURldGFpbCBlbSB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDExcHg7XFxuICBmb250LXdlaWdodDogNDAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNztcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjA2ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1EZXRhaWwgc3Ryb25nLCAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLURldGFpbCBzdHJvbmcsIC5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tRGV0YWlsIHN0cm9uZyB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDExcHg7XFxuICBmb250LXdlaWdodDogOTAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNztcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjA2ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1IZWFkaW5nMS0tcXVpZXQsIC5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tSGVhZGluZzEtLXF1aWV0LCAuc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLUhlYWRpbmcxLS1xdWlldCB7XFxuICAgICAgICAgIGZvbnQtc2l6ZTogMzJweDtcXG4gIGZvbnQtd2VpZ2h0OiAzMDA7XFxuICBsaW5lLWhlaWdodDogMS41O1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDVlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICBtYXJnaW4tYm90dG9tOiA4cHg7XFxuICAgICAgICAgIG1hcmdpbi10b3A6IDhweDtcXG4gICAgICAgIH1cXG4uc3BlY3RydW06bGFuZyhqYSkgLnNwZWN0cnVtLUhlYWRpbmcxLS1xdWlldCBlbSwgLnNwZWN0cnVtOmxhbmcoa28pIC5zcGVjdHJ1bS1IZWFkaW5nMS0tcXVpZXQgZW0sIC5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tSGVhZGluZzEtLXF1aWV0IGVtIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogMzJweDtcXG4gIGZvbnQtd2VpZ2h0OiA0MDA7XFxuICBsaW5lLWhlaWdodDogMS41O1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDVlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1IZWFkaW5nMS0tcXVpZXQgc3Ryb25nLCAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUhlYWRpbmcxLS1xdWlldCBzdHJvbmcsIC5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tSGVhZGluZzEtLXF1aWV0IHN0cm9uZyB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDMycHg7XFxuICBmb250LXdlaWdodDogNzAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjA1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tSGVhZGluZzItLXF1aWV0LFxcbi5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tSGVhZGluZzItLXF1aWV0LFxcbi5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tSGVhZGluZzItLXF1aWV0LFxcbi5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tSGVhZGluZy0tcGFnZVRpdGxlLFxcbi5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tSGVhZGluZy0tcGFnZVRpdGxlLFxcbi5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tSGVhZGluZy0tcGFnZVRpdGxlIHtcXG4gICAgICAgICAgZm9udC1zaXplOiAyNXB4O1xcbiAgZm9udC13ZWlnaHQ6IDMwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjU7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIG1hcmdpbi1ib3R0b206IDhweDtcXG4gICAgICAgICAgbWFyZ2luLXRvcDogOHB4O1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tSGVhZGluZzItLXF1aWV0IGVtLFxcbi5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tSGVhZGluZzItLXF1aWV0IGVtLFxcbi5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tSGVhZGluZzItLXF1aWV0IGVtLFxcbi5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tSGVhZGluZy0tcGFnZVRpdGxlIGVtLFxcbi5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tSGVhZGluZy0tcGFnZVRpdGxlIGVtLFxcbi5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tSGVhZGluZy0tcGFnZVRpdGxlIGVtIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogMjVweDtcXG4gIGZvbnQtd2VpZ2h0OiA0MDA7XFxuICBsaW5lLWhlaWdodDogMS41O1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDVlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1IZWFkaW5nMi0tcXVpZXQgc3Ryb25nLFxcbi5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tSGVhZGluZzItLXF1aWV0IHN0cm9uZyxcXG4uc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLUhlYWRpbmcyLS1xdWlldCBzdHJvbmcsXFxuLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1IZWFkaW5nLS1wYWdlVGl0bGUgc3Ryb25nLFxcbi5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tSGVhZGluZy0tcGFnZVRpdGxlIHN0cm9uZyxcXG4uc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLUhlYWRpbmctLXBhZ2VUaXRsZSBzdHJvbmcge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiAyNXB4O1xcbiAgZm9udC13ZWlnaHQ6IDcwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjU7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW06bGFuZyhqYSkgLnNwZWN0cnVtLUhlYWRpbmcxLS1zdHJvbmcsIC5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tSGVhZGluZzEtLXN0cm9uZywgLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1IZWFkaW5nMS0tc3Ryb25nIHtcXG4gICAgICAgICAgZm9udC1zaXplOiAzMnB4O1xcbiAgZm9udC13ZWlnaHQ6IDkwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjU7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIG1hcmdpbi1ib3R0b206IDhweDtcXG4gICAgICAgICAgbWFyZ2luLXRvcDogOHB4O1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tSGVhZGluZzEtLXN0cm9uZyBlbSwgLnNwZWN0cnVtOmxhbmcoa28pIC5zcGVjdHJ1bS1IZWFkaW5nMS0tc3Ryb25nIGVtLCAuc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLUhlYWRpbmcxLS1zdHJvbmcgZW0ge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiAzMnB4O1xcbiAgZm9udC13ZWlnaHQ6IDkwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjU7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW06bGFuZyhqYSkgLnNwZWN0cnVtLUhlYWRpbmcxLS1zdHJvbmcgc3Ryb25nLCAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUhlYWRpbmcxLS1zdHJvbmcgc3Ryb25nLCAuc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLUhlYWRpbmcxLS1zdHJvbmcgc3Ryb25nIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogMzJweDtcXG4gIGZvbnQtd2VpZ2h0OiA5MDA7XFxuICBsaW5lLWhlaWdodDogMS41O1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDVlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1IZWFkaW5nMi0tc3Ryb25nLCAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUhlYWRpbmcyLS1zdHJvbmcsIC5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tSGVhZGluZzItLXN0cm9uZyB7XFxuICAgICAgICAgIGZvbnQtc2l6ZTogMjVweDtcXG4gIGZvbnQtd2VpZ2h0OiA5MDA7XFxuICBsaW5lLWhlaWdodDogMS41O1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDVlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICBtYXJnaW4tYm90dG9tOiA4cHg7XFxuICAgICAgICAgIG1hcmdpbi10b3A6IDhweDtcXG4gICAgICAgIH1cXG4uc3BlY3RydW06bGFuZyhqYSkgLnNwZWN0cnVtLUhlYWRpbmcyLS1zdHJvbmcgZW0sIC5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tSGVhZGluZzItLXN0cm9uZyBlbSwgLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1IZWFkaW5nMi0tc3Ryb25nIGVtIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogMjVweDtcXG4gIGZvbnQtd2VpZ2h0OiA5MDA7XFxuICBsaW5lLWhlaWdodDogMS41O1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDVlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1IZWFkaW5nMi0tc3Ryb25nIHN0cm9uZywgLnNwZWN0cnVtOmxhbmcoa28pIC5zcGVjdHJ1bS1IZWFkaW5nMi0tc3Ryb25nIHN0cm9uZywgLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1IZWFkaW5nMi0tc3Ryb25nIHN0cm9uZyB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDI1cHg7XFxuICBmb250LXdlaWdodDogOTAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjA1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tSGVhZGluZzEtLWRpc3BsYXksIC5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tSGVhZGluZzEtLWRpc3BsYXksIC5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tSGVhZGluZzEtLWRpc3BsYXkge1xcbiAgICAgICAgICBmb250LXNpemU6IDQwcHg7XFxuICBmb250LXdlaWdodDogNzAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjA1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgbWFyZ2luLWJvdHRvbTogOHB4O1xcbiAgICAgICAgICBtYXJnaW4tdG9wOiA4cHg7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1IZWFkaW5nMS0tZGlzcGxheSBlbSwgLnNwZWN0cnVtOmxhbmcoa28pIC5zcGVjdHJ1bS1IZWFkaW5nMS0tZGlzcGxheSBlbSwgLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1IZWFkaW5nMS0tZGlzcGxheSBlbSB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDQwcHg7XFxuICBmb250LXdlaWdodDogODAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjA1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tSGVhZGluZzEtLWRpc3BsYXkgc3Ryb25nLCAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUhlYWRpbmcxLS1kaXNwbGF5IHN0cm9uZywgLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1IZWFkaW5nMS0tZGlzcGxheSBzdHJvbmcge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiA0MHB4O1xcbiAgZm9udC13ZWlnaHQ6IDkwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjU7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW06bGFuZyhqYSkgLnNwZWN0cnVtLUhlYWRpbmcyLS1kaXNwbGF5LCAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUhlYWRpbmcyLS1kaXNwbGF5LCAuc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLUhlYWRpbmcyLS1kaXNwbGF5IHtcXG4gICAgICAgICAgZm9udC1zaXplOiAzNnB4O1xcbiAgZm9udC13ZWlnaHQ6IDcwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjU7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIG1hcmdpbi1ib3R0b206IDhweDtcXG4gICAgICAgICAgbWFyZ2luLXRvcDogOHB4O1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tSGVhZGluZzItLWRpc3BsYXkgZW0sIC5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tSGVhZGluZzItLWRpc3BsYXkgZW0sIC5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tSGVhZGluZzItLWRpc3BsYXkgZW0ge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiAzNnB4O1xcbiAgZm9udC13ZWlnaHQ6IDgwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjU7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW06bGFuZyhqYSkgLnNwZWN0cnVtLUhlYWRpbmcyLS1kaXNwbGF5IHN0cm9uZywgLnNwZWN0cnVtOmxhbmcoa28pIC5zcGVjdHJ1bS1IZWFkaW5nMi0tZGlzcGxheSBzdHJvbmcsIC5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tSGVhZGluZzItLWRpc3BsYXkgc3Ryb25nIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogMzZweDtcXG4gIGZvbnQtd2VpZ2h0OiA5MDA7XFxuICBsaW5lLWhlaWdodDogMS41O1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDVlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1IZWFkaW5nMS0tZGlzcGxheS5zcGVjdHJ1bS1IZWFkaW5nMS0tc3Ryb25nLCAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUhlYWRpbmcxLS1kaXNwbGF5LnNwZWN0cnVtLUhlYWRpbmcxLS1zdHJvbmcsIC5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tSGVhZGluZzEtLWRpc3BsYXkuc3BlY3RydW0tSGVhZGluZzEtLXN0cm9uZyB7XFxuICAgICAgICAgIGZvbnQtc2l6ZTogNDBweDtcXG4gIGZvbnQtd2VpZ2h0OiA5MDA7XFxuICBsaW5lLWhlaWdodDogMS41O1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDVlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICBtYXJnaW4tYm90dG9tOiA4cHg7XFxuICAgICAgICAgIG1hcmdpbi10b3A6IDhweDtcXG4gICAgICAgIH1cXG4uc3BlY3RydW06bGFuZyhqYSkgLnNwZWN0cnVtLUhlYWRpbmcxLS1kaXNwbGF5LnNwZWN0cnVtLUhlYWRpbmcxLS1zdHJvbmcgZW0sIC5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tSGVhZGluZzEtLWRpc3BsYXkuc3BlY3RydW0tSGVhZGluZzEtLXN0cm9uZyBlbSwgLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1IZWFkaW5nMS0tZGlzcGxheS5zcGVjdHJ1bS1IZWFkaW5nMS0tc3Ryb25nIGVtIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogNDBweDtcXG4gIGZvbnQtd2VpZ2h0OiA5MDA7XFxuICBsaW5lLWhlaWdodDogMS41O1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDVlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1IZWFkaW5nMS0tZGlzcGxheS5zcGVjdHJ1bS1IZWFkaW5nMS0tc3Ryb25nIHN0cm9uZywgLnNwZWN0cnVtOmxhbmcoa28pIC5zcGVjdHJ1bS1IZWFkaW5nMS0tZGlzcGxheS5zcGVjdHJ1bS1IZWFkaW5nMS0tc3Ryb25nIHN0cm9uZywgLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1IZWFkaW5nMS0tZGlzcGxheS5zcGVjdHJ1bS1IZWFkaW5nMS0tc3Ryb25nIHN0cm9uZyB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDQwcHg7XFxuICBmb250LXdlaWdodDogOTAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjA1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tSGVhZGluZzItLWRpc3BsYXkuc3BlY3RydW0tSGVhZGluZzItLXN0cm9uZywgLnNwZWN0cnVtOmxhbmcoa28pIC5zcGVjdHJ1bS1IZWFkaW5nMi0tZGlzcGxheS5zcGVjdHJ1bS1IZWFkaW5nMi0tc3Ryb25nLCAuc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLUhlYWRpbmcyLS1kaXNwbGF5LnNwZWN0cnVtLUhlYWRpbmcyLS1zdHJvbmcge1xcbiAgICAgICAgICBmb250LXNpemU6IDM2cHg7XFxuICBmb250LXdlaWdodDogOTAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjA1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgbWFyZ2luLWJvdHRvbTogOHB4O1xcbiAgICAgICAgICBtYXJnaW4tdG9wOiA4cHg7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1IZWFkaW5nMi0tZGlzcGxheS5zcGVjdHJ1bS1IZWFkaW5nMi0tc3Ryb25nIGVtLCAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUhlYWRpbmcyLS1kaXNwbGF5LnNwZWN0cnVtLUhlYWRpbmcyLS1zdHJvbmcgZW0sIC5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tSGVhZGluZzItLWRpc3BsYXkuc3BlY3RydW0tSGVhZGluZzItLXN0cm9uZyBlbSB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDM2cHg7XFxuICBmb250LXdlaWdodDogOTAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjA1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tSGVhZGluZzItLWRpc3BsYXkuc3BlY3RydW0tSGVhZGluZzItLXN0cm9uZyBzdHJvbmcsIC5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tSGVhZGluZzItLWRpc3BsYXkuc3BlY3RydW0tSGVhZGluZzItLXN0cm9uZyBzdHJvbmcsIC5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tSGVhZGluZzItLWRpc3BsYXkuc3BlY3RydW0tSGVhZGluZzItLXN0cm9uZyBzdHJvbmcge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiAzNnB4O1xcbiAgZm9udC13ZWlnaHQ6IDkwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjU7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW06bGFuZyhqYSkgLnNwZWN0cnVtLUhlYWRpbmcxLS1kaXNwbGF5LnNwZWN0cnVtLUhlYWRpbmcxLS1xdWlldCwgLnNwZWN0cnVtOmxhbmcoa28pIC5zcGVjdHJ1bS1IZWFkaW5nMS0tZGlzcGxheS5zcGVjdHJ1bS1IZWFkaW5nMS0tcXVpZXQsIC5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tSGVhZGluZzEtLWRpc3BsYXkuc3BlY3RydW0tSGVhZGluZzEtLXF1aWV0IHtcXG4gICAgICAgICAgZm9udC1zaXplOiA0MHB4O1xcbiAgZm9udC13ZWlnaHQ6IDMwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjU7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIG1hcmdpbi1ib3R0b206IDhweDtcXG4gICAgICAgICAgbWFyZ2luLXRvcDogOHB4O1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tSGVhZGluZzEtLWRpc3BsYXkuc3BlY3RydW0tSGVhZGluZzEtLXF1aWV0IGVtLCAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUhlYWRpbmcxLS1kaXNwbGF5LnNwZWN0cnVtLUhlYWRpbmcxLS1xdWlldCBlbSwgLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1IZWFkaW5nMS0tZGlzcGxheS5zcGVjdHJ1bS1IZWFkaW5nMS0tcXVpZXQgZW0ge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiA0MHB4O1xcbiAgZm9udC13ZWlnaHQ6IDQwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjU7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW06bGFuZyhqYSkgLnNwZWN0cnVtLUhlYWRpbmcxLS1kaXNwbGF5LnNwZWN0cnVtLUhlYWRpbmcxLS1xdWlldCBzdHJvbmcsIC5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tSGVhZGluZzEtLWRpc3BsYXkuc3BlY3RydW0tSGVhZGluZzEtLXF1aWV0IHN0cm9uZywgLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1IZWFkaW5nMS0tZGlzcGxheS5zcGVjdHJ1bS1IZWFkaW5nMS0tcXVpZXQgc3Ryb25nIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogNDBweDtcXG4gIGZvbnQtd2VpZ2h0OiA3MDA7XFxuICBsaW5lLWhlaWdodDogMS41O1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDVlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1IZWFkaW5nMi0tZGlzcGxheS5zcGVjdHJ1bS1IZWFkaW5nMi0tcXVpZXQsXFxuLnNwZWN0cnVtOmxhbmcoa28pIC5zcGVjdHJ1bS1IZWFkaW5nMi0tZGlzcGxheS5zcGVjdHJ1bS1IZWFkaW5nMi0tcXVpZXQsXFxuLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1IZWFkaW5nMi0tZGlzcGxheS5zcGVjdHJ1bS1IZWFkaW5nMi0tcXVpZXQsXFxuLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1IZWFkaW5nLS1kaXNwbGF5LFxcbi5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tSGVhZGluZy0tZGlzcGxheSxcXG4uc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLUhlYWRpbmctLWRpc3BsYXkge1xcbiAgICAgICAgICBmb250LXNpemU6IDM2cHg7XFxuICBmb250LXdlaWdodDogMzAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjA1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgbWFyZ2luLWJvdHRvbTogOHB4O1xcbiAgICAgICAgICBtYXJnaW4tdG9wOiA4cHg7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1IZWFkaW5nMi0tZGlzcGxheS5zcGVjdHJ1bS1IZWFkaW5nMi0tcXVpZXQgZW0sXFxuLnNwZWN0cnVtOmxhbmcoa28pIC5zcGVjdHJ1bS1IZWFkaW5nMi0tZGlzcGxheS5zcGVjdHJ1bS1IZWFkaW5nMi0tcXVpZXQgZW0sXFxuLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1IZWFkaW5nMi0tZGlzcGxheS5zcGVjdHJ1bS1IZWFkaW5nMi0tcXVpZXQgZW0sXFxuLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1IZWFkaW5nLS1kaXNwbGF5IGVtLFxcbi5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tSGVhZGluZy0tZGlzcGxheSBlbSxcXG4uc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLUhlYWRpbmctLWRpc3BsYXkgZW0ge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiAzNnB4O1xcbiAgZm9udC13ZWlnaHQ6IDQwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjU7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW06bGFuZyhqYSkgLnNwZWN0cnVtLUhlYWRpbmcyLS1kaXNwbGF5LnNwZWN0cnVtLUhlYWRpbmcyLS1xdWlldCBzdHJvbmcsXFxuLnNwZWN0cnVtOmxhbmcoa28pIC5zcGVjdHJ1bS1IZWFkaW5nMi0tZGlzcGxheS5zcGVjdHJ1bS1IZWFkaW5nMi0tcXVpZXQgc3Ryb25nLFxcbi5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tSGVhZGluZzItLWRpc3BsYXkuc3BlY3RydW0tSGVhZGluZzItLXF1aWV0IHN0cm9uZyxcXG4uc3BlY3RydW06bGFuZyhqYSkgLnNwZWN0cnVtLUhlYWRpbmctLWRpc3BsYXkgc3Ryb25nLFxcbi5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tSGVhZGluZy0tZGlzcGxheSBzdHJvbmcsXFxuLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1IZWFkaW5nLS1kaXNwbGF5IHN0cm9uZyB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDM2cHg7XFxuICBmb250LXdlaWdodDogNzAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjA1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bS1Db2RlMSB7XFxuICAgICAgICAgIGZvbnQtc2l6ZTogMjBweDtcXG4gIGZvbnQtd2VpZ2h0OiA0MDA7XFxuICBsaW5lLWhlaWdodDogMS41O1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDA7XFxuXFxuICAgICAgICAgIG1hcmdpbi1ib3R0b206IDE2cHg7XFxuICAgICAgICAgIG1hcmdpbi10b3A6IDhweDtcXG4gIGZvbnQtZmFtaWx5OiBTb3VyY2UgQ29kZSBQcm8sIE1vbmFjbywgbW9ub3NwYWNlO1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS1Db2RlMSBlbSB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDIwcHg7XFxuICBmb250LXdlaWdodDogNDAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gIGZvbnQtc3R5bGU6IGl0YWxpYztcXG4gIGxldHRlci1zcGFjaW5nOiAwO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtLUNvZGUxIHN0cm9uZyB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDIwcHg7XFxuICBmb250LXdlaWdodDogNzAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtLUNvZGUyIHtcXG4gICAgICAgICAgZm9udC1zaXplOiAxOHB4O1xcbiAgZm9udC13ZWlnaHQ6IDQwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjU7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMDtcXG5cXG4gICAgICAgICAgbWFyZ2luLWJvdHRvbTogMTZweDtcXG4gICAgICAgICAgbWFyZ2luLXRvcDogOHB4O1xcbiAgZm9udC1mYW1pbHk6IFNvdXJjZSBDb2RlIFBybywgTW9uYWNvLCBtb25vc3BhY2U7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLUNvZGUyIGVtIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogMThweDtcXG4gIGZvbnQtd2VpZ2h0OiA0MDA7XFxuICBsaW5lLWhlaWdodDogMS41O1xcbiAgZm9udC1zdHlsZTogaXRhbGljO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDA7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW0tQ29kZTIgc3Ryb25nIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogMThweDtcXG4gIGZvbnQtd2VpZ2h0OiA3MDA7XFxuICBsaW5lLWhlaWdodDogMS41O1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDA7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW0tQ29kZTMge1xcbiAgICAgICAgICBmb250LXNpemU6IDE2cHg7XFxuICBmb250LXdlaWdodDogNDAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwO1xcblxcbiAgICAgICAgICBtYXJnaW4tYm90dG9tOiAxNnB4O1xcbiAgICAgICAgICBtYXJnaW4tdG9wOiA4cHg7XFxuICBmb250LWZhbWlseTogU291cmNlIENvZGUgUHJvLCBNb25hY28sIG1vbm9zcGFjZTtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tQ29kZTMgZW0ge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiAxNnB4O1xcbiAgZm9udC13ZWlnaHQ6IDQwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjU7XFxuICBmb250LXN0eWxlOiBpdGFsaWM7XFxuICBsZXR0ZXItc3BhY2luZzogMDtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bS1Db2RlMyBzdHJvbmcge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiAxNnB4O1xcbiAgZm9udC13ZWlnaHQ6IDcwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjU7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMDtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bS1Db2RlNCB7XFxuICAgICAgICAgIGZvbnQtc2l6ZTogMTRweDtcXG4gIGZvbnQtd2VpZ2h0OiA0MDA7XFxuICBsaW5lLWhlaWdodDogMS41O1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDA7XFxuXFxuICAgICAgICAgIG1hcmdpbi1ib3R0b206IDE2cHg7XFxuICAgICAgICAgIG1hcmdpbi10b3A6IDhweDtcXG4gIGZvbnQtZmFtaWx5OiBTb3VyY2UgQ29kZSBQcm8sIE1vbmFjbywgbW9ub3NwYWNlO1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS1Db2RlNCBlbSB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDE0cHg7XFxuICBmb250LXdlaWdodDogNDAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gIGZvbnQtc3R5bGU6IGl0YWxpYztcXG4gIGxldHRlci1zcGFjaW5nOiAwO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtLUNvZGU0IHN0cm9uZyB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDE0cHg7XFxuICBmb250LXdlaWdodDogNzAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtLUNvZGU1IHtcXG4gICAgICAgICAgZm9udC1zaXplOiAxMnB4O1xcbiAgZm9udC13ZWlnaHQ6IDQwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjU7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMDtcXG5cXG4gICAgICAgICAgbWFyZ2luLWJvdHRvbTogMTZweDtcXG4gICAgICAgICAgbWFyZ2luLXRvcDogOHB4O1xcbiAgZm9udC1mYW1pbHk6IFNvdXJjZSBDb2RlIFBybywgTW9uYWNvLCBtb25vc3BhY2U7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLUNvZGU1IGVtIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogMTJweDtcXG4gIGZvbnQtd2VpZ2h0OiA0MDA7XFxuICBsaW5lLWhlaWdodDogMS41O1xcbiAgZm9udC1zdHlsZTogaXRhbGljO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDA7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW0tQ29kZTUgc3Ryb25nIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogMTJweDtcXG4gIGZvbnQtd2VpZ2h0OiA3MDA7XFxuICBsaW5lLWhlaWdodDogMS41O1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDA7XFxuXFxuICAgICAgICAgIH1cXG4vKiB0b3Bkb2NcXG57eyB0eXBvZ3JhcGh5L3R5cG9ncmFwaHktZGVmYXVsdC55bWwgfX1cXG4qL1xcbi8qIHRvcGRvY1xcbnt7IHR5cG9ncmFwaHkvdHlwb2dyYXBoeS1kZXByZWNhdGVkLnltbCB9fVxcbiovXFxuLyogdG9wZG9jXFxue3sgdHlwb2dyYXBoeS90eXBvZ3JhcGh5LWFydGljbGUueW1sIH19XFxuKi9cXG4vKiB0b3Bkb2NcXG57eyB0eXBvZ3JhcGh5L3R5cG9ncmFwaHktaGFuLnltbCB9fVxcbiovXFxuLyogdG9wZG9jXFxue3sgdHlwb2dyYXBoeS90eXBvZ3JhcGh5LWhlYWRpbmcueW1sIH19XFxuKi9cXG4vKiB0b3Bkb2NcXG57eyB0eXBvZ3JhcGh5L3R5cG9ncmFwaHktaGVhZGluZy1xdWlldC55bWwgfX1cXG4qL1xcbi8qIHRvcGRvY1xcbnt7IHR5cG9ncmFwaHkvdHlwb2dyYXBoeS1oZWFkaW5nLXN0cm9uZy55bWwgfX1cXG4qL1xcbi8qIHRvcGRvY1xcbnt7IHR5cG9ncmFwaHkvdHlwb2dyYXBoeS1kaXNwbGF5LnltbCB9fVxcbiovXFxuLyogdG9wZG9jXFxue3sgdHlwb2dyYXBoeS90eXBvZ3JhcGh5LWRpc3BsYXktcXVpZXQueW1sIH19XFxuKi9cXG4vKiB0b3Bkb2NcXG57eyB0eXBvZ3JhcGh5L3R5cG9ncmFwaHktZGlzcGxheS1zdHJvbmcueW1sIH19XFxuKi9cXG4vKiB0b3Bkb2NcXG57eyB0eXBvZ3JhcGh5L3R5cG9ncmFwaHktYm9keS55bWwgfX1cXG4qL1xcbi8qIHRvcGRvY1xcbnt7IHR5cG9ncmFwaHkvdHlwb2dyYXBoeS1jb2RlLnltbCB9fVxcbiovXFxuLnNwZWN0cnVtLFxcbi5zcGVjdHJ1bS1Cb2R5IHtcXG4gIGZvbnQtc2l6ZTogMTRweDtcXG4gIGZvbnQtd2VpZ2h0OiA0MDA7XFxuICBsaW5lLWhlaWdodDogMS41O1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbn1cXG4uc3BlY3RydW0tQm9keS0taXRhbGljIHtcXG4gIGZvbnQtc3R5bGU6IGl0YWxpYztcXG59XFxuXCIsIFwiXCJdKTtcblxuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///224\n')},function(module,exports,__webpack_require__){eval('exports = module.exports = __webpack_require__(6)(false);\n// Module\nexports.push([module.i, "/* generated from dna-version: 5.0.1 */\\n.spectrum--large .spectrum {\\n  font-family: adobe-clean, \\"Source Sans Pro\\", -apple-system, BlinkMacSystemFont, \\"Segoe UI\\", Roboto, sans-serif;\\n  font-size: 17px;\\n}\\n/* generated from dna-version: 5.0.1 */\\n.spectrum--large .spectrum:lang(zh-Hans) {\\n    font-family: adobe-clean-han-japanese, -apple-system, BlinkMacSystemFont, \\"Segoe UI\\", Roboto, sans-serif;\\n  }\\n.spectrum--large .spectrum:lang(zh) {\\n    font-family: adobe-clean-han-japanese, -apple-system, BlinkMacSystemFont, \\"Segoe UI\\", Roboto, sans-serif;\\n  }\\n.spectrum--large .spectrum:lang(ko) {\\n    font-family: adobe-clean-han-japanese, -apple-system, BlinkMacSystemFont, \\"Segoe UI\\", Roboto, sans-serif;\\n  }\\n.spectrum--large .spectrum:lang(ja) {\\n    font-family: adobe-clean-han-japanese, -apple-system, BlinkMacSystemFont, \\"Segoe UI\\", Roboto, sans-serif;\\n  }\\n.spectrum--large .spectrum-Body1 {\\n          font-size: 24px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          margin-bottom: 20px;\\n          margin-top: 10px;\\n        }\\n.spectrum--large .spectrum-Body1 em {\\n              font-size: 24px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: italic;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum-Body1 strong {\\n              font-size: 24px;\\n  font-weight: 700;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum-Body2,\\n.spectrum--large .spectrum-Body--large {\\n          font-size: 22px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          margin-bottom: 20px;\\n          margin-top: 10px;\\n        }\\n.spectrum--large .spectrum-Body2 em,\\n.spectrum--large .spectrum-Body--large em {\\n              font-size: 22px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: italic;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum-Body2 strong,\\n.spectrum--large .spectrum-Body--large strong {\\n              font-size: 22px;\\n  font-weight: 700;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum-Body3 {\\n          font-size: 19px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          margin-bottom: 20px;\\n          margin-top: 10px;\\n        }\\n.spectrum--large .spectrum-Body3 em {\\n              font-size: 19px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: italic;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum-Body3 strong {\\n              font-size: 19px;\\n  font-weight: 700;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum-Body4,\\n.spectrum--large .spectrum-Body--secondary {\\n          font-size: 17px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          margin-bottom: 20px;\\n          margin-top: 10px;\\n        }\\n.spectrum--large .spectrum-Body4 em,\\n.spectrum--large .spectrum-Body--secondary em {\\n              font-size: 17px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: italic;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum-Body4 strong,\\n.spectrum--large .spectrum-Body--secondary strong {\\n              font-size: 17px;\\n  font-weight: 700;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum-Body5,\\n.spectrum--large .spectrum-Body--small {\\n          font-size: 15px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          margin-bottom: 20px;\\n          margin-top: 10px;\\n        }\\n.spectrum--large .spectrum-Body5 em,\\n.spectrum--large .spectrum-Body--small em {\\n              font-size: 15px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: italic;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum-Body5 strong,\\n.spectrum--large .spectrum-Body--small strong {\\n              font-size: 15px;\\n  font-weight: 700;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum-Heading1 {\\n          font-size: 39px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          margin-bottom: 10px;\\n          margin-top: 10px;\\n        }\\n.spectrum--large .spectrum-Heading1 em {\\n              font-size: 39px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: italic;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum-Heading1 strong {\\n              font-size: 39px;\\n  font-weight: 900;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum-Heading2 {\\n          font-size: 31px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          margin-bottom: 10px;\\n          margin-top: 10px;\\n        }\\n.spectrum--large .spectrum-Heading2 em {\\n              font-size: 31px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: italic;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum-Heading2 strong {\\n              font-size: 31px;\\n  font-weight: 900;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum-Heading3 {\\n          font-size: 24px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          margin-bottom: 10px;\\n          margin-top: 10px;\\n        }\\n.spectrum--large .spectrum-Heading3 em {\\n              font-size: 24px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: italic;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum-Heading3 strong {\\n              font-size: 24px;\\n  font-weight: 900;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum-Heading4,\\n.spectrum--large .spectrum-Heading--subtitle1 {\\n          font-size: 22px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          margin-bottom: 10px;\\n          margin-top: 10px;\\n        }\\n.spectrum--large .spectrum-Heading4 em,\\n.spectrum--large .spectrum-Heading--subtitle1 em {\\n              font-size: 22px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: italic;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum-Heading4 strong,\\n.spectrum--large .spectrum-Heading--subtitle1 strong {\\n              font-size: 22px;\\n  font-weight: 900;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum-Heading5 {\\n          font-size: 19px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          margin-bottom: 10px;\\n          margin-top: 10px;\\n        }\\n.spectrum--large .spectrum-Heading5 em {\\n              font-size: 19px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: italic;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum-Heading5 strong {\\n              font-size: 19px;\\n  font-weight: 900;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum-Heading6,\\n.spectrum--large .spectrum-Heading--subtitle2 {\\n          font-size: 17px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          margin-bottom: 10px;\\n          margin-top: 10px;\\n        }\\n.spectrum--large .spectrum-Heading6 em,\\n.spectrum--large .spectrum-Heading--subtitle2 em {\\n              font-size: 17px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: italic;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum-Heading6 strong,\\n.spectrum--large .spectrum-Heading--subtitle2 strong {\\n              font-size: 17px;\\n  font-weight: 900;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum-Subheading,\\n.spectrum--large .spectrum-Heading--subtitle3 {\\n          font-size: 13px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0.06em;\\n  text-transform: uppercase;\\n\\n          margin-bottom: 10px;\\n          margin-top: 10px;\\n        }\\n.spectrum--large .spectrum-Subheading em,\\n.spectrum--large .spectrum-Heading--subtitle3 em {\\n              font-size: 13px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: italic;\\n  letter-spacing: 0.06em;\\n  text-transform: uppercase;\\n\\n          }\\n.spectrum--large .spectrum-Subheading strong,\\n.spectrum--large .spectrum-Heading--subtitle3 strong {\\n              font-size: 13px;\\n  font-weight: 900;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0.06em;\\n  text-transform: uppercase;\\n\\n          }\\n.spectrum--large .spectrum-Detail {\\n          font-size: 13px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.06em;\\n  text-transform: uppercase;\\n\\n          margin-bottom: 20px;\\n          margin-top: 10px;\\n        }\\n.spectrum--large .spectrum-Detail em {\\n              font-size: 13px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: italic;\\n  letter-spacing: 0.06em;\\n  text-transform: uppercase;\\n\\n          }\\n.spectrum--large .spectrum-Detail strong {\\n              font-size: 13px;\\n  font-weight: 700;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.06em;\\n  text-transform: uppercase;\\n\\n          }\\n.spectrum--large .spectrum-Heading1--quiet {\\n          font-size: 39px;\\n  font-weight: 300;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          margin-bottom: 10px;\\n          margin-top: 10px;\\n        }\\n.spectrum--large .spectrum-Heading1--quiet em {\\n              font-size: 39px;\\n  font-weight: 300;\\n  line-height: 1.3;\\n  font-style: italic;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum-Heading1--quiet strong {\\n              font-size: 39px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum-Heading2--quiet,\\n.spectrum--large .spectrum-Heading--pageTitle {\\n          font-size: 31px;\\n  font-weight: 300;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          margin-bottom: 10px;\\n          margin-top: 10px;\\n        }\\n.spectrum--large .spectrum-Heading2--quiet em,\\n.spectrum--large .spectrum-Heading--pageTitle em {\\n              font-size: 31px;\\n  font-weight: 300;\\n  line-height: 1.3;\\n  font-style: italic;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum-Heading2--quiet strong,\\n.spectrum--large .spectrum-Heading--pageTitle strong {\\n              font-size: 31px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum-Heading1--strong {\\n          font-size: 39px;\\n  font-weight: 900;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          margin-bottom: 10px;\\n          margin-top: 10px;\\n        }\\n.spectrum--large .spectrum-Heading1--strong em {\\n              font-size: 39px;\\n  font-weight: 900;\\n  line-height: 1.3;\\n  font-style: italic;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum-Heading1--strong strong {\\n              font-size: 39px;\\n  font-weight: 900;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum-Heading2--strong {\\n          font-size: 31px;\\n  font-weight: 900;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          margin-bottom: 10px;\\n          margin-top: 10px;\\n        }\\n.spectrum--large .spectrum-Heading2--strong em {\\n              font-size: 31px;\\n  font-weight: 900;\\n  line-height: 1.3;\\n  font-style: italic;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum-Heading2--strong strong {\\n              font-size: 31px;\\n  font-weight: 900;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum-Heading1--display {\\n          font-size: 49px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          margin-bottom: 10px;\\n          margin-top: 10px;\\n        }\\n.spectrum--large .spectrum-Heading1--display em {\\n              font-size: 49px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: italic;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum-Heading1--display strong {\\n              font-size: 49px;\\n  font-weight: 900;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum-Heading2--display {\\n          font-size: 44px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          margin-bottom: 10px;\\n          margin-top: 10px;\\n        }\\n.spectrum--large .spectrum-Heading2--display em {\\n              font-size: 44px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: italic;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum-Heading2--display strong {\\n              font-size: 44px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum-Heading1--display.spectrum-Heading1--strong {\\n          font-size: 49px;\\n  font-weight: 900;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          margin-bottom: 10px;\\n          margin-top: 10px;\\n        }\\n.spectrum--large .spectrum-Heading1--display.spectrum-Heading1--strong em {\\n              font-size: 49px;\\n  font-weight: 900;\\n  line-height: 1.3;\\n  font-style: italic;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum-Heading1--display.spectrum-Heading1--strong strong {\\n              font-size: 49px;\\n  font-weight: 900;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum-Heading2--display.spectrum-Heading2--strong {\\n          font-size: 44px;\\n  font-weight: 900;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          margin-bottom: 10px;\\n          margin-top: 10px;\\n        }\\n.spectrum--large .spectrum-Heading2--display.spectrum-Heading2--strong em {\\n              font-size: 44px;\\n  font-weight: 900;\\n  line-height: 1.3;\\n  font-style: italic;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum-Heading2--display.spectrum-Heading2--strong strong {\\n              font-size: 44px;\\n  font-weight: 900;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum-Heading1--display.spectrum-Heading1--quiet {\\n          font-size: 49px;\\n  font-weight: 300;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          margin-bottom: 10px;\\n          margin-top: 10px;\\n        }\\n.spectrum--large .spectrum-Heading1--display.spectrum-Heading1--quiet em {\\n              font-size: 49px;\\n  font-weight: 300;\\n  line-height: 1.3;\\n  font-style: italic;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum-Heading1--display.spectrum-Heading1--quiet strong {\\n              font-size: 49px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum-Heading2--display.spectrum-Heading2--quiet,\\n.spectrum--large .spectrum-Heading--display {\\n          font-size: 44px;\\n  font-weight: 300;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          margin-bottom: 10px;\\n          margin-top: 10px;\\n        }\\n.spectrum--large .spectrum-Heading2--display.spectrum-Heading2--quiet em,\\n.spectrum--large .spectrum-Heading--display em {\\n              font-size: 44px;\\n  font-weight: 300;\\n  line-height: 1.3;\\n  font-style: italic;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum-Heading2--display.spectrum-Heading2--quiet strong,\\n.spectrum--large .spectrum-Heading--display strong {\\n              font-size: 44px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum-Article {\\n  font-family: Adobe Clean Serif, Times New Roman, serif;\\n}\\n.spectrum--large .spectrum-Article .spectrum-Body1 {\\n          font-size: 24px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          margin-bottom: 20px;\\n          margin-top: 10px;\\n        }\\n.spectrum--large .spectrum-Article .spectrum-Body1 em {\\n              font-size: 24px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: italic;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum-Article .spectrum-Body1 strong {\\n              font-size: 24px;\\n  font-weight: 900;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum-Article .spectrum-Body2,\\n.spectrum--large .spectrum-Article .spectrum-Body--large {\\n          font-size: 22px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          margin-bottom: 20px;\\n          margin-top: 10px;\\n        }\\n.spectrum--large .spectrum-Article .spectrum-Body2 em,\\n.spectrum--large .spectrum-Article .spectrum-Body--large em {\\n              font-size: 22px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: italic;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum-Article .spectrum-Body2 strong,\\n.spectrum--large .spectrum-Article .spectrum-Body--large strong {\\n              font-size: 22px;\\n  font-weight: 900;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum-Article .spectrum-Body3 {\\n          font-size: 19px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          margin-bottom: 20px;\\n          margin-top: 10px;\\n        }\\n.spectrum--large .spectrum-Article .spectrum-Body3 em {\\n              font-size: 19px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: italic;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum-Article .spectrum-Body3 strong {\\n              font-size: 19px;\\n  font-weight: 900;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum-Article .spectrum-Body4,\\n.spectrum--large .spectrum-Article .spectrum-Body--secondary {\\n          font-size: 17px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          margin-bottom: 20px;\\n          margin-top: 10px;\\n        }\\n.spectrum--large .spectrum-Article .spectrum-Body4 em,\\n.spectrum--large .spectrum-Article .spectrum-Body--secondary em {\\n              font-size: 17px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: italic;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum-Article .spectrum-Body4 strong,\\n.spectrum--large .spectrum-Article .spectrum-Body--secondary strong {\\n              font-size: 17px;\\n  font-weight: 900;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum-Article .spectrum-Body5,\\n.spectrum--large .spectrum-Article .spectrum-Body--small {\\n          font-size: 15px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          margin-bottom: 20px;\\n          margin-top: 10px;\\n        }\\n.spectrum--large .spectrum-Article .spectrum-Body5 em,\\n.spectrum--large .spectrum-Article .spectrum-Body--small em {\\n              font-size: 15px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: italic;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum-Article .spectrum-Body5 strong,\\n.spectrum--large .spectrum-Article .spectrum-Body--small strong {\\n              font-size: 15px;\\n  font-weight: 900;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum-Article .spectrum-Heading1 {\\n          font-size: 39px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          margin-bottom: 10px;\\n          margin-top: 10px;\\n        }\\n.spectrum--large .spectrum-Article .spectrum-Heading1 em {\\n              font-size: 39px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: italic;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum-Article .spectrum-Heading1 strong {\\n              font-size: 39px;\\n  font-weight: 900;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum-Article .spectrum-Heading2 {\\n          font-size: 31px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          margin-bottom: 10px;\\n          margin-top: 10px;\\n        }\\n.spectrum--large .spectrum-Article .spectrum-Heading2 em {\\n              font-size: 31px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: italic;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum-Article .spectrum-Heading2 strong {\\n              font-size: 31px;\\n  font-weight: 900;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum-Article .spectrum-Heading3 {\\n          font-size: 24px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          margin-bottom: 10px;\\n          margin-top: 10px;\\n        }\\n.spectrum--large .spectrum-Article .spectrum-Heading3 em {\\n              font-size: 24px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: italic;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum-Article .spectrum-Heading3 strong {\\n              font-size: 24px;\\n  font-weight: 900;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum-Article .spectrum-Heading4,\\n.spectrum--large .spectrum-Article .spectrum-Heading--subtitle1 {\\n          font-size: 22px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          margin-bottom: 10px;\\n          margin-top: 10px;\\n        }\\n.spectrum--large .spectrum-Article .spectrum-Heading4 em,\\n.spectrum--large .spectrum-Article .spectrum-Heading--subtitle1 em {\\n              font-size: 22px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: italic;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum-Article .spectrum-Heading4 strong,\\n.spectrum--large .spectrum-Article .spectrum-Heading--subtitle1 strong {\\n              font-size: 22px;\\n  font-weight: 900;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum-Article .spectrum-Heading5 {\\n          font-size: 19px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          margin-bottom: 10px;\\n          margin-top: 10px;\\n        }\\n.spectrum--large .spectrum-Article .spectrum-Heading5 em {\\n              font-size: 19px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: italic;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum-Article .spectrum-Heading5 strong {\\n              font-size: 19px;\\n  font-weight: 900;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum-Article .spectrum-Heading6,\\n.spectrum--large .spectrum-Article .spectrum-Heading--subtitle2 {\\n          font-size: 17px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          margin-bottom: 10px;\\n          margin-top: 10px;\\n        }\\n.spectrum--large .spectrum-Article .spectrum-Heading6 em,\\n.spectrum--large .spectrum-Article .spectrum-Heading--subtitle2 em {\\n              font-size: 17px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: italic;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum-Article .spectrum-Heading6 strong,\\n.spectrum--large .spectrum-Article .spectrum-Heading--subtitle2 strong {\\n              font-size: 17px;\\n  font-weight: 900;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum-Article .spectrum-Subheading,\\n.spectrum--large .spectrum-Article .spectrum-Heading--subtitle3 {\\n          font-size: 13px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0.06em;\\n  text-transform: uppercase;\\n\\n          margin-bottom: 10px;\\n          margin-top: 10px;\\n        }\\n.spectrum--large .spectrum-Article .spectrum-Subheading em,\\n.spectrum--large .spectrum-Article .spectrum-Heading--subtitle3 em {\\n              font-size: 13px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: italic;\\n  letter-spacing: 0.06em;\\n  text-transform: uppercase;\\n\\n          }\\n.spectrum--large .spectrum-Article .spectrum-Subheading strong,\\n.spectrum--large .spectrum-Article .spectrum-Heading--subtitle3 strong {\\n              font-size: 13px;\\n  font-weight: 900;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0.06em;\\n  text-transform: uppercase;\\n\\n          }\\n.spectrum--large .spectrum-Article .spectrum-Detail {\\n          font-size: 13px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.06em;\\n  text-transform: uppercase;\\n\\n          margin-bottom: 20px;\\n          margin-top: 10px;\\n        }\\n.spectrum--large .spectrum-Article .spectrum-Detail em {\\n              font-size: 13px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: italic;\\n  letter-spacing: 0.06em;\\n  text-transform: uppercase;\\n\\n          }\\n.spectrum--large .spectrum-Article .spectrum-Detail strong {\\n              font-size: 13px;\\n  font-weight: 700;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.06em;\\n  text-transform: uppercase;\\n\\n          }\\n.spectrum--large .spectrum-Article .spectrum-Heading1--quiet {\\n          font-size: 39px;\\n  font-weight: 400;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          margin-bottom: 10px;\\n          margin-top: 10px;\\n        }\\n.spectrum--large .spectrum-Article .spectrum-Heading1--quiet em {\\n              font-size: 39px;\\n  font-weight: 400;\\n  line-height: 1.3;\\n  font-style: italic;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum-Article .spectrum-Heading1--quiet strong {\\n              font-size: 39px;\\n  font-weight: 900;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum-Article .spectrum-Heading2--quiet,\\n.spectrum--large .spectrum-Article .spectrum-Heading--pageTitle {\\n          font-size: 31px;\\n  font-weight: 400;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          margin-bottom: 10px;\\n          margin-top: 10px;\\n        }\\n.spectrum--large .spectrum-Article .spectrum-Heading2--quiet em,\\n.spectrum--large .spectrum-Article .spectrum-Heading--pageTitle em {\\n              font-size: 31px;\\n  font-weight: 400;\\n  line-height: 1.3;\\n  font-style: italic;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum-Article .spectrum-Heading2--quiet strong,\\n.spectrum--large .spectrum-Article .spectrum-Heading--pageTitle strong {\\n              font-size: 31px;\\n  font-weight: 900;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum-Article .spectrum-Heading1--display {\\n          font-size: 49px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          margin-bottom: 10px;\\n          margin-top: 10px;\\n        }\\n.spectrum--large .spectrum-Article .spectrum-Heading1--display em {\\n              font-size: 49px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: italic;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum-Article .spectrum-Heading1--display strong {\\n              font-size: 49px;\\n  font-weight: 900;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum-Article .spectrum-Heading2--display {\\n          font-size: 44px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          margin-bottom: 10px;\\n          margin-top: 10px;\\n        }\\n.spectrum--large .spectrum-Article .spectrum-Heading2--display em {\\n              font-size: 44px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: italic;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum-Article .spectrum-Heading2--display strong {\\n              font-size: 44px;\\n  font-weight: 900;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum-Article .spectrum-Heading1--display.spectrum-Heading1--quiet {\\n          font-size: 49px;\\n  font-weight: 400;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          margin-bottom: 10px;\\n          margin-top: 10px;\\n        }\\n.spectrum--large .spectrum-Article .spectrum-Heading1--display.spectrum-Heading1--quiet em {\\n              font-size: 49px;\\n  font-weight: 400;\\n  line-height: 1.3;\\n  font-style: italic;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum-Article .spectrum-Heading1--display.spectrum-Heading1--quiet strong {\\n              font-size: 49px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum-Article .spectrum-Heading2--display.spectrum-Heading2--quiet,\\n.spectrum--large .spectrum-Article .spectrum-Heading--display {\\n          font-size: 44px;\\n  font-weight: 400;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          margin-bottom: 10px;\\n          margin-top: 10px;\\n        }\\n.spectrum--large .spectrum-Article .spectrum-Heading2--display.spectrum-Heading2--quiet em,\\n.spectrum--large .spectrum-Article .spectrum-Heading--display em {\\n              font-size: 44px;\\n  font-weight: 400;\\n  line-height: 1.3;\\n  font-style: italic;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum-Article .spectrum-Heading2--display.spectrum-Heading2--quiet strong,\\n.spectrum--large .spectrum-Article .spectrum-Heading--display strong {\\n              font-size: 44px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum:lang(ja) .spectrum-Body1, .spectrum--large .spectrum:lang(ko) .spectrum-Body1, .spectrum--large .spectrum:lang(zh) .spectrum-Body1 {\\n          font-size: 24px;\\n  font-weight: 400;\\n  line-height: 1.7;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          margin-bottom: 20px;\\n          margin-top: 10px;\\n        }\\n.spectrum--large .spectrum:lang(ja) .spectrum-Body1 em, .spectrum--large .spectrum:lang(ko) .spectrum-Body1 em, .spectrum--large .spectrum:lang(zh) .spectrum-Body1 em {\\n              font-size: 24px;\\n  font-weight: 700;\\n  line-height: 1.7;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum:lang(ja) .spectrum-Body1 strong, .spectrum--large .spectrum:lang(ko) .spectrum-Body1 strong, .spectrum--large .spectrum:lang(zh) .spectrum-Body1 strong {\\n              font-size: 24px;\\n  font-weight: 900;\\n  line-height: 1.7;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum:lang(ja) .spectrum-Body2,\\n.spectrum--large .spectrum:lang(ko) .spectrum-Body2,\\n.spectrum--large .spectrum:lang(zh) .spectrum-Body2,\\n.spectrum--large .spectrum:lang(ja) .spectrum-Body--large,\\n.spectrum--large .spectrum:lang(ko) .spectrum-Body--large,\\n.spectrum--large .spectrum:lang(zh) .spectrum-Body--large {\\n          font-size: 22px;\\n  font-weight: 400;\\n  line-height: 1.7;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          margin-bottom: 20px;\\n          margin-top: 10px;\\n        }\\n.spectrum--large .spectrum:lang(ja) .spectrum-Body2 em,\\n.spectrum--large .spectrum:lang(ko) .spectrum-Body2 em,\\n.spectrum--large .spectrum:lang(zh) .spectrum-Body2 em,\\n.spectrum--large .spectrum:lang(ja) .spectrum-Body--large em,\\n.spectrum--large .spectrum:lang(ko) .spectrum-Body--large em,\\n.spectrum--large .spectrum:lang(zh) .spectrum-Body--large em {\\n              font-size: 22px;\\n  font-weight: 700;\\n  line-height: 1.7;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum:lang(ja) .spectrum-Body2 strong,\\n.spectrum--large .spectrum:lang(ko) .spectrum-Body2 strong,\\n.spectrum--large .spectrum:lang(zh) .spectrum-Body2 strong,\\n.spectrum--large .spectrum:lang(ja) .spectrum-Body--large strong,\\n.spectrum--large .spectrum:lang(ko) .spectrum-Body--large strong,\\n.spectrum--large .spectrum:lang(zh) .spectrum-Body--large strong {\\n              font-size: 22px;\\n  font-weight: 900;\\n  line-height: 1.7;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum:lang(ja) .spectrum-Body3, .spectrum--large .spectrum:lang(ko) .spectrum-Body3, .spectrum--large .spectrum:lang(zh) .spectrum-Body3 {\\n          font-size: 19px;\\n  font-weight: 400;\\n  line-height: 1.7;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          margin-bottom: 20px;\\n          margin-top: 10px;\\n        }\\n.spectrum--large .spectrum:lang(ja) .spectrum-Body3 em, .spectrum--large .spectrum:lang(ko) .spectrum-Body3 em, .spectrum--large .spectrum:lang(zh) .spectrum-Body3 em {\\n              font-size: 19px;\\n  font-weight: 700;\\n  line-height: 1.7;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum:lang(ja) .spectrum-Body3 strong, .spectrum--large .spectrum:lang(ko) .spectrum-Body3 strong, .spectrum--large .spectrum:lang(zh) .spectrum-Body3 strong {\\n              font-size: 19px;\\n  font-weight: 900;\\n  line-height: 1.7;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum:lang(ja) .spectrum-Body4,\\n.spectrum--large .spectrum:lang(ko) .spectrum-Body4,\\n.spectrum--large .spectrum:lang(zh) .spectrum-Body4,\\n.spectrum--large .spectrum:lang(ja) .spectrum-Body--secondary,\\n.spectrum--large .spectrum:lang(ko) .spectrum-Body--secondary,\\n.spectrum--large .spectrum:lang(zh) .spectrum-Body--secondary {\\n          font-size: 17px;\\n  font-weight: 400;\\n  line-height: 1.7;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          margin-bottom: 20px;\\n          margin-top: 10px;\\n        }\\n.spectrum--large .spectrum:lang(ja) .spectrum-Body4 em,\\n.spectrum--large .spectrum:lang(ko) .spectrum-Body4 em,\\n.spectrum--large .spectrum:lang(zh) .spectrum-Body4 em,\\n.spectrum--large .spectrum:lang(ja) .spectrum-Body--secondary em,\\n.spectrum--large .spectrum:lang(ko) .spectrum-Body--secondary em,\\n.spectrum--large .spectrum:lang(zh) .spectrum-Body--secondary em {\\n              font-size: 17px;\\n  font-weight: 700;\\n  line-height: 1.7;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum:lang(ja) .spectrum-Body4 strong,\\n.spectrum--large .spectrum:lang(ko) .spectrum-Body4 strong,\\n.spectrum--large .spectrum:lang(zh) .spectrum-Body4 strong,\\n.spectrum--large .spectrum:lang(ja) .spectrum-Body--secondary strong,\\n.spectrum--large .spectrum:lang(ko) .spectrum-Body--secondary strong,\\n.spectrum--large .spectrum:lang(zh) .spectrum-Body--secondary strong {\\n              font-size: 17px;\\n  font-weight: 900;\\n  line-height: 1.7;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum:lang(ja) .spectrum-Body5,\\n.spectrum--large .spectrum:lang(ko) .spectrum-Body5,\\n.spectrum--large .spectrum:lang(zh) .spectrum-Body5,\\n.spectrum--large .spectrum:lang(ja) .spectrum-Body--small,\\n.spectrum--large .spectrum:lang(ko) .spectrum-Body--small,\\n.spectrum--large .spectrum:lang(zh) .spectrum-Body--small {\\n          font-size: 15px;\\n  font-weight: 400;\\n  line-height: 1.7;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          margin-bottom: 20px;\\n          margin-top: 10px;\\n        }\\n.spectrum--large .spectrum:lang(ja) .spectrum-Body5 em,\\n.spectrum--large .spectrum:lang(ko) .spectrum-Body5 em,\\n.spectrum--large .spectrum:lang(zh) .spectrum-Body5 em,\\n.spectrum--large .spectrum:lang(ja) .spectrum-Body--small em,\\n.spectrum--large .spectrum:lang(ko) .spectrum-Body--small em,\\n.spectrum--large .spectrum:lang(zh) .spectrum-Body--small em {\\n              font-size: 15px;\\n  font-weight: 700;\\n  line-height: 1.7;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum:lang(ja) .spectrum-Body5 strong,\\n.spectrum--large .spectrum:lang(ko) .spectrum-Body5 strong,\\n.spectrum--large .spectrum:lang(zh) .spectrum-Body5 strong,\\n.spectrum--large .spectrum:lang(ja) .spectrum-Body--small strong,\\n.spectrum--large .spectrum:lang(ko) .spectrum-Body--small strong,\\n.spectrum--large .spectrum:lang(zh) .spectrum-Body--small strong {\\n              font-size: 15px;\\n  font-weight: 900;\\n  line-height: 1.7;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum:lang(ja) .spectrum-Heading1, .spectrum--large .spectrum:lang(ko) .spectrum-Heading1, .spectrum--large .spectrum:lang(zh) .spectrum-Heading1 {\\n          font-size: 39px;\\n  font-weight: 700;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          margin-bottom: 10px;\\n          margin-top: 10px;\\n        }\\n.spectrum--large .spectrum:lang(ja) .spectrum-Heading1 em, .spectrum--large .spectrum:lang(ko) .spectrum-Heading1 em, .spectrum--large .spectrum:lang(zh) .spectrum-Heading1 em {\\n              font-size: 39px;\\n  font-weight: 800;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum:lang(ja) .spectrum-Heading1 strong, .spectrum--large .spectrum:lang(ko) .spectrum-Heading1 strong, .spectrum--large .spectrum:lang(zh) .spectrum-Heading1 strong {\\n              font-size: 39px;\\n  font-weight: 900;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum:lang(ja) .spectrum-Heading2, .spectrum--large .spectrum:lang(ko) .spectrum-Heading2, .spectrum--large .spectrum:lang(zh) .spectrum-Heading2 {\\n          font-size: 31px;\\n  font-weight: 700;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          margin-bottom: 10px;\\n          margin-top: 10px;\\n        }\\n.spectrum--large .spectrum:lang(ja) .spectrum-Heading2 em, .spectrum--large .spectrum:lang(ko) .spectrum-Heading2 em, .spectrum--large .spectrum:lang(zh) .spectrum-Heading2 em {\\n              font-size: 31px;\\n  font-weight: 800;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum:lang(ja) .spectrum-Heading2 strong, .spectrum--large .spectrum:lang(ko) .spectrum-Heading2 strong, .spectrum--large .spectrum:lang(zh) .spectrum-Heading2 strong {\\n              font-size: 31px;\\n  font-weight: 900;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum:lang(ja) .spectrum-Heading3, .spectrum--large .spectrum:lang(ko) .spectrum-Heading3, .spectrum--large .spectrum:lang(zh) .spectrum-Heading3 {\\n          font-size: 24px;\\n  font-weight: 700;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          margin-bottom: 10px;\\n          margin-top: 10px;\\n        }\\n.spectrum--large .spectrum:lang(ja) .spectrum-Heading3 em, .spectrum--large .spectrum:lang(ko) .spectrum-Heading3 em, .spectrum--large .spectrum:lang(zh) .spectrum-Heading3 em {\\n              font-size: 24px;\\n  font-weight: 800;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum:lang(ja) .spectrum-Heading3 strong, .spectrum--large .spectrum:lang(ko) .spectrum-Heading3 strong, .spectrum--large .spectrum:lang(zh) .spectrum-Heading3 strong {\\n              font-size: 24px;\\n  font-weight: 900;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum:lang(ja) .spectrum-Heading4,\\n.spectrum--large .spectrum:lang(ko) .spectrum-Heading4,\\n.spectrum--large .spectrum:lang(zh) .spectrum-Heading4,\\n.spectrum--large .spectrum:lang(ja) .spectrum-Heading--subtitle1,\\n.spectrum--large .spectrum:lang(ko) .spectrum-Heading--subtitle1,\\n.spectrum--large .spectrum:lang(zh) .spectrum-Heading--subtitle1 {\\n          font-size: 22px;\\n  font-weight: 700;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          margin-bottom: 10px;\\n          margin-top: 10px;\\n        }\\n.spectrum--large .spectrum:lang(ja) .spectrum-Heading4 em,\\n.spectrum--large .spectrum:lang(ko) .spectrum-Heading4 em,\\n.spectrum--large .spectrum:lang(zh) .spectrum-Heading4 em,\\n.spectrum--large .spectrum:lang(ja) .spectrum-Heading--subtitle1 em,\\n.spectrum--large .spectrum:lang(ko) .spectrum-Heading--subtitle1 em,\\n.spectrum--large .spectrum:lang(zh) .spectrum-Heading--subtitle1 em {\\n              font-size: 22px;\\n  font-weight: 800;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum:lang(ja) .spectrum-Heading4 strong,\\n.spectrum--large .spectrum:lang(ko) .spectrum-Heading4 strong,\\n.spectrum--large .spectrum:lang(zh) .spectrum-Heading4 strong,\\n.spectrum--large .spectrum:lang(ja) .spectrum-Heading--subtitle1 strong,\\n.spectrum--large .spectrum:lang(ko) .spectrum-Heading--subtitle1 strong,\\n.spectrum--large .spectrum:lang(zh) .spectrum-Heading--subtitle1 strong {\\n              font-size: 22px;\\n  font-weight: 900;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum:lang(ja) .spectrum-Heading5, .spectrum--large .spectrum:lang(ko) .spectrum-Heading5, .spectrum--large .spectrum:lang(zh) .spectrum-Heading5 {\\n          font-size: 19px;\\n  font-weight: 700;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          margin-bottom: 10px;\\n          margin-top: 10px;\\n        }\\n.spectrum--large .spectrum:lang(ja) .spectrum-Heading5 em, .spectrum--large .spectrum:lang(ko) .spectrum-Heading5 em, .spectrum--large .spectrum:lang(zh) .spectrum-Heading5 em {\\n              font-size: 19px;\\n  font-weight: 800;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum:lang(ja) .spectrum-Heading5 strong, .spectrum--large .spectrum:lang(ko) .spectrum-Heading5 strong, .spectrum--large .spectrum:lang(zh) .spectrum-Heading5 strong {\\n              font-size: 19px;\\n  font-weight: 900;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum:lang(ja) .spectrum-Heading6,\\n.spectrum--large .spectrum:lang(ko) .spectrum-Heading6,\\n.spectrum--large .spectrum:lang(zh) .spectrum-Heading6,\\n.spectrum--large .spectrum:lang(ja) .spectrum-Heading--subtitle2,\\n.spectrum--large .spectrum:lang(ko) .spectrum-Heading--subtitle2,\\n.spectrum--large .spectrum:lang(zh) .spectrum-Heading--subtitle2 {\\n          font-size: 17px;\\n  font-weight: 700;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          margin-bottom: 10px;\\n          margin-top: 10px;\\n        }\\n.spectrum--large .spectrum:lang(ja) .spectrum-Heading6 em,\\n.spectrum--large .spectrum:lang(ko) .spectrum-Heading6 em,\\n.spectrum--large .spectrum:lang(zh) .spectrum-Heading6 em,\\n.spectrum--large .spectrum:lang(ja) .spectrum-Heading--subtitle2 em,\\n.spectrum--large .spectrum:lang(ko) .spectrum-Heading--subtitle2 em,\\n.spectrum--large .spectrum:lang(zh) .spectrum-Heading--subtitle2 em {\\n              font-size: 17px;\\n  font-weight: 800;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum:lang(ja) .spectrum-Heading6 strong,\\n.spectrum--large .spectrum:lang(ko) .spectrum-Heading6 strong,\\n.spectrum--large .spectrum:lang(zh) .spectrum-Heading6 strong,\\n.spectrum--large .spectrum:lang(ja) .spectrum-Heading--subtitle2 strong,\\n.spectrum--large .spectrum:lang(ko) .spectrum-Heading--subtitle2 strong,\\n.spectrum--large .spectrum:lang(zh) .spectrum-Heading--subtitle2 strong {\\n              font-size: 17px;\\n  font-weight: 900;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum:lang(ja) .spectrum-Subheading,\\n.spectrum--large .spectrum:lang(ko) .spectrum-Subheading,\\n.spectrum--large .spectrum:lang(zh) .spectrum-Subheading,\\n.spectrum--large .spectrum:lang(ja) .spectrum-Heading--subtitle3,\\n.spectrum--large .spectrum:lang(ko) .spectrum-Heading--subtitle3,\\n.spectrum--large .spectrum:lang(zh) .spectrum-Heading--subtitle3 {\\n          font-size: 13px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0.06em;\\n  text-transform: uppercase;\\n\\n          margin-bottom: 10px;\\n          margin-top: 10px;\\n        }\\n.spectrum--large .spectrum:lang(ja) .spectrum-Subheading em,\\n.spectrum--large .spectrum:lang(ko) .spectrum-Subheading em,\\n.spectrum--large .spectrum:lang(zh) .spectrum-Subheading em,\\n.spectrum--large .spectrum:lang(ja) .spectrum-Heading--subtitle3 em,\\n.spectrum--large .spectrum:lang(ko) .spectrum-Heading--subtitle3 em,\\n.spectrum--large .spectrum:lang(zh) .spectrum-Heading--subtitle3 em {\\n              font-size: 13px;\\n  font-weight: 800;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0.06em;\\n  text-transform: uppercase;\\n\\n          }\\n.spectrum--large .spectrum:lang(ja) .spectrum-Subheading strong,\\n.spectrum--large .spectrum:lang(ko) .spectrum-Subheading strong,\\n.spectrum--large .spectrum:lang(zh) .spectrum-Subheading strong,\\n.spectrum--large .spectrum:lang(ja) .spectrum-Heading--subtitle3 strong,\\n.spectrum--large .spectrum:lang(ko) .spectrum-Heading--subtitle3 strong,\\n.spectrum--large .spectrum:lang(zh) .spectrum-Heading--subtitle3 strong {\\n              font-size: 13px;\\n  font-weight: 900;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0.06em;\\n  text-transform: uppercase;\\n\\n          }\\n.spectrum--large .spectrum:lang(ja) .spectrum-Detail, .spectrum--large .spectrum:lang(ko) .spectrum-Detail, .spectrum--large .spectrum:lang(zh) .spectrum-Detail {\\n          font-size: 13px;\\n  font-weight: 400;\\n  line-height: 1.7;\\n  font-style: normal;\\n  letter-spacing: 0.06em;\\n  text-transform: uppercase;\\n\\n          margin-bottom: 20px;\\n          margin-top: 10px;\\n        }\\n.spectrum--large .spectrum:lang(ja) .spectrum-Detail em, .spectrum--large .spectrum:lang(ko) .spectrum-Detail em, .spectrum--large .spectrum:lang(zh) .spectrum-Detail em {\\n              font-size: 13px;\\n  font-weight: 400;\\n  line-height: 1.7;\\n  font-style: normal;\\n  letter-spacing: 0.06em;\\n  text-transform: uppercase;\\n\\n          }\\n.spectrum--large .spectrum:lang(ja) .spectrum-Detail strong, .spectrum--large .spectrum:lang(ko) .spectrum-Detail strong, .spectrum--large .spectrum:lang(zh) .spectrum-Detail strong {\\n              font-size: 13px;\\n  font-weight: 900;\\n  line-height: 1.7;\\n  font-style: normal;\\n  letter-spacing: 0.06em;\\n  text-transform: uppercase;\\n\\n          }\\n.spectrum--large .spectrum:lang(ja) .spectrum-Heading1--quiet, .spectrum--large .spectrum:lang(ko) .spectrum-Heading1--quiet, .spectrum--large .spectrum:lang(zh) .spectrum-Heading1--quiet {\\n          font-size: 39px;\\n  font-weight: 300;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          margin-bottom: 10px;\\n          margin-top: 10px;\\n        }\\n.spectrum--large .spectrum:lang(ja) .spectrum-Heading1--quiet em, .spectrum--large .spectrum:lang(ko) .spectrum-Heading1--quiet em, .spectrum--large .spectrum:lang(zh) .spectrum-Heading1--quiet em {\\n              font-size: 39px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum:lang(ja) .spectrum-Heading1--quiet strong, .spectrum--large .spectrum:lang(ko) .spectrum-Heading1--quiet strong, .spectrum--large .spectrum:lang(zh) .spectrum-Heading1--quiet strong {\\n              font-size: 39px;\\n  font-weight: 700;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum:lang(ja) .spectrum-Heading2--quiet,\\n.spectrum--large .spectrum:lang(ko) .spectrum-Heading2--quiet,\\n.spectrum--large .spectrum:lang(zh) .spectrum-Heading2--quiet,\\n.spectrum--large .spectrum:lang(ja) .spectrum-Heading--pageTitle,\\n.spectrum--large .spectrum:lang(ko) .spectrum-Heading--pageTitle,\\n.spectrum--large .spectrum:lang(zh) .spectrum-Heading--pageTitle {\\n          font-size: 31px;\\n  font-weight: 300;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          margin-bottom: 10px;\\n          margin-top: 10px;\\n        }\\n.spectrum--large .spectrum:lang(ja) .spectrum-Heading2--quiet em,\\n.spectrum--large .spectrum:lang(ko) .spectrum-Heading2--quiet em,\\n.spectrum--large .spectrum:lang(zh) .spectrum-Heading2--quiet em,\\n.spectrum--large .spectrum:lang(ja) .spectrum-Heading--pageTitle em,\\n.spectrum--large .spectrum:lang(ko) .spectrum-Heading--pageTitle em,\\n.spectrum--large .spectrum:lang(zh) .spectrum-Heading--pageTitle em {\\n              font-size: 31px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum:lang(ja) .spectrum-Heading2--quiet strong,\\n.spectrum--large .spectrum:lang(ko) .spectrum-Heading2--quiet strong,\\n.spectrum--large .spectrum:lang(zh) .spectrum-Heading2--quiet strong,\\n.spectrum--large .spectrum:lang(ja) .spectrum-Heading--pageTitle strong,\\n.spectrum--large .spectrum:lang(ko) .spectrum-Heading--pageTitle strong,\\n.spectrum--large .spectrum:lang(zh) .spectrum-Heading--pageTitle strong {\\n              font-size: 31px;\\n  font-weight: 700;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum:lang(ja) .spectrum-Heading1--strong, .spectrum--large .spectrum:lang(ko) .spectrum-Heading1--strong, .spectrum--large .spectrum:lang(zh) .spectrum-Heading1--strong {\\n          font-size: 39px;\\n  font-weight: 900;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          margin-bottom: 10px;\\n          margin-top: 10px;\\n        }\\n.spectrum--large .spectrum:lang(ja) .spectrum-Heading1--strong em, .spectrum--large .spectrum:lang(ko) .spectrum-Heading1--strong em, .spectrum--large .spectrum:lang(zh) .spectrum-Heading1--strong em {\\n              font-size: 39px;\\n  font-weight: 900;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum:lang(ja) .spectrum-Heading1--strong strong, .spectrum--large .spectrum:lang(ko) .spectrum-Heading1--strong strong, .spectrum--large .spectrum:lang(zh) .spectrum-Heading1--strong strong {\\n              font-size: 39px;\\n  font-weight: 900;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum:lang(ja) .spectrum-Heading2--strong, .spectrum--large .spectrum:lang(ko) .spectrum-Heading2--strong, .spectrum--large .spectrum:lang(zh) .spectrum-Heading2--strong {\\n          font-size: 31px;\\n  font-weight: 900;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          margin-bottom: 10px;\\n          margin-top: 10px;\\n        }\\n.spectrum--large .spectrum:lang(ja) .spectrum-Heading2--strong em, .spectrum--large .spectrum:lang(ko) .spectrum-Heading2--strong em, .spectrum--large .spectrum:lang(zh) .spectrum-Heading2--strong em {\\n              font-size: 31px;\\n  font-weight: 900;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum:lang(ja) .spectrum-Heading2--strong strong, .spectrum--large .spectrum:lang(ko) .spectrum-Heading2--strong strong, .spectrum--large .spectrum:lang(zh) .spectrum-Heading2--strong strong {\\n              font-size: 31px;\\n  font-weight: 900;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum:lang(ja) .spectrum-Heading1--display, .spectrum--large .spectrum:lang(ko) .spectrum-Heading1--display, .spectrum--large .spectrum:lang(zh) .spectrum-Heading1--display {\\n          font-size: 49px;\\n  font-weight: 700;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          margin-bottom: 10px;\\n          margin-top: 10px;\\n        }\\n.spectrum--large .spectrum:lang(ja) .spectrum-Heading1--display em, .spectrum--large .spectrum:lang(ko) .spectrum-Heading1--display em, .spectrum--large .spectrum:lang(zh) .spectrum-Heading1--display em {\\n              font-size: 49px;\\n  font-weight: 800;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum:lang(ja) .spectrum-Heading1--display strong, .spectrum--large .spectrum:lang(ko) .spectrum-Heading1--display strong, .spectrum--large .spectrum:lang(zh) .spectrum-Heading1--display strong {\\n              font-size: 49px;\\n  font-weight: 900;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum:lang(ja) .spectrum-Heading2--display, .spectrum--large .spectrum:lang(ko) .spectrum-Heading2--display, .spectrum--large .spectrum:lang(zh) .spectrum-Heading2--display {\\n          font-size: 44px;\\n  font-weight: 700;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          margin-bottom: 10px;\\n          margin-top: 10px;\\n        }\\n.spectrum--large .spectrum:lang(ja) .spectrum-Heading2--display em, .spectrum--large .spectrum:lang(ko) .spectrum-Heading2--display em, .spectrum--large .spectrum:lang(zh) .spectrum-Heading2--display em {\\n              font-size: 44px;\\n  font-weight: 800;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum:lang(ja) .spectrum-Heading2--display strong, .spectrum--large .spectrum:lang(ko) .spectrum-Heading2--display strong, .spectrum--large .spectrum:lang(zh) .spectrum-Heading2--display strong {\\n              font-size: 44px;\\n  font-weight: 900;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum:lang(ja) .spectrum-Heading1--display.spectrum-Heading1--strong, .spectrum--large .spectrum:lang(ko) .spectrum-Heading1--display.spectrum-Heading1--strong, .spectrum--large .spectrum:lang(zh) .spectrum-Heading1--display.spectrum-Heading1--strong {\\n          font-size: 49px;\\n  font-weight: 900;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          margin-bottom: 10px;\\n          margin-top: 10px;\\n        }\\n.spectrum--large .spectrum:lang(ja) .spectrum-Heading1--display.spectrum-Heading1--strong em, .spectrum--large .spectrum:lang(ko) .spectrum-Heading1--display.spectrum-Heading1--strong em, .spectrum--large .spectrum:lang(zh) .spectrum-Heading1--display.spectrum-Heading1--strong em {\\n              font-size: 49px;\\n  font-weight: 900;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum:lang(ja) .spectrum-Heading1--display.spectrum-Heading1--strong strong, .spectrum--large .spectrum:lang(ko) .spectrum-Heading1--display.spectrum-Heading1--strong strong, .spectrum--large .spectrum:lang(zh) .spectrum-Heading1--display.spectrum-Heading1--strong strong {\\n              font-size: 49px;\\n  font-weight: 900;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum:lang(ja) .spectrum-Heading2--display.spectrum-Heading2--strong, .spectrum--large .spectrum:lang(ko) .spectrum-Heading2--display.spectrum-Heading2--strong, .spectrum--large .spectrum:lang(zh) .spectrum-Heading2--display.spectrum-Heading2--strong {\\n          font-size: 44px;\\n  font-weight: 900;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          margin-bottom: 10px;\\n          margin-top: 10px;\\n        }\\n.spectrum--large .spectrum:lang(ja) .spectrum-Heading2--display.spectrum-Heading2--strong em, .spectrum--large .spectrum:lang(ko) .spectrum-Heading2--display.spectrum-Heading2--strong em, .spectrum--large .spectrum:lang(zh) .spectrum-Heading2--display.spectrum-Heading2--strong em {\\n              font-size: 44px;\\n  font-weight: 900;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum:lang(ja) .spectrum-Heading2--display.spectrum-Heading2--strong strong, .spectrum--large .spectrum:lang(ko) .spectrum-Heading2--display.spectrum-Heading2--strong strong, .spectrum--large .spectrum:lang(zh) .spectrum-Heading2--display.spectrum-Heading2--strong strong {\\n              font-size: 44px;\\n  font-weight: 900;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum:lang(ja) .spectrum-Heading1--display.spectrum-Heading1--quiet, .spectrum--large .spectrum:lang(ko) .spectrum-Heading1--display.spectrum-Heading1--quiet, .spectrum--large .spectrum:lang(zh) .spectrum-Heading1--display.spectrum-Heading1--quiet {\\n          font-size: 49px;\\n  font-weight: 300;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          margin-bottom: 10px;\\n          margin-top: 10px;\\n        }\\n.spectrum--large .spectrum:lang(ja) .spectrum-Heading1--display.spectrum-Heading1--quiet em, .spectrum--large .spectrum:lang(ko) .spectrum-Heading1--display.spectrum-Heading1--quiet em, .spectrum--large .spectrum:lang(zh) .spectrum-Heading1--display.spectrum-Heading1--quiet em {\\n              font-size: 49px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum:lang(ja) .spectrum-Heading1--display.spectrum-Heading1--quiet strong, .spectrum--large .spectrum:lang(ko) .spectrum-Heading1--display.spectrum-Heading1--quiet strong, .spectrum--large .spectrum:lang(zh) .spectrum-Heading1--display.spectrum-Heading1--quiet strong {\\n              font-size: 49px;\\n  font-weight: 700;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum:lang(ja) .spectrum-Heading2--display.spectrum-Heading2--quiet,\\n.spectrum--large .spectrum:lang(ko) .spectrum-Heading2--display.spectrum-Heading2--quiet,\\n.spectrum--large .spectrum:lang(zh) .spectrum-Heading2--display.spectrum-Heading2--quiet,\\n.spectrum--large .spectrum:lang(ja) .spectrum-Heading--display,\\n.spectrum--large .spectrum:lang(ko) .spectrum-Heading--display,\\n.spectrum--large .spectrum:lang(zh) .spectrum-Heading--display {\\n          font-size: 44px;\\n  font-weight: 300;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          margin-bottom: 10px;\\n          margin-top: 10px;\\n        }\\n.spectrum--large .spectrum:lang(ja) .spectrum-Heading2--display.spectrum-Heading2--quiet em,\\n.spectrum--large .spectrum:lang(ko) .spectrum-Heading2--display.spectrum-Heading2--quiet em,\\n.spectrum--large .spectrum:lang(zh) .spectrum-Heading2--display.spectrum-Heading2--quiet em,\\n.spectrum--large .spectrum:lang(ja) .spectrum-Heading--display em,\\n.spectrum--large .spectrum:lang(ko) .spectrum-Heading--display em,\\n.spectrum--large .spectrum:lang(zh) .spectrum-Heading--display em {\\n              font-size: 44px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum:lang(ja) .spectrum-Heading2--display.spectrum-Heading2--quiet strong,\\n.spectrum--large .spectrum:lang(ko) .spectrum-Heading2--display.spectrum-Heading2--quiet strong,\\n.spectrum--large .spectrum:lang(zh) .spectrum-Heading2--display.spectrum-Heading2--quiet strong,\\n.spectrum--large .spectrum:lang(ja) .spectrum-Heading--display strong,\\n.spectrum--large .spectrum:lang(ko) .spectrum-Heading--display strong,\\n.spectrum--large .spectrum:lang(zh) .spectrum-Heading--display strong {\\n              font-size: 44px;\\n  font-weight: 700;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum--large .spectrum-Code1 {\\n          font-size: 24px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0;\\n\\n          margin-bottom: 20px;\\n          margin-top: 10px;\\n  font-family: Source Code Pro, Monaco, monospace;\\n        }\\n.spectrum--large .spectrum-Code1 em {\\n              font-size: 24px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: italic;\\n  letter-spacing: 0;\\n\\n          }\\n.spectrum--large .spectrum-Code1 strong {\\n              font-size: 24px;\\n  font-weight: 700;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0;\\n\\n          }\\n.spectrum--large .spectrum-Code2 {\\n          font-size: 22px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0;\\n\\n          margin-bottom: 20px;\\n          margin-top: 10px;\\n  font-family: Source Code Pro, Monaco, monospace;\\n        }\\n.spectrum--large .spectrum-Code2 em {\\n              font-size: 22px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: italic;\\n  letter-spacing: 0;\\n\\n          }\\n.spectrum--large .spectrum-Code2 strong {\\n              font-size: 22px;\\n  font-weight: 700;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0;\\n\\n          }\\n.spectrum--large .spectrum-Code3 {\\n          font-size: 19px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0;\\n\\n          margin-bottom: 20px;\\n          margin-top: 10px;\\n  font-family: Source Code Pro, Monaco, monospace;\\n        }\\n.spectrum--large .spectrum-Code3 em {\\n              font-size: 19px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: italic;\\n  letter-spacing: 0;\\n\\n          }\\n.spectrum--large .spectrum-Code3 strong {\\n              font-size: 19px;\\n  font-weight: 700;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0;\\n\\n          }\\n.spectrum--large .spectrum-Code4 {\\n          font-size: 17px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0;\\n\\n          margin-bottom: 20px;\\n          margin-top: 10px;\\n  font-family: Source Code Pro, Monaco, monospace;\\n        }\\n.spectrum--large .spectrum-Code4 em {\\n              font-size: 17px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: italic;\\n  letter-spacing: 0;\\n\\n          }\\n.spectrum--large .spectrum-Code4 strong {\\n              font-size: 17px;\\n  font-weight: 700;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0;\\n\\n          }\\n.spectrum--large .spectrum-Code5 {\\n          font-size: 15px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0;\\n\\n          margin-bottom: 20px;\\n          margin-top: 10px;\\n  font-family: Source Code Pro, Monaco, monospace;\\n        }\\n.spectrum--large .spectrum-Code5 em {\\n              font-size: 15px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: italic;\\n  letter-spacing: 0;\\n\\n          }\\n.spectrum--large .spectrum-Code5 strong {\\n              font-size: 15px;\\n  font-weight: 700;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0;\\n\\n          }\\n.spectrum--large .spectrum,\\n.spectrum--large .spectrum-Body {\\n  font-size: 17px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: normal;\\n}\\n.spectrum--large .spectrum-Body--italic {\\n  font-style: italic;\\n}\\n", ""]);\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjI1LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0b3JxLW5hdGl2ZS9yZWFjdC1zcGVjdHJ1bS9zcGVjdHJ1bS1jc3Mtb3ZlcnJpZGVzL3R5cG9ncmFwaHkvaW5kZXgtZGlmZi5jc3M/YTgyMiJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiLi4vLi4vLi4vLi4vY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzXCIpKGZhbHNlKTtcbi8vIE1vZHVsZVxuZXhwb3J0cy5wdXNoKFttb2R1bGUuaWQsIFwiLyogZ2VuZXJhdGVkIGZyb20gZG5hLXZlcnNpb246IDUuMC4xICovXFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW0ge1xcbiAgZm9udC1mYW1pbHk6IGFkb2JlLWNsZWFuLCBcXFwiU291cmNlIFNhbnMgUHJvXFxcIiwgLWFwcGxlLXN5c3RlbSwgQmxpbmtNYWNTeXN0ZW1Gb250LCBcXFwiU2Vnb2UgVUlcXFwiLCBSb2JvdG8sIHNhbnMtc2VyaWY7XFxuICBmb250LXNpemU6IDE3cHg7XFxufVxcbi8qIGdlbmVyYXRlZCBmcm9tIGRuYS12ZXJzaW9uOiA1LjAuMSAqL1xcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtOmxhbmcoemgtSGFucykge1xcbiAgICBmb250LWZhbWlseTogYWRvYmUtY2xlYW4taGFuLWphcGFuZXNlLCAtYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsIFxcXCJTZWdvZSBVSVxcXCIsIFJvYm90bywgc2Fucy1zZXJpZjtcXG4gIH1cXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bTpsYW5nKHpoKSB7XFxuICAgIGZvbnQtZmFtaWx5OiBhZG9iZS1jbGVhbi1oYW4tamFwYW5lc2UsIC1hcHBsZS1zeXN0ZW0sIEJsaW5rTWFjU3lzdGVtRm9udCwgXFxcIlNlZ29lIFVJXFxcIiwgUm9ib3RvLCBzYW5zLXNlcmlmO1xcbiAgfVxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtOmxhbmcoa28pIHtcXG4gICAgZm9udC1mYW1pbHk6IGFkb2JlLWNsZWFuLWhhbi1qYXBhbmVzZSwgLWFwcGxlLXN5c3RlbSwgQmxpbmtNYWNTeXN0ZW1Gb250LCBcXFwiU2Vnb2UgVUlcXFwiLCBSb2JvdG8sIHNhbnMtc2VyaWY7XFxuICB9XFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW06bGFuZyhqYSkge1xcbiAgICBmb250LWZhbWlseTogYWRvYmUtY2xlYW4taGFuLWphcGFuZXNlLCAtYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsIFxcXCJTZWdvZSBVSVxcXCIsIFJvYm90bywgc2Fucy1zZXJpZjtcXG4gIH1cXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bS1Cb2R5MSB7XFxuICAgICAgICAgIGZvbnQtc2l6ZTogMjRweDtcXG4gIGZvbnQtd2VpZ2h0OiA0MDA7XFxuICBsaW5lLWhlaWdodDogMS41O1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDA7XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgbWFyZ2luLWJvdHRvbTogMjBweDtcXG4gICAgICAgICAgbWFyZ2luLXRvcDogMTBweDtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bS1Cb2R5MSBlbSB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDI0cHg7XFxuICBmb250LXdlaWdodDogNDAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gIGZvbnQtc3R5bGU6IGl0YWxpYztcXG4gIGxldHRlci1zcGFjaW5nOiAwO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bS1Cb2R5MSBzdHJvbmcge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiAyNHB4O1xcbiAgZm9udC13ZWlnaHQ6IDcwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjU7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMDtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW0tQm9keTIsXFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW0tQm9keS0tbGFyZ2Uge1xcbiAgICAgICAgICBmb250LXNpemU6IDIycHg7XFxuICBmb250LXdlaWdodDogNDAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIG1hcmdpbi1ib3R0b206IDIwcHg7XFxuICAgICAgICAgIG1hcmdpbi10b3A6IDEwcHg7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW0tQm9keTIgZW0sXFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW0tQm9keS0tbGFyZ2UgZW0ge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiAyMnB4O1xcbiAgZm9udC13ZWlnaHQ6IDQwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjU7XFxuICBmb250LXN0eWxlOiBpdGFsaWM7XFxuICBsZXR0ZXItc3BhY2luZzogMDtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW0tQm9keTIgc3Ryb25nLFxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtLUJvZHktLWxhcmdlIHN0cm9uZyB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDIycHg7XFxuICBmb250LXdlaWdodDogNzAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bS1Cb2R5MyB7XFxuICAgICAgICAgIGZvbnQtc2l6ZTogMTlweDtcXG4gIGZvbnQtd2VpZ2h0OiA0MDA7XFxuICBsaW5lLWhlaWdodDogMS41O1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDA7XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgbWFyZ2luLWJvdHRvbTogMjBweDtcXG4gICAgICAgICAgbWFyZ2luLXRvcDogMTBweDtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bS1Cb2R5MyBlbSB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDE5cHg7XFxuICBmb250LXdlaWdodDogNDAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gIGZvbnQtc3R5bGU6IGl0YWxpYztcXG4gIGxldHRlci1zcGFjaW5nOiAwO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bS1Cb2R5MyBzdHJvbmcge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiAxOXB4O1xcbiAgZm9udC13ZWlnaHQ6IDcwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjU7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMDtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW0tQm9keTQsXFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW0tQm9keS0tc2Vjb25kYXJ5IHtcXG4gICAgICAgICAgZm9udC1zaXplOiAxN3B4O1xcbiAgZm9udC13ZWlnaHQ6IDQwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjU7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMDtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICBtYXJnaW4tYm90dG9tOiAyMHB4O1xcbiAgICAgICAgICBtYXJnaW4tdG9wOiAxMHB4O1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtLUJvZHk0IGVtLFxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtLUJvZHktLXNlY29uZGFyeSBlbSB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDE3cHg7XFxuICBmb250LXdlaWdodDogNDAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gIGZvbnQtc3R5bGU6IGl0YWxpYztcXG4gIGxldHRlci1zcGFjaW5nOiAwO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bS1Cb2R5NCBzdHJvbmcsXFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW0tQm9keS0tc2Vjb25kYXJ5IHN0cm9uZyB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDE3cHg7XFxuICBmb250LXdlaWdodDogNzAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bS1Cb2R5NSxcXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bS1Cb2R5LS1zbWFsbCB7XFxuICAgICAgICAgIGZvbnQtc2l6ZTogMTVweDtcXG4gIGZvbnQtd2VpZ2h0OiA0MDA7XFxuICBsaW5lLWhlaWdodDogMS41O1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDA7XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgbWFyZ2luLWJvdHRvbTogMjBweDtcXG4gICAgICAgICAgbWFyZ2luLXRvcDogMTBweDtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bS1Cb2R5NSBlbSxcXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bS1Cb2R5LS1zbWFsbCBlbSB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDE1cHg7XFxuICBmb250LXdlaWdodDogNDAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gIGZvbnQtc3R5bGU6IGl0YWxpYztcXG4gIGxldHRlci1zcGFjaW5nOiAwO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bS1Cb2R5NSBzdHJvbmcsXFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW0tQm9keS0tc21hbGwgc3Ryb25nIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogMTVweDtcXG4gIGZvbnQtd2VpZ2h0OiA3MDA7XFxuICBsaW5lLWhlaWdodDogMS41O1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDA7XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtLUhlYWRpbmcxIHtcXG4gICAgICAgICAgZm9udC1zaXplOiAzOXB4O1xcbiAgZm9udC13ZWlnaHQ6IDcwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjM7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMDtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICBtYXJnaW4tYm90dG9tOiAxMHB4O1xcbiAgICAgICAgICBtYXJnaW4tdG9wOiAxMHB4O1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtLUhlYWRpbmcxIGVtIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogMzlweDtcXG4gIGZvbnQtd2VpZ2h0OiA3MDA7XFxuICBsaW5lLWhlaWdodDogMS4zO1xcbiAgZm9udC1zdHlsZTogaXRhbGljO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDA7XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtLUhlYWRpbmcxIHN0cm9uZyB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDM5cHg7XFxuICBmb250LXdlaWdodDogOTAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuMztcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bS1IZWFkaW5nMiB7XFxuICAgICAgICAgIGZvbnQtc2l6ZTogMzFweDtcXG4gIGZvbnQtd2VpZ2h0OiA3MDA7XFxuICBsaW5lLWhlaWdodDogMS4zO1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDA7XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgbWFyZ2luLWJvdHRvbTogMTBweDtcXG4gICAgICAgICAgbWFyZ2luLXRvcDogMTBweDtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bS1IZWFkaW5nMiBlbSB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDMxcHg7XFxuICBmb250LXdlaWdodDogNzAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuMztcXG4gIGZvbnQtc3R5bGU6IGl0YWxpYztcXG4gIGxldHRlci1zcGFjaW5nOiAwO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bS1IZWFkaW5nMiBzdHJvbmcge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiAzMXB4O1xcbiAgZm9udC13ZWlnaHQ6IDkwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjM7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMDtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW0tSGVhZGluZzMge1xcbiAgICAgICAgICBmb250LXNpemU6IDI0cHg7XFxuICBmb250LXdlaWdodDogNzAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuMztcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIG1hcmdpbi1ib3R0b206IDEwcHg7XFxuICAgICAgICAgIG1hcmdpbi10b3A6IDEwcHg7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW0tSGVhZGluZzMgZW0ge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiAyNHB4O1xcbiAgZm9udC13ZWlnaHQ6IDcwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjM7XFxuICBmb250LXN0eWxlOiBpdGFsaWM7XFxuICBsZXR0ZXItc3BhY2luZzogMDtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW0tSGVhZGluZzMgc3Ryb25nIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogMjRweDtcXG4gIGZvbnQtd2VpZ2h0OiA5MDA7XFxuICBsaW5lLWhlaWdodDogMS4zO1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDA7XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtLUhlYWRpbmc0LFxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtLUhlYWRpbmctLXN1YnRpdGxlMSB7XFxuICAgICAgICAgIGZvbnQtc2l6ZTogMjJweDtcXG4gIGZvbnQtd2VpZ2h0OiA3MDA7XFxuICBsaW5lLWhlaWdodDogMS4zO1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDA7XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgbWFyZ2luLWJvdHRvbTogMTBweDtcXG4gICAgICAgICAgbWFyZ2luLXRvcDogMTBweDtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bS1IZWFkaW5nNCBlbSxcXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bS1IZWFkaW5nLS1zdWJ0aXRsZTEgZW0ge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiAyMnB4O1xcbiAgZm9udC13ZWlnaHQ6IDcwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjM7XFxuICBmb250LXN0eWxlOiBpdGFsaWM7XFxuICBsZXR0ZXItc3BhY2luZzogMDtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW0tSGVhZGluZzQgc3Ryb25nLFxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtLUhlYWRpbmctLXN1YnRpdGxlMSBzdHJvbmcge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiAyMnB4O1xcbiAgZm9udC13ZWlnaHQ6IDkwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjM7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMDtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW0tSGVhZGluZzUge1xcbiAgICAgICAgICBmb250LXNpemU6IDE5cHg7XFxuICBmb250LXdlaWdodDogNzAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuMztcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIG1hcmdpbi1ib3R0b206IDEwcHg7XFxuICAgICAgICAgIG1hcmdpbi10b3A6IDEwcHg7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW0tSGVhZGluZzUgZW0ge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiAxOXB4O1xcbiAgZm9udC13ZWlnaHQ6IDcwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjM7XFxuICBmb250LXN0eWxlOiBpdGFsaWM7XFxuICBsZXR0ZXItc3BhY2luZzogMDtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW0tSGVhZGluZzUgc3Ryb25nIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogMTlweDtcXG4gIGZvbnQtd2VpZ2h0OiA5MDA7XFxuICBsaW5lLWhlaWdodDogMS4zO1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDA7XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtLUhlYWRpbmc2LFxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtLUhlYWRpbmctLXN1YnRpdGxlMiB7XFxuICAgICAgICAgIGZvbnQtc2l6ZTogMTdweDtcXG4gIGZvbnQtd2VpZ2h0OiA3MDA7XFxuICBsaW5lLWhlaWdodDogMS4zO1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDA7XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgbWFyZ2luLWJvdHRvbTogMTBweDtcXG4gICAgICAgICAgbWFyZ2luLXRvcDogMTBweDtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bS1IZWFkaW5nNiBlbSxcXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bS1IZWFkaW5nLS1zdWJ0aXRsZTIgZW0ge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiAxN3B4O1xcbiAgZm9udC13ZWlnaHQ6IDcwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjM7XFxuICBmb250LXN0eWxlOiBpdGFsaWM7XFxuICBsZXR0ZXItc3BhY2luZzogMDtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW0tSGVhZGluZzYgc3Ryb25nLFxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtLUhlYWRpbmctLXN1YnRpdGxlMiBzdHJvbmcge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiAxN3B4O1xcbiAgZm9udC13ZWlnaHQ6IDkwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjM7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMDtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW0tU3ViaGVhZGluZyxcXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bS1IZWFkaW5nLS1zdWJ0aXRsZTMge1xcbiAgICAgICAgICBmb250LXNpemU6IDEzcHg7XFxuICBmb250LXdlaWdodDogNzAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuMztcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjA2ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xcblxcbiAgICAgICAgICBtYXJnaW4tYm90dG9tOiAxMHB4O1xcbiAgICAgICAgICBtYXJnaW4tdG9wOiAxMHB4O1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtLVN1YmhlYWRpbmcgZW0sXFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW0tSGVhZGluZy0tc3VidGl0bGUzIGVtIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogMTNweDtcXG4gIGZvbnQtd2VpZ2h0OiA3MDA7XFxuICBsaW5lLWhlaWdodDogMS4zO1xcbiAgZm9udC1zdHlsZTogaXRhbGljO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDZlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bS1TdWJoZWFkaW5nIHN0cm9uZyxcXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bS1IZWFkaW5nLS1zdWJ0aXRsZTMgc3Ryb25nIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogMTNweDtcXG4gIGZvbnQtd2VpZ2h0OiA5MDA7XFxuICBsaW5lLWhlaWdodDogMS4zO1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDZlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bS1EZXRhaWwge1xcbiAgICAgICAgICBmb250LXNpemU6IDEzcHg7XFxuICBmb250LXdlaWdodDogNDAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjA2ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xcblxcbiAgICAgICAgICBtYXJnaW4tYm90dG9tOiAyMHB4O1xcbiAgICAgICAgICBtYXJnaW4tdG9wOiAxMHB4O1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtLURldGFpbCBlbSB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDEzcHg7XFxuICBmb250LXdlaWdodDogNDAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gIGZvbnQtc3R5bGU6IGl0YWxpYztcXG4gIGxldHRlci1zcGFjaW5nOiAwLjA2ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW0tRGV0YWlsIHN0cm9uZyB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDEzcHg7XFxuICBmb250LXdlaWdodDogNzAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjA2ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW0tSGVhZGluZzEtLXF1aWV0IHtcXG4gICAgICAgICAgZm9udC1zaXplOiAzOXB4O1xcbiAgZm9udC13ZWlnaHQ6IDMwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjM7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMDtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICBtYXJnaW4tYm90dG9tOiAxMHB4O1xcbiAgICAgICAgICBtYXJnaW4tdG9wOiAxMHB4O1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtLUhlYWRpbmcxLS1xdWlldCBlbSB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDM5cHg7XFxuICBmb250LXdlaWdodDogMzAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuMztcXG4gIGZvbnQtc3R5bGU6IGl0YWxpYztcXG4gIGxldHRlci1zcGFjaW5nOiAwO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bS1IZWFkaW5nMS0tcXVpZXQgc3Ryb25nIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogMzlweDtcXG4gIGZvbnQtd2VpZ2h0OiA3MDA7XFxuICBsaW5lLWhlaWdodDogMS4zO1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDA7XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtLUhlYWRpbmcyLS1xdWlldCxcXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bS1IZWFkaW5nLS1wYWdlVGl0bGUge1xcbiAgICAgICAgICBmb250LXNpemU6IDMxcHg7XFxuICBmb250LXdlaWdodDogMzAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuMztcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIG1hcmdpbi1ib3R0b206IDEwcHg7XFxuICAgICAgICAgIG1hcmdpbi10b3A6IDEwcHg7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW0tSGVhZGluZzItLXF1aWV0IGVtLFxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtLUhlYWRpbmctLXBhZ2VUaXRsZSBlbSB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDMxcHg7XFxuICBmb250LXdlaWdodDogMzAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuMztcXG4gIGZvbnQtc3R5bGU6IGl0YWxpYztcXG4gIGxldHRlci1zcGFjaW5nOiAwO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bS1IZWFkaW5nMi0tcXVpZXQgc3Ryb25nLFxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtLUhlYWRpbmctLXBhZ2VUaXRsZSBzdHJvbmcge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiAzMXB4O1xcbiAgZm9udC13ZWlnaHQ6IDcwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjM7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMDtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW0tSGVhZGluZzEtLXN0cm9uZyB7XFxuICAgICAgICAgIGZvbnQtc2l6ZTogMzlweDtcXG4gIGZvbnQtd2VpZ2h0OiA5MDA7XFxuICBsaW5lLWhlaWdodDogMS4zO1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDA7XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgbWFyZ2luLWJvdHRvbTogMTBweDtcXG4gICAgICAgICAgbWFyZ2luLXRvcDogMTBweDtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bS1IZWFkaW5nMS0tc3Ryb25nIGVtIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogMzlweDtcXG4gIGZvbnQtd2VpZ2h0OiA5MDA7XFxuICBsaW5lLWhlaWdodDogMS4zO1xcbiAgZm9udC1zdHlsZTogaXRhbGljO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDA7XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtLUhlYWRpbmcxLS1zdHJvbmcgc3Ryb25nIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogMzlweDtcXG4gIGZvbnQtd2VpZ2h0OiA5MDA7XFxuICBsaW5lLWhlaWdodDogMS4zO1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDA7XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtLUhlYWRpbmcyLS1zdHJvbmcge1xcbiAgICAgICAgICBmb250LXNpemU6IDMxcHg7XFxuICBmb250LXdlaWdodDogOTAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuMztcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIG1hcmdpbi1ib3R0b206IDEwcHg7XFxuICAgICAgICAgIG1hcmdpbi10b3A6IDEwcHg7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW0tSGVhZGluZzItLXN0cm9uZyBlbSB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDMxcHg7XFxuICBmb250LXdlaWdodDogOTAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuMztcXG4gIGZvbnQtc3R5bGU6IGl0YWxpYztcXG4gIGxldHRlci1zcGFjaW5nOiAwO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bS1IZWFkaW5nMi0tc3Ryb25nIHN0cm9uZyB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDMxcHg7XFxuICBmb250LXdlaWdodDogOTAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuMztcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bS1IZWFkaW5nMS0tZGlzcGxheSB7XFxuICAgICAgICAgIGZvbnQtc2l6ZTogNDlweDtcXG4gIGZvbnQtd2VpZ2h0OiA3MDA7XFxuICBsaW5lLWhlaWdodDogMS4zO1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDA7XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgbWFyZ2luLWJvdHRvbTogMTBweDtcXG4gICAgICAgICAgbWFyZ2luLXRvcDogMTBweDtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bS1IZWFkaW5nMS0tZGlzcGxheSBlbSB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDQ5cHg7XFxuICBmb250LXdlaWdodDogNzAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuMztcXG4gIGZvbnQtc3R5bGU6IGl0YWxpYztcXG4gIGxldHRlci1zcGFjaW5nOiAwO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bS1IZWFkaW5nMS0tZGlzcGxheSBzdHJvbmcge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiA0OXB4O1xcbiAgZm9udC13ZWlnaHQ6IDkwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjM7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMDtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW0tSGVhZGluZzItLWRpc3BsYXkge1xcbiAgICAgICAgICBmb250LXNpemU6IDQ0cHg7XFxuICBmb250LXdlaWdodDogNzAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuMztcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIG1hcmdpbi1ib3R0b206IDEwcHg7XFxuICAgICAgICAgIG1hcmdpbi10b3A6IDEwcHg7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW0tSGVhZGluZzItLWRpc3BsYXkgZW0ge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiA0NHB4O1xcbiAgZm9udC13ZWlnaHQ6IDcwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjM7XFxuICBmb250LXN0eWxlOiBpdGFsaWM7XFxuICBsZXR0ZXItc3BhY2luZzogMDtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW0tSGVhZGluZzItLWRpc3BsYXkgc3Ryb25nIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogNDRweDtcXG4gIGZvbnQtd2VpZ2h0OiA3MDA7XFxuICBsaW5lLWhlaWdodDogMS4zO1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDA7XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtLUhlYWRpbmcxLS1kaXNwbGF5LnNwZWN0cnVtLUhlYWRpbmcxLS1zdHJvbmcge1xcbiAgICAgICAgICBmb250LXNpemU6IDQ5cHg7XFxuICBmb250LXdlaWdodDogOTAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuMztcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIG1hcmdpbi1ib3R0b206IDEwcHg7XFxuICAgICAgICAgIG1hcmdpbi10b3A6IDEwcHg7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW0tSGVhZGluZzEtLWRpc3BsYXkuc3BlY3RydW0tSGVhZGluZzEtLXN0cm9uZyBlbSB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDQ5cHg7XFxuICBmb250LXdlaWdodDogOTAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuMztcXG4gIGZvbnQtc3R5bGU6IGl0YWxpYztcXG4gIGxldHRlci1zcGFjaW5nOiAwO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bS1IZWFkaW5nMS0tZGlzcGxheS5zcGVjdHJ1bS1IZWFkaW5nMS0tc3Ryb25nIHN0cm9uZyB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDQ5cHg7XFxuICBmb250LXdlaWdodDogOTAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuMztcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bS1IZWFkaW5nMi0tZGlzcGxheS5zcGVjdHJ1bS1IZWFkaW5nMi0tc3Ryb25nIHtcXG4gICAgICAgICAgZm9udC1zaXplOiA0NHB4O1xcbiAgZm9udC13ZWlnaHQ6IDkwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjM7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMDtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICBtYXJnaW4tYm90dG9tOiAxMHB4O1xcbiAgICAgICAgICBtYXJnaW4tdG9wOiAxMHB4O1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtLUhlYWRpbmcyLS1kaXNwbGF5LnNwZWN0cnVtLUhlYWRpbmcyLS1zdHJvbmcgZW0ge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiA0NHB4O1xcbiAgZm9udC13ZWlnaHQ6IDkwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjM7XFxuICBmb250LXN0eWxlOiBpdGFsaWM7XFxuICBsZXR0ZXItc3BhY2luZzogMDtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW0tSGVhZGluZzItLWRpc3BsYXkuc3BlY3RydW0tSGVhZGluZzItLXN0cm9uZyBzdHJvbmcge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiA0NHB4O1xcbiAgZm9udC13ZWlnaHQ6IDkwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjM7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMDtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW0tSGVhZGluZzEtLWRpc3BsYXkuc3BlY3RydW0tSGVhZGluZzEtLXF1aWV0IHtcXG4gICAgICAgICAgZm9udC1zaXplOiA0OXB4O1xcbiAgZm9udC13ZWlnaHQ6IDMwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjM7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMDtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICBtYXJnaW4tYm90dG9tOiAxMHB4O1xcbiAgICAgICAgICBtYXJnaW4tdG9wOiAxMHB4O1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtLUhlYWRpbmcxLS1kaXNwbGF5LnNwZWN0cnVtLUhlYWRpbmcxLS1xdWlldCBlbSB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDQ5cHg7XFxuICBmb250LXdlaWdodDogMzAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuMztcXG4gIGZvbnQtc3R5bGU6IGl0YWxpYztcXG4gIGxldHRlci1zcGFjaW5nOiAwO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bS1IZWFkaW5nMS0tZGlzcGxheS5zcGVjdHJ1bS1IZWFkaW5nMS0tcXVpZXQgc3Ryb25nIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogNDlweDtcXG4gIGZvbnQtd2VpZ2h0OiA3MDA7XFxuICBsaW5lLWhlaWdodDogMS4zO1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDA7XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtLUhlYWRpbmcyLS1kaXNwbGF5LnNwZWN0cnVtLUhlYWRpbmcyLS1xdWlldCxcXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bS1IZWFkaW5nLS1kaXNwbGF5IHtcXG4gICAgICAgICAgZm9udC1zaXplOiA0NHB4O1xcbiAgZm9udC13ZWlnaHQ6IDMwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjM7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMDtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICBtYXJnaW4tYm90dG9tOiAxMHB4O1xcbiAgICAgICAgICBtYXJnaW4tdG9wOiAxMHB4O1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtLUhlYWRpbmcyLS1kaXNwbGF5LnNwZWN0cnVtLUhlYWRpbmcyLS1xdWlldCBlbSxcXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bS1IZWFkaW5nLS1kaXNwbGF5IGVtIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogNDRweDtcXG4gIGZvbnQtd2VpZ2h0OiAzMDA7XFxuICBsaW5lLWhlaWdodDogMS4zO1xcbiAgZm9udC1zdHlsZTogaXRhbGljO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDA7XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtLUhlYWRpbmcyLS1kaXNwbGF5LnNwZWN0cnVtLUhlYWRpbmcyLS1xdWlldCBzdHJvbmcsXFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW0tSGVhZGluZy0tZGlzcGxheSBzdHJvbmcge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiA0NHB4O1xcbiAgZm9udC13ZWlnaHQ6IDcwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjM7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMDtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW0tQXJ0aWNsZSB7XFxuICBmb250LWZhbWlseTogQWRvYmUgQ2xlYW4gU2VyaWYsIFRpbWVzIE5ldyBSb21hbiwgc2VyaWY7XFxufVxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLUJvZHkxIHtcXG4gICAgICAgICAgZm9udC1zaXplOiAyNHB4O1xcbiAgZm9udC13ZWlnaHQ6IDQwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjU7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wMTI1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgbWFyZ2luLWJvdHRvbTogMjBweDtcXG4gICAgICAgICAgbWFyZ2luLXRvcDogMTBweDtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bS1BcnRpY2xlIC5zcGVjdHJ1bS1Cb2R5MSBlbSB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDI0cHg7XFxuICBmb250LXdlaWdodDogNDAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gIGZvbnQtc3R5bGU6IGl0YWxpYztcXG4gIGxldHRlci1zcGFjaW5nOiAwLjAxMjVlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW0tQXJ0aWNsZSAuc3BlY3RydW0tQm9keTEgc3Ryb25nIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogMjRweDtcXG4gIGZvbnQtd2VpZ2h0OiA5MDA7XFxuICBsaW5lLWhlaWdodDogMS41O1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDEyNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bS1BcnRpY2xlIC5zcGVjdHJ1bS1Cb2R5MixcXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bS1BcnRpY2xlIC5zcGVjdHJ1bS1Cb2R5LS1sYXJnZSB7XFxuICAgICAgICAgIGZvbnQtc2l6ZTogMjJweDtcXG4gIGZvbnQtd2VpZ2h0OiA0MDA7XFxuICBsaW5lLWhlaWdodDogMS41O1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDEyNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIG1hcmdpbi1ib3R0b206IDIwcHg7XFxuICAgICAgICAgIG1hcmdpbi10b3A6IDEwcHg7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW0tQXJ0aWNsZSAuc3BlY3RydW0tQm9keTIgZW0sXFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW0tQXJ0aWNsZSAuc3BlY3RydW0tQm9keS0tbGFyZ2UgZW0ge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiAyMnB4O1xcbiAgZm9udC13ZWlnaHQ6IDQwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjU7XFxuICBmb250LXN0eWxlOiBpdGFsaWM7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wMTI1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLUJvZHkyIHN0cm9uZyxcXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bS1BcnRpY2xlIC5zcGVjdHJ1bS1Cb2R5LS1sYXJnZSBzdHJvbmcge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiAyMnB4O1xcbiAgZm9udC13ZWlnaHQ6IDkwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjU7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wMTI1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLUJvZHkzIHtcXG4gICAgICAgICAgZm9udC1zaXplOiAxOXB4O1xcbiAgZm9udC13ZWlnaHQ6IDQwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjU7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wMTI1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgbWFyZ2luLWJvdHRvbTogMjBweDtcXG4gICAgICAgICAgbWFyZ2luLXRvcDogMTBweDtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bS1BcnRpY2xlIC5zcGVjdHJ1bS1Cb2R5MyBlbSB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDE5cHg7XFxuICBmb250LXdlaWdodDogNDAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gIGZvbnQtc3R5bGU6IGl0YWxpYztcXG4gIGxldHRlci1zcGFjaW5nOiAwLjAxMjVlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW0tQXJ0aWNsZSAuc3BlY3RydW0tQm9keTMgc3Ryb25nIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogMTlweDtcXG4gIGZvbnQtd2VpZ2h0OiA5MDA7XFxuICBsaW5lLWhlaWdodDogMS41O1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDEyNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bS1BcnRpY2xlIC5zcGVjdHJ1bS1Cb2R5NCxcXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bS1BcnRpY2xlIC5zcGVjdHJ1bS1Cb2R5LS1zZWNvbmRhcnkge1xcbiAgICAgICAgICBmb250LXNpemU6IDE3cHg7XFxuICBmb250LXdlaWdodDogNDAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjAxMjVlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICBtYXJnaW4tYm90dG9tOiAyMHB4O1xcbiAgICAgICAgICBtYXJnaW4tdG9wOiAxMHB4O1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLUJvZHk0IGVtLFxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLUJvZHktLXNlY29uZGFyeSBlbSB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDE3cHg7XFxuICBmb250LXdlaWdodDogNDAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gIGZvbnQtc3R5bGU6IGl0YWxpYztcXG4gIGxldHRlci1zcGFjaW5nOiAwLjAxMjVlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW0tQXJ0aWNsZSAuc3BlY3RydW0tQm9keTQgc3Ryb25nLFxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLUJvZHktLXNlY29uZGFyeSBzdHJvbmcge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiAxN3B4O1xcbiAgZm9udC13ZWlnaHQ6IDkwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjU7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wMTI1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLUJvZHk1LFxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLUJvZHktLXNtYWxsIHtcXG4gICAgICAgICAgZm9udC1zaXplOiAxNXB4O1xcbiAgZm9udC13ZWlnaHQ6IDQwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjU7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wMTI1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgbWFyZ2luLWJvdHRvbTogMjBweDtcXG4gICAgICAgICAgbWFyZ2luLXRvcDogMTBweDtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bS1BcnRpY2xlIC5zcGVjdHJ1bS1Cb2R5NSBlbSxcXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bS1BcnRpY2xlIC5zcGVjdHJ1bS1Cb2R5LS1zbWFsbCBlbSB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDE1cHg7XFxuICBmb250LXdlaWdodDogNDAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gIGZvbnQtc3R5bGU6IGl0YWxpYztcXG4gIGxldHRlci1zcGFjaW5nOiAwLjAxMjVlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW0tQXJ0aWNsZSAuc3BlY3RydW0tQm9keTUgc3Ryb25nLFxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLUJvZHktLXNtYWxsIHN0cm9uZyB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDE1cHg7XFxuICBmb250LXdlaWdodDogOTAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjAxMjVlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW0tQXJ0aWNsZSAuc3BlY3RydW0tSGVhZGluZzEge1xcbiAgICAgICAgICBmb250LXNpemU6IDM5cHg7XFxuICBmb250LXdlaWdodDogNzAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuMztcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjAxMjVlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICBtYXJnaW4tYm90dG9tOiAxMHB4O1xcbiAgICAgICAgICBtYXJnaW4tdG9wOiAxMHB4O1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLUhlYWRpbmcxIGVtIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogMzlweDtcXG4gIGZvbnQtd2VpZ2h0OiA3MDA7XFxuICBsaW5lLWhlaWdodDogMS4zO1xcbiAgZm9udC1zdHlsZTogaXRhbGljO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDEyNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bS1BcnRpY2xlIC5zcGVjdHJ1bS1IZWFkaW5nMSBzdHJvbmcge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiAzOXB4O1xcbiAgZm9udC13ZWlnaHQ6IDkwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjM7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wMTI1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLUhlYWRpbmcyIHtcXG4gICAgICAgICAgZm9udC1zaXplOiAzMXB4O1xcbiAgZm9udC13ZWlnaHQ6IDcwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjM7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wMTI1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgbWFyZ2luLWJvdHRvbTogMTBweDtcXG4gICAgICAgICAgbWFyZ2luLXRvcDogMTBweDtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bS1BcnRpY2xlIC5zcGVjdHJ1bS1IZWFkaW5nMiBlbSB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDMxcHg7XFxuICBmb250LXdlaWdodDogNzAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuMztcXG4gIGZvbnQtc3R5bGU6IGl0YWxpYztcXG4gIGxldHRlci1zcGFjaW5nOiAwLjAxMjVlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW0tQXJ0aWNsZSAuc3BlY3RydW0tSGVhZGluZzIgc3Ryb25nIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogMzFweDtcXG4gIGZvbnQtd2VpZ2h0OiA5MDA7XFxuICBsaW5lLWhlaWdodDogMS4zO1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDEyNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bS1BcnRpY2xlIC5zcGVjdHJ1bS1IZWFkaW5nMyB7XFxuICAgICAgICAgIGZvbnQtc2l6ZTogMjRweDtcXG4gIGZvbnQtd2VpZ2h0OiA3MDA7XFxuICBsaW5lLWhlaWdodDogMS4zO1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDEyNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIG1hcmdpbi1ib3R0b206IDEwcHg7XFxuICAgICAgICAgIG1hcmdpbi10b3A6IDEwcHg7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW0tQXJ0aWNsZSAuc3BlY3RydW0tSGVhZGluZzMgZW0ge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiAyNHB4O1xcbiAgZm9udC13ZWlnaHQ6IDcwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjM7XFxuICBmb250LXN0eWxlOiBpdGFsaWM7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wMTI1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLUhlYWRpbmczIHN0cm9uZyB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDI0cHg7XFxuICBmb250LXdlaWdodDogOTAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuMztcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjAxMjVlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW0tQXJ0aWNsZSAuc3BlY3RydW0tSGVhZGluZzQsXFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW0tQXJ0aWNsZSAuc3BlY3RydW0tSGVhZGluZy0tc3VidGl0bGUxIHtcXG4gICAgICAgICAgZm9udC1zaXplOiAyMnB4O1xcbiAgZm9udC13ZWlnaHQ6IDcwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjM7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wMTI1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgbWFyZ2luLWJvdHRvbTogMTBweDtcXG4gICAgICAgICAgbWFyZ2luLXRvcDogMTBweDtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bS1BcnRpY2xlIC5zcGVjdHJ1bS1IZWFkaW5nNCBlbSxcXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bS1BcnRpY2xlIC5zcGVjdHJ1bS1IZWFkaW5nLS1zdWJ0aXRsZTEgZW0ge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiAyMnB4O1xcbiAgZm9udC13ZWlnaHQ6IDcwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjM7XFxuICBmb250LXN0eWxlOiBpdGFsaWM7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wMTI1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLUhlYWRpbmc0IHN0cm9uZyxcXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bS1BcnRpY2xlIC5zcGVjdHJ1bS1IZWFkaW5nLS1zdWJ0aXRsZTEgc3Ryb25nIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogMjJweDtcXG4gIGZvbnQtd2VpZ2h0OiA5MDA7XFxuICBsaW5lLWhlaWdodDogMS4zO1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDEyNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bS1BcnRpY2xlIC5zcGVjdHJ1bS1IZWFkaW5nNSB7XFxuICAgICAgICAgIGZvbnQtc2l6ZTogMTlweDtcXG4gIGZvbnQtd2VpZ2h0OiA3MDA7XFxuICBsaW5lLWhlaWdodDogMS4zO1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDEyNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIG1hcmdpbi1ib3R0b206IDEwcHg7XFxuICAgICAgICAgIG1hcmdpbi10b3A6IDEwcHg7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW0tQXJ0aWNsZSAuc3BlY3RydW0tSGVhZGluZzUgZW0ge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiAxOXB4O1xcbiAgZm9udC13ZWlnaHQ6IDcwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjM7XFxuICBmb250LXN0eWxlOiBpdGFsaWM7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wMTI1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLUhlYWRpbmc1IHN0cm9uZyB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDE5cHg7XFxuICBmb250LXdlaWdodDogOTAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuMztcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjAxMjVlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW0tQXJ0aWNsZSAuc3BlY3RydW0tSGVhZGluZzYsXFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW0tQXJ0aWNsZSAuc3BlY3RydW0tSGVhZGluZy0tc3VidGl0bGUyIHtcXG4gICAgICAgICAgZm9udC1zaXplOiAxN3B4O1xcbiAgZm9udC13ZWlnaHQ6IDcwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjM7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wMTI1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgbWFyZ2luLWJvdHRvbTogMTBweDtcXG4gICAgICAgICAgbWFyZ2luLXRvcDogMTBweDtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bS1BcnRpY2xlIC5zcGVjdHJ1bS1IZWFkaW5nNiBlbSxcXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bS1BcnRpY2xlIC5zcGVjdHJ1bS1IZWFkaW5nLS1zdWJ0aXRsZTIgZW0ge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiAxN3B4O1xcbiAgZm9udC13ZWlnaHQ6IDcwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjM7XFxuICBmb250LXN0eWxlOiBpdGFsaWM7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wMTI1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLUhlYWRpbmc2IHN0cm9uZyxcXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bS1BcnRpY2xlIC5zcGVjdHJ1bS1IZWFkaW5nLS1zdWJ0aXRsZTIgc3Ryb25nIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogMTdweDtcXG4gIGZvbnQtd2VpZ2h0OiA5MDA7XFxuICBsaW5lLWhlaWdodDogMS4zO1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDEyNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bS1BcnRpY2xlIC5zcGVjdHJ1bS1TdWJoZWFkaW5nLFxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLUhlYWRpbmctLXN1YnRpdGxlMyB7XFxuICAgICAgICAgIGZvbnQtc2l6ZTogMTNweDtcXG4gIGZvbnQtd2VpZ2h0OiA3MDA7XFxuICBsaW5lLWhlaWdodDogMS4zO1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDZlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XFxuXFxuICAgICAgICAgIG1hcmdpbi1ib3R0b206IDEwcHg7XFxuICAgICAgICAgIG1hcmdpbi10b3A6IDEwcHg7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW0tQXJ0aWNsZSAuc3BlY3RydW0tU3ViaGVhZGluZyBlbSxcXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bS1BcnRpY2xlIC5zcGVjdHJ1bS1IZWFkaW5nLS1zdWJ0aXRsZTMgZW0ge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiAxM3B4O1xcbiAgZm9udC13ZWlnaHQ6IDcwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjM7XFxuICBmb250LXN0eWxlOiBpdGFsaWM7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wNmVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLVN1YmhlYWRpbmcgc3Ryb25nLFxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLUhlYWRpbmctLXN1YnRpdGxlMyBzdHJvbmcge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiAxM3B4O1xcbiAgZm9udC13ZWlnaHQ6IDkwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjM7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wNmVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLURldGFpbCB7XFxuICAgICAgICAgIGZvbnQtc2l6ZTogMTNweDtcXG4gIGZvbnQtd2VpZ2h0OiA0MDA7XFxuICBsaW5lLWhlaWdodDogMS41O1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDZlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XFxuXFxuICAgICAgICAgIG1hcmdpbi1ib3R0b206IDIwcHg7XFxuICAgICAgICAgIG1hcmdpbi10b3A6IDEwcHg7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW0tQXJ0aWNsZSAuc3BlY3RydW0tRGV0YWlsIGVtIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogMTNweDtcXG4gIGZvbnQtd2VpZ2h0OiA0MDA7XFxuICBsaW5lLWhlaWdodDogMS41O1xcbiAgZm9udC1zdHlsZTogaXRhbGljO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDZlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bS1BcnRpY2xlIC5zcGVjdHJ1bS1EZXRhaWwgc3Ryb25nIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogMTNweDtcXG4gIGZvbnQtd2VpZ2h0OiA3MDA7XFxuICBsaW5lLWhlaWdodDogMS41O1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDZlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bS1BcnRpY2xlIC5zcGVjdHJ1bS1IZWFkaW5nMS0tcXVpZXQge1xcbiAgICAgICAgICBmb250LXNpemU6IDM5cHg7XFxuICBmb250LXdlaWdodDogNDAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuMztcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjAxMjVlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICBtYXJnaW4tYm90dG9tOiAxMHB4O1xcbiAgICAgICAgICBtYXJnaW4tdG9wOiAxMHB4O1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLUhlYWRpbmcxLS1xdWlldCBlbSB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDM5cHg7XFxuICBmb250LXdlaWdodDogNDAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuMztcXG4gIGZvbnQtc3R5bGU6IGl0YWxpYztcXG4gIGxldHRlci1zcGFjaW5nOiAwLjAxMjVlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW0tQXJ0aWNsZSAuc3BlY3RydW0tSGVhZGluZzEtLXF1aWV0IHN0cm9uZyB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDM5cHg7XFxuICBmb250LXdlaWdodDogOTAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuMztcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjAxMjVlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW0tQXJ0aWNsZSAuc3BlY3RydW0tSGVhZGluZzItLXF1aWV0LFxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLUhlYWRpbmctLXBhZ2VUaXRsZSB7XFxuICAgICAgICAgIGZvbnQtc2l6ZTogMzFweDtcXG4gIGZvbnQtd2VpZ2h0OiA0MDA7XFxuICBsaW5lLWhlaWdodDogMS4zO1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDEyNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIG1hcmdpbi1ib3R0b206IDEwcHg7XFxuICAgICAgICAgIG1hcmdpbi10b3A6IDEwcHg7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW0tQXJ0aWNsZSAuc3BlY3RydW0tSGVhZGluZzItLXF1aWV0IGVtLFxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLUhlYWRpbmctLXBhZ2VUaXRsZSBlbSB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDMxcHg7XFxuICBmb250LXdlaWdodDogNDAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuMztcXG4gIGZvbnQtc3R5bGU6IGl0YWxpYztcXG4gIGxldHRlci1zcGFjaW5nOiAwLjAxMjVlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW0tQXJ0aWNsZSAuc3BlY3RydW0tSGVhZGluZzItLXF1aWV0IHN0cm9uZyxcXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bS1BcnRpY2xlIC5zcGVjdHJ1bS1IZWFkaW5nLS1wYWdlVGl0bGUgc3Ryb25nIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogMzFweDtcXG4gIGZvbnQtd2VpZ2h0OiA5MDA7XFxuICBsaW5lLWhlaWdodDogMS4zO1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDEyNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bS1BcnRpY2xlIC5zcGVjdHJ1bS1IZWFkaW5nMS0tZGlzcGxheSB7XFxuICAgICAgICAgIGZvbnQtc2l6ZTogNDlweDtcXG4gIGZvbnQtd2VpZ2h0OiA3MDA7XFxuICBsaW5lLWhlaWdodDogMS4zO1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDEyNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIG1hcmdpbi1ib3R0b206IDEwcHg7XFxuICAgICAgICAgIG1hcmdpbi10b3A6IDEwcHg7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW0tQXJ0aWNsZSAuc3BlY3RydW0tSGVhZGluZzEtLWRpc3BsYXkgZW0ge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiA0OXB4O1xcbiAgZm9udC13ZWlnaHQ6IDcwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjM7XFxuICBmb250LXN0eWxlOiBpdGFsaWM7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wMTI1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLUhlYWRpbmcxLS1kaXNwbGF5IHN0cm9uZyB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDQ5cHg7XFxuICBmb250LXdlaWdodDogOTAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuMztcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjAxMjVlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW0tQXJ0aWNsZSAuc3BlY3RydW0tSGVhZGluZzItLWRpc3BsYXkge1xcbiAgICAgICAgICBmb250LXNpemU6IDQ0cHg7XFxuICBmb250LXdlaWdodDogNzAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuMztcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjAxMjVlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICBtYXJnaW4tYm90dG9tOiAxMHB4O1xcbiAgICAgICAgICBtYXJnaW4tdG9wOiAxMHB4O1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLUhlYWRpbmcyLS1kaXNwbGF5IGVtIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogNDRweDtcXG4gIGZvbnQtd2VpZ2h0OiA3MDA7XFxuICBsaW5lLWhlaWdodDogMS4zO1xcbiAgZm9udC1zdHlsZTogaXRhbGljO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDEyNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bS1BcnRpY2xlIC5zcGVjdHJ1bS1IZWFkaW5nMi0tZGlzcGxheSBzdHJvbmcge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiA0NHB4O1xcbiAgZm9udC13ZWlnaHQ6IDkwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjM7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wMTI1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLUhlYWRpbmcxLS1kaXNwbGF5LnNwZWN0cnVtLUhlYWRpbmcxLS1xdWlldCB7XFxuICAgICAgICAgIGZvbnQtc2l6ZTogNDlweDtcXG4gIGZvbnQtd2VpZ2h0OiA0MDA7XFxuICBsaW5lLWhlaWdodDogMS4zO1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDEyNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIG1hcmdpbi1ib3R0b206IDEwcHg7XFxuICAgICAgICAgIG1hcmdpbi10b3A6IDEwcHg7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW0tQXJ0aWNsZSAuc3BlY3RydW0tSGVhZGluZzEtLWRpc3BsYXkuc3BlY3RydW0tSGVhZGluZzEtLXF1aWV0IGVtIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogNDlweDtcXG4gIGZvbnQtd2VpZ2h0OiA0MDA7XFxuICBsaW5lLWhlaWdodDogMS4zO1xcbiAgZm9udC1zdHlsZTogaXRhbGljO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDEyNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bS1BcnRpY2xlIC5zcGVjdHJ1bS1IZWFkaW5nMS0tZGlzcGxheS5zcGVjdHJ1bS1IZWFkaW5nMS0tcXVpZXQgc3Ryb25nIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogNDlweDtcXG4gIGZvbnQtd2VpZ2h0OiA3MDA7XFxuICBsaW5lLWhlaWdodDogMS4zO1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDEyNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bS1BcnRpY2xlIC5zcGVjdHJ1bS1IZWFkaW5nMi0tZGlzcGxheS5zcGVjdHJ1bS1IZWFkaW5nMi0tcXVpZXQsXFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW0tQXJ0aWNsZSAuc3BlY3RydW0tSGVhZGluZy0tZGlzcGxheSB7XFxuICAgICAgICAgIGZvbnQtc2l6ZTogNDRweDtcXG4gIGZvbnQtd2VpZ2h0OiA0MDA7XFxuICBsaW5lLWhlaWdodDogMS4zO1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDEyNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIG1hcmdpbi1ib3R0b206IDEwcHg7XFxuICAgICAgICAgIG1hcmdpbi10b3A6IDEwcHg7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW0tQXJ0aWNsZSAuc3BlY3RydW0tSGVhZGluZzItLWRpc3BsYXkuc3BlY3RydW0tSGVhZGluZzItLXF1aWV0IGVtLFxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLUhlYWRpbmctLWRpc3BsYXkgZW0ge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiA0NHB4O1xcbiAgZm9udC13ZWlnaHQ6IDQwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjM7XFxuICBmb250LXN0eWxlOiBpdGFsaWM7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wMTI1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLUhlYWRpbmcyLS1kaXNwbGF5LnNwZWN0cnVtLUhlYWRpbmcyLS1xdWlldCBzdHJvbmcsXFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW0tQXJ0aWNsZSAuc3BlY3RydW0tSGVhZGluZy0tZGlzcGxheSBzdHJvbmcge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiA0NHB4O1xcbiAgZm9udC13ZWlnaHQ6IDcwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjM7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wMTI1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1Cb2R5MSwgLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUJvZHkxLCAuc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tQm9keTEge1xcbiAgICAgICAgICBmb250LXNpemU6IDI0cHg7XFxuICBmb250LXdlaWdodDogNDAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNztcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjA1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgbWFyZ2luLWJvdHRvbTogMjBweDtcXG4gICAgICAgICAgbWFyZ2luLXRvcDogMTBweDtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tQm9keTEgZW0sIC5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtOmxhbmcoa28pIC5zcGVjdHJ1bS1Cb2R5MSBlbSwgLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLUJvZHkxIGVtIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogMjRweDtcXG4gIGZvbnQtd2VpZ2h0OiA3MDA7XFxuICBsaW5lLWhlaWdodDogMS43O1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDVlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW06bGFuZyhqYSkgLnNwZWN0cnVtLUJvZHkxIHN0cm9uZywgLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUJvZHkxIHN0cm9uZywgLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLUJvZHkxIHN0cm9uZyB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDI0cHg7XFxuICBmb250LXdlaWdodDogOTAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNztcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjA1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1Cb2R5MixcXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tQm9keTIsXFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLUJvZHkyLFxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1Cb2R5LS1sYXJnZSxcXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tQm9keS0tbGFyZ2UsXFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLUJvZHktLWxhcmdlIHtcXG4gICAgICAgICAgZm9udC1zaXplOiAyMnB4O1xcbiAgZm9udC13ZWlnaHQ6IDQwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjc7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIG1hcmdpbi1ib3R0b206IDIwcHg7XFxuICAgICAgICAgIG1hcmdpbi10b3A6IDEwcHg7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW06bGFuZyhqYSkgLnNwZWN0cnVtLUJvZHkyIGVtLFxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtOmxhbmcoa28pIC5zcGVjdHJ1bS1Cb2R5MiBlbSxcXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tQm9keTIgZW0sXFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW06bGFuZyhqYSkgLnNwZWN0cnVtLUJvZHktLWxhcmdlIGVtLFxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtOmxhbmcoa28pIC5zcGVjdHJ1bS1Cb2R5LS1sYXJnZSBlbSxcXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tQm9keS0tbGFyZ2UgZW0ge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiAyMnB4O1xcbiAgZm9udC13ZWlnaHQ6IDcwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjc7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tQm9keTIgc3Ryb25nLFxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtOmxhbmcoa28pIC5zcGVjdHJ1bS1Cb2R5MiBzdHJvbmcsXFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLUJvZHkyIHN0cm9uZyxcXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tQm9keS0tbGFyZ2Ugc3Ryb25nLFxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtOmxhbmcoa28pIC5zcGVjdHJ1bS1Cb2R5LS1sYXJnZSBzdHJvbmcsXFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLUJvZHktLWxhcmdlIHN0cm9uZyB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDIycHg7XFxuICBmb250LXdlaWdodDogOTAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNztcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjA1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1Cb2R5MywgLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUJvZHkzLCAuc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tQm9keTMge1xcbiAgICAgICAgICBmb250LXNpemU6IDE5cHg7XFxuICBmb250LXdlaWdodDogNDAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNztcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjA1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgbWFyZ2luLWJvdHRvbTogMjBweDtcXG4gICAgICAgICAgbWFyZ2luLXRvcDogMTBweDtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tQm9keTMgZW0sIC5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtOmxhbmcoa28pIC5zcGVjdHJ1bS1Cb2R5MyBlbSwgLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLUJvZHkzIGVtIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogMTlweDtcXG4gIGZvbnQtd2VpZ2h0OiA3MDA7XFxuICBsaW5lLWhlaWdodDogMS43O1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDVlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW06bGFuZyhqYSkgLnNwZWN0cnVtLUJvZHkzIHN0cm9uZywgLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUJvZHkzIHN0cm9uZywgLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLUJvZHkzIHN0cm9uZyB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDE5cHg7XFxuICBmb250LXdlaWdodDogOTAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNztcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjA1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1Cb2R5NCxcXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tQm9keTQsXFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLUJvZHk0LFxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1Cb2R5LS1zZWNvbmRhcnksXFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUJvZHktLXNlY29uZGFyeSxcXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tQm9keS0tc2Vjb25kYXJ5IHtcXG4gICAgICAgICAgZm9udC1zaXplOiAxN3B4O1xcbiAgZm9udC13ZWlnaHQ6IDQwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjc7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIG1hcmdpbi1ib3R0b206IDIwcHg7XFxuICAgICAgICAgIG1hcmdpbi10b3A6IDEwcHg7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW06bGFuZyhqYSkgLnNwZWN0cnVtLUJvZHk0IGVtLFxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtOmxhbmcoa28pIC5zcGVjdHJ1bS1Cb2R5NCBlbSxcXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tQm9keTQgZW0sXFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW06bGFuZyhqYSkgLnNwZWN0cnVtLUJvZHktLXNlY29uZGFyeSBlbSxcXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tQm9keS0tc2Vjb25kYXJ5IGVtLFxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1Cb2R5LS1zZWNvbmRhcnkgZW0ge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiAxN3B4O1xcbiAgZm9udC13ZWlnaHQ6IDcwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjc7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tQm9keTQgc3Ryb25nLFxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtOmxhbmcoa28pIC5zcGVjdHJ1bS1Cb2R5NCBzdHJvbmcsXFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLUJvZHk0IHN0cm9uZyxcXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tQm9keS0tc2Vjb25kYXJ5IHN0cm9uZyxcXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tQm9keS0tc2Vjb25kYXJ5IHN0cm9uZyxcXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tQm9keS0tc2Vjb25kYXJ5IHN0cm9uZyB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDE3cHg7XFxuICBmb250LXdlaWdodDogOTAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNztcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjA1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1Cb2R5NSxcXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tQm9keTUsXFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLUJvZHk1LFxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1Cb2R5LS1zbWFsbCxcXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tQm9keS0tc21hbGwsXFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLUJvZHktLXNtYWxsIHtcXG4gICAgICAgICAgZm9udC1zaXplOiAxNXB4O1xcbiAgZm9udC13ZWlnaHQ6IDQwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjc7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIG1hcmdpbi1ib3R0b206IDIwcHg7XFxuICAgICAgICAgIG1hcmdpbi10b3A6IDEwcHg7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW06bGFuZyhqYSkgLnNwZWN0cnVtLUJvZHk1IGVtLFxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtOmxhbmcoa28pIC5zcGVjdHJ1bS1Cb2R5NSBlbSxcXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tQm9keTUgZW0sXFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW06bGFuZyhqYSkgLnNwZWN0cnVtLUJvZHktLXNtYWxsIGVtLFxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtOmxhbmcoa28pIC5zcGVjdHJ1bS1Cb2R5LS1zbWFsbCBlbSxcXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tQm9keS0tc21hbGwgZW0ge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiAxNXB4O1xcbiAgZm9udC13ZWlnaHQ6IDcwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjc7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tQm9keTUgc3Ryb25nLFxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtOmxhbmcoa28pIC5zcGVjdHJ1bS1Cb2R5NSBzdHJvbmcsXFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLUJvZHk1IHN0cm9uZyxcXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tQm9keS0tc21hbGwgc3Ryb25nLFxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtOmxhbmcoa28pIC5zcGVjdHJ1bS1Cb2R5LS1zbWFsbCBzdHJvbmcsXFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLUJvZHktLXNtYWxsIHN0cm9uZyB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDE1cHg7XFxuICBmb250LXdlaWdodDogOTAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNztcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjA1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1IZWFkaW5nMSwgLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUhlYWRpbmcxLCAuc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tSGVhZGluZzEge1xcbiAgICAgICAgICBmb250LXNpemU6IDM5cHg7XFxuICBmb250LXdlaWdodDogNzAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjA1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgbWFyZ2luLWJvdHRvbTogMTBweDtcXG4gICAgICAgICAgbWFyZ2luLXRvcDogMTBweDtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tSGVhZGluZzEgZW0sIC5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtOmxhbmcoa28pIC5zcGVjdHJ1bS1IZWFkaW5nMSBlbSwgLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLUhlYWRpbmcxIGVtIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogMzlweDtcXG4gIGZvbnQtd2VpZ2h0OiA4MDA7XFxuICBsaW5lLWhlaWdodDogMS41O1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDVlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW06bGFuZyhqYSkgLnNwZWN0cnVtLUhlYWRpbmcxIHN0cm9uZywgLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUhlYWRpbmcxIHN0cm9uZywgLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLUhlYWRpbmcxIHN0cm9uZyB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDM5cHg7XFxuICBmb250LXdlaWdodDogOTAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjA1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1IZWFkaW5nMiwgLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUhlYWRpbmcyLCAuc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tSGVhZGluZzIge1xcbiAgICAgICAgICBmb250LXNpemU6IDMxcHg7XFxuICBmb250LXdlaWdodDogNzAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjA1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgbWFyZ2luLWJvdHRvbTogMTBweDtcXG4gICAgICAgICAgbWFyZ2luLXRvcDogMTBweDtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tSGVhZGluZzIgZW0sIC5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtOmxhbmcoa28pIC5zcGVjdHJ1bS1IZWFkaW5nMiBlbSwgLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLUhlYWRpbmcyIGVtIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogMzFweDtcXG4gIGZvbnQtd2VpZ2h0OiA4MDA7XFxuICBsaW5lLWhlaWdodDogMS41O1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDVlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW06bGFuZyhqYSkgLnNwZWN0cnVtLUhlYWRpbmcyIHN0cm9uZywgLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUhlYWRpbmcyIHN0cm9uZywgLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLUhlYWRpbmcyIHN0cm9uZyB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDMxcHg7XFxuICBmb250LXdlaWdodDogOTAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjA1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1IZWFkaW5nMywgLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUhlYWRpbmczLCAuc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tSGVhZGluZzMge1xcbiAgICAgICAgICBmb250LXNpemU6IDI0cHg7XFxuICBmb250LXdlaWdodDogNzAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjA1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgbWFyZ2luLWJvdHRvbTogMTBweDtcXG4gICAgICAgICAgbWFyZ2luLXRvcDogMTBweDtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tSGVhZGluZzMgZW0sIC5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtOmxhbmcoa28pIC5zcGVjdHJ1bS1IZWFkaW5nMyBlbSwgLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLUhlYWRpbmczIGVtIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogMjRweDtcXG4gIGZvbnQtd2VpZ2h0OiA4MDA7XFxuICBsaW5lLWhlaWdodDogMS41O1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDVlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW06bGFuZyhqYSkgLnNwZWN0cnVtLUhlYWRpbmczIHN0cm9uZywgLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUhlYWRpbmczIHN0cm9uZywgLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLUhlYWRpbmczIHN0cm9uZyB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDI0cHg7XFxuICBmb250LXdlaWdodDogOTAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjA1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1IZWFkaW5nNCxcXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tSGVhZGluZzQsXFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLUhlYWRpbmc0LFxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1IZWFkaW5nLS1zdWJ0aXRsZTEsXFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUhlYWRpbmctLXN1YnRpdGxlMSxcXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tSGVhZGluZy0tc3VidGl0bGUxIHtcXG4gICAgICAgICAgZm9udC1zaXplOiAyMnB4O1xcbiAgZm9udC13ZWlnaHQ6IDcwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjU7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIG1hcmdpbi1ib3R0b206IDEwcHg7XFxuICAgICAgICAgIG1hcmdpbi10b3A6IDEwcHg7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW06bGFuZyhqYSkgLnNwZWN0cnVtLUhlYWRpbmc0IGVtLFxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtOmxhbmcoa28pIC5zcGVjdHJ1bS1IZWFkaW5nNCBlbSxcXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tSGVhZGluZzQgZW0sXFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW06bGFuZyhqYSkgLnNwZWN0cnVtLUhlYWRpbmctLXN1YnRpdGxlMSBlbSxcXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tSGVhZGluZy0tc3VidGl0bGUxIGVtLFxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1IZWFkaW5nLS1zdWJ0aXRsZTEgZW0ge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiAyMnB4O1xcbiAgZm9udC13ZWlnaHQ6IDgwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjU7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tSGVhZGluZzQgc3Ryb25nLFxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtOmxhbmcoa28pIC5zcGVjdHJ1bS1IZWFkaW5nNCBzdHJvbmcsXFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLUhlYWRpbmc0IHN0cm9uZyxcXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tSGVhZGluZy0tc3VidGl0bGUxIHN0cm9uZyxcXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tSGVhZGluZy0tc3VidGl0bGUxIHN0cm9uZyxcXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tSGVhZGluZy0tc3VidGl0bGUxIHN0cm9uZyB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDIycHg7XFxuICBmb250LXdlaWdodDogOTAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjA1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1IZWFkaW5nNSwgLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUhlYWRpbmc1LCAuc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tSGVhZGluZzUge1xcbiAgICAgICAgICBmb250LXNpemU6IDE5cHg7XFxuICBmb250LXdlaWdodDogNzAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjA1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgbWFyZ2luLWJvdHRvbTogMTBweDtcXG4gICAgICAgICAgbWFyZ2luLXRvcDogMTBweDtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tSGVhZGluZzUgZW0sIC5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtOmxhbmcoa28pIC5zcGVjdHJ1bS1IZWFkaW5nNSBlbSwgLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLUhlYWRpbmc1IGVtIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogMTlweDtcXG4gIGZvbnQtd2VpZ2h0OiA4MDA7XFxuICBsaW5lLWhlaWdodDogMS41O1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDVlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW06bGFuZyhqYSkgLnNwZWN0cnVtLUhlYWRpbmc1IHN0cm9uZywgLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUhlYWRpbmc1IHN0cm9uZywgLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLUhlYWRpbmc1IHN0cm9uZyB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDE5cHg7XFxuICBmb250LXdlaWdodDogOTAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjA1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1IZWFkaW5nNixcXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tSGVhZGluZzYsXFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLUhlYWRpbmc2LFxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1IZWFkaW5nLS1zdWJ0aXRsZTIsXFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUhlYWRpbmctLXN1YnRpdGxlMixcXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tSGVhZGluZy0tc3VidGl0bGUyIHtcXG4gICAgICAgICAgZm9udC1zaXplOiAxN3B4O1xcbiAgZm9udC13ZWlnaHQ6IDcwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjU7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIG1hcmdpbi1ib3R0b206IDEwcHg7XFxuICAgICAgICAgIG1hcmdpbi10b3A6IDEwcHg7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW06bGFuZyhqYSkgLnNwZWN0cnVtLUhlYWRpbmc2IGVtLFxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtOmxhbmcoa28pIC5zcGVjdHJ1bS1IZWFkaW5nNiBlbSxcXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tSGVhZGluZzYgZW0sXFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW06bGFuZyhqYSkgLnNwZWN0cnVtLUhlYWRpbmctLXN1YnRpdGxlMiBlbSxcXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tSGVhZGluZy0tc3VidGl0bGUyIGVtLFxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1IZWFkaW5nLS1zdWJ0aXRsZTIgZW0ge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiAxN3B4O1xcbiAgZm9udC13ZWlnaHQ6IDgwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjU7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tSGVhZGluZzYgc3Ryb25nLFxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtOmxhbmcoa28pIC5zcGVjdHJ1bS1IZWFkaW5nNiBzdHJvbmcsXFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLUhlYWRpbmc2IHN0cm9uZyxcXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tSGVhZGluZy0tc3VidGl0bGUyIHN0cm9uZyxcXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tSGVhZGluZy0tc3VidGl0bGUyIHN0cm9uZyxcXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tSGVhZGluZy0tc3VidGl0bGUyIHN0cm9uZyB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDE3cHg7XFxuICBmb250LXdlaWdodDogOTAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjA1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1TdWJoZWFkaW5nLFxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtOmxhbmcoa28pIC5zcGVjdHJ1bS1TdWJoZWFkaW5nLFxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1TdWJoZWFkaW5nLFxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1IZWFkaW5nLS1zdWJ0aXRsZTMsXFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUhlYWRpbmctLXN1YnRpdGxlMyxcXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tSGVhZGluZy0tc3VidGl0bGUzIHtcXG4gICAgICAgICAgZm9udC1zaXplOiAxM3B4O1xcbiAgZm9udC13ZWlnaHQ6IDcwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjM7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wNmVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcXG5cXG4gICAgICAgICAgbWFyZ2luLWJvdHRvbTogMTBweDtcXG4gICAgICAgICAgbWFyZ2luLXRvcDogMTBweDtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tU3ViaGVhZGluZyBlbSxcXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tU3ViaGVhZGluZyBlbSxcXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tU3ViaGVhZGluZyBlbSxcXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tSGVhZGluZy0tc3VidGl0bGUzIGVtLFxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtOmxhbmcoa28pIC5zcGVjdHJ1bS1IZWFkaW5nLS1zdWJ0aXRsZTMgZW0sXFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLUhlYWRpbmctLXN1YnRpdGxlMyBlbSB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDEzcHg7XFxuICBmb250LXdlaWdodDogODAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuMztcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjA2ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW06bGFuZyhqYSkgLnNwZWN0cnVtLVN1YmhlYWRpbmcgc3Ryb25nLFxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtOmxhbmcoa28pIC5zcGVjdHJ1bS1TdWJoZWFkaW5nIHN0cm9uZyxcXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tU3ViaGVhZGluZyBzdHJvbmcsXFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW06bGFuZyhqYSkgLnNwZWN0cnVtLUhlYWRpbmctLXN1YnRpdGxlMyBzdHJvbmcsXFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUhlYWRpbmctLXN1YnRpdGxlMyBzdHJvbmcsXFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLUhlYWRpbmctLXN1YnRpdGxlMyBzdHJvbmcge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiAxM3B4O1xcbiAgZm9udC13ZWlnaHQ6IDkwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjM7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wNmVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1EZXRhaWwsIC5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtOmxhbmcoa28pIC5zcGVjdHJ1bS1EZXRhaWwsIC5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1EZXRhaWwge1xcbiAgICAgICAgICBmb250LXNpemU6IDEzcHg7XFxuICBmb250LXdlaWdodDogNDAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNztcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjA2ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xcblxcbiAgICAgICAgICBtYXJnaW4tYm90dG9tOiAyMHB4O1xcbiAgICAgICAgICBtYXJnaW4tdG9wOiAxMHB4O1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1EZXRhaWwgZW0sIC5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtOmxhbmcoa28pIC5zcGVjdHJ1bS1EZXRhaWwgZW0sIC5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1EZXRhaWwgZW0ge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiAxM3B4O1xcbiAgZm9udC13ZWlnaHQ6IDQwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjc7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wNmVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1EZXRhaWwgc3Ryb25nLCAuc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tRGV0YWlsIHN0cm9uZywgLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLURldGFpbCBzdHJvbmcge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiAxM3B4O1xcbiAgZm9udC13ZWlnaHQ6IDkwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjc7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wNmVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1IZWFkaW5nMS0tcXVpZXQsIC5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtOmxhbmcoa28pIC5zcGVjdHJ1bS1IZWFkaW5nMS0tcXVpZXQsIC5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1IZWFkaW5nMS0tcXVpZXQge1xcbiAgICAgICAgICBmb250LXNpemU6IDM5cHg7XFxuICBmb250LXdlaWdodDogMzAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjA1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgbWFyZ2luLWJvdHRvbTogMTBweDtcXG4gICAgICAgICAgbWFyZ2luLXRvcDogMTBweDtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tSGVhZGluZzEtLXF1aWV0IGVtLCAuc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tSGVhZGluZzEtLXF1aWV0IGVtLCAuc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tSGVhZGluZzEtLXF1aWV0IGVtIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogMzlweDtcXG4gIGZvbnQtd2VpZ2h0OiA0MDA7XFxuICBsaW5lLWhlaWdodDogMS41O1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDVlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW06bGFuZyhqYSkgLnNwZWN0cnVtLUhlYWRpbmcxLS1xdWlldCBzdHJvbmcsIC5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtOmxhbmcoa28pIC5zcGVjdHJ1bS1IZWFkaW5nMS0tcXVpZXQgc3Ryb25nLCAuc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tSGVhZGluZzEtLXF1aWV0IHN0cm9uZyB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDM5cHg7XFxuICBmb250LXdlaWdodDogNzAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjA1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1IZWFkaW5nMi0tcXVpZXQsXFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUhlYWRpbmcyLS1xdWlldCxcXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tSGVhZGluZzItLXF1aWV0LFxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1IZWFkaW5nLS1wYWdlVGl0bGUsXFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUhlYWRpbmctLXBhZ2VUaXRsZSxcXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tSGVhZGluZy0tcGFnZVRpdGxlIHtcXG4gICAgICAgICAgZm9udC1zaXplOiAzMXB4O1xcbiAgZm9udC13ZWlnaHQ6IDMwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjU7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIG1hcmdpbi1ib3R0b206IDEwcHg7XFxuICAgICAgICAgIG1hcmdpbi10b3A6IDEwcHg7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW06bGFuZyhqYSkgLnNwZWN0cnVtLUhlYWRpbmcyLS1xdWlldCBlbSxcXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tSGVhZGluZzItLXF1aWV0IGVtLFxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1IZWFkaW5nMi0tcXVpZXQgZW0sXFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW06bGFuZyhqYSkgLnNwZWN0cnVtLUhlYWRpbmctLXBhZ2VUaXRsZSBlbSxcXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tSGVhZGluZy0tcGFnZVRpdGxlIGVtLFxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1IZWFkaW5nLS1wYWdlVGl0bGUgZW0ge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiAzMXB4O1xcbiAgZm9udC13ZWlnaHQ6IDQwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjU7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tSGVhZGluZzItLXF1aWV0IHN0cm9uZyxcXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tSGVhZGluZzItLXF1aWV0IHN0cm9uZyxcXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tSGVhZGluZzItLXF1aWV0IHN0cm9uZyxcXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tSGVhZGluZy0tcGFnZVRpdGxlIHN0cm9uZyxcXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tSGVhZGluZy0tcGFnZVRpdGxlIHN0cm9uZyxcXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tSGVhZGluZy0tcGFnZVRpdGxlIHN0cm9uZyB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDMxcHg7XFxuICBmb250LXdlaWdodDogNzAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjA1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1IZWFkaW5nMS0tc3Ryb25nLCAuc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tSGVhZGluZzEtLXN0cm9uZywgLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLUhlYWRpbmcxLS1zdHJvbmcge1xcbiAgICAgICAgICBmb250LXNpemU6IDM5cHg7XFxuICBmb250LXdlaWdodDogOTAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjA1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgbWFyZ2luLWJvdHRvbTogMTBweDtcXG4gICAgICAgICAgbWFyZ2luLXRvcDogMTBweDtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tSGVhZGluZzEtLXN0cm9uZyBlbSwgLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUhlYWRpbmcxLS1zdHJvbmcgZW0sIC5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1IZWFkaW5nMS0tc3Ryb25nIGVtIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogMzlweDtcXG4gIGZvbnQtd2VpZ2h0OiA5MDA7XFxuICBsaW5lLWhlaWdodDogMS41O1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDVlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW06bGFuZyhqYSkgLnNwZWN0cnVtLUhlYWRpbmcxLS1zdHJvbmcgc3Ryb25nLCAuc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tSGVhZGluZzEtLXN0cm9uZyBzdHJvbmcsIC5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1IZWFkaW5nMS0tc3Ryb25nIHN0cm9uZyB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDM5cHg7XFxuICBmb250LXdlaWdodDogOTAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjA1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1IZWFkaW5nMi0tc3Ryb25nLCAuc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tSGVhZGluZzItLXN0cm9uZywgLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLUhlYWRpbmcyLS1zdHJvbmcge1xcbiAgICAgICAgICBmb250LXNpemU6IDMxcHg7XFxuICBmb250LXdlaWdodDogOTAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjA1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgbWFyZ2luLWJvdHRvbTogMTBweDtcXG4gICAgICAgICAgbWFyZ2luLXRvcDogMTBweDtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tSGVhZGluZzItLXN0cm9uZyBlbSwgLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUhlYWRpbmcyLS1zdHJvbmcgZW0sIC5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1IZWFkaW5nMi0tc3Ryb25nIGVtIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogMzFweDtcXG4gIGZvbnQtd2VpZ2h0OiA5MDA7XFxuICBsaW5lLWhlaWdodDogMS41O1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDVlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW06bGFuZyhqYSkgLnNwZWN0cnVtLUhlYWRpbmcyLS1zdHJvbmcgc3Ryb25nLCAuc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tSGVhZGluZzItLXN0cm9uZyBzdHJvbmcsIC5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1IZWFkaW5nMi0tc3Ryb25nIHN0cm9uZyB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDMxcHg7XFxuICBmb250LXdlaWdodDogOTAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjA1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1IZWFkaW5nMS0tZGlzcGxheSwgLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUhlYWRpbmcxLS1kaXNwbGF5LCAuc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tSGVhZGluZzEtLWRpc3BsYXkge1xcbiAgICAgICAgICBmb250LXNpemU6IDQ5cHg7XFxuICBmb250LXdlaWdodDogNzAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjA1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgbWFyZ2luLWJvdHRvbTogMTBweDtcXG4gICAgICAgICAgbWFyZ2luLXRvcDogMTBweDtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tSGVhZGluZzEtLWRpc3BsYXkgZW0sIC5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtOmxhbmcoa28pIC5zcGVjdHJ1bS1IZWFkaW5nMS0tZGlzcGxheSBlbSwgLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLUhlYWRpbmcxLS1kaXNwbGF5IGVtIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogNDlweDtcXG4gIGZvbnQtd2VpZ2h0OiA4MDA7XFxuICBsaW5lLWhlaWdodDogMS41O1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDVlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW06bGFuZyhqYSkgLnNwZWN0cnVtLUhlYWRpbmcxLS1kaXNwbGF5IHN0cm9uZywgLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUhlYWRpbmcxLS1kaXNwbGF5IHN0cm9uZywgLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLUhlYWRpbmcxLS1kaXNwbGF5IHN0cm9uZyB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDQ5cHg7XFxuICBmb250LXdlaWdodDogOTAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjA1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1IZWFkaW5nMi0tZGlzcGxheSwgLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUhlYWRpbmcyLS1kaXNwbGF5LCAuc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tSGVhZGluZzItLWRpc3BsYXkge1xcbiAgICAgICAgICBmb250LXNpemU6IDQ0cHg7XFxuICBmb250LXdlaWdodDogNzAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjA1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgbWFyZ2luLWJvdHRvbTogMTBweDtcXG4gICAgICAgICAgbWFyZ2luLXRvcDogMTBweDtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tSGVhZGluZzItLWRpc3BsYXkgZW0sIC5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtOmxhbmcoa28pIC5zcGVjdHJ1bS1IZWFkaW5nMi0tZGlzcGxheSBlbSwgLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLUhlYWRpbmcyLS1kaXNwbGF5IGVtIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogNDRweDtcXG4gIGZvbnQtd2VpZ2h0OiA4MDA7XFxuICBsaW5lLWhlaWdodDogMS41O1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDVlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW06bGFuZyhqYSkgLnNwZWN0cnVtLUhlYWRpbmcyLS1kaXNwbGF5IHN0cm9uZywgLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUhlYWRpbmcyLS1kaXNwbGF5IHN0cm9uZywgLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLUhlYWRpbmcyLS1kaXNwbGF5IHN0cm9uZyB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDQ0cHg7XFxuICBmb250LXdlaWdodDogOTAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjA1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1IZWFkaW5nMS0tZGlzcGxheS5zcGVjdHJ1bS1IZWFkaW5nMS0tc3Ryb25nLCAuc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tSGVhZGluZzEtLWRpc3BsYXkuc3BlY3RydW0tSGVhZGluZzEtLXN0cm9uZywgLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLUhlYWRpbmcxLS1kaXNwbGF5LnNwZWN0cnVtLUhlYWRpbmcxLS1zdHJvbmcge1xcbiAgICAgICAgICBmb250LXNpemU6IDQ5cHg7XFxuICBmb250LXdlaWdodDogOTAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjA1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgbWFyZ2luLWJvdHRvbTogMTBweDtcXG4gICAgICAgICAgbWFyZ2luLXRvcDogMTBweDtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tSGVhZGluZzEtLWRpc3BsYXkuc3BlY3RydW0tSGVhZGluZzEtLXN0cm9uZyBlbSwgLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUhlYWRpbmcxLS1kaXNwbGF5LnNwZWN0cnVtLUhlYWRpbmcxLS1zdHJvbmcgZW0sIC5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1IZWFkaW5nMS0tZGlzcGxheS5zcGVjdHJ1bS1IZWFkaW5nMS0tc3Ryb25nIGVtIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogNDlweDtcXG4gIGZvbnQtd2VpZ2h0OiA5MDA7XFxuICBsaW5lLWhlaWdodDogMS41O1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDVlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW06bGFuZyhqYSkgLnNwZWN0cnVtLUhlYWRpbmcxLS1kaXNwbGF5LnNwZWN0cnVtLUhlYWRpbmcxLS1zdHJvbmcgc3Ryb25nLCAuc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tSGVhZGluZzEtLWRpc3BsYXkuc3BlY3RydW0tSGVhZGluZzEtLXN0cm9uZyBzdHJvbmcsIC5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1IZWFkaW5nMS0tZGlzcGxheS5zcGVjdHJ1bS1IZWFkaW5nMS0tc3Ryb25nIHN0cm9uZyB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDQ5cHg7XFxuICBmb250LXdlaWdodDogOTAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjA1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1IZWFkaW5nMi0tZGlzcGxheS5zcGVjdHJ1bS1IZWFkaW5nMi0tc3Ryb25nLCAuc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tSGVhZGluZzItLWRpc3BsYXkuc3BlY3RydW0tSGVhZGluZzItLXN0cm9uZywgLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLUhlYWRpbmcyLS1kaXNwbGF5LnNwZWN0cnVtLUhlYWRpbmcyLS1zdHJvbmcge1xcbiAgICAgICAgICBmb250LXNpemU6IDQ0cHg7XFxuICBmb250LXdlaWdodDogOTAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjA1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgbWFyZ2luLWJvdHRvbTogMTBweDtcXG4gICAgICAgICAgbWFyZ2luLXRvcDogMTBweDtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tSGVhZGluZzItLWRpc3BsYXkuc3BlY3RydW0tSGVhZGluZzItLXN0cm9uZyBlbSwgLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUhlYWRpbmcyLS1kaXNwbGF5LnNwZWN0cnVtLUhlYWRpbmcyLS1zdHJvbmcgZW0sIC5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1IZWFkaW5nMi0tZGlzcGxheS5zcGVjdHJ1bS1IZWFkaW5nMi0tc3Ryb25nIGVtIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogNDRweDtcXG4gIGZvbnQtd2VpZ2h0OiA5MDA7XFxuICBsaW5lLWhlaWdodDogMS41O1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDVlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW06bGFuZyhqYSkgLnNwZWN0cnVtLUhlYWRpbmcyLS1kaXNwbGF5LnNwZWN0cnVtLUhlYWRpbmcyLS1zdHJvbmcgc3Ryb25nLCAuc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tSGVhZGluZzItLWRpc3BsYXkuc3BlY3RydW0tSGVhZGluZzItLXN0cm9uZyBzdHJvbmcsIC5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1IZWFkaW5nMi0tZGlzcGxheS5zcGVjdHJ1bS1IZWFkaW5nMi0tc3Ryb25nIHN0cm9uZyB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDQ0cHg7XFxuICBmb250LXdlaWdodDogOTAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjA1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1IZWFkaW5nMS0tZGlzcGxheS5zcGVjdHJ1bS1IZWFkaW5nMS0tcXVpZXQsIC5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtOmxhbmcoa28pIC5zcGVjdHJ1bS1IZWFkaW5nMS0tZGlzcGxheS5zcGVjdHJ1bS1IZWFkaW5nMS0tcXVpZXQsIC5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1IZWFkaW5nMS0tZGlzcGxheS5zcGVjdHJ1bS1IZWFkaW5nMS0tcXVpZXQge1xcbiAgICAgICAgICBmb250LXNpemU6IDQ5cHg7XFxuICBmb250LXdlaWdodDogMzAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjA1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgbWFyZ2luLWJvdHRvbTogMTBweDtcXG4gICAgICAgICAgbWFyZ2luLXRvcDogMTBweDtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tSGVhZGluZzEtLWRpc3BsYXkuc3BlY3RydW0tSGVhZGluZzEtLXF1aWV0IGVtLCAuc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tSGVhZGluZzEtLWRpc3BsYXkuc3BlY3RydW0tSGVhZGluZzEtLXF1aWV0IGVtLCAuc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tSGVhZGluZzEtLWRpc3BsYXkuc3BlY3RydW0tSGVhZGluZzEtLXF1aWV0IGVtIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogNDlweDtcXG4gIGZvbnQtd2VpZ2h0OiA0MDA7XFxuICBsaW5lLWhlaWdodDogMS41O1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDVlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW06bGFuZyhqYSkgLnNwZWN0cnVtLUhlYWRpbmcxLS1kaXNwbGF5LnNwZWN0cnVtLUhlYWRpbmcxLS1xdWlldCBzdHJvbmcsIC5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtOmxhbmcoa28pIC5zcGVjdHJ1bS1IZWFkaW5nMS0tZGlzcGxheS5zcGVjdHJ1bS1IZWFkaW5nMS0tcXVpZXQgc3Ryb25nLCAuc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tSGVhZGluZzEtLWRpc3BsYXkuc3BlY3RydW0tSGVhZGluZzEtLXF1aWV0IHN0cm9uZyB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDQ5cHg7XFxuICBmb250LXdlaWdodDogNzAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjA1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1IZWFkaW5nMi0tZGlzcGxheS5zcGVjdHJ1bS1IZWFkaW5nMi0tcXVpZXQsXFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUhlYWRpbmcyLS1kaXNwbGF5LnNwZWN0cnVtLUhlYWRpbmcyLS1xdWlldCxcXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tSGVhZGluZzItLWRpc3BsYXkuc3BlY3RydW0tSGVhZGluZzItLXF1aWV0LFxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1IZWFkaW5nLS1kaXNwbGF5LFxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtOmxhbmcoa28pIC5zcGVjdHJ1bS1IZWFkaW5nLS1kaXNwbGF5LFxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1IZWFkaW5nLS1kaXNwbGF5IHtcXG4gICAgICAgICAgZm9udC1zaXplOiA0NHB4O1xcbiAgZm9udC13ZWlnaHQ6IDMwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjU7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIG1hcmdpbi1ib3R0b206IDEwcHg7XFxuICAgICAgICAgIG1hcmdpbi10b3A6IDEwcHg7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW06bGFuZyhqYSkgLnNwZWN0cnVtLUhlYWRpbmcyLS1kaXNwbGF5LnNwZWN0cnVtLUhlYWRpbmcyLS1xdWlldCBlbSxcXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tSGVhZGluZzItLWRpc3BsYXkuc3BlY3RydW0tSGVhZGluZzItLXF1aWV0IGVtLFxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1IZWFkaW5nMi0tZGlzcGxheS5zcGVjdHJ1bS1IZWFkaW5nMi0tcXVpZXQgZW0sXFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW06bGFuZyhqYSkgLnNwZWN0cnVtLUhlYWRpbmctLWRpc3BsYXkgZW0sXFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUhlYWRpbmctLWRpc3BsYXkgZW0sXFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLUhlYWRpbmctLWRpc3BsYXkgZW0ge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiA0NHB4O1xcbiAgZm9udC13ZWlnaHQ6IDQwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjU7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tSGVhZGluZzItLWRpc3BsYXkuc3BlY3RydW0tSGVhZGluZzItLXF1aWV0IHN0cm9uZyxcXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tSGVhZGluZzItLWRpc3BsYXkuc3BlY3RydW0tSGVhZGluZzItLXF1aWV0IHN0cm9uZyxcXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tSGVhZGluZzItLWRpc3BsYXkuc3BlY3RydW0tSGVhZGluZzItLXF1aWV0IHN0cm9uZyxcXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tSGVhZGluZy0tZGlzcGxheSBzdHJvbmcsXFxuLnNwZWN0cnVtLS1sYXJnZSAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUhlYWRpbmctLWRpc3BsYXkgc3Ryb25nLFxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1IZWFkaW5nLS1kaXNwbGF5IHN0cm9uZyB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDQ0cHg7XFxuICBmb250LXdlaWdodDogNzAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjA1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtLUNvZGUxIHtcXG4gICAgICAgICAgZm9udC1zaXplOiAyNHB4O1xcbiAgZm9udC13ZWlnaHQ6IDQwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjU7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMDtcXG5cXG4gICAgICAgICAgbWFyZ2luLWJvdHRvbTogMjBweDtcXG4gICAgICAgICAgbWFyZ2luLXRvcDogMTBweDtcXG4gIGZvbnQtZmFtaWx5OiBTb3VyY2UgQ29kZSBQcm8sIE1vbmFjbywgbW9ub3NwYWNlO1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtLUNvZGUxIGVtIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogMjRweDtcXG4gIGZvbnQtd2VpZ2h0OiA0MDA7XFxuICBsaW5lLWhlaWdodDogMS41O1xcbiAgZm9udC1zdHlsZTogaXRhbGljO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDA7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bS1Db2RlMSBzdHJvbmcge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiAyNHB4O1xcbiAgZm9udC13ZWlnaHQ6IDcwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjU7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMDtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtLUNvZGUyIHtcXG4gICAgICAgICAgZm9udC1zaXplOiAyMnB4O1xcbiAgZm9udC13ZWlnaHQ6IDQwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjU7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMDtcXG5cXG4gICAgICAgICAgbWFyZ2luLWJvdHRvbTogMjBweDtcXG4gICAgICAgICAgbWFyZ2luLXRvcDogMTBweDtcXG4gIGZvbnQtZmFtaWx5OiBTb3VyY2UgQ29kZSBQcm8sIE1vbmFjbywgbW9ub3NwYWNlO1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtLUNvZGUyIGVtIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogMjJweDtcXG4gIGZvbnQtd2VpZ2h0OiA0MDA7XFxuICBsaW5lLWhlaWdodDogMS41O1xcbiAgZm9udC1zdHlsZTogaXRhbGljO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDA7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bS1Db2RlMiBzdHJvbmcge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiAyMnB4O1xcbiAgZm9udC13ZWlnaHQ6IDcwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjU7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMDtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtLUNvZGUzIHtcXG4gICAgICAgICAgZm9udC1zaXplOiAxOXB4O1xcbiAgZm9udC13ZWlnaHQ6IDQwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjU7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMDtcXG5cXG4gICAgICAgICAgbWFyZ2luLWJvdHRvbTogMjBweDtcXG4gICAgICAgICAgbWFyZ2luLXRvcDogMTBweDtcXG4gIGZvbnQtZmFtaWx5OiBTb3VyY2UgQ29kZSBQcm8sIE1vbmFjbywgbW9ub3NwYWNlO1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtLUNvZGUzIGVtIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogMTlweDtcXG4gIGZvbnQtd2VpZ2h0OiA0MDA7XFxuICBsaW5lLWhlaWdodDogMS41O1xcbiAgZm9udC1zdHlsZTogaXRhbGljO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDA7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bS1Db2RlMyBzdHJvbmcge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiAxOXB4O1xcbiAgZm9udC13ZWlnaHQ6IDcwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjU7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMDtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtLUNvZGU0IHtcXG4gICAgICAgICAgZm9udC1zaXplOiAxN3B4O1xcbiAgZm9udC13ZWlnaHQ6IDQwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjU7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMDtcXG5cXG4gICAgICAgICAgbWFyZ2luLWJvdHRvbTogMjBweDtcXG4gICAgICAgICAgbWFyZ2luLXRvcDogMTBweDtcXG4gIGZvbnQtZmFtaWx5OiBTb3VyY2UgQ29kZSBQcm8sIE1vbmFjbywgbW9ub3NwYWNlO1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtLUNvZGU0IGVtIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogMTdweDtcXG4gIGZvbnQtd2VpZ2h0OiA0MDA7XFxuICBsaW5lLWhlaWdodDogMS41O1xcbiAgZm9udC1zdHlsZTogaXRhbGljO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDA7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bS1Db2RlNCBzdHJvbmcge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiAxN3B4O1xcbiAgZm9udC13ZWlnaHQ6IDcwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjU7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMDtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtLUNvZGU1IHtcXG4gICAgICAgICAgZm9udC1zaXplOiAxNXB4O1xcbiAgZm9udC13ZWlnaHQ6IDQwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjU7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMDtcXG5cXG4gICAgICAgICAgbWFyZ2luLWJvdHRvbTogMjBweDtcXG4gICAgICAgICAgbWFyZ2luLXRvcDogMTBweDtcXG4gIGZvbnQtZmFtaWx5OiBTb3VyY2UgQ29kZSBQcm8sIE1vbmFjbywgbW9ub3NwYWNlO1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtLUNvZGU1IGVtIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogMTVweDtcXG4gIGZvbnQtd2VpZ2h0OiA0MDA7XFxuICBsaW5lLWhlaWdodDogMS41O1xcbiAgZm9udC1zdHlsZTogaXRhbGljO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDA7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW0tLWxhcmdlIC5zcGVjdHJ1bS1Db2RlNSBzdHJvbmcge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiAxNXB4O1xcbiAgZm9udC13ZWlnaHQ6IDcwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjU7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMDtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtLFxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtLUJvZHkge1xcbiAgZm9udC1zaXplOiAxN3B4O1xcbiAgZm9udC13ZWlnaHQ6IDQwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjU7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxufVxcbi5zcGVjdHJ1bS0tbGFyZ2UgLnNwZWN0cnVtLUJvZHktLWl0YWxpYyB7XFxuICBmb250LXN0eWxlOiBpdGFsaWM7XFxufVxcblwiLCBcIlwiXSk7XG5cbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///225\n')},function(module,exports,__webpack_require__){eval('exports = module.exports = __webpack_require__(6)(false);\n// Module\nexports.push([module.i, "/* generated from dna-version: 5.0.1 */\\n/* generated from dna-version: 5.0.1 */\\n.spectrum {\\n  font-family: adobe-clean, \\"Source Sans Pro\\", -apple-system, BlinkMacSystemFont, \\"Segoe UI\\", Roboto, sans-serif;\\n  font-size: 17px;\\n}\\n.spectrum:lang(zh-Hans) {\\n    font-family: adobe-clean-han-japanese, -apple-system, BlinkMacSystemFont, \\"Segoe UI\\", Roboto, sans-serif;\\n  }\\n.spectrum:lang(zh) {\\n    font-family: adobe-clean-han-japanese, -apple-system, BlinkMacSystemFont, \\"Segoe UI\\", Roboto, sans-serif;\\n  }\\n.spectrum:lang(ko) {\\n    font-family: adobe-clean-han-japanese, -apple-system, BlinkMacSystemFont, \\"Segoe UI\\", Roboto, sans-serif;\\n  }\\n.spectrum:lang(ja) {\\n    font-family: adobe-clean-han-japanese, -apple-system, BlinkMacSystemFont, \\"Segoe UI\\", Roboto, sans-serif;\\n  }\\n.spectrum-Body1 {\\n          font-size: 24px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          margin-bottom: 20px;\\n          margin-top: 10px;\\n        }\\n.spectrum-Body1 em {\\n              font-size: 24px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: italic;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Body1 strong {\\n              font-size: 24px;\\n  font-weight: 700;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Body2,\\n.spectrum-Body--large {\\n          font-size: 22px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          margin-bottom: 20px;\\n          margin-top: 10px;\\n        }\\n.spectrum-Body2 em,\\n.spectrum-Body--large em {\\n              font-size: 22px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: italic;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Body2 strong,\\n.spectrum-Body--large strong {\\n              font-size: 22px;\\n  font-weight: 700;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Body3 {\\n          font-size: 19px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          margin-bottom: 20px;\\n          margin-top: 10px;\\n        }\\n.spectrum-Body3 em {\\n              font-size: 19px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: italic;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Body3 strong {\\n              font-size: 19px;\\n  font-weight: 700;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Body4,\\n.spectrum-Body--secondary {\\n          font-size: 17px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          margin-bottom: 20px;\\n          margin-top: 10px;\\n        }\\n.spectrum-Body4 em,\\n.spectrum-Body--secondary em {\\n              font-size: 17px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: italic;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Body4 strong,\\n.spectrum-Body--secondary strong {\\n              font-size: 17px;\\n  font-weight: 700;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Body5,\\n.spectrum-Body--small {\\n          font-size: 15px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          margin-bottom: 20px;\\n          margin-top: 10px;\\n        }\\n.spectrum-Body5 em,\\n.spectrum-Body--small em {\\n              font-size: 15px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: italic;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Body5 strong,\\n.spectrum-Body--small strong {\\n              font-size: 15px;\\n  font-weight: 700;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Heading1 {\\n          font-size: 39px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          margin-bottom: 10px;\\n          margin-top: 10px;\\n        }\\n.spectrum-Heading1 em {\\n              font-size: 39px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: italic;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Heading1 strong {\\n              font-size: 39px;\\n  font-weight: 900;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Heading2 {\\n          font-size: 31px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          margin-bottom: 10px;\\n          margin-top: 10px;\\n        }\\n.spectrum-Heading2 em {\\n              font-size: 31px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: italic;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Heading2 strong {\\n              font-size: 31px;\\n  font-weight: 900;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Heading3 {\\n          font-size: 24px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          margin-bottom: 10px;\\n          margin-top: 10px;\\n        }\\n.spectrum-Heading3 em {\\n              font-size: 24px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: italic;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Heading3 strong {\\n              font-size: 24px;\\n  font-weight: 900;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Heading4,\\n.spectrum-Heading--subtitle1 {\\n          font-size: 22px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          margin-bottom: 10px;\\n          margin-top: 10px;\\n        }\\n.spectrum-Heading4 em,\\n.spectrum-Heading--subtitle1 em {\\n              font-size: 22px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: italic;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Heading4 strong,\\n.spectrum-Heading--subtitle1 strong {\\n              font-size: 22px;\\n  font-weight: 900;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Heading5 {\\n          font-size: 19px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          margin-bottom: 10px;\\n          margin-top: 10px;\\n        }\\n.spectrum-Heading5 em {\\n              font-size: 19px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: italic;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Heading5 strong {\\n              font-size: 19px;\\n  font-weight: 900;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Heading6,\\n.spectrum-Heading--subtitle2 {\\n          font-size: 17px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          margin-bottom: 10px;\\n          margin-top: 10px;\\n        }\\n.spectrum-Heading6 em,\\n.spectrum-Heading--subtitle2 em {\\n              font-size: 17px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: italic;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Heading6 strong,\\n.spectrum-Heading--subtitle2 strong {\\n              font-size: 17px;\\n  font-weight: 900;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Subheading,\\n.spectrum-Heading--subtitle3 {\\n          font-size: 13px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0.06em;\\n  text-transform: uppercase;\\n\\n          margin-bottom: 10px;\\n          margin-top: 10px;\\n        }\\n.spectrum-Subheading em,\\n.spectrum-Heading--subtitle3 em {\\n              font-size: 13px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: italic;\\n  letter-spacing: 0.06em;\\n  text-transform: uppercase;\\n\\n          }\\n.spectrum-Subheading strong,\\n.spectrum-Heading--subtitle3 strong {\\n              font-size: 13px;\\n  font-weight: 900;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0.06em;\\n  text-transform: uppercase;\\n\\n          }\\n.spectrum-Detail {\\n          font-size: 13px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.06em;\\n  text-transform: uppercase;\\n\\n          margin-bottom: 20px;\\n          margin-top: 10px;\\n        }\\n.spectrum-Detail em {\\n              font-size: 13px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: italic;\\n  letter-spacing: 0.06em;\\n  text-transform: uppercase;\\n\\n          }\\n.spectrum-Detail strong {\\n              font-size: 13px;\\n  font-weight: 700;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.06em;\\n  text-transform: uppercase;\\n\\n          }\\n.spectrum-Heading1--quiet {\\n          font-size: 39px;\\n  font-weight: 300;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          margin-bottom: 10px;\\n          margin-top: 10px;\\n        }\\n.spectrum-Heading1--quiet em {\\n              font-size: 39px;\\n  font-weight: 300;\\n  line-height: 1.3;\\n  font-style: italic;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Heading1--quiet strong {\\n              font-size: 39px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Heading2--quiet,\\n.spectrum-Heading--pageTitle {\\n          font-size: 31px;\\n  font-weight: 300;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          margin-bottom: 10px;\\n          margin-top: 10px;\\n        }\\n.spectrum-Heading2--quiet em,\\n.spectrum-Heading--pageTitle em {\\n              font-size: 31px;\\n  font-weight: 300;\\n  line-height: 1.3;\\n  font-style: italic;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Heading2--quiet strong,\\n.spectrum-Heading--pageTitle strong {\\n              font-size: 31px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Heading1--strong {\\n          font-size: 39px;\\n  font-weight: 900;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          margin-bottom: 10px;\\n          margin-top: 10px;\\n        }\\n.spectrum-Heading1--strong em {\\n              font-size: 39px;\\n  font-weight: 900;\\n  line-height: 1.3;\\n  font-style: italic;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Heading1--strong strong {\\n              font-size: 39px;\\n  font-weight: 900;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Heading2--strong {\\n          font-size: 31px;\\n  font-weight: 900;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          margin-bottom: 10px;\\n          margin-top: 10px;\\n        }\\n.spectrum-Heading2--strong em {\\n              font-size: 31px;\\n  font-weight: 900;\\n  line-height: 1.3;\\n  font-style: italic;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Heading2--strong strong {\\n              font-size: 31px;\\n  font-weight: 900;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Heading1--display {\\n          font-size: 49px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          margin-bottom: 10px;\\n          margin-top: 10px;\\n        }\\n.spectrum-Heading1--display em {\\n              font-size: 49px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: italic;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Heading1--display strong {\\n              font-size: 49px;\\n  font-weight: 900;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Heading2--display {\\n          font-size: 44px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          margin-bottom: 10px;\\n          margin-top: 10px;\\n        }\\n.spectrum-Heading2--display em {\\n              font-size: 44px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: italic;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Heading2--display strong {\\n              font-size: 44px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Heading1--display.spectrum-Heading1--strong {\\n          font-size: 49px;\\n  font-weight: 900;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          margin-bottom: 10px;\\n          margin-top: 10px;\\n        }\\n.spectrum-Heading1--display.spectrum-Heading1--strong em {\\n              font-size: 49px;\\n  font-weight: 900;\\n  line-height: 1.3;\\n  font-style: italic;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Heading1--display.spectrum-Heading1--strong strong {\\n              font-size: 49px;\\n  font-weight: 900;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Heading2--display.spectrum-Heading2--strong {\\n          font-size: 44px;\\n  font-weight: 900;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          margin-bottom: 10px;\\n          margin-top: 10px;\\n        }\\n.spectrum-Heading2--display.spectrum-Heading2--strong em {\\n              font-size: 44px;\\n  font-weight: 900;\\n  line-height: 1.3;\\n  font-style: italic;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Heading2--display.spectrum-Heading2--strong strong {\\n              font-size: 44px;\\n  font-weight: 900;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Heading1--display.spectrum-Heading1--quiet {\\n          font-size: 49px;\\n  font-weight: 300;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          margin-bottom: 10px;\\n          margin-top: 10px;\\n        }\\n.spectrum-Heading1--display.spectrum-Heading1--quiet em {\\n              font-size: 49px;\\n  font-weight: 300;\\n  line-height: 1.3;\\n  font-style: italic;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Heading1--display.spectrum-Heading1--quiet strong {\\n              font-size: 49px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Heading2--display.spectrum-Heading2--quiet,\\n.spectrum-Heading--display {\\n          font-size: 44px;\\n  font-weight: 300;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          margin-bottom: 10px;\\n          margin-top: 10px;\\n        }\\n.spectrum-Heading2--display.spectrum-Heading2--quiet em,\\n.spectrum-Heading--display em {\\n              font-size: 44px;\\n  font-weight: 300;\\n  line-height: 1.3;\\n  font-style: italic;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Heading2--display.spectrum-Heading2--quiet strong,\\n.spectrum-Heading--display strong {\\n              font-size: 44px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Article {\\n  font-family: Adobe Clean Serif, Times New Roman, serif;\\n}\\n.spectrum-Article .spectrum-Body1 {\\n          font-size: 24px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          margin-bottom: 20px;\\n          margin-top: 10px;\\n        }\\n.spectrum-Article .spectrum-Body1 em {\\n              font-size: 24px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: italic;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Article .spectrum-Body1 strong {\\n              font-size: 24px;\\n  font-weight: 900;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Article .spectrum-Body2,\\n.spectrum-Article .spectrum-Body--large {\\n          font-size: 22px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          margin-bottom: 20px;\\n          margin-top: 10px;\\n        }\\n.spectrum-Article .spectrum-Body2 em,\\n.spectrum-Article .spectrum-Body--large em {\\n              font-size: 22px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: italic;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Article .spectrum-Body2 strong,\\n.spectrum-Article .spectrum-Body--large strong {\\n              font-size: 22px;\\n  font-weight: 900;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Article .spectrum-Body3 {\\n          font-size: 19px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          margin-bottom: 20px;\\n          margin-top: 10px;\\n        }\\n.spectrum-Article .spectrum-Body3 em {\\n              font-size: 19px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: italic;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Article .spectrum-Body3 strong {\\n              font-size: 19px;\\n  font-weight: 900;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Article .spectrum-Body4,\\n.spectrum-Article .spectrum-Body--secondary {\\n          font-size: 17px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          margin-bottom: 20px;\\n          margin-top: 10px;\\n        }\\n.spectrum-Article .spectrum-Body4 em,\\n.spectrum-Article .spectrum-Body--secondary em {\\n              font-size: 17px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: italic;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Article .spectrum-Body4 strong,\\n.spectrum-Article .spectrum-Body--secondary strong {\\n              font-size: 17px;\\n  font-weight: 900;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Article .spectrum-Body5,\\n.spectrum-Article .spectrum-Body--small {\\n          font-size: 15px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          margin-bottom: 20px;\\n          margin-top: 10px;\\n        }\\n.spectrum-Article .spectrum-Body5 em,\\n.spectrum-Article .spectrum-Body--small em {\\n              font-size: 15px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: italic;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Article .spectrum-Body5 strong,\\n.spectrum-Article .spectrum-Body--small strong {\\n              font-size: 15px;\\n  font-weight: 900;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Article .spectrum-Heading1 {\\n          font-size: 39px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          margin-bottom: 10px;\\n          margin-top: 10px;\\n        }\\n.spectrum-Article .spectrum-Heading1 em {\\n              font-size: 39px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: italic;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Article .spectrum-Heading1 strong {\\n              font-size: 39px;\\n  font-weight: 900;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Article .spectrum-Heading2 {\\n          font-size: 31px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          margin-bottom: 10px;\\n          margin-top: 10px;\\n        }\\n.spectrum-Article .spectrum-Heading2 em {\\n              font-size: 31px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: italic;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Article .spectrum-Heading2 strong {\\n              font-size: 31px;\\n  font-weight: 900;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Article .spectrum-Heading3 {\\n          font-size: 24px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          margin-bottom: 10px;\\n          margin-top: 10px;\\n        }\\n.spectrum-Article .spectrum-Heading3 em {\\n              font-size: 24px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: italic;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Article .spectrum-Heading3 strong {\\n              font-size: 24px;\\n  font-weight: 900;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Article .spectrum-Heading4,\\n.spectrum-Article .spectrum-Heading--subtitle1 {\\n          font-size: 22px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          margin-bottom: 10px;\\n          margin-top: 10px;\\n        }\\n.spectrum-Article .spectrum-Heading4 em,\\n.spectrum-Article .spectrum-Heading--subtitle1 em {\\n              font-size: 22px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: italic;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Article .spectrum-Heading4 strong,\\n.spectrum-Article .spectrum-Heading--subtitle1 strong {\\n              font-size: 22px;\\n  font-weight: 900;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Article .spectrum-Heading5 {\\n          font-size: 19px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          margin-bottom: 10px;\\n          margin-top: 10px;\\n        }\\n.spectrum-Article .spectrum-Heading5 em {\\n              font-size: 19px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: italic;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Article .spectrum-Heading5 strong {\\n              font-size: 19px;\\n  font-weight: 900;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Article .spectrum-Heading6,\\n.spectrum-Article .spectrum-Heading--subtitle2 {\\n          font-size: 17px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          margin-bottom: 10px;\\n          margin-top: 10px;\\n        }\\n.spectrum-Article .spectrum-Heading6 em,\\n.spectrum-Article .spectrum-Heading--subtitle2 em {\\n              font-size: 17px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: italic;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Article .spectrum-Heading6 strong,\\n.spectrum-Article .spectrum-Heading--subtitle2 strong {\\n              font-size: 17px;\\n  font-weight: 900;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Article .spectrum-Subheading,\\n.spectrum-Article .spectrum-Heading--subtitle3 {\\n          font-size: 13px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0.06em;\\n  text-transform: uppercase;\\n\\n          margin-bottom: 10px;\\n          margin-top: 10px;\\n        }\\n.spectrum-Article .spectrum-Subheading em,\\n.spectrum-Article .spectrum-Heading--subtitle3 em {\\n              font-size: 13px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: italic;\\n  letter-spacing: 0.06em;\\n  text-transform: uppercase;\\n\\n          }\\n.spectrum-Article .spectrum-Subheading strong,\\n.spectrum-Article .spectrum-Heading--subtitle3 strong {\\n              font-size: 13px;\\n  font-weight: 900;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0.06em;\\n  text-transform: uppercase;\\n\\n          }\\n.spectrum-Article .spectrum-Detail {\\n          font-size: 13px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.06em;\\n  text-transform: uppercase;\\n\\n          margin-bottom: 20px;\\n          margin-top: 10px;\\n        }\\n.spectrum-Article .spectrum-Detail em {\\n              font-size: 13px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: italic;\\n  letter-spacing: 0.06em;\\n  text-transform: uppercase;\\n\\n          }\\n.spectrum-Article .spectrum-Detail strong {\\n              font-size: 13px;\\n  font-weight: 700;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.06em;\\n  text-transform: uppercase;\\n\\n          }\\n.spectrum-Article .spectrum-Heading1--quiet {\\n          font-size: 39px;\\n  font-weight: 400;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          margin-bottom: 10px;\\n          margin-top: 10px;\\n        }\\n.spectrum-Article .spectrum-Heading1--quiet em {\\n              font-size: 39px;\\n  font-weight: 400;\\n  line-height: 1.3;\\n  font-style: italic;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Article .spectrum-Heading1--quiet strong {\\n              font-size: 39px;\\n  font-weight: 900;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Article .spectrum-Heading2--quiet,\\n.spectrum-Article .spectrum-Heading--pageTitle {\\n          font-size: 31px;\\n  font-weight: 400;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          margin-bottom: 10px;\\n          margin-top: 10px;\\n        }\\n.spectrum-Article .spectrum-Heading2--quiet em,\\n.spectrum-Article .spectrum-Heading--pageTitle em {\\n              font-size: 31px;\\n  font-weight: 400;\\n  line-height: 1.3;\\n  font-style: italic;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Article .spectrum-Heading2--quiet strong,\\n.spectrum-Article .spectrum-Heading--pageTitle strong {\\n              font-size: 31px;\\n  font-weight: 900;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Article .spectrum-Heading1--display {\\n          font-size: 49px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          margin-bottom: 10px;\\n          margin-top: 10px;\\n        }\\n.spectrum-Article .spectrum-Heading1--display em {\\n              font-size: 49px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: italic;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Article .spectrum-Heading1--display strong {\\n              font-size: 49px;\\n  font-weight: 900;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Article .spectrum-Heading2--display {\\n          font-size: 44px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          margin-bottom: 10px;\\n          margin-top: 10px;\\n        }\\n.spectrum-Article .spectrum-Heading2--display em {\\n              font-size: 44px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: italic;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Article .spectrum-Heading2--display strong {\\n              font-size: 44px;\\n  font-weight: 900;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Article .spectrum-Heading1--display.spectrum-Heading1--quiet {\\n          font-size: 49px;\\n  font-weight: 400;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          margin-bottom: 10px;\\n          margin-top: 10px;\\n        }\\n.spectrum-Article .spectrum-Heading1--display.spectrum-Heading1--quiet em {\\n              font-size: 49px;\\n  font-weight: 400;\\n  line-height: 1.3;\\n  font-style: italic;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Article .spectrum-Heading1--display.spectrum-Heading1--quiet strong {\\n              font-size: 49px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Article .spectrum-Heading2--display.spectrum-Heading2--quiet,\\n.spectrum-Article .spectrum-Heading--display {\\n          font-size: 44px;\\n  font-weight: 400;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          margin-bottom: 10px;\\n          margin-top: 10px;\\n        }\\n.spectrum-Article .spectrum-Heading2--display.spectrum-Heading2--quiet em,\\n.spectrum-Article .spectrum-Heading--display em {\\n              font-size: 44px;\\n  font-weight: 400;\\n  line-height: 1.3;\\n  font-style: italic;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Article .spectrum-Heading2--display.spectrum-Heading2--quiet strong,\\n.spectrum-Article .spectrum-Heading--display strong {\\n              font-size: 44px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0.0125em;\\n  text-transform: none;\\n\\n          }\\n.spectrum:lang(ja) .spectrum-Body1, .spectrum:lang(ko) .spectrum-Body1, .spectrum:lang(zh) .spectrum-Body1 {\\n          font-size: 24px;\\n  font-weight: 400;\\n  line-height: 1.7;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          margin-bottom: 20px;\\n          margin-top: 10px;\\n        }\\n.spectrum:lang(ja) .spectrum-Body1 em, .spectrum:lang(ko) .spectrum-Body1 em, .spectrum:lang(zh) .spectrum-Body1 em {\\n              font-size: 24px;\\n  font-weight: 700;\\n  line-height: 1.7;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum:lang(ja) .spectrum-Body1 strong, .spectrum:lang(ko) .spectrum-Body1 strong, .spectrum:lang(zh) .spectrum-Body1 strong {\\n              font-size: 24px;\\n  font-weight: 900;\\n  line-height: 1.7;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum:lang(ja) .spectrum-Body2,\\n.spectrum:lang(ko) .spectrum-Body2,\\n.spectrum:lang(zh) .spectrum-Body2,\\n.spectrum:lang(ja) .spectrum-Body--large,\\n.spectrum:lang(ko) .spectrum-Body--large,\\n.spectrum:lang(zh) .spectrum-Body--large {\\n          font-size: 22px;\\n  font-weight: 400;\\n  line-height: 1.7;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          margin-bottom: 20px;\\n          margin-top: 10px;\\n        }\\n.spectrum:lang(ja) .spectrum-Body2 em,\\n.spectrum:lang(ko) .spectrum-Body2 em,\\n.spectrum:lang(zh) .spectrum-Body2 em,\\n.spectrum:lang(ja) .spectrum-Body--large em,\\n.spectrum:lang(ko) .spectrum-Body--large em,\\n.spectrum:lang(zh) .spectrum-Body--large em {\\n              font-size: 22px;\\n  font-weight: 700;\\n  line-height: 1.7;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum:lang(ja) .spectrum-Body2 strong,\\n.spectrum:lang(ko) .spectrum-Body2 strong,\\n.spectrum:lang(zh) .spectrum-Body2 strong,\\n.spectrum:lang(ja) .spectrum-Body--large strong,\\n.spectrum:lang(ko) .spectrum-Body--large strong,\\n.spectrum:lang(zh) .spectrum-Body--large strong {\\n              font-size: 22px;\\n  font-weight: 900;\\n  line-height: 1.7;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum:lang(ja) .spectrum-Body3, .spectrum:lang(ko) .spectrum-Body3, .spectrum:lang(zh) .spectrum-Body3 {\\n          font-size: 19px;\\n  font-weight: 400;\\n  line-height: 1.7;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          margin-bottom: 20px;\\n          margin-top: 10px;\\n        }\\n.spectrum:lang(ja) .spectrum-Body3 em, .spectrum:lang(ko) .spectrum-Body3 em, .spectrum:lang(zh) .spectrum-Body3 em {\\n              font-size: 19px;\\n  font-weight: 700;\\n  line-height: 1.7;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum:lang(ja) .spectrum-Body3 strong, .spectrum:lang(ko) .spectrum-Body3 strong, .spectrum:lang(zh) .spectrum-Body3 strong {\\n              font-size: 19px;\\n  font-weight: 900;\\n  line-height: 1.7;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum:lang(ja) .spectrum-Body4,\\n.spectrum:lang(ko) .spectrum-Body4,\\n.spectrum:lang(zh) .spectrum-Body4,\\n.spectrum:lang(ja) .spectrum-Body--secondary,\\n.spectrum:lang(ko) .spectrum-Body--secondary,\\n.spectrum:lang(zh) .spectrum-Body--secondary {\\n          font-size: 17px;\\n  font-weight: 400;\\n  line-height: 1.7;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          margin-bottom: 20px;\\n          margin-top: 10px;\\n        }\\n.spectrum:lang(ja) .spectrum-Body4 em,\\n.spectrum:lang(ko) .spectrum-Body4 em,\\n.spectrum:lang(zh) .spectrum-Body4 em,\\n.spectrum:lang(ja) .spectrum-Body--secondary em,\\n.spectrum:lang(ko) .spectrum-Body--secondary em,\\n.spectrum:lang(zh) .spectrum-Body--secondary em {\\n              font-size: 17px;\\n  font-weight: 700;\\n  line-height: 1.7;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum:lang(ja) .spectrum-Body4 strong,\\n.spectrum:lang(ko) .spectrum-Body4 strong,\\n.spectrum:lang(zh) .spectrum-Body4 strong,\\n.spectrum:lang(ja) .spectrum-Body--secondary strong,\\n.spectrum:lang(ko) .spectrum-Body--secondary strong,\\n.spectrum:lang(zh) .spectrum-Body--secondary strong {\\n              font-size: 17px;\\n  font-weight: 900;\\n  line-height: 1.7;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum:lang(ja) .spectrum-Body5,\\n.spectrum:lang(ko) .spectrum-Body5,\\n.spectrum:lang(zh) .spectrum-Body5,\\n.spectrum:lang(ja) .spectrum-Body--small,\\n.spectrum:lang(ko) .spectrum-Body--small,\\n.spectrum:lang(zh) .spectrum-Body--small {\\n          font-size: 15px;\\n  font-weight: 400;\\n  line-height: 1.7;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          margin-bottom: 20px;\\n          margin-top: 10px;\\n        }\\n.spectrum:lang(ja) .spectrum-Body5 em,\\n.spectrum:lang(ko) .spectrum-Body5 em,\\n.spectrum:lang(zh) .spectrum-Body5 em,\\n.spectrum:lang(ja) .spectrum-Body--small em,\\n.spectrum:lang(ko) .spectrum-Body--small em,\\n.spectrum:lang(zh) .spectrum-Body--small em {\\n              font-size: 15px;\\n  font-weight: 700;\\n  line-height: 1.7;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum:lang(ja) .spectrum-Body5 strong,\\n.spectrum:lang(ko) .spectrum-Body5 strong,\\n.spectrum:lang(zh) .spectrum-Body5 strong,\\n.spectrum:lang(ja) .spectrum-Body--small strong,\\n.spectrum:lang(ko) .spectrum-Body--small strong,\\n.spectrum:lang(zh) .spectrum-Body--small strong {\\n              font-size: 15px;\\n  font-weight: 900;\\n  line-height: 1.7;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum:lang(ja) .spectrum-Heading1, .spectrum:lang(ko) .spectrum-Heading1, .spectrum:lang(zh) .spectrum-Heading1 {\\n          font-size: 39px;\\n  font-weight: 700;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          margin-bottom: 10px;\\n          margin-top: 10px;\\n        }\\n.spectrum:lang(ja) .spectrum-Heading1 em, .spectrum:lang(ko) .spectrum-Heading1 em, .spectrum:lang(zh) .spectrum-Heading1 em {\\n              font-size: 39px;\\n  font-weight: 800;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum:lang(ja) .spectrum-Heading1 strong, .spectrum:lang(ko) .spectrum-Heading1 strong, .spectrum:lang(zh) .spectrum-Heading1 strong {\\n              font-size: 39px;\\n  font-weight: 900;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum:lang(ja) .spectrum-Heading2, .spectrum:lang(ko) .spectrum-Heading2, .spectrum:lang(zh) .spectrum-Heading2 {\\n          font-size: 31px;\\n  font-weight: 700;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          margin-bottom: 10px;\\n          margin-top: 10px;\\n        }\\n.spectrum:lang(ja) .spectrum-Heading2 em, .spectrum:lang(ko) .spectrum-Heading2 em, .spectrum:lang(zh) .spectrum-Heading2 em {\\n              font-size: 31px;\\n  font-weight: 800;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum:lang(ja) .spectrum-Heading2 strong, .spectrum:lang(ko) .spectrum-Heading2 strong, .spectrum:lang(zh) .spectrum-Heading2 strong {\\n              font-size: 31px;\\n  font-weight: 900;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum:lang(ja) .spectrum-Heading3, .spectrum:lang(ko) .spectrum-Heading3, .spectrum:lang(zh) .spectrum-Heading3 {\\n          font-size: 24px;\\n  font-weight: 700;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          margin-bottom: 10px;\\n          margin-top: 10px;\\n        }\\n.spectrum:lang(ja) .spectrum-Heading3 em, .spectrum:lang(ko) .spectrum-Heading3 em, .spectrum:lang(zh) .spectrum-Heading3 em {\\n              font-size: 24px;\\n  font-weight: 800;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum:lang(ja) .spectrum-Heading3 strong, .spectrum:lang(ko) .spectrum-Heading3 strong, .spectrum:lang(zh) .spectrum-Heading3 strong {\\n              font-size: 24px;\\n  font-weight: 900;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum:lang(ja) .spectrum-Heading4,\\n.spectrum:lang(ko) .spectrum-Heading4,\\n.spectrum:lang(zh) .spectrum-Heading4,\\n.spectrum:lang(ja) .spectrum-Heading--subtitle1,\\n.spectrum:lang(ko) .spectrum-Heading--subtitle1,\\n.spectrum:lang(zh) .spectrum-Heading--subtitle1 {\\n          font-size: 22px;\\n  font-weight: 700;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          margin-bottom: 10px;\\n          margin-top: 10px;\\n        }\\n.spectrum:lang(ja) .spectrum-Heading4 em,\\n.spectrum:lang(ko) .spectrum-Heading4 em,\\n.spectrum:lang(zh) .spectrum-Heading4 em,\\n.spectrum:lang(ja) .spectrum-Heading--subtitle1 em,\\n.spectrum:lang(ko) .spectrum-Heading--subtitle1 em,\\n.spectrum:lang(zh) .spectrum-Heading--subtitle1 em {\\n              font-size: 22px;\\n  font-weight: 800;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum:lang(ja) .spectrum-Heading4 strong,\\n.spectrum:lang(ko) .spectrum-Heading4 strong,\\n.spectrum:lang(zh) .spectrum-Heading4 strong,\\n.spectrum:lang(ja) .spectrum-Heading--subtitle1 strong,\\n.spectrum:lang(ko) .spectrum-Heading--subtitle1 strong,\\n.spectrum:lang(zh) .spectrum-Heading--subtitle1 strong {\\n              font-size: 22px;\\n  font-weight: 900;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum:lang(ja) .spectrum-Heading5, .spectrum:lang(ko) .spectrum-Heading5, .spectrum:lang(zh) .spectrum-Heading5 {\\n          font-size: 19px;\\n  font-weight: 700;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          margin-bottom: 10px;\\n          margin-top: 10px;\\n        }\\n.spectrum:lang(ja) .spectrum-Heading5 em, .spectrum:lang(ko) .spectrum-Heading5 em, .spectrum:lang(zh) .spectrum-Heading5 em {\\n              font-size: 19px;\\n  font-weight: 800;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum:lang(ja) .spectrum-Heading5 strong, .spectrum:lang(ko) .spectrum-Heading5 strong, .spectrum:lang(zh) .spectrum-Heading5 strong {\\n              font-size: 19px;\\n  font-weight: 900;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum:lang(ja) .spectrum-Heading6,\\n.spectrum:lang(ko) .spectrum-Heading6,\\n.spectrum:lang(zh) .spectrum-Heading6,\\n.spectrum:lang(ja) .spectrum-Heading--subtitle2,\\n.spectrum:lang(ko) .spectrum-Heading--subtitle2,\\n.spectrum:lang(zh) .spectrum-Heading--subtitle2 {\\n          font-size: 17px;\\n  font-weight: 700;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          margin-bottom: 10px;\\n          margin-top: 10px;\\n        }\\n.spectrum:lang(ja) .spectrum-Heading6 em,\\n.spectrum:lang(ko) .spectrum-Heading6 em,\\n.spectrum:lang(zh) .spectrum-Heading6 em,\\n.spectrum:lang(ja) .spectrum-Heading--subtitle2 em,\\n.spectrum:lang(ko) .spectrum-Heading--subtitle2 em,\\n.spectrum:lang(zh) .spectrum-Heading--subtitle2 em {\\n              font-size: 17px;\\n  font-weight: 800;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum:lang(ja) .spectrum-Heading6 strong,\\n.spectrum:lang(ko) .spectrum-Heading6 strong,\\n.spectrum:lang(zh) .spectrum-Heading6 strong,\\n.spectrum:lang(ja) .spectrum-Heading--subtitle2 strong,\\n.spectrum:lang(ko) .spectrum-Heading--subtitle2 strong,\\n.spectrum:lang(zh) .spectrum-Heading--subtitle2 strong {\\n              font-size: 17px;\\n  font-weight: 900;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum:lang(ja) .spectrum-Subheading,\\n.spectrum:lang(ko) .spectrum-Subheading,\\n.spectrum:lang(zh) .spectrum-Subheading,\\n.spectrum:lang(ja) .spectrum-Heading--subtitle3,\\n.spectrum:lang(ko) .spectrum-Heading--subtitle3,\\n.spectrum:lang(zh) .spectrum-Heading--subtitle3 {\\n          font-size: 13px;\\n  font-weight: 700;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0.06em;\\n  text-transform: uppercase;\\n\\n          margin-bottom: 10px;\\n          margin-top: 10px;\\n        }\\n.spectrum:lang(ja) .spectrum-Subheading em,\\n.spectrum:lang(ko) .spectrum-Subheading em,\\n.spectrum:lang(zh) .spectrum-Subheading em,\\n.spectrum:lang(ja) .spectrum-Heading--subtitle3 em,\\n.spectrum:lang(ko) .spectrum-Heading--subtitle3 em,\\n.spectrum:lang(zh) .spectrum-Heading--subtitle3 em {\\n              font-size: 13px;\\n  font-weight: 800;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0.06em;\\n  text-transform: uppercase;\\n\\n          }\\n.spectrum:lang(ja) .spectrum-Subheading strong,\\n.spectrum:lang(ko) .spectrum-Subheading strong,\\n.spectrum:lang(zh) .spectrum-Subheading strong,\\n.spectrum:lang(ja) .spectrum-Heading--subtitle3 strong,\\n.spectrum:lang(ko) .spectrum-Heading--subtitle3 strong,\\n.spectrum:lang(zh) .spectrum-Heading--subtitle3 strong {\\n              font-size: 13px;\\n  font-weight: 900;\\n  line-height: 1.3;\\n  font-style: normal;\\n  letter-spacing: 0.06em;\\n  text-transform: uppercase;\\n\\n          }\\n.spectrum:lang(ja) .spectrum-Detail, .spectrum:lang(ko) .spectrum-Detail, .spectrum:lang(zh) .spectrum-Detail {\\n          font-size: 13px;\\n  font-weight: 400;\\n  line-height: 1.7;\\n  font-style: normal;\\n  letter-spacing: 0.06em;\\n  text-transform: uppercase;\\n\\n          margin-bottom: 20px;\\n          margin-top: 10px;\\n        }\\n.spectrum:lang(ja) .spectrum-Detail em, .spectrum:lang(ko) .spectrum-Detail em, .spectrum:lang(zh) .spectrum-Detail em {\\n              font-size: 13px;\\n  font-weight: 400;\\n  line-height: 1.7;\\n  font-style: normal;\\n  letter-spacing: 0.06em;\\n  text-transform: uppercase;\\n\\n          }\\n.spectrum:lang(ja) .spectrum-Detail strong, .spectrum:lang(ko) .spectrum-Detail strong, .spectrum:lang(zh) .spectrum-Detail strong {\\n              font-size: 13px;\\n  font-weight: 900;\\n  line-height: 1.7;\\n  font-style: normal;\\n  letter-spacing: 0.06em;\\n  text-transform: uppercase;\\n\\n          }\\n.spectrum:lang(ja) .spectrum-Heading1--quiet, .spectrum:lang(ko) .spectrum-Heading1--quiet, .spectrum:lang(zh) .spectrum-Heading1--quiet {\\n          font-size: 39px;\\n  font-weight: 300;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          margin-bottom: 10px;\\n          margin-top: 10px;\\n        }\\n.spectrum:lang(ja) .spectrum-Heading1--quiet em, .spectrum:lang(ko) .spectrum-Heading1--quiet em, .spectrum:lang(zh) .spectrum-Heading1--quiet em {\\n              font-size: 39px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum:lang(ja) .spectrum-Heading1--quiet strong, .spectrum:lang(ko) .spectrum-Heading1--quiet strong, .spectrum:lang(zh) .spectrum-Heading1--quiet strong {\\n              font-size: 39px;\\n  font-weight: 700;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum:lang(ja) .spectrum-Heading2--quiet,\\n.spectrum:lang(ko) .spectrum-Heading2--quiet,\\n.spectrum:lang(zh) .spectrum-Heading2--quiet,\\n.spectrum:lang(ja) .spectrum-Heading--pageTitle,\\n.spectrum:lang(ko) .spectrum-Heading--pageTitle,\\n.spectrum:lang(zh) .spectrum-Heading--pageTitle {\\n          font-size: 31px;\\n  font-weight: 300;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          margin-bottom: 10px;\\n          margin-top: 10px;\\n        }\\n.spectrum:lang(ja) .spectrum-Heading2--quiet em,\\n.spectrum:lang(ko) .spectrum-Heading2--quiet em,\\n.spectrum:lang(zh) .spectrum-Heading2--quiet em,\\n.spectrum:lang(ja) .spectrum-Heading--pageTitle em,\\n.spectrum:lang(ko) .spectrum-Heading--pageTitle em,\\n.spectrum:lang(zh) .spectrum-Heading--pageTitle em {\\n              font-size: 31px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum:lang(ja) .spectrum-Heading2--quiet strong,\\n.spectrum:lang(ko) .spectrum-Heading2--quiet strong,\\n.spectrum:lang(zh) .spectrum-Heading2--quiet strong,\\n.spectrum:lang(ja) .spectrum-Heading--pageTitle strong,\\n.spectrum:lang(ko) .spectrum-Heading--pageTitle strong,\\n.spectrum:lang(zh) .spectrum-Heading--pageTitle strong {\\n              font-size: 31px;\\n  font-weight: 700;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum:lang(ja) .spectrum-Heading1--strong, .spectrum:lang(ko) .spectrum-Heading1--strong, .spectrum:lang(zh) .spectrum-Heading1--strong {\\n          font-size: 39px;\\n  font-weight: 900;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          margin-bottom: 10px;\\n          margin-top: 10px;\\n        }\\n.spectrum:lang(ja) .spectrum-Heading1--strong em, .spectrum:lang(ko) .spectrum-Heading1--strong em, .spectrum:lang(zh) .spectrum-Heading1--strong em {\\n              font-size: 39px;\\n  font-weight: 900;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum:lang(ja) .spectrum-Heading1--strong strong, .spectrum:lang(ko) .spectrum-Heading1--strong strong, .spectrum:lang(zh) .spectrum-Heading1--strong strong {\\n              font-size: 39px;\\n  font-weight: 900;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum:lang(ja) .spectrum-Heading2--strong, .spectrum:lang(ko) .spectrum-Heading2--strong, .spectrum:lang(zh) .spectrum-Heading2--strong {\\n          font-size: 31px;\\n  font-weight: 900;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          margin-bottom: 10px;\\n          margin-top: 10px;\\n        }\\n.spectrum:lang(ja) .spectrum-Heading2--strong em, .spectrum:lang(ko) .spectrum-Heading2--strong em, .spectrum:lang(zh) .spectrum-Heading2--strong em {\\n              font-size: 31px;\\n  font-weight: 900;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum:lang(ja) .spectrum-Heading2--strong strong, .spectrum:lang(ko) .spectrum-Heading2--strong strong, .spectrum:lang(zh) .spectrum-Heading2--strong strong {\\n              font-size: 31px;\\n  font-weight: 900;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum:lang(ja) .spectrum-Heading1--display, .spectrum:lang(ko) .spectrum-Heading1--display, .spectrum:lang(zh) .spectrum-Heading1--display {\\n          font-size: 49px;\\n  font-weight: 700;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          margin-bottom: 10px;\\n          margin-top: 10px;\\n        }\\n.spectrum:lang(ja) .spectrum-Heading1--display em, .spectrum:lang(ko) .spectrum-Heading1--display em, .spectrum:lang(zh) .spectrum-Heading1--display em {\\n              font-size: 49px;\\n  font-weight: 800;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum:lang(ja) .spectrum-Heading1--display strong, .spectrum:lang(ko) .spectrum-Heading1--display strong, .spectrum:lang(zh) .spectrum-Heading1--display strong {\\n              font-size: 49px;\\n  font-weight: 900;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum:lang(ja) .spectrum-Heading2--display, .spectrum:lang(ko) .spectrum-Heading2--display, .spectrum:lang(zh) .spectrum-Heading2--display {\\n          font-size: 44px;\\n  font-weight: 700;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          margin-bottom: 10px;\\n          margin-top: 10px;\\n        }\\n.spectrum:lang(ja) .spectrum-Heading2--display em, .spectrum:lang(ko) .spectrum-Heading2--display em, .spectrum:lang(zh) .spectrum-Heading2--display em {\\n              font-size: 44px;\\n  font-weight: 800;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum:lang(ja) .spectrum-Heading2--display strong, .spectrum:lang(ko) .spectrum-Heading2--display strong, .spectrum:lang(zh) .spectrum-Heading2--display strong {\\n              font-size: 44px;\\n  font-weight: 900;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum:lang(ja) .spectrum-Heading1--display.spectrum-Heading1--strong, .spectrum:lang(ko) .spectrum-Heading1--display.spectrum-Heading1--strong, .spectrum:lang(zh) .spectrum-Heading1--display.spectrum-Heading1--strong {\\n          font-size: 49px;\\n  font-weight: 900;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          margin-bottom: 10px;\\n          margin-top: 10px;\\n        }\\n.spectrum:lang(ja) .spectrum-Heading1--display.spectrum-Heading1--strong em, .spectrum:lang(ko) .spectrum-Heading1--display.spectrum-Heading1--strong em, .spectrum:lang(zh) .spectrum-Heading1--display.spectrum-Heading1--strong em {\\n              font-size: 49px;\\n  font-weight: 900;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum:lang(ja) .spectrum-Heading1--display.spectrum-Heading1--strong strong, .spectrum:lang(ko) .spectrum-Heading1--display.spectrum-Heading1--strong strong, .spectrum:lang(zh) .spectrum-Heading1--display.spectrum-Heading1--strong strong {\\n              font-size: 49px;\\n  font-weight: 900;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum:lang(ja) .spectrum-Heading2--display.spectrum-Heading2--strong, .spectrum:lang(ko) .spectrum-Heading2--display.spectrum-Heading2--strong, .spectrum:lang(zh) .spectrum-Heading2--display.spectrum-Heading2--strong {\\n          font-size: 44px;\\n  font-weight: 900;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          margin-bottom: 10px;\\n          margin-top: 10px;\\n        }\\n.spectrum:lang(ja) .spectrum-Heading2--display.spectrum-Heading2--strong em, .spectrum:lang(ko) .spectrum-Heading2--display.spectrum-Heading2--strong em, .spectrum:lang(zh) .spectrum-Heading2--display.spectrum-Heading2--strong em {\\n              font-size: 44px;\\n  font-weight: 900;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum:lang(ja) .spectrum-Heading2--display.spectrum-Heading2--strong strong, .spectrum:lang(ko) .spectrum-Heading2--display.spectrum-Heading2--strong strong, .spectrum:lang(zh) .spectrum-Heading2--display.spectrum-Heading2--strong strong {\\n              font-size: 44px;\\n  font-weight: 900;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum:lang(ja) .spectrum-Heading1--display.spectrum-Heading1--quiet, .spectrum:lang(ko) .spectrum-Heading1--display.spectrum-Heading1--quiet, .spectrum:lang(zh) .spectrum-Heading1--display.spectrum-Heading1--quiet {\\n          font-size: 49px;\\n  font-weight: 300;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          margin-bottom: 10px;\\n          margin-top: 10px;\\n        }\\n.spectrum:lang(ja) .spectrum-Heading1--display.spectrum-Heading1--quiet em, .spectrum:lang(ko) .spectrum-Heading1--display.spectrum-Heading1--quiet em, .spectrum:lang(zh) .spectrum-Heading1--display.spectrum-Heading1--quiet em {\\n              font-size: 49px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum:lang(ja) .spectrum-Heading1--display.spectrum-Heading1--quiet strong, .spectrum:lang(ko) .spectrum-Heading1--display.spectrum-Heading1--quiet strong, .spectrum:lang(zh) .spectrum-Heading1--display.spectrum-Heading1--quiet strong {\\n              font-size: 49px;\\n  font-weight: 700;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum:lang(ja) .spectrum-Heading2--display.spectrum-Heading2--quiet,\\n.spectrum:lang(ko) .spectrum-Heading2--display.spectrum-Heading2--quiet,\\n.spectrum:lang(zh) .spectrum-Heading2--display.spectrum-Heading2--quiet,\\n.spectrum:lang(ja) .spectrum-Heading--display,\\n.spectrum:lang(ko) .spectrum-Heading--display,\\n.spectrum:lang(zh) .spectrum-Heading--display {\\n          font-size: 44px;\\n  font-weight: 300;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          margin-bottom: 10px;\\n          margin-top: 10px;\\n        }\\n.spectrum:lang(ja) .spectrum-Heading2--display.spectrum-Heading2--quiet em,\\n.spectrum:lang(ko) .spectrum-Heading2--display.spectrum-Heading2--quiet em,\\n.spectrum:lang(zh) .spectrum-Heading2--display.spectrum-Heading2--quiet em,\\n.spectrum:lang(ja) .spectrum-Heading--display em,\\n.spectrum:lang(ko) .spectrum-Heading--display em,\\n.spectrum:lang(zh) .spectrum-Heading--display em {\\n              font-size: 44px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum:lang(ja) .spectrum-Heading2--display.spectrum-Heading2--quiet strong,\\n.spectrum:lang(ko) .spectrum-Heading2--display.spectrum-Heading2--quiet strong,\\n.spectrum:lang(zh) .spectrum-Heading2--display.spectrum-Heading2--quiet strong,\\n.spectrum:lang(ja) .spectrum-Heading--display strong,\\n.spectrum:lang(ko) .spectrum-Heading--display strong,\\n.spectrum:lang(zh) .spectrum-Heading--display strong {\\n              font-size: 44px;\\n  font-weight: 700;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0.05em;\\n  text-transform: none;\\n\\n          }\\n.spectrum-Code1 {\\n          font-size: 24px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0;\\n\\n          margin-bottom: 20px;\\n          margin-top: 10px;\\n  font-family: Source Code Pro, Monaco, monospace;\\n        }\\n.spectrum-Code1 em {\\n              font-size: 24px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: italic;\\n  letter-spacing: 0;\\n\\n          }\\n.spectrum-Code1 strong {\\n              font-size: 24px;\\n  font-weight: 700;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0;\\n\\n          }\\n.spectrum-Code2 {\\n          font-size: 22px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0;\\n\\n          margin-bottom: 20px;\\n          margin-top: 10px;\\n  font-family: Source Code Pro, Monaco, monospace;\\n        }\\n.spectrum-Code2 em {\\n              font-size: 22px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: italic;\\n  letter-spacing: 0;\\n\\n          }\\n.spectrum-Code2 strong {\\n              font-size: 22px;\\n  font-weight: 700;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0;\\n\\n          }\\n.spectrum-Code3 {\\n          font-size: 19px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0;\\n\\n          margin-bottom: 20px;\\n          margin-top: 10px;\\n  font-family: Source Code Pro, Monaco, monospace;\\n        }\\n.spectrum-Code3 em {\\n              font-size: 19px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: italic;\\n  letter-spacing: 0;\\n\\n          }\\n.spectrum-Code3 strong {\\n              font-size: 19px;\\n  font-weight: 700;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0;\\n\\n          }\\n.spectrum-Code4 {\\n          font-size: 17px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0;\\n\\n          margin-bottom: 20px;\\n          margin-top: 10px;\\n  font-family: Source Code Pro, Monaco, monospace;\\n        }\\n.spectrum-Code4 em {\\n              font-size: 17px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: italic;\\n  letter-spacing: 0;\\n\\n          }\\n.spectrum-Code4 strong {\\n              font-size: 17px;\\n  font-weight: 700;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0;\\n\\n          }\\n.spectrum-Code5 {\\n          font-size: 15px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0;\\n\\n          margin-bottom: 20px;\\n          margin-top: 10px;\\n  font-family: Source Code Pro, Monaco, monospace;\\n        }\\n.spectrum-Code5 em {\\n              font-size: 15px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: italic;\\n  letter-spacing: 0;\\n\\n          }\\n.spectrum-Code5 strong {\\n              font-size: 15px;\\n  font-weight: 700;\\n  line-height: 1.5;\\n  font-style: normal;\\n  letter-spacing: 0;\\n\\n          }\\n/* topdoc\\n{{ typography/typography-default.yml }}\\n*/\\n/* topdoc\\n{{ typography/typography-deprecated.yml }}\\n*/\\n/* topdoc\\n{{ typography/typography-article.yml }}\\n*/\\n/* topdoc\\n{{ typography/typography-han.yml }}\\n*/\\n/* topdoc\\n{{ typography/typography-heading.yml }}\\n*/\\n/* topdoc\\n{{ typography/typography-heading-quiet.yml }}\\n*/\\n/* topdoc\\n{{ typography/typography-heading-strong.yml }}\\n*/\\n/* topdoc\\n{{ typography/typography-display.yml }}\\n*/\\n/* topdoc\\n{{ typography/typography-display-quiet.yml }}\\n*/\\n/* topdoc\\n{{ typography/typography-display-strong.yml }}\\n*/\\n/* topdoc\\n{{ typography/typography-body.yml }}\\n*/\\n/* topdoc\\n{{ typography/typography-code.yml }}\\n*/\\n.spectrum,\\n.spectrum-Body {\\n  font-size: 17px;\\n  font-weight: 400;\\n  line-height: 1.5;\\n  font-style: normal;\\n}\\n.spectrum-Body--italic {\\n  font-style: italic;\\n}\\n", ""]);\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjI2LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0b3JxLW5hdGl2ZS9yZWFjdC1zcGVjdHJ1bS9zcGVjdHJ1bS1jc3Mtb3ZlcnJpZGVzL3R5cG9ncmFwaHkvaW5kZXgtbGcuY3NzP2I0MTYiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIi4uLy4uLy4uLy4uL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qc1wiKShmYWxzZSk7XG4vLyBNb2R1bGVcbmV4cG9ydHMucHVzaChbbW9kdWxlLmlkLCBcIi8qIGdlbmVyYXRlZCBmcm9tIGRuYS12ZXJzaW9uOiA1LjAuMSAqL1xcbi8qIGdlbmVyYXRlZCBmcm9tIGRuYS12ZXJzaW9uOiA1LjAuMSAqL1xcbi5zcGVjdHJ1bSB7XFxuICBmb250LWZhbWlseTogYWRvYmUtY2xlYW4sIFxcXCJTb3VyY2UgU2FucyBQcm9cXFwiLCAtYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsIFxcXCJTZWdvZSBVSVxcXCIsIFJvYm90bywgc2Fucy1zZXJpZjtcXG4gIGZvbnQtc2l6ZTogMTdweDtcXG59XFxuLnNwZWN0cnVtOmxhbmcoemgtSGFucykge1xcbiAgICBmb250LWZhbWlseTogYWRvYmUtY2xlYW4taGFuLWphcGFuZXNlLCAtYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsIFxcXCJTZWdvZSBVSVxcXCIsIFJvYm90bywgc2Fucy1zZXJpZjtcXG4gIH1cXG4uc3BlY3RydW06bGFuZyh6aCkge1xcbiAgICBmb250LWZhbWlseTogYWRvYmUtY2xlYW4taGFuLWphcGFuZXNlLCAtYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsIFxcXCJTZWdvZSBVSVxcXCIsIFJvYm90bywgc2Fucy1zZXJpZjtcXG4gIH1cXG4uc3BlY3RydW06bGFuZyhrbykge1xcbiAgICBmb250LWZhbWlseTogYWRvYmUtY2xlYW4taGFuLWphcGFuZXNlLCAtYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsIFxcXCJTZWdvZSBVSVxcXCIsIFJvYm90bywgc2Fucy1zZXJpZjtcXG4gIH1cXG4uc3BlY3RydW06bGFuZyhqYSkge1xcbiAgICBmb250LWZhbWlseTogYWRvYmUtY2xlYW4taGFuLWphcGFuZXNlLCAtYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsIFxcXCJTZWdvZSBVSVxcXCIsIFJvYm90bywgc2Fucy1zZXJpZjtcXG4gIH1cXG4uc3BlY3RydW0tQm9keTEge1xcbiAgICAgICAgICBmb250LXNpemU6IDI0cHg7XFxuICBmb250LXdlaWdodDogNDAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIG1hcmdpbi1ib3R0b206IDIwcHg7XFxuICAgICAgICAgIG1hcmdpbi10b3A6IDEwcHg7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLUJvZHkxIGVtIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogMjRweDtcXG4gIGZvbnQtd2VpZ2h0OiA0MDA7XFxuICBsaW5lLWhlaWdodDogMS41O1xcbiAgZm9udC1zdHlsZTogaXRhbGljO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDA7XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bS1Cb2R5MSBzdHJvbmcge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiAyNHB4O1xcbiAgZm9udC13ZWlnaHQ6IDcwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjU7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMDtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtLUJvZHkyLFxcbi5zcGVjdHJ1bS1Cb2R5LS1sYXJnZSB7XFxuICAgICAgICAgIGZvbnQtc2l6ZTogMjJweDtcXG4gIGZvbnQtd2VpZ2h0OiA0MDA7XFxuICBsaW5lLWhlaWdodDogMS41O1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDA7XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgbWFyZ2luLWJvdHRvbTogMjBweDtcXG4gICAgICAgICAgbWFyZ2luLXRvcDogMTBweDtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tQm9keTIgZW0sXFxuLnNwZWN0cnVtLUJvZHktLWxhcmdlIGVtIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogMjJweDtcXG4gIGZvbnQtd2VpZ2h0OiA0MDA7XFxuICBsaW5lLWhlaWdodDogMS41O1xcbiAgZm9udC1zdHlsZTogaXRhbGljO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDA7XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bS1Cb2R5MiBzdHJvbmcsXFxuLnNwZWN0cnVtLUJvZHktLWxhcmdlIHN0cm9uZyB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDIycHg7XFxuICBmb250LXdlaWdodDogNzAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW0tQm9keTMge1xcbiAgICAgICAgICBmb250LXNpemU6IDE5cHg7XFxuICBmb250LXdlaWdodDogNDAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIG1hcmdpbi1ib3R0b206IDIwcHg7XFxuICAgICAgICAgIG1hcmdpbi10b3A6IDEwcHg7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLUJvZHkzIGVtIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogMTlweDtcXG4gIGZvbnQtd2VpZ2h0OiA0MDA7XFxuICBsaW5lLWhlaWdodDogMS41O1xcbiAgZm9udC1zdHlsZTogaXRhbGljO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDA7XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bS1Cb2R5MyBzdHJvbmcge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiAxOXB4O1xcbiAgZm9udC13ZWlnaHQ6IDcwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjU7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMDtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtLUJvZHk0LFxcbi5zcGVjdHJ1bS1Cb2R5LS1zZWNvbmRhcnkge1xcbiAgICAgICAgICBmb250LXNpemU6IDE3cHg7XFxuICBmb250LXdlaWdodDogNDAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIG1hcmdpbi1ib3R0b206IDIwcHg7XFxuICAgICAgICAgIG1hcmdpbi10b3A6IDEwcHg7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLUJvZHk0IGVtLFxcbi5zcGVjdHJ1bS1Cb2R5LS1zZWNvbmRhcnkgZW0ge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiAxN3B4O1xcbiAgZm9udC13ZWlnaHQ6IDQwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjU7XFxuICBmb250LXN0eWxlOiBpdGFsaWM7XFxuICBsZXR0ZXItc3BhY2luZzogMDtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtLUJvZHk0IHN0cm9uZyxcXG4uc3BlY3RydW0tQm9keS0tc2Vjb25kYXJ5IHN0cm9uZyB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDE3cHg7XFxuICBmb250LXdlaWdodDogNzAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW0tQm9keTUsXFxuLnNwZWN0cnVtLUJvZHktLXNtYWxsIHtcXG4gICAgICAgICAgZm9udC1zaXplOiAxNXB4O1xcbiAgZm9udC13ZWlnaHQ6IDQwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjU7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMDtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICBtYXJnaW4tYm90dG9tOiAyMHB4O1xcbiAgICAgICAgICBtYXJnaW4tdG9wOiAxMHB4O1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS1Cb2R5NSBlbSxcXG4uc3BlY3RydW0tQm9keS0tc21hbGwgZW0ge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiAxNXB4O1xcbiAgZm9udC13ZWlnaHQ6IDQwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjU7XFxuICBmb250LXN0eWxlOiBpdGFsaWM7XFxuICBsZXR0ZXItc3BhY2luZzogMDtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtLUJvZHk1IHN0cm9uZyxcXG4uc3BlY3RydW0tQm9keS0tc21hbGwgc3Ryb25nIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogMTVweDtcXG4gIGZvbnQtd2VpZ2h0OiA3MDA7XFxuICBsaW5lLWhlaWdodDogMS41O1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDA7XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bS1IZWFkaW5nMSB7XFxuICAgICAgICAgIGZvbnQtc2l6ZTogMzlweDtcXG4gIGZvbnQtd2VpZ2h0OiA3MDA7XFxuICBsaW5lLWhlaWdodDogMS4zO1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDA7XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgbWFyZ2luLWJvdHRvbTogMTBweDtcXG4gICAgICAgICAgbWFyZ2luLXRvcDogMTBweDtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tSGVhZGluZzEgZW0ge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiAzOXB4O1xcbiAgZm9udC13ZWlnaHQ6IDcwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjM7XFxuICBmb250LXN0eWxlOiBpdGFsaWM7XFxuICBsZXR0ZXItc3BhY2luZzogMDtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtLUhlYWRpbmcxIHN0cm9uZyB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDM5cHg7XFxuICBmb250LXdlaWdodDogOTAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuMztcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW0tSGVhZGluZzIge1xcbiAgICAgICAgICBmb250LXNpemU6IDMxcHg7XFxuICBmb250LXdlaWdodDogNzAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuMztcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIG1hcmdpbi1ib3R0b206IDEwcHg7XFxuICAgICAgICAgIG1hcmdpbi10b3A6IDEwcHg7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLUhlYWRpbmcyIGVtIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogMzFweDtcXG4gIGZvbnQtd2VpZ2h0OiA3MDA7XFxuICBsaW5lLWhlaWdodDogMS4zO1xcbiAgZm9udC1zdHlsZTogaXRhbGljO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDA7XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bS1IZWFkaW5nMiBzdHJvbmcge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiAzMXB4O1xcbiAgZm9udC13ZWlnaHQ6IDkwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjM7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMDtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtLUhlYWRpbmczIHtcXG4gICAgICAgICAgZm9udC1zaXplOiAyNHB4O1xcbiAgZm9udC13ZWlnaHQ6IDcwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjM7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMDtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICBtYXJnaW4tYm90dG9tOiAxMHB4O1xcbiAgICAgICAgICBtYXJnaW4tdG9wOiAxMHB4O1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS1IZWFkaW5nMyBlbSB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDI0cHg7XFxuICBmb250LXdlaWdodDogNzAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuMztcXG4gIGZvbnQtc3R5bGU6IGl0YWxpYztcXG4gIGxldHRlci1zcGFjaW5nOiAwO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW0tSGVhZGluZzMgc3Ryb25nIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogMjRweDtcXG4gIGZvbnQtd2VpZ2h0OiA5MDA7XFxuICBsaW5lLWhlaWdodDogMS4zO1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDA7XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bS1IZWFkaW5nNCxcXG4uc3BlY3RydW0tSGVhZGluZy0tc3VidGl0bGUxIHtcXG4gICAgICAgICAgZm9udC1zaXplOiAyMnB4O1xcbiAgZm9udC13ZWlnaHQ6IDcwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjM7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMDtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICBtYXJnaW4tYm90dG9tOiAxMHB4O1xcbiAgICAgICAgICBtYXJnaW4tdG9wOiAxMHB4O1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS1IZWFkaW5nNCBlbSxcXG4uc3BlY3RydW0tSGVhZGluZy0tc3VidGl0bGUxIGVtIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogMjJweDtcXG4gIGZvbnQtd2VpZ2h0OiA3MDA7XFxuICBsaW5lLWhlaWdodDogMS4zO1xcbiAgZm9udC1zdHlsZTogaXRhbGljO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDA7XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bS1IZWFkaW5nNCBzdHJvbmcsXFxuLnNwZWN0cnVtLUhlYWRpbmctLXN1YnRpdGxlMSBzdHJvbmcge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiAyMnB4O1xcbiAgZm9udC13ZWlnaHQ6IDkwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjM7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMDtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtLUhlYWRpbmc1IHtcXG4gICAgICAgICAgZm9udC1zaXplOiAxOXB4O1xcbiAgZm9udC13ZWlnaHQ6IDcwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjM7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMDtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICBtYXJnaW4tYm90dG9tOiAxMHB4O1xcbiAgICAgICAgICBtYXJnaW4tdG9wOiAxMHB4O1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS1IZWFkaW5nNSBlbSB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDE5cHg7XFxuICBmb250LXdlaWdodDogNzAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuMztcXG4gIGZvbnQtc3R5bGU6IGl0YWxpYztcXG4gIGxldHRlci1zcGFjaW5nOiAwO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW0tSGVhZGluZzUgc3Ryb25nIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogMTlweDtcXG4gIGZvbnQtd2VpZ2h0OiA5MDA7XFxuICBsaW5lLWhlaWdodDogMS4zO1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDA7XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bS1IZWFkaW5nNixcXG4uc3BlY3RydW0tSGVhZGluZy0tc3VidGl0bGUyIHtcXG4gICAgICAgICAgZm9udC1zaXplOiAxN3B4O1xcbiAgZm9udC13ZWlnaHQ6IDcwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjM7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMDtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICBtYXJnaW4tYm90dG9tOiAxMHB4O1xcbiAgICAgICAgICBtYXJnaW4tdG9wOiAxMHB4O1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS1IZWFkaW5nNiBlbSxcXG4uc3BlY3RydW0tSGVhZGluZy0tc3VidGl0bGUyIGVtIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogMTdweDtcXG4gIGZvbnQtd2VpZ2h0OiA3MDA7XFxuICBsaW5lLWhlaWdodDogMS4zO1xcbiAgZm9udC1zdHlsZTogaXRhbGljO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDA7XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bS1IZWFkaW5nNiBzdHJvbmcsXFxuLnNwZWN0cnVtLUhlYWRpbmctLXN1YnRpdGxlMiBzdHJvbmcge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiAxN3B4O1xcbiAgZm9udC13ZWlnaHQ6IDkwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjM7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMDtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtLVN1YmhlYWRpbmcsXFxuLnNwZWN0cnVtLUhlYWRpbmctLXN1YnRpdGxlMyB7XFxuICAgICAgICAgIGZvbnQtc2l6ZTogMTNweDtcXG4gIGZvbnQtd2VpZ2h0OiA3MDA7XFxuICBsaW5lLWhlaWdodDogMS4zO1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDZlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XFxuXFxuICAgICAgICAgIG1hcmdpbi1ib3R0b206IDEwcHg7XFxuICAgICAgICAgIG1hcmdpbi10b3A6IDEwcHg7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLVN1YmhlYWRpbmcgZW0sXFxuLnNwZWN0cnVtLUhlYWRpbmctLXN1YnRpdGxlMyBlbSB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDEzcHg7XFxuICBmb250LXdlaWdodDogNzAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuMztcXG4gIGZvbnQtc3R5bGU6IGl0YWxpYztcXG4gIGxldHRlci1zcGFjaW5nOiAwLjA2ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtLVN1YmhlYWRpbmcgc3Ryb25nLFxcbi5zcGVjdHJ1bS1IZWFkaW5nLS1zdWJ0aXRsZTMgc3Ryb25nIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogMTNweDtcXG4gIGZvbnQtd2VpZ2h0OiA5MDA7XFxuICBsaW5lLWhlaWdodDogMS4zO1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDZlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW0tRGV0YWlsIHtcXG4gICAgICAgICAgZm9udC1zaXplOiAxM3B4O1xcbiAgZm9udC13ZWlnaHQ6IDQwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjU7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wNmVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcXG5cXG4gICAgICAgICAgbWFyZ2luLWJvdHRvbTogMjBweDtcXG4gICAgICAgICAgbWFyZ2luLXRvcDogMTBweDtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tRGV0YWlsIGVtIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogMTNweDtcXG4gIGZvbnQtd2VpZ2h0OiA0MDA7XFxuICBsaW5lLWhlaWdodDogMS41O1xcbiAgZm9udC1zdHlsZTogaXRhbGljO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDZlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW0tRGV0YWlsIHN0cm9uZyB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDEzcHg7XFxuICBmb250LXdlaWdodDogNzAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjA2ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtLUhlYWRpbmcxLS1xdWlldCB7XFxuICAgICAgICAgIGZvbnQtc2l6ZTogMzlweDtcXG4gIGZvbnQtd2VpZ2h0OiAzMDA7XFxuICBsaW5lLWhlaWdodDogMS4zO1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDA7XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgbWFyZ2luLWJvdHRvbTogMTBweDtcXG4gICAgICAgICAgbWFyZ2luLXRvcDogMTBweDtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tSGVhZGluZzEtLXF1aWV0IGVtIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogMzlweDtcXG4gIGZvbnQtd2VpZ2h0OiAzMDA7XFxuICBsaW5lLWhlaWdodDogMS4zO1xcbiAgZm9udC1zdHlsZTogaXRhbGljO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDA7XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bS1IZWFkaW5nMS0tcXVpZXQgc3Ryb25nIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogMzlweDtcXG4gIGZvbnQtd2VpZ2h0OiA3MDA7XFxuICBsaW5lLWhlaWdodDogMS4zO1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDA7XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bS1IZWFkaW5nMi0tcXVpZXQsXFxuLnNwZWN0cnVtLUhlYWRpbmctLXBhZ2VUaXRsZSB7XFxuICAgICAgICAgIGZvbnQtc2l6ZTogMzFweDtcXG4gIGZvbnQtd2VpZ2h0OiAzMDA7XFxuICBsaW5lLWhlaWdodDogMS4zO1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDA7XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgbWFyZ2luLWJvdHRvbTogMTBweDtcXG4gICAgICAgICAgbWFyZ2luLXRvcDogMTBweDtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tSGVhZGluZzItLXF1aWV0IGVtLFxcbi5zcGVjdHJ1bS1IZWFkaW5nLS1wYWdlVGl0bGUgZW0ge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiAzMXB4O1xcbiAgZm9udC13ZWlnaHQ6IDMwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjM7XFxuICBmb250LXN0eWxlOiBpdGFsaWM7XFxuICBsZXR0ZXItc3BhY2luZzogMDtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtLUhlYWRpbmcyLS1xdWlldCBzdHJvbmcsXFxuLnNwZWN0cnVtLUhlYWRpbmctLXBhZ2VUaXRsZSBzdHJvbmcge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiAzMXB4O1xcbiAgZm9udC13ZWlnaHQ6IDcwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjM7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMDtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtLUhlYWRpbmcxLS1zdHJvbmcge1xcbiAgICAgICAgICBmb250LXNpemU6IDM5cHg7XFxuICBmb250LXdlaWdodDogOTAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuMztcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIG1hcmdpbi1ib3R0b206IDEwcHg7XFxuICAgICAgICAgIG1hcmdpbi10b3A6IDEwcHg7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLUhlYWRpbmcxLS1zdHJvbmcgZW0ge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiAzOXB4O1xcbiAgZm9udC13ZWlnaHQ6IDkwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjM7XFxuICBmb250LXN0eWxlOiBpdGFsaWM7XFxuICBsZXR0ZXItc3BhY2luZzogMDtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtLUhlYWRpbmcxLS1zdHJvbmcgc3Ryb25nIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogMzlweDtcXG4gIGZvbnQtd2VpZ2h0OiA5MDA7XFxuICBsaW5lLWhlaWdodDogMS4zO1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDA7XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bS1IZWFkaW5nMi0tc3Ryb25nIHtcXG4gICAgICAgICAgZm9udC1zaXplOiAzMXB4O1xcbiAgZm9udC13ZWlnaHQ6IDkwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjM7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMDtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICBtYXJnaW4tYm90dG9tOiAxMHB4O1xcbiAgICAgICAgICBtYXJnaW4tdG9wOiAxMHB4O1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS1IZWFkaW5nMi0tc3Ryb25nIGVtIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogMzFweDtcXG4gIGZvbnQtd2VpZ2h0OiA5MDA7XFxuICBsaW5lLWhlaWdodDogMS4zO1xcbiAgZm9udC1zdHlsZTogaXRhbGljO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDA7XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bS1IZWFkaW5nMi0tc3Ryb25nIHN0cm9uZyB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDMxcHg7XFxuICBmb250LXdlaWdodDogOTAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuMztcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW0tSGVhZGluZzEtLWRpc3BsYXkge1xcbiAgICAgICAgICBmb250LXNpemU6IDQ5cHg7XFxuICBmb250LXdlaWdodDogNzAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuMztcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIG1hcmdpbi1ib3R0b206IDEwcHg7XFxuICAgICAgICAgIG1hcmdpbi10b3A6IDEwcHg7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLUhlYWRpbmcxLS1kaXNwbGF5IGVtIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogNDlweDtcXG4gIGZvbnQtd2VpZ2h0OiA3MDA7XFxuICBsaW5lLWhlaWdodDogMS4zO1xcbiAgZm9udC1zdHlsZTogaXRhbGljO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDA7XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bS1IZWFkaW5nMS0tZGlzcGxheSBzdHJvbmcge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiA0OXB4O1xcbiAgZm9udC13ZWlnaHQ6IDkwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjM7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMDtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtLUhlYWRpbmcyLS1kaXNwbGF5IHtcXG4gICAgICAgICAgZm9udC1zaXplOiA0NHB4O1xcbiAgZm9udC13ZWlnaHQ6IDcwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjM7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMDtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICBtYXJnaW4tYm90dG9tOiAxMHB4O1xcbiAgICAgICAgICBtYXJnaW4tdG9wOiAxMHB4O1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS1IZWFkaW5nMi0tZGlzcGxheSBlbSB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDQ0cHg7XFxuICBmb250LXdlaWdodDogNzAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuMztcXG4gIGZvbnQtc3R5bGU6IGl0YWxpYztcXG4gIGxldHRlci1zcGFjaW5nOiAwO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW0tSGVhZGluZzItLWRpc3BsYXkgc3Ryb25nIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogNDRweDtcXG4gIGZvbnQtd2VpZ2h0OiA3MDA7XFxuICBsaW5lLWhlaWdodDogMS4zO1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDA7XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bS1IZWFkaW5nMS0tZGlzcGxheS5zcGVjdHJ1bS1IZWFkaW5nMS0tc3Ryb25nIHtcXG4gICAgICAgICAgZm9udC1zaXplOiA0OXB4O1xcbiAgZm9udC13ZWlnaHQ6IDkwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjM7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMDtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICBtYXJnaW4tYm90dG9tOiAxMHB4O1xcbiAgICAgICAgICBtYXJnaW4tdG9wOiAxMHB4O1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS1IZWFkaW5nMS0tZGlzcGxheS5zcGVjdHJ1bS1IZWFkaW5nMS0tc3Ryb25nIGVtIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogNDlweDtcXG4gIGZvbnQtd2VpZ2h0OiA5MDA7XFxuICBsaW5lLWhlaWdodDogMS4zO1xcbiAgZm9udC1zdHlsZTogaXRhbGljO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDA7XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bS1IZWFkaW5nMS0tZGlzcGxheS5zcGVjdHJ1bS1IZWFkaW5nMS0tc3Ryb25nIHN0cm9uZyB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDQ5cHg7XFxuICBmb250LXdlaWdodDogOTAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuMztcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW0tSGVhZGluZzItLWRpc3BsYXkuc3BlY3RydW0tSGVhZGluZzItLXN0cm9uZyB7XFxuICAgICAgICAgIGZvbnQtc2l6ZTogNDRweDtcXG4gIGZvbnQtd2VpZ2h0OiA5MDA7XFxuICBsaW5lLWhlaWdodDogMS4zO1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDA7XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgbWFyZ2luLWJvdHRvbTogMTBweDtcXG4gICAgICAgICAgbWFyZ2luLXRvcDogMTBweDtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tSGVhZGluZzItLWRpc3BsYXkuc3BlY3RydW0tSGVhZGluZzItLXN0cm9uZyBlbSB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDQ0cHg7XFxuICBmb250LXdlaWdodDogOTAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuMztcXG4gIGZvbnQtc3R5bGU6IGl0YWxpYztcXG4gIGxldHRlci1zcGFjaW5nOiAwO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW0tSGVhZGluZzItLWRpc3BsYXkuc3BlY3RydW0tSGVhZGluZzItLXN0cm9uZyBzdHJvbmcge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiA0NHB4O1xcbiAgZm9udC13ZWlnaHQ6IDkwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjM7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMDtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtLUhlYWRpbmcxLS1kaXNwbGF5LnNwZWN0cnVtLUhlYWRpbmcxLS1xdWlldCB7XFxuICAgICAgICAgIGZvbnQtc2l6ZTogNDlweDtcXG4gIGZvbnQtd2VpZ2h0OiAzMDA7XFxuICBsaW5lLWhlaWdodDogMS4zO1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDA7XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgbWFyZ2luLWJvdHRvbTogMTBweDtcXG4gICAgICAgICAgbWFyZ2luLXRvcDogMTBweDtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tSGVhZGluZzEtLWRpc3BsYXkuc3BlY3RydW0tSGVhZGluZzEtLXF1aWV0IGVtIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogNDlweDtcXG4gIGZvbnQtd2VpZ2h0OiAzMDA7XFxuICBsaW5lLWhlaWdodDogMS4zO1xcbiAgZm9udC1zdHlsZTogaXRhbGljO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDA7XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bS1IZWFkaW5nMS0tZGlzcGxheS5zcGVjdHJ1bS1IZWFkaW5nMS0tcXVpZXQgc3Ryb25nIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogNDlweDtcXG4gIGZvbnQtd2VpZ2h0OiA3MDA7XFxuICBsaW5lLWhlaWdodDogMS4zO1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDA7XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bS1IZWFkaW5nMi0tZGlzcGxheS5zcGVjdHJ1bS1IZWFkaW5nMi0tcXVpZXQsXFxuLnNwZWN0cnVtLUhlYWRpbmctLWRpc3BsYXkge1xcbiAgICAgICAgICBmb250LXNpemU6IDQ0cHg7XFxuICBmb250LXdlaWdodDogMzAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuMztcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIG1hcmdpbi1ib3R0b206IDEwcHg7XFxuICAgICAgICAgIG1hcmdpbi10b3A6IDEwcHg7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLUhlYWRpbmcyLS1kaXNwbGF5LnNwZWN0cnVtLUhlYWRpbmcyLS1xdWlldCBlbSxcXG4uc3BlY3RydW0tSGVhZGluZy0tZGlzcGxheSBlbSB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDQ0cHg7XFxuICBmb250LXdlaWdodDogMzAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuMztcXG4gIGZvbnQtc3R5bGU6IGl0YWxpYztcXG4gIGxldHRlci1zcGFjaW5nOiAwO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW0tSGVhZGluZzItLWRpc3BsYXkuc3BlY3RydW0tSGVhZGluZzItLXF1aWV0IHN0cm9uZyxcXG4uc3BlY3RydW0tSGVhZGluZy0tZGlzcGxheSBzdHJvbmcge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiA0NHB4O1xcbiAgZm9udC13ZWlnaHQ6IDcwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjM7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMDtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtLUFydGljbGUge1xcbiAgZm9udC1mYW1pbHk6IEFkb2JlIENsZWFuIFNlcmlmLCBUaW1lcyBOZXcgUm9tYW4sIHNlcmlmO1xcbn1cXG4uc3BlY3RydW0tQXJ0aWNsZSAuc3BlY3RydW0tQm9keTEge1xcbiAgICAgICAgICBmb250LXNpemU6IDI0cHg7XFxuICBmb250LXdlaWdodDogNDAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjAxMjVlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICBtYXJnaW4tYm90dG9tOiAyMHB4O1xcbiAgICAgICAgICBtYXJnaW4tdG9wOiAxMHB4O1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS1BcnRpY2xlIC5zcGVjdHJ1bS1Cb2R5MSBlbSB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDI0cHg7XFxuICBmb250LXdlaWdodDogNDAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gIGZvbnQtc3R5bGU6IGl0YWxpYztcXG4gIGxldHRlci1zcGFjaW5nOiAwLjAxMjVlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLUJvZHkxIHN0cm9uZyB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDI0cHg7XFxuICBmb250LXdlaWdodDogOTAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjAxMjVlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLUJvZHkyLFxcbi5zcGVjdHJ1bS1BcnRpY2xlIC5zcGVjdHJ1bS1Cb2R5LS1sYXJnZSB7XFxuICAgICAgICAgIGZvbnQtc2l6ZTogMjJweDtcXG4gIGZvbnQtd2VpZ2h0OiA0MDA7XFxuICBsaW5lLWhlaWdodDogMS41O1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDEyNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIG1hcmdpbi1ib3R0b206IDIwcHg7XFxuICAgICAgICAgIG1hcmdpbi10b3A6IDEwcHg7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLUJvZHkyIGVtLFxcbi5zcGVjdHJ1bS1BcnRpY2xlIC5zcGVjdHJ1bS1Cb2R5LS1sYXJnZSBlbSB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDIycHg7XFxuICBmb250LXdlaWdodDogNDAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gIGZvbnQtc3R5bGU6IGl0YWxpYztcXG4gIGxldHRlci1zcGFjaW5nOiAwLjAxMjVlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLUJvZHkyIHN0cm9uZyxcXG4uc3BlY3RydW0tQXJ0aWNsZSAuc3BlY3RydW0tQm9keS0tbGFyZ2Ugc3Ryb25nIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogMjJweDtcXG4gIGZvbnQtd2VpZ2h0OiA5MDA7XFxuICBsaW5lLWhlaWdodDogMS41O1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDEyNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW0tQXJ0aWNsZSAuc3BlY3RydW0tQm9keTMge1xcbiAgICAgICAgICBmb250LXNpemU6IDE5cHg7XFxuICBmb250LXdlaWdodDogNDAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjAxMjVlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICBtYXJnaW4tYm90dG9tOiAyMHB4O1xcbiAgICAgICAgICBtYXJnaW4tdG9wOiAxMHB4O1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS1BcnRpY2xlIC5zcGVjdHJ1bS1Cb2R5MyBlbSB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDE5cHg7XFxuICBmb250LXdlaWdodDogNDAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gIGZvbnQtc3R5bGU6IGl0YWxpYztcXG4gIGxldHRlci1zcGFjaW5nOiAwLjAxMjVlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLUJvZHkzIHN0cm9uZyB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDE5cHg7XFxuICBmb250LXdlaWdodDogOTAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjAxMjVlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLUJvZHk0LFxcbi5zcGVjdHJ1bS1BcnRpY2xlIC5zcGVjdHJ1bS1Cb2R5LS1zZWNvbmRhcnkge1xcbiAgICAgICAgICBmb250LXNpemU6IDE3cHg7XFxuICBmb250LXdlaWdodDogNDAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjAxMjVlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICBtYXJnaW4tYm90dG9tOiAyMHB4O1xcbiAgICAgICAgICBtYXJnaW4tdG9wOiAxMHB4O1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS1BcnRpY2xlIC5zcGVjdHJ1bS1Cb2R5NCBlbSxcXG4uc3BlY3RydW0tQXJ0aWNsZSAuc3BlY3RydW0tQm9keS0tc2Vjb25kYXJ5IGVtIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogMTdweDtcXG4gIGZvbnQtd2VpZ2h0OiA0MDA7XFxuICBsaW5lLWhlaWdodDogMS41O1xcbiAgZm9udC1zdHlsZTogaXRhbGljO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDEyNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW0tQXJ0aWNsZSAuc3BlY3RydW0tQm9keTQgc3Ryb25nLFxcbi5zcGVjdHJ1bS1BcnRpY2xlIC5zcGVjdHJ1bS1Cb2R5LS1zZWNvbmRhcnkgc3Ryb25nIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogMTdweDtcXG4gIGZvbnQtd2VpZ2h0OiA5MDA7XFxuICBsaW5lLWhlaWdodDogMS41O1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDEyNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW0tQXJ0aWNsZSAuc3BlY3RydW0tQm9keTUsXFxuLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLUJvZHktLXNtYWxsIHtcXG4gICAgICAgICAgZm9udC1zaXplOiAxNXB4O1xcbiAgZm9udC13ZWlnaHQ6IDQwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjU7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wMTI1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgbWFyZ2luLWJvdHRvbTogMjBweDtcXG4gICAgICAgICAgbWFyZ2luLXRvcDogMTBweDtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tQXJ0aWNsZSAuc3BlY3RydW0tQm9keTUgZW0sXFxuLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLUJvZHktLXNtYWxsIGVtIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogMTVweDtcXG4gIGZvbnQtd2VpZ2h0OiA0MDA7XFxuICBsaW5lLWhlaWdodDogMS41O1xcbiAgZm9udC1zdHlsZTogaXRhbGljO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDEyNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW0tQXJ0aWNsZSAuc3BlY3RydW0tQm9keTUgc3Ryb25nLFxcbi5zcGVjdHJ1bS1BcnRpY2xlIC5zcGVjdHJ1bS1Cb2R5LS1zbWFsbCBzdHJvbmcge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiAxNXB4O1xcbiAgZm9udC13ZWlnaHQ6IDkwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjU7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wMTI1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bS1BcnRpY2xlIC5zcGVjdHJ1bS1IZWFkaW5nMSB7XFxuICAgICAgICAgIGZvbnQtc2l6ZTogMzlweDtcXG4gIGZvbnQtd2VpZ2h0OiA3MDA7XFxuICBsaW5lLWhlaWdodDogMS4zO1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDEyNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIG1hcmdpbi1ib3R0b206IDEwcHg7XFxuICAgICAgICAgIG1hcmdpbi10b3A6IDEwcHg7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLUhlYWRpbmcxIGVtIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogMzlweDtcXG4gIGZvbnQtd2VpZ2h0OiA3MDA7XFxuICBsaW5lLWhlaWdodDogMS4zO1xcbiAgZm9udC1zdHlsZTogaXRhbGljO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDEyNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW0tQXJ0aWNsZSAuc3BlY3RydW0tSGVhZGluZzEgc3Ryb25nIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogMzlweDtcXG4gIGZvbnQtd2VpZ2h0OiA5MDA7XFxuICBsaW5lLWhlaWdodDogMS4zO1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDEyNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW0tQXJ0aWNsZSAuc3BlY3RydW0tSGVhZGluZzIge1xcbiAgICAgICAgICBmb250LXNpemU6IDMxcHg7XFxuICBmb250LXdlaWdodDogNzAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuMztcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjAxMjVlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICBtYXJnaW4tYm90dG9tOiAxMHB4O1xcbiAgICAgICAgICBtYXJnaW4tdG9wOiAxMHB4O1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS1BcnRpY2xlIC5zcGVjdHJ1bS1IZWFkaW5nMiBlbSB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDMxcHg7XFxuICBmb250LXdlaWdodDogNzAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuMztcXG4gIGZvbnQtc3R5bGU6IGl0YWxpYztcXG4gIGxldHRlci1zcGFjaW5nOiAwLjAxMjVlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLUhlYWRpbmcyIHN0cm9uZyB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDMxcHg7XFxuICBmb250LXdlaWdodDogOTAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuMztcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjAxMjVlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLUhlYWRpbmczIHtcXG4gICAgICAgICAgZm9udC1zaXplOiAyNHB4O1xcbiAgZm9udC13ZWlnaHQ6IDcwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjM7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wMTI1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgbWFyZ2luLWJvdHRvbTogMTBweDtcXG4gICAgICAgICAgbWFyZ2luLXRvcDogMTBweDtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tQXJ0aWNsZSAuc3BlY3RydW0tSGVhZGluZzMgZW0ge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiAyNHB4O1xcbiAgZm9udC13ZWlnaHQ6IDcwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjM7XFxuICBmb250LXN0eWxlOiBpdGFsaWM7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wMTI1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bS1BcnRpY2xlIC5zcGVjdHJ1bS1IZWFkaW5nMyBzdHJvbmcge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiAyNHB4O1xcbiAgZm9udC13ZWlnaHQ6IDkwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjM7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wMTI1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bS1BcnRpY2xlIC5zcGVjdHJ1bS1IZWFkaW5nNCxcXG4uc3BlY3RydW0tQXJ0aWNsZSAuc3BlY3RydW0tSGVhZGluZy0tc3VidGl0bGUxIHtcXG4gICAgICAgICAgZm9udC1zaXplOiAyMnB4O1xcbiAgZm9udC13ZWlnaHQ6IDcwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjM7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wMTI1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgbWFyZ2luLWJvdHRvbTogMTBweDtcXG4gICAgICAgICAgbWFyZ2luLXRvcDogMTBweDtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tQXJ0aWNsZSAuc3BlY3RydW0tSGVhZGluZzQgZW0sXFxuLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLUhlYWRpbmctLXN1YnRpdGxlMSBlbSB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDIycHg7XFxuICBmb250LXdlaWdodDogNzAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuMztcXG4gIGZvbnQtc3R5bGU6IGl0YWxpYztcXG4gIGxldHRlci1zcGFjaW5nOiAwLjAxMjVlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLUhlYWRpbmc0IHN0cm9uZyxcXG4uc3BlY3RydW0tQXJ0aWNsZSAuc3BlY3RydW0tSGVhZGluZy0tc3VidGl0bGUxIHN0cm9uZyB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDIycHg7XFxuICBmb250LXdlaWdodDogOTAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuMztcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjAxMjVlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLUhlYWRpbmc1IHtcXG4gICAgICAgICAgZm9udC1zaXplOiAxOXB4O1xcbiAgZm9udC13ZWlnaHQ6IDcwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjM7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wMTI1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgbWFyZ2luLWJvdHRvbTogMTBweDtcXG4gICAgICAgICAgbWFyZ2luLXRvcDogMTBweDtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tQXJ0aWNsZSAuc3BlY3RydW0tSGVhZGluZzUgZW0ge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiAxOXB4O1xcbiAgZm9udC13ZWlnaHQ6IDcwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjM7XFxuICBmb250LXN0eWxlOiBpdGFsaWM7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wMTI1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bS1BcnRpY2xlIC5zcGVjdHJ1bS1IZWFkaW5nNSBzdHJvbmcge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiAxOXB4O1xcbiAgZm9udC13ZWlnaHQ6IDkwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjM7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wMTI1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bS1BcnRpY2xlIC5zcGVjdHJ1bS1IZWFkaW5nNixcXG4uc3BlY3RydW0tQXJ0aWNsZSAuc3BlY3RydW0tSGVhZGluZy0tc3VidGl0bGUyIHtcXG4gICAgICAgICAgZm9udC1zaXplOiAxN3B4O1xcbiAgZm9udC13ZWlnaHQ6IDcwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjM7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wMTI1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgbWFyZ2luLWJvdHRvbTogMTBweDtcXG4gICAgICAgICAgbWFyZ2luLXRvcDogMTBweDtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tQXJ0aWNsZSAuc3BlY3RydW0tSGVhZGluZzYgZW0sXFxuLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLUhlYWRpbmctLXN1YnRpdGxlMiBlbSB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDE3cHg7XFxuICBmb250LXdlaWdodDogNzAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuMztcXG4gIGZvbnQtc3R5bGU6IGl0YWxpYztcXG4gIGxldHRlci1zcGFjaW5nOiAwLjAxMjVlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLUhlYWRpbmc2IHN0cm9uZyxcXG4uc3BlY3RydW0tQXJ0aWNsZSAuc3BlY3RydW0tSGVhZGluZy0tc3VidGl0bGUyIHN0cm9uZyB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDE3cHg7XFxuICBmb250LXdlaWdodDogOTAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuMztcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjAxMjVlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLVN1YmhlYWRpbmcsXFxuLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLUhlYWRpbmctLXN1YnRpdGxlMyB7XFxuICAgICAgICAgIGZvbnQtc2l6ZTogMTNweDtcXG4gIGZvbnQtd2VpZ2h0OiA3MDA7XFxuICBsaW5lLWhlaWdodDogMS4zO1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDZlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XFxuXFxuICAgICAgICAgIG1hcmdpbi1ib3R0b206IDEwcHg7XFxuICAgICAgICAgIG1hcmdpbi10b3A6IDEwcHg7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLVN1YmhlYWRpbmcgZW0sXFxuLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLUhlYWRpbmctLXN1YnRpdGxlMyBlbSB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDEzcHg7XFxuICBmb250LXdlaWdodDogNzAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuMztcXG4gIGZvbnQtc3R5bGU6IGl0YWxpYztcXG4gIGxldHRlci1zcGFjaW5nOiAwLjA2ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLVN1YmhlYWRpbmcgc3Ryb25nLFxcbi5zcGVjdHJ1bS1BcnRpY2xlIC5zcGVjdHJ1bS1IZWFkaW5nLS1zdWJ0aXRsZTMgc3Ryb25nIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogMTNweDtcXG4gIGZvbnQtd2VpZ2h0OiA5MDA7XFxuICBsaW5lLWhlaWdodDogMS4zO1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDZlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW0tQXJ0aWNsZSAuc3BlY3RydW0tRGV0YWlsIHtcXG4gICAgICAgICAgZm9udC1zaXplOiAxM3B4O1xcbiAgZm9udC13ZWlnaHQ6IDQwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjU7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wNmVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcXG5cXG4gICAgICAgICAgbWFyZ2luLWJvdHRvbTogMjBweDtcXG4gICAgICAgICAgbWFyZ2luLXRvcDogMTBweDtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tQXJ0aWNsZSAuc3BlY3RydW0tRGV0YWlsIGVtIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogMTNweDtcXG4gIGZvbnQtd2VpZ2h0OiA0MDA7XFxuICBsaW5lLWhlaWdodDogMS41O1xcbiAgZm9udC1zdHlsZTogaXRhbGljO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDZlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW0tQXJ0aWNsZSAuc3BlY3RydW0tRGV0YWlsIHN0cm9uZyB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDEzcHg7XFxuICBmb250LXdlaWdodDogNzAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjA2ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLUhlYWRpbmcxLS1xdWlldCB7XFxuICAgICAgICAgIGZvbnQtc2l6ZTogMzlweDtcXG4gIGZvbnQtd2VpZ2h0OiA0MDA7XFxuICBsaW5lLWhlaWdodDogMS4zO1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDEyNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIG1hcmdpbi1ib3R0b206IDEwcHg7XFxuICAgICAgICAgIG1hcmdpbi10b3A6IDEwcHg7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLUhlYWRpbmcxLS1xdWlldCBlbSB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDM5cHg7XFxuICBmb250LXdlaWdodDogNDAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuMztcXG4gIGZvbnQtc3R5bGU6IGl0YWxpYztcXG4gIGxldHRlci1zcGFjaW5nOiAwLjAxMjVlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLUhlYWRpbmcxLS1xdWlldCBzdHJvbmcge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiAzOXB4O1xcbiAgZm9udC13ZWlnaHQ6IDkwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjM7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wMTI1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bS1BcnRpY2xlIC5zcGVjdHJ1bS1IZWFkaW5nMi0tcXVpZXQsXFxuLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLUhlYWRpbmctLXBhZ2VUaXRsZSB7XFxuICAgICAgICAgIGZvbnQtc2l6ZTogMzFweDtcXG4gIGZvbnQtd2VpZ2h0OiA0MDA7XFxuICBsaW5lLWhlaWdodDogMS4zO1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDEyNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIG1hcmdpbi1ib3R0b206IDEwcHg7XFxuICAgICAgICAgIG1hcmdpbi10b3A6IDEwcHg7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLUhlYWRpbmcyLS1xdWlldCBlbSxcXG4uc3BlY3RydW0tQXJ0aWNsZSAuc3BlY3RydW0tSGVhZGluZy0tcGFnZVRpdGxlIGVtIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogMzFweDtcXG4gIGZvbnQtd2VpZ2h0OiA0MDA7XFxuICBsaW5lLWhlaWdodDogMS4zO1xcbiAgZm9udC1zdHlsZTogaXRhbGljO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDEyNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW0tQXJ0aWNsZSAuc3BlY3RydW0tSGVhZGluZzItLXF1aWV0IHN0cm9uZyxcXG4uc3BlY3RydW0tQXJ0aWNsZSAuc3BlY3RydW0tSGVhZGluZy0tcGFnZVRpdGxlIHN0cm9uZyB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDMxcHg7XFxuICBmb250LXdlaWdodDogOTAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuMztcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjAxMjVlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLUhlYWRpbmcxLS1kaXNwbGF5IHtcXG4gICAgICAgICAgZm9udC1zaXplOiA0OXB4O1xcbiAgZm9udC13ZWlnaHQ6IDcwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjM7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wMTI1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgbWFyZ2luLWJvdHRvbTogMTBweDtcXG4gICAgICAgICAgbWFyZ2luLXRvcDogMTBweDtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tQXJ0aWNsZSAuc3BlY3RydW0tSGVhZGluZzEtLWRpc3BsYXkgZW0ge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiA0OXB4O1xcbiAgZm9udC13ZWlnaHQ6IDcwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjM7XFxuICBmb250LXN0eWxlOiBpdGFsaWM7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wMTI1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bS1BcnRpY2xlIC5zcGVjdHJ1bS1IZWFkaW5nMS0tZGlzcGxheSBzdHJvbmcge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiA0OXB4O1xcbiAgZm9udC13ZWlnaHQ6IDkwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjM7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wMTI1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bS1BcnRpY2xlIC5zcGVjdHJ1bS1IZWFkaW5nMi0tZGlzcGxheSB7XFxuICAgICAgICAgIGZvbnQtc2l6ZTogNDRweDtcXG4gIGZvbnQtd2VpZ2h0OiA3MDA7XFxuICBsaW5lLWhlaWdodDogMS4zO1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDEyNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIG1hcmdpbi1ib3R0b206IDEwcHg7XFxuICAgICAgICAgIG1hcmdpbi10b3A6IDEwcHg7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLUhlYWRpbmcyLS1kaXNwbGF5IGVtIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogNDRweDtcXG4gIGZvbnQtd2VpZ2h0OiA3MDA7XFxuICBsaW5lLWhlaWdodDogMS4zO1xcbiAgZm9udC1zdHlsZTogaXRhbGljO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDEyNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW0tQXJ0aWNsZSAuc3BlY3RydW0tSGVhZGluZzItLWRpc3BsYXkgc3Ryb25nIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogNDRweDtcXG4gIGZvbnQtd2VpZ2h0OiA5MDA7XFxuICBsaW5lLWhlaWdodDogMS4zO1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDEyNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW0tQXJ0aWNsZSAuc3BlY3RydW0tSGVhZGluZzEtLWRpc3BsYXkuc3BlY3RydW0tSGVhZGluZzEtLXF1aWV0IHtcXG4gICAgICAgICAgZm9udC1zaXplOiA0OXB4O1xcbiAgZm9udC13ZWlnaHQ6IDQwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjM7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wMTI1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgbWFyZ2luLWJvdHRvbTogMTBweDtcXG4gICAgICAgICAgbWFyZ2luLXRvcDogMTBweDtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tQXJ0aWNsZSAuc3BlY3RydW0tSGVhZGluZzEtLWRpc3BsYXkuc3BlY3RydW0tSGVhZGluZzEtLXF1aWV0IGVtIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogNDlweDtcXG4gIGZvbnQtd2VpZ2h0OiA0MDA7XFxuICBsaW5lLWhlaWdodDogMS4zO1xcbiAgZm9udC1zdHlsZTogaXRhbGljO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDEyNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW0tQXJ0aWNsZSAuc3BlY3RydW0tSGVhZGluZzEtLWRpc3BsYXkuc3BlY3RydW0tSGVhZGluZzEtLXF1aWV0IHN0cm9uZyB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDQ5cHg7XFxuICBmb250LXdlaWdodDogNzAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuMztcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjAxMjVlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLUhlYWRpbmcyLS1kaXNwbGF5LnNwZWN0cnVtLUhlYWRpbmcyLS1xdWlldCxcXG4uc3BlY3RydW0tQXJ0aWNsZSAuc3BlY3RydW0tSGVhZGluZy0tZGlzcGxheSB7XFxuICAgICAgICAgIGZvbnQtc2l6ZTogNDRweDtcXG4gIGZvbnQtd2VpZ2h0OiA0MDA7XFxuICBsaW5lLWhlaWdodDogMS4zO1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDEyNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIG1hcmdpbi1ib3R0b206IDEwcHg7XFxuICAgICAgICAgIG1hcmdpbi10b3A6IDEwcHg7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLUhlYWRpbmcyLS1kaXNwbGF5LnNwZWN0cnVtLUhlYWRpbmcyLS1xdWlldCBlbSxcXG4uc3BlY3RydW0tQXJ0aWNsZSAuc3BlY3RydW0tSGVhZGluZy0tZGlzcGxheSBlbSB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDQ0cHg7XFxuICBmb250LXdlaWdodDogNDAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuMztcXG4gIGZvbnQtc3R5bGU6IGl0YWxpYztcXG4gIGxldHRlci1zcGFjaW5nOiAwLjAxMjVlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLUhlYWRpbmcyLS1kaXNwbGF5LnNwZWN0cnVtLUhlYWRpbmcyLS1xdWlldCBzdHJvbmcsXFxuLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLUhlYWRpbmctLWRpc3BsYXkgc3Ryb25nIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogNDRweDtcXG4gIGZvbnQtd2VpZ2h0OiA3MDA7XFxuICBsaW5lLWhlaWdodDogMS4zO1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDEyNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW06bGFuZyhqYSkgLnNwZWN0cnVtLUJvZHkxLCAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUJvZHkxLCAuc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLUJvZHkxIHtcXG4gICAgICAgICAgZm9udC1zaXplOiAyNHB4O1xcbiAgZm9udC13ZWlnaHQ6IDQwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjc7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIG1hcmdpbi1ib3R0b206IDIwcHg7XFxuICAgICAgICAgIG1hcmdpbi10b3A6IDEwcHg7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1Cb2R5MSBlbSwgLnNwZWN0cnVtOmxhbmcoa28pIC5zcGVjdHJ1bS1Cb2R5MSBlbSwgLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1Cb2R5MSBlbSB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDI0cHg7XFxuICBmb250LXdlaWdodDogNzAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNztcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjA1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tQm9keTEgc3Ryb25nLCAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUJvZHkxIHN0cm9uZywgLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1Cb2R5MSBzdHJvbmcge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiAyNHB4O1xcbiAgZm9udC13ZWlnaHQ6IDkwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjc7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW06bGFuZyhqYSkgLnNwZWN0cnVtLUJvZHkyLFxcbi5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tQm9keTIsXFxuLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1Cb2R5MixcXG4uc3BlY3RydW06bGFuZyhqYSkgLnNwZWN0cnVtLUJvZHktLWxhcmdlLFxcbi5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tQm9keS0tbGFyZ2UsXFxuLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1Cb2R5LS1sYXJnZSB7XFxuICAgICAgICAgIGZvbnQtc2l6ZTogMjJweDtcXG4gIGZvbnQtd2VpZ2h0OiA0MDA7XFxuICBsaW5lLWhlaWdodDogMS43O1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDVlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICBtYXJnaW4tYm90dG9tOiAyMHB4O1xcbiAgICAgICAgICBtYXJnaW4tdG9wOiAxMHB4O1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tQm9keTIgZW0sXFxuLnNwZWN0cnVtOmxhbmcoa28pIC5zcGVjdHJ1bS1Cb2R5MiBlbSxcXG4uc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLUJvZHkyIGVtLFxcbi5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tQm9keS0tbGFyZ2UgZW0sXFxuLnNwZWN0cnVtOmxhbmcoa28pIC5zcGVjdHJ1bS1Cb2R5LS1sYXJnZSBlbSxcXG4uc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLUJvZHktLWxhcmdlIGVtIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogMjJweDtcXG4gIGZvbnQtd2VpZ2h0OiA3MDA7XFxuICBsaW5lLWhlaWdodDogMS43O1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDVlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1Cb2R5MiBzdHJvbmcsXFxuLnNwZWN0cnVtOmxhbmcoa28pIC5zcGVjdHJ1bS1Cb2R5MiBzdHJvbmcsXFxuLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1Cb2R5MiBzdHJvbmcsXFxuLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1Cb2R5LS1sYXJnZSBzdHJvbmcsXFxuLnNwZWN0cnVtOmxhbmcoa28pIC5zcGVjdHJ1bS1Cb2R5LS1sYXJnZSBzdHJvbmcsXFxuLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1Cb2R5LS1sYXJnZSBzdHJvbmcge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiAyMnB4O1xcbiAgZm9udC13ZWlnaHQ6IDkwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjc7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW06bGFuZyhqYSkgLnNwZWN0cnVtLUJvZHkzLCAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUJvZHkzLCAuc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLUJvZHkzIHtcXG4gICAgICAgICAgZm9udC1zaXplOiAxOXB4O1xcbiAgZm9udC13ZWlnaHQ6IDQwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjc7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIG1hcmdpbi1ib3R0b206IDIwcHg7XFxuICAgICAgICAgIG1hcmdpbi10b3A6IDEwcHg7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1Cb2R5MyBlbSwgLnNwZWN0cnVtOmxhbmcoa28pIC5zcGVjdHJ1bS1Cb2R5MyBlbSwgLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1Cb2R5MyBlbSB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDE5cHg7XFxuICBmb250LXdlaWdodDogNzAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNztcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjA1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tQm9keTMgc3Ryb25nLCAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUJvZHkzIHN0cm9uZywgLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1Cb2R5MyBzdHJvbmcge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiAxOXB4O1xcbiAgZm9udC13ZWlnaHQ6IDkwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjc7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW06bGFuZyhqYSkgLnNwZWN0cnVtLUJvZHk0LFxcbi5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tQm9keTQsXFxuLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1Cb2R5NCxcXG4uc3BlY3RydW06bGFuZyhqYSkgLnNwZWN0cnVtLUJvZHktLXNlY29uZGFyeSxcXG4uc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUJvZHktLXNlY29uZGFyeSxcXG4uc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLUJvZHktLXNlY29uZGFyeSB7XFxuICAgICAgICAgIGZvbnQtc2l6ZTogMTdweDtcXG4gIGZvbnQtd2VpZ2h0OiA0MDA7XFxuICBsaW5lLWhlaWdodDogMS43O1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDVlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICBtYXJnaW4tYm90dG9tOiAyMHB4O1xcbiAgICAgICAgICBtYXJnaW4tdG9wOiAxMHB4O1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tQm9keTQgZW0sXFxuLnNwZWN0cnVtOmxhbmcoa28pIC5zcGVjdHJ1bS1Cb2R5NCBlbSxcXG4uc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLUJvZHk0IGVtLFxcbi5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tQm9keS0tc2Vjb25kYXJ5IGVtLFxcbi5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tQm9keS0tc2Vjb25kYXJ5IGVtLFxcbi5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tQm9keS0tc2Vjb25kYXJ5IGVtIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogMTdweDtcXG4gIGZvbnQtd2VpZ2h0OiA3MDA7XFxuICBsaW5lLWhlaWdodDogMS43O1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDVlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1Cb2R5NCBzdHJvbmcsXFxuLnNwZWN0cnVtOmxhbmcoa28pIC5zcGVjdHJ1bS1Cb2R5NCBzdHJvbmcsXFxuLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1Cb2R5NCBzdHJvbmcsXFxuLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1Cb2R5LS1zZWNvbmRhcnkgc3Ryb25nLFxcbi5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tQm9keS0tc2Vjb25kYXJ5IHN0cm9uZyxcXG4uc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLUJvZHktLXNlY29uZGFyeSBzdHJvbmcge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiAxN3B4O1xcbiAgZm9udC13ZWlnaHQ6IDkwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjc7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW06bGFuZyhqYSkgLnNwZWN0cnVtLUJvZHk1LFxcbi5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tQm9keTUsXFxuLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1Cb2R5NSxcXG4uc3BlY3RydW06bGFuZyhqYSkgLnNwZWN0cnVtLUJvZHktLXNtYWxsLFxcbi5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tQm9keS0tc21hbGwsXFxuLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1Cb2R5LS1zbWFsbCB7XFxuICAgICAgICAgIGZvbnQtc2l6ZTogMTVweDtcXG4gIGZvbnQtd2VpZ2h0OiA0MDA7XFxuICBsaW5lLWhlaWdodDogMS43O1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDVlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICBtYXJnaW4tYm90dG9tOiAyMHB4O1xcbiAgICAgICAgICBtYXJnaW4tdG9wOiAxMHB4O1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tQm9keTUgZW0sXFxuLnNwZWN0cnVtOmxhbmcoa28pIC5zcGVjdHJ1bS1Cb2R5NSBlbSxcXG4uc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLUJvZHk1IGVtLFxcbi5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tQm9keS0tc21hbGwgZW0sXFxuLnNwZWN0cnVtOmxhbmcoa28pIC5zcGVjdHJ1bS1Cb2R5LS1zbWFsbCBlbSxcXG4uc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLUJvZHktLXNtYWxsIGVtIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogMTVweDtcXG4gIGZvbnQtd2VpZ2h0OiA3MDA7XFxuICBsaW5lLWhlaWdodDogMS43O1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDVlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1Cb2R5NSBzdHJvbmcsXFxuLnNwZWN0cnVtOmxhbmcoa28pIC5zcGVjdHJ1bS1Cb2R5NSBzdHJvbmcsXFxuLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1Cb2R5NSBzdHJvbmcsXFxuLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1Cb2R5LS1zbWFsbCBzdHJvbmcsXFxuLnNwZWN0cnVtOmxhbmcoa28pIC5zcGVjdHJ1bS1Cb2R5LS1zbWFsbCBzdHJvbmcsXFxuLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1Cb2R5LS1zbWFsbCBzdHJvbmcge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiAxNXB4O1xcbiAgZm9udC13ZWlnaHQ6IDkwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjc7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW06bGFuZyhqYSkgLnNwZWN0cnVtLUhlYWRpbmcxLCAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUhlYWRpbmcxLCAuc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLUhlYWRpbmcxIHtcXG4gICAgICAgICAgZm9udC1zaXplOiAzOXB4O1xcbiAgZm9udC13ZWlnaHQ6IDcwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjU7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIG1hcmdpbi1ib3R0b206IDEwcHg7XFxuICAgICAgICAgIG1hcmdpbi10b3A6IDEwcHg7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1IZWFkaW5nMSBlbSwgLnNwZWN0cnVtOmxhbmcoa28pIC5zcGVjdHJ1bS1IZWFkaW5nMSBlbSwgLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1IZWFkaW5nMSBlbSB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDM5cHg7XFxuICBmb250LXdlaWdodDogODAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjA1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tSGVhZGluZzEgc3Ryb25nLCAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUhlYWRpbmcxIHN0cm9uZywgLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1IZWFkaW5nMSBzdHJvbmcge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiAzOXB4O1xcbiAgZm9udC13ZWlnaHQ6IDkwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjU7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW06bGFuZyhqYSkgLnNwZWN0cnVtLUhlYWRpbmcyLCAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUhlYWRpbmcyLCAuc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLUhlYWRpbmcyIHtcXG4gICAgICAgICAgZm9udC1zaXplOiAzMXB4O1xcbiAgZm9udC13ZWlnaHQ6IDcwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjU7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIG1hcmdpbi1ib3R0b206IDEwcHg7XFxuICAgICAgICAgIG1hcmdpbi10b3A6IDEwcHg7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1IZWFkaW5nMiBlbSwgLnNwZWN0cnVtOmxhbmcoa28pIC5zcGVjdHJ1bS1IZWFkaW5nMiBlbSwgLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1IZWFkaW5nMiBlbSB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDMxcHg7XFxuICBmb250LXdlaWdodDogODAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjA1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tSGVhZGluZzIgc3Ryb25nLCAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUhlYWRpbmcyIHN0cm9uZywgLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1IZWFkaW5nMiBzdHJvbmcge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiAzMXB4O1xcbiAgZm9udC13ZWlnaHQ6IDkwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjU7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW06bGFuZyhqYSkgLnNwZWN0cnVtLUhlYWRpbmczLCAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUhlYWRpbmczLCAuc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLUhlYWRpbmczIHtcXG4gICAgICAgICAgZm9udC1zaXplOiAyNHB4O1xcbiAgZm9udC13ZWlnaHQ6IDcwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjU7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIG1hcmdpbi1ib3R0b206IDEwcHg7XFxuICAgICAgICAgIG1hcmdpbi10b3A6IDEwcHg7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1IZWFkaW5nMyBlbSwgLnNwZWN0cnVtOmxhbmcoa28pIC5zcGVjdHJ1bS1IZWFkaW5nMyBlbSwgLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1IZWFkaW5nMyBlbSB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDI0cHg7XFxuICBmb250LXdlaWdodDogODAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjA1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tSGVhZGluZzMgc3Ryb25nLCAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUhlYWRpbmczIHN0cm9uZywgLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1IZWFkaW5nMyBzdHJvbmcge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiAyNHB4O1xcbiAgZm9udC13ZWlnaHQ6IDkwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjU7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW06bGFuZyhqYSkgLnNwZWN0cnVtLUhlYWRpbmc0LFxcbi5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tSGVhZGluZzQsXFxuLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1IZWFkaW5nNCxcXG4uc3BlY3RydW06bGFuZyhqYSkgLnNwZWN0cnVtLUhlYWRpbmctLXN1YnRpdGxlMSxcXG4uc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUhlYWRpbmctLXN1YnRpdGxlMSxcXG4uc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLUhlYWRpbmctLXN1YnRpdGxlMSB7XFxuICAgICAgICAgIGZvbnQtc2l6ZTogMjJweDtcXG4gIGZvbnQtd2VpZ2h0OiA3MDA7XFxuICBsaW5lLWhlaWdodDogMS41O1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDVlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICBtYXJnaW4tYm90dG9tOiAxMHB4O1xcbiAgICAgICAgICBtYXJnaW4tdG9wOiAxMHB4O1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tSGVhZGluZzQgZW0sXFxuLnNwZWN0cnVtOmxhbmcoa28pIC5zcGVjdHJ1bS1IZWFkaW5nNCBlbSxcXG4uc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLUhlYWRpbmc0IGVtLFxcbi5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tSGVhZGluZy0tc3VidGl0bGUxIGVtLFxcbi5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tSGVhZGluZy0tc3VidGl0bGUxIGVtLFxcbi5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tSGVhZGluZy0tc3VidGl0bGUxIGVtIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogMjJweDtcXG4gIGZvbnQtd2VpZ2h0OiA4MDA7XFxuICBsaW5lLWhlaWdodDogMS41O1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDVlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1IZWFkaW5nNCBzdHJvbmcsXFxuLnNwZWN0cnVtOmxhbmcoa28pIC5zcGVjdHJ1bS1IZWFkaW5nNCBzdHJvbmcsXFxuLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1IZWFkaW5nNCBzdHJvbmcsXFxuLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1IZWFkaW5nLS1zdWJ0aXRsZTEgc3Ryb25nLFxcbi5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tSGVhZGluZy0tc3VidGl0bGUxIHN0cm9uZyxcXG4uc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLUhlYWRpbmctLXN1YnRpdGxlMSBzdHJvbmcge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiAyMnB4O1xcbiAgZm9udC13ZWlnaHQ6IDkwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjU7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW06bGFuZyhqYSkgLnNwZWN0cnVtLUhlYWRpbmc1LCAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUhlYWRpbmc1LCAuc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLUhlYWRpbmc1IHtcXG4gICAgICAgICAgZm9udC1zaXplOiAxOXB4O1xcbiAgZm9udC13ZWlnaHQ6IDcwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjU7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIG1hcmdpbi1ib3R0b206IDEwcHg7XFxuICAgICAgICAgIG1hcmdpbi10b3A6IDEwcHg7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1IZWFkaW5nNSBlbSwgLnNwZWN0cnVtOmxhbmcoa28pIC5zcGVjdHJ1bS1IZWFkaW5nNSBlbSwgLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1IZWFkaW5nNSBlbSB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDE5cHg7XFxuICBmb250LXdlaWdodDogODAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjA1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tSGVhZGluZzUgc3Ryb25nLCAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUhlYWRpbmc1IHN0cm9uZywgLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1IZWFkaW5nNSBzdHJvbmcge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiAxOXB4O1xcbiAgZm9udC13ZWlnaHQ6IDkwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjU7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW06bGFuZyhqYSkgLnNwZWN0cnVtLUhlYWRpbmc2LFxcbi5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tSGVhZGluZzYsXFxuLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1IZWFkaW5nNixcXG4uc3BlY3RydW06bGFuZyhqYSkgLnNwZWN0cnVtLUhlYWRpbmctLXN1YnRpdGxlMixcXG4uc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUhlYWRpbmctLXN1YnRpdGxlMixcXG4uc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLUhlYWRpbmctLXN1YnRpdGxlMiB7XFxuICAgICAgICAgIGZvbnQtc2l6ZTogMTdweDtcXG4gIGZvbnQtd2VpZ2h0OiA3MDA7XFxuICBsaW5lLWhlaWdodDogMS41O1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDVlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICBtYXJnaW4tYm90dG9tOiAxMHB4O1xcbiAgICAgICAgICBtYXJnaW4tdG9wOiAxMHB4O1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tSGVhZGluZzYgZW0sXFxuLnNwZWN0cnVtOmxhbmcoa28pIC5zcGVjdHJ1bS1IZWFkaW5nNiBlbSxcXG4uc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLUhlYWRpbmc2IGVtLFxcbi5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tSGVhZGluZy0tc3VidGl0bGUyIGVtLFxcbi5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tSGVhZGluZy0tc3VidGl0bGUyIGVtLFxcbi5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tSGVhZGluZy0tc3VidGl0bGUyIGVtIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogMTdweDtcXG4gIGZvbnQtd2VpZ2h0OiA4MDA7XFxuICBsaW5lLWhlaWdodDogMS41O1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDVlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1IZWFkaW5nNiBzdHJvbmcsXFxuLnNwZWN0cnVtOmxhbmcoa28pIC5zcGVjdHJ1bS1IZWFkaW5nNiBzdHJvbmcsXFxuLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1IZWFkaW5nNiBzdHJvbmcsXFxuLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1IZWFkaW5nLS1zdWJ0aXRsZTIgc3Ryb25nLFxcbi5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tSGVhZGluZy0tc3VidGl0bGUyIHN0cm9uZyxcXG4uc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLUhlYWRpbmctLXN1YnRpdGxlMiBzdHJvbmcge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiAxN3B4O1xcbiAgZm9udC13ZWlnaHQ6IDkwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjU7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW06bGFuZyhqYSkgLnNwZWN0cnVtLVN1YmhlYWRpbmcsXFxuLnNwZWN0cnVtOmxhbmcoa28pIC5zcGVjdHJ1bS1TdWJoZWFkaW5nLFxcbi5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tU3ViaGVhZGluZyxcXG4uc3BlY3RydW06bGFuZyhqYSkgLnNwZWN0cnVtLUhlYWRpbmctLXN1YnRpdGxlMyxcXG4uc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUhlYWRpbmctLXN1YnRpdGxlMyxcXG4uc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLUhlYWRpbmctLXN1YnRpdGxlMyB7XFxuICAgICAgICAgIGZvbnQtc2l6ZTogMTNweDtcXG4gIGZvbnQtd2VpZ2h0OiA3MDA7XFxuICBsaW5lLWhlaWdodDogMS4zO1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDZlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XFxuXFxuICAgICAgICAgIG1hcmdpbi1ib3R0b206IDEwcHg7XFxuICAgICAgICAgIG1hcmdpbi10b3A6IDEwcHg7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1TdWJoZWFkaW5nIGVtLFxcbi5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tU3ViaGVhZGluZyBlbSxcXG4uc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLVN1YmhlYWRpbmcgZW0sXFxuLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1IZWFkaW5nLS1zdWJ0aXRsZTMgZW0sXFxuLnNwZWN0cnVtOmxhbmcoa28pIC5zcGVjdHJ1bS1IZWFkaW5nLS1zdWJ0aXRsZTMgZW0sXFxuLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1IZWFkaW5nLS1zdWJ0aXRsZTMgZW0ge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiAxM3B4O1xcbiAgZm9udC13ZWlnaHQ6IDgwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjM7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wNmVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tU3ViaGVhZGluZyBzdHJvbmcsXFxuLnNwZWN0cnVtOmxhbmcoa28pIC5zcGVjdHJ1bS1TdWJoZWFkaW5nIHN0cm9uZyxcXG4uc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLVN1YmhlYWRpbmcgc3Ryb25nLFxcbi5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tSGVhZGluZy0tc3VidGl0bGUzIHN0cm9uZyxcXG4uc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUhlYWRpbmctLXN1YnRpdGxlMyBzdHJvbmcsXFxuLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1IZWFkaW5nLS1zdWJ0aXRsZTMgc3Ryb25nIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogMTNweDtcXG4gIGZvbnQtd2VpZ2h0OiA5MDA7XFxuICBsaW5lLWhlaWdodDogMS4zO1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDZlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW06bGFuZyhqYSkgLnNwZWN0cnVtLURldGFpbCwgLnNwZWN0cnVtOmxhbmcoa28pIC5zcGVjdHJ1bS1EZXRhaWwsIC5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tRGV0YWlsIHtcXG4gICAgICAgICAgZm9udC1zaXplOiAxM3B4O1xcbiAgZm9udC13ZWlnaHQ6IDQwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjc7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wNmVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcXG5cXG4gICAgICAgICAgbWFyZ2luLWJvdHRvbTogMjBweDtcXG4gICAgICAgICAgbWFyZ2luLXRvcDogMTBweDtcXG4gICAgICAgIH1cXG4uc3BlY3RydW06bGFuZyhqYSkgLnNwZWN0cnVtLURldGFpbCBlbSwgLnNwZWN0cnVtOmxhbmcoa28pIC5zcGVjdHJ1bS1EZXRhaWwgZW0sIC5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tRGV0YWlsIGVtIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogMTNweDtcXG4gIGZvbnQtd2VpZ2h0OiA0MDA7XFxuICBsaW5lLWhlaWdodDogMS43O1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDZlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW06bGFuZyhqYSkgLnNwZWN0cnVtLURldGFpbCBzdHJvbmcsIC5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tRGV0YWlsIHN0cm9uZywgLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1EZXRhaWwgc3Ryb25nIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogMTNweDtcXG4gIGZvbnQtd2VpZ2h0OiA5MDA7XFxuICBsaW5lLWhlaWdodDogMS43O1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDZlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW06bGFuZyhqYSkgLnNwZWN0cnVtLUhlYWRpbmcxLS1xdWlldCwgLnNwZWN0cnVtOmxhbmcoa28pIC5zcGVjdHJ1bS1IZWFkaW5nMS0tcXVpZXQsIC5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tSGVhZGluZzEtLXF1aWV0IHtcXG4gICAgICAgICAgZm9udC1zaXplOiAzOXB4O1xcbiAgZm9udC13ZWlnaHQ6IDMwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjU7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIG1hcmdpbi1ib3R0b206IDEwcHg7XFxuICAgICAgICAgIG1hcmdpbi10b3A6IDEwcHg7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1IZWFkaW5nMS0tcXVpZXQgZW0sIC5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tSGVhZGluZzEtLXF1aWV0IGVtLCAuc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLUhlYWRpbmcxLS1xdWlldCBlbSB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDM5cHg7XFxuICBmb250LXdlaWdodDogNDAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjA1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tSGVhZGluZzEtLXF1aWV0IHN0cm9uZywgLnNwZWN0cnVtOmxhbmcoa28pIC5zcGVjdHJ1bS1IZWFkaW5nMS0tcXVpZXQgc3Ryb25nLCAuc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLUhlYWRpbmcxLS1xdWlldCBzdHJvbmcge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiAzOXB4O1xcbiAgZm9udC13ZWlnaHQ6IDcwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjU7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW06bGFuZyhqYSkgLnNwZWN0cnVtLUhlYWRpbmcyLS1xdWlldCxcXG4uc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUhlYWRpbmcyLS1xdWlldCxcXG4uc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLUhlYWRpbmcyLS1xdWlldCxcXG4uc3BlY3RydW06bGFuZyhqYSkgLnNwZWN0cnVtLUhlYWRpbmctLXBhZ2VUaXRsZSxcXG4uc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUhlYWRpbmctLXBhZ2VUaXRsZSxcXG4uc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLUhlYWRpbmctLXBhZ2VUaXRsZSB7XFxuICAgICAgICAgIGZvbnQtc2l6ZTogMzFweDtcXG4gIGZvbnQtd2VpZ2h0OiAzMDA7XFxuICBsaW5lLWhlaWdodDogMS41O1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDVlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICBtYXJnaW4tYm90dG9tOiAxMHB4O1xcbiAgICAgICAgICBtYXJnaW4tdG9wOiAxMHB4O1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tSGVhZGluZzItLXF1aWV0IGVtLFxcbi5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tSGVhZGluZzItLXF1aWV0IGVtLFxcbi5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tSGVhZGluZzItLXF1aWV0IGVtLFxcbi5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tSGVhZGluZy0tcGFnZVRpdGxlIGVtLFxcbi5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tSGVhZGluZy0tcGFnZVRpdGxlIGVtLFxcbi5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tSGVhZGluZy0tcGFnZVRpdGxlIGVtIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogMzFweDtcXG4gIGZvbnQtd2VpZ2h0OiA0MDA7XFxuICBsaW5lLWhlaWdodDogMS41O1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDVlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1IZWFkaW5nMi0tcXVpZXQgc3Ryb25nLFxcbi5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tSGVhZGluZzItLXF1aWV0IHN0cm9uZyxcXG4uc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLUhlYWRpbmcyLS1xdWlldCBzdHJvbmcsXFxuLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1IZWFkaW5nLS1wYWdlVGl0bGUgc3Ryb25nLFxcbi5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tSGVhZGluZy0tcGFnZVRpdGxlIHN0cm9uZyxcXG4uc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLUhlYWRpbmctLXBhZ2VUaXRsZSBzdHJvbmcge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiAzMXB4O1xcbiAgZm9udC13ZWlnaHQ6IDcwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjU7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW06bGFuZyhqYSkgLnNwZWN0cnVtLUhlYWRpbmcxLS1zdHJvbmcsIC5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tSGVhZGluZzEtLXN0cm9uZywgLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1IZWFkaW5nMS0tc3Ryb25nIHtcXG4gICAgICAgICAgZm9udC1zaXplOiAzOXB4O1xcbiAgZm9udC13ZWlnaHQ6IDkwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjU7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIG1hcmdpbi1ib3R0b206IDEwcHg7XFxuICAgICAgICAgIG1hcmdpbi10b3A6IDEwcHg7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1IZWFkaW5nMS0tc3Ryb25nIGVtLCAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUhlYWRpbmcxLS1zdHJvbmcgZW0sIC5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tSGVhZGluZzEtLXN0cm9uZyBlbSB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDM5cHg7XFxuICBmb250LXdlaWdodDogOTAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjA1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tSGVhZGluZzEtLXN0cm9uZyBzdHJvbmcsIC5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tSGVhZGluZzEtLXN0cm9uZyBzdHJvbmcsIC5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tSGVhZGluZzEtLXN0cm9uZyBzdHJvbmcge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiAzOXB4O1xcbiAgZm9udC13ZWlnaHQ6IDkwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjU7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW06bGFuZyhqYSkgLnNwZWN0cnVtLUhlYWRpbmcyLS1zdHJvbmcsIC5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tSGVhZGluZzItLXN0cm9uZywgLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1IZWFkaW5nMi0tc3Ryb25nIHtcXG4gICAgICAgICAgZm9udC1zaXplOiAzMXB4O1xcbiAgZm9udC13ZWlnaHQ6IDkwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjU7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIG1hcmdpbi1ib3R0b206IDEwcHg7XFxuICAgICAgICAgIG1hcmdpbi10b3A6IDEwcHg7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1IZWFkaW5nMi0tc3Ryb25nIGVtLCAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUhlYWRpbmcyLS1zdHJvbmcgZW0sIC5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tSGVhZGluZzItLXN0cm9uZyBlbSB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDMxcHg7XFxuICBmb250LXdlaWdodDogOTAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjA1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tSGVhZGluZzItLXN0cm9uZyBzdHJvbmcsIC5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tSGVhZGluZzItLXN0cm9uZyBzdHJvbmcsIC5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tSGVhZGluZzItLXN0cm9uZyBzdHJvbmcge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiAzMXB4O1xcbiAgZm9udC13ZWlnaHQ6IDkwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjU7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW06bGFuZyhqYSkgLnNwZWN0cnVtLUhlYWRpbmcxLS1kaXNwbGF5LCAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUhlYWRpbmcxLS1kaXNwbGF5LCAuc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLUhlYWRpbmcxLS1kaXNwbGF5IHtcXG4gICAgICAgICAgZm9udC1zaXplOiA0OXB4O1xcbiAgZm9udC13ZWlnaHQ6IDcwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjU7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIG1hcmdpbi1ib3R0b206IDEwcHg7XFxuICAgICAgICAgIG1hcmdpbi10b3A6IDEwcHg7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1IZWFkaW5nMS0tZGlzcGxheSBlbSwgLnNwZWN0cnVtOmxhbmcoa28pIC5zcGVjdHJ1bS1IZWFkaW5nMS0tZGlzcGxheSBlbSwgLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1IZWFkaW5nMS0tZGlzcGxheSBlbSB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDQ5cHg7XFxuICBmb250LXdlaWdodDogODAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjA1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tSGVhZGluZzEtLWRpc3BsYXkgc3Ryb25nLCAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUhlYWRpbmcxLS1kaXNwbGF5IHN0cm9uZywgLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1IZWFkaW5nMS0tZGlzcGxheSBzdHJvbmcge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiA0OXB4O1xcbiAgZm9udC13ZWlnaHQ6IDkwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjU7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW06bGFuZyhqYSkgLnNwZWN0cnVtLUhlYWRpbmcyLS1kaXNwbGF5LCAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUhlYWRpbmcyLS1kaXNwbGF5LCAuc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLUhlYWRpbmcyLS1kaXNwbGF5IHtcXG4gICAgICAgICAgZm9udC1zaXplOiA0NHB4O1xcbiAgZm9udC13ZWlnaHQ6IDcwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjU7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIG1hcmdpbi1ib3R0b206IDEwcHg7XFxuICAgICAgICAgIG1hcmdpbi10b3A6IDEwcHg7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1IZWFkaW5nMi0tZGlzcGxheSBlbSwgLnNwZWN0cnVtOmxhbmcoa28pIC5zcGVjdHJ1bS1IZWFkaW5nMi0tZGlzcGxheSBlbSwgLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1IZWFkaW5nMi0tZGlzcGxheSBlbSB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDQ0cHg7XFxuICBmb250LXdlaWdodDogODAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjA1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tSGVhZGluZzItLWRpc3BsYXkgc3Ryb25nLCAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUhlYWRpbmcyLS1kaXNwbGF5IHN0cm9uZywgLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1IZWFkaW5nMi0tZGlzcGxheSBzdHJvbmcge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiA0NHB4O1xcbiAgZm9udC13ZWlnaHQ6IDkwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjU7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW06bGFuZyhqYSkgLnNwZWN0cnVtLUhlYWRpbmcxLS1kaXNwbGF5LnNwZWN0cnVtLUhlYWRpbmcxLS1zdHJvbmcsIC5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tSGVhZGluZzEtLWRpc3BsYXkuc3BlY3RydW0tSGVhZGluZzEtLXN0cm9uZywgLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1IZWFkaW5nMS0tZGlzcGxheS5zcGVjdHJ1bS1IZWFkaW5nMS0tc3Ryb25nIHtcXG4gICAgICAgICAgZm9udC1zaXplOiA0OXB4O1xcbiAgZm9udC13ZWlnaHQ6IDkwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjU7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIG1hcmdpbi1ib3R0b206IDEwcHg7XFxuICAgICAgICAgIG1hcmdpbi10b3A6IDEwcHg7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1IZWFkaW5nMS0tZGlzcGxheS5zcGVjdHJ1bS1IZWFkaW5nMS0tc3Ryb25nIGVtLCAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUhlYWRpbmcxLS1kaXNwbGF5LnNwZWN0cnVtLUhlYWRpbmcxLS1zdHJvbmcgZW0sIC5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tSGVhZGluZzEtLWRpc3BsYXkuc3BlY3RydW0tSGVhZGluZzEtLXN0cm9uZyBlbSB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDQ5cHg7XFxuICBmb250LXdlaWdodDogOTAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjA1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tSGVhZGluZzEtLWRpc3BsYXkuc3BlY3RydW0tSGVhZGluZzEtLXN0cm9uZyBzdHJvbmcsIC5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tSGVhZGluZzEtLWRpc3BsYXkuc3BlY3RydW0tSGVhZGluZzEtLXN0cm9uZyBzdHJvbmcsIC5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tSGVhZGluZzEtLWRpc3BsYXkuc3BlY3RydW0tSGVhZGluZzEtLXN0cm9uZyBzdHJvbmcge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiA0OXB4O1xcbiAgZm9udC13ZWlnaHQ6IDkwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjU7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW06bGFuZyhqYSkgLnNwZWN0cnVtLUhlYWRpbmcyLS1kaXNwbGF5LnNwZWN0cnVtLUhlYWRpbmcyLS1zdHJvbmcsIC5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tSGVhZGluZzItLWRpc3BsYXkuc3BlY3RydW0tSGVhZGluZzItLXN0cm9uZywgLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1IZWFkaW5nMi0tZGlzcGxheS5zcGVjdHJ1bS1IZWFkaW5nMi0tc3Ryb25nIHtcXG4gICAgICAgICAgZm9udC1zaXplOiA0NHB4O1xcbiAgZm9udC13ZWlnaHQ6IDkwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjU7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIG1hcmdpbi1ib3R0b206IDEwcHg7XFxuICAgICAgICAgIG1hcmdpbi10b3A6IDEwcHg7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1IZWFkaW5nMi0tZGlzcGxheS5zcGVjdHJ1bS1IZWFkaW5nMi0tc3Ryb25nIGVtLCAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUhlYWRpbmcyLS1kaXNwbGF5LnNwZWN0cnVtLUhlYWRpbmcyLS1zdHJvbmcgZW0sIC5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tSGVhZGluZzItLWRpc3BsYXkuc3BlY3RydW0tSGVhZGluZzItLXN0cm9uZyBlbSB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDQ0cHg7XFxuICBmb250LXdlaWdodDogOTAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjA1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tSGVhZGluZzItLWRpc3BsYXkuc3BlY3RydW0tSGVhZGluZzItLXN0cm9uZyBzdHJvbmcsIC5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tSGVhZGluZzItLWRpc3BsYXkuc3BlY3RydW0tSGVhZGluZzItLXN0cm9uZyBzdHJvbmcsIC5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tSGVhZGluZzItLWRpc3BsYXkuc3BlY3RydW0tSGVhZGluZzItLXN0cm9uZyBzdHJvbmcge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiA0NHB4O1xcbiAgZm9udC13ZWlnaHQ6IDkwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjU7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW06bGFuZyhqYSkgLnNwZWN0cnVtLUhlYWRpbmcxLS1kaXNwbGF5LnNwZWN0cnVtLUhlYWRpbmcxLS1xdWlldCwgLnNwZWN0cnVtOmxhbmcoa28pIC5zcGVjdHJ1bS1IZWFkaW5nMS0tZGlzcGxheS5zcGVjdHJ1bS1IZWFkaW5nMS0tcXVpZXQsIC5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tSGVhZGluZzEtLWRpc3BsYXkuc3BlY3RydW0tSGVhZGluZzEtLXF1aWV0IHtcXG4gICAgICAgICAgZm9udC1zaXplOiA0OXB4O1xcbiAgZm9udC13ZWlnaHQ6IDMwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjU7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIG1hcmdpbi1ib3R0b206IDEwcHg7XFxuICAgICAgICAgIG1hcmdpbi10b3A6IDEwcHg7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1IZWFkaW5nMS0tZGlzcGxheS5zcGVjdHJ1bS1IZWFkaW5nMS0tcXVpZXQgZW0sIC5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tSGVhZGluZzEtLWRpc3BsYXkuc3BlY3RydW0tSGVhZGluZzEtLXF1aWV0IGVtLCAuc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLUhlYWRpbmcxLS1kaXNwbGF5LnNwZWN0cnVtLUhlYWRpbmcxLS1xdWlldCBlbSB7XFxuICAgICAgICAgICAgICBmb250LXNpemU6IDQ5cHg7XFxuICBmb250LXdlaWdodDogNDAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwLjA1ZW07XFxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcXG5cXG4gICAgICAgICAgfVxcbi5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tSGVhZGluZzEtLWRpc3BsYXkuc3BlY3RydW0tSGVhZGluZzEtLXF1aWV0IHN0cm9uZywgLnNwZWN0cnVtOmxhbmcoa28pIC5zcGVjdHJ1bS1IZWFkaW5nMS0tZGlzcGxheS5zcGVjdHJ1bS1IZWFkaW5nMS0tcXVpZXQgc3Ryb25nLCAuc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLUhlYWRpbmcxLS1kaXNwbGF5LnNwZWN0cnVtLUhlYWRpbmcxLS1xdWlldCBzdHJvbmcge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiA0OXB4O1xcbiAgZm9udC13ZWlnaHQ6IDcwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjU7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW06bGFuZyhqYSkgLnNwZWN0cnVtLUhlYWRpbmcyLS1kaXNwbGF5LnNwZWN0cnVtLUhlYWRpbmcyLS1xdWlldCxcXG4uc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUhlYWRpbmcyLS1kaXNwbGF5LnNwZWN0cnVtLUhlYWRpbmcyLS1xdWlldCxcXG4uc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLUhlYWRpbmcyLS1kaXNwbGF5LnNwZWN0cnVtLUhlYWRpbmcyLS1xdWlldCxcXG4uc3BlY3RydW06bGFuZyhqYSkgLnNwZWN0cnVtLUhlYWRpbmctLWRpc3BsYXksXFxuLnNwZWN0cnVtOmxhbmcoa28pIC5zcGVjdHJ1bS1IZWFkaW5nLS1kaXNwbGF5LFxcbi5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tSGVhZGluZy0tZGlzcGxheSB7XFxuICAgICAgICAgIGZvbnQtc2l6ZTogNDRweDtcXG4gIGZvbnQtd2VpZ2h0OiAzMDA7XFxuICBsaW5lLWhlaWdodDogMS41O1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDVlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICBtYXJnaW4tYm90dG9tOiAxMHB4O1xcbiAgICAgICAgICBtYXJnaW4tdG9wOiAxMHB4O1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tSGVhZGluZzItLWRpc3BsYXkuc3BlY3RydW0tSGVhZGluZzItLXF1aWV0IGVtLFxcbi5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tSGVhZGluZzItLWRpc3BsYXkuc3BlY3RydW0tSGVhZGluZzItLXF1aWV0IGVtLFxcbi5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tSGVhZGluZzItLWRpc3BsYXkuc3BlY3RydW0tSGVhZGluZzItLXF1aWV0IGVtLFxcbi5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tSGVhZGluZy0tZGlzcGxheSBlbSxcXG4uc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUhlYWRpbmctLWRpc3BsYXkgZW0sXFxuLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1IZWFkaW5nLS1kaXNwbGF5IGVtIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogNDRweDtcXG4gIGZvbnQtd2VpZ2h0OiA0MDA7XFxuICBsaW5lLWhlaWdodDogMS41O1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDVlbTtcXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xcblxcbiAgICAgICAgICB9XFxuLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1IZWFkaW5nMi0tZGlzcGxheS5zcGVjdHJ1bS1IZWFkaW5nMi0tcXVpZXQgc3Ryb25nLFxcbi5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tSGVhZGluZzItLWRpc3BsYXkuc3BlY3RydW0tSGVhZGluZzItLXF1aWV0IHN0cm9uZyxcXG4uc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLUhlYWRpbmcyLS1kaXNwbGF5LnNwZWN0cnVtLUhlYWRpbmcyLS1xdWlldCBzdHJvbmcsXFxuLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1IZWFkaW5nLS1kaXNwbGF5IHN0cm9uZyxcXG4uc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUhlYWRpbmctLWRpc3BsYXkgc3Ryb25nLFxcbi5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tSGVhZGluZy0tZGlzcGxheSBzdHJvbmcge1xcbiAgICAgICAgICAgICAgZm9udC1zaXplOiA0NHB4O1xcbiAgZm9udC13ZWlnaHQ6IDcwMDtcXG4gIGxpbmUtaGVpZ2h0OiAxLjU7XFxuICBmb250LXN0eWxlOiBub3JtYWw7XFxuICBsZXR0ZXItc3BhY2luZzogMC4wNWVtO1xcbiAgdGV4dC10cmFuc2Zvcm06IG5vbmU7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW0tQ29kZTEge1xcbiAgICAgICAgICBmb250LXNpemU6IDI0cHg7XFxuICBmb250LXdlaWdodDogNDAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwO1xcblxcbiAgICAgICAgICBtYXJnaW4tYm90dG9tOiAyMHB4O1xcbiAgICAgICAgICBtYXJnaW4tdG9wOiAxMHB4O1xcbiAgZm9udC1mYW1pbHk6IFNvdXJjZSBDb2RlIFBybywgTW9uYWNvLCBtb25vc3BhY2U7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLUNvZGUxIGVtIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogMjRweDtcXG4gIGZvbnQtd2VpZ2h0OiA0MDA7XFxuICBsaW5lLWhlaWdodDogMS41O1xcbiAgZm9udC1zdHlsZTogaXRhbGljO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDA7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW0tQ29kZTEgc3Ryb25nIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogMjRweDtcXG4gIGZvbnQtd2VpZ2h0OiA3MDA7XFxuICBsaW5lLWhlaWdodDogMS41O1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDA7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW0tQ29kZTIge1xcbiAgICAgICAgICBmb250LXNpemU6IDIycHg7XFxuICBmb250LXdlaWdodDogNDAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwO1xcblxcbiAgICAgICAgICBtYXJnaW4tYm90dG9tOiAyMHB4O1xcbiAgICAgICAgICBtYXJnaW4tdG9wOiAxMHB4O1xcbiAgZm9udC1mYW1pbHk6IFNvdXJjZSBDb2RlIFBybywgTW9uYWNvLCBtb25vc3BhY2U7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLUNvZGUyIGVtIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogMjJweDtcXG4gIGZvbnQtd2VpZ2h0OiA0MDA7XFxuICBsaW5lLWhlaWdodDogMS41O1xcbiAgZm9udC1zdHlsZTogaXRhbGljO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDA7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW0tQ29kZTIgc3Ryb25nIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogMjJweDtcXG4gIGZvbnQtd2VpZ2h0OiA3MDA7XFxuICBsaW5lLWhlaWdodDogMS41O1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDA7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW0tQ29kZTMge1xcbiAgICAgICAgICBmb250LXNpemU6IDE5cHg7XFxuICBmb250LXdlaWdodDogNDAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwO1xcblxcbiAgICAgICAgICBtYXJnaW4tYm90dG9tOiAyMHB4O1xcbiAgICAgICAgICBtYXJnaW4tdG9wOiAxMHB4O1xcbiAgZm9udC1mYW1pbHk6IFNvdXJjZSBDb2RlIFBybywgTW9uYWNvLCBtb25vc3BhY2U7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLUNvZGUzIGVtIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogMTlweDtcXG4gIGZvbnQtd2VpZ2h0OiA0MDA7XFxuICBsaW5lLWhlaWdodDogMS41O1xcbiAgZm9udC1zdHlsZTogaXRhbGljO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDA7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW0tQ29kZTMgc3Ryb25nIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogMTlweDtcXG4gIGZvbnQtd2VpZ2h0OiA3MDA7XFxuICBsaW5lLWhlaWdodDogMS41O1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDA7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW0tQ29kZTQge1xcbiAgICAgICAgICBmb250LXNpemU6IDE3cHg7XFxuICBmb250LXdlaWdodDogNDAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwO1xcblxcbiAgICAgICAgICBtYXJnaW4tYm90dG9tOiAyMHB4O1xcbiAgICAgICAgICBtYXJnaW4tdG9wOiAxMHB4O1xcbiAgZm9udC1mYW1pbHk6IFNvdXJjZSBDb2RlIFBybywgTW9uYWNvLCBtb25vc3BhY2U7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLUNvZGU0IGVtIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogMTdweDtcXG4gIGZvbnQtd2VpZ2h0OiA0MDA7XFxuICBsaW5lLWhlaWdodDogMS41O1xcbiAgZm9udC1zdHlsZTogaXRhbGljO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDA7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW0tQ29kZTQgc3Ryb25nIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogMTdweDtcXG4gIGZvbnQtd2VpZ2h0OiA3MDA7XFxuICBsaW5lLWhlaWdodDogMS41O1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDA7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW0tQ29kZTUge1xcbiAgICAgICAgICBmb250LXNpemU6IDE1cHg7XFxuICBmb250LXdlaWdodDogNDAwO1xcbiAgbGluZS1oZWlnaHQ6IDEuNTtcXG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcXG4gIGxldHRlci1zcGFjaW5nOiAwO1xcblxcbiAgICAgICAgICBtYXJnaW4tYm90dG9tOiAyMHB4O1xcbiAgICAgICAgICBtYXJnaW4tdG9wOiAxMHB4O1xcbiAgZm9udC1mYW1pbHk6IFNvdXJjZSBDb2RlIFBybywgTW9uYWNvLCBtb25vc3BhY2U7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLUNvZGU1IGVtIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogMTVweDtcXG4gIGZvbnQtd2VpZ2h0OiA0MDA7XFxuICBsaW5lLWhlaWdodDogMS41O1xcbiAgZm9udC1zdHlsZTogaXRhbGljO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDA7XFxuXFxuICAgICAgICAgIH1cXG4uc3BlY3RydW0tQ29kZTUgc3Ryb25nIHtcXG4gICAgICAgICAgICAgIGZvbnQtc2l6ZTogMTVweDtcXG4gIGZvbnQtd2VpZ2h0OiA3MDA7XFxuICBsaW5lLWhlaWdodDogMS41O1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbiAgbGV0dGVyLXNwYWNpbmc6IDA7XFxuXFxuICAgICAgICAgIH1cXG4vKiB0b3Bkb2NcXG57eyB0eXBvZ3JhcGh5L3R5cG9ncmFwaHktZGVmYXVsdC55bWwgfX1cXG4qL1xcbi8qIHRvcGRvY1xcbnt7IHR5cG9ncmFwaHkvdHlwb2dyYXBoeS1kZXByZWNhdGVkLnltbCB9fVxcbiovXFxuLyogdG9wZG9jXFxue3sgdHlwb2dyYXBoeS90eXBvZ3JhcGh5LWFydGljbGUueW1sIH19XFxuKi9cXG4vKiB0b3Bkb2NcXG57eyB0eXBvZ3JhcGh5L3R5cG9ncmFwaHktaGFuLnltbCB9fVxcbiovXFxuLyogdG9wZG9jXFxue3sgdHlwb2dyYXBoeS90eXBvZ3JhcGh5LWhlYWRpbmcueW1sIH19XFxuKi9cXG4vKiB0b3Bkb2NcXG57eyB0eXBvZ3JhcGh5L3R5cG9ncmFwaHktaGVhZGluZy1xdWlldC55bWwgfX1cXG4qL1xcbi8qIHRvcGRvY1xcbnt7IHR5cG9ncmFwaHkvdHlwb2dyYXBoeS1oZWFkaW5nLXN0cm9uZy55bWwgfX1cXG4qL1xcbi8qIHRvcGRvY1xcbnt7IHR5cG9ncmFwaHkvdHlwb2dyYXBoeS1kaXNwbGF5LnltbCB9fVxcbiovXFxuLyogdG9wZG9jXFxue3sgdHlwb2dyYXBoeS90eXBvZ3JhcGh5LWRpc3BsYXktcXVpZXQueW1sIH19XFxuKi9cXG4vKiB0b3Bkb2NcXG57eyB0eXBvZ3JhcGh5L3R5cG9ncmFwaHktZGlzcGxheS1zdHJvbmcueW1sIH19XFxuKi9cXG4vKiB0b3Bkb2NcXG57eyB0eXBvZ3JhcGh5L3R5cG9ncmFwaHktYm9keS55bWwgfX1cXG4qL1xcbi8qIHRvcGRvY1xcbnt7IHR5cG9ncmFwaHkvdHlwb2dyYXBoeS1jb2RlLnltbCB9fVxcbiovXFxuLnNwZWN0cnVtLFxcbi5zcGVjdHJ1bS1Cb2R5IHtcXG4gIGZvbnQtc2l6ZTogMTdweDtcXG4gIGZvbnQtd2VpZ2h0OiA0MDA7XFxuICBsaW5lLWhlaWdodDogMS41O1xcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xcbn1cXG4uc3BlY3RydW0tQm9keS0taXRhbGljIHtcXG4gIGZvbnQtc3R5bGU6IGl0YWxpYztcXG59XFxuXCIsIFwiXCJdKTtcblxuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///226\n')},function(module,exports,__webpack_require__){eval('exports = module.exports = __webpack_require__(6)(false);\n// Module\nexports.push([module.i, "/* generated from dna-version: 5.0.1 */\\n/* generated from dna-version: 5.0.1 */\\n/* Temporary skin variables that need to be moved into origins */\\n:root {\\n  /* Icon Button*/\\n\\n  /* Button */\\n\\n  /* Shell */\\n\\n  /* haha remove this */\\n\\n  /* Custom selection color for placeholders using global blue-500 at 30% opacity. Should be updated in Spectrum-DNA */\\n}\\n.spectrum--light .spectrum-Body1 {\\n          color: rgb(75, 75, 75);\\n        }\\n.spectrum--light .spectrum-Body2 {\\n          color: rgb(75, 75, 75);\\n        }\\n.spectrum--light .spectrum-Body3 {\\n          color: rgb(75, 75, 75);\\n        }\\n.spectrum--light .spectrum-Body4 {\\n          color: rgb(75, 75, 75);\\n        }\\n.spectrum--light .spectrum-Body5 {\\n          color: rgb(75, 75, 75);\\n        }\\n.spectrum--light .spectrum-Heading1 {\\n          color: rgb(44, 44, 44);\\n        }\\n.spectrum--light .spectrum-Heading2 {\\n          color: rgb(44, 44, 44);\\n        }\\n.spectrum--light .spectrum-Heading3 {\\n          color: rgb(44, 44, 44);\\n        }\\n.spectrum--light .spectrum-Heading4 {\\n          color: rgb(44, 44, 44);\\n        }\\n.spectrum--light .spectrum-Heading5 {\\n          color: rgb(44, 44, 44);\\n        }\\n.spectrum--light .spectrum-Heading6 {\\n          color: rgb(44, 44, 44);\\n        }\\n.spectrum--light .spectrum-Subheading {\\n          color: rgb(75, 75, 75);\\n        }\\n.spectrum--light .spectrum-Detail {\\n          color: rgb(75, 75, 75);\\n        }\\n.spectrum--light .spectrum-Heading1--quiet {\\n          color: rgb(44, 44, 44);\\n        }\\n.spectrum--light .spectrum-Heading2--quiet {\\n          color: rgb(44, 44, 44);\\n        }\\n.spectrum--light .spectrum-Heading1--strong {\\n          color: rgb(44, 44, 44);\\n        }\\n.spectrum--light .spectrum-Heading2--strong {\\n          color: rgb(44, 44, 44);\\n        }\\n.spectrum--light .spectrum-Heading1--display {\\n          color: rgb(44, 44, 44);\\n        }\\n.spectrum--light .spectrum-Heading2--display {\\n          color: rgb(44, 44, 44);\\n        }\\n.spectrum--light .spectrum-Heading1--display.spectrum-Heading1--strong {\\n          color: rgb(44, 44, 44);\\n        }\\n.spectrum--light .spectrum-Heading2--display.spectrum-Heading2--strong {\\n          color: rgb(44, 44, 44);\\n        }\\n.spectrum--light .spectrum-Heading1--display.spectrum-Heading1--quiet {\\n          color: rgb(44, 44, 44);\\n        }\\n.spectrum--light .spectrum-Heading2--display.spectrum-Heading2--quiet {\\n          color: rgb(44, 44, 44);\\n        }\\n.spectrum--light .spectrum-Article .spectrum-Body1 {\\n          color: rgb(75, 75, 75);\\n        }\\n.spectrum--light .spectrum-Article .spectrum-Body2 {\\n          color: rgb(75, 75, 75);\\n        }\\n.spectrum--light .spectrum-Article .spectrum-Body3 {\\n          color: rgb(75, 75, 75);\\n        }\\n.spectrum--light .spectrum-Article .spectrum-Body4 {\\n          color: rgb(75, 75, 75);\\n        }\\n.spectrum--light .spectrum-Article .spectrum-Body5 {\\n          color: rgb(75, 75, 75);\\n        }\\n.spectrum--light .spectrum-Article .spectrum-Heading1 {\\n          color: rgb(44, 44, 44);\\n        }\\n.spectrum--light .spectrum-Article .spectrum-Heading2 {\\n          color: rgb(44, 44, 44);\\n        }\\n.spectrum--light .spectrum-Article .spectrum-Heading3 {\\n          color: rgb(44, 44, 44);\\n        }\\n.spectrum--light .spectrum-Article .spectrum-Heading4 {\\n          color: rgb(44, 44, 44);\\n        }\\n.spectrum--light .spectrum-Article .spectrum-Heading5 {\\n          color: rgb(44, 44, 44);\\n        }\\n.spectrum--light .spectrum-Article .spectrum-Heading6 {\\n          color: rgb(44, 44, 44);\\n        }\\n.spectrum--light .spectrum-Article .spectrum-Subheading {\\n          color: rgb(75, 75, 75);\\n        }\\n.spectrum--light .spectrum-Article .spectrum-Detail {\\n          color: rgb(75, 75, 75);\\n        }\\n.spectrum--light .spectrum-Article .spectrum-Heading1--quiet {\\n          color: rgb(44, 44, 44);\\n        }\\n.spectrum--light .spectrum-Article .spectrum-Heading2--quiet {\\n          color: rgb(44, 44, 44);\\n        }\\n.spectrum--light .spectrum-Article .spectrum-Heading1--display {\\n          color: rgb(44, 44, 44);\\n        }\\n.spectrum--light .spectrum-Article .spectrum-Heading2--display {\\n          color: rgb(44, 44, 44);\\n        }\\n.spectrum--light .spectrum-Article .spectrum-Heading1--display.spectrum-Heading1--quiet {\\n          color: rgb(44, 44, 44);\\n        }\\n.spectrum--light .spectrum-Article .spectrum-Heading2--display.spectrum-Heading2--quiet {\\n          color: rgb(44, 44, 44);\\n        }\\n.spectrum--light .spectrum:lang(ja) .spectrum-Body1, .spectrum--light .spectrum:lang(ko) .spectrum-Body1, .spectrum--light .spectrum:lang(zh) .spectrum-Body1 {\\n          color: rgb(75, 75, 75);\\n        }\\n.spectrum--light .spectrum:lang(ja) .spectrum-Body2, .spectrum--light .spectrum:lang(ko) .spectrum-Body2, .spectrum--light .spectrum:lang(zh) .spectrum-Body2 {\\n          color: rgb(75, 75, 75);\\n        }\\n.spectrum--light .spectrum:lang(ja) .spectrum-Body3, .spectrum--light .spectrum:lang(ko) .spectrum-Body3, .spectrum--light .spectrum:lang(zh) .spectrum-Body3 {\\n          color: rgb(75, 75, 75);\\n        }\\n.spectrum--light .spectrum:lang(ja) .spectrum-Body4, .spectrum--light .spectrum:lang(ko) .spectrum-Body4, .spectrum--light .spectrum:lang(zh) .spectrum-Body4 {\\n          color: rgb(75, 75, 75);\\n        }\\n.spectrum--light .spectrum:lang(ja) .spectrum-Body5, .spectrum--light .spectrum:lang(ko) .spectrum-Body5, .spectrum--light .spectrum:lang(zh) .spectrum-Body5 {\\n          color: rgb(75, 75, 75);\\n        }\\n.spectrum--light .spectrum:lang(ja) .spectrum-Heading1, .spectrum--light .spectrum:lang(ko) .spectrum-Heading1, .spectrum--light .spectrum:lang(zh) .spectrum-Heading1 {\\n          color: rgb(44, 44, 44);\\n        }\\n.spectrum--light .spectrum:lang(ja) .spectrum-Heading2, .spectrum--light .spectrum:lang(ko) .spectrum-Heading2, .spectrum--light .spectrum:lang(zh) .spectrum-Heading2 {\\n          color: rgb(44, 44, 44);\\n        }\\n.spectrum--light .spectrum:lang(ja) .spectrum-Heading3, .spectrum--light .spectrum:lang(ko) .spectrum-Heading3, .spectrum--light .spectrum:lang(zh) .spectrum-Heading3 {\\n          color: rgb(44, 44, 44);\\n        }\\n.spectrum--light .spectrum:lang(ja) .spectrum-Heading4, .spectrum--light .spectrum:lang(ko) .spectrum-Heading4, .spectrum--light .spectrum:lang(zh) .spectrum-Heading4 {\\n          color: rgb(44, 44, 44);\\n        }\\n.spectrum--light .spectrum:lang(ja) .spectrum-Heading5, .spectrum--light .spectrum:lang(ko) .spectrum-Heading5, .spectrum--light .spectrum:lang(zh) .spectrum-Heading5 {\\n          color: rgb(44, 44, 44);\\n        }\\n.spectrum--light .spectrum:lang(ja) .spectrum-Heading6, .spectrum--light .spectrum:lang(ko) .spectrum-Heading6, .spectrum--light .spectrum:lang(zh) .spectrum-Heading6 {\\n          color: rgb(44, 44, 44);\\n        }\\n.spectrum--light .spectrum:lang(ja) .spectrum-Subheading, .spectrum--light .spectrum:lang(ko) .spectrum-Subheading, .spectrum--light .spectrum:lang(zh) .spectrum-Subheading {\\n          color: rgb(75, 75, 75);\\n        }\\n.spectrum--light .spectrum:lang(ja) .spectrum-Detail, .spectrum--light .spectrum:lang(ko) .spectrum-Detail, .spectrum--light .spectrum:lang(zh) .spectrum-Detail {\\n          color: rgb(75, 75, 75);\\n        }\\n.spectrum--light .spectrum:lang(ja) .spectrum-Heading1--quiet, .spectrum--light .spectrum:lang(ko) .spectrum-Heading1--quiet, .spectrum--light .spectrum:lang(zh) .spectrum-Heading1--quiet {\\n          color: rgb(44, 44, 44);\\n        }\\n.spectrum--light .spectrum:lang(ja) .spectrum-Heading2--quiet, .spectrum--light .spectrum:lang(ko) .spectrum-Heading2--quiet, .spectrum--light .spectrum:lang(zh) .spectrum-Heading2--quiet {\\n          color: rgb(44, 44, 44);\\n        }\\n.spectrum--light .spectrum:lang(ja) .spectrum-Heading1--strong, .spectrum--light .spectrum:lang(ko) .spectrum-Heading1--strong, .spectrum--light .spectrum:lang(zh) .spectrum-Heading1--strong {\\n          color: rgb(44, 44, 44);\\n        }\\n.spectrum--light .spectrum:lang(ja) .spectrum-Heading2--strong, .spectrum--light .spectrum:lang(ko) .spectrum-Heading2--strong, .spectrum--light .spectrum:lang(zh) .spectrum-Heading2--strong {\\n          color: rgb(44, 44, 44);\\n        }\\n.spectrum--light .spectrum:lang(ja) .spectrum-Heading1--display, .spectrum--light .spectrum:lang(ko) .spectrum-Heading1--display, .spectrum--light .spectrum:lang(zh) .spectrum-Heading1--display {\\n          color: rgb(44, 44, 44);\\n        }\\n.spectrum--light .spectrum:lang(ja) .spectrum-Heading2--display, .spectrum--light .spectrum:lang(ko) .spectrum-Heading2--display, .spectrum--light .spectrum:lang(zh) .spectrum-Heading2--display {\\n          color: rgb(44, 44, 44);\\n        }\\n.spectrum--light .spectrum:lang(ja) .spectrum-Heading1--display.spectrum-Heading1--strong, .spectrum--light .spectrum:lang(ko) .spectrum-Heading1--display.spectrum-Heading1--strong, .spectrum--light .spectrum:lang(zh) .spectrum-Heading1--display.spectrum-Heading1--strong {\\n          color: rgb(44, 44, 44);\\n        }\\n.spectrum--light .spectrum:lang(ja) .spectrum-Heading2--display.spectrum-Heading2--strong, .spectrum--light .spectrum:lang(ko) .spectrum-Heading2--display.spectrum-Heading2--strong, .spectrum--light .spectrum:lang(zh) .spectrum-Heading2--display.spectrum-Heading2--strong {\\n          color: rgb(44, 44, 44);\\n        }\\n.spectrum--light .spectrum:lang(ja) .spectrum-Heading1--display.spectrum-Heading1--quiet, .spectrum--light .spectrum:lang(ko) .spectrum-Heading1--display.spectrum-Heading1--quiet, .spectrum--light .spectrum:lang(zh) .spectrum-Heading1--display.spectrum-Heading1--quiet {\\n          color: rgb(44, 44, 44);\\n        }\\n.spectrum--light .spectrum:lang(ja) .spectrum-Heading2--display.spectrum-Heading2--quiet, .spectrum--light .spectrum:lang(ko) .spectrum-Heading2--display.spectrum-Heading2--quiet, .spectrum--light .spectrum:lang(zh) .spectrum-Heading2--display.spectrum-Heading2--quiet {\\n          color: rgb(44, 44, 44);\\n        }\\n.spectrum--light .spectrum-Code1 {\\n          color: rgb(75, 75, 75);\\n        }\\n.spectrum--light .spectrum-Code2 {\\n          color: rgb(75, 75, 75);\\n        }\\n.spectrum--light .spectrum-Code3 {\\n          color: rgb(75, 75, 75);\\n        }\\n.spectrum--light .spectrum-Code4 {\\n          color: rgb(75, 75, 75);\\n        }\\n.spectrum--light .spectrum-Code5 {\\n          color: rgb(75, 75, 75);\\n        }\\n.spectrum--light,\\n.spectrum--light .spectrum-Body {\\n  color: rgb(75, 75, 75);\\n}\\n.spectrum--light .spectrum-Body--large {\\n  color: rgb(75, 75, 75);\\n}\\n.spectrum--light .spectrum-Body--small {\\n  color: rgb(75, 75, 75);\\n}\\n.spectrum--light .spectrum-Body--secondary {\\n  color: rgb(112, 112, 112);\\n}\\n.spectrum--light .spectrum-Heading--display {\\n  color: rgb(44, 44, 44);\\n}\\n.spectrum--light .spectrum-Heading--pageTitle {\\n  color: rgb(112, 112, 112);\\n}\\n.spectrum--light .spectrum-Heading--subtitle1 {\\n  color: rgb(44, 44, 44);\\n}\\n.spectrum--light .spectrum-Heading--subtitle2 {\\n  color: rgb(44, 44, 44);\\n}\\n.spectrum--light .spectrum-Heading--subtitle3 {\\n  color: rgb(112, 112, 112);\\n}\\n", ""]);\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjI3LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0b3JxLW5hdGl2ZS9yZWFjdC1zcGVjdHJ1bS9zcGVjdHJ1bS1jc3Mtb3ZlcnJpZGVzL3R5cG9ncmFwaHkvbXVsdGlTdG9wcy9saWdodC5jc3M/MzE1ZiJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiLi4vLi4vLi4vLi4vLi4vY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzXCIpKGZhbHNlKTtcbi8vIE1vZHVsZVxuZXhwb3J0cy5wdXNoKFttb2R1bGUuaWQsIFwiLyogZ2VuZXJhdGVkIGZyb20gZG5hLXZlcnNpb246IDUuMC4xICovXFxuLyogZ2VuZXJhdGVkIGZyb20gZG5hLXZlcnNpb246IDUuMC4xICovXFxuLyogVGVtcG9yYXJ5IHNraW4gdmFyaWFibGVzIHRoYXQgbmVlZCB0byBiZSBtb3ZlZCBpbnRvIG9yaWdpbnMgKi9cXG46cm9vdCB7XFxuICAvKiBJY29uIEJ1dHRvbiovXFxuXFxuICAvKiBCdXR0b24gKi9cXG5cXG4gIC8qIFNoZWxsICovXFxuXFxuICAvKiBoYWhhIHJlbW92ZSB0aGlzICovXFxuXFxuICAvKiBDdXN0b20gc2VsZWN0aW9uIGNvbG9yIGZvciBwbGFjZWhvbGRlcnMgdXNpbmcgZ2xvYmFsIGJsdWUtNTAwIGF0IDMwJSBvcGFjaXR5LiBTaG91bGQgYmUgdXBkYXRlZCBpbiBTcGVjdHJ1bS1ETkEgKi9cXG59XFxuLnNwZWN0cnVtLS1saWdodCAuc3BlY3RydW0tQm9keTEge1xcbiAgICAgICAgICBjb2xvcjogcmdiKDc1LCA3NSwgNzUpO1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGlnaHQgLnNwZWN0cnVtLUJvZHkyIHtcXG4gICAgICAgICAgY29sb3I6IHJnYig3NSwgNzUsIDc1KTtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWxpZ2h0IC5zcGVjdHJ1bS1Cb2R5MyB7XFxuICAgICAgICAgIGNvbG9yOiByZ2IoNzUsIDc1LCA3NSk7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1saWdodCAuc3BlY3RydW0tQm9keTQge1xcbiAgICAgICAgICBjb2xvcjogcmdiKDc1LCA3NSwgNzUpO1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGlnaHQgLnNwZWN0cnVtLUJvZHk1IHtcXG4gICAgICAgICAgY29sb3I6IHJnYig3NSwgNzUsIDc1KTtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWxpZ2h0IC5zcGVjdHJ1bS1IZWFkaW5nMSB7XFxuICAgICAgICAgIGNvbG9yOiByZ2IoNDQsIDQ0LCA0NCk7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1saWdodCAuc3BlY3RydW0tSGVhZGluZzIge1xcbiAgICAgICAgICBjb2xvcjogcmdiKDQ0LCA0NCwgNDQpO1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGlnaHQgLnNwZWN0cnVtLUhlYWRpbmczIHtcXG4gICAgICAgICAgY29sb3I6IHJnYig0NCwgNDQsIDQ0KTtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWxpZ2h0IC5zcGVjdHJ1bS1IZWFkaW5nNCB7XFxuICAgICAgICAgIGNvbG9yOiByZ2IoNDQsIDQ0LCA0NCk7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1saWdodCAuc3BlY3RydW0tSGVhZGluZzUge1xcbiAgICAgICAgICBjb2xvcjogcmdiKDQ0LCA0NCwgNDQpO1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGlnaHQgLnNwZWN0cnVtLUhlYWRpbmc2IHtcXG4gICAgICAgICAgY29sb3I6IHJnYig0NCwgNDQsIDQ0KTtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWxpZ2h0IC5zcGVjdHJ1bS1TdWJoZWFkaW5nIHtcXG4gICAgICAgICAgY29sb3I6IHJnYig3NSwgNzUsIDc1KTtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWxpZ2h0IC5zcGVjdHJ1bS1EZXRhaWwge1xcbiAgICAgICAgICBjb2xvcjogcmdiKDc1LCA3NSwgNzUpO1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGlnaHQgLnNwZWN0cnVtLUhlYWRpbmcxLS1xdWlldCB7XFxuICAgICAgICAgIGNvbG9yOiByZ2IoNDQsIDQ0LCA0NCk7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1saWdodCAuc3BlY3RydW0tSGVhZGluZzItLXF1aWV0IHtcXG4gICAgICAgICAgY29sb3I6IHJnYig0NCwgNDQsIDQ0KTtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWxpZ2h0IC5zcGVjdHJ1bS1IZWFkaW5nMS0tc3Ryb25nIHtcXG4gICAgICAgICAgY29sb3I6IHJnYig0NCwgNDQsIDQ0KTtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWxpZ2h0IC5zcGVjdHJ1bS1IZWFkaW5nMi0tc3Ryb25nIHtcXG4gICAgICAgICAgY29sb3I6IHJnYig0NCwgNDQsIDQ0KTtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWxpZ2h0IC5zcGVjdHJ1bS1IZWFkaW5nMS0tZGlzcGxheSB7XFxuICAgICAgICAgIGNvbG9yOiByZ2IoNDQsIDQ0LCA0NCk7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1saWdodCAuc3BlY3RydW0tSGVhZGluZzItLWRpc3BsYXkge1xcbiAgICAgICAgICBjb2xvcjogcmdiKDQ0LCA0NCwgNDQpO1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGlnaHQgLnNwZWN0cnVtLUhlYWRpbmcxLS1kaXNwbGF5LnNwZWN0cnVtLUhlYWRpbmcxLS1zdHJvbmcge1xcbiAgICAgICAgICBjb2xvcjogcmdiKDQ0LCA0NCwgNDQpO1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGlnaHQgLnNwZWN0cnVtLUhlYWRpbmcyLS1kaXNwbGF5LnNwZWN0cnVtLUhlYWRpbmcyLS1zdHJvbmcge1xcbiAgICAgICAgICBjb2xvcjogcmdiKDQ0LCA0NCwgNDQpO1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGlnaHQgLnNwZWN0cnVtLUhlYWRpbmcxLS1kaXNwbGF5LnNwZWN0cnVtLUhlYWRpbmcxLS1xdWlldCB7XFxuICAgICAgICAgIGNvbG9yOiByZ2IoNDQsIDQ0LCA0NCk7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1saWdodCAuc3BlY3RydW0tSGVhZGluZzItLWRpc3BsYXkuc3BlY3RydW0tSGVhZGluZzItLXF1aWV0IHtcXG4gICAgICAgICAgY29sb3I6IHJnYig0NCwgNDQsIDQ0KTtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWxpZ2h0IC5zcGVjdHJ1bS1BcnRpY2xlIC5zcGVjdHJ1bS1Cb2R5MSB7XFxuICAgICAgICAgIGNvbG9yOiByZ2IoNzUsIDc1LCA3NSk7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1saWdodCAuc3BlY3RydW0tQXJ0aWNsZSAuc3BlY3RydW0tQm9keTIge1xcbiAgICAgICAgICBjb2xvcjogcmdiKDc1LCA3NSwgNzUpO1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGlnaHQgLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLUJvZHkzIHtcXG4gICAgICAgICAgY29sb3I6IHJnYig3NSwgNzUsIDc1KTtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWxpZ2h0IC5zcGVjdHJ1bS1BcnRpY2xlIC5zcGVjdHJ1bS1Cb2R5NCB7XFxuICAgICAgICAgIGNvbG9yOiByZ2IoNzUsIDc1LCA3NSk7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1saWdodCAuc3BlY3RydW0tQXJ0aWNsZSAuc3BlY3RydW0tQm9keTUge1xcbiAgICAgICAgICBjb2xvcjogcmdiKDc1LCA3NSwgNzUpO1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGlnaHQgLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLUhlYWRpbmcxIHtcXG4gICAgICAgICAgY29sb3I6IHJnYig0NCwgNDQsIDQ0KTtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWxpZ2h0IC5zcGVjdHJ1bS1BcnRpY2xlIC5zcGVjdHJ1bS1IZWFkaW5nMiB7XFxuICAgICAgICAgIGNvbG9yOiByZ2IoNDQsIDQ0LCA0NCk7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1saWdodCAuc3BlY3RydW0tQXJ0aWNsZSAuc3BlY3RydW0tSGVhZGluZzMge1xcbiAgICAgICAgICBjb2xvcjogcmdiKDQ0LCA0NCwgNDQpO1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGlnaHQgLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLUhlYWRpbmc0IHtcXG4gICAgICAgICAgY29sb3I6IHJnYig0NCwgNDQsIDQ0KTtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWxpZ2h0IC5zcGVjdHJ1bS1BcnRpY2xlIC5zcGVjdHJ1bS1IZWFkaW5nNSB7XFxuICAgICAgICAgIGNvbG9yOiByZ2IoNDQsIDQ0LCA0NCk7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1saWdodCAuc3BlY3RydW0tQXJ0aWNsZSAuc3BlY3RydW0tSGVhZGluZzYge1xcbiAgICAgICAgICBjb2xvcjogcmdiKDQ0LCA0NCwgNDQpO1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGlnaHQgLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLVN1YmhlYWRpbmcge1xcbiAgICAgICAgICBjb2xvcjogcmdiKDc1LCA3NSwgNzUpO1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGlnaHQgLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLURldGFpbCB7XFxuICAgICAgICAgIGNvbG9yOiByZ2IoNzUsIDc1LCA3NSk7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1saWdodCAuc3BlY3RydW0tQXJ0aWNsZSAuc3BlY3RydW0tSGVhZGluZzEtLXF1aWV0IHtcXG4gICAgICAgICAgY29sb3I6IHJnYig0NCwgNDQsIDQ0KTtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWxpZ2h0IC5zcGVjdHJ1bS1BcnRpY2xlIC5zcGVjdHJ1bS1IZWFkaW5nMi0tcXVpZXQge1xcbiAgICAgICAgICBjb2xvcjogcmdiKDQ0LCA0NCwgNDQpO1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGlnaHQgLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLUhlYWRpbmcxLS1kaXNwbGF5IHtcXG4gICAgICAgICAgY29sb3I6IHJnYig0NCwgNDQsIDQ0KTtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWxpZ2h0IC5zcGVjdHJ1bS1BcnRpY2xlIC5zcGVjdHJ1bS1IZWFkaW5nMi0tZGlzcGxheSB7XFxuICAgICAgICAgIGNvbG9yOiByZ2IoNDQsIDQ0LCA0NCk7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1saWdodCAuc3BlY3RydW0tQXJ0aWNsZSAuc3BlY3RydW0tSGVhZGluZzEtLWRpc3BsYXkuc3BlY3RydW0tSGVhZGluZzEtLXF1aWV0IHtcXG4gICAgICAgICAgY29sb3I6IHJnYig0NCwgNDQsIDQ0KTtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWxpZ2h0IC5zcGVjdHJ1bS1BcnRpY2xlIC5zcGVjdHJ1bS1IZWFkaW5nMi0tZGlzcGxheS5zcGVjdHJ1bS1IZWFkaW5nMi0tcXVpZXQge1xcbiAgICAgICAgICBjb2xvcjogcmdiKDQ0LCA0NCwgNDQpO1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGlnaHQgLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1Cb2R5MSwgLnNwZWN0cnVtLS1saWdodCAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUJvZHkxLCAuc3BlY3RydW0tLWxpZ2h0IC5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tQm9keTEge1xcbiAgICAgICAgICBjb2xvcjogcmdiKDc1LCA3NSwgNzUpO1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGlnaHQgLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1Cb2R5MiwgLnNwZWN0cnVtLS1saWdodCAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUJvZHkyLCAuc3BlY3RydW0tLWxpZ2h0IC5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tQm9keTIge1xcbiAgICAgICAgICBjb2xvcjogcmdiKDc1LCA3NSwgNzUpO1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGlnaHQgLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1Cb2R5MywgLnNwZWN0cnVtLS1saWdodCAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUJvZHkzLCAuc3BlY3RydW0tLWxpZ2h0IC5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tQm9keTMge1xcbiAgICAgICAgICBjb2xvcjogcmdiKDc1LCA3NSwgNzUpO1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGlnaHQgLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1Cb2R5NCwgLnNwZWN0cnVtLS1saWdodCAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUJvZHk0LCAuc3BlY3RydW0tLWxpZ2h0IC5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tQm9keTQge1xcbiAgICAgICAgICBjb2xvcjogcmdiKDc1LCA3NSwgNzUpO1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGlnaHQgLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1Cb2R5NSwgLnNwZWN0cnVtLS1saWdodCAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUJvZHk1LCAuc3BlY3RydW0tLWxpZ2h0IC5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tQm9keTUge1xcbiAgICAgICAgICBjb2xvcjogcmdiKDc1LCA3NSwgNzUpO1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGlnaHQgLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1IZWFkaW5nMSwgLnNwZWN0cnVtLS1saWdodCAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUhlYWRpbmcxLCAuc3BlY3RydW0tLWxpZ2h0IC5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tSGVhZGluZzEge1xcbiAgICAgICAgICBjb2xvcjogcmdiKDQ0LCA0NCwgNDQpO1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGlnaHQgLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1IZWFkaW5nMiwgLnNwZWN0cnVtLS1saWdodCAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUhlYWRpbmcyLCAuc3BlY3RydW0tLWxpZ2h0IC5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tSGVhZGluZzIge1xcbiAgICAgICAgICBjb2xvcjogcmdiKDQ0LCA0NCwgNDQpO1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGlnaHQgLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1IZWFkaW5nMywgLnNwZWN0cnVtLS1saWdodCAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUhlYWRpbmczLCAuc3BlY3RydW0tLWxpZ2h0IC5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tSGVhZGluZzMge1xcbiAgICAgICAgICBjb2xvcjogcmdiKDQ0LCA0NCwgNDQpO1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGlnaHQgLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1IZWFkaW5nNCwgLnNwZWN0cnVtLS1saWdodCAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUhlYWRpbmc0LCAuc3BlY3RydW0tLWxpZ2h0IC5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tSGVhZGluZzQge1xcbiAgICAgICAgICBjb2xvcjogcmdiKDQ0LCA0NCwgNDQpO1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGlnaHQgLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1IZWFkaW5nNSwgLnNwZWN0cnVtLS1saWdodCAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUhlYWRpbmc1LCAuc3BlY3RydW0tLWxpZ2h0IC5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tSGVhZGluZzUge1xcbiAgICAgICAgICBjb2xvcjogcmdiKDQ0LCA0NCwgNDQpO1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGlnaHQgLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1IZWFkaW5nNiwgLnNwZWN0cnVtLS1saWdodCAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUhlYWRpbmc2LCAuc3BlY3RydW0tLWxpZ2h0IC5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tSGVhZGluZzYge1xcbiAgICAgICAgICBjb2xvcjogcmdiKDQ0LCA0NCwgNDQpO1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGlnaHQgLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1TdWJoZWFkaW5nLCAuc3BlY3RydW0tLWxpZ2h0IC5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tU3ViaGVhZGluZywgLnNwZWN0cnVtLS1saWdodCAuc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLVN1YmhlYWRpbmcge1xcbiAgICAgICAgICBjb2xvcjogcmdiKDc1LCA3NSwgNzUpO1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGlnaHQgLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1EZXRhaWwsIC5zcGVjdHJ1bS0tbGlnaHQgLnNwZWN0cnVtOmxhbmcoa28pIC5zcGVjdHJ1bS1EZXRhaWwsIC5zcGVjdHJ1bS0tbGlnaHQgLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1EZXRhaWwge1xcbiAgICAgICAgICBjb2xvcjogcmdiKDc1LCA3NSwgNzUpO1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGlnaHQgLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1IZWFkaW5nMS0tcXVpZXQsIC5zcGVjdHJ1bS0tbGlnaHQgLnNwZWN0cnVtOmxhbmcoa28pIC5zcGVjdHJ1bS1IZWFkaW5nMS0tcXVpZXQsIC5zcGVjdHJ1bS0tbGlnaHQgLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1IZWFkaW5nMS0tcXVpZXQge1xcbiAgICAgICAgICBjb2xvcjogcmdiKDQ0LCA0NCwgNDQpO1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGlnaHQgLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1IZWFkaW5nMi0tcXVpZXQsIC5zcGVjdHJ1bS0tbGlnaHQgLnNwZWN0cnVtOmxhbmcoa28pIC5zcGVjdHJ1bS1IZWFkaW5nMi0tcXVpZXQsIC5zcGVjdHJ1bS0tbGlnaHQgLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1IZWFkaW5nMi0tcXVpZXQge1xcbiAgICAgICAgICBjb2xvcjogcmdiKDQ0LCA0NCwgNDQpO1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGlnaHQgLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1IZWFkaW5nMS0tc3Ryb25nLCAuc3BlY3RydW0tLWxpZ2h0IC5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tSGVhZGluZzEtLXN0cm9uZywgLnNwZWN0cnVtLS1saWdodCAuc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLUhlYWRpbmcxLS1zdHJvbmcge1xcbiAgICAgICAgICBjb2xvcjogcmdiKDQ0LCA0NCwgNDQpO1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGlnaHQgLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1IZWFkaW5nMi0tc3Ryb25nLCAuc3BlY3RydW0tLWxpZ2h0IC5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tSGVhZGluZzItLXN0cm9uZywgLnNwZWN0cnVtLS1saWdodCAuc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLUhlYWRpbmcyLS1zdHJvbmcge1xcbiAgICAgICAgICBjb2xvcjogcmdiKDQ0LCA0NCwgNDQpO1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGlnaHQgLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1IZWFkaW5nMS0tZGlzcGxheSwgLnNwZWN0cnVtLS1saWdodCAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUhlYWRpbmcxLS1kaXNwbGF5LCAuc3BlY3RydW0tLWxpZ2h0IC5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tSGVhZGluZzEtLWRpc3BsYXkge1xcbiAgICAgICAgICBjb2xvcjogcmdiKDQ0LCA0NCwgNDQpO1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGlnaHQgLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1IZWFkaW5nMi0tZGlzcGxheSwgLnNwZWN0cnVtLS1saWdodCAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUhlYWRpbmcyLS1kaXNwbGF5LCAuc3BlY3RydW0tLWxpZ2h0IC5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tSGVhZGluZzItLWRpc3BsYXkge1xcbiAgICAgICAgICBjb2xvcjogcmdiKDQ0LCA0NCwgNDQpO1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGlnaHQgLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1IZWFkaW5nMS0tZGlzcGxheS5zcGVjdHJ1bS1IZWFkaW5nMS0tc3Ryb25nLCAuc3BlY3RydW0tLWxpZ2h0IC5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tSGVhZGluZzEtLWRpc3BsYXkuc3BlY3RydW0tSGVhZGluZzEtLXN0cm9uZywgLnNwZWN0cnVtLS1saWdodCAuc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLUhlYWRpbmcxLS1kaXNwbGF5LnNwZWN0cnVtLUhlYWRpbmcxLS1zdHJvbmcge1xcbiAgICAgICAgICBjb2xvcjogcmdiKDQ0LCA0NCwgNDQpO1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGlnaHQgLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1IZWFkaW5nMi0tZGlzcGxheS5zcGVjdHJ1bS1IZWFkaW5nMi0tc3Ryb25nLCAuc3BlY3RydW0tLWxpZ2h0IC5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tSGVhZGluZzItLWRpc3BsYXkuc3BlY3RydW0tSGVhZGluZzItLXN0cm9uZywgLnNwZWN0cnVtLS1saWdodCAuc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLUhlYWRpbmcyLS1kaXNwbGF5LnNwZWN0cnVtLUhlYWRpbmcyLS1zdHJvbmcge1xcbiAgICAgICAgICBjb2xvcjogcmdiKDQ0LCA0NCwgNDQpO1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGlnaHQgLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1IZWFkaW5nMS0tZGlzcGxheS5zcGVjdHJ1bS1IZWFkaW5nMS0tcXVpZXQsIC5zcGVjdHJ1bS0tbGlnaHQgLnNwZWN0cnVtOmxhbmcoa28pIC5zcGVjdHJ1bS1IZWFkaW5nMS0tZGlzcGxheS5zcGVjdHJ1bS1IZWFkaW5nMS0tcXVpZXQsIC5zcGVjdHJ1bS0tbGlnaHQgLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1IZWFkaW5nMS0tZGlzcGxheS5zcGVjdHJ1bS1IZWFkaW5nMS0tcXVpZXQge1xcbiAgICAgICAgICBjb2xvcjogcmdiKDQ0LCA0NCwgNDQpO1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGlnaHQgLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1IZWFkaW5nMi0tZGlzcGxheS5zcGVjdHJ1bS1IZWFkaW5nMi0tcXVpZXQsIC5zcGVjdHJ1bS0tbGlnaHQgLnNwZWN0cnVtOmxhbmcoa28pIC5zcGVjdHJ1bS1IZWFkaW5nMi0tZGlzcGxheS5zcGVjdHJ1bS1IZWFkaW5nMi0tcXVpZXQsIC5zcGVjdHJ1bS0tbGlnaHQgLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1IZWFkaW5nMi0tZGlzcGxheS5zcGVjdHJ1bS1IZWFkaW5nMi0tcXVpZXQge1xcbiAgICAgICAgICBjb2xvcjogcmdiKDQ0LCA0NCwgNDQpO1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGlnaHQgLnNwZWN0cnVtLUNvZGUxIHtcXG4gICAgICAgICAgY29sb3I6IHJnYig3NSwgNzUsIDc1KTtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWxpZ2h0IC5zcGVjdHJ1bS1Db2RlMiB7XFxuICAgICAgICAgIGNvbG9yOiByZ2IoNzUsIDc1LCA3NSk7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1saWdodCAuc3BlY3RydW0tQ29kZTMge1xcbiAgICAgICAgICBjb2xvcjogcmdiKDc1LCA3NSwgNzUpO1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGlnaHQgLnNwZWN0cnVtLUNvZGU0IHtcXG4gICAgICAgICAgY29sb3I6IHJnYig3NSwgNzUsIDc1KTtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWxpZ2h0IC5zcGVjdHJ1bS1Db2RlNSB7XFxuICAgICAgICAgIGNvbG9yOiByZ2IoNzUsIDc1LCA3NSk7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1saWdodCxcXG4uc3BlY3RydW0tLWxpZ2h0IC5zcGVjdHJ1bS1Cb2R5IHtcXG4gIGNvbG9yOiByZ2IoNzUsIDc1LCA3NSk7XFxufVxcbi5zcGVjdHJ1bS0tbGlnaHQgLnNwZWN0cnVtLUJvZHktLWxhcmdlIHtcXG4gIGNvbG9yOiByZ2IoNzUsIDc1LCA3NSk7XFxufVxcbi5zcGVjdHJ1bS0tbGlnaHQgLnNwZWN0cnVtLUJvZHktLXNtYWxsIHtcXG4gIGNvbG9yOiByZ2IoNzUsIDc1LCA3NSk7XFxufVxcbi5zcGVjdHJ1bS0tbGlnaHQgLnNwZWN0cnVtLUJvZHktLXNlY29uZGFyeSB7XFxuICBjb2xvcjogcmdiKDExMiwgMTEyLCAxMTIpO1xcbn1cXG4uc3BlY3RydW0tLWxpZ2h0IC5zcGVjdHJ1bS1IZWFkaW5nLS1kaXNwbGF5IHtcXG4gIGNvbG9yOiByZ2IoNDQsIDQ0LCA0NCk7XFxufVxcbi5zcGVjdHJ1bS0tbGlnaHQgLnNwZWN0cnVtLUhlYWRpbmctLXBhZ2VUaXRsZSB7XFxuICBjb2xvcjogcmdiKDExMiwgMTEyLCAxMTIpO1xcbn1cXG4uc3BlY3RydW0tLWxpZ2h0IC5zcGVjdHJ1bS1IZWFkaW5nLS1zdWJ0aXRsZTEge1xcbiAgY29sb3I6IHJnYig0NCwgNDQsIDQ0KTtcXG59XFxuLnNwZWN0cnVtLS1saWdodCAuc3BlY3RydW0tSGVhZGluZy0tc3VidGl0bGUyIHtcXG4gIGNvbG9yOiByZ2IoNDQsIDQ0LCA0NCk7XFxufVxcbi5zcGVjdHJ1bS0tbGlnaHQgLnNwZWN0cnVtLUhlYWRpbmctLXN1YnRpdGxlMyB7XFxuICBjb2xvcjogcmdiKDExMiwgMTEyLCAxMTIpO1xcbn1cXG5cIiwgXCJcIl0pO1xuXG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///227\n')},function(module,exports,__webpack_require__){eval('exports = module.exports = __webpack_require__(6)(false);\n// Module\nexports.push([module.i, "/* generated from dna-version: 5.0.1 */\\n/* generated from dna-version: 5.0.1 */\\n/* Temporary skin variables that need to be moved into origins */\\n:root {\\n  /* Icon Button*/\\n\\n  /* Button */\\n\\n  /* Shell */\\n\\n  /* haha remove this */\\n\\n  /* Custom selection color for placeholders using global blue-500 at 30% opacity. Should be updated in Spectrum-DNA */\\n}\\n.spectrum--dark .spectrum-Body1 {\\n          color: rgb(205, 205, 205);\\n        }\\n.spectrum--dark .spectrum-Body2 {\\n          color: rgb(205, 205, 205);\\n        }\\n.spectrum--dark .spectrum-Body3 {\\n          color: rgb(205, 205, 205);\\n        }\\n.spectrum--dark .spectrum-Body4 {\\n          color: rgb(205, 205, 205);\\n        }\\n.spectrum--dark .spectrum-Body5 {\\n          color: rgb(205, 205, 205);\\n        }\\n.spectrum--dark .spectrum-Heading1 {\\n          color: rgb(255, 255, 255);\\n        }\\n.spectrum--dark .spectrum-Heading2 {\\n          color: rgb(255, 255, 255);\\n        }\\n.spectrum--dark .spectrum-Heading3 {\\n          color: rgb(255, 255, 255);\\n        }\\n.spectrum--dark .spectrum-Heading4 {\\n          color: rgb(255, 255, 255);\\n        }\\n.spectrum--dark .spectrum-Heading5 {\\n          color: rgb(255, 255, 255);\\n        }\\n.spectrum--dark .spectrum-Heading6 {\\n          color: rgb(255, 255, 255);\\n        }\\n.spectrum--dark .spectrum-Subheading {\\n          color: rgb(205, 205, 205);\\n        }\\n.spectrum--dark .spectrum-Detail {\\n          color: rgb(205, 205, 205);\\n        }\\n.spectrum--dark .spectrum-Heading1--quiet {\\n          color: rgb(255, 255, 255);\\n        }\\n.spectrum--dark .spectrum-Heading2--quiet {\\n          color: rgb(255, 255, 255);\\n        }\\n.spectrum--dark .spectrum-Heading1--strong {\\n          color: rgb(255, 255, 255);\\n        }\\n.spectrum--dark .spectrum-Heading2--strong {\\n          color: rgb(255, 255, 255);\\n        }\\n.spectrum--dark .spectrum-Heading1--display {\\n          color: rgb(255, 255, 255);\\n        }\\n.spectrum--dark .spectrum-Heading2--display {\\n          color: rgb(255, 255, 255);\\n        }\\n.spectrum--dark .spectrum-Heading1--display.spectrum-Heading1--strong {\\n          color: rgb(255, 255, 255);\\n        }\\n.spectrum--dark .spectrum-Heading2--display.spectrum-Heading2--strong {\\n          color: rgb(255, 255, 255);\\n        }\\n.spectrum--dark .spectrum-Heading1--display.spectrum-Heading1--quiet {\\n          color: rgb(255, 255, 255);\\n        }\\n.spectrum--dark .spectrum-Heading2--display.spectrum-Heading2--quiet {\\n          color: rgb(255, 255, 255);\\n        }\\n.spectrum--dark .spectrum-Article .spectrum-Body1 {\\n          color: rgb(205, 205, 205);\\n        }\\n.spectrum--dark .spectrum-Article .spectrum-Body2 {\\n          color: rgb(205, 205, 205);\\n        }\\n.spectrum--dark .spectrum-Article .spectrum-Body3 {\\n          color: rgb(205, 205, 205);\\n        }\\n.spectrum--dark .spectrum-Article .spectrum-Body4 {\\n          color: rgb(205, 205, 205);\\n        }\\n.spectrum--dark .spectrum-Article .spectrum-Body5 {\\n          color: rgb(205, 205, 205);\\n        }\\n.spectrum--dark .spectrum-Article .spectrum-Heading1 {\\n          color: rgb(255, 255, 255);\\n        }\\n.spectrum--dark .spectrum-Article .spectrum-Heading2 {\\n          color: rgb(255, 255, 255);\\n        }\\n.spectrum--dark .spectrum-Article .spectrum-Heading3 {\\n          color: rgb(255, 255, 255);\\n        }\\n.spectrum--dark .spectrum-Article .spectrum-Heading4 {\\n          color: rgb(255, 255, 255);\\n        }\\n.spectrum--dark .spectrum-Article .spectrum-Heading5 {\\n          color: rgb(255, 255, 255);\\n        }\\n.spectrum--dark .spectrum-Article .spectrum-Heading6 {\\n          color: rgb(255, 255, 255);\\n        }\\n.spectrum--dark .spectrum-Article .spectrum-Subheading {\\n          color: rgb(205, 205, 205);\\n        }\\n.spectrum--dark .spectrum-Article .spectrum-Detail {\\n          color: rgb(205, 205, 205);\\n        }\\n.spectrum--dark .spectrum-Article .spectrum-Heading1--quiet {\\n          color: rgb(255, 255, 255);\\n        }\\n.spectrum--dark .spectrum-Article .spectrum-Heading2--quiet {\\n          color: rgb(255, 255, 255);\\n        }\\n.spectrum--dark .spectrum-Article .spectrum-Heading1--display {\\n          color: rgb(255, 255, 255);\\n        }\\n.spectrum--dark .spectrum-Article .spectrum-Heading2--display {\\n          color: rgb(255, 255, 255);\\n        }\\n.spectrum--dark .spectrum-Article .spectrum-Heading1--display.spectrum-Heading1--quiet {\\n          color: rgb(255, 255, 255);\\n        }\\n.spectrum--dark .spectrum-Article .spectrum-Heading2--display.spectrum-Heading2--quiet {\\n          color: rgb(255, 255, 255);\\n        }\\n.spectrum--dark .spectrum:lang(ja) .spectrum-Body1, .spectrum--dark .spectrum:lang(ko) .spectrum-Body1, .spectrum--dark .spectrum:lang(zh) .spectrum-Body1 {\\n          color: rgb(205, 205, 205);\\n        }\\n.spectrum--dark .spectrum:lang(ja) .spectrum-Body2, .spectrum--dark .spectrum:lang(ko) .spectrum-Body2, .spectrum--dark .spectrum:lang(zh) .spectrum-Body2 {\\n          color: rgb(205, 205, 205);\\n        }\\n.spectrum--dark .spectrum:lang(ja) .spectrum-Body3, .spectrum--dark .spectrum:lang(ko) .spectrum-Body3, .spectrum--dark .spectrum:lang(zh) .spectrum-Body3 {\\n          color: rgb(205, 205, 205);\\n        }\\n.spectrum--dark .spectrum:lang(ja) .spectrum-Body4, .spectrum--dark .spectrum:lang(ko) .spectrum-Body4, .spectrum--dark .spectrum:lang(zh) .spectrum-Body4 {\\n          color: rgb(205, 205, 205);\\n        }\\n.spectrum--dark .spectrum:lang(ja) .spectrum-Body5, .spectrum--dark .spectrum:lang(ko) .spectrum-Body5, .spectrum--dark .spectrum:lang(zh) .spectrum-Body5 {\\n          color: rgb(205, 205, 205);\\n        }\\n.spectrum--dark .spectrum:lang(ja) .spectrum-Heading1, .spectrum--dark .spectrum:lang(ko) .spectrum-Heading1, .spectrum--dark .spectrum:lang(zh) .spectrum-Heading1 {\\n          color: rgb(255, 255, 255);\\n        }\\n.spectrum--dark .spectrum:lang(ja) .spectrum-Heading2, .spectrum--dark .spectrum:lang(ko) .spectrum-Heading2, .spectrum--dark .spectrum:lang(zh) .spectrum-Heading2 {\\n          color: rgb(255, 255, 255);\\n        }\\n.spectrum--dark .spectrum:lang(ja) .spectrum-Heading3, .spectrum--dark .spectrum:lang(ko) .spectrum-Heading3, .spectrum--dark .spectrum:lang(zh) .spectrum-Heading3 {\\n          color: rgb(255, 255, 255);\\n        }\\n.spectrum--dark .spectrum:lang(ja) .spectrum-Heading4, .spectrum--dark .spectrum:lang(ko) .spectrum-Heading4, .spectrum--dark .spectrum:lang(zh) .spectrum-Heading4 {\\n          color: rgb(255, 255, 255);\\n        }\\n.spectrum--dark .spectrum:lang(ja) .spectrum-Heading5, .spectrum--dark .spectrum:lang(ko) .spectrum-Heading5, .spectrum--dark .spectrum:lang(zh) .spectrum-Heading5 {\\n          color: rgb(255, 255, 255);\\n        }\\n.spectrum--dark .spectrum:lang(ja) .spectrum-Heading6, .spectrum--dark .spectrum:lang(ko) .spectrum-Heading6, .spectrum--dark .spectrum:lang(zh) .spectrum-Heading6 {\\n          color: rgb(255, 255, 255);\\n        }\\n.spectrum--dark .spectrum:lang(ja) .spectrum-Subheading, .spectrum--dark .spectrum:lang(ko) .spectrum-Subheading, .spectrum--dark .spectrum:lang(zh) .spectrum-Subheading {\\n          color: rgb(205, 205, 205);\\n        }\\n.spectrum--dark .spectrum:lang(ja) .spectrum-Detail, .spectrum--dark .spectrum:lang(ko) .spectrum-Detail, .spectrum--dark .spectrum:lang(zh) .spectrum-Detail {\\n          color: rgb(205, 205, 205);\\n        }\\n.spectrum--dark .spectrum:lang(ja) .spectrum-Heading1--quiet, .spectrum--dark .spectrum:lang(ko) .spectrum-Heading1--quiet, .spectrum--dark .spectrum:lang(zh) .spectrum-Heading1--quiet {\\n          color: rgb(255, 255, 255);\\n        }\\n.spectrum--dark .spectrum:lang(ja) .spectrum-Heading2--quiet, .spectrum--dark .spectrum:lang(ko) .spectrum-Heading2--quiet, .spectrum--dark .spectrum:lang(zh) .spectrum-Heading2--quiet {\\n          color: rgb(255, 255, 255);\\n        }\\n.spectrum--dark .spectrum:lang(ja) .spectrum-Heading1--strong, .spectrum--dark .spectrum:lang(ko) .spectrum-Heading1--strong, .spectrum--dark .spectrum:lang(zh) .spectrum-Heading1--strong {\\n          color: rgb(255, 255, 255);\\n        }\\n.spectrum--dark .spectrum:lang(ja) .spectrum-Heading2--strong, .spectrum--dark .spectrum:lang(ko) .spectrum-Heading2--strong, .spectrum--dark .spectrum:lang(zh) .spectrum-Heading2--strong {\\n          color: rgb(255, 255, 255);\\n        }\\n.spectrum--dark .spectrum:lang(ja) .spectrum-Heading1--display, .spectrum--dark .spectrum:lang(ko) .spectrum-Heading1--display, .spectrum--dark .spectrum:lang(zh) .spectrum-Heading1--display {\\n          color: rgb(255, 255, 255);\\n        }\\n.spectrum--dark .spectrum:lang(ja) .spectrum-Heading2--display, .spectrum--dark .spectrum:lang(ko) .spectrum-Heading2--display, .spectrum--dark .spectrum:lang(zh) .spectrum-Heading2--display {\\n          color: rgb(255, 255, 255);\\n        }\\n.spectrum--dark .spectrum:lang(ja) .spectrum-Heading1--display.spectrum-Heading1--strong, .spectrum--dark .spectrum:lang(ko) .spectrum-Heading1--display.spectrum-Heading1--strong, .spectrum--dark .spectrum:lang(zh) .spectrum-Heading1--display.spectrum-Heading1--strong {\\n          color: rgb(255, 255, 255);\\n        }\\n.spectrum--dark .spectrum:lang(ja) .spectrum-Heading2--display.spectrum-Heading2--strong, .spectrum--dark .spectrum:lang(ko) .spectrum-Heading2--display.spectrum-Heading2--strong, .spectrum--dark .spectrum:lang(zh) .spectrum-Heading2--display.spectrum-Heading2--strong {\\n          color: rgb(255, 255, 255);\\n        }\\n.spectrum--dark .spectrum:lang(ja) .spectrum-Heading1--display.spectrum-Heading1--quiet, .spectrum--dark .spectrum:lang(ko) .spectrum-Heading1--display.spectrum-Heading1--quiet, .spectrum--dark .spectrum:lang(zh) .spectrum-Heading1--display.spectrum-Heading1--quiet {\\n          color: rgb(255, 255, 255);\\n        }\\n.spectrum--dark .spectrum:lang(ja) .spectrum-Heading2--display.spectrum-Heading2--quiet, .spectrum--dark .spectrum:lang(ko) .spectrum-Heading2--display.spectrum-Heading2--quiet, .spectrum--dark .spectrum:lang(zh) .spectrum-Heading2--display.spectrum-Heading2--quiet {\\n          color: rgb(255, 255, 255);\\n        }\\n.spectrum--dark .spectrum-Code1 {\\n          color: rgb(205, 205, 205);\\n        }\\n.spectrum--dark .spectrum-Code2 {\\n          color: rgb(205, 205, 205);\\n        }\\n.spectrum--dark .spectrum-Code3 {\\n          color: rgb(205, 205, 205);\\n        }\\n.spectrum--dark .spectrum-Code4 {\\n          color: rgb(205, 205, 205);\\n        }\\n.spectrum--dark .spectrum-Code5 {\\n          color: rgb(205, 205, 205);\\n        }\\n.spectrum--dark,\\n.spectrum--dark .spectrum-Body {\\n  color: rgb(205, 205, 205);\\n}\\n.spectrum--dark .spectrum-Body--large {\\n  color: rgb(205, 205, 205);\\n}\\n.spectrum--dark .spectrum-Body--small {\\n  color: rgb(205, 205, 205);\\n}\\n.spectrum--dark .spectrum-Body--secondary {\\n  color: rgb(153, 153, 153);\\n}\\n.spectrum--dark .spectrum-Heading--display {\\n  color: rgb(255, 255, 255);\\n}\\n.spectrum--dark .spectrum-Heading--pageTitle {\\n  color: rgb(153, 153, 153);\\n}\\n.spectrum--dark .spectrum-Heading--subtitle1 {\\n  color: rgb(255, 255, 255);\\n}\\n.spectrum--dark .spectrum-Heading--subtitle2 {\\n  color: rgb(255, 255, 255);\\n}\\n.spectrum--dark .spectrum-Heading--subtitle3 {\\n  color: rgb(153, 153, 153);\\n}\\n", ""]);\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjI4LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0b3JxLW5hdGl2ZS9yZWFjdC1zcGVjdHJ1bS9zcGVjdHJ1bS1jc3Mtb3ZlcnJpZGVzL3R5cG9ncmFwaHkvbXVsdGlTdG9wcy9kYXJrLmNzcz8xMmYwIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCIuLi8uLi8uLi8uLi8uLi9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIikoZmFsc2UpO1xuLy8gTW9kdWxlXG5leHBvcnRzLnB1c2goW21vZHVsZS5pZCwgXCIvKiBnZW5lcmF0ZWQgZnJvbSBkbmEtdmVyc2lvbjogNS4wLjEgKi9cXG4vKiBnZW5lcmF0ZWQgZnJvbSBkbmEtdmVyc2lvbjogNS4wLjEgKi9cXG4vKiBUZW1wb3Jhcnkgc2tpbiB2YXJpYWJsZXMgdGhhdCBuZWVkIHRvIGJlIG1vdmVkIGludG8gb3JpZ2lucyAqL1xcbjpyb290IHtcXG4gIC8qIEljb24gQnV0dG9uKi9cXG5cXG4gIC8qIEJ1dHRvbiAqL1xcblxcbiAgLyogU2hlbGwgKi9cXG5cXG4gIC8qIGhhaGEgcmVtb3ZlIHRoaXMgKi9cXG5cXG4gIC8qIEN1c3RvbSBzZWxlY3Rpb24gY29sb3IgZm9yIHBsYWNlaG9sZGVycyB1c2luZyBnbG9iYWwgYmx1ZS01MDAgYXQgMzAlIG9wYWNpdHkuIFNob3VsZCBiZSB1cGRhdGVkIGluIFNwZWN0cnVtLUROQSAqL1xcbn1cXG4uc3BlY3RydW0tLWRhcmsgLnNwZWN0cnVtLUJvZHkxIHtcXG4gICAgICAgICAgY29sb3I6IHJnYigyMDUsIDIwNSwgMjA1KTtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWRhcmsgLnNwZWN0cnVtLUJvZHkyIHtcXG4gICAgICAgICAgY29sb3I6IHJnYigyMDUsIDIwNSwgMjA1KTtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWRhcmsgLnNwZWN0cnVtLUJvZHkzIHtcXG4gICAgICAgICAgY29sb3I6IHJnYigyMDUsIDIwNSwgMjA1KTtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWRhcmsgLnNwZWN0cnVtLUJvZHk0IHtcXG4gICAgICAgICAgY29sb3I6IHJnYigyMDUsIDIwNSwgMjA1KTtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWRhcmsgLnNwZWN0cnVtLUJvZHk1IHtcXG4gICAgICAgICAgY29sb3I6IHJnYigyMDUsIDIwNSwgMjA1KTtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWRhcmsgLnNwZWN0cnVtLUhlYWRpbmcxIHtcXG4gICAgICAgICAgY29sb3I6IHJnYigyNTUsIDI1NSwgMjU1KTtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWRhcmsgLnNwZWN0cnVtLUhlYWRpbmcyIHtcXG4gICAgICAgICAgY29sb3I6IHJnYigyNTUsIDI1NSwgMjU1KTtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWRhcmsgLnNwZWN0cnVtLUhlYWRpbmczIHtcXG4gICAgICAgICAgY29sb3I6IHJnYigyNTUsIDI1NSwgMjU1KTtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWRhcmsgLnNwZWN0cnVtLUhlYWRpbmc0IHtcXG4gICAgICAgICAgY29sb3I6IHJnYigyNTUsIDI1NSwgMjU1KTtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWRhcmsgLnNwZWN0cnVtLUhlYWRpbmc1IHtcXG4gICAgICAgICAgY29sb3I6IHJnYigyNTUsIDI1NSwgMjU1KTtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWRhcmsgLnNwZWN0cnVtLUhlYWRpbmc2IHtcXG4gICAgICAgICAgY29sb3I6IHJnYigyNTUsIDI1NSwgMjU1KTtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWRhcmsgLnNwZWN0cnVtLVN1YmhlYWRpbmcge1xcbiAgICAgICAgICBjb2xvcjogcmdiKDIwNSwgMjA1LCAyMDUpO1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS0tZGFyayAuc3BlY3RydW0tRGV0YWlsIHtcXG4gICAgICAgICAgY29sb3I6IHJnYigyMDUsIDIwNSwgMjA1KTtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWRhcmsgLnNwZWN0cnVtLUhlYWRpbmcxLS1xdWlldCB7XFxuICAgICAgICAgIGNvbG9yOiByZ2IoMjU1LCAyNTUsIDI1NSk7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1kYXJrIC5zcGVjdHJ1bS1IZWFkaW5nMi0tcXVpZXQge1xcbiAgICAgICAgICBjb2xvcjogcmdiKDI1NSwgMjU1LCAyNTUpO1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS0tZGFyayAuc3BlY3RydW0tSGVhZGluZzEtLXN0cm9uZyB7XFxuICAgICAgICAgIGNvbG9yOiByZ2IoMjU1LCAyNTUsIDI1NSk7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1kYXJrIC5zcGVjdHJ1bS1IZWFkaW5nMi0tc3Ryb25nIHtcXG4gICAgICAgICAgY29sb3I6IHJnYigyNTUsIDI1NSwgMjU1KTtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWRhcmsgLnNwZWN0cnVtLUhlYWRpbmcxLS1kaXNwbGF5IHtcXG4gICAgICAgICAgY29sb3I6IHJnYigyNTUsIDI1NSwgMjU1KTtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWRhcmsgLnNwZWN0cnVtLUhlYWRpbmcyLS1kaXNwbGF5IHtcXG4gICAgICAgICAgY29sb3I6IHJnYigyNTUsIDI1NSwgMjU1KTtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWRhcmsgLnNwZWN0cnVtLUhlYWRpbmcxLS1kaXNwbGF5LnNwZWN0cnVtLUhlYWRpbmcxLS1zdHJvbmcge1xcbiAgICAgICAgICBjb2xvcjogcmdiKDI1NSwgMjU1LCAyNTUpO1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS0tZGFyayAuc3BlY3RydW0tSGVhZGluZzItLWRpc3BsYXkuc3BlY3RydW0tSGVhZGluZzItLXN0cm9uZyB7XFxuICAgICAgICAgIGNvbG9yOiByZ2IoMjU1LCAyNTUsIDI1NSk7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1kYXJrIC5zcGVjdHJ1bS1IZWFkaW5nMS0tZGlzcGxheS5zcGVjdHJ1bS1IZWFkaW5nMS0tcXVpZXQge1xcbiAgICAgICAgICBjb2xvcjogcmdiKDI1NSwgMjU1LCAyNTUpO1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS0tZGFyayAuc3BlY3RydW0tSGVhZGluZzItLWRpc3BsYXkuc3BlY3RydW0tSGVhZGluZzItLXF1aWV0IHtcXG4gICAgICAgICAgY29sb3I6IHJnYigyNTUsIDI1NSwgMjU1KTtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWRhcmsgLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLUJvZHkxIHtcXG4gICAgICAgICAgY29sb3I6IHJnYigyMDUsIDIwNSwgMjA1KTtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWRhcmsgLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLUJvZHkyIHtcXG4gICAgICAgICAgY29sb3I6IHJnYigyMDUsIDIwNSwgMjA1KTtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWRhcmsgLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLUJvZHkzIHtcXG4gICAgICAgICAgY29sb3I6IHJnYigyMDUsIDIwNSwgMjA1KTtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWRhcmsgLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLUJvZHk0IHtcXG4gICAgICAgICAgY29sb3I6IHJnYigyMDUsIDIwNSwgMjA1KTtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWRhcmsgLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLUJvZHk1IHtcXG4gICAgICAgICAgY29sb3I6IHJnYigyMDUsIDIwNSwgMjA1KTtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWRhcmsgLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLUhlYWRpbmcxIHtcXG4gICAgICAgICAgY29sb3I6IHJnYigyNTUsIDI1NSwgMjU1KTtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWRhcmsgLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLUhlYWRpbmcyIHtcXG4gICAgICAgICAgY29sb3I6IHJnYigyNTUsIDI1NSwgMjU1KTtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWRhcmsgLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLUhlYWRpbmczIHtcXG4gICAgICAgICAgY29sb3I6IHJnYigyNTUsIDI1NSwgMjU1KTtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWRhcmsgLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLUhlYWRpbmc0IHtcXG4gICAgICAgICAgY29sb3I6IHJnYigyNTUsIDI1NSwgMjU1KTtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWRhcmsgLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLUhlYWRpbmc1IHtcXG4gICAgICAgICAgY29sb3I6IHJnYigyNTUsIDI1NSwgMjU1KTtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWRhcmsgLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLUhlYWRpbmc2IHtcXG4gICAgICAgICAgY29sb3I6IHJnYigyNTUsIDI1NSwgMjU1KTtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWRhcmsgLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLVN1YmhlYWRpbmcge1xcbiAgICAgICAgICBjb2xvcjogcmdiKDIwNSwgMjA1LCAyMDUpO1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS0tZGFyayAuc3BlY3RydW0tQXJ0aWNsZSAuc3BlY3RydW0tRGV0YWlsIHtcXG4gICAgICAgICAgY29sb3I6IHJnYigyMDUsIDIwNSwgMjA1KTtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWRhcmsgLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLUhlYWRpbmcxLS1xdWlldCB7XFxuICAgICAgICAgIGNvbG9yOiByZ2IoMjU1LCAyNTUsIDI1NSk7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1kYXJrIC5zcGVjdHJ1bS1BcnRpY2xlIC5zcGVjdHJ1bS1IZWFkaW5nMi0tcXVpZXQge1xcbiAgICAgICAgICBjb2xvcjogcmdiKDI1NSwgMjU1LCAyNTUpO1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS0tZGFyayAuc3BlY3RydW0tQXJ0aWNsZSAuc3BlY3RydW0tSGVhZGluZzEtLWRpc3BsYXkge1xcbiAgICAgICAgICBjb2xvcjogcmdiKDI1NSwgMjU1LCAyNTUpO1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS0tZGFyayAuc3BlY3RydW0tQXJ0aWNsZSAuc3BlY3RydW0tSGVhZGluZzItLWRpc3BsYXkge1xcbiAgICAgICAgICBjb2xvcjogcmdiKDI1NSwgMjU1LCAyNTUpO1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS0tZGFyayAuc3BlY3RydW0tQXJ0aWNsZSAuc3BlY3RydW0tSGVhZGluZzEtLWRpc3BsYXkuc3BlY3RydW0tSGVhZGluZzEtLXF1aWV0IHtcXG4gICAgICAgICAgY29sb3I6IHJnYigyNTUsIDI1NSwgMjU1KTtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWRhcmsgLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLUhlYWRpbmcyLS1kaXNwbGF5LnNwZWN0cnVtLUhlYWRpbmcyLS1xdWlldCB7XFxuICAgICAgICAgIGNvbG9yOiByZ2IoMjU1LCAyNTUsIDI1NSk7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1kYXJrIC5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tQm9keTEsIC5zcGVjdHJ1bS0tZGFyayAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUJvZHkxLCAuc3BlY3RydW0tLWRhcmsgLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1Cb2R5MSB7XFxuICAgICAgICAgIGNvbG9yOiByZ2IoMjA1LCAyMDUsIDIwNSk7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1kYXJrIC5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tQm9keTIsIC5zcGVjdHJ1bS0tZGFyayAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUJvZHkyLCAuc3BlY3RydW0tLWRhcmsgLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1Cb2R5MiB7XFxuICAgICAgICAgIGNvbG9yOiByZ2IoMjA1LCAyMDUsIDIwNSk7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1kYXJrIC5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tQm9keTMsIC5zcGVjdHJ1bS0tZGFyayAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUJvZHkzLCAuc3BlY3RydW0tLWRhcmsgLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1Cb2R5MyB7XFxuICAgICAgICAgIGNvbG9yOiByZ2IoMjA1LCAyMDUsIDIwNSk7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1kYXJrIC5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tQm9keTQsIC5zcGVjdHJ1bS0tZGFyayAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUJvZHk0LCAuc3BlY3RydW0tLWRhcmsgLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1Cb2R5NCB7XFxuICAgICAgICAgIGNvbG9yOiByZ2IoMjA1LCAyMDUsIDIwNSk7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1kYXJrIC5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tQm9keTUsIC5zcGVjdHJ1bS0tZGFyayAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUJvZHk1LCAuc3BlY3RydW0tLWRhcmsgLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1Cb2R5NSB7XFxuICAgICAgICAgIGNvbG9yOiByZ2IoMjA1LCAyMDUsIDIwNSk7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1kYXJrIC5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tSGVhZGluZzEsIC5zcGVjdHJ1bS0tZGFyayAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUhlYWRpbmcxLCAuc3BlY3RydW0tLWRhcmsgLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1IZWFkaW5nMSB7XFxuICAgICAgICAgIGNvbG9yOiByZ2IoMjU1LCAyNTUsIDI1NSk7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1kYXJrIC5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tSGVhZGluZzIsIC5zcGVjdHJ1bS0tZGFyayAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUhlYWRpbmcyLCAuc3BlY3RydW0tLWRhcmsgLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1IZWFkaW5nMiB7XFxuICAgICAgICAgIGNvbG9yOiByZ2IoMjU1LCAyNTUsIDI1NSk7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1kYXJrIC5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tSGVhZGluZzMsIC5zcGVjdHJ1bS0tZGFyayAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUhlYWRpbmczLCAuc3BlY3RydW0tLWRhcmsgLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1IZWFkaW5nMyB7XFxuICAgICAgICAgIGNvbG9yOiByZ2IoMjU1LCAyNTUsIDI1NSk7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1kYXJrIC5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tSGVhZGluZzQsIC5zcGVjdHJ1bS0tZGFyayAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUhlYWRpbmc0LCAuc3BlY3RydW0tLWRhcmsgLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1IZWFkaW5nNCB7XFxuICAgICAgICAgIGNvbG9yOiByZ2IoMjU1LCAyNTUsIDI1NSk7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1kYXJrIC5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tSGVhZGluZzUsIC5zcGVjdHJ1bS0tZGFyayAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUhlYWRpbmc1LCAuc3BlY3RydW0tLWRhcmsgLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1IZWFkaW5nNSB7XFxuICAgICAgICAgIGNvbG9yOiByZ2IoMjU1LCAyNTUsIDI1NSk7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1kYXJrIC5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tSGVhZGluZzYsIC5zcGVjdHJ1bS0tZGFyayAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUhlYWRpbmc2LCAuc3BlY3RydW0tLWRhcmsgLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1IZWFkaW5nNiB7XFxuICAgICAgICAgIGNvbG9yOiByZ2IoMjU1LCAyNTUsIDI1NSk7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1kYXJrIC5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tU3ViaGVhZGluZywgLnNwZWN0cnVtLS1kYXJrIC5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tU3ViaGVhZGluZywgLnNwZWN0cnVtLS1kYXJrIC5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tU3ViaGVhZGluZyB7XFxuICAgICAgICAgIGNvbG9yOiByZ2IoMjA1LCAyMDUsIDIwNSk7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1kYXJrIC5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tRGV0YWlsLCAuc3BlY3RydW0tLWRhcmsgLnNwZWN0cnVtOmxhbmcoa28pIC5zcGVjdHJ1bS1EZXRhaWwsIC5zcGVjdHJ1bS0tZGFyayAuc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLURldGFpbCB7XFxuICAgICAgICAgIGNvbG9yOiByZ2IoMjA1LCAyMDUsIDIwNSk7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1kYXJrIC5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tSGVhZGluZzEtLXF1aWV0LCAuc3BlY3RydW0tLWRhcmsgLnNwZWN0cnVtOmxhbmcoa28pIC5zcGVjdHJ1bS1IZWFkaW5nMS0tcXVpZXQsIC5zcGVjdHJ1bS0tZGFyayAuc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLUhlYWRpbmcxLS1xdWlldCB7XFxuICAgICAgICAgIGNvbG9yOiByZ2IoMjU1LCAyNTUsIDI1NSk7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1kYXJrIC5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tSGVhZGluZzItLXF1aWV0LCAuc3BlY3RydW0tLWRhcmsgLnNwZWN0cnVtOmxhbmcoa28pIC5zcGVjdHJ1bS1IZWFkaW5nMi0tcXVpZXQsIC5zcGVjdHJ1bS0tZGFyayAuc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLUhlYWRpbmcyLS1xdWlldCB7XFxuICAgICAgICAgIGNvbG9yOiByZ2IoMjU1LCAyNTUsIDI1NSk7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1kYXJrIC5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tSGVhZGluZzEtLXN0cm9uZywgLnNwZWN0cnVtLS1kYXJrIC5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tSGVhZGluZzEtLXN0cm9uZywgLnNwZWN0cnVtLS1kYXJrIC5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tSGVhZGluZzEtLXN0cm9uZyB7XFxuICAgICAgICAgIGNvbG9yOiByZ2IoMjU1LCAyNTUsIDI1NSk7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1kYXJrIC5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tSGVhZGluZzItLXN0cm9uZywgLnNwZWN0cnVtLS1kYXJrIC5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tSGVhZGluZzItLXN0cm9uZywgLnNwZWN0cnVtLS1kYXJrIC5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tSGVhZGluZzItLXN0cm9uZyB7XFxuICAgICAgICAgIGNvbG9yOiByZ2IoMjU1LCAyNTUsIDI1NSk7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1kYXJrIC5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tSGVhZGluZzEtLWRpc3BsYXksIC5zcGVjdHJ1bS0tZGFyayAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUhlYWRpbmcxLS1kaXNwbGF5LCAuc3BlY3RydW0tLWRhcmsgLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1IZWFkaW5nMS0tZGlzcGxheSB7XFxuICAgICAgICAgIGNvbG9yOiByZ2IoMjU1LCAyNTUsIDI1NSk7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1kYXJrIC5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tSGVhZGluZzItLWRpc3BsYXksIC5zcGVjdHJ1bS0tZGFyayAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUhlYWRpbmcyLS1kaXNwbGF5LCAuc3BlY3RydW0tLWRhcmsgLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1IZWFkaW5nMi0tZGlzcGxheSB7XFxuICAgICAgICAgIGNvbG9yOiByZ2IoMjU1LCAyNTUsIDI1NSk7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1kYXJrIC5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tSGVhZGluZzEtLWRpc3BsYXkuc3BlY3RydW0tSGVhZGluZzEtLXN0cm9uZywgLnNwZWN0cnVtLS1kYXJrIC5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tSGVhZGluZzEtLWRpc3BsYXkuc3BlY3RydW0tSGVhZGluZzEtLXN0cm9uZywgLnNwZWN0cnVtLS1kYXJrIC5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tSGVhZGluZzEtLWRpc3BsYXkuc3BlY3RydW0tSGVhZGluZzEtLXN0cm9uZyB7XFxuICAgICAgICAgIGNvbG9yOiByZ2IoMjU1LCAyNTUsIDI1NSk7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1kYXJrIC5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tSGVhZGluZzItLWRpc3BsYXkuc3BlY3RydW0tSGVhZGluZzItLXN0cm9uZywgLnNwZWN0cnVtLS1kYXJrIC5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tSGVhZGluZzItLWRpc3BsYXkuc3BlY3RydW0tSGVhZGluZzItLXN0cm9uZywgLnNwZWN0cnVtLS1kYXJrIC5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tSGVhZGluZzItLWRpc3BsYXkuc3BlY3RydW0tSGVhZGluZzItLXN0cm9uZyB7XFxuICAgICAgICAgIGNvbG9yOiByZ2IoMjU1LCAyNTUsIDI1NSk7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1kYXJrIC5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tSGVhZGluZzEtLWRpc3BsYXkuc3BlY3RydW0tSGVhZGluZzEtLXF1aWV0LCAuc3BlY3RydW0tLWRhcmsgLnNwZWN0cnVtOmxhbmcoa28pIC5zcGVjdHJ1bS1IZWFkaW5nMS0tZGlzcGxheS5zcGVjdHJ1bS1IZWFkaW5nMS0tcXVpZXQsIC5zcGVjdHJ1bS0tZGFyayAuc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLUhlYWRpbmcxLS1kaXNwbGF5LnNwZWN0cnVtLUhlYWRpbmcxLS1xdWlldCB7XFxuICAgICAgICAgIGNvbG9yOiByZ2IoMjU1LCAyNTUsIDI1NSk7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1kYXJrIC5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tSGVhZGluZzItLWRpc3BsYXkuc3BlY3RydW0tSGVhZGluZzItLXF1aWV0LCAuc3BlY3RydW0tLWRhcmsgLnNwZWN0cnVtOmxhbmcoa28pIC5zcGVjdHJ1bS1IZWFkaW5nMi0tZGlzcGxheS5zcGVjdHJ1bS1IZWFkaW5nMi0tcXVpZXQsIC5zcGVjdHJ1bS0tZGFyayAuc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLUhlYWRpbmcyLS1kaXNwbGF5LnNwZWN0cnVtLUhlYWRpbmcyLS1xdWlldCB7XFxuICAgICAgICAgIGNvbG9yOiByZ2IoMjU1LCAyNTUsIDI1NSk7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1kYXJrIC5zcGVjdHJ1bS1Db2RlMSB7XFxuICAgICAgICAgIGNvbG9yOiByZ2IoMjA1LCAyMDUsIDIwNSk7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1kYXJrIC5zcGVjdHJ1bS1Db2RlMiB7XFxuICAgICAgICAgIGNvbG9yOiByZ2IoMjA1LCAyMDUsIDIwNSk7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1kYXJrIC5zcGVjdHJ1bS1Db2RlMyB7XFxuICAgICAgICAgIGNvbG9yOiByZ2IoMjA1LCAyMDUsIDIwNSk7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1kYXJrIC5zcGVjdHJ1bS1Db2RlNCB7XFxuICAgICAgICAgIGNvbG9yOiByZ2IoMjA1LCAyMDUsIDIwNSk7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1kYXJrIC5zcGVjdHJ1bS1Db2RlNSB7XFxuICAgICAgICAgIGNvbG9yOiByZ2IoMjA1LCAyMDUsIDIwNSk7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1kYXJrLFxcbi5zcGVjdHJ1bS0tZGFyayAuc3BlY3RydW0tQm9keSB7XFxuICBjb2xvcjogcmdiKDIwNSwgMjA1LCAyMDUpO1xcbn1cXG4uc3BlY3RydW0tLWRhcmsgLnNwZWN0cnVtLUJvZHktLWxhcmdlIHtcXG4gIGNvbG9yOiByZ2IoMjA1LCAyMDUsIDIwNSk7XFxufVxcbi5zcGVjdHJ1bS0tZGFyayAuc3BlY3RydW0tQm9keS0tc21hbGwge1xcbiAgY29sb3I6IHJnYigyMDUsIDIwNSwgMjA1KTtcXG59XFxuLnNwZWN0cnVtLS1kYXJrIC5zcGVjdHJ1bS1Cb2R5LS1zZWNvbmRhcnkge1xcbiAgY29sb3I6IHJnYigxNTMsIDE1MywgMTUzKTtcXG59XFxuLnNwZWN0cnVtLS1kYXJrIC5zcGVjdHJ1bS1IZWFkaW5nLS1kaXNwbGF5IHtcXG4gIGNvbG9yOiByZ2IoMjU1LCAyNTUsIDI1NSk7XFxufVxcbi5zcGVjdHJ1bS0tZGFyayAuc3BlY3RydW0tSGVhZGluZy0tcGFnZVRpdGxlIHtcXG4gIGNvbG9yOiByZ2IoMTUzLCAxNTMsIDE1Myk7XFxufVxcbi5zcGVjdHJ1bS0tZGFyayAuc3BlY3RydW0tSGVhZGluZy0tc3VidGl0bGUxIHtcXG4gIGNvbG9yOiByZ2IoMjU1LCAyNTUsIDI1NSk7XFxufVxcbi5zcGVjdHJ1bS0tZGFyayAuc3BlY3RydW0tSGVhZGluZy0tc3VidGl0bGUyIHtcXG4gIGNvbG9yOiByZ2IoMjU1LCAyNTUsIDI1NSk7XFxufVxcbi5zcGVjdHJ1bS0tZGFyayAuc3BlY3RydW0tSGVhZGluZy0tc3VidGl0bGUzIHtcXG4gIGNvbG9yOiByZ2IoMTUzLCAxNTMsIDE1Myk7XFxufVxcblwiLCBcIlwiXSk7XG5cbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///228\n')},function(module,exports,__webpack_require__){eval('exports = module.exports = __webpack_require__(6)(false);\n// Module\nexports.push([module.i, "/* generated from dna-version: 5.0.1 */\\n/* generated from dna-version: 5.0.1 */\\n/* Temporary skin variables that need to be moved into origins */\\n:root {\\n  /* Icon Button*/\\n\\n  /* Button */\\n\\n  /* Shell */\\n\\n  /* haha remove this */\\n\\n  /* Custom selection color for placeholders using global blue-500 at 30% opacity. Should be updated in Spectrum-DNA */\\n}\\n.spectrum--lightest .spectrum-Body1 {\\n          color: rgb(80, 80, 80);\\n        }\\n.spectrum--lightest .spectrum-Body2 {\\n          color: rgb(80, 80, 80);\\n        }\\n.spectrum--lightest .spectrum-Body3 {\\n          color: rgb(80, 80, 80);\\n        }\\n.spectrum--lightest .spectrum-Body4 {\\n          color: rgb(80, 80, 80);\\n        }\\n.spectrum--lightest .spectrum-Body5 {\\n          color: rgb(80, 80, 80);\\n        }\\n.spectrum--lightest .spectrum-Heading1 {\\n          color: rgb(50, 50, 50);\\n        }\\n.spectrum--lightest .spectrum-Heading2 {\\n          color: rgb(50, 50, 50);\\n        }\\n.spectrum--lightest .spectrum-Heading3 {\\n          color: rgb(50, 50, 50);\\n        }\\n.spectrum--lightest .spectrum-Heading4 {\\n          color: rgb(50, 50, 50);\\n        }\\n.spectrum--lightest .spectrum-Heading5 {\\n          color: rgb(50, 50, 50);\\n        }\\n.spectrum--lightest .spectrum-Heading6 {\\n          color: rgb(50, 50, 50);\\n        }\\n.spectrum--lightest .spectrum-Subheading {\\n          color: rgb(80, 80, 80);\\n        }\\n.spectrum--lightest .spectrum-Detail {\\n          color: rgb(80, 80, 80);\\n        }\\n.spectrum--lightest .spectrum-Heading1--quiet {\\n          color: rgb(50, 50, 50);\\n        }\\n.spectrum--lightest .spectrum-Heading2--quiet {\\n          color: rgb(50, 50, 50);\\n        }\\n.spectrum--lightest .spectrum-Heading1--strong {\\n          color: rgb(50, 50, 50);\\n        }\\n.spectrum--lightest .spectrum-Heading2--strong {\\n          color: rgb(50, 50, 50);\\n        }\\n.spectrum--lightest .spectrum-Heading1--display {\\n          color: rgb(50, 50, 50);\\n        }\\n.spectrum--lightest .spectrum-Heading2--display {\\n          color: rgb(50, 50, 50);\\n        }\\n.spectrum--lightest .spectrum-Heading1--display.spectrum-Heading1--strong {\\n          color: rgb(50, 50, 50);\\n        }\\n.spectrum--lightest .spectrum-Heading2--display.spectrum-Heading2--strong {\\n          color: rgb(50, 50, 50);\\n        }\\n.spectrum--lightest .spectrum-Heading1--display.spectrum-Heading1--quiet {\\n          color: rgb(50, 50, 50);\\n        }\\n.spectrum--lightest .spectrum-Heading2--display.spectrum-Heading2--quiet {\\n          color: rgb(50, 50, 50);\\n        }\\n.spectrum--lightest .spectrum-Article .spectrum-Body1 {\\n          color: rgb(80, 80, 80);\\n        }\\n.spectrum--lightest .spectrum-Article .spectrum-Body2 {\\n          color: rgb(80, 80, 80);\\n        }\\n.spectrum--lightest .spectrum-Article .spectrum-Body3 {\\n          color: rgb(80, 80, 80);\\n        }\\n.spectrum--lightest .spectrum-Article .spectrum-Body4 {\\n          color: rgb(80, 80, 80);\\n        }\\n.spectrum--lightest .spectrum-Article .spectrum-Body5 {\\n          color: rgb(80, 80, 80);\\n        }\\n.spectrum--lightest .spectrum-Article .spectrum-Heading1 {\\n          color: rgb(50, 50, 50);\\n        }\\n.spectrum--lightest .spectrum-Article .spectrum-Heading2 {\\n          color: rgb(50, 50, 50);\\n        }\\n.spectrum--lightest .spectrum-Article .spectrum-Heading3 {\\n          color: rgb(50, 50, 50);\\n        }\\n.spectrum--lightest .spectrum-Article .spectrum-Heading4 {\\n          color: rgb(50, 50, 50);\\n        }\\n.spectrum--lightest .spectrum-Article .spectrum-Heading5 {\\n          color: rgb(50, 50, 50);\\n        }\\n.spectrum--lightest .spectrum-Article .spectrum-Heading6 {\\n          color: rgb(50, 50, 50);\\n        }\\n.spectrum--lightest .spectrum-Article .spectrum-Subheading {\\n          color: rgb(80, 80, 80);\\n        }\\n.spectrum--lightest .spectrum-Article .spectrum-Detail {\\n          color: rgb(80, 80, 80);\\n        }\\n.spectrum--lightest .spectrum-Article .spectrum-Heading1--quiet {\\n          color: rgb(50, 50, 50);\\n        }\\n.spectrum--lightest .spectrum-Article .spectrum-Heading2--quiet {\\n          color: rgb(50, 50, 50);\\n        }\\n.spectrum--lightest .spectrum-Article .spectrum-Heading1--display {\\n          color: rgb(50, 50, 50);\\n        }\\n.spectrum--lightest .spectrum-Article .spectrum-Heading2--display {\\n          color: rgb(50, 50, 50);\\n        }\\n.spectrum--lightest .spectrum-Article .spectrum-Heading1--display.spectrum-Heading1--quiet {\\n          color: rgb(50, 50, 50);\\n        }\\n.spectrum--lightest .spectrum-Article .spectrum-Heading2--display.spectrum-Heading2--quiet {\\n          color: rgb(50, 50, 50);\\n        }\\n.spectrum--lightest .spectrum:lang(ja) .spectrum-Body1, .spectrum--lightest .spectrum:lang(ko) .spectrum-Body1, .spectrum--lightest .spectrum:lang(zh) .spectrum-Body1 {\\n          color: rgb(80, 80, 80);\\n        }\\n.spectrum--lightest .spectrum:lang(ja) .spectrum-Body2, .spectrum--lightest .spectrum:lang(ko) .spectrum-Body2, .spectrum--lightest .spectrum:lang(zh) .spectrum-Body2 {\\n          color: rgb(80, 80, 80);\\n        }\\n.spectrum--lightest .spectrum:lang(ja) .spectrum-Body3, .spectrum--lightest .spectrum:lang(ko) .spectrum-Body3, .spectrum--lightest .spectrum:lang(zh) .spectrum-Body3 {\\n          color: rgb(80, 80, 80);\\n        }\\n.spectrum--lightest .spectrum:lang(ja) .spectrum-Body4, .spectrum--lightest .spectrum:lang(ko) .spectrum-Body4, .spectrum--lightest .spectrum:lang(zh) .spectrum-Body4 {\\n          color: rgb(80, 80, 80);\\n        }\\n.spectrum--lightest .spectrum:lang(ja) .spectrum-Body5, .spectrum--lightest .spectrum:lang(ko) .spectrum-Body5, .spectrum--lightest .spectrum:lang(zh) .spectrum-Body5 {\\n          color: rgb(80, 80, 80);\\n        }\\n.spectrum--lightest .spectrum:lang(ja) .spectrum-Heading1, .spectrum--lightest .spectrum:lang(ko) .spectrum-Heading1, .spectrum--lightest .spectrum:lang(zh) .spectrum-Heading1 {\\n          color: rgb(50, 50, 50);\\n        }\\n.spectrum--lightest .spectrum:lang(ja) .spectrum-Heading2, .spectrum--lightest .spectrum:lang(ko) .spectrum-Heading2, .spectrum--lightest .spectrum:lang(zh) .spectrum-Heading2 {\\n          color: rgb(50, 50, 50);\\n        }\\n.spectrum--lightest .spectrum:lang(ja) .spectrum-Heading3, .spectrum--lightest .spectrum:lang(ko) .spectrum-Heading3, .spectrum--lightest .spectrum:lang(zh) .spectrum-Heading3 {\\n          color: rgb(50, 50, 50);\\n        }\\n.spectrum--lightest .spectrum:lang(ja) .spectrum-Heading4, .spectrum--lightest .spectrum:lang(ko) .spectrum-Heading4, .spectrum--lightest .spectrum:lang(zh) .spectrum-Heading4 {\\n          color: rgb(50, 50, 50);\\n        }\\n.spectrum--lightest .spectrum:lang(ja) .spectrum-Heading5, .spectrum--lightest .spectrum:lang(ko) .spectrum-Heading5, .spectrum--lightest .spectrum:lang(zh) .spectrum-Heading5 {\\n          color: rgb(50, 50, 50);\\n        }\\n.spectrum--lightest .spectrum:lang(ja) .spectrum-Heading6, .spectrum--lightest .spectrum:lang(ko) .spectrum-Heading6, .spectrum--lightest .spectrum:lang(zh) .spectrum-Heading6 {\\n          color: rgb(50, 50, 50);\\n        }\\n.spectrum--lightest .spectrum:lang(ja) .spectrum-Subheading, .spectrum--lightest .spectrum:lang(ko) .spectrum-Subheading, .spectrum--lightest .spectrum:lang(zh) .spectrum-Subheading {\\n          color: rgb(80, 80, 80);\\n        }\\n.spectrum--lightest .spectrum:lang(ja) .spectrum-Detail, .spectrum--lightest .spectrum:lang(ko) .spectrum-Detail, .spectrum--lightest .spectrum:lang(zh) .spectrum-Detail {\\n          color: rgb(80, 80, 80);\\n        }\\n.spectrum--lightest .spectrum:lang(ja) .spectrum-Heading1--quiet, .spectrum--lightest .spectrum:lang(ko) .spectrum-Heading1--quiet, .spectrum--lightest .spectrum:lang(zh) .spectrum-Heading1--quiet {\\n          color: rgb(50, 50, 50);\\n        }\\n.spectrum--lightest .spectrum:lang(ja) .spectrum-Heading2--quiet, .spectrum--lightest .spectrum:lang(ko) .spectrum-Heading2--quiet, .spectrum--lightest .spectrum:lang(zh) .spectrum-Heading2--quiet {\\n          color: rgb(50, 50, 50);\\n        }\\n.spectrum--lightest .spectrum:lang(ja) .spectrum-Heading1--strong, .spectrum--lightest .spectrum:lang(ko) .spectrum-Heading1--strong, .spectrum--lightest .spectrum:lang(zh) .spectrum-Heading1--strong {\\n          color: rgb(50, 50, 50);\\n        }\\n.spectrum--lightest .spectrum:lang(ja) .spectrum-Heading2--strong, .spectrum--lightest .spectrum:lang(ko) .spectrum-Heading2--strong, .spectrum--lightest .spectrum:lang(zh) .spectrum-Heading2--strong {\\n          color: rgb(50, 50, 50);\\n        }\\n.spectrum--lightest .spectrum:lang(ja) .spectrum-Heading1--display, .spectrum--lightest .spectrum:lang(ko) .spectrum-Heading1--display, .spectrum--lightest .spectrum:lang(zh) .spectrum-Heading1--display {\\n          color: rgb(50, 50, 50);\\n        }\\n.spectrum--lightest .spectrum:lang(ja) .spectrum-Heading2--display, .spectrum--lightest .spectrum:lang(ko) .spectrum-Heading2--display, .spectrum--lightest .spectrum:lang(zh) .spectrum-Heading2--display {\\n          color: rgb(50, 50, 50);\\n        }\\n.spectrum--lightest .spectrum:lang(ja) .spectrum-Heading1--display.spectrum-Heading1--strong, .spectrum--lightest .spectrum:lang(ko) .spectrum-Heading1--display.spectrum-Heading1--strong, .spectrum--lightest .spectrum:lang(zh) .spectrum-Heading1--display.spectrum-Heading1--strong {\\n          color: rgb(50, 50, 50);\\n        }\\n.spectrum--lightest .spectrum:lang(ja) .spectrum-Heading2--display.spectrum-Heading2--strong, .spectrum--lightest .spectrum:lang(ko) .spectrum-Heading2--display.spectrum-Heading2--strong, .spectrum--lightest .spectrum:lang(zh) .spectrum-Heading2--display.spectrum-Heading2--strong {\\n          color: rgb(50, 50, 50);\\n        }\\n.spectrum--lightest .spectrum:lang(ja) .spectrum-Heading1--display.spectrum-Heading1--quiet, .spectrum--lightest .spectrum:lang(ko) .spectrum-Heading1--display.spectrum-Heading1--quiet, .spectrum--lightest .spectrum:lang(zh) .spectrum-Heading1--display.spectrum-Heading1--quiet {\\n          color: rgb(50, 50, 50);\\n        }\\n.spectrum--lightest .spectrum:lang(ja) .spectrum-Heading2--display.spectrum-Heading2--quiet, .spectrum--lightest .spectrum:lang(ko) .spectrum-Heading2--display.spectrum-Heading2--quiet, .spectrum--lightest .spectrum:lang(zh) .spectrum-Heading2--display.spectrum-Heading2--quiet {\\n          color: rgb(50, 50, 50);\\n        }\\n.spectrum--lightest .spectrum-Code1 {\\n          color: rgb(80, 80, 80);\\n        }\\n.spectrum--lightest .spectrum-Code2 {\\n          color: rgb(80, 80, 80);\\n        }\\n.spectrum--lightest .spectrum-Code3 {\\n          color: rgb(80, 80, 80);\\n        }\\n.spectrum--lightest .spectrum-Code4 {\\n          color: rgb(80, 80, 80);\\n        }\\n.spectrum--lightest .spectrum-Code5 {\\n          color: rgb(80, 80, 80);\\n        }\\n.spectrum--lightest,\\n.spectrum--lightest .spectrum-Body {\\n  color: rgb(80, 80, 80);\\n}\\n.spectrum--lightest .spectrum-Body--large {\\n  color: rgb(80, 80, 80);\\n}\\n.spectrum--lightest .spectrum-Body--small {\\n  color: rgb(80, 80, 80);\\n}\\n.spectrum--lightest .spectrum-Body--secondary {\\n  color: rgb(118, 118, 118);\\n}\\n.spectrum--lightest .spectrum-Heading--display {\\n  color: rgb(50, 50, 50);\\n}\\n.spectrum--lightest .spectrum-Heading--pageTitle {\\n  color: rgb(118, 118, 118);\\n}\\n.spectrum--lightest .spectrum-Heading--subtitle1 {\\n  color: rgb(50, 50, 50);\\n}\\n.spectrum--lightest .spectrum-Heading--subtitle2 {\\n  color: rgb(50, 50, 50);\\n}\\n.spectrum--lightest .spectrum-Heading--subtitle3 {\\n  color: rgb(118, 118, 118);\\n}\\n", ""]);\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjI5LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0b3JxLW5hdGl2ZS9yZWFjdC1zcGVjdHJ1bS9zcGVjdHJ1bS1jc3Mtb3ZlcnJpZGVzL3R5cG9ncmFwaHkvbXVsdGlTdG9wcy9saWdodGVzdC5jc3M/Mzc5MCJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiLi4vLi4vLi4vLi4vLi4vY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzXCIpKGZhbHNlKTtcbi8vIE1vZHVsZVxuZXhwb3J0cy5wdXNoKFttb2R1bGUuaWQsIFwiLyogZ2VuZXJhdGVkIGZyb20gZG5hLXZlcnNpb246IDUuMC4xICovXFxuLyogZ2VuZXJhdGVkIGZyb20gZG5hLXZlcnNpb246IDUuMC4xICovXFxuLyogVGVtcG9yYXJ5IHNraW4gdmFyaWFibGVzIHRoYXQgbmVlZCB0byBiZSBtb3ZlZCBpbnRvIG9yaWdpbnMgKi9cXG46cm9vdCB7XFxuICAvKiBJY29uIEJ1dHRvbiovXFxuXFxuICAvKiBCdXR0b24gKi9cXG5cXG4gIC8qIFNoZWxsICovXFxuXFxuICAvKiBoYWhhIHJlbW92ZSB0aGlzICovXFxuXFxuICAvKiBDdXN0b20gc2VsZWN0aW9uIGNvbG9yIGZvciBwbGFjZWhvbGRlcnMgdXNpbmcgZ2xvYmFsIGJsdWUtNTAwIGF0IDMwJSBvcGFjaXR5LiBTaG91bGQgYmUgdXBkYXRlZCBpbiBTcGVjdHJ1bS1ETkEgKi9cXG59XFxuLnNwZWN0cnVtLS1saWdodGVzdCAuc3BlY3RydW0tQm9keTEge1xcbiAgICAgICAgICBjb2xvcjogcmdiKDgwLCA4MCwgODApO1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGlnaHRlc3QgLnNwZWN0cnVtLUJvZHkyIHtcXG4gICAgICAgICAgY29sb3I6IHJnYig4MCwgODAsIDgwKTtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWxpZ2h0ZXN0IC5zcGVjdHJ1bS1Cb2R5MyB7XFxuICAgICAgICAgIGNvbG9yOiByZ2IoODAsIDgwLCA4MCk7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1saWdodGVzdCAuc3BlY3RydW0tQm9keTQge1xcbiAgICAgICAgICBjb2xvcjogcmdiKDgwLCA4MCwgODApO1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGlnaHRlc3QgLnNwZWN0cnVtLUJvZHk1IHtcXG4gICAgICAgICAgY29sb3I6IHJnYig4MCwgODAsIDgwKTtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWxpZ2h0ZXN0IC5zcGVjdHJ1bS1IZWFkaW5nMSB7XFxuICAgICAgICAgIGNvbG9yOiByZ2IoNTAsIDUwLCA1MCk7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1saWdodGVzdCAuc3BlY3RydW0tSGVhZGluZzIge1xcbiAgICAgICAgICBjb2xvcjogcmdiKDUwLCA1MCwgNTApO1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGlnaHRlc3QgLnNwZWN0cnVtLUhlYWRpbmczIHtcXG4gICAgICAgICAgY29sb3I6IHJnYig1MCwgNTAsIDUwKTtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWxpZ2h0ZXN0IC5zcGVjdHJ1bS1IZWFkaW5nNCB7XFxuICAgICAgICAgIGNvbG9yOiByZ2IoNTAsIDUwLCA1MCk7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1saWdodGVzdCAuc3BlY3RydW0tSGVhZGluZzUge1xcbiAgICAgICAgICBjb2xvcjogcmdiKDUwLCA1MCwgNTApO1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGlnaHRlc3QgLnNwZWN0cnVtLUhlYWRpbmc2IHtcXG4gICAgICAgICAgY29sb3I6IHJnYig1MCwgNTAsIDUwKTtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWxpZ2h0ZXN0IC5zcGVjdHJ1bS1TdWJoZWFkaW5nIHtcXG4gICAgICAgICAgY29sb3I6IHJnYig4MCwgODAsIDgwKTtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWxpZ2h0ZXN0IC5zcGVjdHJ1bS1EZXRhaWwge1xcbiAgICAgICAgICBjb2xvcjogcmdiKDgwLCA4MCwgODApO1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGlnaHRlc3QgLnNwZWN0cnVtLUhlYWRpbmcxLS1xdWlldCB7XFxuICAgICAgICAgIGNvbG9yOiByZ2IoNTAsIDUwLCA1MCk7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1saWdodGVzdCAuc3BlY3RydW0tSGVhZGluZzItLXF1aWV0IHtcXG4gICAgICAgICAgY29sb3I6IHJnYig1MCwgNTAsIDUwKTtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWxpZ2h0ZXN0IC5zcGVjdHJ1bS1IZWFkaW5nMS0tc3Ryb25nIHtcXG4gICAgICAgICAgY29sb3I6IHJnYig1MCwgNTAsIDUwKTtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWxpZ2h0ZXN0IC5zcGVjdHJ1bS1IZWFkaW5nMi0tc3Ryb25nIHtcXG4gICAgICAgICAgY29sb3I6IHJnYig1MCwgNTAsIDUwKTtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWxpZ2h0ZXN0IC5zcGVjdHJ1bS1IZWFkaW5nMS0tZGlzcGxheSB7XFxuICAgICAgICAgIGNvbG9yOiByZ2IoNTAsIDUwLCA1MCk7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1saWdodGVzdCAuc3BlY3RydW0tSGVhZGluZzItLWRpc3BsYXkge1xcbiAgICAgICAgICBjb2xvcjogcmdiKDUwLCA1MCwgNTApO1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGlnaHRlc3QgLnNwZWN0cnVtLUhlYWRpbmcxLS1kaXNwbGF5LnNwZWN0cnVtLUhlYWRpbmcxLS1zdHJvbmcge1xcbiAgICAgICAgICBjb2xvcjogcmdiKDUwLCA1MCwgNTApO1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGlnaHRlc3QgLnNwZWN0cnVtLUhlYWRpbmcyLS1kaXNwbGF5LnNwZWN0cnVtLUhlYWRpbmcyLS1zdHJvbmcge1xcbiAgICAgICAgICBjb2xvcjogcmdiKDUwLCA1MCwgNTApO1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGlnaHRlc3QgLnNwZWN0cnVtLUhlYWRpbmcxLS1kaXNwbGF5LnNwZWN0cnVtLUhlYWRpbmcxLS1xdWlldCB7XFxuICAgICAgICAgIGNvbG9yOiByZ2IoNTAsIDUwLCA1MCk7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1saWdodGVzdCAuc3BlY3RydW0tSGVhZGluZzItLWRpc3BsYXkuc3BlY3RydW0tSGVhZGluZzItLXF1aWV0IHtcXG4gICAgICAgICAgY29sb3I6IHJnYig1MCwgNTAsIDUwKTtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWxpZ2h0ZXN0IC5zcGVjdHJ1bS1BcnRpY2xlIC5zcGVjdHJ1bS1Cb2R5MSB7XFxuICAgICAgICAgIGNvbG9yOiByZ2IoODAsIDgwLCA4MCk7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1saWdodGVzdCAuc3BlY3RydW0tQXJ0aWNsZSAuc3BlY3RydW0tQm9keTIge1xcbiAgICAgICAgICBjb2xvcjogcmdiKDgwLCA4MCwgODApO1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGlnaHRlc3QgLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLUJvZHkzIHtcXG4gICAgICAgICAgY29sb3I6IHJnYig4MCwgODAsIDgwKTtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWxpZ2h0ZXN0IC5zcGVjdHJ1bS1BcnRpY2xlIC5zcGVjdHJ1bS1Cb2R5NCB7XFxuICAgICAgICAgIGNvbG9yOiByZ2IoODAsIDgwLCA4MCk7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1saWdodGVzdCAuc3BlY3RydW0tQXJ0aWNsZSAuc3BlY3RydW0tQm9keTUge1xcbiAgICAgICAgICBjb2xvcjogcmdiKDgwLCA4MCwgODApO1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGlnaHRlc3QgLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLUhlYWRpbmcxIHtcXG4gICAgICAgICAgY29sb3I6IHJnYig1MCwgNTAsIDUwKTtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWxpZ2h0ZXN0IC5zcGVjdHJ1bS1BcnRpY2xlIC5zcGVjdHJ1bS1IZWFkaW5nMiB7XFxuICAgICAgICAgIGNvbG9yOiByZ2IoNTAsIDUwLCA1MCk7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1saWdodGVzdCAuc3BlY3RydW0tQXJ0aWNsZSAuc3BlY3RydW0tSGVhZGluZzMge1xcbiAgICAgICAgICBjb2xvcjogcmdiKDUwLCA1MCwgNTApO1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGlnaHRlc3QgLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLUhlYWRpbmc0IHtcXG4gICAgICAgICAgY29sb3I6IHJnYig1MCwgNTAsIDUwKTtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWxpZ2h0ZXN0IC5zcGVjdHJ1bS1BcnRpY2xlIC5zcGVjdHJ1bS1IZWFkaW5nNSB7XFxuICAgICAgICAgIGNvbG9yOiByZ2IoNTAsIDUwLCA1MCk7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1saWdodGVzdCAuc3BlY3RydW0tQXJ0aWNsZSAuc3BlY3RydW0tSGVhZGluZzYge1xcbiAgICAgICAgICBjb2xvcjogcmdiKDUwLCA1MCwgNTApO1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGlnaHRlc3QgLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLVN1YmhlYWRpbmcge1xcbiAgICAgICAgICBjb2xvcjogcmdiKDgwLCA4MCwgODApO1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGlnaHRlc3QgLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLURldGFpbCB7XFxuICAgICAgICAgIGNvbG9yOiByZ2IoODAsIDgwLCA4MCk7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1saWdodGVzdCAuc3BlY3RydW0tQXJ0aWNsZSAuc3BlY3RydW0tSGVhZGluZzEtLXF1aWV0IHtcXG4gICAgICAgICAgY29sb3I6IHJnYig1MCwgNTAsIDUwKTtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWxpZ2h0ZXN0IC5zcGVjdHJ1bS1BcnRpY2xlIC5zcGVjdHJ1bS1IZWFkaW5nMi0tcXVpZXQge1xcbiAgICAgICAgICBjb2xvcjogcmdiKDUwLCA1MCwgNTApO1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGlnaHRlc3QgLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLUhlYWRpbmcxLS1kaXNwbGF5IHtcXG4gICAgICAgICAgY29sb3I6IHJnYig1MCwgNTAsIDUwKTtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWxpZ2h0ZXN0IC5zcGVjdHJ1bS1BcnRpY2xlIC5zcGVjdHJ1bS1IZWFkaW5nMi0tZGlzcGxheSB7XFxuICAgICAgICAgIGNvbG9yOiByZ2IoNTAsIDUwLCA1MCk7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1saWdodGVzdCAuc3BlY3RydW0tQXJ0aWNsZSAuc3BlY3RydW0tSGVhZGluZzEtLWRpc3BsYXkuc3BlY3RydW0tSGVhZGluZzEtLXF1aWV0IHtcXG4gICAgICAgICAgY29sb3I6IHJnYig1MCwgNTAsIDUwKTtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWxpZ2h0ZXN0IC5zcGVjdHJ1bS1BcnRpY2xlIC5zcGVjdHJ1bS1IZWFkaW5nMi0tZGlzcGxheS5zcGVjdHJ1bS1IZWFkaW5nMi0tcXVpZXQge1xcbiAgICAgICAgICBjb2xvcjogcmdiKDUwLCA1MCwgNTApO1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGlnaHRlc3QgLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1Cb2R5MSwgLnNwZWN0cnVtLS1saWdodGVzdCAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUJvZHkxLCAuc3BlY3RydW0tLWxpZ2h0ZXN0IC5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tQm9keTEge1xcbiAgICAgICAgICBjb2xvcjogcmdiKDgwLCA4MCwgODApO1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGlnaHRlc3QgLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1Cb2R5MiwgLnNwZWN0cnVtLS1saWdodGVzdCAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUJvZHkyLCAuc3BlY3RydW0tLWxpZ2h0ZXN0IC5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tQm9keTIge1xcbiAgICAgICAgICBjb2xvcjogcmdiKDgwLCA4MCwgODApO1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGlnaHRlc3QgLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1Cb2R5MywgLnNwZWN0cnVtLS1saWdodGVzdCAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUJvZHkzLCAuc3BlY3RydW0tLWxpZ2h0ZXN0IC5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tQm9keTMge1xcbiAgICAgICAgICBjb2xvcjogcmdiKDgwLCA4MCwgODApO1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGlnaHRlc3QgLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1Cb2R5NCwgLnNwZWN0cnVtLS1saWdodGVzdCAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUJvZHk0LCAuc3BlY3RydW0tLWxpZ2h0ZXN0IC5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tQm9keTQge1xcbiAgICAgICAgICBjb2xvcjogcmdiKDgwLCA4MCwgODApO1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGlnaHRlc3QgLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1Cb2R5NSwgLnNwZWN0cnVtLS1saWdodGVzdCAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUJvZHk1LCAuc3BlY3RydW0tLWxpZ2h0ZXN0IC5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tQm9keTUge1xcbiAgICAgICAgICBjb2xvcjogcmdiKDgwLCA4MCwgODApO1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGlnaHRlc3QgLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1IZWFkaW5nMSwgLnNwZWN0cnVtLS1saWdodGVzdCAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUhlYWRpbmcxLCAuc3BlY3RydW0tLWxpZ2h0ZXN0IC5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tSGVhZGluZzEge1xcbiAgICAgICAgICBjb2xvcjogcmdiKDUwLCA1MCwgNTApO1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGlnaHRlc3QgLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1IZWFkaW5nMiwgLnNwZWN0cnVtLS1saWdodGVzdCAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUhlYWRpbmcyLCAuc3BlY3RydW0tLWxpZ2h0ZXN0IC5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tSGVhZGluZzIge1xcbiAgICAgICAgICBjb2xvcjogcmdiKDUwLCA1MCwgNTApO1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGlnaHRlc3QgLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1IZWFkaW5nMywgLnNwZWN0cnVtLS1saWdodGVzdCAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUhlYWRpbmczLCAuc3BlY3RydW0tLWxpZ2h0ZXN0IC5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tSGVhZGluZzMge1xcbiAgICAgICAgICBjb2xvcjogcmdiKDUwLCA1MCwgNTApO1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGlnaHRlc3QgLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1IZWFkaW5nNCwgLnNwZWN0cnVtLS1saWdodGVzdCAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUhlYWRpbmc0LCAuc3BlY3RydW0tLWxpZ2h0ZXN0IC5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tSGVhZGluZzQge1xcbiAgICAgICAgICBjb2xvcjogcmdiKDUwLCA1MCwgNTApO1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGlnaHRlc3QgLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1IZWFkaW5nNSwgLnNwZWN0cnVtLS1saWdodGVzdCAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUhlYWRpbmc1LCAuc3BlY3RydW0tLWxpZ2h0ZXN0IC5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tSGVhZGluZzUge1xcbiAgICAgICAgICBjb2xvcjogcmdiKDUwLCA1MCwgNTApO1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGlnaHRlc3QgLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1IZWFkaW5nNiwgLnNwZWN0cnVtLS1saWdodGVzdCAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUhlYWRpbmc2LCAuc3BlY3RydW0tLWxpZ2h0ZXN0IC5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tSGVhZGluZzYge1xcbiAgICAgICAgICBjb2xvcjogcmdiKDUwLCA1MCwgNTApO1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGlnaHRlc3QgLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1TdWJoZWFkaW5nLCAuc3BlY3RydW0tLWxpZ2h0ZXN0IC5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tU3ViaGVhZGluZywgLnNwZWN0cnVtLS1saWdodGVzdCAuc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLVN1YmhlYWRpbmcge1xcbiAgICAgICAgICBjb2xvcjogcmdiKDgwLCA4MCwgODApO1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGlnaHRlc3QgLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1EZXRhaWwsIC5zcGVjdHJ1bS0tbGlnaHRlc3QgLnNwZWN0cnVtOmxhbmcoa28pIC5zcGVjdHJ1bS1EZXRhaWwsIC5zcGVjdHJ1bS0tbGlnaHRlc3QgLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1EZXRhaWwge1xcbiAgICAgICAgICBjb2xvcjogcmdiKDgwLCA4MCwgODApO1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGlnaHRlc3QgLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1IZWFkaW5nMS0tcXVpZXQsIC5zcGVjdHJ1bS0tbGlnaHRlc3QgLnNwZWN0cnVtOmxhbmcoa28pIC5zcGVjdHJ1bS1IZWFkaW5nMS0tcXVpZXQsIC5zcGVjdHJ1bS0tbGlnaHRlc3QgLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1IZWFkaW5nMS0tcXVpZXQge1xcbiAgICAgICAgICBjb2xvcjogcmdiKDUwLCA1MCwgNTApO1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGlnaHRlc3QgLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1IZWFkaW5nMi0tcXVpZXQsIC5zcGVjdHJ1bS0tbGlnaHRlc3QgLnNwZWN0cnVtOmxhbmcoa28pIC5zcGVjdHJ1bS1IZWFkaW5nMi0tcXVpZXQsIC5zcGVjdHJ1bS0tbGlnaHRlc3QgLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1IZWFkaW5nMi0tcXVpZXQge1xcbiAgICAgICAgICBjb2xvcjogcmdiKDUwLCA1MCwgNTApO1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGlnaHRlc3QgLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1IZWFkaW5nMS0tc3Ryb25nLCAuc3BlY3RydW0tLWxpZ2h0ZXN0IC5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tSGVhZGluZzEtLXN0cm9uZywgLnNwZWN0cnVtLS1saWdodGVzdCAuc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLUhlYWRpbmcxLS1zdHJvbmcge1xcbiAgICAgICAgICBjb2xvcjogcmdiKDUwLCA1MCwgNTApO1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGlnaHRlc3QgLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1IZWFkaW5nMi0tc3Ryb25nLCAuc3BlY3RydW0tLWxpZ2h0ZXN0IC5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tSGVhZGluZzItLXN0cm9uZywgLnNwZWN0cnVtLS1saWdodGVzdCAuc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLUhlYWRpbmcyLS1zdHJvbmcge1xcbiAgICAgICAgICBjb2xvcjogcmdiKDUwLCA1MCwgNTApO1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGlnaHRlc3QgLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1IZWFkaW5nMS0tZGlzcGxheSwgLnNwZWN0cnVtLS1saWdodGVzdCAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUhlYWRpbmcxLS1kaXNwbGF5LCAuc3BlY3RydW0tLWxpZ2h0ZXN0IC5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tSGVhZGluZzEtLWRpc3BsYXkge1xcbiAgICAgICAgICBjb2xvcjogcmdiKDUwLCA1MCwgNTApO1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGlnaHRlc3QgLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1IZWFkaW5nMi0tZGlzcGxheSwgLnNwZWN0cnVtLS1saWdodGVzdCAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUhlYWRpbmcyLS1kaXNwbGF5LCAuc3BlY3RydW0tLWxpZ2h0ZXN0IC5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tSGVhZGluZzItLWRpc3BsYXkge1xcbiAgICAgICAgICBjb2xvcjogcmdiKDUwLCA1MCwgNTApO1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGlnaHRlc3QgLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1IZWFkaW5nMS0tZGlzcGxheS5zcGVjdHJ1bS1IZWFkaW5nMS0tc3Ryb25nLCAuc3BlY3RydW0tLWxpZ2h0ZXN0IC5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tSGVhZGluZzEtLWRpc3BsYXkuc3BlY3RydW0tSGVhZGluZzEtLXN0cm9uZywgLnNwZWN0cnVtLS1saWdodGVzdCAuc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLUhlYWRpbmcxLS1kaXNwbGF5LnNwZWN0cnVtLUhlYWRpbmcxLS1zdHJvbmcge1xcbiAgICAgICAgICBjb2xvcjogcmdiKDUwLCA1MCwgNTApO1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGlnaHRlc3QgLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1IZWFkaW5nMi0tZGlzcGxheS5zcGVjdHJ1bS1IZWFkaW5nMi0tc3Ryb25nLCAuc3BlY3RydW0tLWxpZ2h0ZXN0IC5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tSGVhZGluZzItLWRpc3BsYXkuc3BlY3RydW0tSGVhZGluZzItLXN0cm9uZywgLnNwZWN0cnVtLS1saWdodGVzdCAuc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLUhlYWRpbmcyLS1kaXNwbGF5LnNwZWN0cnVtLUhlYWRpbmcyLS1zdHJvbmcge1xcbiAgICAgICAgICBjb2xvcjogcmdiKDUwLCA1MCwgNTApO1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGlnaHRlc3QgLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1IZWFkaW5nMS0tZGlzcGxheS5zcGVjdHJ1bS1IZWFkaW5nMS0tcXVpZXQsIC5zcGVjdHJ1bS0tbGlnaHRlc3QgLnNwZWN0cnVtOmxhbmcoa28pIC5zcGVjdHJ1bS1IZWFkaW5nMS0tZGlzcGxheS5zcGVjdHJ1bS1IZWFkaW5nMS0tcXVpZXQsIC5zcGVjdHJ1bS0tbGlnaHRlc3QgLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1IZWFkaW5nMS0tZGlzcGxheS5zcGVjdHJ1bS1IZWFkaW5nMS0tcXVpZXQge1xcbiAgICAgICAgICBjb2xvcjogcmdiKDUwLCA1MCwgNTApO1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGlnaHRlc3QgLnNwZWN0cnVtOmxhbmcoamEpIC5zcGVjdHJ1bS1IZWFkaW5nMi0tZGlzcGxheS5zcGVjdHJ1bS1IZWFkaW5nMi0tcXVpZXQsIC5zcGVjdHJ1bS0tbGlnaHRlc3QgLnNwZWN0cnVtOmxhbmcoa28pIC5zcGVjdHJ1bS1IZWFkaW5nMi0tZGlzcGxheS5zcGVjdHJ1bS1IZWFkaW5nMi0tcXVpZXQsIC5zcGVjdHJ1bS0tbGlnaHRlc3QgLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1IZWFkaW5nMi0tZGlzcGxheS5zcGVjdHJ1bS1IZWFkaW5nMi0tcXVpZXQge1xcbiAgICAgICAgICBjb2xvcjogcmdiKDUwLCA1MCwgNTApO1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGlnaHRlc3QgLnNwZWN0cnVtLUNvZGUxIHtcXG4gICAgICAgICAgY29sb3I6IHJnYig4MCwgODAsIDgwKTtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWxpZ2h0ZXN0IC5zcGVjdHJ1bS1Db2RlMiB7XFxuICAgICAgICAgIGNvbG9yOiByZ2IoODAsIDgwLCA4MCk7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1saWdodGVzdCAuc3BlY3RydW0tQ29kZTMge1xcbiAgICAgICAgICBjb2xvcjogcmdiKDgwLCA4MCwgODApO1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS0tbGlnaHRlc3QgLnNwZWN0cnVtLUNvZGU0IHtcXG4gICAgICAgICAgY29sb3I6IHJnYig4MCwgODAsIDgwKTtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWxpZ2h0ZXN0IC5zcGVjdHJ1bS1Db2RlNSB7XFxuICAgICAgICAgIGNvbG9yOiByZ2IoODAsIDgwLCA4MCk7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1saWdodGVzdCxcXG4uc3BlY3RydW0tLWxpZ2h0ZXN0IC5zcGVjdHJ1bS1Cb2R5IHtcXG4gIGNvbG9yOiByZ2IoODAsIDgwLCA4MCk7XFxufVxcbi5zcGVjdHJ1bS0tbGlnaHRlc3QgLnNwZWN0cnVtLUJvZHktLWxhcmdlIHtcXG4gIGNvbG9yOiByZ2IoODAsIDgwLCA4MCk7XFxufVxcbi5zcGVjdHJ1bS0tbGlnaHRlc3QgLnNwZWN0cnVtLUJvZHktLXNtYWxsIHtcXG4gIGNvbG9yOiByZ2IoODAsIDgwLCA4MCk7XFxufVxcbi5zcGVjdHJ1bS0tbGlnaHRlc3QgLnNwZWN0cnVtLUJvZHktLXNlY29uZGFyeSB7XFxuICBjb2xvcjogcmdiKDExOCwgMTE4LCAxMTgpO1xcbn1cXG4uc3BlY3RydW0tLWxpZ2h0ZXN0IC5zcGVjdHJ1bS1IZWFkaW5nLS1kaXNwbGF5IHtcXG4gIGNvbG9yOiByZ2IoNTAsIDUwLCA1MCk7XFxufVxcbi5zcGVjdHJ1bS0tbGlnaHRlc3QgLnNwZWN0cnVtLUhlYWRpbmctLXBhZ2VUaXRsZSB7XFxuICBjb2xvcjogcmdiKDExOCwgMTE4LCAxMTgpO1xcbn1cXG4uc3BlY3RydW0tLWxpZ2h0ZXN0IC5zcGVjdHJ1bS1IZWFkaW5nLS1zdWJ0aXRsZTEge1xcbiAgY29sb3I6IHJnYig1MCwgNTAsIDUwKTtcXG59XFxuLnNwZWN0cnVtLS1saWdodGVzdCAuc3BlY3RydW0tSGVhZGluZy0tc3VidGl0bGUyIHtcXG4gIGNvbG9yOiByZ2IoNTAsIDUwLCA1MCk7XFxufVxcbi5zcGVjdHJ1bS0tbGlnaHRlc3QgLnNwZWN0cnVtLUhlYWRpbmctLXN1YnRpdGxlMyB7XFxuICBjb2xvcjogcmdiKDExOCwgMTE4LCAxMTgpO1xcbn1cXG5cIiwgXCJcIl0pO1xuXG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///229\n')},function(module,exports,__webpack_require__){eval('exports = module.exports = __webpack_require__(6)(false);\n// Module\nexports.push([module.i, "/* generated from dna-version: 5.0.1 */\\n/* generated from dna-version: 5.0.1 */\\n/* Temporary skin variables that need to be moved into origins */\\n:root {\\n  /* Icon Button*/\\n\\n  /* Button */\\n\\n  /* Shell */\\n\\n  /* haha remove this */\\n\\n  /* Custom selection color for placeholders using global blue-500 at 30% opacity. Should be updated in Spectrum-DNA */\\n}\\n.spectrum--darkest .spectrum-Body1 {\\n          color: rgb(180, 180, 180);\\n        }\\n.spectrum--darkest .spectrum-Body2 {\\n          color: rgb(180, 180, 180);\\n        }\\n.spectrum--darkest .spectrum-Body3 {\\n          color: rgb(180, 180, 180);\\n        }\\n.spectrum--darkest .spectrum-Body4 {\\n          color: rgb(180, 180, 180);\\n        }\\n.spectrum--darkest .spectrum-Body5 {\\n          color: rgb(180, 180, 180);\\n        }\\n.spectrum--darkest .spectrum-Heading1 {\\n          color: rgb(226, 226, 226);\\n        }\\n.spectrum--darkest .spectrum-Heading2 {\\n          color: rgb(226, 226, 226);\\n        }\\n.spectrum--darkest .spectrum-Heading3 {\\n          color: rgb(226, 226, 226);\\n        }\\n.spectrum--darkest .spectrum-Heading4 {\\n          color: rgb(226, 226, 226);\\n        }\\n.spectrum--darkest .spectrum-Heading5 {\\n          color: rgb(226, 226, 226);\\n        }\\n.spectrum--darkest .spectrum-Heading6 {\\n          color: rgb(226, 226, 226);\\n        }\\n.spectrum--darkest .spectrum-Subheading {\\n          color: rgb(180, 180, 180);\\n        }\\n.spectrum--darkest .spectrum-Detail {\\n          color: rgb(180, 180, 180);\\n        }\\n.spectrum--darkest .spectrum-Heading1--quiet {\\n          color: rgb(226, 226, 226);\\n        }\\n.spectrum--darkest .spectrum-Heading2--quiet {\\n          color: rgb(226, 226, 226);\\n        }\\n.spectrum--darkest .spectrum-Heading1--strong {\\n          color: rgb(226, 226, 226);\\n        }\\n.spectrum--darkest .spectrum-Heading2--strong {\\n          color: rgb(226, 226, 226);\\n        }\\n.spectrum--darkest .spectrum-Heading1--display {\\n          color: rgb(226, 226, 226);\\n        }\\n.spectrum--darkest .spectrum-Heading2--display {\\n          color: rgb(226, 226, 226);\\n        }\\n.spectrum--darkest .spectrum-Heading1--display.spectrum-Heading1--strong {\\n          color: rgb(226, 226, 226);\\n        }\\n.spectrum--darkest .spectrum-Heading2--display.spectrum-Heading2--strong {\\n          color: rgb(226, 226, 226);\\n        }\\n.spectrum--darkest .spectrum-Heading1--display.spectrum-Heading1--quiet {\\n          color: rgb(226, 226, 226);\\n        }\\n.spectrum--darkest .spectrum-Heading2--display.spectrum-Heading2--quiet {\\n          color: rgb(226, 226, 226);\\n        }\\n.spectrum--darkest .spectrum-Article .spectrum-Body1 {\\n          color: rgb(180, 180, 180);\\n        }\\n.spectrum--darkest .spectrum-Article .spectrum-Body2 {\\n          color: rgb(180, 180, 180);\\n        }\\n.spectrum--darkest .spectrum-Article .spectrum-Body3 {\\n          color: rgb(180, 180, 180);\\n        }\\n.spectrum--darkest .spectrum-Article .spectrum-Body4 {\\n          color: rgb(180, 180, 180);\\n        }\\n.spectrum--darkest .spectrum-Article .spectrum-Body5 {\\n          color: rgb(180, 180, 180);\\n        }\\n.spectrum--darkest .spectrum-Article .spectrum-Heading1 {\\n          color: rgb(226, 226, 226);\\n        }\\n.spectrum--darkest .spectrum-Article .spectrum-Heading2 {\\n          color: rgb(226, 226, 226);\\n        }\\n.spectrum--darkest .spectrum-Article .spectrum-Heading3 {\\n          color: rgb(226, 226, 226);\\n        }\\n.spectrum--darkest .spectrum-Article .spectrum-Heading4 {\\n          color: rgb(226, 226, 226);\\n        }\\n.spectrum--darkest .spectrum-Article .spectrum-Heading5 {\\n          color: rgb(226, 226, 226);\\n        }\\n.spectrum--darkest .spectrum-Article .spectrum-Heading6 {\\n          color: rgb(226, 226, 226);\\n        }\\n.spectrum--darkest .spectrum-Article .spectrum-Subheading {\\n          color: rgb(180, 180, 180);\\n        }\\n.spectrum--darkest .spectrum-Article .spectrum-Detail {\\n          color: rgb(180, 180, 180);\\n        }\\n.spectrum--darkest .spectrum-Article .spectrum-Heading1--quiet {\\n          color: rgb(226, 226, 226);\\n        }\\n.spectrum--darkest .spectrum-Article .spectrum-Heading2--quiet {\\n          color: rgb(226, 226, 226);\\n        }\\n.spectrum--darkest .spectrum-Article .spectrum-Heading1--display {\\n          color: rgb(226, 226, 226);\\n        }\\n.spectrum--darkest .spectrum-Article .spectrum-Heading2--display {\\n          color: rgb(226, 226, 226);\\n        }\\n.spectrum--darkest .spectrum-Article .spectrum-Heading1--display.spectrum-Heading1--quiet {\\n          color: rgb(226, 226, 226);\\n        }\\n.spectrum--darkest .spectrum-Article .spectrum-Heading2--display.spectrum-Heading2--quiet {\\n          color: rgb(226, 226, 226);\\n        }\\n.spectrum--darkest .spectrum:lang(ja) .spectrum-Body1, .spectrum--darkest .spectrum:lang(ko) .spectrum-Body1, .spectrum--darkest .spectrum:lang(zh) .spectrum-Body1 {\\n          color: rgb(180, 180, 180);\\n        }\\n.spectrum--darkest .spectrum:lang(ja) .spectrum-Body2, .spectrum--darkest .spectrum:lang(ko) .spectrum-Body2, .spectrum--darkest .spectrum:lang(zh) .spectrum-Body2 {\\n          color: rgb(180, 180, 180);\\n        }\\n.spectrum--darkest .spectrum:lang(ja) .spectrum-Body3, .spectrum--darkest .spectrum:lang(ko) .spectrum-Body3, .spectrum--darkest .spectrum:lang(zh) .spectrum-Body3 {\\n          color: rgb(180, 180, 180);\\n        }\\n.spectrum--darkest .spectrum:lang(ja) .spectrum-Body4, .spectrum--darkest .spectrum:lang(ko) .spectrum-Body4, .spectrum--darkest .spectrum:lang(zh) .spectrum-Body4 {\\n          color: rgb(180, 180, 180);\\n        }\\n.spectrum--darkest .spectrum:lang(ja) .spectrum-Body5, .spectrum--darkest .spectrum:lang(ko) .spectrum-Body5, .spectrum--darkest .spectrum:lang(zh) .spectrum-Body5 {\\n          color: rgb(180, 180, 180);\\n        }\\n.spectrum--darkest .spectrum:lang(ja) .spectrum-Heading1, .spectrum--darkest .spectrum:lang(ko) .spectrum-Heading1, .spectrum--darkest .spectrum:lang(zh) .spectrum-Heading1 {\\n          color: rgb(226, 226, 226);\\n        }\\n.spectrum--darkest .spectrum:lang(ja) .spectrum-Heading2, .spectrum--darkest .spectrum:lang(ko) .spectrum-Heading2, .spectrum--darkest .spectrum:lang(zh) .spectrum-Heading2 {\\n          color: rgb(226, 226, 226);\\n        }\\n.spectrum--darkest .spectrum:lang(ja) .spectrum-Heading3, .spectrum--darkest .spectrum:lang(ko) .spectrum-Heading3, .spectrum--darkest .spectrum:lang(zh) .spectrum-Heading3 {\\n          color: rgb(226, 226, 226);\\n        }\\n.spectrum--darkest .spectrum:lang(ja) .spectrum-Heading4, .spectrum--darkest .spectrum:lang(ko) .spectrum-Heading4, .spectrum--darkest .spectrum:lang(zh) .spectrum-Heading4 {\\n          color: rgb(226, 226, 226);\\n        }\\n.spectrum--darkest .spectrum:lang(ja) .spectrum-Heading5, .spectrum--darkest .spectrum:lang(ko) .spectrum-Heading5, .spectrum--darkest .spectrum:lang(zh) .spectrum-Heading5 {\\n          color: rgb(226, 226, 226);\\n        }\\n.spectrum--darkest .spectrum:lang(ja) .spectrum-Heading6, .spectrum--darkest .spectrum:lang(ko) .spectrum-Heading6, .spectrum--darkest .spectrum:lang(zh) .spectrum-Heading6 {\\n          color: rgb(226, 226, 226);\\n        }\\n.spectrum--darkest .spectrum:lang(ja) .spectrum-Subheading, .spectrum--darkest .spectrum:lang(ko) .spectrum-Subheading, .spectrum--darkest .spectrum:lang(zh) .spectrum-Subheading {\\n          color: rgb(180, 180, 180);\\n        }\\n.spectrum--darkest .spectrum:lang(ja) .spectrum-Detail, .spectrum--darkest .spectrum:lang(ko) .spectrum-Detail, .spectrum--darkest .spectrum:lang(zh) .spectrum-Detail {\\n          color: rgb(180, 180, 180);\\n        }\\n.spectrum--darkest .spectrum:lang(ja) .spectrum-Heading1--quiet, .spectrum--darkest .spectrum:lang(ko) .spectrum-Heading1--quiet, .spectrum--darkest .spectrum:lang(zh) .spectrum-Heading1--quiet {\\n          color: rgb(226, 226, 226);\\n        }\\n.spectrum--darkest .spectrum:lang(ja) .spectrum-Heading2--quiet, .spectrum--darkest .spectrum:lang(ko) .spectrum-Heading2--quiet, .spectrum--darkest .spectrum:lang(zh) .spectrum-Heading2--quiet {\\n          color: rgb(226, 226, 226);\\n        }\\n.spectrum--darkest .spectrum:lang(ja) .spectrum-Heading1--strong, .spectrum--darkest .spectrum:lang(ko) .spectrum-Heading1--strong, .spectrum--darkest .spectrum:lang(zh) .spectrum-Heading1--strong {\\n          color: rgb(226, 226, 226);\\n        }\\n.spectrum--darkest .spectrum:lang(ja) .spectrum-Heading2--strong, .spectrum--darkest .spectrum:lang(ko) .spectrum-Heading2--strong, .spectrum--darkest .spectrum:lang(zh) .spectrum-Heading2--strong {\\n          color: rgb(226, 226, 226);\\n        }\\n.spectrum--darkest .spectrum:lang(ja) .spectrum-Heading1--display, .spectrum--darkest .spectrum:lang(ko) .spectrum-Heading1--display, .spectrum--darkest .spectrum:lang(zh) .spectrum-Heading1--display {\\n          color: rgb(226, 226, 226);\\n        }\\n.spectrum--darkest .spectrum:lang(ja) .spectrum-Heading2--display, .spectrum--darkest .spectrum:lang(ko) .spectrum-Heading2--display, .spectrum--darkest .spectrum:lang(zh) .spectrum-Heading2--display {\\n          color: rgb(226, 226, 226);\\n        }\\n.spectrum--darkest .spectrum:lang(ja) .spectrum-Heading1--display.spectrum-Heading1--strong, .spectrum--darkest .spectrum:lang(ko) .spectrum-Heading1--display.spectrum-Heading1--strong, .spectrum--darkest .spectrum:lang(zh) .spectrum-Heading1--display.spectrum-Heading1--strong {\\n          color: rgb(226, 226, 226);\\n        }\\n.spectrum--darkest .spectrum:lang(ja) .spectrum-Heading2--display.spectrum-Heading2--strong, .spectrum--darkest .spectrum:lang(ko) .spectrum-Heading2--display.spectrum-Heading2--strong, .spectrum--darkest .spectrum:lang(zh) .spectrum-Heading2--display.spectrum-Heading2--strong {\\n          color: rgb(226, 226, 226);\\n        }\\n.spectrum--darkest .spectrum:lang(ja) .spectrum-Heading1--display.spectrum-Heading1--quiet, .spectrum--darkest .spectrum:lang(ko) .spectrum-Heading1--display.spectrum-Heading1--quiet, .spectrum--darkest .spectrum:lang(zh) .spectrum-Heading1--display.spectrum-Heading1--quiet {\\n          color: rgb(226, 226, 226);\\n        }\\n.spectrum--darkest .spectrum:lang(ja) .spectrum-Heading2--display.spectrum-Heading2--quiet, .spectrum--darkest .spectrum:lang(ko) .spectrum-Heading2--display.spectrum-Heading2--quiet, .spectrum--darkest .spectrum:lang(zh) .spectrum-Heading2--display.spectrum-Heading2--quiet {\\n          color: rgb(226, 226, 226);\\n        }\\n.spectrum--darkest .spectrum-Code1 {\\n          color: rgb(180, 180, 180);\\n        }\\n.spectrum--darkest .spectrum-Code2 {\\n          color: rgb(180, 180, 180);\\n        }\\n.spectrum--darkest .spectrum-Code3 {\\n          color: rgb(180, 180, 180);\\n        }\\n.spectrum--darkest .spectrum-Code4 {\\n          color: rgb(180, 180, 180);\\n        }\\n.spectrum--darkest .spectrum-Code5 {\\n          color: rgb(180, 180, 180);\\n        }\\n.spectrum--darkest,\\n.spectrum--darkest .spectrum-Body {\\n  color: rgb(180, 180, 180);\\n}\\n.spectrum--darkest .spectrum-Body--large {\\n  color: rgb(180, 180, 180);\\n}\\n.spectrum--darkest .spectrum-Body--small {\\n  color: rgb(180, 180, 180);\\n}\\n.spectrum--darkest .spectrum-Body--secondary {\\n  color: rgb(133, 133, 133);\\n}\\n.spectrum--darkest .spectrum-Heading--display {\\n  color: rgb(226, 226, 226);\\n}\\n.spectrum--darkest .spectrum-Heading--pageTitle {\\n  color: rgb(133, 133, 133);\\n}\\n.spectrum--darkest .spectrum-Heading--subtitle1 {\\n  color: rgb(226, 226, 226);\\n}\\n.spectrum--darkest .spectrum-Heading--subtitle2 {\\n  color: rgb(226, 226, 226);\\n}\\n.spectrum--darkest .spectrum-Heading--subtitle3 {\\n  color: rgb(133, 133, 133);\\n}\\n", ""]);\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjMwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0b3JxLW5hdGl2ZS9yZWFjdC1zcGVjdHJ1bS9zcGVjdHJ1bS1jc3Mtb3ZlcnJpZGVzL3R5cG9ncmFwaHkvbXVsdGlTdG9wcy9kYXJrZXN0LmNzcz85OGRjIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCIuLi8uLi8uLi8uLi8uLi9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanNcIikoZmFsc2UpO1xuLy8gTW9kdWxlXG5leHBvcnRzLnB1c2goW21vZHVsZS5pZCwgXCIvKiBnZW5lcmF0ZWQgZnJvbSBkbmEtdmVyc2lvbjogNS4wLjEgKi9cXG4vKiBnZW5lcmF0ZWQgZnJvbSBkbmEtdmVyc2lvbjogNS4wLjEgKi9cXG4vKiBUZW1wb3Jhcnkgc2tpbiB2YXJpYWJsZXMgdGhhdCBuZWVkIHRvIGJlIG1vdmVkIGludG8gb3JpZ2lucyAqL1xcbjpyb290IHtcXG4gIC8qIEljb24gQnV0dG9uKi9cXG5cXG4gIC8qIEJ1dHRvbiAqL1xcblxcbiAgLyogU2hlbGwgKi9cXG5cXG4gIC8qIGhhaGEgcmVtb3ZlIHRoaXMgKi9cXG5cXG4gIC8qIEN1c3RvbSBzZWxlY3Rpb24gY29sb3IgZm9yIHBsYWNlaG9sZGVycyB1c2luZyBnbG9iYWwgYmx1ZS01MDAgYXQgMzAlIG9wYWNpdHkuIFNob3VsZCBiZSB1cGRhdGVkIGluIFNwZWN0cnVtLUROQSAqL1xcbn1cXG4uc3BlY3RydW0tLWRhcmtlc3QgLnNwZWN0cnVtLUJvZHkxIHtcXG4gICAgICAgICAgY29sb3I6IHJnYigxODAsIDE4MCwgMTgwKTtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWRhcmtlc3QgLnNwZWN0cnVtLUJvZHkyIHtcXG4gICAgICAgICAgY29sb3I6IHJnYigxODAsIDE4MCwgMTgwKTtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWRhcmtlc3QgLnNwZWN0cnVtLUJvZHkzIHtcXG4gICAgICAgICAgY29sb3I6IHJnYigxODAsIDE4MCwgMTgwKTtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWRhcmtlc3QgLnNwZWN0cnVtLUJvZHk0IHtcXG4gICAgICAgICAgY29sb3I6IHJnYigxODAsIDE4MCwgMTgwKTtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWRhcmtlc3QgLnNwZWN0cnVtLUJvZHk1IHtcXG4gICAgICAgICAgY29sb3I6IHJnYigxODAsIDE4MCwgMTgwKTtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWRhcmtlc3QgLnNwZWN0cnVtLUhlYWRpbmcxIHtcXG4gICAgICAgICAgY29sb3I6IHJnYigyMjYsIDIyNiwgMjI2KTtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWRhcmtlc3QgLnNwZWN0cnVtLUhlYWRpbmcyIHtcXG4gICAgICAgICAgY29sb3I6IHJnYigyMjYsIDIyNiwgMjI2KTtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWRhcmtlc3QgLnNwZWN0cnVtLUhlYWRpbmczIHtcXG4gICAgICAgICAgY29sb3I6IHJnYigyMjYsIDIyNiwgMjI2KTtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWRhcmtlc3QgLnNwZWN0cnVtLUhlYWRpbmc0IHtcXG4gICAgICAgICAgY29sb3I6IHJnYigyMjYsIDIyNiwgMjI2KTtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWRhcmtlc3QgLnNwZWN0cnVtLUhlYWRpbmc1IHtcXG4gICAgICAgICAgY29sb3I6IHJnYigyMjYsIDIyNiwgMjI2KTtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWRhcmtlc3QgLnNwZWN0cnVtLUhlYWRpbmc2IHtcXG4gICAgICAgICAgY29sb3I6IHJnYigyMjYsIDIyNiwgMjI2KTtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWRhcmtlc3QgLnNwZWN0cnVtLVN1YmhlYWRpbmcge1xcbiAgICAgICAgICBjb2xvcjogcmdiKDE4MCwgMTgwLCAxODApO1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS0tZGFya2VzdCAuc3BlY3RydW0tRGV0YWlsIHtcXG4gICAgICAgICAgY29sb3I6IHJnYigxODAsIDE4MCwgMTgwKTtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWRhcmtlc3QgLnNwZWN0cnVtLUhlYWRpbmcxLS1xdWlldCB7XFxuICAgICAgICAgIGNvbG9yOiByZ2IoMjI2LCAyMjYsIDIyNik7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1kYXJrZXN0IC5zcGVjdHJ1bS1IZWFkaW5nMi0tcXVpZXQge1xcbiAgICAgICAgICBjb2xvcjogcmdiKDIyNiwgMjI2LCAyMjYpO1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS0tZGFya2VzdCAuc3BlY3RydW0tSGVhZGluZzEtLXN0cm9uZyB7XFxuICAgICAgICAgIGNvbG9yOiByZ2IoMjI2LCAyMjYsIDIyNik7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1kYXJrZXN0IC5zcGVjdHJ1bS1IZWFkaW5nMi0tc3Ryb25nIHtcXG4gICAgICAgICAgY29sb3I6IHJnYigyMjYsIDIyNiwgMjI2KTtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWRhcmtlc3QgLnNwZWN0cnVtLUhlYWRpbmcxLS1kaXNwbGF5IHtcXG4gICAgICAgICAgY29sb3I6IHJnYigyMjYsIDIyNiwgMjI2KTtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWRhcmtlc3QgLnNwZWN0cnVtLUhlYWRpbmcyLS1kaXNwbGF5IHtcXG4gICAgICAgICAgY29sb3I6IHJnYigyMjYsIDIyNiwgMjI2KTtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWRhcmtlc3QgLnNwZWN0cnVtLUhlYWRpbmcxLS1kaXNwbGF5LnNwZWN0cnVtLUhlYWRpbmcxLS1zdHJvbmcge1xcbiAgICAgICAgICBjb2xvcjogcmdiKDIyNiwgMjI2LCAyMjYpO1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS0tZGFya2VzdCAuc3BlY3RydW0tSGVhZGluZzItLWRpc3BsYXkuc3BlY3RydW0tSGVhZGluZzItLXN0cm9uZyB7XFxuICAgICAgICAgIGNvbG9yOiByZ2IoMjI2LCAyMjYsIDIyNik7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1kYXJrZXN0IC5zcGVjdHJ1bS1IZWFkaW5nMS0tZGlzcGxheS5zcGVjdHJ1bS1IZWFkaW5nMS0tcXVpZXQge1xcbiAgICAgICAgICBjb2xvcjogcmdiKDIyNiwgMjI2LCAyMjYpO1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS0tZGFya2VzdCAuc3BlY3RydW0tSGVhZGluZzItLWRpc3BsYXkuc3BlY3RydW0tSGVhZGluZzItLXF1aWV0IHtcXG4gICAgICAgICAgY29sb3I6IHJnYigyMjYsIDIyNiwgMjI2KTtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWRhcmtlc3QgLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLUJvZHkxIHtcXG4gICAgICAgICAgY29sb3I6IHJnYigxODAsIDE4MCwgMTgwKTtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWRhcmtlc3QgLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLUJvZHkyIHtcXG4gICAgICAgICAgY29sb3I6IHJnYigxODAsIDE4MCwgMTgwKTtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWRhcmtlc3QgLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLUJvZHkzIHtcXG4gICAgICAgICAgY29sb3I6IHJnYigxODAsIDE4MCwgMTgwKTtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWRhcmtlc3QgLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLUJvZHk0IHtcXG4gICAgICAgICAgY29sb3I6IHJnYigxODAsIDE4MCwgMTgwKTtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWRhcmtlc3QgLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLUJvZHk1IHtcXG4gICAgICAgICAgY29sb3I6IHJnYigxODAsIDE4MCwgMTgwKTtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWRhcmtlc3QgLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLUhlYWRpbmcxIHtcXG4gICAgICAgICAgY29sb3I6IHJnYigyMjYsIDIyNiwgMjI2KTtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWRhcmtlc3QgLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLUhlYWRpbmcyIHtcXG4gICAgICAgICAgY29sb3I6IHJnYigyMjYsIDIyNiwgMjI2KTtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWRhcmtlc3QgLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLUhlYWRpbmczIHtcXG4gICAgICAgICAgY29sb3I6IHJnYigyMjYsIDIyNiwgMjI2KTtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWRhcmtlc3QgLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLUhlYWRpbmc0IHtcXG4gICAgICAgICAgY29sb3I6IHJnYigyMjYsIDIyNiwgMjI2KTtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWRhcmtlc3QgLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLUhlYWRpbmc1IHtcXG4gICAgICAgICAgY29sb3I6IHJnYigyMjYsIDIyNiwgMjI2KTtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWRhcmtlc3QgLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLUhlYWRpbmc2IHtcXG4gICAgICAgICAgY29sb3I6IHJnYigyMjYsIDIyNiwgMjI2KTtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWRhcmtlc3QgLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLVN1YmhlYWRpbmcge1xcbiAgICAgICAgICBjb2xvcjogcmdiKDE4MCwgMTgwLCAxODApO1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS0tZGFya2VzdCAuc3BlY3RydW0tQXJ0aWNsZSAuc3BlY3RydW0tRGV0YWlsIHtcXG4gICAgICAgICAgY29sb3I6IHJnYigxODAsIDE4MCwgMTgwKTtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWRhcmtlc3QgLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLUhlYWRpbmcxLS1xdWlldCB7XFxuICAgICAgICAgIGNvbG9yOiByZ2IoMjI2LCAyMjYsIDIyNik7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1kYXJrZXN0IC5zcGVjdHJ1bS1BcnRpY2xlIC5zcGVjdHJ1bS1IZWFkaW5nMi0tcXVpZXQge1xcbiAgICAgICAgICBjb2xvcjogcmdiKDIyNiwgMjI2LCAyMjYpO1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS0tZGFya2VzdCAuc3BlY3RydW0tQXJ0aWNsZSAuc3BlY3RydW0tSGVhZGluZzEtLWRpc3BsYXkge1xcbiAgICAgICAgICBjb2xvcjogcmdiKDIyNiwgMjI2LCAyMjYpO1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS0tZGFya2VzdCAuc3BlY3RydW0tQXJ0aWNsZSAuc3BlY3RydW0tSGVhZGluZzItLWRpc3BsYXkge1xcbiAgICAgICAgICBjb2xvcjogcmdiKDIyNiwgMjI2LCAyMjYpO1xcbiAgICAgICAgfVxcbi5zcGVjdHJ1bS0tZGFya2VzdCAuc3BlY3RydW0tQXJ0aWNsZSAuc3BlY3RydW0tSGVhZGluZzEtLWRpc3BsYXkuc3BlY3RydW0tSGVhZGluZzEtLXF1aWV0IHtcXG4gICAgICAgICAgY29sb3I6IHJnYigyMjYsIDIyNiwgMjI2KTtcXG4gICAgICAgIH1cXG4uc3BlY3RydW0tLWRhcmtlc3QgLnNwZWN0cnVtLUFydGljbGUgLnNwZWN0cnVtLUhlYWRpbmcyLS1kaXNwbGF5LnNwZWN0cnVtLUhlYWRpbmcyLS1xdWlldCB7XFxuICAgICAgICAgIGNvbG9yOiByZ2IoMjI2LCAyMjYsIDIyNik7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1kYXJrZXN0IC5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tQm9keTEsIC5zcGVjdHJ1bS0tZGFya2VzdCAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUJvZHkxLCAuc3BlY3RydW0tLWRhcmtlc3QgLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1Cb2R5MSB7XFxuICAgICAgICAgIGNvbG9yOiByZ2IoMTgwLCAxODAsIDE4MCk7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1kYXJrZXN0IC5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tQm9keTIsIC5zcGVjdHJ1bS0tZGFya2VzdCAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUJvZHkyLCAuc3BlY3RydW0tLWRhcmtlc3QgLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1Cb2R5MiB7XFxuICAgICAgICAgIGNvbG9yOiByZ2IoMTgwLCAxODAsIDE4MCk7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1kYXJrZXN0IC5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tQm9keTMsIC5zcGVjdHJ1bS0tZGFya2VzdCAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUJvZHkzLCAuc3BlY3RydW0tLWRhcmtlc3QgLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1Cb2R5MyB7XFxuICAgICAgICAgIGNvbG9yOiByZ2IoMTgwLCAxODAsIDE4MCk7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1kYXJrZXN0IC5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tQm9keTQsIC5zcGVjdHJ1bS0tZGFya2VzdCAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUJvZHk0LCAuc3BlY3RydW0tLWRhcmtlc3QgLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1Cb2R5NCB7XFxuICAgICAgICAgIGNvbG9yOiByZ2IoMTgwLCAxODAsIDE4MCk7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1kYXJrZXN0IC5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tQm9keTUsIC5zcGVjdHJ1bS0tZGFya2VzdCAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUJvZHk1LCAuc3BlY3RydW0tLWRhcmtlc3QgLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1Cb2R5NSB7XFxuICAgICAgICAgIGNvbG9yOiByZ2IoMTgwLCAxODAsIDE4MCk7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1kYXJrZXN0IC5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tSGVhZGluZzEsIC5zcGVjdHJ1bS0tZGFya2VzdCAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUhlYWRpbmcxLCAuc3BlY3RydW0tLWRhcmtlc3QgLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1IZWFkaW5nMSB7XFxuICAgICAgICAgIGNvbG9yOiByZ2IoMjI2LCAyMjYsIDIyNik7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1kYXJrZXN0IC5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tSGVhZGluZzIsIC5zcGVjdHJ1bS0tZGFya2VzdCAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUhlYWRpbmcyLCAuc3BlY3RydW0tLWRhcmtlc3QgLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1IZWFkaW5nMiB7XFxuICAgICAgICAgIGNvbG9yOiByZ2IoMjI2LCAyMjYsIDIyNik7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1kYXJrZXN0IC5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tSGVhZGluZzMsIC5zcGVjdHJ1bS0tZGFya2VzdCAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUhlYWRpbmczLCAuc3BlY3RydW0tLWRhcmtlc3QgLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1IZWFkaW5nMyB7XFxuICAgICAgICAgIGNvbG9yOiByZ2IoMjI2LCAyMjYsIDIyNik7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1kYXJrZXN0IC5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tSGVhZGluZzQsIC5zcGVjdHJ1bS0tZGFya2VzdCAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUhlYWRpbmc0LCAuc3BlY3RydW0tLWRhcmtlc3QgLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1IZWFkaW5nNCB7XFxuICAgICAgICAgIGNvbG9yOiByZ2IoMjI2LCAyMjYsIDIyNik7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1kYXJrZXN0IC5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tSGVhZGluZzUsIC5zcGVjdHJ1bS0tZGFya2VzdCAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUhlYWRpbmc1LCAuc3BlY3RydW0tLWRhcmtlc3QgLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1IZWFkaW5nNSB7XFxuICAgICAgICAgIGNvbG9yOiByZ2IoMjI2LCAyMjYsIDIyNik7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1kYXJrZXN0IC5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tSGVhZGluZzYsIC5zcGVjdHJ1bS0tZGFya2VzdCAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUhlYWRpbmc2LCAuc3BlY3RydW0tLWRhcmtlc3QgLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1IZWFkaW5nNiB7XFxuICAgICAgICAgIGNvbG9yOiByZ2IoMjI2LCAyMjYsIDIyNik7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1kYXJrZXN0IC5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tU3ViaGVhZGluZywgLnNwZWN0cnVtLS1kYXJrZXN0IC5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tU3ViaGVhZGluZywgLnNwZWN0cnVtLS1kYXJrZXN0IC5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tU3ViaGVhZGluZyB7XFxuICAgICAgICAgIGNvbG9yOiByZ2IoMTgwLCAxODAsIDE4MCk7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1kYXJrZXN0IC5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tRGV0YWlsLCAuc3BlY3RydW0tLWRhcmtlc3QgLnNwZWN0cnVtOmxhbmcoa28pIC5zcGVjdHJ1bS1EZXRhaWwsIC5zcGVjdHJ1bS0tZGFya2VzdCAuc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLURldGFpbCB7XFxuICAgICAgICAgIGNvbG9yOiByZ2IoMTgwLCAxODAsIDE4MCk7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1kYXJrZXN0IC5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tSGVhZGluZzEtLXF1aWV0LCAuc3BlY3RydW0tLWRhcmtlc3QgLnNwZWN0cnVtOmxhbmcoa28pIC5zcGVjdHJ1bS1IZWFkaW5nMS0tcXVpZXQsIC5zcGVjdHJ1bS0tZGFya2VzdCAuc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLUhlYWRpbmcxLS1xdWlldCB7XFxuICAgICAgICAgIGNvbG9yOiByZ2IoMjI2LCAyMjYsIDIyNik7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1kYXJrZXN0IC5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tSGVhZGluZzItLXF1aWV0LCAuc3BlY3RydW0tLWRhcmtlc3QgLnNwZWN0cnVtOmxhbmcoa28pIC5zcGVjdHJ1bS1IZWFkaW5nMi0tcXVpZXQsIC5zcGVjdHJ1bS0tZGFya2VzdCAuc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLUhlYWRpbmcyLS1xdWlldCB7XFxuICAgICAgICAgIGNvbG9yOiByZ2IoMjI2LCAyMjYsIDIyNik7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1kYXJrZXN0IC5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tSGVhZGluZzEtLXN0cm9uZywgLnNwZWN0cnVtLS1kYXJrZXN0IC5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tSGVhZGluZzEtLXN0cm9uZywgLnNwZWN0cnVtLS1kYXJrZXN0IC5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tSGVhZGluZzEtLXN0cm9uZyB7XFxuICAgICAgICAgIGNvbG9yOiByZ2IoMjI2LCAyMjYsIDIyNik7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1kYXJrZXN0IC5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tSGVhZGluZzItLXN0cm9uZywgLnNwZWN0cnVtLS1kYXJrZXN0IC5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tSGVhZGluZzItLXN0cm9uZywgLnNwZWN0cnVtLS1kYXJrZXN0IC5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tSGVhZGluZzItLXN0cm9uZyB7XFxuICAgICAgICAgIGNvbG9yOiByZ2IoMjI2LCAyMjYsIDIyNik7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1kYXJrZXN0IC5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tSGVhZGluZzEtLWRpc3BsYXksIC5zcGVjdHJ1bS0tZGFya2VzdCAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUhlYWRpbmcxLS1kaXNwbGF5LCAuc3BlY3RydW0tLWRhcmtlc3QgLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1IZWFkaW5nMS0tZGlzcGxheSB7XFxuICAgICAgICAgIGNvbG9yOiByZ2IoMjI2LCAyMjYsIDIyNik7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1kYXJrZXN0IC5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tSGVhZGluZzItLWRpc3BsYXksIC5zcGVjdHJ1bS0tZGFya2VzdCAuc3BlY3RydW06bGFuZyhrbykgLnNwZWN0cnVtLUhlYWRpbmcyLS1kaXNwbGF5LCAuc3BlY3RydW0tLWRhcmtlc3QgLnNwZWN0cnVtOmxhbmcoemgpIC5zcGVjdHJ1bS1IZWFkaW5nMi0tZGlzcGxheSB7XFxuICAgICAgICAgIGNvbG9yOiByZ2IoMjI2LCAyMjYsIDIyNik7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1kYXJrZXN0IC5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tSGVhZGluZzEtLWRpc3BsYXkuc3BlY3RydW0tSGVhZGluZzEtLXN0cm9uZywgLnNwZWN0cnVtLS1kYXJrZXN0IC5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tSGVhZGluZzEtLWRpc3BsYXkuc3BlY3RydW0tSGVhZGluZzEtLXN0cm9uZywgLnNwZWN0cnVtLS1kYXJrZXN0IC5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tSGVhZGluZzEtLWRpc3BsYXkuc3BlY3RydW0tSGVhZGluZzEtLXN0cm9uZyB7XFxuICAgICAgICAgIGNvbG9yOiByZ2IoMjI2LCAyMjYsIDIyNik7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1kYXJrZXN0IC5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tSGVhZGluZzItLWRpc3BsYXkuc3BlY3RydW0tSGVhZGluZzItLXN0cm9uZywgLnNwZWN0cnVtLS1kYXJrZXN0IC5zcGVjdHJ1bTpsYW5nKGtvKSAuc3BlY3RydW0tSGVhZGluZzItLWRpc3BsYXkuc3BlY3RydW0tSGVhZGluZzItLXN0cm9uZywgLnNwZWN0cnVtLS1kYXJrZXN0IC5zcGVjdHJ1bTpsYW5nKHpoKSAuc3BlY3RydW0tSGVhZGluZzItLWRpc3BsYXkuc3BlY3RydW0tSGVhZGluZzItLXN0cm9uZyB7XFxuICAgICAgICAgIGNvbG9yOiByZ2IoMjI2LCAyMjYsIDIyNik7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1kYXJrZXN0IC5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tSGVhZGluZzEtLWRpc3BsYXkuc3BlY3RydW0tSGVhZGluZzEtLXF1aWV0LCAuc3BlY3RydW0tLWRhcmtlc3QgLnNwZWN0cnVtOmxhbmcoa28pIC5zcGVjdHJ1bS1IZWFkaW5nMS0tZGlzcGxheS5zcGVjdHJ1bS1IZWFkaW5nMS0tcXVpZXQsIC5zcGVjdHJ1bS0tZGFya2VzdCAuc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLUhlYWRpbmcxLS1kaXNwbGF5LnNwZWN0cnVtLUhlYWRpbmcxLS1xdWlldCB7XFxuICAgICAgICAgIGNvbG9yOiByZ2IoMjI2LCAyMjYsIDIyNik7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1kYXJrZXN0IC5zcGVjdHJ1bTpsYW5nKGphKSAuc3BlY3RydW0tSGVhZGluZzItLWRpc3BsYXkuc3BlY3RydW0tSGVhZGluZzItLXF1aWV0LCAuc3BlY3RydW0tLWRhcmtlc3QgLnNwZWN0cnVtOmxhbmcoa28pIC5zcGVjdHJ1bS1IZWFkaW5nMi0tZGlzcGxheS5zcGVjdHJ1bS1IZWFkaW5nMi0tcXVpZXQsIC5zcGVjdHJ1bS0tZGFya2VzdCAuc3BlY3RydW06bGFuZyh6aCkgLnNwZWN0cnVtLUhlYWRpbmcyLS1kaXNwbGF5LnNwZWN0cnVtLUhlYWRpbmcyLS1xdWlldCB7XFxuICAgICAgICAgIGNvbG9yOiByZ2IoMjI2LCAyMjYsIDIyNik7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1kYXJrZXN0IC5zcGVjdHJ1bS1Db2RlMSB7XFxuICAgICAgICAgIGNvbG9yOiByZ2IoMTgwLCAxODAsIDE4MCk7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1kYXJrZXN0IC5zcGVjdHJ1bS1Db2RlMiB7XFxuICAgICAgICAgIGNvbG9yOiByZ2IoMTgwLCAxODAsIDE4MCk7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1kYXJrZXN0IC5zcGVjdHJ1bS1Db2RlMyB7XFxuICAgICAgICAgIGNvbG9yOiByZ2IoMTgwLCAxODAsIDE4MCk7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1kYXJrZXN0IC5zcGVjdHJ1bS1Db2RlNCB7XFxuICAgICAgICAgIGNvbG9yOiByZ2IoMTgwLCAxODAsIDE4MCk7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1kYXJrZXN0IC5zcGVjdHJ1bS1Db2RlNSB7XFxuICAgICAgICAgIGNvbG9yOiByZ2IoMTgwLCAxODAsIDE4MCk7XFxuICAgICAgICB9XFxuLnNwZWN0cnVtLS1kYXJrZXN0LFxcbi5zcGVjdHJ1bS0tZGFya2VzdCAuc3BlY3RydW0tQm9keSB7XFxuICBjb2xvcjogcmdiKDE4MCwgMTgwLCAxODApO1xcbn1cXG4uc3BlY3RydW0tLWRhcmtlc3QgLnNwZWN0cnVtLUJvZHktLWxhcmdlIHtcXG4gIGNvbG9yOiByZ2IoMTgwLCAxODAsIDE4MCk7XFxufVxcbi5zcGVjdHJ1bS0tZGFya2VzdCAuc3BlY3RydW0tQm9keS0tc21hbGwge1xcbiAgY29sb3I6IHJnYigxODAsIDE4MCwgMTgwKTtcXG59XFxuLnNwZWN0cnVtLS1kYXJrZXN0IC5zcGVjdHJ1bS1Cb2R5LS1zZWNvbmRhcnkge1xcbiAgY29sb3I6IHJnYigxMzMsIDEzMywgMTMzKTtcXG59XFxuLnNwZWN0cnVtLS1kYXJrZXN0IC5zcGVjdHJ1bS1IZWFkaW5nLS1kaXNwbGF5IHtcXG4gIGNvbG9yOiByZ2IoMjI2LCAyMjYsIDIyNik7XFxufVxcbi5zcGVjdHJ1bS0tZGFya2VzdCAuc3BlY3RydW0tSGVhZGluZy0tcGFnZVRpdGxlIHtcXG4gIGNvbG9yOiByZ2IoMTMzLCAxMzMsIDEzMyk7XFxufVxcbi5zcGVjdHJ1bS0tZGFya2VzdCAuc3BlY3RydW0tSGVhZGluZy0tc3VidGl0bGUxIHtcXG4gIGNvbG9yOiByZ2IoMjI2LCAyMjYsIDIyNik7XFxufVxcbi5zcGVjdHJ1bS0tZGFya2VzdCAuc3BlY3RydW0tSGVhZGluZy0tc3VidGl0bGUyIHtcXG4gIGNvbG9yOiByZ2IoMjI2LCAyMjYsIDIyNik7XFxufVxcbi5zcGVjdHJ1bS0tZGFya2VzdCAuc3BlY3RydW0tSGVhZGluZy0tc3VidGl0bGUzIHtcXG4gIGNvbG9yOiByZ2IoMTMzLCAxMzMsIDEzMyk7XFxufVxcblwiLCBcIlwiXSk7XG5cbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///230\n')},function(module,exports,__webpack_require__){eval("var api = __webpack_require__(5);\n            var content = __webpack_require__(232);\n\n            content = content.__esModule ? content.default : content;\n\n            if (typeof content === 'string') {\n              content = [[module.i, content, '']];\n            }\n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = api(content, options);\n\n\n\nmodule.exports = content.locals || {};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjMxLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0b3JxLW5hdGl2ZS9yZWFjdC1zcGVjdHJ1bS9XYWl0L3V4cC1zdHlsZS9pbmRleC5jc3M/ZjA0MCJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgYXBpID0gcmVxdWlyZShcIiEuLi8uLi8uLi8uLi9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luamVjdFN0eWxlc0ludG9TdHlsZVRhZy5qc1wiKTtcbiAgICAgICAgICAgIHZhciBjb250ZW50ID0gcmVxdWlyZShcIiEhLi4vLi4vLi4vLi4vY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL2luZGV4LmNzc1wiKTtcblxuICAgICAgICAgICAgY29udGVudCA9IGNvbnRlbnQuX19lc01vZHVsZSA/IGNvbnRlbnQuZGVmYXVsdCA6IGNvbnRlbnQ7XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgY29udGVudCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgY29udGVudCA9IFtbbW9kdWxlLmlkLCBjb250ZW50LCAnJ11dO1xuICAgICAgICAgICAgfVxuXG52YXIgb3B0aW9ucyA9IHt9O1xuXG5vcHRpb25zLmluc2VydCA9IFwiaGVhZFwiO1xub3B0aW9ucy5zaW5nbGV0b24gPSBmYWxzZTtcblxudmFyIHVwZGF0ZSA9IGFwaShjb250ZW50LCBvcHRpb25zKTtcblxuXG5cbm1vZHVsZS5leHBvcnRzID0gY29udGVudC5sb2NhbHMgfHwge307Il0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///231\n")},function(module,exports,__webpack_require__){eval('exports = module.exports = __webpack_require__(6)(false);\n// Module\nexports.push([module.i, ".circleLoader--small {\\n  width: 16px;\\n  height: 16px;\\n}\\n\\n.circleLoader--medium {\\n  width: 32px;\\n  height: 32px;\\n}\\n\\n.circleLoader--large {\\n  width: 64px;\\n  height: 64px;\\n}", ""]);\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjMyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL0B0b3JxLW5hdGl2ZS9yZWFjdC1zcGVjdHJ1bS9XYWl0L3V4cC1zdHlsZS9pbmRleC5jc3M/NjExNSJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiLi4vLi4vLi4vLi4vY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzXCIpKGZhbHNlKTtcbi8vIE1vZHVsZVxuZXhwb3J0cy5wdXNoKFttb2R1bGUuaWQsIFwiLmNpcmNsZUxvYWRlci0tc21hbGwge1xcbiAgd2lkdGg6IDE2cHg7XFxuICBoZWlnaHQ6IDE2cHg7XFxufVxcblxcbi5jaXJjbGVMb2FkZXItLW1lZGl1bSB7XFxuICB3aWR0aDogMzJweDtcXG4gIGhlaWdodDogMzJweDtcXG59XFxuXFxuLmNpcmNsZUxvYWRlci0tbGFyZ2Uge1xcbiAgd2lkdGg6IDY0cHg7XFxuICBoZWlnaHQ6IDY0cHg7XFxufVwiLCBcIlwiXSk7XG5cbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///232\n')},function(module,exports,__webpack_require__){eval('/* WEBPACK VAR INJECTION */(function(global, process) {(function (global, undefined) {\n    "use strict";\n\n    if (global.setImmediate) {\n        return;\n    }\n\n    var nextHandle = 1; // Spec says greater than zero\n    var tasksByHandle = {};\n    var currentlyRunningATask = false;\n    var doc = global.document;\n    var registerImmediate;\n\n    function setImmediate(callback) {\n      // Callback can either be a function or a string\n      if (typeof callback !== "function") {\n        callback = new Function("" + callback);\n      }\n      // Copy function arguments\n      var args = new Array(arguments.length - 1);\n      for (var i = 0; i < args.length; i++) {\n          args[i] = arguments[i + 1];\n      }\n      // Store and register the task\n      var task = { callback: callback, args: args };\n      tasksByHandle[nextHandle] = task;\n      registerImmediate(nextHandle);\n      return nextHandle++;\n    }\n\n    function clearImmediate(handle) {\n        delete tasksByHandle[handle];\n    }\n\n    function run(task) {\n        var callback = task.callback;\n        var args = task.args;\n        switch (args.length) {\n        case 0:\n            callback();\n            break;\n        case 1:\n            callback(args[0]);\n            break;\n        case 2:\n            callback(args[0], args[1]);\n            break;\n        case 3:\n            callback(args[0], args[1], args[2]);\n            break;\n        default:\n            callback.apply(undefined, args);\n            break;\n        }\n    }\n\n    function runIfPresent(handle) {\n        // From the spec: "Wait until any invocations of this algorithm started before this one have completed."\n        // So if we\'re currently running a task, we\'ll need to delay this invocation.\n        if (currentlyRunningATask) {\n            // Delay by doing a setTimeout. setImmediate was tried instead, but in Firefox 7 it generated a\n            // "too much recursion" error.\n            setTimeout(runIfPresent, 0, handle);\n        } else {\n            var task = tasksByHandle[handle];\n            if (task) {\n                currentlyRunningATask = true;\n                try {\n                    run(task);\n                } finally {\n                    clearImmediate(handle);\n                    currentlyRunningATask = false;\n                }\n            }\n        }\n    }\n\n    function installNextTickImplementation() {\n        registerImmediate = function(handle) {\n            process.nextTick(function () { runIfPresent(handle); });\n        };\n    }\n\n    function canUsePostMessage() {\n        // The test against `importScripts` prevents this implementation from being installed inside a web worker,\n        // where `global.postMessage` means something completely different and can\'t be used for this purpose.\n        if (global.postMessage && !global.importScripts) {\n            var postMessageIsAsynchronous = true;\n            var oldOnMessage = global.onmessage;\n            global.onmessage = function() {\n                postMessageIsAsynchronous = false;\n            };\n            global.postMessage("", "*");\n            global.onmessage = oldOnMessage;\n            return postMessageIsAsynchronous;\n        }\n    }\n\n    function installPostMessageImplementation() {\n        // Installs an event handler on `global` for the `message` event: see\n        // * https://developer.mozilla.org/en/DOM/window.postMessage\n        // * http://www.whatwg.org/specs/web-apps/current-work/multipage/comms.html#crossDocumentMessages\n\n        var messagePrefix = "setImmediate$" + Math.random() + "$";\n        var onGlobalMessage = function(event) {\n            if (event.source === global &&\n                typeof event.data === "string" &&\n                event.data.indexOf(messagePrefix) === 0) {\n                runIfPresent(+event.data.slice(messagePrefix.length));\n            }\n        };\n\n        if (global.addEventListener) {\n            global.addEventListener("message", onGlobalMessage, false);\n        } else {\n            global.attachEvent("onmessage", onGlobalMessage);\n        }\n\n        registerImmediate = function(handle) {\n            global.postMessage(messagePrefix + handle, "*");\n        };\n    }\n\n    function installMessageChannelImplementation() {\n        var channel = new MessageChannel();\n        channel.port1.onmessage = function(event) {\n            var handle = event.data;\n            runIfPresent(handle);\n        };\n\n        registerImmediate = function(handle) {\n            channel.port2.postMessage(handle);\n        };\n    }\n\n    function installReadyStateChangeImplementation() {\n        var html = doc.documentElement;\n        registerImmediate = function(handle) {\n            // Create a <script> element; its readystatechange event will be fired asynchronously once it is inserted\n            // into the document. Do so, thus queuing up the task. Remember to clean up once it\'s been called.\n            var script = doc.createElement("script");\n            script.onreadystatechange = function () {\n                runIfPresent(handle);\n                script.onreadystatechange = null;\n                html.removeChild(script);\n                script = null;\n            };\n            html.appendChild(script);\n        };\n    }\n\n    function installSetTimeoutImplementation() {\n        registerImmediate = function(handle) {\n            setTimeout(runIfPresent, 0, handle);\n        };\n    }\n\n    // If supported, we should attach to the prototype of global, since that is where setTimeout et al. live.\n    var attachTo = Object.getPrototypeOf && Object.getPrototypeOf(global);\n    attachTo = attachTo && attachTo.setTimeout ? attachTo : global;\n\n    // Don\'t get fooled by e.g. browserify environments.\n    if ({}.toString.call(global.process) === "[object process]") {\n        // For Node.js before 0.9\n        installNextTickImplementation();\n\n    } else if (canUsePostMessage()) {\n        // For non-IE10 modern browsers\n        installPostMessageImplementation();\n\n    } else if (global.MessageChannel) {\n        // For web workers, where supported\n        installMessageChannelImplementation();\n\n    } else if (doc && "onreadystatechange" in doc.createElement("script")) {\n        // For IE 6–8\n        installReadyStateChangeImplementation();\n\n    } else {\n        // For older browsers\n        installSetTimeoutImplementation();\n    }\n\n    attachTo.setImmediate = setImmediate;\n    attachTo.clearImmediate = clearImmediate;\n}(typeof self === "undefined" ? typeof global === "undefined" ? this : global : self));\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(21), __webpack_require__(16)))//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjMzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL3NldGltbWVkaWF0ZS9zZXRJbW1lZGlhdGUuanM/NjAxNyJdLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gKGdsb2JhbCwgdW5kZWZpbmVkKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBpZiAoZ2xvYmFsLnNldEltbWVkaWF0ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIG5leHRIYW5kbGUgPSAxOyAvLyBTcGVjIHNheXMgZ3JlYXRlciB0aGFuIHplcm9cbiAgICB2YXIgdGFza3NCeUhhbmRsZSA9IHt9O1xuICAgIHZhciBjdXJyZW50bHlSdW5uaW5nQVRhc2sgPSBmYWxzZTtcbiAgICB2YXIgZG9jID0gZ2xvYmFsLmRvY3VtZW50O1xuICAgIHZhciByZWdpc3RlckltbWVkaWF0ZTtcblxuICAgIGZ1bmN0aW9uIHNldEltbWVkaWF0ZShjYWxsYmFjaykge1xuICAgICAgLy8gQ2FsbGJhY2sgY2FuIGVpdGhlciBiZSBhIGZ1bmN0aW9uIG9yIGEgc3RyaW5nXG4gICAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgY2FsbGJhY2sgPSBuZXcgRnVuY3Rpb24oXCJcIiArIGNhbGxiYWNrKTtcbiAgICAgIH1cbiAgICAgIC8vIENvcHkgZnVuY3Rpb24gYXJndW1lbnRzXG4gICAgICB2YXIgYXJncyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoIC0gMSk7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBhcmdzW2ldID0gYXJndW1lbnRzW2kgKyAxXTtcbiAgICAgIH1cbiAgICAgIC8vIFN0b3JlIGFuZCByZWdpc3RlciB0aGUgdGFza1xuICAgICAgdmFyIHRhc2sgPSB7IGNhbGxiYWNrOiBjYWxsYmFjaywgYXJnczogYXJncyB9O1xuICAgICAgdGFza3NCeUhhbmRsZVtuZXh0SGFuZGxlXSA9IHRhc2s7XG4gICAgICByZWdpc3RlckltbWVkaWF0ZShuZXh0SGFuZGxlKTtcbiAgICAgIHJldHVybiBuZXh0SGFuZGxlKys7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2xlYXJJbW1lZGlhdGUoaGFuZGxlKSB7XG4gICAgICAgIGRlbGV0ZSB0YXNrc0J5SGFuZGxlW2hhbmRsZV07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcnVuKHRhc2spIHtcbiAgICAgICAgdmFyIGNhbGxiYWNrID0gdGFzay5jYWxsYmFjaztcbiAgICAgICAgdmFyIGFyZ3MgPSB0YXNrLmFyZ3M7XG4gICAgICAgIHN3aXRjaCAoYXJncy5sZW5ndGgpIHtcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICBjYWxsYmFjayhhcmdzWzBdKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICBjYWxsYmFjayhhcmdzWzBdLCBhcmdzWzFdKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICBjYWxsYmFjayhhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgY2FsbGJhY2suYXBwbHkodW5kZWZpbmVkLCBhcmdzKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcnVuSWZQcmVzZW50KGhhbmRsZSkge1xuICAgICAgICAvLyBGcm9tIHRoZSBzcGVjOiBcIldhaXQgdW50aWwgYW55IGludm9jYXRpb25zIG9mIHRoaXMgYWxnb3JpdGhtIHN0YXJ0ZWQgYmVmb3JlIHRoaXMgb25lIGhhdmUgY29tcGxldGVkLlwiXG4gICAgICAgIC8vIFNvIGlmIHdlJ3JlIGN1cnJlbnRseSBydW5uaW5nIGEgdGFzaywgd2UnbGwgbmVlZCB0byBkZWxheSB0aGlzIGludm9jYXRpb24uXG4gICAgICAgIGlmIChjdXJyZW50bHlSdW5uaW5nQVRhc2spIHtcbiAgICAgICAgICAgIC8vIERlbGF5IGJ5IGRvaW5nIGEgc2V0VGltZW91dC4gc2V0SW1tZWRpYXRlIHdhcyB0cmllZCBpbnN0ZWFkLCBidXQgaW4gRmlyZWZveCA3IGl0IGdlbmVyYXRlZCBhXG4gICAgICAgICAgICAvLyBcInRvbyBtdWNoIHJlY3Vyc2lvblwiIGVycm9yLlxuICAgICAgICAgICAgc2V0VGltZW91dChydW5JZlByZXNlbnQsIDAsIGhhbmRsZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YXIgdGFzayA9IHRhc2tzQnlIYW5kbGVbaGFuZGxlXTtcbiAgICAgICAgICAgIGlmICh0YXNrKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudGx5UnVubmluZ0FUYXNrID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBydW4odGFzayk7XG4gICAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgY2xlYXJJbW1lZGlhdGUoaGFuZGxlKTtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudGx5UnVubmluZ0FUYXNrID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaW5zdGFsbE5leHRUaWNrSW1wbGVtZW50YXRpb24oKSB7XG4gICAgICAgIHJlZ2lzdGVySW1tZWRpYXRlID0gZnVuY3Rpb24oaGFuZGxlKSB7XG4gICAgICAgICAgICBwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uICgpIHsgcnVuSWZQcmVzZW50KGhhbmRsZSk7IH0pO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNhblVzZVBvc3RNZXNzYWdlKCkge1xuICAgICAgICAvLyBUaGUgdGVzdCBhZ2FpbnN0IGBpbXBvcnRTY3JpcHRzYCBwcmV2ZW50cyB0aGlzIGltcGxlbWVudGF0aW9uIGZyb20gYmVpbmcgaW5zdGFsbGVkIGluc2lkZSBhIHdlYiB3b3JrZXIsXG4gICAgICAgIC8vIHdoZXJlIGBnbG9iYWwucG9zdE1lc3NhZ2VgIG1lYW5zIHNvbWV0aGluZyBjb21wbGV0ZWx5IGRpZmZlcmVudCBhbmQgY2FuJ3QgYmUgdXNlZCBmb3IgdGhpcyBwdXJwb3NlLlxuICAgICAgICBpZiAoZ2xvYmFsLnBvc3RNZXNzYWdlICYmICFnbG9iYWwuaW1wb3J0U2NyaXB0cykge1xuICAgICAgICAgICAgdmFyIHBvc3RNZXNzYWdlSXNBc3luY2hyb25vdXMgPSB0cnVlO1xuICAgICAgICAgICAgdmFyIG9sZE9uTWVzc2FnZSA9IGdsb2JhbC5vbm1lc3NhZ2U7XG4gICAgICAgICAgICBnbG9iYWwub25tZXNzYWdlID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcG9zdE1lc3NhZ2VJc0FzeW5jaHJvbm91cyA9IGZhbHNlO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGdsb2JhbC5wb3N0TWVzc2FnZShcIlwiLCBcIipcIik7XG4gICAgICAgICAgICBnbG9iYWwub25tZXNzYWdlID0gb2xkT25NZXNzYWdlO1xuICAgICAgICAgICAgcmV0dXJuIHBvc3RNZXNzYWdlSXNBc3luY2hyb25vdXM7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpbnN0YWxsUG9zdE1lc3NhZ2VJbXBsZW1lbnRhdGlvbigpIHtcbiAgICAgICAgLy8gSW5zdGFsbHMgYW4gZXZlbnQgaGFuZGxlciBvbiBgZ2xvYmFsYCBmb3IgdGhlIGBtZXNzYWdlYCBldmVudDogc2VlXG4gICAgICAgIC8vICogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vRE9NL3dpbmRvdy5wb3N0TWVzc2FnZVxuICAgICAgICAvLyAqIGh0dHA6Ly93d3cud2hhdHdnLm9yZy9zcGVjcy93ZWItYXBwcy9jdXJyZW50LXdvcmsvbXVsdGlwYWdlL2NvbW1zLmh0bWwjY3Jvc3NEb2N1bWVudE1lc3NhZ2VzXG5cbiAgICAgICAgdmFyIG1lc3NhZ2VQcmVmaXggPSBcInNldEltbWVkaWF0ZSRcIiArIE1hdGgucmFuZG9tKCkgKyBcIiRcIjtcbiAgICAgICAgdmFyIG9uR2xvYmFsTWVzc2FnZSA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgICAgICBpZiAoZXZlbnQuc291cmNlID09PSBnbG9iYWwgJiZcbiAgICAgICAgICAgICAgICB0eXBlb2YgZXZlbnQuZGF0YSA9PT0gXCJzdHJpbmdcIiAmJlxuICAgICAgICAgICAgICAgIGV2ZW50LmRhdGEuaW5kZXhPZihtZXNzYWdlUHJlZml4KSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJ1bklmUHJlc2VudCgrZXZlbnQuZGF0YS5zbGljZShtZXNzYWdlUHJlZml4Lmxlbmd0aCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChnbG9iYWwuYWRkRXZlbnRMaXN0ZW5lcikge1xuICAgICAgICAgICAgZ2xvYmFsLmFkZEV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIG9uR2xvYmFsTWVzc2FnZSwgZmFsc2UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZ2xvYmFsLmF0dGFjaEV2ZW50KFwib25tZXNzYWdlXCIsIG9uR2xvYmFsTWVzc2FnZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZWdpc3RlckltbWVkaWF0ZSA9IGZ1bmN0aW9uKGhhbmRsZSkge1xuICAgICAgICAgICAgZ2xvYmFsLnBvc3RNZXNzYWdlKG1lc3NhZ2VQcmVmaXggKyBoYW5kbGUsIFwiKlwiKTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpbnN0YWxsTWVzc2FnZUNoYW5uZWxJbXBsZW1lbnRhdGlvbigpIHtcbiAgICAgICAgdmFyIGNoYW5uZWwgPSBuZXcgTWVzc2FnZUNoYW5uZWwoKTtcbiAgICAgICAgY2hhbm5lbC5wb3J0MS5vbm1lc3NhZ2UgPSBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgICAgdmFyIGhhbmRsZSA9IGV2ZW50LmRhdGE7XG4gICAgICAgICAgICBydW5JZlByZXNlbnQoaGFuZGxlKTtcbiAgICAgICAgfTtcblxuICAgICAgICByZWdpc3RlckltbWVkaWF0ZSA9IGZ1bmN0aW9uKGhhbmRsZSkge1xuICAgICAgICAgICAgY2hhbm5lbC5wb3J0Mi5wb3N0TWVzc2FnZShoYW5kbGUpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGluc3RhbGxSZWFkeVN0YXRlQ2hhbmdlSW1wbGVtZW50YXRpb24oKSB7XG4gICAgICAgIHZhciBodG1sID0gZG9jLmRvY3VtZW50RWxlbWVudDtcbiAgICAgICAgcmVnaXN0ZXJJbW1lZGlhdGUgPSBmdW5jdGlvbihoYW5kbGUpIHtcbiAgICAgICAgICAgIC8vIENyZWF0ZSBhIDxzY3JpcHQ+IGVsZW1lbnQ7IGl0cyByZWFkeXN0YXRlY2hhbmdlIGV2ZW50IHdpbGwgYmUgZmlyZWQgYXN5bmNocm9ub3VzbHkgb25jZSBpdCBpcyBpbnNlcnRlZFxuICAgICAgICAgICAgLy8gaW50byB0aGUgZG9jdW1lbnQuIERvIHNvLCB0aHVzIHF1ZXVpbmcgdXAgdGhlIHRhc2suIFJlbWVtYmVyIHRvIGNsZWFuIHVwIG9uY2UgaXQncyBiZWVuIGNhbGxlZC5cbiAgICAgICAgICAgIHZhciBzY3JpcHQgPSBkb2MuY3JlYXRlRWxlbWVudChcInNjcmlwdFwiKTtcbiAgICAgICAgICAgIHNjcmlwdC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcnVuSWZQcmVzZW50KGhhbmRsZSk7XG4gICAgICAgICAgICAgICAgc2NyaXB0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgaHRtbC5yZW1vdmVDaGlsZChzY3JpcHQpO1xuICAgICAgICAgICAgICAgIHNjcmlwdCA9IG51bGw7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaHRtbC5hcHBlbmRDaGlsZChzY3JpcHQpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGluc3RhbGxTZXRUaW1lb3V0SW1wbGVtZW50YXRpb24oKSB7XG4gICAgICAgIHJlZ2lzdGVySW1tZWRpYXRlID0gZnVuY3Rpb24oaGFuZGxlKSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KHJ1bklmUHJlc2VudCwgMCwgaGFuZGxlKTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBJZiBzdXBwb3J0ZWQsIHdlIHNob3VsZCBhdHRhY2ggdG8gdGhlIHByb3RvdHlwZSBvZiBnbG9iYWwsIHNpbmNlIHRoYXQgaXMgd2hlcmUgc2V0VGltZW91dCBldCBhbC4gbGl2ZS5cbiAgICB2YXIgYXR0YWNoVG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YgJiYgT2JqZWN0LmdldFByb3RvdHlwZU9mKGdsb2JhbCk7XG4gICAgYXR0YWNoVG8gPSBhdHRhY2hUbyAmJiBhdHRhY2hUby5zZXRUaW1lb3V0ID8gYXR0YWNoVG8gOiBnbG9iYWw7XG5cbiAgICAvLyBEb24ndCBnZXQgZm9vbGVkIGJ5IGUuZy4gYnJvd3NlcmlmeSBlbnZpcm9ubWVudHMuXG4gICAgaWYgKHt9LnRvU3RyaW5nLmNhbGwoZ2xvYmFsLnByb2Nlc3MpID09PSBcIltvYmplY3QgcHJvY2Vzc11cIikge1xuICAgICAgICAvLyBGb3IgTm9kZS5qcyBiZWZvcmUgMC45XG4gICAgICAgIGluc3RhbGxOZXh0VGlja0ltcGxlbWVudGF0aW9uKCk7XG5cbiAgICB9IGVsc2UgaWYgKGNhblVzZVBvc3RNZXNzYWdlKCkpIHtcbiAgICAgICAgLy8gRm9yIG5vbi1JRTEwIG1vZGVybiBicm93c2Vyc1xuICAgICAgICBpbnN0YWxsUG9zdE1lc3NhZ2VJbXBsZW1lbnRhdGlvbigpO1xuXG4gICAgfSBlbHNlIGlmIChnbG9iYWwuTWVzc2FnZUNoYW5uZWwpIHtcbiAgICAgICAgLy8gRm9yIHdlYiB3b3JrZXJzLCB3aGVyZSBzdXBwb3J0ZWRcbiAgICAgICAgaW5zdGFsbE1lc3NhZ2VDaGFubmVsSW1wbGVtZW50YXRpb24oKTtcblxuICAgIH0gZWxzZSBpZiAoZG9jICYmIFwib25yZWFkeXN0YXRlY2hhbmdlXCIgaW4gZG9jLmNyZWF0ZUVsZW1lbnQoXCJzY3JpcHRcIikpIHtcbiAgICAgICAgLy8gRm9yIElFIDbigJM4XG4gICAgICAgIGluc3RhbGxSZWFkeVN0YXRlQ2hhbmdlSW1wbGVtZW50YXRpb24oKTtcblxuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEZvciBvbGRlciBicm93c2Vyc1xuICAgICAgICBpbnN0YWxsU2V0VGltZW91dEltcGxlbWVudGF0aW9uKCk7XG4gICAgfVxuXG4gICAgYXR0YWNoVG8uc2V0SW1tZWRpYXRlID0gc2V0SW1tZWRpYXRlO1xuICAgIGF0dGFjaFRvLmNsZWFySW1tZWRpYXRlID0gY2xlYXJJbW1lZGlhdGU7XG59KHR5cGVvZiBzZWxmID09PSBcInVuZGVmaW5lZFwiID8gdHlwZW9mIGdsb2JhbCA9PT0gXCJ1bmRlZmluZWRcIiA/IHRoaXMgOiBnbG9iYWwgOiBzZWxmKSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///233\n')},function(module,exports,__webpack_require__){"use strict";eval("\n\nexports.byteLength = byteLength\nexports.toByteArray = toByteArray\nexports.fromByteArray = fromByteArray\n\nvar lookup = []\nvar revLookup = []\nvar Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array\n\nvar code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\nfor (var i = 0, len = code.length; i < len; ++i) {\n  lookup[i] = code[i]\n  revLookup[code.charCodeAt(i)] = i\n}\n\n// Support decoding URL-safe base64 strings, as Node.js does.\n// See: https://en.wikipedia.org/wiki/Base64#URL_applications\nrevLookup['-'.charCodeAt(0)] = 62\nrevLookup['_'.charCodeAt(0)] = 63\n\nfunction getLens (b64) {\n  var len = b64.length\n\n  if (len % 4 > 0) {\n    throw new Error('Invalid string. Length must be a multiple of 4')\n  }\n\n  // Trim off extra bytes after placeholder bytes are found\n  // See: https://github.com/beatgammit/base64-js/issues/42\n  var validLen = b64.indexOf('=')\n  if (validLen === -1) validLen = len\n\n  var placeHoldersLen = validLen === len\n    ? 0\n    : 4 - (validLen % 4)\n\n  return [validLen, placeHoldersLen]\n}\n\n// base64 is 4/3 + up to two characters of the original data\nfunction byteLength (b64) {\n  var lens = getLens(b64)\n  var validLen = lens[0]\n  var placeHoldersLen = lens[1]\n  return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction _byteLength (b64, validLen, placeHoldersLen) {\n  return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction toByteArray (b64) {\n  var tmp\n  var lens = getLens(b64)\n  var validLen = lens[0]\n  var placeHoldersLen = lens[1]\n\n  var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen))\n\n  var curByte = 0\n\n  // if there are placeholders, only get up to the last complete 4 chars\n  var len = placeHoldersLen > 0\n    ? validLen - 4\n    : validLen\n\n  var i\n  for (i = 0; i < len; i += 4) {\n    tmp =\n      (revLookup[b64.charCodeAt(i)] << 18) |\n      (revLookup[b64.charCodeAt(i + 1)] << 12) |\n      (revLookup[b64.charCodeAt(i + 2)] << 6) |\n      revLookup[b64.charCodeAt(i + 3)]\n    arr[curByte++] = (tmp >> 16) & 0xFF\n    arr[curByte++] = (tmp >> 8) & 0xFF\n    arr[curByte++] = tmp & 0xFF\n  }\n\n  if (placeHoldersLen === 2) {\n    tmp =\n      (revLookup[b64.charCodeAt(i)] << 2) |\n      (revLookup[b64.charCodeAt(i + 1)] >> 4)\n    arr[curByte++] = tmp & 0xFF\n  }\n\n  if (placeHoldersLen === 1) {\n    tmp =\n      (revLookup[b64.charCodeAt(i)] << 10) |\n      (revLookup[b64.charCodeAt(i + 1)] << 4) |\n      (revLookup[b64.charCodeAt(i + 2)] >> 2)\n    arr[curByte++] = (tmp >> 8) & 0xFF\n    arr[curByte++] = tmp & 0xFF\n  }\n\n  return arr\n}\n\nfunction tripletToBase64 (num) {\n  return lookup[num >> 18 & 0x3F] +\n    lookup[num >> 12 & 0x3F] +\n    lookup[num >> 6 & 0x3F] +\n    lookup[num & 0x3F]\n}\n\nfunction encodeChunk (uint8, start, end) {\n  var tmp\n  var output = []\n  for (var i = start; i < end; i += 3) {\n    tmp =\n      ((uint8[i] << 16) & 0xFF0000) +\n      ((uint8[i + 1] << 8) & 0xFF00) +\n      (uint8[i + 2] & 0xFF)\n    output.push(tripletToBase64(tmp))\n  }\n  return output.join('')\n}\n\nfunction fromByteArray (uint8) {\n  var tmp\n  var len = uint8.length\n  var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes\n  var parts = []\n  var maxChunkLength = 16383 // must be multiple of 3\n\n  // go through the array every three bytes, we'll deal with trailing stuff later\n  for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {\n    parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)))\n  }\n\n  // pad the end with zeros, but make sure to not forget the extra bytes\n  if (extraBytes === 1) {\n    tmp = uint8[len - 1]\n    parts.push(\n      lookup[tmp >> 2] +\n      lookup[(tmp << 4) & 0x3F] +\n      '=='\n    )\n  } else if (extraBytes === 2) {\n    tmp = (uint8[len - 2] << 8) + uint8[len - 1]\n    parts.push(\n      lookup[tmp >> 10] +\n      lookup[(tmp >> 4) & 0x3F] +\n      lookup[(tmp << 2) & 0x3F] +\n      '='\n    )\n  }\n\n  return parts.join('')\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjM0LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2Jhc2U2NC1qcy9pbmRleC5qcz8xZmI1Il0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0J1xuXG5leHBvcnRzLmJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoXG5leHBvcnRzLnRvQnl0ZUFycmF5ID0gdG9CeXRlQXJyYXlcbmV4cG9ydHMuZnJvbUJ5dGVBcnJheSA9IGZyb21CeXRlQXJyYXlcblxudmFyIGxvb2t1cCA9IFtdXG52YXIgcmV2TG9va3VwID0gW11cbnZhciBBcnIgPSB0eXBlb2YgVWludDhBcnJheSAhPT0gJ3VuZGVmaW5lZCcgPyBVaW50OEFycmF5IDogQXJyYXlcblxudmFyIGNvZGUgPSAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLydcbmZvciAodmFyIGkgPSAwLCBsZW4gPSBjb2RlLmxlbmd0aDsgaSA8IGxlbjsgKytpKSB7XG4gIGxvb2t1cFtpXSA9IGNvZGVbaV1cbiAgcmV2TG9va3VwW2NvZGUuY2hhckNvZGVBdChpKV0gPSBpXG59XG5cbi8vIFN1cHBvcnQgZGVjb2RpbmcgVVJMLXNhZmUgYmFzZTY0IHN0cmluZ3MsIGFzIE5vZGUuanMgZG9lcy5cbi8vIFNlZTogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQmFzZTY0I1VSTF9hcHBsaWNhdGlvbnNcbnJldkxvb2t1cFsnLScuY2hhckNvZGVBdCgwKV0gPSA2MlxucmV2TG9va3VwWydfJy5jaGFyQ29kZUF0KDApXSA9IDYzXG5cbmZ1bmN0aW9uIGdldExlbnMgKGI2NCkge1xuICB2YXIgbGVuID0gYjY0Lmxlbmd0aFxuXG4gIGlmIChsZW4gJSA0ID4gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBzdHJpbmcuIExlbmd0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCcpXG4gIH1cblxuICAvLyBUcmltIG9mZiBleHRyYSBieXRlcyBhZnRlciBwbGFjZWhvbGRlciBieXRlcyBhcmUgZm91bmRcbiAgLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vYmVhdGdhbW1pdC9iYXNlNjQtanMvaXNzdWVzLzQyXG4gIHZhciB2YWxpZExlbiA9IGI2NC5pbmRleE9mKCc9JylcbiAgaWYgKHZhbGlkTGVuID09PSAtMSkgdmFsaWRMZW4gPSBsZW5cblxuICB2YXIgcGxhY2VIb2xkZXJzTGVuID0gdmFsaWRMZW4gPT09IGxlblxuICAgID8gMFxuICAgIDogNCAtICh2YWxpZExlbiAlIDQpXG5cbiAgcmV0dXJuIFt2YWxpZExlbiwgcGxhY2VIb2xkZXJzTGVuXVxufVxuXG4vLyBiYXNlNjQgaXMgNC8zICsgdXAgdG8gdHdvIGNoYXJhY3RlcnMgb2YgdGhlIG9yaWdpbmFsIGRhdGFcbmZ1bmN0aW9uIGJ5dGVMZW5ndGggKGI2NCkge1xuICB2YXIgbGVucyA9IGdldExlbnMoYjY0KVxuICB2YXIgdmFsaWRMZW4gPSBsZW5zWzBdXG4gIHZhciBwbGFjZUhvbGRlcnNMZW4gPSBsZW5zWzFdXG4gIHJldHVybiAoKHZhbGlkTGVuICsgcGxhY2VIb2xkZXJzTGVuKSAqIDMgLyA0KSAtIHBsYWNlSG9sZGVyc0xlblxufVxuXG5mdW5jdGlvbiBfYnl0ZUxlbmd0aCAoYjY0LCB2YWxpZExlbiwgcGxhY2VIb2xkZXJzTGVuKSB7XG4gIHJldHVybiAoKHZhbGlkTGVuICsgcGxhY2VIb2xkZXJzTGVuKSAqIDMgLyA0KSAtIHBsYWNlSG9sZGVyc0xlblxufVxuXG5mdW5jdGlvbiB0b0J5dGVBcnJheSAoYjY0KSB7XG4gIHZhciB0bXBcbiAgdmFyIGxlbnMgPSBnZXRMZW5zKGI2NClcbiAgdmFyIHZhbGlkTGVuID0gbGVuc1swXVxuICB2YXIgcGxhY2VIb2xkZXJzTGVuID0gbGVuc1sxXVxuXG4gIHZhciBhcnIgPSBuZXcgQXJyKF9ieXRlTGVuZ3RoKGI2NCwgdmFsaWRMZW4sIHBsYWNlSG9sZGVyc0xlbikpXG5cbiAgdmFyIGN1ckJ5dGUgPSAwXG5cbiAgLy8gaWYgdGhlcmUgYXJlIHBsYWNlaG9sZGVycywgb25seSBnZXQgdXAgdG8gdGhlIGxhc3QgY29tcGxldGUgNCBjaGFyc1xuICB2YXIgbGVuID0gcGxhY2VIb2xkZXJzTGVuID4gMFxuICAgID8gdmFsaWRMZW4gLSA0XG4gICAgOiB2YWxpZExlblxuXG4gIHZhciBpXG4gIGZvciAoaSA9IDA7IGkgPCBsZW47IGkgKz0gNCkge1xuICAgIHRtcCA9XG4gICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkpXSA8PCAxOCkgfFxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMSldIDw8IDEyKSB8XG4gICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAyKV0gPDwgNikgfFxuICAgICAgcmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAzKV1cbiAgICBhcnJbY3VyQnl0ZSsrXSA9ICh0bXAgPj4gMTYpICYgMHhGRlxuICAgIGFycltjdXJCeXRlKytdID0gKHRtcCA+PiA4KSAmIDB4RkZcbiAgICBhcnJbY3VyQnl0ZSsrXSA9IHRtcCAmIDB4RkZcbiAgfVxuXG4gIGlmIChwbGFjZUhvbGRlcnNMZW4gPT09IDIpIHtcbiAgICB0bXAgPVxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpKV0gPDwgMikgfFxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMSldID4+IDQpXG4gICAgYXJyW2N1ckJ5dGUrK10gPSB0bXAgJiAweEZGXG4gIH1cblxuICBpZiAocGxhY2VIb2xkZXJzTGVuID09PSAxKSB7XG4gICAgdG1wID1cbiAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSldIDw8IDEwKSB8XG4gICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAxKV0gPDwgNCkgfFxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMildID4+IDIpXG4gICAgYXJyW2N1ckJ5dGUrK10gPSAodG1wID4+IDgpICYgMHhGRlxuICAgIGFycltjdXJCeXRlKytdID0gdG1wICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIGFyclxufVxuXG5mdW5jdGlvbiB0cmlwbGV0VG9CYXNlNjQgKG51bSkge1xuICByZXR1cm4gbG9va3VwW251bSA+PiAxOCAmIDB4M0ZdICtcbiAgICBsb29rdXBbbnVtID4+IDEyICYgMHgzRl0gK1xuICAgIGxvb2t1cFtudW0gPj4gNiAmIDB4M0ZdICtcbiAgICBsb29rdXBbbnVtICYgMHgzRl1cbn1cblxuZnVuY3Rpb24gZW5jb2RlQ2h1bmsgKHVpbnQ4LCBzdGFydCwgZW5kKSB7XG4gIHZhciB0bXBcbiAgdmFyIG91dHB1dCA9IFtdXG4gIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgaSArPSAzKSB7XG4gICAgdG1wID1cbiAgICAgICgodWludDhbaV0gPDwgMTYpICYgMHhGRjAwMDApICtcbiAgICAgICgodWludDhbaSArIDFdIDw8IDgpICYgMHhGRjAwKSArXG4gICAgICAodWludDhbaSArIDJdICYgMHhGRilcbiAgICBvdXRwdXQucHVzaCh0cmlwbGV0VG9CYXNlNjQodG1wKSlcbiAgfVxuICByZXR1cm4gb3V0cHV0LmpvaW4oJycpXG59XG5cbmZ1bmN0aW9uIGZyb21CeXRlQXJyYXkgKHVpbnQ4KSB7XG4gIHZhciB0bXBcbiAgdmFyIGxlbiA9IHVpbnQ4Lmxlbmd0aFxuICB2YXIgZXh0cmFCeXRlcyA9IGxlbiAlIDMgLy8gaWYgd2UgaGF2ZSAxIGJ5dGUgbGVmdCwgcGFkIDIgYnl0ZXNcbiAgdmFyIHBhcnRzID0gW11cbiAgdmFyIG1heENodW5rTGVuZ3RoID0gMTYzODMgLy8gbXVzdCBiZSBtdWx0aXBsZSBvZiAzXG5cbiAgLy8gZ28gdGhyb3VnaCB0aGUgYXJyYXkgZXZlcnkgdGhyZWUgYnl0ZXMsIHdlJ2xsIGRlYWwgd2l0aCB0cmFpbGluZyBzdHVmZiBsYXRlclxuICBmb3IgKHZhciBpID0gMCwgbGVuMiA9IGxlbiAtIGV4dHJhQnl0ZXM7IGkgPCBsZW4yOyBpICs9IG1heENodW5rTGVuZ3RoKSB7XG4gICAgcGFydHMucHVzaChlbmNvZGVDaHVuayh1aW50OCwgaSwgKGkgKyBtYXhDaHVua0xlbmd0aCkgPiBsZW4yID8gbGVuMiA6IChpICsgbWF4Q2h1bmtMZW5ndGgpKSlcbiAgfVxuXG4gIC8vIHBhZCB0aGUgZW5kIHdpdGggemVyb3MsIGJ1dCBtYWtlIHN1cmUgdG8gbm90IGZvcmdldCB0aGUgZXh0cmEgYnl0ZXNcbiAgaWYgKGV4dHJhQnl0ZXMgPT09IDEpIHtcbiAgICB0bXAgPSB1aW50OFtsZW4gLSAxXVxuICAgIHBhcnRzLnB1c2goXG4gICAgICBsb29rdXBbdG1wID4+IDJdICtcbiAgICAgIGxvb2t1cFsodG1wIDw8IDQpICYgMHgzRl0gK1xuICAgICAgJz09J1xuICAgIClcbiAgfSBlbHNlIGlmIChleHRyYUJ5dGVzID09PSAyKSB7XG4gICAgdG1wID0gKHVpbnQ4W2xlbiAtIDJdIDw8IDgpICsgdWludDhbbGVuIC0gMV1cbiAgICBwYXJ0cy5wdXNoKFxuICAgICAgbG9va3VwW3RtcCA+PiAxMF0gK1xuICAgICAgbG9va3VwWyh0bXAgPj4gNCkgJiAweDNGXSArXG4gICAgICBsb29rdXBbKHRtcCA8PCAyKSAmIDB4M0ZdICtcbiAgICAgICc9J1xuICAgIClcbiAgfVxuXG4gIHJldHVybiBwYXJ0cy5qb2luKCcnKVxufVxuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///234\n")},function(module,exports){eval("/*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh <https://feross.org/opensource> */\nexports.read = function (buffer, offset, isLE, mLen, nBytes) {\n  var e, m\n  var eLen = (nBytes * 8) - mLen - 1\n  var eMax = (1 << eLen) - 1\n  var eBias = eMax >> 1\n  var nBits = -7\n  var i = isLE ? (nBytes - 1) : 0\n  var d = isLE ? -1 : 1\n  var s = buffer[offset + i]\n\n  i += d\n\n  e = s & ((1 << (-nBits)) - 1)\n  s >>= (-nBits)\n  nBits += eLen\n  for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n  m = e & ((1 << (-nBits)) - 1)\n  e >>= (-nBits)\n  nBits += mLen\n  for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n  if (e === 0) {\n    e = 1 - eBias\n  } else if (e === eMax) {\n    return m ? NaN : ((s ? -1 : 1) * Infinity)\n  } else {\n    m = m + Math.pow(2, mLen)\n    e = e - eBias\n  }\n  return (s ? -1 : 1) * m * Math.pow(2, e - mLen)\n}\n\nexports.write = function (buffer, value, offset, isLE, mLen, nBytes) {\n  var e, m, c\n  var eLen = (nBytes * 8) - mLen - 1\n  var eMax = (1 << eLen) - 1\n  var eBias = eMax >> 1\n  var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)\n  var i = isLE ? 0 : (nBytes - 1)\n  var d = isLE ? 1 : -1\n  var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0\n\n  value = Math.abs(value)\n\n  if (isNaN(value) || value === Infinity) {\n    m = isNaN(value) ? 1 : 0\n    e = eMax\n  } else {\n    e = Math.floor(Math.log(value) / Math.LN2)\n    if (value * (c = Math.pow(2, -e)) < 1) {\n      e--\n      c *= 2\n    }\n    if (e + eBias >= 1) {\n      value += rt / c\n    } else {\n      value += rt * Math.pow(2, 1 - eBias)\n    }\n    if (value * c >= 2) {\n      e++\n      c /= 2\n    }\n\n    if (e + eBias >= eMax) {\n      m = 0\n      e = eMax\n    } else if (e + eBias >= 1) {\n      m = ((value * c) - 1) * Math.pow(2, mLen)\n      e = e + eBias\n    } else {\n      m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)\n      e = 0\n    }\n  }\n\n  for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}\n\n  e = (e << mLen) | m\n  eLen += mLen\n  for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}\n\n  buffer[offset + i - d] |= s * 128\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjM1LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2llZWU3NTQvaW5kZXguanM/OTE1MiJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiEgaWVlZTc1NC4gQlNELTMtQ2xhdXNlIExpY2Vuc2UuIEZlcm9zcyBBYm91a2hhZGlqZWggPGh0dHBzOi8vZmVyb3NzLm9yZy9vcGVuc291cmNlPiAqL1xuZXhwb3J0cy5yZWFkID0gZnVuY3Rpb24gKGJ1ZmZlciwgb2Zmc2V0LCBpc0xFLCBtTGVuLCBuQnl0ZXMpIHtcbiAgdmFyIGUsIG1cbiAgdmFyIGVMZW4gPSAobkJ5dGVzICogOCkgLSBtTGVuIC0gMVxuICB2YXIgZU1heCA9ICgxIDw8IGVMZW4pIC0gMVxuICB2YXIgZUJpYXMgPSBlTWF4ID4+IDFcbiAgdmFyIG5CaXRzID0gLTdcbiAgdmFyIGkgPSBpc0xFID8gKG5CeXRlcyAtIDEpIDogMFxuICB2YXIgZCA9IGlzTEUgPyAtMSA6IDFcbiAgdmFyIHMgPSBidWZmZXJbb2Zmc2V0ICsgaV1cblxuICBpICs9IGRcblxuICBlID0gcyAmICgoMSA8PCAoLW5CaXRzKSkgLSAxKVxuICBzID4+PSAoLW5CaXRzKVxuICBuQml0cyArPSBlTGVuXG4gIGZvciAoOyBuQml0cyA+IDA7IGUgPSAoZSAqIDI1NikgKyBidWZmZXJbb2Zmc2V0ICsgaV0sIGkgKz0gZCwgbkJpdHMgLT0gOCkge31cblxuICBtID0gZSAmICgoMSA8PCAoLW5CaXRzKSkgLSAxKVxuICBlID4+PSAoLW5CaXRzKVxuICBuQml0cyArPSBtTGVuXG4gIGZvciAoOyBuQml0cyA+IDA7IG0gPSAobSAqIDI1NikgKyBidWZmZXJbb2Zmc2V0ICsgaV0sIGkgKz0gZCwgbkJpdHMgLT0gOCkge31cblxuICBpZiAoZSA9PT0gMCkge1xuICAgIGUgPSAxIC0gZUJpYXNcbiAgfSBlbHNlIGlmIChlID09PSBlTWF4KSB7XG4gICAgcmV0dXJuIG0gPyBOYU4gOiAoKHMgPyAtMSA6IDEpICogSW5maW5pdHkpXG4gIH0gZWxzZSB7XG4gICAgbSA9IG0gKyBNYXRoLnBvdygyLCBtTGVuKVxuICAgIGUgPSBlIC0gZUJpYXNcbiAgfVxuICByZXR1cm4gKHMgPyAtMSA6IDEpICogbSAqIE1hdGgucG93KDIsIGUgLSBtTGVuKVxufVxuXG5leHBvcnRzLndyaXRlID0gZnVuY3Rpb24gKGJ1ZmZlciwgdmFsdWUsIG9mZnNldCwgaXNMRSwgbUxlbiwgbkJ5dGVzKSB7XG4gIHZhciBlLCBtLCBjXG4gIHZhciBlTGVuID0gKG5CeXRlcyAqIDgpIC0gbUxlbiAtIDFcbiAgdmFyIGVNYXggPSAoMSA8PCBlTGVuKSAtIDFcbiAgdmFyIGVCaWFzID0gZU1heCA+PiAxXG4gIHZhciBydCA9IChtTGVuID09PSAyMyA/IE1hdGgucG93KDIsIC0yNCkgLSBNYXRoLnBvdygyLCAtNzcpIDogMClcbiAgdmFyIGkgPSBpc0xFID8gMCA6IChuQnl0ZXMgLSAxKVxuICB2YXIgZCA9IGlzTEUgPyAxIDogLTFcbiAgdmFyIHMgPSB2YWx1ZSA8IDAgfHwgKHZhbHVlID09PSAwICYmIDEgLyB2YWx1ZSA8IDApID8gMSA6IDBcblxuICB2YWx1ZSA9IE1hdGguYWJzKHZhbHVlKVxuXG4gIGlmIChpc05hTih2YWx1ZSkgfHwgdmFsdWUgPT09IEluZmluaXR5KSB7XG4gICAgbSA9IGlzTmFOKHZhbHVlKSA/IDEgOiAwXG4gICAgZSA9IGVNYXhcbiAgfSBlbHNlIHtcbiAgICBlID0gTWF0aC5mbG9vcihNYXRoLmxvZyh2YWx1ZSkgLyBNYXRoLkxOMilcbiAgICBpZiAodmFsdWUgKiAoYyA9IE1hdGgucG93KDIsIC1lKSkgPCAxKSB7XG4gICAgICBlLS1cbiAgICAgIGMgKj0gMlxuICAgIH1cbiAgICBpZiAoZSArIGVCaWFzID49IDEpIHtcbiAgICAgIHZhbHVlICs9IHJ0IC8gY1xuICAgIH0gZWxzZSB7XG4gICAgICB2YWx1ZSArPSBydCAqIE1hdGgucG93KDIsIDEgLSBlQmlhcylcbiAgICB9XG4gICAgaWYgKHZhbHVlICogYyA+PSAyKSB7XG4gICAgICBlKytcbiAgICAgIGMgLz0gMlxuICAgIH1cblxuICAgIGlmIChlICsgZUJpYXMgPj0gZU1heCkge1xuICAgICAgbSA9IDBcbiAgICAgIGUgPSBlTWF4XG4gICAgfSBlbHNlIGlmIChlICsgZUJpYXMgPj0gMSkge1xuICAgICAgbSA9ICgodmFsdWUgKiBjKSAtIDEpICogTWF0aC5wb3coMiwgbUxlbilcbiAgICAgIGUgPSBlICsgZUJpYXNcbiAgICB9IGVsc2Uge1xuICAgICAgbSA9IHZhbHVlICogTWF0aC5wb3coMiwgZUJpYXMgLSAxKSAqIE1hdGgucG93KDIsIG1MZW4pXG4gICAgICBlID0gMFxuICAgIH1cbiAgfVxuXG4gIGZvciAoOyBtTGVuID49IDg7IGJ1ZmZlcltvZmZzZXQgKyBpXSA9IG0gJiAweGZmLCBpICs9IGQsIG0gLz0gMjU2LCBtTGVuIC09IDgpIHt9XG5cbiAgZSA9IChlIDw8IG1MZW4pIHwgbVxuICBlTGVuICs9IG1MZW5cbiAgZm9yICg7IGVMZW4gPiAwOyBidWZmZXJbb2Zmc2V0ICsgaV0gPSBlICYgMHhmZiwgaSArPSBkLCBlIC89IDI1NiwgZUxlbiAtPSA4KSB7fVxuXG4gIGJ1ZmZlcltvZmZzZXQgKyBpIC0gZF0gfD0gcyAqIDEyOFxufVxuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///235\n")},function(module,exports){eval("var toString = {}.toString;\n\nmodule.exports = Array.isArray || function (arr) {\n  return toString.call(arr) == '[object Array]';\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjM2LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2lzYXJyYXkvaW5kZXguanM/ZTNkYiJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgdG9TdHJpbmcgPSB7fS50b1N0cmluZztcblxubW9kdWxlLmV4cG9ydHMgPSBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uIChhcnIpIHtcbiAgcmV0dXJuIHRvU3RyaW5nLmNhbGwoYXJyKSA9PSAnW29iamVjdCBBcnJheV0nO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///236\n")},function(module,exports,__webpack_require__){eval("/* WEBPACK VAR INJECTION */(function(Buffer) {/**\n * Base-N/Base-X encoding/decoding functions.\n *\n * Original implementation from base-x:\n * https://github.com/cryptocoinjs/base-x\n *\n * Which is MIT licensed:\n *\n * The MIT License (MIT)\n *\n * Copyright base-x contributors (c) 2016\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\n * DEALINGS IN THE SOFTWARE.\n */\nvar api = {};\nmodule.exports = api;\n\n// baseN alphabet indexes\nvar _reverseAlphabets = {};\n\n/**\n * BaseN-encodes a Uint8Array using the given alphabet.\n *\n * @param input the Uint8Array to encode.\n * @param maxline the maximum number of encoded characters per line to use,\n *          defaults to none.\n *\n * @return the baseN-encoded output string.\n */\napi.encode = function(input, alphabet, maxline) {\n  if(typeof alphabet !== 'string') {\n    throw new TypeError('\"alphabet\" must be a string.');\n  }\n  if(maxline !== undefined && typeof maxline !== 'number') {\n    throw new TypeError('\"maxline\" must be a number.');\n  }\n\n  var output = '';\n\n  if(!(input instanceof Uint8Array)) {\n    // assume forge byte buffer\n    output = _encodeWithByteBuffer(input, alphabet);\n  } else {\n    var i = 0;\n    var base = alphabet.length;\n    var first = alphabet.charAt(0);\n    var digits = [0];\n    for(i = 0; i < input.length; ++i) {\n      for(var j = 0, carry = input[i]; j < digits.length; ++j) {\n        carry += digits[j] << 8;\n        digits[j] = carry % base;\n        carry = (carry / base) | 0;\n      }\n\n      while(carry > 0) {\n        digits.push(carry % base);\n        carry = (carry / base) | 0;\n      }\n    }\n\n    // deal with leading zeros\n    for(i = 0; input[i] === 0 && i < input.length - 1; ++i) {\n      output += first;\n    }\n    // convert digits to a string\n    for(i = digits.length - 1; i >= 0; --i) {\n      output += alphabet[digits[i]];\n    }\n  }\n\n  if(maxline) {\n    var regex = new RegExp('.{1,' + maxline + '}', 'g');\n    output = output.match(regex).join('\\r\\n');\n  }\n\n  return output;\n};\n\n/**\n * Decodes a baseN-encoded (using the given alphabet) string to a\n * Uint8Array.\n *\n * @param input the baseN-encoded input string.\n *\n * @return the Uint8Array.\n */\napi.decode = function(input, alphabet) {\n  if(typeof input !== 'string') {\n    throw new TypeError('\"input\" must be a string.');\n  }\n  if(typeof alphabet !== 'string') {\n    throw new TypeError('\"alphabet\" must be a string.');\n  }\n\n  var table = _reverseAlphabets[alphabet];\n  if(!table) {\n    // compute reverse alphabet\n    table = _reverseAlphabets[alphabet] = [];\n    for(var i = 0; i < alphabet.length; ++i) {\n      table[alphabet.charCodeAt(i)] = i;\n    }\n  }\n\n  // remove whitespace characters\n  input = input.replace(/\\s/g, '');\n\n  var base = alphabet.length;\n  var first = alphabet.charAt(0);\n  var bytes = [0];\n  for(var i = 0; i < input.length; i++) {\n    var value = table[input.charCodeAt(i)];\n    if(value === undefined) {\n      return;\n    }\n\n    for(var j = 0, carry = value; j < bytes.length; ++j) {\n      carry += bytes[j] * base;\n      bytes[j] = carry & 0xff;\n      carry >>= 8;\n    }\n\n    while(carry > 0) {\n      bytes.push(carry & 0xff);\n      carry >>= 8;\n    }\n  }\n\n  // deal with leading zeros\n  for(var k = 0; input[k] === first && k < input.length - 1; ++k) {\n    bytes.push(0);\n  }\n\n  if(typeof Buffer !== 'undefined') {\n    return Buffer.from(bytes.reverse());\n  }\n\n  return new Uint8Array(bytes.reverse());\n};\n\nfunction _encodeWithByteBuffer(input, alphabet) {\n  var i = 0;\n  var base = alphabet.length;\n  var first = alphabet.charAt(0);\n  var digits = [0];\n  for(i = 0; i < input.length(); ++i) {\n    for(var j = 0, carry = input.at(i); j < digits.length; ++j) {\n      carry += digits[j] << 8;\n      digits[j] = carry % base;\n      carry = (carry / base) | 0;\n    }\n\n    while(carry > 0) {\n      digits.push(carry % base);\n      carry = (carry / base) | 0;\n    }\n  }\n\n  var output = '';\n\n  // deal with leading zeros\n  for(i = 0; input.at(i) === 0 && i < input.length() - 1; ++i) {\n    output += first;\n  }\n  // convert digits to a string\n  for(i = digits.length - 1; i >= 0; --i) {\n    output += alphabet[digits[i]];\n  }\n\n  return output;\n}\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(30).Buffer))//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjM3LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL25vZGUtZm9yZ2UvbGliL2Jhc2VOLmpzPzI4OTAiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBCYXNlLU4vQmFzZS1YIGVuY29kaW5nL2RlY29kaW5nIGZ1bmN0aW9ucy5cbiAqXG4gKiBPcmlnaW5hbCBpbXBsZW1lbnRhdGlvbiBmcm9tIGJhc2UteDpcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9jcnlwdG9jb2luanMvYmFzZS14XG4gKlxuICogV2hpY2ggaXMgTUlUIGxpY2Vuc2VkOlxuICpcbiAqIFRoZSBNSVQgTGljZW5zZSAoTUlUKVxuICpcbiAqIENvcHlyaWdodCBiYXNlLXggY29udHJpYnV0b3JzIChjKSAyMDE2XG4gKlxuICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4gKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuICpcbiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4gKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiAqXG4gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkdcbiAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVJcbiAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cbiAqL1xudmFyIGFwaSA9IHt9O1xubW9kdWxlLmV4cG9ydHMgPSBhcGk7XG5cbi8vIGJhc2VOIGFscGhhYmV0IGluZGV4ZXNcbnZhciBfcmV2ZXJzZUFscGhhYmV0cyA9IHt9O1xuXG4vKipcbiAqIEJhc2VOLWVuY29kZXMgYSBVaW50OEFycmF5IHVzaW5nIHRoZSBnaXZlbiBhbHBoYWJldC5cbiAqXG4gKiBAcGFyYW0gaW5wdXQgdGhlIFVpbnQ4QXJyYXkgdG8gZW5jb2RlLlxuICogQHBhcmFtIG1heGxpbmUgdGhlIG1heGltdW0gbnVtYmVyIG9mIGVuY29kZWQgY2hhcmFjdGVycyBwZXIgbGluZSB0byB1c2UsXG4gKiAgICAgICAgICBkZWZhdWx0cyB0byBub25lLlxuICpcbiAqIEByZXR1cm4gdGhlIGJhc2VOLWVuY29kZWQgb3V0cHV0IHN0cmluZy5cbiAqL1xuYXBpLmVuY29kZSA9IGZ1bmN0aW9uKGlucHV0LCBhbHBoYWJldCwgbWF4bGluZSkge1xuICBpZih0eXBlb2YgYWxwaGFiZXQgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJhbHBoYWJldFwiIG11c3QgYmUgYSBzdHJpbmcuJyk7XG4gIH1cbiAgaWYobWF4bGluZSAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBtYXhsaW5lICE9PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wibWF4bGluZVwiIG11c3QgYmUgYSBudW1iZXIuJyk7XG4gIH1cblxuICB2YXIgb3V0cHV0ID0gJyc7XG5cbiAgaWYoIShpbnB1dCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpKSB7XG4gICAgLy8gYXNzdW1lIGZvcmdlIGJ5dGUgYnVmZmVyXG4gICAgb3V0cHV0ID0gX2VuY29kZVdpdGhCeXRlQnVmZmVyKGlucHV0LCBhbHBoYWJldCk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIGkgPSAwO1xuICAgIHZhciBiYXNlID0gYWxwaGFiZXQubGVuZ3RoO1xuICAgIHZhciBmaXJzdCA9IGFscGhhYmV0LmNoYXJBdCgwKTtcbiAgICB2YXIgZGlnaXRzID0gWzBdO1xuICAgIGZvcihpID0gMDsgaSA8IGlucHV0Lmxlbmd0aDsgKytpKSB7XG4gICAgICBmb3IodmFyIGogPSAwLCBjYXJyeSA9IGlucHV0W2ldOyBqIDwgZGlnaXRzLmxlbmd0aDsgKytqKSB7XG4gICAgICAgIGNhcnJ5ICs9IGRpZ2l0c1tqXSA8PCA4O1xuICAgICAgICBkaWdpdHNbal0gPSBjYXJyeSAlIGJhc2U7XG4gICAgICAgIGNhcnJ5ID0gKGNhcnJ5IC8gYmFzZSkgfCAwO1xuICAgICAgfVxuXG4gICAgICB3aGlsZShjYXJyeSA+IDApIHtcbiAgICAgICAgZGlnaXRzLnB1c2goY2FycnkgJSBiYXNlKTtcbiAgICAgICAgY2FycnkgPSAoY2FycnkgLyBiYXNlKSB8IDA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gZGVhbCB3aXRoIGxlYWRpbmcgemVyb3NcbiAgICBmb3IoaSA9IDA7IGlucHV0W2ldID09PSAwICYmIGkgPCBpbnB1dC5sZW5ndGggLSAxOyArK2kpIHtcbiAgICAgIG91dHB1dCArPSBmaXJzdDtcbiAgICB9XG4gICAgLy8gY29udmVydCBkaWdpdHMgdG8gYSBzdHJpbmdcbiAgICBmb3IoaSA9IGRpZ2l0cy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgb3V0cHV0ICs9IGFscGhhYmV0W2RpZ2l0c1tpXV07XG4gICAgfVxuICB9XG5cbiAgaWYobWF4bGluZSkge1xuICAgIHZhciByZWdleCA9IG5ldyBSZWdFeHAoJy57MSwnICsgbWF4bGluZSArICd9JywgJ2cnKTtcbiAgICBvdXRwdXQgPSBvdXRwdXQubWF0Y2gocmVnZXgpLmpvaW4oJ1xcclxcbicpO1xuICB9XG5cbiAgcmV0dXJuIG91dHB1dDtcbn07XG5cbi8qKlxuICogRGVjb2RlcyBhIGJhc2VOLWVuY29kZWQgKHVzaW5nIHRoZSBnaXZlbiBhbHBoYWJldCkgc3RyaW5nIHRvIGFcbiAqIFVpbnQ4QXJyYXkuXG4gKlxuICogQHBhcmFtIGlucHV0IHRoZSBiYXNlTi1lbmNvZGVkIGlucHV0IHN0cmluZy5cbiAqXG4gKiBAcmV0dXJuIHRoZSBVaW50OEFycmF5LlxuICovXG5hcGkuZGVjb2RlID0gZnVuY3Rpb24oaW5wdXQsIGFscGhhYmV0KSB7XG4gIGlmKHR5cGVvZiBpbnB1dCAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImlucHV0XCIgbXVzdCBiZSBhIHN0cmluZy4nKTtcbiAgfVxuICBpZih0eXBlb2YgYWxwaGFiZXQgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJhbHBoYWJldFwiIG11c3QgYmUgYSBzdHJpbmcuJyk7XG4gIH1cblxuICB2YXIgdGFibGUgPSBfcmV2ZXJzZUFscGhhYmV0c1thbHBoYWJldF07XG4gIGlmKCF0YWJsZSkge1xuICAgIC8vIGNvbXB1dGUgcmV2ZXJzZSBhbHBoYWJldFxuICAgIHRhYmxlID0gX3JldmVyc2VBbHBoYWJldHNbYWxwaGFiZXRdID0gW107XG4gICAgZm9yKHZhciBpID0gMDsgaSA8IGFscGhhYmV0Lmxlbmd0aDsgKytpKSB7XG4gICAgICB0YWJsZVthbHBoYWJldC5jaGFyQ29kZUF0KGkpXSA9IGk7XG4gICAgfVxuICB9XG5cbiAgLy8gcmVtb3ZlIHdoaXRlc3BhY2UgY2hhcmFjdGVyc1xuICBpbnB1dCA9IGlucHV0LnJlcGxhY2UoL1xccy9nLCAnJyk7XG5cbiAgdmFyIGJhc2UgPSBhbHBoYWJldC5sZW5ndGg7XG4gIHZhciBmaXJzdCA9IGFscGhhYmV0LmNoYXJBdCgwKTtcbiAgdmFyIGJ5dGVzID0gWzBdO1xuICBmb3IodmFyIGkgPSAwOyBpIDwgaW5wdXQubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgdmFsdWUgPSB0YWJsZVtpbnB1dC5jaGFyQ29kZUF0KGkpXTtcbiAgICBpZih2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZm9yKHZhciBqID0gMCwgY2FycnkgPSB2YWx1ZTsgaiA8IGJ5dGVzLmxlbmd0aDsgKytqKSB7XG4gICAgICBjYXJyeSArPSBieXRlc1tqXSAqIGJhc2U7XG4gICAgICBieXRlc1tqXSA9IGNhcnJ5ICYgMHhmZjtcbiAgICAgIGNhcnJ5ID4+PSA4O1xuICAgIH1cblxuICAgIHdoaWxlKGNhcnJ5ID4gMCkge1xuICAgICAgYnl0ZXMucHVzaChjYXJyeSAmIDB4ZmYpO1xuICAgICAgY2FycnkgPj49IDg7XG4gICAgfVxuICB9XG5cbiAgLy8gZGVhbCB3aXRoIGxlYWRpbmcgemVyb3NcbiAgZm9yKHZhciBrID0gMDsgaW5wdXRba10gPT09IGZpcnN0ICYmIGsgPCBpbnB1dC5sZW5ndGggLSAxOyArK2spIHtcbiAgICBieXRlcy5wdXNoKDApO1xuICB9XG5cbiAgaWYodHlwZW9mIEJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gQnVmZmVyLmZyb20oYnl0ZXMucmV2ZXJzZSgpKTtcbiAgfVxuXG4gIHJldHVybiBuZXcgVWludDhBcnJheShieXRlcy5yZXZlcnNlKCkpO1xufTtcblxuZnVuY3Rpb24gX2VuY29kZVdpdGhCeXRlQnVmZmVyKGlucHV0LCBhbHBoYWJldCkge1xuICB2YXIgaSA9IDA7XG4gIHZhciBiYXNlID0gYWxwaGFiZXQubGVuZ3RoO1xuICB2YXIgZmlyc3QgPSBhbHBoYWJldC5jaGFyQXQoMCk7XG4gIHZhciBkaWdpdHMgPSBbMF07XG4gIGZvcihpID0gMDsgaSA8IGlucHV0Lmxlbmd0aCgpOyArK2kpIHtcbiAgICBmb3IodmFyIGogPSAwLCBjYXJyeSA9IGlucHV0LmF0KGkpOyBqIDwgZGlnaXRzLmxlbmd0aDsgKytqKSB7XG4gICAgICBjYXJyeSArPSBkaWdpdHNbal0gPDwgODtcbiAgICAgIGRpZ2l0c1tqXSA9IGNhcnJ5ICUgYmFzZTtcbiAgICAgIGNhcnJ5ID0gKGNhcnJ5IC8gYmFzZSkgfCAwO1xuICAgIH1cblxuICAgIHdoaWxlKGNhcnJ5ID4gMCkge1xuICAgICAgZGlnaXRzLnB1c2goY2FycnkgJSBiYXNlKTtcbiAgICAgIGNhcnJ5ID0gKGNhcnJ5IC8gYmFzZSkgfCAwO1xuICAgIH1cbiAgfVxuXG4gIHZhciBvdXRwdXQgPSAnJztcblxuICAvLyBkZWFsIHdpdGggbGVhZGluZyB6ZXJvc1xuICBmb3IoaSA9IDA7IGlucHV0LmF0KGkpID09PSAwICYmIGkgPCBpbnB1dC5sZW5ndGgoKSAtIDE7ICsraSkge1xuICAgIG91dHB1dCArPSBmaXJzdDtcbiAgfVxuICAvLyBjb252ZXJ0IGRpZ2l0cyB0byBhIHN0cmluZ1xuICBmb3IoaSA9IGRpZ2l0cy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgIG91dHB1dCArPSBhbHBoYWJldFtkaWdpdHNbaV1dO1xuICB9XG5cbiAgcmV0dXJuIG91dHB1dDtcbn1cbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///237\n")},function(module,exports,__webpack_require__){eval("/**\n * A Javascript implementation of AES Cipher Suites for TLS.\n *\n * @author Dave Longley\n *\n * Copyright (c) 2009-2015 Digital Bazaar, Inc.\n *\n */\nvar forge = __webpack_require__(4);\n__webpack_require__(22);\n__webpack_require__(79);\n\nvar tls = module.exports = forge.tls;\n\n/**\n * Supported cipher suites.\n */\ntls.CipherSuites['TLS_RSA_WITH_AES_128_CBC_SHA'] = {\n  id: [0x00, 0x2f],\n  name: 'TLS_RSA_WITH_AES_128_CBC_SHA',\n  initSecurityParameters: function(sp) {\n    sp.bulk_cipher_algorithm = tls.BulkCipherAlgorithm.aes;\n    sp.cipher_type = tls.CipherType.block;\n    sp.enc_key_length = 16;\n    sp.block_length = 16;\n    sp.fixed_iv_length = 16;\n    sp.record_iv_length = 16;\n    sp.mac_algorithm = tls.MACAlgorithm.hmac_sha1;\n    sp.mac_length = 20;\n    sp.mac_key_length = 20;\n  },\n  initConnectionState: initConnectionState\n};\ntls.CipherSuites['TLS_RSA_WITH_AES_256_CBC_SHA'] = {\n  id: [0x00, 0x35],\n  name: 'TLS_RSA_WITH_AES_256_CBC_SHA',\n  initSecurityParameters: function(sp) {\n    sp.bulk_cipher_algorithm = tls.BulkCipherAlgorithm.aes;\n    sp.cipher_type = tls.CipherType.block;\n    sp.enc_key_length = 32;\n    sp.block_length = 16;\n    sp.fixed_iv_length = 16;\n    sp.record_iv_length = 16;\n    sp.mac_algorithm = tls.MACAlgorithm.hmac_sha1;\n    sp.mac_length = 20;\n    sp.mac_key_length = 20;\n  },\n  initConnectionState: initConnectionState\n};\n\nfunction initConnectionState(state, c, sp) {\n  var client = (c.entity === forge.tls.ConnectionEnd.client);\n\n  // cipher setup\n  state.read.cipherState = {\n    init: false,\n    cipher: forge.cipher.createDecipher('AES-CBC', client ?\n      sp.keys.server_write_key : sp.keys.client_write_key),\n    iv: client ? sp.keys.server_write_IV : sp.keys.client_write_IV\n  };\n  state.write.cipherState = {\n    init: false,\n    cipher: forge.cipher.createCipher('AES-CBC', client ?\n      sp.keys.client_write_key : sp.keys.server_write_key),\n    iv: client ? sp.keys.client_write_IV : sp.keys.server_write_IV\n  };\n  state.read.cipherFunction = decrypt_aes_cbc_sha1;\n  state.write.cipherFunction = encrypt_aes_cbc_sha1;\n\n  // MAC setup\n  state.read.macLength = state.write.macLength = sp.mac_length;\n  state.read.macFunction = state.write.macFunction = tls.hmac_sha1;\n}\n\n/**\n * Encrypts the TLSCompressed record into a TLSCipherText record using AES\n * in CBC mode.\n *\n * @param record the TLSCompressed record to encrypt.\n * @param s the ConnectionState to use.\n *\n * @return true on success, false on failure.\n */\nfunction encrypt_aes_cbc_sha1(record, s) {\n  var rval = false;\n\n  // append MAC to fragment, update sequence number\n  var mac = s.macFunction(s.macKey, s.sequenceNumber, record);\n  record.fragment.putBytes(mac);\n  s.updateSequenceNumber();\n\n  // TLS 1.1+ use an explicit IV every time to protect against CBC attacks\n  var iv;\n  if(record.version.minor === tls.Versions.TLS_1_0.minor) {\n    // use the pre-generated IV when initializing for TLS 1.0, otherwise use\n    // the residue from the previous encryption\n    iv = s.cipherState.init ? null : s.cipherState.iv;\n  } else {\n    iv = forge.random.getBytesSync(16);\n  }\n\n  s.cipherState.init = true;\n\n  // start cipher\n  var cipher = s.cipherState.cipher;\n  cipher.start({iv: iv});\n\n  // TLS 1.1+ write IV into output\n  if(record.version.minor >= tls.Versions.TLS_1_1.minor) {\n    cipher.output.putBytes(iv);\n  }\n\n  // do encryption (default padding is appropriate)\n  cipher.update(record.fragment);\n  if(cipher.finish(encrypt_aes_cbc_sha1_padding)) {\n    // set record fragment to encrypted output\n    record.fragment = cipher.output;\n    record.length = record.fragment.length();\n    rval = true;\n  }\n\n  return rval;\n}\n\n/**\n * Handles padding for aes_cbc_sha1 in encrypt mode.\n *\n * @param blockSize the block size.\n * @param input the input buffer.\n * @param decrypt true in decrypt mode, false in encrypt mode.\n *\n * @return true on success, false on failure.\n */\nfunction encrypt_aes_cbc_sha1_padding(blockSize, input, decrypt) {\n  /* The encrypted data length (TLSCiphertext.length) is one more than the sum\n   of SecurityParameters.block_length, TLSCompressed.length,\n   SecurityParameters.mac_length, and padding_length.\n\n   The padding may be any length up to 255 bytes long, as long as it results in\n   the TLSCiphertext.length being an integral multiple of the block length.\n   Lengths longer than necessary might be desirable to frustrate attacks on a\n   protocol based on analysis of the lengths of exchanged messages. Each uint8\n   in the padding data vector must be filled with the padding length value.\n\n   The padding length should be such that the total size of the\n   GenericBlockCipher structure is a multiple of the cipher's block length.\n   Legal values range from zero to 255, inclusive. This length specifies the\n   length of the padding field exclusive of the padding_length field itself.\n\n   This is slightly different from PKCS#7 because the padding value is 1\n   less than the actual number of padding bytes if you include the\n   padding_length uint8 itself as a padding byte. */\n  if(!decrypt) {\n    // get the number of padding bytes required to reach the blockSize and\n    // subtract 1 for the padding value (to make room for the padding_length\n    // uint8)\n    var padding = blockSize - (input.length() % blockSize);\n    input.fillWithByte(padding - 1, padding);\n  }\n  return true;\n}\n\n/**\n * Handles padding for aes_cbc_sha1 in decrypt mode.\n *\n * @param blockSize the block size.\n * @param output the output buffer.\n * @param decrypt true in decrypt mode, false in encrypt mode.\n *\n * @return true on success, false on failure.\n */\nfunction decrypt_aes_cbc_sha1_padding(blockSize, output, decrypt) {\n  var rval = true;\n  if(decrypt) {\n    /* The last byte in the output specifies the number of padding bytes not\n      including itself. Each of the padding bytes has the same value as that\n      last byte (known as the padding_length). Here we check all padding\n      bytes to ensure they have the value of padding_length even if one of\n      them is bad in order to ward-off timing attacks. */\n    var len = output.length();\n    var paddingLength = output.last();\n    for(var i = len - 1 - paddingLength; i < len - 1; ++i) {\n      rval = rval && (output.at(i) == paddingLength);\n    }\n    if(rval) {\n      // trim off padding bytes and last padding length byte\n      output.truncate(paddingLength + 1);\n    }\n  }\n  return rval;\n}\n\n/**\n * Decrypts a TLSCipherText record into a TLSCompressed record using\n * AES in CBC mode.\n *\n * @param record the TLSCipherText record to decrypt.\n * @param s the ConnectionState to use.\n *\n * @return true on success, false on failure.\n */\nfunction decrypt_aes_cbc_sha1(record, s) {\n  var rval = false;\n\n  var iv;\n  if(record.version.minor === tls.Versions.TLS_1_0.minor) {\n    // use pre-generated IV when initializing for TLS 1.0, otherwise use the\n    // residue from the previous decryption\n    iv = s.cipherState.init ? null : s.cipherState.iv;\n  } else {\n    // TLS 1.1+ use an explicit IV every time to protect against CBC attacks\n    // that is appended to the record fragment\n    iv = record.fragment.getBytes(16);\n  }\n\n  s.cipherState.init = true;\n\n  // start cipher\n  var cipher = s.cipherState.cipher;\n  cipher.start({iv: iv});\n\n  // do decryption\n  cipher.update(record.fragment);\n  rval = cipher.finish(decrypt_aes_cbc_sha1_padding);\n\n  // even if decryption fails, keep going to minimize timing attacks\n\n  // decrypted data:\n  // first (len - 20) bytes = application data\n  // last 20 bytes          = MAC\n  var macLen = s.macLength;\n\n  // create a random MAC to check against should the mac length check fail\n  // Note: do this regardless of the failure to keep timing consistent\n  var mac = forge.random.getBytesSync(macLen);\n\n  // get fragment and mac\n  var len = cipher.output.length();\n  if(len >= macLen) {\n    record.fragment = cipher.output.getBytes(len - macLen);\n    mac = cipher.output.getBytes(macLen);\n  } else {\n    // bad data, but get bytes anyway to try to keep timing consistent\n    record.fragment = cipher.output.getBytes();\n  }\n  record.fragment = forge.util.createBuffer(record.fragment);\n  record.length = record.fragment.length();\n\n  // see if data integrity checks out, update sequence number\n  var mac2 = s.macFunction(s.macKey, s.sequenceNumber, record);\n  s.updateSequenceNumber();\n  rval = compareMacs(s.macKey, mac, mac2) && rval;\n  return rval;\n}\n\n/**\n * Safely compare two MACs. This function will compare two MACs in a way\n * that protects against timing attacks.\n *\n * TODO: Expose elsewhere as a utility API.\n *\n * See: https://www.nccgroup.trust/us/about-us/newsroom-and-events/blog/2011/february/double-hmac-verification/\n *\n * @param key the MAC key to use.\n * @param mac1 as a binary-encoded string of bytes.\n * @param mac2 as a binary-encoded string of bytes.\n *\n * @return true if the MACs are the same, false if not.\n */\nfunction compareMacs(key, mac1, mac2) {\n  var hmac = forge.hmac.create();\n\n  hmac.start('SHA1', key);\n  hmac.update(mac1);\n  mac1 = hmac.digest().getBytes();\n\n  hmac.start(null, null);\n  hmac.update(mac2);\n  mac2 = hmac.digest().getBytes();\n\n  return mac1 === mac2;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjM4LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL25vZGUtZm9yZ2UvbGliL2Flc0NpcGhlclN1aXRlcy5qcz9kODlhIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQSBKYXZhc2NyaXB0IGltcGxlbWVudGF0aW9uIG9mIEFFUyBDaXBoZXIgU3VpdGVzIGZvciBUTFMuXG4gKlxuICogQGF1dGhvciBEYXZlIExvbmdsZXlcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMDktMjAxNSBEaWdpdGFsIEJhemFhciwgSW5jLlxuICpcbiAqL1xudmFyIGZvcmdlID0gcmVxdWlyZSgnLi9mb3JnZScpO1xucmVxdWlyZSgnLi9hZXMnKTtcbnJlcXVpcmUoJy4vdGxzJyk7XG5cbnZhciB0bHMgPSBtb2R1bGUuZXhwb3J0cyA9IGZvcmdlLnRscztcblxuLyoqXG4gKiBTdXBwb3J0ZWQgY2lwaGVyIHN1aXRlcy5cbiAqL1xudGxzLkNpcGhlclN1aXRlc1snVExTX1JTQV9XSVRIX0FFU18xMjhfQ0JDX1NIQSddID0ge1xuICBpZDogWzB4MDAsIDB4MmZdLFxuICBuYW1lOiAnVExTX1JTQV9XSVRIX0FFU18xMjhfQ0JDX1NIQScsXG4gIGluaXRTZWN1cml0eVBhcmFtZXRlcnM6IGZ1bmN0aW9uKHNwKSB7XG4gICAgc3AuYnVsa19jaXBoZXJfYWxnb3JpdGhtID0gdGxzLkJ1bGtDaXBoZXJBbGdvcml0aG0uYWVzO1xuICAgIHNwLmNpcGhlcl90eXBlID0gdGxzLkNpcGhlclR5cGUuYmxvY2s7XG4gICAgc3AuZW5jX2tleV9sZW5ndGggPSAxNjtcbiAgICBzcC5ibG9ja19sZW5ndGggPSAxNjtcbiAgICBzcC5maXhlZF9pdl9sZW5ndGggPSAxNjtcbiAgICBzcC5yZWNvcmRfaXZfbGVuZ3RoID0gMTY7XG4gICAgc3AubWFjX2FsZ29yaXRobSA9IHRscy5NQUNBbGdvcml0aG0uaG1hY19zaGExO1xuICAgIHNwLm1hY19sZW5ndGggPSAyMDtcbiAgICBzcC5tYWNfa2V5X2xlbmd0aCA9IDIwO1xuICB9LFxuICBpbml0Q29ubmVjdGlvblN0YXRlOiBpbml0Q29ubmVjdGlvblN0YXRlXG59O1xudGxzLkNpcGhlclN1aXRlc1snVExTX1JTQV9XSVRIX0FFU18yNTZfQ0JDX1NIQSddID0ge1xuICBpZDogWzB4MDAsIDB4MzVdLFxuICBuYW1lOiAnVExTX1JTQV9XSVRIX0FFU18yNTZfQ0JDX1NIQScsXG4gIGluaXRTZWN1cml0eVBhcmFtZXRlcnM6IGZ1bmN0aW9uKHNwKSB7XG4gICAgc3AuYnVsa19jaXBoZXJfYWxnb3JpdGhtID0gdGxzLkJ1bGtDaXBoZXJBbGdvcml0aG0uYWVzO1xuICAgIHNwLmNpcGhlcl90eXBlID0gdGxzLkNpcGhlclR5cGUuYmxvY2s7XG4gICAgc3AuZW5jX2tleV9sZW5ndGggPSAzMjtcbiAgICBzcC5ibG9ja19sZW5ndGggPSAxNjtcbiAgICBzcC5maXhlZF9pdl9sZW5ndGggPSAxNjtcbiAgICBzcC5yZWNvcmRfaXZfbGVuZ3RoID0gMTY7XG4gICAgc3AubWFjX2FsZ29yaXRobSA9IHRscy5NQUNBbGdvcml0aG0uaG1hY19zaGExO1xuICAgIHNwLm1hY19sZW5ndGggPSAyMDtcbiAgICBzcC5tYWNfa2V5X2xlbmd0aCA9IDIwO1xuICB9LFxuICBpbml0Q29ubmVjdGlvblN0YXRlOiBpbml0Q29ubmVjdGlvblN0YXRlXG59O1xuXG5mdW5jdGlvbiBpbml0Q29ubmVjdGlvblN0YXRlKHN0YXRlLCBjLCBzcCkge1xuICB2YXIgY2xpZW50ID0gKGMuZW50aXR5ID09PSBmb3JnZS50bHMuQ29ubmVjdGlvbkVuZC5jbGllbnQpO1xuXG4gIC8vIGNpcGhlciBzZXR1cFxuICBzdGF0ZS5yZWFkLmNpcGhlclN0YXRlID0ge1xuICAgIGluaXQ6IGZhbHNlLFxuICAgIGNpcGhlcjogZm9yZ2UuY2lwaGVyLmNyZWF0ZURlY2lwaGVyKCdBRVMtQ0JDJywgY2xpZW50ID9cbiAgICAgIHNwLmtleXMuc2VydmVyX3dyaXRlX2tleSA6IHNwLmtleXMuY2xpZW50X3dyaXRlX2tleSksXG4gICAgaXY6IGNsaWVudCA/IHNwLmtleXMuc2VydmVyX3dyaXRlX0lWIDogc3Aua2V5cy5jbGllbnRfd3JpdGVfSVZcbiAgfTtcbiAgc3RhdGUud3JpdGUuY2lwaGVyU3RhdGUgPSB7XG4gICAgaW5pdDogZmFsc2UsXG4gICAgY2lwaGVyOiBmb3JnZS5jaXBoZXIuY3JlYXRlQ2lwaGVyKCdBRVMtQ0JDJywgY2xpZW50ID9cbiAgICAgIHNwLmtleXMuY2xpZW50X3dyaXRlX2tleSA6IHNwLmtleXMuc2VydmVyX3dyaXRlX2tleSksXG4gICAgaXY6IGNsaWVudCA/IHNwLmtleXMuY2xpZW50X3dyaXRlX0lWIDogc3Aua2V5cy5zZXJ2ZXJfd3JpdGVfSVZcbiAgfTtcbiAgc3RhdGUucmVhZC5jaXBoZXJGdW5jdGlvbiA9IGRlY3J5cHRfYWVzX2NiY19zaGExO1xuICBzdGF0ZS53cml0ZS5jaXBoZXJGdW5jdGlvbiA9IGVuY3J5cHRfYWVzX2NiY19zaGExO1xuXG4gIC8vIE1BQyBzZXR1cFxuICBzdGF0ZS5yZWFkLm1hY0xlbmd0aCA9IHN0YXRlLndyaXRlLm1hY0xlbmd0aCA9IHNwLm1hY19sZW5ndGg7XG4gIHN0YXRlLnJlYWQubWFjRnVuY3Rpb24gPSBzdGF0ZS53cml0ZS5tYWNGdW5jdGlvbiA9IHRscy5obWFjX3NoYTE7XG59XG5cbi8qKlxuICogRW5jcnlwdHMgdGhlIFRMU0NvbXByZXNzZWQgcmVjb3JkIGludG8gYSBUTFNDaXBoZXJUZXh0IHJlY29yZCB1c2luZyBBRVNcbiAqIGluIENCQyBtb2RlLlxuICpcbiAqIEBwYXJhbSByZWNvcmQgdGhlIFRMU0NvbXByZXNzZWQgcmVjb3JkIHRvIGVuY3J5cHQuXG4gKiBAcGFyYW0gcyB0aGUgQ29ubmVjdGlvblN0YXRlIHRvIHVzZS5cbiAqXG4gKiBAcmV0dXJuIHRydWUgb24gc3VjY2VzcywgZmFsc2Ugb24gZmFpbHVyZS5cbiAqL1xuZnVuY3Rpb24gZW5jcnlwdF9hZXNfY2JjX3NoYTEocmVjb3JkLCBzKSB7XG4gIHZhciBydmFsID0gZmFsc2U7XG5cbiAgLy8gYXBwZW5kIE1BQyB0byBmcmFnbWVudCwgdXBkYXRlIHNlcXVlbmNlIG51bWJlclxuICB2YXIgbWFjID0gcy5tYWNGdW5jdGlvbihzLm1hY0tleSwgcy5zZXF1ZW5jZU51bWJlciwgcmVjb3JkKTtcbiAgcmVjb3JkLmZyYWdtZW50LnB1dEJ5dGVzKG1hYyk7XG4gIHMudXBkYXRlU2VxdWVuY2VOdW1iZXIoKTtcblxuICAvLyBUTFMgMS4xKyB1c2UgYW4gZXhwbGljaXQgSVYgZXZlcnkgdGltZSB0byBwcm90ZWN0IGFnYWluc3QgQ0JDIGF0dGFja3NcbiAgdmFyIGl2O1xuICBpZihyZWNvcmQudmVyc2lvbi5taW5vciA9PT0gdGxzLlZlcnNpb25zLlRMU18xXzAubWlub3IpIHtcbiAgICAvLyB1c2UgdGhlIHByZS1nZW5lcmF0ZWQgSVYgd2hlbiBpbml0aWFsaXppbmcgZm9yIFRMUyAxLjAsIG90aGVyd2lzZSB1c2VcbiAgICAvLyB0aGUgcmVzaWR1ZSBmcm9tIHRoZSBwcmV2aW91cyBlbmNyeXB0aW9uXG4gICAgaXYgPSBzLmNpcGhlclN0YXRlLmluaXQgPyBudWxsIDogcy5jaXBoZXJTdGF0ZS5pdjtcbiAgfSBlbHNlIHtcbiAgICBpdiA9IGZvcmdlLnJhbmRvbS5nZXRCeXRlc1N5bmMoMTYpO1xuICB9XG5cbiAgcy5jaXBoZXJTdGF0ZS5pbml0ID0gdHJ1ZTtcblxuICAvLyBzdGFydCBjaXBoZXJcbiAgdmFyIGNpcGhlciA9IHMuY2lwaGVyU3RhdGUuY2lwaGVyO1xuICBjaXBoZXIuc3RhcnQoe2l2OiBpdn0pO1xuXG4gIC8vIFRMUyAxLjErIHdyaXRlIElWIGludG8gb3V0cHV0XG4gIGlmKHJlY29yZC52ZXJzaW9uLm1pbm9yID49IHRscy5WZXJzaW9ucy5UTFNfMV8xLm1pbm9yKSB7XG4gICAgY2lwaGVyLm91dHB1dC5wdXRCeXRlcyhpdik7XG4gIH1cblxuICAvLyBkbyBlbmNyeXB0aW9uIChkZWZhdWx0IHBhZGRpbmcgaXMgYXBwcm9wcmlhdGUpXG4gIGNpcGhlci51cGRhdGUocmVjb3JkLmZyYWdtZW50KTtcbiAgaWYoY2lwaGVyLmZpbmlzaChlbmNyeXB0X2Flc19jYmNfc2hhMV9wYWRkaW5nKSkge1xuICAgIC8vIHNldCByZWNvcmQgZnJhZ21lbnQgdG8gZW5jcnlwdGVkIG91dHB1dFxuICAgIHJlY29yZC5mcmFnbWVudCA9IGNpcGhlci5vdXRwdXQ7XG4gICAgcmVjb3JkLmxlbmd0aCA9IHJlY29yZC5mcmFnbWVudC5sZW5ndGgoKTtcbiAgICBydmFsID0gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBydmFsO1xufVxuXG4vKipcbiAqIEhhbmRsZXMgcGFkZGluZyBmb3IgYWVzX2NiY19zaGExIGluIGVuY3J5cHQgbW9kZS5cbiAqXG4gKiBAcGFyYW0gYmxvY2tTaXplIHRoZSBibG9jayBzaXplLlxuICogQHBhcmFtIGlucHV0IHRoZSBpbnB1dCBidWZmZXIuXG4gKiBAcGFyYW0gZGVjcnlwdCB0cnVlIGluIGRlY3J5cHQgbW9kZSwgZmFsc2UgaW4gZW5jcnlwdCBtb2RlLlxuICpcbiAqIEByZXR1cm4gdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBvbiBmYWlsdXJlLlxuICovXG5mdW5jdGlvbiBlbmNyeXB0X2Flc19jYmNfc2hhMV9wYWRkaW5nKGJsb2NrU2l6ZSwgaW5wdXQsIGRlY3J5cHQpIHtcbiAgLyogVGhlIGVuY3J5cHRlZCBkYXRhIGxlbmd0aCAoVExTQ2lwaGVydGV4dC5sZW5ndGgpIGlzIG9uZSBtb3JlIHRoYW4gdGhlIHN1bVxuICAgb2YgU2VjdXJpdHlQYXJhbWV0ZXJzLmJsb2NrX2xlbmd0aCwgVExTQ29tcHJlc3NlZC5sZW5ndGgsXG4gICBTZWN1cml0eVBhcmFtZXRlcnMubWFjX2xlbmd0aCwgYW5kIHBhZGRpbmdfbGVuZ3RoLlxuXG4gICBUaGUgcGFkZGluZyBtYXkgYmUgYW55IGxlbmd0aCB1cCB0byAyNTUgYnl0ZXMgbG9uZywgYXMgbG9uZyBhcyBpdCByZXN1bHRzIGluXG4gICB0aGUgVExTQ2lwaGVydGV4dC5sZW5ndGggYmVpbmcgYW4gaW50ZWdyYWwgbXVsdGlwbGUgb2YgdGhlIGJsb2NrIGxlbmd0aC5cbiAgIExlbmd0aHMgbG9uZ2VyIHRoYW4gbmVjZXNzYXJ5IG1pZ2h0IGJlIGRlc2lyYWJsZSB0byBmcnVzdHJhdGUgYXR0YWNrcyBvbiBhXG4gICBwcm90b2NvbCBiYXNlZCBvbiBhbmFseXNpcyBvZiB0aGUgbGVuZ3RocyBvZiBleGNoYW5nZWQgbWVzc2FnZXMuIEVhY2ggdWludDhcbiAgIGluIHRoZSBwYWRkaW5nIGRhdGEgdmVjdG9yIG11c3QgYmUgZmlsbGVkIHdpdGggdGhlIHBhZGRpbmcgbGVuZ3RoIHZhbHVlLlxuXG4gICBUaGUgcGFkZGluZyBsZW5ndGggc2hvdWxkIGJlIHN1Y2ggdGhhdCB0aGUgdG90YWwgc2l6ZSBvZiB0aGVcbiAgIEdlbmVyaWNCbG9ja0NpcGhlciBzdHJ1Y3R1cmUgaXMgYSBtdWx0aXBsZSBvZiB0aGUgY2lwaGVyJ3MgYmxvY2sgbGVuZ3RoLlxuICAgTGVnYWwgdmFsdWVzIHJhbmdlIGZyb20gemVybyB0byAyNTUsIGluY2x1c2l2ZS4gVGhpcyBsZW5ndGggc3BlY2lmaWVzIHRoZVxuICAgbGVuZ3RoIG9mIHRoZSBwYWRkaW5nIGZpZWxkIGV4Y2x1c2l2ZSBvZiB0aGUgcGFkZGluZ19sZW5ndGggZmllbGQgaXRzZWxmLlxuXG4gICBUaGlzIGlzIHNsaWdodGx5IGRpZmZlcmVudCBmcm9tIFBLQ1MjNyBiZWNhdXNlIHRoZSBwYWRkaW5nIHZhbHVlIGlzIDFcbiAgIGxlc3MgdGhhbiB0aGUgYWN0dWFsIG51bWJlciBvZiBwYWRkaW5nIGJ5dGVzIGlmIHlvdSBpbmNsdWRlIHRoZVxuICAgcGFkZGluZ19sZW5ndGggdWludDggaXRzZWxmIGFzIGEgcGFkZGluZyBieXRlLiAqL1xuICBpZighZGVjcnlwdCkge1xuICAgIC8vIGdldCB0aGUgbnVtYmVyIG9mIHBhZGRpbmcgYnl0ZXMgcmVxdWlyZWQgdG8gcmVhY2ggdGhlIGJsb2NrU2l6ZSBhbmRcbiAgICAvLyBzdWJ0cmFjdCAxIGZvciB0aGUgcGFkZGluZyB2YWx1ZSAodG8gbWFrZSByb29tIGZvciB0aGUgcGFkZGluZ19sZW5ndGhcbiAgICAvLyB1aW50OClcbiAgICB2YXIgcGFkZGluZyA9IGJsb2NrU2l6ZSAtIChpbnB1dC5sZW5ndGgoKSAlIGJsb2NrU2l6ZSk7XG4gICAgaW5wdXQuZmlsbFdpdGhCeXRlKHBhZGRpbmcgLSAxLCBwYWRkaW5nKTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBIYW5kbGVzIHBhZGRpbmcgZm9yIGFlc19jYmNfc2hhMSBpbiBkZWNyeXB0IG1vZGUuXG4gKlxuICogQHBhcmFtIGJsb2NrU2l6ZSB0aGUgYmxvY2sgc2l6ZS5cbiAqIEBwYXJhbSBvdXRwdXQgdGhlIG91dHB1dCBidWZmZXIuXG4gKiBAcGFyYW0gZGVjcnlwdCB0cnVlIGluIGRlY3J5cHQgbW9kZSwgZmFsc2UgaW4gZW5jcnlwdCBtb2RlLlxuICpcbiAqIEByZXR1cm4gdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBvbiBmYWlsdXJlLlxuICovXG5mdW5jdGlvbiBkZWNyeXB0X2Flc19jYmNfc2hhMV9wYWRkaW5nKGJsb2NrU2l6ZSwgb3V0cHV0LCBkZWNyeXB0KSB7XG4gIHZhciBydmFsID0gdHJ1ZTtcbiAgaWYoZGVjcnlwdCkge1xuICAgIC8qIFRoZSBsYXN0IGJ5dGUgaW4gdGhlIG91dHB1dCBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBwYWRkaW5nIGJ5dGVzIG5vdFxuICAgICAgaW5jbHVkaW5nIGl0c2VsZi4gRWFjaCBvZiB0aGUgcGFkZGluZyBieXRlcyBoYXMgdGhlIHNhbWUgdmFsdWUgYXMgdGhhdFxuICAgICAgbGFzdCBieXRlIChrbm93biBhcyB0aGUgcGFkZGluZ19sZW5ndGgpLiBIZXJlIHdlIGNoZWNrIGFsbCBwYWRkaW5nXG4gICAgICBieXRlcyB0byBlbnN1cmUgdGhleSBoYXZlIHRoZSB2YWx1ZSBvZiBwYWRkaW5nX2xlbmd0aCBldmVuIGlmIG9uZSBvZlxuICAgICAgdGhlbSBpcyBiYWQgaW4gb3JkZXIgdG8gd2FyZC1vZmYgdGltaW5nIGF0dGFja3MuICovXG4gICAgdmFyIGxlbiA9IG91dHB1dC5sZW5ndGgoKTtcbiAgICB2YXIgcGFkZGluZ0xlbmd0aCA9IG91dHB1dC5sYXN0KCk7XG4gICAgZm9yKHZhciBpID0gbGVuIC0gMSAtIHBhZGRpbmdMZW5ndGg7IGkgPCBsZW4gLSAxOyArK2kpIHtcbiAgICAgIHJ2YWwgPSBydmFsICYmIChvdXRwdXQuYXQoaSkgPT0gcGFkZGluZ0xlbmd0aCk7XG4gICAgfVxuICAgIGlmKHJ2YWwpIHtcbiAgICAgIC8vIHRyaW0gb2ZmIHBhZGRpbmcgYnl0ZXMgYW5kIGxhc3QgcGFkZGluZyBsZW5ndGggYnl0ZVxuICAgICAgb3V0cHV0LnRydW5jYXRlKHBhZGRpbmdMZW5ndGggKyAxKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJ2YWw7XG59XG5cbi8qKlxuICogRGVjcnlwdHMgYSBUTFNDaXBoZXJUZXh0IHJlY29yZCBpbnRvIGEgVExTQ29tcHJlc3NlZCByZWNvcmQgdXNpbmdcbiAqIEFFUyBpbiBDQkMgbW9kZS5cbiAqXG4gKiBAcGFyYW0gcmVjb3JkIHRoZSBUTFNDaXBoZXJUZXh0IHJlY29yZCB0byBkZWNyeXB0LlxuICogQHBhcmFtIHMgdGhlIENvbm5lY3Rpb25TdGF0ZSB0byB1c2UuXG4gKlxuICogQHJldHVybiB0cnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIG9uIGZhaWx1cmUuXG4gKi9cbmZ1bmN0aW9uIGRlY3J5cHRfYWVzX2NiY19zaGExKHJlY29yZCwgcykge1xuICB2YXIgcnZhbCA9IGZhbHNlO1xuXG4gIHZhciBpdjtcbiAgaWYocmVjb3JkLnZlcnNpb24ubWlub3IgPT09IHRscy5WZXJzaW9ucy5UTFNfMV8wLm1pbm9yKSB7XG4gICAgLy8gdXNlIHByZS1nZW5lcmF0ZWQgSVYgd2hlbiBpbml0aWFsaXppbmcgZm9yIFRMUyAxLjAsIG90aGVyd2lzZSB1c2UgdGhlXG4gICAgLy8gcmVzaWR1ZSBmcm9tIHRoZSBwcmV2aW91cyBkZWNyeXB0aW9uXG4gICAgaXYgPSBzLmNpcGhlclN0YXRlLmluaXQgPyBudWxsIDogcy5jaXBoZXJTdGF0ZS5pdjtcbiAgfSBlbHNlIHtcbiAgICAvLyBUTFMgMS4xKyB1c2UgYW4gZXhwbGljaXQgSVYgZXZlcnkgdGltZSB0byBwcm90ZWN0IGFnYWluc3QgQ0JDIGF0dGFja3NcbiAgICAvLyB0aGF0IGlzIGFwcGVuZGVkIHRvIHRoZSByZWNvcmQgZnJhZ21lbnRcbiAgICBpdiA9IHJlY29yZC5mcmFnbWVudC5nZXRCeXRlcygxNik7XG4gIH1cblxuICBzLmNpcGhlclN0YXRlLmluaXQgPSB0cnVlO1xuXG4gIC8vIHN0YXJ0IGNpcGhlclxuICB2YXIgY2lwaGVyID0gcy5jaXBoZXJTdGF0ZS5jaXBoZXI7XG4gIGNpcGhlci5zdGFydCh7aXY6IGl2fSk7XG5cbiAgLy8gZG8gZGVjcnlwdGlvblxuICBjaXBoZXIudXBkYXRlKHJlY29yZC5mcmFnbWVudCk7XG4gIHJ2YWwgPSBjaXBoZXIuZmluaXNoKGRlY3J5cHRfYWVzX2NiY19zaGExX3BhZGRpbmcpO1xuXG4gIC8vIGV2ZW4gaWYgZGVjcnlwdGlvbiBmYWlscywga2VlcCBnb2luZyB0byBtaW5pbWl6ZSB0aW1pbmcgYXR0YWNrc1xuXG4gIC8vIGRlY3J5cHRlZCBkYXRhOlxuICAvLyBmaXJzdCAobGVuIC0gMjApIGJ5dGVzID0gYXBwbGljYXRpb24gZGF0YVxuICAvLyBsYXN0IDIwIGJ5dGVzICAgICAgICAgID0gTUFDXG4gIHZhciBtYWNMZW4gPSBzLm1hY0xlbmd0aDtcblxuICAvLyBjcmVhdGUgYSByYW5kb20gTUFDIHRvIGNoZWNrIGFnYWluc3Qgc2hvdWxkIHRoZSBtYWMgbGVuZ3RoIGNoZWNrIGZhaWxcbiAgLy8gTm90ZTogZG8gdGhpcyByZWdhcmRsZXNzIG9mIHRoZSBmYWlsdXJlIHRvIGtlZXAgdGltaW5nIGNvbnNpc3RlbnRcbiAgdmFyIG1hYyA9IGZvcmdlLnJhbmRvbS5nZXRCeXRlc1N5bmMobWFjTGVuKTtcblxuICAvLyBnZXQgZnJhZ21lbnQgYW5kIG1hY1xuICB2YXIgbGVuID0gY2lwaGVyLm91dHB1dC5sZW5ndGgoKTtcbiAgaWYobGVuID49IG1hY0xlbikge1xuICAgIHJlY29yZC5mcmFnbWVudCA9IGNpcGhlci5vdXRwdXQuZ2V0Qnl0ZXMobGVuIC0gbWFjTGVuKTtcbiAgICBtYWMgPSBjaXBoZXIub3V0cHV0LmdldEJ5dGVzKG1hY0xlbik7XG4gIH0gZWxzZSB7XG4gICAgLy8gYmFkIGRhdGEsIGJ1dCBnZXQgYnl0ZXMgYW55d2F5IHRvIHRyeSB0byBrZWVwIHRpbWluZyBjb25zaXN0ZW50XG4gICAgcmVjb3JkLmZyYWdtZW50ID0gY2lwaGVyLm91dHB1dC5nZXRCeXRlcygpO1xuICB9XG4gIHJlY29yZC5mcmFnbWVudCA9IGZvcmdlLnV0aWwuY3JlYXRlQnVmZmVyKHJlY29yZC5mcmFnbWVudCk7XG4gIHJlY29yZC5sZW5ndGggPSByZWNvcmQuZnJhZ21lbnQubGVuZ3RoKCk7XG5cbiAgLy8gc2VlIGlmIGRhdGEgaW50ZWdyaXR5IGNoZWNrcyBvdXQsIHVwZGF0ZSBzZXF1ZW5jZSBudW1iZXJcbiAgdmFyIG1hYzIgPSBzLm1hY0Z1bmN0aW9uKHMubWFjS2V5LCBzLnNlcXVlbmNlTnVtYmVyLCByZWNvcmQpO1xuICBzLnVwZGF0ZVNlcXVlbmNlTnVtYmVyKCk7XG4gIHJ2YWwgPSBjb21wYXJlTWFjcyhzLm1hY0tleSwgbWFjLCBtYWMyKSAmJiBydmFsO1xuICByZXR1cm4gcnZhbDtcbn1cblxuLyoqXG4gKiBTYWZlbHkgY29tcGFyZSB0d28gTUFDcy4gVGhpcyBmdW5jdGlvbiB3aWxsIGNvbXBhcmUgdHdvIE1BQ3MgaW4gYSB3YXlcbiAqIHRoYXQgcHJvdGVjdHMgYWdhaW5zdCB0aW1pbmcgYXR0YWNrcy5cbiAqXG4gKiBUT0RPOiBFeHBvc2UgZWxzZXdoZXJlIGFzIGEgdXRpbGl0eSBBUEkuXG4gKlxuICogU2VlOiBodHRwczovL3d3dy5uY2Nncm91cC50cnVzdC91cy9hYm91dC11cy9uZXdzcm9vbS1hbmQtZXZlbnRzL2Jsb2cvMjAxMS9mZWJydWFyeS9kb3VibGUtaG1hYy12ZXJpZmljYXRpb24vXG4gKlxuICogQHBhcmFtIGtleSB0aGUgTUFDIGtleSB0byB1c2UuXG4gKiBAcGFyYW0gbWFjMSBhcyBhIGJpbmFyeS1lbmNvZGVkIHN0cmluZyBvZiBieXRlcy5cbiAqIEBwYXJhbSBtYWMyIGFzIGEgYmluYXJ5LWVuY29kZWQgc3RyaW5nIG9mIGJ5dGVzLlxuICpcbiAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgTUFDcyBhcmUgdGhlIHNhbWUsIGZhbHNlIGlmIG5vdC5cbiAqL1xuZnVuY3Rpb24gY29tcGFyZU1hY3Moa2V5LCBtYWMxLCBtYWMyKSB7XG4gIHZhciBobWFjID0gZm9yZ2UuaG1hYy5jcmVhdGUoKTtcblxuICBobWFjLnN0YXJ0KCdTSEExJywga2V5KTtcbiAgaG1hYy51cGRhdGUobWFjMSk7XG4gIG1hYzEgPSBobWFjLmRpZ2VzdCgpLmdldEJ5dGVzKCk7XG5cbiAgaG1hYy5zdGFydChudWxsLCBudWxsKTtcbiAgaG1hYy51cGRhdGUobWFjMik7XG4gIG1hYzIgPSBobWFjLmRpZ2VzdCgpLmdldEJ5dGVzKCk7XG5cbiAgcmV0dXJuIG1hYzEgPT09IG1hYzI7XG59XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///238\n")},function(module,exports,__webpack_require__){eval("/**\n * Node.js module for Forge mask generation functions.\n *\n * @author Stefan Siegl\n *\n * Copyright 2012 Stefan Siegl <stesie@brokenpipe.de>\n */\nvar forge = __webpack_require__(4);\n__webpack_require__(89);\n\nmodule.exports = forge.mgf = forge.mgf || {};\nforge.mgf.mgf1 = forge.mgf1;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjM5LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL25vZGUtZm9yZ2UvbGliL21nZi5qcz81Njc3Il0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTm9kZS5qcyBtb2R1bGUgZm9yIEZvcmdlIG1hc2sgZ2VuZXJhdGlvbiBmdW5jdGlvbnMuXG4gKlxuICogQGF1dGhvciBTdGVmYW4gU2llZ2xcbiAqXG4gKiBDb3B5cmlnaHQgMjAxMiBTdGVmYW4gU2llZ2wgPHN0ZXNpZUBicm9rZW5waXBlLmRlPlxuICovXG52YXIgZm9yZ2UgPSByZXF1aXJlKCcuL2ZvcmdlJyk7XG5yZXF1aXJlKCcuL21nZjEnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmb3JnZS5tZ2YgPSBmb3JnZS5tZ2YgfHwge307XG5mb3JnZS5tZ2YubWdmMSA9IGZvcmdlLm1nZjE7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///239\n")},function(module,exports,__webpack_require__){eval("/* WEBPACK VAR INJECTION */(function(Buffer) {/**\n * JavaScript implementation of Ed25519.\n *\n * Copyright (c) 2017-2019 Digital Bazaar, Inc.\n *\n * This implementation is based on the most excellent TweetNaCl which is\n * in the public domain. Many thanks to its contributors:\n *\n * https://github.com/dchest/tweetnacl-js\n */\nvar forge = __webpack_require__(4);\n__webpack_require__(43);\n__webpack_require__(13);\n__webpack_require__(90);\n__webpack_require__(7);\nvar asn1Validator = __webpack_require__(241);\nvar publicKeyValidator = asn1Validator.publicKeyValidator;\nvar privateKeyValidator = asn1Validator.privateKeyValidator;\n\nif(typeof BigInteger === 'undefined') {\n  var BigInteger = forge.jsbn.BigInteger;\n}\n\nvar ByteBuffer = forge.util.ByteBuffer;\nvar NativeBuffer = typeof Buffer === 'undefined' ? Uint8Array : Buffer;\n\n/*\n * Ed25519 algorithms, see RFC 8032:\n * https://tools.ietf.org/html/rfc8032\n */\nforge.pki = forge.pki || {};\nmodule.exports = forge.pki.ed25519 = forge.ed25519 = forge.ed25519 || {};\nvar ed25519 = forge.ed25519;\n\ned25519.constants = {};\ned25519.constants.PUBLIC_KEY_BYTE_LENGTH = 32;\ned25519.constants.PRIVATE_KEY_BYTE_LENGTH = 64;\ned25519.constants.SEED_BYTE_LENGTH = 32;\ned25519.constants.SIGN_BYTE_LENGTH = 64;\ned25519.constants.HASH_BYTE_LENGTH = 64;\n\ned25519.generateKeyPair = function(options) {\n  options = options || {};\n  var seed = options.seed;\n  if(seed === undefined) {\n    // generate seed\n    seed = forge.random.getBytesSync(ed25519.constants.SEED_BYTE_LENGTH);\n  } else if(typeof seed === 'string') {\n    if(seed.length !== ed25519.constants.SEED_BYTE_LENGTH) {\n      throw new TypeError(\n        '\"seed\" must be ' + ed25519.constants.SEED_BYTE_LENGTH +\n        ' bytes in length.');\n    }\n  } else if(!(seed instanceof Uint8Array)) {\n    throw new TypeError(\n      '\"seed\" must be a node.js Buffer, Uint8Array, or a binary string.');\n  }\n\n  seed = messageToNativeBuffer({message: seed, encoding: 'binary'});\n\n  var pk = new NativeBuffer(ed25519.constants.PUBLIC_KEY_BYTE_LENGTH);\n  var sk = new NativeBuffer(ed25519.constants.PRIVATE_KEY_BYTE_LENGTH);\n  for(var i = 0; i < 32; ++i) {\n    sk[i] = seed[i];\n  }\n  crypto_sign_keypair(pk, sk);\n  return {publicKey: pk, privateKey: sk};\n};\n\n/**\n * Converts a private key from a RFC8410 ASN.1 encoding.\n *\n * @param obj - The asn1 representation of a private key.\n *\n * @returns {Object} keyInfo - The key information.\n * @returns {Buffer|Uint8Array} keyInfo.privateKeyBytes - 32 private key bytes.\n */\ned25519.privateKeyFromAsn1 = function(obj) {\n  var capture = {};\n  var errors = [];\n  var valid = forge.asn1.validate(obj, privateKeyValidator, capture, errors);\n  if(!valid) {\n    var error = new Error('Invalid Key.');\n    error.errors = errors;\n    throw error;\n  }\n  var oid = forge.asn1.derToOid(capture.privateKeyOid);\n  var ed25519Oid = forge.oids.EdDSA25519;\n  if(oid !== ed25519Oid) {\n    throw new Error('Invalid OID \"' + oid + '\"; OID must be \"' +\n      ed25519Oid + '\".');\n  }\n  var privateKey = capture.privateKey;\n  // manually extract the private key bytes from nested octet string, see FIXME:\n  // https://github.com/digitalbazaar/forge/blob/master/lib/asn1.js#L542\n  var privateKeyBytes = messageToNativeBuffer({\n    message: forge.asn1.fromDer(privateKey).value,\n    encoding: 'binary'\n  });\n  // TODO: RFC8410 specifies a format for encoding the public key bytes along\n  // with the private key bytes. `publicKeyBytes` can be returned in the\n  // future. https://tools.ietf.org/html/rfc8410#section-10.3\n  return {privateKeyBytes: privateKeyBytes};\n};\n\n/**\n * Converts a public key from a RFC8410 ASN.1 encoding.\n *\n * @param obj - The asn1 representation of a public key.\n *\n * @return {Buffer|Uint8Array} - 32 public key bytes.\n */\ned25519.publicKeyFromAsn1 = function(obj) {\n  // get SubjectPublicKeyInfo\n  var capture = {};\n  var errors = [];\n  var valid = forge.asn1.validate(obj, publicKeyValidator, capture, errors);\n  if(!valid) {\n    var error = new Error('Invalid Key.');\n    error.errors = errors;\n    throw error;\n  }\n  var oid = forge.asn1.derToOid(capture.publicKeyOid);\n  var ed25519Oid = forge.oids.EdDSA25519;\n  if(oid !== ed25519Oid) {\n    throw new Error('Invalid OID \"' + oid + '\"; OID must be \"' +\n      ed25519Oid + '\".');\n  }\n  var publicKeyBytes = capture.ed25519PublicKey;\n  if(publicKeyBytes.length !== ed25519.constants.PUBLIC_KEY_BYTE_LENGTH) {\n    throw new Error('Key length is invalid.');\n  }\n  return messageToNativeBuffer({\n    message: publicKeyBytes,\n    encoding: 'binary'\n  });\n};\n\ned25519.publicKeyFromPrivateKey = function(options) {\n  options = options || {};\n  var privateKey = messageToNativeBuffer({\n    message: options.privateKey, encoding: 'binary'\n  });\n  if(privateKey.length !== ed25519.constants.PRIVATE_KEY_BYTE_LENGTH) {\n    throw new TypeError(\n      '\"options.privateKey\" must have a byte length of ' +\n      ed25519.constants.PRIVATE_KEY_BYTE_LENGTH);\n  }\n\n  var pk = new NativeBuffer(ed25519.constants.PUBLIC_KEY_BYTE_LENGTH);\n  for(var i = 0; i < pk.length; ++i) {\n    pk[i] = privateKey[32 + i];\n  }\n  return pk;\n};\n\ned25519.sign = function(options) {\n  options = options || {};\n  var msg = messageToNativeBuffer(options);\n  var privateKey = messageToNativeBuffer({\n    message: options.privateKey,\n    encoding: 'binary'\n  });\n  if(privateKey.length === ed25519.constants.SEED_BYTE_LENGTH) {\n    var keyPair = ed25519.generateKeyPair({seed: privateKey});\n    privateKey = keyPair.privateKey;\n  } else if(privateKey.length !== ed25519.constants.PRIVATE_KEY_BYTE_LENGTH) {\n    throw new TypeError(\n      '\"options.privateKey\" must have a byte length of ' +\n      ed25519.constants.SEED_BYTE_LENGTH + ' or ' +\n      ed25519.constants.PRIVATE_KEY_BYTE_LENGTH);\n  }\n\n  var signedMsg = new NativeBuffer(\n    ed25519.constants.SIGN_BYTE_LENGTH + msg.length);\n  crypto_sign(signedMsg, msg, msg.length, privateKey);\n\n  var sig = new NativeBuffer(ed25519.constants.SIGN_BYTE_LENGTH);\n  for(var i = 0; i < sig.length; ++i) {\n    sig[i] = signedMsg[i];\n  }\n  return sig;\n};\n\ned25519.verify = function(options) {\n  options = options || {};\n  var msg = messageToNativeBuffer(options);\n  if(options.signature === undefined) {\n    throw new TypeError(\n      '\"options.signature\" must be a node.js Buffer, a Uint8Array, a forge ' +\n      'ByteBuffer, or a binary string.');\n  }\n  var sig = messageToNativeBuffer({\n    message: options.signature,\n    encoding: 'binary'\n  });\n  if(sig.length !== ed25519.constants.SIGN_BYTE_LENGTH) {\n    throw new TypeError(\n      '\"options.signature\" must have a byte length of ' +\n      ed25519.constants.SIGN_BYTE_LENGTH);\n  }\n  var publicKey = messageToNativeBuffer({\n    message: options.publicKey,\n    encoding: 'binary'\n  });\n  if(publicKey.length !== ed25519.constants.PUBLIC_KEY_BYTE_LENGTH) {\n    throw new TypeError(\n      '\"options.publicKey\" must have a byte length of ' +\n      ed25519.constants.PUBLIC_KEY_BYTE_LENGTH);\n  }\n\n  var sm = new NativeBuffer(ed25519.constants.SIGN_BYTE_LENGTH + msg.length);\n  var m = new NativeBuffer(ed25519.constants.SIGN_BYTE_LENGTH + msg.length);\n  var i;\n  for(i = 0; i < ed25519.constants.SIGN_BYTE_LENGTH; ++i) {\n    sm[i] = sig[i];\n  }\n  for(i = 0; i < msg.length; ++i) {\n    sm[i + ed25519.constants.SIGN_BYTE_LENGTH] = msg[i];\n  }\n  return (crypto_sign_open(m, sm, sm.length, publicKey) >= 0);\n};\n\nfunction messageToNativeBuffer(options) {\n  var message = options.message;\n  if(message instanceof Uint8Array || message instanceof NativeBuffer) {\n    return message;\n  }\n\n  var encoding = options.encoding;\n  if(message === undefined) {\n    if(options.md) {\n      // TODO: more rigorous validation that `md` is a MessageDigest\n      message = options.md.digest().getBytes();\n      encoding = 'binary';\n    } else {\n      throw new TypeError('\"options.message\" or \"options.md\" not specified.');\n    }\n  }\n\n  if(typeof message === 'string' && !encoding) {\n    throw new TypeError('\"options.encoding\" must be \"binary\" or \"utf8\".');\n  }\n\n  if(typeof message === 'string') {\n    if(typeof Buffer !== 'undefined') {\n      return Buffer.from(message, encoding);\n    }\n    message = new ByteBuffer(message, encoding);\n  } else if(!(message instanceof ByteBuffer)) {\n    throw new TypeError(\n      '\"options.message\" must be a node.js Buffer, a Uint8Array, a forge ' +\n      'ByteBuffer, or a string with \"options.encoding\" specifying its ' +\n      'encoding.');\n  }\n\n  // convert to native buffer\n  var buffer = new NativeBuffer(message.length());\n  for(var i = 0; i < buffer.length; ++i) {\n    buffer[i] = message.at(i);\n  }\n  return buffer;\n}\n\nvar gf0 = gf();\nvar gf1 = gf([1]);\nvar D = gf([\n  0x78a3, 0x1359, 0x4dca, 0x75eb, 0xd8ab, 0x4141, 0x0a4d, 0x0070,\n  0xe898, 0x7779, 0x4079, 0x8cc7, 0xfe73, 0x2b6f, 0x6cee, 0x5203]);\nvar D2 = gf([\n  0xf159, 0x26b2, 0x9b94, 0xebd6, 0xb156, 0x8283, 0x149a, 0x00e0,\n  0xd130, 0xeef3, 0x80f2, 0x198e, 0xfce7, 0x56df, 0xd9dc, 0x2406]);\nvar X = gf([\n  0xd51a, 0x8f25, 0x2d60, 0xc956, 0xa7b2, 0x9525, 0xc760, 0x692c,\n  0xdc5c, 0xfdd6, 0xe231, 0xc0a4, 0x53fe, 0xcd6e, 0x36d3, 0x2169]);\nvar Y = gf([\n  0x6658, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666,\n  0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666]);\nvar L = new Float64Array([\n  0xed, 0xd3, 0xf5, 0x5c, 0x1a, 0x63, 0x12, 0x58,\n  0xd6, 0x9c, 0xf7, 0xa2, 0xde, 0xf9, 0xde, 0x14,\n  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x10]);\nvar I = gf([\n  0xa0b0, 0x4a0e, 0x1b27, 0xc4ee, 0xe478, 0xad2f, 0x1806, 0x2f43,\n  0xd7a7, 0x3dfb, 0x0099, 0x2b4d, 0xdf0b, 0x4fc1, 0x2480, 0x2b83]);\n\n// TODO: update forge buffer implementation to use `Buffer` or `Uint8Array`,\n// whichever is available, to improve performance\nfunction sha512(msg, msgLen) {\n  // Note: `out` and `msg` are NativeBuffer\n  var md = forge.md.sha512.create();\n  var buffer = new ByteBuffer(msg);\n  md.update(buffer.getBytes(msgLen), 'binary');\n  var hash = md.digest().getBytes();\n  if(typeof Buffer !== 'undefined') {\n    return Buffer.from(hash, 'binary');\n  }\n  var out = new NativeBuffer(ed25519.constants.HASH_BYTE_LENGTH);\n  for(var i = 0; i < 64; ++i) {\n    out[i] = hash.charCodeAt(i);\n  }\n  return out;\n}\n\nfunction crypto_sign_keypair(pk, sk) {\n  var p = [gf(), gf(), gf(), gf()];\n  var i;\n\n  var d = sha512(sk, 32);\n  d[0] &= 248;\n  d[31] &= 127;\n  d[31] |= 64;\n\n  scalarbase(p, d);\n  pack(pk, p);\n\n  for(i = 0; i < 32; ++i) {\n    sk[i + 32] = pk[i];\n  }\n  return 0;\n}\n\n// Note: difference from C - smlen returned, not passed as argument.\nfunction crypto_sign(sm, m, n, sk) {\n  var i, j, x = new Float64Array(64);\n  var p = [gf(), gf(), gf(), gf()];\n\n  var d = sha512(sk, 32);\n  d[0] &= 248;\n  d[31] &= 127;\n  d[31] |= 64;\n\n  var smlen = n + 64;\n  for(i = 0; i < n; ++i) {\n    sm[64 + i] = m[i];\n  }\n  for(i = 0; i < 32; ++i) {\n    sm[32 + i] = d[32 + i];\n  }\n\n  var r = sha512(sm.subarray(32), n + 32);\n  reduce(r);\n  scalarbase(p, r);\n  pack(sm, p);\n\n  for(i = 32; i < 64; ++i) {\n    sm[i] = sk[i];\n  }\n  var h = sha512(sm, n + 64);\n  reduce(h);\n\n  for(i = 32; i < 64; ++i) {\n    x[i] = 0;\n  }\n  for(i = 0; i < 32; ++i) {\n    x[i] = r[i];\n  }\n  for(i = 0; i < 32; ++i) {\n    for(j = 0; j < 32; j++) {\n      x[i + j] += h[i] * d[j];\n    }\n  }\n\n  modL(sm.subarray(32), x);\n  return smlen;\n}\n\nfunction crypto_sign_open(m, sm, n, pk) {\n  var i, mlen;\n  var t = new NativeBuffer(32);\n  var p = [gf(), gf(), gf(), gf()],\n      q = [gf(), gf(), gf(), gf()];\n\n  mlen = -1;\n  if(n < 64) {\n    return -1;\n  }\n\n  if(unpackneg(q, pk)) {\n    return -1;\n  }\n\n  for(i = 0; i < n; ++i) {\n    m[i] = sm[i];\n  }\n  for(i = 0; i < 32; ++i) {\n    m[i + 32] = pk[i];\n  }\n  var h = sha512(m, n);\n  reduce(h);\n  scalarmult(p, q, h);\n\n  scalarbase(q, sm.subarray(32));\n  add(p, q);\n  pack(t, p);\n\n  n -= 64;\n  if(crypto_verify_32(sm, 0, t, 0)) {\n    for(i = 0; i < n; ++i) {\n      m[i] = 0;\n    }\n    return -1;\n  }\n\n  for(i = 0; i < n; ++i) {\n    m[i] = sm[i + 64];\n  }\n  mlen = n;\n  return mlen;\n}\n\nfunction modL(r, x) {\n  var carry, i, j, k;\n  for(i = 63; i >= 32; --i) {\n    carry = 0;\n    for(j = i - 32, k = i - 12; j < k; ++j) {\n      x[j] += carry - 16 * x[i] * L[j - (i - 32)];\n      carry = (x[j] + 128) >> 8;\n      x[j] -= carry * 256;\n    }\n    x[j] += carry;\n    x[i] = 0;\n  }\n  carry = 0;\n  for(j = 0; j < 32; ++j) {\n    x[j] += carry - (x[31] >> 4) * L[j];\n    carry = x[j] >> 8;\n    x[j] &= 255;\n  }\n  for(j = 0; j < 32; ++j) {\n    x[j] -= carry * L[j];\n  }\n  for(i = 0; i < 32; ++i) {\n    x[i + 1] += x[i] >> 8;\n    r[i] = x[i] & 255;\n  }\n}\n\nfunction reduce(r) {\n  var x = new Float64Array(64);\n  for(var i = 0; i < 64; ++i) {\n    x[i] = r[i];\n    r[i] = 0;\n  }\n  modL(r, x);\n}\n\nfunction add(p, q) {\n  var a = gf(), b = gf(), c = gf(),\n      d = gf(), e = gf(), f = gf(),\n      g = gf(), h = gf(), t = gf();\n\n  Z(a, p[1], p[0]);\n  Z(t, q[1], q[0]);\n  M(a, a, t);\n  A(b, p[0], p[1]);\n  A(t, q[0], q[1]);\n  M(b, b, t);\n  M(c, p[3], q[3]);\n  M(c, c, D2);\n  M(d, p[2], q[2]);\n  A(d, d, d);\n  Z(e, b, a);\n  Z(f, d, c);\n  A(g, d, c);\n  A(h, b, a);\n\n  M(p[0], e, f);\n  M(p[1], h, g);\n  M(p[2], g, f);\n  M(p[3], e, h);\n}\n\nfunction cswap(p, q, b) {\n  for(var i = 0; i < 4; ++i) {\n    sel25519(p[i], q[i], b);\n  }\n}\n\nfunction pack(r, p) {\n  var tx = gf(), ty = gf(), zi = gf();\n  inv25519(zi, p[2]);\n  M(tx, p[0], zi);\n  M(ty, p[1], zi);\n  pack25519(r, ty);\n  r[31] ^= par25519(tx) << 7;\n}\n\nfunction pack25519(o, n) {\n  var i, j, b;\n  var m = gf(), t = gf();\n  for(i = 0; i < 16; ++i) {\n    t[i] = n[i];\n  }\n  car25519(t);\n  car25519(t);\n  car25519(t);\n  for(j = 0; j < 2; ++j) {\n    m[0] = t[0] - 0xffed;\n    for(i = 1; i < 15; ++i) {\n      m[i] = t[i] - 0xffff - ((m[i - 1] >> 16) & 1);\n      m[i-1] &= 0xffff;\n    }\n    m[15] = t[15] - 0x7fff - ((m[14] >> 16) & 1);\n    b = (m[15] >> 16) & 1;\n    m[14] &= 0xffff;\n    sel25519(t, m, 1 - b);\n  }\n  for (i = 0; i < 16; i++) {\n    o[2 * i] = t[i] & 0xff;\n    o[2 * i + 1] = t[i] >> 8;\n  }\n}\n\nfunction unpackneg(r, p) {\n  var t = gf(), chk = gf(), num = gf(),\n      den = gf(), den2 = gf(), den4 = gf(),\n      den6 = gf();\n\n  set25519(r[2], gf1);\n  unpack25519(r[1], p);\n  S(num, r[1]);\n  M(den, num, D);\n  Z(num, num, r[2]);\n  A(den, r[2], den);\n\n  S(den2, den);\n  S(den4, den2);\n  M(den6, den4, den2);\n  M(t, den6, num);\n  M(t, t, den);\n\n  pow2523(t, t);\n  M(t, t, num);\n  M(t, t, den);\n  M(t, t, den);\n  M(r[0], t, den);\n\n  S(chk, r[0]);\n  M(chk, chk, den);\n  if(neq25519(chk, num)) {\n    M(r[0], r[0], I);\n  }\n\n  S(chk, r[0]);\n  M(chk, chk, den);\n  if(neq25519(chk, num)) {\n    return -1;\n  }\n\n  if(par25519(r[0]) === (p[31] >> 7)) {\n    Z(r[0], gf0, r[0]);\n  }\n\n  M(r[3], r[0], r[1]);\n  return 0;\n}\n\nfunction unpack25519(o, n) {\n  var i;\n  for(i = 0; i < 16; ++i) {\n    o[i] = n[2 * i] + (n[2 * i + 1] << 8);\n  }\n  o[15] &= 0x7fff;\n}\n\nfunction pow2523(o, i) {\n  var c = gf();\n  var a;\n  for(a = 0; a < 16; ++a) {\n    c[a] = i[a];\n  }\n  for(a = 250; a >= 0; --a) {\n    S(c, c);\n    if(a !== 1) {\n      M(c, c, i);\n    }\n  }\n  for(a = 0; a < 16; ++a) {\n    o[a] = c[a];\n  }\n}\n\nfunction neq25519(a, b) {\n  var c = new NativeBuffer(32);\n  var d = new NativeBuffer(32);\n  pack25519(c, a);\n  pack25519(d, b);\n  return crypto_verify_32(c, 0, d, 0);\n}\n\nfunction crypto_verify_32(x, xi, y, yi) {\n  return vn(x, xi, y, yi, 32);\n}\n\nfunction vn(x, xi, y, yi, n) {\n  var i, d = 0;\n  for(i = 0; i < n; ++i) {\n    d |= x[xi + i] ^ y[yi + i];\n  }\n  return (1 & ((d - 1) >>> 8)) - 1;\n}\n\nfunction par25519(a) {\n  var d = new NativeBuffer(32);\n  pack25519(d, a);\n  return d[0] & 1;\n}\n\nfunction scalarmult(p, q, s) {\n  var b, i;\n  set25519(p[0], gf0);\n  set25519(p[1], gf1);\n  set25519(p[2], gf1);\n  set25519(p[3], gf0);\n  for(i = 255; i >= 0; --i) {\n    b = (s[(i / 8)|0] >> (i & 7)) & 1;\n    cswap(p, q, b);\n    add(q, p);\n    add(p, p);\n    cswap(p, q, b);\n  }\n}\n\nfunction scalarbase(p, s) {\n  var q = [gf(), gf(), gf(), gf()];\n  set25519(q[0], X);\n  set25519(q[1], Y);\n  set25519(q[2], gf1);\n  M(q[3], X, Y);\n  scalarmult(p, q, s);\n}\n\nfunction set25519(r, a) {\n  var i;\n  for(i = 0; i < 16; i++) {\n    r[i] = a[i] | 0;\n  }\n}\n\nfunction inv25519(o, i) {\n  var c = gf();\n  var a;\n  for(a = 0; a < 16; ++a) {\n    c[a] = i[a];\n  }\n  for(a = 253; a >= 0; --a) {\n    S(c, c);\n    if(a !== 2 && a !== 4) {\n      M(c, c, i);\n    }\n  }\n  for(a = 0; a < 16; ++a) {\n    o[a] = c[a];\n  }\n}\n\nfunction car25519(o) {\n  var i, v, c = 1;\n  for(i = 0; i < 16; ++i) {\n    v = o[i] + c + 65535;\n    c = Math.floor(v / 65536);\n    o[i] = v - c * 65536;\n  }\n  o[0] += c - 1 + 37 * (c - 1);\n}\n\nfunction sel25519(p, q, b) {\n  var t, c = ~(b - 1);\n  for(var i = 0; i < 16; ++i) {\n    t = c & (p[i] ^ q[i]);\n    p[i] ^= t;\n    q[i] ^= t;\n  }\n}\n\nfunction gf(init) {\n  var i, r = new Float64Array(16);\n  if(init) {\n    for(i = 0; i < init.length; ++i) {\n      r[i] = init[i];\n    }\n  }\n  return r;\n}\n\nfunction A(o, a, b) {\n  for(var i = 0; i < 16; ++i) {\n    o[i] = a[i] + b[i];\n  }\n}\n\nfunction Z(o, a, b) {\n  for(var i = 0; i < 16; ++i) {\n    o[i] = a[i] - b[i];\n  }\n}\n\nfunction S(o, a) {\n  M(o, a, a);\n}\n\nfunction M(o, a, b) {\n  var v, c,\n     t0 = 0,  t1 = 0,  t2 = 0,  t3 = 0,  t4 = 0,  t5 = 0,  t6 = 0,  t7 = 0,\n     t8 = 0,  t9 = 0, t10 = 0, t11 = 0, t12 = 0, t13 = 0, t14 = 0, t15 = 0,\n    t16 = 0, t17 = 0, t18 = 0, t19 = 0, t20 = 0, t21 = 0, t22 = 0, t23 = 0,\n    t24 = 0, t25 = 0, t26 = 0, t27 = 0, t28 = 0, t29 = 0, t30 = 0,\n    b0 = b[0],\n    b1 = b[1],\n    b2 = b[2],\n    b3 = b[3],\n    b4 = b[4],\n    b5 = b[5],\n    b6 = b[6],\n    b7 = b[7],\n    b8 = b[8],\n    b9 = b[9],\n    b10 = b[10],\n    b11 = b[11],\n    b12 = b[12],\n    b13 = b[13],\n    b14 = b[14],\n    b15 = b[15];\n\n  v = a[0];\n  t0 += v * b0;\n  t1 += v * b1;\n  t2 += v * b2;\n  t3 += v * b3;\n  t4 += v * b4;\n  t5 += v * b5;\n  t6 += v * b6;\n  t7 += v * b7;\n  t8 += v * b8;\n  t9 += v * b9;\n  t10 += v * b10;\n  t11 += v * b11;\n  t12 += v * b12;\n  t13 += v * b13;\n  t14 += v * b14;\n  t15 += v * b15;\n  v = a[1];\n  t1 += v * b0;\n  t2 += v * b1;\n  t3 += v * b2;\n  t4 += v * b3;\n  t5 += v * b4;\n  t6 += v * b5;\n  t7 += v * b6;\n  t8 += v * b7;\n  t9 += v * b8;\n  t10 += v * b9;\n  t11 += v * b10;\n  t12 += v * b11;\n  t13 += v * b12;\n  t14 += v * b13;\n  t15 += v * b14;\n  t16 += v * b15;\n  v = a[2];\n  t2 += v * b0;\n  t3 += v * b1;\n  t4 += v * b2;\n  t5 += v * b3;\n  t6 += v * b4;\n  t7 += v * b5;\n  t8 += v * b6;\n  t9 += v * b7;\n  t10 += v * b8;\n  t11 += v * b9;\n  t12 += v * b10;\n  t13 += v * b11;\n  t14 += v * b12;\n  t15 += v * b13;\n  t16 += v * b14;\n  t17 += v * b15;\n  v = a[3];\n  t3 += v * b0;\n  t4 += v * b1;\n  t5 += v * b2;\n  t6 += v * b3;\n  t7 += v * b4;\n  t8 += v * b5;\n  t9 += v * b6;\n  t10 += v * b7;\n  t11 += v * b8;\n  t12 += v * b9;\n  t13 += v * b10;\n  t14 += v * b11;\n  t15 += v * b12;\n  t16 += v * b13;\n  t17 += v * b14;\n  t18 += v * b15;\n  v = a[4];\n  t4 += v * b0;\n  t5 += v * b1;\n  t6 += v * b2;\n  t7 += v * b3;\n  t8 += v * b4;\n  t9 += v * b5;\n  t10 += v * b6;\n  t11 += v * b7;\n  t12 += v * b8;\n  t13 += v * b9;\n  t14 += v * b10;\n  t15 += v * b11;\n  t16 += v * b12;\n  t17 += v * b13;\n  t18 += v * b14;\n  t19 += v * b15;\n  v = a[5];\n  t5 += v * b0;\n  t6 += v * b1;\n  t7 += v * b2;\n  t8 += v * b3;\n  t9 += v * b4;\n  t10 += v * b5;\n  t11 += v * b6;\n  t12 += v * b7;\n  t13 += v * b8;\n  t14 += v * b9;\n  t15 += v * b10;\n  t16 += v * b11;\n  t17 += v * b12;\n  t18 += v * b13;\n  t19 += v * b14;\n  t20 += v * b15;\n  v = a[6];\n  t6 += v * b0;\n  t7 += v * b1;\n  t8 += v * b2;\n  t9 += v * b3;\n  t10 += v * b4;\n  t11 += v * b5;\n  t12 += v * b6;\n  t13 += v * b7;\n  t14 += v * b8;\n  t15 += v * b9;\n  t16 += v * b10;\n  t17 += v * b11;\n  t18 += v * b12;\n  t19 += v * b13;\n  t20 += v * b14;\n  t21 += v * b15;\n  v = a[7];\n  t7 += v * b0;\n  t8 += v * b1;\n  t9 += v * b2;\n  t10 += v * b3;\n  t11 += v * b4;\n  t12 += v * b5;\n  t13 += v * b6;\n  t14 += v * b7;\n  t15 += v * b8;\n  t16 += v * b9;\n  t17 += v * b10;\n  t18 += v * b11;\n  t19 += v * b12;\n  t20 += v * b13;\n  t21 += v * b14;\n  t22 += v * b15;\n  v = a[8];\n  t8 += v * b0;\n  t9 += v * b1;\n  t10 += v * b2;\n  t11 += v * b3;\n  t12 += v * b4;\n  t13 += v * b5;\n  t14 += v * b6;\n  t15 += v * b7;\n  t16 += v * b8;\n  t17 += v * b9;\n  t18 += v * b10;\n  t19 += v * b11;\n  t20 += v * b12;\n  t21 += v * b13;\n  t22 += v * b14;\n  t23 += v * b15;\n  v = a[9];\n  t9 += v * b0;\n  t10 += v * b1;\n  t11 += v * b2;\n  t12 += v * b3;\n  t13 += v * b4;\n  t14 += v * b5;\n  t15 += v * b6;\n  t16 += v * b7;\n  t17 += v * b8;\n  t18 += v * b9;\n  t19 += v * b10;\n  t20 += v * b11;\n  t21 += v * b12;\n  t22 += v * b13;\n  t23 += v * b14;\n  t24 += v * b15;\n  v = a[10];\n  t10 += v * b0;\n  t11 += v * b1;\n  t12 += v * b2;\n  t13 += v * b3;\n  t14 += v * b4;\n  t15 += v * b5;\n  t16 += v * b6;\n  t17 += v * b7;\n  t18 += v * b8;\n  t19 += v * b9;\n  t20 += v * b10;\n  t21 += v * b11;\n  t22 += v * b12;\n  t23 += v * b13;\n  t24 += v * b14;\n  t25 += v * b15;\n  v = a[11];\n  t11 += v * b0;\n  t12 += v * b1;\n  t13 += v * b2;\n  t14 += v * b3;\n  t15 += v * b4;\n  t16 += v * b5;\n  t17 += v * b6;\n  t18 += v * b7;\n  t19 += v * b8;\n  t20 += v * b9;\n  t21 += v * b10;\n  t22 += v * b11;\n  t23 += v * b12;\n  t24 += v * b13;\n  t25 += v * b14;\n  t26 += v * b15;\n  v = a[12];\n  t12 += v * b0;\n  t13 += v * b1;\n  t14 += v * b2;\n  t15 += v * b3;\n  t16 += v * b4;\n  t17 += v * b5;\n  t18 += v * b6;\n  t19 += v * b7;\n  t20 += v * b8;\n  t21 += v * b9;\n  t22 += v * b10;\n  t23 += v * b11;\n  t24 += v * b12;\n  t25 += v * b13;\n  t26 += v * b14;\n  t27 += v * b15;\n  v = a[13];\n  t13 += v * b0;\n  t14 += v * b1;\n  t15 += v * b2;\n  t16 += v * b3;\n  t17 += v * b4;\n  t18 += v * b5;\n  t19 += v * b6;\n  t20 += v * b7;\n  t21 += v * b8;\n  t22 += v * b9;\n  t23 += v * b10;\n  t24 += v * b11;\n  t25 += v * b12;\n  t26 += v * b13;\n  t27 += v * b14;\n  t28 += v * b15;\n  v = a[14];\n  t14 += v * b0;\n  t15 += v * b1;\n  t16 += v * b2;\n  t17 += v * b3;\n  t18 += v * b4;\n  t19 += v * b5;\n  t20 += v * b6;\n  t21 += v * b7;\n  t22 += v * b8;\n  t23 += v * b9;\n  t24 += v * b10;\n  t25 += v * b11;\n  t26 += v * b12;\n  t27 += v * b13;\n  t28 += v * b14;\n  t29 += v * b15;\n  v = a[15];\n  t15 += v * b0;\n  t16 += v * b1;\n  t17 += v * b2;\n  t18 += v * b3;\n  t19 += v * b4;\n  t20 += v * b5;\n  t21 += v * b6;\n  t22 += v * b7;\n  t23 += v * b8;\n  t24 += v * b9;\n  t25 += v * b10;\n  t26 += v * b11;\n  t27 += v * b12;\n  t28 += v * b13;\n  t29 += v * b14;\n  t30 += v * b15;\n\n  t0  += 38 * t16;\n  t1  += 38 * t17;\n  t2  += 38 * t18;\n  t3  += 38 * t19;\n  t4  += 38 * t20;\n  t5  += 38 * t21;\n  t6  += 38 * t22;\n  t7  += 38 * t23;\n  t8  += 38 * t24;\n  t9  += 38 * t25;\n  t10 += 38 * t26;\n  t11 += 38 * t27;\n  t12 += 38 * t28;\n  t13 += 38 * t29;\n  t14 += 38 * t30;\n  // t15 left as is\n\n  // first car\n  c = 1;\n  v =  t0 + c + 65535; c = Math.floor(v / 65536);  t0 = v - c * 65536;\n  v =  t1 + c + 65535; c = Math.floor(v / 65536);  t1 = v - c * 65536;\n  v =  t2 + c + 65535; c = Math.floor(v / 65536);  t2 = v - c * 65536;\n  v =  t3 + c + 65535; c = Math.floor(v / 65536);  t3 = v - c * 65536;\n  v =  t4 + c + 65535; c = Math.floor(v / 65536);  t4 = v - c * 65536;\n  v =  t5 + c + 65535; c = Math.floor(v / 65536);  t5 = v - c * 65536;\n  v =  t6 + c + 65535; c = Math.floor(v / 65536);  t6 = v - c * 65536;\n  v =  t7 + c + 65535; c = Math.floor(v / 65536);  t7 = v - c * 65536;\n  v =  t8 + c + 65535; c = Math.floor(v / 65536);  t8 = v - c * 65536;\n  v =  t9 + c + 65535; c = Math.floor(v / 65536);  t9 = v - c * 65536;\n  v = t10 + c + 65535; c = Math.floor(v / 65536); t10 = v - c * 65536;\n  v = t11 + c + 65535; c = Math.floor(v / 65536); t11 = v - c * 65536;\n  v = t12 + c + 65535; c = Math.floor(v / 65536); t12 = v - c * 65536;\n  v = t13 + c + 65535; c = Math.floor(v / 65536); t13 = v - c * 65536;\n  v = t14 + c + 65535; c = Math.floor(v / 65536); t14 = v - c * 65536;\n  v = t15 + c + 65535; c = Math.floor(v / 65536); t15 = v - c * 65536;\n  t0 += c-1 + 37 * (c-1);\n\n  // second car\n  c = 1;\n  v =  t0 + c + 65535; c = Math.floor(v / 65536);  t0 = v - c * 65536;\n  v =  t1 + c + 65535; c = Math.floor(v / 65536);  t1 = v - c * 65536;\n  v =  t2 + c + 65535; c = Math.floor(v / 65536);  t2 = v - c * 65536;\n  v =  t3 + c + 65535; c = Math.floor(v / 65536);  t3 = v - c * 65536;\n  v =  t4 + c + 65535; c = Math.floor(v / 65536);  t4 = v - c * 65536;\n  v =  t5 + c + 65535; c = Math.floor(v / 65536);  t5 = v - c * 65536;\n  v =  t6 + c + 65535; c = Math.floor(v / 65536);  t6 = v - c * 65536;\n  v =  t7 + c + 65535; c = Math.floor(v / 65536);  t7 = v - c * 65536;\n  v =  t8 + c + 65535; c = Math.floor(v / 65536);  t8 = v - c * 65536;\n  v =  t9 + c + 65535; c = Math.floor(v / 65536);  t9 = v - c * 65536;\n  v = t10 + c + 65535; c = Math.floor(v / 65536); t10 = v - c * 65536;\n  v = t11 + c + 65535; c = Math.floor(v / 65536); t11 = v - c * 65536;\n  v = t12 + c + 65535; c = Math.floor(v / 65536); t12 = v - c * 65536;\n  v = t13 + c + 65535; c = Math.floor(v / 65536); t13 = v - c * 65536;\n  v = t14 + c + 65535; c = Math.floor(v / 65536); t14 = v - c * 65536;\n  v = t15 + c + 65535; c = Math.floor(v / 65536); t15 = v - c * 65536;\n  t0 += c-1 + 37 * (c-1);\n\n  o[ 0] = t0;\n  o[ 1] = t1;\n  o[ 2] = t2;\n  o[ 3] = t3;\n  o[ 4] = t4;\n  o[ 5] = t5;\n  o[ 6] = t6;\n  o[ 7] = t7;\n  o[ 8] = t8;\n  o[ 9] = t9;\n  o[10] = t10;\n  o[11] = t11;\n  o[12] = t12;\n  o[13] = t13;\n  o[14] = t14;\n  o[15] = t15;\n}\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(30).Buffer))//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjQwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL25vZGUtZm9yZ2UvbGliL2VkMjU1MTkuanM/YTc1YiJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEphdmFTY3JpcHQgaW1wbGVtZW50YXRpb24gb2YgRWQyNTUxOS5cbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTctMjAxOSBEaWdpdGFsIEJhemFhciwgSW5jLlxuICpcbiAqIFRoaXMgaW1wbGVtZW50YXRpb24gaXMgYmFzZWQgb24gdGhlIG1vc3QgZXhjZWxsZW50IFR3ZWV0TmFDbCB3aGljaCBpc1xuICogaW4gdGhlIHB1YmxpYyBkb21haW4uIE1hbnkgdGhhbmtzIHRvIGl0cyBjb250cmlidXRvcnM6XG4gKlxuICogaHR0cHM6Ly9naXRodWIuY29tL2RjaGVzdC90d2VldG5hY2wtanNcbiAqL1xudmFyIGZvcmdlID0gcmVxdWlyZSgnLi9mb3JnZScpO1xucmVxdWlyZSgnLi9qc2JuJyk7XG5yZXF1aXJlKCcuL3JhbmRvbScpO1xucmVxdWlyZSgnLi9zaGE1MTInKTtcbnJlcXVpcmUoJy4vdXRpbCcpO1xudmFyIGFzbjFWYWxpZGF0b3IgPSByZXF1aXJlKCcuL2FzbjEtdmFsaWRhdG9yJyk7XG52YXIgcHVibGljS2V5VmFsaWRhdG9yID0gYXNuMVZhbGlkYXRvci5wdWJsaWNLZXlWYWxpZGF0b3I7XG52YXIgcHJpdmF0ZUtleVZhbGlkYXRvciA9IGFzbjFWYWxpZGF0b3IucHJpdmF0ZUtleVZhbGlkYXRvcjtcblxuaWYodHlwZW9mIEJpZ0ludGVnZXIgPT09ICd1bmRlZmluZWQnKSB7XG4gIHZhciBCaWdJbnRlZ2VyID0gZm9yZ2UuanNibi5CaWdJbnRlZ2VyO1xufVxuXG52YXIgQnl0ZUJ1ZmZlciA9IGZvcmdlLnV0aWwuQnl0ZUJ1ZmZlcjtcbnZhciBOYXRpdmVCdWZmZXIgPSB0eXBlb2YgQnVmZmVyID09PSAndW5kZWZpbmVkJyA/IFVpbnQ4QXJyYXkgOiBCdWZmZXI7XG5cbi8qXG4gKiBFZDI1NTE5IGFsZ29yaXRobXMsIHNlZSBSRkMgODAzMjpcbiAqIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM4MDMyXG4gKi9cbmZvcmdlLnBraSA9IGZvcmdlLnBraSB8fCB7fTtcbm1vZHVsZS5leHBvcnRzID0gZm9yZ2UucGtpLmVkMjU1MTkgPSBmb3JnZS5lZDI1NTE5ID0gZm9yZ2UuZWQyNTUxOSB8fCB7fTtcbnZhciBlZDI1NTE5ID0gZm9yZ2UuZWQyNTUxOTtcblxuZWQyNTUxOS5jb25zdGFudHMgPSB7fTtcbmVkMjU1MTkuY29uc3RhbnRzLlBVQkxJQ19LRVlfQllURV9MRU5HVEggPSAzMjtcbmVkMjU1MTkuY29uc3RhbnRzLlBSSVZBVEVfS0VZX0JZVEVfTEVOR1RIID0gNjQ7XG5lZDI1NTE5LmNvbnN0YW50cy5TRUVEX0JZVEVfTEVOR1RIID0gMzI7XG5lZDI1NTE5LmNvbnN0YW50cy5TSUdOX0JZVEVfTEVOR1RIID0gNjQ7XG5lZDI1NTE5LmNvbnN0YW50cy5IQVNIX0JZVEVfTEVOR1RIID0gNjQ7XG5cbmVkMjU1MTkuZ2VuZXJhdGVLZXlQYWlyID0gZnVuY3Rpb24ob3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgdmFyIHNlZWQgPSBvcHRpb25zLnNlZWQ7XG4gIGlmKHNlZWQgPT09IHVuZGVmaW5lZCkge1xuICAgIC8vIGdlbmVyYXRlIHNlZWRcbiAgICBzZWVkID0gZm9yZ2UucmFuZG9tLmdldEJ5dGVzU3luYyhlZDI1NTE5LmNvbnN0YW50cy5TRUVEX0JZVEVfTEVOR1RIKTtcbiAgfSBlbHNlIGlmKHR5cGVvZiBzZWVkID09PSAnc3RyaW5nJykge1xuICAgIGlmKHNlZWQubGVuZ3RoICE9PSBlZDI1NTE5LmNvbnN0YW50cy5TRUVEX0JZVEVfTEVOR1RIKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAnXCJzZWVkXCIgbXVzdCBiZSAnICsgZWQyNTUxOS5jb25zdGFudHMuU0VFRF9CWVRFX0xFTkdUSCArXG4gICAgICAgICcgYnl0ZXMgaW4gbGVuZ3RoLicpO1xuICAgIH1cbiAgfSBlbHNlIGlmKCEoc2VlZCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICdcInNlZWRcIiBtdXN0IGJlIGEgbm9kZS5qcyBCdWZmZXIsIFVpbnQ4QXJyYXksIG9yIGEgYmluYXJ5IHN0cmluZy4nKTtcbiAgfVxuXG4gIHNlZWQgPSBtZXNzYWdlVG9OYXRpdmVCdWZmZXIoe21lc3NhZ2U6IHNlZWQsIGVuY29kaW5nOiAnYmluYXJ5J30pO1xuXG4gIHZhciBwayA9IG5ldyBOYXRpdmVCdWZmZXIoZWQyNTUxOS5jb25zdGFudHMuUFVCTElDX0tFWV9CWVRFX0xFTkdUSCk7XG4gIHZhciBzayA9IG5ldyBOYXRpdmVCdWZmZXIoZWQyNTUxOS5jb25zdGFudHMuUFJJVkFURV9LRVlfQllURV9MRU5HVEgpO1xuICBmb3IodmFyIGkgPSAwOyBpIDwgMzI7ICsraSkge1xuICAgIHNrW2ldID0gc2VlZFtpXTtcbiAgfVxuICBjcnlwdG9fc2lnbl9rZXlwYWlyKHBrLCBzayk7XG4gIHJldHVybiB7cHVibGljS2V5OiBwaywgcHJpdmF0ZUtleTogc2t9O1xufTtcblxuLyoqXG4gKiBDb252ZXJ0cyBhIHByaXZhdGUga2V5IGZyb20gYSBSRkM4NDEwIEFTTi4xIGVuY29kaW5nLlxuICpcbiAqIEBwYXJhbSBvYmogLSBUaGUgYXNuMSByZXByZXNlbnRhdGlvbiBvZiBhIHByaXZhdGUga2V5LlxuICpcbiAqIEByZXR1cm5zIHtPYmplY3R9IGtleUluZm8gLSBUaGUga2V5IGluZm9ybWF0aW9uLlxuICogQHJldHVybnMge0J1ZmZlcnxVaW50OEFycmF5fSBrZXlJbmZvLnByaXZhdGVLZXlCeXRlcyAtIDMyIHByaXZhdGUga2V5IGJ5dGVzLlxuICovXG5lZDI1NTE5LnByaXZhdGVLZXlGcm9tQXNuMSA9IGZ1bmN0aW9uKG9iaikge1xuICB2YXIgY2FwdHVyZSA9IHt9O1xuICB2YXIgZXJyb3JzID0gW107XG4gIHZhciB2YWxpZCA9IGZvcmdlLmFzbjEudmFsaWRhdGUob2JqLCBwcml2YXRlS2V5VmFsaWRhdG9yLCBjYXB0dXJlLCBlcnJvcnMpO1xuICBpZighdmFsaWQpIHtcbiAgICB2YXIgZXJyb3IgPSBuZXcgRXJyb3IoJ0ludmFsaWQgS2V5LicpO1xuICAgIGVycm9yLmVycm9ycyA9IGVycm9ycztcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxuICB2YXIgb2lkID0gZm9yZ2UuYXNuMS5kZXJUb09pZChjYXB0dXJlLnByaXZhdGVLZXlPaWQpO1xuICB2YXIgZWQyNTUxOU9pZCA9IGZvcmdlLm9pZHMuRWREU0EyNTUxOTtcbiAgaWYob2lkICE9PSBlZDI1NTE5T2lkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIE9JRCBcIicgKyBvaWQgKyAnXCI7IE9JRCBtdXN0IGJlIFwiJyArXG4gICAgICBlZDI1NTE5T2lkICsgJ1wiLicpO1xuICB9XG4gIHZhciBwcml2YXRlS2V5ID0gY2FwdHVyZS5wcml2YXRlS2V5O1xuICAvLyBtYW51YWxseSBleHRyYWN0IHRoZSBwcml2YXRlIGtleSBieXRlcyBmcm9tIG5lc3RlZCBvY3RldCBzdHJpbmcsIHNlZSBGSVhNRTpcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2RpZ2l0YWxiYXphYXIvZm9yZ2UvYmxvYi9tYXN0ZXIvbGliL2FzbjEuanMjTDU0MlxuICB2YXIgcHJpdmF0ZUtleUJ5dGVzID0gbWVzc2FnZVRvTmF0aXZlQnVmZmVyKHtcbiAgICBtZXNzYWdlOiBmb3JnZS5hc24xLmZyb21EZXIocHJpdmF0ZUtleSkudmFsdWUsXG4gICAgZW5jb2Rpbmc6ICdiaW5hcnknXG4gIH0pO1xuICAvLyBUT0RPOiBSRkM4NDEwIHNwZWNpZmllcyBhIGZvcm1hdCBmb3IgZW5jb2RpbmcgdGhlIHB1YmxpYyBrZXkgYnl0ZXMgYWxvbmdcbiAgLy8gd2l0aCB0aGUgcHJpdmF0ZSBrZXkgYnl0ZXMuIGBwdWJsaWNLZXlCeXRlc2AgY2FuIGJlIHJldHVybmVkIGluIHRoZVxuICAvLyBmdXR1cmUuIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM4NDEwI3NlY3Rpb24tMTAuM1xuICByZXR1cm4ge3ByaXZhdGVLZXlCeXRlczogcHJpdmF0ZUtleUJ5dGVzfTtcbn07XG5cbi8qKlxuICogQ29udmVydHMgYSBwdWJsaWMga2V5IGZyb20gYSBSRkM4NDEwIEFTTi4xIGVuY29kaW5nLlxuICpcbiAqIEBwYXJhbSBvYmogLSBUaGUgYXNuMSByZXByZXNlbnRhdGlvbiBvZiBhIHB1YmxpYyBrZXkuXG4gKlxuICogQHJldHVybiB7QnVmZmVyfFVpbnQ4QXJyYXl9IC0gMzIgcHVibGljIGtleSBieXRlcy5cbiAqL1xuZWQyNTUxOS5wdWJsaWNLZXlGcm9tQXNuMSA9IGZ1bmN0aW9uKG9iaikge1xuICAvLyBnZXQgU3ViamVjdFB1YmxpY0tleUluZm9cbiAgdmFyIGNhcHR1cmUgPSB7fTtcbiAgdmFyIGVycm9ycyA9IFtdO1xuICB2YXIgdmFsaWQgPSBmb3JnZS5hc24xLnZhbGlkYXRlKG9iaiwgcHVibGljS2V5VmFsaWRhdG9yLCBjYXB0dXJlLCBlcnJvcnMpO1xuICBpZighdmFsaWQpIHtcbiAgICB2YXIgZXJyb3IgPSBuZXcgRXJyb3IoJ0ludmFsaWQgS2V5LicpO1xuICAgIGVycm9yLmVycm9ycyA9IGVycm9ycztcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxuICB2YXIgb2lkID0gZm9yZ2UuYXNuMS5kZXJUb09pZChjYXB0dXJlLnB1YmxpY0tleU9pZCk7XG4gIHZhciBlZDI1NTE5T2lkID0gZm9yZ2Uub2lkcy5FZERTQTI1NTE5O1xuICBpZihvaWQgIT09IGVkMjU1MTlPaWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgT0lEIFwiJyArIG9pZCArICdcIjsgT0lEIG11c3QgYmUgXCInICtcbiAgICAgIGVkMjU1MTlPaWQgKyAnXCIuJyk7XG4gIH1cbiAgdmFyIHB1YmxpY0tleUJ5dGVzID0gY2FwdHVyZS5lZDI1NTE5UHVibGljS2V5O1xuICBpZihwdWJsaWNLZXlCeXRlcy5sZW5ndGggIT09IGVkMjU1MTkuY29uc3RhbnRzLlBVQkxJQ19LRVlfQllURV9MRU5HVEgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0tleSBsZW5ndGggaXMgaW52YWxpZC4nKTtcbiAgfVxuICByZXR1cm4gbWVzc2FnZVRvTmF0aXZlQnVmZmVyKHtcbiAgICBtZXNzYWdlOiBwdWJsaWNLZXlCeXRlcyxcbiAgICBlbmNvZGluZzogJ2JpbmFyeSdcbiAgfSk7XG59O1xuXG5lZDI1NTE5LnB1YmxpY0tleUZyb21Qcml2YXRlS2V5ID0gZnVuY3Rpb24ob3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgdmFyIHByaXZhdGVLZXkgPSBtZXNzYWdlVG9OYXRpdmVCdWZmZXIoe1xuICAgIG1lc3NhZ2U6IG9wdGlvbnMucHJpdmF0ZUtleSwgZW5jb2Rpbmc6ICdiaW5hcnknXG4gIH0pO1xuICBpZihwcml2YXRlS2V5Lmxlbmd0aCAhPT0gZWQyNTUxOS5jb25zdGFudHMuUFJJVkFURV9LRVlfQllURV9MRU5HVEgpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgJ1wib3B0aW9ucy5wcml2YXRlS2V5XCIgbXVzdCBoYXZlIGEgYnl0ZSBsZW5ndGggb2YgJyArXG4gICAgICBlZDI1NTE5LmNvbnN0YW50cy5QUklWQVRFX0tFWV9CWVRFX0xFTkdUSCk7XG4gIH1cblxuICB2YXIgcGsgPSBuZXcgTmF0aXZlQnVmZmVyKGVkMjU1MTkuY29uc3RhbnRzLlBVQkxJQ19LRVlfQllURV9MRU5HVEgpO1xuICBmb3IodmFyIGkgPSAwOyBpIDwgcGsubGVuZ3RoOyArK2kpIHtcbiAgICBwa1tpXSA9IHByaXZhdGVLZXlbMzIgKyBpXTtcbiAgfVxuICByZXR1cm4gcGs7XG59O1xuXG5lZDI1NTE5LnNpZ24gPSBmdW5jdGlvbihvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICB2YXIgbXNnID0gbWVzc2FnZVRvTmF0aXZlQnVmZmVyKG9wdGlvbnMpO1xuICB2YXIgcHJpdmF0ZUtleSA9IG1lc3NhZ2VUb05hdGl2ZUJ1ZmZlcih7XG4gICAgbWVzc2FnZTogb3B0aW9ucy5wcml2YXRlS2V5LFxuICAgIGVuY29kaW5nOiAnYmluYXJ5J1xuICB9KTtcbiAgaWYocHJpdmF0ZUtleS5sZW5ndGggPT09IGVkMjU1MTkuY29uc3RhbnRzLlNFRURfQllURV9MRU5HVEgpIHtcbiAgICB2YXIga2V5UGFpciA9IGVkMjU1MTkuZ2VuZXJhdGVLZXlQYWlyKHtzZWVkOiBwcml2YXRlS2V5fSk7XG4gICAgcHJpdmF0ZUtleSA9IGtleVBhaXIucHJpdmF0ZUtleTtcbiAgfSBlbHNlIGlmKHByaXZhdGVLZXkubGVuZ3RoICE9PSBlZDI1NTE5LmNvbnN0YW50cy5QUklWQVRFX0tFWV9CWVRFX0xFTkdUSCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAnXCJvcHRpb25zLnByaXZhdGVLZXlcIiBtdXN0IGhhdmUgYSBieXRlIGxlbmd0aCBvZiAnICtcbiAgICAgIGVkMjU1MTkuY29uc3RhbnRzLlNFRURfQllURV9MRU5HVEggKyAnIG9yICcgK1xuICAgICAgZWQyNTUxOS5jb25zdGFudHMuUFJJVkFURV9LRVlfQllURV9MRU5HVEgpO1xuICB9XG5cbiAgdmFyIHNpZ25lZE1zZyA9IG5ldyBOYXRpdmVCdWZmZXIoXG4gICAgZWQyNTUxOS5jb25zdGFudHMuU0lHTl9CWVRFX0xFTkdUSCArIG1zZy5sZW5ndGgpO1xuICBjcnlwdG9fc2lnbihzaWduZWRNc2csIG1zZywgbXNnLmxlbmd0aCwgcHJpdmF0ZUtleSk7XG5cbiAgdmFyIHNpZyA9IG5ldyBOYXRpdmVCdWZmZXIoZWQyNTUxOS5jb25zdGFudHMuU0lHTl9CWVRFX0xFTkdUSCk7XG4gIGZvcih2YXIgaSA9IDA7IGkgPCBzaWcubGVuZ3RoOyArK2kpIHtcbiAgICBzaWdbaV0gPSBzaWduZWRNc2dbaV07XG4gIH1cbiAgcmV0dXJuIHNpZztcbn07XG5cbmVkMjU1MTkudmVyaWZ5ID0gZnVuY3Rpb24ob3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgdmFyIG1zZyA9IG1lc3NhZ2VUb05hdGl2ZUJ1ZmZlcihvcHRpb25zKTtcbiAgaWYob3B0aW9ucy5zaWduYXR1cmUgPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAnXCJvcHRpb25zLnNpZ25hdHVyZVwiIG11c3QgYmUgYSBub2RlLmpzIEJ1ZmZlciwgYSBVaW50OEFycmF5LCBhIGZvcmdlICcgK1xuICAgICAgJ0J5dGVCdWZmZXIsIG9yIGEgYmluYXJ5IHN0cmluZy4nKTtcbiAgfVxuICB2YXIgc2lnID0gbWVzc2FnZVRvTmF0aXZlQnVmZmVyKHtcbiAgICBtZXNzYWdlOiBvcHRpb25zLnNpZ25hdHVyZSxcbiAgICBlbmNvZGluZzogJ2JpbmFyeSdcbiAgfSk7XG4gIGlmKHNpZy5sZW5ndGggIT09IGVkMjU1MTkuY29uc3RhbnRzLlNJR05fQllURV9MRU5HVEgpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgJ1wib3B0aW9ucy5zaWduYXR1cmVcIiBtdXN0IGhhdmUgYSBieXRlIGxlbmd0aCBvZiAnICtcbiAgICAgIGVkMjU1MTkuY29uc3RhbnRzLlNJR05fQllURV9MRU5HVEgpO1xuICB9XG4gIHZhciBwdWJsaWNLZXkgPSBtZXNzYWdlVG9OYXRpdmVCdWZmZXIoe1xuICAgIG1lc3NhZ2U6IG9wdGlvbnMucHVibGljS2V5LFxuICAgIGVuY29kaW5nOiAnYmluYXJ5J1xuICB9KTtcbiAgaWYocHVibGljS2V5Lmxlbmd0aCAhPT0gZWQyNTUxOS5jb25zdGFudHMuUFVCTElDX0tFWV9CWVRFX0xFTkdUSCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAnXCJvcHRpb25zLnB1YmxpY0tleVwiIG11c3QgaGF2ZSBhIGJ5dGUgbGVuZ3RoIG9mICcgK1xuICAgICAgZWQyNTUxOS5jb25zdGFudHMuUFVCTElDX0tFWV9CWVRFX0xFTkdUSCk7XG4gIH1cblxuICB2YXIgc20gPSBuZXcgTmF0aXZlQnVmZmVyKGVkMjU1MTkuY29uc3RhbnRzLlNJR05fQllURV9MRU5HVEggKyBtc2cubGVuZ3RoKTtcbiAgdmFyIG0gPSBuZXcgTmF0aXZlQnVmZmVyKGVkMjU1MTkuY29uc3RhbnRzLlNJR05fQllURV9MRU5HVEggKyBtc2cubGVuZ3RoKTtcbiAgdmFyIGk7XG4gIGZvcihpID0gMDsgaSA8IGVkMjU1MTkuY29uc3RhbnRzLlNJR05fQllURV9MRU5HVEg7ICsraSkge1xuICAgIHNtW2ldID0gc2lnW2ldO1xuICB9XG4gIGZvcihpID0gMDsgaSA8IG1zZy5sZW5ndGg7ICsraSkge1xuICAgIHNtW2kgKyBlZDI1NTE5LmNvbnN0YW50cy5TSUdOX0JZVEVfTEVOR1RIXSA9IG1zZ1tpXTtcbiAgfVxuICByZXR1cm4gKGNyeXB0b19zaWduX29wZW4obSwgc20sIHNtLmxlbmd0aCwgcHVibGljS2V5KSA+PSAwKTtcbn07XG5cbmZ1bmN0aW9uIG1lc3NhZ2VUb05hdGl2ZUJ1ZmZlcihvcHRpb25zKSB7XG4gIHZhciBtZXNzYWdlID0gb3B0aW9ucy5tZXNzYWdlO1xuICBpZihtZXNzYWdlIGluc3RhbmNlb2YgVWludDhBcnJheSB8fCBtZXNzYWdlIGluc3RhbmNlb2YgTmF0aXZlQnVmZmVyKSB7XG4gICAgcmV0dXJuIG1lc3NhZ2U7XG4gIH1cblxuICB2YXIgZW5jb2RpbmcgPSBvcHRpb25zLmVuY29kaW5nO1xuICBpZihtZXNzYWdlID09PSB1bmRlZmluZWQpIHtcbiAgICBpZihvcHRpb25zLm1kKSB7XG4gICAgICAvLyBUT0RPOiBtb3JlIHJpZ29yb3VzIHZhbGlkYXRpb24gdGhhdCBgbWRgIGlzIGEgTWVzc2FnZURpZ2VzdFxuICAgICAgbWVzc2FnZSA9IG9wdGlvbnMubWQuZGlnZXN0KCkuZ2V0Qnl0ZXMoKTtcbiAgICAgIGVuY29kaW5nID0gJ2JpbmFyeSc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wib3B0aW9ucy5tZXNzYWdlXCIgb3IgXCJvcHRpb25zLm1kXCIgbm90IHNwZWNpZmllZC4nKTtcbiAgICB9XG4gIH1cblxuICBpZih0eXBlb2YgbWVzc2FnZSA9PT0gJ3N0cmluZycgJiYgIWVuY29kaW5nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJvcHRpb25zLmVuY29kaW5nXCIgbXVzdCBiZSBcImJpbmFyeVwiIG9yIFwidXRmOFwiLicpO1xuICB9XG5cbiAgaWYodHlwZW9mIG1lc3NhZ2UgPT09ICdzdHJpbmcnKSB7XG4gICAgaWYodHlwZW9mIEJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybiBCdWZmZXIuZnJvbShtZXNzYWdlLCBlbmNvZGluZyk7XG4gICAgfVxuICAgIG1lc3NhZ2UgPSBuZXcgQnl0ZUJ1ZmZlcihtZXNzYWdlLCBlbmNvZGluZyk7XG4gIH0gZWxzZSBpZighKG1lc3NhZ2UgaW5zdGFuY2VvZiBCeXRlQnVmZmVyKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAnXCJvcHRpb25zLm1lc3NhZ2VcIiBtdXN0IGJlIGEgbm9kZS5qcyBCdWZmZXIsIGEgVWludDhBcnJheSwgYSBmb3JnZSAnICtcbiAgICAgICdCeXRlQnVmZmVyLCBvciBhIHN0cmluZyB3aXRoIFwib3B0aW9ucy5lbmNvZGluZ1wiIHNwZWNpZnlpbmcgaXRzICcgK1xuICAgICAgJ2VuY29kaW5nLicpO1xuICB9XG5cbiAgLy8gY29udmVydCB0byBuYXRpdmUgYnVmZmVyXG4gIHZhciBidWZmZXIgPSBuZXcgTmF0aXZlQnVmZmVyKG1lc3NhZ2UubGVuZ3RoKCkpO1xuICBmb3IodmFyIGkgPSAwOyBpIDwgYnVmZmVyLmxlbmd0aDsgKytpKSB7XG4gICAgYnVmZmVyW2ldID0gbWVzc2FnZS5hdChpKTtcbiAgfVxuICByZXR1cm4gYnVmZmVyO1xufVxuXG52YXIgZ2YwID0gZ2YoKTtcbnZhciBnZjEgPSBnZihbMV0pO1xudmFyIEQgPSBnZihbXG4gIDB4NzhhMywgMHgxMzU5LCAweDRkY2EsIDB4NzVlYiwgMHhkOGFiLCAweDQxNDEsIDB4MGE0ZCwgMHgwMDcwLFxuICAweGU4OTgsIDB4Nzc3OSwgMHg0MDc5LCAweDhjYzcsIDB4ZmU3MywgMHgyYjZmLCAweDZjZWUsIDB4NTIwM10pO1xudmFyIEQyID0gZ2YoW1xuICAweGYxNTksIDB4MjZiMiwgMHg5Yjk0LCAweGViZDYsIDB4YjE1NiwgMHg4MjgzLCAweDE0OWEsIDB4MDBlMCxcbiAgMHhkMTMwLCAweGVlZjMsIDB4ODBmMiwgMHgxOThlLCAweGZjZTcsIDB4NTZkZiwgMHhkOWRjLCAweDI0MDZdKTtcbnZhciBYID0gZ2YoW1xuICAweGQ1MWEsIDB4OGYyNSwgMHgyZDYwLCAweGM5NTYsIDB4YTdiMiwgMHg5NTI1LCAweGM3NjAsIDB4NjkyYyxcbiAgMHhkYzVjLCAweGZkZDYsIDB4ZTIzMSwgMHhjMGE0LCAweDUzZmUsIDB4Y2Q2ZSwgMHgzNmQzLCAweDIxNjldKTtcbnZhciBZID0gZ2YoW1xuICAweDY2NTgsIDB4NjY2NiwgMHg2NjY2LCAweDY2NjYsIDB4NjY2NiwgMHg2NjY2LCAweDY2NjYsIDB4NjY2NixcbiAgMHg2NjY2LCAweDY2NjYsIDB4NjY2NiwgMHg2NjY2LCAweDY2NjYsIDB4NjY2NiwgMHg2NjY2LCAweDY2NjZdKTtcbnZhciBMID0gbmV3IEZsb2F0NjRBcnJheShbXG4gIDB4ZWQsIDB4ZDMsIDB4ZjUsIDB4NWMsIDB4MWEsIDB4NjMsIDB4MTIsIDB4NTgsXG4gIDB4ZDYsIDB4OWMsIDB4ZjcsIDB4YTIsIDB4ZGUsIDB4ZjksIDB4ZGUsIDB4MTQsXG4gIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB4MTBdKTtcbnZhciBJID0gZ2YoW1xuICAweGEwYjAsIDB4NGEwZSwgMHgxYjI3LCAweGM0ZWUsIDB4ZTQ3OCwgMHhhZDJmLCAweDE4MDYsIDB4MmY0MyxcbiAgMHhkN2E3LCAweDNkZmIsIDB4MDA5OSwgMHgyYjRkLCAweGRmMGIsIDB4NGZjMSwgMHgyNDgwLCAweDJiODNdKTtcblxuLy8gVE9ETzogdXBkYXRlIGZvcmdlIGJ1ZmZlciBpbXBsZW1lbnRhdGlvbiB0byB1c2UgYEJ1ZmZlcmAgb3IgYFVpbnQ4QXJyYXlgLFxuLy8gd2hpY2hldmVyIGlzIGF2YWlsYWJsZSwgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZVxuZnVuY3Rpb24gc2hhNTEyKG1zZywgbXNnTGVuKSB7XG4gIC8vIE5vdGU6IGBvdXRgIGFuZCBgbXNnYCBhcmUgTmF0aXZlQnVmZmVyXG4gIHZhciBtZCA9IGZvcmdlLm1kLnNoYTUxMi5jcmVhdGUoKTtcbiAgdmFyIGJ1ZmZlciA9IG5ldyBCeXRlQnVmZmVyKG1zZyk7XG4gIG1kLnVwZGF0ZShidWZmZXIuZ2V0Qnl0ZXMobXNnTGVuKSwgJ2JpbmFyeScpO1xuICB2YXIgaGFzaCA9IG1kLmRpZ2VzdCgpLmdldEJ5dGVzKCk7XG4gIGlmKHR5cGVvZiBCdWZmZXIgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKGhhc2gsICdiaW5hcnknKTtcbiAgfVxuICB2YXIgb3V0ID0gbmV3IE5hdGl2ZUJ1ZmZlcihlZDI1NTE5LmNvbnN0YW50cy5IQVNIX0JZVEVfTEVOR1RIKTtcbiAgZm9yKHZhciBpID0gMDsgaSA8IDY0OyArK2kpIHtcbiAgICBvdXRbaV0gPSBoYXNoLmNoYXJDb2RlQXQoaSk7XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cblxuZnVuY3Rpb24gY3J5cHRvX3NpZ25fa2V5cGFpcihwaywgc2spIHtcbiAgdmFyIHAgPSBbZ2YoKSwgZ2YoKSwgZ2YoKSwgZ2YoKV07XG4gIHZhciBpO1xuXG4gIHZhciBkID0gc2hhNTEyKHNrLCAzMik7XG4gIGRbMF0gJj0gMjQ4O1xuICBkWzMxXSAmPSAxMjc7XG4gIGRbMzFdIHw9IDY0O1xuXG4gIHNjYWxhcmJhc2UocCwgZCk7XG4gIHBhY2socGssIHApO1xuXG4gIGZvcihpID0gMDsgaSA8IDMyOyArK2kpIHtcbiAgICBza1tpICsgMzJdID0gcGtbaV07XG4gIH1cbiAgcmV0dXJuIDA7XG59XG5cbi8vIE5vdGU6IGRpZmZlcmVuY2UgZnJvbSBDIC0gc21sZW4gcmV0dXJuZWQsIG5vdCBwYXNzZWQgYXMgYXJndW1lbnQuXG5mdW5jdGlvbiBjcnlwdG9fc2lnbihzbSwgbSwgbiwgc2spIHtcbiAgdmFyIGksIGosIHggPSBuZXcgRmxvYXQ2NEFycmF5KDY0KTtcbiAgdmFyIHAgPSBbZ2YoKSwgZ2YoKSwgZ2YoKSwgZ2YoKV07XG5cbiAgdmFyIGQgPSBzaGE1MTIoc2ssIDMyKTtcbiAgZFswXSAmPSAyNDg7XG4gIGRbMzFdICY9IDEyNztcbiAgZFszMV0gfD0gNjQ7XG5cbiAgdmFyIHNtbGVuID0gbiArIDY0O1xuICBmb3IoaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICBzbVs2NCArIGldID0gbVtpXTtcbiAgfVxuICBmb3IoaSA9IDA7IGkgPCAzMjsgKytpKSB7XG4gICAgc21bMzIgKyBpXSA9IGRbMzIgKyBpXTtcbiAgfVxuXG4gIHZhciByID0gc2hhNTEyKHNtLnN1YmFycmF5KDMyKSwgbiArIDMyKTtcbiAgcmVkdWNlKHIpO1xuICBzY2FsYXJiYXNlKHAsIHIpO1xuICBwYWNrKHNtLCBwKTtcblxuICBmb3IoaSA9IDMyOyBpIDwgNjQ7ICsraSkge1xuICAgIHNtW2ldID0gc2tbaV07XG4gIH1cbiAgdmFyIGggPSBzaGE1MTIoc20sIG4gKyA2NCk7XG4gIHJlZHVjZShoKTtcblxuICBmb3IoaSA9IDMyOyBpIDwgNjQ7ICsraSkge1xuICAgIHhbaV0gPSAwO1xuICB9XG4gIGZvcihpID0gMDsgaSA8IDMyOyArK2kpIHtcbiAgICB4W2ldID0gcltpXTtcbiAgfVxuICBmb3IoaSA9IDA7IGkgPCAzMjsgKytpKSB7XG4gICAgZm9yKGogPSAwOyBqIDwgMzI7IGorKykge1xuICAgICAgeFtpICsgal0gKz0gaFtpXSAqIGRbal07XG4gICAgfVxuICB9XG5cbiAgbW9kTChzbS5zdWJhcnJheSgzMiksIHgpO1xuICByZXR1cm4gc21sZW47XG59XG5cbmZ1bmN0aW9uIGNyeXB0b19zaWduX29wZW4obSwgc20sIG4sIHBrKSB7XG4gIHZhciBpLCBtbGVuO1xuICB2YXIgdCA9IG5ldyBOYXRpdmVCdWZmZXIoMzIpO1xuICB2YXIgcCA9IFtnZigpLCBnZigpLCBnZigpLCBnZigpXSxcbiAgICAgIHEgPSBbZ2YoKSwgZ2YoKSwgZ2YoKSwgZ2YoKV07XG5cbiAgbWxlbiA9IC0xO1xuICBpZihuIDwgNjQpIHtcbiAgICByZXR1cm4gLTE7XG4gIH1cblxuICBpZih1bnBhY2tuZWcocSwgcGspKSB7XG4gICAgcmV0dXJuIC0xO1xuICB9XG5cbiAgZm9yKGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgbVtpXSA9IHNtW2ldO1xuICB9XG4gIGZvcihpID0gMDsgaSA8IDMyOyArK2kpIHtcbiAgICBtW2kgKyAzMl0gPSBwa1tpXTtcbiAgfVxuICB2YXIgaCA9IHNoYTUxMihtLCBuKTtcbiAgcmVkdWNlKGgpO1xuICBzY2FsYXJtdWx0KHAsIHEsIGgpO1xuXG4gIHNjYWxhcmJhc2UocSwgc20uc3ViYXJyYXkoMzIpKTtcbiAgYWRkKHAsIHEpO1xuICBwYWNrKHQsIHApO1xuXG4gIG4gLT0gNjQ7XG4gIGlmKGNyeXB0b192ZXJpZnlfMzIoc20sIDAsIHQsIDApKSB7XG4gICAgZm9yKGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBtW2ldID0gMDtcbiAgICB9XG4gICAgcmV0dXJuIC0xO1xuICB9XG5cbiAgZm9yKGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgbVtpXSA9IHNtW2kgKyA2NF07XG4gIH1cbiAgbWxlbiA9IG47XG4gIHJldHVybiBtbGVuO1xufVxuXG5mdW5jdGlvbiBtb2RMKHIsIHgpIHtcbiAgdmFyIGNhcnJ5LCBpLCBqLCBrO1xuICBmb3IoaSA9IDYzOyBpID49IDMyOyAtLWkpIHtcbiAgICBjYXJyeSA9IDA7XG4gICAgZm9yKGogPSBpIC0gMzIsIGsgPSBpIC0gMTI7IGogPCBrOyArK2opIHtcbiAgICAgIHhbal0gKz0gY2FycnkgLSAxNiAqIHhbaV0gKiBMW2ogLSAoaSAtIDMyKV07XG4gICAgICBjYXJyeSA9ICh4W2pdICsgMTI4KSA+PiA4O1xuICAgICAgeFtqXSAtPSBjYXJyeSAqIDI1NjtcbiAgICB9XG4gICAgeFtqXSArPSBjYXJyeTtcbiAgICB4W2ldID0gMDtcbiAgfVxuICBjYXJyeSA9IDA7XG4gIGZvcihqID0gMDsgaiA8IDMyOyArK2opIHtcbiAgICB4W2pdICs9IGNhcnJ5IC0gKHhbMzFdID4+IDQpICogTFtqXTtcbiAgICBjYXJyeSA9IHhbal0gPj4gODtcbiAgICB4W2pdICY9IDI1NTtcbiAgfVxuICBmb3IoaiA9IDA7IGogPCAzMjsgKytqKSB7XG4gICAgeFtqXSAtPSBjYXJyeSAqIExbal07XG4gIH1cbiAgZm9yKGkgPSAwOyBpIDwgMzI7ICsraSkge1xuICAgIHhbaSArIDFdICs9IHhbaV0gPj4gODtcbiAgICByW2ldID0geFtpXSAmIDI1NTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZWR1Y2Uocikge1xuICB2YXIgeCA9IG5ldyBGbG9hdDY0QXJyYXkoNjQpO1xuICBmb3IodmFyIGkgPSAwOyBpIDwgNjQ7ICsraSkge1xuICAgIHhbaV0gPSByW2ldO1xuICAgIHJbaV0gPSAwO1xuICB9XG4gIG1vZEwociwgeCk7XG59XG5cbmZ1bmN0aW9uIGFkZChwLCBxKSB7XG4gIHZhciBhID0gZ2YoKSwgYiA9IGdmKCksIGMgPSBnZigpLFxuICAgICAgZCA9IGdmKCksIGUgPSBnZigpLCBmID0gZ2YoKSxcbiAgICAgIGcgPSBnZigpLCBoID0gZ2YoKSwgdCA9IGdmKCk7XG5cbiAgWihhLCBwWzFdLCBwWzBdKTtcbiAgWih0LCBxWzFdLCBxWzBdKTtcbiAgTShhLCBhLCB0KTtcbiAgQShiLCBwWzBdLCBwWzFdKTtcbiAgQSh0LCBxWzBdLCBxWzFdKTtcbiAgTShiLCBiLCB0KTtcbiAgTShjLCBwWzNdLCBxWzNdKTtcbiAgTShjLCBjLCBEMik7XG4gIE0oZCwgcFsyXSwgcVsyXSk7XG4gIEEoZCwgZCwgZCk7XG4gIFooZSwgYiwgYSk7XG4gIFooZiwgZCwgYyk7XG4gIEEoZywgZCwgYyk7XG4gIEEoaCwgYiwgYSk7XG5cbiAgTShwWzBdLCBlLCBmKTtcbiAgTShwWzFdLCBoLCBnKTtcbiAgTShwWzJdLCBnLCBmKTtcbiAgTShwWzNdLCBlLCBoKTtcbn1cblxuZnVuY3Rpb24gY3N3YXAocCwgcSwgYikge1xuICBmb3IodmFyIGkgPSAwOyBpIDwgNDsgKytpKSB7XG4gICAgc2VsMjU1MTkocFtpXSwgcVtpXSwgYik7XG4gIH1cbn1cblxuZnVuY3Rpb24gcGFjayhyLCBwKSB7XG4gIHZhciB0eCA9IGdmKCksIHR5ID0gZ2YoKSwgemkgPSBnZigpO1xuICBpbnYyNTUxOSh6aSwgcFsyXSk7XG4gIE0odHgsIHBbMF0sIHppKTtcbiAgTSh0eSwgcFsxXSwgemkpO1xuICBwYWNrMjU1MTkociwgdHkpO1xuICByWzMxXSBePSBwYXIyNTUxOSh0eCkgPDwgNztcbn1cblxuZnVuY3Rpb24gcGFjazI1NTE5KG8sIG4pIHtcbiAgdmFyIGksIGosIGI7XG4gIHZhciBtID0gZ2YoKSwgdCA9IGdmKCk7XG4gIGZvcihpID0gMDsgaSA8IDE2OyArK2kpIHtcbiAgICB0W2ldID0gbltpXTtcbiAgfVxuICBjYXIyNTUxOSh0KTtcbiAgY2FyMjU1MTkodCk7XG4gIGNhcjI1NTE5KHQpO1xuICBmb3IoaiA9IDA7IGogPCAyOyArK2opIHtcbiAgICBtWzBdID0gdFswXSAtIDB4ZmZlZDtcbiAgICBmb3IoaSA9IDE7IGkgPCAxNTsgKytpKSB7XG4gICAgICBtW2ldID0gdFtpXSAtIDB4ZmZmZiAtICgobVtpIC0gMV0gPj4gMTYpICYgMSk7XG4gICAgICBtW2ktMV0gJj0gMHhmZmZmO1xuICAgIH1cbiAgICBtWzE1XSA9IHRbMTVdIC0gMHg3ZmZmIC0gKChtWzE0XSA+PiAxNikgJiAxKTtcbiAgICBiID0gKG1bMTVdID4+IDE2KSAmIDE7XG4gICAgbVsxNF0gJj0gMHhmZmZmO1xuICAgIHNlbDI1NTE5KHQsIG0sIDEgLSBiKTtcbiAgfVxuICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykge1xuICAgIG9bMiAqIGldID0gdFtpXSAmIDB4ZmY7XG4gICAgb1syICogaSArIDFdID0gdFtpXSA+PiA4O1xuICB9XG59XG5cbmZ1bmN0aW9uIHVucGFja25lZyhyLCBwKSB7XG4gIHZhciB0ID0gZ2YoKSwgY2hrID0gZ2YoKSwgbnVtID0gZ2YoKSxcbiAgICAgIGRlbiA9IGdmKCksIGRlbjIgPSBnZigpLCBkZW40ID0gZ2YoKSxcbiAgICAgIGRlbjYgPSBnZigpO1xuXG4gIHNldDI1NTE5KHJbMl0sIGdmMSk7XG4gIHVucGFjazI1NTE5KHJbMV0sIHApO1xuICBTKG51bSwgclsxXSk7XG4gIE0oZGVuLCBudW0sIEQpO1xuICBaKG51bSwgbnVtLCByWzJdKTtcbiAgQShkZW4sIHJbMl0sIGRlbik7XG5cbiAgUyhkZW4yLCBkZW4pO1xuICBTKGRlbjQsIGRlbjIpO1xuICBNKGRlbjYsIGRlbjQsIGRlbjIpO1xuICBNKHQsIGRlbjYsIG51bSk7XG4gIE0odCwgdCwgZGVuKTtcblxuICBwb3cyNTIzKHQsIHQpO1xuICBNKHQsIHQsIG51bSk7XG4gIE0odCwgdCwgZGVuKTtcbiAgTSh0LCB0LCBkZW4pO1xuICBNKHJbMF0sIHQsIGRlbik7XG5cbiAgUyhjaGssIHJbMF0pO1xuICBNKGNoaywgY2hrLCBkZW4pO1xuICBpZihuZXEyNTUxOShjaGssIG51bSkpIHtcbiAgICBNKHJbMF0sIHJbMF0sIEkpO1xuICB9XG5cbiAgUyhjaGssIHJbMF0pO1xuICBNKGNoaywgY2hrLCBkZW4pO1xuICBpZihuZXEyNTUxOShjaGssIG51bSkpIHtcbiAgICByZXR1cm4gLTE7XG4gIH1cblxuICBpZihwYXIyNTUxOShyWzBdKSA9PT0gKHBbMzFdID4+IDcpKSB7XG4gICAgWihyWzBdLCBnZjAsIHJbMF0pO1xuICB9XG5cbiAgTShyWzNdLCByWzBdLCByWzFdKTtcbiAgcmV0dXJuIDA7XG59XG5cbmZ1bmN0aW9uIHVucGFjazI1NTE5KG8sIG4pIHtcbiAgdmFyIGk7XG4gIGZvcihpID0gMDsgaSA8IDE2OyArK2kpIHtcbiAgICBvW2ldID0gblsyICogaV0gKyAoblsyICogaSArIDFdIDw8IDgpO1xuICB9XG4gIG9bMTVdICY9IDB4N2ZmZjtcbn1cblxuZnVuY3Rpb24gcG93MjUyMyhvLCBpKSB7XG4gIHZhciBjID0gZ2YoKTtcbiAgdmFyIGE7XG4gIGZvcihhID0gMDsgYSA8IDE2OyArK2EpIHtcbiAgICBjW2FdID0gaVthXTtcbiAgfVxuICBmb3IoYSA9IDI1MDsgYSA+PSAwOyAtLWEpIHtcbiAgICBTKGMsIGMpO1xuICAgIGlmKGEgIT09IDEpIHtcbiAgICAgIE0oYywgYywgaSk7XG4gICAgfVxuICB9XG4gIGZvcihhID0gMDsgYSA8IDE2OyArK2EpIHtcbiAgICBvW2FdID0gY1thXTtcbiAgfVxufVxuXG5mdW5jdGlvbiBuZXEyNTUxOShhLCBiKSB7XG4gIHZhciBjID0gbmV3IE5hdGl2ZUJ1ZmZlcigzMik7XG4gIHZhciBkID0gbmV3IE5hdGl2ZUJ1ZmZlcigzMik7XG4gIHBhY2syNTUxOShjLCBhKTtcbiAgcGFjazI1NTE5KGQsIGIpO1xuICByZXR1cm4gY3J5cHRvX3ZlcmlmeV8zMihjLCAwLCBkLCAwKTtcbn1cblxuZnVuY3Rpb24gY3J5cHRvX3ZlcmlmeV8zMih4LCB4aSwgeSwgeWkpIHtcbiAgcmV0dXJuIHZuKHgsIHhpLCB5LCB5aSwgMzIpO1xufVxuXG5mdW5jdGlvbiB2bih4LCB4aSwgeSwgeWksIG4pIHtcbiAgdmFyIGksIGQgPSAwO1xuICBmb3IoaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICBkIHw9IHhbeGkgKyBpXSBeIHlbeWkgKyBpXTtcbiAgfVxuICByZXR1cm4gKDEgJiAoKGQgLSAxKSA+Pj4gOCkpIC0gMTtcbn1cblxuZnVuY3Rpb24gcGFyMjU1MTkoYSkge1xuICB2YXIgZCA9IG5ldyBOYXRpdmVCdWZmZXIoMzIpO1xuICBwYWNrMjU1MTkoZCwgYSk7XG4gIHJldHVybiBkWzBdICYgMTtcbn1cblxuZnVuY3Rpb24gc2NhbGFybXVsdChwLCBxLCBzKSB7XG4gIHZhciBiLCBpO1xuICBzZXQyNTUxOShwWzBdLCBnZjApO1xuICBzZXQyNTUxOShwWzFdLCBnZjEpO1xuICBzZXQyNTUxOShwWzJdLCBnZjEpO1xuICBzZXQyNTUxOShwWzNdLCBnZjApO1xuICBmb3IoaSA9IDI1NTsgaSA+PSAwOyAtLWkpIHtcbiAgICBiID0gKHNbKGkgLyA4KXwwXSA+PiAoaSAmIDcpKSAmIDE7XG4gICAgY3N3YXAocCwgcSwgYik7XG4gICAgYWRkKHEsIHApO1xuICAgIGFkZChwLCBwKTtcbiAgICBjc3dhcChwLCBxLCBiKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzY2FsYXJiYXNlKHAsIHMpIHtcbiAgdmFyIHEgPSBbZ2YoKSwgZ2YoKSwgZ2YoKSwgZ2YoKV07XG4gIHNldDI1NTE5KHFbMF0sIFgpO1xuICBzZXQyNTUxOShxWzFdLCBZKTtcbiAgc2V0MjU1MTkocVsyXSwgZ2YxKTtcbiAgTShxWzNdLCBYLCBZKTtcbiAgc2NhbGFybXVsdChwLCBxLCBzKTtcbn1cblxuZnVuY3Rpb24gc2V0MjU1MTkociwgYSkge1xuICB2YXIgaTtcbiAgZm9yKGkgPSAwOyBpIDwgMTY7IGkrKykge1xuICAgIHJbaV0gPSBhW2ldIHwgMDtcbiAgfVxufVxuXG5mdW5jdGlvbiBpbnYyNTUxOShvLCBpKSB7XG4gIHZhciBjID0gZ2YoKTtcbiAgdmFyIGE7XG4gIGZvcihhID0gMDsgYSA8IDE2OyArK2EpIHtcbiAgICBjW2FdID0gaVthXTtcbiAgfVxuICBmb3IoYSA9IDI1MzsgYSA+PSAwOyAtLWEpIHtcbiAgICBTKGMsIGMpO1xuICAgIGlmKGEgIT09IDIgJiYgYSAhPT0gNCkge1xuICAgICAgTShjLCBjLCBpKTtcbiAgICB9XG4gIH1cbiAgZm9yKGEgPSAwOyBhIDwgMTY7ICsrYSkge1xuICAgIG9bYV0gPSBjW2FdO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNhcjI1NTE5KG8pIHtcbiAgdmFyIGksIHYsIGMgPSAxO1xuICBmb3IoaSA9IDA7IGkgPCAxNjsgKytpKSB7XG4gICAgdiA9IG9baV0gKyBjICsgNjU1MzU7XG4gICAgYyA9IE1hdGguZmxvb3IodiAvIDY1NTM2KTtcbiAgICBvW2ldID0gdiAtIGMgKiA2NTUzNjtcbiAgfVxuICBvWzBdICs9IGMgLSAxICsgMzcgKiAoYyAtIDEpO1xufVxuXG5mdW5jdGlvbiBzZWwyNTUxOShwLCBxLCBiKSB7XG4gIHZhciB0LCBjID0gfihiIC0gMSk7XG4gIGZvcih2YXIgaSA9IDA7IGkgPCAxNjsgKytpKSB7XG4gICAgdCA9IGMgJiAocFtpXSBeIHFbaV0pO1xuICAgIHBbaV0gXj0gdDtcbiAgICBxW2ldIF49IHQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2YoaW5pdCkge1xuICB2YXIgaSwgciA9IG5ldyBGbG9hdDY0QXJyYXkoMTYpO1xuICBpZihpbml0KSB7XG4gICAgZm9yKGkgPSAwOyBpIDwgaW5pdC5sZW5ndGg7ICsraSkge1xuICAgICAgcltpXSA9IGluaXRbaV07XG4gICAgfVxuICB9XG4gIHJldHVybiByO1xufVxuXG5mdW5jdGlvbiBBKG8sIGEsIGIpIHtcbiAgZm9yKHZhciBpID0gMDsgaSA8IDE2OyArK2kpIHtcbiAgICBvW2ldID0gYVtpXSArIGJbaV07XG4gIH1cbn1cblxuZnVuY3Rpb24gWihvLCBhLCBiKSB7XG4gIGZvcih2YXIgaSA9IDA7IGkgPCAxNjsgKytpKSB7XG4gICAgb1tpXSA9IGFbaV0gLSBiW2ldO1xuICB9XG59XG5cbmZ1bmN0aW9uIFMobywgYSkge1xuICBNKG8sIGEsIGEpO1xufVxuXG5mdW5jdGlvbiBNKG8sIGEsIGIpIHtcbiAgdmFyIHYsIGMsXG4gICAgIHQwID0gMCwgIHQxID0gMCwgIHQyID0gMCwgIHQzID0gMCwgIHQ0ID0gMCwgIHQ1ID0gMCwgIHQ2ID0gMCwgIHQ3ID0gMCxcbiAgICAgdDggPSAwLCAgdDkgPSAwLCB0MTAgPSAwLCB0MTEgPSAwLCB0MTIgPSAwLCB0MTMgPSAwLCB0MTQgPSAwLCB0MTUgPSAwLFxuICAgIHQxNiA9IDAsIHQxNyA9IDAsIHQxOCA9IDAsIHQxOSA9IDAsIHQyMCA9IDAsIHQyMSA9IDAsIHQyMiA9IDAsIHQyMyA9IDAsXG4gICAgdDI0ID0gMCwgdDI1ID0gMCwgdDI2ID0gMCwgdDI3ID0gMCwgdDI4ID0gMCwgdDI5ID0gMCwgdDMwID0gMCxcbiAgICBiMCA9IGJbMF0sXG4gICAgYjEgPSBiWzFdLFxuICAgIGIyID0gYlsyXSxcbiAgICBiMyA9IGJbM10sXG4gICAgYjQgPSBiWzRdLFxuICAgIGI1ID0gYls1XSxcbiAgICBiNiA9IGJbNl0sXG4gICAgYjcgPSBiWzddLFxuICAgIGI4ID0gYls4XSxcbiAgICBiOSA9IGJbOV0sXG4gICAgYjEwID0gYlsxMF0sXG4gICAgYjExID0gYlsxMV0sXG4gICAgYjEyID0gYlsxMl0sXG4gICAgYjEzID0gYlsxM10sXG4gICAgYjE0ID0gYlsxNF0sXG4gICAgYjE1ID0gYlsxNV07XG5cbiAgdiA9IGFbMF07XG4gIHQwICs9IHYgKiBiMDtcbiAgdDEgKz0gdiAqIGIxO1xuICB0MiArPSB2ICogYjI7XG4gIHQzICs9IHYgKiBiMztcbiAgdDQgKz0gdiAqIGI0O1xuICB0NSArPSB2ICogYjU7XG4gIHQ2ICs9IHYgKiBiNjtcbiAgdDcgKz0gdiAqIGI3O1xuICB0OCArPSB2ICogYjg7XG4gIHQ5ICs9IHYgKiBiOTtcbiAgdDEwICs9IHYgKiBiMTA7XG4gIHQxMSArPSB2ICogYjExO1xuICB0MTIgKz0gdiAqIGIxMjtcbiAgdDEzICs9IHYgKiBiMTM7XG4gIHQxNCArPSB2ICogYjE0O1xuICB0MTUgKz0gdiAqIGIxNTtcbiAgdiA9IGFbMV07XG4gIHQxICs9IHYgKiBiMDtcbiAgdDIgKz0gdiAqIGIxO1xuICB0MyArPSB2ICogYjI7XG4gIHQ0ICs9IHYgKiBiMztcbiAgdDUgKz0gdiAqIGI0O1xuICB0NiArPSB2ICogYjU7XG4gIHQ3ICs9IHYgKiBiNjtcbiAgdDggKz0gdiAqIGI3O1xuICB0OSArPSB2ICogYjg7XG4gIHQxMCArPSB2ICogYjk7XG4gIHQxMSArPSB2ICogYjEwO1xuICB0MTIgKz0gdiAqIGIxMTtcbiAgdDEzICs9IHYgKiBiMTI7XG4gIHQxNCArPSB2ICogYjEzO1xuICB0MTUgKz0gdiAqIGIxNDtcbiAgdDE2ICs9IHYgKiBiMTU7XG4gIHYgPSBhWzJdO1xuICB0MiArPSB2ICogYjA7XG4gIHQzICs9IHYgKiBiMTtcbiAgdDQgKz0gdiAqIGIyO1xuICB0NSArPSB2ICogYjM7XG4gIHQ2ICs9IHYgKiBiNDtcbiAgdDcgKz0gdiAqIGI1O1xuICB0OCArPSB2ICogYjY7XG4gIHQ5ICs9IHYgKiBiNztcbiAgdDEwICs9IHYgKiBiODtcbiAgdDExICs9IHYgKiBiOTtcbiAgdDEyICs9IHYgKiBiMTA7XG4gIHQxMyArPSB2ICogYjExO1xuICB0MTQgKz0gdiAqIGIxMjtcbiAgdDE1ICs9IHYgKiBiMTM7XG4gIHQxNiArPSB2ICogYjE0O1xuICB0MTcgKz0gdiAqIGIxNTtcbiAgdiA9IGFbM107XG4gIHQzICs9IHYgKiBiMDtcbiAgdDQgKz0gdiAqIGIxO1xuICB0NSArPSB2ICogYjI7XG4gIHQ2ICs9IHYgKiBiMztcbiAgdDcgKz0gdiAqIGI0O1xuICB0OCArPSB2ICogYjU7XG4gIHQ5ICs9IHYgKiBiNjtcbiAgdDEwICs9IHYgKiBiNztcbiAgdDExICs9IHYgKiBiODtcbiAgdDEyICs9IHYgKiBiOTtcbiAgdDEzICs9IHYgKiBiMTA7XG4gIHQxNCArPSB2ICogYjExO1xuICB0MTUgKz0gdiAqIGIxMjtcbiAgdDE2ICs9IHYgKiBiMTM7XG4gIHQxNyArPSB2ICogYjE0O1xuICB0MTggKz0gdiAqIGIxNTtcbiAgdiA9IGFbNF07XG4gIHQ0ICs9IHYgKiBiMDtcbiAgdDUgKz0gdiAqIGIxO1xuICB0NiArPSB2ICogYjI7XG4gIHQ3ICs9IHYgKiBiMztcbiAgdDggKz0gdiAqIGI0O1xuICB0OSArPSB2ICogYjU7XG4gIHQxMCArPSB2ICogYjY7XG4gIHQxMSArPSB2ICogYjc7XG4gIHQxMiArPSB2ICogYjg7XG4gIHQxMyArPSB2ICogYjk7XG4gIHQxNCArPSB2ICogYjEwO1xuICB0MTUgKz0gdiAqIGIxMTtcbiAgdDE2ICs9IHYgKiBiMTI7XG4gIHQxNyArPSB2ICogYjEzO1xuICB0MTggKz0gdiAqIGIxNDtcbiAgdDE5ICs9IHYgKiBiMTU7XG4gIHYgPSBhWzVdO1xuICB0NSArPSB2ICogYjA7XG4gIHQ2ICs9IHYgKiBiMTtcbiAgdDcgKz0gdiAqIGIyO1xuICB0OCArPSB2ICogYjM7XG4gIHQ5ICs9IHYgKiBiNDtcbiAgdDEwICs9IHYgKiBiNTtcbiAgdDExICs9IHYgKiBiNjtcbiAgdDEyICs9IHYgKiBiNztcbiAgdDEzICs9IHYgKiBiODtcbiAgdDE0ICs9IHYgKiBiOTtcbiAgdDE1ICs9IHYgKiBiMTA7XG4gIHQxNiArPSB2ICogYjExO1xuICB0MTcgKz0gdiAqIGIxMjtcbiAgdDE4ICs9IHYgKiBiMTM7XG4gIHQxOSArPSB2ICogYjE0O1xuICB0MjAgKz0gdiAqIGIxNTtcbiAgdiA9IGFbNl07XG4gIHQ2ICs9IHYgKiBiMDtcbiAgdDcgKz0gdiAqIGIxO1xuICB0OCArPSB2ICogYjI7XG4gIHQ5ICs9IHYgKiBiMztcbiAgdDEwICs9IHYgKiBiNDtcbiAgdDExICs9IHYgKiBiNTtcbiAgdDEyICs9IHYgKiBiNjtcbiAgdDEzICs9IHYgKiBiNztcbiAgdDE0ICs9IHYgKiBiODtcbiAgdDE1ICs9IHYgKiBiOTtcbiAgdDE2ICs9IHYgKiBiMTA7XG4gIHQxNyArPSB2ICogYjExO1xuICB0MTggKz0gdiAqIGIxMjtcbiAgdDE5ICs9IHYgKiBiMTM7XG4gIHQyMCArPSB2ICogYjE0O1xuICB0MjEgKz0gdiAqIGIxNTtcbiAgdiA9IGFbN107XG4gIHQ3ICs9IHYgKiBiMDtcbiAgdDggKz0gdiAqIGIxO1xuICB0OSArPSB2ICogYjI7XG4gIHQxMCArPSB2ICogYjM7XG4gIHQxMSArPSB2ICogYjQ7XG4gIHQxMiArPSB2ICogYjU7XG4gIHQxMyArPSB2ICogYjY7XG4gIHQxNCArPSB2ICogYjc7XG4gIHQxNSArPSB2ICogYjg7XG4gIHQxNiArPSB2ICogYjk7XG4gIHQxNyArPSB2ICogYjEwO1xuICB0MTggKz0gdiAqIGIxMTtcbiAgdDE5ICs9IHYgKiBiMTI7XG4gIHQyMCArPSB2ICogYjEzO1xuICB0MjEgKz0gdiAqIGIxNDtcbiAgdDIyICs9IHYgKiBiMTU7XG4gIHYgPSBhWzhdO1xuICB0OCArPSB2ICogYjA7XG4gIHQ5ICs9IHYgKiBiMTtcbiAgdDEwICs9IHYgKiBiMjtcbiAgdDExICs9IHYgKiBiMztcbiAgdDEyICs9IHYgKiBiNDtcbiAgdDEzICs9IHYgKiBiNTtcbiAgdDE0ICs9IHYgKiBiNjtcbiAgdDE1ICs9IHYgKiBiNztcbiAgdDE2ICs9IHYgKiBiODtcbiAgdDE3ICs9IHYgKiBiOTtcbiAgdDE4ICs9IHYgKiBiMTA7XG4gIHQxOSArPSB2ICogYjExO1xuICB0MjAgKz0gdiAqIGIxMjtcbiAgdDIxICs9IHYgKiBiMTM7XG4gIHQyMiArPSB2ICogYjE0O1xuICB0MjMgKz0gdiAqIGIxNTtcbiAgdiA9IGFbOV07XG4gIHQ5ICs9IHYgKiBiMDtcbiAgdDEwICs9IHYgKiBiMTtcbiAgdDExICs9IHYgKiBiMjtcbiAgdDEyICs9IHYgKiBiMztcbiAgdDEzICs9IHYgKiBiNDtcbiAgdDE0ICs9IHYgKiBiNTtcbiAgdDE1ICs9IHYgKiBiNjtcbiAgdDE2ICs9IHYgKiBiNztcbiAgdDE3ICs9IHYgKiBiODtcbiAgdDE4ICs9IHYgKiBiOTtcbiAgdDE5ICs9IHYgKiBiMTA7XG4gIHQyMCArPSB2ICogYjExO1xuICB0MjEgKz0gdiAqIGIxMjtcbiAgdDIyICs9IHYgKiBiMTM7XG4gIHQyMyArPSB2ICogYjE0O1xuICB0MjQgKz0gdiAqIGIxNTtcbiAgdiA9IGFbMTBdO1xuICB0MTAgKz0gdiAqIGIwO1xuICB0MTEgKz0gdiAqIGIxO1xuICB0MTIgKz0gdiAqIGIyO1xuICB0MTMgKz0gdiAqIGIzO1xuICB0MTQgKz0gdiAqIGI0O1xuICB0MTUgKz0gdiAqIGI1O1xuICB0MTYgKz0gdiAqIGI2O1xuICB0MTcgKz0gdiAqIGI3O1xuICB0MTggKz0gdiAqIGI4O1xuICB0MTkgKz0gdiAqIGI5O1xuICB0MjAgKz0gdiAqIGIxMDtcbiAgdDIxICs9IHYgKiBiMTE7XG4gIHQyMiArPSB2ICogYjEyO1xuICB0MjMgKz0gdiAqIGIxMztcbiAgdDI0ICs9IHYgKiBiMTQ7XG4gIHQyNSArPSB2ICogYjE1O1xuICB2ID0gYVsxMV07XG4gIHQxMSArPSB2ICogYjA7XG4gIHQxMiArPSB2ICogYjE7XG4gIHQxMyArPSB2ICogYjI7XG4gIHQxNCArPSB2ICogYjM7XG4gIHQxNSArPSB2ICogYjQ7XG4gIHQxNiArPSB2ICogYjU7XG4gIHQxNyArPSB2ICogYjY7XG4gIHQxOCArPSB2ICogYjc7XG4gIHQxOSArPSB2ICogYjg7XG4gIHQyMCArPSB2ICogYjk7XG4gIHQyMSArPSB2ICogYjEwO1xuICB0MjIgKz0gdiAqIGIxMTtcbiAgdDIzICs9IHYgKiBiMTI7XG4gIHQyNCArPSB2ICogYjEzO1xuICB0MjUgKz0gdiAqIGIxNDtcbiAgdDI2ICs9IHYgKiBiMTU7XG4gIHYgPSBhWzEyXTtcbiAgdDEyICs9IHYgKiBiMDtcbiAgdDEzICs9IHYgKiBiMTtcbiAgdDE0ICs9IHYgKiBiMjtcbiAgdDE1ICs9IHYgKiBiMztcbiAgdDE2ICs9IHYgKiBiNDtcbiAgdDE3ICs9IHYgKiBiNTtcbiAgdDE4ICs9IHYgKiBiNjtcbiAgdDE5ICs9IHYgKiBiNztcbiAgdDIwICs9IHYgKiBiODtcbiAgdDIxICs9IHYgKiBiOTtcbiAgdDIyICs9IHYgKiBiMTA7XG4gIHQyMyArPSB2ICogYjExO1xuICB0MjQgKz0gdiAqIGIxMjtcbiAgdDI1ICs9IHYgKiBiMTM7XG4gIHQyNiArPSB2ICogYjE0O1xuICB0MjcgKz0gdiAqIGIxNTtcbiAgdiA9IGFbMTNdO1xuICB0MTMgKz0gdiAqIGIwO1xuICB0MTQgKz0gdiAqIGIxO1xuICB0MTUgKz0gdiAqIGIyO1xuICB0MTYgKz0gdiAqIGIzO1xuICB0MTcgKz0gdiAqIGI0O1xuICB0MTggKz0gdiAqIGI1O1xuICB0MTkgKz0gdiAqIGI2O1xuICB0MjAgKz0gdiAqIGI3O1xuICB0MjEgKz0gdiAqIGI4O1xuICB0MjIgKz0gdiAqIGI5O1xuICB0MjMgKz0gdiAqIGIxMDtcbiAgdDI0ICs9IHYgKiBiMTE7XG4gIHQyNSArPSB2ICogYjEyO1xuICB0MjYgKz0gdiAqIGIxMztcbiAgdDI3ICs9IHYgKiBiMTQ7XG4gIHQyOCArPSB2ICogYjE1O1xuICB2ID0gYVsxNF07XG4gIHQxNCArPSB2ICogYjA7XG4gIHQxNSArPSB2ICogYjE7XG4gIHQxNiArPSB2ICogYjI7XG4gIHQxNyArPSB2ICogYjM7XG4gIHQxOCArPSB2ICogYjQ7XG4gIHQxOSArPSB2ICogYjU7XG4gIHQyMCArPSB2ICogYjY7XG4gIHQyMSArPSB2ICogYjc7XG4gIHQyMiArPSB2ICogYjg7XG4gIHQyMyArPSB2ICogYjk7XG4gIHQyNCArPSB2ICogYjEwO1xuICB0MjUgKz0gdiAqIGIxMTtcbiAgdDI2ICs9IHYgKiBiMTI7XG4gIHQyNyArPSB2ICogYjEzO1xuICB0MjggKz0gdiAqIGIxNDtcbiAgdDI5ICs9IHYgKiBiMTU7XG4gIHYgPSBhWzE1XTtcbiAgdDE1ICs9IHYgKiBiMDtcbiAgdDE2ICs9IHYgKiBiMTtcbiAgdDE3ICs9IHYgKiBiMjtcbiAgdDE4ICs9IHYgKiBiMztcbiAgdDE5ICs9IHYgKiBiNDtcbiAgdDIwICs9IHYgKiBiNTtcbiAgdDIxICs9IHYgKiBiNjtcbiAgdDIyICs9IHYgKiBiNztcbiAgdDIzICs9IHYgKiBiODtcbiAgdDI0ICs9IHYgKiBiOTtcbiAgdDI1ICs9IHYgKiBiMTA7XG4gIHQyNiArPSB2ICogYjExO1xuICB0MjcgKz0gdiAqIGIxMjtcbiAgdDI4ICs9IHYgKiBiMTM7XG4gIHQyOSArPSB2ICogYjE0O1xuICB0MzAgKz0gdiAqIGIxNTtcblxuICB0MCAgKz0gMzggKiB0MTY7XG4gIHQxICArPSAzOCAqIHQxNztcbiAgdDIgICs9IDM4ICogdDE4O1xuICB0MyAgKz0gMzggKiB0MTk7XG4gIHQ0ICArPSAzOCAqIHQyMDtcbiAgdDUgICs9IDM4ICogdDIxO1xuICB0NiAgKz0gMzggKiB0MjI7XG4gIHQ3ICArPSAzOCAqIHQyMztcbiAgdDggICs9IDM4ICogdDI0O1xuICB0OSAgKz0gMzggKiB0MjU7XG4gIHQxMCArPSAzOCAqIHQyNjtcbiAgdDExICs9IDM4ICogdDI3O1xuICB0MTIgKz0gMzggKiB0Mjg7XG4gIHQxMyArPSAzOCAqIHQyOTtcbiAgdDE0ICs9IDM4ICogdDMwO1xuICAvLyB0MTUgbGVmdCBhcyBpc1xuXG4gIC8vIGZpcnN0IGNhclxuICBjID0gMTtcbiAgdiA9ICB0MCArIGMgKyA2NTUzNTsgYyA9IE1hdGguZmxvb3IodiAvIDY1NTM2KTsgIHQwID0gdiAtIGMgKiA2NTUzNjtcbiAgdiA9ICB0MSArIGMgKyA2NTUzNTsgYyA9IE1hdGguZmxvb3IodiAvIDY1NTM2KTsgIHQxID0gdiAtIGMgKiA2NTUzNjtcbiAgdiA9ICB0MiArIGMgKyA2NTUzNTsgYyA9IE1hdGguZmxvb3IodiAvIDY1NTM2KTsgIHQyID0gdiAtIGMgKiA2NTUzNjtcbiAgdiA9ICB0MyArIGMgKyA2NTUzNTsgYyA9IE1hdGguZmxvb3IodiAvIDY1NTM2KTsgIHQzID0gdiAtIGMgKiA2NTUzNjtcbiAgdiA9ICB0NCArIGMgKyA2NTUzNTsgYyA9IE1hdGguZmxvb3IodiAvIDY1NTM2KTsgIHQ0ID0gdiAtIGMgKiA2NTUzNjtcbiAgdiA9ICB0NSArIGMgKyA2NTUzNTsgYyA9IE1hdGguZmxvb3IodiAvIDY1NTM2KTsgIHQ1ID0gdiAtIGMgKiA2NTUzNjtcbiAgdiA9ICB0NiArIGMgKyA2NTUzNTsgYyA9IE1hdGguZmxvb3IodiAvIDY1NTM2KTsgIHQ2ID0gdiAtIGMgKiA2NTUzNjtcbiAgdiA9ICB0NyArIGMgKyA2NTUzNTsgYyA9IE1hdGguZmxvb3IodiAvIDY1NTM2KTsgIHQ3ID0gdiAtIGMgKiA2NTUzNjtcbiAgdiA9ICB0OCArIGMgKyA2NTUzNTsgYyA9IE1hdGguZmxvb3IodiAvIDY1NTM2KTsgIHQ4ID0gdiAtIGMgKiA2NTUzNjtcbiAgdiA9ICB0OSArIGMgKyA2NTUzNTsgYyA9IE1hdGguZmxvb3IodiAvIDY1NTM2KTsgIHQ5ID0gdiAtIGMgKiA2NTUzNjtcbiAgdiA9IHQxMCArIGMgKyA2NTUzNTsgYyA9IE1hdGguZmxvb3IodiAvIDY1NTM2KTsgdDEwID0gdiAtIGMgKiA2NTUzNjtcbiAgdiA9IHQxMSArIGMgKyA2NTUzNTsgYyA9IE1hdGguZmxvb3IodiAvIDY1NTM2KTsgdDExID0gdiAtIGMgKiA2NTUzNjtcbiAgdiA9IHQxMiArIGMgKyA2NTUzNTsgYyA9IE1hdGguZmxvb3IodiAvIDY1NTM2KTsgdDEyID0gdiAtIGMgKiA2NTUzNjtcbiAgdiA9IHQxMyArIGMgKyA2NTUzNTsgYyA9IE1hdGguZmxvb3IodiAvIDY1NTM2KTsgdDEzID0gdiAtIGMgKiA2NTUzNjtcbiAgdiA9IHQxNCArIGMgKyA2NTUzNTsgYyA9IE1hdGguZmxvb3IodiAvIDY1NTM2KTsgdDE0ID0gdiAtIGMgKiA2NTUzNjtcbiAgdiA9IHQxNSArIGMgKyA2NTUzNTsgYyA9IE1hdGguZmxvb3IodiAvIDY1NTM2KTsgdDE1ID0gdiAtIGMgKiA2NTUzNjtcbiAgdDAgKz0gYy0xICsgMzcgKiAoYy0xKTtcblxuICAvLyBzZWNvbmQgY2FyXG4gIGMgPSAxO1xuICB2ID0gIHQwICsgYyArIDY1NTM1OyBjID0gTWF0aC5mbG9vcih2IC8gNjU1MzYpOyAgdDAgPSB2IC0gYyAqIDY1NTM2O1xuICB2ID0gIHQxICsgYyArIDY1NTM1OyBjID0gTWF0aC5mbG9vcih2IC8gNjU1MzYpOyAgdDEgPSB2IC0gYyAqIDY1NTM2O1xuICB2ID0gIHQyICsgYyArIDY1NTM1OyBjID0gTWF0aC5mbG9vcih2IC8gNjU1MzYpOyAgdDIgPSB2IC0gYyAqIDY1NTM2O1xuICB2ID0gIHQzICsgYyArIDY1NTM1OyBjID0gTWF0aC5mbG9vcih2IC8gNjU1MzYpOyAgdDMgPSB2IC0gYyAqIDY1NTM2O1xuICB2ID0gIHQ0ICsgYyArIDY1NTM1OyBjID0gTWF0aC5mbG9vcih2IC8gNjU1MzYpOyAgdDQgPSB2IC0gYyAqIDY1NTM2O1xuICB2ID0gIHQ1ICsgYyArIDY1NTM1OyBjID0gTWF0aC5mbG9vcih2IC8gNjU1MzYpOyAgdDUgPSB2IC0gYyAqIDY1NTM2O1xuICB2ID0gIHQ2ICsgYyArIDY1NTM1OyBjID0gTWF0aC5mbG9vcih2IC8gNjU1MzYpOyAgdDYgPSB2IC0gYyAqIDY1NTM2O1xuICB2ID0gIHQ3ICsgYyArIDY1NTM1OyBjID0gTWF0aC5mbG9vcih2IC8gNjU1MzYpOyAgdDcgPSB2IC0gYyAqIDY1NTM2O1xuICB2ID0gIHQ4ICsgYyArIDY1NTM1OyBjID0gTWF0aC5mbG9vcih2IC8gNjU1MzYpOyAgdDggPSB2IC0gYyAqIDY1NTM2O1xuICB2ID0gIHQ5ICsgYyArIDY1NTM1OyBjID0gTWF0aC5mbG9vcih2IC8gNjU1MzYpOyAgdDkgPSB2IC0gYyAqIDY1NTM2O1xuICB2ID0gdDEwICsgYyArIDY1NTM1OyBjID0gTWF0aC5mbG9vcih2IC8gNjU1MzYpOyB0MTAgPSB2IC0gYyAqIDY1NTM2O1xuICB2ID0gdDExICsgYyArIDY1NTM1OyBjID0gTWF0aC5mbG9vcih2IC8gNjU1MzYpOyB0MTEgPSB2IC0gYyAqIDY1NTM2O1xuICB2ID0gdDEyICsgYyArIDY1NTM1OyBjID0gTWF0aC5mbG9vcih2IC8gNjU1MzYpOyB0MTIgPSB2IC0gYyAqIDY1NTM2O1xuICB2ID0gdDEzICsgYyArIDY1NTM1OyBjID0gTWF0aC5mbG9vcih2IC8gNjU1MzYpOyB0MTMgPSB2IC0gYyAqIDY1NTM2O1xuICB2ID0gdDE0ICsgYyArIDY1NTM1OyBjID0gTWF0aC5mbG9vcih2IC8gNjU1MzYpOyB0MTQgPSB2IC0gYyAqIDY1NTM2O1xuICB2ID0gdDE1ICsgYyArIDY1NTM1OyBjID0gTWF0aC5mbG9vcih2IC8gNjU1MzYpOyB0MTUgPSB2IC0gYyAqIDY1NTM2O1xuICB0MCArPSBjLTEgKyAzNyAqIChjLTEpO1xuXG4gIG9bIDBdID0gdDA7XG4gIG9bIDFdID0gdDE7XG4gIG9bIDJdID0gdDI7XG4gIG9bIDNdID0gdDM7XG4gIG9bIDRdID0gdDQ7XG4gIG9bIDVdID0gdDU7XG4gIG9bIDZdID0gdDY7XG4gIG9bIDddID0gdDc7XG4gIG9bIDhdID0gdDg7XG4gIG9bIDldID0gdDk7XG4gIG9bMTBdID0gdDEwO1xuICBvWzExXSA9IHQxMTtcbiAgb1sxMl0gPSB0MTI7XG4gIG9bMTNdID0gdDEzO1xuICBvWzE0XSA9IHQxNDtcbiAgb1sxNV0gPSB0MTU7XG59XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///240\n")},function(module,exports,__webpack_require__){eval("/**\n * Copyright (c) 2019 Digital Bazaar, Inc.\n */\n\nvar forge = __webpack_require__(4);\n__webpack_require__(14);\nvar asn1 = forge.asn1;\n\nexports.privateKeyValidator = {\n  // PrivateKeyInfo\n  name: 'PrivateKeyInfo',\n  tagClass: asn1.Class.UNIVERSAL,\n  type: asn1.Type.SEQUENCE,\n  constructed: true,\n  value: [{\n    // Version (INTEGER)\n    name: 'PrivateKeyInfo.version',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.INTEGER,\n    constructed: false,\n    capture: 'privateKeyVersion'\n  }, {\n    // privateKeyAlgorithm\n    name: 'PrivateKeyInfo.privateKeyAlgorithm',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.SEQUENCE,\n    constructed: true,\n    value: [{\n      name: 'AlgorithmIdentifier.algorithm',\n      tagClass: asn1.Class.UNIVERSAL,\n      type: asn1.Type.OID,\n      constructed: false,\n      capture: 'privateKeyOid'\n    }]\n  }, {\n    // PrivateKey\n    name: 'PrivateKeyInfo',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.OCTETSTRING,\n    constructed: false,\n    capture: 'privateKey'\n  }]\n};\n\nexports.publicKeyValidator = {\n  name: 'SubjectPublicKeyInfo',\n  tagClass: asn1.Class.UNIVERSAL,\n  type: asn1.Type.SEQUENCE,\n  constructed: true,\n  captureAsn1: 'subjectPublicKeyInfo',\n  value: [{\n    name: 'SubjectPublicKeyInfo.AlgorithmIdentifier',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.SEQUENCE,\n    constructed: true,\n    value: [{\n      name: 'AlgorithmIdentifier.algorithm',\n      tagClass: asn1.Class.UNIVERSAL,\n      type: asn1.Type.OID,\n      constructed: false,\n      capture: 'publicKeyOid'\n    }]\n  },\n  // capture group for ed25519PublicKey\n  {\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.BITSTRING,\n    constructed: false,\n    composed: true,\n    captureBitStringValue: 'ed25519PublicKey'\n  }\n  // FIXME: this is capture group for rsaPublicKey, use it in this API or\n  // discard?\n  /* {\n    // subjectPublicKey\n    name: 'SubjectPublicKeyInfo.subjectPublicKey',\n    tagClass: asn1.Class.UNIVERSAL,\n    type: asn1.Type.BITSTRING,\n    constructed: false,\n    value: [{\n      // RSAPublicKey\n      name: 'SubjectPublicKeyInfo.subjectPublicKey.RSAPublicKey',\n      tagClass: asn1.Class.UNIVERSAL,\n      type: asn1.Type.SEQUENCE,\n      constructed: true,\n      optional: true,\n      captureAsn1: 'rsaPublicKey'\n    }]\n  } */\n  ]\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjQxLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL25vZGUtZm9yZ2UvbGliL2FzbjEtdmFsaWRhdG9yLmpzPzMxYTkiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTkgRGlnaXRhbCBCYXphYXIsIEluYy5cbiAqL1xuXG52YXIgZm9yZ2UgPSByZXF1aXJlKCcuL2ZvcmdlJyk7XG5yZXF1aXJlKCcuL2FzbjEnKTtcbnZhciBhc24xID0gZm9yZ2UuYXNuMTtcblxuZXhwb3J0cy5wcml2YXRlS2V5VmFsaWRhdG9yID0ge1xuICAvLyBQcml2YXRlS2V5SW5mb1xuICBuYW1lOiAnUHJpdmF0ZUtleUluZm8nLFxuICB0YWdDbGFzczogYXNuMS5DbGFzcy5VTklWRVJTQUwsXG4gIHR5cGU6IGFzbjEuVHlwZS5TRVFVRU5DRSxcbiAgY29uc3RydWN0ZWQ6IHRydWUsXG4gIHZhbHVlOiBbe1xuICAgIC8vIFZlcnNpb24gKElOVEVHRVIpXG4gICAgbmFtZTogJ1ByaXZhdGVLZXlJbmZvLnZlcnNpb24nLFxuICAgIHRhZ0NsYXNzOiBhc24xLkNsYXNzLlVOSVZFUlNBTCxcbiAgICB0eXBlOiBhc24xLlR5cGUuSU5URUdFUixcbiAgICBjb25zdHJ1Y3RlZDogZmFsc2UsXG4gICAgY2FwdHVyZTogJ3ByaXZhdGVLZXlWZXJzaW9uJ1xuICB9LCB7XG4gICAgLy8gcHJpdmF0ZUtleUFsZ29yaXRobVxuICAgIG5hbWU6ICdQcml2YXRlS2V5SW5mby5wcml2YXRlS2V5QWxnb3JpdGhtJyxcbiAgICB0YWdDbGFzczogYXNuMS5DbGFzcy5VTklWRVJTQUwsXG4gICAgdHlwZTogYXNuMS5UeXBlLlNFUVVFTkNFLFxuICAgIGNvbnN0cnVjdGVkOiB0cnVlLFxuICAgIHZhbHVlOiBbe1xuICAgICAgbmFtZTogJ0FsZ29yaXRobUlkZW50aWZpZXIuYWxnb3JpdGhtJyxcbiAgICAgIHRhZ0NsYXNzOiBhc24xLkNsYXNzLlVOSVZFUlNBTCxcbiAgICAgIHR5cGU6IGFzbjEuVHlwZS5PSUQsXG4gICAgICBjb25zdHJ1Y3RlZDogZmFsc2UsXG4gICAgICBjYXB0dXJlOiAncHJpdmF0ZUtleU9pZCdcbiAgICB9XVxuICB9LCB7XG4gICAgLy8gUHJpdmF0ZUtleVxuICAgIG5hbWU6ICdQcml2YXRlS2V5SW5mbycsXG4gICAgdGFnQ2xhc3M6IGFzbjEuQ2xhc3MuVU5JVkVSU0FMLFxuICAgIHR5cGU6IGFzbjEuVHlwZS5PQ1RFVFNUUklORyxcbiAgICBjb25zdHJ1Y3RlZDogZmFsc2UsXG4gICAgY2FwdHVyZTogJ3ByaXZhdGVLZXknXG4gIH1dXG59O1xuXG5leHBvcnRzLnB1YmxpY0tleVZhbGlkYXRvciA9IHtcbiAgbmFtZTogJ1N1YmplY3RQdWJsaWNLZXlJbmZvJyxcbiAgdGFnQ2xhc3M6IGFzbjEuQ2xhc3MuVU5JVkVSU0FMLFxuICB0eXBlOiBhc24xLlR5cGUuU0VRVUVOQ0UsXG4gIGNvbnN0cnVjdGVkOiB0cnVlLFxuICBjYXB0dXJlQXNuMTogJ3N1YmplY3RQdWJsaWNLZXlJbmZvJyxcbiAgdmFsdWU6IFt7XG4gICAgbmFtZTogJ1N1YmplY3RQdWJsaWNLZXlJbmZvLkFsZ29yaXRobUlkZW50aWZpZXInLFxuICAgIHRhZ0NsYXNzOiBhc24xLkNsYXNzLlVOSVZFUlNBTCxcbiAgICB0eXBlOiBhc24xLlR5cGUuU0VRVUVOQ0UsXG4gICAgY29uc3RydWN0ZWQ6IHRydWUsXG4gICAgdmFsdWU6IFt7XG4gICAgICBuYW1lOiAnQWxnb3JpdGhtSWRlbnRpZmllci5hbGdvcml0aG0nLFxuICAgICAgdGFnQ2xhc3M6IGFzbjEuQ2xhc3MuVU5JVkVSU0FMLFxuICAgICAgdHlwZTogYXNuMS5UeXBlLk9JRCxcbiAgICAgIGNvbnN0cnVjdGVkOiBmYWxzZSxcbiAgICAgIGNhcHR1cmU6ICdwdWJsaWNLZXlPaWQnXG4gICAgfV1cbiAgfSxcbiAgLy8gY2FwdHVyZSBncm91cCBmb3IgZWQyNTUxOVB1YmxpY0tleVxuICB7XG4gICAgdGFnQ2xhc3M6IGFzbjEuQ2xhc3MuVU5JVkVSU0FMLFxuICAgIHR5cGU6IGFzbjEuVHlwZS5CSVRTVFJJTkcsXG4gICAgY29uc3RydWN0ZWQ6IGZhbHNlLFxuICAgIGNvbXBvc2VkOiB0cnVlLFxuICAgIGNhcHR1cmVCaXRTdHJpbmdWYWx1ZTogJ2VkMjU1MTlQdWJsaWNLZXknXG4gIH1cbiAgLy8gRklYTUU6IHRoaXMgaXMgY2FwdHVyZSBncm91cCBmb3IgcnNhUHVibGljS2V5LCB1c2UgaXQgaW4gdGhpcyBBUEkgb3JcbiAgLy8gZGlzY2FyZD9cbiAgLyoge1xuICAgIC8vIHN1YmplY3RQdWJsaWNLZXlcbiAgICBuYW1lOiAnU3ViamVjdFB1YmxpY0tleUluZm8uc3ViamVjdFB1YmxpY0tleScsXG4gICAgdGFnQ2xhc3M6IGFzbjEuQ2xhc3MuVU5JVkVSU0FMLFxuICAgIHR5cGU6IGFzbjEuVHlwZS5CSVRTVFJJTkcsXG4gICAgY29uc3RydWN0ZWQ6IGZhbHNlLFxuICAgIHZhbHVlOiBbe1xuICAgICAgLy8gUlNBUHVibGljS2V5XG4gICAgICBuYW1lOiAnU3ViamVjdFB1YmxpY0tleUluZm8uc3ViamVjdFB1YmxpY0tleS5SU0FQdWJsaWNLZXknLFxuICAgICAgdGFnQ2xhc3M6IGFzbjEuQ2xhc3MuVU5JVkVSU0FMLFxuICAgICAgdHlwZTogYXNuMS5UeXBlLlNFUVVFTkNFLFxuICAgICAgY29uc3RydWN0ZWQ6IHRydWUsXG4gICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICAgIGNhcHR1cmVBc24xOiAncnNhUHVibGljS2V5J1xuICAgIH1dXG4gIH0gKi9cbiAgXVxufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///241\n")},function(module,exports,__webpack_require__){eval("/**\n * Javascript implementation of RSA-KEM.\n *\n * @author Lautaro Cozzani Rodriguez\n * @author Dave Longley\n *\n * Copyright (c) 2014 Lautaro Cozzani <lautaro.cozzani@scytl.com>\n * Copyright (c) 2014 Digital Bazaar, Inc.\n */\nvar forge = __webpack_require__(4);\n__webpack_require__(7);\n__webpack_require__(13);\n__webpack_require__(43);\n\nmodule.exports = forge.kem = forge.kem || {};\n\nvar BigInteger = forge.jsbn.BigInteger;\n\n/**\n * The API for the RSA Key Encapsulation Mechanism (RSA-KEM) from ISO 18033-2.\n */\nforge.kem.rsa = {};\n\n/**\n * Creates an RSA KEM API object for generating a secret asymmetric key.\n *\n * The symmetric key may be generated via a call to 'encrypt', which will\n * produce a ciphertext to be transmitted to the recipient and a key to be\n * kept secret. The ciphertext is a parameter to be passed to 'decrypt' which\n * will produce the same secret key for the recipient to use to decrypt a\n * message that was encrypted with the secret key.\n *\n * @param kdf the KDF API to use (eg: new forge.kem.kdf1()).\n * @param options the options to use.\n *          [prng] a custom crypto-secure pseudo-random number generator to use,\n *            that must define \"getBytesSync\".\n */\nforge.kem.rsa.create = function(kdf, options) {\n  options = options || {};\n  var prng = options.prng || forge.random;\n\n  var kem = {};\n\n  /**\n   * Generates a secret key and its encapsulation.\n   *\n   * @param publicKey the RSA public key to encrypt with.\n   * @param keyLength the length, in bytes, of the secret key to generate.\n   *\n   * @return an object with:\n   *   encapsulation: the ciphertext for generating the secret key, as a\n   *     binary-encoded string of bytes.\n   *   key: the secret key to use for encrypting a message.\n   */\n  kem.encrypt = function(publicKey, keyLength) {\n    // generate a random r where 1 < r < n\n    var byteLength = Math.ceil(publicKey.n.bitLength() / 8);\n    var r;\n    do {\n      r = new BigInteger(\n        forge.util.bytesToHex(prng.getBytesSync(byteLength)),\n        16).mod(publicKey.n);\n    } while(r.compareTo(BigInteger.ONE) <= 0);\n\n    // prepend r with zeros\n    r = forge.util.hexToBytes(r.toString(16));\n    var zeros = byteLength - r.length;\n    if(zeros > 0) {\n      r = forge.util.fillString(String.fromCharCode(0), zeros) + r;\n    }\n\n    // encrypt the random\n    var encapsulation = publicKey.encrypt(r, 'NONE');\n\n    // generate the secret key\n    var key = kdf.generate(r, keyLength);\n\n    return {encapsulation: encapsulation, key: key};\n  };\n\n  /**\n   * Decrypts an encapsulated secret key.\n   *\n   * @param privateKey the RSA private key to decrypt with.\n   * @param encapsulation the ciphertext for generating the secret key, as\n   *          a binary-encoded string of bytes.\n   * @param keyLength the length, in bytes, of the secret key to generate.\n   *\n   * @return the secret key as a binary-encoded string of bytes.\n   */\n  kem.decrypt = function(privateKey, encapsulation, keyLength) {\n    // decrypt the encapsulation and generate the secret key\n    var r = privateKey.decrypt(encapsulation, 'NONE');\n    return kdf.generate(r, keyLength);\n  };\n\n  return kem;\n};\n\n// TODO: add forge.kem.kdf.create('KDF1', {md: ..., ...}) API?\n\n/**\n * Creates a key derivation API object that implements KDF1 per ISO 18033-2.\n *\n * @param md the hash API to use.\n * @param [digestLength] an optional digest length that must be positive and\n *          less than or equal to md.digestLength.\n *\n * @return a KDF1 API object.\n */\nforge.kem.kdf1 = function(md, digestLength) {\n  _createKDF(this, md, 0, digestLength || md.digestLength);\n};\n\n/**\n * Creates a key derivation API object that implements KDF2 per ISO 18033-2.\n *\n * @param md the hash API to use.\n * @param [digestLength] an optional digest length that must be positive and\n *          less than or equal to md.digestLength.\n *\n * @return a KDF2 API object.\n */\nforge.kem.kdf2 = function(md, digestLength) {\n  _createKDF(this, md, 1, digestLength || md.digestLength);\n};\n\n/**\n * Creates a KDF1 or KDF2 API object.\n *\n * @param md the hash API to use.\n * @param counterStart the starting index for the counter.\n * @param digestLength the digest length to use.\n *\n * @return the KDF API object.\n */\nfunction _createKDF(kdf, md, counterStart, digestLength) {\n  /**\n   * Generate a key of the specified length.\n   *\n   * @param x the binary-encoded byte string to generate a key from.\n   * @param length the number of bytes to generate (the size of the key).\n   *\n   * @return the key as a binary-encoded string.\n   */\n  kdf.generate = function(x, length) {\n    var key = new forge.util.ByteBuffer();\n\n    // run counter from counterStart to ceil(length / Hash.len)\n    var k = Math.ceil(length / digestLength) + counterStart;\n\n    var c = new forge.util.ByteBuffer();\n    for(var i = counterStart; i < k; ++i) {\n      // I2OSP(i, 4): convert counter to an octet string of 4 octets\n      c.putInt32(i);\n\n      // digest 'x' and the counter and add the result to the key\n      md.start();\n      md.update(x + c.getBytes());\n      var hash = md.digest();\n      key.putBytes(hash.getBytes(digestLength));\n    }\n\n    // truncate to the correct key length\n    key.truncate(key.length() - length);\n    return key.getBytes();\n  };\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjQyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL25vZGUtZm9yZ2UvbGliL2tlbS5qcz8xMzkxIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogSmF2YXNjcmlwdCBpbXBsZW1lbnRhdGlvbiBvZiBSU0EtS0VNLlxuICpcbiAqIEBhdXRob3IgTGF1dGFybyBDb3p6YW5pIFJvZHJpZ3VlelxuICogQGF1dGhvciBEYXZlIExvbmdsZXlcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQgTGF1dGFybyBDb3p6YW5pIDxsYXV0YXJvLmNvenphbmlAc2N5dGwuY29tPlxuICogQ29weXJpZ2h0IChjKSAyMDE0IERpZ2l0YWwgQmF6YWFyLCBJbmMuXG4gKi9cbnZhciBmb3JnZSA9IHJlcXVpcmUoJy4vZm9yZ2UnKTtcbnJlcXVpcmUoJy4vdXRpbCcpO1xucmVxdWlyZSgnLi9yYW5kb20nKTtcbnJlcXVpcmUoJy4vanNibicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZvcmdlLmtlbSA9IGZvcmdlLmtlbSB8fCB7fTtcblxudmFyIEJpZ0ludGVnZXIgPSBmb3JnZS5qc2JuLkJpZ0ludGVnZXI7XG5cbi8qKlxuICogVGhlIEFQSSBmb3IgdGhlIFJTQSBLZXkgRW5jYXBzdWxhdGlvbiBNZWNoYW5pc20gKFJTQS1LRU0pIGZyb20gSVNPIDE4MDMzLTIuXG4gKi9cbmZvcmdlLmtlbS5yc2EgPSB7fTtcblxuLyoqXG4gKiBDcmVhdGVzIGFuIFJTQSBLRU0gQVBJIG9iamVjdCBmb3IgZ2VuZXJhdGluZyBhIHNlY3JldCBhc3ltbWV0cmljIGtleS5cbiAqXG4gKiBUaGUgc3ltbWV0cmljIGtleSBtYXkgYmUgZ2VuZXJhdGVkIHZpYSBhIGNhbGwgdG8gJ2VuY3J5cHQnLCB3aGljaCB3aWxsXG4gKiBwcm9kdWNlIGEgY2lwaGVydGV4dCB0byBiZSB0cmFuc21pdHRlZCB0byB0aGUgcmVjaXBpZW50IGFuZCBhIGtleSB0byBiZVxuICoga2VwdCBzZWNyZXQuIFRoZSBjaXBoZXJ0ZXh0IGlzIGEgcGFyYW1ldGVyIHRvIGJlIHBhc3NlZCB0byAnZGVjcnlwdCcgd2hpY2hcbiAqIHdpbGwgcHJvZHVjZSB0aGUgc2FtZSBzZWNyZXQga2V5IGZvciB0aGUgcmVjaXBpZW50IHRvIHVzZSB0byBkZWNyeXB0IGFcbiAqIG1lc3NhZ2UgdGhhdCB3YXMgZW5jcnlwdGVkIHdpdGggdGhlIHNlY3JldCBrZXkuXG4gKlxuICogQHBhcmFtIGtkZiB0aGUgS0RGIEFQSSB0byB1c2UgKGVnOiBuZXcgZm9yZ2Uua2VtLmtkZjEoKSkuXG4gKiBAcGFyYW0gb3B0aW9ucyB0aGUgb3B0aW9ucyB0byB1c2UuXG4gKiAgICAgICAgICBbcHJuZ10gYSBjdXN0b20gY3J5cHRvLXNlY3VyZSBwc2V1ZG8tcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgdG8gdXNlLFxuICogICAgICAgICAgICB0aGF0IG11c3QgZGVmaW5lIFwiZ2V0Qnl0ZXNTeW5jXCIuXG4gKi9cbmZvcmdlLmtlbS5yc2EuY3JlYXRlID0gZnVuY3Rpb24oa2RmLCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICB2YXIgcHJuZyA9IG9wdGlvbnMucHJuZyB8fCBmb3JnZS5yYW5kb207XG5cbiAgdmFyIGtlbSA9IHt9O1xuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZXMgYSBzZWNyZXQga2V5IGFuZCBpdHMgZW5jYXBzdWxhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHB1YmxpY0tleSB0aGUgUlNBIHB1YmxpYyBrZXkgdG8gZW5jcnlwdCB3aXRoLlxuICAgKiBAcGFyYW0ga2V5TGVuZ3RoIHRoZSBsZW5ndGgsIGluIGJ5dGVzLCBvZiB0aGUgc2VjcmV0IGtleSB0byBnZW5lcmF0ZS5cbiAgICpcbiAgICogQHJldHVybiBhbiBvYmplY3Qgd2l0aDpcbiAgICogICBlbmNhcHN1bGF0aW9uOiB0aGUgY2lwaGVydGV4dCBmb3IgZ2VuZXJhdGluZyB0aGUgc2VjcmV0IGtleSwgYXMgYVxuICAgKiAgICAgYmluYXJ5LWVuY29kZWQgc3RyaW5nIG9mIGJ5dGVzLlxuICAgKiAgIGtleTogdGhlIHNlY3JldCBrZXkgdG8gdXNlIGZvciBlbmNyeXB0aW5nIGEgbWVzc2FnZS5cbiAgICovXG4gIGtlbS5lbmNyeXB0ID0gZnVuY3Rpb24ocHVibGljS2V5LCBrZXlMZW5ndGgpIHtcbiAgICAvLyBnZW5lcmF0ZSBhIHJhbmRvbSByIHdoZXJlIDEgPCByIDwgblxuICAgIHZhciBieXRlTGVuZ3RoID0gTWF0aC5jZWlsKHB1YmxpY0tleS5uLmJpdExlbmd0aCgpIC8gOCk7XG4gICAgdmFyIHI7XG4gICAgZG8ge1xuICAgICAgciA9IG5ldyBCaWdJbnRlZ2VyKFxuICAgICAgICBmb3JnZS51dGlsLmJ5dGVzVG9IZXgocHJuZy5nZXRCeXRlc1N5bmMoYnl0ZUxlbmd0aCkpLFxuICAgICAgICAxNikubW9kKHB1YmxpY0tleS5uKTtcbiAgICB9IHdoaWxlKHIuY29tcGFyZVRvKEJpZ0ludGVnZXIuT05FKSA8PSAwKTtcblxuICAgIC8vIHByZXBlbmQgciB3aXRoIHplcm9zXG4gICAgciA9IGZvcmdlLnV0aWwuaGV4VG9CeXRlcyhyLnRvU3RyaW5nKDE2KSk7XG4gICAgdmFyIHplcm9zID0gYnl0ZUxlbmd0aCAtIHIubGVuZ3RoO1xuICAgIGlmKHplcm9zID4gMCkge1xuICAgICAgciA9IGZvcmdlLnV0aWwuZmlsbFN0cmluZyhTdHJpbmcuZnJvbUNoYXJDb2RlKDApLCB6ZXJvcykgKyByO1xuICAgIH1cblxuICAgIC8vIGVuY3J5cHQgdGhlIHJhbmRvbVxuICAgIHZhciBlbmNhcHN1bGF0aW9uID0gcHVibGljS2V5LmVuY3J5cHQociwgJ05PTkUnKTtcblxuICAgIC8vIGdlbmVyYXRlIHRoZSBzZWNyZXQga2V5XG4gICAgdmFyIGtleSA9IGtkZi5nZW5lcmF0ZShyLCBrZXlMZW5ndGgpO1xuXG4gICAgcmV0dXJuIHtlbmNhcHN1bGF0aW9uOiBlbmNhcHN1bGF0aW9uLCBrZXk6IGtleX07XG4gIH07XG5cbiAgLyoqXG4gICAqIERlY3J5cHRzIGFuIGVuY2Fwc3VsYXRlZCBzZWNyZXQga2V5LlxuICAgKlxuICAgKiBAcGFyYW0gcHJpdmF0ZUtleSB0aGUgUlNBIHByaXZhdGUga2V5IHRvIGRlY3J5cHQgd2l0aC5cbiAgICogQHBhcmFtIGVuY2Fwc3VsYXRpb24gdGhlIGNpcGhlcnRleHQgZm9yIGdlbmVyYXRpbmcgdGhlIHNlY3JldCBrZXksIGFzXG4gICAqICAgICAgICAgIGEgYmluYXJ5LWVuY29kZWQgc3RyaW5nIG9mIGJ5dGVzLlxuICAgKiBAcGFyYW0ga2V5TGVuZ3RoIHRoZSBsZW5ndGgsIGluIGJ5dGVzLCBvZiB0aGUgc2VjcmV0IGtleSB0byBnZW5lcmF0ZS5cbiAgICpcbiAgICogQHJldHVybiB0aGUgc2VjcmV0IGtleSBhcyBhIGJpbmFyeS1lbmNvZGVkIHN0cmluZyBvZiBieXRlcy5cbiAgICovXG4gIGtlbS5kZWNyeXB0ID0gZnVuY3Rpb24ocHJpdmF0ZUtleSwgZW5jYXBzdWxhdGlvbiwga2V5TGVuZ3RoKSB7XG4gICAgLy8gZGVjcnlwdCB0aGUgZW5jYXBzdWxhdGlvbiBhbmQgZ2VuZXJhdGUgdGhlIHNlY3JldCBrZXlcbiAgICB2YXIgciA9IHByaXZhdGVLZXkuZGVjcnlwdChlbmNhcHN1bGF0aW9uLCAnTk9ORScpO1xuICAgIHJldHVybiBrZGYuZ2VuZXJhdGUociwga2V5TGVuZ3RoKTtcbiAgfTtcblxuICByZXR1cm4ga2VtO1xufTtcblxuLy8gVE9ETzogYWRkIGZvcmdlLmtlbS5rZGYuY3JlYXRlKCdLREYxJywge21kOiAuLi4sIC4uLn0pIEFQST9cblxuLyoqXG4gKiBDcmVhdGVzIGEga2V5IGRlcml2YXRpb24gQVBJIG9iamVjdCB0aGF0IGltcGxlbWVudHMgS0RGMSBwZXIgSVNPIDE4MDMzLTIuXG4gKlxuICogQHBhcmFtIG1kIHRoZSBoYXNoIEFQSSB0byB1c2UuXG4gKiBAcGFyYW0gW2RpZ2VzdExlbmd0aF0gYW4gb3B0aW9uYWwgZGlnZXN0IGxlbmd0aCB0aGF0IG11c3QgYmUgcG9zaXRpdmUgYW5kXG4gKiAgICAgICAgICBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gbWQuZGlnZXN0TGVuZ3RoLlxuICpcbiAqIEByZXR1cm4gYSBLREYxIEFQSSBvYmplY3QuXG4gKi9cbmZvcmdlLmtlbS5rZGYxID0gZnVuY3Rpb24obWQsIGRpZ2VzdExlbmd0aCkge1xuICBfY3JlYXRlS0RGKHRoaXMsIG1kLCAwLCBkaWdlc3RMZW5ndGggfHwgbWQuZGlnZXN0TGVuZ3RoKTtcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIGtleSBkZXJpdmF0aW9uIEFQSSBvYmplY3QgdGhhdCBpbXBsZW1lbnRzIEtERjIgcGVyIElTTyAxODAzMy0yLlxuICpcbiAqIEBwYXJhbSBtZCB0aGUgaGFzaCBBUEkgdG8gdXNlLlxuICogQHBhcmFtIFtkaWdlc3RMZW5ndGhdIGFuIG9wdGlvbmFsIGRpZ2VzdCBsZW5ndGggdGhhdCBtdXN0IGJlIHBvc2l0aXZlIGFuZFxuICogICAgICAgICAgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIG1kLmRpZ2VzdExlbmd0aC5cbiAqXG4gKiBAcmV0dXJuIGEgS0RGMiBBUEkgb2JqZWN0LlxuICovXG5mb3JnZS5rZW0ua2RmMiA9IGZ1bmN0aW9uKG1kLCBkaWdlc3RMZW5ndGgpIHtcbiAgX2NyZWF0ZUtERih0aGlzLCBtZCwgMSwgZGlnZXN0TGVuZ3RoIHx8IG1kLmRpZ2VzdExlbmd0aCk7XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBLREYxIG9yIEtERjIgQVBJIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0gbWQgdGhlIGhhc2ggQVBJIHRvIHVzZS5cbiAqIEBwYXJhbSBjb3VudGVyU3RhcnQgdGhlIHN0YXJ0aW5nIGluZGV4IGZvciB0aGUgY291bnRlci5cbiAqIEBwYXJhbSBkaWdlc3RMZW5ndGggdGhlIGRpZ2VzdCBsZW5ndGggdG8gdXNlLlxuICpcbiAqIEByZXR1cm4gdGhlIEtERiBBUEkgb2JqZWN0LlxuICovXG5mdW5jdGlvbiBfY3JlYXRlS0RGKGtkZiwgbWQsIGNvdW50ZXJTdGFydCwgZGlnZXN0TGVuZ3RoKSB7XG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBhIGtleSBvZiB0aGUgc3BlY2lmaWVkIGxlbmd0aC5cbiAgICpcbiAgICogQHBhcmFtIHggdGhlIGJpbmFyeS1lbmNvZGVkIGJ5dGUgc3RyaW5nIHRvIGdlbmVyYXRlIGEga2V5IGZyb20uXG4gICAqIEBwYXJhbSBsZW5ndGggdGhlIG51bWJlciBvZiBieXRlcyB0byBnZW5lcmF0ZSAodGhlIHNpemUgb2YgdGhlIGtleSkuXG4gICAqXG4gICAqIEByZXR1cm4gdGhlIGtleSBhcyBhIGJpbmFyeS1lbmNvZGVkIHN0cmluZy5cbiAgICovXG4gIGtkZi5nZW5lcmF0ZSA9IGZ1bmN0aW9uKHgsIGxlbmd0aCkge1xuICAgIHZhciBrZXkgPSBuZXcgZm9yZ2UudXRpbC5CeXRlQnVmZmVyKCk7XG5cbiAgICAvLyBydW4gY291bnRlciBmcm9tIGNvdW50ZXJTdGFydCB0byBjZWlsKGxlbmd0aCAvIEhhc2gubGVuKVxuICAgIHZhciBrID0gTWF0aC5jZWlsKGxlbmd0aCAvIGRpZ2VzdExlbmd0aCkgKyBjb3VudGVyU3RhcnQ7XG5cbiAgICB2YXIgYyA9IG5ldyBmb3JnZS51dGlsLkJ5dGVCdWZmZXIoKTtcbiAgICBmb3IodmFyIGkgPSBjb3VudGVyU3RhcnQ7IGkgPCBrOyArK2kpIHtcbiAgICAgIC8vIEkyT1NQKGksIDQpOiBjb252ZXJ0IGNvdW50ZXIgdG8gYW4gb2N0ZXQgc3RyaW5nIG9mIDQgb2N0ZXRzXG4gICAgICBjLnB1dEludDMyKGkpO1xuXG4gICAgICAvLyBkaWdlc3QgJ3gnIGFuZCB0aGUgY291bnRlciBhbmQgYWRkIHRoZSByZXN1bHQgdG8gdGhlIGtleVxuICAgICAgbWQuc3RhcnQoKTtcbiAgICAgIG1kLnVwZGF0ZSh4ICsgYy5nZXRCeXRlcygpKTtcbiAgICAgIHZhciBoYXNoID0gbWQuZGlnZXN0KCk7XG4gICAgICBrZXkucHV0Qnl0ZXMoaGFzaC5nZXRCeXRlcyhkaWdlc3RMZW5ndGgpKTtcbiAgICB9XG5cbiAgICAvLyB0cnVuY2F0ZSB0byB0aGUgY29ycmVjdCBrZXkgbGVuZ3RoXG4gICAga2V5LnRydW5jYXRlKGtleS5sZW5ndGgoKSAtIGxlbmd0aCk7XG4gICAgcmV0dXJuIGtleS5nZXRCeXRlcygpO1xuICB9O1xufVxuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///242\n")},function(module,exports,__webpack_require__){eval("/**\n * Cross-browser support for logging in a web application.\n *\n * @author David I. Lehn <dlehn@digitalbazaar.com>\n *\n * Copyright (c) 2008-2013 Digital Bazaar, Inc.\n */\nvar forge = __webpack_require__(4);\n__webpack_require__(7);\n\n/* LOG API */\nmodule.exports = forge.log = forge.log || {};\n\n/**\n * Application logging system.\n *\n * Each logger level available as it's own function of the form:\n *   forge.log.level(category, args...)\n * The category is an arbitrary string, and the args are the same as\n * Firebug's console.log API. By default the call will be output as:\n *   'LEVEL [category] <args[0]>, args[1], ...'\n * This enables proper % formatting via the first argument.\n * Each category is enabled by default but can be enabled or disabled with\n * the setCategoryEnabled() function.\n */\n// list of known levels\nforge.log.levels = [\n  'none', 'error', 'warning', 'info', 'debug', 'verbose', 'max'];\n// info on the levels indexed by name:\n//   index: level index\n//   name: uppercased display name\nvar sLevelInfo = {};\n// list of loggers\nvar sLoggers = [];\n/**\n * Standard console logger. If no console support is enabled this will\n * remain null. Check before using.\n */\nvar sConsoleLogger = null;\n\n// logger flags\n/**\n * Lock the level at the current value. Used in cases where user config may\n * set the level such that only critical messages are seen but more verbose\n * messages are needed for debugging or other purposes.\n */\nforge.log.LEVEL_LOCKED = (1 << 1);\n/**\n * Always call log function. By default, the logging system will check the\n * message level against logger.level before calling the log function. This\n * flag allows the function to do its own check.\n */\nforge.log.NO_LEVEL_CHECK = (1 << 2);\n/**\n * Perform message interpolation with the passed arguments. \"%\" style\n * fields in log messages will be replaced by arguments as needed. Some\n * loggers, such as Firebug, may do this automatically. The original log\n * message will be available as 'message' and the interpolated version will\n * be available as 'fullMessage'.\n */\nforge.log.INTERPOLATE = (1 << 3);\n\n// setup each log level\nfor(var i = 0; i < forge.log.levels.length; ++i) {\n  var level = forge.log.levels[i];\n  sLevelInfo[level] = {\n    index: i,\n    name: level.toUpperCase()\n  };\n}\n\n/**\n * Message logger. Will dispatch a message to registered loggers as needed.\n *\n * @param message message object\n */\nforge.log.logMessage = function(message) {\n  var messageLevelIndex = sLevelInfo[message.level].index;\n  for(var i = 0; i < sLoggers.length; ++i) {\n    var logger = sLoggers[i];\n    if(logger.flags & forge.log.NO_LEVEL_CHECK) {\n      logger.f(message);\n    } else {\n      // get logger level\n      var loggerLevelIndex = sLevelInfo[logger.level].index;\n      // check level\n      if(messageLevelIndex <= loggerLevelIndex) {\n        // message critical enough, call logger\n        logger.f(logger, message);\n      }\n    }\n  }\n};\n\n/**\n * Sets the 'standard' key on a message object to:\n * \"LEVEL [category] \" + message\n *\n * @param message a message log object\n */\nforge.log.prepareStandard = function(message) {\n  if(!('standard' in message)) {\n    message.standard =\n      sLevelInfo[message.level].name +\n      //' ' + +message.timestamp +\n      ' [' + message.category + '] ' +\n      message.message;\n  }\n};\n\n/**\n * Sets the 'full' key on a message object to the original message\n * interpolated via % formatting with the message arguments.\n *\n * @param message a message log object.\n */\nforge.log.prepareFull = function(message) {\n  if(!('full' in message)) {\n    // copy args and insert message at the front\n    var args = [message.message];\n    args = args.concat([] || false);\n    // format the message\n    message.full = forge.util.format.apply(this, args);\n  }\n};\n\n/**\n * Applies both preparseStandard() and prepareFull() to a message object and\n * store result in 'standardFull'.\n *\n * @param message a message log object.\n */\nforge.log.prepareStandardFull = function(message) {\n  if(!('standardFull' in message)) {\n    // FIXME implement 'standardFull' logging\n    forge.log.prepareStandard(message);\n    message.standardFull = message.standard;\n  }\n};\n\n// create log level functions\nif(true) {\n  // levels for which we want functions\n  var levels = ['error', 'warning', 'info', 'debug', 'verbose'];\n  for(var i = 0; i < levels.length; ++i) {\n    // wrap in a function to ensure proper level var is passed\n    (function(level) {\n      // create function for this level\n      forge.log[level] = function(category, message/*, args...*/) {\n        // convert arguments to real array, remove category and message\n        var args = Array.prototype.slice.call(arguments).slice(2);\n        // create message object\n        // Note: interpolation and standard formatting is done lazily\n        var msg = {\n          timestamp: new Date(),\n          level: level,\n          category: category,\n          message: message,\n          'arguments': args\n          /*standard*/\n          /*full*/\n          /*fullMessage*/\n        };\n        // process this message\n        forge.log.logMessage(msg);\n      };\n    })(levels[i]);\n  }\n}\n\n/**\n * Creates a new logger with specified custom logging function.\n *\n * The logging function has a signature of:\n *   function(logger, message)\n * logger: current logger\n * message: object:\n *   level: level id\n *   category: category\n *   message: string message\n *   arguments: Array of extra arguments\n *   fullMessage: interpolated message and arguments if INTERPOLATE flag set\n *\n * @param logFunction a logging function which takes a log message object\n *          as a parameter.\n *\n * @return a logger object.\n */\nforge.log.makeLogger = function(logFunction) {\n  var logger = {\n    flags: 0,\n    f: logFunction\n  };\n  forge.log.setLevel(logger, 'none');\n  return logger;\n};\n\n/**\n * Sets the current log level on a logger.\n *\n * @param logger the target logger.\n * @param level the new maximum log level as a string.\n *\n * @return true if set, false if not.\n */\nforge.log.setLevel = function(logger, level) {\n  var rval = false;\n  if(logger && !(logger.flags & forge.log.LEVEL_LOCKED)) {\n    for(var i = 0; i < forge.log.levels.length; ++i) {\n      var aValidLevel = forge.log.levels[i];\n      if(level == aValidLevel) {\n        // set level\n        logger.level = level;\n        rval = true;\n        break;\n      }\n    }\n  }\n\n  return rval;\n};\n\n/**\n * Locks the log level at its current value.\n *\n * @param logger the target logger.\n * @param lock boolean lock value, default to true.\n */\nforge.log.lock = function(logger, lock) {\n  if(typeof lock === 'undefined' || lock) {\n    logger.flags |= forge.log.LEVEL_LOCKED;\n  } else {\n    logger.flags &= ~forge.log.LEVEL_LOCKED;\n  }\n};\n\n/**\n * Adds a logger.\n *\n * @param logger the logger object.\n */\nforge.log.addLogger = function(logger) {\n  sLoggers.push(logger);\n};\n\n// setup the console logger if possible, else create fake console.log\nif(typeof(console) !== 'undefined' && 'log' in console) {\n  var logger;\n  if(console.error && console.warn && console.info && console.debug) {\n    // looks like Firebug-style logging is available\n    // level handlers map\n    var levelHandlers = {\n      error: console.error,\n      warning: console.warn,\n      info: console.info,\n      debug: console.debug,\n      verbose: console.debug\n    };\n    var f = function(logger, message) {\n      forge.log.prepareStandard(message);\n      var handler = levelHandlers[message.level];\n      // prepend standard message and concat args\n      var args = [message.standard];\n      args = args.concat(message['arguments'].slice());\n      // apply to low-level console function\n      handler.apply(console, args);\n    };\n    logger = forge.log.makeLogger(f);\n  } else {\n    // only appear to have basic console.log\n    var f = function(logger, message) {\n      forge.log.prepareStandardFull(message);\n      console.log(message.standardFull);\n    };\n    logger = forge.log.makeLogger(f);\n  }\n  forge.log.setLevel(logger, 'debug');\n  forge.log.addLogger(logger);\n  sConsoleLogger = logger;\n} else {\n  // define fake console.log to avoid potential script errors on\n  // browsers that do not have console logging\n  console = {\n    log: function() {}\n  };\n}\n\n/*\n * Check for logging control query vars in current URL.\n *\n * console.level=<level-name>\n * Set's the console log level by name.  Useful to override defaults and\n * allow more verbose logging before a user config is loaded.\n *\n * console.lock=<true|false>\n * Lock the console log level at whatever level it is set at.  This is run\n * after console.level is processed.  Useful to force a level of verbosity\n * that could otherwise be limited by a user config.\n */\nif(sConsoleLogger !== null &&\n  typeof window !== 'undefined' && window.location\n) {\n  var query = new URL(window.location.href).searchParams;\n  if(query.has('console.level')) {\n    // set with last value\n    forge.log.setLevel(\n      sConsoleLogger, query.get('console.level').slice(-1)[0]);\n  }\n  if(query.has('console.lock')) {\n    // set with last value\n    var lock = query.get('console.lock').slice(-1)[0];\n    if(lock == 'true') {\n      forge.log.lock(sConsoleLogger);\n    }\n  }\n}\n\n// provide public access to console logger\nforge.log.consoleLogger = sConsoleLogger;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjQzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL25vZGUtZm9yZ2UvbGliL2xvZy5qcz83YmMzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ3Jvc3MtYnJvd3NlciBzdXBwb3J0IGZvciBsb2dnaW5nIGluIGEgd2ViIGFwcGxpY2F0aW9uLlxuICpcbiAqIEBhdXRob3IgRGF2aWQgSS4gTGVobiA8ZGxlaG5AZGlnaXRhbGJhemFhci5jb20+XG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTMgRGlnaXRhbCBCYXphYXIsIEluYy5cbiAqL1xudmFyIGZvcmdlID0gcmVxdWlyZSgnLi9mb3JnZScpO1xucmVxdWlyZSgnLi91dGlsJyk7XG5cbi8qIExPRyBBUEkgKi9cbm1vZHVsZS5leHBvcnRzID0gZm9yZ2UubG9nID0gZm9yZ2UubG9nIHx8IHt9O1xuXG4vKipcbiAqIEFwcGxpY2F0aW9uIGxvZ2dpbmcgc3lzdGVtLlxuICpcbiAqIEVhY2ggbG9nZ2VyIGxldmVsIGF2YWlsYWJsZSBhcyBpdCdzIG93biBmdW5jdGlvbiBvZiB0aGUgZm9ybTpcbiAqICAgZm9yZ2UubG9nLmxldmVsKGNhdGVnb3J5LCBhcmdzLi4uKVxuICogVGhlIGNhdGVnb3J5IGlzIGFuIGFyYml0cmFyeSBzdHJpbmcsIGFuZCB0aGUgYXJncyBhcmUgdGhlIHNhbWUgYXNcbiAqIEZpcmVidWcncyBjb25zb2xlLmxvZyBBUEkuIEJ5IGRlZmF1bHQgdGhlIGNhbGwgd2lsbCBiZSBvdXRwdXQgYXM6XG4gKiAgICdMRVZFTCBbY2F0ZWdvcnldIDxhcmdzWzBdPiwgYXJnc1sxXSwgLi4uJ1xuICogVGhpcyBlbmFibGVzIHByb3BlciAlIGZvcm1hdHRpbmcgdmlhIHRoZSBmaXJzdCBhcmd1bWVudC5cbiAqIEVhY2ggY2F0ZWdvcnkgaXMgZW5hYmxlZCBieSBkZWZhdWx0IGJ1dCBjYW4gYmUgZW5hYmxlZCBvciBkaXNhYmxlZCB3aXRoXG4gKiB0aGUgc2V0Q2F0ZWdvcnlFbmFibGVkKCkgZnVuY3Rpb24uXG4gKi9cbi8vIGxpc3Qgb2Yga25vd24gbGV2ZWxzXG5mb3JnZS5sb2cubGV2ZWxzID0gW1xuICAnbm9uZScsICdlcnJvcicsICd3YXJuaW5nJywgJ2luZm8nLCAnZGVidWcnLCAndmVyYm9zZScsICdtYXgnXTtcbi8vIGluZm8gb24gdGhlIGxldmVscyBpbmRleGVkIGJ5IG5hbWU6XG4vLyAgIGluZGV4OiBsZXZlbCBpbmRleFxuLy8gICBuYW1lOiB1cHBlcmNhc2VkIGRpc3BsYXkgbmFtZVxudmFyIHNMZXZlbEluZm8gPSB7fTtcbi8vIGxpc3Qgb2YgbG9nZ2Vyc1xudmFyIHNMb2dnZXJzID0gW107XG4vKipcbiAqIFN0YW5kYXJkIGNvbnNvbGUgbG9nZ2VyLiBJZiBubyBjb25zb2xlIHN1cHBvcnQgaXMgZW5hYmxlZCB0aGlzIHdpbGxcbiAqIHJlbWFpbiBudWxsLiBDaGVjayBiZWZvcmUgdXNpbmcuXG4gKi9cbnZhciBzQ29uc29sZUxvZ2dlciA9IG51bGw7XG5cbi8vIGxvZ2dlciBmbGFnc1xuLyoqXG4gKiBMb2NrIHRoZSBsZXZlbCBhdCB0aGUgY3VycmVudCB2YWx1ZS4gVXNlZCBpbiBjYXNlcyB3aGVyZSB1c2VyIGNvbmZpZyBtYXlcbiAqIHNldCB0aGUgbGV2ZWwgc3VjaCB0aGF0IG9ubHkgY3JpdGljYWwgbWVzc2FnZXMgYXJlIHNlZW4gYnV0IG1vcmUgdmVyYm9zZVxuICogbWVzc2FnZXMgYXJlIG5lZWRlZCBmb3IgZGVidWdnaW5nIG9yIG90aGVyIHB1cnBvc2VzLlxuICovXG5mb3JnZS5sb2cuTEVWRUxfTE9DS0VEID0gKDEgPDwgMSk7XG4vKipcbiAqIEFsd2F5cyBjYWxsIGxvZyBmdW5jdGlvbi4gQnkgZGVmYXVsdCwgdGhlIGxvZ2dpbmcgc3lzdGVtIHdpbGwgY2hlY2sgdGhlXG4gKiBtZXNzYWdlIGxldmVsIGFnYWluc3QgbG9nZ2VyLmxldmVsIGJlZm9yZSBjYWxsaW5nIHRoZSBsb2cgZnVuY3Rpb24uIFRoaXNcbiAqIGZsYWcgYWxsb3dzIHRoZSBmdW5jdGlvbiB0byBkbyBpdHMgb3duIGNoZWNrLlxuICovXG5mb3JnZS5sb2cuTk9fTEVWRUxfQ0hFQ0sgPSAoMSA8PCAyKTtcbi8qKlxuICogUGVyZm9ybSBtZXNzYWdlIGludGVycG9sYXRpb24gd2l0aCB0aGUgcGFzc2VkIGFyZ3VtZW50cy4gXCIlXCIgc3R5bGVcbiAqIGZpZWxkcyBpbiBsb2cgbWVzc2FnZXMgd2lsbCBiZSByZXBsYWNlZCBieSBhcmd1bWVudHMgYXMgbmVlZGVkLiBTb21lXG4gKiBsb2dnZXJzLCBzdWNoIGFzIEZpcmVidWcsIG1heSBkbyB0aGlzIGF1dG9tYXRpY2FsbHkuIFRoZSBvcmlnaW5hbCBsb2dcbiAqIG1lc3NhZ2Ugd2lsbCBiZSBhdmFpbGFibGUgYXMgJ21lc3NhZ2UnIGFuZCB0aGUgaW50ZXJwb2xhdGVkIHZlcnNpb24gd2lsbFxuICogYmUgYXZhaWxhYmxlIGFzICdmdWxsTWVzc2FnZScuXG4gKi9cbmZvcmdlLmxvZy5JTlRFUlBPTEFURSA9ICgxIDw8IDMpO1xuXG4vLyBzZXR1cCBlYWNoIGxvZyBsZXZlbFxuZm9yKHZhciBpID0gMDsgaSA8IGZvcmdlLmxvZy5sZXZlbHMubGVuZ3RoOyArK2kpIHtcbiAgdmFyIGxldmVsID0gZm9yZ2UubG9nLmxldmVsc1tpXTtcbiAgc0xldmVsSW5mb1tsZXZlbF0gPSB7XG4gICAgaW5kZXg6IGksXG4gICAgbmFtZTogbGV2ZWwudG9VcHBlckNhc2UoKVxuICB9O1xufVxuXG4vKipcbiAqIE1lc3NhZ2UgbG9nZ2VyLiBXaWxsIGRpc3BhdGNoIGEgbWVzc2FnZSB0byByZWdpc3RlcmVkIGxvZ2dlcnMgYXMgbmVlZGVkLlxuICpcbiAqIEBwYXJhbSBtZXNzYWdlIG1lc3NhZ2Ugb2JqZWN0XG4gKi9cbmZvcmdlLmxvZy5sb2dNZXNzYWdlID0gZnVuY3Rpb24obWVzc2FnZSkge1xuICB2YXIgbWVzc2FnZUxldmVsSW5kZXggPSBzTGV2ZWxJbmZvW21lc3NhZ2UubGV2ZWxdLmluZGV4O1xuICBmb3IodmFyIGkgPSAwOyBpIDwgc0xvZ2dlcnMubGVuZ3RoOyArK2kpIHtcbiAgICB2YXIgbG9nZ2VyID0gc0xvZ2dlcnNbaV07XG4gICAgaWYobG9nZ2VyLmZsYWdzICYgZm9yZ2UubG9nLk5PX0xFVkVMX0NIRUNLKSB7XG4gICAgICBsb2dnZXIuZihtZXNzYWdlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gZ2V0IGxvZ2dlciBsZXZlbFxuICAgICAgdmFyIGxvZ2dlckxldmVsSW5kZXggPSBzTGV2ZWxJbmZvW2xvZ2dlci5sZXZlbF0uaW5kZXg7XG4gICAgICAvLyBjaGVjayBsZXZlbFxuICAgICAgaWYobWVzc2FnZUxldmVsSW5kZXggPD0gbG9nZ2VyTGV2ZWxJbmRleCkge1xuICAgICAgICAvLyBtZXNzYWdlIGNyaXRpY2FsIGVub3VnaCwgY2FsbCBsb2dnZXJcbiAgICAgICAgbG9nZ2VyLmYobG9nZ2VyLCBtZXNzYWdlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogU2V0cyB0aGUgJ3N0YW5kYXJkJyBrZXkgb24gYSBtZXNzYWdlIG9iamVjdCB0bzpcbiAqIFwiTEVWRUwgW2NhdGVnb3J5XSBcIiArIG1lc3NhZ2VcbiAqXG4gKiBAcGFyYW0gbWVzc2FnZSBhIG1lc3NhZ2UgbG9nIG9iamVjdFxuICovXG5mb3JnZS5sb2cucHJlcGFyZVN0YW5kYXJkID0gZnVuY3Rpb24obWVzc2FnZSkge1xuICBpZighKCdzdGFuZGFyZCcgaW4gbWVzc2FnZSkpIHtcbiAgICBtZXNzYWdlLnN0YW5kYXJkID1cbiAgICAgIHNMZXZlbEluZm9bbWVzc2FnZS5sZXZlbF0ubmFtZSArXG4gICAgICAvLycgJyArICttZXNzYWdlLnRpbWVzdGFtcCArXG4gICAgICAnIFsnICsgbWVzc2FnZS5jYXRlZ29yeSArICddICcgK1xuICAgICAgbWVzc2FnZS5tZXNzYWdlO1xuICB9XG59O1xuXG4vKipcbiAqIFNldHMgdGhlICdmdWxsJyBrZXkgb24gYSBtZXNzYWdlIG9iamVjdCB0byB0aGUgb3JpZ2luYWwgbWVzc2FnZVxuICogaW50ZXJwb2xhdGVkIHZpYSAlIGZvcm1hdHRpbmcgd2l0aCB0aGUgbWVzc2FnZSBhcmd1bWVudHMuXG4gKlxuICogQHBhcmFtIG1lc3NhZ2UgYSBtZXNzYWdlIGxvZyBvYmplY3QuXG4gKi9cbmZvcmdlLmxvZy5wcmVwYXJlRnVsbCA9IGZ1bmN0aW9uKG1lc3NhZ2UpIHtcbiAgaWYoISgnZnVsbCcgaW4gbWVzc2FnZSkpIHtcbiAgICAvLyBjb3B5IGFyZ3MgYW5kIGluc2VydCBtZXNzYWdlIGF0IHRoZSBmcm9udFxuICAgIHZhciBhcmdzID0gW21lc3NhZ2UubWVzc2FnZV07XG4gICAgYXJncyA9IGFyZ3MuY29uY2F0KFtdIHx8IG1lc3NhZ2VbJ2FyZ3VtZW50cyddKTtcbiAgICAvLyBmb3JtYXQgdGhlIG1lc3NhZ2VcbiAgICBtZXNzYWdlLmZ1bGwgPSBmb3JnZS51dGlsLmZvcm1hdC5hcHBseSh0aGlzLCBhcmdzKTtcbiAgfVxufTtcblxuLyoqXG4gKiBBcHBsaWVzIGJvdGggcHJlcGFyc2VTdGFuZGFyZCgpIGFuZCBwcmVwYXJlRnVsbCgpIHRvIGEgbWVzc2FnZSBvYmplY3QgYW5kXG4gKiBzdG9yZSByZXN1bHQgaW4gJ3N0YW5kYXJkRnVsbCcuXG4gKlxuICogQHBhcmFtIG1lc3NhZ2UgYSBtZXNzYWdlIGxvZyBvYmplY3QuXG4gKi9cbmZvcmdlLmxvZy5wcmVwYXJlU3RhbmRhcmRGdWxsID0gZnVuY3Rpb24obWVzc2FnZSkge1xuICBpZighKCdzdGFuZGFyZEZ1bGwnIGluIG1lc3NhZ2UpKSB7XG4gICAgLy8gRklYTUUgaW1wbGVtZW50ICdzdGFuZGFyZEZ1bGwnIGxvZ2dpbmdcbiAgICBmb3JnZS5sb2cucHJlcGFyZVN0YW5kYXJkKG1lc3NhZ2UpO1xuICAgIG1lc3NhZ2Uuc3RhbmRhcmRGdWxsID0gbWVzc2FnZS5zdGFuZGFyZDtcbiAgfVxufTtcblxuLy8gY3JlYXRlIGxvZyBsZXZlbCBmdW5jdGlvbnNcbmlmKHRydWUpIHtcbiAgLy8gbGV2ZWxzIGZvciB3aGljaCB3ZSB3YW50IGZ1bmN0aW9uc1xuICB2YXIgbGV2ZWxzID0gWydlcnJvcicsICd3YXJuaW5nJywgJ2luZm8nLCAnZGVidWcnLCAndmVyYm9zZSddO1xuICBmb3IodmFyIGkgPSAwOyBpIDwgbGV2ZWxzLmxlbmd0aDsgKytpKSB7XG4gICAgLy8gd3JhcCBpbiBhIGZ1bmN0aW9uIHRvIGVuc3VyZSBwcm9wZXIgbGV2ZWwgdmFyIGlzIHBhc3NlZFxuICAgIChmdW5jdGlvbihsZXZlbCkge1xuICAgICAgLy8gY3JlYXRlIGZ1bmN0aW9uIGZvciB0aGlzIGxldmVsXG4gICAgICBmb3JnZS5sb2dbbGV2ZWxdID0gZnVuY3Rpb24oY2F0ZWdvcnksIG1lc3NhZ2UvKiwgYXJncy4uLiovKSB7XG4gICAgICAgIC8vIGNvbnZlcnQgYXJndW1lbnRzIHRvIHJlYWwgYXJyYXksIHJlbW92ZSBjYXRlZ29yeSBhbmQgbWVzc2FnZVxuICAgICAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cykuc2xpY2UoMik7XG4gICAgICAgIC8vIGNyZWF0ZSBtZXNzYWdlIG9iamVjdFxuICAgICAgICAvLyBOb3RlOiBpbnRlcnBvbGF0aW9uIGFuZCBzdGFuZGFyZCBmb3JtYXR0aW5nIGlzIGRvbmUgbGF6aWx5XG4gICAgICAgIHZhciBtc2cgPSB7XG4gICAgICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLFxuICAgICAgICAgIGxldmVsOiBsZXZlbCxcbiAgICAgICAgICBjYXRlZ29yeTogY2F0ZWdvcnksXG4gICAgICAgICAgbWVzc2FnZTogbWVzc2FnZSxcbiAgICAgICAgICAnYXJndW1lbnRzJzogYXJnc1xuICAgICAgICAgIC8qc3RhbmRhcmQqL1xuICAgICAgICAgIC8qZnVsbCovXG4gICAgICAgICAgLypmdWxsTWVzc2FnZSovXG4gICAgICAgIH07XG4gICAgICAgIC8vIHByb2Nlc3MgdGhpcyBtZXNzYWdlXG4gICAgICAgIGZvcmdlLmxvZy5sb2dNZXNzYWdlKG1zZyk7XG4gICAgICB9O1xuICAgIH0pKGxldmVsc1tpXSk7XG4gIH1cbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IGxvZ2dlciB3aXRoIHNwZWNpZmllZCBjdXN0b20gbG9nZ2luZyBmdW5jdGlvbi5cbiAqXG4gKiBUaGUgbG9nZ2luZyBmdW5jdGlvbiBoYXMgYSBzaWduYXR1cmUgb2Y6XG4gKiAgIGZ1bmN0aW9uKGxvZ2dlciwgbWVzc2FnZSlcbiAqIGxvZ2dlcjogY3VycmVudCBsb2dnZXJcbiAqIG1lc3NhZ2U6IG9iamVjdDpcbiAqICAgbGV2ZWw6IGxldmVsIGlkXG4gKiAgIGNhdGVnb3J5OiBjYXRlZ29yeVxuICogICBtZXNzYWdlOiBzdHJpbmcgbWVzc2FnZVxuICogICBhcmd1bWVudHM6IEFycmF5IG9mIGV4dHJhIGFyZ3VtZW50c1xuICogICBmdWxsTWVzc2FnZTogaW50ZXJwb2xhdGVkIG1lc3NhZ2UgYW5kIGFyZ3VtZW50cyBpZiBJTlRFUlBPTEFURSBmbGFnIHNldFxuICpcbiAqIEBwYXJhbSBsb2dGdW5jdGlvbiBhIGxvZ2dpbmcgZnVuY3Rpb24gd2hpY2ggdGFrZXMgYSBsb2cgbWVzc2FnZSBvYmplY3RcbiAqICAgICAgICAgIGFzIGEgcGFyYW1ldGVyLlxuICpcbiAqIEByZXR1cm4gYSBsb2dnZXIgb2JqZWN0LlxuICovXG5mb3JnZS5sb2cubWFrZUxvZ2dlciA9IGZ1bmN0aW9uKGxvZ0Z1bmN0aW9uKSB7XG4gIHZhciBsb2dnZXIgPSB7XG4gICAgZmxhZ3M6IDAsXG4gICAgZjogbG9nRnVuY3Rpb25cbiAgfTtcbiAgZm9yZ2UubG9nLnNldExldmVsKGxvZ2dlciwgJ25vbmUnKTtcbiAgcmV0dXJuIGxvZ2dlcjtcbn07XG5cbi8qKlxuICogU2V0cyB0aGUgY3VycmVudCBsb2cgbGV2ZWwgb24gYSBsb2dnZXIuXG4gKlxuICogQHBhcmFtIGxvZ2dlciB0aGUgdGFyZ2V0IGxvZ2dlci5cbiAqIEBwYXJhbSBsZXZlbCB0aGUgbmV3IG1heGltdW0gbG9nIGxldmVsIGFzIGEgc3RyaW5nLlxuICpcbiAqIEByZXR1cm4gdHJ1ZSBpZiBzZXQsIGZhbHNlIGlmIG5vdC5cbiAqL1xuZm9yZ2UubG9nLnNldExldmVsID0gZnVuY3Rpb24obG9nZ2VyLCBsZXZlbCkge1xuICB2YXIgcnZhbCA9IGZhbHNlO1xuICBpZihsb2dnZXIgJiYgIShsb2dnZXIuZmxhZ3MgJiBmb3JnZS5sb2cuTEVWRUxfTE9DS0VEKSkge1xuICAgIGZvcih2YXIgaSA9IDA7IGkgPCBmb3JnZS5sb2cubGV2ZWxzLmxlbmd0aDsgKytpKSB7XG4gICAgICB2YXIgYVZhbGlkTGV2ZWwgPSBmb3JnZS5sb2cubGV2ZWxzW2ldO1xuICAgICAgaWYobGV2ZWwgPT0gYVZhbGlkTGV2ZWwpIHtcbiAgICAgICAgLy8gc2V0IGxldmVsXG4gICAgICAgIGxvZ2dlci5sZXZlbCA9IGxldmVsO1xuICAgICAgICBydmFsID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJ2YWw7XG59O1xuXG4vKipcbiAqIExvY2tzIHRoZSBsb2cgbGV2ZWwgYXQgaXRzIGN1cnJlbnQgdmFsdWUuXG4gKlxuICogQHBhcmFtIGxvZ2dlciB0aGUgdGFyZ2V0IGxvZ2dlci5cbiAqIEBwYXJhbSBsb2NrIGJvb2xlYW4gbG9jayB2YWx1ZSwgZGVmYXVsdCB0byB0cnVlLlxuICovXG5mb3JnZS5sb2cubG9jayA9IGZ1bmN0aW9uKGxvZ2dlciwgbG9jaykge1xuICBpZih0eXBlb2YgbG9jayA9PT0gJ3VuZGVmaW5lZCcgfHwgbG9jaykge1xuICAgIGxvZ2dlci5mbGFncyB8PSBmb3JnZS5sb2cuTEVWRUxfTE9DS0VEO1xuICB9IGVsc2Uge1xuICAgIGxvZ2dlci5mbGFncyAmPSB+Zm9yZ2UubG9nLkxFVkVMX0xPQ0tFRDtcbiAgfVxufTtcblxuLyoqXG4gKiBBZGRzIGEgbG9nZ2VyLlxuICpcbiAqIEBwYXJhbSBsb2dnZXIgdGhlIGxvZ2dlciBvYmplY3QuXG4gKi9cbmZvcmdlLmxvZy5hZGRMb2dnZXIgPSBmdW5jdGlvbihsb2dnZXIpIHtcbiAgc0xvZ2dlcnMucHVzaChsb2dnZXIpO1xufTtcblxuLy8gc2V0dXAgdGhlIGNvbnNvbGUgbG9nZ2VyIGlmIHBvc3NpYmxlLCBlbHNlIGNyZWF0ZSBmYWtlIGNvbnNvbGUubG9nXG5pZih0eXBlb2YoY29uc29sZSkgIT09ICd1bmRlZmluZWQnICYmICdsb2cnIGluIGNvbnNvbGUpIHtcbiAgdmFyIGxvZ2dlcjtcbiAgaWYoY29uc29sZS5lcnJvciAmJiBjb25zb2xlLndhcm4gJiYgY29uc29sZS5pbmZvICYmIGNvbnNvbGUuZGVidWcpIHtcbiAgICAvLyBsb29rcyBsaWtlIEZpcmVidWctc3R5bGUgbG9nZ2luZyBpcyBhdmFpbGFibGVcbiAgICAvLyBsZXZlbCBoYW5kbGVycyBtYXBcbiAgICB2YXIgbGV2ZWxIYW5kbGVycyA9IHtcbiAgICAgIGVycm9yOiBjb25zb2xlLmVycm9yLFxuICAgICAgd2FybmluZzogY29uc29sZS53YXJuLFxuICAgICAgaW5mbzogY29uc29sZS5pbmZvLFxuICAgICAgZGVidWc6IGNvbnNvbGUuZGVidWcsXG4gICAgICB2ZXJib3NlOiBjb25zb2xlLmRlYnVnXG4gICAgfTtcbiAgICB2YXIgZiA9IGZ1bmN0aW9uKGxvZ2dlciwgbWVzc2FnZSkge1xuICAgICAgZm9yZ2UubG9nLnByZXBhcmVTdGFuZGFyZChtZXNzYWdlKTtcbiAgICAgIHZhciBoYW5kbGVyID0gbGV2ZWxIYW5kbGVyc1ttZXNzYWdlLmxldmVsXTtcbiAgICAgIC8vIHByZXBlbmQgc3RhbmRhcmQgbWVzc2FnZSBhbmQgY29uY2F0IGFyZ3NcbiAgICAgIHZhciBhcmdzID0gW21lc3NhZ2Uuc3RhbmRhcmRdO1xuICAgICAgYXJncyA9IGFyZ3MuY29uY2F0KG1lc3NhZ2VbJ2FyZ3VtZW50cyddLnNsaWNlKCkpO1xuICAgICAgLy8gYXBwbHkgdG8gbG93LWxldmVsIGNvbnNvbGUgZnVuY3Rpb25cbiAgICAgIGhhbmRsZXIuYXBwbHkoY29uc29sZSwgYXJncyk7XG4gICAgfTtcbiAgICBsb2dnZXIgPSBmb3JnZS5sb2cubWFrZUxvZ2dlcihmKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBvbmx5IGFwcGVhciB0byBoYXZlIGJhc2ljIGNvbnNvbGUubG9nXG4gICAgdmFyIGYgPSBmdW5jdGlvbihsb2dnZXIsIG1lc3NhZ2UpIHtcbiAgICAgIGZvcmdlLmxvZy5wcmVwYXJlU3RhbmRhcmRGdWxsKG1lc3NhZ2UpO1xuICAgICAgY29uc29sZS5sb2cobWVzc2FnZS5zdGFuZGFyZEZ1bGwpO1xuICAgIH07XG4gICAgbG9nZ2VyID0gZm9yZ2UubG9nLm1ha2VMb2dnZXIoZik7XG4gIH1cbiAgZm9yZ2UubG9nLnNldExldmVsKGxvZ2dlciwgJ2RlYnVnJyk7XG4gIGZvcmdlLmxvZy5hZGRMb2dnZXIobG9nZ2VyKTtcbiAgc0NvbnNvbGVMb2dnZXIgPSBsb2dnZXI7XG59IGVsc2Uge1xuICAvLyBkZWZpbmUgZmFrZSBjb25zb2xlLmxvZyB0byBhdm9pZCBwb3RlbnRpYWwgc2NyaXB0IGVycm9ycyBvblxuICAvLyBicm93c2VycyB0aGF0IGRvIG5vdCBoYXZlIGNvbnNvbGUgbG9nZ2luZ1xuICBjb25zb2xlID0ge1xuICAgIGxvZzogZnVuY3Rpb24oKSB7fVxuICB9O1xufVxuXG4vKlxuICogQ2hlY2sgZm9yIGxvZ2dpbmcgY29udHJvbCBxdWVyeSB2YXJzIGluIGN1cnJlbnQgVVJMLlxuICpcbiAqIGNvbnNvbGUubGV2ZWw9PGxldmVsLW5hbWU+XG4gKiBTZXQncyB0aGUgY29uc29sZSBsb2cgbGV2ZWwgYnkgbmFtZS4gIFVzZWZ1bCB0byBvdmVycmlkZSBkZWZhdWx0cyBhbmRcbiAqIGFsbG93IG1vcmUgdmVyYm9zZSBsb2dnaW5nIGJlZm9yZSBhIHVzZXIgY29uZmlnIGlzIGxvYWRlZC5cbiAqXG4gKiBjb25zb2xlLmxvY2s9PHRydWV8ZmFsc2U+XG4gKiBMb2NrIHRoZSBjb25zb2xlIGxvZyBsZXZlbCBhdCB3aGF0ZXZlciBsZXZlbCBpdCBpcyBzZXQgYXQuICBUaGlzIGlzIHJ1blxuICogYWZ0ZXIgY29uc29sZS5sZXZlbCBpcyBwcm9jZXNzZWQuICBVc2VmdWwgdG8gZm9yY2UgYSBsZXZlbCBvZiB2ZXJib3NpdHlcbiAqIHRoYXQgY291bGQgb3RoZXJ3aXNlIGJlIGxpbWl0ZWQgYnkgYSB1c2VyIGNvbmZpZy5cbiAqL1xuaWYoc0NvbnNvbGVMb2dnZXIgIT09IG51bGwgJiZcbiAgdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LmxvY2F0aW9uXG4pIHtcbiAgdmFyIHF1ZXJ5ID0gbmV3IFVSTCh3aW5kb3cubG9jYXRpb24uaHJlZikuc2VhcmNoUGFyYW1zO1xuICBpZihxdWVyeS5oYXMoJ2NvbnNvbGUubGV2ZWwnKSkge1xuICAgIC8vIHNldCB3aXRoIGxhc3QgdmFsdWVcbiAgICBmb3JnZS5sb2cuc2V0TGV2ZWwoXG4gICAgICBzQ29uc29sZUxvZ2dlciwgcXVlcnkuZ2V0KCdjb25zb2xlLmxldmVsJykuc2xpY2UoLTEpWzBdKTtcbiAgfVxuICBpZihxdWVyeS5oYXMoJ2NvbnNvbGUubG9jaycpKSB7XG4gICAgLy8gc2V0IHdpdGggbGFzdCB2YWx1ZVxuICAgIHZhciBsb2NrID0gcXVlcnkuZ2V0KCdjb25zb2xlLmxvY2snKS5zbGljZSgtMSlbMF07XG4gICAgaWYobG9jayA9PSAndHJ1ZScpIHtcbiAgICAgIGZvcmdlLmxvZy5sb2NrKHNDb25zb2xlTG9nZ2VyKTtcbiAgICB9XG4gIH1cbn1cblxuLy8gcHJvdmlkZSBwdWJsaWMgYWNjZXNzIHRvIGNvbnNvbGUgbG9nZ2VyXG5mb3JnZS5sb2cuY29uc29sZUxvZ2dlciA9IHNDb25zb2xlTG9nZ2VyO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///243\n")},function(module,exports,__webpack_require__){eval("/**\n * Node.js module for all known Forge message digests.\n *\n * @author Dave Longley\n *\n * Copyright 2011-2017 Digital Bazaar, Inc.\n */\nmodule.exports = __webpack_require__(17);\n\n__webpack_require__(55);\n__webpack_require__(32);\n__webpack_require__(82);\n__webpack_require__(90);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjQ0LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL25vZGUtZm9yZ2UvbGliL21kLmFsbC5qcz81Y2UxIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTm9kZS5qcyBtb2R1bGUgZm9yIGFsbCBrbm93biBGb3JnZSBtZXNzYWdlIGRpZ2VzdHMuXG4gKlxuICogQGF1dGhvciBEYXZlIExvbmdsZXlcbiAqXG4gKiBDb3B5cmlnaHQgMjAxMS0yMDE3IERpZ2l0YWwgQmF6YWFyLCBJbmMuXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9tZCcpO1xuXG5yZXF1aXJlKCcuL21kNScpO1xucmVxdWlyZSgnLi9zaGExJyk7XG5yZXF1aXJlKCcuL3NoYTI1NicpO1xucmVxdWlyZSgnLi9zaGE1MTInKTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///244\n")},function(module,exports,__webpack_require__){eval("/**\n * Javascript implementation of PKCS#7 v1.5.\n *\n * @author Stefan Siegl\n * @author Dave Longley\n *\n * Copyright (c) 2012 Stefan Siegl <stesie@brokenpipe.de>\n * Copyright (c) 2012-2015 Digital Bazaar, Inc.\n *\n * Currently this implementation only supports ContentType of EnvelopedData,\n * EncryptedData, or SignedData at the root level. The top level elements may\n * contain only a ContentInfo of ContentType Data, i.e. plain data. Further\n * nesting is not (yet) supported.\n *\n * The Forge validators for PKCS #7's ASN.1 structures are available from\n * a separate file pkcs7asn1.js, since those are referenced from other\n * PKCS standards like PKCS #12.\n */\nvar forge = __webpack_require__(4);\n__webpack_require__(22);\n__webpack_require__(14);\n__webpack_require__(41);\n__webpack_require__(23);\n__webpack_require__(27);\n__webpack_require__(88);\n__webpack_require__(13);\n__webpack_require__(7);\n__webpack_require__(58);\n\n// shortcut for ASN.1 API\nvar asn1 = forge.asn1;\n\n// shortcut for PKCS#7 API\nvar p7 = module.exports = forge.pkcs7 = forge.pkcs7 || {};\n\n/**\n * Converts a PKCS#7 message from PEM format.\n *\n * @param pem the PEM-formatted PKCS#7 message.\n *\n * @return the PKCS#7 message.\n */\np7.messageFromPem = function(pem) {\n  var msg = forge.pem.decode(pem)[0];\n\n  if(msg.type !== 'PKCS7') {\n    var error = new Error('Could not convert PKCS#7 message from PEM; PEM ' +\n      'header type is not \"PKCS#7\".');\n    error.headerType = msg.type;\n    throw error;\n  }\n  if(msg.procType && msg.procType.type === 'ENCRYPTED') {\n    throw new Error('Could not convert PKCS#7 message from PEM; PEM is encrypted.');\n  }\n\n  // convert DER to ASN.1 object\n  var obj = asn1.fromDer(msg.body);\n\n  return p7.messageFromAsn1(obj);\n};\n\n/**\n * Converts a PKCS#7 message to PEM format.\n *\n * @param msg The PKCS#7 message object\n * @param maxline The maximum characters per line, defaults to 64.\n *\n * @return The PEM-formatted PKCS#7 message.\n */\np7.messageToPem = function(msg, maxline) {\n  // convert to ASN.1, then DER, then PEM-encode\n  var pemObj = {\n    type: 'PKCS7',\n    body: asn1.toDer(msg.toAsn1()).getBytes()\n  };\n  return forge.pem.encode(pemObj, {maxline: maxline});\n};\n\n/**\n * Converts a PKCS#7 message from an ASN.1 object.\n *\n * @param obj the ASN.1 representation of a ContentInfo.\n *\n * @return the PKCS#7 message.\n */\np7.messageFromAsn1 = function(obj) {\n  // validate root level ContentInfo and capture data\n  var capture = {};\n  var errors = [];\n  if(!asn1.validate(obj, p7.asn1.contentInfoValidator, capture, errors)) {\n    var error = new Error('Cannot read PKCS#7 message. ' +\n      'ASN.1 object is not an PKCS#7 ContentInfo.');\n    error.errors = errors;\n    throw error;\n  }\n\n  var contentType = asn1.derToOid(capture.contentType);\n  var msg;\n\n  switch(contentType) {\n    case forge.pki.oids.envelopedData:\n      msg = p7.createEnvelopedData();\n      break;\n\n    case forge.pki.oids.encryptedData:\n      msg = p7.createEncryptedData();\n      break;\n\n    case forge.pki.oids.signedData:\n      msg = p7.createSignedData();\n      break;\n\n    default:\n      throw new Error('Cannot read PKCS#7 message. ContentType with OID ' +\n        contentType + ' is not (yet) supported.');\n  }\n\n  msg.fromAsn1(capture.content.value[0]);\n  return msg;\n};\n\np7.createSignedData = function() {\n  var msg = null;\n  msg = {\n    type: forge.pki.oids.signedData,\n    version: 1,\n    certificates: [],\n    crls: [],\n    // TODO: add json-formatted signer stuff here?\n    signers: [],\n    // populated during sign()\n    digestAlgorithmIdentifiers: [],\n    contentInfo: null,\n    signerInfos: [],\n\n    fromAsn1: function(obj) {\n      // validate SignedData content block and capture data.\n      _fromAsn1(msg, obj, p7.asn1.signedDataValidator);\n      msg.certificates = [];\n      msg.crls = [];\n      msg.digestAlgorithmIdentifiers = [];\n      msg.contentInfo = null;\n      msg.signerInfos = [];\n\n      if(msg.rawCapture.certificates) {\n        var certs = msg.rawCapture.certificates.value;\n        for(var i = 0; i < certs.length; ++i) {\n          msg.certificates.push(forge.pki.certificateFromAsn1(certs[i]));\n        }\n      }\n\n      // TODO: parse crls\n    },\n\n    toAsn1: function() {\n      // degenerate case with no content\n      if(!msg.contentInfo) {\n        msg.sign();\n      }\n\n      var certs = [];\n      for(var i = 0; i < msg.certificates.length; ++i) {\n        certs.push(forge.pki.certificateToAsn1(msg.certificates[i]));\n      }\n\n      var crls = [];\n      // TODO: implement CRLs\n\n      // [0] SignedData\n      var signedData = asn1.create(asn1.Class.CONTEXT_SPECIFIC, 0, true, [\n        asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [\n          // Version\n          asn1.create(asn1.Class.UNIVERSAL, asn1.Type.INTEGER, false,\n            asn1.integerToDer(msg.version).getBytes()),\n          // DigestAlgorithmIdentifiers\n          asn1.create(\n            asn1.Class.UNIVERSAL, asn1.Type.SET, true,\n            msg.digestAlgorithmIdentifiers),\n          // ContentInfo\n          msg.contentInfo\n        ])\n      ]);\n      if(certs.length > 0) {\n        // [0] IMPLICIT ExtendedCertificatesAndCertificates OPTIONAL\n        signedData.value[0].value.push(\n          asn1.create(asn1.Class.CONTEXT_SPECIFIC, 0, true, certs));\n      }\n      if(crls.length > 0) {\n        // [1] IMPLICIT CertificateRevocationLists OPTIONAL\n        signedData.value[0].value.push(\n          asn1.create(asn1.Class.CONTEXT_SPECIFIC, 1, true, crls));\n      }\n      // SignerInfos\n      signedData.value[0].value.push(\n        asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SET, true,\n          msg.signerInfos));\n\n      // ContentInfo\n      return asn1.create(\n        asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [\n          // ContentType\n          asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OID, false,\n            asn1.oidToDer(msg.type).getBytes()),\n          // [0] SignedData\n          signedData\n        ]);\n    },\n\n    /**\n     * Add (another) entity to list of signers.\n     *\n     * Note: If authenticatedAttributes are provided, then, per RFC 2315,\n     * they must include at least two attributes: content type and\n     * message digest. The message digest attribute value will be\n     * auto-calculated during signing and will be ignored if provided.\n     *\n     * Here's an example of providing these two attributes:\n     *\n     * forge.pkcs7.createSignedData();\n     * p7.addSigner({\n     *   issuer: cert.issuer.attributes,\n     *   serialNumber: cert.serialNumber,\n     *   key: privateKey,\n     *   digestAlgorithm: forge.pki.oids.sha1,\n     *   authenticatedAttributes: [{\n     *     type: forge.pki.oids.contentType,\n     *     value: forge.pki.oids.data\n     *   }, {\n     *     type: forge.pki.oids.messageDigest\n     *   }]\n     * });\n     *\n     * TODO: Support [subjectKeyIdentifier] as signer's ID.\n     *\n     * @param signer the signer information:\n     *          key the signer's private key.\n     *          [certificate] a certificate containing the public key\n     *            associated with the signer's private key; use this option as\n     *            an alternative to specifying signer.issuer and\n     *            signer.serialNumber.\n     *          [issuer] the issuer attributes (eg: cert.issuer.attributes).\n     *          [serialNumber] the signer's certificate's serial number in\n     *           hexadecimal (eg: cert.serialNumber).\n     *          [digestAlgorithm] the message digest OID, as a string, to use\n     *            (eg: forge.pki.oids.sha1).\n     *          [authenticatedAttributes] an optional array of attributes\n     *            to also sign along with the content.\n     */\n    addSigner: function(signer) {\n      var issuer = signer.issuer;\n      var serialNumber = signer.serialNumber;\n      if(signer.certificate) {\n        var cert = signer.certificate;\n        if(typeof cert === 'string') {\n          cert = forge.pki.certificateFromPem(cert);\n        }\n        issuer = cert.issuer.attributes;\n        serialNumber = cert.serialNumber;\n      }\n      var key = signer.key;\n      if(!key) {\n        throw new Error(\n          'Could not add PKCS#7 signer; no private key specified.');\n      }\n      if(typeof key === 'string') {\n        key = forge.pki.privateKeyFromPem(key);\n      }\n\n      // ensure OID known for digest algorithm\n      var digestAlgorithm = signer.digestAlgorithm || forge.pki.oids.sha1;\n      switch(digestAlgorithm) {\n      case forge.pki.oids.sha1:\n      case forge.pki.oids.sha256:\n      case forge.pki.oids.sha384:\n      case forge.pki.oids.sha512:\n      case forge.pki.oids.md5:\n        break;\n      default:\n        throw new Error(\n          'Could not add PKCS#7 signer; unknown message digest algorithm: ' +\n          digestAlgorithm);\n      }\n\n      // if authenticatedAttributes is present, then the attributes\n      // must contain at least PKCS #9 content-type and message-digest\n      var authenticatedAttributes = signer.authenticatedAttributes || [];\n      if(authenticatedAttributes.length > 0) {\n        var contentType = false;\n        var messageDigest = false;\n        for(var i = 0; i < authenticatedAttributes.length; ++i) {\n          var attr = authenticatedAttributes[i];\n          if(!contentType && attr.type === forge.pki.oids.contentType) {\n            contentType = true;\n            if(messageDigest) {\n              break;\n            }\n            continue;\n          }\n          if(!messageDigest && attr.type === forge.pki.oids.messageDigest) {\n            messageDigest = true;\n            if(contentType) {\n              break;\n            }\n            continue;\n          }\n        }\n\n        if(!contentType || !messageDigest) {\n          throw new Error('Invalid signer.authenticatedAttributes. If ' +\n            'signer.authenticatedAttributes is specified, then it must ' +\n            'contain at least two attributes, PKCS #9 content-type and ' +\n            'PKCS #9 message-digest.');\n        }\n      }\n\n      msg.signers.push({\n        key: key,\n        version: 1,\n        issuer: issuer,\n        serialNumber: serialNumber,\n        digestAlgorithm: digestAlgorithm,\n        signatureAlgorithm: forge.pki.oids.rsaEncryption,\n        signature: null,\n        authenticatedAttributes: authenticatedAttributes,\n        unauthenticatedAttributes: []\n      });\n    },\n\n    /**\n     * Signs the content.\n     * @param options Options to apply when signing:\n     *    [detached] boolean. If signing should be done in detached mode. Defaults to false.\n     */\n    sign: function(options) {\n      options = options || {};\n      // auto-generate content info\n      if(typeof msg.content !== 'object' || msg.contentInfo === null) {\n        // use Data ContentInfo\n        msg.contentInfo = asn1.create(\n          asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [\n            // ContentType\n            asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OID, false,\n              asn1.oidToDer(forge.pki.oids.data).getBytes())\n          ]);\n\n        // add actual content, if present\n        if('content' in msg) {\n          var content;\n          if(msg.content instanceof forge.util.ByteBuffer) {\n            content = msg.content.bytes();\n          } else if(typeof msg.content === 'string') {\n            content = forge.util.encodeUtf8(msg.content);\n          }\n\n          if (options.detached) {\n            msg.detachedContent = asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OCTETSTRING, false, content);\n          } else {\n            msg.contentInfo.value.push(\n              // [0] EXPLICIT content\n              asn1.create(asn1.Class.CONTEXT_SPECIFIC, 0, true, [\n                asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OCTETSTRING, false,\n                  content)\n              ]));\n          }\n        }\n      }\n\n      // no signers, return early (degenerate case for certificate container)\n      if(msg.signers.length === 0) {\n        return;\n      }\n\n      // generate digest algorithm identifiers\n      var mds = addDigestAlgorithmIds();\n\n      // generate signerInfos\n      addSignerInfos(mds);\n    },\n\n    verify: function() {\n      throw new Error('PKCS#7 signature verification not yet implemented.');\n    },\n\n    /**\n     * Add a certificate.\n     *\n     * @param cert the certificate to add.\n     */\n    addCertificate: function(cert) {\n      // convert from PEM\n      if(typeof cert === 'string') {\n        cert = forge.pki.certificateFromPem(cert);\n      }\n      msg.certificates.push(cert);\n    },\n\n    /**\n     * Add a certificate revokation list.\n     *\n     * @param crl the certificate revokation list to add.\n     */\n    addCertificateRevokationList: function(crl) {\n      throw new Error('PKCS#7 CRL support not yet implemented.');\n    }\n  };\n  return msg;\n\n  function addDigestAlgorithmIds() {\n    var mds = {};\n\n    for(var i = 0; i < msg.signers.length; ++i) {\n      var signer = msg.signers[i];\n      var oid = signer.digestAlgorithm;\n      if(!(oid in mds)) {\n        // content digest\n        mds[oid] = forge.md[forge.pki.oids[oid]].create();\n      }\n      if(signer.authenticatedAttributes.length === 0) {\n        // no custom attributes to digest; use content message digest\n        signer.md = mds[oid];\n      } else {\n        // custom attributes to be digested; use own message digest\n        // TODO: optimize to just copy message digest state if that\n        // feature is ever supported with message digests\n        signer.md = forge.md[forge.pki.oids[oid]].create();\n      }\n    }\n\n    // add unique digest algorithm identifiers\n    msg.digestAlgorithmIdentifiers = [];\n    for(var oid in mds) {\n      msg.digestAlgorithmIdentifiers.push(\n        // AlgorithmIdentifier\n        asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [\n          // algorithm\n          asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OID, false,\n            asn1.oidToDer(oid).getBytes()),\n          // parameters (null)\n          asn1.create(asn1.Class.UNIVERSAL, asn1.Type.NULL, false, '')\n        ]));\n    }\n\n    return mds;\n  }\n\n  function addSignerInfos(mds) {\n    var content;\n\n    if (msg.detachedContent) {\n      // Signature has been made in detached mode.\n      content = msg.detachedContent;\n    } else {\n      // Note: ContentInfo is a SEQUENCE with 2 values, second value is\n      // the content field and is optional for a ContentInfo but required here\n      // since signers are present\n      // get ContentInfo content\n      content = msg.contentInfo.value[1];\n      // skip [0] EXPLICIT content wrapper\n      content = content.value[0];\n    }\n\n    if(!content) {\n      throw new Error(\n        'Could not sign PKCS#7 message; there is no content to sign.');\n    }\n\n    // get ContentInfo content type\n    var contentType = asn1.derToOid(msg.contentInfo.value[0].value);\n\n    // serialize content\n    var bytes = asn1.toDer(content);\n\n    // skip identifier and length per RFC 2315 9.3\n    // skip identifier (1 byte)\n    bytes.getByte();\n    // read and discard length bytes\n    asn1.getBerValueLength(bytes);\n    bytes = bytes.getBytes();\n\n    // digest content DER value bytes\n    for(var oid in mds) {\n      mds[oid].start().update(bytes);\n    }\n\n    // sign content\n    var signingTime = new Date();\n    for(var i = 0; i < msg.signers.length; ++i) {\n      var signer = msg.signers[i];\n\n      if(signer.authenticatedAttributes.length === 0) {\n        // if ContentInfo content type is not \"Data\", then\n        // authenticatedAttributes must be present per RFC 2315\n        if(contentType !== forge.pki.oids.data) {\n          throw new Error(\n            'Invalid signer; authenticatedAttributes must be present ' +\n            'when the ContentInfo content type is not PKCS#7 Data.');\n        }\n      } else {\n        // process authenticated attributes\n        // [0] IMPLICIT\n        signer.authenticatedAttributesAsn1 = asn1.create(\n          asn1.Class.CONTEXT_SPECIFIC, 0, true, []);\n\n        // per RFC 2315, attributes are to be digested using a SET container\n        // not the above [0] IMPLICIT container\n        var attrsAsn1 = asn1.create(\n          asn1.Class.UNIVERSAL, asn1.Type.SET, true, []);\n\n        for(var ai = 0; ai < signer.authenticatedAttributes.length; ++ai) {\n          var attr = signer.authenticatedAttributes[ai];\n          if(attr.type === forge.pki.oids.messageDigest) {\n            // use content message digest as value\n            attr.value = mds[signer.digestAlgorithm].digest();\n          } else if(attr.type === forge.pki.oids.signingTime) {\n            // auto-populate signing time if not already set\n            if(!attr.value) {\n              attr.value = signingTime;\n            }\n          }\n\n          // convert to ASN.1 and push onto Attributes SET (for signing) and\n          // onto authenticatedAttributesAsn1 to complete SignedData ASN.1\n          // TODO: optimize away duplication\n          attrsAsn1.value.push(_attributeToAsn1(attr));\n          signer.authenticatedAttributesAsn1.value.push(_attributeToAsn1(attr));\n        }\n\n        // DER-serialize and digest SET OF attributes only\n        bytes = asn1.toDer(attrsAsn1).getBytes();\n        signer.md.start().update(bytes);\n      }\n\n      // sign digest\n      signer.signature = signer.key.sign(signer.md, 'RSASSA-PKCS1-V1_5');\n    }\n\n    // add signer info\n    msg.signerInfos = _signersToAsn1(msg.signers);\n  }\n};\n\n/**\n * Creates an empty PKCS#7 message of type EncryptedData.\n *\n * @return the message.\n */\np7.createEncryptedData = function() {\n  var msg = null;\n  msg = {\n    type: forge.pki.oids.encryptedData,\n    version: 0,\n    encryptedContent: {\n      algorithm: forge.pki.oids['aes256-CBC']\n    },\n\n    /**\n     * Reads an EncryptedData content block (in ASN.1 format)\n     *\n     * @param obj The ASN.1 representation of the EncryptedData content block\n     */\n    fromAsn1: function(obj) {\n      // Validate EncryptedData content block and capture data.\n      _fromAsn1(msg, obj, p7.asn1.encryptedDataValidator);\n    },\n\n    /**\n     * Decrypt encrypted content\n     *\n     * @param key The (symmetric) key as a byte buffer\n     */\n    decrypt: function(key) {\n      if(key !== undefined) {\n        msg.encryptedContent.key = key;\n      }\n      _decryptContent(msg);\n    }\n  };\n  return msg;\n};\n\n/**\n * Creates an empty PKCS#7 message of type EnvelopedData.\n *\n * @return the message.\n */\np7.createEnvelopedData = function() {\n  var msg = null;\n  msg = {\n    type: forge.pki.oids.envelopedData,\n    version: 0,\n    recipients: [],\n    encryptedContent: {\n      algorithm: forge.pki.oids['aes256-CBC']\n    },\n\n    /**\n     * Reads an EnvelopedData content block (in ASN.1 format)\n     *\n     * @param obj the ASN.1 representation of the EnvelopedData content block.\n     */\n    fromAsn1: function(obj) {\n      // validate EnvelopedData content block and capture data\n      var capture = _fromAsn1(msg, obj, p7.asn1.envelopedDataValidator);\n      msg.recipients = _recipientsFromAsn1(capture.recipientInfos.value);\n    },\n\n    toAsn1: function() {\n      // ContentInfo\n      return asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [\n        // ContentType\n        asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OID, false,\n          asn1.oidToDer(msg.type).getBytes()),\n        // [0] EnvelopedData\n        asn1.create(asn1.Class.CONTEXT_SPECIFIC, 0, true, [\n          asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [\n            // Version\n            asn1.create(asn1.Class.UNIVERSAL, asn1.Type.INTEGER, false,\n              asn1.integerToDer(msg.version).getBytes()),\n            // RecipientInfos\n            asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SET, true,\n              _recipientsToAsn1(msg.recipients)),\n            // EncryptedContentInfo\n            asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true,\n              _encryptedContentToAsn1(msg.encryptedContent))\n          ])\n        ])\n      ]);\n    },\n\n    /**\n     * Find recipient by X.509 certificate's issuer.\n     *\n     * @param cert the certificate with the issuer to look for.\n     *\n     * @return the recipient object.\n     */\n    findRecipient: function(cert) {\n      var sAttr = cert.issuer.attributes;\n\n      for(var i = 0; i < msg.recipients.length; ++i) {\n        var r = msg.recipients[i];\n        var rAttr = r.issuer;\n\n        if(r.serialNumber !== cert.serialNumber) {\n          continue;\n        }\n\n        if(rAttr.length !== sAttr.length) {\n          continue;\n        }\n\n        var match = true;\n        for(var j = 0; j < sAttr.length; ++j) {\n          if(rAttr[j].type !== sAttr[j].type ||\n            rAttr[j].value !== sAttr[j].value) {\n            match = false;\n            break;\n          }\n        }\n\n        if(match) {\n          return r;\n        }\n      }\n\n      return null;\n    },\n\n    /**\n     * Decrypt enveloped content\n     *\n     * @param recipient The recipient object related to the private key\n     * @param privKey The (RSA) private key object\n     */\n    decrypt: function(recipient, privKey) {\n      if(msg.encryptedContent.key === undefined && recipient !== undefined &&\n        privKey !== undefined) {\n        switch(recipient.encryptedContent.algorithm) {\n          case forge.pki.oids.rsaEncryption:\n          case forge.pki.oids.desCBC:\n            var key = privKey.decrypt(recipient.encryptedContent.content);\n            msg.encryptedContent.key = forge.util.createBuffer(key);\n            break;\n\n          default:\n            throw new Error('Unsupported asymmetric cipher, ' +\n              'OID ' + recipient.encryptedContent.algorithm);\n        }\n      }\n\n      _decryptContent(msg);\n    },\n\n    /**\n     * Add (another) entity to list of recipients.\n     *\n     * @param cert The certificate of the entity to add.\n     */\n    addRecipient: function(cert) {\n      msg.recipients.push({\n        version: 0,\n        issuer: cert.issuer.attributes,\n        serialNumber: cert.serialNumber,\n        encryptedContent: {\n          // We simply assume rsaEncryption here, since forge.pki only\n          // supports RSA so far.  If the PKI module supports other\n          // ciphers one day, we need to modify this one as well.\n          algorithm: forge.pki.oids.rsaEncryption,\n          key: cert.publicKey\n        }\n      });\n    },\n\n    /**\n     * Encrypt enveloped content.\n     *\n     * This function supports two optional arguments, cipher and key, which\n     * can be used to influence symmetric encryption.  Unless cipher is\n     * provided, the cipher specified in encryptedContent.algorithm is used\n     * (defaults to AES-256-CBC).  If no key is provided, encryptedContent.key\n     * is (re-)used.  If that one's not set, a random key will be generated\n     * automatically.\n     *\n     * @param [key] The key to be used for symmetric encryption.\n     * @param [cipher] The OID of the symmetric cipher to use.\n     */\n    encrypt: function(key, cipher) {\n      // Part 1: Symmetric encryption\n      if(msg.encryptedContent.content === undefined) {\n        cipher = cipher || msg.encryptedContent.algorithm;\n        key = key || msg.encryptedContent.key;\n\n        var keyLen, ivLen, ciphFn;\n        switch(cipher) {\n          case forge.pki.oids['aes128-CBC']:\n            keyLen = 16;\n            ivLen = 16;\n            ciphFn = forge.aes.createEncryptionCipher;\n            break;\n\n          case forge.pki.oids['aes192-CBC']:\n            keyLen = 24;\n            ivLen = 16;\n            ciphFn = forge.aes.createEncryptionCipher;\n            break;\n\n          case forge.pki.oids['aes256-CBC']:\n            keyLen = 32;\n            ivLen = 16;\n            ciphFn = forge.aes.createEncryptionCipher;\n            break;\n\n          case forge.pki.oids['des-EDE3-CBC']:\n            keyLen = 24;\n            ivLen = 8;\n            ciphFn = forge.des.createEncryptionCipher;\n            break;\n\n          default:\n            throw new Error('Unsupported symmetric cipher, OID ' + cipher);\n        }\n\n        if(key === undefined) {\n          key = forge.util.createBuffer(forge.random.getBytes(keyLen));\n        } else if(key.length() != keyLen) {\n          throw new Error('Symmetric key has wrong length; ' +\n            'got ' + key.length() + ' bytes, expected ' + keyLen + '.');\n        }\n\n        // Keep a copy of the key & IV in the object, so the caller can\n        // use it for whatever reason.\n        msg.encryptedContent.algorithm = cipher;\n        msg.encryptedContent.key = key;\n        msg.encryptedContent.parameter = forge.util.createBuffer(\n          forge.random.getBytes(ivLen));\n\n        var ciph = ciphFn(key);\n        ciph.start(msg.encryptedContent.parameter.copy());\n        ciph.update(msg.content);\n\n        // The finish function does PKCS#7 padding by default, therefore\n        // no action required by us.\n        if(!ciph.finish()) {\n          throw new Error('Symmetric encryption failed.');\n        }\n\n        msg.encryptedContent.content = ciph.output;\n      }\n\n      // Part 2: asymmetric encryption for each recipient\n      for(var i = 0; i < msg.recipients.length; ++i) {\n        var recipient = msg.recipients[i];\n\n        // Nothing to do, encryption already done.\n        if(recipient.encryptedContent.content !== undefined) {\n          continue;\n        }\n\n        switch(recipient.encryptedContent.algorithm) {\n          case forge.pki.oids.rsaEncryption:\n            recipient.encryptedContent.content =\n              recipient.encryptedContent.key.encrypt(\n                msg.encryptedContent.key.data);\n            break;\n\n          default:\n            throw new Error('Unsupported asymmetric cipher, OID ' +\n              recipient.encryptedContent.algorithm);\n        }\n      }\n    }\n  };\n  return msg;\n};\n\n/**\n * Converts a single recipient from an ASN.1 object.\n *\n * @param obj the ASN.1 RecipientInfo.\n *\n * @return the recipient object.\n */\nfunction _recipientFromAsn1(obj) {\n  // validate EnvelopedData content block and capture data\n  var capture = {};\n  var errors = [];\n  if(!asn1.validate(obj, p7.asn1.recipientInfoValidator, capture, errors)) {\n    var error = new Error('Cannot read PKCS#7 RecipientInfo. ' +\n      'ASN.1 object is not an PKCS#7 RecipientInfo.');\n    error.errors = errors;\n    throw error;\n  }\n\n  return {\n    version: capture.version.charCodeAt(0),\n    issuer: forge.pki.RDNAttributesAsArray(capture.issuer),\n    serialNumber: forge.util.createBuffer(capture.serial).toHex(),\n    encryptedContent: {\n      algorithm: asn1.derToOid(capture.encAlgorithm),\n      parameter: capture.encParameter ? capture.encParameter.value : undefined,\n      content: capture.encKey\n    }\n  };\n}\n\n/**\n * Converts a single recipient object to an ASN.1 object.\n *\n * @param obj the recipient object.\n *\n * @return the ASN.1 RecipientInfo.\n */\nfunction _recipientToAsn1(obj) {\n  return asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [\n    // Version\n    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.INTEGER, false,\n      asn1.integerToDer(obj.version).getBytes()),\n    // IssuerAndSerialNumber\n    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [\n      // Name\n      forge.pki.distinguishedNameToAsn1({attributes: obj.issuer}),\n      // Serial\n      asn1.create(asn1.Class.UNIVERSAL, asn1.Type.INTEGER, false,\n        forge.util.hexToBytes(obj.serialNumber))\n    ]),\n    // KeyEncryptionAlgorithmIdentifier\n    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [\n      // Algorithm\n      asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OID, false,\n        asn1.oidToDer(obj.encryptedContent.algorithm).getBytes()),\n      // Parameter, force NULL, only RSA supported for now.\n      asn1.create(asn1.Class.UNIVERSAL, asn1.Type.NULL, false, '')\n    ]),\n    // EncryptedKey\n    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OCTETSTRING, false,\n      obj.encryptedContent.content)\n  ]);\n}\n\n/**\n * Map a set of RecipientInfo ASN.1 objects to recipient objects.\n *\n * @param infos an array of ASN.1 representations RecipientInfo (i.e. SET OF).\n *\n * @return an array of recipient objects.\n */\nfunction _recipientsFromAsn1(infos) {\n  var ret = [];\n  for(var i = 0; i < infos.length; ++i) {\n    ret.push(_recipientFromAsn1(infos[i]));\n  }\n  return ret;\n}\n\n/**\n * Map an array of recipient objects to ASN.1 RecipientInfo objects.\n *\n * @param recipients an array of recipientInfo objects.\n *\n * @return an array of ASN.1 RecipientInfos.\n */\nfunction _recipientsToAsn1(recipients) {\n  var ret = [];\n  for(var i = 0; i < recipients.length; ++i) {\n    ret.push(_recipientToAsn1(recipients[i]));\n  }\n  return ret;\n}\n\n/**\n * Converts a single signer from an ASN.1 object.\n *\n * @param obj the ASN.1 representation of a SignerInfo.\n *\n * @return the signer object.\n */\nfunction _signerFromAsn1(obj) {\n  // validate EnvelopedData content block and capture data\n  var capture = {};\n  var errors = [];\n  if(!asn1.validate(obj, p7.asn1.signerInfoValidator, capture, errors)) {\n    var error = new Error('Cannot read PKCS#7 SignerInfo. ' +\n      'ASN.1 object is not an PKCS#7 SignerInfo.');\n    error.errors = errors;\n    throw error;\n  }\n\n  var rval = {\n    version: capture.version.charCodeAt(0),\n    issuer: forge.pki.RDNAttributesAsArray(capture.issuer),\n    serialNumber: forge.util.createBuffer(capture.serial).toHex(),\n    digestAlgorithm: asn1.derToOid(capture.digestAlgorithm),\n    signatureAlgorithm: asn1.derToOid(capture.signatureAlgorithm),\n    signature: capture.signature,\n    authenticatedAttributes: [],\n    unauthenticatedAttributes: []\n  };\n\n  // TODO: convert attributes\n  var authenticatedAttributes = capture.authenticatedAttributes || [];\n  var unauthenticatedAttributes = capture.unauthenticatedAttributes || [];\n\n  return rval;\n}\n\n/**\n * Converts a single signerInfo object to an ASN.1 object.\n *\n * @param obj the signerInfo object.\n *\n * @return the ASN.1 representation of a SignerInfo.\n */\nfunction _signerToAsn1(obj) {\n  // SignerInfo\n  var rval = asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [\n    // version\n    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.INTEGER, false,\n      asn1.integerToDer(obj.version).getBytes()),\n    // issuerAndSerialNumber\n    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [\n      // name\n      forge.pki.distinguishedNameToAsn1({attributes: obj.issuer}),\n      // serial\n      asn1.create(asn1.Class.UNIVERSAL, asn1.Type.INTEGER, false,\n        forge.util.hexToBytes(obj.serialNumber))\n    ]),\n    // digestAlgorithm\n    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [\n      // algorithm\n      asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OID, false,\n        asn1.oidToDer(obj.digestAlgorithm).getBytes()),\n      // parameters (null)\n      asn1.create(asn1.Class.UNIVERSAL, asn1.Type.NULL, false, '')\n    ])\n  ]);\n\n  // authenticatedAttributes (OPTIONAL)\n  if(obj.authenticatedAttributesAsn1) {\n    // add ASN.1 previously generated during signing\n    rval.value.push(obj.authenticatedAttributesAsn1);\n  }\n\n  // digestEncryptionAlgorithm\n  rval.value.push(asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [\n    // algorithm\n    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OID, false,\n      asn1.oidToDer(obj.signatureAlgorithm).getBytes()),\n    // parameters (null)\n    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.NULL, false, '')\n  ]));\n\n  // encryptedDigest\n  rval.value.push(asn1.create(\n    asn1.Class.UNIVERSAL, asn1.Type.OCTETSTRING, false, obj.signature));\n\n  // unauthenticatedAttributes (OPTIONAL)\n  if(obj.unauthenticatedAttributes.length > 0) {\n    // [1] IMPLICIT\n    var attrsAsn1 = asn1.create(asn1.Class.CONTEXT_SPECIFIC, 1, true, []);\n    for(var i = 0; i < obj.unauthenticatedAttributes.length; ++i) {\n      var attr = obj.unauthenticatedAttributes[i];\n      attrsAsn1.values.push(_attributeToAsn1(attr));\n    }\n    rval.value.push(attrsAsn1);\n  }\n\n  return rval;\n}\n\n/**\n * Map a set of SignerInfo ASN.1 objects to an array of signer objects.\n *\n * @param signerInfoAsn1s an array of ASN.1 SignerInfos (i.e. SET OF).\n *\n * @return an array of signers objects.\n */\nfunction _signersFromAsn1(signerInfoAsn1s) {\n  var ret = [];\n  for(var i = 0; i < signerInfoAsn1s.length; ++i) {\n    ret.push(_signerFromAsn1(signerInfoAsn1s[i]));\n  }\n  return ret;\n}\n\n/**\n * Map an array of signer objects to ASN.1 objects.\n *\n * @param signers an array of signer objects.\n *\n * @return an array of ASN.1 SignerInfos.\n */\nfunction _signersToAsn1(signers) {\n  var ret = [];\n  for(var i = 0; i < signers.length; ++i) {\n    ret.push(_signerToAsn1(signers[i]));\n  }\n  return ret;\n}\n\n/**\n * Convert an attribute object to an ASN.1 Attribute.\n *\n * @param attr the attribute object.\n *\n * @return the ASN.1 Attribute.\n */\nfunction _attributeToAsn1(attr) {\n  var value;\n\n  // TODO: generalize to support more attributes\n  if(attr.type === forge.pki.oids.contentType) {\n    value = asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OID, false,\n      asn1.oidToDer(attr.value).getBytes());\n  } else if(attr.type === forge.pki.oids.messageDigest) {\n    value = asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OCTETSTRING, false,\n      attr.value.bytes());\n  } else if(attr.type === forge.pki.oids.signingTime) {\n    /* Note per RFC 2985: Dates between 1 January 1950 and 31 December 2049\n      (inclusive) MUST be encoded as UTCTime. Any dates with year values\n      before 1950 or after 2049 MUST be encoded as GeneralizedTime. [Further,]\n      UTCTime values MUST be expressed in Greenwich Mean Time (Zulu) and MUST\n      include seconds (i.e., times are YYMMDDHHMMSSZ), even where the\n      number of seconds is zero.  Midnight (GMT) must be represented as\n      \"YYMMDD000000Z\". */\n    // TODO: make these module-level constants\n    var jan_1_1950 = new Date('1950-01-01T00:00:00Z');\n    var jan_1_2050 = new Date('2050-01-01T00:00:00Z');\n    var date = attr.value;\n    if(typeof date === 'string') {\n      // try to parse date\n      var timestamp = Date.parse(date);\n      if(!isNaN(timestamp)) {\n        date = new Date(timestamp);\n      } else if(date.length === 13) {\n        // YYMMDDHHMMSSZ (13 chars for UTCTime)\n        date = asn1.utcTimeToDate(date);\n      } else {\n        // assume generalized time\n        date = asn1.generalizedTimeToDate(date);\n      }\n    }\n\n    if(date >= jan_1_1950 && date < jan_1_2050) {\n      value = asn1.create(\n        asn1.Class.UNIVERSAL, asn1.Type.UTCTIME, false,\n        asn1.dateToUtcTime(date));\n    } else {\n      value = asn1.create(\n        asn1.Class.UNIVERSAL, asn1.Type.GENERALIZEDTIME, false,\n        asn1.dateToGeneralizedTime(date));\n    }\n  }\n\n  // TODO: expose as common API call\n  // create a RelativeDistinguishedName set\n  // each value in the set is an AttributeTypeAndValue first\n  // containing the type (an OID) and second the value\n  return asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [\n    // AttributeType\n    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OID, false,\n      asn1.oidToDer(attr.type).getBytes()),\n    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SET, true, [\n      // AttributeValue\n      value\n    ])\n  ]);\n}\n\n/**\n * Map messages encrypted content to ASN.1 objects.\n *\n * @param ec The encryptedContent object of the message.\n *\n * @return ASN.1 representation of the encryptedContent object (SEQUENCE).\n */\nfunction _encryptedContentToAsn1(ec) {\n  return [\n    // ContentType, always Data for the moment\n    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OID, false,\n      asn1.oidToDer(forge.pki.oids.data).getBytes()),\n    // ContentEncryptionAlgorithmIdentifier\n    asn1.create(asn1.Class.UNIVERSAL, asn1.Type.SEQUENCE, true, [\n      // Algorithm\n      asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OID, false,\n        asn1.oidToDer(ec.algorithm).getBytes()),\n      // Parameters (IV)\n      !ec.parameter ?\n        undefined :\n        asn1.create(\n          asn1.Class.UNIVERSAL, asn1.Type.OCTETSTRING, false,\n          ec.parameter.getBytes())\n    ]),\n    // [0] EncryptedContent\n    asn1.create(asn1.Class.CONTEXT_SPECIFIC, 0, true, [\n      asn1.create(asn1.Class.UNIVERSAL, asn1.Type.OCTETSTRING, false,\n        ec.content.getBytes())\n    ])\n  ];\n}\n\n/**\n * Reads the \"common part\" of an PKCS#7 content block (in ASN.1 format)\n *\n * This function reads the \"common part\" of the PKCS#7 content blocks\n * EncryptedData and EnvelopedData, i.e. version number and symmetrically\n * encrypted content block.\n *\n * The result of the ASN.1 validate and capture process is returned\n * to allow the caller to extract further data, e.g. the list of recipients\n * in case of a EnvelopedData object.\n *\n * @param msg the PKCS#7 object to read the data to.\n * @param obj the ASN.1 representation of the content block.\n * @param validator the ASN.1 structure validator object to use.\n *\n * @return the value map captured by validator object.\n */\nfunction _fromAsn1(msg, obj, validator) {\n  var capture = {};\n  var errors = [];\n  if(!asn1.validate(obj, validator, capture, errors)) {\n    var error = new Error('Cannot read PKCS#7 message. ' +\n      'ASN.1 object is not a supported PKCS#7 message.');\n    error.errors = error;\n    throw error;\n  }\n\n  // Check contentType, so far we only support (raw) Data.\n  var contentType = asn1.derToOid(capture.contentType);\n  if(contentType !== forge.pki.oids.data) {\n    throw new Error('Unsupported PKCS#7 message. ' +\n      'Only wrapped ContentType Data supported.');\n  }\n\n  if(capture.encryptedContent) {\n    var content = '';\n    if(forge.util.isArray(capture.encryptedContent)) {\n      for(var i = 0; i < capture.encryptedContent.length; ++i) {\n        if(capture.encryptedContent[i].type !== asn1.Type.OCTETSTRING) {\n          throw new Error('Malformed PKCS#7 message, expecting encrypted ' +\n            'content constructed of only OCTET STRING objects.');\n        }\n        content += capture.encryptedContent[i].value;\n      }\n    } else {\n      content = capture.encryptedContent;\n    }\n    msg.encryptedContent = {\n      algorithm: asn1.derToOid(capture.encAlgorithm),\n      parameter: forge.util.createBuffer(capture.encParameter.value),\n      content: forge.util.createBuffer(content)\n    };\n  }\n\n  if(capture.content) {\n    var content = '';\n    if(forge.util.isArray(capture.content)) {\n      for(var i = 0; i < capture.content.length; ++i) {\n        if(capture.content[i].type !== asn1.Type.OCTETSTRING) {\n          throw new Error('Malformed PKCS#7 message, expecting ' +\n            'content constructed of only OCTET STRING objects.');\n        }\n        content += capture.content[i].value;\n      }\n    } else {\n      content = capture.content;\n    }\n    msg.content = forge.util.createBuffer(content);\n  }\n\n  msg.version = capture.version.charCodeAt(0);\n  msg.rawCapture = capture;\n\n  return capture;\n}\n\n/**\n * Decrypt the symmetrically encrypted content block of the PKCS#7 message.\n *\n * Decryption is skipped in case the PKCS#7 message object already has a\n * (decrypted) content attribute.  The algorithm, key and cipher parameters\n * (probably the iv) are taken from the encryptedContent attribute of the\n * message object.\n *\n * @param The PKCS#7 message object.\n */\nfunction _decryptContent(msg) {\n  if(msg.encryptedContent.key === undefined) {\n    throw new Error('Symmetric key not available.');\n  }\n\n  if(msg.content === undefined) {\n    var ciph;\n\n    switch(msg.encryptedContent.algorithm) {\n      case forge.pki.oids['aes128-CBC']:\n      case forge.pki.oids['aes192-CBC']:\n      case forge.pki.oids['aes256-CBC']:\n        ciph = forge.aes.createDecryptionCipher(msg.encryptedContent.key);\n        break;\n\n      case forge.pki.oids['desCBC']:\n      case forge.pki.oids['des-EDE3-CBC']:\n        ciph = forge.des.createDecryptionCipher(msg.encryptedContent.key);\n        break;\n\n      default:\n        throw new Error('Unsupported symmetric cipher, OID ' +\n          msg.encryptedContent.algorithm);\n    }\n    ciph.start(msg.encryptedContent.parameter);\n    ciph.update(msg.encryptedContent.content);\n\n    if(!ciph.finish()) {\n      throw new Error('Symmetric decryption failed.');\n    }\n\n    msg.content = ciph.output;\n  }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjQ1LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL25vZGUtZm9yZ2UvbGliL3BrY3M3LmpzPzdmOTciXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBKYXZhc2NyaXB0IGltcGxlbWVudGF0aW9uIG9mIFBLQ1MjNyB2MS41LlxuICpcbiAqIEBhdXRob3IgU3RlZmFuIFNpZWdsXG4gKiBAYXV0aG9yIERhdmUgTG9uZ2xleVxuICpcbiAqIENvcHlyaWdodCAoYykgMjAxMiBTdGVmYW4gU2llZ2wgPHN0ZXNpZUBicm9rZW5waXBlLmRlPlxuICogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTUgRGlnaXRhbCBCYXphYXIsIEluYy5cbiAqXG4gKiBDdXJyZW50bHkgdGhpcyBpbXBsZW1lbnRhdGlvbiBvbmx5IHN1cHBvcnRzIENvbnRlbnRUeXBlIG9mIEVudmVsb3BlZERhdGEsXG4gKiBFbmNyeXB0ZWREYXRhLCBvciBTaWduZWREYXRhIGF0IHRoZSByb290IGxldmVsLiBUaGUgdG9wIGxldmVsIGVsZW1lbnRzIG1heVxuICogY29udGFpbiBvbmx5IGEgQ29udGVudEluZm8gb2YgQ29udGVudFR5cGUgRGF0YSwgaS5lLiBwbGFpbiBkYXRhLiBGdXJ0aGVyXG4gKiBuZXN0aW5nIGlzIG5vdCAoeWV0KSBzdXBwb3J0ZWQuXG4gKlxuICogVGhlIEZvcmdlIHZhbGlkYXRvcnMgZm9yIFBLQ1MgIzcncyBBU04uMSBzdHJ1Y3R1cmVzIGFyZSBhdmFpbGFibGUgZnJvbVxuICogYSBzZXBhcmF0ZSBmaWxlIHBrY3M3YXNuMS5qcywgc2luY2UgdGhvc2UgYXJlIHJlZmVyZW5jZWQgZnJvbSBvdGhlclxuICogUEtDUyBzdGFuZGFyZHMgbGlrZSBQS0NTICMxMi5cbiAqL1xudmFyIGZvcmdlID0gcmVxdWlyZSgnLi9mb3JnZScpO1xucmVxdWlyZSgnLi9hZXMnKTtcbnJlcXVpcmUoJy4vYXNuMScpO1xucmVxdWlyZSgnLi9kZXMnKTtcbnJlcXVpcmUoJy4vb2lkcycpO1xucmVxdWlyZSgnLi9wZW0nKTtcbnJlcXVpcmUoJy4vcGtjczdhc24xJyk7XG5yZXF1aXJlKCcuL3JhbmRvbScpO1xucmVxdWlyZSgnLi91dGlsJyk7XG5yZXF1aXJlKCcuL3g1MDknKTtcblxuLy8gc2hvcnRjdXQgZm9yIEFTTi4xIEFQSVxudmFyIGFzbjEgPSBmb3JnZS5hc24xO1xuXG4vLyBzaG9ydGN1dCBmb3IgUEtDUyM3IEFQSVxudmFyIHA3ID0gbW9kdWxlLmV4cG9ydHMgPSBmb3JnZS5wa2NzNyA9IGZvcmdlLnBrY3M3IHx8IHt9O1xuXG4vKipcbiAqIENvbnZlcnRzIGEgUEtDUyM3IG1lc3NhZ2UgZnJvbSBQRU0gZm9ybWF0LlxuICpcbiAqIEBwYXJhbSBwZW0gdGhlIFBFTS1mb3JtYXR0ZWQgUEtDUyM3IG1lc3NhZ2UuXG4gKlxuICogQHJldHVybiB0aGUgUEtDUyM3IG1lc3NhZ2UuXG4gKi9cbnA3Lm1lc3NhZ2VGcm9tUGVtID0gZnVuY3Rpb24ocGVtKSB7XG4gIHZhciBtc2cgPSBmb3JnZS5wZW0uZGVjb2RlKHBlbSlbMF07XG5cbiAgaWYobXNnLnR5cGUgIT09ICdQS0NTNycpIHtcbiAgICB2YXIgZXJyb3IgPSBuZXcgRXJyb3IoJ0NvdWxkIG5vdCBjb252ZXJ0IFBLQ1MjNyBtZXNzYWdlIGZyb20gUEVNOyBQRU0gJyArXG4gICAgICAnaGVhZGVyIHR5cGUgaXMgbm90IFwiUEtDUyM3XCIuJyk7XG4gICAgZXJyb3IuaGVhZGVyVHlwZSA9IG1zZy50eXBlO1xuICAgIHRocm93IGVycm9yO1xuICB9XG4gIGlmKG1zZy5wcm9jVHlwZSAmJiBtc2cucHJvY1R5cGUudHlwZSA9PT0gJ0VOQ1JZUFRFRCcpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCBjb252ZXJ0IFBLQ1MjNyBtZXNzYWdlIGZyb20gUEVNOyBQRU0gaXMgZW5jcnlwdGVkLicpO1xuICB9XG5cbiAgLy8gY29udmVydCBERVIgdG8gQVNOLjEgb2JqZWN0XG4gIHZhciBvYmogPSBhc24xLmZyb21EZXIobXNnLmJvZHkpO1xuXG4gIHJldHVybiBwNy5tZXNzYWdlRnJvbUFzbjEob2JqKTtcbn07XG5cbi8qKlxuICogQ29udmVydHMgYSBQS0NTIzcgbWVzc2FnZSB0byBQRU0gZm9ybWF0LlxuICpcbiAqIEBwYXJhbSBtc2cgVGhlIFBLQ1MjNyBtZXNzYWdlIG9iamVjdFxuICogQHBhcmFtIG1heGxpbmUgVGhlIG1heGltdW0gY2hhcmFjdGVycyBwZXIgbGluZSwgZGVmYXVsdHMgdG8gNjQuXG4gKlxuICogQHJldHVybiBUaGUgUEVNLWZvcm1hdHRlZCBQS0NTIzcgbWVzc2FnZS5cbiAqL1xucDcubWVzc2FnZVRvUGVtID0gZnVuY3Rpb24obXNnLCBtYXhsaW5lKSB7XG4gIC8vIGNvbnZlcnQgdG8gQVNOLjEsIHRoZW4gREVSLCB0aGVuIFBFTS1lbmNvZGVcbiAgdmFyIHBlbU9iaiA9IHtcbiAgICB0eXBlOiAnUEtDUzcnLFxuICAgIGJvZHk6IGFzbjEudG9EZXIobXNnLnRvQXNuMSgpKS5nZXRCeXRlcygpXG4gIH07XG4gIHJldHVybiBmb3JnZS5wZW0uZW5jb2RlKHBlbU9iaiwge21heGxpbmU6IG1heGxpbmV9KTtcbn07XG5cbi8qKlxuICogQ29udmVydHMgYSBQS0NTIzcgbWVzc2FnZSBmcm9tIGFuIEFTTi4xIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0gb2JqIHRoZSBBU04uMSByZXByZXNlbnRhdGlvbiBvZiBhIENvbnRlbnRJbmZvLlxuICpcbiAqIEByZXR1cm4gdGhlIFBLQ1MjNyBtZXNzYWdlLlxuICovXG5wNy5tZXNzYWdlRnJvbUFzbjEgPSBmdW5jdGlvbihvYmopIHtcbiAgLy8gdmFsaWRhdGUgcm9vdCBsZXZlbCBDb250ZW50SW5mbyBhbmQgY2FwdHVyZSBkYXRhXG4gIHZhciBjYXB0dXJlID0ge307XG4gIHZhciBlcnJvcnMgPSBbXTtcbiAgaWYoIWFzbjEudmFsaWRhdGUob2JqLCBwNy5hc24xLmNvbnRlbnRJbmZvVmFsaWRhdG9yLCBjYXB0dXJlLCBlcnJvcnMpKSB7XG4gICAgdmFyIGVycm9yID0gbmV3IEVycm9yKCdDYW5ub3QgcmVhZCBQS0NTIzcgbWVzc2FnZS4gJyArXG4gICAgICAnQVNOLjEgb2JqZWN0IGlzIG5vdCBhbiBQS0NTIzcgQ29udGVudEluZm8uJyk7XG4gICAgZXJyb3IuZXJyb3JzID0gZXJyb3JzO1xuICAgIHRocm93IGVycm9yO1xuICB9XG5cbiAgdmFyIGNvbnRlbnRUeXBlID0gYXNuMS5kZXJUb09pZChjYXB0dXJlLmNvbnRlbnRUeXBlKTtcbiAgdmFyIG1zZztcblxuICBzd2l0Y2goY29udGVudFR5cGUpIHtcbiAgICBjYXNlIGZvcmdlLnBraS5vaWRzLmVudmVsb3BlZERhdGE6XG4gICAgICBtc2cgPSBwNy5jcmVhdGVFbnZlbG9wZWREYXRhKCk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgZm9yZ2UucGtpLm9pZHMuZW5jcnlwdGVkRGF0YTpcbiAgICAgIG1zZyA9IHA3LmNyZWF0ZUVuY3J5cHRlZERhdGEoKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBmb3JnZS5wa2kub2lkcy5zaWduZWREYXRhOlxuICAgICAgbXNnID0gcDcuY3JlYXRlU2lnbmVkRGF0YSgpO1xuICAgICAgYnJlYWs7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgcmVhZCBQS0NTIzcgbWVzc2FnZS4gQ29udGVudFR5cGUgd2l0aCBPSUQgJyArXG4gICAgICAgIGNvbnRlbnRUeXBlICsgJyBpcyBub3QgKHlldCkgc3VwcG9ydGVkLicpO1xuICB9XG5cbiAgbXNnLmZyb21Bc24xKGNhcHR1cmUuY29udGVudC52YWx1ZVswXSk7XG4gIHJldHVybiBtc2c7XG59O1xuXG5wNy5jcmVhdGVTaWduZWREYXRhID0gZnVuY3Rpb24oKSB7XG4gIHZhciBtc2cgPSBudWxsO1xuICBtc2cgPSB7XG4gICAgdHlwZTogZm9yZ2UucGtpLm9pZHMuc2lnbmVkRGF0YSxcbiAgICB2ZXJzaW9uOiAxLFxuICAgIGNlcnRpZmljYXRlczogW10sXG4gICAgY3JsczogW10sXG4gICAgLy8gVE9ETzogYWRkIGpzb24tZm9ybWF0dGVkIHNpZ25lciBzdHVmZiBoZXJlP1xuICAgIHNpZ25lcnM6IFtdLFxuICAgIC8vIHBvcHVsYXRlZCBkdXJpbmcgc2lnbigpXG4gICAgZGlnZXN0QWxnb3JpdGhtSWRlbnRpZmllcnM6IFtdLFxuICAgIGNvbnRlbnRJbmZvOiBudWxsLFxuICAgIHNpZ25lckluZm9zOiBbXSxcblxuICAgIGZyb21Bc24xOiBmdW5jdGlvbihvYmopIHtcbiAgICAgIC8vIHZhbGlkYXRlIFNpZ25lZERhdGEgY29udGVudCBibG9jayBhbmQgY2FwdHVyZSBkYXRhLlxuICAgICAgX2Zyb21Bc24xKG1zZywgb2JqLCBwNy5hc24xLnNpZ25lZERhdGFWYWxpZGF0b3IpO1xuICAgICAgbXNnLmNlcnRpZmljYXRlcyA9IFtdO1xuICAgICAgbXNnLmNybHMgPSBbXTtcbiAgICAgIG1zZy5kaWdlc3RBbGdvcml0aG1JZGVudGlmaWVycyA9IFtdO1xuICAgICAgbXNnLmNvbnRlbnRJbmZvID0gbnVsbDtcbiAgICAgIG1zZy5zaWduZXJJbmZvcyA9IFtdO1xuXG4gICAgICBpZihtc2cucmF3Q2FwdHVyZS5jZXJ0aWZpY2F0ZXMpIHtcbiAgICAgICAgdmFyIGNlcnRzID0gbXNnLnJhd0NhcHR1cmUuY2VydGlmaWNhdGVzLnZhbHVlO1xuICAgICAgICBmb3IodmFyIGkgPSAwOyBpIDwgY2VydHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICBtc2cuY2VydGlmaWNhdGVzLnB1c2goZm9yZ2UucGtpLmNlcnRpZmljYXRlRnJvbUFzbjEoY2VydHNbaV0pKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBUT0RPOiBwYXJzZSBjcmxzXG4gICAgfSxcblxuICAgIHRvQXNuMTogZnVuY3Rpb24oKSB7XG4gICAgICAvLyBkZWdlbmVyYXRlIGNhc2Ugd2l0aCBubyBjb250ZW50XG4gICAgICBpZighbXNnLmNvbnRlbnRJbmZvKSB7XG4gICAgICAgIG1zZy5zaWduKCk7XG4gICAgICB9XG5cbiAgICAgIHZhciBjZXJ0cyA9IFtdO1xuICAgICAgZm9yKHZhciBpID0gMDsgaSA8IG1zZy5jZXJ0aWZpY2F0ZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgY2VydHMucHVzaChmb3JnZS5wa2kuY2VydGlmaWNhdGVUb0FzbjEobXNnLmNlcnRpZmljYXRlc1tpXSkpO1xuICAgICAgfVxuXG4gICAgICB2YXIgY3JscyA9IFtdO1xuICAgICAgLy8gVE9ETzogaW1wbGVtZW50IENSTHNcblxuICAgICAgLy8gWzBdIFNpZ25lZERhdGFcbiAgICAgIHZhciBzaWduZWREYXRhID0gYXNuMS5jcmVhdGUoYXNuMS5DbGFzcy5DT05URVhUX1NQRUNJRklDLCAwLCB0cnVlLCBbXG4gICAgICAgIGFzbjEuY3JlYXRlKGFzbjEuQ2xhc3MuVU5JVkVSU0FMLCBhc24xLlR5cGUuU0VRVUVOQ0UsIHRydWUsIFtcbiAgICAgICAgICAvLyBWZXJzaW9uXG4gICAgICAgICAgYXNuMS5jcmVhdGUoYXNuMS5DbGFzcy5VTklWRVJTQUwsIGFzbjEuVHlwZS5JTlRFR0VSLCBmYWxzZSxcbiAgICAgICAgICAgIGFzbjEuaW50ZWdlclRvRGVyKG1zZy52ZXJzaW9uKS5nZXRCeXRlcygpKSxcbiAgICAgICAgICAvLyBEaWdlc3RBbGdvcml0aG1JZGVudGlmaWVyc1xuICAgICAgICAgIGFzbjEuY3JlYXRlKFxuICAgICAgICAgICAgYXNuMS5DbGFzcy5VTklWRVJTQUwsIGFzbjEuVHlwZS5TRVQsIHRydWUsXG4gICAgICAgICAgICBtc2cuZGlnZXN0QWxnb3JpdGhtSWRlbnRpZmllcnMpLFxuICAgICAgICAgIC8vIENvbnRlbnRJbmZvXG4gICAgICAgICAgbXNnLmNvbnRlbnRJbmZvXG4gICAgICAgIF0pXG4gICAgICBdKTtcbiAgICAgIGlmKGNlcnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgLy8gWzBdIElNUExJQ0lUIEV4dGVuZGVkQ2VydGlmaWNhdGVzQW5kQ2VydGlmaWNhdGVzIE9QVElPTkFMXG4gICAgICAgIHNpZ25lZERhdGEudmFsdWVbMF0udmFsdWUucHVzaChcbiAgICAgICAgICBhc24xLmNyZWF0ZShhc24xLkNsYXNzLkNPTlRFWFRfU1BFQ0lGSUMsIDAsIHRydWUsIGNlcnRzKSk7XG4gICAgICB9XG4gICAgICBpZihjcmxzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgLy8gWzFdIElNUExJQ0lUIENlcnRpZmljYXRlUmV2b2NhdGlvbkxpc3RzIE9QVElPTkFMXG4gICAgICAgIHNpZ25lZERhdGEudmFsdWVbMF0udmFsdWUucHVzaChcbiAgICAgICAgICBhc24xLmNyZWF0ZShhc24xLkNsYXNzLkNPTlRFWFRfU1BFQ0lGSUMsIDEsIHRydWUsIGNybHMpKTtcbiAgICAgIH1cbiAgICAgIC8vIFNpZ25lckluZm9zXG4gICAgICBzaWduZWREYXRhLnZhbHVlWzBdLnZhbHVlLnB1c2goXG4gICAgICAgIGFzbjEuY3JlYXRlKGFzbjEuQ2xhc3MuVU5JVkVSU0FMLCBhc24xLlR5cGUuU0VULCB0cnVlLFxuICAgICAgICAgIG1zZy5zaWduZXJJbmZvcykpO1xuXG4gICAgICAvLyBDb250ZW50SW5mb1xuICAgICAgcmV0dXJuIGFzbjEuY3JlYXRlKFxuICAgICAgICBhc24xLkNsYXNzLlVOSVZFUlNBTCwgYXNuMS5UeXBlLlNFUVVFTkNFLCB0cnVlLCBbXG4gICAgICAgICAgLy8gQ29udGVudFR5cGVcbiAgICAgICAgICBhc24xLmNyZWF0ZShhc24xLkNsYXNzLlVOSVZFUlNBTCwgYXNuMS5UeXBlLk9JRCwgZmFsc2UsXG4gICAgICAgICAgICBhc24xLm9pZFRvRGVyKG1zZy50eXBlKS5nZXRCeXRlcygpKSxcbiAgICAgICAgICAvLyBbMF0gU2lnbmVkRGF0YVxuICAgICAgICAgIHNpZ25lZERhdGFcbiAgICAgICAgXSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEFkZCAoYW5vdGhlcikgZW50aXR5IHRvIGxpc3Qgb2Ygc2lnbmVycy5cbiAgICAgKlxuICAgICAqIE5vdGU6IElmIGF1dGhlbnRpY2F0ZWRBdHRyaWJ1dGVzIGFyZSBwcm92aWRlZCwgdGhlbiwgcGVyIFJGQyAyMzE1LFxuICAgICAqIHRoZXkgbXVzdCBpbmNsdWRlIGF0IGxlYXN0IHR3byBhdHRyaWJ1dGVzOiBjb250ZW50IHR5cGUgYW5kXG4gICAgICogbWVzc2FnZSBkaWdlc3QuIFRoZSBtZXNzYWdlIGRpZ2VzdCBhdHRyaWJ1dGUgdmFsdWUgd2lsbCBiZVxuICAgICAqIGF1dG8tY2FsY3VsYXRlZCBkdXJpbmcgc2lnbmluZyBhbmQgd2lsbCBiZSBpZ25vcmVkIGlmIHByb3ZpZGVkLlxuICAgICAqXG4gICAgICogSGVyZSdzIGFuIGV4YW1wbGUgb2YgcHJvdmlkaW5nIHRoZXNlIHR3byBhdHRyaWJ1dGVzOlxuICAgICAqXG4gICAgICogZm9yZ2UucGtjczcuY3JlYXRlU2lnbmVkRGF0YSgpO1xuICAgICAqIHA3LmFkZFNpZ25lcih7XG4gICAgICogICBpc3N1ZXI6IGNlcnQuaXNzdWVyLmF0dHJpYnV0ZXMsXG4gICAgICogICBzZXJpYWxOdW1iZXI6IGNlcnQuc2VyaWFsTnVtYmVyLFxuICAgICAqICAga2V5OiBwcml2YXRlS2V5LFxuICAgICAqICAgZGlnZXN0QWxnb3JpdGhtOiBmb3JnZS5wa2kub2lkcy5zaGExLFxuICAgICAqICAgYXV0aGVudGljYXRlZEF0dHJpYnV0ZXM6IFt7XG4gICAgICogICAgIHR5cGU6IGZvcmdlLnBraS5vaWRzLmNvbnRlbnRUeXBlLFxuICAgICAqICAgICB2YWx1ZTogZm9yZ2UucGtpLm9pZHMuZGF0YVxuICAgICAqICAgfSwge1xuICAgICAqICAgICB0eXBlOiBmb3JnZS5wa2kub2lkcy5tZXNzYWdlRGlnZXN0XG4gICAgICogICB9XVxuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogVE9ETzogU3VwcG9ydCBbc3ViamVjdEtleUlkZW50aWZpZXJdIGFzIHNpZ25lcidzIElELlxuICAgICAqXG4gICAgICogQHBhcmFtIHNpZ25lciB0aGUgc2lnbmVyIGluZm9ybWF0aW9uOlxuICAgICAqICAgICAgICAgIGtleSB0aGUgc2lnbmVyJ3MgcHJpdmF0ZSBrZXkuXG4gICAgICogICAgICAgICAgW2NlcnRpZmljYXRlXSBhIGNlcnRpZmljYXRlIGNvbnRhaW5pbmcgdGhlIHB1YmxpYyBrZXlcbiAgICAgKiAgICAgICAgICAgIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2lnbmVyJ3MgcHJpdmF0ZSBrZXk7IHVzZSB0aGlzIG9wdGlvbiBhc1xuICAgICAqICAgICAgICAgICAgYW4gYWx0ZXJuYXRpdmUgdG8gc3BlY2lmeWluZyBzaWduZXIuaXNzdWVyIGFuZFxuICAgICAqICAgICAgICAgICAgc2lnbmVyLnNlcmlhbE51bWJlci5cbiAgICAgKiAgICAgICAgICBbaXNzdWVyXSB0aGUgaXNzdWVyIGF0dHJpYnV0ZXMgKGVnOiBjZXJ0Lmlzc3Vlci5hdHRyaWJ1dGVzKS5cbiAgICAgKiAgICAgICAgICBbc2VyaWFsTnVtYmVyXSB0aGUgc2lnbmVyJ3MgY2VydGlmaWNhdGUncyBzZXJpYWwgbnVtYmVyIGluXG4gICAgICogICAgICAgICAgIGhleGFkZWNpbWFsIChlZzogY2VydC5zZXJpYWxOdW1iZXIpLlxuICAgICAqICAgICAgICAgIFtkaWdlc3RBbGdvcml0aG1dIHRoZSBtZXNzYWdlIGRpZ2VzdCBPSUQsIGFzIGEgc3RyaW5nLCB0byB1c2VcbiAgICAgKiAgICAgICAgICAgIChlZzogZm9yZ2UucGtpLm9pZHMuc2hhMSkuXG4gICAgICogICAgICAgICAgW2F1dGhlbnRpY2F0ZWRBdHRyaWJ1dGVzXSBhbiBvcHRpb25hbCBhcnJheSBvZiBhdHRyaWJ1dGVzXG4gICAgICogICAgICAgICAgICB0byBhbHNvIHNpZ24gYWxvbmcgd2l0aCB0aGUgY29udGVudC5cbiAgICAgKi9cbiAgICBhZGRTaWduZXI6IGZ1bmN0aW9uKHNpZ25lcikge1xuICAgICAgdmFyIGlzc3VlciA9IHNpZ25lci5pc3N1ZXI7XG4gICAgICB2YXIgc2VyaWFsTnVtYmVyID0gc2lnbmVyLnNlcmlhbE51bWJlcjtcbiAgICAgIGlmKHNpZ25lci5jZXJ0aWZpY2F0ZSkge1xuICAgICAgICB2YXIgY2VydCA9IHNpZ25lci5jZXJ0aWZpY2F0ZTtcbiAgICAgICAgaWYodHlwZW9mIGNlcnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgY2VydCA9IGZvcmdlLnBraS5jZXJ0aWZpY2F0ZUZyb21QZW0oY2VydCk7XG4gICAgICAgIH1cbiAgICAgICAgaXNzdWVyID0gY2VydC5pc3N1ZXIuYXR0cmlidXRlcztcbiAgICAgICAgc2VyaWFsTnVtYmVyID0gY2VydC5zZXJpYWxOdW1iZXI7XG4gICAgICB9XG4gICAgICB2YXIga2V5ID0gc2lnbmVyLmtleTtcbiAgICAgIGlmKCFrZXkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICdDb3VsZCBub3QgYWRkIFBLQ1MjNyBzaWduZXI7IG5vIHByaXZhdGUga2V5IHNwZWNpZmllZC4nKTtcbiAgICAgIH1cbiAgICAgIGlmKHR5cGVvZiBrZXkgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGtleSA9IGZvcmdlLnBraS5wcml2YXRlS2V5RnJvbVBlbShrZXkpO1xuICAgICAgfVxuXG4gICAgICAvLyBlbnN1cmUgT0lEIGtub3duIGZvciBkaWdlc3QgYWxnb3JpdGhtXG4gICAgICB2YXIgZGlnZXN0QWxnb3JpdGhtID0gc2lnbmVyLmRpZ2VzdEFsZ29yaXRobSB8fCBmb3JnZS5wa2kub2lkcy5zaGExO1xuICAgICAgc3dpdGNoKGRpZ2VzdEFsZ29yaXRobSkge1xuICAgICAgY2FzZSBmb3JnZS5wa2kub2lkcy5zaGExOlxuICAgICAgY2FzZSBmb3JnZS5wa2kub2lkcy5zaGEyNTY6XG4gICAgICBjYXNlIGZvcmdlLnBraS5vaWRzLnNoYTM4NDpcbiAgICAgIGNhc2UgZm9yZ2UucGtpLm9pZHMuc2hhNTEyOlxuICAgICAgY2FzZSBmb3JnZS5wa2kub2lkcy5tZDU6XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICdDb3VsZCBub3QgYWRkIFBLQ1MjNyBzaWduZXI7IHVua25vd24gbWVzc2FnZSBkaWdlc3QgYWxnb3JpdGhtOiAnICtcbiAgICAgICAgICBkaWdlc3RBbGdvcml0aG0pO1xuICAgICAgfVxuXG4gICAgICAvLyBpZiBhdXRoZW50aWNhdGVkQXR0cmlidXRlcyBpcyBwcmVzZW50LCB0aGVuIHRoZSBhdHRyaWJ1dGVzXG4gICAgICAvLyBtdXN0IGNvbnRhaW4gYXQgbGVhc3QgUEtDUyAjOSBjb250ZW50LXR5cGUgYW5kIG1lc3NhZ2UtZGlnZXN0XG4gICAgICB2YXIgYXV0aGVudGljYXRlZEF0dHJpYnV0ZXMgPSBzaWduZXIuYXV0aGVudGljYXRlZEF0dHJpYnV0ZXMgfHwgW107XG4gICAgICBpZihhdXRoZW50aWNhdGVkQXR0cmlidXRlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHZhciBjb250ZW50VHlwZSA9IGZhbHNlO1xuICAgICAgICB2YXIgbWVzc2FnZURpZ2VzdCA9IGZhbHNlO1xuICAgICAgICBmb3IodmFyIGkgPSAwOyBpIDwgYXV0aGVudGljYXRlZEF0dHJpYnV0ZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICB2YXIgYXR0ciA9IGF1dGhlbnRpY2F0ZWRBdHRyaWJ1dGVzW2ldO1xuICAgICAgICAgIGlmKCFjb250ZW50VHlwZSAmJiBhdHRyLnR5cGUgPT09IGZvcmdlLnBraS5vaWRzLmNvbnRlbnRUeXBlKSB7XG4gICAgICAgICAgICBjb250ZW50VHlwZSA9IHRydWU7XG4gICAgICAgICAgICBpZihtZXNzYWdlRGlnZXN0KSB7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmKCFtZXNzYWdlRGlnZXN0ICYmIGF0dHIudHlwZSA9PT0gZm9yZ2UucGtpLm9pZHMubWVzc2FnZURpZ2VzdCkge1xuICAgICAgICAgICAgbWVzc2FnZURpZ2VzdCA9IHRydWU7XG4gICAgICAgICAgICBpZihjb250ZW50VHlwZSkge1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmKCFjb250ZW50VHlwZSB8fCAhbWVzc2FnZURpZ2VzdCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBzaWduZXIuYXV0aGVudGljYXRlZEF0dHJpYnV0ZXMuIElmICcgK1xuICAgICAgICAgICAgJ3NpZ25lci5hdXRoZW50aWNhdGVkQXR0cmlidXRlcyBpcyBzcGVjaWZpZWQsIHRoZW4gaXQgbXVzdCAnICtcbiAgICAgICAgICAgICdjb250YWluIGF0IGxlYXN0IHR3byBhdHRyaWJ1dGVzLCBQS0NTICM5IGNvbnRlbnQtdHlwZSBhbmQgJyArXG4gICAgICAgICAgICAnUEtDUyAjOSBtZXNzYWdlLWRpZ2VzdC4nKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBtc2cuc2lnbmVycy5wdXNoKHtcbiAgICAgICAga2V5OiBrZXksXG4gICAgICAgIHZlcnNpb246IDEsXG4gICAgICAgIGlzc3VlcjogaXNzdWVyLFxuICAgICAgICBzZXJpYWxOdW1iZXI6IHNlcmlhbE51bWJlcixcbiAgICAgICAgZGlnZXN0QWxnb3JpdGhtOiBkaWdlc3RBbGdvcml0aG0sXG4gICAgICAgIHNpZ25hdHVyZUFsZ29yaXRobTogZm9yZ2UucGtpLm9pZHMucnNhRW5jcnlwdGlvbixcbiAgICAgICAgc2lnbmF0dXJlOiBudWxsLFxuICAgICAgICBhdXRoZW50aWNhdGVkQXR0cmlidXRlczogYXV0aGVudGljYXRlZEF0dHJpYnV0ZXMsXG4gICAgICAgIHVuYXV0aGVudGljYXRlZEF0dHJpYnV0ZXM6IFtdXG4gICAgICB9KTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogU2lnbnMgdGhlIGNvbnRlbnQuXG4gICAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyB0byBhcHBseSB3aGVuIHNpZ25pbmc6XG4gICAgICogICAgW2RldGFjaGVkXSBib29sZWFuLiBJZiBzaWduaW5nIHNob3VsZCBiZSBkb25lIGluIGRldGFjaGVkIG1vZGUuIERlZmF1bHRzIHRvIGZhbHNlLlxuICAgICAqL1xuICAgIHNpZ246IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgICAgLy8gYXV0by1nZW5lcmF0ZSBjb250ZW50IGluZm9cbiAgICAgIGlmKHR5cGVvZiBtc2cuY29udGVudCAhPT0gJ29iamVjdCcgfHwgbXNnLmNvbnRlbnRJbmZvID09PSBudWxsKSB7XG4gICAgICAgIC8vIHVzZSBEYXRhIENvbnRlbnRJbmZvXG4gICAgICAgIG1zZy5jb250ZW50SW5mbyA9IGFzbjEuY3JlYXRlKFxuICAgICAgICAgIGFzbjEuQ2xhc3MuVU5JVkVSU0FMLCBhc24xLlR5cGUuU0VRVUVOQ0UsIHRydWUsIFtcbiAgICAgICAgICAgIC8vIENvbnRlbnRUeXBlXG4gICAgICAgICAgICBhc24xLmNyZWF0ZShhc24xLkNsYXNzLlVOSVZFUlNBTCwgYXNuMS5UeXBlLk9JRCwgZmFsc2UsXG4gICAgICAgICAgICAgIGFzbjEub2lkVG9EZXIoZm9yZ2UucGtpLm9pZHMuZGF0YSkuZ2V0Qnl0ZXMoKSlcbiAgICAgICAgICBdKTtcblxuICAgICAgICAvLyBhZGQgYWN0dWFsIGNvbnRlbnQsIGlmIHByZXNlbnRcbiAgICAgICAgaWYoJ2NvbnRlbnQnIGluIG1zZykge1xuICAgICAgICAgIHZhciBjb250ZW50O1xuICAgICAgICAgIGlmKG1zZy5jb250ZW50IGluc3RhbmNlb2YgZm9yZ2UudXRpbC5CeXRlQnVmZmVyKSB7XG4gICAgICAgICAgICBjb250ZW50ID0gbXNnLmNvbnRlbnQuYnl0ZXMoKTtcbiAgICAgICAgICB9IGVsc2UgaWYodHlwZW9mIG1zZy5jb250ZW50ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgY29udGVudCA9IGZvcmdlLnV0aWwuZW5jb2RlVXRmOChtc2cuY29udGVudCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKG9wdGlvbnMuZGV0YWNoZWQpIHtcbiAgICAgICAgICAgIG1zZy5kZXRhY2hlZENvbnRlbnQgPSBhc24xLmNyZWF0ZShhc24xLkNsYXNzLlVOSVZFUlNBTCwgYXNuMS5UeXBlLk9DVEVUU1RSSU5HLCBmYWxzZSwgY29udGVudCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG1zZy5jb250ZW50SW5mby52YWx1ZS5wdXNoKFxuICAgICAgICAgICAgICAvLyBbMF0gRVhQTElDSVQgY29udGVudFxuICAgICAgICAgICAgICBhc24xLmNyZWF0ZShhc24xLkNsYXNzLkNPTlRFWFRfU1BFQ0lGSUMsIDAsIHRydWUsIFtcbiAgICAgICAgICAgICAgICBhc24xLmNyZWF0ZShhc24xLkNsYXNzLlVOSVZFUlNBTCwgYXNuMS5UeXBlLk9DVEVUU1RSSU5HLCBmYWxzZSxcbiAgICAgICAgICAgICAgICAgIGNvbnRlbnQpXG4gICAgICAgICAgICAgIF0pKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gbm8gc2lnbmVycywgcmV0dXJuIGVhcmx5IChkZWdlbmVyYXRlIGNhc2UgZm9yIGNlcnRpZmljYXRlIGNvbnRhaW5lcilcbiAgICAgIGlmKG1zZy5zaWduZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIGdlbmVyYXRlIGRpZ2VzdCBhbGdvcml0aG0gaWRlbnRpZmllcnNcbiAgICAgIHZhciBtZHMgPSBhZGREaWdlc3RBbGdvcml0aG1JZHMoKTtcblxuICAgICAgLy8gZ2VuZXJhdGUgc2lnbmVySW5mb3NcbiAgICAgIGFkZFNpZ25lckluZm9zKG1kcyk7XG4gICAgfSxcblxuICAgIHZlcmlmeTogZnVuY3Rpb24oKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BLQ1MjNyBzaWduYXR1cmUgdmVyaWZpY2F0aW9uIG5vdCB5ZXQgaW1wbGVtZW50ZWQuJyk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEFkZCBhIGNlcnRpZmljYXRlLlxuICAgICAqXG4gICAgICogQHBhcmFtIGNlcnQgdGhlIGNlcnRpZmljYXRlIHRvIGFkZC5cbiAgICAgKi9cbiAgICBhZGRDZXJ0aWZpY2F0ZTogZnVuY3Rpb24oY2VydCkge1xuICAgICAgLy8gY29udmVydCBmcm9tIFBFTVxuICAgICAgaWYodHlwZW9mIGNlcnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGNlcnQgPSBmb3JnZS5wa2kuY2VydGlmaWNhdGVGcm9tUGVtKGNlcnQpO1xuICAgICAgfVxuICAgICAgbXNnLmNlcnRpZmljYXRlcy5wdXNoKGNlcnQpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBBZGQgYSBjZXJ0aWZpY2F0ZSByZXZva2F0aW9uIGxpc3QuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY3JsIHRoZSBjZXJ0aWZpY2F0ZSByZXZva2F0aW9uIGxpc3QgdG8gYWRkLlxuICAgICAqL1xuICAgIGFkZENlcnRpZmljYXRlUmV2b2thdGlvbkxpc3Q6IGZ1bmN0aW9uKGNybCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdQS0NTIzcgQ1JMIHN1cHBvcnQgbm90IHlldCBpbXBsZW1lbnRlZC4nKTtcbiAgICB9XG4gIH07XG4gIHJldHVybiBtc2c7XG5cbiAgZnVuY3Rpb24gYWRkRGlnZXN0QWxnb3JpdGhtSWRzKCkge1xuICAgIHZhciBtZHMgPSB7fTtcblxuICAgIGZvcih2YXIgaSA9IDA7IGkgPCBtc2cuc2lnbmVycy5sZW5ndGg7ICsraSkge1xuICAgICAgdmFyIHNpZ25lciA9IG1zZy5zaWduZXJzW2ldO1xuICAgICAgdmFyIG9pZCA9IHNpZ25lci5kaWdlc3RBbGdvcml0aG07XG4gICAgICBpZighKG9pZCBpbiBtZHMpKSB7XG4gICAgICAgIC8vIGNvbnRlbnQgZGlnZXN0XG4gICAgICAgIG1kc1tvaWRdID0gZm9yZ2UubWRbZm9yZ2UucGtpLm9pZHNbb2lkXV0uY3JlYXRlKCk7XG4gICAgICB9XG4gICAgICBpZihzaWduZXIuYXV0aGVudGljYXRlZEF0dHJpYnV0ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIC8vIG5vIGN1c3RvbSBhdHRyaWJ1dGVzIHRvIGRpZ2VzdDsgdXNlIGNvbnRlbnQgbWVzc2FnZSBkaWdlc3RcbiAgICAgICAgc2lnbmVyLm1kID0gbWRzW29pZF07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBjdXN0b20gYXR0cmlidXRlcyB0byBiZSBkaWdlc3RlZDsgdXNlIG93biBtZXNzYWdlIGRpZ2VzdFxuICAgICAgICAvLyBUT0RPOiBvcHRpbWl6ZSB0byBqdXN0IGNvcHkgbWVzc2FnZSBkaWdlc3Qgc3RhdGUgaWYgdGhhdFxuICAgICAgICAvLyBmZWF0dXJlIGlzIGV2ZXIgc3VwcG9ydGVkIHdpdGggbWVzc2FnZSBkaWdlc3RzXG4gICAgICAgIHNpZ25lci5tZCA9IGZvcmdlLm1kW2ZvcmdlLnBraS5vaWRzW29pZF1dLmNyZWF0ZSgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGFkZCB1bmlxdWUgZGlnZXN0IGFsZ29yaXRobSBpZGVudGlmaWVyc1xuICAgIG1zZy5kaWdlc3RBbGdvcml0aG1JZGVudGlmaWVycyA9IFtdO1xuICAgIGZvcih2YXIgb2lkIGluIG1kcykge1xuICAgICAgbXNnLmRpZ2VzdEFsZ29yaXRobUlkZW50aWZpZXJzLnB1c2goXG4gICAgICAgIC8vIEFsZ29yaXRobUlkZW50aWZpZXJcbiAgICAgICAgYXNuMS5jcmVhdGUoYXNuMS5DbGFzcy5VTklWRVJTQUwsIGFzbjEuVHlwZS5TRVFVRU5DRSwgdHJ1ZSwgW1xuICAgICAgICAgIC8vIGFsZ29yaXRobVxuICAgICAgICAgIGFzbjEuY3JlYXRlKGFzbjEuQ2xhc3MuVU5JVkVSU0FMLCBhc24xLlR5cGUuT0lELCBmYWxzZSxcbiAgICAgICAgICAgIGFzbjEub2lkVG9EZXIob2lkKS5nZXRCeXRlcygpKSxcbiAgICAgICAgICAvLyBwYXJhbWV0ZXJzIChudWxsKVxuICAgICAgICAgIGFzbjEuY3JlYXRlKGFzbjEuQ2xhc3MuVU5JVkVSU0FMLCBhc24xLlR5cGUuTlVMTCwgZmFsc2UsICcnKVxuICAgICAgICBdKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1kcztcbiAgfVxuXG4gIGZ1bmN0aW9uIGFkZFNpZ25lckluZm9zKG1kcykge1xuICAgIHZhciBjb250ZW50O1xuXG4gICAgaWYgKG1zZy5kZXRhY2hlZENvbnRlbnQpIHtcbiAgICAgIC8vIFNpZ25hdHVyZSBoYXMgYmVlbiBtYWRlIGluIGRldGFjaGVkIG1vZGUuXG4gICAgICBjb250ZW50ID0gbXNnLmRldGFjaGVkQ29udGVudDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTm90ZTogQ29udGVudEluZm8gaXMgYSBTRVFVRU5DRSB3aXRoIDIgdmFsdWVzLCBzZWNvbmQgdmFsdWUgaXNcbiAgICAgIC8vIHRoZSBjb250ZW50IGZpZWxkIGFuZCBpcyBvcHRpb25hbCBmb3IgYSBDb250ZW50SW5mbyBidXQgcmVxdWlyZWQgaGVyZVxuICAgICAgLy8gc2luY2Ugc2lnbmVycyBhcmUgcHJlc2VudFxuICAgICAgLy8gZ2V0IENvbnRlbnRJbmZvIGNvbnRlbnRcbiAgICAgIGNvbnRlbnQgPSBtc2cuY29udGVudEluZm8udmFsdWVbMV07XG4gICAgICAvLyBza2lwIFswXSBFWFBMSUNJVCBjb250ZW50IHdyYXBwZXJcbiAgICAgIGNvbnRlbnQgPSBjb250ZW50LnZhbHVlWzBdO1xuICAgIH1cblxuICAgIGlmKCFjb250ZW50KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdDb3VsZCBub3Qgc2lnbiBQS0NTIzcgbWVzc2FnZTsgdGhlcmUgaXMgbm8gY29udGVudCB0byBzaWduLicpO1xuICAgIH1cblxuICAgIC8vIGdldCBDb250ZW50SW5mbyBjb250ZW50IHR5cGVcbiAgICB2YXIgY29udGVudFR5cGUgPSBhc24xLmRlclRvT2lkKG1zZy5jb250ZW50SW5mby52YWx1ZVswXS52YWx1ZSk7XG5cbiAgICAvLyBzZXJpYWxpemUgY29udGVudFxuICAgIHZhciBieXRlcyA9IGFzbjEudG9EZXIoY29udGVudCk7XG5cbiAgICAvLyBza2lwIGlkZW50aWZpZXIgYW5kIGxlbmd0aCBwZXIgUkZDIDIzMTUgOS4zXG4gICAgLy8gc2tpcCBpZGVudGlmaWVyICgxIGJ5dGUpXG4gICAgYnl0ZXMuZ2V0Qnl0ZSgpO1xuICAgIC8vIHJlYWQgYW5kIGRpc2NhcmQgbGVuZ3RoIGJ5dGVzXG4gICAgYXNuMS5nZXRCZXJWYWx1ZUxlbmd0aChieXRlcyk7XG4gICAgYnl0ZXMgPSBieXRlcy5nZXRCeXRlcygpO1xuXG4gICAgLy8gZGlnZXN0IGNvbnRlbnQgREVSIHZhbHVlIGJ5dGVzXG4gICAgZm9yKHZhciBvaWQgaW4gbWRzKSB7XG4gICAgICBtZHNbb2lkXS5zdGFydCgpLnVwZGF0ZShieXRlcyk7XG4gICAgfVxuXG4gICAgLy8gc2lnbiBjb250ZW50XG4gICAgdmFyIHNpZ25pbmdUaW1lID0gbmV3IERhdGUoKTtcbiAgICBmb3IodmFyIGkgPSAwOyBpIDwgbXNnLnNpZ25lcnMubGVuZ3RoOyArK2kpIHtcbiAgICAgIHZhciBzaWduZXIgPSBtc2cuc2lnbmVyc1tpXTtcblxuICAgICAgaWYoc2lnbmVyLmF1dGhlbnRpY2F0ZWRBdHRyaWJ1dGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAvLyBpZiBDb250ZW50SW5mbyBjb250ZW50IHR5cGUgaXMgbm90IFwiRGF0YVwiLCB0aGVuXG4gICAgICAgIC8vIGF1dGhlbnRpY2F0ZWRBdHRyaWJ1dGVzIG11c3QgYmUgcHJlc2VudCBwZXIgUkZDIDIzMTVcbiAgICAgICAgaWYoY29udGVudFR5cGUgIT09IGZvcmdlLnBraS5vaWRzLmRhdGEpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAnSW52YWxpZCBzaWduZXI7IGF1dGhlbnRpY2F0ZWRBdHRyaWJ1dGVzIG11c3QgYmUgcHJlc2VudCAnICtcbiAgICAgICAgICAgICd3aGVuIHRoZSBDb250ZW50SW5mbyBjb250ZW50IHR5cGUgaXMgbm90IFBLQ1MjNyBEYXRhLicpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBwcm9jZXNzIGF1dGhlbnRpY2F0ZWQgYXR0cmlidXRlc1xuICAgICAgICAvLyBbMF0gSU1QTElDSVRcbiAgICAgICAgc2lnbmVyLmF1dGhlbnRpY2F0ZWRBdHRyaWJ1dGVzQXNuMSA9IGFzbjEuY3JlYXRlKFxuICAgICAgICAgIGFzbjEuQ2xhc3MuQ09OVEVYVF9TUEVDSUZJQywgMCwgdHJ1ZSwgW10pO1xuXG4gICAgICAgIC8vIHBlciBSRkMgMjMxNSwgYXR0cmlidXRlcyBhcmUgdG8gYmUgZGlnZXN0ZWQgdXNpbmcgYSBTRVQgY29udGFpbmVyXG4gICAgICAgIC8vIG5vdCB0aGUgYWJvdmUgWzBdIElNUExJQ0lUIGNvbnRhaW5lclxuICAgICAgICB2YXIgYXR0cnNBc24xID0gYXNuMS5jcmVhdGUoXG4gICAgICAgICAgYXNuMS5DbGFzcy5VTklWRVJTQUwsIGFzbjEuVHlwZS5TRVQsIHRydWUsIFtdKTtcblxuICAgICAgICBmb3IodmFyIGFpID0gMDsgYWkgPCBzaWduZXIuYXV0aGVudGljYXRlZEF0dHJpYnV0ZXMubGVuZ3RoOyArK2FpKSB7XG4gICAgICAgICAgdmFyIGF0dHIgPSBzaWduZXIuYXV0aGVudGljYXRlZEF0dHJpYnV0ZXNbYWldO1xuICAgICAgICAgIGlmKGF0dHIudHlwZSA9PT0gZm9yZ2UucGtpLm9pZHMubWVzc2FnZURpZ2VzdCkge1xuICAgICAgICAgICAgLy8gdXNlIGNvbnRlbnQgbWVzc2FnZSBkaWdlc3QgYXMgdmFsdWVcbiAgICAgICAgICAgIGF0dHIudmFsdWUgPSBtZHNbc2lnbmVyLmRpZ2VzdEFsZ29yaXRobV0uZGlnZXN0KCk7XG4gICAgICAgICAgfSBlbHNlIGlmKGF0dHIudHlwZSA9PT0gZm9yZ2UucGtpLm9pZHMuc2lnbmluZ1RpbWUpIHtcbiAgICAgICAgICAgIC8vIGF1dG8tcG9wdWxhdGUgc2lnbmluZyB0aW1lIGlmIG5vdCBhbHJlYWR5IHNldFxuICAgICAgICAgICAgaWYoIWF0dHIudmFsdWUpIHtcbiAgICAgICAgICAgICAgYXR0ci52YWx1ZSA9IHNpZ25pbmdUaW1lO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIGNvbnZlcnQgdG8gQVNOLjEgYW5kIHB1c2ggb250byBBdHRyaWJ1dGVzIFNFVCAoZm9yIHNpZ25pbmcpIGFuZFxuICAgICAgICAgIC8vIG9udG8gYXV0aGVudGljYXRlZEF0dHJpYnV0ZXNBc24xIHRvIGNvbXBsZXRlIFNpZ25lZERhdGEgQVNOLjFcbiAgICAgICAgICAvLyBUT0RPOiBvcHRpbWl6ZSBhd2F5IGR1cGxpY2F0aW9uXG4gICAgICAgICAgYXR0cnNBc24xLnZhbHVlLnB1c2goX2F0dHJpYnV0ZVRvQXNuMShhdHRyKSk7XG4gICAgICAgICAgc2lnbmVyLmF1dGhlbnRpY2F0ZWRBdHRyaWJ1dGVzQXNuMS52YWx1ZS5wdXNoKF9hdHRyaWJ1dGVUb0FzbjEoYXR0cikpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gREVSLXNlcmlhbGl6ZSBhbmQgZGlnZXN0IFNFVCBPRiBhdHRyaWJ1dGVzIG9ubHlcbiAgICAgICAgYnl0ZXMgPSBhc24xLnRvRGVyKGF0dHJzQXNuMSkuZ2V0Qnl0ZXMoKTtcbiAgICAgICAgc2lnbmVyLm1kLnN0YXJ0KCkudXBkYXRlKGJ5dGVzKTtcbiAgICAgIH1cblxuICAgICAgLy8gc2lnbiBkaWdlc3RcbiAgICAgIHNpZ25lci5zaWduYXR1cmUgPSBzaWduZXIua2V5LnNpZ24oc2lnbmVyLm1kLCAnUlNBU1NBLVBLQ1MxLVYxXzUnKTtcbiAgICB9XG5cbiAgICAvLyBhZGQgc2lnbmVyIGluZm9cbiAgICBtc2cuc2lnbmVySW5mb3MgPSBfc2lnbmVyc1RvQXNuMShtc2cuc2lnbmVycyk7XG4gIH1cbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBlbXB0eSBQS0NTIzcgbWVzc2FnZSBvZiB0eXBlIEVuY3J5cHRlZERhdGEuXG4gKlxuICogQHJldHVybiB0aGUgbWVzc2FnZS5cbiAqL1xucDcuY3JlYXRlRW5jcnlwdGVkRGF0YSA9IGZ1bmN0aW9uKCkge1xuICB2YXIgbXNnID0gbnVsbDtcbiAgbXNnID0ge1xuICAgIHR5cGU6IGZvcmdlLnBraS5vaWRzLmVuY3J5cHRlZERhdGEsXG4gICAgdmVyc2lvbjogMCxcbiAgICBlbmNyeXB0ZWRDb250ZW50OiB7XG4gICAgICBhbGdvcml0aG06IGZvcmdlLnBraS5vaWRzWydhZXMyNTYtQ0JDJ11cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUmVhZHMgYW4gRW5jcnlwdGVkRGF0YSBjb250ZW50IGJsb2NrIChpbiBBU04uMSBmb3JtYXQpXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb2JqIFRoZSBBU04uMSByZXByZXNlbnRhdGlvbiBvZiB0aGUgRW5jcnlwdGVkRGF0YSBjb250ZW50IGJsb2NrXG4gICAgICovXG4gICAgZnJvbUFzbjE6IGZ1bmN0aW9uKG9iaikge1xuICAgICAgLy8gVmFsaWRhdGUgRW5jcnlwdGVkRGF0YSBjb250ZW50IGJsb2NrIGFuZCBjYXB0dXJlIGRhdGEuXG4gICAgICBfZnJvbUFzbjEobXNnLCBvYmosIHA3LmFzbjEuZW5jcnlwdGVkRGF0YVZhbGlkYXRvcik7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIERlY3J5cHQgZW5jcnlwdGVkIGNvbnRlbnRcbiAgICAgKlxuICAgICAqIEBwYXJhbSBrZXkgVGhlIChzeW1tZXRyaWMpIGtleSBhcyBhIGJ5dGUgYnVmZmVyXG4gICAgICovXG4gICAgZGVjcnlwdDogZnVuY3Rpb24oa2V5KSB7XG4gICAgICBpZihrZXkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBtc2cuZW5jcnlwdGVkQ29udGVudC5rZXkgPSBrZXk7XG4gICAgICB9XG4gICAgICBfZGVjcnlwdENvbnRlbnQobXNnKTtcbiAgICB9XG4gIH07XG4gIHJldHVybiBtc2c7XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gZW1wdHkgUEtDUyM3IG1lc3NhZ2Ugb2YgdHlwZSBFbnZlbG9wZWREYXRhLlxuICpcbiAqIEByZXR1cm4gdGhlIG1lc3NhZ2UuXG4gKi9cbnA3LmNyZWF0ZUVudmVsb3BlZERhdGEgPSBmdW5jdGlvbigpIHtcbiAgdmFyIG1zZyA9IG51bGw7XG4gIG1zZyA9IHtcbiAgICB0eXBlOiBmb3JnZS5wa2kub2lkcy5lbnZlbG9wZWREYXRhLFxuICAgIHZlcnNpb246IDAsXG4gICAgcmVjaXBpZW50czogW10sXG4gICAgZW5jcnlwdGVkQ29udGVudDoge1xuICAgICAgYWxnb3JpdGhtOiBmb3JnZS5wa2kub2lkc1snYWVzMjU2LUNCQyddXG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFJlYWRzIGFuIEVudmVsb3BlZERhdGEgY29udGVudCBibG9jayAoaW4gQVNOLjEgZm9ybWF0KVxuICAgICAqXG4gICAgICogQHBhcmFtIG9iaiB0aGUgQVNOLjEgcmVwcmVzZW50YXRpb24gb2YgdGhlIEVudmVsb3BlZERhdGEgY29udGVudCBibG9jay5cbiAgICAgKi9cbiAgICBmcm9tQXNuMTogZnVuY3Rpb24ob2JqKSB7XG4gICAgICAvLyB2YWxpZGF0ZSBFbnZlbG9wZWREYXRhIGNvbnRlbnQgYmxvY2sgYW5kIGNhcHR1cmUgZGF0YVxuICAgICAgdmFyIGNhcHR1cmUgPSBfZnJvbUFzbjEobXNnLCBvYmosIHA3LmFzbjEuZW52ZWxvcGVkRGF0YVZhbGlkYXRvcik7XG4gICAgICBtc2cucmVjaXBpZW50cyA9IF9yZWNpcGllbnRzRnJvbUFzbjEoY2FwdHVyZS5yZWNpcGllbnRJbmZvcy52YWx1ZSk7XG4gICAgfSxcblxuICAgIHRvQXNuMTogZnVuY3Rpb24oKSB7XG4gICAgICAvLyBDb250ZW50SW5mb1xuICAgICAgcmV0dXJuIGFzbjEuY3JlYXRlKGFzbjEuQ2xhc3MuVU5JVkVSU0FMLCBhc24xLlR5cGUuU0VRVUVOQ0UsIHRydWUsIFtcbiAgICAgICAgLy8gQ29udGVudFR5cGVcbiAgICAgICAgYXNuMS5jcmVhdGUoYXNuMS5DbGFzcy5VTklWRVJTQUwsIGFzbjEuVHlwZS5PSUQsIGZhbHNlLFxuICAgICAgICAgIGFzbjEub2lkVG9EZXIobXNnLnR5cGUpLmdldEJ5dGVzKCkpLFxuICAgICAgICAvLyBbMF0gRW52ZWxvcGVkRGF0YVxuICAgICAgICBhc24xLmNyZWF0ZShhc24xLkNsYXNzLkNPTlRFWFRfU1BFQ0lGSUMsIDAsIHRydWUsIFtcbiAgICAgICAgICBhc24xLmNyZWF0ZShhc24xLkNsYXNzLlVOSVZFUlNBTCwgYXNuMS5UeXBlLlNFUVVFTkNFLCB0cnVlLCBbXG4gICAgICAgICAgICAvLyBWZXJzaW9uXG4gICAgICAgICAgICBhc24xLmNyZWF0ZShhc24xLkNsYXNzLlVOSVZFUlNBTCwgYXNuMS5UeXBlLklOVEVHRVIsIGZhbHNlLFxuICAgICAgICAgICAgICBhc24xLmludGVnZXJUb0Rlcihtc2cudmVyc2lvbikuZ2V0Qnl0ZXMoKSksXG4gICAgICAgICAgICAvLyBSZWNpcGllbnRJbmZvc1xuICAgICAgICAgICAgYXNuMS5jcmVhdGUoYXNuMS5DbGFzcy5VTklWRVJTQUwsIGFzbjEuVHlwZS5TRVQsIHRydWUsXG4gICAgICAgICAgICAgIF9yZWNpcGllbnRzVG9Bc24xKG1zZy5yZWNpcGllbnRzKSksXG4gICAgICAgICAgICAvLyBFbmNyeXB0ZWRDb250ZW50SW5mb1xuICAgICAgICAgICAgYXNuMS5jcmVhdGUoYXNuMS5DbGFzcy5VTklWRVJTQUwsIGFzbjEuVHlwZS5TRVFVRU5DRSwgdHJ1ZSxcbiAgICAgICAgICAgICAgX2VuY3J5cHRlZENvbnRlbnRUb0FzbjEobXNnLmVuY3J5cHRlZENvbnRlbnQpKVxuICAgICAgICAgIF0pXG4gICAgICAgIF0pXG4gICAgICBdKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogRmluZCByZWNpcGllbnQgYnkgWC41MDkgY2VydGlmaWNhdGUncyBpc3N1ZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY2VydCB0aGUgY2VydGlmaWNhdGUgd2l0aCB0aGUgaXNzdWVyIHRvIGxvb2sgZm9yLlxuICAgICAqXG4gICAgICogQHJldHVybiB0aGUgcmVjaXBpZW50IG9iamVjdC5cbiAgICAgKi9cbiAgICBmaW5kUmVjaXBpZW50OiBmdW5jdGlvbihjZXJ0KSB7XG4gICAgICB2YXIgc0F0dHIgPSBjZXJ0Lmlzc3Vlci5hdHRyaWJ1dGVzO1xuXG4gICAgICBmb3IodmFyIGkgPSAwOyBpIDwgbXNnLnJlY2lwaWVudHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgdmFyIHIgPSBtc2cucmVjaXBpZW50c1tpXTtcbiAgICAgICAgdmFyIHJBdHRyID0gci5pc3N1ZXI7XG5cbiAgICAgICAgaWYoci5zZXJpYWxOdW1iZXIgIT09IGNlcnQuc2VyaWFsTnVtYmVyKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZihyQXR0ci5sZW5ndGggIT09IHNBdHRyLmxlbmd0aCkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIG1hdGNoID0gdHJ1ZTtcbiAgICAgICAgZm9yKHZhciBqID0gMDsgaiA8IHNBdHRyLmxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgaWYockF0dHJbal0udHlwZSAhPT0gc0F0dHJbal0udHlwZSB8fFxuICAgICAgICAgICAgckF0dHJbal0udmFsdWUgIT09IHNBdHRyW2pdLnZhbHVlKSB7XG4gICAgICAgICAgICBtYXRjaCA9IGZhbHNlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYobWF0Y2gpIHtcbiAgICAgICAgICByZXR1cm4gcjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogRGVjcnlwdCBlbnZlbG9wZWQgY29udGVudFxuICAgICAqXG4gICAgICogQHBhcmFtIHJlY2lwaWVudCBUaGUgcmVjaXBpZW50IG9iamVjdCByZWxhdGVkIHRvIHRoZSBwcml2YXRlIGtleVxuICAgICAqIEBwYXJhbSBwcml2S2V5IFRoZSAoUlNBKSBwcml2YXRlIGtleSBvYmplY3RcbiAgICAgKi9cbiAgICBkZWNyeXB0OiBmdW5jdGlvbihyZWNpcGllbnQsIHByaXZLZXkpIHtcbiAgICAgIGlmKG1zZy5lbmNyeXB0ZWRDb250ZW50LmtleSA9PT0gdW5kZWZpbmVkICYmIHJlY2lwaWVudCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgIHByaXZLZXkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBzd2l0Y2gocmVjaXBpZW50LmVuY3J5cHRlZENvbnRlbnQuYWxnb3JpdGhtKSB7XG4gICAgICAgICAgY2FzZSBmb3JnZS5wa2kub2lkcy5yc2FFbmNyeXB0aW9uOlxuICAgICAgICAgIGNhc2UgZm9yZ2UucGtpLm9pZHMuZGVzQ0JDOlxuICAgICAgICAgICAgdmFyIGtleSA9IHByaXZLZXkuZGVjcnlwdChyZWNpcGllbnQuZW5jcnlwdGVkQ29udGVudC5jb250ZW50KTtcbiAgICAgICAgICAgIG1zZy5lbmNyeXB0ZWRDb250ZW50LmtleSA9IGZvcmdlLnV0aWwuY3JlYXRlQnVmZmVyKGtleSk7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vuc3VwcG9ydGVkIGFzeW1tZXRyaWMgY2lwaGVyLCAnICtcbiAgICAgICAgICAgICAgJ09JRCAnICsgcmVjaXBpZW50LmVuY3J5cHRlZENvbnRlbnQuYWxnb3JpdGhtKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBfZGVjcnlwdENvbnRlbnQobXNnKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQWRkIChhbm90aGVyKSBlbnRpdHkgdG8gbGlzdCBvZiByZWNpcGllbnRzLlxuICAgICAqXG4gICAgICogQHBhcmFtIGNlcnQgVGhlIGNlcnRpZmljYXRlIG9mIHRoZSBlbnRpdHkgdG8gYWRkLlxuICAgICAqL1xuICAgIGFkZFJlY2lwaWVudDogZnVuY3Rpb24oY2VydCkge1xuICAgICAgbXNnLnJlY2lwaWVudHMucHVzaCh7XG4gICAgICAgIHZlcnNpb246IDAsXG4gICAgICAgIGlzc3VlcjogY2VydC5pc3N1ZXIuYXR0cmlidXRlcyxcbiAgICAgICAgc2VyaWFsTnVtYmVyOiBjZXJ0LnNlcmlhbE51bWJlcixcbiAgICAgICAgZW5jcnlwdGVkQ29udGVudDoge1xuICAgICAgICAgIC8vIFdlIHNpbXBseSBhc3N1bWUgcnNhRW5jcnlwdGlvbiBoZXJlLCBzaW5jZSBmb3JnZS5wa2kgb25seVxuICAgICAgICAgIC8vIHN1cHBvcnRzIFJTQSBzbyBmYXIuICBJZiB0aGUgUEtJIG1vZHVsZSBzdXBwb3J0cyBvdGhlclxuICAgICAgICAgIC8vIGNpcGhlcnMgb25lIGRheSwgd2UgbmVlZCB0byBtb2RpZnkgdGhpcyBvbmUgYXMgd2VsbC5cbiAgICAgICAgICBhbGdvcml0aG06IGZvcmdlLnBraS5vaWRzLnJzYUVuY3J5cHRpb24sXG4gICAgICAgICAga2V5OiBjZXJ0LnB1YmxpY0tleVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogRW5jcnlwdCBlbnZlbG9wZWQgY29udGVudC5cbiAgICAgKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gc3VwcG9ydHMgdHdvIG9wdGlvbmFsIGFyZ3VtZW50cywgY2lwaGVyIGFuZCBrZXksIHdoaWNoXG4gICAgICogY2FuIGJlIHVzZWQgdG8gaW5mbHVlbmNlIHN5bW1ldHJpYyBlbmNyeXB0aW9uLiAgVW5sZXNzIGNpcGhlciBpc1xuICAgICAqIHByb3ZpZGVkLCB0aGUgY2lwaGVyIHNwZWNpZmllZCBpbiBlbmNyeXB0ZWRDb250ZW50LmFsZ29yaXRobSBpcyB1c2VkXG4gICAgICogKGRlZmF1bHRzIHRvIEFFUy0yNTYtQ0JDKS4gIElmIG5vIGtleSBpcyBwcm92aWRlZCwgZW5jcnlwdGVkQ29udGVudC5rZXlcbiAgICAgKiBpcyAocmUtKXVzZWQuICBJZiB0aGF0IG9uZSdzIG5vdCBzZXQsIGEgcmFuZG9tIGtleSB3aWxsIGJlIGdlbmVyYXRlZFxuICAgICAqIGF1dG9tYXRpY2FsbHkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gW2tleV0gVGhlIGtleSB0byBiZSB1c2VkIGZvciBzeW1tZXRyaWMgZW5jcnlwdGlvbi5cbiAgICAgKiBAcGFyYW0gW2NpcGhlcl0gVGhlIE9JRCBvZiB0aGUgc3ltbWV0cmljIGNpcGhlciB0byB1c2UuXG4gICAgICovXG4gICAgZW5jcnlwdDogZnVuY3Rpb24oa2V5LCBjaXBoZXIpIHtcbiAgICAgIC8vIFBhcnQgMTogU3ltbWV0cmljIGVuY3J5cHRpb25cbiAgICAgIGlmKG1zZy5lbmNyeXB0ZWRDb250ZW50LmNvbnRlbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjaXBoZXIgPSBjaXBoZXIgfHwgbXNnLmVuY3J5cHRlZENvbnRlbnQuYWxnb3JpdGhtO1xuICAgICAgICBrZXkgPSBrZXkgfHwgbXNnLmVuY3J5cHRlZENvbnRlbnQua2V5O1xuXG4gICAgICAgIHZhciBrZXlMZW4sIGl2TGVuLCBjaXBoRm47XG4gICAgICAgIHN3aXRjaChjaXBoZXIpIHtcbiAgICAgICAgICBjYXNlIGZvcmdlLnBraS5vaWRzWydhZXMxMjgtQ0JDJ106XG4gICAgICAgICAgICBrZXlMZW4gPSAxNjtcbiAgICAgICAgICAgIGl2TGVuID0gMTY7XG4gICAgICAgICAgICBjaXBoRm4gPSBmb3JnZS5hZXMuY3JlYXRlRW5jcnlwdGlvbkNpcGhlcjtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSBmb3JnZS5wa2kub2lkc1snYWVzMTkyLUNCQyddOlxuICAgICAgICAgICAga2V5TGVuID0gMjQ7XG4gICAgICAgICAgICBpdkxlbiA9IDE2O1xuICAgICAgICAgICAgY2lwaEZuID0gZm9yZ2UuYWVzLmNyZWF0ZUVuY3J5cHRpb25DaXBoZXI7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgZm9yZ2UucGtpLm9pZHNbJ2FlczI1Ni1DQkMnXTpcbiAgICAgICAgICAgIGtleUxlbiA9IDMyO1xuICAgICAgICAgICAgaXZMZW4gPSAxNjtcbiAgICAgICAgICAgIGNpcGhGbiA9IGZvcmdlLmFlcy5jcmVhdGVFbmNyeXB0aW9uQ2lwaGVyO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlIGZvcmdlLnBraS5vaWRzWydkZXMtRURFMy1DQkMnXTpcbiAgICAgICAgICAgIGtleUxlbiA9IDI0O1xuICAgICAgICAgICAgaXZMZW4gPSA4O1xuICAgICAgICAgICAgY2lwaEZuID0gZm9yZ2UuZGVzLmNyZWF0ZUVuY3J5cHRpb25DaXBoZXI7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vuc3VwcG9ydGVkIHN5bW1ldHJpYyBjaXBoZXIsIE9JRCAnICsgY2lwaGVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKGtleSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAga2V5ID0gZm9yZ2UudXRpbC5jcmVhdGVCdWZmZXIoZm9yZ2UucmFuZG9tLmdldEJ5dGVzKGtleUxlbikpO1xuICAgICAgICB9IGVsc2UgaWYoa2V5Lmxlbmd0aCgpICE9IGtleUxlbikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignU3ltbWV0cmljIGtleSBoYXMgd3JvbmcgbGVuZ3RoOyAnICtcbiAgICAgICAgICAgICdnb3QgJyArIGtleS5sZW5ndGgoKSArICcgYnl0ZXMsIGV4cGVjdGVkICcgKyBrZXlMZW4gKyAnLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gS2VlcCBhIGNvcHkgb2YgdGhlIGtleSAmIElWIGluIHRoZSBvYmplY3QsIHNvIHRoZSBjYWxsZXIgY2FuXG4gICAgICAgIC8vIHVzZSBpdCBmb3Igd2hhdGV2ZXIgcmVhc29uLlxuICAgICAgICBtc2cuZW5jcnlwdGVkQ29udGVudC5hbGdvcml0aG0gPSBjaXBoZXI7XG4gICAgICAgIG1zZy5lbmNyeXB0ZWRDb250ZW50LmtleSA9IGtleTtcbiAgICAgICAgbXNnLmVuY3J5cHRlZENvbnRlbnQucGFyYW1ldGVyID0gZm9yZ2UudXRpbC5jcmVhdGVCdWZmZXIoXG4gICAgICAgICAgZm9yZ2UucmFuZG9tLmdldEJ5dGVzKGl2TGVuKSk7XG5cbiAgICAgICAgdmFyIGNpcGggPSBjaXBoRm4oa2V5KTtcbiAgICAgICAgY2lwaC5zdGFydChtc2cuZW5jcnlwdGVkQ29udGVudC5wYXJhbWV0ZXIuY29weSgpKTtcbiAgICAgICAgY2lwaC51cGRhdGUobXNnLmNvbnRlbnQpO1xuXG4gICAgICAgIC8vIFRoZSBmaW5pc2ggZnVuY3Rpb24gZG9lcyBQS0NTIzcgcGFkZGluZyBieSBkZWZhdWx0LCB0aGVyZWZvcmVcbiAgICAgICAgLy8gbm8gYWN0aW9uIHJlcXVpcmVkIGJ5IHVzLlxuICAgICAgICBpZighY2lwaC5maW5pc2goKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignU3ltbWV0cmljIGVuY3J5cHRpb24gZmFpbGVkLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgbXNnLmVuY3J5cHRlZENvbnRlbnQuY29udGVudCA9IGNpcGgub3V0cHV0O1xuICAgICAgfVxuXG4gICAgICAvLyBQYXJ0IDI6IGFzeW1tZXRyaWMgZW5jcnlwdGlvbiBmb3IgZWFjaCByZWNpcGllbnRcbiAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCBtc2cucmVjaXBpZW50cy5sZW5ndGg7ICsraSkge1xuICAgICAgICB2YXIgcmVjaXBpZW50ID0gbXNnLnJlY2lwaWVudHNbaV07XG5cbiAgICAgICAgLy8gTm90aGluZyB0byBkbywgZW5jcnlwdGlvbiBhbHJlYWR5IGRvbmUuXG4gICAgICAgIGlmKHJlY2lwaWVudC5lbmNyeXB0ZWRDb250ZW50LmNvbnRlbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgc3dpdGNoKHJlY2lwaWVudC5lbmNyeXB0ZWRDb250ZW50LmFsZ29yaXRobSkge1xuICAgICAgICAgIGNhc2UgZm9yZ2UucGtpLm9pZHMucnNhRW5jcnlwdGlvbjpcbiAgICAgICAgICAgIHJlY2lwaWVudC5lbmNyeXB0ZWRDb250ZW50LmNvbnRlbnQgPVxuICAgICAgICAgICAgICByZWNpcGllbnQuZW5jcnlwdGVkQ29udGVudC5rZXkuZW5jcnlwdChcbiAgICAgICAgICAgICAgICBtc2cuZW5jcnlwdGVkQ29udGVudC5rZXkuZGF0YSk7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vuc3VwcG9ydGVkIGFzeW1tZXRyaWMgY2lwaGVyLCBPSUQgJyArXG4gICAgICAgICAgICAgIHJlY2lwaWVudC5lbmNyeXB0ZWRDb250ZW50LmFsZ29yaXRobSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIHJldHVybiBtc2c7XG59O1xuXG4vKipcbiAqIENvbnZlcnRzIGEgc2luZ2xlIHJlY2lwaWVudCBmcm9tIGFuIEFTTi4xIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0gb2JqIHRoZSBBU04uMSBSZWNpcGllbnRJbmZvLlxuICpcbiAqIEByZXR1cm4gdGhlIHJlY2lwaWVudCBvYmplY3QuXG4gKi9cbmZ1bmN0aW9uIF9yZWNpcGllbnRGcm9tQXNuMShvYmopIHtcbiAgLy8gdmFsaWRhdGUgRW52ZWxvcGVkRGF0YSBjb250ZW50IGJsb2NrIGFuZCBjYXB0dXJlIGRhdGFcbiAgdmFyIGNhcHR1cmUgPSB7fTtcbiAgdmFyIGVycm9ycyA9IFtdO1xuICBpZighYXNuMS52YWxpZGF0ZShvYmosIHA3LmFzbjEucmVjaXBpZW50SW5mb1ZhbGlkYXRvciwgY2FwdHVyZSwgZXJyb3JzKSkge1xuICAgIHZhciBlcnJvciA9IG5ldyBFcnJvcignQ2Fubm90IHJlYWQgUEtDUyM3IFJlY2lwaWVudEluZm8uICcgK1xuICAgICAgJ0FTTi4xIG9iamVjdCBpcyBub3QgYW4gUEtDUyM3IFJlY2lwaWVudEluZm8uJyk7XG4gICAgZXJyb3IuZXJyb3JzID0gZXJyb3JzO1xuICAgIHRocm93IGVycm9yO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB2ZXJzaW9uOiBjYXB0dXJlLnZlcnNpb24uY2hhckNvZGVBdCgwKSxcbiAgICBpc3N1ZXI6IGZvcmdlLnBraS5SRE5BdHRyaWJ1dGVzQXNBcnJheShjYXB0dXJlLmlzc3VlciksXG4gICAgc2VyaWFsTnVtYmVyOiBmb3JnZS51dGlsLmNyZWF0ZUJ1ZmZlcihjYXB0dXJlLnNlcmlhbCkudG9IZXgoKSxcbiAgICBlbmNyeXB0ZWRDb250ZW50OiB7XG4gICAgICBhbGdvcml0aG06IGFzbjEuZGVyVG9PaWQoY2FwdHVyZS5lbmNBbGdvcml0aG0pLFxuICAgICAgcGFyYW1ldGVyOiBjYXB0dXJlLmVuY1BhcmFtZXRlciA/IGNhcHR1cmUuZW5jUGFyYW1ldGVyLnZhbHVlIDogdW5kZWZpbmVkLFxuICAgICAgY29udGVudDogY2FwdHVyZS5lbmNLZXlcbiAgICB9XG4gIH07XG59XG5cbi8qKlxuICogQ29udmVydHMgYSBzaW5nbGUgcmVjaXBpZW50IG9iamVjdCB0byBhbiBBU04uMSBvYmplY3QuXG4gKlxuICogQHBhcmFtIG9iaiB0aGUgcmVjaXBpZW50IG9iamVjdC5cbiAqXG4gKiBAcmV0dXJuIHRoZSBBU04uMSBSZWNpcGllbnRJbmZvLlxuICovXG5mdW5jdGlvbiBfcmVjaXBpZW50VG9Bc24xKG9iaikge1xuICByZXR1cm4gYXNuMS5jcmVhdGUoYXNuMS5DbGFzcy5VTklWRVJTQUwsIGFzbjEuVHlwZS5TRVFVRU5DRSwgdHJ1ZSwgW1xuICAgIC8vIFZlcnNpb25cbiAgICBhc24xLmNyZWF0ZShhc24xLkNsYXNzLlVOSVZFUlNBTCwgYXNuMS5UeXBlLklOVEVHRVIsIGZhbHNlLFxuICAgICAgYXNuMS5pbnRlZ2VyVG9EZXIob2JqLnZlcnNpb24pLmdldEJ5dGVzKCkpLFxuICAgIC8vIElzc3VlckFuZFNlcmlhbE51bWJlclxuICAgIGFzbjEuY3JlYXRlKGFzbjEuQ2xhc3MuVU5JVkVSU0FMLCBhc24xLlR5cGUuU0VRVUVOQ0UsIHRydWUsIFtcbiAgICAgIC8vIE5hbWVcbiAgICAgIGZvcmdlLnBraS5kaXN0aW5ndWlzaGVkTmFtZVRvQXNuMSh7YXR0cmlidXRlczogb2JqLmlzc3Vlcn0pLFxuICAgICAgLy8gU2VyaWFsXG4gICAgICBhc24xLmNyZWF0ZShhc24xLkNsYXNzLlVOSVZFUlNBTCwgYXNuMS5UeXBlLklOVEVHRVIsIGZhbHNlLFxuICAgICAgICBmb3JnZS51dGlsLmhleFRvQnl0ZXMob2JqLnNlcmlhbE51bWJlcikpXG4gICAgXSksXG4gICAgLy8gS2V5RW5jcnlwdGlvbkFsZ29yaXRobUlkZW50aWZpZXJcbiAgICBhc24xLmNyZWF0ZShhc24xLkNsYXNzLlVOSVZFUlNBTCwgYXNuMS5UeXBlLlNFUVVFTkNFLCB0cnVlLCBbXG4gICAgICAvLyBBbGdvcml0aG1cbiAgICAgIGFzbjEuY3JlYXRlKGFzbjEuQ2xhc3MuVU5JVkVSU0FMLCBhc24xLlR5cGUuT0lELCBmYWxzZSxcbiAgICAgICAgYXNuMS5vaWRUb0RlcihvYmouZW5jcnlwdGVkQ29udGVudC5hbGdvcml0aG0pLmdldEJ5dGVzKCkpLFxuICAgICAgLy8gUGFyYW1ldGVyLCBmb3JjZSBOVUxMLCBvbmx5IFJTQSBzdXBwb3J0ZWQgZm9yIG5vdy5cbiAgICAgIGFzbjEuY3JlYXRlKGFzbjEuQ2xhc3MuVU5JVkVSU0FMLCBhc24xLlR5cGUuTlVMTCwgZmFsc2UsICcnKVxuICAgIF0pLFxuICAgIC8vIEVuY3J5cHRlZEtleVxuICAgIGFzbjEuY3JlYXRlKGFzbjEuQ2xhc3MuVU5JVkVSU0FMLCBhc24xLlR5cGUuT0NURVRTVFJJTkcsIGZhbHNlLFxuICAgICAgb2JqLmVuY3J5cHRlZENvbnRlbnQuY29udGVudClcbiAgXSk7XG59XG5cbi8qKlxuICogTWFwIGEgc2V0IG9mIFJlY2lwaWVudEluZm8gQVNOLjEgb2JqZWN0cyB0byByZWNpcGllbnQgb2JqZWN0cy5cbiAqXG4gKiBAcGFyYW0gaW5mb3MgYW4gYXJyYXkgb2YgQVNOLjEgcmVwcmVzZW50YXRpb25zIFJlY2lwaWVudEluZm8gKGkuZS4gU0VUIE9GKS5cbiAqXG4gKiBAcmV0dXJuIGFuIGFycmF5IG9mIHJlY2lwaWVudCBvYmplY3RzLlxuICovXG5mdW5jdGlvbiBfcmVjaXBpZW50c0Zyb21Bc24xKGluZm9zKSB7XG4gIHZhciByZXQgPSBbXTtcbiAgZm9yKHZhciBpID0gMDsgaSA8IGluZm9zLmxlbmd0aDsgKytpKSB7XG4gICAgcmV0LnB1c2goX3JlY2lwaWVudEZyb21Bc24xKGluZm9zW2ldKSk7XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cblxuLyoqXG4gKiBNYXAgYW4gYXJyYXkgb2YgcmVjaXBpZW50IG9iamVjdHMgdG8gQVNOLjEgUmVjaXBpZW50SW5mbyBvYmplY3RzLlxuICpcbiAqIEBwYXJhbSByZWNpcGllbnRzIGFuIGFycmF5IG9mIHJlY2lwaWVudEluZm8gb2JqZWN0cy5cbiAqXG4gKiBAcmV0dXJuIGFuIGFycmF5IG9mIEFTTi4xIFJlY2lwaWVudEluZm9zLlxuICovXG5mdW5jdGlvbiBfcmVjaXBpZW50c1RvQXNuMShyZWNpcGllbnRzKSB7XG4gIHZhciByZXQgPSBbXTtcbiAgZm9yKHZhciBpID0gMDsgaSA8IHJlY2lwaWVudHMubGVuZ3RoOyArK2kpIHtcbiAgICByZXQucHVzaChfcmVjaXBpZW50VG9Bc24xKHJlY2lwaWVudHNbaV0pKTtcbiAgfVxuICByZXR1cm4gcmV0O1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGEgc2luZ2xlIHNpZ25lciBmcm9tIGFuIEFTTi4xIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0gb2JqIHRoZSBBU04uMSByZXByZXNlbnRhdGlvbiBvZiBhIFNpZ25lckluZm8uXG4gKlxuICogQHJldHVybiB0aGUgc2lnbmVyIG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gX3NpZ25lckZyb21Bc24xKG9iaikge1xuICAvLyB2YWxpZGF0ZSBFbnZlbG9wZWREYXRhIGNvbnRlbnQgYmxvY2sgYW5kIGNhcHR1cmUgZGF0YVxuICB2YXIgY2FwdHVyZSA9IHt9O1xuICB2YXIgZXJyb3JzID0gW107XG4gIGlmKCFhc24xLnZhbGlkYXRlKG9iaiwgcDcuYXNuMS5zaWduZXJJbmZvVmFsaWRhdG9yLCBjYXB0dXJlLCBlcnJvcnMpKSB7XG4gICAgdmFyIGVycm9yID0gbmV3IEVycm9yKCdDYW5ub3QgcmVhZCBQS0NTIzcgU2lnbmVySW5mby4gJyArXG4gICAgICAnQVNOLjEgb2JqZWN0IGlzIG5vdCBhbiBQS0NTIzcgU2lnbmVySW5mby4nKTtcbiAgICBlcnJvci5lcnJvcnMgPSBlcnJvcnM7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cblxuICB2YXIgcnZhbCA9IHtcbiAgICB2ZXJzaW9uOiBjYXB0dXJlLnZlcnNpb24uY2hhckNvZGVBdCgwKSxcbiAgICBpc3N1ZXI6IGZvcmdlLnBraS5SRE5BdHRyaWJ1dGVzQXNBcnJheShjYXB0dXJlLmlzc3VlciksXG4gICAgc2VyaWFsTnVtYmVyOiBmb3JnZS51dGlsLmNyZWF0ZUJ1ZmZlcihjYXB0dXJlLnNlcmlhbCkudG9IZXgoKSxcbiAgICBkaWdlc3RBbGdvcml0aG06IGFzbjEuZGVyVG9PaWQoY2FwdHVyZS5kaWdlc3RBbGdvcml0aG0pLFxuICAgIHNpZ25hdHVyZUFsZ29yaXRobTogYXNuMS5kZXJUb09pZChjYXB0dXJlLnNpZ25hdHVyZUFsZ29yaXRobSksXG4gICAgc2lnbmF0dXJlOiBjYXB0dXJlLnNpZ25hdHVyZSxcbiAgICBhdXRoZW50aWNhdGVkQXR0cmlidXRlczogW10sXG4gICAgdW5hdXRoZW50aWNhdGVkQXR0cmlidXRlczogW11cbiAgfTtcblxuICAvLyBUT0RPOiBjb252ZXJ0IGF0dHJpYnV0ZXNcbiAgdmFyIGF1dGhlbnRpY2F0ZWRBdHRyaWJ1dGVzID0gY2FwdHVyZS5hdXRoZW50aWNhdGVkQXR0cmlidXRlcyB8fCBbXTtcbiAgdmFyIHVuYXV0aGVudGljYXRlZEF0dHJpYnV0ZXMgPSBjYXB0dXJlLnVuYXV0aGVudGljYXRlZEF0dHJpYnV0ZXMgfHwgW107XG5cbiAgcmV0dXJuIHJ2YWw7XG59XG5cbi8qKlxuICogQ29udmVydHMgYSBzaW5nbGUgc2lnbmVySW5mbyBvYmplY3QgdG8gYW4gQVNOLjEgb2JqZWN0LlxuICpcbiAqIEBwYXJhbSBvYmogdGhlIHNpZ25lckluZm8gb2JqZWN0LlxuICpcbiAqIEByZXR1cm4gdGhlIEFTTi4xIHJlcHJlc2VudGF0aW9uIG9mIGEgU2lnbmVySW5mby5cbiAqL1xuZnVuY3Rpb24gX3NpZ25lclRvQXNuMShvYmopIHtcbiAgLy8gU2lnbmVySW5mb1xuICB2YXIgcnZhbCA9IGFzbjEuY3JlYXRlKGFzbjEuQ2xhc3MuVU5JVkVSU0FMLCBhc24xLlR5cGUuU0VRVUVOQ0UsIHRydWUsIFtcbiAgICAvLyB2ZXJzaW9uXG4gICAgYXNuMS5jcmVhdGUoYXNuMS5DbGFzcy5VTklWRVJTQUwsIGFzbjEuVHlwZS5JTlRFR0VSLCBmYWxzZSxcbiAgICAgIGFzbjEuaW50ZWdlclRvRGVyKG9iai52ZXJzaW9uKS5nZXRCeXRlcygpKSxcbiAgICAvLyBpc3N1ZXJBbmRTZXJpYWxOdW1iZXJcbiAgICBhc24xLmNyZWF0ZShhc24xLkNsYXNzLlVOSVZFUlNBTCwgYXNuMS5UeXBlLlNFUVVFTkNFLCB0cnVlLCBbXG4gICAgICAvLyBuYW1lXG4gICAgICBmb3JnZS5wa2kuZGlzdGluZ3Vpc2hlZE5hbWVUb0FzbjEoe2F0dHJpYnV0ZXM6IG9iai5pc3N1ZXJ9KSxcbiAgICAgIC8vIHNlcmlhbFxuICAgICAgYXNuMS5jcmVhdGUoYXNuMS5DbGFzcy5VTklWRVJTQUwsIGFzbjEuVHlwZS5JTlRFR0VSLCBmYWxzZSxcbiAgICAgICAgZm9yZ2UudXRpbC5oZXhUb0J5dGVzKG9iai5zZXJpYWxOdW1iZXIpKVxuICAgIF0pLFxuICAgIC8vIGRpZ2VzdEFsZ29yaXRobVxuICAgIGFzbjEuY3JlYXRlKGFzbjEuQ2xhc3MuVU5JVkVSU0FMLCBhc24xLlR5cGUuU0VRVUVOQ0UsIHRydWUsIFtcbiAgICAgIC8vIGFsZ29yaXRobVxuICAgICAgYXNuMS5jcmVhdGUoYXNuMS5DbGFzcy5VTklWRVJTQUwsIGFzbjEuVHlwZS5PSUQsIGZhbHNlLFxuICAgICAgICBhc24xLm9pZFRvRGVyKG9iai5kaWdlc3RBbGdvcml0aG0pLmdldEJ5dGVzKCkpLFxuICAgICAgLy8gcGFyYW1ldGVycyAobnVsbClcbiAgICAgIGFzbjEuY3JlYXRlKGFzbjEuQ2xhc3MuVU5JVkVSU0FMLCBhc24xLlR5cGUuTlVMTCwgZmFsc2UsICcnKVxuICAgIF0pXG4gIF0pO1xuXG4gIC8vIGF1dGhlbnRpY2F0ZWRBdHRyaWJ1dGVzIChPUFRJT05BTClcbiAgaWYob2JqLmF1dGhlbnRpY2F0ZWRBdHRyaWJ1dGVzQXNuMSkge1xuICAgIC8vIGFkZCBBU04uMSBwcmV2aW91c2x5IGdlbmVyYXRlZCBkdXJpbmcgc2lnbmluZ1xuICAgIHJ2YWwudmFsdWUucHVzaChvYmouYXV0aGVudGljYXRlZEF0dHJpYnV0ZXNBc24xKTtcbiAgfVxuXG4gIC8vIGRpZ2VzdEVuY3J5cHRpb25BbGdvcml0aG1cbiAgcnZhbC52YWx1ZS5wdXNoKGFzbjEuY3JlYXRlKGFzbjEuQ2xhc3MuVU5JVkVSU0FMLCBhc24xLlR5cGUuU0VRVUVOQ0UsIHRydWUsIFtcbiAgICAvLyBhbGdvcml0aG1cbiAgICBhc24xLmNyZWF0ZShhc24xLkNsYXNzLlVOSVZFUlNBTCwgYXNuMS5UeXBlLk9JRCwgZmFsc2UsXG4gICAgICBhc24xLm9pZFRvRGVyKG9iai5zaWduYXR1cmVBbGdvcml0aG0pLmdldEJ5dGVzKCkpLFxuICAgIC8vIHBhcmFtZXRlcnMgKG51bGwpXG4gICAgYXNuMS5jcmVhdGUoYXNuMS5DbGFzcy5VTklWRVJTQUwsIGFzbjEuVHlwZS5OVUxMLCBmYWxzZSwgJycpXG4gIF0pKTtcblxuICAvLyBlbmNyeXB0ZWREaWdlc3RcbiAgcnZhbC52YWx1ZS5wdXNoKGFzbjEuY3JlYXRlKFxuICAgIGFzbjEuQ2xhc3MuVU5JVkVSU0FMLCBhc24xLlR5cGUuT0NURVRTVFJJTkcsIGZhbHNlLCBvYmouc2lnbmF0dXJlKSk7XG5cbiAgLy8gdW5hdXRoZW50aWNhdGVkQXR0cmlidXRlcyAoT1BUSU9OQUwpXG4gIGlmKG9iai51bmF1dGhlbnRpY2F0ZWRBdHRyaWJ1dGVzLmxlbmd0aCA+IDApIHtcbiAgICAvLyBbMV0gSU1QTElDSVRcbiAgICB2YXIgYXR0cnNBc24xID0gYXNuMS5jcmVhdGUoYXNuMS5DbGFzcy5DT05URVhUX1NQRUNJRklDLCAxLCB0cnVlLCBbXSk7XG4gICAgZm9yKHZhciBpID0gMDsgaSA8IG9iai51bmF1dGhlbnRpY2F0ZWRBdHRyaWJ1dGVzLmxlbmd0aDsgKytpKSB7XG4gICAgICB2YXIgYXR0ciA9IG9iai51bmF1dGhlbnRpY2F0ZWRBdHRyaWJ1dGVzW2ldO1xuICAgICAgYXR0cnNBc24xLnZhbHVlcy5wdXNoKF9hdHRyaWJ1dGVUb0FzbjEoYXR0cikpO1xuICAgIH1cbiAgICBydmFsLnZhbHVlLnB1c2goYXR0cnNBc24xKTtcbiAgfVxuXG4gIHJldHVybiBydmFsO1xufVxuXG4vKipcbiAqIE1hcCBhIHNldCBvZiBTaWduZXJJbmZvIEFTTi4xIG9iamVjdHMgdG8gYW4gYXJyYXkgb2Ygc2lnbmVyIG9iamVjdHMuXG4gKlxuICogQHBhcmFtIHNpZ25lckluZm9Bc24xcyBhbiBhcnJheSBvZiBBU04uMSBTaWduZXJJbmZvcyAoaS5lLiBTRVQgT0YpLlxuICpcbiAqIEByZXR1cm4gYW4gYXJyYXkgb2Ygc2lnbmVycyBvYmplY3RzLlxuICovXG5mdW5jdGlvbiBfc2lnbmVyc0Zyb21Bc24xKHNpZ25lckluZm9Bc24xcykge1xuICB2YXIgcmV0ID0gW107XG4gIGZvcih2YXIgaSA9IDA7IGkgPCBzaWduZXJJbmZvQXNuMXMubGVuZ3RoOyArK2kpIHtcbiAgICByZXQucHVzaChfc2lnbmVyRnJvbUFzbjEoc2lnbmVySW5mb0FzbjFzW2ldKSk7XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cblxuLyoqXG4gKiBNYXAgYW4gYXJyYXkgb2Ygc2lnbmVyIG9iamVjdHMgdG8gQVNOLjEgb2JqZWN0cy5cbiAqXG4gKiBAcGFyYW0gc2lnbmVycyBhbiBhcnJheSBvZiBzaWduZXIgb2JqZWN0cy5cbiAqXG4gKiBAcmV0dXJuIGFuIGFycmF5IG9mIEFTTi4xIFNpZ25lckluZm9zLlxuICovXG5mdW5jdGlvbiBfc2lnbmVyc1RvQXNuMShzaWduZXJzKSB7XG4gIHZhciByZXQgPSBbXTtcbiAgZm9yKHZhciBpID0gMDsgaSA8IHNpZ25lcnMubGVuZ3RoOyArK2kpIHtcbiAgICByZXQucHVzaChfc2lnbmVyVG9Bc24xKHNpZ25lcnNbaV0pKTtcbiAgfVxuICByZXR1cm4gcmV0O1xufVxuXG4vKipcbiAqIENvbnZlcnQgYW4gYXR0cmlidXRlIG9iamVjdCB0byBhbiBBU04uMSBBdHRyaWJ1dGUuXG4gKlxuICogQHBhcmFtIGF0dHIgdGhlIGF0dHJpYnV0ZSBvYmplY3QuXG4gKlxuICogQHJldHVybiB0aGUgQVNOLjEgQXR0cmlidXRlLlxuICovXG5mdW5jdGlvbiBfYXR0cmlidXRlVG9Bc24xKGF0dHIpIHtcbiAgdmFyIHZhbHVlO1xuXG4gIC8vIFRPRE86IGdlbmVyYWxpemUgdG8gc3VwcG9ydCBtb3JlIGF0dHJpYnV0ZXNcbiAgaWYoYXR0ci50eXBlID09PSBmb3JnZS5wa2kub2lkcy5jb250ZW50VHlwZSkge1xuICAgIHZhbHVlID0gYXNuMS5jcmVhdGUoYXNuMS5DbGFzcy5VTklWRVJTQUwsIGFzbjEuVHlwZS5PSUQsIGZhbHNlLFxuICAgICAgYXNuMS5vaWRUb0RlcihhdHRyLnZhbHVlKS5nZXRCeXRlcygpKTtcbiAgfSBlbHNlIGlmKGF0dHIudHlwZSA9PT0gZm9yZ2UucGtpLm9pZHMubWVzc2FnZURpZ2VzdCkge1xuICAgIHZhbHVlID0gYXNuMS5jcmVhdGUoYXNuMS5DbGFzcy5VTklWRVJTQUwsIGFzbjEuVHlwZS5PQ1RFVFNUUklORywgZmFsc2UsXG4gICAgICBhdHRyLnZhbHVlLmJ5dGVzKCkpO1xuICB9IGVsc2UgaWYoYXR0ci50eXBlID09PSBmb3JnZS5wa2kub2lkcy5zaWduaW5nVGltZSkge1xuICAgIC8qIE5vdGUgcGVyIFJGQyAyOTg1OiBEYXRlcyBiZXR3ZWVuIDEgSmFudWFyeSAxOTUwIGFuZCAzMSBEZWNlbWJlciAyMDQ5XG4gICAgICAoaW5jbHVzaXZlKSBNVVNUIGJlIGVuY29kZWQgYXMgVVRDVGltZS4gQW55IGRhdGVzIHdpdGggeWVhciB2YWx1ZXNcbiAgICAgIGJlZm9yZSAxOTUwIG9yIGFmdGVyIDIwNDkgTVVTVCBiZSBlbmNvZGVkIGFzIEdlbmVyYWxpemVkVGltZS4gW0Z1cnRoZXIsXVxuICAgICAgVVRDVGltZSB2YWx1ZXMgTVVTVCBiZSBleHByZXNzZWQgaW4gR3JlZW53aWNoIE1lYW4gVGltZSAoWnVsdSkgYW5kIE1VU1RcbiAgICAgIGluY2x1ZGUgc2Vjb25kcyAoaS5lLiwgdGltZXMgYXJlIFlZTU1EREhITU1TU1opLCBldmVuIHdoZXJlIHRoZVxuICAgICAgbnVtYmVyIG9mIHNlY29uZHMgaXMgemVyby4gIE1pZG5pZ2h0IChHTVQpIG11c3QgYmUgcmVwcmVzZW50ZWQgYXNcbiAgICAgIFwiWVlNTUREMDAwMDAwWlwiLiAqL1xuICAgIC8vIFRPRE86IG1ha2UgdGhlc2UgbW9kdWxlLWxldmVsIGNvbnN0YW50c1xuICAgIHZhciBqYW5fMV8xOTUwID0gbmV3IERhdGUoJzE5NTAtMDEtMDFUMDA6MDA6MDBaJyk7XG4gICAgdmFyIGphbl8xXzIwNTAgPSBuZXcgRGF0ZSgnMjA1MC0wMS0wMVQwMDowMDowMFonKTtcbiAgICB2YXIgZGF0ZSA9IGF0dHIudmFsdWU7XG4gICAgaWYodHlwZW9mIGRhdGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAvLyB0cnkgdG8gcGFyc2UgZGF0ZVxuICAgICAgdmFyIHRpbWVzdGFtcCA9IERhdGUucGFyc2UoZGF0ZSk7XG4gICAgICBpZighaXNOYU4odGltZXN0YW1wKSkge1xuICAgICAgICBkYXRlID0gbmV3IERhdGUodGltZXN0YW1wKTtcbiAgICAgIH0gZWxzZSBpZihkYXRlLmxlbmd0aCA9PT0gMTMpIHtcbiAgICAgICAgLy8gWVlNTURESEhNTVNTWiAoMTMgY2hhcnMgZm9yIFVUQ1RpbWUpXG4gICAgICAgIGRhdGUgPSBhc24xLnV0Y1RpbWVUb0RhdGUoZGF0ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBhc3N1bWUgZ2VuZXJhbGl6ZWQgdGltZVxuICAgICAgICBkYXRlID0gYXNuMS5nZW5lcmFsaXplZFRpbWVUb0RhdGUoZGF0ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYoZGF0ZSA+PSBqYW5fMV8xOTUwICYmIGRhdGUgPCBqYW5fMV8yMDUwKSB7XG4gICAgICB2YWx1ZSA9IGFzbjEuY3JlYXRlKFxuICAgICAgICBhc24xLkNsYXNzLlVOSVZFUlNBTCwgYXNuMS5UeXBlLlVUQ1RJTUUsIGZhbHNlLFxuICAgICAgICBhc24xLmRhdGVUb1V0Y1RpbWUoZGF0ZSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YWx1ZSA9IGFzbjEuY3JlYXRlKFxuICAgICAgICBhc24xLkNsYXNzLlVOSVZFUlNBTCwgYXNuMS5UeXBlLkdFTkVSQUxJWkVEVElNRSwgZmFsc2UsXG4gICAgICAgIGFzbjEuZGF0ZVRvR2VuZXJhbGl6ZWRUaW1lKGRhdGUpKTtcbiAgICB9XG4gIH1cblxuICAvLyBUT0RPOiBleHBvc2UgYXMgY29tbW9uIEFQSSBjYWxsXG4gIC8vIGNyZWF0ZSBhIFJlbGF0aXZlRGlzdGluZ3Vpc2hlZE5hbWUgc2V0XG4gIC8vIGVhY2ggdmFsdWUgaW4gdGhlIHNldCBpcyBhbiBBdHRyaWJ1dGVUeXBlQW5kVmFsdWUgZmlyc3RcbiAgLy8gY29udGFpbmluZyB0aGUgdHlwZSAoYW4gT0lEKSBhbmQgc2Vjb25kIHRoZSB2YWx1ZVxuICByZXR1cm4gYXNuMS5jcmVhdGUoYXNuMS5DbGFzcy5VTklWRVJTQUwsIGFzbjEuVHlwZS5TRVFVRU5DRSwgdHJ1ZSwgW1xuICAgIC8vIEF0dHJpYnV0ZVR5cGVcbiAgICBhc24xLmNyZWF0ZShhc24xLkNsYXNzLlVOSVZFUlNBTCwgYXNuMS5UeXBlLk9JRCwgZmFsc2UsXG4gICAgICBhc24xLm9pZFRvRGVyKGF0dHIudHlwZSkuZ2V0Qnl0ZXMoKSksXG4gICAgYXNuMS5jcmVhdGUoYXNuMS5DbGFzcy5VTklWRVJTQUwsIGFzbjEuVHlwZS5TRVQsIHRydWUsIFtcbiAgICAgIC8vIEF0dHJpYnV0ZVZhbHVlXG4gICAgICB2YWx1ZVxuICAgIF0pXG4gIF0pO1xufVxuXG4vKipcbiAqIE1hcCBtZXNzYWdlcyBlbmNyeXB0ZWQgY29udGVudCB0byBBU04uMSBvYmplY3RzLlxuICpcbiAqIEBwYXJhbSBlYyBUaGUgZW5jcnlwdGVkQ29udGVudCBvYmplY3Qgb2YgdGhlIG1lc3NhZ2UuXG4gKlxuICogQHJldHVybiBBU04uMSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZW5jcnlwdGVkQ29udGVudCBvYmplY3QgKFNFUVVFTkNFKS5cbiAqL1xuZnVuY3Rpb24gX2VuY3J5cHRlZENvbnRlbnRUb0FzbjEoZWMpIHtcbiAgcmV0dXJuIFtcbiAgICAvLyBDb250ZW50VHlwZSwgYWx3YXlzIERhdGEgZm9yIHRoZSBtb21lbnRcbiAgICBhc24xLmNyZWF0ZShhc24xLkNsYXNzLlVOSVZFUlNBTCwgYXNuMS5UeXBlLk9JRCwgZmFsc2UsXG4gICAgICBhc24xLm9pZFRvRGVyKGZvcmdlLnBraS5vaWRzLmRhdGEpLmdldEJ5dGVzKCkpLFxuICAgIC8vIENvbnRlbnRFbmNyeXB0aW9uQWxnb3JpdGhtSWRlbnRpZmllclxuICAgIGFzbjEuY3JlYXRlKGFzbjEuQ2xhc3MuVU5JVkVSU0FMLCBhc24xLlR5cGUuU0VRVUVOQ0UsIHRydWUsIFtcbiAgICAgIC8vIEFsZ29yaXRobVxuICAgICAgYXNuMS5jcmVhdGUoYXNuMS5DbGFzcy5VTklWRVJTQUwsIGFzbjEuVHlwZS5PSUQsIGZhbHNlLFxuICAgICAgICBhc24xLm9pZFRvRGVyKGVjLmFsZ29yaXRobSkuZ2V0Qnl0ZXMoKSksXG4gICAgICAvLyBQYXJhbWV0ZXJzIChJVilcbiAgICAgICFlYy5wYXJhbWV0ZXIgP1xuICAgICAgICB1bmRlZmluZWQgOlxuICAgICAgICBhc24xLmNyZWF0ZShcbiAgICAgICAgICBhc24xLkNsYXNzLlVOSVZFUlNBTCwgYXNuMS5UeXBlLk9DVEVUU1RSSU5HLCBmYWxzZSxcbiAgICAgICAgICBlYy5wYXJhbWV0ZXIuZ2V0Qnl0ZXMoKSlcbiAgICBdKSxcbiAgICAvLyBbMF0gRW5jcnlwdGVkQ29udGVudFxuICAgIGFzbjEuY3JlYXRlKGFzbjEuQ2xhc3MuQ09OVEVYVF9TUEVDSUZJQywgMCwgdHJ1ZSwgW1xuICAgICAgYXNuMS5jcmVhdGUoYXNuMS5DbGFzcy5VTklWRVJTQUwsIGFzbjEuVHlwZS5PQ1RFVFNUUklORywgZmFsc2UsXG4gICAgICAgIGVjLmNvbnRlbnQuZ2V0Qnl0ZXMoKSlcbiAgICBdKVxuICBdO1xufVxuXG4vKipcbiAqIFJlYWRzIHRoZSBcImNvbW1vbiBwYXJ0XCIgb2YgYW4gUEtDUyM3IGNvbnRlbnQgYmxvY2sgKGluIEFTTi4xIGZvcm1hdClcbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIHJlYWRzIHRoZSBcImNvbW1vbiBwYXJ0XCIgb2YgdGhlIFBLQ1MjNyBjb250ZW50IGJsb2Nrc1xuICogRW5jcnlwdGVkRGF0YSBhbmQgRW52ZWxvcGVkRGF0YSwgaS5lLiB2ZXJzaW9uIG51bWJlciBhbmQgc3ltbWV0cmljYWxseVxuICogZW5jcnlwdGVkIGNvbnRlbnQgYmxvY2suXG4gKlxuICogVGhlIHJlc3VsdCBvZiB0aGUgQVNOLjEgdmFsaWRhdGUgYW5kIGNhcHR1cmUgcHJvY2VzcyBpcyByZXR1cm5lZFxuICogdG8gYWxsb3cgdGhlIGNhbGxlciB0byBleHRyYWN0IGZ1cnRoZXIgZGF0YSwgZS5nLiB0aGUgbGlzdCBvZiByZWNpcGllbnRzXG4gKiBpbiBjYXNlIG9mIGEgRW52ZWxvcGVkRGF0YSBvYmplY3QuXG4gKlxuICogQHBhcmFtIG1zZyB0aGUgUEtDUyM3IG9iamVjdCB0byByZWFkIHRoZSBkYXRhIHRvLlxuICogQHBhcmFtIG9iaiB0aGUgQVNOLjEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGNvbnRlbnQgYmxvY2suXG4gKiBAcGFyYW0gdmFsaWRhdG9yIHRoZSBBU04uMSBzdHJ1Y3R1cmUgdmFsaWRhdG9yIG9iamVjdCB0byB1c2UuXG4gKlxuICogQHJldHVybiB0aGUgdmFsdWUgbWFwIGNhcHR1cmVkIGJ5IHZhbGlkYXRvciBvYmplY3QuXG4gKi9cbmZ1bmN0aW9uIF9mcm9tQXNuMShtc2csIG9iaiwgdmFsaWRhdG9yKSB7XG4gIHZhciBjYXB0dXJlID0ge307XG4gIHZhciBlcnJvcnMgPSBbXTtcbiAgaWYoIWFzbjEudmFsaWRhdGUob2JqLCB2YWxpZGF0b3IsIGNhcHR1cmUsIGVycm9ycykpIHtcbiAgICB2YXIgZXJyb3IgPSBuZXcgRXJyb3IoJ0Nhbm5vdCByZWFkIFBLQ1MjNyBtZXNzYWdlLiAnICtcbiAgICAgICdBU04uMSBvYmplY3QgaXMgbm90IGEgc3VwcG9ydGVkIFBLQ1MjNyBtZXNzYWdlLicpO1xuICAgIGVycm9yLmVycm9ycyA9IGVycm9yO1xuICAgIHRocm93IGVycm9yO1xuICB9XG5cbiAgLy8gQ2hlY2sgY29udGVudFR5cGUsIHNvIGZhciB3ZSBvbmx5IHN1cHBvcnQgKHJhdykgRGF0YS5cbiAgdmFyIGNvbnRlbnRUeXBlID0gYXNuMS5kZXJUb09pZChjYXB0dXJlLmNvbnRlbnRUeXBlKTtcbiAgaWYoY29udGVudFR5cGUgIT09IGZvcmdlLnBraS5vaWRzLmRhdGEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vuc3VwcG9ydGVkIFBLQ1MjNyBtZXNzYWdlLiAnICtcbiAgICAgICdPbmx5IHdyYXBwZWQgQ29udGVudFR5cGUgRGF0YSBzdXBwb3J0ZWQuJyk7XG4gIH1cblxuICBpZihjYXB0dXJlLmVuY3J5cHRlZENvbnRlbnQpIHtcbiAgICB2YXIgY29udGVudCA9ICcnO1xuICAgIGlmKGZvcmdlLnV0aWwuaXNBcnJheShjYXB0dXJlLmVuY3J5cHRlZENvbnRlbnQpKSB7XG4gICAgICBmb3IodmFyIGkgPSAwOyBpIDwgY2FwdHVyZS5lbmNyeXB0ZWRDb250ZW50Lmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGlmKGNhcHR1cmUuZW5jcnlwdGVkQ29udGVudFtpXS50eXBlICE9PSBhc24xLlR5cGUuT0NURVRTVFJJTkcpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ01hbGZvcm1lZCBQS0NTIzcgbWVzc2FnZSwgZXhwZWN0aW5nIGVuY3J5cHRlZCAnICtcbiAgICAgICAgICAgICdjb250ZW50IGNvbnN0cnVjdGVkIG9mIG9ubHkgT0NURVQgU1RSSU5HIG9iamVjdHMuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29udGVudCArPSBjYXB0dXJlLmVuY3J5cHRlZENvbnRlbnRbaV0udmFsdWU7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnRlbnQgPSBjYXB0dXJlLmVuY3J5cHRlZENvbnRlbnQ7XG4gICAgfVxuICAgIG1zZy5lbmNyeXB0ZWRDb250ZW50ID0ge1xuICAgICAgYWxnb3JpdGhtOiBhc24xLmRlclRvT2lkKGNhcHR1cmUuZW5jQWxnb3JpdGhtKSxcbiAgICAgIHBhcmFtZXRlcjogZm9yZ2UudXRpbC5jcmVhdGVCdWZmZXIoY2FwdHVyZS5lbmNQYXJhbWV0ZXIudmFsdWUpLFxuICAgICAgY29udGVudDogZm9yZ2UudXRpbC5jcmVhdGVCdWZmZXIoY29udGVudClcbiAgICB9O1xuICB9XG5cbiAgaWYoY2FwdHVyZS5jb250ZW50KSB7XG4gICAgdmFyIGNvbnRlbnQgPSAnJztcbiAgICBpZihmb3JnZS51dGlsLmlzQXJyYXkoY2FwdHVyZS5jb250ZW50KSkge1xuICAgICAgZm9yKHZhciBpID0gMDsgaSA8IGNhcHR1cmUuY29udGVudC5sZW5ndGg7ICsraSkge1xuICAgICAgICBpZihjYXB0dXJlLmNvbnRlbnRbaV0udHlwZSAhPT0gYXNuMS5UeXBlLk9DVEVUU1RSSU5HKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNYWxmb3JtZWQgUEtDUyM3IG1lc3NhZ2UsIGV4cGVjdGluZyAnICtcbiAgICAgICAgICAgICdjb250ZW50IGNvbnN0cnVjdGVkIG9mIG9ubHkgT0NURVQgU1RSSU5HIG9iamVjdHMuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29udGVudCArPSBjYXB0dXJlLmNvbnRlbnRbaV0udmFsdWU7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnRlbnQgPSBjYXB0dXJlLmNvbnRlbnQ7XG4gICAgfVxuICAgIG1zZy5jb250ZW50ID0gZm9yZ2UudXRpbC5jcmVhdGVCdWZmZXIoY29udGVudCk7XG4gIH1cblxuICBtc2cudmVyc2lvbiA9IGNhcHR1cmUudmVyc2lvbi5jaGFyQ29kZUF0KDApO1xuICBtc2cucmF3Q2FwdHVyZSA9IGNhcHR1cmU7XG5cbiAgcmV0dXJuIGNhcHR1cmU7XG59XG5cbi8qKlxuICogRGVjcnlwdCB0aGUgc3ltbWV0cmljYWxseSBlbmNyeXB0ZWQgY29udGVudCBibG9jayBvZiB0aGUgUEtDUyM3IG1lc3NhZ2UuXG4gKlxuICogRGVjcnlwdGlvbiBpcyBza2lwcGVkIGluIGNhc2UgdGhlIFBLQ1MjNyBtZXNzYWdlIG9iamVjdCBhbHJlYWR5IGhhcyBhXG4gKiAoZGVjcnlwdGVkKSBjb250ZW50IGF0dHJpYnV0ZS4gIFRoZSBhbGdvcml0aG0sIGtleSBhbmQgY2lwaGVyIHBhcmFtZXRlcnNcbiAqIChwcm9iYWJseSB0aGUgaXYpIGFyZSB0YWtlbiBmcm9tIHRoZSBlbmNyeXB0ZWRDb250ZW50IGF0dHJpYnV0ZSBvZiB0aGVcbiAqIG1lc3NhZ2Ugb2JqZWN0LlxuICpcbiAqIEBwYXJhbSBUaGUgUEtDUyM3IG1lc3NhZ2Ugb2JqZWN0LlxuICovXG5mdW5jdGlvbiBfZGVjcnlwdENvbnRlbnQobXNnKSB7XG4gIGlmKG1zZy5lbmNyeXB0ZWRDb250ZW50LmtleSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdTeW1tZXRyaWMga2V5IG5vdCBhdmFpbGFibGUuJyk7XG4gIH1cblxuICBpZihtc2cuY29udGVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdmFyIGNpcGg7XG5cbiAgICBzd2l0Y2gobXNnLmVuY3J5cHRlZENvbnRlbnQuYWxnb3JpdGhtKSB7XG4gICAgICBjYXNlIGZvcmdlLnBraS5vaWRzWydhZXMxMjgtQ0JDJ106XG4gICAgICBjYXNlIGZvcmdlLnBraS5vaWRzWydhZXMxOTItQ0JDJ106XG4gICAgICBjYXNlIGZvcmdlLnBraS5vaWRzWydhZXMyNTYtQ0JDJ106XG4gICAgICAgIGNpcGggPSBmb3JnZS5hZXMuY3JlYXRlRGVjcnlwdGlvbkNpcGhlcihtc2cuZW5jcnlwdGVkQ29udGVudC5rZXkpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBmb3JnZS5wa2kub2lkc1snZGVzQ0JDJ106XG4gICAgICBjYXNlIGZvcmdlLnBraS5vaWRzWydkZXMtRURFMy1DQkMnXTpcbiAgICAgICAgY2lwaCA9IGZvcmdlLmRlcy5jcmVhdGVEZWNyeXB0aW9uQ2lwaGVyKG1zZy5lbmNyeXB0ZWRDb250ZW50LmtleSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vuc3VwcG9ydGVkIHN5bW1ldHJpYyBjaXBoZXIsIE9JRCAnICtcbiAgICAgICAgICBtc2cuZW5jcnlwdGVkQ29udGVudC5hbGdvcml0aG0pO1xuICAgIH1cbiAgICBjaXBoLnN0YXJ0KG1zZy5lbmNyeXB0ZWRDb250ZW50LnBhcmFtZXRlcik7XG4gICAgY2lwaC51cGRhdGUobXNnLmVuY3J5cHRlZENvbnRlbnQuY29udGVudCk7XG5cbiAgICBpZighY2lwaC5maW5pc2goKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdTeW1tZXRyaWMgZGVjcnlwdGlvbiBmYWlsZWQuJyk7XG4gICAgfVxuXG4gICAgbXNnLmNvbnRlbnQgPSBjaXBoLm91dHB1dDtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///245\n")},function(module,exports,__webpack_require__){eval("/**\n * Functions to output keys in SSH-friendly formats.\n *\n * This is part of the Forge project which may be used under the terms of\n * either the BSD License or the GNU General Public License (GPL) Version 2.\n *\n * See: https://github.com/digitalbazaar/forge/blob/cbebca3780658703d925b61b2caffb1d263a6c1d/LICENSE\n *\n * @author https://github.com/shellac\n */\nvar forge = __webpack_require__(4);\n__webpack_require__(22);\n__webpack_require__(31);\n__webpack_require__(55);\n__webpack_require__(32);\n__webpack_require__(7);\n\nvar ssh = module.exports = forge.ssh = forge.ssh || {};\n\n/**\n * Encodes (and optionally encrypts) a private RSA key as a Putty PPK file.\n *\n * @param privateKey the key.\n * @param passphrase a passphrase to protect the key (falsy for no encryption).\n * @param comment a comment to include in the key file.\n *\n * @return the PPK file as a string.\n */\nssh.privateKeyToPutty = function(privateKey, passphrase, comment) {\n  comment = comment || '';\n  passphrase = passphrase || '';\n  var algorithm = 'ssh-rsa';\n  var encryptionAlgorithm = (passphrase === '') ? 'none' : 'aes256-cbc';\n\n  var ppk = 'PuTTY-User-Key-File-2: ' + algorithm + '\\r\\n';\n  ppk += 'Encryption: ' + encryptionAlgorithm + '\\r\\n';\n  ppk += 'Comment: ' + comment + '\\r\\n';\n\n  // public key into buffer for ppk\n  var pubbuffer = forge.util.createBuffer();\n  _addStringToBuffer(pubbuffer, algorithm);\n  _addBigIntegerToBuffer(pubbuffer, privateKey.e);\n  _addBigIntegerToBuffer(pubbuffer, privateKey.n);\n\n  // write public key\n  var pub = forge.util.encode64(pubbuffer.bytes(), 64);\n  var length = Math.floor(pub.length / 66) + 1; // 66 = 64 + \\r\\n\n  ppk += 'Public-Lines: ' + length + '\\r\\n';\n  ppk += pub;\n\n  // private key into a buffer\n  var privbuffer = forge.util.createBuffer();\n  _addBigIntegerToBuffer(privbuffer, privateKey.d);\n  _addBigIntegerToBuffer(privbuffer, privateKey.p);\n  _addBigIntegerToBuffer(privbuffer, privateKey.q);\n  _addBigIntegerToBuffer(privbuffer, privateKey.qInv);\n\n  // optionally encrypt the private key\n  var priv;\n  if(!passphrase) {\n    // use the unencrypted buffer\n    priv = forge.util.encode64(privbuffer.bytes(), 64);\n  } else {\n    // encrypt RSA key using passphrase\n    var encLen = privbuffer.length() + 16 - 1;\n    encLen -= encLen % 16;\n\n    // pad private key with sha1-d data -- needs to be a multiple of 16\n    var padding = _sha1(privbuffer.bytes());\n\n    padding.truncate(padding.length() - encLen + privbuffer.length());\n    privbuffer.putBuffer(padding);\n\n    var aeskey = forge.util.createBuffer();\n    aeskey.putBuffer(_sha1('\\x00\\x00\\x00\\x00', passphrase));\n    aeskey.putBuffer(_sha1('\\x00\\x00\\x00\\x01', passphrase));\n\n    // encrypt some bytes using CBC mode\n    // key is 40 bytes, so truncate *by* 8 bytes\n    var cipher = forge.aes.createEncryptionCipher(aeskey.truncate(8), 'CBC');\n    cipher.start(forge.util.createBuffer().fillWithByte(0, 16));\n    cipher.update(privbuffer.copy());\n    cipher.finish();\n    var encrypted = cipher.output;\n\n    // Note: this appears to differ from Putty -- is forge wrong, or putty?\n    // due to padding we finish as an exact multiple of 16\n    encrypted.truncate(16); // all padding\n\n    priv = forge.util.encode64(encrypted.bytes(), 64);\n  }\n\n  // output private key\n  length = Math.floor(priv.length / 66) + 1; // 64 + \\r\\n\n  ppk += '\\r\\nPrivate-Lines: ' + length + '\\r\\n';\n  ppk += priv;\n\n  // MAC\n  var mackey = _sha1('putty-private-key-file-mac-key', passphrase);\n\n  var macbuffer = forge.util.createBuffer();\n  _addStringToBuffer(macbuffer, algorithm);\n  _addStringToBuffer(macbuffer, encryptionAlgorithm);\n  _addStringToBuffer(macbuffer, comment);\n  macbuffer.putInt32(pubbuffer.length());\n  macbuffer.putBuffer(pubbuffer);\n  macbuffer.putInt32(privbuffer.length());\n  macbuffer.putBuffer(privbuffer);\n\n  var hmac = forge.hmac.create();\n  hmac.start('sha1', mackey);\n  hmac.update(macbuffer.bytes());\n\n  ppk += '\\r\\nPrivate-MAC: ' + hmac.digest().toHex() + '\\r\\n';\n\n  return ppk;\n};\n\n/**\n * Encodes a public RSA key as an OpenSSH file.\n *\n * @param key the key.\n * @param comment a comment.\n *\n * @return the public key in OpenSSH format.\n */\nssh.publicKeyToOpenSSH = function(key, comment) {\n  var type = 'ssh-rsa';\n  comment = comment || '';\n\n  var buffer = forge.util.createBuffer();\n  _addStringToBuffer(buffer, type);\n  _addBigIntegerToBuffer(buffer, key.e);\n  _addBigIntegerToBuffer(buffer, key.n);\n\n  return type + ' ' + forge.util.encode64(buffer.bytes()) + ' ' + comment;\n};\n\n/**\n * Encodes a private RSA key as an OpenSSH file.\n *\n * @param key the key.\n * @param passphrase a passphrase to protect the key (falsy for no encryption).\n *\n * @return the public key in OpenSSH format.\n */\nssh.privateKeyToOpenSSH = function(privateKey, passphrase) {\n  if(!passphrase) {\n    return forge.pki.privateKeyToPem(privateKey);\n  }\n  // OpenSSH private key is just a legacy format, it seems\n  return forge.pki.encryptRsaPrivateKey(privateKey, passphrase,\n    {legacy: true, algorithm: 'aes128'});\n};\n\n/**\n * Gets the SSH fingerprint for the given public key.\n *\n * @param options the options to use.\n *          [md] the message digest object to use (defaults to forge.md.md5).\n *          [encoding] an alternative output encoding, such as 'hex'\n *            (defaults to none, outputs a byte buffer).\n *          [delimiter] the delimiter to use between bytes for 'hex' encoded\n *            output, eg: ':' (defaults to none).\n *\n * @return the fingerprint as a byte buffer or other encoding based on options.\n */\nssh.getPublicKeyFingerprint = function(key, options) {\n  options = options || {};\n  var md = options.md || forge.md.md5.create();\n\n  var type = 'ssh-rsa';\n  var buffer = forge.util.createBuffer();\n  _addStringToBuffer(buffer, type);\n  _addBigIntegerToBuffer(buffer, key.e);\n  _addBigIntegerToBuffer(buffer, key.n);\n\n  // hash public key bytes\n  md.start();\n  md.update(buffer.getBytes());\n  var digest = md.digest();\n  if(options.encoding === 'hex') {\n    var hex = digest.toHex();\n    if(options.delimiter) {\n      return hex.match(/.{2}/g).join(options.delimiter);\n    }\n    return hex;\n  } else if(options.encoding === 'binary') {\n    return digest.getBytes();\n  } else if(options.encoding) {\n    throw new Error('Unknown encoding \"' + options.encoding + '\".');\n  }\n  return digest;\n};\n\n/**\n * Adds len(val) then val to a buffer.\n *\n * @param buffer the buffer to add to.\n * @param val a big integer.\n */\nfunction _addBigIntegerToBuffer(buffer, val) {\n  var hexVal = val.toString(16);\n  // ensure 2s complement +ve\n  if(hexVal[0] >= '8') {\n    hexVal = '00' + hexVal;\n  }\n  var bytes = forge.util.hexToBytes(hexVal);\n  buffer.putInt32(bytes.length);\n  buffer.putBytes(bytes);\n}\n\n/**\n * Adds len(val) then val to a buffer.\n *\n * @param buffer the buffer to add to.\n * @param val a string.\n */\nfunction _addStringToBuffer(buffer, val) {\n  buffer.putInt32(val.length);\n  buffer.putString(val);\n}\n\n/**\n * Hashes the arguments into one value using SHA-1.\n *\n * @return the sha1 hash of the provided arguments.\n */\nfunction _sha1() {\n  var sha = forge.md.sha1.create();\n  var num = arguments.length;\n  for (var i = 0; i < num; ++i) {\n    sha.update(arguments[i]);\n  }\n  return sha.digest();\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjQ2LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL25vZGUtZm9yZ2UvbGliL3NzaC5qcz83ZmQyIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRnVuY3Rpb25zIHRvIG91dHB1dCBrZXlzIGluIFNTSC1mcmllbmRseSBmb3JtYXRzLlxuICpcbiAqIFRoaXMgaXMgcGFydCBvZiB0aGUgRm9yZ2UgcHJvamVjdCB3aGljaCBtYXkgYmUgdXNlZCB1bmRlciB0aGUgdGVybXMgb2ZcbiAqIGVpdGhlciB0aGUgQlNEIExpY2Vuc2Ugb3IgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMi5cbiAqXG4gKiBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9kaWdpdGFsYmF6YWFyL2ZvcmdlL2Jsb2IvY2JlYmNhMzc4MDY1ODcwM2Q5MjViNjFiMmNhZmZiMWQyNjNhNmMxZC9MSUNFTlNFXG4gKlxuICogQGF1dGhvciBodHRwczovL2dpdGh1Yi5jb20vc2hlbGxhY1xuICovXG52YXIgZm9yZ2UgPSByZXF1aXJlKCcuL2ZvcmdlJyk7XG5yZXF1aXJlKCcuL2FlcycpO1xucmVxdWlyZSgnLi9obWFjJyk7XG5yZXF1aXJlKCcuL21kNScpO1xucmVxdWlyZSgnLi9zaGExJyk7XG5yZXF1aXJlKCcuL3V0aWwnKTtcblxudmFyIHNzaCA9IG1vZHVsZS5leHBvcnRzID0gZm9yZ2Uuc3NoID0gZm9yZ2Uuc3NoIHx8IHt9O1xuXG4vKipcbiAqIEVuY29kZXMgKGFuZCBvcHRpb25hbGx5IGVuY3J5cHRzKSBhIHByaXZhdGUgUlNBIGtleSBhcyBhIFB1dHR5IFBQSyBmaWxlLlxuICpcbiAqIEBwYXJhbSBwcml2YXRlS2V5IHRoZSBrZXkuXG4gKiBAcGFyYW0gcGFzc3BocmFzZSBhIHBhc3NwaHJhc2UgdG8gcHJvdGVjdCB0aGUga2V5IChmYWxzeSBmb3Igbm8gZW5jcnlwdGlvbikuXG4gKiBAcGFyYW0gY29tbWVudCBhIGNvbW1lbnQgdG8gaW5jbHVkZSBpbiB0aGUga2V5IGZpbGUuXG4gKlxuICogQHJldHVybiB0aGUgUFBLIGZpbGUgYXMgYSBzdHJpbmcuXG4gKi9cbnNzaC5wcml2YXRlS2V5VG9QdXR0eSA9IGZ1bmN0aW9uKHByaXZhdGVLZXksIHBhc3NwaHJhc2UsIGNvbW1lbnQpIHtcbiAgY29tbWVudCA9IGNvbW1lbnQgfHwgJyc7XG4gIHBhc3NwaHJhc2UgPSBwYXNzcGhyYXNlIHx8ICcnO1xuICB2YXIgYWxnb3JpdGhtID0gJ3NzaC1yc2EnO1xuICB2YXIgZW5jcnlwdGlvbkFsZ29yaXRobSA9IChwYXNzcGhyYXNlID09PSAnJykgPyAnbm9uZScgOiAnYWVzMjU2LWNiYyc7XG5cbiAgdmFyIHBwayA9ICdQdVRUWS1Vc2VyLUtleS1GaWxlLTI6ICcgKyBhbGdvcml0aG0gKyAnXFxyXFxuJztcbiAgcHBrICs9ICdFbmNyeXB0aW9uOiAnICsgZW5jcnlwdGlvbkFsZ29yaXRobSArICdcXHJcXG4nO1xuICBwcGsgKz0gJ0NvbW1lbnQ6ICcgKyBjb21tZW50ICsgJ1xcclxcbic7XG5cbiAgLy8gcHVibGljIGtleSBpbnRvIGJ1ZmZlciBmb3IgcHBrXG4gIHZhciBwdWJidWZmZXIgPSBmb3JnZS51dGlsLmNyZWF0ZUJ1ZmZlcigpO1xuICBfYWRkU3RyaW5nVG9CdWZmZXIocHViYnVmZmVyLCBhbGdvcml0aG0pO1xuICBfYWRkQmlnSW50ZWdlclRvQnVmZmVyKHB1YmJ1ZmZlciwgcHJpdmF0ZUtleS5lKTtcbiAgX2FkZEJpZ0ludGVnZXJUb0J1ZmZlcihwdWJidWZmZXIsIHByaXZhdGVLZXkubik7XG5cbiAgLy8gd3JpdGUgcHVibGljIGtleVxuICB2YXIgcHViID0gZm9yZ2UudXRpbC5lbmNvZGU2NChwdWJidWZmZXIuYnl0ZXMoKSwgNjQpO1xuICB2YXIgbGVuZ3RoID0gTWF0aC5mbG9vcihwdWIubGVuZ3RoIC8gNjYpICsgMTsgLy8gNjYgPSA2NCArIFxcclxcblxuICBwcGsgKz0gJ1B1YmxpYy1MaW5lczogJyArIGxlbmd0aCArICdcXHJcXG4nO1xuICBwcGsgKz0gcHViO1xuXG4gIC8vIHByaXZhdGUga2V5IGludG8gYSBidWZmZXJcbiAgdmFyIHByaXZidWZmZXIgPSBmb3JnZS51dGlsLmNyZWF0ZUJ1ZmZlcigpO1xuICBfYWRkQmlnSW50ZWdlclRvQnVmZmVyKHByaXZidWZmZXIsIHByaXZhdGVLZXkuZCk7XG4gIF9hZGRCaWdJbnRlZ2VyVG9CdWZmZXIocHJpdmJ1ZmZlciwgcHJpdmF0ZUtleS5wKTtcbiAgX2FkZEJpZ0ludGVnZXJUb0J1ZmZlcihwcml2YnVmZmVyLCBwcml2YXRlS2V5LnEpO1xuICBfYWRkQmlnSW50ZWdlclRvQnVmZmVyKHByaXZidWZmZXIsIHByaXZhdGVLZXkucUludik7XG5cbiAgLy8gb3B0aW9uYWxseSBlbmNyeXB0IHRoZSBwcml2YXRlIGtleVxuICB2YXIgcHJpdjtcbiAgaWYoIXBhc3NwaHJhc2UpIHtcbiAgICAvLyB1c2UgdGhlIHVuZW5jcnlwdGVkIGJ1ZmZlclxuICAgIHByaXYgPSBmb3JnZS51dGlsLmVuY29kZTY0KHByaXZidWZmZXIuYnl0ZXMoKSwgNjQpO1xuICB9IGVsc2Uge1xuICAgIC8vIGVuY3J5cHQgUlNBIGtleSB1c2luZyBwYXNzcGhyYXNlXG4gICAgdmFyIGVuY0xlbiA9IHByaXZidWZmZXIubGVuZ3RoKCkgKyAxNiAtIDE7XG4gICAgZW5jTGVuIC09IGVuY0xlbiAlIDE2O1xuXG4gICAgLy8gcGFkIHByaXZhdGUga2V5IHdpdGggc2hhMS1kIGRhdGEgLS0gbmVlZHMgdG8gYmUgYSBtdWx0aXBsZSBvZiAxNlxuICAgIHZhciBwYWRkaW5nID0gX3NoYTEocHJpdmJ1ZmZlci5ieXRlcygpKTtcblxuICAgIHBhZGRpbmcudHJ1bmNhdGUocGFkZGluZy5sZW5ndGgoKSAtIGVuY0xlbiArIHByaXZidWZmZXIubGVuZ3RoKCkpO1xuICAgIHByaXZidWZmZXIucHV0QnVmZmVyKHBhZGRpbmcpO1xuXG4gICAgdmFyIGFlc2tleSA9IGZvcmdlLnV0aWwuY3JlYXRlQnVmZmVyKCk7XG4gICAgYWVza2V5LnB1dEJ1ZmZlcihfc2hhMSgnXFx4MDBcXHgwMFxceDAwXFx4MDAnLCBwYXNzcGhyYXNlKSk7XG4gICAgYWVza2V5LnB1dEJ1ZmZlcihfc2hhMSgnXFx4MDBcXHgwMFxceDAwXFx4MDEnLCBwYXNzcGhyYXNlKSk7XG5cbiAgICAvLyBlbmNyeXB0IHNvbWUgYnl0ZXMgdXNpbmcgQ0JDIG1vZGVcbiAgICAvLyBrZXkgaXMgNDAgYnl0ZXMsIHNvIHRydW5jYXRlICpieSogOCBieXRlc1xuICAgIHZhciBjaXBoZXIgPSBmb3JnZS5hZXMuY3JlYXRlRW5jcnlwdGlvbkNpcGhlcihhZXNrZXkudHJ1bmNhdGUoOCksICdDQkMnKTtcbiAgICBjaXBoZXIuc3RhcnQoZm9yZ2UudXRpbC5jcmVhdGVCdWZmZXIoKS5maWxsV2l0aEJ5dGUoMCwgMTYpKTtcbiAgICBjaXBoZXIudXBkYXRlKHByaXZidWZmZXIuY29weSgpKTtcbiAgICBjaXBoZXIuZmluaXNoKCk7XG4gICAgdmFyIGVuY3J5cHRlZCA9IGNpcGhlci5vdXRwdXQ7XG5cbiAgICAvLyBOb3RlOiB0aGlzIGFwcGVhcnMgdG8gZGlmZmVyIGZyb20gUHV0dHkgLS0gaXMgZm9yZ2Ugd3JvbmcsIG9yIHB1dHR5P1xuICAgIC8vIGR1ZSB0byBwYWRkaW5nIHdlIGZpbmlzaCBhcyBhbiBleGFjdCBtdWx0aXBsZSBvZiAxNlxuICAgIGVuY3J5cHRlZC50cnVuY2F0ZSgxNik7IC8vIGFsbCBwYWRkaW5nXG5cbiAgICBwcml2ID0gZm9yZ2UudXRpbC5lbmNvZGU2NChlbmNyeXB0ZWQuYnl0ZXMoKSwgNjQpO1xuICB9XG5cbiAgLy8gb3V0cHV0IHByaXZhdGUga2V5XG4gIGxlbmd0aCA9IE1hdGguZmxvb3IocHJpdi5sZW5ndGggLyA2NikgKyAxOyAvLyA2NCArIFxcclxcblxuICBwcGsgKz0gJ1xcclxcblByaXZhdGUtTGluZXM6ICcgKyBsZW5ndGggKyAnXFxyXFxuJztcbiAgcHBrICs9IHByaXY7XG5cbiAgLy8gTUFDXG4gIHZhciBtYWNrZXkgPSBfc2hhMSgncHV0dHktcHJpdmF0ZS1rZXktZmlsZS1tYWMta2V5JywgcGFzc3BocmFzZSk7XG5cbiAgdmFyIG1hY2J1ZmZlciA9IGZvcmdlLnV0aWwuY3JlYXRlQnVmZmVyKCk7XG4gIF9hZGRTdHJpbmdUb0J1ZmZlcihtYWNidWZmZXIsIGFsZ29yaXRobSk7XG4gIF9hZGRTdHJpbmdUb0J1ZmZlcihtYWNidWZmZXIsIGVuY3J5cHRpb25BbGdvcml0aG0pO1xuICBfYWRkU3RyaW5nVG9CdWZmZXIobWFjYnVmZmVyLCBjb21tZW50KTtcbiAgbWFjYnVmZmVyLnB1dEludDMyKHB1YmJ1ZmZlci5sZW5ndGgoKSk7XG4gIG1hY2J1ZmZlci5wdXRCdWZmZXIocHViYnVmZmVyKTtcbiAgbWFjYnVmZmVyLnB1dEludDMyKHByaXZidWZmZXIubGVuZ3RoKCkpO1xuICBtYWNidWZmZXIucHV0QnVmZmVyKHByaXZidWZmZXIpO1xuXG4gIHZhciBobWFjID0gZm9yZ2UuaG1hYy5jcmVhdGUoKTtcbiAgaG1hYy5zdGFydCgnc2hhMScsIG1hY2tleSk7XG4gIGhtYWMudXBkYXRlKG1hY2J1ZmZlci5ieXRlcygpKTtcblxuICBwcGsgKz0gJ1xcclxcblByaXZhdGUtTUFDOiAnICsgaG1hYy5kaWdlc3QoKS50b0hleCgpICsgJ1xcclxcbic7XG5cbiAgcmV0dXJuIHBwaztcbn07XG5cbi8qKlxuICogRW5jb2RlcyBhIHB1YmxpYyBSU0Ega2V5IGFzIGFuIE9wZW5TU0ggZmlsZS5cbiAqXG4gKiBAcGFyYW0ga2V5IHRoZSBrZXkuXG4gKiBAcGFyYW0gY29tbWVudCBhIGNvbW1lbnQuXG4gKlxuICogQHJldHVybiB0aGUgcHVibGljIGtleSBpbiBPcGVuU1NIIGZvcm1hdC5cbiAqL1xuc3NoLnB1YmxpY0tleVRvT3BlblNTSCA9IGZ1bmN0aW9uKGtleSwgY29tbWVudCkge1xuICB2YXIgdHlwZSA9ICdzc2gtcnNhJztcbiAgY29tbWVudCA9IGNvbW1lbnQgfHwgJyc7XG5cbiAgdmFyIGJ1ZmZlciA9IGZvcmdlLnV0aWwuY3JlYXRlQnVmZmVyKCk7XG4gIF9hZGRTdHJpbmdUb0J1ZmZlcihidWZmZXIsIHR5cGUpO1xuICBfYWRkQmlnSW50ZWdlclRvQnVmZmVyKGJ1ZmZlciwga2V5LmUpO1xuICBfYWRkQmlnSW50ZWdlclRvQnVmZmVyKGJ1ZmZlciwga2V5Lm4pO1xuXG4gIHJldHVybiB0eXBlICsgJyAnICsgZm9yZ2UudXRpbC5lbmNvZGU2NChidWZmZXIuYnl0ZXMoKSkgKyAnICcgKyBjb21tZW50O1xufTtcblxuLyoqXG4gKiBFbmNvZGVzIGEgcHJpdmF0ZSBSU0Ega2V5IGFzIGFuIE9wZW5TU0ggZmlsZS5cbiAqXG4gKiBAcGFyYW0ga2V5IHRoZSBrZXkuXG4gKiBAcGFyYW0gcGFzc3BocmFzZSBhIHBhc3NwaHJhc2UgdG8gcHJvdGVjdCB0aGUga2V5IChmYWxzeSBmb3Igbm8gZW5jcnlwdGlvbikuXG4gKlxuICogQHJldHVybiB0aGUgcHVibGljIGtleSBpbiBPcGVuU1NIIGZvcm1hdC5cbiAqL1xuc3NoLnByaXZhdGVLZXlUb09wZW5TU0ggPSBmdW5jdGlvbihwcml2YXRlS2V5LCBwYXNzcGhyYXNlKSB7XG4gIGlmKCFwYXNzcGhyYXNlKSB7XG4gICAgcmV0dXJuIGZvcmdlLnBraS5wcml2YXRlS2V5VG9QZW0ocHJpdmF0ZUtleSk7XG4gIH1cbiAgLy8gT3BlblNTSCBwcml2YXRlIGtleSBpcyBqdXN0IGEgbGVnYWN5IGZvcm1hdCwgaXQgc2VlbXNcbiAgcmV0dXJuIGZvcmdlLnBraS5lbmNyeXB0UnNhUHJpdmF0ZUtleShwcml2YXRlS2V5LCBwYXNzcGhyYXNlLFxuICAgIHtsZWdhY3k6IHRydWUsIGFsZ29yaXRobTogJ2FlczEyOCd9KTtcbn07XG5cbi8qKlxuICogR2V0cyB0aGUgU1NIIGZpbmdlcnByaW50IGZvciB0aGUgZ2l2ZW4gcHVibGljIGtleS5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyB0aGUgb3B0aW9ucyB0byB1c2UuXG4gKiAgICAgICAgICBbbWRdIHRoZSBtZXNzYWdlIGRpZ2VzdCBvYmplY3QgdG8gdXNlIChkZWZhdWx0cyB0byBmb3JnZS5tZC5tZDUpLlxuICogICAgICAgICAgW2VuY29kaW5nXSBhbiBhbHRlcm5hdGl2ZSBvdXRwdXQgZW5jb2RpbmcsIHN1Y2ggYXMgJ2hleCdcbiAqICAgICAgICAgICAgKGRlZmF1bHRzIHRvIG5vbmUsIG91dHB1dHMgYSBieXRlIGJ1ZmZlcikuXG4gKiAgICAgICAgICBbZGVsaW1pdGVyXSB0aGUgZGVsaW1pdGVyIHRvIHVzZSBiZXR3ZWVuIGJ5dGVzIGZvciAnaGV4JyBlbmNvZGVkXG4gKiAgICAgICAgICAgIG91dHB1dCwgZWc6ICc6JyAoZGVmYXVsdHMgdG8gbm9uZSkuXG4gKlxuICogQHJldHVybiB0aGUgZmluZ2VycHJpbnQgYXMgYSBieXRlIGJ1ZmZlciBvciBvdGhlciBlbmNvZGluZyBiYXNlZCBvbiBvcHRpb25zLlxuICovXG5zc2guZ2V0UHVibGljS2V5RmluZ2VycHJpbnQgPSBmdW5jdGlvbihrZXksIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIHZhciBtZCA9IG9wdGlvbnMubWQgfHwgZm9yZ2UubWQubWQ1LmNyZWF0ZSgpO1xuXG4gIHZhciB0eXBlID0gJ3NzaC1yc2EnO1xuICB2YXIgYnVmZmVyID0gZm9yZ2UudXRpbC5jcmVhdGVCdWZmZXIoKTtcbiAgX2FkZFN0cmluZ1RvQnVmZmVyKGJ1ZmZlciwgdHlwZSk7XG4gIF9hZGRCaWdJbnRlZ2VyVG9CdWZmZXIoYnVmZmVyLCBrZXkuZSk7XG4gIF9hZGRCaWdJbnRlZ2VyVG9CdWZmZXIoYnVmZmVyLCBrZXkubik7XG5cbiAgLy8gaGFzaCBwdWJsaWMga2V5IGJ5dGVzXG4gIG1kLnN0YXJ0KCk7XG4gIG1kLnVwZGF0ZShidWZmZXIuZ2V0Qnl0ZXMoKSk7XG4gIHZhciBkaWdlc3QgPSBtZC5kaWdlc3QoKTtcbiAgaWYob3B0aW9ucy5lbmNvZGluZyA9PT0gJ2hleCcpIHtcbiAgICB2YXIgaGV4ID0gZGlnZXN0LnRvSGV4KCk7XG4gICAgaWYob3B0aW9ucy5kZWxpbWl0ZXIpIHtcbiAgICAgIHJldHVybiBoZXgubWF0Y2goLy57Mn0vZykuam9pbihvcHRpb25zLmRlbGltaXRlcik7XG4gICAgfVxuICAgIHJldHVybiBoZXg7XG4gIH0gZWxzZSBpZihvcHRpb25zLmVuY29kaW5nID09PSAnYmluYXJ5Jykge1xuICAgIHJldHVybiBkaWdlc3QuZ2V0Qnl0ZXMoKTtcbiAgfSBlbHNlIGlmKG9wdGlvbnMuZW5jb2RpbmcpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gZW5jb2RpbmcgXCInICsgb3B0aW9ucy5lbmNvZGluZyArICdcIi4nKTtcbiAgfVxuICByZXR1cm4gZGlnZXN0O1xufTtcblxuLyoqXG4gKiBBZGRzIGxlbih2YWwpIHRoZW4gdmFsIHRvIGEgYnVmZmVyLlxuICpcbiAqIEBwYXJhbSBidWZmZXIgdGhlIGJ1ZmZlciB0byBhZGQgdG8uXG4gKiBAcGFyYW0gdmFsIGEgYmlnIGludGVnZXIuXG4gKi9cbmZ1bmN0aW9uIF9hZGRCaWdJbnRlZ2VyVG9CdWZmZXIoYnVmZmVyLCB2YWwpIHtcbiAgdmFyIGhleFZhbCA9IHZhbC50b1N0cmluZygxNik7XG4gIC8vIGVuc3VyZSAycyBjb21wbGVtZW50ICt2ZVxuICBpZihoZXhWYWxbMF0gPj0gJzgnKSB7XG4gICAgaGV4VmFsID0gJzAwJyArIGhleFZhbDtcbiAgfVxuICB2YXIgYnl0ZXMgPSBmb3JnZS51dGlsLmhleFRvQnl0ZXMoaGV4VmFsKTtcbiAgYnVmZmVyLnB1dEludDMyKGJ5dGVzLmxlbmd0aCk7XG4gIGJ1ZmZlci5wdXRCeXRlcyhieXRlcyk7XG59XG5cbi8qKlxuICogQWRkcyBsZW4odmFsKSB0aGVuIHZhbCB0byBhIGJ1ZmZlci5cbiAqXG4gKiBAcGFyYW0gYnVmZmVyIHRoZSBidWZmZXIgdG8gYWRkIHRvLlxuICogQHBhcmFtIHZhbCBhIHN0cmluZy5cbiAqL1xuZnVuY3Rpb24gX2FkZFN0cmluZ1RvQnVmZmVyKGJ1ZmZlciwgdmFsKSB7XG4gIGJ1ZmZlci5wdXRJbnQzMih2YWwubGVuZ3RoKTtcbiAgYnVmZmVyLnB1dFN0cmluZyh2YWwpO1xufVxuXG4vKipcbiAqIEhhc2hlcyB0aGUgYXJndW1lbnRzIGludG8gb25lIHZhbHVlIHVzaW5nIFNIQS0xLlxuICpcbiAqIEByZXR1cm4gdGhlIHNoYTEgaGFzaCBvZiB0aGUgcHJvdmlkZWQgYXJndW1lbnRzLlxuICovXG5mdW5jdGlvbiBfc2hhMSgpIHtcbiAgdmFyIHNoYSA9IGZvcmdlLm1kLnNoYTEuY3JlYXRlKCk7XG4gIHZhciBudW0gPSBhcmd1bWVudHMubGVuZ3RoO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IG51bTsgKytpKSB7XG4gICAgc2hhLnVwZGF0ZShhcmd1bWVudHNbaV0pO1xuICB9XG4gIHJldHVybiBzaGEuZGlnZXN0KCk7XG59XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///246\n")},function(module,__webpack_exports__,__webpack_require__){"use strict";eval('// ESM COMPAT FLAG\n__webpack_require__.r(__webpack_exports__);\n\n// NAMESPACE OBJECT: ./node_modules/axios/lib/platform/common/utils.js\nvar utils_namespaceObject = {};\n__webpack_require__.r(utils_namespaceObject);\n__webpack_require__.d(utils_namespaceObject, "hasBrowserEnv", function() { return hasBrowserEnv; });\n__webpack_require__.d(utils_namespaceObject, "hasStandardBrowserWebWorkerEnv", function() { return hasStandardBrowserWebWorkerEnv; });\n__webpack_require__.d(utils_namespaceObject, "hasStandardBrowserEnv", function() { return hasStandardBrowserEnv; });\n__webpack_require__.d(utils_namespaceObject, "navigator", function() { return _navigator; });\n__webpack_require__.d(utils_namespaceObject, "origin", function() { return utils_origin; });\n\n// EXTERNAL MODULE: ./src/global.js\nvar global = __webpack_require__(96);\n\n// EXTERNAL MODULE: ./node_modules/react/index.js\nvar react = __webpack_require__(0);\nvar react_default = /*#__PURE__*/__webpack_require__.n(react);\n\n// EXTERNAL MODULE: ./node_modules/react-dom/index.js\nvar react_dom = __webpack_require__(15);\nvar react_dom_default = /*#__PURE__*/__webpack_require__.n(react_dom);\n\n// EXTERNAL MODULE: ./node_modules/@spectrum-css/vars/dist/spectrum-global.css\nvar spectrum_global = __webpack_require__(101);\n\n// EXTERNAL MODULE: ./node_modules/@spectrum-css/vars/dist/spectrum-light.css\nvar spectrum_light = __webpack_require__(103);\n\n// EXTERNAL MODULE: ./node_modules/@spectrum-css/vars/dist/spectrum-lightest.css\nvar spectrum_lightest = __webpack_require__(105);\n\n// EXTERNAL MODULE: ./node_modules/@spectrum-css/vars/dist/spectrum-dark.css\nvar spectrum_dark = __webpack_require__(107);\n\n// EXTERNAL MODULE: ./node_modules/@spectrum-css/vars/dist/spectrum-darkest.css\nvar spectrum_darkest = __webpack_require__(109);\n\n// EXTERNAL MODULE: ./src/styles.css\nvar styles = __webpack_require__(111);\n\n// EXTERNAL MODULE: ./src/components/css/SharePanel.css\nvar SharePanel = __webpack_require__(113);\n\n// CONCATENATED MODULE: ./src/components/MenuItem.jsx\n\nconst MenuItem = function (props) {\n  const LeftIcon = props.leftIcon;\n  const getClassName = function (name) {\n    return props.disabled ? name + "-disabled" : name;\n  };\n  return /*#__PURE__*/react_default.a.createElement("div", {\n    className: "menu-item"\n  }, /*#__PURE__*/react_default.a.createElement("div", {\n    className: "icon-container"\n  }, /*#__PURE__*/react_default.a.createElement(LeftIcon, {\n    className: getClassName("icon-style")\n  })), /*#__PURE__*/react_default.a.createElement("div", {\n    className: "text-container"\n  }, /*#__PURE__*/react_default.a.createElement("div", {\n    className: getClassName("text-title")\n  }, props.titleStr), /*#__PURE__*/react_default.a.createElement("div", {\n    className: getClassName("text-detail")\n  }, props.disabled ? props.disabledDescStr : props.descStr)));\n};\n// CONCATENATED MODULE: ./src/components/icons/Invite.jsx\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\n\nconst Invite = function (props) {\n  return /*#__PURE__*/react["createElement"]("svg", _extends({\n    xmlns: "http://www.w3.org/2000/svg",\n    height: 18,\n    width: 18\n  }, props), /*#__PURE__*/react["createElement"]("g", {\n    "data-name": "Layer 1"\n  }, /*#__PURE__*/react["createElement"]("path", {\n    className: props.className,\n    d: "M9.601 15.312a6.932 6.932 0 0 1-6.96-2.347 5.857 5.857 0 0 1 2.9-1.313c.714-.062.726-.636.726-1.352a6.514 6.514 0 0 1-1.53-3.882C4.736 4.068 6.073 2.5 8 2.5s3.264 1.567 3.264 3.918a6.514 6.514 0 0 1-1.53 3.882c0 .716.01 1.29.725 1.352a5.582 5.582 0 0 1 2.041.716V11.25a1.752 1.752 0 0 1 1.75-1.75h.5a1.733 1.733 0 0 1 1.118.415 8.01 8.01 0 1 0-5.626 6.26 1.75 1.75 0 0 1-.641-.863Z"\n  }), /*#__PURE__*/react["createElement"]("path", {\n    className: props.className,\n    d: "M14.25 11a.25.25 0 0 0-.25.25V14h-2.75a.25.25 0 0 0-.25.25v.5a.25.25 0 0 0 .25.25H14v2.75a.25.25 0 0 0 .25.25h.5a.25.25 0 0 0 .25-.25V15h2.75a.25.25 0 0 0 .25-.25v-.5a.25.25 0 0 0-.25-.25H15v-2.75a.25.25 0 0 0-.25-.25Z"\n  })));\n};\n/* harmony default export */ var icons_Invite = (Invite);\n// CONCATENATED MODULE: ./src/components/icons/Chat.jsx\nfunction Chat_extends() { return Chat_extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, Chat_extends.apply(null, arguments); }\n\nconst Chat_Invite = function (props) {\n  return /*#__PURE__*/react["createElement"]("svg", Chat_extends({\n    xmlns: "http://www.w3.org/2000/svg",\n    height: 18,\n    width: 18\n  }, props), /*#__PURE__*/react["createElement"]("path", {\n    className: props.className,\n    d: "M9.5 7a.5.5 0 0 1 .5.5v6a.5.5 0 0 1-.5.5H4.793a.5.5 0 0 0-.353.146L3 15.586V14.5a.5.5 0 0 0-.5-.5h-1a.5.5 0 0 1-.5-.5v-6a.5.5 0 0 1 .5-.5Zm-8-1A1.5 1.5 0 0 0 0 7.5v6A1.5 1.5 0 0 0 1.5 15H2v2.397a.25.25 0 0 0 .427.176L5 15h4.5a1.5 1.5 0 0 0 1.5-1.5v-6A1.5 1.5 0 0 0 9.5 6Z"\n  }), /*#__PURE__*/react["createElement"]("path", {\n    className: props.className,\n    d: "M12 7.3A2.3 2.3 0 0 0 9.7 5H6V2.5A1.5 1.5 0 0 1 7.5 1h9A1.5 1.5 0 0 1 18 2.5v6a1.5 1.5 0 0 1-1.5 1.5H15v2.397a.25.25 0 0 1-.427.176L12 10Z"\n  }));\n};\n/* harmony default export */ var Chat = (Chat_Invite);\n// CONCATENATED MODULE: ./src/components/icons/Slack.jsx\nfunction Slack_extends() { return Slack_extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, Slack_extends.apply(null, arguments); }\n\nconst Slack = function (props) {\n  return /*#__PURE__*/react["createElement"]("svg", Slack_extends({\n    xmlns: "http://www.w3.org/2000/svg",\n    width: 18,\n    height: 18,\n    viewBox: "0 0 127 127"\n  }, props), /*#__PURE__*/react["createElement"]("path", {\n    className: props.className,\n    d: "M27.2 80c0 7.3-5.9 13.2-13.2 13.2C6.7 93.2.8 87.3.8 80c0-7.3 5.9-13.2 13.2-13.2h13.2V80zm6.6 0c0-7.3 5.9-13.2 13.2-13.2 7.3 0 13.2 5.9 13.2 13.2v33c0 7.3-5.9 13.2-13.2 13.2-7.3 0-13.2-5.9-13.2-13.2V80z"\n  }), /*#__PURE__*/react["createElement"]("path", {\n    className: props.className,\n    d: "M47 27c-7.3 0-13.2-5.9-13.2-13.2C33.8 6.5 39.7.6 47 .6c7.3 0 13.2 5.9 13.2 13.2V27H47zm0 6.7c7.3 0 13.2 5.9 13.2 13.2 0 7.3-5.9 13.2-13.2 13.2H13.9C6.6 60.1.7 54.2.7 46.9c0-7.3 5.9-13.2 13.2-13.2H47z"\n  }), /*#__PURE__*/react["createElement"]("path", {\n    className: props.className,\n    d: "M99.9 46.9c0-7.3 5.9-13.2 13.2-13.2 7.3 0 13.2 5.9 13.2 13.2 0 7.3-5.9 13.2-13.2 13.2H99.9V46.9zm-6.6 0c0 7.3-5.9 13.2-13.2 13.2-7.3 0-13.2-5.9-13.2-13.2V13.8C66.9 6.5 72.8.6 80.1.6c7.3 0 13.2 5.9 13.2 13.2v33.1z"\n  }), /*#__PURE__*/react["createElement"]("path", {\n    className: props.className,\n    d: "M80.1 99.8c7.3 0 13.2 5.9 13.2 13.2 0 7.3-5.9 13.2-13.2 13.2-7.3 0-13.2-5.9-13.2-13.2V99.8h13.2zm0-6.6c-7.3 0-13.2-5.9-13.2-13.2 0-7.3 5.9-13.2 13.2-13.2h33.1c7.3 0 13.2 5.9 13.2 13.2 0 7.3-5.9 13.2-13.2 13.2H80.1z"\n  }));\n};\n/* harmony default export */ var icons_Slack = (Slack);\n// CONCATENATED MODULE: ./src/components/icons/Teams.jsx\nfunction Teams_extends() { return Teams_extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, Teams_extends.apply(null, arguments); }\n\nconst Teams = function (props) {\n  return /*#__PURE__*/react["createElement"]("svg", Teams_extends({\n    xmlns: "http://www.w3.org/2000/svg",\n    viewBox: "0 0 2228.833 2073.333",\n    height: 18,\n    width: 18\n  }, props), /*#__PURE__*/react["createElement"]("path", {\n    d: "M1554.6 777.5h575.7c54.4 0 98.5 44.1 98.5 98.5v524.4c0 199.9-162.1 362-362 362h-1.7c-199.9 0-362-162-362-361.9V829c0-28.4 23-51.5 51.5-51.5Z",\n    className: "cls-4"\n  }), /*#__PURE__*/react["createElement"]("circle", {\n    cx: 1943.8,\n    cy: 440.6,\n    r: 233.2,\n    className: "cls-4"\n  }), /*#__PURE__*/react["createElement"]("circle", {\n    cx: 1218.1,\n    cy: 336.9,\n    r: 336.9,\n    className: "cls-1"\n  }), /*#__PURE__*/react["createElement"]("path", {\n    d: "M1762.3 1475.3V877.2c1.2-53.7-41.3-98.3-95-99.7H902.8l-3.5 8.3c-33.7 47.3-72.4 90.7-108.1 136.4-22 28.8-42.4 58.9-58.7 91.4-4.4 8.8-12.7 14.4-21.9 16.8-4.3 12.2-8.1 24.6-11.4 37.2-7.1 26.8-11.2 54.5-14.9 81.9-.9 6.9-1.8 13.8-2.6 20.7-.3 5.3-.6 10.6-1.1 15.9-.3 3.3-.8 6.4-1.6 9.4-1.2 12.5-2.3 25.1-3.1 37.6-1.7 25.1-2.5 50.3-2.5 75.5 0 25 2.2 50.1 1.8 75.1-.7 49.1-9.9 97.4-15 146.1-1.1 10.3-3.8 18.5-10.8 26.2-5.5 5.9-13.5 9.1-21.2 10.2-.4 0-.9.1-1.3.1 37.1 280.4 273.7 499.9 565.2 507 322.5-7.9 577.7-275.5 570.2-598.1Z",\n    className: "cls-1"\n  }), /*#__PURE__*/react["createElement"]("path", {\n    d: "m902.8 777.5-3.5 8.3c-33.7 47.3-72.4 90.7-108.1 136.4-22 28.8-42.4 58.9-58.7 91.4-4.4 8.8-12.7 14.4-21.9 16.8-4.3 12.2-8.1 24.6-11.4 37.2-7.1 26.8-11.2 54.5-14.9 81.9-.9 6.9-1.8 13.8-2.6 20.7-.3 5.3-.6 10.6-1.1 15.9-.3 3.3-.8 6.4-1.6 9.4-1.2 12.5-2.3 25.1-3.1 37.6-1.7 25.1-2.5 50.3-2.5 75.5 0 25 2.2 50.1 1.8 75.1-.7 49.1-9.9 97.4-15 146.1-1.1 10.3-3.8 18.5-10.8 26.2-5.3 5.8-13.1 9-20.7 10.1 4.6 31.3 11.5 62.2 20.8 92.6h396c52.2-.4 94.5-42.6 94.9-94.9V777.5H902.9ZM1140.3 561.4v103.1c-105-24.9-191.7-98.5-233.2-198h138.4c52.3.2 94.7 42.6 94.9 94.9Z",\n    className: "cls-2"\n  }), /*#__PURE__*/react["createElement"]("path", {\n    d: "M1045.3 466.5H95c-52.5 0-95 42.5-95 95v950.3c0 52.5 42.5 95 95 95h950.3c52.5 0 95-42.5 95-95V561.5c0-52.5-42.5-95-95-95ZM820.2 828.2h-190v517.3h-121V828.2H320.1V727.9h500.1v100.3Z",\n    className: "cls-3"\n  }));\n};\n/* harmony default export */ var icons_Teams = (Teams);\n// CONCATENATED MODULE: ./src/components/icons/SendToApps.jsx\nfunction SendToApps_extends() { return SendToApps_extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, SendToApps_extends.apply(null, arguments); }\n\nconst SendToApps = function (props) {\n  return /*#__PURE__*/react["createElement"]("svg", SendToApps_extends({\n    xmlns: "http://www.w3.org/2000/svg",\n    width: 18,\n    height: 18,\n    fill: "none"\n  }, props), /*#__PURE__*/react["createElement"]("path", {\n    className: props.className,\n    fill: "#EBEBEB",\n    fillRule: "evenodd",\n    d: "M16.595 2.556.9 7.24a.25.25 0 0 0-.04.463L4.82 9.68l11.775-7.123ZM6.545 10.516l5.968 3a.5.5 0 0 0 .672-.223l4.633-10.111-11.273 7.334ZM5.04 11.625v3.82a.356.356 0 0 0 .587.271l2.68-2.257-3.267-1.834Z",\n    clipRule: "evenodd"\n  }));\n};\n/* harmony default export */ var icons_SendToApps = (SendToApps);\n// CONCATENATED MODULE: ./src/components/icons/QuickExport.jsx\nfunction QuickExport_extends() { return QuickExport_extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, QuickExport_extends.apply(null, arguments); }\n\nconst QuickExport = function (props) {\n  return /*#__PURE__*/react["createElement"]("svg", QuickExport_extends({\n    xmlns: "http://www.w3.org/2000/svg",\n    width: 18,\n    height: 18,\n    fill: "none"\n  }, props), /*#__PURE__*/react["createElement"]("path", {\n    className: props.className,\n    fill: "#EBEBEB",\n    fillRule: "evenodd",\n    d: "M16.5 3h-15a.5.5 0 0 0-.5.5v11a.5.5 0 0 0 .5.5h15a.5.5 0 0 0 .5-.5v-11a.5.5 0 0 0-.5-.5Zm-.5 9.686-2.636-2.636a1 1 0 0 0-1.414 0l-1.536 1.536-3.778-3.778a1 1 0 0 0-1.414 0L2 11.029V4h14v8.686Z",\n    clipRule: "evenodd"\n  }), /*#__PURE__*/react["createElement"]("path", {\n    className: props.className,\n    fill: "#EBEBEB",\n    d: "M13.35 8a1.35 1.35 0 1 0 0-2.7 1.35 1.35 0 0 0 0 2.7Z"\n  }));\n};\n/* harmony default export */ var icons_QuickExport = (QuickExport);\n// CONCATENATED MODULE: ./src/components/icons/AnimateInFirefly.jsx\nfunction AnimateInFirefly_extends() { return AnimateInFirefly_extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, AnimateInFirefly_extends.apply(null, arguments); }\n\nconst AnimateInFirefly = function (props) {\n  return /*#__PURE__*/react["createElement"]("svg", AnimateInFirefly_extends({\n    xmlns: "http://www.w3.org/2000/svg",\n    width: "18px",\n    height: "18px",\n    fill: "none"\n  }, props), /*#__PURE__*/react["createElement"]("path", {\n    className: props.className,\n    fill: "var(--iconFill, #6E6E6E)",\n    fillRule: "evenodd",\n    d: "M14.22168,1H3.77832c-1.53442,0-2.77832,1.2439-2.77832,2.77832v9.44336 c0,1.53442,1.2439,2.77832,2.77832,2.77832h10.44336c1.53442,0,2.77832-1.2439,2.77832-2.77832V3.77832 c0-1.53442-1.2439-2.77832-2.77832-2.77832ZM10.04712,6.27496h-2.92578v1.60571h2.63721 c.05994,0,.0885.01999.0885.08286v1.1543c0,.06284-.03137.08286-.08289.08286h-2.64282v2.58856 c0,.06287-.02856.09143-.09143.09143h-1.30566c-.05139,0-.07141-.03714-.07141-.09143v-6.75143 c0-.06.02002-.08286.07996-.08286h4.18567c.07153,0,.08862.01999.1001.08856l.11707,1.14001 c.01147.06287-.0199.09143-.0885.09143ZM12.39563,11.78067c0,.06857-.02002.09714-.09705.09714h-1.27441 c-.07141,0-.10571-.03143-.10571-.09998v-5.06287c0-.06.02856-.08859.08862-.08859h1.30005 c.06848,0,.0885.01715.0885.08572v5.06857ZM12.62134,5.62924l-.64575-.14572 c-.08276-.01999-.17419.00287-.23706.06287l-.48572.44858c-.19141.17712-.49719.00284-.44006-.25143l.14575-.64572 c.02002-.08569-.00281-.17429-.06287-.23712l-.44861-.48572c-.17712-.19144,0-.49429.25439-.43716l.64563.14572 c.08289.01999.17432-.00284.23718-.06287l.48572-.44855c.19141-.17715.49719-.00287.44006.2514l-.14575.64572 c-.02002.08572.00281.17429.06287.23715l.44849.48572c.17712.19144,0,.49429-.25427.43713Z",\n    clipRule: "evenodd"\n  }));\n};\n/* harmony default export */ var icons_AnimateInFirefly = (AnimateInFirefly);\n// CONCATENATED MODULE: ./src/utils/commonUtils.js\nconst MENU_ACTION = Object.freeze({\n  REVIEW: Symbol("review"),\n  INVITE: Symbol("invite"),\n  SLACK: Symbol("slack"),\n  TEAMS: Symbol("teams"),\n  LOCALSHARING: Symbol("localSharing"),\n  QUICKEXPORT: Symbol("QuickExport"),\n  ANIMATEINFIREFLY: Symbol("AnimateInFirefly")\n});\nconst INVITE_TO_EDIT_MENU = "INVITE_TO_EDIT_MENU";\nconst SHARE_FOR_REVIEW_MENU = "SHARE_FOR_REVIEW_MENU";\nconst SHARE_VIA_SLACK = "SHARE_VIA_SLACK";\nconst SHARE_VIA_TEAMS = "SHARE_VIA_TEAMS";\nconst LOCAL_SHARING = "LOCAL_SHARING";\nconst QUICK_EXPORT = "QUICK_EXPORT";\nconst ANIMATE_IN_FIREFLY = "ANIMATE_IN_FIREFLY";\nconst ENTER_KEY = "Enter";\nconst ESCAPE_KEY = "Escape";\nconst BOUNDS = {\n  TOP: 1,\n  RIGHT: 2,\n  BOTTOM: 4,\n  LEFT: 8\n};\nconst DEBUG = Boolean(false);\n\n// Feature flag constants\nconst FEATURE_FLAGS = {\n  FEATURE_FLAGS_ANIMATE_IN_FIREFLY: \'AnimateInFirefly\'\n};\nconst isMac = Boolean(navigator.platform === "darwin");\nconst isWindows = Boolean(navigator.platform.match(/^win/));\nconst OS_EVENTS = {\n  MOUSE_DOWN: "globalMouseDown"\n};\nconst GLOBAL_EVENTS = ["globalMouseDown"];\nconst UXPEventTypes = {\n  KEYDOWN: "keydown",\n  THEME: "themechanged"\n};\nfunction isInBoundary(coordinates, position) {\n  const {\n    y,\n    x\n  } = coordinates;\n  const {\n    bottom,\n    left,\n    right,\n    top\n  } = position;\n  return x > left && x < right && y < bottom && y > top;\n}\nconst handlers = new Map();\nfunction setDialogListener(eventName, dialogId, callback) {\n  if (!handlers.has(eventName)) {\n    handlers.set(eventName, new Map());\n  }\n  handlers.get(eventName).set(dialogId, callback);\n}\nfunction removeDialogListeners(dialogId) {\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  for (const [event, eventMap] of handlers) {\n    eventMap.delete(dialogId);\n  }\n}\nconst emit = function (eventName, descriptor) {\n  if (!handlers.get(eventName)) {\n    return;\n  }\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  for (const [id, handler] of handlers.get(eventName)) {\n    handler(eventName, descriptor);\n  }\n};\n// EXTERNAL MODULE: ./node_modules/lodash/lodash.js\nvar lodash = __webpack_require__(91);\n\n// CONCATENATED MODULE: ./src/utils/nls.js\nfunction ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\nfunction _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }\nfunction _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }\n// Referenced from: https://git.corp.adobe.com/photoshop/uxp-export-as/blob/main/src/utils/nls.ts\n\n\nconst DEFAULT_LOCALE = \'en\';\nlet dictionaries = null;\nlet _locale = DEFAULT_LOCALE;\nif (window.require) {\n  setLocale(window.require(\'uxp\').host.locale);\n}\nfunction localize(key, ...args) {\n  const dictionary = _getLocalDictionaries()[_locale] || _getLocalDictionaries()[DEFAULT_LOCALE];\n  let translated = Object(lodash["get"])(dictionary, key);\n  if (typeof translated !== \'string\') {\n    translated = key;\n  }\n  return _expand(translated, ...args);\n}\nfunction setLocale(locale) {\n  if (locale && locale.length !== 2) {\n    if (locale.match(/^zh[-_]/)) {\n      locale = locale.replace(\'_\', \'-\');\n    } else {\n      locale = locale.split(/[-_]/)[0];\n    }\n  }\n  _locale = locale || DEFAULT_LOCALE;\n}\nfunction setDictionary(locale, dictionary) {\n  assert(dictionaries);\n  if (!dictionaries[locale]) {\n    dictionaries[locale] = {};\n  }\n  dictionaries[locale] = _objectSpread(_objectSpread({}, dictionaries[locale]), dictionary);\n}\nfunction getLocale() {\n  return _locale;\n}\nfunction getLocales() {\n  return Array.from(Object.keys(_getLocalDictionaries()));\n}\nfunction _expand(translation, ...args) {\n  return translation.replace(/{(\\d)}/g, function (match, substring) {\n    const index = Number.parseInt(substring[0], 10);\n    if (Number.isNaN(index)) {\n      return match;\n    }\n    return args[index];\n  });\n}\nfunction _getLocalDictionaries() {\n  if (dictionaries) {\n    return dictionaries;\n  }\n  const languageContext = __webpack_require__(116);\n  dictionaries = languageContext.keys().reduce(function (messageMap, key) {\n    const language = (key.match(/^\\.\\/(.*)\\/.*\\.json$/) || [])[1];\n    const dictionary = languageContext(key);\n    messageMap[language] = dictionary;\n    return messageMap;\n  }, {});\n  return dictionaries;\n}\nfunction assert(t, message) {\n  if (!t) {\n    throw new Error(`${message || \'Assertion failed\'} (expects variable to be truthful, got ${t})`);\n  }\n}\n// EXTERNAL MODULE: ./src/components/css/style.css\nvar style = __webpack_require__(25);\n\n// CONCATENATED MODULE: ./src/components/icons/ForwardArrow.jsx\nfunction ForwardArrow_extends() { return ForwardArrow_extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, ForwardArrow_extends.apply(null, arguments); }\n\nconst ForwardArrow = function (props) {\n  return /*#__PURE__*/react["createElement"]("svg", ForwardArrow_extends({\n    xmlns: "http://www.w3.org/2000/svg",\n    width: 10,\n    height: 10,\n    fill: "none"\n  }, props), /*#__PURE__*/react["createElement"]("path", {\n    className: props.className,\n    fill: "#D1D1D1",\n    fillRule: "evenodd",\n    d: "M7.964 5.184C7.977 5.122 8 5.063 8 5s-.022-.122-.035-.184c-.01-.048-.01-.097-.029-.144-.028-.069-.078-.128-.124-.19-.024-.03-.036-.068-.064-.097-.001 0-.002 0-.003-.002-.002-.001-.002-.004-.004-.006L3.615.302a.875.875 0 1 0-1.23 1.245L5.88 5 2.385 8.453a.875.875 0 0 0 1.23 1.245L7.74 5.623c.002-.002.002-.005.004-.006l.003-.002c.028-.03.04-.066.064-.098.046-.061.097-.12.124-.19.019-.046.019-.095.03-.143Z",\n    clipRule: "evenodd"\n  }));\n};\n/* harmony default export */ var icons_ForwardArrow = (ForwardArrow);\n// CONCATENATED MODULE: ./src/host/photoshop.js\nvar _window$require, _window, _window$require$call, _window$require$call$;\n/*\nNote : Most of the code present here is copied from the CCX ShareSheet\nSpecially from files visibility.js and constants.js\n*/\n\nconst HOST = (_window$require = (_window = window).require) === null || _window$require === void 0 ? void 0 : (_window$require$call = _window$require.call(_window, "uxp")) === null || _window$require$call === void 0 ? void 0 : (_window$require$call$ = _window$require$call.host) === null || _window$require$call$ === void 0 ? void 0 : _window$require$call$.name.toLowerCase();\nconst psAction = HOST === "photoshop" ? window.require("photoshop").action : {};\nconst psCore = HOST === "photoshop" ? window.require("photoshop").core : {};\nconst butler = HOST === "photoshop" ? window.require("photoshop").butler : {};\nconst PS_DIALOG_DEFAULT_THEME = "dark";\nconst PS_DIALOG_POSITION_HEIGHT = 255;\nconst PS_DIALOG_POSITION_WIDTH = 290;\n\n//TO DO: revisit this value\nconst PS_DIALOG_POSITION_OFFSET_H = 50;\nconst PS_DIALOG_POSITION_OFFSET_V = 4;\nconst PS_DIALOG_SIZE = {\n  height: PS_DIALOG_POSITION_HEIGHT,\n  width: PS_DIALOG_POSITION_WIDTH\n};\n\n// This is the element id of the ui button in PS which invoke this panel\n// Currently this is hardcoded, we will be making it dynamic in future\nconst PS_VIEW_ID_RENDER_TARGET = "$invv";\nconst PS_DIALOG_BATCH_CONFIG = [{\n  _obj: "uiInfo",\n  _target: {\n    _enum: "ordinal",\n    _ref: "application",\n    _value: "targetEnum"\n  },\n  command: "getViewInfo",\n  panel: "options",\n  viewID: PS_VIEW_ID_RENDER_TARGET\n}];\n\n/**\n * @returns coordinate of the share button\n */\nconst _getCTAButtonPosition = async function () {\n  var _app$view;\n  const config = (await (psAction === null || psAction === void 0 ? void 0 : psAction.batchPlay(PS_DIALOG_BATCH_CONFIG, {}))) || [];\n  const app = config === null || config === void 0 ? void 0 : config[0];\n  return app === null || app === void 0 ? void 0 : (_app$view = app.view) === null || _app$view === void 0 ? void 0 : _app$view.globalBounds;\n};\n\n/**\n * @returns coordinate at which the dilaog needs to be rendered\n */\nfunction _getDialogRenderCoordinates(ctaButtonCoordinates, baseSize, scaleFactor = 1) {\n  let bottom;\n  let left;\n  let right;\n  let top;\n  const centerButton = (ctaButtonCoordinates.right - ctaButtonCoordinates.left) / 2;\n\n  // Adjust pixel-based values with OS-level scale factor\n  const centerOffset = PS_DIALOG_POSITION_OFFSET_H * scaleFactor + centerButton;\n  const size = {\n    height: baseSize.height * scaleFactor,\n    width: baseSize.width * scaleFactor\n  };\n  bottom = ctaButtonCoordinates.bottom + size.height + PS_DIALOG_POSITION_OFFSET_V;\n  left = ctaButtonCoordinates.left + centerOffset - size.width;\n  right = ctaButtonCoordinates.left + centerOffset;\n  top = ctaButtonCoordinates.bottom + PS_DIALOG_POSITION_OFFSET_V;\n  return {\n    bottom,\n    left,\n    right,\n    top\n  };\n}\n\n/**\n * @returns coordinate at which the dialog needs to be rendered based on button coordinates and screen boundary\n */\nfunction _getDialogRenderCoordinatesBoundBased(ctaButtonCoordinates, baseSize, scaleFactor = 1, boundsFlag = 0) {\n  let bottom;\n  let left;\n  let right;\n  let top;\n  const centerButton = (ctaButtonCoordinates.right - ctaButtonCoordinates.left) / 2;\n\n  // Adjust pixel-based values with OS-level scale factor\n  const centerOffset = PS_DIALOG_POSITION_OFFSET_H * scaleFactor + centerButton;\n  const size = {\n    height: baseSize.height * scaleFactor,\n    width: baseSize.width * scaleFactor\n  };\n  switch (boundsFlag) {\n    case 0:\n      //Dialog fully inside\n      bottom = ctaButtonCoordinates.bottom + size.height + PS_DIALOG_POSITION_OFFSET_V;\n      left = ctaButtonCoordinates.left + centerOffset - size.width;\n      right = ctaButtonCoordinates.left + centerOffset;\n      top = ctaButtonCoordinates.bottom + PS_DIALOG_POSITION_OFFSET_V;\n      break;\n    case 2:\n      //Right out of bounds\n      bottom = ctaButtonCoordinates.bottom + size.height + PS_DIALOG_POSITION_OFFSET_V;\n      left = ctaButtonCoordinates.left - size.width;\n      right = ctaButtonCoordinates.left;\n      top = ctaButtonCoordinates.bottom + PS_DIALOG_POSITION_OFFSET_V;\n      break;\n    case 4:\n      //Bottom out of bounds\n      bottom = ctaButtonCoordinates.top - PS_DIALOG_POSITION_OFFSET_V;\n      left = ctaButtonCoordinates.left + centerOffset - size.width;\n      right = ctaButtonCoordinates.left + centerOffset;\n      top = ctaButtonCoordinates.top - PS_DIALOG_POSITION_OFFSET_V - size.height;\n      break;\n    case 6:\n      //Bottom and Right out of bounds\n      bottom = ctaButtonCoordinates.top - PS_DIALOG_POSITION_OFFSET_V;\n      left = ctaButtonCoordinates.left - size.width;\n      right = ctaButtonCoordinates.left;\n      top = ctaButtonCoordinates.top - PS_DIALOG_POSITION_OFFSET_V - size.height;\n      break;\n    case 8:\n      //Left out of bounds\n      bottom = ctaButtonCoordinates.bottom + size.height + PS_DIALOG_POSITION_OFFSET_V;\n      left = ctaButtonCoordinates.right;\n      right = ctaButtonCoordinates.right + size.width;\n      top = ctaButtonCoordinates.bottom + PS_DIALOG_POSITION_OFFSET_V;\n      break;\n    case 12:\n      //1100 : Left and Bottom out of bounds\n      bottom = ctaButtonCoordinates.top - PS_DIALOG_POSITION_OFFSET_V;\n      left = ctaButtonCoordinates.right;\n      right = ctaButtonCoordinates.right + size.width;\n      top = ctaButtonCoordinates.top - PS_DIALOG_POSITION_OFFSET_V - size.height;\n      break;\n    default:\n      bottom = 0;\n      left = 0;\n      right = 0;\n      top = 0;\n      break;\n  }\n  return {\n    bottom,\n    left,\n    right,\n    top\n  };\n}\nfunction isInScreenBoundary(screenCoordinates = {}, dialogCoordinates = {}) {\n  const {\n    bottom,\n    left,\n    right,\n    top\n  } = screenCoordinates;\n  const {\n    bottom: dBottom,\n    left: dLeft,\n    right: dRight,\n    top: dTop\n  } = dialogCoordinates;\n  return dLeft >= left && dRight <= right && dTop >= top && dBottom <= bottom;\n}\nfunction isEmptyDialogCoordinates(dialogCoordinates = {}) {\n  if (!Object.keys(dialogCoordinates).length) return true;\n  const {\n    bottom,\n    left,\n    right,\n    top\n  } = dialogCoordinates;\n  return top === 0 && right === 0 && bottom === 0 && left === 0;\n}\nfunction getBoundsFlag(screenCoordinates = {}, dialogCoordinates = {}) {\n  const {\n    bottom,\n    left,\n    right,\n    top\n  } = screenCoordinates;\n  const {\n    bottom: dBottom,\n    left: dLeft,\n    right: dRight,\n    top: dTop\n  } = dialogCoordinates;\n  let boundsFlag = 0;\n  if (dTop < top) boundsFlag = boundsFlag | BOUNDS.TOP;\n  if (dRight > right) boundsFlag = boundsFlag | BOUNDS.RIGHT;\n  if (dBottom > bottom) boundsFlag = boundsFlag | BOUNDS.BOTTOM;\n  if (dLeft < left) boundsFlag = boundsFlag | BOUNDS.LEFT;\n  return boundsFlag;\n}\nfunction _getMidpoint(min, max) {\n  return min + 0.5 * (max - min);\n}\nfunction _getOwnerScreen(screens, ctaButtonCoordinates) {\n  const ctaMidPointH = _getMidpoint(ctaButtonCoordinates.left, ctaButtonCoordinates.right);\n  const ctaMidPointV = _getMidpoint(ctaButtonCoordinates.top, ctaButtonCoordinates.bottom);\n  const ownerScreen = screens.find(function (screen) {\n    return ctaMidPointH >= screen.globalBounds.left && ctaMidPointH <= screen.globalBounds.right && ctaMidPointV >= screen.globalBounds.top && ctaMidPointV <= screen.globalBounds.bottom;\n  });\n  if (!ownerScreen) {\n    console.warn("Could not find the owner screen");\n  }\n\n  // Add first screen at the default\n  return ownerScreen || screens[0];\n}\n\n/**\n * @returns\n * dialogCoordinates: coordinate at which the dilaog needs to be rendered\n * ctaButtonCoordinates: coordinate of the control button which triggered the dialog\n */\nasync function getRenderCoordinate(baseSize = PS_DIALOG_SIZE) {\n  const ctaButtonCoordinates = await _getCTAButtonPosition();\n  const screens = await psCore.getDisplayConfiguration({});\n  const ctaScreen = _getOwnerScreen(screens, ctaButtonCoordinates);\n  const screenCoordinates = ctaScreen === null || ctaScreen === void 0 ? void 0 : ctaScreen.globalWorkingBounds;\n  const isMac = navigator.platform === "darwin";\n  const scaleFactor = isMac ? 1 : ctaScreen.scaleFactor;\n\n  // Determine dialog coordinates based on CTA button position\n  let dialogCoordinates = _getDialogRenderCoordinates(ctaButtonCoordinates, baseSize, scaleFactor);\n\n  // LASTLY CHECK THAT THE COORDINATES ARE IN SCREEN BOUNDARY, WILL CRASH PS IN NOT IN BOUNDARY\n  if (isInScreenBoundary(screenCoordinates, dialogCoordinates)) {\n    return {\n      dialogCoordinates,\n      ctaButtonCoordinates\n    };\n  } else {\n    const boundsFlag = getBoundsFlag(screenCoordinates, dialogCoordinates);\n    // Determine dialog coordinates based on CTA button position and screen boundary\n    let updatedDialogCoordinates = _getDialogRenderCoordinatesBoundBased(ctaButtonCoordinates, baseSize, scaleFactor, boundsFlag);\n    // ALWAYS RETURN CTA COORDINATES FOR OUT OF DIALOG CLOSE TESTING\n    if (isEmptyDialogCoordinates(updatedDialogCoordinates)) return {\n      ctaButtonCoordinates\n    };\n    return {\n      dialogCoordinates: updatedDialogCoordinates,\n      ctaButtonCoordinates\n    };\n  }\n}\nconst getNested = function (obj, ...args) {\n  return args.reduce(function (obj, level) {\n    return obj && obj[level];\n  }, obj);\n};\nconst logToIngest = function (obj, props, referrer = undefined, count = undefined, value = undefined, size = undefined, extension = undefined) {\n  let innerProps = props instanceof Array ? [...props] : [props];\n  // Returns the inner most prop\'s value or undefined if obj or any prop in the nested chain is not present\n  let data = getNested(obj, ...innerProps);\n  if (!data) {\n    return;\n  }\n  if (referrer) {\n    data["event.referrer"] = referrer;\n  }\n  if (count) {\n    data["event.count"] = count;\n  }\n  if (value) {\n    data["event.value"] = value;\n  }\n  if (size) {\n    data["content.size"] = size;\n  }\n  if (extension) {\n    data["content.extension"] = extension;\n  }\n  psCore.logDunamisEvent(data);\n};\n\n/**\n * Get feature flag status from Photoshop host application\n * @param {string} flagName - The name of the feature flag\n * @returns {Promise<boolean>} - The current status of the feature flag\n */\nconst getFeatureFlagStatus = async function (flagName) {\n  try {\n    if (HOST === "photoshop" && psAction) {\n      var _result$;\n      const result = await psAction.batchPlay([{\n        _obj: "featureInfo",\n        _target: {\n          _ref: "application",\n          _enum: "ordinal",\n          _value: "targetEnum"\n        },\n        command: "getFeatureActive",\n        feature: flagName\n      }], {});\n      return (result === null || result === void 0 ? void 0 : (_result$ = result[0]) === null || _result$ === void 0 ? void 0 : _result$.active) === true;\n    }\n    return false;\n  } catch (error) {\n    console.warn(\'Failed to get feature flag status:\', error);\n    return false;\n  }\n};\n// CONCATENATED MODULE: ./src/components/ShareMenu.jsx\nfunction ShareMenu_extends() { return ShareMenu_extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, ShareMenu_extends.apply(null, arguments); }\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst shell = __webpack_require__(9).shell;\nconst sharePanelIngest = __webpack_require__(33);\nconst ShareMenu = function (props) {\n  const [inviteTitleStr, setInviteTitleStr] = Object(react["useState"])("");\n  const [inviteDescStr, setInviteDescStr] = Object(react["useState"])("");\n  const [reviewTitleStr, setReviewTitleStr] = Object(react["useState"])("");\n  const [reviewDescStr, setReviewDescStr] = Object(react["useState"])("");\n  const [reviewDisabledDescStr, setReviewDisabledDescStr] = Object(react["useState"])("");\n  const [quickExportFormat, setQuickExportFormat] = Object(react["useState"])("");\n  const isReviewDisabled = props.isReviewDisabled;\n  const panelHost = window.sharePanelHost;\n  Object(react["useEffect"])(function () {\n    // The better way to handle localization is to have support in plugin itself.\n    // But currently we are using client api to get localized strings.\n    if (panelHost) {\n      setInviteTitleStr(localize(\'INVITE_TITLE\'));\n      setInviteDescStr(localize(\'INVITE_DESCRIPTION\'));\n      setReviewTitleStr(localize(\'REVIEW_TITLE\'));\n      setReviewDescStr(localize(\'REVIEW_DESCRIPTION\'));\n      setReviewDisabledDescStr(localize(\'REVIEW_DISABLED_DESCRIPTION\'));\n    }\n  }, []);\n  Object(react["useEffect"])(function () {\n    if (panelHost && props.visible) {\n      const format = panelHost.getExportPreference();\n      setQuickExportFormat(format);\n    }\n  }, [props.visible]);\n  const handleMenuChange = function (val) {\n    if (val == MENU_ACTION.REVIEW) {\n      props.closeDialog();\n      panelHost === null || panelHost === void 0 ? void 0 : panelHost.onReview();\n    } else if (val == MENU_ACTION.INVITE) {\n      props.closeDialog();\n      panelHost === null || panelHost === void 0 ? void 0 : panelHost.onInvite();\n    } else if (val == MENU_ACTION.SLACK) {\n      //props.closeDialog();\n      props.setSlackPanelActive(!props.isSlackPanelActive);\n    } else if (val == MENU_ACTION.TEAMS) {\n      // TODO: Implement Teams share\n    } else if (val == MENU_ACTION.LOCALSHARING) {\n      props.setLocalSharingPanelActive(!props.isLocalSharingPanelActive);\n      logToIngest(sharePanelIngest["local_sharing"], "show");\n    } else if (val == MENU_ACTION.QUICKEXPORT) {\n      props.closeDialog();\n      panelHost.quickExportAs();\n    } else if (val == MENU_ACTION.ANIMATEINFIREFLY) {\n      props.closeDialog();\n      logToIngest(sharePanelIngest["animate_in_firefly"], "click");\n      panelHost === null || panelHost === void 0 ? void 0 : panelHost.animateInFirefly();\n    }\n  };\n\n  // Note: can\'t use sp-menu currently as it has the blue tick getting displayed when a menu item\n  // is selected and there is no way to get rid of that right now.\n  return /*#__PURE__*/react_default.a.createElement("div", null, /*#__PURE__*/react_default.a.createElement("sp-menu-item", {\n    "data-menu": INVITE_TO_EDIT_MENU,\n    onClick: function () {\n      handleMenuChange(MENU_ACTION.INVITE);\n    }\n  }, /*#__PURE__*/react_default.a.createElement(MenuItem, {\n    disabled: false,\n    titleStr: inviteTitleStr,\n    descStr: inviteDescStr,\n    leftIcon: icons_Invite\n  })), /*#__PURE__*/react_default.a.createElement("sp-menu-item", ShareMenu_extends({\n    "data-menu": SHARE_FOR_REVIEW_MENU\n  }, isReviewDisabled ? {\n    disabled: true\n  } : {}, {\n    onClick: function () {\n      !isReviewDisabled && handleMenuChange(MENU_ACTION.REVIEW);\n    }\n  }), /*#__PURE__*/react_default.a.createElement(MenuItem, {\n    disabled: isReviewDisabled,\n    titleStr: reviewTitleStr,\n    disabledDescStr: reviewDisabledDescStr,\n    descStr: reviewDescStr,\n    leftIcon: Chat\n  })), /*#__PURE__*/react_default.a.createElement("sp-divider", null), /*#__PURE__*/react_default.a.createElement("sp-menu-item", {\n    "data-menu": QUICK_EXPORT,\n    onClick: function () {\n      handleMenuChange(MENU_ACTION.QUICKEXPORT);\n    }\n  }, /*#__PURE__*/react_default.a.createElement(MenuItem, {\n    disabled: false,\n    titleStr: `${localize(\'QUICK_EXPORT_TITLE\')} ${quickExportFormat}`,\n    descStr: localize(\'QUICK_EXPORT_DESCRIPTION\'),\n    leftIcon: icons_QuickExport\n  })), props.isAnimateInFireflyEnabled && /*#__PURE__*/react_default.a.createElement("sp-menu-item", {\n    "data-menu": ANIMATE_IN_FIREFLY,\n    onClick: function () {\n      handleMenuChange(MENU_ACTION.ANIMATEINFIREFLY);\n    }\n  }, /*#__PURE__*/react_default.a.createElement(MenuItem, {\n    disabled: false,\n    titleStr: localize(\'ANIMATE_IN_FIREFLY_TITLE\'),\n    descStr: localize("ANIMATE_IN_FIREFLY_DESCRIPTION"),\n    leftIcon: icons_AnimateInFirefly\n  })),  false && /*#__PURE__*/false, /*#__PURE__*/react_default.a.createElement("sp-menu-item", {\n    "data-menu": LOCAL_SHARING,\n    onMouseDown: function () {\n      // Using onMouseDown instead of onClick because intermittently the button loses focus\n      // immediately after gaining it (focus -> blur), which prevents onClick from firing.\n      // onMouseDown executes before focus can be stolen, ensuring the action runs.\n      handleMenuChange(MENU_ACTION.LOCALSHARING);\n    }\n  }, /*#__PURE__*/react_default.a.createElement("div", {\n    className: "menu-container"\n  }, /*#__PURE__*/react_default.a.createElement(MenuItem, {\n    disabled: false,\n    titleStr: localize(\'SEND_TO_APPS_TITLE\'),\n    descStr: localize(\'SEND_TO_APPS_DESCRIPTION\'),\n    leftIcon: icons_SendToApps\n  }), /*#__PURE__*/react_default.a.createElement(icons_ForwardArrow, {\n    className: "icon-style"\n  }))),  false && /*#__PURE__*/false);\n};\n// EXTERNAL MODULE: external "photoshop"\nvar external_photoshop_ = __webpack_require__(18);\n\n// EXTERNAL MODULE: ./node_modules/styled-components/dist/styled-components.browser.esm.js\nvar styled_components_browser_esm = __webpack_require__(2);\n\n// CONCATENATED MODULE: ./src/components/LocalShareItem.jsx\n\n\n\nconst LocalShareItem_MenuItem = styled_components_browser_esm["a" /* default */].div`\n  width: 100%;\n  height: 48px;\n  display: flex;\n  align-items: center;\n`;\nconst IconContainer = styled_components_browser_esm["a" /* default */].div`\n  margin: 15px 12px 15px 8px;\n  width: 18px;\n  height: 18px;\n`;\nconst TextContainer = styled_components_browser_esm["a" /* default */].div`\n  display: flex;\n  flex-direction: column;\n  justify-content: center;\n`;\nconst LocalShareItem = function (props) {\n  const LeftIcon = props.leftIcon;\n  const getClassName = function (name) {\n    return props.disabled ? name + "-disabled" : name;\n  };\n  return /*#__PURE__*/react_default.a.createElement(LocalShareItem_MenuItem, null, /*#__PURE__*/react_default.a.createElement(IconContainer, null, /*#__PURE__*/react_default.a.createElement(LeftIcon, {\n    className: getClassName("icon-style")\n  })), /*#__PURE__*/react_default.a.createElement(TextContainer, null, /*#__PURE__*/react_default.a.createElement("div", {\n    className: getClassName("text-title")\n  }, props.titleStr)));\n};\n// CONCATENATED MODULE: ./src/components/icons/BackIcon.jsx\nfunction BackIcon_extends() { return BackIcon_extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, BackIcon_extends.apply(null, arguments); }\n\nconst BackIcon = function (props) {\n  return /*#__PURE__*/react["createElement"]("svg", BackIcon_extends({\n    xmlns: "http://www.w3.org/2000/svg",\n    width: "1em",\n    height: "1em",\n    fill: "none"\n  }, props), /*#__PURE__*/react["createElement"]("path", {\n    className: props.className,\n    fill: "#DDD",\n    fillRule: "evenodd",\n    d: "M9.5 1.25a1.094 1.094 0 0 1 .773 1.868L5.891 7.5l4.382 4.382a1.094 1.094 0 1 1-1.547 1.547L3.57 8.273a1.094 1.094 0 0 1 0-1.546L8.726 1.57c.214-.214.494-.32.774-.321Z",\n    clipRule: "evenodd"\n  }));\n};\n/* harmony default export */ var icons_BackIcon = (BackIcon);\n// CONCATENATED MODULE: ./src/components/Settings.jsx\nfunction Settings_extends() { return Settings_extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, Settings_extends.apply(null, arguments); }\n\n\n\n\n\n\n\n\n/////// Styled Components ///////\n\nconst IconSlot = styled_components_browser_esm["a" /* default */].div`\n    fill: var(--spectrum-alias-component-text-color);\n`;\nconst DialogDiv = styled_components_browser_esm["a" /* default */].div`\n    width: ${function (props) {\n  return props.width;\n}}px; /* Use props for width */\n    height: ${function (props) {\n  return props.height;\n}}px; /* Use props for height */\n    position: relative;\n`;\nconst HeaderViewContainer = styled_components_browser_esm["a" /* default */].div`\n    display: flex;\n    flex-direction: column;\n    padding: 10px 0 0 0;\n`;\nconst HeaderView = styled_components_browser_esm["a" /* default */].div`\n    display: flex;\n    flex-direction: row;\n    justify-content: space-between;\n    align-items: center;\n`;\nconst HeaderTextView = styled_components_browser_esm["a" /* default */].div`\n    display: flex;\n    align-items: center;\n`;\nconst SlackPanelDiv = styled_components_browser_esm["a" /* default */].div`\n    display: flex;\n    flex-direction: column;\n    height: 100%;\n    padding: 15px;\n    position: absolute;\n    width: 100%;\n    top: 0;\n`;\nconst SlackPanelInnerContainer = styled_components_browser_esm["a" /* default */].div`\n    overflow: auto;\n    display: flex;\n    flex-direction: column;\n    height: 100%;\n`;\nconst SlackPanelInner = styled_components_browser_esm["a" /* default */].div`\n  flex: 1 1 0; /* Flex grow, shrink, and basis */\n  width: 100%;\n  height: 0px; /* This may be adjusted based on content */\n  overflow-y: auto; /* Enable vertical scrolling */\n  /* add padding to each child*/\n  & > * {\n    padding: 10px;\n  }\n`;\nconst FormatView = styled_components_browser_esm["a" /* default */].div`\n  display: flex;\n  flex-direction: column;\n  width: 100%;\n`;\n\n/////// Styled Components ///////\n\nconst SettingsPanel = Object(react["forwardRef"])(function (props, ref) {\n  const [isPSDSelected, setIsPSDSelected] = Object(react["useState"])(false);\n  const dialogRef = Object(react["useRef"])(null);\n\n  // Get the actual dimensions to display\n  const originalDimensions = props.originalDocumentSize ? `${props.originalDocumentSize.width} x ${props.originalDocumentSize.height} px` : localize(\'DIMENSION_ORIGINAL_SUFFIX\');\n  const smallDimensions = props.originalDocumentSize ? `${Math.round(props.originalDocumentSize.width * 0.5)} x ${Math.round(props.originalDocumentSize.height * 0.5)} px` : `50% ${localize(\'DIMENSION_SMALL_SUFFIX\')}`;\n  const closeDialog = Object(react["useCallback"])(function () {\n    props.setSettingsPanelActive(false);\n    const dialog = dialogRef === null || dialogRef === void 0 ? void 0 : dialogRef.current;\n    return (dialog === null || dialog === void 0 ? void 0 : dialog.open) && (dialog === null || dialog === void 0 ? void 0 : dialog.close());\n  }, [dialogRef]);\n\n  // Expose closeDialog to parent\n  Object(react["useImperativeHandle"])(ref, function () {\n    return {\n      closeDialog\n    };\n  });\n  const showDialog = Object(react["useCallback"])(function () {\n    const dialog = dialogRef === null || dialogRef === void 0 ? void 0 : dialogRef.current;\n    dialog.show({\n      anchorOffset: props.panelLocation,\n      isTransparent: true,\n      opacity: 1.0,\n      size: props.panelSize,\n      resize: "vertical",\n      overflow: "scroll"\n    });\n    props.setSettingsPanelActive(true);\n  }, [dialogRef, props]);\n  const handleBack = function () {\n    closeDialog();\n    props.openLocalSharePanel();\n  };\n  const handleMenuChange = function (evt) {\n    let val = evt.target.value;\n    setIsPSDSelected(val === \'psd\');\n    props.setExportFormat(val);\n  };\n  const handleSizeChange = function (size) {\n    props.setSelectedSizeType(size);\n  };\n  Object(react["useEffect"])(function () {\n    if (props.visible) {\n      showDialog();\n    } else {\n      closeDialog();\n    }\n  }, [props.visible]);\n  const handleGlobalMouseDown = function (event, coordinates) {\n    if (!props.visible) return;\n    if (!isInBoundary(coordinates, props.panelLocation) && props.buttonLocation && !isInBoundary(coordinates, props.buttonLocation)) {\n      closeDialog();\n    }\n  };\n  const handleKeyDown = function (event) {\n    if (event.key === ESCAPE_KEY) {\n      closeDialog();\n    } else if (event.key === ENTER_KEY) {\n      // ToDo : Handle this\n    }\n  };\n\n  // Attach new copy of handleGlobalMouseDown on every render\n  // as the handleGlobalMouseDown needs updated dialogLocation value\n  const dialogId = `SETTINGS_DIALOG-${Date.now()}`;\n  Object(react["useEffect"])(function () {\n    document.body.addEventListener(UXPEventTypes.KEYDOWN, handleKeyDown);\n    setDialogListener(OS_EVENTS.MOUSE_DOWN, dialogId, handleGlobalMouseDown);\n    return function () {\n      document.body.removeEventListener(UXPEventTypes.KEYDOWN, handleKeyDown);\n      removeDialogListeners(dialogId);\n    };\n  }, [dialogId]);\n  const formatOptions = [{\n    value: "jpg",\n    label: "JPG"\n  }, {\n    value: "png",\n    label: "PNG"\n  }, {\n    value: "psd",\n    label: "PSD"\n  }];\n  const shareFormatView = /*#__PURE__*/react_default.a.createElement(FormatView, null, /*#__PURE__*/react_default.a.createElement("sp-label", {\n    for: "picker-m",\n    size: "m"\n  }, localize("FORMAT_DESCRIPTION")), /*#__PURE__*/react_default.a.createElement("sp-picker", {\n    id: "picker-m",\n    size: "m",\n    placeholder: \'Select the format to share\',\n    style: {\n      width: "100%"\n    }\n  }, /*#__PURE__*/react_default.a.createElement("sp-menu", {\n    slot: "options",\n    className: "format-menu"\n  }, formatOptions.map(function (option) {\n    return /*#__PURE__*/react_default.a.createElement("sp-menu-item", Settings_extends({\n      key: option.value,\n      value: option.value\n    }, option.value === props.exportFormat && {\n      selected: true\n    }, {\n      onClick: handleMenuChange,\n      style: {\n        paddingLeft: "5px"\n      }\n    }), option.label);\n  }))));\n  const sizingOptions = /*#__PURE__*/react_default.a.createElement("div", null, /*#__PURE__*/react_default.a.createElement("div", {\n    style: {\n      display: \'flex\',\n      justifyContent: \'space-between\',\n      alignItems: \'center\',\n      marginBottom: \'8px\'\n    }\n  }, /*#__PURE__*/react_default.a.createElement("sp-radio", Settings_extends({\n    id: "original-size",\n    name: "size-option",\n    value: "original"\n  }, props.selectedSizeType === "original" ? {\n    checked: true\n  } : {}, {\n    onClick: function () {\n      return handleSizeChange("original");\n    }\n  }), localize(\'SIZE_ORIGINAL\')), /*#__PURE__*/react_default.a.createElement("sp-label", null, originalDimensions)), /*#__PURE__*/react_default.a.createElement("div", {\n    style: {\n      display: \'flex\',\n      justifyContent: \'space-between\',\n      alignItems: \'center\'\n    }\n  }, /*#__PURE__*/react_default.a.createElement("sp-radio", Settings_extends({\n    id: "small-size",\n    name: "size-option",\n    value: "small"\n  }, props.selectedSizeType === "small" ? {\n    checked: true\n  } : {}, {\n    onClick: function () {\n      return handleSizeChange("small");\n    }\n  }), localize(\'SIZE_SMALL\')), /*#__PURE__*/react_default.a.createElement("sp-label", null, smallDimensions)));\n  const headerView = /*#__PURE__*/react_default.a.createElement(HeaderViewContainer, null, /*#__PURE__*/react_default.a.createElement(HeaderView, null, /*#__PURE__*/react_default.a.createElement(HeaderTextView, null, /*#__PURE__*/react_default.a.createElement("sp-action-button", {\n    size: "s",\n    quiet: true,\n    onClick: handleBack\n  }, /*#__PURE__*/react_default.a.createElement(IconSlot, null, /*#__PURE__*/react_default.a.createElement(icons_BackIcon, {\n    className: "icon-style"\n  }))), /*#__PURE__*/react_default.a.createElement("sp-heading", {\n    size: "s",\n    style: {\n      margin: 0\n    }\n  }, localize("SIZE_SETTING_TITLE")))));\n  return /*#__PURE__*/react_default.a.createElement("div", {\n    className: props.themeClass\n  }, /*#__PURE__*/react_default.a.createElement("dialog", {\n    id: "settings-dialog",\n    className: !isMac ? "dialog-border" : "",\n    ref: dialogRef\n  }, /*#__PURE__*/react_default.a.createElement(DialogDiv, {\n    width: props.panelSize.width,\n    height: props.panelSize.height\n  }, /*#__PURE__*/react_default.a.createElement(SlackPanelDiv, null, headerView, /*#__PURE__*/react_default.a.createElement(SlackPanelInnerContainer, null, /*#__PURE__*/react_default.a.createElement(SlackPanelInner, null, shareFormatView, !isPSDSelected && sizingOptions))))));\n});\n// CONCATENATED MODULE: ./src/utils/localShareUtils.js\nconst SERVICE_CODE = Object.freeze({\n  CLIPBAORD: 0,\n  LIGHTROOM_DESKTOP: 1,\n  LIGHTROOM_CLASSIC: 2,\n  OTHER_APPS: 3\n});\nconst COPY_TO_CLIPBOARD = "COPY_TO_CLIPBOARD";\nconst OTHER_APPS = "OTHER_APPS";\nconst LIGHTROOM_DESKTOP_DATA_MENU = "LIGHTROOMDESKTOP";\nconst LIGHTROOM_CLASSIC_DATA_MENU = "LIGHTROOMCLASSIC";\nconst LIGHTROOM_DESKTOP_TITLE = "Lightroom";\nconst LIGHTROOM_CLASSIC_TITLE = "Lightroom Classic";\n// CONCATENATED MODULE: ./src/components/icons/ToastIcons.jsx\n\nfunction AlertMedium(props) {\n  const {\n    color\n  } = props;\n  return /*#__PURE__*/react["createElement"]("svg", {\n    xmlns: "http://www.w3.org/2000/svg",\n    height: "18",\n    viewBox: "0 0 18 18",\n    width: "18"\n  }, /*#__PURE__*/react["createElement"]("title", null, "AlertMedium"), /*#__PURE__*/react["createElement"]("path", {\n    fill: color,\n    d: "M8.564,1.289.2,16.256A.5.5,0,0,0,.636,17H17.364a.5.5,0,0,0,.436-.744L9.436,1.289a.5.5,0,0,0-.872,0ZM10,14.75a.25.25,0,0,1-.25.25H8.25A.25.25,0,0,1,8,14.75v-1.5A.25.25,0,0,1,8.25,13h1.5a.25.25,0,0,1,.25.25Zm0-3a.25.25,0,0,1-.25.25H8.25A.25.25,0,0,1,8,11.75v-6a.25.25,0,0,1,.25-.25h1.5a.25.25,0,0,1,.25.25Z"\n  }));\n}\nfunction SuccessMedium(props) {\n  const {\n    color\n  } = props;\n  return /*#__PURE__*/react["createElement"]("svg", {\n    xmlns: "http://www.w3.org/2000/svg",\n    width: 18,\n    height: 18\n  }, /*#__PURE__*/react["createElement"]("path", {\n    fill: color,\n    d: "M9 1a8 8 0 1 0 8 8 8 8 0 0 0-8-8Zm5.333 4.54-6.324 8.13a.6.6 0 0 1-.437.23h-.037a.6.6 0 0 1-.425-.176l-3.893-3.9a.6.6 0 0 1 0-.849l.663-.663a.6.6 0 0 1 .848 0L7.4 10.991l5.256-6.754a.6.6 0 0 1 .843-.1l.728.566a.6.6 0 0 1 .106.837Z"\n  }));\n}\nfunction InfoMedium(props) {\n  const {\n    color\n  } = props;\n  return /*#__PURE__*/react["createElement"]("svg", {\n    xmlns: "http://www.w3.org/2000/svg",\n    width: 18,\n    height: 18\n  }, /*#__PURE__*/react["createElement"]("path", {\n    fill: color,\n    d: "M9 1a8 8 0 1 0 8 8 8 8 0 0 0-8-8Zm-.15 2.15a1.359 1.359 0 0 1 1.431 1.283q.004.064.001.129A1.332 1.332 0 0 1 8.85 5.994a1.353 1.353 0 0 1-1.432-1.433 1.359 1.359 0 0 1 1.304-1.412q.064-.002.128.001ZM11 13.5a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5v-1a.5.5 0 0 1 .5-.5H8V9h-.5a.5.5 0 0 1-.5-.5v-1a.5.5 0 0 1 .5-.5h2a.5.5 0 0 1 .5.5V12h.5a.5.5 0 0 1 .5.5Z"\n  }));\n}\nfunction CrossMedium(props) {\n  const {\n    color\n  } = props;\n  return /*#__PURE__*/react["createElement"]("div", null, /*#__PURE__*/react["createElement"]("svg", {\n    xmlns: "http://www.w3.org/2000/svg",\n    width: "12",\n    height: "12",\n    viewBox: "0 0 10 10"\n  }, /*#__PURE__*/react["createElement"]("g", {\n    id: "CrossSize100"\n  }, /*#__PURE__*/react["createElement"]("path", {\n    fill: color,\n    d: "M5.2381,4,7.69434,1.544A.87543.87543,0,0,0,6.45654.30566L4.00012,2.76208,1.54346.30566A.87526.87526,0,0,0,.30615,1.544L2.76221,4,.30615,6.45605A.87526.87526,0,0,0,1.54346,7.69434L4.00012,5.23792,6.45654,7.69434a.87543.87543,0,1,0,1.2378-1.23829Z"\n  }))));\n}\n// CONCATENATED MODULE: ./src/components/Toast.jsx\n\n\n\n\nconst colors = {\n  info: "var(--info-color)",\n  success: "var(--success-color)",\n  warning: "var(--warning-color)",\n  error: "var(--error-color)"\n};\nconst MAX_TOAST_WIDTH = 364;\n\n/////// Styled Components ///////\n\nconst ToastContainer = styled_components_browser_esm["a" /* default */].div`\n  position: absolute;\n  z-index: 1000;\n  bottom: 0;\n  left: 0;\n  margin: 10px; /* Margin might cause overflow */\n  width: calc(100% - 20px); /* Adjust width to account for margin */\n  box-sizing: border-box;\n`;\nconst ToastBubble = styled_components_browser_esm["a" /* default */].div`\n  background-color: ${function ({\n  color\n}) {\n  return color;\n}};\n  border: var(--toast-border);\n  border-radius: 4px;\n  display: inline-flex;\n  flex-direction: row;\n  max-width: 408px;\n  margin: "top centre";\n  width: 100%;\n`;\nconst ToastContent = styled_components_browser_esm["a" /* default */].div`\n  display: flex;\n  flex-direction: column;\n  font-size: 14px;\n  font-family: "Adobe Clean", sans-serif;\n  font-weight: normal;\n  color: white;\n  white-space: pre-wrap;\n  text-align: centre;\n  margin: 12px 0px 12px !important;\n  padding: 0px 8px 0px;\n`;\nconst ToastIcon = styled_components_browser_esm["a" /* default */].div`\n  margin-left: 18px;\n  margin-top: 12px;\n`;\nconst CrossIconDiv = styled_components_browser_esm["a" /* default */].div`\n  border-left: 1px solid var(--button-border-fill);\n  margin-left: auto;\n  margin-top: 5px;\n  margin-bottom: 5px;\n`;\nconst CrossIcon = styled_components_browser_esm["a" /* default */].div`\n  margin: 8px;\n  padding: 10px;\n  border-radius: 50%;\n  text-align: centre;\n  &:hover {\n    box-shadow: 0 0 0 8px var(--button-border-fill);\n  }\n`;\nconst Buttons = styled_components_browser_esm["a" /* default */].div`\n  display: flex;\n  flex-direction: row;\n  align-self: flex-end;\n`;\nconst ToastButton = styled_components_browser_esm["a" /* default */].div`\n  margin-left: 8px;\n  margin-right: 8px;\n  border: 2px solid ${function ({\n  color\n}) {\n  return color;\n}} !important;\n  border-radius: 14px !important;\n  padding: 3.5px 14px 4.5px;\n  font-size: 14px !important;\n  font-family: "Adobe Clean", sans-serif;\n  font-weight: bold;\n  margin-top: 12px;\n  &:hover {\n    background-color: var(--button-border-fill);\n  }\n`;\n\n/////// Styled Components ///////\n\nconst icons = {\n  info: InfoMedium,\n  success: SuccessMedium,\n  warning: AlertMedium,\n  error: AlertMedium\n};\nconst Toast = function (props) {\n  const handleClose = function () {\n    props.setToastVisible(false);\n  };\n  let Icon = icons[props.toastType] || InfoMedium;\n  let variantColor = colors[props.toastType] || colors.info;\n  return /*#__PURE__*/react_default.a.createElement(ToastContainer, null, /*#__PURE__*/react_default.a.createElement(ToastBubble, {\n    color: variantColor\n  }, /*#__PURE__*/react_default.a.createElement(ToastIcon, null, /*#__PURE__*/react_default.a.createElement(Icon, {\n    color: "white"\n  })), /*#__PURE__*/react_default.a.createElement(ToastContent, null, props.message), /*#__PURE__*/react_default.a.createElement(CrossIconDiv, null), /*#__PURE__*/react_default.a.createElement(CrossIcon, {\n    onClick: function () {\n      return handleClose();\n    }\n  }, /*#__PURE__*/react_default.a.createElement(CrossMedium, {\n    color: "white"\n  }))));\n};\n// CONCATENATED MODULE: ./src/components/icons/GearIcon.jsx\nfunction GearIcon_extends() { return GearIcon_extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, GearIcon_extends.apply(null, arguments); }\n\nconst GearIcon = function (props) {\n  return /*#__PURE__*/react["createElement"]("svg", GearIcon_extends({\n    xmlns: "http://www.w3.org/2000/svg",\n    width: 16,\n    height: 16,\n    fill: "none"\n  }, props), /*#__PURE__*/react["createElement"]("path", {\n    className: props.className,\n    fill: "#EBEBEB",\n    fillRule: "evenodd",\n    d: "M8.213 0H7.54a.876.876 0 0 0-.879.867v1.48a5.23 5.23 0 0 0-1.417.58l-1.258-.809a.909.909 0 0 0-1.251 0l-.626.609a.852.852 0 0 0 0 1.222l.855 1.24c-.27.454-.47.954-.585 1.48H1.128a.877.877 0 0 0-.878.868v.856a.88.88 0 0 0 .878.867h1.367c.16.51.407.992.717 1.43l-.786 1.17a.837.837 0 0 0 0 1.218l.62.613a.914.914 0 0 0 1.257 0l1.338-.9c.459.212.602.287 1.056.448v1.394c0 .477.379.867.872.867h.862c.493 0 .872-.39.872-.867v-1.394c.454-.16.597-.236 1.056-.448l1.338.9a.914.914 0 0 0 1.257 0l.62-.613a.837.837 0 0 0 0-1.218l-.786-1.17c.31-.438.557-.92.717-1.43h1.367a.88.88 0 0 0 .878-.867v-.856a.877.877 0 0 0-.878-.867H13.62a4.955 4.955 0 0 0-.586-1.48l.856-1.24a.853.853 0 0 0 0-1.223l-.626-.609a.909.909 0 0 0-1.251 0l-1.258.81a5.23 5.23 0 0 0-1.417-.58V.868A.876.876 0 0 0 8.459 0h-.246ZM5.147 7.75A2.849 2.849 0 0 1 8 4.897a2.849 2.849 0 0 1 2.854 2.853A2.849 2.849 0 0 1 8 10.602 2.849 2.849 0 0 1 5.147 7.75Z",\n    clipRule: "evenodd"\n  }));\n};\n/* harmony default export */ var icons_GearIcon = (GearIcon);\n// CONCATENATED MODULE: ./src/components/icons/Clipboard.jsx\n\nconst Clipboard = function (props) {\n  return /*#__PURE__*/react["createElement"]("svg", {\n    xmlns: "http://www.w3.org/2000/svg",\n    height: "18",\n    viewBox: "0 0 18 18",\n    width: "18"\n  }, /*#__PURE__*/react["createElement"]("title", null, "S Copy 18 N"), /*#__PURE__*/react["createElement"]("rect", {\n    id: "Canvas",\n    className: props.className,\n    opacity: "0",\n    width: "18",\n    height: "18"\n  }), /*#__PURE__*/react["createElement"]("rect", {\n    className: props.className,\n    height: "1",\n    rx: "0.25",\n    width: "1",\n    x: "16",\n    y: "11"\n  }), /*#__PURE__*/react["createElement"]("rect", {\n    className: props.className,\n    height: "1",\n    rx: "0.25",\n    width: "1",\n    x: "16",\n    y: "9"\n  }), /*#__PURE__*/react["createElement"]("rect", {\n    className: props.className,\n    height: "1",\n    rx: "0.25",\n    width: "1",\n    x: "16",\n    y: "7"\n  }), /*#__PURE__*/react["createElement"]("rect", {\n    className: props.className,\n    height: "1",\n    rx: "0.25",\n    width: "1",\n    x: "16",\n    y: "5"\n  }), /*#__PURE__*/react["createElement"]("rect", {\n    className: props.className,\n    height: "1",\n    rx: "0.25",\n    width: "1",\n    x: "16",\n    y: "3"\n  }), /*#__PURE__*/react["createElement"]("rect", {\n    className: props.className,\n    height: "1",\n    rx: "0.25",\n    width: "1",\n    x: "16",\n    y: "1"\n  }), /*#__PURE__*/react["createElement"]("rect", {\n    className: props.className,\n    height: "1",\n    rx: "0.25",\n    width: "1",\n    x: "14",\n    y: "1"\n  }), /*#__PURE__*/react["createElement"]("rect", {\n    className: props.className,\n    height: "1",\n    rx: "0.25",\n    width: "1",\n    x: "12",\n    y: "1"\n  }), /*#__PURE__*/react["createElement"]("rect", {\n    className: props.className,\n    height: "1",\n    rx: "0.25",\n    width: "1",\n    x: "10",\n    y: "1"\n  }), /*#__PURE__*/react["createElement"]("rect", {\n    className: props.className,\n    height: "1",\n    rx: "0.25",\n    width: "1",\n    x: "8",\n    y: "1"\n  }), /*#__PURE__*/react["createElement"]("rect", {\n    className: props.className,\n    height: "1",\n    rx: "0.25",\n    width: "1",\n    x: "6",\n    y: "1"\n  }), /*#__PURE__*/react["createElement"]("rect", {\n    className: props.className,\n    height: "1",\n    rx: "0.25",\n    width: "1",\n    x: "6",\n    y: "3"\n  }), /*#__PURE__*/react["createElement"]("rect", {\n    className: props.className,\n    height: "1",\n    rx: "0.25",\n    width: "1",\n    x: "6",\n    y: "5"\n  }), /*#__PURE__*/react["createElement"]("rect", {\n    className: props.className,\n    height: "1",\n    rx: "0.25",\n    width: "1",\n    x: "6",\n    y: "7"\n  }), /*#__PURE__*/react["createElement"]("rect", {\n    className: props.className,\n    height: "1",\n    rx: "0.25",\n    width: "1",\n    x: "6",\n    y: "9"\n  }), /*#__PURE__*/react["createElement"]("rect", {\n    className: props.className,\n    height: "1",\n    rx: "0.25",\n    width: "1",\n    x: "6",\n    y: "11"\n  }), /*#__PURE__*/react["createElement"]("rect", {\n    className: props.className,\n    height: "1",\n    rx: "0.25",\n    width: "1",\n    x: "8",\n    y: "11"\n  }), /*#__PURE__*/react["createElement"]("rect", {\n    className: props.className,\n    height: "1",\n    rx: "0.25",\n    width: "1",\n    x: "10",\n    y: "11"\n  }), /*#__PURE__*/react["createElement"]("rect", {\n    className: props.className,\n    height: "1",\n    rx: "0.25",\n    width: "1",\n    x: "12",\n    y: "11"\n  }), /*#__PURE__*/react["createElement"]("rect", {\n    className: props.className,\n    height: "1",\n    rx: "0.25",\n    width: "1",\n    x: "14",\n    y: "11"\n  }), /*#__PURE__*/react["createElement"]("path", {\n    className: props.className,\n    d: "M5,6H1.5a.5.5,0,0,0-.5.5v10a.5.5,0,0,0,.5.5h10a.5.5,0,0,0,.5-.5V13H5.5a.5.5,0,0,1-.5-.5Z"\n  }));\n};\n/* harmony default export */ var icons_Clipboard = (Clipboard);\n// CONCATENATED MODULE: ./src/assets/icons/Icon_Slack.png\n/* harmony default export */ var Icon_Slack = (__webpack_require__.p + "icons/Icon_Slack.png");\n// CONCATENATED MODULE: ./src/components/icons/SlackIcon.jsx\n\n\nconst SlackIcon = function () {\n  return /*#__PURE__*/react_default.a.createElement("div", {\n    width: 18,\n    height: 18\n  }, /*#__PURE__*/react_default.a.createElement("img", {\n    src: Icon_Slack\n  }));\n};\n/* harmony default export */ var icons_SlackIcon = (SlackIcon);\n// CONCATENATED MODULE: ./src/assets/icons/Icon_LightroomDesktop.png\n/* harmony default export */ var Icon_LightroomDesktop = (__webpack_require__.p + "icons/Icon_LightroomDesktop.png");\n// CONCATENATED MODULE: ./src/components/icons/LightroomDesktopIcon.jsx\n\n\nconst LightroomDesktopIcon = function () {\n  return /*#__PURE__*/react_default.a.createElement("div", {\n    width: 18,\n    height: 18\n  }, /*#__PURE__*/react_default.a.createElement("img", {\n    src: Icon_LightroomDesktop\n  }));\n};\n/* harmony default export */ var icons_LightroomDesktopIcon = (LightroomDesktopIcon);\n// CONCATENATED MODULE: ./src/assets/icons/Icon_LightroomClassic.png\n/* harmony default export */ var Icon_LightroomClassic = (__webpack_require__.p + "icons/Icon_LightroomClassic.png");\n// CONCATENATED MODULE: ./src/components/icons/LightroomClassicIcon.jsx\n\n\nconst LightroomClassicIcon = function () {\n  return /*#__PURE__*/react_default.a.createElement("div", {\n    width: 18,\n    height: 18\n  }, /*#__PURE__*/react_default.a.createElement("img", {\n    src: Icon_LightroomClassic\n  }));\n};\n/* harmony default export */ var icons_LightroomClassicIcon = (LightroomClassicIcon);\n// CONCATENATED MODULE: ./src/components/icons/OtherApps.jsx\nfunction OtherApps_extends() { return OtherApps_extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, OtherApps_extends.apply(null, arguments); }\n\nconst OtherApps = function (props) {\n  return /*#__PURE__*/react["createElement"]("svg", OtherApps_extends({\n    xmlns: "http://www.w3.org/2000/svg",\n    width: 18,\n    height: 18,\n    fill: "none"\n  }, props), /*#__PURE__*/react["createElement"]("path", {\n    className: props.className,\n    fill: "#EBEBEB",\n    fillRule: "evenodd",\n    d: "M5 12H3a1 1 0 0 0-1 1v2a1 1 0 0 0 1 1h2a1 1 0 0 0 1-1v-2a1 1 0 0 0-1-1ZM10 12H8a1 1 0 0 0-1 1v2a1 1 0 0 0 1 1h2a1 1 0 0 0 1-1v-2a1 1 0 0 0-1-1ZM15 12h-2a1 1 0 0 0-1 1v2a1 1 0 0 0 1 1h2a1 1 0 0 0 1-1v-2a1 1 0 0 0-1-1ZM15 3v2h-2V3h2Zm-2-1a1 1 0 0 0-1 1v2a1 1 0 0 0 1 1h2a1 1 0 0 0 1-1V3a1 1 0 0 0-1-1h-2ZM10 3v2H8V3h2ZM8 2a1 1 0 0 0-1 1v2a1 1 0 0 0 1 1h2a1 1 0 0 0 1-1V3a1 1 0 0 0-1-1H8ZM5 3v2H3V3h2ZM3 2a1 1 0 0 0-1 1v2a1 1 0 0 0 1 1h2a1 1 0 0 0 1-1V3a1 1 0 0 0-1-1H3ZM15 8v1.5h-2V8h2Zm-2-1a1 1 0 0 0-1 1v2a1 1 0 0 0 1 1h2a1 1 0 0 0 1-1V8a1 1 0 0 0-1-1h-2ZM10 8v1.5H8V8h2ZM8 7a1 1 0 0 0-1 1v2a1 1 0 0 0 1 1h2a1 1 0 0 0 1-1V8a1 1 0 0 0-1-1H8ZM5 8v1.5H3V8h2ZM3 7a1 1 0 0 0-1 1v2a1 1 0 0 0 1 1h2a1 1 0 0 0 1-1V8a1 1 0 0 0-1-1H3Z",\n    clipRule: "evenodd"\n  }));\n};\n/* harmony default export */ var icons_OtherApps = (OtherApps);\n// EXTERNAL MODULE: ./node_modules/axios/lib/utils.js\nvar utils = __webpack_require__(1);\n\n// EXTERNAL MODULE: ./node_modules/axios/lib/helpers/bind.js\nvar bind = __webpack_require__(44);\n\n// EXTERNAL MODULE: ./node_modules/axios/lib/helpers/toFormData.js\nvar toFormData = __webpack_require__(19);\n\n// CONCATENATED MODULE: ./node_modules/axios/lib/helpers/AxiosURLSearchParams.js\n\n\n\n\n/**\n * It encodes a string by replacing all characters that are not in the unreserved set with\n * their percent-encoded equivalents\n *\n * @param {string} str - The string to encode.\n *\n * @returns {string} The encoded string.\n */\nfunction encode(str) {\n  const charMap = {\n    \'!\': \'%21\',\n    "\'": \'%27\',\n    \'(\': \'%28\',\n    \')\': \'%29\',\n    \'~\': \'%7E\',\n    \'%20\': \'+\',\n    \'%00\': \'\\x00\'\n  };\n  return encodeURIComponent(str).replace(/[!\'()~]|%20|%00/g, function replacer(match) {\n    return charMap[match];\n  });\n}\n\n/**\n * It takes a params object and converts it to a FormData object\n *\n * @param {Object<string, any>} params - The parameters to be converted to a FormData object.\n * @param {Object<string, any>} options - The options object passed to the Axios constructor.\n *\n * @returns {void}\n */\nfunction AxiosURLSearchParams(params, options) {\n  this._pairs = [];\n\n  params && Object(toFormData["a" /* default */])(params, this, options);\n}\n\nconst AxiosURLSearchParams_prototype = AxiosURLSearchParams.prototype;\n\nAxiosURLSearchParams_prototype.append = function append(name, value) {\n  this._pairs.push([name, value]);\n};\n\nAxiosURLSearchParams_prototype.toString = function toString(encoder) {\n  const _encode = encoder ? function(value) {\n    return encoder.call(this, value, encode);\n  } : encode;\n\n  return this._pairs.map(function each(pair) {\n    return _encode(pair[0]) + \'=\' + _encode(pair[1]);\n  }, \'\').join(\'&\');\n};\n\n/* harmony default export */ var helpers_AxiosURLSearchParams = (AxiosURLSearchParams);\n\n// CONCATENATED MODULE: ./node_modules/axios/lib/helpers/buildURL.js\n\n\n\n\n\n/**\n * It replaces all instances of the characters `:`, `$`, `,`, `+`, `[`, and `]` with their\n * URI encoded counterparts\n *\n * @param {string} val The value to be encoded.\n *\n * @returns {string} The encoded value.\n */\nfunction buildURL_encode(val) {\n  return encodeURIComponent(val).\n    replace(/%3A/gi, \':\').\n    replace(/%24/g, \'$\').\n    replace(/%2C/gi, \',\').\n    replace(/%20/g, \'+\').\n    replace(/%5B/gi, \'[\').\n    replace(/%5D/gi, \']\');\n}\n\n/**\n * Build a URL by appending params to the end\n *\n * @param {string} url The base of the url (e.g., http://www.google.com)\n * @param {object} [params] The params to be appended\n * @param {?(object|Function)} options\n *\n * @returns {string} The formatted url\n */\nfunction buildURL(url, params, options) {\n  /*eslint no-param-reassign:0*/\n  if (!params) {\n    return url;\n  }\n  \n  const _encode = options && options.encode || buildURL_encode;\n\n  if (utils["a" /* default */].isFunction(options)) {\n    options = {\n      serialize: options\n    };\n  } \n\n  const serializeFn = options && options.serialize;\n\n  let serializedParams;\n\n  if (serializeFn) {\n    serializedParams = serializeFn(params, options);\n  } else {\n    serializedParams = utils["a" /* default */].isURLSearchParams(params) ?\n      params.toString() :\n      new helpers_AxiosURLSearchParams(params, options).toString(_encode);\n  }\n\n  if (serializedParams) {\n    const hashmarkIndex = url.indexOf("#");\n\n    if (hashmarkIndex !== -1) {\n      url = url.slice(0, hashmarkIndex);\n    }\n    url += (url.indexOf(\'?\') === -1 ? \'?\' : \'&\') + serializedParams;\n  }\n\n  return url;\n}\n\n// CONCATENATED MODULE: ./node_modules/axios/lib/core/InterceptorManager.js\n\n\n\n\nclass InterceptorManager_InterceptorManager {\n  constructor() {\n    this.handlers = [];\n  }\n\n  /**\n   * Add a new interceptor to the stack\n   *\n   * @param {Function} fulfilled The function to handle `then` for a `Promise`\n   * @param {Function} rejected The function to handle `reject` for a `Promise`\n   *\n   * @return {Number} An ID used to remove interceptor later\n   */\n  use(fulfilled, rejected, options) {\n    this.handlers.push({\n      fulfilled,\n      rejected,\n      synchronous: options ? options.synchronous : false,\n      runWhen: options ? options.runWhen : null\n    });\n    return this.handlers.length - 1;\n  }\n\n  /**\n   * Remove an interceptor from the stack\n   *\n   * @param {Number} id The ID that was returned by `use`\n   *\n   * @returns {Boolean} `true` if the interceptor was removed, `false` otherwise\n   */\n  eject(id) {\n    if (this.handlers[id]) {\n      this.handlers[id] = null;\n    }\n  }\n\n  /**\n   * Clear all interceptors from the stack\n   *\n   * @returns {void}\n   */\n  clear() {\n    if (this.handlers) {\n      this.handlers = [];\n    }\n  }\n\n  /**\n   * Iterate over all the registered interceptors\n   *\n   * This method is particularly useful for skipping over any\n   * interceptors that may have become `null` calling `eject`.\n   *\n   * @param {Function} fn The function to call for each interceptor\n   *\n   * @returns {void}\n   */\n  forEach(fn) {\n    utils["a" /* default */].forEach(this.handlers, function forEachHandler(h) {\n      if (h !== null) {\n        fn(h);\n      }\n    });\n  }\n}\n\n/* harmony default export */ var core_InterceptorManager = (InterceptorManager_InterceptorManager);\n\n// EXTERNAL MODULE: ./node_modules/axios/lib/core/AxiosError.js\nvar AxiosError = __webpack_require__(3);\n\n// CONCATENATED MODULE: ./node_modules/axios/lib/defaults/transitional.js\n\n\n/* harmony default export */ var defaults_transitional = ({\n  silentJSONParsing: true,\n  forcedJSONParsing: true,\n  clarifyTimeoutError: false\n});\n\n// CONCATENATED MODULE: ./node_modules/axios/lib/platform/browser/classes/URLSearchParams.js\n\n\n\n/* harmony default export */ var classes_URLSearchParams = (typeof URLSearchParams !== \'undefined\' ? URLSearchParams : helpers_AxiosURLSearchParams);\n\n// CONCATENATED MODULE: ./node_modules/axios/lib/platform/browser/classes/FormData.js\n\n\n/* harmony default export */ var classes_FormData = (typeof FormData !== \'undefined\' ? FormData : null);\n\n// CONCATENATED MODULE: ./node_modules/axios/lib/platform/browser/classes/Blob.js\n\n\n/* harmony default export */ var classes_Blob = (typeof Blob !== \'undefined\' ? Blob : null);\n\n// CONCATENATED MODULE: ./node_modules/axios/lib/platform/browser/index.js\n\n\n\n\n/* harmony default export */ var browser = ({\n  isBrowser: true,\n  classes: {\n    URLSearchParams: classes_URLSearchParams,\n    FormData: classes_FormData,\n    Blob: classes_Blob\n  },\n  protocols: [\'http\', \'https\', \'file\', \'blob\', \'url\', \'data\']\n});\n\n// CONCATENATED MODULE: ./node_modules/axios/lib/platform/common/utils.js\nconst hasBrowserEnv = typeof window !== \'undefined\' && typeof document !== \'undefined\';\n\nconst _navigator = typeof navigator === \'object\' && navigator || undefined;\n\n/**\n * Determine if we\'re running in a standard browser environment\n *\n * This allows axios to run in a web worker, and react-native.\n * Both environments support XMLHttpRequest, but not fully standard globals.\n *\n * web workers:\n *  typeof window -> undefined\n *  typeof document -> undefined\n *\n * react-native:\n *  navigator.product -> \'ReactNative\'\n * nativescript\n *  navigator.product -> \'NativeScript\' or \'NS\'\n *\n * @returns {boolean}\n */\nconst hasStandardBrowserEnv = hasBrowserEnv &&\n  (!_navigator || [\'ReactNative\', \'NativeScript\', \'NS\'].indexOf(_navigator.product) < 0);\n\n/**\n * Determine if we\'re running in a standard browser webWorker environment\n *\n * Although the `isStandardBrowserEnv` method indicates that\n * `allows axios to run in a web worker`, the WebWorker will still be\n * filtered out due to its judgment standard\n * `typeof window !== \'undefined\' && typeof document !== \'undefined\'`.\n * This leads to a problem when axios post `FormData` in webWorker\n */\nconst hasStandardBrowserWebWorkerEnv = (() => {\n  return (\n    typeof WorkerGlobalScope !== \'undefined\' &&\n    // eslint-disable-next-line no-undef\n    self instanceof WorkerGlobalScope &&\n    typeof self.importScripts === \'function\'\n  );\n})();\n\nconst utils_origin = hasBrowserEnv && window.location.href || \'http://localhost\';\n\n\n\n// CONCATENATED MODULE: ./node_modules/axios/lib/platform/index.js\n\n\n\n/* harmony default export */ var platform = ({\n  ...utils_namespaceObject,\n  ...browser\n});\n\n// CONCATENATED MODULE: ./node_modules/axios/lib/helpers/toURLEncodedForm.js\n\n\n\n\n\n\nfunction toURLEncodedForm(data, options) {\n  return Object(toFormData["a" /* default */])(data, new platform.classes.URLSearchParams(), Object.assign({\n    visitor: function(value, key, path, helpers) {\n      if (platform.isNode && utils["a" /* default */].isBuffer(value)) {\n        this.append(key, value.toString(\'base64\'));\n        return false;\n      }\n\n      return helpers.defaultVisitor.apply(this, arguments);\n    }\n  }, options));\n}\n\n// CONCATENATED MODULE: ./node_modules/axios/lib/helpers/formDataToJSON.js\n\n\n\n\n/**\n * It takes a string like `foo[x][y][z]` and returns an array like `[\'foo\', \'x\', \'y\', \'z\']\n *\n * @param {string} name - The name of the property to get.\n *\n * @returns An array of strings.\n */\nfunction parsePropPath(name) {\n  // foo[x][y][z]\n  // foo.x.y.z\n  // foo-x-y-z\n  // foo x y z\n  return utils["a" /* default */].matchAll(/\\w+|\\[(\\w*)]/g, name).map(match => {\n    return match[0] === \'[]\' ? \'\' : match[1] || match[0];\n  });\n}\n\n/**\n * Convert an array to an object.\n *\n * @param {Array<any>} arr - The array to convert to an object.\n *\n * @returns An object with the same keys and values as the array.\n */\nfunction arrayToObject(arr) {\n  const obj = {};\n  const keys = Object.keys(arr);\n  let i;\n  const len = keys.length;\n  let key;\n  for (i = 0; i < len; i++) {\n    key = keys[i];\n    obj[key] = arr[key];\n  }\n  return obj;\n}\n\n/**\n * It takes a FormData object and returns a JavaScript object\n *\n * @param {string} formData The FormData object to convert to JSON.\n *\n * @returns {Object<string, any> | null} The converted object.\n */\nfunction formDataToJSON(formData) {\n  function buildPath(path, value, target, index) {\n    let name = path[index++];\n\n    if (name === \'__proto__\') return true;\n\n    const isNumericKey = Number.isFinite(+name);\n    const isLast = index >= path.length;\n    name = !name && utils["a" /* default */].isArray(target) ? target.length : name;\n\n    if (isLast) {\n      if (utils["a" /* default */].hasOwnProp(target, name)) {\n        target[name] = [target[name], value];\n      } else {\n        target[name] = value;\n      }\n\n      return !isNumericKey;\n    }\n\n    if (!target[name] || !utils["a" /* default */].isObject(target[name])) {\n      target[name] = [];\n    }\n\n    const result = buildPath(path, value, target[name], index);\n\n    if (result && utils["a" /* default */].isArray(target[name])) {\n      target[name] = arrayToObject(target[name]);\n    }\n\n    return !isNumericKey;\n  }\n\n  if (utils["a" /* default */].isFormData(formData) && utils["a" /* default */].isFunction(formData.entries)) {\n    const obj = {};\n\n    utils["a" /* default */].forEachEntry(formData, (name, value) => {\n      buildPath(parsePropPath(name), value, obj, 0);\n    });\n\n    return obj;\n  }\n\n  return null;\n}\n\n/* harmony default export */ var helpers_formDataToJSON = (formDataToJSON);\n\n// CONCATENATED MODULE: ./node_modules/axios/lib/defaults/index.js\n\n\n\n\n\n\n\n\n\n\n/**\n * It takes a string, tries to parse it, and if it fails, it returns the stringified version\n * of the input\n *\n * @param {any} rawValue - The value to be stringified.\n * @param {Function} parser - A function that parses a string into a JavaScript object.\n * @param {Function} encoder - A function that takes a value and returns a string.\n *\n * @returns {string} A stringified version of the rawValue.\n */\nfunction stringifySafely(rawValue, parser, encoder) {\n  if (utils["a" /* default */].isString(rawValue)) {\n    try {\n      (parser || JSON.parse)(rawValue);\n      return utils["a" /* default */].trim(rawValue);\n    } catch (e) {\n      if (e.name !== \'SyntaxError\') {\n        throw e;\n      }\n    }\n  }\n\n  return (encoder || JSON.stringify)(rawValue);\n}\n\nconst defaults = {\n\n  transitional: defaults_transitional,\n\n  adapter: [\'xhr\', \'http\', \'fetch\'],\n\n  transformRequest: [function transformRequest(data, headers) {\n    const contentType = headers.getContentType() || \'\';\n    const hasJSONContentType = contentType.indexOf(\'application/json\') > -1;\n    const isObjectPayload = utils["a" /* default */].isObject(data);\n\n    if (isObjectPayload && utils["a" /* default */].isHTMLForm(data)) {\n      data = new FormData(data);\n    }\n\n    const isFormData = utils["a" /* default */].isFormData(data);\n\n    if (isFormData) {\n      return hasJSONContentType ? JSON.stringify(helpers_formDataToJSON(data)) : data;\n    }\n\n    if (utils["a" /* default */].isArrayBuffer(data) ||\n      utils["a" /* default */].isBuffer(data) ||\n      utils["a" /* default */].isStream(data) ||\n      utils["a" /* default */].isFile(data) ||\n      utils["a" /* default */].isBlob(data) ||\n      utils["a" /* default */].isReadableStream(data)\n    ) {\n      return data;\n    }\n    if (utils["a" /* default */].isArrayBufferView(data)) {\n      return data.buffer;\n    }\n    if (utils["a" /* default */].isURLSearchParams(data)) {\n      headers.setContentType(\'application/x-www-form-urlencoded;charset=utf-8\', false);\n      return data.toString();\n    }\n\n    let isFileList;\n\n    if (isObjectPayload) {\n      if (contentType.indexOf(\'application/x-www-form-urlencoded\') > -1) {\n        return toURLEncodedForm(data, this.formSerializer).toString();\n      }\n\n      if ((isFileList = utils["a" /* default */].isFileList(data)) || contentType.indexOf(\'multipart/form-data\') > -1) {\n        const _FormData = this.env && this.env.FormData;\n\n        return Object(toFormData["a" /* default */])(\n          isFileList ? {\'files[]\': data} : data,\n          _FormData && new _FormData(),\n          this.formSerializer\n        );\n      }\n    }\n\n    if (isObjectPayload || hasJSONContentType ) {\n      headers.setContentType(\'application/json\', false);\n      return stringifySafely(data);\n    }\n\n    return data;\n  }],\n\n  transformResponse: [function transformResponse(data) {\n    const transitional = this.transitional || defaults.transitional;\n    const forcedJSONParsing = transitional && transitional.forcedJSONParsing;\n    const JSONRequested = this.responseType === \'json\';\n\n    if (utils["a" /* default */].isResponse(data) || utils["a" /* default */].isReadableStream(data)) {\n      return data;\n    }\n\n    if (data && utils["a" /* default */].isString(data) && ((forcedJSONParsing && !this.responseType) || JSONRequested)) {\n      const silentJSONParsing = transitional && transitional.silentJSONParsing;\n      const strictJSONParsing = !silentJSONParsing && JSONRequested;\n\n      try {\n        return JSON.parse(data);\n      } catch (e) {\n        if (strictJSONParsing) {\n          if (e.name === \'SyntaxError\') {\n            throw AxiosError["a" /* default */].from(e, AxiosError["a" /* default */].ERR_BAD_RESPONSE, this, null, this.response);\n          }\n          throw e;\n        }\n      }\n    }\n\n    return data;\n  }],\n\n  /**\n   * A timeout in milliseconds to abort a request. If set to 0 (default) a\n   * timeout is not created.\n   */\n  timeout: 0,\n\n  xsrfCookieName: \'XSRF-TOKEN\',\n  xsrfHeaderName: \'X-XSRF-TOKEN\',\n\n  maxContentLength: -1,\n  maxBodyLength: -1,\n\n  env: {\n    FormData: platform.classes.FormData,\n    Blob: platform.classes.Blob\n  },\n\n  validateStatus: function validateStatus(status) {\n    return status >= 200 && status < 300;\n  },\n\n  headers: {\n    common: {\n      \'Accept\': \'application/json, text/plain, */*\',\n      \'Content-Type\': undefined\n    }\n  }\n};\n\nutils["a" /* default */].forEach([\'delete\', \'get\', \'head\', \'post\', \'put\', \'patch\'], (method) => {\n  defaults.headers[method] = {};\n});\n\n/* harmony default export */ var lib_defaults = (defaults);\n\n// CONCATENATED MODULE: ./node_modules/axios/lib/helpers/parseHeaders.js\n\n\n\n\n// RawAxiosHeaders whose duplicates are ignored by node\n// c.f. https://nodejs.org/api/http.html#http_message_headers\nconst ignoreDuplicateOf = utils["a" /* default */].toObjectSet([\n  \'age\', \'authorization\', \'content-length\', \'content-type\', \'etag\',\n  \'expires\', \'from\', \'host\', \'if-modified-since\', \'if-unmodified-since\',\n  \'last-modified\', \'location\', \'max-forwards\', \'proxy-authorization\',\n  \'referer\', \'retry-after\', \'user-agent\'\n]);\n\n/**\n * Parse headers into an object\n *\n * ```\n * Date: Wed, 27 Aug 2014 08:58:49 GMT\n * Content-Type: application/json\n * Connection: keep-alive\n * Transfer-Encoding: chunked\n * ```\n *\n * @param {String} rawHeaders Headers needing to be parsed\n *\n * @returns {Object} Headers parsed into an object\n */\n/* harmony default export */ var parseHeaders = (rawHeaders => {\n  const parsed = {};\n  let key;\n  let val;\n  let i;\n\n  rawHeaders && rawHeaders.split(\'\\n\').forEach(function parser(line) {\n    i = line.indexOf(\':\');\n    key = line.substring(0, i).trim().toLowerCase();\n    val = line.substring(i + 1).trim();\n\n    if (!key || (parsed[key] && ignoreDuplicateOf[key])) {\n      return;\n    }\n\n    if (key === \'set-cookie\') {\n      if (parsed[key]) {\n        parsed[key].push(val);\n      } else {\n        parsed[key] = [val];\n      }\n    } else {\n      parsed[key] = parsed[key] ? parsed[key] + \', \' + val : val;\n    }\n  });\n\n  return parsed;\n});\n\n// CONCATENATED MODULE: ./node_modules/axios/lib/core/AxiosHeaders.js\n\n\n\n\n\nconst $internals = Symbol(\'internals\');\n\nfunction normalizeHeader(header) {\n  return header && String(header).trim().toLowerCase();\n}\n\nfunction normalizeValue(value) {\n  if (value === false || value == null) {\n    return value;\n  }\n\n  return utils["a" /* default */].isArray(value) ? value.map(normalizeValue) : String(value);\n}\n\nfunction parseTokens(str) {\n  const tokens = Object.create(null);\n  const tokensRE = /([^\\s,;=]+)\\s*(?:=\\s*([^,;]+))?/g;\n  let match;\n\n  while ((match = tokensRE.exec(str))) {\n    tokens[match[1]] = match[2];\n  }\n\n  return tokens;\n}\n\nconst isValidHeaderName = (str) => /^[-_a-zA-Z0-9^`|~,!#$%&\'*+.]+$/.test(str.trim());\n\nfunction matchHeaderValue(context, value, header, filter, isHeaderNameFilter) {\n  if (utils["a" /* default */].isFunction(filter)) {\n    return filter.call(this, value, header);\n  }\n\n  if (isHeaderNameFilter) {\n    value = header;\n  }\n\n  if (!utils["a" /* default */].isString(value)) return;\n\n  if (utils["a" /* default */].isString(filter)) {\n    return value.indexOf(filter) !== -1;\n  }\n\n  if (utils["a" /* default */].isRegExp(filter)) {\n    return filter.test(value);\n  }\n}\n\nfunction formatHeader(header) {\n  return header.trim()\n    .toLowerCase().replace(/([a-z\\d])(\\w*)/g, (w, char, str) => {\n      return char.toUpperCase() + str;\n    });\n}\n\nfunction buildAccessors(obj, header) {\n  const accessorName = utils["a" /* default */].toCamelCase(\' \' + header);\n\n  [\'get\', \'set\', \'has\'].forEach(methodName => {\n    Object.defineProperty(obj, methodName + accessorName, {\n      value: function(arg1, arg2, arg3) {\n        return this[methodName].call(this, header, arg1, arg2, arg3);\n      },\n      configurable: true\n    });\n  });\n}\n\nclass AxiosHeaders_AxiosHeaders {\n  constructor(headers) {\n    headers && this.set(headers);\n  }\n\n  set(header, valueOrRewrite, rewrite) {\n    const self = this;\n\n    function setHeader(_value, _header, _rewrite) {\n      const lHeader = normalizeHeader(_header);\n\n      if (!lHeader) {\n        throw new Error(\'header name must be a non-empty string\');\n      }\n\n      const key = utils["a" /* default */].findKey(self, lHeader);\n\n      if(!key || self[key] === undefined || _rewrite === true || (_rewrite === undefined && self[key] !== false)) {\n        self[key || _header] = normalizeValue(_value);\n      }\n    }\n\n    const setHeaders = (headers, _rewrite) =>\n      utils["a" /* default */].forEach(headers, (_value, _header) => setHeader(_value, _header, _rewrite));\n\n    if (utils["a" /* default */].isPlainObject(header) || header instanceof this.constructor) {\n      setHeaders(header, valueOrRewrite)\n    } else if(utils["a" /* default */].isString(header) && (header = header.trim()) && !isValidHeaderName(header)) {\n      setHeaders(parseHeaders(header), valueOrRewrite);\n    } else if (utils["a" /* default */].isHeaders(header)) {\n      for (const [key, value] of header.entries()) {\n        setHeader(value, key, rewrite);\n      }\n    } else {\n      header != null && setHeader(valueOrRewrite, header, rewrite);\n    }\n\n    return this;\n  }\n\n  get(header, parser) {\n    header = normalizeHeader(header);\n\n    if (header) {\n      const key = utils["a" /* default */].findKey(this, header);\n\n      if (key) {\n        const value = this[key];\n\n        if (!parser) {\n          return value;\n        }\n\n        if (parser === true) {\n          return parseTokens(value);\n        }\n\n        if (utils["a" /* default */].isFunction(parser)) {\n          return parser.call(this, value, key);\n        }\n\n        if (utils["a" /* default */].isRegExp(parser)) {\n          return parser.exec(value);\n        }\n\n        throw new TypeError(\'parser must be boolean|regexp|function\');\n      }\n    }\n  }\n\n  has(header, matcher) {\n    header = normalizeHeader(header);\n\n    if (header) {\n      const key = utils["a" /* default */].findKey(this, header);\n\n      return !!(key && this[key] !== undefined && (!matcher || matchHeaderValue(this, this[key], key, matcher)));\n    }\n\n    return false;\n  }\n\n  delete(header, matcher) {\n    const self = this;\n    let deleted = false;\n\n    function deleteHeader(_header) {\n      _header = normalizeHeader(_header);\n\n      if (_header) {\n        const key = utils["a" /* default */].findKey(self, _header);\n\n        if (key && (!matcher || matchHeaderValue(self, self[key], key, matcher))) {\n          delete self[key];\n\n          deleted = true;\n        }\n      }\n    }\n\n    if (utils["a" /* default */].isArray(header)) {\n      header.forEach(deleteHeader);\n    } else {\n      deleteHeader(header);\n    }\n\n    return deleted;\n  }\n\n  clear(matcher) {\n    const keys = Object.keys(this);\n    let i = keys.length;\n    let deleted = false;\n\n    while (i--) {\n      const key = keys[i];\n      if(!matcher || matchHeaderValue(this, this[key], key, matcher, true)) {\n        delete this[key];\n        deleted = true;\n      }\n    }\n\n    return deleted;\n  }\n\n  normalize(format) {\n    const self = this;\n    const headers = {};\n\n    utils["a" /* default */].forEach(this, (value, header) => {\n      const key = utils["a" /* default */].findKey(headers, header);\n\n      if (key) {\n        self[key] = normalizeValue(value);\n        delete self[header];\n        return;\n      }\n\n      const normalized = format ? formatHeader(header) : String(header).trim();\n\n      if (normalized !== header) {\n        delete self[header];\n      }\n\n      self[normalized] = normalizeValue(value);\n\n      headers[normalized] = true;\n    });\n\n    return this;\n  }\n\n  concat(...targets) {\n    return this.constructor.concat(this, ...targets);\n  }\n\n  toJSON(asStrings) {\n    const obj = Object.create(null);\n\n    utils["a" /* default */].forEach(this, (value, header) => {\n      value != null && value !== false && (obj[header] = asStrings && utils["a" /* default */].isArray(value) ? value.join(\', \') : value);\n    });\n\n    return obj;\n  }\n\n  [Symbol.iterator]() {\n    return Object.entries(this.toJSON())[Symbol.iterator]();\n  }\n\n  toString() {\n    return Object.entries(this.toJSON()).map(([header, value]) => header + \': \' + value).join(\'\\n\');\n  }\n\n  get [Symbol.toStringTag]() {\n    return \'AxiosHeaders\';\n  }\n\n  static from(thing) {\n    return thing instanceof this ? thing : new this(thing);\n  }\n\n  static concat(first, ...targets) {\n    const computed = new this(first);\n\n    targets.forEach((target) => computed.set(target));\n\n    return computed;\n  }\n\n  static accessor(header) {\n    const internals = this[$internals] = (this[$internals] = {\n      accessors: {}\n    });\n\n    const accessors = internals.accessors;\n    const prototype = this.prototype;\n\n    function defineAccessor(_header) {\n      const lHeader = normalizeHeader(_header);\n\n      if (!accessors[lHeader]) {\n        buildAccessors(prototype, _header);\n        accessors[lHeader] = true;\n      }\n    }\n\n    utils["a" /* default */].isArray(header) ? header.forEach(defineAccessor) : defineAccessor(header);\n\n    return this;\n  }\n}\n\nAxiosHeaders_AxiosHeaders.accessor([\'Content-Type\', \'Content-Length\', \'Accept\', \'Accept-Encoding\', \'User-Agent\', \'Authorization\']);\n\n// reserved names hotfix\nutils["a" /* default */].reduceDescriptors(AxiosHeaders_AxiosHeaders.prototype, ({value}, key) => {\n  let mapped = key[0].toUpperCase() + key.slice(1); // map `set` => `Set`\n  return {\n    get: () => value,\n    set(headerValue) {\n      this[mapped] = headerValue;\n    }\n  }\n});\n\nutils["a" /* default */].freezeMethods(AxiosHeaders_AxiosHeaders);\n\n/* harmony default export */ var core_AxiosHeaders = (AxiosHeaders_AxiosHeaders);\n\n// CONCATENATED MODULE: ./node_modules/axios/lib/core/transformData.js\n\n\n\n\n\n\n/**\n * Transform the data for a request or a response\n *\n * @param {Array|Function} fns A single function or Array of functions\n * @param {?Object} response The response object\n *\n * @returns {*} The resulting transformed data\n */\nfunction transformData(fns, response) {\n  const config = this || lib_defaults;\n  const context = response || config;\n  const headers = core_AxiosHeaders.from(context.headers);\n  let data = context.data;\n\n  utils["a" /* default */].forEach(fns, function transform(fn) {\n    data = fn.call(config, data, headers.normalize(), response ? response.status : undefined);\n  });\n\n  headers.normalize();\n\n  return data;\n}\n\n// CONCATENATED MODULE: ./node_modules/axios/lib/cancel/isCancel.js\n\n\nfunction isCancel(value) {\n  return !!(value && value.__CANCEL__);\n}\n\n// CONCATENATED MODULE: ./node_modules/axios/lib/cancel/CanceledError.js\n\n\n\n\n\n/**\n * A `CanceledError` is an object that is thrown when an operation is canceled.\n *\n * @param {string=} message The message.\n * @param {Object=} config The config.\n * @param {Object=} request The request.\n *\n * @returns {CanceledError} The created error.\n */\nfunction CanceledError(message, config, request) {\n  // eslint-disable-next-line no-eq-null,eqeqeq\n  AxiosError["a" /* default */].call(this, message == null ? \'canceled\' : message, AxiosError["a" /* default */].ERR_CANCELED, config, request);\n  this.name = \'CanceledError\';\n}\n\nutils["a" /* default */].inherits(CanceledError, AxiosError["a" /* default */], {\n  __CANCEL__: true\n});\n\n/* harmony default export */ var cancel_CanceledError = (CanceledError);\n\n// EXTERNAL MODULE: ./node_modules/axios/lib/helpers/null.js\nvar helpers_null = __webpack_require__(45);\n\n// CONCATENATED MODULE: ./node_modules/axios/lib/core/settle.js\n\n\n\n\n/**\n * Resolve or reject a Promise based on response status.\n *\n * @param {Function} resolve A function that resolves the promise.\n * @param {Function} reject A function that rejects the promise.\n * @param {object} response The response.\n *\n * @returns {object} The response.\n */\nfunction settle(resolve, reject, response) {\n  const validateStatus = response.config.validateStatus;\n  if (!response.status || !validateStatus || validateStatus(response.status)) {\n    resolve(response);\n  } else {\n    reject(new AxiosError["a" /* default */](\n      \'Request failed with status code \' + response.status,\n      [AxiosError["a" /* default */].ERR_BAD_REQUEST, AxiosError["a" /* default */].ERR_BAD_RESPONSE][Math.floor(response.status / 100) - 4],\n      response.config,\n      response.request,\n      response\n    ));\n  }\n}\n\n// CONCATENATED MODULE: ./node_modules/axios/lib/helpers/parseProtocol.js\n\n\nfunction parseProtocol(url) {\n  const match = /^([-+\\w]{1,25})(:?\\/\\/|:)/.exec(url);\n  return match && match[1] || \'\';\n}\n\n// CONCATENATED MODULE: ./node_modules/axios/lib/helpers/speedometer.js\n\n\n/**\n * Calculate data maxRate\n * @param {Number} [samplesCount= 10]\n * @param {Number} [min= 1000]\n * @returns {Function}\n */\nfunction speedometer(samplesCount, min) {\n  samplesCount = samplesCount || 10;\n  const bytes = new Array(samplesCount);\n  const timestamps = new Array(samplesCount);\n  let head = 0;\n  let tail = 0;\n  let firstSampleTS;\n\n  min = min !== undefined ? min : 1000;\n\n  return function push(chunkLength) {\n    const now = Date.now();\n\n    const startedAt = timestamps[tail];\n\n    if (!firstSampleTS) {\n      firstSampleTS = now;\n    }\n\n    bytes[head] = chunkLength;\n    timestamps[head] = now;\n\n    let i = tail;\n    let bytesCount = 0;\n\n    while (i !== head) {\n      bytesCount += bytes[i++];\n      i = i % samplesCount;\n    }\n\n    head = (head + 1) % samplesCount;\n\n    if (head === tail) {\n      tail = (tail + 1) % samplesCount;\n    }\n\n    if (now - firstSampleTS < min) {\n      return;\n    }\n\n    const passed = startedAt && now - startedAt;\n\n    return passed ? Math.round(bytesCount * 1000 / passed) : undefined;\n  };\n}\n\n/* harmony default export */ var helpers_speedometer = (speedometer);\n\n// CONCATENATED MODULE: ./node_modules/axios/lib/helpers/throttle.js\n/**\n * Throttle decorator\n * @param {Function} fn\n * @param {Number} freq\n * @return {Function}\n */\nfunction throttle(fn, freq) {\n  let timestamp = 0;\n  let threshold = 1000 / freq;\n  let lastArgs;\n  let timer;\n\n  const invoke = (args, now = Date.now()) => {\n    timestamp = now;\n    lastArgs = null;\n    if (timer) {\n      clearTimeout(timer);\n      timer = null;\n    }\n    fn.apply(null, args);\n  }\n\n  const throttled = (...args) => {\n    const now = Date.now();\n    const passed = now - timestamp;\n    if ( passed >= threshold) {\n      invoke(args, now);\n    } else {\n      lastArgs = args;\n      if (!timer) {\n        timer = setTimeout(() => {\n          timer = null;\n          invoke(lastArgs)\n        }, threshold - passed);\n      }\n    }\n  }\n\n  const flush = () => lastArgs && invoke(lastArgs);\n\n  return [throttled, flush];\n}\n\n/* harmony default export */ var helpers_throttle = (throttle);\n\n// CONCATENATED MODULE: ./node_modules/axios/lib/helpers/progressEventReducer.js\n\n\n\n\nconst progressEventReducer = (listener, isDownloadStream, freq = 3) => {\n  let bytesNotified = 0;\n  const _speedometer = helpers_speedometer(50, 250);\n\n  return helpers_throttle(e => {\n    const loaded = e.loaded;\n    const total = e.lengthComputable ? e.total : undefined;\n    const progressBytes = loaded - bytesNotified;\n    const rate = _speedometer(progressBytes);\n    const inRange = loaded <= total;\n\n    bytesNotified = loaded;\n\n    const data = {\n      loaded,\n      total,\n      progress: total ? (loaded / total) : undefined,\n      bytes: progressBytes,\n      rate: rate ? rate : undefined,\n      estimated: rate && total && inRange ? (total - loaded) / rate : undefined,\n      event: e,\n      lengthComputable: total != null,\n      [isDownloadStream ? \'download\' : \'upload\']: true\n    };\n\n    listener(data);\n  }, freq);\n}\n\nconst progressEventDecorator = (total, throttled) => {\n  const lengthComputable = total != null;\n\n  return [(loaded) => throttled[0]({\n    lengthComputable,\n    total,\n    loaded\n  }), throttled[1]];\n}\n\nconst asyncDecorator = (fn) => (...args) => utils["a" /* default */].asap(() => fn(...args));\n\n// CONCATENATED MODULE: ./node_modules/axios/lib/helpers/isURLSameOrigin.js\n\n\n/* harmony default export */ var isURLSameOrigin = (platform.hasStandardBrowserEnv ? ((origin, isMSIE) => (url) => {\n  url = new URL(url, platform.origin);\n\n  return (\n    origin.protocol === url.protocol &&\n    origin.host === url.host &&\n    (isMSIE || origin.port === url.port)\n  );\n})(\n  new URL(platform.origin),\n  platform.navigator && /(msie|trident)/i.test(platform.navigator.userAgent)\n) : () => true);\n\n// CONCATENATED MODULE: ./node_modules/axios/lib/helpers/cookies.js\n\n\n\n/* harmony default export */ var cookies = (platform.hasStandardBrowserEnv ?\n\n  // Standard browser envs support document.cookie\n  {\n    write(name, value, expires, path, domain, secure) {\n      const cookie = [name + \'=\' + encodeURIComponent(value)];\n\n      utils["a" /* default */].isNumber(expires) && cookie.push(\'expires=\' + new Date(expires).toGMTString());\n\n      utils["a" /* default */].isString(path) && cookie.push(\'path=\' + path);\n\n      utils["a" /* default */].isString(domain) && cookie.push(\'domain=\' + domain);\n\n      secure === true && cookie.push(\'secure\');\n\n      document.cookie = cookie.join(\'; \');\n    },\n\n    read(name) {\n      const match = document.cookie.match(new RegExp(\'(^|;\\\\s*)(\' + name + \')=([^;]*)\'));\n      return (match ? decodeURIComponent(match[3]) : null);\n    },\n\n    remove(name) {\n      this.write(name, \'\', Date.now() - 86400000);\n    }\n  }\n\n  :\n\n  // Non-standard browser env (web workers, react-native) lack needed support.\n  {\n    write() {},\n    read() {\n      return null;\n    },\n    remove() {}\n  });\n\n\n// CONCATENATED MODULE: ./node_modules/axios/lib/helpers/isAbsoluteURL.js\n\n\n/**\n * Determines whether the specified URL is absolute\n *\n * @param {string} url The URL to test\n *\n * @returns {boolean} True if the specified URL is absolute, otherwise false\n */\nfunction isAbsoluteURL(url) {\n  // A URL is considered absolute if it begins with "<scheme>://" or "//" (protocol-relative URL).\n  // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed\n  // by any combination of letters, digits, plus, period, or hyphen.\n  return /^([a-z][a-z\\d+\\-.]*:)?\\/\\//i.test(url);\n}\n\n// CONCATENATED MODULE: ./node_modules/axios/lib/helpers/combineURLs.js\n\n\n/**\n * Creates a new URL by combining the specified URLs\n *\n * @param {string} baseURL The base URL\n * @param {string} relativeURL The relative URL\n *\n * @returns {string} The combined URL\n */\nfunction combineURLs(baseURL, relativeURL) {\n  return relativeURL\n    ? baseURL.replace(/\\/?\\/$/, \'\') + \'/\' + relativeURL.replace(/^\\/+/, \'\')\n    : baseURL;\n}\n\n// CONCATENATED MODULE: ./node_modules/axios/lib/core/buildFullPath.js\n\n\n\n\n\n/**\n * Creates a new URL by combining the baseURL with the requestedURL,\n * only when the requestedURL is not already an absolute URL.\n * If the requestURL is absolute, this function returns the requestedURL untouched.\n *\n * @param {string} baseURL The base URL\n * @param {string} requestedURL Absolute or relative URL to combine\n *\n * @returns {string} The combined full path\n */\nfunction buildFullPath(baseURL, requestedURL, allowAbsoluteUrls) {\n  let isRelativeUrl = !isAbsoluteURL(requestedURL);\n  if (baseURL && (isRelativeUrl || allowAbsoluteUrls == false)) {\n    return combineURLs(baseURL, requestedURL);\n  }\n  return requestedURL;\n}\n\n// CONCATENATED MODULE: ./node_modules/axios/lib/core/mergeConfig.js\n\n\n\n\n\nconst headersToObject = (thing) => thing instanceof core_AxiosHeaders ? { ...thing } : thing;\n\n/**\n * Config-specific merge-function which creates a new config-object\n * by merging two configuration objects together.\n *\n * @param {Object} config1\n * @param {Object} config2\n *\n * @returns {Object} New object resulting from merging config2 to config1\n */\nfunction mergeConfig(config1, config2) {\n  // eslint-disable-next-line no-param-reassign\n  config2 = config2 || {};\n  const config = {};\n\n  function getMergedValue(target, source, prop, caseless) {\n    if (utils["a" /* default */].isPlainObject(target) && utils["a" /* default */].isPlainObject(source)) {\n      return utils["a" /* default */].merge.call({caseless}, target, source);\n    } else if (utils["a" /* default */].isPlainObject(source)) {\n      return utils["a" /* default */].merge({}, source);\n    } else if (utils["a" /* default */].isArray(source)) {\n      return source.slice();\n    }\n    return source;\n  }\n\n  // eslint-disable-next-line consistent-return\n  function mergeDeepProperties(a, b, prop , caseless) {\n    if (!utils["a" /* default */].isUndefined(b)) {\n      return getMergedValue(a, b, prop , caseless);\n    } else if (!utils["a" /* default */].isUndefined(a)) {\n      return getMergedValue(undefined, a, prop , caseless);\n    }\n  }\n\n  // eslint-disable-next-line consistent-return\n  function valueFromConfig2(a, b) {\n    if (!utils["a" /* default */].isUndefined(b)) {\n      return getMergedValue(undefined, b);\n    }\n  }\n\n  // eslint-disable-next-line consistent-return\n  function defaultToConfig2(a, b) {\n    if (!utils["a" /* default */].isUndefined(b)) {\n      return getMergedValue(undefined, b);\n    } else if (!utils["a" /* default */].isUndefined(a)) {\n      return getMergedValue(undefined, a);\n    }\n  }\n\n  // eslint-disable-next-line consistent-return\n  function mergeDirectKeys(a, b, prop) {\n    if (prop in config2) {\n      return getMergedValue(a, b);\n    } else if (prop in config1) {\n      return getMergedValue(undefined, a);\n    }\n  }\n\n  const mergeMap = {\n    url: valueFromConfig2,\n    method: valueFromConfig2,\n    data: valueFromConfig2,\n    baseURL: defaultToConfig2,\n    transformRequest: defaultToConfig2,\n    transformResponse: defaultToConfig2,\n    paramsSerializer: defaultToConfig2,\n    timeout: defaultToConfig2,\n    timeoutMessage: defaultToConfig2,\n    withCredentials: defaultToConfig2,\n    withXSRFToken: defaultToConfig2,\n    adapter: defaultToConfig2,\n    responseType: defaultToConfig2,\n    xsrfCookieName: defaultToConfig2,\n    xsrfHeaderName: defaultToConfig2,\n    onUploadProgress: defaultToConfig2,\n    onDownloadProgress: defaultToConfig2,\n    decompress: defaultToConfig2,\n    maxContentLength: defaultToConfig2,\n    maxBodyLength: defaultToConfig2,\n    beforeRedirect: defaultToConfig2,\n    transport: defaultToConfig2,\n    httpAgent: defaultToConfig2,\n    httpsAgent: defaultToConfig2,\n    cancelToken: defaultToConfig2,\n    socketPath: defaultToConfig2,\n    responseEncoding: defaultToConfig2,\n    validateStatus: mergeDirectKeys,\n    headers: (a, b , prop) => mergeDeepProperties(headersToObject(a), headersToObject(b),prop, true)\n  };\n\n  utils["a" /* default */].forEach(Object.keys(Object.assign({}, config1, config2)), function computeConfigValue(prop) {\n    const merge = mergeMap[prop] || mergeDeepProperties;\n    const configValue = merge(config1[prop], config2[prop], prop);\n    (utils["a" /* default */].isUndefined(configValue) && merge !== mergeDirectKeys) || (config[prop] = configValue);\n  });\n\n  return config;\n}\n\n// CONCATENATED MODULE: ./node_modules/axios/lib/helpers/resolveConfig.js\n\n\n\n\n\n\n\n\n\n/* harmony default export */ var resolveConfig = ((config) => {\n  const newConfig = mergeConfig({}, config);\n\n  let {data, withXSRFToken, xsrfHeaderName, xsrfCookieName, headers, auth} = newConfig;\n\n  newConfig.headers = headers = core_AxiosHeaders.from(headers);\n\n  newConfig.url = buildURL(buildFullPath(newConfig.baseURL, newConfig.url, newConfig.allowAbsoluteUrls), config.params, config.paramsSerializer);\n\n  // HTTP basic authentication\n  if (auth) {\n    headers.set(\'Authorization\', \'Basic \' +\n      btoa((auth.username || \'\') + \':\' + (auth.password ? unescape(encodeURIComponent(auth.password)) : \'\'))\n    );\n  }\n\n  let contentType;\n\n  if (utils["a" /* default */].isFormData(data)) {\n    if (platform.hasStandardBrowserEnv || platform.hasStandardBrowserWebWorkerEnv) {\n      headers.setContentType(undefined); // Let the browser set it\n    } else if ((contentType = headers.getContentType()) !== false) {\n      // fix semicolon duplication issue for ReactNative FormData implementation\n      const [type, ...tokens] = contentType ? contentType.split(\';\').map(token => token.trim()).filter(Boolean) : [];\n      headers.setContentType([type || \'multipart/form-data\', ...tokens].join(\'; \'));\n    }\n  }\n\n  // Add xsrf header\n  // This is only done if running in a standard browser environment.\n  // Specifically not if we\'re in a web worker, or react-native.\n\n  if (platform.hasStandardBrowserEnv) {\n    withXSRFToken && utils["a" /* default */].isFunction(withXSRFToken) && (withXSRFToken = withXSRFToken(newConfig));\n\n    if (withXSRFToken || (withXSRFToken !== false && isURLSameOrigin(newConfig.url))) {\n      // Add xsrf header\n      const xsrfValue = xsrfHeaderName && xsrfCookieName && cookies.read(xsrfCookieName);\n\n      if (xsrfValue) {\n        headers.set(xsrfHeaderName, xsrfValue);\n      }\n    }\n  }\n\n  return newConfig;\n});\n\n\n// CONCATENATED MODULE: ./node_modules/axios/lib/adapters/xhr.js\n\n\n\n\n\n\n\n\n\n\n\nconst isXHRAdapterSupported = typeof XMLHttpRequest !== \'undefined\';\n\n/* harmony default export */ var xhr = (isXHRAdapterSupported && function (config) {\n  return new Promise(function dispatchXhrRequest(resolve, reject) {\n    const _config = resolveConfig(config);\n    let requestData = _config.data;\n    const requestHeaders = core_AxiosHeaders.from(_config.headers).normalize();\n    let {responseType, onUploadProgress, onDownloadProgress} = _config;\n    let onCanceled;\n    let uploadThrottled, downloadThrottled;\n    let flushUpload, flushDownload;\n\n    function done() {\n      flushUpload && flushUpload(); // flush events\n      flushDownload && flushDownload(); // flush events\n\n      _config.cancelToken && _config.cancelToken.unsubscribe(onCanceled);\n\n      _config.signal && _config.signal.removeEventListener(\'abort\', onCanceled);\n    }\n\n    let request = new XMLHttpRequest();\n\n    request.open(_config.method.toUpperCase(), _config.url, true);\n\n    // Set the request timeout in MS\n    request.timeout = _config.timeout;\n\n    function onloadend() {\n      if (!request) {\n        return;\n      }\n      // Prepare the response\n      const responseHeaders = core_AxiosHeaders.from(\n        \'getAllResponseHeaders\' in request && request.getAllResponseHeaders()\n      );\n      const responseData = !responseType || responseType === \'text\' || responseType === \'json\' ?\n        request.responseText : request.response;\n      const response = {\n        data: responseData,\n        status: request.status,\n        statusText: request.statusText,\n        headers: responseHeaders,\n        config,\n        request\n      };\n\n      settle(function _resolve(value) {\n        resolve(value);\n        done();\n      }, function _reject(err) {\n        reject(err);\n        done();\n      }, response);\n\n      // Clean up request\n      request = null;\n    }\n\n    if (\'onloadend\' in request) {\n      // Use onloadend if available\n      request.onloadend = onloadend;\n    } else {\n      // Listen for ready state to emulate onloadend\n      request.onreadystatechange = function handleLoad() {\n        if (!request || request.readyState !== 4) {\n          return;\n        }\n\n        // The request errored out and we didn\'t get a response, this will be\n        // handled by onerror instead\n        // With one exception: request that using file: protocol, most browsers\n        // will return status as 0 even though it\'s a successful request\n        if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf(\'file:\') === 0)) {\n          return;\n        }\n        // readystate handler is calling before onerror or ontimeout handlers,\n        // so we should call onloadend on the next \'tick\'\n        setTimeout(onloadend);\n      };\n    }\n\n    // Handle browser request cancellation (as opposed to a manual cancellation)\n    request.onabort = function handleAbort() {\n      if (!request) {\n        return;\n      }\n\n      reject(new AxiosError["a" /* default */](\'Request aborted\', AxiosError["a" /* default */].ECONNABORTED, config, request));\n\n      // Clean up request\n      request = null;\n    };\n\n    // Handle low level network errors\n    request.onerror = function handleError() {\n      // Real errors are hidden from us by the browser\n      // onerror should only fire if it\'s a network error\n      reject(new AxiosError["a" /* default */](\'Network Error\', AxiosError["a" /* default */].ERR_NETWORK, config, request));\n\n      // Clean up request\n      request = null;\n    };\n\n    // Handle timeout\n    request.ontimeout = function handleTimeout() {\n      let timeoutErrorMessage = _config.timeout ? \'timeout of \' + _config.timeout + \'ms exceeded\' : \'timeout exceeded\';\n      const transitional = _config.transitional || defaults_transitional;\n      if (_config.timeoutErrorMessage) {\n        timeoutErrorMessage = _config.timeoutErrorMessage;\n      }\n      reject(new AxiosError["a" /* default */](\n        timeoutErrorMessage,\n        transitional.clarifyTimeoutError ? AxiosError["a" /* default */].ETIMEDOUT : AxiosError["a" /* default */].ECONNABORTED,\n        config,\n        request));\n\n      // Clean up request\n      request = null;\n    };\n\n    // Remove Content-Type if data is undefined\n    requestData === undefined && requestHeaders.setContentType(null);\n\n    // Add headers to the request\n    if (\'setRequestHeader\' in request) {\n      utils["a" /* default */].forEach(requestHeaders.toJSON(), function setRequestHeader(val, key) {\n        request.setRequestHeader(key, val);\n      });\n    }\n\n    // Add withCredentials to request if needed\n    if (!utils["a" /* default */].isUndefined(_config.withCredentials)) {\n      request.withCredentials = !!_config.withCredentials;\n    }\n\n    // Add responseType to request if needed\n    if (responseType && responseType !== \'json\') {\n      request.responseType = _config.responseType;\n    }\n\n    // Handle progress if needed\n    if (onDownloadProgress) {\n      ([downloadThrottled, flushDownload] = progressEventReducer(onDownloadProgress, true));\n      request.addEventListener(\'progress\', downloadThrottled);\n    }\n\n    // Not all browsers support upload events\n    if (onUploadProgress && request.upload) {\n      ([uploadThrottled, flushUpload] = progressEventReducer(onUploadProgress));\n\n      request.upload.addEventListener(\'progress\', uploadThrottled);\n\n      request.upload.addEventListener(\'loadend\', flushUpload);\n    }\n\n    if (_config.cancelToken || _config.signal) {\n      // Handle cancellation\n      // eslint-disable-next-line func-names\n      onCanceled = cancel => {\n        if (!request) {\n          return;\n        }\n        reject(!cancel || cancel.type ? new cancel_CanceledError(null, config, request) : cancel);\n        request.abort();\n        request = null;\n      };\n\n      _config.cancelToken && _config.cancelToken.subscribe(onCanceled);\n      if (_config.signal) {\n        _config.signal.aborted ? onCanceled() : _config.signal.addEventListener(\'abort\', onCanceled);\n      }\n    }\n\n    const protocol = parseProtocol(_config.url);\n\n    if (protocol && platform.protocols.indexOf(protocol) === -1) {\n      reject(new AxiosError["a" /* default */](\'Unsupported protocol \' + protocol + \':\', AxiosError["a" /* default */].ERR_BAD_REQUEST, config));\n      return;\n    }\n\n\n    // Send the request\n    request.send(requestData || null);\n  });\n});\n\n// CONCATENATED MODULE: ./node_modules/axios/lib/helpers/composeSignals.js\n\n\n\n\nconst composeSignals = (signals, timeout) => {\n  const {length} = (signals = signals ? signals.filter(Boolean) : []);\n\n  if (timeout || length) {\n    let controller = new AbortController();\n\n    let aborted;\n\n    const onabort = function (reason) {\n      if (!aborted) {\n        aborted = true;\n        unsubscribe();\n        const err = reason instanceof Error ? reason : this.reason;\n        controller.abort(err instanceof AxiosError["a" /* default */] ? err : new cancel_CanceledError(err instanceof Error ? err.message : err));\n      }\n    }\n\n    let timer = timeout && setTimeout(() => {\n      timer = null;\n      onabort(new AxiosError["a" /* default */](`timeout ${timeout} of ms exceeded`, AxiosError["a" /* default */].ETIMEDOUT))\n    }, timeout)\n\n    const unsubscribe = () => {\n      if (signals) {\n        timer && clearTimeout(timer);\n        timer = null;\n        signals.forEach(signal => {\n          signal.unsubscribe ? signal.unsubscribe(onabort) : signal.removeEventListener(\'abort\', onabort);\n        });\n        signals = null;\n      }\n    }\n\n    signals.forEach((signal) => signal.addEventListener(\'abort\', onabort));\n\n    const {signal} = controller;\n\n    signal.unsubscribe = () => utils["a" /* default */].asap(unsubscribe);\n\n    return signal;\n  }\n}\n\n/* harmony default export */ var helpers_composeSignals = (composeSignals);\n\n// CONCATENATED MODULE: ./node_modules/axios/lib/helpers/trackStream.js\n\nconst streamChunk = function* (chunk, chunkSize) {\n  let len = chunk.byteLength;\n\n  if (!chunkSize || len < chunkSize) {\n    yield chunk;\n    return;\n  }\n\n  let pos = 0;\n  let end;\n\n  while (pos < len) {\n    end = pos + chunkSize;\n    yield chunk.slice(pos, end);\n    pos = end;\n  }\n}\n\nconst readBytes = async function* (iterable, chunkSize) {\n  for await (const chunk of readStream(iterable)) {\n    yield* streamChunk(chunk, chunkSize);\n  }\n}\n\nconst readStream = async function* (stream) {\n  if (stream[Symbol.asyncIterator]) {\n    yield* stream;\n    return;\n  }\n\n  const reader = stream.getReader();\n  try {\n    for (;;) {\n      const {done, value} = await reader.read();\n      if (done) {\n        break;\n      }\n      yield value;\n    }\n  } finally {\n    await reader.cancel();\n  }\n}\n\nconst trackStream = (stream, chunkSize, onProgress, onFinish) => {\n  const iterator = readBytes(stream, chunkSize);\n\n  let bytes = 0;\n  let done;\n  let _onFinish = (e) => {\n    if (!done) {\n      done = true;\n      onFinish && onFinish(e);\n    }\n  }\n\n  return new ReadableStream({\n    async pull(controller) {\n      try {\n        const {done, value} = await iterator.next();\n\n        if (done) {\n         _onFinish();\n          controller.close();\n          return;\n        }\n\n        let len = value.byteLength;\n        if (onProgress) {\n          let loadedBytes = bytes += len;\n          onProgress(loadedBytes);\n        }\n        controller.enqueue(new Uint8Array(value));\n      } catch (err) {\n        _onFinish(err);\n        throw err;\n      }\n    },\n    cancel(reason) {\n      _onFinish(reason);\n      return iterator.return();\n    }\n  }, {\n    highWaterMark: 2\n  })\n}\n\n// CONCATENATED MODULE: ./node_modules/axios/lib/adapters/fetch.js\n\n\n\n\n\n\n\n\n\n\nconst isFetchSupported = typeof fetch === \'function\' && typeof Request === \'function\' && typeof Response === \'function\';\nconst isReadableStreamSupported = isFetchSupported && typeof ReadableStream === \'function\';\n\n// used only inside the fetch adapter\nconst encodeText = isFetchSupported && (typeof TextEncoder === \'function\' ?\n    ((encoder) => (str) => encoder.encode(str))(new TextEncoder()) :\n    async (str) => new Uint8Array(await new Response(str).arrayBuffer())\n);\n\nconst test = (fn, ...args) => {\n  try {\n    return !!fn(...args);\n  } catch (e) {\n    return false\n  }\n}\n\nconst supportsRequestStream = isReadableStreamSupported && test(() => {\n  let duplexAccessed = false;\n\n  const hasContentType = new Request(platform.origin, {\n    body: new ReadableStream(),\n    method: \'POST\',\n    get duplex() {\n      duplexAccessed = true;\n      return \'half\';\n    },\n  }).headers.has(\'Content-Type\');\n\n  return duplexAccessed && !hasContentType;\n});\n\nconst DEFAULT_CHUNK_SIZE = 64 * 1024;\n\nconst supportsResponseStream = isReadableStreamSupported &&\n  test(() => utils["a" /* default */].isReadableStream(new Response(\'\').body));\n\n\nconst resolvers = {\n  stream: supportsResponseStream && ((res) => res.body)\n};\n\nisFetchSupported && (((res) => {\n  [\'text\', \'arrayBuffer\', \'blob\', \'formData\', \'stream\'].forEach(type => {\n    !resolvers[type] && (resolvers[type] = utils["a" /* default */].isFunction(res[type]) ? (res) => res[type]() :\n      (_, config) => {\n        throw new AxiosError["a" /* default */](`Response type \'${type}\' is not supported`, AxiosError["a" /* default */].ERR_NOT_SUPPORT, config);\n      })\n  });\n})(new Response));\n\nconst getBodyLength = async (body) => {\n  if (body == null) {\n    return 0;\n  }\n\n  if(utils["a" /* default */].isBlob(body)) {\n    return body.size;\n  }\n\n  if(utils["a" /* default */].isSpecCompliantForm(body)) {\n    const _request = new Request(platform.origin, {\n      method: \'POST\',\n      body,\n    });\n    return (await _request.arrayBuffer()).byteLength;\n  }\n\n  if(utils["a" /* default */].isArrayBufferView(body) || utils["a" /* default */].isArrayBuffer(body)) {\n    return body.byteLength;\n  }\n\n  if(utils["a" /* default */].isURLSearchParams(body)) {\n    body = body + \'\';\n  }\n\n  if(utils["a" /* default */].isString(body)) {\n    return (await encodeText(body)).byteLength;\n  }\n}\n\nconst resolveBodyLength = async (headers, body) => {\n  const length = utils["a" /* default */].toFiniteNumber(headers.getContentLength());\n\n  return length == null ? getBodyLength(body) : length;\n}\n\n/* harmony default export */ var adapters_fetch = (isFetchSupported && (async (config) => {\n  let {\n    url,\n    method,\n    data,\n    signal,\n    cancelToken,\n    timeout,\n    onDownloadProgress,\n    onUploadProgress,\n    responseType,\n    headers,\n    withCredentials = \'same-origin\',\n    fetchOptions\n  } = resolveConfig(config);\n\n  responseType = responseType ? (responseType + \'\').toLowerCase() : \'text\';\n\n  let composedSignal = helpers_composeSignals([signal, cancelToken && cancelToken.toAbortSignal()], timeout);\n\n  let request;\n\n  const unsubscribe = composedSignal && composedSignal.unsubscribe && (() => {\n      composedSignal.unsubscribe();\n  });\n\n  let requestContentLength;\n\n  try {\n    if (\n      onUploadProgress && supportsRequestStream && method !== \'get\' && method !== \'head\' &&\n      (requestContentLength = await resolveBodyLength(headers, data)) !== 0\n    ) {\n      let _request = new Request(url, {\n        method: \'POST\',\n        body: data,\n        duplex: "half"\n      });\n\n      let contentTypeHeader;\n\n      if (utils["a" /* default */].isFormData(data) && (contentTypeHeader = _request.headers.get(\'content-type\'))) {\n        headers.setContentType(contentTypeHeader)\n      }\n\n      if (_request.body) {\n        const [onProgress, flush] = progressEventDecorator(\n          requestContentLength,\n          progressEventReducer(asyncDecorator(onUploadProgress))\n        );\n\n        data = trackStream(_request.body, DEFAULT_CHUNK_SIZE, onProgress, flush);\n      }\n    }\n\n    if (!utils["a" /* default */].isString(withCredentials)) {\n      withCredentials = withCredentials ? \'include\' : \'omit\';\n    }\n\n    // Cloudflare Workers throws when credentials are defined\n    // see https://github.com/cloudflare/workerd/issues/902\n    const isCredentialsSupported = "credentials" in Request.prototype;\n    request = new Request(url, {\n      ...fetchOptions,\n      signal: composedSignal,\n      method: method.toUpperCase(),\n      headers: headers.normalize().toJSON(),\n      body: data,\n      duplex: "half",\n      credentials: isCredentialsSupported ? withCredentials : undefined\n    });\n\n    let response = await fetch(request);\n\n    const isStreamResponse = supportsResponseStream && (responseType === \'stream\' || responseType === \'response\');\n\n    if (supportsResponseStream && (onDownloadProgress || (isStreamResponse && unsubscribe))) {\n      const options = {};\n\n      [\'status\', \'statusText\', \'headers\'].forEach(prop => {\n        options[prop] = response[prop];\n      });\n\n      const responseContentLength = utils["a" /* default */].toFiniteNumber(response.headers.get(\'content-length\'));\n\n      const [onProgress, flush] = onDownloadProgress && progressEventDecorator(\n        responseContentLength,\n        progressEventReducer(asyncDecorator(onDownloadProgress), true)\n      ) || [];\n\n      response = new Response(\n        trackStream(response.body, DEFAULT_CHUNK_SIZE, onProgress, () => {\n          flush && flush();\n          unsubscribe && unsubscribe();\n        }),\n        options\n      );\n    }\n\n    responseType = responseType || \'text\';\n\n    let responseData = await resolvers[utils["a" /* default */].findKey(resolvers, responseType) || \'text\'](response, config);\n\n    !isStreamResponse && unsubscribe && unsubscribe();\n\n    return await new Promise((resolve, reject) => {\n      settle(resolve, reject, {\n        data: responseData,\n        headers: core_AxiosHeaders.from(response.headers),\n        status: response.status,\n        statusText: response.statusText,\n        config,\n        request\n      })\n    })\n  } catch (err) {\n    unsubscribe && unsubscribe();\n\n    if (err && err.name === \'TypeError\' && /fetch/i.test(err.message)) {\n      throw Object.assign(\n        new AxiosError["a" /* default */](\'Network Error\', AxiosError["a" /* default */].ERR_NETWORK, config, request),\n        {\n          cause: err.cause || err\n        }\n      )\n    }\n\n    throw AxiosError["a" /* default */].from(err, err && err.code, config, request);\n  }\n}));\n\n\n\n// CONCATENATED MODULE: ./node_modules/axios/lib/adapters/adapters.js\n\n\n\n\n\n\nconst knownAdapters = {\n  http: helpers_null["a" /* default */],\n  xhr: xhr,\n  fetch: adapters_fetch\n}\n\nutils["a" /* default */].forEach(knownAdapters, (fn, value) => {\n  if (fn) {\n    try {\n      Object.defineProperty(fn, \'name\', {value});\n    } catch (e) {\n      // eslint-disable-next-line no-empty\n    }\n    Object.defineProperty(fn, \'adapterName\', {value});\n  }\n});\n\nconst renderReason = (reason) => `- ${reason}`;\n\nconst isResolvedHandle = (adapter) => utils["a" /* default */].isFunction(adapter) || adapter === null || adapter === false;\n\n/* harmony default export */ var adapters_adapters = ({\n  getAdapter: (adapters) => {\n    adapters = utils["a" /* default */].isArray(adapters) ? adapters : [adapters];\n\n    const {length} = adapters;\n    let nameOrAdapter;\n    let adapter;\n\n    const rejectedReasons = {};\n\n    for (let i = 0; i < length; i++) {\n      nameOrAdapter = adapters[i];\n      let id;\n\n      adapter = nameOrAdapter;\n\n      if (!isResolvedHandle(nameOrAdapter)) {\n        adapter = knownAdapters[(id = String(nameOrAdapter)).toLowerCase()];\n\n        if (adapter === undefined) {\n          throw new AxiosError["a" /* default */](`Unknown adapter \'${id}\'`);\n        }\n      }\n\n      if (adapter) {\n        break;\n      }\n\n      rejectedReasons[id || \'#\' + i] = adapter;\n    }\n\n    if (!adapter) {\n\n      const reasons = Object.entries(rejectedReasons)\n        .map(([id, state]) => `adapter ${id} ` +\n          (state === false ? \'is not supported by the environment\' : \'is not available in the build\')\n        );\n\n      let s = length ?\n        (reasons.length > 1 ? \'since :\\n\' + reasons.map(renderReason).join(\'\\n\') : \' \' + renderReason(reasons[0])) :\n        \'as no adapter specified\';\n\n      throw new AxiosError["a" /* default */](\n        `There is no suitable adapter to dispatch the request ` + s,\n        \'ERR_NOT_SUPPORT\'\n      );\n    }\n\n    return adapter;\n  },\n  adapters: knownAdapters\n});\n\n// CONCATENATED MODULE: ./node_modules/axios/lib/core/dispatchRequest.js\n\n\n\n\n\n\n\n\n\n/**\n * Throws a `CanceledError` if cancellation has been requested.\n *\n * @param {Object} config The config that is to be used for the request\n *\n * @returns {void}\n */\nfunction throwIfCancellationRequested(config) {\n  if (config.cancelToken) {\n    config.cancelToken.throwIfRequested();\n  }\n\n  if (config.signal && config.signal.aborted) {\n    throw new cancel_CanceledError(null, config);\n  }\n}\n\n/**\n * Dispatch a request to the server using the configured adapter.\n *\n * @param {object} config The config that is to be used for the request\n *\n * @returns {Promise} The Promise to be fulfilled\n */\nfunction dispatchRequest(config) {\n  throwIfCancellationRequested(config);\n\n  config.headers = core_AxiosHeaders.from(config.headers);\n\n  // Transform request data\n  config.data = transformData.call(\n    config,\n    config.transformRequest\n  );\n\n  if ([\'post\', \'put\', \'patch\'].indexOf(config.method) !== -1) {\n    config.headers.setContentType(\'application/x-www-form-urlencoded\', false);\n  }\n\n  const adapter = adapters_adapters.getAdapter(config.adapter || lib_defaults.adapter);\n\n  return adapter(config).then(function onAdapterResolution(response) {\n    throwIfCancellationRequested(config);\n\n    // Transform response data\n    response.data = transformData.call(\n      config,\n      config.transformResponse,\n      response\n    );\n\n    response.headers = core_AxiosHeaders.from(response.headers);\n\n    return response;\n  }, function onAdapterRejection(reason) {\n    if (!isCancel(reason)) {\n      throwIfCancellationRequested(config);\n\n      // Transform response data\n      if (reason && reason.response) {\n        reason.response.data = transformData.call(\n          config,\n          config.transformResponse,\n          reason.response\n        );\n        reason.response.headers = core_AxiosHeaders.from(reason.response.headers);\n      }\n    }\n\n    return Promise.reject(reason);\n  });\n}\n\n// CONCATENATED MODULE: ./node_modules/axios/lib/env/data.js\nconst VERSION = "1.8.4";\n// CONCATENATED MODULE: ./node_modules/axios/lib/helpers/validator.js\n\n\n\n\n\nconst validators = {};\n\n// eslint-disable-next-line func-names\n[\'object\', \'boolean\', \'number\', \'function\', \'string\', \'symbol\'].forEach((type, i) => {\n  validators[type] = function validator(thing) {\n    return typeof thing === type || \'a\' + (i < 1 ? \'n \' : \' \') + type;\n  };\n});\n\nconst deprecatedWarnings = {};\n\n/**\n * Transitional option validator\n *\n * @param {function|boolean?} validator - set to false if the transitional option has been removed\n * @param {string?} version - deprecated version / removed since version\n * @param {string?} message - some message with additional info\n *\n * @returns {function}\n */\nvalidators.transitional = function transitional(validator, version, message) {\n  function formatMessage(opt, desc) {\n    return \'[Axios v\' + VERSION + \'] Transitional option \\\'\' + opt + \'\\\'\' + desc + (message ? \'. \' + message : \'\');\n  }\n\n  // eslint-disable-next-line func-names\n  return (value, opt, opts) => {\n    if (validator === false) {\n      throw new AxiosError["a" /* default */](\n        formatMessage(opt, \' has been removed\' + (version ? \' in \' + version : \'\')),\n        AxiosError["a" /* default */].ERR_DEPRECATED\n      );\n    }\n\n    if (version && !deprecatedWarnings[opt]) {\n      deprecatedWarnings[opt] = true;\n      // eslint-disable-next-line no-console\n      console.warn(\n        formatMessage(\n          opt,\n          \' has been deprecated since v\' + version + \' and will be removed in the near future\'\n        )\n      );\n    }\n\n    return validator ? validator(value, opt, opts) : true;\n  };\n};\n\nvalidators.spelling = function spelling(correctSpelling) {\n  return (value, opt) => {\n    // eslint-disable-next-line no-console\n    console.warn(`${opt} is likely a misspelling of ${correctSpelling}`);\n    return true;\n  }\n};\n\n/**\n * Assert object\'s properties type\n *\n * @param {object} options\n * @param {object} schema\n * @param {boolean?} allowUnknown\n *\n * @returns {object}\n */\n\nfunction assertOptions(options, schema, allowUnknown) {\n  if (typeof options !== \'object\') {\n    throw new AxiosError["a" /* default */](\'options must be an object\', AxiosError["a" /* default */].ERR_BAD_OPTION_VALUE);\n  }\n  const keys = Object.keys(options);\n  let i = keys.length;\n  while (i-- > 0) {\n    const opt = keys[i];\n    const validator = schema[opt];\n    if (validator) {\n      const value = options[opt];\n      const result = value === undefined || validator(value, opt, options);\n      if (result !== true) {\n        throw new AxiosError["a" /* default */](\'option \' + opt + \' must be \' + result, AxiosError["a" /* default */].ERR_BAD_OPTION_VALUE);\n      }\n      continue;\n    }\n    if (allowUnknown !== true) {\n      throw new AxiosError["a" /* default */](\'Unknown option \' + opt, AxiosError["a" /* default */].ERR_BAD_OPTION);\n    }\n  }\n}\n\n/* harmony default export */ var helpers_validator = ({\n  assertOptions,\n  validators\n});\n\n// CONCATENATED MODULE: ./node_modules/axios/lib/core/Axios.js\n\n\n\n\n\n\n\n\n\n\n\nconst Axios_validators = helpers_validator.validators;\n\n/**\n * Create a new instance of Axios\n *\n * @param {Object} instanceConfig The default config for the instance\n *\n * @return {Axios} A new instance of Axios\n */\nclass Axios_Axios {\n  constructor(instanceConfig) {\n    this.defaults = instanceConfig;\n    this.interceptors = {\n      request: new core_InterceptorManager(),\n      response: new core_InterceptorManager()\n    };\n  }\n\n  /**\n   * Dispatch a request\n   *\n   * @param {String|Object} configOrUrl The config specific for this request (merged with this.defaults)\n   * @param {?Object} config\n   *\n   * @returns {Promise} The Promise to be fulfilled\n   */\n  async request(configOrUrl, config) {\n    try {\n      return await this._request(configOrUrl, config);\n    } catch (err) {\n      if (err instanceof Error) {\n        let dummy = {};\n\n        Error.captureStackTrace ? Error.captureStackTrace(dummy) : (dummy = new Error());\n\n        // slice off the Error: ... line\n        const stack = dummy.stack ? dummy.stack.replace(/^.+\\n/, \'\') : \'\';\n        try {\n          if (!err.stack) {\n            err.stack = stack;\n            // match without the 2 top stack lines\n          } else if (stack && !String(err.stack).endsWith(stack.replace(/^.+\\n.+\\n/, \'\'))) {\n            err.stack += \'\\n\' + stack\n          }\n        } catch (e) {\n          // ignore the case where "stack" is an un-writable property\n        }\n      }\n\n      throw err;\n    }\n  }\n\n  _request(configOrUrl, config) {\n    /*eslint no-param-reassign:0*/\n    // Allow for axios(\'example/url\'[, config]) a la fetch API\n    if (typeof configOrUrl === \'string\') {\n      config = config || {};\n      config.url = configOrUrl;\n    } else {\n      config = configOrUrl || {};\n    }\n\n    config = mergeConfig(this.defaults, config);\n\n    const {transitional, paramsSerializer, headers} = config;\n\n    if (transitional !== undefined) {\n      helpers_validator.assertOptions(transitional, {\n        silentJSONParsing: Axios_validators.transitional(Axios_validators.boolean),\n        forcedJSONParsing: Axios_validators.transitional(Axios_validators.boolean),\n        clarifyTimeoutError: Axios_validators.transitional(Axios_validators.boolean)\n      }, false);\n    }\n\n    if (paramsSerializer != null) {\n      if (utils["a" /* default */].isFunction(paramsSerializer)) {\n        config.paramsSerializer = {\n          serialize: paramsSerializer\n        }\n      } else {\n        helpers_validator.assertOptions(paramsSerializer, {\n          encode: Axios_validators.function,\n          serialize: Axios_validators.function\n        }, true);\n      }\n    }\n\n    // Set config.allowAbsoluteUrls\n    if (config.allowAbsoluteUrls !== undefined) {\n      // do nothing\n    } else if (this.defaults.allowAbsoluteUrls !== undefined) {\n      config.allowAbsoluteUrls = this.defaults.allowAbsoluteUrls;\n    } else {\n      config.allowAbsoluteUrls = true;\n    }\n\n    helpers_validator.assertOptions(config, {\n      baseUrl: Axios_validators.spelling(\'baseURL\'),\n      withXsrfToken: Axios_validators.spelling(\'withXSRFToken\')\n    }, true);\n\n    // Set config.method\n    config.method = (config.method || this.defaults.method || \'get\').toLowerCase();\n\n    // Flatten headers\n    let contextHeaders = headers && utils["a" /* default */].merge(\n      headers.common,\n      headers[config.method]\n    );\n\n    headers && utils["a" /* default */].forEach(\n      [\'delete\', \'get\', \'head\', \'post\', \'put\', \'patch\', \'common\'],\n      (method) => {\n        delete headers[method];\n      }\n    );\n\n    config.headers = core_AxiosHeaders.concat(contextHeaders, headers);\n\n    // filter out skipped interceptors\n    const requestInterceptorChain = [];\n    let synchronousRequestInterceptors = true;\n    this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) {\n      if (typeof interceptor.runWhen === \'function\' && interceptor.runWhen(config) === false) {\n        return;\n      }\n\n      synchronousRequestInterceptors = synchronousRequestInterceptors && interceptor.synchronous;\n\n      requestInterceptorChain.unshift(interceptor.fulfilled, interceptor.rejected);\n    });\n\n    const responseInterceptorChain = [];\n    this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) {\n      responseInterceptorChain.push(interceptor.fulfilled, interceptor.rejected);\n    });\n\n    let promise;\n    let i = 0;\n    let len;\n\n    if (!synchronousRequestInterceptors) {\n      const chain = [dispatchRequest.bind(this), undefined];\n      chain.unshift.apply(chain, requestInterceptorChain);\n      chain.push.apply(chain, responseInterceptorChain);\n      len = chain.length;\n\n      promise = Promise.resolve(config);\n\n      while (i < len) {\n        promise = promise.then(chain[i++], chain[i++]);\n      }\n\n      return promise;\n    }\n\n    len = requestInterceptorChain.length;\n\n    let newConfig = config;\n\n    i = 0;\n\n    while (i < len) {\n      const onFulfilled = requestInterceptorChain[i++];\n      const onRejected = requestInterceptorChain[i++];\n      try {\n        newConfig = onFulfilled(newConfig);\n      } catch (error) {\n        onRejected.call(this, error);\n        break;\n      }\n    }\n\n    try {\n      promise = dispatchRequest.call(this, newConfig);\n    } catch (error) {\n      return Promise.reject(error);\n    }\n\n    i = 0;\n    len = responseInterceptorChain.length;\n\n    while (i < len) {\n      promise = promise.then(responseInterceptorChain[i++], responseInterceptorChain[i++]);\n    }\n\n    return promise;\n  }\n\n  getUri(config) {\n    config = mergeConfig(this.defaults, config);\n    const fullPath = buildFullPath(config.baseURL, config.url, config.allowAbsoluteUrls);\n    return buildURL(fullPath, config.params, config.paramsSerializer);\n  }\n}\n\n// Provide aliases for supported request methods\nutils["a" /* default */].forEach([\'delete\', \'get\', \'head\', \'options\'], function forEachMethodNoData(method) {\n  /*eslint func-names:0*/\n  Axios_Axios.prototype[method] = function(url, config) {\n    return this.request(mergeConfig(config || {}, {\n      method,\n      url,\n      data: (config || {}).data\n    }));\n  };\n});\n\nutils["a" /* default */].forEach([\'post\', \'put\', \'patch\'], function forEachMethodWithData(method) {\n  /*eslint func-names:0*/\n\n  function generateHTTPMethod(isForm) {\n    return function httpMethod(url, data, config) {\n      return this.request(mergeConfig(config || {}, {\n        method,\n        headers: isForm ? {\n          \'Content-Type\': \'multipart/form-data\'\n        } : {},\n        url,\n        data\n      }));\n    };\n  }\n\n  Axios_Axios.prototype[method] = generateHTTPMethod();\n\n  Axios_Axios.prototype[method + \'Form\'] = generateHTTPMethod(true);\n});\n\n/* harmony default export */ var core_Axios = (Axios_Axios);\n\n// CONCATENATED MODULE: ./node_modules/axios/lib/cancel/CancelToken.js\n\n\n\n\n/**\n * A `CancelToken` is an object that can be used to request cancellation of an operation.\n *\n * @param {Function} executor The executor function.\n *\n * @returns {CancelToken}\n */\nclass CancelToken_CancelToken {\n  constructor(executor) {\n    if (typeof executor !== \'function\') {\n      throw new TypeError(\'executor must be a function.\');\n    }\n\n    let resolvePromise;\n\n    this.promise = new Promise(function promiseExecutor(resolve) {\n      resolvePromise = resolve;\n    });\n\n    const token = this;\n\n    // eslint-disable-next-line func-names\n    this.promise.then(cancel => {\n      if (!token._listeners) return;\n\n      let i = token._listeners.length;\n\n      while (i-- > 0) {\n        token._listeners[i](cancel);\n      }\n      token._listeners = null;\n    });\n\n    // eslint-disable-next-line func-names\n    this.promise.then = onfulfilled => {\n      let _resolve;\n      // eslint-disable-next-line func-names\n      const promise = new Promise(resolve => {\n        token.subscribe(resolve);\n        _resolve = resolve;\n      }).then(onfulfilled);\n\n      promise.cancel = function reject() {\n        token.unsubscribe(_resolve);\n      };\n\n      return promise;\n    };\n\n    executor(function cancel(message, config, request) {\n      if (token.reason) {\n        // Cancellation has already been requested\n        return;\n      }\n\n      token.reason = new cancel_CanceledError(message, config, request);\n      resolvePromise(token.reason);\n    });\n  }\n\n  /**\n   * Throws a `CanceledError` if cancellation has been requested.\n   */\n  throwIfRequested() {\n    if (this.reason) {\n      throw this.reason;\n    }\n  }\n\n  /**\n   * Subscribe to the cancel signal\n   */\n\n  subscribe(listener) {\n    if (this.reason) {\n      listener(this.reason);\n      return;\n    }\n\n    if (this._listeners) {\n      this._listeners.push(listener);\n    } else {\n      this._listeners = [listener];\n    }\n  }\n\n  /**\n   * Unsubscribe from the cancel signal\n   */\n\n  unsubscribe(listener) {\n    if (!this._listeners) {\n      return;\n    }\n    const index = this._listeners.indexOf(listener);\n    if (index !== -1) {\n      this._listeners.splice(index, 1);\n    }\n  }\n\n  toAbortSignal() {\n    const controller = new AbortController();\n\n    const abort = (err) => {\n      controller.abort(err);\n    };\n\n    this.subscribe(abort);\n\n    controller.signal.unsubscribe = () => this.unsubscribe(abort);\n\n    return controller.signal;\n  }\n\n  /**\n   * Returns an object that contains a new `CancelToken` and a function that, when called,\n   * cancels the `CancelToken`.\n   */\n  static source() {\n    let cancel;\n    const token = new CancelToken_CancelToken(function executor(c) {\n      cancel = c;\n    });\n    return {\n      token,\n      cancel\n    };\n  }\n}\n\n/* harmony default export */ var cancel_CancelToken = (CancelToken_CancelToken);\n\n// CONCATENATED MODULE: ./node_modules/axios/lib/helpers/spread.js\n\n\n/**\n * Syntactic sugar for invoking a function and expanding an array for arguments.\n *\n * Common use case would be to use `Function.prototype.apply`.\n *\n *  ```js\n *  function f(x, y, z) {}\n *  var args = [1, 2, 3];\n *  f.apply(null, args);\n *  ```\n *\n * With `spread` this example can be re-written.\n *\n *  ```js\n *  spread(function(x, y, z) {})([1, 2, 3]);\n *  ```\n *\n * @param {Function} callback\n *\n * @returns {Function}\n */\nfunction spread(callback) {\n  return function wrap(arr) {\n    return callback.apply(null, arr);\n  };\n}\n\n// CONCATENATED MODULE: ./node_modules/axios/lib/helpers/isAxiosError.js\n\n\n\n\n/**\n * Determines whether the payload is an error thrown by Axios\n *\n * @param {*} payload The value to test\n *\n * @returns {boolean} True if the payload is an error thrown by Axios, otherwise false\n */\nfunction isAxiosError(payload) {\n  return utils["a" /* default */].isObject(payload) && (payload.isAxiosError === true);\n}\n\n// CONCATENATED MODULE: ./node_modules/axios/lib/helpers/HttpStatusCode.js\nconst HttpStatusCode = {\n  Continue: 100,\n  SwitchingProtocols: 101,\n  Processing: 102,\n  EarlyHints: 103,\n  Ok: 200,\n  Created: 201,\n  Accepted: 202,\n  NonAuthoritativeInformation: 203,\n  NoContent: 204,\n  ResetContent: 205,\n  PartialContent: 206,\n  MultiStatus: 207,\n  AlreadyReported: 208,\n  ImUsed: 226,\n  MultipleChoices: 300,\n  MovedPermanently: 301,\n  Found: 302,\n  SeeOther: 303,\n  NotModified: 304,\n  UseProxy: 305,\n  Unused: 306,\n  TemporaryRedirect: 307,\n  PermanentRedirect: 308,\n  BadRequest: 400,\n  Unauthorized: 401,\n  PaymentRequired: 402,\n  Forbidden: 403,\n  NotFound: 404,\n  MethodNotAllowed: 405,\n  NotAcceptable: 406,\n  ProxyAuthenticationRequired: 407,\n  RequestTimeout: 408,\n  Conflict: 409,\n  Gone: 410,\n  LengthRequired: 411,\n  PreconditionFailed: 412,\n  PayloadTooLarge: 413,\n  UriTooLong: 414,\n  UnsupportedMediaType: 415,\n  RangeNotSatisfiable: 416,\n  ExpectationFailed: 417,\n  ImATeapot: 418,\n  MisdirectedRequest: 421,\n  UnprocessableEntity: 422,\n  Locked: 423,\n  FailedDependency: 424,\n  TooEarly: 425,\n  UpgradeRequired: 426,\n  PreconditionRequired: 428,\n  TooManyRequests: 429,\n  RequestHeaderFieldsTooLarge: 431,\n  UnavailableForLegalReasons: 451,\n  InternalServerError: 500,\n  NotImplemented: 501,\n  BadGateway: 502,\n  ServiceUnavailable: 503,\n  GatewayTimeout: 504,\n  HttpVersionNotSupported: 505,\n  VariantAlsoNegotiates: 506,\n  InsufficientStorage: 507,\n  LoopDetected: 508,\n  NotExtended: 510,\n  NetworkAuthenticationRequired: 511,\n};\n\nObject.entries(HttpStatusCode).forEach(([key, value]) => {\n  HttpStatusCode[value] = key;\n});\n\n/* harmony default export */ var helpers_HttpStatusCode = (HttpStatusCode);\n\n// CONCATENATED MODULE: ./node_modules/axios/lib/axios.js\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/**\n * Create an instance of Axios\n *\n * @param {Object} defaultConfig The default config for the instance\n *\n * @returns {Axios} A new instance of Axios\n */\nfunction createInstance(defaultConfig) {\n  const context = new core_Axios(defaultConfig);\n  const instance = Object(bind["a" /* default */])(core_Axios.prototype.request, context);\n\n  // Copy axios.prototype to instance\n  utils["a" /* default */].extend(instance, core_Axios.prototype, context, {allOwnKeys: true});\n\n  // Copy context to instance\n  utils["a" /* default */].extend(instance, context, null, {allOwnKeys: true});\n\n  // Factory for creating new instances\n  instance.create = function create(instanceConfig) {\n    return createInstance(mergeConfig(defaultConfig, instanceConfig));\n  };\n\n  return instance;\n}\n\n// Create the default instance to be exported\nconst axios = createInstance(lib_defaults);\n\n// Expose Axios class to allow class inheritance\naxios.Axios = core_Axios;\n\n// Expose Cancel & CancelToken\naxios.CanceledError = cancel_CanceledError;\naxios.CancelToken = cancel_CancelToken;\naxios.isCancel = isCancel;\naxios.VERSION = VERSION;\naxios.toFormData = toFormData["a" /* default */];\n\n// Expose AxiosError class\naxios.AxiosError = AxiosError["a" /* default */];\n\n// alias for CanceledError for backward compatibility\naxios.Cancel = axios.CanceledError;\n\n// Expose all/spread\naxios.all = function all(promises) {\n  return Promise.all(promises);\n};\n\naxios.spread = spread;\n\n// Expose isAxiosError\naxios.isAxiosError = isAxiosError;\n\n// Expose mergeConfig\naxios.mergeConfig = mergeConfig;\n\naxios.AxiosHeaders = core_AxiosHeaders;\n\naxios.formToJSON = thing => helpers_formDataToJSON(utils["a" /* default */].isHTMLForm(thing) ? new FormData(thing) : thing);\n\naxios.getAdapter = adapters_adapters.getAdapter;\n\naxios.HttpStatusCode = helpers_HttpStatusCode;\n\naxios.default = axios;\n\n// this module should only have a default export\n/* harmony default export */ var lib_axios = (axios);\n\n// EXTERNAL MODULE: external "uxp"\nvar external_uxp_ = __webpack_require__(9);\n\n// CONCATENATED MODULE: ./src/config.js\nconst config_config = {\n  SERVER_URL: \'https://image.adobe.io/utils\',\n  SLACK_PRIVATE_KEY_PEM: `-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCQ6eXqDnnOqw8e\nx4w4RAubifg5ButhGQFdnX7JQshvqYTiMfMpGkFNHvWSP1MRAQy7Bd+aREE4y7cz\nSa/3XqwVw41KT7I2wieb/ebwuBhN9D90zWMGq7w2WKH6X7XzsrNbTYuSw5xMAreK\n0+pFThJ/lhi8DIVnfYCQlIdViT+dJ8gSdVSeZ1/gTdOMzVwQeioBm/R5A+XrtWNe\nmSCZeEF9yV8Lng+WfwzvK/UAIrmycwKpgXg1mhD5Sa/Gvv362d5youmrp5umHm0+\n9q/FhrfzR/+rgVxdgtCKRbQS8h5WTJuPklW5BkWmAKejeLtVfBNAleNNHlUm8s5O\nA+sNsHVxAgMBAAECggEAALIPtYKz5tgbOKkJaTJ56glkrqzj47WblCIDtBZ5CPCr\ny6xk0/RdXn/02qqpRNhQAeSMgwR7eejf6GwMzzuWCL11W9dDtieyyhjTE0IV80dW\nJ+LNvDAmNU5R+jY8BMc9fUVjM21TDmoXrI/ZdLNUC0bal+n5OLLBc4gz+VcRHilr\nLrveKGIC2byk35K4Sy53gZ/EQy8faYhLCCY1cl0vLEGG4spsPUEHw0GWTy73rJF5\nt5vw+EONorXFOEn0U29Eq6P44z86GOCKYRXSEcBA1/4b5M7GX/MaqT1iDhTm/jrR\nf2+97SIgDYGHDlBkguaorUcESo9+E6fVMc2pKJR7gQKBgQDHb5rhepAf4lrkVm6L\n69zlypwzGJm/s93wtTRMT9akUFfih6qYmSW0Uzi19gyQmWxSnOUvsEzqaTcFhwb8\n2vGGMDrZD+oh/Db1x34mCYAczk34tqsw6VfOT5nowccK45x/6VJQb5mWdu6+L8aY\nW2U17+Xu8qB5lmVgvVvOQ6mk8QKBgQC6A5tqVwaEM96ZyX7qRAo3rdmmDT5G2Tgw\nvNToKs1614YFly5KVuezoGVVGQTUezmf9UmQh7letMWPmUAtKWS5YfqU+3mluq3V\nDm0RygFXPnKD8mkR48gJ1VBAvZhFiyeOPiOl94q/DGq4s0RpcHbvRXD6wBdOJKQi\nOdjsHpnYgQKBgEX+lHQYSOb30YCcGRZAhHmdv25rbuKKJRWq8xzpVGK80+tsQ+Jk\ntYfxQVETdtt1DUB9Ui6HiKcooCfvePNbgDLhUHYIENs2oq9mAY8l/HGfslvc+H4l\nFy0QYOsAv3PB6JY39CzIzjWxrh7Ps7qbMQ1aEe/n9YxWzWPDcaoVsz9xAoGBAJ98\nBD5yivXCezKj3hsBZzlB54BFjoW0LEctP+Ym/LI8I36blmbKiDIsbXU+1DNRy6Bn\n8EDo/XhDybdLEAkommGPrgcabbw4iF5J1h4QcoHY2tpids+N2q8Do6E+bVYC71E3\n2dysltsizEW7/gXhFTgk868qD1FCfS+TJXec7Q8BAoGACck95c7JhmM/BfNX1urB\nZrDNIqCnliW9IDjpeTmpeW6Nyx+QWf1PA5ofX2fLvYzNansjoR1M4BE0AXO613E1\nzY9tyj6I4FAXglqpE/e7afDnLuesO9c2OWiRkSrSkxve25q49sIQzwNpAoL3OBKd\nqnheKmpe6m9UZsZE2DpKHT0=\n-----END PRIVATE KEY-----`\n};\n/* harmony default export */ var src_config = (config_config);\n// CONCATENATED MODULE: ./src/components/icons/SlackLogo.jsx\nfunction SlackLogo_extends() { return SlackLogo_extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, SlackLogo_extends.apply(null, arguments); }\n\nconst SlackLogo = function (props) {\n  return /*#__PURE__*/react["createElement"]("svg", SlackLogo_extends({\n    xmlns: "http://www.w3.org/2000/svg",\n    width: 85,\n    height: 86,\n    fill: "none"\n  }, props), /*#__PURE__*/react["createElement"]("g", {\n    className: props.className,\n    clipPath: "url(#a)"\n  }, /*#__PURE__*/react["createElement"]("path", {\n    d: "M25.064 50.925a6.334 6.334 0 0 1-6.34 6.34 6.334 6.334 0 0 1-6.34-6.34 6.334 6.334 0 0 1 6.34-6.34h6.34v6.34Zm3.17 0a6.334 6.334 0 0 1 6.34-6.34 6.334 6.334 0 0 1 6.34 6.34v15.85a6.334 6.334 0 0 1-6.34 6.34 6.334 6.334 0 0 1-6.34-6.34v-15.85ZM34.575 25.468a6.334 6.334 0 0 1-6.34-6.34 6.334 6.334 0 0 1 6.34-6.34 6.334 6.334 0 0 1 6.34 6.34v6.34h-6.34Zm0 3.218a6.334 6.334 0 0 1 6.34 6.34 6.334 6.334 0 0 1-6.34 6.34H18.675a6.334 6.334 0 0 1-6.34-6.34 6.334 6.334 0 0 1 6.34-6.34h15.899ZM59.983 35.027a6.334 6.334 0 0 1 6.34-6.34 6.334 6.334 0 0 1 6.34 6.34 6.334 6.334 0 0 1-6.34 6.34h-6.34v-6.34Zm-3.17 0a6.334 6.334 0 0 1-6.34 6.34 6.334 6.334 0 0 1-6.34-6.34V19.128a6.334 6.334 0 0 1 6.34-6.34 6.334 6.334 0 0 1 6.34 6.34v15.899ZM50.473 60.435a6.334 6.334 0 0 1 6.34 6.34 6.334 6.334 0 0 1-6.34 6.34 6.334 6.334 0 0 1-6.34-6.34v-6.34h6.34Zm0-3.17a6.334 6.334 0 0 1-6.34-6.34 6.334 6.334 0 0 1 6.34-6.34h15.898a6.334 6.334 0 0 1 6.34 6.34 6.334 6.334 0 0 1-6.34 6.34H50.473Z"\n  })), /*#__PURE__*/react["createElement"]("defs", null, /*#__PURE__*/react["createElement"]("clipPath", {\n    id: "a"\n  }, /*#__PURE__*/react["createElement"]("path", {\n    className: props.className,\n    d: "M12 12.5h61v61H12z"\n  }))));\n};\n/* harmony default export */ var icons_SlackLogo = (SlackLogo);\n// CONCATENATED MODULE: ./src/utils/log.js\n\nconst log = function (...args) {\n  if (DEBUG) {\n    console.log(...args);\n  }\n};\nconst debug = function (...args) {\n  if (DEBUG) {\n    console.debug(...args);\n  }\n};\nconst warn = function (...args) {\n  if (DEBUG) {\n    console.warn(...args);\n  }\n};\nconst error = function (...args) {\n  if (DEBUG) {\n    console.error(...args);\n  }\n};\nconst info = function (...args) {\n  if (DEBUG) {\n    console.info(...args);\n  }\n};\n// EXTERNAL MODULE: ./node_modules/@torq-native/react-spectrum/Wait/index.js\nvar Wait = __webpack_require__(24);\nvar Wait_default = /*#__PURE__*/__webpack_require__.n(Wait);\n\n// EXTERNAL MODULE: ./node_modules/node-forge/lib/index.js\nvar lib = __webpack_require__(28);\nvar lib_default = /*#__PURE__*/__webpack_require__.n(lib);\n\n// CONCATENATED MODULE: ./src/utils/slackUtils.js\nfunction slackUtils_ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction slackUtils_objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? slackUtils_ownKeys(Object(t), !0).forEach(function (r) { slackUtils_defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : slackUtils_ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\nfunction slackUtils_defineProperty(e, r, t) { return (r = slackUtils_toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\nfunction slackUtils_toPropertyKey(t) { var i = slackUtils_toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }\nfunction slackUtils_toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }\n\n\n\nconst SLACK_USER_DATA = "slack_user_data";\nconst SLACK_CHANNEL_DATA = "slack_channel_data";\nconst SLACK_SCOPES = "slack_scopes";\nconst SLACK_ACCESS_TOKEN = "slack_access_token";\nconst SLACK_WORKSPACE_NAME = "slack_workspace_name";\nconst slackUtils_clearPluginData = function () {\n  window.localStorage.removeItem(SLACK_USER_DATA);\n  window.localStorage.removeItem(SLACK_CHANNEL_DATA);\n  window.localStorage.removeItem(SLACK_SCOPES);\n  storage.secureStorage.removeItem(SLACK_ACCESS_TOKEN);\n};\nconst GetUserScope = async function (token) {\n  // use axios\n  const response = await lib_axios.post("https://slack.com/api/auth.test", {}, {\n    headers: {\n      Authorization: `Bearer ${token}`,\n      "Content-Type": "application/json"\n    }\n  });\n  if (!response.data.ok) {\n    throw new Error(`Failed to fetch user scope: ${response.data.error}`);\n  }\n  let userScope = response.data.scope;\n  let scopes = response.headers ? response.headers.get("x-oauth-scopes") : undefined;\n  log(`User scope: ${userScope}`);\n  log(`Scopes: ${scopes}`);\n  return scopes;\n};\n\n// Helper function to fetch data with retry and pagination\nconst fetchDataWithRetry = async function (access_token, url, params, maxRetries, retryDelay, updateCb) {\n  let dataList = [];\n  let cursor = "";\n  let attempt = 0;\n  while (true) {\n    try {\n      const response = await lib_axios.get(url, {\n        headers: {\n          Authorization: `Bearer ${access_token}`\n        },\n        params: slackUtils_objectSpread(slackUtils_objectSpread({}, params), {}, {\n          cursor\n        })\n      });\n      const data = response.data;\n      if (!data.ok) {\n        throw new Error(`Failed to fetch data: ${data.error}`);\n      }\n      attempt = 0;\n      const newData = data.members || data.channels;\n      dataList = dataList.concat(newData);\n\n      // Update state incrementally\n      updateCb(dataList);\n      if (data.response_metadata && data.response_metadata.next_cursor) {\n        cursor = data.response_metadata.next_cursor;\n      } else {\n        break;\n      }\n    } catch (err) {\n      if (err.response && err.response.status === 429) {\n        // Rate limit error\n        const retryAfter = err.response.headers["retry-after"] || retryDelay / 1000; // Use retry-after header if available\n        error(`Rate limited. Retrying after ${retryAfter} seconds...`);\n        if (attempt < maxRetries) {\n          attempt++;\n          await new Promise(function (resolve) {\n            return setTimeout(resolve, retryAfter * 1000);\n          });\n        } else {\n          throw new Error("Max retries exceeded.");\n        }\n      } else {\n        // Other errors\n        throw err;\n      }\n    }\n  }\n  return dataList;\n};\n\n// Fetch users with retry logic\nconst FetchUsers = async function (access_token, setterCb, maxRetries = 3, retryDelay = 60000) {\n  const params = {\n    limit: 999999\n  };\n  const users = await fetchDataWithRetry(access_token, "https://slack.com/api/users.list", params, maxRetries, retryDelay, setterCb);\n  return users;\n};\nconst FetchWorkspaceName = async function (token) {\n  try {\n    let response = await lib_axios.get("https://slack.com/api/team.info", {\n      headers: {\n        Authorization: `Bearer ${token}`,\n        "Content-Type": "application/json"\n      }\n    });\n    if (response.data.ok) {\n      const workspaceName = response.data.team.name;\n      log(`Workspace name: ${workspaceName}`);\n      return workspaceName;\n    } else {\n      throw new Error(`Failed to fetch workspace name: ${response.data.error}`);\n    }\n  } catch (err) {\n    error("Error sending message:", err);\n  }\n};\n\n// Fetch channels with retry logic\nconst FetchChannels = async function (access_token, setterCb, maxRetries = 3, retryDelay = 60000) {\n  const params = {\n    limit: 999999,\n    types: "private_channel,public_channel",\n    exclude_archived: true\n  };\n  const channels = await fetchDataWithRetry(access_token, "https://slack.com/api/conversations.list", params, maxRetries, retryDelay, setterCb);\n  return channels;\n};\nconst SendMessageToUser = async function (token, userId, message) {\n  try {\n    await lib_axios.post("https://slack.com/api/chat.postMessage", {\n      channel: userId,\n      text: message\n    }, {\n      headers: {\n        Authorization: `Bearer ${token}`,\n        "Content-Type": "application/json"\n      }\n    });\n    log(`Message sent to user ${userId}`);\n  } catch (err) {\n    error("Error sending message:", err);\n  }\n};\nconst GetConversationForUsers = async function (token, idList) {\n  let conversationId;\n  try {\n    const response = await lib_axios.post("https://slack.com/api/conversations.open", {\n      users: idList\n    }, {\n      headers: {\n        Authorization: `Bearer ${token}`,\n        "Content-Type": "application/json"\n      }\n    });\n    if (!response.data.ok) {\n      throw new Error(`Failed to open conversation: ${response.data.error}`);\n    }\n    conversationId = response.data.channel.id;\n  } catch (err) {\n    error("Error opening conversation:", err);\n  }\n  return conversationId;\n};\nconst decryptData = async function (encryptedBase64, privateKey) {\n  try {\n    const encryptedBytes = lib_default.a.util.decode64(encryptedBase64);\n    const decrypted = privateKey.decrypt(encryptedBytes, \'RSA-OAEP\', {\n      md: lib_default.a.md.sha256.create(),\n      mgf1: {\n        md: lib_default.a.md.sha256.create()\n      }\n    });\n    log(\'Data decrypted successfully\');\n    return decrypted;\n  } catch (err) {\n    error(\'Error decrypting data:\', err);\n    throw err;\n  }\n};\n// CONCATENATED MODULE: ./src/components/SlackAuth.jsx\n\n\n\n\n\n\n\n\n\n\n\n\n\n/////// Styled Components ///////\nconst SlackAuth_sharePanelIngest = __webpack_require__(33);\nconst CenteredFlexContainer = styled_components_browser_esm["a" /* default */].div`\n  display: flex;\n  flex-direction: column;\n  justify-content: center;\n  height: 100%;\n  align-items: center;\n  padding: 10px;\n`;\nconst ColumnFlexContainer = styled_components_browser_esm["a" /* default */].div`\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  justify-content: center;\n  height: 100%;\n  padding: 60px;\n`;\nconst ButtonContainer = styled_components_browser_esm["a" /* default */].div`\n  display: flex;\n  justify-content: center; /* Centers children horizontally */\n  align-items: center; /* Centers children vertically */\n  padding: 15px; /* Adds padding around the container */\n`;\n\n/////// Styled Components ///////\n\nconst POLLING_INTERVAL_MS = 5000; // 5 seconds\nconst AUTH_TIMEOUT_MS = 300000; // 5 minutes\n\nconst SlackAuth_privateKey = lib_default.a.pki.privateKeyFromPem(src_config.SLACK_PRIVATE_KEY_PEM);\nconst AuthView = function (props) {\n  const [isAuthenticating, setIsAuthenticating] = Object(react["useState"])(false);\n  const [sessionId, setSessionId] = Object(react["useState"])(null);\n  const startTimeRef = Object(react["useRef"])(null);\n  const timeoutRef = Object(react["useRef"])(null);\n\n  // Function to check the authentication status by polling the server\n  const checkAuthStatus = async function () {\n    if (sessionId) {\n      // Initialize start time if not set\n      if (!startTimeRef.current) {\n        startTimeRef.current = Date.now();\n      }\n\n      // Check if timeout has elapsed\n      if (Date.now() - startTimeRef.current > AUTH_TIMEOUT_MS) {\n        handleAuthCancel(false);\n        logToIngest(SlackAuth_sharePanelIngest["slack_panel"], "signInError");\n        props.showToast("warning", localize(\'TOAST_SIGNIN_ERROR\'));\n        return;\n      }\n      if (timeoutRef.current) {\n        clearTimeout(timeoutRef.current);\n        timeoutRef.current = null;\n      }\n      try {\n        const response = await lib_axios.post(`${src_config.SERVER_URL}/slack/auth/status`, {\n          sessionId\n        });\n        const {\n          status,\n          data\n        } = response.data;\n        if (status === \'success\') {\n          const accessToken = await decryptData(data.userAccessToken, SlackAuth_privateKey);\n          const workspaceName = data.workspaceName;\n          window.localStorage.setItem(SLACK_WORKSPACE_NAME, workspaceName);\n          await external_uxp_["storage"].secureStorage.setItem(SLACK_ACCESS_TOKEN, accessToken);\n          logToIngest(SlackAuth_sharePanelIngest["slack_panel"], "signInSuccess");\n          setIsAuthenticating(false);\n          props.setAuthCompleted(true);\n          log("authSuccess " + accessToken);\n        } else if (status === \'cancelled\') {\n          // Authentication was cancelled\n          setIsAuthenticating(false);\n          logToIngest(SlackAuth_sharePanelIngest["slack_panel"], "signInError");\n          props.showToast("warning", localize(\'TOAST_SIGNIN_ERROR\'));\n        } else {\n          // Keep polling if status is still pending\n          timeoutRef.current = setTimeout(checkAuthStatus, POLLING_INTERVAL_MS);\n        }\n      } catch (err) {\n        setIsAuthenticating(false);\n        logToIngest(SlackAuth_sharePanelIngest["slack_panel"], "signInError");\n        error("Error checking authentication status", err);\n      }\n    }\n  };\n  Object(react["useEffect"])(function () {\n    if (sessionId) {\n      checkAuthStatus();\n    }\n  }, [sessionId]);\n\n  // Function to create a new session and start authentication\n  const handleAuthenticate = async function () {\n    log("Authentication begins");\n    logToIngest(SlackAuth_sharePanelIngest["slack_panel"], "signIn");\n    setIsAuthenticating(true);\n    startTimeRef.current = null;\n    try {\n      var _response$data;\n      const response = await lib_axios.post(`${src_config.SERVER_URL}/slack/auth/session`, {\n        userScope: props.scope\n      });\n      if (response !== null && response !== void 0 && (_response$data = response.data) !== null && _response$data !== void 0 && _response$data.sessionId) {\n        setSessionId(response.data.sessionId);\n        const redirectUrl = `${src_config.SERVER_URL}/slack/auth/start?sessionId=${response.data.sessionId}&locale=${getLocale()}`;\n        external_uxp_["shell"].openExternal(redirectUrl);\n      } else {\n        throw new Error("Session ID creation failed");\n      }\n    } catch (err) {\n      setIsAuthenticating(false);\n      logToIngest(SlackAuth_sharePanelIngest["slack_panel"], "signInError");\n      error("Failed to create session", err);\n    }\n  };\n  const handleAuthCancel = async function (userInitiated) {\n    try {\n      if (userInitiated) {\n        logToIngest(SlackAuth_sharePanelIngest["slack_panel"], "signInCancel");\n      }\n      // Clear the polling timeout\n      if (timeoutRef.current) {\n        clearTimeout(timeoutRef.current);\n        timeoutRef.current = null;\n      }\n      const response = await lib_axios.post(`${src_config.SERVER_URL}/slack/auth/cancel`, {\n        sessionId\n      });\n      if (response.status !== 200) {\n        error("Failed to cancel authentication on server");\n      }\n      setIsAuthenticating(false);\n    } catch (err) {\n      error("Error canceling authentication", err);\n      setIsAuthenticating(false);\n    }\n  };\n  return isAuthenticating ? /*#__PURE__*/react_default.a.createElement(CenteredFlexContainer, null, /*#__PURE__*/react_default.a.createElement(Wait_default.a, {\n    enable: isAuthenticating,\n    size: "L"\n  }), /*#__PURE__*/react_default.a.createElement("sp-body", {\n    size: "m",\n    style: {\n      margin: "10px",\n      marginTop: "20px"\n    }\n  }, localize(\'SIGNIN_LOADING\')), /*#__PURE__*/react_default.a.createElement("sp-button", {\n    variant: "secondary",\n    onClick: function () {\n      return handleAuthCancel(true);\n    }\n  }, localize(\'CANCEL\'))) : /*#__PURE__*/react_default.a.createElement(ColumnFlexContainer, null, /*#__PURE__*/react_default.a.createElement(icons_SlackLogo, {\n    className: "icon-style"\n  }), /*#__PURE__*/react_default.a.createElement("sp-heading", {\n    style: {\n      textAlign: "center"\n    }\n  }, localize(\'SIGNIN_HEADING\')), /*#__PURE__*/react_default.a.createElement("sp-label", {\n    style: {\n      whiteSpace: "normal",\n      padding: "5px",\n      textAlign: "center"\n    }\n  }, localize(\'SIGNIN_DESCRIPTION\')), /*#__PURE__*/react_default.a.createElement(ButtonContainer, null, /*#__PURE__*/react_default.a.createElement("sp-button", {\n    variant: "cta",\n    onClick: handleAuthenticate\n  }, localize(\'SIGNIN\'))));\n};\n// CONCATENATED MODULE: ./src/components/icons/User.jsx\nfunction User_extends() { return User_extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, User_extends.apply(null, arguments); }\n\nconst User = function (props) {\n  return /*#__PURE__*/react["createElement"]("svg", User_extends({\n    xmlns: "http://www.w3.org/2000/svg",\n    width: 18,\n    height: 18\n  }, props), /*#__PURE__*/react["createElement"]("title", null, "S User 18 N"), /*#__PURE__*/react["createElement"]("path", {\n    d: "M16.474 17a.496.496 0 0 0 .501-.492v-.034c-.331-3.592-4.014-4.816-5.14-4.914-.822-.072-.835-.734-.835-1.56a7.515 7.515 0 0 0 1.766-4.479C12.766 2.809 11.223 1 9 1S5.234 2.808 5.234 5.521A7.515 7.515 0 0 0 7 10c0 .826-.013 1.488-.837 1.56-1.125.1-4.809 1.321-5.139 4.913A.496.496 0 0 0 1.49 17l.034.001Z",\n    className: props.className\n  }));\n};\n/* harmony default export */ var icons_User = (User);\n// CONCATENATED MODULE: ./src/components/icons/ChannelPublic.jsx\nfunction ChannelPublic_extends() { return ChannelPublic_extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, ChannelPublic_extends.apply(null, arguments); }\n\nconst ChannelPublic = function (props) {\n  return /*#__PURE__*/react["createElement"]("svg", ChannelPublic_extends({\n    xmlns: "http://www.w3.org/2000/svg",\n    width: 12,\n    height: 15,\n    fill: "none"\n  }, props), /*#__PURE__*/react["createElement"]("path", {\n    className: props.className,\n    d: "M2.089 14.9c-.12 0-.162-.06-.127-.178L2.8 11H1.044c-.1 0-.153-.059-.153-.179V9.113c0-.085.05-.127.153-.127h2.168l.56-2.524H2.14a.112.112 0 0 1-.127-.127V4.627A.112.112 0 0 1 2.14 4.5h2.09l.74-3.392a.142.142 0 0 1 .154-.127h1.454c.085 0 .118.051.1.153L5.938 4.5h2.015l.74-3.417a.121.121 0 0 1 .127-.1h1.454c.1 0 .144.051.127.153l-.765 3.366H11.4c.102 0 .153.042.153.127v1.708a.112.112 0 0 1-.127.127H9.229l-.535 2.524h1.555c.102 0 .153.042.153.127v1.76c0 .085-.051.127-.153.127H8.286l-.842 3.749c-.034.1-.085.153-.153.153H5.863c-.136 0-.178-.051-.127-.153l.816-3.749H4.537l-.867 3.774c-.035.085-.086.127-.153.127L2.089 14.9Zm2.856-5.916H6.96l.56-2.524H5.48l-.535 2.524Z"\n  }));\n};\n/* harmony default export */ var icons_ChannelPublic = (ChannelPublic);\n// CONCATENATED MODULE: ./src/components/icons/ChannelPrivate.jsx\nfunction ChannelPrivate_extends() { return ChannelPrivate_extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, ChannelPrivate_extends.apply(null, arguments); }\n\nconst ChannelPrivate = function (props) {\n  return /*#__PURE__*/react["createElement"]("svg", ChannelPrivate_extends({\n    xmlns: "http://www.w3.org/2000/svg",\n    width: 18,\n    height: 18\n  }, props), /*#__PURE__*/react["createElement"]("title", null, "S LockClosed 18 N"), /*#__PURE__*/react["createElement"]("path", {\n    d: "M14.5 8H14V7A5 5 0 0 0 4 7v1h-.5a.5.5 0 0 0-.5.5v8a.5.5 0 0 0 .5.5h11a.5.5 0 0 0 .5-.5v-8a.5.5 0 0 0-.5-.5ZM6 7a3 3 0 0 1 6 0v1H6Zm4 6.111V14.5a.5.5 0 0 1-.5.5h-1a.5.5 0 0 1-.5-.5v-1.389a1.5 1.5 0 1 1 2 0Z",\n    className: props.className\n  }));\n};\n/* harmony default export */ var icons_ChannelPrivate = (ChannelPrivate);\n// CONCATENATED MODULE: ./src/components/icons/Cross.jsx\nfunction Cross_extends() { return Cross_extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, Cross_extends.apply(null, arguments); }\n\nconst Cross = function (props) {\n  return /*#__PURE__*/react["createElement"]("svg", Cross_extends({\n    xmlns: "http://www.w3.org/2000/svg",\n    width: "10",\n    height: "10",\n    viewBox: "0 0 10 10"\n  }, props), /*#__PURE__*/react["createElement"]("path", {\n    className: props.className,\n    d: "m6.29 5 2.922-2.923A.911.911 0 1 0 7.922.788L5 3.711 2.078.788a.912.912 0 0 0-1.29 1.29L3.712 5 .79 7.923a.912.912 0 0 0 1.289 1.289L5 6.289l2.923 2.923a.911.911 0 0 0 1.289-1.29Z"\n  }));\n};\n/* harmony default export */ var icons_Cross = (Cross);\n// CONCATENATED MODULE: ./src/components/TagInput.jsx\n\n\n\n\n\n\n\n\n\n\n\n/////// Styled Components ///////\n\nconst StyledList = styled_components_browser_esm["a" /* default */].ul`\n  position: absolute;\n  left: 0;\n  width: 100%;\n  max-height: 196px;\n  overflow-y: auto;\n  list-style-type: none;\n  z-index: 1;\n  background-color: var(--spectrum-alias-component-background-color);\n  padding: 10px;\n  border-color: var(--spectrum-alias-border-color);\n  border-style: solid;\n  border-width: thin;\n`;\nconst TagDiv = styled_components_browser_esm["a" /* default */].div`\n  padding-left: 5px;\n  background-color: var(--spectrum-alias-component-background-color);\n  border-color: var(--spectrum-alias-border-color);\n  border-style: solid;\n  border-radius: 4px;\n  border-width: thin;\n  display: flex;\n  align-items: center;\n  margin: 2px;\n`;\nconst TagContainer = styled_components_browser_esm["a" /* default */].div`\n  display: flex;\n  flex-wrap: wrap;\n  gap: 4px;\n`;\nconst TagInput_IconContainer = styled_components_browser_esm["a" /* default */].div`\n  fill: var(--spectrum-alias-component-text-color);\n  padding-right: 5px;\n`;\nconst ListItem = styled_components_browser_esm["a" /* default */].li`\n  padding: 2px;\n  cursor: pointer;\n\n  &:hover {\n    background-color: var(--spectrum-alias-component-background-color-hover);\n  }\n`;\nconst SpinnerDiv = styled_components_browser_esm["a" /* default */].div`\n  position: relative;\n  display: flex;\n  align-items: center;\n  flex-wrap: wrap;\n  width: 100%;\n`;\n\n/////// Styled Components ///////\n\n// Custom hook for debounce\nconst useDebounce = function (value, delay) {\n  const [debouncedValue, setDebouncedValue] = Object(react["useState"])(value);\n  Object(react["useEffect"])(function () {\n    const handler = setTimeout(function () {\n      setDebouncedValue(value);\n    }, delay);\n\n    // Cleanup function to clear the timeout if value changes\n    return function () {\n      clearTimeout(handler);\n    };\n  }, [value, delay]);\n  return debouncedValue;\n};\nconst TagInput = react_default.a.forwardRef(function (props, ref) {\n  const [inputValue, setInputValue] = Object(react["useState"])("");\n  const [suggestions, setSuggestions] = Object(react["useState"])([]);\n  const [isDropdownVisible, setIsDropdownVisible] = Object(react["useState"])(false);\n  const inputRef = Object(react["useRef"])(null);\n  const containerRef = Object(react["useRef"])(null);\n\n  // Expose clearInput method through ref\n  react_default.a.useImperativeHandle(ref, function () {\n    return {\n      clearInput: function () {\n        setInputValue("");\n        setSuggestions([]);\n        setIsDropdownVisible(false);\n        if (inputRef.current) {\n          inputRef.current.value = "";\n        }\n      }\n    };\n  });\n\n  // Debounce the input value with a delay of 300ms\n  const debouncedInputValue = useDebounce(inputValue, 300);\n  Object(react["useEffect"])(function () {\n    if ((debouncedInputValue === null || debouncedInputValue === void 0 ? void 0 : debouncedInputValue.length) > 0) {\n      let filteredSuggestions = [];\n      if (debouncedInputValue[0] === "@") {\n        const name = debouncedInputValue.slice(1);\n        filteredSuggestions = props.userList.filter(function (user) {\n          return user.name.toLowerCase().includes(name.toLowerCase()) || user.ldap && user.ldap.toLowerCase().includes(name.toLowerCase());\n        }).slice(0, 20);\n      } else if (debouncedInputValue[0] === "#") {\n        const name = debouncedInputValue.slice(1);\n        filteredSuggestions = props.channelList.filter(function (channel) {\n          return channel.name.toLowerCase().includes(name.toLowerCase());\n        }).slice(0, 20);\n      } else {\n        const combinedList = [...props.userList, ...props.channelList];\n        filteredSuggestions = combinedList.filter(function (item) {\n          return item.name.toLowerCase().includes(debouncedInputValue.toLowerCase()) || item.ldap && item.ldap.toLowerCase().includes(debouncedInputValue.toLowerCase());\n        }).slice(0, 20);\n      }\n\n      // Remove already added tags from suggestions\n      const tagIds = new Set(props.tags.map(function (tag) {\n        return tag.id;\n      }));\n      filteredSuggestions = filteredSuggestions.filter(function (item) {\n        return !tagIds.has(item.id);\n      });\n      setSuggestions(filteredSuggestions);\n      if (filteredSuggestions && filteredSuggestions.length > 0) {\n        setIsDropdownVisible(true);\n      } else {\n        setIsDropdownVisible(false);\n      }\n    } else {\n      setSuggestions([]);\n      setIsDropdownVisible(false);\n    }\n  }, [debouncedInputValue]);\n  Object(react["useEffect"])(function () {\n    // Function to handle clicks outside of the component\n    const handleClickOutside = function (event) {\n      if (containerRef.current && !containerRef.current.contains(event.target)) {\n        setIsDropdownVisible(false);\n      }\n    };\n    document.addEventListener("mousedown", handleClickOutside);\n    return function () {\n      document.removeEventListener("mousedown", handleClickOutside);\n    };\n  }, []);\n  Object(react["useEffect"])(function () {\n    // Hack: Textarea doesn\'t let anything render over it.\n    props.setTextAreaHidden(isDropdownVisible);\n  }, [isDropdownVisible]);\n  const handleInputChange = function (event) {\n    setInputValue(event.target.value);\n  };\n  const handleSuggestionClick = function (suggestion) {\n    var _props$parentDialogRe, _props$parentDialogRe2;\n    props.setTags(function (prevTags) {\n      return [...prevTags, suggestion];\n    });\n    setInputValue("");\n    setSuggestions([]);\n    setIsDropdownVisible(false);\n    // Focus on the parent dialog\n    (_props$parentDialogRe = props.parentDialogRef) === null || _props$parentDialogRe === void 0 ? void 0 : (_props$parentDialogRe2 = _props$parentDialogRe.current) === null || _props$parentDialogRe2 === void 0 ? void 0 : _props$parentDialogRe2.focus();\n  };\n  const handleTagRemove = function (tagToRemove) {\n    props.setTags(function (prevTags) {\n      return prevTags.filter(function (tag) {\n        return tag.id !== tagToRemove.id;\n      });\n    });\n  };\n  const handleFocus = function () {\n    setInputValue("");\n  };\n  const handleBlur = function () {\n    //setIsDropdownVisible(false); can\'t do it here as it will result into handleSuggestionClick not getting called.\n    // so added handleClickOutside to handle it.\n  };\n  const renderIcon = function (suggestion) {\n    if (suggestion.type === "user") {\n      return /*#__PURE__*/react_default.a.createElement(icons_User, {\n        className: "icon-style"\n      });\n    } else {\n      return suggestion.private ? /*#__PURE__*/react_default.a.createElement(icons_ChannelPrivate, {\n        className: "icon-style"\n      }) : /*#__PURE__*/react_default.a.createElement(icons_ChannelPublic, {\n        className: "icon-style"\n      });\n    }\n  };\n\n  //TODO: Add tags inside textfield\n  // see implementation in sharesheet I2E\n  // https://git.corp.adobe.com/CCX/ccx-sharing/blob/ab4d1e93f71f26a5344f469926a20ce4add0fa54/packages/component-react/src/components/InviteInput/InviteInput.tsx#L729\n\n  return /*#__PURE__*/react_default.a.createElement("div", {\n    style: {\n      position: "relative",\n      width: "100%",\n      paddingTop: 0\n    },\n    ref: containerRef\n  }, /*#__PURE__*/react_default.a.createElement("sp-label", {\n    for: "comment-m",\n    size: "m"\n  }, localize(\'DESTINATION_LABEL\')), /*#__PURE__*/react_default.a.createElement(SpinnerDiv, null, /*#__PURE__*/react_default.a.createElement("sp-textfield", {\n    ref: inputRef,\n    placeholder: inputValue.length && isMac ? "" : localize(\'DESTINATION_PLACEHOLDER\'),\n    style: {\n      width: "100%",\n      paddingRight: props.contactsLoaded ? "0px" : "30px"\n    },\n    onInput: handleInputChange,\n    onFocus: handleFocus,\n    onBlur: handleBlur,\n    value: inputValue\n  }), !props.contactsLoaded && /*#__PURE__*/react_default.a.createElement("div", {\n    style: {\n      position: "absolute",\n      right: "15px"\n    }\n  }, /*#__PURE__*/react_default.a.createElement(Wait_default.a, {\n    enable: !props.contactsLoaded,\n    size: "S",\n    centered: true\n  }))), isDropdownVisible && suggestions.length > 0 && /*#__PURE__*/react_default.a.createElement(StyledList, null, suggestions.map(function (suggestion) {\n    return /*#__PURE__*/react_default.a.createElement(ListItem, {\n      key: suggestion.id,\n      onClick: function () {\n        return handleSuggestionClick(suggestion);\n      }\n    }, /*#__PURE__*/react_default.a.createElement("div", {\n      style: {\n        display: "flex",\n        alignItems: "center",\n        padding: "5px"\n      }\n    }, /*#__PURE__*/react_default.a.createElement(TagInput_IconContainer, null, renderIcon(suggestion)), /*#__PURE__*/react_default.a.createElement("sp-body", {\n      size: "s",\n      style: {\n        paddingRight: "5px",\n        margin: "0px"\n      }\n    }, suggestion.name), suggestion.type === "user" && /*#__PURE__*/react_default.a.createElement("sp-body", {\n      size: "s",\n      style: {\n        color: "var(--spectrum-global-color-gray-600)",\n        margin: "0px"\n      }\n    }, suggestion.ldap)));\n  })), /*#__PURE__*/react_default.a.createElement(TagContainer, null, props.tags.map(function (tag) {\n    return /*#__PURE__*/react_default.a.createElement(TagDiv, {\n      key: tag.id\n    }, /*#__PURE__*/react_default.a.createElement("sp-body", {\n      size: "s",\n      style: {\n        paddingLeft: "10px",\n        margin: "0px"\n      }\n    }, tag.type === "user" ? tag.name : "#" + tag.name), /*#__PURE__*/react_default.a.createElement("sp-action-button", {\n      quiet: true,\n      onClick: function () {\n        return handleTagRemove(tag);\n      }\n    }, /*#__PURE__*/react_default.a.createElement(icons_Cross, {\n      className: "icon-style"\n    })));\n  })));\n});\n// EXTERNAL MODULE: external "fs"\nvar external_fs_ = __webpack_require__(94);\nvar external_fs_default = /*#__PURE__*/__webpack_require__.n(external_fs_);\n\n// CONCATENATED MODULE: ./src/components/icons/Close.jsx\nfunction Close_extends() { return Close_extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, Close_extends.apply(null, arguments); }\n\nconst Close = function (props) {\n  return /*#__PURE__*/react["createElement"]("svg", Close_extends({\n    xmlns: "http://www.w3.org/2000/svg",\n    width: 12,\n    height: 12\n  }, props), /*#__PURE__*/react["createElement"]("path", {\n    d: "m7.398 6 3.932-3.932A.989.989 0 1 0 9.932.67L6 4.602 2.068.67A.989.989 0 0 0 .67 2.068L4.602 6 .67 9.932a.989.989 0 1 0 1.398 1.398L6 7.398l3.932 3.932a.989.989 0 0 0 1.398-1.398Z"\n  }));\n};\n/* harmony default export */ var icons_Close = (Close);\n// CONCATENATED MODULE: ./src/components/icons/Offline.jsx\nfunction Offline_extends() { return Offline_extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, Offline_extends.apply(null, arguments); }\n\nconst Offline = function (props) {\n  return /*#__PURE__*/react["createElement"]("svg", Offline_extends({\n    xmlns: "http://www.w3.org/2000/svg",\n    width: 81,\n    height: 82,\n    fill: "none"\n  }, props), /*#__PURE__*/react["createElement"]("g", {\n    className: props.className,\n    fillRule: "evenodd",\n    clipPath: "url(#a)",\n    clipRule: "evenodd"\n  }, /*#__PURE__*/react["createElement"]("path", {\n    d: "M60.68 36.078a16.312 16.312 0 1 0 0 32.624 16.312 16.312 0 0 0 0-32.624Zm8.708 22.31a2.07 2.07 0 0 1-1.462 3.538 2.068 2.068 0 0 1-1.465-.614l-5.459-5.46-5.458 5.46a2.071 2.071 0 0 1-2.926.001 2.068 2.068 0 0 1 0-2.925l5.46-5.46-5.386-5.442a1.841 1.841 0 0 1-.69-1.324 2.265 2.265 0 0 1 2.154-2.21 2.08 2.08 0 0 1 1.463.608l5.384 5.442 5.384-5.442a2.08 2.08 0 0 1 1.463-.608 2.265 2.265 0 0 1 2.153 2.21 1.84 1.84 0 0 1-.69 1.324l-5.385 5.441 5.46 5.46Z"\n  }), /*#__PURE__*/react["createElement"]("path", {\n    d: "M62.299 32.058A20.254 20.254 0 0 0 43.91 63.5H8.365a8.821 8.821 0 0 1-8.37-9.25L0 54.172a10.355 10.355 0 0 1 9.207-9.588 10.834 10.834 0 0 1-.3-3.55 14.07 14.07 0 0 1 14.396-13.666c1.596.001 3.184.221 4.72.655A18.268 18.268 0 0 1 45.141 14.14a16.417 16.417 0 0 1 17.191 17.034c0 .297-.012.591-.033.884Z"\n  })), /*#__PURE__*/react["createElement"]("defs", null, /*#__PURE__*/react["createElement"]("clipPath", {\n    id: "a"\n  }, /*#__PURE__*/react["createElement"]("path", {\n    className: props.className,\n    d: "M0 .5h81v81H0z"\n  }))));\n};\n/* harmony default export */ var icons_Offline = (Offline);\n// CONCATENATED MODULE: ./src/components/icons/More.jsx\nfunction More_extends() { return More_extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, More_extends.apply(null, arguments); }\n\nconst More = function (props) {\n  return /*#__PURE__*/react["createElement"]("svg", More_extends({\n    xmlns: "http://www.w3.org/2000/svg",\n    width: 18,\n    height: 18\n  }, props), /*#__PURE__*/react["createElement"]("title", null, "S MoreSmallList 18 N"), /*#__PURE__*/react["createElement"]("circle", {\n    cx: 4.5,\n    cy: 9,\n    r: 1.425,\n    className: props.className\n  }), /*#__PURE__*/react["createElement"]("circle", {\n    cx: 9,\n    cy: 9,\n    r: 1.425,\n    className: props.className\n  }), /*#__PURE__*/react["createElement"]("circle", {\n    cx: 13.5,\n    cy: 9,\n    r: 1.425,\n    className: props.className\n  }));\n};\n/* harmony default export */ var icons_More = (More);\n// CONCATENATED MODULE: ./src/components/icons/Refresh.jsx\nfunction Refresh_extends() { return Refresh_extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, Refresh_extends.apply(null, arguments); }\n\nconst Refresh = function (props) {\n  return /*#__PURE__*/react["createElement"]("svg", Refresh_extends({\n    xmlns: "http://www.w3.org/2000/svg",\n    width: 16,\n    height: 16,\n    viewBox: "0 0 18 18"\n  }, props), /*#__PURE__*/react["createElement"]("title", null, "S Refresh 18 N"), /*#__PURE__*/react["createElement"]("path", {\n    d: "M16.337 10h-.947a.608.608 0 0 0-.581.469 5.723 5.723 0 0 1-9.559 2.537l-.346-.346 1.978-1.978A.392.392 0 0 0 7 10.4a.4.4 0 0 0-.377-.4H1.25a.25.25 0 0 0-.25.25v5.375a.4.4 0 0 0 .4.375.39.39 0 0 0 .28-.118l1.808-1.808.179.178a8.09 8.09 0 0 0 3.642 2.165 7.715 7.715 0 0 0 9.437-5.474q.048-.178.087-.358a.5.5 0 0 0-.496-.585ZM16.6 2a.39.39 0 0 0-.28.118l-1.81 1.808-.179-.176a8.09 8.09 0 0 0-3.642-2.166 7.715 7.715 0 0 0-9.436 5.477q-.047.176-.086.354A.5.5 0 0 0 1.663 8h.947a.608.608 0 0 0 .581-.469 5.723 5.723 0 0 1 9.559-2.537l.346.346-1.978 1.978A.392.392 0 0 0 11 7.6a.4.4 0 0 0 .377.4h5.373a.25.25 0 0 0 .25-.25V2.377A.4.4 0 0 0 16.6 2Z",\n    className: props.className\n  }));\n};\n/* harmony default export */ var icons_Refresh = (Refresh);\n// CONCATENATED MODULE: ./src/components/icons/Logout.jsx\nfunction Logout_extends() { return Logout_extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, Logout_extends.apply(null, arguments); }\n\nconst Logout = function (props) {\n  return /*#__PURE__*/react["createElement"]("svg", Logout_extends({\n    xmlns: "http://www.w3.org/2000/svg",\n    width: 16,\n    height: 16,\n    fill: "none"\n  }, props), /*#__PURE__*/react["createElement"]("g", {\n    fill: "#EBEBEB",\n    fillRule: "evenodd",\n    clipPath: "url(#a)",\n    clipRule: "evenodd"\n  }, /*#__PURE__*/react["createElement"]("path", {\n    d: "M11.11 11.556h-.888a.444.444 0 0 0-.444.444v1.333H2.666V2.667h7.112V4a.445.445 0 0 0 .444.444h.889A.445.445 0 0 0 11.555 4V1.333a.445.445 0 0 0-.444-.444H1.333a.444.444 0 0 0-.444.444v13.334a.445.445 0 0 0 .444.444h9.778a.445.445 0 0 0 .444-.444V12a.444.444 0 0 0-.444-.444Z",\n    className: props.className\n  }), /*#__PURE__*/react["createElement"]("path", {\n    d: "m15.936 7.844-2.9-3.309a.35.35 0 0 0-.37-.064.355.355 0 0 0-.221.327V7.11h-4.89a.444.444 0 0 0-.444.445v.888a.444.444 0 0 0 .445.445h4.889v2.31a.355.355 0 0 0 .354.357h.003a.35.35 0 0 0 .235-.09l2.9-3.31a.222.222 0 0 0 0-.312Z",\n    className: props.className\n  }), /*#__PURE__*/react["createElement"]("path", {\n    d: "M11.11 11.556h-.888a.444.444 0 0 0-.444.444v1.333H2.666V2.667h7.112V4a.445.445 0 0 0 .444.444h.889A.445.445 0 0 0 11.555 4V1.333a.445.445 0 0 0-.444-.444H1.333a.444.444 0 0 0-.444.444v13.334a.445.445 0 0 0 .444.444h9.778a.445.445 0 0 0 .444-.444V12a.444.444 0 0 0-.444-.444Z",\n    className: props.className\n  }), /*#__PURE__*/react["createElement"]("path", {\n    d: "m15.936 7.844-2.9-3.309a.35.35 0 0 0-.37-.064.355.355 0 0 0-.221.327V7.11h-4.89a.444.444 0 0 0-.444.445v.888a.444.444 0 0 0 .445.445h4.889v2.31a.355.355 0 0 0 .354.357h.003a.35.35 0 0 0 .235-.09l2.9-3.31a.222.222 0 0 0 0-.312Z",\n    className: props.className\n  })), /*#__PURE__*/react["createElement"]("defs", null, /*#__PURE__*/react["createElement"]("clipPath", {\n    id: "a"\n  }, /*#__PURE__*/react["createElement"]("path", {\n    fill: "#fff",\n    d: "M0 0h16v16H0z"\n  }))));\n};\n/* harmony default export */ var icons_Logout = (Logout);\n// CONCATENATED MODULE: ./src/components/SlackPanel.jsx\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst SlackPanel_sharePanelIngest = __webpack_require__(33);\n\n\n\n\n\n\n\n\n\n\n/////// Styled Components ///////\n\nconst SlackPanel_IconSlot = styled_components_browser_esm["a" /* default */].div`\n  fill: var(--spectrum-alias-component-text-color);\n`;\nconst SlackDialog = styled_components_browser_esm["a" /* default */].dialog`\n  z-index: 1;\n  position: absolute;\n  background-color: var(--uxp-host-background-color);\n  border-radius: 4px;\n  display: flex;\n  flex-direction: column;\n  max-height: 508px;\n`;\nconst SlackPanel_DialogDiv = styled_components_browser_esm["a" /* default */].div`\n  width: ${function (props) {\n  return props.width;\n}}px; /* Use props for width */\n  height: ${function (props) {\n  return props.height;\n}}px; /* Use props for height */\n  position: relative;\n`;\nconst SlackPanel_HeaderViewContainer = styled_components_browser_esm["a" /* default */].div`\n  display: flex;\n  flex-direction: column;\n  padding: 10px 0;\n`;\nconst SlackPanel_HeaderView = styled_components_browser_esm["a" /* default */].div`\n  display: flex;\n  flex-direction: row;\n  justify-content: space-between;\n  align-items: center;\n  width: 100%;\n  position: relative;\n`;\nconst SlackPanel_HeaderTextView = styled_components_browser_esm["a" /* default */].div`\n  display: flex;\n  align-items: center;\n  flex: 1;\n`;\nconst Footer = styled_components_browser_esm["a" /* default */].div`\n  display: flex;\n  justify-content: flex-end; /* Use \'flex-end\' instead of \'end\' */\n  align-items: flex-end; /* Use \'flex-end\' instead of \'end\' */\n  padding: 5px;\n`;\nconst SlackPanel_FormatView = styled_components_browser_esm["a" /* default */].div`\n  display: flex;\n  flex-direction: column;\n  width: 100%;\n`;\nconst CommentAreaView = styled_components_browser_esm["a" /* default */].div`\n  display: flex;\n  flex-direction: column;\n  width: 100%;\n`;\nconst CommentAreaContainer = styled_components_browser_esm["a" /* default */].div`\n  position: relative;\n  width: 100%;\n  height: 85px;\n  background: var(--spectrum-global-color-gray-50);\n`;\nconst SlackPanel_SlackPanelDiv = styled_components_browser_esm["a" /* default */].div`\n  display: flex;\n  flex-direction: column;\n  height: 100%;\n  padding: 15px;\n  position: absolute;\n  width: 100%;\n  top: 0;\n`;\nconst SlackPanel_SlackPanelInnerContainer = styled_components_browser_esm["a" /* default */].div`\n  overflow: auto;\n  display: flex;\n  flex-direction: column;\n  height: 100%;\n`;\nconst SlackPanel_SlackPanelInner = styled_components_browser_esm["a" /* default */].div`\n  flex: 1 1 0; /* Flex grow, shrink, and basis */\n  width: 100%;\n  height: 0px; /* This may be adjusted based on content */\n  overflow-y: auto; /* Enable vertical scrolling */\n  /* add padding to each child*/\n  & > * {\n    padding: 10px;\n  }\n`;\nconst PseudoCommentArea = styled_components_browser_esm["a" /* default */].div`\n  position: absolute;\n  width: 100%;\n  height: 85px;\n  border-style: solid;\n  border-width: thin;\n  border-color: var(--spectrum-global-color-gray-400);\n  color: var(--spectrum-alias-component-text-color);\n  padding: 4px 0 0 14px;\n  font-size: 12px;\n  overflow: hidden;\n  white-space: nowrap;\n  text-overflow: ellipsis;\n  visibility: ${function (props) {\n  return props.hidden ? "hidden" : "visible";\n}}; /* Control visibility through props */\n`;\nconst OfflineView = styled_components_browser_esm["a" /* default */].div`\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  justify-content: center;\n  height: 100%;\n  margin: 30px;\n`;\nconst LoadingContact = styled_components_browser_esm["a" /* default */].div`\n  display: flex;\n  flex-direction: column;\n  justify-content: center;\n  height: 100%;\n  align-items: center;\n  padding: 10px;\n`;\nconst SlackPanel_CenteredFlexContainer = styled_components_browser_esm["a" /* default */].div`\n  display: flex;\n  flex-direction: column;\n  justify-content: center;\n  height: 100%;\n  align-items: center;\n  padding: 10px;\n`;\n\n/////// Styled Components ///////\n\nconst USER_SCOPES = "channels:read,channels:write,groups:read,groups:write,users:read,chat:write,im:read,im:write,files:write,mpim:write,mpim:read,team:read";\nconst MESSAGE_MAX_LENGTH = 1000;\nconst SlackPanel = Object(react["forwardRef"])(function (props, ref) {\n  const [authCompleted, setAuthCompleted] = Object(react["useState"])(false);\n  const [accessToken, setAccessToken] = Object(react["useState"])(null);\n  const [userList, setUserList] = Object(react["useState"])([]);\n  const [channelList, setChannelList] = Object(react["useState"])([]);\n  const [sharingInProgress, setSharingInProgress] = Object(react["useState"])(false);\n  const [exportFormat, setExportFormat] = Object(react["useState"])(props.exportFormat);\n  const [tags, setTags] = Object(react["useState"])([]);\n  const [channelsLoaded, setChannelsLoaded] = Object(react["useState"])(false);\n  const [usersLoaded, setUsersLoaded] = Object(react["useState"])(false);\n  const [contactsLoaded, setContactsLoaded] = Object(react["useState"])(false);\n  const [initialContactsLoaded, setInitialContactsLoaded] = Object(react["useState"])(false);\n  const [message, setMessage] = Object(react["useState"])("");\n  const [textAreaHidden, setTextAreaHidden] = Object(react["useState"])(false);\n  const [toastVisible, setToastVisible] = Object(react["useState"])(false);\n  const [toastType, setToastType] = Object(react["useState"])("info");\n  const [toastMessage, setToastMessage] = Object(react["useState"])("");\n  const [userOnline, setUserOnline] = Object(react["useState"])(true);\n  const [workspaceName, setWorkspaceName] = Object(react["useState"])("");\n  const isCancelledRef = Object(react["useRef"])(false);\n  const dialogRef = Object(react["useRef"])(null);\n  const tagInputRef = Object(react["useRef"])(null);\n  const panelHost = window.sharePanelHost;\n  const textAreaRef = Object(react["useRef"])(null);\n  const clearInputs = Object(react["useCallback"])(function () {\n    setTags([]);\n    setMessage("");\n    if (textAreaRef.current) {\n      textAreaRef.current.value = "";\n    }\n    if (tagInputRef.current) {\n      tagInputRef.current.clearInput();\n    }\n  }, []);\n  const closeDialog = Object(react["useCallback"])(function () {\n    props.setSlackPanelActive(false);\n    const dialog = dialogRef === null || dialogRef === void 0 ? void 0 : dialogRef.current;\n    (dialog === null || dialog === void 0 ? void 0 : dialog.open) && (dialog === null || dialog === void 0 ? void 0 : dialog.close());\n    panelHost === null || panelHost === void 0 ? void 0 : panelHost.onPanelClose();\n  }, [dialogRef]);\n\n  // Expose it to SharePanelController\n  Object(react["useImperativeHandle"])(ref, function () {\n    return {\n      closeDialog\n    };\n  });\n  const showDialog = Object(react["useCallback"])(function () {\n    const dialog = dialogRef === null || dialogRef === void 0 ? void 0 : dialogRef.current;\n    if (userOnline && !navigator.onLine) {\n      logToIngest(SlackPanel_sharePanelIngest["slack_panel"], "slackShareError", undefined, undefined, "offline");\n    }\n    setUserOnline(navigator.onLine);\n    dialog.show({\n      anchorOffset: props.panelLocation,\n      isTransparent: true,\n      opacity: 1.0,\n      size: props.panelSize,\n      resize: "vertical",\n      overflow: "scroll"\n    });\n    dialog.addEventListener("load", function () {\n      dialog.focus();\n      dialog.hasLoaded = true;\n      panelHost === null || panelHost === void 0 ? void 0 : panelHost.onPanelOpen();\n    }, {\n      once: true\n    });\n    clearInputs();\n    props.setSlackPanelActive(true);\n\n    // temp\n    // showToast("success", "Slack panel opened");\n  }, [dialogRef, props]);\n  Object(react["useEffect"])(function () {\n    if (userList !== null && userList !== void 0 && userList.length && channelList !== null && channelList !== void 0 && channelList.length) {\n      setInitialContactsLoaded(true);\n    }\n  }, [userList, channelList]);\n  Object(react["useEffect"])(function () {\n    log(" contacts loaded:", usersLoaded && channelsLoaded);\n    setContactsLoaded(usersLoaded && channelsLoaded);\n  }, [usersLoaded, channelsLoaded]);\n  const fetchData = async function (access_token, force = false) {\n    log("Fetching data");\n    let user_data = window.localStorage.getItem(SLACK_USER_DATA);\n    let user_data_arr = user_data ? JSON.parse(user_data) : [];\n    if (!force && user_data_arr && user_data_arr.length > 0) {\n      setUserList(user_data_arr);\n      setUsersLoaded(true);\n    } else {\n      FetchUsers(access_token, setUserList).then(function (data) {\n        log(data);\n        setUsersLoaded(true);\n        window.localStorage.setItem(SLACK_USER_DATA, JSON.stringify(data));\n      }).catch(function (err) {\n        error("Error fetching users:", err);\n      });\n    }\n    let channel_data = window.localStorage.getItem(SLACK_CHANNEL_DATA);\n    let channel_data_arr = channel_data ? JSON.parse(channel_data) : [];\n    if (!force && channel_data_arr && channel_data_arr.length > 0) {\n      setChannelList(channel_data_arr);\n      setChannelsLoaded(true);\n    } else {\n      FetchChannels(access_token, setChannelList).then(function (data) {\n        log(data);\n        setChannelsLoaded(true);\n        window.localStorage.setItem(SLACK_CHANNEL_DATA, JSON.stringify(data));\n      }).catch(function (err) {\n        error("Error fetching channels:", err);\n      });\n    }\n    let workspace_name = window.localStorage.getItem(SLACK_WORKSPACE_NAME);\n    if (workspace_name) {\n      setWorkspaceName(workspace_name);\n    } else {\n      FetchWorkspaceName(access_token).then(function (name) {\n        setWorkspaceName(name);\n        window.localStorage.setItem(SLACK_WORKSPACE_NAME, name);\n      });\n    }\n  };\n  Object(react["useEffect"])(function () {\n    external_uxp_["storage"].secureStorage.getItem(SLACK_ACCESS_TOKEN).then(function (access_token_val) {\n      if (access_token_val) {\n        const access_token = String.fromCharCode.apply(null, access_token_val);\n        setAccessToken(access_token);\n      }\n    });\n  }, []);\n  Object(react["useEffect"])(function () {\n    if (props.exportFormat && props.exportFormat !== exportFormat) {\n      setExportFormat(props.exportFormat);\n    }\n  }, [props.exportFormat]);\n  const clearPluginData = function () {\n    log("clearing plugin data");\n    window.localStorage.removeItem(SLACK_USER_DATA);\n    window.localStorage.removeItem(SLACK_CHANNEL_DATA);\n    window.localStorage.removeItem(SLACK_SCOPES);\n    window.localStorage.removeItem(SLACK_WORKSPACE_NAME);\n    external_uxp_["storage"].secureStorage.removeItem(SLACK_ACCESS_TOKEN);\n    setUsersLoaded(false);\n    setChannelsLoaded(false);\n    setContactsLoaded(false);\n    setInitialContactsLoaded(false);\n    setUserList([]);\n    setChannelList([]);\n    setMessage("");\n    setTags([]);\n    setWorkspaceName("");\n  };\n  const hasScopeChanged = function () {\n    let storedScopes = window.localStorage.getItem(SLACK_SCOPES);\n    if (storedScopes && storedScopes != USER_SCOPES) {\n      // Re-auth if scopes have changed\n      clearPluginData();\n      return true;\n    }\n    return false;\n  };\n  Object(react["useEffect"])(function () {\n    if (props.visible) {\n      showDialog();\n    } else {\n      closeDialog();\n    }\n  }, [props.visible]);\n  Object(react["useEffect"])(function () {\n    if (accessToken && !hasScopeChanged()) {\n      setAuthCompleted(true);\n    }\n  }, [accessToken]);\n  Object(react["useEffect"])(function () {\n    if (authCompleted) {\n      external_uxp_["storage"].secureStorage.getItem(SLACK_ACCESS_TOKEN).then(function (val) {\n        const access_token = String.fromCharCode.apply(null, val);\n        setAccessToken(access_token);\n        log(access_token);\n        fetchData(access_token);\n        GetUserScope(access_token).then(function (scope) {\n          log("User scope:", scope);\n        });\n      });\n      window.localStorage.setItem(SLACK_SCOPES, USER_SCOPES);\n    }\n  }, [authCompleted]);\n  const handleGlobalMouseDown = function (event, coordinates) {\n    if (!props.visible) return;\n    if (!isInBoundary(coordinates, props.panelLocation) && props.buttonLocation && !isInBoundary(coordinates, props.buttonLocation)) {\n      closeDialog();\n    }\n  };\n  const handleKeyDown = function (event) {\n    if (event.key === ESCAPE_KEY) {\n      closeDialog();\n    } else if (event.key === ENTER_KEY) {\n      // ToDo : Handle this\n    }\n  };\n\n  // Attach new copy of handleGlobalMouseDown on every render\n  // as the handleGlobalMouseDown needs updated dialogLocation value\n  const dialogId = `SLACK-DIALOG-${Date.now()}`;\n  Object(react["useEffect"])(function () {\n    document.body.addEventListener(UXPEventTypes.KEYDOWN, handleKeyDown);\n    setDialogListener(OS_EVENTS.MOUSE_DOWN, dialogId, handleGlobalMouseDown);\n    return function () {\n      document.body.removeEventListener(UXPEventTypes.KEYDOWN, handleKeyDown);\n      removeDialogListeners(dialogId);\n    };\n  }, [dialogId]);\n  function showToast(type, msg) {\n    setToastType(type);\n    setToastMessage(msg);\n    setToastVisible(true);\n    setTimeout(function () {\n      setToastVisible(false);\n    }, 5000);\n  }\n  const truncateFileName = function (fileName) {\n    if (fileName.length > 20) {\n      return fileName.slice(0, 8) + \'...\' + fileName.slice(-6);\n    }\n    return fileName;\n  };\n  const handleFileShare = async function (exportFormat) {\n    if (tags !== null && tags !== void 0 && tags.length && accessToken) {\n      const doc = external_photoshop_["app"].activeDocument;\n      const title = doc.title;\n      const baseFileName = title && title.includes(".") ? title.split(".").slice(0, -1).join(".") : title || "Untitled";\n      const fileName = `${baseFileName}.${exportFormat}`;\n      const filePath = panelHost.getFilePathForSlackSharing(exportFormat, props.selectedSize);\n      const fileBuffer = await external_fs_default.a.readFile(filePath);\n      const formData = new FormData();\n      formData.append("file", fileBuffer, fileName);\n      const fileSize = fileBuffer.byteLength;\n      const processMessage = async function (id) {\n        // Step 1: Get Upload URL\n        const response = await lib_axios.post("https://slack.com/api/files.getUploadURLExternal", null, {\n          headers: {\n            Authorization: `Bearer ${accessToken}`,\n            "Content-Type": "application/json"\n          },\n          params: {\n            filename: fileName,\n            length: fileSize\n          }\n        });\n        if (isCancelledRef.current) {\n          isCancelledRef.current = false;\n          throw new Error("Sharing Cancelled");\n        }\n        const {\n          upload_url,\n          file_id\n        } = response.data;\n        if (!upload_url) {\n          throw new Error("Failed to get upload URL.");\n        }\n\n        // Step 2: Upload File\n        // We don\'t need to block the user while uploading the file. But should we?\n        const uploadResponse = await lib_axios.post(upload_url, formData, {\n          headers: {\n            Authorization: `Bearer ${accessToken}`,\n            "Content-Type": "multipart/form-data"\n          }\n        });\n        if (isCancelledRef.current) {\n          isCancelledRef.current = false;\n          throw new Error("Sharing Cancelled");\n        }\n        if (uploadResponse.status !== 200) {\n          throw new Error("Failed to upload file.");\n        }\n\n        // Step 3: Complete Upload\n        const completeResponse = await lib_axios.post("https://slack.com/api/files.completeUploadExternal", {\n          files: [{\n            id: file_id\n          }],\n          channel_id: id,\n          initial_comment: message\n        }, {\n          headers: {\n            "Content-Type": "application/json",\n            Authorization: `Bearer ${accessToken}`\n          }\n        });\n        if (!completeResponse.data.ok) {\n          throw new Error("Failed to complete upload.");\n        }\n      };\n      // send to multiple channels\n      let channels = tags.filter(function (tag) {\n        return tag.type == "channel";\n      });\n      let users = tags.filter(function (tag) {\n        return tag.type == "user";\n      });\n      logToIngest(SlackPanel_sharePanelIngest["slack_panel"], "destinationClick", undefined, (channels && channels.length || 0).toString(), (users && users.length || 0).toString());\n      await Promise.all(channels.map(function (channel) {\n        return processMessage(channel.id);\n      }));\n\n      // send to multiple/single users, create a group conversation\n      if ((users === null || users === void 0 ? void 0 : users.length) > 0) {\n        let idList = users.map(function (user) {\n          return user.id;\n        });\n        let conversationId = await GetConversationForUsers(accessToken, idList);\n        await processMessage(conversationId);\n        logToIngest(SlackPanel_sharePanelIngest["slack_panel"], "slackMessage", undefined, undefined, message.length ? "user message" : "default message");\n      }\n    }\n  };\n  const handleShare = async function () {\n    if (!navigator.onLine) {\n      logToIngest(SlackPanel_sharePanelIngest["slack_panel"], "slackShareError", undefined, undefined, "network error");\n      showToast("warning", localize(\'TOAST_NETWORK_ERROR\'));\n      return;\n    }\n    setSharingInProgress(true);\n    const title = external_photoshop_["app"].activeDocument.title;\n    const baseFileName = title && title.includes(".") ? title.split(".").slice(0, -1).join(".") : title || "Untitled";\n    const truncatedName = truncateFileName(baseFileName);\n    const fileName = `${truncatedName}.${exportFormat}`;\n    try {\n      if (external_photoshop_["app"].activeDocument) {\n        logToIngest(SlackPanel_sharePanelIngest["slack_panel"], "slackShareFileType", undefined, undefined, undefined, props.selectedSizeType === "small" ? "Small" : "Original", exportFormat.toUpperCase());\n      }\n      // local file share\n      await handleFileShare(exportFormat);\n      setSharingInProgress(false);\n      logToIngest(SlackPanel_sharePanelIngest["slack_panel"], "slackShareSuccess");\n      showToast("success", `${fileName} ${localize(\'TOAST_SHARE_SUCCESS\')}`);\n      clearInputs();\n    } catch (err) {\n      error("Error sharing:", err);\n      setSharingInProgress(false);\n      if (err.message !== "Sharing Cancelled") {\n        logToIngest(SlackPanel_sharePanelIngest["slack_panel"], "slackShareError", undefined, undefined, "generic share error");\n        showToast("warning", `${fileName} ${localize(\'TOAST_SHARE_ERROR\')}`);\n      }\n    }\n  };\n  const handleShareCancel = async function () {\n    isCancelledRef.current = true;\n    setSharingInProgress(false);\n  };\n  const getUserList = function () {\n    return [...userList.map(function (user) {\n      return {\n        id: user.id,\n        ldap: user.name,\n        name: user.real_name || user.name,\n        type: "user"\n      };\n    })];\n  };\n  const getChannelList = function () {\n    return [...channelList.map(function (channel) {\n      return {\n        id: channel.id,\n        name: channel.name,\n        type: "channel",\n        private: channel.is_private\n      };\n    })];\n  };\n  const handleMessageChange = function (evt) {\n    setMessage(evt.target.value);\n  };\n\n  // TODO: combine sync and logout into more dropdown\n  const handleMore = function () {};\n  const handleSync = async function () {\n    if (!authCompleted || !contactsLoaded || !userOnline) return;\n    setUsersLoaded(false);\n    setChannelsLoaded(false);\n    setContactsLoaded(false);\n    fetchData(accessToken, true);\n  };\n  const handleLogOut = async function () {\n    if (!authCompleted) return;\n    clearPluginData();\n    setAuthCompleted(false);\n  };\n  const handleBack = async function () {\n    closeDialog();\n    props.openLocalSharePanel();\n  };\n  const getClassName = function (name, isRefresh = false) {\n    let disabled = !authCompleted;\n    if (isRefresh) {\n      disabled |= !contactsLoaded || !userOnline;\n    }\n    return disabled ? name + "-disabled" : name;\n  };\n  const headerView = /*#__PURE__*/react_default.a.createElement(SlackPanel_HeaderViewContainer, null, /*#__PURE__*/react_default.a.createElement(SlackPanel_HeaderView, null, /*#__PURE__*/react_default.a.createElement("sp-action-button", {\n    size: "s",\n    quiet: true,\n    onClick: handleBack\n  }, /*#__PURE__*/react_default.a.createElement(SlackPanel_IconSlot, null, /*#__PURE__*/react_default.a.createElement(icons_BackIcon, {\n    className: "icon-style"\n  }))), /*#__PURE__*/react_default.a.createElement(SlackPanel_HeaderTextView, null, /*#__PURE__*/react_default.a.createElement("sp-heading", {\n    size: "s",\n    style: {\n      margin: 0\n    }\n  }, localize(\'SLACK_PANEL_HEADING\'))), /*#__PURE__*/react_default.a.createElement("div", null, /*#__PURE__*/react_default.a.createElement("sp-action-button", {\n    size: "s",\n    quiet: true,\n    onClick: handleLogOut,\n    title: localize(\'LOGOUT\')\n  }, /*#__PURE__*/react_default.a.createElement(SlackPanel_IconSlot, null, /*#__PURE__*/react_default.a.createElement(icons_Logout, {\n    className: getClassName("icon-style")\n  }))), /*#__PURE__*/react_default.a.createElement("sp-action-button", {\n    size: "s",\n    quiet: true,\n    onClick: handleSync,\n    title: localize(\'REFRESH_CONTACTS\')\n  }, /*#__PURE__*/react_default.a.createElement(SlackPanel_IconSlot, null, /*#__PURE__*/react_default.a.createElement(icons_Refresh, {\n    className: getClassName("icon-style", true)\n  }))), /*#__PURE__*/react_default.a.createElement("sp-action-button", {\n    size: "s",\n    quiet: true,\n    onClick: closeDialog\n  }, /*#__PURE__*/react_default.a.createElement(SlackPanel_IconSlot, null, /*#__PURE__*/react_default.a.createElement(icons_Close, {\n    className: "icon-style"\n  }))))), /*#__PURE__*/react_default.a.createElement("sp-label", {\n    style: {\n      marginLeft: \'32px\'\n    }\n  }, workspaceName));\n\n  // Issue: Hide actual textarea and render the pseudo comment area whe tags dropdown is active\n  // Otherwise, the text box will appear on top of dropdown\n  const commentView = /*#__PURE__*/react_default.a.createElement(CommentAreaView, null, /*#__PURE__*/react_default.a.createElement("sp-label", {\n    for: "comment-m",\n    size: "m"\n  }, /*#__PURE__*/react_default.a.createElement("span", null, localize(\'MESSAGE_LABEL\')), message.length >= MESSAGE_MAX_LENGTH - 10 && /*#__PURE__*/react_default.a.createElement("span", {\n    className: "error-style",\n    style: {\n      paddingLeft: "6px"\n    }\n  }, `${localize(\'CHARACTERS_REMAINING\')}: ${MESSAGE_MAX_LENGTH - message.length}`)), /*#__PURE__*/react_default.a.createElement(CommentAreaContainer, null, /*#__PURE__*/react_default.a.createElement("sp-textarea", {\n    ref: textAreaRef,\n    id: "comment-m",\n    placeholder: localize(\'MESSAGE_PLACEHOLDER\'),\n    style: {\n      position: "absolute",\n      width: "100%",\n      height: "85px",\n      visibility: textAreaHidden ? "hidden" : "visible"\n    },\n    maxLength: MESSAGE_MAX_LENGTH,\n    onInput: handleMessageChange,\n    value: message,\n    onKeyDown: function (e) {\n      // Prevent spacebar or other keys from bubbling to parent dialog\n      if (e.key === " " || e.key === "Spacebar") {\n        e.stopPropagation();\n      }\n    }\n  }), /*#__PURE__*/react_default.a.createElement(PseudoCommentArea, {\n    hidden: !textAreaHidden\n  }, message)));\n  const footerView = /*#__PURE__*/react_default.a.createElement(Footer, null, /*#__PURE__*/react_default.a.createElement("sp-button", {\n    variant: "cta",\n    onClick: handleShare,\n    disabled: !sharingInProgress && tags.length ? undefined : "disabled"\n  }, localize(\'SHARE\')));\n  const offlineView = /*#__PURE__*/react_default.a.createElement(OfflineView, null, /*#__PURE__*/react_default.a.createElement(icons_Offline, {\n    className: "icon-style"\n  }), /*#__PURE__*/react_default.a.createElement("sp-heading", null, localize(\'OFFLINE_TITLE\')), /*#__PURE__*/react_default.a.createElement("sp-label", {\n    style: {\n      whiteSpace: "normal",\n      padding: "5px",\n      textAlign: "center"\n    }\n  }, localize(\'OFFLINE_DESCRIPTION\')));\n  const sharingView = /*#__PURE__*/react_default.a.createElement(SlackPanel_CenteredFlexContainer, null, /*#__PURE__*/react_default.a.createElement(Wait_default.a, {\n    enable: sharingInProgress,\n    size: "L"\n  }), /*#__PURE__*/react_default.a.createElement("sp-body", {\n    size: "m",\n    style: {\n      margin: "10px",\n      marginTop: "20px"\n    }\n  }, localize(\'SENDING_TITLE\')), /*#__PURE__*/react_default.a.createElement("sp-button", {\n    variant: "secondary",\n    onClick: handleShareCancel\n  }, localize(\'CANCEL\')));\n  const toast = /*#__PURE__*/react_default.a.createElement(Toast, {\n    toastType: toastType,\n    message: toastMessage,\n    setToastVisible: setToastVisible\n  });\n  const handleLoadingCancel = function () {\n    // User has already been authenticated so no need to go back to login page\n    setInitialContactsLoaded(true);\n  };\n  const loadingContacts = /*#__PURE__*/react_default.a.createElement(LoadingContact, null, /*#__PURE__*/react_default.a.createElement(Wait_default.a, {\n    enable: !initialContactsLoaded,\n    size: "L"\n  }), /*#__PURE__*/react_default.a.createElement("sp-body", {\n    size: "m",\n    style: {\n      margin: "10px",\n      marginTop: "20px"\n    }\n  }, localize(\'LOADING_CONTACTS_TITLE\')), /*#__PURE__*/react_default.a.createElement("sp-button", {\n    variant: "secondary",\n    onClick: handleLoadingCancel\n  }, localize(\'CANCEL\')));\n  const renderDialogContent = function () {\n    if (!userOnline) {\n      return offlineView;\n    }\n    if (!authCompleted) {\n      return /*#__PURE__*/react_default.a.createElement(AuthView, {\n        setAuthCompleted: setAuthCompleted,\n        scope: USER_SCOPES,\n        showToast: showToast\n      });\n    }\n    if (!initialContactsLoaded) {\n      return loadingContacts;\n    }\n    if (sharingInProgress) {\n      return sharingView;\n    }\n    return /*#__PURE__*/react_default.a.createElement(SlackPanel_SlackPanelInnerContainer, null, /*#__PURE__*/react_default.a.createElement(SlackPanel_SlackPanelInner, null, /*#__PURE__*/react_default.a.createElement(TagInput, {\n      ref: tagInputRef,\n      channelList: getChannelList(),\n      userList: getUserList(),\n      tags: tags,\n      setTags: setTags,\n      setTextAreaHidden: setTextAreaHidden,\n      contactsLoaded: contactsLoaded,\n      parentDialogRef: dialogRef\n    }), commentView, /*#__PURE__*/react_default.a.createElement("sp-label", {\n      style: {\n        paddingTop: 0\n      }\n    }, localize(\'FORMAT_DESCRIPTION_START\'), " ", exportFormat.toUpperCase(), " ", exportFormat !== \'psd\' && props.selectedSize ? ` ${props.selectedSize[0]} x ${props.selectedSize[1]} px.` : ` ${localize(\'SHARING_DESCRIPTION_SUFFIX\')}.`)), footerView);\n  };\n  return /*#__PURE__*/react_default.a.createElement("div", {\n    className: props.themeClass\n  }, /*#__PURE__*/react_default.a.createElement("dialog", {\n    id: "slack-dialog",\n    className: !isMac ? "dialog-border" : "",\n    ref: dialogRef\n  }, /*#__PURE__*/react_default.a.createElement(SlackPanel_DialogDiv, {\n    width: props.panelSize.width,\n    height: props.panelSize.height\n  }, /*#__PURE__*/react_default.a.createElement(SlackPanel_SlackPanelDiv, null, headerView, renderDialogContent()), toastVisible && toast)));\n});\n// CONCATENATED MODULE: ./src/components/LocalSharePanel.jsx\nfunction LocalSharePanel_extends() { return LocalSharePanel_extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, LocalSharePanel_extends.apply(null, arguments); }\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/////// Styled Components ///////\nconst LocalSharePanel_sharePanelIngest = __webpack_require__(33);\nconst LocalSharePanel_IconSlot = styled_components_browser_esm["a" /* default */].div`\n  fill: var(--spectrum-alias-component-text-color);\n`;\nconst LocalSharePanel_DialogDiv = styled_components_browser_esm["a" /* default */].div`\n  width: ${function (props) {\n  return props.width;\n}}px; /* Use props for width */\n  height: ${function (props) {\n  return props.height;\n}}px; /* Use props for height */\n  position: relative;\n`;\nconst LocalSharePanel_HeaderViewContainer = styled_components_browser_esm["a" /* default */].div`\n  display: flex;\n  flex-direction: column;\n  padding: 10px 0 0 0;\n`;\nconst LocalSharePanel_HeaderView = styled_components_browser_esm["a" /* default */].div`\n  display: flex;\n  flex-direction: row;\n  justify-content: space-between;\n  align-items: center;\n`;\nconst LocalSharePanel_HeaderTextView = styled_components_browser_esm["a" /* default */].div`\n  display: flex;\n  align-items: center;\n`;\nconst LocalSharePanelDiv = styled_components_browser_esm["a" /* default */].div`\n  display: flex;\n  flex-direction: column;\n  height: 100%;\n  padding: 15px;\n  position: absolute;\n  width: 100%;\n  top: 0;\n`;\nconst MenuItemsDiv = styled_components_browser_esm["a" /* default */].div`\n  overflow-y: auto;\n`;\n\n/////// Styled Components ///////\n\nconst MAX_SLACK_PANEL_HEIGHT = 508;\nconst MAX_SLACK_PANEL_WIDTH = 423;\nconst LocalSharePanel = Object(react["forwardRef"])(function (props, ref) {\n  var _props$servicesList, _props$servicesList2;\n  const [hasLSPenderedOnce, setLSPHasRenderedOnce] = Object(react["useState"])(false);\n  const [exportFormat, setExportFormat] = Object(react["useState"])("jpg");\n  const [settingsPanelActive, setSettingsPanelActive] = Object(react["useState"])(false);\n  const [selectedSizeType, setSelectedSizeType] = Object(react["useState"])("original");\n  const [originalDocumentSize, setOriginalDocumentSize] = Object(react["useState"])(null);\n  const panelHost = window.sharePanelHost;\n  const dialogRef = Object(react["useRef"])(null);\n\n  // Function to fetch document dimensions\n  const fetchDocumentDimensions = function () {\n    try {\n      if (external_photoshop_["app"] && external_photoshop_["app"].activeDocument) {\n        const doc = external_photoshop_["app"].activeDocument;\n        const width = doc.width;\n        const height = doc.height;\n        const resolution = doc.resolution;\n        setOriginalDocumentSize({\n          width,\n          height,\n          resolution\n        });\n        return {\n          width,\n          height,\n          resolution\n        };\n      }\n    } catch (error) {\n      console.error("Error fetching document dimensions:", error);\n    }\n    return null;\n  };\n\n  // Fetch document dimensions on component mount\n  Object(react["useEffect"])(function () {\n    fetchDocumentDimensions();\n  }, []);\n\n  // Refresh document dimensions when panel becomes visible\n  Object(react["useEffect"])(function () {\n    if (props.visible) {\n      fetchDocumentDimensions();\n    }\n  }, [props.visible]);\n  const closeDialog = Object(react["useCallback"])(function () {\n    props.setLocalSharingPanelActive(false);\n    const dialog = dialogRef === null || dialogRef === void 0 ? void 0 : dialogRef.current;\n    (dialog === null || dialog === void 0 ? void 0 : dialog.open) && (dialog === null || dialog === void 0 ? void 0 : dialog.close());\n    panelHost === null || panelHost === void 0 ? void 0 : panelHost.onPanelClose();\n  }, [dialogRef]);\n  const showDialog = Object(react["useCallback"])(function () {\n    const dialog = dialogRef === null || dialogRef === void 0 ? void 0 : dialogRef.current;\n    dialog.show({\n      anchorOffset: props.panelLocation,\n      isTransparent: true,\n      opacity: 1.0,\n      size: props.panelSize,\n      resize: "vertical",\n      overflow: "scroll"\n    });\n    dialog.addEventListener("load", function () {\n      dialog.focus();\n      dialog.hasLoaded = true;\n      panelHost === null || panelHost === void 0 ? void 0 : panelHost.onPanelOpen();\n    }, {\n      once: true\n    });\n    props.setLocalSharingPanelActive(true);\n  }, [dialogRef, props]);\n\n  // Expose it to SharePanelController\n  Object(react["useImperativeHandle"])(ref, function () {\n    return {\n      closeDialog\n    };\n  });\n  const handleBack = function () {\n    closeDialog();\n    props.openSharePanel();\n  };\n  const openLocalSharePanel = function () {\n    props.setLocalSharingPanelActive(true);\n  };\n  const showSettingsPanel = async function (show) {\n    try {\n      let panelSize = {\n        height: 255,\n        width: 290\n      };\n      let {\n        dialogCoordinates\n      } = await props.getRenderCoordinate(panelSize);\n      react_dom_default.a.render(/*#__PURE__*/react_default.a.createElement(SettingsPanel, {\n        ref: props.settingsPanelRef,\n        visible: show,\n        panelLocation: dialogCoordinates,\n        panelSize: panelSize,\n        setSettingsPanelActive: setSettingsPanelActive,\n        parentDialogRef: dialogRef,\n        buttonLocation: props.buttonLocation,\n        themeClass: props.themeClass,\n        openLocalSharePanel: openLocalSharePanel,\n        exportFormat: exportFormat,\n        setExportFormat: setExportFormat,\n        selectedSizeType: selectedSizeType,\n        setSelectedSizeType: setSelectedSizeType,\n        originalDocumentSize: originalDocumentSize\n      }), document.getElementById("root_settings"));\n    } catch (e) {\n      console.log(e);\n    }\n  };\n  const openSettings = function () {\n    closeDialog();\n    setSettingsPanelActive(true);\n  };\n  Object(react["useEffect"])(function () {\n    if (settingsPanelActive || hasLSPenderedOnce) {\n      showSettingsPanel(settingsPanelActive);\n      setLSPHasRenderedOnce(true);\n      if (settingsPanelActive) {\n        closeDialog();\n      }\n    }\n  }, [settingsPanelActive, selectedSizeType, originalDocumentSize]);\n  const selectedSize = Object(react["useMemo"])(function () {\n    const width = (originalDocumentSize === null || originalDocumentSize === void 0 ? void 0 : originalDocumentSize.width) || 0;\n    const height = (originalDocumentSize === null || originalDocumentSize === void 0 ? void 0 : originalDocumentSize.height) || 0;\n    return [selectedSizeType === "small" ? Math.round(width * 0.5) : width, selectedSizeType === "small" ? Math.round(height * 0.5) : height];\n  }, [selectedSizeType, originalDocumentSize]);\n  const showSlackPanel = async function (show) {\n    let panelSize = {\n      height: MAX_SLACK_PANEL_HEIGHT,\n      width: MAX_SLACK_PANEL_WIDTH\n    };\n    let {\n      dialogCoordinates\n    } = await props.getRenderCoordinate(panelSize);\n    react_dom_default.a.render(/*#__PURE__*/react_default.a.createElement(SlackPanel, {\n      ref: props.slackPanelRef,\n      visible: show,\n      panelLocation: dialogCoordinates,\n      panelSize: panelSize,\n      setSlackPanelActive: props.setSlackPanelActive,\n      parentDialogRef: dialogRef,\n      buttonLocation: props.buttonLocation,\n      themeClass: props.themeClass,\n      openSharePanel: props.openSharePanel,\n      exportFormat: exportFormat,\n      selectedSize: selectedSize,\n      selectedSizeType: selectedSizeType,\n      openLocalSharePanel: openLocalSharePanel\n    }), document.getElementById("root_slack"));\n  };\n  Object(react["useEffect"])(function () {\n    if (props.slackPanelActive || hasLSPenderedOnce) {\n      showSlackPanel(props.slackPanelActive);\n      setLSPHasRenderedOnce(true);\n      if (props.slackPanelActive) {\n        closeDialog();\n      }\n    }\n  }, [props.slackPanelActive]);\n  Object(react["useEffect"])(function () {\n    if (props.visible) {\n      showDialog();\n    } else {\n      closeDialog();\n    }\n  }, [props.visible]);\n  const handleMenuChange = async function (val) {\n    if (val == MENU_ACTION.SLACK) {\n      closeDialog();\n      props.setSlackPanelActive(true);\n      logToIngest(LocalSharePanel_sharePanelIngest["slack_panel"], "click");\n    } else {\n      panelHost === null || panelHost === void 0 ? void 0 : panelHost.onLocalShare(val, exportFormat, selectedSize, selectedSizeType);\n      if (val === SERVICE_CODE.CLIPBAORD) {\n        butler.showToast(localize(\'COPY_TO_CLIPBOARD_SUCCESS\'), {\n          type: "success"\n        });\n        closeDialog();\n      } else if (val == SERVICE_CODE.LIGHTROOM_CLASSIC || val == SERVICE_CODE.LIGHTROOM_DESKTOP) {\n        closeDialog();\n      } else {\n        logToIngest(LocalSharePanel_sharePanelIngest["local_sharing"], "otherApps");\n        isWindows && closeDialog();\n      }\n    }\n  };\n  const handleGlobalMouseDown = function (event, coordinates) {\n    if (!props.visible) return;\n    if (!isInBoundary(coordinates, props.panelLocation) && props.buttonLocation && !isInBoundary(coordinates, props.buttonLocation)) {\n      closeDialog();\n    }\n  };\n  const handleKeyDown = function (event) {\n    if (event.key === ESCAPE_KEY) {\n      closeDialog();\n    } else if (event.key === ENTER_KEY) {\n      // ToDo : Handle this\n    }\n  };\n\n  // Attach new copy of handleGlobalMouseDown on every render\n  // as the handleGlobalMouseDown needs updated dialogLocation value\n  const dialogId = `LOCAL-SHARE-DIALOG-${Date.now()}`;\n  Object(react["useEffect"])(function () {\n    document.body.addEventListener(UXPEventTypes.KEYDOWN, handleKeyDown);\n    setDialogListener(OS_EVENTS.MOUSE_DOWN, dialogId, handleGlobalMouseDown);\n    return function () {\n      document.body.removeEventListener(UXPEventTypes.KEYDOWN, handleKeyDown);\n      removeDialogListeners(dialogId);\n    };\n  }, [dialogId]);\n  let isLightroomDesktopAvailable = ((_props$servicesList = props.servicesList) === null || _props$servicesList === void 0 ? void 0 : _props$servicesList.includes(SERVICE_CODE.LIGHTROOM_DESKTOP)) ?? false;\n  let isLightroomClassicAvailable = ((_props$servicesList2 = props.servicesList) === null || _props$servicesList2 === void 0 ? void 0 : _props$servicesList2.includes(SERVICE_CODE.LIGHTROOM_CLASSIC)) ?? false;\n  const headerView = /*#__PURE__*/react_default.a.createElement(LocalSharePanel_HeaderViewContainer, null, /*#__PURE__*/react_default.a.createElement(LocalSharePanel_HeaderView, null, /*#__PURE__*/react_default.a.createElement("div", {\n    className: "menu-container"\n  }, /*#__PURE__*/react_default.a.createElement(LocalSharePanel_HeaderTextView, null, /*#__PURE__*/react_default.a.createElement("sp-action-button", {\n    size: "s",\n    quiet: true,\n    onClick: handleBack\n  }, /*#__PURE__*/react_default.a.createElement(LocalSharePanel_IconSlot, null, /*#__PURE__*/react_default.a.createElement(icons_BackIcon, {\n    className: "icon-style"\n  }))), /*#__PURE__*/react_default.a.createElement("sp-heading", {\n    size: "s",\n    style: {\n      margin: 0\n    }\n  }, localize(\'SEND_TO_APPS_TITLE\'))), /*#__PURE__*/react_default.a.createElement("sp-action-button", {\n    size: "s",\n    quiet: true,\n    onClick: openSettings\n  }, /*#__PURE__*/react_default.a.createElement(LocalSharePanel_IconSlot, null, /*#__PURE__*/react_default.a.createElement(icons_GearIcon, {\n    className: "icon-style"\n  }))))), /*#__PURE__*/react_default.a.createElement("div", {\n    className: "container"\n  }, /*#__PURE__*/react_default.a.createElement("sp-label", null, localize(\'SHARING_DESCRIPTION_PREFIX\'), " ", exportFormat.toUpperCase(), exportFormat !== \'psd\' && selectedSize ? ` ${selectedSize[0]} x ${selectedSize[1]} px` : ` ${localize(\'SHARING_DESCRIPTION_SUFFIX\')}`)));\n  return /*#__PURE__*/react_default.a.createElement("div", {\n    className: props.themeClass\n  }, /*#__PURE__*/react_default.a.createElement("dialog", {\n    id: "local-share-dialog",\n    className: !isMac ? "dialog-border" : "",\n    ref: dialogRef\n  }, /*#__PURE__*/react_default.a.createElement(LocalSharePanel_DialogDiv, {\n    width: props.panelSize.width,\n    height: props.panelSize.height\n  }, /*#__PURE__*/react_default.a.createElement(LocalSharePanelDiv, null, headerView, /*#__PURE__*/react_default.a.createElement("sp-menu-item", LocalSharePanel_extends({\n    "data-menu": COPY_TO_CLIPBOARD,\n    onClick: function () {\n      if (exportFormat !== \'psd\') {\n        handleMenuChange(SERVICE_CODE.CLIPBAORD);\n      }\n    },\n    title: exportFormat === \'psd\' ? localize(\'COPY_TO_CLIPBOARD_TOOLTIP\') : null\n  }, exportFormat === \'psd\' ? {\n    disabled: true\n  } : {}), /*#__PURE__*/react_default.a.createElement(LocalShareItem, {\n    disabled: exportFormat === \'psd\',\n    titleStr: localize(\'COPY_TO_CLIPBOARD_TITLE\'),\n    leftIcon: icons_Clipboard\n  })), (!isLightroomClassicAvailable || isLightroomDesktopAvailable) && /*#__PURE__*/react_default.a.createElement("sp-menu-item", {\n    "data-menu": LIGHTROOM_DESKTOP_DATA_MENU,\n    onClick: function () {\n      handleMenuChange(SERVICE_CODE.LIGHTROOM_DESKTOP);\n    }\n  }, /*#__PURE__*/react_default.a.createElement(LocalShareItem, {\n    disabled: false,\n    titleStr: LIGHTROOM_DESKTOP_TITLE,\n    leftIcon: icons_LightroomDesktopIcon\n  })), isLightroomClassicAvailable && /*#__PURE__*/react_default.a.createElement("sp-menu-item", {\n    "data-menu": LIGHTROOM_CLASSIC_DATA_MENU,\n    onClick: function () {\n      handleMenuChange(SERVICE_CODE.LIGHTROOM_CLASSIC);\n    }\n  }, /*#__PURE__*/react_default.a.createElement(LocalShareItem, {\n    disabled: false,\n    titleStr: LIGHTROOM_CLASSIC_TITLE,\n    leftIcon: icons_LightroomClassicIcon\n  })), /*#__PURE__*/react_default.a.createElement("sp-menu-item", {\n    "data-menu": SHARE_VIA_SLACK,\n    onClick: function () {\n      handleMenuChange(MENU_ACTION.SLACK);\n    }\n  }, /*#__PURE__*/react_default.a.createElement(LocalShareItem, {\n    disabled: false,\n    titleStr: "Slack",\n    leftIcon: icons_SlackIcon\n  })), /*#__PURE__*/react_default.a.createElement("sp-menu-item", {\n    "data-menu": OTHER_APPS,\n    onClick: function () {\n      handleMenuChange(SERVICE_CODE.OTHER_APPS);\n    }\n  }, /*#__PURE__*/react_default.a.createElement(LocalShareItem, {\n    disabled: false,\n    titleStr: localize(\'OTHER_APPS_TITLE\'),\n    leftIcon: icons_OtherApps\n  }))))));\n});\n// CONCATENATED MODULE: ./src/components/SharePanel.jsx\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst MAX_LOCAL_SHARE_PANEL_HEIGHT = 322;\nconst MAX_LOCAL_SHARE_PANEL_WIDTH = 290;\nconst SINGLE_OPTION_HEIGHT = 44;\nconst SharePanel_HeaderViewContainer = styled_components_browser_esm["a" /* default */].div`\n  display: flex;\n  flex-direction: column;\n  padding: 10px 0 10px 10px;\n`;\nconst SharePanel_HeaderView = styled_components_browser_esm["a" /* default */].div`\n  display: flex;\n  flex-direction: row;\n  justify-content: space-between;\n  align-items: center;\n`;\nconst SharePanel_HeaderTextView = styled_components_browser_esm["a" /* default */].div`\n  display: flex;\n  align-items: center;\n  margin-left:10px;\n`;\nconst SharePanel_SharePanel = Object(react["forwardRef"])(function (props, ref) {\n  const [theme, setTheme] = Object(react["useState"])("dark");\n  const [isReviewDisabled, setIsReviewDisabled] = Object(react["useState"])(false);\n  const [slackPanelActive, setSlackPanelActive] = Object(react["useState"])(false);\n  const [localSharingPanelActive, setLocalSharingPanelActive] = Object(react["useState"])(false);\n  const [hasSPRenderedOnce, setSPHasRenderedOnce] = Object(react["useState"])(false);\n  const [toastVisible, setToastVisible] = Object(react["useState"])(false);\n  const [toastType, setToastType] = Object(react["useState"])("info");\n  const [toastMessage, setToastMessage] = Object(react["useState"])("");\n  const panelHost = window.sharePanelHost;\n  const slackPanelRef = Object(react["useRef"])(null);\n  const localSharePanelRef = Object(react["useRef"])(null);\n  const settingsPanelRef = Object(react["useRef"])(null);\n  Object(react["useImperativeHandle"])(ref, function () {\n    return {\n      localSharePanelRef: localSharePanelRef,\n      slackPanelRef: slackPanelRef,\n      settingsPanelRef: settingsPanelRef\n    };\n  });\n  const dialogRef = Object(react["useRef"])(null);\n  const updateTheme = async function () {\n    if (!external_uxp_["host"]) return;\n    const newTheme = await external_uxp_["host"].getTheme();\n    setTheme(newTheme);\n  };\n  const showLocalSharingPanel = async function (show) {\n    let servicesList = panelHost === null || panelHost === void 0 ? void 0 : panelHost.getServices();\n    let isLightroomDesktopAvailable = (servicesList === null || servicesList === void 0 ? void 0 : servicesList.includes(SERVICE_CODE.LIGHTROOM_DESKTOP)) ?? false;\n    let isLightroomClassicAvailable = (servicesList === null || servicesList === void 0 ? void 0 : servicesList.includes(SERVICE_CODE.LIGHTROOM_CLASSIC)) ?? false;\n    let height = isLightroomDesktopAvailable && isLightroomClassicAvailable ? MAX_LOCAL_SHARE_PANEL_HEIGHT : MAX_LOCAL_SHARE_PANEL_HEIGHT - SINGLE_OPTION_HEIGHT;\n    let panelSize = {\n      height: height,\n      width: MAX_LOCAL_SHARE_PANEL_WIDTH\n    };\n    let {\n      dialogCoordinates\n    } = await getRenderCoordinate(panelSize);\n    react_dom_default.a.render(/*#__PURE__*/react_default.a.createElement(LocalSharePanel, {\n      ref: localSharePanelRef,\n      settingsPanelRef: settingsPanelRef,\n      slackPanelRef: slackPanelRef,\n      visible: show,\n      panelLocation: dialogCoordinates,\n      panelSize: panelSize,\n      setLocalSharingPanelActive: setLocalSharingPanelActive,\n      slackPanelActive: slackPanelActive,\n      setSlackPanelActive: setSlackPanelActive,\n      parentDialogRef: dialogRef,\n      buttonLocation: props.buttonLocation,\n      themeClass: getSpectrumClass(),\n      openSharePanel: openSharePanel,\n      showtoast: showToast,\n      getRenderCoordinate: getRenderCoordinate,\n      servicesList: servicesList\n    }), document.getElementById("root_local_share"));\n  };\n  Object(react["useEffect"])(function () {\n    if (localSharingPanelActive || hasSPRenderedOnce) {\n      showLocalSharingPanel(localSharingPanelActive);\n      setSPHasRenderedOnce(true);\n      if (localSharingPanelActive) {\n        closeDialog();\n      }\n    }\n  }, [localSharingPanelActive]);\n  const openSharePanel = function () {\n    props.setVisibility(true);\n  };\n  const closeDialog = Object(react["useCallback"])(function () {\n    props.setVisibility(false);\n    const dialog = dialogRef === null || dialogRef === void 0 ? void 0 : dialogRef.current;\n    (dialog === null || dialog === void 0 ? void 0 : dialog.hasLoaded) && (dialog === null || dialog === void 0 ? void 0 : dialog.close());\n    panelHost === null || panelHost === void 0 ? void 0 : panelHost.onPanelClose();\n  }, [dialogRef]);\n  const showDialog = Object(react["useCallback"])(function () {\n    const dialog = dialogRef === null || dialogRef === void 0 ? void 0 : dialogRef.current;\n    dialog.show({\n      anchorOffset: props.dialogLocation,\n      isTransparent: true,\n      opacity: 1.0,\n      resize: "none",\n      size: PS_DIALOG_SIZE\n    });\n    dialog.addEventListener("load", function () {\n      dialog.focus();\n      dialog.hasLoaded = true;\n      panelHost === null || panelHost === void 0 ? void 0 : panelHost.onPanelOpen();\n    }, {\n      once: true\n    });\n    props.setVisibility(true);\n  }, [dialogRef, props]);\n  Object(react["useEffect"])(function () {\n    props.visible ? showDialog() : closeDialog();\n    setIsReviewDisabled(props.isReviewDisabled);\n    if (props.visible) {\n      setLocalSharingPanelActive(false);\n    }\n  }, [props.visible]);\n\n  // If mouse click happens outside of the SharePanel boundary, close the dialog.\n  const handleGlobalMouseDown = function (event, coordinates) {\n    if (!props.visible) return;\n    if (!isInBoundary(coordinates, props.dialogLocation) && props.buttonLocation && !isInBoundary(coordinates, props.buttonLocation)) {\n      closeDialog();\n    }\n  };\n  const handleKeyDown = function (event) {\n    if (event.key === ESCAPE_KEY) {\n      closeDialog();\n    } else if (event.key === ENTER_KEY) {\n      let targetElementDataMenuAttribute = event.target.getAttribute("data-menu");\n      if (targetElementDataMenuAttribute && (targetElementDataMenuAttribute === INVITE_TO_EDIT_MENU || targetElementDataMenuAttribute === SHARE_FOR_REVIEW_MENU || targetElementDataMenuAttribute === ANIMATE_IN_FIREFLY)) event.target.click();\n    }\n  };\n\n  // Called only the first time panel is shown\n  Object(react["useEffect"])(function () {\n    updateTheme();\n    if (external_uxp_["host"] && external_uxp_["host"].addEventListener) {\n      external_uxp_["host"].addEventListener(UXPEventTypes.THEME, updateTheme);\n    }\n    psAction.addNotificationListener(GLOBAL_EVENTS, emit);\n    psCore.addNotificationListener("OS", ["globalMouseDown"], emit);\n  }, []);\n\n  // Attach new copy of handleGlobalMouseDown on every render\n  // as the handleGlobalMouseDown needs updated dialogLocation value\n  const dialogId = `DIALOG-${Date.now()}`;\n  Object(react["useEffect"])(function () {\n    document.body.addEventListener(UXPEventTypes.KEYDOWN, handleKeyDown);\n    setDialogListener(OS_EVENTS.MOUSE_DOWN, dialogId, handleGlobalMouseDown);\n    return function () {\n      document.body.removeEventListener(UXPEventTypes.KEYDOWN, handleKeyDown);\n      removeDialogListeners(dialogId);\n    };\n  }, [dialogId]);\n\n  // We are using spectrum colors for texts\n  const getSpectrumClass = function () {\n    if (theme === "darkest") {\n      return "spectrum spectrum--darkest";\n    } else if (theme === "dark") {\n      return "spectrum spectrum--dark";\n    } else if (theme === "light") {\n      return "spectrum spectrum--light";\n    } else if (theme === "lightest") {\n      return "spectrum spectrum--lightest";\n    }\n  };\n  function showToast(type, msg) {\n    setToastType(type);\n    setToastMessage(msg);\n    setToastVisible(true);\n    setTimeout(function () {\n      setToastVisible(false);\n    }, 5000);\n  }\n  const toast = /*#__PURE__*/react_default.a.createElement(Toast, {\n    toastType: toastType,\n    message: toastMessage,\n    setToastVisible: setToastVisible\n  });\n  const headerView = /*#__PURE__*/react_default.a.createElement(SharePanel_HeaderViewContainer, null, /*#__PURE__*/react_default.a.createElement(SharePanel_HeaderView, null, /*#__PURE__*/react_default.a.createElement(SharePanel_HeaderTextView, null, /*#__PURE__*/react_default.a.createElement("sp-heading", {\n    size: "s",\n    style: {\n      margin: 0\n    }\n  }, "Share"))));\n  return /*#__PURE__*/react_default.a.createElement("div", {\n    className: getSpectrumClass()\n  }, /*#__PURE__*/react_default.a.createElement("dialog", {\n    id: "ps-dialog",\n    className: !isMac ? "dialog-border" : "",\n    ref: dialogRef\n  }, headerView, toastVisible && toast, /*#__PURE__*/react_default.a.createElement(ShareMenu, {\n    visible: props.visible,\n    isReviewDisabled: isReviewDisabled,\n    isAnimateInFireflyEnabled: props.isAnimateInFireflyEnabled,\n    closeDialog: closeDialog,\n    setSlackPanelActive: setSlackPanelActive,\n    isSlackPanelActive: slackPanelActive,\n    setLocalSharingPanelActive: setLocalSharingPanelActive,\n    isLocalSharingPanelActive: localSharingPanelActive,\n    showToast: showToast\n  })));\n});\n// CONCATENATED MODULE: ./src/controllers/SharePanelController.jsx\nfunction SharePanelController_defineProperty(e, r, t) { return (r = SharePanelController_toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\nfunction SharePanelController_toPropertyKey(t) { var i = SharePanelController_toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }\nfunction SharePanelController_toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }\n\n\n\n\n\nconst DEFAULT_DIALOG_COORDINATES = {\n  bottom: 400,\n  left: 1192,\n  right: 100,\n  top: 80\n};\nclass SharePanelController_SharePanelController {\n  constructor() {\n    var _this = this;\n    SharePanelController_defineProperty(this, "setVisibility", function (visible) {\n      if (_this.visible != visible) {\n        _this.visible = visible;\n        _this.render();\n      }\n    });\n    this.visible = false;\n    this.dialogLocation = DEFAULT_DIALOG_COORDINATES;\n    this.buttonLocation = DEFAULT_DIALOG_COORDINATES;\n    this.isReviewDisabled = false;\n    this.isAnimateInFireflyEnabled = false;\n    this.childRef = Object(react["createRef"])();\n  }\n  render() {\n    react_dom_default.a.render(/*#__PURE__*/react_default.a.createElement(SharePanel_SharePanel, {\n      ref: this.childRef,\n      visible: this.visible,\n      dialogLocation: this.dialogLocation,\n      buttonLocation: this.buttonLocation,\n      setVisibility: this.setVisibility,\n      isReviewDisabled: this.isReviewDisabled,\n      isAnimateInFireflyEnabled: this.isAnimateInFireflyEnabled\n    }), document.getElementById("root"));\n  }\n  async showPanel(prop) {\n    var _this$childRef, _this$childRef$curren, _this$childRef$curren2, _this$childRef2, _this$childRef2$curre, _this$childRef2$curre2;\n    if (prop && prop.data) {\n      let data = JSON.parse(prop.data);\n      this.isReviewDisabled = data.isReviewDisabled;\n    }\n\n    // Get feature flag status before showing panel\n    try {\n      this.isAnimateInFireflyEnabled = await getFeatureFlagStatus(FEATURE_FLAGS.FEATURE_FLAGS_ANIMATE_IN_FIREFLY);\n    } catch (error) {\n      console.warn(\'Failed to get feature flag status:\', error);\n      this.isAnimateInFireflyEnabled = false;\n    }\n    const {\n      dialogCoordinates,\n      ctaButtonCoordinates\n    } = await getRenderCoordinate();\n    this.dialogLocation = dialogCoordinates;\n    this.buttonLocation = ctaButtonCoordinates;\n    this.setVisibility(true);\n    // Handling : Send to Apps Panel dismisses when opening share menu from Share button but settings panel remains active.\n    if ((_this$childRef = this.childRef) !== null && _this$childRef !== void 0 && (_this$childRef$curren = _this$childRef.current) !== null && _this$childRef$curren !== void 0 && (_this$childRef$curren2 = _this$childRef$curren.settingsPanelRef) !== null && _this$childRef$curren2 !== void 0 && _this$childRef$curren2.current) {\n      this.childRef.current.settingsPanelRef.current.closeDialog();\n    }\n    if ((_this$childRef2 = this.childRef) !== null && _this$childRef2 !== void 0 && (_this$childRef2$curre = _this$childRef2.current) !== null && _this$childRef2$curre !== void 0 && (_this$childRef2$curre2 = _this$childRef2$curre.slackPanelRef) !== null && _this$childRef2$curre2 !== void 0 && _this$childRef2$curre2.current) {\n      this.childRef.current.slackPanelRef.current.closeDialog();\n    }\n  }\n  closePanel() {\n    var _this$childRef3, _this$childRef3$curre, _this$childRef3$curre2, _this$childRef4, _this$childRef4$curre, _this$childRef5, _this$childRef5$curre;\n    this.setVisibility(false);\n    if ((_this$childRef3 = this.childRef) !== null && _this$childRef3 !== void 0 && (_this$childRef3$curre = _this$childRef3.current) !== null && _this$childRef3$curre !== void 0 && (_this$childRef3$curre2 = _this$childRef3$curre.settingsPanelRef) !== null && _this$childRef3$curre2 !== void 0 && _this$childRef3$curre2.current) {\n      this.childRef.current.settingsPanelRef.current.closeDialog();\n    }\n    if ((_this$childRef4 = this.childRef) !== null && _this$childRef4 !== void 0 && (_this$childRef4$curre = _this$childRef4.current.slackPanelRef) !== null && _this$childRef4$curre !== void 0 && _this$childRef4$curre.current) {\n      this.childRef.current.slackPanelRef.current.closeDialog();\n    }\n    if ((_this$childRef5 = this.childRef) !== null && _this$childRef5 !== void 0 && (_this$childRef5$curre = _this$childRef5.current.localSharePanelRef) !== null && _this$childRef5$curre !== void 0 && _this$childRef5$curre.current) {\n      this.childRef.current.localSharePanelRef.current.closeDialog();\n    }\n  }\n}\n// CONCATENATED MODULE: ./src/index.jsx\n // to fix styled components disappearing in production\n\n\n\n\n\n\n\n\n\n\nconst sharePanelController = new SharePanelController_SharePanelController();\nexternal_uxp_["entrypoints"].setup({\n  plugin: {\n    create(plugin) {\n      /* optional */\n    },\n    destroy() {\n      /* optional */\n    }\n  },\n  commands: {\n    openSharePanel: function (prop) {\n      return sharePanelController.showPanel(prop);\n    },\n    closeSharePanel: function (prop) {\n      return sharePanelController.closePanel(prop);\n    }\n  }\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjQ3LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vc3JjL2NvbXBvbmVudHMvTWVudUl0ZW0uanN4P2JhNmMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2NvbXBvbmVudHMvaWNvbnMvSW52aXRlLmpzeD9kZTM1Iiwid2VicGFjazovLy8uL3NyYy9jb21wb25lbnRzL2ljb25zL0NoYXQuanN4P2QyZWYiLCJ3ZWJwYWNrOi8vLy4vc3JjL2NvbXBvbmVudHMvaWNvbnMvU2xhY2suanN4P2E3ZDgiLCJ3ZWJwYWNrOi8vLy4vc3JjL2NvbXBvbmVudHMvaWNvbnMvVGVhbXMuanN4PzVhZDIiLCJ3ZWJwYWNrOi8vLy4vc3JjL2NvbXBvbmVudHMvaWNvbnMvU2VuZFRvQXBwcy5qc3g/NzJkMyIsIndlYnBhY2s6Ly8vLi9zcmMvY29tcG9uZW50cy9pY29ucy9RdWlja0V4cG9ydC5qc3g/NGEwMyIsIndlYnBhY2s6Ly8vLi9zcmMvY29tcG9uZW50cy9pY29ucy9BbmltYXRlSW5GaXJlZmx5LmpzeD9mMzE1Iiwid2VicGFjazovLy8uL3NyYy91dGlscy9jb21tb25VdGlscy5qcz82ODA1Iiwid2VicGFjazovLy8uL3NyYy91dGlscy9ubHMuanM/Y2QyMyIsIndlYnBhY2s6Ly8vLi9zcmMvY29tcG9uZW50cy9pY29ucy9Gb3J3YXJkQXJyb3cuanN4P2M1ZDIiLCJ3ZWJwYWNrOi8vLy4vc3JjL2hvc3QvcGhvdG9zaG9wLmpzPzRhNDciLCJ3ZWJwYWNrOi8vLy4vc3JjL2NvbXBvbmVudHMvU2hhcmVNZW51LmpzeD81OWViIiwid2VicGFjazovLy8uL3NyYy9jb21wb25lbnRzL0xvY2FsU2hhcmVJdGVtLmpzeD9lNDg2Iiwid2VicGFjazovLy8uL3NyYy9jb21wb25lbnRzL2ljb25zL0JhY2tJY29uLmpzeD83OTQwIiwid2VicGFjazovLy8uL3NyYy9jb21wb25lbnRzL1NldHRpbmdzLmpzeD9iOWViIiwid2VicGFjazovLy8uL3NyYy91dGlscy9sb2NhbFNoYXJlVXRpbHMuanM/NTlkNiIsIndlYnBhY2s6Ly8vLi9zcmMvY29tcG9uZW50cy9pY29ucy9Ub2FzdEljb25zLmpzeD9mODU4Iiwid2VicGFjazovLy8uL3NyYy9jb21wb25lbnRzL1RvYXN0LmpzeD83NmZmIiwid2VicGFjazovLy8uL3NyYy9jb21wb25lbnRzL2ljb25zL0dlYXJJY29uLmpzeD8xNjYwIiwid2VicGFjazovLy8uL3NyYy9jb21wb25lbnRzL2ljb25zL0NsaXBib2FyZC5qc3g/NDk4ZSIsIndlYnBhY2s6Ly8vLi9zcmMvYXNzZXRzL2ljb25zL0ljb25fU2xhY2sucG5nPzdkM2EiLCJ3ZWJwYWNrOi8vLy4vc3JjL2NvbXBvbmVudHMvaWNvbnMvU2xhY2tJY29uLmpzeD82YzNhIiwid2VicGFjazovLy8uL3NyYy9hc3NldHMvaWNvbnMvSWNvbl9MaWdodHJvb21EZXNrdG9wLnBuZz82Y2Y5Iiwid2VicGFjazovLy8uL3NyYy9jb21wb25lbnRzL2ljb25zL0xpZ2h0cm9vbURlc2t0b3BJY29uLmpzeD8wMzUyIiwid2VicGFjazovLy8uL3NyYy9hc3NldHMvaWNvbnMvSWNvbl9MaWdodHJvb21DbGFzc2ljLnBuZz9jZmJhIiwid2VicGFjazovLy8uL3NyYy9jb21wb25lbnRzL2ljb25zL0xpZ2h0cm9vbUNsYXNzaWNJY29uLmpzeD8xMTY1Iiwid2VicGFjazovLy8uL3NyYy9jb21wb25lbnRzL2ljb25zL090aGVyQXBwcy5qc3g/MDQyOSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvQXhpb3NVUkxTZWFyY2hQYXJhbXMuanM/YjkyMiIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvYnVpbGRVUkwuanM/MzBiNSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvSW50ZXJjZXB0b3JNYW5hZ2VyLmpzP2Y2YjQiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9kZWZhdWx0cy90cmFuc2l0aW9uYWwuanM/Y2FmYSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL3BsYXRmb3JtL2Jyb3dzZXIvY2xhc3Nlcy9VUkxTZWFyY2hQYXJhbXMuanM/MmFmNiIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL3BsYXRmb3JtL2Jyb3dzZXIvY2xhc3Nlcy9Gb3JtRGF0YS5qcz84MzI0Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvcGxhdGZvcm0vYnJvd3Nlci9jbGFzc2VzL0Jsb2IuanM/ZDIxNSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL3BsYXRmb3JtL2Jyb3dzZXIvaW5kZXguanM/ZjNiZCIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL3BsYXRmb3JtL2NvbW1vbi91dGlscy5qcz9jZTY3Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvcGxhdGZvcm0vaW5kZXguanM/NGVkNCIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvdG9VUkxFbmNvZGVkRm9ybS5qcz9lNDBjIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9mb3JtRGF0YVRvSlNPTi5qcz8wN2Y0Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvZGVmYXVsdHMvaW5kZXguanM/NGMzZCIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvcGFyc2VIZWFkZXJzLmpzP2MzNDUiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9jb3JlL0F4aW9zSGVhZGVycy5qcz9lZGQ1Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvY29yZS90cmFuc2Zvcm1EYXRhLmpzP2M0MDEiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9jYW5jZWwvaXNDYW5jZWwuanM/MmU2NyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NhbmNlbC9DYW5jZWxlZEVycm9yLmpzP2ZiNjAiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9jb3JlL3NldHRsZS5qcz80NjdmIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9wYXJzZVByb3RvY29sLmpzP2I2OGEiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL3NwZWVkb21ldGVyLmpzPzY3YmYiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL3Rocm90dGxlLmpzPzdmNWEiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL3Byb2dyZXNzRXZlbnRSZWR1Y2VyLmpzPzQ1NDciLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL2lzVVJMU2FtZU9yaWdpbi5qcz8zOTM0Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9jb29raWVzLmpzPzdhYWMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL2lzQWJzb2x1dGVVUkwuanM/ZDkyNSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvY29tYmluZVVSTHMuanM/ZTY4MyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvYnVpbGRGdWxsUGF0aC5qcz84M2I5Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvY29yZS9tZXJnZUNvbmZpZy5qcz80YTdiIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9yZXNvbHZlQ29uZmlnLmpzP2NkYWMiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9hZGFwdGVycy94aHIuanM/YjUwZCIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvY29tcG9zZVNpZ25hbHMuanM/Nzc5NCIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvdHJhY2tTdHJlYW0uanM/MjRmOCIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2FkYXB0ZXJzL2ZldGNoLmpzP2MzNmEiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9hZGFwdGVycy9hZGFwdGVycy5qcz8zYTExIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvY29yZS9kaXNwYXRjaFJlcXVlc3QuanM/NTI3MCIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2Vudi9kYXRhLmpzPzVjY2UiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL3ZhbGlkYXRvci5qcz84NDhiIiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvY29yZS9BeGlvcy5qcz8wYTA2Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvY2FuY2VsL0NhbmNlbFRva2VuLmpzPzhkZjQiLCJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL3NwcmVhZC5qcz8wZGY2Iiwid2VicGFjazovLy8uL25vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9pc0F4aW9zRXJyb3IuanM/NWYwMiIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvSHR0cFN0YXR1c0NvZGUuanM/YmVmYSIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYXhpb3MvbGliL2F4aW9zLmpzP2NlZTQiLCJ3ZWJwYWNrOi8vLy4vc3JjL2NvbmZpZy5qcz9jZjE0Iiwid2VicGFjazovLy8uL3NyYy9jb21wb25lbnRzL2ljb25zL1NsYWNrTG9nby5qc3g/YzY5ZSIsIndlYnBhY2s6Ly8vLi9zcmMvdXRpbHMvbG9nLmpzPzQ4N2QiLCJ3ZWJwYWNrOi8vLy4vc3JjL3V0aWxzL3NsYWNrVXRpbHMuanM/ZDJjNiIsIndlYnBhY2s6Ly8vLi9zcmMvY29tcG9uZW50cy9TbGFja0F1dGguanN4PzRlYWYiLCJ3ZWJwYWNrOi8vLy4vc3JjL2NvbXBvbmVudHMvaWNvbnMvVXNlci5qc3g/NzllMiIsIndlYnBhY2s6Ly8vLi9zcmMvY29tcG9uZW50cy9pY29ucy9DaGFubmVsUHVibGljLmpzeD8xMTdiIiwid2VicGFjazovLy8uL3NyYy9jb21wb25lbnRzL2ljb25zL0NoYW5uZWxQcml2YXRlLmpzeD8wMjkzIiwid2VicGFjazovLy8uL3NyYy9jb21wb25lbnRzL2ljb25zL0Nyb3NzLmpzeD9lYjkyIiwid2VicGFjazovLy8uL3NyYy9jb21wb25lbnRzL1RhZ0lucHV0LmpzeD84YjgxIiwid2VicGFjazovLy8uL3NyYy9jb21wb25lbnRzL2ljb25zL0Nsb3NlLmpzeD8xZmQ4Iiwid2VicGFjazovLy8uL3NyYy9jb21wb25lbnRzL2ljb25zL09mZmxpbmUuanN4P2RmYjYiLCJ3ZWJwYWNrOi8vLy4vc3JjL2NvbXBvbmVudHMvaWNvbnMvTW9yZS5qc3g/MzYwNyIsIndlYnBhY2s6Ly8vLi9zcmMvY29tcG9uZW50cy9pY29ucy9SZWZyZXNoLmpzeD85ZDFjIiwid2VicGFjazovLy8uL3NyYy9jb21wb25lbnRzL2ljb25zL0xvZ291dC5qc3g/ZDRmNCIsIndlYnBhY2s6Ly8vLi9zcmMvY29tcG9uZW50cy9TbGFja1BhbmVsLmpzeD9lOTgxIiwid2VicGFjazovLy8uL3NyYy9jb21wb25lbnRzL0xvY2FsU2hhcmVQYW5lbC5qc3g/NWQ1ZSIsIndlYnBhY2s6Ly8vLi9zcmMvY29tcG9uZW50cy9TaGFyZVBhbmVsLmpzeD85YmI0Iiwid2VicGFjazovLy8uL3NyYy9jb250cm9sbGVycy9TaGFyZVBhbmVsQ29udHJvbGxlci5qc3g/MGY4YSIsIndlYnBhY2s6Ly8vLi9zcmMvaW5kZXguanN4P2M0YTAiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuZXhwb3J0IGNvbnN0IE1lbnVJdGVtID0gZnVuY3Rpb24gKHByb3BzKSB7XG4gIGNvbnN0IExlZnRJY29uID0gcHJvcHMubGVmdEljb247XG4gIGNvbnN0IGdldENsYXNzTmFtZSA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgcmV0dXJuIHByb3BzLmRpc2FibGVkID8gbmFtZSArIFwiLWRpc2FibGVkXCIgOiBuYW1lO1xuICB9O1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogXCJtZW51LWl0ZW1cIlxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBcImljb24tY29udGFpbmVyXCJcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoTGVmdEljb24sIHtcbiAgICBjbGFzc05hbWU6IGdldENsYXNzTmFtZShcImljb24tc3R5bGVcIilcbiAgfSkpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBcInRleHQtY29udGFpbmVyXCJcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogZ2V0Q2xhc3NOYW1lKFwidGV4dC10aXRsZVwiKVxuICB9LCBwcm9wcy50aXRsZVN0ciksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IGdldENsYXNzTmFtZShcInRleHQtZGV0YWlsXCIpXG4gIH0sIHByb3BzLmRpc2FibGVkID8gcHJvcHMuZGlzYWJsZWREZXNjU3RyIDogcHJvcHMuZGVzY1N0cikpKTtcbn07IiwiZnVuY3Rpb24gX2V4dGVuZHMoKSB7IHJldHVybiBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gPyBPYmplY3QuYXNzaWduLmJpbmQoKSA6IGZ1bmN0aW9uIChuKSB7IGZvciAodmFyIGUgPSAxOyBlIDwgYXJndW1lbnRzLmxlbmd0aDsgZSsrKSB7IHZhciB0ID0gYXJndW1lbnRzW2VdOyBmb3IgKHZhciByIGluIHQpICh7fSkuaGFzT3duUHJvcGVydHkuY2FsbCh0LCByKSAmJiAobltyXSA9IHRbcl0pOyB9IHJldHVybiBuOyB9LCBfZXh0ZW5kcy5hcHBseShudWxsLCBhcmd1bWVudHMpOyB9XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmNvbnN0IEludml0ZSA9IGZ1bmN0aW9uIChwcm9wcykge1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdmdcIiwgX2V4dGVuZHMoe1xuICAgIHhtbG5zOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsXG4gICAgaGVpZ2h0OiAxOCxcbiAgICB3aWR0aDogMThcbiAgfSwgcHJvcHMpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImdcIiwge1xuICAgIFwiZGF0YS1uYW1lXCI6IFwiTGF5ZXIgMVwiXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgY2xhc3NOYW1lOiBwcm9wcy5jbGFzc05hbWUsXG4gICAgZDogXCJNOS42MDEgMTUuMzEyYTYuOTMyIDYuOTMyIDAgMCAxLTYuOTYtMi4zNDcgNS44NTcgNS44NTcgMCAwIDEgMi45LTEuMzEzYy43MTQtLjA2Mi43MjYtLjYzNi43MjYtMS4zNTJhNi41MTQgNi41MTQgMCAwIDEtMS41My0zLjg4MkM0LjczNiA0LjA2OCA2LjA3MyAyLjUgOCAyLjVzMy4yNjQgMS41NjcgMy4yNjQgMy45MThhNi41MTQgNi41MTQgMCAwIDEtMS41MyAzLjg4MmMwIC43MTYuMDEgMS4yOS43MjUgMS4zNTJhNS41ODIgNS41ODIgMCAwIDEgMi4wNDEuNzE2VjExLjI1YTEuNzUyIDEuNzUyIDAgMCAxIDEuNzUtMS43NWguNWExLjczMyAxLjczMyAwIDAgMSAxLjExOC40MTUgOC4wMSA4LjAxIDAgMSAwLTUuNjI2IDYuMjYgMS43NSAxLjc1IDAgMCAxLS42NDEtLjg2M1pcIlxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBjbGFzc05hbWU6IHByb3BzLmNsYXNzTmFtZSxcbiAgICBkOiBcIk0xNC4yNSAxMWEuMjUuMjUgMCAwIDAtLjI1LjI1VjE0aC0yLjc1YS4yNS4yNSAwIDAgMC0uMjUuMjV2LjVhLjI1LjI1IDAgMCAwIC4yNS4yNUgxNHYyLjc1YS4yNS4yNSAwIDAgMCAuMjUuMjVoLjVhLjI1LjI1IDAgMCAwIC4yNS0uMjVWMTVoMi43NWEuMjUuMjUgMCAwIDAgLjI1LS4yNXYtLjVhLjI1LjI1IDAgMCAwLS4yNS0uMjVIMTV2LTIuNzVhLjI1LjI1IDAgMCAwLS4yNS0uMjVaXCJcbiAgfSkpKTtcbn07XG5leHBvcnQgZGVmYXVsdCBJbnZpdGU7IiwiZnVuY3Rpb24gX2V4dGVuZHMoKSB7IHJldHVybiBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gPyBPYmplY3QuYXNzaWduLmJpbmQoKSA6IGZ1bmN0aW9uIChuKSB7IGZvciAodmFyIGUgPSAxOyBlIDwgYXJndW1lbnRzLmxlbmd0aDsgZSsrKSB7IHZhciB0ID0gYXJndW1lbnRzW2VdOyBmb3IgKHZhciByIGluIHQpICh7fSkuaGFzT3duUHJvcGVydHkuY2FsbCh0LCByKSAmJiAobltyXSA9IHRbcl0pOyB9IHJldHVybiBuOyB9LCBfZXh0ZW5kcy5hcHBseShudWxsLCBhcmd1bWVudHMpOyB9XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmNvbnN0IEludml0ZSA9IGZ1bmN0aW9uIChwcm9wcykge1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdmdcIiwgX2V4dGVuZHMoe1xuICAgIHhtbG5zOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsXG4gICAgaGVpZ2h0OiAxOCxcbiAgICB3aWR0aDogMThcbiAgfSwgcHJvcHMpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGNsYXNzTmFtZTogcHJvcHMuY2xhc3NOYW1lLFxuICAgIGQ6IFwiTTkuNSA3YS41LjUgMCAwIDEgLjUuNXY2YS41LjUgMCAwIDEtLjUuNUg0Ljc5M2EuNS41IDAgMCAwLS4zNTMuMTQ2TDMgMTUuNTg2VjE0LjVhLjUuNSAwIDAgMC0uNS0uNWgtMWEuNS41IDAgMCAxLS41LS41di02YS41LjUgMCAwIDEgLjUtLjVabS04LTFBMS41IDEuNSAwIDAgMCAwIDcuNXY2QTEuNSAxLjUgMCAwIDAgMS41IDE1SDJ2Mi4zOTdhLjI1LjI1IDAgMCAwIC40MjcuMTc2TDUgMTVoNC41YTEuNSAxLjUgMCAwIDAgMS41LTEuNXYtNkExLjUgMS41IDAgMCAwIDkuNSA2WlwiXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGNsYXNzTmFtZTogcHJvcHMuY2xhc3NOYW1lLFxuICAgIGQ6IFwiTTEyIDcuM0EyLjMgMi4zIDAgMCAwIDkuNyA1SDZWMi41QTEuNSAxLjUgMCAwIDEgNy41IDFoOUExLjUgMS41IDAgMCAxIDE4IDIuNXY2YTEuNSAxLjUgMCAwIDEtMS41IDEuNUgxNXYyLjM5N2EuMjUuMjUgMCAwIDEtLjQyNy4xNzZMMTIgMTBaXCJcbiAgfSkpO1xufTtcbmV4cG9ydCBkZWZhdWx0IEludml0ZTsiLCJmdW5jdGlvbiBfZXh0ZW5kcygpIHsgcmV0dXJuIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiA/IE9iamVjdC5hc3NpZ24uYmluZCgpIDogZnVuY3Rpb24gKG4pIHsgZm9yICh2YXIgZSA9IDE7IGUgPCBhcmd1bWVudHMubGVuZ3RoOyBlKyspIHsgdmFyIHQgPSBhcmd1bWVudHNbZV07IGZvciAodmFyIHIgaW4gdCkgKHt9KS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIHIpICYmIChuW3JdID0gdFtyXSk7IH0gcmV0dXJuIG47IH0sIF9leHRlbmRzLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7IH1cbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuY29uc3QgU2xhY2sgPSBmdW5jdGlvbiAocHJvcHMpIHtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIF9leHRlbmRzKHtcbiAgICB4bWxuczogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLFxuICAgIHdpZHRoOiAxOCxcbiAgICBoZWlnaHQ6IDE4LFxuICAgIHZpZXdCb3g6IFwiMCAwIDEyNyAxMjdcIlxuICB9LCBwcm9wcyksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgY2xhc3NOYW1lOiBwcm9wcy5jbGFzc05hbWUsXG4gICAgZDogXCJNMjcuMiA4MGMwIDcuMy01LjkgMTMuMi0xMy4yIDEzLjJDNi43IDkzLjIuOCA4Ny4zLjggODBjMC03LjMgNS45LTEzLjIgMTMuMi0xMy4yaDEzLjJWODB6bTYuNiAwYzAtNy4zIDUuOS0xMy4yIDEzLjItMTMuMiA3LjMgMCAxMy4yIDUuOSAxMy4yIDEzLjJ2MzNjMCA3LjMtNS45IDEzLjItMTMuMiAxMy4yLTcuMyAwLTEzLjItNS45LTEzLjItMTMuMlY4MHpcIlxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBjbGFzc05hbWU6IHByb3BzLmNsYXNzTmFtZSxcbiAgICBkOiBcIk00NyAyN2MtNy4zIDAtMTMuMi01LjktMTMuMi0xMy4yQzMzLjggNi41IDM5LjcuNiA0NyAuNmM3LjMgMCAxMy4yIDUuOSAxMy4yIDEzLjJWMjdINDd6bTAgNi43YzcuMyAwIDEzLjIgNS45IDEzLjIgMTMuMiAwIDcuMy01LjkgMTMuMi0xMy4yIDEzLjJIMTMuOUM2LjYgNjAuMS43IDU0LjIuNyA0Ni45YzAtNy4zIDUuOS0xMy4yIDEzLjItMTMuMkg0N3pcIlxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBjbGFzc05hbWU6IHByb3BzLmNsYXNzTmFtZSxcbiAgICBkOiBcIk05OS45IDQ2LjljMC03LjMgNS45LTEzLjIgMTMuMi0xMy4yIDcuMyAwIDEzLjIgNS45IDEzLjIgMTMuMiAwIDcuMy01LjkgMTMuMi0xMy4yIDEzLjJIOTkuOVY0Ni45em0tNi42IDBjMCA3LjMtNS45IDEzLjItMTMuMiAxMy4yLTcuMyAwLTEzLjItNS45LTEzLjItMTMuMlYxMy44QzY2LjkgNi41IDcyLjguNiA4MC4xLjZjNy4zIDAgMTMuMiA1LjkgMTMuMiAxMy4ydjMzLjF6XCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgY2xhc3NOYW1lOiBwcm9wcy5jbGFzc05hbWUsXG4gICAgZDogXCJNODAuMSA5OS44YzcuMyAwIDEzLjIgNS45IDEzLjIgMTMuMiAwIDcuMy01LjkgMTMuMi0xMy4yIDEzLjItNy4zIDAtMTMuMi01LjktMTMuMi0xMy4yVjk5LjhoMTMuMnptMC02LjZjLTcuMyAwLTEzLjItNS45LTEzLjItMTMuMiAwLTcuMyA1LjktMTMuMiAxMy4yLTEzLjJoMzMuMWM3LjMgMCAxMy4yIDUuOSAxMy4yIDEzLjIgMCA3LjMtNS45IDEzLjItMTMuMiAxMy4ySDgwLjF6XCJcbiAgfSkpO1xufTtcbmV4cG9ydCBkZWZhdWx0IFNsYWNrOyIsImZ1bmN0aW9uIF9leHRlbmRzKCkgeyByZXR1cm4gX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduID8gT2JqZWN0LmFzc2lnbi5iaW5kKCkgOiBmdW5jdGlvbiAobikgeyBmb3IgKHZhciBlID0gMTsgZSA8IGFyZ3VtZW50cy5sZW5ndGg7IGUrKykgeyB2YXIgdCA9IGFyZ3VtZW50c1tlXTsgZm9yICh2YXIgciBpbiB0KSAoe30pLmhhc093blByb3BlcnR5LmNhbGwodCwgcikgJiYgKG5bcl0gPSB0W3JdKTsgfSByZXR1cm4gbjsgfSwgX2V4dGVuZHMuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgfVxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5jb25zdCBUZWFtcyA9IGZ1bmN0aW9uIChwcm9wcykge1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdmdcIiwgX2V4dGVuZHMoe1xuICAgIHhtbG5zOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsXG4gICAgdmlld0JveDogXCIwIDAgMjIyOC44MzMgMjA3My4zMzNcIixcbiAgICBoZWlnaHQ6IDE4LFxuICAgIHdpZHRoOiAxOFxuICB9LCBwcm9wcyksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJNMTU1NC42IDc3Ny41aDU3NS43YzU0LjQgMCA5OC41IDQ0LjEgOTguNSA5OC41djUyNC40YzAgMTk5LjktMTYyLjEgMzYyLTM2MiAzNjJoLTEuN2MtMTk5LjkgMC0zNjItMTYyLTM2Mi0zNjEuOVY4MjljMC0yOC40IDIzLTUxLjUgNTEuNS01MS41WlwiLFxuICAgIGNsYXNzTmFtZTogXCJjbHMtNFwiXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImNpcmNsZVwiLCB7XG4gICAgY3g6IDE5NDMuOCxcbiAgICBjeTogNDQwLjYsXG4gICAgcjogMjMzLjIsXG4gICAgY2xhc3NOYW1lOiBcImNscy00XCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiY2lyY2xlXCIsIHtcbiAgICBjeDogMTIxOC4xLFxuICAgIGN5OiAzMzYuOSxcbiAgICByOiAzMzYuOSxcbiAgICBjbGFzc05hbWU6IFwiY2xzLTFcIlxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk0xNzYyLjMgMTQ3NS4zVjg3Ny4yYzEuMi01My43LTQxLjMtOTguMy05NS05OS43SDkwMi44bC0zLjUgOC4zYy0zMy43IDQ3LjMtNzIuNCA5MC43LTEwOC4xIDEzNi40LTIyIDI4LjgtNDIuNCA1OC45LTU4LjcgOTEuNC00LjQgOC44LTEyLjcgMTQuNC0yMS45IDE2LjgtNC4zIDEyLjItOC4xIDI0LjYtMTEuNCAzNy4yLTcuMSAyNi44LTExLjIgNTQuNS0xNC45IDgxLjktLjkgNi45LTEuOCAxMy44LTIuNiAyMC43LS4zIDUuMy0uNiAxMC42LTEuMSAxNS45LS4zIDMuMy0uOCA2LjQtMS42IDkuNC0xLjIgMTIuNS0yLjMgMjUuMS0zLjEgMzcuNi0xLjcgMjUuMS0yLjUgNTAuMy0yLjUgNzUuNSAwIDI1IDIuMiA1MC4xIDEuOCA3NS4xLS43IDQ5LjEtOS45IDk3LjQtMTUgMTQ2LjEtMS4xIDEwLjMtMy44IDE4LjUtMTAuOCAyNi4yLTUuNSA1LjktMTMuNSA5LjEtMjEuMiAxMC4yLS40IDAtLjkuMS0xLjMuMSAzNy4xIDI4MC40IDI3My43IDQ5OS45IDU2NS4yIDUwNyAzMjIuNS03LjkgNTc3LjctMjc1LjUgNTcwLjItNTk4LjFaXCIsXG4gICAgY2xhc3NOYW1lOiBcImNscy0xXCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZDogXCJtOTAyLjggNzc3LjUtMy41IDguM2MtMzMuNyA0Ny4zLTcyLjQgOTAuNy0xMDguMSAxMzYuNC0yMiAyOC44LTQyLjQgNTguOS01OC43IDkxLjQtNC40IDguOC0xMi43IDE0LjQtMjEuOSAxNi44LTQuMyAxMi4yLTguMSAyNC42LTExLjQgMzcuMi03LjEgMjYuOC0xMS4yIDU0LjUtMTQuOSA4MS45LS45IDYuOS0xLjggMTMuOC0yLjYgMjAuNy0uMyA1LjMtLjYgMTAuNi0xLjEgMTUuOS0uMyAzLjMtLjggNi40LTEuNiA5LjQtMS4yIDEyLjUtMi4zIDI1LjEtMy4xIDM3LjYtMS43IDI1LjEtMi41IDUwLjMtMi41IDc1LjUgMCAyNSAyLjIgNTAuMSAxLjggNzUuMS0uNyA0OS4xLTkuOSA5Ny40LTE1IDE0Ni4xLTEuMSAxMC4zLTMuOCAxOC41LTEwLjggMjYuMi01LjMgNS44LTEzLjEgOS0yMC43IDEwLjEgNC42IDMxLjMgMTEuNSA2Mi4yIDIwLjggOTIuNmgzOTZjNTIuMi0uNCA5NC41LTQyLjYgOTQuOS05NC45Vjc3Ny41SDkwMi45Wk0xMTQwLjMgNTYxLjR2MTAzLjFjLTEwNS0yNC45LTE5MS43LTk4LjUtMjMzLjItMTk4aDEzOC40YzUyLjMuMiA5NC43IDQyLjYgOTQuOSA5NC45WlwiLFxuICAgIGNsYXNzTmFtZTogXCJjbHMtMlwiXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTEwNDUuMyA0NjYuNUg5NWMtNTIuNSAwLTk1IDQyLjUtOTUgOTV2OTUwLjNjMCA1Mi41IDQyLjUgOTUgOTUgOTVoOTUwLjNjNTIuNSAwIDk1LTQyLjUgOTUtOTVWNTYxLjVjMC01Mi41LTQyLjUtOTUtOTUtOTVaTTgyMC4yIDgyOC4yaC0xOTB2NTE3LjNoLTEyMVY4MjguMkgzMjAuMVY3MjcuOWg1MDAuMXYxMDAuM1pcIixcbiAgICBjbGFzc05hbWU6IFwiY2xzLTNcIlxuICB9KSk7XG59O1xuZXhwb3J0IGRlZmF1bHQgVGVhbXM7IiwiZnVuY3Rpb24gX2V4dGVuZHMoKSB7IHJldHVybiBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gPyBPYmplY3QuYXNzaWduLmJpbmQoKSA6IGZ1bmN0aW9uIChuKSB7IGZvciAodmFyIGUgPSAxOyBlIDwgYXJndW1lbnRzLmxlbmd0aDsgZSsrKSB7IHZhciB0ID0gYXJndW1lbnRzW2VdOyBmb3IgKHZhciByIGluIHQpICh7fSkuaGFzT3duUHJvcGVydHkuY2FsbCh0LCByKSAmJiAobltyXSA9IHRbcl0pOyB9IHJldHVybiBuOyB9LCBfZXh0ZW5kcy5hcHBseShudWxsLCBhcmd1bWVudHMpOyB9XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmNvbnN0IFNlbmRUb0FwcHMgPSBmdW5jdGlvbiAocHJvcHMpIHtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIF9leHRlbmRzKHtcbiAgICB4bWxuczogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLFxuICAgIHdpZHRoOiAxOCxcbiAgICBoZWlnaHQ6IDE4LFxuICAgIGZpbGw6IFwibm9uZVwiXG4gIH0sIHByb3BzKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBjbGFzc05hbWU6IHByb3BzLmNsYXNzTmFtZSxcbiAgICBmaWxsOiBcIiNFQkVCRUJcIixcbiAgICBmaWxsUnVsZTogXCJldmVub2RkXCIsXG4gICAgZDogXCJNMTYuNTk1IDIuNTU2LjkgNy4yNGEuMjUuMjUgMCAwIDAtLjA0LjQ2M0w0LjgyIDkuNjhsMTEuNzc1LTcuMTIzWk02LjU0NSAxMC41MTZsNS45NjggM2EuNS41IDAgMCAwIC42NzItLjIyM2w0LjYzMy0xMC4xMTEtMTEuMjczIDcuMzM0Wk01LjA0IDExLjYyNXYzLjgyYS4zNTYuMzU2IDAgMCAwIC41ODcuMjcxbDIuNjgtMi4yNTctMy4yNjctMS44MzRaXCIsXG4gICAgY2xpcFJ1bGU6IFwiZXZlbm9kZFwiXG4gIH0pKTtcbn07XG5leHBvcnQgZGVmYXVsdCBTZW5kVG9BcHBzOyIsImZ1bmN0aW9uIF9leHRlbmRzKCkgeyByZXR1cm4gX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduID8gT2JqZWN0LmFzc2lnbi5iaW5kKCkgOiBmdW5jdGlvbiAobikgeyBmb3IgKHZhciBlID0gMTsgZSA8IGFyZ3VtZW50cy5sZW5ndGg7IGUrKykgeyB2YXIgdCA9IGFyZ3VtZW50c1tlXTsgZm9yICh2YXIgciBpbiB0KSAoe30pLmhhc093blByb3BlcnR5LmNhbGwodCwgcikgJiYgKG5bcl0gPSB0W3JdKTsgfSByZXR1cm4gbjsgfSwgX2V4dGVuZHMuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgfVxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5jb25zdCBRdWlja0V4cG9ydCA9IGZ1bmN0aW9uIChwcm9wcykge1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdmdcIiwgX2V4dGVuZHMoe1xuICAgIHhtbG5zOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsXG4gICAgd2lkdGg6IDE4LFxuICAgIGhlaWdodDogMTgsXG4gICAgZmlsbDogXCJub25lXCJcbiAgfSwgcHJvcHMpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGNsYXNzTmFtZTogcHJvcHMuY2xhc3NOYW1lLFxuICAgIGZpbGw6IFwiI0VCRUJFQlwiLFxuICAgIGZpbGxSdWxlOiBcImV2ZW5vZGRcIixcbiAgICBkOiBcIk0xNi41IDNoLTE1YS41LjUgMCAwIDAtLjUuNXYxMWEuNS41IDAgMCAwIC41LjVoMTVhLjUuNSAwIDAgMCAuNS0uNXYtMTFhLjUuNSAwIDAgMC0uNS0uNVptLS41IDkuNjg2LTIuNjM2LTIuNjM2YTEgMSAwIDAgMC0xLjQxNCAwbC0xLjUzNiAxLjUzNi0zLjc3OC0zLjc3OGExIDEgMCAwIDAtMS40MTQgMEwyIDExLjAyOVY0aDE0djguNjg2WlwiLFxuICAgIGNsaXBSdWxlOiBcImV2ZW5vZGRcIlxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBjbGFzc05hbWU6IHByb3BzLmNsYXNzTmFtZSxcbiAgICBmaWxsOiBcIiNFQkVCRUJcIixcbiAgICBkOiBcIk0xMy4zNSA4YTEuMzUgMS4zNSAwIDEgMCAwLTIuNyAxLjM1IDEuMzUgMCAwIDAgMCAyLjdaXCJcbiAgfSkpO1xufTtcbmV4cG9ydCBkZWZhdWx0IFF1aWNrRXhwb3J0OyIsImZ1bmN0aW9uIF9leHRlbmRzKCkgeyByZXR1cm4gX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduID8gT2JqZWN0LmFzc2lnbi5iaW5kKCkgOiBmdW5jdGlvbiAobikgeyBmb3IgKHZhciBlID0gMTsgZSA8IGFyZ3VtZW50cy5sZW5ndGg7IGUrKykgeyB2YXIgdCA9IGFyZ3VtZW50c1tlXTsgZm9yICh2YXIgciBpbiB0KSAoe30pLmhhc093blByb3BlcnR5LmNhbGwodCwgcikgJiYgKG5bcl0gPSB0W3JdKTsgfSByZXR1cm4gbjsgfSwgX2V4dGVuZHMuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgfVxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5jb25zdCBBbmltYXRlSW5GaXJlZmx5ID0gZnVuY3Rpb24gKHByb3BzKSB7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInN2Z1wiLCBfZXh0ZW5kcyh7XG4gICAgeG1sbnM6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIixcbiAgICB3aWR0aDogXCIxOHB4XCIsXG4gICAgaGVpZ2h0OiBcIjE4cHhcIixcbiAgICBmaWxsOiBcIm5vbmVcIlxuICB9LCBwcm9wcyksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgY2xhc3NOYW1lOiBwcm9wcy5jbGFzc05hbWUsXG4gICAgZmlsbDogXCJ2YXIoLS1pY29uRmlsbCwgIzZFNkU2RSlcIixcbiAgICBmaWxsUnVsZTogXCJldmVub2RkXCIsXG4gICAgZDogXCJNMTQuMjIxNjgsMUgzLjc3ODMyYy0xLjUzNDQyLDAtMi43NzgzMiwxLjI0MzktMi43NzgzMiwyLjc3ODMydjkuNDQzMzYgYzAsMS41MzQ0MiwxLjI0MzksMi43NzgzMiwyLjc3ODMyLDIuNzc4MzJoMTAuNDQzMzZjMS41MzQ0MiwwLDIuNzc4MzItMS4yNDM5LDIuNzc4MzItMi43NzgzMlYzLjc3ODMyIGMwLTEuNTM0NDItMS4yNDM5LTIuNzc4MzItMi43NzgzMi0yLjc3ODMyWk0xMC4wNDcxMiw2LjI3NDk2aC0yLjkyNTc4djEuNjA1NzFoMi42MzcyMSBjLjA1OTk0LDAsLjA4ODUuMDE5OTkuMDg4NS4wODI4NnYxLjE1NDNjMCwuMDYyODQtLjAzMTM3LjA4Mjg2LS4wODI4OS4wODI4NmgtMi42NDI4MnYyLjU4ODU2IGMwLC4wNjI4Ny0uMDI4NTYuMDkxNDMtLjA5MTQzLjA5MTQzaC0xLjMwNTY2Yy0uMDUxMzksMC0uMDcxNDEtLjAzNzE0LS4wNzE0MS0uMDkxNDN2LTYuNzUxNDMgYzAtLjA2LjAyMDAyLS4wODI4Ni4wNzk5Ni0uMDgyODZoNC4xODU2N2MuMDcxNTMsMCwuMDg4NjIuMDE5OTkuMTAwMS4wODg1NmwuMTE3MDcsMS4xNDAwMSBjLjAxMTQ3LjA2Mjg3LS4wMTk5LjA5MTQzLS4wODg1LjA5MTQzWk0xMi4zOTU2MywxMS43ODA2N2MwLC4wNjg1Ny0uMDIwMDIuMDk3MTQtLjA5NzA1LjA5NzE0aC0xLjI3NDQxIGMtLjA3MTQxLDAtLjEwNTcxLS4wMzE0My0uMTA1NzEtLjA5OTk4di01LjA2Mjg3YzAtLjA2LjAyODU2LS4wODg1OS4wODg2Mi0uMDg4NTloMS4zMDAwNSBjLjA2ODQ4LDAsLjA4ODUuMDE3MTUuMDg4NS4wODU3MnY1LjA2ODU3Wk0xMi42MjEzNCw1LjYyOTI0bC0uNjQ1NzUtLjE0NTcyIGMtLjA4Mjc2LS4wMTk5OS0uMTc0MTkuMDAyODctLjIzNzA2LjA2Mjg3bC0uNDg1NzIuNDQ4NThjLS4xOTE0MS4xNzcxMi0uNDk3MTkuMDAyODQtLjQ0MDA2LS4yNTE0M2wuMTQ1NzUtLjY0NTcyIGMuMDIwMDItLjA4NTY5LS4wMDI4MS0uMTc0MjktLjA2Mjg3LS4yMzcxMmwtLjQ0ODYxLS40ODU3MmMtLjE3NzEyLS4xOTE0NCwwLS40OTQyOS4yNTQzOS0uNDM3MTZsLjY0NTYzLjE0NTcyIGMuMDgyODkuMDE5OTkuMTc0MzItLjAwMjg0LjIzNzE4LS4wNjI4N2wuNDg1NzItLjQ0ODU1Yy4xOTE0MS0uMTc3MTUuNDk3MTktLjAwMjg3LjQ0MDA2LjI1MTRsLS4xNDU3NS42NDU3MiBjLS4wMjAwMi4wODU3Mi4wMDI4MS4xNzQyOS4wNjI4Ny4yMzcxNWwuNDQ4NDkuNDg1NzJjLjE3NzEyLjE5MTQ0LDAsLjQ5NDI5LS4yNTQyNy40MzcxM1pcIixcbiAgICBjbGlwUnVsZTogXCJldmVub2RkXCJcbiAgfSkpO1xufTtcbmV4cG9ydCBkZWZhdWx0IEFuaW1hdGVJbkZpcmVmbHk7IiwiZXhwb3J0IGNvbnN0IE1FTlVfQUNUSU9OID0gT2JqZWN0LmZyZWV6ZSh7XG4gIFJFVklFVzogU3ltYm9sKFwicmV2aWV3XCIpLFxuICBJTlZJVEU6IFN5bWJvbChcImludml0ZVwiKSxcbiAgU0xBQ0s6IFN5bWJvbChcInNsYWNrXCIpLFxuICBURUFNUzogU3ltYm9sKFwidGVhbXNcIiksXG4gIExPQ0FMU0hBUklORzogU3ltYm9sKFwibG9jYWxTaGFyaW5nXCIpLFxuICBRVUlDS0VYUE9SVDogU3ltYm9sKFwiUXVpY2tFeHBvcnRcIiksXG4gIEFOSU1BVEVJTkZJUkVGTFk6IFN5bWJvbChcIkFuaW1hdGVJbkZpcmVmbHlcIilcbn0pO1xuZXhwb3J0IGNvbnN0IElOVklURV9UT19FRElUX01FTlUgPSBcIklOVklURV9UT19FRElUX01FTlVcIjtcbmV4cG9ydCBjb25zdCBTSEFSRV9GT1JfUkVWSUVXX01FTlUgPSBcIlNIQVJFX0ZPUl9SRVZJRVdfTUVOVVwiO1xuZXhwb3J0IGNvbnN0IFNIQVJFX1ZJQV9TTEFDSyA9IFwiU0hBUkVfVklBX1NMQUNLXCI7XG5leHBvcnQgY29uc3QgU0hBUkVfVklBX1RFQU1TID0gXCJTSEFSRV9WSUFfVEVBTVNcIjtcbmV4cG9ydCBjb25zdCBMT0NBTF9TSEFSSU5HID0gXCJMT0NBTF9TSEFSSU5HXCI7XG5leHBvcnQgY29uc3QgUVVJQ0tfRVhQT1JUID0gXCJRVUlDS19FWFBPUlRcIjtcbmV4cG9ydCBjb25zdCBBTklNQVRFX0lOX0ZJUkVGTFkgPSBcIkFOSU1BVEVfSU5fRklSRUZMWVwiO1xuZXhwb3J0IGNvbnN0IEVOVEVSX0tFWSA9IFwiRW50ZXJcIjtcbmV4cG9ydCBjb25zdCBFU0NBUEVfS0VZID0gXCJFc2NhcGVcIjtcbmV4cG9ydCBjb25zdCBCT1VORFMgPSB7XG4gIFRPUDogMSxcbiAgUklHSFQ6IDIsXG4gIEJPVFRPTTogNCxcbiAgTEVGVDogOFxufTtcbmV4cG9ydCBjb25zdCBERUJVRyA9IEJvb2xlYW4ocHJvY2Vzcy5lbnYuREVCVUcpO1xuXG4vLyBGZWF0dXJlIGZsYWcgY29uc3RhbnRzXG5leHBvcnQgY29uc3QgRkVBVFVSRV9GTEFHUyA9IHtcbiAgRkVBVFVSRV9GTEFHU19BTklNQVRFX0lOX0ZJUkVGTFk6ICdBbmltYXRlSW5GaXJlZmx5J1xufTtcbmV4cG9ydCBjb25zdCBpc01hYyA9IEJvb2xlYW4obmF2aWdhdG9yLnBsYXRmb3JtID09PSBcImRhcndpblwiKTtcbmV4cG9ydCBjb25zdCBpc1dpbmRvd3MgPSBCb29sZWFuKG5hdmlnYXRvci5wbGF0Zm9ybS5tYXRjaCgvXndpbi8pKTtcbmV4cG9ydCBjb25zdCBPU19FVkVOVFMgPSB7XG4gIE1PVVNFX0RPV046IFwiZ2xvYmFsTW91c2VEb3duXCJcbn07XG5leHBvcnQgY29uc3QgR0xPQkFMX0VWRU5UUyA9IFtcImdsb2JhbE1vdXNlRG93blwiXTtcbmV4cG9ydCBjb25zdCBVWFBFdmVudFR5cGVzID0ge1xuICBLRVlET1dOOiBcImtleWRvd25cIixcbiAgVEhFTUU6IFwidGhlbWVjaGFuZ2VkXCJcbn07XG5leHBvcnQgZnVuY3Rpb24gaXNJbkJvdW5kYXJ5KGNvb3JkaW5hdGVzLCBwb3NpdGlvbikge1xuICBjb25zdCB7XG4gICAgeSxcbiAgICB4XG4gIH0gPSBjb29yZGluYXRlcztcbiAgY29uc3Qge1xuICAgIGJvdHRvbSxcbiAgICBsZWZ0LFxuICAgIHJpZ2h0LFxuICAgIHRvcFxuICB9ID0gcG9zaXRpb247XG4gIHJldHVybiB4ID4gbGVmdCAmJiB4IDwgcmlnaHQgJiYgeSA8IGJvdHRvbSAmJiB5ID4gdG9wO1xufVxuY29uc3QgaGFuZGxlcnMgPSBuZXcgTWFwKCk7XG5leHBvcnQgZnVuY3Rpb24gc2V0RGlhbG9nTGlzdGVuZXIoZXZlbnROYW1lLCBkaWFsb2dJZCwgY2FsbGJhY2spIHtcbiAgaWYgKCFoYW5kbGVycy5oYXMoZXZlbnROYW1lKSkge1xuICAgIGhhbmRsZXJzLnNldChldmVudE5hbWUsIG5ldyBNYXAoKSk7XG4gIH1cbiAgaGFuZGxlcnMuZ2V0KGV2ZW50TmFtZSkuc2V0KGRpYWxvZ0lkLCBjYWxsYmFjayk7XG59XG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlRGlhbG9nTGlzdGVuZXJzKGRpYWxvZ0lkKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgZm9yIChjb25zdCBbZXZlbnQsIGV2ZW50TWFwXSBvZiBoYW5kbGVycykge1xuICAgIGV2ZW50TWFwLmRlbGV0ZShkaWFsb2dJZCk7XG4gIH1cbn1cbmV4cG9ydCBjb25zdCBlbWl0ID0gZnVuY3Rpb24gKGV2ZW50TmFtZSwgZGVzY3JpcHRvcikge1xuICBpZiAoIWhhbmRsZXJzLmdldChldmVudE5hbWUpKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgZm9yIChjb25zdCBbaWQsIGhhbmRsZXJdIG9mIGhhbmRsZXJzLmdldChldmVudE5hbWUpKSB7XG4gICAgaGFuZGxlcihldmVudE5hbWUsIGRlc2NyaXB0b3IpO1xuICB9XG59OyIsImZ1bmN0aW9uIG93bktleXMoZSwgcikgeyB2YXIgdCA9IE9iamVjdC5rZXlzKGUpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgbyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7IHIgJiYgKG8gPSBvLmZpbHRlcihmdW5jdGlvbiAocikgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLCByKS5lbnVtZXJhYmxlOyB9KSksIHQucHVzaC5hcHBseSh0LCBvKTsgfSByZXR1cm4gdDsgfVxuZnVuY3Rpb24gX29iamVjdFNwcmVhZChlKSB7IGZvciAodmFyIHIgPSAxOyByIDwgYXJndW1lbnRzLmxlbmd0aDsgcisrKSB7IHZhciB0ID0gbnVsbCAhPSBhcmd1bWVudHNbcl0gPyBhcmd1bWVudHNbcl0gOiB7fTsgciAlIDIgPyBvd25LZXlzKE9iamVjdCh0KSwgITApLmZvckVhY2goZnVuY3Rpb24gKHIpIHsgX2RlZmluZVByb3BlcnR5KGUsIHIsIHRbcl0pOyB9KSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnModCkpIDogb3duS2V5cyhPYmplY3QodCkpLmZvckVhY2goZnVuY3Rpb24gKHIpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIHIsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCwgcikpOyB9KTsgfSByZXR1cm4gZTsgfVxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KGUsIHIsIHQpIHsgcmV0dXJuIChyID0gX3RvUHJvcGVydHlLZXkocikpIGluIGUgPyBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgciwgeyB2YWx1ZTogdCwgZW51bWVyYWJsZTogITAsIGNvbmZpZ3VyYWJsZTogITAsIHdyaXRhYmxlOiAhMCB9KSA6IGVbcl0gPSB0LCBlOyB9XG5mdW5jdGlvbiBfdG9Qcm9wZXJ0eUtleSh0KSB7IHZhciBpID0gX3RvUHJpbWl0aXZlKHQsIFwic3RyaW5nXCIpOyByZXR1cm4gXCJzeW1ib2xcIiA9PSB0eXBlb2YgaSA/IGkgOiBpICsgXCJcIjsgfVxuZnVuY3Rpb24gX3RvUHJpbWl0aXZlKHQsIHIpIHsgaWYgKFwib2JqZWN0XCIgIT0gdHlwZW9mIHQgfHwgIXQpIHJldHVybiB0OyB2YXIgZSA9IHRbU3ltYm9sLnRvUHJpbWl0aXZlXTsgaWYgKHZvaWQgMCAhPT0gZSkgeyB2YXIgaSA9IGUuY2FsbCh0LCByIHx8IFwiZGVmYXVsdFwiKTsgaWYgKFwib2JqZWN0XCIgIT0gdHlwZW9mIGkpIHJldHVybiBpOyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQEB0b1ByaW1pdGl2ZSBtdXN0IHJldHVybiBhIHByaW1pdGl2ZSB2YWx1ZS5cIik7IH0gcmV0dXJuIChcInN0cmluZ1wiID09PSByID8gU3RyaW5nIDogTnVtYmVyKSh0KTsgfVxuLy8gUmVmZXJlbmNlZCBmcm9tOiBodHRwczovL2dpdC5jb3JwLmFkb2JlLmNvbS9waG90b3Nob3AvdXhwLWV4cG9ydC1hcy9ibG9iL21haW4vc3JjL3V0aWxzL25scy50c1xuXG5pbXBvcnQgeyBnZXQgfSBmcm9tICdsb2Rhc2gnO1xuY29uc3QgREVGQVVMVF9MT0NBTEUgPSAnZW4nO1xubGV0IGRpY3Rpb25hcmllcyA9IG51bGw7XG5sZXQgX2xvY2FsZSA9IERFRkFVTFRfTE9DQUxFO1xuaWYgKHdpbmRvdy5yZXF1aXJlKSB7XG4gIHNldExvY2FsZSh3aW5kb3cucmVxdWlyZSgndXhwJykuaG9zdC5sb2NhbGUpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGxvY2FsaXplKGtleSwgLi4uYXJncykge1xuICBjb25zdCBkaWN0aW9uYXJ5ID0gX2dldExvY2FsRGljdGlvbmFyaWVzKClbX2xvY2FsZV0gfHwgX2dldExvY2FsRGljdGlvbmFyaWVzKClbREVGQVVMVF9MT0NBTEVdO1xuICBsZXQgdHJhbnNsYXRlZCA9IGdldChkaWN0aW9uYXJ5LCBrZXkpO1xuICBpZiAodHlwZW9mIHRyYW5zbGF0ZWQgIT09ICdzdHJpbmcnKSB7XG4gICAgdHJhbnNsYXRlZCA9IGtleTtcbiAgfVxuICByZXR1cm4gX2V4cGFuZCh0cmFuc2xhdGVkLCAuLi5hcmdzKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBzZXRMb2NhbGUobG9jYWxlKSB7XG4gIGlmIChsb2NhbGUgJiYgbG9jYWxlLmxlbmd0aCAhPT0gMikge1xuICAgIGlmIChsb2NhbGUubWF0Y2goL156aFstX10vKSkge1xuICAgICAgbG9jYWxlID0gbG9jYWxlLnJlcGxhY2UoJ18nLCAnLScpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2NhbGUgPSBsb2NhbGUuc3BsaXQoL1stX10vKVswXTtcbiAgICB9XG4gIH1cbiAgX2xvY2FsZSA9IGxvY2FsZSB8fCBERUZBVUxUX0xPQ0FMRTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBzZXREaWN0aW9uYXJ5KGxvY2FsZSwgZGljdGlvbmFyeSkge1xuICBhc3NlcnQoZGljdGlvbmFyaWVzKTtcbiAgaWYgKCFkaWN0aW9uYXJpZXNbbG9jYWxlXSkge1xuICAgIGRpY3Rpb25hcmllc1tsb2NhbGVdID0ge307XG4gIH1cbiAgZGljdGlvbmFyaWVzW2xvY2FsZV0gPSBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGRpY3Rpb25hcmllc1tsb2NhbGVdKSwgZGljdGlvbmFyeSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0TG9jYWxlKCkge1xuICByZXR1cm4gX2xvY2FsZTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRMb2NhbGVzKCkge1xuICByZXR1cm4gQXJyYXkuZnJvbShPYmplY3Qua2V5cyhfZ2V0TG9jYWxEaWN0aW9uYXJpZXMoKSkpO1xufVxuZnVuY3Rpb24gX2V4cGFuZCh0cmFuc2xhdGlvbiwgLi4uYXJncykge1xuICByZXR1cm4gdHJhbnNsYXRpb24ucmVwbGFjZSgveyhcXGQpfS9nLCBmdW5jdGlvbiAobWF0Y2gsIHN1YnN0cmluZykge1xuICAgIGNvbnN0IGluZGV4ID0gTnVtYmVyLnBhcnNlSW50KHN1YnN0cmluZ1swXSwgMTApO1xuICAgIGlmIChOdW1iZXIuaXNOYU4oaW5kZXgpKSB7XG4gICAgICByZXR1cm4gbWF0Y2g7XG4gICAgfVxuICAgIHJldHVybiBhcmdzW2luZGV4XTtcbiAgfSk7XG59XG5mdW5jdGlvbiBfZ2V0TG9jYWxEaWN0aW9uYXJpZXMoKSB7XG4gIGlmIChkaWN0aW9uYXJpZXMpIHtcbiAgICByZXR1cm4gZGljdGlvbmFyaWVzO1xuICB9XG4gIGNvbnN0IGxhbmd1YWdlQ29udGV4dCA9IHJlcXVpcmUuY29udGV4dCgnLi4vYXNzZXRzL25scycsIHRydWUsIC9eXFwuXFwvLipcXC5qc29uJC8pO1xuICBkaWN0aW9uYXJpZXMgPSBsYW5ndWFnZUNvbnRleHQua2V5cygpLnJlZHVjZShmdW5jdGlvbiAobWVzc2FnZU1hcCwga2V5KSB7XG4gICAgY29uc3QgbGFuZ3VhZ2UgPSAoa2V5Lm1hdGNoKC9eXFwuXFwvKC4qKVxcLy4qXFwuanNvbiQvKSB8fCBbXSlbMV07XG4gICAgY29uc3QgZGljdGlvbmFyeSA9IGxhbmd1YWdlQ29udGV4dChrZXkpO1xuICAgIG1lc3NhZ2VNYXBbbGFuZ3VhZ2VdID0gZGljdGlvbmFyeTtcbiAgICByZXR1cm4gbWVzc2FnZU1hcDtcbiAgfSwge30pO1xuICByZXR1cm4gZGljdGlvbmFyaWVzO1xufVxuZnVuY3Rpb24gYXNzZXJ0KHQsIG1lc3NhZ2UpIHtcbiAgaWYgKCF0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke21lc3NhZ2UgfHwgJ0Fzc2VydGlvbiBmYWlsZWQnfSAoZXhwZWN0cyB2YXJpYWJsZSB0byBiZSB0cnV0aGZ1bCwgZ290ICR7dH0pYCk7XG4gIH1cbn0iLCJmdW5jdGlvbiBfZXh0ZW5kcygpIHsgcmV0dXJuIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiA/IE9iamVjdC5hc3NpZ24uYmluZCgpIDogZnVuY3Rpb24gKG4pIHsgZm9yICh2YXIgZSA9IDE7IGUgPCBhcmd1bWVudHMubGVuZ3RoOyBlKyspIHsgdmFyIHQgPSBhcmd1bWVudHNbZV07IGZvciAodmFyIHIgaW4gdCkgKHt9KS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIHIpICYmIChuW3JdID0gdFtyXSk7IH0gcmV0dXJuIG47IH0sIF9leHRlbmRzLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7IH1cbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuY29uc3QgRm9yd2FyZEFycm93ID0gZnVuY3Rpb24gKHByb3BzKSB7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInN2Z1wiLCBfZXh0ZW5kcyh7XG4gICAgeG1sbnM6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIixcbiAgICB3aWR0aDogMTAsXG4gICAgaGVpZ2h0OiAxMCxcbiAgICBmaWxsOiBcIm5vbmVcIlxuICB9LCBwcm9wcyksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgY2xhc3NOYW1lOiBwcm9wcy5jbGFzc05hbWUsXG4gICAgZmlsbDogXCIjRDFEMUQxXCIsXG4gICAgZmlsbFJ1bGU6IFwiZXZlbm9kZFwiLFxuICAgIGQ6IFwiTTcuOTY0IDUuMTg0QzcuOTc3IDUuMTIyIDggNS4wNjMgOCA1cy0uMDIyLS4xMjItLjAzNS0uMTg0Yy0uMDEtLjA0OC0uMDEtLjA5Ny0uMDI5LS4xNDQtLjAyOC0uMDY5LS4wNzgtLjEyOC0uMTI0LS4xOS0uMDI0LS4wMy0uMDM2LS4wNjgtLjA2NC0uMDk3LS4wMDEgMC0uMDAyIDAtLjAwMy0uMDAyLS4wMDItLjAwMS0uMDAyLS4wMDQtLjAwNC0uMDA2TDMuNjE1LjMwMmEuODc1Ljg3NSAwIDEgMC0xLjIzIDEuMjQ1TDUuODggNSAyLjM4NSA4LjQ1M2EuODc1Ljg3NSAwIDAgMCAxLjIzIDEuMjQ1TDcuNzQgNS42MjNjLjAwMi0uMDAyLjAwMi0uMDA1LjAwNC0uMDA2bC4wMDMtLjAwMmMuMDI4LS4wMy4wNC0uMDY2LjA2NC0uMDk4LjA0Ni0uMDYxLjA5Ny0uMTIuMTI0LS4xOS4wMTktLjA0Ni4wMTktLjA5NS4wMy0uMTQzWlwiLFxuICAgIGNsaXBSdWxlOiBcImV2ZW5vZGRcIlxuICB9KSk7XG59O1xuZXhwb3J0IGRlZmF1bHQgRm9yd2FyZEFycm93OyIsInZhciBfd2luZG93JHJlcXVpcmUsIF93aW5kb3csIF93aW5kb3ckcmVxdWlyZSRjYWxsLCBfd2luZG93JHJlcXVpcmUkY2FsbCQ7XG4vKlxuTm90ZSA6IE1vc3Qgb2YgdGhlIGNvZGUgcHJlc2VudCBoZXJlIGlzIGNvcGllZCBmcm9tIHRoZSBDQ1ggU2hhcmVTaGVldFxuU3BlY2lhbGx5IGZyb20gZmlsZXMgdmlzaWJpbGl0eS5qcyBhbmQgY29uc3RhbnRzLmpzXG4qL1xuaW1wb3J0IHsgQk9VTkRTIH0gZnJvbSBcIi4uL3V0aWxzL2NvbW1vblV0aWxzXCI7XG5leHBvcnQgY29uc3QgSE9TVCA9IChfd2luZG93JHJlcXVpcmUgPSAoX3dpbmRvdyA9IHdpbmRvdykucmVxdWlyZSkgPT09IG51bGwgfHwgX3dpbmRvdyRyZXF1aXJlID09PSB2b2lkIDAgPyB2b2lkIDAgOiAoX3dpbmRvdyRyZXF1aXJlJGNhbGwgPSBfd2luZG93JHJlcXVpcmUuY2FsbChfd2luZG93LCBcInV4cFwiKSkgPT09IG51bGwgfHwgX3dpbmRvdyRyZXF1aXJlJGNhbGwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IChfd2luZG93JHJlcXVpcmUkY2FsbCQgPSBfd2luZG93JHJlcXVpcmUkY2FsbC5ob3N0KSA9PT0gbnVsbCB8fCBfd2luZG93JHJlcXVpcmUkY2FsbCQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF93aW5kb3ckcmVxdWlyZSRjYWxsJC5uYW1lLnRvTG93ZXJDYXNlKCk7XG5leHBvcnQgY29uc3QgcHNBY3Rpb24gPSBIT1NUID09PSBcInBob3Rvc2hvcFwiID8gd2luZG93LnJlcXVpcmUoXCJwaG90b3Nob3BcIikuYWN0aW9uIDoge307XG5leHBvcnQgY29uc3QgcHNDb3JlID0gSE9TVCA9PT0gXCJwaG90b3Nob3BcIiA/IHdpbmRvdy5yZXF1aXJlKFwicGhvdG9zaG9wXCIpLmNvcmUgOiB7fTtcbmV4cG9ydCBjb25zdCBidXRsZXIgPSBIT1NUID09PSBcInBob3Rvc2hvcFwiID8gd2luZG93LnJlcXVpcmUoXCJwaG90b3Nob3BcIikuYnV0bGVyIDoge307XG5leHBvcnQgY29uc3QgUFNfRElBTE9HX0RFRkFVTFRfVEhFTUUgPSBcImRhcmtcIjtcbmV4cG9ydCBjb25zdCBQU19ESUFMT0dfUE9TSVRJT05fSEVJR0hUID0gMjU1O1xuZXhwb3J0IGNvbnN0IFBTX0RJQUxPR19QT1NJVElPTl9XSURUSCA9IDI5MDtcblxuLy9UTyBETzogcmV2aXNpdCB0aGlzIHZhbHVlXG5jb25zdCBQU19ESUFMT0dfUE9TSVRJT05fT0ZGU0VUX0ggPSA1MDtcbmNvbnN0IFBTX0RJQUxPR19QT1NJVElPTl9PRkZTRVRfViA9IDQ7XG5leHBvcnQgY29uc3QgUFNfRElBTE9HX1NJWkUgPSB7XG4gIGhlaWdodDogUFNfRElBTE9HX1BPU0lUSU9OX0hFSUdIVCxcbiAgd2lkdGg6IFBTX0RJQUxPR19QT1NJVElPTl9XSURUSFxufTtcblxuLy8gVGhpcyBpcyB0aGUgZWxlbWVudCBpZCBvZiB0aGUgdWkgYnV0dG9uIGluIFBTIHdoaWNoIGludm9rZSB0aGlzIHBhbmVsXG4vLyBDdXJyZW50bHkgdGhpcyBpcyBoYXJkY29kZWQsIHdlIHdpbGwgYmUgbWFraW5nIGl0IGR5bmFtaWMgaW4gZnV0dXJlXG5leHBvcnQgY29uc3QgUFNfVklFV19JRF9SRU5ERVJfVEFSR0VUID0gXCIkaW52dlwiO1xuZXhwb3J0IGNvbnN0IFBTX0RJQUxPR19CQVRDSF9DT05GSUcgPSBbe1xuICBfb2JqOiBcInVpSW5mb1wiLFxuICBfdGFyZ2V0OiB7XG4gICAgX2VudW06IFwib3JkaW5hbFwiLFxuICAgIF9yZWY6IFwiYXBwbGljYXRpb25cIixcbiAgICBfdmFsdWU6IFwidGFyZ2V0RW51bVwiXG4gIH0sXG4gIGNvbW1hbmQ6IFwiZ2V0Vmlld0luZm9cIixcbiAgcGFuZWw6IFwib3B0aW9uc1wiLFxuICB2aWV3SUQ6IFBTX1ZJRVdfSURfUkVOREVSX1RBUkdFVFxufV07XG5cbi8qKlxuICogQHJldHVybnMgY29vcmRpbmF0ZSBvZiB0aGUgc2hhcmUgYnV0dG9uXG4gKi9cbmV4cG9ydCBjb25zdCBfZ2V0Q1RBQnV0dG9uUG9zaXRpb24gPSBhc3luYyBmdW5jdGlvbiAoKSB7XG4gIHZhciBfYXBwJHZpZXc7XG4gIGNvbnN0IGNvbmZpZyA9IChhd2FpdCAocHNBY3Rpb24gPT09IG51bGwgfHwgcHNBY3Rpb24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IHBzQWN0aW9uLmJhdGNoUGxheShQU19ESUFMT0dfQkFUQ0hfQ09ORklHLCB7fSkpKSB8fCBbXTtcbiAgY29uc3QgYXBwID0gY29uZmlnID09PSBudWxsIHx8IGNvbmZpZyA9PT0gdm9pZCAwID8gdm9pZCAwIDogY29uZmlnWzBdO1xuICByZXR1cm4gYXBwID09PSBudWxsIHx8IGFwcCA9PT0gdm9pZCAwID8gdm9pZCAwIDogKF9hcHAkdmlldyA9IGFwcC52aWV3KSA9PT0gbnVsbCB8fCBfYXBwJHZpZXcgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hcHAkdmlldy5nbG9iYWxCb3VuZHM7XG59O1xuXG4vKipcbiAqIEByZXR1cm5zIGNvb3JkaW5hdGUgYXQgd2hpY2ggdGhlIGRpbGFvZyBuZWVkcyB0byBiZSByZW5kZXJlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gX2dldERpYWxvZ1JlbmRlckNvb3JkaW5hdGVzKGN0YUJ1dHRvbkNvb3JkaW5hdGVzLCBiYXNlU2l6ZSwgc2NhbGVGYWN0b3IgPSAxKSB7XG4gIGxldCBib3R0b207XG4gIGxldCBsZWZ0O1xuICBsZXQgcmlnaHQ7XG4gIGxldCB0b3A7XG4gIGNvbnN0IGNlbnRlckJ1dHRvbiA9IChjdGFCdXR0b25Db29yZGluYXRlcy5yaWdodCAtIGN0YUJ1dHRvbkNvb3JkaW5hdGVzLmxlZnQpIC8gMjtcblxuICAvLyBBZGp1c3QgcGl4ZWwtYmFzZWQgdmFsdWVzIHdpdGggT1MtbGV2ZWwgc2NhbGUgZmFjdG9yXG4gIGNvbnN0IGNlbnRlck9mZnNldCA9IFBTX0RJQUxPR19QT1NJVElPTl9PRkZTRVRfSCAqIHNjYWxlRmFjdG9yICsgY2VudGVyQnV0dG9uO1xuICBjb25zdCBzaXplID0ge1xuICAgIGhlaWdodDogYmFzZVNpemUuaGVpZ2h0ICogc2NhbGVGYWN0b3IsXG4gICAgd2lkdGg6IGJhc2VTaXplLndpZHRoICogc2NhbGVGYWN0b3JcbiAgfTtcbiAgYm90dG9tID0gY3RhQnV0dG9uQ29vcmRpbmF0ZXMuYm90dG9tICsgc2l6ZS5oZWlnaHQgKyBQU19ESUFMT0dfUE9TSVRJT05fT0ZGU0VUX1Y7XG4gIGxlZnQgPSBjdGFCdXR0b25Db29yZGluYXRlcy5sZWZ0ICsgY2VudGVyT2Zmc2V0IC0gc2l6ZS53aWR0aDtcbiAgcmlnaHQgPSBjdGFCdXR0b25Db29yZGluYXRlcy5sZWZ0ICsgY2VudGVyT2Zmc2V0O1xuICB0b3AgPSBjdGFCdXR0b25Db29yZGluYXRlcy5ib3R0b20gKyBQU19ESUFMT0dfUE9TSVRJT05fT0ZGU0VUX1Y7XG4gIHJldHVybiB7XG4gICAgYm90dG9tLFxuICAgIGxlZnQsXG4gICAgcmlnaHQsXG4gICAgdG9wXG4gIH07XG59XG5cbi8qKlxuICogQHJldHVybnMgY29vcmRpbmF0ZSBhdCB3aGljaCB0aGUgZGlhbG9nIG5lZWRzIHRvIGJlIHJlbmRlcmVkIGJhc2VkIG9uIGJ1dHRvbiBjb29yZGluYXRlcyBhbmQgc2NyZWVuIGJvdW5kYXJ5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBfZ2V0RGlhbG9nUmVuZGVyQ29vcmRpbmF0ZXNCb3VuZEJhc2VkKGN0YUJ1dHRvbkNvb3JkaW5hdGVzLCBiYXNlU2l6ZSwgc2NhbGVGYWN0b3IgPSAxLCBib3VuZHNGbGFnID0gMCkge1xuICBsZXQgYm90dG9tO1xuICBsZXQgbGVmdDtcbiAgbGV0IHJpZ2h0O1xuICBsZXQgdG9wO1xuICBjb25zdCBjZW50ZXJCdXR0b24gPSAoY3RhQnV0dG9uQ29vcmRpbmF0ZXMucmlnaHQgLSBjdGFCdXR0b25Db29yZGluYXRlcy5sZWZ0KSAvIDI7XG5cbiAgLy8gQWRqdXN0IHBpeGVsLWJhc2VkIHZhbHVlcyB3aXRoIE9TLWxldmVsIHNjYWxlIGZhY3RvclxuICBjb25zdCBjZW50ZXJPZmZzZXQgPSBQU19ESUFMT0dfUE9TSVRJT05fT0ZGU0VUX0ggKiBzY2FsZUZhY3RvciArIGNlbnRlckJ1dHRvbjtcbiAgY29uc3Qgc2l6ZSA9IHtcbiAgICBoZWlnaHQ6IGJhc2VTaXplLmhlaWdodCAqIHNjYWxlRmFjdG9yLFxuICAgIHdpZHRoOiBiYXNlU2l6ZS53aWR0aCAqIHNjYWxlRmFjdG9yXG4gIH07XG4gIHN3aXRjaCAoYm91bmRzRmxhZykge1xuICAgIGNhc2UgMDpcbiAgICAgIC8vRGlhbG9nIGZ1bGx5IGluc2lkZVxuICAgICAgYm90dG9tID0gY3RhQnV0dG9uQ29vcmRpbmF0ZXMuYm90dG9tICsgc2l6ZS5oZWlnaHQgKyBQU19ESUFMT0dfUE9TSVRJT05fT0ZGU0VUX1Y7XG4gICAgICBsZWZ0ID0gY3RhQnV0dG9uQ29vcmRpbmF0ZXMubGVmdCArIGNlbnRlck9mZnNldCAtIHNpemUud2lkdGg7XG4gICAgICByaWdodCA9IGN0YUJ1dHRvbkNvb3JkaW5hdGVzLmxlZnQgKyBjZW50ZXJPZmZzZXQ7XG4gICAgICB0b3AgPSBjdGFCdXR0b25Db29yZGluYXRlcy5ib3R0b20gKyBQU19ESUFMT0dfUE9TSVRJT05fT0ZGU0VUX1Y7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDI6XG4gICAgICAvL1JpZ2h0IG91dCBvZiBib3VuZHNcbiAgICAgIGJvdHRvbSA9IGN0YUJ1dHRvbkNvb3JkaW5hdGVzLmJvdHRvbSArIHNpemUuaGVpZ2h0ICsgUFNfRElBTE9HX1BPU0lUSU9OX09GRlNFVF9WO1xuICAgICAgbGVmdCA9IGN0YUJ1dHRvbkNvb3JkaW5hdGVzLmxlZnQgLSBzaXplLndpZHRoO1xuICAgICAgcmlnaHQgPSBjdGFCdXR0b25Db29yZGluYXRlcy5sZWZ0O1xuICAgICAgdG9wID0gY3RhQnV0dG9uQ29vcmRpbmF0ZXMuYm90dG9tICsgUFNfRElBTE9HX1BPU0lUSU9OX09GRlNFVF9WO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSA0OlxuICAgICAgLy9Cb3R0b20gb3V0IG9mIGJvdW5kc1xuICAgICAgYm90dG9tID0gY3RhQnV0dG9uQ29vcmRpbmF0ZXMudG9wIC0gUFNfRElBTE9HX1BPU0lUSU9OX09GRlNFVF9WO1xuICAgICAgbGVmdCA9IGN0YUJ1dHRvbkNvb3JkaW5hdGVzLmxlZnQgKyBjZW50ZXJPZmZzZXQgLSBzaXplLndpZHRoO1xuICAgICAgcmlnaHQgPSBjdGFCdXR0b25Db29yZGluYXRlcy5sZWZ0ICsgY2VudGVyT2Zmc2V0O1xuICAgICAgdG9wID0gY3RhQnV0dG9uQ29vcmRpbmF0ZXMudG9wIC0gUFNfRElBTE9HX1BPU0lUSU9OX09GRlNFVF9WIC0gc2l6ZS5oZWlnaHQ7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDY6XG4gICAgICAvL0JvdHRvbSBhbmQgUmlnaHQgb3V0IG9mIGJvdW5kc1xuICAgICAgYm90dG9tID0gY3RhQnV0dG9uQ29vcmRpbmF0ZXMudG9wIC0gUFNfRElBTE9HX1BPU0lUSU9OX09GRlNFVF9WO1xuICAgICAgbGVmdCA9IGN0YUJ1dHRvbkNvb3JkaW5hdGVzLmxlZnQgLSBzaXplLndpZHRoO1xuICAgICAgcmlnaHQgPSBjdGFCdXR0b25Db29yZGluYXRlcy5sZWZ0O1xuICAgICAgdG9wID0gY3RhQnV0dG9uQ29vcmRpbmF0ZXMudG9wIC0gUFNfRElBTE9HX1BPU0lUSU9OX09GRlNFVF9WIC0gc2l6ZS5oZWlnaHQ7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDg6XG4gICAgICAvL0xlZnQgb3V0IG9mIGJvdW5kc1xuICAgICAgYm90dG9tID0gY3RhQnV0dG9uQ29vcmRpbmF0ZXMuYm90dG9tICsgc2l6ZS5oZWlnaHQgKyBQU19ESUFMT0dfUE9TSVRJT05fT0ZGU0VUX1Y7XG4gICAgICBsZWZ0ID0gY3RhQnV0dG9uQ29vcmRpbmF0ZXMucmlnaHQ7XG4gICAgICByaWdodCA9IGN0YUJ1dHRvbkNvb3JkaW5hdGVzLnJpZ2h0ICsgc2l6ZS53aWR0aDtcbiAgICAgIHRvcCA9IGN0YUJ1dHRvbkNvb3JkaW5hdGVzLmJvdHRvbSArIFBTX0RJQUxPR19QT1NJVElPTl9PRkZTRVRfVjtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMTI6XG4gICAgICAvLzExMDAgOiBMZWZ0IGFuZCBCb3R0b20gb3V0IG9mIGJvdW5kc1xuICAgICAgYm90dG9tID0gY3RhQnV0dG9uQ29vcmRpbmF0ZXMudG9wIC0gUFNfRElBTE9HX1BPU0lUSU9OX09GRlNFVF9WO1xuICAgICAgbGVmdCA9IGN0YUJ1dHRvbkNvb3JkaW5hdGVzLnJpZ2h0O1xuICAgICAgcmlnaHQgPSBjdGFCdXR0b25Db29yZGluYXRlcy5yaWdodCArIHNpemUud2lkdGg7XG4gICAgICB0b3AgPSBjdGFCdXR0b25Db29yZGluYXRlcy50b3AgLSBQU19ESUFMT0dfUE9TSVRJT05fT0ZGU0VUX1YgLSBzaXplLmhlaWdodDtcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICBib3R0b20gPSAwO1xuICAgICAgbGVmdCA9IDA7XG4gICAgICByaWdodCA9IDA7XG4gICAgICB0b3AgPSAwO1xuICAgICAgYnJlYWs7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBib3R0b20sXG4gICAgbGVmdCxcbiAgICByaWdodCxcbiAgICB0b3BcbiAgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0luU2NyZWVuQm91bmRhcnkoc2NyZWVuQ29vcmRpbmF0ZXMgPSB7fSwgZGlhbG9nQ29vcmRpbmF0ZXMgPSB7fSkge1xuICBjb25zdCB7XG4gICAgYm90dG9tLFxuICAgIGxlZnQsXG4gICAgcmlnaHQsXG4gICAgdG9wXG4gIH0gPSBzY3JlZW5Db29yZGluYXRlcztcbiAgY29uc3Qge1xuICAgIGJvdHRvbTogZEJvdHRvbSxcbiAgICBsZWZ0OiBkTGVmdCxcbiAgICByaWdodDogZFJpZ2h0LFxuICAgIHRvcDogZFRvcFxuICB9ID0gZGlhbG9nQ29vcmRpbmF0ZXM7XG4gIHJldHVybiBkTGVmdCA+PSBsZWZ0ICYmIGRSaWdodCA8PSByaWdodCAmJiBkVG9wID49IHRvcCAmJiBkQm90dG9tIDw9IGJvdHRvbTtcbn1cbmZ1bmN0aW9uIGlzRW1wdHlEaWFsb2dDb29yZGluYXRlcyhkaWFsb2dDb29yZGluYXRlcyA9IHt9KSB7XG4gIGlmICghT2JqZWN0LmtleXMoZGlhbG9nQ29vcmRpbmF0ZXMpLmxlbmd0aCkgcmV0dXJuIHRydWU7XG4gIGNvbnN0IHtcbiAgICBib3R0b20sXG4gICAgbGVmdCxcbiAgICByaWdodCxcbiAgICB0b3BcbiAgfSA9IGRpYWxvZ0Nvb3JkaW5hdGVzO1xuICByZXR1cm4gdG9wID09PSAwICYmIHJpZ2h0ID09PSAwICYmIGJvdHRvbSA9PT0gMCAmJiBsZWZ0ID09PSAwO1xufVxuZnVuY3Rpb24gZ2V0Qm91bmRzRmxhZyhzY3JlZW5Db29yZGluYXRlcyA9IHt9LCBkaWFsb2dDb29yZGluYXRlcyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICBib3R0b20sXG4gICAgbGVmdCxcbiAgICByaWdodCxcbiAgICB0b3BcbiAgfSA9IHNjcmVlbkNvb3JkaW5hdGVzO1xuICBjb25zdCB7XG4gICAgYm90dG9tOiBkQm90dG9tLFxuICAgIGxlZnQ6IGRMZWZ0LFxuICAgIHJpZ2h0OiBkUmlnaHQsXG4gICAgdG9wOiBkVG9wXG4gIH0gPSBkaWFsb2dDb29yZGluYXRlcztcbiAgbGV0IGJvdW5kc0ZsYWcgPSAwO1xuICBpZiAoZFRvcCA8IHRvcCkgYm91bmRzRmxhZyA9IGJvdW5kc0ZsYWcgfCBCT1VORFMuVE9QO1xuICBpZiAoZFJpZ2h0ID4gcmlnaHQpIGJvdW5kc0ZsYWcgPSBib3VuZHNGbGFnIHwgQk9VTkRTLlJJR0hUO1xuICBpZiAoZEJvdHRvbSA+IGJvdHRvbSkgYm91bmRzRmxhZyA9IGJvdW5kc0ZsYWcgfCBCT1VORFMuQk9UVE9NO1xuICBpZiAoZExlZnQgPCBsZWZ0KSBib3VuZHNGbGFnID0gYm91bmRzRmxhZyB8IEJPVU5EUy5MRUZUO1xuICByZXR1cm4gYm91bmRzRmxhZztcbn1cbmZ1bmN0aW9uIF9nZXRNaWRwb2ludChtaW4sIG1heCkge1xuICByZXR1cm4gbWluICsgMC41ICogKG1heCAtIG1pbik7XG59XG5leHBvcnQgZnVuY3Rpb24gX2dldE93bmVyU2NyZWVuKHNjcmVlbnMsIGN0YUJ1dHRvbkNvb3JkaW5hdGVzKSB7XG4gIGNvbnN0IGN0YU1pZFBvaW50SCA9IF9nZXRNaWRwb2ludChjdGFCdXR0b25Db29yZGluYXRlcy5sZWZ0LCBjdGFCdXR0b25Db29yZGluYXRlcy5yaWdodCk7XG4gIGNvbnN0IGN0YU1pZFBvaW50ViA9IF9nZXRNaWRwb2ludChjdGFCdXR0b25Db29yZGluYXRlcy50b3AsIGN0YUJ1dHRvbkNvb3JkaW5hdGVzLmJvdHRvbSk7XG4gIGNvbnN0IG93bmVyU2NyZWVuID0gc2NyZWVucy5maW5kKGZ1bmN0aW9uIChzY3JlZW4pIHtcbiAgICByZXR1cm4gY3RhTWlkUG9pbnRIID49IHNjcmVlbi5nbG9iYWxCb3VuZHMubGVmdCAmJiBjdGFNaWRQb2ludEggPD0gc2NyZWVuLmdsb2JhbEJvdW5kcy5yaWdodCAmJiBjdGFNaWRQb2ludFYgPj0gc2NyZWVuLmdsb2JhbEJvdW5kcy50b3AgJiYgY3RhTWlkUG9pbnRWIDw9IHNjcmVlbi5nbG9iYWxCb3VuZHMuYm90dG9tO1xuICB9KTtcbiAgaWYgKCFvd25lclNjcmVlbikge1xuICAgIGNvbnNvbGUud2FybihcIkNvdWxkIG5vdCBmaW5kIHRoZSBvd25lciBzY3JlZW5cIik7XG4gIH1cblxuICAvLyBBZGQgZmlyc3Qgc2NyZWVuIGF0IHRoZSBkZWZhdWx0XG4gIHJldHVybiBvd25lclNjcmVlbiB8fCBzY3JlZW5zWzBdO1xufVxuXG4vKipcbiAqIEByZXR1cm5zXG4gKiBkaWFsb2dDb29yZGluYXRlczogY29vcmRpbmF0ZSBhdCB3aGljaCB0aGUgZGlsYW9nIG5lZWRzIHRvIGJlIHJlbmRlcmVkXG4gKiBjdGFCdXR0b25Db29yZGluYXRlczogY29vcmRpbmF0ZSBvZiB0aGUgY29udHJvbCBidXR0b24gd2hpY2ggdHJpZ2dlcmVkIHRoZSBkaWFsb2dcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFJlbmRlckNvb3JkaW5hdGUoYmFzZVNpemUgPSBQU19ESUFMT0dfU0laRSkge1xuICBjb25zdCBjdGFCdXR0b25Db29yZGluYXRlcyA9IGF3YWl0IF9nZXRDVEFCdXR0b25Qb3NpdGlvbigpO1xuICBjb25zdCBzY3JlZW5zID0gYXdhaXQgcHNDb3JlLmdldERpc3BsYXlDb25maWd1cmF0aW9uKHt9KTtcbiAgY29uc3QgY3RhU2NyZWVuID0gX2dldE93bmVyU2NyZWVuKHNjcmVlbnMsIGN0YUJ1dHRvbkNvb3JkaW5hdGVzKTtcbiAgY29uc3Qgc2NyZWVuQ29vcmRpbmF0ZXMgPSBjdGFTY3JlZW4gPT09IG51bGwgfHwgY3RhU2NyZWVuID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjdGFTY3JlZW4uZ2xvYmFsV29ya2luZ0JvdW5kcztcbiAgY29uc3QgaXNNYWMgPSBuYXZpZ2F0b3IucGxhdGZvcm0gPT09IFwiZGFyd2luXCI7XG4gIGNvbnN0IHNjYWxlRmFjdG9yID0gaXNNYWMgPyAxIDogY3RhU2NyZWVuLnNjYWxlRmFjdG9yO1xuXG4gIC8vIERldGVybWluZSBkaWFsb2cgY29vcmRpbmF0ZXMgYmFzZWQgb24gQ1RBIGJ1dHRvbiBwb3NpdGlvblxuICBsZXQgZGlhbG9nQ29vcmRpbmF0ZXMgPSBfZ2V0RGlhbG9nUmVuZGVyQ29vcmRpbmF0ZXMoY3RhQnV0dG9uQ29vcmRpbmF0ZXMsIGJhc2VTaXplLCBzY2FsZUZhY3Rvcik7XG5cbiAgLy8gTEFTVExZIENIRUNLIFRIQVQgVEhFIENPT1JESU5BVEVTIEFSRSBJTiBTQ1JFRU4gQk9VTkRBUlksIFdJTEwgQ1JBU0ggUFMgSU4gTk9UIElOIEJPVU5EQVJZXG4gIGlmIChpc0luU2NyZWVuQm91bmRhcnkoc2NyZWVuQ29vcmRpbmF0ZXMsIGRpYWxvZ0Nvb3JkaW5hdGVzKSkge1xuICAgIHJldHVybiB7XG4gICAgICBkaWFsb2dDb29yZGluYXRlcyxcbiAgICAgIGN0YUJ1dHRvbkNvb3JkaW5hdGVzXG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBib3VuZHNGbGFnID0gZ2V0Qm91bmRzRmxhZyhzY3JlZW5Db29yZGluYXRlcywgZGlhbG9nQ29vcmRpbmF0ZXMpO1xuICAgIC8vIERldGVybWluZSBkaWFsb2cgY29vcmRpbmF0ZXMgYmFzZWQgb24gQ1RBIGJ1dHRvbiBwb3NpdGlvbiBhbmQgc2NyZWVuIGJvdW5kYXJ5XG4gICAgbGV0IHVwZGF0ZWREaWFsb2dDb29yZGluYXRlcyA9IF9nZXREaWFsb2dSZW5kZXJDb29yZGluYXRlc0JvdW5kQmFzZWQoY3RhQnV0dG9uQ29vcmRpbmF0ZXMsIGJhc2VTaXplLCBzY2FsZUZhY3RvciwgYm91bmRzRmxhZyk7XG4gICAgLy8gQUxXQVlTIFJFVFVSTiBDVEEgQ09PUkRJTkFURVMgRk9SIE9VVCBPRiBESUFMT0cgQ0xPU0UgVEVTVElOR1xuICAgIGlmIChpc0VtcHR5RGlhbG9nQ29vcmRpbmF0ZXModXBkYXRlZERpYWxvZ0Nvb3JkaW5hdGVzKSkgcmV0dXJuIHtcbiAgICAgIGN0YUJ1dHRvbkNvb3JkaW5hdGVzXG4gICAgfTtcbiAgICByZXR1cm4ge1xuICAgICAgZGlhbG9nQ29vcmRpbmF0ZXM6IHVwZGF0ZWREaWFsb2dDb29yZGluYXRlcyxcbiAgICAgIGN0YUJ1dHRvbkNvb3JkaW5hdGVzXG4gICAgfTtcbiAgfVxufVxuY29uc3QgZ2V0TmVzdGVkID0gZnVuY3Rpb24gKG9iaiwgLi4uYXJncykge1xuICByZXR1cm4gYXJncy5yZWR1Y2UoZnVuY3Rpb24gKG9iaiwgbGV2ZWwpIHtcbiAgICByZXR1cm4gb2JqICYmIG9ialtsZXZlbF07XG4gIH0sIG9iaik7XG59O1xuZXhwb3J0IGNvbnN0IGxvZ1RvSW5nZXN0ID0gZnVuY3Rpb24gKG9iaiwgcHJvcHMsIHJlZmVycmVyID0gdW5kZWZpbmVkLCBjb3VudCA9IHVuZGVmaW5lZCwgdmFsdWUgPSB1bmRlZmluZWQsIHNpemUgPSB1bmRlZmluZWQsIGV4dGVuc2lvbiA9IHVuZGVmaW5lZCkge1xuICBsZXQgaW5uZXJQcm9wcyA9IHByb3BzIGluc3RhbmNlb2YgQXJyYXkgPyBbLi4ucHJvcHNdIDogW3Byb3BzXTtcbiAgLy8gUmV0dXJucyB0aGUgaW5uZXIgbW9zdCBwcm9wJ3MgdmFsdWUgb3IgdW5kZWZpbmVkIGlmIG9iaiBvciBhbnkgcHJvcCBpbiB0aGUgbmVzdGVkIGNoYWluIGlzIG5vdCBwcmVzZW50XG4gIGxldCBkYXRhID0gZ2V0TmVzdGVkKG9iaiwgLi4uaW5uZXJQcm9wcyk7XG4gIGlmICghZGF0YSkge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAocmVmZXJyZXIpIHtcbiAgICBkYXRhW1wiZXZlbnQucmVmZXJyZXJcIl0gPSByZWZlcnJlcjtcbiAgfVxuICBpZiAoY291bnQpIHtcbiAgICBkYXRhW1wiZXZlbnQuY291bnRcIl0gPSBjb3VudDtcbiAgfVxuICBpZiAodmFsdWUpIHtcbiAgICBkYXRhW1wiZXZlbnQudmFsdWVcIl0gPSB2YWx1ZTtcbiAgfVxuICBpZiAoc2l6ZSkge1xuICAgIGRhdGFbXCJjb250ZW50LnNpemVcIl0gPSBzaXplO1xuICB9XG4gIGlmIChleHRlbnNpb24pIHtcbiAgICBkYXRhW1wiY29udGVudC5leHRlbnNpb25cIl0gPSBleHRlbnNpb247XG4gIH1cbiAgcHNDb3JlLmxvZ0R1bmFtaXNFdmVudChkYXRhKTtcbn07XG5cbi8qKlxuICogR2V0IGZlYXR1cmUgZmxhZyBzdGF0dXMgZnJvbSBQaG90b3Nob3AgaG9zdCBhcHBsaWNhdGlvblxuICogQHBhcmFtIHtzdHJpbmd9IGZsYWdOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGZlYXR1cmUgZmxhZ1xuICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IC0gVGhlIGN1cnJlbnQgc3RhdHVzIG9mIHRoZSBmZWF0dXJlIGZsYWdcbiAqL1xuZXhwb3J0IGNvbnN0IGdldEZlYXR1cmVGbGFnU3RhdHVzID0gYXN5bmMgZnVuY3Rpb24gKGZsYWdOYW1lKSB7XG4gIHRyeSB7XG4gICAgaWYgKEhPU1QgPT09IFwicGhvdG9zaG9wXCIgJiYgcHNBY3Rpb24pIHtcbiAgICAgIHZhciBfcmVzdWx0JDtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHBzQWN0aW9uLmJhdGNoUGxheShbe1xuICAgICAgICBfb2JqOiBcImZlYXR1cmVJbmZvXCIsXG4gICAgICAgIF90YXJnZXQ6IHtcbiAgICAgICAgICBfcmVmOiBcImFwcGxpY2F0aW9uXCIsXG4gICAgICAgICAgX2VudW06IFwib3JkaW5hbFwiLFxuICAgICAgICAgIF92YWx1ZTogXCJ0YXJnZXRFbnVtXCJcbiAgICAgICAgfSxcbiAgICAgICAgY29tbWFuZDogXCJnZXRGZWF0dXJlQWN0aXZlXCIsXG4gICAgICAgIGZlYXR1cmU6IGZsYWdOYW1lXG4gICAgICB9XSwge30pO1xuICAgICAgcmV0dXJuIChyZXN1bHQgPT09IG51bGwgfHwgcmVzdWx0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiAoX3Jlc3VsdCQgPSByZXN1bHRbMF0pID09PSBudWxsIHx8IF9yZXN1bHQkID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfcmVzdWx0JC5hY3RpdmUpID09PSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS53YXJuKCdGYWlsZWQgdG8gZ2V0IGZlYXR1cmUgZmxhZyBzdGF0dXM6JywgZXJyb3IpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufTsiLCJmdW5jdGlvbiBfZXh0ZW5kcygpIHsgcmV0dXJuIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiA/IE9iamVjdC5hc3NpZ24uYmluZCgpIDogZnVuY3Rpb24gKG4pIHsgZm9yICh2YXIgZSA9IDE7IGUgPCBhcmd1bWVudHMubGVuZ3RoOyBlKyspIHsgdmFyIHQgPSBhcmd1bWVudHNbZV07IGZvciAodmFyIHIgaW4gdCkgKHt9KS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIHIpICYmIChuW3JdID0gdFtyXSk7IH0gcmV0dXJuIG47IH0sIF9leHRlbmRzLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7IH1cbmltcG9ydCBSZWFjdCwgeyB1c2VFZmZlY3QsIHVzZVN0YXRlIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBNZW51SXRlbSB9IGZyb20gXCIuL01lbnVJdGVtXCI7XG5pbXBvcnQgSW52aXRlIGZyb20gXCIuL2ljb25zL0ludml0ZVwiO1xuaW1wb3J0IENoYXQgZnJvbSBcIi4vaWNvbnMvQ2hhdFwiO1xuaW1wb3J0IFNsYWNrIGZyb20gXCIuL2ljb25zL1NsYWNrXCI7XG5pbXBvcnQgVGVhbXMgZnJvbSBcIi4vaWNvbnMvVGVhbXNcIjtcbmltcG9ydCBTZW5kVG9BcHBzIGZyb20gXCIuL2ljb25zL1NlbmRUb0FwcHNcIjtcbmltcG9ydCBRdWlja0V4cG9ydCBmcm9tIFwiLi9pY29ucy9RdWlja0V4cG9ydFwiO1xuaW1wb3J0IEFuaW1hdGVJbkZpcmVmbHkgZnJvbSBcIi4vaWNvbnMvQW5pbWF0ZUluRmlyZWZseVwiO1xuaW1wb3J0IHsgSU5WSVRFX1RPX0VESVRfTUVOVSwgU0hBUkVfRk9SX1JFVklFV19NRU5VLCBTSEFSRV9WSUFfU0xBQ0ssIFNIQVJFX1ZJQV9URUFNUywgTUVOVV9BQ1RJT04sIExPQ0FMX1NIQVJJTkcsIFFVSUNLX0VYUE9SVCwgQU5JTUFURV9JTl9GSVJFRkxZLCBpc01hYyB9IGZyb20gXCIuLi91dGlscy9jb21tb25VdGlsc1wiO1xuaW1wb3J0IHsgbG9jYWxpemUgfSBmcm9tIFwiLi4vdXRpbHMvbmxzXCI7XG5pbXBvcnQgXCIuL2Nzcy9zdHlsZS5jc3NcIjtcbmltcG9ydCBGb3J3YXJkQXJyb3cgZnJvbSBcIi4vaWNvbnMvRm9yd2FyZEFycm93XCI7XG5pbXBvcnQgeyBsb2dUb0luZ2VzdCB9IGZyb20gXCIuLi9ob3N0L3Bob3Rvc2hvcFwiO1xuY29uc3Qgc2hlbGwgPSByZXF1aXJlKFwidXhwXCIpLnNoZWxsO1xuY29uc3Qgc2hhcmVQYW5lbEluZ2VzdCA9IHJlcXVpcmUoXCIuLi9pbmdlc3Qvc2hhcmVQYW5lbEluZ2VzdC5qc29uXCIpO1xuZXhwb3J0IGNvbnN0IFNoYXJlTWVudSA9IGZ1bmN0aW9uIChwcm9wcykge1xuICBjb25zdCBbaW52aXRlVGl0bGVTdHIsIHNldEludml0ZVRpdGxlU3RyXSA9IHVzZVN0YXRlKFwiXCIpO1xuICBjb25zdCBbaW52aXRlRGVzY1N0ciwgc2V0SW52aXRlRGVzY1N0cl0gPSB1c2VTdGF0ZShcIlwiKTtcbiAgY29uc3QgW3Jldmlld1RpdGxlU3RyLCBzZXRSZXZpZXdUaXRsZVN0cl0gPSB1c2VTdGF0ZShcIlwiKTtcbiAgY29uc3QgW3Jldmlld0Rlc2NTdHIsIHNldFJldmlld0Rlc2NTdHJdID0gdXNlU3RhdGUoXCJcIik7XG4gIGNvbnN0IFtyZXZpZXdEaXNhYmxlZERlc2NTdHIsIHNldFJldmlld0Rpc2FibGVkRGVzY1N0cl0gPSB1c2VTdGF0ZShcIlwiKTtcbiAgY29uc3QgW3F1aWNrRXhwb3J0Rm9ybWF0LCBzZXRRdWlja0V4cG9ydEZvcm1hdF0gPSB1c2VTdGF0ZShcIlwiKTtcbiAgY29uc3QgaXNSZXZpZXdEaXNhYmxlZCA9IHByb3BzLmlzUmV2aWV3RGlzYWJsZWQ7XG4gIGNvbnN0IHBhbmVsSG9zdCA9IHdpbmRvdy5zaGFyZVBhbmVsSG9zdDtcbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICAvLyBUaGUgYmV0dGVyIHdheSB0byBoYW5kbGUgbG9jYWxpemF0aW9uIGlzIHRvIGhhdmUgc3VwcG9ydCBpbiBwbHVnaW4gaXRzZWxmLlxuICAgIC8vIEJ1dCBjdXJyZW50bHkgd2UgYXJlIHVzaW5nIGNsaWVudCBhcGkgdG8gZ2V0IGxvY2FsaXplZCBzdHJpbmdzLlxuICAgIGlmIChwYW5lbEhvc3QpIHtcbiAgICAgIHNldEludml0ZVRpdGxlU3RyKGxvY2FsaXplKCdJTlZJVEVfVElUTEUnKSk7XG4gICAgICBzZXRJbnZpdGVEZXNjU3RyKGxvY2FsaXplKCdJTlZJVEVfREVTQ1JJUFRJT04nKSk7XG4gICAgICBzZXRSZXZpZXdUaXRsZVN0cihsb2NhbGl6ZSgnUkVWSUVXX1RJVExFJykpO1xuICAgICAgc2V0UmV2aWV3RGVzY1N0cihsb2NhbGl6ZSgnUkVWSUVXX0RFU0NSSVBUSU9OJykpO1xuICAgICAgc2V0UmV2aWV3RGlzYWJsZWREZXNjU3RyKGxvY2FsaXplKCdSRVZJRVdfRElTQUJMRURfREVTQ1JJUFRJT04nKSk7XG4gICAgfVxuICB9LCBbXSk7XG4gIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHBhbmVsSG9zdCAmJiBwcm9wcy52aXNpYmxlKSB7XG4gICAgICBjb25zdCBmb3JtYXQgPSBwYW5lbEhvc3QuZ2V0RXhwb3J0UHJlZmVyZW5jZSgpO1xuICAgICAgc2V0UXVpY2tFeHBvcnRGb3JtYXQoZm9ybWF0KTtcbiAgICB9XG4gIH0sIFtwcm9wcy52aXNpYmxlXSk7XG4gIGNvbnN0IGhhbmRsZU1lbnVDaGFuZ2UgPSBmdW5jdGlvbiAodmFsKSB7XG4gICAgaWYgKHZhbCA9PSBNRU5VX0FDVElPTi5SRVZJRVcpIHtcbiAgICAgIHByb3BzLmNsb3NlRGlhbG9nKCk7XG4gICAgICBwYW5lbEhvc3QgPT09IG51bGwgfHwgcGFuZWxIb3N0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBwYW5lbEhvc3Qub25SZXZpZXcoKTtcbiAgICB9IGVsc2UgaWYgKHZhbCA9PSBNRU5VX0FDVElPTi5JTlZJVEUpIHtcbiAgICAgIHByb3BzLmNsb3NlRGlhbG9nKCk7XG4gICAgICBwYW5lbEhvc3QgPT09IG51bGwgfHwgcGFuZWxIb3N0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBwYW5lbEhvc3Qub25JbnZpdGUoKTtcbiAgICB9IGVsc2UgaWYgKHZhbCA9PSBNRU5VX0FDVElPTi5TTEFDSykge1xuICAgICAgLy9wcm9wcy5jbG9zZURpYWxvZygpO1xuICAgICAgcHJvcHMuc2V0U2xhY2tQYW5lbEFjdGl2ZSghcHJvcHMuaXNTbGFja1BhbmVsQWN0aXZlKTtcbiAgICB9IGVsc2UgaWYgKHZhbCA9PSBNRU5VX0FDVElPTi5URUFNUykge1xuICAgICAgLy8gVE9ETzogSW1wbGVtZW50IFRlYW1zIHNoYXJlXG4gICAgfSBlbHNlIGlmICh2YWwgPT0gTUVOVV9BQ1RJT04uTE9DQUxTSEFSSU5HKSB7XG4gICAgICBwcm9wcy5zZXRMb2NhbFNoYXJpbmdQYW5lbEFjdGl2ZSghcHJvcHMuaXNMb2NhbFNoYXJpbmdQYW5lbEFjdGl2ZSk7XG4gICAgICBsb2dUb0luZ2VzdChzaGFyZVBhbmVsSW5nZXN0W1wibG9jYWxfc2hhcmluZ1wiXSwgXCJzaG93XCIpO1xuICAgIH0gZWxzZSBpZiAodmFsID09IE1FTlVfQUNUSU9OLlFVSUNLRVhQT1JUKSB7XG4gICAgICBwcm9wcy5jbG9zZURpYWxvZygpO1xuICAgICAgcGFuZWxIb3N0LnF1aWNrRXhwb3J0QXMoKTtcbiAgICB9IGVsc2UgaWYgKHZhbCA9PSBNRU5VX0FDVElPTi5BTklNQVRFSU5GSVJFRkxZKSB7XG4gICAgICBwcm9wcy5jbG9zZURpYWxvZygpO1xuICAgICAgbG9nVG9Jbmdlc3Qoc2hhcmVQYW5lbEluZ2VzdFtcImFuaW1hdGVfaW5fZmlyZWZseVwiXSwgXCJjbGlja1wiKTtcbiAgICAgIHBhbmVsSG9zdCA9PT0gbnVsbCB8fCBwYW5lbEhvc3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHBhbmVsSG9zdC5hbmltYXRlSW5GaXJlZmx5KCk7XG4gICAgfVxuICB9O1xuXG4gIC8vIE5vdGU6IGNhbid0IHVzZSBzcC1tZW51IGN1cnJlbnRseSBhcyBpdCBoYXMgdGhlIGJsdWUgdGljayBnZXR0aW5nIGRpc3BsYXllZCB3aGVuIGEgbWVudSBpdGVtXG4gIC8vIGlzIHNlbGVjdGVkIGFuZCB0aGVyZSBpcyBubyB3YXkgdG8gZ2V0IHJpZCBvZiB0aGF0IHJpZ2h0IG5vdy5cbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIG51bGwsIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3AtbWVudS1pdGVtXCIsIHtcbiAgICBcImRhdGEtbWVudVwiOiBJTlZJVEVfVE9fRURJVF9NRU5VLFxuICAgIG9uQ2xpY2s6IGZ1bmN0aW9uICgpIHtcbiAgICAgIGhhbmRsZU1lbnVDaGFuZ2UoTUVOVV9BQ1RJT04uSU5WSVRFKTtcbiAgICB9XG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KE1lbnVJdGVtLCB7XG4gICAgZGlzYWJsZWQ6IGZhbHNlLFxuICAgIHRpdGxlU3RyOiBpbnZpdGVUaXRsZVN0cixcbiAgICBkZXNjU3RyOiBpbnZpdGVEZXNjU3RyLFxuICAgIGxlZnRJY29uOiBJbnZpdGVcbiAgfSkpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwLW1lbnUtaXRlbVwiLCBfZXh0ZW5kcyh7XG4gICAgXCJkYXRhLW1lbnVcIjogU0hBUkVfRk9SX1JFVklFV19NRU5VXG4gIH0sIGlzUmV2aWV3RGlzYWJsZWQgPyB7XG4gICAgZGlzYWJsZWQ6IHRydWVcbiAgfSA6IHt9LCB7XG4gICAgb25DbGljazogZnVuY3Rpb24gKCkge1xuICAgICAgIWlzUmV2aWV3RGlzYWJsZWQgJiYgaGFuZGxlTWVudUNoYW5nZShNRU5VX0FDVElPTi5SRVZJRVcpO1xuICAgIH1cbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KE1lbnVJdGVtLCB7XG4gICAgZGlzYWJsZWQ6IGlzUmV2aWV3RGlzYWJsZWQsXG4gICAgdGl0bGVTdHI6IHJldmlld1RpdGxlU3RyLFxuICAgIGRpc2FibGVkRGVzY1N0cjogcmV2aWV3RGlzYWJsZWREZXNjU3RyLFxuICAgIGRlc2NTdHI6IHJldmlld0Rlc2NTdHIsXG4gICAgbGVmdEljb246IENoYXRcbiAgfSkpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwLWRpdmlkZXJcIiwgbnVsbCksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3AtbWVudS1pdGVtXCIsIHtcbiAgICBcImRhdGEtbWVudVwiOiBRVUlDS19FWFBPUlQsXG4gICAgb25DbGljazogZnVuY3Rpb24gKCkge1xuICAgICAgaGFuZGxlTWVudUNoYW5nZShNRU5VX0FDVElPTi5RVUlDS0VYUE9SVCk7XG4gICAgfVxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChNZW51SXRlbSwge1xuICAgIGRpc2FibGVkOiBmYWxzZSxcbiAgICB0aXRsZVN0cjogYCR7bG9jYWxpemUoJ1FVSUNLX0VYUE9SVF9USVRMRScpfSAke3F1aWNrRXhwb3J0Rm9ybWF0fWAsXG4gICAgZGVzY1N0cjogbG9jYWxpemUoJ1FVSUNLX0VYUE9SVF9ERVNDUklQVElPTicpLFxuICAgIGxlZnRJY29uOiBRdWlja0V4cG9ydFxuICB9KSksIHByb3BzLmlzQW5pbWF0ZUluRmlyZWZseUVuYWJsZWQgJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcC1tZW51LWl0ZW1cIiwge1xuICAgIFwiZGF0YS1tZW51XCI6IEFOSU1BVEVfSU5fRklSRUZMWSxcbiAgICBvbkNsaWNrOiBmdW5jdGlvbiAoKSB7XG4gICAgICBoYW5kbGVNZW51Q2hhbmdlKE1FTlVfQUNUSU9OLkFOSU1BVEVJTkZJUkVGTFkpO1xuICAgIH1cbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoTWVudUl0ZW0sIHtcbiAgICBkaXNhYmxlZDogZmFsc2UsXG4gICAgdGl0bGVTdHI6IGxvY2FsaXplKCdBTklNQVRFX0lOX0ZJUkVGTFlfVElUTEUnKSxcbiAgICBkZXNjU3RyOiBsb2NhbGl6ZShcIkFOSU1BVEVfSU5fRklSRUZMWV9ERVNDUklQVElPTlwiKSxcbiAgICBsZWZ0SWNvbjogQW5pbWF0ZUluRmlyZWZseVxuICB9KSksIGZhbHNlICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3AtbWVudS1pdGVtXCIsIHtcbiAgICBcImRhdGEtbWVudVwiOiBTSEFSRV9WSUFfU0xBQ0ssXG4gICAgb25DbGljazogZnVuY3Rpb24gKCkge1xuICAgICAgaGFuZGxlTWVudUNoYW5nZShNRU5VX0FDVElPTi5TTEFDSyk7XG4gICAgfVxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChNZW51SXRlbSwge1xuICAgIGRpc2FibGVkOiBmYWxzZSxcbiAgICB0aXRsZVN0cjogbG9jYWxpemUoJ1NMQUNLX1RJVExFJyksXG4gICAgZGVzY1N0cjogbG9jYWxpemUoXCJTTEFDS19ERVNDUklQVElPTlwiKSxcbiAgICBsZWZ0SWNvbjogU2xhY2tcbiAgfSkpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwLW1lbnUtaXRlbVwiLCB7XG4gICAgXCJkYXRhLW1lbnVcIjogTE9DQUxfU0hBUklORyxcbiAgICBvbk1vdXNlRG93bjogZnVuY3Rpb24gKCkge1xuICAgICAgLy8gVXNpbmcgb25Nb3VzZURvd24gaW5zdGVhZCBvZiBvbkNsaWNrIGJlY2F1c2UgaW50ZXJtaXR0ZW50bHkgdGhlIGJ1dHRvbiBsb3NlcyBmb2N1c1xuICAgICAgLy8gaW1tZWRpYXRlbHkgYWZ0ZXIgZ2FpbmluZyBpdCAoZm9jdXMgLT4gYmx1ciksIHdoaWNoIHByZXZlbnRzIG9uQ2xpY2sgZnJvbSBmaXJpbmcuXG4gICAgICAvLyBvbk1vdXNlRG93biBleGVjdXRlcyBiZWZvcmUgZm9jdXMgY2FuIGJlIHN0b2xlbiwgZW5zdXJpbmcgdGhlIGFjdGlvbiBydW5zLlxuICAgICAgaGFuZGxlTWVudUNoYW5nZShNRU5VX0FDVElPTi5MT0NBTFNIQVJJTkcpO1xuICAgIH1cbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogXCJtZW51LWNvbnRhaW5lclwiXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KE1lbnVJdGVtLCB7XG4gICAgZGlzYWJsZWQ6IGZhbHNlLFxuICAgIHRpdGxlU3RyOiBsb2NhbGl6ZSgnU0VORF9UT19BUFBTX1RJVExFJyksXG4gICAgZGVzY1N0cjogbG9jYWxpemUoJ1NFTkRfVE9fQVBQU19ERVNDUklQVElPTicpLFxuICAgIGxlZnRJY29uOiBTZW5kVG9BcHBzXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChGb3J3YXJkQXJyb3csIHtcbiAgICBjbGFzc05hbWU6IFwiaWNvbi1zdHlsZVwiXG4gIH0pKSksIGZhbHNlICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3AtbWVudS1pdGVtXCIsIHtcbiAgICBcImRhdGEtbWVudVwiOiBTSEFSRV9WSUFfVEVBTVMsXG4gICAgb25DbGljazogZnVuY3Rpb24gKCkge1xuICAgICAgaGFuZGxlTWVudUNoYW5nZShNRU5VX0FDVElPTi5URUFNUyk7XG4gICAgfVxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChNZW51SXRlbSwge1xuICAgIGRpc2FibGVkOiBmYWxzZSxcbiAgICB0aXRsZVN0cjogXCJTaGFyZSB2aWEgVGVhbXNcIixcbiAgICBkZXNjU3RyOiBcIlNoYXJlIHlvdXIgd29ya3MgdG8gVGVhbXNcIixcbiAgICBsZWZ0SWNvbjogVGVhbXNcbiAgfSkpKTtcbn07IiwiaW1wb3J0IFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHN0eWxlZCBmcm9tIFwic3R5bGVkLWNvbXBvbmVudHNcIjtcbmltcG9ydCB7IGlzTWFjLCBpc1dpbmRvd3MgfSBmcm9tIFwiLi4vdXRpbHMvY29tbW9uVXRpbHNcIjtcbmNvbnN0IE1lbnVJdGVtID0gc3R5bGVkLmRpdmBcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogNDhweDtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbmA7XG5jb25zdCBJY29uQ29udGFpbmVyID0gc3R5bGVkLmRpdmBcbiAgbWFyZ2luOiAxNXB4IDEycHggMTVweCA4cHg7XG4gIHdpZHRoOiAxOHB4O1xuICBoZWlnaHQ6IDE4cHg7XG5gO1xuY29uc3QgVGV4dENvbnRhaW5lciA9IHN0eWxlZC5kaXZgXG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuYDtcbmV4cG9ydCBjb25zdCBMb2NhbFNoYXJlSXRlbSA9IGZ1bmN0aW9uIChwcm9wcykge1xuICBjb25zdCBMZWZ0SWNvbiA9IHByb3BzLmxlZnRJY29uO1xuICBjb25zdCBnZXRDbGFzc05hbWUgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIHJldHVybiBwcm9wcy5kaXNhYmxlZCA/IG5hbWUgKyBcIi1kaXNhYmxlZFwiIDogbmFtZTtcbiAgfTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KE1lbnVJdGVtLCBudWxsLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChJY29uQ29udGFpbmVyLCBudWxsLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChMZWZ0SWNvbiwge1xuICAgIGNsYXNzTmFtZTogZ2V0Q2xhc3NOYW1lKFwiaWNvbi1zdHlsZVwiKVxuICB9KSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFRleHRDb250YWluZXIsIG51bGwsIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IGdldENsYXNzTmFtZShcInRleHQtdGl0bGVcIilcbiAgfSwgcHJvcHMudGl0bGVTdHIpKSk7XG59OyIsImZ1bmN0aW9uIF9leHRlbmRzKCkgeyByZXR1cm4gX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduID8gT2JqZWN0LmFzc2lnbi5iaW5kKCkgOiBmdW5jdGlvbiAobikgeyBmb3IgKHZhciBlID0gMTsgZSA8IGFyZ3VtZW50cy5sZW5ndGg7IGUrKykgeyB2YXIgdCA9IGFyZ3VtZW50c1tlXTsgZm9yICh2YXIgciBpbiB0KSAoe30pLmhhc093blByb3BlcnR5LmNhbGwodCwgcikgJiYgKG5bcl0gPSB0W3JdKTsgfSByZXR1cm4gbjsgfSwgX2V4dGVuZHMuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgfVxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5jb25zdCBCYWNrSWNvbiA9IGZ1bmN0aW9uIChwcm9wcykge1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdmdcIiwgX2V4dGVuZHMoe1xuICAgIHhtbG5zOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsXG4gICAgd2lkdGg6IFwiMWVtXCIsXG4gICAgaGVpZ2h0OiBcIjFlbVwiLFxuICAgIGZpbGw6IFwibm9uZVwiXG4gIH0sIHByb3BzKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBjbGFzc05hbWU6IHByb3BzLmNsYXNzTmFtZSxcbiAgICBmaWxsOiBcIiNERERcIixcbiAgICBmaWxsUnVsZTogXCJldmVub2RkXCIsXG4gICAgZDogXCJNOS41IDEuMjVhMS4wOTQgMS4wOTQgMCAwIDEgLjc3MyAxLjg2OEw1Ljg5MSA3LjVsNC4zODIgNC4zODJhMS4wOTQgMS4wOTQgMCAxIDEtMS41NDcgMS41NDdMMy41NyA4LjI3M2ExLjA5NCAxLjA5NCAwIDAgMSAwLTEuNTQ2TDguNzI2IDEuNTdjLjIxNC0uMjE0LjQ5NC0uMzIuNzc0LS4zMjFaXCIsXG4gICAgY2xpcFJ1bGU6IFwiZXZlbm9kZFwiXG4gIH0pKTtcbn07XG5leHBvcnQgZGVmYXVsdCBCYWNrSWNvbjsiLCJmdW5jdGlvbiBfZXh0ZW5kcygpIHsgcmV0dXJuIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiA/IE9iamVjdC5hc3NpZ24uYmluZCgpIDogZnVuY3Rpb24gKG4pIHsgZm9yICh2YXIgZSA9IDE7IGUgPCBhcmd1bWVudHMubGVuZ3RoOyBlKyspIHsgdmFyIHQgPSBhcmd1bWVudHNbZV07IGZvciAodmFyIHIgaW4gdCkgKHt9KS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIHIpICYmIChuW3JdID0gdFtyXSk7IH0gcmV0dXJuIG47IH0sIF9leHRlbmRzLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7IH1cbmltcG9ydCBSZWFjdCwgeyB1c2VSZWYsIHVzZVN0YXRlLCB1c2VDYWxsYmFjaywgdXNlRWZmZWN0LCBmb3J3YXJkUmVmLCB1c2VJbXBlcmF0aXZlSGFuZGxlIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBpc01hYywgVVhQRXZlbnRUeXBlcywgRU5URVJfS0VZLCBFU0NBUEVfS0VZIH0gZnJvbSBcIi4uL3V0aWxzL2NvbW1vblV0aWxzXCI7XG5pbXBvcnQgc3R5bGVkIGZyb20gXCJzdHlsZWQtY29tcG9uZW50c1wiO1xuaW1wb3J0IFwiLi9jc3Mvc3R5bGUuY3NzXCI7XG5pbXBvcnQgeyBlbWl0LCBzZXREaWFsb2dMaXN0ZW5lciwgcmVtb3ZlRGlhbG9nTGlzdGVuZXJzLCBpc0luQm91bmRhcnksIE9TX0VWRU5UUywgR0xPQkFMX0VWRU5UUyB9IGZyb20gXCIuLi91dGlscy9jb21tb25VdGlsc1wiO1xuaW1wb3J0IEJhY2tJY29uIGZyb20gXCIuL2ljb25zL0JhY2tJY29uLmpzeFwiO1xuaW1wb3J0IHsgbG9jYWxpemUgfSBmcm9tIFwiLi4vdXRpbHMvbmxzLmpzXCI7XG5cbi8vLy8vLy8gU3R5bGVkIENvbXBvbmVudHMgLy8vLy8vL1xuXG5jb25zdCBJY29uU2xvdCA9IHN0eWxlZC5kaXZgXG4gICAgZmlsbDogdmFyKC0tc3BlY3RydW0tYWxpYXMtY29tcG9uZW50LXRleHQtY29sb3IpO1xuYDtcbmNvbnN0IERpYWxvZ0RpdiA9IHN0eWxlZC5kaXZgXG4gICAgd2lkdGg6ICR7ZnVuY3Rpb24gKHByb3BzKSB7XG4gIHJldHVybiBwcm9wcy53aWR0aDtcbn19cHg7IC8qIFVzZSBwcm9wcyBmb3Igd2lkdGggKi9cbiAgICBoZWlnaHQ6ICR7ZnVuY3Rpb24gKHByb3BzKSB7XG4gIHJldHVybiBwcm9wcy5oZWlnaHQ7XG59fXB4OyAvKiBVc2UgcHJvcHMgZm9yIGhlaWdodCAqL1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbmA7XG5jb25zdCBIZWFkZXJWaWV3Q29udGFpbmVyID0gc3R5bGVkLmRpdmBcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgcGFkZGluZzogMTBweCAwIDAgMDtcbmA7XG5jb25zdCBIZWFkZXJWaWV3ID0gc3R5bGVkLmRpdmBcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG5gO1xuY29uc3QgSGVhZGVyVGV4dFZpZXcgPSBzdHlsZWQuZGl2YFxuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbmA7XG5jb25zdCBTbGFja1BhbmVsRGl2ID0gc3R5bGVkLmRpdmBcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgaGVpZ2h0OiAxMDAlO1xuICAgIHBhZGRpbmc6IDE1cHg7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIHRvcDogMDtcbmA7XG5jb25zdCBTbGFja1BhbmVsSW5uZXJDb250YWluZXIgPSBzdHlsZWQuZGl2YFxuICAgIG92ZXJmbG93OiBhdXRvO1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICBoZWlnaHQ6IDEwMCU7XG5gO1xuY29uc3QgU2xhY2tQYW5lbElubmVyID0gc3R5bGVkLmRpdmBcbiAgZmxleDogMSAxIDA7IC8qIEZsZXggZ3Jvdywgc2hyaW5rLCBhbmQgYmFzaXMgKi9cbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMHB4OyAvKiBUaGlzIG1heSBiZSBhZGp1c3RlZCBiYXNlZCBvbiBjb250ZW50ICovXG4gIG92ZXJmbG93LXk6IGF1dG87IC8qIEVuYWJsZSB2ZXJ0aWNhbCBzY3JvbGxpbmcgKi9cbiAgLyogYWRkIHBhZGRpbmcgdG8gZWFjaCBjaGlsZCovXG4gICYgPiAqIHtcbiAgICBwYWRkaW5nOiAxMHB4O1xuICB9XG5gO1xuY29uc3QgRm9ybWF0VmlldyA9IHN0eWxlZC5kaXZgXG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIHdpZHRoOiAxMDAlO1xuYDtcblxuLy8vLy8vLyBTdHlsZWQgQ29tcG9uZW50cyAvLy8vLy8vXG5cbmV4cG9ydCBjb25zdCBTZXR0aW5nc1BhbmVsID0gZm9yd2FyZFJlZihmdW5jdGlvbiAocHJvcHMsIHJlZikge1xuICBjb25zdCBbaXNQU0RTZWxlY3RlZCwgc2V0SXNQU0RTZWxlY3RlZF0gPSB1c2VTdGF0ZShmYWxzZSk7XG4gIGNvbnN0IGRpYWxvZ1JlZiA9IHVzZVJlZihudWxsKTtcblxuICAvLyBHZXQgdGhlIGFjdHVhbCBkaW1lbnNpb25zIHRvIGRpc3BsYXlcbiAgY29uc3Qgb3JpZ2luYWxEaW1lbnNpb25zID0gcHJvcHMub3JpZ2luYWxEb2N1bWVudFNpemUgPyBgJHtwcm9wcy5vcmlnaW5hbERvY3VtZW50U2l6ZS53aWR0aH0geCAke3Byb3BzLm9yaWdpbmFsRG9jdW1lbnRTaXplLmhlaWdodH0gcHhgIDogbG9jYWxpemUoJ0RJTUVOU0lPTl9PUklHSU5BTF9TVUZGSVgnKTtcbiAgY29uc3Qgc21hbGxEaW1lbnNpb25zID0gcHJvcHMub3JpZ2luYWxEb2N1bWVudFNpemUgPyBgJHtNYXRoLnJvdW5kKHByb3BzLm9yaWdpbmFsRG9jdW1lbnRTaXplLndpZHRoICogMC41KX0geCAke01hdGgucm91bmQocHJvcHMub3JpZ2luYWxEb2N1bWVudFNpemUuaGVpZ2h0ICogMC41KX0gcHhgIDogYDUwJSAke2xvY2FsaXplKCdESU1FTlNJT05fU01BTExfU1VGRklYJyl9YDtcbiAgY29uc3QgY2xvc2VEaWFsb2cgPSB1c2VDYWxsYmFjayhmdW5jdGlvbiAoKSB7XG4gICAgcHJvcHMuc2V0U2V0dGluZ3NQYW5lbEFjdGl2ZShmYWxzZSk7XG4gICAgY29uc3QgZGlhbG9nID0gZGlhbG9nUmVmID09PSBudWxsIHx8IGRpYWxvZ1JlZiA9PT0gdm9pZCAwID8gdm9pZCAwIDogZGlhbG9nUmVmLmN1cnJlbnQ7XG4gICAgcmV0dXJuIChkaWFsb2cgPT09IG51bGwgfHwgZGlhbG9nID09PSB2b2lkIDAgPyB2b2lkIDAgOiBkaWFsb2cub3BlbikgJiYgKGRpYWxvZyA9PT0gbnVsbCB8fCBkaWFsb2cgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGRpYWxvZy5jbG9zZSgpKTtcbiAgfSwgW2RpYWxvZ1JlZl0pO1xuXG4gIC8vIEV4cG9zZSBjbG9zZURpYWxvZyB0byBwYXJlbnRcbiAgdXNlSW1wZXJhdGl2ZUhhbmRsZShyZWYsIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY2xvc2VEaWFsb2dcbiAgICB9O1xuICB9KTtcbiAgY29uc3Qgc2hvd0RpYWxvZyA9IHVzZUNhbGxiYWNrKGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBkaWFsb2cgPSBkaWFsb2dSZWYgPT09IG51bGwgfHwgZGlhbG9nUmVmID09PSB2b2lkIDAgPyB2b2lkIDAgOiBkaWFsb2dSZWYuY3VycmVudDtcbiAgICBkaWFsb2cuc2hvdyh7XG4gICAgICBhbmNob3JPZmZzZXQ6IHByb3BzLnBhbmVsTG9jYXRpb24sXG4gICAgICBpc1RyYW5zcGFyZW50OiB0cnVlLFxuICAgICAgb3BhY2l0eTogMS4wLFxuICAgICAgc2l6ZTogcHJvcHMucGFuZWxTaXplLFxuICAgICAgcmVzaXplOiBcInZlcnRpY2FsXCIsXG4gICAgICBvdmVyZmxvdzogXCJzY3JvbGxcIlxuICAgIH0pO1xuICAgIHByb3BzLnNldFNldHRpbmdzUGFuZWxBY3RpdmUodHJ1ZSk7XG4gIH0sIFtkaWFsb2dSZWYsIHByb3BzXSk7XG4gIGNvbnN0IGhhbmRsZUJhY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgY2xvc2VEaWFsb2coKTtcbiAgICBwcm9wcy5vcGVuTG9jYWxTaGFyZVBhbmVsKCk7XG4gIH07XG4gIGNvbnN0IGhhbmRsZU1lbnVDaGFuZ2UgPSBmdW5jdGlvbiAoZXZ0KSB7XG4gICAgbGV0IHZhbCA9IGV2dC50YXJnZXQudmFsdWU7XG4gICAgc2V0SXNQU0RTZWxlY3RlZCh2YWwgPT09ICdwc2QnKTtcbiAgICBwcm9wcy5zZXRFeHBvcnRGb3JtYXQodmFsKTtcbiAgfTtcbiAgY29uc3QgaGFuZGxlU2l6ZUNoYW5nZSA9IGZ1bmN0aW9uIChzaXplKSB7XG4gICAgcHJvcHMuc2V0U2VsZWN0ZWRTaXplVHlwZShzaXplKTtcbiAgfTtcbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAocHJvcHMudmlzaWJsZSkge1xuICAgICAgc2hvd0RpYWxvZygpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjbG9zZURpYWxvZygpO1xuICAgIH1cbiAgfSwgW3Byb3BzLnZpc2libGVdKTtcbiAgY29uc3QgaGFuZGxlR2xvYmFsTW91c2VEb3duID0gZnVuY3Rpb24gKGV2ZW50LCBjb29yZGluYXRlcykge1xuICAgIGlmICghcHJvcHMudmlzaWJsZSkgcmV0dXJuO1xuICAgIGlmICghaXNJbkJvdW5kYXJ5KGNvb3JkaW5hdGVzLCBwcm9wcy5wYW5lbExvY2F0aW9uKSAmJiBwcm9wcy5idXR0b25Mb2NhdGlvbiAmJiAhaXNJbkJvdW5kYXJ5KGNvb3JkaW5hdGVzLCBwcm9wcy5idXR0b25Mb2NhdGlvbikpIHtcbiAgICAgIGNsb3NlRGlhbG9nKCk7XG4gICAgfVxuICB9O1xuICBjb25zdCBoYW5kbGVLZXlEb3duID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgaWYgKGV2ZW50LmtleSA9PT0gRVNDQVBFX0tFWSkge1xuICAgICAgY2xvc2VEaWFsb2coKTtcbiAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gRU5URVJfS0VZKSB7XG4gICAgICAvLyBUb0RvIDogSGFuZGxlIHRoaXNcbiAgICB9XG4gIH07XG5cbiAgLy8gQXR0YWNoIG5ldyBjb3B5IG9mIGhhbmRsZUdsb2JhbE1vdXNlRG93biBvbiBldmVyeSByZW5kZXJcbiAgLy8gYXMgdGhlIGhhbmRsZUdsb2JhbE1vdXNlRG93biBuZWVkcyB1cGRhdGVkIGRpYWxvZ0xvY2F0aW9uIHZhbHVlXG4gIGNvbnN0IGRpYWxvZ0lkID0gYFNFVFRJTkdTX0RJQUxPRy0ke0RhdGUubm93KCl9YDtcbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBkb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoVVhQRXZlbnRUeXBlcy5LRVlET1dOLCBoYW5kbGVLZXlEb3duKTtcbiAgICBzZXREaWFsb2dMaXN0ZW5lcihPU19FVkVOVFMuTU9VU0VfRE9XTiwgZGlhbG9nSWQsIGhhbmRsZUdsb2JhbE1vdXNlRG93bik7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlRXZlbnRMaXN0ZW5lcihVWFBFdmVudFR5cGVzLktFWURPV04sIGhhbmRsZUtleURvd24pO1xuICAgICAgcmVtb3ZlRGlhbG9nTGlzdGVuZXJzKGRpYWxvZ0lkKTtcbiAgICB9O1xuICB9LCBbZGlhbG9nSWRdKTtcbiAgY29uc3QgZm9ybWF0T3B0aW9ucyA9IFt7XG4gICAgdmFsdWU6IFwianBnXCIsXG4gICAgbGFiZWw6IFwiSlBHXCJcbiAgfSwge1xuICAgIHZhbHVlOiBcInBuZ1wiLFxuICAgIGxhYmVsOiBcIlBOR1wiXG4gIH0sIHtcbiAgICB2YWx1ZTogXCJwc2RcIixcbiAgICBsYWJlbDogXCJQU0RcIlxuICB9XTtcbiAgY29uc3Qgc2hhcmVGb3JtYXRWaWV3ID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRm9ybWF0VmlldywgbnVsbCwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcC1sYWJlbFwiLCB7XG4gICAgZm9yOiBcInBpY2tlci1tXCIsXG4gICAgc2l6ZTogXCJtXCJcbiAgfSwgbG9jYWxpemUoXCJGT1JNQVRfREVTQ1JJUFRJT05cIikpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwLXBpY2tlclwiLCB7XG4gICAgaWQ6IFwicGlja2VyLW1cIixcbiAgICBzaXplOiBcIm1cIixcbiAgICBwbGFjZWhvbGRlcjogJ1NlbGVjdCB0aGUgZm9ybWF0IHRvIHNoYXJlJyxcbiAgICBzdHlsZToge1xuICAgICAgd2lkdGg6IFwiMTAwJVwiXG4gICAgfVxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwLW1lbnVcIiwge1xuICAgIHNsb3Q6IFwib3B0aW9uc1wiLFxuICAgIGNsYXNzTmFtZTogXCJmb3JtYXQtbWVudVwiXG4gIH0sIGZvcm1hdE9wdGlvbnMubWFwKGZ1bmN0aW9uIChvcHRpb24pIHtcbiAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcC1tZW51LWl0ZW1cIiwgX2V4dGVuZHMoe1xuICAgICAga2V5OiBvcHRpb24udmFsdWUsXG4gICAgICB2YWx1ZTogb3B0aW9uLnZhbHVlXG4gICAgfSwgb3B0aW9uLnZhbHVlID09PSBwcm9wcy5leHBvcnRGb3JtYXQgJiYge1xuICAgICAgc2VsZWN0ZWQ6IHRydWVcbiAgICB9LCB7XG4gICAgICBvbkNsaWNrOiBoYW5kbGVNZW51Q2hhbmdlLFxuICAgICAgc3R5bGU6IHtcbiAgICAgICAgcGFkZGluZ0xlZnQ6IFwiNXB4XCJcbiAgICAgIH1cbiAgICB9KSwgb3B0aW9uLmxhYmVsKTtcbiAgfSkpKSk7XG4gIGNvbnN0IHNpemluZ09wdGlvbnMgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCBudWxsLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgc3R5bGU6IHtcbiAgICAgIGRpc3BsYXk6ICdmbGV4JyxcbiAgICAgIGp1c3RpZnlDb250ZW50OiAnc3BhY2UtYmV0d2VlbicsXG4gICAgICBhbGlnbkl0ZW1zOiAnY2VudGVyJyxcbiAgICAgIG1hcmdpbkJvdHRvbTogJzhweCdcbiAgICB9XG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3AtcmFkaW9cIiwgX2V4dGVuZHMoe1xuICAgIGlkOiBcIm9yaWdpbmFsLXNpemVcIixcbiAgICBuYW1lOiBcInNpemUtb3B0aW9uXCIsXG4gICAgdmFsdWU6IFwib3JpZ2luYWxcIlxuICB9LCBwcm9wcy5zZWxlY3RlZFNpemVUeXBlID09PSBcIm9yaWdpbmFsXCIgPyB7XG4gICAgY2hlY2tlZDogdHJ1ZVxuICB9IDoge30sIHtcbiAgICBvbkNsaWNrOiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gaGFuZGxlU2l6ZUNoYW5nZShcIm9yaWdpbmFsXCIpO1xuICAgIH1cbiAgfSksIGxvY2FsaXplKCdTSVpFX09SSUdJTkFMJykpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwLWxhYmVsXCIsIG51bGwsIG9yaWdpbmFsRGltZW5zaW9ucykpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgc3R5bGU6IHtcbiAgICAgIGRpc3BsYXk6ICdmbGV4JyxcbiAgICAgIGp1c3RpZnlDb250ZW50OiAnc3BhY2UtYmV0d2VlbicsXG4gICAgICBhbGlnbkl0ZW1zOiAnY2VudGVyJ1xuICAgIH1cbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcC1yYWRpb1wiLCBfZXh0ZW5kcyh7XG4gICAgaWQ6IFwic21hbGwtc2l6ZVwiLFxuICAgIG5hbWU6IFwic2l6ZS1vcHRpb25cIixcbiAgICB2YWx1ZTogXCJzbWFsbFwiXG4gIH0sIHByb3BzLnNlbGVjdGVkU2l6ZVR5cGUgPT09IFwic21hbGxcIiA/IHtcbiAgICBjaGVja2VkOiB0cnVlXG4gIH0gOiB7fSwge1xuICAgIG9uQ2xpY2s6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBoYW5kbGVTaXplQ2hhbmdlKFwic21hbGxcIik7XG4gICAgfVxuICB9KSwgbG9jYWxpemUoJ1NJWkVfU01BTEwnKSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3AtbGFiZWxcIiwgbnVsbCwgc21hbGxEaW1lbnNpb25zKSkpO1xuICBjb25zdCBoZWFkZXJWaWV3ID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoSGVhZGVyVmlld0NvbnRhaW5lciwgbnVsbCwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoSGVhZGVyVmlldywgbnVsbCwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoSGVhZGVyVGV4dFZpZXcsIG51bGwsIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3AtYWN0aW9uLWJ1dHRvblwiLCB7XG4gICAgc2l6ZTogXCJzXCIsXG4gICAgcXVpZXQ6IHRydWUsXG4gICAgb25DbGljazogaGFuZGxlQmFja1xuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChJY29uU2xvdCwgbnVsbCwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQmFja0ljb24sIHtcbiAgICBjbGFzc05hbWU6IFwiaWNvbi1zdHlsZVwiXG4gIH0pKSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3AtaGVhZGluZ1wiLCB7XG4gICAgc2l6ZTogXCJzXCIsXG4gICAgc3R5bGU6IHtcbiAgICAgIG1hcmdpbjogMFxuICAgIH1cbiAgfSwgbG9jYWxpemUoXCJTSVpFX1NFVFRJTkdfVElUTEVcIikpKSkpO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogcHJvcHMudGhlbWVDbGFzc1xuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpYWxvZ1wiLCB7XG4gICAgaWQ6IFwic2V0dGluZ3MtZGlhbG9nXCIsXG4gICAgY2xhc3NOYW1lOiAhaXNNYWMgPyBcImRpYWxvZy1ib3JkZXJcIiA6IFwiXCIsXG4gICAgcmVmOiBkaWFsb2dSZWZcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoRGlhbG9nRGl2LCB7XG4gICAgd2lkdGg6IHByb3BzLnBhbmVsU2l6ZS53aWR0aCxcbiAgICBoZWlnaHQ6IHByb3BzLnBhbmVsU2l6ZS5oZWlnaHRcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoU2xhY2tQYW5lbERpdiwgbnVsbCwgaGVhZGVyVmlldywgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoU2xhY2tQYW5lbElubmVyQ29udGFpbmVyLCBudWxsLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChTbGFja1BhbmVsSW5uZXIsIG51bGwsIHNoYXJlRm9ybWF0VmlldywgIWlzUFNEU2VsZWN0ZWQgJiYgc2l6aW5nT3B0aW9ucykpKSkpKTtcbn0pOyIsImV4cG9ydCBjb25zdCBTRVJWSUNFX0NPREUgPSBPYmplY3QuZnJlZXplKHtcbiAgQ0xJUEJBT1JEOiAwLFxuICBMSUdIVFJPT01fREVTS1RPUDogMSxcbiAgTElHSFRST09NX0NMQVNTSUM6IDIsXG4gIE9USEVSX0FQUFM6IDNcbn0pO1xuZXhwb3J0IGNvbnN0IENPUFlfVE9fQ0xJUEJPQVJEID0gXCJDT1BZX1RPX0NMSVBCT0FSRFwiO1xuZXhwb3J0IGNvbnN0IE9USEVSX0FQUFMgPSBcIk9USEVSX0FQUFNcIjtcbmV4cG9ydCBjb25zdCBMSUdIVFJPT01fREVTS1RPUF9EQVRBX01FTlUgPSBcIkxJR0hUUk9PTURFU0tUT1BcIjtcbmV4cG9ydCBjb25zdCBMSUdIVFJPT01fQ0xBU1NJQ19EQVRBX01FTlUgPSBcIkxJR0hUUk9PTUNMQVNTSUNcIjtcbmV4cG9ydCBjb25zdCBMSUdIVFJPT01fREVTS1RPUF9USVRMRSA9IFwiTGlnaHRyb29tXCI7XG5leHBvcnQgY29uc3QgTElHSFRST09NX0NMQVNTSUNfVElUTEUgPSBcIkxpZ2h0cm9vbSBDbGFzc2ljXCI7IiwiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5leHBvcnQgZnVuY3Rpb24gQWxlcnRNZWRpdW0ocHJvcHMpIHtcbiAgY29uc3Qge1xuICAgIGNvbG9yXG4gIH0gPSBwcm9wcztcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIHtcbiAgICB4bWxuczogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLFxuICAgIGhlaWdodDogXCIxOFwiLFxuICAgIHZpZXdCb3g6IFwiMCAwIDE4IDE4XCIsXG4gICAgd2lkdGg6IFwiMThcIlxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInRpdGxlXCIsIG51bGwsIFwiQWxlcnRNZWRpdW1cIiksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZmlsbDogY29sb3IsXG4gICAgZDogXCJNOC41NjQsMS4yODkuMiwxNi4yNTZBLjUuNSwwLDAsMCwuNjM2LDE3SDE3LjM2NGEuNS41LDAsMCwwLC40MzYtLjc0NEw5LjQzNiwxLjI4OWEuNS41LDAsMCwwLS44NzIsMFpNMTAsMTQuNzVhLjI1LjI1LDAsMCwxLS4yNS4yNUg4LjI1QS4yNS4yNSwwLDAsMSw4LDE0Ljc1di0xLjVBLjI1LjI1LDAsMCwxLDguMjUsMTNoMS41YS4yNS4yNSwwLDAsMSwuMjUuMjVabTAtM2EuMjUuMjUsMCwwLDEtLjI1LjI1SDguMjVBLjI1LjI1LDAsMCwxLDgsMTEuNzV2LTZhLjI1LjI1LDAsMCwxLC4yNS0uMjVoMS41YS4yNS4yNSwwLDAsMSwuMjUuMjVaXCJcbiAgfSkpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIFN1Y2Nlc3NNZWRpdW0ocHJvcHMpIHtcbiAgY29uc3Qge1xuICAgIGNvbG9yXG4gIH0gPSBwcm9wcztcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIHtcbiAgICB4bWxuczogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLFxuICAgIHdpZHRoOiAxOCxcbiAgICBoZWlnaHQ6IDE4XG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZmlsbDogY29sb3IsXG4gICAgZDogXCJNOSAxYTggOCAwIDEgMCA4IDggOCA4IDAgMCAwLTgtOFptNS4zMzMgNC41NC02LjMyNCA4LjEzYS42LjYgMCAwIDEtLjQzNy4yM2gtLjAzN2EuNi42IDAgMCAxLS40MjUtLjE3NmwtMy44OTMtMy45YS42LjYgMCAwIDEgMC0uODQ5bC42NjMtLjY2M2EuNi42IDAgMCAxIC44NDggMEw3LjQgMTAuOTkxbDUuMjU2LTYuNzU0YS42LjYgMCAwIDEgLjg0My0uMWwuNzI4LjU2NmEuNi42IDAgMCAxIC4xMDYuODM3WlwiXG4gIH0pKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBJbmZvTWVkaXVtKHByb3BzKSB7XG4gIGNvbnN0IHtcbiAgICBjb2xvclxuICB9ID0gcHJvcHM7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInN2Z1wiLCB7XG4gICAgeG1sbnM6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIixcbiAgICB3aWR0aDogMTgsXG4gICAgaGVpZ2h0OiAxOFxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGZpbGw6IGNvbG9yLFxuICAgIGQ6IFwiTTkgMWE4IDggMCAxIDAgOCA4IDggOCAwIDAgMC04LThabS0uMTUgMi4xNWExLjM1OSAxLjM1OSAwIDAgMSAxLjQzMSAxLjI4M3EuMDA0LjA2NC4wMDEuMTI5QTEuMzMyIDEuMzMyIDAgMCAxIDguODUgNS45OTRhMS4zNTMgMS4zNTMgMCAwIDEtMS40MzItMS40MzMgMS4zNTkgMS4zNTkgMCAwIDEgMS4zMDQtMS40MTJxLjA2NC0uMDAyLjEyOC4wMDFaTTExIDEzLjVhLjUuNSAwIDAgMS0uNS41aC0zYS41LjUgMCAwIDEtLjUtLjV2LTFhLjUuNSAwIDAgMSAuNS0uNUg4VjloLS41YS41LjUgMCAwIDEtLjUtLjV2LTFhLjUuNSAwIDAgMSAuNS0uNWgyYS41LjUgMCAwIDEgLjUuNVYxMmguNWEuNS41IDAgMCAxIC41LjVaXCJcbiAgfSkpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIENyb3NzTWVkaXVtKHByb3BzKSB7XG4gIGNvbnN0IHtcbiAgICBjb2xvclxuICB9ID0gcHJvcHM7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCBudWxsLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInN2Z1wiLCB7XG4gICAgeG1sbnM6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIixcbiAgICB3aWR0aDogXCIxMlwiLFxuICAgIGhlaWdodDogXCIxMlwiLFxuICAgIHZpZXdCb3g6IFwiMCAwIDEwIDEwXCJcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJnXCIsIHtcbiAgICBpZDogXCJDcm9zc1NpemUxMDBcIlxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGZpbGw6IGNvbG9yLFxuICAgIGQ6IFwiTTUuMjM4MSw0LDcuNjk0MzQsMS41NDRBLjg3NTQzLjg3NTQzLDAsMCwwLDYuNDU2NTQuMzA1NjZMNC4wMDAxMiwyLjc2MjA4LDEuNTQzNDYuMzA1NjZBLjg3NTI2Ljg3NTI2LDAsMCwwLC4zMDYxNSwxLjU0NEwyLjc2MjIxLDQsLjMwNjE1LDYuNDU2MDVBLjg3NTI2Ljg3NTI2LDAsMCwwLDEuNTQzNDYsNy42OTQzNEw0LjAwMDEyLDUuMjM3OTIsNi40NTY1NCw3LjY5NDM0YS44NzU0My44NzU0MywwLDEsMCwxLjIzNzgtMS4yMzgyOVpcIlxuICB9KSkpKTtcbn0iLCJpbXBvcnQgUmVhY3QsIHsgdXNlUmVmLCB1c2VTdGF0ZSwgdXNlQ2FsbGJhY2ssIHVzZUVmZmVjdCB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHN0eWxlZCBmcm9tIFwic3R5bGVkLWNvbXBvbmVudHNcIjtcbmltcG9ydCB7IEFsZXJ0TWVkaXVtLCBTdWNjZXNzTWVkaXVtLCBJbmZvTWVkaXVtLCBDcm9zc01lZGl1bSB9IGZyb20gXCIuL2ljb25zL1RvYXN0SWNvbnNcIjtcbmltcG9ydCBcIi4vY3NzL3N0eWxlLmNzc1wiO1xuY29uc3QgY29sb3JzID0ge1xuICBpbmZvOiBcInZhcigtLWluZm8tY29sb3IpXCIsXG4gIHN1Y2Nlc3M6IFwidmFyKC0tc3VjY2Vzcy1jb2xvcilcIixcbiAgd2FybmluZzogXCJ2YXIoLS13YXJuaW5nLWNvbG9yKVwiLFxuICBlcnJvcjogXCJ2YXIoLS1lcnJvci1jb2xvcilcIlxufTtcbmNvbnN0IE1BWF9UT0FTVF9XSURUSCA9IDM2NDtcblxuLy8vLy8vLyBTdHlsZWQgQ29tcG9uZW50cyAvLy8vLy8vXG5cbmNvbnN0IFRvYXN0Q29udGFpbmVyID0gc3R5bGVkLmRpdmBcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB6LWluZGV4OiAxMDAwO1xuICBib3R0b206IDA7XG4gIGxlZnQ6IDA7XG4gIG1hcmdpbjogMTBweDsgLyogTWFyZ2luIG1pZ2h0IGNhdXNlIG92ZXJmbG93ICovXG4gIHdpZHRoOiBjYWxjKDEwMCUgLSAyMHB4KTsgLyogQWRqdXN0IHdpZHRoIHRvIGFjY291bnQgZm9yIG1hcmdpbiAqL1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuYDtcbmNvbnN0IFRvYXN0QnViYmxlID0gc3R5bGVkLmRpdmBcbiAgYmFja2dyb3VuZC1jb2xvcjogJHtmdW5jdGlvbiAoe1xuICBjb2xvclxufSkge1xuICByZXR1cm4gY29sb3I7XG59fTtcbiAgYm9yZGVyOiB2YXIoLS10b2FzdC1ib3JkZXIpO1xuICBib3JkZXItcmFkaXVzOiA0cHg7XG4gIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICBtYXgtd2lkdGg6IDQwOHB4O1xuICBtYXJnaW46IFwidG9wIGNlbnRyZVwiO1xuICB3aWR0aDogMTAwJTtcbmA7XG5jb25zdCBUb2FzdENvbnRlbnQgPSBzdHlsZWQuZGl2YFxuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICBmb250LXNpemU6IDE0cHg7XG4gIGZvbnQtZmFtaWx5OiBcIkFkb2JlIENsZWFuXCIsIHNhbnMtc2VyaWY7XG4gIGZvbnQtd2VpZ2h0OiBub3JtYWw7XG4gIGNvbG9yOiB3aGl0ZTtcbiAgd2hpdGUtc3BhY2U6IHByZS13cmFwO1xuICB0ZXh0LWFsaWduOiBjZW50cmU7XG4gIG1hcmdpbjogMTJweCAwcHggMTJweCAhaW1wb3J0YW50O1xuICBwYWRkaW5nOiAwcHggOHB4IDBweDtcbmA7XG5jb25zdCBUb2FzdEljb24gPSBzdHlsZWQuZGl2YFxuICBtYXJnaW4tbGVmdDogMThweDtcbiAgbWFyZ2luLXRvcDogMTJweDtcbmA7XG5jb25zdCBDcm9zc0ljb25EaXYgPSBzdHlsZWQuZGl2YFxuICBib3JkZXItbGVmdDogMXB4IHNvbGlkIHZhcigtLWJ1dHRvbi1ib3JkZXItZmlsbCk7XG4gIG1hcmdpbi1sZWZ0OiBhdXRvO1xuICBtYXJnaW4tdG9wOiA1cHg7XG4gIG1hcmdpbi1ib3R0b206IDVweDtcbmA7XG5jb25zdCBDcm9zc0ljb24gPSBzdHlsZWQuZGl2YFxuICBtYXJnaW46IDhweDtcbiAgcGFkZGluZzogMTBweDtcbiAgYm9yZGVyLXJhZGl1czogNTAlO1xuICB0ZXh0LWFsaWduOiBjZW50cmU7XG4gICY6aG92ZXIge1xuICAgIGJveC1zaGFkb3c6IDAgMCAwIDhweCB2YXIoLS1idXR0b24tYm9yZGVyLWZpbGwpO1xuICB9XG5gO1xuY29uc3QgQnV0dG9ucyA9IHN0eWxlZC5kaXZgXG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gIGFsaWduLXNlbGY6IGZsZXgtZW5kO1xuYDtcbmNvbnN0IFRvYXN0QnV0dG9uID0gc3R5bGVkLmRpdmBcbiAgbWFyZ2luLWxlZnQ6IDhweDtcbiAgbWFyZ2luLXJpZ2h0OiA4cHg7XG4gIGJvcmRlcjogMnB4IHNvbGlkICR7ZnVuY3Rpb24gKHtcbiAgY29sb3Jcbn0pIHtcbiAgcmV0dXJuIGNvbG9yO1xufX0gIWltcG9ydGFudDtcbiAgYm9yZGVyLXJhZGl1czogMTRweCAhaW1wb3J0YW50O1xuICBwYWRkaW5nOiAzLjVweCAxNHB4IDQuNXB4O1xuICBmb250LXNpemU6IDE0cHggIWltcG9ydGFudDtcbiAgZm9udC1mYW1pbHk6IFwiQWRvYmUgQ2xlYW5cIiwgc2Fucy1zZXJpZjtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gIG1hcmdpbi10b3A6IDEycHg7XG4gICY6aG92ZXIge1xuICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWJ1dHRvbi1ib3JkZXItZmlsbCk7XG4gIH1cbmA7XG5cbi8vLy8vLy8gU3R5bGVkIENvbXBvbmVudHMgLy8vLy8vL1xuXG5jb25zdCBpY29ucyA9IHtcbiAgaW5mbzogSW5mb01lZGl1bSxcbiAgc3VjY2VzczogU3VjY2Vzc01lZGl1bSxcbiAgd2FybmluZzogQWxlcnRNZWRpdW0sXG4gIGVycm9yOiBBbGVydE1lZGl1bVxufTtcbmV4cG9ydCBjb25zdCBUb2FzdCA9IGZ1bmN0aW9uIChwcm9wcykge1xuICBjb25zdCBoYW5kbGVDbG9zZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBwcm9wcy5zZXRUb2FzdFZpc2libGUoZmFsc2UpO1xuICB9O1xuICBsZXQgSWNvbiA9IGljb25zW3Byb3BzLnRvYXN0VHlwZV0gfHwgSW5mb01lZGl1bTtcbiAgbGV0IHZhcmlhbnRDb2xvciA9IGNvbG9yc1twcm9wcy50b2FzdFR5cGVdIHx8IGNvbG9ycy5pbmZvO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoVG9hc3RDb250YWluZXIsIG51bGwsIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFRvYXN0QnViYmxlLCB7XG4gICAgY29sb3I6IHZhcmlhbnRDb2xvclxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChUb2FzdEljb24sIG51bGwsIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEljb24sIHtcbiAgICBjb2xvcjogXCJ3aGl0ZVwiXG4gIH0pKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoVG9hc3RDb250ZW50LCBudWxsLCBwcm9wcy5tZXNzYWdlKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ3Jvc3NJY29uRGl2LCBudWxsKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ3Jvc3NJY29uLCB7XG4gICAgb25DbGljazogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGhhbmRsZUNsb3NlKCk7XG4gICAgfVxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChDcm9zc01lZGl1bSwge1xuICAgIGNvbG9yOiBcIndoaXRlXCJcbiAgfSkpKSk7XG59OyIsImZ1bmN0aW9uIF9leHRlbmRzKCkgeyByZXR1cm4gX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduID8gT2JqZWN0LmFzc2lnbi5iaW5kKCkgOiBmdW5jdGlvbiAobikgeyBmb3IgKHZhciBlID0gMTsgZSA8IGFyZ3VtZW50cy5sZW5ndGg7IGUrKykgeyB2YXIgdCA9IGFyZ3VtZW50c1tlXTsgZm9yICh2YXIgciBpbiB0KSAoe30pLmhhc093blByb3BlcnR5LmNhbGwodCwgcikgJiYgKG5bcl0gPSB0W3JdKTsgfSByZXR1cm4gbjsgfSwgX2V4dGVuZHMuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgfVxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5jb25zdCBHZWFySWNvbiA9IGZ1bmN0aW9uIChwcm9wcykge1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdmdcIiwgX2V4dGVuZHMoe1xuICAgIHhtbG5zOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsXG4gICAgd2lkdGg6IDE2LFxuICAgIGhlaWdodDogMTYsXG4gICAgZmlsbDogXCJub25lXCJcbiAgfSwgcHJvcHMpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGNsYXNzTmFtZTogcHJvcHMuY2xhc3NOYW1lLFxuICAgIGZpbGw6IFwiI0VCRUJFQlwiLFxuICAgIGZpbGxSdWxlOiBcImV2ZW5vZGRcIixcbiAgICBkOiBcIk04LjIxMyAwSDcuNTRhLjg3Ni44NzYgMCAwIDAtLjg3OS44Njd2MS40OGE1LjIzIDUuMjMgMCAwIDAtMS40MTcuNThsLTEuMjU4LS44MDlhLjkwOS45MDkgMCAwIDAtMS4yNTEgMGwtLjYyNi42MDlhLjg1Mi44NTIgMCAwIDAgMCAxLjIyMmwuODU1IDEuMjRjLS4yNy40NTQtLjQ3Ljk1NC0uNTg1IDEuNDhIMS4xMjhhLjg3Ny44NzcgMCAwIDAtLjg3OC44Njh2Ljg1NmEuODguODggMCAwIDAgLjg3OC44NjdoMS4zNjdjLjE2LjUxLjQwNy45OTIuNzE3IDEuNDNsLS43ODYgMS4xN2EuODM3LjgzNyAwIDAgMCAwIDEuMjE4bC42Mi42MTNhLjkxNC45MTQgMCAwIDAgMS4yNTcgMGwxLjMzOC0uOWMuNDU5LjIxMi42MDIuMjg3IDEuMDU2LjQ0OHYxLjM5NGMwIC40NzcuMzc5Ljg2Ny44NzIuODY3aC44NjJjLjQ5MyAwIC44NzItLjM5Ljg3Mi0uODY3di0xLjM5NGMuNDU0LS4xNi41OTctLjIzNiAxLjA1Ni0uNDQ4bDEuMzM4LjlhLjkxNC45MTQgMCAwIDAgMS4yNTcgMGwuNjItLjYxM2EuODM3LjgzNyAwIDAgMCAwLTEuMjE4bC0uNzg2LTEuMTdjLjMxLS40MzguNTU3LS45Mi43MTctMS40M2gxLjM2N2EuODguODggMCAwIDAgLjg3OC0uODY3di0uODU2YS44NzcuODc3IDAgMCAwLS44NzgtLjg2N0gxMy42MmE0Ljk1NSA0Ljk1NSAwIDAgMC0uNTg2LTEuNDhsLjg1Ni0xLjI0YS44NTMuODUzIDAgMCAwIDAtMS4yMjNsLS42MjYtLjYwOWEuOTA5LjkwOSAwIDAgMC0xLjI1MSAwbC0xLjI1OC44MWE1LjIzIDUuMjMgMCAwIDAtMS40MTctLjU4Vi44NjhBLjg3Ni44NzYgMCAwIDAgOC40NTkgMGgtLjI0NlpNNS4xNDcgNy43NUEyLjg0OSAyLjg0OSAwIDAgMSA4IDQuODk3YTIuODQ5IDIuODQ5IDAgMCAxIDIuODU0IDIuODUzQTIuODQ5IDIuODQ5IDAgMCAxIDggMTAuNjAyIDIuODQ5IDIuODQ5IDAgMCAxIDUuMTQ3IDcuNzVaXCIsXG4gICAgY2xpcFJ1bGU6IFwiZXZlbm9kZFwiXG4gIH0pKTtcbn07XG5leHBvcnQgZGVmYXVsdCBHZWFySWNvbjsiLCJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmNvbnN0IENsaXBib2FyZCA9IGZ1bmN0aW9uIChwcm9wcykge1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdmdcIiwge1xuICAgIHhtbG5zOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsXG4gICAgaGVpZ2h0OiBcIjE4XCIsXG4gICAgdmlld0JveDogXCIwIDAgMTggMThcIixcbiAgICB3aWR0aDogXCIxOFwiXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwidGl0bGVcIiwgbnVsbCwgXCJTIENvcHkgMTggTlwiKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJyZWN0XCIsIHtcbiAgICBpZDogXCJDYW52YXNcIixcbiAgICBjbGFzc05hbWU6IHByb3BzLmNsYXNzTmFtZSxcbiAgICBvcGFjaXR5OiBcIjBcIixcbiAgICB3aWR0aDogXCIxOFwiLFxuICAgIGhlaWdodDogXCIxOFwiXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInJlY3RcIiwge1xuICAgIGNsYXNzTmFtZTogcHJvcHMuY2xhc3NOYW1lLFxuICAgIGhlaWdodDogXCIxXCIsXG4gICAgcng6IFwiMC4yNVwiLFxuICAgIHdpZHRoOiBcIjFcIixcbiAgICB4OiBcIjE2XCIsXG4gICAgeTogXCIxMVwiXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInJlY3RcIiwge1xuICAgIGNsYXNzTmFtZTogcHJvcHMuY2xhc3NOYW1lLFxuICAgIGhlaWdodDogXCIxXCIsXG4gICAgcng6IFwiMC4yNVwiLFxuICAgIHdpZHRoOiBcIjFcIixcbiAgICB4OiBcIjE2XCIsXG4gICAgeTogXCI5XCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicmVjdFwiLCB7XG4gICAgY2xhc3NOYW1lOiBwcm9wcy5jbGFzc05hbWUsXG4gICAgaGVpZ2h0OiBcIjFcIixcbiAgICByeDogXCIwLjI1XCIsXG4gICAgd2lkdGg6IFwiMVwiLFxuICAgIHg6IFwiMTZcIixcbiAgICB5OiBcIjdcIlxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJyZWN0XCIsIHtcbiAgICBjbGFzc05hbWU6IHByb3BzLmNsYXNzTmFtZSxcbiAgICBoZWlnaHQ6IFwiMVwiLFxuICAgIHJ4OiBcIjAuMjVcIixcbiAgICB3aWR0aDogXCIxXCIsXG4gICAgeDogXCIxNlwiLFxuICAgIHk6IFwiNVwiXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInJlY3RcIiwge1xuICAgIGNsYXNzTmFtZTogcHJvcHMuY2xhc3NOYW1lLFxuICAgIGhlaWdodDogXCIxXCIsXG4gICAgcng6IFwiMC4yNVwiLFxuICAgIHdpZHRoOiBcIjFcIixcbiAgICB4OiBcIjE2XCIsXG4gICAgeTogXCIzXCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicmVjdFwiLCB7XG4gICAgY2xhc3NOYW1lOiBwcm9wcy5jbGFzc05hbWUsXG4gICAgaGVpZ2h0OiBcIjFcIixcbiAgICByeDogXCIwLjI1XCIsXG4gICAgd2lkdGg6IFwiMVwiLFxuICAgIHg6IFwiMTZcIixcbiAgICB5OiBcIjFcIlxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJyZWN0XCIsIHtcbiAgICBjbGFzc05hbWU6IHByb3BzLmNsYXNzTmFtZSxcbiAgICBoZWlnaHQ6IFwiMVwiLFxuICAgIHJ4OiBcIjAuMjVcIixcbiAgICB3aWR0aDogXCIxXCIsXG4gICAgeDogXCIxNFwiLFxuICAgIHk6IFwiMVwiXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInJlY3RcIiwge1xuICAgIGNsYXNzTmFtZTogcHJvcHMuY2xhc3NOYW1lLFxuICAgIGhlaWdodDogXCIxXCIsXG4gICAgcng6IFwiMC4yNVwiLFxuICAgIHdpZHRoOiBcIjFcIixcbiAgICB4OiBcIjEyXCIsXG4gICAgeTogXCIxXCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicmVjdFwiLCB7XG4gICAgY2xhc3NOYW1lOiBwcm9wcy5jbGFzc05hbWUsXG4gICAgaGVpZ2h0OiBcIjFcIixcbiAgICByeDogXCIwLjI1XCIsXG4gICAgd2lkdGg6IFwiMVwiLFxuICAgIHg6IFwiMTBcIixcbiAgICB5OiBcIjFcIlxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJyZWN0XCIsIHtcbiAgICBjbGFzc05hbWU6IHByb3BzLmNsYXNzTmFtZSxcbiAgICBoZWlnaHQ6IFwiMVwiLFxuICAgIHJ4OiBcIjAuMjVcIixcbiAgICB3aWR0aDogXCIxXCIsXG4gICAgeDogXCI4XCIsXG4gICAgeTogXCIxXCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicmVjdFwiLCB7XG4gICAgY2xhc3NOYW1lOiBwcm9wcy5jbGFzc05hbWUsXG4gICAgaGVpZ2h0OiBcIjFcIixcbiAgICByeDogXCIwLjI1XCIsXG4gICAgd2lkdGg6IFwiMVwiLFxuICAgIHg6IFwiNlwiLFxuICAgIHk6IFwiMVwiXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInJlY3RcIiwge1xuICAgIGNsYXNzTmFtZTogcHJvcHMuY2xhc3NOYW1lLFxuICAgIGhlaWdodDogXCIxXCIsXG4gICAgcng6IFwiMC4yNVwiLFxuICAgIHdpZHRoOiBcIjFcIixcbiAgICB4OiBcIjZcIixcbiAgICB5OiBcIjNcIlxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJyZWN0XCIsIHtcbiAgICBjbGFzc05hbWU6IHByb3BzLmNsYXNzTmFtZSxcbiAgICBoZWlnaHQ6IFwiMVwiLFxuICAgIHJ4OiBcIjAuMjVcIixcbiAgICB3aWR0aDogXCIxXCIsXG4gICAgeDogXCI2XCIsXG4gICAgeTogXCI1XCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicmVjdFwiLCB7XG4gICAgY2xhc3NOYW1lOiBwcm9wcy5jbGFzc05hbWUsXG4gICAgaGVpZ2h0OiBcIjFcIixcbiAgICByeDogXCIwLjI1XCIsXG4gICAgd2lkdGg6IFwiMVwiLFxuICAgIHg6IFwiNlwiLFxuICAgIHk6IFwiN1wiXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInJlY3RcIiwge1xuICAgIGNsYXNzTmFtZTogcHJvcHMuY2xhc3NOYW1lLFxuICAgIGhlaWdodDogXCIxXCIsXG4gICAgcng6IFwiMC4yNVwiLFxuICAgIHdpZHRoOiBcIjFcIixcbiAgICB4OiBcIjZcIixcbiAgICB5OiBcIjlcIlxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJyZWN0XCIsIHtcbiAgICBjbGFzc05hbWU6IHByb3BzLmNsYXNzTmFtZSxcbiAgICBoZWlnaHQ6IFwiMVwiLFxuICAgIHJ4OiBcIjAuMjVcIixcbiAgICB3aWR0aDogXCIxXCIsXG4gICAgeDogXCI2XCIsXG4gICAgeTogXCIxMVwiXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInJlY3RcIiwge1xuICAgIGNsYXNzTmFtZTogcHJvcHMuY2xhc3NOYW1lLFxuICAgIGhlaWdodDogXCIxXCIsXG4gICAgcng6IFwiMC4yNVwiLFxuICAgIHdpZHRoOiBcIjFcIixcbiAgICB4OiBcIjhcIixcbiAgICB5OiBcIjExXCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicmVjdFwiLCB7XG4gICAgY2xhc3NOYW1lOiBwcm9wcy5jbGFzc05hbWUsXG4gICAgaGVpZ2h0OiBcIjFcIixcbiAgICByeDogXCIwLjI1XCIsXG4gICAgd2lkdGg6IFwiMVwiLFxuICAgIHg6IFwiMTBcIixcbiAgICB5OiBcIjExXCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicmVjdFwiLCB7XG4gICAgY2xhc3NOYW1lOiBwcm9wcy5jbGFzc05hbWUsXG4gICAgaGVpZ2h0OiBcIjFcIixcbiAgICByeDogXCIwLjI1XCIsXG4gICAgd2lkdGg6IFwiMVwiLFxuICAgIHg6IFwiMTJcIixcbiAgICB5OiBcIjExXCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicmVjdFwiLCB7XG4gICAgY2xhc3NOYW1lOiBwcm9wcy5jbGFzc05hbWUsXG4gICAgaGVpZ2h0OiBcIjFcIixcbiAgICByeDogXCIwLjI1XCIsXG4gICAgd2lkdGg6IFwiMVwiLFxuICAgIHg6IFwiMTRcIixcbiAgICB5OiBcIjExXCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgY2xhc3NOYW1lOiBwcm9wcy5jbGFzc05hbWUsXG4gICAgZDogXCJNNSw2SDEuNWEuNS41LDAsMCwwLS41LjV2MTBhLjUuNSwwLDAsMCwuNS41aDEwYS41LjUsMCwwLDAsLjUtLjVWMTNINS41YS41LjUsMCwwLDEtLjUtLjVaXCJcbiAgfSkpO1xufTtcbmV4cG9ydCBkZWZhdWx0IENsaXBib2FyZDsiLCJleHBvcnQgZGVmYXVsdCBfX3dlYnBhY2tfcHVibGljX3BhdGhfXyArIFwiaWNvbnMvSWNvbl9TbGFjay5wbmdcIjsiLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFNsYWNrSW1hZ2UgZnJvbSAnLi4vLi4vYXNzZXRzL2ljb25zL0ljb25fU2xhY2sucG5nJztcbmNvbnN0IFNsYWNrSWNvbiA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICB3aWR0aDogMTgsXG4gICAgaGVpZ2h0OiAxOFxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImltZ1wiLCB7XG4gICAgc3JjOiBTbGFja0ltYWdlXG4gIH0pKTtcbn07XG5leHBvcnQgZGVmYXVsdCBTbGFja0ljb247IiwiZXhwb3J0IGRlZmF1bHQgX193ZWJwYWNrX3B1YmxpY19wYXRoX18gKyBcImljb25zL0ljb25fTGlnaHRyb29tRGVza3RvcC5wbmdcIjsiLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IExpZ2h0cm9vbURlc2t0b3BJbWFnZSBmcm9tICcuLi8uLi9hc3NldHMvaWNvbnMvSWNvbl9MaWdodHJvb21EZXNrdG9wLnBuZyc7XG5jb25zdCBMaWdodHJvb21EZXNrdG9wSWNvbiA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICB3aWR0aDogMTgsXG4gICAgaGVpZ2h0OiAxOFxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImltZ1wiLCB7XG4gICAgc3JjOiBMaWdodHJvb21EZXNrdG9wSW1hZ2VcbiAgfSkpO1xufTtcbmV4cG9ydCBkZWZhdWx0IExpZ2h0cm9vbURlc2t0b3BJY29uOyIsImV4cG9ydCBkZWZhdWx0IF9fd2VicGFja19wdWJsaWNfcGF0aF9fICsgXCJpY29ucy9JY29uX0xpZ2h0cm9vbUNsYXNzaWMucG5nXCI7IiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBMaWdodHJvb21DbGFzc2ljSW1hZ2UgZnJvbSAnLi4vLi4vYXNzZXRzL2ljb25zL0ljb25fTGlnaHRyb29tQ2xhc3NpYy5wbmcnO1xuY29uc3QgTGlnaHRyb29tQ2xhc3NpY0ljb24gPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgd2lkdGg6IDE4LFxuICAgIGhlaWdodDogMThcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJpbWdcIiwge1xuICAgIHNyYzogTGlnaHRyb29tQ2xhc3NpY0ltYWdlXG4gIH0pKTtcbn07XG5leHBvcnQgZGVmYXVsdCBMaWdodHJvb21DbGFzc2ljSWNvbjsiLCJmdW5jdGlvbiBfZXh0ZW5kcygpIHsgcmV0dXJuIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiA/IE9iamVjdC5hc3NpZ24uYmluZCgpIDogZnVuY3Rpb24gKG4pIHsgZm9yICh2YXIgZSA9IDE7IGUgPCBhcmd1bWVudHMubGVuZ3RoOyBlKyspIHsgdmFyIHQgPSBhcmd1bWVudHNbZV07IGZvciAodmFyIHIgaW4gdCkgKHt9KS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIHIpICYmIChuW3JdID0gdFtyXSk7IH0gcmV0dXJuIG47IH0sIF9leHRlbmRzLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7IH1cbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuY29uc3QgT3RoZXJBcHBzID0gZnVuY3Rpb24gKHByb3BzKSB7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInN2Z1wiLCBfZXh0ZW5kcyh7XG4gICAgeG1sbnM6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIixcbiAgICB3aWR0aDogMTgsXG4gICAgaGVpZ2h0OiAxOCxcbiAgICBmaWxsOiBcIm5vbmVcIlxuICB9LCBwcm9wcyksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgY2xhc3NOYW1lOiBwcm9wcy5jbGFzc05hbWUsXG4gICAgZmlsbDogXCIjRUJFQkVCXCIsXG4gICAgZmlsbFJ1bGU6IFwiZXZlbm9kZFwiLFxuICAgIGQ6IFwiTTUgMTJIM2ExIDEgMCAwIDAtMSAxdjJhMSAxIDAgMCAwIDEgMWgyYTEgMSAwIDAgMCAxLTF2LTJhMSAxIDAgMCAwLTEtMVpNMTAgMTJIOGExIDEgMCAwIDAtMSAxdjJhMSAxIDAgMCAwIDEgMWgyYTEgMSAwIDAgMCAxLTF2LTJhMSAxIDAgMCAwLTEtMVpNMTUgMTJoLTJhMSAxIDAgMCAwLTEgMXYyYTEgMSAwIDAgMCAxIDFoMmExIDEgMCAwIDAgMS0xdi0yYTEgMSAwIDAgMC0xLTFaTTE1IDN2MmgtMlYzaDJabS0yLTFhMSAxIDAgMCAwLTEgMXYyYTEgMSAwIDAgMCAxIDFoMmExIDEgMCAwIDAgMS0xVjNhMSAxIDAgMCAwLTEtMWgtMlpNMTAgM3YySDhWM2gyWk04IDJhMSAxIDAgMCAwLTEgMXYyYTEgMSAwIDAgMCAxIDFoMmExIDEgMCAwIDAgMS0xVjNhMSAxIDAgMCAwLTEtMUg4Wk01IDN2MkgzVjNoMlpNMyAyYTEgMSAwIDAgMC0xIDF2MmExIDEgMCAwIDAgMSAxaDJhMSAxIDAgMCAwIDEtMVYzYTEgMSAwIDAgMC0xLTFIM1pNMTUgOHYxLjVoLTJWOGgyWm0tMi0xYTEgMSAwIDAgMC0xIDF2MmExIDEgMCAwIDAgMSAxaDJhMSAxIDAgMCAwIDEtMVY4YTEgMSAwIDAgMC0xLTFoLTJaTTEwIDh2MS41SDhWOGgyWk04IDdhMSAxIDAgMCAwLTEgMXYyYTEgMSAwIDAgMCAxIDFoMmExIDEgMCAwIDAgMS0xVjhhMSAxIDAgMCAwLTEtMUg4Wk01IDh2MS41SDNWOGgyWk0zIDdhMSAxIDAgMCAwLTEgMXYyYTEgMSAwIDAgMCAxIDFoMmExIDEgMCAwIDAgMS0xVjhhMSAxIDAgMCAwLTEtMUgzWlwiLFxuICAgIGNsaXBSdWxlOiBcImV2ZW5vZGRcIlxuICB9KSk7XG59O1xuZXhwb3J0IGRlZmF1bHQgT3RoZXJBcHBzOyIsIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IHRvRm9ybURhdGEgZnJvbSAnLi90b0Zvcm1EYXRhLmpzJztcblxuLyoqXG4gKiBJdCBlbmNvZGVzIGEgc3RyaW5nIGJ5IHJlcGxhY2luZyBhbGwgY2hhcmFjdGVycyB0aGF0IGFyZSBub3QgaW4gdGhlIHVucmVzZXJ2ZWQgc2V0IHdpdGhcbiAqIHRoZWlyIHBlcmNlbnQtZW5jb2RlZCBlcXVpdmFsZW50c1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHIgLSBUaGUgc3RyaW5nIHRvIGVuY29kZS5cbiAqXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgZW5jb2RlZCBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIGVuY29kZShzdHIpIHtcbiAgY29uc3QgY2hhck1hcCA9IHtcbiAgICAnISc6ICclMjEnLFxuICAgIFwiJ1wiOiAnJTI3JyxcbiAgICAnKCc6ICclMjgnLFxuICAgICcpJzogJyUyOScsXG4gICAgJ34nOiAnJTdFJyxcbiAgICAnJTIwJzogJysnLFxuICAgICclMDAnOiAnXFx4MDAnXG4gIH07XG4gIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQoc3RyKS5yZXBsYWNlKC9bIScoKX5dfCUyMHwlMDAvZywgZnVuY3Rpb24gcmVwbGFjZXIobWF0Y2gpIHtcbiAgICByZXR1cm4gY2hhck1hcFttYXRjaF07XG4gIH0pO1xufVxuXG4vKipcbiAqIEl0IHRha2VzIGEgcGFyYW1zIG9iamVjdCBhbmQgY29udmVydHMgaXQgdG8gYSBGb3JtRGF0YSBvYmplY3RcbiAqXG4gKiBAcGFyYW0ge09iamVjdDxzdHJpbmcsIGFueT59IHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIHRvIGJlIGNvbnZlcnRlZCB0byBhIEZvcm1EYXRhIG9iamVjdC5cbiAqIEBwYXJhbSB7T2JqZWN0PHN0cmluZywgYW55Pn0gb3B0aW9ucyAtIFRoZSBvcHRpb25zIG9iamVjdCBwYXNzZWQgdG8gdGhlIEF4aW9zIGNvbnN0cnVjdG9yLlxuICpcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiBBeGlvc1VSTFNlYXJjaFBhcmFtcyhwYXJhbXMsIG9wdGlvbnMpIHtcbiAgdGhpcy5fcGFpcnMgPSBbXTtcblxuICBwYXJhbXMgJiYgdG9Gb3JtRGF0YShwYXJhbXMsIHRoaXMsIG9wdGlvbnMpO1xufVxuXG5jb25zdCBwcm90b3R5cGUgPSBBeGlvc1VSTFNlYXJjaFBhcmFtcy5wcm90b3R5cGU7XG5cbnByb3RvdHlwZS5hcHBlbmQgPSBmdW5jdGlvbiBhcHBlbmQobmFtZSwgdmFsdWUpIHtcbiAgdGhpcy5fcGFpcnMucHVzaChbbmFtZSwgdmFsdWVdKTtcbn07XG5cbnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nKGVuY29kZXIpIHtcbiAgY29uc3QgX2VuY29kZSA9IGVuY29kZXIgPyBmdW5jdGlvbih2YWx1ZSkge1xuICAgIHJldHVybiBlbmNvZGVyLmNhbGwodGhpcywgdmFsdWUsIGVuY29kZSk7XG4gIH0gOiBlbmNvZGU7XG5cbiAgcmV0dXJuIHRoaXMuX3BhaXJzLm1hcChmdW5jdGlvbiBlYWNoKHBhaXIpIHtcbiAgICByZXR1cm4gX2VuY29kZShwYWlyWzBdKSArICc9JyArIF9lbmNvZGUocGFpclsxXSk7XG4gIH0sICcnKS5qb2luKCcmJyk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBBeGlvc1VSTFNlYXJjaFBhcmFtcztcbiIsIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IHV0aWxzIGZyb20gJy4uL3V0aWxzLmpzJztcbmltcG9ydCBBeGlvc1VSTFNlYXJjaFBhcmFtcyBmcm9tICcuLi9oZWxwZXJzL0F4aW9zVVJMU2VhcmNoUGFyYW1zLmpzJztcblxuLyoqXG4gKiBJdCByZXBsYWNlcyBhbGwgaW5zdGFuY2VzIG9mIHRoZSBjaGFyYWN0ZXJzIGA6YCwgYCRgLCBgLGAsIGArYCwgYFtgLCBhbmQgYF1gIHdpdGggdGhlaXJcbiAqIFVSSSBlbmNvZGVkIGNvdW50ZXJwYXJ0c1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWwgVGhlIHZhbHVlIHRvIGJlIGVuY29kZWQuXG4gKlxuICogQHJldHVybnMge3N0cmluZ30gVGhlIGVuY29kZWQgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGVuY29kZSh2YWwpIHtcbiAgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudCh2YWwpLlxuICAgIHJlcGxhY2UoLyUzQS9naSwgJzonKS5cbiAgICByZXBsYWNlKC8lMjQvZywgJyQnKS5cbiAgICByZXBsYWNlKC8lMkMvZ2ksICcsJykuXG4gICAgcmVwbGFjZSgvJTIwL2csICcrJykuXG4gICAgcmVwbGFjZSgvJTVCL2dpLCAnWycpLlxuICAgIHJlcGxhY2UoLyU1RC9naSwgJ10nKTtcbn1cblxuLyoqXG4gKiBCdWlsZCBhIFVSTCBieSBhcHBlbmRpbmcgcGFyYW1zIHRvIHRoZSBlbmRcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdXJsIFRoZSBiYXNlIG9mIHRoZSB1cmwgKGUuZy4sIGh0dHA6Ly93d3cuZ29vZ2xlLmNvbSlcbiAqIEBwYXJhbSB7b2JqZWN0fSBbcGFyYW1zXSBUaGUgcGFyYW1zIHRvIGJlIGFwcGVuZGVkXG4gKiBAcGFyYW0gez8ob2JqZWN0fEZ1bmN0aW9uKX0gb3B0aW9uc1xuICpcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBmb3JtYXR0ZWQgdXJsXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGJ1aWxkVVJMKHVybCwgcGFyYW1zLCBvcHRpb25zKSB7XG4gIC8qZXNsaW50IG5vLXBhcmFtLXJlYXNzaWduOjAqL1xuICBpZiAoIXBhcmFtcykge1xuICAgIHJldHVybiB1cmw7XG4gIH1cbiAgXG4gIGNvbnN0IF9lbmNvZGUgPSBvcHRpb25zICYmIG9wdGlvbnMuZW5jb2RlIHx8IGVuY29kZTtcblxuICBpZiAodXRpbHMuaXNGdW5jdGlvbihvcHRpb25zKSkge1xuICAgIG9wdGlvbnMgPSB7XG4gICAgICBzZXJpYWxpemU6IG9wdGlvbnNcbiAgICB9O1xuICB9IFxuXG4gIGNvbnN0IHNlcmlhbGl6ZUZuID0gb3B0aW9ucyAmJiBvcHRpb25zLnNlcmlhbGl6ZTtcblxuICBsZXQgc2VyaWFsaXplZFBhcmFtcztcblxuICBpZiAoc2VyaWFsaXplRm4pIHtcbiAgICBzZXJpYWxpemVkUGFyYW1zID0gc2VyaWFsaXplRm4ocGFyYW1zLCBvcHRpb25zKTtcbiAgfSBlbHNlIHtcbiAgICBzZXJpYWxpemVkUGFyYW1zID0gdXRpbHMuaXNVUkxTZWFyY2hQYXJhbXMocGFyYW1zKSA/XG4gICAgICBwYXJhbXMudG9TdHJpbmcoKSA6XG4gICAgICBuZXcgQXhpb3NVUkxTZWFyY2hQYXJhbXMocGFyYW1zLCBvcHRpb25zKS50b1N0cmluZyhfZW5jb2RlKTtcbiAgfVxuXG4gIGlmIChzZXJpYWxpemVkUGFyYW1zKSB7XG4gICAgY29uc3QgaGFzaG1hcmtJbmRleCA9IHVybC5pbmRleE9mKFwiI1wiKTtcblxuICAgIGlmIChoYXNobWFya0luZGV4ICE9PSAtMSkge1xuICAgICAgdXJsID0gdXJsLnNsaWNlKDAsIGhhc2htYXJrSW5kZXgpO1xuICAgIH1cbiAgICB1cmwgKz0gKHVybC5pbmRleE9mKCc/JykgPT09IC0xID8gJz8nIDogJyYnKSArIHNlcmlhbGl6ZWRQYXJhbXM7XG4gIH1cblxuICByZXR1cm4gdXJsO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgdXRpbHMgZnJvbSAnLi8uLi91dGlscy5qcyc7XG5cbmNsYXNzIEludGVyY2VwdG9yTWFuYWdlciB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuaGFuZGxlcnMgPSBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBuZXcgaW50ZXJjZXB0b3IgdG8gdGhlIHN0YWNrXG4gICAqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bGZpbGxlZCBUaGUgZnVuY3Rpb24gdG8gaGFuZGxlIGB0aGVuYCBmb3IgYSBgUHJvbWlzZWBcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gcmVqZWN0ZWQgVGhlIGZ1bmN0aW9uIHRvIGhhbmRsZSBgcmVqZWN0YCBmb3IgYSBgUHJvbWlzZWBcbiAgICpcbiAgICogQHJldHVybiB7TnVtYmVyfSBBbiBJRCB1c2VkIHRvIHJlbW92ZSBpbnRlcmNlcHRvciBsYXRlclxuICAgKi9cbiAgdXNlKGZ1bGZpbGxlZCwgcmVqZWN0ZWQsIG9wdGlvbnMpIHtcbiAgICB0aGlzLmhhbmRsZXJzLnB1c2goe1xuICAgICAgZnVsZmlsbGVkLFxuICAgICAgcmVqZWN0ZWQsXG4gICAgICBzeW5jaHJvbm91czogb3B0aW9ucyA/IG9wdGlvbnMuc3luY2hyb25vdXMgOiBmYWxzZSxcbiAgICAgIHJ1bldoZW46IG9wdGlvbnMgPyBvcHRpb25zLnJ1bldoZW4gOiBudWxsXG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXMuaGFuZGxlcnMubGVuZ3RoIC0gMTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgYW4gaW50ZXJjZXB0b3IgZnJvbSB0aGUgc3RhY2tcbiAgICpcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGlkIFRoZSBJRCB0aGF0IHdhcyByZXR1cm5lZCBieSBgdXNlYFxuICAgKlxuICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gYHRydWVgIGlmIHRoZSBpbnRlcmNlcHRvciB3YXMgcmVtb3ZlZCwgYGZhbHNlYCBvdGhlcndpc2VcbiAgICovXG4gIGVqZWN0KGlkKSB7XG4gICAgaWYgKHRoaXMuaGFuZGxlcnNbaWRdKSB7XG4gICAgICB0aGlzLmhhbmRsZXJzW2lkXSA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIGFsbCBpbnRlcmNlcHRvcnMgZnJvbSB0aGUgc3RhY2tcbiAgICpcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBjbGVhcigpIHtcbiAgICBpZiAodGhpcy5oYW5kbGVycykge1xuICAgICAgdGhpcy5oYW5kbGVycyA9IFtdO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJdGVyYXRlIG92ZXIgYWxsIHRoZSByZWdpc3RlcmVkIGludGVyY2VwdG9yc1xuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBpcyBwYXJ0aWN1bGFybHkgdXNlZnVsIGZvciBza2lwcGluZyBvdmVyIGFueVxuICAgKiBpbnRlcmNlcHRvcnMgdGhhdCBtYXkgaGF2ZSBiZWNvbWUgYG51bGxgIGNhbGxpbmcgYGVqZWN0YC5cbiAgICpcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGZ1bmN0aW9uIHRvIGNhbGwgZm9yIGVhY2ggaW50ZXJjZXB0b3JcbiAgICpcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBmb3JFYWNoKGZuKSB7XG4gICAgdXRpbHMuZm9yRWFjaCh0aGlzLmhhbmRsZXJzLCBmdW5jdGlvbiBmb3JFYWNoSGFuZGxlcihoKSB7XG4gICAgICBpZiAoaCAhPT0gbnVsbCkge1xuICAgICAgICBmbihoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBJbnRlcmNlcHRvck1hbmFnZXI7XG4iLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgc2lsZW50SlNPTlBhcnNpbmc6IHRydWUsXG4gIGZvcmNlZEpTT05QYXJzaW5nOiB0cnVlLFxuICBjbGFyaWZ5VGltZW91dEVycm9yOiBmYWxzZVxufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IEF4aW9zVVJMU2VhcmNoUGFyYW1zIGZyb20gJy4uLy4uLy4uL2hlbHBlcnMvQXhpb3NVUkxTZWFyY2hQYXJhbXMuanMnO1xuZXhwb3J0IGRlZmF1bHQgdHlwZW9mIFVSTFNlYXJjaFBhcmFtcyAhPT0gJ3VuZGVmaW5lZCcgPyBVUkxTZWFyY2hQYXJhbXMgOiBBeGlvc1VSTFNlYXJjaFBhcmFtcztcbiIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0IGRlZmF1bHQgdHlwZW9mIEZvcm1EYXRhICE9PSAndW5kZWZpbmVkJyA/IEZvcm1EYXRhIDogbnVsbDtcbiIsIid1c2Ugc3RyaWN0J1xuXG5leHBvcnQgZGVmYXVsdCB0eXBlb2YgQmxvYiAhPT0gJ3VuZGVmaW5lZCcgPyBCbG9iIDogbnVsbFxuIiwiaW1wb3J0IFVSTFNlYXJjaFBhcmFtcyBmcm9tICcuL2NsYXNzZXMvVVJMU2VhcmNoUGFyYW1zLmpzJ1xuaW1wb3J0IEZvcm1EYXRhIGZyb20gJy4vY2xhc3Nlcy9Gb3JtRGF0YS5qcydcbmltcG9ydCBCbG9iIGZyb20gJy4vY2xhc3Nlcy9CbG9iLmpzJ1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGlzQnJvd3NlcjogdHJ1ZSxcbiAgY2xhc3Nlczoge1xuICAgIFVSTFNlYXJjaFBhcmFtcyxcbiAgICBGb3JtRGF0YSxcbiAgICBCbG9iXG4gIH0sXG4gIHByb3RvY29sczogWydodHRwJywgJ2h0dHBzJywgJ2ZpbGUnLCAnYmxvYicsICd1cmwnLCAnZGF0YSddXG59O1xuIiwiY29uc3QgaGFzQnJvd3NlckVudiA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCc7XG5cbmNvbnN0IF9uYXZpZ2F0b3IgPSB0eXBlb2YgbmF2aWdhdG9yID09PSAnb2JqZWN0JyAmJiBuYXZpZ2F0b3IgfHwgdW5kZWZpbmVkO1xuXG4vKipcbiAqIERldGVybWluZSBpZiB3ZSdyZSBydW5uaW5nIGluIGEgc3RhbmRhcmQgYnJvd3NlciBlbnZpcm9ubWVudFxuICpcbiAqIFRoaXMgYWxsb3dzIGF4aW9zIHRvIHJ1biBpbiBhIHdlYiB3b3JrZXIsIGFuZCByZWFjdC1uYXRpdmUuXG4gKiBCb3RoIGVudmlyb25tZW50cyBzdXBwb3J0IFhNTEh0dHBSZXF1ZXN0LCBidXQgbm90IGZ1bGx5IHN0YW5kYXJkIGdsb2JhbHMuXG4gKlxuICogd2ViIHdvcmtlcnM6XG4gKiAgdHlwZW9mIHdpbmRvdyAtPiB1bmRlZmluZWRcbiAqICB0eXBlb2YgZG9jdW1lbnQgLT4gdW5kZWZpbmVkXG4gKlxuICogcmVhY3QtbmF0aXZlOlxuICogIG5hdmlnYXRvci5wcm9kdWN0IC0+ICdSZWFjdE5hdGl2ZSdcbiAqIG5hdGl2ZXNjcmlwdFxuICogIG5hdmlnYXRvci5wcm9kdWN0IC0+ICdOYXRpdmVTY3JpcHQnIG9yICdOUydcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgaGFzU3RhbmRhcmRCcm93c2VyRW52ID0gaGFzQnJvd3NlckVudiAmJlxuICAoIV9uYXZpZ2F0b3IgfHwgWydSZWFjdE5hdGl2ZScsICdOYXRpdmVTY3JpcHQnLCAnTlMnXS5pbmRleE9mKF9uYXZpZ2F0b3IucHJvZHVjdCkgPCAwKTtcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgd2UncmUgcnVubmluZyBpbiBhIHN0YW5kYXJkIGJyb3dzZXIgd2ViV29ya2VyIGVudmlyb25tZW50XG4gKlxuICogQWx0aG91Z2ggdGhlIGBpc1N0YW5kYXJkQnJvd3NlckVudmAgbWV0aG9kIGluZGljYXRlcyB0aGF0XG4gKiBgYWxsb3dzIGF4aW9zIHRvIHJ1biBpbiBhIHdlYiB3b3JrZXJgLCB0aGUgV2ViV29ya2VyIHdpbGwgc3RpbGwgYmVcbiAqIGZpbHRlcmVkIG91dCBkdWUgdG8gaXRzIGp1ZGdtZW50IHN0YW5kYXJkXG4gKiBgdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJ2AuXG4gKiBUaGlzIGxlYWRzIHRvIGEgcHJvYmxlbSB3aGVuIGF4aW9zIHBvc3QgYEZvcm1EYXRhYCBpbiB3ZWJXb3JrZXJcbiAqL1xuY29uc3QgaGFzU3RhbmRhcmRCcm93c2VyV2ViV29ya2VyRW52ID0gKCgpID0+IHtcbiAgcmV0dXJuIChcbiAgICB0eXBlb2YgV29ya2VyR2xvYmFsU2NvcGUgIT09ICd1bmRlZmluZWQnICYmXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gICAgc2VsZiBpbnN0YW5jZW9mIFdvcmtlckdsb2JhbFNjb3BlICYmXG4gICAgdHlwZW9mIHNlbGYuaW1wb3J0U2NyaXB0cyA9PT0gJ2Z1bmN0aW9uJ1xuICApO1xufSkoKTtcblxuY29uc3Qgb3JpZ2luID0gaGFzQnJvd3NlckVudiAmJiB3aW5kb3cubG9jYXRpb24uaHJlZiB8fCAnaHR0cDovL2xvY2FsaG9zdCc7XG5cbmV4cG9ydCB7XG4gIGhhc0Jyb3dzZXJFbnYsXG4gIGhhc1N0YW5kYXJkQnJvd3NlcldlYldvcmtlckVudixcbiAgaGFzU3RhbmRhcmRCcm93c2VyRW52LFxuICBfbmF2aWdhdG9yIGFzIG5hdmlnYXRvcixcbiAgb3JpZ2luXG59XG4iLCJpbXBvcnQgcGxhdGZvcm0gZnJvbSAnLi9ub2RlL2luZGV4LmpzJztcbmltcG9ydCAqIGFzIHV0aWxzIGZyb20gJy4vY29tbW9uL3V0aWxzLmpzJztcblxuZXhwb3J0IGRlZmF1bHQge1xuICAuLi51dGlscyxcbiAgLi4ucGxhdGZvcm1cbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuaW1wb3J0IHV0aWxzIGZyb20gJy4uL3V0aWxzLmpzJztcbmltcG9ydCB0b0Zvcm1EYXRhIGZyb20gJy4vdG9Gb3JtRGF0YS5qcyc7XG5pbXBvcnQgcGxhdGZvcm0gZnJvbSAnLi4vcGxhdGZvcm0vaW5kZXguanMnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB0b1VSTEVuY29kZWRGb3JtKGRhdGEsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIHRvRm9ybURhdGEoZGF0YSwgbmV3IHBsYXRmb3JtLmNsYXNzZXMuVVJMU2VhcmNoUGFyYW1zKCksIE9iamVjdC5hc3NpZ24oe1xuICAgIHZpc2l0b3I6IGZ1bmN0aW9uKHZhbHVlLCBrZXksIHBhdGgsIGhlbHBlcnMpIHtcbiAgICAgIGlmIChwbGF0Zm9ybS5pc05vZGUgJiYgdXRpbHMuaXNCdWZmZXIodmFsdWUpKSB7XG4gICAgICAgIHRoaXMuYXBwZW5kKGtleSwgdmFsdWUudG9TdHJpbmcoJ2Jhc2U2NCcpKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gaGVscGVycy5kZWZhdWx0VmlzaXRvci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH1cbiAgfSwgb3B0aW9ucykpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgdXRpbHMgZnJvbSAnLi4vdXRpbHMuanMnO1xuXG4vKipcbiAqIEl0IHRha2VzIGEgc3RyaW5nIGxpa2UgYGZvb1t4XVt5XVt6XWAgYW5kIHJldHVybnMgYW4gYXJyYXkgbGlrZSBgWydmb28nLCAneCcsICd5JywgJ3onXVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIGdldC5cbiAqXG4gKiBAcmV0dXJucyBBbiBhcnJheSBvZiBzdHJpbmdzLlxuICovXG5mdW5jdGlvbiBwYXJzZVByb3BQYXRoKG5hbWUpIHtcbiAgLy8gZm9vW3hdW3ldW3pdXG4gIC8vIGZvby54LnkuelxuICAvLyBmb28teC15LXpcbiAgLy8gZm9vIHggeSB6XG4gIHJldHVybiB1dGlscy5tYXRjaEFsbCgvXFx3K3xcXFsoXFx3KildL2csIG5hbWUpLm1hcChtYXRjaCA9PiB7XG4gICAgcmV0dXJuIG1hdGNoWzBdID09PSAnW10nID8gJycgOiBtYXRjaFsxXSB8fCBtYXRjaFswXTtcbiAgfSk7XG59XG5cbi8qKlxuICogQ29udmVydCBhbiBhcnJheSB0byBhbiBvYmplY3QuXG4gKlxuICogQHBhcmFtIHtBcnJheTxhbnk+fSBhcnIgLSBUaGUgYXJyYXkgdG8gY29udmVydCB0byBhbiBvYmplY3QuXG4gKlxuICogQHJldHVybnMgQW4gb2JqZWN0IHdpdGggdGhlIHNhbWUga2V5cyBhbmQgdmFsdWVzIGFzIHRoZSBhcnJheS5cbiAqL1xuZnVuY3Rpb24gYXJyYXlUb09iamVjdChhcnIpIHtcbiAgY29uc3Qgb2JqID0ge307XG4gIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhhcnIpO1xuICBsZXQgaTtcbiAgY29uc3QgbGVuID0ga2V5cy5sZW5ndGg7XG4gIGxldCBrZXk7XG4gIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgIGtleSA9IGtleXNbaV07XG4gICAgb2JqW2tleV0gPSBhcnJba2V5XTtcbiAgfVxuICByZXR1cm4gb2JqO1xufVxuXG4vKipcbiAqIEl0IHRha2VzIGEgRm9ybURhdGEgb2JqZWN0IGFuZCByZXR1cm5zIGEgSmF2YVNjcmlwdCBvYmplY3RcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZm9ybURhdGEgVGhlIEZvcm1EYXRhIG9iamVjdCB0byBjb252ZXJ0IHRvIEpTT04uXG4gKlxuICogQHJldHVybnMge09iamVjdDxzdHJpbmcsIGFueT4gfCBudWxsfSBUaGUgY29udmVydGVkIG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gZm9ybURhdGFUb0pTT04oZm9ybURhdGEpIHtcbiAgZnVuY3Rpb24gYnVpbGRQYXRoKHBhdGgsIHZhbHVlLCB0YXJnZXQsIGluZGV4KSB7XG4gICAgbGV0IG5hbWUgPSBwYXRoW2luZGV4KytdO1xuXG4gICAgaWYgKG5hbWUgPT09ICdfX3Byb3RvX18nKSByZXR1cm4gdHJ1ZTtcblxuICAgIGNvbnN0IGlzTnVtZXJpY0tleSA9IE51bWJlci5pc0Zpbml0ZSgrbmFtZSk7XG4gICAgY29uc3QgaXNMYXN0ID0gaW5kZXggPj0gcGF0aC5sZW5ndGg7XG4gICAgbmFtZSA9ICFuYW1lICYmIHV0aWxzLmlzQXJyYXkodGFyZ2V0KSA/IHRhcmdldC5sZW5ndGggOiBuYW1lO1xuXG4gICAgaWYgKGlzTGFzdCkge1xuICAgICAgaWYgKHV0aWxzLmhhc093blByb3AodGFyZ2V0LCBuYW1lKSkge1xuICAgICAgICB0YXJnZXRbbmFtZV0gPSBbdGFyZ2V0W25hbWVdLCB2YWx1ZV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0YXJnZXRbbmFtZV0gPSB2YWx1ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuICFpc051bWVyaWNLZXk7XG4gICAgfVxuXG4gICAgaWYgKCF0YXJnZXRbbmFtZV0gfHwgIXV0aWxzLmlzT2JqZWN0KHRhcmdldFtuYW1lXSkpIHtcbiAgICAgIHRhcmdldFtuYW1lXSA9IFtdO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IGJ1aWxkUGF0aChwYXRoLCB2YWx1ZSwgdGFyZ2V0W25hbWVdLCBpbmRleCk7XG5cbiAgICBpZiAocmVzdWx0ICYmIHV0aWxzLmlzQXJyYXkodGFyZ2V0W25hbWVdKSkge1xuICAgICAgdGFyZ2V0W25hbWVdID0gYXJyYXlUb09iamVjdCh0YXJnZXRbbmFtZV0pO1xuICAgIH1cblxuICAgIHJldHVybiAhaXNOdW1lcmljS2V5O1xuICB9XG5cbiAgaWYgKHV0aWxzLmlzRm9ybURhdGEoZm9ybURhdGEpICYmIHV0aWxzLmlzRnVuY3Rpb24oZm9ybURhdGEuZW50cmllcykpIHtcbiAgICBjb25zdCBvYmogPSB7fTtcblxuICAgIHV0aWxzLmZvckVhY2hFbnRyeShmb3JtRGF0YSwgKG5hbWUsIHZhbHVlKSA9PiB7XG4gICAgICBidWlsZFBhdGgocGFyc2VQcm9wUGF0aChuYW1lKSwgdmFsdWUsIG9iaiwgMCk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gb2JqO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZvcm1EYXRhVG9KU09OO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgdXRpbHMgZnJvbSAnLi4vdXRpbHMuanMnO1xuaW1wb3J0IEF4aW9zRXJyb3IgZnJvbSAnLi4vY29yZS9BeGlvc0Vycm9yLmpzJztcbmltcG9ydCB0cmFuc2l0aW9uYWxEZWZhdWx0cyBmcm9tICcuL3RyYW5zaXRpb25hbC5qcyc7XG5pbXBvcnQgdG9Gb3JtRGF0YSBmcm9tICcuLi9oZWxwZXJzL3RvRm9ybURhdGEuanMnO1xuaW1wb3J0IHRvVVJMRW5jb2RlZEZvcm0gZnJvbSAnLi4vaGVscGVycy90b1VSTEVuY29kZWRGb3JtLmpzJztcbmltcG9ydCBwbGF0Zm9ybSBmcm9tICcuLi9wbGF0Zm9ybS9pbmRleC5qcyc7XG5pbXBvcnQgZm9ybURhdGFUb0pTT04gZnJvbSAnLi4vaGVscGVycy9mb3JtRGF0YVRvSlNPTi5qcyc7XG5cbi8qKlxuICogSXQgdGFrZXMgYSBzdHJpbmcsIHRyaWVzIHRvIHBhcnNlIGl0LCBhbmQgaWYgaXQgZmFpbHMsIGl0IHJldHVybnMgdGhlIHN0cmluZ2lmaWVkIHZlcnNpb25cbiAqIG9mIHRoZSBpbnB1dFxuICpcbiAqIEBwYXJhbSB7YW55fSByYXdWYWx1ZSAtIFRoZSB2YWx1ZSB0byBiZSBzdHJpbmdpZmllZC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHBhcnNlciAtIEEgZnVuY3Rpb24gdGhhdCBwYXJzZXMgYSBzdHJpbmcgaW50byBhIEphdmFTY3JpcHQgb2JqZWN0LlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZW5jb2RlciAtIEEgZnVuY3Rpb24gdGhhdCB0YWtlcyBhIHZhbHVlIGFuZCByZXR1cm5zIGEgc3RyaW5nLlxuICpcbiAqIEByZXR1cm5zIHtzdHJpbmd9IEEgc3RyaW5naWZpZWQgdmVyc2lvbiBvZiB0aGUgcmF3VmFsdWUuXG4gKi9cbmZ1bmN0aW9uIHN0cmluZ2lmeVNhZmVseShyYXdWYWx1ZSwgcGFyc2VyLCBlbmNvZGVyKSB7XG4gIGlmICh1dGlscy5pc1N0cmluZyhyYXdWYWx1ZSkpIHtcbiAgICB0cnkge1xuICAgICAgKHBhcnNlciB8fCBKU09OLnBhcnNlKShyYXdWYWx1ZSk7XG4gICAgICByZXR1cm4gdXRpbHMudHJpbShyYXdWYWx1ZSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaWYgKGUubmFtZSAhPT0gJ1N5bnRheEVycm9yJykge1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiAoZW5jb2RlciB8fCBKU09OLnN0cmluZ2lmeSkocmF3VmFsdWUpO1xufVxuXG5jb25zdCBkZWZhdWx0cyA9IHtcblxuICB0cmFuc2l0aW9uYWw6IHRyYW5zaXRpb25hbERlZmF1bHRzLFxuXG4gIGFkYXB0ZXI6IFsneGhyJywgJ2h0dHAnLCAnZmV0Y2gnXSxcblxuICB0cmFuc2Zvcm1SZXF1ZXN0OiBbZnVuY3Rpb24gdHJhbnNmb3JtUmVxdWVzdChkYXRhLCBoZWFkZXJzKSB7XG4gICAgY29uc3QgY29udGVudFR5cGUgPSBoZWFkZXJzLmdldENvbnRlbnRUeXBlKCkgfHwgJyc7XG4gICAgY29uc3QgaGFzSlNPTkNvbnRlbnRUeXBlID0gY29udGVudFR5cGUuaW5kZXhPZignYXBwbGljYXRpb24vanNvbicpID4gLTE7XG4gICAgY29uc3QgaXNPYmplY3RQYXlsb2FkID0gdXRpbHMuaXNPYmplY3QoZGF0YSk7XG5cbiAgICBpZiAoaXNPYmplY3RQYXlsb2FkICYmIHV0aWxzLmlzSFRNTEZvcm0oZGF0YSkpIHtcbiAgICAgIGRhdGEgPSBuZXcgRm9ybURhdGEoZGF0YSk7XG4gICAgfVxuXG4gICAgY29uc3QgaXNGb3JtRGF0YSA9IHV0aWxzLmlzRm9ybURhdGEoZGF0YSk7XG5cbiAgICBpZiAoaXNGb3JtRGF0YSkge1xuICAgICAgcmV0dXJuIGhhc0pTT05Db250ZW50VHlwZSA/IEpTT04uc3RyaW5naWZ5KGZvcm1EYXRhVG9KU09OKGRhdGEpKSA6IGRhdGE7XG4gICAgfVxuXG4gICAgaWYgKHV0aWxzLmlzQXJyYXlCdWZmZXIoZGF0YSkgfHxcbiAgICAgIHV0aWxzLmlzQnVmZmVyKGRhdGEpIHx8XG4gICAgICB1dGlscy5pc1N0cmVhbShkYXRhKSB8fFxuICAgICAgdXRpbHMuaXNGaWxlKGRhdGEpIHx8XG4gICAgICB1dGlscy5pc0Jsb2IoZGF0YSkgfHxcbiAgICAgIHV0aWxzLmlzUmVhZGFibGVTdHJlYW0oZGF0YSlcbiAgICApIHtcbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cbiAgICBpZiAodXRpbHMuaXNBcnJheUJ1ZmZlclZpZXcoZGF0YSkpIHtcbiAgICAgIHJldHVybiBkYXRhLmJ1ZmZlcjtcbiAgICB9XG4gICAgaWYgKHV0aWxzLmlzVVJMU2VhcmNoUGFyYW1zKGRhdGEpKSB7XG4gICAgICBoZWFkZXJzLnNldENvbnRlbnRUeXBlKCdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7Y2hhcnNldD11dGYtOCcsIGZhbHNlKTtcbiAgICAgIHJldHVybiBkYXRhLnRvU3RyaW5nKCk7XG4gICAgfVxuXG4gICAgbGV0IGlzRmlsZUxpc3Q7XG5cbiAgICBpZiAoaXNPYmplY3RQYXlsb2FkKSB7XG4gICAgICBpZiAoY29udGVudFR5cGUuaW5kZXhPZignYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJykgPiAtMSkge1xuICAgICAgICByZXR1cm4gdG9VUkxFbmNvZGVkRm9ybShkYXRhLCB0aGlzLmZvcm1TZXJpYWxpemVyKS50b1N0cmluZygpO1xuICAgICAgfVxuXG4gICAgICBpZiAoKGlzRmlsZUxpc3QgPSB1dGlscy5pc0ZpbGVMaXN0KGRhdGEpKSB8fCBjb250ZW50VHlwZS5pbmRleE9mKCdtdWx0aXBhcnQvZm9ybS1kYXRhJykgPiAtMSkge1xuICAgICAgICBjb25zdCBfRm9ybURhdGEgPSB0aGlzLmVudiAmJiB0aGlzLmVudi5Gb3JtRGF0YTtcblxuICAgICAgICByZXR1cm4gdG9Gb3JtRGF0YShcbiAgICAgICAgICBpc0ZpbGVMaXN0ID8geydmaWxlc1tdJzogZGF0YX0gOiBkYXRhLFxuICAgICAgICAgIF9Gb3JtRGF0YSAmJiBuZXcgX0Zvcm1EYXRhKCksXG4gICAgICAgICAgdGhpcy5mb3JtU2VyaWFsaXplclxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChpc09iamVjdFBheWxvYWQgfHwgaGFzSlNPTkNvbnRlbnRUeXBlICkge1xuICAgICAgaGVhZGVycy5zZXRDb250ZW50VHlwZSgnYXBwbGljYXRpb24vanNvbicsIGZhbHNlKTtcbiAgICAgIHJldHVybiBzdHJpbmdpZnlTYWZlbHkoZGF0YSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRhdGE7XG4gIH1dLFxuXG4gIHRyYW5zZm9ybVJlc3BvbnNlOiBbZnVuY3Rpb24gdHJhbnNmb3JtUmVzcG9uc2UoZGF0YSkge1xuICAgIGNvbnN0IHRyYW5zaXRpb25hbCA9IHRoaXMudHJhbnNpdGlvbmFsIHx8IGRlZmF1bHRzLnRyYW5zaXRpb25hbDtcbiAgICBjb25zdCBmb3JjZWRKU09OUGFyc2luZyA9IHRyYW5zaXRpb25hbCAmJiB0cmFuc2l0aW9uYWwuZm9yY2VkSlNPTlBhcnNpbmc7XG4gICAgY29uc3QgSlNPTlJlcXVlc3RlZCA9IHRoaXMucmVzcG9uc2VUeXBlID09PSAnanNvbic7XG5cbiAgICBpZiAodXRpbHMuaXNSZXNwb25zZShkYXRhKSB8fCB1dGlscy5pc1JlYWRhYmxlU3RyZWFtKGRhdGEpKSB7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG5cbiAgICBpZiAoZGF0YSAmJiB1dGlscy5pc1N0cmluZyhkYXRhKSAmJiAoKGZvcmNlZEpTT05QYXJzaW5nICYmICF0aGlzLnJlc3BvbnNlVHlwZSkgfHwgSlNPTlJlcXVlc3RlZCkpIHtcbiAgICAgIGNvbnN0IHNpbGVudEpTT05QYXJzaW5nID0gdHJhbnNpdGlvbmFsICYmIHRyYW5zaXRpb25hbC5zaWxlbnRKU09OUGFyc2luZztcbiAgICAgIGNvbnN0IHN0cmljdEpTT05QYXJzaW5nID0gIXNpbGVudEpTT05QYXJzaW5nICYmIEpTT05SZXF1ZXN0ZWQ7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKGRhdGEpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpZiAoc3RyaWN0SlNPTlBhcnNpbmcpIHtcbiAgICAgICAgICBpZiAoZS5uYW1lID09PSAnU3ludGF4RXJyb3InKSB7XG4gICAgICAgICAgICB0aHJvdyBBeGlvc0Vycm9yLmZyb20oZSwgQXhpb3NFcnJvci5FUlJfQkFEX1JFU1BPTlNFLCB0aGlzLCBudWxsLCB0aGlzLnJlc3BvbnNlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBkYXRhO1xuICB9XSxcblxuICAvKipcbiAgICogQSB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcyB0byBhYm9ydCBhIHJlcXVlc3QuIElmIHNldCB0byAwIChkZWZhdWx0KSBhXG4gICAqIHRpbWVvdXQgaXMgbm90IGNyZWF0ZWQuXG4gICAqL1xuICB0aW1lb3V0OiAwLFxuXG4gIHhzcmZDb29raWVOYW1lOiAnWFNSRi1UT0tFTicsXG4gIHhzcmZIZWFkZXJOYW1lOiAnWC1YU1JGLVRPS0VOJyxcblxuICBtYXhDb250ZW50TGVuZ3RoOiAtMSxcbiAgbWF4Qm9keUxlbmd0aDogLTEsXG5cbiAgZW52OiB7XG4gICAgRm9ybURhdGE6IHBsYXRmb3JtLmNsYXNzZXMuRm9ybURhdGEsXG4gICAgQmxvYjogcGxhdGZvcm0uY2xhc3Nlcy5CbG9iXG4gIH0sXG5cbiAgdmFsaWRhdGVTdGF0dXM6IGZ1bmN0aW9uIHZhbGlkYXRlU3RhdHVzKHN0YXR1cykge1xuICAgIHJldHVybiBzdGF0dXMgPj0gMjAwICYmIHN0YXR1cyA8IDMwMDtcbiAgfSxcblxuICBoZWFkZXJzOiB7XG4gICAgY29tbW9uOiB7XG4gICAgICAnQWNjZXB0JzogJ2FwcGxpY2F0aW9uL2pzb24sIHRleHQvcGxhaW4sICovKicsXG4gICAgICAnQ29udGVudC1UeXBlJzogdW5kZWZpbmVkXG4gICAgfVxuICB9XG59O1xuXG51dGlscy5mb3JFYWNoKFsnZGVsZXRlJywgJ2dldCcsICdoZWFkJywgJ3Bvc3QnLCAncHV0JywgJ3BhdGNoJ10sIChtZXRob2QpID0+IHtcbiAgZGVmYXVsdHMuaGVhZGVyc1ttZXRob2RdID0ge307XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgZGVmYXVsdHM7XG4iLCIndXNlIHN0cmljdCc7XG5cbmltcG9ydCB1dGlscyBmcm9tICcuLy4uL3V0aWxzLmpzJztcblxuLy8gUmF3QXhpb3NIZWFkZXJzIHdob3NlIGR1cGxpY2F0ZXMgYXJlIGlnbm9yZWQgYnkgbm9kZVxuLy8gYy5mLiBodHRwczovL25vZGVqcy5vcmcvYXBpL2h0dHAuaHRtbCNodHRwX21lc3NhZ2VfaGVhZGVyc1xuY29uc3QgaWdub3JlRHVwbGljYXRlT2YgPSB1dGlscy50b09iamVjdFNldChbXG4gICdhZ2UnLCAnYXV0aG9yaXphdGlvbicsICdjb250ZW50LWxlbmd0aCcsICdjb250ZW50LXR5cGUnLCAnZXRhZycsXG4gICdleHBpcmVzJywgJ2Zyb20nLCAnaG9zdCcsICdpZi1tb2RpZmllZC1zaW5jZScsICdpZi11bm1vZGlmaWVkLXNpbmNlJyxcbiAgJ2xhc3QtbW9kaWZpZWQnLCAnbG9jYXRpb24nLCAnbWF4LWZvcndhcmRzJywgJ3Byb3h5LWF1dGhvcml6YXRpb24nLFxuICAncmVmZXJlcicsICdyZXRyeS1hZnRlcicsICd1c2VyLWFnZW50J1xuXSk7XG5cbi8qKlxuICogUGFyc2UgaGVhZGVycyBpbnRvIGFuIG9iamVjdFxuICpcbiAqIGBgYFxuICogRGF0ZTogV2VkLCAyNyBBdWcgMjAxNCAwODo1ODo0OSBHTVRcbiAqIENvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvblxuICogQ29ubmVjdGlvbjoga2VlcC1hbGl2ZVxuICogVHJhbnNmZXItRW5jb2Rpbmc6IGNodW5rZWRcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSByYXdIZWFkZXJzIEhlYWRlcnMgbmVlZGluZyB0byBiZSBwYXJzZWRcbiAqXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBIZWFkZXJzIHBhcnNlZCBpbnRvIGFuIG9iamVjdFxuICovXG5leHBvcnQgZGVmYXVsdCByYXdIZWFkZXJzID0+IHtcbiAgY29uc3QgcGFyc2VkID0ge307XG4gIGxldCBrZXk7XG4gIGxldCB2YWw7XG4gIGxldCBpO1xuXG4gIHJhd0hlYWRlcnMgJiYgcmF3SGVhZGVycy5zcGxpdCgnXFxuJykuZm9yRWFjaChmdW5jdGlvbiBwYXJzZXIobGluZSkge1xuICAgIGkgPSBsaW5lLmluZGV4T2YoJzonKTtcbiAgICBrZXkgPSBsaW5lLnN1YnN0cmluZygwLCBpKS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICB2YWwgPSBsaW5lLnN1YnN0cmluZyhpICsgMSkudHJpbSgpO1xuXG4gICAgaWYgKCFrZXkgfHwgKHBhcnNlZFtrZXldICYmIGlnbm9yZUR1cGxpY2F0ZU9mW2tleV0pKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGtleSA9PT0gJ3NldC1jb29raWUnKSB7XG4gICAgICBpZiAocGFyc2VkW2tleV0pIHtcbiAgICAgICAgcGFyc2VkW2tleV0ucHVzaCh2YWwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGFyc2VkW2tleV0gPSBbdmFsXTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcGFyc2VkW2tleV0gPSBwYXJzZWRba2V5XSA/IHBhcnNlZFtrZXldICsgJywgJyArIHZhbCA6IHZhbDtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiBwYXJzZWQ7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgdXRpbHMgZnJvbSAnLi4vdXRpbHMuanMnO1xuaW1wb3J0IHBhcnNlSGVhZGVycyBmcm9tICcuLi9oZWxwZXJzL3BhcnNlSGVhZGVycy5qcyc7XG5cbmNvbnN0ICRpbnRlcm5hbHMgPSBTeW1ib2woJ2ludGVybmFscycpO1xuXG5mdW5jdGlvbiBub3JtYWxpemVIZWFkZXIoaGVhZGVyKSB7XG4gIHJldHVybiBoZWFkZXIgJiYgU3RyaW5nKGhlYWRlcikudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVZhbHVlKHZhbHVlKSB7XG4gIGlmICh2YWx1ZSA9PT0gZmFsc2UgfHwgdmFsdWUgPT0gbnVsbCkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIHJldHVybiB1dGlscy5pc0FycmF5KHZhbHVlKSA/IHZhbHVlLm1hcChub3JtYWxpemVWYWx1ZSkgOiBTdHJpbmcodmFsdWUpO1xufVxuXG5mdW5jdGlvbiBwYXJzZVRva2VucyhzdHIpIHtcbiAgY29uc3QgdG9rZW5zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgY29uc3QgdG9rZW5zUkUgPSAvKFteXFxzLDs9XSspXFxzKig/Oj1cXHMqKFteLDtdKykpPy9nO1xuICBsZXQgbWF0Y2g7XG5cbiAgd2hpbGUgKChtYXRjaCA9IHRva2Vuc1JFLmV4ZWMoc3RyKSkpIHtcbiAgICB0b2tlbnNbbWF0Y2hbMV1dID0gbWF0Y2hbMl07XG4gIH1cblxuICByZXR1cm4gdG9rZW5zO1xufVxuXG5jb25zdCBpc1ZhbGlkSGVhZGVyTmFtZSA9IChzdHIpID0+IC9eWy1fYS16QS1aMC05XmB8fiwhIyQlJicqKy5dKyQvLnRlc3Qoc3RyLnRyaW0oKSk7XG5cbmZ1bmN0aW9uIG1hdGNoSGVhZGVyVmFsdWUoY29udGV4dCwgdmFsdWUsIGhlYWRlciwgZmlsdGVyLCBpc0hlYWRlck5hbWVGaWx0ZXIpIHtcbiAgaWYgKHV0aWxzLmlzRnVuY3Rpb24oZmlsdGVyKSkge1xuICAgIHJldHVybiBmaWx0ZXIuY2FsbCh0aGlzLCB2YWx1ZSwgaGVhZGVyKTtcbiAgfVxuXG4gIGlmIChpc0hlYWRlck5hbWVGaWx0ZXIpIHtcbiAgICB2YWx1ZSA9IGhlYWRlcjtcbiAgfVxuXG4gIGlmICghdXRpbHMuaXNTdHJpbmcodmFsdWUpKSByZXR1cm47XG5cbiAgaWYgKHV0aWxzLmlzU3RyaW5nKGZpbHRlcikpIHtcbiAgICByZXR1cm4gdmFsdWUuaW5kZXhPZihmaWx0ZXIpICE9PSAtMTtcbiAgfVxuXG4gIGlmICh1dGlscy5pc1JlZ0V4cChmaWx0ZXIpKSB7XG4gICAgcmV0dXJuIGZpbHRlci50ZXN0KHZhbHVlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBmb3JtYXRIZWFkZXIoaGVhZGVyKSB7XG4gIHJldHVybiBoZWFkZXIudHJpbSgpXG4gICAgLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvKFthLXpcXGRdKShcXHcqKS9nLCAodywgY2hhciwgc3RyKSA9PiB7XG4gICAgICByZXR1cm4gY2hhci50b1VwcGVyQ2FzZSgpICsgc3RyO1xuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBidWlsZEFjY2Vzc29ycyhvYmosIGhlYWRlcikge1xuICBjb25zdCBhY2Nlc3Nvck5hbWUgPSB1dGlscy50b0NhbWVsQ2FzZSgnICcgKyBoZWFkZXIpO1xuXG4gIFsnZ2V0JywgJ3NldCcsICdoYXMnXS5mb3JFYWNoKG1ldGhvZE5hbWUgPT4ge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIG1ldGhvZE5hbWUgKyBhY2Nlc3Nvck5hbWUsIHtcbiAgICAgIHZhbHVlOiBmdW5jdGlvbihhcmcxLCBhcmcyLCBhcmczKSB7XG4gICAgICAgIHJldHVybiB0aGlzW21ldGhvZE5hbWVdLmNhbGwodGhpcywgaGVhZGVyLCBhcmcxLCBhcmcyLCBhcmczKTtcbiAgICAgIH0sXG4gICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgfSk7XG59XG5cbmNsYXNzIEF4aW9zSGVhZGVycyB7XG4gIGNvbnN0cnVjdG9yKGhlYWRlcnMpIHtcbiAgICBoZWFkZXJzICYmIHRoaXMuc2V0KGhlYWRlcnMpO1xuICB9XG5cbiAgc2V0KGhlYWRlciwgdmFsdWVPclJld3JpdGUsIHJld3JpdGUpIHtcbiAgICBjb25zdCBzZWxmID0gdGhpcztcblxuICAgIGZ1bmN0aW9uIHNldEhlYWRlcihfdmFsdWUsIF9oZWFkZXIsIF9yZXdyaXRlKSB7XG4gICAgICBjb25zdCBsSGVhZGVyID0gbm9ybWFsaXplSGVhZGVyKF9oZWFkZXIpO1xuXG4gICAgICBpZiAoIWxIZWFkZXIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdoZWFkZXIgbmFtZSBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZycpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBrZXkgPSB1dGlscy5maW5kS2V5KHNlbGYsIGxIZWFkZXIpO1xuXG4gICAgICBpZigha2V5IHx8IHNlbGZba2V5XSA9PT0gdW5kZWZpbmVkIHx8IF9yZXdyaXRlID09PSB0cnVlIHx8IChfcmV3cml0ZSA9PT0gdW5kZWZpbmVkICYmIHNlbGZba2V5XSAhPT0gZmFsc2UpKSB7XG4gICAgICAgIHNlbGZba2V5IHx8IF9oZWFkZXJdID0gbm9ybWFsaXplVmFsdWUoX3ZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBzZXRIZWFkZXJzID0gKGhlYWRlcnMsIF9yZXdyaXRlKSA9PlxuICAgICAgdXRpbHMuZm9yRWFjaChoZWFkZXJzLCAoX3ZhbHVlLCBfaGVhZGVyKSA9PiBzZXRIZWFkZXIoX3ZhbHVlLCBfaGVhZGVyLCBfcmV3cml0ZSkpO1xuXG4gICAgaWYgKHV0aWxzLmlzUGxhaW5PYmplY3QoaGVhZGVyKSB8fCBoZWFkZXIgaW5zdGFuY2VvZiB0aGlzLmNvbnN0cnVjdG9yKSB7XG4gICAgICBzZXRIZWFkZXJzKGhlYWRlciwgdmFsdWVPclJld3JpdGUpXG4gICAgfSBlbHNlIGlmKHV0aWxzLmlzU3RyaW5nKGhlYWRlcikgJiYgKGhlYWRlciA9IGhlYWRlci50cmltKCkpICYmICFpc1ZhbGlkSGVhZGVyTmFtZShoZWFkZXIpKSB7XG4gICAgICBzZXRIZWFkZXJzKHBhcnNlSGVhZGVycyhoZWFkZXIpLCB2YWx1ZU9yUmV3cml0ZSk7XG4gICAgfSBlbHNlIGlmICh1dGlscy5pc0hlYWRlcnMoaGVhZGVyKSkge1xuICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgaGVhZGVyLmVudHJpZXMoKSkge1xuICAgICAgICBzZXRIZWFkZXIodmFsdWUsIGtleSwgcmV3cml0ZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGhlYWRlciAhPSBudWxsICYmIHNldEhlYWRlcih2YWx1ZU9yUmV3cml0ZSwgaGVhZGVyLCByZXdyaXRlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGdldChoZWFkZXIsIHBhcnNlcikge1xuICAgIGhlYWRlciA9IG5vcm1hbGl6ZUhlYWRlcihoZWFkZXIpO1xuXG4gICAgaWYgKGhlYWRlcikge1xuICAgICAgY29uc3Qga2V5ID0gdXRpbHMuZmluZEtleSh0aGlzLCBoZWFkZXIpO1xuXG4gICAgICBpZiAoa2V5KSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpc1trZXldO1xuXG4gICAgICAgIGlmICghcGFyc2VyKSB7XG4gICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBhcnNlciA9PT0gdHJ1ZSkge1xuICAgICAgICAgIHJldHVybiBwYXJzZVRva2Vucyh2YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodXRpbHMuaXNGdW5jdGlvbihwYXJzZXIpKSB7XG4gICAgICAgICAgcmV0dXJuIHBhcnNlci5jYWxsKHRoaXMsIHZhbHVlLCBrZXkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHV0aWxzLmlzUmVnRXhwKHBhcnNlcikpIHtcbiAgICAgICAgICByZXR1cm4gcGFyc2VyLmV4ZWModmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigncGFyc2VyIG11c3QgYmUgYm9vbGVhbnxyZWdleHB8ZnVuY3Rpb24nKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBoYXMoaGVhZGVyLCBtYXRjaGVyKSB7XG4gICAgaGVhZGVyID0gbm9ybWFsaXplSGVhZGVyKGhlYWRlcik7XG5cbiAgICBpZiAoaGVhZGVyKSB7XG4gICAgICBjb25zdCBrZXkgPSB1dGlscy5maW5kS2V5KHRoaXMsIGhlYWRlcik7XG5cbiAgICAgIHJldHVybiAhIShrZXkgJiYgdGhpc1trZXldICE9PSB1bmRlZmluZWQgJiYgKCFtYXRjaGVyIHx8IG1hdGNoSGVhZGVyVmFsdWUodGhpcywgdGhpc1trZXldLCBrZXksIG1hdGNoZXIpKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZGVsZXRlKGhlYWRlciwgbWF0Y2hlcikge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIGxldCBkZWxldGVkID0gZmFsc2U7XG5cbiAgICBmdW5jdGlvbiBkZWxldGVIZWFkZXIoX2hlYWRlcikge1xuICAgICAgX2hlYWRlciA9IG5vcm1hbGl6ZUhlYWRlcihfaGVhZGVyKTtcblxuICAgICAgaWYgKF9oZWFkZXIpIHtcbiAgICAgICAgY29uc3Qga2V5ID0gdXRpbHMuZmluZEtleShzZWxmLCBfaGVhZGVyKTtcblxuICAgICAgICBpZiAoa2V5ICYmICghbWF0Y2hlciB8fCBtYXRjaEhlYWRlclZhbHVlKHNlbGYsIHNlbGZba2V5XSwga2V5LCBtYXRjaGVyKSkpIHtcbiAgICAgICAgICBkZWxldGUgc2VsZltrZXldO1xuXG4gICAgICAgICAgZGVsZXRlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodXRpbHMuaXNBcnJheShoZWFkZXIpKSB7XG4gICAgICBoZWFkZXIuZm9yRWFjaChkZWxldGVIZWFkZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGVIZWFkZXIoaGVhZGVyKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVsZXRlZDtcbiAgfVxuXG4gIGNsZWFyKG1hdGNoZXIpIHtcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXModGhpcyk7XG4gICAgbGV0IGkgPSBrZXlzLmxlbmd0aDtcbiAgICBsZXQgZGVsZXRlZCA9IGZhbHNlO1xuXG4gICAgd2hpbGUgKGktLSkge1xuICAgICAgY29uc3Qga2V5ID0ga2V5c1tpXTtcbiAgICAgIGlmKCFtYXRjaGVyIHx8IG1hdGNoSGVhZGVyVmFsdWUodGhpcywgdGhpc1trZXldLCBrZXksIG1hdGNoZXIsIHRydWUpKSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzW2tleV07XG4gICAgICAgIGRlbGV0ZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBkZWxldGVkO1xuICB9XG5cbiAgbm9ybWFsaXplKGZvcm1hdCkge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcblxuICAgIHV0aWxzLmZvckVhY2godGhpcywgKHZhbHVlLCBoZWFkZXIpID0+IHtcbiAgICAgIGNvbnN0IGtleSA9IHV0aWxzLmZpbmRLZXkoaGVhZGVycywgaGVhZGVyKTtcblxuICAgICAgaWYgKGtleSkge1xuICAgICAgICBzZWxmW2tleV0gPSBub3JtYWxpemVWYWx1ZSh2YWx1ZSk7XG4gICAgICAgIGRlbGV0ZSBzZWxmW2hlYWRlcl07XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IGZvcm1hdCA/IGZvcm1hdEhlYWRlcihoZWFkZXIpIDogU3RyaW5nKGhlYWRlcikudHJpbSgpO1xuXG4gICAgICBpZiAobm9ybWFsaXplZCAhPT0gaGVhZGVyKSB7XG4gICAgICAgIGRlbGV0ZSBzZWxmW2hlYWRlcl07XG4gICAgICB9XG5cbiAgICAgIHNlbGZbbm9ybWFsaXplZF0gPSBub3JtYWxpemVWYWx1ZSh2YWx1ZSk7XG5cbiAgICAgIGhlYWRlcnNbbm9ybWFsaXplZF0gPSB0cnVlO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBjb25jYXQoLi4udGFyZ2V0cykge1xuICAgIHJldHVybiB0aGlzLmNvbnN0cnVjdG9yLmNvbmNhdCh0aGlzLCAuLi50YXJnZXRzKTtcbiAgfVxuXG4gIHRvSlNPTihhc1N0cmluZ3MpIHtcbiAgICBjb25zdCBvYmogPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG4gICAgdXRpbHMuZm9yRWFjaCh0aGlzLCAodmFsdWUsIGhlYWRlcikgPT4ge1xuICAgICAgdmFsdWUgIT0gbnVsbCAmJiB2YWx1ZSAhPT0gZmFsc2UgJiYgKG9ialtoZWFkZXJdID0gYXNTdHJpbmdzICYmIHV0aWxzLmlzQXJyYXkodmFsdWUpID8gdmFsdWUuam9pbignLCAnKSA6IHZhbHVlKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBvYmo7XG4gIH1cblxuICBbU3ltYm9sLml0ZXJhdG9yXSgpIHtcbiAgICByZXR1cm4gT2JqZWN0LmVudHJpZXModGhpcy50b0pTT04oKSlbU3ltYm9sLml0ZXJhdG9yXSgpO1xuICB9XG5cbiAgdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHRoaXMudG9KU09OKCkpLm1hcCgoW2hlYWRlciwgdmFsdWVdKSA9PiBoZWFkZXIgKyAnOiAnICsgdmFsdWUpLmpvaW4oJ1xcbicpO1xuICB9XG5cbiAgZ2V0IFtTeW1ib2wudG9TdHJpbmdUYWddKCkge1xuICAgIHJldHVybiAnQXhpb3NIZWFkZXJzJztcbiAgfVxuXG4gIHN0YXRpYyBmcm9tKHRoaW5nKSB7XG4gICAgcmV0dXJuIHRoaW5nIGluc3RhbmNlb2YgdGhpcyA/IHRoaW5nIDogbmV3IHRoaXModGhpbmcpO1xuICB9XG5cbiAgc3RhdGljIGNvbmNhdChmaXJzdCwgLi4udGFyZ2V0cykge1xuICAgIGNvbnN0IGNvbXB1dGVkID0gbmV3IHRoaXMoZmlyc3QpO1xuXG4gICAgdGFyZ2V0cy5mb3JFYWNoKCh0YXJnZXQpID0+IGNvbXB1dGVkLnNldCh0YXJnZXQpKTtcblxuICAgIHJldHVybiBjb21wdXRlZDtcbiAgfVxuXG4gIHN0YXRpYyBhY2Nlc3NvcihoZWFkZXIpIHtcbiAgICBjb25zdCBpbnRlcm5hbHMgPSB0aGlzWyRpbnRlcm5hbHNdID0gKHRoaXNbJGludGVybmFsc10gPSB7XG4gICAgICBhY2Nlc3NvcnM6IHt9XG4gICAgfSk7XG5cbiAgICBjb25zdCBhY2Nlc3NvcnMgPSBpbnRlcm5hbHMuYWNjZXNzb3JzO1xuICAgIGNvbnN0IHByb3RvdHlwZSA9IHRoaXMucHJvdG90eXBlO1xuXG4gICAgZnVuY3Rpb24gZGVmaW5lQWNjZXNzb3IoX2hlYWRlcikge1xuICAgICAgY29uc3QgbEhlYWRlciA9IG5vcm1hbGl6ZUhlYWRlcihfaGVhZGVyKTtcblxuICAgICAgaWYgKCFhY2Nlc3NvcnNbbEhlYWRlcl0pIHtcbiAgICAgICAgYnVpbGRBY2Nlc3NvcnMocHJvdG90eXBlLCBfaGVhZGVyKTtcbiAgICAgICAgYWNjZXNzb3JzW2xIZWFkZXJdID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB1dGlscy5pc0FycmF5KGhlYWRlcikgPyBoZWFkZXIuZm9yRWFjaChkZWZpbmVBY2Nlc3NvcikgOiBkZWZpbmVBY2Nlc3NvcihoZWFkZXIpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbn1cblxuQXhpb3NIZWFkZXJzLmFjY2Vzc29yKFsnQ29udGVudC1UeXBlJywgJ0NvbnRlbnQtTGVuZ3RoJywgJ0FjY2VwdCcsICdBY2NlcHQtRW5jb2RpbmcnLCAnVXNlci1BZ2VudCcsICdBdXRob3JpemF0aW9uJ10pO1xuXG4vLyByZXNlcnZlZCBuYW1lcyBob3RmaXhcbnV0aWxzLnJlZHVjZURlc2NyaXB0b3JzKEF4aW9zSGVhZGVycy5wcm90b3R5cGUsICh7dmFsdWV9LCBrZXkpID0+IHtcbiAgbGV0IG1hcHBlZCA9IGtleVswXS50b1VwcGVyQ2FzZSgpICsga2V5LnNsaWNlKDEpOyAvLyBtYXAgYHNldGAgPT4gYFNldGBcbiAgcmV0dXJuIHtcbiAgICBnZXQ6ICgpID0+IHZhbHVlLFxuICAgIHNldChoZWFkZXJWYWx1ZSkge1xuICAgICAgdGhpc1ttYXBwZWRdID0gaGVhZGVyVmFsdWU7XG4gICAgfVxuICB9XG59KTtcblxudXRpbHMuZnJlZXplTWV0aG9kcyhBeGlvc0hlYWRlcnMpO1xuXG5leHBvcnQgZGVmYXVsdCBBeGlvc0hlYWRlcnM7XG4iLCIndXNlIHN0cmljdCc7XG5cbmltcG9ydCB1dGlscyBmcm9tICcuLy4uL3V0aWxzLmpzJztcbmltcG9ydCBkZWZhdWx0cyBmcm9tICcuLi9kZWZhdWx0cy9pbmRleC5qcyc7XG5pbXBvcnQgQXhpb3NIZWFkZXJzIGZyb20gJy4uL2NvcmUvQXhpb3NIZWFkZXJzLmpzJztcblxuLyoqXG4gKiBUcmFuc2Zvcm0gdGhlIGRhdGEgZm9yIGEgcmVxdWVzdCBvciBhIHJlc3BvbnNlXG4gKlxuICogQHBhcmFtIHtBcnJheXxGdW5jdGlvbn0gZm5zIEEgc2luZ2xlIGZ1bmN0aW9uIG9yIEFycmF5IG9mIGZ1bmN0aW9uc1xuICogQHBhcmFtIHs/T2JqZWN0fSByZXNwb25zZSBUaGUgcmVzcG9uc2Ugb2JqZWN0XG4gKlxuICogQHJldHVybnMgeyp9IFRoZSByZXN1bHRpbmcgdHJhbnNmb3JtZWQgZGF0YVxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB0cmFuc2Zvcm1EYXRhKGZucywgcmVzcG9uc2UpIHtcbiAgY29uc3QgY29uZmlnID0gdGhpcyB8fCBkZWZhdWx0cztcbiAgY29uc3QgY29udGV4dCA9IHJlc3BvbnNlIHx8IGNvbmZpZztcbiAgY29uc3QgaGVhZGVycyA9IEF4aW9zSGVhZGVycy5mcm9tKGNvbnRleHQuaGVhZGVycyk7XG4gIGxldCBkYXRhID0gY29udGV4dC5kYXRhO1xuXG4gIHV0aWxzLmZvckVhY2goZm5zLCBmdW5jdGlvbiB0cmFuc2Zvcm0oZm4pIHtcbiAgICBkYXRhID0gZm4uY2FsbChjb25maWcsIGRhdGEsIGhlYWRlcnMubm9ybWFsaXplKCksIHJlc3BvbnNlID8gcmVzcG9uc2Uuc3RhdHVzIDogdW5kZWZpbmVkKTtcbiAgfSk7XG5cbiAgaGVhZGVycy5ub3JtYWxpemUoKTtcblxuICByZXR1cm4gZGF0YTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaXNDYW5jZWwodmFsdWUpIHtcbiAgcmV0dXJuICEhKHZhbHVlICYmIHZhbHVlLl9fQ0FOQ0VMX18pO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgQXhpb3NFcnJvciBmcm9tICcuLi9jb3JlL0F4aW9zRXJyb3IuanMnO1xuaW1wb3J0IHV0aWxzIGZyb20gJy4uL3V0aWxzLmpzJztcblxuLyoqXG4gKiBBIGBDYW5jZWxlZEVycm9yYCBpcyBhbiBvYmplY3QgdGhhdCBpcyB0aHJvd24gd2hlbiBhbiBvcGVyYXRpb24gaXMgY2FuY2VsZWQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmc9fSBtZXNzYWdlIFRoZSBtZXNzYWdlLlxuICogQHBhcmFtIHtPYmplY3Q9fSBjb25maWcgVGhlIGNvbmZpZy5cbiAqIEBwYXJhbSB7T2JqZWN0PX0gcmVxdWVzdCBUaGUgcmVxdWVzdC5cbiAqXG4gKiBAcmV0dXJucyB7Q2FuY2VsZWRFcnJvcn0gVGhlIGNyZWF0ZWQgZXJyb3IuXG4gKi9cbmZ1bmN0aW9uIENhbmNlbGVkRXJyb3IobWVzc2FnZSwgY29uZmlnLCByZXF1ZXN0KSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1lcS1udWxsLGVxZXFlcVxuICBBeGlvc0Vycm9yLmNhbGwodGhpcywgbWVzc2FnZSA9PSBudWxsID8gJ2NhbmNlbGVkJyA6IG1lc3NhZ2UsIEF4aW9zRXJyb3IuRVJSX0NBTkNFTEVELCBjb25maWcsIHJlcXVlc3QpO1xuICB0aGlzLm5hbWUgPSAnQ2FuY2VsZWRFcnJvcic7XG59XG5cbnV0aWxzLmluaGVyaXRzKENhbmNlbGVkRXJyb3IsIEF4aW9zRXJyb3IsIHtcbiAgX19DQU5DRUxfXzogdHJ1ZVxufSk7XG5cbmV4cG9ydCBkZWZhdWx0IENhbmNlbGVkRXJyb3I7XG4iLCIndXNlIHN0cmljdCc7XG5cbmltcG9ydCBBeGlvc0Vycm9yIGZyb20gJy4vQXhpb3NFcnJvci5qcyc7XG5cbi8qKlxuICogUmVzb2x2ZSBvciByZWplY3QgYSBQcm9taXNlIGJhc2VkIG9uIHJlc3BvbnNlIHN0YXR1cy5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSByZXNvbHZlIEEgZnVuY3Rpb24gdGhhdCByZXNvbHZlcyB0aGUgcHJvbWlzZS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHJlamVjdCBBIGZ1bmN0aW9uIHRoYXQgcmVqZWN0cyB0aGUgcHJvbWlzZS5cbiAqIEBwYXJhbSB7b2JqZWN0fSByZXNwb25zZSBUaGUgcmVzcG9uc2UuXG4gKlxuICogQHJldHVybnMge29iamVjdH0gVGhlIHJlc3BvbnNlLlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCByZXNwb25zZSkge1xuICBjb25zdCB2YWxpZGF0ZVN0YXR1cyA9IHJlc3BvbnNlLmNvbmZpZy52YWxpZGF0ZVN0YXR1cztcbiAgaWYgKCFyZXNwb25zZS5zdGF0dXMgfHwgIXZhbGlkYXRlU3RhdHVzIHx8IHZhbGlkYXRlU3RhdHVzKHJlc3BvbnNlLnN0YXR1cykpIHtcbiAgICByZXNvbHZlKHJlc3BvbnNlKTtcbiAgfSBlbHNlIHtcbiAgICByZWplY3QobmV3IEF4aW9zRXJyb3IoXG4gICAgICAnUmVxdWVzdCBmYWlsZWQgd2l0aCBzdGF0dXMgY29kZSAnICsgcmVzcG9uc2Uuc3RhdHVzLFxuICAgICAgW0F4aW9zRXJyb3IuRVJSX0JBRF9SRVFVRVNULCBBeGlvc0Vycm9yLkVSUl9CQURfUkVTUE9OU0VdW01hdGguZmxvb3IocmVzcG9uc2Uuc3RhdHVzIC8gMTAwKSAtIDRdLFxuICAgICAgcmVzcG9uc2UuY29uZmlnLFxuICAgICAgcmVzcG9uc2UucmVxdWVzdCxcbiAgICAgIHJlc3BvbnNlXG4gICAgKSk7XG4gIH1cbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcGFyc2VQcm90b2NvbCh1cmwpIHtcbiAgY29uc3QgbWF0Y2ggPSAvXihbLStcXHddezEsMjV9KSg6P1xcL1xcL3w6KS8uZXhlYyh1cmwpO1xuICByZXR1cm4gbWF0Y2ggJiYgbWF0Y2hbMV0gfHwgJyc7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQ2FsY3VsYXRlIGRhdGEgbWF4UmF0ZVxuICogQHBhcmFtIHtOdW1iZXJ9IFtzYW1wbGVzQ291bnQ9IDEwXVxuICogQHBhcmFtIHtOdW1iZXJ9IFttaW49IDEwMDBdXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259XG4gKi9cbmZ1bmN0aW9uIHNwZWVkb21ldGVyKHNhbXBsZXNDb3VudCwgbWluKSB7XG4gIHNhbXBsZXNDb3VudCA9IHNhbXBsZXNDb3VudCB8fCAxMDtcbiAgY29uc3QgYnl0ZXMgPSBuZXcgQXJyYXkoc2FtcGxlc0NvdW50KTtcbiAgY29uc3QgdGltZXN0YW1wcyA9IG5ldyBBcnJheShzYW1wbGVzQ291bnQpO1xuICBsZXQgaGVhZCA9IDA7XG4gIGxldCB0YWlsID0gMDtcbiAgbGV0IGZpcnN0U2FtcGxlVFM7XG5cbiAgbWluID0gbWluICE9PSB1bmRlZmluZWQgPyBtaW4gOiAxMDAwO1xuXG4gIHJldHVybiBmdW5jdGlvbiBwdXNoKGNodW5rTGVuZ3RoKSB7XG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcblxuICAgIGNvbnN0IHN0YXJ0ZWRBdCA9IHRpbWVzdGFtcHNbdGFpbF07XG5cbiAgICBpZiAoIWZpcnN0U2FtcGxlVFMpIHtcbiAgICAgIGZpcnN0U2FtcGxlVFMgPSBub3c7XG4gICAgfVxuXG4gICAgYnl0ZXNbaGVhZF0gPSBjaHVua0xlbmd0aDtcbiAgICB0aW1lc3RhbXBzW2hlYWRdID0gbm93O1xuXG4gICAgbGV0IGkgPSB0YWlsO1xuICAgIGxldCBieXRlc0NvdW50ID0gMDtcblxuICAgIHdoaWxlIChpICE9PSBoZWFkKSB7XG4gICAgICBieXRlc0NvdW50ICs9IGJ5dGVzW2krK107XG4gICAgICBpID0gaSAlIHNhbXBsZXNDb3VudDtcbiAgICB9XG5cbiAgICBoZWFkID0gKGhlYWQgKyAxKSAlIHNhbXBsZXNDb3VudDtcblxuICAgIGlmIChoZWFkID09PSB0YWlsKSB7XG4gICAgICB0YWlsID0gKHRhaWwgKyAxKSAlIHNhbXBsZXNDb3VudDtcbiAgICB9XG5cbiAgICBpZiAobm93IC0gZmlyc3RTYW1wbGVUUyA8IG1pbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHBhc3NlZCA9IHN0YXJ0ZWRBdCAmJiBub3cgLSBzdGFydGVkQXQ7XG5cbiAgICByZXR1cm4gcGFzc2VkID8gTWF0aC5yb3VuZChieXRlc0NvdW50ICogMTAwMCAvIHBhc3NlZCkgOiB1bmRlZmluZWQ7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IHNwZWVkb21ldGVyO1xuIiwiLyoqXG4gKiBUaHJvdHRsZSBkZWNvcmF0b3JcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gKiBAcGFyYW0ge051bWJlcn0gZnJlcVxuICogQHJldHVybiB7RnVuY3Rpb259XG4gKi9cbmZ1bmN0aW9uIHRocm90dGxlKGZuLCBmcmVxKSB7XG4gIGxldCB0aW1lc3RhbXAgPSAwO1xuICBsZXQgdGhyZXNob2xkID0gMTAwMCAvIGZyZXE7XG4gIGxldCBsYXN0QXJncztcbiAgbGV0IHRpbWVyO1xuXG4gIGNvbnN0IGludm9rZSA9IChhcmdzLCBub3cgPSBEYXRlLm5vdygpKSA9PiB7XG4gICAgdGltZXN0YW1wID0gbm93O1xuICAgIGxhc3RBcmdzID0gbnVsbDtcbiAgICBpZiAodGltZXIpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICB0aW1lciA9IG51bGw7XG4gICAgfVxuICAgIGZuLmFwcGx5KG51bGwsIGFyZ3MpO1xuICB9XG5cbiAgY29uc3QgdGhyb3R0bGVkID0gKC4uLmFyZ3MpID0+IHtcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IHBhc3NlZCA9IG5vdyAtIHRpbWVzdGFtcDtcbiAgICBpZiAoIHBhc3NlZCA+PSB0aHJlc2hvbGQpIHtcbiAgICAgIGludm9rZShhcmdzLCBub3cpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsYXN0QXJncyA9IGFyZ3M7XG4gICAgICBpZiAoIXRpbWVyKSB7XG4gICAgICAgIHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGltZXIgPSBudWxsO1xuICAgICAgICAgIGludm9rZShsYXN0QXJncylcbiAgICAgICAgfSwgdGhyZXNob2xkIC0gcGFzc2VkKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCBmbHVzaCA9ICgpID0+IGxhc3RBcmdzICYmIGludm9rZShsYXN0QXJncyk7XG5cbiAgcmV0dXJuIFt0aHJvdHRsZWQsIGZsdXNoXTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgdGhyb3R0bGU7XG4iLCJpbXBvcnQgc3BlZWRvbWV0ZXIgZnJvbSBcIi4vc3BlZWRvbWV0ZXIuanNcIjtcbmltcG9ydCB0aHJvdHRsZSBmcm9tIFwiLi90aHJvdHRsZS5qc1wiO1xuaW1wb3J0IHV0aWxzIGZyb20gXCIuLi91dGlscy5qc1wiO1xuXG5leHBvcnQgY29uc3QgcHJvZ3Jlc3NFdmVudFJlZHVjZXIgPSAobGlzdGVuZXIsIGlzRG93bmxvYWRTdHJlYW0sIGZyZXEgPSAzKSA9PiB7XG4gIGxldCBieXRlc05vdGlmaWVkID0gMDtcbiAgY29uc3QgX3NwZWVkb21ldGVyID0gc3BlZWRvbWV0ZXIoNTAsIDI1MCk7XG5cbiAgcmV0dXJuIHRocm90dGxlKGUgPT4ge1xuICAgIGNvbnN0IGxvYWRlZCA9IGUubG9hZGVkO1xuICAgIGNvbnN0IHRvdGFsID0gZS5sZW5ndGhDb21wdXRhYmxlID8gZS50b3RhbCA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBwcm9ncmVzc0J5dGVzID0gbG9hZGVkIC0gYnl0ZXNOb3RpZmllZDtcbiAgICBjb25zdCByYXRlID0gX3NwZWVkb21ldGVyKHByb2dyZXNzQnl0ZXMpO1xuICAgIGNvbnN0IGluUmFuZ2UgPSBsb2FkZWQgPD0gdG90YWw7XG5cbiAgICBieXRlc05vdGlmaWVkID0gbG9hZGVkO1xuXG4gICAgY29uc3QgZGF0YSA9IHtcbiAgICAgIGxvYWRlZCxcbiAgICAgIHRvdGFsLFxuICAgICAgcHJvZ3Jlc3M6IHRvdGFsID8gKGxvYWRlZCAvIHRvdGFsKSA6IHVuZGVmaW5lZCxcbiAgICAgIGJ5dGVzOiBwcm9ncmVzc0J5dGVzLFxuICAgICAgcmF0ZTogcmF0ZSA/IHJhdGUgOiB1bmRlZmluZWQsXG4gICAgICBlc3RpbWF0ZWQ6IHJhdGUgJiYgdG90YWwgJiYgaW5SYW5nZSA/ICh0b3RhbCAtIGxvYWRlZCkgLyByYXRlIDogdW5kZWZpbmVkLFxuICAgICAgZXZlbnQ6IGUsXG4gICAgICBsZW5ndGhDb21wdXRhYmxlOiB0b3RhbCAhPSBudWxsLFxuICAgICAgW2lzRG93bmxvYWRTdHJlYW0gPyAnZG93bmxvYWQnIDogJ3VwbG9hZCddOiB0cnVlXG4gICAgfTtcblxuICAgIGxpc3RlbmVyKGRhdGEpO1xuICB9LCBmcmVxKTtcbn1cblxuZXhwb3J0IGNvbnN0IHByb2dyZXNzRXZlbnREZWNvcmF0b3IgPSAodG90YWwsIHRocm90dGxlZCkgPT4ge1xuICBjb25zdCBsZW5ndGhDb21wdXRhYmxlID0gdG90YWwgIT0gbnVsbDtcblxuICByZXR1cm4gWyhsb2FkZWQpID0+IHRocm90dGxlZFswXSh7XG4gICAgbGVuZ3RoQ29tcHV0YWJsZSxcbiAgICB0b3RhbCxcbiAgICBsb2FkZWRcbiAgfSksIHRocm90dGxlZFsxXV07XG59XG5cbmV4cG9ydCBjb25zdCBhc3luY0RlY29yYXRvciA9IChmbikgPT4gKC4uLmFyZ3MpID0+IHV0aWxzLmFzYXAoKCkgPT4gZm4oLi4uYXJncykpO1xuIiwiaW1wb3J0IHBsYXRmb3JtIGZyb20gJy4uL3BsYXRmb3JtL2luZGV4LmpzJztcblxuZXhwb3J0IGRlZmF1bHQgcGxhdGZvcm0uaGFzU3RhbmRhcmRCcm93c2VyRW52ID8gKChvcmlnaW4sIGlzTVNJRSkgPT4gKHVybCkgPT4ge1xuICB1cmwgPSBuZXcgVVJMKHVybCwgcGxhdGZvcm0ub3JpZ2luKTtcblxuICByZXR1cm4gKFxuICAgIG9yaWdpbi5wcm90b2NvbCA9PT0gdXJsLnByb3RvY29sICYmXG4gICAgb3JpZ2luLmhvc3QgPT09IHVybC5ob3N0ICYmXG4gICAgKGlzTVNJRSB8fCBvcmlnaW4ucG9ydCA9PT0gdXJsLnBvcnQpXG4gICk7XG59KShcbiAgbmV3IFVSTChwbGF0Zm9ybS5vcmlnaW4pLFxuICBwbGF0Zm9ybS5uYXZpZ2F0b3IgJiYgLyhtc2llfHRyaWRlbnQpL2kudGVzdChwbGF0Zm9ybS5uYXZpZ2F0b3IudXNlckFnZW50KVxuKSA6ICgpID0+IHRydWU7XG4iLCJpbXBvcnQgdXRpbHMgZnJvbSAnLi8uLi91dGlscy5qcyc7XG5pbXBvcnQgcGxhdGZvcm0gZnJvbSAnLi4vcGxhdGZvcm0vaW5kZXguanMnO1xuXG5leHBvcnQgZGVmYXVsdCBwbGF0Zm9ybS5oYXNTdGFuZGFyZEJyb3dzZXJFbnYgP1xuXG4gIC8vIFN0YW5kYXJkIGJyb3dzZXIgZW52cyBzdXBwb3J0IGRvY3VtZW50LmNvb2tpZVxuICB7XG4gICAgd3JpdGUobmFtZSwgdmFsdWUsIGV4cGlyZXMsIHBhdGgsIGRvbWFpbiwgc2VjdXJlKSB7XG4gICAgICBjb25zdCBjb29raWUgPSBbbmFtZSArICc9JyArIGVuY29kZVVSSUNvbXBvbmVudCh2YWx1ZSldO1xuXG4gICAgICB1dGlscy5pc051bWJlcihleHBpcmVzKSAmJiBjb29raWUucHVzaCgnZXhwaXJlcz0nICsgbmV3IERhdGUoZXhwaXJlcykudG9HTVRTdHJpbmcoKSk7XG5cbiAgICAgIHV0aWxzLmlzU3RyaW5nKHBhdGgpICYmIGNvb2tpZS5wdXNoKCdwYXRoPScgKyBwYXRoKTtcblxuICAgICAgdXRpbHMuaXNTdHJpbmcoZG9tYWluKSAmJiBjb29raWUucHVzaCgnZG9tYWluPScgKyBkb21haW4pO1xuXG4gICAgICBzZWN1cmUgPT09IHRydWUgJiYgY29va2llLnB1c2goJ3NlY3VyZScpO1xuXG4gICAgICBkb2N1bWVudC5jb29raWUgPSBjb29raWUuam9pbignOyAnKTtcbiAgICB9LFxuXG4gICAgcmVhZChuYW1lKSB7XG4gICAgICBjb25zdCBtYXRjaCA9IGRvY3VtZW50LmNvb2tpZS5tYXRjaChuZXcgUmVnRXhwKCcoXnw7XFxcXHMqKSgnICsgbmFtZSArICcpPShbXjtdKiknKSk7XG4gICAgICByZXR1cm4gKG1hdGNoID8gZGVjb2RlVVJJQ29tcG9uZW50KG1hdGNoWzNdKSA6IG51bGwpO1xuICAgIH0sXG5cbiAgICByZW1vdmUobmFtZSkge1xuICAgICAgdGhpcy53cml0ZShuYW1lLCAnJywgRGF0ZS5ub3coKSAtIDg2NDAwMDAwKTtcbiAgICB9XG4gIH1cblxuICA6XG5cbiAgLy8gTm9uLXN0YW5kYXJkIGJyb3dzZXIgZW52ICh3ZWIgd29ya2VycywgcmVhY3QtbmF0aXZlKSBsYWNrIG5lZWRlZCBzdXBwb3J0LlxuICB7XG4gICAgd3JpdGUoKSB7fSxcbiAgICByZWFkKCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSxcbiAgICByZW1vdmUoKSB7fVxuICB9O1xuXG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgVVJMIGlzIGFic29sdXRlXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHVybCBUaGUgVVJMIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIFVSTCBpcyBhYnNvbHV0ZSwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGlzQWJzb2x1dGVVUkwodXJsKSB7XG4gIC8vIEEgVVJMIGlzIGNvbnNpZGVyZWQgYWJzb2x1dGUgaWYgaXQgYmVnaW5zIHdpdGggXCI8c2NoZW1lPjovL1wiIG9yIFwiLy9cIiAocHJvdG9jb2wtcmVsYXRpdmUgVVJMKS5cbiAgLy8gUkZDIDM5ODYgZGVmaW5lcyBzY2hlbWUgbmFtZSBhcyBhIHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMgYmVnaW5uaW5nIHdpdGggYSBsZXR0ZXIgYW5kIGZvbGxvd2VkXG4gIC8vIGJ5IGFueSBjb21iaW5hdGlvbiBvZiBsZXR0ZXJzLCBkaWdpdHMsIHBsdXMsIHBlcmlvZCwgb3IgaHlwaGVuLlxuICByZXR1cm4gL14oW2Etel1bYS16XFxkK1xcLS5dKjopP1xcL1xcLy9pLnRlc3QodXJsKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IFVSTCBieSBjb21iaW5pbmcgdGhlIHNwZWNpZmllZCBVUkxzXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGJhc2VVUkwgVGhlIGJhc2UgVVJMXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVsYXRpdmVVUkwgVGhlIHJlbGF0aXZlIFVSTFxuICpcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBjb21iaW5lZCBVUkxcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY29tYmluZVVSTHMoYmFzZVVSTCwgcmVsYXRpdmVVUkwpIHtcbiAgcmV0dXJuIHJlbGF0aXZlVVJMXG4gICAgPyBiYXNlVVJMLnJlcGxhY2UoL1xcLz9cXC8kLywgJycpICsgJy8nICsgcmVsYXRpdmVVUkwucmVwbGFjZSgvXlxcLysvLCAnJylcbiAgICA6IGJhc2VVUkw7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbmltcG9ydCBpc0Fic29sdXRlVVJMIGZyb20gJy4uL2hlbHBlcnMvaXNBYnNvbHV0ZVVSTC5qcyc7XG5pbXBvcnQgY29tYmluZVVSTHMgZnJvbSAnLi4vaGVscGVycy9jb21iaW5lVVJMcy5qcyc7XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBVUkwgYnkgY29tYmluaW5nIHRoZSBiYXNlVVJMIHdpdGggdGhlIHJlcXVlc3RlZFVSTCxcbiAqIG9ubHkgd2hlbiB0aGUgcmVxdWVzdGVkVVJMIGlzIG5vdCBhbHJlYWR5IGFuIGFic29sdXRlIFVSTC5cbiAqIElmIHRoZSByZXF1ZXN0VVJMIGlzIGFic29sdXRlLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHJlcXVlc3RlZFVSTCB1bnRvdWNoZWQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGJhc2VVUkwgVGhlIGJhc2UgVVJMXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVxdWVzdGVkVVJMIEFic29sdXRlIG9yIHJlbGF0aXZlIFVSTCB0byBjb21iaW5lXG4gKlxuICogQHJldHVybnMge3N0cmluZ30gVGhlIGNvbWJpbmVkIGZ1bGwgcGF0aFxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBidWlsZEZ1bGxQYXRoKGJhc2VVUkwsIHJlcXVlc3RlZFVSTCwgYWxsb3dBYnNvbHV0ZVVybHMpIHtcbiAgbGV0IGlzUmVsYXRpdmVVcmwgPSAhaXNBYnNvbHV0ZVVSTChyZXF1ZXN0ZWRVUkwpO1xuICBpZiAoYmFzZVVSTCAmJiAoaXNSZWxhdGl2ZVVybCB8fCBhbGxvd0Fic29sdXRlVXJscyA9PSBmYWxzZSkpIHtcbiAgICByZXR1cm4gY29tYmluZVVSTHMoYmFzZVVSTCwgcmVxdWVzdGVkVVJMKTtcbiAgfVxuICByZXR1cm4gcmVxdWVzdGVkVVJMO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgdXRpbHMgZnJvbSAnLi4vdXRpbHMuanMnO1xuaW1wb3J0IEF4aW9zSGVhZGVycyBmcm9tIFwiLi9BeGlvc0hlYWRlcnMuanNcIjtcblxuY29uc3QgaGVhZGVyc1RvT2JqZWN0ID0gKHRoaW5nKSA9PiB0aGluZyBpbnN0YW5jZW9mIEF4aW9zSGVhZGVycyA/IHsgLi4udGhpbmcgfSA6IHRoaW5nO1xuXG4vKipcbiAqIENvbmZpZy1zcGVjaWZpYyBtZXJnZS1mdW5jdGlvbiB3aGljaCBjcmVhdGVzIGEgbmV3IGNvbmZpZy1vYmplY3RcbiAqIGJ5IG1lcmdpbmcgdHdvIGNvbmZpZ3VyYXRpb24gb2JqZWN0cyB0b2dldGhlci5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gY29uZmlnMVxuICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZzJcbiAqXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBOZXcgb2JqZWN0IHJlc3VsdGluZyBmcm9tIG1lcmdpbmcgY29uZmlnMiB0byBjb25maWcxXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG1lcmdlQ29uZmlnKGNvbmZpZzEsIGNvbmZpZzIpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gIGNvbmZpZzIgPSBjb25maWcyIHx8IHt9O1xuICBjb25zdCBjb25maWcgPSB7fTtcblxuICBmdW5jdGlvbiBnZXRNZXJnZWRWYWx1ZSh0YXJnZXQsIHNvdXJjZSwgcHJvcCwgY2FzZWxlc3MpIHtcbiAgICBpZiAodXRpbHMuaXNQbGFpbk9iamVjdCh0YXJnZXQpICYmIHV0aWxzLmlzUGxhaW5PYmplY3Qoc291cmNlKSkge1xuICAgICAgcmV0dXJuIHV0aWxzLm1lcmdlLmNhbGwoe2Nhc2VsZXNzfSwgdGFyZ2V0LCBzb3VyY2UpO1xuICAgIH0gZWxzZSBpZiAodXRpbHMuaXNQbGFpbk9iamVjdChzb3VyY2UpKSB7XG4gICAgICByZXR1cm4gdXRpbHMubWVyZ2Uoe30sIHNvdXJjZSk7XG4gICAgfSBlbHNlIGlmICh1dGlscy5pc0FycmF5KHNvdXJjZSkpIHtcbiAgICAgIHJldHVybiBzb3VyY2Uuc2xpY2UoKTtcbiAgICB9XG4gICAgcmV0dXJuIHNvdXJjZTtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb25zaXN0ZW50LXJldHVyblxuICBmdW5jdGlvbiBtZXJnZURlZXBQcm9wZXJ0aWVzKGEsIGIsIHByb3AgLCBjYXNlbGVzcykge1xuICAgIGlmICghdXRpbHMuaXNVbmRlZmluZWQoYikpIHtcbiAgICAgIHJldHVybiBnZXRNZXJnZWRWYWx1ZShhLCBiLCBwcm9wICwgY2FzZWxlc3MpO1xuICAgIH0gZWxzZSBpZiAoIXV0aWxzLmlzVW5kZWZpbmVkKGEpKSB7XG4gICAgICByZXR1cm4gZ2V0TWVyZ2VkVmFsdWUodW5kZWZpbmVkLCBhLCBwcm9wICwgY2FzZWxlc3MpO1xuICAgIH1cbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb25zaXN0ZW50LXJldHVyblxuICBmdW5jdGlvbiB2YWx1ZUZyb21Db25maWcyKGEsIGIpIHtcbiAgICBpZiAoIXV0aWxzLmlzVW5kZWZpbmVkKGIpKSB7XG4gICAgICByZXR1cm4gZ2V0TWVyZ2VkVmFsdWUodW5kZWZpbmVkLCBiKTtcbiAgICB9XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29uc2lzdGVudC1yZXR1cm5cbiAgZnVuY3Rpb24gZGVmYXVsdFRvQ29uZmlnMihhLCBiKSB7XG4gICAgaWYgKCF1dGlscy5pc1VuZGVmaW5lZChiKSkge1xuICAgICAgcmV0dXJuIGdldE1lcmdlZFZhbHVlKHVuZGVmaW5lZCwgYik7XG4gICAgfSBlbHNlIGlmICghdXRpbHMuaXNVbmRlZmluZWQoYSkpIHtcbiAgICAgIHJldHVybiBnZXRNZXJnZWRWYWx1ZSh1bmRlZmluZWQsIGEpO1xuICAgIH1cbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb25zaXN0ZW50LXJldHVyblxuICBmdW5jdGlvbiBtZXJnZURpcmVjdEtleXMoYSwgYiwgcHJvcCkge1xuICAgIGlmIChwcm9wIGluIGNvbmZpZzIpIHtcbiAgICAgIHJldHVybiBnZXRNZXJnZWRWYWx1ZShhLCBiKTtcbiAgICB9IGVsc2UgaWYgKHByb3AgaW4gY29uZmlnMSkge1xuICAgICAgcmV0dXJuIGdldE1lcmdlZFZhbHVlKHVuZGVmaW5lZCwgYSk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgbWVyZ2VNYXAgPSB7XG4gICAgdXJsOiB2YWx1ZUZyb21Db25maWcyLFxuICAgIG1ldGhvZDogdmFsdWVGcm9tQ29uZmlnMixcbiAgICBkYXRhOiB2YWx1ZUZyb21Db25maWcyLFxuICAgIGJhc2VVUkw6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgdHJhbnNmb3JtUmVxdWVzdDogZGVmYXVsdFRvQ29uZmlnMixcbiAgICB0cmFuc2Zvcm1SZXNwb25zZTogZGVmYXVsdFRvQ29uZmlnMixcbiAgICBwYXJhbXNTZXJpYWxpemVyOiBkZWZhdWx0VG9Db25maWcyLFxuICAgIHRpbWVvdXQ6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgdGltZW91dE1lc3NhZ2U6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgd2l0aENyZWRlbnRpYWxzOiBkZWZhdWx0VG9Db25maWcyLFxuICAgIHdpdGhYU1JGVG9rZW46IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgYWRhcHRlcjogZGVmYXVsdFRvQ29uZmlnMixcbiAgICByZXNwb25zZVR5cGU6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgeHNyZkNvb2tpZU5hbWU6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgeHNyZkhlYWRlck5hbWU6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgb25VcGxvYWRQcm9ncmVzczogZGVmYXVsdFRvQ29uZmlnMixcbiAgICBvbkRvd25sb2FkUHJvZ3Jlc3M6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgZGVjb21wcmVzczogZGVmYXVsdFRvQ29uZmlnMixcbiAgICBtYXhDb250ZW50TGVuZ3RoOiBkZWZhdWx0VG9Db25maWcyLFxuICAgIG1heEJvZHlMZW5ndGg6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgYmVmb3JlUmVkaXJlY3Q6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgdHJhbnNwb3J0OiBkZWZhdWx0VG9Db25maWcyLFxuICAgIGh0dHBBZ2VudDogZGVmYXVsdFRvQ29uZmlnMixcbiAgICBodHRwc0FnZW50OiBkZWZhdWx0VG9Db25maWcyLFxuICAgIGNhbmNlbFRva2VuOiBkZWZhdWx0VG9Db25maWcyLFxuICAgIHNvY2tldFBhdGg6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgcmVzcG9uc2VFbmNvZGluZzogZGVmYXVsdFRvQ29uZmlnMixcbiAgICB2YWxpZGF0ZVN0YXR1czogbWVyZ2VEaXJlY3RLZXlzLFxuICAgIGhlYWRlcnM6IChhLCBiICwgcHJvcCkgPT4gbWVyZ2VEZWVwUHJvcGVydGllcyhoZWFkZXJzVG9PYmplY3QoYSksIGhlYWRlcnNUb09iamVjdChiKSxwcm9wLCB0cnVlKVxuICB9O1xuXG4gIHV0aWxzLmZvckVhY2goT2JqZWN0LmtleXMoT2JqZWN0LmFzc2lnbih7fSwgY29uZmlnMSwgY29uZmlnMikpLCBmdW5jdGlvbiBjb21wdXRlQ29uZmlnVmFsdWUocHJvcCkge1xuICAgIGNvbnN0IG1lcmdlID0gbWVyZ2VNYXBbcHJvcF0gfHwgbWVyZ2VEZWVwUHJvcGVydGllcztcbiAgICBjb25zdCBjb25maWdWYWx1ZSA9IG1lcmdlKGNvbmZpZzFbcHJvcF0sIGNvbmZpZzJbcHJvcF0sIHByb3ApO1xuICAgICh1dGlscy5pc1VuZGVmaW5lZChjb25maWdWYWx1ZSkgJiYgbWVyZ2UgIT09IG1lcmdlRGlyZWN0S2V5cykgfHwgKGNvbmZpZ1twcm9wXSA9IGNvbmZpZ1ZhbHVlKTtcbiAgfSk7XG5cbiAgcmV0dXJuIGNvbmZpZztcbn1cbiIsImltcG9ydCBwbGF0Zm9ybSBmcm9tIFwiLi4vcGxhdGZvcm0vaW5kZXguanNcIjtcbmltcG9ydCB1dGlscyBmcm9tIFwiLi4vdXRpbHMuanNcIjtcbmltcG9ydCBpc1VSTFNhbWVPcmlnaW4gZnJvbSBcIi4vaXNVUkxTYW1lT3JpZ2luLmpzXCI7XG5pbXBvcnQgY29va2llcyBmcm9tIFwiLi9jb29raWVzLmpzXCI7XG5pbXBvcnQgYnVpbGRGdWxsUGF0aCBmcm9tIFwiLi4vY29yZS9idWlsZEZ1bGxQYXRoLmpzXCI7XG5pbXBvcnQgbWVyZ2VDb25maWcgZnJvbSBcIi4uL2NvcmUvbWVyZ2VDb25maWcuanNcIjtcbmltcG9ydCBBeGlvc0hlYWRlcnMgZnJvbSBcIi4uL2NvcmUvQXhpb3NIZWFkZXJzLmpzXCI7XG5pbXBvcnQgYnVpbGRVUkwgZnJvbSBcIi4vYnVpbGRVUkwuanNcIjtcblxuZXhwb3J0IGRlZmF1bHQgKGNvbmZpZykgPT4ge1xuICBjb25zdCBuZXdDb25maWcgPSBtZXJnZUNvbmZpZyh7fSwgY29uZmlnKTtcblxuICBsZXQge2RhdGEsIHdpdGhYU1JGVG9rZW4sIHhzcmZIZWFkZXJOYW1lLCB4c3JmQ29va2llTmFtZSwgaGVhZGVycywgYXV0aH0gPSBuZXdDb25maWc7XG5cbiAgbmV3Q29uZmlnLmhlYWRlcnMgPSBoZWFkZXJzID0gQXhpb3NIZWFkZXJzLmZyb20oaGVhZGVycyk7XG5cbiAgbmV3Q29uZmlnLnVybCA9IGJ1aWxkVVJMKGJ1aWxkRnVsbFBhdGgobmV3Q29uZmlnLmJhc2VVUkwsIG5ld0NvbmZpZy51cmwsIG5ld0NvbmZpZy5hbGxvd0Fic29sdXRlVXJscyksIGNvbmZpZy5wYXJhbXMsIGNvbmZpZy5wYXJhbXNTZXJpYWxpemVyKTtcblxuICAvLyBIVFRQIGJhc2ljIGF1dGhlbnRpY2F0aW9uXG4gIGlmIChhdXRoKSB7XG4gICAgaGVhZGVycy5zZXQoJ0F1dGhvcml6YXRpb24nLCAnQmFzaWMgJyArXG4gICAgICBidG9hKChhdXRoLnVzZXJuYW1lIHx8ICcnKSArICc6JyArIChhdXRoLnBhc3N3b3JkID8gdW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KGF1dGgucGFzc3dvcmQpKSA6ICcnKSlcbiAgICApO1xuICB9XG5cbiAgbGV0IGNvbnRlbnRUeXBlO1xuXG4gIGlmICh1dGlscy5pc0Zvcm1EYXRhKGRhdGEpKSB7XG4gICAgaWYgKHBsYXRmb3JtLmhhc1N0YW5kYXJkQnJvd3NlckVudiB8fCBwbGF0Zm9ybS5oYXNTdGFuZGFyZEJyb3dzZXJXZWJXb3JrZXJFbnYpIHtcbiAgICAgIGhlYWRlcnMuc2V0Q29udGVudFR5cGUodW5kZWZpbmVkKTsgLy8gTGV0IHRoZSBicm93c2VyIHNldCBpdFxuICAgIH0gZWxzZSBpZiAoKGNvbnRlbnRUeXBlID0gaGVhZGVycy5nZXRDb250ZW50VHlwZSgpKSAhPT0gZmFsc2UpIHtcbiAgICAgIC8vIGZpeCBzZW1pY29sb24gZHVwbGljYXRpb24gaXNzdWUgZm9yIFJlYWN0TmF0aXZlIEZvcm1EYXRhIGltcGxlbWVudGF0aW9uXG4gICAgICBjb25zdCBbdHlwZSwgLi4udG9rZW5zXSA9IGNvbnRlbnRUeXBlID8gY29udGVudFR5cGUuc3BsaXQoJzsnKS5tYXAodG9rZW4gPT4gdG9rZW4udHJpbSgpKS5maWx0ZXIoQm9vbGVhbikgOiBbXTtcbiAgICAgIGhlYWRlcnMuc2V0Q29udGVudFR5cGUoW3R5cGUgfHwgJ211bHRpcGFydC9mb3JtLWRhdGEnLCAuLi50b2tlbnNdLmpvaW4oJzsgJykpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEFkZCB4c3JmIGhlYWRlclxuICAvLyBUaGlzIGlzIG9ubHkgZG9uZSBpZiBydW5uaW5nIGluIGEgc3RhbmRhcmQgYnJvd3NlciBlbnZpcm9ubWVudC5cbiAgLy8gU3BlY2lmaWNhbGx5IG5vdCBpZiB3ZSdyZSBpbiBhIHdlYiB3b3JrZXIsIG9yIHJlYWN0LW5hdGl2ZS5cblxuICBpZiAocGxhdGZvcm0uaGFzU3RhbmRhcmRCcm93c2VyRW52KSB7XG4gICAgd2l0aFhTUkZUb2tlbiAmJiB1dGlscy5pc0Z1bmN0aW9uKHdpdGhYU1JGVG9rZW4pICYmICh3aXRoWFNSRlRva2VuID0gd2l0aFhTUkZUb2tlbihuZXdDb25maWcpKTtcblxuICAgIGlmICh3aXRoWFNSRlRva2VuIHx8ICh3aXRoWFNSRlRva2VuICE9PSBmYWxzZSAmJiBpc1VSTFNhbWVPcmlnaW4obmV3Q29uZmlnLnVybCkpKSB7XG4gICAgICAvLyBBZGQgeHNyZiBoZWFkZXJcbiAgICAgIGNvbnN0IHhzcmZWYWx1ZSA9IHhzcmZIZWFkZXJOYW1lICYmIHhzcmZDb29raWVOYW1lICYmIGNvb2tpZXMucmVhZCh4c3JmQ29va2llTmFtZSk7XG5cbiAgICAgIGlmICh4c3JmVmFsdWUpIHtcbiAgICAgICAgaGVhZGVycy5zZXQoeHNyZkhlYWRlck5hbWUsIHhzcmZWYWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ld0NvbmZpZztcbn1cblxuIiwiaW1wb3J0IHV0aWxzIGZyb20gJy4vLi4vdXRpbHMuanMnO1xuaW1wb3J0IHNldHRsZSBmcm9tICcuLy4uL2NvcmUvc2V0dGxlLmpzJztcbmltcG9ydCB0cmFuc2l0aW9uYWxEZWZhdWx0cyBmcm9tICcuLi9kZWZhdWx0cy90cmFuc2l0aW9uYWwuanMnO1xuaW1wb3J0IEF4aW9zRXJyb3IgZnJvbSAnLi4vY29yZS9BeGlvc0Vycm9yLmpzJztcbmltcG9ydCBDYW5jZWxlZEVycm9yIGZyb20gJy4uL2NhbmNlbC9DYW5jZWxlZEVycm9yLmpzJztcbmltcG9ydCBwYXJzZVByb3RvY29sIGZyb20gJy4uL2hlbHBlcnMvcGFyc2VQcm90b2NvbC5qcyc7XG5pbXBvcnQgcGxhdGZvcm0gZnJvbSAnLi4vcGxhdGZvcm0vaW5kZXguanMnO1xuaW1wb3J0IEF4aW9zSGVhZGVycyBmcm9tICcuLi9jb3JlL0F4aW9zSGVhZGVycy5qcyc7XG5pbXBvcnQge3Byb2dyZXNzRXZlbnRSZWR1Y2VyfSBmcm9tICcuLi9oZWxwZXJzL3Byb2dyZXNzRXZlbnRSZWR1Y2VyLmpzJztcbmltcG9ydCByZXNvbHZlQ29uZmlnIGZyb20gXCIuLi9oZWxwZXJzL3Jlc29sdmVDb25maWcuanNcIjtcblxuY29uc3QgaXNYSFJBZGFwdGVyU3VwcG9ydGVkID0gdHlwZW9mIFhNTEh0dHBSZXF1ZXN0ICE9PSAndW5kZWZpbmVkJztcblxuZXhwb3J0IGRlZmF1bHQgaXNYSFJBZGFwdGVyU3VwcG9ydGVkICYmIGZ1bmN0aW9uIChjb25maWcpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIGRpc3BhdGNoWGhyUmVxdWVzdChyZXNvbHZlLCByZWplY3QpIHtcbiAgICBjb25zdCBfY29uZmlnID0gcmVzb2x2ZUNvbmZpZyhjb25maWcpO1xuICAgIGxldCByZXF1ZXN0RGF0YSA9IF9jb25maWcuZGF0YTtcbiAgICBjb25zdCByZXF1ZXN0SGVhZGVycyA9IEF4aW9zSGVhZGVycy5mcm9tKF9jb25maWcuaGVhZGVycykubm9ybWFsaXplKCk7XG4gICAgbGV0IHtyZXNwb25zZVR5cGUsIG9uVXBsb2FkUHJvZ3Jlc3MsIG9uRG93bmxvYWRQcm9ncmVzc30gPSBfY29uZmlnO1xuICAgIGxldCBvbkNhbmNlbGVkO1xuICAgIGxldCB1cGxvYWRUaHJvdHRsZWQsIGRvd25sb2FkVGhyb3R0bGVkO1xuICAgIGxldCBmbHVzaFVwbG9hZCwgZmx1c2hEb3dubG9hZDtcblxuICAgIGZ1bmN0aW9uIGRvbmUoKSB7XG4gICAgICBmbHVzaFVwbG9hZCAmJiBmbHVzaFVwbG9hZCgpOyAvLyBmbHVzaCBldmVudHNcbiAgICAgIGZsdXNoRG93bmxvYWQgJiYgZmx1c2hEb3dubG9hZCgpOyAvLyBmbHVzaCBldmVudHNcblxuICAgICAgX2NvbmZpZy5jYW5jZWxUb2tlbiAmJiBfY29uZmlnLmNhbmNlbFRva2VuLnVuc3Vic2NyaWJlKG9uQ2FuY2VsZWQpO1xuXG4gICAgICBfY29uZmlnLnNpZ25hbCAmJiBfY29uZmlnLnNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKCdhYm9ydCcsIG9uQ2FuY2VsZWQpO1xuICAgIH1cblxuICAgIGxldCByZXF1ZXN0ID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG5cbiAgICByZXF1ZXN0Lm9wZW4oX2NvbmZpZy5tZXRob2QudG9VcHBlckNhc2UoKSwgX2NvbmZpZy51cmwsIHRydWUpO1xuXG4gICAgLy8gU2V0IHRoZSByZXF1ZXN0IHRpbWVvdXQgaW4gTVNcbiAgICByZXF1ZXN0LnRpbWVvdXQgPSBfY29uZmlnLnRpbWVvdXQ7XG5cbiAgICBmdW5jdGlvbiBvbmxvYWRlbmQoKSB7XG4gICAgICBpZiAoIXJlcXVlc3QpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8gUHJlcGFyZSB0aGUgcmVzcG9uc2VcbiAgICAgIGNvbnN0IHJlc3BvbnNlSGVhZGVycyA9IEF4aW9zSGVhZGVycy5mcm9tKFxuICAgICAgICAnZ2V0QWxsUmVzcG9uc2VIZWFkZXJzJyBpbiByZXF1ZXN0ICYmIHJlcXVlc3QuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKClcbiAgICAgICk7XG4gICAgICBjb25zdCByZXNwb25zZURhdGEgPSAhcmVzcG9uc2VUeXBlIHx8IHJlc3BvbnNlVHlwZSA9PT0gJ3RleHQnIHx8IHJlc3BvbnNlVHlwZSA9PT0gJ2pzb24nID9cbiAgICAgICAgcmVxdWVzdC5yZXNwb25zZVRleHQgOiByZXF1ZXN0LnJlc3BvbnNlO1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSB7XG4gICAgICAgIGRhdGE6IHJlc3BvbnNlRGF0YSxcbiAgICAgICAgc3RhdHVzOiByZXF1ZXN0LnN0YXR1cyxcbiAgICAgICAgc3RhdHVzVGV4dDogcmVxdWVzdC5zdGF0dXNUZXh0LFxuICAgICAgICBoZWFkZXJzOiByZXNwb25zZUhlYWRlcnMsXG4gICAgICAgIGNvbmZpZyxcbiAgICAgICAgcmVxdWVzdFxuICAgICAgfTtcblxuICAgICAgc2V0dGxlKGZ1bmN0aW9uIF9yZXNvbHZlKHZhbHVlKSB7XG4gICAgICAgIHJlc29sdmUodmFsdWUpO1xuICAgICAgICBkb25lKCk7XG4gICAgICB9LCBmdW5jdGlvbiBfcmVqZWN0KGVycikge1xuICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgZG9uZSgpO1xuICAgICAgfSwgcmVzcG9uc2UpO1xuXG4gICAgICAvLyBDbGVhbiB1cCByZXF1ZXN0XG4gICAgICByZXF1ZXN0ID0gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoJ29ubG9hZGVuZCcgaW4gcmVxdWVzdCkge1xuICAgICAgLy8gVXNlIG9ubG9hZGVuZCBpZiBhdmFpbGFibGVcbiAgICAgIHJlcXVlc3Qub25sb2FkZW5kID0gb25sb2FkZW5kO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBMaXN0ZW4gZm9yIHJlYWR5IHN0YXRlIHRvIGVtdWxhdGUgb25sb2FkZW5kXG4gICAgICByZXF1ZXN0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uIGhhbmRsZUxvYWQoKSB7XG4gICAgICAgIGlmICghcmVxdWVzdCB8fCByZXF1ZXN0LnJlYWR5U3RhdGUgIT09IDQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUaGUgcmVxdWVzdCBlcnJvcmVkIG91dCBhbmQgd2UgZGlkbid0IGdldCBhIHJlc3BvbnNlLCB0aGlzIHdpbGwgYmVcbiAgICAgICAgLy8gaGFuZGxlZCBieSBvbmVycm9yIGluc3RlYWRcbiAgICAgICAgLy8gV2l0aCBvbmUgZXhjZXB0aW9uOiByZXF1ZXN0IHRoYXQgdXNpbmcgZmlsZTogcHJvdG9jb2wsIG1vc3QgYnJvd3NlcnNcbiAgICAgICAgLy8gd2lsbCByZXR1cm4gc3RhdHVzIGFzIDAgZXZlbiB0aG91Z2ggaXQncyBhIHN1Y2Nlc3NmdWwgcmVxdWVzdFxuICAgICAgICBpZiAocmVxdWVzdC5zdGF0dXMgPT09IDAgJiYgIShyZXF1ZXN0LnJlc3BvbnNlVVJMICYmIHJlcXVlc3QucmVzcG9uc2VVUkwuaW5kZXhPZignZmlsZTonKSA9PT0gMCkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gcmVhZHlzdGF0ZSBoYW5kbGVyIGlzIGNhbGxpbmcgYmVmb3JlIG9uZXJyb3Igb3Igb250aW1lb3V0IGhhbmRsZXJzLFxuICAgICAgICAvLyBzbyB3ZSBzaG91bGQgY2FsbCBvbmxvYWRlbmQgb24gdGhlIG5leHQgJ3RpY2snXG4gICAgICAgIHNldFRpbWVvdXQob25sb2FkZW5kKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGJyb3dzZXIgcmVxdWVzdCBjYW5jZWxsYXRpb24gKGFzIG9wcG9zZWQgdG8gYSBtYW51YWwgY2FuY2VsbGF0aW9uKVxuICAgIHJlcXVlc3Qub25hYm9ydCA9IGZ1bmN0aW9uIGhhbmRsZUFib3J0KCkge1xuICAgICAgaWYgKCFyZXF1ZXN0KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgcmVqZWN0KG5ldyBBeGlvc0Vycm9yKCdSZXF1ZXN0IGFib3J0ZWQnLCBBeGlvc0Vycm9yLkVDT05OQUJPUlRFRCwgY29uZmlnLCByZXF1ZXN0KSk7XG5cbiAgICAgIC8vIENsZWFuIHVwIHJlcXVlc3RcbiAgICAgIHJlcXVlc3QgPSBudWxsO1xuICAgIH07XG5cbiAgICAvLyBIYW5kbGUgbG93IGxldmVsIG5ldHdvcmsgZXJyb3JzXG4gICAgcmVxdWVzdC5vbmVycm9yID0gZnVuY3Rpb24gaGFuZGxlRXJyb3IoKSB7XG4gICAgICAvLyBSZWFsIGVycm9ycyBhcmUgaGlkZGVuIGZyb20gdXMgYnkgdGhlIGJyb3dzZXJcbiAgICAgIC8vIG9uZXJyb3Igc2hvdWxkIG9ubHkgZmlyZSBpZiBpdCdzIGEgbmV0d29yayBlcnJvclxuICAgICAgcmVqZWN0KG5ldyBBeGlvc0Vycm9yKCdOZXR3b3JrIEVycm9yJywgQXhpb3NFcnJvci5FUlJfTkVUV09SSywgY29uZmlnLCByZXF1ZXN0KSk7XG5cbiAgICAgIC8vIENsZWFuIHVwIHJlcXVlc3RcbiAgICAgIHJlcXVlc3QgPSBudWxsO1xuICAgIH07XG5cbiAgICAvLyBIYW5kbGUgdGltZW91dFxuICAgIHJlcXVlc3Qub250aW1lb3V0ID0gZnVuY3Rpb24gaGFuZGxlVGltZW91dCgpIHtcbiAgICAgIGxldCB0aW1lb3V0RXJyb3JNZXNzYWdlID0gX2NvbmZpZy50aW1lb3V0ID8gJ3RpbWVvdXQgb2YgJyArIF9jb25maWcudGltZW91dCArICdtcyBleGNlZWRlZCcgOiAndGltZW91dCBleGNlZWRlZCc7XG4gICAgICBjb25zdCB0cmFuc2l0aW9uYWwgPSBfY29uZmlnLnRyYW5zaXRpb25hbCB8fCB0cmFuc2l0aW9uYWxEZWZhdWx0cztcbiAgICAgIGlmIChfY29uZmlnLnRpbWVvdXRFcnJvck1lc3NhZ2UpIHtcbiAgICAgICAgdGltZW91dEVycm9yTWVzc2FnZSA9IF9jb25maWcudGltZW91dEVycm9yTWVzc2FnZTtcbiAgICAgIH1cbiAgICAgIHJlamVjdChuZXcgQXhpb3NFcnJvcihcbiAgICAgICAgdGltZW91dEVycm9yTWVzc2FnZSxcbiAgICAgICAgdHJhbnNpdGlvbmFsLmNsYXJpZnlUaW1lb3V0RXJyb3IgPyBBeGlvc0Vycm9yLkVUSU1FRE9VVCA6IEF4aW9zRXJyb3IuRUNPTk5BQk9SVEVELFxuICAgICAgICBjb25maWcsXG4gICAgICAgIHJlcXVlc3QpKTtcblxuICAgICAgLy8gQ2xlYW4gdXAgcmVxdWVzdFxuICAgICAgcmVxdWVzdCA9IG51bGw7XG4gICAgfTtcblxuICAgIC8vIFJlbW92ZSBDb250ZW50LVR5cGUgaWYgZGF0YSBpcyB1bmRlZmluZWRcbiAgICByZXF1ZXN0RGF0YSA9PT0gdW5kZWZpbmVkICYmIHJlcXVlc3RIZWFkZXJzLnNldENvbnRlbnRUeXBlKG51bGwpO1xuXG4gICAgLy8gQWRkIGhlYWRlcnMgdG8gdGhlIHJlcXVlc3RcbiAgICBpZiAoJ3NldFJlcXVlc3RIZWFkZXInIGluIHJlcXVlc3QpIHtcbiAgICAgIHV0aWxzLmZvckVhY2gocmVxdWVzdEhlYWRlcnMudG9KU09OKCksIGZ1bmN0aW9uIHNldFJlcXVlc3RIZWFkZXIodmFsLCBrZXkpIHtcbiAgICAgICAgcmVxdWVzdC5zZXRSZXF1ZXN0SGVhZGVyKGtleSwgdmFsKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEFkZCB3aXRoQ3JlZGVudGlhbHMgdG8gcmVxdWVzdCBpZiBuZWVkZWRcbiAgICBpZiAoIXV0aWxzLmlzVW5kZWZpbmVkKF9jb25maWcud2l0aENyZWRlbnRpYWxzKSkge1xuICAgICAgcmVxdWVzdC53aXRoQ3JlZGVudGlhbHMgPSAhIV9jb25maWcud2l0aENyZWRlbnRpYWxzO1xuICAgIH1cblxuICAgIC8vIEFkZCByZXNwb25zZVR5cGUgdG8gcmVxdWVzdCBpZiBuZWVkZWRcbiAgICBpZiAocmVzcG9uc2VUeXBlICYmIHJlc3BvbnNlVHlwZSAhPT0gJ2pzb24nKSB7XG4gICAgICByZXF1ZXN0LnJlc3BvbnNlVHlwZSA9IF9jb25maWcucmVzcG9uc2VUeXBlO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBwcm9ncmVzcyBpZiBuZWVkZWRcbiAgICBpZiAob25Eb3dubG9hZFByb2dyZXNzKSB7XG4gICAgICAoW2Rvd25sb2FkVGhyb3R0bGVkLCBmbHVzaERvd25sb2FkXSA9IHByb2dyZXNzRXZlbnRSZWR1Y2VyKG9uRG93bmxvYWRQcm9ncmVzcywgdHJ1ZSkpO1xuICAgICAgcmVxdWVzdC5hZGRFdmVudExpc3RlbmVyKCdwcm9ncmVzcycsIGRvd25sb2FkVGhyb3R0bGVkKTtcbiAgICB9XG5cbiAgICAvLyBOb3QgYWxsIGJyb3dzZXJzIHN1cHBvcnQgdXBsb2FkIGV2ZW50c1xuICAgIGlmIChvblVwbG9hZFByb2dyZXNzICYmIHJlcXVlc3QudXBsb2FkKSB7XG4gICAgICAoW3VwbG9hZFRocm90dGxlZCwgZmx1c2hVcGxvYWRdID0gcHJvZ3Jlc3NFdmVudFJlZHVjZXIob25VcGxvYWRQcm9ncmVzcykpO1xuXG4gICAgICByZXF1ZXN0LnVwbG9hZC5hZGRFdmVudExpc3RlbmVyKCdwcm9ncmVzcycsIHVwbG9hZFRocm90dGxlZCk7XG5cbiAgICAgIHJlcXVlc3QudXBsb2FkLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWRlbmQnLCBmbHVzaFVwbG9hZCk7XG4gICAgfVxuXG4gICAgaWYgKF9jb25maWcuY2FuY2VsVG9rZW4gfHwgX2NvbmZpZy5zaWduYWwpIHtcbiAgICAgIC8vIEhhbmRsZSBjYW5jZWxsYXRpb25cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBmdW5jLW5hbWVzXG4gICAgICBvbkNhbmNlbGVkID0gY2FuY2VsID0+IHtcbiAgICAgICAgaWYgKCFyZXF1ZXN0KSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdCghY2FuY2VsIHx8IGNhbmNlbC50eXBlID8gbmV3IENhbmNlbGVkRXJyb3IobnVsbCwgY29uZmlnLCByZXF1ZXN0KSA6IGNhbmNlbCk7XG4gICAgICAgIHJlcXVlc3QuYWJvcnQoKTtcbiAgICAgICAgcmVxdWVzdCA9IG51bGw7XG4gICAgICB9O1xuXG4gICAgICBfY29uZmlnLmNhbmNlbFRva2VuICYmIF9jb25maWcuY2FuY2VsVG9rZW4uc3Vic2NyaWJlKG9uQ2FuY2VsZWQpO1xuICAgICAgaWYgKF9jb25maWcuc2lnbmFsKSB7XG4gICAgICAgIF9jb25maWcuc2lnbmFsLmFib3J0ZWQgPyBvbkNhbmNlbGVkKCkgOiBfY29uZmlnLnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsIG9uQ2FuY2VsZWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHByb3RvY29sID0gcGFyc2VQcm90b2NvbChfY29uZmlnLnVybCk7XG5cbiAgICBpZiAocHJvdG9jb2wgJiYgcGxhdGZvcm0ucHJvdG9jb2xzLmluZGV4T2YocHJvdG9jb2wpID09PSAtMSkge1xuICAgICAgcmVqZWN0KG5ldyBBeGlvc0Vycm9yKCdVbnN1cHBvcnRlZCBwcm90b2NvbCAnICsgcHJvdG9jb2wgKyAnOicsIEF4aW9zRXJyb3IuRVJSX0JBRF9SRVFVRVNULCBjb25maWcpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cblxuICAgIC8vIFNlbmQgdGhlIHJlcXVlc3RcbiAgICByZXF1ZXN0LnNlbmQocmVxdWVzdERhdGEgfHwgbnVsbCk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IENhbmNlbGVkRXJyb3IgZnJvbSBcIi4uL2NhbmNlbC9DYW5jZWxlZEVycm9yLmpzXCI7XG5pbXBvcnQgQXhpb3NFcnJvciBmcm9tIFwiLi4vY29yZS9BeGlvc0Vycm9yLmpzXCI7XG5pbXBvcnQgdXRpbHMgZnJvbSAnLi4vdXRpbHMuanMnO1xuXG5jb25zdCBjb21wb3NlU2lnbmFscyA9IChzaWduYWxzLCB0aW1lb3V0KSA9PiB7XG4gIGNvbnN0IHtsZW5ndGh9ID0gKHNpZ25hbHMgPSBzaWduYWxzID8gc2lnbmFscy5maWx0ZXIoQm9vbGVhbikgOiBbXSk7XG5cbiAgaWYgKHRpbWVvdXQgfHwgbGVuZ3RoKSB7XG4gICAgbGV0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG5cbiAgICBsZXQgYWJvcnRlZDtcblxuICAgIGNvbnN0IG9uYWJvcnQgPSBmdW5jdGlvbiAocmVhc29uKSB7XG4gICAgICBpZiAoIWFib3J0ZWQpIHtcbiAgICAgICAgYWJvcnRlZCA9IHRydWU7XG4gICAgICAgIHVuc3Vic2NyaWJlKCk7XG4gICAgICAgIGNvbnN0IGVyciA9IHJlYXNvbiBpbnN0YW5jZW9mIEVycm9yID8gcmVhc29uIDogdGhpcy5yZWFzb247XG4gICAgICAgIGNvbnRyb2xsZXIuYWJvcnQoZXJyIGluc3RhbmNlb2YgQXhpb3NFcnJvciA/IGVyciA6IG5ldyBDYW5jZWxlZEVycm9yKGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBlcnIpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgdGltZXIgPSB0aW1lb3V0ICYmIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGltZXIgPSBudWxsO1xuICAgICAgb25hYm9ydChuZXcgQXhpb3NFcnJvcihgdGltZW91dCAke3RpbWVvdXR9IG9mIG1zIGV4Y2VlZGVkYCwgQXhpb3NFcnJvci5FVElNRURPVVQpKVxuICAgIH0sIHRpbWVvdXQpXG5cbiAgICBjb25zdCB1bnN1YnNjcmliZSA9ICgpID0+IHtcbiAgICAgIGlmIChzaWduYWxzKSB7XG4gICAgICAgIHRpbWVyICYmIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICAgIHRpbWVyID0gbnVsbDtcbiAgICAgICAgc2lnbmFscy5mb3JFYWNoKHNpZ25hbCA9PiB7XG4gICAgICAgICAgc2lnbmFsLnVuc3Vic2NyaWJlID8gc2lnbmFsLnVuc3Vic2NyaWJlKG9uYWJvcnQpIDogc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Fib3J0Jywgb25hYm9ydCk7XG4gICAgICAgIH0pO1xuICAgICAgICBzaWduYWxzID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBzaWduYWxzLmZvckVhY2goKHNpZ25hbCkgPT4gc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0Jywgb25hYm9ydCkpO1xuXG4gICAgY29uc3Qge3NpZ25hbH0gPSBjb250cm9sbGVyO1xuXG4gICAgc2lnbmFsLnVuc3Vic2NyaWJlID0gKCkgPT4gdXRpbHMuYXNhcCh1bnN1YnNjcmliZSk7XG5cbiAgICByZXR1cm4gc2lnbmFsO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNvbXBvc2VTaWduYWxzO1xuIiwiXG5leHBvcnQgY29uc3Qgc3RyZWFtQ2h1bmsgPSBmdW5jdGlvbiogKGNodW5rLCBjaHVua1NpemUpIHtcbiAgbGV0IGxlbiA9IGNodW5rLmJ5dGVMZW5ndGg7XG5cbiAgaWYgKCFjaHVua1NpemUgfHwgbGVuIDwgY2h1bmtTaXplKSB7XG4gICAgeWllbGQgY2h1bms7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbGV0IHBvcyA9IDA7XG4gIGxldCBlbmQ7XG5cbiAgd2hpbGUgKHBvcyA8IGxlbikge1xuICAgIGVuZCA9IHBvcyArIGNodW5rU2l6ZTtcbiAgICB5aWVsZCBjaHVuay5zbGljZShwb3MsIGVuZCk7XG4gICAgcG9zID0gZW5kO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCByZWFkQnl0ZXMgPSBhc3luYyBmdW5jdGlvbiogKGl0ZXJhYmxlLCBjaHVua1NpemUpIHtcbiAgZm9yIGF3YWl0IChjb25zdCBjaHVuayBvZiByZWFkU3RyZWFtKGl0ZXJhYmxlKSkge1xuICAgIHlpZWxkKiBzdHJlYW1DaHVuayhjaHVuaywgY2h1bmtTaXplKTtcbiAgfVxufVxuXG5jb25zdCByZWFkU3RyZWFtID0gYXN5bmMgZnVuY3Rpb24qIChzdHJlYW0pIHtcbiAgaWYgKHN0cmVhbVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0pIHtcbiAgICB5aWVsZCogc3RyZWFtO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHJlYWRlciA9IHN0cmVhbS5nZXRSZWFkZXIoKTtcbiAgdHJ5IHtcbiAgICBmb3IgKDs7KSB7XG4gICAgICBjb25zdCB7ZG9uZSwgdmFsdWV9ID0gYXdhaXQgcmVhZGVyLnJlYWQoKTtcbiAgICAgIGlmIChkb25lKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgeWllbGQgdmFsdWU7XG4gICAgfVxuICB9IGZpbmFsbHkge1xuICAgIGF3YWl0IHJlYWRlci5jYW5jZWwoKTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgdHJhY2tTdHJlYW0gPSAoc3RyZWFtLCBjaHVua1NpemUsIG9uUHJvZ3Jlc3MsIG9uRmluaXNoKSA9PiB7XG4gIGNvbnN0IGl0ZXJhdG9yID0gcmVhZEJ5dGVzKHN0cmVhbSwgY2h1bmtTaXplKTtcblxuICBsZXQgYnl0ZXMgPSAwO1xuICBsZXQgZG9uZTtcbiAgbGV0IF9vbkZpbmlzaCA9IChlKSA9PiB7XG4gICAgaWYgKCFkb25lKSB7XG4gICAgICBkb25lID0gdHJ1ZTtcbiAgICAgIG9uRmluaXNoICYmIG9uRmluaXNoKGUpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXcgUmVhZGFibGVTdHJlYW0oe1xuICAgIGFzeW5jIHB1bGwoY29udHJvbGxlcikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3Qge2RvbmUsIHZhbHVlfSA9IGF3YWl0IGl0ZXJhdG9yLm5leHQoKTtcblxuICAgICAgICBpZiAoZG9uZSkge1xuICAgICAgICAgX29uRmluaXNoKCk7XG4gICAgICAgICAgY29udHJvbGxlci5jbG9zZSgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsZW4gPSB2YWx1ZS5ieXRlTGVuZ3RoO1xuICAgICAgICBpZiAob25Qcm9ncmVzcykge1xuICAgICAgICAgIGxldCBsb2FkZWRCeXRlcyA9IGJ5dGVzICs9IGxlbjtcbiAgICAgICAgICBvblByb2dyZXNzKGxvYWRlZEJ5dGVzKTtcbiAgICAgICAgfVxuICAgICAgICBjb250cm9sbGVyLmVucXVldWUobmV3IFVpbnQ4QXJyYXkodmFsdWUpKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBfb25GaW5pc2goZXJyKTtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgIH0sXG4gICAgY2FuY2VsKHJlYXNvbikge1xuICAgICAgX29uRmluaXNoKHJlYXNvbik7XG4gICAgICByZXR1cm4gaXRlcmF0b3IucmV0dXJuKCk7XG4gICAgfVxuICB9LCB7XG4gICAgaGlnaFdhdGVyTWFyazogMlxuICB9KVxufVxuIiwiaW1wb3J0IHBsYXRmb3JtIGZyb20gXCIuLi9wbGF0Zm9ybS9pbmRleC5qc1wiO1xuaW1wb3J0IHV0aWxzIGZyb20gXCIuLi91dGlscy5qc1wiO1xuaW1wb3J0IEF4aW9zRXJyb3IgZnJvbSBcIi4uL2NvcmUvQXhpb3NFcnJvci5qc1wiO1xuaW1wb3J0IGNvbXBvc2VTaWduYWxzIGZyb20gXCIuLi9oZWxwZXJzL2NvbXBvc2VTaWduYWxzLmpzXCI7XG5pbXBvcnQge3RyYWNrU3RyZWFtfSBmcm9tIFwiLi4vaGVscGVycy90cmFja1N0cmVhbS5qc1wiO1xuaW1wb3J0IEF4aW9zSGVhZGVycyBmcm9tIFwiLi4vY29yZS9BeGlvc0hlYWRlcnMuanNcIjtcbmltcG9ydCB7cHJvZ3Jlc3NFdmVudFJlZHVjZXIsIHByb2dyZXNzRXZlbnREZWNvcmF0b3IsIGFzeW5jRGVjb3JhdG9yfSBmcm9tIFwiLi4vaGVscGVycy9wcm9ncmVzc0V2ZW50UmVkdWNlci5qc1wiO1xuaW1wb3J0IHJlc29sdmVDb25maWcgZnJvbSBcIi4uL2hlbHBlcnMvcmVzb2x2ZUNvbmZpZy5qc1wiO1xuaW1wb3J0IHNldHRsZSBmcm9tIFwiLi4vY29yZS9zZXR0bGUuanNcIjtcblxuY29uc3QgaXNGZXRjaFN1cHBvcnRlZCA9IHR5cGVvZiBmZXRjaCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgUmVxdWVzdCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgUmVzcG9uc2UgPT09ICdmdW5jdGlvbic7XG5jb25zdCBpc1JlYWRhYmxlU3RyZWFtU3VwcG9ydGVkID0gaXNGZXRjaFN1cHBvcnRlZCAmJiB0eXBlb2YgUmVhZGFibGVTdHJlYW0gPT09ICdmdW5jdGlvbic7XG5cbi8vIHVzZWQgb25seSBpbnNpZGUgdGhlIGZldGNoIGFkYXB0ZXJcbmNvbnN0IGVuY29kZVRleHQgPSBpc0ZldGNoU3VwcG9ydGVkICYmICh0eXBlb2YgVGV4dEVuY29kZXIgPT09ICdmdW5jdGlvbicgP1xuICAgICgoZW5jb2RlcikgPT4gKHN0cikgPT4gZW5jb2Rlci5lbmNvZGUoc3RyKSkobmV3IFRleHRFbmNvZGVyKCkpIDpcbiAgICBhc3luYyAoc3RyKSA9PiBuZXcgVWludDhBcnJheShhd2FpdCBuZXcgUmVzcG9uc2Uoc3RyKS5hcnJheUJ1ZmZlcigpKVxuKTtcblxuY29uc3QgdGVzdCA9IChmbiwgLi4uYXJncykgPT4ge1xuICB0cnkge1xuICAgIHJldHVybiAhIWZuKC4uLmFyZ3MpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cblxuY29uc3Qgc3VwcG9ydHNSZXF1ZXN0U3RyZWFtID0gaXNSZWFkYWJsZVN0cmVhbVN1cHBvcnRlZCAmJiB0ZXN0KCgpID0+IHtcbiAgbGV0IGR1cGxleEFjY2Vzc2VkID0gZmFsc2U7XG5cbiAgY29uc3QgaGFzQ29udGVudFR5cGUgPSBuZXcgUmVxdWVzdChwbGF0Zm9ybS5vcmlnaW4sIHtcbiAgICBib2R5OiBuZXcgUmVhZGFibGVTdHJlYW0oKSxcbiAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICBnZXQgZHVwbGV4KCkge1xuICAgICAgZHVwbGV4QWNjZXNzZWQgPSB0cnVlO1xuICAgICAgcmV0dXJuICdoYWxmJztcbiAgICB9LFxuICB9KS5oZWFkZXJzLmhhcygnQ29udGVudC1UeXBlJyk7XG5cbiAgcmV0dXJuIGR1cGxleEFjY2Vzc2VkICYmICFoYXNDb250ZW50VHlwZTtcbn0pO1xuXG5jb25zdCBERUZBVUxUX0NIVU5LX1NJWkUgPSA2NCAqIDEwMjQ7XG5cbmNvbnN0IHN1cHBvcnRzUmVzcG9uc2VTdHJlYW0gPSBpc1JlYWRhYmxlU3RyZWFtU3VwcG9ydGVkICYmXG4gIHRlc3QoKCkgPT4gdXRpbHMuaXNSZWFkYWJsZVN0cmVhbShuZXcgUmVzcG9uc2UoJycpLmJvZHkpKTtcblxuXG5jb25zdCByZXNvbHZlcnMgPSB7XG4gIHN0cmVhbTogc3VwcG9ydHNSZXNwb25zZVN0cmVhbSAmJiAoKHJlcykgPT4gcmVzLmJvZHkpXG59O1xuXG5pc0ZldGNoU3VwcG9ydGVkICYmICgoKHJlcykgPT4ge1xuICBbJ3RleHQnLCAnYXJyYXlCdWZmZXInLCAnYmxvYicsICdmb3JtRGF0YScsICdzdHJlYW0nXS5mb3JFYWNoKHR5cGUgPT4ge1xuICAgICFyZXNvbHZlcnNbdHlwZV0gJiYgKHJlc29sdmVyc1t0eXBlXSA9IHV0aWxzLmlzRnVuY3Rpb24ocmVzW3R5cGVdKSA/IChyZXMpID0+IHJlc1t0eXBlXSgpIDpcbiAgICAgIChfLCBjb25maWcpID0+IHtcbiAgICAgICAgdGhyb3cgbmV3IEF4aW9zRXJyb3IoYFJlc3BvbnNlIHR5cGUgJyR7dHlwZX0nIGlzIG5vdCBzdXBwb3J0ZWRgLCBBeGlvc0Vycm9yLkVSUl9OT1RfU1VQUE9SVCwgY29uZmlnKTtcbiAgICAgIH0pXG4gIH0pO1xufSkobmV3IFJlc3BvbnNlKSk7XG5cbmNvbnN0IGdldEJvZHlMZW5ndGggPSBhc3luYyAoYm9keSkgPT4ge1xuICBpZiAoYm9keSA9PSBudWxsKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICBpZih1dGlscy5pc0Jsb2IoYm9keSkpIHtcbiAgICByZXR1cm4gYm9keS5zaXplO1xuICB9XG5cbiAgaWYodXRpbHMuaXNTcGVjQ29tcGxpYW50Rm9ybShib2R5KSkge1xuICAgIGNvbnN0IF9yZXF1ZXN0ID0gbmV3IFJlcXVlc3QocGxhdGZvcm0ub3JpZ2luLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGJvZHksXG4gICAgfSk7XG4gICAgcmV0dXJuIChhd2FpdCBfcmVxdWVzdC5hcnJheUJ1ZmZlcigpKS5ieXRlTGVuZ3RoO1xuICB9XG5cbiAgaWYodXRpbHMuaXNBcnJheUJ1ZmZlclZpZXcoYm9keSkgfHwgdXRpbHMuaXNBcnJheUJ1ZmZlcihib2R5KSkge1xuICAgIHJldHVybiBib2R5LmJ5dGVMZW5ndGg7XG4gIH1cblxuICBpZih1dGlscy5pc1VSTFNlYXJjaFBhcmFtcyhib2R5KSkge1xuICAgIGJvZHkgPSBib2R5ICsgJyc7XG4gIH1cblxuICBpZih1dGlscy5pc1N0cmluZyhib2R5KSkge1xuICAgIHJldHVybiAoYXdhaXQgZW5jb2RlVGV4dChib2R5KSkuYnl0ZUxlbmd0aDtcbiAgfVxufVxuXG5jb25zdCByZXNvbHZlQm9keUxlbmd0aCA9IGFzeW5jIChoZWFkZXJzLCBib2R5KSA9PiB7XG4gIGNvbnN0IGxlbmd0aCA9IHV0aWxzLnRvRmluaXRlTnVtYmVyKGhlYWRlcnMuZ2V0Q29udGVudExlbmd0aCgpKTtcblxuICByZXR1cm4gbGVuZ3RoID09IG51bGwgPyBnZXRCb2R5TGVuZ3RoKGJvZHkpIDogbGVuZ3RoO1xufVxuXG5leHBvcnQgZGVmYXVsdCBpc0ZldGNoU3VwcG9ydGVkICYmIChhc3luYyAoY29uZmlnKSA9PiB7XG4gIGxldCB7XG4gICAgdXJsLFxuICAgIG1ldGhvZCxcbiAgICBkYXRhLFxuICAgIHNpZ25hbCxcbiAgICBjYW5jZWxUb2tlbixcbiAgICB0aW1lb3V0LFxuICAgIG9uRG93bmxvYWRQcm9ncmVzcyxcbiAgICBvblVwbG9hZFByb2dyZXNzLFxuICAgIHJlc3BvbnNlVHlwZSxcbiAgICBoZWFkZXJzLFxuICAgIHdpdGhDcmVkZW50aWFscyA9ICdzYW1lLW9yaWdpbicsXG4gICAgZmV0Y2hPcHRpb25zXG4gIH0gPSByZXNvbHZlQ29uZmlnKGNvbmZpZyk7XG5cbiAgcmVzcG9uc2VUeXBlID0gcmVzcG9uc2VUeXBlID8gKHJlc3BvbnNlVHlwZSArICcnKS50b0xvd2VyQ2FzZSgpIDogJ3RleHQnO1xuXG4gIGxldCBjb21wb3NlZFNpZ25hbCA9IGNvbXBvc2VTaWduYWxzKFtzaWduYWwsIGNhbmNlbFRva2VuICYmIGNhbmNlbFRva2VuLnRvQWJvcnRTaWduYWwoKV0sIHRpbWVvdXQpO1xuXG4gIGxldCByZXF1ZXN0O1xuXG4gIGNvbnN0IHVuc3Vic2NyaWJlID0gY29tcG9zZWRTaWduYWwgJiYgY29tcG9zZWRTaWduYWwudW5zdWJzY3JpYmUgJiYgKCgpID0+IHtcbiAgICAgIGNvbXBvc2VkU2lnbmFsLnVuc3Vic2NyaWJlKCk7XG4gIH0pO1xuXG4gIGxldCByZXF1ZXN0Q29udGVudExlbmd0aDtcblxuICB0cnkge1xuICAgIGlmIChcbiAgICAgIG9uVXBsb2FkUHJvZ3Jlc3MgJiYgc3VwcG9ydHNSZXF1ZXN0U3RyZWFtICYmIG1ldGhvZCAhPT0gJ2dldCcgJiYgbWV0aG9kICE9PSAnaGVhZCcgJiZcbiAgICAgIChyZXF1ZXN0Q29udGVudExlbmd0aCA9IGF3YWl0IHJlc29sdmVCb2R5TGVuZ3RoKGhlYWRlcnMsIGRhdGEpKSAhPT0gMFxuICAgICkge1xuICAgICAgbGV0IF9yZXF1ZXN0ID0gbmV3IFJlcXVlc3QodXJsLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBib2R5OiBkYXRhLFxuICAgICAgICBkdXBsZXg6IFwiaGFsZlwiXG4gICAgICB9KTtcblxuICAgICAgbGV0IGNvbnRlbnRUeXBlSGVhZGVyO1xuXG4gICAgICBpZiAodXRpbHMuaXNGb3JtRGF0YShkYXRhKSAmJiAoY29udGVudFR5cGVIZWFkZXIgPSBfcmVxdWVzdC5oZWFkZXJzLmdldCgnY29udGVudC10eXBlJykpKSB7XG4gICAgICAgIGhlYWRlcnMuc2V0Q29udGVudFR5cGUoY29udGVudFR5cGVIZWFkZXIpXG4gICAgICB9XG5cbiAgICAgIGlmIChfcmVxdWVzdC5ib2R5KSB7XG4gICAgICAgIGNvbnN0IFtvblByb2dyZXNzLCBmbHVzaF0gPSBwcm9ncmVzc0V2ZW50RGVjb3JhdG9yKFxuICAgICAgICAgIHJlcXVlc3RDb250ZW50TGVuZ3RoLFxuICAgICAgICAgIHByb2dyZXNzRXZlbnRSZWR1Y2VyKGFzeW5jRGVjb3JhdG9yKG9uVXBsb2FkUHJvZ3Jlc3MpKVxuICAgICAgICApO1xuXG4gICAgICAgIGRhdGEgPSB0cmFja1N0cmVhbShfcmVxdWVzdC5ib2R5LCBERUZBVUxUX0NIVU5LX1NJWkUsIG9uUHJvZ3Jlc3MsIGZsdXNoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIXV0aWxzLmlzU3RyaW5nKHdpdGhDcmVkZW50aWFscykpIHtcbiAgICAgIHdpdGhDcmVkZW50aWFscyA9IHdpdGhDcmVkZW50aWFscyA/ICdpbmNsdWRlJyA6ICdvbWl0JztcbiAgICB9XG5cbiAgICAvLyBDbG91ZGZsYXJlIFdvcmtlcnMgdGhyb3dzIHdoZW4gY3JlZGVudGlhbHMgYXJlIGRlZmluZWRcbiAgICAvLyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2Nsb3VkZmxhcmUvd29ya2VyZC9pc3N1ZXMvOTAyXG4gICAgY29uc3QgaXNDcmVkZW50aWFsc1N1cHBvcnRlZCA9IFwiY3JlZGVudGlhbHNcIiBpbiBSZXF1ZXN0LnByb3RvdHlwZTtcbiAgICByZXF1ZXN0ID0gbmV3IFJlcXVlc3QodXJsLCB7XG4gICAgICAuLi5mZXRjaE9wdGlvbnMsXG4gICAgICBzaWduYWw6IGNvbXBvc2VkU2lnbmFsLFxuICAgICAgbWV0aG9kOiBtZXRob2QudG9VcHBlckNhc2UoKSxcbiAgICAgIGhlYWRlcnM6IGhlYWRlcnMubm9ybWFsaXplKCkudG9KU09OKCksXG4gICAgICBib2R5OiBkYXRhLFxuICAgICAgZHVwbGV4OiBcImhhbGZcIixcbiAgICAgIGNyZWRlbnRpYWxzOiBpc0NyZWRlbnRpYWxzU3VwcG9ydGVkID8gd2l0aENyZWRlbnRpYWxzIDogdW5kZWZpbmVkXG4gICAgfSk7XG5cbiAgICBsZXQgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChyZXF1ZXN0KTtcblxuICAgIGNvbnN0IGlzU3RyZWFtUmVzcG9uc2UgPSBzdXBwb3J0c1Jlc3BvbnNlU3RyZWFtICYmIChyZXNwb25zZVR5cGUgPT09ICdzdHJlYW0nIHx8IHJlc3BvbnNlVHlwZSA9PT0gJ3Jlc3BvbnNlJyk7XG5cbiAgICBpZiAoc3VwcG9ydHNSZXNwb25zZVN0cmVhbSAmJiAob25Eb3dubG9hZFByb2dyZXNzIHx8IChpc1N0cmVhbVJlc3BvbnNlICYmIHVuc3Vic2NyaWJlKSkpIHtcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSB7fTtcblxuICAgICAgWydzdGF0dXMnLCAnc3RhdHVzVGV4dCcsICdoZWFkZXJzJ10uZm9yRWFjaChwcm9wID0+IHtcbiAgICAgICAgb3B0aW9uc1twcm9wXSA9IHJlc3BvbnNlW3Byb3BdO1xuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHJlc3BvbnNlQ29udGVudExlbmd0aCA9IHV0aWxzLnRvRmluaXRlTnVtYmVyKHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdjb250ZW50LWxlbmd0aCcpKTtcblxuICAgICAgY29uc3QgW29uUHJvZ3Jlc3MsIGZsdXNoXSA9IG9uRG93bmxvYWRQcm9ncmVzcyAmJiBwcm9ncmVzc0V2ZW50RGVjb3JhdG9yKFxuICAgICAgICByZXNwb25zZUNvbnRlbnRMZW5ndGgsXG4gICAgICAgIHByb2dyZXNzRXZlbnRSZWR1Y2VyKGFzeW5jRGVjb3JhdG9yKG9uRG93bmxvYWRQcm9ncmVzcyksIHRydWUpXG4gICAgICApIHx8IFtdO1xuXG4gICAgICByZXNwb25zZSA9IG5ldyBSZXNwb25zZShcbiAgICAgICAgdHJhY2tTdHJlYW0ocmVzcG9uc2UuYm9keSwgREVGQVVMVF9DSFVOS19TSVpFLCBvblByb2dyZXNzLCAoKSA9PiB7XG4gICAgICAgICAgZmx1c2ggJiYgZmx1c2goKTtcbiAgICAgICAgICB1bnN1YnNjcmliZSAmJiB1bnN1YnNjcmliZSgpO1xuICAgICAgICB9KSxcbiAgICAgICAgb3B0aW9uc1xuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXNwb25zZVR5cGUgPSByZXNwb25zZVR5cGUgfHwgJ3RleHQnO1xuXG4gICAgbGV0IHJlc3BvbnNlRGF0YSA9IGF3YWl0IHJlc29sdmVyc1t1dGlscy5maW5kS2V5KHJlc29sdmVycywgcmVzcG9uc2VUeXBlKSB8fCAndGV4dCddKHJlc3BvbnNlLCBjb25maWcpO1xuXG4gICAgIWlzU3RyZWFtUmVzcG9uc2UgJiYgdW5zdWJzY3JpYmUgJiYgdW5zdWJzY3JpYmUoKTtcblxuICAgIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCB7XG4gICAgICAgIGRhdGE6IHJlc3BvbnNlRGF0YSxcbiAgICAgICAgaGVhZGVyczogQXhpb3NIZWFkZXJzLmZyb20ocmVzcG9uc2UuaGVhZGVycyksXG4gICAgICAgIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLFxuICAgICAgICBzdGF0dXNUZXh0OiByZXNwb25zZS5zdGF0dXNUZXh0LFxuICAgICAgICBjb25maWcsXG4gICAgICAgIHJlcXVlc3RcbiAgICAgIH0pXG4gICAgfSlcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgdW5zdWJzY3JpYmUgJiYgdW5zdWJzY3JpYmUoKTtcblxuICAgIGlmIChlcnIgJiYgZXJyLm5hbWUgPT09ICdUeXBlRXJyb3InICYmIC9mZXRjaC9pLnRlc3QoZXJyLm1lc3NhZ2UpKSB7XG4gICAgICB0aHJvdyBPYmplY3QuYXNzaWduKFxuICAgICAgICBuZXcgQXhpb3NFcnJvcignTmV0d29yayBFcnJvcicsIEF4aW9zRXJyb3IuRVJSX05FVFdPUkssIGNvbmZpZywgcmVxdWVzdCksXG4gICAgICAgIHtcbiAgICAgICAgICBjYXVzZTogZXJyLmNhdXNlIHx8IGVyclxuICAgICAgICB9XG4gICAgICApXG4gICAgfVxuXG4gICAgdGhyb3cgQXhpb3NFcnJvci5mcm9tKGVyciwgZXJyICYmIGVyci5jb2RlLCBjb25maWcsIHJlcXVlc3QpO1xuICB9XG59KTtcblxuXG4iLCJpbXBvcnQgdXRpbHMgZnJvbSAnLi4vdXRpbHMuanMnO1xuaW1wb3J0IGh0dHBBZGFwdGVyIGZyb20gJy4vaHR0cC5qcyc7XG5pbXBvcnQgeGhyQWRhcHRlciBmcm9tICcuL3hoci5qcyc7XG5pbXBvcnQgZmV0Y2hBZGFwdGVyIGZyb20gJy4vZmV0Y2guanMnO1xuaW1wb3J0IEF4aW9zRXJyb3IgZnJvbSBcIi4uL2NvcmUvQXhpb3NFcnJvci5qc1wiO1xuXG5jb25zdCBrbm93bkFkYXB0ZXJzID0ge1xuICBodHRwOiBodHRwQWRhcHRlcixcbiAgeGhyOiB4aHJBZGFwdGVyLFxuICBmZXRjaDogZmV0Y2hBZGFwdGVyXG59XG5cbnV0aWxzLmZvckVhY2goa25vd25BZGFwdGVycywgKGZuLCB2YWx1ZSkgPT4ge1xuICBpZiAoZm4pIHtcbiAgICB0cnkge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGZuLCAnbmFtZScsIHt2YWx1ZX0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1lbXB0eVxuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZm4sICdhZGFwdGVyTmFtZScsIHt2YWx1ZX0pO1xuICB9XG59KTtcblxuY29uc3QgcmVuZGVyUmVhc29uID0gKHJlYXNvbikgPT4gYC0gJHtyZWFzb259YDtcblxuY29uc3QgaXNSZXNvbHZlZEhhbmRsZSA9IChhZGFwdGVyKSA9PiB1dGlscy5pc0Z1bmN0aW9uKGFkYXB0ZXIpIHx8IGFkYXB0ZXIgPT09IG51bGwgfHwgYWRhcHRlciA9PT0gZmFsc2U7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgZ2V0QWRhcHRlcjogKGFkYXB0ZXJzKSA9PiB7XG4gICAgYWRhcHRlcnMgPSB1dGlscy5pc0FycmF5KGFkYXB0ZXJzKSA/IGFkYXB0ZXJzIDogW2FkYXB0ZXJzXTtcblxuICAgIGNvbnN0IHtsZW5ndGh9ID0gYWRhcHRlcnM7XG4gICAgbGV0IG5hbWVPckFkYXB0ZXI7XG4gICAgbGV0IGFkYXB0ZXI7XG5cbiAgICBjb25zdCByZWplY3RlZFJlYXNvbnMgPSB7fTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIG5hbWVPckFkYXB0ZXIgPSBhZGFwdGVyc1tpXTtcbiAgICAgIGxldCBpZDtcblxuICAgICAgYWRhcHRlciA9IG5hbWVPckFkYXB0ZXI7XG5cbiAgICAgIGlmICghaXNSZXNvbHZlZEhhbmRsZShuYW1lT3JBZGFwdGVyKSkge1xuICAgICAgICBhZGFwdGVyID0ga25vd25BZGFwdGVyc1soaWQgPSBTdHJpbmcobmFtZU9yQWRhcHRlcikpLnRvTG93ZXJDYXNlKCldO1xuXG4gICAgICAgIGlmIChhZGFwdGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgQXhpb3NFcnJvcihgVW5rbm93biBhZGFwdGVyICcke2lkfSdgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoYWRhcHRlcikge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgcmVqZWN0ZWRSZWFzb25zW2lkIHx8ICcjJyArIGldID0gYWRhcHRlcjtcbiAgICB9XG5cbiAgICBpZiAoIWFkYXB0ZXIpIHtcblxuICAgICAgY29uc3QgcmVhc29ucyA9IE9iamVjdC5lbnRyaWVzKHJlamVjdGVkUmVhc29ucylcbiAgICAgICAgLm1hcCgoW2lkLCBzdGF0ZV0pID0+IGBhZGFwdGVyICR7aWR9IGAgK1xuICAgICAgICAgIChzdGF0ZSA9PT0gZmFsc2UgPyAnaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgZW52aXJvbm1lbnQnIDogJ2lzIG5vdCBhdmFpbGFibGUgaW4gdGhlIGJ1aWxkJylcbiAgICAgICAgKTtcblxuICAgICAgbGV0IHMgPSBsZW5ndGggP1xuICAgICAgICAocmVhc29ucy5sZW5ndGggPiAxID8gJ3NpbmNlIDpcXG4nICsgcmVhc29ucy5tYXAocmVuZGVyUmVhc29uKS5qb2luKCdcXG4nKSA6ICcgJyArIHJlbmRlclJlYXNvbihyZWFzb25zWzBdKSkgOlxuICAgICAgICAnYXMgbm8gYWRhcHRlciBzcGVjaWZpZWQnO1xuXG4gICAgICB0aHJvdyBuZXcgQXhpb3NFcnJvcihcbiAgICAgICAgYFRoZXJlIGlzIG5vIHN1aXRhYmxlIGFkYXB0ZXIgdG8gZGlzcGF0Y2ggdGhlIHJlcXVlc3QgYCArIHMsXG4gICAgICAgICdFUlJfTk9UX1NVUFBPUlQnXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBhZGFwdGVyO1xuICB9LFxuICBhZGFwdGVyczoga25vd25BZGFwdGVyc1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pbXBvcnQgdHJhbnNmb3JtRGF0YSBmcm9tICcuL3RyYW5zZm9ybURhdGEuanMnO1xuaW1wb3J0IGlzQ2FuY2VsIGZyb20gJy4uL2NhbmNlbC9pc0NhbmNlbC5qcyc7XG5pbXBvcnQgZGVmYXVsdHMgZnJvbSAnLi4vZGVmYXVsdHMvaW5kZXguanMnO1xuaW1wb3J0IENhbmNlbGVkRXJyb3IgZnJvbSAnLi4vY2FuY2VsL0NhbmNlbGVkRXJyb3IuanMnO1xuaW1wb3J0IEF4aW9zSGVhZGVycyBmcm9tICcuLi9jb3JlL0F4aW9zSGVhZGVycy5qcyc7XG5pbXBvcnQgYWRhcHRlcnMgZnJvbSBcIi4uL2FkYXB0ZXJzL2FkYXB0ZXJzLmpzXCI7XG5cbi8qKlxuICogVGhyb3dzIGEgYENhbmNlbGVkRXJyb3JgIGlmIGNhbmNlbGxhdGlvbiBoYXMgYmVlbiByZXF1ZXN0ZWQuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZyBUaGUgY29uZmlnIHRoYXQgaXMgdG8gYmUgdXNlZCBmb3IgdGhlIHJlcXVlc3RcbiAqXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gdGhyb3dJZkNhbmNlbGxhdGlvblJlcXVlc3RlZChjb25maWcpIHtcbiAgaWYgKGNvbmZpZy5jYW5jZWxUb2tlbikge1xuICAgIGNvbmZpZy5jYW5jZWxUb2tlbi50aHJvd0lmUmVxdWVzdGVkKCk7XG4gIH1cblxuICBpZiAoY29uZmlnLnNpZ25hbCAmJiBjb25maWcuc2lnbmFsLmFib3J0ZWQpIHtcbiAgICB0aHJvdyBuZXcgQ2FuY2VsZWRFcnJvcihudWxsLCBjb25maWcpO1xuICB9XG59XG5cbi8qKlxuICogRGlzcGF0Y2ggYSByZXF1ZXN0IHRvIHRoZSBzZXJ2ZXIgdXNpbmcgdGhlIGNvbmZpZ3VyZWQgYWRhcHRlci5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gY29uZmlnIFRoZSBjb25maWcgdGhhdCBpcyB0byBiZSB1c2VkIGZvciB0aGUgcmVxdWVzdFxuICpcbiAqIEByZXR1cm5zIHtQcm9taXNlfSBUaGUgUHJvbWlzZSB0byBiZSBmdWxmaWxsZWRcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZGlzcGF0Y2hSZXF1ZXN0KGNvbmZpZykge1xuICB0aHJvd0lmQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKGNvbmZpZyk7XG5cbiAgY29uZmlnLmhlYWRlcnMgPSBBeGlvc0hlYWRlcnMuZnJvbShjb25maWcuaGVhZGVycyk7XG5cbiAgLy8gVHJhbnNmb3JtIHJlcXVlc3QgZGF0YVxuICBjb25maWcuZGF0YSA9IHRyYW5zZm9ybURhdGEuY2FsbChcbiAgICBjb25maWcsXG4gICAgY29uZmlnLnRyYW5zZm9ybVJlcXVlc3RcbiAgKTtcblxuICBpZiAoWydwb3N0JywgJ3B1dCcsICdwYXRjaCddLmluZGV4T2YoY29uZmlnLm1ldGhvZCkgIT09IC0xKSB7XG4gICAgY29uZmlnLmhlYWRlcnMuc2V0Q29udGVudFR5cGUoJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcsIGZhbHNlKTtcbiAgfVxuXG4gIGNvbnN0IGFkYXB0ZXIgPSBhZGFwdGVycy5nZXRBZGFwdGVyKGNvbmZpZy5hZGFwdGVyIHx8IGRlZmF1bHRzLmFkYXB0ZXIpO1xuXG4gIHJldHVybiBhZGFwdGVyKGNvbmZpZykudGhlbihmdW5jdGlvbiBvbkFkYXB0ZXJSZXNvbHV0aW9uKHJlc3BvbnNlKSB7XG4gICAgdGhyb3dJZkNhbmNlbGxhdGlvblJlcXVlc3RlZChjb25maWcpO1xuXG4gICAgLy8gVHJhbnNmb3JtIHJlc3BvbnNlIGRhdGFcbiAgICByZXNwb25zZS5kYXRhID0gdHJhbnNmb3JtRGF0YS5jYWxsKFxuICAgICAgY29uZmlnLFxuICAgICAgY29uZmlnLnRyYW5zZm9ybVJlc3BvbnNlLFxuICAgICAgcmVzcG9uc2VcbiAgICApO1xuXG4gICAgcmVzcG9uc2UuaGVhZGVycyA9IEF4aW9zSGVhZGVycy5mcm9tKHJlc3BvbnNlLmhlYWRlcnMpO1xuXG4gICAgcmV0dXJuIHJlc3BvbnNlO1xuICB9LCBmdW5jdGlvbiBvbkFkYXB0ZXJSZWplY3Rpb24ocmVhc29uKSB7XG4gICAgaWYgKCFpc0NhbmNlbChyZWFzb24pKSB7XG4gICAgICB0aHJvd0lmQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKGNvbmZpZyk7XG5cbiAgICAgIC8vIFRyYW5zZm9ybSByZXNwb25zZSBkYXRhXG4gICAgICBpZiAocmVhc29uICYmIHJlYXNvbi5yZXNwb25zZSkge1xuICAgICAgICByZWFzb24ucmVzcG9uc2UuZGF0YSA9IHRyYW5zZm9ybURhdGEuY2FsbChcbiAgICAgICAgICBjb25maWcsXG4gICAgICAgICAgY29uZmlnLnRyYW5zZm9ybVJlc3BvbnNlLFxuICAgICAgICAgIHJlYXNvbi5yZXNwb25zZVxuICAgICAgICApO1xuICAgICAgICByZWFzb24ucmVzcG9uc2UuaGVhZGVycyA9IEF4aW9zSGVhZGVycy5mcm9tKHJlYXNvbi5yZXNwb25zZS5oZWFkZXJzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QocmVhc29uKTtcbiAgfSk7XG59XG4iLCJleHBvcnQgY29uc3QgVkVSU0lPTiA9IFwiMS44LjRcIjsiLCIndXNlIHN0cmljdCc7XG5cbmltcG9ydCB7VkVSU0lPTn0gZnJvbSAnLi4vZW52L2RhdGEuanMnO1xuaW1wb3J0IEF4aW9zRXJyb3IgZnJvbSAnLi4vY29yZS9BeGlvc0Vycm9yLmpzJztcblxuY29uc3QgdmFsaWRhdG9ycyA9IHt9O1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZnVuYy1uYW1lc1xuWydvYmplY3QnLCAnYm9vbGVhbicsICdudW1iZXInLCAnZnVuY3Rpb24nLCAnc3RyaW5nJywgJ3N5bWJvbCddLmZvckVhY2goKHR5cGUsIGkpID0+IHtcbiAgdmFsaWRhdG9yc1t0eXBlXSA9IGZ1bmN0aW9uIHZhbGlkYXRvcih0aGluZykge1xuICAgIHJldHVybiB0eXBlb2YgdGhpbmcgPT09IHR5cGUgfHwgJ2EnICsgKGkgPCAxID8gJ24gJyA6ICcgJykgKyB0eXBlO1xuICB9O1xufSk7XG5cbmNvbnN0IGRlcHJlY2F0ZWRXYXJuaW5ncyA9IHt9O1xuXG4vKipcbiAqIFRyYW5zaXRpb25hbCBvcHRpb24gdmFsaWRhdG9yXG4gKlxuICogQHBhcmFtIHtmdW5jdGlvbnxib29sZWFuP30gdmFsaWRhdG9yIC0gc2V0IHRvIGZhbHNlIGlmIHRoZSB0cmFuc2l0aW9uYWwgb3B0aW9uIGhhcyBiZWVuIHJlbW92ZWRcbiAqIEBwYXJhbSB7c3RyaW5nP30gdmVyc2lvbiAtIGRlcHJlY2F0ZWQgdmVyc2lvbiAvIHJlbW92ZWQgc2luY2UgdmVyc2lvblxuICogQHBhcmFtIHtzdHJpbmc/fSBtZXNzYWdlIC0gc29tZSBtZXNzYWdlIHdpdGggYWRkaXRpb25hbCBpbmZvXG4gKlxuICogQHJldHVybnMge2Z1bmN0aW9ufVxuICovXG52YWxpZGF0b3JzLnRyYW5zaXRpb25hbCA9IGZ1bmN0aW9uIHRyYW5zaXRpb25hbCh2YWxpZGF0b3IsIHZlcnNpb24sIG1lc3NhZ2UpIHtcbiAgZnVuY3Rpb24gZm9ybWF0TWVzc2FnZShvcHQsIGRlc2MpIHtcbiAgICByZXR1cm4gJ1tBeGlvcyB2JyArIFZFUlNJT04gKyAnXSBUcmFuc2l0aW9uYWwgb3B0aW9uIFxcJycgKyBvcHQgKyAnXFwnJyArIGRlc2MgKyAobWVzc2FnZSA/ICcuICcgKyBtZXNzYWdlIDogJycpO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGZ1bmMtbmFtZXNcbiAgcmV0dXJuICh2YWx1ZSwgb3B0LCBvcHRzKSA9PiB7XG4gICAgaWYgKHZhbGlkYXRvciA9PT0gZmFsc2UpIHtcbiAgICAgIHRocm93IG5ldyBBeGlvc0Vycm9yKFxuICAgICAgICBmb3JtYXRNZXNzYWdlKG9wdCwgJyBoYXMgYmVlbiByZW1vdmVkJyArICh2ZXJzaW9uID8gJyBpbiAnICsgdmVyc2lvbiA6ICcnKSksXG4gICAgICAgIEF4aW9zRXJyb3IuRVJSX0RFUFJFQ0FURURcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHZlcnNpb24gJiYgIWRlcHJlY2F0ZWRXYXJuaW5nc1tvcHRdKSB7XG4gICAgICBkZXByZWNhdGVkV2FybmluZ3Nbb3B0XSA9IHRydWU7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBmb3JtYXRNZXNzYWdlKFxuICAgICAgICAgIG9wdCxcbiAgICAgICAgICAnIGhhcyBiZWVuIGRlcHJlY2F0ZWQgc2luY2UgdicgKyB2ZXJzaW9uICsgJyBhbmQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZWFyIGZ1dHVyZSdcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsaWRhdG9yID8gdmFsaWRhdG9yKHZhbHVlLCBvcHQsIG9wdHMpIDogdHJ1ZTtcbiAgfTtcbn07XG5cbnZhbGlkYXRvcnMuc3BlbGxpbmcgPSBmdW5jdGlvbiBzcGVsbGluZyhjb3JyZWN0U3BlbGxpbmcpIHtcbiAgcmV0dXJuICh2YWx1ZSwgb3B0KSA9PiB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICBjb25zb2xlLndhcm4oYCR7b3B0fSBpcyBsaWtlbHkgYSBtaXNzcGVsbGluZyBvZiAke2NvcnJlY3RTcGVsbGluZ31gKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufTtcblxuLyoqXG4gKiBBc3NlcnQgb2JqZWN0J3MgcHJvcGVydGllcyB0eXBlXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAqIEBwYXJhbSB7b2JqZWN0fSBzY2hlbWFcbiAqIEBwYXJhbSB7Ym9vbGVhbj99IGFsbG93VW5rbm93blxuICpcbiAqIEByZXR1cm5zIHtvYmplY3R9XG4gKi9cblxuZnVuY3Rpb24gYXNzZXJ0T3B0aW9ucyhvcHRpb25zLCBzY2hlbWEsIGFsbG93VW5rbm93bikge1xuICBpZiAodHlwZW9mIG9wdGlvbnMgIT09ICdvYmplY3QnKSB7XG4gICAgdGhyb3cgbmV3IEF4aW9zRXJyb3IoJ29wdGlvbnMgbXVzdCBiZSBhbiBvYmplY3QnLCBBeGlvc0Vycm9yLkVSUl9CQURfT1BUSU9OX1ZBTFVFKTtcbiAgfVxuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMob3B0aW9ucyk7XG4gIGxldCBpID0ga2V5cy5sZW5ndGg7XG4gIHdoaWxlIChpLS0gPiAwKSB7XG4gICAgY29uc3Qgb3B0ID0ga2V5c1tpXTtcbiAgICBjb25zdCB2YWxpZGF0b3IgPSBzY2hlbWFbb3B0XTtcbiAgICBpZiAodmFsaWRhdG9yKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IG9wdGlvbnNbb3B0XTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsaWRhdG9yKHZhbHVlLCBvcHQsIG9wdGlvbnMpO1xuICAgICAgaWYgKHJlc3VsdCAhPT0gdHJ1ZSkge1xuICAgICAgICB0aHJvdyBuZXcgQXhpb3NFcnJvcignb3B0aW9uICcgKyBvcHQgKyAnIG11c3QgYmUgJyArIHJlc3VsdCwgQXhpb3NFcnJvci5FUlJfQkFEX09QVElPTl9WQUxVRSk7XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKGFsbG93VW5rbm93biAhPT0gdHJ1ZSkge1xuICAgICAgdGhyb3cgbmV3IEF4aW9zRXJyb3IoJ1Vua25vd24gb3B0aW9uICcgKyBvcHQsIEF4aW9zRXJyb3IuRVJSX0JBRF9PUFRJT04pO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGFzc2VydE9wdGlvbnMsXG4gIHZhbGlkYXRvcnNcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbmltcG9ydCB1dGlscyBmcm9tICcuLy4uL3V0aWxzLmpzJztcbmltcG9ydCBidWlsZFVSTCBmcm9tICcuLi9oZWxwZXJzL2J1aWxkVVJMLmpzJztcbmltcG9ydCBJbnRlcmNlcHRvck1hbmFnZXIgZnJvbSAnLi9JbnRlcmNlcHRvck1hbmFnZXIuanMnO1xuaW1wb3J0IGRpc3BhdGNoUmVxdWVzdCBmcm9tICcuL2Rpc3BhdGNoUmVxdWVzdC5qcyc7XG5pbXBvcnQgbWVyZ2VDb25maWcgZnJvbSAnLi9tZXJnZUNvbmZpZy5qcyc7XG5pbXBvcnQgYnVpbGRGdWxsUGF0aCBmcm9tICcuL2J1aWxkRnVsbFBhdGguanMnO1xuaW1wb3J0IHZhbGlkYXRvciBmcm9tICcuLi9oZWxwZXJzL3ZhbGlkYXRvci5qcyc7XG5pbXBvcnQgQXhpb3NIZWFkZXJzIGZyb20gJy4vQXhpb3NIZWFkZXJzLmpzJztcblxuY29uc3QgdmFsaWRhdG9ycyA9IHZhbGlkYXRvci52YWxpZGF0b3JzO1xuXG4vKipcbiAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBBeGlvc1xuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBpbnN0YW5jZUNvbmZpZyBUaGUgZGVmYXVsdCBjb25maWcgZm9yIHRoZSBpbnN0YW5jZVxuICpcbiAqIEByZXR1cm4ge0F4aW9zfSBBIG5ldyBpbnN0YW5jZSBvZiBBeGlvc1xuICovXG5jbGFzcyBBeGlvcyB7XG4gIGNvbnN0cnVjdG9yKGluc3RhbmNlQ29uZmlnKSB7XG4gICAgdGhpcy5kZWZhdWx0cyA9IGluc3RhbmNlQ29uZmlnO1xuICAgIHRoaXMuaW50ZXJjZXB0b3JzID0ge1xuICAgICAgcmVxdWVzdDogbmV3IEludGVyY2VwdG9yTWFuYWdlcigpLFxuICAgICAgcmVzcG9uc2U6IG5ldyBJbnRlcmNlcHRvck1hbmFnZXIoKVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogRGlzcGF0Y2ggYSByZXF1ZXN0XG4gICAqXG4gICAqIEBwYXJhbSB7U3RyaW5nfE9iamVjdH0gY29uZmlnT3JVcmwgVGhlIGNvbmZpZyBzcGVjaWZpYyBmb3IgdGhpcyByZXF1ZXN0IChtZXJnZWQgd2l0aCB0aGlzLmRlZmF1bHRzKVxuICAgKiBAcGFyYW0gez9PYmplY3R9IGNvbmZpZ1xuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gVGhlIFByb21pc2UgdG8gYmUgZnVsZmlsbGVkXG4gICAqL1xuICBhc3luYyByZXF1ZXN0KGNvbmZpZ09yVXJsLCBjb25maWcpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX3JlcXVlc3QoY29uZmlnT3JVcmwsIGNvbmZpZyk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBpZiAoZXJyIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgbGV0IGR1bW15ID0ge307XG5cbiAgICAgICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UgPyBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZShkdW1teSkgOiAoZHVtbXkgPSBuZXcgRXJyb3IoKSk7XG5cbiAgICAgICAgLy8gc2xpY2Ugb2ZmIHRoZSBFcnJvcjogLi4uIGxpbmVcbiAgICAgICAgY29uc3Qgc3RhY2sgPSBkdW1teS5zdGFjayA/IGR1bW15LnN0YWNrLnJlcGxhY2UoL14uK1xcbi8sICcnKSA6ICcnO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmICghZXJyLnN0YWNrKSB7XG4gICAgICAgICAgICBlcnIuc3RhY2sgPSBzdGFjaztcbiAgICAgICAgICAgIC8vIG1hdGNoIHdpdGhvdXQgdGhlIDIgdG9wIHN0YWNrIGxpbmVzXG4gICAgICAgICAgfSBlbHNlIGlmIChzdGFjayAmJiAhU3RyaW5nKGVyci5zdGFjaykuZW5kc1dpdGgoc3RhY2sucmVwbGFjZSgvXi4rXFxuLitcXG4vLCAnJykpKSB7XG4gICAgICAgICAgICBlcnIuc3RhY2sgKz0gJ1xcbicgKyBzdGFja1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIC8vIGlnbm9yZSB0aGUgY2FzZSB3aGVyZSBcInN0YWNrXCIgaXMgYW4gdW4td3JpdGFibGUgcHJvcGVydHlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICB9XG5cbiAgX3JlcXVlc3QoY29uZmlnT3JVcmwsIGNvbmZpZykge1xuICAgIC8qZXNsaW50IG5vLXBhcmFtLXJlYXNzaWduOjAqL1xuICAgIC8vIEFsbG93IGZvciBheGlvcygnZXhhbXBsZS91cmwnWywgY29uZmlnXSkgYSBsYSBmZXRjaCBBUElcbiAgICBpZiAodHlwZW9mIGNvbmZpZ09yVXJsID09PSAnc3RyaW5nJykge1xuICAgICAgY29uZmlnID0gY29uZmlnIHx8IHt9O1xuICAgICAgY29uZmlnLnVybCA9IGNvbmZpZ09yVXJsO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25maWcgPSBjb25maWdPclVybCB8fCB7fTtcbiAgICB9XG5cbiAgICBjb25maWcgPSBtZXJnZUNvbmZpZyh0aGlzLmRlZmF1bHRzLCBjb25maWcpO1xuXG4gICAgY29uc3Qge3RyYW5zaXRpb25hbCwgcGFyYW1zU2VyaWFsaXplciwgaGVhZGVyc30gPSBjb25maWc7XG5cbiAgICBpZiAodHJhbnNpdGlvbmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHZhbGlkYXRvci5hc3NlcnRPcHRpb25zKHRyYW5zaXRpb25hbCwge1xuICAgICAgICBzaWxlbnRKU09OUGFyc2luZzogdmFsaWRhdG9ycy50cmFuc2l0aW9uYWwodmFsaWRhdG9ycy5ib29sZWFuKSxcbiAgICAgICAgZm9yY2VkSlNPTlBhcnNpbmc6IHZhbGlkYXRvcnMudHJhbnNpdGlvbmFsKHZhbGlkYXRvcnMuYm9vbGVhbiksXG4gICAgICAgIGNsYXJpZnlUaW1lb3V0RXJyb3I6IHZhbGlkYXRvcnMudHJhbnNpdGlvbmFsKHZhbGlkYXRvcnMuYm9vbGVhbilcbiAgICAgIH0sIGZhbHNlKTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zU2VyaWFsaXplciAhPSBudWxsKSB7XG4gICAgICBpZiAodXRpbHMuaXNGdW5jdGlvbihwYXJhbXNTZXJpYWxpemVyKSkge1xuICAgICAgICBjb25maWcucGFyYW1zU2VyaWFsaXplciA9IHtcbiAgICAgICAgICBzZXJpYWxpemU6IHBhcmFtc1NlcmlhbGl6ZXJcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsaWRhdG9yLmFzc2VydE9wdGlvbnMocGFyYW1zU2VyaWFsaXplciwge1xuICAgICAgICAgIGVuY29kZTogdmFsaWRhdG9ycy5mdW5jdGlvbixcbiAgICAgICAgICBzZXJpYWxpemU6IHZhbGlkYXRvcnMuZnVuY3Rpb25cbiAgICAgICAgfSwgdHJ1ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gU2V0IGNvbmZpZy5hbGxvd0Fic29sdXRlVXJsc1xuICAgIGlmIChjb25maWcuYWxsb3dBYnNvbHV0ZVVybHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH0gZWxzZSBpZiAodGhpcy5kZWZhdWx0cy5hbGxvd0Fic29sdXRlVXJscyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25maWcuYWxsb3dBYnNvbHV0ZVVybHMgPSB0aGlzLmRlZmF1bHRzLmFsbG93QWJzb2x1dGVVcmxzO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25maWcuYWxsb3dBYnNvbHV0ZVVybHMgPSB0cnVlO1xuICAgIH1cblxuICAgIHZhbGlkYXRvci5hc3NlcnRPcHRpb25zKGNvbmZpZywge1xuICAgICAgYmFzZVVybDogdmFsaWRhdG9ycy5zcGVsbGluZygnYmFzZVVSTCcpLFxuICAgICAgd2l0aFhzcmZUb2tlbjogdmFsaWRhdG9ycy5zcGVsbGluZygnd2l0aFhTUkZUb2tlbicpXG4gICAgfSwgdHJ1ZSk7XG5cbiAgICAvLyBTZXQgY29uZmlnLm1ldGhvZFxuICAgIGNvbmZpZy5tZXRob2QgPSAoY29uZmlnLm1ldGhvZCB8fCB0aGlzLmRlZmF1bHRzLm1ldGhvZCB8fCAnZ2V0JykudG9Mb3dlckNhc2UoKTtcblxuICAgIC8vIEZsYXR0ZW4gaGVhZGVyc1xuICAgIGxldCBjb250ZXh0SGVhZGVycyA9IGhlYWRlcnMgJiYgdXRpbHMubWVyZ2UoXG4gICAgICBoZWFkZXJzLmNvbW1vbixcbiAgICAgIGhlYWRlcnNbY29uZmlnLm1ldGhvZF1cbiAgICApO1xuXG4gICAgaGVhZGVycyAmJiB1dGlscy5mb3JFYWNoKFxuICAgICAgWydkZWxldGUnLCAnZ2V0JywgJ2hlYWQnLCAncG9zdCcsICdwdXQnLCAncGF0Y2gnLCAnY29tbW9uJ10sXG4gICAgICAobWV0aG9kKSA9PiB7XG4gICAgICAgIGRlbGV0ZSBoZWFkZXJzW21ldGhvZF07XG4gICAgICB9XG4gICAgKTtcblxuICAgIGNvbmZpZy5oZWFkZXJzID0gQXhpb3NIZWFkZXJzLmNvbmNhdChjb250ZXh0SGVhZGVycywgaGVhZGVycyk7XG5cbiAgICAvLyBmaWx0ZXIgb3V0IHNraXBwZWQgaW50ZXJjZXB0b3JzXG4gICAgY29uc3QgcmVxdWVzdEludGVyY2VwdG9yQ2hhaW4gPSBbXTtcbiAgICBsZXQgc3luY2hyb25vdXNSZXF1ZXN0SW50ZXJjZXB0b3JzID0gdHJ1ZTtcbiAgICB0aGlzLmludGVyY2VwdG9ycy5yZXF1ZXN0LmZvckVhY2goZnVuY3Rpb24gdW5zaGlmdFJlcXVlc3RJbnRlcmNlcHRvcnMoaW50ZXJjZXB0b3IpIHtcbiAgICAgIGlmICh0eXBlb2YgaW50ZXJjZXB0b3IucnVuV2hlbiA9PT0gJ2Z1bmN0aW9uJyAmJiBpbnRlcmNlcHRvci5ydW5XaGVuKGNvbmZpZykgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgc3luY2hyb25vdXNSZXF1ZXN0SW50ZXJjZXB0b3JzID0gc3luY2hyb25vdXNSZXF1ZXN0SW50ZXJjZXB0b3JzICYmIGludGVyY2VwdG9yLnN5bmNocm9ub3VzO1xuXG4gICAgICByZXF1ZXN0SW50ZXJjZXB0b3JDaGFpbi51bnNoaWZ0KGludGVyY2VwdG9yLmZ1bGZpbGxlZCwgaW50ZXJjZXB0b3IucmVqZWN0ZWQpO1xuICAgIH0pO1xuXG4gICAgY29uc3QgcmVzcG9uc2VJbnRlcmNlcHRvckNoYWluID0gW107XG4gICAgdGhpcy5pbnRlcmNlcHRvcnMucmVzcG9uc2UuZm9yRWFjaChmdW5jdGlvbiBwdXNoUmVzcG9uc2VJbnRlcmNlcHRvcnMoaW50ZXJjZXB0b3IpIHtcbiAgICAgIHJlc3BvbnNlSW50ZXJjZXB0b3JDaGFpbi5wdXNoKGludGVyY2VwdG9yLmZ1bGZpbGxlZCwgaW50ZXJjZXB0b3IucmVqZWN0ZWQpO1xuICAgIH0pO1xuXG4gICAgbGV0IHByb21pc2U7XG4gICAgbGV0IGkgPSAwO1xuICAgIGxldCBsZW47XG5cbiAgICBpZiAoIXN5bmNocm9ub3VzUmVxdWVzdEludGVyY2VwdG9ycykge1xuICAgICAgY29uc3QgY2hhaW4gPSBbZGlzcGF0Y2hSZXF1ZXN0LmJpbmQodGhpcyksIHVuZGVmaW5lZF07XG4gICAgICBjaGFpbi51bnNoaWZ0LmFwcGx5KGNoYWluLCByZXF1ZXN0SW50ZXJjZXB0b3JDaGFpbik7XG4gICAgICBjaGFpbi5wdXNoLmFwcGx5KGNoYWluLCByZXNwb25zZUludGVyY2VwdG9yQ2hhaW4pO1xuICAgICAgbGVuID0gY2hhaW4ubGVuZ3RoO1xuXG4gICAgICBwcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKGNvbmZpZyk7XG5cbiAgICAgIHdoaWxlIChpIDwgbGVuKSB7XG4gICAgICAgIHByb21pc2UgPSBwcm9taXNlLnRoZW4oY2hhaW5baSsrXSwgY2hhaW5baSsrXSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwcm9taXNlO1xuICAgIH1cblxuICAgIGxlbiA9IHJlcXVlc3RJbnRlcmNlcHRvckNoYWluLmxlbmd0aDtcblxuICAgIGxldCBuZXdDb25maWcgPSBjb25maWc7XG5cbiAgICBpID0gMDtcblxuICAgIHdoaWxlIChpIDwgbGVuKSB7XG4gICAgICBjb25zdCBvbkZ1bGZpbGxlZCA9IHJlcXVlc3RJbnRlcmNlcHRvckNoYWluW2krK107XG4gICAgICBjb25zdCBvblJlamVjdGVkID0gcmVxdWVzdEludGVyY2VwdG9yQ2hhaW5baSsrXTtcbiAgICAgIHRyeSB7XG4gICAgICAgIG5ld0NvbmZpZyA9IG9uRnVsZmlsbGVkKG5ld0NvbmZpZyk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBvblJlamVjdGVkLmNhbGwodGhpcywgZXJyb3IpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgcHJvbWlzZSA9IGRpc3BhdGNoUmVxdWVzdC5jYWxsKHRoaXMsIG5ld0NvbmZpZyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnJvcik7XG4gICAgfVxuXG4gICAgaSA9IDA7XG4gICAgbGVuID0gcmVzcG9uc2VJbnRlcmNlcHRvckNoYWluLmxlbmd0aDtcblxuICAgIHdoaWxlIChpIDwgbGVuKSB7XG4gICAgICBwcm9taXNlID0gcHJvbWlzZS50aGVuKHJlc3BvbnNlSW50ZXJjZXB0b3JDaGFpbltpKytdLCByZXNwb25zZUludGVyY2VwdG9yQ2hhaW5baSsrXSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHByb21pc2U7XG4gIH1cblxuICBnZXRVcmkoY29uZmlnKSB7XG4gICAgY29uZmlnID0gbWVyZ2VDb25maWcodGhpcy5kZWZhdWx0cywgY29uZmlnKTtcbiAgICBjb25zdCBmdWxsUGF0aCA9IGJ1aWxkRnVsbFBhdGgoY29uZmlnLmJhc2VVUkwsIGNvbmZpZy51cmwsIGNvbmZpZy5hbGxvd0Fic29sdXRlVXJscyk7XG4gICAgcmV0dXJuIGJ1aWxkVVJMKGZ1bGxQYXRoLCBjb25maWcucGFyYW1zLCBjb25maWcucGFyYW1zU2VyaWFsaXplcik7XG4gIH1cbn1cblxuLy8gUHJvdmlkZSBhbGlhc2VzIGZvciBzdXBwb3J0ZWQgcmVxdWVzdCBtZXRob2RzXG51dGlscy5mb3JFYWNoKFsnZGVsZXRlJywgJ2dldCcsICdoZWFkJywgJ29wdGlvbnMnXSwgZnVuY3Rpb24gZm9yRWFjaE1ldGhvZE5vRGF0YShtZXRob2QpIHtcbiAgLyplc2xpbnQgZnVuYy1uYW1lczowKi9cbiAgQXhpb3MucHJvdG90eXBlW21ldGhvZF0gPSBmdW5jdGlvbih1cmwsIGNvbmZpZykge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QobWVyZ2VDb25maWcoY29uZmlnIHx8IHt9LCB7XG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICBkYXRhOiAoY29uZmlnIHx8IHt9KS5kYXRhXG4gICAgfSkpO1xuICB9O1xufSk7XG5cbnV0aWxzLmZvckVhY2goWydwb3N0JywgJ3B1dCcsICdwYXRjaCddLCBmdW5jdGlvbiBmb3JFYWNoTWV0aG9kV2l0aERhdGEobWV0aG9kKSB7XG4gIC8qZXNsaW50IGZ1bmMtbmFtZXM6MCovXG5cbiAgZnVuY3Rpb24gZ2VuZXJhdGVIVFRQTWV0aG9kKGlzRm9ybSkge1xuICAgIHJldHVybiBmdW5jdGlvbiBodHRwTWV0aG9kKHVybCwgZGF0YSwgY29uZmlnKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KG1lcmdlQ29uZmlnKGNvbmZpZyB8fCB7fSwge1xuICAgICAgICBtZXRob2QsXG4gICAgICAgIGhlYWRlcnM6IGlzRm9ybSA/IHtcbiAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ211bHRpcGFydC9mb3JtLWRhdGEnXG4gICAgICAgIH0gOiB7fSxcbiAgICAgICAgdXJsLFxuICAgICAgICBkYXRhXG4gICAgICB9KSk7XG4gICAgfTtcbiAgfVxuXG4gIEF4aW9zLnByb3RvdHlwZVttZXRob2RdID0gZ2VuZXJhdGVIVFRQTWV0aG9kKCk7XG5cbiAgQXhpb3MucHJvdG90eXBlW21ldGhvZCArICdGb3JtJ10gPSBnZW5lcmF0ZUhUVFBNZXRob2QodHJ1ZSk7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgQXhpb3M7XG4iLCIndXNlIHN0cmljdCc7XG5cbmltcG9ydCBDYW5jZWxlZEVycm9yIGZyb20gJy4vQ2FuY2VsZWRFcnJvci5qcyc7XG5cbi8qKlxuICogQSBgQ2FuY2VsVG9rZW5gIGlzIGFuIG9iamVjdCB0aGF0IGNhbiBiZSB1c2VkIHRvIHJlcXVlc3QgY2FuY2VsbGF0aW9uIG9mIGFuIG9wZXJhdGlvbi5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBleGVjdXRvciBUaGUgZXhlY3V0b3IgZnVuY3Rpb24uXG4gKlxuICogQHJldHVybnMge0NhbmNlbFRva2VufVxuICovXG5jbGFzcyBDYW5jZWxUb2tlbiB7XG4gIGNvbnN0cnVjdG9yKGV4ZWN1dG9yKSB7XG4gICAgaWYgKHR5cGVvZiBleGVjdXRvciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZXhlY3V0b3IgbXVzdCBiZSBhIGZ1bmN0aW9uLicpO1xuICAgIH1cblxuICAgIGxldCByZXNvbHZlUHJvbWlzZTtcblxuICAgIHRoaXMucHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIHByb21pc2VFeGVjdXRvcihyZXNvbHZlKSB7XG4gICAgICByZXNvbHZlUHJvbWlzZSA9IHJlc29sdmU7XG4gICAgfSk7XG5cbiAgICBjb25zdCB0b2tlbiA9IHRoaXM7XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZnVuYy1uYW1lc1xuICAgIHRoaXMucHJvbWlzZS50aGVuKGNhbmNlbCA9PiB7XG4gICAgICBpZiAoIXRva2VuLl9saXN0ZW5lcnMpIHJldHVybjtcblxuICAgICAgbGV0IGkgPSB0b2tlbi5fbGlzdGVuZXJzLmxlbmd0aDtcblxuICAgICAgd2hpbGUgKGktLSA+IDApIHtcbiAgICAgICAgdG9rZW4uX2xpc3RlbmVyc1tpXShjYW5jZWwpO1xuICAgICAgfVxuICAgICAgdG9rZW4uX2xpc3RlbmVycyA9IG51bGw7XG4gICAgfSk7XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZnVuYy1uYW1lc1xuICAgIHRoaXMucHJvbWlzZS50aGVuID0gb25mdWxmaWxsZWQgPT4ge1xuICAgICAgbGV0IF9yZXNvbHZlO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGZ1bmMtbmFtZXNcbiAgICAgIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgdG9rZW4uc3Vic2NyaWJlKHJlc29sdmUpO1xuICAgICAgICBfcmVzb2x2ZSA9IHJlc29sdmU7XG4gICAgICB9KS50aGVuKG9uZnVsZmlsbGVkKTtcblxuICAgICAgcHJvbWlzZS5jYW5jZWwgPSBmdW5jdGlvbiByZWplY3QoKSB7XG4gICAgICAgIHRva2VuLnVuc3Vic2NyaWJlKF9yZXNvbHZlKTtcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBwcm9taXNlO1xuICAgIH07XG5cbiAgICBleGVjdXRvcihmdW5jdGlvbiBjYW5jZWwobWVzc2FnZSwgY29uZmlnLCByZXF1ZXN0KSB7XG4gICAgICBpZiAodG9rZW4ucmVhc29uKSB7XG4gICAgICAgIC8vIENhbmNlbGxhdGlvbiBoYXMgYWxyZWFkeSBiZWVuIHJlcXVlc3RlZFxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRva2VuLnJlYXNvbiA9IG5ldyBDYW5jZWxlZEVycm9yKG1lc3NhZ2UsIGNvbmZpZywgcmVxdWVzdCk7XG4gICAgICByZXNvbHZlUHJvbWlzZSh0b2tlbi5yZWFzb24pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRocm93cyBhIGBDYW5jZWxlZEVycm9yYCBpZiBjYW5jZWxsYXRpb24gaGFzIGJlZW4gcmVxdWVzdGVkLlxuICAgKi9cbiAgdGhyb3dJZlJlcXVlc3RlZCgpIHtcbiAgICBpZiAodGhpcy5yZWFzb24pIHtcbiAgICAgIHRocm93IHRoaXMucmVhc29uO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJzY3JpYmUgdG8gdGhlIGNhbmNlbCBzaWduYWxcbiAgICovXG5cbiAgc3Vic2NyaWJlKGxpc3RlbmVyKSB7XG4gICAgaWYgKHRoaXMucmVhc29uKSB7XG4gICAgICBsaXN0ZW5lcih0aGlzLnJlYXNvbik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2xpc3RlbmVycykge1xuICAgICAgdGhpcy5fbGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9saXN0ZW5lcnMgPSBbbGlzdGVuZXJdO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVbnN1YnNjcmliZSBmcm9tIHRoZSBjYW5jZWwgc2lnbmFsXG4gICAqL1xuXG4gIHVuc3Vic2NyaWJlKGxpc3RlbmVyKSB7XG4gICAgaWYgKCF0aGlzLl9saXN0ZW5lcnMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLl9saXN0ZW5lcnMuaW5kZXhPZihsaXN0ZW5lcik7XG4gICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgdGhpcy5fbGlzdGVuZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgfVxuICB9XG5cbiAgdG9BYm9ydFNpZ25hbCgpIHtcbiAgICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuXG4gICAgY29uc3QgYWJvcnQgPSAoZXJyKSA9PiB7XG4gICAgICBjb250cm9sbGVyLmFib3J0KGVycik7XG4gICAgfTtcblxuICAgIHRoaXMuc3Vic2NyaWJlKGFib3J0KTtcblxuICAgIGNvbnRyb2xsZXIuc2lnbmFsLnVuc3Vic2NyaWJlID0gKCkgPT4gdGhpcy51bnN1YnNjcmliZShhYm9ydCk7XG5cbiAgICByZXR1cm4gY29udHJvbGxlci5zaWduYWw7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBvYmplY3QgdGhhdCBjb250YWlucyBhIG5ldyBgQ2FuY2VsVG9rZW5gIGFuZCBhIGZ1bmN0aW9uIHRoYXQsIHdoZW4gY2FsbGVkLFxuICAgKiBjYW5jZWxzIHRoZSBgQ2FuY2VsVG9rZW5gLlxuICAgKi9cbiAgc3RhdGljIHNvdXJjZSgpIHtcbiAgICBsZXQgY2FuY2VsO1xuICAgIGNvbnN0IHRva2VuID0gbmV3IENhbmNlbFRva2VuKGZ1bmN0aW9uIGV4ZWN1dG9yKGMpIHtcbiAgICAgIGNhbmNlbCA9IGM7XG4gICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRva2VuLFxuICAgICAgY2FuY2VsXG4gICAgfTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBDYW5jZWxUb2tlbjtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBTeW50YWN0aWMgc3VnYXIgZm9yIGludm9raW5nIGEgZnVuY3Rpb24gYW5kIGV4cGFuZGluZyBhbiBhcnJheSBmb3IgYXJndW1lbnRzLlxuICpcbiAqIENvbW1vbiB1c2UgY2FzZSB3b3VsZCBiZSB0byB1c2UgYEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseWAuXG4gKlxuICogIGBgYGpzXG4gKiAgZnVuY3Rpb24gZih4LCB5LCB6KSB7fVxuICogIHZhciBhcmdzID0gWzEsIDIsIDNdO1xuICogIGYuYXBwbHkobnVsbCwgYXJncyk7XG4gKiAgYGBgXG4gKlxuICogV2l0aCBgc3ByZWFkYCB0aGlzIGV4YW1wbGUgY2FuIGJlIHJlLXdyaXR0ZW4uXG4gKlxuICogIGBgYGpzXG4gKiAgc3ByZWFkKGZ1bmN0aW9uKHgsIHksIHopIHt9KShbMSwgMiwgM10pO1xuICogIGBgYFxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gKlxuICogQHJldHVybnMge0Z1bmN0aW9ufVxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzcHJlYWQoY2FsbGJhY2spIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHdyYXAoYXJyKSB7XG4gICAgcmV0dXJuIGNhbGxiYWNrLmFwcGx5KG51bGwsIGFycik7XG4gIH07XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbmltcG9ydCB1dGlscyBmcm9tICcuLy4uL3V0aWxzLmpzJztcblxuLyoqXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHBheWxvYWQgaXMgYW4gZXJyb3IgdGhyb3duIGJ5IEF4aW9zXG4gKlxuICogQHBhcmFtIHsqfSBwYXlsb2FkIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdGhlIHBheWxvYWQgaXMgYW4gZXJyb3IgdGhyb3duIGJ5IEF4aW9zLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaXNBeGlvc0Vycm9yKHBheWxvYWQpIHtcbiAgcmV0dXJuIHV0aWxzLmlzT2JqZWN0KHBheWxvYWQpICYmIChwYXlsb2FkLmlzQXhpb3NFcnJvciA9PT0gdHJ1ZSk7XG59XG4iLCJjb25zdCBIdHRwU3RhdHVzQ29kZSA9IHtcbiAgQ29udGludWU6IDEwMCxcbiAgU3dpdGNoaW5nUHJvdG9jb2xzOiAxMDEsXG4gIFByb2Nlc3Npbmc6IDEwMixcbiAgRWFybHlIaW50czogMTAzLFxuICBPazogMjAwLFxuICBDcmVhdGVkOiAyMDEsXG4gIEFjY2VwdGVkOiAyMDIsXG4gIE5vbkF1dGhvcml0YXRpdmVJbmZvcm1hdGlvbjogMjAzLFxuICBOb0NvbnRlbnQ6IDIwNCxcbiAgUmVzZXRDb250ZW50OiAyMDUsXG4gIFBhcnRpYWxDb250ZW50OiAyMDYsXG4gIE11bHRpU3RhdHVzOiAyMDcsXG4gIEFscmVhZHlSZXBvcnRlZDogMjA4LFxuICBJbVVzZWQ6IDIyNixcbiAgTXVsdGlwbGVDaG9pY2VzOiAzMDAsXG4gIE1vdmVkUGVybWFuZW50bHk6IDMwMSxcbiAgRm91bmQ6IDMwMixcbiAgU2VlT3RoZXI6IDMwMyxcbiAgTm90TW9kaWZpZWQ6IDMwNCxcbiAgVXNlUHJveHk6IDMwNSxcbiAgVW51c2VkOiAzMDYsXG4gIFRlbXBvcmFyeVJlZGlyZWN0OiAzMDcsXG4gIFBlcm1hbmVudFJlZGlyZWN0OiAzMDgsXG4gIEJhZFJlcXVlc3Q6IDQwMCxcbiAgVW5hdXRob3JpemVkOiA0MDEsXG4gIFBheW1lbnRSZXF1aXJlZDogNDAyLFxuICBGb3JiaWRkZW46IDQwMyxcbiAgTm90Rm91bmQ6IDQwNCxcbiAgTWV0aG9kTm90QWxsb3dlZDogNDA1LFxuICBOb3RBY2NlcHRhYmxlOiA0MDYsXG4gIFByb3h5QXV0aGVudGljYXRpb25SZXF1aXJlZDogNDA3LFxuICBSZXF1ZXN0VGltZW91dDogNDA4LFxuICBDb25mbGljdDogNDA5LFxuICBHb25lOiA0MTAsXG4gIExlbmd0aFJlcXVpcmVkOiA0MTEsXG4gIFByZWNvbmRpdGlvbkZhaWxlZDogNDEyLFxuICBQYXlsb2FkVG9vTGFyZ2U6IDQxMyxcbiAgVXJpVG9vTG9uZzogNDE0LFxuICBVbnN1cHBvcnRlZE1lZGlhVHlwZTogNDE1LFxuICBSYW5nZU5vdFNhdGlzZmlhYmxlOiA0MTYsXG4gIEV4cGVjdGF0aW9uRmFpbGVkOiA0MTcsXG4gIEltQVRlYXBvdDogNDE4LFxuICBNaXNkaXJlY3RlZFJlcXVlc3Q6IDQyMSxcbiAgVW5wcm9jZXNzYWJsZUVudGl0eTogNDIyLFxuICBMb2NrZWQ6IDQyMyxcbiAgRmFpbGVkRGVwZW5kZW5jeTogNDI0LFxuICBUb29FYXJseTogNDI1LFxuICBVcGdyYWRlUmVxdWlyZWQ6IDQyNixcbiAgUHJlY29uZGl0aW9uUmVxdWlyZWQ6IDQyOCxcbiAgVG9vTWFueVJlcXVlc3RzOiA0MjksXG4gIFJlcXVlc3RIZWFkZXJGaWVsZHNUb29MYXJnZTogNDMxLFxuICBVbmF2YWlsYWJsZUZvckxlZ2FsUmVhc29uczogNDUxLFxuICBJbnRlcm5hbFNlcnZlckVycm9yOiA1MDAsXG4gIE5vdEltcGxlbWVudGVkOiA1MDEsXG4gIEJhZEdhdGV3YXk6IDUwMixcbiAgU2VydmljZVVuYXZhaWxhYmxlOiA1MDMsXG4gIEdhdGV3YXlUaW1lb3V0OiA1MDQsXG4gIEh0dHBWZXJzaW9uTm90U3VwcG9ydGVkOiA1MDUsXG4gIFZhcmlhbnRBbHNvTmVnb3RpYXRlczogNTA2LFxuICBJbnN1ZmZpY2llbnRTdG9yYWdlOiA1MDcsXG4gIExvb3BEZXRlY3RlZDogNTA4LFxuICBOb3RFeHRlbmRlZDogNTEwLFxuICBOZXR3b3JrQXV0aGVudGljYXRpb25SZXF1aXJlZDogNTExLFxufTtcblxuT2JqZWN0LmVudHJpZXMoSHR0cFN0YXR1c0NvZGUpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICBIdHRwU3RhdHVzQ29kZVt2YWx1ZV0gPSBrZXk7XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgSHR0cFN0YXR1c0NvZGU7XG4iLCIndXNlIHN0cmljdCc7XG5cbmltcG9ydCB1dGlscyBmcm9tICcuL3V0aWxzLmpzJztcbmltcG9ydCBiaW5kIGZyb20gJy4vaGVscGVycy9iaW5kLmpzJztcbmltcG9ydCBBeGlvcyBmcm9tICcuL2NvcmUvQXhpb3MuanMnO1xuaW1wb3J0IG1lcmdlQ29uZmlnIGZyb20gJy4vY29yZS9tZXJnZUNvbmZpZy5qcyc7XG5pbXBvcnQgZGVmYXVsdHMgZnJvbSAnLi9kZWZhdWx0cy9pbmRleC5qcyc7XG5pbXBvcnQgZm9ybURhdGFUb0pTT04gZnJvbSAnLi9oZWxwZXJzL2Zvcm1EYXRhVG9KU09OLmpzJztcbmltcG9ydCBDYW5jZWxlZEVycm9yIGZyb20gJy4vY2FuY2VsL0NhbmNlbGVkRXJyb3IuanMnO1xuaW1wb3J0IENhbmNlbFRva2VuIGZyb20gJy4vY2FuY2VsL0NhbmNlbFRva2VuLmpzJztcbmltcG9ydCBpc0NhbmNlbCBmcm9tICcuL2NhbmNlbC9pc0NhbmNlbC5qcyc7XG5pbXBvcnQge1ZFUlNJT059IGZyb20gJy4vZW52L2RhdGEuanMnO1xuaW1wb3J0IHRvRm9ybURhdGEgZnJvbSAnLi9oZWxwZXJzL3RvRm9ybURhdGEuanMnO1xuaW1wb3J0IEF4aW9zRXJyb3IgZnJvbSAnLi9jb3JlL0F4aW9zRXJyb3IuanMnO1xuaW1wb3J0IHNwcmVhZCBmcm9tICcuL2hlbHBlcnMvc3ByZWFkLmpzJztcbmltcG9ydCBpc0F4aW9zRXJyb3IgZnJvbSAnLi9oZWxwZXJzL2lzQXhpb3NFcnJvci5qcyc7XG5pbXBvcnQgQXhpb3NIZWFkZXJzIGZyb20gXCIuL2NvcmUvQXhpb3NIZWFkZXJzLmpzXCI7XG5pbXBvcnQgYWRhcHRlcnMgZnJvbSAnLi9hZGFwdGVycy9hZGFwdGVycy5qcyc7XG5pbXBvcnQgSHR0cFN0YXR1c0NvZGUgZnJvbSAnLi9oZWxwZXJzL0h0dHBTdGF0dXNDb2RlLmpzJztcblxuLyoqXG4gKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgQXhpb3NcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gZGVmYXVsdENvbmZpZyBUaGUgZGVmYXVsdCBjb25maWcgZm9yIHRoZSBpbnN0YW5jZVxuICpcbiAqIEByZXR1cm5zIHtBeGlvc30gQSBuZXcgaW5zdGFuY2Ugb2YgQXhpb3NcbiAqL1xuZnVuY3Rpb24gY3JlYXRlSW5zdGFuY2UoZGVmYXVsdENvbmZpZykge1xuICBjb25zdCBjb250ZXh0ID0gbmV3IEF4aW9zKGRlZmF1bHRDb25maWcpO1xuICBjb25zdCBpbnN0YW5jZSA9IGJpbmQoQXhpb3MucHJvdG90eXBlLnJlcXVlc3QsIGNvbnRleHQpO1xuXG4gIC8vIENvcHkgYXhpb3MucHJvdG90eXBlIHRvIGluc3RhbmNlXG4gIHV0aWxzLmV4dGVuZChpbnN0YW5jZSwgQXhpb3MucHJvdG90eXBlLCBjb250ZXh0LCB7YWxsT3duS2V5czogdHJ1ZX0pO1xuXG4gIC8vIENvcHkgY29udGV4dCB0byBpbnN0YW5jZVxuICB1dGlscy5leHRlbmQoaW5zdGFuY2UsIGNvbnRleHQsIG51bGwsIHthbGxPd25LZXlzOiB0cnVlfSk7XG5cbiAgLy8gRmFjdG9yeSBmb3IgY3JlYXRpbmcgbmV3IGluc3RhbmNlc1xuICBpbnN0YW5jZS5jcmVhdGUgPSBmdW5jdGlvbiBjcmVhdGUoaW5zdGFuY2VDb25maWcpIHtcbiAgICByZXR1cm4gY3JlYXRlSW5zdGFuY2UobWVyZ2VDb25maWcoZGVmYXVsdENvbmZpZywgaW5zdGFuY2VDb25maWcpKTtcbiAgfTtcblxuICByZXR1cm4gaW5zdGFuY2U7XG59XG5cbi8vIENyZWF0ZSB0aGUgZGVmYXVsdCBpbnN0YW5jZSB0byBiZSBleHBvcnRlZFxuY29uc3QgYXhpb3MgPSBjcmVhdGVJbnN0YW5jZShkZWZhdWx0cyk7XG5cbi8vIEV4cG9zZSBBeGlvcyBjbGFzcyB0byBhbGxvdyBjbGFzcyBpbmhlcml0YW5jZVxuYXhpb3MuQXhpb3MgPSBBeGlvcztcblxuLy8gRXhwb3NlIENhbmNlbCAmIENhbmNlbFRva2VuXG5heGlvcy5DYW5jZWxlZEVycm9yID0gQ2FuY2VsZWRFcnJvcjtcbmF4aW9zLkNhbmNlbFRva2VuID0gQ2FuY2VsVG9rZW47XG5heGlvcy5pc0NhbmNlbCA9IGlzQ2FuY2VsO1xuYXhpb3MuVkVSU0lPTiA9IFZFUlNJT047XG5heGlvcy50b0Zvcm1EYXRhID0gdG9Gb3JtRGF0YTtcblxuLy8gRXhwb3NlIEF4aW9zRXJyb3IgY2xhc3NcbmF4aW9zLkF4aW9zRXJyb3IgPSBBeGlvc0Vycm9yO1xuXG4vLyBhbGlhcyBmb3IgQ2FuY2VsZWRFcnJvciBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuYXhpb3MuQ2FuY2VsID0gYXhpb3MuQ2FuY2VsZWRFcnJvcjtcblxuLy8gRXhwb3NlIGFsbC9zcHJlYWRcbmF4aW9zLmFsbCA9IGZ1bmN0aW9uIGFsbChwcm9taXNlcykge1xuICByZXR1cm4gUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xufTtcblxuYXhpb3Muc3ByZWFkID0gc3ByZWFkO1xuXG4vLyBFeHBvc2UgaXNBeGlvc0Vycm9yXG5heGlvcy5pc0F4aW9zRXJyb3IgPSBpc0F4aW9zRXJyb3I7XG5cbi8vIEV4cG9zZSBtZXJnZUNvbmZpZ1xuYXhpb3MubWVyZ2VDb25maWcgPSBtZXJnZUNvbmZpZztcblxuYXhpb3MuQXhpb3NIZWFkZXJzID0gQXhpb3NIZWFkZXJzO1xuXG5heGlvcy5mb3JtVG9KU09OID0gdGhpbmcgPT4gZm9ybURhdGFUb0pTT04odXRpbHMuaXNIVE1MRm9ybSh0aGluZykgPyBuZXcgRm9ybURhdGEodGhpbmcpIDogdGhpbmcpO1xuXG5heGlvcy5nZXRBZGFwdGVyID0gYWRhcHRlcnMuZ2V0QWRhcHRlcjtcblxuYXhpb3MuSHR0cFN0YXR1c0NvZGUgPSBIdHRwU3RhdHVzQ29kZTtcblxuYXhpb3MuZGVmYXVsdCA9IGF4aW9zO1xuXG4vLyB0aGlzIG1vZHVsZSBzaG91bGQgb25seSBoYXZlIGEgZGVmYXVsdCBleHBvcnRcbmV4cG9ydCBkZWZhdWx0IGF4aW9zXG4iLCJjb25zdCBjb25maWcgPSB7XG4gIFNFUlZFUl9VUkw6ICdodHRwczovL2ltYWdlLmFkb2JlLmlvL3V0aWxzJyxcbiAgU0xBQ0tfUFJJVkFURV9LRVlfUEVNOiBgLS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tXG5NSUlFdlFJQkFEQU5CZ2txaGtpRzl3MEJBUUVGQUFTQ0JLY3dnZ1NqQWdFQUFvSUJBUUNRNmVYcURubk9xdzhlXG54NHc0UkF1YmlmZzVCdXRoR1FGZG5YN0pRc2h2cVlUaU1mTXBHa0ZOSHZXU1AxTVJBUXk3QmQrYVJFRTR5N2N6XG5TYS8zWHF3Vnc0MUtUN0kyd2llYi9lYnd1QmhOOUQ5MHpXTUdxN3cyV0tINlg3WHpzck5iVFl1U3c1eE1BcmVLXG4wK3BGVGhKL2xoaThESVZuZllDUWxJZFZpVCtkSjhnU2RWU2VaMS9nVGRPTXpWd1FlaW9CbS9SNUErWHJ0V05lXG5tU0NaZUVGOXlWOExuZytXZnd6dksvVUFJcm15Y3dLcGdYZzFtaEQ1U2EvR3Z2MzYyZDV5b3VtcnA1dW1IbTArXG45cS9GaHJmelIvK3JnVnhkZ3RDS1JiUVM4aDVXVEp1UGtsVzVCa1dtQUtlamVMdFZmQk5BbGVOTkhsVW04czVPXG5BK3NOc0hWeEFnTUJBQUVDZ2dFQUFMSVB0WUt6NXRnYk9La0phVEo1Nmdsa3Jxemo0N1dibENJRHRCWjVDUENyXG55NnhrMC9SZFhuLzAycXFwUk5oUUFlU01nd1I3ZWVqZjZHd016enVXQ0wxMVc5ZER0aWV5eWhqVEUwSVY4MGRXXG5KK0xOdkRBbU5VNVIralk4Qk1jOWZVVmpNMjFURG1vWHJJL1pkTE5VQzBiYWwrbjVPTExCYzRneitWY1JIaWxyXG5McnZlS0dJQzJieWszNUs0U3k1M2daL0VReThmYVloTENDWTFjbDB2TEVHRzRzcHNQVUVIdzBHV1R5NzNySkY1XG50NXZ3K0VPTm9yWEZPRW4wVTI5RXE2UDQ0ejg2R09DS1lSWFNFY0JBMS80YjVNN0dYL01hcVQxaURoVG0vanJSXG5mMis5N1NJZ0RZR0hEbEJrZ3Vhb3JVY0VTbzkrRTZmVk1jMnBLSlI3Z1FLQmdRREhiNXJoZXBBZjRscmtWbTZMXG42OXpseXB3ekdKbS9zOTN3dFRSTVQ5YWtVRmZpaDZxWW1TVzBVemkxOWd5UW1XeFNuT1V2c0V6cWFUY0Zod2I4XG4ydkdHTURyWkQrb2gvRGIxeDM0bUNZQWN6azM0dHFzdzZWZk9UNW5vd2NjSzQ1eC82VkpRYjVtV2R1NitMOGFZXG5XMlUxNytYdThxQjVsbVZndlZ2T1E2bWs4UUtCZ1FDNkE1dHFWd2FFTTk2WnlYN3FSQW8zcmRtbURUNUcyVGd3XG52TlRvS3MxNjE0WUZseTVLVnVlem9HVlZHUVRVZXptZjlVbVFoN2xldE1XUG1VQXRLV1M1WWZxVSszbWx1cTNWXG5EbTBSeWdGWFBuS0Q4bWtSNDhnSjFWQkF2WmhGaXllT1BpT2w5NHEvREdxNHMwUnBjSGJ2UlhENndCZE9KS1FpXG5PZGpzSHBuWWdRS0JnRVgrbEhRWVNPYjMwWUNjR1JaQWhIbWR2MjVyYnVLS0pSV3E4eHpwVkdLODArdHNRK0prXG50WWZ4UVZFVGR0dDFEVUI5VWk2SGlLY29vQ2Z2ZVBOYmdETGhVSFlJRU5zMm9xOW1BWThsL0hHZnNsdmMrSDRsXG5GeTBRWU9zQXYzUEI2SlkzOUN6SXpqV3hyaDdQczdxYk1RMWFFZS9uOVl4V3pXUERjYW9Wc3o5eEFvR0JBSjk4XG5CRDV5aXZYQ2V6S2ozaHNCWnpsQjU0QkZqb1cwTEVjdFArWW0vTEk4STM2YmxtYktpRElzYlhVKzFETlJ5NkJuXG44RURvL1hoRHliZExFQWtvbW1HUHJnY2FiYnc0aUY1SjFoNFFjb0hZMnRwaWRzK04ycThEbzZFK2JWWUM3MUUzXG4yZHlzbHRzaXpFVzcvZ1hoRlRnazg2OHFEMUZDZlMrVEpYZWM3UThCQW9HQUNjazk1YzdKaG1NL0JmTlgxdXJCXG5ackROSXFDbmxpVzlJRGpwZVRtcGVXNk55eCtRV2YxUEE1b2ZYMmZMdll6TmFuc2pvUjFNNEJFMEFYTzYxM0UxXG56WTl0eWo2STRGQVhnbHFwRS9lN2FmRG5MdWVzTzljMk9XaVJrU3JTa3h2ZTI1cTQ5c0lRendOcEFvTDNPQktkXG5xbmhlS21wZTZtOVVac1pFMkRwS0hUMD1cbi0tLS0tRU5EIFBSSVZBVEUgS0VZLS0tLS1gXG59O1xuZXhwb3J0IGRlZmF1bHQgY29uZmlnOyIsImZ1bmN0aW9uIF9leHRlbmRzKCkgeyByZXR1cm4gX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduID8gT2JqZWN0LmFzc2lnbi5iaW5kKCkgOiBmdW5jdGlvbiAobikgeyBmb3IgKHZhciBlID0gMTsgZSA8IGFyZ3VtZW50cy5sZW5ndGg7IGUrKykgeyB2YXIgdCA9IGFyZ3VtZW50c1tlXTsgZm9yICh2YXIgciBpbiB0KSAoe30pLmhhc093blByb3BlcnR5LmNhbGwodCwgcikgJiYgKG5bcl0gPSB0W3JdKTsgfSByZXR1cm4gbjsgfSwgX2V4dGVuZHMuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgfVxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5jb25zdCBTbGFja0xvZ28gPSBmdW5jdGlvbiAocHJvcHMpIHtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIF9leHRlbmRzKHtcbiAgICB4bWxuczogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLFxuICAgIHdpZHRoOiA4NSxcbiAgICBoZWlnaHQ6IDg2LFxuICAgIGZpbGw6IFwibm9uZVwiXG4gIH0sIHByb3BzKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJnXCIsIHtcbiAgICBjbGFzc05hbWU6IHByb3BzLmNsYXNzTmFtZSxcbiAgICBjbGlwUGF0aDogXCJ1cmwoI2EpXCJcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk0yNS4wNjQgNTAuOTI1YTYuMzM0IDYuMzM0IDAgMCAxLTYuMzQgNi4zNCA2LjMzNCA2LjMzNCAwIDAgMS02LjM0LTYuMzQgNi4zMzQgNi4zMzQgMCAwIDEgNi4zNC02LjM0aDYuMzR2Ni4zNFptMy4xNyAwYTYuMzM0IDYuMzM0IDAgMCAxIDYuMzQtNi4zNCA2LjMzNCA2LjMzNCAwIDAgMSA2LjM0IDYuMzR2MTUuODVhNi4zMzQgNi4zMzQgMCAwIDEtNi4zNCA2LjM0IDYuMzM0IDYuMzM0IDAgMCAxLTYuMzQtNi4zNHYtMTUuODVaTTM0LjU3NSAyNS40NjhhNi4zMzQgNi4zMzQgMCAwIDEtNi4zNC02LjM0IDYuMzM0IDYuMzM0IDAgMCAxIDYuMzQtNi4zNCA2LjMzNCA2LjMzNCAwIDAgMSA2LjM0IDYuMzR2Ni4zNGgtNi4zNFptMCAzLjIxOGE2LjMzNCA2LjMzNCAwIDAgMSA2LjM0IDYuMzQgNi4zMzQgNi4zMzQgMCAwIDEtNi4zNCA2LjM0SDE4LjY3NWE2LjMzNCA2LjMzNCAwIDAgMS02LjM0LTYuMzQgNi4zMzQgNi4zMzQgMCAwIDEgNi4zNC02LjM0aDE1Ljg5OVpNNTkuOTgzIDM1LjAyN2E2LjMzNCA2LjMzNCAwIDAgMSA2LjM0LTYuMzQgNi4zMzQgNi4zMzQgMCAwIDEgNi4zNCA2LjM0IDYuMzM0IDYuMzM0IDAgMCAxLTYuMzQgNi4zNGgtNi4zNHYtNi4zNFptLTMuMTcgMGE2LjMzNCA2LjMzNCAwIDAgMS02LjM0IDYuMzQgNi4zMzQgNi4zMzQgMCAwIDEtNi4zNC02LjM0VjE5LjEyOGE2LjMzNCA2LjMzNCAwIDAgMSA2LjM0LTYuMzQgNi4zMzQgNi4zMzQgMCAwIDEgNi4zNCA2LjM0djE1Ljg5OVpNNTAuNDczIDYwLjQzNWE2LjMzNCA2LjMzNCAwIDAgMSA2LjM0IDYuMzQgNi4zMzQgNi4zMzQgMCAwIDEtNi4zNCA2LjM0IDYuMzM0IDYuMzM0IDAgMCAxLTYuMzQtNi4zNHYtNi4zNGg2LjM0Wm0wLTMuMTdhNi4zMzQgNi4zMzQgMCAwIDEtNi4zNC02LjM0IDYuMzM0IDYuMzM0IDAgMCAxIDYuMzQtNi4zNGgxNS44OThhNi4zMzQgNi4zMzQgMCAwIDEgNi4zNCA2LjM0IDYuMzM0IDYuMzM0IDAgMCAxLTYuMzQgNi4zNEg1MC40NzNaXCJcbiAgfSkpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRlZnNcIiwgbnVsbCwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJjbGlwUGF0aFwiLCB7XG4gICAgaWQ6IFwiYVwiXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgY2xhc3NOYW1lOiBwcm9wcy5jbGFzc05hbWUsXG4gICAgZDogXCJNMTIgMTIuNWg2MXY2MUgxMnpcIlxuICB9KSkpKTtcbn07XG5leHBvcnQgZGVmYXVsdCBTbGFja0xvZ287IiwiaW1wb3J0IHsgREVCVUcgfSBmcm9tIFwiLi9jb21tb25VdGlsc1wiO1xuZXhwb3J0IGNvbnN0IGxvZyA9IGZ1bmN0aW9uICguLi5hcmdzKSB7XG4gIGlmIChERUJVRykge1xuICAgIGNvbnNvbGUubG9nKC4uLmFyZ3MpO1xuICB9XG59O1xuZXhwb3J0IGNvbnN0IGRlYnVnID0gZnVuY3Rpb24gKC4uLmFyZ3MpIHtcbiAgaWYgKERFQlVHKSB7XG4gICAgY29uc29sZS5kZWJ1ZyguLi5hcmdzKTtcbiAgfVxufTtcbmV4cG9ydCBjb25zdCB3YXJuID0gZnVuY3Rpb24gKC4uLmFyZ3MpIHtcbiAgaWYgKERFQlVHKSB7XG4gICAgY29uc29sZS53YXJuKC4uLmFyZ3MpO1xuICB9XG59O1xuZXhwb3J0IGNvbnN0IGVycm9yID0gZnVuY3Rpb24gKC4uLmFyZ3MpIHtcbiAgaWYgKERFQlVHKSB7XG4gICAgY29uc29sZS5lcnJvciguLi5hcmdzKTtcbiAgfVxufTtcbmV4cG9ydCBjb25zdCBpbmZvID0gZnVuY3Rpb24gKC4uLmFyZ3MpIHtcbiAgaWYgKERFQlVHKSB7XG4gICAgY29uc29sZS5pbmZvKC4uLmFyZ3MpO1xuICB9XG59OyIsImZ1bmN0aW9uIG93bktleXMoZSwgcikgeyB2YXIgdCA9IE9iamVjdC5rZXlzKGUpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgbyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7IHIgJiYgKG8gPSBvLmZpbHRlcihmdW5jdGlvbiAocikgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLCByKS5lbnVtZXJhYmxlOyB9KSksIHQucHVzaC5hcHBseSh0LCBvKTsgfSByZXR1cm4gdDsgfVxuZnVuY3Rpb24gX29iamVjdFNwcmVhZChlKSB7IGZvciAodmFyIHIgPSAxOyByIDwgYXJndW1lbnRzLmxlbmd0aDsgcisrKSB7IHZhciB0ID0gbnVsbCAhPSBhcmd1bWVudHNbcl0gPyBhcmd1bWVudHNbcl0gOiB7fTsgciAlIDIgPyBvd25LZXlzKE9iamVjdCh0KSwgITApLmZvckVhY2goZnVuY3Rpb24gKHIpIHsgX2RlZmluZVByb3BlcnR5KGUsIHIsIHRbcl0pOyB9KSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnModCkpIDogb3duS2V5cyhPYmplY3QodCkpLmZvckVhY2goZnVuY3Rpb24gKHIpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIHIsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCwgcikpOyB9KTsgfSByZXR1cm4gZTsgfVxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KGUsIHIsIHQpIHsgcmV0dXJuIChyID0gX3RvUHJvcGVydHlLZXkocikpIGluIGUgPyBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgciwgeyB2YWx1ZTogdCwgZW51bWVyYWJsZTogITAsIGNvbmZpZ3VyYWJsZTogITAsIHdyaXRhYmxlOiAhMCB9KSA6IGVbcl0gPSB0LCBlOyB9XG5mdW5jdGlvbiBfdG9Qcm9wZXJ0eUtleSh0KSB7IHZhciBpID0gX3RvUHJpbWl0aXZlKHQsIFwic3RyaW5nXCIpOyByZXR1cm4gXCJzeW1ib2xcIiA9PSB0eXBlb2YgaSA/IGkgOiBpICsgXCJcIjsgfVxuZnVuY3Rpb24gX3RvUHJpbWl0aXZlKHQsIHIpIHsgaWYgKFwib2JqZWN0XCIgIT0gdHlwZW9mIHQgfHwgIXQpIHJldHVybiB0OyB2YXIgZSA9IHRbU3ltYm9sLnRvUHJpbWl0aXZlXTsgaWYgKHZvaWQgMCAhPT0gZSkgeyB2YXIgaSA9IGUuY2FsbCh0LCByIHx8IFwiZGVmYXVsdFwiKTsgaWYgKFwib2JqZWN0XCIgIT0gdHlwZW9mIGkpIHJldHVybiBpOyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQEB0b1ByaW1pdGl2ZSBtdXN0IHJldHVybiBhIHByaW1pdGl2ZSB2YWx1ZS5cIik7IH0gcmV0dXJuIChcInN0cmluZ1wiID09PSByID8gU3RyaW5nIDogTnVtYmVyKSh0KTsgfVxuaW1wb3J0IGF4aW9zIGZyb20gXCJheGlvc1wiO1xuaW1wb3J0IHsgbG9nLCBlcnJvciB9IGZyb20gXCIuL2xvZ1wiO1xuaW1wb3J0IGZvcmdlIGZyb20gJ25vZGUtZm9yZ2UnO1xuZXhwb3J0IGNvbnN0IFNMQUNLX1VTRVJfREFUQSA9IFwic2xhY2tfdXNlcl9kYXRhXCI7XG5leHBvcnQgY29uc3QgU0xBQ0tfQ0hBTk5FTF9EQVRBID0gXCJzbGFja19jaGFubmVsX2RhdGFcIjtcbmV4cG9ydCBjb25zdCBTTEFDS19TQ09QRVMgPSBcInNsYWNrX3Njb3Blc1wiO1xuZXhwb3J0IGNvbnN0IFNMQUNLX0FDQ0VTU19UT0tFTiA9IFwic2xhY2tfYWNjZXNzX3Rva2VuXCI7XG5leHBvcnQgY29uc3QgU0xBQ0tfV09SS1NQQUNFX05BTUUgPSBcInNsYWNrX3dvcmtzcGFjZV9uYW1lXCI7XG5jb25zdCBjbGVhclBsdWdpbkRhdGEgPSBmdW5jdGlvbiAoKSB7XG4gIHdpbmRvdy5sb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShTTEFDS19VU0VSX0RBVEEpO1xuICB3aW5kb3cubG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oU0xBQ0tfQ0hBTk5FTF9EQVRBKTtcbiAgd2luZG93LmxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKFNMQUNLX1NDT1BFUyk7XG4gIHN0b3JhZ2Uuc2VjdXJlU3RvcmFnZS5yZW1vdmVJdGVtKFNMQUNLX0FDQ0VTU19UT0tFTik7XG59O1xuZXhwb3J0IGNvbnN0IEdldFVzZXJTY29wZSA9IGFzeW5jIGZ1bmN0aW9uICh0b2tlbikge1xuICAvLyB1c2UgYXhpb3NcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvcy5wb3N0KFwiaHR0cHM6Ly9zbGFjay5jb20vYXBpL2F1dGgudGVzdFwiLCB7fSwge1xuICAgIGhlYWRlcnM6IHtcbiAgICAgIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHt0b2tlbn1gLFxuICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCJcbiAgICB9XG4gIH0pO1xuICBpZiAoIXJlc3BvbnNlLmRhdGEub2spIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBmZXRjaCB1c2VyIHNjb3BlOiAke3Jlc3BvbnNlLmRhdGEuZXJyb3J9YCk7XG4gIH1cbiAgbGV0IHVzZXJTY29wZSA9IHJlc3BvbnNlLmRhdGEuc2NvcGU7XG4gIGxldCBzY29wZXMgPSByZXNwb25zZS5oZWFkZXJzID8gcmVzcG9uc2UuaGVhZGVycy5nZXQoXCJ4LW9hdXRoLXNjb3Blc1wiKSA6IHVuZGVmaW5lZDtcbiAgbG9nKGBVc2VyIHNjb3BlOiAke3VzZXJTY29wZX1gKTtcbiAgbG9nKGBTY29wZXM6ICR7c2NvcGVzfWApO1xuICByZXR1cm4gc2NvcGVzO1xufTtcblxuLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGZldGNoIGRhdGEgd2l0aCByZXRyeSBhbmQgcGFnaW5hdGlvblxuY29uc3QgZmV0Y2hEYXRhV2l0aFJldHJ5ID0gYXN5bmMgZnVuY3Rpb24gKGFjY2Vzc190b2tlbiwgdXJsLCBwYXJhbXMsIG1heFJldHJpZXMsIHJldHJ5RGVsYXksIHVwZGF0ZUNiKSB7XG4gIGxldCBkYXRhTGlzdCA9IFtdO1xuICBsZXQgY3Vyc29yID0gXCJcIjtcbiAgbGV0IGF0dGVtcHQgPSAwO1xuICB3aGlsZSAodHJ1ZSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zLmdldCh1cmwsIHtcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHthY2Nlc3NfdG9rZW59YFxuICAgICAgICB9LFxuICAgICAgICBwYXJhbXM6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgcGFyYW1zKSwge30sIHtcbiAgICAgICAgICBjdXJzb3JcbiAgICAgICAgfSlcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZGF0YSA9IHJlc3BvbnNlLmRhdGE7XG4gICAgICBpZiAoIWRhdGEub2spIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gZmV0Y2ggZGF0YTogJHtkYXRhLmVycm9yfWApO1xuICAgICAgfVxuICAgICAgYXR0ZW1wdCA9IDA7XG4gICAgICBjb25zdCBuZXdEYXRhID0gZGF0YS5tZW1iZXJzIHx8IGRhdGEuY2hhbm5lbHM7XG4gICAgICBkYXRhTGlzdCA9IGRhdGFMaXN0LmNvbmNhdChuZXdEYXRhKTtcblxuICAgICAgLy8gVXBkYXRlIHN0YXRlIGluY3JlbWVudGFsbHlcbiAgICAgIHVwZGF0ZUNiKGRhdGFMaXN0KTtcbiAgICAgIGlmIChkYXRhLnJlc3BvbnNlX21ldGFkYXRhICYmIGRhdGEucmVzcG9uc2VfbWV0YWRhdGEubmV4dF9jdXJzb3IpIHtcbiAgICAgICAgY3Vyc29yID0gZGF0YS5yZXNwb25zZV9tZXRhZGF0YS5uZXh0X2N1cnNvcjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgaWYgKGVyci5yZXNwb25zZSAmJiBlcnIucmVzcG9uc2Uuc3RhdHVzID09PSA0MjkpIHtcbiAgICAgICAgLy8gUmF0ZSBsaW1pdCBlcnJvclxuICAgICAgICBjb25zdCByZXRyeUFmdGVyID0gZXJyLnJlc3BvbnNlLmhlYWRlcnNbXCJyZXRyeS1hZnRlclwiXSB8fCByZXRyeURlbGF5IC8gMTAwMDsgLy8gVXNlIHJldHJ5LWFmdGVyIGhlYWRlciBpZiBhdmFpbGFibGVcbiAgICAgICAgZXJyb3IoYFJhdGUgbGltaXRlZC4gUmV0cnlpbmcgYWZ0ZXIgJHtyZXRyeUFmdGVyfSBzZWNvbmRzLi4uYCk7XG4gICAgICAgIGlmIChhdHRlbXB0IDwgbWF4UmV0cmllcykge1xuICAgICAgICAgIGF0dGVtcHQrKztcbiAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQocmVzb2x2ZSwgcmV0cnlBZnRlciAqIDEwMDApO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk1heCByZXRyaWVzIGV4Y2VlZGVkLlwiKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gT3RoZXIgZXJyb3JzXG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRhdGFMaXN0O1xufTtcblxuLy8gRmV0Y2ggdXNlcnMgd2l0aCByZXRyeSBsb2dpY1xuZXhwb3J0IGNvbnN0IEZldGNoVXNlcnMgPSBhc3luYyBmdW5jdGlvbiAoYWNjZXNzX3Rva2VuLCBzZXR0ZXJDYiwgbWF4UmV0cmllcyA9IDMsIHJldHJ5RGVsYXkgPSA2MDAwMCkge1xuICBjb25zdCBwYXJhbXMgPSB7XG4gICAgbGltaXQ6IDk5OTk5OVxuICB9O1xuICBjb25zdCB1c2VycyA9IGF3YWl0IGZldGNoRGF0YVdpdGhSZXRyeShhY2Nlc3NfdG9rZW4sIFwiaHR0cHM6Ly9zbGFjay5jb20vYXBpL3VzZXJzLmxpc3RcIiwgcGFyYW1zLCBtYXhSZXRyaWVzLCByZXRyeURlbGF5LCBzZXR0ZXJDYik7XG4gIHJldHVybiB1c2Vycztcbn07XG5leHBvcnQgY29uc3QgRmV0Y2hXb3Jrc3BhY2VOYW1lID0gYXN5bmMgZnVuY3Rpb24gKHRva2VuKSB7XG4gIHRyeSB7XG4gICAgbGV0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3MuZ2V0KFwiaHR0cHM6Ly9zbGFjay5jb20vYXBpL3RlYW0uaW5mb1wiLCB7XG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHt0b2tlbn1gLFxuICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIlxuICAgICAgfVxuICAgIH0pO1xuICAgIGlmIChyZXNwb25zZS5kYXRhLm9rKSB7XG4gICAgICBjb25zdCB3b3Jrc3BhY2VOYW1lID0gcmVzcG9uc2UuZGF0YS50ZWFtLm5hbWU7XG4gICAgICBsb2coYFdvcmtzcGFjZSBuYW1lOiAke3dvcmtzcGFjZU5hbWV9YCk7XG4gICAgICByZXR1cm4gd29ya3NwYWNlTmFtZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gZmV0Y2ggd29ya3NwYWNlIG5hbWU6ICR7cmVzcG9uc2UuZGF0YS5lcnJvcn1gKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGVycm9yKFwiRXJyb3Igc2VuZGluZyBtZXNzYWdlOlwiLCBlcnIpO1xuICB9XG59O1xuXG4vLyBGZXRjaCBjaGFubmVscyB3aXRoIHJldHJ5IGxvZ2ljXG5leHBvcnQgY29uc3QgRmV0Y2hDaGFubmVscyA9IGFzeW5jIGZ1bmN0aW9uIChhY2Nlc3NfdG9rZW4sIHNldHRlckNiLCBtYXhSZXRyaWVzID0gMywgcmV0cnlEZWxheSA9IDYwMDAwKSB7XG4gIGNvbnN0IHBhcmFtcyA9IHtcbiAgICBsaW1pdDogOTk5OTk5LFxuICAgIHR5cGVzOiBcInByaXZhdGVfY2hhbm5lbCxwdWJsaWNfY2hhbm5lbFwiLFxuICAgIGV4Y2x1ZGVfYXJjaGl2ZWQ6IHRydWVcbiAgfTtcbiAgY29uc3QgY2hhbm5lbHMgPSBhd2FpdCBmZXRjaERhdGFXaXRoUmV0cnkoYWNjZXNzX3Rva2VuLCBcImh0dHBzOi8vc2xhY2suY29tL2FwaS9jb252ZXJzYXRpb25zLmxpc3RcIiwgcGFyYW1zLCBtYXhSZXRyaWVzLCByZXRyeURlbGF5LCBzZXR0ZXJDYik7XG4gIHJldHVybiBjaGFubmVscztcbn07XG5leHBvcnQgY29uc3QgU2VuZE1lc3NhZ2VUb1VzZXIgPSBhc3luYyBmdW5jdGlvbiAodG9rZW4sIHVzZXJJZCwgbWVzc2FnZSkge1xuICB0cnkge1xuICAgIGF3YWl0IGF4aW9zLnBvc3QoXCJodHRwczovL3NsYWNrLmNvbS9hcGkvY2hhdC5wb3N0TWVzc2FnZVwiLCB7XG4gICAgICBjaGFubmVsOiB1c2VySWQsXG4gICAgICB0ZXh0OiBtZXNzYWdlXG4gICAgfSwge1xuICAgICAgaGVhZGVyczoge1xuICAgICAgICBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7dG9rZW59YCxcbiAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCJcbiAgICAgIH1cbiAgICB9KTtcbiAgICBsb2coYE1lc3NhZ2Ugc2VudCB0byB1c2VyICR7dXNlcklkfWApO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBlcnJvcihcIkVycm9yIHNlbmRpbmcgbWVzc2FnZTpcIiwgZXJyKTtcbiAgfVxufTtcbmV4cG9ydCBjb25zdCBHZXRDb252ZXJzYXRpb25Gb3JVc2VycyA9IGFzeW5jIGZ1bmN0aW9uICh0b2tlbiwgaWRMaXN0KSB7XG4gIGxldCBjb252ZXJzYXRpb25JZDtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zLnBvc3QoXCJodHRwczovL3NsYWNrLmNvbS9hcGkvY29udmVyc2F0aW9ucy5vcGVuXCIsIHtcbiAgICAgIHVzZXJzOiBpZExpc3RcbiAgICB9LCB7XG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHt0b2tlbn1gLFxuICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIlxuICAgICAgfVxuICAgIH0pO1xuICAgIGlmICghcmVzcG9uc2UuZGF0YS5vaykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gb3BlbiBjb252ZXJzYXRpb246ICR7cmVzcG9uc2UuZGF0YS5lcnJvcn1gKTtcbiAgICB9XG4gICAgY29udmVyc2F0aW9uSWQgPSByZXNwb25zZS5kYXRhLmNoYW5uZWwuaWQ7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGVycm9yKFwiRXJyb3Igb3BlbmluZyBjb252ZXJzYXRpb246XCIsIGVycik7XG4gIH1cbiAgcmV0dXJuIGNvbnZlcnNhdGlvbklkO1xufTtcbmV4cG9ydCBjb25zdCBkZWNyeXB0RGF0YSA9IGFzeW5jIGZ1bmN0aW9uIChlbmNyeXB0ZWRCYXNlNjQsIHByaXZhdGVLZXkpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBlbmNyeXB0ZWRCeXRlcyA9IGZvcmdlLnV0aWwuZGVjb2RlNjQoZW5jcnlwdGVkQmFzZTY0KTtcbiAgICBjb25zdCBkZWNyeXB0ZWQgPSBwcml2YXRlS2V5LmRlY3J5cHQoZW5jcnlwdGVkQnl0ZXMsICdSU0EtT0FFUCcsIHtcbiAgICAgIG1kOiBmb3JnZS5tZC5zaGEyNTYuY3JlYXRlKCksXG4gICAgICBtZ2YxOiB7XG4gICAgICAgIG1kOiBmb3JnZS5tZC5zaGEyNTYuY3JlYXRlKClcbiAgICAgIH1cbiAgICB9KTtcbiAgICBsb2coJ0RhdGEgZGVjcnlwdGVkIHN1Y2Nlc3NmdWxseScpO1xuICAgIHJldHVybiBkZWNyeXB0ZWQ7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGVycm9yKCdFcnJvciBkZWNyeXB0aW5nIGRhdGE6JywgZXJyKTtcbiAgICB0aHJvdyBlcnI7XG4gIH1cbn07IiwiaW1wb3J0IFJlYWN0LCB7IHVzZVN0YXRlLCB1c2VFZmZlY3QsIHVzZVJlZiB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IGF4aW9zIGZyb20gXCJheGlvc1wiO1xuaW1wb3J0IGNvbmZpZyBmcm9tIFwiLi4vY29uZmlnXCI7XG5pbXBvcnQgeyBzdG9yYWdlLCBzaGVsbCB9IGZyb20gXCJ1eHBcIjtcbmltcG9ydCBTbGFja0xvZ28gZnJvbSBcIi4vaWNvbnMvU2xhY2tMb2dvXCI7XG5pbXBvcnQgc3R5bGVkIGZyb20gXCJzdHlsZWQtY29tcG9uZW50c1wiO1xuaW1wb3J0IHsgbG9nLCBlcnJvciB9IGZyb20gXCIuLi91dGlscy9sb2dcIjtcbmltcG9ydCBXYWl0IGZyb20gXCJAdG9ycS1uYXRpdmUvcmVhY3Qtc3BlY3RydW0vV2FpdFwiO1xuaW1wb3J0IHsgU0xBQ0tfQUNDRVNTX1RPS0VOLCBTTEFDS19XT1JLU1BBQ0VfTkFNRSwgZGVjcnlwdERhdGEgfSBmcm9tIFwiLi4vdXRpbHMvc2xhY2tVdGlsc1wiO1xuaW1wb3J0IHsgZ2V0TG9jYWxlLCBsb2NhbGl6ZSB9IGZyb20gJy4uL3V0aWxzL25scy5qcyc7XG5pbXBvcnQgeyBsb2dUb0luZ2VzdCB9IGZyb20gXCIuLi9ob3N0L3Bob3Rvc2hvcFwiO1xuaW1wb3J0IGZvcmdlIGZyb20gJ25vZGUtZm9yZ2UnO1xuXG4vLy8vLy8vIFN0eWxlZCBDb21wb25lbnRzIC8vLy8vLy9cbmNvbnN0IHNoYXJlUGFuZWxJbmdlc3QgPSByZXF1aXJlKFwiLi4vaW5nZXN0L3NoYXJlUGFuZWxJbmdlc3QuanNvblwiKTtcbmNvbnN0IENlbnRlcmVkRmxleENvbnRhaW5lciA9IHN0eWxlZC5kaXZgXG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICBoZWlnaHQ6IDEwMCU7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIHBhZGRpbmc6IDEwcHg7XG5gO1xuY29uc3QgQ29sdW1uRmxleENvbnRhaW5lciA9IHN0eWxlZC5kaXZgXG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICBoZWlnaHQ6IDEwMCU7XG4gIHBhZGRpbmc6IDYwcHg7XG5gO1xuY29uc3QgQnV0dG9uQ29udGFpbmVyID0gc3R5bGVkLmRpdmBcbiAgZGlzcGxheTogZmxleDtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7IC8qIENlbnRlcnMgY2hpbGRyZW4gaG9yaXpvbnRhbGx5ICovXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7IC8qIENlbnRlcnMgY2hpbGRyZW4gdmVydGljYWxseSAqL1xuICBwYWRkaW5nOiAxNXB4OyAvKiBBZGRzIHBhZGRpbmcgYXJvdW5kIHRoZSBjb250YWluZXIgKi9cbmA7XG5cbi8vLy8vLy8gU3R5bGVkIENvbXBvbmVudHMgLy8vLy8vL1xuXG5jb25zdCBQT0xMSU5HX0lOVEVSVkFMX01TID0gNTAwMDsgLy8gNSBzZWNvbmRzXG5jb25zdCBBVVRIX1RJTUVPVVRfTVMgPSAzMDAwMDA7IC8vIDUgbWludXRlc1xuXG5jb25zdCBwcml2YXRlS2V5ID0gZm9yZ2UucGtpLnByaXZhdGVLZXlGcm9tUGVtKGNvbmZpZy5TTEFDS19QUklWQVRFX0tFWV9QRU0pO1xuZXhwb3J0IGNvbnN0IEF1dGhWaWV3ID0gZnVuY3Rpb24gKHByb3BzKSB7XG4gIGNvbnN0IFtpc0F1dGhlbnRpY2F0aW5nLCBzZXRJc0F1dGhlbnRpY2F0aW5nXSA9IHVzZVN0YXRlKGZhbHNlKTtcbiAgY29uc3QgW3Nlc3Npb25JZCwgc2V0U2Vzc2lvbklkXSA9IHVzZVN0YXRlKG51bGwpO1xuICBjb25zdCBzdGFydFRpbWVSZWYgPSB1c2VSZWYobnVsbCk7XG4gIGNvbnN0IHRpbWVvdXRSZWYgPSB1c2VSZWYobnVsbCk7XG5cbiAgLy8gRnVuY3Rpb24gdG8gY2hlY2sgdGhlIGF1dGhlbnRpY2F0aW9uIHN0YXR1cyBieSBwb2xsaW5nIHRoZSBzZXJ2ZXJcbiAgY29uc3QgY2hlY2tBdXRoU3RhdHVzID0gYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGlmIChzZXNzaW9uSWQpIHtcbiAgICAgIC8vIEluaXRpYWxpemUgc3RhcnQgdGltZSBpZiBub3Qgc2V0XG4gICAgICBpZiAoIXN0YXJ0VGltZVJlZi5jdXJyZW50KSB7XG4gICAgICAgIHN0YXJ0VGltZVJlZi5jdXJyZW50ID0gRGF0ZS5ub3coKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgaWYgdGltZW91dCBoYXMgZWxhcHNlZFxuICAgICAgaWYgKERhdGUubm93KCkgLSBzdGFydFRpbWVSZWYuY3VycmVudCA+IEFVVEhfVElNRU9VVF9NUykge1xuICAgICAgICBoYW5kbGVBdXRoQ2FuY2VsKGZhbHNlKTtcbiAgICAgICAgbG9nVG9Jbmdlc3Qoc2hhcmVQYW5lbEluZ2VzdFtcInNsYWNrX3BhbmVsXCJdLCBcInNpZ25JbkVycm9yXCIpO1xuICAgICAgICBwcm9wcy5zaG93VG9hc3QoXCJ3YXJuaW5nXCIsIGxvY2FsaXplKCdUT0FTVF9TSUdOSU5fRVJST1InKSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICh0aW1lb3V0UmVmLmN1cnJlbnQpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRSZWYuY3VycmVudCk7XG4gICAgICAgIHRpbWVvdXRSZWYuY3VycmVudCA9IG51bGw7XG4gICAgICB9XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zLnBvc3QoYCR7Y29uZmlnLlNFUlZFUl9VUkx9L3NsYWNrL2F1dGgvc3RhdHVzYCwge1xuICAgICAgICAgIHNlc3Npb25JZFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIHN0YXR1cyxcbiAgICAgICAgICBkYXRhXG4gICAgICAgIH0gPSByZXNwb25zZS5kYXRhO1xuICAgICAgICBpZiAoc3RhdHVzID09PSAnc3VjY2VzcycpIHtcbiAgICAgICAgICBjb25zdCBhY2Nlc3NUb2tlbiA9IGF3YWl0IGRlY3J5cHREYXRhKGRhdGEudXNlckFjY2Vzc1Rva2VuLCBwcml2YXRlS2V5KTtcbiAgICAgICAgICBjb25zdCB3b3Jrc3BhY2VOYW1lID0gZGF0YS53b3Jrc3BhY2VOYW1lO1xuICAgICAgICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbShTTEFDS19XT1JLU1BBQ0VfTkFNRSwgd29ya3NwYWNlTmFtZSk7XG4gICAgICAgICAgYXdhaXQgc3RvcmFnZS5zZWN1cmVTdG9yYWdlLnNldEl0ZW0oU0xBQ0tfQUNDRVNTX1RPS0VOLCBhY2Nlc3NUb2tlbik7XG4gICAgICAgICAgbG9nVG9Jbmdlc3Qoc2hhcmVQYW5lbEluZ2VzdFtcInNsYWNrX3BhbmVsXCJdLCBcInNpZ25JblN1Y2Nlc3NcIik7XG4gICAgICAgICAgc2V0SXNBdXRoZW50aWNhdGluZyhmYWxzZSk7XG4gICAgICAgICAgcHJvcHMuc2V0QXV0aENvbXBsZXRlZCh0cnVlKTtcbiAgICAgICAgICBsb2coXCJhdXRoU3VjY2VzcyBcIiArIGFjY2Vzc1Rva2VuKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09ICdjYW5jZWxsZWQnKSB7XG4gICAgICAgICAgLy8gQXV0aGVudGljYXRpb24gd2FzIGNhbmNlbGxlZFxuICAgICAgICAgIHNldElzQXV0aGVudGljYXRpbmcoZmFsc2UpO1xuICAgICAgICAgIGxvZ1RvSW5nZXN0KHNoYXJlUGFuZWxJbmdlc3RbXCJzbGFja19wYW5lbFwiXSwgXCJzaWduSW5FcnJvclwiKTtcbiAgICAgICAgICBwcm9wcy5zaG93VG9hc3QoXCJ3YXJuaW5nXCIsIGxvY2FsaXplKCdUT0FTVF9TSUdOSU5fRVJST1InKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gS2VlcCBwb2xsaW5nIGlmIHN0YXR1cyBpcyBzdGlsbCBwZW5kaW5nXG4gICAgICAgICAgdGltZW91dFJlZi5jdXJyZW50ID0gc2V0VGltZW91dChjaGVja0F1dGhTdGF0dXMsIFBPTExJTkdfSU5URVJWQUxfTVMpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgc2V0SXNBdXRoZW50aWNhdGluZyhmYWxzZSk7XG4gICAgICAgIGxvZ1RvSW5nZXN0KHNoYXJlUGFuZWxJbmdlc3RbXCJzbGFja19wYW5lbFwiXSwgXCJzaWduSW5FcnJvclwiKTtcbiAgICAgICAgZXJyb3IoXCJFcnJvciBjaGVja2luZyBhdXRoZW50aWNhdGlvbiBzdGF0dXNcIiwgZXJyKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHNlc3Npb25JZCkge1xuICAgICAgY2hlY2tBdXRoU3RhdHVzKCk7XG4gICAgfVxuICB9LCBbc2Vzc2lvbklkXSk7XG5cbiAgLy8gRnVuY3Rpb24gdG8gY3JlYXRlIGEgbmV3IHNlc3Npb24gYW5kIHN0YXJ0IGF1dGhlbnRpY2F0aW9uXG4gIGNvbnN0IGhhbmRsZUF1dGhlbnRpY2F0ZSA9IGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBsb2coXCJBdXRoZW50aWNhdGlvbiBiZWdpbnNcIik7XG4gICAgbG9nVG9Jbmdlc3Qoc2hhcmVQYW5lbEluZ2VzdFtcInNsYWNrX3BhbmVsXCJdLCBcInNpZ25JblwiKTtcbiAgICBzZXRJc0F1dGhlbnRpY2F0aW5nKHRydWUpO1xuICAgIHN0YXJ0VGltZVJlZi5jdXJyZW50ID0gbnVsbDtcbiAgICB0cnkge1xuICAgICAgdmFyIF9yZXNwb25zZSRkYXRhO1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvcy5wb3N0KGAke2NvbmZpZy5TRVJWRVJfVVJMfS9zbGFjay9hdXRoL3Nlc3Npb25gLCB7XG4gICAgICAgIHVzZXJTY29wZTogcHJvcHMuc2NvcGVcbiAgICAgIH0pO1xuICAgICAgaWYgKHJlc3BvbnNlICE9PSBudWxsICYmIHJlc3BvbnNlICE9PSB2b2lkIDAgJiYgKF9yZXNwb25zZSRkYXRhID0gcmVzcG9uc2UuZGF0YSkgIT09IG51bGwgJiYgX3Jlc3BvbnNlJGRhdGEgIT09IHZvaWQgMCAmJiBfcmVzcG9uc2UkZGF0YS5zZXNzaW9uSWQpIHtcbiAgICAgICAgc2V0U2Vzc2lvbklkKHJlc3BvbnNlLmRhdGEuc2Vzc2lvbklkKTtcbiAgICAgICAgY29uc3QgcmVkaXJlY3RVcmwgPSBgJHtjb25maWcuU0VSVkVSX1VSTH0vc2xhY2svYXV0aC9zdGFydD9zZXNzaW9uSWQ9JHtyZXNwb25zZS5kYXRhLnNlc3Npb25JZH0mbG9jYWxlPSR7Z2V0TG9jYWxlKCl9YDtcbiAgICAgICAgc2hlbGwub3BlbkV4dGVybmFsKHJlZGlyZWN0VXJsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlNlc3Npb24gSUQgY3JlYXRpb24gZmFpbGVkXCIpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgc2V0SXNBdXRoZW50aWNhdGluZyhmYWxzZSk7XG4gICAgICBsb2dUb0luZ2VzdChzaGFyZVBhbmVsSW5nZXN0W1wic2xhY2tfcGFuZWxcIl0sIFwic2lnbkluRXJyb3JcIik7XG4gICAgICBlcnJvcihcIkZhaWxlZCB0byBjcmVhdGUgc2Vzc2lvblwiLCBlcnIpO1xuICAgIH1cbiAgfTtcbiAgY29uc3QgaGFuZGxlQXV0aENhbmNlbCA9IGFzeW5jIGZ1bmN0aW9uICh1c2VySW5pdGlhdGVkKSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh1c2VySW5pdGlhdGVkKSB7XG4gICAgICAgIGxvZ1RvSW5nZXN0KHNoYXJlUGFuZWxJbmdlc3RbXCJzbGFja19wYW5lbFwiXSwgXCJzaWduSW5DYW5jZWxcIik7XG4gICAgICB9XG4gICAgICAvLyBDbGVhciB0aGUgcG9sbGluZyB0aW1lb3V0XG4gICAgICBpZiAodGltZW91dFJlZi5jdXJyZW50KSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0UmVmLmN1cnJlbnQpO1xuICAgICAgICB0aW1lb3V0UmVmLmN1cnJlbnQgPSBudWxsO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvcy5wb3N0KGAke2NvbmZpZy5TRVJWRVJfVVJMfS9zbGFjay9hdXRoL2NhbmNlbGAsIHtcbiAgICAgICAgc2Vzc2lvbklkXG4gICAgICB9KTtcbiAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgIT09IDIwMCkge1xuICAgICAgICBlcnJvcihcIkZhaWxlZCB0byBjYW5jZWwgYXV0aGVudGljYXRpb24gb24gc2VydmVyXCIpO1xuICAgICAgfVxuICAgICAgc2V0SXNBdXRoZW50aWNhdGluZyhmYWxzZSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBlcnJvcihcIkVycm9yIGNhbmNlbGluZyBhdXRoZW50aWNhdGlvblwiLCBlcnIpO1xuICAgICAgc2V0SXNBdXRoZW50aWNhdGluZyhmYWxzZSk7XG4gICAgfVxuICB9O1xuICByZXR1cm4gaXNBdXRoZW50aWNhdGluZyA/IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENlbnRlcmVkRmxleENvbnRhaW5lciwgbnVsbCwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoV2FpdCwge1xuICAgIGVuYWJsZTogaXNBdXRoZW50aWNhdGluZyxcbiAgICBzaXplOiBcIkxcIlxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcC1ib2R5XCIsIHtcbiAgICBzaXplOiBcIm1cIixcbiAgICBzdHlsZToge1xuICAgICAgbWFyZ2luOiBcIjEwcHhcIixcbiAgICAgIG1hcmdpblRvcDogXCIyMHB4XCJcbiAgICB9XG4gIH0sIGxvY2FsaXplKCdTSUdOSU5fTE9BRElORycpKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcC1idXR0b25cIiwge1xuICAgIHZhcmlhbnQ6IFwic2Vjb25kYXJ5XCIsXG4gICAgb25DbGljazogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGhhbmRsZUF1dGhDYW5jZWwodHJ1ZSk7XG4gICAgfVxuICB9LCBsb2NhbGl6ZSgnQ0FOQ0VMJykpKSA6IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENvbHVtbkZsZXhDb250YWluZXIsIG51bGwsIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFNsYWNrTG9nbywge1xuICAgIGNsYXNzTmFtZTogXCJpY29uLXN0eWxlXCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3AtaGVhZGluZ1wiLCB7XG4gICAgc3R5bGU6IHtcbiAgICAgIHRleHRBbGlnbjogXCJjZW50ZXJcIlxuICAgIH1cbiAgfSwgbG9jYWxpemUoJ1NJR05JTl9IRUFESU5HJykpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwLWxhYmVsXCIsIHtcbiAgICBzdHlsZToge1xuICAgICAgd2hpdGVTcGFjZTogXCJub3JtYWxcIixcbiAgICAgIHBhZGRpbmc6IFwiNXB4XCIsXG4gICAgICB0ZXh0QWxpZ246IFwiY2VudGVyXCJcbiAgICB9XG4gIH0sIGxvY2FsaXplKCdTSUdOSU5fREVTQ1JJUFRJT04nKSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEJ1dHRvbkNvbnRhaW5lciwgbnVsbCwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcC1idXR0b25cIiwge1xuICAgIHZhcmlhbnQ6IFwiY3RhXCIsXG4gICAgb25DbGljazogaGFuZGxlQXV0aGVudGljYXRlXG4gIH0sIGxvY2FsaXplKCdTSUdOSU4nKSkpKTtcbn07IiwiZnVuY3Rpb24gX2V4dGVuZHMoKSB7IHJldHVybiBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gPyBPYmplY3QuYXNzaWduLmJpbmQoKSA6IGZ1bmN0aW9uIChuKSB7IGZvciAodmFyIGUgPSAxOyBlIDwgYXJndW1lbnRzLmxlbmd0aDsgZSsrKSB7IHZhciB0ID0gYXJndW1lbnRzW2VdOyBmb3IgKHZhciByIGluIHQpICh7fSkuaGFzT3duUHJvcGVydHkuY2FsbCh0LCByKSAmJiAobltyXSA9IHRbcl0pOyB9IHJldHVybiBuOyB9LCBfZXh0ZW5kcy5hcHBseShudWxsLCBhcmd1bWVudHMpOyB9XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmNvbnN0IFVzZXIgPSBmdW5jdGlvbiAocHJvcHMpIHtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIF9leHRlbmRzKHtcbiAgICB4bWxuczogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLFxuICAgIHdpZHRoOiAxOCxcbiAgICBoZWlnaHQ6IDE4XG4gIH0sIHByb3BzKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJ0aXRsZVwiLCBudWxsLCBcIlMgVXNlciAxOCBOXCIpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTE2LjQ3NCAxN2EuNDk2LjQ5NiAwIDAgMCAuNTAxLS40OTJ2LS4wMzRjLS4zMzEtMy41OTItNC4wMTQtNC44MTYtNS4xNC00LjkxNC0uODIyLS4wNzItLjgzNS0uNzM0LS44MzUtMS41NmE3LjUxNSA3LjUxNSAwIDAgMCAxLjc2Ni00LjQ3OUMxMi43NjYgMi44MDkgMTEuMjIzIDEgOSAxUzUuMjM0IDIuODA4IDUuMjM0IDUuNTIxQTcuNTE1IDcuNTE1IDAgMCAwIDcgMTBjMCAuODI2LS4wMTMgMS40ODgtLjgzNyAxLjU2LTEuMTI1LjEtNC44MDkgMS4zMjEtNS4xMzkgNC45MTNBLjQ5Ni40OTYgMCAwIDAgMS40OSAxN2wuMDM0LjAwMVpcIixcbiAgICBjbGFzc05hbWU6IHByb3BzLmNsYXNzTmFtZVxuICB9KSk7XG59O1xuZXhwb3J0IGRlZmF1bHQgVXNlcjsiLCJmdW5jdGlvbiBfZXh0ZW5kcygpIHsgcmV0dXJuIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiA/IE9iamVjdC5hc3NpZ24uYmluZCgpIDogZnVuY3Rpb24gKG4pIHsgZm9yICh2YXIgZSA9IDE7IGUgPCBhcmd1bWVudHMubGVuZ3RoOyBlKyspIHsgdmFyIHQgPSBhcmd1bWVudHNbZV07IGZvciAodmFyIHIgaW4gdCkgKHt9KS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIHIpICYmIChuW3JdID0gdFtyXSk7IH0gcmV0dXJuIG47IH0sIF9leHRlbmRzLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7IH1cbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuY29uc3QgQ2hhbm5lbFB1YmxpYyA9IGZ1bmN0aW9uIChwcm9wcykge1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdmdcIiwgX2V4dGVuZHMoe1xuICAgIHhtbG5zOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsXG4gICAgd2lkdGg6IDEyLFxuICAgIGhlaWdodDogMTUsXG4gICAgZmlsbDogXCJub25lXCJcbiAgfSwgcHJvcHMpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGNsYXNzTmFtZTogcHJvcHMuY2xhc3NOYW1lLFxuICAgIGQ6IFwiTTIuMDg5IDE0LjljLS4xMiAwLS4xNjItLjA2LS4xMjctLjE3OEwyLjggMTFIMS4wNDRjLS4xIDAtLjE1My0uMDU5LS4xNTMtLjE3OVY5LjExM2MwLS4wODUuMDUtLjEyNy4xNTMtLjEyN2gyLjE2OGwuNTYtMi41MjRIMi4xNGEuMTEyLjExMiAwIDAgMS0uMTI3LS4xMjdWNC42MjdBLjExMi4xMTIgMCAwIDEgMi4xNCA0LjVoMi4wOWwuNzQtMy4zOTJhLjE0Mi4xNDIgMCAwIDEgLjE1NC0uMTI3aDEuNDU0Yy4wODUgMCAuMTE4LjA1MS4xLjE1M0w1LjkzOCA0LjVoMi4wMTVsLjc0LTMuNDE3YS4xMjEuMTIxIDAgMCAxIC4xMjctLjFoMS40NTRjLjEgMCAuMTQ0LjA1MS4xMjcuMTUzbC0uNzY1IDMuMzY2SDExLjRjLjEwMiAwIC4xNTMuMDQyLjE1My4xMjd2MS43MDhhLjExMi4xMTIgMCAwIDEtLjEyNy4xMjdIOS4yMjlsLS41MzUgMi41MjRoMS41NTVjLjEwMiAwIC4xNTMuMDQyLjE1My4xMjd2MS43NmMwIC4wODUtLjA1MS4xMjctLjE1My4xMjdIOC4yODZsLS44NDIgMy43NDljLS4wMzQuMS0uMDg1LjE1My0uMTUzLjE1M0g1Ljg2M2MtLjEzNiAwLS4xNzgtLjA1MS0uMTI3LS4xNTNsLjgxNi0zLjc0OUg0LjUzN2wtLjg2NyAzLjc3NGMtLjAzNS4wODUtLjA4Ni4xMjctLjE1My4xMjdMMi4wODkgMTQuOVptMi44NTYtNS45MTZINi45NmwuNTYtMi41MjRINS40OGwtLjUzNSAyLjUyNFpcIlxuICB9KSk7XG59O1xuZXhwb3J0IGRlZmF1bHQgQ2hhbm5lbFB1YmxpYzsiLCJmdW5jdGlvbiBfZXh0ZW5kcygpIHsgcmV0dXJuIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiA/IE9iamVjdC5hc3NpZ24uYmluZCgpIDogZnVuY3Rpb24gKG4pIHsgZm9yICh2YXIgZSA9IDE7IGUgPCBhcmd1bWVudHMubGVuZ3RoOyBlKyspIHsgdmFyIHQgPSBhcmd1bWVudHNbZV07IGZvciAodmFyIHIgaW4gdCkgKHt9KS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIHIpICYmIChuW3JdID0gdFtyXSk7IH0gcmV0dXJuIG47IH0sIF9leHRlbmRzLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7IH1cbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuY29uc3QgQ2hhbm5lbFByaXZhdGUgPSBmdW5jdGlvbiAocHJvcHMpIHtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIF9leHRlbmRzKHtcbiAgICB4bWxuczogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLFxuICAgIHdpZHRoOiAxOCxcbiAgICBoZWlnaHQ6IDE4XG4gIH0sIHByb3BzKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJ0aXRsZVwiLCBudWxsLCBcIlMgTG9ja0Nsb3NlZCAxOCBOXCIpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTE0LjUgOEgxNFY3QTUgNSAwIDAgMCA0IDd2MWgtLjVhLjUuNSAwIDAgMC0uNS41djhhLjUuNSAwIDAgMCAuNS41aDExYS41LjUgMCAwIDAgLjUtLjV2LThhLjUuNSAwIDAgMC0uNS0uNVpNNiA3YTMgMyAwIDAgMSA2IDB2MUg2Wm00IDYuMTExVjE0LjVhLjUuNSAwIDAgMS0uNS41aC0xYS41LjUgMCAwIDEtLjUtLjV2LTEuMzg5YTEuNSAxLjUgMCAxIDEgMiAwWlwiLFxuICAgIGNsYXNzTmFtZTogcHJvcHMuY2xhc3NOYW1lXG4gIH0pKTtcbn07XG5leHBvcnQgZGVmYXVsdCBDaGFubmVsUHJpdmF0ZTsiLCJmdW5jdGlvbiBfZXh0ZW5kcygpIHsgcmV0dXJuIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiA/IE9iamVjdC5hc3NpZ24uYmluZCgpIDogZnVuY3Rpb24gKG4pIHsgZm9yICh2YXIgZSA9IDE7IGUgPCBhcmd1bWVudHMubGVuZ3RoOyBlKyspIHsgdmFyIHQgPSBhcmd1bWVudHNbZV07IGZvciAodmFyIHIgaW4gdCkgKHt9KS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIHIpICYmIChuW3JdID0gdFtyXSk7IH0gcmV0dXJuIG47IH0sIF9leHRlbmRzLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7IH1cbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuY29uc3QgQ3Jvc3MgPSBmdW5jdGlvbiAocHJvcHMpIHtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIF9leHRlbmRzKHtcbiAgICB4bWxuczogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLFxuICAgIHdpZHRoOiBcIjEwXCIsXG4gICAgaGVpZ2h0OiBcIjEwXCIsXG4gICAgdmlld0JveDogXCIwIDAgMTAgMTBcIlxuICB9LCBwcm9wcyksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgY2xhc3NOYW1lOiBwcm9wcy5jbGFzc05hbWUsXG4gICAgZDogXCJtNi4yOSA1IDIuOTIyLTIuOTIzQS45MTEuOTExIDAgMSAwIDcuOTIyLjc4OEw1IDMuNzExIDIuMDc4Ljc4OGEuOTEyLjkxMiAwIDAgMC0xLjI5IDEuMjlMMy43MTIgNSAuNzkgNy45MjNhLjkxMi45MTIgMCAwIDAgMS4yODkgMS4yODlMNSA2LjI4OWwyLjkyMyAyLjkyM2EuOTExLjkxMSAwIDAgMCAxLjI4OS0xLjI5WlwiXG4gIH0pKTtcbn07XG5leHBvcnQgZGVmYXVsdCBDcm9zczsiLCJpbXBvcnQgUmVhY3QsIHsgdXNlU3RhdGUsIHVzZUVmZmVjdCwgdXNlUmVmIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgc3R5bGVkIGZyb20gXCJzdHlsZWQtY29tcG9uZW50c1wiO1xuaW1wb3J0IFVzZXIgZnJvbSBcIi4vaWNvbnMvVXNlclwiO1xuaW1wb3J0IENoYW5uZWxQdWJsaWMgZnJvbSBcIi4vaWNvbnMvQ2hhbm5lbFB1YmxpY1wiO1xuaW1wb3J0IENoYW5uZWxQcml2YXRlIGZyb20gXCIuL2ljb25zL0NoYW5uZWxQcml2YXRlXCI7XG5pbXBvcnQgQ3Jvc3MgZnJvbSBcIi4vaWNvbnMvQ3Jvc3NcIjtcbmltcG9ydCBXYWl0IGZyb20gXCJAdG9ycS1uYXRpdmUvcmVhY3Qtc3BlY3RydW0vV2FpdFwiO1xuaW1wb3J0IHsgaXNNYWMgfSBmcm9tIFwiLi4vdXRpbHMvY29tbW9uVXRpbHNcIjtcbmltcG9ydCBcIi4vY3NzL3N0eWxlLmNzc1wiO1xuaW1wb3J0IHsgbG9jYWxpemUgfSBmcm9tICcuLi91dGlscy9ubHMuanMnO1xuXG4vLy8vLy8vIFN0eWxlZCBDb21wb25lbnRzIC8vLy8vLy9cblxuY29uc3QgU3R5bGVkTGlzdCA9IHN0eWxlZC51bGBcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBsZWZ0OiAwO1xuICB3aWR0aDogMTAwJTtcbiAgbWF4LWhlaWdodDogMTk2cHg7XG4gIG92ZXJmbG93LXk6IGF1dG87XG4gIGxpc3Qtc3R5bGUtdHlwZTogbm9uZTtcbiAgei1pbmRleDogMTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tc3BlY3RydW0tYWxpYXMtY29tcG9uZW50LWJhY2tncm91bmQtY29sb3IpO1xuICBwYWRkaW5nOiAxMHB4O1xuICBib3JkZXItY29sb3I6IHZhcigtLXNwZWN0cnVtLWFsaWFzLWJvcmRlci1jb2xvcik7XG4gIGJvcmRlci1zdHlsZTogc29saWQ7XG4gIGJvcmRlci13aWR0aDogdGhpbjtcbmA7XG5jb25zdCBUYWdEaXYgPSBzdHlsZWQuZGl2YFxuICBwYWRkaW5nLWxlZnQ6IDVweDtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tc3BlY3RydW0tYWxpYXMtY29tcG9uZW50LWJhY2tncm91bmQtY29sb3IpO1xuICBib3JkZXItY29sb3I6IHZhcigtLXNwZWN0cnVtLWFsaWFzLWJvcmRlci1jb2xvcik7XG4gIGJvcmRlci1zdHlsZTogc29saWQ7XG4gIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgYm9yZGVyLXdpZHRoOiB0aGluO1xuICBkaXNwbGF5OiBmbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBtYXJnaW46IDJweDtcbmA7XG5jb25zdCBUYWdDb250YWluZXIgPSBzdHlsZWQuZGl2YFxuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LXdyYXA6IHdyYXA7XG4gIGdhcDogNHB4O1xuYDtcbmNvbnN0IEljb25Db250YWluZXIgPSBzdHlsZWQuZGl2YFxuICBmaWxsOiB2YXIoLS1zcGVjdHJ1bS1hbGlhcy1jb21wb25lbnQtdGV4dC1jb2xvcik7XG4gIHBhZGRpbmctcmlnaHQ6IDVweDtcbmA7XG5jb25zdCBMaXN0SXRlbSA9IHN0eWxlZC5saWBcbiAgcGFkZGluZzogMnB4O1xuICBjdXJzb3I6IHBvaW50ZXI7XG5cbiAgJjpob3ZlciB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tc3BlY3RydW0tYWxpYXMtY29tcG9uZW50LWJhY2tncm91bmQtY29sb3ItaG92ZXIpO1xuICB9XG5gO1xuY29uc3QgU3Bpbm5lckRpdiA9IHN0eWxlZC5kaXZgXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgZmxleC13cmFwOiB3cmFwO1xuICB3aWR0aDogMTAwJTtcbmA7XG5cbi8vLy8vLy8gU3R5bGVkIENvbXBvbmVudHMgLy8vLy8vL1xuXG4vLyBDdXN0b20gaG9vayBmb3IgZGVib3VuY2VcbmNvbnN0IHVzZURlYm91bmNlID0gZnVuY3Rpb24gKHZhbHVlLCBkZWxheSkge1xuICBjb25zdCBbZGVib3VuY2VkVmFsdWUsIHNldERlYm91bmNlZFZhbHVlXSA9IHVzZVN0YXRlKHZhbHVlKTtcbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBoYW5kbGVyID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICBzZXREZWJvdW5jZWRWYWx1ZSh2YWx1ZSk7XG4gICAgfSwgZGVsYXkpO1xuXG4gICAgLy8gQ2xlYW51cCBmdW5jdGlvbiB0byBjbGVhciB0aGUgdGltZW91dCBpZiB2YWx1ZSBjaGFuZ2VzXG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNsZWFyVGltZW91dChoYW5kbGVyKTtcbiAgICB9O1xuICB9LCBbdmFsdWUsIGRlbGF5XSk7XG4gIHJldHVybiBkZWJvdW5jZWRWYWx1ZTtcbn07XG5leHBvcnQgY29uc3QgVGFnSW5wdXQgPSBSZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIChwcm9wcywgcmVmKSB7XG4gIGNvbnN0IFtpbnB1dFZhbHVlLCBzZXRJbnB1dFZhbHVlXSA9IHVzZVN0YXRlKFwiXCIpO1xuICBjb25zdCBbc3VnZ2VzdGlvbnMsIHNldFN1Z2dlc3Rpb25zXSA9IHVzZVN0YXRlKFtdKTtcbiAgY29uc3QgW2lzRHJvcGRvd25WaXNpYmxlLCBzZXRJc0Ryb3Bkb3duVmlzaWJsZV0gPSB1c2VTdGF0ZShmYWxzZSk7XG4gIGNvbnN0IGlucHV0UmVmID0gdXNlUmVmKG51bGwpO1xuICBjb25zdCBjb250YWluZXJSZWYgPSB1c2VSZWYobnVsbCk7XG5cbiAgLy8gRXhwb3NlIGNsZWFySW5wdXQgbWV0aG9kIHRocm91Z2ggcmVmXG4gIFJlYWN0LnVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNsZWFySW5wdXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgc2V0SW5wdXRWYWx1ZShcIlwiKTtcbiAgICAgICAgc2V0U3VnZ2VzdGlvbnMoW10pO1xuICAgICAgICBzZXRJc0Ryb3Bkb3duVmlzaWJsZShmYWxzZSk7XG4gICAgICAgIGlmIChpbnB1dFJlZi5jdXJyZW50KSB7XG4gICAgICAgICAgaW5wdXRSZWYuY3VycmVudC52YWx1ZSA9IFwiXCI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9KTtcblxuICAvLyBEZWJvdW5jZSB0aGUgaW5wdXQgdmFsdWUgd2l0aCBhIGRlbGF5IG9mIDMwMG1zXG4gIGNvbnN0IGRlYm91bmNlZElucHV0VmFsdWUgPSB1c2VEZWJvdW5jZShpbnB1dFZhbHVlLCAzMDApO1xuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmICgoZGVib3VuY2VkSW5wdXRWYWx1ZSA9PT0gbnVsbCB8fCBkZWJvdW5jZWRJbnB1dFZhbHVlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBkZWJvdW5jZWRJbnB1dFZhbHVlLmxlbmd0aCkgPiAwKSB7XG4gICAgICBsZXQgZmlsdGVyZWRTdWdnZXN0aW9ucyA9IFtdO1xuICAgICAgaWYgKGRlYm91bmNlZElucHV0VmFsdWVbMF0gPT09IFwiQFwiKSB7XG4gICAgICAgIGNvbnN0IG5hbWUgPSBkZWJvdW5jZWRJbnB1dFZhbHVlLnNsaWNlKDEpO1xuICAgICAgICBmaWx0ZXJlZFN1Z2dlc3Rpb25zID0gcHJvcHMudXNlckxpc3QuZmlsdGVyKGZ1bmN0aW9uICh1c2VyKSB7XG4gICAgICAgICAgcmV0dXJuIHVzZXIubmFtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKG5hbWUudG9Mb3dlckNhc2UoKSkgfHwgdXNlci5sZGFwICYmIHVzZXIubGRhcC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKG5hbWUudG9Mb3dlckNhc2UoKSk7XG4gICAgICAgIH0pLnNsaWNlKDAsIDIwKTtcbiAgICAgIH0gZWxzZSBpZiAoZGVib3VuY2VkSW5wdXRWYWx1ZVswXSA9PT0gXCIjXCIpIHtcbiAgICAgICAgY29uc3QgbmFtZSA9IGRlYm91bmNlZElucHV0VmFsdWUuc2xpY2UoMSk7XG4gICAgICAgIGZpbHRlcmVkU3VnZ2VzdGlvbnMgPSBwcm9wcy5jaGFubmVsTGlzdC5maWx0ZXIoZnVuY3Rpb24gKGNoYW5uZWwpIHtcbiAgICAgICAgICByZXR1cm4gY2hhbm5lbC5uYW1lLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMobmFtZS50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgfSkuc2xpY2UoMCwgMjApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgY29tYmluZWRMaXN0ID0gWy4uLnByb3BzLnVzZXJMaXN0LCAuLi5wcm9wcy5jaGFubmVsTGlzdF07XG4gICAgICAgIGZpbHRlcmVkU3VnZ2VzdGlvbnMgPSBjb21iaW5lZExpc3QuZmlsdGVyKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgICAgcmV0dXJuIGl0ZW0ubmFtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKGRlYm91bmNlZElucHV0VmFsdWUudG9Mb3dlckNhc2UoKSkgfHwgaXRlbS5sZGFwICYmIGl0ZW0ubGRhcC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKGRlYm91bmNlZElucHV0VmFsdWUudG9Mb3dlckNhc2UoKSk7XG4gICAgICAgIH0pLnNsaWNlKDAsIDIwKTtcbiAgICAgIH1cblxuICAgICAgLy8gUmVtb3ZlIGFscmVhZHkgYWRkZWQgdGFncyBmcm9tIHN1Z2dlc3Rpb25zXG4gICAgICBjb25zdCB0YWdJZHMgPSBuZXcgU2V0KHByb3BzLnRhZ3MubWFwKGZ1bmN0aW9uICh0YWcpIHtcbiAgICAgICAgcmV0dXJuIHRhZy5pZDtcbiAgICAgIH0pKTtcbiAgICAgIGZpbHRlcmVkU3VnZ2VzdGlvbnMgPSBmaWx0ZXJlZFN1Z2dlc3Rpb25zLmZpbHRlcihmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICByZXR1cm4gIXRhZ0lkcy5oYXMoaXRlbS5pZCk7XG4gICAgICB9KTtcbiAgICAgIHNldFN1Z2dlc3Rpb25zKGZpbHRlcmVkU3VnZ2VzdGlvbnMpO1xuICAgICAgaWYgKGZpbHRlcmVkU3VnZ2VzdGlvbnMgJiYgZmlsdGVyZWRTdWdnZXN0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHNldElzRHJvcGRvd25WaXNpYmxlKHRydWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2V0SXNEcm9wZG93blZpc2libGUoZmFsc2UpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzZXRTdWdnZXN0aW9ucyhbXSk7XG4gICAgICBzZXRJc0Ryb3Bkb3duVmlzaWJsZShmYWxzZSk7XG4gICAgfVxuICB9LCBbZGVib3VuY2VkSW5wdXRWYWx1ZV0pO1xuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIC8vIEZ1bmN0aW9uIHRvIGhhbmRsZSBjbGlja3Mgb3V0c2lkZSBvZiB0aGUgY29tcG9uZW50XG4gICAgY29uc3QgaGFuZGxlQ2xpY2tPdXRzaWRlID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICBpZiAoY29udGFpbmVyUmVmLmN1cnJlbnQgJiYgIWNvbnRhaW5lclJlZi5jdXJyZW50LmNvbnRhaW5zKGV2ZW50LnRhcmdldCkpIHtcbiAgICAgICAgc2V0SXNEcm9wZG93blZpc2libGUoZmFsc2UpO1xuICAgICAgfVxuICAgIH07XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlZG93blwiLCBoYW5kbGVDbGlja091dHNpZGUpO1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2Vkb3duXCIsIGhhbmRsZUNsaWNrT3V0c2lkZSk7XG4gICAgfTtcbiAgfSwgW10pO1xuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIC8vIEhhY2s6IFRleHRhcmVhIGRvZXNuJ3QgbGV0IGFueXRoaW5nIHJlbmRlciBvdmVyIGl0LlxuICAgIHByb3BzLnNldFRleHRBcmVhSGlkZGVuKGlzRHJvcGRvd25WaXNpYmxlKTtcbiAgfSwgW2lzRHJvcGRvd25WaXNpYmxlXSk7XG4gIGNvbnN0IGhhbmRsZUlucHV0Q2hhbmdlID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgc2V0SW5wdXRWYWx1ZShldmVudC50YXJnZXQudmFsdWUpO1xuICB9O1xuICBjb25zdCBoYW5kbGVTdWdnZXN0aW9uQ2xpY2sgPSBmdW5jdGlvbiAoc3VnZ2VzdGlvbikge1xuICAgIHZhciBfcHJvcHMkcGFyZW50RGlhbG9nUmUsIF9wcm9wcyRwYXJlbnREaWFsb2dSZTI7XG4gICAgcHJvcHMuc2V0VGFncyhmdW5jdGlvbiAocHJldlRhZ3MpIHtcbiAgICAgIHJldHVybiBbLi4ucHJldlRhZ3MsIHN1Z2dlc3Rpb25dO1xuICAgIH0pO1xuICAgIHNldElucHV0VmFsdWUoXCJcIik7XG4gICAgc2V0U3VnZ2VzdGlvbnMoW10pO1xuICAgIHNldElzRHJvcGRvd25WaXNpYmxlKGZhbHNlKTtcbiAgICAvLyBGb2N1cyBvbiB0aGUgcGFyZW50IGRpYWxvZ1xuICAgIChfcHJvcHMkcGFyZW50RGlhbG9nUmUgPSBwcm9wcy5wYXJlbnREaWFsb2dSZWYpID09PSBudWxsIHx8IF9wcm9wcyRwYXJlbnREaWFsb2dSZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogKF9wcm9wcyRwYXJlbnREaWFsb2dSZTIgPSBfcHJvcHMkcGFyZW50RGlhbG9nUmUuY3VycmVudCkgPT09IG51bGwgfHwgX3Byb3BzJHBhcmVudERpYWxvZ1JlMiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX3Byb3BzJHBhcmVudERpYWxvZ1JlMi5mb2N1cygpO1xuICB9O1xuICBjb25zdCBoYW5kbGVUYWdSZW1vdmUgPSBmdW5jdGlvbiAodGFnVG9SZW1vdmUpIHtcbiAgICBwcm9wcy5zZXRUYWdzKGZ1bmN0aW9uIChwcmV2VGFncykge1xuICAgICAgcmV0dXJuIHByZXZUYWdzLmZpbHRlcihmdW5jdGlvbiAodGFnKSB7XG4gICAgICAgIHJldHVybiB0YWcuaWQgIT09IHRhZ1RvUmVtb3ZlLmlkO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH07XG4gIGNvbnN0IGhhbmRsZUZvY3VzID0gZnVuY3Rpb24gKCkge1xuICAgIHNldElucHV0VmFsdWUoXCJcIik7XG4gIH07XG4gIGNvbnN0IGhhbmRsZUJsdXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgLy9zZXRJc0Ryb3Bkb3duVmlzaWJsZShmYWxzZSk7IGNhbid0IGRvIGl0IGhlcmUgYXMgaXQgd2lsbCByZXN1bHQgaW50byBoYW5kbGVTdWdnZXN0aW9uQ2xpY2sgbm90IGdldHRpbmcgY2FsbGVkLlxuICAgIC8vIHNvIGFkZGVkIGhhbmRsZUNsaWNrT3V0c2lkZSB0byBoYW5kbGUgaXQuXG4gIH07XG4gIGNvbnN0IHJlbmRlckljb24gPSBmdW5jdGlvbiAoc3VnZ2VzdGlvbikge1xuICAgIGlmIChzdWdnZXN0aW9uLnR5cGUgPT09IFwidXNlclwiKSB7XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoVXNlciwge1xuICAgICAgICBjbGFzc05hbWU6IFwiaWNvbi1zdHlsZVwiXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHN1Z2dlc3Rpb24ucHJpdmF0ZSA/IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KENoYW5uZWxQcml2YXRlLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJpY29uLXN0eWxlXCJcbiAgICAgIH0pIDogLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ2hhbm5lbFB1YmxpYywge1xuICAgICAgICBjbGFzc05hbWU6IFwiaWNvbi1zdHlsZVwiXG4gICAgICB9KTtcbiAgICB9XG4gIH07XG5cbiAgLy9UT0RPOiBBZGQgdGFncyBpbnNpZGUgdGV4dGZpZWxkXG4gIC8vIHNlZSBpbXBsZW1lbnRhdGlvbiBpbiBzaGFyZXNoZWV0IEkyRVxuICAvLyBodHRwczovL2dpdC5jb3JwLmFkb2JlLmNvbS9DQ1gvY2N4LXNoYXJpbmcvYmxvYi9hYjRkMWU5M2Y3MWYyNmE1MzQ0ZjQ2OTkyNmEyMGNlNGFkZDBmYTU0L3BhY2thZ2VzL2NvbXBvbmVudC1yZWFjdC9zcmMvY29tcG9uZW50cy9JbnZpdGVJbnB1dC9JbnZpdGVJbnB1dC50c3gjTDcyOVxuXG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgc3R5bGU6IHtcbiAgICAgIHBvc2l0aW9uOiBcInJlbGF0aXZlXCIsXG4gICAgICB3aWR0aDogXCIxMDAlXCIsXG4gICAgICBwYWRkaW5nVG9wOiAwXG4gICAgfSxcbiAgICByZWY6IGNvbnRhaW5lclJlZlxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwLWxhYmVsXCIsIHtcbiAgICBmb3I6IFwiY29tbWVudC1tXCIsXG4gICAgc2l6ZTogXCJtXCJcbiAgfSwgbG9jYWxpemUoJ0RFU1RJTkFUSU9OX0xBQkVMJykpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChTcGlubmVyRGl2LCBudWxsLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwLXRleHRmaWVsZFwiLCB7XG4gICAgcmVmOiBpbnB1dFJlZixcbiAgICBwbGFjZWhvbGRlcjogaW5wdXRWYWx1ZS5sZW5ndGggJiYgaXNNYWMgPyBcIlwiIDogbG9jYWxpemUoJ0RFU1RJTkFUSU9OX1BMQUNFSE9MREVSJyksXG4gICAgc3R5bGU6IHtcbiAgICAgIHdpZHRoOiBcIjEwMCVcIixcbiAgICAgIHBhZGRpbmdSaWdodDogcHJvcHMuY29udGFjdHNMb2FkZWQgPyBcIjBweFwiIDogXCIzMHB4XCJcbiAgICB9LFxuICAgIG9uSW5wdXQ6IGhhbmRsZUlucHV0Q2hhbmdlLFxuICAgIG9uRm9jdXM6IGhhbmRsZUZvY3VzLFxuICAgIG9uQmx1cjogaGFuZGxlQmx1cixcbiAgICB2YWx1ZTogaW5wdXRWYWx1ZVxuICB9KSwgIXByb3BzLmNvbnRhY3RzTG9hZGVkICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBzdHlsZToge1xuICAgICAgcG9zaXRpb246IFwiYWJzb2x1dGVcIixcbiAgICAgIHJpZ2h0OiBcIjE1cHhcIlxuICAgIH1cbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoV2FpdCwge1xuICAgIGVuYWJsZTogIXByb3BzLmNvbnRhY3RzTG9hZGVkLFxuICAgIHNpemU6IFwiU1wiLFxuICAgIGNlbnRlcmVkOiB0cnVlXG4gIH0pKSksIGlzRHJvcGRvd25WaXNpYmxlICYmIHN1Z2dlc3Rpb25zLmxlbmd0aCA+IDAgJiYgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoU3R5bGVkTGlzdCwgbnVsbCwgc3VnZ2VzdGlvbnMubWFwKGZ1bmN0aW9uIChzdWdnZXN0aW9uKSB7XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KExpc3RJdGVtLCB7XG4gICAgICBrZXk6IHN1Z2dlc3Rpb24uaWQsXG4gICAgICBvbkNsaWNrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBoYW5kbGVTdWdnZXN0aW9uQ2xpY2soc3VnZ2VzdGlvbik7XG4gICAgICB9XG4gICAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgc3R5bGU6IHtcbiAgICAgICAgZGlzcGxheTogXCJmbGV4XCIsXG4gICAgICAgIGFsaWduSXRlbXM6IFwiY2VudGVyXCIsXG4gICAgICAgIHBhZGRpbmc6IFwiNXB4XCJcbiAgICAgIH1cbiAgICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChJY29uQ29udGFpbmVyLCBudWxsLCByZW5kZXJJY29uKHN1Z2dlc3Rpb24pKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcC1ib2R5XCIsIHtcbiAgICAgIHNpemU6IFwic1wiLFxuICAgICAgc3R5bGU6IHtcbiAgICAgICAgcGFkZGluZ1JpZ2h0OiBcIjVweFwiLFxuICAgICAgICBtYXJnaW46IFwiMHB4XCJcbiAgICAgIH1cbiAgICB9LCBzdWdnZXN0aW9uLm5hbWUpLCBzdWdnZXN0aW9uLnR5cGUgPT09IFwidXNlclwiICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3AtYm9keVwiLCB7XG4gICAgICBzaXplOiBcInNcIixcbiAgICAgIHN0eWxlOiB7XG4gICAgICAgIGNvbG9yOiBcInZhcigtLXNwZWN0cnVtLWdsb2JhbC1jb2xvci1ncmF5LTYwMClcIixcbiAgICAgICAgbWFyZ2luOiBcIjBweFwiXG4gICAgICB9XG4gICAgfSwgc3VnZ2VzdGlvbi5sZGFwKSkpO1xuICB9KSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFRhZ0NvbnRhaW5lciwgbnVsbCwgcHJvcHMudGFncy5tYXAoZnVuY3Rpb24gKHRhZykge1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChUYWdEaXYsIHtcbiAgICAgIGtleTogdGFnLmlkXG4gICAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcC1ib2R5XCIsIHtcbiAgICAgIHNpemU6IFwic1wiLFxuICAgICAgc3R5bGU6IHtcbiAgICAgICAgcGFkZGluZ0xlZnQ6IFwiMTBweFwiLFxuICAgICAgICBtYXJnaW46IFwiMHB4XCJcbiAgICAgIH1cbiAgICB9LCB0YWcudHlwZSA9PT0gXCJ1c2VyXCIgPyB0YWcubmFtZSA6IFwiI1wiICsgdGFnLm5hbWUpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwLWFjdGlvbi1idXR0b25cIiwge1xuICAgICAgcXVpZXQ6IHRydWUsXG4gICAgICBvbkNsaWNrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBoYW5kbGVUYWdSZW1vdmUodGFnKTtcbiAgICAgIH1cbiAgICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChDcm9zcywge1xuICAgICAgY2xhc3NOYW1lOiBcImljb24tc3R5bGVcIlxuICAgIH0pKSk7XG4gIH0pKSk7XG59KTsiLCJmdW5jdGlvbiBfZXh0ZW5kcygpIHsgcmV0dXJuIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiA/IE9iamVjdC5hc3NpZ24uYmluZCgpIDogZnVuY3Rpb24gKG4pIHsgZm9yICh2YXIgZSA9IDE7IGUgPCBhcmd1bWVudHMubGVuZ3RoOyBlKyspIHsgdmFyIHQgPSBhcmd1bWVudHNbZV07IGZvciAodmFyIHIgaW4gdCkgKHt9KS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIHIpICYmIChuW3JdID0gdFtyXSk7IH0gcmV0dXJuIG47IH0sIF9leHRlbmRzLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7IH1cbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuY29uc3QgQ2xvc2UgPSBmdW5jdGlvbiAocHJvcHMpIHtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIF9leHRlbmRzKHtcbiAgICB4bWxuczogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLFxuICAgIHdpZHRoOiAxMixcbiAgICBoZWlnaHQ6IDEyXG4gIH0sIHByb3BzKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIm03LjM5OCA2IDMuOTMyLTMuOTMyQS45ODkuOTg5IDAgMSAwIDkuOTMyLjY3TDYgNC42MDIgMi4wNjguNjdBLjk4OS45ODkgMCAwIDAgLjY3IDIuMDY4TDQuNjAyIDYgLjY3IDkuOTMyYS45ODkuOTg5IDAgMSAwIDEuMzk4IDEuMzk4TDYgNy4zOThsMy45MzIgMy45MzJhLjk4OS45ODkgMCAwIDAgMS4zOTgtMS4zOThaXCJcbiAgfSkpO1xufTtcbmV4cG9ydCBkZWZhdWx0IENsb3NlOyIsImZ1bmN0aW9uIF9leHRlbmRzKCkgeyByZXR1cm4gX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduID8gT2JqZWN0LmFzc2lnbi5iaW5kKCkgOiBmdW5jdGlvbiAobikgeyBmb3IgKHZhciBlID0gMTsgZSA8IGFyZ3VtZW50cy5sZW5ndGg7IGUrKykgeyB2YXIgdCA9IGFyZ3VtZW50c1tlXTsgZm9yICh2YXIgciBpbiB0KSAoe30pLmhhc093blByb3BlcnR5LmNhbGwodCwgcikgJiYgKG5bcl0gPSB0W3JdKTsgfSByZXR1cm4gbjsgfSwgX2V4dGVuZHMuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgfVxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5jb25zdCBPZmZsaW5lID0gZnVuY3Rpb24gKHByb3BzKSB7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInN2Z1wiLCBfZXh0ZW5kcyh7XG4gICAgeG1sbnM6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIixcbiAgICB3aWR0aDogODEsXG4gICAgaGVpZ2h0OiA4MixcbiAgICBmaWxsOiBcIm5vbmVcIlxuICB9LCBwcm9wcyksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZ1wiLCB7XG4gICAgY2xhc3NOYW1lOiBwcm9wcy5jbGFzc05hbWUsXG4gICAgZmlsbFJ1bGU6IFwiZXZlbm9kZFwiLFxuICAgIGNsaXBQYXRoOiBcInVybCgjYSlcIixcbiAgICBjbGlwUnVsZTogXCJldmVub2RkXCJcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk02MC42OCAzNi4wNzhhMTYuMzEyIDE2LjMxMiAwIDEgMCAwIDMyLjYyNCAxNi4zMTIgMTYuMzEyIDAgMCAwIDAtMzIuNjI0Wm04LjcwOCAyMi4zMWEyLjA3IDIuMDcgMCAwIDEtMS40NjIgMy41MzggMi4wNjggMi4wNjggMCAwIDEtMS40NjUtLjYxNGwtNS40NTktNS40Ni01LjQ1OCA1LjQ2YTIuMDcxIDIuMDcxIDAgMCAxLTIuOTI2LjAwMSAyLjA2OCAyLjA2OCAwIDAgMSAwLTIuOTI1bDUuNDYtNS40Ni01LjM4Ni01LjQ0MmExLjg0MSAxLjg0MSAwIDAgMS0uNjktMS4zMjQgMi4yNjUgMi4yNjUgMCAwIDEgMi4xNTQtMi4yMSAyLjA4IDIuMDggMCAwIDEgMS40NjMuNjA4bDUuMzg0IDUuNDQyIDUuMzg0LTUuNDQyYTIuMDggMi4wOCAwIDAgMSAxLjQ2My0uNjA4IDIuMjY1IDIuMjY1IDAgMCAxIDIuMTUzIDIuMjEgMS44NCAxLjg0IDAgMCAxLS42OSAxLjMyNGwtNS4zODUgNS40NDEgNS40NiA1LjQ2WlwiXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTYyLjI5OSAzMi4wNThBMjAuMjU0IDIwLjI1NCAwIDAgMCA0My45MSA2My41SDguMzY1YTguODIxIDguODIxIDAgMCAxLTguMzctOS4yNUwwIDU0LjE3MmExMC4zNTUgMTAuMzU1IDAgMCAxIDkuMjA3LTkuNTg4IDEwLjgzNCAxMC44MzQgMCAwIDEtLjMtMy41NSAxNC4wNyAxNC4wNyAwIDAgMSAxNC4zOTYtMTMuNjY2YzEuNTk2LjAwMSAzLjE4NC4yMjEgNC43Mi42NTVBMTguMjY4IDE4LjI2OCAwIDAgMSA0NS4xNDEgMTQuMTRhMTYuNDE3IDE2LjQxNyAwIDAgMSAxNy4xOTEgMTcuMDM0YzAgLjI5Ny0uMDEyLjU5MS0uMDMzLjg4NFpcIlxuICB9KSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGVmc1wiLCBudWxsLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImNsaXBQYXRoXCIsIHtcbiAgICBpZDogXCJhXCJcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBjbGFzc05hbWU6IHByb3BzLmNsYXNzTmFtZSxcbiAgICBkOiBcIk0wIC41aDgxdjgxSDB6XCJcbiAgfSkpKSk7XG59O1xuZXhwb3J0IGRlZmF1bHQgT2ZmbGluZTsiLCJmdW5jdGlvbiBfZXh0ZW5kcygpIHsgcmV0dXJuIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiA/IE9iamVjdC5hc3NpZ24uYmluZCgpIDogZnVuY3Rpb24gKG4pIHsgZm9yICh2YXIgZSA9IDE7IGUgPCBhcmd1bWVudHMubGVuZ3RoOyBlKyspIHsgdmFyIHQgPSBhcmd1bWVudHNbZV07IGZvciAodmFyIHIgaW4gdCkgKHt9KS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIHIpICYmIChuW3JdID0gdFtyXSk7IH0gcmV0dXJuIG47IH0sIF9leHRlbmRzLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7IH1cbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuY29uc3QgTW9yZSA9IGZ1bmN0aW9uIChwcm9wcykge1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdmdcIiwgX2V4dGVuZHMoe1xuICAgIHhtbG5zOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsXG4gICAgd2lkdGg6IDE4LFxuICAgIGhlaWdodDogMThcbiAgfSwgcHJvcHMpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInRpdGxlXCIsIG51bGwsIFwiUyBNb3JlU21hbGxMaXN0IDE4IE5cIiksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiY2lyY2xlXCIsIHtcbiAgICBjeDogNC41LFxuICAgIGN5OiA5LFxuICAgIHI6IDEuNDI1LFxuICAgIGNsYXNzTmFtZTogcHJvcHMuY2xhc3NOYW1lXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImNpcmNsZVwiLCB7XG4gICAgY3g6IDksXG4gICAgY3k6IDksXG4gICAgcjogMS40MjUsXG4gICAgY2xhc3NOYW1lOiBwcm9wcy5jbGFzc05hbWVcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiY2lyY2xlXCIsIHtcbiAgICBjeDogMTMuNSxcbiAgICBjeTogOSxcbiAgICByOiAxLjQyNSxcbiAgICBjbGFzc05hbWU6IHByb3BzLmNsYXNzTmFtZVxuICB9KSk7XG59O1xuZXhwb3J0IGRlZmF1bHQgTW9yZTsiLCJmdW5jdGlvbiBfZXh0ZW5kcygpIHsgcmV0dXJuIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiA/IE9iamVjdC5hc3NpZ24uYmluZCgpIDogZnVuY3Rpb24gKG4pIHsgZm9yICh2YXIgZSA9IDE7IGUgPCBhcmd1bWVudHMubGVuZ3RoOyBlKyspIHsgdmFyIHQgPSBhcmd1bWVudHNbZV07IGZvciAodmFyIHIgaW4gdCkgKHt9KS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIHIpICYmIChuW3JdID0gdFtyXSk7IH0gcmV0dXJuIG47IH0sIF9leHRlbmRzLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7IH1cbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuY29uc3QgUmVmcmVzaCA9IGZ1bmN0aW9uIChwcm9wcykge1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdmdcIiwgX2V4dGVuZHMoe1xuICAgIHhtbG5zOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsXG4gICAgd2lkdGg6IDE2LFxuICAgIGhlaWdodDogMTYsXG4gICAgdmlld0JveDogXCIwIDAgMTggMThcIlxuICB9LCBwcm9wcyksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwidGl0bGVcIiwgbnVsbCwgXCJTIFJlZnJlc2ggMTggTlwiKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBkOiBcIk0xNi4zMzcgMTBoLS45NDdhLjYwOC42MDggMCAwIDAtLjU4MS40NjkgNS43MjMgNS43MjMgMCAwIDEtOS41NTkgMi41MzdsLS4zNDYtLjM0NiAxLjk3OC0xLjk3OEEuMzkyLjM5MiAwIDAgMCA3IDEwLjRhLjQuNCAwIDAgMC0uMzc3LS40SDEuMjVhLjI1LjI1IDAgMCAwLS4yNS4yNXY1LjM3NWEuNC40IDAgMCAwIC40LjM3NS4zOS4zOSAwIDAgMCAuMjgtLjExOGwxLjgwOC0xLjgwOC4xNzkuMTc4YTguMDkgOC4wOSAwIDAgMCAzLjY0MiAyLjE2NSA3LjcxNSA3LjcxNSAwIDAgMCA5LjQzNy01LjQ3NHEuMDQ4LS4xNzguMDg3LS4zNThhLjUuNSAwIDAgMC0uNDk2LS41ODVaTTE2LjYgMmEuMzkuMzkgMCAwIDAtLjI4LjExOGwtMS44MSAxLjgwOC0uMTc5LS4xNzZhOC4wOSA4LjA5IDAgMCAwLTMuNjQyLTIuMTY2IDcuNzE1IDcuNzE1IDAgMCAwLTkuNDM2IDUuNDc3cS0uMDQ3LjE3Ni0uMDg2LjM1NEEuNS41IDAgMCAwIDEuNjYzIDhoLjk0N2EuNjA4LjYwOCAwIDAgMCAuNTgxLS40NjkgNS43MjMgNS43MjMgMCAwIDEgOS41NTktMi41MzdsLjM0Ni4zNDYtMS45NzggMS45NzhBLjM5Mi4zOTIgMCAwIDAgMTEgNy42YS40LjQgMCAwIDAgLjM3Ny40aDUuMzczYS4yNS4yNSAwIDAgMCAuMjUtLjI1VjIuMzc3QS40LjQgMCAwIDAgMTYuNiAyWlwiLFxuICAgIGNsYXNzTmFtZTogcHJvcHMuY2xhc3NOYW1lXG4gIH0pKTtcbn07XG5leHBvcnQgZGVmYXVsdCBSZWZyZXNoOyIsImZ1bmN0aW9uIF9leHRlbmRzKCkgeyByZXR1cm4gX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduID8gT2JqZWN0LmFzc2lnbi5iaW5kKCkgOiBmdW5jdGlvbiAobikgeyBmb3IgKHZhciBlID0gMTsgZSA8IGFyZ3VtZW50cy5sZW5ndGg7IGUrKykgeyB2YXIgdCA9IGFyZ3VtZW50c1tlXTsgZm9yICh2YXIgciBpbiB0KSAoe30pLmhhc093blByb3BlcnR5LmNhbGwodCwgcikgJiYgKG5bcl0gPSB0W3JdKTsgfSByZXR1cm4gbjsgfSwgX2V4dGVuZHMuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgfVxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5jb25zdCBMb2dvdXQgPSBmdW5jdGlvbiAocHJvcHMpIHtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIF9leHRlbmRzKHtcbiAgICB4bWxuczogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLFxuICAgIHdpZHRoOiAxNixcbiAgICBoZWlnaHQ6IDE2LFxuICAgIGZpbGw6IFwibm9uZVwiXG4gIH0sIHByb3BzKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJnXCIsIHtcbiAgICBmaWxsOiBcIiNFQkVCRUJcIixcbiAgICBmaWxsUnVsZTogXCJldmVub2RkXCIsXG4gICAgY2xpcFBhdGg6IFwidXJsKCNhKVwiLFxuICAgIGNsaXBSdWxlOiBcImV2ZW5vZGRcIlxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTExLjExIDExLjU1NmgtLjg4OGEuNDQ0LjQ0NCAwIDAgMC0uNDQ0LjQ0NHYxLjMzM0gyLjY2NlYyLjY2N2g3LjExMlY0YS40NDUuNDQ1IDAgMCAwIC40NDQuNDQ0aC44ODlBLjQ0NS40NDUgMCAwIDAgMTEuNTU1IDRWMS4zMzNhLjQ0NS40NDUgMCAwIDAtLjQ0NC0uNDQ0SDEuMzMzYS40NDQuNDQ0IDAgMCAwLS40NDQuNDQ0djEzLjMzNGEuNDQ1LjQ0NSAwIDAgMCAuNDQ0LjQ0NGg5Ljc3OGEuNDQ1LjQ0NSAwIDAgMCAuNDQ0LS40NDRWMTJhLjQ0NC40NDQgMCAwIDAtLjQ0NC0uNDQ0WlwiLFxuICAgIGNsYXNzTmFtZTogcHJvcHMuY2xhc3NOYW1lXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwibTE1LjkzNiA3Ljg0NC0yLjktMy4zMDlhLjM1LjM1IDAgMCAwLS4zNy0uMDY0LjM1NS4zNTUgMCAwIDAtLjIyMS4zMjdWNy4xMWgtNC44OWEuNDQ0LjQ0NCAwIDAgMC0uNDQ0LjQ0NXYuODg4YS40NDQuNDQ0IDAgMCAwIC40NDUuNDQ1aDQuODg5djIuMzFhLjM1NS4zNTUgMCAwIDAgLjM1NC4zNTdoLjAwM2EuMzUuMzUgMCAwIDAgLjIzNS0uMDlsMi45LTMuMzFhLjIyMi4yMjIgMCAwIDAgMC0uMzEyWlwiLFxuICAgIGNsYXNzTmFtZTogcHJvcHMuY2xhc3NOYW1lXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTExLjExIDExLjU1NmgtLjg4OGEuNDQ0LjQ0NCAwIDAgMC0uNDQ0LjQ0NHYxLjMzM0gyLjY2NlYyLjY2N2g3LjExMlY0YS40NDUuNDQ1IDAgMCAwIC40NDQuNDQ0aC44ODlBLjQ0NS40NDUgMCAwIDAgMTEuNTU1IDRWMS4zMzNhLjQ0NS40NDUgMCAwIDAtLjQ0NC0uNDQ0SDEuMzMzYS40NDQuNDQ0IDAgMCAwLS40NDQuNDQ0djEzLjMzNGEuNDQ1LjQ0NSAwIDAgMCAuNDQ0LjQ0NGg5Ljc3OGEuNDQ1LjQ0NSAwIDAgMCAuNDQ0LS40NDRWMTJhLjQ0NC40NDQgMCAwIDAtLjQ0NC0uNDQ0WlwiLFxuICAgIGNsYXNzTmFtZTogcHJvcHMuY2xhc3NOYW1lXG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGQ6IFwibTE1LjkzNiA3Ljg0NC0yLjktMy4zMDlhLjM1LjM1IDAgMCAwLS4zNy0uMDY0LjM1NS4zNTUgMCAwIDAtLjIyMS4zMjdWNy4xMWgtNC44OWEuNDQ0LjQ0NCAwIDAgMC0uNDQ0LjQ0NXYuODg4YS40NDQuNDQ0IDAgMCAwIC40NDUuNDQ1aDQuODg5djIuMzFhLjM1NS4zNTUgMCAwIDAgLjM1NC4zNTdoLjAwM2EuMzUuMzUgMCAwIDAgLjIzNS0uMDlsMi45LTMuMzFhLjIyMi4yMjIgMCAwIDAgMC0uMzEyWlwiLFxuICAgIGNsYXNzTmFtZTogcHJvcHMuY2xhc3NOYW1lXG4gIH0pKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkZWZzXCIsIG51bGwsIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiY2xpcFBhdGhcIiwge1xuICAgIGlkOiBcImFcIlxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgIGZpbGw6IFwiI2ZmZlwiLFxuICAgIGQ6IFwiTTAgMGgxNnYxNkgwelwiXG4gIH0pKSkpO1xufTtcbmV4cG9ydCBkZWZhdWx0IExvZ291dDsiLCJpbXBvcnQgUmVhY3QsIHsgdXNlUmVmLCB1c2VTdGF0ZSwgdXNlQ2FsbGJhY2ssIHVzZUVmZmVjdCwgZm9yd2FyZFJlZiwgdXNlSW1wZXJhdGl2ZUhhbmRsZSB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IGF4aW9zIGZyb20gXCJheGlvc1wiO1xuaW1wb3J0IHsgc3RvcmFnZSB9IGZyb20gXCJ1eHBcIjtcbmltcG9ydCB7IEF1dGhWaWV3IH0gZnJvbSBcIi4vU2xhY2tBdXRoXCI7XG5pbXBvcnQgeyBUYWdJbnB1dCB9IGZyb20gXCIuL1RhZ0lucHV0XCI7XG5pbXBvcnQgeyBhcHAgfSBmcm9tIFwicGhvdG9zaG9wXCI7XG5pbXBvcnQgeyBsb2NhbGl6ZSB9IGZyb20gJy4uL3V0aWxzL25scy5qcyc7XG5pbXBvcnQgZnMgZnJvbSAnZnMnO1xuaW1wb3J0IHsgR2V0VXNlclNjb3BlLCBGZXRjaFVzZXJzLCBGZXRjaENoYW5uZWxzLCBHZXRDb252ZXJzYXRpb25Gb3JVc2VycywgRmV0Y2hXb3Jrc3BhY2VOYW1lIH0gZnJvbSBcIi4uL3V0aWxzL3NsYWNrVXRpbHNcIjtcbmltcG9ydCB7IFNMQUNLX0FDQ0VTU19UT0tFTiwgU0xBQ0tfQ0hBTk5FTF9EQVRBLCBTTEFDS19VU0VSX0RBVEEsIFNMQUNLX1NDT1BFUywgU0xBQ0tfV09SS1NQQUNFX05BTUUgfSBmcm9tIFwiLi4vdXRpbHMvc2xhY2tVdGlsc1wiO1xuaW1wb3J0IHsgaXNNYWMsIFVYUEV2ZW50VHlwZXMsIEVOVEVSX0tFWSwgRVNDQVBFX0tFWSB9IGZyb20gXCIuLi91dGlscy9jb21tb25VdGlsc1wiO1xuaW1wb3J0IHsgbG9nVG9Jbmdlc3QgfSBmcm9tIFwiLi4vaG9zdC9waG90b3Nob3BcIjtcbmltcG9ydCB7IGxvZywgZXJyb3IgfSBmcm9tIFwiLi4vdXRpbHMvbG9nXCI7XG5pbXBvcnQgc3R5bGVkIGZyb20gXCJzdHlsZWQtY29tcG9uZW50c1wiO1xuaW1wb3J0IFwiLi9jc3Mvc3R5bGUuY3NzXCI7XG5jb25zdCBzaGFyZVBhbmVsSW5nZXN0ID0gcmVxdWlyZShcIi4uL2luZ2VzdC9zaGFyZVBhbmVsSW5nZXN0Lmpzb25cIik7XG5pbXBvcnQgeyBlbWl0LCBzZXREaWFsb2dMaXN0ZW5lciwgcmVtb3ZlRGlhbG9nTGlzdGVuZXJzLCBpc0luQm91bmRhcnksIE9TX0VWRU5UUywgR0xPQkFMX0VWRU5UUyB9IGZyb20gXCIuLi91dGlscy9jb21tb25VdGlsc1wiO1xuaW1wb3J0IHsgVG9hc3QgfSBmcm9tIFwiLi9Ub2FzdFwiO1xuaW1wb3J0IENsb3NlIGZyb20gXCIuL2ljb25zL0Nsb3NlXCI7XG5pbXBvcnQgT2ZmbGluZSBmcm9tIFwiLi9pY29ucy9PZmZsaW5lXCI7XG5pbXBvcnQgTW9yZSBmcm9tIFwiLi9pY29ucy9Nb3JlXCI7XG5pbXBvcnQgUmVmcmVzaCBmcm9tIFwiLi9pY29ucy9SZWZyZXNoXCI7XG5pbXBvcnQgTG9nb3V0IGZyb20gXCIuL2ljb25zL0xvZ291dFwiO1xuaW1wb3J0IFdhaXQgZnJvbSBcIkB0b3JxLW5hdGl2ZS9yZWFjdC1zcGVjdHJ1bS9XYWl0XCI7XG5pbXBvcnQgQmFja0ljb24gZnJvbSBcIi4vaWNvbnMvQmFja0ljb24uanN4XCI7XG5cbi8vLy8vLy8gU3R5bGVkIENvbXBvbmVudHMgLy8vLy8vL1xuXG5jb25zdCBJY29uU2xvdCA9IHN0eWxlZC5kaXZgXG4gIGZpbGw6IHZhcigtLXNwZWN0cnVtLWFsaWFzLWNvbXBvbmVudC10ZXh0LWNvbG9yKTtcbmA7XG5jb25zdCBTbGFja0RpYWxvZyA9IHN0eWxlZC5kaWFsb2dgXG4gIHotaW5kZXg6IDE7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tdXhwLWhvc3QtYmFja2dyb3VuZC1jb2xvcik7XG4gIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgbWF4LWhlaWdodDogNTA4cHg7XG5gO1xuY29uc3QgRGlhbG9nRGl2ID0gc3R5bGVkLmRpdmBcbiAgd2lkdGg6ICR7ZnVuY3Rpb24gKHByb3BzKSB7XG4gIHJldHVybiBwcm9wcy53aWR0aDtcbn19cHg7IC8qIFVzZSBwcm9wcyBmb3Igd2lkdGggKi9cbiAgaGVpZ2h0OiAke2Z1bmN0aW9uIChwcm9wcykge1xuICByZXR1cm4gcHJvcHMuaGVpZ2h0O1xufX1weDsgLyogVXNlIHByb3BzIGZvciBoZWlnaHQgKi9cbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuYDtcbmNvbnN0IEhlYWRlclZpZXdDb250YWluZXIgPSBzdHlsZWQuZGl2YFxuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICBwYWRkaW5nOiAxMHB4IDA7XG5gO1xuY29uc3QgSGVhZGVyVmlldyA9IHN0eWxlZC5kaXZgXG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgd2lkdGg6IDEwMCU7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbmA7XG5jb25zdCBIZWFkZXJUZXh0VmlldyA9IHN0eWxlZC5kaXZgXG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGZsZXg6IDE7XG5gO1xuY29uc3QgRm9vdGVyID0gc3R5bGVkLmRpdmBcbiAgZGlzcGxheTogZmxleDtcbiAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDsgLyogVXNlICdmbGV4LWVuZCcgaW5zdGVhZCBvZiAnZW5kJyAqL1xuICBhbGlnbi1pdGVtczogZmxleC1lbmQ7IC8qIFVzZSAnZmxleC1lbmQnIGluc3RlYWQgb2YgJ2VuZCcgKi9cbiAgcGFkZGluZzogNXB4O1xuYDtcbmNvbnN0IEZvcm1hdFZpZXcgPSBzdHlsZWQuZGl2YFxuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICB3aWR0aDogMTAwJTtcbmA7XG5jb25zdCBDb21tZW50QXJlYVZpZXcgPSBzdHlsZWQuZGl2YFxuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICB3aWR0aDogMTAwJTtcbmA7XG5jb25zdCBDb21tZW50QXJlYUNvbnRhaW5lciA9IHN0eWxlZC5kaXZgXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogODVweDtcbiAgYmFja2dyb3VuZDogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLWdyYXktNTApO1xuYDtcbmNvbnN0IFNsYWNrUGFuZWxEaXYgPSBzdHlsZWQuZGl2YFxuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICBoZWlnaHQ6IDEwMCU7XG4gIHBhZGRpbmc6IDE1cHg7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgd2lkdGg6IDEwMCU7XG4gIHRvcDogMDtcbmA7XG5jb25zdCBTbGFja1BhbmVsSW5uZXJDb250YWluZXIgPSBzdHlsZWQuZGl2YFxuICBvdmVyZmxvdzogYXV0bztcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgaGVpZ2h0OiAxMDAlO1xuYDtcbmNvbnN0IFNsYWNrUGFuZWxJbm5lciA9IHN0eWxlZC5kaXZgXG4gIGZsZXg6IDEgMSAwOyAvKiBGbGV4IGdyb3csIHNocmluaywgYW5kIGJhc2lzICovXG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IDBweDsgLyogVGhpcyBtYXkgYmUgYWRqdXN0ZWQgYmFzZWQgb24gY29udGVudCAqL1xuICBvdmVyZmxvdy15OiBhdXRvOyAvKiBFbmFibGUgdmVydGljYWwgc2Nyb2xsaW5nICovXG4gIC8qIGFkZCBwYWRkaW5nIHRvIGVhY2ggY2hpbGQqL1xuICAmID4gKiB7XG4gICAgcGFkZGluZzogMTBweDtcbiAgfVxuYDtcbmNvbnN0IFBzZXVkb0NvbW1lbnRBcmVhID0gc3R5bGVkLmRpdmBcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiA4NXB4O1xuICBib3JkZXItc3R5bGU6IHNvbGlkO1xuICBib3JkZXItd2lkdGg6IHRoaW47XG4gIGJvcmRlci1jb2xvcjogdmFyKC0tc3BlY3RydW0tZ2xvYmFsLWNvbG9yLWdyYXktNDAwKTtcbiAgY29sb3I6IHZhcigtLXNwZWN0cnVtLWFsaWFzLWNvbXBvbmVudC10ZXh0LWNvbG9yKTtcbiAgcGFkZGluZzogNHB4IDAgMCAxNHB4O1xuICBmb250LXNpemU6IDEycHg7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuICB2aXNpYmlsaXR5OiAke2Z1bmN0aW9uIChwcm9wcykge1xuICByZXR1cm4gcHJvcHMuaGlkZGVuID8gXCJoaWRkZW5cIiA6IFwidmlzaWJsZVwiO1xufX07IC8qIENvbnRyb2wgdmlzaWJpbGl0eSB0aHJvdWdoIHByb3BzICovXG5gO1xuY29uc3QgT2ZmbGluZVZpZXcgPSBzdHlsZWQuZGl2YFxuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgaGVpZ2h0OiAxMDAlO1xuICBtYXJnaW46IDMwcHg7XG5gO1xuY29uc3QgTG9hZGluZ0NvbnRhY3QgPSBzdHlsZWQuZGl2YFxuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgaGVpZ2h0OiAxMDAlO1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBwYWRkaW5nOiAxMHB4O1xuYDtcbmNvbnN0IENlbnRlcmVkRmxleENvbnRhaW5lciA9IHN0eWxlZC5kaXZgXG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICBoZWlnaHQ6IDEwMCU7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIHBhZGRpbmc6IDEwcHg7XG5gO1xuXG4vLy8vLy8vIFN0eWxlZCBDb21wb25lbnRzIC8vLy8vLy9cblxuY29uc3QgVVNFUl9TQ09QRVMgPSBcImNoYW5uZWxzOnJlYWQsY2hhbm5lbHM6d3JpdGUsZ3JvdXBzOnJlYWQsZ3JvdXBzOndyaXRlLHVzZXJzOnJlYWQsY2hhdDp3cml0ZSxpbTpyZWFkLGltOndyaXRlLGZpbGVzOndyaXRlLG1waW06d3JpdGUsbXBpbTpyZWFkLHRlYW06cmVhZFwiO1xuY29uc3QgTUVTU0FHRV9NQVhfTEVOR1RIID0gMTAwMDtcbmV4cG9ydCBjb25zdCBTbGFja1BhbmVsID0gZm9yd2FyZFJlZihmdW5jdGlvbiAocHJvcHMsIHJlZikge1xuICBjb25zdCBbYXV0aENvbXBsZXRlZCwgc2V0QXV0aENvbXBsZXRlZF0gPSB1c2VTdGF0ZShmYWxzZSk7XG4gIGNvbnN0IFthY2Nlc3NUb2tlbiwgc2V0QWNjZXNzVG9rZW5dID0gdXNlU3RhdGUobnVsbCk7XG4gIGNvbnN0IFt1c2VyTGlzdCwgc2V0VXNlckxpc3RdID0gdXNlU3RhdGUoW10pO1xuICBjb25zdCBbY2hhbm5lbExpc3QsIHNldENoYW5uZWxMaXN0XSA9IHVzZVN0YXRlKFtdKTtcbiAgY29uc3QgW3NoYXJpbmdJblByb2dyZXNzLCBzZXRTaGFyaW5nSW5Qcm9ncmVzc10gPSB1c2VTdGF0ZShmYWxzZSk7XG4gIGNvbnN0IFtleHBvcnRGb3JtYXQsIHNldEV4cG9ydEZvcm1hdF0gPSB1c2VTdGF0ZShwcm9wcy5leHBvcnRGb3JtYXQpO1xuICBjb25zdCBbdGFncywgc2V0VGFnc10gPSB1c2VTdGF0ZShbXSk7XG4gIGNvbnN0IFtjaGFubmVsc0xvYWRlZCwgc2V0Q2hhbm5lbHNMb2FkZWRdID0gdXNlU3RhdGUoZmFsc2UpO1xuICBjb25zdCBbdXNlcnNMb2FkZWQsIHNldFVzZXJzTG9hZGVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcbiAgY29uc3QgW2NvbnRhY3RzTG9hZGVkLCBzZXRDb250YWN0c0xvYWRlZF0gPSB1c2VTdGF0ZShmYWxzZSk7XG4gIGNvbnN0IFtpbml0aWFsQ29udGFjdHNMb2FkZWQsIHNldEluaXRpYWxDb250YWN0c0xvYWRlZF0gPSB1c2VTdGF0ZShmYWxzZSk7XG4gIGNvbnN0IFttZXNzYWdlLCBzZXRNZXNzYWdlXSA9IHVzZVN0YXRlKFwiXCIpO1xuICBjb25zdCBbdGV4dEFyZWFIaWRkZW4sIHNldFRleHRBcmVhSGlkZGVuXSA9IHVzZVN0YXRlKGZhbHNlKTtcbiAgY29uc3QgW3RvYXN0VmlzaWJsZSwgc2V0VG9hc3RWaXNpYmxlXSA9IHVzZVN0YXRlKGZhbHNlKTtcbiAgY29uc3QgW3RvYXN0VHlwZSwgc2V0VG9hc3RUeXBlXSA9IHVzZVN0YXRlKFwiaW5mb1wiKTtcbiAgY29uc3QgW3RvYXN0TWVzc2FnZSwgc2V0VG9hc3RNZXNzYWdlXSA9IHVzZVN0YXRlKFwiXCIpO1xuICBjb25zdCBbdXNlck9ubGluZSwgc2V0VXNlck9ubGluZV0gPSB1c2VTdGF0ZSh0cnVlKTtcbiAgY29uc3QgW3dvcmtzcGFjZU5hbWUsIHNldFdvcmtzcGFjZU5hbWVdID0gdXNlU3RhdGUoXCJcIik7XG4gIGNvbnN0IGlzQ2FuY2VsbGVkUmVmID0gdXNlUmVmKGZhbHNlKTtcbiAgY29uc3QgZGlhbG9nUmVmID0gdXNlUmVmKG51bGwpO1xuICBjb25zdCB0YWdJbnB1dFJlZiA9IHVzZVJlZihudWxsKTtcbiAgY29uc3QgcGFuZWxIb3N0ID0gd2luZG93LnNoYXJlUGFuZWxIb3N0O1xuICBjb25zdCB0ZXh0QXJlYVJlZiA9IHVzZVJlZihudWxsKTtcbiAgY29uc3QgY2xlYXJJbnB1dHMgPSB1c2VDYWxsYmFjayhmdW5jdGlvbiAoKSB7XG4gICAgc2V0VGFncyhbXSk7XG4gICAgc2V0TWVzc2FnZShcIlwiKTtcbiAgICBpZiAodGV4dEFyZWFSZWYuY3VycmVudCkge1xuICAgICAgdGV4dEFyZWFSZWYuY3VycmVudC52YWx1ZSA9IFwiXCI7XG4gICAgfVxuICAgIGlmICh0YWdJbnB1dFJlZi5jdXJyZW50KSB7XG4gICAgICB0YWdJbnB1dFJlZi5jdXJyZW50LmNsZWFySW5wdXQoKTtcbiAgICB9XG4gIH0sIFtdKTtcbiAgY29uc3QgY2xvc2VEaWFsb2cgPSB1c2VDYWxsYmFjayhmdW5jdGlvbiAoKSB7XG4gICAgcHJvcHMuc2V0U2xhY2tQYW5lbEFjdGl2ZShmYWxzZSk7XG4gICAgY29uc3QgZGlhbG9nID0gZGlhbG9nUmVmID09PSBudWxsIHx8IGRpYWxvZ1JlZiA9PT0gdm9pZCAwID8gdm9pZCAwIDogZGlhbG9nUmVmLmN1cnJlbnQ7XG4gICAgKGRpYWxvZyA9PT0gbnVsbCB8fCBkaWFsb2cgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGRpYWxvZy5vcGVuKSAmJiAoZGlhbG9nID09PSBudWxsIHx8IGRpYWxvZyA9PT0gdm9pZCAwID8gdm9pZCAwIDogZGlhbG9nLmNsb3NlKCkpO1xuICAgIHBhbmVsSG9zdCA9PT0gbnVsbCB8fCBwYW5lbEhvc3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHBhbmVsSG9zdC5vblBhbmVsQ2xvc2UoKTtcbiAgfSwgW2RpYWxvZ1JlZl0pO1xuXG4gIC8vIEV4cG9zZSBpdCB0byBTaGFyZVBhbmVsQ29udHJvbGxlclxuICB1c2VJbXBlcmF0aXZlSGFuZGxlKHJlZiwgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB7XG4gICAgICBjbG9zZURpYWxvZ1xuICAgIH07XG4gIH0pO1xuICBjb25zdCBzaG93RGlhbG9nID0gdXNlQ2FsbGJhY2soZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGRpYWxvZyA9IGRpYWxvZ1JlZiA9PT0gbnVsbCB8fCBkaWFsb2dSZWYgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGRpYWxvZ1JlZi5jdXJyZW50O1xuICAgIGlmICh1c2VyT25saW5lICYmICFuYXZpZ2F0b3Iub25MaW5lKSB7XG4gICAgICBsb2dUb0luZ2VzdChzaGFyZVBhbmVsSW5nZXN0W1wic2xhY2tfcGFuZWxcIl0sIFwic2xhY2tTaGFyZUVycm9yXCIsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBcIm9mZmxpbmVcIik7XG4gICAgfVxuICAgIHNldFVzZXJPbmxpbmUobmF2aWdhdG9yLm9uTGluZSk7XG4gICAgZGlhbG9nLnNob3coe1xuICAgICAgYW5jaG9yT2Zmc2V0OiBwcm9wcy5wYW5lbExvY2F0aW9uLFxuICAgICAgaXNUcmFuc3BhcmVudDogdHJ1ZSxcbiAgICAgIG9wYWNpdHk6IDEuMCxcbiAgICAgIHNpemU6IHByb3BzLnBhbmVsU2l6ZSxcbiAgICAgIHJlc2l6ZTogXCJ2ZXJ0aWNhbFwiLFxuICAgICAgb3ZlcmZsb3c6IFwic2Nyb2xsXCJcbiAgICB9KTtcbiAgICBkaWFsb2cuYWRkRXZlbnRMaXN0ZW5lcihcImxvYWRcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgZGlhbG9nLmZvY3VzKCk7XG4gICAgICBkaWFsb2cuaGFzTG9hZGVkID0gdHJ1ZTtcbiAgICAgIHBhbmVsSG9zdCA9PT0gbnVsbCB8fCBwYW5lbEhvc3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHBhbmVsSG9zdC5vblBhbmVsT3BlbigpO1xuICAgIH0sIHtcbiAgICAgIG9uY2U6IHRydWVcbiAgICB9KTtcbiAgICBjbGVhcklucHV0cygpO1xuICAgIHByb3BzLnNldFNsYWNrUGFuZWxBY3RpdmUodHJ1ZSk7XG5cbiAgICAvLyB0ZW1wXG4gICAgLy8gc2hvd1RvYXN0KFwic3VjY2Vzc1wiLCBcIlNsYWNrIHBhbmVsIG9wZW5lZFwiKTtcbiAgfSwgW2RpYWxvZ1JlZiwgcHJvcHNdKTtcbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodXNlckxpc3QgIT09IG51bGwgJiYgdXNlckxpc3QgIT09IHZvaWQgMCAmJiB1c2VyTGlzdC5sZW5ndGggJiYgY2hhbm5lbExpc3QgIT09IG51bGwgJiYgY2hhbm5lbExpc3QgIT09IHZvaWQgMCAmJiBjaGFubmVsTGlzdC5sZW5ndGgpIHtcbiAgICAgIHNldEluaXRpYWxDb250YWN0c0xvYWRlZCh0cnVlKTtcbiAgICB9XG4gIH0sIFt1c2VyTGlzdCwgY2hhbm5lbExpc3RdKTtcbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBsb2coXCIgY29udGFjdHMgbG9hZGVkOlwiLCB1c2Vyc0xvYWRlZCAmJiBjaGFubmVsc0xvYWRlZCk7XG4gICAgc2V0Q29udGFjdHNMb2FkZWQodXNlcnNMb2FkZWQgJiYgY2hhbm5lbHNMb2FkZWQpO1xuICB9LCBbdXNlcnNMb2FkZWQsIGNoYW5uZWxzTG9hZGVkXSk7XG4gIGNvbnN0IGZldGNoRGF0YSA9IGFzeW5jIGZ1bmN0aW9uIChhY2Nlc3NfdG9rZW4sIGZvcmNlID0gZmFsc2UpIHtcbiAgICBsb2coXCJGZXRjaGluZyBkYXRhXCIpO1xuICAgIGxldCB1c2VyX2RhdGEgPSB3aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0oU0xBQ0tfVVNFUl9EQVRBKTtcbiAgICBsZXQgdXNlcl9kYXRhX2FyciA9IHVzZXJfZGF0YSA/IEpTT04ucGFyc2UodXNlcl9kYXRhKSA6IFtdO1xuICAgIGlmICghZm9yY2UgJiYgdXNlcl9kYXRhX2FyciAmJiB1c2VyX2RhdGFfYXJyLmxlbmd0aCA+IDApIHtcbiAgICAgIHNldFVzZXJMaXN0KHVzZXJfZGF0YV9hcnIpO1xuICAgICAgc2V0VXNlcnNMb2FkZWQodHJ1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIEZldGNoVXNlcnMoYWNjZXNzX3Rva2VuLCBzZXRVc2VyTGlzdCkudGhlbihmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICBsb2coZGF0YSk7XG4gICAgICAgIHNldFVzZXJzTG9hZGVkKHRydWUpO1xuICAgICAgICB3aW5kb3cubG9jYWxTdG9yYWdlLnNldEl0ZW0oU0xBQ0tfVVNFUl9EQVRBLCBKU09OLnN0cmluZ2lmeShkYXRhKSk7XG4gICAgICB9KS5jYXRjaChmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgIGVycm9yKFwiRXJyb3IgZmV0Y2hpbmcgdXNlcnM6XCIsIGVycik7XG4gICAgICB9KTtcbiAgICB9XG4gICAgbGV0IGNoYW5uZWxfZGF0YSA9IHdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbShTTEFDS19DSEFOTkVMX0RBVEEpO1xuICAgIGxldCBjaGFubmVsX2RhdGFfYXJyID0gY2hhbm5lbF9kYXRhID8gSlNPTi5wYXJzZShjaGFubmVsX2RhdGEpIDogW107XG4gICAgaWYgKCFmb3JjZSAmJiBjaGFubmVsX2RhdGFfYXJyICYmIGNoYW5uZWxfZGF0YV9hcnIubGVuZ3RoID4gMCkge1xuICAgICAgc2V0Q2hhbm5lbExpc3QoY2hhbm5lbF9kYXRhX2Fycik7XG4gICAgICBzZXRDaGFubmVsc0xvYWRlZCh0cnVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgRmV0Y2hDaGFubmVscyhhY2Nlc3NfdG9rZW4sIHNldENoYW5uZWxMaXN0KS50aGVuKGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgIGxvZyhkYXRhKTtcbiAgICAgICAgc2V0Q2hhbm5lbHNMb2FkZWQodHJ1ZSk7XG4gICAgICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbShTTEFDS19DSEFOTkVMX0RBVEEsIEpTT04uc3RyaW5naWZ5KGRhdGEpKTtcbiAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgZXJyb3IoXCJFcnJvciBmZXRjaGluZyBjaGFubmVsczpcIiwgZXJyKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBsZXQgd29ya3NwYWNlX25hbWUgPSB3aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0oU0xBQ0tfV09SS1NQQUNFX05BTUUpO1xuICAgIGlmICh3b3Jrc3BhY2VfbmFtZSkge1xuICAgICAgc2V0V29ya3NwYWNlTmFtZSh3b3Jrc3BhY2VfbmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIEZldGNoV29ya3NwYWNlTmFtZShhY2Nlc3NfdG9rZW4pLnRoZW4oZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgc2V0V29ya3NwYWNlTmFtZShuYW1lKTtcbiAgICAgICAgd2luZG93LmxvY2FsU3RvcmFnZS5zZXRJdGVtKFNMQUNLX1dPUktTUEFDRV9OQU1FLCBuYW1lKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBzdG9yYWdlLnNlY3VyZVN0b3JhZ2UuZ2V0SXRlbShTTEFDS19BQ0NFU1NfVE9LRU4pLnRoZW4oZnVuY3Rpb24gKGFjY2Vzc190b2tlbl92YWwpIHtcbiAgICAgIGlmIChhY2Nlc3NfdG9rZW5fdmFsKSB7XG4gICAgICAgIGNvbnN0IGFjY2Vzc190b2tlbiA9IFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgYWNjZXNzX3Rva2VuX3ZhbCk7XG4gICAgICAgIHNldEFjY2Vzc1Rva2VuKGFjY2Vzc190b2tlbik7XG4gICAgICB9XG4gICAgfSk7XG4gIH0sIFtdKTtcbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAocHJvcHMuZXhwb3J0Rm9ybWF0ICYmIHByb3BzLmV4cG9ydEZvcm1hdCAhPT0gZXhwb3J0Rm9ybWF0KSB7XG4gICAgICBzZXRFeHBvcnRGb3JtYXQocHJvcHMuZXhwb3J0Rm9ybWF0KTtcbiAgICB9XG4gIH0sIFtwcm9wcy5leHBvcnRGb3JtYXRdKTtcbiAgY29uc3QgY2xlYXJQbHVnaW5EYXRhID0gZnVuY3Rpb24gKCkge1xuICAgIGxvZyhcImNsZWFyaW5nIHBsdWdpbiBkYXRhXCIpO1xuICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShTTEFDS19VU0VSX0RBVEEpO1xuICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShTTEFDS19DSEFOTkVMX0RBVEEpO1xuICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShTTEFDS19TQ09QRVMpO1xuICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShTTEFDS19XT1JLU1BBQ0VfTkFNRSk7XG4gICAgc3RvcmFnZS5zZWN1cmVTdG9yYWdlLnJlbW92ZUl0ZW0oU0xBQ0tfQUNDRVNTX1RPS0VOKTtcbiAgICBzZXRVc2Vyc0xvYWRlZChmYWxzZSk7XG4gICAgc2V0Q2hhbm5lbHNMb2FkZWQoZmFsc2UpO1xuICAgIHNldENvbnRhY3RzTG9hZGVkKGZhbHNlKTtcbiAgICBzZXRJbml0aWFsQ29udGFjdHNMb2FkZWQoZmFsc2UpO1xuICAgIHNldFVzZXJMaXN0KFtdKTtcbiAgICBzZXRDaGFubmVsTGlzdChbXSk7XG4gICAgc2V0TWVzc2FnZShcIlwiKTtcbiAgICBzZXRUYWdzKFtdKTtcbiAgICBzZXRXb3Jrc3BhY2VOYW1lKFwiXCIpO1xuICB9O1xuICBjb25zdCBoYXNTY29wZUNoYW5nZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgbGV0IHN0b3JlZFNjb3BlcyA9IHdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbShTTEFDS19TQ09QRVMpO1xuICAgIGlmIChzdG9yZWRTY29wZXMgJiYgc3RvcmVkU2NvcGVzICE9IFVTRVJfU0NPUEVTKSB7XG4gICAgICAvLyBSZS1hdXRoIGlmIHNjb3BlcyBoYXZlIGNoYW5nZWRcbiAgICAgIGNsZWFyUGx1Z2luRGF0YSgpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAocHJvcHMudmlzaWJsZSkge1xuICAgICAgc2hvd0RpYWxvZygpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjbG9zZURpYWxvZygpO1xuICAgIH1cbiAgfSwgW3Byb3BzLnZpc2libGVdKTtcbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoYWNjZXNzVG9rZW4gJiYgIWhhc1Njb3BlQ2hhbmdlZCgpKSB7XG4gICAgICBzZXRBdXRoQ29tcGxldGVkKHRydWUpO1xuICAgIH1cbiAgfSwgW2FjY2Vzc1Rva2VuXSk7XG4gIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGF1dGhDb21wbGV0ZWQpIHtcbiAgICAgIHN0b3JhZ2Uuc2VjdXJlU3RvcmFnZS5nZXRJdGVtKFNMQUNLX0FDQ0VTU19UT0tFTikudGhlbihmdW5jdGlvbiAodmFsKSB7XG4gICAgICAgIGNvbnN0IGFjY2Vzc190b2tlbiA9IFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgdmFsKTtcbiAgICAgICAgc2V0QWNjZXNzVG9rZW4oYWNjZXNzX3Rva2VuKTtcbiAgICAgICAgbG9nKGFjY2Vzc190b2tlbik7XG4gICAgICAgIGZldGNoRGF0YShhY2Nlc3NfdG9rZW4pO1xuICAgICAgICBHZXRVc2VyU2NvcGUoYWNjZXNzX3Rva2VuKS50aGVuKGZ1bmN0aW9uIChzY29wZSkge1xuICAgICAgICAgIGxvZyhcIlVzZXIgc2NvcGU6XCIsIHNjb3BlKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbShTTEFDS19TQ09QRVMsIFVTRVJfU0NPUEVTKTtcbiAgICB9XG4gIH0sIFthdXRoQ29tcGxldGVkXSk7XG4gIGNvbnN0IGhhbmRsZUdsb2JhbE1vdXNlRG93biA9IGZ1bmN0aW9uIChldmVudCwgY29vcmRpbmF0ZXMpIHtcbiAgICBpZiAoIXByb3BzLnZpc2libGUpIHJldHVybjtcbiAgICBpZiAoIWlzSW5Cb3VuZGFyeShjb29yZGluYXRlcywgcHJvcHMucGFuZWxMb2NhdGlvbikgJiYgcHJvcHMuYnV0dG9uTG9jYXRpb24gJiYgIWlzSW5Cb3VuZGFyeShjb29yZGluYXRlcywgcHJvcHMuYnV0dG9uTG9jYXRpb24pKSB7XG4gICAgICBjbG9zZURpYWxvZygpO1xuICAgIH1cbiAgfTtcbiAgY29uc3QgaGFuZGxlS2V5RG93biA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgIGlmIChldmVudC5rZXkgPT09IEVTQ0FQRV9LRVkpIHtcbiAgICAgIGNsb3NlRGlhbG9nKCk7XG4gICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09IEVOVEVSX0tFWSkge1xuICAgICAgLy8gVG9EbyA6IEhhbmRsZSB0aGlzXG4gICAgfVxuICB9O1xuXG4gIC8vIEF0dGFjaCBuZXcgY29weSBvZiBoYW5kbGVHbG9iYWxNb3VzZURvd24gb24gZXZlcnkgcmVuZGVyXG4gIC8vIGFzIHRoZSBoYW5kbGVHbG9iYWxNb3VzZURvd24gbmVlZHMgdXBkYXRlZCBkaWFsb2dMb2NhdGlvbiB2YWx1ZVxuICBjb25zdCBkaWFsb2dJZCA9IGBTTEFDSy1ESUFMT0ctJHtEYXRlLm5vdygpfWA7XG4gIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKFVYUEV2ZW50VHlwZXMuS0VZRE9XTiwgaGFuZGxlS2V5RG93bik7XG4gICAgc2V0RGlhbG9nTGlzdGVuZXIoT1NfRVZFTlRTLk1PVVNFX0RPV04sIGRpYWxvZ0lkLCBoYW5kbGVHbG9iYWxNb3VzZURvd24pO1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUV2ZW50TGlzdGVuZXIoVVhQRXZlbnRUeXBlcy5LRVlET1dOLCBoYW5kbGVLZXlEb3duKTtcbiAgICAgIHJlbW92ZURpYWxvZ0xpc3RlbmVycyhkaWFsb2dJZCk7XG4gICAgfTtcbiAgfSwgW2RpYWxvZ0lkXSk7XG4gIGZ1bmN0aW9uIHNob3dUb2FzdCh0eXBlLCBtc2cpIHtcbiAgICBzZXRUb2FzdFR5cGUodHlwZSk7XG4gICAgc2V0VG9hc3RNZXNzYWdlKG1zZyk7XG4gICAgc2V0VG9hc3RWaXNpYmxlKHRydWUpO1xuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgc2V0VG9hc3RWaXNpYmxlKGZhbHNlKTtcbiAgICB9LCA1MDAwKTtcbiAgfVxuICBjb25zdCB0cnVuY2F0ZUZpbGVOYW1lID0gZnVuY3Rpb24gKGZpbGVOYW1lKSB7XG4gICAgaWYgKGZpbGVOYW1lLmxlbmd0aCA+IDIwKSB7XG4gICAgICByZXR1cm4gZmlsZU5hbWUuc2xpY2UoMCwgOCkgKyAnLi4uJyArIGZpbGVOYW1lLnNsaWNlKC02KTtcbiAgICB9XG4gICAgcmV0dXJuIGZpbGVOYW1lO1xuICB9O1xuICBjb25zdCBoYW5kbGVGaWxlU2hhcmUgPSBhc3luYyBmdW5jdGlvbiAoZXhwb3J0Rm9ybWF0KSB7XG4gICAgaWYgKHRhZ3MgIT09IG51bGwgJiYgdGFncyAhPT0gdm9pZCAwICYmIHRhZ3MubGVuZ3RoICYmIGFjY2Vzc1Rva2VuKSB7XG4gICAgICBjb25zdCBkb2MgPSBhcHAuYWN0aXZlRG9jdW1lbnQ7XG4gICAgICBjb25zdCB0aXRsZSA9IGRvYy50aXRsZTtcbiAgICAgIGNvbnN0IGJhc2VGaWxlTmFtZSA9IHRpdGxlICYmIHRpdGxlLmluY2x1ZGVzKFwiLlwiKSA/IHRpdGxlLnNwbGl0KFwiLlwiKS5zbGljZSgwLCAtMSkuam9pbihcIi5cIikgOiB0aXRsZSB8fCBcIlVudGl0bGVkXCI7XG4gICAgICBjb25zdCBmaWxlTmFtZSA9IGAke2Jhc2VGaWxlTmFtZX0uJHtleHBvcnRGb3JtYXR9YDtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGFuZWxIb3N0LmdldEZpbGVQYXRoRm9yU2xhY2tTaGFyaW5nKGV4cG9ydEZvcm1hdCwgcHJvcHMuc2VsZWN0ZWRTaXplKTtcbiAgICAgIGNvbnN0IGZpbGVCdWZmZXIgPSBhd2FpdCBmcy5yZWFkRmlsZShmaWxlUGF0aCk7XG4gICAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuICAgICAgZm9ybURhdGEuYXBwZW5kKFwiZmlsZVwiLCBmaWxlQnVmZmVyLCBmaWxlTmFtZSk7XG4gICAgICBjb25zdCBmaWxlU2l6ZSA9IGZpbGVCdWZmZXIuYnl0ZUxlbmd0aDtcbiAgICAgIGNvbnN0IHByb2Nlc3NNZXNzYWdlID0gYXN5bmMgZnVuY3Rpb24gKGlkKSB7XG4gICAgICAgIC8vIFN0ZXAgMTogR2V0IFVwbG9hZCBVUkxcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvcy5wb3N0KFwiaHR0cHM6Ly9zbGFjay5jb20vYXBpL2ZpbGVzLmdldFVwbG9hZFVSTEV4dGVybmFsXCIsIG51bGwsIHtcbiAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7YWNjZXNzVG9rZW59YCxcbiAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgIGZpbGVuYW1lOiBmaWxlTmFtZSxcbiAgICAgICAgICAgIGxlbmd0aDogZmlsZVNpemVcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoaXNDYW5jZWxsZWRSZWYuY3VycmVudCkge1xuICAgICAgICAgIGlzQ2FuY2VsbGVkUmVmLmN1cnJlbnQgPSBmYWxzZTtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTaGFyaW5nIENhbmNlbGxlZFwiKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgdXBsb2FkX3VybCxcbiAgICAgICAgICBmaWxlX2lkXG4gICAgICAgIH0gPSByZXNwb25zZS5kYXRhO1xuICAgICAgICBpZiAoIXVwbG9hZF91cmwpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJGYWlsZWQgdG8gZ2V0IHVwbG9hZCBVUkwuXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU3RlcCAyOiBVcGxvYWQgRmlsZVxuICAgICAgICAvLyBXZSBkb24ndCBuZWVkIHRvIGJsb2NrIHRoZSB1c2VyIHdoaWxlIHVwbG9hZGluZyB0aGUgZmlsZS4gQnV0IHNob3VsZCB3ZT9cbiAgICAgICAgY29uc3QgdXBsb2FkUmVzcG9uc2UgPSBhd2FpdCBheGlvcy5wb3N0KHVwbG9hZF91cmwsIGZvcm1EYXRhLCB7XG4gICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke2FjY2Vzc1Rva2VufWAsXG4gICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcIm11bHRpcGFydC9mb3JtLWRhdGFcIlxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChpc0NhbmNlbGxlZFJlZi5jdXJyZW50KSB7XG4gICAgICAgICAgaXNDYW5jZWxsZWRSZWYuY3VycmVudCA9IGZhbHNlO1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlNoYXJpbmcgQ2FuY2VsbGVkXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh1cGxvYWRSZXNwb25zZS5zdGF0dXMgIT09IDIwMCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkZhaWxlZCB0byB1cGxvYWQgZmlsZS5cIik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTdGVwIDM6IENvbXBsZXRlIFVwbG9hZFxuICAgICAgICBjb25zdCBjb21wbGV0ZVJlc3BvbnNlID0gYXdhaXQgYXhpb3MucG9zdChcImh0dHBzOi8vc2xhY2suY29tL2FwaS9maWxlcy5jb21wbGV0ZVVwbG9hZEV4dGVybmFsXCIsIHtcbiAgICAgICAgICBmaWxlczogW3tcbiAgICAgICAgICAgIGlkOiBmaWxlX2lkXG4gICAgICAgICAgfV0sXG4gICAgICAgICAgY2hhbm5lbF9pZDogaWQsXG4gICAgICAgICAgaW5pdGlhbF9jb21tZW50OiBtZXNzYWdlXG4gICAgICAgIH0sIHtcbiAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgICAgIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHthY2Nlc3NUb2tlbn1gXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKCFjb21wbGV0ZVJlc3BvbnNlLmRhdGEub2spIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJGYWlsZWQgdG8gY29tcGxldGUgdXBsb2FkLlwiKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIC8vIHNlbmQgdG8gbXVsdGlwbGUgY2hhbm5lbHNcbiAgICAgIGxldCBjaGFubmVscyA9IHRhZ3MuZmlsdGVyKGZ1bmN0aW9uICh0YWcpIHtcbiAgICAgICAgcmV0dXJuIHRhZy50eXBlID09IFwiY2hhbm5lbFwiO1xuICAgICAgfSk7XG4gICAgICBsZXQgdXNlcnMgPSB0YWdzLmZpbHRlcihmdW5jdGlvbiAodGFnKSB7XG4gICAgICAgIHJldHVybiB0YWcudHlwZSA9PSBcInVzZXJcIjtcbiAgICAgIH0pO1xuICAgICAgbG9nVG9Jbmdlc3Qoc2hhcmVQYW5lbEluZ2VzdFtcInNsYWNrX3BhbmVsXCJdLCBcImRlc3RpbmF0aW9uQ2xpY2tcIiwgdW5kZWZpbmVkLCAoY2hhbm5lbHMgJiYgY2hhbm5lbHMubGVuZ3RoIHx8IDApLnRvU3RyaW5nKCksICh1c2VycyAmJiB1c2Vycy5sZW5ndGggfHwgMCkudG9TdHJpbmcoKSk7XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChjaGFubmVscy5tYXAoZnVuY3Rpb24gKGNoYW5uZWwpIHtcbiAgICAgICAgcmV0dXJuIHByb2Nlc3NNZXNzYWdlKGNoYW5uZWwuaWQpO1xuICAgICAgfSkpO1xuXG4gICAgICAvLyBzZW5kIHRvIG11bHRpcGxlL3NpbmdsZSB1c2VycywgY3JlYXRlIGEgZ3JvdXAgY29udmVyc2F0aW9uXG4gICAgICBpZiAoKHVzZXJzID09PSBudWxsIHx8IHVzZXJzID09PSB2b2lkIDAgPyB2b2lkIDAgOiB1c2Vycy5sZW5ndGgpID4gMCkge1xuICAgICAgICBsZXQgaWRMaXN0ID0gdXNlcnMubWFwKGZ1bmN0aW9uICh1c2VyKSB7XG4gICAgICAgICAgcmV0dXJuIHVzZXIuaWQ7XG4gICAgICAgIH0pO1xuICAgICAgICBsZXQgY29udmVyc2F0aW9uSWQgPSBhd2FpdCBHZXRDb252ZXJzYXRpb25Gb3JVc2VycyhhY2Nlc3NUb2tlbiwgaWRMaXN0KTtcbiAgICAgICAgYXdhaXQgcHJvY2Vzc01lc3NhZ2UoY29udmVyc2F0aW9uSWQpO1xuICAgICAgICBsb2dUb0luZ2VzdChzaGFyZVBhbmVsSW5nZXN0W1wic2xhY2tfcGFuZWxcIl0sIFwic2xhY2tNZXNzYWdlXCIsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBtZXNzYWdlLmxlbmd0aCA/IFwidXNlciBtZXNzYWdlXCIgOiBcImRlZmF1bHQgbWVzc2FnZVwiKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIGNvbnN0IGhhbmRsZVNoYXJlID0gYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGlmICghbmF2aWdhdG9yLm9uTGluZSkge1xuICAgICAgbG9nVG9Jbmdlc3Qoc2hhcmVQYW5lbEluZ2VzdFtcInNsYWNrX3BhbmVsXCJdLCBcInNsYWNrU2hhcmVFcnJvclwiLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgXCJuZXR3b3JrIGVycm9yXCIpO1xuICAgICAgc2hvd1RvYXN0KFwid2FybmluZ1wiLCBsb2NhbGl6ZSgnVE9BU1RfTkVUV09SS19FUlJPUicpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc2V0U2hhcmluZ0luUHJvZ3Jlc3ModHJ1ZSk7XG4gICAgY29uc3QgdGl0bGUgPSBhcHAuYWN0aXZlRG9jdW1lbnQudGl0bGU7XG4gICAgY29uc3QgYmFzZUZpbGVOYW1lID0gdGl0bGUgJiYgdGl0bGUuaW5jbHVkZXMoXCIuXCIpID8gdGl0bGUuc3BsaXQoXCIuXCIpLnNsaWNlKDAsIC0xKS5qb2luKFwiLlwiKSA6IHRpdGxlIHx8IFwiVW50aXRsZWRcIjtcbiAgICBjb25zdCB0cnVuY2F0ZWROYW1lID0gdHJ1bmNhdGVGaWxlTmFtZShiYXNlRmlsZU5hbWUpO1xuICAgIGNvbnN0IGZpbGVOYW1lID0gYCR7dHJ1bmNhdGVkTmFtZX0uJHtleHBvcnRGb3JtYXR9YDtcbiAgICB0cnkge1xuICAgICAgaWYgKGFwcC5hY3RpdmVEb2N1bWVudCkge1xuICAgICAgICBsb2dUb0luZ2VzdChzaGFyZVBhbmVsSW5nZXN0W1wic2xhY2tfcGFuZWxcIl0sIFwic2xhY2tTaGFyZUZpbGVUeXBlXCIsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHByb3BzLnNlbGVjdGVkU2l6ZVR5cGUgPT09IFwic21hbGxcIiA/IFwiU21hbGxcIiA6IFwiT3JpZ2luYWxcIiwgZXhwb3J0Rm9ybWF0LnRvVXBwZXJDYXNlKCkpO1xuICAgICAgfVxuICAgICAgLy8gbG9jYWwgZmlsZSBzaGFyZVxuICAgICAgYXdhaXQgaGFuZGxlRmlsZVNoYXJlKGV4cG9ydEZvcm1hdCk7XG4gICAgICBzZXRTaGFyaW5nSW5Qcm9ncmVzcyhmYWxzZSk7XG4gICAgICBsb2dUb0luZ2VzdChzaGFyZVBhbmVsSW5nZXN0W1wic2xhY2tfcGFuZWxcIl0sIFwic2xhY2tTaGFyZVN1Y2Nlc3NcIik7XG4gICAgICBzaG93VG9hc3QoXCJzdWNjZXNzXCIsIGAke2ZpbGVOYW1lfSAke2xvY2FsaXplKCdUT0FTVF9TSEFSRV9TVUNDRVNTJyl9YCk7XG4gICAgICBjbGVhcklucHV0cygpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgZXJyb3IoXCJFcnJvciBzaGFyaW5nOlwiLCBlcnIpO1xuICAgICAgc2V0U2hhcmluZ0luUHJvZ3Jlc3MoZmFsc2UpO1xuICAgICAgaWYgKGVyci5tZXNzYWdlICE9PSBcIlNoYXJpbmcgQ2FuY2VsbGVkXCIpIHtcbiAgICAgICAgbG9nVG9Jbmdlc3Qoc2hhcmVQYW5lbEluZ2VzdFtcInNsYWNrX3BhbmVsXCJdLCBcInNsYWNrU2hhcmVFcnJvclwiLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgXCJnZW5lcmljIHNoYXJlIGVycm9yXCIpO1xuICAgICAgICBzaG93VG9hc3QoXCJ3YXJuaW5nXCIsIGAke2ZpbGVOYW1lfSAke2xvY2FsaXplKCdUT0FTVF9TSEFSRV9FUlJPUicpfWApO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgY29uc3QgaGFuZGxlU2hhcmVDYW5jZWwgPSBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgaXNDYW5jZWxsZWRSZWYuY3VycmVudCA9IHRydWU7XG4gICAgc2V0U2hhcmluZ0luUHJvZ3Jlc3MoZmFsc2UpO1xuICB9O1xuICBjb25zdCBnZXRVc2VyTGlzdCA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gWy4uLnVzZXJMaXN0Lm1hcChmdW5jdGlvbiAodXNlcikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaWQ6IHVzZXIuaWQsXG4gICAgICAgIGxkYXA6IHVzZXIubmFtZSxcbiAgICAgICAgbmFtZTogdXNlci5yZWFsX25hbWUgfHwgdXNlci5uYW1lLFxuICAgICAgICB0eXBlOiBcInVzZXJcIlxuICAgICAgfTtcbiAgICB9KV07XG4gIH07XG4gIGNvbnN0IGdldENoYW5uZWxMaXN0ID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBbLi4uY2hhbm5lbExpc3QubWFwKGZ1bmN0aW9uIChjaGFubmVsKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBpZDogY2hhbm5lbC5pZCxcbiAgICAgICAgbmFtZTogY2hhbm5lbC5uYW1lLFxuICAgICAgICB0eXBlOiBcImNoYW5uZWxcIixcbiAgICAgICAgcHJpdmF0ZTogY2hhbm5lbC5pc19wcml2YXRlXG4gICAgICB9O1xuICAgIH0pXTtcbiAgfTtcbiAgY29uc3QgaGFuZGxlTWVzc2FnZUNoYW5nZSA9IGZ1bmN0aW9uIChldnQpIHtcbiAgICBzZXRNZXNzYWdlKGV2dC50YXJnZXQudmFsdWUpO1xuICB9O1xuXG4gIC8vIFRPRE86IGNvbWJpbmUgc3luYyBhbmQgbG9nb3V0IGludG8gbW9yZSBkcm9wZG93blxuICBjb25zdCBoYW5kbGVNb3JlID0gZnVuY3Rpb24gKCkge307XG4gIGNvbnN0IGhhbmRsZVN5bmMgPSBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCFhdXRoQ29tcGxldGVkIHx8ICFjb250YWN0c0xvYWRlZCB8fCAhdXNlck9ubGluZSkgcmV0dXJuO1xuICAgIHNldFVzZXJzTG9hZGVkKGZhbHNlKTtcbiAgICBzZXRDaGFubmVsc0xvYWRlZChmYWxzZSk7XG4gICAgc2V0Q29udGFjdHNMb2FkZWQoZmFsc2UpO1xuICAgIGZldGNoRGF0YShhY2Nlc3NUb2tlbiwgdHJ1ZSk7XG4gIH07XG4gIGNvbnN0IGhhbmRsZUxvZ091dCA9IGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIWF1dGhDb21wbGV0ZWQpIHJldHVybjtcbiAgICBjbGVhclBsdWdpbkRhdGEoKTtcbiAgICBzZXRBdXRoQ29tcGxldGVkKGZhbHNlKTtcbiAgfTtcbiAgY29uc3QgaGFuZGxlQmFjayA9IGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBjbG9zZURpYWxvZygpO1xuICAgIHByb3BzLm9wZW5Mb2NhbFNoYXJlUGFuZWwoKTtcbiAgfTtcbiAgY29uc3QgZ2V0Q2xhc3NOYW1lID0gZnVuY3Rpb24gKG5hbWUsIGlzUmVmcmVzaCA9IGZhbHNlKSB7XG4gICAgbGV0IGRpc2FibGVkID0gIWF1dGhDb21wbGV0ZWQ7XG4gICAgaWYgKGlzUmVmcmVzaCkge1xuICAgICAgZGlzYWJsZWQgfD0gIWNvbnRhY3RzTG9hZGVkIHx8ICF1c2VyT25saW5lO1xuICAgIH1cbiAgICByZXR1cm4gZGlzYWJsZWQgPyBuYW1lICsgXCItZGlzYWJsZWRcIiA6IG5hbWU7XG4gIH07XG4gIGNvbnN0IGhlYWRlclZpZXcgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChIZWFkZXJWaWV3Q29udGFpbmVyLCBudWxsLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChIZWFkZXJWaWV3LCBudWxsLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwLWFjdGlvbi1idXR0b25cIiwge1xuICAgIHNpemU6IFwic1wiLFxuICAgIHF1aWV0OiB0cnVlLFxuICAgIG9uQ2xpY2s6IGhhbmRsZUJhY2tcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoSWNvblNsb3QsIG51bGwsIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEJhY2tJY29uLCB7XG4gICAgY2xhc3NOYW1lOiBcImljb24tc3R5bGVcIlxuICB9KSkpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChIZWFkZXJUZXh0VmlldywgbnVsbCwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcC1oZWFkaW5nXCIsIHtcbiAgICBzaXplOiBcInNcIixcbiAgICBzdHlsZToge1xuICAgICAgbWFyZ2luOiAwXG4gICAgfVxuICB9LCBsb2NhbGl6ZSgnU0xBQ0tfUEFORUxfSEVBRElORycpKSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIG51bGwsIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3AtYWN0aW9uLWJ1dHRvblwiLCB7XG4gICAgc2l6ZTogXCJzXCIsXG4gICAgcXVpZXQ6IHRydWUsXG4gICAgb25DbGljazogaGFuZGxlTG9nT3V0LFxuICAgIHRpdGxlOiBsb2NhbGl6ZSgnTE9HT1VUJylcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoSWNvblNsb3QsIG51bGwsIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KExvZ291dCwge1xuICAgIGNsYXNzTmFtZTogZ2V0Q2xhc3NOYW1lKFwiaWNvbi1zdHlsZVwiKVxuICB9KSkpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwLWFjdGlvbi1idXR0b25cIiwge1xuICAgIHNpemU6IFwic1wiLFxuICAgIHF1aWV0OiB0cnVlLFxuICAgIG9uQ2xpY2s6IGhhbmRsZVN5bmMsXG4gICAgdGl0bGU6IGxvY2FsaXplKCdSRUZSRVNIX0NPTlRBQ1RTJylcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoSWNvblNsb3QsIG51bGwsIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJlZnJlc2gsIHtcbiAgICBjbGFzc05hbWU6IGdldENsYXNzTmFtZShcImljb24tc3R5bGVcIiwgdHJ1ZSlcbiAgfSkpKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcC1hY3Rpb24tYnV0dG9uXCIsIHtcbiAgICBzaXplOiBcInNcIixcbiAgICBxdWlldDogdHJ1ZSxcbiAgICBvbkNsaWNrOiBjbG9zZURpYWxvZ1xuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChJY29uU2xvdCwgbnVsbCwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ2xvc2UsIHtcbiAgICBjbGFzc05hbWU6IFwiaWNvbi1zdHlsZVwiXG4gIH0pKSkpKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcC1sYWJlbFwiLCB7XG4gICAgc3R5bGU6IHtcbiAgICAgIG1hcmdpbkxlZnQ6ICczMnB4J1xuICAgIH1cbiAgfSwgd29ya3NwYWNlTmFtZSkpO1xuXG4gIC8vIElzc3VlOiBIaWRlIGFjdHVhbCB0ZXh0YXJlYSBhbmQgcmVuZGVyIHRoZSBwc2V1ZG8gY29tbWVudCBhcmVhIHdoZSB0YWdzIGRyb3Bkb3duIGlzIGFjdGl2ZVxuICAvLyBPdGhlcndpc2UsIHRoZSB0ZXh0IGJveCB3aWxsIGFwcGVhciBvbiB0b3Agb2YgZHJvcGRvd25cbiAgY29uc3QgY29tbWVudFZpZXcgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChDb21tZW50QXJlYVZpZXcsIG51bGwsIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3AtbGFiZWxcIiwge1xuICAgIGZvcjogXCJjb21tZW50LW1cIixcbiAgICBzaXplOiBcIm1cIlxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwgbnVsbCwgbG9jYWxpemUoJ01FU1NBR0VfTEFCRUwnKSksIG1lc3NhZ2UubGVuZ3RoID49IE1FU1NBR0VfTUFYX0xFTkdUSCAtIDEwICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgY2xhc3NOYW1lOiBcImVycm9yLXN0eWxlXCIsXG4gICAgc3R5bGU6IHtcbiAgICAgIHBhZGRpbmdMZWZ0OiBcIjZweFwiXG4gICAgfVxuICB9LCBgJHtsb2NhbGl6ZSgnQ0hBUkFDVEVSU19SRU1BSU5JTkcnKX06ICR7TUVTU0FHRV9NQVhfTEVOR1RIIC0gbWVzc2FnZS5sZW5ndGh9YCkpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChDb21tZW50QXJlYUNvbnRhaW5lciwgbnVsbCwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcC10ZXh0YXJlYVwiLCB7XG4gICAgcmVmOiB0ZXh0QXJlYVJlZixcbiAgICBpZDogXCJjb21tZW50LW1cIixcbiAgICBwbGFjZWhvbGRlcjogbG9jYWxpemUoJ01FU1NBR0VfUExBQ0VIT0xERVInKSxcbiAgICBzdHlsZToge1xuICAgICAgcG9zaXRpb246IFwiYWJzb2x1dGVcIixcbiAgICAgIHdpZHRoOiBcIjEwMCVcIixcbiAgICAgIGhlaWdodDogXCI4NXB4XCIsXG4gICAgICB2aXNpYmlsaXR5OiB0ZXh0QXJlYUhpZGRlbiA/IFwiaGlkZGVuXCIgOiBcInZpc2libGVcIlxuICAgIH0sXG4gICAgbWF4TGVuZ3RoOiBNRVNTQUdFX01BWF9MRU5HVEgsXG4gICAgb25JbnB1dDogaGFuZGxlTWVzc2FnZUNoYW5nZSxcbiAgICB2YWx1ZTogbWVzc2FnZSxcbiAgICBvbktleURvd246IGZ1bmN0aW9uIChlKSB7XG4gICAgICAvLyBQcmV2ZW50IHNwYWNlYmFyIG9yIG90aGVyIGtleXMgZnJvbSBidWJibGluZyB0byBwYXJlbnQgZGlhbG9nXG4gICAgICBpZiAoZS5rZXkgPT09IFwiIFwiIHx8IGUua2V5ID09PSBcIlNwYWNlYmFyXCIpIHtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChQc2V1ZG9Db21tZW50QXJlYSwge1xuICAgIGhpZGRlbjogIXRleHRBcmVhSGlkZGVuXG4gIH0sIG1lc3NhZ2UpKSk7XG4gIGNvbnN0IGZvb3RlclZpZXcgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChGb290ZXIsIG51bGwsIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3AtYnV0dG9uXCIsIHtcbiAgICB2YXJpYW50OiBcImN0YVwiLFxuICAgIG9uQ2xpY2s6IGhhbmRsZVNoYXJlLFxuICAgIGRpc2FibGVkOiAhc2hhcmluZ0luUHJvZ3Jlc3MgJiYgdGFncy5sZW5ndGggPyB1bmRlZmluZWQgOiBcImRpc2FibGVkXCJcbiAgfSwgbG9jYWxpemUoJ1NIQVJFJykpKTtcbiAgY29uc3Qgb2ZmbGluZVZpZXcgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChPZmZsaW5lVmlldywgbnVsbCwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoT2ZmbGluZSwge1xuICAgIGNsYXNzTmFtZTogXCJpY29uLXN0eWxlXCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3AtaGVhZGluZ1wiLCBudWxsLCBsb2NhbGl6ZSgnT0ZGTElORV9USVRMRScpKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcC1sYWJlbFwiLCB7XG4gICAgc3R5bGU6IHtcbiAgICAgIHdoaXRlU3BhY2U6IFwibm9ybWFsXCIsXG4gICAgICBwYWRkaW5nOiBcIjVweFwiLFxuICAgICAgdGV4dEFsaWduOiBcImNlbnRlclwiXG4gICAgfVxuICB9LCBsb2NhbGl6ZSgnT0ZGTElORV9ERVNDUklQVElPTicpKSk7XG4gIGNvbnN0IHNoYXJpbmdWaWV3ID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQ2VudGVyZWRGbGV4Q29udGFpbmVyLCBudWxsLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChXYWl0LCB7XG4gICAgZW5hYmxlOiBzaGFyaW5nSW5Qcm9ncmVzcyxcbiAgICBzaXplOiBcIkxcIlxuICB9KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcC1ib2R5XCIsIHtcbiAgICBzaXplOiBcIm1cIixcbiAgICBzdHlsZToge1xuICAgICAgbWFyZ2luOiBcIjEwcHhcIixcbiAgICAgIG1hcmdpblRvcDogXCIyMHB4XCJcbiAgICB9XG4gIH0sIGxvY2FsaXplKCdTRU5ESU5HX1RJVExFJykpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwLWJ1dHRvblwiLCB7XG4gICAgdmFyaWFudDogXCJzZWNvbmRhcnlcIixcbiAgICBvbkNsaWNrOiBoYW5kbGVTaGFyZUNhbmNlbFxuICB9LCBsb2NhbGl6ZSgnQ0FOQ0VMJykpKTtcbiAgY29uc3QgdG9hc3QgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChUb2FzdCwge1xuICAgIHRvYXN0VHlwZTogdG9hc3RUeXBlLFxuICAgIG1lc3NhZ2U6IHRvYXN0TWVzc2FnZSxcbiAgICBzZXRUb2FzdFZpc2libGU6IHNldFRvYXN0VmlzaWJsZVxuICB9KTtcbiAgY29uc3QgaGFuZGxlTG9hZGluZ0NhbmNlbCA9IGZ1bmN0aW9uICgpIHtcbiAgICAvLyBVc2VyIGhhcyBhbHJlYWR5IGJlZW4gYXV0aGVudGljYXRlZCBzbyBubyBuZWVkIHRvIGdvIGJhY2sgdG8gbG9naW4gcGFnZVxuICAgIHNldEluaXRpYWxDb250YWN0c0xvYWRlZCh0cnVlKTtcbiAgfTtcbiAgY29uc3QgbG9hZGluZ0NvbnRhY3RzID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoTG9hZGluZ0NvbnRhY3QsIG51bGwsIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFdhaXQsIHtcbiAgICBlbmFibGU6ICFpbml0aWFsQ29udGFjdHNMb2FkZWQsXG4gICAgc2l6ZTogXCJMXCJcbiAgfSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3AtYm9keVwiLCB7XG4gICAgc2l6ZTogXCJtXCIsXG4gICAgc3R5bGU6IHtcbiAgICAgIG1hcmdpbjogXCIxMHB4XCIsXG4gICAgICBtYXJnaW5Ub3A6IFwiMjBweFwiXG4gICAgfVxuICB9LCBsb2NhbGl6ZSgnTE9BRElOR19DT05UQUNUU19USVRMRScpKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcC1idXR0b25cIiwge1xuICAgIHZhcmlhbnQ6IFwic2Vjb25kYXJ5XCIsXG4gICAgb25DbGljazogaGFuZGxlTG9hZGluZ0NhbmNlbFxuICB9LCBsb2NhbGl6ZSgnQ0FOQ0VMJykpKTtcbiAgY29uc3QgcmVuZGVyRGlhbG9nQ29udGVudCA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXVzZXJPbmxpbmUpIHtcbiAgICAgIHJldHVybiBvZmZsaW5lVmlldztcbiAgICB9XG4gICAgaWYgKCFhdXRoQ29tcGxldGVkKSB7XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoQXV0aFZpZXcsIHtcbiAgICAgICAgc2V0QXV0aENvbXBsZXRlZDogc2V0QXV0aENvbXBsZXRlZCxcbiAgICAgICAgc2NvcGU6IFVTRVJfU0NPUEVTLFxuICAgICAgICBzaG93VG9hc3Q6IHNob3dUb2FzdFxuICAgICAgfSk7XG4gICAgfVxuICAgIGlmICghaW5pdGlhbENvbnRhY3RzTG9hZGVkKSB7XG4gICAgICByZXR1cm4gbG9hZGluZ0NvbnRhY3RzO1xuICAgIH1cbiAgICBpZiAoc2hhcmluZ0luUHJvZ3Jlc3MpIHtcbiAgICAgIHJldHVybiBzaGFyaW5nVmlldztcbiAgICB9XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFNsYWNrUGFuZWxJbm5lckNvbnRhaW5lciwgbnVsbCwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoU2xhY2tQYW5lbElubmVyLCBudWxsLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChUYWdJbnB1dCwge1xuICAgICAgcmVmOiB0YWdJbnB1dFJlZixcbiAgICAgIGNoYW5uZWxMaXN0OiBnZXRDaGFubmVsTGlzdCgpLFxuICAgICAgdXNlckxpc3Q6IGdldFVzZXJMaXN0KCksXG4gICAgICB0YWdzOiB0YWdzLFxuICAgICAgc2V0VGFnczogc2V0VGFncyxcbiAgICAgIHNldFRleHRBcmVhSGlkZGVuOiBzZXRUZXh0QXJlYUhpZGRlbixcbiAgICAgIGNvbnRhY3RzTG9hZGVkOiBjb250YWN0c0xvYWRlZCxcbiAgICAgIHBhcmVudERpYWxvZ1JlZjogZGlhbG9nUmVmXG4gICAgfSksIGNvbW1lbnRWaWV3LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwLWxhYmVsXCIsIHtcbiAgICAgIHN0eWxlOiB7XG4gICAgICAgIHBhZGRpbmdUb3A6IDBcbiAgICAgIH1cbiAgICB9LCBsb2NhbGl6ZSgnRk9STUFUX0RFU0NSSVBUSU9OX1NUQVJUJyksIFwiIFwiLCBleHBvcnRGb3JtYXQudG9VcHBlckNhc2UoKSwgXCIgXCIsIGV4cG9ydEZvcm1hdCAhPT0gJ3BzZCcgJiYgcHJvcHMuc2VsZWN0ZWRTaXplID8gYCAke3Byb3BzLnNlbGVjdGVkU2l6ZVswXX0geCAke3Byb3BzLnNlbGVjdGVkU2l6ZVsxXX0gcHguYCA6IGAgJHtsb2NhbGl6ZSgnU0hBUklOR19ERVNDUklQVElPTl9TVUZGSVgnKX0uYCkpLCBmb290ZXJWaWV3KTtcbiAgfTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IHByb3BzLnRoZW1lQ2xhc3NcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaWFsb2dcIiwge1xuICAgIGlkOiBcInNsYWNrLWRpYWxvZ1wiLFxuICAgIGNsYXNzTmFtZTogIWlzTWFjID8gXCJkaWFsb2ctYm9yZGVyXCIgOiBcIlwiLFxuICAgIHJlZjogZGlhbG9nUmVmXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KERpYWxvZ0Rpdiwge1xuICAgIHdpZHRoOiBwcm9wcy5wYW5lbFNpemUud2lkdGgsXG4gICAgaGVpZ2h0OiBwcm9wcy5wYW5lbFNpemUuaGVpZ2h0XG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFNsYWNrUGFuZWxEaXYsIG51bGwsIGhlYWRlclZpZXcsIHJlbmRlckRpYWxvZ0NvbnRlbnQoKSksIHRvYXN0VmlzaWJsZSAmJiB0b2FzdCkpKTtcbn0pOyIsImZ1bmN0aW9uIF9leHRlbmRzKCkgeyByZXR1cm4gX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduID8gT2JqZWN0LmFzc2lnbi5iaW5kKCkgOiBmdW5jdGlvbiAobikgeyBmb3IgKHZhciBlID0gMTsgZSA8IGFyZ3VtZW50cy5sZW5ndGg7IGUrKykgeyB2YXIgdCA9IGFyZ3VtZW50c1tlXTsgZm9yICh2YXIgciBpbiB0KSAoe30pLmhhc093blByb3BlcnR5LmNhbGwodCwgcikgJiYgKG5bcl0gPSB0W3JdKTsgfSByZXR1cm4gbjsgfSwgX2V4dGVuZHMuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsgfVxuaW1wb3J0IFJlYWN0LCB7IHVzZVJlZiwgdXNlTWVtbywgdXNlU3RhdGUsIHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIGZvcndhcmRSZWYsIHVzZUltcGVyYXRpdmVIYW5kbGUgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCBSZWFjdERPTSBmcm9tIFwicmVhY3QtZG9tXCI7XG5pbXBvcnQgeyBhcHAgfSBmcm9tIFwicGhvdG9zaG9wXCI7XG5pbXBvcnQgeyBMb2NhbFNoYXJlSXRlbSB9IGZyb20gXCIuL0xvY2FsU2hhcmVJdGVtLmpzeFwiO1xuaW1wb3J0IHsgU2V0dGluZ3NQYW5lbCB9IGZyb20gXCIuL1NldHRpbmdzLmpzeFwiO1xuaW1wb3J0IHsgQ09QWV9UT19DTElQQk9BUkQsIFNFUlZJQ0VfQ09ERSwgT1RIRVJfQVBQUywgTElHSFRST09NX0RFU0tUT1BfREFUQV9NRU5VLCBMSUdIVFJPT01fQ0xBU1NJQ19EQVRBX01FTlUsIExJR0hUUk9PTV9ERVNLVE9QX1RJVExFLCBMSUdIVFJPT01fQ0xBU1NJQ19USVRMRSB9IGZyb20gXCIuLi91dGlscy9sb2NhbFNoYXJlVXRpbHNcIjtcbmltcG9ydCB7IGlzTWFjLCBpc1dpbmRvd3MsIFVYUEV2ZW50VHlwZXMsIEVOVEVSX0tFWSwgRVNDQVBFX0tFWSwgU0hBUkVfVklBX1NMQUNLLCBNRU5VX0FDVElPTiB9IGZyb20gXCIuLi91dGlscy9jb21tb25VdGlsc1wiO1xuaW1wb3J0IHsgYnV0bGVyIH0gZnJvbSBcIi4uL2hvc3QvcGhvdG9zaG9wXCI7XG5pbXBvcnQgc3R5bGVkIGZyb20gXCJzdHlsZWQtY29tcG9uZW50c1wiO1xuaW1wb3J0IFwiLi9jc3Mvc3R5bGUuY3NzXCI7XG5pbXBvcnQgeyBlbWl0LCBzZXREaWFsb2dMaXN0ZW5lciwgcmVtb3ZlRGlhbG9nTGlzdGVuZXJzLCBpc0luQm91bmRhcnksIE9TX0VWRU5UUywgR0xPQkFMX0VWRU5UUyB9IGZyb20gXCIuLi91dGlscy9jb21tb25VdGlsc1wiO1xuaW1wb3J0IHsgVG9hc3QgfSBmcm9tIFwiLi9Ub2FzdFwiO1xuaW1wb3J0IEdlYXJJY29uIGZyb20gXCIuL2ljb25zL0dlYXJJY29uLmpzeFwiO1xuaW1wb3J0IENsaXBib2FyZCBmcm9tIFwiLi9pY29ucy9DbGlwYm9hcmRcIjtcbmltcG9ydCBCYWNrSWNvbiBmcm9tIFwiLi9pY29ucy9CYWNrSWNvbi5qc3hcIjtcbmltcG9ydCBTbGFja0ljb24gZnJvbSBcIi4vaWNvbnMvU2xhY2tJY29uLmpzeFwiO1xuaW1wb3J0IExpZ2h0cm9vbURlc2t0b3BJY29uIGZyb20gXCIuL2ljb25zL0xpZ2h0cm9vbURlc2t0b3BJY29uLmpzeFwiO1xuaW1wb3J0IExpZ2h0cm9vbUNsYXNzaWNJY29uIGZyb20gXCIuL2ljb25zL0xpZ2h0cm9vbUNsYXNzaWNJY29uLmpzeFwiO1xuaW1wb3J0IE90aGVyQXBwcyBmcm9tIFwiLi9pY29ucy9PdGhlckFwcHMuanN4XCI7XG5pbXBvcnQgeyBTbGFja1BhbmVsIH0gZnJvbSBcIi4vU2xhY2tQYW5lbC5qc3hcIjtcbmltcG9ydCB7IGxvZ1RvSW5nZXN0IH0gZnJvbSBcIi4uL2hvc3QvcGhvdG9zaG9wXCI7XG5pbXBvcnQgeyBsb2NhbGl6ZSB9IGZyb20gXCIuLi91dGlscy9ubHMuanNcIjtcblxuLy8vLy8vLyBTdHlsZWQgQ29tcG9uZW50cyAvLy8vLy8vXG5jb25zdCBzaGFyZVBhbmVsSW5nZXN0ID0gcmVxdWlyZShcIi4uL2luZ2VzdC9zaGFyZVBhbmVsSW5nZXN0Lmpzb25cIik7XG5jb25zdCBJY29uU2xvdCA9IHN0eWxlZC5kaXZgXG4gIGZpbGw6IHZhcigtLXNwZWN0cnVtLWFsaWFzLWNvbXBvbmVudC10ZXh0LWNvbG9yKTtcbmA7XG5jb25zdCBEaWFsb2dEaXYgPSBzdHlsZWQuZGl2YFxuICB3aWR0aDogJHtmdW5jdGlvbiAocHJvcHMpIHtcbiAgcmV0dXJuIHByb3BzLndpZHRoO1xufX1weDsgLyogVXNlIHByb3BzIGZvciB3aWR0aCAqL1xuICBoZWlnaHQ6ICR7ZnVuY3Rpb24gKHByb3BzKSB7XG4gIHJldHVybiBwcm9wcy5oZWlnaHQ7XG59fXB4OyAvKiBVc2UgcHJvcHMgZm9yIGhlaWdodCAqL1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG5gO1xuY29uc3QgSGVhZGVyVmlld0NvbnRhaW5lciA9IHN0eWxlZC5kaXZgXG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIHBhZGRpbmc6IDEwcHggMCAwIDA7XG5gO1xuY29uc3QgSGVhZGVyVmlldyA9IHN0eWxlZC5kaXZgXG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbmA7XG5jb25zdCBIZWFkZXJUZXh0VmlldyA9IHN0eWxlZC5kaXZgXG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG5gO1xuY29uc3QgTG9jYWxTaGFyZVBhbmVsRGl2ID0gc3R5bGVkLmRpdmBcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgaGVpZ2h0OiAxMDAlO1xuICBwYWRkaW5nOiAxNXB4O1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHdpZHRoOiAxMDAlO1xuICB0b3A6IDA7XG5gO1xuY29uc3QgTWVudUl0ZW1zRGl2ID0gc3R5bGVkLmRpdmBcbiAgb3ZlcmZsb3cteTogYXV0bztcbmA7XG5cbi8vLy8vLy8gU3R5bGVkIENvbXBvbmVudHMgLy8vLy8vL1xuXG5jb25zdCBNQVhfU0xBQ0tfUEFORUxfSEVJR0hUID0gNTA4O1xuY29uc3QgTUFYX1NMQUNLX1BBTkVMX1dJRFRIID0gNDIzO1xuZXhwb3J0IGNvbnN0IExvY2FsU2hhcmVQYW5lbCA9IGZvcndhcmRSZWYoZnVuY3Rpb24gKHByb3BzLCByZWYpIHtcbiAgdmFyIF9wcm9wcyRzZXJ2aWNlc0xpc3QsIF9wcm9wcyRzZXJ2aWNlc0xpc3QyO1xuICBjb25zdCBbaGFzTFNQZW5kZXJlZE9uY2UsIHNldExTUEhhc1JlbmRlcmVkT25jZV0gPSB1c2VTdGF0ZShmYWxzZSk7XG4gIGNvbnN0IFtleHBvcnRGb3JtYXQsIHNldEV4cG9ydEZvcm1hdF0gPSB1c2VTdGF0ZShcImpwZ1wiKTtcbiAgY29uc3QgW3NldHRpbmdzUGFuZWxBY3RpdmUsIHNldFNldHRpbmdzUGFuZWxBY3RpdmVdID0gdXNlU3RhdGUoZmFsc2UpO1xuICBjb25zdCBbc2VsZWN0ZWRTaXplVHlwZSwgc2V0U2VsZWN0ZWRTaXplVHlwZV0gPSB1c2VTdGF0ZShcIm9yaWdpbmFsXCIpO1xuICBjb25zdCBbb3JpZ2luYWxEb2N1bWVudFNpemUsIHNldE9yaWdpbmFsRG9jdW1lbnRTaXplXSA9IHVzZVN0YXRlKG51bGwpO1xuICBjb25zdCBwYW5lbEhvc3QgPSB3aW5kb3cuc2hhcmVQYW5lbEhvc3Q7XG4gIGNvbnN0IGRpYWxvZ1JlZiA9IHVzZVJlZihudWxsKTtcblxuICAvLyBGdW5jdGlvbiB0byBmZXRjaCBkb2N1bWVudCBkaW1lbnNpb25zXG4gIGNvbnN0IGZldGNoRG9jdW1lbnREaW1lbnNpb25zID0gZnVuY3Rpb24gKCkge1xuICAgIHRyeSB7XG4gICAgICBpZiAoYXBwICYmIGFwcC5hY3RpdmVEb2N1bWVudCkge1xuICAgICAgICBjb25zdCBkb2MgPSBhcHAuYWN0aXZlRG9jdW1lbnQ7XG4gICAgICAgIGNvbnN0IHdpZHRoID0gZG9jLndpZHRoO1xuICAgICAgICBjb25zdCBoZWlnaHQgPSBkb2MuaGVpZ2h0O1xuICAgICAgICBjb25zdCByZXNvbHV0aW9uID0gZG9jLnJlc29sdXRpb247XG4gICAgICAgIHNldE9yaWdpbmFsRG9jdW1lbnRTaXplKHtcbiAgICAgICAgICB3aWR0aCxcbiAgICAgICAgICBoZWlnaHQsXG4gICAgICAgICAgcmVzb2x1dGlvblxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB3aWR0aCxcbiAgICAgICAgICBoZWlnaHQsXG4gICAgICAgICAgcmVzb2x1dGlvblxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgZmV0Y2hpbmcgZG9jdW1lbnQgZGltZW5zaW9uczpcIiwgZXJyb3IpO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfTtcblxuICAvLyBGZXRjaCBkb2N1bWVudCBkaW1lbnNpb25zIG9uIGNvbXBvbmVudCBtb3VudFxuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGZldGNoRG9jdW1lbnREaW1lbnNpb25zKCk7XG4gIH0sIFtdKTtcblxuICAvLyBSZWZyZXNoIGRvY3VtZW50IGRpbWVuc2lvbnMgd2hlbiBwYW5lbCBiZWNvbWVzIHZpc2libGVcbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAocHJvcHMudmlzaWJsZSkge1xuICAgICAgZmV0Y2hEb2N1bWVudERpbWVuc2lvbnMoKTtcbiAgICB9XG4gIH0sIFtwcm9wcy52aXNpYmxlXSk7XG4gIGNvbnN0IGNsb3NlRGlhbG9nID0gdXNlQ2FsbGJhY2soZnVuY3Rpb24gKCkge1xuICAgIHByb3BzLnNldExvY2FsU2hhcmluZ1BhbmVsQWN0aXZlKGZhbHNlKTtcbiAgICBjb25zdCBkaWFsb2cgPSBkaWFsb2dSZWYgPT09IG51bGwgfHwgZGlhbG9nUmVmID09PSB2b2lkIDAgPyB2b2lkIDAgOiBkaWFsb2dSZWYuY3VycmVudDtcbiAgICAoZGlhbG9nID09PSBudWxsIHx8IGRpYWxvZyA9PT0gdm9pZCAwID8gdm9pZCAwIDogZGlhbG9nLm9wZW4pICYmIChkaWFsb2cgPT09IG51bGwgfHwgZGlhbG9nID09PSB2b2lkIDAgPyB2b2lkIDAgOiBkaWFsb2cuY2xvc2UoKSk7XG4gICAgcGFuZWxIb3N0ID09PSBudWxsIHx8IHBhbmVsSG9zdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogcGFuZWxIb3N0Lm9uUGFuZWxDbG9zZSgpO1xuICB9LCBbZGlhbG9nUmVmXSk7XG4gIGNvbnN0IHNob3dEaWFsb2cgPSB1c2VDYWxsYmFjayhmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgZGlhbG9nID0gZGlhbG9nUmVmID09PSBudWxsIHx8IGRpYWxvZ1JlZiA9PT0gdm9pZCAwID8gdm9pZCAwIDogZGlhbG9nUmVmLmN1cnJlbnQ7XG4gICAgZGlhbG9nLnNob3coe1xuICAgICAgYW5jaG9yT2Zmc2V0OiBwcm9wcy5wYW5lbExvY2F0aW9uLFxuICAgICAgaXNUcmFuc3BhcmVudDogdHJ1ZSxcbiAgICAgIG9wYWNpdHk6IDEuMCxcbiAgICAgIHNpemU6IHByb3BzLnBhbmVsU2l6ZSxcbiAgICAgIHJlc2l6ZTogXCJ2ZXJ0aWNhbFwiLFxuICAgICAgb3ZlcmZsb3c6IFwic2Nyb2xsXCJcbiAgICB9KTtcbiAgICBkaWFsb2cuYWRkRXZlbnRMaXN0ZW5lcihcImxvYWRcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgZGlhbG9nLmZvY3VzKCk7XG4gICAgICBkaWFsb2cuaGFzTG9hZGVkID0gdHJ1ZTtcbiAgICAgIHBhbmVsSG9zdCA9PT0gbnVsbCB8fCBwYW5lbEhvc3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHBhbmVsSG9zdC5vblBhbmVsT3BlbigpO1xuICAgIH0sIHtcbiAgICAgIG9uY2U6IHRydWVcbiAgICB9KTtcbiAgICBwcm9wcy5zZXRMb2NhbFNoYXJpbmdQYW5lbEFjdGl2ZSh0cnVlKTtcbiAgfSwgW2RpYWxvZ1JlZiwgcHJvcHNdKTtcblxuICAvLyBFeHBvc2UgaXQgdG8gU2hhcmVQYW5lbENvbnRyb2xsZXJcbiAgdXNlSW1wZXJhdGl2ZUhhbmRsZShyZWYsIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY2xvc2VEaWFsb2dcbiAgICB9O1xuICB9KTtcbiAgY29uc3QgaGFuZGxlQmFjayA9IGZ1bmN0aW9uICgpIHtcbiAgICBjbG9zZURpYWxvZygpO1xuICAgIHByb3BzLm9wZW5TaGFyZVBhbmVsKCk7XG4gIH07XG4gIGNvbnN0IG9wZW5Mb2NhbFNoYXJlUGFuZWwgPSBmdW5jdGlvbiAoKSB7XG4gICAgcHJvcHMuc2V0TG9jYWxTaGFyaW5nUGFuZWxBY3RpdmUodHJ1ZSk7XG4gIH07XG4gIGNvbnN0IHNob3dTZXR0aW5nc1BhbmVsID0gYXN5bmMgZnVuY3Rpb24gKHNob3cpIHtcbiAgICB0cnkge1xuICAgICAgbGV0IHBhbmVsU2l6ZSA9IHtcbiAgICAgICAgaGVpZ2h0OiAyNTUsXG4gICAgICAgIHdpZHRoOiAyOTBcbiAgICAgIH07XG4gICAgICBsZXQge1xuICAgICAgICBkaWFsb2dDb29yZGluYXRlc1xuICAgICAgfSA9IGF3YWl0IHByb3BzLmdldFJlbmRlckNvb3JkaW5hdGUocGFuZWxTaXplKTtcbiAgICAgIFJlYWN0RE9NLnJlbmRlcigvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChTZXR0aW5nc1BhbmVsLCB7XG4gICAgICAgIHJlZjogcHJvcHMuc2V0dGluZ3NQYW5lbFJlZixcbiAgICAgICAgdmlzaWJsZTogc2hvdyxcbiAgICAgICAgcGFuZWxMb2NhdGlvbjogZGlhbG9nQ29vcmRpbmF0ZXMsXG4gICAgICAgIHBhbmVsU2l6ZTogcGFuZWxTaXplLFxuICAgICAgICBzZXRTZXR0aW5nc1BhbmVsQWN0aXZlOiBzZXRTZXR0aW5nc1BhbmVsQWN0aXZlLFxuICAgICAgICBwYXJlbnREaWFsb2dSZWY6IGRpYWxvZ1JlZixcbiAgICAgICAgYnV0dG9uTG9jYXRpb246IHByb3BzLmJ1dHRvbkxvY2F0aW9uLFxuICAgICAgICB0aGVtZUNsYXNzOiBwcm9wcy50aGVtZUNsYXNzLFxuICAgICAgICBvcGVuTG9jYWxTaGFyZVBhbmVsOiBvcGVuTG9jYWxTaGFyZVBhbmVsLFxuICAgICAgICBleHBvcnRGb3JtYXQ6IGV4cG9ydEZvcm1hdCxcbiAgICAgICAgc2V0RXhwb3J0Rm9ybWF0OiBzZXRFeHBvcnRGb3JtYXQsXG4gICAgICAgIHNlbGVjdGVkU2l6ZVR5cGU6IHNlbGVjdGVkU2l6ZVR5cGUsXG4gICAgICAgIHNldFNlbGVjdGVkU2l6ZVR5cGU6IHNldFNlbGVjdGVkU2l6ZVR5cGUsXG4gICAgICAgIG9yaWdpbmFsRG9jdW1lbnRTaXplOiBvcmlnaW5hbERvY3VtZW50U2l6ZVxuICAgICAgfSksIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwicm9vdF9zZXR0aW5nc1wiKSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS5sb2coZSk7XG4gICAgfVxuICB9O1xuICBjb25zdCBvcGVuU2V0dGluZ3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgY2xvc2VEaWFsb2coKTtcbiAgICBzZXRTZXR0aW5nc1BhbmVsQWN0aXZlKHRydWUpO1xuICB9O1xuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmIChzZXR0aW5nc1BhbmVsQWN0aXZlIHx8IGhhc0xTUGVuZGVyZWRPbmNlKSB7XG4gICAgICBzaG93U2V0dGluZ3NQYW5lbChzZXR0aW5nc1BhbmVsQWN0aXZlKTtcbiAgICAgIHNldExTUEhhc1JlbmRlcmVkT25jZSh0cnVlKTtcbiAgICAgIGlmIChzZXR0aW5nc1BhbmVsQWN0aXZlKSB7XG4gICAgICAgIGNsb3NlRGlhbG9nKCk7XG4gICAgICB9XG4gICAgfVxuICB9LCBbc2V0dGluZ3NQYW5lbEFjdGl2ZSwgc2VsZWN0ZWRTaXplVHlwZSwgb3JpZ2luYWxEb2N1bWVudFNpemVdKTtcbiAgY29uc3Qgc2VsZWN0ZWRTaXplID0gdXNlTWVtbyhmdW5jdGlvbiAoKSB7XG4gICAgY29uc3Qgd2lkdGggPSAob3JpZ2luYWxEb2N1bWVudFNpemUgPT09IG51bGwgfHwgb3JpZ2luYWxEb2N1bWVudFNpemUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9yaWdpbmFsRG9jdW1lbnRTaXplLndpZHRoKSB8fCAwO1xuICAgIGNvbnN0IGhlaWdodCA9IChvcmlnaW5hbERvY3VtZW50U2l6ZSA9PT0gbnVsbCB8fCBvcmlnaW5hbERvY3VtZW50U2l6ZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3JpZ2luYWxEb2N1bWVudFNpemUuaGVpZ2h0KSB8fCAwO1xuICAgIHJldHVybiBbc2VsZWN0ZWRTaXplVHlwZSA9PT0gXCJzbWFsbFwiID8gTWF0aC5yb3VuZCh3aWR0aCAqIDAuNSkgOiB3aWR0aCwgc2VsZWN0ZWRTaXplVHlwZSA9PT0gXCJzbWFsbFwiID8gTWF0aC5yb3VuZChoZWlnaHQgKiAwLjUpIDogaGVpZ2h0XTtcbiAgfSwgW3NlbGVjdGVkU2l6ZVR5cGUsIG9yaWdpbmFsRG9jdW1lbnRTaXplXSk7XG4gIGNvbnN0IHNob3dTbGFja1BhbmVsID0gYXN5bmMgZnVuY3Rpb24gKHNob3cpIHtcbiAgICBsZXQgcGFuZWxTaXplID0ge1xuICAgICAgaGVpZ2h0OiBNQVhfU0xBQ0tfUEFORUxfSEVJR0hULFxuICAgICAgd2lkdGg6IE1BWF9TTEFDS19QQU5FTF9XSURUSFxuICAgIH07XG4gICAgbGV0IHtcbiAgICAgIGRpYWxvZ0Nvb3JkaW5hdGVzXG4gICAgfSA9IGF3YWl0IHByb3BzLmdldFJlbmRlckNvb3JkaW5hdGUocGFuZWxTaXplKTtcbiAgICBSZWFjdERPTS5yZW5kZXIoLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoU2xhY2tQYW5lbCwge1xuICAgICAgcmVmOiBwcm9wcy5zbGFja1BhbmVsUmVmLFxuICAgICAgdmlzaWJsZTogc2hvdyxcbiAgICAgIHBhbmVsTG9jYXRpb246IGRpYWxvZ0Nvb3JkaW5hdGVzLFxuICAgICAgcGFuZWxTaXplOiBwYW5lbFNpemUsXG4gICAgICBzZXRTbGFja1BhbmVsQWN0aXZlOiBwcm9wcy5zZXRTbGFja1BhbmVsQWN0aXZlLFxuICAgICAgcGFyZW50RGlhbG9nUmVmOiBkaWFsb2dSZWYsXG4gICAgICBidXR0b25Mb2NhdGlvbjogcHJvcHMuYnV0dG9uTG9jYXRpb24sXG4gICAgICB0aGVtZUNsYXNzOiBwcm9wcy50aGVtZUNsYXNzLFxuICAgICAgb3BlblNoYXJlUGFuZWw6IHByb3BzLm9wZW5TaGFyZVBhbmVsLFxuICAgICAgZXhwb3J0Rm9ybWF0OiBleHBvcnRGb3JtYXQsXG4gICAgICBzZWxlY3RlZFNpemU6IHNlbGVjdGVkU2l6ZSxcbiAgICAgIHNlbGVjdGVkU2l6ZVR5cGU6IHNlbGVjdGVkU2l6ZVR5cGUsXG4gICAgICBvcGVuTG9jYWxTaGFyZVBhbmVsOiBvcGVuTG9jYWxTaGFyZVBhbmVsXG4gICAgfSksIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwicm9vdF9zbGFja1wiKSk7XG4gIH07XG4gIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHByb3BzLnNsYWNrUGFuZWxBY3RpdmUgfHwgaGFzTFNQZW5kZXJlZE9uY2UpIHtcbiAgICAgIHNob3dTbGFja1BhbmVsKHByb3BzLnNsYWNrUGFuZWxBY3RpdmUpO1xuICAgICAgc2V0TFNQSGFzUmVuZGVyZWRPbmNlKHRydWUpO1xuICAgICAgaWYgKHByb3BzLnNsYWNrUGFuZWxBY3RpdmUpIHtcbiAgICAgICAgY2xvc2VEaWFsb2coKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIFtwcm9wcy5zbGFja1BhbmVsQWN0aXZlXSk7XG4gIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHByb3BzLnZpc2libGUpIHtcbiAgICAgIHNob3dEaWFsb2coKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2xvc2VEaWFsb2coKTtcbiAgICB9XG4gIH0sIFtwcm9wcy52aXNpYmxlXSk7XG4gIGNvbnN0IGhhbmRsZU1lbnVDaGFuZ2UgPSBhc3luYyBmdW5jdGlvbiAodmFsKSB7XG4gICAgaWYgKHZhbCA9PSBNRU5VX0FDVElPTi5TTEFDSykge1xuICAgICAgY2xvc2VEaWFsb2coKTtcbiAgICAgIHByb3BzLnNldFNsYWNrUGFuZWxBY3RpdmUodHJ1ZSk7XG4gICAgICBsb2dUb0luZ2VzdChzaGFyZVBhbmVsSW5nZXN0W1wic2xhY2tfcGFuZWxcIl0sIFwiY2xpY2tcIik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhbmVsSG9zdCA9PT0gbnVsbCB8fCBwYW5lbEhvc3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHBhbmVsSG9zdC5vbkxvY2FsU2hhcmUodmFsLCBleHBvcnRGb3JtYXQsIHNlbGVjdGVkU2l6ZSwgc2VsZWN0ZWRTaXplVHlwZSk7XG4gICAgICBpZiAodmFsID09PSBTRVJWSUNFX0NPREUuQ0xJUEJBT1JEKSB7XG4gICAgICAgIGJ1dGxlci5zaG93VG9hc3QobG9jYWxpemUoJ0NPUFlfVE9fQ0xJUEJPQVJEX1NVQ0NFU1MnKSwge1xuICAgICAgICAgIHR5cGU6IFwic3VjY2Vzc1wiXG4gICAgICAgIH0pO1xuICAgICAgICBjbG9zZURpYWxvZygpO1xuICAgICAgfSBlbHNlIGlmICh2YWwgPT0gU0VSVklDRV9DT0RFLkxJR0hUUk9PTV9DTEFTU0lDIHx8IHZhbCA9PSBTRVJWSUNFX0NPREUuTElHSFRST09NX0RFU0tUT1ApIHtcbiAgICAgICAgY2xvc2VEaWFsb2coKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvZ1RvSW5nZXN0KHNoYXJlUGFuZWxJbmdlc3RbXCJsb2NhbF9zaGFyaW5nXCJdLCBcIm90aGVyQXBwc1wiKTtcbiAgICAgICAgaXNXaW5kb3dzICYmIGNsb3NlRGlhbG9nKCk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBjb25zdCBoYW5kbGVHbG9iYWxNb3VzZURvd24gPSBmdW5jdGlvbiAoZXZlbnQsIGNvb3JkaW5hdGVzKSB7XG4gICAgaWYgKCFwcm9wcy52aXNpYmxlKSByZXR1cm47XG4gICAgaWYgKCFpc0luQm91bmRhcnkoY29vcmRpbmF0ZXMsIHByb3BzLnBhbmVsTG9jYXRpb24pICYmIHByb3BzLmJ1dHRvbkxvY2F0aW9uICYmICFpc0luQm91bmRhcnkoY29vcmRpbmF0ZXMsIHByb3BzLmJ1dHRvbkxvY2F0aW9uKSkge1xuICAgICAgY2xvc2VEaWFsb2coKTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IGhhbmRsZUtleURvd24gPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQua2V5ID09PSBFU0NBUEVfS0VZKSB7XG4gICAgICBjbG9zZURpYWxvZygpO1xuICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSBFTlRFUl9LRVkpIHtcbiAgICAgIC8vIFRvRG8gOiBIYW5kbGUgdGhpc1xuICAgIH1cbiAgfTtcblxuICAvLyBBdHRhY2ggbmV3IGNvcHkgb2YgaGFuZGxlR2xvYmFsTW91c2VEb3duIG9uIGV2ZXJ5IHJlbmRlclxuICAvLyBhcyB0aGUgaGFuZGxlR2xvYmFsTW91c2VEb3duIG5lZWRzIHVwZGF0ZWQgZGlhbG9nTG9jYXRpb24gdmFsdWVcbiAgY29uc3QgZGlhbG9nSWQgPSBgTE9DQUwtU0hBUkUtRElBTE9HLSR7RGF0ZS5ub3coKX1gO1xuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcihVWFBFdmVudFR5cGVzLktFWURPV04sIGhhbmRsZUtleURvd24pO1xuICAgIHNldERpYWxvZ0xpc3RlbmVyKE9TX0VWRU5UUy5NT1VTRV9ET1dOLCBkaWFsb2dJZCwgaGFuZGxlR2xvYmFsTW91c2VEb3duKTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVFdmVudExpc3RlbmVyKFVYUEV2ZW50VHlwZXMuS0VZRE9XTiwgaGFuZGxlS2V5RG93bik7XG4gICAgICByZW1vdmVEaWFsb2dMaXN0ZW5lcnMoZGlhbG9nSWQpO1xuICAgIH07XG4gIH0sIFtkaWFsb2dJZF0pO1xuICBsZXQgaXNMaWdodHJvb21EZXNrdG9wQXZhaWxhYmxlID0gKChfcHJvcHMkc2VydmljZXNMaXN0ID0gcHJvcHMuc2VydmljZXNMaXN0KSA9PT0gbnVsbCB8fCBfcHJvcHMkc2VydmljZXNMaXN0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfcHJvcHMkc2VydmljZXNMaXN0LmluY2x1ZGVzKFNFUlZJQ0VfQ09ERS5MSUdIVFJPT01fREVTS1RPUCkpID8/IGZhbHNlO1xuICBsZXQgaXNMaWdodHJvb21DbGFzc2ljQXZhaWxhYmxlID0gKChfcHJvcHMkc2VydmljZXNMaXN0MiA9IHByb3BzLnNlcnZpY2VzTGlzdCkgPT09IG51bGwgfHwgX3Byb3BzJHNlcnZpY2VzTGlzdDIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9wcm9wcyRzZXJ2aWNlc0xpc3QyLmluY2x1ZGVzKFNFUlZJQ0VfQ09ERS5MSUdIVFJPT01fQ0xBU1NJQykpID8/IGZhbHNlO1xuICBjb25zdCBoZWFkZXJWaWV3ID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoSGVhZGVyVmlld0NvbnRhaW5lciwgbnVsbCwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoSGVhZGVyVmlldywgbnVsbCwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogXCJtZW51LWNvbnRhaW5lclwiXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEhlYWRlclRleHRWaWV3LCBudWxsLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwLWFjdGlvbi1idXR0b25cIiwge1xuICAgIHNpemU6IFwic1wiLFxuICAgIHF1aWV0OiB0cnVlLFxuICAgIG9uQ2xpY2s6IGhhbmRsZUJhY2tcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoSWNvblNsb3QsIG51bGwsIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KEJhY2tJY29uLCB7XG4gICAgY2xhc3NOYW1lOiBcImljb24tc3R5bGVcIlxuICB9KSkpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwLWhlYWRpbmdcIiwge1xuICAgIHNpemU6IFwic1wiLFxuICAgIHN0eWxlOiB7XG4gICAgICBtYXJnaW46IDBcbiAgICB9XG4gIH0sIGxvY2FsaXplKCdTRU5EX1RPX0FQUFNfVElUTEUnKSkpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwLWFjdGlvbi1idXR0b25cIiwge1xuICAgIHNpemU6IFwic1wiLFxuICAgIHF1aWV0OiB0cnVlLFxuICAgIG9uQ2xpY2s6IG9wZW5TZXR0aW5nc1xuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChJY29uU2xvdCwgbnVsbCwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoR2Vhckljb24sIHtcbiAgICBjbGFzc05hbWU6IFwiaWNvbi1zdHlsZVwiXG4gIH0pKSkpKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogXCJjb250YWluZXJcIlxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwLWxhYmVsXCIsIG51bGwsIGxvY2FsaXplKCdTSEFSSU5HX0RFU0NSSVBUSU9OX1BSRUZJWCcpLCBcIiBcIiwgZXhwb3J0Rm9ybWF0LnRvVXBwZXJDYXNlKCksIGV4cG9ydEZvcm1hdCAhPT0gJ3BzZCcgJiYgc2VsZWN0ZWRTaXplID8gYCAke3NlbGVjdGVkU2l6ZVswXX0geCAke3NlbGVjdGVkU2l6ZVsxXX0gcHhgIDogYCAke2xvY2FsaXplKCdTSEFSSU5HX0RFU0NSSVBUSU9OX1NVRkZJWCcpfWApKSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBwcm9wcy50aGVtZUNsYXNzXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGlhbG9nXCIsIHtcbiAgICBpZDogXCJsb2NhbC1zaGFyZS1kaWFsb2dcIixcbiAgICBjbGFzc05hbWU6ICFpc01hYyA/IFwiZGlhbG9nLWJvcmRlclwiIDogXCJcIixcbiAgICByZWY6IGRpYWxvZ1JlZlxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChEaWFsb2dEaXYsIHtcbiAgICB3aWR0aDogcHJvcHMucGFuZWxTaXplLndpZHRoLFxuICAgIGhlaWdodDogcHJvcHMucGFuZWxTaXplLmhlaWdodFxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChMb2NhbFNoYXJlUGFuZWxEaXYsIG51bGwsIGhlYWRlclZpZXcsIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3AtbWVudS1pdGVtXCIsIF9leHRlbmRzKHtcbiAgICBcImRhdGEtbWVudVwiOiBDT1BZX1RPX0NMSVBCT0FSRCxcbiAgICBvbkNsaWNrOiBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoZXhwb3J0Rm9ybWF0ICE9PSAncHNkJykge1xuICAgICAgICBoYW5kbGVNZW51Q2hhbmdlKFNFUlZJQ0VfQ09ERS5DTElQQkFPUkQpO1xuICAgICAgfVxuICAgIH0sXG4gICAgdGl0bGU6IGV4cG9ydEZvcm1hdCA9PT0gJ3BzZCcgPyBsb2NhbGl6ZSgnQ09QWV9UT19DTElQQk9BUkRfVE9PTFRJUCcpIDogbnVsbFxuICB9LCBleHBvcnRGb3JtYXQgPT09ICdwc2QnID8ge1xuICAgIGRpc2FibGVkOiB0cnVlXG4gIH0gOiB7fSksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KExvY2FsU2hhcmVJdGVtLCB7XG4gICAgZGlzYWJsZWQ6IGV4cG9ydEZvcm1hdCA9PT0gJ3BzZCcsXG4gICAgdGl0bGVTdHI6IGxvY2FsaXplKCdDT1BZX1RPX0NMSVBCT0FSRF9USVRMRScpLFxuICAgIGxlZnRJY29uOiBDbGlwYm9hcmRcbiAgfSkpLCAoIWlzTGlnaHRyb29tQ2xhc3NpY0F2YWlsYWJsZSB8fCBpc0xpZ2h0cm9vbURlc2t0b3BBdmFpbGFibGUpICYmIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3AtbWVudS1pdGVtXCIsIHtcbiAgICBcImRhdGEtbWVudVwiOiBMSUdIVFJPT01fREVTS1RPUF9EQVRBX01FTlUsXG4gICAgb25DbGljazogZnVuY3Rpb24gKCkge1xuICAgICAgaGFuZGxlTWVudUNoYW5nZShTRVJWSUNFX0NPREUuTElHSFRST09NX0RFU0tUT1ApO1xuICAgIH1cbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoTG9jYWxTaGFyZUl0ZW0sIHtcbiAgICBkaXNhYmxlZDogZmFsc2UsXG4gICAgdGl0bGVTdHI6IExJR0hUUk9PTV9ERVNLVE9QX1RJVExFLFxuICAgIGxlZnRJY29uOiBMaWdodHJvb21EZXNrdG9wSWNvblxuICB9KSksIGlzTGlnaHRyb29tQ2xhc3NpY0F2YWlsYWJsZSAmJiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwLW1lbnUtaXRlbVwiLCB7XG4gICAgXCJkYXRhLW1lbnVcIjogTElHSFRST09NX0NMQVNTSUNfREFUQV9NRU5VLFxuICAgIG9uQ2xpY2s6IGZ1bmN0aW9uICgpIHtcbiAgICAgIGhhbmRsZU1lbnVDaGFuZ2UoU0VSVklDRV9DT0RFLkxJR0hUUk9PTV9DTEFTU0lDKTtcbiAgICB9XG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KExvY2FsU2hhcmVJdGVtLCB7XG4gICAgZGlzYWJsZWQ6IGZhbHNlLFxuICAgIHRpdGxlU3RyOiBMSUdIVFJPT01fQ0xBU1NJQ19USVRMRSxcbiAgICBsZWZ0SWNvbjogTGlnaHRyb29tQ2xhc3NpY0ljb25cbiAgfSkpLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwLW1lbnUtaXRlbVwiLCB7XG4gICAgXCJkYXRhLW1lbnVcIjogU0hBUkVfVklBX1NMQUNLLFxuICAgIG9uQ2xpY2s6IGZ1bmN0aW9uICgpIHtcbiAgICAgIGhhbmRsZU1lbnVDaGFuZ2UoTUVOVV9BQ1RJT04uU0xBQ0spO1xuICAgIH1cbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoTG9jYWxTaGFyZUl0ZW0sIHtcbiAgICBkaXNhYmxlZDogZmFsc2UsXG4gICAgdGl0bGVTdHI6IFwiU2xhY2tcIixcbiAgICBsZWZ0SWNvbjogU2xhY2tJY29uXG4gIH0pKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcC1tZW51LWl0ZW1cIiwge1xuICAgIFwiZGF0YS1tZW51XCI6IE9USEVSX0FQUFMsXG4gICAgb25DbGljazogZnVuY3Rpb24gKCkge1xuICAgICAgaGFuZGxlTWVudUNoYW5nZShTRVJWSUNFX0NPREUuT1RIRVJfQVBQUyk7XG4gICAgfVxuICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChMb2NhbFNoYXJlSXRlbSwge1xuICAgIGRpc2FibGVkOiBmYWxzZSxcbiAgICB0aXRsZVN0cjogbG9jYWxpemUoJ09USEVSX0FQUFNfVElUTEUnKSxcbiAgICBsZWZ0SWNvbjogT3RoZXJBcHBzXG4gIH0pKSkpKSk7XG59KTsiLCJpbXBvcnQgUmVhY3QsIHsgdXNlUmVmLCB1c2VTdGF0ZSwgdXNlQ2FsbGJhY2ssIHVzZUVmZmVjdCwgZm9yd2FyZFJlZiwgdXNlSW1wZXJhdGl2ZUhhbmRsZSwgY3JlYXRlUmVmIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgUmVhY3RET00gZnJvbSBcInJlYWN0LWRvbVwiO1xuaW1wb3J0IFwiLi9jc3MvU2hhcmVQYW5lbC5jc3NcIjtcbmltcG9ydCB7IFNoYXJlTWVudSB9IGZyb20gXCIuL1NoYXJlTWVudVwiO1xuaW1wb3J0IHsgTG9jYWxTaGFyZVBhbmVsIH0gZnJvbSBcIi4vTG9jYWxTaGFyZVBhbmVsXCI7XG5pbXBvcnQgeyBhcHAgfSBmcm9tIFwicGhvdG9zaG9wXCI7XG5pbXBvcnQgeyBUb2FzdCB9IGZyb20gXCIuL1RvYXN0XCI7XG5pbXBvcnQgeyBQU19ESUFMT0dfU0laRSwgcHNBY3Rpb24sIHBzQ29yZSwgZ2V0UmVuZGVyQ29vcmRpbmF0ZSB9IGZyb20gXCIuLi9ob3N0L3Bob3Rvc2hvcFwiO1xuaW1wb3J0IHsgaXNNYWMsIGlzV2luZG93cywgVVhQRXZlbnRUeXBlcywgRU5URVJfS0VZLCBFU0NBUEVfS0VZLCBJTlZJVEVfVE9fRURJVF9NRU5VLCBTSEFSRV9GT1JfUkVWSUVXX01FTlUsIEFOSU1BVEVfSU5fRklSRUZMWSB9IGZyb20gXCIuLi91dGlscy9jb21tb25VdGlsc1wiO1xuaW1wb3J0IHsgaG9zdCB9IGZyb20gXCJ1eHBcIjtcbmltcG9ydCB7IGVtaXQsIHNldERpYWxvZ0xpc3RlbmVyLCByZW1vdmVEaWFsb2dMaXN0ZW5lcnMsIGlzSW5Cb3VuZGFyeSwgT1NfRVZFTlRTLCBHTE9CQUxfRVZFTlRTIH0gZnJvbSBcIi4uL3V0aWxzL2NvbW1vblV0aWxzXCI7XG5pbXBvcnQgc3R5bGVkIGZyb20gXCJzdHlsZWQtY29tcG9uZW50c1wiO1xuaW1wb3J0IHsgU0VSVklDRV9DT0RFIH0gZnJvbSBcIi4uL3V0aWxzL2xvY2FsU2hhcmVVdGlsc1wiO1xuY29uc3QgTUFYX0xPQ0FMX1NIQVJFX1BBTkVMX0hFSUdIVCA9IDMyMjtcbmNvbnN0IE1BWF9MT0NBTF9TSEFSRV9QQU5FTF9XSURUSCA9IDI5MDtcbmNvbnN0IFNJTkdMRV9PUFRJT05fSEVJR0hUID0gNDQ7XG5jb25zdCBIZWFkZXJWaWV3Q29udGFpbmVyID0gc3R5bGVkLmRpdmBcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgcGFkZGluZzogMTBweCAwIDEwcHggMTBweDtcbmA7XG5jb25zdCBIZWFkZXJWaWV3ID0gc3R5bGVkLmRpdmBcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuYDtcbmNvbnN0IEhlYWRlclRleHRWaWV3ID0gc3R5bGVkLmRpdmBcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgbWFyZ2luLWxlZnQ6MTBweDtcbmA7XG5leHBvcnQgY29uc3QgU2hhcmVQYW5lbCA9IGZvcndhcmRSZWYoZnVuY3Rpb24gKHByb3BzLCByZWYpIHtcbiAgY29uc3QgW3RoZW1lLCBzZXRUaGVtZV0gPSB1c2VTdGF0ZShcImRhcmtcIik7XG4gIGNvbnN0IFtpc1Jldmlld0Rpc2FibGVkLCBzZXRJc1Jldmlld0Rpc2FibGVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcbiAgY29uc3QgW3NsYWNrUGFuZWxBY3RpdmUsIHNldFNsYWNrUGFuZWxBY3RpdmVdID0gdXNlU3RhdGUoZmFsc2UpO1xuICBjb25zdCBbbG9jYWxTaGFyaW5nUGFuZWxBY3RpdmUsIHNldExvY2FsU2hhcmluZ1BhbmVsQWN0aXZlXSA9IHVzZVN0YXRlKGZhbHNlKTtcbiAgY29uc3QgW2hhc1NQUmVuZGVyZWRPbmNlLCBzZXRTUEhhc1JlbmRlcmVkT25jZV0gPSB1c2VTdGF0ZShmYWxzZSk7XG4gIGNvbnN0IFt0b2FzdFZpc2libGUsIHNldFRvYXN0VmlzaWJsZV0gPSB1c2VTdGF0ZShmYWxzZSk7XG4gIGNvbnN0IFt0b2FzdFR5cGUsIHNldFRvYXN0VHlwZV0gPSB1c2VTdGF0ZShcImluZm9cIik7XG4gIGNvbnN0IFt0b2FzdE1lc3NhZ2UsIHNldFRvYXN0TWVzc2FnZV0gPSB1c2VTdGF0ZShcIlwiKTtcbiAgY29uc3QgcGFuZWxIb3N0ID0gd2luZG93LnNoYXJlUGFuZWxIb3N0O1xuICBjb25zdCBzbGFja1BhbmVsUmVmID0gdXNlUmVmKG51bGwpO1xuICBjb25zdCBsb2NhbFNoYXJlUGFuZWxSZWYgPSB1c2VSZWYobnVsbCk7XG4gIGNvbnN0IHNldHRpbmdzUGFuZWxSZWYgPSB1c2VSZWYobnVsbCk7XG4gIHVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxvY2FsU2hhcmVQYW5lbFJlZjogbG9jYWxTaGFyZVBhbmVsUmVmLFxuICAgICAgc2xhY2tQYW5lbFJlZjogc2xhY2tQYW5lbFJlZixcbiAgICAgIHNldHRpbmdzUGFuZWxSZWY6IHNldHRpbmdzUGFuZWxSZWZcbiAgICB9O1xuICB9KTtcbiAgY29uc3QgZGlhbG9nUmVmID0gdXNlUmVmKG51bGwpO1xuICBjb25zdCB1cGRhdGVUaGVtZSA9IGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIWhvc3QpIHJldHVybjtcbiAgICBjb25zdCBuZXdUaGVtZSA9IGF3YWl0IGhvc3QuZ2V0VGhlbWUoKTtcbiAgICBzZXRUaGVtZShuZXdUaGVtZSk7XG4gIH07XG4gIGNvbnN0IHNob3dMb2NhbFNoYXJpbmdQYW5lbCA9IGFzeW5jIGZ1bmN0aW9uIChzaG93KSB7XG4gICAgbGV0IHNlcnZpY2VzTGlzdCA9IHBhbmVsSG9zdCA9PT0gbnVsbCB8fCBwYW5lbEhvc3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHBhbmVsSG9zdC5nZXRTZXJ2aWNlcygpO1xuICAgIGxldCBpc0xpZ2h0cm9vbURlc2t0b3BBdmFpbGFibGUgPSAoc2VydmljZXNMaXN0ID09PSBudWxsIHx8IHNlcnZpY2VzTGlzdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2VydmljZXNMaXN0LmluY2x1ZGVzKFNFUlZJQ0VfQ09ERS5MSUdIVFJPT01fREVTS1RPUCkpID8/IGZhbHNlO1xuICAgIGxldCBpc0xpZ2h0cm9vbUNsYXNzaWNBdmFpbGFibGUgPSAoc2VydmljZXNMaXN0ID09PSBudWxsIHx8IHNlcnZpY2VzTGlzdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogc2VydmljZXNMaXN0LmluY2x1ZGVzKFNFUlZJQ0VfQ09ERS5MSUdIVFJPT01fQ0xBU1NJQykpID8/IGZhbHNlO1xuICAgIGxldCBoZWlnaHQgPSBpc0xpZ2h0cm9vbURlc2t0b3BBdmFpbGFibGUgJiYgaXNMaWdodHJvb21DbGFzc2ljQXZhaWxhYmxlID8gTUFYX0xPQ0FMX1NIQVJFX1BBTkVMX0hFSUdIVCA6IE1BWF9MT0NBTF9TSEFSRV9QQU5FTF9IRUlHSFQgLSBTSU5HTEVfT1BUSU9OX0hFSUdIVDtcbiAgICBsZXQgcGFuZWxTaXplID0ge1xuICAgICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgICB3aWR0aDogTUFYX0xPQ0FMX1NIQVJFX1BBTkVMX1dJRFRIXG4gICAgfTtcbiAgICBsZXQge1xuICAgICAgZGlhbG9nQ29vcmRpbmF0ZXNcbiAgICB9ID0gYXdhaXQgZ2V0UmVuZGVyQ29vcmRpbmF0ZShwYW5lbFNpemUpO1xuICAgIFJlYWN0RE9NLnJlbmRlcigvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChMb2NhbFNoYXJlUGFuZWwsIHtcbiAgICAgIHJlZjogbG9jYWxTaGFyZVBhbmVsUmVmLFxuICAgICAgc2V0dGluZ3NQYW5lbFJlZjogc2V0dGluZ3NQYW5lbFJlZixcbiAgICAgIHNsYWNrUGFuZWxSZWY6IHNsYWNrUGFuZWxSZWYsXG4gICAgICB2aXNpYmxlOiBzaG93LFxuICAgICAgcGFuZWxMb2NhdGlvbjogZGlhbG9nQ29vcmRpbmF0ZXMsXG4gICAgICBwYW5lbFNpemU6IHBhbmVsU2l6ZSxcbiAgICAgIHNldExvY2FsU2hhcmluZ1BhbmVsQWN0aXZlOiBzZXRMb2NhbFNoYXJpbmdQYW5lbEFjdGl2ZSxcbiAgICAgIHNsYWNrUGFuZWxBY3RpdmU6IHNsYWNrUGFuZWxBY3RpdmUsXG4gICAgICBzZXRTbGFja1BhbmVsQWN0aXZlOiBzZXRTbGFja1BhbmVsQWN0aXZlLFxuICAgICAgcGFyZW50RGlhbG9nUmVmOiBkaWFsb2dSZWYsXG4gICAgICBidXR0b25Mb2NhdGlvbjogcHJvcHMuYnV0dG9uTG9jYXRpb24sXG4gICAgICB0aGVtZUNsYXNzOiBnZXRTcGVjdHJ1bUNsYXNzKCksXG4gICAgICBvcGVuU2hhcmVQYW5lbDogb3BlblNoYXJlUGFuZWwsXG4gICAgICBzaG93dG9hc3Q6IHNob3dUb2FzdCxcbiAgICAgIGdldFJlbmRlckNvb3JkaW5hdGU6IGdldFJlbmRlckNvb3JkaW5hdGUsXG4gICAgICBzZXJ2aWNlc0xpc3Q6IHNlcnZpY2VzTGlzdFxuICAgIH0pLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInJvb3RfbG9jYWxfc2hhcmVcIikpO1xuICB9O1xuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmIChsb2NhbFNoYXJpbmdQYW5lbEFjdGl2ZSB8fCBoYXNTUFJlbmRlcmVkT25jZSkge1xuICAgICAgc2hvd0xvY2FsU2hhcmluZ1BhbmVsKGxvY2FsU2hhcmluZ1BhbmVsQWN0aXZlKTtcbiAgICAgIHNldFNQSGFzUmVuZGVyZWRPbmNlKHRydWUpO1xuICAgICAgaWYgKGxvY2FsU2hhcmluZ1BhbmVsQWN0aXZlKSB7XG4gICAgICAgIGNsb3NlRGlhbG9nKCk7XG4gICAgICB9XG4gICAgfVxuICB9LCBbbG9jYWxTaGFyaW5nUGFuZWxBY3RpdmVdKTtcbiAgY29uc3Qgb3BlblNoYXJlUGFuZWwgPSBmdW5jdGlvbiAoKSB7XG4gICAgcHJvcHMuc2V0VmlzaWJpbGl0eSh0cnVlKTtcbiAgfTtcbiAgY29uc3QgY2xvc2VEaWFsb2cgPSB1c2VDYWxsYmFjayhmdW5jdGlvbiAoKSB7XG4gICAgcHJvcHMuc2V0VmlzaWJpbGl0eShmYWxzZSk7XG4gICAgY29uc3QgZGlhbG9nID0gZGlhbG9nUmVmID09PSBudWxsIHx8IGRpYWxvZ1JlZiA9PT0gdm9pZCAwID8gdm9pZCAwIDogZGlhbG9nUmVmLmN1cnJlbnQ7XG4gICAgKGRpYWxvZyA9PT0gbnVsbCB8fCBkaWFsb2cgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGRpYWxvZy5oYXNMb2FkZWQpICYmIChkaWFsb2cgPT09IG51bGwgfHwgZGlhbG9nID09PSB2b2lkIDAgPyB2b2lkIDAgOiBkaWFsb2cuY2xvc2UoKSk7XG4gICAgcGFuZWxIb3N0ID09PSBudWxsIHx8IHBhbmVsSG9zdCA9PT0gdm9pZCAwID8gdm9pZCAwIDogcGFuZWxIb3N0Lm9uUGFuZWxDbG9zZSgpO1xuICB9LCBbZGlhbG9nUmVmXSk7XG4gIGNvbnN0IHNob3dEaWFsb2cgPSB1c2VDYWxsYmFjayhmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgZGlhbG9nID0gZGlhbG9nUmVmID09PSBudWxsIHx8IGRpYWxvZ1JlZiA9PT0gdm9pZCAwID8gdm9pZCAwIDogZGlhbG9nUmVmLmN1cnJlbnQ7XG4gICAgZGlhbG9nLnNob3coe1xuICAgICAgYW5jaG9yT2Zmc2V0OiBwcm9wcy5kaWFsb2dMb2NhdGlvbixcbiAgICAgIGlzVHJhbnNwYXJlbnQ6IHRydWUsXG4gICAgICBvcGFjaXR5OiAxLjAsXG4gICAgICByZXNpemU6IFwibm9uZVwiLFxuICAgICAgc2l6ZTogUFNfRElBTE9HX1NJWkVcbiAgICB9KTtcbiAgICBkaWFsb2cuYWRkRXZlbnRMaXN0ZW5lcihcImxvYWRcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgZGlhbG9nLmZvY3VzKCk7XG4gICAgICBkaWFsb2cuaGFzTG9hZGVkID0gdHJ1ZTtcbiAgICAgIHBhbmVsSG9zdCA9PT0gbnVsbCB8fCBwYW5lbEhvc3QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHBhbmVsSG9zdC5vblBhbmVsT3BlbigpO1xuICAgIH0sIHtcbiAgICAgIG9uY2U6IHRydWVcbiAgICB9KTtcbiAgICBwcm9wcy5zZXRWaXNpYmlsaXR5KHRydWUpO1xuICB9LCBbZGlhbG9nUmVmLCBwcm9wc10pO1xuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIHByb3BzLnZpc2libGUgPyBzaG93RGlhbG9nKCkgOiBjbG9zZURpYWxvZygpO1xuICAgIHNldElzUmV2aWV3RGlzYWJsZWQocHJvcHMuaXNSZXZpZXdEaXNhYmxlZCk7XG4gICAgaWYgKHByb3BzLnZpc2libGUpIHtcbiAgICAgIHNldExvY2FsU2hhcmluZ1BhbmVsQWN0aXZlKGZhbHNlKTtcbiAgICB9XG4gIH0sIFtwcm9wcy52aXNpYmxlXSk7XG5cbiAgLy8gSWYgbW91c2UgY2xpY2sgaGFwcGVucyBvdXRzaWRlIG9mIHRoZSBTaGFyZVBhbmVsIGJvdW5kYXJ5LCBjbG9zZSB0aGUgZGlhbG9nLlxuICBjb25zdCBoYW5kbGVHbG9iYWxNb3VzZURvd24gPSBmdW5jdGlvbiAoZXZlbnQsIGNvb3JkaW5hdGVzKSB7XG4gICAgaWYgKCFwcm9wcy52aXNpYmxlKSByZXR1cm47XG4gICAgaWYgKCFpc0luQm91bmRhcnkoY29vcmRpbmF0ZXMsIHByb3BzLmRpYWxvZ0xvY2F0aW9uKSAmJiBwcm9wcy5idXR0b25Mb2NhdGlvbiAmJiAhaXNJbkJvdW5kYXJ5KGNvb3JkaW5hdGVzLCBwcm9wcy5idXR0b25Mb2NhdGlvbikpIHtcbiAgICAgIGNsb3NlRGlhbG9nKCk7XG4gICAgfVxuICB9O1xuICBjb25zdCBoYW5kbGVLZXlEb3duID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgaWYgKGV2ZW50LmtleSA9PT0gRVNDQVBFX0tFWSkge1xuICAgICAgY2xvc2VEaWFsb2coKTtcbiAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gRU5URVJfS0VZKSB7XG4gICAgICBsZXQgdGFyZ2V0RWxlbWVudERhdGFNZW51QXR0cmlidXRlID0gZXZlbnQudGFyZ2V0LmdldEF0dHJpYnV0ZShcImRhdGEtbWVudVwiKTtcbiAgICAgIGlmICh0YXJnZXRFbGVtZW50RGF0YU1lbnVBdHRyaWJ1dGUgJiYgKHRhcmdldEVsZW1lbnREYXRhTWVudUF0dHJpYnV0ZSA9PT0gSU5WSVRFX1RPX0VESVRfTUVOVSB8fCB0YXJnZXRFbGVtZW50RGF0YU1lbnVBdHRyaWJ1dGUgPT09IFNIQVJFX0ZPUl9SRVZJRVdfTUVOVSB8fCB0YXJnZXRFbGVtZW50RGF0YU1lbnVBdHRyaWJ1dGUgPT09IEFOSU1BVEVfSU5fRklSRUZMWSkpIGV2ZW50LnRhcmdldC5jbGljaygpO1xuICAgIH1cbiAgfTtcblxuICAvLyBDYWxsZWQgb25seSB0aGUgZmlyc3QgdGltZSBwYW5lbCBpcyBzaG93blxuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIHVwZGF0ZVRoZW1lKCk7XG4gICAgaWYgKGhvc3QgJiYgaG9zdC5hZGRFdmVudExpc3RlbmVyKSB7XG4gICAgICBob3N0LmFkZEV2ZW50TGlzdGVuZXIoVVhQRXZlbnRUeXBlcy5USEVNRSwgdXBkYXRlVGhlbWUpO1xuICAgIH1cbiAgICBwc0FjdGlvbi5hZGROb3RpZmljYXRpb25MaXN0ZW5lcihHTE9CQUxfRVZFTlRTLCBlbWl0KTtcbiAgICBwc0NvcmUuYWRkTm90aWZpY2F0aW9uTGlzdGVuZXIoXCJPU1wiLCBbXCJnbG9iYWxNb3VzZURvd25cIl0sIGVtaXQpO1xuICB9LCBbXSk7XG5cbiAgLy8gQXR0YWNoIG5ldyBjb3B5IG9mIGhhbmRsZUdsb2JhbE1vdXNlRG93biBvbiBldmVyeSByZW5kZXJcbiAgLy8gYXMgdGhlIGhhbmRsZUdsb2JhbE1vdXNlRG93biBuZWVkcyB1cGRhdGVkIGRpYWxvZ0xvY2F0aW9uIHZhbHVlXG4gIGNvbnN0IGRpYWxvZ0lkID0gYERJQUxPRy0ke0RhdGUubm93KCl9YDtcbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBkb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoVVhQRXZlbnRUeXBlcy5LRVlET1dOLCBoYW5kbGVLZXlEb3duKTtcbiAgICBzZXREaWFsb2dMaXN0ZW5lcihPU19FVkVOVFMuTU9VU0VfRE9XTiwgZGlhbG9nSWQsIGhhbmRsZUdsb2JhbE1vdXNlRG93bik7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlRXZlbnRMaXN0ZW5lcihVWFBFdmVudFR5cGVzLktFWURPV04sIGhhbmRsZUtleURvd24pO1xuICAgICAgcmVtb3ZlRGlhbG9nTGlzdGVuZXJzKGRpYWxvZ0lkKTtcbiAgICB9O1xuICB9LCBbZGlhbG9nSWRdKTtcblxuICAvLyBXZSBhcmUgdXNpbmcgc3BlY3RydW0gY29sb3JzIGZvciB0ZXh0c1xuICBjb25zdCBnZXRTcGVjdHJ1bUNsYXNzID0gZnVuY3Rpb24gKCkge1xuICAgIGlmICh0aGVtZSA9PT0gXCJkYXJrZXN0XCIpIHtcbiAgICAgIHJldHVybiBcInNwZWN0cnVtIHNwZWN0cnVtLS1kYXJrZXN0XCI7XG4gICAgfSBlbHNlIGlmICh0aGVtZSA9PT0gXCJkYXJrXCIpIHtcbiAgICAgIHJldHVybiBcInNwZWN0cnVtIHNwZWN0cnVtLS1kYXJrXCI7XG4gICAgfSBlbHNlIGlmICh0aGVtZSA9PT0gXCJsaWdodFwiKSB7XG4gICAgICByZXR1cm4gXCJzcGVjdHJ1bSBzcGVjdHJ1bS0tbGlnaHRcIjtcbiAgICB9IGVsc2UgaWYgKHRoZW1lID09PSBcImxpZ2h0ZXN0XCIpIHtcbiAgICAgIHJldHVybiBcInNwZWN0cnVtIHNwZWN0cnVtLS1saWdodGVzdFwiO1xuICAgIH1cbiAgfTtcbiAgZnVuY3Rpb24gc2hvd1RvYXN0KHR5cGUsIG1zZykge1xuICAgIHNldFRvYXN0VHlwZSh0eXBlKTtcbiAgICBzZXRUb2FzdE1lc3NhZ2UobXNnKTtcbiAgICBzZXRUb2FzdFZpc2libGUodHJ1ZSk7XG4gICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICBzZXRUb2FzdFZpc2libGUoZmFsc2UpO1xuICAgIH0sIDUwMDApO1xuICB9XG4gIGNvbnN0IHRvYXN0ID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoVG9hc3QsIHtcbiAgICB0b2FzdFR5cGU6IHRvYXN0VHlwZSxcbiAgICBtZXNzYWdlOiB0b2FzdE1lc3NhZ2UsXG4gICAgc2V0VG9hc3RWaXNpYmxlOiBzZXRUb2FzdFZpc2libGVcbiAgfSk7XG4gIGNvbnN0IGhlYWRlclZpZXcgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChIZWFkZXJWaWV3Q29udGFpbmVyLCBudWxsLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChIZWFkZXJWaWV3LCBudWxsLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChIZWFkZXJUZXh0VmlldywgbnVsbCwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcC1oZWFkaW5nXCIsIHtcbiAgICBzaXplOiBcInNcIixcbiAgICBzdHlsZToge1xuICAgICAgbWFyZ2luOiAwXG4gICAgfVxuICB9LCBcIlNoYXJlXCIpKSkpO1xuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogZ2V0U3BlY3RydW1DbGFzcygpXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGlhbG9nXCIsIHtcbiAgICBpZDogXCJwcy1kaWFsb2dcIixcbiAgICBjbGFzc05hbWU6ICFpc01hYyA/IFwiZGlhbG9nLWJvcmRlclwiIDogXCJcIixcbiAgICByZWY6IGRpYWxvZ1JlZlxuICB9LCBoZWFkZXJWaWV3LCB0b2FzdFZpc2libGUgJiYgdG9hc3QsIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFNoYXJlTWVudSwge1xuICAgIHZpc2libGU6IHByb3BzLnZpc2libGUsXG4gICAgaXNSZXZpZXdEaXNhYmxlZDogaXNSZXZpZXdEaXNhYmxlZCxcbiAgICBpc0FuaW1hdGVJbkZpcmVmbHlFbmFibGVkOiBwcm9wcy5pc0FuaW1hdGVJbkZpcmVmbHlFbmFibGVkLFxuICAgIGNsb3NlRGlhbG9nOiBjbG9zZURpYWxvZyxcbiAgICBzZXRTbGFja1BhbmVsQWN0aXZlOiBzZXRTbGFja1BhbmVsQWN0aXZlLFxuICAgIGlzU2xhY2tQYW5lbEFjdGl2ZTogc2xhY2tQYW5lbEFjdGl2ZSxcbiAgICBzZXRMb2NhbFNoYXJpbmdQYW5lbEFjdGl2ZTogc2V0TG9jYWxTaGFyaW5nUGFuZWxBY3RpdmUsXG4gICAgaXNMb2NhbFNoYXJpbmdQYW5lbEFjdGl2ZTogbG9jYWxTaGFyaW5nUGFuZWxBY3RpdmUsXG4gICAgc2hvd1RvYXN0OiBzaG93VG9hc3RcbiAgfSkpKTtcbn0pOyIsImZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShlLCByLCB0KSB7IHJldHVybiAociA9IF90b1Byb3BlcnR5S2V5KHIpKSBpbiBlID8gT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIHIsIHsgdmFsdWU6IHQsIGVudW1lcmFibGU6ICEwLCBjb25maWd1cmFibGU6ICEwLCB3cml0YWJsZTogITAgfSkgOiBlW3JdID0gdCwgZTsgfVxuZnVuY3Rpb24gX3RvUHJvcGVydHlLZXkodCkgeyB2YXIgaSA9IF90b1ByaW1pdGl2ZSh0LCBcInN0cmluZ1wiKTsgcmV0dXJuIFwic3ltYm9sXCIgPT0gdHlwZW9mIGkgPyBpIDogaSArIFwiXCI7IH1cbmZ1bmN0aW9uIF90b1ByaW1pdGl2ZSh0LCByKSB7IGlmIChcIm9iamVjdFwiICE9IHR5cGVvZiB0IHx8ICF0KSByZXR1cm4gdDsgdmFyIGUgPSB0W1N5bWJvbC50b1ByaW1pdGl2ZV07IGlmICh2b2lkIDAgIT09IGUpIHsgdmFyIGkgPSBlLmNhbGwodCwgciB8fCBcImRlZmF1bHRcIik7IGlmIChcIm9iamVjdFwiICE9IHR5cGVvZiBpKSByZXR1cm4gaTsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkBAdG9QcmltaXRpdmUgbXVzdCByZXR1cm4gYSBwcmltaXRpdmUgdmFsdWUuXCIpOyB9IHJldHVybiAoXCJzdHJpbmdcIiA9PT0gciA/IFN0cmluZyA6IE51bWJlcikodCk7IH1cbmltcG9ydCBSZWFjdERPTSBmcm9tIFwicmVhY3QtZG9tXCI7XG5pbXBvcnQgeyBTaGFyZVBhbmVsIH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvU2hhcmVQYW5lbC5qc3hcIjtcbmltcG9ydCBSZWFjdCwgeyBjcmVhdGVSZWYgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IGdldFJlbmRlckNvb3JkaW5hdGUsIGdldEZlYXR1cmVGbGFnU3RhdHVzIH0gZnJvbSBcIi4uL2hvc3QvcGhvdG9zaG9wXCI7XG5pbXBvcnQgeyBGRUFUVVJFX0ZMQUdTIH0gZnJvbSBcIi4uL3V0aWxzL2NvbW1vblV0aWxzXCI7XG5leHBvcnQgY29uc3QgREVGQVVMVF9ESUFMT0dfQ09PUkRJTkFURVMgPSB7XG4gIGJvdHRvbTogNDAwLFxuICBsZWZ0OiAxMTkyLFxuICByaWdodDogMTAwLFxuICB0b3A6IDgwXG59O1xuZXhwb3J0IGNsYXNzIFNoYXJlUGFuZWxDb250cm9sbGVyIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcbiAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgXCJzZXRWaXNpYmlsaXR5XCIsIGZ1bmN0aW9uICh2aXNpYmxlKSB7XG4gICAgICBpZiAoX3RoaXMudmlzaWJsZSAhPSB2aXNpYmxlKSB7XG4gICAgICAgIF90aGlzLnZpc2libGUgPSB2aXNpYmxlO1xuICAgICAgICBfdGhpcy5yZW5kZXIoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnZpc2libGUgPSBmYWxzZTtcbiAgICB0aGlzLmRpYWxvZ0xvY2F0aW9uID0gREVGQVVMVF9ESUFMT0dfQ09PUkRJTkFURVM7XG4gICAgdGhpcy5idXR0b25Mb2NhdGlvbiA9IERFRkFVTFRfRElBTE9HX0NPT1JESU5BVEVTO1xuICAgIHRoaXMuaXNSZXZpZXdEaXNhYmxlZCA9IGZhbHNlO1xuICAgIHRoaXMuaXNBbmltYXRlSW5GaXJlZmx5RW5hYmxlZCA9IGZhbHNlO1xuICAgIHRoaXMuY2hpbGRSZWYgPSBjcmVhdGVSZWYoKTtcbiAgfVxuICByZW5kZXIoKSB7XG4gICAgUmVhY3RET00ucmVuZGVyKC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFNoYXJlUGFuZWwsIHtcbiAgICAgIHJlZjogdGhpcy5jaGlsZFJlZixcbiAgICAgIHZpc2libGU6IHRoaXMudmlzaWJsZSxcbiAgICAgIGRpYWxvZ0xvY2F0aW9uOiB0aGlzLmRpYWxvZ0xvY2F0aW9uLFxuICAgICAgYnV0dG9uTG9jYXRpb246IHRoaXMuYnV0dG9uTG9jYXRpb24sXG4gICAgICBzZXRWaXNpYmlsaXR5OiB0aGlzLnNldFZpc2liaWxpdHksXG4gICAgICBpc1Jldmlld0Rpc2FibGVkOiB0aGlzLmlzUmV2aWV3RGlzYWJsZWQsXG4gICAgICBpc0FuaW1hdGVJbkZpcmVmbHlFbmFibGVkOiB0aGlzLmlzQW5pbWF0ZUluRmlyZWZseUVuYWJsZWRcbiAgICB9KSwgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJyb290XCIpKTtcbiAgfVxuICBhc3luYyBzaG93UGFuZWwocHJvcCkge1xuICAgIHZhciBfdGhpcyRjaGlsZFJlZiwgX3RoaXMkY2hpbGRSZWYkY3VycmVuLCBfdGhpcyRjaGlsZFJlZiRjdXJyZW4yLCBfdGhpcyRjaGlsZFJlZjIsIF90aGlzJGNoaWxkUmVmMiRjdXJyZSwgX3RoaXMkY2hpbGRSZWYyJGN1cnJlMjtcbiAgICBpZiAocHJvcCAmJiBwcm9wLmRhdGEpIHtcbiAgICAgIGxldCBkYXRhID0gSlNPTi5wYXJzZShwcm9wLmRhdGEpO1xuICAgICAgdGhpcy5pc1Jldmlld0Rpc2FibGVkID0gZGF0YS5pc1Jldmlld0Rpc2FibGVkO1xuICAgIH1cblxuICAgIC8vIEdldCBmZWF0dXJlIGZsYWcgc3RhdHVzIGJlZm9yZSBzaG93aW5nIHBhbmVsXG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuaXNBbmltYXRlSW5GaXJlZmx5RW5hYmxlZCA9IGF3YWl0IGdldEZlYXR1cmVGbGFnU3RhdHVzKEZFQVRVUkVfRkxBR1MuRkVBVFVSRV9GTEFHU19BTklNQVRFX0lOX0ZJUkVGTFkpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ0ZhaWxlZCB0byBnZXQgZmVhdHVyZSBmbGFnIHN0YXR1czonLCBlcnJvcik7XG4gICAgICB0aGlzLmlzQW5pbWF0ZUluRmlyZWZseUVuYWJsZWQgPSBmYWxzZTtcbiAgICB9XG4gICAgY29uc3Qge1xuICAgICAgZGlhbG9nQ29vcmRpbmF0ZXMsXG4gICAgICBjdGFCdXR0b25Db29yZGluYXRlc1xuICAgIH0gPSBhd2FpdCBnZXRSZW5kZXJDb29yZGluYXRlKCk7XG4gICAgdGhpcy5kaWFsb2dMb2NhdGlvbiA9IGRpYWxvZ0Nvb3JkaW5hdGVzO1xuICAgIHRoaXMuYnV0dG9uTG9jYXRpb24gPSBjdGFCdXR0b25Db29yZGluYXRlcztcbiAgICB0aGlzLnNldFZpc2liaWxpdHkodHJ1ZSk7XG4gICAgLy8gSGFuZGxpbmcgOiBTZW5kIHRvIEFwcHMgUGFuZWwgZGlzbWlzc2VzIHdoZW4gb3BlbmluZyBzaGFyZSBtZW51IGZyb20gU2hhcmUgYnV0dG9uIGJ1dCBzZXR0aW5ncyBwYW5lbCByZW1haW5zIGFjdGl2ZS5cbiAgICBpZiAoKF90aGlzJGNoaWxkUmVmID0gdGhpcy5jaGlsZFJlZikgIT09IG51bGwgJiYgX3RoaXMkY2hpbGRSZWYgIT09IHZvaWQgMCAmJiAoX3RoaXMkY2hpbGRSZWYkY3VycmVuID0gX3RoaXMkY2hpbGRSZWYuY3VycmVudCkgIT09IG51bGwgJiYgX3RoaXMkY2hpbGRSZWYkY3VycmVuICE9PSB2b2lkIDAgJiYgKF90aGlzJGNoaWxkUmVmJGN1cnJlbjIgPSBfdGhpcyRjaGlsZFJlZiRjdXJyZW4uc2V0dGluZ3NQYW5lbFJlZikgIT09IG51bGwgJiYgX3RoaXMkY2hpbGRSZWYkY3VycmVuMiAhPT0gdm9pZCAwICYmIF90aGlzJGNoaWxkUmVmJGN1cnJlbjIuY3VycmVudCkge1xuICAgICAgdGhpcy5jaGlsZFJlZi5jdXJyZW50LnNldHRpbmdzUGFuZWxSZWYuY3VycmVudC5jbG9zZURpYWxvZygpO1xuICAgIH1cbiAgICBpZiAoKF90aGlzJGNoaWxkUmVmMiA9IHRoaXMuY2hpbGRSZWYpICE9PSBudWxsICYmIF90aGlzJGNoaWxkUmVmMiAhPT0gdm9pZCAwICYmIChfdGhpcyRjaGlsZFJlZjIkY3VycmUgPSBfdGhpcyRjaGlsZFJlZjIuY3VycmVudCkgIT09IG51bGwgJiYgX3RoaXMkY2hpbGRSZWYyJGN1cnJlICE9PSB2b2lkIDAgJiYgKF90aGlzJGNoaWxkUmVmMiRjdXJyZTIgPSBfdGhpcyRjaGlsZFJlZjIkY3VycmUuc2xhY2tQYW5lbFJlZikgIT09IG51bGwgJiYgX3RoaXMkY2hpbGRSZWYyJGN1cnJlMiAhPT0gdm9pZCAwICYmIF90aGlzJGNoaWxkUmVmMiRjdXJyZTIuY3VycmVudCkge1xuICAgICAgdGhpcy5jaGlsZFJlZi5jdXJyZW50LnNsYWNrUGFuZWxSZWYuY3VycmVudC5jbG9zZURpYWxvZygpO1xuICAgIH1cbiAgfVxuICBjbG9zZVBhbmVsKCkge1xuICAgIHZhciBfdGhpcyRjaGlsZFJlZjMsIF90aGlzJGNoaWxkUmVmMyRjdXJyZSwgX3RoaXMkY2hpbGRSZWYzJGN1cnJlMiwgX3RoaXMkY2hpbGRSZWY0LCBfdGhpcyRjaGlsZFJlZjQkY3VycmUsIF90aGlzJGNoaWxkUmVmNSwgX3RoaXMkY2hpbGRSZWY1JGN1cnJlO1xuICAgIHRoaXMuc2V0VmlzaWJpbGl0eShmYWxzZSk7XG4gICAgaWYgKChfdGhpcyRjaGlsZFJlZjMgPSB0aGlzLmNoaWxkUmVmKSAhPT0gbnVsbCAmJiBfdGhpcyRjaGlsZFJlZjMgIT09IHZvaWQgMCAmJiAoX3RoaXMkY2hpbGRSZWYzJGN1cnJlID0gX3RoaXMkY2hpbGRSZWYzLmN1cnJlbnQpICE9PSBudWxsICYmIF90aGlzJGNoaWxkUmVmMyRjdXJyZSAhPT0gdm9pZCAwICYmIChfdGhpcyRjaGlsZFJlZjMkY3VycmUyID0gX3RoaXMkY2hpbGRSZWYzJGN1cnJlLnNldHRpbmdzUGFuZWxSZWYpICE9PSBudWxsICYmIF90aGlzJGNoaWxkUmVmMyRjdXJyZTIgIT09IHZvaWQgMCAmJiBfdGhpcyRjaGlsZFJlZjMkY3VycmUyLmN1cnJlbnQpIHtcbiAgICAgIHRoaXMuY2hpbGRSZWYuY3VycmVudC5zZXR0aW5nc1BhbmVsUmVmLmN1cnJlbnQuY2xvc2VEaWFsb2coKTtcbiAgICB9XG4gICAgaWYgKChfdGhpcyRjaGlsZFJlZjQgPSB0aGlzLmNoaWxkUmVmKSAhPT0gbnVsbCAmJiBfdGhpcyRjaGlsZFJlZjQgIT09IHZvaWQgMCAmJiAoX3RoaXMkY2hpbGRSZWY0JGN1cnJlID0gX3RoaXMkY2hpbGRSZWY0LmN1cnJlbnQuc2xhY2tQYW5lbFJlZikgIT09IG51bGwgJiYgX3RoaXMkY2hpbGRSZWY0JGN1cnJlICE9PSB2b2lkIDAgJiYgX3RoaXMkY2hpbGRSZWY0JGN1cnJlLmN1cnJlbnQpIHtcbiAgICAgIHRoaXMuY2hpbGRSZWYuY3VycmVudC5zbGFja1BhbmVsUmVmLmN1cnJlbnQuY2xvc2VEaWFsb2coKTtcbiAgICB9XG4gICAgaWYgKChfdGhpcyRjaGlsZFJlZjUgPSB0aGlzLmNoaWxkUmVmKSAhPT0gbnVsbCAmJiBfdGhpcyRjaGlsZFJlZjUgIT09IHZvaWQgMCAmJiAoX3RoaXMkY2hpbGRSZWY1JGN1cnJlID0gX3RoaXMkY2hpbGRSZWY1LmN1cnJlbnQubG9jYWxTaGFyZVBhbmVsUmVmKSAhPT0gbnVsbCAmJiBfdGhpcyRjaGlsZFJlZjUkY3VycmUgIT09IHZvaWQgMCAmJiBfdGhpcyRjaGlsZFJlZjUkY3VycmUuY3VycmVudCkge1xuICAgICAgdGhpcy5jaGlsZFJlZi5jdXJyZW50LmxvY2FsU2hhcmVQYW5lbFJlZi5jdXJyZW50LmNsb3NlRGlhbG9nKCk7XG4gICAgfVxuICB9XG59IiwiaW1wb3J0IFwiLi9nbG9iYWwuanNcIjsgLy8gdG8gZml4IHN0eWxlZCBjb21wb25lbnRzIGRpc2FwcGVhcmluZyBpbiBwcm9kdWN0aW9uXG5pbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgUmVhY3RET00gZnJvbSBcInJlYWN0LWRvbVwiO1xuaW1wb3J0IFwiQHNwZWN0cnVtLWNzcy92YXJzL2Rpc3Qvc3BlY3RydW0tZ2xvYmFsLmNzc1wiO1xuaW1wb3J0IFwiQHNwZWN0cnVtLWNzcy92YXJzL2Rpc3Qvc3BlY3RydW0tbGlnaHQuY3NzXCI7XG5pbXBvcnQgXCJAc3BlY3RydW0tY3NzL3ZhcnMvZGlzdC9zcGVjdHJ1bS1saWdodGVzdC5jc3NcIjtcbmltcG9ydCBcIkBzcGVjdHJ1bS1jc3MvdmFycy9kaXN0L3NwZWN0cnVtLWRhcmsuY3NzXCI7XG5pbXBvcnQgXCJAc3BlY3RydW0tY3NzL3ZhcnMvZGlzdC9zcGVjdHJ1bS1kYXJrZXN0LmNzc1wiO1xuaW1wb3J0IFwiLi9zdHlsZXMuY3NzXCI7XG5pbXBvcnQgeyBTaGFyZVBhbmVsQ29udHJvbGxlciB9IGZyb20gXCIuL2NvbnRyb2xsZXJzL1NoYXJlUGFuZWxDb250cm9sbGVyLmpzeFwiO1xuaW1wb3J0IHsgZW50cnlwb2ludHMgfSBmcm9tIFwidXhwXCI7XG5jb25zdCBzaGFyZVBhbmVsQ29udHJvbGxlciA9IG5ldyBTaGFyZVBhbmVsQ29udHJvbGxlcigpO1xuZW50cnlwb2ludHMuc2V0dXAoe1xuICBwbHVnaW46IHtcbiAgICBjcmVhdGUocGx1Z2luKSB7XG4gICAgICAvKiBvcHRpb25hbCAqL1xuICAgIH0sXG4gICAgZGVzdHJveSgpIHtcbiAgICAgIC8qIG9wdGlvbmFsICovXG4gICAgfVxuICB9LFxuICBjb21tYW5kczoge1xuICAgIG9wZW5TaGFyZVBhbmVsOiBmdW5jdGlvbiAocHJvcCkge1xuICAgICAgcmV0dXJuIHNoYXJlUGFuZWxDb250cm9sbGVyLnNob3dQYW5lbChwcm9wKTtcbiAgICB9LFxuICAgIGNsb3NlU2hhcmVQYW5lbDogZnVuY3Rpb24gKHByb3ApIHtcbiAgICAgIHJldHVybiBzaGFyZVBhbmVsQ29udHJvbGxlci5jbG9zZVBhbmVsKHByb3ApO1xuICAgIH1cbiAgfVxufSk7Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDMUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUN2RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlTQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQ0FVQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0NBVUE7QUFDQTs7Ozs7Ozs7QUN4SkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNySEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlKQTs7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1ZBOztBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDVkE7O0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNWQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQ2hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDekRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDcEVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBQ3RFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDTkE7QUFDQTtBQUNBO0FBQ0E7OztBQ0hBO0FBQ0E7QUFDQTs7O0FDRkE7QUFDQTtBQUNBOzs7QUNGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDWkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQU9BOzs7QUNsREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ05BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDakJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQzlGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNoS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ3REQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUM3U0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQzNCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FDeEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDMUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ3REQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUMzQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDM0NBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ2JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDekNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDZEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNkQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDckJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUN6R0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUN4REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDcE1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDL0NBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDdEZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNwT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQzlFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ2hGQTs7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ2xHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNqUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUN0SUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQzNCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNiQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUN0RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FDeEZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7OztBQ3pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDYkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBQ3BSQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqdEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuWEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM05BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///247\n')}]);