diff --git a/.github/workflows/deploy-minified.yml b/.github/workflows/deploy-minified.yml deleted file mode 100644 index 96971f1..0000000 --- a/.github/workflows/deploy-minified.yml +++ /dev/null @@ -1,74 +0,0 @@ -name: Deploy to Production (Minified) - -on: - push: - branches: [ main, master ] - workflow_dispatch: - -jobs: - deploy: - runs-on: ubuntu-latest - - steps: - - name: Deploy to production server - uses: appleboy/ssh-action@v1.0.3 - with: - host: ${{ secrets.PROD_HOST }} - username: ${{ secrets.PROD_USERNAME }} - key: ${{ secrets.PROD_SSH_KEY }} - port: ${{ secrets.PROD_PORT || 22 }} - script: | - # Navigate to project directory - cd ${{ secrets.PROD_PROJECT_PATH || '/var/www/portal' }} - - # Backup current deployment - echo "💾 Creating backup..." - cp -r . ../portal-backup-$(date +%Y%m%d_%H%M%S) || true - - # Pull latest code - echo "🔄 Pulling latest code..." - git pull origin ${{ github.ref_name }} - - # Install/Update Composer dependencies for production - echo "📦 Installing Composer dependencies..." - composer install --no-dev --optimize-autoloader --no-interaction - - # Install/Update NPM dependencies - echo "📦 Installing NPM dependencies..." - npm ci --only=production - - # Build and minify assets - echo "🏗️ Building and minifying assets..." - npm run minify-all - - # Run database migrations (if needed) - echo "🗃️ Running database migrations..." - php artisan migrate --force - - # Laravel optimizations for production - echo "⚡ Optimizing Laravel for production..." - php artisan config:cache - php artisan route:cache - php artisan view:cache - php artisan optimize - - # Clear all caches - echo "🧹 Clearing caches..." - php artisan cache:clear - php artisan view:clear - php artisan config:clear - - # Queue restart (if using queues) - echo "🔄 Restarting queues..." - php artisan queue:restart || true - - # Set proper permissions - echo "🔐 Setting permissions..." - chmod -R 755 storage bootstrap/cache public/uploads - chown -R www-data:www-data storage bootstrap/cache public/uploads - - # Cleanup old backups (keep last 5) - echo "🧹 Cleaning up old backups..." - find ../portal-backup-* -maxdepth 0 -type d | sort | head -n -5 | xargs rm -rf || true - - echo "✅ Production deployment completed successfully!" \ No newline at end of file diff --git a/app/Http/Controllers/admin/package/OsVersion.php b/app/Http/Controllers/admin/package/OsVersion.php index bd10d1a..8cb5341 100644 --- a/app/Http/Controllers/admin/package/OsVersion.php +++ b/app/Http/Controllers/admin/package/OsVersion.php @@ -38,10 +38,14 @@ class OsVersion extends Controller } public function store(OsVersionRequest $request) { - $request->validated(); + $validatedData = $request->validated(); + + // Remove unnecessary fields + unset($validatedData['vcenter_id'], $validatedData['module_datacenter_id']); + DB::beginTransaction(); try { - $this->osRepository->create($request->all()); + $this->osRepository->create($validatedData); DB::commit(); } catch (\Exception $error) { DB::rollBack(); @@ -69,9 +73,15 @@ class OsVersion extends Controller if (! $version) { return back()->withErrors('Can\'t find version os by ID #' . $id); } + + $validatedData = $request->validated(); + + // Remove unnecessary fields + unset($validatedData['vcenter_id'], $validatedData['module_datacenter_id']); + DB::beginTransaction(); try { - $this->osRepository->update($id,$request->all()); + $this->osRepository->update($id, $validatedData); DB::commit(); } catch (\Exception $error) { DB::rollBack(); diff --git a/app/Http/Controllers/frontend/RechargeController.php b/app/Http/Controllers/frontend/RechargeController.php index f203bd1..47a38ba 100644 --- a/app/Http/Controllers/frontend/RechargeController.php +++ b/app/Http/Controllers/frontend/RechargeController.php @@ -37,6 +37,8 @@ class RechargeController extends Controller public function paymentProcess(RechargeRequest $request) { + $data = $request->validated(); + $auth = customer(); if (!$auth) { return redirect()->route('auth.index')->withErrors('Vui lòng đăng nhập'); @@ -44,7 +46,7 @@ class RechargeController extends Controller // Chuẩn bị dữ liệu cho VNPAY $paymentData = [ - 'amount' => $request->money, + 'amount' => $data['total_amount'], 'language' => 'vn', ]; $paymentUrl = $this->vnpayService->createPaymentUrl($paymentData); diff --git a/app/Http/Requests/Package/OsVersionRequest.php b/app/Http/Requests/Package/OsVersionRequest.php index dd6ffbe..75f9c46 100644 --- a/app/Http/Requests/Package/OsVersionRequest.php +++ b/app/Http/Requests/Package/OsVersionRequest.php @@ -26,6 +26,7 @@ class OsVersionRequest extends FormRequest 'module_host_id' => 'required', 'os_group_id' => 'required', 'os_id' => 'required', + 'template_id' => 'nullable', 'status' => 'required' ]; } diff --git a/app/Http/Requests/Recharge/RechargeRequest.php b/app/Http/Requests/Recharge/RechargeRequest.php index d7405dd..a87a02e 100644 --- a/app/Http/Requests/Recharge/RechargeRequest.php +++ b/app/Http/Requests/Recharge/RechargeRequest.php @@ -22,7 +22,7 @@ class RechargeRequest extends FormRequest public function rules(): array { return [ - 'money' => 'required|numeric|min:200000', + 'total_amount' => 'required|numeric|min:200000', 'bankCode' => 'nullable|string', ]; } @@ -31,9 +31,9 @@ class RechargeRequest extends FormRequest public function messages() { return [ - 'money.required' => 'Vui lòng nhập số tiền cần nạp.', - 'money.numeric' => 'Số tiền phải là một số.', - 'money.min' => 'Số tiền nạp vui lòng lớn hơn hoặc bằng 200.000vnđ', + 'total_amount.required' => 'Vui lòng nhập số tiền cần nạp.', + 'total_amount.numeric' => 'Số tiền phải là một số.', + 'total_amount.min' => 'Số tiền nạp vui lòng lớn hơn hoặc bằng 200.000vnđ', ]; } } diff --git a/public/css/app.css b/public/css/app.css index 1954d48..8161d2c 100644 --- a/public/css/app.css +++ b/public/css/app.css @@ -503,9 +503,6 @@ .inset-x-0 { inset-inline: calc(var(--spacing) * 0); } - .inset-x-3 { - inset-inline: calc(var(--spacing) * 3); - } .inset-y-0 { inset-block: calc(var(--spacing) * 0); } @@ -530,9 +527,6 @@ .-top-0\.5 { top: calc(var(--spacing) * -0.5); } - .-top-1 { - top: calc(var(--spacing) * -1); - } .-top-10 { top: calc(var(--spacing) * -10); } @@ -608,9 +602,6 @@ .-left-0\.5 { left: calc(var(--spacing) * -0.5); } - .-left-1 { - left: calc(var(--spacing) * -1); - } .-left-\[200\%\] { left: calc(200% * -1); } @@ -632,9 +623,6 @@ .left-10 { left: calc(var(--spacing) * 10); } - .left-full { - left: 100%; - } .isolate { isolation: isolate; } @@ -920,9 +908,6 @@ .mt-\[2px\] { margin-top: 2px; } - .mt-\[4\.7rem\] { - margin-top: 4.7rem; - } .mt-auto { margin-top: auto; } @@ -5518,13 +5503,6 @@ display: none; } } - .group-hover\:visible { - &:is(:where(.group):hover *) { - @media (hover: hover) { - visibility: visible; - } - } - } .group-hover\:block { &:is(:where(.group):hover *) { @media (hover: hover) { @@ -5556,20 +5534,6 @@ } } } - .group-hover\:rotate-180 { - &:is(:where(.group):hover *) { - @media (hover: hover) { - rotate: 180deg; - } - } - } - .group-hover\:bg-orange-50 { - &:is(:where(.group):hover *) { - @media (hover: hover) { - background-color: var(--color-orange-50); - } - } - } .group-hover\:text-gray-500 { &:is(:where(.group):hover *) { @media (hover: hover) { @@ -5598,27 +5562,6 @@ } } } - .group-hover\/submenu\:visible { - &:is(:where(.group\/submenu):hover *) { - @media (hover: hover) { - visibility: visible; - } - } - } - .group-hover\/submenu\:rotate-90 { - &:is(:where(.group\/submenu):hover *) { - @media (hover: hover) { - rotate: 90deg; - } - } - } - .group-hover\/submenu\:opacity-100 { - &:is(:where(.group\/submenu):hover *) { - @media (hover: hover) { - opacity: 100%; - } - } - } .group-focus\:hidden { &:is(:where(.group):focus *) { display: none; diff --git a/public/icon/bandwidth.svg b/public/icon/bandwidth.svg new file mode 100644 index 0000000..9cdc6b8 --- /dev/null +++ b/public/icon/bandwidth.svg @@ -0,0 +1,10 @@ + + + + + \ No newline at end of file diff --git a/public/icon/cpu.svg b/public/icon/cpu.svg new file mode 100644 index 0000000..4675c6c --- /dev/null +++ b/public/icon/cpu.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/public/icon/network.svg b/public/icon/network.svg new file mode 100644 index 0000000..ba7b330 --- /dev/null +++ b/public/icon/network.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/public/icon/ram.svg b/public/icon/ram.svg new file mode 100644 index 0000000..7bd6afa --- /dev/null +++ b/public/icon/ram.svg @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/icon/storage.svg b/public/icon/storage.svg new file mode 100644 index 0000000..7328632 --- /dev/null +++ b/public/icon/storage.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/public/icon/video.svg b/public/icon/video.svg new file mode 100644 index 0000000..a4b07bb --- /dev/null +++ b/public/icon/video.svg @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/js/app.js b/public/js/app.js index 01d7338..d140bb3 100644 --- a/public/js/app.js +++ b/public/js/app.js @@ -16,7 +16,7 @@ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { "use strict"; -eval("/* provided dependency */ var process = __webpack_require__(/*! process/browser.js */ \"./node_modules/process/browser.js\");\n/* provided dependency */ var Buffer = __webpack_require__(/*! buffer */ \"./node_modules/buffer/index.js\")[\"Buffer\"];\n/*! Axios v1.8.4 Copyright (c) 2025 Matt Zabriskie and contributors */\n\n\nfunction bind(fn, thisArg) {\n return function wrap() {\n return fn.apply(thisArg, arguments);\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 : __webpack_require__.g)\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] = bind(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} 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}\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\nvar utils$1 = {\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/**\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\nutils$1.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$1.toJSONObject(this.config),\n code: this.code,\n status: this.status\n };\n }\n});\n\nconst prototype$1 = 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$1, '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$1);\n\n utils$1.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// eslint-disable-next-line strict\nvar httpAdapter = null;\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$1.isPlainObject(thing) || utils$1.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$1.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} arr - The array to check\n *\n * @returns {boolean}\n */\nfunction isFlatArray(arr) {\n return utils$1.isArray(arr) && !arr.some(isVisitable);\n}\n\nconst predicates = utils$1.toFlatObject(utils$1, {}, 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} obj - The object to convert to form data.\n * @param {string} formData - The FormData object to append to.\n * @param {Object} options\n *\n * @returns\n */\nfunction toFormData(obj, formData, options) {\n if (!utils$1.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 (FormData)();\n\n // eslint-disable-next-line no-param-reassign\n options = utils$1.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$1.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$1.isSpecCompliantForm(formData);\n\n if (!utils$1.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$1.isDate(value)) {\n return value.toISOString();\n }\n\n if (!useBlob && utils$1.isBlob(value)) {\n throw new AxiosError('Blob is not supported. Use a Buffer instead.');\n }\n\n if (utils$1.isArrayBuffer(value) || utils$1.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} 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$1.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$1.isArray(value) && isFlatArray(value)) ||\n ((utils$1.isFileList(value) || utils$1.endsWith(key, '[]')) && (arr = utils$1.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$1.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$1.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$1.forEach(value, function each(el, key) {\n const result = !(utils$1.isUndefined(el) || el === null) && visitor.call(\n formData, el, utils$1.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$1.isObject(obj)) {\n throw new TypeError('data must be an object');\n }\n\n build(obj);\n\n return formData;\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$1(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} params - The parameters to be converted to a FormData object.\n * @param {Object} options - The options object passed to the Axios constructor.\n *\n * @returns {void}\n */\nfunction AxiosURLSearchParams(params, options) {\n this._pairs = [];\n\n params && toFormData(params, this, options);\n}\n\nconst prototype = AxiosURLSearchParams.prototype;\n\nprototype.append = function append(name, value) {\n this._pairs.push([name, value]);\n};\n\nprototype.toString = function toString(encoder) {\n const _encode = encoder ? function(value) {\n return encoder.call(this, value, encode$1);\n } : encode$1;\n\n return this._pairs.map(function each(pair) {\n return _encode(pair[0]) + '=' + _encode(pair[1]);\n }, '').join('&');\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 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 || encode;\n\n if (utils$1.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$1.isURLSearchParams(params) ?\n params.toString() :\n new 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\nclass 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$1.forEach(this.handlers, function forEachHandler(h) {\n if (h !== null) {\n fn(h);\n }\n });\n }\n}\n\nvar InterceptorManager$1 = InterceptorManager;\n\nvar transitionalDefaults = {\n silentJSONParsing: true,\n forcedJSONParsing: true,\n clarifyTimeoutError: false\n};\n\nvar URLSearchParams$1 = typeof URLSearchParams !== 'undefined' ? URLSearchParams : AxiosURLSearchParams;\n\nvar FormData$1 = typeof FormData !== 'undefined' ? FormData : null;\n\nvar Blob$1 = typeof Blob !== 'undefined' ? Blob : null;\n\nvar platform$1 = {\n isBrowser: true,\n classes: {\n URLSearchParams: URLSearchParams$1,\n FormData: FormData$1,\n Blob: Blob$1\n },\n protocols: ['http', 'https', 'file', 'blob', 'url', 'data']\n};\n\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 origin = hasBrowserEnv && window.location.href || 'http://localhost';\n\nvar utils = /*#__PURE__*/Object.freeze({\n __proto__: null,\n hasBrowserEnv: hasBrowserEnv,\n hasStandardBrowserWebWorkerEnv: hasStandardBrowserWebWorkerEnv,\n hasStandardBrowserEnv: hasStandardBrowserEnv,\n navigator: _navigator,\n origin: origin\n});\n\nvar platform = {\n ...utils,\n ...platform$1\n};\n\nfunction toURLEncodedForm(data, options) {\n return toFormData(data, new platform.classes.URLSearchParams(), Object.assign({\n visitor: function(value, key, path, helpers) {\n if (platform.isNode && utils$1.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/**\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$1.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} 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 | 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$1.isArray(target) ? target.length : name;\n\n if (isLast) {\n if (utils$1.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$1.isObject(target[name])) {\n target[name] = [];\n }\n\n const result = buildPath(path, value, target[name], index);\n\n if (result && utils$1.isArray(target[name])) {\n target[name] = arrayToObject(target[name]);\n }\n\n return !isNumericKey;\n }\n\n if (utils$1.isFormData(formData) && utils$1.isFunction(formData.entries)) {\n const obj = {};\n\n utils$1.forEachEntry(formData, (name, value) => {\n buildPath(parsePropPath(name), value, obj, 0);\n });\n\n return obj;\n }\n\n return null;\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$1.isString(rawValue)) {\n try {\n (parser || JSON.parse)(rawValue);\n return utils$1.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: transitionalDefaults,\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$1.isObject(data);\n\n if (isObjectPayload && utils$1.isHTMLForm(data)) {\n data = new FormData(data);\n }\n\n const isFormData = utils$1.isFormData(data);\n\n if (isFormData) {\n return hasJSONContentType ? JSON.stringify(formDataToJSON(data)) : data;\n }\n\n if (utils$1.isArrayBuffer(data) ||\n utils$1.isBuffer(data) ||\n utils$1.isStream(data) ||\n utils$1.isFile(data) ||\n utils$1.isBlob(data) ||\n utils$1.isReadableStream(data)\n ) {\n return data;\n }\n if (utils$1.isArrayBufferView(data)) {\n return data.buffer;\n }\n if (utils$1.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$1.isFileList(data)) || contentType.indexOf('multipart/form-data') > -1) {\n const _FormData = this.env && this.env.FormData;\n\n return toFormData(\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$1.isResponse(data) || utils$1.isReadableStream(data)) {\n return data;\n }\n\n if (data && utils$1.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.from(e, AxiosError.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$1.forEach(['delete', 'get', 'head', 'post', 'put', 'patch'], (method) => {\n defaults.headers[method] = {};\n});\n\nvar defaults$1 = defaults;\n\n// RawAxiosHeaders whose duplicates are ignored by node\n// c.f. https://nodejs.org/api/http.html#http_message_headers\nconst ignoreDuplicateOf = utils$1.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 */\nvar 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\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$1.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$1.isFunction(filter)) {\n return filter.call(this, value, header);\n }\n\n if (isHeaderNameFilter) {\n value = header;\n }\n\n if (!utils$1.isString(value)) return;\n\n if (utils$1.isString(filter)) {\n return value.indexOf(filter) !== -1;\n }\n\n if (utils$1.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$1.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 {\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$1.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$1.forEach(headers, (_value, _header) => setHeader(_value, _header, _rewrite));\n\n if (utils$1.isPlainObject(header) || header instanceof this.constructor) {\n setHeaders(header, valueOrRewrite);\n } else if(utils$1.isString(header) && (header = header.trim()) && !isValidHeaderName(header)) {\n setHeaders(parseHeaders(header), valueOrRewrite);\n } else if (utils$1.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$1.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$1.isFunction(parser)) {\n return parser.call(this, value, key);\n }\n\n if (utils$1.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$1.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$1.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$1.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$1.forEach(this, (value, header) => {\n const key = utils$1.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$1.forEach(this, (value, header) => {\n value != null && value !== false && (obj[header] = asStrings && utils$1.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$1.isArray(header) ? header.forEach(defineAccessor) : defineAccessor(header);\n\n return this;\n }\n}\n\nAxiosHeaders.accessor(['Content-Type', 'Content-Length', 'Accept', 'Accept-Encoding', 'User-Agent', 'Authorization']);\n\n// reserved names hotfix\nutils$1.reduceDescriptors(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$1.freezeMethods(AxiosHeaders);\n\nvar AxiosHeaders$1 = AxiosHeaders;\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 || defaults$1;\n const context = response || config;\n const headers = AxiosHeaders$1.from(context.headers);\n let data = context.data;\n\n utils$1.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\nfunction isCancel(value) {\n return !!(value && value.__CANCEL__);\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.call(this, message == null ? 'canceled' : message, AxiosError.ERR_CANCELED, config, request);\n this.name = 'CanceledError';\n}\n\nutils$1.inherits(CanceledError, AxiosError, {\n __CANCEL__: true\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(\n 'Request failed with status code ' + response.status,\n [AxiosError.ERR_BAD_REQUEST, AxiosError.ERR_BAD_RESPONSE][Math.floor(response.status / 100) - 4],\n response.config,\n response.request,\n response\n ));\n }\n}\n\nfunction parseProtocol(url) {\n const match = /^([-+\\w]{1,25})(:?\\/\\/|:)/.exec(url);\n return match && match[1] || '';\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/**\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\nconst progressEventReducer = (listener, isDownloadStream, freq = 3) => {\n let bytesNotified = 0;\n const _speedometer = speedometer(50, 250);\n\n return 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$1.asap(() => fn(...args));\n\nvar 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\nvar 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$1.isNumber(expires) && cookie.push('expires=' + new Date(expires).toGMTString());\n\n utils$1.isString(path) && cookie.push('path=' + path);\n\n utils$1.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 * 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 \"://\" 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/**\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/**\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\nconst headersToObject = (thing) => thing instanceof AxiosHeaders$1 ? { ...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$1.isPlainObject(target) && utils$1.isPlainObject(source)) {\n return utils$1.merge.call({caseless}, target, source);\n } else if (utils$1.isPlainObject(source)) {\n return utils$1.merge({}, source);\n } else if (utils$1.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$1.isUndefined(b)) {\n return getMergedValue(a, b, prop , caseless);\n } else if (!utils$1.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$1.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$1.isUndefined(b)) {\n return getMergedValue(undefined, b);\n } else if (!utils$1.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$1.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$1.isUndefined(configValue) && merge !== mergeDirectKeys) || (config[prop] = configValue);\n });\n\n return config;\n}\n\nvar resolveConfig = (config) => {\n const newConfig = mergeConfig({}, config);\n\n let {data, withXSRFToken, xsrfHeaderName, xsrfCookieName, headers, auth} = newConfig;\n\n newConfig.headers = headers = AxiosHeaders$1.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$1.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$1.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\nconst isXHRAdapterSupported = typeof XMLHttpRequest !== 'undefined';\n\nvar xhrAdapter = isXHRAdapterSupported && function (config) {\n return new Promise(function dispatchXhrRequest(resolve, reject) {\n const _config = resolveConfig(config);\n let requestData = _config.data;\n const requestHeaders = AxiosHeaders$1.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 = AxiosHeaders$1.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('Request aborted', AxiosError.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('Network Error', AxiosError.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 || transitionalDefaults;\n if (_config.timeoutErrorMessage) {\n timeoutErrorMessage = _config.timeoutErrorMessage;\n }\n reject(new AxiosError(\n timeoutErrorMessage,\n transitional.clarifyTimeoutError ? AxiosError.ETIMEDOUT : AxiosError.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$1.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$1.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 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('Unsupported protocol ' + protocol + ':', AxiosError.ERR_BAD_REQUEST, config));\n return;\n }\n\n\n // Send the request\n request.send(requestData || null);\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 ? err : new CanceledError(err instanceof Error ? err.message : err));\n }\n };\n\n let timer = timeout && setTimeout(() => {\n timer = null;\n onabort(new AxiosError(`timeout ${timeout} of ms exceeded`, AxiosError.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$1.asap(unsubscribe);\n\n return signal;\n }\n};\n\nvar composeSignals$1 = composeSignals;\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\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$1.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$1.isFunction(res[type]) ? (res) => res[type]() :\n (_, config) => {\n throw new AxiosError(`Response type '${type}' is not supported`, AxiosError.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$1.isBlob(body)) {\n return body.size;\n }\n\n if(utils$1.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$1.isArrayBufferView(body) || utils$1.isArrayBuffer(body)) {\n return body.byteLength;\n }\n\n if(utils$1.isURLSearchParams(body)) {\n body = body + '';\n }\n\n if(utils$1.isString(body)) {\n return (await encodeText(body)).byteLength;\n }\n};\n\nconst resolveBodyLength = async (headers, body) => {\n const length = utils$1.toFiniteNumber(headers.getContentLength());\n\n return length == null ? getBodyLength(body) : length;\n};\n\nvar fetchAdapter = 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 = composeSignals$1([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$1.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$1.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$1.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$1.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: AxiosHeaders$1.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('Network Error', AxiosError.ERR_NETWORK, config, request),\n {\n cause: err.cause || err\n }\n )\n }\n\n throw AxiosError.from(err, err && err.code, config, request);\n }\n});\n\nconst knownAdapters = {\n http: httpAdapter,\n xhr: xhrAdapter,\n fetch: fetchAdapter\n};\n\nutils$1.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$1.isFunction(adapter) || adapter === null || adapter === false;\n\nvar adapters = {\n getAdapter: (adapters) => {\n adapters = utils$1.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(`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(\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/**\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 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 = AxiosHeaders$1.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.getAdapter(config.adapter || defaults$1.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 = AxiosHeaders$1.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 = AxiosHeaders$1.from(reason.response.headers);\n }\n }\n\n return Promise.reject(reason);\n });\n}\n\nconst VERSION = \"1.8.4\";\n\nconst validators$1 = {};\n\n// eslint-disable-next-line func-names\n['object', 'boolean', 'number', 'function', 'string', 'symbol'].forEach((type, i) => {\n validators$1[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$1.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(\n formatMessage(opt, ' has been removed' + (version ? ' in ' + version : '')),\n AxiosError.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$1.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('options must be an object', AxiosError.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('option ' + opt + ' must be ' + result, AxiosError.ERR_BAD_OPTION_VALUE);\n }\n continue;\n }\n if (allowUnknown !== true) {\n throw new AxiosError('Unknown option ' + opt, AxiosError.ERR_BAD_OPTION);\n }\n }\n}\n\nvar validator = {\n assertOptions,\n validators: validators$1\n};\n\nconst validators = 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 {\n constructor(instanceConfig) {\n this.defaults = instanceConfig;\n this.interceptors = {\n request: new InterceptorManager$1(),\n response: new InterceptorManager$1()\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 validator.assertOptions(transitional, {\n silentJSONParsing: validators.transitional(validators.boolean),\n forcedJSONParsing: validators.transitional(validators.boolean),\n clarifyTimeoutError: validators.transitional(validators.boolean)\n }, false);\n }\n\n if (paramsSerializer != null) {\n if (utils$1.isFunction(paramsSerializer)) {\n config.paramsSerializer = {\n serialize: paramsSerializer\n };\n } else {\n validator.assertOptions(paramsSerializer, {\n encode: validators.function,\n serialize: validators.function\n }, true);\n }\n }\n\n // Set config.allowAbsoluteUrls\n if (config.allowAbsoluteUrls !== undefined) ; else if (this.defaults.allowAbsoluteUrls !== undefined) {\n config.allowAbsoluteUrls = this.defaults.allowAbsoluteUrls;\n } else {\n config.allowAbsoluteUrls = true;\n }\n\n validator.assertOptions(config, {\n baseUrl: validators.spelling('baseURL'),\n withXsrfToken: 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$1.merge(\n headers.common,\n headers[config.method]\n );\n\n headers && utils$1.forEach(\n ['delete', 'get', 'head', 'post', 'put', 'patch', 'common'],\n (method) => {\n delete headers[method];\n }\n );\n\n config.headers = AxiosHeaders$1.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$1.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) {\n /*eslint func-names:0*/\n 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$1.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.prototype[method] = generateHTTPMethod();\n\n Axios.prototype[method + 'Form'] = generateHTTPMethod(true);\n});\n\nvar Axios$1 = Axios;\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 {\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 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(function executor(c) {\n cancel = c;\n });\n return {\n token,\n cancel\n };\n }\n}\n\nvar CancelToken$1 = CancelToken;\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/**\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$1.isObject(payload) && (payload.isAxiosError === true);\n}\n\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\nvar HttpStatusCode$1 = HttpStatusCode;\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 Axios$1(defaultConfig);\n const instance = bind(Axios$1.prototype.request, context);\n\n // Copy axios.prototype to instance\n utils$1.extend(instance, Axios$1.prototype, context, {allOwnKeys: true});\n\n // Copy context to instance\n utils$1.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(defaults$1);\n\n// Expose Axios class to allow class inheritance\naxios.Axios = Axios$1;\n\n// Expose Cancel & CancelToken\naxios.CanceledError = CanceledError;\naxios.CancelToken = CancelToken$1;\naxios.isCancel = isCancel;\naxios.VERSION = VERSION;\naxios.toFormData = toFormData;\n\n// Expose AxiosError class\naxios.AxiosError = AxiosError;\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 = AxiosHeaders$1;\n\naxios.formToJSON = thing => formDataToJSON(utils$1.isHTMLForm(thing) ? new FormData(thing) : thing);\n\naxios.getAdapter = adapters.getAdapter;\n\naxios.HttpStatusCode = HttpStatusCode$1;\n\naxios.default = axios;\n\nmodule.exports = axios;\n//# sourceMappingURL=axios.cjs.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvYXhpb3MvZGlzdC9icm93c2VyL2F4aW9zLmNqcyIsIm1hcHBpbmdzIjoiOztBQUFBO0FBQ2E7O0FBRWI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSxPQUFPLFVBQVU7QUFDakIsT0FBTyxnQkFBZ0I7O0FBRXZCO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CO0FBQ0EsYUFBYSxTQUFTO0FBQ3RCO0FBQ0EsT0FBTyxTQUFTOztBQUVoQjtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZDtBQUNBLGFBQWEsU0FBUztBQUN0QjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkO0FBQ0EsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2Q7QUFDQSxhQUFhLFNBQVM7QUFDdEI7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2Q7QUFDQSxhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZDtBQUNBLGFBQWEsU0FBUztBQUN0QjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkLGFBQWEsU0FBUztBQUN0QjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkO0FBQ0EsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2Q7QUFDQSxhQUFhLFNBQVM7QUFDdEI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZCxhQUFhLFNBQVM7QUFDdEI7QUFDQTs7QUFFQTtB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QUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25COztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsU0FBUztBQUNwQjtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsMENBQTBDLGFBQWE7QUFDdkQ7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUcsV0FBVyxjQUFjO0FBQzVCLENBQUM7QUFDRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwwQ0FBMEMsT0FBTyxvQkFBb0IsT0FBTzs7QUFFNUU7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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Q0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsMkJBQTJCLG1CQUFtQjtBQUM5Qzs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxLQUFLOztBQUVMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0Esb0RBQW9ELE1BQU07QUFDMUQsb0RBQW9EO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxnQkFBZ0I7QUFDM0IsV0FBVyxTQUFTO0FBQ3BCO0FBQ0EsYUFBYSxHQUFHO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFD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QTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQSxTQUFTLFFBQVE7O0FBRWpCO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esd0NBQXdDLFNBQVM7QUFDakQsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBOztBQUVBOztBQUVBLFdBQVcsUUFBUTs7QUFFbkI7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxXQUFXO0FBQ1gsYUFB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QVU7QUFDckI7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkO0FBQ0EsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLENBQUM7O0FBRUQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CO0FBQ0EsYUFBYSxPQUFPO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esd0RBQXdELGlCQUFpQjs7QUFFekU7QUFDQSwyQ0FBMkMsaUJBQWlCOztBQUU1RDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2Rpc3QvYnJvd3Nlci9heGlvcy5janM/M2M1MiJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiEgQXhpb3MgdjEuOC40IENvcHlyaWdodCAoYykgMjAyNSBNYXR0IFphYnJpc2tpZSBhbmQgY29udHJpYnV0b3JzICovXG4ndXNlIHN0cmljdCc7XG5cbmZ1bmN0aW9uIGJpbmQoZm4sIHRoaXNBcmcpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHdyYXAoKSB7XG4gICAgcmV0dXJuIGZuLmFwcGx5KHRoaXNBcmcsIGFyZ3VtZW50cyk7XG4gIH07XG59XG5cbi8vIHV0aWxzIGlzIGEgbGlicmFyeSBvZiBnZW5lcmljIGhlbHBlciBmdW5jdGlvbnMgbm9uLXNwZWNpZmljIHRvIGF4aW9zXG5cbmNvbnN0IHt0b1N0cmluZ30gPSBPYmplY3QucHJvdG90eXBlO1xuY29uc3Qge2dldFByb3RvdHlwZU9mfSA9IE9iamVjdDtcblxuY29uc3Qga2luZE9mID0gKGNhY2hlID0+IHRoaW5nID0+IHtcbiAgICBjb25zdCBzdHIgPSB0b1N0cmluZy5jYWxsKHRoaW5nKTtcbiAgICByZXR1cm4gY2FjaGVbc3RyXSB8fCAoY2FjaGVbc3RyXSA9IHN0ci5zbGljZSg4LCAtMSkudG9Mb3dlckNhc2UoKSk7XG59KShPYmplY3QuY3JlYXRlKG51bGwpKTtcblxuY29uc3Qga2luZE9mVGVzdCA9ICh0eXBlKSA9PiB7XG4gIHR5cGUgPSB0eXBlLnRvTG93ZXJDYXNlKCk7XG4gIHJldHVybiAodGhpbmcpID0+IGtpbmRPZih0aGluZykgPT09IHR5cGVcbn07XG5cbmNvbnN0IHR5cGVPZlRlc3QgPSB0eXBlID0+IHRoaW5nID0+IHR5cGVvZiB0aGluZyA9PT0gdHlwZTtcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhbiBBcnJheVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhbiBBcnJheSwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmNvbnN0IHtpc0FycmF5fSA9IEFycmF5O1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIHVuZGVmaW5lZFxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdGhlIHZhbHVlIGlzIHVuZGVmaW5lZCwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmNvbnN0IGlzVW5kZWZpbmVkID0gdHlwZU9mVGVzdCgndW5kZWZpbmVkJyk7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBCdWZmZXJcbiAqXG4gKiBAcGFyYW0geyp9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgQnVmZmVyLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNCdWZmZXIodmFsKSB7XG4gIHJldHVybiB2YWwgIT09IG51bGwgJiYgIWlzVW5kZWZpbmVkKHZhbCkgJiYgdmFsLmNvbnN0cnVjdG9yICE9PSBudWxsICYmICFpc1VuZGVmaW5lZCh2YWwuY29uc3RydWN0b3IpXG4gICAgJiYgaXNGdW5jdGlvbih2YWwuY29uc3RydWN0b3IuaXNCdWZmZXIpICYmIHZhbC5jb25zdHJ1Y3Rvci5pc0J1ZmZlcih2YWwpO1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGFuIEFycmF5QnVmZmVyXG4gKlxuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhbiBBcnJheUJ1ZmZlciwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmNvbnN0IGlzQXJyYXlCdWZmZXIgPSBraW5kT2ZUZXN0KCdBcnJheUJ1ZmZlcicpO1xuXG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSB2aWV3IG9uIGFuIEFycmF5QnVmZmVyXG4gKlxuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIHZpZXcgb24gYW4gQXJyYXlCdWZmZXIsIG90aGVyd2lzZSBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0FycmF5QnVmZmVyVmlldyh2YWwpIHtcbiAgbGV0IHJlc3VsdDtcbiAgaWYgKCh0eXBlb2YgQXJyYXlCdWZmZXIgIT09ICd1bmRlZmluZWQnKSAmJiAoQXJyYXlCdWZmZXIuaXNWaWV3KSkge1xuICAgIHJlc3VsdCA9IEFycmF5QnVmZmVyLmlzVmlldyh2YWwpO1xuICB9IGVsc2Uge1xuICAgIHJlc3VsdCA9ICh2YWwpICYmICh2YWwuYnVmZmVyKSAmJiAoaXNBcnJheUJ1ZmZlcih2YWwuYnVmZmVyKSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIFN0cmluZ1xuICpcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBTdHJpbmcsIG90aGVyd2lzZSBmYWxzZVxuICovXG5jb25zdCBpc1N0cmluZyA9IHR5cGVPZlRlc3QoJ3N0cmluZycpO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgRnVuY3Rpb25cbiAqXG4gKiBAcGFyYW0geyp9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBGdW5jdGlvbiwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmNvbnN0IGlzRnVuY3Rpb24gPSB0eXBlT2ZUZXN0KCdmdW5jdGlvbicpO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgTnVtYmVyXG4gKlxuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIE51bWJlciwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmNvbnN0IGlzTnVtYmVyID0gdHlwZU9mVGVzdCgnbnVtYmVyJyk7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYW4gT2JqZWN0XG4gKlxuICogQHBhcmFtIHsqfSB0aGluZyBUaGUgdmFsdWUgdG8gdGVzdFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGFuIE9iamVjdCwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmNvbnN0IGlzT2JqZWN0ID0gKHRoaW5nKSA9PiB0aGluZyAhPT0gbnVsbCAmJiB0eXBlb2YgdGhpbmcgPT09ICdvYmplY3QnO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgQm9vbGVhblxuICpcbiAqIEBwYXJhbSB7Kn0gdGhpbmcgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgQm9vbGVhbiwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmNvbnN0IGlzQm9vbGVhbiA9IHRoaW5nID0+IHRoaW5nID09PSB0cnVlIHx8IHRoaW5nID09PSBmYWxzZTtcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIHBsYWluIE9iamVjdFxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBwbGFpbiBPYmplY3QsIG90aGVyd2lzZSBmYWxzZVxuICovXG5jb25zdCBpc1BsYWluT2JqZWN0ID0gKHZhbCkgPT4ge1xuICBpZiAoa2luZE9mKHZhbCkgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgcHJvdG90eXBlID0gZ2V0UHJvdG90eXBlT2YodmFsKTtcbiAgcmV0dXJuIChwcm90b3R5cGUgPT09IG51bGwgfHwgcHJvdG90eXBlID09PSBPYmplY3QucHJvdG90eXBlIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90b3R5cGUpID09PSBudWxsKSAmJiAhKFN5bWJvbC50b1N0cmluZ1RhZyBpbiB2YWwpICYmICEoU3ltYm9sLml0ZXJhdG9yIGluIHZhbCk7XG59O1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgRGF0ZVxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBEYXRlLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3QgaXNEYXRlID0ga2luZE9mVGVzdCgnRGF0ZScpO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgRmlsZVxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBGaWxlLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3QgaXNGaWxlID0ga2luZE9mVGVzdCgnRmlsZScpO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgQmxvYlxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBCbG9iLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3QgaXNCbG9iID0ga2luZE9mVGVzdCgnQmxvYicpO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgRmlsZUxpc3RcbiAqXG4gKiBAcGFyYW0geyp9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgRmlsZSwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmNvbnN0IGlzRmlsZUxpc3QgPSBraW5kT2ZUZXN0KCdGaWxlTGlzdCcpO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgU3RyZWFtXG4gKlxuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIFN0cmVhbSwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmNvbnN0IGlzU3RyZWFtID0gKHZhbCkgPT4gaXNPYmplY3QodmFsKSAmJiBpc0Z1bmN0aW9uKHZhbC5waXBlKTtcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIEZvcm1EYXRhXG4gKlxuICogQHBhcmFtIHsqfSB0aGluZyBUaGUgdmFsdWUgdG8gdGVzdFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGFuIEZvcm1EYXRhLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3QgaXNGb3JtRGF0YSA9ICh0aGluZykgPT4ge1xuICBsZXQga2luZDtcbiAgcmV0dXJuIHRoaW5nICYmIChcbiAgICAodHlwZW9mIEZvcm1EYXRhID09PSAnZnVuY3Rpb24nICYmIHRoaW5nIGluc3RhbmNlb2YgRm9ybURhdGEpIHx8IChcbiAgICAgIGlzRnVuY3Rpb24odGhpbmcuYXBwZW5kKSAmJiAoXG4gICAgICAgIChraW5kID0ga2luZE9mKHRoaW5nKSkgPT09ICdmb3JtZGF0YScgfHxcbiAgICAgICAgLy8gZGV0ZWN0IGZvcm0tZGF0YSBpbnN0YW5jZVxuICAgICAgICAoa2luZCA9PT0gJ29iamVjdCcgJiYgaXNGdW5jdGlvbih0aGluZy50b1N0cmluZykgJiYgdGhpbmcudG9TdHJpbmcoKSA9PT0gJ1tvYmplY3QgRm9ybURhdGFdJylcbiAgICAgIClcbiAgICApXG4gIClcbn07XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBVUkxTZWFyY2hQYXJhbXMgb2JqZWN0XG4gKlxuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIFVSTFNlYXJjaFBhcmFtcyBvYmplY3QsIG90aGVyd2lzZSBmYWxzZVxuICovXG5jb25zdCBpc1VSTFNlYXJjaFBhcmFtcyA9IGtpbmRPZlRlc3QoJ1VSTFNlYXJjaFBhcmFtcycpO1xuXG5jb25zdCBbaXNSZWFkYWJsZVN0cmVhbSwgaXNSZXF1ZXN0LCBpc1Jlc3BvbnNlLCBpc0hlYWRlcnNdID0gWydSZWFkYWJsZVN0cmVhbScsICdSZXF1ZXN0JywgJ1Jlc3BvbnNlJywgJ0hlYWRlcnMnXS5tYXAoa2luZE9mVGVzdCk7XG5cbi8qKlxuICogVHJpbSBleGNlc3Mgd2hpdGVzcGFjZSBvZmYgdGhlIGJlZ2lubmluZyBhbmQgZW5kIG9mIGEgc3RyaW5nXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHN0ciBUaGUgU3RyaW5nIHRvIHRyaW1cbiAqXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBUaGUgU3RyaW5nIGZyZWVkIG9mIGV4Y2VzcyB3aGl0ZXNwYWNlXG4gKi9cbmNvbnN0IHRyaW0gPSAoc3RyKSA9PiBzdHIudHJpbSA/XG4gIHN0ci50cmltKCkgOiBzdHIucmVwbGFjZSgvXltcXHNcXHVGRUZGXFx4QTBdK3xbXFxzXFx1RkVGRlxceEEwXSskL2csICcnKTtcblxuLyoqXG4gKiBJdGVyYXRlIG92ZXIgYW4gQXJyYXkgb3IgYW4gT2JqZWN0IGludm9raW5nIGEgZnVuY3Rpb24gZm9yIGVhY2ggaXRlbS5cbiAqXG4gKiBJZiBgb2JqYCBpcyBhbiBBcnJheSBjYWxsYmFjayB3aWxsIGJlIGNhbGxlZCBwYXNzaW5nXG4gKiB0aGUgdmFsdWUsIGluZGV4LCBhbmQgY29tcGxldGUgYXJyYXkgZm9yIGVhY2ggaXRlbS5cbiAqXG4gKiBJZiAnb2JqJyBpcyBhbiBPYmplY3QgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQgcGFzc2luZ1xuICogdGhlIHZhbHVlLCBrZXksIGFuZCBjb21wbGV0ZSBvYmplY3QgZm9yIGVhY2ggcHJvcGVydHkuXG4gKlxuICogQHBhcmFtIHtPYmplY3R8QXJyYXl9IG9iaiBUaGUgb2JqZWN0IHRvIGl0ZXJhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBjYWxsYmFjayB0byBpbnZva2UgZm9yIGVhY2ggaXRlbVxuICpcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW2FsbE93bktleXMgPSBmYWxzZV1cbiAqIEByZXR1cm5zIHthbnl9XG4gKi9cbmZ1bmN0aW9uIGZvckVhY2gob2JqLCBmbiwge2FsbE93bktleXMgPSBmYWxzZX0gPSB7fSkge1xuICAvLyBEb24ndCBib3RoZXIgaWYgbm8gdmFsdWUgcHJvdmlkZWRcbiAgaWYgKG9iaiA9PT0gbnVsbCB8fCB0eXBlb2Ygb2JqID09PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxldCBpO1xuICBsZXQgbDtcblxuICAvLyBGb3JjZSBhbiBhcnJheSBpZiBub3QgYWxyZWFkeSBzb21ldGhpbmcgaXRlcmFibGVcbiAgaWYgKHR5cGVvZiBvYmogIT09ICdvYmplY3QnKSB7XG4gICAgLyplc2xpbnQgbm8tcGFyYW0tcmVhc3NpZ246MCovXG4gICAgb2JqID0gW29ial07XG4gIH1cblxuICBpZiAoaXNBcnJheShvYmopKSB7XG4gICAgLy8gSXRlcmF0ZSBvdmVyIGFycmF5IHZhbHVlc1xuICAgIGZvciAoaSA9IDAsIGwgPSBvYmoubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICBmbi5jYWxsKG51bGwsIG9ialtpXSwgaSwgb2JqKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gSXRlcmF0ZSBvdmVyIG9iamVjdCBrZXlzXG4gICAgY29uc3Qga2V5cyA9IGFsbE93bktleXMgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhvYmopIDogT2JqZWN0LmtleXMob2JqKTtcbiAgICBjb25zdCBsZW4gPSBrZXlzLmxlbmd0aDtcbiAgICBsZXQga2V5O1xuXG4gICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBrZXkgPSBrZXlzW2ldO1xuICAgICAgZm4uY2FsbChudWxsLCBvYmpba2V5XSwga2V5LCBvYmopO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5kS2V5KG9iaiwga2V5KSB7XG4gIGtleSA9IGtleS50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMob2JqKTtcbiAgbGV0IGkgPSBrZXlzLmxlbmd0aDtcbiAgbGV0IF9rZXk7XG4gIHdoaWxlIChpLS0gPiAwKSB7XG4gICAgX2tleSA9IGtleXNbaV07XG4gICAgaWYgKGtleSA9PT0gX2tleS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICByZXR1cm4gX2tleTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbmNvbnN0IF9nbG9iYWwgPSAoKCkgPT4ge1xuICAvKmVzbGludCBuby11bmRlZjowKi9cbiAgaWYgKHR5cGVvZiBnbG9iYWxUaGlzICE9PSBcInVuZGVmaW5lZFwiKSByZXR1cm4gZ2xvYmFsVGhpcztcbiAgcmV0dXJuIHR5cGVvZiBzZWxmICE9PSBcInVuZGVmaW5lZFwiID8gc2VsZiA6ICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyA/IHdpbmRvdyA6IGdsb2JhbClcbn0pKCk7XG5cbmNvbnN0IGlzQ29udGV4dERlZmluZWQgPSAoY29udGV4dCkgPT4gIWlzVW5kZWZpbmVkKGNvbnRleHQpICYmIGNvbnRleHQgIT09IF9nbG9iYWw7XG5cbi8qKlxuICogQWNjZXB0cyB2YXJhcmdzIGV4cGVjdGluZyBlYWNoIGFyZ3VtZW50IHRvIGJlIGFuIG9iamVjdCwgdGhlblxuICogaW1tdXRhYmx5IG1lcmdlcyB0aGUgcHJvcGVydGllcyBvZiBlYWNoIG9iamVjdCBhbmQgcmV0dXJucyByZXN1bHQuXG4gKlxuICogV2hlbiBtdWx0aXBsZSBvYmplY3RzIGNvbnRhaW4gdGhlIHNhbWUga2V5IHRoZSBsYXRlciBvYmplY3QgaW5cbiAqIHRoZSBhcmd1bWVudHMgbGlzdCB3aWxsIHRha2UgcHJlY2VkZW5jZS5cbiAqXG4gKiBFeGFtcGxlOlxuICpcbiAqIGBgYGpzXG4gKiB2YXIgcmVzdWx0ID0gbWVyZ2Uoe2ZvbzogMTIzfSwge2ZvbzogNDU2fSk7XG4gKiBjb25zb2xlLmxvZyhyZXN1bHQuZm9vKTsgLy8gb3V0cHV0cyA0NTZcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmoxIE9iamVjdCB0byBtZXJnZVxuICpcbiAqIEByZXR1cm5zIHtPYmplY3R9IFJlc3VsdCBvZiBhbGwgbWVyZ2UgcHJvcGVydGllc1xuICovXG5mdW5jdGlvbiBtZXJnZSgvKiBvYmoxLCBvYmoyLCBvYmozLCAuLi4gKi8pIHtcbiAgY29uc3Qge2Nhc2VsZXNzfSA9IGlzQ29udGV4dERlZmluZWQodGhpcykgJiYgdGhpcyB8fCB7fTtcbiAgY29uc3QgcmVzdWx0ID0ge307XG4gIGNvbnN0IGFzc2lnblZhbHVlID0gKHZhbCwga2V5KSA9PiB7XG4gICAgY29uc3QgdGFyZ2V0S2V5ID0gY2FzZWxlc3MgJiYgZmluZEtleShyZXN1bHQsIGtleSkgfHwga2V5O1xuICAgIGlmIChpc1BsYWluT2JqZWN0KHJlc3VsdFt0YXJnZXRLZXldKSAmJiBpc1BsYWluT2JqZWN0KHZhbCkpIHtcbiAgICAgIHJlc3VsdFt0YXJnZXRLZXldID0gbWVyZ2UocmVzdWx0W3RhcmdldEtleV0sIHZhbCk7XG4gICAgfSBlbHNlIGlmIChpc1BsYWluT2JqZWN0KHZhbCkpIHtcbiAgICAgIHJlc3VsdFt0YXJnZXRLZXldID0gbWVyZ2Uoe30sIHZhbCk7XG4gICAgfSBlbHNlIGlmIChpc0FycmF5KHZhbCkpIHtcbiAgICAgIHJlc3VsdFt0YXJnZXRLZXldID0gdmFsLnNsaWNlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdFt0YXJnZXRLZXldID0gdmFsO1xuICAgIH1cbiAgfTtcblxuICBmb3IgKGxldCBpID0gMCwgbCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBhcmd1bWVudHNbaV0gJiYgZm9yRWFjaChhcmd1bWVudHNbaV0sIGFzc2lnblZhbHVlKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIEV4dGVuZHMgb2JqZWN0IGEgYnkgbXV0YWJseSBhZGRpbmcgdG8gaXQgdGhlIHByb3BlcnRpZXMgb2Ygb2JqZWN0IGIuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGEgVGhlIG9iamVjdCB0byBiZSBleHRlbmRlZFxuICogQHBhcmFtIHtPYmplY3R9IGIgVGhlIG9iamVjdCB0byBjb3B5IHByb3BlcnRpZXMgZnJvbVxuICogQHBhcmFtIHtPYmplY3R9IHRoaXNBcmcgVGhlIG9iamVjdCB0byBiaW5kIGZ1bmN0aW9uIHRvXG4gKlxuICogQHBhcmFtIHtCb29sZWFufSBbYWxsT3duS2V5c11cbiAqIEByZXR1cm5zIHtPYmplY3R9IFRoZSByZXN1bHRpbmcgdmFsdWUgb2Ygb2JqZWN0IGFcbiAqL1xuY29uc3QgZXh0ZW5kID0gKGEsIGIsIHRoaXNBcmcsIHthbGxPd25LZXlzfT0ge30pID0+IHtcbiAgZm9yRWFjaChiLCAodmFsLCBrZXkpID0+IHtcbiAgICBpZiAodGhpc0FyZyAmJiBpc0Z1bmN0aW9uKHZhbCkpIHtcbiAgICAgIGFba2V5XSA9IGJpbmQodmFsLCB0aGlzQXJnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYVtrZXldID0gdmFsO1xuICAgIH1cbiAgfSwge2FsbE93bktleXN9KTtcbiAgcmV0dXJuIGE7XG59O1xuXG4vKipcbiAqIFJlbW92ZSBieXRlIG9yZGVyIG1hcmtlci4gVGhpcyBjYXRjaGVzIEVGIEJCIEJGICh0aGUgVVRGLTggQk9NKVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb250ZW50IHdpdGggQk9NXG4gKlxuICogQHJldHVybnMge3N0cmluZ30gY29udGVudCB2YWx1ZSB3aXRob3V0IEJPTVxuICovXG5jb25zdCBzdHJpcEJPTSA9IChjb250ZW50KSA9PiB7XG4gIGlmIChjb250ZW50LmNoYXJDb2RlQXQoMCkgPT09IDB4RkVGRikge1xuICAgIGNvbnRlbnQgPSBjb250ZW50LnNsaWNlKDEpO1xuICB9XG4gIHJldHVybiBjb250ZW50O1xufTtcblxuLyoqXG4gKiBJbmhlcml0IHRoZSBwcm90b3R5cGUgbWV0aG9kcyBmcm9tIG9uZSBjb25zdHJ1Y3RvciBpbnRvIGFub3RoZXJcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBzdXBlckNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge29iamVjdH0gW3Byb3BzXVxuICogQHBhcmFtIHtvYmplY3R9IFtkZXNjcmlwdG9yc11cbiAqXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuY29uc3QgaW5oZXJpdHMgPSAoY29uc3RydWN0b3IsIHN1cGVyQ29uc3RydWN0b3IsIHByb3BzLCBkZXNjcmlwdG9ycykgPT4ge1xuICBjb25zdHJ1Y3Rvci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ29uc3RydWN0b3IucHJvdG90eXBlLCBkZXNjcmlwdG9ycyk7XG4gIGNvbnN0cnVjdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGNvbnN0cnVjdG9yO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29uc3RydWN0b3IsICdzdXBlcicsIHtcbiAgICB2YWx1ZTogc3VwZXJDb25zdHJ1Y3Rvci5wcm90b3R5cGVcbiAgfSk7XG4gIHByb3BzICYmIE9iamVjdC5hc3NpZ24oY29uc3RydWN0b3IucHJvdG90eXBlLCBwcm9wcyk7XG59O1xuXG4vKipcbiAqIFJlc29sdmUgb2JqZWN0IHdpdGggZGVlcCBwcm90b3R5cGUgY2hhaW4gdG8gYSBmbGF0IG9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZU9iaiBzb3VyY2Ugb2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gW2Rlc3RPYmpdXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufEJvb2xlYW59IFtmaWx0ZXJdXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJvcEZpbHRlcl1cbiAqXG4gKiBAcmV0dXJucyB7T2JqZWN0fVxuICovXG5jb25zdCB0b0ZsYXRPYmplY3QgPSAoc291cmNlT2JqLCBkZXN0T2JqLCBmaWx0ZXIsIHByb3BGaWx0ZXIpID0+IHtcbiAgbGV0IHByb3BzO1xuICBsZXQgaTtcbiAgbGV0IHByb3A7XG4gIGNvbnN0IG1lcmdlZCA9IHt9O1xuXG4gIGRlc3RPYmogPSBkZXN0T2JqIHx8IHt9O1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZXEtbnVsbCxlcWVxZXFcbiAgaWYgKHNvdXJjZU9iaiA9PSBudWxsKSByZXR1cm4gZGVzdE9iajtcblxuICBkbyB7XG4gICAgcHJvcHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhzb3VyY2VPYmopO1xuICAgIGkgPSBwcm9wcy5sZW5ndGg7XG4gICAgd2hpbGUgKGktLSA+IDApIHtcbiAgICAgIHByb3AgPSBwcm9wc1tpXTtcbiAgICAgIGlmICgoIXByb3BGaWx0ZXIgfHwgcHJvcEZpbHRlcihwcm9wLCBzb3VyY2VPYmosIGRlc3RPYmopKSAmJiAhbWVyZ2VkW3Byb3BdKSB7XG4gICAgICAgIGRlc3RPYmpbcHJvcF0gPSBzb3VyY2VPYmpbcHJvcF07XG4gICAgICAgIG1lcmdlZFtwcm9wXSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHNvdXJjZU9iaiA9IGZpbHRlciAhPT0gZmFsc2UgJiYgZ2V0UHJvdG90eXBlT2Yoc291cmNlT2JqKTtcbiAgfSB3aGlsZSAoc291cmNlT2JqICYmICghZmlsdGVyIHx8IGZpbHRlcihzb3VyY2VPYmosIGRlc3RPYmopKSAmJiBzb3VyY2VPYmogIT09IE9iamVjdC5wcm90b3R5cGUpO1xuXG4gIHJldHVybiBkZXN0T2JqO1xufTtcblxuLyoqXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgYSBzdHJpbmcgZW5kcyB3aXRoIHRoZSBjaGFyYWN0ZXJzIG9mIGEgc3BlY2lmaWVkIHN0cmluZ1xuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBzZWFyY2hTdHJpbmdcbiAqIEBwYXJhbSB7TnVtYmVyfSBbcG9zaXRpb249IDBdXG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGVuZHNXaXRoID0gKHN0ciwgc2VhcmNoU3RyaW5nLCBwb3NpdGlvbikgPT4ge1xuICBzdHIgPSBTdHJpbmcoc3RyKTtcbiAgaWYgKHBvc2l0aW9uID09PSB1bmRlZmluZWQgfHwgcG9zaXRpb24gPiBzdHIubGVuZ3RoKSB7XG4gICAgcG9zaXRpb24gPSBzdHIubGVuZ3RoO1xuICB9XG4gIHBvc2l0aW9uIC09IHNlYXJjaFN0cmluZy5sZW5ndGg7XG4gIGNvbnN0IGxhc3RJbmRleCA9IHN0ci5pbmRleE9mKHNlYXJjaFN0cmluZywgcG9zaXRpb24pO1xuICByZXR1cm4gbGFzdEluZGV4ICE9PSAtMSAmJiBsYXN0SW5kZXggPT09IHBvc2l0aW9uO1xufTtcblxuXG4vKipcbiAqIFJldHVybnMgbmV3IGFycmF5IGZyb20gYXJyYXkgbGlrZSBvYmplY3Qgb3IgbnVsbCBpZiBmYWlsZWRcbiAqXG4gKiBAcGFyYW0geyp9IFt0aGluZ11cbiAqXG4gKiBAcmV0dXJucyB7P0FycmF5fVxuICovXG5jb25zdCB0b0FycmF5ID0gKHRoaW5nKSA9PiB7XG4gIGlmICghdGhpbmcpIHJldHVybiBudWxsO1xuICBpZiAoaXNBcnJheSh0aGluZykpIHJldHVybiB0aGluZztcbiAgbGV0IGkgPSB0aGluZy5sZW5ndGg7XG4gIGlmICghaXNOdW1iZXIoaSkpIHJldHVybiBudWxsO1xuICBjb25zdCBhcnIgPSBuZXcgQXJyYXkoaSk7XG4gIHdoaWxlIChpLS0gPiAwKSB7XG4gICAgYXJyW2ldID0gdGhpbmdbaV07XG4gIH1cbiAgcmV0dXJuIGFycjtcbn07XG5cbi8qKlxuICogQ2hlY2tpbmcgaWYgdGhlIFVpbnQ4QXJyYXkgZXhpc3RzIGFuZCBpZiBpdCBkb2VzLCBpdCByZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCBjaGVja3MgaWYgdGhlXG4gKiB0aGluZyBwYXNzZWQgaW4gaXMgYW4gaW5zdGFuY2Ugb2YgVWludDhBcnJheVxuICpcbiAqIEBwYXJhbSB7VHlwZWRBcnJheX1cbiAqXG4gKiBAcmV0dXJucyB7QXJyYXl9XG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBmdW5jLW5hbWVzXG5jb25zdCBpc1R5cGVkQXJyYXkgPSAoVHlwZWRBcnJheSA9PiB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBmdW5jLW5hbWVzXG4gIHJldHVybiB0aGluZyA9PiB7XG4gICAgcmV0dXJuIFR5cGVkQXJyYXkgJiYgdGhpbmcgaW5zdGFuY2VvZiBUeXBlZEFycmF5O1xuICB9O1xufSkodHlwZW9mIFVpbnQ4QXJyYXkgIT09ICd1bmRlZmluZWQnICYmIGdldFByb3RvdHlwZU9mKFVpbnQ4QXJyYXkpKTtcblxuLyoqXG4gKiBGb3IgZWFjaCBlbnRyeSBpbiB0aGUgb2JqZWN0LCBjYWxsIHRoZSBmdW5jdGlvbiB3aXRoIHRoZSBrZXkgYW5kIHZhbHVlLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0PGFueSwgYW55Pn0gb2JqIC0gVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiAtIFRoZSBmdW5jdGlvbiB0byBjYWxsIGZvciBlYWNoIGVudHJ5LlxuICpcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5jb25zdCBmb3JFYWNoRW50cnkgPSAob2JqLCBmbikgPT4ge1xuICBjb25zdCBnZW5lcmF0b3IgPSBvYmogJiYgb2JqW1N5bWJvbC5pdGVyYXRvcl07XG5cbiAgY29uc3QgaXRlcmF0b3IgPSBnZW5lcmF0b3IuY2FsbChvYmopO1xuXG4gIGxldCByZXN1bHQ7XG5cbiAgd2hpbGUgKChyZXN1bHQgPSBpdGVyYXRvci5uZXh0KCkpICYmICFyZXN1bHQuZG9uZSkge1xuICAgIGNvbnN0IHBhaXIgPSByZXN1bHQudmFsdWU7XG4gICAgZm4uY2FsbChvYmosIHBhaXJbMF0sIHBhaXJbMV0pO1xuICB9XG59O1xuXG4vKipcbiAqIEl0IHRha2VzIGEgcmVndWxhciBleHByZXNzaW9uIGFuZCBhIHN0cmluZywgYW5kIHJldHVybnMgYW4gYXJyYXkgb2YgYWxsIHRoZSBtYXRjaGVzXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHJlZ0V4cCAtIFRoZSByZWd1bGFyIGV4cHJlc3Npb24gdG8gbWF0Y2ggYWdhaW5zdC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHIgLSBUaGUgc3RyaW5nIHRvIHNlYXJjaC5cbiAqXG4gKiBAcmV0dXJucyB7QXJyYXk8Ym9vbGVhbj59XG4gKi9cbmNvbnN0IG1hdGNoQWxsID0gKHJlZ0V4cCwgc3RyKSA9PiB7XG4gIGxldCBtYXRjaGVzO1xuICBjb25zdCBhcnIgPSBbXTtcblxuICB3aGlsZSAoKG1hdGNoZXMgPSByZWdFeHAuZXhlYyhzdHIpKSAhPT0gbnVsbCkge1xuICAgIGFyci5wdXNoKG1hdGNoZXMpO1xuICB9XG5cbiAgcmV0dXJuIGFycjtcbn07XG5cbi8qIENoZWNraW5nIGlmIHRoZSBraW5kT2ZUZXN0IGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSB3aGVuIHBhc3NlZCBhbiBIVE1MRm9ybUVsZW1lbnQuICovXG5jb25zdCBpc0hUTUxGb3JtID0ga2luZE9mVGVzdCgnSFRNTEZvcm1FbGVtZW50Jyk7XG5cbmNvbnN0IHRvQ2FtZWxDYXNlID0gc3RyID0+IHtcbiAgcmV0dXJuIHN0ci50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1stX1xcc10oW2EtelxcZF0pKFxcdyopL2csXG4gICAgZnVuY3Rpb24gcmVwbGFjZXIobSwgcDEsIHAyKSB7XG4gICAgICByZXR1cm4gcDEudG9VcHBlckNhc2UoKSArIHAyO1xuICAgIH1cbiAgKTtcbn07XG5cbi8qIENyZWF0aW5nIGEgZnVuY3Rpb24gdGhhdCB3aWxsIGNoZWNrIGlmIGFuIG9iamVjdCBoYXMgYSBwcm9wZXJ0eS4gKi9cbmNvbnN0IGhhc093blByb3BlcnR5ID0gKCh7aGFzT3duUHJvcGVydHl9KSA9PiAob2JqLCBwcm9wKSA9PiBoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCkpKE9iamVjdC5wcm90b3R5cGUpO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgUmVnRXhwIG9iamVjdFxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBSZWdFeHAgb2JqZWN0LCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3QgaXNSZWdFeHAgPSBraW5kT2ZUZXN0KCdSZWdFeHAnKTtcblxuY29uc3QgcmVkdWNlRGVzY3JpcHRvcnMgPSAob2JqLCByZWR1Y2VyKSA9PiB7XG4gIGNvbnN0IGRlc2NyaXB0b3JzID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMob2JqKTtcbiAgY29uc3QgcmVkdWNlZERlc2NyaXB0b3JzID0ge307XG5cbiAgZm9yRWFjaChkZXNjcmlwdG9ycywgKGRlc2NyaXB0b3IsIG5hbWUpID0+IHtcbiAgICBsZXQgcmV0O1xuICAgIGlmICgocmV0ID0gcmVkdWNlcihkZXNjcmlwdG9yLCBuYW1lLCBvYmopKSAhPT0gZmFsc2UpIHtcbiAgICAgIHJlZHVjZWREZXNjcmlwdG9yc1tuYW1lXSA9IHJldCB8fCBkZXNjcmlwdG9yO1xuICAgIH1cbiAgfSk7XG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMob2JqLCByZWR1Y2VkRGVzY3JpcHRvcnMpO1xufTtcblxuLyoqXG4gKiBNYWtlcyBhbGwgbWV0aG9kcyByZWFkLW9ubHlcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmpcbiAqL1xuXG5jb25zdCBmcmVlemVNZXRob2RzID0gKG9iaikgPT4ge1xuICByZWR1Y2VEZXNjcmlwdG9ycyhvYmosIChkZXNjcmlwdG9yLCBuYW1lKSA9PiB7XG4gICAgLy8gc2tpcCByZXN0cmljdGVkIHByb3BzIGluIHN0cmljdCBtb2RlXG4gICAgaWYgKGlzRnVuY3Rpb24ob2JqKSAmJiBbJ2FyZ3VtZW50cycsICdjYWxsZXInLCAnY2FsbGVlJ10uaW5kZXhPZihuYW1lKSAhPT0gLTEpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCB2YWx1ZSA9IG9ialtuYW1lXTtcblxuICAgIGlmICghaXNGdW5jdGlvbih2YWx1ZSkpIHJldHVybjtcblxuICAgIGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGZhbHNlO1xuXG4gICAgaWYgKCd3cml0YWJsZScgaW4gZGVzY3JpcHRvcikge1xuICAgICAgZGVzY3JpcHRvci53cml0YWJsZSA9IGZhbHNlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghZGVzY3JpcHRvci5zZXQpIHtcbiAgICAgIGRlc2NyaXB0b3Iuc2V0ID0gKCkgPT4ge1xuICAgICAgICB0aHJvdyBFcnJvcignQ2FuIG5vdCByZXdyaXRlIHJlYWQtb25seSBtZXRob2QgXFwnJyArIG5hbWUgKyAnXFwnJyk7XG4gICAgICB9O1xuICAgIH1cbiAgfSk7XG59O1xuXG5jb25zdCB0b09iamVjdFNldCA9IChhcnJheU9yU3RyaW5nLCBkZWxpbWl0ZXIpID0+IHtcbiAgY29uc3Qgb2JqID0ge307XG5cbiAgY29uc3QgZGVmaW5lID0gKGFycikgPT4ge1xuICAgIGFyci5mb3JFYWNoKHZhbHVlID0+IHtcbiAgICAgIG9ialt2YWx1ZV0gPSB0cnVlO1xuICAgIH0pO1xuICB9O1xuXG4gIGlzQXJyYXkoYXJyYXlPclN0cmluZykgPyBkZWZpbmUoYXJyYXlPclN0cmluZykgOiBkZWZpbmUoU3RyaW5nKGFycmF5T3JTdHJpbmcpLnNwbGl0KGRlbGltaXRlcikpO1xuXG4gIHJldHVybiBvYmo7XG59O1xuXG5jb25zdCBub29wID0gKCkgPT4ge307XG5cbmNvbnN0IHRvRmluaXRlTnVtYmVyID0gKHZhbHVlLCBkZWZhdWx0VmFsdWUpID0+IHtcbiAgcmV0dXJuIHZhbHVlICE9IG51bGwgJiYgTnVtYmVyLmlzRmluaXRlKHZhbHVlID0gK3ZhbHVlKSA/IHZhbHVlIDogZGVmYXVsdFZhbHVlO1xufTtcblxuLyoqXG4gKiBJZiB0aGUgdGhpbmcgaXMgYSBGb3JtRGF0YSBvYmplY3QsIHJldHVybiB0cnVlLCBvdGhlcndpc2UgcmV0dXJuIGZhbHNlLlxuICpcbiAqIEBwYXJhbSB7dW5rbm93bn0gdGhpbmcgLSBUaGUgdGhpbmcgdG8gY2hlY2suXG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGlzU3BlY0NvbXBsaWFudEZvcm0odGhpbmcpIHtcbiAgcmV0dXJuICEhKHRoaW5nICYmIGlzRnVuY3Rpb24odGhpbmcuYXBwZW5kKSAmJiB0aGluZ1tTeW1ib2wudG9TdHJpbmdUYWddID09PSAnRm9ybURhdGEnICYmIHRoaW5nW1N5bWJvbC5pdGVyYXRvcl0pO1xufVxuXG5jb25zdCB0b0pTT05PYmplY3QgPSAob2JqKSA9PiB7XG4gIGNvbnN0IHN0YWNrID0gbmV3IEFycmF5KDEwKTtcblxuICBjb25zdCB2aXNpdCA9IChzb3VyY2UsIGkpID0+IHtcblxuICAgIGlmIChpc09iamVjdChzb3VyY2UpKSB7XG4gICAgICBpZiAoc3RhY2suaW5kZXhPZihzb3VyY2UpID49IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZighKCd0b0pTT04nIGluIHNvdXJjZSkpIHtcbiAgICAgICAgc3RhY2tbaV0gPSBzb3VyY2U7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IGlzQXJyYXkoc291cmNlKSA/IFtdIDoge307XG5cbiAgICAgICAgZm9yRWFjaChzb3VyY2UsICh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICAgICAgY29uc3QgcmVkdWNlZFZhbHVlID0gdmlzaXQodmFsdWUsIGkgKyAxKTtcbiAgICAgICAgICAhaXNVbmRlZmluZWQocmVkdWNlZFZhbHVlKSAmJiAodGFyZ2V0W2tleV0gPSByZWR1Y2VkVmFsdWUpO1xuICAgICAgICB9KTtcblxuICAgICAgICBzdGFja1tpXSA9IHVuZGVmaW5lZDtcblxuICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzb3VyY2U7XG4gIH07XG5cbiAgcmV0dXJuIHZpc2l0KG9iaiwgMCk7XG59O1xuXG5jb25zdCBpc0FzeW5jRm4gPSBraW5kT2ZUZXN0KCdBc3luY0Z1bmN0aW9uJyk7XG5cbmNvbnN0IGlzVGhlbmFibGUgPSAodGhpbmcpID0+XG4gIHRoaW5nICYmIChpc09iamVjdCh0aGluZykgfHwgaXNGdW5jdGlvbih0aGluZykpICYmIGlzRnVuY3Rpb24odGhpbmcudGhlbikgJiYgaXNGdW5jdGlvbih0aGluZy5jYXRjaCk7XG5cbi8vIG9yaWdpbmFsIGNvZGVcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9EaWdpdGFsQnJhaW5KUy9BeGlvc1Byb21pc2UvYmxvYi8xNmRlYWIxMzcxMGVjMDk3Nzk5MjIxMzFmM2ZhNTk1NDMyMGY4M2FiL2xpYi91dGlscy5qcyNMMTEtTDM0XG5cbmNvbnN0IF9zZXRJbW1lZGlhdGUgPSAoKHNldEltbWVkaWF0ZVN1cHBvcnRlZCwgcG9zdE1lc3NhZ2VTdXBwb3J0ZWQpID0+IHtcbiAgaWYgKHNldEltbWVkaWF0ZVN1cHBvcnRlZCkge1xuICAgIHJldHVybiBzZXRJbW1lZGlhdGU7XG4gIH1cblxuICByZXR1cm4gcG9zdE1lc3NhZ2VTdXBwb3J0ZWQgPyAoKHRva2VuLCBjYWxsYmFja3MpID0+IHtcbiAgICBfZ2xvYmFsLmFkZEV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsICh7c291cmNlLCBkYXRhfSkgPT4ge1xuICAgICAgaWYgKHNvdXJjZSA9PT0gX2dsb2JhbCAmJiBkYXRhID09PSB0b2tlbikge1xuICAgICAgICBjYWxsYmFja3MubGVuZ3RoICYmIGNhbGxiYWNrcy5zaGlmdCgpKCk7XG4gICAgICB9XG4gICAgfSwgZmFsc2UpO1xuXG4gICAgcmV0dXJuIChjYikgPT4ge1xuICAgICAgY2FsbGJhY2tzLnB1c2goY2IpO1xuICAgICAgX2dsb2JhbC5wb3N0TWVzc2FnZSh0b2tlbiwgXCIqXCIpO1xuICAgIH1cbiAgfSkoYGF4aW9zQCR7TWF0aC5yYW5kb20oKX1gLCBbXSkgOiAoY2IpID0+IHNldFRpbWVvdXQoY2IpO1xufSkoXG4gIHR5cGVvZiBzZXRJbW1lZGlhdGUgPT09ICdmdW5jdGlvbicsXG4gIGlzRnVuY3Rpb24oX2dsb2JhbC5wb3N0TWVzc2FnZSlcbik7XG5cbmNvbnN0IGFzYXAgPSB0eXBlb2YgcXVldWVNaWNyb3Rhc2sgIT09ICd1bmRlZmluZWQnID9cbiAgcXVldWVNaWNyb3Rhc2suYmluZChfZ2xvYmFsKSA6ICggdHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmIHByb2Nlc3MubmV4dFRpY2sgfHwgX3NldEltbWVkaWF0ZSk7XG5cbi8vICoqKioqKioqKioqKioqKioqKioqKlxuXG52YXIgdXRpbHMkMSA9IHtcbiAgaXNBcnJheSxcbiAgaXNBcnJheUJ1ZmZlcixcbiAgaXNCdWZmZXIsXG4gIGlzRm9ybURhdGEsXG4gIGlzQXJyYXlCdWZmZXJWaWV3LFxuICBpc1N0cmluZyxcbiAgaXNOdW1iZXIsXG4gIGlzQm9vbGVhbixcbiAgaXNPYmplY3QsXG4gIGlzUGxhaW5PYmplY3QsXG4gIGlzUmVhZGFibGVTdHJlYW0sXG4gIGlzUmVxdWVzdCxcbiAgaXNSZXNwb25zZSxcbiAgaXNIZWFkZXJzLFxuICBpc1VuZGVmaW5lZCxcbiAgaXNEYXRlLFxuICBpc0ZpbGUsXG4gIGlzQmxvYixcbiAgaXNSZWdFeHAsXG4gIGlzRnVuY3Rpb24sXG4gIGlzU3RyZWFtLFxuICBpc1VSTFNlYXJjaFBhcmFtcyxcbiAgaXNUeXBlZEFycmF5LFxuICBpc0ZpbGVMaXN0LFxuICBmb3JFYWNoLFxuICBtZXJnZSxcbiAgZXh0ZW5kLFxuICB0cmltLFxuICBzdHJpcEJPTSxcbiAgaW5oZXJpdHMsXG4gIHRvRmxhdE9iamVjdCxcbiAga2luZE9mLFxuICBraW5kT2ZUZXN0LFxuICBlbmRzV2l0aCxcbiAgdG9BcnJheSxcbiAgZm9yRWFjaEVudHJ5LFxuICBtYXRjaEFsbCxcbiAgaXNIVE1MRm9ybSxcbiAgaGFzT3duUHJvcGVydHksXG4gIGhhc093blByb3A6IGhhc093blByb3BlcnR5LCAvLyBhbiBhbGlhcyB0byBhdm9pZCBFU0xpbnQgbm8tcHJvdG90eXBlLWJ1aWx0aW5zIGRldGVjdGlvblxuICByZWR1Y2VEZXNjcmlwdG9ycyxcbiAgZnJlZXplTWV0aG9kcyxcbiAgdG9PYmplY3RTZXQsXG4gIHRvQ2FtZWxDYXNlLFxuICBub29wLFxuICB0b0Zpbml0ZU51bWJlcixcbiAgZmluZEtleSxcbiAgZ2xvYmFsOiBfZ2xvYmFsLFxuICBpc0NvbnRleHREZWZpbmVkLFxuICBpc1NwZWNDb21wbGlhbnRGb3JtLFxuICB0b0pTT05PYmplY3QsXG4gIGlzQXN5bmNGbixcbiAgaXNUaGVuYWJsZSxcbiAgc2V0SW1tZWRpYXRlOiBfc2V0SW1tZWRpYXRlLFxuICBhc2FwXG59O1xuXG4vKipcbiAqIENyZWF0ZSBhbiBFcnJvciB3aXRoIHRoZSBzcGVjaWZpZWQgbWVzc2FnZSwgY29uZmlnLCBlcnJvciBjb2RlLCByZXF1ZXN0IGFuZCByZXNwb25zZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZSBUaGUgZXJyb3IgbWVzc2FnZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbY29kZV0gVGhlIGVycm9yIGNvZGUgKGZvciBleGFtcGxlLCAnRUNPTk5BQk9SVEVEJykuXG4gKiBAcGFyYW0ge09iamVjdH0gW2NvbmZpZ10gVGhlIGNvbmZpZy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbcmVxdWVzdF0gVGhlIHJlcXVlc3QuXG4gKiBAcGFyYW0ge09iamVjdH0gW3Jlc3BvbnNlXSBUaGUgcmVzcG9uc2UuXG4gKlxuICogQHJldHVybnMge0Vycm9yfSBUaGUgY3JlYXRlZCBlcnJvci5cbiAqL1xuZnVuY3Rpb24gQXhpb3NFcnJvcihtZXNzYWdlLCBjb2RlLCBjb25maWcsIHJlcXVlc3QsIHJlc3BvbnNlKSB7XG4gIEVycm9yLmNhbGwodGhpcyk7XG5cbiAgaWYgKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKSB7XG4gICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgdGhpcy5jb25zdHJ1Y3Rvcik7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5zdGFjayA9IChuZXcgRXJyb3IoKSkuc3RhY2s7XG4gIH1cblxuICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICB0aGlzLm5hbWUgPSAnQXhpb3NFcnJvcic7XG4gIGNvZGUgJiYgKHRoaXMuY29kZSA9IGNvZGUpO1xuICBjb25maWcgJiYgKHRoaXMuY29uZmlnID0gY29uZmlnKTtcbiAgcmVxdWVzdCAmJiAodGhpcy5yZXF1ZXN0ID0gcmVxdWVzdCk7XG4gIGlmIChyZXNwb25zZSkge1xuICAgIHRoaXMucmVzcG9uc2UgPSByZXNwb25zZTtcbiAgICB0aGlzLnN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cyA/IHJlc3BvbnNlLnN0YXR1cyA6IG51bGw7XG4gIH1cbn1cblxudXRpbHMkMS5pbmhlcml0cyhBeGlvc0Vycm9yLCBFcnJvciwge1xuICB0b0pTT046IGZ1bmN0aW9uIHRvSlNPTigpIHtcbiAgICByZXR1cm4ge1xuICAgICAgLy8gU3RhbmRhcmRcbiAgICAgIG1lc3NhZ2U6IHRoaXMubWVzc2FnZSxcbiAgICAgIG5hbWU6IHRoaXMubmFtZSxcbiAgICAgIC8vIE1pY3Jvc29mdFxuICAgICAgZGVzY3JpcHRpb246IHRoaXMuZGVzY3JpcHRpb24sXG4gICAgICBudW1iZXI6IHRoaXMubnVtYmVyLFxuICAgICAgLy8gTW96aWxsYVxuICAgICAgZmlsZU5hbWU6IHRoaXMuZmlsZU5hbWUsXG4gICAgICBsaW5lTnVtYmVyOiB0aGlzLmxpbmVOdW1iZXIsXG4gICAgICBjb2x1bW5OdW1iZXI6IHRoaXMuY29sdW1uTnVtYmVyLFxuICAgICAgc3RhY2s6IHRoaXMuc3RhY2ssXG4gICAgICAvLyBBeGlvc1xuICAgICAgY29uZmlnOiB1dGlscyQxLnRvSlNPTk9iamVjdCh0aGlzLmNvbmZpZyksXG4gICAgICBjb2RlOiB0aGlzLmNvZGUsXG4gICAgICBzdGF0dXM6IHRoaXMuc3RhdHVzXG4gICAgfTtcbiAgfVxufSk7XG5cbmNvbnN0IHByb3RvdHlwZSQxID0gQXhpb3NFcnJvci5wcm90b3R5cGU7XG5jb25zdCBkZXNjcmlwdG9ycyA9IHt9O1xuXG5bXG4gICdFUlJfQkFEX09QVElPTl9WQUxVRScsXG4gICdFUlJfQkFEX09QVElPTicsXG4gICdFQ09OTkFCT1JURUQnLFxuICAnRVRJTUVET1VUJyxcbiAgJ0VSUl9ORVRXT1JLJyxcbiAgJ0VSUl9GUl9UT09fTUFOWV9SRURJUkVDVFMnLFxuICAnRVJSX0RFUFJFQ0FURUQnLFxuICAnRVJSX0JBRF9SRVNQT05TRScsXG4gICdFUlJfQkFEX1JFUVVFU1QnLFxuICAnRVJSX0NBTkNFTEVEJyxcbiAgJ0VSUl9OT1RfU1VQUE9SVCcsXG4gICdFUlJfSU5WQUxJRF9VUkwnXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZnVuYy1uYW1lc1xuXS5mb3JFYWNoKGNvZGUgPT4ge1xuICBkZXNjcmlwdG9yc1tjb2RlXSA9IHt2YWx1ZTogY29kZX07XG59KTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoQXhpb3NFcnJvciwgZGVzY3JpcHRvcnMpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb3RvdHlwZSQxLCAnaXNBeGlvc0Vycm9yJywge3ZhbHVlOiB0cnVlfSk7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBmdW5jLW5hbWVzXG5BeGlvc0Vycm9yLmZyb20gPSAoZXJyb3IsIGNvZGUsIGNvbmZpZywgcmVxdWVzdCwgcmVzcG9uc2UsIGN1c3RvbVByb3BzKSA9PiB7XG4gIGNvbnN0IGF4aW9zRXJyb3IgPSBPYmplY3QuY3JlYXRlKHByb3RvdHlwZSQxKTtcblxuICB1dGlscyQxLnRvRmxhdE9iamVjdChlcnJvciwgYXhpb3NFcnJvciwgZnVuY3Rpb24gZmlsdGVyKG9iaikge1xuICAgIHJldHVybiBvYmogIT09IEVycm9yLnByb3RvdHlwZTtcbiAgfSwgcHJvcCA9PiB7XG4gICAgcmV0dXJuIHByb3AgIT09ICdpc0F4aW9zRXJyb3InO1xuICB9KTtcblxuICBBeGlvc0Vycm9yLmNhbGwoYXhpb3NFcnJvciwgZXJyb3IubWVzc2FnZSwgY29kZSwgY29uZmlnLCByZXF1ZXN0LCByZXNwb25zZSk7XG5cbiAgYXhpb3NFcnJvci5jYXVzZSA9IGVycm9yO1xuXG4gIGF4aW9zRXJyb3IubmFtZSA9IGVycm9yLm5hbWU7XG5cbiAgY3VzdG9tUHJvcHMgJiYgT2JqZWN0LmFzc2lnbihheGlvc0Vycm9yLCBjdXN0b21Qcm9wcyk7XG5cbiAgcmV0dXJuIGF4aW9zRXJyb3I7XG59O1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgc3RyaWN0XG52YXIgaHR0cEFkYXB0ZXIgPSBudWxsO1xuXG4vKipcbiAqIERldGVybWluZXMgaWYgdGhlIGdpdmVuIHRoaW5nIGlzIGEgYXJyYXkgb3IganMgb2JqZWN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0aGluZyAtIFRoZSBvYmplY3Qgb3IgYXJyYXkgdG8gYmUgdmlzaXRlZC5cbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaXNWaXNpdGFibGUodGhpbmcpIHtcbiAgcmV0dXJuIHV0aWxzJDEuaXNQbGFpbk9iamVjdCh0aGluZykgfHwgdXRpbHMkMS5pc0FycmF5KHRoaW5nKTtcbn1cblxuLyoqXG4gKiBJdCByZW1vdmVzIHRoZSBicmFja2V0cyBmcm9tIHRoZSBlbmQgb2YgYSBzdHJpbmdcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIGtleSBvZiB0aGUgcGFyYW1ldGVyLlxuICpcbiAqIEByZXR1cm5zIHtzdHJpbmd9IHRoZSBrZXkgd2l0aG91dCB0aGUgYnJhY2tldHMuXG4gKi9cbmZ1bmN0aW9uIHJlbW92ZUJyYWNrZXRzKGtleSkge1xuICByZXR1cm4gdXRpbHMkMS5lbmRzV2l0aChrZXksICdbXScpID8ga2V5LnNsaWNlKDAsIC0yKSA6IGtleTtcbn1cblxuLyoqXG4gKiBJdCB0YWtlcyBhIHBhdGgsIGEga2V5LCBhbmQgYSBib29sZWFuLCBhbmQgcmV0dXJucyBhIHN0cmluZ1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIC0gVGhlIHBhdGggdG8gdGhlIGN1cnJlbnQga2V5LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSBrZXkgb2YgdGhlIGN1cnJlbnQgb2JqZWN0IGJlaW5nIGl0ZXJhdGVkIG92ZXIuXG4gKiBAcGFyYW0ge3N0cmluZ30gZG90cyAtIElmIHRydWUsIHRoZSBrZXkgd2lsbCBiZSByZW5kZXJlZCB3aXRoIGRvdHMgaW5zdGVhZCBvZiBicmFja2V0cy5cbiAqXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgcGF0aCB0byB0aGUgY3VycmVudCBrZXkuXG4gKi9cbmZ1bmN0aW9uIHJlbmRlcktleShwYXRoLCBrZXksIGRvdHMpIHtcbiAgaWYgKCFwYXRoKSByZXR1cm4ga2V5O1xuICByZXR1cm4gcGF0aC5jb25jYXQoa2V5KS5tYXAoZnVuY3Rpb24gZWFjaCh0b2tlbiwgaSkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgIHRva2VuID0gcmVtb3ZlQnJhY2tldHModG9rZW4pO1xuICAgIHJldHVybiAhZG90cyAmJiBpID8gJ1snICsgdG9rZW4gKyAnXScgOiB0b2tlbjtcbiAgfSkuam9pbihkb3RzID8gJy4nIDogJycpO1xufVxuXG4vKipcbiAqIElmIHRoZSBhcnJheSBpcyBhbiBhcnJheSBhbmQgbm9uZSBvZiBpdHMgZWxlbWVudHMgYXJlIHZpc2l0YWJsZSwgdGhlbiBpdCdzIGEgZmxhdCBhcnJheS5cbiAqXG4gKiBAcGFyYW0ge0FycmF5PGFueT59IGFyciAtIFRoZSBhcnJheSB0byBjaGVja1xuICpcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5mdW5jdGlvbiBpc0ZsYXRBcnJheShhcnIpIHtcbiAgcmV0dXJuIHV0aWxzJDEuaXNBcnJheShhcnIpICYmICFhcnIuc29tZShpc1Zpc2l0YWJsZSk7XG59XG5cbmNvbnN0IHByZWRpY2F0ZXMgPSB1dGlscyQxLnRvRmxhdE9iamVjdCh1dGlscyQxLCB7fSwgbnVsbCwgZnVuY3Rpb24gZmlsdGVyKHByb3ApIHtcbiAgcmV0dXJuIC9eaXNbQS1aXS8udGVzdChwcm9wKTtcbn0pO1xuXG4vKipcbiAqIENvbnZlcnQgYSBkYXRhIG9iamVjdCB0byBGb3JtRGF0YVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmpcbiAqIEBwYXJhbSB7P09iamVjdH0gW2Zvcm1EYXRhXVxuICogQHBhcmFtIHs/T2JqZWN0fSBbb3B0aW9uc11cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRpb25zLnZpc2l0b3JdXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLm1ldGFUb2tlbnMgPSB0cnVlXVxuICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5kb3RzID0gZmFsc2VdXG4gKiBAcGFyYW0gez9Cb29sZWFufSBbb3B0aW9ucy5pbmRleGVzID0gZmFsc2VdXG4gKlxuICogQHJldHVybnMge09iamVjdH1cbiAqKi9cblxuLyoqXG4gKiBJdCBjb252ZXJ0cyBhbiBvYmplY3QgaW50byBhIEZvcm1EYXRhIG9iamVjdFxuICpcbiAqIEBwYXJhbSB7T2JqZWN0PGFueSwgYW55Pn0gb2JqIC0gVGhlIG9iamVjdCB0byBjb252ZXJ0IHRvIGZvcm0gZGF0YS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBmb3JtRGF0YSAtIFRoZSBGb3JtRGF0YSBvYmplY3QgdG8gYXBwZW5kIHRvLlxuICogQHBhcmFtIHtPYmplY3Q8c3RyaW5nLCBhbnk+fSBvcHRpb25zXG4gKlxuICogQHJldHVybnNcbiAqL1xuZnVuY3Rpb24gdG9Gb3JtRGF0YShvYmosIGZvcm1EYXRhLCBvcHRpb25zKSB7XG4gIGlmICghdXRpbHMkMS5pc09iamVjdChvYmopKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcigndGFyZ2V0IG11c3QgYmUgYW4gb2JqZWN0Jyk7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgZm9ybURhdGEgPSBmb3JtRGF0YSB8fCBuZXcgKEZvcm1EYXRhKSgpO1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICBvcHRpb25zID0gdXRpbHMkMS50b0ZsYXRPYmplY3Qob3B0aW9ucywge1xuICAgIG1ldGFUb2tlbnM6IHRydWUsXG4gICAgZG90czogZmFsc2UsXG4gICAgaW5kZXhlczogZmFsc2VcbiAgfSwgZmFsc2UsIGZ1bmN0aW9uIGRlZmluZWQob3B0aW9uLCBzb3VyY2UpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZXEtbnVsbCxlcWVxZXFcbiAgICByZXR1cm4gIXV0aWxzJDEuaXNVbmRlZmluZWQoc291cmNlW29wdGlvbl0pO1xuICB9KTtcblxuICBjb25zdCBtZXRhVG9rZW5zID0gb3B0aW9ucy5tZXRhVG9rZW5zO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmVcbiAgY29uc3QgdmlzaXRvciA9IG9wdGlvbnMudmlzaXRvciB8fCBkZWZhdWx0VmlzaXRvcjtcbiAgY29uc3QgZG90cyA9IG9wdGlvbnMuZG90cztcbiAgY29uc3QgaW5kZXhlcyA9IG9wdGlvbnMuaW5kZXhlcztcbiAgY29uc3QgX0Jsb2IgPSBvcHRpb25zLkJsb2IgfHwgdHlwZW9mIEJsb2IgIT09ICd1bmRlZmluZWQnICYmIEJsb2I7XG4gIGNvbnN0IHVzZUJsb2IgPSBfQmxvYiAmJiB1dGlscyQxLmlzU3BlY0NvbXBsaWFudEZvcm0oZm9ybURhdGEpO1xuXG4gIGlmICghdXRpbHMkMS5pc0Z1bmN0aW9uKHZpc2l0b3IpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcigndmlzaXRvciBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNvbnZlcnRWYWx1ZSh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkgcmV0dXJuICcnO1xuXG4gICAgaWYgKHV0aWxzJDEuaXNEYXRlKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHZhbHVlLnRvSVNPU3RyaW5nKCk7XG4gICAgfVxuXG4gICAgaWYgKCF1c2VCbG9iICYmIHV0aWxzJDEuaXNCbG9iKHZhbHVlKSkge1xuICAgICAgdGhyb3cgbmV3IEF4aW9zRXJyb3IoJ0Jsb2IgaXMgbm90IHN1cHBvcnRlZC4gVXNlIGEgQnVmZmVyIGluc3RlYWQuJyk7XG4gICAgfVxuXG4gICAgaWYgKHV0aWxzJDEuaXNBcnJheUJ1ZmZlcih2YWx1ZSkgfHwgdXRpbHMkMS5pc1R5cGVkQXJyYXkodmFsdWUpKSB7XG4gICAgICByZXR1cm4gdXNlQmxvYiAmJiB0eXBlb2YgQmxvYiA9PT0gJ2Z1bmN0aW9uJyA/IG5ldyBCbG9iKFt2YWx1ZV0pIDogQnVmZmVyLmZyb20odmFsdWUpO1xuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWZhdWx0IHZpc2l0b3IuXG4gICAqXG4gICAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAgICogQHBhcmFtIHtTdHJpbmd8TnVtYmVyfSBrZXlcbiAgICogQHBhcmFtIHtBcnJheTxTdHJpbmd8TnVtYmVyPn0gcGF0aFxuICAgKiBAdGhpcyB7Rm9ybURhdGF9XG4gICAqXG4gICAqIEByZXR1cm5zIHtib29sZWFufSByZXR1cm4gdHJ1ZSB0byB2aXNpdCB0aGUgZWFjaCBwcm9wIG9mIHRoZSB2YWx1ZSByZWN1cnNpdmVseVxuICAgKi9cbiAgZnVuY3Rpb24gZGVmYXVsdFZpc2l0b3IodmFsdWUsIGtleSwgcGF0aCkge1xuICAgIGxldCBhcnIgPSB2YWx1ZTtcblxuICAgIGlmICh2YWx1ZSAmJiAhcGF0aCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICBpZiAodXRpbHMkMS5lbmRzV2l0aChrZXksICd7fScpKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICBrZXkgPSBtZXRhVG9rZW5zID8ga2V5IDoga2V5LnNsaWNlKDAsIC0yKTtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgIHZhbHVlID0gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgKHV0aWxzJDEuaXNBcnJheSh2YWx1ZSkgJiYgaXNGbGF0QXJyYXkodmFsdWUpKSB8fFxuICAgICAgICAoKHV0aWxzJDEuaXNGaWxlTGlzdCh2YWx1ZSkgfHwgdXRpbHMkMS5lbmRzV2l0aChrZXksICdbXScpKSAmJiAoYXJyID0gdXRpbHMkMS50b0FycmF5KHZhbHVlKSlcbiAgICAgICAgKSkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgICAga2V5ID0gcmVtb3ZlQnJhY2tldHMoa2V5KTtcblxuICAgICAgICBhcnIuZm9yRWFjaChmdW5jdGlvbiBlYWNoKGVsLCBpbmRleCkge1xuICAgICAgICAgICEodXRpbHMkMS5pc1VuZGVmaW5lZChlbCkgfHwgZWwgPT09IG51bGwpICYmIGZvcm1EYXRhLmFwcGVuZChcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXN0ZWQtdGVybmFyeVxuICAgICAgICAgICAgaW5kZXhlcyA9PT0gdHJ1ZSA/IHJlbmRlcktleShba2V5XSwgaW5kZXgsIGRvdHMpIDogKGluZGV4ZXMgPT09IG51bGwgPyBrZXkgOiBrZXkgKyAnW10nKSxcbiAgICAgICAgICAgIGNvbnZlcnRWYWx1ZShlbClcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChpc1Zpc2l0YWJsZSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGZvcm1EYXRhLmFwcGVuZChyZW5kZXJLZXkocGF0aCwga2V5LCBkb3RzKSwgY29udmVydFZhbHVlKHZhbHVlKSk7XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBzdGFjayA9IFtdO1xuXG4gIGNvbnN0IGV4cG9zZWRIZWxwZXJzID0gT2JqZWN0LmFzc2lnbihwcmVkaWNhdGVzLCB7XG4gICAgZGVmYXVsdFZpc2l0b3IsXG4gICAgY29udmVydFZhbHVlLFxuICAgIGlzVmlzaXRhYmxlXG4gIH0pO1xuXG4gIGZ1bmN0aW9uIGJ1aWxkKHZhbHVlLCBwYXRoKSB7XG4gICAgaWYgKHV0aWxzJDEuaXNVbmRlZmluZWQodmFsdWUpKSByZXR1cm47XG5cbiAgICBpZiAoc3RhY2suaW5kZXhPZih2YWx1ZSkgIT09IC0xKSB7XG4gICAgICB0aHJvdyBFcnJvcignQ2lyY3VsYXIgcmVmZXJlbmNlIGRldGVjdGVkIGluICcgKyBwYXRoLmpvaW4oJy4nKSk7XG4gICAgfVxuXG4gICAgc3RhY2sucHVzaCh2YWx1ZSk7XG5cbiAgICB1dGlscyQxLmZvckVhY2godmFsdWUsIGZ1bmN0aW9uIGVhY2goZWwsIGtleSkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gISh1dGlscyQxLmlzVW5kZWZpbmVkKGVsKSB8fCBlbCA9PT0gbnVsbCkgJiYgdmlzaXRvci5jYWxsKFxuICAgICAgICBmb3JtRGF0YSwgZWwsIHV0aWxzJDEuaXNTdHJpbmcoa2V5KSA/IGtleS50cmltKCkgOiBrZXksIHBhdGgsIGV4cG9zZWRIZWxwZXJzXG4gICAgICApO1xuXG4gICAgICBpZiAocmVzdWx0ID09PSB0cnVlKSB7XG4gICAgICAgIGJ1aWxkKGVsLCBwYXRoID8gcGF0aC5jb25jYXQoa2V5KSA6IFtrZXldKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHN0YWNrLnBvcCgpO1xuICB9XG5cbiAgaWYgKCF1dGlscyQxLmlzT2JqZWN0KG9iaikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdkYXRhIG11c3QgYmUgYW4gb2JqZWN0Jyk7XG4gIH1cblxuICBidWlsZChvYmopO1xuXG4gIHJldHVybiBmb3JtRGF0YTtcbn1cblxuLyoqXG4gKiBJdCBlbmNvZGVzIGEgc3RyaW5nIGJ5IHJlcGxhY2luZyBhbGwgY2hhcmFjdGVycyB0aGF0IGFyZSBub3QgaW4gdGhlIHVucmVzZXJ2ZWQgc2V0IHdpdGhcbiAqIHRoZWlyIHBlcmNlbnQtZW5jb2RlZCBlcXVpdmFsZW50c1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHIgLSBUaGUgc3RyaW5nIHRvIGVuY29kZS5cbiAqXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgZW5jb2RlZCBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIGVuY29kZSQxKHN0cikge1xuICBjb25zdCBjaGFyTWFwID0ge1xuICAgICchJzogJyUyMScsXG4gICAgXCInXCI6ICclMjcnLFxuICAgICcoJzogJyUyOCcsXG4gICAgJyknOiAnJTI5JyxcbiAgICAnfic6ICclN0UnLFxuICAgICclMjAnOiAnKycsXG4gICAgJyUwMCc6ICdcXHgwMCdcbiAgfTtcbiAgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChzdHIpLnJlcGxhY2UoL1shJygpfl18JTIwfCUwMC9nLCBmdW5jdGlvbiByZXBsYWNlcihtYXRjaCkge1xuICAgIHJldHVybiBjaGFyTWFwW21hdGNoXTtcbiAgfSk7XG59XG5cbi8qKlxuICogSXQgdGFrZXMgYSBwYXJhbXMgb2JqZWN0IGFuZCBjb252ZXJ0cyBpdCB0byBhIEZvcm1EYXRhIG9iamVjdFxuICpcbiAqIEBwYXJhbSB7T2JqZWN0PHN0cmluZywgYW55Pn0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgdG8gYmUgY29udmVydGVkIHRvIGEgRm9ybURhdGEgb2JqZWN0LlxuICogQHBhcmFtIHtPYmplY3Q8c3RyaW5nLCBhbnk+fSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgb2JqZWN0IHBhc3NlZCB0byB0aGUgQXhpb3MgY29uc3RydWN0b3IuXG4gKlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIEF4aW9zVVJMU2VhcmNoUGFyYW1zKHBhcmFtcywgb3B0aW9ucykge1xuICB0aGlzLl9wYWlycyA9IFtdO1xuXG4gIHBhcmFtcyAmJiB0b0Zvcm1EYXRhKHBhcmFtcywgdGhpcywgb3B0aW9ucyk7XG59XG5cbmNvbnN0IHByb3RvdHlwZSA9IEF4aW9zVVJMU2VhcmNoUGFyYW1zLnByb3RvdHlwZTtcblxucHJvdG90eXBlLmFwcGVuZCA9IGZ1bmN0aW9uIGFwcGVuZChuYW1lLCB2YWx1ZSkge1xuICB0aGlzLl9wYWlycy5wdXNoKFtuYW1lLCB2YWx1ZV0pO1xufTtcblxucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcoZW5jb2Rlcikge1xuICBjb25zdCBfZW5jb2RlID0gZW5jb2RlciA/IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgcmV0dXJuIGVuY29kZXIuY2FsbCh0aGlzLCB2YWx1ZSwgZW5jb2RlJDEpO1xuICB9IDogZW5jb2RlJDE7XG5cbiAgcmV0dXJuIHRoaXMuX3BhaXJzLm1hcChmdW5jdGlvbiBlYWNoKHBhaXIpIHtcbiAgICByZXR1cm4gX2VuY29kZShwYWlyWzBdKSArICc9JyArIF9lbmNvZGUocGFpclsxXSk7XG4gIH0sICcnKS5qb2luKCcmJyk7XG59O1xuXG4vKipcbiAqIEl0IHJlcGxhY2VzIGFsbCBpbnN0YW5jZXMgb2YgdGhlIGNoYXJhY3RlcnMgYDpgLCBgJGAsIGAsYCwgYCtgLCBgW2AsIGFuZCBgXWAgd2l0aCB0aGVpclxuICogVVJJIGVuY29kZWQgY291bnRlcnBhcnRzXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbCBUaGUgdmFsdWUgdG8gYmUgZW5jb2RlZC5cbiAqXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgZW5jb2RlZCB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gZW5jb2RlKHZhbCkge1xuICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KHZhbCkuXG4gICAgcmVwbGFjZSgvJTNBL2dpLCAnOicpLlxuICAgIHJlcGxhY2UoLyUyNC9nLCAnJCcpLlxuICAgIHJlcGxhY2UoLyUyQy9naSwgJywnKS5cbiAgICByZXBsYWNlKC8lMjAvZywgJysnKS5cbiAgICByZXBsYWNlKC8lNUIvZ2ksICdbJykuXG4gICAgcmVwbGFjZSgvJTVEL2dpLCAnXScpO1xufVxuXG4vKipcbiAqIEJ1aWxkIGEgVVJMIGJ5IGFwcGVuZGluZyBwYXJhbXMgdG8gdGhlIGVuZFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgVGhlIGJhc2Ugb2YgdGhlIHVybCAoZS5nLiwgaHR0cDovL3d3dy5nb29nbGUuY29tKVxuICogQHBhcmFtIHtvYmplY3R9IFtwYXJhbXNdIFRoZSBwYXJhbXMgdG8gYmUgYXBwZW5kZWRcbiAqIEBwYXJhbSB7PyhvYmplY3R8RnVuY3Rpb24pfSBvcHRpb25zXG4gKlxuICogQHJldHVybnMge3N0cmluZ30gVGhlIGZvcm1hdHRlZCB1cmxcbiAqL1xuZnVuY3Rpb24gYnVpbGRVUkwodXJsLCBwYXJhbXMsIG9wdGlvbnMpIHtcbiAgLyplc2xpbnQgbm8tcGFyYW0tcmVhc3NpZ246MCovXG4gIGlmICghcGFyYW1zKSB7XG4gICAgcmV0dXJuIHVybDtcbiAgfVxuICBcbiAgY29uc3QgX2VuY29kZSA9IG9wdGlvbnMgJiYgb3B0aW9ucy5lbmNvZGUgfHwgZW5jb2RlO1xuXG4gIGlmICh1dGlscyQxLmlzRnVuY3Rpb24ob3B0aW9ucykpIHtcbiAgICBvcHRpb25zID0ge1xuICAgICAgc2VyaWFsaXplOiBvcHRpb25zXG4gICAgfTtcbiAgfSBcblxuICBjb25zdCBzZXJpYWxpemVGbiA9IG9wdGlvbnMgJiYgb3B0aW9ucy5zZXJpYWxpemU7XG5cbiAgbGV0IHNlcmlhbGl6ZWRQYXJhbXM7XG5cbiAgaWYgKHNlcmlhbGl6ZUZuKSB7XG4gICAgc2VyaWFsaXplZFBhcmFtcyA9IHNlcmlhbGl6ZUZuKHBhcmFtcywgb3B0aW9ucyk7XG4gIH0gZWxzZSB7XG4gICAgc2VyaWFsaXplZFBhcmFtcyA9IHV0aWxzJDEuaXNVUkxTZWFyY2hQYXJhbXMocGFyYW1zKSA/XG4gICAgICBwYXJhbXMudG9TdHJpbmcoKSA6XG4gICAgICBuZXcgQXhpb3NVUkxTZWFyY2hQYXJhbXMocGFyYW1zLCBvcHRpb25zKS50b1N0cmluZyhfZW5jb2RlKTtcbiAgfVxuXG4gIGlmIChzZXJpYWxpemVkUGFyYW1zKSB7XG4gICAgY29uc3QgaGFzaG1hcmtJbmRleCA9IHVybC5pbmRleE9mKFwiI1wiKTtcblxuICAgIGlmIChoYXNobWFya0luZGV4ICE9PSAtMSkge1xuICAgICAgdXJsID0gdXJsLnNsaWNlKDAsIGhhc2htYXJrSW5kZXgpO1xuICAgIH1cbiAgICB1cmwgKz0gKHVybC5pbmRleE9mKCc/JykgPT09IC0xID8gJz8nIDogJyYnKSArIHNlcmlhbGl6ZWRQYXJhbXM7XG4gIH1cblxuICByZXR1cm4gdXJsO1xufVxuXG5jbGFzcyBJbnRlcmNlcHRvck1hbmFnZXIge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmhhbmRsZXJzID0gW107XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgbmV3IGludGVyY2VwdG9yIHRvIHRoZSBzdGFja1xuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdWxmaWxsZWQgVGhlIGZ1bmN0aW9uIHRvIGhhbmRsZSBgdGhlbmAgZm9yIGEgYFByb21pc2VgXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IHJlamVjdGVkIFRoZSBmdW5jdGlvbiB0byBoYW5kbGUgYHJlamVjdGAgZm9yIGEgYFByb21pc2VgXG4gICAqXG4gICAqIEByZXR1cm4ge051bWJlcn0gQW4gSUQgdXNlZCB0byByZW1vdmUgaW50ZXJjZXB0b3IgbGF0ZXJcbiAgICovXG4gIHVzZShmdWxmaWxsZWQsIHJlamVjdGVkLCBvcHRpb25zKSB7XG4gICAgdGhpcy5oYW5kbGVycy5wdXNoKHtcbiAgICAgIGZ1bGZpbGxlZCxcbiAgICAgIHJlamVjdGVkLFxuICAgICAgc3luY2hyb25vdXM6IG9wdGlvbnMgPyBvcHRpb25zLnN5bmNocm9ub3VzIDogZmFsc2UsXG4gICAgICBydW5XaGVuOiBvcHRpb25zID8gb3B0aW9ucy5ydW5XaGVuIDogbnVsbFxuICAgIH0pO1xuICAgIHJldHVybiB0aGlzLmhhbmRsZXJzLmxlbmd0aCAtIDE7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGFuIGludGVyY2VwdG9yIGZyb20gdGhlIHN0YWNrXG4gICAqXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBpZCBUaGUgSUQgdGhhdCB3YXMgcmV0dXJuZWQgYnkgYHVzZWBcbiAgICpcbiAgICogQHJldHVybnMge0Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgaW50ZXJjZXB0b3Igd2FzIHJlbW92ZWQsIGBmYWxzZWAgb3RoZXJ3aXNlXG4gICAqL1xuICBlamVjdChpZCkge1xuICAgIGlmICh0aGlzLmhhbmRsZXJzW2lkXSkge1xuICAgICAgdGhpcy5oYW5kbGVyc1tpZF0gPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhciBhbGwgaW50ZXJjZXB0b3JzIGZyb20gdGhlIHN0YWNrXG4gICAqXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgY2xlYXIoKSB7XG4gICAgaWYgKHRoaXMuaGFuZGxlcnMpIHtcbiAgICAgIHRoaXMuaGFuZGxlcnMgPSBbXTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSXRlcmF0ZSBvdmVyIGFsbCB0aGUgcmVnaXN0ZXJlZCBpbnRlcmNlcHRvcnNcbiAgICpcbiAgICogVGhpcyBtZXRob2QgaXMgcGFydGljdWxhcmx5IHVzZWZ1bCBmb3Igc2tpcHBpbmcgb3ZlciBhbnlcbiAgICogaW50ZXJjZXB0b3JzIHRoYXQgbWF5IGhhdmUgYmVjb21lIGBudWxsYCBjYWxsaW5nIGBlamVjdGAuXG4gICAqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBmdW5jdGlvbiB0byBjYWxsIGZvciBlYWNoIGludGVyY2VwdG9yXG4gICAqXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgZm9yRWFjaChmbikge1xuICAgIHV0aWxzJDEuZm9yRWFjaCh0aGlzLmhhbmRsZXJzLCBmdW5jdGlvbiBmb3JFYWNoSGFuZGxlcihoKSB7XG4gICAgICBpZiAoaCAhPT0gbnVsbCkge1xuICAgICAgICBmbihoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuXG52YXIgSW50ZXJjZXB0b3JNYW5hZ2VyJDEgPSBJbnRlcmNlcHRvck1hbmFnZXI7XG5cbnZhciB0cmFuc2l0aW9uYWxEZWZhdWx0cyA9IHtcbiAgc2lsZW50SlNPTlBhcnNpbmc6IHRydWUsXG4gIGZvcmNlZEpTT05QYXJzaW5nOiB0cnVlLFxuICBjbGFyaWZ5VGltZW91dEVycm9yOiBmYWxzZVxufTtcblxudmFyIFVSTFNlYXJjaFBhcmFtcyQxID0gdHlwZW9mIFVSTFNlYXJjaFBhcmFtcyAhPT0gJ3VuZGVmaW5lZCcgPyBVUkxTZWFyY2hQYXJhbXMgOiBBeGlvc1VSTFNlYXJjaFBhcmFtcztcblxudmFyIEZvcm1EYXRhJDEgPSB0eXBlb2YgRm9ybURhdGEgIT09ICd1bmRlZmluZWQnID8gRm9ybURhdGEgOiBudWxsO1xuXG52YXIgQmxvYiQxID0gdHlwZW9mIEJsb2IgIT09ICd1bmRlZmluZWQnID8gQmxvYiA6IG51bGw7XG5cbnZhciBwbGF0Zm9ybSQxID0ge1xuICBpc0Jyb3dzZXI6IHRydWUsXG4gIGNsYXNzZXM6IHtcbiAgICBVUkxTZWFyY2hQYXJhbXM6IFVSTFNlYXJjaFBhcmFtcyQxLFxuICAgIEZvcm1EYXRhOiBGb3JtRGF0YSQxLFxuICAgIEJsb2I6IEJsb2IkMVxuICB9LFxuICBwcm90b2NvbHM6IFsnaHR0cCcsICdodHRwcycsICdmaWxlJywgJ2Jsb2InLCAndXJsJywgJ2RhdGEnXVxufTtcblxuY29uc3QgaGFzQnJvd3NlckVudiA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCc7XG5cbmNvbnN0IF9uYXZpZ2F0b3IgPSB0eXBlb2YgbmF2aWdhdG9yID09PSAnb2JqZWN0JyAmJiBuYXZpZ2F0b3IgfHwgdW5kZWZpbmVkO1xuXG4vKipcbiAqIERldGVybWluZSBpZiB3ZSdyZSBydW5uaW5nIGluIGEgc3RhbmRhcmQgYnJvd3NlciBlbnZpcm9ubWVudFxuICpcbiAqIFRoaXMgYWxsb3dzIGF4aW9zIHRvIHJ1biBpbiBhIHdlYiB3b3JrZXIsIGFuZCByZWFjdC1uYXRpdmUuXG4gKiBCb3RoIGVudmlyb25tZW50cyBzdXBwb3J0IFhNTEh0dHBSZXF1ZXN0LCBidXQgbm90IGZ1bGx5IHN0YW5kYXJkIGdsb2JhbHMuXG4gKlxuICogd2ViIHdvcmtlcnM6XG4gKiAgdHlwZW9mIHdpbmRvdyAtPiB1bmRlZmluZWRcbiAqICB0eXBlb2YgZG9jdW1lbnQgLT4gdW5kZWZpbmVkXG4gKlxuICogcmVhY3QtbmF0aXZlOlxuICogIG5hdmlnYXRvci5wcm9kdWN0IC0+ICdSZWFjdE5hdGl2ZSdcbiAqIG5hdGl2ZXNjcmlwdFxuICogIG5hdmlnYXRvci5wcm9kdWN0IC0+ICdOYXRpdmVTY3JpcHQnIG9yICdOUydcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgaGFzU3RhbmRhcmRCcm93c2VyRW52ID0gaGFzQnJvd3NlckVudiAmJlxuICAoIV9uYXZpZ2F0b3IgfHwgWydSZWFjdE5hdGl2ZScsICdOYXRpdmVTY3JpcHQnLCAnTlMnXS5pbmRleE9mKF9uYXZpZ2F0b3IucHJvZHVjdCkgPCAwKTtcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgd2UncmUgcnVubmluZyBpbiBhIHN0YW5kYXJkIGJyb3dzZXIgd2ViV29ya2VyIGVudmlyb25tZW50XG4gKlxuICogQWx0aG91Z2ggdGhlIGBpc1N0YW5kYXJkQnJvd3NlckVudmAgbWV0aG9kIGluZGljYXRlcyB0aGF0XG4gKiBgYWxsb3dzIGF4aW9zIHRvIHJ1biBpbiBhIHdlYiB3b3JrZXJgLCB0aGUgV2ViV29ya2VyIHdpbGwgc3RpbGwgYmVcbiAqIGZpbHRlcmVkIG91dCBkdWUgdG8gaXRzIGp1ZGdtZW50IHN0YW5kYXJkXG4gKiBgdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJ2AuXG4gKiBUaGlzIGxlYWRzIHRvIGEgcHJvYmxlbSB3aGVuIGF4aW9zIHBvc3QgYEZvcm1EYXRhYCBpbiB3ZWJXb3JrZXJcbiAqL1xuY29uc3QgaGFzU3RhbmRhcmRCcm93c2VyV2ViV29ya2VyRW52ID0gKCgpID0+IHtcbiAgcmV0dXJuIChcbiAgICB0eXBlb2YgV29ya2VyR2xvYmFsU2NvcGUgIT09ICd1bmRlZmluZWQnICYmXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gICAgc2VsZiBpbnN0YW5jZW9mIFdvcmtlckdsb2JhbFNjb3BlICYmXG4gICAgdHlwZW9mIHNlbGYuaW1wb3J0U2NyaXB0cyA9PT0gJ2Z1bmN0aW9uJ1xuICApO1xufSkoKTtcblxuY29uc3Qgb3JpZ2luID0gaGFzQnJvd3NlckVudiAmJiB3aW5kb3cubG9jYXRpb24uaHJlZiB8fCAnaHR0cDovL2xvY2FsaG9zdCc7XG5cbnZhciB1dGlscyA9IC8qI19fUFVSRV9fKi9PYmplY3QuZnJlZXplKHtcbiAgX19wcm90b19fOiBudWxsLFxuICBoYXNCcm93c2VyRW52OiBoYXNCcm93c2VyRW52LFxuICBoYXNTdGFuZGFyZEJyb3dzZXJXZWJXb3JrZXJFbnY6IGhhc1N0YW5kYXJkQnJvd3NlcldlYldvcmtlckVudixcbiAgaGFzU3RhbmRhcmRCcm93c2VyRW52OiBoYXNTdGFuZGFyZEJyb3dzZXJFbnYsXG4gIG5hdmlnYXRvcjogX25hdmlnYXRvcixcbiAgb3JpZ2luOiBvcmlnaW5cbn0pO1xuXG52YXIgcGxhdGZvcm0gPSB7XG4gIC4uLnV0aWxzLFxuICAuLi5wbGF0Zm9ybSQxXG59O1xuXG5mdW5jdGlvbiB0b1VSTEVuY29kZWRGb3JtKGRhdGEsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIHRvRm9ybURhdGEoZGF0YSwgbmV3IHBsYXRmb3JtLmNsYXNzZXMuVVJMU2VhcmNoUGFyYW1zKCksIE9iamVjdC5hc3NpZ24oe1xuICAgIHZpc2l0b3I6IGZ1bmN0aW9uKHZhbHVlLCBrZXksIHBhdGgsIGhlbHBlcnMpIHtcbiAgICAgIGlmIChwbGF0Zm9ybS5pc05vZGUgJiYgdXRpbHMkMS5pc0J1ZmZlcih2YWx1ZSkpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQoa2V5LCB2YWx1ZS50b1N0cmluZygnYmFzZTY0JykpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBoZWxwZXJzLmRlZmF1bHRWaXNpdG9yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfVxuICB9LCBvcHRpb25zKSk7XG59XG5cbi8qKlxuICogSXQgdGFrZXMgYSBzdHJpbmcgbGlrZSBgZm9vW3hdW3ldW3pdYCBhbmQgcmV0dXJucyBhbiBhcnJheSBsaWtlIGBbJ2ZvbycsICd4JywgJ3knLCAneiddXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICpcbiAqIEByZXR1cm5zIEFuIGFycmF5IG9mIHN0cmluZ3MuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlUHJvcFBhdGgobmFtZSkge1xuICAvLyBmb29beF1beV1bel1cbiAgLy8gZm9vLngueS56XG4gIC8vIGZvby14LXktelxuICAvLyBmb28geCB5IHpcbiAgcmV0dXJuIHV0aWxzJDEubWF0Y2hBbGwoL1xcdyt8XFxbKFxcdyopXS9nLCBuYW1lKS5tYXAobWF0Y2ggPT4ge1xuICAgIHJldHVybiBtYXRjaFswXSA9PT0gJ1tdJyA/ICcnIDogbWF0Y2hbMV0gfHwgbWF0Y2hbMF07XG4gIH0pO1xufVxuXG4vKipcbiAqIENvbnZlcnQgYW4gYXJyYXkgdG8gYW4gb2JqZWN0LlxuICpcbiAqIEBwYXJhbSB7QXJyYXk8YW55Pn0gYXJyIC0gVGhlIGFycmF5IHRvIGNvbnZlcnQgdG8gYW4gb2JqZWN0LlxuICpcbiAqIEByZXR1cm5zIEFuIG9iamVjdCB3aXRoIHRoZSBzYW1lIGtleXMgYW5kIHZhbHVlcyBhcyB0aGUgYXJyYXkuXG4gKi9cbmZ1bmN0aW9uIGFycmF5VG9PYmplY3QoYXJyKSB7XG4gIGNvbnN0IG9iaiA9IHt9O1xuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoYXJyKTtcbiAgbGV0IGk7XG4gIGNvbnN0IGxlbiA9IGtleXMubGVuZ3RoO1xuICBsZXQga2V5O1xuICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICBrZXkgPSBrZXlzW2ldO1xuICAgIG9ialtrZXldID0gYXJyW2tleV07XG4gIH1cbiAgcmV0dXJuIG9iajtcbn1cblxuLyoqXG4gKiBJdCB0YWtlcyBhIEZvcm1EYXRhIG9iamVjdCBhbmQgcmV0dXJucyBhIEphdmFTY3JpcHQgb2JqZWN0XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGZvcm1EYXRhIFRoZSBGb3JtRGF0YSBvYmplY3QgdG8gY29udmVydCB0byBKU09OLlxuICpcbiAqIEByZXR1cm5zIHtPYmplY3Q8c3RyaW5nLCBhbnk+IHwgbnVsbH0gVGhlIGNvbnZlcnRlZCBvYmplY3QuXG4gKi9cbmZ1bmN0aW9uIGZvcm1EYXRhVG9KU09OKGZvcm1EYXRhKSB7XG4gIGZ1bmN0aW9uIGJ1aWxkUGF0aChwYXRoLCB2YWx1ZSwgdGFyZ2V0LCBpbmRleCkge1xuICAgIGxldCBuYW1lID0gcGF0aFtpbmRleCsrXTtcblxuICAgIGlmIChuYW1lID09PSAnX19wcm90b19fJykgcmV0dXJuIHRydWU7XG5cbiAgICBjb25zdCBpc051bWVyaWNLZXkgPSBOdW1iZXIuaXNGaW5pdGUoK25hbWUpO1xuICAgIGNvbnN0IGlzTGFzdCA9IGluZGV4ID49IHBhdGgubGVuZ3RoO1xuICAgIG5hbWUgPSAhbmFtZSAmJiB1dGlscyQxLmlzQXJyYXkodGFyZ2V0KSA/IHRhcmdldC5sZW5ndGggOiBuYW1lO1xuXG4gICAgaWYgKGlzTGFzdCkge1xuICAgICAgaWYgKHV0aWxzJDEuaGFzT3duUHJvcCh0YXJnZXQsIG5hbWUpKSB7XG4gICAgICAgIHRhcmdldFtuYW1lXSA9IFt0YXJnZXRbbmFtZV0sIHZhbHVlXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRhcmdldFtuYW1lXSA9IHZhbHVlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gIWlzTnVtZXJpY0tleTtcbiAgICB9XG5cbiAgICBpZiAoIXRhcmdldFtuYW1lXSB8fCAhdXRpbHMkMS5pc09iamVjdCh0YXJnZXRbbmFtZV0pKSB7XG4gICAgICB0YXJnZXRbbmFtZV0gPSBbXTtcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBidWlsZFBhdGgocGF0aCwgdmFsdWUsIHRhcmdldFtuYW1lXSwgaW5kZXgpO1xuXG4gICAgaWYgKHJlc3VsdCAmJiB1dGlscyQxLmlzQXJyYXkodGFyZ2V0W25hbWVdKSkge1xuICAgICAgdGFyZ2V0W25hbWVdID0gYXJyYXlUb09iamVjdCh0YXJnZXRbbmFtZV0pO1xuICAgIH1cblxuICAgIHJldHVybiAhaXNOdW1lcmljS2V5O1xuICB9XG5cbiAgaWYgKHV0aWxzJDEuaXNGb3JtRGF0YShmb3JtRGF0YSkgJiYgdXRpbHMkMS5pc0Z1bmN0aW9uKGZvcm1EYXRhLmVudHJpZXMpKSB7XG4gICAgY29uc3Qgb2JqID0ge307XG5cbiAgICB1dGlscyQxLmZvckVhY2hFbnRyeShmb3JtRGF0YSwgKG5hbWUsIHZhbHVlKSA9PiB7XG4gICAgICBidWlsZFBhdGgocGFyc2VQcm9wUGF0aChuYW1lKSwgdmFsdWUsIG9iaiwgMCk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gb2JqO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKlxuICogSXQgdGFrZXMgYSBzdHJpbmcsIHRyaWVzIHRvIHBhcnNlIGl0LCBhbmQgaWYgaXQgZmFpbHMsIGl0IHJldHVybnMgdGhlIHN0cmluZ2lmaWVkIHZlcnNpb25cbiAqIG9mIHRoZSBpbnB1dFxuICpcbiAqIEBwYXJhbSB7YW55fSByYXdWYWx1ZSAtIFRoZSB2YWx1ZSB0byBiZSBzdHJpbmdpZmllZC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHBhcnNlciAtIEEgZnVuY3Rpb24gdGhhdCBwYXJzZXMgYSBzdHJpbmcgaW50byBhIEphdmFTY3JpcHQgb2JqZWN0LlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZW5jb2RlciAtIEEgZnVuY3Rpb24gdGhhdCB0YWtlcyBhIHZhbHVlIGFuZCByZXR1cm5zIGEgc3RyaW5nLlxuICpcbiAqIEByZXR1cm5zIHtzdHJpbmd9IEEgc3RyaW5naWZpZWQgdmVyc2lvbiBvZiB0aGUgcmF3VmFsdWUuXG4gKi9cbmZ1bmN0aW9uIHN0cmluZ2lmeVNhZmVseShyYXdWYWx1ZSwgcGFyc2VyLCBlbmNvZGVyKSB7XG4gIGlmICh1dGlscyQxLmlzU3RyaW5nKHJhd1ZhbHVlKSkge1xuICAgIHRyeSB7XG4gICAgICAocGFyc2VyIHx8IEpTT04ucGFyc2UpKHJhd1ZhbHVlKTtcbiAgICAgIHJldHVybiB1dGlscyQxLnRyaW0ocmF3VmFsdWUpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmIChlLm5hbWUgIT09ICdTeW50YXhFcnJvcicpIHtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gKGVuY29kZXIgfHwgSlNPTi5zdHJpbmdpZnkpKHJhd1ZhbHVlKTtcbn1cblxuY29uc3QgZGVmYXVsdHMgPSB7XG5cbiAgdHJhbnNpdGlvbmFsOiB0cmFuc2l0aW9uYWxEZWZhdWx0cyxcblxuICBhZGFwdGVyOiBbJ3hocicsICdodHRwJywgJ2ZldGNoJ10sXG5cbiAgdHJhbnNmb3JtUmVxdWVzdDogW2Z1bmN0aW9uIHRyYW5zZm9ybVJlcXVlc3QoZGF0YSwgaGVhZGVycykge1xuICAgIGNvbnN0IGNvbnRlbnRUeXBlID0gaGVhZGVycy5nZXRDb250ZW50VHlwZSgpIHx8ICcnO1xuICAgIGNvbnN0IGhhc0pTT05Db250ZW50VHlwZSA9IGNvbnRlbnRUeXBlLmluZGV4T2YoJ2FwcGxpY2F0aW9uL2pzb24nKSA+IC0xO1xuICAgIGNvbnN0IGlzT2JqZWN0UGF5bG9hZCA9IHV0aWxzJDEuaXNPYmplY3QoZGF0YSk7XG5cbiAgICBpZiAoaXNPYmplY3RQYXlsb2FkICYmIHV0aWxzJDEuaXNIVE1MRm9ybShkYXRhKSkge1xuICAgICAgZGF0YSA9IG5ldyBGb3JtRGF0YShkYXRhKTtcbiAgICB9XG5cbiAgICBjb25zdCBpc0Zvcm1EYXRhID0gdXRpbHMkMS5pc0Zvcm1EYXRhKGRhdGEpO1xuXG4gICAgaWYgKGlzRm9ybURhdGEpIHtcbiAgICAgIHJldHVybiBoYXNKU09OQ29udGVudFR5cGUgPyBKU09OLnN0cmluZ2lmeShmb3JtRGF0YVRvSlNPTihkYXRhKSkgOiBkYXRhO1xuICAgIH1cblxuICAgIGlmICh1dGlscyQxLmlzQXJyYXlCdWZmZXIoZGF0YSkgfHxcbiAgICAgIHV0aWxzJDEuaXNCdWZmZXIoZGF0YSkgfHxcbiAgICAgIHV0aWxzJDEuaXNTdHJlYW0oZGF0YSkgfHxcbiAgICAgIHV0aWxzJDEuaXNGaWxlKGRhdGEpIHx8XG4gICAgICB1dGlscyQxLmlzQmxvYihkYXRhKSB8fFxuICAgICAgdXRpbHMkMS5pc1JlYWRhYmxlU3RyZWFtKGRhdGEpXG4gICAgKSB7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG4gICAgaWYgKHV0aWxzJDEuaXNBcnJheUJ1ZmZlclZpZXcoZGF0YSkpIHtcbiAgICAgIHJldHVybiBkYXRhLmJ1ZmZlcjtcbiAgICB9XG4gICAgaWYgKHV0aWxzJDEuaXNVUkxTZWFyY2hQYXJhbXMoZGF0YSkpIHtcbiAgICAgIGhlYWRlcnMuc2V0Q29udGVudFR5cGUoJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDtjaGFyc2V0PXV0Zi04JywgZmFsc2UpO1xuICAgICAgcmV0dXJuIGRhdGEudG9TdHJpbmcoKTtcbiAgICB9XG5cbiAgICBsZXQgaXNGaWxlTGlzdDtcblxuICAgIGlmIChpc09iamVjdFBheWxvYWQpIHtcbiAgICAgIGlmIChjb250ZW50VHlwZS5pbmRleE9mKCdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnKSA+IC0xKSB7XG4gICAgICAgIHJldHVybiB0b1VSTEVuY29kZWRGb3JtKGRhdGEsIHRoaXMuZm9ybVNlcmlhbGl6ZXIpLnRvU3RyaW5nKCk7XG4gICAgICB9XG5cbiAgICAgIGlmICgoaXNGaWxlTGlzdCA9IHV0aWxzJDEuaXNGaWxlTGlzdChkYXRhKSkgfHwgY29udGVudFR5cGUuaW5kZXhPZignbXVsdGlwYXJ0L2Zvcm0tZGF0YScpID4gLTEpIHtcbiAgICAgICAgY29uc3QgX0Zvcm1EYXRhID0gdGhpcy5lbnYgJiYgdGhpcy5lbnYuRm9ybURhdGE7XG5cbiAgICAgICAgcmV0dXJuIHRvRm9ybURhdGEoXG4gICAgICAgICAgaXNGaWxlTGlzdCA/IHsnZmlsZXNbXSc6IGRhdGF9IDogZGF0YSxcbiAgICAgICAgICBfRm9ybURhdGEgJiYgbmV3IF9Gb3JtRGF0YSgpLFxuICAgICAgICAgIHRoaXMuZm9ybVNlcmlhbGl6ZXJcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaXNPYmplY3RQYXlsb2FkIHx8IGhhc0pTT05Db250ZW50VHlwZSApIHtcbiAgICAgIGhlYWRlcnMuc2V0Q29udGVudFR5cGUoJ2FwcGxpY2F0aW9uL2pzb24nLCBmYWxzZSk7XG4gICAgICByZXR1cm4gc3RyaW5naWZ5U2FmZWx5KGRhdGEpO1xuICAgIH1cblxuICAgIHJldHVybiBkYXRhO1xuICB9XSxcblxuICB0cmFuc2Zvcm1SZXNwb25zZTogW2Z1bmN0aW9uIHRyYW5zZm9ybVJlc3BvbnNlKGRhdGEpIHtcbiAgICBjb25zdCB0cmFuc2l0aW9uYWwgPSB0aGlzLnRyYW5zaXRpb25hbCB8fCBkZWZhdWx0cy50cmFuc2l0aW9uYWw7XG4gICAgY29uc3QgZm9yY2VkSlNPTlBhcnNpbmcgPSB0cmFuc2l0aW9uYWwgJiYgdHJhbnNpdGlvbmFsLmZvcmNlZEpTT05QYXJzaW5nO1xuICAgIGNvbnN0IEpTT05SZXF1ZXN0ZWQgPSB0aGlzLnJlc3BvbnNlVHlwZSA9PT0gJ2pzb24nO1xuXG4gICAgaWYgKHV0aWxzJDEuaXNSZXNwb25zZShkYXRhKSB8fCB1dGlscyQxLmlzUmVhZGFibGVTdHJlYW0oZGF0YSkpIHtcbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cblxuICAgIGlmIChkYXRhICYmIHV0aWxzJDEuaXNTdHJpbmcoZGF0YSkgJiYgKChmb3JjZWRKU09OUGFyc2luZyAmJiAhdGhpcy5yZXNwb25zZVR5cGUpIHx8IEpTT05SZXF1ZXN0ZWQpKSB7XG4gICAgICBjb25zdCBzaWxlbnRKU09OUGFyc2luZyA9IHRyYW5zaXRpb25hbCAmJiB0cmFuc2l0aW9uYWwuc2lsZW50SlNPTlBhcnNpbmc7XG4gICAgICBjb25zdCBzdHJpY3RKU09OUGFyc2luZyA9ICFzaWxlbnRKU09OUGFyc2luZyAmJiBKU09OUmVxdWVzdGVkO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShkYXRhKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgaWYgKHN0cmljdEpTT05QYXJzaW5nKSB7XG4gICAgICAgICAgaWYgKGUubmFtZSA9PT0gJ1N5bnRheEVycm9yJykge1xuICAgICAgICAgICAgdGhyb3cgQXhpb3NFcnJvci5mcm9tKGUsIEF4aW9zRXJyb3IuRVJSX0JBRF9SRVNQT05TRSwgdGhpcywgbnVsbCwgdGhpcy5yZXNwb25zZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZGF0YTtcbiAgfV0sXG5cbiAgLyoqXG4gICAqIEEgdGltZW91dCBpbiBtaWxsaXNlY29uZHMgdG8gYWJvcnQgYSByZXF1ZXN0LiBJZiBzZXQgdG8gMCAoZGVmYXVsdCkgYVxuICAgKiB0aW1lb3V0IGlzIG5vdCBjcmVhdGVkLlxuICAgKi9cbiAgdGltZW91dDogMCxcblxuICB4c3JmQ29va2llTmFtZTogJ1hTUkYtVE9LRU4nLFxuICB4c3JmSGVhZGVyTmFtZTogJ1gtWFNSRi1UT0tFTicsXG5cbiAgbWF4Q29udGVudExlbmd0aDogLTEsXG4gIG1heEJvZHlMZW5ndGg6IC0xLFxuXG4gIGVudjoge1xuICAgIEZvcm1EYXRhOiBwbGF0Zm9ybS5jbGFzc2VzLkZvcm1EYXRhLFxuICAgIEJsb2I6IHBsYXRmb3JtLmNsYXNzZXMuQmxvYlxuICB9LFxuXG4gIHZhbGlkYXRlU3RhdHVzOiBmdW5jdGlvbiB2YWxpZGF0ZVN0YXR1cyhzdGF0dXMpIHtcbiAgICByZXR1cm4gc3RhdHVzID49IDIwMCAmJiBzdGF0dXMgPCAzMDA7XG4gIH0sXG5cbiAgaGVhZGVyczoge1xuICAgIGNvbW1vbjoge1xuICAgICAgJ0FjY2VwdCc6ICdhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L3BsYWluLCAqLyonLFxuICAgICAgJ0NvbnRlbnQtVHlwZSc6IHVuZGVmaW5lZFxuICAgIH1cbiAgfVxufTtcblxudXRpbHMkMS5mb3JFYWNoKFsnZGVsZXRlJywgJ2dldCcsICdoZWFkJywgJ3Bvc3QnLCAncHV0JywgJ3BhdGNoJ10sIChtZXRob2QpID0+IHtcbiAgZGVmYXVsdHMuaGVhZGVyc1ttZXRob2RdID0ge307XG59KTtcblxudmFyIGRlZmF1bHRzJDEgPSBkZWZhdWx0cztcblxuLy8gUmF3QXhpb3NIZWFkZXJzIHdob3NlIGR1cGxpY2F0ZXMgYXJlIGlnbm9yZWQgYnkgbm9kZVxuLy8gYy5mLiBodHRwczovL25vZGVqcy5vcmcvYXBpL2h0dHAuaHRtbCNodHRwX21lc3NhZ2VfaGVhZGVyc1xuY29uc3QgaWdub3JlRHVwbGljYXRlT2YgPSB1dGlscyQxLnRvT2JqZWN0U2V0KFtcbiAgJ2FnZScsICdhdXRob3JpemF0aW9uJywgJ2NvbnRlbnQtbGVuZ3RoJywgJ2NvbnRlbnQtdHlwZScsICdldGFnJyxcbiAgJ2V4cGlyZXMnLCAnZnJvbScsICdob3N0JywgJ2lmLW1vZGlmaWVkLXNpbmNlJywgJ2lmLXVubW9kaWZpZWQtc2luY2UnLFxuICAnbGFzdC1tb2RpZmllZCcsICdsb2NhdGlvbicsICdtYXgtZm9yd2FyZHMnLCAncHJveHktYXV0aG9yaXphdGlvbicsXG4gICdyZWZlcmVyJywgJ3JldHJ5LWFmdGVyJywgJ3VzZXItYWdlbnQnXG5dKTtcblxuLyoqXG4gKiBQYXJzZSBoZWFkZXJzIGludG8gYW4gb2JqZWN0XG4gKlxuICogYGBgXG4gKiBEYXRlOiBXZWQsIDI3IEF1ZyAyMDE0IDA4OjU4OjQ5IEdNVFxuICogQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uXG4gKiBDb25uZWN0aW9uOiBrZWVwLWFsaXZlXG4gKiBUcmFuc2Zlci1FbmNvZGluZzogY2h1bmtlZFxuICogYGBgXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHJhd0hlYWRlcnMgSGVhZGVycyBuZWVkaW5nIHRvIGJlIHBhcnNlZFxuICpcbiAqIEByZXR1cm5zIHtPYmplY3R9IEhlYWRlcnMgcGFyc2VkIGludG8gYW4gb2JqZWN0XG4gKi9cbnZhciBwYXJzZUhlYWRlcnMgPSByYXdIZWFkZXJzID0+IHtcbiAgY29uc3QgcGFyc2VkID0ge307XG4gIGxldCBrZXk7XG4gIGxldCB2YWw7XG4gIGxldCBpO1xuXG4gIHJhd0hlYWRlcnMgJiYgcmF3SGVhZGVycy5zcGxpdCgnXFxuJykuZm9yRWFjaChmdW5jdGlvbiBwYXJzZXIobGluZSkge1xuICAgIGkgPSBsaW5lLmluZGV4T2YoJzonKTtcbiAgICBrZXkgPSBsaW5lLnN1YnN0cmluZygwLCBpKS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICB2YWwgPSBsaW5lLnN1YnN0cmluZyhpICsgMSkudHJpbSgpO1xuXG4gICAgaWYgKCFrZXkgfHwgKHBhcnNlZFtrZXldICYmIGlnbm9yZUR1cGxpY2F0ZU9mW2tleV0pKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGtleSA9PT0gJ3NldC1jb29raWUnKSB7XG4gICAgICBpZiAocGFyc2VkW2tleV0pIHtcbiAgICAgICAgcGFyc2VkW2tleV0ucHVzaCh2YWwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGFyc2VkW2tleV0gPSBbdmFsXTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcGFyc2VkW2tleV0gPSBwYXJzZWRba2V5XSA/IHBhcnNlZFtrZXldICsgJywgJyArIHZhbCA6IHZhbDtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiBwYXJzZWQ7XG59O1xuXG5jb25zdCAkaW50ZXJuYWxzID0gU3ltYm9sKCdpbnRlcm5hbHMnKTtcblxuZnVuY3Rpb24gbm9ybWFsaXplSGVhZGVyKGhlYWRlcikge1xuICByZXR1cm4gaGVhZGVyICYmIFN0cmluZyhoZWFkZXIpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVWYWx1ZSh2YWx1ZSkge1xuICBpZiAodmFsdWUgPT09IGZhbHNlIHx8IHZhbHVlID09IG51bGwpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICByZXR1cm4gdXRpbHMkMS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlLm1hcChub3JtYWxpemVWYWx1ZSkgOiBTdHJpbmcodmFsdWUpO1xufVxuXG5mdW5jdGlvbiBwYXJzZVRva2VucyhzdHIpIHtcbiAgY29uc3QgdG9rZW5zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgY29uc3QgdG9rZW5zUkUgPSAvKFteXFxzLDs9XSspXFxzKig/Oj1cXHMqKFteLDtdKykpPy9nO1xuICBsZXQgbWF0Y2g7XG5cbiAgd2hpbGUgKChtYXRjaCA9IHRva2Vuc1JFLmV4ZWMoc3RyKSkpIHtcbiAgICB0b2tlbnNbbWF0Y2hbMV1dID0gbWF0Y2hbMl07XG4gIH1cblxuICByZXR1cm4gdG9rZW5zO1xufVxuXG5jb25zdCBpc1ZhbGlkSGVhZGVyTmFtZSA9IChzdHIpID0+IC9eWy1fYS16QS1aMC05XmB8fiwhIyQlJicqKy5dKyQvLnRlc3Qoc3RyLnRyaW0oKSk7XG5cbmZ1bmN0aW9uIG1hdGNoSGVhZGVyVmFsdWUoY29udGV4dCwgdmFsdWUsIGhlYWRlciwgZmlsdGVyLCBpc0hlYWRlck5hbWVGaWx0ZXIpIHtcbiAgaWYgKHV0aWxzJDEuaXNGdW5jdGlvbihmaWx0ZXIpKSB7XG4gICAgcmV0dXJuIGZpbHRlci5jYWxsKHRoaXMsIHZhbHVlLCBoZWFkZXIpO1xuICB9XG5cbiAgaWYgKGlzSGVhZGVyTmFtZUZpbHRlcikge1xuICAgIHZhbHVlID0gaGVhZGVyO1xuICB9XG5cbiAgaWYgKCF1dGlscyQxLmlzU3RyaW5nKHZhbHVlKSkgcmV0dXJuO1xuXG4gIGlmICh1dGlscyQxLmlzU3RyaW5nKGZpbHRlcikpIHtcbiAgICByZXR1cm4gdmFsdWUuaW5kZXhPZihmaWx0ZXIpICE9PSAtMTtcbiAgfVxuXG4gIGlmICh1dGlscyQxLmlzUmVnRXhwKGZpbHRlcikpIHtcbiAgICByZXR1cm4gZmlsdGVyLnRlc3QodmFsdWUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZvcm1hdEhlYWRlcihoZWFkZXIpIHtcbiAgcmV0dXJuIGhlYWRlci50cmltKClcbiAgICAudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC8oW2EtelxcZF0pKFxcdyopL2csICh3LCBjaGFyLCBzdHIpID0+IHtcbiAgICAgIHJldHVybiBjaGFyLnRvVXBwZXJDYXNlKCkgKyBzdHI7XG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkQWNjZXNzb3JzKG9iaiwgaGVhZGVyKSB7XG4gIGNvbnN0IGFjY2Vzc29yTmFtZSA9IHV0aWxzJDEudG9DYW1lbENhc2UoJyAnICsgaGVhZGVyKTtcblxuICBbJ2dldCcsICdzZXQnLCAnaGFzJ10uZm9yRWFjaChtZXRob2ROYW1lID0+IHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBtZXRob2ROYW1lICsgYWNjZXNzb3JOYW1lLCB7XG4gICAgICB2YWx1ZTogZnVuY3Rpb24oYXJnMSwgYXJnMiwgYXJnMykge1xuICAgICAgICByZXR1cm4gdGhpc1ttZXRob2ROYW1lXS5jYWxsKHRoaXMsIGhlYWRlciwgYXJnMSwgYXJnMiwgYXJnMyk7XG4gICAgICB9LFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gIH0pO1xufVxuXG5jbGFzcyBBeGlvc0hlYWRlcnMge1xuICBjb25zdHJ1Y3RvcihoZWFkZXJzKSB7XG4gICAgaGVhZGVycyAmJiB0aGlzLnNldChoZWFkZXJzKTtcbiAgfVxuXG4gIHNldChoZWFkZXIsIHZhbHVlT3JSZXdyaXRlLCByZXdyaXRlKSB7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG5cbiAgICBmdW5jdGlvbiBzZXRIZWFkZXIoX3ZhbHVlLCBfaGVhZGVyLCBfcmV3cml0ZSkge1xuICAgICAgY29uc3QgbEhlYWRlciA9IG5vcm1hbGl6ZUhlYWRlcihfaGVhZGVyKTtcblxuICAgICAgaWYgKCFsSGVhZGVyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaGVhZGVyIG5hbWUgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcnKTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qga2V5ID0gdXRpbHMkMS5maW5kS2V5KHNlbGYsIGxIZWFkZXIpO1xuXG4gICAgICBpZigha2V5IHx8IHNlbGZba2V5XSA9PT0gdW5kZWZpbmVkIHx8IF9yZXdyaXRlID09PSB0cnVlIHx8IChfcmV3cml0ZSA9PT0gdW5kZWZpbmVkICYmIHNlbGZba2V5XSAhPT0gZmFsc2UpKSB7XG4gICAgICAgIHNlbGZba2V5IHx8IF9oZWFkZXJdID0gbm9ybWFsaXplVmFsdWUoX3ZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBzZXRIZWFkZXJzID0gKGhlYWRlcnMsIF9yZXdyaXRlKSA9PlxuICAgICAgdXRpbHMkMS5mb3JFYWNoKGhlYWRlcnMsIChfdmFsdWUsIF9oZWFkZXIpID0+IHNldEhlYWRlcihfdmFsdWUsIF9oZWFkZXIsIF9yZXdyaXRlKSk7XG5cbiAgICBpZiAodXRpbHMkMS5pc1BsYWluT2JqZWN0KGhlYWRlcikgfHwgaGVhZGVyIGluc3RhbmNlb2YgdGhpcy5jb25zdHJ1Y3Rvcikge1xuICAgICAgc2V0SGVhZGVycyhoZWFkZXIsIHZhbHVlT3JSZXdyaXRlKTtcbiAgICB9IGVsc2UgaWYodXRpbHMkMS5pc1N0cmluZyhoZWFkZXIpICYmIChoZWFkZXIgPSBoZWFkZXIudHJpbSgpKSAmJiAhaXNWYWxpZEhlYWRlck5hbWUoaGVhZGVyKSkge1xuICAgICAgc2V0SGVhZGVycyhwYXJzZUhlYWRlcnMoaGVhZGVyKSwgdmFsdWVPclJld3JpdGUpO1xuICAgIH0gZWxzZSBpZiAodXRpbHMkMS5pc0hlYWRlcnMoaGVhZGVyKSkge1xuICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgaGVhZGVyLmVudHJpZXMoKSkge1xuICAgICAgICBzZXRIZWFkZXIodmFsdWUsIGtleSwgcmV3cml0ZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGhlYWRlciAhPSBudWxsICYmIHNldEhlYWRlcih2YWx1ZU9yUmV3cml0ZSwgaGVhZGVyLCByZXdyaXRlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGdldChoZWFkZXIsIHBhcnNlcikge1xuICAgIGhlYWRlciA9IG5vcm1hbGl6ZUhlYWRlcihoZWFkZXIpO1xuXG4gICAgaWYgKGhlYWRlcikge1xuICAgICAgY29uc3Qga2V5ID0gdXRpbHMkMS5maW5kS2V5KHRoaXMsIGhlYWRlcik7XG5cbiAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzW2tleV07XG5cbiAgICAgICAgaWYgKCFwYXJzZXIpIHtcbiAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGFyc2VyID09PSB0cnVlKSB7XG4gICAgICAgICAgcmV0dXJuIHBhcnNlVG9rZW5zKHZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh1dGlscyQxLmlzRnVuY3Rpb24ocGFyc2VyKSkge1xuICAgICAgICAgIHJldHVybiBwYXJzZXIuY2FsbCh0aGlzLCB2YWx1ZSwga2V5KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh1dGlscyQxLmlzUmVnRXhwKHBhcnNlcikpIHtcbiAgICAgICAgICByZXR1cm4gcGFyc2VyLmV4ZWModmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigncGFyc2VyIG11c3QgYmUgYm9vbGVhbnxyZWdleHB8ZnVuY3Rpb24nKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBoYXMoaGVhZGVyLCBtYXRjaGVyKSB7XG4gICAgaGVhZGVyID0gbm9ybWFsaXplSGVhZGVyKGhlYWRlcik7XG5cbiAgICBpZiAoaGVhZGVyKSB7XG4gICAgICBjb25zdCBrZXkgPSB1dGlscyQxLmZpbmRLZXkodGhpcywgaGVhZGVyKTtcblxuICAgICAgcmV0dXJuICEhKGtleSAmJiB0aGlzW2tleV0gIT09IHVuZGVmaW5lZCAmJiAoIW1hdGNoZXIgfHwgbWF0Y2hIZWFkZXJWYWx1ZSh0aGlzLCB0aGlzW2tleV0sIGtleSwgbWF0Y2hlcikpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBkZWxldGUoaGVhZGVyLCBtYXRjaGVyKSB7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgbGV0IGRlbGV0ZWQgPSBmYWxzZTtcblxuICAgIGZ1bmN0aW9uIGRlbGV0ZUhlYWRlcihfaGVhZGVyKSB7XG4gICAgICBfaGVhZGVyID0gbm9ybWFsaXplSGVhZGVyKF9oZWFkZXIpO1xuXG4gICAgICBpZiAoX2hlYWRlcikge1xuICAgICAgICBjb25zdCBrZXkgPSB1dGlscyQxLmZpbmRLZXkoc2VsZiwgX2hlYWRlcik7XG5cbiAgICAgICAgaWYgKGtleSAmJiAoIW1hdGNoZXIgfHwgbWF0Y2hIZWFkZXJWYWx1ZShzZWxmLCBzZWxmW2tleV0sIGtleSwgbWF0Y2hlcikpKSB7XG4gICAgICAgICAgZGVsZXRlIHNlbGZba2V5XTtcblxuICAgICAgICAgIGRlbGV0ZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHV0aWxzJDEuaXNBcnJheShoZWFkZXIpKSB7XG4gICAgICBoZWFkZXIuZm9yRWFjaChkZWxldGVIZWFkZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGVIZWFkZXIoaGVhZGVyKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVsZXRlZDtcbiAgfVxuXG4gIGNsZWFyKG1hdGNoZXIpIHtcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXModGhpcyk7XG4gICAgbGV0IGkgPSBrZXlzLmxlbmd0aDtcbiAgICBsZXQgZGVsZXRlZCA9IGZhbHNlO1xuXG4gICAgd2hpbGUgKGktLSkge1xuICAgICAgY29uc3Qga2V5ID0ga2V5c1tpXTtcbiAgICAgIGlmKCFtYXRjaGVyIHx8IG1hdGNoSGVhZGVyVmFsdWUodGhpcywgdGhpc1trZXldLCBrZXksIG1hdGNoZXIsIHRydWUpKSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzW2tleV07XG4gICAgICAgIGRlbGV0ZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBkZWxldGVkO1xuICB9XG5cbiAgbm9ybWFsaXplKGZvcm1hdCkge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcblxuICAgIHV0aWxzJDEuZm9yRWFjaCh0aGlzLCAodmFsdWUsIGhlYWRlcikgPT4ge1xuICAgICAgY29uc3Qga2V5ID0gdXRpbHMkMS5maW5kS2V5KGhlYWRlcnMsIGhlYWRlcik7XG5cbiAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgc2VsZltrZXldID0gbm9ybWFsaXplVmFsdWUodmFsdWUpO1xuICAgICAgICBkZWxldGUgc2VsZltoZWFkZXJdO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBmb3JtYXQgPyBmb3JtYXRIZWFkZXIoaGVhZGVyKSA6IFN0cmluZyhoZWFkZXIpLnRyaW0oKTtcblxuICAgICAgaWYgKG5vcm1hbGl6ZWQgIT09IGhlYWRlcikge1xuICAgICAgICBkZWxldGUgc2VsZltoZWFkZXJdO1xuICAgICAgfVxuXG4gICAgICBzZWxmW25vcm1hbGl6ZWRdID0gbm9ybWFsaXplVmFsdWUodmFsdWUpO1xuXG4gICAgICBoZWFkZXJzW25vcm1hbGl6ZWRdID0gdHJ1ZTtcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgY29uY2F0KC4uLnRhcmdldHMpIHtcbiAgICByZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci5jb25jYXQodGhpcywgLi4udGFyZ2V0cyk7XG4gIH1cblxuICB0b0pTT04oYXNTdHJpbmdzKSB7XG4gICAgY29uc3Qgb2JqID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblxuICAgIHV0aWxzJDEuZm9yRWFjaCh0aGlzLCAodmFsdWUsIGhlYWRlcikgPT4ge1xuICAgICAgdmFsdWUgIT0gbnVsbCAmJiB2YWx1ZSAhPT0gZmFsc2UgJiYgKG9ialtoZWFkZXJdID0gYXNTdHJpbmdzICYmIHV0aWxzJDEuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZS5qb2luKCcsICcpIDogdmFsdWUpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIG9iajtcbiAgfVxuXG4gIFtTeW1ib2wuaXRlcmF0b3JdKCkge1xuICAgIHJldHVybiBPYmplY3QuZW50cmllcyh0aGlzLnRvSlNPTigpKVtTeW1ib2wuaXRlcmF0b3JdKCk7XG4gIH1cblxuICB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gT2JqZWN0LmVudHJpZXModGhpcy50b0pTT04oKSkubWFwKChbaGVhZGVyLCB2YWx1ZV0pID0+IGhlYWRlciArICc6ICcgKyB2YWx1ZSkuam9pbignXFxuJyk7XG4gIH1cblxuICBnZXQgW1N5bWJvbC50b1N0cmluZ1RhZ10oKSB7XG4gICAgcmV0dXJuICdBeGlvc0hlYWRlcnMnO1xuICB9XG5cbiAgc3RhdGljIGZyb20odGhpbmcpIHtcbiAgICByZXR1cm4gdGhpbmcgaW5zdGFuY2VvZiB0aGlzID8gdGhpbmcgOiBuZXcgdGhpcyh0aGluZyk7XG4gIH1cblxuICBzdGF0aWMgY29uY2F0KGZpcnN0LCAuLi50YXJnZXRzKSB7XG4gICAgY29uc3QgY29tcHV0ZWQgPSBuZXcgdGhpcyhmaXJzdCk7XG5cbiAgICB0YXJnZXRzLmZvckVhY2goKHRhcmdldCkgPT4gY29tcHV0ZWQuc2V0KHRhcmdldCkpO1xuXG4gICAgcmV0dXJuIGNvbXB1dGVkO1xuICB9XG5cbiAgc3RhdGljIGFjY2Vzc29yKGhlYWRlcikge1xuICAgIGNvbnN0IGludGVybmFscyA9IHRoaXNbJGludGVybmFsc10gPSAodGhpc1skaW50ZXJuYWxzXSA9IHtcbiAgICAgIGFjY2Vzc29yczoge31cbiAgICB9KTtcblxuICAgIGNvbnN0IGFjY2Vzc29ycyA9IGludGVybmFscy5hY2Nlc3NvcnM7XG4gICAgY29uc3QgcHJvdG90eXBlID0gdGhpcy5wcm90b3R5cGU7XG5cbiAgICBmdW5jdGlvbiBkZWZpbmVBY2Nlc3NvcihfaGVhZGVyKSB7XG4gICAgICBjb25zdCBsSGVhZGVyID0gbm9ybWFsaXplSGVhZGVyKF9oZWFkZXIpO1xuXG4gICAgICBpZiAoIWFjY2Vzc29yc1tsSGVhZGVyXSkge1xuICAgICAgICBidWlsZEFjY2Vzc29ycyhwcm90b3R5cGUsIF9oZWFkZXIpO1xuICAgICAgICBhY2Nlc3NvcnNbbEhlYWRlcl0gPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHV0aWxzJDEuaXNBcnJheShoZWFkZXIpID8gaGVhZGVyLmZvckVhY2goZGVmaW5lQWNjZXNzb3IpIDogZGVmaW5lQWNjZXNzb3IoaGVhZGVyKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG59XG5cbkF4aW9zSGVhZGVycy5hY2Nlc3NvcihbJ0NvbnRlbnQtVHlwZScsICdDb250ZW50LUxlbmd0aCcsICdBY2NlcHQnLCAnQWNjZXB0LUVuY29kaW5nJywgJ1VzZXItQWdlbnQnLCAnQXV0aG9yaXphdGlvbiddKTtcblxuLy8gcmVzZXJ2ZWQgbmFtZXMgaG90Zml4XG51dGlscyQxLnJlZHVjZURlc2NyaXB0b3JzKEF4aW9zSGVhZGVycy5wcm90b3R5cGUsICh7dmFsdWV9LCBrZXkpID0+IHtcbiAgbGV0IG1hcHBlZCA9IGtleVswXS50b1VwcGVyQ2FzZSgpICsga2V5LnNsaWNlKDEpOyAvLyBtYXAgYHNldGAgPT4gYFNldGBcbiAgcmV0dXJuIHtcbiAgICBnZXQ6ICgpID0+IHZhbHVlLFxuICAgIHNldChoZWFkZXJWYWx1ZSkge1xuICAgICAgdGhpc1ttYXBwZWRdID0gaGVhZGVyVmFsdWU7XG4gICAgfVxuICB9XG59KTtcblxudXRpbHMkMS5mcmVlemVNZXRob2RzKEF4aW9zSGVhZGVycyk7XG5cbnZhciBBeGlvc0hlYWRlcnMkMSA9IEF4aW9zSGVhZGVycztcblxuLyoqXG4gKiBUcmFuc2Zvcm0gdGhlIGRhdGEgZm9yIGEgcmVxdWVzdCBvciBhIHJlc3BvbnNlXG4gKlxuICogQHBhcmFtIHtBcnJheXxGdW5jdGlvbn0gZm5zIEEgc2luZ2xlIGZ1bmN0aW9uIG9yIEFycmF5IG9mIGZ1bmN0aW9uc1xuICogQHBhcmFtIHs/T2JqZWN0fSByZXNwb25zZSBUaGUgcmVzcG9uc2Ugb2JqZWN0XG4gKlxuICogQHJldHVybnMgeyp9IFRoZSByZXN1bHRpbmcgdHJhbnNmb3JtZWQgZGF0YVxuICovXG5mdW5jdGlvbiB0cmFuc2Zvcm1EYXRhKGZucywgcmVzcG9uc2UpIHtcbiAgY29uc3QgY29uZmlnID0gdGhpcyB8fCBkZWZhdWx0cyQxO1xuICBjb25zdCBjb250ZXh0ID0gcmVzcG9uc2UgfHwgY29uZmlnO1xuICBjb25zdCBoZWFkZXJzID0gQXhpb3NIZWFkZXJzJDEuZnJvbShjb250ZXh0LmhlYWRlcnMpO1xuICBsZXQgZGF0YSA9IGNvbnRleHQuZGF0YTtcblxuICB1dGlscyQxLmZvckVhY2goZm5zLCBmdW5jdGlvbiB0cmFuc2Zvcm0oZm4pIHtcbiAgICBkYXRhID0gZm4uY2FsbChjb25maWcsIGRhdGEsIGhlYWRlcnMubm9ybWFsaXplKCksIHJlc3BvbnNlID8gcmVzcG9uc2Uuc3RhdHVzIDogdW5kZWZpbmVkKTtcbiAgfSk7XG5cbiAgaGVhZGVycy5ub3JtYWxpemUoKTtcblxuICByZXR1cm4gZGF0YTtcbn1cblxuZnVuY3Rpb24gaXNDYW5jZWwodmFsdWUpIHtcbiAgcmV0dXJuICEhKHZhbHVlICYmIHZhbHVlLl9fQ0FOQ0VMX18pO1xufVxuXG4vKipcbiAqIEEgYENhbmNlbGVkRXJyb3JgIGlzIGFuIG9iamVjdCB0aGF0IGlzIHRocm93biB3aGVuIGFuIG9wZXJhdGlvbiBpcyBjYW5jZWxlZC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZz19IG1lc3NhZ2UgVGhlIG1lc3NhZ2UuXG4gKiBAcGFyYW0ge09iamVjdD19IGNvbmZpZyBUaGUgY29uZmlnLlxuICogQHBhcmFtIHtPYmplY3Q9fSByZXF1ZXN0IFRoZSByZXF1ZXN0LlxuICpcbiAqIEByZXR1cm5zIHtDYW5jZWxlZEVycm9yfSBUaGUgY3JlYXRlZCBlcnJvci5cbiAqL1xuZnVuY3Rpb24gQ2FuY2VsZWRFcnJvcihtZXNzYWdlLCBjb25maWcsIHJlcXVlc3QpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWVxLW51bGwsZXFlcWVxXG4gIEF4aW9zRXJyb3IuY2FsbCh0aGlzLCBtZXNzYWdlID09IG51bGwgPyAnY2FuY2VsZWQnIDogbWVzc2FnZSwgQXhpb3NFcnJvci5FUlJfQ0FOQ0VMRUQsIGNvbmZpZywgcmVxdWVzdCk7XG4gIHRoaXMubmFtZSA9ICdDYW5jZWxlZEVycm9yJztcbn1cblxudXRpbHMkMS5pbmhlcml0cyhDYW5jZWxlZEVycm9yLCBBeGlvc0Vycm9yLCB7XG4gIF9fQ0FOQ0VMX186IHRydWVcbn0pO1xuXG4vKipcbiAqIFJlc29sdmUgb3IgcmVqZWN0IGEgUHJvbWlzZSBiYXNlZCBvbiByZXNwb25zZSBzdGF0dXMuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gcmVzb2x2ZSBBIGZ1bmN0aW9uIHRoYXQgcmVzb2x2ZXMgdGhlIHByb21pc2UuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSByZWplY3QgQSBmdW5jdGlvbiB0aGF0IHJlamVjdHMgdGhlIHByb21pc2UuXG4gKiBAcGFyYW0ge29iamVjdH0gcmVzcG9uc2UgVGhlIHJlc3BvbnNlLlxuICpcbiAqIEByZXR1cm5zIHtvYmplY3R9IFRoZSByZXNwb25zZS5cbiAqL1xuZnVuY3Rpb24gc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgcmVzcG9uc2UpIHtcbiAgY29uc3QgdmFsaWRhdGVTdGF0dXMgPSByZXNwb25zZS5jb25maWcudmFsaWRhdGVTdGF0dXM7XG4gIGlmICghcmVzcG9uc2Uuc3RhdHVzIHx8ICF2YWxpZGF0ZVN0YXR1cyB8fCB2YWxpZGF0ZVN0YXR1cyhyZXNwb25zZS5zdGF0dXMpKSB7XG4gICAgcmVzb2x2ZShyZXNwb25zZSk7XG4gIH0gZWxzZSB7XG4gICAgcmVqZWN0KG5ldyBBeGlvc0Vycm9yKFxuICAgICAgJ1JlcXVlc3QgZmFpbGVkIHdpdGggc3RhdHVzIGNvZGUgJyArIHJlc3BvbnNlLnN0YXR1cyxcbiAgICAgIFtBeGlvc0Vycm9yLkVSUl9CQURfUkVRVUVTVCwgQXhpb3NFcnJvci5FUlJfQkFEX1JFU1BPTlNFXVtNYXRoLmZsb29yKHJlc3BvbnNlLnN0YXR1cyAvIDEwMCkgLSA0XSxcbiAgICAgIHJlc3BvbnNlLmNvbmZpZyxcbiAgICAgIHJlc3BvbnNlLnJlcXVlc3QsXG4gICAgICByZXNwb25zZVxuICAgICkpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHBhcnNlUHJvdG9jb2wodXJsKSB7XG4gIGNvbnN0IG1hdGNoID0gL14oWy0rXFx3XXsxLDI1fSkoOj9cXC9cXC98OikvLmV4ZWModXJsKTtcbiAgcmV0dXJuIG1hdGNoICYmIG1hdGNoWzFdIHx8ICcnO1xufVxuXG4vKipcbiAqIENhbGN1bGF0ZSBkYXRhIG1heFJhdGVcbiAqIEBwYXJhbSB7TnVtYmVyfSBbc2FtcGxlc0NvdW50PSAxMF1cbiAqIEBwYXJhbSB7TnVtYmVyfSBbbWluPSAxMDAwXVxuICogQHJldHVybnMge0Z1bmN0aW9ufVxuICovXG5mdW5jdGlvbiBzcGVlZG9tZXRlcihzYW1wbGVzQ291bnQsIG1pbikge1xuICBzYW1wbGVzQ291bnQgPSBzYW1wbGVzQ291bnQgfHwgMTA7XG4gIGNvbnN0IGJ5dGVzID0gbmV3IEFycmF5KHNhbXBsZXNDb3VudCk7XG4gIGNvbnN0IHRpbWVzdGFtcHMgPSBuZXcgQXJyYXkoc2FtcGxlc0NvdW50KTtcbiAgbGV0IGhlYWQgPSAwO1xuICBsZXQgdGFpbCA9IDA7XG4gIGxldCBmaXJzdFNhbXBsZVRTO1xuXG4gIG1pbiA9IG1pbiAhPT0gdW5kZWZpbmVkID8gbWluIDogMTAwMDtcblxuICByZXR1cm4gZnVuY3Rpb24gcHVzaChjaHVua0xlbmd0aCkge1xuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG5cbiAgICBjb25zdCBzdGFydGVkQXQgPSB0aW1lc3RhbXBzW3RhaWxdO1xuXG4gICAgaWYgKCFmaXJzdFNhbXBsZVRTKSB7XG4gICAgICBmaXJzdFNhbXBsZVRTID0gbm93O1xuICAgIH1cblxuICAgIGJ5dGVzW2hlYWRdID0gY2h1bmtMZW5ndGg7XG4gICAgdGltZXN0YW1wc1toZWFkXSA9IG5vdztcblxuICAgIGxldCBpID0gdGFpbDtcbiAgICBsZXQgYnl0ZXNDb3VudCA9IDA7XG5cbiAgICB3aGlsZSAoaSAhPT0gaGVhZCkge1xuICAgICAgYnl0ZXNDb3VudCArPSBieXRlc1tpKytdO1xuICAgICAgaSA9IGkgJSBzYW1wbGVzQ291bnQ7XG4gICAgfVxuXG4gICAgaGVhZCA9IChoZWFkICsgMSkgJSBzYW1wbGVzQ291bnQ7XG5cbiAgICBpZiAoaGVhZCA9PT0gdGFpbCkge1xuICAgICAgdGFpbCA9ICh0YWlsICsgMSkgJSBzYW1wbGVzQ291bnQ7XG4gICAgfVxuXG4gICAgaWYgKG5vdyAtIGZpcnN0U2FtcGxlVFMgPCBtaW4pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwYXNzZWQgPSBzdGFydGVkQXQgJiYgbm93IC0gc3RhcnRlZEF0O1xuXG4gICAgcmV0dXJuIHBhc3NlZCA/IE1hdGgucm91bmQoYnl0ZXNDb3VudCAqIDEwMDAgLyBwYXNzZWQpIDogdW5kZWZpbmVkO1xuICB9O1xufVxuXG4vKipcbiAqIFRocm90dGxlIGRlY29yYXRvclxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAqIEBwYXJhbSB7TnVtYmVyfSBmcmVxXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn1cbiAqL1xuZnVuY3Rpb24gdGhyb3R0bGUoZm4sIGZyZXEpIHtcbiAgbGV0IHRpbWVzdGFtcCA9IDA7XG4gIGxldCB0aHJlc2hvbGQgPSAxMDAwIC8gZnJlcTtcbiAgbGV0IGxhc3RBcmdzO1xuICBsZXQgdGltZXI7XG5cbiAgY29uc3QgaW52b2tlID0gKGFyZ3MsIG5vdyA9IERhdGUubm93KCkpID0+IHtcbiAgICB0aW1lc3RhbXAgPSBub3c7XG4gICAgbGFzdEFyZ3MgPSBudWxsO1xuICAgIGlmICh0aW1lcikge1xuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICAgIHRpbWVyID0gbnVsbDtcbiAgICB9XG4gICAgZm4uYXBwbHkobnVsbCwgYXJncyk7XG4gIH07XG5cbiAgY29uc3QgdGhyb3R0bGVkID0gKC4uLmFyZ3MpID0+IHtcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IHBhc3NlZCA9IG5vdyAtIHRpbWVzdGFtcDtcbiAgICBpZiAoIHBhc3NlZCA+PSB0aHJlc2hvbGQpIHtcbiAgICAgIGludm9rZShhcmdzLCBub3cpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsYXN0QXJncyA9IGFyZ3M7XG4gICAgICBpZiAoIXRpbWVyKSB7XG4gICAgICAgIHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGltZXIgPSBudWxsO1xuICAgICAgICAgIGludm9rZShsYXN0QXJncyk7XG4gICAgICAgIH0sIHRocmVzaG9sZCAtIHBhc3NlZCk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGZsdXNoID0gKCkgPT4gbGFzdEFyZ3MgJiYgaW52b2tlKGxhc3RBcmdzKTtcblxuICByZXR1cm4gW3Rocm90dGxlZCwgZmx1c2hdO1xufVxuXG5jb25zdCBwcm9ncmVzc0V2ZW50UmVkdWNlciA9IChsaXN0ZW5lciwgaXNEb3dubG9hZFN0cmVhbSwgZnJlcSA9IDMpID0+IHtcbiAgbGV0IGJ5dGVzTm90aWZpZWQgPSAwO1xuICBjb25zdCBfc3BlZWRvbWV0ZXIgPSBzcGVlZG9tZXRlcig1MCwgMjUwKTtcblxuICByZXR1cm4gdGhyb3R0bGUoZSA9PiB7XG4gICAgY29uc3QgbG9hZGVkID0gZS5sb2FkZWQ7XG4gICAgY29uc3QgdG90YWwgPSBlLmxlbmd0aENvbXB1dGFibGUgPyBlLnRvdGFsIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IHByb2dyZXNzQnl0ZXMgPSBsb2FkZWQgLSBieXRlc05vdGlmaWVkO1xuICAgIGNvbnN0IHJhdGUgPSBfc3BlZWRvbWV0ZXIocHJvZ3Jlc3NCeXRlcyk7XG4gICAgY29uc3QgaW5SYW5nZSA9IGxvYWRlZCA8PSB0b3RhbDtcblxuICAgIGJ5dGVzTm90aWZpZWQgPSBsb2FkZWQ7XG5cbiAgICBjb25zdCBkYXRhID0ge1xuICAgICAgbG9hZGVkLFxuICAgICAgdG90YWwsXG4gICAgICBwcm9ncmVzczogdG90YWwgPyAobG9hZGVkIC8gdG90YWwpIDogdW5kZWZpbmVkLFxuICAgICAgYnl0ZXM6IHByb2dyZXNzQnl0ZXMsXG4gICAgICByYXRlOiByYXRlID8gcmF0ZSA6IHVuZGVmaW5lZCxcbiAgICAgIGVzdGltYXRlZDogcmF0ZSAmJiB0b3RhbCAmJiBpblJhbmdlID8gKHRvdGFsIC0gbG9hZGVkKSAvIHJhdGUgOiB1bmRlZmluZWQsXG4gICAgICBldmVudDogZSxcbiAgICAgIGxlbmd0aENvbXB1dGFibGU6IHRvdGFsICE9IG51bGwsXG4gICAgICBbaXNEb3dubG9hZFN0cmVhbSA/ICdkb3dubG9hZCcgOiAndXBsb2FkJ106IHRydWVcbiAgICB9O1xuXG4gICAgbGlzdGVuZXIoZGF0YSk7XG4gIH0sIGZyZXEpO1xufTtcblxuY29uc3QgcHJvZ3Jlc3NFdmVudERlY29yYXRvciA9ICh0b3RhbCwgdGhyb3R0bGVkKSA9PiB7XG4gIGNvbnN0IGxlbmd0aENvbXB1dGFibGUgPSB0b3RhbCAhPSBudWxsO1xuXG4gIHJldHVybiBbKGxvYWRlZCkgPT4gdGhyb3R0bGVkWzBdKHtcbiAgICBsZW5ndGhDb21wdXRhYmxlLFxuICAgIHRvdGFsLFxuICAgIGxvYWRlZFxuICB9KSwgdGhyb3R0bGVkWzFdXTtcbn07XG5cbmNvbnN0IGFzeW5jRGVjb3JhdG9yID0gKGZuKSA9PiAoLi4uYXJncykgPT4gdXRpbHMkMS5hc2FwKCgpID0+IGZuKC4uLmFyZ3MpKTtcblxudmFyIGlzVVJMU2FtZU9yaWdpbiA9IHBsYXRmb3JtLmhhc1N0YW5kYXJkQnJvd3NlckVudiA/ICgob3JpZ2luLCBpc01TSUUpID0+ICh1cmwpID0+IHtcbiAgdXJsID0gbmV3IFVSTCh1cmwsIHBsYXRmb3JtLm9yaWdpbik7XG5cbiAgcmV0dXJuIChcbiAgICBvcmlnaW4ucHJvdG9jb2wgPT09IHVybC5wcm90b2NvbCAmJlxuICAgIG9yaWdpbi5ob3N0ID09PSB1cmwuaG9zdCAmJlxuICAgIChpc01TSUUgfHwgb3JpZ2luLnBvcnQgPT09IHVybC5wb3J0KVxuICApO1xufSkoXG4gIG5ldyBVUkwocGxhdGZvcm0ub3JpZ2luKSxcbiAgcGxhdGZvcm0ubmF2aWdhdG9yICYmIC8obXNpZXx0cmlkZW50KS9pLnRlc3QocGxhdGZvcm0ubmF2aWdhdG9yLnVzZXJBZ2VudClcbikgOiAoKSA9PiB0cnVlO1xuXG52YXIgY29va2llcyA9IHBsYXRmb3JtLmhhc1N0YW5kYXJkQnJvd3NlckVudiA/XG5cbiAgLy8gU3RhbmRhcmQgYnJvd3NlciBlbnZzIHN1cHBvcnQgZG9jdW1lbnQuY29va2llXG4gIHtcbiAgICB3cml0ZShuYW1lLCB2YWx1ZSwgZXhwaXJlcywgcGF0aCwgZG9tYWluLCBzZWN1cmUpIHtcbiAgICAgIGNvbnN0IGNvb2tpZSA9IFtuYW1lICsgJz0nICsgZW5jb2RlVVJJQ29tcG9uZW50KHZhbHVlKV07XG5cbiAgICAgIHV0aWxzJDEuaXNOdW1iZXIoZXhwaXJlcykgJiYgY29va2llLnB1c2goJ2V4cGlyZXM9JyArIG5ldyBEYXRlKGV4cGlyZXMpLnRvR01UU3RyaW5nKCkpO1xuXG4gICAgICB1dGlscyQxLmlzU3RyaW5nKHBhdGgpICYmIGNvb2tpZS5wdXNoKCdwYXRoPScgKyBwYXRoKTtcblxuICAgICAgdXRpbHMkMS5pc1N0cmluZyhkb21haW4pICYmIGNvb2tpZS5wdXNoKCdkb21haW49JyArIGRvbWFpbik7XG5cbiAgICAgIHNlY3VyZSA9PT0gdHJ1ZSAmJiBjb29raWUucHVzaCgnc2VjdXJlJyk7XG5cbiAgICAgIGRvY3VtZW50LmNvb2tpZSA9IGNvb2tpZS5qb2luKCc7ICcpO1xuICAgIH0sXG5cbiAgICByZWFkKG5hbWUpIHtcbiAgICAgIGNvbnN0IG1hdGNoID0gZG9jdW1lbnQuY29va2llLm1hdGNoKG5ldyBSZWdFeHAoJyhefDtcXFxccyopKCcgKyBuYW1lICsgJyk9KFteO10qKScpKTtcbiAgICAgIHJldHVybiAobWF0Y2ggPyBkZWNvZGVVUklDb21wb25lbnQobWF0Y2hbM10pIDogbnVsbCk7XG4gICAgfSxcblxuICAgIHJlbW92ZShuYW1lKSB7XG4gICAgICB0aGlzLndyaXRlKG5hbWUsICcnLCBEYXRlLm5vdygpIC0gODY0MDAwMDApO1xuICAgIH1cbiAgfVxuXG4gIDpcblxuICAvLyBOb24tc3RhbmRhcmQgYnJvd3NlciBlbnYgKHdlYiB3b3JrZXJzLCByZWFjdC1uYXRpdmUpIGxhY2sgbmVlZGVkIHN1cHBvcnQuXG4gIHtcbiAgICB3cml0ZSgpIHt9LFxuICAgIHJlYWQoKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9LFxuICAgIHJlbW92ZSgpIHt9XG4gIH07XG5cbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgVVJMIGlzIGFic29sdXRlXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHVybCBUaGUgVVJMIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIFVSTCBpcyBhYnNvbHV0ZSwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzQWJzb2x1dGVVUkwodXJsKSB7XG4gIC8vIEEgVVJMIGlzIGNvbnNpZGVyZWQgYWJzb2x1dGUgaWYgaXQgYmVnaW5zIHdpdGggXCI8c2NoZW1lPjovL1wiIG9yIFwiLy9cIiAocHJvdG9jb2wtcmVsYXRpdmUgVVJMKS5cbiAgLy8gUkZDIDM5ODYgZGVmaW5lcyBzY2hlbWUgbmFtZSBhcyBhIHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMgYmVnaW5uaW5nIHdpdGggYSBsZXR0ZXIgYW5kIGZvbGxvd2VkXG4gIC8vIGJ5IGFueSBjb21iaW5hdGlvbiBvZiBsZXR0ZXJzLCBkaWdpdHMsIHBsdXMsIHBlcmlvZCwgb3IgaHlwaGVuLlxuICByZXR1cm4gL14oW2Etel1bYS16XFxkK1xcLS5dKjopP1xcL1xcLy9pLnRlc3QodXJsKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IFVSTCBieSBjb21iaW5pbmcgdGhlIHNwZWNpZmllZCBVUkxzXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGJhc2VVUkwgVGhlIGJhc2UgVVJMXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVsYXRpdmVVUkwgVGhlIHJlbGF0aXZlIFVSTFxuICpcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBjb21iaW5lZCBVUkxcbiAqL1xuZnVuY3Rpb24gY29tYmluZVVSTHMoYmFzZVVSTCwgcmVsYXRpdmVVUkwpIHtcbiAgcmV0dXJuIHJlbGF0aXZlVVJMXG4gICAgPyBiYXNlVVJMLnJlcGxhY2UoL1xcLz9cXC8kLywgJycpICsgJy8nICsgcmVsYXRpdmVVUkwucmVwbGFjZSgvXlxcLysvLCAnJylcbiAgICA6IGJhc2VVUkw7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBVUkwgYnkgY29tYmluaW5nIHRoZSBiYXNlVVJMIHdpdGggdGhlIHJlcXVlc3RlZFVSTCxcbiAqIG9ubHkgd2hlbiB0aGUgcmVxdWVzdGVkVVJMIGlzIG5vdCBhbHJlYWR5IGFuIGFic29sdXRlIFVSTC5cbiAqIElmIHRoZSByZXF1ZXN0VVJMIGlzIGFic29sdXRlLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHJlcXVlc3RlZFVSTCB1bnRvdWNoZWQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGJhc2VVUkwgVGhlIGJhc2UgVVJMXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVxdWVzdGVkVVJMIEFic29sdXRlIG9yIHJlbGF0aXZlIFVSTCB0byBjb21iaW5lXG4gKlxuICogQHJldHVybnMge3N0cmluZ30gVGhlIGNvbWJpbmVkIGZ1bGwgcGF0aFxuICovXG5mdW5jdGlvbiBidWlsZEZ1bGxQYXRoKGJhc2VVUkwsIHJlcXVlc3RlZFVSTCwgYWxsb3dBYnNvbHV0ZVVybHMpIHtcbiAgbGV0IGlzUmVsYXRpdmVVcmwgPSAhaXNBYnNvbHV0ZVVSTChyZXF1ZXN0ZWRVUkwpO1xuICBpZiAoYmFzZVVSTCAmJiAoaXNSZWxhdGl2ZVVybCB8fCBhbGxvd0Fic29sdXRlVXJscyA9PSBmYWxzZSkpIHtcbiAgICByZXR1cm4gY29tYmluZVVSTHMoYmFzZVVSTCwgcmVxdWVzdGVkVVJMKTtcbiAgfVxuICByZXR1cm4gcmVxdWVzdGVkVVJMO1xufVxuXG5jb25zdCBoZWFkZXJzVG9PYmplY3QgPSAodGhpbmcpID0+IHRoaW5nIGluc3RhbmNlb2YgQXhpb3NIZWFkZXJzJDEgPyB7IC4uLnRoaW5nIH0gOiB0aGluZztcblxuLyoqXG4gKiBDb25maWctc3BlY2lmaWMgbWVyZ2UtZnVuY3Rpb24gd2hpY2ggY3JlYXRlcyBhIG5ldyBjb25maWctb2JqZWN0XG4gKiBieSBtZXJnaW5nIHR3byBjb25maWd1cmF0aW9uIG9iamVjdHMgdG9nZXRoZXIuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZzFcbiAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcyXG4gKlxuICogQHJldHVybnMge09iamVjdH0gTmV3IG9iamVjdCByZXN1bHRpbmcgZnJvbSBtZXJnaW5nIGNvbmZpZzIgdG8gY29uZmlnMVxuICovXG5mdW5jdGlvbiBtZXJnZUNvbmZpZyhjb25maWcxLCBjb25maWcyKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICBjb25maWcyID0gY29uZmlnMiB8fCB7fTtcbiAgY29uc3QgY29uZmlnID0ge307XG5cbiAgZnVuY3Rpb24gZ2V0TWVyZ2VkVmFsdWUodGFyZ2V0LCBzb3VyY2UsIHByb3AsIGNhc2VsZXNzKSB7XG4gICAgaWYgKHV0aWxzJDEuaXNQbGFpbk9iamVjdCh0YXJnZXQpICYmIHV0aWxzJDEuaXNQbGFpbk9iamVjdChzb3VyY2UpKSB7XG4gICAgICByZXR1cm4gdXRpbHMkMS5tZXJnZS5jYWxsKHtjYXNlbGVzc30sIHRhcmdldCwgc291cmNlKTtcbiAgICB9IGVsc2UgaWYgKHV0aWxzJDEuaXNQbGFpbk9iamVjdChzb3VyY2UpKSB7XG4gICAgICByZXR1cm4gdXRpbHMkMS5tZXJnZSh7fSwgc291cmNlKTtcbiAgICB9IGVsc2UgaWYgKHV0aWxzJDEuaXNBcnJheShzb3VyY2UpKSB7XG4gICAgICByZXR1cm4gc291cmNlLnNsaWNlKCk7XG4gICAgfVxuICAgIHJldHVybiBzb3VyY2U7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29uc2lzdGVudC1yZXR1cm5cbiAgZnVuY3Rpb24gbWVyZ2VEZWVwUHJvcGVydGllcyhhLCBiLCBwcm9wICwgY2FzZWxlc3MpIHtcbiAgICBpZiAoIXV0aWxzJDEuaXNVbmRlZmluZWQoYikpIHtcbiAgICAgIHJldHVybiBnZXRNZXJnZWRWYWx1ZShhLCBiLCBwcm9wICwgY2FzZWxlc3MpO1xuICAgIH0gZWxzZSBpZiAoIXV0aWxzJDEuaXNVbmRlZmluZWQoYSkpIHtcbiAgICAgIHJldHVybiBnZXRNZXJnZWRWYWx1ZSh1bmRlZmluZWQsIGEsIHByb3AgLCBjYXNlbGVzcyk7XG4gICAgfVxuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbnNpc3RlbnQtcmV0dXJuXG4gIGZ1bmN0aW9uIHZhbHVlRnJvbUNvbmZpZzIoYSwgYikge1xuICAgIGlmICghdXRpbHMkMS5pc1VuZGVmaW5lZChiKSkge1xuICAgICAgcmV0dXJuIGdldE1lcmdlZFZhbHVlKHVuZGVmaW5lZCwgYik7XG4gICAgfVxuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbnNpc3RlbnQtcmV0dXJuXG4gIGZ1bmN0aW9uIGRlZmF1bHRUb0NvbmZpZzIoYSwgYikge1xuICAgIGlmICghdXRpbHMkMS5pc1VuZGVmaW5lZChiKSkge1xuICAgICAgcmV0dXJuIGdldE1lcmdlZFZhbHVlKHVuZGVmaW5lZCwgYik7XG4gICAgfSBlbHNlIGlmICghdXRpbHMkMS5pc1VuZGVmaW5lZChhKSkge1xuICAgICAgcmV0dXJuIGdldE1lcmdlZFZhbHVlKHVuZGVmaW5lZCwgYSk7XG4gICAgfVxuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbnNpc3RlbnQtcmV0dXJuXG4gIGZ1bmN0aW9uIG1lcmdlRGlyZWN0S2V5cyhhLCBiLCBwcm9wKSB7XG4gICAgaWYgKHByb3AgaW4gY29uZmlnMikge1xuICAgICAgcmV0dXJuIGdldE1lcmdlZFZhbHVlKGEsIGIpO1xuICAgIH0gZWxzZSBpZiAocHJvcCBpbiBjb25maWcxKSB7XG4gICAgICByZXR1cm4gZ2V0TWVyZ2VkVmFsdWUodW5kZWZpbmVkLCBhKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBtZXJnZU1hcCA9IHtcbiAgICB1cmw6IHZhbHVlRnJvbUNvbmZpZzIsXG4gICAgbWV0aG9kOiB2YWx1ZUZyb21Db25maWcyLFxuICAgIGRhdGE6IHZhbHVlRnJvbUNvbmZpZzIsXG4gICAgYmFzZVVSTDogZGVmYXVsdFRvQ29uZmlnMixcbiAgICB0cmFuc2Zvcm1SZXF1ZXN0OiBkZWZhdWx0VG9Db25maWcyLFxuICAgIHRyYW5zZm9ybVJlc3BvbnNlOiBkZWZhdWx0VG9Db25maWcyLFxuICAgIHBhcmFtc1NlcmlhbGl6ZXI6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgdGltZW91dDogZGVmYXVsdFRvQ29uZmlnMixcbiAgICB0aW1lb3V0TWVzc2FnZTogZGVmYXVsdFRvQ29uZmlnMixcbiAgICB3aXRoQ3JlZGVudGlhbHM6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgd2l0aFhTUkZUb2tlbjogZGVmYXVsdFRvQ29uZmlnMixcbiAgICBhZGFwdGVyOiBkZWZhdWx0VG9Db25maWcyLFxuICAgIHJlc3BvbnNlVHlwZTogZGVmYXVsdFRvQ29uZmlnMixcbiAgICB4c3JmQ29va2llTmFtZTogZGVmYXVsdFRvQ29uZmlnMixcbiAgICB4c3JmSGVhZGVyTmFtZTogZGVmYXVsdFRvQ29uZmlnMixcbiAgICBvblVwbG9hZFByb2dyZXNzOiBkZWZhdWx0VG9Db25maWcyLFxuICAgIG9uRG93bmxvYWRQcm9ncmVzczogZGVmYXVsdFRvQ29uZmlnMixcbiAgICBkZWNvbXByZXNzOiBkZWZhdWx0VG9Db25maWcyLFxuICAgIG1heENvbnRlbnRMZW5ndGg6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgbWF4Qm9keUxlbmd0aDogZGVmYXVsdFRvQ29uZmlnMixcbiAgICBiZWZvcmVSZWRpcmVjdDogZGVmYXVsdFRvQ29uZmlnMixcbiAgICB0cmFuc3BvcnQ6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgaHR0cEFnZW50OiBkZWZhdWx0VG9Db25maWcyLFxuICAgIGh0dHBzQWdlbnQ6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgY2FuY2VsVG9rZW46IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgc29ja2V0UGF0aDogZGVmYXVsdFRvQ29uZmlnMixcbiAgICByZXNwb25zZUVuY29kaW5nOiBkZWZhdWx0VG9Db25maWcyLFxuICAgIHZhbGlkYXRlU3RhdHVzOiBtZXJnZURpcmVjdEtleXMsXG4gICAgaGVhZGVyczogKGEsIGIgLCBwcm9wKSA9PiBtZXJnZURlZXBQcm9wZXJ0aWVzKGhlYWRlcnNUb09iamVjdChhKSwgaGVhZGVyc1RvT2JqZWN0KGIpLHByb3AsIHRydWUpXG4gIH07XG5cbiAgdXRpbHMkMS5mb3JFYWNoKE9iamVjdC5rZXlzKE9iamVjdC5hc3NpZ24oe30sIGNvbmZpZzEsIGNvbmZpZzIpKSwgZnVuY3Rpb24gY29tcHV0ZUNvbmZpZ1ZhbHVlKHByb3ApIHtcbiAgICBjb25zdCBtZXJnZSA9IG1lcmdlTWFwW3Byb3BdIHx8IG1lcmdlRGVlcFByb3BlcnRpZXM7XG4gICAgY29uc3QgY29uZmlnVmFsdWUgPSBtZXJnZShjb25maWcxW3Byb3BdLCBjb25maWcyW3Byb3BdLCBwcm9wKTtcbiAgICAodXRpbHMkMS5pc1VuZGVmaW5lZChjb25maWdWYWx1ZSkgJiYgbWVyZ2UgIT09IG1lcmdlRGlyZWN0S2V5cykgfHwgKGNvbmZpZ1twcm9wXSA9IGNvbmZpZ1ZhbHVlKTtcbiAgfSk7XG5cbiAgcmV0dXJuIGNvbmZpZztcbn1cblxudmFyIHJlc29sdmVDb25maWcgPSAoY29uZmlnKSA9PiB7XG4gIGNvbnN0IG5ld0NvbmZpZyA9IG1lcmdlQ29uZmlnKHt9LCBjb25maWcpO1xuXG4gIGxldCB7ZGF0YSwgd2l0aFhTUkZUb2tlbiwgeHNyZkhlYWRlck5hbWUsIHhzcmZDb29raWVOYW1lLCBoZWFkZXJzLCBhdXRofSA9IG5ld0NvbmZpZztcblxuICBuZXdDb25maWcuaGVhZGVycyA9IGhlYWRlcnMgPSBBeGlvc0hlYWRlcnMkMS5mcm9tKGhlYWRlcnMpO1xuXG4gIG5ld0NvbmZpZy51cmwgPSBidWlsZFVSTChidWlsZEZ1bGxQYXRoKG5ld0NvbmZpZy5iYXNlVVJMLCBuZXdDb25maWcudXJsLCBuZXdDb25maWcuYWxsb3dBYnNvbHV0ZVVybHMpLCBjb25maWcucGFyYW1zLCBjb25maWcucGFyYW1zU2VyaWFsaXplcik7XG5cbiAgLy8gSFRUUCBiYXNpYyBhdXRoZW50aWNhdGlvblxuICBpZiAoYXV0aCkge1xuICAgIGhlYWRlcnMuc2V0KCdBdXRob3JpemF0aW9uJywgJ0Jhc2ljICcgK1xuICAgICAgYnRvYSgoYXV0aC51c2VybmFtZSB8fCAnJykgKyAnOicgKyAoYXV0aC5wYXNzd29yZCA/IHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChhdXRoLnBhc3N3b3JkKSkgOiAnJykpXG4gICAgKTtcbiAgfVxuXG4gIGxldCBjb250ZW50VHlwZTtcblxuICBpZiAodXRpbHMkMS5pc0Zvcm1EYXRhKGRhdGEpKSB7XG4gICAgaWYgKHBsYXRmb3JtLmhhc1N0YW5kYXJkQnJvd3NlckVudiB8fCBwbGF0Zm9ybS5oYXNTdGFuZGFyZEJyb3dzZXJXZWJXb3JrZXJFbnYpIHtcbiAgICAgIGhlYWRlcnMuc2V0Q29udGVudFR5cGUodW5kZWZpbmVkKTsgLy8gTGV0IHRoZSBicm93c2VyIHNldCBpdFxuICAgIH0gZWxzZSBpZiAoKGNvbnRlbnRUeXBlID0gaGVhZGVycy5nZXRDb250ZW50VHlwZSgpKSAhPT0gZmFsc2UpIHtcbiAgICAgIC8vIGZpeCBzZW1pY29sb24gZHVwbGljYXRpb24gaXNzdWUgZm9yIFJlYWN0TmF0aXZlIEZvcm1EYXRhIGltcGxlbWVudGF0aW9uXG4gICAgICBjb25zdCBbdHlwZSwgLi4udG9rZW5zXSA9IGNvbnRlbnRUeXBlID8gY29udGVudFR5cGUuc3BsaXQoJzsnKS5tYXAodG9rZW4gPT4gdG9rZW4udHJpbSgpKS5maWx0ZXIoQm9vbGVhbikgOiBbXTtcbiAgICAgIGhlYWRlcnMuc2V0Q29udGVudFR5cGUoW3R5cGUgfHwgJ211bHRpcGFydC9mb3JtLWRhdGEnLCAuLi50b2tlbnNdLmpvaW4oJzsgJykpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEFkZCB4c3JmIGhlYWRlclxuICAvLyBUaGlzIGlzIG9ubHkgZG9uZSBpZiBydW5uaW5nIGluIGEgc3RhbmRhcmQgYnJvd3NlciBlbnZpcm9ubWVudC5cbiAgLy8gU3BlY2lmaWNhbGx5IG5vdCBpZiB3ZSdyZSBpbiBhIHdlYiB3b3JrZXIsIG9yIHJlYWN0LW5hdGl2ZS5cblxuICBpZiAocGxhdGZvcm0uaGFzU3RhbmRhcmRCcm93c2VyRW52KSB7XG4gICAgd2l0aFhTUkZUb2tlbiAmJiB1dGlscyQxLmlzRnVuY3Rpb24od2l0aFhTUkZUb2tlbikgJiYgKHdpdGhYU1JGVG9rZW4gPSB3aXRoWFNSRlRva2VuKG5ld0NvbmZpZykpO1xuXG4gICAgaWYgKHdpdGhYU1JGVG9rZW4gfHwgKHdpdGhYU1JGVG9rZW4gIT09IGZhbHNlICYmIGlzVVJMU2FtZU9yaWdpbihuZXdDb25maWcudXJsKSkpIHtcbiAgICAgIC8vIEFkZCB4c3JmIGhlYWRlclxuICAgICAgY29uc3QgeHNyZlZhbHVlID0geHNyZkhlYWRlck5hbWUgJiYgeHNyZkNvb2tpZU5hbWUgJiYgY29va2llcy5yZWFkKHhzcmZDb29raWVOYW1lKTtcblxuICAgICAgaWYgKHhzcmZWYWx1ZSkge1xuICAgICAgICBoZWFkZXJzLnNldCh4c3JmSGVhZGVyTmFtZSwgeHNyZlZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3Q29uZmlnO1xufTtcblxuY29uc3QgaXNYSFJBZGFwdGVyU3VwcG9ydGVkID0gdHlwZW9mIFhNTEh0dHBSZXF1ZXN0ICE9PSAndW5kZWZpbmVkJztcblxudmFyIHhockFkYXB0ZXIgPSBpc1hIUkFkYXB0ZXJTdXBwb3J0ZWQgJiYgZnVuY3Rpb24gKGNvbmZpZykge1xuICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gZGlzcGF0Y2hYaHJSZXF1ZXN0KHJlc29sdmUsIHJlamVjdCkge1xuICAgIGNvbnN0IF9jb25maWcgPSByZXNvbHZlQ29uZmlnKGNvbmZpZyk7XG4gICAgbGV0IHJlcXVlc3REYXRhID0gX2NvbmZpZy5kYXRhO1xuICAgIGNvbnN0IHJlcXVlc3RIZWFkZXJzID0gQXhpb3NIZWFkZXJzJDEuZnJvbShfY29uZmlnLmhlYWRlcnMpLm5vcm1hbGl6ZSgpO1xuICAgIGxldCB7cmVzcG9uc2VUeXBlLCBvblVwbG9hZFByb2dyZXNzLCBvbkRvd25sb2FkUHJvZ3Jlc3N9ID0gX2NvbmZpZztcbiAgICBsZXQgb25DYW5jZWxlZDtcbiAgICBsZXQgdXBsb2FkVGhyb3R0bGVkLCBkb3dubG9hZFRocm90dGxlZDtcbiAgICBsZXQgZmx1c2hVcGxvYWQsIGZsdXNoRG93bmxvYWQ7XG5cbiAgICBmdW5jdGlvbiBkb25lKCkge1xuICAgICAgZmx1c2hVcGxvYWQgJiYgZmx1c2hVcGxvYWQoKTsgLy8gZmx1c2ggZXZlbnRzXG4gICAgICBmbHVzaERvd25sb2FkICYmIGZsdXNoRG93bmxvYWQoKTsgLy8gZmx1c2ggZXZlbnRzXG5cbiAgICAgIF9jb25maWcuY2FuY2VsVG9rZW4gJiYgX2NvbmZpZy5jYW5jZWxUb2tlbi51bnN1YnNjcmliZShvbkNhbmNlbGVkKTtcblxuICAgICAgX2NvbmZpZy5zaWduYWwgJiYgX2NvbmZpZy5zaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBvbkNhbmNlbGVkKTtcbiAgICB9XG5cbiAgICBsZXQgcmVxdWVzdCA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuXG4gICAgcmVxdWVzdC5vcGVuKF9jb25maWcubWV0aG9kLnRvVXBwZXJDYXNlKCksIF9jb25maWcudXJsLCB0cnVlKTtcblxuICAgIC8vIFNldCB0aGUgcmVxdWVzdCB0aW1lb3V0IGluIE1TXG4gICAgcmVxdWVzdC50aW1lb3V0ID0gX2NvbmZpZy50aW1lb3V0O1xuXG4gICAgZnVuY3Rpb24gb25sb2FkZW5kKCkge1xuICAgICAgaWYgKCFyZXF1ZXN0KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIFByZXBhcmUgdGhlIHJlc3BvbnNlXG4gICAgICBjb25zdCByZXNwb25zZUhlYWRlcnMgPSBBeGlvc0hlYWRlcnMkMS5mcm9tKFxuICAgICAgICAnZ2V0QWxsUmVzcG9uc2VIZWFkZXJzJyBpbiByZXF1ZXN0ICYmIHJlcXVlc3QuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKClcbiAgICAgICk7XG4gICAgICBjb25zdCByZXNwb25zZURhdGEgPSAhcmVzcG9uc2VUeXBlIHx8IHJlc3BvbnNlVHlwZSA9PT0gJ3RleHQnIHx8IHJlc3BvbnNlVHlwZSA9PT0gJ2pzb24nID9cbiAgICAgICAgcmVxdWVzdC5yZXNwb25zZVRleHQgOiByZXF1ZXN0LnJlc3BvbnNlO1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSB7XG4gICAgICAgIGRhdGE6IHJlc3BvbnNlRGF0YSxcbiAgICAgICAgc3RhdHVzOiByZXF1ZXN0LnN0YXR1cyxcbiAgICAgICAgc3RhdHVzVGV4dDogcmVxdWVzdC5zdGF0dXNUZXh0LFxuICAgICAgICBoZWFkZXJzOiByZXNwb25zZUhlYWRlcnMsXG4gICAgICAgIGNvbmZpZyxcbiAgICAgICAgcmVxdWVzdFxuICAgICAgfTtcblxuICAgICAgc2V0dGxlKGZ1bmN0aW9uIF9yZXNvbHZlKHZhbHVlKSB7XG4gICAgICAgIHJlc29sdmUodmFsdWUpO1xuICAgICAgICBkb25lKCk7XG4gICAgICB9LCBmdW5jdGlvbiBfcmVqZWN0KGVycikge1xuICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgZG9uZSgpO1xuICAgICAgfSwgcmVzcG9uc2UpO1xuXG4gICAgICAvLyBDbGVhbiB1cCByZXF1ZXN0XG4gICAgICByZXF1ZXN0ID0gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoJ29ubG9hZGVuZCcgaW4gcmVxdWVzdCkge1xuICAgICAgLy8gVXNlIG9ubG9hZGVuZCBpZiBhdmFpbGFibGVcbiAgICAgIHJlcXVlc3Qub25sb2FkZW5kID0gb25sb2FkZW5kO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBMaXN0ZW4gZm9yIHJlYWR5IHN0YXRlIHRvIGVtdWxhdGUgb25sb2FkZW5kXG4gICAgICByZXF1ZXN0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uIGhhbmRsZUxvYWQoKSB7XG4gICAgICAgIGlmICghcmVxdWVzdCB8fCByZXF1ZXN0LnJlYWR5U3RhdGUgIT09IDQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUaGUgcmVxdWVzdCBlcnJvcmVkIG91dCBhbmQgd2UgZGlkbid0IGdldCBhIHJlc3BvbnNlLCB0aGlzIHdpbGwgYmVcbiAgICAgICAgLy8gaGFuZGxlZCBieSBvbmVycm9yIGluc3RlYWRcbiAgICAgICAgLy8gV2l0aCBvbmUgZXhjZXB0aW9uOiByZXF1ZXN0IHRoYXQgdXNpbmcgZmlsZTogcHJvdG9jb2wsIG1vc3QgYnJvd3NlcnNcbiAgICAgICAgLy8gd2lsbCByZXR1cm4gc3RhdHVzIGFzIDAgZXZlbiB0aG91Z2ggaXQncyBhIHN1Y2Nlc3NmdWwgcmVxdWVzdFxuICAgICAgICBpZiAocmVxdWVzdC5zdGF0dXMgPT09IDAgJiYgIShyZXF1ZXN0LnJlc3BvbnNlVVJMICYmIHJlcXVlc3QucmVzcG9uc2VVUkwuaW5kZXhPZignZmlsZTonKSA9PT0gMCkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gcmVhZHlzdGF0ZSBoYW5kbGVyIGlzIGNhbGxpbmcgYmVmb3JlIG9uZXJyb3Igb3Igb250aW1lb3V0IGhhbmRsZXJzLFxuICAgICAgICAvLyBzbyB3ZSBzaG91bGQgY2FsbCBvbmxvYWRlbmQgb24gdGhlIG5leHQgJ3RpY2snXG4gICAgICAgIHNldFRpbWVvdXQob25sb2FkZW5kKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGJyb3dzZXIgcmVxdWVzdCBjYW5jZWxsYXRpb24gKGFzIG9wcG9zZWQgdG8gYSBtYW51YWwgY2FuY2VsbGF0aW9uKVxuICAgIHJlcXVlc3Qub25hYm9ydCA9IGZ1bmN0aW9uIGhhbmRsZUFib3J0KCkge1xuICAgICAgaWYgKCFyZXF1ZXN0KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgcmVqZWN0KG5ldyBBeGlvc0Vycm9yKCdSZXF1ZXN0IGFib3J0ZWQnLCBBeGlvc0Vycm9yLkVDT05OQUJPUlRFRCwgY29uZmlnLCByZXF1ZXN0KSk7XG5cbiAgICAgIC8vIENsZWFuIHVwIHJlcXVlc3RcbiAgICAgIHJlcXVlc3QgPSBudWxsO1xuICAgIH07XG5cbiAgICAvLyBIYW5kbGUgbG93IGxldmVsIG5ldHdvcmsgZXJyb3JzXG4gICAgcmVxdWVzdC5vbmVycm9yID0gZnVuY3Rpb24gaGFuZGxlRXJyb3IoKSB7XG4gICAgICAvLyBSZWFsIGVycm9ycyBhcmUgaGlkZGVuIGZyb20gdXMgYnkgdGhlIGJyb3dzZXJcbiAgICAgIC8vIG9uZXJyb3Igc2hvdWxkIG9ubHkgZmlyZSBpZiBpdCdzIGEgbmV0d29yayBlcnJvclxuICAgICAgcmVqZWN0KG5ldyBBeGlvc0Vycm9yKCdOZXR3b3JrIEVycm9yJywgQXhpb3NFcnJvci5FUlJfTkVUV09SSywgY29uZmlnLCByZXF1ZXN0KSk7XG5cbiAgICAgIC8vIENsZWFuIHVwIHJlcXVlc3RcbiAgICAgIHJlcXVlc3QgPSBudWxsO1xuICAgIH07XG5cbiAgICAvLyBIYW5kbGUgdGltZW91dFxuICAgIHJlcXVlc3Qub250aW1lb3V0ID0gZnVuY3Rpb24gaGFuZGxlVGltZW91dCgpIHtcbiAgICAgIGxldCB0aW1lb3V0RXJyb3JNZXNzYWdlID0gX2NvbmZpZy50aW1lb3V0ID8gJ3RpbWVvdXQgb2YgJyArIF9jb25maWcudGltZW91dCArICdtcyBleGNlZWRlZCcgOiAndGltZW91dCBleGNlZWRlZCc7XG4gICAgICBjb25zdCB0cmFuc2l0aW9uYWwgPSBfY29uZmlnLnRyYW5zaXRpb25hbCB8fCB0cmFuc2l0aW9uYWxEZWZhdWx0cztcbiAgICAgIGlmIChfY29uZmlnLnRpbWVvdXRFcnJvck1lc3NhZ2UpIHtcbiAgICAgICAgdGltZW91dEVycm9yTWVzc2FnZSA9IF9jb25maWcudGltZW91dEVycm9yTWVzc2FnZTtcbiAgICAgIH1cbiAgICAgIHJlamVjdChuZXcgQXhpb3NFcnJvcihcbiAgICAgICAgdGltZW91dEVycm9yTWVzc2FnZSxcbiAgICAgICAgdHJhbnNpdGlvbmFsLmNsYXJpZnlUaW1lb3V0RXJyb3IgPyBBeGlvc0Vycm9yLkVUSU1FRE9VVCA6IEF4aW9zRXJyb3IuRUNPTk5BQk9SVEVELFxuICAgICAgICBjb25maWcsXG4gICAgICAgIHJlcXVlc3QpKTtcblxuICAgICAgLy8gQ2xlYW4gdXAgcmVxdWVzdFxuICAgICAgcmVxdWVzdCA9IG51bGw7XG4gICAgfTtcblxuICAgIC8vIFJlbW92ZSBDb250ZW50LVR5cGUgaWYgZGF0YSBpcyB1bmRlZmluZWRcbiAgICByZXF1ZXN0RGF0YSA9PT0gdW5kZWZpbmVkICYmIHJlcXVlc3RIZWFkZXJzLnNldENvbnRlbnRUeXBlKG51bGwpO1xuXG4gICAgLy8gQWRkIGhlYWRlcnMgdG8gdGhlIHJlcXVlc3RcbiAgICBpZiAoJ3NldFJlcXVlc3RIZWFkZXInIGluIHJlcXVlc3QpIHtcbiAgICAgIHV0aWxzJDEuZm9yRWFjaChyZXF1ZXN0SGVhZGVycy50b0pTT04oKSwgZnVuY3Rpb24gc2V0UmVxdWVzdEhlYWRlcih2YWwsIGtleSkge1xuICAgICAgICByZXF1ZXN0LnNldFJlcXVlc3RIZWFkZXIoa2V5LCB2YWwpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQWRkIHdpdGhDcmVkZW50aWFscyB0byByZXF1ZXN0IGlmIG5lZWRlZFxuICAgIGlmICghdXRpbHMkMS5pc1VuZGVmaW5lZChfY29uZmlnLndpdGhDcmVkZW50aWFscykpIHtcbiAgICAgIHJlcXVlc3Qud2l0aENyZWRlbnRpYWxzID0gISFfY29uZmlnLndpdGhDcmVkZW50aWFscztcbiAgICB9XG5cbiAgICAvLyBBZGQgcmVzcG9uc2VUeXBlIHRvIHJlcXVlc3QgaWYgbmVlZGVkXG4gICAgaWYgKHJlc3BvbnNlVHlwZSAmJiByZXNwb25zZVR5cGUgIT09ICdqc29uJykge1xuICAgICAgcmVxdWVzdC5yZXNwb25zZVR5cGUgPSBfY29uZmlnLnJlc3BvbnNlVHlwZTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgcHJvZ3Jlc3MgaWYgbmVlZGVkXG4gICAgaWYgKG9uRG93bmxvYWRQcm9ncmVzcykge1xuICAgICAgKFtkb3dubG9hZFRocm90dGxlZCwgZmx1c2hEb3dubG9hZF0gPSBwcm9ncmVzc0V2ZW50UmVkdWNlcihvbkRvd25sb2FkUHJvZ3Jlc3MsIHRydWUpKTtcbiAgICAgIHJlcXVlc3QuYWRkRXZlbnRMaXN0ZW5lcigncHJvZ3Jlc3MnLCBkb3dubG9hZFRocm90dGxlZCk7XG4gICAgfVxuXG4gICAgLy8gTm90IGFsbCBicm93c2VycyBzdXBwb3J0IHVwbG9hZCBldmVudHNcbiAgICBpZiAob25VcGxvYWRQcm9ncmVzcyAmJiByZXF1ZXN0LnVwbG9hZCkge1xuICAgICAgKFt1cGxvYWRUaHJvdHRsZWQsIGZsdXNoVXBsb2FkXSA9IHByb2dyZXNzRXZlbnRSZWR1Y2VyKG9uVXBsb2FkUHJvZ3Jlc3MpKTtcblxuICAgICAgcmVxdWVzdC51cGxvYWQuYWRkRXZlbnRMaXN0ZW5lcigncHJvZ3Jlc3MnLCB1cGxvYWRUaHJvdHRsZWQpO1xuXG4gICAgICByZXF1ZXN0LnVwbG9hZC5hZGRFdmVudExpc3RlbmVyKCdsb2FkZW5kJywgZmx1c2hVcGxvYWQpO1xuICAgIH1cblxuICAgIGlmIChfY29uZmlnLmNhbmNlbFRva2VuIHx8IF9jb25maWcuc2lnbmFsKSB7XG4gICAgICAvLyBIYW5kbGUgY2FuY2VsbGF0aW9uXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZnVuYy1uYW1lc1xuICAgICAgb25DYW5jZWxlZCA9IGNhbmNlbCA9PiB7XG4gICAgICAgIGlmICghcmVxdWVzdCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoIWNhbmNlbCB8fCBjYW5jZWwudHlwZSA/IG5ldyBDYW5jZWxlZEVycm9yKG51bGwsIGNvbmZpZywgcmVxdWVzdCkgOiBjYW5jZWwpO1xuICAgICAgICByZXF1ZXN0LmFib3J0KCk7XG4gICAgICAgIHJlcXVlc3QgPSBudWxsO1xuICAgICAgfTtcblxuICAgICAgX2NvbmZpZy5jYW5jZWxUb2tlbiAmJiBfY29uZmlnLmNhbmNlbFRva2VuLnN1YnNjcmliZShvbkNhbmNlbGVkKTtcbiAgICAgIGlmIChfY29uZmlnLnNpZ25hbCkge1xuICAgICAgICBfY29uZmlnLnNpZ25hbC5hYm9ydGVkID8gb25DYW5jZWxlZCgpIDogX2NvbmZpZy5zaWduYWwuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBvbkNhbmNlbGVkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBwcm90b2NvbCA9IHBhcnNlUHJvdG9jb2woX2NvbmZpZy51cmwpO1xuXG4gICAgaWYgKHByb3RvY29sICYmIHBsYXRmb3JtLnByb3RvY29scy5pbmRleE9mKHByb3RvY29sKSA9PT0gLTEpIHtcbiAgICAgIHJlamVjdChuZXcgQXhpb3NFcnJvcignVW5zdXBwb3J0ZWQgcHJvdG9jb2wgJyArIHByb3RvY29sICsgJzonLCBBeGlvc0Vycm9yLkVSUl9CQURfUkVRVUVTVCwgY29uZmlnKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG5cbiAgICAvLyBTZW5kIHRoZSByZXF1ZXN0XG4gICAgcmVxdWVzdC5zZW5kKHJlcXVlc3REYXRhIHx8IG51bGwpO1xuICB9KTtcbn07XG5cbmNvbnN0IGNvbXBvc2VTaWduYWxzID0gKHNpZ25hbHMsIHRpbWVvdXQpID0+IHtcbiAgY29uc3Qge2xlbmd0aH0gPSAoc2lnbmFscyA9IHNpZ25hbHMgPyBzaWduYWxzLmZpbHRlcihCb29sZWFuKSA6IFtdKTtcblxuICBpZiAodGltZW91dCB8fCBsZW5ndGgpIHtcbiAgICBsZXQgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcblxuICAgIGxldCBhYm9ydGVkO1xuXG4gICAgY29uc3Qgb25hYm9ydCA9IGZ1bmN0aW9uIChyZWFzb24pIHtcbiAgICAgIGlmICghYWJvcnRlZCkge1xuICAgICAgICBhYm9ydGVkID0gdHJ1ZTtcbiAgICAgICAgdW5zdWJzY3JpYmUoKTtcbiAgICAgICAgY29uc3QgZXJyID0gcmVhc29uIGluc3RhbmNlb2YgRXJyb3IgPyByZWFzb24gOiB0aGlzLnJlYXNvbjtcbiAgICAgICAgY29udHJvbGxlci5hYm9ydChlcnIgaW5zdGFuY2VvZiBBeGlvc0Vycm9yID8gZXJyIDogbmV3IENhbmNlbGVkRXJyb3IoZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IGVycikpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBsZXQgdGltZXIgPSB0aW1lb3V0ICYmIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGltZXIgPSBudWxsO1xuICAgICAgb25hYm9ydChuZXcgQXhpb3NFcnJvcihgdGltZW91dCAke3RpbWVvdXR9IG9mIG1zIGV4Y2VlZGVkYCwgQXhpb3NFcnJvci5FVElNRURPVVQpKTtcbiAgICB9LCB0aW1lb3V0KTtcblxuICAgIGNvbnN0IHVuc3Vic2NyaWJlID0gKCkgPT4ge1xuICAgICAgaWYgKHNpZ25hbHMpIHtcbiAgICAgICAgdGltZXIgJiYgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICAgICAgdGltZXIgPSBudWxsO1xuICAgICAgICBzaWduYWxzLmZvckVhY2goc2lnbmFsID0+IHtcbiAgICAgICAgICBzaWduYWwudW5zdWJzY3JpYmUgPyBzaWduYWwudW5zdWJzY3JpYmUob25hYm9ydCkgOiBzaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBvbmFib3J0KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHNpZ25hbHMgPSBudWxsO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBzaWduYWxzLmZvckVhY2goKHNpZ25hbCkgPT4gc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0Jywgb25hYm9ydCkpO1xuXG4gICAgY29uc3Qge3NpZ25hbH0gPSBjb250cm9sbGVyO1xuXG4gICAgc2lnbmFsLnVuc3Vic2NyaWJlID0gKCkgPT4gdXRpbHMkMS5hc2FwKHVuc3Vic2NyaWJlKTtcblxuICAgIHJldHVybiBzaWduYWw7XG4gIH1cbn07XG5cbnZhciBjb21wb3NlU2lnbmFscyQxID0gY29tcG9zZVNpZ25hbHM7XG5cbmNvbnN0IHN0cmVhbUNodW5rID0gZnVuY3Rpb24qIChjaHVuaywgY2h1bmtTaXplKSB7XG4gIGxldCBsZW4gPSBjaHVuay5ieXRlTGVuZ3RoO1xuXG4gIGlmICghY2h1bmtTaXplIHx8IGxlbiA8IGNodW5rU2l6ZSkge1xuICAgIHlpZWxkIGNodW5rO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxldCBwb3MgPSAwO1xuICBsZXQgZW5kO1xuXG4gIHdoaWxlIChwb3MgPCBsZW4pIHtcbiAgICBlbmQgPSBwb3MgKyBjaHVua1NpemU7XG4gICAgeWllbGQgY2h1bmsuc2xpY2UocG9zLCBlbmQpO1xuICAgIHBvcyA9IGVuZDtcbiAgfVxufTtcblxuY29uc3QgcmVhZEJ5dGVzID0gYXN5bmMgZnVuY3Rpb24qIChpdGVyYWJsZSwgY2h1bmtTaXplKSB7XG4gIGZvciBhd2FpdCAoY29uc3QgY2h1bmsgb2YgcmVhZFN0cmVhbShpdGVyYWJsZSkpIHtcbiAgICB5aWVsZCogc3RyZWFtQ2h1bmsoY2h1bmssIGNodW5rU2l6ZSk7XG4gIH1cbn07XG5cbmNvbnN0IHJlYWRTdHJlYW0gPSBhc3luYyBmdW5jdGlvbiogKHN0cmVhbSkge1xuICBpZiAoc3RyZWFtW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSkge1xuICAgIHlpZWxkKiBzdHJlYW07XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgcmVhZGVyID0gc3RyZWFtLmdldFJlYWRlcigpO1xuICB0cnkge1xuICAgIGZvciAoOzspIHtcbiAgICAgIGNvbnN0IHtkb25lLCB2YWx1ZX0gPSBhd2FpdCByZWFkZXIucmVhZCgpO1xuICAgICAgaWYgKGRvbmUpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICB5aWVsZCB2YWx1ZTtcbiAgICB9XG4gIH0gZmluYWxseSB7XG4gICAgYXdhaXQgcmVhZGVyLmNhbmNlbCgpO1xuICB9XG59O1xuXG5jb25zdCB0cmFja1N0cmVhbSA9IChzdHJlYW0sIGNodW5rU2l6ZSwgb25Qcm9ncmVzcywgb25GaW5pc2gpID0+IHtcbiAgY29uc3QgaXRlcmF0b3IgPSByZWFkQnl0ZXMoc3RyZWFtLCBjaHVua1NpemUpO1xuXG4gIGxldCBieXRlcyA9IDA7XG4gIGxldCBkb25lO1xuICBsZXQgX29uRmluaXNoID0gKGUpID0+IHtcbiAgICBpZiAoIWRvbmUpIHtcbiAgICAgIGRvbmUgPSB0cnVlO1xuICAgICAgb25GaW5pc2ggJiYgb25GaW5pc2goZSk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBuZXcgUmVhZGFibGVTdHJlYW0oe1xuICAgIGFzeW5jIHB1bGwoY29udHJvbGxlcikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3Qge2RvbmUsIHZhbHVlfSA9IGF3YWl0IGl0ZXJhdG9yLm5leHQoKTtcblxuICAgICAgICBpZiAoZG9uZSkge1xuICAgICAgICAgX29uRmluaXNoKCk7XG4gICAgICAgICAgY29udHJvbGxlci5jbG9zZSgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsZW4gPSB2YWx1ZS5ieXRlTGVuZ3RoO1xuICAgICAgICBpZiAob25Qcm9ncmVzcykge1xuICAgICAgICAgIGxldCBsb2FkZWRCeXRlcyA9IGJ5dGVzICs9IGxlbjtcbiAgICAgICAgICBvblByb2dyZXNzKGxvYWRlZEJ5dGVzKTtcbiAgICAgICAgfVxuICAgICAgICBjb250cm9sbGVyLmVucXVldWUobmV3IFVpbnQ4QXJyYXkodmFsdWUpKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBfb25GaW5pc2goZXJyKTtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgIH0sXG4gICAgY2FuY2VsKHJlYXNvbikge1xuICAgICAgX29uRmluaXNoKHJlYXNvbik7XG4gICAgICByZXR1cm4gaXRlcmF0b3IucmV0dXJuKCk7XG4gICAgfVxuICB9LCB7XG4gICAgaGlnaFdhdGVyTWFyazogMlxuICB9KVxufTtcblxuY29uc3QgaXNGZXRjaFN1cHBvcnRlZCA9IHR5cGVvZiBmZXRjaCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgUmVxdWVzdCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgUmVzcG9uc2UgPT09ICdmdW5jdGlvbic7XG5jb25zdCBpc1JlYWRhYmxlU3RyZWFtU3VwcG9ydGVkID0gaXNGZXRjaFN1cHBvcnRlZCAmJiB0eXBlb2YgUmVhZGFibGVTdHJlYW0gPT09ICdmdW5jdGlvbic7XG5cbi8vIHVzZWQgb25seSBpbnNpZGUgdGhlIGZldGNoIGFkYXB0ZXJcbmNvbnN0IGVuY29kZVRleHQgPSBpc0ZldGNoU3VwcG9ydGVkICYmICh0eXBlb2YgVGV4dEVuY29kZXIgPT09ICdmdW5jdGlvbicgP1xuICAgICgoZW5jb2RlcikgPT4gKHN0cikgPT4gZW5jb2Rlci5lbmNvZGUoc3RyKSkobmV3IFRleHRFbmNvZGVyKCkpIDpcbiAgICBhc3luYyAoc3RyKSA9PiBuZXcgVWludDhBcnJheShhd2FpdCBuZXcgUmVzcG9uc2Uoc3RyKS5hcnJheUJ1ZmZlcigpKVxuKTtcblxuY29uc3QgdGVzdCA9IChmbiwgLi4uYXJncykgPT4ge1xuICB0cnkge1xuICAgIHJldHVybiAhIWZuKC4uLmFyZ3MpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbn07XG5cbmNvbnN0IHN1cHBvcnRzUmVxdWVzdFN0cmVhbSA9IGlzUmVhZGFibGVTdHJlYW1TdXBwb3J0ZWQgJiYgdGVzdCgoKSA9PiB7XG4gIGxldCBkdXBsZXhBY2Nlc3NlZCA9IGZhbHNlO1xuXG4gIGNvbnN0IGhhc0NvbnRlbnRUeXBlID0gbmV3IFJlcXVlc3QocGxhdGZvcm0ub3JpZ2luLCB7XG4gICAgYm9keTogbmV3IFJlYWRhYmxlU3RyZWFtKCksXG4gICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgZ2V0IGR1cGxleCgpIHtcbiAgICAgIGR1cGxleEFjY2Vzc2VkID0gdHJ1ZTtcbiAgICAgIHJldHVybiAnaGFsZic7XG4gICAgfSxcbiAgfSkuaGVhZGVycy5oYXMoJ0NvbnRlbnQtVHlwZScpO1xuXG4gIHJldHVybiBkdXBsZXhBY2Nlc3NlZCAmJiAhaGFzQ29udGVudFR5cGU7XG59KTtcblxuY29uc3QgREVGQVVMVF9DSFVOS19TSVpFID0gNjQgKiAxMDI0O1xuXG5jb25zdCBzdXBwb3J0c1Jlc3BvbnNlU3RyZWFtID0gaXNSZWFkYWJsZVN0cmVhbVN1cHBvcnRlZCAmJlxuICB0ZXN0KCgpID0+IHV0aWxzJDEuaXNSZWFkYWJsZVN0cmVhbShuZXcgUmVzcG9uc2UoJycpLmJvZHkpKTtcblxuXG5jb25zdCByZXNvbHZlcnMgPSB7XG4gIHN0cmVhbTogc3VwcG9ydHNSZXNwb25zZVN0cmVhbSAmJiAoKHJlcykgPT4gcmVzLmJvZHkpXG59O1xuXG5pc0ZldGNoU3VwcG9ydGVkICYmICgoKHJlcykgPT4ge1xuICBbJ3RleHQnLCAnYXJyYXlCdWZmZXInLCAnYmxvYicsICdmb3JtRGF0YScsICdzdHJlYW0nXS5mb3JFYWNoKHR5cGUgPT4ge1xuICAgICFyZXNvbHZlcnNbdHlwZV0gJiYgKHJlc29sdmVyc1t0eXBlXSA9IHV0aWxzJDEuaXNGdW5jdGlvbihyZXNbdHlwZV0pID8gKHJlcykgPT4gcmVzW3R5cGVdKCkgOlxuICAgICAgKF8sIGNvbmZpZykgPT4ge1xuICAgICAgICB0aHJvdyBuZXcgQXhpb3NFcnJvcihgUmVzcG9uc2UgdHlwZSAnJHt0eXBlfScgaXMgbm90IHN1cHBvcnRlZGAsIEF4aW9zRXJyb3IuRVJSX05PVF9TVVBQT1JULCBjb25maWcpO1xuICAgICAgfSk7XG4gIH0pO1xufSkobmV3IFJlc3BvbnNlKSk7XG5cbmNvbnN0IGdldEJvZHlMZW5ndGggPSBhc3luYyAoYm9keSkgPT4ge1xuICBpZiAoYm9keSA9PSBudWxsKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICBpZih1dGlscyQxLmlzQmxvYihib2R5KSkge1xuICAgIHJldHVybiBib2R5LnNpemU7XG4gIH1cblxuICBpZih1dGlscyQxLmlzU3BlY0NvbXBsaWFudEZvcm0oYm9keSkpIHtcbiAgICBjb25zdCBfcmVxdWVzdCA9IG5ldyBSZXF1ZXN0KHBsYXRmb3JtLm9yaWdpbiwge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBib2R5LFxuICAgIH0pO1xuICAgIHJldHVybiAoYXdhaXQgX3JlcXVlc3QuYXJyYXlCdWZmZXIoKSkuYnl0ZUxlbmd0aDtcbiAgfVxuXG4gIGlmKHV0aWxzJDEuaXNBcnJheUJ1ZmZlclZpZXcoYm9keSkgfHwgdXRpbHMkMS5pc0FycmF5QnVmZmVyKGJvZHkpKSB7XG4gICAgcmV0dXJuIGJvZHkuYnl0ZUxlbmd0aDtcbiAgfVxuXG4gIGlmKHV0aWxzJDEuaXNVUkxTZWFyY2hQYXJhbXMoYm9keSkpIHtcbiAgICBib2R5ID0gYm9keSArICcnO1xuICB9XG5cbiAgaWYodXRpbHMkMS5pc1N0cmluZyhib2R5KSkge1xuICAgIHJldHVybiAoYXdhaXQgZW5jb2RlVGV4dChib2R5KSkuYnl0ZUxlbmd0aDtcbiAgfVxufTtcblxuY29uc3QgcmVzb2x2ZUJvZHlMZW5ndGggPSBhc3luYyAoaGVhZGVycywgYm9keSkgPT4ge1xuICBjb25zdCBsZW5ndGggPSB1dGlscyQxLnRvRmluaXRlTnVtYmVyKGhlYWRlcnMuZ2V0Q29udGVudExlbmd0aCgpKTtcblxuICByZXR1cm4gbGVuZ3RoID09IG51bGwgPyBnZXRCb2R5TGVuZ3RoKGJvZHkpIDogbGVuZ3RoO1xufTtcblxudmFyIGZldGNoQWRhcHRlciA9IGlzRmV0Y2hTdXBwb3J0ZWQgJiYgKGFzeW5jIChjb25maWcpID0+IHtcbiAgbGV0IHtcbiAgICB1cmwsXG4gICAgbWV0aG9kLFxuICAgIGRhdGEsXG4gICAgc2lnbmFsLFxuICAgIGNhbmNlbFRva2VuLFxuICAgIHRpbWVvdXQsXG4gICAgb25Eb3dubG9hZFByb2dyZXNzLFxuICAgIG9uVXBsb2FkUHJvZ3Jlc3MsXG4gICAgcmVzcG9uc2VUeXBlLFxuICAgIGhlYWRlcnMsXG4gICAgd2l0aENyZWRlbnRpYWxzID0gJ3NhbWUtb3JpZ2luJyxcbiAgICBmZXRjaE9wdGlvbnNcbiAgfSA9IHJlc29sdmVDb25maWcoY29uZmlnKTtcblxuICByZXNwb25zZVR5cGUgPSByZXNwb25zZVR5cGUgPyAocmVzcG9uc2VUeXBlICsgJycpLnRvTG93ZXJDYXNlKCkgOiAndGV4dCc7XG5cbiAgbGV0IGNvbXBvc2VkU2lnbmFsID0gY29tcG9zZVNpZ25hbHMkMShbc2lnbmFsLCBjYW5jZWxUb2tlbiAmJiBjYW5jZWxUb2tlbi50b0Fib3J0U2lnbmFsKCldLCB0aW1lb3V0KTtcblxuICBsZXQgcmVxdWVzdDtcblxuICBjb25zdCB1bnN1YnNjcmliZSA9IGNvbXBvc2VkU2lnbmFsICYmIGNvbXBvc2VkU2lnbmFsLnVuc3Vic2NyaWJlICYmICgoKSA9PiB7XG4gICAgICBjb21wb3NlZFNpZ25hbC51bnN1YnNjcmliZSgpO1xuICB9KTtcblxuICBsZXQgcmVxdWVzdENvbnRlbnRMZW5ndGg7XG5cbiAgdHJ5IHtcbiAgICBpZiAoXG4gICAgICBvblVwbG9hZFByb2dyZXNzICYmIHN1cHBvcnRzUmVxdWVzdFN0cmVhbSAmJiBtZXRob2QgIT09ICdnZXQnICYmIG1ldGhvZCAhPT0gJ2hlYWQnICYmXG4gICAgICAocmVxdWVzdENvbnRlbnRMZW5ndGggPSBhd2FpdCByZXNvbHZlQm9keUxlbmd0aChoZWFkZXJzLCBkYXRhKSkgIT09IDBcbiAgICApIHtcbiAgICAgIGxldCBfcmVxdWVzdCA9IG5ldyBSZXF1ZXN0KHVybCwge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgYm9keTogZGF0YSxcbiAgICAgICAgZHVwbGV4OiBcImhhbGZcIlxuICAgICAgfSk7XG5cbiAgICAgIGxldCBjb250ZW50VHlwZUhlYWRlcjtcblxuICAgICAgaWYgKHV0aWxzJDEuaXNGb3JtRGF0YShkYXRhKSAmJiAoY29udGVudFR5cGVIZWFkZXIgPSBfcmVxdWVzdC5oZWFkZXJzLmdldCgnY29udGVudC10eXBlJykpKSB7XG4gICAgICAgIGhlYWRlcnMuc2V0Q29udGVudFR5cGUoY29udGVudFR5cGVIZWFkZXIpO1xuICAgICAgfVxuXG4gICAgICBpZiAoX3JlcXVlc3QuYm9keSkge1xuICAgICAgICBjb25zdCBbb25Qcm9ncmVzcywgZmx1c2hdID0gcHJvZ3Jlc3NFdmVudERlY29yYXRvcihcbiAgICAgICAgICByZXF1ZXN0Q29udGVudExlbmd0aCxcbiAgICAgICAgICBwcm9ncmVzc0V2ZW50UmVkdWNlcihhc3luY0RlY29yYXRvcihvblVwbG9hZFByb2dyZXNzKSlcbiAgICAgICAgKTtcblxuICAgICAgICBkYXRhID0gdHJhY2tTdHJlYW0oX3JlcXVlc3QuYm9keSwgREVGQVVMVF9DSFVOS19TSVpFLCBvblByb2dyZXNzLCBmbHVzaCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCF1dGlscyQxLmlzU3RyaW5nKHdpdGhDcmVkZW50aWFscykpIHtcbiAgICAgIHdpdGhDcmVkZW50aWFscyA9IHdpdGhDcmVkZW50aWFscyA/ICdpbmNsdWRlJyA6ICdvbWl0JztcbiAgICB9XG5cbiAgICAvLyBDbG91ZGZsYXJlIFdvcmtlcnMgdGhyb3dzIHdoZW4gY3JlZGVudGlhbHMgYXJlIGRlZmluZWRcbiAgICAvLyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2Nsb3VkZmxhcmUvd29ya2VyZC9pc3N1ZXMvOTAyXG4gICAgY29uc3QgaXNDcmVkZW50aWFsc1N1cHBvcnRlZCA9IFwiY3JlZGVudGlhbHNcIiBpbiBSZXF1ZXN0LnByb3RvdHlwZTtcbiAgICByZXF1ZXN0ID0gbmV3IFJlcXVlc3QodXJsLCB7XG4gICAgICAuLi5mZXRjaE9wdGlvbnMsXG4gICAgICBzaWduYWw6IGNvbXBvc2VkU2lnbmFsLFxuICAgICAgbWV0aG9kOiBtZXRob2QudG9VcHBlckNhc2UoKSxcbiAgICAgIGhlYWRlcnM6IGhlYWRlcnMubm9ybWFsaXplKCkudG9KU09OKCksXG4gICAgICBib2R5OiBkYXRhLFxuICAgICAgZHVwbGV4OiBcImhhbGZcIixcbiAgICAgIGNyZWRlbnRpYWxzOiBpc0NyZWRlbnRpYWxzU3VwcG9ydGVkID8gd2l0aENyZWRlbnRpYWxzIDogdW5kZWZpbmVkXG4gICAgfSk7XG5cbiAgICBsZXQgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChyZXF1ZXN0KTtcblxuICAgIGNvbnN0IGlzU3RyZWFtUmVzcG9uc2UgPSBzdXBwb3J0c1Jlc3BvbnNlU3RyZWFtICYmIChyZXNwb25zZVR5cGUgPT09ICdzdHJlYW0nIHx8IHJlc3BvbnNlVHlwZSA9PT0gJ3Jlc3BvbnNlJyk7XG5cbiAgICBpZiAoc3VwcG9ydHNSZXNwb25zZVN0cmVhbSAmJiAob25Eb3dubG9hZFByb2dyZXNzIHx8IChpc1N0cmVhbVJlc3BvbnNlICYmIHVuc3Vic2NyaWJlKSkpIHtcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSB7fTtcblxuICAgICAgWydzdGF0dXMnLCAnc3RhdHVzVGV4dCcsICdoZWFkZXJzJ10uZm9yRWFjaChwcm9wID0+IHtcbiAgICAgICAgb3B0aW9uc1twcm9wXSA9IHJlc3BvbnNlW3Byb3BdO1xuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHJlc3BvbnNlQ29udGVudExlbmd0aCA9IHV0aWxzJDEudG9GaW5pdGVOdW1iZXIocmVzcG9uc2UuaGVhZGVycy5nZXQoJ2NvbnRlbnQtbGVuZ3RoJykpO1xuXG4gICAgICBjb25zdCBbb25Qcm9ncmVzcywgZmx1c2hdID0gb25Eb3dubG9hZFByb2dyZXNzICYmIHByb2dyZXNzRXZlbnREZWNvcmF0b3IoXG4gICAgICAgIHJlc3BvbnNlQ29udGVudExlbmd0aCxcbiAgICAgICAgcHJvZ3Jlc3NFdmVudFJlZHVjZXIoYXN5bmNEZWNvcmF0b3Iob25Eb3dubG9hZFByb2dyZXNzKSwgdHJ1ZSlcbiAgICAgICkgfHwgW107XG5cbiAgICAgIHJlc3BvbnNlID0gbmV3IFJlc3BvbnNlKFxuICAgICAgICB0cmFja1N0cmVhbShyZXNwb25zZS5ib2R5LCBERUZBVUxUX0NIVU5LX1NJWkUsIG9uUHJvZ3Jlc3MsICgpID0+IHtcbiAgICAgICAgICBmbHVzaCAmJiBmbHVzaCgpO1xuICAgICAgICAgIHVuc3Vic2NyaWJlICYmIHVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH0pLFxuICAgICAgICBvcHRpb25zXG4gICAgICApO1xuICAgIH1cblxuICAgIHJlc3BvbnNlVHlwZSA9IHJlc3BvbnNlVHlwZSB8fCAndGV4dCc7XG5cbiAgICBsZXQgcmVzcG9uc2VEYXRhID0gYXdhaXQgcmVzb2x2ZXJzW3V0aWxzJDEuZmluZEtleShyZXNvbHZlcnMsIHJlc3BvbnNlVHlwZSkgfHwgJ3RleHQnXShyZXNwb25zZSwgY29uZmlnKTtcblxuICAgICFpc1N0cmVhbVJlc3BvbnNlICYmIHVuc3Vic2NyaWJlICYmIHVuc3Vic2NyaWJlKCk7XG5cbiAgICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgc2V0dGxlKHJlc29sdmUsIHJlamVjdCwge1xuICAgICAgICBkYXRhOiByZXNwb25zZURhdGEsXG4gICAgICAgIGhlYWRlcnM6IEF4aW9zSGVhZGVycyQxLmZyb20ocmVzcG9uc2UuaGVhZGVycyksXG4gICAgICAgIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLFxuICAgICAgICBzdGF0dXNUZXh0OiByZXNwb25zZS5zdGF0dXNUZXh0LFxuICAgICAgICBjb25maWcsXG4gICAgICAgIHJlcXVlc3RcbiAgICAgIH0pO1xuICAgIH0pXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHVuc3Vic2NyaWJlICYmIHVuc3Vic2NyaWJlKCk7XG5cbiAgICBpZiAoZXJyICYmIGVyci5uYW1lID09PSAnVHlwZUVycm9yJyAmJiAvZmV0Y2gvaS50ZXN0KGVyci5tZXNzYWdlKSkge1xuICAgICAgdGhyb3cgT2JqZWN0LmFzc2lnbihcbiAgICAgICAgbmV3IEF4aW9zRXJyb3IoJ05ldHdvcmsgRXJyb3InLCBBeGlvc0Vycm9yLkVSUl9ORVRXT1JLLCBjb25maWcsIHJlcXVlc3QpLFxuICAgICAgICB7XG4gICAgICAgICAgY2F1c2U6IGVyci5jYXVzZSB8fCBlcnJcbiAgICAgICAgfVxuICAgICAgKVxuICAgIH1cblxuICAgIHRocm93IEF4aW9zRXJyb3IuZnJvbShlcnIsIGVyciAmJiBlcnIuY29kZSwgY29uZmlnLCByZXF1ZXN0KTtcbiAgfVxufSk7XG5cbmNvbnN0IGtub3duQWRhcHRlcnMgPSB7XG4gIGh0dHA6IGh0dHBBZGFwdGVyLFxuICB4aHI6IHhockFkYXB0ZXIsXG4gIGZldGNoOiBmZXRjaEFkYXB0ZXJcbn07XG5cbnV0aWxzJDEuZm9yRWFjaChrbm93bkFkYXB0ZXJzLCAoZm4sIHZhbHVlKSA9PiB7XG4gIGlmIChmbikge1xuICAgIHRyeSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZm4sICduYW1lJywge3ZhbHVlfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWVtcHR5XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmbiwgJ2FkYXB0ZXJOYW1lJywge3ZhbHVlfSk7XG4gIH1cbn0pO1xuXG5jb25zdCByZW5kZXJSZWFzb24gPSAocmVhc29uKSA9PiBgLSAke3JlYXNvbn1gO1xuXG5jb25zdCBpc1Jlc29sdmVkSGFuZGxlID0gKGFkYXB0ZXIpID0+IHV0aWxzJDEuaXNGdW5jdGlvbihhZGFwdGVyKSB8fCBhZGFwdGVyID09PSBudWxsIHx8IGFkYXB0ZXIgPT09IGZhbHNlO1xuXG52YXIgYWRhcHRlcnMgPSB7XG4gIGdldEFkYXB0ZXI6IChhZGFwdGVycykgPT4ge1xuICAgIGFkYXB0ZXJzID0gdXRpbHMkMS5pc0FycmF5KGFkYXB0ZXJzKSA/IGFkYXB0ZXJzIDogW2FkYXB0ZXJzXTtcblxuICAgIGNvbnN0IHtsZW5ndGh9ID0gYWRhcHRlcnM7XG4gICAgbGV0IG5hbWVPckFkYXB0ZXI7XG4gICAgbGV0IGFkYXB0ZXI7XG5cbiAgICBjb25zdCByZWplY3RlZFJlYXNvbnMgPSB7fTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIG5hbWVPckFkYXB0ZXIgPSBhZGFwdGVyc1tpXTtcbiAgICAgIGxldCBpZDtcblxuICAgICAgYWRhcHRlciA9IG5hbWVPckFkYXB0ZXI7XG5cbiAgICAgIGlmICghaXNSZXNvbHZlZEhhbmRsZShuYW1lT3JBZGFwdGVyKSkge1xuICAgICAgICBhZGFwdGVyID0ga25vd25BZGFwdGVyc1soaWQgPSBTdHJpbmcobmFtZU9yQWRhcHRlcikpLnRvTG93ZXJDYXNlKCldO1xuXG4gICAgICAgIGlmIChhZGFwdGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgQXhpb3NFcnJvcihgVW5rbm93biBhZGFwdGVyICcke2lkfSdgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoYWRhcHRlcikge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgcmVqZWN0ZWRSZWFzb25zW2lkIHx8ICcjJyArIGldID0gYWRhcHRlcjtcbiAgICB9XG5cbiAgICBpZiAoIWFkYXB0ZXIpIHtcblxuICAgICAgY29uc3QgcmVhc29ucyA9IE9iamVjdC5lbnRyaWVzKHJlamVjdGVkUmVhc29ucylcbiAgICAgICAgLm1hcCgoW2lkLCBzdGF0ZV0pID0+IGBhZGFwdGVyICR7aWR9IGAgK1xuICAgICAgICAgIChzdGF0ZSA9PT0gZmFsc2UgPyAnaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgZW52aXJvbm1lbnQnIDogJ2lzIG5vdCBhdmFpbGFibGUgaW4gdGhlIGJ1aWxkJylcbiAgICAgICAgKTtcblxuICAgICAgbGV0IHMgPSBsZW5ndGggP1xuICAgICAgICAocmVhc29ucy5sZW5ndGggPiAxID8gJ3NpbmNlIDpcXG4nICsgcmVhc29ucy5tYXAocmVuZGVyUmVhc29uKS5qb2luKCdcXG4nKSA6ICcgJyArIHJlbmRlclJlYXNvbihyZWFzb25zWzBdKSkgOlxuICAgICAgICAnYXMgbm8gYWRhcHRlciBzcGVjaWZpZWQnO1xuXG4gICAgICB0aHJvdyBuZXcgQXhpb3NFcnJvcihcbiAgICAgICAgYFRoZXJlIGlzIG5vIHN1aXRhYmxlIGFkYXB0ZXIgdG8gZGlzcGF0Y2ggdGhlIHJlcXVlc3QgYCArIHMsXG4gICAgICAgICdFUlJfTk9UX1NVUFBPUlQnXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBhZGFwdGVyO1xuICB9LFxuICBhZGFwdGVyczoga25vd25BZGFwdGVyc1xufTtcblxuLyoqXG4gKiBUaHJvd3MgYSBgQ2FuY2VsZWRFcnJvcmAgaWYgY2FuY2VsbGF0aW9uIGhhcyBiZWVuIHJlcXVlc3RlZC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gY29uZmlnIFRoZSBjb25maWcgdGhhdCBpcyB0byBiZSB1c2VkIGZvciB0aGUgcmVxdWVzdFxuICpcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiB0aHJvd0lmQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKGNvbmZpZykge1xuICBpZiAoY29uZmlnLmNhbmNlbFRva2VuKSB7XG4gICAgY29uZmlnLmNhbmNlbFRva2VuLnRocm93SWZSZXF1ZXN0ZWQoKTtcbiAgfVxuXG4gIGlmIChjb25maWcuc2lnbmFsICYmIGNvbmZpZy5zaWduYWwuYWJvcnRlZCkge1xuICAgIHRocm93IG5ldyBDYW5jZWxlZEVycm9yKG51bGwsIGNvbmZpZyk7XG4gIH1cbn1cblxuLyoqXG4gKiBEaXNwYXRjaCBhIHJlcXVlc3QgdG8gdGhlIHNlcnZlciB1c2luZyB0aGUgY29uZmlndXJlZCBhZGFwdGVyLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBjb25maWcgVGhlIGNvbmZpZyB0aGF0IGlzIHRvIGJlIHVzZWQgZm9yIHRoZSByZXF1ZXN0XG4gKlxuICogQHJldHVybnMge1Byb21pc2V9IFRoZSBQcm9taXNlIHRvIGJlIGZ1bGZpbGxlZFxuICovXG5mdW5jdGlvbiBkaXNwYXRjaFJlcXVlc3QoY29uZmlnKSB7XG4gIHRocm93SWZDYW5jZWxsYXRpb25SZXF1ZXN0ZWQoY29uZmlnKTtcblxuICBjb25maWcuaGVhZGVycyA9IEF4aW9zSGVhZGVycyQxLmZyb20oY29uZmlnLmhlYWRlcnMpO1xuXG4gIC8vIFRyYW5zZm9ybSByZXF1ZXN0IGRhdGFcbiAgY29uZmlnLmRhdGEgPSB0cmFuc2Zvcm1EYXRhLmNhbGwoXG4gICAgY29uZmlnLFxuICAgIGNvbmZpZy50cmFuc2Zvcm1SZXF1ZXN0XG4gICk7XG5cbiAgaWYgKFsncG9zdCcsICdwdXQnLCAncGF0Y2gnXS5pbmRleE9mKGNvbmZpZy5tZXRob2QpICE9PSAtMSkge1xuICAgIGNvbmZpZy5oZWFkZXJzLnNldENvbnRlbnRUeXBlKCdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnLCBmYWxzZSk7XG4gIH1cblxuICBjb25zdCBhZGFwdGVyID0gYWRhcHRlcnMuZ2V0QWRhcHRlcihjb25maWcuYWRhcHRlciB8fCBkZWZhdWx0cyQxLmFkYXB0ZXIpO1xuXG4gIHJldHVybiBhZGFwdGVyKGNvbmZpZykudGhlbihmdW5jdGlvbiBvbkFkYXB0ZXJSZXNvbHV0aW9uKHJlc3BvbnNlKSB7XG4gICAgdGhyb3dJZkNhbmNlbGxhdGlvblJlcXVlc3RlZChjb25maWcpO1xuXG4gICAgLy8gVHJhbnNmb3JtIHJlc3BvbnNlIGRhdGFcbiAgICByZXNwb25zZS5kYXRhID0gdHJhbnNmb3JtRGF0YS5jYWxsKFxuICAgICAgY29uZmlnLFxuICAgICAgY29uZmlnLnRyYW5zZm9ybVJlc3BvbnNlLFxuICAgICAgcmVzcG9uc2VcbiAgICApO1xuXG4gICAgcmVzcG9uc2UuaGVhZGVycyA9IEF4aW9zSGVhZGVycyQxLmZyb20ocmVzcG9uc2UuaGVhZGVycyk7XG5cbiAgICByZXR1cm4gcmVzcG9uc2U7XG4gIH0sIGZ1bmN0aW9uIG9uQWRhcHRlclJlamVjdGlvbihyZWFzb24pIHtcbiAgICBpZiAoIWlzQ2FuY2VsKHJlYXNvbikpIHtcbiAgICAgIHRocm93SWZDYW5jZWxsYXRpb25SZXF1ZXN0ZWQoY29uZmlnKTtcblxuICAgICAgLy8gVHJhbnNmb3JtIHJlc3BvbnNlIGRhdGFcbiAgICAgIGlmIChyZWFzb24gJiYgcmVhc29uLnJlc3BvbnNlKSB7XG4gICAgICAgIHJlYXNvbi5yZXNwb25zZS5kYXRhID0gdHJhbnNmb3JtRGF0YS5jYWxsKFxuICAgICAgICAgIGNvbmZpZyxcbiAgICAgICAgICBjb25maWcudHJhbnNmb3JtUmVzcG9uc2UsXG4gICAgICAgICAgcmVhc29uLnJlc3BvbnNlXG4gICAgICAgICk7XG4gICAgICAgIHJlYXNvbi5yZXNwb25zZS5oZWFkZXJzID0gQXhpb3NIZWFkZXJzJDEuZnJvbShyZWFzb24ucmVzcG9uc2UuaGVhZGVycyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIFByb21pc2UucmVqZWN0KHJlYXNvbik7XG4gIH0pO1xufVxuXG5jb25zdCBWRVJTSU9OID0gXCIxLjguNFwiO1xuXG5jb25zdCB2YWxpZGF0b3JzJDEgPSB7fTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGZ1bmMtbmFtZXNcblsnb2JqZWN0JywgJ2Jvb2xlYW4nLCAnbnVtYmVyJywgJ2Z1bmN0aW9uJywgJ3N0cmluZycsICdzeW1ib2wnXS5mb3JFYWNoKCh0eXBlLCBpKSA9PiB7XG4gIHZhbGlkYXRvcnMkMVt0eXBlXSA9IGZ1bmN0aW9uIHZhbGlkYXRvcih0aGluZykge1xuICAgIHJldHVybiB0eXBlb2YgdGhpbmcgPT09IHR5cGUgfHwgJ2EnICsgKGkgPCAxID8gJ24gJyA6ICcgJykgKyB0eXBlO1xuICB9O1xufSk7XG5cbmNvbnN0IGRlcHJlY2F0ZWRXYXJuaW5ncyA9IHt9O1xuXG4vKipcbiAqIFRyYW5zaXRpb25hbCBvcHRpb24gdmFsaWRhdG9yXG4gKlxuICogQHBhcmFtIHtmdW5jdGlvbnxib29sZWFuP30gdmFsaWRhdG9yIC0gc2V0IHRvIGZhbHNlIGlmIHRoZSB0cmFuc2l0aW9uYWwgb3B0aW9uIGhhcyBiZWVuIHJlbW92ZWRcbiAqIEBwYXJhbSB7c3RyaW5nP30gdmVyc2lvbiAtIGRlcHJlY2F0ZWQgdmVyc2lvbiAvIHJlbW92ZWQgc2luY2UgdmVyc2lvblxuICogQHBhcmFtIHtzdHJpbmc/fSBtZXNzYWdlIC0gc29tZSBtZXNzYWdlIHdpdGggYWRkaXRpb25hbCBpbmZvXG4gKlxuICogQHJldHVybnMge2Z1bmN0aW9ufVxuICovXG52YWxpZGF0b3JzJDEudHJhbnNpdGlvbmFsID0gZnVuY3Rpb24gdHJhbnNpdGlvbmFsKHZhbGlkYXRvciwgdmVyc2lvbiwgbWVzc2FnZSkge1xuICBmdW5jdGlvbiBmb3JtYXRNZXNzYWdlKG9wdCwgZGVzYykge1xuICAgIHJldHVybiAnW0F4aW9zIHYnICsgVkVSU0lPTiArICddIFRyYW5zaXRpb25hbCBvcHRpb24gXFwnJyArIG9wdCArICdcXCcnICsgZGVzYyArIChtZXNzYWdlID8gJy4gJyArIG1lc3NhZ2UgOiAnJyk7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZnVuYy1uYW1lc1xuICByZXR1cm4gKHZhbHVlLCBvcHQsIG9wdHMpID0+IHtcbiAgICBpZiAodmFsaWRhdG9yID09PSBmYWxzZSkge1xuICAgICAgdGhyb3cgbmV3IEF4aW9zRXJyb3IoXG4gICAgICAgIGZvcm1hdE1lc3NhZ2Uob3B0LCAnIGhhcyBiZWVuIHJlbW92ZWQnICsgKHZlcnNpb24gPyAnIGluICcgKyB2ZXJzaW9uIDogJycpKSxcbiAgICAgICAgQXhpb3NFcnJvci5FUlJfREVQUkVDQVRFRFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAodmVyc2lvbiAmJiAhZGVwcmVjYXRlZFdhcm5pbmdzW29wdF0pIHtcbiAgICAgIGRlcHJlY2F0ZWRXYXJuaW5nc1tvcHRdID0gdHJ1ZTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGZvcm1hdE1lc3NhZ2UoXG4gICAgICAgICAgb3B0LFxuICAgICAgICAgICcgaGFzIGJlZW4gZGVwcmVjYXRlZCBzaW5jZSB2JyArIHZlcnNpb24gKyAnIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5lYXIgZnV0dXJlJ1xuICAgICAgICApXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiB2YWxpZGF0b3IgPyB2YWxpZGF0b3IodmFsdWUsIG9wdCwgb3B0cykgOiB0cnVlO1xuICB9O1xufTtcblxudmFsaWRhdG9ycyQxLnNwZWxsaW5nID0gZnVuY3Rpb24gc3BlbGxpbmcoY29ycmVjdFNwZWxsaW5nKSB7XG4gIHJldHVybiAodmFsdWUsIG9wdCkgPT4ge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgY29uc29sZS53YXJuKGAke29wdH0gaXMgbGlrZWx5IGEgbWlzc3BlbGxpbmcgb2YgJHtjb3JyZWN0U3BlbGxpbmd9YCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn07XG5cbi8qKlxuICogQXNzZXJ0IG9iamVjdCdzIHByb3BlcnRpZXMgdHlwZVxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gKiBAcGFyYW0ge29iamVjdH0gc2NoZW1hXG4gKiBAcGFyYW0ge2Jvb2xlYW4/fSBhbGxvd1Vua25vd25cbiAqXG4gKiBAcmV0dXJucyB7b2JqZWN0fVxuICovXG5cbmZ1bmN0aW9uIGFzc2VydE9wdGlvbnMob3B0aW9ucywgc2NoZW1hLCBhbGxvd1Vua25vd24pIHtcbiAgaWYgKHR5cGVvZiBvcHRpb25zICE9PSAnb2JqZWN0Jykge1xuICAgIHRocm93IG5ldyBBeGlvc0Vycm9yKCdvcHRpb25zIG11c3QgYmUgYW4gb2JqZWN0JywgQXhpb3NFcnJvci5FUlJfQkFEX09QVElPTl9WQUxVRSk7XG4gIH1cbiAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKG9wdGlvbnMpO1xuICBsZXQgaSA9IGtleXMubGVuZ3RoO1xuICB3aGlsZSAoaS0tID4gMCkge1xuICAgIGNvbnN0IG9wdCA9IGtleXNbaV07XG4gICAgY29uc3QgdmFsaWRhdG9yID0gc2NoZW1hW29wdF07XG4gICAgaWYgKHZhbGlkYXRvcikge1xuICAgICAgY29uc3QgdmFsdWUgPSBvcHRpb25zW29wdF07XG4gICAgICBjb25zdCByZXN1bHQgPSB2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbGlkYXRvcih2YWx1ZSwgb3B0LCBvcHRpb25zKTtcbiAgICAgIGlmIChyZXN1bHQgIT09IHRydWUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEF4aW9zRXJyb3IoJ29wdGlvbiAnICsgb3B0ICsgJyBtdXN0IGJlICcgKyByZXN1bHQsIEF4aW9zRXJyb3IuRVJSX0JBRF9PUFRJT05fVkFMVUUpO1xuICAgICAgfVxuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChhbGxvd1Vua25vd24gIT09IHRydWUpIHtcbiAgICAgIHRocm93IG5ldyBBeGlvc0Vycm9yKCdVbmtub3duIG9wdGlvbiAnICsgb3B0LCBBeGlvc0Vycm9yLkVSUl9CQURfT1BUSU9OKTtcbiAgICB9XG4gIH1cbn1cblxudmFyIHZhbGlkYXRvciA9IHtcbiAgYXNzZXJ0T3B0aW9ucyxcbiAgdmFsaWRhdG9yczogdmFsaWRhdG9ycyQxXG59O1xuXG5jb25zdCB2YWxpZGF0b3JzID0gdmFsaWRhdG9yLnZhbGlkYXRvcnM7XG5cbi8qKlxuICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIEF4aW9zXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGluc3RhbmNlQ29uZmlnIFRoZSBkZWZhdWx0IGNvbmZpZyBmb3IgdGhlIGluc3RhbmNlXG4gKlxuICogQHJldHVybiB7QXhpb3N9IEEgbmV3IGluc3RhbmNlIG9mIEF4aW9zXG4gKi9cbmNsYXNzIEF4aW9zIHtcbiAgY29uc3RydWN0b3IoaW5zdGFuY2VDb25maWcpIHtcbiAgICB0aGlzLmRlZmF1bHRzID0gaW5zdGFuY2VDb25maWc7XG4gICAgdGhpcy5pbnRlcmNlcHRvcnMgPSB7XG4gICAgICByZXF1ZXN0OiBuZXcgSW50ZXJjZXB0b3JNYW5hZ2VyJDEoKSxcbiAgICAgIHJlc3BvbnNlOiBuZXcgSW50ZXJjZXB0b3JNYW5hZ2VyJDEoKVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogRGlzcGF0Y2ggYSByZXF1ZXN0XG4gICAqXG4gICAqIEBwYXJhbSB7U3RyaW5nfE9iamVjdH0gY29uZmlnT3JVcmwgVGhlIGNvbmZpZyBzcGVjaWZpYyBmb3IgdGhpcyByZXF1ZXN0IChtZXJnZWQgd2l0aCB0aGlzLmRlZmF1bHRzKVxuICAgKiBAcGFyYW0gez9PYmplY3R9IGNvbmZpZ1xuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gVGhlIFByb21pc2UgdG8gYmUgZnVsZmlsbGVkXG4gICAqL1xuICBhc3luYyByZXF1ZXN0KGNvbmZpZ09yVXJsLCBjb25maWcpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX3JlcXVlc3QoY29uZmlnT3JVcmwsIGNvbmZpZyk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBpZiAoZXJyIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgbGV0IGR1bW15ID0ge307XG5cbiAgICAgICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UgPyBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZShkdW1teSkgOiAoZHVtbXkgPSBuZXcgRXJyb3IoKSk7XG5cbiAgICAgICAgLy8gc2xpY2Ugb2ZmIHRoZSBFcnJvcjogLi4uIGxpbmVcbiAgICAgICAgY29uc3Qgc3RhY2sgPSBkdW1teS5zdGFjayA/IGR1bW15LnN0YWNrLnJlcGxhY2UoL14uK1xcbi8sICcnKSA6ICcnO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmICghZXJyLnN0YWNrKSB7XG4gICAgICAgICAgICBlcnIuc3RhY2sgPSBzdGFjaztcbiAgICAgICAgICAgIC8vIG1hdGNoIHdpdGhvdXQgdGhlIDIgdG9wIHN0YWNrIGxpbmVzXG4gICAgICAgICAgfSBlbHNlIGlmIChzdGFjayAmJiAhU3RyaW5nKGVyci5zdGFjaykuZW5kc1dpdGgoc3RhY2sucmVwbGFjZSgvXi4rXFxuLitcXG4vLCAnJykpKSB7XG4gICAgICAgICAgICBlcnIuc3RhY2sgKz0gJ1xcbicgKyBzdGFjaztcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAvLyBpZ25vcmUgdGhlIGNhc2Ugd2hlcmUgXCJzdGFja1wiIGlzIGFuIHVuLXdyaXRhYmxlIHByb3BlcnR5XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgfVxuXG4gIF9yZXF1ZXN0KGNvbmZpZ09yVXJsLCBjb25maWcpIHtcbiAgICAvKmVzbGludCBuby1wYXJhbS1yZWFzc2lnbjowKi9cbiAgICAvLyBBbGxvdyBmb3IgYXhpb3MoJ2V4YW1wbGUvdXJsJ1ssIGNvbmZpZ10pIGEgbGEgZmV0Y2ggQVBJXG4gICAgaWYgKHR5cGVvZiBjb25maWdPclVybCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGNvbmZpZyA9IGNvbmZpZyB8fCB7fTtcbiAgICAgIGNvbmZpZy51cmwgPSBjb25maWdPclVybDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uZmlnID0gY29uZmlnT3JVcmwgfHwge307XG4gICAgfVxuXG4gICAgY29uZmlnID0gbWVyZ2VDb25maWcodGhpcy5kZWZhdWx0cywgY29uZmlnKTtcblxuICAgIGNvbnN0IHt0cmFuc2l0aW9uYWwsIHBhcmFtc1NlcmlhbGl6ZXIsIGhlYWRlcnN9ID0gY29uZmlnO1xuXG4gICAgaWYgKHRyYW5zaXRpb25hbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB2YWxpZGF0b3IuYXNzZXJ0T3B0aW9ucyh0cmFuc2l0aW9uYWwsIHtcbiAgICAgICAgc2lsZW50SlNPTlBhcnNpbmc6IHZhbGlkYXRvcnMudHJhbnNpdGlvbmFsKHZhbGlkYXRvcnMuYm9vbGVhbiksXG4gICAgICAgIGZvcmNlZEpTT05QYXJzaW5nOiB2YWxpZGF0b3JzLnRyYW5zaXRpb25hbCh2YWxpZGF0b3JzLmJvb2xlYW4pLFxuICAgICAgICBjbGFyaWZ5VGltZW91dEVycm9yOiB2YWxpZGF0b3JzLnRyYW5zaXRpb25hbCh2YWxpZGF0b3JzLmJvb2xlYW4pXG4gICAgICB9LCBmYWxzZSk7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtc1NlcmlhbGl6ZXIgIT0gbnVsbCkge1xuICAgICAgaWYgKHV0aWxzJDEuaXNGdW5jdGlvbihwYXJhbXNTZXJpYWxpemVyKSkge1xuICAgICAgICBjb25maWcucGFyYW1zU2VyaWFsaXplciA9IHtcbiAgICAgICAgICBzZXJpYWxpemU6IHBhcmFtc1NlcmlhbGl6ZXJcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbGlkYXRvci5hc3NlcnRPcHRpb25zKHBhcmFtc1NlcmlhbGl6ZXIsIHtcbiAgICAgICAgICBlbmNvZGU6IHZhbGlkYXRvcnMuZnVuY3Rpb24sXG4gICAgICAgICAgc2VyaWFsaXplOiB2YWxpZGF0b3JzLmZ1bmN0aW9uXG4gICAgICAgIH0sIHRydWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFNldCBjb25maWcuYWxsb3dBYnNvbHV0ZVVybHNcbiAgICBpZiAoY29uZmlnLmFsbG93QWJzb2x1dGVVcmxzICE9PSB1bmRlZmluZWQpIDsgZWxzZSBpZiAodGhpcy5kZWZhdWx0cy5hbGxvd0Fic29sdXRlVXJscyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25maWcuYWxsb3dBYnNvbHV0ZVVybHMgPSB0aGlzLmRlZmF1bHRzLmFsbG93QWJzb2x1dGVVcmxzO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25maWcuYWxsb3dBYnNvbHV0ZVVybHMgPSB0cnVlO1xuICAgIH1cblxuICAgIHZhbGlkYXRvci5hc3NlcnRPcHRpb25zKGNvbmZpZywge1xuICAgICAgYmFzZVVybDogdmFsaWRhdG9ycy5zcGVsbGluZygnYmFzZVVSTCcpLFxuICAgICAgd2l0aFhzcmZUb2tlbjogdmFsaWRhdG9ycy5zcGVsbGluZygnd2l0aFhTUkZUb2tlbicpXG4gICAgfSwgdHJ1ZSk7XG5cbiAgICAvLyBTZXQgY29uZmlnLm1ldGhvZFxuICAgIGNvbmZpZy5tZXRob2QgPSAoY29uZmlnLm1ldGhvZCB8fCB0aGlzLmRlZmF1bHRzLm1ldGhvZCB8fCAnZ2V0JykudG9Mb3dlckNhc2UoKTtcblxuICAgIC8vIEZsYXR0ZW4gaGVhZGVyc1xuICAgIGxldCBjb250ZXh0SGVhZGVycyA9IGhlYWRlcnMgJiYgdXRpbHMkMS5tZXJnZShcbiAgICAgIGhlYWRlcnMuY29tbW9uLFxuICAgICAgaGVhZGVyc1tjb25maWcubWV0aG9kXVxuICAgICk7XG5cbiAgICBoZWFkZXJzICYmIHV0aWxzJDEuZm9yRWFjaChcbiAgICAgIFsnZGVsZXRlJywgJ2dldCcsICdoZWFkJywgJ3Bvc3QnLCAncHV0JywgJ3BhdGNoJywgJ2NvbW1vbiddLFxuICAgICAgKG1ldGhvZCkgPT4ge1xuICAgICAgICBkZWxldGUgaGVhZGVyc1ttZXRob2RdO1xuICAgICAgfVxuICAgICk7XG5cbiAgICBjb25maWcuaGVhZGVycyA9IEF4aW9zSGVhZGVycyQxLmNvbmNhdChjb250ZXh0SGVhZGVycywgaGVhZGVycyk7XG5cbiAgICAvLyBmaWx0ZXIgb3V0IHNraXBwZWQgaW50ZXJjZXB0b3JzXG4gICAgY29uc3QgcmVxdWVzdEludGVyY2VwdG9yQ2hhaW4gPSBbXTtcbiAgICBsZXQgc3luY2hyb25vdXNSZXF1ZXN0SW50ZXJjZXB0b3JzID0gdHJ1ZTtcbiAgICB0aGlzLmludGVyY2VwdG9ycy5yZXF1ZXN0LmZvckVhY2goZnVuY3Rpb24gdW5zaGlmdFJlcXVlc3RJbnRlcmNlcHRvcnMoaW50ZXJjZXB0b3IpIHtcbiAgICAgIGlmICh0eXBlb2YgaW50ZXJjZXB0b3IucnVuV2hlbiA9PT0gJ2Z1bmN0aW9uJyAmJiBpbnRlcmNlcHRvci5ydW5XaGVuKGNvbmZpZykgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgc3luY2hyb25vdXNSZXF1ZXN0SW50ZXJjZXB0b3JzID0gc3luY2hyb25vdXNSZXF1ZXN0SW50ZXJjZXB0b3JzICYmIGludGVyY2VwdG9yLnN5bmNocm9ub3VzO1xuXG4gICAgICByZXF1ZXN0SW50ZXJjZXB0b3JDaGFpbi51bnNoaWZ0KGludGVyY2VwdG9yLmZ1bGZpbGxlZCwgaW50ZXJjZXB0b3IucmVqZWN0ZWQpO1xuICAgIH0pO1xuXG4gICAgY29uc3QgcmVzcG9uc2VJbnRlcmNlcHRvckNoYWluID0gW107XG4gICAgdGhpcy5pbnRlcmNlcHRvcnMucmVzcG9uc2UuZm9yRWFjaChmdW5jdGlvbiBwdXNoUmVzcG9uc2VJbnRlcmNlcHRvcnMoaW50ZXJjZXB0b3IpIHtcbiAgICAgIHJlc3BvbnNlSW50ZXJjZXB0b3JDaGFpbi5wdXNoKGludGVyY2VwdG9yLmZ1bGZpbGxlZCwgaW50ZXJjZXB0b3IucmVqZWN0ZWQpO1xuICAgIH0pO1xuXG4gICAgbGV0IHByb21pc2U7XG4gICAgbGV0IGkgPSAwO1xuICAgIGxldCBsZW47XG5cbiAgICBpZiAoIXN5bmNocm9ub3VzUmVxdWVzdEludGVyY2VwdG9ycykge1xuICAgICAgY29uc3QgY2hhaW4gPSBbZGlzcGF0Y2hSZXF1ZXN0LmJpbmQodGhpcyksIHVuZGVmaW5lZF07XG4gICAgICBjaGFpbi51bnNoaWZ0LmFwcGx5KGNoYWluLCByZXF1ZXN0SW50ZXJjZXB0b3JDaGFpbik7XG4gICAgICBjaGFpbi5wdXNoLmFwcGx5KGNoYWluLCByZXNwb25zZUludGVyY2VwdG9yQ2hhaW4pO1xuICAgICAgbGVuID0gY2hhaW4ubGVuZ3RoO1xuXG4gICAgICBwcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKGNvbmZpZyk7XG5cbiAgICAgIHdoaWxlIChpIDwgbGVuKSB7XG4gICAgICAgIHByb21pc2UgPSBwcm9taXNlLnRoZW4oY2hhaW5baSsrXSwgY2hhaW5baSsrXSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwcm9taXNlO1xuICAgIH1cblxuICAgIGxlbiA9IHJlcXVlc3RJbnRlcmNlcHRvckNoYWluLmxlbmd0aDtcblxuICAgIGxldCBuZXdDb25maWcgPSBjb25maWc7XG5cbiAgICBpID0gMDtcblxuICAgIHdoaWxlIChpIDwgbGVuKSB7XG4gICAgICBjb25zdCBvbkZ1bGZpbGxlZCA9IHJlcXVlc3RJbnRlcmNlcHRvckNoYWluW2krK107XG4gICAgICBjb25zdCBvblJlamVjdGVkID0gcmVxdWVzdEludGVyY2VwdG9yQ2hhaW5baSsrXTtcbiAgICAgIHRyeSB7XG4gICAgICAgIG5ld0NvbmZpZyA9IG9uRnVsZmlsbGVkKG5ld0NvbmZpZyk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBvblJlamVjdGVkLmNhbGwodGhpcywgZXJyb3IpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgcHJvbWlzZSA9IGRpc3BhdGNoUmVxdWVzdC5jYWxsKHRoaXMsIG5ld0NvbmZpZyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnJvcik7XG4gICAgfVxuXG4gICAgaSA9IDA7XG4gICAgbGVuID0gcmVzcG9uc2VJbnRlcmNlcHRvckNoYWluLmxlbmd0aDtcblxuICAgIHdoaWxlIChpIDwgbGVuKSB7XG4gICAgICBwcm9taXNlID0gcHJvbWlzZS50aGVuKHJlc3BvbnNlSW50ZXJjZXB0b3JDaGFpbltpKytdLCByZXNwb25zZUludGVyY2VwdG9yQ2hhaW5baSsrXSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHByb21pc2U7XG4gIH1cblxuICBnZXRVcmkoY29uZmlnKSB7XG4gICAgY29uZmlnID0gbWVyZ2VDb25maWcodGhpcy5kZWZhdWx0cywgY29uZmlnKTtcbiAgICBjb25zdCBmdWxsUGF0aCA9IGJ1aWxkRnVsbFBhdGgoY29uZmlnLmJhc2VVUkwsIGNvbmZpZy51cmwsIGNvbmZpZy5hbGxvd0Fic29sdXRlVXJscyk7XG4gICAgcmV0dXJuIGJ1aWxkVVJMKGZ1bGxQYXRoLCBjb25maWcucGFyYW1zLCBjb25maWcucGFyYW1zU2VyaWFsaXplcik7XG4gIH1cbn1cblxuLy8gUHJvdmlkZSBhbGlhc2VzIGZvciBzdXBwb3J0ZWQgcmVxdWVzdCBtZXRob2RzXG51dGlscyQxLmZvckVhY2goWydkZWxldGUnLCAnZ2V0JywgJ2hlYWQnLCAnb3B0aW9ucyddLCBmdW5jdGlvbiBmb3JFYWNoTWV0aG9kTm9EYXRhKG1ldGhvZCkge1xuICAvKmVzbGludCBmdW5jLW5hbWVzOjAqL1xuICBBeGlvcy5wcm90b3R5cGVbbWV0aG9kXSA9IGZ1bmN0aW9uKHVybCwgY29uZmlnKSB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdChtZXJnZUNvbmZpZyhjb25maWcgfHwge30sIHtcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybCxcbiAgICAgIGRhdGE6IChjb25maWcgfHwge30pLmRhdGFcbiAgICB9KSk7XG4gIH07XG59KTtcblxudXRpbHMkMS5mb3JFYWNoKFsncG9zdCcsICdwdXQnLCAncGF0Y2gnXSwgZnVuY3Rpb24gZm9yRWFjaE1ldGhvZFdpdGhEYXRhKG1ldGhvZCkge1xuICAvKmVzbGludCBmdW5jLW5hbWVzOjAqL1xuXG4gIGZ1bmN0aW9uIGdlbmVyYXRlSFRUUE1ldGhvZChpc0Zvcm0pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gaHR0cE1ldGhvZCh1cmwsIGRhdGEsIGNvbmZpZykge1xuICAgICAgcmV0dXJuIHRoaXMucmVxdWVzdChtZXJnZUNvbmZpZyhjb25maWcgfHwge30sIHtcbiAgICAgICAgbWV0aG9kLFxuICAgICAgICBoZWFkZXJzOiBpc0Zvcm0gPyB7XG4gICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdtdWx0aXBhcnQvZm9ybS1kYXRhJ1xuICAgICAgICB9IDoge30sXG4gICAgICAgIHVybCxcbiAgICAgICAgZGF0YVxuICAgICAgfSkpO1xuICAgIH07XG4gIH1cblxuICBBeGlvcy5wcm90b3R5cGVbbWV0aG9kXSA9IGdlbmVyYXRlSFRUUE1ldGhvZCgpO1xuXG4gIEF4aW9zLnByb3RvdHlwZVttZXRob2QgKyAnRm9ybSddID0gZ2VuZXJhdGVIVFRQTWV0aG9kKHRydWUpO1xufSk7XG5cbnZhciBBeGlvcyQxID0gQXhpb3M7XG5cbi8qKlxuICogQSBgQ2FuY2VsVG9rZW5gIGlzIGFuIG9iamVjdCB0aGF0IGNhbiBiZSB1c2VkIHRvIHJlcXVlc3QgY2FuY2VsbGF0aW9uIG9mIGFuIG9wZXJhdGlvbi5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBleGVjdXRvciBUaGUgZXhlY3V0b3IgZnVuY3Rpb24uXG4gKlxuICogQHJldHVybnMge0NhbmNlbFRva2VufVxuICovXG5jbGFzcyBDYW5jZWxUb2tlbiB7XG4gIGNvbnN0cnVjdG9yKGV4ZWN1dG9yKSB7XG4gICAgaWYgKHR5cGVvZiBleGVjdXRvciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZXhlY3V0b3IgbXVzdCBiZSBhIGZ1bmN0aW9uLicpO1xuICAgIH1cblxuICAgIGxldCByZXNvbHZlUHJvbWlzZTtcblxuICAgIHRoaXMucHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIHByb21pc2VFeGVjdXRvcihyZXNvbHZlKSB7XG4gICAgICByZXNvbHZlUHJvbWlzZSA9IHJlc29sdmU7XG4gICAgfSk7XG5cbiAgICBjb25zdCB0b2tlbiA9IHRoaXM7XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZnVuYy1uYW1lc1xuICAgIHRoaXMucHJvbWlzZS50aGVuKGNhbmNlbCA9PiB7XG4gICAgICBpZiAoIXRva2VuLl9saXN0ZW5lcnMpIHJldHVybjtcblxuICAgICAgbGV0IGkgPSB0b2tlbi5fbGlzdGVuZXJzLmxlbmd0aDtcblxuICAgICAgd2hpbGUgKGktLSA+IDApIHtcbiAgICAgICAgdG9rZW4uX2xpc3RlbmVyc1tpXShjYW5jZWwpO1xuICAgICAgfVxuICAgICAgdG9rZW4uX2xpc3RlbmVycyA9IG51bGw7XG4gICAgfSk7XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZnVuYy1uYW1lc1xuICAgIHRoaXMucHJvbWlzZS50aGVuID0gb25mdWxmaWxsZWQgPT4ge1xuICAgICAgbGV0IF9yZXNvbHZlO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGZ1bmMtbmFtZXNcbiAgICAgIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgdG9rZW4uc3Vic2NyaWJlKHJlc29sdmUpO1xuICAgICAgICBfcmVzb2x2ZSA9IHJlc29sdmU7XG4gICAgICB9KS50aGVuKG9uZnVsZmlsbGVkKTtcblxuICAgICAgcHJvbWlzZS5jYW5jZWwgPSBmdW5jdGlvbiByZWplY3QoKSB7XG4gICAgICAgIHRva2VuLnVuc3Vic2NyaWJlKF9yZXNvbHZlKTtcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBwcm9taXNlO1xuICAgIH07XG5cbiAgICBleGVjdXRvcihmdW5jdGlvbiBjYW5jZWwobWVzc2FnZSwgY29uZmlnLCByZXF1ZXN0KSB7XG4gICAgICBpZiAodG9rZW4ucmVhc29uKSB7XG4gICAgICAgIC8vIENhbmNlbGxhdGlvbiBoYXMgYWxyZWFkeSBiZWVuIHJlcXVlc3RlZFxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRva2VuLnJlYXNvbiA9IG5ldyBDYW5jZWxlZEVycm9yKG1lc3NhZ2UsIGNvbmZpZywgcmVxdWVzdCk7XG4gICAgICByZXNvbHZlUHJvbWlzZSh0b2tlbi5yZWFzb24pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRocm93cyBhIGBDYW5jZWxlZEVycm9yYCBpZiBjYW5jZWxsYXRpb24gaGFzIGJlZW4gcmVxdWVzdGVkLlxuICAgKi9cbiAgdGhyb3dJZlJlcXVlc3RlZCgpIHtcbiAgICBpZiAodGhpcy5yZWFzb24pIHtcbiAgICAgIHRocm93IHRoaXMucmVhc29uO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJzY3JpYmUgdG8gdGhlIGNhbmNlbCBzaWduYWxcbiAgICovXG5cbiAgc3Vic2NyaWJlKGxpc3RlbmVyKSB7XG4gICAgaWYgKHRoaXMucmVhc29uKSB7XG4gICAgICBsaXN0ZW5lcih0aGlzLnJlYXNvbik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2xpc3RlbmVycykge1xuICAgICAgdGhpcy5fbGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9saXN0ZW5lcnMgPSBbbGlzdGVuZXJdO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVbnN1YnNjcmliZSBmcm9tIHRoZSBjYW5jZWwgc2lnbmFsXG4gICAqL1xuXG4gIHVuc3Vic2NyaWJlKGxpc3RlbmVyKSB7XG4gICAgaWYgKCF0aGlzLl9saXN0ZW5lcnMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLl9saXN0ZW5lcnMuaW5kZXhPZihsaXN0ZW5lcik7XG4gICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgdGhpcy5fbGlzdGVuZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgfVxuICB9XG5cbiAgdG9BYm9ydFNpZ25hbCgpIHtcbiAgICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuXG4gICAgY29uc3QgYWJvcnQgPSAoZXJyKSA9PiB7XG4gICAgICBjb250cm9sbGVyLmFib3J0KGVycik7XG4gICAgfTtcblxuICAgIHRoaXMuc3Vic2NyaWJlKGFib3J0KTtcblxuICAgIGNvbnRyb2xsZXIuc2lnbmFsLnVuc3Vic2NyaWJlID0gKCkgPT4gdGhpcy51bnN1YnNjcmliZShhYm9ydCk7XG5cbiAgICByZXR1cm4gY29udHJvbGxlci5zaWduYWw7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBvYmplY3QgdGhhdCBjb250YWlucyBhIG5ldyBgQ2FuY2VsVG9rZW5gIGFuZCBhIGZ1bmN0aW9uIHRoYXQsIHdoZW4gY2FsbGVkLFxuICAgKiBjYW5jZWxzIHRoZSBgQ2FuY2VsVG9rZW5gLlxuICAgKi9cbiAgc3RhdGljIHNvdXJjZSgpIHtcbiAgICBsZXQgY2FuY2VsO1xuICAgIGNvbnN0IHRva2VuID0gbmV3IENhbmNlbFRva2VuKGZ1bmN0aW9uIGV4ZWN1dG9yKGMpIHtcbiAgICAgIGNhbmNlbCA9IGM7XG4gICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRva2VuLFxuICAgICAgY2FuY2VsXG4gICAgfTtcbiAgfVxufVxuXG52YXIgQ2FuY2VsVG9rZW4kMSA9IENhbmNlbFRva2VuO1xuXG4vKipcbiAqIFN5bnRhY3RpYyBzdWdhciBmb3IgaW52b2tpbmcgYSBmdW5jdGlvbiBhbmQgZXhwYW5kaW5nIGFuIGFycmF5IGZvciBhcmd1bWVudHMuXG4gKlxuICogQ29tbW9uIHVzZSBjYXNlIHdvdWxkIGJlIHRvIHVzZSBgRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5YC5cbiAqXG4gKiAgYGBganNcbiAqICBmdW5jdGlvbiBmKHgsIHksIHopIHt9XG4gKiAgdmFyIGFyZ3MgPSBbMSwgMiwgM107XG4gKiAgZi5hcHBseShudWxsLCBhcmdzKTtcbiAqICBgYGBcbiAqXG4gKiBXaXRoIGBzcHJlYWRgIHRoaXMgZXhhbXBsZSBjYW4gYmUgcmUtd3JpdHRlbi5cbiAqXG4gKiAgYGBganNcbiAqICBzcHJlYWQoZnVuY3Rpb24oeCwgeSwgeikge30pKFsxLCAyLCAzXSk7XG4gKiAgYGBgXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAqXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259XG4gKi9cbmZ1bmN0aW9uIHNwcmVhZChjYWxsYmFjaykge1xuICByZXR1cm4gZnVuY3Rpb24gd3JhcChhcnIpIHtcbiAgICByZXR1cm4gY2FsbGJhY2suYXBwbHkobnVsbCwgYXJyKTtcbiAgfTtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHBheWxvYWQgaXMgYW4gZXJyb3IgdGhyb3duIGJ5IEF4aW9zXG4gKlxuICogQHBhcmFtIHsqfSBwYXlsb2FkIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdGhlIHBheWxvYWQgaXMgYW4gZXJyb3IgdGhyb3duIGJ5IEF4aW9zLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNBeGlvc0Vycm9yKHBheWxvYWQpIHtcbiAgcmV0dXJuIHV0aWxzJDEuaXNPYmplY3QocGF5bG9hZCkgJiYgKHBheWxvYWQuaXNBeGlvc0Vycm9yID09PSB0cnVlKTtcbn1cblxuY29uc3QgSHR0cFN0YXR1c0NvZGUgPSB7XG4gIENvbnRpbnVlOiAxMDAsXG4gIFN3aXRjaGluZ1Byb3RvY29sczogMTAxLFxuICBQcm9jZXNzaW5nOiAxMDIsXG4gIEVhcmx5SGludHM6IDEwMyxcbiAgT2s6IDIwMCxcbiAgQ3JlYXRlZDogMjAxLFxuICBBY2NlcHRlZDogMjAyLFxuICBOb25BdXRob3JpdGF0aXZlSW5mb3JtYXRpb246IDIwMyxcbiAgTm9Db250ZW50OiAyMDQsXG4gIFJlc2V0Q29udGVudDogMjA1LFxuICBQYXJ0aWFsQ29udGVudDogMjA2LFxuICBNdWx0aVN0YXR1czogMjA3LFxuICBBbHJlYWR5UmVwb3J0ZWQ6IDIwOCxcbiAgSW1Vc2VkOiAyMjYsXG4gIE11bHRpcGxlQ2hvaWNlczogMzAwLFxuICBNb3ZlZFBlcm1hbmVudGx5OiAzMDEsXG4gIEZvdW5kOiAzMDIsXG4gIFNlZU90aGVyOiAzMDMsXG4gIE5vdE1vZGlmaWVkOiAzMDQsXG4gIFVzZVByb3h5OiAzMDUsXG4gIFVudXNlZDogMzA2LFxuICBUZW1wb3JhcnlSZWRpcmVjdDogMzA3LFxuICBQZXJtYW5lbnRSZWRpcmVjdDogMzA4LFxuICBCYWRSZXF1ZXN0OiA0MDAsXG4gIFVuYXV0aG9yaXplZDogNDAxLFxuICBQYXltZW50UmVxdWlyZWQ6IDQwMixcbiAgRm9yYmlkZGVuOiA0MDMsXG4gIE5vdEZvdW5kOiA0MDQsXG4gIE1ldGhvZE5vdEFsbG93ZWQ6IDQwNSxcbiAgTm90QWNjZXB0YWJsZTogNDA2LFxuICBQcm94eUF1dGhlbnRpY2F0aW9uUmVxdWlyZWQ6IDQwNyxcbiAgUmVxdWVzdFRpbWVvdXQ6IDQwOCxcbiAgQ29uZmxpY3Q6IDQwOSxcbiAgR29uZTogNDEwLFxuICBMZW5ndGhSZXF1aXJlZDogNDExLFxuICBQcmVjb25kaXRpb25GYWlsZWQ6IDQxMixcbiAgUGF5bG9hZFRvb0xhcmdlOiA0MTMsXG4gIFVyaVRvb0xvbmc6IDQxNCxcbiAgVW5zdXBwb3J0ZWRNZWRpYVR5cGU6IDQxNSxcbiAgUmFuZ2VOb3RTYXRpc2ZpYWJsZTogNDE2LFxuICBFeHBlY3RhdGlvbkZhaWxlZDogNDE3LFxuICBJbUFUZWFwb3Q6IDQxOCxcbiAgTWlzZGlyZWN0ZWRSZXF1ZXN0OiA0MjEsXG4gIFVucHJvY2Vzc2FibGVFbnRpdHk6IDQyMixcbiAgTG9ja2VkOiA0MjMsXG4gIEZhaWxlZERlcGVuZGVuY3k6IDQyNCxcbiAgVG9vRWFybHk6IDQyNSxcbiAgVXBncmFkZVJlcXVpcmVkOiA0MjYsXG4gIFByZWNvbmRpdGlvblJlcXVpcmVkOiA0MjgsXG4gIFRvb01hbnlSZXF1ZXN0czogNDI5LFxuICBSZXF1ZXN0SGVhZGVyRmllbGRzVG9vTGFyZ2U6IDQzMSxcbiAgVW5hdmFpbGFibGVGb3JMZWdhbFJlYXNvbnM6IDQ1MSxcbiAgSW50ZXJuYWxTZXJ2ZXJFcnJvcjogNTAwLFxuICBOb3RJbXBsZW1lbnRlZDogNTAxLFxuICBCYWRHYXRld2F5OiA1MDIsXG4gIFNlcnZpY2VVbmF2YWlsYWJsZTogNTAzLFxuICBHYXRld2F5VGltZW91dDogNTA0LFxuICBIdHRwVmVyc2lvbk5vdFN1cHBvcnRlZDogNTA1LFxuICBWYXJpYW50QWxzb05lZ290aWF0ZXM6IDUwNixcbiAgSW5zdWZmaWNpZW50U3RvcmFnZTogNTA3LFxuICBMb29wRGV0ZWN0ZWQ6IDUwOCxcbiAgTm90RXh0ZW5kZWQ6IDUxMCxcbiAgTmV0d29ya0F1dGhlbnRpY2F0aW9uUmVxdWlyZWQ6IDUxMSxcbn07XG5cbk9iamVjdC5lbnRyaWVzKEh0dHBTdGF0dXNDb2RlKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgSHR0cFN0YXR1c0NvZGVbdmFsdWVdID0ga2V5O1xufSk7XG5cbnZhciBIdHRwU3RhdHVzQ29kZSQxID0gSHR0cFN0YXR1c0NvZGU7XG5cbi8qKlxuICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIEF4aW9zXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGRlZmF1bHRDb25maWcgVGhlIGRlZmF1bHQgY29uZmlnIGZvciB0aGUgaW5zdGFuY2VcbiAqXG4gKiBAcmV0dXJucyB7QXhpb3N9IEEgbmV3IGluc3RhbmNlIG9mIEF4aW9zXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUluc3RhbmNlKGRlZmF1bHRDb25maWcpIHtcbiAgY29uc3QgY29udGV4dCA9IG5ldyBBeGlvcyQxKGRlZmF1bHRDb25maWcpO1xuICBjb25zdCBpbnN0YW5jZSA9IGJpbmQoQXhpb3MkMS5wcm90b3R5cGUucmVxdWVzdCwgY29udGV4dCk7XG5cbiAgLy8gQ29weSBheGlvcy5wcm90b3R5cGUgdG8gaW5zdGFuY2VcbiAgdXRpbHMkMS5leHRlbmQoaW5zdGFuY2UsIEF4aW9zJDEucHJvdG90eXBlLCBjb250ZXh0LCB7YWxsT3duS2V5czogdHJ1ZX0pO1xuXG4gIC8vIENvcHkgY29udGV4dCB0byBpbnN0YW5jZVxuICB1dGlscyQxLmV4dGVuZChpbnN0YW5jZSwgY29udGV4dCwgbnVsbCwge2FsbE93bktleXM6IHRydWV9KTtcblxuICAvLyBGYWN0b3J5IGZvciBjcmVhdGluZyBuZXcgaW5zdGFuY2VzXG4gIGluc3RhbmNlLmNyZWF0ZSA9IGZ1bmN0aW9uIGNyZWF0ZShpbnN0YW5jZUNvbmZpZykge1xuICAgIHJldHVybiBjcmVhdGVJbnN0YW5jZShtZXJnZUNvbmZpZyhkZWZhdWx0Q29uZmlnLCBpbnN0YW5jZUNvbmZpZykpO1xuICB9O1xuXG4gIHJldHVybiBpbnN0YW5jZTtcbn1cblxuLy8gQ3JlYXRlIHRoZSBkZWZhdWx0IGluc3RhbmNlIHRvIGJlIGV4cG9ydGVkXG5jb25zdCBheGlvcyA9IGNyZWF0ZUluc3RhbmNlKGRlZmF1bHRzJDEpO1xuXG4vLyBFeHBvc2UgQXhpb3MgY2xhc3MgdG8gYWxsb3cgY2xhc3MgaW5oZXJpdGFuY2VcbmF4aW9zLkF4aW9zID0gQXhpb3MkMTtcblxuLy8gRXhwb3NlIENhbmNlbCAmIENhbmNlbFRva2VuXG5heGlvcy5DYW5jZWxlZEVycm9yID0gQ2FuY2VsZWRFcnJvcjtcbmF4aW9zLkNhbmNlbFRva2VuID0gQ2FuY2VsVG9rZW4kMTtcbmF4aW9zLmlzQ2FuY2VsID0gaXNDYW5jZWw7XG5heGlvcy5WRVJTSU9OID0gVkVSU0lPTjtcbmF4aW9zLnRvRm9ybURhdGEgPSB0b0Zvcm1EYXRhO1xuXG4vLyBFeHBvc2UgQXhpb3NFcnJvciBjbGFzc1xuYXhpb3MuQXhpb3NFcnJvciA9IEF4aW9zRXJyb3I7XG5cbi8vIGFsaWFzIGZvciBDYW5jZWxlZEVycm9yIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XG5heGlvcy5DYW5jZWwgPSBheGlvcy5DYW5jZWxlZEVycm9yO1xuXG4vLyBFeHBvc2UgYWxsL3NwcmVhZFxuYXhpb3MuYWxsID0gZnVuY3Rpb24gYWxsKHByb21pc2VzKSB7XG4gIHJldHVybiBQcm9taXNlLmFsbChwcm9taXNlcyk7XG59O1xuXG5heGlvcy5zcHJlYWQgPSBzcHJlYWQ7XG5cbi8vIEV4cG9zZSBpc0F4aW9zRXJyb3JcbmF4aW9zLmlzQXhpb3NFcnJvciA9IGlzQXhpb3NFcnJvcjtcblxuLy8gRXhwb3NlIG1lcmdlQ29uZmlnXG5heGlvcy5tZXJnZUNvbmZpZyA9IG1lcmdlQ29uZmlnO1xuXG5heGlvcy5BeGlvc0hlYWRlcnMgPSBBeGlvc0hlYWRlcnMkMTtcblxuYXhpb3MuZm9ybVRvSlNPTiA9IHRoaW5nID0+IGZvcm1EYXRhVG9KU09OKHV0aWxzJDEuaXNIVE1MRm9ybSh0aGluZykgPyBuZXcgRm9ybURhdGEodGhpbmcpIDogdGhpbmcpO1xuXG5heGlvcy5nZXRBZGFwdGVyID0gYWRhcHRlcnMuZ2V0QWRhcHRlcjtcblxuYXhpb3MuSHR0cFN0YXR1c0NvZGUgPSBIdHRwU3RhdHVzQ29kZSQxO1xuXG5heGlvcy5kZWZhdWx0ID0gYXhpb3M7XG5cbm1vZHVsZS5leHBvcnRzID0gYXhpb3M7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1heGlvcy5janMubWFwXG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/axios/dist/browser/axios.cjs\n"); +eval("/* provided dependency */ var process = __webpack_require__(/*! process/browser.js */ \"./node_modules/process/browser.js\");\n/* provided dependency */ var Buffer = __webpack_require__(/*! buffer */ \"./node_modules/buffer/index.js\")[\"Buffer\"];\n/*! Axios v1.8.4 Copyright (c) 2025 Matt Zabriskie and contributors */\n\n\nfunction bind(fn, thisArg) {\n return function wrap() {\n return fn.apply(thisArg, arguments);\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 : __webpack_require__.g)\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] = bind(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} 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}\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\nvar utils$1 = {\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/**\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\nutils$1.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$1.toJSONObject(this.config),\n code: this.code,\n status: this.status\n };\n }\n});\n\nconst prototype$1 = 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$1, '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$1);\n\n utils$1.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// eslint-disable-next-line strict\nvar httpAdapter = null;\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$1.isPlainObject(thing) || utils$1.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$1.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} arr - The array to check\n *\n * @returns {boolean}\n */\nfunction isFlatArray(arr) {\n return utils$1.isArray(arr) && !arr.some(isVisitable);\n}\n\nconst predicates = utils$1.toFlatObject(utils$1, {}, 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} obj - The object to convert to form data.\n * @param {string} formData - The FormData object to append to.\n * @param {Object} options\n *\n * @returns\n */\nfunction toFormData(obj, formData, options) {\n if (!utils$1.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 (FormData)();\n\n // eslint-disable-next-line no-param-reassign\n options = utils$1.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$1.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$1.isSpecCompliantForm(formData);\n\n if (!utils$1.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$1.isDate(value)) {\n return value.toISOString();\n }\n\n if (!useBlob && utils$1.isBlob(value)) {\n throw new AxiosError('Blob is not supported. Use a Buffer instead.');\n }\n\n if (utils$1.isArrayBuffer(value) || utils$1.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} 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$1.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$1.isArray(value) && isFlatArray(value)) ||\n ((utils$1.isFileList(value) || utils$1.endsWith(key, '[]')) && (arr = utils$1.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$1.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$1.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$1.forEach(value, function each(el, key) {\n const result = !(utils$1.isUndefined(el) || el === null) && visitor.call(\n formData, el, utils$1.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$1.isObject(obj)) {\n throw new TypeError('data must be an object');\n }\n\n build(obj);\n\n return formData;\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$1(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} params - The parameters to be converted to a FormData object.\n * @param {Object} options - The options object passed to the Axios constructor.\n *\n * @returns {void}\n */\nfunction AxiosURLSearchParams(params, options) {\n this._pairs = [];\n\n params && toFormData(params, this, options);\n}\n\nconst prototype = AxiosURLSearchParams.prototype;\n\nprototype.append = function append(name, value) {\n this._pairs.push([name, value]);\n};\n\nprototype.toString = function toString(encoder) {\n const _encode = encoder ? function(value) {\n return encoder.call(this, value, encode$1);\n } : encode$1;\n\n return this._pairs.map(function each(pair) {\n return _encode(pair[0]) + '=' + _encode(pair[1]);\n }, '').join('&');\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 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 || encode;\n\n if (utils$1.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$1.isURLSearchParams(params) ?\n params.toString() :\n new 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\nclass 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$1.forEach(this.handlers, function forEachHandler(h) {\n if (h !== null) {\n fn(h);\n }\n });\n }\n}\n\nvar InterceptorManager$1 = InterceptorManager;\n\nvar transitionalDefaults = {\n silentJSONParsing: true,\n forcedJSONParsing: true,\n clarifyTimeoutError: false\n};\n\nvar URLSearchParams$1 = typeof URLSearchParams !== 'undefined' ? URLSearchParams : AxiosURLSearchParams;\n\nvar FormData$1 = typeof FormData !== 'undefined' ? FormData : null;\n\nvar Blob$1 = typeof Blob !== 'undefined' ? Blob : null;\n\nvar platform$1 = {\n isBrowser: true,\n classes: {\n URLSearchParams: URLSearchParams$1,\n FormData: FormData$1,\n Blob: Blob$1\n },\n protocols: ['http', 'https', 'file', 'blob', 'url', 'data']\n};\n\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 origin = hasBrowserEnv && window.location.href || 'http://localhost';\n\nvar utils = /*#__PURE__*/Object.freeze({\n __proto__: null,\n hasBrowserEnv: hasBrowserEnv,\n hasStandardBrowserWebWorkerEnv: hasStandardBrowserWebWorkerEnv,\n hasStandardBrowserEnv: hasStandardBrowserEnv,\n navigator: _navigator,\n origin: origin\n});\n\nvar platform = {\n ...utils,\n ...platform$1\n};\n\nfunction toURLEncodedForm(data, options) {\n return toFormData(data, new platform.classes.URLSearchParams(), Object.assign({\n visitor: function(value, key, path, helpers) {\n if (platform.isNode && utils$1.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/**\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$1.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} 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 | 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$1.isArray(target) ? target.length : name;\n\n if (isLast) {\n if (utils$1.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$1.isObject(target[name])) {\n target[name] = [];\n }\n\n const result = buildPath(path, value, target[name], index);\n\n if (result && utils$1.isArray(target[name])) {\n target[name] = arrayToObject(target[name]);\n }\n\n return !isNumericKey;\n }\n\n if (utils$1.isFormData(formData) && utils$1.isFunction(formData.entries)) {\n const obj = {};\n\n utils$1.forEachEntry(formData, (name, value) => {\n buildPath(parsePropPath(name), value, obj, 0);\n });\n\n return obj;\n }\n\n return null;\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$1.isString(rawValue)) {\n try {\n (parser || JSON.parse)(rawValue);\n return utils$1.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: transitionalDefaults,\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$1.isObject(data);\n\n if (isObjectPayload && utils$1.isHTMLForm(data)) {\n data = new FormData(data);\n }\n\n const isFormData = utils$1.isFormData(data);\n\n if (isFormData) {\n return hasJSONContentType ? JSON.stringify(formDataToJSON(data)) : data;\n }\n\n if (utils$1.isArrayBuffer(data) ||\n utils$1.isBuffer(data) ||\n utils$1.isStream(data) ||\n utils$1.isFile(data) ||\n utils$1.isBlob(data) ||\n utils$1.isReadableStream(data)\n ) {\n return data;\n }\n if (utils$1.isArrayBufferView(data)) {\n return data.buffer;\n }\n if (utils$1.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$1.isFileList(data)) || contentType.indexOf('multipart/form-data') > -1) {\n const _FormData = this.env && this.env.FormData;\n\n return toFormData(\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$1.isResponse(data) || utils$1.isReadableStream(data)) {\n return data;\n }\n\n if (data && utils$1.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.from(e, AxiosError.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$1.forEach(['delete', 'get', 'head', 'post', 'put', 'patch'], (method) => {\n defaults.headers[method] = {};\n});\n\nvar defaults$1 = defaults;\n\n// RawAxiosHeaders whose duplicates are ignored by node\n// c.f. https://nodejs.org/api/http.html#http_message_headers\nconst ignoreDuplicateOf = utils$1.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 */\nvar 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\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$1.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$1.isFunction(filter)) {\n return filter.call(this, value, header);\n }\n\n if (isHeaderNameFilter) {\n value = header;\n }\n\n if (!utils$1.isString(value)) return;\n\n if (utils$1.isString(filter)) {\n return value.indexOf(filter) !== -1;\n }\n\n if (utils$1.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$1.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 {\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$1.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$1.forEach(headers, (_value, _header) => setHeader(_value, _header, _rewrite));\n\n if (utils$1.isPlainObject(header) || header instanceof this.constructor) {\n setHeaders(header, valueOrRewrite);\n } else if(utils$1.isString(header) && (header = header.trim()) && !isValidHeaderName(header)) {\n setHeaders(parseHeaders(header), valueOrRewrite);\n } else if (utils$1.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$1.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$1.isFunction(parser)) {\n return parser.call(this, value, key);\n }\n\n if (utils$1.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$1.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$1.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$1.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$1.forEach(this, (value, header) => {\n const key = utils$1.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$1.forEach(this, (value, header) => {\n value != null && value !== false && (obj[header] = asStrings && utils$1.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$1.isArray(header) ? header.forEach(defineAccessor) : defineAccessor(header);\n\n return this;\n }\n}\n\nAxiosHeaders.accessor(['Content-Type', 'Content-Length', 'Accept', 'Accept-Encoding', 'User-Agent', 'Authorization']);\n\n// reserved names hotfix\nutils$1.reduceDescriptors(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$1.freezeMethods(AxiosHeaders);\n\nvar AxiosHeaders$1 = AxiosHeaders;\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 || defaults$1;\n const context = response || config;\n const headers = AxiosHeaders$1.from(context.headers);\n let data = context.data;\n\n utils$1.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\nfunction isCancel(value) {\n return !!(value && value.__CANCEL__);\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.call(this, message == null ? 'canceled' : message, AxiosError.ERR_CANCELED, config, request);\n this.name = 'CanceledError';\n}\n\nutils$1.inherits(CanceledError, AxiosError, {\n __CANCEL__: true\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(\n 'Request failed with status code ' + response.status,\n [AxiosError.ERR_BAD_REQUEST, AxiosError.ERR_BAD_RESPONSE][Math.floor(response.status / 100) - 4],\n response.config,\n response.request,\n response\n ));\n }\n}\n\nfunction parseProtocol(url) {\n const match = /^([-+\\w]{1,25})(:?\\/\\/|:)/.exec(url);\n return match && match[1] || '';\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/**\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\nconst progressEventReducer = (listener, isDownloadStream, freq = 3) => {\n let bytesNotified = 0;\n const _speedometer = speedometer(50, 250);\n\n return 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$1.asap(() => fn(...args));\n\nvar 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\nvar 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$1.isNumber(expires) && cookie.push('expires=' + new Date(expires).toGMTString());\n\n utils$1.isString(path) && cookie.push('path=' + path);\n\n utils$1.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 * 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 \"://\" 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/**\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/**\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\nconst headersToObject = (thing) => thing instanceof AxiosHeaders$1 ? { ...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$1.isPlainObject(target) && utils$1.isPlainObject(source)) {\n return utils$1.merge.call({caseless}, target, source);\n } else if (utils$1.isPlainObject(source)) {\n return utils$1.merge({}, source);\n } else if (utils$1.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$1.isUndefined(b)) {\n return getMergedValue(a, b, prop , caseless);\n } else if (!utils$1.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$1.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$1.isUndefined(b)) {\n return getMergedValue(undefined, b);\n } else if (!utils$1.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$1.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$1.isUndefined(configValue) && merge !== mergeDirectKeys) || (config[prop] = configValue);\n });\n\n return config;\n}\n\nvar resolveConfig = (config) => {\n const newConfig = mergeConfig({}, config);\n\n let {data, withXSRFToken, xsrfHeaderName, xsrfCookieName, headers, auth} = newConfig;\n\n newConfig.headers = headers = AxiosHeaders$1.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$1.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$1.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\nconst isXHRAdapterSupported = typeof XMLHttpRequest !== 'undefined';\n\nvar xhrAdapter = isXHRAdapterSupported && function (config) {\n return new Promise(function dispatchXhrRequest(resolve, reject) {\n const _config = resolveConfig(config);\n let requestData = _config.data;\n const requestHeaders = AxiosHeaders$1.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 = AxiosHeaders$1.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('Request aborted', AxiosError.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('Network Error', AxiosError.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 || transitionalDefaults;\n if (_config.timeoutErrorMessage) {\n timeoutErrorMessage = _config.timeoutErrorMessage;\n }\n reject(new AxiosError(\n timeoutErrorMessage,\n transitional.clarifyTimeoutError ? AxiosError.ETIMEDOUT : AxiosError.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$1.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$1.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 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('Unsupported protocol ' + protocol + ':', AxiosError.ERR_BAD_REQUEST, config));\n return;\n }\n\n\n // Send the request\n request.send(requestData || null);\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 ? err : new CanceledError(err instanceof Error ? err.message : err));\n }\n };\n\n let timer = timeout && setTimeout(() => {\n timer = null;\n onabort(new AxiosError(`timeout ${timeout} of ms exceeded`, AxiosError.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$1.asap(unsubscribe);\n\n return signal;\n }\n};\n\nvar composeSignals$1 = composeSignals;\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\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$1.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$1.isFunction(res[type]) ? (res) => res[type]() :\n (_, config) => {\n throw new AxiosError(`Response type '${type}' is not supported`, AxiosError.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$1.isBlob(body)) {\n return body.size;\n }\n\n if(utils$1.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$1.isArrayBufferView(body) || utils$1.isArrayBuffer(body)) {\n return body.byteLength;\n }\n\n if(utils$1.isURLSearchParams(body)) {\n body = body + '';\n }\n\n if(utils$1.isString(body)) {\n return (await encodeText(body)).byteLength;\n }\n};\n\nconst resolveBodyLength = async (headers, body) => {\n const length = utils$1.toFiniteNumber(headers.getContentLength());\n\n return length == null ? getBodyLength(body) : length;\n};\n\nvar fetchAdapter = 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 = composeSignals$1([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$1.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$1.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$1.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$1.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: AxiosHeaders$1.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('Network Error', AxiosError.ERR_NETWORK, config, request),\n {\n cause: err.cause || err\n }\n )\n }\n\n throw AxiosError.from(err, err && err.code, config, request);\n }\n});\n\nconst knownAdapters = {\n http: httpAdapter,\n xhr: xhrAdapter,\n fetch: fetchAdapter\n};\n\nutils$1.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$1.isFunction(adapter) || adapter === null || adapter === false;\n\nvar adapters = {\n getAdapter: (adapters) => {\n adapters = utils$1.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(`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(\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/**\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 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 = AxiosHeaders$1.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.getAdapter(config.adapter || defaults$1.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 = AxiosHeaders$1.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 = AxiosHeaders$1.from(reason.response.headers);\n }\n }\n\n return Promise.reject(reason);\n });\n}\n\nconst VERSION = \"1.8.4\";\n\nconst validators$1 = {};\n\n// eslint-disable-next-line func-names\n['object', 'boolean', 'number', 'function', 'string', 'symbol'].forEach((type, i) => {\n validators$1[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$1.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(\n formatMessage(opt, ' has been removed' + (version ? ' in ' + version : '')),\n AxiosError.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$1.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('options must be an object', AxiosError.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('option ' + opt + ' must be ' + result, AxiosError.ERR_BAD_OPTION_VALUE);\n }\n continue;\n }\n if (allowUnknown !== true) {\n throw new AxiosError('Unknown option ' + opt, AxiosError.ERR_BAD_OPTION);\n }\n }\n}\n\nvar validator = {\n assertOptions,\n validators: validators$1\n};\n\nconst validators = 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 {\n constructor(instanceConfig) {\n this.defaults = instanceConfig;\n this.interceptors = {\n request: new InterceptorManager$1(),\n response: new InterceptorManager$1()\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 validator.assertOptions(transitional, {\n silentJSONParsing: validators.transitional(validators.boolean),\n forcedJSONParsing: validators.transitional(validators.boolean),\n clarifyTimeoutError: validators.transitional(validators.boolean)\n }, false);\n }\n\n if (paramsSerializer != null) {\n if (utils$1.isFunction(paramsSerializer)) {\n config.paramsSerializer = {\n serialize: paramsSerializer\n };\n } else {\n validator.assertOptions(paramsSerializer, {\n encode: validators.function,\n serialize: validators.function\n }, true);\n }\n }\n\n // Set config.allowAbsoluteUrls\n if (config.allowAbsoluteUrls !== undefined) ; else if (this.defaults.allowAbsoluteUrls !== undefined) {\n config.allowAbsoluteUrls = this.defaults.allowAbsoluteUrls;\n } else {\n config.allowAbsoluteUrls = true;\n }\n\n validator.assertOptions(config, {\n baseUrl: validators.spelling('baseURL'),\n withXsrfToken: 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$1.merge(\n headers.common,\n headers[config.method]\n );\n\n headers && utils$1.forEach(\n ['delete', 'get', 'head', 'post', 'put', 'patch', 'common'],\n (method) => {\n delete headers[method];\n }\n );\n\n config.headers = AxiosHeaders$1.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$1.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) {\n /*eslint func-names:0*/\n 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$1.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.prototype[method] = generateHTTPMethod();\n\n Axios.prototype[method + 'Form'] = generateHTTPMethod(true);\n});\n\nvar Axios$1 = Axios;\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 {\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 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(function executor(c) {\n cancel = c;\n });\n return {\n token,\n cancel\n };\n }\n}\n\nvar CancelToken$1 = CancelToken;\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/**\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$1.isObject(payload) && (payload.isAxiosError === true);\n}\n\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\nvar HttpStatusCode$1 = HttpStatusCode;\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 Axios$1(defaultConfig);\n const instance = bind(Axios$1.prototype.request, context);\n\n // Copy axios.prototype to instance\n utils$1.extend(instance, Axios$1.prototype, context, {allOwnKeys: true});\n\n // Copy context to instance\n utils$1.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(defaults$1);\n\n// Expose Axios class to allow class inheritance\naxios.Axios = Axios$1;\n\n// Expose Cancel & CancelToken\naxios.CanceledError = CanceledError;\naxios.CancelToken = CancelToken$1;\naxios.isCancel = isCancel;\naxios.VERSION = VERSION;\naxios.toFormData = toFormData;\n\n// Expose AxiosError class\naxios.AxiosError = AxiosError;\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 = AxiosHeaders$1;\n\naxios.formToJSON = thing => formDataToJSON(utils$1.isHTMLForm(thing) ? new FormData(thing) : thing);\n\naxios.getAdapter = adapters.getAdapter;\n\naxios.HttpStatusCode = HttpStatusCode$1;\n\naxios.default = axios;\n\nmodule.exports = axios;\n//# sourceMappingURL=axios.cjs.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvYXhpb3MvZGlzdC9icm93c2VyL2F4aW9zLmNqcyIsIm1hcHBpbmdzIjoiOztBQUFBO0FBQ2E7O0FBRWI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSxPQUFPLFVBQVU7QUFDakIsT0FBTyxnQkFBZ0I7O0FBRXZCO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CO0FBQ0EsYUFBYSxTQUFTO0FBQ3RCO0FBQ0EsT0FBTyxTQUFTOztBQUVoQjtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZDtBQUNBLGFBQWEsU0FBUztBQUN0QjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkO0FBQ0EsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2Q7QUFDQSxhQUFhLFNBQVM7QUFDdEI7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2Q7QUFDQSxhQUFhLFNBQVM7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZDtBQUNBLGFBQWEsU0FBUztBQUN0QjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkLGFBQWEsU0FBUztBQUN0QjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkO0FBQ0EsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2Q7QUFDQSxhQUFhLFNBQVM7QUFDdEI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZCxhQUFhLFNBQVM7QUFDdEI7QUFDQTs7QUFFQTtB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QUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25COztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsU0FBUztBQUNwQjtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsMENBQTBDLGFBQWE7QUFDdkQ7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUcsV0FBVyxjQUFjO0FBQzVCLENBQUM7QUFDRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwwQ0FBMEMsT0FBTyxvQkFBb0IsT0FBTzs7QUFFNUU7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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Q0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsMkJBQTJCLG1CQUFtQjtBQUM5Qzs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxLQUFLOztBQUVMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0Esb0RBQW9ELE1BQU07QUFDMUQsb0RBQW9EO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxnQkFBZ0I7QUFDM0IsV0FBVyxTQUFTO0FBQ3BCO0FBQ0EsYUFBYSxHQUFHO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFNBQVM7QUFDcEIsV0FBVyxTQUFTO0FBQ3BCLFdBQVcsU0FBUztBQUNwQjtBQUNBLGFBQWEsZUFBZTtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0EsV0FBVyxVQUFVO0FBQ3JCLFdBQVcsVUFBVTtBQUNyQixXQUFXLFFBQVE7QUFDbkI7QUFDQSxhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwwQkFBMEIsS0FBSztBQUMvQjtBQUNBOztBQUVBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsV0FBVyxRQUFRO0FBQ25CLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsV0FBVyxVQUFVO0FBQ3JCLFdBQVcsUUFBUTtBQUNuQixZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQSx1Q0FBdUM7QUFDdkMsS0FBSzs7QUFFTDtBQUNBLDBEQUEwRCx3QkFBd0I7QUFDbEY7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQjtBQUNBLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsV0FBVyxRQUFRO0FBQ25CO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFdBQVcsUUFBUTtBQUNuQjtBQUNBLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHVFQUF1RSxXQUFXOztBQUVsRjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixXQUFXLFFBQVE7QUFDbkI7QUFDQSxhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsaUNBQWlDLFNBQVM7QUFDMUMsTUFBTTtBQUNOLDZCQUE2QjtBQUM3QixNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLDhDQUE4QztBQUM5QztBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7O0FBRUE7QUFDQSxrQ0FBa0M7O0FBRWxDLE9BQU8sb0VBQW9FOztBQUUzRTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLHlDQUF5QztBQUN6QyxNQUFNO0FBQ047QUFDQSxrRUFBa0U7QUFDbEUsZ0ZBQWdGO0FBQ2hGO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUyxvREFBb0Q7QUFDN0Q7QUFDQTtBQUNBOztBQUVBO0FBQ0Esb0NBQW9DO0FBQ3BDLHdDQUF3Qzs7QUFFeEM7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87O0FBRVA7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQSxTQUFTLFFBQVE7O0FBRWpCO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esd0NBQXdDLFNBQVM7QUFDakQsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBOztBQUVBOztBQUVBLFdBQVcsUUFBUTs7QUFFbkI7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxXQUFXO0FBQ1gsYUFB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QVU7QUFDckI7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsR0FBRztBQUNkO0FBQ0EsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLENBQUM7O0FBRUQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CO0FBQ0EsYUFBYSxPQUFPO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esd0RBQXdELGlCQUFpQjs7QUFFekU7QUFDQSwyQ0FBMkMsaUJBQWlCOztBQUU1RDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2F4aW9zL2Rpc3QvYnJvd3Nlci9heGlvcy5janM/ZTE2ZSJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiEgQXhpb3MgdjEuOC40IENvcHlyaWdodCAoYykgMjAyNSBNYXR0IFphYnJpc2tpZSBhbmQgY29udHJpYnV0b3JzICovXG4ndXNlIHN0cmljdCc7XG5cbmZ1bmN0aW9uIGJpbmQoZm4sIHRoaXNBcmcpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHdyYXAoKSB7XG4gICAgcmV0dXJuIGZuLmFwcGx5KHRoaXNBcmcsIGFyZ3VtZW50cyk7XG4gIH07XG59XG5cbi8vIHV0aWxzIGlzIGEgbGlicmFyeSBvZiBnZW5lcmljIGhlbHBlciBmdW5jdGlvbnMgbm9uLXNwZWNpZmljIHRvIGF4aW9zXG5cbmNvbnN0IHt0b1N0cmluZ30gPSBPYmplY3QucHJvdG90eXBlO1xuY29uc3Qge2dldFByb3RvdHlwZU9mfSA9IE9iamVjdDtcblxuY29uc3Qga2luZE9mID0gKGNhY2hlID0+IHRoaW5nID0+IHtcbiAgICBjb25zdCBzdHIgPSB0b1N0cmluZy5jYWxsKHRoaW5nKTtcbiAgICByZXR1cm4gY2FjaGVbc3RyXSB8fCAoY2FjaGVbc3RyXSA9IHN0ci5zbGljZSg4LCAtMSkudG9Mb3dlckNhc2UoKSk7XG59KShPYmplY3QuY3JlYXRlKG51bGwpKTtcblxuY29uc3Qga2luZE9mVGVzdCA9ICh0eXBlKSA9PiB7XG4gIHR5cGUgPSB0eXBlLnRvTG93ZXJDYXNlKCk7XG4gIHJldHVybiAodGhpbmcpID0+IGtpbmRPZih0aGluZykgPT09IHR5cGVcbn07XG5cbmNvbnN0IHR5cGVPZlRlc3QgPSB0eXBlID0+IHRoaW5nID0+IHR5cGVvZiB0aGluZyA9PT0gdHlwZTtcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhbiBBcnJheVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhbiBBcnJheSwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmNvbnN0IHtpc0FycmF5fSA9IEFycmF5O1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIHVuZGVmaW5lZFxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdGhlIHZhbHVlIGlzIHVuZGVmaW5lZCwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmNvbnN0IGlzVW5kZWZpbmVkID0gdHlwZU9mVGVzdCgndW5kZWZpbmVkJyk7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBCdWZmZXJcbiAqXG4gKiBAcGFyYW0geyp9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgQnVmZmVyLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNCdWZmZXIodmFsKSB7XG4gIHJldHVybiB2YWwgIT09IG51bGwgJiYgIWlzVW5kZWZpbmVkKHZhbCkgJiYgdmFsLmNvbnN0cnVjdG9yICE9PSBudWxsICYmICFpc1VuZGVmaW5lZCh2YWwuY29uc3RydWN0b3IpXG4gICAgJiYgaXNGdW5jdGlvbih2YWwuY29uc3RydWN0b3IuaXNCdWZmZXIpICYmIHZhbC5jb25zdHJ1Y3Rvci5pc0J1ZmZlcih2YWwpO1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGFuIEFycmF5QnVmZmVyXG4gKlxuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhbiBBcnJheUJ1ZmZlciwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmNvbnN0IGlzQXJyYXlCdWZmZXIgPSBraW5kT2ZUZXN0KCdBcnJheUJ1ZmZlcicpO1xuXG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSB2aWV3IG9uIGFuIEFycmF5QnVmZmVyXG4gKlxuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIHZpZXcgb24gYW4gQXJyYXlCdWZmZXIsIG90aGVyd2lzZSBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0FycmF5QnVmZmVyVmlldyh2YWwpIHtcbiAgbGV0IHJlc3VsdDtcbiAgaWYgKCh0eXBlb2YgQXJyYXlCdWZmZXIgIT09ICd1bmRlZmluZWQnKSAmJiAoQXJyYXlCdWZmZXIuaXNWaWV3KSkge1xuICAgIHJlc3VsdCA9IEFycmF5QnVmZmVyLmlzVmlldyh2YWwpO1xuICB9IGVsc2Uge1xuICAgIHJlc3VsdCA9ICh2YWwpICYmICh2YWwuYnVmZmVyKSAmJiAoaXNBcnJheUJ1ZmZlcih2YWwuYnVmZmVyKSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIFN0cmluZ1xuICpcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBTdHJpbmcsIG90aGVyd2lzZSBmYWxzZVxuICovXG5jb25zdCBpc1N0cmluZyA9IHR5cGVPZlRlc3QoJ3N0cmluZycpO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgRnVuY3Rpb25cbiAqXG4gKiBAcGFyYW0geyp9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBGdW5jdGlvbiwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmNvbnN0IGlzRnVuY3Rpb24gPSB0eXBlT2ZUZXN0KCdmdW5jdGlvbicpO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgTnVtYmVyXG4gKlxuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIE51bWJlciwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmNvbnN0IGlzTnVtYmVyID0gdHlwZU9mVGVzdCgnbnVtYmVyJyk7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYW4gT2JqZWN0XG4gKlxuICogQHBhcmFtIHsqfSB0aGluZyBUaGUgdmFsdWUgdG8gdGVzdFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGFuIE9iamVjdCwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmNvbnN0IGlzT2JqZWN0ID0gKHRoaW5nKSA9PiB0aGluZyAhPT0gbnVsbCAmJiB0eXBlb2YgdGhpbmcgPT09ICdvYmplY3QnO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgQm9vbGVhblxuICpcbiAqIEBwYXJhbSB7Kn0gdGhpbmcgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgQm9vbGVhbiwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmNvbnN0IGlzQm9vbGVhbiA9IHRoaW5nID0+IHRoaW5nID09PSB0cnVlIHx8IHRoaW5nID09PSBmYWxzZTtcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIHBsYWluIE9iamVjdFxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBwbGFpbiBPYmplY3QsIG90aGVyd2lzZSBmYWxzZVxuICovXG5jb25zdCBpc1BsYWluT2JqZWN0ID0gKHZhbCkgPT4ge1xuICBpZiAoa2luZE9mKHZhbCkgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgcHJvdG90eXBlID0gZ2V0UHJvdG90eXBlT2YodmFsKTtcbiAgcmV0dXJuIChwcm90b3R5cGUgPT09IG51bGwgfHwgcHJvdG90eXBlID09PSBPYmplY3QucHJvdG90eXBlIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90b3R5cGUpID09PSBudWxsKSAmJiAhKFN5bWJvbC50b1N0cmluZ1RhZyBpbiB2YWwpICYmICEoU3ltYm9sLml0ZXJhdG9yIGluIHZhbCk7XG59O1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgRGF0ZVxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBEYXRlLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3QgaXNEYXRlID0ga2luZE9mVGVzdCgnRGF0ZScpO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgRmlsZVxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBGaWxlLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3QgaXNGaWxlID0ga2luZE9mVGVzdCgnRmlsZScpO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgQmxvYlxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBCbG9iLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3QgaXNCbG9iID0ga2luZE9mVGVzdCgnQmxvYicpO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgRmlsZUxpc3RcbiAqXG4gKiBAcGFyYW0geyp9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgRmlsZSwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmNvbnN0IGlzRmlsZUxpc3QgPSBraW5kT2ZUZXN0KCdGaWxlTGlzdCcpO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgU3RyZWFtXG4gKlxuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIFN0cmVhbSwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmNvbnN0IGlzU3RyZWFtID0gKHZhbCkgPT4gaXNPYmplY3QodmFsKSAmJiBpc0Z1bmN0aW9uKHZhbC5waXBlKTtcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSB2YWx1ZSBpcyBhIEZvcm1EYXRhXG4gKlxuICogQHBhcmFtIHsqfSB0aGluZyBUaGUgdmFsdWUgdG8gdGVzdFxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGFuIEZvcm1EYXRhLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3QgaXNGb3JtRGF0YSA9ICh0aGluZykgPT4ge1xuICBsZXQga2luZDtcbiAgcmV0dXJuIHRoaW5nICYmIChcbiAgICAodHlwZW9mIEZvcm1EYXRhID09PSAnZnVuY3Rpb24nICYmIHRoaW5nIGluc3RhbmNlb2YgRm9ybURhdGEpIHx8IChcbiAgICAgIGlzRnVuY3Rpb24odGhpbmcuYXBwZW5kKSAmJiAoXG4gICAgICAgIChraW5kID0ga2luZE9mKHRoaW5nKSkgPT09ICdmb3JtZGF0YScgfHxcbiAgICAgICAgLy8gZGV0ZWN0IGZvcm0tZGF0YSBpbnN0YW5jZVxuICAgICAgICAoa2luZCA9PT0gJ29iamVjdCcgJiYgaXNGdW5jdGlvbih0aGluZy50b1N0cmluZykgJiYgdGhpbmcudG9TdHJpbmcoKSA9PT0gJ1tvYmplY3QgRm9ybURhdGFdJylcbiAgICAgIClcbiAgICApXG4gIClcbn07XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBVUkxTZWFyY2hQYXJhbXMgb2JqZWN0XG4gKlxuICogQHBhcmFtIHsqfSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIFVSTFNlYXJjaFBhcmFtcyBvYmplY3QsIG90aGVyd2lzZSBmYWxzZVxuICovXG5jb25zdCBpc1VSTFNlYXJjaFBhcmFtcyA9IGtpbmRPZlRlc3QoJ1VSTFNlYXJjaFBhcmFtcycpO1xuXG5jb25zdCBbaXNSZWFkYWJsZVN0cmVhbSwgaXNSZXF1ZXN0LCBpc1Jlc3BvbnNlLCBpc0hlYWRlcnNdID0gWydSZWFkYWJsZVN0cmVhbScsICdSZXF1ZXN0JywgJ1Jlc3BvbnNlJywgJ0hlYWRlcnMnXS5tYXAoa2luZE9mVGVzdCk7XG5cbi8qKlxuICogVHJpbSBleGNlc3Mgd2hpdGVzcGFjZSBvZmYgdGhlIGJlZ2lubmluZyBhbmQgZW5kIG9mIGEgc3RyaW5nXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHN0ciBUaGUgU3RyaW5nIHRvIHRyaW1cbiAqXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBUaGUgU3RyaW5nIGZyZWVkIG9mIGV4Y2VzcyB3aGl0ZXNwYWNlXG4gKi9cbmNvbnN0IHRyaW0gPSAoc3RyKSA9PiBzdHIudHJpbSA/XG4gIHN0ci50cmltKCkgOiBzdHIucmVwbGFjZSgvXltcXHNcXHVGRUZGXFx4QTBdK3xbXFxzXFx1RkVGRlxceEEwXSskL2csICcnKTtcblxuLyoqXG4gKiBJdGVyYXRlIG92ZXIgYW4gQXJyYXkgb3IgYW4gT2JqZWN0IGludm9raW5nIGEgZnVuY3Rpb24gZm9yIGVhY2ggaXRlbS5cbiAqXG4gKiBJZiBgb2JqYCBpcyBhbiBBcnJheSBjYWxsYmFjayB3aWxsIGJlIGNhbGxlZCBwYXNzaW5nXG4gKiB0aGUgdmFsdWUsIGluZGV4LCBhbmQgY29tcGxldGUgYXJyYXkgZm9yIGVhY2ggaXRlbS5cbiAqXG4gKiBJZiAnb2JqJyBpcyBhbiBPYmplY3QgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQgcGFzc2luZ1xuICogdGhlIHZhbHVlLCBrZXksIGFuZCBjb21wbGV0ZSBvYmplY3QgZm9yIGVhY2ggcHJvcGVydHkuXG4gKlxuICogQHBhcmFtIHtPYmplY3R8QXJyYXl9IG9iaiBUaGUgb2JqZWN0IHRvIGl0ZXJhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBjYWxsYmFjayB0byBpbnZva2UgZm9yIGVhY2ggaXRlbVxuICpcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW2FsbE93bktleXMgPSBmYWxzZV1cbiAqIEByZXR1cm5zIHthbnl9XG4gKi9cbmZ1bmN0aW9uIGZvckVhY2gob2JqLCBmbiwge2FsbE93bktleXMgPSBmYWxzZX0gPSB7fSkge1xuICAvLyBEb24ndCBib3RoZXIgaWYgbm8gdmFsdWUgcHJvdmlkZWRcbiAgaWYgKG9iaiA9PT0gbnVsbCB8fCB0eXBlb2Ygb2JqID09PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxldCBpO1xuICBsZXQgbDtcblxuICAvLyBGb3JjZSBhbiBhcnJheSBpZiBub3QgYWxyZWFkeSBzb21ldGhpbmcgaXRlcmFibGVcbiAgaWYgKHR5cGVvZiBvYmogIT09ICdvYmplY3QnKSB7XG4gICAgLyplc2xpbnQgbm8tcGFyYW0tcmVhc3NpZ246MCovXG4gICAgb2JqID0gW29ial07XG4gIH1cblxuICBpZiAoaXNBcnJheShvYmopKSB7XG4gICAgLy8gSXRlcmF0ZSBvdmVyIGFycmF5IHZhbHVlc1xuICAgIGZvciAoaSA9IDAsIGwgPSBvYmoubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICBmbi5jYWxsKG51bGwsIG9ialtpXSwgaSwgb2JqKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gSXRlcmF0ZSBvdmVyIG9iamVjdCBrZXlzXG4gICAgY29uc3Qga2V5cyA9IGFsbE93bktleXMgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhvYmopIDogT2JqZWN0LmtleXMob2JqKTtcbiAgICBjb25zdCBsZW4gPSBrZXlzLmxlbmd0aDtcbiAgICBsZXQga2V5O1xuXG4gICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBrZXkgPSBrZXlzW2ldO1xuICAgICAgZm4uY2FsbChudWxsLCBvYmpba2V5XSwga2V5LCBvYmopO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5kS2V5KG9iaiwga2V5KSB7XG4gIGtleSA9IGtleS50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMob2JqKTtcbiAgbGV0IGkgPSBrZXlzLmxlbmd0aDtcbiAgbGV0IF9rZXk7XG4gIHdoaWxlIChpLS0gPiAwKSB7XG4gICAgX2tleSA9IGtleXNbaV07XG4gICAgaWYgKGtleSA9PT0gX2tleS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICByZXR1cm4gX2tleTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbmNvbnN0IF9nbG9iYWwgPSAoKCkgPT4ge1xuICAvKmVzbGludCBuby11bmRlZjowKi9cbiAgaWYgKHR5cGVvZiBnbG9iYWxUaGlzICE9PSBcInVuZGVmaW5lZFwiKSByZXR1cm4gZ2xvYmFsVGhpcztcbiAgcmV0dXJuIHR5cGVvZiBzZWxmICE9PSBcInVuZGVmaW5lZFwiID8gc2VsZiA6ICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyA/IHdpbmRvdyA6IGdsb2JhbClcbn0pKCk7XG5cbmNvbnN0IGlzQ29udGV4dERlZmluZWQgPSAoY29udGV4dCkgPT4gIWlzVW5kZWZpbmVkKGNvbnRleHQpICYmIGNvbnRleHQgIT09IF9nbG9iYWw7XG5cbi8qKlxuICogQWNjZXB0cyB2YXJhcmdzIGV4cGVjdGluZyBlYWNoIGFyZ3VtZW50IHRvIGJlIGFuIG9iamVjdCwgdGhlblxuICogaW1tdXRhYmx5IG1lcmdlcyB0aGUgcHJvcGVydGllcyBvZiBlYWNoIG9iamVjdCBhbmQgcmV0dXJucyByZXN1bHQuXG4gKlxuICogV2hlbiBtdWx0aXBsZSBvYmplY3RzIGNvbnRhaW4gdGhlIHNhbWUga2V5IHRoZSBsYXRlciBvYmplY3QgaW5cbiAqIHRoZSBhcmd1bWVudHMgbGlzdCB3aWxsIHRha2UgcHJlY2VkZW5jZS5cbiAqXG4gKiBFeGFtcGxlOlxuICpcbiAqIGBgYGpzXG4gKiB2YXIgcmVzdWx0ID0gbWVyZ2Uoe2ZvbzogMTIzfSwge2ZvbzogNDU2fSk7XG4gKiBjb25zb2xlLmxvZyhyZXN1bHQuZm9vKTsgLy8gb3V0cHV0cyA0NTZcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmoxIE9iamVjdCB0byBtZXJnZVxuICpcbiAqIEByZXR1cm5zIHtPYmplY3R9IFJlc3VsdCBvZiBhbGwgbWVyZ2UgcHJvcGVydGllc1xuICovXG5mdW5jdGlvbiBtZXJnZSgvKiBvYmoxLCBvYmoyLCBvYmozLCAuLi4gKi8pIHtcbiAgY29uc3Qge2Nhc2VsZXNzfSA9IGlzQ29udGV4dERlZmluZWQodGhpcykgJiYgdGhpcyB8fCB7fTtcbiAgY29uc3QgcmVzdWx0ID0ge307XG4gIGNvbnN0IGFzc2lnblZhbHVlID0gKHZhbCwga2V5KSA9PiB7XG4gICAgY29uc3QgdGFyZ2V0S2V5ID0gY2FzZWxlc3MgJiYgZmluZEtleShyZXN1bHQsIGtleSkgfHwga2V5O1xuICAgIGlmIChpc1BsYWluT2JqZWN0KHJlc3VsdFt0YXJnZXRLZXldKSAmJiBpc1BsYWluT2JqZWN0KHZhbCkpIHtcbiAgICAgIHJlc3VsdFt0YXJnZXRLZXldID0gbWVyZ2UocmVzdWx0W3RhcmdldEtleV0sIHZhbCk7XG4gICAgfSBlbHNlIGlmIChpc1BsYWluT2JqZWN0KHZhbCkpIHtcbiAgICAgIHJlc3VsdFt0YXJnZXRLZXldID0gbWVyZ2Uoe30sIHZhbCk7XG4gICAgfSBlbHNlIGlmIChpc0FycmF5KHZhbCkpIHtcbiAgICAgIHJlc3VsdFt0YXJnZXRLZXldID0gdmFsLnNsaWNlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdFt0YXJnZXRLZXldID0gdmFsO1xuICAgIH1cbiAgfTtcblxuICBmb3IgKGxldCBpID0gMCwgbCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBhcmd1bWVudHNbaV0gJiYgZm9yRWFjaChhcmd1bWVudHNbaV0sIGFzc2lnblZhbHVlKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIEV4dGVuZHMgb2JqZWN0IGEgYnkgbXV0YWJseSBhZGRpbmcgdG8gaXQgdGhlIHByb3BlcnRpZXMgb2Ygb2JqZWN0IGIuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGEgVGhlIG9iamVjdCB0byBiZSBleHRlbmRlZFxuICogQHBhcmFtIHtPYmplY3R9IGIgVGhlIG9iamVjdCB0byBjb3B5IHByb3BlcnRpZXMgZnJvbVxuICogQHBhcmFtIHtPYmplY3R9IHRoaXNBcmcgVGhlIG9iamVjdCB0byBiaW5kIGZ1bmN0aW9uIHRvXG4gKlxuICogQHBhcmFtIHtCb29sZWFufSBbYWxsT3duS2V5c11cbiAqIEByZXR1cm5zIHtPYmplY3R9IFRoZSByZXN1bHRpbmcgdmFsdWUgb2Ygb2JqZWN0IGFcbiAqL1xuY29uc3QgZXh0ZW5kID0gKGEsIGIsIHRoaXNBcmcsIHthbGxPd25LZXlzfT0ge30pID0+IHtcbiAgZm9yRWFjaChiLCAodmFsLCBrZXkpID0+IHtcbiAgICBpZiAodGhpc0FyZyAmJiBpc0Z1bmN0aW9uKHZhbCkpIHtcbiAgICAgIGFba2V5XSA9IGJpbmQodmFsLCB0aGlzQXJnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYVtrZXldID0gdmFsO1xuICAgIH1cbiAgfSwge2FsbE93bktleXN9KTtcbiAgcmV0dXJuIGE7XG59O1xuXG4vKipcbiAqIFJlbW92ZSBieXRlIG9yZGVyIG1hcmtlci4gVGhpcyBjYXRjaGVzIEVGIEJCIEJGICh0aGUgVVRGLTggQk9NKVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb250ZW50IHdpdGggQk9NXG4gKlxuICogQHJldHVybnMge3N0cmluZ30gY29udGVudCB2YWx1ZSB3aXRob3V0IEJPTVxuICovXG5jb25zdCBzdHJpcEJPTSA9IChjb250ZW50KSA9PiB7XG4gIGlmIChjb250ZW50LmNoYXJDb2RlQXQoMCkgPT09IDB4RkVGRikge1xuICAgIGNvbnRlbnQgPSBjb250ZW50LnNsaWNlKDEpO1xuICB9XG4gIHJldHVybiBjb250ZW50O1xufTtcblxuLyoqXG4gKiBJbmhlcml0IHRoZSBwcm90b3R5cGUgbWV0aG9kcyBmcm9tIG9uZSBjb25zdHJ1Y3RvciBpbnRvIGFub3RoZXJcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBzdXBlckNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge29iamVjdH0gW3Byb3BzXVxuICogQHBhcmFtIHtvYmplY3R9IFtkZXNjcmlwdG9yc11cbiAqXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuY29uc3QgaW5oZXJpdHMgPSAoY29uc3RydWN0b3IsIHN1cGVyQ29uc3RydWN0b3IsIHByb3BzLCBkZXNjcmlwdG9ycykgPT4ge1xuICBjb25zdHJ1Y3Rvci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ29uc3RydWN0b3IucHJvdG90eXBlLCBkZXNjcmlwdG9ycyk7XG4gIGNvbnN0cnVjdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGNvbnN0cnVjdG9yO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29uc3RydWN0b3IsICdzdXBlcicsIHtcbiAgICB2YWx1ZTogc3VwZXJDb25zdHJ1Y3Rvci5wcm90b3R5cGVcbiAgfSk7XG4gIHByb3BzICYmIE9iamVjdC5hc3NpZ24oY29uc3RydWN0b3IucHJvdG90eXBlLCBwcm9wcyk7XG59O1xuXG4vKipcbiAqIFJlc29sdmUgb2JqZWN0IHdpdGggZGVlcCBwcm90b3R5cGUgY2hhaW4gdG8gYSBmbGF0IG9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZU9iaiBzb3VyY2Ugb2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gW2Rlc3RPYmpdXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufEJvb2xlYW59IFtmaWx0ZXJdXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJvcEZpbHRlcl1cbiAqXG4gKiBAcmV0dXJucyB7T2JqZWN0fVxuICovXG5jb25zdCB0b0ZsYXRPYmplY3QgPSAoc291cmNlT2JqLCBkZXN0T2JqLCBmaWx0ZXIsIHByb3BGaWx0ZXIpID0+IHtcbiAgbGV0IHByb3BzO1xuICBsZXQgaTtcbiAgbGV0IHByb3A7XG4gIGNvbnN0IG1lcmdlZCA9IHt9O1xuXG4gIGRlc3RPYmogPSBkZXN0T2JqIHx8IHt9O1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZXEtbnVsbCxlcWVxZXFcbiAgaWYgKHNvdXJjZU9iaiA9PSBudWxsKSByZXR1cm4gZGVzdE9iajtcblxuICBkbyB7XG4gICAgcHJvcHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhzb3VyY2VPYmopO1xuICAgIGkgPSBwcm9wcy5sZW5ndGg7XG4gICAgd2hpbGUgKGktLSA+IDApIHtcbiAgICAgIHByb3AgPSBwcm9wc1tpXTtcbiAgICAgIGlmICgoIXByb3BGaWx0ZXIgfHwgcHJvcEZpbHRlcihwcm9wLCBzb3VyY2VPYmosIGRlc3RPYmopKSAmJiAhbWVyZ2VkW3Byb3BdKSB7XG4gICAgICAgIGRlc3RPYmpbcHJvcF0gPSBzb3VyY2VPYmpbcHJvcF07XG4gICAgICAgIG1lcmdlZFtwcm9wXSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHNvdXJjZU9iaiA9IGZpbHRlciAhPT0gZmFsc2UgJiYgZ2V0UHJvdG90eXBlT2Yoc291cmNlT2JqKTtcbiAgfSB3aGlsZSAoc291cmNlT2JqICYmICghZmlsdGVyIHx8IGZpbHRlcihzb3VyY2VPYmosIGRlc3RPYmopKSAmJiBzb3VyY2VPYmogIT09IE9iamVjdC5wcm90b3R5cGUpO1xuXG4gIHJldHVybiBkZXN0T2JqO1xufTtcblxuLyoqXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgYSBzdHJpbmcgZW5kcyB3aXRoIHRoZSBjaGFyYWN0ZXJzIG9mIGEgc3BlY2lmaWVkIHN0cmluZ1xuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBzZWFyY2hTdHJpbmdcbiAqIEBwYXJhbSB7TnVtYmVyfSBbcG9zaXRpb249IDBdXG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGVuZHNXaXRoID0gKHN0ciwgc2VhcmNoU3RyaW5nLCBwb3NpdGlvbikgPT4ge1xuICBzdHIgPSBTdHJpbmcoc3RyKTtcbiAgaWYgKHBvc2l0aW9uID09PSB1bmRlZmluZWQgfHwgcG9zaXRpb24gPiBzdHIubGVuZ3RoKSB7XG4gICAgcG9zaXRpb24gPSBzdHIubGVuZ3RoO1xuICB9XG4gIHBvc2l0aW9uIC09IHNlYXJjaFN0cmluZy5sZW5ndGg7XG4gIGNvbnN0IGxhc3RJbmRleCA9IHN0ci5pbmRleE9mKHNlYXJjaFN0cmluZywgcG9zaXRpb24pO1xuICByZXR1cm4gbGFzdEluZGV4ICE9PSAtMSAmJiBsYXN0SW5kZXggPT09IHBvc2l0aW9uO1xufTtcblxuXG4vKipcbiAqIFJldHVybnMgbmV3IGFycmF5IGZyb20gYXJyYXkgbGlrZSBvYmplY3Qgb3IgbnVsbCBpZiBmYWlsZWRcbiAqXG4gKiBAcGFyYW0geyp9IFt0aGluZ11cbiAqXG4gKiBAcmV0dXJucyB7P0FycmF5fVxuICovXG5jb25zdCB0b0FycmF5ID0gKHRoaW5nKSA9PiB7XG4gIGlmICghdGhpbmcpIHJldHVybiBudWxsO1xuICBpZiAoaXNBcnJheSh0aGluZykpIHJldHVybiB0aGluZztcbiAgbGV0IGkgPSB0aGluZy5sZW5ndGg7XG4gIGlmICghaXNOdW1iZXIoaSkpIHJldHVybiBudWxsO1xuICBjb25zdCBhcnIgPSBuZXcgQXJyYXkoaSk7XG4gIHdoaWxlIChpLS0gPiAwKSB7XG4gICAgYXJyW2ldID0gdGhpbmdbaV07XG4gIH1cbiAgcmV0dXJuIGFycjtcbn07XG5cbi8qKlxuICogQ2hlY2tpbmcgaWYgdGhlIFVpbnQ4QXJyYXkgZXhpc3RzIGFuZCBpZiBpdCBkb2VzLCBpdCByZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCBjaGVja3MgaWYgdGhlXG4gKiB0aGluZyBwYXNzZWQgaW4gaXMgYW4gaW5zdGFuY2Ugb2YgVWludDhBcnJheVxuICpcbiAqIEBwYXJhbSB7VHlwZWRBcnJheX1cbiAqXG4gKiBAcmV0dXJucyB7QXJyYXl9XG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBmdW5jLW5hbWVzXG5jb25zdCBpc1R5cGVkQXJyYXkgPSAoVHlwZWRBcnJheSA9PiB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBmdW5jLW5hbWVzXG4gIHJldHVybiB0aGluZyA9PiB7XG4gICAgcmV0dXJuIFR5cGVkQXJyYXkgJiYgdGhpbmcgaW5zdGFuY2VvZiBUeXBlZEFycmF5O1xuICB9O1xufSkodHlwZW9mIFVpbnQ4QXJyYXkgIT09ICd1bmRlZmluZWQnICYmIGdldFByb3RvdHlwZU9mKFVpbnQ4QXJyYXkpKTtcblxuLyoqXG4gKiBGb3IgZWFjaCBlbnRyeSBpbiB0aGUgb2JqZWN0LCBjYWxsIHRoZSBmdW5jdGlvbiB3aXRoIHRoZSBrZXkgYW5kIHZhbHVlLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0PGFueSwgYW55Pn0gb2JqIC0gVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiAtIFRoZSBmdW5jdGlvbiB0byBjYWxsIGZvciBlYWNoIGVudHJ5LlxuICpcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5jb25zdCBmb3JFYWNoRW50cnkgPSAob2JqLCBmbikgPT4ge1xuICBjb25zdCBnZW5lcmF0b3IgPSBvYmogJiYgb2JqW1N5bWJvbC5pdGVyYXRvcl07XG5cbiAgY29uc3QgaXRlcmF0b3IgPSBnZW5lcmF0b3IuY2FsbChvYmopO1xuXG4gIGxldCByZXN1bHQ7XG5cbiAgd2hpbGUgKChyZXN1bHQgPSBpdGVyYXRvci5uZXh0KCkpICYmICFyZXN1bHQuZG9uZSkge1xuICAgIGNvbnN0IHBhaXIgPSByZXN1bHQudmFsdWU7XG4gICAgZm4uY2FsbChvYmosIHBhaXJbMF0sIHBhaXJbMV0pO1xuICB9XG59O1xuXG4vKipcbiAqIEl0IHRha2VzIGEgcmVndWxhciBleHByZXNzaW9uIGFuZCBhIHN0cmluZywgYW5kIHJldHVybnMgYW4gYXJyYXkgb2YgYWxsIHRoZSBtYXRjaGVzXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHJlZ0V4cCAtIFRoZSByZWd1bGFyIGV4cHJlc3Npb24gdG8gbWF0Y2ggYWdhaW5zdC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHIgLSBUaGUgc3RyaW5nIHRvIHNlYXJjaC5cbiAqXG4gKiBAcmV0dXJucyB7QXJyYXk8Ym9vbGVhbj59XG4gKi9cbmNvbnN0IG1hdGNoQWxsID0gKHJlZ0V4cCwgc3RyKSA9PiB7XG4gIGxldCBtYXRjaGVzO1xuICBjb25zdCBhcnIgPSBbXTtcblxuICB3aGlsZSAoKG1hdGNoZXMgPSByZWdFeHAuZXhlYyhzdHIpKSAhPT0gbnVsbCkge1xuICAgIGFyci5wdXNoKG1hdGNoZXMpO1xuICB9XG5cbiAgcmV0dXJuIGFycjtcbn07XG5cbi8qIENoZWNraW5nIGlmIHRoZSBraW5kT2ZUZXN0IGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSB3aGVuIHBhc3NlZCBhbiBIVE1MRm9ybUVsZW1lbnQuICovXG5jb25zdCBpc0hUTUxGb3JtID0ga2luZE9mVGVzdCgnSFRNTEZvcm1FbGVtZW50Jyk7XG5cbmNvbnN0IHRvQ2FtZWxDYXNlID0gc3RyID0+IHtcbiAgcmV0dXJuIHN0ci50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1stX1xcc10oW2EtelxcZF0pKFxcdyopL2csXG4gICAgZnVuY3Rpb24gcmVwbGFjZXIobSwgcDEsIHAyKSB7XG4gICAgICByZXR1cm4gcDEudG9VcHBlckNhc2UoKSArIHAyO1xuICAgIH1cbiAgKTtcbn07XG5cbi8qIENyZWF0aW5nIGEgZnVuY3Rpb24gdGhhdCB3aWxsIGNoZWNrIGlmIGFuIG9iamVjdCBoYXMgYSBwcm9wZXJ0eS4gKi9cbmNvbnN0IGhhc093blByb3BlcnR5ID0gKCh7aGFzT3duUHJvcGVydHl9KSA9PiAob2JqLCBwcm9wKSA9PiBoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCkpKE9iamVjdC5wcm90b3R5cGUpO1xuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgUmVnRXhwIG9iamVjdFxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBSZWdFeHAgb2JqZWN0LCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuY29uc3QgaXNSZWdFeHAgPSBraW5kT2ZUZXN0KCdSZWdFeHAnKTtcblxuY29uc3QgcmVkdWNlRGVzY3JpcHRvcnMgPSAob2JqLCByZWR1Y2VyKSA9PiB7XG4gIGNvbnN0IGRlc2NyaXB0b3JzID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMob2JqKTtcbiAgY29uc3QgcmVkdWNlZERlc2NyaXB0b3JzID0ge307XG5cbiAgZm9yRWFjaChkZXNjcmlwdG9ycywgKGRlc2NyaXB0b3IsIG5hbWUpID0+IHtcbiAgICBsZXQgcmV0O1xuICAgIGlmICgocmV0ID0gcmVkdWNlcihkZXNjcmlwdG9yLCBuYW1lLCBvYmopKSAhPT0gZmFsc2UpIHtcbiAgICAgIHJlZHVjZWREZXNjcmlwdG9yc1tuYW1lXSA9IHJldCB8fCBkZXNjcmlwdG9yO1xuICAgIH1cbiAgfSk7XG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMob2JqLCByZWR1Y2VkRGVzY3JpcHRvcnMpO1xufTtcblxuLyoqXG4gKiBNYWtlcyBhbGwgbWV0aG9kcyByZWFkLW9ubHlcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmpcbiAqL1xuXG5jb25zdCBmcmVlemVNZXRob2RzID0gKG9iaikgPT4ge1xuICByZWR1Y2VEZXNjcmlwdG9ycyhvYmosIChkZXNjcmlwdG9yLCBuYW1lKSA9PiB7XG4gICAgLy8gc2tpcCByZXN0cmljdGVkIHByb3BzIGluIHN0cmljdCBtb2RlXG4gICAgaWYgKGlzRnVuY3Rpb24ob2JqKSAmJiBbJ2FyZ3VtZW50cycsICdjYWxsZXInLCAnY2FsbGVlJ10uaW5kZXhPZihuYW1lKSAhPT0gLTEpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCB2YWx1ZSA9IG9ialtuYW1lXTtcblxuICAgIGlmICghaXNGdW5jdGlvbih2YWx1ZSkpIHJldHVybjtcblxuICAgIGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGZhbHNlO1xuXG4gICAgaWYgKCd3cml0YWJsZScgaW4gZGVzY3JpcHRvcikge1xuICAgICAgZGVzY3JpcHRvci53cml0YWJsZSA9IGZhbHNlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghZGVzY3JpcHRvci5zZXQpIHtcbiAgICAgIGRlc2NyaXB0b3Iuc2V0ID0gKCkgPT4ge1xuICAgICAgICB0aHJvdyBFcnJvcignQ2FuIG5vdCByZXdyaXRlIHJlYWQtb25seSBtZXRob2QgXFwnJyArIG5hbWUgKyAnXFwnJyk7XG4gICAgICB9O1xuICAgIH1cbiAgfSk7XG59O1xuXG5jb25zdCB0b09iamVjdFNldCA9IChhcnJheU9yU3RyaW5nLCBkZWxpbWl0ZXIpID0+IHtcbiAgY29uc3Qgb2JqID0ge307XG5cbiAgY29uc3QgZGVmaW5lID0gKGFycikgPT4ge1xuICAgIGFyci5mb3JFYWNoKHZhbHVlID0+IHtcbiAgICAgIG9ialt2YWx1ZV0gPSB0cnVlO1xuICAgIH0pO1xuICB9O1xuXG4gIGlzQXJyYXkoYXJyYXlPclN0cmluZykgPyBkZWZpbmUoYXJyYXlPclN0cmluZykgOiBkZWZpbmUoU3RyaW5nKGFycmF5T3JTdHJpbmcpLnNwbGl0KGRlbGltaXRlcikpO1xuXG4gIHJldHVybiBvYmo7XG59O1xuXG5jb25zdCBub29wID0gKCkgPT4ge307XG5cbmNvbnN0IHRvRmluaXRlTnVtYmVyID0gKHZhbHVlLCBkZWZhdWx0VmFsdWUpID0+IHtcbiAgcmV0dXJuIHZhbHVlICE9IG51bGwgJiYgTnVtYmVyLmlzRmluaXRlKHZhbHVlID0gK3ZhbHVlKSA/IHZhbHVlIDogZGVmYXVsdFZhbHVlO1xufTtcblxuLyoqXG4gKiBJZiB0aGUgdGhpbmcgaXMgYSBGb3JtRGF0YSBvYmplY3QsIHJldHVybiB0cnVlLCBvdGhlcndpc2UgcmV0dXJuIGZhbHNlLlxuICpcbiAqIEBwYXJhbSB7dW5rbm93bn0gdGhpbmcgLSBUaGUgdGhpbmcgdG8gY2hlY2suXG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGlzU3BlY0NvbXBsaWFudEZvcm0odGhpbmcpIHtcbiAgcmV0dXJuICEhKHRoaW5nICYmIGlzRnVuY3Rpb24odGhpbmcuYXBwZW5kKSAmJiB0aGluZ1tTeW1ib2wudG9TdHJpbmdUYWddID09PSAnRm9ybURhdGEnICYmIHRoaW5nW1N5bWJvbC5pdGVyYXRvcl0pO1xufVxuXG5jb25zdCB0b0pTT05PYmplY3QgPSAob2JqKSA9PiB7XG4gIGNvbnN0IHN0YWNrID0gbmV3IEFycmF5KDEwKTtcblxuICBjb25zdCB2aXNpdCA9IChzb3VyY2UsIGkpID0+IHtcblxuICAgIGlmIChpc09iamVjdChzb3VyY2UpKSB7XG4gICAgICBpZiAoc3RhY2suaW5kZXhPZihzb3VyY2UpID49IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZighKCd0b0pTT04nIGluIHNvdXJjZSkpIHtcbiAgICAgICAgc3RhY2tbaV0gPSBzb3VyY2U7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IGlzQXJyYXkoc291cmNlKSA/IFtdIDoge307XG5cbiAgICAgICAgZm9yRWFjaChzb3VyY2UsICh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICAgICAgY29uc3QgcmVkdWNlZFZhbHVlID0gdmlzaXQodmFsdWUsIGkgKyAxKTtcbiAgICAgICAgICAhaXNVbmRlZmluZWQocmVkdWNlZFZhbHVlKSAmJiAodGFyZ2V0W2tleV0gPSByZWR1Y2VkVmFsdWUpO1xuICAgICAgICB9KTtcblxuICAgICAgICBzdGFja1tpXSA9IHVuZGVmaW5lZDtcblxuICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzb3VyY2U7XG4gIH07XG5cbiAgcmV0dXJuIHZpc2l0KG9iaiwgMCk7XG59O1xuXG5jb25zdCBpc0FzeW5jRm4gPSBraW5kT2ZUZXN0KCdBc3luY0Z1bmN0aW9uJyk7XG5cbmNvbnN0IGlzVGhlbmFibGUgPSAodGhpbmcpID0+XG4gIHRoaW5nICYmIChpc09iamVjdCh0aGluZykgfHwgaXNGdW5jdGlvbih0aGluZykpICYmIGlzRnVuY3Rpb24odGhpbmcudGhlbikgJiYgaXNGdW5jdGlvbih0aGluZy5jYXRjaCk7XG5cbi8vIG9yaWdpbmFsIGNvZGVcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9EaWdpdGFsQnJhaW5KUy9BeGlvc1Byb21pc2UvYmxvYi8xNmRlYWIxMzcxMGVjMDk3Nzk5MjIxMzFmM2ZhNTk1NDMyMGY4M2FiL2xpYi91dGlscy5qcyNMMTEtTDM0XG5cbmNvbnN0IF9zZXRJbW1lZGlhdGUgPSAoKHNldEltbWVkaWF0ZVN1cHBvcnRlZCwgcG9zdE1lc3NhZ2VTdXBwb3J0ZWQpID0+IHtcbiAgaWYgKHNldEltbWVkaWF0ZVN1cHBvcnRlZCkge1xuICAgIHJldHVybiBzZXRJbW1lZGlhdGU7XG4gIH1cblxuICByZXR1cm4gcG9zdE1lc3NhZ2VTdXBwb3J0ZWQgPyAoKHRva2VuLCBjYWxsYmFja3MpID0+IHtcbiAgICBfZ2xvYmFsLmFkZEV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsICh7c291cmNlLCBkYXRhfSkgPT4ge1xuICAgICAgaWYgKHNvdXJjZSA9PT0gX2dsb2JhbCAmJiBkYXRhID09PSB0b2tlbikge1xuICAgICAgICBjYWxsYmFja3MubGVuZ3RoICYmIGNhbGxiYWNrcy5zaGlmdCgpKCk7XG4gICAgICB9XG4gICAgfSwgZmFsc2UpO1xuXG4gICAgcmV0dXJuIChjYikgPT4ge1xuICAgICAgY2FsbGJhY2tzLnB1c2goY2IpO1xuICAgICAgX2dsb2JhbC5wb3N0TWVzc2FnZSh0b2tlbiwgXCIqXCIpO1xuICAgIH1cbiAgfSkoYGF4aW9zQCR7TWF0aC5yYW5kb20oKX1gLCBbXSkgOiAoY2IpID0+IHNldFRpbWVvdXQoY2IpO1xufSkoXG4gIHR5cGVvZiBzZXRJbW1lZGlhdGUgPT09ICdmdW5jdGlvbicsXG4gIGlzRnVuY3Rpb24oX2dsb2JhbC5wb3N0TWVzc2FnZSlcbik7XG5cbmNvbnN0IGFzYXAgPSB0eXBlb2YgcXVldWVNaWNyb3Rhc2sgIT09ICd1bmRlZmluZWQnID9cbiAgcXVldWVNaWNyb3Rhc2suYmluZChfZ2xvYmFsKSA6ICggdHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmIHByb2Nlc3MubmV4dFRpY2sgfHwgX3NldEltbWVkaWF0ZSk7XG5cbi8vICoqKioqKioqKioqKioqKioqKioqKlxuXG52YXIgdXRpbHMkMSA9IHtcbiAgaXNBcnJheSxcbiAgaXNBcnJheUJ1ZmZlcixcbiAgaXNCdWZmZXIsXG4gIGlzRm9ybURhdGEsXG4gIGlzQXJyYXlCdWZmZXJWaWV3LFxuICBpc1N0cmluZyxcbiAgaXNOdW1iZXIsXG4gIGlzQm9vbGVhbixcbiAgaXNPYmplY3QsXG4gIGlzUGxhaW5PYmplY3QsXG4gIGlzUmVhZGFibGVTdHJlYW0sXG4gIGlzUmVxdWVzdCxcbiAgaXNSZXNwb25zZSxcbiAgaXNIZWFkZXJzLFxuICBpc1VuZGVmaW5lZCxcbiAgaXNEYXRlLFxuICBpc0ZpbGUsXG4gIGlzQmxvYixcbiAgaXNSZWdFeHAsXG4gIGlzRnVuY3Rpb24sXG4gIGlzU3RyZWFtLFxuICBpc1VSTFNlYXJjaFBhcmFtcyxcbiAgaXNUeXBlZEFycmF5LFxuICBpc0ZpbGVMaXN0LFxuICBmb3JFYWNoLFxuICBtZXJnZSxcbiAgZXh0ZW5kLFxuICB0cmltLFxuICBzdHJpcEJPTSxcbiAgaW5oZXJpdHMsXG4gIHRvRmxhdE9iamVjdCxcbiAga2luZE9mLFxuICBraW5kT2ZUZXN0LFxuICBlbmRzV2l0aCxcbiAgdG9BcnJheSxcbiAgZm9yRWFjaEVudHJ5LFxuICBtYXRjaEFsbCxcbiAgaXNIVE1MRm9ybSxcbiAgaGFzT3duUHJvcGVydHksXG4gIGhhc093blByb3A6IGhhc093blByb3BlcnR5LCAvLyBhbiBhbGlhcyB0byBhdm9pZCBFU0xpbnQgbm8tcHJvdG90eXBlLWJ1aWx0aW5zIGRldGVjdGlvblxuICByZWR1Y2VEZXNjcmlwdG9ycyxcbiAgZnJlZXplTWV0aG9kcyxcbiAgdG9PYmplY3RTZXQsXG4gIHRvQ2FtZWxDYXNlLFxuICBub29wLFxuICB0b0Zpbml0ZU51bWJlcixcbiAgZmluZEtleSxcbiAgZ2xvYmFsOiBfZ2xvYmFsLFxuICBpc0NvbnRleHREZWZpbmVkLFxuICBpc1NwZWNDb21wbGlhbnRGb3JtLFxuICB0b0pTT05PYmplY3QsXG4gIGlzQXN5bmNGbixcbiAgaXNUaGVuYWJsZSxcbiAgc2V0SW1tZWRpYXRlOiBfc2V0SW1tZWRpYXRlLFxuICBhc2FwXG59O1xuXG4vKipcbiAqIENyZWF0ZSBhbiBFcnJvciB3aXRoIHRoZSBzcGVjaWZpZWQgbWVzc2FnZSwgY29uZmlnLCBlcnJvciBjb2RlLCByZXF1ZXN0IGFuZCByZXNwb25zZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZSBUaGUgZXJyb3IgbWVzc2FnZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbY29kZV0gVGhlIGVycm9yIGNvZGUgKGZvciBleGFtcGxlLCAnRUNPTk5BQk9SVEVEJykuXG4gKiBAcGFyYW0ge09iamVjdH0gW2NvbmZpZ10gVGhlIGNvbmZpZy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbcmVxdWVzdF0gVGhlIHJlcXVlc3QuXG4gKiBAcGFyYW0ge09iamVjdH0gW3Jlc3BvbnNlXSBUaGUgcmVzcG9uc2UuXG4gKlxuICogQHJldHVybnMge0Vycm9yfSBUaGUgY3JlYXRlZCBlcnJvci5cbiAqL1xuZnVuY3Rpb24gQXhpb3NFcnJvcihtZXNzYWdlLCBjb2RlLCBjb25maWcsIHJlcXVlc3QsIHJlc3BvbnNlKSB7XG4gIEVycm9yLmNhbGwodGhpcyk7XG5cbiAgaWYgKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKSB7XG4gICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgdGhpcy5jb25zdHJ1Y3Rvcik7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5zdGFjayA9IChuZXcgRXJyb3IoKSkuc3RhY2s7XG4gIH1cblxuICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICB0aGlzLm5hbWUgPSAnQXhpb3NFcnJvcic7XG4gIGNvZGUgJiYgKHRoaXMuY29kZSA9IGNvZGUpO1xuICBjb25maWcgJiYgKHRoaXMuY29uZmlnID0gY29uZmlnKTtcbiAgcmVxdWVzdCAmJiAodGhpcy5yZXF1ZXN0ID0gcmVxdWVzdCk7XG4gIGlmIChyZXNwb25zZSkge1xuICAgIHRoaXMucmVzcG9uc2UgPSByZXNwb25zZTtcbiAgICB0aGlzLnN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cyA/IHJlc3BvbnNlLnN0YXR1cyA6IG51bGw7XG4gIH1cbn1cblxudXRpbHMkMS5pbmhlcml0cyhBeGlvc0Vycm9yLCBFcnJvciwge1xuICB0b0pTT046IGZ1bmN0aW9uIHRvSlNPTigpIHtcbiAgICByZXR1cm4ge1xuICAgICAgLy8gU3RhbmRhcmRcbiAgICAgIG1lc3NhZ2U6IHRoaXMubWVzc2FnZSxcbiAgICAgIG5hbWU6IHRoaXMubmFtZSxcbiAgICAgIC8vIE1pY3Jvc29mdFxuICAgICAgZGVzY3JpcHRpb246IHRoaXMuZGVzY3JpcHRpb24sXG4gICAgICBudW1iZXI6IHRoaXMubnVtYmVyLFxuICAgICAgLy8gTW96aWxsYVxuICAgICAgZmlsZU5hbWU6IHRoaXMuZmlsZU5hbWUsXG4gICAgICBsaW5lTnVtYmVyOiB0aGlzLmxpbmVOdW1iZXIsXG4gICAgICBjb2x1bW5OdW1iZXI6IHRoaXMuY29sdW1uTnVtYmVyLFxuICAgICAgc3RhY2s6IHRoaXMuc3RhY2ssXG4gICAgICAvLyBBeGlvc1xuICAgICAgY29uZmlnOiB1dGlscyQxLnRvSlNPTk9iamVjdCh0aGlzLmNvbmZpZyksXG4gICAgICBjb2RlOiB0aGlzLmNvZGUsXG4gICAgICBzdGF0dXM6IHRoaXMuc3RhdHVzXG4gICAgfTtcbiAgfVxufSk7XG5cbmNvbnN0IHByb3RvdHlwZSQxID0gQXhpb3NFcnJvci5wcm90b3R5cGU7XG5jb25zdCBkZXNjcmlwdG9ycyA9IHt9O1xuXG5bXG4gICdFUlJfQkFEX09QVElPTl9WQUxVRScsXG4gICdFUlJfQkFEX09QVElPTicsXG4gICdFQ09OTkFCT1JURUQnLFxuICAnRVRJTUVET1VUJyxcbiAgJ0VSUl9ORVRXT1JLJyxcbiAgJ0VSUl9GUl9UT09fTUFOWV9SRURJUkVDVFMnLFxuICAnRVJSX0RFUFJFQ0FURUQnLFxuICAnRVJSX0JBRF9SRVNQT05TRScsXG4gICdFUlJfQkFEX1JFUVVFU1QnLFxuICAnRVJSX0NBTkNFTEVEJyxcbiAgJ0VSUl9OT1RfU1VQUE9SVCcsXG4gICdFUlJfSU5WQUxJRF9VUkwnXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZnVuYy1uYW1lc1xuXS5mb3JFYWNoKGNvZGUgPT4ge1xuICBkZXNjcmlwdG9yc1tjb2RlXSA9IHt2YWx1ZTogY29kZX07XG59KTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoQXhpb3NFcnJvciwgZGVzY3JpcHRvcnMpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb3RvdHlwZSQxLCAnaXNBeGlvc0Vycm9yJywge3ZhbHVlOiB0cnVlfSk7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBmdW5jLW5hbWVzXG5BeGlvc0Vycm9yLmZyb20gPSAoZXJyb3IsIGNvZGUsIGNvbmZpZywgcmVxdWVzdCwgcmVzcG9uc2UsIGN1c3RvbVByb3BzKSA9PiB7XG4gIGNvbnN0IGF4aW9zRXJyb3IgPSBPYmplY3QuY3JlYXRlKHByb3RvdHlwZSQxKTtcblxuICB1dGlscyQxLnRvRmxhdE9iamVjdChlcnJvciwgYXhpb3NFcnJvciwgZnVuY3Rpb24gZmlsdGVyKG9iaikge1xuICAgIHJldHVybiBvYmogIT09IEVycm9yLnByb3RvdHlwZTtcbiAgfSwgcHJvcCA9PiB7XG4gICAgcmV0dXJuIHByb3AgIT09ICdpc0F4aW9zRXJyb3InO1xuICB9KTtcblxuICBBeGlvc0Vycm9yLmNhbGwoYXhpb3NFcnJvciwgZXJyb3IubWVzc2FnZSwgY29kZSwgY29uZmlnLCByZXF1ZXN0LCByZXNwb25zZSk7XG5cbiAgYXhpb3NFcnJvci5jYXVzZSA9IGVycm9yO1xuXG4gIGF4aW9zRXJyb3IubmFtZSA9IGVycm9yLm5hbWU7XG5cbiAgY3VzdG9tUHJvcHMgJiYgT2JqZWN0LmFzc2lnbihheGlvc0Vycm9yLCBjdXN0b21Qcm9wcyk7XG5cbiAgcmV0dXJuIGF4aW9zRXJyb3I7XG59O1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgc3RyaWN0XG52YXIgaHR0cEFkYXB0ZXIgPSBudWxsO1xuXG4vKipcbiAqIERldGVybWluZXMgaWYgdGhlIGdpdmVuIHRoaW5nIGlzIGEgYXJyYXkgb3IganMgb2JqZWN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0aGluZyAtIFRoZSBvYmplY3Qgb3IgYXJyYXkgdG8gYmUgdmlzaXRlZC5cbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaXNWaXNpdGFibGUodGhpbmcpIHtcbiAgcmV0dXJuIHV0aWxzJDEuaXNQbGFpbk9iamVjdCh0aGluZykgfHwgdXRpbHMkMS5pc0FycmF5KHRoaW5nKTtcbn1cblxuLyoqXG4gKiBJdCByZW1vdmVzIHRoZSBicmFja2V0cyBmcm9tIHRoZSBlbmQgb2YgYSBzdHJpbmdcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIGtleSBvZiB0aGUgcGFyYW1ldGVyLlxuICpcbiAqIEByZXR1cm5zIHtzdHJpbmd9IHRoZSBrZXkgd2l0aG91dCB0aGUgYnJhY2tldHMuXG4gKi9cbmZ1bmN0aW9uIHJlbW92ZUJyYWNrZXRzKGtleSkge1xuICByZXR1cm4gdXRpbHMkMS5lbmRzV2l0aChrZXksICdbXScpID8ga2V5LnNsaWNlKDAsIC0yKSA6IGtleTtcbn1cblxuLyoqXG4gKiBJdCB0YWtlcyBhIHBhdGgsIGEga2V5LCBhbmQgYSBib29sZWFuLCBhbmQgcmV0dXJucyBhIHN0cmluZ1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIC0gVGhlIHBhdGggdG8gdGhlIGN1cnJlbnQga2V5LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSBrZXkgb2YgdGhlIGN1cnJlbnQgb2JqZWN0IGJlaW5nIGl0ZXJhdGVkIG92ZXIuXG4gKiBAcGFyYW0ge3N0cmluZ30gZG90cyAtIElmIHRydWUsIHRoZSBrZXkgd2lsbCBiZSByZW5kZXJlZCB3aXRoIGRvdHMgaW5zdGVhZCBvZiBicmFja2V0cy5cbiAqXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgcGF0aCB0byB0aGUgY3VycmVudCBrZXkuXG4gKi9cbmZ1bmN0aW9uIHJlbmRlcktleShwYXRoLCBrZXksIGRvdHMpIHtcbiAgaWYgKCFwYXRoKSByZXR1cm4ga2V5O1xuICByZXR1cm4gcGF0aC5jb25jYXQoa2V5KS5tYXAoZnVuY3Rpb24gZWFjaCh0b2tlbiwgaSkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgIHRva2VuID0gcmVtb3ZlQnJhY2tldHModG9rZW4pO1xuICAgIHJldHVybiAhZG90cyAmJiBpID8gJ1snICsgdG9rZW4gKyAnXScgOiB0b2tlbjtcbiAgfSkuam9pbihkb3RzID8gJy4nIDogJycpO1xufVxuXG4vKipcbiAqIElmIHRoZSBhcnJheSBpcyBhbiBhcnJheSBhbmQgbm9uZSBvZiBpdHMgZWxlbWVudHMgYXJlIHZpc2l0YWJsZSwgdGhlbiBpdCdzIGEgZmxhdCBhcnJheS5cbiAqXG4gKiBAcGFyYW0ge0FycmF5PGFueT59IGFyciAtIFRoZSBhcnJheSB0byBjaGVja1xuICpcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5mdW5jdGlvbiBpc0ZsYXRBcnJheShhcnIpIHtcbiAgcmV0dXJuIHV0aWxzJDEuaXNBcnJheShhcnIpICYmICFhcnIuc29tZShpc1Zpc2l0YWJsZSk7XG59XG5cbmNvbnN0IHByZWRpY2F0ZXMgPSB1dGlscyQxLnRvRmxhdE9iamVjdCh1dGlscyQxLCB7fSwgbnVsbCwgZnVuY3Rpb24gZmlsdGVyKHByb3ApIHtcbiAgcmV0dXJuIC9eaXNbQS1aXS8udGVzdChwcm9wKTtcbn0pO1xuXG4vKipcbiAqIENvbnZlcnQgYSBkYXRhIG9iamVjdCB0byBGb3JtRGF0YVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmpcbiAqIEBwYXJhbSB7P09iamVjdH0gW2Zvcm1EYXRhXVxuICogQHBhcmFtIHs/T2JqZWN0fSBbb3B0aW9uc11cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRpb25zLnZpc2l0b3JdXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLm1ldGFUb2tlbnMgPSB0cnVlXVxuICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5kb3RzID0gZmFsc2VdXG4gKiBAcGFyYW0gez9Cb29sZWFufSBbb3B0aW9ucy5pbmRleGVzID0gZmFsc2VdXG4gKlxuICogQHJldHVybnMge09iamVjdH1cbiAqKi9cblxuLyoqXG4gKiBJdCBjb252ZXJ0cyBhbiBvYmplY3QgaW50byBhIEZvcm1EYXRhIG9iamVjdFxuICpcbiAqIEBwYXJhbSB7T2JqZWN0PGFueSwgYW55Pn0gb2JqIC0gVGhlIG9iamVjdCB0byBjb252ZXJ0IHRvIGZvcm0gZGF0YS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBmb3JtRGF0YSAtIFRoZSBGb3JtRGF0YSBvYmplY3QgdG8gYXBwZW5kIHRvLlxuICogQHBhcmFtIHtPYmplY3Q8c3RyaW5nLCBhbnk+fSBvcHRpb25zXG4gKlxuICogQHJldHVybnNcbiAqL1xuZnVuY3Rpb24gdG9Gb3JtRGF0YShvYmosIGZvcm1EYXRhLCBvcHRpb25zKSB7XG4gIGlmICghdXRpbHMkMS5pc09iamVjdChvYmopKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcigndGFyZ2V0IG11c3QgYmUgYW4gb2JqZWN0Jyk7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgZm9ybURhdGEgPSBmb3JtRGF0YSB8fCBuZXcgKEZvcm1EYXRhKSgpO1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICBvcHRpb25zID0gdXRpbHMkMS50b0ZsYXRPYmplY3Qob3B0aW9ucywge1xuICAgIG1ldGFUb2tlbnM6IHRydWUsXG4gICAgZG90czogZmFsc2UsXG4gICAgaW5kZXhlczogZmFsc2VcbiAgfSwgZmFsc2UsIGZ1bmN0aW9uIGRlZmluZWQob3B0aW9uLCBzb3VyY2UpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZXEtbnVsbCxlcWVxZXFcbiAgICByZXR1cm4gIXV0aWxzJDEuaXNVbmRlZmluZWQoc291cmNlW29wdGlvbl0pO1xuICB9KTtcblxuICBjb25zdCBtZXRhVG9rZW5zID0gb3B0aW9ucy5tZXRhVG9rZW5zO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmVcbiAgY29uc3QgdmlzaXRvciA9IG9wdGlvbnMudmlzaXRvciB8fCBkZWZhdWx0VmlzaXRvcjtcbiAgY29uc3QgZG90cyA9IG9wdGlvbnMuZG90cztcbiAgY29uc3QgaW5kZXhlcyA9IG9wdGlvbnMuaW5kZXhlcztcbiAgY29uc3QgX0Jsb2IgPSBvcHRpb25zLkJsb2IgfHwgdHlwZW9mIEJsb2IgIT09ICd1bmRlZmluZWQnICYmIEJsb2I7XG4gIGNvbnN0IHVzZUJsb2IgPSBfQmxvYiAmJiB1dGlscyQxLmlzU3BlY0NvbXBsaWFudEZvcm0oZm9ybURhdGEpO1xuXG4gIGlmICghdXRpbHMkMS5pc0Z1bmN0aW9uKHZpc2l0b3IpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcigndmlzaXRvciBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNvbnZlcnRWYWx1ZSh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkgcmV0dXJuICcnO1xuXG4gICAgaWYgKHV0aWxzJDEuaXNEYXRlKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHZhbHVlLnRvSVNPU3RyaW5nKCk7XG4gICAgfVxuXG4gICAgaWYgKCF1c2VCbG9iICYmIHV0aWxzJDEuaXNCbG9iKHZhbHVlKSkge1xuICAgICAgdGhyb3cgbmV3IEF4aW9zRXJyb3IoJ0Jsb2IgaXMgbm90IHN1cHBvcnRlZC4gVXNlIGEgQnVmZmVyIGluc3RlYWQuJyk7XG4gICAgfVxuXG4gICAgaWYgKHV0aWxzJDEuaXNBcnJheUJ1ZmZlcih2YWx1ZSkgfHwgdXRpbHMkMS5pc1R5cGVkQXJyYXkodmFsdWUpKSB7XG4gICAgICByZXR1cm4gdXNlQmxvYiAmJiB0eXBlb2YgQmxvYiA9PT0gJ2Z1bmN0aW9uJyA/IG5ldyBCbG9iKFt2YWx1ZV0pIDogQnVmZmVyLmZyb20odmFsdWUpO1xuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWZhdWx0IHZpc2l0b3IuXG4gICAqXG4gICAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAgICogQHBhcmFtIHtTdHJpbmd8TnVtYmVyfSBrZXlcbiAgICogQHBhcmFtIHtBcnJheTxTdHJpbmd8TnVtYmVyPn0gcGF0aFxuICAgKiBAdGhpcyB7Rm9ybURhdGF9XG4gICAqXG4gICAqIEByZXR1cm5zIHtib29sZWFufSByZXR1cm4gdHJ1ZSB0byB2aXNpdCB0aGUgZWFjaCBwcm9wIG9mIHRoZSB2YWx1ZSByZWN1cnNpdmVseVxuICAgKi9cbiAgZnVuY3Rpb24gZGVmYXVsdFZpc2l0b3IodmFsdWUsIGtleSwgcGF0aCkge1xuICAgIGxldCBhcnIgPSB2YWx1ZTtcblxuICAgIGlmICh2YWx1ZSAmJiAhcGF0aCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICBpZiAodXRpbHMkMS5lbmRzV2l0aChrZXksICd7fScpKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICBrZXkgPSBtZXRhVG9rZW5zID8ga2V5IDoga2V5LnNsaWNlKDAsIC0yKTtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgIHZhbHVlID0gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgKHV0aWxzJDEuaXNBcnJheSh2YWx1ZSkgJiYgaXNGbGF0QXJyYXkodmFsdWUpKSB8fFxuICAgICAgICAoKHV0aWxzJDEuaXNGaWxlTGlzdCh2YWx1ZSkgfHwgdXRpbHMkMS5lbmRzV2l0aChrZXksICdbXScpKSAmJiAoYXJyID0gdXRpbHMkMS50b0FycmF5KHZhbHVlKSlcbiAgICAgICAgKSkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgICAga2V5ID0gcmVtb3ZlQnJhY2tldHMoa2V5KTtcblxuICAgICAgICBhcnIuZm9yRWFjaChmdW5jdGlvbiBlYWNoKGVsLCBpbmRleCkge1xuICAgICAgICAgICEodXRpbHMkMS5pc1VuZGVmaW5lZChlbCkgfHwgZWwgPT09IG51bGwpICYmIGZvcm1EYXRhLmFwcGVuZChcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXN0ZWQtdGVybmFyeVxuICAgICAgICAgICAgaW5kZXhlcyA9PT0gdHJ1ZSA/IHJlbmRlcktleShba2V5XSwgaW5kZXgsIGRvdHMpIDogKGluZGV4ZXMgPT09IG51bGwgPyBrZXkgOiBrZXkgKyAnW10nKSxcbiAgICAgICAgICAgIGNvbnZlcnRWYWx1ZShlbClcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChpc1Zpc2l0YWJsZSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGZvcm1EYXRhLmFwcGVuZChyZW5kZXJLZXkocGF0aCwga2V5LCBkb3RzKSwgY29udmVydFZhbHVlKHZhbHVlKSk7XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBzdGFjayA9IFtdO1xuXG4gIGNvbnN0IGV4cG9zZWRIZWxwZXJzID0gT2JqZWN0LmFzc2lnbihwcmVkaWNhdGVzLCB7XG4gICAgZGVmYXVsdFZpc2l0b3IsXG4gICAgY29udmVydFZhbHVlLFxuICAgIGlzVmlzaXRhYmxlXG4gIH0pO1xuXG4gIGZ1bmN0aW9uIGJ1aWxkKHZhbHVlLCBwYXRoKSB7XG4gICAgaWYgKHV0aWxzJDEuaXNVbmRlZmluZWQodmFsdWUpKSByZXR1cm47XG5cbiAgICBpZiAoc3RhY2suaW5kZXhPZih2YWx1ZSkgIT09IC0xKSB7XG4gICAgICB0aHJvdyBFcnJvcignQ2lyY3VsYXIgcmVmZXJlbmNlIGRldGVjdGVkIGluICcgKyBwYXRoLmpvaW4oJy4nKSk7XG4gICAgfVxuXG4gICAgc3RhY2sucHVzaCh2YWx1ZSk7XG5cbiAgICB1dGlscyQxLmZvckVhY2godmFsdWUsIGZ1bmN0aW9uIGVhY2goZWwsIGtleSkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gISh1dGlscyQxLmlzVW5kZWZpbmVkKGVsKSB8fCBlbCA9PT0gbnVsbCkgJiYgdmlzaXRvci5jYWxsKFxuICAgICAgICBmb3JtRGF0YSwgZWwsIHV0aWxzJDEuaXNTdHJpbmcoa2V5KSA/IGtleS50cmltKCkgOiBrZXksIHBhdGgsIGV4cG9zZWRIZWxwZXJzXG4gICAgICApO1xuXG4gICAgICBpZiAocmVzdWx0ID09PSB0cnVlKSB7XG4gICAgICAgIGJ1aWxkKGVsLCBwYXRoID8gcGF0aC5jb25jYXQoa2V5KSA6IFtrZXldKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHN0YWNrLnBvcCgpO1xuICB9XG5cbiAgaWYgKCF1dGlscyQxLmlzT2JqZWN0KG9iaikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdkYXRhIG11c3QgYmUgYW4gb2JqZWN0Jyk7XG4gIH1cblxuICBidWlsZChvYmopO1xuXG4gIHJldHVybiBmb3JtRGF0YTtcbn1cblxuLyoqXG4gKiBJdCBlbmNvZGVzIGEgc3RyaW5nIGJ5IHJlcGxhY2luZyBhbGwgY2hhcmFjdGVycyB0aGF0IGFyZSBub3QgaW4gdGhlIHVucmVzZXJ2ZWQgc2V0IHdpdGhcbiAqIHRoZWlyIHBlcmNlbnQtZW5jb2RlZCBlcXVpdmFsZW50c1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHIgLSBUaGUgc3RyaW5nIHRvIGVuY29kZS5cbiAqXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgZW5jb2RlZCBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIGVuY29kZSQxKHN0cikge1xuICBjb25zdCBjaGFyTWFwID0ge1xuICAgICchJzogJyUyMScsXG4gICAgXCInXCI6ICclMjcnLFxuICAgICcoJzogJyUyOCcsXG4gICAgJyknOiAnJTI5JyxcbiAgICAnfic6ICclN0UnLFxuICAgICclMjAnOiAnKycsXG4gICAgJyUwMCc6ICdcXHgwMCdcbiAgfTtcbiAgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChzdHIpLnJlcGxhY2UoL1shJygpfl18JTIwfCUwMC9nLCBmdW5jdGlvbiByZXBsYWNlcihtYXRjaCkge1xuICAgIHJldHVybiBjaGFyTWFwW21hdGNoXTtcbiAgfSk7XG59XG5cbi8qKlxuICogSXQgdGFrZXMgYSBwYXJhbXMgb2JqZWN0IGFuZCBjb252ZXJ0cyBpdCB0byBhIEZvcm1EYXRhIG9iamVjdFxuICpcbiAqIEBwYXJhbSB7T2JqZWN0PHN0cmluZywgYW55Pn0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgdG8gYmUgY29udmVydGVkIHRvIGEgRm9ybURhdGEgb2JqZWN0LlxuICogQHBhcmFtIHtPYmplY3Q8c3RyaW5nLCBhbnk+fSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgb2JqZWN0IHBhc3NlZCB0byB0aGUgQXhpb3MgY29uc3RydWN0b3IuXG4gKlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIEF4aW9zVVJMU2VhcmNoUGFyYW1zKHBhcmFtcywgb3B0aW9ucykge1xuICB0aGlzLl9wYWlycyA9IFtdO1xuXG4gIHBhcmFtcyAmJiB0b0Zvcm1EYXRhKHBhcmFtcywgdGhpcywgb3B0aW9ucyk7XG59XG5cbmNvbnN0IHByb3RvdHlwZSA9IEF4aW9zVVJMU2VhcmNoUGFyYW1zLnByb3RvdHlwZTtcblxucHJvdG90eXBlLmFwcGVuZCA9IGZ1bmN0aW9uIGFwcGVuZChuYW1lLCB2YWx1ZSkge1xuICB0aGlzLl9wYWlycy5wdXNoKFtuYW1lLCB2YWx1ZV0pO1xufTtcblxucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcoZW5jb2Rlcikge1xuICBjb25zdCBfZW5jb2RlID0gZW5jb2RlciA/IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgcmV0dXJuIGVuY29kZXIuY2FsbCh0aGlzLCB2YWx1ZSwgZW5jb2RlJDEpO1xuICB9IDogZW5jb2RlJDE7XG5cbiAgcmV0dXJuIHRoaXMuX3BhaXJzLm1hcChmdW5jdGlvbiBlYWNoKHBhaXIpIHtcbiAgICByZXR1cm4gX2VuY29kZShwYWlyWzBdKSArICc9JyArIF9lbmNvZGUocGFpclsxXSk7XG4gIH0sICcnKS5qb2luKCcmJyk7XG59O1xuXG4vKipcbiAqIEl0IHJlcGxhY2VzIGFsbCBpbnN0YW5jZXMgb2YgdGhlIGNoYXJhY3RlcnMgYDpgLCBgJGAsIGAsYCwgYCtgLCBgW2AsIGFuZCBgXWAgd2l0aCB0aGVpclxuICogVVJJIGVuY29kZWQgY291bnRlcnBhcnRzXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbCBUaGUgdmFsdWUgdG8gYmUgZW5jb2RlZC5cbiAqXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgZW5jb2RlZCB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gZW5jb2RlKHZhbCkge1xuICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KHZhbCkuXG4gICAgcmVwbGFjZSgvJTNBL2dpLCAnOicpLlxuICAgIHJlcGxhY2UoLyUyNC9nLCAnJCcpLlxuICAgIHJlcGxhY2UoLyUyQy9naSwgJywnKS5cbiAgICByZXBsYWNlKC8lMjAvZywgJysnKS5cbiAgICByZXBsYWNlKC8lNUIvZ2ksICdbJykuXG4gICAgcmVwbGFjZSgvJTVEL2dpLCAnXScpO1xufVxuXG4vKipcbiAqIEJ1aWxkIGEgVVJMIGJ5IGFwcGVuZGluZyBwYXJhbXMgdG8gdGhlIGVuZFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgVGhlIGJhc2Ugb2YgdGhlIHVybCAoZS5nLiwgaHR0cDovL3d3dy5nb29nbGUuY29tKVxuICogQHBhcmFtIHtvYmplY3R9IFtwYXJhbXNdIFRoZSBwYXJhbXMgdG8gYmUgYXBwZW5kZWRcbiAqIEBwYXJhbSB7PyhvYmplY3R8RnVuY3Rpb24pfSBvcHRpb25zXG4gKlxuICogQHJldHVybnMge3N0cmluZ30gVGhlIGZvcm1hdHRlZCB1cmxcbiAqL1xuZnVuY3Rpb24gYnVpbGRVUkwodXJsLCBwYXJhbXMsIG9wdGlvbnMpIHtcbiAgLyplc2xpbnQgbm8tcGFyYW0tcmVhc3NpZ246MCovXG4gIGlmICghcGFyYW1zKSB7XG4gICAgcmV0dXJuIHVybDtcbiAgfVxuICBcbiAgY29uc3QgX2VuY29kZSA9IG9wdGlvbnMgJiYgb3B0aW9ucy5lbmNvZGUgfHwgZW5jb2RlO1xuXG4gIGlmICh1dGlscyQxLmlzRnVuY3Rpb24ob3B0aW9ucykpIHtcbiAgICBvcHRpb25zID0ge1xuICAgICAgc2VyaWFsaXplOiBvcHRpb25zXG4gICAgfTtcbiAgfSBcblxuICBjb25zdCBzZXJpYWxpemVGbiA9IG9wdGlvbnMgJiYgb3B0aW9ucy5zZXJpYWxpemU7XG5cbiAgbGV0IHNlcmlhbGl6ZWRQYXJhbXM7XG5cbiAgaWYgKHNlcmlhbGl6ZUZuKSB7XG4gICAgc2VyaWFsaXplZFBhcmFtcyA9IHNlcmlhbGl6ZUZuKHBhcmFtcywgb3B0aW9ucyk7XG4gIH0gZWxzZSB7XG4gICAgc2VyaWFsaXplZFBhcmFtcyA9IHV0aWxzJDEuaXNVUkxTZWFyY2hQYXJhbXMocGFyYW1zKSA/XG4gICAgICBwYXJhbXMudG9TdHJpbmcoKSA6XG4gICAgICBuZXcgQXhpb3NVUkxTZWFyY2hQYXJhbXMocGFyYW1zLCBvcHRpb25zKS50b1N0cmluZyhfZW5jb2RlKTtcbiAgfVxuXG4gIGlmIChzZXJpYWxpemVkUGFyYW1zKSB7XG4gICAgY29uc3QgaGFzaG1hcmtJbmRleCA9IHVybC5pbmRleE9mKFwiI1wiKTtcblxuICAgIGlmIChoYXNobWFya0luZGV4ICE9PSAtMSkge1xuICAgICAgdXJsID0gdXJsLnNsaWNlKDAsIGhhc2htYXJrSW5kZXgpO1xuICAgIH1cbiAgICB1cmwgKz0gKHVybC5pbmRleE9mKCc/JykgPT09IC0xID8gJz8nIDogJyYnKSArIHNlcmlhbGl6ZWRQYXJhbXM7XG4gIH1cblxuICByZXR1cm4gdXJsO1xufVxuXG5jbGFzcyBJbnRlcmNlcHRvck1hbmFnZXIge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmhhbmRsZXJzID0gW107XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgbmV3IGludGVyY2VwdG9yIHRvIHRoZSBzdGFja1xuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdWxmaWxsZWQgVGhlIGZ1bmN0aW9uIHRvIGhhbmRsZSBgdGhlbmAgZm9yIGEgYFByb21pc2VgXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IHJlamVjdGVkIFRoZSBmdW5jdGlvbiB0byBoYW5kbGUgYHJlamVjdGAgZm9yIGEgYFByb21pc2VgXG4gICAqXG4gICAqIEByZXR1cm4ge051bWJlcn0gQW4gSUQgdXNlZCB0byByZW1vdmUgaW50ZXJjZXB0b3IgbGF0ZXJcbiAgICovXG4gIHVzZShmdWxmaWxsZWQsIHJlamVjdGVkLCBvcHRpb25zKSB7XG4gICAgdGhpcy5oYW5kbGVycy5wdXNoKHtcbiAgICAgIGZ1bGZpbGxlZCxcbiAgICAgIHJlamVjdGVkLFxuICAgICAgc3luY2hyb25vdXM6IG9wdGlvbnMgPyBvcHRpb25zLnN5bmNocm9ub3VzIDogZmFsc2UsXG4gICAgICBydW5XaGVuOiBvcHRpb25zID8gb3B0aW9ucy5ydW5XaGVuIDogbnVsbFxuICAgIH0pO1xuICAgIHJldHVybiB0aGlzLmhhbmRsZXJzLmxlbmd0aCAtIDE7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGFuIGludGVyY2VwdG9yIGZyb20gdGhlIHN0YWNrXG4gICAqXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBpZCBUaGUgSUQgdGhhdCB3YXMgcmV0dXJuZWQgYnkgYHVzZWBcbiAgICpcbiAgICogQHJldHVybnMge0Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgaW50ZXJjZXB0b3Igd2FzIHJlbW92ZWQsIGBmYWxzZWAgb3RoZXJ3aXNlXG4gICAqL1xuICBlamVjdChpZCkge1xuICAgIGlmICh0aGlzLmhhbmRsZXJzW2lkXSkge1xuICAgICAgdGhpcy5oYW5kbGVyc1tpZF0gPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhciBhbGwgaW50ZXJjZXB0b3JzIGZyb20gdGhlIHN0YWNrXG4gICAqXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgY2xlYXIoKSB7XG4gICAgaWYgKHRoaXMuaGFuZGxlcnMpIHtcbiAgICAgIHRoaXMuaGFuZGxlcnMgPSBbXTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSXRlcmF0ZSBvdmVyIGFsbCB0aGUgcmVnaXN0ZXJlZCBpbnRlcmNlcHRvcnNcbiAgICpcbiAgICogVGhpcyBtZXRob2QgaXMgcGFydGljdWxhcmx5IHVzZWZ1bCBmb3Igc2tpcHBpbmcgb3ZlciBhbnlcbiAgICogaW50ZXJjZXB0b3JzIHRoYXQgbWF5IGhhdmUgYmVjb21lIGBudWxsYCBjYWxsaW5nIGBlamVjdGAuXG4gICAqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBmdW5jdGlvbiB0byBjYWxsIGZvciBlYWNoIGludGVyY2VwdG9yXG4gICAqXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgZm9yRWFjaChmbikge1xuICAgIHV0aWxzJDEuZm9yRWFjaCh0aGlzLmhhbmRsZXJzLCBmdW5jdGlvbiBmb3JFYWNoSGFuZGxlcihoKSB7XG4gICAgICBpZiAoaCAhPT0gbnVsbCkge1xuICAgICAgICBmbihoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuXG52YXIgSW50ZXJjZXB0b3JNYW5hZ2VyJDEgPSBJbnRlcmNlcHRvck1hbmFnZXI7XG5cbnZhciB0cmFuc2l0aW9uYWxEZWZhdWx0cyA9IHtcbiAgc2lsZW50SlNPTlBhcnNpbmc6IHRydWUsXG4gIGZvcmNlZEpTT05QYXJzaW5nOiB0cnVlLFxuICBjbGFyaWZ5VGltZW91dEVycm9yOiBmYWxzZVxufTtcblxudmFyIFVSTFNlYXJjaFBhcmFtcyQxID0gdHlwZW9mIFVSTFNlYXJjaFBhcmFtcyAhPT0gJ3VuZGVmaW5lZCcgPyBVUkxTZWFyY2hQYXJhbXMgOiBBeGlvc1VSTFNlYXJjaFBhcmFtcztcblxudmFyIEZvcm1EYXRhJDEgPSB0eXBlb2YgRm9ybURhdGEgIT09ICd1bmRlZmluZWQnID8gRm9ybURhdGEgOiBudWxsO1xuXG52YXIgQmxvYiQxID0gdHlwZW9mIEJsb2IgIT09ICd1bmRlZmluZWQnID8gQmxvYiA6IG51bGw7XG5cbnZhciBwbGF0Zm9ybSQxID0ge1xuICBpc0Jyb3dzZXI6IHRydWUsXG4gIGNsYXNzZXM6IHtcbiAgICBVUkxTZWFyY2hQYXJhbXM6IFVSTFNlYXJjaFBhcmFtcyQxLFxuICAgIEZvcm1EYXRhOiBGb3JtRGF0YSQxLFxuICAgIEJsb2I6IEJsb2IkMVxuICB9LFxuICBwcm90b2NvbHM6IFsnaHR0cCcsICdodHRwcycsICdmaWxlJywgJ2Jsb2InLCAndXJsJywgJ2RhdGEnXVxufTtcblxuY29uc3QgaGFzQnJvd3NlckVudiA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCc7XG5cbmNvbnN0IF9uYXZpZ2F0b3IgPSB0eXBlb2YgbmF2aWdhdG9yID09PSAnb2JqZWN0JyAmJiBuYXZpZ2F0b3IgfHwgdW5kZWZpbmVkO1xuXG4vKipcbiAqIERldGVybWluZSBpZiB3ZSdyZSBydW5uaW5nIGluIGEgc3RhbmRhcmQgYnJvd3NlciBlbnZpcm9ubWVudFxuICpcbiAqIFRoaXMgYWxsb3dzIGF4aW9zIHRvIHJ1biBpbiBhIHdlYiB3b3JrZXIsIGFuZCByZWFjdC1uYXRpdmUuXG4gKiBCb3RoIGVudmlyb25tZW50cyBzdXBwb3J0IFhNTEh0dHBSZXF1ZXN0LCBidXQgbm90IGZ1bGx5IHN0YW5kYXJkIGdsb2JhbHMuXG4gKlxuICogd2ViIHdvcmtlcnM6XG4gKiAgdHlwZW9mIHdpbmRvdyAtPiB1bmRlZmluZWRcbiAqICB0eXBlb2YgZG9jdW1lbnQgLT4gdW5kZWZpbmVkXG4gKlxuICogcmVhY3QtbmF0aXZlOlxuICogIG5hdmlnYXRvci5wcm9kdWN0IC0+ICdSZWFjdE5hdGl2ZSdcbiAqIG5hdGl2ZXNjcmlwdFxuICogIG5hdmlnYXRvci5wcm9kdWN0IC0+ICdOYXRpdmVTY3JpcHQnIG9yICdOUydcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgaGFzU3RhbmRhcmRCcm93c2VyRW52ID0gaGFzQnJvd3NlckVudiAmJlxuICAoIV9uYXZpZ2F0b3IgfHwgWydSZWFjdE5hdGl2ZScsICdOYXRpdmVTY3JpcHQnLCAnTlMnXS5pbmRleE9mKF9uYXZpZ2F0b3IucHJvZHVjdCkgPCAwKTtcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgd2UncmUgcnVubmluZyBpbiBhIHN0YW5kYXJkIGJyb3dzZXIgd2ViV29ya2VyIGVudmlyb25tZW50XG4gKlxuICogQWx0aG91Z2ggdGhlIGBpc1N0YW5kYXJkQnJvd3NlckVudmAgbWV0aG9kIGluZGljYXRlcyB0aGF0XG4gKiBgYWxsb3dzIGF4aW9zIHRvIHJ1biBpbiBhIHdlYiB3b3JrZXJgLCB0aGUgV2ViV29ya2VyIHdpbGwgc3RpbGwgYmVcbiAqIGZpbHRlcmVkIG91dCBkdWUgdG8gaXRzIGp1ZGdtZW50IHN0YW5kYXJkXG4gKiBgdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJ2AuXG4gKiBUaGlzIGxlYWRzIHRvIGEgcHJvYmxlbSB3aGVuIGF4aW9zIHBvc3QgYEZvcm1EYXRhYCBpbiB3ZWJXb3JrZXJcbiAqL1xuY29uc3QgaGFzU3RhbmRhcmRCcm93c2VyV2ViV29ya2VyRW52ID0gKCgpID0+IHtcbiAgcmV0dXJuIChcbiAgICB0eXBlb2YgV29ya2VyR2xvYmFsU2NvcGUgIT09ICd1bmRlZmluZWQnICYmXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gICAgc2VsZiBpbnN0YW5jZW9mIFdvcmtlckdsb2JhbFNjb3BlICYmXG4gICAgdHlwZW9mIHNlbGYuaW1wb3J0U2NyaXB0cyA9PT0gJ2Z1bmN0aW9uJ1xuICApO1xufSkoKTtcblxuY29uc3Qgb3JpZ2luID0gaGFzQnJvd3NlckVudiAmJiB3aW5kb3cubG9jYXRpb24uaHJlZiB8fCAnaHR0cDovL2xvY2FsaG9zdCc7XG5cbnZhciB1dGlscyA9IC8qI19fUFVSRV9fKi9PYmplY3QuZnJlZXplKHtcbiAgX19wcm90b19fOiBudWxsLFxuICBoYXNCcm93c2VyRW52OiBoYXNCcm93c2VyRW52LFxuICBoYXNTdGFuZGFyZEJyb3dzZXJXZWJXb3JrZXJFbnY6IGhhc1N0YW5kYXJkQnJvd3NlcldlYldvcmtlckVudixcbiAgaGFzU3RhbmRhcmRCcm93c2VyRW52OiBoYXNTdGFuZGFyZEJyb3dzZXJFbnYsXG4gIG5hdmlnYXRvcjogX25hdmlnYXRvcixcbiAgb3JpZ2luOiBvcmlnaW5cbn0pO1xuXG52YXIgcGxhdGZvcm0gPSB7XG4gIC4uLnV0aWxzLFxuICAuLi5wbGF0Zm9ybSQxXG59O1xuXG5mdW5jdGlvbiB0b1VSTEVuY29kZWRGb3JtKGRhdGEsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIHRvRm9ybURhdGEoZGF0YSwgbmV3IHBsYXRmb3JtLmNsYXNzZXMuVVJMU2VhcmNoUGFyYW1zKCksIE9iamVjdC5hc3NpZ24oe1xuICAgIHZpc2l0b3I6IGZ1bmN0aW9uKHZhbHVlLCBrZXksIHBhdGgsIGhlbHBlcnMpIHtcbiAgICAgIGlmIChwbGF0Zm9ybS5pc05vZGUgJiYgdXRpbHMkMS5pc0J1ZmZlcih2YWx1ZSkpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQoa2V5LCB2YWx1ZS50b1N0cmluZygnYmFzZTY0JykpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBoZWxwZXJzLmRlZmF1bHRWaXNpdG9yLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfVxuICB9LCBvcHRpb25zKSk7XG59XG5cbi8qKlxuICogSXQgdGFrZXMgYSBzdHJpbmcgbGlrZSBgZm9vW3hdW3ldW3pdYCBhbmQgcmV0dXJucyBhbiBhcnJheSBsaWtlIGBbJ2ZvbycsICd4JywgJ3knLCAneiddXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LlxuICpcbiAqIEByZXR1cm5zIEFuIGFycmF5IG9mIHN0cmluZ3MuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlUHJvcFBhdGgobmFtZSkge1xuICAvLyBmb29beF1beV1bel1cbiAgLy8gZm9vLngueS56XG4gIC8vIGZvby14LXktelxuICAvLyBmb28geCB5IHpcbiAgcmV0dXJuIHV0aWxzJDEubWF0Y2hBbGwoL1xcdyt8XFxbKFxcdyopXS9nLCBuYW1lKS5tYXAobWF0Y2ggPT4ge1xuICAgIHJldHVybiBtYXRjaFswXSA9PT0gJ1tdJyA/ICcnIDogbWF0Y2hbMV0gfHwgbWF0Y2hbMF07XG4gIH0pO1xufVxuXG4vKipcbiAqIENvbnZlcnQgYW4gYXJyYXkgdG8gYW4gb2JqZWN0LlxuICpcbiAqIEBwYXJhbSB7QXJyYXk8YW55Pn0gYXJyIC0gVGhlIGFycmF5IHRvIGNvbnZlcnQgdG8gYW4gb2JqZWN0LlxuICpcbiAqIEByZXR1cm5zIEFuIG9iamVjdCB3aXRoIHRoZSBzYW1lIGtleXMgYW5kIHZhbHVlcyBhcyB0aGUgYXJyYXkuXG4gKi9cbmZ1bmN0aW9uIGFycmF5VG9PYmplY3QoYXJyKSB7XG4gIGNvbnN0IG9iaiA9IHt9O1xuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoYXJyKTtcbiAgbGV0IGk7XG4gIGNvbnN0IGxlbiA9IGtleXMubGVuZ3RoO1xuICBsZXQga2V5O1xuICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICBrZXkgPSBrZXlzW2ldO1xuICAgIG9ialtrZXldID0gYXJyW2tleV07XG4gIH1cbiAgcmV0dXJuIG9iajtcbn1cblxuLyoqXG4gKiBJdCB0YWtlcyBhIEZvcm1EYXRhIG9iamVjdCBhbmQgcmV0dXJucyBhIEphdmFTY3JpcHQgb2JqZWN0XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGZvcm1EYXRhIFRoZSBGb3JtRGF0YSBvYmplY3QgdG8gY29udmVydCB0byBKU09OLlxuICpcbiAqIEByZXR1cm5zIHtPYmplY3Q8c3RyaW5nLCBhbnk+IHwgbnVsbH0gVGhlIGNvbnZlcnRlZCBvYmplY3QuXG4gKi9cbmZ1bmN0aW9uIGZvcm1EYXRhVG9KU09OKGZvcm1EYXRhKSB7XG4gIGZ1bmN0aW9uIGJ1aWxkUGF0aChwYXRoLCB2YWx1ZSwgdGFyZ2V0LCBpbmRleCkge1xuICAgIGxldCBuYW1lID0gcGF0aFtpbmRleCsrXTtcblxuICAgIGlmIChuYW1lID09PSAnX19wcm90b19fJykgcmV0dXJuIHRydWU7XG5cbiAgICBjb25zdCBpc051bWVyaWNLZXkgPSBOdW1iZXIuaXNGaW5pdGUoK25hbWUpO1xuICAgIGNvbnN0IGlzTGFzdCA9IGluZGV4ID49IHBhdGgubGVuZ3RoO1xuICAgIG5hbWUgPSAhbmFtZSAmJiB1dGlscyQxLmlzQXJyYXkodGFyZ2V0KSA/IHRhcmdldC5sZW5ndGggOiBuYW1lO1xuXG4gICAgaWYgKGlzTGFzdCkge1xuICAgICAgaWYgKHV0aWxzJDEuaGFzT3duUHJvcCh0YXJnZXQsIG5hbWUpKSB7XG4gICAgICAgIHRhcmdldFtuYW1lXSA9IFt0YXJnZXRbbmFtZV0sIHZhbHVlXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRhcmdldFtuYW1lXSA9IHZhbHVlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gIWlzTnVtZXJpY0tleTtcbiAgICB9XG5cbiAgICBpZiAoIXRhcmdldFtuYW1lXSB8fCAhdXRpbHMkMS5pc09iamVjdCh0YXJnZXRbbmFtZV0pKSB7XG4gICAgICB0YXJnZXRbbmFtZV0gPSBbXTtcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBidWlsZFBhdGgocGF0aCwgdmFsdWUsIHRhcmdldFtuYW1lXSwgaW5kZXgpO1xuXG4gICAgaWYgKHJlc3VsdCAmJiB1dGlscyQxLmlzQXJyYXkodGFyZ2V0W25hbWVdKSkge1xuICAgICAgdGFyZ2V0W25hbWVdID0gYXJyYXlUb09iamVjdCh0YXJnZXRbbmFtZV0pO1xuICAgIH1cblxuICAgIHJldHVybiAhaXNOdW1lcmljS2V5O1xuICB9XG5cbiAgaWYgKHV0aWxzJDEuaXNGb3JtRGF0YShmb3JtRGF0YSkgJiYgdXRpbHMkMS5pc0Z1bmN0aW9uKGZvcm1EYXRhLmVudHJpZXMpKSB7XG4gICAgY29uc3Qgb2JqID0ge307XG5cbiAgICB1dGlscyQxLmZvckVhY2hFbnRyeShmb3JtRGF0YSwgKG5hbWUsIHZhbHVlKSA9PiB7XG4gICAgICBidWlsZFBhdGgocGFyc2VQcm9wUGF0aChuYW1lKSwgdmFsdWUsIG9iaiwgMCk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gb2JqO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKlxuICogSXQgdGFrZXMgYSBzdHJpbmcsIHRyaWVzIHRvIHBhcnNlIGl0LCBhbmQgaWYgaXQgZmFpbHMsIGl0IHJldHVybnMgdGhlIHN0cmluZ2lmaWVkIHZlcnNpb25cbiAqIG9mIHRoZSBpbnB1dFxuICpcbiAqIEBwYXJhbSB7YW55fSByYXdWYWx1ZSAtIFRoZSB2YWx1ZSB0byBiZSBzdHJpbmdpZmllZC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHBhcnNlciAtIEEgZnVuY3Rpb24gdGhhdCBwYXJzZXMgYSBzdHJpbmcgaW50byBhIEphdmFTY3JpcHQgb2JqZWN0LlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZW5jb2RlciAtIEEgZnVuY3Rpb24gdGhhdCB0YWtlcyBhIHZhbHVlIGFuZCByZXR1cm5zIGEgc3RyaW5nLlxuICpcbiAqIEByZXR1cm5zIHtzdHJpbmd9IEEgc3RyaW5naWZpZWQgdmVyc2lvbiBvZiB0aGUgcmF3VmFsdWUuXG4gKi9cbmZ1bmN0aW9uIHN0cmluZ2lmeVNhZmVseShyYXdWYWx1ZSwgcGFyc2VyLCBlbmNvZGVyKSB7XG4gIGlmICh1dGlscyQxLmlzU3RyaW5nKHJhd1ZhbHVlKSkge1xuICAgIHRyeSB7XG4gICAgICAocGFyc2VyIHx8IEpTT04ucGFyc2UpKHJhd1ZhbHVlKTtcbiAgICAgIHJldHVybiB1dGlscyQxLnRyaW0ocmF3VmFsdWUpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmIChlLm5hbWUgIT09ICdTeW50YXhFcnJvcicpIHtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gKGVuY29kZXIgfHwgSlNPTi5zdHJpbmdpZnkpKHJhd1ZhbHVlKTtcbn1cblxuY29uc3QgZGVmYXVsdHMgPSB7XG5cbiAgdHJhbnNpdGlvbmFsOiB0cmFuc2l0aW9uYWxEZWZhdWx0cyxcblxuICBhZGFwdGVyOiBbJ3hocicsICdodHRwJywgJ2ZldGNoJ10sXG5cbiAgdHJhbnNmb3JtUmVxdWVzdDogW2Z1bmN0aW9uIHRyYW5zZm9ybVJlcXVlc3QoZGF0YSwgaGVhZGVycykge1xuICAgIGNvbnN0IGNvbnRlbnRUeXBlID0gaGVhZGVycy5nZXRDb250ZW50VHlwZSgpIHx8ICcnO1xuICAgIGNvbnN0IGhhc0pTT05Db250ZW50VHlwZSA9IGNvbnRlbnRUeXBlLmluZGV4T2YoJ2FwcGxpY2F0aW9uL2pzb24nKSA+IC0xO1xuICAgIGNvbnN0IGlzT2JqZWN0UGF5bG9hZCA9IHV0aWxzJDEuaXNPYmplY3QoZGF0YSk7XG5cbiAgICBpZiAoaXNPYmplY3RQYXlsb2FkICYmIHV0aWxzJDEuaXNIVE1MRm9ybShkYXRhKSkge1xuICAgICAgZGF0YSA9IG5ldyBGb3JtRGF0YShkYXRhKTtcbiAgICB9XG5cbiAgICBjb25zdCBpc0Zvcm1EYXRhID0gdXRpbHMkMS5pc0Zvcm1EYXRhKGRhdGEpO1xuXG4gICAgaWYgKGlzRm9ybURhdGEpIHtcbiAgICAgIHJldHVybiBoYXNKU09OQ29udGVudFR5cGUgPyBKU09OLnN0cmluZ2lmeShmb3JtRGF0YVRvSlNPTihkYXRhKSkgOiBkYXRhO1xuICAgIH1cblxuICAgIGlmICh1dGlscyQxLmlzQXJyYXlCdWZmZXIoZGF0YSkgfHxcbiAgICAgIHV0aWxzJDEuaXNCdWZmZXIoZGF0YSkgfHxcbiAgICAgIHV0aWxzJDEuaXNTdHJlYW0oZGF0YSkgfHxcbiAgICAgIHV0aWxzJDEuaXNGaWxlKGRhdGEpIHx8XG4gICAgICB1dGlscyQxLmlzQmxvYihkYXRhKSB8fFxuICAgICAgdXRpbHMkMS5pc1JlYWRhYmxlU3RyZWFtKGRhdGEpXG4gICAgKSB7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG4gICAgaWYgKHV0aWxzJDEuaXNBcnJheUJ1ZmZlclZpZXcoZGF0YSkpIHtcbiAgICAgIHJldHVybiBkYXRhLmJ1ZmZlcjtcbiAgICB9XG4gICAgaWYgKHV0aWxzJDEuaXNVUkxTZWFyY2hQYXJhbXMoZGF0YSkpIHtcbiAgICAgIGhlYWRlcnMuc2V0Q29udGVudFR5cGUoJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDtjaGFyc2V0PXV0Zi04JywgZmFsc2UpO1xuICAgICAgcmV0dXJuIGRhdGEudG9TdHJpbmcoKTtcbiAgICB9XG5cbiAgICBsZXQgaXNGaWxlTGlzdDtcblxuICAgIGlmIChpc09iamVjdFBheWxvYWQpIHtcbiAgICAgIGlmIChjb250ZW50VHlwZS5pbmRleE9mKCdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnKSA+IC0xKSB7XG4gICAgICAgIHJldHVybiB0b1VSTEVuY29kZWRGb3JtKGRhdGEsIHRoaXMuZm9ybVNlcmlhbGl6ZXIpLnRvU3RyaW5nKCk7XG4gICAgICB9XG5cbiAgICAgIGlmICgoaXNGaWxlTGlzdCA9IHV0aWxzJDEuaXNGaWxlTGlzdChkYXRhKSkgfHwgY29udGVudFR5cGUuaW5kZXhPZignbXVsdGlwYXJ0L2Zvcm0tZGF0YScpID4gLTEpIHtcbiAgICAgICAgY29uc3QgX0Zvcm1EYXRhID0gdGhpcy5lbnYgJiYgdGhpcy5lbnYuRm9ybURhdGE7XG5cbiAgICAgICAgcmV0dXJuIHRvRm9ybURhdGEoXG4gICAgICAgICAgaXNGaWxlTGlzdCA/IHsnZmlsZXNbXSc6IGRhdGF9IDogZGF0YSxcbiAgICAgICAgICBfRm9ybURhdGEgJiYgbmV3IF9Gb3JtRGF0YSgpLFxuICAgICAgICAgIHRoaXMuZm9ybVNlcmlhbGl6ZXJcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaXNPYmplY3RQYXlsb2FkIHx8IGhhc0pTT05Db250ZW50VHlwZSApIHtcbiAgICAgIGhlYWRlcnMuc2V0Q29udGVudFR5cGUoJ2FwcGxpY2F0aW9uL2pzb24nLCBmYWxzZSk7XG4gICAgICByZXR1cm4gc3RyaW5naWZ5U2FmZWx5KGRhdGEpO1xuICAgIH1cblxuICAgIHJldHVybiBkYXRhO1xuICB9XSxcblxuICB0cmFuc2Zvcm1SZXNwb25zZTogW2Z1bmN0aW9uIHRyYW5zZm9ybVJlc3BvbnNlKGRhdGEpIHtcbiAgICBjb25zdCB0cmFuc2l0aW9uYWwgPSB0aGlzLnRyYW5zaXRpb25hbCB8fCBkZWZhdWx0cy50cmFuc2l0aW9uYWw7XG4gICAgY29uc3QgZm9yY2VkSlNPTlBhcnNpbmcgPSB0cmFuc2l0aW9uYWwgJiYgdHJhbnNpdGlvbmFsLmZvcmNlZEpTT05QYXJzaW5nO1xuICAgIGNvbnN0IEpTT05SZXF1ZXN0ZWQgPSB0aGlzLnJlc3BvbnNlVHlwZSA9PT0gJ2pzb24nO1xuXG4gICAgaWYgKHV0aWxzJDEuaXNSZXNwb25zZShkYXRhKSB8fCB1dGlscyQxLmlzUmVhZGFibGVTdHJlYW0oZGF0YSkpIHtcbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cblxuICAgIGlmIChkYXRhICYmIHV0aWxzJDEuaXNTdHJpbmcoZGF0YSkgJiYgKChmb3JjZWRKU09OUGFyc2luZyAmJiAhdGhpcy5yZXNwb25zZVR5cGUpIHx8IEpTT05SZXF1ZXN0ZWQpKSB7XG4gICAgICBjb25zdCBzaWxlbnRKU09OUGFyc2luZyA9IHRyYW5zaXRpb25hbCAmJiB0cmFuc2l0aW9uYWwuc2lsZW50SlNPTlBhcnNpbmc7XG4gICAgICBjb25zdCBzdHJpY3RKU09OUGFyc2luZyA9ICFzaWxlbnRKU09OUGFyc2luZyAmJiBKU09OUmVxdWVzdGVkO1xuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShkYXRhKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgaWYgKHN0cmljdEpTT05QYXJzaW5nKSB7XG4gICAgICAgICAgaWYgKGUubmFtZSA9PT0gJ1N5bnRheEVycm9yJykge1xuICAgICAgICAgICAgdGhyb3cgQXhpb3NFcnJvci5mcm9tKGUsIEF4aW9zRXJyb3IuRVJSX0JBRF9SRVNQT05TRSwgdGhpcywgbnVsbCwgdGhpcy5yZXNwb25zZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZGF0YTtcbiAgfV0sXG5cbiAgLyoqXG4gICAqIEEgdGltZW91dCBpbiBtaWxsaXNlY29uZHMgdG8gYWJvcnQgYSByZXF1ZXN0LiBJZiBzZXQgdG8gMCAoZGVmYXVsdCkgYVxuICAgKiB0aW1lb3V0IGlzIG5vdCBjcmVhdGVkLlxuICAgKi9cbiAgdGltZW91dDogMCxcblxuICB4c3JmQ29va2llTmFtZTogJ1hTUkYtVE9LRU4nLFxuICB4c3JmSGVhZGVyTmFtZTogJ1gtWFNSRi1UT0tFTicsXG5cbiAgbWF4Q29udGVudExlbmd0aDogLTEsXG4gIG1heEJvZHlMZW5ndGg6IC0xLFxuXG4gIGVudjoge1xuICAgIEZvcm1EYXRhOiBwbGF0Zm9ybS5jbGFzc2VzLkZvcm1EYXRhLFxuICAgIEJsb2I6IHBsYXRmb3JtLmNsYXNzZXMuQmxvYlxuICB9LFxuXG4gIHZhbGlkYXRlU3RhdHVzOiBmdW5jdGlvbiB2YWxpZGF0ZVN0YXR1cyhzdGF0dXMpIHtcbiAgICByZXR1cm4gc3RhdHVzID49IDIwMCAmJiBzdGF0dXMgPCAzMDA7XG4gIH0sXG5cbiAgaGVhZGVyczoge1xuICAgIGNvbW1vbjoge1xuICAgICAgJ0FjY2VwdCc6ICdhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L3BsYWluLCAqLyonLFxuICAgICAgJ0NvbnRlbnQtVHlwZSc6IHVuZGVmaW5lZFxuICAgIH1cbiAgfVxufTtcblxudXRpbHMkMS5mb3JFYWNoKFsnZGVsZXRlJywgJ2dldCcsICdoZWFkJywgJ3Bvc3QnLCAncHV0JywgJ3BhdGNoJ10sIChtZXRob2QpID0+IHtcbiAgZGVmYXVsdHMuaGVhZGVyc1ttZXRob2RdID0ge307XG59KTtcblxudmFyIGRlZmF1bHRzJDEgPSBkZWZhdWx0cztcblxuLy8gUmF3QXhpb3NIZWFkZXJzIHdob3NlIGR1cGxpY2F0ZXMgYXJlIGlnbm9yZWQgYnkgbm9kZVxuLy8gYy5mLiBodHRwczovL25vZGVqcy5vcmcvYXBpL2h0dHAuaHRtbCNodHRwX21lc3NhZ2VfaGVhZGVyc1xuY29uc3QgaWdub3JlRHVwbGljYXRlT2YgPSB1dGlscyQxLnRvT2JqZWN0U2V0KFtcbiAgJ2FnZScsICdhdXRob3JpemF0aW9uJywgJ2NvbnRlbnQtbGVuZ3RoJywgJ2NvbnRlbnQtdHlwZScsICdldGFnJyxcbiAgJ2V4cGlyZXMnLCAnZnJvbScsICdob3N0JywgJ2lmLW1vZGlmaWVkLXNpbmNlJywgJ2lmLXVubW9kaWZpZWQtc2luY2UnLFxuICAnbGFzdC1tb2RpZmllZCcsICdsb2NhdGlvbicsICdtYXgtZm9yd2FyZHMnLCAncHJveHktYXV0aG9yaXphdGlvbicsXG4gICdyZWZlcmVyJywgJ3JldHJ5LWFmdGVyJywgJ3VzZXItYWdlbnQnXG5dKTtcblxuLyoqXG4gKiBQYXJzZSBoZWFkZXJzIGludG8gYW4gb2JqZWN0XG4gKlxuICogYGBgXG4gKiBEYXRlOiBXZWQsIDI3IEF1ZyAyMDE0IDA4OjU4OjQ5IEdNVFxuICogQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uXG4gKiBDb25uZWN0aW9uOiBrZWVwLWFsaXZlXG4gKiBUcmFuc2Zlci1FbmNvZGluZzogY2h1bmtlZFxuICogYGBgXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHJhd0hlYWRlcnMgSGVhZGVycyBuZWVkaW5nIHRvIGJlIHBhcnNlZFxuICpcbiAqIEByZXR1cm5zIHtPYmplY3R9IEhlYWRlcnMgcGFyc2VkIGludG8gYW4gb2JqZWN0XG4gKi9cbnZhciBwYXJzZUhlYWRlcnMgPSByYXdIZWFkZXJzID0+IHtcbiAgY29uc3QgcGFyc2VkID0ge307XG4gIGxldCBrZXk7XG4gIGxldCB2YWw7XG4gIGxldCBpO1xuXG4gIHJhd0hlYWRlcnMgJiYgcmF3SGVhZGVycy5zcGxpdCgnXFxuJykuZm9yRWFjaChmdW5jdGlvbiBwYXJzZXIobGluZSkge1xuICAgIGkgPSBsaW5lLmluZGV4T2YoJzonKTtcbiAgICBrZXkgPSBsaW5lLnN1YnN0cmluZygwLCBpKS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICB2YWwgPSBsaW5lLnN1YnN0cmluZyhpICsgMSkudHJpbSgpO1xuXG4gICAgaWYgKCFrZXkgfHwgKHBhcnNlZFtrZXldICYmIGlnbm9yZUR1cGxpY2F0ZU9mW2tleV0pKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGtleSA9PT0gJ3NldC1jb29raWUnKSB7XG4gICAgICBpZiAocGFyc2VkW2tleV0pIHtcbiAgICAgICAgcGFyc2VkW2tleV0ucHVzaCh2YWwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGFyc2VkW2tleV0gPSBbdmFsXTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcGFyc2VkW2tleV0gPSBwYXJzZWRba2V5XSA/IHBhcnNlZFtrZXldICsgJywgJyArIHZhbCA6IHZhbDtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiBwYXJzZWQ7XG59O1xuXG5jb25zdCAkaW50ZXJuYWxzID0gU3ltYm9sKCdpbnRlcm5hbHMnKTtcblxuZnVuY3Rpb24gbm9ybWFsaXplSGVhZGVyKGhlYWRlcikge1xuICByZXR1cm4gaGVhZGVyICYmIFN0cmluZyhoZWFkZXIpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVWYWx1ZSh2YWx1ZSkge1xuICBpZiAodmFsdWUgPT09IGZhbHNlIHx8IHZhbHVlID09IG51bGwpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICByZXR1cm4gdXRpbHMkMS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlLm1hcChub3JtYWxpemVWYWx1ZSkgOiBTdHJpbmcodmFsdWUpO1xufVxuXG5mdW5jdGlvbiBwYXJzZVRva2VucyhzdHIpIHtcbiAgY29uc3QgdG9rZW5zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgY29uc3QgdG9rZW5zUkUgPSAvKFteXFxzLDs9XSspXFxzKig/Oj1cXHMqKFteLDtdKykpPy9nO1xuICBsZXQgbWF0Y2g7XG5cbiAgd2hpbGUgKChtYXRjaCA9IHRva2Vuc1JFLmV4ZWMoc3RyKSkpIHtcbiAgICB0b2tlbnNbbWF0Y2hbMV1dID0gbWF0Y2hbMl07XG4gIH1cblxuICByZXR1cm4gdG9rZW5zO1xufVxuXG5jb25zdCBpc1ZhbGlkSGVhZGVyTmFtZSA9IChzdHIpID0+IC9eWy1fYS16QS1aMC05XmB8fiwhIyQlJicqKy5dKyQvLnRlc3Qoc3RyLnRyaW0oKSk7XG5cbmZ1bmN0aW9uIG1hdGNoSGVhZGVyVmFsdWUoY29udGV4dCwgdmFsdWUsIGhlYWRlciwgZmlsdGVyLCBpc0hlYWRlck5hbWVGaWx0ZXIpIHtcbiAgaWYgKHV0aWxzJDEuaXNGdW5jdGlvbihmaWx0ZXIpKSB7XG4gICAgcmV0dXJuIGZpbHRlci5jYWxsKHRoaXMsIHZhbHVlLCBoZWFkZXIpO1xuICB9XG5cbiAgaWYgKGlzSGVhZGVyTmFtZUZpbHRlcikge1xuICAgIHZhbHVlID0gaGVhZGVyO1xuICB9XG5cbiAgaWYgKCF1dGlscyQxLmlzU3RyaW5nKHZhbHVlKSkgcmV0dXJuO1xuXG4gIGlmICh1dGlscyQxLmlzU3RyaW5nKGZpbHRlcikpIHtcbiAgICByZXR1cm4gdmFsdWUuaW5kZXhPZihmaWx0ZXIpICE9PSAtMTtcbiAgfVxuXG4gIGlmICh1dGlscyQxLmlzUmVnRXhwKGZpbHRlcikpIHtcbiAgICByZXR1cm4gZmlsdGVyLnRlc3QodmFsdWUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZvcm1hdEhlYWRlcihoZWFkZXIpIHtcbiAgcmV0dXJuIGhlYWRlci50cmltKClcbiAgICAudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC8oW2EtelxcZF0pKFxcdyopL2csICh3LCBjaGFyLCBzdHIpID0+IHtcbiAgICAgIHJldHVybiBjaGFyLnRvVXBwZXJDYXNlKCkgKyBzdHI7XG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkQWNjZXNzb3JzKG9iaiwgaGVhZGVyKSB7XG4gIGNvbnN0IGFjY2Vzc29yTmFtZSA9IHV0aWxzJDEudG9DYW1lbENhc2UoJyAnICsgaGVhZGVyKTtcblxuICBbJ2dldCcsICdzZXQnLCAnaGFzJ10uZm9yRWFjaChtZXRob2ROYW1lID0+IHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBtZXRob2ROYW1lICsgYWNjZXNzb3JOYW1lLCB7XG4gICAgICB2YWx1ZTogZnVuY3Rpb24oYXJnMSwgYXJnMiwgYXJnMykge1xuICAgICAgICByZXR1cm4gdGhpc1ttZXRob2ROYW1lXS5jYWxsKHRoaXMsIGhlYWRlciwgYXJnMSwgYXJnMiwgYXJnMyk7XG4gICAgICB9LFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gIH0pO1xufVxuXG5jbGFzcyBBeGlvc0hlYWRlcnMge1xuICBjb25zdHJ1Y3RvcihoZWFkZXJzKSB7XG4gICAgaGVhZGVycyAmJiB0aGlzLnNldChoZWFkZXJzKTtcbiAgfVxuXG4gIHNldChoZWFkZXIsIHZhbHVlT3JSZXdyaXRlLCByZXdyaXRlKSB7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG5cbiAgICBmdW5jdGlvbiBzZXRIZWFkZXIoX3ZhbHVlLCBfaGVhZGVyLCBfcmV3cml0ZSkge1xuICAgICAgY29uc3QgbEhlYWRlciA9IG5vcm1hbGl6ZUhlYWRlcihfaGVhZGVyKTtcblxuICAgICAgaWYgKCFsSGVhZGVyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaGVhZGVyIG5hbWUgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcnKTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qga2V5ID0gdXRpbHMkMS5maW5kS2V5KHNlbGYsIGxIZWFkZXIpO1xuXG4gICAgICBpZigha2V5IHx8IHNlbGZba2V5XSA9PT0gdW5kZWZpbmVkIHx8IF9yZXdyaXRlID09PSB0cnVlIHx8IChfcmV3cml0ZSA9PT0gdW5kZWZpbmVkICYmIHNlbGZba2V5XSAhPT0gZmFsc2UpKSB7XG4gICAgICAgIHNlbGZba2V5IHx8IF9oZWFkZXJdID0gbm9ybWFsaXplVmFsdWUoX3ZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBzZXRIZWFkZXJzID0gKGhlYWRlcnMsIF9yZXdyaXRlKSA9PlxuICAgICAgdXRpbHMkMS5mb3JFYWNoKGhlYWRlcnMsIChfdmFsdWUsIF9oZWFkZXIpID0+IHNldEhlYWRlcihfdmFsdWUsIF9oZWFkZXIsIF9yZXdyaXRlKSk7XG5cbiAgICBpZiAodXRpbHMkMS5pc1BsYWluT2JqZWN0KGhlYWRlcikgfHwgaGVhZGVyIGluc3RhbmNlb2YgdGhpcy5jb25zdHJ1Y3Rvcikge1xuICAgICAgc2V0SGVhZGVycyhoZWFkZXIsIHZhbHVlT3JSZXdyaXRlKTtcbiAgICB9IGVsc2UgaWYodXRpbHMkMS5pc1N0cmluZyhoZWFkZXIpICYmIChoZWFkZXIgPSBoZWFkZXIudHJpbSgpKSAmJiAhaXNWYWxpZEhlYWRlck5hbWUoaGVhZGVyKSkge1xuICAgICAgc2V0SGVhZGVycyhwYXJzZUhlYWRlcnMoaGVhZGVyKSwgdmFsdWVPclJld3JpdGUpO1xuICAgIH0gZWxzZSBpZiAodXRpbHMkMS5pc0hlYWRlcnMoaGVhZGVyKSkge1xuICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgaGVhZGVyLmVudHJpZXMoKSkge1xuICAgICAgICBzZXRIZWFkZXIodmFsdWUsIGtleSwgcmV3cml0ZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGhlYWRlciAhPSBudWxsICYmIHNldEhlYWRlcih2YWx1ZU9yUmV3cml0ZSwgaGVhZGVyLCByZXdyaXRlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGdldChoZWFkZXIsIHBhcnNlcikge1xuICAgIGhlYWRlciA9IG5vcm1hbGl6ZUhlYWRlcihoZWFkZXIpO1xuXG4gICAgaWYgKGhlYWRlcikge1xuICAgICAgY29uc3Qga2V5ID0gdXRpbHMkMS5maW5kS2V5KHRoaXMsIGhlYWRlcik7XG5cbiAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzW2tleV07XG5cbiAgICAgICAgaWYgKCFwYXJzZXIpIHtcbiAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGFyc2VyID09PSB0cnVlKSB7XG4gICAgICAgICAgcmV0dXJuIHBhcnNlVG9rZW5zKHZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh1dGlscyQxLmlzRnVuY3Rpb24ocGFyc2VyKSkge1xuICAgICAgICAgIHJldHVybiBwYXJzZXIuY2FsbCh0aGlzLCB2YWx1ZSwga2V5KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh1dGlscyQxLmlzUmVnRXhwKHBhcnNlcikpIHtcbiAgICAgICAgICByZXR1cm4gcGFyc2VyLmV4ZWModmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigncGFyc2VyIG11c3QgYmUgYm9vbGVhbnxyZWdleHB8ZnVuY3Rpb24nKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBoYXMoaGVhZGVyLCBtYXRjaGVyKSB7XG4gICAgaGVhZGVyID0gbm9ybWFsaXplSGVhZGVyKGhlYWRlcik7XG5cbiAgICBpZiAoaGVhZGVyKSB7XG4gICAgICBjb25zdCBrZXkgPSB1dGlscyQxLmZpbmRLZXkodGhpcywgaGVhZGVyKTtcblxuICAgICAgcmV0dXJuICEhKGtleSAmJiB0aGlzW2tleV0gIT09IHVuZGVmaW5lZCAmJiAoIW1hdGNoZXIgfHwgbWF0Y2hIZWFkZXJWYWx1ZSh0aGlzLCB0aGlzW2tleV0sIGtleSwgbWF0Y2hlcikpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBkZWxldGUoaGVhZGVyLCBtYXRjaGVyKSB7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgbGV0IGRlbGV0ZWQgPSBmYWxzZTtcblxuICAgIGZ1bmN0aW9uIGRlbGV0ZUhlYWRlcihfaGVhZGVyKSB7XG4gICAgICBfaGVhZGVyID0gbm9ybWFsaXplSGVhZGVyKF9oZWFkZXIpO1xuXG4gICAgICBpZiAoX2hlYWRlcikge1xuICAgICAgICBjb25zdCBrZXkgPSB1dGlscyQxLmZpbmRLZXkoc2VsZiwgX2hlYWRlcik7XG5cbiAgICAgICAgaWYgKGtleSAmJiAoIW1hdGNoZXIgfHwgbWF0Y2hIZWFkZXJWYWx1ZShzZWxmLCBzZWxmW2tleV0sIGtleSwgbWF0Y2hlcikpKSB7XG4gICAgICAgICAgZGVsZXRlIHNlbGZba2V5XTtcblxuICAgICAgICAgIGRlbGV0ZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHV0aWxzJDEuaXNBcnJheShoZWFkZXIpKSB7XG4gICAgICBoZWFkZXIuZm9yRWFjaChkZWxldGVIZWFkZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGVIZWFkZXIoaGVhZGVyKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVsZXRlZDtcbiAgfVxuXG4gIGNsZWFyKG1hdGNoZXIpIHtcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXModGhpcyk7XG4gICAgbGV0IGkgPSBrZXlzLmxlbmd0aDtcbiAgICBsZXQgZGVsZXRlZCA9IGZhbHNlO1xuXG4gICAgd2hpbGUgKGktLSkge1xuICAgICAgY29uc3Qga2V5ID0ga2V5c1tpXTtcbiAgICAgIGlmKCFtYXRjaGVyIHx8IG1hdGNoSGVhZGVyVmFsdWUodGhpcywgdGhpc1trZXldLCBrZXksIG1hdGNoZXIsIHRydWUpKSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzW2tleV07XG4gICAgICAgIGRlbGV0ZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBkZWxldGVkO1xuICB9XG5cbiAgbm9ybWFsaXplKGZvcm1hdCkge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7fTtcblxuICAgIHV0aWxzJDEuZm9yRWFjaCh0aGlzLCAodmFsdWUsIGhlYWRlcikgPT4ge1xuICAgICAgY29uc3Qga2V5ID0gdXRpbHMkMS5maW5kS2V5KGhlYWRlcnMsIGhlYWRlcik7XG5cbiAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgc2VsZltrZXldID0gbm9ybWFsaXplVmFsdWUodmFsdWUpO1xuICAgICAgICBkZWxldGUgc2VsZltoZWFkZXJdO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBmb3JtYXQgPyBmb3JtYXRIZWFkZXIoaGVhZGVyKSA6IFN0cmluZyhoZWFkZXIpLnRyaW0oKTtcblxuICAgICAgaWYgKG5vcm1hbGl6ZWQgIT09IGhlYWRlcikge1xuICAgICAgICBkZWxldGUgc2VsZltoZWFkZXJdO1xuICAgICAgfVxuXG4gICAgICBzZWxmW25vcm1hbGl6ZWRdID0gbm9ybWFsaXplVmFsdWUodmFsdWUpO1xuXG4gICAgICBoZWFkZXJzW25vcm1hbGl6ZWRdID0gdHJ1ZTtcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgY29uY2F0KC4uLnRhcmdldHMpIHtcbiAgICByZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci5jb25jYXQodGhpcywgLi4udGFyZ2V0cyk7XG4gIH1cblxuICB0b0pTT04oYXNTdHJpbmdzKSB7XG4gICAgY29uc3Qgb2JqID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblxuICAgIHV0aWxzJDEuZm9yRWFjaCh0aGlzLCAodmFsdWUsIGhlYWRlcikgPT4ge1xuICAgICAgdmFsdWUgIT0gbnVsbCAmJiB2YWx1ZSAhPT0gZmFsc2UgJiYgKG9ialtoZWFkZXJdID0gYXNTdHJpbmdzICYmIHV0aWxzJDEuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZS5qb2luKCcsICcpIDogdmFsdWUpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIG9iajtcbiAgfVxuXG4gIFtTeW1ib2wuaXRlcmF0b3JdKCkge1xuICAgIHJldHVybiBPYmplY3QuZW50cmllcyh0aGlzLnRvSlNPTigpKVtTeW1ib2wuaXRlcmF0b3JdKCk7XG4gIH1cblxuICB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gT2JqZWN0LmVudHJpZXModGhpcy50b0pTT04oKSkubWFwKChbaGVhZGVyLCB2YWx1ZV0pID0+IGhlYWRlciArICc6ICcgKyB2YWx1ZSkuam9pbignXFxuJyk7XG4gIH1cblxuICBnZXQgW1N5bWJvbC50b1N0cmluZ1RhZ10oKSB7XG4gICAgcmV0dXJuICdBeGlvc0hlYWRlcnMnO1xuICB9XG5cbiAgc3RhdGljIGZyb20odGhpbmcpIHtcbiAgICByZXR1cm4gdGhpbmcgaW5zdGFuY2VvZiB0aGlzID8gdGhpbmcgOiBuZXcgdGhpcyh0aGluZyk7XG4gIH1cblxuICBzdGF0aWMgY29uY2F0KGZpcnN0LCAuLi50YXJnZXRzKSB7XG4gICAgY29uc3QgY29tcHV0ZWQgPSBuZXcgdGhpcyhmaXJzdCk7XG5cbiAgICB0YXJnZXRzLmZvckVhY2goKHRhcmdldCkgPT4gY29tcHV0ZWQuc2V0KHRhcmdldCkpO1xuXG4gICAgcmV0dXJuIGNvbXB1dGVkO1xuICB9XG5cbiAgc3RhdGljIGFjY2Vzc29yKGhlYWRlcikge1xuICAgIGNvbnN0IGludGVybmFscyA9IHRoaXNbJGludGVybmFsc10gPSAodGhpc1skaW50ZXJuYWxzXSA9IHtcbiAgICAgIGFjY2Vzc29yczoge31cbiAgICB9KTtcblxuICAgIGNvbnN0IGFjY2Vzc29ycyA9IGludGVybmFscy5hY2Nlc3NvcnM7XG4gICAgY29uc3QgcHJvdG90eXBlID0gdGhpcy5wcm90b3R5cGU7XG5cbiAgICBmdW5jdGlvbiBkZWZpbmVBY2Nlc3NvcihfaGVhZGVyKSB7XG4gICAgICBjb25zdCBsSGVhZGVyID0gbm9ybWFsaXplSGVhZGVyKF9oZWFkZXIpO1xuXG4gICAgICBpZiAoIWFjY2Vzc29yc1tsSGVhZGVyXSkge1xuICAgICAgICBidWlsZEFjY2Vzc29ycyhwcm90b3R5cGUsIF9oZWFkZXIpO1xuICAgICAgICBhY2Nlc3NvcnNbbEhlYWRlcl0gPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHV0aWxzJDEuaXNBcnJheShoZWFkZXIpID8gaGVhZGVyLmZvckVhY2goZGVmaW5lQWNjZXNzb3IpIDogZGVmaW5lQWNjZXNzb3IoaGVhZGVyKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG59XG5cbkF4aW9zSGVhZGVycy5hY2Nlc3NvcihbJ0NvbnRlbnQtVHlwZScsICdDb250ZW50LUxlbmd0aCcsICdBY2NlcHQnLCAnQWNjZXB0LUVuY29kaW5nJywgJ1VzZXItQWdlbnQnLCAnQXV0aG9yaXphdGlvbiddKTtcblxuLy8gcmVzZXJ2ZWQgbmFtZXMgaG90Zml4XG51dGlscyQxLnJlZHVjZURlc2NyaXB0b3JzKEF4aW9zSGVhZGVycy5wcm90b3R5cGUsICh7dmFsdWV9LCBrZXkpID0+IHtcbiAgbGV0IG1hcHBlZCA9IGtleVswXS50b1VwcGVyQ2FzZSgpICsga2V5LnNsaWNlKDEpOyAvLyBtYXAgYHNldGAgPT4gYFNldGBcbiAgcmV0dXJuIHtcbiAgICBnZXQ6ICgpID0+IHZhbHVlLFxuICAgIHNldChoZWFkZXJWYWx1ZSkge1xuICAgICAgdGhpc1ttYXBwZWRdID0gaGVhZGVyVmFsdWU7XG4gICAgfVxuICB9XG59KTtcblxudXRpbHMkMS5mcmVlemVNZXRob2RzKEF4aW9zSGVhZGVycyk7XG5cbnZhciBBeGlvc0hlYWRlcnMkMSA9IEF4aW9zSGVhZGVycztcblxuLyoqXG4gKiBUcmFuc2Zvcm0gdGhlIGRhdGEgZm9yIGEgcmVxdWVzdCBvciBhIHJlc3BvbnNlXG4gKlxuICogQHBhcmFtIHtBcnJheXxGdW5jdGlvbn0gZm5zIEEgc2luZ2xlIGZ1bmN0aW9uIG9yIEFycmF5IG9mIGZ1bmN0aW9uc1xuICogQHBhcmFtIHs/T2JqZWN0fSByZXNwb25zZSBUaGUgcmVzcG9uc2Ugb2JqZWN0XG4gKlxuICogQHJldHVybnMgeyp9IFRoZSByZXN1bHRpbmcgdHJhbnNmb3JtZWQgZGF0YVxuICovXG5mdW5jdGlvbiB0cmFuc2Zvcm1EYXRhKGZucywgcmVzcG9uc2UpIHtcbiAgY29uc3QgY29uZmlnID0gdGhpcyB8fCBkZWZhdWx0cyQxO1xuICBjb25zdCBjb250ZXh0ID0gcmVzcG9uc2UgfHwgY29uZmlnO1xuICBjb25zdCBoZWFkZXJzID0gQXhpb3NIZWFkZXJzJDEuZnJvbShjb250ZXh0LmhlYWRlcnMpO1xuICBsZXQgZGF0YSA9IGNvbnRleHQuZGF0YTtcblxuICB1dGlscyQxLmZvckVhY2goZm5zLCBmdW5jdGlvbiB0cmFuc2Zvcm0oZm4pIHtcbiAgICBkYXRhID0gZm4uY2FsbChjb25maWcsIGRhdGEsIGhlYWRlcnMubm9ybWFsaXplKCksIHJlc3BvbnNlID8gcmVzcG9uc2Uuc3RhdHVzIDogdW5kZWZpbmVkKTtcbiAgfSk7XG5cbiAgaGVhZGVycy5ub3JtYWxpemUoKTtcblxuICByZXR1cm4gZGF0YTtcbn1cblxuZnVuY3Rpb24gaXNDYW5jZWwodmFsdWUpIHtcbiAgcmV0dXJuICEhKHZhbHVlICYmIHZhbHVlLl9fQ0FOQ0VMX18pO1xufVxuXG4vKipcbiAqIEEgYENhbmNlbGVkRXJyb3JgIGlzIGFuIG9iamVjdCB0aGF0IGlzIHRocm93biB3aGVuIGFuIG9wZXJhdGlvbiBpcyBjYW5jZWxlZC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZz19IG1lc3NhZ2UgVGhlIG1lc3NhZ2UuXG4gKiBAcGFyYW0ge09iamVjdD19IGNvbmZpZyBUaGUgY29uZmlnLlxuICogQHBhcmFtIHtPYmplY3Q9fSByZXF1ZXN0IFRoZSByZXF1ZXN0LlxuICpcbiAqIEByZXR1cm5zIHtDYW5jZWxlZEVycm9yfSBUaGUgY3JlYXRlZCBlcnJvci5cbiAqL1xuZnVuY3Rpb24gQ2FuY2VsZWRFcnJvcihtZXNzYWdlLCBjb25maWcsIHJlcXVlc3QpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWVxLW51bGwsZXFlcWVxXG4gIEF4aW9zRXJyb3IuY2FsbCh0aGlzLCBtZXNzYWdlID09IG51bGwgPyAnY2FuY2VsZWQnIDogbWVzc2FnZSwgQXhpb3NFcnJvci5FUlJfQ0FOQ0VMRUQsIGNvbmZpZywgcmVxdWVzdCk7XG4gIHRoaXMubmFtZSA9ICdDYW5jZWxlZEVycm9yJztcbn1cblxudXRpbHMkMS5pbmhlcml0cyhDYW5jZWxlZEVycm9yLCBBeGlvc0Vycm9yLCB7XG4gIF9fQ0FOQ0VMX186IHRydWVcbn0pO1xuXG4vKipcbiAqIFJlc29sdmUgb3IgcmVqZWN0IGEgUHJvbWlzZSBiYXNlZCBvbiByZXNwb25zZSBzdGF0dXMuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gcmVzb2x2ZSBBIGZ1bmN0aW9uIHRoYXQgcmVzb2x2ZXMgdGhlIHByb21pc2UuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSByZWplY3QgQSBmdW5jdGlvbiB0aGF0IHJlamVjdHMgdGhlIHByb21pc2UuXG4gKiBAcGFyYW0ge29iamVjdH0gcmVzcG9uc2UgVGhlIHJlc3BvbnNlLlxuICpcbiAqIEByZXR1cm5zIHtvYmplY3R9IFRoZSByZXNwb25zZS5cbiAqL1xuZnVuY3Rpb24gc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgcmVzcG9uc2UpIHtcbiAgY29uc3QgdmFsaWRhdGVTdGF0dXMgPSByZXNwb25zZS5jb25maWcudmFsaWRhdGVTdGF0dXM7XG4gIGlmICghcmVzcG9uc2Uuc3RhdHVzIHx8ICF2YWxpZGF0ZVN0YXR1cyB8fCB2YWxpZGF0ZVN0YXR1cyhyZXNwb25zZS5zdGF0dXMpKSB7XG4gICAgcmVzb2x2ZShyZXNwb25zZSk7XG4gIH0gZWxzZSB7XG4gICAgcmVqZWN0KG5ldyBBeGlvc0Vycm9yKFxuICAgICAgJ1JlcXVlc3QgZmFpbGVkIHdpdGggc3RhdHVzIGNvZGUgJyArIHJlc3BvbnNlLnN0YXR1cyxcbiAgICAgIFtBeGlvc0Vycm9yLkVSUl9CQURfUkVRVUVTVCwgQXhpb3NFcnJvci5FUlJfQkFEX1JFU1BPTlNFXVtNYXRoLmZsb29yKHJlc3BvbnNlLnN0YXR1cyAvIDEwMCkgLSA0XSxcbiAgICAgIHJlc3BvbnNlLmNvbmZpZyxcbiAgICAgIHJlc3BvbnNlLnJlcXVlc3QsXG4gICAgICByZXNwb25zZVxuICAgICkpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHBhcnNlUHJvdG9jb2wodXJsKSB7XG4gIGNvbnN0IG1hdGNoID0gL14oWy0rXFx3XXsxLDI1fSkoOj9cXC9cXC98OikvLmV4ZWModXJsKTtcbiAgcmV0dXJuIG1hdGNoICYmIG1hdGNoWzFdIHx8ICcnO1xufVxuXG4vKipcbiAqIENhbGN1bGF0ZSBkYXRhIG1heFJhdGVcbiAqIEBwYXJhbSB7TnVtYmVyfSBbc2FtcGxlc0NvdW50PSAxMF1cbiAqIEBwYXJhbSB7TnVtYmVyfSBbbWluPSAxMDAwXVxuICogQHJldHVybnMge0Z1bmN0aW9ufVxuICovXG5mdW5jdGlvbiBzcGVlZG9tZXRlcihzYW1wbGVzQ291bnQsIG1pbikge1xuICBzYW1wbGVzQ291bnQgPSBzYW1wbGVzQ291bnQgfHwgMTA7XG4gIGNvbnN0IGJ5dGVzID0gbmV3IEFycmF5KHNhbXBsZXNDb3VudCk7XG4gIGNvbnN0IHRpbWVzdGFtcHMgPSBuZXcgQXJyYXkoc2FtcGxlc0NvdW50KTtcbiAgbGV0IGhlYWQgPSAwO1xuICBsZXQgdGFpbCA9IDA7XG4gIGxldCBmaXJzdFNhbXBsZVRTO1xuXG4gIG1pbiA9IG1pbiAhPT0gdW5kZWZpbmVkID8gbWluIDogMTAwMDtcblxuICByZXR1cm4gZnVuY3Rpb24gcHVzaChjaHVua0xlbmd0aCkge1xuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG5cbiAgICBjb25zdCBzdGFydGVkQXQgPSB0aW1lc3RhbXBzW3RhaWxdO1xuXG4gICAgaWYgKCFmaXJzdFNhbXBsZVRTKSB7XG4gICAgICBmaXJzdFNhbXBsZVRTID0gbm93O1xuICAgIH1cblxuICAgIGJ5dGVzW2hlYWRdID0gY2h1bmtMZW5ndGg7XG4gICAgdGltZXN0YW1wc1toZWFkXSA9IG5vdztcblxuICAgIGxldCBpID0gdGFpbDtcbiAgICBsZXQgYnl0ZXNDb3VudCA9IDA7XG5cbiAgICB3aGlsZSAoaSAhPT0gaGVhZCkge1xuICAgICAgYnl0ZXNDb3VudCArPSBieXRlc1tpKytdO1xuICAgICAgaSA9IGkgJSBzYW1wbGVzQ291bnQ7XG4gICAgfVxuXG4gICAgaGVhZCA9IChoZWFkICsgMSkgJSBzYW1wbGVzQ291bnQ7XG5cbiAgICBpZiAoaGVhZCA9PT0gdGFpbCkge1xuICAgICAgdGFpbCA9ICh0YWlsICsgMSkgJSBzYW1wbGVzQ291bnQ7XG4gICAgfVxuXG4gICAgaWYgKG5vdyAtIGZpcnN0U2FtcGxlVFMgPCBtaW4pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwYXNzZWQgPSBzdGFydGVkQXQgJiYgbm93IC0gc3RhcnRlZEF0O1xuXG4gICAgcmV0dXJuIHBhc3NlZCA/IE1hdGgucm91bmQoYnl0ZXNDb3VudCAqIDEwMDAgLyBwYXNzZWQpIDogdW5kZWZpbmVkO1xuICB9O1xufVxuXG4vKipcbiAqIFRocm90dGxlIGRlY29yYXRvclxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAqIEBwYXJhbSB7TnVtYmVyfSBmcmVxXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn1cbiAqL1xuZnVuY3Rpb24gdGhyb3R0bGUoZm4sIGZyZXEpIHtcbiAgbGV0IHRpbWVzdGFtcCA9IDA7XG4gIGxldCB0aHJlc2hvbGQgPSAxMDAwIC8gZnJlcTtcbiAgbGV0IGxhc3RBcmdzO1xuICBsZXQgdGltZXI7XG5cbiAgY29uc3QgaW52b2tlID0gKGFyZ3MsIG5vdyA9IERhdGUubm93KCkpID0+IHtcbiAgICB0aW1lc3RhbXAgPSBub3c7XG4gICAgbGFzdEFyZ3MgPSBudWxsO1xuICAgIGlmICh0aW1lcikge1xuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICAgIHRpbWVyID0gbnVsbDtcbiAgICB9XG4gICAgZm4uYXBwbHkobnVsbCwgYXJncyk7XG4gIH07XG5cbiAgY29uc3QgdGhyb3R0bGVkID0gKC4uLmFyZ3MpID0+IHtcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IHBhc3NlZCA9IG5vdyAtIHRpbWVzdGFtcDtcbiAgICBpZiAoIHBhc3NlZCA+PSB0aHJlc2hvbGQpIHtcbiAgICAgIGludm9rZShhcmdzLCBub3cpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsYXN0QXJncyA9IGFyZ3M7XG4gICAgICBpZiAoIXRpbWVyKSB7XG4gICAgICAgIHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGltZXIgPSBudWxsO1xuICAgICAgICAgIGludm9rZShsYXN0QXJncyk7XG4gICAgICAgIH0sIHRocmVzaG9sZCAtIHBhc3NlZCk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGZsdXNoID0gKCkgPT4gbGFzdEFyZ3MgJiYgaW52b2tlKGxhc3RBcmdzKTtcblxuICByZXR1cm4gW3Rocm90dGxlZCwgZmx1c2hdO1xufVxuXG5jb25zdCBwcm9ncmVzc0V2ZW50UmVkdWNlciA9IChsaXN0ZW5lciwgaXNEb3dubG9hZFN0cmVhbSwgZnJlcSA9IDMpID0+IHtcbiAgbGV0IGJ5dGVzTm90aWZpZWQgPSAwO1xuICBjb25zdCBfc3BlZWRvbWV0ZXIgPSBzcGVlZG9tZXRlcig1MCwgMjUwKTtcblxuICByZXR1cm4gdGhyb3R0bGUoZSA9PiB7XG4gICAgY29uc3QgbG9hZGVkID0gZS5sb2FkZWQ7XG4gICAgY29uc3QgdG90YWwgPSBlLmxlbmd0aENvbXB1dGFibGUgPyBlLnRvdGFsIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IHByb2dyZXNzQnl0ZXMgPSBsb2FkZWQgLSBieXRlc05vdGlmaWVkO1xuICAgIGNvbnN0IHJhdGUgPSBfc3BlZWRvbWV0ZXIocHJvZ3Jlc3NCeXRlcyk7XG4gICAgY29uc3QgaW5SYW5nZSA9IGxvYWRlZCA8PSB0b3RhbDtcblxuICAgIGJ5dGVzTm90aWZpZWQgPSBsb2FkZWQ7XG5cbiAgICBjb25zdCBkYXRhID0ge1xuICAgICAgbG9hZGVkLFxuICAgICAgdG90YWwsXG4gICAgICBwcm9ncmVzczogdG90YWwgPyAobG9hZGVkIC8gdG90YWwpIDogdW5kZWZpbmVkLFxuICAgICAgYnl0ZXM6IHByb2dyZXNzQnl0ZXMsXG4gICAgICByYXRlOiByYXRlID8gcmF0ZSA6IHVuZGVmaW5lZCxcbiAgICAgIGVzdGltYXRlZDogcmF0ZSAmJiB0b3RhbCAmJiBpblJhbmdlID8gKHRvdGFsIC0gbG9hZGVkKSAvIHJhdGUgOiB1bmRlZmluZWQsXG4gICAgICBldmVudDogZSxcbiAgICAgIGxlbmd0aENvbXB1dGFibGU6IHRvdGFsICE9IG51bGwsXG4gICAgICBbaXNEb3dubG9hZFN0cmVhbSA/ICdkb3dubG9hZCcgOiAndXBsb2FkJ106IHRydWVcbiAgICB9O1xuXG4gICAgbGlzdGVuZXIoZGF0YSk7XG4gIH0sIGZyZXEpO1xufTtcblxuY29uc3QgcHJvZ3Jlc3NFdmVudERlY29yYXRvciA9ICh0b3RhbCwgdGhyb3R0bGVkKSA9PiB7XG4gIGNvbnN0IGxlbmd0aENvbXB1dGFibGUgPSB0b3RhbCAhPSBudWxsO1xuXG4gIHJldHVybiBbKGxvYWRlZCkgPT4gdGhyb3R0bGVkWzBdKHtcbiAgICBsZW5ndGhDb21wdXRhYmxlLFxuICAgIHRvdGFsLFxuICAgIGxvYWRlZFxuICB9KSwgdGhyb3R0bGVkWzFdXTtcbn07XG5cbmNvbnN0IGFzeW5jRGVjb3JhdG9yID0gKGZuKSA9PiAoLi4uYXJncykgPT4gdXRpbHMkMS5hc2FwKCgpID0+IGZuKC4uLmFyZ3MpKTtcblxudmFyIGlzVVJMU2FtZU9yaWdpbiA9IHBsYXRmb3JtLmhhc1N0YW5kYXJkQnJvd3NlckVudiA/ICgob3JpZ2luLCBpc01TSUUpID0+ICh1cmwpID0+IHtcbiAgdXJsID0gbmV3IFVSTCh1cmwsIHBsYXRmb3JtLm9yaWdpbik7XG5cbiAgcmV0dXJuIChcbiAgICBvcmlnaW4ucHJvdG9jb2wgPT09IHVybC5wcm90b2NvbCAmJlxuICAgIG9yaWdpbi5ob3N0ID09PSB1cmwuaG9zdCAmJlxuICAgIChpc01TSUUgfHwgb3JpZ2luLnBvcnQgPT09IHVybC5wb3J0KVxuICApO1xufSkoXG4gIG5ldyBVUkwocGxhdGZvcm0ub3JpZ2luKSxcbiAgcGxhdGZvcm0ubmF2aWdhdG9yICYmIC8obXNpZXx0cmlkZW50KS9pLnRlc3QocGxhdGZvcm0ubmF2aWdhdG9yLnVzZXJBZ2VudClcbikgOiAoKSA9PiB0cnVlO1xuXG52YXIgY29va2llcyA9IHBsYXRmb3JtLmhhc1N0YW5kYXJkQnJvd3NlckVudiA/XG5cbiAgLy8gU3RhbmRhcmQgYnJvd3NlciBlbnZzIHN1cHBvcnQgZG9jdW1lbnQuY29va2llXG4gIHtcbiAgICB3cml0ZShuYW1lLCB2YWx1ZSwgZXhwaXJlcywgcGF0aCwgZG9tYWluLCBzZWN1cmUpIHtcbiAgICAgIGNvbnN0IGNvb2tpZSA9IFtuYW1lICsgJz0nICsgZW5jb2RlVVJJQ29tcG9uZW50KHZhbHVlKV07XG5cbiAgICAgIHV0aWxzJDEuaXNOdW1iZXIoZXhwaXJlcykgJiYgY29va2llLnB1c2goJ2V4cGlyZXM9JyArIG5ldyBEYXRlKGV4cGlyZXMpLnRvR01UU3RyaW5nKCkpO1xuXG4gICAgICB1dGlscyQxLmlzU3RyaW5nKHBhdGgpICYmIGNvb2tpZS5wdXNoKCdwYXRoPScgKyBwYXRoKTtcblxuICAgICAgdXRpbHMkMS5pc1N0cmluZyhkb21haW4pICYmIGNvb2tpZS5wdXNoKCdkb21haW49JyArIGRvbWFpbik7XG5cbiAgICAgIHNlY3VyZSA9PT0gdHJ1ZSAmJiBjb29raWUucHVzaCgnc2VjdXJlJyk7XG5cbiAgICAgIGRvY3VtZW50LmNvb2tpZSA9IGNvb2tpZS5qb2luKCc7ICcpO1xuICAgIH0sXG5cbiAgICByZWFkKG5hbWUpIHtcbiAgICAgIGNvbnN0IG1hdGNoID0gZG9jdW1lbnQuY29va2llLm1hdGNoKG5ldyBSZWdFeHAoJyhefDtcXFxccyopKCcgKyBuYW1lICsgJyk9KFteO10qKScpKTtcbiAgICAgIHJldHVybiAobWF0Y2ggPyBkZWNvZGVVUklDb21wb25lbnQobWF0Y2hbM10pIDogbnVsbCk7XG4gICAgfSxcblxuICAgIHJlbW92ZShuYW1lKSB7XG4gICAgICB0aGlzLndyaXRlKG5hbWUsICcnLCBEYXRlLm5vdygpIC0gODY0MDAwMDApO1xuICAgIH1cbiAgfVxuXG4gIDpcblxuICAvLyBOb24tc3RhbmRhcmQgYnJvd3NlciBlbnYgKHdlYiB3b3JrZXJzLCByZWFjdC1uYXRpdmUpIGxhY2sgbmVlZGVkIHN1cHBvcnQuXG4gIHtcbiAgICB3cml0ZSgpIHt9LFxuICAgIHJlYWQoKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9LFxuICAgIHJlbW92ZSgpIHt9XG4gIH07XG5cbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgVVJMIGlzIGFic29sdXRlXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHVybCBUaGUgVVJMIHRvIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIFVSTCBpcyBhYnNvbHV0ZSwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzQWJzb2x1dGVVUkwodXJsKSB7XG4gIC8vIEEgVVJMIGlzIGNvbnNpZGVyZWQgYWJzb2x1dGUgaWYgaXQgYmVnaW5zIHdpdGggXCI8c2NoZW1lPjovL1wiIG9yIFwiLy9cIiAocHJvdG9jb2wtcmVsYXRpdmUgVVJMKS5cbiAgLy8gUkZDIDM5ODYgZGVmaW5lcyBzY2hlbWUgbmFtZSBhcyBhIHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMgYmVnaW5uaW5nIHdpdGggYSBsZXR0ZXIgYW5kIGZvbGxvd2VkXG4gIC8vIGJ5IGFueSBjb21iaW5hdGlvbiBvZiBsZXR0ZXJzLCBkaWdpdHMsIHBsdXMsIHBlcmlvZCwgb3IgaHlwaGVuLlxuICByZXR1cm4gL14oW2Etel1bYS16XFxkK1xcLS5dKjopP1xcL1xcLy9pLnRlc3QodXJsKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IFVSTCBieSBjb21iaW5pbmcgdGhlIHNwZWNpZmllZCBVUkxzXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGJhc2VVUkwgVGhlIGJhc2UgVVJMXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVsYXRpdmVVUkwgVGhlIHJlbGF0aXZlIFVSTFxuICpcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBjb21iaW5lZCBVUkxcbiAqL1xuZnVuY3Rpb24gY29tYmluZVVSTHMoYmFzZVVSTCwgcmVsYXRpdmVVUkwpIHtcbiAgcmV0dXJuIHJlbGF0aXZlVVJMXG4gICAgPyBiYXNlVVJMLnJlcGxhY2UoL1xcLz9cXC8kLywgJycpICsgJy8nICsgcmVsYXRpdmVVUkwucmVwbGFjZSgvXlxcLysvLCAnJylcbiAgICA6IGJhc2VVUkw7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBVUkwgYnkgY29tYmluaW5nIHRoZSBiYXNlVVJMIHdpdGggdGhlIHJlcXVlc3RlZFVSTCxcbiAqIG9ubHkgd2hlbiB0aGUgcmVxdWVzdGVkVVJMIGlzIG5vdCBhbHJlYWR5IGFuIGFic29sdXRlIFVSTC5cbiAqIElmIHRoZSByZXF1ZXN0VVJMIGlzIGFic29sdXRlLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHJlcXVlc3RlZFVSTCB1bnRvdWNoZWQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGJhc2VVUkwgVGhlIGJhc2UgVVJMXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVxdWVzdGVkVVJMIEFic29sdXRlIG9yIHJlbGF0aXZlIFVSTCB0byBjb21iaW5lXG4gKlxuICogQHJldHVybnMge3N0cmluZ30gVGhlIGNvbWJpbmVkIGZ1bGwgcGF0aFxuICovXG5mdW5jdGlvbiBidWlsZEZ1bGxQYXRoKGJhc2VVUkwsIHJlcXVlc3RlZFVSTCwgYWxsb3dBYnNvbHV0ZVVybHMpIHtcbiAgbGV0IGlzUmVsYXRpdmVVcmwgPSAhaXNBYnNvbHV0ZVVSTChyZXF1ZXN0ZWRVUkwpO1xuICBpZiAoYmFzZVVSTCAmJiAoaXNSZWxhdGl2ZVVybCB8fCBhbGxvd0Fic29sdXRlVXJscyA9PSBmYWxzZSkpIHtcbiAgICByZXR1cm4gY29tYmluZVVSTHMoYmFzZVVSTCwgcmVxdWVzdGVkVVJMKTtcbiAgfVxuICByZXR1cm4gcmVxdWVzdGVkVVJMO1xufVxuXG5jb25zdCBoZWFkZXJzVG9PYmplY3QgPSAodGhpbmcpID0+IHRoaW5nIGluc3RhbmNlb2YgQXhpb3NIZWFkZXJzJDEgPyB7IC4uLnRoaW5nIH0gOiB0aGluZztcblxuLyoqXG4gKiBDb25maWctc3BlY2lmaWMgbWVyZ2UtZnVuY3Rpb24gd2hpY2ggY3JlYXRlcyBhIG5ldyBjb25maWctb2JqZWN0XG4gKiBieSBtZXJnaW5nIHR3byBjb25maWd1cmF0aW9uIG9iamVjdHMgdG9nZXRoZXIuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZzFcbiAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcyXG4gKlxuICogQHJldHVybnMge09iamVjdH0gTmV3IG9iamVjdCByZXN1bHRpbmcgZnJvbSBtZXJnaW5nIGNvbmZpZzIgdG8gY29uZmlnMVxuICovXG5mdW5jdGlvbiBtZXJnZUNvbmZpZyhjb25maWcxLCBjb25maWcyKSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICBjb25maWcyID0gY29uZmlnMiB8fCB7fTtcbiAgY29uc3QgY29uZmlnID0ge307XG5cbiAgZnVuY3Rpb24gZ2V0TWVyZ2VkVmFsdWUodGFyZ2V0LCBzb3VyY2UsIHByb3AsIGNhc2VsZXNzKSB7XG4gICAgaWYgKHV0aWxzJDEuaXNQbGFpbk9iamVjdCh0YXJnZXQpICYmIHV0aWxzJDEuaXNQbGFpbk9iamVjdChzb3VyY2UpKSB7XG4gICAgICByZXR1cm4gdXRpbHMkMS5tZXJnZS5jYWxsKHtjYXNlbGVzc30sIHRhcmdldCwgc291cmNlKTtcbiAgICB9IGVsc2UgaWYgKHV0aWxzJDEuaXNQbGFpbk9iamVjdChzb3VyY2UpKSB7XG4gICAgICByZXR1cm4gdXRpbHMkMS5tZXJnZSh7fSwgc291cmNlKTtcbiAgICB9IGVsc2UgaWYgKHV0aWxzJDEuaXNBcnJheShzb3VyY2UpKSB7XG4gICAgICByZXR1cm4gc291cmNlLnNsaWNlKCk7XG4gICAgfVxuICAgIHJldHVybiBzb3VyY2U7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29uc2lzdGVudC1yZXR1cm5cbiAgZnVuY3Rpb24gbWVyZ2VEZWVwUHJvcGVydGllcyhhLCBiLCBwcm9wICwgY2FzZWxlc3MpIHtcbiAgICBpZiAoIXV0aWxzJDEuaXNVbmRlZmluZWQoYikpIHtcbiAgICAgIHJldHVybiBnZXRNZXJnZWRWYWx1ZShhLCBiLCBwcm9wICwgY2FzZWxlc3MpO1xuICAgIH0gZWxzZSBpZiAoIXV0aWxzJDEuaXNVbmRlZmluZWQoYSkpIHtcbiAgICAgIHJldHVybiBnZXRNZXJnZWRWYWx1ZSh1bmRlZmluZWQsIGEsIHByb3AgLCBjYXNlbGVzcyk7XG4gICAgfVxuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbnNpc3RlbnQtcmV0dXJuXG4gIGZ1bmN0aW9uIHZhbHVlRnJvbUNvbmZpZzIoYSwgYikge1xuICAgIGlmICghdXRpbHMkMS5pc1VuZGVmaW5lZChiKSkge1xuICAgICAgcmV0dXJuIGdldE1lcmdlZFZhbHVlKHVuZGVmaW5lZCwgYik7XG4gICAgfVxuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbnNpc3RlbnQtcmV0dXJuXG4gIGZ1bmN0aW9uIGRlZmF1bHRUb0NvbmZpZzIoYSwgYikge1xuICAgIGlmICghdXRpbHMkMS5pc1VuZGVmaW5lZChiKSkge1xuICAgICAgcmV0dXJuIGdldE1lcmdlZFZhbHVlKHVuZGVmaW5lZCwgYik7XG4gICAgfSBlbHNlIGlmICghdXRpbHMkMS5pc1VuZGVmaW5lZChhKSkge1xuICAgICAgcmV0dXJuIGdldE1lcmdlZFZhbHVlKHVuZGVmaW5lZCwgYSk7XG4gICAgfVxuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbnNpc3RlbnQtcmV0dXJuXG4gIGZ1bmN0aW9uIG1lcmdlRGlyZWN0S2V5cyhhLCBiLCBwcm9wKSB7XG4gICAgaWYgKHByb3AgaW4gY29uZmlnMikge1xuICAgICAgcmV0dXJuIGdldE1lcmdlZFZhbHVlKGEsIGIpO1xuICAgIH0gZWxzZSBpZiAocHJvcCBpbiBjb25maWcxKSB7XG4gICAgICByZXR1cm4gZ2V0TWVyZ2VkVmFsdWUodW5kZWZpbmVkLCBhKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBtZXJnZU1hcCA9IHtcbiAgICB1cmw6IHZhbHVlRnJvbUNvbmZpZzIsXG4gICAgbWV0aG9kOiB2YWx1ZUZyb21Db25maWcyLFxuICAgIGRhdGE6IHZhbHVlRnJvbUNvbmZpZzIsXG4gICAgYmFzZVVSTDogZGVmYXVsdFRvQ29uZmlnMixcbiAgICB0cmFuc2Zvcm1SZXF1ZXN0OiBkZWZhdWx0VG9Db25maWcyLFxuICAgIHRyYW5zZm9ybVJlc3BvbnNlOiBkZWZhdWx0VG9Db25maWcyLFxuICAgIHBhcmFtc1NlcmlhbGl6ZXI6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgdGltZW91dDogZGVmYXVsdFRvQ29uZmlnMixcbiAgICB0aW1lb3V0TWVzc2FnZTogZGVmYXVsdFRvQ29uZmlnMixcbiAgICB3aXRoQ3JlZGVudGlhbHM6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgd2l0aFhTUkZUb2tlbjogZGVmYXVsdFRvQ29uZmlnMixcbiAgICBhZGFwdGVyOiBkZWZhdWx0VG9Db25maWcyLFxuICAgIHJlc3BvbnNlVHlwZTogZGVmYXVsdFRvQ29uZmlnMixcbiAgICB4c3JmQ29va2llTmFtZTogZGVmYXVsdFRvQ29uZmlnMixcbiAgICB4c3JmSGVhZGVyTmFtZTogZGVmYXVsdFRvQ29uZmlnMixcbiAgICBvblVwbG9hZFByb2dyZXNzOiBkZWZhdWx0VG9Db25maWcyLFxuICAgIG9uRG93bmxvYWRQcm9ncmVzczogZGVmYXVsdFRvQ29uZmlnMixcbiAgICBkZWNvbXByZXNzOiBkZWZhdWx0VG9Db25maWcyLFxuICAgIG1heENvbnRlbnRMZW5ndGg6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgbWF4Qm9keUxlbmd0aDogZGVmYXVsdFRvQ29uZmlnMixcbiAgICBiZWZvcmVSZWRpcmVjdDogZGVmYXVsdFRvQ29uZmlnMixcbiAgICB0cmFuc3BvcnQ6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgaHR0cEFnZW50OiBkZWZhdWx0VG9Db25maWcyLFxuICAgIGh0dHBzQWdlbnQ6IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgY2FuY2VsVG9rZW46IGRlZmF1bHRUb0NvbmZpZzIsXG4gICAgc29ja2V0UGF0aDogZGVmYXVsdFRvQ29uZmlnMixcbiAgICByZXNwb25zZUVuY29kaW5nOiBkZWZhdWx0VG9Db25maWcyLFxuICAgIHZhbGlkYXRlU3RhdHVzOiBtZXJnZURpcmVjdEtleXMsXG4gICAgaGVhZGVyczogKGEsIGIgLCBwcm9wKSA9PiBtZXJnZURlZXBQcm9wZXJ0aWVzKGhlYWRlcnNUb09iamVjdChhKSwgaGVhZGVyc1RvT2JqZWN0KGIpLHByb3AsIHRydWUpXG4gIH07XG5cbiAgdXRpbHMkMS5mb3JFYWNoKE9iamVjdC5rZXlzKE9iamVjdC5hc3NpZ24oe30sIGNvbmZpZzEsIGNvbmZpZzIpKSwgZnVuY3Rpb24gY29tcHV0ZUNvbmZpZ1ZhbHVlKHByb3ApIHtcbiAgICBjb25zdCBtZXJnZSA9IG1lcmdlTWFwW3Byb3BdIHx8IG1lcmdlRGVlcFByb3BlcnRpZXM7XG4gICAgY29uc3QgY29uZmlnVmFsdWUgPSBtZXJnZShjb25maWcxW3Byb3BdLCBjb25maWcyW3Byb3BdLCBwcm9wKTtcbiAgICAodXRpbHMkMS5pc1VuZGVmaW5lZChjb25maWdWYWx1ZSkgJiYgbWVyZ2UgIT09IG1lcmdlRGlyZWN0S2V5cykgfHwgKGNvbmZpZ1twcm9wXSA9IGNvbmZpZ1ZhbHVlKTtcbiAgfSk7XG5cbiAgcmV0dXJuIGNvbmZpZztcbn1cblxudmFyIHJlc29sdmVDb25maWcgPSAoY29uZmlnKSA9PiB7XG4gIGNvbnN0IG5ld0NvbmZpZyA9IG1lcmdlQ29uZmlnKHt9LCBjb25maWcpO1xuXG4gIGxldCB7ZGF0YSwgd2l0aFhTUkZUb2tlbiwgeHNyZkhlYWRlck5hbWUsIHhzcmZDb29raWVOYW1lLCBoZWFkZXJzLCBhdXRofSA9IG5ld0NvbmZpZztcblxuICBuZXdDb25maWcuaGVhZGVycyA9IGhlYWRlcnMgPSBBeGlvc0hlYWRlcnMkMS5mcm9tKGhlYWRlcnMpO1xuXG4gIG5ld0NvbmZpZy51cmwgPSBidWlsZFVSTChidWlsZEZ1bGxQYXRoKG5ld0NvbmZpZy5iYXNlVVJMLCBuZXdDb25maWcudXJsLCBuZXdDb25maWcuYWxsb3dBYnNvbHV0ZVVybHMpLCBjb25maWcucGFyYW1zLCBjb25maWcucGFyYW1zU2VyaWFsaXplcik7XG5cbiAgLy8gSFRUUCBiYXNpYyBhdXRoZW50aWNhdGlvblxuICBpZiAoYXV0aCkge1xuICAgIGhlYWRlcnMuc2V0KCdBdXRob3JpemF0aW9uJywgJ0Jhc2ljICcgK1xuICAgICAgYnRvYSgoYXV0aC51c2VybmFtZSB8fCAnJykgKyAnOicgKyAoYXV0aC5wYXNzd29yZCA/IHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChhdXRoLnBhc3N3b3JkKSkgOiAnJykpXG4gICAgKTtcbiAgfVxuXG4gIGxldCBjb250ZW50VHlwZTtcblxuICBpZiAodXRpbHMkMS5pc0Zvcm1EYXRhKGRhdGEpKSB7XG4gICAgaWYgKHBsYXRmb3JtLmhhc1N0YW5kYXJkQnJvd3NlckVudiB8fCBwbGF0Zm9ybS5oYXNTdGFuZGFyZEJyb3dzZXJXZWJXb3JrZXJFbnYpIHtcbiAgICAgIGhlYWRlcnMuc2V0Q29udGVudFR5cGUodW5kZWZpbmVkKTsgLy8gTGV0IHRoZSBicm93c2VyIHNldCBpdFxuICAgIH0gZWxzZSBpZiAoKGNvbnRlbnRUeXBlID0gaGVhZGVycy5nZXRDb250ZW50VHlwZSgpKSAhPT0gZmFsc2UpIHtcbiAgICAgIC8vIGZpeCBzZW1pY29sb24gZHVwbGljYXRpb24gaXNzdWUgZm9yIFJlYWN0TmF0aXZlIEZvcm1EYXRhIGltcGxlbWVudGF0aW9uXG4gICAgICBjb25zdCBbdHlwZSwgLi4udG9rZW5zXSA9IGNvbnRlbnRUeXBlID8gY29udGVudFR5cGUuc3BsaXQoJzsnKS5tYXAodG9rZW4gPT4gdG9rZW4udHJpbSgpKS5maWx0ZXIoQm9vbGVhbikgOiBbXTtcbiAgICAgIGhlYWRlcnMuc2V0Q29udGVudFR5cGUoW3R5cGUgfHwgJ211bHRpcGFydC9mb3JtLWRhdGEnLCAuLi50b2tlbnNdLmpvaW4oJzsgJykpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEFkZCB4c3JmIGhlYWRlclxuICAvLyBUaGlzIGlzIG9ubHkgZG9uZSBpZiBydW5uaW5nIGluIGEgc3RhbmRhcmQgYnJvd3NlciBlbnZpcm9ubWVudC5cbiAgLy8gU3BlY2lmaWNhbGx5IG5vdCBpZiB3ZSdyZSBpbiBhIHdlYiB3b3JrZXIsIG9yIHJlYWN0LW5hdGl2ZS5cblxuICBpZiAocGxhdGZvcm0uaGFzU3RhbmRhcmRCcm93c2VyRW52KSB7XG4gICAgd2l0aFhTUkZUb2tlbiAmJiB1dGlscyQxLmlzRnVuY3Rpb24od2l0aFhTUkZUb2tlbikgJiYgKHdpdGhYU1JGVG9rZW4gPSB3aXRoWFNSRlRva2VuKG5ld0NvbmZpZykpO1xuXG4gICAgaWYgKHdpdGhYU1JGVG9rZW4gfHwgKHdpdGhYU1JGVG9rZW4gIT09IGZhbHNlICYmIGlzVVJMU2FtZU9yaWdpbihuZXdDb25maWcudXJsKSkpIHtcbiAgICAgIC8vIEFkZCB4c3JmIGhlYWRlclxuICAgICAgY29uc3QgeHNyZlZhbHVlID0geHNyZkhlYWRlck5hbWUgJiYgeHNyZkNvb2tpZU5hbWUgJiYgY29va2llcy5yZWFkKHhzcmZDb29raWVOYW1lKTtcblxuICAgICAgaWYgKHhzcmZWYWx1ZSkge1xuICAgICAgICBoZWFkZXJzLnNldCh4c3JmSGVhZGVyTmFtZSwgeHNyZlZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3Q29uZmlnO1xufTtcblxuY29uc3QgaXNYSFJBZGFwdGVyU3VwcG9ydGVkID0gdHlwZW9mIFhNTEh0dHBSZXF1ZXN0ICE9PSAndW5kZWZpbmVkJztcblxudmFyIHhockFkYXB0ZXIgPSBpc1hIUkFkYXB0ZXJTdXBwb3J0ZWQgJiYgZnVuY3Rpb24gKGNvbmZpZykge1xuICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gZGlzcGF0Y2hYaHJSZXF1ZXN0KHJlc29sdmUsIHJlamVjdCkge1xuICAgIGNvbnN0IF9jb25maWcgPSByZXNvbHZlQ29uZmlnKGNvbmZpZyk7XG4gICAgbGV0IHJlcXVlc3REYXRhID0gX2NvbmZpZy5kYXRhO1xuICAgIGNvbnN0IHJlcXVlc3RIZWFkZXJzID0gQXhpb3NIZWFkZXJzJDEuZnJvbShfY29uZmlnLmhlYWRlcnMpLm5vcm1hbGl6ZSgpO1xuICAgIGxldCB7cmVzcG9uc2VUeXBlLCBvblVwbG9hZFByb2dyZXNzLCBvbkRvd25sb2FkUHJvZ3Jlc3N9ID0gX2NvbmZpZztcbiAgICBsZXQgb25DYW5jZWxlZDtcbiAgICBsZXQgdXBsb2FkVGhyb3R0bGVkLCBkb3dubG9hZFRocm90dGxlZDtcbiAgICBsZXQgZmx1c2hVcGxvYWQsIGZsdXNoRG93bmxvYWQ7XG5cbiAgICBmdW5jdGlvbiBkb25lKCkge1xuICAgICAgZmx1c2hVcGxvYWQgJiYgZmx1c2hVcGxvYWQoKTsgLy8gZmx1c2ggZXZlbnRzXG4gICAgICBmbHVzaERvd25sb2FkICYmIGZsdXNoRG93bmxvYWQoKTsgLy8gZmx1c2ggZXZlbnRzXG5cbiAgICAgIF9jb25maWcuY2FuY2VsVG9rZW4gJiYgX2NvbmZpZy5jYW5jZWxUb2tlbi51bnN1YnNjcmliZShvbkNhbmNlbGVkKTtcblxuICAgICAgX2NvbmZpZy5zaWduYWwgJiYgX2NvbmZpZy5zaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBvbkNhbmNlbGVkKTtcbiAgICB9XG5cbiAgICBsZXQgcmVxdWVzdCA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuXG4gICAgcmVxdWVzdC5vcGVuKF9jb25maWcubWV0aG9kLnRvVXBwZXJDYXNlKCksIF9jb25maWcudXJsLCB0cnVlKTtcblxuICAgIC8vIFNldCB0aGUgcmVxdWVzdCB0aW1lb3V0IGluIE1TXG4gICAgcmVxdWVzdC50aW1lb3V0ID0gX2NvbmZpZy50aW1lb3V0O1xuXG4gICAgZnVuY3Rpb24gb25sb2FkZW5kKCkge1xuICAgICAgaWYgKCFyZXF1ZXN0KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIFByZXBhcmUgdGhlIHJlc3BvbnNlXG4gICAgICBjb25zdCByZXNwb25zZUhlYWRlcnMgPSBBeGlvc0hlYWRlcnMkMS5mcm9tKFxuICAgICAgICAnZ2V0QWxsUmVzcG9uc2VIZWFkZXJzJyBpbiByZXF1ZXN0ICYmIHJlcXVlc3QuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKClcbiAgICAgICk7XG4gICAgICBjb25zdCByZXNwb25zZURhdGEgPSAhcmVzcG9uc2VUeXBlIHx8IHJlc3BvbnNlVHlwZSA9PT0gJ3RleHQnIHx8IHJlc3BvbnNlVHlwZSA9PT0gJ2pzb24nID9cbiAgICAgICAgcmVxdWVzdC5yZXNwb25zZVRleHQgOiByZXF1ZXN0LnJlc3BvbnNlO1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSB7XG4gICAgICAgIGRhdGE6IHJlc3BvbnNlRGF0YSxcbiAgICAgICAgc3RhdHVzOiByZXF1ZXN0LnN0YXR1cyxcbiAgICAgICAgc3RhdHVzVGV4dDogcmVxdWVzdC5zdGF0dXNUZXh0LFxuICAgICAgICBoZWFkZXJzOiByZXNwb25zZUhlYWRlcnMsXG4gICAgICAgIGNvbmZpZyxcbiAgICAgICAgcmVxdWVzdFxuICAgICAgfTtcblxuICAgICAgc2V0dGxlKGZ1bmN0aW9uIF9yZXNvbHZlKHZhbHVlKSB7XG4gICAgICAgIHJlc29sdmUodmFsdWUpO1xuICAgICAgICBkb25lKCk7XG4gICAgICB9LCBmdW5jdGlvbiBfcmVqZWN0KGVycikge1xuICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgZG9uZSgpO1xuICAgICAgfSwgcmVzcG9uc2UpO1xuXG4gICAgICAvLyBDbGVhbiB1cCByZXF1ZXN0XG4gICAgICByZXF1ZXN0ID0gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoJ29ubG9hZGVuZCcgaW4gcmVxdWVzdCkge1xuICAgICAgLy8gVXNlIG9ubG9hZGVuZCBpZiBhdmFpbGFibGVcbiAgICAgIHJlcXVlc3Qub25sb2FkZW5kID0gb25sb2FkZW5kO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBMaXN0ZW4gZm9yIHJlYWR5IHN0YXRlIHRvIGVtdWxhdGUgb25sb2FkZW5kXG4gICAgICByZXF1ZXN0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uIGhhbmRsZUxvYWQoKSB7XG4gICAgICAgIGlmICghcmVxdWVzdCB8fCByZXF1ZXN0LnJlYWR5U3RhdGUgIT09IDQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUaGUgcmVxdWVzdCBlcnJvcmVkIG91dCBhbmQgd2UgZGlkbid0IGdldCBhIHJlc3BvbnNlLCB0aGlzIHdpbGwgYmVcbiAgICAgICAgLy8gaGFuZGxlZCBieSBvbmVycm9yIGluc3RlYWRcbiAgICAgICAgLy8gV2l0aCBvbmUgZXhjZXB0aW9uOiByZXF1ZXN0IHRoYXQgdXNpbmcgZmlsZTogcHJvdG9jb2wsIG1vc3QgYnJvd3NlcnNcbiAgICAgICAgLy8gd2lsbCByZXR1cm4gc3RhdHVzIGFzIDAgZXZlbiB0aG91Z2ggaXQncyBhIHN1Y2Nlc3NmdWwgcmVxdWVzdFxuICAgICAgICBpZiAocmVxdWVzdC5zdGF0dXMgPT09IDAgJiYgIShyZXF1ZXN0LnJlc3BvbnNlVVJMICYmIHJlcXVlc3QucmVzcG9uc2VVUkwuaW5kZXhPZignZmlsZTonKSA9PT0gMCkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gcmVhZHlzdGF0ZSBoYW5kbGVyIGlzIGNhbGxpbmcgYmVmb3JlIG9uZXJyb3Igb3Igb250aW1lb3V0IGhhbmRsZXJzLFxuICAgICAgICAvLyBzbyB3ZSBzaG91bGQgY2FsbCBvbmxvYWRlbmQgb24gdGhlIG5leHQgJ3RpY2snXG4gICAgICAgIHNldFRpbWVvdXQob25sb2FkZW5kKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGJyb3dzZXIgcmVxdWVzdCBjYW5jZWxsYXRpb24gKGFzIG9wcG9zZWQgdG8gYSBtYW51YWwgY2FuY2VsbGF0aW9uKVxuICAgIHJlcXVlc3Qub25hYm9ydCA9IGZ1bmN0aW9uIGhhbmRsZUFib3J0KCkge1xuICAgICAgaWYgKCFyZXF1ZXN0KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgcmVqZWN0KG5ldyBBeGlvc0Vycm9yKCdSZXF1ZXN0IGFib3J0ZWQnLCBBeGlvc0Vycm9yLkVDT05OQUJPUlRFRCwgY29uZmlnLCByZXF1ZXN0KSk7XG5cbiAgICAgIC8vIENsZWFuIHVwIHJlcXVlc3RcbiAgICAgIHJlcXVlc3QgPSBudWxsO1xuICAgIH07XG5cbiAgICAvLyBIYW5kbGUgbG93IGxldmVsIG5ldHdvcmsgZXJyb3JzXG4gICAgcmVxdWVzdC5vbmVycm9yID0gZnVuY3Rpb24gaGFuZGxlRXJyb3IoKSB7XG4gICAgICAvLyBSZWFsIGVycm9ycyBhcmUgaGlkZGVuIGZyb20gdXMgYnkgdGhlIGJyb3dzZXJcbiAgICAgIC8vIG9uZXJyb3Igc2hvdWxkIG9ubHkgZmlyZSBpZiBpdCdzIGEgbmV0d29yayBlcnJvclxuICAgICAgcmVqZWN0KG5ldyBBeGlvc0Vycm9yKCdOZXR3b3JrIEVycm9yJywgQXhpb3NFcnJvci5FUlJfTkVUV09SSywgY29uZmlnLCByZXF1ZXN0KSk7XG5cbiAgICAgIC8vIENsZWFuIHVwIHJlcXVlc3RcbiAgICAgIHJlcXVlc3QgPSBudWxsO1xuICAgIH07XG5cbiAgICAvLyBIYW5kbGUgdGltZW91dFxuICAgIHJlcXVlc3Qub250aW1lb3V0ID0gZnVuY3Rpb24gaGFuZGxlVGltZW91dCgpIHtcbiAgICAgIGxldCB0aW1lb3V0RXJyb3JNZXNzYWdlID0gX2NvbmZpZy50aW1lb3V0ID8gJ3RpbWVvdXQgb2YgJyArIF9jb25maWcudGltZW91dCArICdtcyBleGNlZWRlZCcgOiAndGltZW91dCBleGNlZWRlZCc7XG4gICAgICBjb25zdCB0cmFuc2l0aW9uYWwgPSBfY29uZmlnLnRyYW5zaXRpb25hbCB8fCB0cmFuc2l0aW9uYWxEZWZhdWx0cztcbiAgICAgIGlmIChfY29uZmlnLnRpbWVvdXRFcnJvck1lc3NhZ2UpIHtcbiAgICAgICAgdGltZW91dEVycm9yTWVzc2FnZSA9IF9jb25maWcudGltZW91dEVycm9yTWVzc2FnZTtcbiAgICAgIH1cbiAgICAgIHJlamVjdChuZXcgQXhpb3NFcnJvcihcbiAgICAgICAgdGltZW91dEVycm9yTWVzc2FnZSxcbiAgICAgICAgdHJhbnNpdGlvbmFsLmNsYXJpZnlUaW1lb3V0RXJyb3IgPyBBeGlvc0Vycm9yLkVUSU1FRE9VVCA6IEF4aW9zRXJyb3IuRUNPTk5BQk9SVEVELFxuICAgICAgICBjb25maWcsXG4gICAgICAgIHJlcXVlc3QpKTtcblxuICAgICAgLy8gQ2xlYW4gdXAgcmVxdWVzdFxuICAgICAgcmVxdWVzdCA9IG51bGw7XG4gICAgfTtcblxuICAgIC8vIFJlbW92ZSBDb250ZW50LVR5cGUgaWYgZGF0YSBpcyB1bmRlZmluZWRcbiAgICByZXF1ZXN0RGF0YSA9PT0gdW5kZWZpbmVkICYmIHJlcXVlc3RIZWFkZXJzLnNldENvbnRlbnRUeXBlKG51bGwpO1xuXG4gICAgLy8gQWRkIGhlYWRlcnMgdG8gdGhlIHJlcXVlc3RcbiAgICBpZiAoJ3NldFJlcXVlc3RIZWFkZXInIGluIHJlcXVlc3QpIHtcbiAgICAgIHV0aWxzJDEuZm9yRWFjaChyZXF1ZXN0SGVhZGVycy50b0pTT04oKSwgZnVuY3Rpb24gc2V0UmVxdWVzdEhlYWRlcih2YWwsIGtleSkge1xuICAgICAgICByZXF1ZXN0LnNldFJlcXVlc3RIZWFkZXIoa2V5LCB2YWwpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQWRkIHdpdGhDcmVkZW50aWFscyB0byByZXF1ZXN0IGlmIG5lZWRlZFxuICAgIGlmICghdXRpbHMkMS5pc1VuZGVmaW5lZChfY29uZmlnLndpdGhDcmVkZW50aWFscykpIHtcbiAgICAgIHJlcXVlc3Qud2l0aENyZWRlbnRpYWxzID0gISFfY29uZmlnLndpdGhDcmVkZW50aWFscztcbiAgICB9XG5cbiAgICAvLyBBZGQgcmVzcG9uc2VUeXBlIHRvIHJlcXVlc3QgaWYgbmVlZGVkXG4gICAgaWYgKHJlc3BvbnNlVHlwZSAmJiByZXNwb25zZVR5cGUgIT09ICdqc29uJykge1xuICAgICAgcmVxdWVzdC5yZXNwb25zZVR5cGUgPSBfY29uZmlnLnJlc3BvbnNlVHlwZTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgcHJvZ3Jlc3MgaWYgbmVlZGVkXG4gICAgaWYgKG9uRG93bmxvYWRQcm9ncmVzcykge1xuICAgICAgKFtkb3dubG9hZFRocm90dGxlZCwgZmx1c2hEb3dubG9hZF0gPSBwcm9ncmVzc0V2ZW50UmVkdWNlcihvbkRvd25sb2FkUHJvZ3Jlc3MsIHRydWUpKTtcbiAgICAgIHJlcXVlc3QuYWRkRXZlbnRMaXN0ZW5lcigncHJvZ3Jlc3MnLCBkb3dubG9hZFRocm90dGxlZCk7XG4gICAgfVxuXG4gICAgLy8gTm90IGFsbCBicm93c2VycyBzdXBwb3J0IHVwbG9hZCBldmVudHNcbiAgICBpZiAob25VcGxvYWRQcm9ncmVzcyAmJiByZXF1ZXN0LnVwbG9hZCkge1xuICAgICAgKFt1cGxvYWRUaHJvdHRsZWQsIGZsdXNoVXBsb2FkXSA9IHByb2dyZXNzRXZlbnRSZWR1Y2VyKG9uVXBsb2FkUHJvZ3Jlc3MpKTtcblxuICAgICAgcmVxdWVzdC51cGxvYWQuYWRkRXZlbnRMaXN0ZW5lcigncHJvZ3Jlc3MnLCB1cGxvYWRUaHJvdHRsZWQpO1xuXG4gICAgICByZXF1ZXN0LnVwbG9hZC5hZGRFdmVudExpc3RlbmVyKCdsb2FkZW5kJywgZmx1c2hVcGxvYWQpO1xuICAgIH1cblxuICAgIGlmIChfY29uZmlnLmNhbmNlbFRva2VuIHx8IF9jb25maWcuc2lnbmFsKSB7XG4gICAgICAvLyBIYW5kbGUgY2FuY2VsbGF0aW9uXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZnVuYy1uYW1lc1xuICAgICAgb25DYW5jZWxlZCA9IGNhbmNlbCA9PiB7XG4gICAgICAgIGlmICghcmVxdWVzdCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoIWNhbmNlbCB8fCBjYW5jZWwudHlwZSA/IG5ldyBDYW5jZWxlZEVycm9yKG51bGwsIGNvbmZpZywgcmVxdWVzdCkgOiBjYW5jZWwpO1xuICAgICAgICByZXF1ZXN0LmFib3J0KCk7XG4gICAgICAgIHJlcXVlc3QgPSBudWxsO1xuICAgICAgfTtcblxuICAgICAgX2NvbmZpZy5jYW5jZWxUb2tlbiAmJiBfY29uZmlnLmNhbmNlbFRva2VuLnN1YnNjcmliZShvbkNhbmNlbGVkKTtcbiAgICAgIGlmIChfY29uZmlnLnNpZ25hbCkge1xuICAgICAgICBfY29uZmlnLnNpZ25hbC5hYm9ydGVkID8gb25DYW5jZWxlZCgpIDogX2NvbmZpZy5zaWduYWwuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBvbkNhbmNlbGVkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBwcm90b2NvbCA9IHBhcnNlUHJvdG9jb2woX2NvbmZpZy51cmwpO1xuXG4gICAgaWYgKHByb3RvY29sICYmIHBsYXRmb3JtLnByb3RvY29scy5pbmRleE9mKHByb3RvY29sKSA9PT0gLTEpIHtcbiAgICAgIHJlamVjdChuZXcgQXhpb3NFcnJvcignVW5zdXBwb3J0ZWQgcHJvdG9jb2wgJyArIHByb3RvY29sICsgJzonLCBBeGlvc0Vycm9yLkVSUl9CQURfUkVRVUVTVCwgY29uZmlnKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG5cbiAgICAvLyBTZW5kIHRoZSByZXF1ZXN0XG4gICAgcmVxdWVzdC5zZW5kKHJlcXVlc3REYXRhIHx8IG51bGwpO1xuICB9KTtcbn07XG5cbmNvbnN0IGNvbXBvc2VTaWduYWxzID0gKHNpZ25hbHMsIHRpbWVvdXQpID0+IHtcbiAgY29uc3Qge2xlbmd0aH0gPSAoc2lnbmFscyA9IHNpZ25hbHMgPyBzaWduYWxzLmZpbHRlcihCb29sZWFuKSA6IFtdKTtcblxuICBpZiAodGltZW91dCB8fCBsZW5ndGgpIHtcbiAgICBsZXQgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcblxuICAgIGxldCBhYm9ydGVkO1xuXG4gICAgY29uc3Qgb25hYm9ydCA9IGZ1bmN0aW9uIChyZWFzb24pIHtcbiAgICAgIGlmICghYWJvcnRlZCkge1xuICAgICAgICBhYm9ydGVkID0gdHJ1ZTtcbiAgICAgICAgdW5zdWJzY3JpYmUoKTtcbiAgICAgICAgY29uc3QgZXJyID0gcmVhc29uIGluc3RhbmNlb2YgRXJyb3IgPyByZWFzb24gOiB0aGlzLnJlYXNvbjtcbiAgICAgICAgY29udHJvbGxlci5hYm9ydChlcnIgaW5zdGFuY2VvZiBBeGlvc0Vycm9yID8gZXJyIDogbmV3IENhbmNlbGVkRXJyb3IoZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IGVycikpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBsZXQgdGltZXIgPSB0aW1lb3V0ICYmIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGltZXIgPSBudWxsO1xuICAgICAgb25hYm9ydChuZXcgQXhpb3NFcnJvcihgdGltZW91dCAke3RpbWVvdXR9IG9mIG1zIGV4Y2VlZGVkYCwgQXhpb3NFcnJvci5FVElNRURPVVQpKTtcbiAgICB9LCB0aW1lb3V0KTtcblxuICAgIGNvbnN0IHVuc3Vic2NyaWJlID0gKCkgPT4ge1xuICAgICAgaWYgKHNpZ25hbHMpIHtcbiAgICAgICAgdGltZXIgJiYgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICAgICAgdGltZXIgPSBudWxsO1xuICAgICAgICBzaWduYWxzLmZvckVhY2goc2lnbmFsID0+IHtcbiAgICAgICAgICBzaWduYWwudW5zdWJzY3JpYmUgPyBzaWduYWwudW5zdWJzY3JpYmUob25hYm9ydCkgOiBzaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBvbmFib3J0KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHNpZ25hbHMgPSBudWxsO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBzaWduYWxzLmZvckVhY2goKHNpZ25hbCkgPT4gc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0Jywgb25hYm9ydCkpO1xuXG4gICAgY29uc3Qge3NpZ25hbH0gPSBjb250cm9sbGVyO1xuXG4gICAgc2lnbmFsLnVuc3Vic2NyaWJlID0gKCkgPT4gdXRpbHMkMS5hc2FwKHVuc3Vic2NyaWJlKTtcblxuICAgIHJldHVybiBzaWduYWw7XG4gIH1cbn07XG5cbnZhciBjb21wb3NlU2lnbmFscyQxID0gY29tcG9zZVNpZ25hbHM7XG5cbmNvbnN0IHN0cmVhbUNodW5rID0gZnVuY3Rpb24qIChjaHVuaywgY2h1bmtTaXplKSB7XG4gIGxldCBsZW4gPSBjaHVuay5ieXRlTGVuZ3RoO1xuXG4gIGlmICghY2h1bmtTaXplIHx8IGxlbiA8IGNodW5rU2l6ZSkge1xuICAgIHlpZWxkIGNodW5rO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxldCBwb3MgPSAwO1xuICBsZXQgZW5kO1xuXG4gIHdoaWxlIChwb3MgPCBsZW4pIHtcbiAgICBlbmQgPSBwb3MgKyBjaHVua1NpemU7XG4gICAgeWllbGQgY2h1bmsuc2xpY2UocG9zLCBlbmQpO1xuICAgIHBvcyA9IGVuZDtcbiAgfVxufTtcblxuY29uc3QgcmVhZEJ5dGVzID0gYXN5bmMgZnVuY3Rpb24qIChpdGVyYWJsZSwgY2h1bmtTaXplKSB7XG4gIGZvciBhd2FpdCAoY29uc3QgY2h1bmsgb2YgcmVhZFN0cmVhbShpdGVyYWJsZSkpIHtcbiAgICB5aWVsZCogc3RyZWFtQ2h1bmsoY2h1bmssIGNodW5rU2l6ZSk7XG4gIH1cbn07XG5cbmNvbnN0IHJlYWRTdHJlYW0gPSBhc3luYyBmdW5jdGlvbiogKHN0cmVhbSkge1xuICBpZiAoc3RyZWFtW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSkge1xuICAgIHlpZWxkKiBzdHJlYW07XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgcmVhZGVyID0gc3RyZWFtLmdldFJlYWRlcigpO1xuICB0cnkge1xuICAgIGZvciAoOzspIHtcbiAgICAgIGNvbnN0IHtkb25lLCB2YWx1ZX0gPSBhd2FpdCByZWFkZXIucmVhZCgpO1xuICAgICAgaWYgKGRvbmUpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICB5aWVsZCB2YWx1ZTtcbiAgICB9XG4gIH0gZmluYWxseSB7XG4gICAgYXdhaXQgcmVhZGVyLmNhbmNlbCgpO1xuICB9XG59O1xuXG5jb25zdCB0cmFja1N0cmVhbSA9IChzdHJlYW0sIGNodW5rU2l6ZSwgb25Qcm9ncmVzcywgb25GaW5pc2gpID0+IHtcbiAgY29uc3QgaXRlcmF0b3IgPSByZWFkQnl0ZXMoc3RyZWFtLCBjaHVua1NpemUpO1xuXG4gIGxldCBieXRlcyA9IDA7XG4gIGxldCBkb25lO1xuICBsZXQgX29uRmluaXNoID0gKGUpID0+IHtcbiAgICBpZiAoIWRvbmUpIHtcbiAgICAgIGRvbmUgPSB0cnVlO1xuICAgICAgb25GaW5pc2ggJiYgb25GaW5pc2goZSk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBuZXcgUmVhZGFibGVTdHJlYW0oe1xuICAgIGFzeW5jIHB1bGwoY29udHJvbGxlcikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3Qge2RvbmUsIHZhbHVlfSA9IGF3YWl0IGl0ZXJhdG9yLm5leHQoKTtcblxuICAgICAgICBpZiAoZG9uZSkge1xuICAgICAgICAgX29uRmluaXNoKCk7XG4gICAgICAgICAgY29udHJvbGxlci5jbG9zZSgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsZW4gPSB2YWx1ZS5ieXRlTGVuZ3RoO1xuICAgICAgICBpZiAob25Qcm9ncmVzcykge1xuICAgICAgICAgIGxldCBsb2FkZWRCeXRlcyA9IGJ5dGVzICs9IGxlbjtcbiAgICAgICAgICBvblByb2dyZXNzKGxvYWRlZEJ5dGVzKTtcbiAgICAgICAgfVxuICAgICAgICBjb250cm9sbGVyLmVucXVldWUobmV3IFVpbnQ4QXJyYXkodmFsdWUpKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBfb25GaW5pc2goZXJyKTtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgIH0sXG4gICAgY2FuY2VsKHJlYXNvbikge1xuICAgICAgX29uRmluaXNoKHJlYXNvbik7XG4gICAgICByZXR1cm4gaXRlcmF0b3IucmV0dXJuKCk7XG4gICAgfVxuICB9LCB7XG4gICAgaGlnaFdhdGVyTWFyazogMlxuICB9KVxufTtcblxuY29uc3QgaXNGZXRjaFN1cHBvcnRlZCA9IHR5cGVvZiBmZXRjaCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgUmVxdWVzdCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgUmVzcG9uc2UgPT09ICdmdW5jdGlvbic7XG5jb25zdCBpc1JlYWRhYmxlU3RyZWFtU3VwcG9ydGVkID0gaXNGZXRjaFN1cHBvcnRlZCAmJiB0eXBlb2YgUmVhZGFibGVTdHJlYW0gPT09ICdmdW5jdGlvbic7XG5cbi8vIHVzZWQgb25seSBpbnNpZGUgdGhlIGZldGNoIGFkYXB0ZXJcbmNvbnN0IGVuY29kZVRleHQgPSBpc0ZldGNoU3VwcG9ydGVkICYmICh0eXBlb2YgVGV4dEVuY29kZXIgPT09ICdmdW5jdGlvbicgP1xuICAgICgoZW5jb2RlcikgPT4gKHN0cikgPT4gZW5jb2Rlci5lbmNvZGUoc3RyKSkobmV3IFRleHRFbmNvZGVyKCkpIDpcbiAgICBhc3luYyAoc3RyKSA9PiBuZXcgVWludDhBcnJheShhd2FpdCBuZXcgUmVzcG9uc2Uoc3RyKS5hcnJheUJ1ZmZlcigpKVxuKTtcblxuY29uc3QgdGVzdCA9IChmbiwgLi4uYXJncykgPT4ge1xuICB0cnkge1xuICAgIHJldHVybiAhIWZuKC4uLmFyZ3MpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbn07XG5cbmNvbnN0IHN1cHBvcnRzUmVxdWVzdFN0cmVhbSA9IGlzUmVhZGFibGVTdHJlYW1TdXBwb3J0ZWQgJiYgdGVzdCgoKSA9PiB7XG4gIGxldCBkdXBsZXhBY2Nlc3NlZCA9IGZhbHNlO1xuXG4gIGNvbnN0IGhhc0NvbnRlbnRUeXBlID0gbmV3IFJlcXVlc3QocGxhdGZvcm0ub3JpZ2luLCB7XG4gICAgYm9keTogbmV3IFJlYWRhYmxlU3RyZWFtKCksXG4gICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgZ2V0IGR1cGxleCgpIHtcbiAgICAgIGR1cGxleEFjY2Vzc2VkID0gdHJ1ZTtcbiAgICAgIHJldHVybiAnaGFsZic7XG4gICAgfSxcbiAgfSkuaGVhZGVycy5oYXMoJ0NvbnRlbnQtVHlwZScpO1xuXG4gIHJldHVybiBkdXBsZXhBY2Nlc3NlZCAmJiAhaGFzQ29udGVudFR5cGU7XG59KTtcblxuY29uc3QgREVGQVVMVF9DSFVOS19TSVpFID0gNjQgKiAxMDI0O1xuXG5jb25zdCBzdXBwb3J0c1Jlc3BvbnNlU3RyZWFtID0gaXNSZWFkYWJsZVN0cmVhbVN1cHBvcnRlZCAmJlxuICB0ZXN0KCgpID0+IHV0aWxzJDEuaXNSZWFkYWJsZVN0cmVhbShuZXcgUmVzcG9uc2UoJycpLmJvZHkpKTtcblxuXG5jb25zdCByZXNvbHZlcnMgPSB7XG4gIHN0cmVhbTogc3VwcG9ydHNSZXNwb25zZVN0cmVhbSAmJiAoKHJlcykgPT4gcmVzLmJvZHkpXG59O1xuXG5pc0ZldGNoU3VwcG9ydGVkICYmICgoKHJlcykgPT4ge1xuICBbJ3RleHQnLCAnYXJyYXlCdWZmZXInLCAnYmxvYicsICdmb3JtRGF0YScsICdzdHJlYW0nXS5mb3JFYWNoKHR5cGUgPT4ge1xuICAgICFyZXNvbHZlcnNbdHlwZV0gJiYgKHJlc29sdmVyc1t0eXBlXSA9IHV0aWxzJDEuaXNGdW5jdGlvbihyZXNbdHlwZV0pID8gKHJlcykgPT4gcmVzW3R5cGVdKCkgOlxuICAgICAgKF8sIGNvbmZpZykgPT4ge1xuICAgICAgICB0aHJvdyBuZXcgQXhpb3NFcnJvcihgUmVzcG9uc2UgdHlwZSAnJHt0eXBlfScgaXMgbm90IHN1cHBvcnRlZGAsIEF4aW9zRXJyb3IuRVJSX05PVF9TVVBQT1JULCBjb25maWcpO1xuICAgICAgfSk7XG4gIH0pO1xufSkobmV3IFJlc3BvbnNlKSk7XG5cbmNvbnN0IGdldEJvZHlMZW5ndGggPSBhc3luYyAoYm9keSkgPT4ge1xuICBpZiAoYm9keSA9PSBudWxsKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICBpZih1dGlscyQxLmlzQmxvYihib2R5KSkge1xuICAgIHJldHVybiBib2R5LnNpemU7XG4gIH1cblxuICBpZih1dGlscyQxLmlzU3BlY0NvbXBsaWFudEZvcm0oYm9keSkpIHtcbiAgICBjb25zdCBfcmVxdWVzdCA9IG5ldyBSZXF1ZXN0KHBsYXRmb3JtLm9yaWdpbiwge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBib2R5LFxuICAgIH0pO1xuICAgIHJldHVybiAoYXdhaXQgX3JlcXVlc3QuYXJyYXlCdWZmZXIoKSkuYnl0ZUxlbmd0aDtcbiAgfVxuXG4gIGlmKHV0aWxzJDEuaXNBcnJheUJ1ZmZlclZpZXcoYm9keSkgfHwgdXRpbHMkMS5pc0FycmF5QnVmZmVyKGJvZHkpKSB7XG4gICAgcmV0dXJuIGJvZHkuYnl0ZUxlbmd0aDtcbiAgfVxuXG4gIGlmKHV0aWxzJDEuaXNVUkxTZWFyY2hQYXJhbXMoYm9keSkpIHtcbiAgICBib2R5ID0gYm9keSArICcnO1xuICB9XG5cbiAgaWYodXRpbHMkMS5pc1N0cmluZyhib2R5KSkge1xuICAgIHJldHVybiAoYXdhaXQgZW5jb2RlVGV4dChib2R5KSkuYnl0ZUxlbmd0aDtcbiAgfVxufTtcblxuY29uc3QgcmVzb2x2ZUJvZHlMZW5ndGggPSBhc3luYyAoaGVhZGVycywgYm9keSkgPT4ge1xuICBjb25zdCBsZW5ndGggPSB1dGlscyQxLnRvRmluaXRlTnVtYmVyKGhlYWRlcnMuZ2V0Q29udGVudExlbmd0aCgpKTtcblxuICByZXR1cm4gbGVuZ3RoID09IG51bGwgPyBnZXRCb2R5TGVuZ3RoKGJvZHkpIDogbGVuZ3RoO1xufTtcblxudmFyIGZldGNoQWRhcHRlciA9IGlzRmV0Y2hTdXBwb3J0ZWQgJiYgKGFzeW5jIChjb25maWcpID0+IHtcbiAgbGV0IHtcbiAgICB1cmwsXG4gICAgbWV0aG9kLFxuICAgIGRhdGEsXG4gICAgc2lnbmFsLFxuICAgIGNhbmNlbFRva2VuLFxuICAgIHRpbWVvdXQsXG4gICAgb25Eb3dubG9hZFByb2dyZXNzLFxuICAgIG9uVXBsb2FkUHJvZ3Jlc3MsXG4gICAgcmVzcG9uc2VUeXBlLFxuICAgIGhlYWRlcnMsXG4gICAgd2l0aENyZWRlbnRpYWxzID0gJ3NhbWUtb3JpZ2luJyxcbiAgICBmZXRjaE9wdGlvbnNcbiAgfSA9IHJlc29sdmVDb25maWcoY29uZmlnKTtcblxuICByZXNwb25zZVR5cGUgPSByZXNwb25zZVR5cGUgPyAocmVzcG9uc2VUeXBlICsgJycpLnRvTG93ZXJDYXNlKCkgOiAndGV4dCc7XG5cbiAgbGV0IGNvbXBvc2VkU2lnbmFsID0gY29tcG9zZVNpZ25hbHMkMShbc2lnbmFsLCBjYW5jZWxUb2tlbiAmJiBjYW5jZWxUb2tlbi50b0Fib3J0U2lnbmFsKCldLCB0aW1lb3V0KTtcblxuICBsZXQgcmVxdWVzdDtcblxuICBjb25zdCB1bnN1YnNjcmliZSA9IGNvbXBvc2VkU2lnbmFsICYmIGNvbXBvc2VkU2lnbmFsLnVuc3Vic2NyaWJlICYmICgoKSA9PiB7XG4gICAgICBjb21wb3NlZFNpZ25hbC51bnN1YnNjcmliZSgpO1xuICB9KTtcblxuICBsZXQgcmVxdWVzdENvbnRlbnRMZW5ndGg7XG5cbiAgdHJ5IHtcbiAgICBpZiAoXG4gICAgICBvblVwbG9hZFByb2dyZXNzICYmIHN1cHBvcnRzUmVxdWVzdFN0cmVhbSAmJiBtZXRob2QgIT09ICdnZXQnICYmIG1ldGhvZCAhPT0gJ2hlYWQnICYmXG4gICAgICAocmVxdWVzdENvbnRlbnRMZW5ndGggPSBhd2FpdCByZXNvbHZlQm9keUxlbmd0aChoZWFkZXJzLCBkYXRhKSkgIT09IDBcbiAgICApIHtcbiAgICAgIGxldCBfcmVxdWVzdCA9IG5ldyBSZXF1ZXN0KHVybCwge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgYm9keTogZGF0YSxcbiAgICAgICAgZHVwbGV4OiBcImhhbGZcIlxuICAgICAgfSk7XG5cbiAgICAgIGxldCBjb250ZW50VHlwZUhlYWRlcjtcblxuICAgICAgaWYgKHV0aWxzJDEuaXNGb3JtRGF0YShkYXRhKSAmJiAoY29udGVudFR5cGVIZWFkZXIgPSBfcmVxdWVzdC5oZWFkZXJzLmdldCgnY29udGVudC10eXBlJykpKSB7XG4gICAgICAgIGhlYWRlcnMuc2V0Q29udGVudFR5cGUoY29udGVudFR5cGVIZWFkZXIpO1xuICAgICAgfVxuXG4gICAgICBpZiAoX3JlcXVlc3QuYm9keSkge1xuICAgICAgICBjb25zdCBbb25Qcm9ncmVzcywgZmx1c2hdID0gcHJvZ3Jlc3NFdmVudERlY29yYXRvcihcbiAgICAgICAgICByZXF1ZXN0Q29udGVudExlbmd0aCxcbiAgICAgICAgICBwcm9ncmVzc0V2ZW50UmVkdWNlcihhc3luY0RlY29yYXRvcihvblVwbG9hZFByb2dyZXNzKSlcbiAgICAgICAgKTtcblxuICAgICAgICBkYXRhID0gdHJhY2tTdHJlYW0oX3JlcXVlc3QuYm9keSwgREVGQVVMVF9DSFVOS19TSVpFLCBvblByb2dyZXNzLCBmbHVzaCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCF1dGlscyQxLmlzU3RyaW5nKHdpdGhDcmVkZW50aWFscykpIHtcbiAgICAgIHdpdGhDcmVkZW50aWFscyA9IHdpdGhDcmVkZW50aWFscyA/ICdpbmNsdWRlJyA6ICdvbWl0JztcbiAgICB9XG5cbiAgICAvLyBDbG91ZGZsYXJlIFdvcmtlcnMgdGhyb3dzIHdoZW4gY3JlZGVudGlhbHMgYXJlIGRlZmluZWRcbiAgICAvLyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2Nsb3VkZmxhcmUvd29ya2VyZC9pc3N1ZXMvOTAyXG4gICAgY29uc3QgaXNDcmVkZW50aWFsc1N1cHBvcnRlZCA9IFwiY3JlZGVudGlhbHNcIiBpbiBSZXF1ZXN0LnByb3RvdHlwZTtcbiAgICByZXF1ZXN0ID0gbmV3IFJlcXVlc3QodXJsLCB7XG4gICAgICAuLi5mZXRjaE9wdGlvbnMsXG4gICAgICBzaWduYWw6IGNvbXBvc2VkU2lnbmFsLFxuICAgICAgbWV0aG9kOiBtZXRob2QudG9VcHBlckNhc2UoKSxcbiAgICAgIGhlYWRlcnM6IGhlYWRlcnMubm9ybWFsaXplKCkudG9KU09OKCksXG4gICAgICBib2R5OiBkYXRhLFxuICAgICAgZHVwbGV4OiBcImhhbGZcIixcbiAgICAgIGNyZWRlbnRpYWxzOiBpc0NyZWRlbnRpYWxzU3VwcG9ydGVkID8gd2l0aENyZWRlbnRpYWxzIDogdW5kZWZpbmVkXG4gICAgfSk7XG5cbiAgICBsZXQgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChyZXF1ZXN0KTtcblxuICAgIGNvbnN0IGlzU3RyZWFtUmVzcG9uc2UgPSBzdXBwb3J0c1Jlc3BvbnNlU3RyZWFtICYmIChyZXNwb25zZVR5cGUgPT09ICdzdHJlYW0nIHx8IHJlc3BvbnNlVHlwZSA9PT0gJ3Jlc3BvbnNlJyk7XG5cbiAgICBpZiAoc3VwcG9ydHNSZXNwb25zZVN0cmVhbSAmJiAob25Eb3dubG9hZFByb2dyZXNzIHx8IChpc1N0cmVhbVJlc3BvbnNlICYmIHVuc3Vic2NyaWJlKSkpIHtcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSB7fTtcblxuICAgICAgWydzdGF0dXMnLCAnc3RhdHVzVGV4dCcsICdoZWFkZXJzJ10uZm9yRWFjaChwcm9wID0+IHtcbiAgICAgICAgb3B0aW9uc1twcm9wXSA9IHJlc3BvbnNlW3Byb3BdO1xuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHJlc3BvbnNlQ29udGVudExlbmd0aCA9IHV0aWxzJDEudG9GaW5pdGVOdW1iZXIocmVzcG9uc2UuaGVhZGVycy5nZXQoJ2NvbnRlbnQtbGVuZ3RoJykpO1xuXG4gICAgICBjb25zdCBbb25Qcm9ncmVzcywgZmx1c2hdID0gb25Eb3dubG9hZFByb2dyZXNzICYmIHByb2dyZXNzRXZlbnREZWNvcmF0b3IoXG4gICAgICAgIHJlc3BvbnNlQ29udGVudExlbmd0aCxcbiAgICAgICAgcHJvZ3Jlc3NFdmVudFJlZHVjZXIoYXN5bmNEZWNvcmF0b3Iob25Eb3dubG9hZFByb2dyZXNzKSwgdHJ1ZSlcbiAgICAgICkgfHwgW107XG5cbiAgICAgIHJlc3BvbnNlID0gbmV3IFJlc3BvbnNlKFxuICAgICAgICB0cmFja1N0cmVhbShyZXNwb25zZS5ib2R5LCBERUZBVUxUX0NIVU5LX1NJWkUsIG9uUHJvZ3Jlc3MsICgpID0+IHtcbiAgICAgICAgICBmbHVzaCAmJiBmbHVzaCgpO1xuICAgICAgICAgIHVuc3Vic2NyaWJlICYmIHVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH0pLFxuICAgICAgICBvcHRpb25zXG4gICAgICApO1xuICAgIH1cblxuICAgIHJlc3BvbnNlVHlwZSA9IHJlc3BvbnNlVHlwZSB8fCAndGV4dCc7XG5cbiAgICBsZXQgcmVzcG9uc2VEYXRhID0gYXdhaXQgcmVzb2x2ZXJzW3V0aWxzJDEuZmluZEtleShyZXNvbHZlcnMsIHJlc3BvbnNlVHlwZSkgfHwgJ3RleHQnXShyZXNwb25zZSwgY29uZmlnKTtcblxuICAgICFpc1N0cmVhbVJlc3BvbnNlICYmIHVuc3Vic2NyaWJlICYmIHVuc3Vic2NyaWJlKCk7XG5cbiAgICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgc2V0dGxlKHJlc29sdmUsIHJlamVjdCwge1xuICAgICAgICBkYXRhOiByZXNwb25zZURhdGEsXG4gICAgICAgIGhlYWRlcnM6IEF4aW9zSGVhZGVycyQxLmZyb20ocmVzcG9uc2UuaGVhZGVycyksXG4gICAgICAgIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLFxuICAgICAgICBzdGF0dXNUZXh0OiByZXNwb25zZS5zdGF0dXNUZXh0LFxuICAgICAgICBjb25maWcsXG4gICAgICAgIHJlcXVlc3RcbiAgICAgIH0pO1xuICAgIH0pXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHVuc3Vic2NyaWJlICYmIHVuc3Vic2NyaWJlKCk7XG5cbiAgICBpZiAoZXJyICYmIGVyci5uYW1lID09PSAnVHlwZUVycm9yJyAmJiAvZmV0Y2gvaS50ZXN0KGVyci5tZXNzYWdlKSkge1xuICAgICAgdGhyb3cgT2JqZWN0LmFzc2lnbihcbiAgICAgICAgbmV3IEF4aW9zRXJyb3IoJ05ldHdvcmsgRXJyb3InLCBBeGlvc0Vycm9yLkVSUl9ORVRXT1JLLCBjb25maWcsIHJlcXVlc3QpLFxuICAgICAgICB7XG4gICAgICAgICAgY2F1c2U6IGVyci5jYXVzZSB8fCBlcnJcbiAgICAgICAgfVxuICAgICAgKVxuICAgIH1cblxuICAgIHRocm93IEF4aW9zRXJyb3IuZnJvbShlcnIsIGVyciAmJiBlcnIuY29kZSwgY29uZmlnLCByZXF1ZXN0KTtcbiAgfVxufSk7XG5cbmNvbnN0IGtub3duQWRhcHRlcnMgPSB7XG4gIGh0dHA6IGh0dHBBZGFwdGVyLFxuICB4aHI6IHhockFkYXB0ZXIsXG4gIGZldGNoOiBmZXRjaEFkYXB0ZXJcbn07XG5cbnV0aWxzJDEuZm9yRWFjaChrbm93bkFkYXB0ZXJzLCAoZm4sIHZhbHVlKSA9PiB7XG4gIGlmIChmbikge1xuICAgIHRyeSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZm4sICduYW1lJywge3ZhbHVlfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWVtcHR5XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmbiwgJ2FkYXB0ZXJOYW1lJywge3ZhbHVlfSk7XG4gIH1cbn0pO1xuXG5jb25zdCByZW5kZXJSZWFzb24gPSAocmVhc29uKSA9PiBgLSAke3JlYXNvbn1gO1xuXG5jb25zdCBpc1Jlc29sdmVkSGFuZGxlID0gKGFkYXB0ZXIpID0+IHV0aWxzJDEuaXNGdW5jdGlvbihhZGFwdGVyKSB8fCBhZGFwdGVyID09PSBudWxsIHx8IGFkYXB0ZXIgPT09IGZhbHNlO1xuXG52YXIgYWRhcHRlcnMgPSB7XG4gIGdldEFkYXB0ZXI6IChhZGFwdGVycykgPT4ge1xuICAgIGFkYXB0ZXJzID0gdXRpbHMkMS5pc0FycmF5KGFkYXB0ZXJzKSA/IGFkYXB0ZXJzIDogW2FkYXB0ZXJzXTtcblxuICAgIGNvbnN0IHtsZW5ndGh9ID0gYWRhcHRlcnM7XG4gICAgbGV0IG5hbWVPckFkYXB0ZXI7XG4gICAgbGV0IGFkYXB0ZXI7XG5cbiAgICBjb25zdCByZWplY3RlZFJlYXNvbnMgPSB7fTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIG5hbWVPckFkYXB0ZXIgPSBhZGFwdGVyc1tpXTtcbiAgICAgIGxldCBpZDtcblxuICAgICAgYWRhcHRlciA9IG5hbWVPckFkYXB0ZXI7XG5cbiAgICAgIGlmICghaXNSZXNvbHZlZEhhbmRsZShuYW1lT3JBZGFwdGVyKSkge1xuICAgICAgICBhZGFwdGVyID0ga25vd25BZGFwdGVyc1soaWQgPSBTdHJpbmcobmFtZU9yQWRhcHRlcikpLnRvTG93ZXJDYXNlKCldO1xuXG4gICAgICAgIGlmIChhZGFwdGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgQXhpb3NFcnJvcihgVW5rbm93biBhZGFwdGVyICcke2lkfSdgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoYWRhcHRlcikge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgcmVqZWN0ZWRSZWFzb25zW2lkIHx8ICcjJyArIGldID0gYWRhcHRlcjtcbiAgICB9XG5cbiAgICBpZiAoIWFkYXB0ZXIpIHtcblxuICAgICAgY29uc3QgcmVhc29ucyA9IE9iamVjdC5lbnRyaWVzKHJlamVjdGVkUmVhc29ucylcbiAgICAgICAgLm1hcCgoW2lkLCBzdGF0ZV0pID0+IGBhZGFwdGVyICR7aWR9IGAgK1xuICAgICAgICAgIChzdGF0ZSA9PT0gZmFsc2UgPyAnaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgZW52aXJvbm1lbnQnIDogJ2lzIG5vdCBhdmFpbGFibGUgaW4gdGhlIGJ1aWxkJylcbiAgICAgICAgKTtcblxuICAgICAgbGV0IHMgPSBsZW5ndGggP1xuICAgICAgICAocmVhc29ucy5sZW5ndGggPiAxID8gJ3NpbmNlIDpcXG4nICsgcmVhc29ucy5tYXAocmVuZGVyUmVhc29uKS5qb2luKCdcXG4nKSA6ICcgJyArIHJlbmRlclJlYXNvbihyZWFzb25zWzBdKSkgOlxuICAgICAgICAnYXMgbm8gYWRhcHRlciBzcGVjaWZpZWQnO1xuXG4gICAgICB0aHJvdyBuZXcgQXhpb3NFcnJvcihcbiAgICAgICAgYFRoZXJlIGlzIG5vIHN1aXRhYmxlIGFkYXB0ZXIgdG8gZGlzcGF0Y2ggdGhlIHJlcXVlc3QgYCArIHMsXG4gICAgICAgICdFUlJfTk9UX1NVUFBPUlQnXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBhZGFwdGVyO1xuICB9LFxuICBhZGFwdGVyczoga25vd25BZGFwdGVyc1xufTtcblxuLyoqXG4gKiBUaHJvd3MgYSBgQ2FuY2VsZWRFcnJvcmAgaWYgY2FuY2VsbGF0aW9uIGhhcyBiZWVuIHJlcXVlc3RlZC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gY29uZmlnIFRoZSBjb25maWcgdGhhdCBpcyB0byBiZSB1c2VkIGZvciB0aGUgcmVxdWVzdFxuICpcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiB0aHJvd0lmQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKGNvbmZpZykge1xuICBpZiAoY29uZmlnLmNhbmNlbFRva2VuKSB7XG4gICAgY29uZmlnLmNhbmNlbFRva2VuLnRocm93SWZSZXF1ZXN0ZWQoKTtcbiAgfVxuXG4gIGlmIChjb25maWcuc2lnbmFsICYmIGNvbmZpZy5zaWduYWwuYWJvcnRlZCkge1xuICAgIHRocm93IG5ldyBDYW5jZWxlZEVycm9yKG51bGwsIGNvbmZpZyk7XG4gIH1cbn1cblxuLyoqXG4gKiBEaXNwYXRjaCBhIHJlcXVlc3QgdG8gdGhlIHNlcnZlciB1c2luZyB0aGUgY29uZmlndXJlZCBhZGFwdGVyLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBjb25maWcgVGhlIGNvbmZpZyB0aGF0IGlzIHRvIGJlIHVzZWQgZm9yIHRoZSByZXF1ZXN0XG4gKlxuICogQHJldHVybnMge1Byb21pc2V9IFRoZSBQcm9taXNlIHRvIGJlIGZ1bGZpbGxlZFxuICovXG5mdW5jdGlvbiBkaXNwYXRjaFJlcXVlc3QoY29uZmlnKSB7XG4gIHRocm93SWZDYW5jZWxsYXRpb25SZXF1ZXN0ZWQoY29uZmlnKTtcblxuICBjb25maWcuaGVhZGVycyA9IEF4aW9zSGVhZGVycyQxLmZyb20oY29uZmlnLmhlYWRlcnMpO1xuXG4gIC8vIFRyYW5zZm9ybSByZXF1ZXN0IGRhdGFcbiAgY29uZmlnLmRhdGEgPSB0cmFuc2Zvcm1EYXRhLmNhbGwoXG4gICAgY29uZmlnLFxuICAgIGNvbmZpZy50cmFuc2Zvcm1SZXF1ZXN0XG4gICk7XG5cbiAgaWYgKFsncG9zdCcsICdwdXQnLCAncGF0Y2gnXS5pbmRleE9mKGNvbmZpZy5tZXRob2QpICE9PSAtMSkge1xuICAgIGNvbmZpZy5oZWFkZXJzLnNldENvbnRlbnRUeXBlKCdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnLCBmYWxzZSk7XG4gIH1cblxuICBjb25zdCBhZGFwdGVyID0gYWRhcHRlcnMuZ2V0QWRhcHRlcihjb25maWcuYWRhcHRlciB8fCBkZWZhdWx0cyQxLmFkYXB0ZXIpO1xuXG4gIHJldHVybiBhZGFwdGVyKGNvbmZpZykudGhlbihmdW5jdGlvbiBvbkFkYXB0ZXJSZXNvbHV0aW9uKHJlc3BvbnNlKSB7XG4gICAgdGhyb3dJZkNhbmNlbGxhdGlvblJlcXVlc3RlZChjb25maWcpO1xuXG4gICAgLy8gVHJhbnNmb3JtIHJlc3BvbnNlIGRhdGFcbiAgICByZXNwb25zZS5kYXRhID0gdHJhbnNmb3JtRGF0YS5jYWxsKFxuICAgICAgY29uZmlnLFxuICAgICAgY29uZmlnLnRyYW5zZm9ybVJlc3BvbnNlLFxuICAgICAgcmVzcG9uc2VcbiAgICApO1xuXG4gICAgcmVzcG9uc2UuaGVhZGVycyA9IEF4aW9zSGVhZGVycyQxLmZyb20ocmVzcG9uc2UuaGVhZGVycyk7XG5cbiAgICByZXR1cm4gcmVzcG9uc2U7XG4gIH0sIGZ1bmN0aW9uIG9uQWRhcHRlclJlamVjdGlvbihyZWFzb24pIHtcbiAgICBpZiAoIWlzQ2FuY2VsKHJlYXNvbikpIHtcbiAgICAgIHRocm93SWZDYW5jZWxsYXRpb25SZXF1ZXN0ZWQoY29uZmlnKTtcblxuICAgICAgLy8gVHJhbnNmb3JtIHJlc3BvbnNlIGRhdGFcbiAgICAgIGlmIChyZWFzb24gJiYgcmVhc29uLnJlc3BvbnNlKSB7XG4gICAgICAgIHJlYXNvbi5yZXNwb25zZS5kYXRhID0gdHJhbnNmb3JtRGF0YS5jYWxsKFxuICAgICAgICAgIGNvbmZpZyxcbiAgICAgICAgICBjb25maWcudHJhbnNmb3JtUmVzcG9uc2UsXG4gICAgICAgICAgcmVhc29uLnJlc3BvbnNlXG4gICAgICAgICk7XG4gICAgICAgIHJlYXNvbi5yZXNwb25zZS5oZWFkZXJzID0gQXhpb3NIZWFkZXJzJDEuZnJvbShyZWFzb24ucmVzcG9uc2UuaGVhZGVycyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIFByb21pc2UucmVqZWN0KHJlYXNvbik7XG4gIH0pO1xufVxuXG5jb25zdCBWRVJTSU9OID0gXCIxLjguNFwiO1xuXG5jb25zdCB2YWxpZGF0b3JzJDEgPSB7fTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGZ1bmMtbmFtZXNcblsnb2JqZWN0JywgJ2Jvb2xlYW4nLCAnbnVtYmVyJywgJ2Z1bmN0aW9uJywgJ3N0cmluZycsICdzeW1ib2wnXS5mb3JFYWNoKCh0eXBlLCBpKSA9PiB7XG4gIHZhbGlkYXRvcnMkMVt0eXBlXSA9IGZ1bmN0aW9uIHZhbGlkYXRvcih0aGluZykge1xuICAgIHJldHVybiB0eXBlb2YgdGhpbmcgPT09IHR5cGUgfHwgJ2EnICsgKGkgPCAxID8gJ24gJyA6ICcgJykgKyB0eXBlO1xuICB9O1xufSk7XG5cbmNvbnN0IGRlcHJlY2F0ZWRXYXJuaW5ncyA9IHt9O1xuXG4vKipcbiAqIFRyYW5zaXRpb25hbCBvcHRpb24gdmFsaWRhdG9yXG4gKlxuICogQHBhcmFtIHtmdW5jdGlvbnxib29sZWFuP30gdmFsaWRhdG9yIC0gc2V0IHRvIGZhbHNlIGlmIHRoZSB0cmFuc2l0aW9uYWwgb3B0aW9uIGhhcyBiZWVuIHJlbW92ZWRcbiAqIEBwYXJhbSB7c3RyaW5nP30gdmVyc2lvbiAtIGRlcHJlY2F0ZWQgdmVyc2lvbiAvIHJlbW92ZWQgc2luY2UgdmVyc2lvblxuICogQHBhcmFtIHtzdHJpbmc/fSBtZXNzYWdlIC0gc29tZSBtZXNzYWdlIHdpdGggYWRkaXRpb25hbCBpbmZvXG4gKlxuICogQHJldHVybnMge2Z1bmN0aW9ufVxuICovXG52YWxpZGF0b3JzJDEudHJhbnNpdGlvbmFsID0gZnVuY3Rpb24gdHJhbnNpdGlvbmFsKHZhbGlkYXRvciwgdmVyc2lvbiwgbWVzc2FnZSkge1xuICBmdW5jdGlvbiBmb3JtYXRNZXNzYWdlKG9wdCwgZGVzYykge1xuICAgIHJldHVybiAnW0F4aW9zIHYnICsgVkVSU0lPTiArICddIFRyYW5zaXRpb25hbCBvcHRpb24gXFwnJyArIG9wdCArICdcXCcnICsgZGVzYyArIChtZXNzYWdlID8gJy4gJyArIG1lc3NhZ2UgOiAnJyk7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZnVuYy1uYW1lc1xuICByZXR1cm4gKHZhbHVlLCBvcHQsIG9wdHMpID0+IHtcbiAgICBpZiAodmFsaWRhdG9yID09PSBmYWxzZSkge1xuICAgICAgdGhyb3cgbmV3IEF4aW9zRXJyb3IoXG4gICAgICAgIGZvcm1hdE1lc3NhZ2Uob3B0LCAnIGhhcyBiZWVuIHJlbW92ZWQnICsgKHZlcnNpb24gPyAnIGluICcgKyB2ZXJzaW9uIDogJycpKSxcbiAgICAgICAgQXhpb3NFcnJvci5FUlJfREVQUkVDQVRFRFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAodmVyc2lvbiAmJiAhZGVwcmVjYXRlZFdhcm5pbmdzW29wdF0pIHtcbiAgICAgIGRlcHJlY2F0ZWRXYXJuaW5nc1tvcHRdID0gdHJ1ZTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGZvcm1hdE1lc3NhZ2UoXG4gICAgICAgICAgb3B0LFxuICAgICAgICAgICcgaGFzIGJlZW4gZGVwcmVjYXRlZCBzaW5jZSB2JyArIHZlcnNpb24gKyAnIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5lYXIgZnV0dXJlJ1xuICAgICAgICApXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiB2YWxpZGF0b3IgPyB2YWxpZGF0b3IodmFsdWUsIG9wdCwgb3B0cykgOiB0cnVlO1xuICB9O1xufTtcblxudmFsaWRhdG9ycyQxLnNwZWxsaW5nID0gZnVuY3Rpb24gc3BlbGxpbmcoY29ycmVjdFNwZWxsaW5nKSB7XG4gIHJldHVybiAodmFsdWUsIG9wdCkgPT4ge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgY29uc29sZS53YXJuKGAke29wdH0gaXMgbGlrZWx5IGEgbWlzc3BlbGxpbmcgb2YgJHtjb3JyZWN0U3BlbGxpbmd9YCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn07XG5cbi8qKlxuICogQXNzZXJ0IG9iamVjdCdzIHByb3BlcnRpZXMgdHlwZVxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gKiBAcGFyYW0ge29iamVjdH0gc2NoZW1hXG4gKiBAcGFyYW0ge2Jvb2xlYW4/fSBhbGxvd1Vua25vd25cbiAqXG4gKiBAcmV0dXJucyB7b2JqZWN0fVxuICovXG5cbmZ1bmN0aW9uIGFzc2VydE9wdGlvbnMob3B0aW9ucywgc2NoZW1hLCBhbGxvd1Vua25vd24pIHtcbiAgaWYgKHR5cGVvZiBvcHRpb25zICE9PSAnb2JqZWN0Jykge1xuICAgIHRocm93IG5ldyBBeGlvc0Vycm9yKCdvcHRpb25zIG11c3QgYmUgYW4gb2JqZWN0JywgQXhpb3NFcnJvci5FUlJfQkFEX09QVElPTl9WQUxVRSk7XG4gIH1cbiAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKG9wdGlvbnMpO1xuICBsZXQgaSA9IGtleXMubGVuZ3RoO1xuICB3aGlsZSAoaS0tID4gMCkge1xuICAgIGNvbnN0IG9wdCA9IGtleXNbaV07XG4gICAgY29uc3QgdmFsaWRhdG9yID0gc2NoZW1hW29wdF07XG4gICAgaWYgKHZhbGlkYXRvcikge1xuICAgICAgY29uc3QgdmFsdWUgPSBvcHRpb25zW29wdF07XG4gICAgICBjb25zdCByZXN1bHQgPSB2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbGlkYXRvcih2YWx1ZSwgb3B0LCBvcHRpb25zKTtcbiAgICAgIGlmIChyZXN1bHQgIT09IHRydWUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEF4aW9zRXJyb3IoJ29wdGlvbiAnICsgb3B0ICsgJyBtdXN0IGJlICcgKyByZXN1bHQsIEF4aW9zRXJyb3IuRVJSX0JBRF9PUFRJT05fVkFMVUUpO1xuICAgICAgfVxuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChhbGxvd1Vua25vd24gIT09IHRydWUpIHtcbiAgICAgIHRocm93IG5ldyBBeGlvc0Vycm9yKCdVbmtub3duIG9wdGlvbiAnICsgb3B0LCBBeGlvc0Vycm9yLkVSUl9CQURfT1BUSU9OKTtcbiAgICB9XG4gIH1cbn1cblxudmFyIHZhbGlkYXRvciA9IHtcbiAgYXNzZXJ0T3B0aW9ucyxcbiAgdmFsaWRhdG9yczogdmFsaWRhdG9ycyQxXG59O1xuXG5jb25zdCB2YWxpZGF0b3JzID0gdmFsaWRhdG9yLnZhbGlkYXRvcnM7XG5cbi8qKlxuICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIEF4aW9zXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGluc3RhbmNlQ29uZmlnIFRoZSBkZWZhdWx0IGNvbmZpZyBmb3IgdGhlIGluc3RhbmNlXG4gKlxuICogQHJldHVybiB7QXhpb3N9IEEgbmV3IGluc3RhbmNlIG9mIEF4aW9zXG4gKi9cbmNsYXNzIEF4aW9zIHtcbiAgY29uc3RydWN0b3IoaW5zdGFuY2VDb25maWcpIHtcbiAgICB0aGlzLmRlZmF1bHRzID0gaW5zdGFuY2VDb25maWc7XG4gICAgdGhpcy5pbnRlcmNlcHRvcnMgPSB7XG4gICAgICByZXF1ZXN0OiBuZXcgSW50ZXJjZXB0b3JNYW5hZ2VyJDEoKSxcbiAgICAgIHJlc3BvbnNlOiBuZXcgSW50ZXJjZXB0b3JNYW5hZ2VyJDEoKVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogRGlzcGF0Y2ggYSByZXF1ZXN0XG4gICAqXG4gICAqIEBwYXJhbSB7U3RyaW5nfE9iamVjdH0gY29uZmlnT3JVcmwgVGhlIGNvbmZpZyBzcGVjaWZpYyBmb3IgdGhpcyByZXF1ZXN0IChtZXJnZWQgd2l0aCB0aGlzLmRlZmF1bHRzKVxuICAgKiBAcGFyYW0gez9PYmplY3R9IGNvbmZpZ1xuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gVGhlIFByb21pc2UgdG8gYmUgZnVsZmlsbGVkXG4gICAqL1xuICBhc3luYyByZXF1ZXN0KGNvbmZpZ09yVXJsLCBjb25maWcpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX3JlcXVlc3QoY29uZmlnT3JVcmwsIGNvbmZpZyk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBpZiAoZXJyIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgbGV0IGR1bW15ID0ge307XG5cbiAgICAgICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UgPyBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZShkdW1teSkgOiAoZHVtbXkgPSBuZXcgRXJyb3IoKSk7XG5cbiAgICAgICAgLy8gc2xpY2Ugb2ZmIHRoZSBFcnJvcjogLi4uIGxpbmVcbiAgICAgICAgY29uc3Qgc3RhY2sgPSBkdW1teS5zdGFjayA/IGR1bW15LnN0YWNrLnJlcGxhY2UoL14uK1xcbi8sICcnKSA6ICcnO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmICghZXJyLnN0YWNrKSB7XG4gICAgICAgICAgICBlcnIuc3RhY2sgPSBzdGFjaztcbiAgICAgICAgICAgIC8vIG1hdGNoIHdpdGhvdXQgdGhlIDIgdG9wIHN0YWNrIGxpbmVzXG4gICAgICAgICAgfSBlbHNlIGlmIChzdGFjayAmJiAhU3RyaW5nKGVyci5zdGFjaykuZW5kc1dpdGgoc3RhY2sucmVwbGFjZSgvXi4rXFxuLitcXG4vLCAnJykpKSB7XG4gICAgICAgICAgICBlcnIuc3RhY2sgKz0gJ1xcbicgKyBzdGFjaztcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAvLyBpZ25vcmUgdGhlIGNhc2Ugd2hlcmUgXCJzdGFja1wiIGlzIGFuIHVuLXdyaXRhYmxlIHByb3BlcnR5XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgfVxuXG4gIF9yZXF1ZXN0KGNvbmZpZ09yVXJsLCBjb25maWcpIHtcbiAgICAvKmVzbGludCBuby1wYXJhbS1yZWFzc2lnbjowKi9cbiAgICAvLyBBbGxvdyBmb3IgYXhpb3MoJ2V4YW1wbGUvdXJsJ1ssIGNvbmZpZ10pIGEgbGEgZmV0Y2ggQVBJXG4gICAgaWYgKHR5cGVvZiBjb25maWdPclVybCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGNvbmZpZyA9IGNvbmZpZyB8fCB7fTtcbiAgICAgIGNvbmZpZy51cmwgPSBjb25maWdPclVybDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uZmlnID0gY29uZmlnT3JVcmwgfHwge307XG4gICAgfVxuXG4gICAgY29uZmlnID0gbWVyZ2VDb25maWcodGhpcy5kZWZhdWx0cywgY29uZmlnKTtcblxuICAgIGNvbnN0IHt0cmFuc2l0aW9uYWwsIHBhcmFtc1NlcmlhbGl6ZXIsIGhlYWRlcnN9ID0gY29uZmlnO1xuXG4gICAgaWYgKHRyYW5zaXRpb25hbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB2YWxpZGF0b3IuYXNzZXJ0T3B0aW9ucyh0cmFuc2l0aW9uYWwsIHtcbiAgICAgICAgc2lsZW50SlNPTlBhcnNpbmc6IHZhbGlkYXRvcnMudHJhbnNpdGlvbmFsKHZhbGlkYXRvcnMuYm9vbGVhbiksXG4gICAgICAgIGZvcmNlZEpTT05QYXJzaW5nOiB2YWxpZGF0b3JzLnRyYW5zaXRpb25hbCh2YWxpZGF0b3JzLmJvb2xlYW4pLFxuICAgICAgICBjbGFyaWZ5VGltZW91dEVycm9yOiB2YWxpZGF0b3JzLnRyYW5zaXRpb25hbCh2YWxpZGF0b3JzLmJvb2xlYW4pXG4gICAgICB9LCBmYWxzZSk7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtc1NlcmlhbGl6ZXIgIT0gbnVsbCkge1xuICAgICAgaWYgKHV0aWxzJDEuaXNGdW5jdGlvbihwYXJhbXNTZXJpYWxpemVyKSkge1xuICAgICAgICBjb25maWcucGFyYW1zU2VyaWFsaXplciA9IHtcbiAgICAgICAgICBzZXJpYWxpemU6IHBhcmFtc1NlcmlhbGl6ZXJcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbGlkYXRvci5hc3NlcnRPcHRpb25zKHBhcmFtc1NlcmlhbGl6ZXIsIHtcbiAgICAgICAgICBlbmNvZGU6IHZhbGlkYXRvcnMuZnVuY3Rpb24sXG4gICAgICAgICAgc2VyaWFsaXplOiB2YWxpZGF0b3JzLmZ1bmN0aW9uXG4gICAgICAgIH0sIHRydWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFNldCBjb25maWcuYWxsb3dBYnNvbHV0ZVVybHNcbiAgICBpZiAoY29uZmlnLmFsbG93QWJzb2x1dGVVcmxzICE9PSB1bmRlZmluZWQpIDsgZWxzZSBpZiAodGhpcy5kZWZhdWx0cy5hbGxvd0Fic29sdXRlVXJscyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25maWcuYWxsb3dBYnNvbHV0ZVVybHMgPSB0aGlzLmRlZmF1bHRzLmFsbG93QWJzb2x1dGVVcmxzO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25maWcuYWxsb3dBYnNvbHV0ZVVybHMgPSB0cnVlO1xuICAgIH1cblxuICAgIHZhbGlkYXRvci5hc3NlcnRPcHRpb25zKGNvbmZpZywge1xuICAgICAgYmFzZVVybDogdmFsaWRhdG9ycy5zcGVsbGluZygnYmFzZVVSTCcpLFxuICAgICAgd2l0aFhzcmZUb2tlbjogdmFsaWRhdG9ycy5zcGVsbGluZygnd2l0aFhTUkZUb2tlbicpXG4gICAgfSwgdHJ1ZSk7XG5cbiAgICAvLyBTZXQgY29uZmlnLm1ldGhvZFxuICAgIGNvbmZpZy5tZXRob2QgPSAoY29uZmlnLm1ldGhvZCB8fCB0aGlzLmRlZmF1bHRzLm1ldGhvZCB8fCAnZ2V0JykudG9Mb3dlckNhc2UoKTtcblxuICAgIC8vIEZsYXR0ZW4gaGVhZGVyc1xuICAgIGxldCBjb250ZXh0SGVhZGVycyA9IGhlYWRlcnMgJiYgdXRpbHMkMS5tZXJnZShcbiAgICAgIGhlYWRlcnMuY29tbW9uLFxuICAgICAgaGVhZGVyc1tjb25maWcubWV0aG9kXVxuICAgICk7XG5cbiAgICBoZWFkZXJzICYmIHV0aWxzJDEuZm9yRWFjaChcbiAgICAgIFsnZGVsZXRlJywgJ2dldCcsICdoZWFkJywgJ3Bvc3QnLCAncHV0JywgJ3BhdGNoJywgJ2NvbW1vbiddLFxuICAgICAgKG1ldGhvZCkgPT4ge1xuICAgICAgICBkZWxldGUgaGVhZGVyc1ttZXRob2RdO1xuICAgICAgfVxuICAgICk7XG5cbiAgICBjb25maWcuaGVhZGVycyA9IEF4aW9zSGVhZGVycyQxLmNvbmNhdChjb250ZXh0SGVhZGVycywgaGVhZGVycyk7XG5cbiAgICAvLyBmaWx0ZXIgb3V0IHNraXBwZWQgaW50ZXJjZXB0b3JzXG4gICAgY29uc3QgcmVxdWVzdEludGVyY2VwdG9yQ2hhaW4gPSBbXTtcbiAgICBsZXQgc3luY2hyb25vdXNSZXF1ZXN0SW50ZXJjZXB0b3JzID0gdHJ1ZTtcbiAgICB0aGlzLmludGVyY2VwdG9ycy5yZXF1ZXN0LmZvckVhY2goZnVuY3Rpb24gdW5zaGlmdFJlcXVlc3RJbnRlcmNlcHRvcnMoaW50ZXJjZXB0b3IpIHtcbiAgICAgIGlmICh0eXBlb2YgaW50ZXJjZXB0b3IucnVuV2hlbiA9PT0gJ2Z1bmN0aW9uJyAmJiBpbnRlcmNlcHRvci5ydW5XaGVuKGNvbmZpZykgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgc3luY2hyb25vdXNSZXF1ZXN0SW50ZXJjZXB0b3JzID0gc3luY2hyb25vdXNSZXF1ZXN0SW50ZXJjZXB0b3JzICYmIGludGVyY2VwdG9yLnN5bmNocm9ub3VzO1xuXG4gICAgICByZXF1ZXN0SW50ZXJjZXB0b3JDaGFpbi51bnNoaWZ0KGludGVyY2VwdG9yLmZ1bGZpbGxlZCwgaW50ZXJjZXB0b3IucmVqZWN0ZWQpO1xuICAgIH0pO1xuXG4gICAgY29uc3QgcmVzcG9uc2VJbnRlcmNlcHRvckNoYWluID0gW107XG4gICAgdGhpcy5pbnRlcmNlcHRvcnMucmVzcG9uc2UuZm9yRWFjaChmdW5jdGlvbiBwdXNoUmVzcG9uc2VJbnRlcmNlcHRvcnMoaW50ZXJjZXB0b3IpIHtcbiAgICAgIHJlc3BvbnNlSW50ZXJjZXB0b3JDaGFpbi5wdXNoKGludGVyY2VwdG9yLmZ1bGZpbGxlZCwgaW50ZXJjZXB0b3IucmVqZWN0ZWQpO1xuICAgIH0pO1xuXG4gICAgbGV0IHByb21pc2U7XG4gICAgbGV0IGkgPSAwO1xuICAgIGxldCBsZW47XG5cbiAgICBpZiAoIXN5bmNocm9ub3VzUmVxdWVzdEludGVyY2VwdG9ycykge1xuICAgICAgY29uc3QgY2hhaW4gPSBbZGlzcGF0Y2hSZXF1ZXN0LmJpbmQodGhpcyksIHVuZGVmaW5lZF07XG4gICAgICBjaGFpbi51bnNoaWZ0LmFwcGx5KGNoYWluLCByZXF1ZXN0SW50ZXJjZXB0b3JDaGFpbik7XG4gICAgICBjaGFpbi5wdXNoLmFwcGx5KGNoYWluLCByZXNwb25zZUludGVyY2VwdG9yQ2hhaW4pO1xuICAgICAgbGVuID0gY2hhaW4ubGVuZ3RoO1xuXG4gICAgICBwcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKGNvbmZpZyk7XG5cbiAgICAgIHdoaWxlIChpIDwgbGVuKSB7XG4gICAgICAgIHByb21pc2UgPSBwcm9taXNlLnRoZW4oY2hhaW5baSsrXSwgY2hhaW5baSsrXSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwcm9taXNlO1xuICAgIH1cblxuICAgIGxlbiA9IHJlcXVlc3RJbnRlcmNlcHRvckNoYWluLmxlbmd0aDtcblxuICAgIGxldCBuZXdDb25maWcgPSBjb25maWc7XG5cbiAgICBpID0gMDtcblxuICAgIHdoaWxlIChpIDwgbGVuKSB7XG4gICAgICBjb25zdCBvbkZ1bGZpbGxlZCA9IHJlcXVlc3RJbnRlcmNlcHRvckNoYWluW2krK107XG4gICAgICBjb25zdCBvblJlamVjdGVkID0gcmVxdWVzdEludGVyY2VwdG9yQ2hhaW5baSsrXTtcbiAgICAgIHRyeSB7XG4gICAgICAgIG5ld0NvbmZpZyA9IG9uRnVsZmlsbGVkKG5ld0NvbmZpZyk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBvblJlamVjdGVkLmNhbGwodGhpcywgZXJyb3IpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgcHJvbWlzZSA9IGRpc3BhdGNoUmVxdWVzdC5jYWxsKHRoaXMsIG5ld0NvbmZpZyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnJvcik7XG4gICAgfVxuXG4gICAgaSA9IDA7XG4gICAgbGVuID0gcmVzcG9uc2VJbnRlcmNlcHRvckNoYWluLmxlbmd0aDtcblxuICAgIHdoaWxlIChpIDwgbGVuKSB7XG4gICAgICBwcm9taXNlID0gcHJvbWlzZS50aGVuKHJlc3BvbnNlSW50ZXJjZXB0b3JDaGFpbltpKytdLCByZXNwb25zZUludGVyY2VwdG9yQ2hhaW5baSsrXSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHByb21pc2U7XG4gIH1cblxuICBnZXRVcmkoY29uZmlnKSB7XG4gICAgY29uZmlnID0gbWVyZ2VDb25maWcodGhpcy5kZWZhdWx0cywgY29uZmlnKTtcbiAgICBjb25zdCBmdWxsUGF0aCA9IGJ1aWxkRnVsbFBhdGgoY29uZmlnLmJhc2VVUkwsIGNvbmZpZy51cmwsIGNvbmZpZy5hbGxvd0Fic29sdXRlVXJscyk7XG4gICAgcmV0dXJuIGJ1aWxkVVJMKGZ1bGxQYXRoLCBjb25maWcucGFyYW1zLCBjb25maWcucGFyYW1zU2VyaWFsaXplcik7XG4gIH1cbn1cblxuLy8gUHJvdmlkZSBhbGlhc2VzIGZvciBzdXBwb3J0ZWQgcmVxdWVzdCBtZXRob2RzXG51dGlscyQxLmZvckVhY2goWydkZWxldGUnLCAnZ2V0JywgJ2hlYWQnLCAnb3B0aW9ucyddLCBmdW5jdGlvbiBmb3JFYWNoTWV0aG9kTm9EYXRhKG1ldGhvZCkge1xuICAvKmVzbGludCBmdW5jLW5hbWVzOjAqL1xuICBBeGlvcy5wcm90b3R5cGVbbWV0aG9kXSA9IGZ1bmN0aW9uKHVybCwgY29uZmlnKSB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdChtZXJnZUNvbmZpZyhjb25maWcgfHwge30sIHtcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybCxcbiAgICAgIGRhdGE6IChjb25maWcgfHwge30pLmRhdGFcbiAgICB9KSk7XG4gIH07XG59KTtcblxudXRpbHMkMS5mb3JFYWNoKFsncG9zdCcsICdwdXQnLCAncGF0Y2gnXSwgZnVuY3Rpb24gZm9yRWFjaE1ldGhvZFdpdGhEYXRhKG1ldGhvZCkge1xuICAvKmVzbGludCBmdW5jLW5hbWVzOjAqL1xuXG4gIGZ1bmN0aW9uIGdlbmVyYXRlSFRUUE1ldGhvZChpc0Zvcm0pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gaHR0cE1ldGhvZCh1cmwsIGRhdGEsIGNvbmZpZykge1xuICAgICAgcmV0dXJuIHRoaXMucmVxdWVzdChtZXJnZUNvbmZpZyhjb25maWcgfHwge30sIHtcbiAgICAgICAgbWV0aG9kLFxuICAgICAgICBoZWFkZXJzOiBpc0Zvcm0gPyB7XG4gICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdtdWx0aXBhcnQvZm9ybS1kYXRhJ1xuICAgICAgICB9IDoge30sXG4gICAgICAgIHVybCxcbiAgICAgICAgZGF0YVxuICAgICAgfSkpO1xuICAgIH07XG4gIH1cblxuICBBeGlvcy5wcm90b3R5cGVbbWV0aG9kXSA9IGdlbmVyYXRlSFRUUE1ldGhvZCgpO1xuXG4gIEF4aW9zLnByb3RvdHlwZVttZXRob2QgKyAnRm9ybSddID0gZ2VuZXJhdGVIVFRQTWV0aG9kKHRydWUpO1xufSk7XG5cbnZhciBBeGlvcyQxID0gQXhpb3M7XG5cbi8qKlxuICogQSBgQ2FuY2VsVG9rZW5gIGlzIGFuIG9iamVjdCB0aGF0IGNhbiBiZSB1c2VkIHRvIHJlcXVlc3QgY2FuY2VsbGF0aW9uIG9mIGFuIG9wZXJhdGlvbi5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBleGVjdXRvciBUaGUgZXhlY3V0b3IgZnVuY3Rpb24uXG4gKlxuICogQHJldHVybnMge0NhbmNlbFRva2VufVxuICovXG5jbGFzcyBDYW5jZWxUb2tlbiB7XG4gIGNvbnN0cnVjdG9yKGV4ZWN1dG9yKSB7XG4gICAgaWYgKHR5cGVvZiBleGVjdXRvciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZXhlY3V0b3IgbXVzdCBiZSBhIGZ1bmN0aW9uLicpO1xuICAgIH1cblxuICAgIGxldCByZXNvbHZlUHJvbWlzZTtcblxuICAgIHRoaXMucHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIHByb21pc2VFeGVjdXRvcihyZXNvbHZlKSB7XG4gICAgICByZXNvbHZlUHJvbWlzZSA9IHJlc29sdmU7XG4gICAgfSk7XG5cbiAgICBjb25zdCB0b2tlbiA9IHRoaXM7XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZnVuYy1uYW1lc1xuICAgIHRoaXMucHJvbWlzZS50aGVuKGNhbmNlbCA9PiB7XG4gICAgICBpZiAoIXRva2VuLl9saXN0ZW5lcnMpIHJldHVybjtcblxuICAgICAgbGV0IGkgPSB0b2tlbi5fbGlzdGVuZXJzLmxlbmd0aDtcblxuICAgICAgd2hpbGUgKGktLSA+IDApIHtcbiAgICAgICAgdG9rZW4uX2xpc3RlbmVyc1tpXShjYW5jZWwpO1xuICAgICAgfVxuICAgICAgdG9rZW4uX2xpc3RlbmVycyA9IG51bGw7XG4gICAgfSk7XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZnVuYy1uYW1lc1xuICAgIHRoaXMucHJvbWlzZS50aGVuID0gb25mdWxmaWxsZWQgPT4ge1xuICAgICAgbGV0IF9yZXNvbHZlO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGZ1bmMtbmFtZXNcbiAgICAgIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgdG9rZW4uc3Vic2NyaWJlKHJlc29sdmUpO1xuICAgICAgICBfcmVzb2x2ZSA9IHJlc29sdmU7XG4gICAgICB9KS50aGVuKG9uZnVsZmlsbGVkKTtcblxuICAgICAgcHJvbWlzZS5jYW5jZWwgPSBmdW5jdGlvbiByZWplY3QoKSB7XG4gICAgICAgIHRva2VuLnVuc3Vic2NyaWJlKF9yZXNvbHZlKTtcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBwcm9taXNlO1xuICAgIH07XG5cbiAgICBleGVjdXRvcihmdW5jdGlvbiBjYW5jZWwobWVzc2FnZSwgY29uZmlnLCByZXF1ZXN0KSB7XG4gICAgICBpZiAodG9rZW4ucmVhc29uKSB7XG4gICAgICAgIC8vIENhbmNlbGxhdGlvbiBoYXMgYWxyZWFkeSBiZWVuIHJlcXVlc3RlZFxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRva2VuLnJlYXNvbiA9IG5ldyBDYW5jZWxlZEVycm9yKG1lc3NhZ2UsIGNvbmZpZywgcmVxdWVzdCk7XG4gICAgICByZXNvbHZlUHJvbWlzZSh0b2tlbi5yZWFzb24pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRocm93cyBhIGBDYW5jZWxlZEVycm9yYCBpZiBjYW5jZWxsYXRpb24gaGFzIGJlZW4gcmVxdWVzdGVkLlxuICAgKi9cbiAgdGhyb3dJZlJlcXVlc3RlZCgpIHtcbiAgICBpZiAodGhpcy5yZWFzb24pIHtcbiAgICAgIHRocm93IHRoaXMucmVhc29uO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJzY3JpYmUgdG8gdGhlIGNhbmNlbCBzaWduYWxcbiAgICovXG5cbiAgc3Vic2NyaWJlKGxpc3RlbmVyKSB7XG4gICAgaWYgKHRoaXMucmVhc29uKSB7XG4gICAgICBsaXN0ZW5lcih0aGlzLnJlYXNvbik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2xpc3RlbmVycykge1xuICAgICAgdGhpcy5fbGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9saXN0ZW5lcnMgPSBbbGlzdGVuZXJdO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVbnN1YnNjcmliZSBmcm9tIHRoZSBjYW5jZWwgc2lnbmFsXG4gICAqL1xuXG4gIHVuc3Vic2NyaWJlKGxpc3RlbmVyKSB7XG4gICAgaWYgKCF0aGlzLl9saXN0ZW5lcnMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLl9saXN0ZW5lcnMuaW5kZXhPZihsaXN0ZW5lcik7XG4gICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgdGhpcy5fbGlzdGVuZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgfVxuICB9XG5cbiAgdG9BYm9ydFNpZ25hbCgpIHtcbiAgICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuXG4gICAgY29uc3QgYWJvcnQgPSAoZXJyKSA9PiB7XG4gICAgICBjb250cm9sbGVyLmFib3J0KGVycik7XG4gICAgfTtcblxuICAgIHRoaXMuc3Vic2NyaWJlKGFib3J0KTtcblxuICAgIGNvbnRyb2xsZXIuc2lnbmFsLnVuc3Vic2NyaWJlID0gKCkgPT4gdGhpcy51bnN1YnNjcmliZShhYm9ydCk7XG5cbiAgICByZXR1cm4gY29udHJvbGxlci5zaWduYWw7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBvYmplY3QgdGhhdCBjb250YWlucyBhIG5ldyBgQ2FuY2VsVG9rZW5gIGFuZCBhIGZ1bmN0aW9uIHRoYXQsIHdoZW4gY2FsbGVkLFxuICAgKiBjYW5jZWxzIHRoZSBgQ2FuY2VsVG9rZW5gLlxuICAgKi9cbiAgc3RhdGljIHNvdXJjZSgpIHtcbiAgICBsZXQgY2FuY2VsO1xuICAgIGNvbnN0IHRva2VuID0gbmV3IENhbmNlbFRva2VuKGZ1bmN0aW9uIGV4ZWN1dG9yKGMpIHtcbiAgICAgIGNhbmNlbCA9IGM7XG4gICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRva2VuLFxuICAgICAgY2FuY2VsXG4gICAgfTtcbiAgfVxufVxuXG52YXIgQ2FuY2VsVG9rZW4kMSA9IENhbmNlbFRva2VuO1xuXG4vKipcbiAqIFN5bnRhY3RpYyBzdWdhciBmb3IgaW52b2tpbmcgYSBmdW5jdGlvbiBhbmQgZXhwYW5kaW5nIGFuIGFycmF5IGZvciBhcmd1bWVudHMuXG4gKlxuICogQ29tbW9uIHVzZSBjYXNlIHdvdWxkIGJlIHRvIHVzZSBgRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5YC5cbiAqXG4gKiAgYGBganNcbiAqICBmdW5jdGlvbiBmKHgsIHksIHopIHt9XG4gKiAgdmFyIGFyZ3MgPSBbMSwgMiwgM107XG4gKiAgZi5hcHBseShudWxsLCBhcmdzKTtcbiAqICBgYGBcbiAqXG4gKiBXaXRoIGBzcHJlYWRgIHRoaXMgZXhhbXBsZSBjYW4gYmUgcmUtd3JpdHRlbi5cbiAqXG4gKiAgYGBganNcbiAqICBzcHJlYWQoZnVuY3Rpb24oeCwgeSwgeikge30pKFsxLCAyLCAzXSk7XG4gKiAgYGBgXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAqXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259XG4gKi9cbmZ1bmN0aW9uIHNwcmVhZChjYWxsYmFjaykge1xuICByZXR1cm4gZnVuY3Rpb24gd3JhcChhcnIpIHtcbiAgICByZXR1cm4gY2FsbGJhY2suYXBwbHkobnVsbCwgYXJyKTtcbiAgfTtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHBheWxvYWQgaXMgYW4gZXJyb3IgdGhyb3duIGJ5IEF4aW9zXG4gKlxuICogQHBhcmFtIHsqfSBwYXlsb2FkIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdGhlIHBheWxvYWQgaXMgYW4gZXJyb3IgdGhyb3duIGJ5IEF4aW9zLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNBeGlvc0Vycm9yKHBheWxvYWQpIHtcbiAgcmV0dXJuIHV0aWxzJDEuaXNPYmplY3QocGF5bG9hZCkgJiYgKHBheWxvYWQuaXNBeGlvc0Vycm9yID09PSB0cnVlKTtcbn1cblxuY29uc3QgSHR0cFN0YXR1c0NvZGUgPSB7XG4gIENvbnRpbnVlOiAxMDAsXG4gIFN3aXRjaGluZ1Byb3RvY29sczogMTAxLFxuICBQcm9jZXNzaW5nOiAxMDIsXG4gIEVhcmx5SGludHM6IDEwMyxcbiAgT2s6IDIwMCxcbiAgQ3JlYXRlZDogMjAxLFxuICBBY2NlcHRlZDogMjAyLFxuICBOb25BdXRob3JpdGF0aXZlSW5mb3JtYXRpb246IDIwMyxcbiAgTm9Db250ZW50OiAyMDQsXG4gIFJlc2V0Q29udGVudDogMjA1LFxuICBQYXJ0aWFsQ29udGVudDogMjA2LFxuICBNdWx0aVN0YXR1czogMjA3LFxuICBBbHJlYWR5UmVwb3J0ZWQ6IDIwOCxcbiAgSW1Vc2VkOiAyMjYsXG4gIE11bHRpcGxlQ2hvaWNlczogMzAwLFxuICBNb3ZlZFBlcm1hbmVudGx5OiAzMDEsXG4gIEZvdW5kOiAzMDIsXG4gIFNlZU90aGVyOiAzMDMsXG4gIE5vdE1vZGlmaWVkOiAzMDQsXG4gIFVzZVByb3h5OiAzMDUsXG4gIFVudXNlZDogMzA2LFxuICBUZW1wb3JhcnlSZWRpcmVjdDogMzA3LFxuICBQZXJtYW5lbnRSZWRpcmVjdDogMzA4LFxuICBCYWRSZXF1ZXN0OiA0MDAsXG4gIFVuYXV0aG9yaXplZDogNDAxLFxuICBQYXltZW50UmVxdWlyZWQ6IDQwMixcbiAgRm9yYmlkZGVuOiA0MDMsXG4gIE5vdEZvdW5kOiA0MDQsXG4gIE1ldGhvZE5vdEFsbG93ZWQ6IDQwNSxcbiAgTm90QWNjZXB0YWJsZTogNDA2LFxuICBQcm94eUF1dGhlbnRpY2F0aW9uUmVxdWlyZWQ6IDQwNyxcbiAgUmVxdWVzdFRpbWVvdXQ6IDQwOCxcbiAgQ29uZmxpY3Q6IDQwOSxcbiAgR29uZTogNDEwLFxuICBMZW5ndGhSZXF1aXJlZDogNDExLFxuICBQcmVjb25kaXRpb25GYWlsZWQ6IDQxMixcbiAgUGF5bG9hZFRvb0xhcmdlOiA0MTMsXG4gIFVyaVRvb0xvbmc6IDQxNCxcbiAgVW5zdXBwb3J0ZWRNZWRpYVR5cGU6IDQxNSxcbiAgUmFuZ2VOb3RTYXRpc2ZpYWJsZTogNDE2LFxuICBFeHBlY3RhdGlvbkZhaWxlZDogNDE3LFxuICBJbUFUZWFwb3Q6IDQxOCxcbiAgTWlzZGlyZWN0ZWRSZXF1ZXN0OiA0MjEsXG4gIFVucHJvY2Vzc2FibGVFbnRpdHk6IDQyMixcbiAgTG9ja2VkOiA0MjMsXG4gIEZhaWxlZERlcGVuZGVuY3k6IDQyNCxcbiAgVG9vRWFybHk6IDQyNSxcbiAgVXBncmFkZVJlcXVpcmVkOiA0MjYsXG4gIFByZWNvbmRpdGlvblJlcXVpcmVkOiA0MjgsXG4gIFRvb01hbnlSZXF1ZXN0czogNDI5LFxuICBSZXF1ZXN0SGVhZGVyRmllbGRzVG9vTGFyZ2U6IDQzMSxcbiAgVW5hdmFpbGFibGVGb3JMZWdhbFJlYXNvbnM6IDQ1MSxcbiAgSW50ZXJuYWxTZXJ2ZXJFcnJvcjogNTAwLFxuICBOb3RJbXBsZW1lbnRlZDogNTAxLFxuICBCYWRHYXRld2F5OiA1MDIsXG4gIFNlcnZpY2VVbmF2YWlsYWJsZTogNTAzLFxuICBHYXRld2F5VGltZW91dDogNTA0LFxuICBIdHRwVmVyc2lvbk5vdFN1cHBvcnRlZDogNTA1LFxuICBWYXJpYW50QWxzb05lZ290aWF0ZXM6IDUwNixcbiAgSW5zdWZmaWNpZW50U3RvcmFnZTogNTA3LFxuICBMb29wRGV0ZWN0ZWQ6IDUwOCxcbiAgTm90RXh0ZW5kZWQ6IDUxMCxcbiAgTmV0d29ya0F1dGhlbnRpY2F0aW9uUmVxdWlyZWQ6IDUxMSxcbn07XG5cbk9iamVjdC5lbnRyaWVzKEh0dHBTdGF0dXNDb2RlKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgSHR0cFN0YXR1c0NvZGVbdmFsdWVdID0ga2V5O1xufSk7XG5cbnZhciBIdHRwU3RhdHVzQ29kZSQxID0gSHR0cFN0YXR1c0NvZGU7XG5cbi8qKlxuICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIEF4aW9zXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGRlZmF1bHRDb25maWcgVGhlIGRlZmF1bHQgY29uZmlnIGZvciB0aGUgaW5zdGFuY2VcbiAqXG4gKiBAcmV0dXJucyB7QXhpb3N9IEEgbmV3IGluc3RhbmNlIG9mIEF4aW9zXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUluc3RhbmNlKGRlZmF1bHRDb25maWcpIHtcbiAgY29uc3QgY29udGV4dCA9IG5ldyBBeGlvcyQxKGRlZmF1bHRDb25maWcpO1xuICBjb25zdCBpbnN0YW5jZSA9IGJpbmQoQXhpb3MkMS5wcm90b3R5cGUucmVxdWVzdCwgY29udGV4dCk7XG5cbiAgLy8gQ29weSBheGlvcy5wcm90b3R5cGUgdG8gaW5zdGFuY2VcbiAgdXRpbHMkMS5leHRlbmQoaW5zdGFuY2UsIEF4aW9zJDEucHJvdG90eXBlLCBjb250ZXh0LCB7YWxsT3duS2V5czogdHJ1ZX0pO1xuXG4gIC8vIENvcHkgY29udGV4dCB0byBpbnN0YW5jZVxuICB1dGlscyQxLmV4dGVuZChpbnN0YW5jZSwgY29udGV4dCwgbnVsbCwge2FsbE93bktleXM6IHRydWV9KTtcblxuICAvLyBGYWN0b3J5IGZvciBjcmVhdGluZyBuZXcgaW5zdGFuY2VzXG4gIGluc3RhbmNlLmNyZWF0ZSA9IGZ1bmN0aW9uIGNyZWF0ZShpbnN0YW5jZUNvbmZpZykge1xuICAgIHJldHVybiBjcmVhdGVJbnN0YW5jZShtZXJnZUNvbmZpZyhkZWZhdWx0Q29uZmlnLCBpbnN0YW5jZUNvbmZpZykpO1xuICB9O1xuXG4gIHJldHVybiBpbnN0YW5jZTtcbn1cblxuLy8gQ3JlYXRlIHRoZSBkZWZhdWx0IGluc3RhbmNlIHRvIGJlIGV4cG9ydGVkXG5jb25zdCBheGlvcyA9IGNyZWF0ZUluc3RhbmNlKGRlZmF1bHRzJDEpO1xuXG4vLyBFeHBvc2UgQXhpb3MgY2xhc3MgdG8gYWxsb3cgY2xhc3MgaW5oZXJpdGFuY2VcbmF4aW9zLkF4aW9zID0gQXhpb3MkMTtcblxuLy8gRXhwb3NlIENhbmNlbCAmIENhbmNlbFRva2VuXG5heGlvcy5DYW5jZWxlZEVycm9yID0gQ2FuY2VsZWRFcnJvcjtcbmF4aW9zLkNhbmNlbFRva2VuID0gQ2FuY2VsVG9rZW4kMTtcbmF4aW9zLmlzQ2FuY2VsID0gaXNDYW5jZWw7XG5heGlvcy5WRVJTSU9OID0gVkVSU0lPTjtcbmF4aW9zLnRvRm9ybURhdGEgPSB0b0Zvcm1EYXRhO1xuXG4vLyBFeHBvc2UgQXhpb3NFcnJvciBjbGFzc1xuYXhpb3MuQXhpb3NFcnJvciA9IEF4aW9zRXJyb3I7XG5cbi8vIGFsaWFzIGZvciBDYW5jZWxlZEVycm9yIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XG5heGlvcy5DYW5jZWwgPSBheGlvcy5DYW5jZWxlZEVycm9yO1xuXG4vLyBFeHBvc2UgYWxsL3NwcmVhZFxuYXhpb3MuYWxsID0gZnVuY3Rpb24gYWxsKHByb21pc2VzKSB7XG4gIHJldHVybiBQcm9taXNlLmFsbChwcm9taXNlcyk7XG59O1xuXG5heGlvcy5zcHJlYWQgPSBzcHJlYWQ7XG5cbi8vIEV4cG9zZSBpc0F4aW9zRXJyb3JcbmF4aW9zLmlzQXhpb3NFcnJvciA9IGlzQXhpb3NFcnJvcjtcblxuLy8gRXhwb3NlIG1lcmdlQ29uZmlnXG5heGlvcy5tZXJnZUNvbmZpZyA9IG1lcmdlQ29uZmlnO1xuXG5heGlvcy5BeGlvc0hlYWRlcnMgPSBBeGlvc0hlYWRlcnMkMTtcblxuYXhpb3MuZm9ybVRvSlNPTiA9IHRoaW5nID0+IGZvcm1EYXRhVG9KU09OKHV0aWxzJDEuaXNIVE1MRm9ybSh0aGluZykgPyBuZXcgRm9ybURhdGEodGhpbmcpIDogdGhpbmcpO1xuXG5heGlvcy5nZXRBZGFwdGVyID0gYWRhcHRlcnMuZ2V0QWRhcHRlcjtcblxuYXhpb3MuSHR0cFN0YXR1c0NvZGUgPSBIdHRwU3RhdHVzQ29kZSQxO1xuXG5heGlvcy5kZWZhdWx0ID0gYXhpb3M7XG5cbm1vZHVsZS5leHBvcnRzID0gYXhpb3M7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1heGlvcy5janMubWFwXG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/axios/dist/browser/axios.cjs\n"); /***/ }), diff --git a/public/js/bootstrap.min.js b/public/js/bootstrap.min.js index 5e3adeb..bd3ab0a 100644 --- a/public/js/bootstrap.min.js +++ b/public/js/bootstrap.min.js @@ -1 +1 @@ -var _0x5755dd=_0x2b3f;(function(_0x2caf06,_0x4ac9ed){var _0x5d69b0=_0x2b3f,_0x2523ed=_0x2caf06();while(!![]){try{var _0xd3207=-parseInt(_0x5d69b0(0x1d8))/0x1+-parseInt(_0x5d69b0(0x1cc))/0x2*(parseInt(_0x5d69b0(0x1d5))/0x3)+-parseInt(_0x5d69b0(0x1cd))/0x4*(parseInt(_0x5d69b0(0x1d7))/0x5)+parseInt(_0x5d69b0(0x1d0))/0x6*(-parseInt(_0x5d69b0(0x1d3))/0x7)+parseInt(_0x5d69b0(0x1cb))/0x8*(-parseInt(_0x5d69b0(0x1ce))/0x9)+-parseInt(_0x5d69b0(0x1dd))/0xa*(parseInt(_0x5d69b0(0x1d2))/0xb)+-parseInt(_0x5d69b0(0x1da))/0xc*(-parseInt(_0x5d69b0(0x1d9))/0xd);if(_0xd3207===_0x4ac9ed)break;else _0x2523ed['push'](_0x2523ed['shift']());}catch(_0x4cbfbe){_0x2523ed['push'](_0x2523ed['shift']());}}}(_0x47d3,0x9aa5e),window['_']=require(_0x5755dd(0x1d4)),window[_0x5755dd(0x1cf)]=require(_0x5755dd(0x1cf)),window['axios'][_0x5755dd(0x1dc)][_0x5755dd(0x1d1)][_0x5755dd(0x1db)]['X-Requested-With']=_0x5755dd(0x1d6));function _0x2b3f(_0x4ba776,_0xc628c3){var _0x47d389=_0x47d3();return _0x2b3f=function(_0x2b3fd5,_0xaac46e){_0x2b3fd5=_0x2b3fd5-0x1cb;var _0x5b031a=_0x47d389[_0x2b3fd5];return _0x5b031a;},_0x2b3f(_0x4ba776,_0xc628c3);}function _0x47d3(){var _0x39d6a0=['8GjhhHa','88nzIfoH','4Kjxhfy','8169759fWVIWV','axios','18iQFNEM','headers','4741572PfSWpU','840511cZDckx','lodash','86088dDObMM','XMLHttpRequest','1253785ynZwAi','403808XPjXEg','13kMrcSa','56168412xdawGd','common','defaults','20mBazQV'];_0x47d3=function(){return _0x39d6a0;};return _0x47d3();} \ No newline at end of file +var _0x3660d0=_0x185e;(function(_0x5d76f2,_0x5e30a3){var _0x5499e7=_0x185e,_0x1533c9=_0x5d76f2();while(!![]){try{var _0x4a869d=-parseInt(_0x5499e7(0x17e))/0x1+parseInt(_0x5499e7(0x183))/0x2+parseInt(_0x5499e7(0x17c))/0x3+parseInt(_0x5499e7(0x180))/0x4+-parseInt(_0x5499e7(0x17a))/0x5+-parseInt(_0x5499e7(0x17d))/0x6+-parseInt(_0x5499e7(0x187))/0x7*(-parseInt(_0x5499e7(0x17f))/0x8);if(_0x4a869d===_0x5e30a3)break;else _0x1533c9['push'](_0x1533c9['shift']());}catch(_0x52dc2a){_0x1533c9['push'](_0x1533c9['shift']());}}}(_0x5ca3,0x470e8),window['_']=require('lodash'),window['axios']=require('axios'),window[_0x3660d0(0x182)][_0x3660d0(0x17b)][_0x3660d0(0x185)][_0x3660d0(0x186)][_0x3660d0(0x181)]=_0x3660d0(0x184));function _0x185e(_0x2d9f1a,_0x1cdb7e){var _0x5ca3e0=_0x5ca3();return _0x185e=function(_0x185e60,_0x5d35a3){_0x185e60=_0x185e60-0x17a;var _0x599b68=_0x5ca3e0[_0x185e60];return _0x599b68;},_0x185e(_0x2d9f1a,_0x1cdb7e);}function _0x5ca3(){var _0x747f3f=['220964FVSOGu','72KsiiRy','2192688jfXCmT','X-Requested-With','axios','629452ZORcuQ','XMLHttpRequest','headers','common','213479HlxVVb','1213635LgWcnh','defaults','238671nuYnCQ','2773134ouoPQK'];_0x5ca3=function(){return _0x747f3f;};return _0x5ca3();} \ No newline at end of file diff --git a/public/js/core.min.js b/public/js/core.min.js index 88e18df..9a4fce0 100644 --- a/public/js/core.min.js +++ b/public/js/core.min.js @@ -15,7 +15,7 @@ \******************************/ /***/ (() => { -eval("var sweet_loader = '';\nfunction PaymentInvoice() {\n var invoice = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n $.ajax({\n url: ApiUserPaymentInvoice,\n data: {\n invoice: invoice\n },\n type: \"post\",\n beforeSend: function beforeSend() {\n Swal.fire({\n html: sweet_loader + \"Đang xử lý dữ liệu ...\",\n showConfirmButton: false\n });\n },\n success: function success(response) {\n if (response.error === false) {\n Swal.fire({\n title: \"Payment Successfully\",\n text: \"Thanh toán hoá đơn thành công!\",\n icon: \"success\",\n confirmButtonColor: \"#3085d6\",\n confirmButtonText: \"Xác nhận\"\n }).then(function (result) {\n if (result.isConfirmed) {\n location.reload();\n }\n });\n } else {\n Swal.fire({\n title: \"Có lỗi xảy ra?\",\n text: response.message,\n icon: \"warning\",\n showCancelButton: false,\n confirmButtonColor: \"var(--color-brand)\",\n confirmButtonText: \"Xác nhận\"\n });\n }\n }\n });\n}\n\n/* Action for VirtualMachine */\nfunction VirtualMachineAction() {\n var action = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n var id = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n var userid = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;\n $.ajax({\n url: APIServiceAction,\n data: {\n action: action,\n product: id,\n userid: userid\n },\n type: \"post\",\n beforeSend: function beforeSend() {\n Swal.fire({\n html: sweet_loader + \"Đang xử lý dữ liệu ...\",\n showConfirmButton: false\n });\n },\n success: function success(response) {\n if (response.status === false) {\n Swal.fire({\n title: \"Có lỗi xảy ra?\",\n text: data.message,\n icon: \"warning\",\n showCancelButton: true,\n confirmButtonColor: \"var(--color-brand)\",\n cancelButtonColor: \"#818181\",\n confirmButtonText: \"Ok\"\n });\n } else {\n $('.system-status').empty().append('Đang load panelLoading...');\n Swal.fire({\n title: \"Thành công\",\n text: response.message,\n icon: \"success\",\n showCancelButton: false,\n confirmButtonColor: \"var(--color-brand)\",\n confirmButtonText: \"Xác nhận\"\n }).then(function (results) {\n if (results.isConfirmed) {\n $('.append-action').empty();\n }\n });\n }\n }\n });\n}\n\n/* Append all input from Form Order to form Coupon */\nfunction loadForm(e) {\n var form = $(e).parent().parent().parent();\n var Inputs = document.querySelectorAll('[name^=\"vps[\"],[name^=\"hosting[\"]');\n Inputs.forEach(function (element) {\n var key = element.getAttribute('name');\n form.append(\"\"));\n });\n form.submit();\n}\n\n/* Change Cart when change Month */\nfunction appendChangeCart() {\n var target = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n var key = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n /* Create new variable element */\n var ElementSubTotal = $('.cart_total_novat');\n var ElementVat = $('.cart_vat');\n var ElementTotal = $('.cart_total_amount');\n var PriceTarget = $(\"[data-focus=\\\"\".concat(target, \"_\").concat(key, \"\\\"]\"));\n\n /* Create new variable price for element SubTotal */\n var PriceSubTotal = Number(ElementSubTotal.attr('data-price'));\n\n /* Create Old variable element Product for target */\n var CartTarget = $(\"[data-product=\\\"\".concat(key, \"\\\"][data-target=\\\"\").concat(target, \"\\\"]\"));\n var OldPrice = Number(PriceTarget.find(\".\".concat(target, \"_\").concat(key, \"_price-amount\")).attr('data-price'));\n\n /* Get all Old addon total */\n var OldAddOnTotal = 0;\n var AllElementAddon = document.querySelectorAll('.name-price');\n if (AllElementAddon.length) {\n AllElementAddon.forEach(function (element) {\n OldAddOnTotal += Number($(element).attr('data-price__addon'));\n });\n }\n\n /* Config new Month */\n var ElementMonth = CartTarget.find('.time-buy__change');\n var Price = Number(ElementMonth.attr('data-price'));\n var Month = Number(ElementMonth.find('option:selected').val());\n\n /* Set new Config Month */\n PriceTarget.find(\".\".concat(target, \"_\").concat(key, \"_month\")).text(Month);\n PriceTarget.find(\".\".concat(target, \"_\").concat(key, \"_month\")).attr('data-month', Month);\n\n /* Create new variable Price */\n var TotalAddon = SumTotalAddon();\n var SubTotalPrice = PriceSubTotal - OldPrice - OldAddOnTotal + (Price * Month + TotalAddon);\n var VAT = SubTotalPrice * 0.1;\n var Total = SubTotalPrice + VAT;\n\n /* Config new price to all element */\n\n PriceTarget.find(\".\".concat(target, \"_\").concat(key, \"_price-amount\")).attr('data-price', Price * Month);\n PriceTarget.find(\".\".concat(target, \"_\").concat(key, \"_price-amount\")).text((Price * Month).toLocaleString());\n ElementSubTotal.attr('data-price', SubTotalPrice);\n ElementSubTotal.text(SubTotalPrice.toLocaleString());\n ElementVat.attr('data-price', VAT);\n ElementVat.text(VAT.toLocaleString());\n ElementTotal.attr('data-price', Total);\n ElementTotal.text(Total.toLocaleString());\n}\n\n/* Change Cart when change Addon */\nfunction appendAddonCart() {\n var target = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n var price = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n var quantity = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;\n var step = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0;\n var type = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : \"-\";\n var parent = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 0;\n var parent_target = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : '';\n var parentTarget = $(\"[data-focus=\\\"\".concat(parent_target, \"_\").concat(parent, \"\\\"]\")).find('.box-add__on');\n if (quantity === 0) {\n var service_element = $(\"div[data-target=\\\"\".concat(parent_target, \"\\\"][data-product=\\\"\").concat(parent, \"\\\"]\"));\n if (parentTarget.find(\".\".concat(parent_target, \"_\").concat(parent, \"_add_\").concat(target))) {\n parentTarget.find(\".\".concat(parent_target, \"_\").concat(parent, \"_add_\").concat(target)).remove();\n }\n if (Number(service_element.find('.input-qty[data-name=\"cpu\"]').val()) === 0 && Number(service_element.find('.input-qty[data-name=\"ssd\"]').val()) === 0 && Number(service_element.find('.input-qty[data-name=\"ram\"]').val()) === 0) {\n parentTarget.addClass('d-none');\n }\n appendChangeCart(parent_target, parent);\n return false;\n }\n parentTarget.removeClass('d-none');\n if (parentTarget.find(\".\".concat(parent_target, \"_\").concat(parent, \"_add_\").concat(target))) {\n parentTarget.find(\".\".concat(parent_target, \"_\").concat(parent, \"_add_\").concat(target)).remove();\n }\n var html = \"\");\n html += \"\".concat(target.toLocaleUpperCase(), \"\");\n html += \"\";\n html += \"\";\n html += \"\";\n html += \"\");\n html += (price * quantity).toLocaleString();\n html += \"đ\";\n html += \"\";\n html += \" X \";\n html += quantity;\n html += \"\";\n html += \"\";\n html += \"\";\n parentTarget.append(html);\n appendChangeCart(parent_target, parent);\n}\n\n/* Sum total addon */\nfunction SumTotalAddon() {\n /* Get all Element Producht */\n var total = 0;\n var allProduct = document.querySelectorAll('.name-price');\n if (allProduct.length) {\n allProduct.forEach(function (element) {\n var price = 0;\n var variable = $(element);\n var target = variable.attr('data-focus');\n var boxHasElementAddon = variable.find('.addon-price .price-amount');\n var Month = Number(variable.find(\".\".concat(target, \"_month\")).attr('data-month'));\n if (boxHasElementAddon.length) {\n boxHasElementAddon.each(function (index, element) {\n var AddonPrice = $(element).find('span').attr('data-price');\n price += Number(AddonPrice) * Month;\n });\n }\n variable.attr('data-price__addon', price);\n total += price;\n });\n }\n return Number(total);\n}\n\n/* Append Os Group to Element*/\nfunction appendOsGroup() {\n $(\"#os_group_id\").empty().append('Loading ...');\n $.get(APIGetOsGroup, {\n host: $('input[name=\"host_id\"]').val()\n }, function (response) {\n if (response.error === false) {\n var html = '---------';\n response.data.forEach(function (element) {\n html += \"\").concat(element.name, \"\");\n });\n $(\"#os_group_id\").empty().append(html);\n } else {\n $(\"#os_group_id\").empty().append('---------');\n }\n });\n}\n\n/* Append Element */\nfunction appendChild() {\n var apiUrl = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n var id = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n var data = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n $(\"#\".concat(id)).empty().append('Loading ...');\n $.get(apiUrl, data, function (response) {\n if (response.error === false) {\n var html = '---------';\n response.data.forEach(function (element) {\n html += \"\").concat(element.name, \"\");\n });\n $(\"#\".concat(id)).empty().append(html);\n } else {\n $(\"#\".concat(id)).empty().append('---------');\n }\n }).fail(function (error) {\n toastr.error(error.statusText);\n });\n}\n\n/* Append Snapshot */\nfunction appendSnapshot() {\n var product = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n var userid = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n Swal.fire({\n html: sweet_loader + \"Đang xử lý dữ liệu ...\",\n showConfirmButton: false\n });\n $.get(APIGetSnapshot, {\n product: product,\n user: userid\n }).done(function (response) {\n Swal.close();\n if ($('body').find('#staticBackdrop').length) {\n $('body').find('#staticBackdrop').remove();\n }\n $('.append-action').after(response.data);\n $('#staticBackdrop').addClass('show');\n })[\"catch\"]();\n}\n\n/* Action Snap */\nfunction SnapshotAction() {\n var product = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n var userid = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n var action = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';\n var snap = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0;\n $('body').find('#staticBackdrop').remove();\n Swal.fire({\n html: sweet_loader + \"Đang xử lý dữ liệu ...\",\n showConfirmButton: false\n });\n $.post(APIServiceSnapShot, {\n product: product,\n userid: userid,\n action: action,\n snap: snap\n }).done(function (response) {\n if (response.status === false) {\n Swal.fire({\n title: \"Có lỗi xảy ra?\",\n text: data.message,\n icon: \"warning\",\n showCancelButton: true,\n confirmButtonColor: \"var(--color-brand)\",\n cancelButtonColor: \"#818181\",\n confirmButtonText: \"Ok\"\n });\n } else {\n window.Echo.channel('Notification').listen('.Notification-Event', function (response) {\n Swal.close();\n if (response.status) {\n Swal.fire({\n title: \"Thành công\",\n text: response.message,\n icon: \"success\",\n showCancelButton: false,\n confirmButtonColor: \"var(--color-brand)\",\n confirmButtonText: \"Xác nhận\"\n });\n } else {\n Swal.fire({\n title: \"Có lỗi xảy ra?\",\n text: response.message,\n icon: \"warning\",\n showCancelButton: true,\n confirmButtonColor: \"var(--color-brand)\",\n cancelButtonColor: \"#818181\",\n confirmButtonText: \"Ok\"\n });\n }\n });\n }\n })[\"catch\"](function (response) {});\n}\n\n/* Append Upgrade System */\nfunction appendUpgradeForm() {\n var product = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n Swal.fire({\n html: sweet_loader + \"Đang xử lý dữ liệu ...\",\n showConfirmButton: false\n });\n $.get(APIGetProductAddon, {\n product: product\n }).done(function (response) {\n Swal.close();\n var body = $('body');\n body.find('#upgrade').length ? body.find('#upgrade').remove() : \"\";\n $('.append-action').after(response.data);\n $('#upgrade').addClass('show');\n })[\"catch\"](function (response) {\n console.log(response);\n });\n}\n\n/* Addon Change Form Upgrade */\n\nfunction appendAddon(parent) {\n var item = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n var price = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;\n var step = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0;\n var type = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : '-';\n var quantity = Number(parent.find('.input-qty').val());\n var OldPrice = price * quantity;\n if (type === '-') {\n quantity -= step;\n } else {\n quantity += step;\n }\n parent.find('.input-qty').val(quantity <= 0 ? 0 : quantity);\n var html = \"\\n \\n \\n \").concat(item.toLocaleUpperCase(), \"\\n \\n \\n \\n \").concat((quantity * price).toLocaleString(), \"\\u0111\\n \\n \\n \");\n var body = $('body');\n body.find(\"#upgrade .col-md-5 .box-add__on #\".concat(item)).remove();\n if (quantity <= 0) {\n actionChangePriceUpgrade(price, quantity, step, type, OldPrice);\n return false;\n }\n actionChangePriceUpgrade(price, quantity, step, type, OldPrice);\n body.find('#upgrade .col-md-5 .box-add__on hr').before(html);\n}\nfunction actionChangePriceUpgrade() {\n var price = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n var quantity = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n var step = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;\n var type = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : '';\n var oldPrice = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 0;\n if (quantity < 0) {\n return false;\n }\n var body = $('body');\n var TotalNoVal = body.find('#upgrade .cart_total_novat');\n var VAT = body.find('#upgrade .cart_vat');\n var Total = body.find('#upgrade .cart_total_amount');\n var Billing = Number(body.find('#upgrade input[name=\"billing\"]').val());\n\n /* ============================================== */\n var TotalNoValPrice = Number(TotalNoVal.attr('data-price'));\n var VATPrice = Number(VAT.attr('data-price'));\n var TotalPrice = Number(Total.attr('data-price'));\n /* ============================================== */\n\n if (type === '-') {\n TotalNoValPrice = TotalNoValPrice - oldPrice * Billing + price * quantity * Billing;\n if (TotalNoValPrice <= 0) {\n TotalNoValPrice = 0;\n }\n VATPrice = TotalNoValPrice * 0.1;\n TotalPrice = TotalNoValPrice + VATPrice;\n } else {\n TotalNoValPrice = TotalNoValPrice - oldPrice * Billing + price * quantity * Billing;\n VATPrice = TotalNoValPrice * 0.1;\n TotalPrice = TotalNoValPrice + VATPrice;\n }\n TotalNoVal.attr('data-price', TotalNoValPrice);\n TotalNoVal.text(TotalNoValPrice.toLocaleString());\n VAT.attr('data-price', VATPrice);\n VAT.text(VATPrice.toLocaleString());\n Total.attr('data-price', TotalPrice);\n Total.text(TotalPrice.toLocaleString());\n}\nfunction OrderAddon() {\n var product = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n var billing = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n var body = $('body');\n var allItem = body.find('#upgrade .input-qty');\n var error = [];\n var addon = {};\n if (allItem.length) {\n allItem.each(function (index, object) {\n if (Number(object.value) === 0) {\n error.push(object.name);\n }\n addon[\"\".concat(object.name)] = {\n price: object.getAttribute('data-price'),\n quantity: object.value\n };\n });\n }\n if (error.length === 3) {\n error.forEach(function (element) {\n body.find(\"#upgrade .input-qty[name=\\\"\".concat(element, \"\\\"]\")).addClass('error');\n });\n return false;\n }\n Swal.fire({\n title: \"Chú ý?\",\n text: \"Trong quá trình nâng cấp, Chúng tôi sẽ tắt máy chủ của bạn!\",\n icon: \"warning\",\n showCancelButton: true,\n confirmButtonColor: \"#3085d6\",\n cancelButtonColor: \"#d33\",\n confirmButtonText: \"Xác nhận\"\n }).then(function (result) {\n if (result.isConfirmed) {\n $.ajax({\n url: APICartAddon,\n data: {\n addon: addon,\n product: product,\n billing: billing\n },\n type: 'post',\n beforeSend: function beforeSend() {\n Swal.fire({\n html: sweet_loader + \"Đang xử lý dữ liệu ...\",\n showConfirmButton: false\n });\n },\n success: function success(response) {\n Swal.close();\n if (response.error === false) {\n Swal.fire({\n title: \"Đặt hàng thành công\",\n text: response.message,\n icon: \"success\",\n showCancelButton: true,\n confirmButtonColor: \"#3085d6\",\n cancelButtonColor: \"#d33\",\n confirmButtonText: \"Xác nhận\"\n }).then(function (result) {\n $('body').find('#upgrade').remove();\n });\n } else {\n Swal.fire({\n icon: \"error\",\n title: \"Oops...\",\n text: response.message\n });\n }\n }\n });\n }\n });\n}\nfunction RenewService() {\n var product = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n var billing = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n var type = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;\n Swal.fire({\n title: \"Chú ý?\",\n text: \"Bạn đang yêu cầu gia hạn dịch vụ!\",\n icon: \"warning\",\n showCancelButton: true,\n confirmButtonColor: \"#3085d6\",\n cancelButtonColor: \"#d33\",\n confirmButtonText: \"Xác nhận\"\n }).then(function (result) {\n if (result.isConfirmed) {\n $.ajax({\n url: APIRenewService,\n data: {\n type: type,\n product: product,\n billing: billing\n },\n type: 'post',\n beforeSend: function beforeSend() {\n Swal.fire({\n html: sweet_loader + \"Đang xử lý dữ liệu ...\",\n showConfirmButton: false\n });\n },\n success: function success(response) {\n Swal.close();\n if (response.error === false) {\n Swal.fire({\n title: \"Success\",\n text: response.message,\n icon: \"success\",\n showCancelButton: true,\n confirmButtonColor: \"#3085d6\",\n cancelButtonColor: \"#d33\",\n confirmButtonText: \"Xác nhận\"\n }).then(function (result) {\n $('#renew').modal('hide');\n });\n } else {\n Swal.fire({\n icon: \"error\",\n title: \"Oops...\",\n text: response.message\n });\n }\n }\n });\n }\n });\n}\nfunction CopyDiscount() {\n var value = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n var tempTextarea = $('');\n $('body').append(tempTextarea);\n tempTextarea.val(value).select();\n document.execCommand('copy');\n tempTextarea.remove();\n Swal.fire({\n title: \"Copy Successfully\",\n text: \"Copy mã giảm giá thành công!\",\n icon: \"success\",\n confirmButtonColor: \"#3085d6\",\n confirmButtonText: \"Xác nhận\"\n });\n}\ntoastr.options = {\n \"closeButton\": false,\n \"debug\": false,\n \"newestOnTop\": false,\n \"progressBar\": false,\n \"positionClass\": \"toast-top-right\",\n \"preventDuplicates\": false,\n \"onclick\": null,\n \"showDuration\": \"300\",\n \"hideDuration\": \"1000\",\n \"timeOut\": \"5000\",\n \"extendedTimeOut\": \"1000\",\n \"showEasing\": \"swing\",\n \"hideEasing\": \"linear\",\n \"showMethod\": \"fadeIn\",\n \"hideMethod\": \"fadeOut\"\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJzd2VldF9sb2FkZXIiLCJQYXltZW50SW52b2ljZSIsImludm9pY2UiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJ1bmRlZmluZWQiLCIkIiwiYWpheCIsInVybCIsIkFwaVVzZXJQYXltZW50SW52b2ljZSIsImRhdGEiLCJ0eXBlIiwiYmVmb3JlU2VuZCIsIlN3YWwiLCJmaXJlIiwiaHRtbCIsInNob3dDb25maXJtQnV0dG9uIiwic3VjY2VzcyIsInJlc3BvbnNlIiwiZXJyb3IiLCJ0aXRsZSIsInRleHQiLCJpY29uIiwiY29uZmlybUJ1dHRvbkNvbG9yIiwiY29uZmlybUJ1dHRvblRleHQiLCJ0aGVuIiwicmVzdWx0IiwiaXNDb25maXJtZWQiLCJsb2NhdGlvbiIsInJlbG9hZCIsIm1lc3NhZ2UiLCJzaG93Q2FuY2VsQnV0dG9uIiwiVmlydHVhbE1hY2hpbmVBY3Rpb24iLCJhY3Rpb24iLCJpZCIsInVzZXJpZCIsIkFQSVNlcnZpY2VBY3Rpb24iLCJwcm9kdWN0Iiwic3RhdHVzIiwiY2FuY2VsQnV0dG9uQ29sb3IiLCJlbXB0eSIsImFwcGVuZCIsInJlc3VsdHMiLCJsb2FkRm9ybSIsImUiLCJmb3JtIiwicGFyZW50IiwiSW5wdXRzIiwiZG9jdW1lbnQiLCJxdWVyeVNlbGVjdG9yQWxsIiwiZm9yRWFjaCIsImVsZW1lbnQiLCJrZXkiLCJnZXRBdHRyaWJ1dGUiLCJjb25jYXQiLCJ2YWx1ZSIsInN1Ym1pdCIsImFwcGVuZENoYW5nZUNhcnQiLCJ0YXJnZXQiLCJFbGVtZW50U3ViVG90YWwiLCJFbGVtZW50VmF0IiwiRWxlbWVudFRvdGFsIiwiUHJpY2VUYXJnZXQiLCJQcmljZVN1YlRvdGFsIiwiTnVtYmVyIiwiYXR0ciIsIkNhcnRUYXJnZXQiLCJPbGRQcmljZSIsImZpbmQiLCJPbGRBZGRPblRvdGFsIiwiQWxsRWxlbWVudEFkZG9uIiwiRWxlbWVudE1vbnRoIiwiUHJpY2UiLCJNb250aCIsInZhbCIsIlRvdGFsQWRkb24iLCJTdW1Ub3RhbEFkZG9uIiwiU3ViVG90YWxQcmljZSIsIlZBVCIsIlRvdGFsIiwidG9Mb2NhbGVTdHJpbmciLCJhcHBlbmRBZGRvbkNhcnQiLCJwcmljZSIsInF1YW50aXR5Iiwic3RlcCIsInBhcmVudF90YXJnZXQiLCJwYXJlbnRUYXJnZXQiLCJzZXJ2aWNlX2VsZW1lbnQiLCJyZW1vdmUiLCJhZGRDbGFzcyIsInJlbW92ZUNsYXNzIiwidG9Mb2NhbGVVcHBlckNhc2UiLCJ0b3RhbCIsImFsbFByb2R1Y3QiLCJ2YXJpYWJsZSIsImJveEhhc0VsZW1lbnRBZGRvbiIsImVhY2giLCJpbmRleCIsIkFkZG9uUHJpY2UiLCJhcHBlbmRPc0dyb3VwIiwiZ2V0IiwiQVBJR2V0T3NHcm91cCIsImhvc3QiLCJuYW1lIiwiYXBwZW5kQ2hpbGQiLCJhcGlVcmwiLCJmYWlsIiwidG9hc3RyIiwic3RhdHVzVGV4dCIsImFwcGVuZFNuYXBzaG90IiwiQVBJR2V0U25hcHNob3QiLCJ1c2VyIiwiZG9uZSIsImNsb3NlIiwiYWZ0ZXIiLCJTbmFwc2hvdEFjdGlvbiIsInNuYXAiLCJwb3N0IiwiQVBJU2VydmljZVNuYXBTaG90Iiwid2luZG93IiwiRWNobyIsImNoYW5uZWwiLCJsaXN0ZW4iLCJhcHBlbmRVcGdyYWRlRm9ybSIsIkFQSUdldFByb2R1Y3RBZGRvbiIsImJvZHkiLCJjb25zb2xlIiwibG9nIiwiYXBwZW5kQWRkb24iLCJpdGVtIiwiYWN0aW9uQ2hhbmdlUHJpY2VVcGdyYWRlIiwiYmVmb3JlIiwib2xkUHJpY2UiLCJUb3RhbE5vVmFsIiwiQmlsbGluZyIsIlRvdGFsTm9WYWxQcmljZSIsIlZBVFByaWNlIiwiVG90YWxQcmljZSIsIk9yZGVyQWRkb24iLCJiaWxsaW5nIiwiYWxsSXRlbSIsImFkZG9uIiwib2JqZWN0IiwicHVzaCIsIkFQSUNhcnRBZGRvbiIsIlJlbmV3U2VydmljZSIsIkFQSVJlbmV3U2VydmljZSIsIm1vZGFsIiwiQ29weURpc2NvdW50IiwidGVtcFRleHRhcmVhIiwic2VsZWN0IiwiZXhlY0NvbW1hbmQiLCJvcHRpb25zIl0sInNvdXJjZXMiOlsid2VicGFjazovLy8uL3Jlc291cmNlcy9qcy9jb3JlLmpzPzhlZWYiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIHN3ZWV0X2xvYWRlciA9ICc8ZGl2IGNsYXNzPVwic3dlZXRfbG9hZGVyXCI+PHN2ZyB2aWV3Qm94PVwiMCAwIDE0MCAxNDBcIiB3aWR0aD1cIjE0MFwiIGhlaWdodD1cIjE0MFwiPjxnIGNsYXNzPVwib3V0bGluZVwiPjxwYXRoIGQ9XCJtIDcwIDI4IGEgMSAxIDAgMCAwIDAgODQgYSAxIDEgMCAwIDAgMCAtODRcIiBzdHJva2U9XCJyZ2JhKDAsMCwwLDAuMSlcIiBzdHJva2Utd2lkdGg9XCI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj48L3BhdGg+PC9nPjxnIGNsYXNzPVwiY2lyY2xlXCI+PHBhdGggZD1cIm0gNzAgMjggYSAxIDEgMCAwIDAgMCA4NCBhIDEgMSAwIDAgMCAwIC04NFwiIHN0cm9rZT1cIiM3MUJCRkZcIiBzdHJva2Utd2lkdGg9XCI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBzdHJva2UtZGFzaG9mZnNldD1cIjIwMFwiIHN0cm9rZS1kYXNoYXJyYXk9XCIzMDBcIj48L3BhdGg+PC9nPjwvc3ZnPjwvZGl2Pic7XG5cbmZ1bmN0aW9uIFBheW1lbnRJbnZvaWNlKGludm9pY2UgPSAwKSB7XG4gICAgJC5hamF4KHtcbiAgICAgICAgdXJsOiBBcGlVc2VyUGF5bWVudEludm9pY2UsXG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgIGludm9pY2U6IGludm9pY2VcbiAgICAgICAgfSxcbiAgICAgICAgdHlwZTogXCJwb3N0XCIsXG4gICAgICAgIGJlZm9yZVNlbmQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIFN3YWwuZmlyZSh7XG4gICAgICAgICAgICAgICAgaHRtbDogc3dlZXRfbG9hZGVyICsgXCI8aDQ+xJBhbmcgeOG7rSBsw70gZOG7ryBsaeG7h3UgLi4uPC9oND5cIixcbiAgICAgICAgICAgICAgICBzaG93Q29uZmlybUJ1dHRvbjogZmFsc2UsXG4gICAgICAgICAgICB9KVxuICAgICAgICB9LFxuICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5lcnJvciA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICBTd2FsLmZpcmUoe1xuICAgICAgICAgICAgICAgICAgICB0aXRsZTogXCJQYXltZW50IFN1Y2Nlc3NmdWxseVwiLFxuICAgICAgICAgICAgICAgICAgICB0ZXh0OiBcIlRoYW5oIHRvw6FuIGhvw6EgxJHGoW4gdGjDoG5oIGPDtG5nIVwiLFxuICAgICAgICAgICAgICAgICAgICBpY29uOiBcInN1Y2Nlc3NcIixcbiAgICAgICAgICAgICAgICAgICAgY29uZmlybUJ1dHRvbkNvbG9yOiBcIiMzMDg1ZDZcIixcbiAgICAgICAgICAgICAgICAgICAgY29uZmlybUJ1dHRvblRleHQ6IFwiWMOhYyBuaOG6rW5cIlxuICAgICAgICAgICAgICAgIH0pLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmlzQ29uZmlybWVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbi5yZWxvYWQoKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgU3dhbC5maXJlKHtcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IFwiQ8OzIGzhu5dpIHjhuqN5IHJhP1wiLFxuICAgICAgICAgICAgICAgICAgICB0ZXh0OiByZXNwb25zZS5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICBpY29uOiBcIndhcm5pbmdcIixcbiAgICAgICAgICAgICAgICAgICAgc2hvd0NhbmNlbEJ1dHRvbjogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIGNvbmZpcm1CdXR0b25Db2xvcjogXCJ2YXIoLS1jb2xvci1icmFuZClcIixcbiAgICAgICAgICAgICAgICAgICAgY29uZmlybUJ1dHRvblRleHQ6IFwiWMOhYyBuaOG6rW5cIlxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KVxufVxuXG4vKiBBY3Rpb24gZm9yIFZpcnR1YWxNYWNoaW5lICovXG5mdW5jdGlvbiBWaXJ0dWFsTWFjaGluZUFjdGlvbihhY3Rpb24gPSAnJywgaWQgPSAnJywgdXNlcmlkID0gMCkge1xuICAgICQuYWpheCh7XG4gICAgICAgIHVybDogQVBJU2VydmljZUFjdGlvbixcbiAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgYWN0aW9uOiBhY3Rpb24sXG4gICAgICAgICAgICBwcm9kdWN0OiBpZCxcbiAgICAgICAgICAgIHVzZXJpZDogdXNlcmlkXG4gICAgICAgIH0sXG4gICAgICAgIHR5cGU6IFwicG9zdFwiLFxuICAgICAgICBiZWZvcmVTZW5kOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBTd2FsLmZpcmUoe1xuICAgICAgICAgICAgICAgIGh0bWw6IHN3ZWV0X2xvYWRlciArIFwiPGg0PsSQYW5nIHjhu60gbMO9IGThu68gbGnhu4d1IC4uLjwvaDQ+XCIsXG4gICAgICAgICAgICAgICAgc2hvd0NvbmZpcm1CdXR0b246IGZhbHNlLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgfSxcbiAgICAgICAgc3VjY2VzczogZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIFN3YWwuZmlyZSh7XG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBcIkPDsyBs4buXaSB44bqjeSByYT9cIixcbiAgICAgICAgICAgICAgICAgICAgdGV4dDogZGF0YS5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICBpY29uOiBcIndhcm5pbmdcIixcbiAgICAgICAgICAgICAgICAgICAgc2hvd0NhbmNlbEJ1dHRvbjogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgY29uZmlybUJ1dHRvbkNvbG9yOiBcInZhcigtLWNvbG9yLWJyYW5kKVwiLFxuICAgICAgICAgICAgICAgICAgICBjYW5jZWxCdXR0b25Db2xvcjogXCIjODE4MTgxXCIsXG4gICAgICAgICAgICAgICAgICAgIGNvbmZpcm1CdXR0b25UZXh0OiBcIk9rXCJcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAkKCcuc3lzdGVtLXN0YXR1cycpLmVtcHR5KCkuYXBwZW5kKCc8c3BhbiBjbGFzcz1cImJhZGdlIG1lLTIgZnMtNSB0ZXh0LXdhcm5pbmdcIj7EkGFuZyBsb2FkIHBhbmVsPC9zcGFuPjxkaXYgc3R5bGU9XCJ3aWR0aDogMzBweDsgaGVpZ2h0OiAzMHB4OyBtYXJnaW4tbGVmdDogMTBweFwiIGNsYXNzPVwic3Bpbm5lci1ib3JkZXIgdGV4dC13YXJuaW5nXCIgcm9sZT1cInN0YXR1c1wiPjxzcGFuIGNsYXNzPVwidmlzdWFsbHktaGlkZGVuXCI+TG9hZGluZy4uLjwvc3Bhbj48L2Rpdj4nKVxuICAgICAgICAgICAgICAgIFN3YWwuZmlyZSh7XG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBcIlRow6BuaCBjw7RuZ1wiLFxuICAgICAgICAgICAgICAgICAgICB0ZXh0OiByZXNwb25zZS5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICBpY29uOiBcInN1Y2Nlc3NcIixcbiAgICAgICAgICAgICAgICAgICAgc2hvd0NhbmNlbEJ1dHRvbjogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIGNvbmZpcm1CdXR0b25Db2xvcjogXCJ2YXIoLS1jb2xvci1icmFuZClcIixcbiAgICAgICAgICAgICAgICAgICAgY29uZmlybUJ1dHRvblRleHQ6IFwiWMOhYyBuaOG6rW5cIlxuICAgICAgICAgICAgICAgIH0pLnRoZW4oKHJlc3VsdHMpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdHMuaXNDb25maXJtZWQpXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICQoJy5hcHBlbmQtYWN0aW9uJykuZW1wdHkoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KVxufVxuXG4vKiBBcHBlbmQgYWxsIGlucHV0IGZyb20gRm9ybSBPcmRlciB0byBmb3JtIENvdXBvbiAqL1xuZnVuY3Rpb24gbG9hZEZvcm0oZSkge1xuICAgIGxldCBmb3JtID0gJChlKS5wYXJlbnQoKS5wYXJlbnQoKS5wYXJlbnQoKVxuXG4gICAgbGV0IElucHV0cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tuYW1lXj1cInZwc1tcIl0sW25hbWVePVwiaG9zdGluZ1tcIl0nKTtcblxuICAgIElucHV0cy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgIGxldCBrZXkgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnbmFtZScpO1xuICAgICAgICBmb3JtLmFwcGVuZChgPGlucHV0IHR5cGU9XCJoaWRkZW5cIiBuYW1lPVwiJHtrZXl9XCIgdmFsdWU9XCIke2VsZW1lbnQudmFsdWV9XCI+YCk7XG5cbiAgICB9KVxuICAgIGZvcm0uc3VibWl0KClcbn1cblxuLyogQ2hhbmdlIENhcnQgd2hlbiBjaGFuZ2UgTW9udGggKi9cbmZ1bmN0aW9uIGFwcGVuZENoYW5nZUNhcnQodGFyZ2V0ID0gJycsIGtleSA9IDApIHtcblxuICAgIC8qIENyZWF0ZSBuZXcgdmFyaWFibGUgZWxlbWVudCAqL1xuICAgIGxldCBFbGVtZW50U3ViVG90YWwgPSAkKCcuY2FydF90b3RhbF9ub3ZhdCcpO1xuICAgIGxldCBFbGVtZW50VmF0ID0gJCgnLmNhcnRfdmF0Jyk7XG4gICAgbGV0IEVsZW1lbnRUb3RhbCA9ICQoJy5jYXJ0X3RvdGFsX2Ftb3VudCcpO1xuICAgIGxldCBQcmljZVRhcmdldCA9ICQoYFtkYXRhLWZvY3VzPVwiJHt0YXJnZXR9XyR7a2V5fVwiXWApXG5cblxuICAgIC8qIENyZWF0ZSBuZXcgdmFyaWFibGUgcHJpY2UgZm9yIGVsZW1lbnQgU3ViVG90YWwgKi9cbiAgICBsZXQgUHJpY2VTdWJUb3RhbCA9IE51bWJlcihFbGVtZW50U3ViVG90YWwuYXR0cignZGF0YS1wcmljZScpKTtcblxuICAgIC8qIENyZWF0ZSBPbGQgdmFyaWFibGUgZWxlbWVudCBQcm9kdWN0IGZvciB0YXJnZXQgKi9cbiAgICBsZXQgQ2FydFRhcmdldCA9ICQoYFtkYXRhLXByb2R1Y3Q9XCIke2tleX1cIl1bZGF0YS10YXJnZXQ9XCIke3RhcmdldH1cIl1gKVxuICAgIGxldCBPbGRQcmljZSA9IE51bWJlcihQcmljZVRhcmdldC5maW5kKGAuJHt0YXJnZXR9XyR7a2V5fV9wcmljZS1hbW91bnRgKS5hdHRyKCdkYXRhLXByaWNlJykpO1xuXG4gICAgLyogR2V0IGFsbCBPbGQgYWRkb24gdG90YWwgKi9cbiAgICBsZXQgT2xkQWRkT25Ub3RhbCA9IDBcbiAgICBsZXQgQWxsRWxlbWVudEFkZG9uID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLm5hbWUtcHJpY2UnKTtcbiAgICBpZiAoQWxsRWxlbWVudEFkZG9uLmxlbmd0aCkge1xuICAgICAgICBBbGxFbGVtZW50QWRkb24uZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgT2xkQWRkT25Ub3RhbCArPSBOdW1iZXIoJChlbGVtZW50KS5hdHRyKCdkYXRhLXByaWNlX19hZGRvbicpKTtcbiAgICAgICAgfSlcbiAgICB9XG5cblxuICAgIC8qIENvbmZpZyBuZXcgTW9udGggKi9cbiAgICBsZXQgRWxlbWVudE1vbnRoID0gQ2FydFRhcmdldC5maW5kKCcudGltZS1idXlfX2NoYW5nZScpO1xuICAgIGxldCBQcmljZSA9IE51bWJlcihFbGVtZW50TW9udGguYXR0cignZGF0YS1wcmljZScpKTtcbiAgICBsZXQgTW9udGggPSBOdW1iZXIoRWxlbWVudE1vbnRoLmZpbmQoJ29wdGlvbjpzZWxlY3RlZCcpLnZhbCgpKVxuXG4gICAgLyogU2V0IG5ldyBDb25maWcgTW9udGggKi9cbiAgICBQcmljZVRhcmdldC5maW5kKGAuJHt0YXJnZXR9XyR7a2V5fV9tb250aGApLnRleHQoTW9udGgpO1xuICAgIFByaWNlVGFyZ2V0LmZpbmQoYC4ke3RhcmdldH1fJHtrZXl9X21vbnRoYCkuYXR0cignZGF0YS1tb250aCcsIE1vbnRoKTtcblxuICAgIC8qIENyZWF0ZSBuZXcgdmFyaWFibGUgUHJpY2UgKi9cbiAgICBsZXQgVG90YWxBZGRvbiA9IFN1bVRvdGFsQWRkb24oKTtcbiAgICBsZXQgU3ViVG90YWxQcmljZSA9IChQcmljZVN1YlRvdGFsIC0gT2xkUHJpY2UgLSBPbGRBZGRPblRvdGFsKSArIChQcmljZSAqIE1vbnRoICsgVG90YWxBZGRvbik7XG4gICAgbGV0IFZBVCA9IFN1YlRvdGFsUHJpY2UgKiAwLjE7XG4gICAgbGV0IFRvdGFsID0gU3ViVG90YWxQcmljZSArIFZBVDtcblxuICAgIC8qIENvbmZpZyBuZXcgcHJpY2UgdG8gYWxsIGVsZW1lbnQgKi9cblxuICAgIFByaWNlVGFyZ2V0LmZpbmQoYC4ke3RhcmdldH1fJHtrZXl9X3ByaWNlLWFtb3VudGApLmF0dHIoJ2RhdGEtcHJpY2UnLCBQcmljZSAqIE1vbnRoKTtcbiAgICBQcmljZVRhcmdldC5maW5kKGAuJHt0YXJnZXR9XyR7a2V5fV9wcmljZS1hbW91bnRgKS50ZXh0KChQcmljZSAqIE1vbnRoKS50b0xvY2FsZVN0cmluZygpKTtcblxuXG4gICAgRWxlbWVudFN1YlRvdGFsLmF0dHIoJ2RhdGEtcHJpY2UnLCBTdWJUb3RhbFByaWNlKVxuICAgIEVsZW1lbnRTdWJUb3RhbC50ZXh0KFN1YlRvdGFsUHJpY2UudG9Mb2NhbGVTdHJpbmcoKSlcblxuICAgIEVsZW1lbnRWYXQuYXR0cignZGF0YS1wcmljZScsIFZBVClcbiAgICBFbGVtZW50VmF0LnRleHQoVkFULnRvTG9jYWxlU3RyaW5nKCkpXG5cbiAgICBFbGVtZW50VG90YWwuYXR0cignZGF0YS1wcmljZScsIFRvdGFsKVxuICAgIEVsZW1lbnRUb3RhbC50ZXh0KFRvdGFsLnRvTG9jYWxlU3RyaW5nKCkpXG59XG5cbi8qIENoYW5nZSBDYXJ0IHdoZW4gY2hhbmdlIEFkZG9uICovXG5mdW5jdGlvbiBhcHBlbmRBZGRvbkNhcnQodGFyZ2V0ID0gJycsIHByaWNlID0gMCwgcXVhbnRpdHkgPSAwLCBzdGVwID0gMCwgdHlwZSA9IFwiLVwiLCBwYXJlbnQgPSAwLCBwYXJlbnRfdGFyZ2V0ID0gJycpIHtcbiAgICBsZXQgcGFyZW50VGFyZ2V0ID0gJChgW2RhdGEtZm9jdXM9XCIke3BhcmVudF90YXJnZXR9XyR7cGFyZW50fVwiXWApLmZpbmQoJy5ib3gtYWRkX19vbicpXG5cbiAgICBpZiAocXVhbnRpdHkgPT09IDApIHtcblxuICAgICAgICBsZXQgc2VydmljZV9lbGVtZW50ID0gJChgZGl2W2RhdGEtdGFyZ2V0PVwiJHtwYXJlbnRfdGFyZ2V0fVwiXVtkYXRhLXByb2R1Y3Q9XCIke3BhcmVudH1cIl1gKTtcblxuICAgICAgICBpZiAocGFyZW50VGFyZ2V0LmZpbmQoYC4ke3BhcmVudF90YXJnZXR9XyR7cGFyZW50fV9hZGRfJHt0YXJnZXR9YCkpIHtcbiAgICAgICAgICAgIHBhcmVudFRhcmdldC5maW5kKGAuJHtwYXJlbnRfdGFyZ2V0fV8ke3BhcmVudH1fYWRkXyR7dGFyZ2V0fWApLnJlbW92ZSgpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoTnVtYmVyKHNlcnZpY2VfZWxlbWVudC5maW5kKCcuaW5wdXQtcXR5W2RhdGEtbmFtZT1cImNwdVwiXScpLnZhbCgpKSA9PT0gMCAmJiBOdW1iZXIoc2VydmljZV9lbGVtZW50LmZpbmQoJy5pbnB1dC1xdHlbZGF0YS1uYW1lPVwic3NkXCJdJykudmFsKCkpID09PSAwICYmIE51bWJlcihzZXJ2aWNlX2VsZW1lbnQuZmluZCgnLmlucHV0LXF0eVtkYXRhLW5hbWU9XCJyYW1cIl0nKS52YWwoKSkgPT09IDApIHtcbiAgICAgICAgICAgIHBhcmVudFRhcmdldC5hZGRDbGFzcygnZC1ub25lJylcbiAgICAgICAgfVxuXG4gICAgICAgIGFwcGVuZENoYW5nZUNhcnQocGFyZW50X3RhcmdldCwgcGFyZW50KTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHBhcmVudFRhcmdldC5yZW1vdmVDbGFzcygnZC1ub25lJylcblxuICAgIGlmIChwYXJlbnRUYXJnZXQuZmluZChgLiR7cGFyZW50X3RhcmdldH1fJHtwYXJlbnR9X2FkZF8ke3RhcmdldH1gKSkge1xuICAgICAgICBwYXJlbnRUYXJnZXQuZmluZChgLiR7cGFyZW50X3RhcmdldH1fJHtwYXJlbnR9X2FkZF8ke3RhcmdldH1gKS5yZW1vdmUoKVxuICAgIH1cblxuICAgIGxldCBodG1sID0gYDxkaXYgY2xhc3M9XCJwcmljZSBhZGRvbi1wcmljZSAke3BhcmVudF90YXJnZXR9XyR7cGFyZW50fV9hZGRfJHt0YXJnZXR9XCI+YFxuICAgIGh0bWwgKz0gYDxkaXYgY2xhc3M9XCJhZGRvbi1wcmljZV9fbmFtZVwiPiR7dGFyZ2V0LnRvTG9jYWxlVXBwZXJDYXNlKCl9PC9kaXY+YDtcbiAgICBodG1sICs9IFwiPGRpdiBjbGFzcz0nZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuJz5cIjtcbiAgICBodG1sICs9IFwiPGRpdj5cIjtcbiAgICBodG1sICs9IFwiPHNwYW4gY2xhc3M9XFxcInByaWNlLWFtb3VudFxcXCI+XCJcbiAgICBodG1sICs9IGA8c3BhbiBkYXRhLXByaWNlPVwiJHsocHJpY2UgKiBxdWFudGl0eSl9XCIgY2xhc3M9XCIke3BhcmVudF90YXJnZXR9XyR7cGFyZW50fV9hZGRfJHt0YXJnZXR9X3ByaWNlLWFtb3VudFwiPmBcbiAgICBodG1sICs9IChwcmljZSAqIHF1YW50aXR5KS50b0xvY2FsZVN0cmluZygpO1xuICAgIGh0bWwgKz0gXCI8L3NwYW4+xJE8L3NwYW4+XCJcbiAgICBodG1sICs9IFwiPC9kaXY+XCJcbiAgICBodG1sICs9IFwiPGRpdj4gWCBcIjtcbiAgICBodG1sICs9IHF1YW50aXR5O1xuICAgIGh0bWwgKz0gXCI8L2Rpdj5cIjtcbiAgICBodG1sICs9IFwiPC9kaXY+XCI7XG4gICAgaHRtbCArPSBcIjwvZGl2PlwiO1xuXG4gICAgcGFyZW50VGFyZ2V0LmFwcGVuZChodG1sKVxuXG4gICAgYXBwZW5kQ2hhbmdlQ2FydChwYXJlbnRfdGFyZ2V0LCBwYXJlbnQpO1xuXG59XG5cbi8qIFN1bSB0b3RhbCBhZGRvbiAqL1xuZnVuY3Rpb24gU3VtVG90YWxBZGRvbigpIHtcbiAgICAvKiBHZXQgYWxsIEVsZW1lbnQgUHJvZHVjaHQgKi9cbiAgICBsZXQgdG90YWwgPSAwO1xuICAgIGxldCBhbGxQcm9kdWN0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLm5hbWUtcHJpY2UnKTtcbiAgICBpZiAoYWxsUHJvZHVjdC5sZW5ndGgpIHtcbiAgICAgICAgYWxsUHJvZHVjdC5mb3JFYWNoKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgICAgICBsZXQgcHJpY2UgPSAwO1xuICAgICAgICAgICAgbGV0IHZhcmlhYmxlID0gJChlbGVtZW50KTtcbiAgICAgICAgICAgIGxldCB0YXJnZXQgPSB2YXJpYWJsZS5hdHRyKCdkYXRhLWZvY3VzJylcbiAgICAgICAgICAgIGxldCBib3hIYXNFbGVtZW50QWRkb24gPSB2YXJpYWJsZS5maW5kKCcuYWRkb24tcHJpY2UgLnByaWNlLWFtb3VudCcpO1xuICAgICAgICAgICAgbGV0IE1vbnRoID0gTnVtYmVyKHZhcmlhYmxlLmZpbmQoYC4ke3RhcmdldH1fbW9udGhgKS5hdHRyKCdkYXRhLW1vbnRoJykpO1xuXG4gICAgICAgICAgICBpZiAoYm94SGFzRWxlbWVudEFkZG9uLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGJveEhhc0VsZW1lbnRBZGRvbi5lYWNoKGZ1bmN0aW9uIChpbmRleCwgZWxlbWVudCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgQWRkb25QcmljZSA9ICQoZWxlbWVudCkuZmluZCgnc3BhbicpLmF0dHIoJ2RhdGEtcHJpY2UnKVxuICAgICAgICAgICAgICAgICAgICBwcmljZSArPSBOdW1iZXIoQWRkb25QcmljZSkgKiBNb250aDtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXJpYWJsZS5hdHRyKCdkYXRhLXByaWNlX19hZGRvbicsIHByaWNlKTtcbiAgICAgICAgICAgIHRvdGFsICs9IHByaWNlO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIE51bWJlcih0b3RhbCk7XG5cbn1cblxuLyogQXBwZW5kIE9zIEdyb3VwIHRvIEVsZW1lbnQqL1xuZnVuY3Rpb24gYXBwZW5kT3NHcm91cCgpIHtcbiAgICAkKGAjb3NfZ3JvdXBfaWRgKS5lbXB0eSgpLmFwcGVuZCgnPG9wdGlvbiB2YWx1ZT1cIlwiPkxvYWRpbmcgLi4uPC9vcHRpb24+Jyk7XG4gICAgJC5nZXQoQVBJR2V0T3NHcm91cCwge2hvc3Q6ICQoJ2lucHV0W25hbWU9XCJob3N0X2lkXCJdJykudmFsKCl9LCBmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICAgICAgaWYgKHJlc3BvbnNlLmVycm9yID09PSBmYWxzZSkge1xuICAgICAgICAgICAgbGV0IGh0bWwgPSAnPG9wdGlvbiB2YWx1ZT1cIjBcIj4tLS0tLS0tLS08L29wdGlvbj4nO1xuICAgICAgICAgICAgcmVzcG9uc2UuZGF0YS5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgaHRtbCArPSBgPG9wdGlvbiB2YWx1ZT1cIiR7ZWxlbWVudC5pZH1cIj4ke2VsZW1lbnQubmFtZX08L29wdGlvbj5gO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICQoYCNvc19ncm91cF9pZGApLmVtcHR5KCkuYXBwZW5kKGh0bWwpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAkKGAjb3NfZ3JvdXBfaWRgKS5lbXB0eSgpLmFwcGVuZCgnPG9wdGlvbiB2YWx1ZT1cIjBcIj4tLS0tLS0tLS08L29wdGlvbj4nKTtcbiAgICAgICAgfVxuICAgIH0pXG59XG5cbi8qIEFwcGVuZCBFbGVtZW50ICovXG5mdW5jdGlvbiBhcHBlbmRDaGlsZChhcGlVcmwgPSAnJywgaWQgPSAnJywgZGF0YSA9IHt9KSB7XG4gICAgJChgIyR7aWR9YCkuZW1wdHkoKS5hcHBlbmQoJzxvcHRpb24gdmFsdWU9XCJcIj5Mb2FkaW5nIC4uLjwvb3B0aW9uPicpO1xuICAgICQuZ2V0KGFwaVVybCwgZGF0YSwgZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG4gICAgICAgIGlmIChyZXNwb25zZS5lcnJvciA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGxldCBodG1sID0gJzxvcHRpb24gdmFsdWU9XCIwXCI+LS0tLS0tLS0tPC9vcHRpb24+JztcbiAgICAgICAgICAgIHJlc3BvbnNlLmRhdGEuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGh0bWwgKz0gYDxvcHRpb24gdmFsdWU9XCIke2VsZW1lbnQuaWR9XCI+JHtlbGVtZW50Lm5hbWV9PC9vcHRpb24+YDtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAkKGAjJHtpZH1gKS5lbXB0eSgpLmFwcGVuZChodG1sKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgJChgIyR7aWR9YCkuZW1wdHkoKS5hcHBlbmQoJzxvcHRpb24gdmFsdWU9XCIwXCI+LS0tLS0tLS0tPC9vcHRpb24+Jyk7XG4gICAgICAgIH1cbiAgICB9KVxuICAgICAgICAuZmFpbChmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRvYXN0ci5lcnJvcihlcnJvci5zdGF0dXNUZXh0KVxuICAgICAgICB9KVxufVxuXG4vKiBBcHBlbmQgU25hcHNob3QgKi9cbmZ1bmN0aW9uIGFwcGVuZFNuYXBzaG90KHByb2R1Y3QgPSAwLCB1c2VyaWQgPSAwKSB7XG4gICAgU3dhbC5maXJlKHtcbiAgICAgICAgaHRtbDogc3dlZXRfbG9hZGVyICsgXCI8aDQ+xJBhbmcgeOG7rSBsw70gZOG7ryBsaeG7h3UgLi4uPC9oND5cIixcbiAgICAgICAgc2hvd0NvbmZpcm1CdXR0b246IGZhbHNlLFxuICAgIH0pXG4gICAgJC5nZXQoQVBJR2V0U25hcHNob3QsIHtwcm9kdWN0OiBwcm9kdWN0LCB1c2VyOiB1c2VyaWR9KVxuICAgICAgICAuZG9uZShmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICAgICAgICAgIFN3YWwuY2xvc2UoKTtcbiAgICAgICAgICAgIGlmICgkKCdib2R5JykuZmluZCgnI3N0YXRpY0JhY2tkcm9wJykubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgJCgnYm9keScpLmZpbmQoJyNzdGF0aWNCYWNrZHJvcCcpLnJlbW92ZSgpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAkKCcuYXBwZW5kLWFjdGlvbicpLmFmdGVyKHJlc3BvbnNlLmRhdGEpO1xuICAgICAgICAgICAgJCgnI3N0YXRpY0JhY2tkcm9wJykuYWRkQ2xhc3MoJ3Nob3cnKVxuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goKVxufVxuXG4vKiBBY3Rpb24gU25hcCAqL1xuZnVuY3Rpb24gU25hcHNob3RBY3Rpb24ocHJvZHVjdCA9IDAsIHVzZXJpZCA9IDAsIGFjdGlvbiA9ICcnLCBzbmFwID0gMCkge1xuICAgICQoJ2JvZHknKS5maW5kKCcjc3RhdGljQmFja2Ryb3AnKS5yZW1vdmUoKVxuICAgIFN3YWwuZmlyZSh7XG4gICAgICAgIGh0bWw6IHN3ZWV0X2xvYWRlciArIFwiPGg0PsSQYW5nIHjhu60gbMO9IGThu68gbGnhu4d1IC4uLjwvaDQ+XCIsXG4gICAgICAgIHNob3dDb25maXJtQnV0dG9uOiBmYWxzZSxcbiAgICB9KVxuICAgICQucG9zdChBUElTZXJ2aWNlU25hcFNob3QsIHtwcm9kdWN0OiBwcm9kdWN0LCB1c2VyaWQ6IHVzZXJpZCwgYWN0aW9uOiBhY3Rpb24sIHNuYXA6IHNuYXB9KVxuICAgICAgICAuZG9uZShmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgU3dhbC5maXJlKHtcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IFwiQ8OzIGzhu5dpIHjhuqN5IHJhP1wiLFxuICAgICAgICAgICAgICAgICAgICB0ZXh0OiBkYXRhLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIGljb246IFwid2FybmluZ1wiLFxuICAgICAgICAgICAgICAgICAgICBzaG93Q2FuY2VsQnV0dG9uOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBjb25maXJtQnV0dG9uQ29sb3I6IFwidmFyKC0tY29sb3ItYnJhbmQpXCIsXG4gICAgICAgICAgICAgICAgICAgIGNhbmNlbEJ1dHRvbkNvbG9yOiBcIiM4MTgxODFcIixcbiAgICAgICAgICAgICAgICAgICAgY29uZmlybUJ1dHRvblRleHQ6IFwiT2tcIlxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHdpbmRvdy5FY2hvLmNoYW5uZWwoJ05vdGlmaWNhdGlvbicpXG4gICAgICAgICAgICAgICAgICAgIC5saXN0ZW4oJy5Ob3RpZmljYXRpb24tRXZlbnQnLCAocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFN3YWwuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTd2FsLmZpcmUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogXCJUaMOgbmggY8O0bmdcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogcmVzcG9uc2UubWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbjogXCJzdWNjZXNzXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dDYW5jZWxCdXR0b246IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maXJtQnV0dG9uQ29sb3I6IFwidmFyKC0tY29sb3ItYnJhbmQpXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpcm1CdXR0b25UZXh0OiBcIljDoWMgbmjhuq1uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTd2FsLmZpcmUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogXCJDw7MgbOG7l2kgeOG6o3kgcmE/XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6IHJlc3BvbnNlLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb246IFwid2FybmluZ1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93Q2FuY2VsQnV0dG9uOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maXJtQnV0dG9uQ29sb3I6IFwidmFyKC0tY29sb3ItYnJhbmQpXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbmNlbEJ1dHRvbkNvbG9yOiBcIiM4MTgxODFcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlybUJ1dHRvblRleHQ6IFwiT2tcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG5cbiAgICAgICAgfSlcbn1cblxuLyogQXBwZW5kIFVwZ3JhZGUgU3lzdGVtICovXG5mdW5jdGlvbiBhcHBlbmRVcGdyYWRlRm9ybShwcm9kdWN0ID0gMCkge1xuICAgIFN3YWwuZmlyZSh7XG4gICAgICAgIGh0bWw6IHN3ZWV0X2xvYWRlciArIFwiPGg0PsSQYW5nIHjhu60gbMO9IGThu68gbGnhu4d1IC4uLjwvaDQ+XCIsXG4gICAgICAgIHNob3dDb25maXJtQnV0dG9uOiBmYWxzZSxcbiAgICB9KVxuICAgICQuZ2V0KEFQSUdldFByb2R1Y3RBZGRvbiwge3Byb2R1Y3Q6IHByb2R1Y3R9KVxuICAgICAgICAuZG9uZShmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICAgICAgICAgIFN3YWwuY2xvc2UoKTtcbiAgICAgICAgICAgIGxldCBib2R5ID0gJCgnYm9keScpXG5cbiAgICAgICAgICAgIGJvZHkuZmluZCgnI3VwZ3JhZGUnKS5sZW5ndGggPyBib2R5LmZpbmQoJyN1cGdyYWRlJykucmVtb3ZlKCkgOiBcIlwiO1xuXG4gICAgICAgICAgICAkKCcuYXBwZW5kLWFjdGlvbicpLmFmdGVyKHJlc3BvbnNlLmRhdGEpO1xuICAgICAgICAgICAgJCgnI3VwZ3JhZGUnKS5hZGRDbGFzcygnc2hvdycpXG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaChmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKHJlc3BvbnNlKVxuICAgICAgICB9KVxufVxuXG4vKiBBZGRvbiBDaGFuZ2UgRm9ybSBVcGdyYWRlICovXG5cbmZ1bmN0aW9uIGFwcGVuZEFkZG9uKHBhcmVudCwgaXRlbSA9ICcnLCBwcmljZSA9IDAsIHN0ZXAgPSAwLCB0eXBlID0gJy0nKSB7XG4gICAgbGV0IHF1YW50aXR5ID0gTnVtYmVyKHBhcmVudC5maW5kKCcuaW5wdXQtcXR5JykudmFsKCkpO1xuICAgIGxldCBPbGRQcmljZSA9IHByaWNlICogcXVhbnRpdHlcbiAgICBpZiAodHlwZSA9PT0gJy0nKSB7XG4gICAgICAgIHF1YW50aXR5IC09IHN0ZXA7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcXVhbnRpdHkgKz0gc3RlcDtcbiAgICB9XG5cbiAgICBwYXJlbnQuZmluZCgnLmlucHV0LXF0eScpLnZhbChxdWFudGl0eSA8PSAwID8gMCA6IHF1YW50aXR5KVxuXG4gICAgbGV0IGh0bWwgPSBgXG4gICAgPGRpdiBpZD1cIiR7aXRlbX1cIiBjbGFzcz1cIml0ZW0tYm90dG9tIGl0ZW0tcHJpY2UtYWxsIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZm9udC13ZWlnaHQtYm9sZCBjYXJ0X3dpZGdldF9zdWJ0aXRsZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7aXRlbS50b0xvY2FsZVVwcGVyQ2FzZSgpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwcmljZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGRhdGEtcHJpY2U9XCIke3F1YW50aXR5ICogcHJpY2V9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInByaWNlLWFtb3VudCBwcmljZS1vbmUgZm9udC13ZWlnaHQtYm9sZCBjb2xvci1tYWluXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHsocXVhbnRpdHkgKiBwcmljZSkudG9Mb2NhbGVTdHJpbmcoKX3EkVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+YDtcbiAgICBsZXQgYm9keSA9ICQoJ2JvZHknKTtcbiAgICBib2R5LmZpbmQoYCN1cGdyYWRlIC5jb2wtbWQtNSAuYm94LWFkZF9fb24gIyR7aXRlbX1gKS5yZW1vdmUoKVxuICAgIGlmIChxdWFudGl0eSA8PSAwKSB7XG4gICAgICAgIGFjdGlvbkNoYW5nZVByaWNlVXBncmFkZShwcmljZSwgcXVhbnRpdHksIHN0ZXAsIHR5cGUsIE9sZFByaWNlKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGFjdGlvbkNoYW5nZVByaWNlVXBncmFkZShwcmljZSwgcXVhbnRpdHksIHN0ZXAsIHR5cGUsIE9sZFByaWNlKVxuICAgIGJvZHkuZmluZCgnI3VwZ3JhZGUgLmNvbC1tZC01IC5ib3gtYWRkX19vbiBocicpLmJlZm9yZShodG1sKVxufVxuXG5mdW5jdGlvbiBhY3Rpb25DaGFuZ2VQcmljZVVwZ3JhZGUocHJpY2UgPSAwLCBxdWFudGl0eSA9IDAsIHN0ZXAgPSAwLCB0eXBlID0gJycsIG9sZFByaWNlID0gMCkge1xuICAgIGlmIChxdWFudGl0eSA8IDApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBsZXQgYm9keSA9ICQoJ2JvZHknKTtcbiAgICBsZXQgVG90YWxOb1ZhbCA9IGJvZHkuZmluZCgnI3VwZ3JhZGUgLmNhcnRfdG90YWxfbm92YXQnKVxuICAgIGxldCBWQVQgPSBib2R5LmZpbmQoJyN1cGdyYWRlIC5jYXJ0X3ZhdCcpXG4gICAgbGV0IFRvdGFsID0gYm9keS5maW5kKCcjdXBncmFkZSAuY2FydF90b3RhbF9hbW91bnQnKVxuICAgIGxldCBCaWxsaW5nID0gTnVtYmVyKGJvZHkuZmluZCgnI3VwZ3JhZGUgaW5wdXRbbmFtZT1cImJpbGxpbmdcIl0nKS52YWwoKSlcblxuICAgIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cbiAgICBsZXQgVG90YWxOb1ZhbFByaWNlID0gTnVtYmVyKFRvdGFsTm9WYWwuYXR0cignZGF0YS1wcmljZScpKTtcbiAgICBsZXQgVkFUUHJpY2UgPSBOdW1iZXIoVkFULmF0dHIoJ2RhdGEtcHJpY2UnKSk7XG4gICAgbGV0IFRvdGFsUHJpY2UgPSBOdW1iZXIoVG90YWwuYXR0cignZGF0YS1wcmljZScpKTtcbiAgICAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cbiAgICBpZiAodHlwZSA9PT0gJy0nKSB7XG5cbiAgICAgICAgVG90YWxOb1ZhbFByaWNlID0gKFRvdGFsTm9WYWxQcmljZSAtIG9sZFByaWNlICogQmlsbGluZykgKyAocHJpY2UgKiBxdWFudGl0eSAqIEJpbGxpbmcpO1xuXG4gICAgICAgIGlmIChUb3RhbE5vVmFsUHJpY2UgPD0gMCkge1xuICAgICAgICAgICAgVG90YWxOb1ZhbFByaWNlID0gMDtcbiAgICAgICAgfVxuICAgICAgICBWQVRQcmljZSA9IFRvdGFsTm9WYWxQcmljZSAqIDAuMTtcbiAgICAgICAgVG90YWxQcmljZSA9IFRvdGFsTm9WYWxQcmljZSArIFZBVFByaWNlO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIFRvdGFsTm9WYWxQcmljZSA9IChUb3RhbE5vVmFsUHJpY2UgLSBvbGRQcmljZSAqIEJpbGxpbmcpICsgKHByaWNlICogcXVhbnRpdHkgKiBCaWxsaW5nKTtcbiAgICAgICAgVkFUUHJpY2UgPSBUb3RhbE5vVmFsUHJpY2UgKiAwLjE7XG4gICAgICAgIFRvdGFsUHJpY2UgPSBUb3RhbE5vVmFsUHJpY2UgKyBWQVRQcmljZTtcbiAgICB9XG5cbiAgICBUb3RhbE5vVmFsLmF0dHIoJ2RhdGEtcHJpY2UnLCBUb3RhbE5vVmFsUHJpY2UpO1xuICAgIFRvdGFsTm9WYWwudGV4dChUb3RhbE5vVmFsUHJpY2UudG9Mb2NhbGVTdHJpbmcoKSk7XG5cbiAgICBWQVQuYXR0cignZGF0YS1wcmljZScsIFZBVFByaWNlKTtcbiAgICBWQVQudGV4dChWQVRQcmljZS50b0xvY2FsZVN0cmluZygpKTtcblxuICAgIFRvdGFsLmF0dHIoJ2RhdGEtcHJpY2UnLCBUb3RhbFByaWNlKTtcbiAgICBUb3RhbC50ZXh0KFRvdGFsUHJpY2UudG9Mb2NhbGVTdHJpbmcoKSk7XG59XG5cbmZ1bmN0aW9uIE9yZGVyQWRkb24ocHJvZHVjdCA9IDAsIGJpbGxpbmcgPSAwKSB7XG4gICAgbGV0IGJvZHkgPSAkKCdib2R5Jyk7XG4gICAgbGV0IGFsbEl0ZW0gPSBib2R5LmZpbmQoJyN1cGdyYWRlIC5pbnB1dC1xdHknKTtcbiAgICBsZXQgZXJyb3IgPSBbXTtcbiAgICBsZXQgYWRkb24gPSB7fTtcbiAgICBpZiAoYWxsSXRlbS5sZW5ndGgpIHtcbiAgICAgICAgYWxsSXRlbS5lYWNoKChpbmRleCwgb2JqZWN0KSA9PiB7XG4gICAgICAgICAgICBpZiAoTnVtYmVyKG9iamVjdC52YWx1ZSkgPT09IDApIHtcbiAgICAgICAgICAgICAgICBlcnJvci5wdXNoKG9iamVjdC5uYW1lKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYWRkb25bYCR7b2JqZWN0Lm5hbWV9YF0gPSB7XG4gICAgICAgICAgICAgICAgcHJpY2U6IG9iamVjdC5nZXRBdHRyaWJ1dGUoJ2RhdGEtcHJpY2UnKSxcbiAgICAgICAgICAgICAgICBxdWFudGl0eTogb2JqZWN0LnZhbHVlXG4gICAgICAgICAgICB9O1xuICAgICAgICB9KVxuICAgIH1cbiAgICBpZiAoZXJyb3IubGVuZ3RoID09PSAzKSB7XG4gICAgICAgIGVycm9yLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgIGJvZHkuZmluZChgI3VwZ3JhZGUgLmlucHV0LXF0eVtuYW1lPVwiJHtlbGVtZW50fVwiXWApLmFkZENsYXNzKCdlcnJvcicpO1xuICAgICAgICB9KVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgU3dhbC5maXJlKHtcbiAgICAgICAgdGl0bGU6IFwiQ2jDuiDDvT9cIixcbiAgICAgICAgdGV4dDogXCJUcm9uZyBxdcOhIHRyw6xuaCBuw6JuZyBj4bqlcCwgQ2jDum5nIHTDtGkgc+G6vSB04bqvdCBtw6F5IGNo4bunIGPhu6dhIGLhuqFuIVwiLFxuICAgICAgICBpY29uOiBcIndhcm5pbmdcIixcbiAgICAgICAgc2hvd0NhbmNlbEJ1dHRvbjogdHJ1ZSxcbiAgICAgICAgY29uZmlybUJ1dHRvbkNvbG9yOiBcIiMzMDg1ZDZcIixcbiAgICAgICAgY2FuY2VsQnV0dG9uQ29sb3I6IFwiI2QzM1wiLFxuICAgICAgICBjb25maXJtQnV0dG9uVGV4dDogXCJYw6FjIG5o4bqtblwiXG4gICAgfSkudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgIGlmIChyZXN1bHQuaXNDb25maXJtZWQpIHtcbiAgICAgICAgICAgICQuYWpheCh7XG4gICAgICAgICAgICAgICAgdXJsOiBBUElDYXJ0QWRkb24sXG4gICAgICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgICAgICBhZGRvbixcbiAgICAgICAgICAgICAgICAgICAgcHJvZHVjdCxcbiAgICAgICAgICAgICAgICAgICAgYmlsbGluZ1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgdHlwZTogJ3Bvc3QnLFxuICAgICAgICAgICAgICAgIGJlZm9yZVNlbmQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgU3dhbC5maXJlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGh0bWw6IHN3ZWV0X2xvYWRlciArIFwiPGg0PsSQYW5nIHjhu60gbMO9IGThu68gbGnhu4d1IC4uLjwvaDQ+XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBzaG93Q29uZmlybUJ1dHRvbjogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgU3dhbC5jbG9zZSgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UuZXJyb3IgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBTd2FsLmZpcmUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiBcIsSQ4bq3dCBow6BuZyB0aMOgbmggY8O0bmdcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiByZXNwb25zZS5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb246IFwic3VjY2Vzc1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dDYW5jZWxCdXR0b246IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlybUJ1dHRvbkNvbG9yOiBcIiMzMDg1ZDZcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW5jZWxCdXR0b25Db2xvcjogXCIjZDMzXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlybUJ1dHRvblRleHQ6IFwiWMOhYyBuaOG6rW5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSkudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnYm9keScpLmZpbmQoJyN1cGdyYWRlJykucmVtb3ZlKClcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBTd2FsLmZpcmUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb246IFwiZXJyb3JcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogXCJPb3BzLi4uXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogcmVzcG9uc2UubWVzc2FnZVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBSZW5ld1NlcnZpY2UocHJvZHVjdCA9IDAsIGJpbGxpbmcgPSAwLCB0eXBlID0gMCkge1xuICAgIFN3YWwuZmlyZSh7XG4gICAgICAgIHRpdGxlOiBcIkNow7ogw70/XCIsXG4gICAgICAgIHRleHQ6IFwiQuG6oW4gxJFhbmcgecOqdSBj4bqndSBnaWEgaOG6oW4gZOG7i2NoIHbhu6UhXCIsXG4gICAgICAgIGljb246IFwid2FybmluZ1wiLFxuICAgICAgICBzaG93Q2FuY2VsQnV0dG9uOiB0cnVlLFxuICAgICAgICBjb25maXJtQnV0dG9uQ29sb3I6IFwiIzMwODVkNlwiLFxuICAgICAgICBjYW5jZWxCdXR0b25Db2xvcjogXCIjZDMzXCIsXG4gICAgICAgIGNvbmZpcm1CdXR0b25UZXh0OiBcIljDoWMgbmjhuq1uXCJcbiAgICB9KS50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0NvbmZpcm1lZCkge1xuICAgICAgICAgICAgJC5hamF4KHtcbiAgICAgICAgICAgICAgICB1cmw6IEFQSVJlbmV3U2VydmljZSxcbiAgICAgICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICAgICAgICAgIHByb2R1Y3QsXG4gICAgICAgICAgICAgICAgICAgIGJpbGxpbmdcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHR5cGU6ICdwb3N0JyxcbiAgICAgICAgICAgICAgICBiZWZvcmVTZW5kOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIFN3YWwuZmlyZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICBodG1sOiBzd2VldF9sb2FkZXIgKyBcIjxoND7EkGFuZyB44butIGzDvSBk4buvIGxp4buHdSAuLi48L2g0PlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2hvd0NvbmZpcm1CdXR0b246IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgc3VjY2VzczogZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgICAgIFN3YWwuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmVycm9yID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgU3dhbC5maXJlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogXCJTdWNjZXNzXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogcmVzcG9uc2UubWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uOiBcInN1Y2Nlc3NcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93Q2FuY2VsQnV0dG9uOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpcm1CdXR0b25Db2xvcjogXCIjMzA4NWQ2XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuY2VsQnV0dG9uQ29sb3I6IFwiI2QzM1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpcm1CdXR0b25UZXh0OiBcIljDoWMgbmjhuq1uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJyNyZW5ldycpLm1vZGFsKCdoaWRlJylcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBTd2FsLmZpcmUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb246IFwiZXJyb3JcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogXCJPb3BzLi4uXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogcmVzcG9uc2UubWVzc2FnZVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBDb3B5RGlzY291bnQodmFsdWUgPSAnJykge1xuXG4gICAgbGV0IHRlbXBUZXh0YXJlYSA9ICQoJzx0ZXh0YXJlYT4nKTtcbiAgICAkKCdib2R5JykuYXBwZW5kKHRlbXBUZXh0YXJlYSk7XG4gICAgdGVtcFRleHRhcmVhLnZhbCh2YWx1ZSkuc2VsZWN0KCk7XG4gICAgZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ2NvcHknKTtcbiAgICB0ZW1wVGV4dGFyZWEucmVtb3ZlKCk7XG5cbiAgICBTd2FsLmZpcmUoe1xuICAgICAgICB0aXRsZTogXCJDb3B5IFN1Y2Nlc3NmdWxseVwiLFxuICAgICAgICB0ZXh0OiBcIkNvcHkgbcOjIGdp4bqjbSBnacOhIHRow6BuaCBjw7RuZyFcIixcbiAgICAgICAgaWNvbjogXCJzdWNjZXNzXCIsXG4gICAgICAgIGNvbmZpcm1CdXR0b25Db2xvcjogXCIjMzA4NWQ2XCIsXG4gICAgICAgIGNvbmZpcm1CdXR0b25UZXh0OiBcIljDoWMgbmjhuq1uXCJcbiAgICB9KVxufVxuXG50b2FzdHIub3B0aW9ucyA9IHtcbiAgICBcImNsb3NlQnV0dG9uXCI6IGZhbHNlLFxuICAgIFwiZGVidWdcIjogZmFsc2UsXG4gICAgXCJuZXdlc3RPblRvcFwiOiBmYWxzZSxcbiAgICBcInByb2dyZXNzQmFyXCI6IGZhbHNlLFxuICAgIFwicG9zaXRpb25DbGFzc1wiOiBcInRvYXN0LXRvcC1yaWdodFwiLFxuICAgIFwicHJldmVudER1cGxpY2F0ZXNcIjogZmFsc2UsXG4gICAgXCJvbmNsaWNrXCI6IG51bGwsXG4gICAgXCJzaG93RHVyYXRpb25cIjogXCIzMDBcIixcbiAgICBcImhpZGVEdXJhdGlvblwiOiBcIjEwMDBcIixcbiAgICBcInRpbWVPdXRcIjogXCI1MDAwXCIsXG4gICAgXCJleHRlbmRlZFRpbWVPdXRcIjogXCIxMDAwXCIsXG4gICAgXCJzaG93RWFzaW5nXCI6IFwic3dpbmdcIixcbiAgICBcImhpZGVFYXNpbmdcIjogXCJsaW5lYXJcIixcbiAgICBcInNob3dNZXRob2RcIjogXCJmYWRlSW5cIixcbiAgICBcImhpZGVNZXRob2RcIjogXCJmYWRlT3V0XCJcbn1cbiJdLCJtYXBwaW5ncyI6IkFBQUEsSUFBSUEsWUFBWSxHQUFHLGtmQUFrZjtBQUVyZ0IsU0FBU0MsY0FBY0EsQ0FBQSxFQUFjO0VBQUEsSUFBYkMsT0FBTyxHQUFBQyxTQUFBLENBQUFDLE1BQUEsUUFBQUQsU0FBQSxRQUFBRSxTQUFBLEdBQUFGLFNBQUEsTUFBRyxDQUFDO0VBQy9CRyxDQUFDLENBQUNDLElBQUksQ0FBQztJQUNIQyxHQUFHLEVBQUVDLHFCQUFxQjtJQUMxQkMsSUFBSSxFQUFFO01BQ0ZSLE9BQU8sRUFBRUE7SUFDYixDQUFDO0lBQ0RTLElBQUksRUFBRSxNQUFNO0lBQ1pDLFVBQVUsRUFBRSxTQUFaQSxVQUFVQSxDQUFBLEVBQWM7TUFDcEJDLElBQUksQ0FBQ0MsSUFBSSxDQUFDO1FBQ05DLElBQUksRUFBRWYsWUFBWSxHQUFHLGlDQUFpQztRQUN0RGdCLGlCQUFpQixFQUFFO01BQ3ZCLENBQUMsQ0FBQztJQUNOLENBQUM7SUFDREMsT0FBTyxFQUFFLFNBQVRBLE9BQU9BLENBQVlDLFFBQVEsRUFBRTtNQUN6QixJQUFJQSxRQUFRLENBQUNDLEtBQUssS0FBSyxLQUFLLEVBQUU7UUFDMUJOLElBQUksQ0FBQ0MsSUFBSSxDQUFDO1VBQ05NLEtBQUssRUFBRSxzQkFBc0I7VUFDN0JDLElBQUksRUFBRSxnQ0FBZ0M7VUFDdENDLElBQUksRUFB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Q0FBQ3VHLFdBQVcsQ0FBQyxNQUFNLENBQUM7RUFDNUJGLFlBQVksQ0FBQzdELE1BQU0sQ0FBQyxDQUFDO0VBRXJCM0UsSUFBSSxDQUFDQyxJQUFJLENBQUM7SUFDTk0sS0FBSyxFQUFFLG1CQUFtQjtJQUMxQkMsSUFBSSxFQUFFLDhCQUE4QjtJQUNwQ0MsSUFBSSxFQUFFLFNBQVM7SUFDZkMsa0JBQWtCLEVBQUUsU0FBUztJQUM3QkMsaUJBQWlCLEVBQUU7RUFDdkIsQ0FBQyxDQUFDO0FBQ047QUFFQW1GLE1BQU0sQ0FBQzZDLE9BQU8sR0FBRztFQUNiLGFBQWEsRUFBRSxLQUFLO0VBQ3BCLE9BQU8sRUFBRSxLQUFLO0VBQ2QsYUFBYSxFQUFFLEtBQUs7RUFDcEIsYUFBYSxFQUFFLEtBQUs7RUFDcEIsZUFBZSxFQUFFLGlCQUFpQjtFQUNsQyxtQkFBbUIsRUFBRSxLQUFLO0VBQzFCLFNBQVMsRUFBRSxJQUFJO0VBQ2YsY0FBYyxFQUFFLEtBQUs7RUFDckIsY0FBYyxFQUFFLE1BQU07RUFDdEIsU0FBUyxFQUFFLE1BQU07RUFDakIsaUJBQWlCLEVBQUUsTUFBTTtFQUN6QixZQUFZLEVBQUUsT0FBTztFQUNyQixZQUFZLEVBQUUsUUFBUTtFQUN0QixZQUFZLEVBQUUsUUFBUTtFQUN0QixZQUFZLEVBQUU7QUFDbEIsQ0FBQyIsImlnbm9yZUxpc3QiOltdLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvY29yZS5qcyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./resources/js/core.js\n"); +eval("var sweet_loader = '';\nfunction PaymentInvoice() {\n var invoice = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n $.ajax({\n url: ApiUserPaymentInvoice,\n data: {\n invoice: invoice\n },\n type: \"post\",\n beforeSend: function beforeSend() {\n Swal.fire({\n html: sweet_loader + \"Đang xử lý dữ liệu ...\",\n showConfirmButton: false\n });\n },\n success: function success(response) {\n if (response.error === false) {\n Swal.fire({\n title: \"Payment Successfully\",\n text: \"Thanh toán hoá đơn thành công!\",\n icon: \"success\",\n confirmButtonColor: \"#3085d6\",\n confirmButtonText: \"Xác nhận\"\n }).then(function (result) {\n if (result.isConfirmed) {\n location.reload();\n }\n });\n } else {\n Swal.fire({\n title: \"Có lỗi xảy ra?\",\n text: response.message,\n icon: \"warning\",\n showCancelButton: false,\n confirmButtonColor: \"var(--color-brand)\",\n confirmButtonText: \"Xác nhận\"\n });\n }\n }\n });\n}\n\n/* Action for VirtualMachine */\nfunction VirtualMachineAction() {\n var action = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n var id = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n var userid = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;\n $.ajax({\n url: APIServiceAction,\n data: {\n action: action,\n product: id,\n userid: userid\n },\n type: \"post\",\n beforeSend: function beforeSend() {\n Swal.fire({\n html: sweet_loader + \"Đang xử lý dữ liệu ...\",\n showConfirmButton: false\n });\n },\n success: function success(response) {\n if (response.status === false) {\n Swal.fire({\n title: \"Có lỗi xảy ra?\",\n text: data.message,\n icon: \"warning\",\n showCancelButton: true,\n confirmButtonColor: \"var(--color-brand)\",\n cancelButtonColor: \"#818181\",\n confirmButtonText: \"Ok\"\n });\n } else {\n $('.system-status').empty().append('Đang load panelLoading...');\n Swal.fire({\n title: \"Thành công\",\n text: response.message,\n icon: \"success\",\n showCancelButton: false,\n confirmButtonColor: \"var(--color-brand)\",\n confirmButtonText: \"Xác nhận\"\n }).then(function (results) {\n if (results.isConfirmed) {\n $('.append-action').empty();\n }\n });\n }\n }\n });\n}\n\n/* Append all input from Form Order to form Coupon */\nfunction loadForm(e) {\n var form = $(e).parent().parent().parent();\n var Inputs = document.querySelectorAll('[name^=\"vps[\"],[name^=\"hosting[\"]');\n Inputs.forEach(function (element) {\n var key = element.getAttribute('name');\n form.append(\"\"));\n });\n form.submit();\n}\n\n/* Change Cart when change Month */\nfunction appendChangeCart() {\n var target = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n var key = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n /* Create new variable element */\n var ElementSubTotal = $('.cart_total_novat');\n var ElementVat = $('.cart_vat');\n var ElementTotal = $('.cart_total_amount');\n var PriceTarget = $(\"[data-focus=\\\"\".concat(target, \"_\").concat(key, \"\\\"]\"));\n\n /* Create new variable price for element SubTotal */\n var PriceSubTotal = Number(ElementSubTotal.attr('data-price'));\n\n /* Create Old variable element Product for target */\n var CartTarget = $(\"[data-product=\\\"\".concat(key, \"\\\"][data-target=\\\"\").concat(target, \"\\\"]\"));\n var OldPrice = Number(PriceTarget.find(\".\".concat(target, \"_\").concat(key, \"_price-amount\")).attr('data-price'));\n\n /* Get all Old addon total */\n var OldAddOnTotal = 0;\n var AllElementAddon = document.querySelectorAll('.name-price');\n if (AllElementAddon.length) {\n AllElementAddon.forEach(function (element) {\n OldAddOnTotal += Number($(element).attr('data-price__addon'));\n });\n }\n\n /* Config new Month */\n var ElementMonth = CartTarget.find('.time-buy__change');\n var Price = Number(ElementMonth.attr('data-price'));\n var Month = Number(ElementMonth.find('option:selected').val());\n\n /* Set new Config Month */\n PriceTarget.find(\".\".concat(target, \"_\").concat(key, \"_month\")).text(Month);\n PriceTarget.find(\".\".concat(target, \"_\").concat(key, \"_month\")).attr('data-month', Month);\n\n /* Create new variable Price */\n var TotalAddon = SumTotalAddon();\n var SubTotalPrice = PriceSubTotal - OldPrice - OldAddOnTotal + (Price * Month + TotalAddon);\n var VAT = SubTotalPrice * 0.1;\n var Total = SubTotalPrice + VAT;\n\n /* Config new price to all element */\n\n PriceTarget.find(\".\".concat(target, \"_\").concat(key, \"_price-amount\")).attr('data-price', Price * Month);\n PriceTarget.find(\".\".concat(target, \"_\").concat(key, \"_price-amount\")).text((Price * Month).toLocaleString());\n ElementSubTotal.attr('data-price', SubTotalPrice);\n ElementSubTotal.text(SubTotalPrice.toLocaleString());\n ElementVat.attr('data-price', VAT);\n ElementVat.text(VAT.toLocaleString());\n ElementTotal.attr('data-price', Total);\n ElementTotal.text(Total.toLocaleString());\n}\n\n/* Change Cart when change Addon */\nfunction appendAddonCart() {\n var target = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n var price = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n var quantity = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;\n var step = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0;\n var type = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : \"-\";\n var parent = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 0;\n var parent_target = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : '';\n var parentTarget = $(\"[data-focus=\\\"\".concat(parent_target, \"_\").concat(parent, \"\\\"]\")).find('.box-add__on');\n if (quantity === 0) {\n var service_element = $(\"div[data-target=\\\"\".concat(parent_target, \"\\\"][data-product=\\\"\").concat(parent, \"\\\"]\"));\n if (parentTarget.find(\".\".concat(parent_target, \"_\").concat(parent, \"_add_\").concat(target))) {\n parentTarget.find(\".\".concat(parent_target, \"_\").concat(parent, \"_add_\").concat(target)).remove();\n }\n if (Number(service_element.find('.input-qty[data-name=\"cpu\"]').val()) === 0 && Number(service_element.find('.input-qty[data-name=\"ssd\"]').val()) === 0 && Number(service_element.find('.input-qty[data-name=\"ram\"]').val()) === 0) {\n parentTarget.addClass('d-none');\n }\n appendChangeCart(parent_target, parent);\n return false;\n }\n parentTarget.removeClass('d-none');\n if (parentTarget.find(\".\".concat(parent_target, \"_\").concat(parent, \"_add_\").concat(target))) {\n parentTarget.find(\".\".concat(parent_target, \"_\").concat(parent, \"_add_\").concat(target)).remove();\n }\n var html = \"\");\n html += \"\".concat(target.toLocaleUpperCase(), \"\");\n html += \"\";\n html += \"\";\n html += \"\";\n html += \"\");\n html += (price * quantity).toLocaleString();\n html += \"đ\";\n html += \"\";\n html += \" X \";\n html += quantity;\n html += \"\";\n html += \"\";\n html += \"\";\n parentTarget.append(html);\n appendChangeCart(parent_target, parent);\n}\n\n/* Sum total addon */\nfunction SumTotalAddon() {\n /* Get all Element Producht */\n var total = 0;\n var allProduct = document.querySelectorAll('.name-price');\n if (allProduct.length) {\n allProduct.forEach(function (element) {\n var price = 0;\n var variable = $(element);\n var target = variable.attr('data-focus');\n var boxHasElementAddon = variable.find('.addon-price .price-amount');\n var Month = Number(variable.find(\".\".concat(target, \"_month\")).attr('data-month'));\n if (boxHasElementAddon.length) {\n boxHasElementAddon.each(function (index, element) {\n var AddonPrice = $(element).find('span').attr('data-price');\n price += Number(AddonPrice) * Month;\n });\n }\n variable.attr('data-price__addon', price);\n total += price;\n });\n }\n return Number(total);\n}\n\n/* Append Os Group to Element*/\nfunction appendOsGroup() {\n $(\"#os_group_id\").empty().append('Loading ...');\n $.get(APIGetOsGroup, {\n host: $('input[name=\"host_id\"]').val()\n }, function (response) {\n if (response.error === false) {\n var html = '---------';\n response.data.forEach(function (element) {\n html += \"\").concat(element.name, \"\");\n });\n $(\"#os_group_id\").empty().append(html);\n } else {\n $(\"#os_group_id\").empty().append('---------');\n }\n });\n}\n\n/* Append Element */\nfunction appendChild() {\n var apiUrl = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n var id = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n var data = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n $(\"#\".concat(id)).empty().append('Loading ...');\n $.get(apiUrl, data, function (response) {\n if (response.error === false) {\n var html = '---------';\n response.data.forEach(function (element) {\n html += \"\").concat(element.name, \"\");\n });\n $(\"#\".concat(id)).empty().append(html);\n } else {\n $(\"#\".concat(id)).empty().append('---------');\n }\n }).fail(function (error) {\n toastr.error(error.statusText);\n });\n}\n\n/* Append Snapshot */\nfunction appendSnapshot() {\n var product = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n var userid = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n Swal.fire({\n html: sweet_loader + \"Đang xử lý dữ liệu ...\",\n showConfirmButton: false\n });\n $.get(APIGetSnapshot, {\n product: product,\n user: userid\n }).done(function (response) {\n Swal.close();\n if ($('body').find('#staticBackdrop').length) {\n $('body').find('#staticBackdrop').remove();\n }\n $('.append-action').after(response.data);\n $('#staticBackdrop').addClass('show');\n })[\"catch\"]();\n}\n\n/* Action Snap */\nfunction SnapshotAction() {\n var product = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n var userid = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n var action = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';\n var snap = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0;\n $('body').find('#staticBackdrop').remove();\n Swal.fire({\n html: sweet_loader + \"Đang xử lý dữ liệu ...\",\n showConfirmButton: false\n });\n $.post(APIServiceSnapShot, {\n product: product,\n userid: userid,\n action: action,\n snap: snap\n }).done(function (response) {\n if (response.status === false) {\n Swal.fire({\n title: \"Có lỗi xảy ra?\",\n text: data.message,\n icon: \"warning\",\n showCancelButton: true,\n confirmButtonColor: \"var(--color-brand)\",\n cancelButtonColor: \"#818181\",\n confirmButtonText: \"Ok\"\n });\n } else {\n window.Echo.channel('Notification').listen('.Notification-Event', function (response) {\n Swal.close();\n if (response.status) {\n Swal.fire({\n title: \"Thành công\",\n text: response.message,\n icon: \"success\",\n showCancelButton: false,\n confirmButtonColor: \"var(--color-brand)\",\n confirmButtonText: \"Xác nhận\"\n });\n } else {\n Swal.fire({\n title: \"Có lỗi xảy ra?\",\n text: response.message,\n icon: \"warning\",\n showCancelButton: true,\n confirmButtonColor: \"var(--color-brand)\",\n cancelButtonColor: \"#818181\",\n confirmButtonText: \"Ok\"\n });\n }\n });\n }\n })[\"catch\"](function (response) {});\n}\n\n/* Append Upgrade System */\nfunction appendUpgradeForm() {\n var product = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n Swal.fire({\n html: sweet_loader + \"Đang xử lý dữ liệu ...\",\n showConfirmButton: false\n });\n $.get(APIGetProductAddon, {\n product: product\n }).done(function (response) {\n Swal.close();\n var body = $('body');\n body.find('#upgrade').length ? body.find('#upgrade').remove() : \"\";\n $('.append-action').after(response.data);\n $('#upgrade').addClass('show');\n })[\"catch\"](function (response) {\n console.log(response);\n });\n}\n\n/* Addon Change Form Upgrade */\n\nfunction appendAddon(parent) {\n var item = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n var price = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;\n var step = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0;\n var type = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : '-';\n var quantity = Number(parent.find('.input-qty').val());\n var OldPrice = price * quantity;\n if (type === '-') {\n quantity -= step;\n } else {\n quantity += step;\n }\n parent.find('.input-qty').val(quantity <= 0 ? 0 : quantity);\n var html = \"\\n \\n \\n \").concat(item.toLocaleUpperCase(), \"\\n \\n \\n \\n \").concat((quantity * price).toLocaleString(), \"\\u0111\\n \\n \\n \");\n var body = $('body');\n body.find(\"#upgrade .col-md-5 .box-add__on #\".concat(item)).remove();\n if (quantity <= 0) {\n actionChangePriceUpgrade(price, quantity, step, type, OldPrice);\n return false;\n }\n actionChangePriceUpgrade(price, quantity, step, type, OldPrice);\n body.find('#upgrade .col-md-5 .box-add__on hr').before(html);\n}\nfunction actionChangePriceUpgrade() {\n var price = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n var quantity = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n var step = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;\n var type = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : '';\n var oldPrice = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 0;\n if (quantity < 0) {\n return false;\n }\n var body = $('body');\n var TotalNoVal = body.find('#upgrade .cart_total_novat');\n var VAT = body.find('#upgrade .cart_vat');\n var Total = body.find('#upgrade .cart_total_amount');\n var Billing = Number(body.find('#upgrade input[name=\"billing\"]').val());\n\n /* ============================================== */\n var TotalNoValPrice = Number(TotalNoVal.attr('data-price'));\n var VATPrice = Number(VAT.attr('data-price'));\n var TotalPrice = Number(Total.attr('data-price'));\n /* ============================================== */\n\n if (type === '-') {\n TotalNoValPrice = TotalNoValPrice - oldPrice * Billing + price * quantity * Billing;\n if (TotalNoValPrice <= 0) {\n TotalNoValPrice = 0;\n }\n VATPrice = TotalNoValPrice * 0.1;\n TotalPrice = TotalNoValPrice + VATPrice;\n } else {\n TotalNoValPrice = TotalNoValPrice - oldPrice * Billing + price * quantity * Billing;\n VATPrice = TotalNoValPrice * 0.1;\n TotalPrice = TotalNoValPrice + VATPrice;\n }\n TotalNoVal.attr('data-price', TotalNoValPrice);\n TotalNoVal.text(TotalNoValPrice.toLocaleString());\n VAT.attr('data-price', VATPrice);\n VAT.text(VATPrice.toLocaleString());\n Total.attr('data-price', TotalPrice);\n Total.text(TotalPrice.toLocaleString());\n}\nfunction OrderAddon() {\n var product = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n var billing = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n var body = $('body');\n var allItem = body.find('#upgrade .input-qty');\n var error = [];\n var addon = {};\n if (allItem.length) {\n allItem.each(function (index, object) {\n if (Number(object.value) === 0) {\n error.push(object.name);\n }\n addon[\"\".concat(object.name)] = {\n price: object.getAttribute('data-price'),\n quantity: object.value\n };\n });\n }\n if (error.length === 3) {\n error.forEach(function (element) {\n body.find(\"#upgrade .input-qty[name=\\\"\".concat(element, \"\\\"]\")).addClass('error');\n });\n return false;\n }\n Swal.fire({\n title: \"Chú ý?\",\n text: \"Trong quá trình nâng cấp, Chúng tôi sẽ tắt máy chủ của bạn!\",\n icon: \"warning\",\n showCancelButton: true,\n confirmButtonColor: \"#3085d6\",\n cancelButtonColor: \"#d33\",\n confirmButtonText: \"Xác nhận\"\n }).then(function (result) {\n if (result.isConfirmed) {\n $.ajax({\n url: APICartAddon,\n data: {\n addon: addon,\n product: product,\n billing: billing\n },\n type: 'post',\n beforeSend: function beforeSend() {\n Swal.fire({\n html: sweet_loader + \"Đang xử lý dữ liệu ...\",\n showConfirmButton: false\n });\n },\n success: function success(response) {\n Swal.close();\n if (response.error === false) {\n Swal.fire({\n title: \"Đặt hàng thành công\",\n text: response.message,\n icon: \"success\",\n showCancelButton: true,\n confirmButtonColor: \"#3085d6\",\n cancelButtonColor: \"#d33\",\n confirmButtonText: \"Xác nhận\"\n }).then(function (result) {\n $('body').find('#upgrade').remove();\n });\n } else {\n Swal.fire({\n icon: \"error\",\n title: \"Oops...\",\n text: response.message\n });\n }\n }\n });\n }\n });\n}\nfunction RenewService() {\n var product = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n var billing = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n var type = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;\n Swal.fire({\n title: \"Chú ý?\",\n text: \"Bạn đang yêu cầu gia hạn dịch vụ!\",\n icon: \"warning\",\n showCancelButton: true,\n confirmButtonColor: \"#3085d6\",\n cancelButtonColor: \"#d33\",\n confirmButtonText: \"Xác nhận\"\n }).then(function (result) {\n if (result.isConfirmed) {\n $.ajax({\n url: APIRenewService,\n data: {\n type: type,\n product: product,\n billing: billing\n },\n type: 'post',\n beforeSend: function beforeSend() {\n Swal.fire({\n html: sweet_loader + \"Đang xử lý dữ liệu ...\",\n showConfirmButton: false\n });\n },\n success: function success(response) {\n Swal.close();\n if (response.error === false) {\n Swal.fire({\n title: \"Success\",\n text: response.message,\n icon: \"success\",\n showCancelButton: true,\n confirmButtonColor: \"#3085d6\",\n cancelButtonColor: \"#d33\",\n confirmButtonText: \"Xác nhận\"\n }).then(function (result) {\n $('#renew').modal('hide');\n });\n } else {\n Swal.fire({\n icon: \"error\",\n title: \"Oops...\",\n text: response.message\n });\n }\n }\n });\n }\n });\n}\nfunction CopyDiscount() {\n var value = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n var tempTextarea = $('');\n $('body').append(tempTextarea);\n tempTextarea.val(value).select();\n document.execCommand('copy');\n tempTextarea.remove();\n Swal.fire({\n title: \"Copy Successfully\",\n text: \"Copy mã giảm giá thành công!\",\n icon: \"success\",\n confirmButtonColor: \"#3085d6\",\n confirmButtonText: \"Xác nhận\"\n });\n}\ntoastr.options = {\n \"closeButton\": false,\n \"debug\": false,\n \"newestOnTop\": false,\n \"progressBar\": false,\n \"positionClass\": \"toast-top-right\",\n \"preventDuplicates\": false,\n \"onclick\": null,\n \"showDuration\": \"300\",\n \"hideDuration\": \"1000\",\n \"timeOut\": \"5000\",\n \"extendedTimeOut\": \"1000\",\n \"showEasing\": \"swing\",\n \"hideEasing\": \"linear\",\n \"showMethod\": \"fadeIn\",\n \"hideMethod\": \"fadeOut\"\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvY29yZS5qcyIsIm5hbWVzIjpbInN3ZWV0X2xvYWRlciIsIlBheW1lbnRJbnZvaWNlIiwiaW52b2ljZSIsImFyZ3VtZW50cyIsImxlbmd0aCIsInVuZGVmaW5lZCIsIiQiLCJhamF4IiwidXJsIiwiQXBpVXNlclBheW1lbnRJbnZvaWNlIiwiZGF0YSIsInR5cGUiLCJiZWZvcmVTZW5kIiwiU3dhbCIsImZpcmUiLCJodG1sIiwic2hvd0NvbmZpcm1CdXR0b24iLCJzdWNjZXNzIiwicmVzcG9uc2UiLCJlcnJvciIsInRpdGxlIiwidGV4dCIsImljb24iLCJjb25maXJtQnV0dG9uQ29sb3IiLCJjb25maXJtQnV0dG9uVGV4dCIsInRoZW4iLCJyZXN1bHQiLCJpc0NvbmZpcm1lZCIsImxvY2F0aW9uIiwicmVsb2FkIiwibWVzc2FnZSIsInNob3dDYW5jZWxCdXR0b24iLCJWaXJ0dWFsTWFjaGluZUFjdGlvbiIsImFjdGlvbiIsImlkIiwidXNlcmlkIiwiQVBJU2VydmljZUFjdGlvbiIsInByb2R1Y3QiLCJzdGF0dXMiLCJjYW5jZWxCdXR0b25Db2xvciIsImVtcHR5IiwiYXBwZW5kIiwicmVzdWx0cyIsImxvYWRGb3JtIiwiZSIsImZvcm0iLCJwYXJlbnQiLCJJbnB1dHMiLCJkb2N1bWVudCIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJmb3JFYWNoIiwiZWxlbWVudCIsImtleSIsImdldEF0dHJpYnV0ZSIsImNvbmNhdCIsInZhbHVlIiwic3VibWl0IiwiYXBwZW5kQ2hhbmdlQ2FydCIsInRhcmdldCIsIkVsZW1lbnRTdWJUb3RhbCIsIkVsZW1lbnRWYXQiLCJFbGVtZW50VG90YWwiLCJQcmljZVRhcmdldCIsIlByaWNlU3ViVG90YWwiLCJOdW1iZXIiLCJhdHRyIiwiQ2FydFRhcmdldCIsIk9sZFByaWNlIiwiZmluZCIsIk9sZEFkZE9uVG90YWwiLCJBbGxFbGVtZW50QWRkb24iLCJFbGVtZW50TW9udGgiLCJQcmljZSIsIk1vbnRoIiwidmFsIiwiVG90YWxBZGRvbiIsIlN1bVRvdGFsQWRkb24iLCJTdWJUb3RhbFByaWNlIiwiVkFUIiwiVG90YWwiLCJ0b0xvY2FsZVN0cmluZyIsImFwcGVuZEFkZG9uQ2FydCIsInByaWNlIiwicXVhbnRpdHkiLCJzdGVwIiwicGFyZW50X3RhcmdldCIsInBhcmVudFRhcmdldCIsInNlcnZpY2VfZWxlbWVudCIsInJlbW92ZSIsImFkZENsYXNzIiwicmVtb3ZlQ2xhc3MiLCJ0b0xvY2FsZVVwcGVyQ2FzZSIsInRvdGFsIiwiYWxsUHJvZHVjdCIsInZhcmlhYmxlIiwiYm94SGFzRWxlbWVudEFkZG9uIiwiZWFjaCIsImluZGV4IiwiQWRkb25QcmljZSIsImFwcGVuZE9zR3JvdXAiLCJnZXQiLCJBUElHZXRPc0dyb3VwIiwiaG9zdCIsIm5hbWUiLCJhcHBlbmRDaGlsZCIsImFwaVVybCIsImZhaWwiLCJ0b2FzdHIiLCJzdGF0dXNUZXh0IiwiYXBwZW5kU25hcHNob3QiLCJBUElHZXRTbmFwc2hvdCIsInVzZXIiLCJkb25lIiwiY2xvc2UiLCJhZnRlciIsIlNuYXBzaG90QWN0aW9uIiwic25hcCIsInBvc3QiLCJBUElTZXJ2aWNlU25hcFNob3QiLCJ3aW5kb3ciLCJFY2hvIiwiY2hhbm5lbCIsImxpc3RlbiIsImFwcGVuZFVwZ3JhZGVGb3JtIiwiQVBJR2V0UHJvZHVjdEFkZG9uIiwiYm9keSIsImNvbnNvbGUiLCJsb2ciLCJhcHBlbmRBZGRvbiIsIml0ZW0iLCJhY3Rpb25DaGFuZ2VQcmljZVVwZ3JhZGUiLCJiZWZvcmUiLCJvbGRQcmljZSIsIlRvdGFsTm9WYWwiLCJCaWxsaW5nIiwiVG90YWxOb1ZhbFByaWNlIiwiVkFUUHJpY2UiLCJUb3RhbFByaWNlIiwiT3JkZXJBZGRvbiIsImJpbGxpbmciLCJhbGxJdGVtIiwiYWRkb24iLCJvYmplY3QiLCJwdXNoIiwiQVBJQ2FydEFkZG9uIiwiUmVuZXdTZXJ2aWNlIiwiQVBJUmVuZXdTZXJ2aWNlIiwibW9kYWwiLCJDb3B5RGlzY291bnQiLCJ0ZW1wVGV4dGFyZWEiLCJzZWxlY3QiLCJleGVjQ29tbWFuZCIsIm9wdGlvbnMiXSwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3Jlc291cmNlcy9qcy9jb3JlLmpzPzhlZWYiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIHN3ZWV0X2xvYWRlciA9ICc8ZGl2IGNsYXNzPVwic3dlZXRfbG9hZGVyXCI+PHN2ZyB2aWV3Qm94PVwiMCAwIDE0MCAxNDBcIiB3aWR0aD1cIjE0MFwiIGhlaWdodD1cIjE0MFwiPjxnIGNsYXNzPVwib3V0bGluZVwiPjxwYXRoIGQ9XCJtIDcwIDI4IGEgMSAxIDAgMCAwIDAgODQgYSAxIDEgMCAwIDAgMCAtODRcIiBzdHJva2U9XCJyZ2JhKDAsMCwwLDAuMSlcIiBzdHJva2Utd2lkdGg9XCI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj48L3BhdGg+PC9nPjxnIGNsYXNzPVwiY2lyY2xlXCI+PHBhdGggZD1cIm0gNzAgMjggYSAxIDEgMCAwIDAgMCA4NCBhIDEgMSAwIDAgMCAwIC04NFwiIHN0cm9rZT1cIiM3MUJCRkZcIiBzdHJva2Utd2lkdGg9XCI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBzdHJva2UtZGFzaG9mZnNldD1cIjIwMFwiIHN0cm9rZS1kYXNoYXJyYXk9XCIzMDBcIj48L3BhdGg+PC9nPjwvc3ZnPjwvZGl2Pic7XG5cbmZ1bmN0aW9uIFBheW1lbnRJbnZvaWNlKGludm9pY2UgPSAwKSB7XG4gICAgJC5hamF4KHtcbiAgICAgICAgdXJsOiBBcGlVc2VyUGF5bWVudEludm9pY2UsXG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgIGludm9pY2U6IGludm9pY2VcbiAgICAgICAgfSxcbiAgICAgICAgdHlwZTogXCJwb3N0XCIsXG4gICAgICAgIGJlZm9yZVNlbmQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIFN3YWwuZmlyZSh7XG4gICAgICAgICAgICAgICAgaHRtbDogc3dlZXRfbG9hZGVyICsgXCI8aDQ+xJBhbmcgeOG7rSBsw70gZOG7ryBsaeG7h3UgLi4uPC9oND5cIixcbiAgICAgICAgICAgICAgICBzaG93Q29uZmlybUJ1dHRvbjogZmFsc2UsXG4gICAgICAgICAgICB9KVxuICAgICAgICB9LFxuICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5lcnJvciA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICBTd2FsLmZpcmUoe1xuICAgICAgICAgICAgICAgICAgICB0aXRsZTogXCJQYXltZW50IFN1Y2Nlc3NmdWxseVwiLFxuICAgICAgICAgICAgICAgICAgICB0ZXh0OiBcIlRoYW5oIHRvw6FuIGhvw6EgxJHGoW4gdGjDoG5oIGPDtG5nIVwiLFxuICAgICAgICAgICAgICAgICAgICBpY29uOiBcInN1Y2Nlc3NcIixcbiAgICAgICAgICAgICAgICAgICAgY29uZmlybUJ1dHRvbkNvbG9yOiBcIiMzMDg1ZDZcIixcbiAgICAgICAgICAgICAgICAgICAgY29uZmlybUJ1dHRvblRleHQ6IFwiWMOhYyBuaOG6rW5cIlxuICAgICAgICAgICAgICAgIH0pLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmlzQ29uZmlybWVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbi5yZWxvYWQoKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgU3dhbC5maXJlKHtcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IFwiQ8OzIGzhu5dpIHjhuqN5IHJhP1wiLFxuICAgICAgICAgICAgICAgICAgICB0ZXh0OiByZXNwb25zZS5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICBpY29uOiBcIndhcm5pbmdcIixcbiAgICAgICAgICAgICAgICAgICAgc2hvd0NhbmNlbEJ1dHRvbjogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIGNvbmZpcm1CdXR0b25Db2xvcjogXCJ2YXIoLS1jb2xvci1icmFuZClcIixcbiAgICAgICAgICAgICAgICAgICAgY29uZmlybUJ1dHRvblRleHQ6IFwiWMOhYyBuaOG6rW5cIlxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KVxufVxuXG4vKiBBY3Rpb24gZm9yIFZpcnR1YWxNYWNoaW5lICovXG5mdW5jdGlvbiBWaXJ0dWFsTWFjaGluZUFjdGlvbihhY3Rpb24gPSAnJywgaWQgPSAnJywgdXNlcmlkID0gMCkge1xuICAgICQuYWpheCh7XG4gICAgICAgIHVybDogQVBJU2VydmljZUFjdGlvbixcbiAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgYWN0aW9uOiBhY3Rpb24sXG4gICAgICAgICAgICBwcm9kdWN0OiBpZCxcbiAgICAgICAgICAgIHVzZXJpZDogdXNlcmlkXG4gICAgICAgIH0sXG4gICAgICAgIHR5cGU6IFwicG9zdFwiLFxuICAgICAgICBiZWZvcmVTZW5kOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBTd2FsLmZpcmUoe1xuICAgICAgICAgICAgICAgIGh0bWw6IHN3ZWV0X2xvYWRlciArIFwiPGg0PsSQYW5nIHjhu60gbMO9IGThu68gbGnhu4d1IC4uLjwvaDQ+XCIsXG4gICAgICAgICAgICAgICAgc2hvd0NvbmZpcm1CdXR0b246IGZhbHNlLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgfSxcbiAgICAgICAgc3VjY2VzczogZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIFN3YWwuZmlyZSh7XG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBcIkPDsyBs4buXaSB44bqjeSByYT9cIixcbiAgICAgICAgICAgICAgICAgICAgdGV4dDogZGF0YS5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICBpY29uOiBcIndhcm5pbmdcIixcbiAgICAgICAgICAgICAgICAgICAgc2hvd0NhbmNlbEJ1dHRvbjogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgY29uZmlybUJ1dHRvbkNvbG9yOiBcInZhcigtLWNvbG9yLWJyYW5kKVwiLFxuICAgICAgICAgICAgICAgICAgICBjYW5jZWxCdXR0b25Db2xvcjogXCIjODE4MTgxXCIsXG4gICAgICAgICAgICAgICAgICAgIGNvbmZpcm1CdXR0b25UZXh0OiBcIk9rXCJcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAkKCcuc3lzdGVtLXN0YXR1cycpLmVtcHR5KCkuYXBwZW5kKCc8c3BhbiBjbGFzcz1cImJhZGdlIG1lLTIgZnMtNSB0ZXh0LXdhcm5pbmdcIj7EkGFuZyBsb2FkIHBhbmVsPC9zcGFuPjxkaXYgc3R5bGU9XCJ3aWR0aDogMzBweDsgaGVpZ2h0OiAzMHB4OyBtYXJnaW4tbGVmdDogMTBweFwiIGNsYXNzPVwic3Bpbm5lci1ib3JkZXIgdGV4dC13YXJuaW5nXCIgcm9sZT1cInN0YXR1c1wiPjxzcGFuIGNsYXNzPVwidmlzdWFsbHktaGlkZGVuXCI+TG9hZGluZy4uLjwvc3Bhbj48L2Rpdj4nKVxuICAgICAgICAgICAgICAgIFN3YWwuZmlyZSh7XG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBcIlRow6BuaCBjw7RuZ1wiLFxuICAgICAgICAgICAgICAgICAgICB0ZXh0OiByZXNwb25zZS5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICBpY29uOiBcInN1Y2Nlc3NcIixcbiAgICAgICAgICAgICAgICAgICAgc2hvd0NhbmNlbEJ1dHRvbjogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIGNvbmZpcm1CdXR0b25Db2xvcjogXCJ2YXIoLS1jb2xvci1icmFuZClcIixcbiAgICAgICAgICAgICAgICAgICAgY29uZmlybUJ1dHRvblRleHQ6IFwiWMOhYyBuaOG6rW5cIlxuICAgICAgICAgICAgICAgIH0pLnRoZW4oKHJlc3VsdHMpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdHMuaXNDb25maXJtZWQpXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICQoJy5hcHBlbmQtYWN0aW9uJykuZW1wdHkoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KVxufVxuXG4vKiBBcHBlbmQgYWxsIGlucHV0IGZyb20gRm9ybSBPcmRlciB0byBmb3JtIENvdXBvbiAqL1xuZnVuY3Rpb24gbG9hZEZvcm0oZSkge1xuICAgIGxldCBmb3JtID0gJChlKS5wYXJlbnQoKS5wYXJlbnQoKS5wYXJlbnQoKVxuXG4gICAgbGV0IElucHV0cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tuYW1lXj1cInZwc1tcIl0sW25hbWVePVwiaG9zdGluZ1tcIl0nKTtcblxuICAgIElucHV0cy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgIGxldCBrZXkgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnbmFtZScpO1xuICAgICAgICBmb3JtLmFwcGVuZChgPGlucHV0IHR5cGU9XCJoaWRkZW5cIiBuYW1lPVwiJHtrZXl9XCIgdmFsdWU9XCIke2VsZW1lbnQudmFsdWV9XCI+YCk7XG5cbiAgICB9KVxuICAgIGZvcm0uc3VibWl0KClcbn1cblxuLyogQ2hhbmdlIENhcnQgd2hlbiBjaGFuZ2UgTW9udGggKi9cbmZ1bmN0aW9uIGFwcGVuZENoYW5nZUNhcnQodGFyZ2V0ID0gJycsIGtleSA9IDApIHtcblxuICAgIC8qIENyZWF0ZSBuZXcgdmFyaWFibGUgZWxlbWVudCAqL1xuICAgIGxldCBFbGVtZW50U3ViVG90YWwgPSAkKCcuY2FydF90b3RhbF9ub3ZhdCcpO1xuICAgIGxldCBFbGVtZW50VmF0ID0gJCgnLmNhcnRfdmF0Jyk7XG4gICAgbGV0IEVsZW1lbnRUb3RhbCA9ICQoJy5jYXJ0X3RvdGFsX2Ftb3VudCcpO1xuICAgIGxldCBQcmljZVRhcmdldCA9ICQoYFtkYXRhLWZvY3VzPVwiJHt0YXJnZXR9XyR7a2V5fVwiXWApXG5cblxuICAgIC8qIENyZWF0ZSBuZXcgdmFyaWFibGUgcHJpY2UgZm9yIGVsZW1lbnQgU3ViVG90YWwgKi9cbiAgICBsZXQgUHJpY2VTdWJUb3RhbCA9IE51bWJlcihFbGVtZW50U3ViVG90YWwuYXR0cignZGF0YS1wcmljZScpKTtcblxuICAgIC8qIENyZWF0ZSBPbGQgdmFyaWFibGUgZWxlbWVudCBQcm9kdWN0IGZvciB0YXJnZXQgKi9cbiAgICBsZXQgQ2FydFRhcmdldCA9ICQoYFtkYXRhLXByb2R1Y3Q9XCIke2tleX1cIl1bZGF0YS10YXJnZXQ9XCIke3RhcmdldH1cIl1gKVxuICAgIGxldCBPbGRQcmljZSA9IE51bWJlcihQcmljZVRhcmdldC5maW5kKGAuJHt0YXJnZXR9XyR7a2V5fV9wcmljZS1hbW91bnRgKS5hdHRyKCdkYXRhLXByaWNlJykpO1xuXG4gICAgLyogR2V0IGFsbCBPbGQgYWRkb24gdG90YWwgKi9cbiAgICBsZXQgT2xkQWRkT25Ub3RhbCA9IDBcbiAgICBsZXQgQWxsRWxlbWVudEFkZG9uID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLm5hbWUtcHJpY2UnKTtcbiAgICBpZiAoQWxsRWxlbWVudEFkZG9uLmxlbmd0aCkge1xuICAgICAgICBBbGxFbGVtZW50QWRkb24uZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgT2xkQWRkT25Ub3RhbCArPSBOdW1iZXIoJChlbGVtZW50KS5hdHRyKCdkYXRhLXByaWNlX19hZGRvbicpKTtcbiAgICAgICAgfSlcbiAgICB9XG5cblxuICAgIC8qIENvbmZpZyBuZXcgTW9udGggKi9cbiAgICBsZXQgRWxlbWVudE1vbnRoID0gQ2FydFRhcmdldC5maW5kKCcudGltZS1idXlfX2NoYW5nZScpO1xuICAgIGxldCBQcmljZSA9IE51bWJlcihFbGVtZW50TW9udGguYXR0cignZGF0YS1wcmljZScpKTtcbiAgICBsZXQgTW9udGggPSBOdW1iZXIoRWxlbWVudE1vbnRoLmZpbmQoJ29wdGlvbjpzZWxlY3RlZCcpLnZhbCgpKVxuXG4gICAgLyogU2V0IG5ldyBDb25maWcgTW9udGggKi9cbiAgICBQcmljZVRhcmdldC5maW5kKGAuJHt0YXJnZXR9XyR7a2V5fV9tb250aGApLnRleHQoTW9udGgpO1xuICAgIFByaWNlVGFyZ2V0LmZpbmQoYC4ke3RhcmdldH1fJHtrZXl9X21vbnRoYCkuYXR0cignZGF0YS1tb250aCcsIE1vbnRoKTtcblxuICAgIC8qIENyZWF0ZSBuZXcgdmFyaWFibGUgUHJpY2UgKi9cbiAgICBsZXQgVG90YWxBZGRvbiA9IFN1bVRvdGFsQWRkb24oKTtcbiAgICBsZXQgU3ViVG90YWxQcmljZSA9IChQcmljZVN1YlRvdGFsIC0gT2xkUHJpY2UgLSBPbGRBZGRPblRvdGFsKSArIChQcmljZSAqIE1vbnRoICsgVG90YWxBZGRvbik7XG4gICAgbGV0IFZBVCA9IFN1YlRvdGFsUHJpY2UgKiAwLjE7XG4gICAgbGV0IFRvdGFsID0gU3ViVG90YWxQcmljZSArIFZBVDtcblxuICAgIC8qIENvbmZpZyBuZXcgcHJpY2UgdG8gYWxsIGVsZW1lbnQgKi9cblxuICAgIFByaWNlVGFyZ2V0LmZpbmQoYC4ke3RhcmdldH1fJHtrZXl9X3ByaWNlLWFtb3VudGApLmF0dHIoJ2RhdGEtcHJpY2UnLCBQcmljZSAqIE1vbnRoKTtcbiAgICBQcmljZVRhcmdldC5maW5kKGAuJHt0YXJnZXR9XyR7a2V5fV9wcmljZS1hbW91bnRgKS50ZXh0KChQcmljZSAqIE1vbnRoKS50b0xvY2FsZVN0cmluZygpKTtcblxuXG4gICAgRWxlbWVudFN1YlRvdGFsLmF0dHIoJ2RhdGEtcHJpY2UnLCBTdWJUb3RhbFByaWNlKVxuICAgIEVsZW1lbnRTdWJUb3RhbC50ZXh0KFN1YlRvdGFsUHJpY2UudG9Mb2NhbGVTdHJpbmcoKSlcblxuICAgIEVsZW1lbnRWYXQuYXR0cignZGF0YS1wcmljZScsIFZBVClcbiAgICBFbGVtZW50VmF0LnRleHQoVkFULnRvTG9jYWxlU3RyaW5nKCkpXG5cbiAgICBFbGVtZW50VG90YWwuYXR0cignZGF0YS1wcmljZScsIFRvdGFsKVxuICAgIEVsZW1lbnRUb3RhbC50ZXh0KFRvdGFsLnRvTG9jYWxlU3RyaW5nKCkpXG59XG5cbi8qIENoYW5nZSBDYXJ0IHdoZW4gY2hhbmdlIEFkZG9uICovXG5mdW5jdGlvbiBhcHBlbmRBZGRvbkNhcnQodGFyZ2V0ID0gJycsIHByaWNlID0gMCwgcXVhbnRpdHkgPSAwLCBzdGVwID0gMCwgdHlwZSA9IFwiLVwiLCBwYXJlbnQgPSAwLCBwYXJlbnRfdGFyZ2V0ID0gJycpIHtcbiAgICBsZXQgcGFyZW50VGFyZ2V0ID0gJChgW2RhdGEtZm9jdXM9XCIke3BhcmVudF90YXJnZXR9XyR7cGFyZW50fVwiXWApLmZpbmQoJy5ib3gtYWRkX19vbicpXG5cbiAgICBpZiAocXVhbnRpdHkgPT09IDApIHtcblxuICAgICAgICBsZXQgc2VydmljZV9lbGVtZW50ID0gJChgZGl2W2RhdGEtdGFyZ2V0PVwiJHtwYXJlbnRfdGFyZ2V0fVwiXVtkYXRhLXByb2R1Y3Q9XCIke3BhcmVudH1cIl1gKTtcblxuICAgICAgICBpZiAocGFyZW50VGFyZ2V0LmZpbmQoYC4ke3BhcmVudF90YXJnZXR9XyR7cGFyZW50fV9hZGRfJHt0YXJnZXR9YCkpIHtcbiAgICAgICAgICAgIHBhcmVudFRhcmdldC5maW5kKGAuJHtwYXJlbnRfdGFyZ2V0fV8ke3BhcmVudH1fYWRkXyR7dGFyZ2V0fWApLnJlbW92ZSgpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoTnVtYmVyKHNlcnZpY2VfZWxlbWVudC5maW5kKCcuaW5wdXQtcXR5W2RhdGEtbmFtZT1cImNwdVwiXScpLnZhbCgpKSA9PT0gMCAmJiBOdW1iZXIoc2VydmljZV9lbGVtZW50LmZpbmQoJy5pbnB1dC1xdHlbZGF0YS1uYW1lPVwic3NkXCJdJykudmFsKCkpID09PSAwICYmIE51bWJlcihzZXJ2aWNlX2VsZW1lbnQuZmluZCgnLmlucHV0LXF0eVtkYXRhLW5hbWU9XCJyYW1cIl0nKS52YWwoKSkgPT09IDApIHtcbiAgICAgICAgICAgIHBhcmVudFRhcmdldC5hZGRDbGFzcygnZC1ub25lJylcbiAgICAgICAgfVxuXG4gICAgICAgIGFwcGVuZENoYW5nZUNhcnQocGFyZW50X3RhcmdldCwgcGFyZW50KTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHBhcmVudFRhcmdldC5yZW1vdmVDbGFzcygnZC1ub25lJylcblxuICAgIGlmIChwYXJlbnRUYXJnZXQuZmluZChgLiR7cGFyZW50X3RhcmdldH1fJHtwYXJlbnR9X2FkZF8ke3RhcmdldH1gKSkge1xuICAgICAgICBwYXJlbnRUYXJnZXQuZmluZChgLiR7cGFyZW50X3RhcmdldH1fJHtwYXJlbnR9X2FkZF8ke3RhcmdldH1gKS5yZW1vdmUoKVxuICAgIH1cblxuICAgIGxldCBodG1sID0gYDxkaXYgY2xhc3M9XCJwcmljZSBhZGRvbi1wcmljZSAke3BhcmVudF90YXJnZXR9XyR7cGFyZW50fV9hZGRfJHt0YXJnZXR9XCI+YFxuICAgIGh0bWwgKz0gYDxkaXYgY2xhc3M9XCJhZGRvbi1wcmljZV9fbmFtZVwiPiR7dGFyZ2V0LnRvTG9jYWxlVXBwZXJDYXNlKCl9PC9kaXY+YDtcbiAgICBodG1sICs9IFwiPGRpdiBjbGFzcz0nZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuJz5cIjtcbiAgICBodG1sICs9IFwiPGRpdj5cIjtcbiAgICBodG1sICs9IFwiPHNwYW4gY2xhc3M9XFxcInByaWNlLWFtb3VudFxcXCI+XCJcbiAgICBodG1sICs9IGA8c3BhbiBkYXRhLXByaWNlPVwiJHsocHJpY2UgKiBxdWFudGl0eSl9XCIgY2xhc3M9XCIke3BhcmVudF90YXJnZXR9XyR7cGFyZW50fV9hZGRfJHt0YXJnZXR9X3ByaWNlLWFtb3VudFwiPmBcbiAgICBodG1sICs9IChwcmljZSAqIHF1YW50aXR5KS50b0xvY2FsZVN0cmluZygpO1xuICAgIGh0bWwgKz0gXCI8L3NwYW4+xJE8L3NwYW4+XCJcbiAgICBodG1sICs9IFwiPC9kaXY+XCJcbiAgICBodG1sICs9IFwiPGRpdj4gWCBcIjtcbiAgICBodG1sICs9IHF1YW50aXR5O1xuICAgIGh0bWwgKz0gXCI8L2Rpdj5cIjtcbiAgICBodG1sICs9IFwiPC9kaXY+XCI7XG4gICAgaHRtbCArPSBcIjwvZGl2PlwiO1xuXG4gICAgcGFyZW50VGFyZ2V0LmFwcGVuZChodG1sKVxuXG4gICAgYXBwZW5kQ2hhbmdlQ2FydChwYXJlbnRfdGFyZ2V0LCBwYXJlbnQpO1xuXG59XG5cbi8qIFN1bSB0b3RhbCBhZGRvbiAqL1xuZnVuY3Rpb24gU3VtVG90YWxBZGRvbigpIHtcbiAgICAvKiBHZXQgYWxsIEVsZW1lbnQgUHJvZHVjaHQgKi9cbiAgICBsZXQgdG90YWwgPSAwO1xuICAgIGxldCBhbGxQcm9kdWN0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLm5hbWUtcHJpY2UnKTtcbiAgICBpZiAoYWxsUHJvZHVjdC5sZW5ndGgpIHtcbiAgICAgICAgYWxsUHJvZHVjdC5mb3JFYWNoKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgICAgICBsZXQgcHJpY2UgPSAwO1xuICAgICAgICAgICAgbGV0IHZhcmlhYmxlID0gJChlbGVtZW50KTtcbiAgICAgICAgICAgIGxldCB0YXJnZXQgPSB2YXJpYWJsZS5hdHRyKCdkYXRhLWZvY3VzJylcbiAgICAgICAgICAgIGxldCBib3hIYXNFbGVtZW50QWRkb24gPSB2YXJpYWJsZS5maW5kKCcuYWRkb24tcHJpY2UgLnByaWNlLWFtb3VudCcpO1xuICAgICAgICAgICAgbGV0IE1vbnRoID0gTnVtYmVyKHZhcmlhYmxlLmZpbmQoYC4ke3RhcmdldH1fbW9udGhgKS5hdHRyKCdkYXRhLW1vbnRoJykpO1xuXG4gICAgICAgICAgICBpZiAoYm94SGFzRWxlbWVudEFkZG9uLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGJveEhhc0VsZW1lbnRBZGRvbi5lYWNoKGZ1bmN0aW9uIChpbmRleCwgZWxlbWVudCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgQWRkb25QcmljZSA9ICQoZWxlbWVudCkuZmluZCgnc3BhbicpLmF0dHIoJ2RhdGEtcHJpY2UnKVxuICAgICAgICAgICAgICAgICAgICBwcmljZSArPSBOdW1iZXIoQWRkb25QcmljZSkgKiBNb250aDtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXJpYWJsZS5hdHRyKCdkYXRhLXByaWNlX19hZGRvbicsIHByaWNlKTtcbiAgICAgICAgICAgIHRvdGFsICs9IHByaWNlO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIE51bWJlcih0b3RhbCk7XG5cbn1cblxuLyogQXBwZW5kIE9zIEdyb3VwIHRvIEVsZW1lbnQqL1xuZnVuY3Rpb24gYXBwZW5kT3NHcm91cCgpIHtcbiAgICAkKGAjb3NfZ3JvdXBfaWRgKS5lbXB0eSgpLmFwcGVuZCgnPG9wdGlvbiB2YWx1ZT1cIlwiPkxvYWRpbmcgLi4uPC9vcHRpb24+Jyk7XG4gICAgJC5nZXQoQVBJR2V0T3NHcm91cCwge2hvc3Q6ICQoJ2lucHV0W25hbWU9XCJob3N0X2lkXCJdJykudmFsKCl9LCBmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICAgICAgaWYgKHJlc3BvbnNlLmVycm9yID09PSBmYWxzZSkge1xuICAgICAgICAgICAgbGV0IGh0bWwgPSAnPG9wdGlvbiB2YWx1ZT1cIjBcIj4tLS0tLS0tLS08L29wdGlvbj4nO1xuICAgICAgICAgICAgcmVzcG9uc2UuZGF0YS5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgaHRtbCArPSBgPG9wdGlvbiB2YWx1ZT1cIiR7ZWxlbWVudC5pZH1cIj4ke2VsZW1lbnQubmFtZX08L29wdGlvbj5gO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICQoYCNvc19ncm91cF9pZGApLmVtcHR5KCkuYXBwZW5kKGh0bWwpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAkKGAjb3NfZ3JvdXBfaWRgKS5lbXB0eSgpLmFwcGVuZCgnPG9wdGlvbiB2YWx1ZT1cIjBcIj4tLS0tLS0tLS08L29wdGlvbj4nKTtcbiAgICAgICAgfVxuICAgIH0pXG59XG5cbi8qIEFwcGVuZCBFbGVtZW50ICovXG5mdW5jdGlvbiBhcHBlbmRDaGlsZChhcGlVcmwgPSAnJywgaWQgPSAnJywgZGF0YSA9IHt9KSB7XG4gICAgJChgIyR7aWR9YCkuZW1wdHkoKS5hcHBlbmQoJzxvcHRpb24gdmFsdWU9XCJcIj5Mb2FkaW5nIC4uLjwvb3B0aW9uPicpO1xuICAgICQuZ2V0KGFwaVVybCwgZGF0YSwgZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG4gICAgICAgIGlmIChyZXNwb25zZS5lcnJvciA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGxldCBodG1sID0gJzxvcHRpb24gdmFsdWU9XCIwXCI+LS0tLS0tLS0tPC9vcHRpb24+JztcbiAgICAgICAgICAgIHJlc3BvbnNlLmRhdGEuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGh0bWwgKz0gYDxvcHRpb24gdmFsdWU9XCIke2VsZW1lbnQuaWR9XCI+JHtlbGVtZW50Lm5hbWV9PC9vcHRpb24+YDtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAkKGAjJHtpZH1gKS5lbXB0eSgpLmFwcGVuZChodG1sKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgJChgIyR7aWR9YCkuZW1wdHkoKS5hcHBlbmQoJzxvcHRpb24gdmFsdWU9XCIwXCI+LS0tLS0tLS0tPC9vcHRpb24+Jyk7XG4gICAgICAgIH1cbiAgICB9KVxuICAgICAgICAuZmFpbChmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRvYXN0ci5lcnJvcihlcnJvci5zdGF0dXNUZXh0KVxuICAgICAgICB9KVxufVxuXG4vKiBBcHBlbmQgU25hcHNob3QgKi9cbmZ1bmN0aW9uIGFwcGVuZFNuYXBzaG90KHByb2R1Y3QgPSAwLCB1c2VyaWQgPSAwKSB7XG4gICAgU3dhbC5maXJlKHtcbiAgICAgICAgaHRtbDogc3dlZXRfbG9hZGVyICsgXCI8aDQ+xJBhbmcgeOG7rSBsw70gZOG7ryBsaeG7h3UgLi4uPC9oND5cIixcbiAgICAgICAgc2hvd0NvbmZpcm1CdXR0b246IGZhbHNlLFxuICAgIH0pXG4gICAgJC5nZXQoQVBJR2V0U25hcHNob3QsIHtwcm9kdWN0OiBwcm9kdWN0LCB1c2VyOiB1c2VyaWR9KVxuICAgICAgICAuZG9uZShmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICAgICAgICAgIFN3YWwuY2xvc2UoKTtcbiAgICAgICAgICAgIGlmICgkKCdib2R5JykuZmluZCgnI3N0YXRpY0JhY2tkcm9wJykubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgJCgnYm9keScpLmZpbmQoJyNzdGF0aWNCYWNrZHJvcCcpLnJlbW92ZSgpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAkKCcuYXBwZW5kLWFjdGlvbicpLmFmdGVyKHJlc3BvbnNlLmRhdGEpO1xuICAgICAgICAgICAgJCgnI3N0YXRpY0JhY2tkcm9wJykuYWRkQ2xhc3MoJ3Nob3cnKVxuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goKVxufVxuXG4vKiBBY3Rpb24gU25hcCAqL1xuZnVuY3Rpb24gU25hcHNob3RBY3Rpb24ocHJvZHVjdCA9IDAsIHVzZXJpZCA9IDAsIGFjdGlvbiA9ICcnLCBzbmFwID0gMCkge1xuICAgICQoJ2JvZHknKS5maW5kKCcjc3RhdGljQmFja2Ryb3AnKS5yZW1vdmUoKVxuICAgIFN3YWwuZmlyZSh7XG4gICAgICAgIGh0bWw6IHN3ZWV0X2xvYWRlciArIFwiPGg0PsSQYW5nIHjhu60gbMO9IGThu68gbGnhu4d1IC4uLjwvaDQ+XCIsXG4gICAgICAgIHNob3dDb25maXJtQnV0dG9uOiBmYWxzZSxcbiAgICB9KVxuICAgICQucG9zdChBUElTZXJ2aWNlU25hcFNob3QsIHtwcm9kdWN0OiBwcm9kdWN0LCB1c2VyaWQ6IHVzZXJpZCwgYWN0aW9uOiBhY3Rpb24sIHNuYXA6IHNuYXB9KVxuICAgICAgICAuZG9uZShmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgU3dhbC5maXJlKHtcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IFwiQ8OzIGzhu5dpIHjhuqN5IHJhP1wiLFxuICAgICAgICAgICAgICAgICAgICB0ZXh0OiBkYXRhLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIGljb246IFwid2FybmluZ1wiLFxuICAgICAgICAgICAgICAgICAgICBzaG93Q2FuY2VsQnV0dG9uOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBjb25maXJtQnV0dG9uQ29sb3I6IFwidmFyKC0tY29sb3ItYnJhbmQpXCIsXG4gICAgICAgICAgICAgICAgICAgIGNhbmNlbEJ1dHRvbkNvbG9yOiBcIiM4MTgxODFcIixcbiAgICAgICAgICAgICAgICAgICAgY29uZmlybUJ1dHRvblRleHQ6IFwiT2tcIlxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHdpbmRvdy5FY2hvLmNoYW5uZWwoJ05vdGlmaWNhdGlvbicpXG4gICAgICAgICAgICAgICAgICAgIC5saXN0ZW4oJy5Ob3RpZmljYXRpb24tRXZlbnQnLCAocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFN3YWwuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTd2FsLmZpcmUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogXCJUaMOgbmggY8O0bmdcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogcmVzcG9uc2UubWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbjogXCJzdWNjZXNzXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dDYW5jZWxCdXR0b246IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maXJtQnV0dG9uQ29sb3I6IFwidmFyKC0tY29sb3ItYnJhbmQpXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpcm1CdXR0b25UZXh0OiBcIljDoWMgbmjhuq1uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTd2FsLmZpcmUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogXCJDw7MgbOG7l2kgeOG6o3kgcmE/XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6IHJlc3BvbnNlLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb246IFwid2FybmluZ1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93Q2FuY2VsQnV0dG9uOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maXJtQnV0dG9uQ29sb3I6IFwidmFyKC0tY29sb3ItYnJhbmQpXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbmNlbEJ1dHRvbkNvbG9yOiBcIiM4MTgxODFcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlybUJ1dHRvblRleHQ6IFwiT2tcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG5cbiAgICAgICAgfSlcbn1cblxuLyogQXBwZW5kIFVwZ3JhZGUgU3lzdGVtICovXG5mdW5jdGlvbiBhcHBlbmRVcGdyYWRlRm9ybShwcm9kdWN0ID0gMCkge1xuICAgIFN3YWwuZmlyZSh7XG4gICAgICAgIGh0bWw6IHN3ZWV0X2xvYWRlciArIFwiPGg0PsSQYW5nIHjhu60gbMO9IGThu68gbGnhu4d1IC4uLjwvaDQ+XCIsXG4gICAgICAgIHNob3dDb25maXJtQnV0dG9uOiBmYWxzZSxcbiAgICB9KVxuICAgICQuZ2V0KEFQSUdldFByb2R1Y3RBZGRvbiwge3Byb2R1Y3Q6IHByb2R1Y3R9KVxuICAgICAgICAuZG9uZShmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICAgICAgICAgIFN3YWwuY2xvc2UoKTtcbiAgICAgICAgICAgIGxldCBib2R5ID0gJCgnYm9keScpXG5cbiAgICAgICAgICAgIGJvZHkuZmluZCgnI3VwZ3JhZGUnKS5sZW5ndGggPyBib2R5LmZpbmQoJyN1cGdyYWRlJykucmVtb3ZlKCkgOiBcIlwiO1xuXG4gICAgICAgICAgICAkKCcuYXBwZW5kLWFjdGlvbicpLmFmdGVyKHJlc3BvbnNlLmRhdGEpO1xuICAgICAgICAgICAgJCgnI3VwZ3JhZGUnKS5hZGRDbGFzcygnc2hvdycpXG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaChmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKHJlc3BvbnNlKVxuICAgICAgICB9KVxufVxuXG4vKiBBZGRvbiBDaGFuZ2UgRm9ybSBVcGdyYWRlICovXG5cbmZ1bmN0aW9uIGFwcGVuZEFkZG9uKHBhcmVudCwgaXRlbSA9ICcnLCBwcmljZSA9IDAsIHN0ZXAgPSAwLCB0eXBlID0gJy0nKSB7XG4gICAgbGV0IHF1YW50aXR5ID0gTnVtYmVyKHBhcmVudC5maW5kKCcuaW5wdXQtcXR5JykudmFsKCkpO1xuICAgIGxldCBPbGRQcmljZSA9IHByaWNlICogcXVhbnRpdHlcbiAgICBpZiAodHlwZSA9PT0gJy0nKSB7XG4gICAgICAgIHF1YW50aXR5IC09IHN0ZXA7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcXVhbnRpdHkgKz0gc3RlcDtcbiAgICB9XG5cbiAgICBwYXJlbnQuZmluZCgnLmlucHV0LXF0eScpLnZhbChxdWFudGl0eSA8PSAwID8gMCA6IHF1YW50aXR5KVxuXG4gICAgbGV0IGh0bWwgPSBgXG4gICAgPGRpdiBpZD1cIiR7aXRlbX1cIiBjbGFzcz1cIml0ZW0tYm90dG9tIGl0ZW0tcHJpY2UtYWxsIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZm9udC13ZWlnaHQtYm9sZCBjYXJ0X3dpZGdldF9zdWJ0aXRsZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7aXRlbS50b0xvY2FsZVVwcGVyQ2FzZSgpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwcmljZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGRhdGEtcHJpY2U9XCIke3F1YW50aXR5ICogcHJpY2V9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInByaWNlLWFtb3VudCBwcmljZS1vbmUgZm9udC13ZWlnaHQtYm9sZCBjb2xvci1tYWluXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHsocXVhbnRpdHkgKiBwcmljZSkudG9Mb2NhbGVTdHJpbmcoKX3EkVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+YDtcbiAgICBsZXQgYm9keSA9ICQoJ2JvZHknKTtcbiAgICBib2R5LmZpbmQoYCN1cGdyYWRlIC5jb2wtbWQtNSAuYm94LWFkZF9fb24gIyR7aXRlbX1gKS5yZW1vdmUoKVxuICAgIGlmIChxdWFudGl0eSA8PSAwKSB7XG4gICAgICAgIGFjdGlvbkNoYW5nZVByaWNlVXBncmFkZShwcmljZSwgcXVhbnRpdHksIHN0ZXAsIHR5cGUsIE9sZFByaWNlKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGFjdGlvbkNoYW5nZVByaWNlVXBncmFkZShwcmljZSwgcXVhbnRpdHksIHN0ZXAsIHR5cGUsIE9sZFByaWNlKVxuICAgIGJvZHkuZmluZCgnI3VwZ3JhZGUgLmNvbC1tZC01IC5ib3gtYWRkX19vbiBocicpLmJlZm9yZShodG1sKVxufVxuXG5mdW5jdGlvbiBhY3Rpb25DaGFuZ2VQcmljZVVwZ3JhZGUocHJpY2UgPSAwLCBxdWFudGl0eSA9IDAsIHN0ZXAgPSAwLCB0eXBlID0gJycsIG9sZFByaWNlID0gMCkge1xuICAgIGlmIChxdWFudGl0eSA8IDApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBsZXQgYm9keSA9ICQoJ2JvZHknKTtcbiAgICBsZXQgVG90YWxOb1ZhbCA9IGJvZHkuZmluZCgnI3VwZ3JhZGUgLmNhcnRfdG90YWxfbm92YXQnKVxuICAgIGxldCBWQVQgPSBib2R5LmZpbmQoJyN1cGdyYWRlIC5jYXJ0X3ZhdCcpXG4gICAgbGV0IFRvdGFsID0gYm9keS5maW5kKCcjdXBncmFkZSAuY2FydF90b3RhbF9hbW91bnQnKVxuICAgIGxldCBCaWxsaW5nID0gTnVtYmVyKGJvZHkuZmluZCgnI3VwZ3JhZGUgaW5wdXRbbmFtZT1cImJpbGxpbmdcIl0nKS52YWwoKSlcblxuICAgIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cbiAgICBsZXQgVG90YWxOb1ZhbFByaWNlID0gTnVtYmVyKFRvdGFsTm9WYWwuYXR0cignZGF0YS1wcmljZScpKTtcbiAgICBsZXQgVkFUUHJpY2UgPSBOdW1iZXIoVkFULmF0dHIoJ2RhdGEtcHJpY2UnKSk7XG4gICAgbGV0IFRvdGFsUHJpY2UgPSBOdW1iZXIoVG90YWwuYXR0cignZGF0YS1wcmljZScpKTtcbiAgICAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG5cbiAgICBpZiAodHlwZSA9PT0gJy0nKSB7XG5cbiAgICAgICAgVG90YWxOb1ZhbFByaWNlID0gKFRvdGFsTm9WYWxQcmljZSAtIG9sZFByaWNlICogQmlsbGluZykgKyAocHJpY2UgKiBxdWFudGl0eSAqIEJpbGxpbmcpO1xuXG4gICAgICAgIGlmIChUb3RhbE5vVmFsUHJpY2UgPD0gMCkge1xuICAgICAgICAgICAgVG90YWxOb1ZhbFByaWNlID0gMDtcbiAgICAgICAgfVxuICAgICAgICBWQVRQcmljZSA9IFRvdGFsTm9WYWxQcmljZSAqIDAuMTtcbiAgICAgICAgVG90YWxQcmljZSA9IFRvdGFsTm9WYWxQcmljZSArIFZBVFByaWNlO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIFRvdGFsTm9WYWxQcmljZSA9IChUb3RhbE5vVmFsUHJpY2UgLSBvbGRQcmljZSAqIEJpbGxpbmcpICsgKHByaWNlICogcXVhbnRpdHkgKiBCaWxsaW5nKTtcbiAgICAgICAgVkFUUHJpY2UgPSBUb3RhbE5vVmFsUHJpY2UgKiAwLjE7XG4gICAgICAgIFRvdGFsUHJpY2UgPSBUb3RhbE5vVmFsUHJpY2UgKyBWQVRQcmljZTtcbiAgICB9XG5cbiAgICBUb3RhbE5vVmFsLmF0dHIoJ2RhdGEtcHJpY2UnLCBUb3RhbE5vVmFsUHJpY2UpO1xuICAgIFRvdGFsTm9WYWwudGV4dChUb3RhbE5vVmFsUHJpY2UudG9Mb2NhbGVTdHJpbmcoKSk7XG5cbiAgICBWQVQuYXR0cignZGF0YS1wcmljZScsIFZBVFByaWNlKTtcbiAgICBWQVQudGV4dChWQVRQcmljZS50b0xvY2FsZVN0cmluZygpKTtcblxuICAgIFRvdGFsLmF0dHIoJ2RhdGEtcHJpY2UnLCBUb3RhbFByaWNlKTtcbiAgICBUb3RhbC50ZXh0KFRvdGFsUHJpY2UudG9Mb2NhbGVTdHJpbmcoKSk7XG59XG5cbmZ1bmN0aW9uIE9yZGVyQWRkb24ocHJvZHVjdCA9IDAsIGJpbGxpbmcgPSAwKSB7XG4gICAgbGV0IGJvZHkgPSAkKCdib2R5Jyk7XG4gICAgbGV0IGFsbEl0ZW0gPSBib2R5LmZpbmQoJyN1cGdyYWRlIC5pbnB1dC1xdHknKTtcbiAgICBsZXQgZXJyb3IgPSBbXTtcbiAgICBsZXQgYWRkb24gPSB7fTtcbiAgICBpZiAoYWxsSXRlbS5sZW5ndGgpIHtcbiAgICAgICAgYWxsSXRlbS5lYWNoKChpbmRleCwgb2JqZWN0KSA9PiB7XG4gICAgICAgICAgICBpZiAoTnVtYmVyKG9iamVjdC52YWx1ZSkgPT09IDApIHtcbiAgICAgICAgICAgICAgICBlcnJvci5wdXNoKG9iamVjdC5uYW1lKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYWRkb25bYCR7b2JqZWN0Lm5hbWV9YF0gPSB7XG4gICAgICAgICAgICAgICAgcHJpY2U6IG9iamVjdC5nZXRBdHRyaWJ1dGUoJ2RhdGEtcHJpY2UnKSxcbiAgICAgICAgICAgICAgICBxdWFudGl0eTogb2JqZWN0LnZhbHVlXG4gICAgICAgICAgICB9O1xuICAgICAgICB9KVxuICAgIH1cbiAgICBpZiAoZXJyb3IubGVuZ3RoID09PSAzKSB7XG4gICAgICAgIGVycm9yLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgIGJvZHkuZmluZChgI3VwZ3JhZGUgLmlucHV0LXF0eVtuYW1lPVwiJHtlbGVtZW50fVwiXWApLmFkZENsYXNzKCdlcnJvcicpO1xuICAgICAgICB9KVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgU3dhbC5maXJlKHtcbiAgICAgICAgdGl0bGU6IFwiQ2jDuiDDvT9cIixcbiAgICAgICAgdGV4dDogXCJUcm9uZyBxdcOhIHRyw6xuaCBuw6JuZyBj4bqlcCwgQ2jDum5nIHTDtGkgc+G6vSB04bqvdCBtw6F5IGNo4bunIGPhu6dhIGLhuqFuIVwiLFxuICAgICAgICBpY29uOiBcIndhcm5pbmdcIixcbiAgICAgICAgc2hvd0NhbmNlbEJ1dHRvbjogdHJ1ZSxcbiAgICAgICAgY29uZmlybUJ1dHRvbkNvbG9yOiBcIiMzMDg1ZDZcIixcbiAgICAgICAgY2FuY2VsQnV0dG9uQ29sb3I6IFwiI2QzM1wiLFxuICAgICAgICBjb25maXJtQnV0dG9uVGV4dDogXCJYw6FjIG5o4bqtblwiXG4gICAgfSkudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgIGlmIChyZXN1bHQuaXNDb25maXJtZWQpIHtcbiAgICAgICAgICAgICQuYWpheCh7XG4gICAgICAgICAgICAgICAgdXJsOiBBUElDYXJ0QWRkb24sXG4gICAgICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgICAgICBhZGRvbixcbiAgICAgICAgICAgICAgICAgICAgcHJvZHVjdCxcbiAgICAgICAgICAgICAgICAgICAgYmlsbGluZ1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgdHlwZTogJ3Bvc3QnLFxuICAgICAgICAgICAgICAgIGJlZm9yZVNlbmQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgU3dhbC5maXJlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGh0bWw6IHN3ZWV0X2xvYWRlciArIFwiPGg0PsSQYW5nIHjhu60gbMO9IGThu68gbGnhu4d1IC4uLjwvaDQ+XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBzaG93Q29uZmlybUJ1dHRvbjogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgU3dhbC5jbG9zZSgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UuZXJyb3IgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBTd2FsLmZpcmUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiBcIsSQ4bq3dCBow6BuZyB0aMOgbmggY8O0bmdcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiByZXNwb25zZS5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb246IFwic3VjY2Vzc1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dDYW5jZWxCdXR0b246IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlybUJ1dHRvbkNvbG9yOiBcIiMzMDg1ZDZcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW5jZWxCdXR0b25Db2xvcjogXCIjZDMzXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlybUJ1dHRvblRleHQ6IFwiWMOhYyBuaOG6rW5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSkudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnYm9keScpLmZpbmQoJyN1cGdyYWRlJykucmVtb3ZlKClcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBTd2FsLmZpcmUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb246IFwiZXJyb3JcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogXCJPb3BzLi4uXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogcmVzcG9uc2UubWVzc2FnZVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBSZW5ld1NlcnZpY2UocHJvZHVjdCA9IDAsIGJpbGxpbmcgPSAwLCB0eXBlID0gMCkge1xuICAgIFN3YWwuZmlyZSh7XG4gICAgICAgIHRpdGxlOiBcIkNow7ogw70/XCIsXG4gICAgICAgIHRleHQ6IFwiQuG6oW4gxJFhbmcgecOqdSBj4bqndSBnaWEgaOG6oW4gZOG7i2NoIHbhu6UhXCIsXG4gICAgICAgIGljb246IFwid2FybmluZ1wiLFxuICAgICAgICBzaG93Q2FuY2VsQnV0dG9uOiB0cnVlLFxuICAgICAgICBjb25maXJtQnV0dG9uQ29sb3I6IFwiIzMwODVkNlwiLFxuICAgICAgICBjYW5jZWxCdXR0b25Db2xvcjogXCIjZDMzXCIsXG4gICAgICAgIGNvbmZpcm1CdXR0b25UZXh0OiBcIljDoWMgbmjhuq1uXCJcbiAgICB9KS50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0NvbmZpcm1lZCkge1xuICAgICAgICAgICAgJC5hamF4KHtcbiAgICAgICAgICAgICAgICB1cmw6IEFQSVJlbmV3U2VydmljZSxcbiAgICAgICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICAgICAgICAgIHByb2R1Y3QsXG4gICAgICAgICAgICAgICAgICAgIGJpbGxpbmdcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHR5cGU6ICdwb3N0JyxcbiAgICAgICAgICAgICAgICBiZWZvcmVTZW5kOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIFN3YWwuZmlyZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICBodG1sOiBzd2VldF9sb2FkZXIgKyBcIjxoND7EkGFuZyB44butIGzDvSBk4buvIGxp4buHdSAuLi48L2g0PlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2hvd0NvbmZpcm1CdXR0b246IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgc3VjY2VzczogZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgICAgIFN3YWwuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmVycm9yID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgU3dhbC5maXJlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogXCJTdWNjZXNzXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogcmVzcG9uc2UubWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uOiBcInN1Y2Nlc3NcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93Q2FuY2VsQnV0dG9uOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpcm1CdXR0b25Db2xvcjogXCIjMzA4NWQ2XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuY2VsQnV0dG9uQ29sb3I6IFwiI2QzM1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpcm1CdXR0b25UZXh0OiBcIljDoWMgbmjhuq1uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJyNyZW5ldycpLm1vZGFsKCdoaWRlJylcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBTd2FsLmZpcmUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb246IFwiZXJyb3JcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogXCJPb3BzLi4uXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogcmVzcG9uc2UubWVzc2FnZVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBDb3B5RGlzY291bnQodmFsdWUgPSAnJykge1xuXG4gICAgbGV0IHRlbXBUZXh0YXJlYSA9ICQoJzx0ZXh0YXJlYT4nKTtcbiAgICAkKCdib2R5JykuYXBwZW5kKHRlbXBUZXh0YXJlYSk7XG4gICAgdGVtcFRleHRhcmVhLnZhbCh2YWx1ZSkuc2VsZWN0KCk7XG4gICAgZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ2NvcHknKTtcbiAgICB0ZW1wVGV4dGFyZWEucmVtb3ZlKCk7XG5cbiAgICBTd2FsLmZpcmUoe1xuICAgICAgICB0aXRsZTogXCJDb3B5IFN1Y2Nlc3NmdWxseVwiLFxuICAgICAgICB0ZXh0OiBcIkNvcHkgbcOjIGdp4bqjbSBnacOhIHRow6BuaCBjw7RuZyFcIixcbiAgICAgICAgaWNvbjogXCJzdWNjZXNzXCIsXG4gICAgICAgIGNvbmZpcm1CdXR0b25Db2xvcjogXCIjMzA4NWQ2XCIsXG4gICAgICAgIGNvbmZpcm1CdXR0b25UZXh0OiBcIljDoWMgbmjhuq1uXCJcbiAgICB9KVxufVxuXG50b2FzdHIub3B0aW9ucyA9IHtcbiAgICBcImNsb3NlQnV0dG9uXCI6IGZhbHNlLFxuICAgIFwiZGVidWdcIjogZmFsc2UsXG4gICAgXCJuZXdlc3RPblRvcFwiOiBmYWxzZSxcbiAgICBcInByb2dyZXNzQmFyXCI6IGZhbHNlLFxuICAgIFwicG9zaXRpb25DbGFzc1wiOiBcInRvYXN0LXRvcC1yaWdodFwiLFxuICAgIFwicHJldmVudER1cGxpY2F0ZXNcIjogZmFsc2UsXG4gICAgXCJvbmNsaWNrXCI6IG51bGwsXG4gICAgXCJzaG93RHVyYXRpb25cIjogXCIzMDBcIixcbiAgICBcImhpZGVEdXJhdGlvblwiOiBcIjEwMDBcIixcbiAgICBcInRpbWVPdXRcIjogXCI1MDAwXCIsXG4gICAgXCJleHRlbmRlZFRpbWVPdXRcIjogXCIxMDAwXCIsXG4gICAgXCJzaG93RWFzaW5nXCI6IFwic3dpbmdcIixcbiAgICBcImhpZGVFYXNpbmdcIjogXCJsaW5lYXJcIixcbiAgICBcInNob3dNZXRob2RcIjogXCJmYWRlSW5cIixcbiAgICBcImhpZGVNZXRob2RcIjogXCJmYWRlT3V0XCJcbn1cbiJdLCJtYXBwaW5ncyI6IkFBQUEsSUFBSUEsWUFBWSxHQUFHLGtmQUFrZjtBQUVyZ0IsU0FBU0MsY0FBY0EsQ0FBQSxFQUFjO0VBQUEsSUFBYkMsT0FBTyxHQUFBQyxTQUFBLENBQUFDLE1BQUEsUUFBQUQsU0FBQSxRQUFBRSxTQUFBLEdBQUFGLFNBQUEsTUFBRyxDQUFDO0VBQy9CRyxDQUFDLENBQUNDLElBQUksQ0FBQztJQUNIQyxHQUFHLEVBQUVDLHFCQUFxQjtJQUMxQkMsSUFBSSxFQUFFO01BQ0ZSLE9BQU8sRUFBRUE7SUFDYixDQUFDO0lBQ0RTLElBQUksRUFBRSxNQUFNO0lBQ1pDLFVBQVUsRUFBRSxTQUFaQSxVQUFVQSxDQUFBLEVBQWM7TUFDcEJDLElBQUksQ0FBQ0MsSUFBSSxDQUFDO1FBQ05DLElBQUksRUFBRWYsWUFBWSxHQUFHLGlDQUFpQztRQUN0RGdCLGlCQUFpQixFQUFFO01BQ3ZCLENBQUMsQ0FBQztJQUNOLENBQUM7SUFDREMsT0FBTyxFQUFFLFNBQVRBLE9BQU9BLENBQVlDLFFBQVEsRUFBRTtNQUN6QixJQUFJQSxRQUFRLENBQUNDLEtBQUssS0FBSyxLQUFLLEVBQUU7UUFDMUJOLElBQUksQ0FBQ0MsSUFBSSxDQUFDO1VBQ05NLEtBQUssRUFB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\n//# sourceURL=webpack-internal:///./resources/js/core.js\n"); /***/ }) diff --git a/public/js/main.min.js b/public/js/main.min.js index 158d8de..5ffc567 100644 --- a/public/js/main.min.js +++ b/public/js/main.min.js @@ -15,7 +15,7 @@ \******************************/ /***/ (() => { -eval("jQuery(document).ready(function ($) {\n var tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle=\"tooltip\"]'));\n tooltipTriggerList.map(function (tooltipTriggerEl) {\n return new bootstrap.Tooltip(tooltipTriggerEl);\n });\n $('.password-toggle-icon').click(function () {\n var password = $(this).parent().find('input');\n if (password.attr(\"type\") === \"password\") {\n password.attr(\"type\", \"text\");\n $(this).find('i').removeClass(\"fa-eye-slash\");\n $(this).find('i').addClass(\"fa-eye\");\n } else {\n password.attr(\"type\", \"password\");\n $(this).find('i').addClass(\"fa-eye-slash\");\n $(this).find('i').removeClass(\"fa-eye\");\n }\n });\n $('.select-version__os').change(function () {\n var selected = $(this).find('option:selected').val();\n if (selected === 0) return this;\n var parent = $(this).parent().parent().parent();\n parent.parent().find('.box-os_center').removeClass('active');\n parent.addClass('active');\n var os_id = parent.attr('data-os');\n var os_version_id = selected;\n var product_id = parent.parent().parent().parent().attr('data-product');\n parent.parent().find(\"input[name=\\\"vps[\".concat(product_id, \"][os_id]\\\"]\")).empty().val(os_id);\n parent.parent().find(\"input[name=\\\"vps[\".concat(product_id, \"][os_version_id]\\\"]\")).empty().val(os_version_id);\n });\n $('.time-buy__change').change(function () {\n var element = $(this).parent().parent().parent().parent();\n var target = element.attr('data-target');\n var key = element.attr('data-product');\n appendChangeCart(target, key);\n });\n\n /* downgrade add on */\n $('input.minus.is-form').click(function () {\n var elementParent = $(this).parent();\n var productElement = elementParent.parent().parent().parent().parent().parent();\n var elementChange = elementParent.find('.input-qty');\n var step = Number(elementChange.attr('step'));\n var min = Number(elementChange.attr('min'));\n var price = Number(elementChange.attr('data-price'));\n var target = elementChange.attr('data-name');\n var quantity = Number(elementChange.val());\n quantity -= step;\n if (min > quantity) {\n return false;\n }\n elementChange.empty().val(quantity);\n appendAddonCart(target, price, quantity, step, \"-\", productElement.attr('data-product'), productElement.attr('data-target'));\n });\n\n /* upgrade add on */\n $('input.plus.is-form').click(function () {\n var elementParent = $(this).parent();\n var productElement = elementParent.parent().parent().parent().parent().parent();\n var elementChange = elementParent.find('.input-qty');\n var step = Number(elementChange.attr('step'));\n var max = Number(elementChange.attr('max'));\n var price = Number(elementChange.attr('data-price'));\n var target = elementChange.attr('data-name');\n var quantity = Number(elementChange.val());\n quantity += step;\n if (quantity > max) {\n return false;\n }\n elementChange.empty().val(quantity);\n appendAddonCart(target, price, quantity, step, \"+\", productElement.attr('data-product'), productElement.attr('data-target'));\n });\n\n /* Rules validate form Oder at Cart Page */\n if ($('.form-submit__oder').length) {\n var allProduct = document.querySelectorAll('.row-product__item');\n if (allProduct.length) {\n var form = $(\".form-submit__oder\");\n form.validate({\n onfocusout: false,\n onkeyup: false,\n onclick: false,\n ignore: \":hidden:not('.os_select_hidden')\"\n });\n var formRule = form.validate().settings.rules;\n var formMessage = form.validate().settings.messages;\n allProduct.forEach(function (element, index) {\n switch ($(element).attr('data-target')) {\n case \"hosting\":\n formRule[\"hosting[\".concat(index, \"][time_buy]\")] = \"required\";\n formMessage[\"hosting[\".concat(index, \"][time_buy]\")] = {\n required: \"Vui lòng chọn thời gian thanh toán!\"\n };\n formRule[\"hosting[\".concat(index, \"][domain]\")] = \"required\";\n formMessage[\"hosting[\".concat(index, \"][domain]\")] = {\n required: \"Vui lòng nhập tên miền để kích hoạt!\"\n };\n break;\n case \"vps\":\n formRule[\"vps[\".concat(index, \"][time_buy]\")] = \"required\";\n formMessage[\"vps[\".concat(index, \"][time_buy]\")] = {\n required: \"Vui lòng chọn thời gian thanh toán!\"\n };\n formRule[\"vps[\".concat(index, \"][hostname]\")] = \"required\";\n formMessage[\"vps[\".concat(index, \"][hostname]\")] = {\n required: \"Vui lòng nhập hostname!\"\n };\n formRule[\"vps[\".concat(index, \"][os_id]\")] = \"required\";\n formMessage[\"vps[\".concat(index, \"][os_id]\")] = {\n required: \"Vui lòng chọn hệ điều hành!\"\n };\n formRule[\"vps[\".concat(index, \"][os_version_id]\")] = \"required\";\n formMessage[\"vps[\".concat(index, \"][os_version_id]\")] = {\n required: \"Vui lòng chọn phiên bản cần cài đặt!\"\n };\n break;\n }\n });\n form.validate().settings.rules = formRule;\n form.validate().settings.messages = formMessage;\n }\n }\n $('.btn-order').click(function () {\n var promotion = $('input[name=\"promotion_code\"]').val();\n var form = $('.form-submit__oder');\n if (form.valid()) {\n form.append(\"\"));\n form.submit();\n }\n });\n $('body').on('click', '.btn-reinstall', function () {\n appendOsGroup();\n $('input.form-action').empty().val('reinstall');\n });\n $('#os_group_id').change(function () {\n var value = Number($(this).find('option:selected').val());\n if (value && value !== 0) {\n appendChild(APIGetVersion, 'os_version', {\n group: value\n });\n }\n });\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJqUXVlcnkiLCJkb2N1bWVudCIsInJlYWR5IiwiJCIsInRvb2x0aXBUcmlnZ2VyTGlzdCIsInNsaWNlIiwiY2FsbCIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJtYXAiLCJ0b29sdGlwVHJpZ2dlckVsIiwiYm9vdHN0cmFwIiwiVG9vbHRpcCIsImNsaWNrIiwicGFzc3dvcmQiLCJwYXJlbnQiLCJmaW5kIiwiYXR0ciIsInJlbW92ZUNsYXNzIiwiYWRkQ2xhc3MiLCJjaGFuZ2UiLCJzZWxlY3RlZCIsInZhbCIsIm9zX2lkIiwib3NfdmVyc2lvbl9pZCIsInByb2R1Y3RfaWQiLCJjb25jYXQiLCJlbXB0eSIsImVsZW1lbnQiLCJ0YXJnZXQiLCJrZXkiLCJhcHBlbmRDaGFuZ2VDYXJ0IiwiZWxlbWVudFBhcmVudCIsInByb2R1Y3RFbGVtZW50IiwiZWxlbWVudENoYW5nZSIsInN0ZXAiLCJOdW1iZXIiLCJtaW4iLCJwcmljZSIsInF1YW50aXR5IiwiYXBwZW5kQWRkb25DYXJ0IiwibWF4IiwibGVuZ3RoIiwiYWxsUHJvZHVjdCIsImZvcm0iLCJ2YWxpZGF0ZSIsIm9uZm9jdXNvdXQiLCJvbmtleXVwIiwib25jbGljayIsImlnbm9yZSIsImZvcm1SdWxlIiwic2V0dGluZ3MiLCJydWxlcyIsImZvcm1NZXNzYWdlIiwibWVzc2FnZXMiLCJmb3JFYWNoIiwiaW5kZXgiLCJyZXF1aXJlZCIsInByb21vdGlvbiIsInZhbGlkIiwiYXBwZW5kIiwic3VibWl0Iiwib24iLCJhcHBlbmRPc0dyb3VwIiwidmFsdWUiLCJhcHBlbmRDaGlsZCIsIkFQSUdldFZlcnNpb24iLCJncm91cCJdLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvbWFpbi5qcz9mZGFjIl0sInNvdXJjZXNDb250ZW50IjpbImpRdWVyeShkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24gKCQpe1xyXG5cclxuICAgIGxldCB0b29sdGlwVHJpZ2dlckxpc3QgPSBbXS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLWJzLXRvZ2dsZT1cInRvb2x0aXBcIl0nKSlcclxuICAgIHRvb2x0aXBUcmlnZ2VyTGlzdC5tYXAoZnVuY3Rpb24gKHRvb2x0aXBUcmlnZ2VyRWwpIHtcclxuICAgICAgICByZXR1cm4gbmV3IGJvb3RzdHJhcC5Ub29sdGlwKHRvb2x0aXBUcmlnZ2VyRWwpXHJcbiAgICB9KVxyXG4gICAgJCgnLnBhc3N3b3JkLXRvZ2dsZS1pY29uJykuY2xpY2soZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGxldCBwYXNzd29yZCA9ICQodGhpcykucGFyZW50KCkuZmluZCgnaW5wdXQnKVxyXG5cclxuICAgICAgICBpZiAocGFzc3dvcmQuYXR0cihcInR5cGVcIikgPT09IFwicGFzc3dvcmRcIikge1xyXG4gICAgICAgICAgICBwYXNzd29yZC5hdHRyKFwidHlwZVwiLCBcInRleHRcIilcclxuICAgICAgICAgICAgJCh0aGlzKS5maW5kKCdpJykucmVtb3ZlQ2xhc3MoXCJmYS1leWUtc2xhc2hcIik7XHJcbiAgICAgICAgICAgICQodGhpcykuZmluZCgnaScpLmFkZENsYXNzKFwiZmEtZXllXCIpO1xyXG5cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBwYXNzd29yZC5hdHRyKFwidHlwZVwiLCBcInBhc3N3b3JkXCIpXHJcbiAgICAgICAgICAgICQodGhpcykuZmluZCgnaScpLmFkZENsYXNzKFwiZmEtZXllLXNsYXNoXCIpO1xyXG4gICAgICAgICAgICAkKHRoaXMpLmZpbmQoJ2knKS5yZW1vdmVDbGFzcyhcImZhLWV5ZVwiKTtcclxuICAgICAgICB9XHJcbiAgICB9KVxyXG5cclxuICAgICQoJy5zZWxlY3QtdmVyc2lvbl9fb3MnKS5jaGFuZ2UoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGxldCBzZWxlY3RlZCA9ICQodGhpcykuZmluZCgnb3B0aW9uOnNlbGVjdGVkJykudmFsKCk7XHJcbiAgICAgICAgaWYgKHNlbGVjdGVkID09PSAwKSByZXR1cm4gdGhpcztcclxuICAgICAgICBsZXQgcGFyZW50ID0gJCh0aGlzKS5wYXJlbnQoKS5wYXJlbnQoKS5wYXJlbnQoKTtcclxuICAgICAgICBwYXJlbnQucGFyZW50KCkuZmluZCgnLmJveC1vc19jZW50ZXInKS5yZW1vdmVDbGFzcygnYWN0aXZlJyk7XHJcbiAgICAgICAgcGFyZW50LmFkZENsYXNzKCdhY3RpdmUnKVxyXG4gICAgICAgIGxldCBvc19pZCA9IHBhcmVudC5hdHRyKCdkYXRhLW9zJyk7XHJcbiAgICAgICAgbGV0IG9zX3ZlcnNpb25faWQgPSBzZWxlY3RlZDtcclxuICAgICAgICBsZXQgcHJvZHVjdF9pZCA9IHBhcmVudC5wYXJlbnQoKS5wYXJlbnQoKS5wYXJlbnQoKS5hdHRyKCdkYXRhLXByb2R1Y3QnKTtcclxuICAgICAgICBwYXJlbnQucGFyZW50KCkuZmluZChgaW5wdXRbbmFtZT1cInZwc1ske3Byb2R1Y3RfaWR9XVtvc19pZF1cIl1gKS5lbXB0eSgpLnZhbChvc19pZClcclxuICAgICAgICBwYXJlbnQucGFyZW50KCkuZmluZChgaW5wdXRbbmFtZT1cInZwc1ske3Byb2R1Y3RfaWR9XVtvc192ZXJzaW9uX2lkXVwiXWApLmVtcHR5KCkudmFsKG9zX3ZlcnNpb25faWQpXHJcbiAgICB9KTtcclxuXHJcbiAgICAkKCcudGltZS1idXlfX2NoYW5nZScpLmNoYW5nZShmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgbGV0IGVsZW1lbnQgPSAkKHRoaXMpLnBhcmVudCgpLnBhcmVudCgpLnBhcmVudCgpLnBhcmVudCgpO1xyXG4gICAgICAgIGxldCB0YXJnZXQgPSBlbGVtZW50LmF0dHIoJ2RhdGEtdGFyZ2V0Jyk7XHJcbiAgICAgICAgbGV0IGtleSA9IGVsZW1lbnQuYXR0cignZGF0YS1wcm9kdWN0Jyk7XHJcblxyXG4gICAgICAgIGFwcGVuZENoYW5nZUNhcnQodGFyZ2V0LCBrZXkpXHJcbiAgICB9KVxyXG5cclxuICAgIC8qIGRvd25ncmFkZSBhZGQgb24gKi9cclxuICAgICQoJ2lucHV0Lm1pbnVzLmlzLWZvcm0nKS5jbGljayhmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgbGV0IGVsZW1lbnRQYXJlbnQgPSAkKHRoaXMpLnBhcmVudCgpO1xyXG4gICAgICAgIGxldCBwcm9kdWN0RWxlbWVudCA9IGVsZW1lbnRQYXJlbnQucGFyZW50KCkucGFyZW50KCkucGFyZW50KCkucGFyZW50KCkucGFyZW50KCk7XHJcbiAgICAgICAgbGV0IGVsZW1lbnRDaGFuZ2UgPSBlbGVtZW50UGFyZW50LmZpbmQoJy5pbnB1dC1xdHknKTtcclxuICAgICAgICBsZXQgc3RlcCA9IE51bWJlcihlbGVtZW50Q2hhbmdlLmF0dHIoJ3N0ZXAnKSk7XHJcbiAgICAgICAgbGV0IG1pbiA9IE51bWJlcihlbGVtZW50Q2hhbmdlLmF0dHIoJ21pbicpKTtcclxuICAgICAgICBsZXQgcHJpY2UgPSBOdW1iZXIoZWxlbWVudENoYW5nZS5hdHRyKCdkYXRhLXByaWNlJykpO1xyXG4gICAgICAgIGxldCB0YXJnZXQgPSBlbGVtZW50Q2hhbmdlLmF0dHIoJ2RhdGEtbmFtZScpO1xyXG4gICAgICAgIGxldCBxdWFudGl0eSA9IE51bWJlcihlbGVtZW50Q2hhbmdlLnZhbCgpKTtcclxuXHJcbiAgICAgICAgcXVhbnRpdHkgLT0gc3RlcDtcclxuXHJcbiAgICAgICAgaWYgKG1pbiA+IHF1YW50aXR5KSB7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGVsZW1lbnRDaGFuZ2UuZW1wdHkoKS52YWwocXVhbnRpdHkpXHJcblxyXG4gICAgICAgIGFwcGVuZEFkZG9uQ2FydCh0YXJnZXQsIHByaWNlLCBxdWFudGl0eSwgc3RlcCwgXCItXCIsIHByb2R1Y3RFbGVtZW50LmF0dHIoJ2RhdGEtcHJvZHVjdCcpLCBwcm9kdWN0RWxlbWVudC5hdHRyKCdkYXRhLXRhcmdldCcpKTtcclxuXHJcbiAgICB9KVxyXG5cclxuICAgIC8qIHVwZ3JhZGUgYWRkIG9uICovXHJcbiAgICAkKCdpbnB1dC5wbHVzLmlzLWZvcm0nKS5jbGljayhmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgbGV0IGVsZW1lbnRQYXJlbnQgPSAkKHRoaXMpLnBhcmVudCgpO1xyXG4gICAgICAgIGxldCBwcm9kdWN0RWxlbWVudCA9IGVsZW1lbnRQYXJlbnQucGFyZW50KCkucGFyZW50KCkucGFyZW50KCkucGFyZW50KCkucGFyZW50KCk7XHJcbiAgICAgICAgbGV0IGVsZW1lbnRDaGFuZ2UgPSBlbGVtZW50UGFyZW50LmZpbmQoJy5pbnB1dC1xdHknKTtcclxuICAgICAgICBsZXQgc3RlcCA9IE51bWJlcihlbGVtZW50Q2hhbmdlLmF0dHIoJ3N0ZXAnKSk7XHJcbiAgICAgICAgbGV0IG1heCA9IE51bWJlcihlbGVtZW50Q2hhbmdlLmF0dHIoJ21heCcpKTtcclxuICAgICAgICBsZXQgcHJpY2UgPSBOdW1iZXIoZWxlbWVudENoYW5nZS5hdHRyKCdkYXRhLXByaWNlJykpO1xyXG4gICAgICAgIGxldCB0YXJnZXQgPSBlbGVtZW50Q2hhbmdlLmF0dHIoJ2RhdGEtbmFtZScpO1xyXG4gICAgICAgIGxldCBxdWFudGl0eSA9IE51bWJlcihlbGVtZW50Q2hhbmdlLnZhbCgpKTtcclxuXHJcbiAgICAgICAgcXVhbnRpdHkgKz0gc3RlcDtcclxuXHJcbiAgICAgICAgaWYgKHF1YW50aXR5ID4gbWF4KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxlbWVudENoYW5nZS5lbXB0eSgpLnZhbChxdWFudGl0eSlcclxuICAgICAgICBhcHBlbmRBZGRvbkNhcnQodGFyZ2V0LCBwcmljZSwgcXVhbnRpdHksIHN0ZXAsIFwiK1wiLCBwcm9kdWN0RWxlbWVudC5hdHRyKCdkYXRhLXByb2R1Y3QnKSwgcHJvZHVjdEVsZW1lbnQuYXR0cignZGF0YS10YXJnZXQnKSk7XHJcbiAgICB9KVxyXG5cclxuICAgIC8qIFJ1bGVzIHZhbGlkYXRlIGZvcm0gT2RlciBhdCBDYXJ0IFBhZ2UgKi9cclxuICAgIGlmICgkKCcuZm9ybS1zdWJtaXRfX29kZXInKS5sZW5ndGgpIHtcclxuICAgICAgICBsZXQgYWxsUHJvZHVjdCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5yb3ctcHJvZHVjdF9faXRlbScpO1xyXG4gICAgICAgIGlmIChhbGxQcm9kdWN0Lmxlbmd0aCkge1xyXG4gICAgICAgICAgICBsZXQgZm9ybSA9ICQoXCIuZm9ybS1zdWJtaXRfX29kZXJcIilcclxuICAgICAgICAgICAgZm9ybS52YWxpZGF0ZSh7XHJcbiAgICAgICAgICAgICAgICBvbmZvY3Vzb3V0OiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIG9ua2V5dXA6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgb25jbGljazogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICBpZ25vcmU6IFwiOmhpZGRlbjpub3QoJy5vc19zZWxlY3RfaGlkZGVuJylcIlxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICBsZXQgZm9ybVJ1bGUgPSBmb3JtLnZhbGlkYXRlKCkuc2V0dGluZ3MucnVsZXM7XHJcbiAgICAgICAgICAgIGxldCBmb3JtTWVzc2FnZSA9IGZvcm0udmFsaWRhdGUoKS5zZXR0aW5ncy5tZXNzYWdlcztcclxuICAgICAgICAgICAgYWxsUHJvZHVjdC5mb3JFYWNoKChlbGVtZW50LCBpbmRleCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgc3dpdGNoICgkKGVsZW1lbnQpLmF0dHIoJ2RhdGEtdGFyZ2V0JykpIHtcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiaG9zdGluZ1wiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtUnVsZVtgaG9zdGluZ1ske2luZGV4fV1bdGltZV9idXldYF0gPSBcInJlcXVpcmVkXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1NZXNzYWdlW2Bob3N0aW5nWyR7aW5kZXh9XVt0aW1lX2J1eV1gXSA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkOiBcIlZ1aSBsw7JuZyBjaOG7jW4gdGjhu51pIGdpYW4gdGhhbmggdG/DoW4hXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1SdWxlW2Bob3N0aW5nWyR7aW5kZXh9XVtkb21haW5dYF0gPSBcInJlcXVpcmVkXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1NZXNzYWdlW2Bob3N0aW5nWyR7aW5kZXh9XVtkb21haW5dYF0gPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZDogXCJWdWkgbMOybmcgbmjhuq1wIHTDqm4gbWnhu4FuIMSR4buDIGvDrWNoIGhv4bqhdCFcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcInZwc1wiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtUnVsZVtgdnBzWyR7aW5kZXh9XVt0aW1lX2J1eV1gXSA9IFwicmVxdWlyZWRcIjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybU1lc3NhZ2VbYHZwc1ske2luZGV4fV1bdGltZV9idXldYF0gPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZDogXCJWdWkgbMOybmcgY2jhu41uIHRo4budaSBnaWFuIHRoYW5oIHRvw6FuIVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtUnVsZVtgdnBzWyR7aW5kZXh9XVtob3N0bmFtZV1gXSA9IFwicmVxdWlyZWRcIjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybU1lc3NhZ2VbYHZwc1ske2luZGV4fV1baG9zdG5hbWVdYF0gPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZDogXCJWdWkgbMOybmcgbmjhuq1wIGhvc3RuYW1lIVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtUnVsZVtgdnBzWyR7aW5kZXh9XVtvc19pZF1gXSA9IFwicmVxdWlyZWRcIjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybU1lc3NhZ2VbYHZwc1ske2luZGV4fV1bb3NfaWRdYF0gPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZDogXCJWdWkgbMOybmcgY2jhu41uIGjhu4cgxJFp4buBdSBow6BuaCFcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybVJ1bGVbYHZwc1ske2luZGV4fV1bb3NfdmVyc2lvbl9pZF1gXSA9IFwicmVxdWlyZWRcIjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybU1lc3NhZ2VbYHZwc1ske2luZGV4fV1bb3NfdmVyc2lvbl9pZF1gXSA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkOiBcIlZ1aSBsw7JuZyBjaOG7jW4gcGhpw6puIGLhuqNuIGPhuqduIGPDoGkgxJHhurd0IVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICBmb3JtLnZhbGlkYXRlKCkuc2V0dGluZ3MucnVsZXMgPSBmb3JtUnVsZTtcclxuICAgICAgICAgICAgZm9ybS52YWxpZGF0ZSgpLnNldHRpbmdzLm1lc3NhZ2VzID0gZm9ybU1lc3NhZ2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICAkKCcuYnRuLW9yZGVyJykuY2xpY2soZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGxldCBwcm9tb3Rpb24gPSAkKCdpbnB1dFtuYW1lPVwicHJvbW90aW9uX2NvZGVcIl0nKS52YWwoKVxyXG4gICAgICAgIGxldCBmb3JtID0gJCgnLmZvcm0tc3VibWl0X19vZGVyJylcclxuICAgICAgICBpZiAoZm9ybS52YWxpZCgpKSB7XHJcbiAgICAgICAgICAgIGZvcm0uYXBwZW5kKGA8aW5wdXQgdHlwZT1cImhpZGRlblwiIG5hbWU9XCJkaXNjb3VudFwiIHZhbHVlPVwiJHtwcm9tb3Rpb259XCI+YCk7XHJcbiAgICAgICAgICAgIGZvcm0uc3VibWl0KClcclxuICAgICAgICB9XHJcblxyXG4gICAgfSlcclxuXHJcbiAgICAkKCdib2R5Jykub24oJ2NsaWNrJywgJy5idG4tcmVpbnN0YWxsJywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGFwcGVuZE9zR3JvdXAoKTtcclxuICAgICAgICAkKCdpbnB1dC5mb3JtLWFjdGlvbicpLmVtcHR5KCkudmFsKCdyZWluc3RhbGwnKTtcclxuICAgIH0pXHJcblxyXG4gICAgJCgnI29zX2dyb3VwX2lkJykuY2hhbmdlKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBsZXQgdmFsdWUgPSBOdW1iZXIoJCh0aGlzKS5maW5kKCdvcHRpb246c2VsZWN0ZWQnKS52YWwoKSk7XHJcblxyXG4gICAgICAgIGlmICh2YWx1ZSAmJiB2YWx1ZSAhPT0gMCkge1xyXG4gICAgICAgICAgICBhcHBlbmRDaGlsZChBUElHZXRWZXJzaW9uLCAnb3NfdmVyc2lvbicsIHtncm91cDogdmFsdWV9KTtcclxuICAgICAgICB9XHJcbiAgICB9KVxyXG5cclxufSlcclxuIl0sIm1hcHBpbmdzIjoiQUFBQUEsTUFBTSxDQUFDQyxRQUFRLENBQUMsQ0FBQ0MsS0FBSyxDQUFDLFVBQVVDLENBQUMsRUFBQztFQUUvQixJQUFJQyxrQkFBa0IsR0FBRyxFQUFFLENBQUNDLEtBQUssQ0FBQ0MsSUFBSSxDQUFDTCxRQUFRLENBQUNNLGdCQUFnQixDQUFDLDRCQUE0QixDQUFDLENBQUM7RUFDL0ZILGtCQUFr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\n//# sourceURL=webpack-internal:///./resources/js/main.js\n"); +eval("jQuery(document).ready(function ($) {\n var tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle=\"tooltip\"]'));\n tooltipTriggerList.map(function (tooltipTriggerEl) {\n return new bootstrap.Tooltip(tooltipTriggerEl);\n });\n $('.password-toggle-icon').click(function () {\n var password = $(this).parent().find('input');\n if (password.attr(\"type\") === \"password\") {\n password.attr(\"type\", \"text\");\n $(this).find('i').removeClass(\"fa-eye-slash\");\n $(this).find('i').addClass(\"fa-eye\");\n } else {\n password.attr(\"type\", \"password\");\n $(this).find('i').addClass(\"fa-eye-slash\");\n $(this).find('i').removeClass(\"fa-eye\");\n }\n });\n $('.select-version__os').change(function () {\n var selected = $(this).find('option:selected').val();\n if (selected === 0) return this;\n var parent = $(this).parent().parent().parent();\n parent.parent().find('.box-os_center').removeClass('active');\n parent.addClass('active');\n var os_id = parent.attr('data-os');\n var os_version_id = selected;\n var product_id = parent.parent().parent().parent().attr('data-product');\n parent.parent().find(\"input[name=\\\"vps[\".concat(product_id, \"][os_id]\\\"]\")).empty().val(os_id);\n parent.parent().find(\"input[name=\\\"vps[\".concat(product_id, \"][os_version_id]\\\"]\")).empty().val(os_version_id);\n });\n $('.time-buy__change').change(function () {\n var element = $(this).parent().parent().parent().parent();\n var target = element.attr('data-target');\n var key = element.attr('data-product');\n appendChangeCart(target, key);\n });\n\n /* downgrade add on */\n $('input.minus.is-form').click(function () {\n var elementParent = $(this).parent();\n var productElement = elementParent.parent().parent().parent().parent().parent();\n var elementChange = elementParent.find('.input-qty');\n var step = Number(elementChange.attr('step'));\n var min = Number(elementChange.attr('min'));\n var price = Number(elementChange.attr('data-price'));\n var target = elementChange.attr('data-name');\n var quantity = Number(elementChange.val());\n quantity -= step;\n if (min > quantity) {\n return false;\n }\n elementChange.empty().val(quantity);\n appendAddonCart(target, price, quantity, step, \"-\", productElement.attr('data-product'), productElement.attr('data-target'));\n });\n\n /* upgrade add on */\n $('input.plus.is-form').click(function () {\n var elementParent = $(this).parent();\n var productElement = elementParent.parent().parent().parent().parent().parent();\n var elementChange = elementParent.find('.input-qty');\n var step = Number(elementChange.attr('step'));\n var max = Number(elementChange.attr('max'));\n var price = Number(elementChange.attr('data-price'));\n var target = elementChange.attr('data-name');\n var quantity = Number(elementChange.val());\n quantity += step;\n if (quantity > max) {\n return false;\n }\n elementChange.empty().val(quantity);\n appendAddonCart(target, price, quantity, step, \"+\", productElement.attr('data-product'), productElement.attr('data-target'));\n });\n\n /* Rules validate form Oder at Cart Page */\n if ($('.form-submit__oder').length) {\n var allProduct = document.querySelectorAll('.row-product__item');\n if (allProduct.length) {\n var form = $(\".form-submit__oder\");\n form.validate({\n onfocusout: false,\n onkeyup: false,\n onclick: false,\n ignore: \":hidden:not('.os_select_hidden')\"\n });\n var formRule = form.validate().settings.rules;\n var formMessage = form.validate().settings.messages;\n allProduct.forEach(function (element, index) {\n switch ($(element).attr('data-target')) {\n case \"hosting\":\n formRule[\"hosting[\".concat(index, \"][time_buy]\")] = \"required\";\n formMessage[\"hosting[\".concat(index, \"][time_buy]\")] = {\n required: \"Vui lòng chọn thời gian thanh toán!\"\n };\n formRule[\"hosting[\".concat(index, \"][domain]\")] = \"required\";\n formMessage[\"hosting[\".concat(index, \"][domain]\")] = {\n required: \"Vui lòng nhập tên miền để kích hoạt!\"\n };\n break;\n case \"vps\":\n formRule[\"vps[\".concat(index, \"][time_buy]\")] = \"required\";\n formMessage[\"vps[\".concat(index, \"][time_buy]\")] = {\n required: \"Vui lòng chọn thời gian thanh toán!\"\n };\n formRule[\"vps[\".concat(index, \"][hostname]\")] = \"required\";\n formMessage[\"vps[\".concat(index, \"][hostname]\")] = {\n required: \"Vui lòng nhập hostname!\"\n };\n formRule[\"vps[\".concat(index, \"][os_id]\")] = \"required\";\n formMessage[\"vps[\".concat(index, \"][os_id]\")] = {\n required: \"Vui lòng chọn hệ điều hành!\"\n };\n formRule[\"vps[\".concat(index, \"][os_version_id]\")] = \"required\";\n formMessage[\"vps[\".concat(index, \"][os_version_id]\")] = {\n required: \"Vui lòng chọn phiên bản cần cài đặt!\"\n };\n break;\n }\n });\n form.validate().settings.rules = formRule;\n form.validate().settings.messages = formMessage;\n }\n }\n $('.btn-order').click(function () {\n var promotion = $('input[name=\"promotion_code\"]').val();\n var form = $('.form-submit__oder');\n if (form.valid()) {\n form.append(\"\"));\n form.submit();\n }\n });\n $('body').on('click', '.btn-reinstall', function () {\n appendOsGroup();\n $('input.form-action').empty().val('reinstall');\n });\n $('#os_group_id').change(function () {\n var value = Number($(this).find('option:selected').val());\n if (value && value !== 0) {\n appendChild(APIGetVersion, 'os_version', {\n group: value\n });\n }\n });\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvbWFpbi5qcyIsIm5hbWVzIjpbImpRdWVyeSIsImRvY3VtZW50IiwicmVhZHkiLCIkIiwidG9vbHRpcFRyaWdnZXJMaXN0Iiwic2xpY2UiLCJjYWxsIiwicXVlcnlTZWxlY3RvckFsbCIsIm1hcCIsInRvb2x0aXBUcmlnZ2VyRWwiLCJib290c3RyYXAiLCJUb29sdGlwIiwiY2xpY2siLCJwYXNzd29yZCIsInBhcmVudCIsImZpbmQiLCJhdHRyIiwicmVtb3ZlQ2xhc3MiLCJhZGRDbGFzcyIsImNoYW5nZSIsInNlbGVjdGVkIiwidmFsIiwib3NfaWQiLCJvc192ZXJzaW9uX2lkIiwicHJvZHVjdF9pZCIsImNvbmNhdCIsImVtcHR5IiwiZWxlbWVudCIsInRhcmdldCIsImtleSIsImFwcGVuZENoYW5nZUNhcnQiLCJlbGVtZW50UGFyZW50IiwicHJvZHVjdEVsZW1lbnQiLCJlbGVtZW50Q2hhbmdlIiwic3RlcCIsIk51bWJlciIsIm1pbiIsInByaWNlIiwicXVhbnRpdHkiLCJhcHBlbmRBZGRvbkNhcnQiLCJtYXgiLCJsZW5ndGgiLCJhbGxQcm9kdWN0IiwiZm9ybSIsInZhbGlkYXRlIiwib25mb2N1c291dCIsIm9ua2V5dXAiLCJvbmNsaWNrIiwiaWdub3JlIiwiZm9ybVJ1bGUiLCJzZXR0aW5ncyIsInJ1bGVzIiwiZm9ybU1lc3NhZ2UiLCJtZXNzYWdlcyIsImZvckVhY2giLCJpbmRleCIsInJlcXVpcmVkIiwicHJvbW90aW9uIiwidmFsaWQiLCJhcHBlbmQiLCJzdWJtaXQiLCJvbiIsImFwcGVuZE9zR3JvdXAiLCJ2YWx1ZSIsImFwcGVuZENoaWxkIiwiQVBJR2V0VmVyc2lvbiIsImdyb3VwIl0sInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvbWFpbi5qcz9mZGFjIl0sInNvdXJjZXNDb250ZW50IjpbImpRdWVyeShkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24gKCQpe1xyXG5cclxuICAgIGxldCB0b29sdGlwVHJpZ2dlckxpc3QgPSBbXS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLWJzLXRvZ2dsZT1cInRvb2x0aXBcIl0nKSlcclxuICAgIHRvb2x0aXBUcmlnZ2VyTGlzdC5tYXAoZnVuY3Rpb24gKHRvb2x0aXBUcmlnZ2VyRWwpIHtcclxuICAgICAgICByZXR1cm4gbmV3IGJvb3RzdHJhcC5Ub29sdGlwKHRvb2x0aXBUcmlnZ2VyRWwpXHJcbiAgICB9KVxyXG4gICAgJCgnLnBhc3N3b3JkLXRvZ2dsZS1pY29uJykuY2xpY2soZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGxldCBwYXNzd29yZCA9ICQodGhpcykucGFyZW50KCkuZmluZCgnaW5wdXQnKVxyXG5cclxuICAgICAgICBpZiAocGFzc3dvcmQuYXR0cihcInR5cGVcIikgPT09IFwicGFzc3dvcmRcIikge1xyXG4gICAgICAgICAgICBwYXNzd29yZC5hdHRyKFwidHlwZVwiLCBcInRleHRcIilcclxuICAgICAgICAgICAgJCh0aGlzKS5maW5kKCdpJykucmVtb3ZlQ2xhc3MoXCJmYS1leWUtc2xhc2hcIik7XHJcbiAgICAgICAgICAgICQodGhpcykuZmluZCgnaScpLmFkZENsYXNzKFwiZmEtZXllXCIpO1xyXG5cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBwYXNzd29yZC5hdHRyKFwidHlwZVwiLCBcInBhc3N3b3JkXCIpXHJcbiAgICAgICAgICAgICQodGhpcykuZmluZCgnaScpLmFkZENsYXNzKFwiZmEtZXllLXNsYXNoXCIpO1xyXG4gICAgICAgICAgICAkKHRoaXMpLmZpbmQoJ2knKS5yZW1vdmVDbGFzcyhcImZhLWV5ZVwiKTtcclxuICAgICAgICB9XHJcbiAgICB9KVxyXG5cclxuICAgICQoJy5zZWxlY3QtdmVyc2lvbl9fb3MnKS5jaGFuZ2UoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGxldCBzZWxlY3RlZCA9ICQodGhpcykuZmluZCgnb3B0aW9uOnNlbGVjdGVkJykudmFsKCk7XHJcbiAgICAgICAgaWYgKHNlbGVjdGVkID09PSAwKSByZXR1cm4gdGhpcztcclxuICAgICAgICBsZXQgcGFyZW50ID0gJCh0aGlzKS5wYXJlbnQoKS5wYXJlbnQoKS5wYXJlbnQoKTtcclxuICAgICAgICBwYXJlbnQucGFyZW50KCkuZmluZCgnLmJveC1vc19jZW50ZXInKS5yZW1vdmVDbGFzcygnYWN0aXZlJyk7XHJcbiAgICAgICAgcGFyZW50LmFkZENsYXNzKCdhY3RpdmUnKVxyXG4gICAgICAgIGxldCBvc19pZCA9IHBhcmVudC5hdHRyKCdkYXRhLW9zJyk7XHJcbiAgICAgICAgbGV0IG9zX3ZlcnNpb25faWQgPSBzZWxlY3RlZDtcclxuICAgICAgICBsZXQgcHJvZHVjdF9pZCA9IHBhcmVudC5wYXJlbnQoKS5wYXJlbnQoKS5wYXJlbnQoKS5hdHRyKCdkYXRhLXByb2R1Y3QnKTtcclxuICAgICAgICBwYXJlbnQucGFyZW50KCkuZmluZChgaW5wdXRbbmFtZT1cInZwc1ske3Byb2R1Y3RfaWR9XVtvc19pZF1cIl1gKS5lbXB0eSgpLnZhbChvc19pZClcclxuICAgICAgICBwYXJlbnQucGFyZW50KCkuZmluZChgaW5wdXRbbmFtZT1cInZwc1ske3Byb2R1Y3RfaWR9XVtvc192ZXJzaW9uX2lkXVwiXWApLmVtcHR5KCkudmFsKG9zX3ZlcnNpb25faWQpXHJcbiAgICB9KTtcclxuXHJcbiAgICAkKCcudGltZS1idXlfX2NoYW5nZScpLmNoYW5nZShmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgbGV0IGVsZW1lbnQgPSAkKHRoaXMpLnBhcmVudCgpLnBhcmVudCgpLnBhcmVudCgpLnBhcmVudCgpO1xyXG4gICAgICAgIGxldCB0YXJnZXQgPSBlbGVtZW50LmF0dHIoJ2RhdGEtdGFyZ2V0Jyk7XHJcbiAgICAgICAgbGV0IGtleSA9IGVsZW1lbnQuYXR0cignZGF0YS1wcm9kdWN0Jyk7XHJcblxyXG4gICAgICAgIGFwcGVuZENoYW5nZUNhcnQodGFyZ2V0LCBrZXkpXHJcbiAgICB9KVxyXG5cclxuICAgIC8qIGRvd25ncmFkZSBhZGQgb24gKi9cclxuICAgICQoJ2lucHV0Lm1pbnVzLmlzLWZvcm0nKS5jbGljayhmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgbGV0IGVsZW1lbnRQYXJlbnQgPSAkKHRoaXMpLnBhcmVudCgpO1xyXG4gICAgICAgIGxldCBwcm9kdWN0RWxlbWVudCA9IGVsZW1lbnRQYXJlbnQucGFyZW50KCkucGFyZW50KCkucGFyZW50KCkucGFyZW50KCkucGFyZW50KCk7XHJcbiAgICAgICAgbGV0IGVsZW1lbnRDaGFuZ2UgPSBlbGVtZW50UGFyZW50LmZpbmQoJy5pbnB1dC1xdHknKTtcclxuICAgICAgICBsZXQgc3RlcCA9IE51bWJlcihlbGVtZW50Q2hhbmdlLmF0dHIoJ3N0ZXAnKSk7XHJcbiAgICAgICAgbGV0IG1pbiA9IE51bWJlcihlbGVtZW50Q2hhbmdlLmF0dHIoJ21pbicpKTtcclxuICAgICAgICBsZXQgcHJpY2UgPSBOdW1iZXIoZWxlbWVudENoYW5nZS5hdHRyKCdkYXRhLXByaWNlJykpO1xyXG4gICAgICAgIGxldCB0YXJnZXQgPSBlbGVtZW50Q2hhbmdlLmF0dHIoJ2RhdGEtbmFtZScpO1xyXG4gICAgICAgIGxldCBxdWFudGl0eSA9IE51bWJlcihlbGVtZW50Q2hhbmdlLnZhbCgpKTtcclxuXHJcbiAgICAgICAgcXVhbnRpdHkgLT0gc3RlcDtcclxuXHJcbiAgICAgICAgaWYgKG1pbiA+IHF1YW50aXR5KSB7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGVsZW1lbnRDaGFuZ2UuZW1wdHkoKS52YWwocXVhbnRpdHkpXHJcblxyXG4gICAgICAgIGFwcGVuZEFkZG9uQ2FydCh0YXJnZXQsIHByaWNlLCBxdWFudGl0eSwgc3RlcCwgXCItXCIsIHByb2R1Y3RFbGVtZW50LmF0dHIoJ2RhdGEtcHJvZHVjdCcpLCBwcm9kdWN0RWxlbWVudC5hdHRyKCdkYXRhLXRhcmdldCcpKTtcclxuXHJcbiAgICB9KVxyXG5cclxuICAgIC8qIHVwZ3JhZGUgYWRkIG9uICovXHJcbiAgICAkKCdpbnB1dC5wbHVzLmlzLWZvcm0nKS5jbGljayhmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgbGV0IGVsZW1lbnRQYXJlbnQgPSAkKHRoaXMpLnBhcmVudCgpO1xyXG4gICAgICAgIGxldCBwcm9kdWN0RWxlbWVudCA9IGVsZW1lbnRQYXJlbnQucGFyZW50KCkucGFyZW50KCkucGFyZW50KCkucGFyZW50KCkucGFyZW50KCk7XHJcbiAgICAgICAgbGV0IGVsZW1lbnRDaGFuZ2UgPSBlbGVtZW50UGFyZW50LmZpbmQoJy5pbnB1dC1xdHknKTtcclxuICAgICAgICBsZXQgc3RlcCA9IE51bWJlcihlbGVtZW50Q2hhbmdlLmF0dHIoJ3N0ZXAnKSk7XHJcbiAgICAgICAgbGV0IG1heCA9IE51bWJlcihlbGVtZW50Q2hhbmdlLmF0dHIoJ21heCcpKTtcclxuICAgICAgICBsZXQgcHJpY2UgPSBOdW1iZXIoZWxlbWVudENoYW5nZS5hdHRyKCdkYXRhLXByaWNlJykpO1xyXG4gICAgICAgIGxldCB0YXJnZXQgPSBlbGVtZW50Q2hhbmdlLmF0dHIoJ2RhdGEtbmFtZScpO1xyXG4gICAgICAgIGxldCBxdWFudGl0eSA9IE51bWJlcihlbGVtZW50Q2hhbmdlLnZhbCgpKTtcclxuXHJcbiAgICAgICAgcXVhbnRpdHkgKz0gc3RlcDtcclxuXHJcbiAgICAgICAgaWYgKHF1YW50aXR5ID4gbWF4KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxlbWVudENoYW5nZS5lbXB0eSgpLnZhbChxdWFudGl0eSlcclxuICAgICAgICBhcHBlbmRBZGRvbkNhcnQodGFyZ2V0LCBwcmljZSwgcXVhbnRpdHksIHN0ZXAsIFwiK1wiLCBwcm9kdWN0RWxlbWVudC5hdHRyKCdkYXRhLXByb2R1Y3QnKSwgcHJvZHVjdEVsZW1lbnQuYXR0cignZGF0YS10YXJnZXQnKSk7XHJcbiAgICB9KVxyXG5cclxuICAgIC8qIFJ1bGVzIHZhbGlkYXRlIGZvcm0gT2RlciBhdCBDYXJ0IFBhZ2UgKi9cclxuICAgIGlmICgkKCcuZm9ybS1zdWJtaXRfX29kZXInKS5sZW5ndGgpIHtcclxuICAgICAgICBsZXQgYWxsUHJvZHVjdCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5yb3ctcHJvZHVjdF9faXRlbScpO1xyXG4gICAgICAgIGlmIChhbGxQcm9kdWN0Lmxlbmd0aCkge1xyXG4gICAgICAgICAgICBsZXQgZm9ybSA9ICQoXCIuZm9ybS1zdWJtaXRfX29kZXJcIilcclxuICAgICAgICAgICAgZm9ybS52YWxpZGF0ZSh7XHJcbiAgICAgICAgICAgICAgICBvbmZvY3Vzb3V0OiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIG9ua2V5dXA6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgb25jbGljazogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICBpZ25vcmU6IFwiOmhpZGRlbjpub3QoJy5vc19zZWxlY3RfaGlkZGVuJylcIlxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICBsZXQgZm9ybVJ1bGUgPSBmb3JtLnZhbGlkYXRlKCkuc2V0dGluZ3MucnVsZXM7XHJcbiAgICAgICAgICAgIGxldCBmb3JtTWVzc2FnZSA9IGZvcm0udmFsaWRhdGUoKS5zZXR0aW5ncy5tZXNzYWdlcztcclxuICAgICAgICAgICAgYWxsUHJvZHVjdC5mb3JFYWNoKChlbGVtZW50LCBpbmRleCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgc3dpdGNoICgkKGVsZW1lbnQpLmF0dHIoJ2RhdGEtdGFyZ2V0JykpIHtcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiaG9zdGluZ1wiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtUnVsZVtgaG9zdGluZ1ske2luZGV4fV1bdGltZV9idXldYF0gPSBcInJlcXVpcmVkXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1NZXNzYWdlW2Bob3N0aW5nWyR7aW5kZXh9XVt0aW1lX2J1eV1gXSA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkOiBcIlZ1aSBsw7JuZyBjaOG7jW4gdGjhu51pIGdpYW4gdGhhbmggdG/DoW4hXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1SdWxlW2Bob3N0aW5nWyR7aW5kZXh9XVtkb21haW5dYF0gPSBcInJlcXVpcmVkXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1NZXNzYWdlW2Bob3N0aW5nWyR7aW5kZXh9XVtkb21haW5dYF0gPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZDogXCJWdWkgbMOybmcgbmjhuq1wIHTDqm4gbWnhu4FuIMSR4buDIGvDrWNoIGhv4bqhdCFcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcInZwc1wiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtUnVsZVtgdnBzWyR7aW5kZXh9XVt0aW1lX2J1eV1gXSA9IFwicmVxdWlyZWRcIjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybU1lc3NhZ2VbYHZwc1ske2luZGV4fV1bdGltZV9idXldYF0gPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZDogXCJWdWkgbMOybmcgY2jhu41uIHRo4budaSBnaWFuIHRoYW5oIHRvw6FuIVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtUnVsZVtgdnBzWyR7aW5kZXh9XVtob3N0bmFtZV1gXSA9IFwicmVxdWlyZWRcIjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybU1lc3NhZ2VbYHZwc1ske2luZGV4fV1baG9zdG5hbWVdYF0gPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZDogXCJWdWkgbMOybmcgbmjhuq1wIGhvc3RuYW1lIVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtUnVsZVtgdnBzWyR7aW5kZXh9XVtvc19pZF1gXSA9IFwicmVxdWlyZWRcIjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybU1lc3NhZ2VbYHZwc1ske2luZGV4fV1bb3NfaWRdYF0gPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZDogXCJWdWkgbMOybmcgY2jhu41uIGjhu4cgxJFp4buBdSBow6BuaCFcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybVJ1bGVbYHZwc1ske2luZGV4fV1bb3NfdmVyc2lvbl9pZF1gXSA9IFwicmVxdWlyZWRcIjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybU1lc3NhZ2VbYHZwc1ske2luZGV4fV1bb3NfdmVyc2lvbl9pZF1gXSA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkOiBcIlZ1aSBsw7JuZyBjaOG7jW4gcGhpw6puIGLhuqNuIGPhuqduIGPDoGkgxJHhurd0IVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICBmb3JtLnZhbGlkYXRlKCkuc2V0dGluZ3MucnVsZXMgPSBmb3JtUnVsZTtcclxuICAgICAgICAgICAgZm9ybS52YWxpZGF0ZSgpLnNldHRpbmdzLm1lc3NhZ2VzID0gZm9ybU1lc3NhZ2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICAkKCcuYnRuLW9yZGVyJykuY2xpY2soZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGxldCBwcm9tb3Rpb24gPSAkKCdpbnB1dFtuYW1lPVwicHJvbW90aW9uX2NvZGVcIl0nKS52YWwoKVxyXG4gICAgICAgIGxldCBmb3JtID0gJCgnLmZvcm0tc3VibWl0X19vZGVyJylcclxuICAgICAgICBpZiAoZm9ybS52YWxpZCgpKSB7XHJcbiAgICAgICAgICAgIGZvcm0uYXBwZW5kKGA8aW5wdXQgdHlwZT1cImhpZGRlblwiIG5hbWU9XCJkaXNjb3VudFwiIHZhbHVlPVwiJHtwcm9tb3Rpb259XCI+YCk7XHJcbiAgICAgICAgICAgIGZvcm0uc3VibWl0KClcclxuICAgICAgICB9XHJcblxyXG4gICAgfSlcclxuXHJcbiAgICAkKCdib2R5Jykub24oJ2NsaWNrJywgJy5idG4tcmVpbnN0YWxsJywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGFwcGVuZE9zR3JvdXAoKTtcclxuICAgICAgICAkKCdpbnB1dC5mb3JtLWFjdGlvbicpLmVtcHR5KCkudmFsKCdyZWluc3RhbGwnKTtcclxuICAgIH0pXHJcblxyXG4gICAgJCgnI29zX2dyb3VwX2lkJykuY2hhbmdlKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBsZXQgdmFsdWUgPSBOdW1iZXIoJCh0aGlzKS5maW5kKCdvcHRpb246c2VsZWN0ZWQnKS52YWwoKSk7XHJcblxyXG4gICAgICAgIGlmICh2YWx1ZSAmJiB2YWx1ZSAhPT0gMCkge1xyXG4gICAgICAgICAgICBhcHBlbmRDaGlsZChBUElHZXRWZXJzaW9uLCAnb3NfdmVyc2lvbicsIHtncm91cDogdmFsdWV9KTtcclxuICAgICAgICB9XHJcbiAgICB9KVxyXG5cclxufSlcclxuIl0sIm1hcHBpbmdzIjoiQUFBQUEsTUFBTSxDQUFDQyxRQUFRLENBQUMsQ0FBQ0MsS0FBSyxDQUFDLFVBQVVDLENBQUMsRUFBQztFQUUvQixJQUFJQyxrQkFBa0IsR0FBRyxFQUFFLENBQUNDLEtBQUssQ0FBQ0MsSUFBSSxDQUFDTCxRQUFR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\n//# sourceURL=webpack-internal:///./resources/js/main.js\n"); /***/ }) diff --git a/public/js/service/service.min.js b/public/js/service/service.min.js index 5e87015..3951aca 100644 --- a/public/js/service/service.min.js +++ b/public/js/service/service.min.js @@ -15,7 +15,7 @@ \*****************************************/ /***/ (() => { -eval("function _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nfunction _regeneratorRuntime() { \"use strict\"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return e; }; var t, e = {}, r = Object.prototype, n = r.hasOwnProperty, o = Object.defineProperty || function (t, e, r) { t[e] = r.value; }, i = \"function\" == typeof Symbol ? Symbol : {}, a = i.iterator || \"@@iterator\", c = i.asyncIterator || \"@@asyncIterator\", u = i.toStringTag || \"@@toStringTag\"; function define(t, e, r) { return Object.defineProperty(t, e, { value: r, enumerable: !0, configurable: !0, writable: !0 }), t[e]; } try { define({}, \"\"); } catch (t) { define = function define(t, e, r) { return t[e] = r; }; } function wrap(t, e, r, n) { var i = e && e.prototype instanceof Generator ? e : Generator, a = Object.create(i.prototype), c = new Context(n || []); return o(a, \"_invoke\", { value: makeInvokeMethod(t, r, c) }), a; } function tryCatch(t, e, r) { try { return { type: \"normal\", arg: t.call(e, r) }; } catch (t) { return { type: \"throw\", arg: t }; } } e.wrap = wrap; var h = \"suspendedStart\", l = \"suspendedYield\", f = \"executing\", s = \"completed\", y = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var p = {}; define(p, a, function () { return this; }); var d = Object.getPrototypeOf, v = d && d(d(values([]))); v && v !== r && n.call(v, a) && (p = v); var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p); function defineIteratorMethods(t) { [\"next\", \"throw\", \"return\"].forEach(function (e) { define(t, e, function (t) { return this._invoke(e, t); }); }); } function AsyncIterator(t, e) { function invoke(r, o, i, a) { var c = tryCatch(t[r], t, o); if (\"throw\" !== c.type) { var u = c.arg, h = u.value; return h && \"object\" == _typeof(h) && n.call(h, \"__await\") ? e.resolve(h.__await).then(function (t) { invoke(\"next\", t, i, a); }, function (t) { invoke(\"throw\", t, i, a); }) : e.resolve(h).then(function (t) { u.value = t, i(u); }, function (t) { return invoke(\"throw\", t, i, a); }); } a(c.arg); } var r; o(this, \"_invoke\", { value: function value(t, n) { function callInvokeWithMethodAndArg() { return new e(function (e, r) { invoke(t, n, e, r); }); } return r = r ? r.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(e, r, n) { var o = h; return function (i, a) { if (o === f) throw Error(\"Generator is already running\"); if (o === s) { if (\"throw\" === i) throw a; return { value: t, done: !0 }; } for (n.method = i, n.arg = a;;) { var c = n.delegate; if (c) { var u = maybeInvokeDelegate(c, n); if (u) { if (u === y) continue; return u; } } if (\"next\" === n.method) n.sent = n._sent = n.arg;else if (\"throw\" === n.method) { if (o === h) throw o = s, n.arg; n.dispatchException(n.arg); } else \"return\" === n.method && n.abrupt(\"return\", n.arg); o = f; var p = tryCatch(e, r, n); if (\"normal\" === p.type) { if (o = n.done ? s : l, p.arg === y) continue; return { value: p.arg, done: n.done }; } \"throw\" === p.type && (o = s, n.method = \"throw\", n.arg = p.arg); } }; } function maybeInvokeDelegate(e, r) { var n = r.method, o = e.iterator[n]; if (o === t) return r.delegate = null, \"throw\" === n && e.iterator[\"return\"] && (r.method = \"return\", r.arg = t, maybeInvokeDelegate(e, r), \"throw\" === r.method) || \"return\" !== n && (r.method = \"throw\", r.arg = new TypeError(\"The iterator does not provide a '\" + n + \"' method\")), y; var i = tryCatch(o, e.iterator, r.arg); if (\"throw\" === i.type) return r.method = \"throw\", r.arg = i.arg, r.delegate = null, y; var a = i.arg; return a ? a.done ? (r[e.resultName] = a.value, r.next = e.nextLoc, \"return\" !== r.method && (r.method = \"next\", r.arg = t), r.delegate = null, y) : a : (r.method = \"throw\", r.arg = new TypeError(\"iterator result is not an object\"), r.delegate = null, y); } function pushTryEntry(t) { var e = { tryLoc: t[0] }; 1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e); } function resetTryEntry(t) { var e = t.completion || {}; e.type = \"normal\", delete e.arg, t.completion = e; } function Context(t) { this.tryEntries = [{ tryLoc: \"root\" }], t.forEach(pushTryEntry, this), this.reset(!0); } function values(e) { if (e || \"\" === e) { var r = e[a]; if (r) return r.call(e); if (\"function\" == typeof e.next) return e; if (!isNaN(e.length)) { var o = -1, i = function next() { for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = !1, next; return next.value = t, next.done = !0, next; }; return i.next = i; } } throw new TypeError(_typeof(e) + \" is not iterable\"); } return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, \"constructor\", { value: GeneratorFunctionPrototype, configurable: !0 }), o(GeneratorFunctionPrototype, \"constructor\", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, \"GeneratorFunction\"), e.isGeneratorFunction = function (t) { var e = \"function\" == typeof t && t.constructor; return !!e && (e === GeneratorFunction || \"GeneratorFunction\" === (e.displayName || e.name)); }, e.mark = function (t) { return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, define(t, u, \"GeneratorFunction\")), t.prototype = Object.create(g), t; }, e.awrap = function (t) { return { __await: t }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, c, function () { return this; }), e.AsyncIterator = AsyncIterator, e.async = function (t, r, n, o, i) { void 0 === i && (i = Promise); var a = new AsyncIterator(wrap(t, r, n, o), i); return e.isGeneratorFunction(r) ? a : a.next().then(function (t) { return t.done ? t.value : a.next(); }); }, defineIteratorMethods(g), define(g, u, \"Generator\"), define(g, a, function () { return this; }), define(g, \"toString\", function () { return \"[object Generator]\"; }), e.keys = function (t) { var e = Object(t), r = []; for (var n in e) r.push(n); return r.reverse(), function next() { for (; r.length;) { var t = r.pop(); if (t in e) return next.value = t, next.done = !1, next; } return next.done = !0, next; }; }, e.values = values, Context.prototype = { constructor: Context, reset: function reset(e) { if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = \"next\", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) \"t\" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t); }, stop: function stop() { this.done = !0; var t = this.tryEntries[0].completion; if (\"throw\" === t.type) throw t.arg; return this.rval; }, dispatchException: function dispatchException(e) { if (this.done) throw e; var r = this; function handle(n, o) { return a.type = \"throw\", a.arg = e, r.next = n, o && (r.method = \"next\", r.arg = t), !!o; } for (var o = this.tryEntries.length - 1; o >= 0; --o) { var i = this.tryEntries[o], a = i.completion; if (\"root\" === i.tryLoc) return handle(\"end\"); if (i.tryLoc <= this.prev) { var c = n.call(i, \"catchLoc\"), u = n.call(i, \"finallyLoc\"); if (c && u) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } else if (c) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); } else { if (!u) throw Error(\"try statement without catch or finally\"); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } } } }, abrupt: function abrupt(t, e) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var o = this.tryEntries[r]; if (o.tryLoc <= this.prev && n.call(o, \"finallyLoc\") && this.prev < o.finallyLoc) { var i = o; break; } } i && (\"break\" === t || \"continue\" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null); var a = i ? i.completion : {}; return a.type = t, a.arg = e, i ? (this.method = \"next\", this.next = i.finallyLoc, y) : this.complete(a); }, complete: function complete(t, e) { if (\"throw\" === t.type) throw t.arg; return \"break\" === t.type || \"continue\" === t.type ? this.next = t.arg : \"return\" === t.type ? (this.rval = this.arg = t.arg, this.method = \"return\", this.next = \"end\") : \"normal\" === t.type && e && (this.next = e), y; }, finish: function finish(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y; } }, \"catch\": function _catch(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.tryLoc === t) { var n = r.completion; if (\"throw\" === n.type) { var o = n.arg; resetTryEntry(r); } return o; } } throw Error(\"illegal catch attempt\"); }, delegateYield: function delegateYield(e, r, n) { return this.delegate = { iterator: values(e), resultName: r, nextLoc: n }, \"next\" === this.method && (this.arg = t), y; } }, e; }\nfunction asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }\nfunction _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"next\", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"throw\", n); } _next(void 0); }); }; }\n// Global variables - NO SENSITIVE DATA (no tokens)\nvar invoiceId;\nvar vmId;\nvar vmHostname;\nvar csrfToken;\n\n// Initialize variables from data attributes or global variables\nfunction initializeVariables() {\n // Get data from meta tags or global variables set in Blade template\n var metaInvoiceId = document.querySelector('meta[name=\"invoice-id\"]');\n var metaVmId = document.querySelector('meta[name=\"vm-id\"]');\n var metaVmHostname = document.querySelector('meta[name=\"vm-hostname\"]');\n var metaCsrfToken = document.querySelector('meta[name=\"csrf-token\"]');\n invoiceId = metaInvoiceId ? metaInvoiceId.getAttribute('content') : window.invoiceId;\n vmId = metaVmId ? metaVmId.getAttribute('content') : window.vmId;\n vmHostname = metaVmHostname ? metaVmHostname.getAttribute('content') : window.vmHostname;\n csrfToken = metaCsrfToken ? metaCsrfToken.getAttribute('content') : window.csrfToken;\n}\n\n// Cấu hình toast nếu có thể\nif (typeof FuiToast !== 'undefined' && FuiToast.config) {\n FuiToast.config({\n position: 'top-center'\n });\n}\nfunction showNotification(message) {\n var type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'success';\n if (type === 'success') {\n FuiToast.success(message);\n } else {\n FuiToast.error(message);\n }\n}\nfunction createSnapshot() {\n return _createSnapshot.apply(this, arguments);\n} // Handle snapshot form submission with loading notification\nfunction _createSnapshot() {\n _createSnapshot = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee5() {\n var snapshotBtn, requestBody, headers, snapshotPromise;\n return _regeneratorRuntime().wrap(function _callee5$(_context5) {\n while (1) switch (_context5.prev = _context5.next) {\n case 0:\n snapshotBtn = document.getElementById('createSnapshotButton');\n if (!(snapshotBtn && snapshotBtn.disabled)) {\n _context5.next = 3;\n break;\n }\n return _context5.abrupt(\"return\");\n case 3:\n requestBody = {\n product_id: vmId\n };\n headers = {\n 'Content-Type': 'application/json',\n 'Accept': 'application/json',\n 'X-CSRF-TOKEN': csrfToken\n // NO Authorization header - using session auth\n };\n snapshotPromise = fetch('/secure/create-snapshots', {\n method: 'POST',\n headers: headers,\n body: JSON.stringify(requestBody),\n credentials: 'same-origin'\n }).then(/*#__PURE__*/function () {\n var _ref = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee4(response) {\n var data, text, errorMessage;\n return _regeneratorRuntime().wrap(function _callee4$(_context4) {\n while (1) switch (_context4.prev = _context4.next) {\n case 0:\n if (!(response.redirected || response.status === 401)) {\n _context4.next = 2;\n break;\n }\n throw new Error('Phiên đăng nhập đã hết hạn, vui lòng đăng nhập lại');\n case 2:\n if (!response.redirected) {\n _context4.next = 4;\n break;\n }\n return _context4.abrupt(\"return\", 'Đã gửi yêu cầu tạo snapshot. Quá trình sẽ mất 3-5 phút, vui lòng chờ đợi.');\n case 4:\n _context4.prev = 4;\n _context4.next = 7;\n return response.text();\n case 7:\n text = _context4.sent;\n _context4.prev = 8;\n data = JSON.parse(text);\n _context4.next = 20;\n break;\n case 12:\n _context4.prev = 12;\n _context4.t0 = _context4[\"catch\"](8);\n if (!(text.includes('success') || response.ok)) {\n _context4.next = 19;\n break;\n }\n setTimeout(function () {\n location.reload();\n }, 2000);\n return _context4.abrupt(\"return\", 'Đã gửi yêu cầu tạo snapshot. Quá trình sẽ mất 3-5 phút, vui lòng chờ đợi.');\n case 19:\n throw new Error('Có lỗi xảy ra khi gửi yêu cầu tạo snapshot');\n case 20:\n _context4.next = 25;\n break;\n case 22:\n _context4.prev = 22;\n _context4.t1 = _context4[\"catch\"](4);\n throw new Error('Lỗi định dạng dữ liệu từ máy chủ');\n case 25:\n if (!(data && !data.error)) {\n _context4.next = 30;\n break;\n }\n setTimeout(function () {\n location.reload();\n }, 2000);\n return _context4.abrupt(\"return\", data.message || 'Đã gửi yêu cầu tạo snapshot. Quá trình sẽ mất 3-5 phút, vui lòng chờ đợi.');\n case 30:\n errorMessage = 'Có lỗi xảy ra khi tạo snapshot';\n if (data && data.message) {\n if (_typeof(data.message) === 'object') {\n if (data.message.messages && data.message.messages.length > 0) {\n errorMessage = data.message.messages[0].default_message || data.message.messages[0].message || 'Có lỗi xảy ra';\n } else if (data.message.error_type) {\n errorMessage = \"L\\u1ED7i: \".concat(data.message.error_type);\n } else {\n errorMessage = 'Có lỗi xảy ra từ hệ thống';\n }\n } else {\n errorMessage = data.message;\n }\n } else if (data && data.value && data.value.messages && data.value.messages.length > 0) {\n errorMessage = data.value.messages[0].default_message;\n } else if (typeof data === 'string') {\n errorMessage = data;\n } else if (data && data.error) {\n if (_typeof(data.error) === 'object') {\n if (data.error.message) {\n errorMessage = data.error.message;\n } else if (data.error.toString && data.error.toString() !== '[object Object]') {\n errorMessage = data.error.toString();\n } else {\n errorMessage = 'Có lỗi xảy ra từ hệ thống';\n }\n } else {\n errorMessage = data.error;\n }\n }\n throw new Error(errorMessage);\n case 33:\n case \"end\":\n return _context4.stop();\n }\n }, _callee4, null, [[4, 22], [8, 12]]);\n }));\n return function (_x) {\n return _ref.apply(this, arguments);\n };\n }());\n FuiToast.promise(snapshotPromise, {\n loading: 'Đang gửi yêu cầu tạo snapshot... (Quá trình mất 3-5 phút vui lòng giữ trang không tắt!)',\n success: function success(data) {\n return data;\n },\n error: function error(_error2) {\n console.error(_error2);\n return _error2.message || 'Có lỗi xảy ra khi tạo snapshot';\n }\n }, {\n isClose: true\n });\n case 7:\n case \"end\":\n return _context5.stop();\n }\n }, _callee5);\n }));\n return _createSnapshot.apply(this, arguments);\n}\nfunction handleSnapshotSubmit(event) {\n event.preventDefault();\n var snapshotPromise = new Promise(function (resolve, reject) {\n var form = document.getElementById('snapshotForm');\n var formData = new FormData(form);\n fetch(form.action, {\n method: 'POST',\n body: formData,\n headers: {\n 'X-CSRF-TOKEN': csrfToken\n }\n }).then(function (response) {\n if (response.redirected) {\n resolve('Đã gửi yêu cầu tạo snapshot! Quá trình sẽ mất 3-5 phút.');\n window.location.href = response.url;\n } else if (response.ok) {\n resolve('Đã gửi yêu cầu tạo snapshot! Quá trình sẽ mất 3-5 phút.');\n setTimeout(function () {\n window.location.reload();\n }, 2000);\n } else {\n response.text().then(function (text) {\n reject('Có lỗi xảy ra khi gửi yêu cầu tạo snapshot');\n });\n }\n })[\"catch\"](function (error) {\n reject('Lỗi kết nối: ' + error.message);\n });\n });\n if (typeof FuiToast !== 'undefined' && FuiToast.promise) {\n FuiToast.promise(snapshotPromise, {\n loading: 'Đang gửi yêu cầu tạo snapshot...',\n success: function success(data) {\n return data || 'Đã gửi yêu cầu tạo snapshot!';\n },\n error: function error(_error) {\n return _error || 'Có lỗi xảy ra khi gửi yêu cầu tạo snapshot';\n }\n });\n } else {\n if (typeof FuiToast !== 'undefined') {\n FuiToast.loading('Đang gửi yêu cầu tạo snapshot...', {\n duration: 0\n });\n } else {\n alert('Đang gửi yêu cầu tạo snapshot...');\n }\n setTimeout(function () {\n document.getElementById('snapshotForm').submit();\n }, 500);\n }\n}\nfunction startVirtualMachine() {\n return _startVirtualMachine.apply(this, arguments);\n}\nfunction _startVirtualMachine() {\n _startVirtualMachine = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee7() {\n var startBtn, requestBody, headers, startPromise;\n return _regeneratorRuntime().wrap(function _callee7$(_context7) {\n while (1) switch (_context7.prev = _context7.next) {\n case 0:\n startBtn = document.getElementById('startVMButton');\n if (!(startBtn && startBtn.disabled)) {\n _context7.next = 3;\n break;\n }\n return _context7.abrupt(\"return\");\n case 3:\n requestBody = {\n vm_id: vmId\n };\n headers = {\n 'Content-Type': 'application/json',\n 'Accept': 'application/json',\n 'X-CSRF-TOKEN': csrfToken\n // NO Authorization header - using session auth\n };\n startPromise = fetch('/api/secure/start-vm', {\n method: 'POST',\n headers: headers,\n body: JSON.stringify(requestBody),\n credentials: 'same-origin'\n }).then(/*#__PURE__*/function () {\n var _ref2 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee6(response) {\n var data, errorMessage;\n return _regeneratorRuntime().wrap(function _callee6$(_context6) {\n while (1) switch (_context6.prev = _context6.next) {\n case 0:\n if (!(response.redirected || response.status === 401)) {\n _context6.next = 2;\n break;\n }\n throw new Error('Phiên đăng nhập đã hết hạn, vui lòng đăng nhập lại');\n case 2:\n _context6.prev = 2;\n _context6.next = 5;\n return response.json();\n case 5:\n data = _context6.sent;\n _context6.next = 11;\n break;\n case 8:\n _context6.prev = 8;\n _context6.t0 = _context6[\"catch\"](2);\n throw new Error('Lỗi định dạng dữ liệu từ máy chủ');\n case 11:\n if (data.error) {\n _context6.next = 16;\n break;\n }\n setTimeout(function () {\n location.reload();\n }, 2000);\n return _context6.abrupt(\"return\", data.message);\n case 16:\n if (!(data.type === 'com.vmware.vapi.std.errors.already_in_desired_state' || data.message && data.message.error_type === 'ALREADY_IN_DESIRED_STATE')) {\n _context6.next = 21;\n break;\n }\n setTimeout(function () {\n location.reload();\n }, 2000);\n return _context6.abrupt(\"return\", 'Máy chủ đã được bật');\n case 21:\n errorMessage = 'Có lỗi xảy ra';\n if (data.message) {\n if (_typeof(data.message) === 'object') {\n if (data.message.messages && data.message.messages.length > 0) {\n errorMessage = data.message.messages[0].default_message || data.message.messages[0].message || 'Có lỗi xảy ra';\n } else if (data.message.error_type) {\n errorMessage = \"L\\u1ED7i: \".concat(data.message.error_type);\n } else {\n errorMessage = 'Có lỗi xảy ra từ hệ thống';\n }\n } else {\n errorMessage = data.message;\n }\n } else if (data.value && data.value.messages && data.value.messages.length > 0) {\n errorMessage = data.value.messages[0].default_message;\n } else if (typeof data === 'string') {\n errorMessage = data;\n } else if (data.error) {\n if (_typeof(data.error) === 'object') {\n if (data.error.message) {\n errorMessage = data.error.message;\n } else if (data.error.toString && data.error.toString() !== '[object Object]') {\n errorMessage = data.error.toString();\n } else {\n errorMessage = 'Có lỗi xảy ra từ hệ thống';\n }\n } else {\n errorMessage = data.error;\n }\n }\n throw new Error(errorMessage);\n case 24:\n case \"end\":\n return _context6.stop();\n }\n }, _callee6, null, [[2, 8]]);\n }));\n return function (_x2) {\n return _ref2.apply(this, arguments);\n };\n }());\n FuiToast.promise(startPromise, {\n loading: 'Đang khởi động máy ảo...',\n success: function success(data) {\n return data;\n },\n error: function error(_error3) {\n console.error(_error3);\n return _error3.message || 'Có lỗi xảy ra khi khởi động máy ảo';\n }\n }, {\n isClose: true\n });\n case 7:\n case \"end\":\n return _context7.stop();\n }\n }, _callee7);\n }));\n return _startVirtualMachine.apply(this, arguments);\n}\nfunction stopVirtualMachine() {\n return _stopVirtualMachine.apply(this, arguments);\n}\nfunction _stopVirtualMachine() {\n _stopVirtualMachine = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee9() {\n var stopBtn, requestBody, headers, stopPromise;\n return _regeneratorRuntime().wrap(function _callee9$(_context9) {\n while (1) switch (_context9.prev = _context9.next) {\n case 0:\n stopBtn = document.getElementById('stopVMButton');\n if (!(stopBtn && stopBtn.disabled)) {\n _context9.next = 3;\n break;\n }\n return _context9.abrupt(\"return\");\n case 3:\n requestBody = {\n vm_id: vmId\n };\n headers = {\n 'Content-Type': 'application/json',\n 'Accept': 'application/json',\n 'X-CSRF-TOKEN': csrfToken\n // NO Authorization header - using session auth\n };\n stopPromise = fetch('/api/secure/stop-vm', {\n method: 'POST',\n headers: headers,\n body: JSON.stringify(requestBody),\n credentials: 'same-origin'\n }).then(/*#__PURE__*/function () {\n var _ref3 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee8(response) {\n var data, errorMessage;\n return _regeneratorRuntime().wrap(function _callee8$(_context8) {\n while (1) switch (_context8.prev = _context8.next) {\n case 0:\n if (!(response.redirected || response.status === 401)) {\n _context8.next = 2;\n break;\n }\n throw new Error('Phiên đăng nhập đã hết hạn, vui lòng đăng nhập lại');\n case 2:\n _context8.prev = 2;\n _context8.next = 5;\n return response.json();\n case 5:\n data = _context8.sent;\n _context8.next = 11;\n break;\n case 8:\n _context8.prev = 8;\n _context8.t0 = _context8[\"catch\"](2);\n throw new Error('Lỗi định dạng dữ liệu từ máy chủ');\n case 11:\n if (data.error) {\n _context8.next = 16;\n break;\n }\n setTimeout(function () {\n location.reload();\n }, 2000);\n return _context8.abrupt(\"return\", data.message);\n case 16:\n if (!(data.type === 'com.vmware.vapi.std.errors.already_in_desired_state' || data.message && data.message.error_type === 'ALREADY_IN_DESIRED_STATE')) {\n _context8.next = 21;\n break;\n }\n setTimeout(function () {\n location.reload();\n }, 2000);\n return _context8.abrupt(\"return\", 'Máy chủ đã được tắt');\n case 21:\n errorMessage = 'Có lỗi xảy ra';\n if (data.message) {\n if (_typeof(data.message) === 'object') {\n if (data.message.messages && data.message.messages.length > 0) {\n errorMessage = data.message.messages[0].default_message || data.message.messages[0].message || 'Có lỗi xảy ra';\n } else if (data.message.error_type) {\n errorMessage = \"L\\u1ED7i: \".concat(data.message.error_type);\n } else {\n errorMessage = 'Có lỗi xảy ra từ hệ thống';\n }\n } else {\n errorMessage = data.message;\n }\n } else if (data.value && data.value.messages && data.value.messages.length > 0) {\n errorMessage = data.value.messages[0].default_message;\n } else if (typeof data === 'string') {\n errorMessage = data;\n } else if (data.error) {\n if (_typeof(data.error) === 'object') {\n if (data.error.message) {\n errorMessage = data.error.message;\n } else if (data.error.toString && data.error.toString() !== '[object Object]') {\n errorMessage = data.error.toString();\n } else {\n errorMessage = 'Có lỗi xảy ra từ hệ thống';\n }\n } else {\n errorMessage = data.error;\n }\n }\n throw new Error(errorMessage);\n case 24:\n case \"end\":\n return _context8.stop();\n }\n }, _callee8, null, [[2, 8]]);\n }));\n return function (_x3) {\n return _ref3.apply(this, arguments);\n };\n }());\n FuiToast.promise(stopPromise, {\n loading: 'Đang dừng máy ảo...',\n success: function success(data) {\n return data;\n },\n error: function error(_error4) {\n console.error(_error4);\n return _error4.message || 'Có lỗi xảy ra khi dừng máy ảo';\n }\n }, {\n isClose: true\n });\n case 7:\n case \"end\":\n return _context9.stop();\n }\n }, _callee9);\n }));\n return _stopVirtualMachine.apply(this, arguments);\n}\nfunction restartVirtualMachine() {\n return _restartVirtualMachine.apply(this, arguments);\n} // DOM ready\nfunction _restartVirtualMachine() {\n _restartVirtualMachine = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee11() {\n var restartBtn, restartPromise;\n return _regeneratorRuntime().wrap(function _callee11$(_context11) {\n while (1) switch (_context11.prev = _context11.next) {\n case 0:\n restartBtn = document.getElementById('restartVMButton');\n if (!(restartBtn && restartBtn.disabled)) {\n _context11.next = 3;\n break;\n }\n return _context11.abrupt(\"return\");\n case 3:\n restartPromise = fetch(\"/service/\".concat(invoiceId, \"/vm/toggle\"), {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-CSRF-TOKEN': csrfToken\n },\n body: JSON.stringify({\n action: 'restart'\n })\n }).then(/*#__PURE__*/function () {\n var _ref4 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee10(response) {\n var data, errorMessage;\n return _regeneratorRuntime().wrap(function _callee10$(_context10) {\n while (1) switch (_context10.prev = _context10.next) {\n case 0:\n _context10.prev = 0;\n _context10.next = 3;\n return response.json();\n case 3:\n data = _context10.sent;\n _context10.next = 9;\n break;\n case 6:\n _context10.prev = 6;\n _context10.t0 = _context10[\"catch\"](0);\n throw new Error('Lỗi định dạng dữ liệu từ máy chủ');\n case 9:\n if (!data.success) {\n _context10.next = 14;\n break;\n }\n setTimeout(function () {\n location.reload();\n }, 2000);\n return _context10.abrupt(\"return\", data.message);\n case 14:\n errorMessage = 'Có lỗi xảy ra';\n if (data.message) {\n if (_typeof(data.message) === 'object') {\n if (data.message.messages && data.message.messages.length > 0) {\n errorMessage = data.message.messages[0].default_message || data.message.messages[0].message || 'Có lỗi xảy ra';\n } else if (data.message.error_type) {\n errorMessage = \"L\\u1ED7i: \".concat(data.message.error_type);\n } else {\n errorMessage = 'Có lỗi xảy ra từ hệ thống';\n }\n } else {\n errorMessage = data.message;\n }\n } else if (data.error) {\n if (_typeof(data.error) === 'object') {\n if (data.error.message) {\n errorMessage = data.error.message;\n } else if (data.error.toString && data.error.toString() !== '[object Object]') {\n errorMessage = data.error.toString();\n } else {\n errorMessage = 'Có lỗi xảy ra từ hệ thống';\n }\n } else {\n errorMessage = data.error;\n }\n } else if (typeof data === 'string') {\n errorMessage = data;\n }\n throw new Error(errorMessage);\n case 17:\n case \"end\":\n return _context10.stop();\n }\n }, _callee10, null, [[0, 6]]);\n }));\n return function (_x4) {\n return _ref4.apply(this, arguments);\n };\n }());\n FuiToast.promise(restartPromise, {\n loading: 'Đang khởi động lại máy ảo...',\n success: function success(data) {\n return data;\n },\n error: function error(_error5) {\n console.error(_error5);\n return _error5.message || 'Có lỗi xảy ra khi khởi động lại máy ảo';\n }\n }, {\n isClose: true\n });\n case 5:\n case \"end\":\n return _context11.stop();\n }\n }, _callee11);\n }));\n return _restartVirtualMachine.apply(this, arguments);\n}\ndocument.addEventListener('DOMContentLoaded', function () {\n // Initialize variables\n initializeVariables();\n var startBtn = document.getElementById('startVMButton');\n var stopBtn = document.getElementById('stopVMButton');\n var restartBtn = document.getElementById('restartVMButton');\n var snapshotBtn = document.getElementById('createSnapshotButton');\n if (startBtn) {\n startBtn.addEventListener('click', function (e) {\n e.preventDefault();\n e.stopPropagation();\n startVirtualMachine();\n });\n }\n if (stopBtn) {\n stopBtn.addEventListener('click', function (e) {\n e.preventDefault();\n e.stopPropagation();\n stopVirtualMachine();\n });\n }\n if (restartBtn) {\n restartBtn.addEventListener('click', function (e) {\n e.preventDefault();\n e.stopPropagation();\n restartVirtualMachine();\n });\n }\n if (snapshotBtn) {\n snapshotBtn.addEventListener('click', function (e) {\n e.preventDefault();\n e.stopPropagation();\n createSnapshot();\n });\n }\n});\n\n// Snapshot Table Management\nfunction snapshotTable() {\n return {\n loading: false,\n snapshots: [],\n error: null,\n fetchSnapshots: function fetchSnapshots() {\n var _this = this;\n return _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee() {\n var vmId, response, data;\n return _regeneratorRuntime().wrap(function _callee$(_context) {\n while (1) switch (_context.prev = _context.next) {\n case 0:\n _this.loading = true;\n _this.error = null;\n vmId = window.vmId || '';\n if (vmId) {\n _context.next = 7;\n break;\n }\n _this.loading = false;\n _this.error = 'Không tìm thấy ID máy ảo';\n return _context.abrupt(\"return\");\n case 7:\n _context.prev = 7;\n _context.next = 10;\n return fetch(\"/secure/get-snapshots?product_id=\".concat(vmId), {\n method: 'GET',\n headers: {\n 'Accept': 'application/json',\n 'X-CSRF-TOKEN': csrfToken,\n 'Cache-Control': 'no-cache'\n },\n credentials: 'same-origin'\n });\n case 10:\n response = _context.sent;\n if (response.ok) {\n _context.next = 13;\n break;\n }\n throw new Error(\"HTTP error! status: \".concat(response.status));\n case 13:\n _context.next = 15;\n return response.json();\n case 15:\n data = _context.sent;\n // Kiểm tra response structure từ API thực tế\n if (data.error === false && data.data && data.data.snapshots) {\n _this.snapshots = data.data.snapshots;\n } else if (data.error === true) {\n _this.error = data.message || 'Có lỗi xảy ra khi tải danh sách snapshot';\n _this.snapshots = [];\n } else if (data.snapshots) {\n // Fallback cho trường hợp data trực tiếp\n _this.snapshots = data.snapshots;\n } else {\n _this.snapshots = [];\n }\n _context.next = 24;\n break;\n case 19:\n _context.prev = 19;\n _context.t0 = _context[\"catch\"](7);\n console.error('Error fetching snapshots:', _context.t0);\n _this.error = 'Không thể kết nối đến máy chủ';\n _this.snapshots = [];\n case 24:\n _context.prev = 24;\n _this.loading = false;\n return _context.finish(24);\n case 27:\n case \"end\":\n return _context.stop();\n }\n }, _callee, null, [[7, 19, 24, 27]]);\n }))();\n },\n formatSize: function formatSize(sizeGB, sizeMB) {\n // Convert to bytes first\n var bytes = 0;\n if (sizeGB) {\n bytes = parseFloat(sizeGB) * 1024 * 1024 * 1024; // GB to bytes\n } else if (sizeMB) {\n bytes = parseFloat(sizeMB) * 1024 * 1024; // MB to bytes\n }\n if (bytes === 0) return '0 B';\n var units = ['B', 'KB', 'MB', 'GB', 'TB'];\n var k = 1024;\n var i = Math.floor(Math.log(bytes) / Math.log(k));\n var size = parseFloat((bytes / Math.pow(k, i)).toFixed(2));\n return size + ' ' + units[i];\n },\n deleteSnapshot: function deleteSnapshot(snapshotName) {\n var _this2 = this;\n return _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee2() {\n var result, response, data;\n return _regeneratorRuntime().wrap(function _callee2$(_context2) {\n while (1) switch (_context2.prev = _context2.next) {\n case 0:\n _context2.next = 2;\n return Swal.fire({\n title: 'Xác nhận xóa',\n text: \"B\\u1EA1n c\\xF3 ch\\u1EAFc ch\\u1EAFn mu\\u1ED1n x\\xF3a snapshot \\\"\".concat(snapshotName, \"\\\"? H\\xE0nh \\u0111\\u1ED9ng n\\xE0y kh\\xF4ng th\\u1EC3 ho\\xE0n t\\xE1c.\"),\n icon: 'warning',\n showCancelButton: true,\n confirmButtonColor: '#d33',\n cancelButtonColor: '#3085d6',\n confirmButtonText: 'Xóa',\n cancelButtonText: 'Hủy bỏ',\n reverseButtons: true\n });\n case 2:\n result = _context2.sent;\n if (result.isConfirmed) {\n _context2.next = 5;\n break;\n }\n return _context2.abrupt(\"return\");\n case 5:\n _context2.prev = 5;\n _context2.next = 8;\n return fetch('/secure/remove-snapshot', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Accept': 'application/json',\n 'X-CSRF-TOKEN': csrfToken\n },\n body: JSON.stringify({\n product_id: window.vmId,\n snapshot_name: snapshotName\n }),\n credentials: 'same-origin'\n });\n case 8:\n response = _context2.sent;\n _context2.next = 11;\n return response.json();\n case 11:\n data = _context2.sent;\n if (!(data.error === false)) {\n _context2.next = 17;\n break;\n }\n showNotification(data.message || 'Xóa snapshot thành công', 'success');\n // Refresh snapshot list after successful deletion\n setTimeout(function () {\n return _this2.fetchSnapshots();\n }, 1000);\n _context2.next = 18;\n break;\n case 17:\n throw new Error(data.message || 'Có lỗi xảy ra khi xóa snapshot');\n case 18:\n _context2.next = 24;\n break;\n case 20:\n _context2.prev = 20;\n _context2.t0 = _context2[\"catch\"](5);\n console.error('Error deleting snapshot:', _context2.t0);\n showNotification(_context2.t0.message || 'Có lỗi xảy ra khi xóa snapshot', 'error');\n case 24:\n case \"end\":\n return _context2.stop();\n }\n }, _callee2, null, [[5, 20]]);\n }))();\n },\n revertSnapshot: function revertSnapshot(snapshotName) {\n var _this3 = this;\n return _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee3() {\n var result, response, data;\n return _regeneratorRuntime().wrap(function _callee3$(_context3) {\n while (1) switch (_context3.prev = _context3.next) {\n case 0:\n _context3.next = 2;\n return Swal.fire({\n title: 'Xác nhận khôi phục',\n text: \"B\\u1EA1n c\\xF3 ch\\u1EAFc ch\\u1EAFn mu\\u1ED1n kh\\xF4i ph\\u1EE5c v\\u1EC1 snapshot \\\"\".concat(snapshotName, \"\\\"? T\\u1EA5t c\\u1EA3 d\\u1EEF li\\u1EC7u hi\\u1EC7n t\\u1EA1i s\\u1EBD b\\u1ECB m\\u1EA5t.\"),\n icon: 'warning',\n showCancelButton: true,\n confirmButtonColor: '#3085d6',\n cancelButtonColor: '#d33',\n confirmButtonText: 'Khôi phục',\n cancelButtonText: 'Hủy bỏ',\n reverseButtons: true\n });\n case 2:\n result = _context3.sent;\n if (result.isConfirmed) {\n _context3.next = 5;\n break;\n }\n return _context3.abrupt(\"return\");\n case 5:\n _context3.prev = 5;\n _context3.next = 8;\n return fetch('/secure/revert-snapshot', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Accept': 'application/json',\n 'X-CSRF-TOKEN': csrfToken\n },\n body: JSON.stringify({\n product_id: window.vmId,\n snapshot_name: snapshotName\n }),\n credentials: 'same-origin'\n });\n case 8:\n response = _context3.sent;\n _context3.next = 11;\n return response.json();\n case 11:\n data = _context3.sent;\n if (!(data.error === false)) {\n _context3.next = 17;\n break;\n }\n showNotification(data.message || 'Khôi phục snapshot thành công', 'success');\n // Refresh snapshot list after successful revert\n setTimeout(function () {\n return _this3.fetchSnapshots();\n }, 2000);\n _context3.next = 18;\n break;\n case 17:\n throw new Error(data.message || 'Có lỗi xảy ra khi khôi phục snapshot');\n case 18:\n _context3.next = 24;\n break;\n case 20:\n _context3.prev = 20;\n _context3.t0 = _context3[\"catch\"](5);\n console.error('Error reverting snapshot:', _context3.t0);\n showNotification(_context3.t0.message || 'Có lỗi xảy ra khi khôi phục snapshot', 'error');\n case 24:\n case \"end\":\n return _context3.stop();\n }\n }, _callee3, null, [[5, 20]]);\n }))();\n },\n // Helper method to refresh snapshots\n refreshSnapshots: function refreshSnapshots() {\n this.fetchSnapshots();\n },\n // Helper method to get snapshot count\n getSnapshotCount: function getSnapshotCount() {\n return this.snapshots.length;\n },\n // Helper method to check if snapshots are loading\n isLoading: function isLoading() {\n return this.loading;\n },\n // Helper method to check if there's an error\n hasError: function hasError() {\n return this.error !== null;\n }\n };\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVnZW5lcmF0b3JSdW50aW1lIiwiZSIsInQiLCJyIiwiT2JqZWN0IiwicHJvdG90eXBlIiwibiIsImhhc093blByb3BlcnR5IiwibyIsImRlZmluZVByb3BlcnR5IiwidmFsdWUiLCJpIiwiU3ltYm9sIiwiYSIsIml0ZXJhdG9yIiwiYyIsImFzeW5jSXRlcmF0b3IiLCJ1IiwidG9TdHJpbmdUYWciLCJkZWZpbmUiLCJlbnVtZXJhYmxlIiwiY29uZmlndXJhYmxlIiwid3JpdGFibGUiLCJ3cmFwIiwiR2VuZXJhdG9yIiwiY3JlYXRlIiwiQ29udGV4dCIsIm1ha2VJbnZva2VNZXRob2QiLCJ0cnlDYXRjaCIsInR5cGUiLCJhcmciLCJjYWxsIiwiaCIsImwiLCJmIiwicyIsInkiLCJHZW5lcmF0b3JGdW5jdGlvbiIsIkdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlIiwicCIsImQiLCJnZXRQcm90b3R5cGVPZiIsInYiLCJ2YWx1ZXMiLCJnIiwiZGVmaW5lSXRlcmF0b3JNZXRob2RzIiwiZm9yRWFjaCIsIl9pbnZva2UiLCJBc3luY0l0ZXJhdG9yIiwiaW52b2tlIiwiX3R5cGVvZiIsInJlc29sdmUiLCJfX2F3YWl0IiwidGhlbiIsImNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnIiwiRXJyb3IiLCJkb25lIiwibWV0aG9kIiwiZGVsZWdhdGUiLCJtYXliZUludm9rZURlbGVnYXRlIiwic2VudCIsIl9zZW50IiwiZGlzcGF0Y2hFeGNlcHRpb24iLCJhYnJ1cHQiLCJUeXBlRXJyb3IiLCJyZXN1bHROYW1lIiwibmV4dCIsIm5leHRMb2MiLCJwdXNoVHJ5RW50cnkiLCJ0cnlMb2MiLCJjYXRjaExvYyIsImZpbmFsbHlMb2MiLCJhZnRlckxvYyIsInRyeUVudHJpZXMiLCJwdXNoIiwicmVzZXRUcnlFbnRyeSIsImNvbXBsZXRpb24iLCJyZXNldCIsImlzTmFOIiwibGVuZ3RoIiwiZGlzcGxheU5hbWUiLCJpc0dlbmVyYXRvckZ1bmN0aW9uIiwiY29uc3RydWN0b3IiLCJuYW1lIiwibWFyayIsInNldFByb3RvdHlwZU9mIiwiX19wcm90b19fIiwiYXdyYXAiLCJhc3luYyIsIlByb21pc2UiLCJrZXlzIiwicmV2ZXJzZSIsInBvcCIsInByZXYiLCJjaGFyQXQiLCJzbGljZSIsInN0b3AiLCJydmFsIiwiaGFuZGxlIiwiY29tcGxldGUiLCJmaW5pc2giLCJfY2F0Y2giLCJkZWxlZ2F0ZVlpZWxkIiwiYXN5bmNHZW5lcmF0b3JTdGVwIiwiX2FzeW5jVG9HZW5lcmF0b3IiLCJhcmd1bWVudHMiLCJhcHBseSIsIl9uZXh0IiwiX3Rocm93IiwiaW52b2ljZUlkIiwidm1JZCIsInZtSG9zdG5hbWUiLCJjc3JmVG9rZW4iLCJpbml0aWFsaXplVmFyaWFibGVzIiwibWV0YUludm9pY2VJZCIsImRvY3VtZW50IiwicXVlcnlTZWxlY3RvciIsIm1ldGFWbUlkIiwibWV0YVZtSG9zdG5hbWUiLCJtZXRhQ3NyZlRva2VuIiwiZ2V0QXR0cmlidXRlIiwid2luZG93IiwiRnVpVG9hc3QiLCJjb25maWciLCJwb3NpdGlvbiIsInNob3dOb3RpZmljYXRpb24iLCJtZXNzYWdlIiwidW5kZWZpbmVkIiwic3VjY2VzcyIsImVycm9yIiwiY3JlYXRlU25hcHNob3QiLCJfY3JlYXRlU25hcHNob3QiLCJfY2FsbGVlNSIsInNuYXBzaG90QnRuIiwicmVxdWVzdEJvZHkiLCJoZWFkZXJzIiwic25hcHNob3RQcm9taXNlIiwiX2NhbGxlZTUkIiwiX2NvbnRleHQ1IiwiZ2V0RWxlbWVudEJ5SWQiLCJkaXNhYmxlZCIsInByb2R1Y3RfaWQiLCJmZXRjaCIsImJvZHkiLCJKU09OIiwic3RyaW5naWZ5IiwiY3JlZGVudGlhbHMiLCJfcmVmIiwiX2NhbGxlZTQiLCJyZXNwb25zZSIsImRhdGEiLCJ0ZXh0IiwiZXJyb3JNZXNzYWdlIiwiX2NhbGxlZTQkIiwiX2NvbnRleHQ0IiwicmVkaXJlY3RlZCIsInN0YXR1cyIsInBhcnNlIiwidDAiLCJpbmNsdWRlcyIsIm9rIiwic2V0VGltZW91dCIsImxvY2F0aW9uIiwicmVsb2FkIiwidDEiLCJtZXNzYWdlcyIsImRlZmF1bHRfbWVzc2FnZSIsImVycm9yX3R5cGUiLCJjb25jYXQiLCJ0b1N0cmluZyIsIl94IiwicHJvbWlzZSIsImxvYWRpbmciLCJjb25zb2xlIiwiaXNDbG9zZSIsImhhbmRsZVNuYXBzaG90U3VibWl0IiwiZXZlbnQiLCJwcmV2ZW50RGVmYXVsdCIsInJlamVjdCIsImZvcm0iLCJmb3JtRGF0YSIsIkZvcm1EYXRhIiwiYWN0aW9uIiwiaHJlZiIsInVybCIsImR1cmF0aW9uIiwiYWxlcnQiLCJzdWJtaXQiLCJzdGFydFZpcnR1YWxNYWNoaW5lIiwiX3N0YXJ0VmlydHVhbE1hY2hpbmUiLCJfY2FsbGVlNyIsInN0YXJ0QnRuIiwic3RhcnRQcm9taXNlIiwiX2NhbGxlZTckIiwiX2NvbnRleHQ3Iiwidm1faWQiLCJfcmVmMiIsIl9jYWxsZWU2IiwiX2NhbGxlZTYkIiwiX2NvbnRleHQ2IiwianNvbiIsIl94MiIsInN0b3BWaXJ0dWFsTWFjaGluZSIsIl9zdG9wVmlydHVhbE1hY2hpbmUiLCJfY2FsbGVlOSIsInN0b3BCdG4iLCJzdG9wUHJvbWlzZSIsIl9jYWxsZWU5JCIsIl9jb250ZXh0OSIsIl9yZWYzIiwiX2NhbGxlZTgiLCJfY2FsbGVlOCQiLCJfY29udGV4dDgiLCJfeDMiLCJyZXN0YXJ0VmlydHVhbE1hY2hpbmUiLCJfcmVzdGFydFZpcnR1YWxNYWNoaW5lIiwiX2NhbGxlZTExIiwicmVzdGFydEJ0biIsInJlc3RhcnRQcm9taXNlIiwiX2NhbGxlZTExJCIsIl9jb250ZXh0MTEiLCJfcmVmNCIsIl9jYWxsZWUxMCIsIl9jYWxsZWUxMCQiLCJfY29udGV4dDEwIiwiX3g0IiwiYWRkRXZlbnRMaXN0ZW5lciIsInN0b3BQcm9wYWdhdGlvbiIsInNuYXBzaG90VGFibGUiLCJzbmFwc2hvdHMiLCJmZXRjaFNuYXBzaG90cyIsIl90aGlzIiwiX2NhbGxlZSIsIl9jYWxsZWUkIiwiX2NvbnRleHQiLCJmb3JtYXRTaXplIiwic2l6ZUdCIiwic2l6ZU1CIiwiYnl0ZXMiLCJwYXJzZUZsb2F0IiwidW5pdHMiLCJrIiwiTWF0aCIsImZsb29yIiwibG9nIiwic2l6ZSIsInBvdyIsInRvRml4ZWQiLCJkZWxldGVTbmFwc2hvdCIsInNuYXBzaG90TmFtZSIsIl90aGlzMiIsIl9jYWxsZWUyIiwicmVzdWx0IiwiX2NhbGxlZTIkIiwiX2NvbnRleHQyIiwiU3dhbCIsImZpcmUiLCJ0aXRsZSIsImljb24iLCJzaG93Q2FuY2VsQnV0dG9uIiwiY29uZmlybUJ1dHRvbkNvbG9yIiwiY2FuY2VsQnV0dG9uQ29sb3IiLCJjb25maXJtQnV0dG9uVGV4dCIsImNhbmNlbEJ1dHRvblRleHQiLCJyZXZlcnNlQnV0dG9ucyIsImlzQ29uZmlybWVkIiwic25hcHNob3RfbmFtZSIsInJldmVydFNuYXBzaG90IiwiX3RoaXMzIiwiX2NhbGxlZTMiLCJfY2FsbGVlMyQiLCJfY29udGV4dDMiLCJyZWZyZXNoU25hcHNob3RzIiwiZ2V0U25hcHNob3RDb3VudCIsImlzTG9hZGluZyIsImhhc0Vycm9yIl0sInNvdXJjZXMiOlsid2VicGFjazovLy8uL3Jlc291cmNlcy9qcy9zZXJ2aWNlL3NlcnZpY2UuanM/YzE1ZiJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBHbG9iYWwgdmFyaWFibGVzIC0gTk8gU0VOU0lUSVZFIERBVEEgKG5vIHRva2VucylcclxubGV0IGludm9pY2VJZDtcclxubGV0IHZtSWQ7XHJcbmxldCB2bUhvc3RuYW1lO1xyXG5sZXQgY3NyZlRva2VuO1xyXG5cclxuLy8gSW5pdGlhbGl6ZSB2YXJpYWJsZXMgZnJvbSBkYXRhIGF0dHJpYnV0ZXMgb3IgZ2xvYmFsIHZhcmlhYmxlc1xyXG5mdW5jdGlvbiBpbml0aWFsaXplVmFyaWFibGVzKCkge1xyXG4gICAgLy8gR2V0IGRhdGEgZnJvbSBtZXRhIHRhZ3Mgb3IgZ2xvYmFsIHZhcmlhYmxlcyBzZXQgaW4gQmxhZGUgdGVtcGxhdGVcclxuICAgIGNvbnN0IG1ldGFJbnZvaWNlSWQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdtZXRhW25hbWU9XCJpbnZvaWNlLWlkXCJdJyk7XHJcbiAgICBjb25zdCBtZXRhVm1JZCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ21ldGFbbmFtZT1cInZtLWlkXCJdJyk7XHJcbiAgICBjb25zdCBtZXRhVm1Ib3N0bmFtZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ21ldGFbbmFtZT1cInZtLWhvc3RuYW1lXCJdJyk7XHJcbiAgICBjb25zdCBtZXRhQ3NyZlRva2VuID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignbWV0YVtuYW1lPVwiY3NyZi10b2tlblwiXScpO1xyXG4gICAgXHJcbiAgICBpbnZvaWNlSWQgPSBtZXRhSW52b2ljZUlkID8gbWV0YUludm9pY2VJZC5nZXRBdHRyaWJ1dGUoJ2NvbnRlbnQnKSA6IHdpbmRvdy5pbnZvaWNlSWQ7XHJcbiAgICB2bUlkID0gbWV0YVZtSWQgPyBtZXRhVm1JZC5nZXRBdHRyaWJ1dGUoJ2NvbnRlbnQnKSA6IHdpbmRvdy52bUlkO1xyXG4gICAgdm1Ib3N0bmFtZSA9IG1ldGFWbUhvc3RuYW1lID8gbWV0YVZtSG9zdG5hbWUuZ2V0QXR0cmlidXRlKCdjb250ZW50JykgOiB3aW5kb3cudm1Ib3N0bmFtZTtcclxuICAgIGNzcmZUb2tlbiA9IG1ldGFDc3JmVG9rZW4gPyBtZXRhQ3NyZlRva2VuLmdldEF0dHJpYnV0ZSgnY29udGVudCcpIDogd2luZG93LmNzcmZUb2tlbjtcclxufVxyXG5cclxuLy8gQ+G6pXUgaMOsbmggdG9hc3QgbuG6v3UgY8OzIHRo4buDXHJcbmlmICh0eXBlb2YgRnVpVG9hc3QgIT09ICd1bmRlZmluZWQnICYmIEZ1aVRvYXN0LmNvbmZpZykge1xyXG4gICAgRnVpVG9hc3QuY29uZmlnKHtcclxuICAgICAgICBwb3NpdGlvbjogJ3RvcC1jZW50ZXInXHJcbiAgICB9KTtcclxufVxyXG5cclxuZnVuY3Rpb24gc2hvd05vdGlmaWNhdGlvbihtZXNzYWdlLCB0eXBlID0gJ3N1Y2Nlc3MnKSB7XHJcbiAgICBpZiAodHlwZSA9PT0gJ3N1Y2Nlc3MnKSB7XHJcbiAgICAgICAgRnVpVG9hc3Quc3VjY2VzcyhtZXNzYWdlKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgRnVpVG9hc3QuZXJyb3IobWVzc2FnZSk7XHJcbiAgICB9XHJcbn1cclxuXHJcbmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVNuYXBzaG90KCkge1xyXG4gICAgY29uc3Qgc25hcHNob3RCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY3JlYXRlU25hcHNob3RCdXR0b24nKTtcclxuICAgIGlmIChzbmFwc2hvdEJ0biAmJiBzbmFwc2hvdEJ0bi5kaXNhYmxlZCkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IHJlcXVlc3RCb2R5ID0ge1xyXG4gICAgICAgIHByb2R1Y3RfaWQ6IHZtSWRcclxuICAgIH07XHJcbiAgICBcclxuICAgIGNvbnN0IGhlYWRlcnMgPSB7XHJcbiAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcclxuICAgICAgICAnQWNjZXB0JzogJ2FwcGxpY2F0aW9uL2pzb24nLFxyXG4gICAgICAgICdYLUNTUkYtVE9LRU4nOiBjc3JmVG9rZW5cclxuICAgICAgICAvLyBOTyBBdXRob3JpemF0aW9uIGhlYWRlciAtIHVzaW5nIHNlc3Npb24gYXV0aFxyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBzbmFwc2hvdFByb21pc2UgPSBmZXRjaCgnL3NlY3VyZS9jcmVhdGUtc25hcHNob3RzJywge1xyXG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxyXG4gICAgICAgIGhlYWRlcnM6IGhlYWRlcnMsXHJcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkocmVxdWVzdEJvZHkpLFxyXG4gICAgICAgIGNyZWRlbnRpYWxzOiAnc2FtZS1vcmlnaW4nXHJcbiAgICB9KS50aGVuKGFzeW5jIChyZXNwb25zZSkgPT4ge1xyXG4gICAgICAgIGlmIChyZXNwb25zZS5yZWRpcmVjdGVkIHx8IHJlc3BvbnNlLnN0YXR1cyA9PT0gNDAxKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUGhpw6puIMSRxINuZyBuaOG6rXAgxJHDoyBo4bq/dCBo4bqhbiwgdnVpIGzDsm5nIMSRxINuZyBuaOG6rXAgbOG6oWknKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIENoZWNrIGlmIHJlc3BvbnNlIGlzIHJlZGlyZWN0ZWQgKHR5cGljYWwgZm9yIExhcmF2ZWwgcmVkaXJlY3QgcmVzcG9uc2VzKVxyXG4gICAgICAgIGlmIChyZXNwb25zZS5yZWRpcmVjdGVkKSB7XHJcbiAgICAgICAgICAgIC8vIEV4dHJhY3QgbWVzc2FnZSBmcm9tIFVSTCBpZiBwb3NzaWJsZSwgb3Igc2hvdyBnZW5lcmljIHN1Y2Nlc3NcclxuICAgICAgICAgICAgcmV0dXJuICfEkMOjIGfhu61pIHnDqnUgY+G6p3UgdOG6oW8gc25hcHNob3QuIFF1w6EgdHLDrG5oIHPhur0gbeG6pXQgMy01IHBow7p0LCB2dWkgbMOybmcgY2jhu50gxJHhu6NpLic7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgZGF0YTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBjb25zdCB0ZXh0ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgLy8gVHJ5IHRvIHBhcnNlIGFzIEpTT04gZmlyc3RcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGRhdGEgPSBKU09OLnBhcnNlKHRleHQpO1xyXG4gICAgICAgICAgICB9IGNhdGNoIChwYXJzZUVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBJZiBub3QgSlNPTiwgY2hlY2sgZm9yIEhUTUwgd2l0aCBzdWNjZXNzL2Vycm9yIG1lc3NhZ2VzXHJcbiAgICAgICAgICAgICAgICBpZiAodGV4dC5pbmNsdWRlcygnc3VjY2VzcycpIHx8IHJlc3BvbnNlLm9rKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uLnJlbG9hZCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0sIDIwMDApO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnxJDDoyBn4butaSB5w6p1IGPhuqd1IHThuqFvIHNuYXBzaG90LiBRdcOhIHRyw6xuaCBz4bq9IG3huqV0IDMtNSBwaMO6dCwgdnVpIGzDsm5nIGNo4budIMSR4bujaS4nO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0PDsyBs4buXaSB44bqjeSByYSBraGkgZ+G7rWkgecOqdSBj4bqndSB04bqhbyBzbmFwc2hvdCcpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCAocGFyc2VFcnJvcikge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0zhu5dpIMSR4buLbmggZOG6oW5nIGThu68gbGnhu4d1IHThu6sgbcOheSBjaOG7pycpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gSGFuZGxlIEpTT04gcmVzcG9uc2VcclxuICAgICAgICBpZiAoZGF0YSAmJiAhZGF0YS5lcnJvcikge1xyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIGxvY2F0aW9uLnJlbG9hZCgpO1xyXG4gICAgICAgICAgICB9LCAyMDAwKTtcclxuICAgICAgICAgICAgcmV0dXJuIGRhdGEubWVzc2FnZSB8fCAnxJDDoyBn4butaSB5w6p1IGPhuqd1IHThuqFvIHNuYXBzaG90LiBRdcOhIHRyw6xuaCBz4bq9IG3huqV0IDMtNSBwaMO6dCwgdnVpIGzDsm5nIGNo4budIMSR4bujaS4nO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGxldCBlcnJvck1lc3NhZ2UgPSAnQ8OzIGzhu5dpIHjhuqN5IHJhIGtoaSB04bqhbyBzbmFwc2hvdCc7XHJcbiAgICAgICAgICAgIGlmIChkYXRhICYmIGRhdGEubWVzc2FnZSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBkYXRhLm1lc3NhZ2UgPT09ICdvYmplY3QnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEubWVzc2FnZS5tZXNzYWdlcyAmJiBkYXRhLm1lc3NhZ2UubWVzc2FnZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSBkYXRhLm1lc3NhZ2UubWVzc2FnZXNbMF0uZGVmYXVsdF9tZXNzYWdlIHx8IGRhdGEubWVzc2FnZS5tZXNzYWdlc1swXS5tZXNzYWdlIHx8ICdDw7MgbOG7l2kgeOG6o3kgcmEnO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZGF0YS5tZXNzYWdlLmVycm9yX3R5cGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gYEzhu5dpOiAke2RhdGEubWVzc2FnZS5lcnJvcl90eXBlfWA7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gJ0PDsyBs4buXaSB44bqjeSByYSB04burIGjhu4cgdGjhu5FuZyc7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSBkYXRhLm1lc3NhZ2U7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZGF0YSAmJiBkYXRhLnZhbHVlICYmIGRhdGEudmFsdWUubWVzc2FnZXMgJiYgZGF0YS52YWx1ZS5tZXNzYWdlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSBkYXRhLnZhbHVlLm1lc3NhZ2VzWzBdLmRlZmF1bHRfbWVzc2FnZTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZSA9IGRhdGE7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZGF0YSAmJiBkYXRhLmVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGRhdGEuZXJyb3IgPT09ICdvYmplY3QnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuZXJyb3IubWVzc2FnZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSBkYXRhLmVycm9yLm1lc3NhZ2U7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkYXRhLmVycm9yLnRvU3RyaW5nICYmIGRhdGEuZXJyb3IudG9TdHJpbmcoKSAhPT0gJ1tvYmplY3QgT2JqZWN0XScpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gZGF0YS5lcnJvci50b1N0cmluZygpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZSA9ICdDw7MgbOG7l2kgeOG6o3kgcmEgdOG7qyBo4buHIHRo4buRbmcnO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gZGF0YS5lcnJvcjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3JNZXNzYWdlKTtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBGdWlUb2FzdC5wcm9taXNlKFxyXG4gICAgICAgIHNuYXBzaG90UHJvbWlzZSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGxvYWRpbmc6ICfEkGFuZyBn4butaSB5w6p1IGPhuqd1IHThuqFvIHNuYXBzaG90Li4uIChRdcOhIHRyw6xuaCBt4bqldCAzLTUgcGjDunQgdnVpIGzDsm5nIGdp4buvIHRyYW5nIGtow7RuZyB04bqvdCEpJyxcclxuICAgICAgICAgICAgc3VjY2VzczogKGRhdGEpID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBkYXRhO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnJvcjogKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBlcnJvci5tZXNzYWdlIHx8ICdDw7MgbOG7l2kgeOG6o3kgcmEga2hpIHThuqFvIHNuYXBzaG90JztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpc0Nsb3NlOiB0cnVlXHJcbiAgICAgICAgfVxyXG4gICAgKTtcclxufVxyXG5cclxuLy8gSGFuZGxlIHNuYXBzaG90IGZvcm0gc3VibWlzc2lvbiB3aXRoIGxvYWRpbmcgbm90aWZpY2F0aW9uXHJcbmZ1bmN0aW9uIGhhbmRsZVNuYXBzaG90U3VibWl0KGV2ZW50KSB7XHJcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgXHJcbiAgICBjb25zdCBzbmFwc2hvdFByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgY29uc3QgZm9ybSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzbmFwc2hvdEZvcm0nKTtcclxuICAgICAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YShmb3JtKTtcclxuICAgICAgICBcclxuICAgICAgICBmZXRjaChmb3JtLmFjdGlvbiwge1xyXG4gICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcclxuICAgICAgICAgICAgYm9keTogZm9ybURhdGEsXHJcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcclxuICAgICAgICAgICAgICAgICdYLUNTUkYtVE9LRU4nOiBjc3JmVG9rZW5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgLnRoZW4ocmVzcG9uc2UgPT4ge1xyXG4gICAgICAgICAgICBpZiAocmVzcG9uc2UucmVkaXJlY3RlZCkge1xyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgnxJDDoyBn4butaSB5w6p1IGPhuqd1IHThuqFvIHNuYXBzaG90ISBRdcOhIHRyw6xuaCBz4bq9IG3huqV0IDMtNSBwaMO6dC4nKTtcclxuICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gcmVzcG9uc2UudXJsO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHJlc3BvbnNlLm9rKSB7XHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKCfEkMOjIGfhu61pIHnDqnUgY+G6p3UgdOG6oW8gc25hcHNob3QhIFF1w6EgdHLDrG5oIHPhur0gbeG6pXQgMy01IHBow7p0LicpO1xyXG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpO1xyXG4gICAgICAgICAgICAgICAgfSwgMjAwMCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXNwb25zZS50ZXh0KCkudGhlbih0ZXh0ID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZWplY3QoJ0PDsyBs4buXaSB44bqjeSByYSBraGkgZ+G7rWkgecOqdSBj4bqndSB04bqhbyBzbmFwc2hvdCcpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgICAgIC5jYXRjaChlcnJvciA9PiB7XHJcbiAgICAgICAgICAgIHJlamVjdCgnTOG7l2kga+G6v3QgbuG7kWk6ICcgKyBlcnJvci5tZXNzYWdlKTtcclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG4gICAgXHJcbiAgICBpZiAodHlwZW9mIEZ1aVRvYXN0ICE9PSAndW5kZWZpbmVkJyAmJiBGdWlUb2FzdC5wcm9taXNlKSB7XHJcbiAgICAgICAgRnVpVG9hc3QucHJvbWlzZShzbmFwc2hvdFByb21pc2UsIHtcclxuICAgICAgICAgICAgbG9hZGluZzogJ8SQYW5nIGfhu61pIHnDqnUgY+G6p3UgdOG6oW8gc25hcHNob3QuLi4nLFxyXG4gICAgICAgICAgICBzdWNjZXNzOiAoZGF0YSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGRhdGEgfHwgJ8SQw6MgZ+G7rWkgecOqdSBj4bqndSB04bqhbyBzbmFwc2hvdCEnO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnJvcjogKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3IgfHwgJ0PDsyBs4buXaSB44bqjeSByYSBraGkgZ+G7rWkgecOqdSBj4bqndSB04bqhbyBzbmFwc2hvdCc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBGdWlUb2FzdCAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICAgICAgRnVpVG9hc3QubG9hZGluZygnxJBhbmcgZ+G7rWkgecOqdSBj4bqndSB04bqhbyBzbmFwc2hvdC4uLicsIHtcclxuICAgICAgICAgICAgICAgIGR1cmF0aW9uOiAwLFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBhbGVydCgnxJBhbmcgZ+G7rWkgecOqdSBj4bqndSB04bqhbyBzbmFwc2hvdC4uLicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NuYXBzaG90Rm9ybScpLnN1Ym1pdCgpO1xyXG4gICAgICAgIH0sIDUwMCk7XHJcbiAgICB9XHJcbn1cclxuXHJcbmFzeW5jIGZ1bmN0aW9uIHN0YXJ0VmlydHVhbE1hY2hpbmUoKSB7XHJcbiAgICBjb25zdCBzdGFydEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdGFydFZNQnV0dG9uJyk7XHJcbiAgICBpZiAoc3RhcnRCdG4gJiYgc3RhcnRCdG4uZGlzYWJsZWQpIHJldHVybjtcclxuXHJcbiAgICBjb25zdCByZXF1ZXN0Qm9keSA9IHtcclxuICAgICAgICB2bV9pZDogdm1JZFxyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBoZWFkZXJzID0ge1xyXG4gICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXHJcbiAgICAgICAgJ0FjY2VwdCc6ICdhcHBsaWNhdGlvbi9qc29uJyxcclxuICAgICAgICAnWC1DU1JGLVRPS0VOJzogY3NyZlRva2VuXHJcbiAgICAgICAgLy8gTk8gQXV0aG9yaXphdGlvbiBoZWFkZXIgLSB1c2luZyBzZXNzaW9uIGF1dGhcclxuICAgIH07XHJcblxyXG4gICAgY29uc3Qgc3RhcnRQcm9taXNlID0gZmV0Y2goJy9hcGkvc2VjdXJlL3N0YXJ0LXZtJywge1xyXG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxyXG4gICAgICAgIGhlYWRlcnM6IGhlYWRlcnMsXHJcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkocmVxdWVzdEJvZHkpLFxyXG4gICAgICAgIGNyZWRlbnRpYWxzOiAnc2FtZS1vcmlnaW4nXHJcbiAgICB9KS50aGVuKGFzeW5jIChyZXNwb25zZSkgPT4ge1xyXG4gICAgICAgIGlmIChyZXNwb25zZS5yZWRpcmVjdGVkIHx8IHJlc3BvbnNlLnN0YXR1cyA9PT0gNDAxKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUGhpw6puIMSRxINuZyBuaOG6rXAgxJHDoyBo4bq/dCBo4bqhbiwgdnVpIGzDsm5nIMSRxINuZyBuaOG6rXAgbOG6oWknKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBkYXRhO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XHJcbiAgICAgICAgfSBjYXRjaCAocGFyc2VFcnJvcikge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0zhu5dpIMSR4buLbmggZOG6oW5nIGThu68gbGnhu4d1IHThu6sgbcOheSBjaOG7pycpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFkYXRhLmVycm9yKSB7XHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgbG9jYXRpb24ucmVsb2FkKCk7XHJcbiAgICAgICAgICAgIH0sIDIwMDApO1xyXG4gICAgICAgICAgICByZXR1cm4gZGF0YS5tZXNzYWdlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChkYXRhLnR5cGUgPT09ICdjb20udm13YXJlLnZhcGkuc3RkLmVycm9ycy5hbHJlYWR5X2luX2Rlc2lyZWRfc3RhdGUnIHx8XHJcbiAgICAgICAgICAgICAgICAoZGF0YS5tZXNzYWdlICYmIGRhdGEubWVzc2FnZS5lcnJvcl90eXBlID09PSAnQUxSRUFEWV9JTl9ERVNJUkVEX1NUQVRFJykpIHtcclxuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uLnJlbG9hZCgpO1xyXG4gICAgICAgICAgICAgICAgfSwgMjAwMCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJ03DoXkgY2jhu6cgxJHDoyDEkcaw4bujYyBi4bqtdCc7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgZXJyb3JNZXNzYWdlID0gJ0PDsyBs4buXaSB44bqjeSByYSc7XHJcbiAgICAgICAgICAgICAgICBpZiAoZGF0YS5tZXNzYWdlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBkYXRhLm1lc3NhZ2UgPT09ICdvYmplY3QnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhLm1lc3NhZ2UubWVzc2FnZXMgJiYgZGF0YS5tZXNzYWdlLm1lc3NhZ2VzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZSA9IGRhdGEubWVzc2FnZS5tZXNzYWdlc1swXS5kZWZhdWx0X21lc3NhZ2UgfHwgZGF0YS5tZXNzYWdlLm1lc3NhZ2VzWzBdXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1lc3NhZ2UgfHwgJ0PDsyBs4buXaSB44bqjeSByYSc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZGF0YS5tZXNzYWdlLmVycm9yX3R5cGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZSA9IGBM4buXaTogJHtkYXRhLm1lc3NhZ2UuZXJyb3JfdHlwZX1gO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gJ0PDsyBs4buXaSB44bqjeSByYSB04burIGjhu4cgdGjhu5FuZyc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSBkYXRhLm1lc3NhZ2U7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkYXRhLnZhbHVlICYmIGRhdGEudmFsdWUubWVzc2FnZXMgJiYgZGF0YS52YWx1ZS5tZXNzYWdlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gZGF0YS52YWx1ZS5tZXNzYWdlc1swXS5kZWZhdWx0X21lc3NhZ2U7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZSA9IGRhdGE7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRhdGEuZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGRhdGEuZXJyb3IgPT09ICdvYmplY3QnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhLmVycm9yLm1lc3NhZ2UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZSA9IGRhdGEuZXJyb3IubWVzc2FnZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkYXRhLmVycm9yLnRvU3RyaW5nICYmIGRhdGEuZXJyb3IudG9TdHJpbmcoKSAhPT0gJ1tvYmplY3QgT2JqZWN0XScpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZSA9IGRhdGEuZXJyb3IudG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZSA9ICdDw7MgbOG7l2kgeOG6o3kgcmEgdOG7qyBo4buHIHRo4buRbmcnO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gZGF0YS5lcnJvcjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3JNZXNzYWdlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIEZ1aVRvYXN0LnByb21pc2UoXHJcbiAgICAgICAgc3RhcnRQcm9taXNlLFxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgbG9hZGluZzogJ8SQYW5nIGto4bufaSDEkeG7mW5nIG3DoXkg4bqjby4uLicsXHJcbiAgICAgICAgICAgIHN1Y2Nlc3M6IChkYXRhKSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZGF0YTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyb3I6IChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3IubWVzc2FnZSB8fCAnQ8OzIGzhu5dpIHjhuqN5IHJhIGtoaSBraOG7n2kgxJHhu5luZyBtw6F5IOG6o28nO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlzQ2xvc2U6IHRydWVcclxuICAgICAgICB9XHJcbiAgICApO1xyXG59XHJcblxyXG5hc3luYyBmdW5jdGlvbiBzdG9wVmlydHVhbE1hY2hpbmUoKSB7XHJcbiAgICBjb25zdCBzdG9wQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N0b3BWTUJ1dHRvbicpO1xyXG4gICAgaWYgKHN0b3BCdG4gJiYgc3RvcEJ0bi5kaXNhYmxlZCkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IHJlcXVlc3RCb2R5ID0ge1xyXG4gICAgICAgIHZtX2lkOiB2bUlkXHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0IGhlYWRlcnMgPSB7XHJcbiAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcclxuICAgICAgICAnQWNjZXB0JzogJ2FwcGxpY2F0aW9uL2pzb24nLFxyXG4gICAgICAgICdYLUNTUkYtVE9LRU4nOiBjc3JmVG9rZW5cclxuICAgICAgICAvLyBOTyBBdXRob3JpemF0aW9uIGhlYWRlciAtIHVzaW5nIHNlc3Npb24gYXV0aFxyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBzdG9wUHJvbWlzZSA9IGZldGNoKCcvYXBpL3NlY3VyZS9zdG9wLXZtJywge1xyXG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxyXG4gICAgICAgIGhlYWRlcnM6IGhlYWRlcnMsXHJcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkocmVxdWVzdEJvZHkpLFxyXG4gICAgICAgIGNyZWRlbnRpYWxzOiAnc2FtZS1vcmlnaW4nXHJcbiAgICB9KS50aGVuKGFzeW5jIChyZXNwb25zZSkgPT4ge1xyXG4gICAgICAgIGlmIChyZXNwb25zZS5yZWRpcmVjdGVkIHx8IHJlc3BvbnNlLnN0YXR1cyA9PT0gNDAxKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUGhpw6puIMSRxINuZyBuaOG6rXAgxJHDoyBo4bq/dCBo4bqhbiwgdnVpIGzDsm5nIMSRxINuZyBuaOG6rXAgbOG6oWknKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBkYXRhO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XHJcbiAgICAgICAgfSBjYXRjaCAocGFyc2VFcnJvcikge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0zhu5dpIMSR4buLbmggZOG6oW5nIGThu68gbGnhu4d1IHThu6sgbcOheSBjaOG7pycpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFkYXRhLmVycm9yKSB7XHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgbG9jYXRpb24ucmVsb2FkKCk7XHJcbiAgICAgICAgICAgIH0sIDIwMDApO1xyXG4gICAgICAgICAgICByZXR1cm4gZGF0YS5tZXNzYWdlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChkYXRhLnR5cGUgPT09ICdjb20udm13YXJlLnZhcGkuc3RkLmVycm9ycy5hbHJlYWR5X2luX2Rlc2lyZWRfc3RhdGUnIHx8XHJcbiAgICAgICAgICAgICAgICAoZGF0YS5tZXNzYWdlICYmIGRhdGEubWVzc2FnZS5lcnJvcl90eXBlID09PSAnQUxSRUFEWV9JTl9ERVNJUkVEX1NUQVRFJykpIHtcclxuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uLnJlbG9hZCgpO1xyXG4gICAgICAgICAgICAgICAgfSwgMjAwMCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJ03DoXkgY2jhu6cgxJHDoyDEkcaw4bujYyB04bqvdCc7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgZXJyb3JNZXNzYWdlID0gJ0PDsyBs4buXaSB44bqjeSByYSc7XHJcbiAgICAgICAgICAgICAgICBpZiAoZGF0YS5tZXNzYWdlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBkYXRhLm1lc3NhZ2UgPT09ICdvYmplY3QnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhLm1lc3NhZ2UubWVzc2FnZXMgJiYgZGF0YS5tZXNzYWdlLm1lc3NhZ2VzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZSA9IGRhdGEubWVzc2FnZS5tZXNzYWdlc1swXS5kZWZhdWx0X21lc3NhZ2UgfHwgZGF0YS5tZXNzYWdlLm1lc3NhZ2VzWzBdXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1lc3NhZ2UgfHwgJ0PDsyBs4buXaSB44bqjeSByYSc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZGF0YS5tZXNzYWdlLmVycm9yX3R5cGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZSA9IGBM4buXaTogJHtkYXRhLm1lc3NhZ2UuZXJyb3JfdHlwZX1gO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gJ0PDsyBs4buXaSB44bqjeSByYSB04burIGjhu4cgdGjhu5FuZyc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSBkYXRhLm1lc3NhZ2U7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkYXRhLnZhbHVlICYmIGRhdGEudmFsdWUubWVzc2FnZXMgJiYgZGF0YS52YWx1ZS5tZXNzYWdlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gZGF0YS52YWx1ZS5tZXNzYWdlc1swXS5kZWZhdWx0X21lc3NhZ2U7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZSA9IGRhdGE7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRhdGEuZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGRhdGEuZXJyb3IgPT09ICdvYmplY3QnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhLmVycm9yLm1lc3NhZ2UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZSA9IGRhdGEuZXJyb3IubWVzc2FnZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkYXRhLmVycm9yLnRvU3RyaW5nICYmIGRhdGEuZXJyb3IudG9TdHJpbmcoKSAhPT0gJ1tvYmplY3QgT2JqZWN0XScpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZSA9IGRhdGEuZXJyb3IudG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZSA9ICdDw7MgbOG7l2kgeOG6o3kgcmEgdOG7qyBo4buHIHRo4buRbmcnO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gZGF0YS5lcnJvcjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3JNZXNzYWdlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIEZ1aVRvYXN0LnByb21pc2UoXHJcbiAgICAgICAgc3RvcFByb21pc2UsXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBsb2FkaW5nOiAnxJBhbmcgZOG7q25nIG3DoXkg4bqjby4uLicsXHJcbiAgICAgICAgICAgIHN1Y2Nlc3M6IChkYXRhKSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZGF0YTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyb3I6IChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3IubWVzc2FnZSB8fCAnQ8OzIGzhu5dpIHjhuqN5IHJhIGtoaSBk4burbmcgbcOheSDhuqNvJztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpc0Nsb3NlOiB0cnVlXHJcbiAgICAgICAgfVxyXG4gICAgKTtcclxufVxyXG5cclxuYXN5bmMgZnVuY3Rpb24gcmVzdGFydFZpcnR1YWxNYWNoaW5lKCkge1xyXG4gICAgY29uc3QgcmVzdGFydEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXN0YXJ0Vk1CdXR0b24nKTtcclxuICAgIGlmIChyZXN0YXJ0QnRuICYmIHJlc3RhcnRCdG4uZGlzYWJsZWQpIHJldHVybjtcclxuXHJcbiAgICBjb25zdCByZXN0YXJ0UHJvbWlzZSA9IGZldGNoKGAvc2VydmljZS8ke2ludm9pY2VJZH0vdm0vdG9nZ2xlYCwge1xyXG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxyXG4gICAgICAgIGhlYWRlcnM6IHtcclxuICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcclxuICAgICAgICAgICAgJ1gtQ1NSRi1UT0tFTic6IGNzcmZUb2tlblxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xyXG4gICAgICAgICAgICBhY3Rpb246ICdyZXN0YXJ0J1xyXG4gICAgICAgIH0pXHJcbiAgICB9KS50aGVuKGFzeW5jIChyZXNwb25zZSkgPT4ge1xyXG4gICAgICAgIGxldCBkYXRhO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XHJcbiAgICAgICAgfSBjYXRjaCAocGFyc2VFcnJvcikge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0zhu5dpIMSR4buLbmggZOG6oW5nIGThu68gbGnhu4d1IHThu6sgbcOheSBjaOG7pycpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGRhdGEuc3VjY2Vzcykge1xyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIGxvY2F0aW9uLnJlbG9hZCgpO1xyXG4gICAgICAgICAgICB9LCAyMDAwKTtcclxuICAgICAgICAgICAgcmV0dXJuIGRhdGEubWVzc2FnZTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBsZXQgZXJyb3JNZXNzYWdlID0gJ0PDsyBs4buXaSB44bqjeSByYSc7XHJcbiAgICAgICAgICAgIGlmIChkYXRhLm1lc3NhZ2UpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZGF0YS5tZXNzYWdlID09PSAnb2JqZWN0Jykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChkYXRhLm1lc3NhZ2UubWVzc2FnZXMgJiYgZGF0YS5tZXNzYWdlLm1lc3NhZ2VzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gZGF0YS5tZXNzYWdlLm1lc3NhZ2VzWzBdLmRlZmF1bHRfbWVzc2FnZSB8fCBkYXRhLm1lc3NhZ2UubWVzc2FnZXNbMF1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tZXNzYWdlIHx8ICdDw7MgbOG7l2kgeOG6o3kgcmEnO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZGF0YS5tZXNzYWdlLmVycm9yX3R5cGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gYEzhu5dpOiAke2RhdGEubWVzc2FnZS5lcnJvcl90eXBlfWA7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gJ0PDsyBs4buXaSB44bqjeSByYSB04burIGjhu4cgdGjhu5FuZyc7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSBkYXRhLm1lc3NhZ2U7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZGF0YS5lcnJvcikge1xyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBkYXRhLmVycm9yID09PSAnb2JqZWN0Jykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChkYXRhLmVycm9yLm1lc3NhZ2UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gZGF0YS5lcnJvci5tZXNzYWdlO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZGF0YS5lcnJvci50b1N0cmluZyAmJiBkYXRhLmVycm9yLnRvU3RyaW5nKCkgIT09ICdbb2JqZWN0IE9iamVjdF0nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZSA9IGRhdGEuZXJyb3IudG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSAnQ8OzIGzhu5dpIHjhuqN5IHJhIHThu6sgaOG7hyB0aOG7kW5nJztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZSA9IGRhdGEuZXJyb3I7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSBkYXRhO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvck1lc3NhZ2UpO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIEZ1aVRvYXN0LnByb21pc2UoXHJcbiAgICAgICAgcmVzdGFydFByb21pc2UsXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBsb2FkaW5nOiAnxJBhbmcga2jhu59pIMSR4buZbmcgbOG6oWkgbcOheSDhuqNvLi4uJyxcclxuICAgICAgICAgICAgc3VjY2VzczogKGRhdGEpID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBkYXRhO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnJvcjogKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBlcnJvci5tZXNzYWdlIHx8ICdDw7MgbOG7l2kgeOG6o3kgcmEga2hpIGto4bufaSDEkeG7mW5nIGzhuqFpIG3DoXkg4bqjbyc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaXNDbG9zZTogdHJ1ZVxyXG4gICAgICAgIH1cclxuICAgICk7XHJcblxyXG5cclxuICAgIFxyXG59XHJcblxyXG4vLyBET00gcmVhZHlcclxuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIGZ1bmN0aW9uKCkge1xyXG4gICAgLy8gSW5pdGlhbGl6ZSB2YXJpYWJsZXNcclxuICAgIGluaXRpYWxpemVWYXJpYWJsZXMoKTtcclxuICAgIFxyXG4gICAgY29uc3Qgc3RhcnRCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3RhcnRWTUJ1dHRvbicpO1xyXG4gICAgY29uc3Qgc3RvcEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdG9wVk1CdXR0b24nKTsgXHJcbiAgICBjb25zdCByZXN0YXJ0QnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Jlc3RhcnRWTUJ1dHRvbicpO1xyXG4gICAgY29uc3Qgc25hcHNob3RCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY3JlYXRlU25hcHNob3RCdXR0b24nKTtcclxuXHJcbiAgICBpZiAoc3RhcnRCdG4pIHtcclxuICAgICAgICBzdGFydEJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uKGUpIHtcclxuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICBzdGFydFZpcnR1YWxNYWNoaW5lKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHN0b3BCdG4pIHtcclxuICAgICAgICBzdG9wQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oZSkge1xyXG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgIHN0b3BWaXJ0dWFsTWFjaGluZSgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChyZXN0YXJ0QnRuKSB7XHJcbiAgICAgICAgcmVzdGFydEJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uKGUpIHtcclxuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICByZXN0YXJ0VmlydHVhbE1hY2hpbmUoKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoc25hcHNob3RCdG4pIHtcclxuICAgICAgICBzbmFwc2hvdEJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uKGUpIHtcclxuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICBjcmVhdGVTbmFwc2hvdCgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59KTtcclxuXHJcbi8vIFNuYXBzaG90IFRhYmxlIE1hbmFnZW1lbnRcclxuZnVuY3Rpb24gc25hcHNob3RUYWJsZSgpIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgbG9hZGluZzogZmFsc2UsXHJcbiAgICAgICAgc25hcHNob3RzOiBbXSxcclxuICAgICAgICBlcnJvcjogbnVsbCxcclxuICAgICAgICBcclxuICAgICAgICBhc3luYyBmZXRjaFNuYXBzaG90cygpIHtcclxuICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5lcnJvciA9IG51bGw7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBjb25zdCB2bUlkID0gd2luZG93LnZtSWQgfHwgJyc7XHJcbiAgICAgICAgICAgIGlmICghdm1JZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmVycm9yID0gJ0tow7RuZyB0w6xtIHRo4bqleSBJRCBtw6F5IOG6o28nO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgL3NlY3VyZS9nZXQtc25hcHNob3RzP3Byb2R1Y3RfaWQ9JHt2bUlkfWAsIHtcclxuICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdHRVQnLFxyXG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgJ0FjY2VwdCc6ICdhcHBsaWNhdGlvbi9qc29uJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgJ1gtQ1NSRi1UT0tFTic6IGNzcmZUb2tlbixcclxuICAgICAgICAgICAgICAgICAgICAgICAgJ0NhY2hlLUNvbnRyb2wnOiAnbm8tY2FjaGUnXHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICBjcmVkZW50aWFsczogJ3NhbWUtb3JpZ2luJ1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSFRUUCBlcnJvciEgc3RhdHVzOiAke3Jlc3BvbnNlLnN0YXR1c31gKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAvLyBLaeG7g20gdHJhIHJlc3BvbnNlIHN0cnVjdHVyZSB04burIEFQSSB0aOG7sWMgdOG6v1xyXG4gICAgICAgICAgICAgICAgaWYgKGRhdGEuZXJyb3IgPT09IGZhbHNlICYmIGRhdGEuZGF0YSAmJiBkYXRhLmRhdGEuc25hcHNob3RzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zbmFwc2hvdHMgPSBkYXRhLmRhdGEuc25hcHNob3RzO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkYXRhLmVycm9yID09PSB0cnVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lcnJvciA9IGRhdGEubWVzc2FnZSB8fCAnQ8OzIGzhu5dpIHjhuqN5IHJhIGtoaSB04bqjaSBkYW5oIHPDoWNoIHNuYXBzaG90JztcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNuYXBzaG90cyA9IFtdO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkYXRhLnNuYXBzaG90cykge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIEZhbGxiYWNrIGNobyB0csaw4budbmcgaOG7o3AgZGF0YSB0cuG7sWMgdGnhur9wXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zbmFwc2hvdHMgPSBkYXRhLnNuYXBzaG90cztcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zbmFwc2hvdHMgPSBbXTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGZldGNoaW5nIHNuYXBzaG90czonLCBlcnJvcik7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmVycm9yID0gJ0tow7RuZyB0aOG7gyBr4bq/dCBu4buRaSDEkeG6v24gbcOheSBjaOG7pyc7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNuYXBzaG90cyA9IFtdO1xyXG4gICAgICAgICAgICB9IGZpbmFsbHkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBmb3JtYXRTaXplKHNpemVHQiwgc2l6ZU1CKSB7XHJcbiAgICAgICAgICAgIC8vIENvbnZlcnQgdG8gYnl0ZXMgZmlyc3RcclxuICAgICAgICAgICAgbGV0IGJ5dGVzID0gMDtcclxuICAgICAgICAgICAgaWYgKHNpemVHQikge1xyXG4gICAgICAgICAgICAgICAgYnl0ZXMgPSBwYXJzZUZsb2F0KHNpemVHQikgKiAxMDI0ICogMTAyNCAqIDEwMjQ7IC8vIEdCIHRvIGJ5dGVzXHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2l6ZU1CKSB7XHJcbiAgICAgICAgICAgICAgICBieXRlcyA9IHBhcnNlRmxvYXQoc2l6ZU1CKSAqIDEwMjQgKiAxMDI0OyAvLyBNQiB0byBieXRlc1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBpZiAoYnl0ZXMgPT09IDApIHJldHVybiAnMCBCJztcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGNvbnN0IHVuaXRzID0gWydCJywgJ0tCJywgJ01CJywgJ0dCJywgJ1RCJ107XHJcbiAgICAgICAgICAgIGNvbnN0IGsgPSAxMDI0O1xyXG4gICAgICAgICAgICBjb25zdCBpID0gTWF0aC5mbG9vcihNYXRoLmxvZyhieXRlcykgLyBNYXRoLmxvZyhrKSk7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBjb25zdCBzaXplID0gcGFyc2VGbG9hdCgoYnl0ZXMgLyBNYXRoLnBvdyhrLCBpKSkudG9GaXhlZCgyKSk7XHJcbiAgICAgICAgICAgIHJldHVybiBzaXplICsgJyAnICsgdW5pdHNbaV07XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgYXN5bmMgZGVsZXRlU25hcHNob3Qoc25hcHNob3ROYW1lKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IFN3YWwuZmlyZSh7XHJcbiAgICAgICAgICAgICAgICB0aXRsZTogJ1jDoWMgbmjhuq1uIHjDs2EnLFxyXG4gICAgICAgICAgICAgICAgdGV4dDogYELhuqFuIGPDsyBjaOG6r2MgY2jhuq9uIG114buRbiB4w7NhIHNuYXBzaG90IFwiJHtzbmFwc2hvdE5hbWV9XCI/IEjDoG5oIMSR4buZbmcgbsOgeSBraMO0bmcgdGjhu4MgaG/DoG4gdMOhYy5gLFxyXG4gICAgICAgICAgICAgICAgaWNvbjogJ3dhcm5pbmcnLFxyXG4gICAgICAgICAgICAgICAgc2hvd0NhbmNlbEJ1dHRvbjogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIGNvbmZpcm1CdXR0b25Db2xvcjogJyNkMzMnLFxyXG4gICAgICAgICAgICAgICAgY2FuY2VsQnV0dG9uQ29sb3I6ICcjMzA4NWQ2JyxcclxuICAgICAgICAgICAgICAgIGNvbmZpcm1CdXR0b25UZXh0OiAnWMOzYScsXHJcbiAgICAgICAgICAgICAgICBjYW5jZWxCdXR0b25UZXh0OiAnSOG7p3kgYuG7jycsXHJcbiAgICAgICAgICAgICAgICByZXZlcnNlQnV0dG9uczogdHJ1ZVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIGlmICghcmVzdWx0LmlzQ29uZmlybWVkKSByZXR1cm47XHJcblxyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL3NlY3VyZS9yZW1vdmUtc25hcHNob3QnLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXHJcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAnQWNjZXB0JzogJ2FwcGxpY2F0aW9uL2pzb24nLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAnWC1DU1JGLVRPS0VOJzogY3NyZlRva2VuXHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y3RfaWQ6IHdpbmRvdy52bUlkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzbmFwc2hvdF9uYW1lOiBzbmFwc2hvdE5hbWVcclxuICAgICAgICAgICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgICAgICAgICBjcmVkZW50aWFsczogJ3NhbWUtb3JpZ2luJ1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoZGF0YS5lcnJvciA9PT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgICAgICAgICBzaG93Tm90aWZpY2F0aW9uKGRhdGEubWVzc2FnZSB8fCAnWMOzYSBzbmFwc2hvdCB0aMOgbmggY8O0bmcnLCAnc3VjY2VzcycpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIFJlZnJlc2ggc25hcHNob3QgbGlzdCBhZnRlciBzdWNjZXNzZnVsIGRlbGV0aW9uXHJcbiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmZldGNoU25hcHNob3RzKCksIDEwMDApO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZGF0YS5tZXNzYWdlIHx8ICdDw7MgbOG7l2kgeOG6o3kgcmEga2hpIHjDs2Egc25hcHNob3QnKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGRlbGV0aW5nIHNuYXBzaG90OicsIGVycm9yKTtcclxuICAgICAgICAgICAgICAgIHNob3dOb3RpZmljYXRpb24oZXJyb3IubWVzc2FnZSB8fCAnQ8OzIGzhu5dpIHjhuqN5IHJhIGtoaSB4w7NhIHNuYXBzaG90JywgJ2Vycm9yJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBhc3luYyByZXZlcnRTbmFwc2hvdChzbmFwc2hvdE5hbWUpIHtcclxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgU3dhbC5maXJlKHtcclxuICAgICAgICAgICAgICAgIHRpdGxlOiAnWMOhYyBuaOG6rW4ga2jDtGkgcGjhu6VjJyxcclxuICAgICAgICAgICAgICAgIHRleHQ6IGBC4bqhbiBjw7MgY2jhuq9jIGNo4bqvbiBtdeG7kW4ga2jDtGkgcGjhu6VjIHbhu4Egc25hcHNob3QgXCIke3NuYXBzaG90TmFtZX1cIj8gVOG6pXQgY+G6oyBk4buvIGxp4buHdSBoaeG7h24gdOG6oWkgc+G6vSBi4buLIG3huqV0LmAsXHJcbiAgICAgICAgICAgICAgICBpY29uOiAnd2FybmluZycsXHJcbiAgICAgICAgICAgICAgICBzaG93Q2FuY2VsQnV0dG9uOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgY29uZmlybUJ1dHRvbkNvbG9yOiAnIzMwODVkNicsXHJcbiAgICAgICAgICAgICAgICBjYW5jZWxCdXR0b25Db2xvcjogJyNkMzMnLFxyXG4gICAgICAgICAgICAgICAgY29uZmlybUJ1dHRvblRleHQ6ICdLaMO0aSBwaOG7pWMnLFxyXG4gICAgICAgICAgICAgICAgY2FuY2VsQnV0dG9uVGV4dDogJ0jhu6d5IGLhu48nLFxyXG4gICAgICAgICAgICAgICAgcmV2ZXJzZUJ1dHRvbnM6IHRydWVcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICBpZiAoIXJlc3VsdC5pc0NvbmZpcm1lZCkgcmV0dXJuO1xyXG5cclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9zZWN1cmUvcmV2ZXJ0LXNuYXBzaG90Jywge1xyXG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxyXG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgJ0FjY2VwdCc6ICdhcHBsaWNhdGlvbi9qc29uJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgJ1gtQ1NSRi1UT0tFTic6IGNzcmZUb2tlblxyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9kdWN0X2lkOiB3aW5kb3cudm1JZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgc25hcHNob3RfbmFtZTogc25hcHNob3ROYW1lXHJcbiAgICAgICAgICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgICAgICAgICAgY3JlZGVudGlhbHM6ICdzYW1lLW9yaWdpbidcclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGRhdGEuZXJyb3IgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2hvd05vdGlmaWNhdGlvbihkYXRhLm1lc3NhZ2UgfHwgJ0tow7RpIHBo4bulYyBzbmFwc2hvdCB0aMOgbmggY8O0bmcnLCAnc3VjY2VzcycpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIFJlZnJlc2ggc25hcHNob3QgbGlzdCBhZnRlciBzdWNjZXNzZnVsIHJldmVydFxyXG4gICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5mZXRjaFNuYXBzaG90cygpLCAyMDAwKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGRhdGEubWVzc2FnZSB8fCAnQ8OzIGzhu5dpIHjhuqN5IHJhIGtoaSBraMO0aSBwaOG7pWMgc25hcHNob3QnKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHJldmVydGluZyBzbmFwc2hvdDonLCBlcnJvcik7XHJcbiAgICAgICAgICAgICAgICBzaG93Tm90aWZpY2F0aW9uKGVycm9yLm1lc3NhZ2UgfHwgJ0PDsyBs4buXaSB44bqjeSByYSBraGkga2jDtGkgcGjhu6VjIHNuYXBzaG90JywgJ2Vycm9yJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBIZWxwZXIgbWV0aG9kIHRvIHJlZnJlc2ggc25hcHNob3RzXHJcbiAgICAgICAgcmVmcmVzaFNuYXBzaG90cygpIHtcclxuICAgICAgICAgICAgdGhpcy5mZXRjaFNuYXBzaG90cygpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIEhlbHBlciBtZXRob2QgdG8gZ2V0IHNuYXBzaG90IGNvdW50XHJcbiAgICAgICAgZ2V0U25hcHNob3RDb3VudCgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc25hcHNob3RzLmxlbmd0aDtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBIZWxwZXIgbWV0aG9kIHRvIGNoZWNrIGlmIHNuYXBzaG90cyBhcmUgbG9hZGluZ1xyXG4gICAgICAgIGlzTG9hZGluZygpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9hZGluZztcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBIZWxwZXIgbWV0aG9kIHRvIGNoZWNrIGlmIHRoZXJlJ3MgYW4gZXJyb3JcclxuICAgICAgICBoYXNFcnJvcigpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXJyb3IgIT09IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59Il0sIm1hcHBpbmdzIjoiOytDQUNBLHFKQUFBQSxtQkFBQSxZQUFBQSxvQkFBQSxXQUFBQyxDQUFBLFNBQUFDLENBQUEsRUFBQUQsQ0FBQSxPQUFBRSxDQUFBLEdBQUFDLE1BQUEsQ0FBQUMsU0FBQSxFQUFBQyxDQUFBLEdBQUFILENBQUEsQ0FBQUksY0FBQSxFQUFBQyxDQUFBLEdBQUFKLE1BQUEsQ0FBQUssY0FBQSxjQUFBUCxDQUFBLEVBQUFELENBQUEsRUFBQUUsQ0FBQSxJQUFBRCxDQUFBLENBQUFELENBQUEsSUFBQUUsQ0FBQSxDQUFBTyxLQUFBLEtBQUFDLENBQUEsd0JBQUFDLE1BQUEsR0FBQUEsTUFBQSxPQUFBQyxDQUFBLEdBQUFGLENBQUEsQ0FBQUcsUUFBQSxrQkFBQUMsQ0FBQSxHQUFBSixDQUFBLENBQUFLLGFBQUEsdUJBQUFDLENBQUEsR0FBQU4sQ0FBQSxDQUFBTyxXQUFBLDhCQUFBQyxPQUFBakIsQ0FBQSxFQUFBRCxDQUFBLEVBQUFFLENBQUEsV0FBQUMsTUFBQSxDQUFBSyxjQUFBLENBQUFQLENBQUEsRUFBQUQsQ0FBQSxJQUFBUyxLQUFBLEVBQUFQLENBQUEsRUFBQWlCLFVBQUEsTUFBQUMsWUFBQSxNQUFBQyxRQUFBLFNBQUFwQixDQUFBLENBQUFELENBQUEsV0FBQWtCLE1BQUEsbUJBQUFqQixDQUFBLElBQUFpQixNQUFBLFlBQUFB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LGdCQUFnQixDQUFDa0osU0FBQSxDQUFBakgsRUFBQSxDQUFNaEMsT0FBTyxJQUFJLHNDQUFzQyxFQUFFLE9BQU8sQ0FBQztZQUFDO1lBQUE7Y0FBQSxPQUFBaUosU0FBQSxDQUFBL0ssSUFBQTtVQUFBO1FBQUEsR0FBQTZLLFFBQUE7TUFBQTtJQUUzRixDQUFDO0lBRUQ7SUFDQUcsZ0JBQWdCLFdBQWhCQSxnQkFBZ0JBLENBQUEsRUFBRztNQUNmLElBQUksQ0FBQzFDLGNBQWMsQ0FBQyxDQUFDO0lBQ3pCLENBQUM7SUFFRDtJQUNBMkMsZ0JBQWdCLFdBQWhCQSxnQkFBZ0JBLENBQUEsRUFBRztNQUNmLE9BQU8sSUFBSSxDQUFDNUMsU0FBUyxDQUFDdEosTUFBTTtJQUNoQyxDQUFDO0lBRUQ7SUFDQW1NLFNBQVMsV0FBVEEsU0FBU0EsQ0FBQSxFQUFHO01BQ1IsT0FBTyxJQUFJLENBQUN0RyxPQUFPO0lBQ3ZCLENBQUM7SUFFRDtJQUNBdUcsUUFBUSxXQUFSQSxRQUFRQSxDQUFBLEVBQUc7TUFDUCxPQUFPLElBQUksQ0FBQ2xKLEtBQUssS0FBSyxJQUFJO0lBQzlCO0VBQ0osQ0FBQztBQUNMIiwiaWdub3JlTGlzdCI6W10sImZpbGUiOiIuL3Jlc291cmNlcy9qcy9zZXJ2aWNlL3NlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./resources/js/service/service.js\n"); +eval("function _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nfunction _regeneratorRuntime() { \"use strict\"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return e; }; var t, e = {}, r = Object.prototype, n = r.hasOwnProperty, o = Object.defineProperty || function (t, e, r) { t[e] = r.value; }, i = \"function\" == typeof Symbol ? Symbol : {}, a = i.iterator || \"@@iterator\", c = i.asyncIterator || \"@@asyncIterator\", u = i.toStringTag || \"@@toStringTag\"; function define(t, e, r) { return Object.defineProperty(t, e, { value: r, enumerable: !0, configurable: !0, writable: !0 }), t[e]; } try { define({}, \"\"); } catch (t) { define = function define(t, e, r) { return t[e] = r; }; } function wrap(t, e, r, n) { var i = e && e.prototype instanceof Generator ? e : Generator, a = Object.create(i.prototype), c = new Context(n || []); return o(a, \"_invoke\", { value: makeInvokeMethod(t, r, c) }), a; } function tryCatch(t, e, r) { try { return { type: \"normal\", arg: t.call(e, r) }; } catch (t) { return { type: \"throw\", arg: t }; } } e.wrap = wrap; var h = \"suspendedStart\", l = \"suspendedYield\", f = \"executing\", s = \"completed\", y = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var p = {}; define(p, a, function () { return this; }); var d = Object.getPrototypeOf, v = d && d(d(values([]))); v && v !== r && n.call(v, a) && (p = v); var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p); function defineIteratorMethods(t) { [\"next\", \"throw\", \"return\"].forEach(function (e) { define(t, e, function (t) { return this._invoke(e, t); }); }); } function AsyncIterator(t, e) { function invoke(r, o, i, a) { var c = tryCatch(t[r], t, o); if (\"throw\" !== c.type) { var u = c.arg, h = u.value; return h && \"object\" == _typeof(h) && n.call(h, \"__await\") ? e.resolve(h.__await).then(function (t) { invoke(\"next\", t, i, a); }, function (t) { invoke(\"throw\", t, i, a); }) : e.resolve(h).then(function (t) { u.value = t, i(u); }, function (t) { return invoke(\"throw\", t, i, a); }); } a(c.arg); } var r; o(this, \"_invoke\", { value: function value(t, n) { function callInvokeWithMethodAndArg() { return new e(function (e, r) { invoke(t, n, e, r); }); } return r = r ? r.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(e, r, n) { var o = h; return function (i, a) { if (o === f) throw Error(\"Generator is already running\"); if (o === s) { if (\"throw\" === i) throw a; return { value: t, done: !0 }; } for (n.method = i, n.arg = a;;) { var c = n.delegate; if (c) { var u = maybeInvokeDelegate(c, n); if (u) { if (u === y) continue; return u; } } if (\"next\" === n.method) n.sent = n._sent = n.arg;else if (\"throw\" === n.method) { if (o === h) throw o = s, n.arg; n.dispatchException(n.arg); } else \"return\" === n.method && n.abrupt(\"return\", n.arg); o = f; var p = tryCatch(e, r, n); if (\"normal\" === p.type) { if (o = n.done ? s : l, p.arg === y) continue; return { value: p.arg, done: n.done }; } \"throw\" === p.type && (o = s, n.method = \"throw\", n.arg = p.arg); } }; } function maybeInvokeDelegate(e, r) { var n = r.method, o = e.iterator[n]; if (o === t) return r.delegate = null, \"throw\" === n && e.iterator[\"return\"] && (r.method = \"return\", r.arg = t, maybeInvokeDelegate(e, r), \"throw\" === r.method) || \"return\" !== n && (r.method = \"throw\", r.arg = new TypeError(\"The iterator does not provide a '\" + n + \"' method\")), y; var i = tryCatch(o, e.iterator, r.arg); if (\"throw\" === i.type) return r.method = \"throw\", r.arg = i.arg, r.delegate = null, y; var a = i.arg; return a ? a.done ? (r[e.resultName] = a.value, r.next = e.nextLoc, \"return\" !== r.method && (r.method = \"next\", r.arg = t), r.delegate = null, y) : a : (r.method = \"throw\", r.arg = new TypeError(\"iterator result is not an object\"), r.delegate = null, y); } function pushTryEntry(t) { var e = { tryLoc: t[0] }; 1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e); } function resetTryEntry(t) { var e = t.completion || {}; e.type = \"normal\", delete e.arg, t.completion = e; } function Context(t) { this.tryEntries = [{ tryLoc: \"root\" }], t.forEach(pushTryEntry, this), this.reset(!0); } function values(e) { if (e || \"\" === e) { var r = e[a]; if (r) return r.call(e); if (\"function\" == typeof e.next) return e; if (!isNaN(e.length)) { var o = -1, i = function next() { for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = !1, next; return next.value = t, next.done = !0, next; }; return i.next = i; } } throw new TypeError(_typeof(e) + \" is not iterable\"); } return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, \"constructor\", { value: GeneratorFunctionPrototype, configurable: !0 }), o(GeneratorFunctionPrototype, \"constructor\", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, \"GeneratorFunction\"), e.isGeneratorFunction = function (t) { var e = \"function\" == typeof t && t.constructor; return !!e && (e === GeneratorFunction || \"GeneratorFunction\" === (e.displayName || e.name)); }, e.mark = function (t) { return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, define(t, u, \"GeneratorFunction\")), t.prototype = Object.create(g), t; }, e.awrap = function (t) { return { __await: t }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, c, function () { return this; }), e.AsyncIterator = AsyncIterator, e.async = function (t, r, n, o, i) { void 0 === i && (i = Promise); var a = new AsyncIterator(wrap(t, r, n, o), i); return e.isGeneratorFunction(r) ? a : a.next().then(function (t) { return t.done ? t.value : a.next(); }); }, defineIteratorMethods(g), define(g, u, \"Generator\"), define(g, a, function () { return this; }), define(g, \"toString\", function () { return \"[object Generator]\"; }), e.keys = function (t) { var e = Object(t), r = []; for (var n in e) r.push(n); return r.reverse(), function next() { for (; r.length;) { var t = r.pop(); if (t in e) return next.value = t, next.done = !1, next; } return next.done = !0, next; }; }, e.values = values, Context.prototype = { constructor: Context, reset: function reset(e) { if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = \"next\", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) \"t\" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t); }, stop: function stop() { this.done = !0; var t = this.tryEntries[0].completion; if (\"throw\" === t.type) throw t.arg; return this.rval; }, dispatchException: function dispatchException(e) { if (this.done) throw e; var r = this; function handle(n, o) { return a.type = \"throw\", a.arg = e, r.next = n, o && (r.method = \"next\", r.arg = t), !!o; } for (var o = this.tryEntries.length - 1; o >= 0; --o) { var i = this.tryEntries[o], a = i.completion; if (\"root\" === i.tryLoc) return handle(\"end\"); if (i.tryLoc <= this.prev) { var c = n.call(i, \"catchLoc\"), u = n.call(i, \"finallyLoc\"); if (c && u) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } else if (c) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); } else { if (!u) throw Error(\"try statement without catch or finally\"); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } } } }, abrupt: function abrupt(t, e) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var o = this.tryEntries[r]; if (o.tryLoc <= this.prev && n.call(o, \"finallyLoc\") && this.prev < o.finallyLoc) { var i = o; break; } } i && (\"break\" === t || \"continue\" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null); var a = i ? i.completion : {}; return a.type = t, a.arg = e, i ? (this.method = \"next\", this.next = i.finallyLoc, y) : this.complete(a); }, complete: function complete(t, e) { if (\"throw\" === t.type) throw t.arg; return \"break\" === t.type || \"continue\" === t.type ? this.next = t.arg : \"return\" === t.type ? (this.rval = this.arg = t.arg, this.method = \"return\", this.next = \"end\") : \"normal\" === t.type && e && (this.next = e), y; }, finish: function finish(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y; } }, \"catch\": function _catch(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.tryLoc === t) { var n = r.completion; if (\"throw\" === n.type) { var o = n.arg; resetTryEntry(r); } return o; } } throw Error(\"illegal catch attempt\"); }, delegateYield: function delegateYield(e, r, n) { return this.delegate = { iterator: values(e), resultName: r, nextLoc: n }, \"next\" === this.method && (this.arg = t), y; } }, e; }\nfunction asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }\nfunction _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"next\", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"throw\", n); } _next(void 0); }); }; }\n// Global variables - NO SENSITIVE DATA (no tokens)\nvar invoiceId;\nvar vmId;\nvar vmHostname;\nvar csrfToken;\n\n// Initialize variables from data attributes or global variables\nfunction initializeVariables() {\n // Get data from meta tags or global variables set in Blade template\n var metaInvoiceId = document.querySelector('meta[name=\"invoice-id\"]');\n var metaVmId = document.querySelector('meta[name=\"vm-id\"]');\n var metaVmHostname = document.querySelector('meta[name=\"vm-hostname\"]');\n var metaCsrfToken = document.querySelector('meta[name=\"csrf-token\"]');\n invoiceId = metaInvoiceId ? metaInvoiceId.getAttribute('content') : window.invoiceId;\n vmId = metaVmId ? metaVmId.getAttribute('content') : window.vmId;\n vmHostname = metaVmHostname ? metaVmHostname.getAttribute('content') : window.vmHostname;\n csrfToken = metaCsrfToken ? metaCsrfToken.getAttribute('content') : window.csrfToken;\n}\n\n// Cấu hình toast nếu có thể\nif (typeof FuiToast !== 'undefined' && FuiToast.config) {\n FuiToast.config({\n position: 'top-center'\n });\n}\nfunction showNotification(message) {\n var type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'success';\n if (type === 'success') {\n FuiToast.success(message);\n } else {\n FuiToast.error(message);\n }\n}\nfunction createSnapshot() {\n return _createSnapshot.apply(this, arguments);\n} // Handle snapshot form submission with loading notification\nfunction _createSnapshot() {\n _createSnapshot = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee5() {\n var snapshotBtn, requestBody, headers, snapshotPromise;\n return _regeneratorRuntime().wrap(function _callee5$(_context5) {\n while (1) switch (_context5.prev = _context5.next) {\n case 0:\n snapshotBtn = document.getElementById('createSnapshotButton');\n if (!(snapshotBtn && snapshotBtn.disabled)) {\n _context5.next = 3;\n break;\n }\n return _context5.abrupt(\"return\");\n case 3:\n requestBody = {\n product_id: vmId\n };\n headers = {\n 'Content-Type': 'application/json',\n 'Accept': 'application/json',\n 'X-CSRF-TOKEN': csrfToken\n // NO Authorization header - using session auth\n };\n snapshotPromise = fetch('/secure/create-snapshots', {\n method: 'POST',\n headers: headers,\n body: JSON.stringify(requestBody),\n credentials: 'same-origin'\n }).then(/*#__PURE__*/function () {\n var _ref = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee4(response) {\n var data, text, errorMessage;\n return _regeneratorRuntime().wrap(function _callee4$(_context4) {\n while (1) switch (_context4.prev = _context4.next) {\n case 0:\n if (!(response.redirected || response.status === 401)) {\n _context4.next = 2;\n break;\n }\n throw new Error('Phiên đăng nhập đã hết hạn, vui lòng đăng nhập lại');\n case 2:\n if (!response.redirected) {\n _context4.next = 4;\n break;\n }\n return _context4.abrupt(\"return\", 'Đã gửi yêu cầu tạo snapshot. Quá trình sẽ mất 3-5 phút, vui lòng chờ đợi.');\n case 4:\n _context4.prev = 4;\n _context4.next = 7;\n return response.text();\n case 7:\n text = _context4.sent;\n _context4.prev = 8;\n data = JSON.parse(text);\n _context4.next = 20;\n break;\n case 12:\n _context4.prev = 12;\n _context4.t0 = _context4[\"catch\"](8);\n if (!(text.includes('success') || response.ok)) {\n _context4.next = 19;\n break;\n }\n setTimeout(function () {\n location.reload();\n }, 2000);\n return _context4.abrupt(\"return\", 'Đã gửi yêu cầu tạo snapshot. Quá trình sẽ mất 3-5 phút, vui lòng chờ đợi.');\n case 19:\n throw new Error('Có lỗi xảy ra khi gửi yêu cầu tạo snapshot');\n case 20:\n _context4.next = 25;\n break;\n case 22:\n _context4.prev = 22;\n _context4.t1 = _context4[\"catch\"](4);\n throw new Error('Lỗi định dạng dữ liệu từ máy chủ');\n case 25:\n if (!(data && !data.error)) {\n _context4.next = 30;\n break;\n }\n setTimeout(function () {\n location.reload();\n }, 2000);\n return _context4.abrupt(\"return\", data.message || 'Đã gửi yêu cầu tạo snapshot. Quá trình sẽ mất 3-5 phút, vui lòng chờ đợi.');\n case 30:\n errorMessage = 'Có lỗi xảy ra khi tạo snapshot';\n if (data && data.message) {\n if (_typeof(data.message) === 'object') {\n if (data.message.messages && data.message.messages.length > 0) {\n errorMessage = data.message.messages[0].default_message || data.message.messages[0].message || 'Có lỗi xảy ra';\n } else if (data.message.error_type) {\n errorMessage = \"L\\u1ED7i: \".concat(data.message.error_type);\n } else {\n errorMessage = 'Có lỗi xảy ra từ hệ thống';\n }\n } else {\n errorMessage = data.message;\n }\n } else if (data && data.value && data.value.messages && data.value.messages.length > 0) {\n errorMessage = data.value.messages[0].default_message;\n } else if (typeof data === 'string') {\n errorMessage = data;\n } else if (data && data.error) {\n if (_typeof(data.error) === 'object') {\n if (data.error.message) {\n errorMessage = data.error.message;\n } else if (data.error.toString && data.error.toString() !== '[object Object]') {\n errorMessage = data.error.toString();\n } else {\n errorMessage = 'Có lỗi xảy ra từ hệ thống';\n }\n } else {\n errorMessage = data.error;\n }\n }\n throw new Error(errorMessage);\n case 33:\n case \"end\":\n return _context4.stop();\n }\n }, _callee4, null, [[4, 22], [8, 12]]);\n }));\n return function (_x) {\n return _ref.apply(this, arguments);\n };\n }());\n FuiToast.promise(snapshotPromise, {\n loading: 'Đang gửi yêu cầu tạo snapshot... (Quá trình mất 3-5 phút vui lòng giữ trang không tắt!)',\n success: function success(data) {\n return data;\n },\n error: function error(_error2) {\n console.error(_error2);\n return _error2.message || 'Có lỗi xảy ra khi tạo snapshot';\n }\n }, {\n isClose: true\n });\n case 7:\n case \"end\":\n return _context5.stop();\n }\n }, _callee5);\n }));\n return _createSnapshot.apply(this, arguments);\n}\nfunction handleSnapshotSubmit(event) {\n event.preventDefault();\n var snapshotPromise = new Promise(function (resolve, reject) {\n var form = document.getElementById('snapshotForm');\n var formData = new FormData(form);\n fetch(form.action, {\n method: 'POST',\n body: formData,\n headers: {\n 'X-CSRF-TOKEN': csrfToken\n }\n }).then(function (response) {\n if (response.redirected) {\n resolve('Đã gửi yêu cầu tạo snapshot! Quá trình sẽ mất 3-5 phút.');\n window.location.href = response.url;\n } else if (response.ok) {\n resolve('Đã gửi yêu cầu tạo snapshot! Quá trình sẽ mất 3-5 phút.');\n setTimeout(function () {\n window.location.reload();\n }, 2000);\n } else {\n response.text().then(function (text) {\n reject('Có lỗi xảy ra khi gửi yêu cầu tạo snapshot');\n });\n }\n })[\"catch\"](function (error) {\n reject('Lỗi kết nối: ' + error.message);\n });\n });\n if (typeof FuiToast !== 'undefined' && FuiToast.promise) {\n FuiToast.promise(snapshotPromise, {\n loading: 'Đang gửi yêu cầu tạo snapshot...',\n success: function success(data) {\n return data || 'Đã gửi yêu cầu tạo snapshot!';\n },\n error: function error(_error) {\n return _error || 'Có lỗi xảy ra khi gửi yêu cầu tạo snapshot';\n }\n });\n } else {\n if (typeof FuiToast !== 'undefined') {\n FuiToast.loading('Đang gửi yêu cầu tạo snapshot...', {\n duration: 0\n });\n } else {\n alert('Đang gửi yêu cầu tạo snapshot...');\n }\n setTimeout(function () {\n document.getElementById('snapshotForm').submit();\n }, 500);\n }\n}\nfunction startVirtualMachine() {\n return _startVirtualMachine.apply(this, arguments);\n}\nfunction _startVirtualMachine() {\n _startVirtualMachine = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee7() {\n var startBtn, requestBody, headers, startPromise;\n return _regeneratorRuntime().wrap(function _callee7$(_context7) {\n while (1) switch (_context7.prev = _context7.next) {\n case 0:\n startBtn = document.getElementById('startVMButton');\n if (!(startBtn && startBtn.disabled)) {\n _context7.next = 3;\n break;\n }\n return _context7.abrupt(\"return\");\n case 3:\n requestBody = {\n vm_id: vmId\n };\n headers = {\n 'Content-Type': 'application/json',\n 'Accept': 'application/json',\n 'X-CSRF-TOKEN': csrfToken\n // NO Authorization header - using session auth\n };\n startPromise = fetch('/api/secure/start-vm', {\n method: 'POST',\n headers: headers,\n body: JSON.stringify(requestBody),\n credentials: 'same-origin'\n }).then(/*#__PURE__*/function () {\n var _ref2 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee6(response) {\n var data, errorMessage;\n return _regeneratorRuntime().wrap(function _callee6$(_context6) {\n while (1) switch (_context6.prev = _context6.next) {\n case 0:\n if (!(response.redirected || response.status === 401)) {\n _context6.next = 2;\n break;\n }\n throw new Error('Phiên đăng nhập đã hết hạn, vui lòng đăng nhập lại');\n case 2:\n _context6.prev = 2;\n _context6.next = 5;\n return response.json();\n case 5:\n data = _context6.sent;\n _context6.next = 11;\n break;\n case 8:\n _context6.prev = 8;\n _context6.t0 = _context6[\"catch\"](2);\n throw new Error('Lỗi định dạng dữ liệu từ máy chủ');\n case 11:\n if (data.error) {\n _context6.next = 16;\n break;\n }\n setTimeout(function () {\n location.reload();\n }, 2000);\n return _context6.abrupt(\"return\", data.message);\n case 16:\n if (!(data.type === 'com.vmware.vapi.std.errors.already_in_desired_state' || data.message && data.message.error_type === 'ALREADY_IN_DESIRED_STATE')) {\n _context6.next = 21;\n break;\n }\n setTimeout(function () {\n location.reload();\n }, 2000);\n return _context6.abrupt(\"return\", 'Máy chủ đã được bật');\n case 21:\n errorMessage = 'Có lỗi xảy ra';\n if (data.message) {\n if (_typeof(data.message) === 'object') {\n if (data.message.messages && data.message.messages.length > 0) {\n errorMessage = data.message.messages[0].default_message || data.message.messages[0].message || 'Có lỗi xảy ra';\n } else if (data.message.error_type) {\n errorMessage = \"L\\u1ED7i: \".concat(data.message.error_type);\n } else {\n errorMessage = 'Có lỗi xảy ra từ hệ thống';\n }\n } else {\n errorMessage = data.message;\n }\n } else if (data.value && data.value.messages && data.value.messages.length > 0) {\n errorMessage = data.value.messages[0].default_message;\n } else if (typeof data === 'string') {\n errorMessage = data;\n } else if (data.error) {\n if (_typeof(data.error) === 'object') {\n if (data.error.message) {\n errorMessage = data.error.message;\n } else if (data.error.toString && data.error.toString() !== '[object Object]') {\n errorMessage = data.error.toString();\n } else {\n errorMessage = 'Có lỗi xảy ra từ hệ thống';\n }\n } else {\n errorMessage = data.error;\n }\n }\n throw new Error(errorMessage);\n case 24:\n case \"end\":\n return _context6.stop();\n }\n }, _callee6, null, [[2, 8]]);\n }));\n return function (_x2) {\n return _ref2.apply(this, arguments);\n };\n }());\n FuiToast.promise(startPromise, {\n loading: 'Đang khởi động máy ảo...',\n success: function success(data) {\n return data;\n },\n error: function error(_error3) {\n console.error(_error3);\n return _error3.message || 'Có lỗi xảy ra khi khởi động máy ảo';\n }\n }, {\n isClose: true\n });\n case 7:\n case \"end\":\n return _context7.stop();\n }\n }, _callee7);\n }));\n return _startVirtualMachine.apply(this, arguments);\n}\nfunction stopVirtualMachine() {\n return _stopVirtualMachine.apply(this, arguments);\n}\nfunction _stopVirtualMachine() {\n _stopVirtualMachine = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee9() {\n var stopBtn, requestBody, headers, stopPromise;\n return _regeneratorRuntime().wrap(function _callee9$(_context9) {\n while (1) switch (_context9.prev = _context9.next) {\n case 0:\n stopBtn = document.getElementById('stopVMButton');\n if (!(stopBtn && stopBtn.disabled)) {\n _context9.next = 3;\n break;\n }\n return _context9.abrupt(\"return\");\n case 3:\n requestBody = {\n vm_id: vmId\n };\n headers = {\n 'Content-Type': 'application/json',\n 'Accept': 'application/json',\n 'X-CSRF-TOKEN': csrfToken\n // NO Authorization header - using session auth\n };\n stopPromise = fetch('/api/secure/stop-vm', {\n method: 'POST',\n headers: headers,\n body: JSON.stringify(requestBody),\n credentials: 'same-origin'\n }).then(/*#__PURE__*/function () {\n var _ref3 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee8(response) {\n var data, errorMessage;\n return _regeneratorRuntime().wrap(function _callee8$(_context8) {\n while (1) switch (_context8.prev = _context8.next) {\n case 0:\n if (!(response.redirected || response.status === 401)) {\n _context8.next = 2;\n break;\n }\n throw new Error('Phiên đăng nhập đã hết hạn, vui lòng đăng nhập lại');\n case 2:\n _context8.prev = 2;\n _context8.next = 5;\n return response.json();\n case 5:\n data = _context8.sent;\n _context8.next = 11;\n break;\n case 8:\n _context8.prev = 8;\n _context8.t0 = _context8[\"catch\"](2);\n throw new Error('Lỗi định dạng dữ liệu từ máy chủ');\n case 11:\n if (data.error) {\n _context8.next = 16;\n break;\n }\n setTimeout(function () {\n location.reload();\n }, 2000);\n return _context8.abrupt(\"return\", data.message);\n case 16:\n if (!(data.type === 'com.vmware.vapi.std.errors.already_in_desired_state' || data.message && data.message.error_type === 'ALREADY_IN_DESIRED_STATE')) {\n _context8.next = 21;\n break;\n }\n setTimeout(function () {\n location.reload();\n }, 2000);\n return _context8.abrupt(\"return\", 'Máy chủ đã được tắt');\n case 21:\n errorMessage = 'Có lỗi xảy ra';\n if (data.message) {\n if (_typeof(data.message) === 'object') {\n if (data.message.messages && data.message.messages.length > 0) {\n errorMessage = data.message.messages[0].default_message || data.message.messages[0].message || 'Có lỗi xảy ra';\n } else if (data.message.error_type) {\n errorMessage = \"L\\u1ED7i: \".concat(data.message.error_type);\n } else {\n errorMessage = 'Có lỗi xảy ra từ hệ thống';\n }\n } else {\n errorMessage = data.message;\n }\n } else if (data.value && data.value.messages && data.value.messages.length > 0) {\n errorMessage = data.value.messages[0].default_message;\n } else if (typeof data === 'string') {\n errorMessage = data;\n } else if (data.error) {\n if (_typeof(data.error) === 'object') {\n if (data.error.message) {\n errorMessage = data.error.message;\n } else if (data.error.toString && data.error.toString() !== '[object Object]') {\n errorMessage = data.error.toString();\n } else {\n errorMessage = 'Có lỗi xảy ra từ hệ thống';\n }\n } else {\n errorMessage = data.error;\n }\n }\n throw new Error(errorMessage);\n case 24:\n case \"end\":\n return _context8.stop();\n }\n }, _callee8, null, [[2, 8]]);\n }));\n return function (_x3) {\n return _ref3.apply(this, arguments);\n };\n }());\n FuiToast.promise(stopPromise, {\n loading: 'Đang dừng máy ảo...',\n success: function success(data) {\n return data;\n },\n error: function error(_error4) {\n console.error(_error4);\n return _error4.message || 'Có lỗi xảy ra khi dừng máy ảo';\n }\n }, {\n isClose: true\n });\n case 7:\n case \"end\":\n return _context9.stop();\n }\n }, _callee9);\n }));\n return _stopVirtualMachine.apply(this, arguments);\n}\nfunction restartVirtualMachine() {\n return _restartVirtualMachine.apply(this, arguments);\n} // DOM ready\nfunction _restartVirtualMachine() {\n _restartVirtualMachine = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee11() {\n var restartBtn, restartPromise;\n return _regeneratorRuntime().wrap(function _callee11$(_context11) {\n while (1) switch (_context11.prev = _context11.next) {\n case 0:\n restartBtn = document.getElementById('restartVMButton');\n if (!(restartBtn && restartBtn.disabled)) {\n _context11.next = 3;\n break;\n }\n return _context11.abrupt(\"return\");\n case 3:\n restartPromise = fetch(\"/service/\".concat(invoiceId, \"/vm/toggle\"), {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-CSRF-TOKEN': csrfToken\n },\n body: JSON.stringify({\n action: 'restart'\n })\n }).then(/*#__PURE__*/function () {\n var _ref4 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee10(response) {\n var data, errorMessage;\n return _regeneratorRuntime().wrap(function _callee10$(_context10) {\n while (1) switch (_context10.prev = _context10.next) {\n case 0:\n _context10.prev = 0;\n _context10.next = 3;\n return response.json();\n case 3:\n data = _context10.sent;\n _context10.next = 9;\n break;\n case 6:\n _context10.prev = 6;\n _context10.t0 = _context10[\"catch\"](0);\n throw new Error('Lỗi định dạng dữ liệu từ máy chủ');\n case 9:\n if (!data.success) {\n _context10.next = 14;\n break;\n }\n setTimeout(function () {\n location.reload();\n }, 2000);\n return _context10.abrupt(\"return\", data.message);\n case 14:\n errorMessage = 'Có lỗi xảy ra';\n if (data.message) {\n if (_typeof(data.message) === 'object') {\n if (data.message.messages && data.message.messages.length > 0) {\n errorMessage = data.message.messages[0].default_message || data.message.messages[0].message || 'Có lỗi xảy ra';\n } else if (data.message.error_type) {\n errorMessage = \"L\\u1ED7i: \".concat(data.message.error_type);\n } else {\n errorMessage = 'Có lỗi xảy ra từ hệ thống';\n }\n } else {\n errorMessage = data.message;\n }\n } else if (data.error) {\n if (_typeof(data.error) === 'object') {\n if (data.error.message) {\n errorMessage = data.error.message;\n } else if (data.error.toString && data.error.toString() !== '[object Object]') {\n errorMessage = data.error.toString();\n } else {\n errorMessage = 'Có lỗi xảy ra từ hệ thống';\n }\n } else {\n errorMessage = data.error;\n }\n } else if (typeof data === 'string') {\n errorMessage = data;\n }\n throw new Error(errorMessage);\n case 17:\n case \"end\":\n return _context10.stop();\n }\n }, _callee10, null, [[0, 6]]);\n }));\n return function (_x4) {\n return _ref4.apply(this, arguments);\n };\n }());\n FuiToast.promise(restartPromise, {\n loading: 'Đang khởi động lại máy ảo...',\n success: function success(data) {\n return data;\n },\n error: function error(_error5) {\n console.error(_error5);\n return _error5.message || 'Có lỗi xảy ra khi khởi động lại máy ảo';\n }\n }, {\n isClose: true\n });\n case 5:\n case \"end\":\n return _context11.stop();\n }\n }, _callee11);\n }));\n return _restartVirtualMachine.apply(this, arguments);\n}\ndocument.addEventListener('DOMContentLoaded', function () {\n // Initialize variables\n initializeVariables();\n var startBtn = document.getElementById('startVMButton');\n var stopBtn = document.getElementById('stopVMButton');\n var restartBtn = document.getElementById('restartVMButton');\n var snapshotBtn = document.getElementById('createSnapshotButton');\n if (startBtn) {\n startBtn.addEventListener('click', function (e) {\n e.preventDefault();\n e.stopPropagation();\n startVirtualMachine();\n });\n }\n if (stopBtn) {\n stopBtn.addEventListener('click', function (e) {\n e.preventDefault();\n e.stopPropagation();\n stopVirtualMachine();\n });\n }\n if (restartBtn) {\n restartBtn.addEventListener('click', function (e) {\n e.preventDefault();\n e.stopPropagation();\n restartVirtualMachine();\n });\n }\n if (snapshotBtn) {\n snapshotBtn.addEventListener('click', function (e) {\n e.preventDefault();\n e.stopPropagation();\n createSnapshot();\n });\n }\n});\n\n// Snapshot Table Management\nfunction snapshotTable() {\n return {\n loading: false,\n snapshots: [],\n error: null,\n fetchSnapshots: function fetchSnapshots() {\n var _this = this;\n return _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee() {\n var vmId, response, data;\n return _regeneratorRuntime().wrap(function _callee$(_context) {\n while (1) switch (_context.prev = _context.next) {\n case 0:\n _this.loading = true;\n _this.error = null;\n vmId = window.vmId || '';\n if (vmId) {\n _context.next = 7;\n break;\n }\n _this.loading = false;\n _this.error = 'Không tìm thấy ID máy ảo';\n return _context.abrupt(\"return\");\n case 7:\n _context.prev = 7;\n _context.next = 10;\n return fetch(\"/secure/get-snapshots?product_id=\".concat(vmId), {\n method: 'GET',\n headers: {\n 'Accept': 'application/json',\n 'X-CSRF-TOKEN': csrfToken,\n 'Cache-Control': 'no-cache'\n },\n credentials: 'same-origin'\n });\n case 10:\n response = _context.sent;\n if (response.ok) {\n _context.next = 13;\n break;\n }\n throw new Error(\"HTTP error! status: \".concat(response.status));\n case 13:\n _context.next = 15;\n return response.json();\n case 15:\n data = _context.sent;\n // Kiểm tra response structure từ API thực tế\n if (data.error === false && data.data && data.data.snapshots) {\n _this.snapshots = data.data.snapshots;\n } else if (data.error === true) {\n _this.error = data.message || 'Có lỗi xảy ra khi tải danh sách snapshot';\n _this.snapshots = [];\n } else if (data.snapshots) {\n // Fallback cho trường hợp data trực tiếp\n _this.snapshots = data.snapshots;\n } else {\n _this.snapshots = [];\n }\n _context.next = 24;\n break;\n case 19:\n _context.prev = 19;\n _context.t0 = _context[\"catch\"](7);\n console.error('Error fetching snapshots:', _context.t0);\n _this.error = 'Không thể kết nối đến máy chủ';\n _this.snapshots = [];\n case 24:\n _context.prev = 24;\n _this.loading = false;\n return _context.finish(24);\n case 27:\n case \"end\":\n return _context.stop();\n }\n }, _callee, null, [[7, 19, 24, 27]]);\n }))();\n },\n formatSize: function formatSize(sizeGB, sizeMB) {\n // Convert to bytes first\n var bytes = 0;\n if (sizeGB) {\n bytes = parseFloat(sizeGB) * 1024 * 1024 * 1024; // GB to bytes\n } else if (sizeMB) {\n bytes = parseFloat(sizeMB) * 1024 * 1024; // MB to bytes\n }\n if (bytes === 0) return '0 B';\n var units = ['B', 'KB', 'MB', 'GB', 'TB'];\n var k = 1024;\n var i = Math.floor(Math.log(bytes) / Math.log(k));\n var size = parseFloat((bytes / Math.pow(k, i)).toFixed(2));\n return size + ' ' + units[i];\n },\n deleteSnapshot: function deleteSnapshot(snapshotName) {\n var _this2 = this;\n return _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee2() {\n var result, response, data;\n return _regeneratorRuntime().wrap(function _callee2$(_context2) {\n while (1) switch (_context2.prev = _context2.next) {\n case 0:\n _context2.next = 2;\n return Swal.fire({\n title: 'Xác nhận xóa',\n text: \"B\\u1EA1n c\\xF3 ch\\u1EAFc ch\\u1EAFn mu\\u1ED1n x\\xF3a snapshot \\\"\".concat(snapshotName, \"\\\"? H\\xE0nh \\u0111\\u1ED9ng n\\xE0y kh\\xF4ng th\\u1EC3 ho\\xE0n t\\xE1c.\"),\n icon: 'warning',\n showCancelButton: true,\n confirmButtonColor: '#d33',\n cancelButtonColor: '#3085d6',\n confirmButtonText: 'Xóa',\n cancelButtonText: 'Hủy bỏ',\n reverseButtons: true\n });\n case 2:\n result = _context2.sent;\n if (result.isConfirmed) {\n _context2.next = 5;\n break;\n }\n return _context2.abrupt(\"return\");\n case 5:\n _context2.prev = 5;\n _context2.next = 8;\n return fetch('/secure/remove-snapshot', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Accept': 'application/json',\n 'X-CSRF-TOKEN': csrfToken\n },\n body: JSON.stringify({\n product_id: window.vmId,\n snapshot_name: snapshotName\n }),\n credentials: 'same-origin'\n });\n case 8:\n response = _context2.sent;\n _context2.next = 11;\n return response.json();\n case 11:\n data = _context2.sent;\n if (!(data.error === false)) {\n _context2.next = 17;\n break;\n }\n showNotification(data.message || 'Xóa snapshot thành công', 'success');\n // Refresh snapshot list after successful deletion\n setTimeout(function () {\n return _this2.fetchSnapshots();\n }, 1000);\n _context2.next = 18;\n break;\n case 17:\n throw new Error(data.message || 'Có lỗi xảy ra khi xóa snapshot');\n case 18:\n _context2.next = 24;\n break;\n case 20:\n _context2.prev = 20;\n _context2.t0 = _context2[\"catch\"](5);\n console.error('Error deleting snapshot:', _context2.t0);\n showNotification(_context2.t0.message || 'Có lỗi xảy ra khi xóa snapshot', 'error');\n case 24:\n case \"end\":\n return _context2.stop();\n }\n }, _callee2, null, [[5, 20]]);\n }))();\n },\n revertSnapshot: function revertSnapshot(snapshotName) {\n var _this3 = this;\n return _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee3() {\n var result, response, data;\n return _regeneratorRuntime().wrap(function _callee3$(_context3) {\n while (1) switch (_context3.prev = _context3.next) {\n case 0:\n _context3.next = 2;\n return Swal.fire({\n title: 'Xác nhận khôi phục',\n text: \"B\\u1EA1n c\\xF3 ch\\u1EAFc ch\\u1EAFn mu\\u1ED1n kh\\xF4i ph\\u1EE5c v\\u1EC1 snapshot \\\"\".concat(snapshotName, \"\\\"? T\\u1EA5t c\\u1EA3 d\\u1EEF li\\u1EC7u hi\\u1EC7n t\\u1EA1i s\\u1EBD b\\u1ECB m\\u1EA5t.\"),\n icon: 'warning',\n showCancelButton: true,\n confirmButtonColor: '#3085d6',\n cancelButtonColor: '#d33',\n confirmButtonText: 'Khôi phục',\n cancelButtonText: 'Hủy bỏ',\n reverseButtons: true\n });\n case 2:\n result = _context3.sent;\n if (result.isConfirmed) {\n _context3.next = 5;\n break;\n }\n return _context3.abrupt(\"return\");\n case 5:\n _context3.prev = 5;\n _context3.next = 8;\n return fetch('/secure/revert-snapshot', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Accept': 'application/json',\n 'X-CSRF-TOKEN': csrfToken\n },\n body: JSON.stringify({\n product_id: window.vmId,\n snapshot_name: snapshotName\n }),\n credentials: 'same-origin'\n });\n case 8:\n response = _context3.sent;\n _context3.next = 11;\n return response.json();\n case 11:\n data = _context3.sent;\n if (!(data.error === false)) {\n _context3.next = 17;\n break;\n }\n showNotification(data.message || 'Khôi phục snapshot thành công', 'success');\n // Refresh snapshot list after successful revert\n setTimeout(function () {\n return _this3.fetchSnapshots();\n }, 2000);\n _context3.next = 18;\n break;\n case 17:\n throw new Error(data.message || 'Có lỗi xảy ra khi khôi phục snapshot');\n case 18:\n _context3.next = 24;\n break;\n case 20:\n _context3.prev = 20;\n _context3.t0 = _context3[\"catch\"](5);\n console.error('Error reverting snapshot:', _context3.t0);\n showNotification(_context3.t0.message || 'Có lỗi xảy ra khi khôi phục snapshot', 'error');\n case 24:\n case \"end\":\n return _context3.stop();\n }\n }, _callee3, null, [[5, 20]]);\n }))();\n },\n // Helper method to refresh snapshots\n refreshSnapshots: function refreshSnapshots() {\n this.fetchSnapshots();\n },\n // Helper method to get snapshot count\n getSnapshotCount: function getSnapshotCount() {\n return this.snapshots.length;\n },\n // Helper method to check if snapshots are loading\n isLoading: function isLoading() {\n return this.loading;\n },\n // Helper method to check if there's an error\n hasError: function hasError() {\n return this.error !== null;\n }\n };\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvc2VydmljZS9zZXJ2aWNlLmpzIiwibmFtZXMiOlsiX3JlZ2VuZXJhdG9yUnVudGltZSIsImUiLCJ0IiwiciIsIk9iamVjdCIsInByb3RvdHlwZSIsIm4iLCJoYXNPd25Qcm9wZXJ0eSIsIm8iLCJkZWZpbmVQcm9wZXJ0eSIsInZhbHVlIiwiaSIsIlN5bWJvbCIsImEiLCJpdGVyYXRvciIsImMiLCJhc3luY0l0ZXJhdG9yIiwidSIsInRvU3RyaW5nVGFnIiwiZGVmaW5lIiwiZW51bWVyYWJsZSIsImNvbmZpZ3VyYWJsZSIsIndyaXRhYmxlIiwid3JhcCIsIkdlbmVyYXRvciIsImNyZWF0ZSIsIkNvbnRleHQiLCJtYWtlSW52b2tlTWV0aG9kIiwidHJ5Q2F0Y2giLCJ0eXBlIiwiYXJnIiwiY2FsbCIsImgiLCJsIiwiZiIsInMiLCJ5IiwiR2VuZXJhdG9yRnVuY3Rpb24iLCJHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSIsInAiLCJkIiwiZ2V0UHJvdG90eXBlT2YiLCJ2IiwidmFsdWVzIiwiZyIsImRlZmluZUl0ZXJhdG9yTWV0aG9kcyIsImZvckVhY2giLCJfaW52b2tlIiwiQXN5bmNJdGVyYXRvciIsImludm9rZSIsIl90eXBlb2YiLCJyZXNvbHZlIiwiX19hd2FpdCIsInRoZW4iLCJjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZyIsIkVycm9yIiwiZG9uZSIsIm1ldGhvZCIsImRlbGVnYXRlIiwibWF5YmVJbnZva2VEZWxlZ2F0ZSIsInNlbnQiLCJfc2VudCIsImRpc3BhdGNoRXhjZXB0aW9uIiwiYWJydXB0IiwiVHlwZUVycm9yIiwicmVzdWx0TmFtZSIsIm5leHQiLCJuZXh0TG9jIiwicHVzaFRyeUVudHJ5IiwidHJ5TG9jIiwiY2F0Y2hMb2MiLCJmaW5hbGx5TG9jIiwiYWZ0ZXJMb2MiLCJ0cnlFbnRyaWVzIiwicHVzaCIsInJlc2V0VHJ5RW50cnkiLCJjb21wbGV0aW9uIiwicmVzZXQiLCJpc05hTiIsImxlbmd0aCIsImRpc3BsYXlOYW1lIiwiaXNHZW5lcmF0b3JGdW5jdGlvbiIsImNvbnN0cnVjdG9yIiwibmFtZSIsIm1hcmsiLCJzZXRQcm90b3R5cGVPZiIsIl9fcHJvdG9fXyIsImF3cmFwIiwiYXN5bmMiLCJQcm9taXNlIiwia2V5cyIsInJldmVyc2UiLCJwb3AiLCJwcmV2IiwiY2hhckF0Iiwic2xpY2UiLCJzdG9wIiwicnZhbCIsImhhbmRsZSIsImNvbXBsZXRlIiwiZmluaXNoIiwiX2NhdGNoIiwiZGVsZWdhdGVZaWVsZCIsImFzeW5jR2VuZXJhdG9yU3RlcCIsIl9hc3luY1RvR2VuZXJhdG9yIiwiYXJndW1lbnRzIiwiYXBwbHkiLCJfbmV4dCIsIl90aHJvdyIsImludm9pY2VJZCIsInZtSWQiLCJ2bUhvc3RuYW1lIiwiY3NyZlRva2VuIiwiaW5pdGlhbGl6ZVZhcmlhYmxlcyIsIm1ldGFJbnZvaWNlSWQiLCJkb2N1bWVudCIsInF1ZXJ5U2VsZWN0b3IiLCJtZXRhVm1JZCIsIm1ldGFWbUhvc3RuYW1lIiwibWV0YUNzcmZUb2tlbiIsImdldEF0dHJpYnV0ZSIsIndpbmRvdyIsIkZ1aVRvYXN0IiwiY29uZmlnIiwicG9zaXRpb24iLCJzaG93Tm90aWZpY2F0aW9uIiwibWVzc2FnZSIsInVuZGVmaW5lZCIsInN1Y2Nlc3MiLCJlcnJvciIsImNyZWF0ZVNuYXBzaG90IiwiX2NyZWF0ZVNuYXBzaG90IiwiX2NhbGxlZTUiLCJzbmFwc2hvdEJ0biIsInJlcXVlc3RCb2R5IiwiaGVhZGVycyIsInNuYXBzaG90UHJvbWlzZSIsIl9jYWxsZWU1JCIsIl9jb250ZXh0NSIsImdldEVsZW1lbnRCeUlkIiwiZGlzYWJsZWQiLCJwcm9kdWN0X2lkIiwiZmV0Y2giLCJib2R5IiwiSlNPTiIsInN0cmluZ2lmeSIsImNyZWRlbnRpYWxzIiwiX3JlZiIsIl9jYWxsZWU0IiwicmVzcG9uc2UiLCJkYXRhIiwidGV4dCIsImVycm9yTWVzc2FnZSIsIl9jYWxsZWU0JCIsIl9jb250ZXh0NCIsInJlZGlyZWN0ZWQiLCJzdGF0dXMiLCJwYXJzZSIsInQwIiwiaW5jbHVkZXMiLCJvayIsInNldFRpbWVvdXQiLCJsb2NhdGlvbiIsInJlbG9hZCIsInQxIiwibWVzc2FnZXMiLCJkZWZhdWx0X21lc3NhZ2UiLCJlcnJvcl90eXBlIiwiY29uY2F0IiwidG9TdHJpbmciLCJfeCIsInByb21pc2UiLCJsb2FkaW5nIiwiY29uc29sZSIsImlzQ2xvc2UiLCJoYW5kbGVTbmFwc2hvdFN1Ym1pdCIsImV2ZW50IiwicHJldmVudERlZmF1bHQiLCJyZWplY3QiLCJmb3JtIiwiZm9ybURhdGEiLCJGb3JtRGF0YSIsImFjdGlvbiIsImhyZWYiLCJ1cmwiLCJkdXJhdGlvbiIsImFsZXJ0Iiwic3VibWl0Iiwic3RhcnRWaXJ0dWFsTWFjaGluZSIsIl9zdGFydFZpcnR1YWxNYWNoaW5lIiwiX2NhbGxlZTciLCJzdGFydEJ0biIsInN0YXJ0UHJvbWlzZSIsIl9jYWxsZWU3JCIsIl9jb250ZXh0NyIsInZtX2lkIiwiX3JlZjIiLCJfY2FsbGVlNiIsIl9jYWxsZWU2JCIsIl9jb250ZXh0NiIsImpzb24iLCJfeDIiLCJzdG9wVmlydHVhbE1hY2hpbmUiLCJfc3RvcFZpcnR1YWxNYWNoaW5lIiwiX2NhbGxlZTkiLCJzdG9wQnRuIiwic3RvcFByb21pc2UiLCJfY2FsbGVlOSQiLCJfY29udGV4dDkiLCJfcmVmMyIsIl9jYWxsZWU4IiwiX2NhbGxlZTgkIiwiX2NvbnRleHQ4IiwiX3gzIiwicmVzdGFydFZpcnR1YWxNYWNoaW5lIiwiX3Jlc3RhcnRWaXJ0dWFsTWFjaGluZSIsIl9jYWxsZWUxMSIsInJlc3RhcnRCdG4iLCJyZXN0YXJ0UHJvbWlzZSIsIl9jYWxsZWUxMSQiLCJfY29udGV4dDExIiwiX3JlZjQiLCJfY2FsbGVlMTAiLCJfY2FsbGVlMTAkIiwiX2NvbnRleHQxMCIsIl94NCIsImFkZEV2ZW50TGlzdGVuZXIiLCJzdG9wUHJvcGFnYXRpb24iLCJzbmFwc2hvdFRhYmxlIiwic25hcHNob3RzIiwiZmV0Y2hTbmFwc2hvdHMiLCJfdGhpcyIsIl9jYWxsZWUiLCJfY2FsbGVlJCIsIl9jb250ZXh0IiwiZm9ybWF0U2l6ZSIsInNpemVHQiIsInNpemVNQiIsImJ5dGVzIiwicGFyc2VGbG9hdCIsInVuaXRzIiwiayIsIk1hdGgiLCJmbG9vciIsImxvZyIsInNpemUiLCJwb3ciLCJ0b0ZpeGVkIiwiZGVsZXRlU25hcHNob3QiLCJzbmFwc2hvdE5hbWUiLCJfdGhpczIiLCJfY2FsbGVlMiIsInJlc3VsdCIsIl9jYWxsZWUyJCIsIl9jb250ZXh0MiIsIlN3YWwiLCJmaXJlIiwidGl0bGUiLCJpY29uIiwic2hvd0NhbmNlbEJ1dHRvbiIsImNvbmZpcm1CdXR0b25Db2xvciIsImNhbmNlbEJ1dHRvbkNvbG9yIiwiY29uZmlybUJ1dHRvblRleHQiLCJjYW5jZWxCdXR0b25UZXh0IiwicmV2ZXJzZUJ1dHRvbnMiLCJpc0NvbmZpcm1lZCIsInNuYXBzaG90X25hbWUiLCJyZXZlcnRTbmFwc2hvdCIsIl90aGlzMyIsIl9jYWxsZWUzIiwiX2NhbGxlZTMkIiwiX2NvbnRleHQzIiwicmVmcmVzaFNuYXBzaG90cyIsImdldFNuYXBzaG90Q291bnQiLCJpc0xvYWRpbmciLCJoYXNFcnJvciJdLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vcmVzb3VyY2VzL2pzL3NlcnZpY2Uvc2VydmljZS5qcz9jMTVmIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIEdsb2JhbCB2YXJpYWJsZXMgLSBOTyBTRU5TSVRJVkUgREFUQSAobm8gdG9rZW5zKVxyXG5sZXQgaW52b2ljZUlkO1xyXG5sZXQgdm1JZDtcclxubGV0IHZtSG9zdG5hbWU7XHJcbmxldCBjc3JmVG9rZW47XHJcblxyXG4vLyBJbml0aWFsaXplIHZhcmlhYmxlcyBmcm9tIGRhdGEgYXR0cmlidXRlcyBvciBnbG9iYWwgdmFyaWFibGVzXHJcbmZ1bmN0aW9uIGluaXRpYWxpemVWYXJpYWJsZXMoKSB7XHJcbiAgICAvLyBHZXQgZGF0YSBmcm9tIG1ldGEgdGFncyBvciBnbG9iYWwgdmFyaWFibGVzIHNldCBpbiBCbGFkZSB0ZW1wbGF0ZVxyXG4gICAgY29uc3QgbWV0YUludm9pY2VJZCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ21ldGFbbmFtZT1cImludm9pY2UtaWRcIl0nKTtcclxuICAgIGNvbnN0IG1ldGFWbUlkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignbWV0YVtuYW1lPVwidm0taWRcIl0nKTtcclxuICAgIGNvbnN0IG1ldGFWbUhvc3RuYW1lID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignbWV0YVtuYW1lPVwidm0taG9zdG5hbWVcIl0nKTtcclxuICAgIGNvbnN0IG1ldGFDc3JmVG9rZW4gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdtZXRhW25hbWU9XCJjc3JmLXRva2VuXCJdJyk7XHJcbiAgICBcclxuICAgIGludm9pY2VJZCA9IG1ldGFJbnZvaWNlSWQgPyBtZXRhSW52b2ljZUlkLmdldEF0dHJpYnV0ZSgnY29udGVudCcpIDogd2luZG93Lmludm9pY2VJZDtcclxuICAgIHZtSWQgPSBtZXRhVm1JZCA/IG1ldGFWbUlkLmdldEF0dHJpYnV0ZSgnY29udGVudCcpIDogd2luZG93LnZtSWQ7XHJcbiAgICB2bUhvc3RuYW1lID0gbWV0YVZtSG9zdG5hbWUgPyBtZXRhVm1Ib3N0bmFtZS5nZXRBdHRyaWJ1dGUoJ2NvbnRlbnQnKSA6IHdpbmRvdy52bUhvc3RuYW1lO1xyXG4gICAgY3NyZlRva2VuID0gbWV0YUNzcmZUb2tlbiA/IG1ldGFDc3JmVG9rZW4uZ2V0QXR0cmlidXRlKCdjb250ZW50JykgOiB3aW5kb3cuY3NyZlRva2VuO1xyXG59XHJcblxyXG4vLyBD4bqldSBow6xuaCB0b2FzdCBu4bq/dSBjw7MgdGjhu4NcclxuaWYgKHR5cGVvZiBGdWlUb2FzdCAhPT0gJ3VuZGVmaW5lZCcgJiYgRnVpVG9hc3QuY29uZmlnKSB7XHJcbiAgICBGdWlUb2FzdC5jb25maWcoe1xyXG4gICAgICAgIHBvc2l0aW9uOiAndG9wLWNlbnRlcidcclxuICAgIH0pO1xyXG59XHJcblxyXG5mdW5jdGlvbiBzaG93Tm90aWZpY2F0aW9uKG1lc3NhZ2UsIHR5cGUgPSAnc3VjY2VzcycpIHtcclxuICAgIGlmICh0eXBlID09PSAnc3VjY2VzcycpIHtcclxuICAgICAgICBGdWlUb2FzdC5zdWNjZXNzKG1lc3NhZ2UpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICBGdWlUb2FzdC5lcnJvcihtZXNzYWdlKTtcclxuICAgIH1cclxufVxyXG5cclxuYXN5bmMgZnVuY3Rpb24gY3JlYXRlU25hcHNob3QoKSB7XHJcbiAgICBjb25zdCBzbmFwc2hvdEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjcmVhdGVTbmFwc2hvdEJ1dHRvbicpO1xyXG4gICAgaWYgKHNuYXBzaG90QnRuICYmIHNuYXBzaG90QnRuLmRpc2FibGVkKSByZXR1cm47XHJcblxyXG4gICAgY29uc3QgcmVxdWVzdEJvZHkgPSB7XHJcbiAgICAgICAgcHJvZHVjdF9pZDogdm1JZFxyXG4gICAgfTtcclxuICAgIFxyXG4gICAgY29uc3QgaGVhZGVycyA9IHtcclxuICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxyXG4gICAgICAgICdBY2NlcHQnOiAnYXBwbGljYXRpb24vanNvbicsXHJcbiAgICAgICAgJ1gtQ1NSRi1UT0tFTic6IGNzcmZUb2tlblxyXG4gICAgICAgIC8vIE5PIEF1dGhvcml6YXRpb24gaGVhZGVyIC0gdXNpbmcgc2Vzc2lvbiBhdXRoXHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0IHNuYXBzaG90UHJvbWlzZSA9IGZldGNoKCcvc2VjdXJlL2NyZWF0ZS1zbmFwc2hvdHMnLCB7XHJcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXHJcbiAgICAgICAgaGVhZGVyczogaGVhZGVycyxcclxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShyZXF1ZXN0Qm9keSksXHJcbiAgICAgICAgY3JlZGVudGlhbHM6ICdzYW1lLW9yaWdpbidcclxuICAgIH0pLnRoZW4oYXN5bmMgKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgaWYgKHJlc3BvbnNlLnJlZGlyZWN0ZWQgfHwgcmVzcG9uc2Uuc3RhdHVzID09PSA0MDEpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdQaGnDqm4gxJHEg25nIG5o4bqtcCDEkcOjIGjhur90IGjhuqFuLCB2dWkgbMOybmcgxJHEg25nIG5o4bqtcCBs4bqhaScpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gQ2hlY2sgaWYgcmVzcG9uc2UgaXMgcmVkaXJlY3RlZCAodHlwaWNhbCBmb3IgTGFyYXZlbCByZWRpcmVjdCByZXNwb25zZXMpXHJcbiAgICAgICAgaWYgKHJlc3BvbnNlLnJlZGlyZWN0ZWQpIHtcclxuICAgICAgICAgICAgLy8gRXh0cmFjdCBtZXNzYWdlIGZyb20gVVJMIGlmIHBvc3NpYmxlLCBvciBzaG93IGdlbmVyaWMgc3VjY2Vzc1xyXG4gICAgICAgICAgICByZXR1cm4gJ8SQw6MgZ+G7rWkgecOqdSBj4bqndSB04bqhbyBzbmFwc2hvdC4gUXXDoSB0csOsbmggc+G6vSBt4bqldCAzLTUgcGjDunQsIHZ1aSBsw7JuZyBjaOG7nSDEkeG7o2kuJztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBkYXRhO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHRleHQgPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAvLyBUcnkgdG8gcGFyc2UgYXMgSlNPTiBmaXJzdFxyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgZGF0YSA9IEpTT04ucGFyc2UodGV4dCk7XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKHBhcnNlRXJyb3IpIHtcclxuICAgICAgICAgICAgICAgIC8vIElmIG5vdCBKU09OLCBjaGVjayBmb3IgSFRNTCB3aXRoIHN1Y2Nlc3MvZXJyb3IgbWVzc2FnZXNcclxuICAgICAgICAgICAgICAgIGlmICh0ZXh0LmluY2x1ZGVzKCdzdWNjZXNzJykgfHwgcmVzcG9uc2Uub2spIHtcclxuICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24ucmVsb2FkKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSwgMjAwMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICfEkMOjIGfhu61pIHnDqnUgY+G6p3UgdOG6oW8gc25hcHNob3QuIFF1w6EgdHLDrG5oIHPhur0gbeG6pXQgMy01IHBow7p0LCB2dWkgbMOybmcgY2jhu50gxJHhu6NpLic7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ8OzIGzhu5dpIHjhuqN5IHJhIGtoaSBn4butaSB5w6p1IGPhuqd1IHThuqFvIHNuYXBzaG90Jyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIChwYXJzZUVycm9yKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTOG7l2kgxJHhu4tuaCBk4bqhbmcgZOG7ryBsaeG7h3UgdOG7qyBtw6F5IGNo4bunJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBIYW5kbGUgSlNPTiByZXNwb25zZVxyXG4gICAgICAgIGlmIChkYXRhICYmICFkYXRhLmVycm9yKSB7XHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgbG9jYXRpb24ucmVsb2FkKCk7XHJcbiAgICAgICAgICAgIH0sIDIwMDApO1xyXG4gICAgICAgICAgICByZXR1cm4gZGF0YS5tZXNzYWdlIHx8ICfEkMOjIGfhu61pIHnDqnUgY+G6p3UgdOG6oW8gc25hcHNob3QuIFF1w6EgdHLDrG5oIHPhur0gbeG6pXQgMy01IHBow7p0LCB2dWkgbMOybmcgY2jhu50gxJHhu6NpLic7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgbGV0IGVycm9yTWVzc2FnZSA9ICdDw7MgbOG7l2kgeOG6o3kgcmEga2hpIHThuqFvIHNuYXBzaG90JztcclxuICAgICAgICAgICAgaWYgKGRhdGEgJiYgZGF0YS5tZXNzYWdlKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGRhdGEubWVzc2FnZSA9PT0gJ29iamVjdCcpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5tZXNzYWdlLm1lc3NhZ2VzICYmIGRhdGEubWVzc2FnZS5tZXNzYWdlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZSA9IGRhdGEubWVzc2FnZS5tZXNzYWdlc1swXS5kZWZhdWx0X21lc3NhZ2UgfHwgZGF0YS5tZXNzYWdlLm1lc3NhZ2VzWzBdLm1lc3NhZ2UgfHwgJ0PDsyBs4buXaSB44bqjeSByYSc7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkYXRhLm1lc3NhZ2UuZXJyb3JfdHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSBgTOG7l2k6ICR7ZGF0YS5tZXNzYWdlLmVycm9yX3R5cGV9YDtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSAnQ8OzIGzhu5dpIHjhuqN5IHJhIHThu6sgaOG7hyB0aOG7kW5nJztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZSA9IGRhdGEubWVzc2FnZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIGlmIChkYXRhICYmIGRhdGEudmFsdWUgJiYgZGF0YS52YWx1ZS5tZXNzYWdlcyAmJiBkYXRhLnZhbHVlLm1lc3NhZ2VzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZSA9IGRhdGEudmFsdWUubWVzc2FnZXNbMF0uZGVmYXVsdF9tZXNzYWdlO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gZGF0YTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChkYXRhICYmIGRhdGEuZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZGF0YS5lcnJvciA9PT0gJ29iamVjdCcpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5lcnJvci5tZXNzYWdlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZSA9IGRhdGEuZXJyb3IubWVzc2FnZTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRhdGEuZXJyb3IudG9TdHJpbmcgJiYgZGF0YS5lcnJvci50b1N0cmluZygpICE9PSAnW29iamVjdCBPYmplY3RdJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSBkYXRhLmVycm9yLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gJ0PDsyBs4buXaSB44bqjeSByYSB04burIGjhu4cgdGjhu5FuZyc7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSBkYXRhLmVycm9yO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvck1lc3NhZ2UpO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIEZ1aVRvYXN0LnByb21pc2UoXHJcbiAgICAgICAgc25hcHNob3RQcm9taXNlLFxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgbG9hZGluZzogJ8SQYW5nIGfhu61pIHnDqnUgY+G6p3UgdOG6oW8gc25hcHNob3QuLi4gKFF1w6EgdHLDrG5oIG3huqV0IDMtNSBwaMO6dCB2dWkgbMOybmcgZ2nhu68gdHJhbmcga2jDtG5nIHThuq90ISknLFxyXG4gICAgICAgICAgICBzdWNjZXNzOiAoZGF0YSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGRhdGE7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVycm9yOiAoZXJyb3IpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yLm1lc3NhZ2UgfHwgJ0PDsyBs4buXaSB44bqjeSByYSBraGkgdOG6oW8gc25hcHNob3QnO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlzQ2xvc2U6IHRydWVcclxuICAgICAgICB9XHJcbiAgICApO1xyXG59XHJcblxyXG4vLyBIYW5kbGUgc25hcHNob3QgZm9ybSBzdWJtaXNzaW9uIHdpdGggbG9hZGluZyBub3RpZmljYXRpb25cclxuZnVuY3Rpb24gaGFuZGxlU25hcHNob3RTdWJtaXQoZXZlbnQpIHtcclxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICBcclxuICAgIGNvbnN0IHNuYXBzaG90UHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICBjb25zdCBmb3JtID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NuYXBzaG90Rm9ybScpO1xyXG4gICAgICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKGZvcm0pO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGZldGNoKGZvcm0uYWN0aW9uLCB7XHJcbiAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxyXG4gICAgICAgICAgICBib2R5OiBmb3JtRGF0YSxcclxuICAgICAgICAgICAgaGVhZGVyczoge1xyXG4gICAgICAgICAgICAgICAgJ1gtQ1NSRi1UT0tFTic6IGNzcmZUb2tlblxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgICAgICAudGhlbihyZXNwb25zZSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5yZWRpcmVjdGVkKSB7XHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKCfEkMOjIGfhu61pIHnDqnUgY+G6p3UgdOG6oW8gc25hcHNob3QhIFF1w6EgdHLDrG5oIHPhur0gbeG6pXQgMy01IHBow7p0LicpO1xyXG4gICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSByZXNwb25zZS51cmw7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzcG9uc2Uub2spIHtcclxuICAgICAgICAgICAgICAgIHJlc29sdmUoJ8SQw6MgZ+G7rWkgecOqdSBj4bqndSB04bqhbyBzbmFwc2hvdCEgUXXDoSB0csOsbmggc+G6vSBt4bqldCAzLTUgcGjDunQuJyk7XHJcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7XHJcbiAgICAgICAgICAgICAgICB9LCAyMDAwKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJlc3BvbnNlLnRleHQoKS50aGVuKHRleHQgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlamVjdCgnQ8OzIGzhu5dpIHjhuqN5IHJhIGtoaSBn4butaSB5w6p1IGPhuqd1IHThuqFvIHNuYXBzaG90Jyk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgLmNhdGNoKGVycm9yID0+IHtcclxuICAgICAgICAgICAgcmVqZWN0KCdM4buXaSBr4bq/dCBu4buRaTogJyArIGVycm9yLm1lc3NhZ2UpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgICBcclxuICAgIGlmICh0eXBlb2YgRnVpVG9hc3QgIT09ICd1bmRlZmluZWQnICYmIEZ1aVRvYXN0LnByb21pc2UpIHtcclxuICAgICAgICBGdWlUb2FzdC5wcm9taXNlKHNuYXBzaG90UHJvbWlzZSwge1xyXG4gICAgICAgICAgICBsb2FkaW5nOiAnxJBhbmcgZ+G7rWkgecOqdSBj4bqndSB04bqhbyBzbmFwc2hvdC4uLicsXHJcbiAgICAgICAgICAgIHN1Y2Nlc3M6IChkYXRhKSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZGF0YSB8fCAnxJDDoyBn4butaSB5w6p1IGPhuqd1IHThuqFvIHNuYXBzaG90ISc7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVycm9yOiAoZXJyb3IpID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBlcnJvciB8fCAnQ8OzIGzhu5dpIHjhuqN5IHJhIGtoaSBn4butaSB5w6p1IGPhuqd1IHThuqFvIHNuYXBzaG90JztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICBpZiAodHlwZW9mIEZ1aVRvYXN0ICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgICAgICBGdWlUb2FzdC5sb2FkaW5nKCfEkGFuZyBn4butaSB5w6p1IGPhuqd1IHThuqFvIHNuYXBzaG90Li4uJywge1xyXG4gICAgICAgICAgICAgICAgZHVyYXRpb246IDAsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGFsZXJ0KCfEkGFuZyBn4butaSB5w6p1IGPhuqd1IHThuqFvIHNuYXBzaG90Li4uJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc25hcHNob3RGb3JtJykuc3VibWl0KCk7XHJcbiAgICAgICAgfSwgNTAwKTtcclxuICAgIH1cclxufVxyXG5cclxuYXN5bmMgZnVuY3Rpb24gc3RhcnRWaXJ0dWFsTWFjaGluZSgpIHtcclxuICAgIGNvbnN0IHN0YXJ0QnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N0YXJ0Vk1CdXR0b24nKTtcclxuICAgIGlmIChzdGFydEJ0biAmJiBzdGFydEJ0bi5kaXNhYmxlZCkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IHJlcXVlc3RCb2R5ID0ge1xyXG4gICAgICAgIHZtX2lkOiB2bUlkXHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0IGhlYWRlcnMgPSB7XHJcbiAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcclxuICAgICAgICAnQWNjZXB0JzogJ2FwcGxpY2F0aW9uL2pzb24nLFxyXG4gICAgICAgICdYLUNTUkYtVE9LRU4nOiBjc3JmVG9rZW5cclxuICAgICAgICAvLyBOTyBBdXRob3JpemF0aW9uIGhlYWRlciAtIHVzaW5nIHNlc3Npb24gYXV0aFxyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBzdGFydFByb21pc2UgPSBmZXRjaCgnL2FwaS9zZWN1cmUvc3RhcnQtdm0nLCB7XHJcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXHJcbiAgICAgICAgaGVhZGVyczogaGVhZGVycyxcclxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShyZXF1ZXN0Qm9keSksXHJcbiAgICAgICAgY3JlZGVudGlhbHM6ICdzYW1lLW9yaWdpbidcclxuICAgIH0pLnRoZW4oYXN5bmMgKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgaWYgKHJlc3BvbnNlLnJlZGlyZWN0ZWQgfHwgcmVzcG9uc2Uuc3RhdHVzID09PSA0MDEpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdQaGnDqm4gxJHEg25nIG5o4bqtcCDEkcOjIGjhur90IGjhuqFuLCB2dWkgbMOybmcgxJHEg25nIG5o4bqtcCBs4bqhaScpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IGRhdGE7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcclxuICAgICAgICB9IGNhdGNoIChwYXJzZUVycm9yKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTOG7l2kgxJHhu4tuaCBk4bqhbmcgZOG7ryBsaeG7h3UgdOG7qyBtw6F5IGNo4bunJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIWRhdGEuZXJyb3IpIHtcclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBsb2NhdGlvbi5yZWxvYWQoKTtcclxuICAgICAgICAgICAgfSwgMjAwMCk7XHJcbiAgICAgICAgICAgIHJldHVybiBkYXRhLm1lc3NhZ2U7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKGRhdGEudHlwZSA9PT0gJ2NvbS52bXdhcmUudmFwaS5zdGQuZXJyb3JzLmFscmVhZHlfaW5fZGVzaXJlZF9zdGF0ZScgfHxcclxuICAgICAgICAgICAgICAgIChkYXRhLm1lc3NhZ2UgJiYgZGF0YS5tZXNzYWdlLmVycm9yX3R5cGUgPT09ICdBTFJFQURZX0lOX0RFU0lSRURfU1RBVEUnKSkge1xyXG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24ucmVsb2FkKCk7XHJcbiAgICAgICAgICAgICAgICB9LCAyMDAwKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiAnTcOheSBjaOG7pyDEkcOjIMSRxrDhu6NjIGLhuq10JztcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGxldCBlcnJvck1lc3NhZ2UgPSAnQ8OzIGzhu5dpIHjhuqN5IHJhJztcclxuICAgICAgICAgICAgICAgIGlmIChkYXRhLm1lc3NhZ2UpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGRhdGEubWVzc2FnZSA9PT0gJ29iamVjdCcpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEubWVzc2FnZS5tZXNzYWdlcyAmJiBkYXRhLm1lc3NhZ2UubWVzc2FnZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gZGF0YS5tZXNzYWdlLm1lc3NhZ2VzWzBdLmRlZmF1bHRfbWVzc2FnZSB8fCBkYXRhLm1lc3NhZ2UubWVzc2FnZXNbMF1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWVzc2FnZSB8fCAnQ8OzIGzhu5dpIHjhuqN5IHJhJztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkYXRhLm1lc3NhZ2UuZXJyb3JfdHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gYEzhu5dpOiAke2RhdGEubWVzc2FnZS5lcnJvcl90eXBlfWA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSAnQ8OzIGzhu5dpIHjhuqN5IHJhIHThu6sgaOG7hyB0aOG7kW5nJztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZSA9IGRhdGEubWVzc2FnZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRhdGEudmFsdWUgJiYgZGF0YS52YWx1ZS5tZXNzYWdlcyAmJiBkYXRhLnZhbHVlLm1lc3NhZ2VzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSBkYXRhLnZhbHVlLm1lc3NhZ2VzWzBdLmRlZmF1bHRfbWVzc2FnZTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gZGF0YTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZGF0YS5lcnJvcikge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZGF0YS5lcnJvciA9PT0gJ29iamVjdCcpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuZXJyb3IubWVzc2FnZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gZGF0YS5lcnJvci5tZXNzYWdlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRhdGEuZXJyb3IudG9TdHJpbmcgJiYgZGF0YS5lcnJvci50b1N0cmluZygpICE9PSAnW29iamVjdCBPYmplY3RdJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gZGF0YS5lcnJvci50b1N0cmluZygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gJ0PDsyBs4buXaSB44bqjeSByYSB04burIGjhu4cgdGjhu5FuZyc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSBkYXRhLmVycm9yO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvck1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgRnVpVG9hc3QucHJvbWlzZShcclxuICAgICAgICBzdGFydFByb21pc2UsXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBsb2FkaW5nOiAnxJBhbmcga2jhu59pIMSR4buZbmcgbcOheSDhuqNvLi4uJyxcclxuICAgICAgICAgICAgc3VjY2VzczogKGRhdGEpID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBkYXRhO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnJvcjogKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBlcnJvci5tZXNzYWdlIHx8ICdDw7MgbOG7l2kgeOG6o3kgcmEga2hpIGto4bufaSDEkeG7mW5nIG3DoXkg4bqjbyc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgaXNDbG9zZTogdHJ1ZVxyXG4gICAgICAgIH1cclxuICAgICk7XHJcbn1cclxuXHJcbmFzeW5jIGZ1bmN0aW9uIHN0b3BWaXJ0dWFsTWFjaGluZSgpIHtcclxuICAgIGNvbnN0IHN0b3BCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3RvcFZNQnV0dG9uJyk7XHJcbiAgICBpZiAoc3RvcEJ0biAmJiBzdG9wQnRuLmRpc2FibGVkKSByZXR1cm47XHJcblxyXG4gICAgY29uc3QgcmVxdWVzdEJvZHkgPSB7XHJcbiAgICAgICAgdm1faWQ6IHZtSWRcclxuICAgIH07XHJcblxyXG4gICAgY29uc3QgaGVhZGVycyA9IHtcclxuICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxyXG4gICAgICAgICdBY2NlcHQnOiAnYXBwbGljYXRpb24vanNvbicsXHJcbiAgICAgICAgJ1gtQ1NSRi1UT0tFTic6IGNzcmZUb2tlblxyXG4gICAgICAgIC8vIE5PIEF1dGhvcml6YXRpb24gaGVhZGVyIC0gdXNpbmcgc2Vzc2lvbiBhdXRoXHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0IHN0b3BQcm9taXNlID0gZmV0Y2goJy9hcGkvc2VjdXJlL3N0b3Atdm0nLCB7XHJcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXHJcbiAgICAgICAgaGVhZGVyczogaGVhZGVycyxcclxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShyZXF1ZXN0Qm9keSksXHJcbiAgICAgICAgY3JlZGVudGlhbHM6ICdzYW1lLW9yaWdpbidcclxuICAgIH0pLnRoZW4oYXN5bmMgKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgaWYgKHJlc3BvbnNlLnJlZGlyZWN0ZWQgfHwgcmVzcG9uc2Uuc3RhdHVzID09PSA0MDEpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdQaGnDqm4gxJHEg25nIG5o4bqtcCDEkcOjIGjhur90IGjhuqFuLCB2dWkgbMOybmcgxJHEg25nIG5o4bqtcCBs4bqhaScpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IGRhdGE7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcclxuICAgICAgICB9IGNhdGNoIChwYXJzZUVycm9yKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTOG7l2kgxJHhu4tuaCBk4bqhbmcgZOG7ryBsaeG7h3UgdOG7qyBtw6F5IGNo4bunJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIWRhdGEuZXJyb3IpIHtcclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBsb2NhdGlvbi5yZWxvYWQoKTtcclxuICAgICAgICAgICAgfSwgMjAwMCk7XHJcbiAgICAgICAgICAgIHJldHVybiBkYXRhLm1lc3NhZ2U7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKGRhdGEudHlwZSA9PT0gJ2NvbS52bXdhcmUudmFwaS5zdGQuZXJyb3JzLmFscmVhZHlfaW5fZGVzaXJlZF9zdGF0ZScgfHxcclxuICAgICAgICAgICAgICAgIChkYXRhLm1lc3NhZ2UgJiYgZGF0YS5tZXNzYWdlLmVycm9yX3R5cGUgPT09ICdBTFJFQURZX0lOX0RFU0lSRURfU1RBVEUnKSkge1xyXG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24ucmVsb2FkKCk7XHJcbiAgICAgICAgICAgICAgICB9LCAyMDAwKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiAnTcOheSBjaOG7pyDEkcOjIMSRxrDhu6NjIHThuq90JztcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGxldCBlcnJvck1lc3NhZ2UgPSAnQ8OzIGzhu5dpIHjhuqN5IHJhJztcclxuICAgICAgICAgICAgICAgIGlmIChkYXRhLm1lc3NhZ2UpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGRhdGEubWVzc2FnZSA9PT0gJ29iamVjdCcpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEubWVzc2FnZS5tZXNzYWdlcyAmJiBkYXRhLm1lc3NhZ2UubWVzc2FnZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gZGF0YS5tZXNzYWdlLm1lc3NhZ2VzWzBdLmRlZmF1bHRfbWVzc2FnZSB8fCBkYXRhLm1lc3NhZ2UubWVzc2FnZXNbMF1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWVzc2FnZSB8fCAnQ8OzIGzhu5dpIHjhuqN5IHJhJztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkYXRhLm1lc3NhZ2UuZXJyb3JfdHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gYEzhu5dpOiAke2RhdGEubWVzc2FnZS5lcnJvcl90eXBlfWA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSAnQ8OzIGzhu5dpIHjhuqN5IHJhIHThu6sgaOG7hyB0aOG7kW5nJztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZSA9IGRhdGEubWVzc2FnZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRhdGEudmFsdWUgJiYgZGF0YS52YWx1ZS5tZXNzYWdlcyAmJiBkYXRhLnZhbHVlLm1lc3NhZ2VzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSBkYXRhLnZhbHVlLm1lc3NhZ2VzWzBdLmRlZmF1bHRfbWVzc2FnZTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gZGF0YTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZGF0YS5lcnJvcikge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZGF0YS5lcnJvciA9PT0gJ29iamVjdCcpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuZXJyb3IubWVzc2FnZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gZGF0YS5lcnJvci5tZXNzYWdlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRhdGEuZXJyb3IudG9TdHJpbmcgJiYgZGF0YS5lcnJvci50b1N0cmluZygpICE9PSAnW29iamVjdCBPYmplY3RdJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gZGF0YS5lcnJvci50b1N0cmluZygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gJ0PDsyBs4buXaSB44bqjeSByYSB04burIGjhu4cgdGjhu5FuZyc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSBkYXRhLmVycm9yO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvck1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgRnVpVG9hc3QucHJvbWlzZShcclxuICAgICAgICBzdG9wUHJvbWlzZSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGxvYWRpbmc6ICfEkGFuZyBk4burbmcgbcOheSDhuqNvLi4uJyxcclxuICAgICAgICAgICAgc3VjY2VzczogKGRhdGEpID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBkYXRhO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnJvcjogKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBlcnJvci5tZXNzYWdlIHx8ICdDw7MgbOG7l2kgeOG6o3kgcmEga2hpIGThu6tuZyBtw6F5IOG6o28nO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlzQ2xvc2U6IHRydWVcclxuICAgICAgICB9XHJcbiAgICApO1xyXG59XHJcblxyXG5hc3luYyBmdW5jdGlvbiByZXN0YXJ0VmlydHVhbE1hY2hpbmUoKSB7XHJcbiAgICBjb25zdCByZXN0YXJ0QnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Jlc3RhcnRWTUJ1dHRvbicpO1xyXG4gICAgaWYgKHJlc3RhcnRCdG4gJiYgcmVzdGFydEJ0bi5kaXNhYmxlZCkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IHJlc3RhcnRQcm9taXNlID0gZmV0Y2goYC9zZXJ2aWNlLyR7aW52b2ljZUlkfS92bS90b2dnbGVgLCB7XHJcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXHJcbiAgICAgICAgaGVhZGVyczoge1xyXG4gICAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxyXG4gICAgICAgICAgICAnWC1DU1JGLVRPS0VOJzogY3NyZlRva2VuXHJcbiAgICAgICAgfSxcclxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XHJcbiAgICAgICAgICAgIGFjdGlvbjogJ3Jlc3RhcnQnXHJcbiAgICAgICAgfSlcclxuICAgIH0pLnRoZW4oYXN5bmMgKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgbGV0IGRhdGE7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcclxuICAgICAgICB9IGNhdGNoIChwYXJzZUVycm9yKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTOG7l2kgxJHhu4tuaCBk4bqhbmcgZOG7ryBsaeG7h3UgdOG7qyBtw6F5IGNo4bunJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoZGF0YS5zdWNjZXNzKSB7XHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgbG9jYXRpb24ucmVsb2FkKCk7XHJcbiAgICAgICAgICAgIH0sIDIwMDApO1xyXG4gICAgICAgICAgICByZXR1cm4gZGF0YS5tZXNzYWdlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGxldCBlcnJvck1lc3NhZ2UgPSAnQ8OzIGzhu5dpIHjhuqN5IHJhJztcclxuICAgICAgICAgICAgaWYgKGRhdGEubWVzc2FnZSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBkYXRhLm1lc3NhZ2UgPT09ICdvYmplY3QnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEubWVzc2FnZS5tZXNzYWdlcyAmJiBkYXRhLm1lc3NhZ2UubWVzc2FnZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSBkYXRhLm1lc3NhZ2UubWVzc2FnZXNbMF0uZGVmYXVsdF9tZXNzYWdlIHx8IGRhdGEubWVzc2FnZS5tZXNzYWdlc1swXVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1lc3NhZ2UgfHwgJ0PDsyBs4buXaSB44bqjeSByYSc7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkYXRhLm1lc3NhZ2UuZXJyb3JfdHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSBgTOG7l2k6ICR7ZGF0YS5tZXNzYWdlLmVycm9yX3R5cGV9YDtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSAnQ8OzIGzhu5dpIHjhuqN5IHJhIHThu6sgaOG7hyB0aOG7kW5nJztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZSA9IGRhdGEubWVzc2FnZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIGlmIChkYXRhLmVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGRhdGEuZXJyb3IgPT09ICdvYmplY3QnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuZXJyb3IubWVzc2FnZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSBkYXRhLmVycm9yLm1lc3NhZ2U7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkYXRhLmVycm9yLnRvU3RyaW5nICYmIGRhdGEuZXJyb3IudG9TdHJpbmcoKSAhPT0gJ1tvYmplY3QgT2JqZWN0XScpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gZGF0YS5lcnJvci50b1N0cmluZygpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZSA9ICdDw7MgbOG7l2kgeOG6o3kgcmEgdOG7qyBo4buHIHRo4buRbmcnO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gZGF0YS5lcnJvcjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZSA9IGRhdGE7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9yTWVzc2FnZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgRnVpVG9hc3QucHJvbWlzZShcclxuICAgICAgICByZXN0YXJ0UHJvbWlzZSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGxvYWRpbmc6ICfEkGFuZyBraOG7n2kgxJHhu5luZyBs4bqhaSBtw6F5IOG6o28uLi4nLFxyXG4gICAgICAgICAgICBzdWNjZXNzOiAoZGF0YSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGRhdGE7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGVycm9yOiAoZXJyb3IpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yLm1lc3NhZ2UgfHwgJ0PDsyBs4buXaSB44bqjeSByYSBraGkga2jhu59pIMSR4buZbmcgbOG6oWkgbcOheSDhuqNvJztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBpc0Nsb3NlOiB0cnVlXHJcbiAgICAgICAgfVxyXG4gICAgKTtcclxuXHJcblxyXG4gICAgXHJcbn1cclxuXHJcbi8vIERPTSByZWFkeVxyXG5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgZnVuY3Rpb24oKSB7XHJcbiAgICAvLyBJbml0aWFsaXplIHZhcmlhYmxlc1xyXG4gICAgaW5pdGlhbGl6ZVZhcmlhYmxlcygpO1xyXG4gICAgXHJcbiAgICBjb25zdCBzdGFydEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdGFydFZNQnV0dG9uJyk7XHJcbiAgICBjb25zdCBzdG9wQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N0b3BWTUJ1dHRvbicpOyBcclxuICAgIGNvbnN0IHJlc3RhcnRCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVzdGFydFZNQnV0dG9uJyk7XHJcbiAgICBjb25zdCBzbmFwc2hvdEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjcmVhdGVTbmFwc2hvdEJ1dHRvbicpO1xyXG5cclxuICAgIGlmIChzdGFydEJ0bikge1xyXG4gICAgICAgIHN0YXJ0QnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oZSkge1xyXG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgIHN0YXJ0VmlydHVhbE1hY2hpbmUoKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoc3RvcEJ0bikge1xyXG4gICAgICAgIHN0b3BCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbihlKSB7XHJcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgc3RvcFZpcnR1YWxNYWNoaW5lKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHJlc3RhcnRCdG4pIHtcclxuICAgICAgICByZXN0YXJ0QnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oZSkge1xyXG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgIHJlc3RhcnRWaXJ0dWFsTWFjaGluZSgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChzbmFwc2hvdEJ0bikge1xyXG4gICAgICAgIHNuYXBzaG90QnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oZSkge1xyXG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgIGNyZWF0ZVNuYXBzaG90KCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbn0pO1xyXG5cclxuLy8gU25hcHNob3QgVGFibGUgTWFuYWdlbWVudFxyXG5mdW5jdGlvbiBzbmFwc2hvdFRhYmxlKCkge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICBsb2FkaW5nOiBmYWxzZSxcclxuICAgICAgICBzbmFwc2hvdHM6IFtdLFxyXG4gICAgICAgIGVycm9yOiBudWxsLFxyXG4gICAgICAgIFxyXG4gICAgICAgIGFzeW5jIGZldGNoU25hcHNob3RzKCkge1xyXG4gICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLmVycm9yID0gbnVsbDtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGNvbnN0IHZtSWQgPSB3aW5kb3cudm1JZCB8fCAnJztcclxuICAgICAgICAgICAgaWYgKCF2bUlkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZXJyb3IgPSAnS2jDtG5nIHTDrG0gdGjhuqV5IElEIG3DoXkg4bqjbyc7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGAvc2VjdXJlL2dldC1zbmFwc2hvdHM/cHJvZHVjdF9pZD0ke3ZtSWR9YCwge1xyXG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ0dFVCcsXHJcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAnQWNjZXB0JzogJ2FwcGxpY2F0aW9uL2pzb24nLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAnWC1DU1JGLVRPS0VOJzogY3NyZlRva2VuLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAnQ2FjaGUtQ29udHJvbCc6ICduby1jYWNoZSdcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIGNyZWRlbnRpYWxzOiAnc2FtZS1vcmlnaW4nXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBIVFRQIGVycm9yISBzdGF0dXM6ICR7cmVzcG9uc2Uuc3RhdHVzfWApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIC8vIEtp4buDbSB0cmEgcmVzcG9uc2Ugc3RydWN0dXJlIHThu6sgQVBJIHRo4buxYyB04bq/XHJcbiAgICAgICAgICAgICAgICBpZiAoZGF0YS5lcnJvciA9PT0gZmFsc2UgJiYgZGF0YS5kYXRhICYmIGRhdGEuZGF0YS5zbmFwc2hvdHMpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNuYXBzaG90cyA9IGRhdGEuZGF0YS5zbmFwc2hvdHM7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRhdGEuZXJyb3IgPT09IHRydWUpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmVycm9yID0gZGF0YS5tZXNzYWdlIHx8ICdDw7MgbOG7l2kgeOG6o3kgcmEga2hpIHThuqNpIGRhbmggc8OhY2ggc25hcHNob3QnO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc25hcHNob3RzID0gW107XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRhdGEuc25hcHNob3RzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gRmFsbGJhY2sgY2hvIHRyxrDhu51uZyBo4bujcCBkYXRhIHRy4buxYyB0aeG6v3BcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNuYXBzaG90cyA9IGRhdGEuc25hcHNob3RzO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNuYXBzaG90cyA9IFtdO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZmV0Y2hpbmcgc25hcHNob3RzOicsIGVycm9yKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZXJyb3IgPSAnS2jDtG5nIHRo4buDIGvhur90IG7hu5FpIMSR4bq/biBtw6F5IGNo4bunJztcclxuICAgICAgICAgICAgICAgIHRoaXMuc25hcHNob3RzID0gW107XHJcbiAgICAgICAgICAgIH0gZmluYWxseSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIGZvcm1hdFNpemUoc2l6ZUdCLCBzaXplTUIpIHtcclxuICAgICAgICAgICAgLy8gQ29udmVydCB0byBieXRlcyBmaXJzdFxyXG4gICAgICAgICAgICBsZXQgYnl0ZXMgPSAwO1xyXG4gICAgICAgICAgICBpZiAoc2l6ZUdCKSB7XHJcbiAgICAgICAgICAgICAgICBieXRlcyA9IHBhcnNlRmxvYXQoc2l6ZUdCKSAqIDEwMjQgKiAxMDI0ICogMTAyNDsgLy8gR0IgdG8gYnl0ZXNcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChzaXplTUIpIHtcclxuICAgICAgICAgICAgICAgIGJ5dGVzID0gcGFyc2VGbG9hdChzaXplTUIpICogMTAyNCAqIDEwMjQ7IC8vIE1CIHRvIGJ5dGVzXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGlmIChieXRlcyA9PT0gMCkgcmV0dXJuICcwIEInO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgY29uc3QgdW5pdHMgPSBbJ0InLCAnS0InLCAnTUInLCAnR0InLCAnVEInXTtcclxuICAgICAgICAgICAgY29uc3QgayA9IDEwMjQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGkgPSBNYXRoLmZsb29yKE1hdGgubG9nKGJ5dGVzKSAvIE1hdGgubG9nKGspKTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGNvbnN0IHNpemUgPSBwYXJzZUZsb2F0KChieXRlcyAvIE1hdGgucG93KGssIGkpKS50b0ZpeGVkKDIpKTtcclxuICAgICAgICAgICAgcmV0dXJuIHNpemUgKyAnICcgKyB1bml0c1tpXTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBhc3luYyBkZWxldGVTbmFwc2hvdChzbmFwc2hvdE5hbWUpIHtcclxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgU3dhbC5maXJlKHtcclxuICAgICAgICAgICAgICAgIHRpdGxlOiAnWMOhYyBuaOG6rW4geMOzYScsXHJcbiAgICAgICAgICAgICAgICB0ZXh0OiBgQuG6oW4gY8OzIGNo4bqvYyBjaOG6r24gbXXhu5FuIHjDs2Egc25hcHNob3QgXCIke3NuYXBzaG90TmFtZX1cIj8gSMOgbmggxJHhu5luZyBuw6B5IGtow7RuZyB0aOG7gyBob8OgbiB0w6FjLmAsXHJcbiAgICAgICAgICAgICAgICBpY29uOiAnd2FybmluZycsXHJcbiAgICAgICAgICAgICAgICBzaG93Q2FuY2VsQnV0dG9uOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgY29uZmlybUJ1dHRvbkNvbG9yOiAnI2QzMycsXHJcbiAgICAgICAgICAgICAgICBjYW5jZWxCdXR0b25Db2xvcjogJyMzMDg1ZDYnLFxyXG4gICAgICAgICAgICAgICAgY29uZmlybUJ1dHRvblRleHQ6ICdYw7NhJyxcclxuICAgICAgICAgICAgICAgIGNhbmNlbEJ1dHRvblRleHQ6ICdI4buneSBi4buPJyxcclxuICAgICAgICAgICAgICAgIHJldmVyc2VCdXR0b25zOiB0cnVlXHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgaWYgKCFyZXN1bHQuaXNDb25maXJtZWQpIHJldHVybjtcclxuXHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCcvc2VjdXJlL3JlbW92ZS1zbmFwc2hvdCcsIHtcclxuICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcclxuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICdBY2NlcHQnOiAnYXBwbGljYXRpb24vanNvbicsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICdYLUNTUkYtVE9LRU4nOiBjc3JmVG9rZW5cclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvZHVjdF9pZDogd2luZG93LnZtSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNuYXBzaG90X25hbWU6IHNuYXBzaG90TmFtZVxyXG4gICAgICAgICAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICAgICAgICAgIGNyZWRlbnRpYWxzOiAnc2FtZS1vcmlnaW4nXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChkYXRhLmVycm9yID09PSBmYWxzZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNob3dOb3RpZmljYXRpb24oZGF0YS5tZXNzYWdlIHx8ICdYw7NhIHNuYXBzaG90IHRow6BuaCBjw7RuZycsICdzdWNjZXNzJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gUmVmcmVzaCBzbmFwc2hvdCBsaXN0IGFmdGVyIHN1Y2Nlc3NmdWwgZGVsZXRpb25cclxuICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuZmV0Y2hTbmFwc2hvdHMoKSwgMTAwMCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihkYXRhLm1lc3NhZ2UgfHwgJ0PDsyBs4buXaSB44bqjeSByYSBraGkgeMOzYSBzbmFwc2hvdCcpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZGVsZXRpbmcgc25hcHNob3Q6JywgZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgc2hvd05vdGlmaWNhdGlvbihlcnJvci5tZXNzYWdlIHx8ICdDw7MgbOG7l2kgeOG6o3kgcmEga2hpIHjDs2Egc25hcHNob3QnLCAnZXJyb3InKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIGFzeW5jIHJldmVydFNuYXBzaG90KHNuYXBzaG90TmFtZSkge1xyXG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBTd2FsLmZpcmUoe1xyXG4gICAgICAgICAgICAgICAgdGl0bGU6ICdYw6FjIG5o4bqtbiBraMO0aSBwaOG7pWMnLFxyXG4gICAgICAgICAgICAgICAgdGV4dDogYELhuqFuIGPDsyBjaOG6r2MgY2jhuq9uIG114buRbiBraMO0aSBwaOG7pWMgduG7gSBzbmFwc2hvdCBcIiR7c25hcHNob3ROYW1lfVwiPyBU4bqldCBj4bqjIGThu68gbGnhu4d1IGhp4buHbiB04bqhaSBz4bq9IGLhu4sgbeG6pXQuYCxcclxuICAgICAgICAgICAgICAgIGljb246ICd3YXJuaW5nJyxcclxuICAgICAgICAgICAgICAgIHNob3dDYW5jZWxCdXR0b246IHRydWUsXHJcbiAgICAgICAgICAgICAgICBjb25maXJtQnV0dG9uQ29sb3I6ICcjMzA4NWQ2JyxcclxuICAgICAgICAgICAgICAgIGNhbmNlbEJ1dHRvbkNvbG9yOiAnI2QzMycsXHJcbiAgICAgICAgICAgICAgICBjb25maXJtQnV0dG9uVGV4dDogJ0tow7RpIHBo4bulYycsXHJcbiAgICAgICAgICAgICAgICBjYW5jZWxCdXR0b25UZXh0OiAnSOG7p3kgYuG7jycsXHJcbiAgICAgICAgICAgICAgICByZXZlcnNlQnV0dG9uczogdHJ1ZVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIGlmICghcmVzdWx0LmlzQ29uZmlybWVkKSByZXR1cm47XHJcblxyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL3NlY3VyZS9yZXZlcnQtc25hcHNob3QnLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXHJcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAnQWNjZXB0JzogJ2FwcGxpY2F0aW9uL2pzb24nLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAnWC1DU1JGLVRPS0VOJzogY3NyZlRva2VuXHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y3RfaWQ6IHdpbmRvdy52bUlkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzbmFwc2hvdF9uYW1lOiBzbmFwc2hvdE5hbWVcclxuICAgICAgICAgICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgICAgICAgICBjcmVkZW50aWFsczogJ3NhbWUtb3JpZ2luJ1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoZGF0YS5lcnJvciA9PT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgICAgICAgICBzaG93Tm90aWZpY2F0aW9uKGRhdGEubWVzc2FnZSB8fCAnS2jDtGkgcGjhu6VjIHNuYXBzaG90IHRow6BuaCBjw7RuZycsICdzdWNjZXNzJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gUmVmcmVzaCBzbmFwc2hvdCBsaXN0IGFmdGVyIHN1Y2Nlc3NmdWwgcmV2ZXJ0XHJcbiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmZldGNoU25hcHNob3RzKCksIDIwMDApO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZGF0YS5tZXNzYWdlIHx8ICdDw7MgbOG7l2kgeOG6o3kgcmEga2hpIGtow7RpIHBo4bulYyBzbmFwc2hvdCcpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgcmV2ZXJ0aW5nIHNuYXBzaG90OicsIGVycm9yKTtcclxuICAgICAgICAgICAgICAgIHNob3dOb3RpZmljYXRpb24oZXJyb3IubWVzc2FnZSB8fCAnQ8OzIGzhu5dpIHjhuqN5IHJhIGtoaSBraMO0aSBwaOG7pWMgc25hcHNob3QnLCAnZXJyb3InKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIEhlbHBlciBtZXRob2QgdG8gcmVmcmVzaCBzbmFwc2hvdHNcclxuICAgICAgICByZWZyZXNoU25hcHNob3RzKCkge1xyXG4gICAgICAgICAgICB0aGlzLmZldGNoU25hcHNob3RzKCk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gSGVscGVyIG1ldGhvZCB0byBnZXQgc25hcHNob3QgY291bnRcclxuICAgICAgICBnZXRTbmFwc2hvdENvdW50KCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zbmFwc2hvdHMubGVuZ3RoO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIEhlbHBlciBtZXRob2QgdG8gY2hlY2sgaWYgc25hcHNob3RzIGFyZSBsb2FkaW5nXHJcbiAgICAgICAgaXNMb2FkaW5nKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sb2FkaW5nO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIEhlbHBlciBtZXRob2QgdG8gY2hlY2sgaWYgdGhlcmUncyBhbiBlcnJvclxyXG4gICAgICAgIGhhc0Vycm9yKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5lcnJvciAhPT0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn0iXSwibWFwcGluZ3MiOiI7K0NBQ0EscUpBQUFBLG1CQUFBLFlBQUFBLG9CQUFBLFdBQUFDLENBQUEsU0FBQUMsQ0FBQSxFQUFBRCxDQUFBLE9BQUFFLENBQUEsR0FBQUMsTUFBQSxDQUFBQyxTQUFBLEVBQUFDLENBQUEsR0FBQUgsQ0FBQSxDQUFBSSxjQUFBLEVBQUFDLENBQUEsR0FBQUosTUFBQSxDQUFBSyxjQUFBLGNBQUFQLENBQUEsRUFBQUQsQ0FBQSxFQUFBRSxDQUFBLElBQUFELENBQUEsQ0FBQUQsQ0FBQSxJQUFBRSxDQUFBLENBQUFPLEtBQUEsS0FBQUMsQ0FBQSx3QkFBQUMsTUFBQSxHQUFBQSxNQUFBLE9BQUFDLENBQUEsR0FBQUYsQ0FBQSxDQUFBRyxRQUFBLGtCQUFBQyxDQUFBLEdBQUFKLENBQUEsQ0FBQUssYUFBQSx1QkFBQUMsQ0FBQSxHQUFBTixDQUFBLENBQUFPLFdBQUEsOEJBQUFDLE9BQUFqQixDQUFBLEVBQUFELENBQUEsRUFBQUUsQ0FBQSxXQUFBQyxNQUFBLENBQUFLLGNBQUEsQ0FBQVAsQ0FBQSxFQUFBRCxDQUFBLElBQUFTLEtBQUEsRUFBQVAsQ0FBQSxFQUFBaUIsVUFBQSxNQUFBQyxZQUFBLE1BQUFDLFFBQUEsU0FBQXBC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\n//# sourceURL=webpack-internal:///./resources/js/service/service.js\n"); /***/ }) diff --git a/public/js/service/vminfo.min.js b/public/js/service/vminfo.min.js index 5e16fc8..43ccc1d 100644 --- a/public/js/service/vminfo.min.js +++ b/public/js/service/vminfo.min.js @@ -15,7 +15,7 @@ \****************************************/ /***/ (() => { -eval("$(document).ready(function () {\n // Initialize dropdown functionality\n function initializeDropdown() {\n // Toggle dropdown on click\n $(document).on(\"click\", \".dropdown-selected\", function (e) {\n e.stopPropagation();\n var $dropdown = $(this).closest(\".custom-dropdown\");\n var $options = $dropdown.find(\".dropdown-options\");\n var $selected = $(this);\n\n // Close other dropdowns\n $(\".custom-dropdown\").not($dropdown).find(\".dropdown-options\").removeClass(\"show\");\n $(\".custom-dropdown\").not($dropdown).find(\".dropdown-selected\").removeClass(\"active\");\n\n // Toggle current dropdown\n $options.toggleClass(\"show\");\n $selected.toggleClass(\"active\");\n });\n\n // Handle option selection\n $(document).on(\"click\", \".dropdown-option\", function (e) {\n e.stopPropagation();\n var $option = $(this);\n var $dropdown = $option.closest(\".custom-dropdown\");\n var $selected = $dropdown.find(\".dropdown-selected\");\n var $options = $dropdown.find(\".dropdown-options\");\n var $selectedText = $selected.find(\".selected-text\");\n\n // Get data from selected option\n var value = $option.data(\"value\");\n var months = $option.data(\"months\");\n var price = $option.data(\"price\");\n // Get text from the first span element to avoid getting badge text\n var text = $option.find('span').first().text();\n\n // Update selected text\n $selectedText.text(text);\n\n // Update hidden inputs\n $dropdown.closest(\"form\").find(\".hiddenMonths\").val(months);\n $dropdown.closest(\"form\").find(\".hiddenTotalPrice\").val(price);\n\n // Update selected state\n $options.find(\".dropdown-option\").removeClass(\"selected\");\n $option.addClass(\"selected\");\n\n // Close dropdown\n $options.removeClass(\"show\");\n $selected.removeClass(\"active\");\n\n // Trigger custom event for other components\n $dropdown.trigger(\"dropdown:changed\", {\n value: value,\n months: months,\n price: price,\n text: text\n });\n\n // Update price display using jQuery\n var $productContainer = $dropdown.closest('[data-product-id]');\n var basePrice = parseFloat($productContainer.data('base-price'));\n var selectedMonths = parseInt(months);\n console.log('Updating price display:', {\n basePrice: basePrice,\n selectedMonths: selectedMonths,\n productContainer: $productContainer.length\n });\n\n // Calculate prices\n var originalPrice = basePrice * selectedMonths;\n var savings = selectedMonths >= 12 ? Math.round(originalPrice * 0.1) : 0;\n var finalPrice = originalPrice - savings;\n\n // Update display\n $productContainer.find('.total-price-display').text('₫' + finalPrice.toLocaleString());\n $productContainer.find('.months-display').text(selectedMonths + ' tháng');\n $productContainer.find('.price-per-month').text('₫' + basePrice.toLocaleString() + '/tháng');\n $productContainer.find('.original-price').text('₫' + originalPrice.toLocaleString());\n $productContainer.find('.savings-amount').text('₫' + savings.toLocaleString());\n\n // Show/hide savings info\n if (savings > 0) {\n $productContainer.find('.savings-info').show();\n } else {\n $productContainer.find('.savings-info').hide();\n }\n });\n\n // Close dropdown when clicking outside\n $(document).on(\"click\", function (e) {\n if (!$(e.target).closest(\".custom-dropdown\").length) {\n $(\".dropdown-options\").removeClass(\"show\");\n $(\".dropdown-selected\").removeClass(\"active\");\n }\n });\n\n // Close dropdown on escape key\n $(document).on(\"keydown\", function (e) {\n if (e.key === \"Escape\") {\n $(\".dropdown-options\").removeClass(\"show\");\n $(\".dropdown-selected\").removeClass(\"active\");\n }\n });\n }\n\n // Initialize on page load\n initializeDropdown();\n\n // Optimize form submission to prevent blocking\n $(document).on('submit', 'form[action*=\"them-gio-hang\"]', function (e) {\n var $form = $(this);\n var $submitBtn = $form.find('button[type=\"submit\"]');\n\n // Disable submit button to prevent double submission\n $submitBtn.prop('disabled', true).text('Đang xử lý...');\n\n // Add loading state\n $form.addClass('submitting');\n\n // Re-enable button after 5 seconds as fallback\n setTimeout(function () {\n $submitBtn.prop('disabled', false).text('Đăng ký ngay');\n $form.removeClass('submitting');\n }, 5000);\n });\n\n // Cache utility functions - Single JSON approach\n var VM_INFO_CACHE_KEY = \"vm_info_cache\";\n function saveVMInfoToCache(templateId, data) {\n var ttl = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 30 * 60 * 1000;\n try {\n var now = new Date().getTime();\n var vmInfoCache = getVMInfoCache();\n if (!vmInfoCache) {\n vmInfoCache = {\n lastUpdated: now,\n data: {}\n };\n }\n vmInfoCache.data[templateId] = {\n value: data,\n expiry: now + ttl\n };\n vmInfoCache.lastUpdated = now;\n localStorage.setItem(VM_INFO_CACHE_KEY, JSON.stringify(vmInfoCache));\n } catch (e) {\n console.warn(\"VM Info cache save failed:\", e);\n }\n }\n function getVMInfoFromCache(templateId) {\n try {\n var vmInfoCache = getVMInfoCache();\n if (!vmInfoCache || !vmInfoCache.data[templateId]) {\n return null;\n }\n var item = vmInfoCache.data[templateId];\n var now = new Date().getTime();\n\n // Check if expired\n if (now > item.expiry) {\n removeVMInfoFromCache(templateId);\n return null;\n }\n return item.value;\n } catch (e) {\n console.warn(\"VM Info cache get failed:\", e);\n return null;\n }\n }\n function getVMInfoCache() {\n try {\n var cacheStr = localStorage.getItem(VM_INFO_CACHE_KEY);\n return cacheStr ? JSON.parse(cacheStr) : null;\n } catch (e) {\n console.warn(\"VM Info cache parse failed:\", e);\n return null;\n }\n }\n function removeVMInfoFromCache(templateId) {\n try {\n var vmInfoCache = getVMInfoCache();\n if (vmInfoCache && vmInfoCache.data[templateId]) {\n delete vmInfoCache.data[templateId];\n vmInfoCache.lastUpdated = new Date().getTime();\n localStorage.setItem(VM_INFO_CACHE_KEY, JSON.stringify(vmInfoCache));\n }\n } catch (e) {\n console.warn(\"VM Info cache remove failed:\", e);\n }\n }\n function clearExpiredVMInfoCache() {\n try {\n var vmInfoCache = getVMInfoCache();\n if (!vmInfoCache) {\n return;\n }\n var now = new Date().getTime();\n var hasExpired = false;\n Object.keys(vmInfoCache.data).forEach(function (templateId) {\n var item = vmInfoCache.data[templateId];\n if (now > item.expiry) {\n delete vmInfoCache.data[templateId];\n hasExpired = true;\n }\n });\n if (hasExpired) {\n vmInfoCache.lastUpdated = now;\n localStorage.setItem(VM_INFO_CACHE_KEY, JSON.stringify(vmInfoCache));\n }\n } catch (e) {\n console.warn(\"VM Info cache cleanup failed:\", e);\n }\n }\n\n // Re-initialize if content is dynamically loaded\n $(document).on(\"DOMContentLoaded\", initializeDropdown);\n\n // Load VM information for each product with caching (OS, CPU, RAM, Disk) - NON-BLOCKING\n function loadGuestOSInfo() {\n // Get unique template IDs to avoid duplicate API calls\n var templateIds = [];\n $(\".guest-os\").each(function () {\n var templateId = $(this).data(\"template-id\");\n if (templateId && !templateIds.includes(templateId)) {\n templateIds.push(templateId);\n }\n });\n\n // Load VM info in background without blocking form submission\n templateIds.forEach(function (templateId) {\n // Check cache first\n var cachedData = getVMInfoFromCache(templateId);\n if (cachedData) {\n // Use cached data\n updateVMInfoUI(templateId, cachedData);\n return;\n }\n\n // Add loading indicators\n addLoadingIndicators(templateId);\n\n // Call API to get complete VM info - with shorter timeout\n $.ajax({\n url: \"/api/v1/get-vm-info/\".concat(templateId, \"/guest_os,cpu_count,memory_size,disk_capacity\"),\n method: \"GET\",\n timeout: 5000,\n // Reduced timeout to 5 seconds\n headers: {\n \"X-CSRF-TOKEN\": $('meta[name=\"csrf-token\"]').attr(\"content\"),\n Accept: \"application/json\"\n },\n success: function success(response) {\n if (response.error === false && response.data) {\n var vmData = response.data;\n var processedData = processVMData(vmData);\n\n // Cache the result for 30 minutes\n saveVMInfoToCache(templateId, processedData);\n\n // Update UI\n updateVMInfoUI(templateId, processedData);\n } else {\n setFallbackValues(templateId);\n }\n },\n error: function error(xhr, status, _error) {\n console.warn(\"Failed to load VM info for template:\", templateId, _error);\n setFallbackValues(templateId);\n }\n });\n });\n }\n\n // Load VM info after a short delay to not block page load\n setTimeout(loadGuestOSInfo, 1000);\n\n // Process VM data from API response\n function processVMData(vmData) {\n var guestOS = vmData.guest_os || \"UNKNOWN\";\n var cpuCount = vmData.cpu_count || 0;\n var memoryMB = vmData.memory_size || 0;\n var diskBytes = vmData.disk_capacity || 0;\n return {\n guestOS: guestOS,\n formattedOS: formatOSName(guestOS),\n cpu: cpuCount,\n formattedCPU: \"\".concat(cpuCount, \" vCore\").concat(cpuCount > 1 ? \"s\" : \"\"),\n ram: Math.round(memoryMB / 1024 * 100) / 100,\n // Convert MB to GB, 2 decimal places\n formattedRAM: \"\".concat(Math.round(memoryMB / 1024 * 100) / 100, \" GB\"),\n disk: Math.round(diskBytes / (1024 * 1024 * 1024) * 100) / 100,\n // Convert bytes to GB\n formattedDisk: \"\".concat(Math.round(diskBytes / (1024 * 1024 * 1024) * 100) / 100, \" GB\")\n };\n }\n\n // Add loading indicators to all VM info elements\n function addLoadingIndicators(templateId) {\n var loadingIcon = 'Đang tải...';\n $(\".guest-os[data-template-id=\\\"\".concat(templateId, \"\\\"]\")).html(loadingIcon);\n $(\".vm-cpu[data-template-id=\\\"\".concat(templateId, \"\\\"]\")).html(loadingIcon);\n $(\".vm-ram[data-template-id=\\\"\".concat(templateId, \"\\\"]\")).html(loadingIcon);\n $(\".vm-disk[data-template-id=\\\"\".concat(templateId, \"\\\"]\")).html(loadingIcon);\n }\n\n // Update all VM info UI elements\n function updateVMInfoUI(templateId, data) {\n // Update OS\n $(\".guest-os[data-template-id=\\\"\".concat(templateId, \"\\\"]\")).html(data.formattedOS);\n updateOSIcon(templateId, data.guestOS);\n\n // Update hardware specs\n $(\".vm-cpu[data-template-id=\\\"\".concat(templateId, \"\\\"]\")).html(data.formattedCPU);\n $(\".vm-ram[data-template-id=\\\"\".concat(templateId, \"\\\"]\")).html(data.formattedRAM);\n $(\".vm-disk[data-template-id=\\\"\".concat(templateId, \"\\\"]\")).html(data.formattedDisk);\n }\n\n // Set fallback values when API fails\n function setFallbackValues(templateId) {\n $(\".guest-os[data-template-id=\\\"\".concat(templateId, \"\\\"]\")).html(\"Linux\");\n $(\".vm-cpu[data-template-id=\\\"\".concat(templateId, \"\\\"]\")).html(\"N/A\");\n $(\".vm-ram[data-template-id=\\\"\".concat(templateId, \"\\\"]\")).html(\"N/A\");\n $(\".vm-disk[data-template-id=\\\"\".concat(templateId, \"\\\"]\")).html(\"N/A\");\n }\n\n // Update OS icon based on detected OS\n function updateOSIcon(templateId, osName) {\n var $iconElement = $(\".os-icon[data-template-id=\\\"\".concat(templateId, \"\\\"]\"));\n if (osName && osName.toLowerCase().includes(\"windows\")) {\n $iconElement.removeClass(\"fab fa-linux\").addClass(\"fab fa-windows\");\n } else if (osName && osName.toLowerCase().includes(\"ubuntu\")) {\n $iconElement.removeClass(\"fab fa-linux\").addClass(\"fab fa-ubuntu\");\n } else if (osName && osName.toLowerCase().includes(\"centos\")) {\n $iconElement.removeClass(\"fab fa-linux\").addClass(\"fab fa-centos\");\n } else if (osName && osName.toLowerCase().includes(\"debian\")) {\n $iconElement.removeClass(\"fab fa-linux\").addClass(\"fab fa-debian\");\n } else {\n // Keep linux icon as default\n $iconElement.removeClass().addClass(\"fab fa-linux text-orange-600\");\n }\n }\n\n // Format OS name for better display\n function formatOSName(osName) {\n var osMap = {\n UBUNTU_64: \"Ubuntu 64-bit\",\n CENTOS_64: \"CentOS 64-bit\",\n CENTOS_7_64: \"CentOS 7 64-bit\",\n CENTOS_8_64: \"CentOS 8 64-bit\",\n ROCKY_LINUX_64: \"Rocky Linux 64-bit\",\n WINDOWS_10_64: \"Windows 10 64-bit\",\n WINDOWS_9_SERVER_64: \"Windows Server 2019\",\n WINDOWS_SERVER_2019: \"Windows Server 2019\",\n WINDOWS_SERVER_2022: \"Windows Server 2022\",\n WINDOWS_2019: \"Windows Server 2019\",\n WINDOWS_2022: \"Windows Server 2022\",\n DEBIAN_10_64: \"Debian 10 64-bit\",\n DEBIAN_11_64: \"Debian 11 64-bit\",\n OTHER_LINUX_64: \"Linux 64-bit\",\n OTHER_64: \"Other 64-bit\"\n };\n return osMap[osName] || osName || \"Linux\";\n }\n\n // Clean up expired cache entries\n clearExpiredVMInfoCache();\n\n // Load Guest OS info when page loads\n loadGuestOSInfo();\n\n // Debug: Show what data we have\n console.log(\"Template IDs available:\", $(\".guest-os\").map(function () {\n return {\n templateId: $(this).data(\"template-id\"),\n hasTemplateId: Boolean($(this).data(\"template-id\"))\n };\n }).get());\n\n // Expose cache management to global scope for debugging\n window.vmInfoCache = {\n clear: function clear() {\n localStorage.removeItem(VM_INFO_CACHE_KEY);\n console.log(\"VM Info cache cleared\");\n },\n refresh: function refresh() {\n this.clear();\n loadGuestOSInfo();\n console.log(\"VM Info cache refreshed\");\n },\n info: function info() {\n var vmInfoCache = getVMInfoCache();\n if (!vmInfoCache) {\n console.log(\"No VM Info cache found\");\n return;\n }\n var templateIds = Object.keys(vmInfoCache.data);\n console.log(\"VM Info cache entries: \".concat(templateIds.length));\n console.log(\"Last updated: \".concat(new Date(vmInfoCache.lastUpdated).toLocaleString()));\n templateIds.forEach(function (templateId) {\n var data = getVMInfoFromCache(templateId);\n console.log(\"\".concat(templateId, \": \").concat(data ? data.formattedOS : \"expired\"));\n });\n },\n get: function get(templateId) {\n return getVMInfoFromCache(templateId);\n },\n remove: function remove(templateId) {\n removeVMInfoFromCache(templateId);\n console.log(\"Removed \".concat(templateId, \" from cache\"));\n },\n raw: function raw() {\n return getVMInfoCache();\n }\n };\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyIkIiwiZG9jdW1lbnQiLCJyZWFkeSIsImluaXRpYWxpemVEcm9wZG93biIsIm9uIiwiZSIsInN0b3BQcm9wYWdhdGlvbiIsIiRkcm9wZG93biIsImNsb3Nlc3QiLCIkb3B0aW9ucyIsImZpbmQiLCIkc2VsZWN0ZWQiLCJub3QiLCJyZW1vdmVDbGFzcyIsInRvZ2dsZUNsYXNzIiwiJG9wdGlvbiIsIiRzZWxlY3RlZFRleHQiLCJ2YWx1ZSIsImRhdGEiLCJtb250aHMiLCJwcmljZSIsInRleHQiLCJmaXJzdCIsInZhbCIsImFkZENsYXNzIiwidHJpZ2dlciIsIiRwcm9kdWN0Q29udGFpbmVyIiwiYmFzZVByaWNlIiwicGFyc2VGbG9hdCIsInNlbGVjdGVkTW9udGhzIiwicGFyc2VJbnQiLCJjb25zb2xlIiwibG9nIiwicHJvZHVjdENvbnRhaW5lciIsImxlbmd0aCIsIm9yaWdpbmFsUHJpY2UiLCJzYXZpbmdzIiwiTWF0aCIsInJvdW5kIiwiZmluYWxQcmljZSIsInRvTG9jYWxlU3RyaW5nIiwic2hvdyIsImhpZGUiLCJ0YXJnZXQiLCJrZXkiLCIkZm9ybSIsIiRzdWJtaXRCdG4iLCJwcm9wIiwic2V0VGltZW91dCIsIlZNX0lORk9fQ0FDSEVfS0VZIiwic2F2ZVZNSW5mb1RvQ2FjaGUiLCJ0ZW1wbGF0ZUlkIiwidHRsIiwiYXJndW1lbnRzIiwidW5kZWZpbmVkIiwibm93IiwiRGF0ZSIsImdldFRpbWUiLCJ2bUluZm9DYWNoZSIsImdldFZNSW5mb0NhY2hlIiwibGFzdFVwZGF0ZWQiLCJleHBpcnkiLCJsb2NhbFN0b3JhZ2UiLCJzZXRJdGVtIiwiSlNPTiIsInN0cmluZ2lmeSIsIndhcm4iLCJnZXRWTUluZm9Gcm9tQ2FjaGUiLCJpdGVtIiwicmVtb3ZlVk1JbmZvRnJvbUNhY2hlIiwiY2FjaGVTdHIiLCJnZXRJdGVtIiwicGFyc2UiLCJjbGVhckV4cGlyZWRWTUluZm9DYWNoZSIsImhhc0V4cGlyZWQiLCJPYmplY3QiLCJrZXlzIiwiZm9yRWFjaCIsImxvYWRHdWVzdE9TSW5mbyIsInRlbXBsYXRlSWRzIiwiZWFjaCIsImluY2x1ZGVzIiwicHVzaCIsImNhY2hlZERhdGEiLCJ1cGRhdGVWTUluZm9VSSIsImFkZExvYWRpbmdJbmRpY2F0b3JzIiwiYWpheCIsInVybCIsImNvbmNhdCIsIm1ldGhvZCIsInRpbWVvdXQiLCJoZWFkZXJzIiwiYXR0ciIsIkFjY2VwdCIsInN1Y2Nlc3MiLCJyZXNwb25zZSIsImVycm9yIiwidm1EYXRhIiwicHJvY2Vzc2VkRGF0YSIsInByb2Nlc3NWTURhdGEiLCJzZXRGYWxsYmFja1ZhbHVlcyIsInhociIsInN0YXR1cyIsImd1ZXN0T1MiLCJndWVzdF9vcyIsImNwdUNvdW50IiwiY3B1X2NvdW50IiwibWVtb3J5TUIiLCJtZW1vcnlfc2l6ZSIsImRpc2tCeXRlcyIsImRpc2tfY2FwYWNpdHkiLCJmb3JtYXR0ZWRPUyIsImZvcm1hdE9TTmFtZSIsImNwdSIsImZvcm1hdHRlZENQVSIsInJhbSIsImZvcm1hdHRlZFJBTSIsImRpc2siLCJmb3JtYXR0ZWREaXNrIiwibG9hZGluZ0ljb24iLCJodG1sIiwidXBkYXRlT1NJY29uIiwib3NOYW1lIiwiJGljb25FbGVtZW50IiwidG9Mb3dlckNhc2UiLCJvc01hcCIsIlVCVU5UVV82NCIsIkNFTlRPU182NCIsIkNFTlRPU183XzY0IiwiQ0VOVE9TXzhfNjQiLCJST0NLWV9MSU5VWF82NCIsIldJTkRPV1NfMTBfNjQiLCJXSU5ET1dTXzlfU0VSVkVSXzY0IiwiV0lORE9XU19TRVJWRVJfMjAxOSIsIldJTkRPV1NfU0VSVkVSXzIwMjIiLCJXSU5ET1dTXzIwMTkiLCJXSU5ET1dTXzIwMjIiLCJERUJJQU5fMTBfNjQiLCJERUJJQU5fMTFfNjQiLCJPVEhFUl9MSU5VWF82NCIsIk9USEVSXzY0IiwibWFwIiwiaGFzVGVtcGxhdGVJZCIsIkJvb2xlYW4iLCJnZXQiLCJ3aW5kb3ciLCJjbGVhciIsInJlbW92ZUl0ZW0iLCJyZWZyZXNoIiwiaW5mbyIsInJlbW92ZSIsInJhdyJdLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvc2VydmljZS92bWluZm8uanM/YzdlMyJdLCJzb3VyY2VzQ29udGVudCI6WyIkKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbiAoKSB7XHJcbiAgICAvLyBJbml0aWFsaXplIGRyb3Bkb3duIGZ1bmN0aW9uYWxpdHlcclxuICAgIGZ1bmN0aW9uIGluaXRpYWxpemVEcm9wZG93bigpIHtcclxuICAgICAgICAvLyBUb2dnbGUgZHJvcGRvd24gb24gY2xpY2tcclxuICAgICAgICAkKGRvY3VtZW50KS5vbihcImNsaWNrXCIsIFwiLmRyb3Bkb3duLXNlbGVjdGVkXCIsIGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgIGNvbnN0ICRkcm9wZG93biA9ICQodGhpcykuY2xvc2VzdChcIi5jdXN0b20tZHJvcGRvd25cIik7XHJcbiAgICAgICAgICAgIGNvbnN0ICRvcHRpb25zID0gJGRyb3Bkb3duLmZpbmQoXCIuZHJvcGRvd24tb3B0aW9uc1wiKTtcclxuICAgICAgICAgICAgY29uc3QgJHNlbGVjdGVkID0gJCh0aGlzKTtcclxuXHJcbiAgICAgICAgICAgIC8vIENsb3NlIG90aGVyIGRyb3Bkb3duc1xyXG4gICAgICAgICAgICAkKFwiLmN1c3RvbS1kcm9wZG93blwiKVxyXG4gICAgICAgICAgICAgICAgLm5vdCgkZHJvcGRvd24pXHJcbiAgICAgICAgICAgICAgICAuZmluZChcIi5kcm9wZG93bi1vcHRpb25zXCIpXHJcbiAgICAgICAgICAgICAgICAucmVtb3ZlQ2xhc3MoXCJzaG93XCIpO1xyXG4gICAgICAgICAgICAkKFwiLmN1c3RvbS1kcm9wZG93blwiKVxyXG4gICAgICAgICAgICAgICAgLm5vdCgkZHJvcGRvd24pXHJcbiAgICAgICAgICAgICAgICAuZmluZChcIi5kcm9wZG93bi1zZWxlY3RlZFwiKVxyXG4gICAgICAgICAgICAgICAgLnJlbW92ZUNsYXNzKFwiYWN0aXZlXCIpO1xyXG5cclxuICAgICAgICAgICAgLy8gVG9nZ2xlIGN1cnJlbnQgZHJvcGRvd25cclxuICAgICAgICAgICAgJG9wdGlvbnMudG9nZ2xlQ2xhc3MoXCJzaG93XCIpO1xyXG4gICAgICAgICAgICAkc2VsZWN0ZWQudG9nZ2xlQ2xhc3MoXCJhY3RpdmVcIik7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vIEhhbmRsZSBvcHRpb24gc2VsZWN0aW9uXHJcbiAgICAgICAgJChkb2N1bWVudCkub24oXCJjbGlja1wiLCBcIi5kcm9wZG93bi1vcHRpb25cIiwgZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgY29uc3QgJG9wdGlvbiA9ICQodGhpcyk7XHJcbiAgICAgICAgICAgIGNvbnN0ICRkcm9wZG93biA9ICRvcHRpb24uY2xvc2VzdChcIi5jdXN0b20tZHJvcGRvd25cIik7XHJcbiAgICAgICAgICAgIGNvbnN0ICRzZWxlY3RlZCA9ICRkcm9wZG93bi5maW5kKFwiLmRyb3Bkb3duLXNlbGVjdGVkXCIpO1xyXG4gICAgICAgICAgICBjb25zdCAkb3B0aW9ucyA9ICRkcm9wZG93bi5maW5kKFwiLmRyb3Bkb3duLW9wdGlvbnNcIik7XHJcbiAgICAgICAgICAgIGNvbnN0ICRzZWxlY3RlZFRleHQgPSAkc2VsZWN0ZWQuZmluZChcIi5zZWxlY3RlZC10ZXh0XCIpO1xyXG5cclxuICAgICAgICAgICAgLy8gR2V0IGRhdGEgZnJvbSBzZWxlY3RlZCBvcHRpb25cclxuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSAkb3B0aW9uLmRhdGEoXCJ2YWx1ZVwiKTtcclxuICAgICAgICAgICAgY29uc3QgbW9udGhzID0gJG9wdGlvbi5kYXRhKFwibW9udGhzXCIpO1xyXG4gICAgICAgICAgICBjb25zdCBwcmljZSA9ICRvcHRpb24uZGF0YShcInByaWNlXCIpO1xyXG4gICAgICAgICAgICAvLyBHZXQgdGV4dCBmcm9tIHRoZSBmaXJzdCBzcGFuIGVsZW1lbnQgdG8gYXZvaWQgZ2V0dGluZyBiYWRnZSB0ZXh0XHJcbiAgICAgICAgICAgIGNvbnN0IHRleHQgPSAkb3B0aW9uLmZpbmQoJ3NwYW4nKS5maXJzdCgpLnRleHQoKTtcclxuXHJcbiAgICAgICAgICAgIC8vIFVwZGF0ZSBzZWxlY3RlZCB0ZXh0XHJcbiAgICAgICAgICAgICRzZWxlY3RlZFRleHQudGV4dCh0ZXh0KTtcclxuXHJcbiAgICAgICAgICAgIC8vIFVwZGF0ZSBoaWRkZW4gaW5wdXRzXHJcbiAgICAgICAgICAgICRkcm9wZG93bi5jbG9zZXN0KFwiZm9ybVwiKS5maW5kKFwiLmhpZGRlbk1vbnRoc1wiKS52YWwobW9udGhzKTtcclxuICAgICAgICAgICAgJGRyb3Bkb3duLmNsb3Nlc3QoXCJmb3JtXCIpLmZpbmQoXCIuaGlkZGVuVG90YWxQcmljZVwiKS52YWwocHJpY2UpO1xyXG5cclxuICAgICAgICAgICAgLy8gVXBkYXRlIHNlbGVjdGVkIHN0YXRlXHJcbiAgICAgICAgICAgICRvcHRpb25zLmZpbmQoXCIuZHJvcGRvd24tb3B0aW9uXCIpLnJlbW92ZUNsYXNzKFwic2VsZWN0ZWRcIik7XHJcbiAgICAgICAgICAgICRvcHRpb24uYWRkQ2xhc3MoXCJzZWxlY3RlZFwiKTtcclxuXHJcbiAgICAgICAgICAgIC8vIENsb3NlIGRyb3Bkb3duXHJcbiAgICAgICAgICAgICRvcHRpb25zLnJlbW92ZUNsYXNzKFwic2hvd1wiKTtcclxuICAgICAgICAgICAgJHNlbGVjdGVkLnJlbW92ZUNsYXNzKFwiYWN0aXZlXCIpO1xyXG5cclxuICAgICAgICAgICAgLy8gVHJpZ2dlciBjdXN0b20gZXZlbnQgZm9yIG90aGVyIGNvbXBvbmVudHNcclxuICAgICAgICAgICAgJGRyb3Bkb3duLnRyaWdnZXIoXCJkcm9wZG93bjpjaGFuZ2VkXCIsIHtcclxuICAgICAgICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcclxuICAgICAgICAgICAgICAgIG1vbnRoczogbW9udGhzLFxyXG4gICAgICAgICAgICAgICAgcHJpY2U6IHByaWNlLFxyXG4gICAgICAgICAgICAgICAgdGV4dDogdGV4dCxcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAvLyBVcGRhdGUgcHJpY2UgZGlzcGxheSB1c2luZyBqUXVlcnlcclxuICAgICAgICAgICAgY29uc3QgJHByb2R1Y3RDb250YWluZXIgPSAkZHJvcGRvd24uY2xvc2VzdCgnW2RhdGEtcHJvZHVjdC1pZF0nKTtcclxuICAgICAgICAgICAgY29uc3QgYmFzZVByaWNlID0gcGFyc2VGbG9hdCgkcHJvZHVjdENvbnRhaW5lci5kYXRhKCdiYXNlLXByaWNlJykpO1xyXG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZE1vbnRocyA9IHBhcnNlSW50KG1vbnRocyk7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZygnVXBkYXRpbmcgcHJpY2UgZGlzcGxheTonLCB7XHJcbiAgICAgICAgICAgICAgICBiYXNlUHJpY2U6IGJhc2VQcmljZSxcclxuICAgICAgICAgICAgICAgIHNlbGVjdGVkTW9udGhzOiBzZWxlY3RlZE1vbnRocyxcclxuICAgICAgICAgICAgICAgIHByb2R1Y3RDb250YWluZXI6ICRwcm9kdWN0Q29udGFpbmVyLmxlbmd0aFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIC8vIENhbGN1bGF0ZSBwcmljZXNcclxuICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxQcmljZSA9IGJhc2VQcmljZSAqIHNlbGVjdGVkTW9udGhzO1xyXG4gICAgICAgICAgICBjb25zdCBzYXZpbmdzID0gc2VsZWN0ZWRNb250aHMgPj0gMTIgPyBNYXRoLnJvdW5kKG9yaWdpbmFsUHJpY2UgKiAwLjEpIDogMDtcclxuICAgICAgICAgICAgY29uc3QgZmluYWxQcmljZSA9IG9yaWdpbmFsUHJpY2UgLSBzYXZpbmdzO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgLy8gVXBkYXRlIGRpc3BsYXlcclxuICAgICAgICAgICAgJHByb2R1Y3RDb250YWluZXIuZmluZCgnLnRvdGFsLXByaWNlLWRpc3BsYXknKS50ZXh0KCfigqsnICsgZmluYWxQcmljZS50b0xvY2FsZVN0cmluZygpKTtcclxuICAgICAgICAgICAgJHByb2R1Y3RDb250YWluZXIuZmluZCgnLm1vbnRocy1kaXNwbGF5JykudGV4dChzZWxlY3RlZE1vbnRocyArICcgdGjDoW5nJyk7XHJcbiAgICAgICAgICAgICRwcm9kdWN0Q29udGFpbmVyLmZpbmQoJy5wcmljZS1wZXItbW9udGgnKS50ZXh0KCfigqsnICsgYmFzZVByaWNlLnRvTG9jYWxlU3RyaW5nKCkgKyAnL3Row6FuZycpO1xyXG4gICAgICAgICAgICAkcHJvZHVjdENvbnRhaW5lci5maW5kKCcub3JpZ2luYWwtcHJpY2UnKS50ZXh0KCfigqsnICsgb3JpZ2luYWxQcmljZS50b0xvY2FsZVN0cmluZygpKTtcclxuICAgICAgICAgICAgJHByb2R1Y3RDb250YWluZXIuZmluZCgnLnNhdmluZ3MtYW1vdW50JykudGV4dCgn4oKrJyArIHNhdmluZ3MudG9Mb2NhbGVTdHJpbmcoKSk7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAvLyBTaG93L2hpZGUgc2F2aW5ncyBpbmZvXHJcbiAgICAgICAgICAgIGlmIChzYXZpbmdzID4gMCkge1xyXG4gICAgICAgICAgICAgICAgJHByb2R1Y3RDb250YWluZXIuZmluZCgnLnNhdmluZ3MtaW5mbycpLnNob3coKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICRwcm9kdWN0Q29udGFpbmVyLmZpbmQoJy5zYXZpbmdzLWluZm8nKS5oaWRlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy8gQ2xvc2UgZHJvcGRvd24gd2hlbiBjbGlja2luZyBvdXRzaWRlXHJcbiAgICAgICAgJChkb2N1bWVudCkub24oXCJjbGlja1wiLCBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICBpZiAoISQoZS50YXJnZXQpLmNsb3Nlc3QoXCIuY3VzdG9tLWRyb3Bkb3duXCIpLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgJChcIi5kcm9wZG93bi1vcHRpb25zXCIpLnJlbW92ZUNsYXNzKFwic2hvd1wiKTtcclxuICAgICAgICAgICAgICAgICQoXCIuZHJvcGRvd24tc2VsZWN0ZWRcIikucmVtb3ZlQ2xhc3MoXCJhY3RpdmVcIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy8gQ2xvc2UgZHJvcGRvd24gb24gZXNjYXBlIGtleVxyXG4gICAgICAgICQoZG9jdW1lbnQpLm9uKFwia2V5ZG93blwiLCBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICBpZiAoZS5rZXkgPT09IFwiRXNjYXBlXCIpIHtcclxuICAgICAgICAgICAgICAgICQoXCIuZHJvcGRvd24tb3B0aW9uc1wiKS5yZW1vdmVDbGFzcyhcInNob3dcIik7XHJcbiAgICAgICAgICAgICAgICAkKFwiLmRyb3Bkb3duLXNlbGVjdGVkXCIpLnJlbW92ZUNsYXNzKFwiYWN0aXZlXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gSW5pdGlhbGl6ZSBvbiBwYWdlIGxvYWRcclxuICAgIGluaXRpYWxpemVEcm9wZG93bigpO1xyXG5cclxuICAgIC8vIE9wdGltaXplIGZvcm0gc3VibWlzc2lvbiB0byBwcmV2ZW50IGJsb2NraW5nXHJcbiAgICAkKGRvY3VtZW50KS5vbignc3VibWl0JywgJ2Zvcm1bYWN0aW9uKj1cInRoZW0tZ2lvLWhhbmdcIl0nLCBmdW5jdGlvbihlKSB7XHJcbiAgICAgICAgY29uc3QgJGZvcm0gPSAkKHRoaXMpO1xyXG4gICAgICAgIGNvbnN0ICRzdWJtaXRCdG4gPSAkZm9ybS5maW5kKCdidXR0b25bdHlwZT1cInN1Ym1pdFwiXScpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIERpc2FibGUgc3VibWl0IGJ1dHRvbiB0byBwcmV2ZW50IGRvdWJsZSBzdWJtaXNzaW9uXHJcbiAgICAgICAgJHN1Ym1pdEJ0bi5wcm9wKCdkaXNhYmxlZCcsIHRydWUpLnRleHQoJ8SQYW5nIHjhu60gbMO9Li4uJyk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gQWRkIGxvYWRpbmcgc3RhdGVcclxuICAgICAgICAkZm9ybS5hZGRDbGFzcygnc3VibWl0dGluZycpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIFJlLWVuYWJsZSBidXR0b24gYWZ0ZXIgNSBzZWNvbmRzIGFzIGZhbGxiYWNrXHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICRzdWJtaXRCdG4ucHJvcCgnZGlzYWJsZWQnLCBmYWxzZSkudGV4dCgnxJDEg25nIGvDvSBuZ2F5Jyk7XHJcbiAgICAgICAgICAgICRmb3JtLnJlbW92ZUNsYXNzKCdzdWJtaXR0aW5nJyk7XHJcbiAgICAgICAgfSwgNTAwMCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyBDYWNoZSB1dGlsaXR5IGZ1bmN0aW9ucyAtIFNpbmdsZSBKU09OIGFwcHJvYWNoXHJcbiAgICBjb25zdCBWTV9JTkZPX0NBQ0hFX0tFWSA9IFwidm1faW5mb19jYWNoZVwiO1xyXG5cclxuICAgIGZ1bmN0aW9uIHNhdmVWTUluZm9Ub0NhY2hlKHRlbXBsYXRlSWQsIGRhdGEsIHR0bCA9IDMwICogNjAgKiAxMDAwKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XHJcbiAgICAgICAgICAgIGxldCB2bUluZm9DYWNoZSA9IGdldFZNSW5mb0NhY2hlKCk7XHJcblxyXG4gICAgICAgICAgICBpZiAoIXZtSW5mb0NhY2hlKSB7XHJcbiAgICAgICAgICAgICAgICB2bUluZm9DYWNoZSA9IHtcclxuICAgICAgICAgICAgICAgICAgICBsYXN0VXBkYXRlZDogbm93LFxyXG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IHt9LFxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdm1JbmZvQ2FjaGUuZGF0YVt0ZW1wbGF0ZUlkXSA9IHtcclxuICAgICAgICAgICAgICAgIHZhbHVlOiBkYXRhLFxyXG4gICAgICAgICAgICAgICAgZXhwaXJ5OiBub3cgKyB0dGwsXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIHZtSW5mb0NhY2hlLmxhc3RVcGRhdGVkID0gbm93O1xyXG5cclxuICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXHJcbiAgICAgICAgICAgICAgICBWTV9JTkZPX0NBQ0hFX0tFWSxcclxuICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHZtSW5mb0NhY2hlKVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgY29uc29sZS53YXJuKFwiVk0gSW5mbyBjYWNoZSBzYXZlIGZhaWxlZDpcIiwgZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGdldFZNSW5mb0Zyb21DYWNoZSh0ZW1wbGF0ZUlkKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgY29uc3Qgdm1JbmZvQ2FjaGUgPSBnZXRWTUluZm9DYWNoZSgpO1xyXG4gICAgICAgICAgICBpZiAoIXZtSW5mb0NhY2hlIHx8ICF2bUluZm9DYWNoZS5kYXRhW3RlbXBsYXRlSWRdKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29uc3QgaXRlbSA9IHZtSW5mb0NhY2hlLmRhdGFbdGVtcGxhdGVJZF07XHJcbiAgICAgICAgICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xyXG5cclxuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgZXhwaXJlZFxyXG4gICAgICAgICAgICBpZiAobm93ID4gaXRlbS5leHBpcnkpIHtcclxuICAgICAgICAgICAgICAgIHJlbW92ZVZNSW5mb0Zyb21DYWNoZSh0ZW1wbGF0ZUlkKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gaXRlbS52YWx1ZTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihcIlZNIEluZm8gY2FjaGUgZ2V0IGZhaWxlZDpcIiwgZSk7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBnZXRWTUluZm9DYWNoZSgpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBjb25zdCBjYWNoZVN0ciA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFZNX0lORk9fQ0FDSEVfS0VZKTtcclxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlU3RyID8gSlNPTi5wYXJzZShjYWNoZVN0cikgOiBudWxsO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgY29uc29sZS53YXJuKFwiVk0gSW5mbyBjYWNoZSBwYXJzZSBmYWlsZWQ6XCIsIGUpO1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gcmVtb3ZlVk1JbmZvRnJvbUNhY2hlKHRlbXBsYXRlSWQpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBjb25zdCB2bUluZm9DYWNoZSA9IGdldFZNSW5mb0NhY2hlKCk7XHJcbiAgICAgICAgICAgIGlmICh2bUluZm9DYWNoZSAmJiB2bUluZm9DYWNoZS5kYXRhW3RlbXBsYXRlSWRdKSB7XHJcbiAgICAgICAgICAgICAgICBkZWxldGUgdm1JbmZvQ2FjaGUuZGF0YVt0ZW1wbGF0ZUlkXTtcclxuICAgICAgICAgICAgICAgIHZtSW5mb0NhY2hlLmxhc3RVcGRhdGVkID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XHJcbiAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcclxuICAgICAgICAgICAgICAgICAgICBWTV9JTkZPX0NBQ0hFX0tFWSxcclxuICAgICAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeSh2bUluZm9DYWNoZSlcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihcIlZNIEluZm8gY2FjaGUgcmVtb3ZlIGZhaWxlZDpcIiwgZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGNsZWFyRXhwaXJlZFZNSW5mb0NhY2hlKCkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHZtSW5mb0NhY2hlID0gZ2V0Vk1JbmZvQ2FjaGUoKTtcclxuICAgICAgICAgICAgaWYgKCF2bUluZm9DYWNoZSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcclxuICAgICAgICAgICAgbGV0IGhhc0V4cGlyZWQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKHZtSW5mb0NhY2hlLmRhdGEpLmZvckVhY2goKHRlbXBsYXRlSWQpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSB2bUluZm9DYWNoZS5kYXRhW3RlbXBsYXRlSWRdO1xyXG4gICAgICAgICAgICAgICAgaWYgKG5vdyA+IGl0ZW0uZXhwaXJ5KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHZtSW5mb0NhY2hlLmRhdGFbdGVtcGxhdGVJZF07XHJcbiAgICAgICAgICAgICAgICAgICAgaGFzRXhwaXJlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgaWYgKGhhc0V4cGlyZWQpIHtcclxuICAgICAgICAgICAgICAgIHZtSW5mb0NhY2hlLmxhc3RVcGRhdGVkID0gbm93O1xyXG4gICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXHJcbiAgICAgICAgICAgICAgICAgICAgVk1fSU5GT19DQUNIRV9LRVksXHJcbiAgICAgICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkodm1JbmZvQ2FjaGUpXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oXCJWTSBJbmZvIGNhY2hlIGNsZWFudXAgZmFpbGVkOlwiLCBlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUmUtaW5pdGlhbGl6ZSBpZiBjb250ZW50IGlzIGR5bmFtaWNhbGx5IGxvYWRlZFxyXG4gICAgJChkb2N1bWVudCkub24oXCJET01Db250ZW50TG9hZGVkXCIsIGluaXRpYWxpemVEcm9wZG93bik7XHJcblxyXG4gICAgLy8gTG9hZCBWTSBpbmZvcm1hdGlvbiBmb3IgZWFjaCBwcm9kdWN0IHdpdGggY2FjaGluZyAoT1MsIENQVSwgUkFNLCBEaXNrKSAtIE5PTi1CTE9DS0lOR1xyXG4gICAgZnVuY3Rpb24gbG9hZEd1ZXN0T1NJbmZvKCkge1xyXG4gICAgICAgIC8vIEdldCB1bmlxdWUgdGVtcGxhdGUgSURzIHRvIGF2b2lkIGR1cGxpY2F0ZSBBUEkgY2FsbHNcclxuICAgICAgICBjb25zdCB0ZW1wbGF0ZUlkcyA9IFtdO1xyXG4gICAgICAgICQoXCIuZ3Vlc3Qtb3NcIikuZWFjaChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHRlbXBsYXRlSWQgPSAkKHRoaXMpLmRhdGEoXCJ0ZW1wbGF0ZS1pZFwiKTtcclxuICAgICAgICAgICAgaWYgKHRlbXBsYXRlSWQgJiYgIXRlbXBsYXRlSWRzLmluY2x1ZGVzKHRlbXBsYXRlSWQpKSB7XHJcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZUlkcy5wdXNoKHRlbXBsYXRlSWQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vIExvYWQgVk0gaW5mbyBpbiBiYWNrZ3JvdW5kIHdpdGhvdXQgYmxvY2tpbmcgZm9ybSBzdWJtaXNzaW9uXHJcbiAgICAgICAgdGVtcGxhdGVJZHMuZm9yRWFjaCgodGVtcGxhdGVJZCkgPT4ge1xyXG4gICAgICAgICAgICAvLyBDaGVjayBjYWNoZSBmaXJzdFxyXG4gICAgICAgICAgICBjb25zdCBjYWNoZWREYXRhID0gZ2V0Vk1JbmZvRnJvbUNhY2hlKHRlbXBsYXRlSWQpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGNhY2hlZERhdGEpIHtcclxuICAgICAgICAgICAgICAgIC8vIFVzZSBjYWNoZWQgZGF0YVxyXG4gICAgICAgICAgICAgICAgdXBkYXRlVk1JbmZvVUkodGVtcGxhdGVJZCwgY2FjaGVkRGF0YSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIEFkZCBsb2FkaW5nIGluZGljYXRvcnNcclxuICAgICAgICAgICAgYWRkTG9hZGluZ0luZGljYXRvcnModGVtcGxhdGVJZCk7XHJcblxyXG4gICAgICAgICAgICAvLyBDYWxsIEFQSSB0byBnZXQgY29tcGxldGUgVk0gaW5mbyAtIHdpdGggc2hvcnRlciB0aW1lb3V0XHJcbiAgICAgICAgICAgICQuYWpheCh7XHJcbiAgICAgICAgICAgICAgICB1cmw6IGAvYXBpL3YxL2dldC12bS1pbmZvLyR7dGVtcGxhdGVJZH0vZ3Vlc3Rfb3MsY3B1X2NvdW50LG1lbW9yeV9zaXplLGRpc2tfY2FwYWNpdHlgLFxyXG4gICAgICAgICAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxyXG4gICAgICAgICAgICAgICAgdGltZW91dDogNTAwMCwgLy8gUmVkdWNlZCB0aW1lb3V0IHRvIDUgc2Vjb25kc1xyXG4gICAgICAgICAgICAgICAgaGVhZGVyczoge1xyXG4gICAgICAgICAgICAgICAgICAgIFwiWC1DU1JGLVRPS0VOXCI6ICQoJ21ldGFbbmFtZT1cImNzcmYtdG9rZW5cIl0nKS5hdHRyKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcImNvbnRlbnRcIlxyXG4gICAgICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICAgICAgQWNjZXB0OiBcImFwcGxpY2F0aW9uL2pzb25cIixcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbiAocmVzcG9uc2UpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UuZXJyb3IgPT09IGZhbHNlICYmIHJlc3BvbnNlLmRhdGEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm1EYXRhID0gcmVzcG9uc2UuZGF0YTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJvY2Vzc2VkRGF0YSA9IHByb2Nlc3NWTURhdGEodm1EYXRhKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENhY2hlIHRoZSByZXN1bHQgZm9yIDMwIG1pbnV0ZXNcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZVZNSW5mb1RvQ2FjaGUodGVtcGxhdGVJZCwgcHJvY2Vzc2VkRGF0YSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgVUlcclxuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlVk1JbmZvVUkodGVtcGxhdGVJZCwgcHJvY2Vzc2VkRGF0YSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0RmFsbGJhY2tWYWx1ZXModGVtcGxhdGVJZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGVycm9yOiBmdW5jdGlvbiAoeGhyLCBzdGF0dXMsIGVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcIkZhaWxlZCB0byBsb2FkIFZNIGluZm8gZm9yIHRlbXBsYXRlOlwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZUlkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvclxyXG4gICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgc2V0RmFsbGJhY2tWYWx1ZXModGVtcGxhdGVJZCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIExvYWQgVk0gaW5mbyBhZnRlciBhIHNob3J0IGRlbGF5IHRvIG5vdCBibG9jayBwYWdlIGxvYWRcclxuICAgIHNldFRpbWVvdXQobG9hZEd1ZXN0T1NJbmZvLCAxMDAwKTtcclxuXHJcbiAgICAvLyBQcm9jZXNzIFZNIGRhdGEgZnJvbSBBUEkgcmVzcG9uc2VcclxuICAgIGZ1bmN0aW9uIHByb2Nlc3NWTURhdGEodm1EYXRhKSB7XHJcbiAgICAgICAgY29uc3QgZ3Vlc3RPUyA9IHZtRGF0YS5ndWVzdF9vcyB8fCBcIlVOS05PV05cIjtcclxuICAgICAgICBjb25zdCBjcHVDb3VudCA9IHZtRGF0YS5jcHVfY291bnQgfHwgMDtcclxuICAgICAgICBjb25zdCBtZW1vcnlNQiA9IHZtRGF0YS5tZW1vcnlfc2l6ZSB8fCAwO1xyXG4gICAgICAgIGNvbnN0IGRpc2tCeXRlcyA9IHZtRGF0YS5kaXNrX2NhcGFjaXR5IHx8IDA7XHJcblxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGd1ZXN0T1M6IGd1ZXN0T1MsXHJcbiAgICAgICAgICAgIGZvcm1hdHRlZE9TOiBmb3JtYXRPU05hbWUoZ3Vlc3RPUyksXHJcbiAgICAgICAgICAgIGNwdTogY3B1Q291bnQsXHJcbiAgICAgICAgICAgIGZvcm1hdHRlZENQVTogYCR7Y3B1Q291bnR9IHZDb3JlJHtjcHVDb3VudCA+IDEgPyBcInNcIiA6IFwiXCJ9YCxcclxuICAgICAgICAgICAgcmFtOiBNYXRoLnJvdW5kKChtZW1vcnlNQiAvIDEwMjQpICogMTAwKSAvIDEwMCwgLy8gQ29udmVydCBNQiB0byBHQiwgMiBkZWNpbWFsIHBsYWNlc1xyXG4gICAgICAgICAgICBmb3JtYXR0ZWRSQU06IGAke01hdGgucm91bmQoKG1lbW9yeU1CIC8gMTAyNCkgKiAxMDApIC8gMTAwfSBHQmAsXHJcbiAgICAgICAgICAgIGRpc2s6IE1hdGgucm91bmQoKGRpc2tCeXRlcyAvICgxMDI0ICogMTAyNCAqIDEwMjQpKSAqIDEwMCkgLyAxMDAsIC8vIENvbnZlcnQgYnl0ZXMgdG8gR0JcclxuICAgICAgICAgICAgZm9ybWF0dGVkRGlzazogYCR7XHJcbiAgICAgICAgICAgICAgICBNYXRoLnJvdW5kKChkaXNrQnl0ZXMgLyAoMTAyNCAqIDEwMjQgKiAxMDI0KSkgKiAxMDApIC8gMTAwXHJcbiAgICAgICAgICAgIH0gR0JgLFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQWRkIGxvYWRpbmcgaW5kaWNhdG9ycyB0byBhbGwgVk0gaW5mbyBlbGVtZW50c1xyXG4gICAgZnVuY3Rpb24gYWRkTG9hZGluZ0luZGljYXRvcnModGVtcGxhdGVJZCkge1xyXG4gICAgICAgIGNvbnN0IGxvYWRpbmdJY29uID1cclxuICAgICAgICAgICAgJzxpIGNsYXNzPVwiZmFzIGZhLXNwaW5uZXIgZmEtc3BpbiB0ZXh0LW9yYW5nZS01MDAgbXItMVwiPjwvaT7EkGFuZyB04bqjaS4uLic7XHJcbiAgICAgICAgJChgLmd1ZXN0LW9zW2RhdGEtdGVtcGxhdGUtaWQ9XCIke3RlbXBsYXRlSWR9XCJdYCkuaHRtbChsb2FkaW5nSWNvbik7XHJcbiAgICAgICAgJChgLnZtLWNwdVtkYXRhLXRlbXBsYXRlLWlkPVwiJHt0ZW1wbGF0ZUlkfVwiXWApLmh0bWwobG9hZGluZ0ljb24pO1xyXG4gICAgICAgICQoYC52bS1yYW1bZGF0YS10ZW1wbGF0ZS1pZD1cIiR7dGVtcGxhdGVJZH1cIl1gKS5odG1sKGxvYWRpbmdJY29uKTtcclxuICAgICAgICAkKGAudm0tZGlza1tkYXRhLXRlbXBsYXRlLWlkPVwiJHt0ZW1wbGF0ZUlkfVwiXWApLmh0bWwobG9hZGluZ0ljb24pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFVwZGF0ZSBhbGwgVk0gaW5mbyBVSSBlbGVtZW50c1xyXG4gICAgZnVuY3Rpb24gdXBkYXRlVk1JbmZvVUkodGVtcGxhdGVJZCwgZGF0YSkge1xyXG4gICAgICAgIC8vIFVwZGF0ZSBPU1xyXG4gICAgICAgICQoYC5ndWVzdC1vc1tkYXRhLXRlbXBsYXRlLWlkPVwiJHt0ZW1wbGF0ZUlkfVwiXWApLmh0bWwoZGF0YS5mb3JtYXR0ZWRPUyk7XHJcbiAgICAgICAgdXBkYXRlT1NJY29uKHRlbXBsYXRlSWQsIGRhdGEuZ3Vlc3RPUyk7XHJcblxyXG4gICAgICAgIC8vIFVwZGF0ZSBoYXJkd2FyZSBzcGVjc1xyXG4gICAgICAgICQoYC52bS1jcHVbZGF0YS10ZW1wbGF0ZS1pZD1cIiR7dGVtcGxhdGVJZH1cIl1gKS5odG1sKGRhdGEuZm9ybWF0dGVkQ1BVKTtcclxuICAgICAgICAkKGAudm0tcmFtW2RhdGEtdGVtcGxhdGUtaWQ9XCIke3RlbXBsYXRlSWR9XCJdYCkuaHRtbChkYXRhLmZvcm1hdHRlZFJBTSk7XHJcbiAgICAgICAgJChgLnZtLWRpc2tbZGF0YS10ZW1wbGF0ZS1pZD1cIiR7dGVtcGxhdGVJZH1cIl1gKS5odG1sKFxyXG4gICAgICAgICAgICBkYXRhLmZvcm1hdHRlZERpc2tcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFNldCBmYWxsYmFjayB2YWx1ZXMgd2hlbiBBUEkgZmFpbHNcclxuICAgIGZ1bmN0aW9uIHNldEZhbGxiYWNrVmFsdWVzKHRlbXBsYXRlSWQpIHtcclxuICAgICAgICAkKGAuZ3Vlc3Qtb3NbZGF0YS10ZW1wbGF0ZS1pZD1cIiR7dGVtcGxhdGVJZH1cIl1gKS5odG1sKFwiTGludXhcIik7XHJcbiAgICAgICAgJChgLnZtLWNwdVtkYXRhLXRlbXBsYXRlLWlkPVwiJHt0ZW1wbGF0ZUlkfVwiXWApLmh0bWwoXCJOL0FcIik7XHJcbiAgICAgICAgJChgLnZtLXJhbVtkYXRhLXRlbXBsYXRlLWlkPVwiJHt0ZW1wbGF0ZUlkfVwiXWApLmh0bWwoXCJOL0FcIik7XHJcbiAgICAgICAgJChgLnZtLWRpc2tbZGF0YS10ZW1wbGF0ZS1pZD1cIiR7dGVtcGxhdGVJZH1cIl1gKS5odG1sKFwiTi9BXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFVwZGF0ZSBPUyBpY29uIGJhc2VkIG9uIGRldGVjdGVkIE9TXHJcbiAgICBmdW5jdGlvbiB1cGRhdGVPU0ljb24odGVtcGxhdGVJZCwgb3NOYW1lKSB7XHJcbiAgICAgICAgY29uc3QgJGljb25FbGVtZW50ID0gJChgLm9zLWljb25bZGF0YS10ZW1wbGF0ZS1pZD1cIiR7dGVtcGxhdGVJZH1cIl1gKTtcclxuXHJcbiAgICAgICAgaWYgKG9zTmFtZSAmJiBvc05hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhcIndpbmRvd3NcIikpIHtcclxuICAgICAgICAgICAgJGljb25FbGVtZW50LnJlbW92ZUNsYXNzKFwiZmFiIGZhLWxpbnV4XCIpLmFkZENsYXNzKFwiZmFiIGZhLXdpbmRvd3NcIik7XHJcbiAgICAgICAgfSBlbHNlIGlmIChvc05hbWUgJiYgb3NOYW1lLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoXCJ1YnVudHVcIikpIHtcclxuICAgICAgICAgICAgJGljb25FbGVtZW50LnJlbW92ZUNsYXNzKFwiZmFiIGZhLWxpbnV4XCIpLmFkZENsYXNzKFwiZmFiIGZhLXVidW50dVwiKTtcclxuICAgICAgICB9IGVsc2UgaWYgKG9zTmFtZSAmJiBvc05hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhcImNlbnRvc1wiKSkge1xyXG4gICAgICAgICAgICAkaWNvbkVsZW1lbnQucmVtb3ZlQ2xhc3MoXCJmYWIgZmEtbGludXhcIikuYWRkQ2xhc3MoXCJmYWIgZmEtY2VudG9zXCIpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAob3NOYW1lICYmIG9zTmFtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKFwiZGViaWFuXCIpKSB7XHJcbiAgICAgICAgICAgICRpY29uRWxlbWVudC5yZW1vdmVDbGFzcyhcImZhYiBmYS1saW51eFwiKS5hZGRDbGFzcyhcImZhYiBmYS1kZWJpYW5cIik7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gS2VlcCBsaW51eCBpY29uIGFzIGRlZmF1bHRcclxuICAgICAgICAgICAgJGljb25FbGVtZW50LnJlbW92ZUNsYXNzKCkuYWRkQ2xhc3MoXCJmYWIgZmEtbGludXggdGV4dC1vcmFuZ2UtNjAwXCIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBGb3JtYXQgT1MgbmFtZSBmb3IgYmV0dGVyIGRpc3BsYXlcclxuICAgIGZ1bmN0aW9uIGZvcm1hdE9TTmFtZShvc05hbWUpIHtcclxuICAgICAgICBjb25zdCBvc01hcCA9IHtcclxuICAgICAgICAgICAgVUJVTlRVXzY0OiBcIlVidW50dSA2NC1iaXRcIixcclxuICAgICAgICAgICAgQ0VOVE9TXzY0OiBcIkNlbnRPUyA2NC1iaXRcIixcclxuICAgICAgICAgICAgQ0VOVE9TXzdfNjQ6IFwiQ2VudE9TIDcgNjQtYml0XCIsXHJcbiAgICAgICAgICAgIENFTlRPU184XzY0OiBcIkNlbnRPUyA4IDY0LWJpdFwiLFxyXG4gICAgICAgICAgICBST0NLWV9MSU5VWF82NDogXCJSb2NreSBMaW51eCA2NC1iaXRcIixcclxuICAgICAgICAgICAgV0lORE9XU18xMF82NDogXCJXaW5kb3dzIDEwIDY0LWJpdFwiLFxyXG4gICAgICAgICAgICBXSU5ET1dTXzlfU0VSVkVSXzY0OiBcIldpbmRvd3MgU2VydmVyIDIwMTlcIixcclxuICAgICAgICAgICAgV0lORE9XU19TRVJWRVJfMjAxOTogXCJXaW5kb3dzIFNlcnZlciAyMDE5XCIsXHJcbiAgICAgICAgICAgIFdJTkRPV1NfU0VSVkVSXzIwMjI6IFwiV2luZG93cyBTZXJ2ZXIgMjAyMlwiLFxyXG4gICAgICAgICAgICBXSU5ET1dTXzIwMTk6IFwiV2luZG93cyBTZXJ2ZXIgMjAxOVwiLFxyXG4gICAgICAgICAgICBXSU5ET1dTXzIwMjI6IFwiV2luZG93cyBTZXJ2ZXIgMjAyMlwiLFxyXG4gICAgICAgICAgICBERUJJQU5fMTBfNjQ6IFwiRGViaWFuIDEwIDY0LWJpdFwiLFxyXG4gICAgICAgICAgICBERUJJQU5fMTFfNjQ6IFwiRGViaWFuIDExIDY0LWJpdFwiLFxyXG4gICAgICAgICAgICBPVEhFUl9MSU5VWF82NDogXCJMaW51eCA2NC1iaXRcIixcclxuICAgICAgICAgICAgT1RIRVJfNjQ6IFwiT3RoZXIgNjQtYml0XCIsXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgcmV0dXJuIG9zTWFwW29zTmFtZV0gfHwgb3NOYW1lIHx8IFwiTGludXhcIjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBDbGVhbiB1cCBleHBpcmVkIGNhY2hlIGVudHJpZXNcclxuICAgIGNsZWFyRXhwaXJlZFZNSW5mb0NhY2hlKCk7XHJcblxyXG4gICAgLy8gTG9hZCBHdWVzdCBPUyBpbmZvIHdoZW4gcGFnZSBsb2Fkc1xyXG4gICAgbG9hZEd1ZXN0T1NJbmZvKCk7XHJcblxyXG4gICAgLy8gRGVidWc6IFNob3cgd2hhdCBkYXRhIHdlIGhhdmVcclxuICAgIGNvbnNvbGUubG9nKFxyXG4gICAgICAgIFwiVGVtcGxhdGUgSURzIGF2YWlsYWJsZTpcIixcclxuICAgICAgICAkKFwiLmd1ZXN0LW9zXCIpXHJcbiAgICAgICAgICAgIC5tYXAoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZUlkOiAkKHRoaXMpLmRhdGEoXCJ0ZW1wbGF0ZS1pZFwiKSxcclxuICAgICAgICAgICAgICAgICAgICBoYXNUZW1wbGF0ZUlkOiBCb29sZWFuKCQodGhpcykuZGF0YShcInRlbXBsYXRlLWlkXCIpKSxcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIC5nZXQoKVxyXG4gICAgKTtcclxuXHJcbiAgICAvLyBFeHBvc2UgY2FjaGUgbWFuYWdlbWVudCB0byBnbG9iYWwgc2NvcGUgZm9yIGRlYnVnZ2luZ1xyXG4gICAgd2luZG93LnZtSW5mb0NhY2hlID0ge1xyXG4gICAgICAgIGNsZWFyOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKFZNX0lORk9fQ0FDSEVfS0VZKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJWTSBJbmZvIGNhY2hlIGNsZWFyZWRcIik7XHJcbiAgICAgICAgfSxcclxuICAgICAgICByZWZyZXNoOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2xlYXIoKTtcclxuICAgICAgICAgICAgbG9hZEd1ZXN0T1NJbmZvKCk7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiVk0gSW5mbyBjYWNoZSByZWZyZXNoZWRcIik7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBpbmZvOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHZtSW5mb0NhY2hlID0gZ2V0Vk1JbmZvQ2FjaGUoKTtcclxuICAgICAgICAgICAgaWYgKCF2bUluZm9DYWNoZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJObyBWTSBJbmZvIGNhY2hlIGZvdW5kXCIpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjb25zdCB0ZW1wbGF0ZUlkcyA9IE9iamVjdC5rZXlzKHZtSW5mb0NhY2hlLmRhdGEpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgVk0gSW5mbyBjYWNoZSBlbnRyaWVzOiAke3RlbXBsYXRlSWRzLmxlbmd0aH1gKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXHJcbiAgICAgICAgICAgICAgICBgTGFzdCB1cGRhdGVkOiAke25ldyBEYXRlKFxyXG4gICAgICAgICAgICAgICAgICAgIHZtSW5mb0NhY2hlLmxhc3RVcGRhdGVkXHJcbiAgICAgICAgICAgICAgICApLnRvTG9jYWxlU3RyaW5nKCl9YFxyXG4gICAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgICAgdGVtcGxhdGVJZHMuZm9yRWFjaCgodGVtcGxhdGVJZCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IGdldFZNSW5mb0Zyb21DYWNoZSh0ZW1wbGF0ZUlkKTtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFxyXG4gICAgICAgICAgICAgICAgICAgIGAke3RlbXBsYXRlSWR9OiAke2RhdGEgPyBkYXRhLmZvcm1hdHRlZE9TIDogXCJleHBpcmVkXCJ9YFxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICh0ZW1wbGF0ZUlkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBnZXRWTUluZm9Gcm9tQ2FjaGUodGVtcGxhdGVJZCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICByZW1vdmU6IGZ1bmN0aW9uICh0ZW1wbGF0ZUlkKSB7XHJcbiAgICAgICAgICAgIHJlbW92ZVZNSW5mb0Zyb21DYWNoZSh0ZW1wbGF0ZUlkKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coYFJlbW92ZWQgJHt0ZW1wbGF0ZUlkfSBmcm9tIGNhY2hlYCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICByYXc6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGdldFZNSW5mb0NhY2hlKCk7XHJcbiAgICAgICAgfSxcclxuICAgIH07XHJcbn0pO1xyXG4iXSwibWFwcGluZ3MiOiJBQUFBQSxDQUFDLENBQUNDLFFBQVEsQ0FBQyxDQUFDQyxLQUFLLENBQUMsWUFBWTtFQUMxQjtFQUNBLFNBQVNDLGtCQUFrQkEsQ0FBQSxFQUFHO0lBQzFCO0lBQ0FILENBQUMsQ0FBQ0MsUUFBUSxDQUFDLENBQUNHLEVBQUUsQ0FBQyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsVUFBVUMsQ0FBQyxFQUFFO01BQ3ZEQSxDQUFDLENBQUNDLGVBQWUsQ0FBQyxDQUFDO01BQ25CLElBQU1DLFNBQVMsR0FBR1AsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDUSxPQUFPLENBQUMsa0JBQWtCLENBQUM7TUFDckQsSUFBTUMsUUFBUSxHQUFHRixTQUFTLENBQUNHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQztNQUNwRCxJQUFNQyxTQUFTLEdBQUdYLENBQUMsQ0FBQyxJQUFJLENBQUM7O01BRXpCO01BQ0FBLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUNoQlksR0FBRyxDQUFDTCxTQUFTLENBQUMsQ0FDZEcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQ3pCRyxXQUFXLENBQUMsTUFBTSxDQUFDO01BQ3hCYixDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FDaEJZLEdBQUcsQ0FBQ0wsU0FBUyxDQUFDLENBQ2RHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUMxQkcsV0FBVyxDQUFDLFFBQVEsQ0FBQzs7TUFFMUI7TUFDQUosUUFBUSxDQUFDSyxXQUFXLENBQUMsTUFBTSxDQUFDO01BQzVCSCxTQUFTLENBQUNHLFdBQVcsQ0FBQyxRQUFRLENBQUM7SUFDbkMsQ0FBQyxDQUFDOztJQUVGO0lBQ0FkLENBQUMsQ0FBQ0MsUUFBUSxDQUFDLENBQUNHLEVBQUUsQ0FBQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsVUFBVUMsQ0FBQyxFQUFFO01BQ3JEQSxDQUFDLENBQUND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\n//# sourceURL=webpack-internal:///./resources/js/service/vminfo.js\n"); +eval("$(document).ready(function () {\n // Initialize dropdown functionality\n function initializeDropdown() {\n // Toggle dropdown on click\n $(document).on(\"click\", \".dropdown-selected\", function (e) {\n e.stopPropagation();\n var $dropdown = $(this).closest(\".custom-dropdown\");\n var $options = $dropdown.find(\".dropdown-options\");\n var $selected = $(this);\n\n // Close other dropdowns\n $(\".custom-dropdown\").not($dropdown).find(\".dropdown-options\").removeClass(\"show\");\n $(\".custom-dropdown\").not($dropdown).find(\".dropdown-selected\").removeClass(\"active\");\n\n // Toggle current dropdown\n $options.toggleClass(\"show\");\n $selected.toggleClass(\"active\");\n });\n\n // Handle option selection\n $(document).on(\"click\", \".dropdown-option\", function (e) {\n e.stopPropagation();\n var $option = $(this);\n var $dropdown = $option.closest(\".custom-dropdown\");\n var $selected = $dropdown.find(\".dropdown-selected\");\n var $options = $dropdown.find(\".dropdown-options\");\n var $selectedText = $selected.find(\".selected-text\");\n\n // Get data from selected option\n var value = $option.data(\"value\");\n var months = $option.data(\"months\");\n var price = $option.data(\"price\");\n // Get text from the first span element to avoid getting badge text\n var text = $option.find('span').first().text();\n\n // Update selected text\n $selectedText.text(text);\n\n // Update hidden inputs\n $dropdown.closest(\"form\").find(\".hiddenMonths\").val(months);\n $dropdown.closest(\"form\").find(\".hiddenTotalPrice\").val(price);\n\n // Update selected state\n $options.find(\".dropdown-option\").removeClass(\"selected\");\n $option.addClass(\"selected\");\n\n // Close dropdown\n $options.removeClass(\"show\");\n $selected.removeClass(\"active\");\n\n // Trigger custom event for other components\n $dropdown.trigger(\"dropdown:changed\", {\n value: value,\n months: months,\n price: price,\n text: text\n });\n\n // Update price display using jQuery\n var $productContainer = $dropdown.closest('[data-product-id]');\n var basePrice = parseFloat($productContainer.data('base-price'));\n var selectedMonths = parseInt(months);\n\n // Calculate prices\n var originalPrice = basePrice * selectedMonths;\n var savings = selectedMonths >= 12 ? Math.round(originalPrice * 0.1) : 0;\n var finalPrice = originalPrice - savings;\n\n // Update display\n $productContainer.find('.total-price-display').text('₫' + finalPrice.toLocaleString());\n $productContainer.find('.months-display').text(selectedMonths + ' tháng');\n $productContainer.find('.price-per-month').text('₫' + basePrice.toLocaleString() + '/tháng');\n $productContainer.find('.original-price').text('₫' + originalPrice.toLocaleString());\n $productContainer.find('.savings-amount').text('₫' + savings.toLocaleString());\n\n // Show/hide savings info\n if (savings > 0) {\n $productContainer.find('.savings-info').show();\n } else {\n $productContainer.find('.savings-info').hide();\n }\n });\n\n // Close dropdown when clicking outside\n $(document).on(\"click\", function (e) {\n if (!$(e.target).closest(\".custom-dropdown\").length) {\n $(\".dropdown-options\").removeClass(\"show\");\n $(\".dropdown-selected\").removeClass(\"active\");\n }\n });\n\n // Close dropdown on escape key\n $(document).on(\"keydown\", function (e) {\n if (e.key === \"Escape\") {\n $(\".dropdown-options\").removeClass(\"show\");\n $(\".dropdown-selected\").removeClass(\"active\");\n }\n });\n }\n\n // Initialize on page load\n initializeDropdown();\n\n // Optimize form submission to prevent blocking\n $(document).on('submit', 'form[action*=\"them-gio-hang\"]', function (e) {\n var $form = $(this);\n var $submitBtn = $form.find('button[type=\"submit\"]');\n\n // Disable submit button to prevent double submission\n $submitBtn.prop('disabled', true).text('Đang xử lý...');\n\n // Add loading state\n $form.addClass('submitting');\n\n // Re-enable button after 5 seconds as fallback\n setTimeout(function () {\n $submitBtn.prop('disabled', false).text('Đăng ký ngay');\n $form.removeClass('submitting');\n }, 5000);\n });\n\n // Cache utility functions - Single JSON approach\n var VM_INFO_CACHE_KEY = \"vm_info_cache\";\n function saveVMInfoToCache(templateId, data) {\n var ttl = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 30 * 60 * 1000;\n try {\n var now = new Date().getTime();\n var vmInfoCache = getVMInfoCache();\n if (!vmInfoCache) {\n vmInfoCache = {\n lastUpdated: now,\n data: {}\n };\n }\n vmInfoCache.data[templateId] = {\n value: data,\n expiry: now + ttl\n };\n vmInfoCache.lastUpdated = now;\n localStorage.setItem(VM_INFO_CACHE_KEY, JSON.stringify(vmInfoCache));\n } catch (e) {\n console.warn(\"VM Info cache save failed:\", e);\n }\n }\n function getVMInfoFromCache(templateId) {\n try {\n var vmInfoCache = getVMInfoCache();\n if (!vmInfoCache || !vmInfoCache.data[templateId]) {\n return null;\n }\n var item = vmInfoCache.data[templateId];\n var now = new Date().getTime();\n\n // Check if expired\n if (now > item.expiry) {\n removeVMInfoFromCache(templateId);\n return null;\n }\n return item.value;\n } catch (e) {\n console.warn(\"VM Info cache get failed:\", e);\n return null;\n }\n }\n function getVMInfoCache() {\n try {\n var cacheStr = localStorage.getItem(VM_INFO_CACHE_KEY);\n return cacheStr ? JSON.parse(cacheStr) : null;\n } catch (e) {\n console.warn(\"VM Info cache parse failed:\", e);\n return null;\n }\n }\n function removeVMInfoFromCache(templateId) {\n try {\n var vmInfoCache = getVMInfoCache();\n if (vmInfoCache && vmInfoCache.data[templateId]) {\n delete vmInfoCache.data[templateId];\n vmInfoCache.lastUpdated = new Date().getTime();\n localStorage.setItem(VM_INFO_CACHE_KEY, JSON.stringify(vmInfoCache));\n }\n } catch (e) {\n console.warn(\"VM Info cache remove failed:\", e);\n }\n }\n function clearExpiredVMInfoCache() {\n try {\n var vmInfoCache = getVMInfoCache();\n if (!vmInfoCache) {\n return;\n }\n var now = new Date().getTime();\n var hasExpired = false;\n Object.keys(vmInfoCache.data).forEach(function (templateId) {\n var item = vmInfoCache.data[templateId];\n if (now > item.expiry) {\n delete vmInfoCache.data[templateId];\n hasExpired = true;\n }\n });\n if (hasExpired) {\n vmInfoCache.lastUpdated = now;\n localStorage.setItem(VM_INFO_CACHE_KEY, JSON.stringify(vmInfoCache));\n }\n } catch (e) {\n console.warn(\"VM Info cache cleanup failed:\", e);\n }\n }\n\n // Re-initialize if content is dynamically loaded\n $(document).on(\"DOMContentLoaded\", initializeDropdown);\n\n // Load VM information for each product with caching (OS, CPU, RAM, Disk) - NON-BLOCKING\n function loadGuestOSInfo() {\n // Get unique template IDs to avoid duplicate API calls\n var templateIds = [];\n $(\".guest-os\").each(function () {\n var templateId = $(this).data(\"template-id\");\n if (templateId && !templateIds.includes(templateId)) {\n templateIds.push(templateId);\n }\n });\n\n // Load VM info in background without blocking form submission\n templateIds.forEach(function (templateId) {\n // Check cache first\n var cachedData = getVMInfoFromCache(templateId);\n if (cachedData) {\n // Use cached data\n updateVMInfoUI(templateId, cachedData);\n return;\n }\n\n // Add loading indicators\n addLoadingIndicators(templateId);\n\n // Call API to get complete VM info - with shorter timeout\n $.ajax({\n url: \"/api/v1/get-vm-info/\".concat(templateId, \"/guest_os,cpu_count,memory_size,disk_capacity\"),\n method: \"GET\",\n timeout: 5000,\n // Reduced timeout to 5 seconds\n headers: {\n \"X-CSRF-TOKEN\": $('meta[name=\"csrf-token\"]').attr(\"content\"),\n Accept: \"application/json\"\n },\n success: function success(response) {\n if (response.error === false && response.data) {\n var vmData = response.data;\n var processedData = processVMData(vmData);\n\n // Cache the result for 30 minutes\n saveVMInfoToCache(templateId, processedData);\n\n // Update UI\n updateVMInfoUI(templateId, processedData);\n } else {\n setFallbackValues(templateId);\n }\n },\n error: function error(xhr, status, _error) {\n console.warn(\"Failed to load VM info for template:\", templateId, _error);\n setFallbackValues(templateId);\n }\n });\n });\n }\n\n // Load VM info after a short delay to not block page load\n setTimeout(loadGuestOSInfo, 1000);\n\n // Process VM data from API response\n function processVMData(vmData) {\n var guestOS = vmData.guest_os || \"UNKNOWN\";\n var cpuCount = vmData.cpu_count || 0;\n var memoryMB = vmData.memory_size || 0;\n var diskBytes = vmData.disk_capacity || 0;\n return {\n guestOS: guestOS,\n formattedOS: formatOSName(guestOS),\n cpu: cpuCount,\n formattedCPU: \"\".concat(cpuCount, \" vCore\").concat(cpuCount > 1 ? \"s\" : \"\"),\n ram: Math.round(memoryMB / 1024 * 100) / 100,\n // Convert MB to GB, 2 decimal places\n formattedRAM: \"\".concat(Math.round(memoryMB / 1024 * 100) / 100, \" GB\"),\n disk: Math.round(diskBytes / (1024 * 1024 * 1024) * 100) / 100,\n // Convert bytes to GB\n formattedDisk: \"\".concat(Math.round(diskBytes / (1024 * 1024 * 1024) * 100) / 100, \" GB\")\n };\n }\n\n // Add loading indicators to all VM info elements\n function addLoadingIndicators(templateId) {\n var loadingIcon = 'Đang tải...';\n $(\".guest-os[data-template-id=\\\"\".concat(templateId, \"\\\"]\")).html(loadingIcon);\n $(\".vm-cpu[data-template-id=\\\"\".concat(templateId, \"\\\"]\")).html(loadingIcon);\n $(\".vm-ram[data-template-id=\\\"\".concat(templateId, \"\\\"]\")).html(loadingIcon);\n $(\".vm-disk[data-template-id=\\\"\".concat(templateId, \"\\\"]\")).html(loadingIcon);\n }\n\n // Update all VM info UI elements\n function updateVMInfoUI(templateId, data) {\n // Update OS\n $(\".guest-os[data-template-id=\\\"\".concat(templateId, \"\\\"]\")).html(data.formattedOS);\n updateOSIcon(templateId, data.guestOS);\n\n // Update hardware specs\n $(\".vm-cpu[data-template-id=\\\"\".concat(templateId, \"\\\"]\")).html(data.formattedCPU);\n $(\".vm-ram[data-template-id=\\\"\".concat(templateId, \"\\\"]\")).html(data.formattedRAM);\n $(\".vm-disk[data-template-id=\\\"\".concat(templateId, \"\\\"]\")).html(data.formattedDisk);\n }\n\n // Set fallback values when API fails\n function setFallbackValues(templateId) {\n $(\".guest-os[data-template-id=\\\"\".concat(templateId, \"\\\"]\")).html(\"Linux\");\n $(\".vm-cpu[data-template-id=\\\"\".concat(templateId, \"\\\"]\")).html(\"N/A\");\n $(\".vm-ram[data-template-id=\\\"\".concat(templateId, \"\\\"]\")).html(\"N/A\");\n $(\".vm-disk[data-template-id=\\\"\".concat(templateId, \"\\\"]\")).html(\"N/A\");\n }\n\n // Update OS icon based on detected OS\n function updateOSIcon(templateId, osName) {\n var $iconElement = $(\".os-icon[data-template-id=\\\"\".concat(templateId, \"\\\"]\"));\n if (osName && osName.toLowerCase().includes(\"windows\")) {\n $iconElement.removeClass(\"fab fa-linux\").addClass(\"fab fa-windows\");\n } else if (osName && osName.toLowerCase().includes(\"ubuntu\")) {\n $iconElement.removeClass(\"fab fa-linux\").addClass(\"fab fa-ubuntu\");\n } else if (osName && osName.toLowerCase().includes(\"centos\")) {\n $iconElement.removeClass(\"fab fa-linux\").addClass(\"fab fa-centos\");\n } else if (osName && osName.toLowerCase().includes(\"debian\")) {\n $iconElement.removeClass(\"fab fa-linux\").addClass(\"fab fa-debian\");\n } else {\n // Keep linux icon as default\n $iconElement.removeClass().addClass(\"fab fa-linux text-orange-600\");\n }\n }\n\n // Format OS name for better display\n function formatOSName(osName) {\n var osMap = {\n UBUNTU_64: \"Ubuntu 64-bit\",\n CENTOS_64: \"CentOS 64-bit\",\n CENTOS_7_64: \"CentOS 7 64-bit\",\n CENTOS_8_64: \"CentOS 8 64-bit\",\n ROCKY_LINUX_64: \"Rocky Linux 64-bit\",\n WINDOWS_10_64: \"Windows 10 64-bit\",\n WINDOWS_9_SERVER_64: \"Windows Server 2019\",\n WINDOWS_SERVER_2019: \"Windows Server 2019\",\n WINDOWS_SERVER_2022: \"Windows Server 2022\",\n WINDOWS_2019: \"Windows Server 2019\",\n WINDOWS_2022: \"Windows Server 2022\",\n DEBIAN_10_64: \"Debian 10 64-bit\",\n DEBIAN_11_64: \"Debian 11 64-bit\",\n OTHER_LINUX_64: \"Linux 64-bit\",\n OTHER_64: \"Other 64-bit\"\n };\n return osMap[osName] || osName || \"Linux\";\n }\n\n // Clean up expired cache entries\n clearExpiredVMInfoCache();\n\n // Load Guest OS info when page loads\n loadGuestOSInfo();\n\n // Expose cache management to global scope for debugging\n window.vmInfoCache = {\n clear: function clear() {\n localStorage.removeItem(VM_INFO_CACHE_KEY);\n },\n refresh: function refresh() {\n this.clear();\n loadGuestOSInfo();\n },\n info: function info() {\n var vmInfoCache = getVMInfoCache();\n if (!vmInfoCache) {\n return;\n }\n var templateIds = Object.keys(vmInfoCache.data);\n templateIds.forEach(function (templateId) {\n var data = getVMInfoFromCache(templateId);\n });\n },\n get: function get(templateId) {\n return getVMInfoFromCache(templateId);\n },\n remove: function remove(templateId) {\n removeVMInfoFromCache(templateId);\n },\n raw: function raw() {\n return getVMInfoCache();\n }\n };\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvc2VydmljZS92bWluZm8uanMiLCJuYW1lcyI6WyIkIiwiZG9jdW1lbnQiLCJyZWFkeSIsImluaXRpYWxpemVEcm9wZG93biIsIm9uIiwiZSIsInN0b3BQcm9wYWdhdGlvbiIsIiRkcm9wZG93biIsImNsb3Nlc3QiLCIkb3B0aW9ucyIsImZpbmQiLCIkc2VsZWN0ZWQiLCJub3QiLCJyZW1vdmVDbGFzcyIsInRvZ2dsZUNsYXNzIiwiJG9wdGlvbiIsIiRzZWxlY3RlZFRleHQiLCJ2YWx1ZSIsImRhdGEiLCJtb250aHMiLCJwcmljZSIsInRleHQiLCJmaXJzdCIsInZhbCIsImFkZENsYXNzIiwidHJpZ2dlciIsIiRwcm9kdWN0Q29udGFpbmVyIiwiYmFzZVByaWNlIiwicGFyc2VGbG9hdCIsInNlbGVjdGVkTW9udGhzIiwicGFyc2VJbnQiLCJvcmlnaW5hbFByaWNlIiwic2F2aW5ncyIsIk1hdGgiLCJyb3VuZCIsImZpbmFsUHJpY2UiLCJ0b0xvY2FsZVN0cmluZyIsInNob3ciLCJoaWRlIiwidGFyZ2V0IiwibGVuZ3RoIiwia2V5IiwiJGZvcm0iLCIkc3VibWl0QnRuIiwicHJvcCIsInNldFRpbWVvdXQiLCJWTV9JTkZPX0NBQ0hFX0tFWSIsInNhdmVWTUluZm9Ub0NhY2hlIiwidGVtcGxhdGVJZCIsInR0bCIsImFyZ3VtZW50cyIsInVuZGVmaW5lZCIsIm5vdyIsIkRhdGUiLCJnZXRUaW1lIiwidm1JbmZvQ2FjaGUiLCJnZXRWTUluZm9DYWNoZSIsImxhc3RVcGRhdGVkIiwiZXhwaXJ5IiwibG9jYWxTdG9yYWdlIiwic2V0SXRlbSIsIkpTT04iLCJzdHJpbmdpZnkiLCJjb25zb2xlIiwid2FybiIsImdldFZNSW5mb0Zyb21DYWNoZSIsIml0ZW0iLCJyZW1vdmVWTUluZm9Gcm9tQ2FjaGUiLCJjYWNoZVN0ciIsImdldEl0ZW0iLCJwYXJzZSIsImNsZWFyRXhwaXJlZFZNSW5mb0NhY2hlIiwiaGFzRXhwaXJlZCIsIk9iamVjdCIsImtleXMiLCJmb3JFYWNoIiwibG9hZEd1ZXN0T1NJbmZvIiwidGVtcGxhdGVJZHMiLCJlYWNoIiwiaW5jbHVkZXMiLCJwdXNoIiwiY2FjaGVkRGF0YSIsInVwZGF0ZVZNSW5mb1VJIiwiYWRkTG9hZGluZ0luZGljYXRvcnMiLCJhamF4IiwidXJsIiwiY29uY2F0IiwibWV0aG9kIiwidGltZW91dCIsImhlYWRlcnMiLCJhdHRyIiwiQWNjZXB0Iiwic3VjY2VzcyIsInJlc3BvbnNlIiwiZXJyb3IiLCJ2bURhdGEiLCJwcm9jZXNzZWREYXRhIiwicHJvY2Vzc1ZNRGF0YSIsInNldEZhbGxiYWNrVmFsdWVzIiwieGhyIiwic3RhdHVzIiwiZ3Vlc3RPUyIsImd1ZXN0X29zIiwiY3B1Q291bnQiLCJjcHVfY291bnQiLCJtZW1vcnlNQiIsIm1lbW9yeV9zaXplIiwiZGlza0J5dGVzIiwiZGlza19jYXBhY2l0eSIsImZvcm1hdHRlZE9TIiwiZm9ybWF0T1NOYW1lIiwiY3B1IiwiZm9ybWF0dGVkQ1BVIiwicmFtIiwiZm9ybWF0dGVkUkFNIiwiZGlzayIsImZvcm1hdHRlZERpc2siLCJsb2FkaW5nSWNvbiIsImh0bWwiLCJ1cGRhdGVPU0ljb24iLCJvc05hbWUiLCIkaWNvbkVsZW1lbnQiLCJ0b0xvd2VyQ2FzZSIsIm9zTWFwIiwiVUJVTlRVXzY0IiwiQ0VOVE9TXzY0IiwiQ0VOVE9TXzdfNjQiLCJDRU5UT1NfOF82NCIsIlJPQ0tZX0xJTlVYXzY0IiwiV0lORE9XU18xMF82NCIsIldJTkRPV1NfOV9TRVJWRVJfNjQiLCJXSU5ET1dTX1NFUlZFUl8yMDE5IiwiV0lORE9XU19TRVJWRVJfMjAyMiIsIldJTkRPV1NfMjAxOSIsIldJTkRPV1NfMjAyMiIsIkRFQklBTl8xMF82NCIsIkRFQklBTl8xMV82NCIsIk9USEVSX0xJTlVYXzY0IiwiT1RIRVJfNjQiLCJ3aW5kb3ciLCJjbGVhciIsInJlbW92ZUl0ZW0iLCJyZWZyZXNoIiwiaW5mbyIsImdldCIsInJlbW92ZSIsInJhdyJdLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vcmVzb3VyY2VzL2pzL3NlcnZpY2Uvdm1pbmZvLmpzP2M3ZTMiXSwic291cmNlc0NvbnRlbnQiOlsiJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24gKCkge1xyXG4gICAgLy8gSW5pdGlhbGl6ZSBkcm9wZG93biBmdW5jdGlvbmFsaXR5XHJcbiAgICBmdW5jdGlvbiBpbml0aWFsaXplRHJvcGRvd24oKSB7XHJcbiAgICAgICAgLy8gVG9nZ2xlIGRyb3Bkb3duIG9uIGNsaWNrXHJcbiAgICAgICAgJChkb2N1bWVudCkub24oXCJjbGlja1wiLCBcIi5kcm9wZG93bi1zZWxlY3RlZFwiLCBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICBjb25zdCAkZHJvcGRvd24gPSAkKHRoaXMpLmNsb3Nlc3QoXCIuY3VzdG9tLWRyb3Bkb3duXCIpO1xyXG4gICAgICAgICAgICBjb25zdCAkb3B0aW9ucyA9ICRkcm9wZG93bi5maW5kKFwiLmRyb3Bkb3duLW9wdGlvbnNcIik7XHJcbiAgICAgICAgICAgIGNvbnN0ICRzZWxlY3RlZCA9ICQodGhpcyk7XHJcblxyXG4gICAgICAgICAgICAvLyBDbG9zZSBvdGhlciBkcm9wZG93bnNcclxuICAgICAgICAgICAgJChcIi5jdXN0b20tZHJvcGRvd25cIilcclxuICAgICAgICAgICAgICAgIC5ub3QoJGRyb3Bkb3duKVxyXG4gICAgICAgICAgICAgICAgLmZpbmQoXCIuZHJvcGRvd24tb3B0aW9uc1wiKVxyXG4gICAgICAgICAgICAgICAgLnJlbW92ZUNsYXNzKFwic2hvd1wiKTtcclxuICAgICAgICAgICAgJChcIi5jdXN0b20tZHJvcGRvd25cIilcclxuICAgICAgICAgICAgICAgIC5ub3QoJGRyb3Bkb3duKVxyXG4gICAgICAgICAgICAgICAgLmZpbmQoXCIuZHJvcGRvd24tc2VsZWN0ZWRcIilcclxuICAgICAgICAgICAgICAgIC5yZW1vdmVDbGFzcyhcImFjdGl2ZVwiKTtcclxuXHJcbiAgICAgICAgICAgIC8vIFRvZ2dsZSBjdXJyZW50IGRyb3Bkb3duXHJcbiAgICAgICAgICAgICRvcHRpb25zLnRvZ2dsZUNsYXNzKFwic2hvd1wiKTtcclxuICAgICAgICAgICAgJHNlbGVjdGVkLnRvZ2dsZUNsYXNzKFwiYWN0aXZlXCIpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyBIYW5kbGUgb3B0aW9uIHNlbGVjdGlvblxyXG4gICAgICAgICQoZG9jdW1lbnQpLm9uKFwiY2xpY2tcIiwgXCIuZHJvcGRvd24tb3B0aW9uXCIsIGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgIGNvbnN0ICRvcHRpb24gPSAkKHRoaXMpO1xyXG4gICAgICAgICAgICBjb25zdCAkZHJvcGRvd24gPSAkb3B0aW9uLmNsb3Nlc3QoXCIuY3VzdG9tLWRyb3Bkb3duXCIpO1xyXG4gICAgICAgICAgICBjb25zdCAkc2VsZWN0ZWQgPSAkZHJvcGRvd24uZmluZChcIi5kcm9wZG93bi1zZWxlY3RlZFwiKTtcclxuICAgICAgICAgICAgY29uc3QgJG9wdGlvbnMgPSAkZHJvcGRvd24uZmluZChcIi5kcm9wZG93bi1vcHRpb25zXCIpO1xyXG4gICAgICAgICAgICBjb25zdCAkc2VsZWN0ZWRUZXh0ID0gJHNlbGVjdGVkLmZpbmQoXCIuc2VsZWN0ZWQtdGV4dFwiKTtcclxuXHJcbiAgICAgICAgICAgIC8vIEdldCBkYXRhIGZyb20gc2VsZWN0ZWQgb3B0aW9uXHJcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gJG9wdGlvbi5kYXRhKFwidmFsdWVcIik7XHJcbiAgICAgICAgICAgIGNvbnN0IG1vbnRocyA9ICRvcHRpb24uZGF0YShcIm1vbnRoc1wiKTtcclxuICAgICAgICAgICAgY29uc3QgcHJpY2UgPSAkb3B0aW9uLmRhdGEoXCJwcmljZVwiKTtcclxuICAgICAgICAgICAgLy8gR2V0IHRleHQgZnJvbSB0aGUgZmlyc3Qgc3BhbiBlbGVtZW50IHRvIGF2b2lkIGdldHRpbmcgYmFkZ2UgdGV4dFxyXG4gICAgICAgICAgICBjb25zdCB0ZXh0ID0gJG9wdGlvbi5maW5kKCdzcGFuJykuZmlyc3QoKS50ZXh0KCk7XHJcblxyXG4gICAgICAgICAgICAvLyBVcGRhdGUgc2VsZWN0ZWQgdGV4dFxyXG4gICAgICAgICAgICAkc2VsZWN0ZWRUZXh0LnRleHQodGV4dCk7XHJcblxyXG4gICAgICAgICAgICAvLyBVcGRhdGUgaGlkZGVuIGlucHV0c1xyXG4gICAgICAgICAgICAkZHJvcGRvd24uY2xvc2VzdChcImZvcm1cIikuZmluZChcIi5oaWRkZW5Nb250aHNcIikudmFsKG1vbnRocyk7XHJcbiAgICAgICAgICAgICRkcm9wZG93bi5jbG9zZXN0KFwiZm9ybVwiKS5maW5kKFwiLmhpZGRlblRvdGFsUHJpY2VcIikudmFsKHByaWNlKTtcclxuXHJcbiAgICAgICAgICAgIC8vIFVwZGF0ZSBzZWxlY3RlZCBzdGF0ZVxyXG4gICAgICAgICAgICAkb3B0aW9ucy5maW5kKFwiLmRyb3Bkb3duLW9wdGlvblwiKS5yZW1vdmVDbGFzcyhcInNlbGVjdGVkXCIpO1xyXG4gICAgICAgICAgICAkb3B0aW9uLmFkZENsYXNzKFwic2VsZWN0ZWRcIik7XHJcblxyXG4gICAgICAgICAgICAvLyBDbG9zZSBkcm9wZG93blxyXG4gICAgICAgICAgICAkb3B0aW9ucy5yZW1vdmVDbGFzcyhcInNob3dcIik7XHJcbiAgICAgICAgICAgICRzZWxlY3RlZC5yZW1vdmVDbGFzcyhcImFjdGl2ZVwiKTtcclxuXHJcbiAgICAgICAgICAgIC8vIFRyaWdnZXIgY3VzdG9tIGV2ZW50IGZvciBvdGhlciBjb21wb25lbnRzXHJcbiAgICAgICAgICAgICRkcm9wZG93bi50cmlnZ2VyKFwiZHJvcGRvd246Y2hhbmdlZFwiLCB7XHJcbiAgICAgICAgICAgICAgICB2YWx1ZTogdmFsdWUsXHJcbiAgICAgICAgICAgICAgICBtb250aHM6IG1vbnRocyxcclxuICAgICAgICAgICAgICAgIHByaWNlOiBwcmljZSxcclxuICAgICAgICAgICAgICAgIHRleHQ6IHRleHQsXHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgLy8gVXBkYXRlIHByaWNlIGRpc3BsYXkgdXNpbmcgalF1ZXJ5XHJcbiAgICAgICAgICAgIGNvbnN0ICRwcm9kdWN0Q29udGFpbmVyID0gJGRyb3Bkb3duLmNsb3Nlc3QoJ1tkYXRhLXByb2R1Y3QtaWRdJyk7XHJcbiAgICAgICAgICAgIGNvbnN0IGJhc2VQcmljZSA9IHBhcnNlRmxvYXQoJHByb2R1Y3RDb250YWluZXIuZGF0YSgnYmFzZS1wcmljZScpKTtcclxuICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRNb250aHMgPSBwYXJzZUludChtb250aHMpO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIHByaWNlc1xyXG4gICAgICAgICAgICBjb25zdCBvcmlnaW5hbFByaWNlID0gYmFzZVByaWNlICogc2VsZWN0ZWRNb250aHM7XHJcbiAgICAgICAgICAgIGNvbnN0IHNhdmluZ3MgPSBzZWxlY3RlZE1vbnRocyA+PSAxMiA/IE1hdGgucm91bmQob3JpZ2luYWxQcmljZSAqIDAuMSkgOiAwO1xyXG4gICAgICAgICAgICBjb25zdCBmaW5hbFByaWNlID0gb3JpZ2luYWxQcmljZSAtIHNhdmluZ3M7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAvLyBVcGRhdGUgZGlzcGxheVxyXG4gICAgICAgICAgICAkcHJvZHVjdENvbnRhaW5lci5maW5kKCcudG90YWwtcHJpY2UtZGlzcGxheScpLnRleHQoJ+KCqycgKyBmaW5hbFByaWNlLnRvTG9jYWxlU3RyaW5nKCkpO1xyXG4gICAgICAgICAgICAkcHJvZHVjdENvbnRhaW5lci5maW5kKCcubW9udGhzLWRpc3BsYXknKS50ZXh0KHNlbGVjdGVkTW9udGhzICsgJyB0aMOhbmcnKTtcclxuICAgICAgICAgICAgJHByb2R1Y3RDb250YWluZXIuZmluZCgnLnByaWNlLXBlci1tb250aCcpLnRleHQoJ+KCqycgKyBiYXNlUHJpY2UudG9Mb2NhbGVTdHJpbmcoKSArICcvdGjDoW5nJyk7XHJcbiAgICAgICAgICAgICRwcm9kdWN0Q29udGFpbmVyLmZpbmQoJy5vcmlnaW5hbC1wcmljZScpLnRleHQoJ+KCqycgKyBvcmlnaW5hbFByaWNlLnRvTG9jYWxlU3RyaW5nKCkpO1xyXG4gICAgICAgICAgICAkcHJvZHVjdENvbnRhaW5lci5maW5kKCcuc2F2aW5ncy1hbW91bnQnKS50ZXh0KCfigqsnICsgc2F2aW5ncy50b0xvY2FsZVN0cmluZygpKTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIC8vIFNob3cvaGlkZSBzYXZpbmdzIGluZm9cclxuICAgICAgICAgICAgaWYgKHNhdmluZ3MgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAkcHJvZHVjdENvbnRhaW5lci5maW5kKCcuc2F2aW5ncy1pbmZvJykuc2hvdygpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgJHByb2R1Y3RDb250YWluZXIuZmluZCgnLnNhdmluZ3MtaW5mbycpLmhpZGUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyBDbG9zZSBkcm9wZG93biB3aGVuIGNsaWNraW5nIG91dHNpZGVcclxuICAgICAgICAkKGRvY3VtZW50KS5vbihcImNsaWNrXCIsIGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgIGlmICghJChlLnRhcmdldCkuY2xvc2VzdChcIi5jdXN0b20tZHJvcGRvd25cIikubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAkKFwiLmRyb3Bkb3duLW9wdGlvbnNcIikucmVtb3ZlQ2xhc3MoXCJzaG93XCIpO1xyXG4gICAgICAgICAgICAgICAgJChcIi5kcm9wZG93bi1zZWxlY3RlZFwiKS5yZW1vdmVDbGFzcyhcImFjdGl2ZVwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyBDbG9zZSBkcm9wZG93biBvbiBlc2NhcGUga2V5XHJcbiAgICAgICAgJChkb2N1bWVudCkub24oXCJrZXlkb3duXCIsIGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgIGlmIChlLmtleSA9PT0gXCJFc2NhcGVcIikge1xyXG4gICAgICAgICAgICAgICAgJChcIi5kcm9wZG93bi1vcHRpb25zXCIpLnJlbW92ZUNsYXNzKFwic2hvd1wiKTtcclxuICAgICAgICAgICAgICAgICQoXCIuZHJvcGRvd24tc2VsZWN0ZWRcIikucmVtb3ZlQ2xhc3MoXCJhY3RpdmVcIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBJbml0aWFsaXplIG9uIHBhZ2UgbG9hZFxyXG4gICAgaW5pdGlhbGl6ZURyb3Bkb3duKCk7XHJcblxyXG4gICAgLy8gT3B0aW1pemUgZm9ybSBzdWJtaXNzaW9uIHRvIHByZXZlbnQgYmxvY2tpbmdcclxuICAgICQoZG9jdW1lbnQpLm9uKCdzdWJtaXQnLCAnZm9ybVthY3Rpb24qPVwidGhlbS1naW8taGFuZ1wiXScsIGZ1bmN0aW9uKGUpIHtcclxuICAgICAgICBjb25zdCAkZm9ybSA9ICQodGhpcyk7XHJcbiAgICAgICAgY29uc3QgJHN1Ym1pdEJ0biA9ICRmb3JtLmZpbmQoJ2J1dHRvblt0eXBlPVwic3VibWl0XCJdJyk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gRGlzYWJsZSBzdWJtaXQgYnV0dG9uIHRvIHByZXZlbnQgZG91YmxlIHN1Ym1pc3Npb25cclxuICAgICAgICAkc3VibWl0QnRuLnByb3AoJ2Rpc2FibGVkJywgdHJ1ZSkudGV4dCgnxJBhbmcgeOG7rSBsw70uLi4nKTtcclxuICAgICAgICBcclxuICAgICAgICAvLyBBZGQgbG9hZGluZyBzdGF0ZVxyXG4gICAgICAgICRmb3JtLmFkZENsYXNzKCdzdWJtaXR0aW5nJyk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gUmUtZW5hYmxlIGJ1dHRvbiBhZnRlciA1IHNlY29uZHMgYXMgZmFsbGJhY2tcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgJHN1Ym1pdEJ0bi5wcm9wKCdkaXNhYmxlZCcsIGZhbHNlKS50ZXh0KCfEkMSDbmcga8O9IG5nYXknKTtcclxuICAgICAgICAgICAgJGZvcm0ucmVtb3ZlQ2xhc3MoJ3N1Ym1pdHRpbmcnKTtcclxuICAgICAgICB9LCA1MDAwKTtcclxuICAgIH0pO1xyXG5cclxuICAgIC8vIENhY2hlIHV0aWxpdHkgZnVuY3Rpb25zIC0gU2luZ2xlIEpTT04gYXBwcm9hY2hcclxuICAgIGNvbnN0IFZNX0lORk9fQ0FDSEVfS0VZID0gXCJ2bV9pbmZvX2NhY2hlXCI7XHJcblxyXG4gICAgZnVuY3Rpb24gc2F2ZVZNSW5mb1RvQ2FjaGUodGVtcGxhdGVJZCwgZGF0YSwgdHRsID0gMzAgKiA2MCAqIDEwMDApIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcclxuICAgICAgICAgICAgbGV0IHZtSW5mb0NhY2hlID0gZ2V0Vk1JbmZvQ2FjaGUoKTtcclxuXHJcbiAgICAgICAgICAgIGlmICghdm1JbmZvQ2FjaGUpIHtcclxuICAgICAgICAgICAgICAgIHZtSW5mb0NhY2hlID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIGxhc3RVcGRhdGVkOiBub3csXHJcbiAgICAgICAgICAgICAgICAgICAgZGF0YToge30sXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB2bUluZm9DYWNoZS5kYXRhW3RlbXBsYXRlSWRdID0ge1xyXG4gICAgICAgICAgICAgICAgdmFsdWU6IGRhdGEsXHJcbiAgICAgICAgICAgICAgICBleHBpcnk6IG5vdyArIHR0bCxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgdm1JbmZvQ2FjaGUubGFzdFVwZGF0ZWQgPSBub3c7XHJcblxyXG4gICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcclxuICAgICAgICAgICAgICAgIFZNX0lORk9fQ0FDSEVfS0VZLFxyXG4gICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkodm1JbmZvQ2FjaGUpXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oXCJWTSBJbmZvIGNhY2hlIHNhdmUgZmFpbGVkOlwiLCBlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gZ2V0Vk1JbmZvRnJvbUNhY2hlKHRlbXBsYXRlSWQpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBjb25zdCB2bUluZm9DYWNoZSA9IGdldFZNSW5mb0NhY2hlKCk7XHJcbiAgICAgICAgICAgIGlmICghdm1JbmZvQ2FjaGUgfHwgIXZtSW5mb0NhY2hlLmRhdGFbdGVtcGxhdGVJZF0pIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjb25zdCBpdGVtID0gdm1JbmZvQ2FjaGUuZGF0YVt0ZW1wbGF0ZUlkXTtcclxuICAgICAgICAgICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XHJcblxyXG4gICAgICAgICAgICAvLyBDaGVjayBpZiBleHBpcmVkXHJcbiAgICAgICAgICAgIGlmIChub3cgPiBpdGVtLmV4cGlyeSkge1xyXG4gICAgICAgICAgICAgICAgcmVtb3ZlVk1JbmZvRnJvbUNhY2hlKHRlbXBsYXRlSWQpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiBpdGVtLnZhbHVlO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgY29uc29sZS53YXJuKFwiVk0gSW5mbyBjYWNoZSBnZXQgZmFpbGVkOlwiLCBlKTtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGdldFZNSW5mb0NhY2hlKCkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNhY2hlU3RyID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oVk1fSU5GT19DQUNIRV9LRVkpO1xyXG4gICAgICAgICAgICByZXR1cm4gY2FjaGVTdHIgPyBKU09OLnBhcnNlKGNhY2hlU3RyKSA6IG51bGw7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oXCJWTSBJbmZvIGNhY2hlIHBhcnNlIGZhaWxlZDpcIiwgZSk7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiByZW1vdmVWTUluZm9Gcm9tQ2FjaGUodGVtcGxhdGVJZCkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHZtSW5mb0NhY2hlID0gZ2V0Vk1JbmZvQ2FjaGUoKTtcclxuICAgICAgICAgICAgaWYgKHZtSW5mb0NhY2hlICYmIHZtSW5mb0NhY2hlLmRhdGFbdGVtcGxhdGVJZF0pIHtcclxuICAgICAgICAgICAgICAgIGRlbGV0ZSB2bUluZm9DYWNoZS5kYXRhW3RlbXBsYXRlSWRdO1xyXG4gICAgICAgICAgICAgICAgdm1JbmZvQ2FjaGUubGFzdFVwZGF0ZWQgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcclxuICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFxyXG4gICAgICAgICAgICAgICAgICAgIFZNX0lORk9fQ0FDSEVfS0VZLFxyXG4gICAgICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHZtSW5mb0NhY2hlKVxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgY29uc29sZS53YXJuKFwiVk0gSW5mbyBjYWNoZSByZW1vdmUgZmFpbGVkOlwiLCBlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gY2xlYXJFeHBpcmVkVk1JbmZvQ2FjaGUoKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgY29uc3Qgdm1JbmZvQ2FjaGUgPSBnZXRWTUluZm9DYWNoZSgpO1xyXG4gICAgICAgICAgICBpZiAoIXZtSW5mb0NhY2hlKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xyXG4gICAgICAgICAgICBsZXQgaGFzRXhwaXJlZCA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgT2JqZWN0LmtleXModm1JbmZvQ2FjaGUuZGF0YSkuZm9yRWFjaCgodGVtcGxhdGVJZCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaXRlbSA9IHZtSW5mb0NhY2hlLmRhdGFbdGVtcGxhdGVJZF07XHJcbiAgICAgICAgICAgICAgICBpZiAobm93ID4gaXRlbS5leHBpcnkpIHtcclxuICAgICAgICAgICAgICAgICAgICBkZWxldGUgdm1JbmZvQ2FjaGUuZGF0YVt0ZW1wbGF0ZUlkXTtcclxuICAgICAgICAgICAgICAgICAgICBoYXNFeHBpcmVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICBpZiAoaGFzRXhwaXJlZCkge1xyXG4gICAgICAgICAgICAgICAgdm1JbmZvQ2FjaGUubGFzdFVwZGF0ZWQgPSBub3c7XHJcbiAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcclxuICAgICAgICAgICAgICAgICAgICBWTV9JTkZPX0NBQ0hFX0tFWSxcclxuICAgICAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeSh2bUluZm9DYWNoZSlcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihcIlZNIEluZm8gY2FjaGUgY2xlYW51cCBmYWlsZWQ6XCIsIGUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBSZS1pbml0aWFsaXplIGlmIGNvbnRlbnQgaXMgZHluYW1pY2FsbHkgbG9hZGVkXHJcbiAgICAkKGRvY3VtZW50KS5vbihcIkRPTUNvbnRlbnRMb2FkZWRcIiwgaW5pdGlhbGl6ZURyb3Bkb3duKTtcclxuXHJcbiAgICAvLyBMb2FkIFZNIGluZm9ybWF0aW9uIGZvciBlYWNoIHByb2R1Y3Qgd2l0aCBjYWNoaW5nIChPUywgQ1BVLCBSQU0sIERpc2spIC0gTk9OLUJMT0NLSU5HXHJcbiAgICBmdW5jdGlvbiBsb2FkR3Vlc3RPU0luZm8oKSB7XHJcbiAgICAgICAgLy8gR2V0IHVuaXF1ZSB0ZW1wbGF0ZSBJRHMgdG8gYXZvaWQgZHVwbGljYXRlIEFQSSBjYWxsc1xyXG4gICAgICAgIGNvbnN0IHRlbXBsYXRlSWRzID0gW107XHJcbiAgICAgICAgJChcIi5ndWVzdC1vc1wiKS5lYWNoKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgY29uc3QgdGVtcGxhdGVJZCA9ICQodGhpcykuZGF0YShcInRlbXBsYXRlLWlkXCIpO1xyXG4gICAgICAgICAgICBpZiAodGVtcGxhdGVJZCAmJiAhdGVtcGxhdGVJZHMuaW5jbHVkZXModGVtcGxhdGVJZCkpIHtcclxuICAgICAgICAgICAgICAgIHRlbXBsYXRlSWRzLnB1c2godGVtcGxhdGVJZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy8gTG9hZCBWTSBpbmZvIGluIGJhY2tncm91bmQgd2l0aG91dCBibG9ja2luZyBmb3JtIHN1Ym1pc3Npb25cclxuICAgICAgICB0ZW1wbGF0ZUlkcy5mb3JFYWNoKCh0ZW1wbGF0ZUlkKSA9PiB7XHJcbiAgICAgICAgICAgIC8vIENoZWNrIGNhY2hlIGZpcnN0XHJcbiAgICAgICAgICAgIGNvbnN0IGNhY2hlZERhdGEgPSBnZXRWTUluZm9Gcm9tQ2FjaGUodGVtcGxhdGVJZCk7XHJcblxyXG4gICAgICAgICAgICBpZiAoY2FjaGVkRGF0YSkge1xyXG4gICAgICAgICAgICAgICAgLy8gVXNlIGNhY2hlZCBkYXRhXHJcbiAgICAgICAgICAgICAgICB1cGRhdGVWTUluZm9VSSh0ZW1wbGF0ZUlkLCBjYWNoZWREYXRhKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gQWRkIGxvYWRpbmcgaW5kaWNhdG9yc1xyXG4gICAgICAgICAgICBhZGRMb2FkaW5nSW5kaWNhdG9ycyh0ZW1wbGF0ZUlkKTtcclxuXHJcbiAgICAgICAgICAgIC8vIENhbGwgQVBJIHRvIGdldCBjb21wbGV0ZSBWTSBpbmZvIC0gd2l0aCBzaG9ydGVyIHRpbWVvdXRcclxuICAgICAgICAgICAgJC5hamF4KHtcclxuICAgICAgICAgICAgICAgIHVybDogYC9hcGkvdjEvZ2V0LXZtLWluZm8vJHt0ZW1wbGF0ZUlkfS9ndWVzdF9vcyxjcHVfY291bnQsbWVtb3J5X3NpemUsZGlza19jYXBhY2l0eWAsXHJcbiAgICAgICAgICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXHJcbiAgICAgICAgICAgICAgICB0aW1lb3V0OiA1MDAwLCAvLyBSZWR1Y2VkIHRpbWVvdXQgdG8gNSBzZWNvbmRzXHJcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgXCJYLUNTUkYtVE9LRU5cIjogJCgnbWV0YVtuYW1lPVwiY3NyZi10b2tlblwiXScpLmF0dHIoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiY29udGVudFwiXHJcbiAgICAgICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICAgICAgICBBY2NlcHQ6IFwiYXBwbGljYXRpb24vanNvblwiLFxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uIChyZXNwb25zZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5lcnJvciA9PT0gZmFsc2UgJiYgcmVzcG9uc2UuZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2bURhdGEgPSByZXNwb25zZS5kYXRhO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwcm9jZXNzZWREYXRhID0gcHJvY2Vzc1ZNRGF0YSh2bURhdGEpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2FjaGUgdGhlIHJlc3VsdCBmb3IgMzAgbWludXRlc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzYXZlVk1JbmZvVG9DYWNoZSh0ZW1wbGF0ZUlkLCBwcm9jZXNzZWREYXRhKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBVSVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVWTUluZm9VSSh0ZW1wbGF0ZUlkLCBwcm9jZXNzZWREYXRhKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRGYWxsYmFja1ZhbHVlcyh0ZW1wbGF0ZUlkKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgZXJyb3I6IGZ1bmN0aW9uICh4aHIsIHN0YXR1cywgZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiRmFpbGVkIHRvIGxvYWQgVk0gaW5mbyBmb3IgdGVtcGxhdGU6XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yXHJcbiAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgICBzZXRGYWxsYmFja1ZhbHVlcyh0ZW1wbGF0ZUlkKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gTG9hZCBWTSBpbmZvIGFmdGVyIGEgc2hvcnQgZGVsYXkgdG8gbm90IGJsb2NrIHBhZ2UgbG9hZFxyXG4gICAgc2V0VGltZW91dChsb2FkR3Vlc3RPU0luZm8sIDEwMDApO1xyXG5cclxuICAgIC8vIFByb2Nlc3MgVk0gZGF0YSBmcm9tIEFQSSByZXNwb25zZVxyXG4gICAgZnVuY3Rpb24gcHJvY2Vzc1ZNRGF0YSh2bURhdGEpIHtcclxuICAgICAgICBjb25zdCBndWVzdE9TID0gdm1EYXRhLmd1ZXN0X29zIHx8IFwiVU5LTk9XTlwiO1xyXG4gICAgICAgIGNvbnN0IGNwdUNvdW50ID0gdm1EYXRhLmNwdV9jb3VudCB8fCAwO1xyXG4gICAgICAgIGNvbnN0IG1lbW9yeU1CID0gdm1EYXRhLm1lbW9yeV9zaXplIHx8IDA7XHJcbiAgICAgICAgY29uc3QgZGlza0J5dGVzID0gdm1EYXRhLmRpc2tfY2FwYWNpdHkgfHwgMDtcclxuXHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgZ3Vlc3RPUzogZ3Vlc3RPUyxcclxuICAgICAgICAgICAgZm9ybWF0dGVkT1M6IGZvcm1hdE9TTmFtZShndWVzdE9TKSxcclxuICAgICAgICAgICAgY3B1OiBjcHVDb3VudCxcclxuICAgICAgICAgICAgZm9ybWF0dGVkQ1BVOiBgJHtjcHVDb3VudH0gdkNvcmUke2NwdUNvdW50ID4gMSA/IFwic1wiIDogXCJcIn1gLFxyXG4gICAgICAgICAgICByYW06IE1hdGgucm91bmQoKG1lbW9yeU1CIC8gMTAyNCkgKiAxMDApIC8gMTAwLCAvLyBDb252ZXJ0IE1CIHRvIEdCLCAyIGRlY2ltYWwgcGxhY2VzXHJcbiAgICAgICAgICAgIGZvcm1hdHRlZFJBTTogYCR7TWF0aC5yb3VuZCgobWVtb3J5TUIgLyAxMDI0KSAqIDEwMCkgLyAxMDB9IEdCYCxcclxuICAgICAgICAgICAgZGlzazogTWF0aC5yb3VuZCgoZGlza0J5dGVzIC8gKDEwMjQgKiAxMDI0ICogMTAyNCkpICogMTAwKSAvIDEwMCwgLy8gQ29udmVydCBieXRlcyB0byBHQlxyXG4gICAgICAgICAgICBmb3JtYXR0ZWREaXNrOiBgJHtcclxuICAgICAgICAgICAgICAgIE1hdGgucm91bmQoKGRpc2tCeXRlcyAvICgxMDI0ICogMTAyNCAqIDEwMjQpKSAqIDEwMCkgLyAxMDBcclxuICAgICAgICAgICAgfSBHQmAsXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBBZGQgbG9hZGluZyBpbmRpY2F0b3JzIHRvIGFsbCBWTSBpbmZvIGVsZW1lbnRzXHJcbiAgICBmdW5jdGlvbiBhZGRMb2FkaW5nSW5kaWNhdG9ycyh0ZW1wbGF0ZUlkKSB7XHJcbiAgICAgICAgY29uc3QgbG9hZGluZ0ljb24gPVxyXG4gICAgICAgICAgICAnPGkgY2xhc3M9XCJmYXMgZmEtc3Bpbm5lciBmYS1zcGluIHRleHQtb3JhbmdlLTUwMCBtci0xXCI+PC9pPsSQYW5nIHThuqNpLi4uJztcclxuICAgICAgICAkKGAuZ3Vlc3Qtb3NbZGF0YS10ZW1wbGF0ZS1pZD1cIiR7dGVtcGxhdGVJZH1cIl1gKS5odG1sKGxvYWRpbmdJY29uKTtcclxuICAgICAgICAkKGAudm0tY3B1W2RhdGEtdGVtcGxhdGUtaWQ9XCIke3RlbXBsYXRlSWR9XCJdYCkuaHRtbChsb2FkaW5nSWNvbik7XHJcbiAgICAgICAgJChgLnZtLXJhbVtkYXRhLXRlbXBsYXRlLWlkPVwiJHt0ZW1wbGF0ZUlkfVwiXWApLmh0bWwobG9hZGluZ0ljb24pO1xyXG4gICAgICAgICQoYC52bS1kaXNrW2RhdGEtdGVtcGxhdGUtaWQ9XCIke3RlbXBsYXRlSWR9XCJdYCkuaHRtbChsb2FkaW5nSWNvbik7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gVXBkYXRlIGFsbCBWTSBpbmZvIFVJIGVsZW1lbnRzXHJcbiAgICBmdW5jdGlvbiB1cGRhdGVWTUluZm9VSSh0ZW1wbGF0ZUlkLCBkYXRhKSB7XHJcbiAgICAgICAgLy8gVXBkYXRlIE9TXHJcbiAgICAgICAgJChgLmd1ZXN0LW9zW2RhdGEtdGVtcGxhdGUtaWQ9XCIke3RlbXBsYXRlSWR9XCJdYCkuaHRtbChkYXRhLmZvcm1hdHRlZE9TKTtcclxuICAgICAgICB1cGRhdGVPU0ljb24odGVtcGxhdGVJZCwgZGF0YS5ndWVzdE9TKTtcclxuXHJcbiAgICAgICAgLy8gVXBkYXRlIGhhcmR3YXJlIHNwZWNzXHJcbiAgICAgICAgJChgLnZtLWNwdVtkYXRhLXRlbXBsYXRlLWlkPVwiJHt0ZW1wbGF0ZUlkfVwiXWApLmh0bWwoZGF0YS5mb3JtYXR0ZWRDUFUpO1xyXG4gICAgICAgICQoYC52bS1yYW1bZGF0YS10ZW1wbGF0ZS1pZD1cIiR7dGVtcGxhdGVJZH1cIl1gKS5odG1sKGRhdGEuZm9ybWF0dGVkUkFNKTtcclxuICAgICAgICAkKGAudm0tZGlza1tkYXRhLXRlbXBsYXRlLWlkPVwiJHt0ZW1wbGF0ZUlkfVwiXWApLmh0bWwoXHJcbiAgICAgICAgICAgIGRhdGEuZm9ybWF0dGVkRGlza1xyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gU2V0IGZhbGxiYWNrIHZhbHVlcyB3aGVuIEFQSSBmYWlsc1xyXG4gICAgZnVuY3Rpb24gc2V0RmFsbGJhY2tWYWx1ZXModGVtcGxhdGVJZCkge1xyXG4gICAgICAgICQoYC5ndWVzdC1vc1tkYXRhLXRlbXBsYXRlLWlkPVwiJHt0ZW1wbGF0ZUlkfVwiXWApLmh0bWwoXCJMaW51eFwiKTtcclxuICAgICAgICAkKGAudm0tY3B1W2RhdGEtdGVtcGxhdGUtaWQ9XCIke3RlbXBsYXRlSWR9XCJdYCkuaHRtbChcIk4vQVwiKTtcclxuICAgICAgICAkKGAudm0tcmFtW2RhdGEtdGVtcGxhdGUtaWQ9XCIke3RlbXBsYXRlSWR9XCJdYCkuaHRtbChcIk4vQVwiKTtcclxuICAgICAgICAkKGAudm0tZGlza1tkYXRhLXRlbXBsYXRlLWlkPVwiJHt0ZW1wbGF0ZUlkfVwiXWApLmh0bWwoXCJOL0FcIik7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gVXBkYXRlIE9TIGljb24gYmFzZWQgb24gZGV0ZWN0ZWQgT1NcclxuICAgIGZ1bmN0aW9uIHVwZGF0ZU9TSWNvbih0ZW1wbGF0ZUlkLCBvc05hbWUpIHtcclxuICAgICAgICBjb25zdCAkaWNvbkVsZW1lbnQgPSAkKGAub3MtaWNvbltkYXRhLXRlbXBsYXRlLWlkPVwiJHt0ZW1wbGF0ZUlkfVwiXWApO1xyXG5cclxuICAgICAgICBpZiAob3NOYW1lICYmIG9zTmFtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKFwid2luZG93c1wiKSkge1xyXG4gICAgICAgICAgICAkaWNvbkVsZW1lbnQucmVtb3ZlQ2xhc3MoXCJmYWIgZmEtbGludXhcIikuYWRkQ2xhc3MoXCJmYWIgZmEtd2luZG93c1wiKTtcclxuICAgICAgICB9IGVsc2UgaWYgKG9zTmFtZSAmJiBvc05hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhcInVidW50dVwiKSkge1xyXG4gICAgICAgICAgICAkaWNvbkVsZW1lbnQucmVtb3ZlQ2xhc3MoXCJmYWIgZmEtbGludXhcIikuYWRkQ2xhc3MoXCJmYWIgZmEtdWJ1bnR1XCIpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAob3NOYW1lICYmIG9zTmFtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKFwiY2VudG9zXCIpKSB7XHJcbiAgICAgICAgICAgICRpY29uRWxlbWVudC5yZW1vdmVDbGFzcyhcImZhYiBmYS1saW51eFwiKS5hZGRDbGFzcyhcImZhYiBmYS1jZW50b3NcIik7XHJcbiAgICAgICAgfSBlbHNlIGlmIChvc05hbWUgJiYgb3NOYW1lLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoXCJkZWJpYW5cIikpIHtcclxuICAgICAgICAgICAgJGljb25FbGVtZW50LnJlbW92ZUNsYXNzKFwiZmFiIGZhLWxpbnV4XCIpLmFkZENsYXNzKFwiZmFiIGZhLWRlYmlhblwiKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBLZWVwIGxpbnV4IGljb24gYXMgZGVmYXVsdFxyXG4gICAgICAgICAgICAkaWNvbkVsZW1lbnQucmVtb3ZlQ2xhc3MoKS5hZGRDbGFzcyhcImZhYiBmYS1saW51eCB0ZXh0LW9yYW5nZS02MDBcIik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIEZvcm1hdCBPUyBuYW1lIGZvciBiZXR0ZXIgZGlzcGxheVxyXG4gICAgZnVuY3Rpb24gZm9ybWF0T1NOYW1lKG9zTmFtZSkge1xyXG4gICAgICAgIGNvbnN0IG9zTWFwID0ge1xyXG4gICAgICAgICAgICBVQlVOVFVfNjQ6IFwiVWJ1bnR1IDY0LWJpdFwiLFxyXG4gICAgICAgICAgICBDRU5UT1NfNjQ6IFwiQ2VudE9TIDY0LWJpdFwiLFxyXG4gICAgICAgICAgICBDRU5UT1NfN182NDogXCJDZW50T1MgNyA2NC1iaXRcIixcclxuICAgICAgICAgICAgQ0VOVE9TXzhfNjQ6IFwiQ2VudE9TIDggNjQtYml0XCIsXHJcbiAgICAgICAgICAgIFJPQ0tZX0xJTlVYXzY0OiBcIlJvY2t5IExpbnV4IDY0LWJpdFwiLFxyXG4gICAgICAgICAgICBXSU5ET1dTXzEwXzY0OiBcIldpbmRvd3MgMTAgNjQtYml0XCIsXHJcbiAgICAgICAgICAgIFdJTkRPV1NfOV9TRVJWRVJfNjQ6IFwiV2luZG93cyBTZXJ2ZXIgMjAxOVwiLFxyXG4gICAgICAgICAgICBXSU5ET1dTX1NFUlZFUl8yMDE5OiBcIldpbmRvd3MgU2VydmVyIDIwMTlcIixcclxuICAgICAgICAgICAgV0lORE9XU19TRVJWRVJfMjAyMjogXCJXaW5kb3dzIFNlcnZlciAyMDIyXCIsXHJcbiAgICAgICAgICAgIFdJTkRPV1NfMjAxOTogXCJXaW5kb3dzIFNlcnZlciAyMDE5XCIsXHJcbiAgICAgICAgICAgIFdJTkRPV1NfMjAyMjogXCJXaW5kb3dzIFNlcnZlciAyMDIyXCIsXHJcbiAgICAgICAgICAgIERFQklBTl8xMF82NDogXCJEZWJpYW4gMTAgNjQtYml0XCIsXHJcbiAgICAgICAgICAgIERFQklBTl8xMV82NDogXCJEZWJpYW4gMTEgNjQtYml0XCIsXHJcbiAgICAgICAgICAgIE9USEVSX0xJTlVYXzY0OiBcIkxpbnV4IDY0LWJpdFwiLFxyXG4gICAgICAgICAgICBPVEhFUl82NDogXCJPdGhlciA2NC1iaXRcIixcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICByZXR1cm4gb3NNYXBbb3NOYW1lXSB8fCBvc05hbWUgfHwgXCJMaW51eFwiO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIENsZWFuIHVwIGV4cGlyZWQgY2FjaGUgZW50cmllc1xyXG4gICAgY2xlYXJFeHBpcmVkVk1JbmZvQ2FjaGUoKTtcclxuXHJcbiAgICAvLyBMb2FkIEd1ZXN0IE9TIGluZm8gd2hlbiBwYWdlIGxvYWRzXHJcbiAgICBsb2FkR3Vlc3RPU0luZm8oKTtcclxuXHJcbiAgICAvLyBFeHBvc2UgY2FjaGUgbWFuYWdlbWVudCB0byBnbG9iYWwgc2NvcGUgZm9yIGRlYnVnZ2luZ1xyXG4gICAgd2luZG93LnZtSW5mb0NhY2hlID0ge1xyXG4gICAgICAgIGNsZWFyOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKFZNX0lORk9fQ0FDSEVfS0VZKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIHJlZnJlc2g6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdGhpcy5jbGVhcigpO1xyXG4gICAgICAgICAgICBsb2FkR3Vlc3RPU0luZm8oKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGluZm86IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgY29uc3Qgdm1JbmZvQ2FjaGUgPSBnZXRWTUluZm9DYWNoZSgpO1xyXG4gICAgICAgICAgICBpZiAoIXZtSW5mb0NhY2hlKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHRlbXBsYXRlSWRzID0gT2JqZWN0LmtleXModm1JbmZvQ2FjaGUuZGF0YSk7XHJcblxyXG4gICAgICAgICAgICB0ZW1wbGF0ZUlkcy5mb3JFYWNoKCh0ZW1wbGF0ZUlkKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gZ2V0Vk1JbmZvRnJvbUNhY2hlKHRlbXBsYXRlSWQpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKHRlbXBsYXRlSWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGdldFZNSW5mb0Zyb21DYWNoZSh0ZW1wbGF0ZUlkKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIHJlbW92ZTogZnVuY3Rpb24gKHRlbXBsYXRlSWQpIHtcclxuICAgICAgICAgICAgcmVtb3ZlVk1JbmZvRnJvbUNhY2hlKHRlbXBsYXRlSWQpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgcmF3OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBnZXRWTUluZm9DYWNoZSgpO1xyXG4gICAgICAgIH0sXHJcbiAgICB9O1xyXG59KTtcclxuIl0sIm1hcHBpbmdzIjoiQUFBQUEsQ0FBQyxDQUFDQyxRQUFRLENBQUMsQ0FBQ0MsS0FBSyxDQUFDLFlBQVk7RUFDMUI7RUFDQSxTQUFTQyxrQkFBa0JBLENBQUEsRUFBRztJQUMxQjtJQUNBSCxDQUFDLENBQUNDLFFBQVEsQ0FBQyxDQUFDRyxFQUFFLENBQUMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLFVBQVVDLENBQUMsRUFBRTtNQUN2REEsQ0FBQyxDQUFDQyxlQUFlLENBQUMsQ0FBQztNQUNuQixJQUFNQyxTQUFTLEdBQUdQLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQ1EsT0FBTyxDQUFDLGtCQUFrQixDQUFDO01BQ3JELElBQU1D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\n//# sourceURL=webpack-internal:///./resources/js/service/vminfo.js\n"); /***/ }) diff --git a/public/js/whois.min.js b/public/js/whois.min.js index 574c789..7e5245a 100644 --- a/public/js/whois.min.js +++ b/public/js/whois.min.js @@ -15,7 +15,7 @@ \*******************************/ /***/ (() => { -eval("document.addEventListener('DOMContentLoaded', function () {\n var domainInput = document.getElementById('domain');\n var getDomainInfoBtn = document.getElementById('getDomainInfo');\n var checkAvailabilityBtn = document.getElementById('checkAvailability');\n var loading = document.getElementById('loading');\n var results = document.getElementById('results');\n var domainError = document.getElementById('domainError');\n function showLoading() {\n loading.classList.remove('hidden');\n results.classList.add('hidden');\n domainInput.classList.remove('border-red-500');\n domainError.classList.add('hidden');\n domainError.textContent = '';\n }\n function hideLoading() {\n loading.classList.add('hidden');\n }\n function showResults(data) {\n if (data.success && data.data) {\n populateWhoisTable(data.data);\n results.classList.remove('hidden');\n } else if (data.data && data.data.domain && data.data.available !== undefined) {\n // Availability check result\n showAvailabilityResult(data.data);\n results.classList.remove('hidden');\n } else {\n // Fallback to console log for unexpected format\n console.error('Unexpected response format:', data);\n results.classList.remove('hidden');\n }\n }\n function populateWhoisTable(data) {\n // Hide availability results and show whois table\n var availabilityResults = document.getElementById('availabilityResults');\n var whoisInfo = document.querySelector('.who-info .table-responsive');\n if (availabilityResults) availabilityResults.style.display = 'none';\n if (whoisInfo) whoisInfo.style.display = 'block';\n\n // Set domain title\n var domainTitle = document.getElementById('domainTitle');\n if (domainTitle) domainTitle.textContent = data.domainName || '';\n\n // Set individual fields\n setElementText('domain_name', data.domainName);\n setElementText('domain_reg_date', data.creationDate);\n setElementText('domain_exp_date', data.expirationDate);\n setElementText('domain_registrar', data.registrar);\n setElementText('domain_dnssec', data.DNSSEC);\n\n // Handle registrant name\n var ownerRow = document.getElementById('domain_owner_row');\n var ownerName = document.getElementById('domain_own_name');\n if (data.registrantName) {\n setElementText('domain_own_name', data.registrantName);\n if (ownerRow) ownerRow.style.display = '';\n } else {\n if (ownerRow) ownerRow.style.display = 'none';\n }\n\n // Handle status array\n var statusContainer = document.getElementById('domain_status_list');\n if (statusContainer && data.status && Array.isArray(data.status)) {\n statusContainer.innerHTML = data.status.map(function (status) {\n return \"\".concat(status, \"\");\n }).join('');\n }\n\n // Handle nameserver array\n var nsContainer = document.getElementById('domain_ns_list');\n if (nsContainer && data.nameServer && Array.isArray(data.nameServer)) {\n nsContainer.innerHTML = data.nameServer.map(function (ns) {\n return \"\".concat(ns, \"\");\n }).join('');\n }\n\n // Setup share button\n var shareBtn = document.getElementById('shareBtn');\n if (shareBtn && data.domainName) {\n var shareUrl = \"https://www.facebook.com/sharer/sharer.php?u=\".concat(encodeURIComponent(window.location.origin + window.location.pathname + '?domain=' + data.domainName));\n shareBtn.href = shareUrl;\n shareBtn.classList.remove('hidden');\n }\n }\n function showAvailabilityResult(data) {\n // Hide whois table and show availability results\n var availabilityResults = document.getElementById('availabilityResults');\n var whoisInfo = document.querySelector('.who-info .table-responsive');\n if (whoisInfo) whoisInfo.classList.add('hidden');\n if (availabilityResults) availabilityResults.classList.remove('hidden');\n var alert = document.getElementById('availabilityAlert');\n var icon = document.getElementById('availabilityIcon');\n var title = document.getElementById('availabilityTitle');\n var message = document.getElementById('availabilityMessage');\n if (data.available) {\n var _window$translations, _window$translations2;\n alert.className = 'rounded-lg p-4 bg-green-50 border border-green-200';\n icon.innerHTML = \"\\n \\n \";\n title.textContent = ((_window$translations = window.translations) === null || _window$translations === void 0 ? void 0 : _window$translations.domainAvailable) || 'Domain Available';\n title.className = 'text-sm font-medium text-green-800';\n message.textContent = \"\".concat(data.domain, \" \").concat(((_window$translations2 = window.translations) === null || _window$translations2 === void 0 ? void 0 : _window$translations2.isAvailable) || 'is available for registration');\n message.className = 'text-sm text-green-700';\n } else {\n var _window$translations3, _window$translations4;\n alert.className = 'rounded-lg p-4 bg-red-50 border border-red-200';\n icon.innerHTML = \"\\n \\n \";\n title.textContent = ((_window$translations3 = window.translations) === null || _window$translations3 === void 0 ? void 0 : _window$translations3.domainUnavailable) || 'Domain Unavailable';\n title.className = 'text-sm font-medium text-red-800';\n message.textContent = data.status || \"\".concat(data.domain, \" \").concat(((_window$translations4 = window.translations) === null || _window$translations4 === void 0 ? void 0 : _window$translations4.isNotAvailable) || 'is not available for registration');\n message.className = 'text-sm text-red-700';\n }\n\n // Set domain title\n var domainTitle = document.getElementById('domainTitle');\n if (domainTitle) domainTitle.textContent = data.domain || '';\n }\n function setElementText(elementId, text) {\n var element = document.getElementById(elementId);\n if (element) {\n element.textContent = text || '';\n }\n }\n function showError(message) {\n domainInput.classList.add('border-red-500');\n domainError.textContent = message;\n domainError.classList.remove('hidden');\n }\n function makeRequest(url) {\n var domain = domainInput.value.trim();\n if (!domain) {\n var _window$translations5;\n showError(((_window$translations5 = window.translations) === null || _window$translations5 === void 0 ? void 0 : _window$translations5.domainRequired) || 'Domain name is required.');\n return;\n }\n showLoading();\n fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-CSRF-TOKEN': document.querySelector('meta[name=\"csrf-token\"]').getAttribute('content')\n },\n body: JSON.stringify({\n domain: domain\n })\n }).then(function (response) {\n return response.json();\n }).then(function (data) {\n hideLoading();\n showResults(data);\n if (!data.success && data.errors && data.errors.domain) {\n showError(data.errors.domain[0]);\n }\n })[\"catch\"](function (error) {\n var _window$translations6;\n hideLoading();\n showError(((_window$translations6 = window.translations) === null || _window$translations6 === void 0 ? void 0 : _window$translations6.requestError) || 'An error occurred while processing your request.');\n console.error('Error:', error);\n });\n }\n\n // Event listeners\n if (getDomainInfoBtn) {\n getDomainInfoBtn.addEventListener('click', function () {\n var _window$routes;\n makeRequest(((_window$routes = window.routes) === null || _window$routes === void 0 ? void 0 : _window$routes.domainInfo) || '/api/whois/domain-info');\n });\n }\n if (checkAvailabilityBtn) {\n checkAvailabilityBtn.addEventListener('click', function () {\n var _window$routes2;\n makeRequest(((_window$routes2 = window.routes) === null || _window$routes2 === void 0 ? void 0 : _window$routes2.checkAvailability) || '/api/whois/check-availability');\n });\n }\n\n // Clear errors on input\n if (domainInput) {\n domainInput.addEventListener('input', function () {\n domainInput.classList.remove('border-red-500');\n domainError.classList.add('hidden');\n domainError.textContent = '';\n });\n }\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJkb2N1bWVudCIsImFkZEV2ZW50TGlzdGVuZXIiLCJkb21haW5JbnB1dCIsImdldEVsZW1lbnRCeUlkIiwiZ2V0RG9tYWluSW5mb0J0biIsImNoZWNrQXZhaWxhYmlsaXR5QnRuIiwibG9hZGluZyIsInJlc3VsdHMiLCJkb21haW5FcnJvciIsInNob3dMb2FkaW5nIiwiY2xhc3NMaXN0IiwicmVtb3ZlIiwiYWRkIiwidGV4dENvbnRlbnQiLCJoaWRlTG9hZGluZyIsInNob3dSZXN1bHRzIiwiZGF0YSIsInN1Y2Nlc3MiLCJwb3B1bGF0ZVdob2lzVGFibGUiLCJkb21haW4iLCJhdmFpbGFibGUiLCJ1bmRlZmluZWQiLCJzaG93QXZhaWxhYmlsaXR5UmVzdWx0IiwiY29uc29sZSIsImVycm9yIiwiYXZhaWxhYmlsaXR5UmVzdWx0cyIsIndob2lzSW5mbyIsInF1ZXJ5U2VsZWN0b3IiLCJzdHlsZSIsImRpc3BsYXkiLCJkb21haW5UaXRsZSIsImRvbWFpbk5hbWUiLCJzZXRFbGVtZW50VGV4dCIsImNyZWF0aW9uRGF0ZSIsImV4cGlyYXRpb25EYXRlIiwicmVnaXN0cmFyIiwiRE5TU0VDIiwib3duZXJSb3ciLCJvd25lck5hbWUiLCJyZWdpc3RyYW50TmFtZSIsInN0YXR1c0NvbnRhaW5lciIsInN0YXR1cyIsIkFycmF5IiwiaXNBcnJheSIsImlubmVySFRNTCIsIm1hcCIsImNvbmNhdCIsImpvaW4iLCJuc0NvbnRhaW5lciIsIm5hbWVTZXJ2ZXIiLCJucyIsInNoYXJlQnRuIiwic2hhcmVVcmwiLCJlbmNvZGVVUklDb21wb25lbnQiLCJ3aW5kb3ciLCJsb2NhdGlvbiIsIm9yaWdpbiIsInBhdGhuYW1lIiwiaHJlZiIsImFsZXJ0IiwiaWNvbiIsInRpdGxlIiwibWVzc2FnZSIsIl93aW5kb3ckdHJhbnNsYXRpb25zIiwiX3dpbmRvdyR0cmFuc2xhdGlvbnMyIiwiY2xhc3NOYW1lIiwidHJhbnNsYXRpb25zIiwiZG9tYWluQXZhaWxhYmxlIiwiaXNBdmFpbGFibGUiLCJfd2luZG93JHRyYW5zbGF0aW9uczMiLCJfd2luZG93JHRyYW5zbGF0aW9uczQiLCJkb21haW5VbmF2YWlsYWJsZSIsImlzTm90QXZhaWxhYmxlIiwiZWxlbWVudElkIiwidGV4dCIsImVsZW1lbnQiLCJzaG93RXJyb3IiLCJtYWtlUmVxdWVzdCIsInVybCIsInZhbHVlIiwidHJpbSIsIl93aW5kb3ckdHJhbnNsYXRpb25zNSIsImRvbWFpblJlcXVpcmVkIiwiZmV0Y2giLCJtZXRob2QiLCJoZWFkZXJzIiwiZ2V0QXR0cmlidXRlIiwiYm9keSIsIkpTT04iLCJzdHJpbmdpZnkiLCJ0aGVuIiwicmVzcG9uc2UiLCJqc29uIiwiZXJyb3JzIiwiX3dpbmRvdyR0cmFuc2xhdGlvbnM2IiwicmVxdWVzdEVycm9yIiwiX3dpbmRvdyRyb3V0ZXMiLCJyb3V0ZXMiLCJkb21haW5JbmZvIiwiX3dpbmRvdyRyb3V0ZXMyIiwiY2hlY2tBdmFpbGFiaWxpdHkiXSwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vcmVzb3VyY2VzL2pzL3dob2lzLmpzP2UwZTAiXSwic291cmNlc0NvbnRlbnQiOlsiZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIGZ1bmN0aW9uKCkge1xyXG4gICAgY29uc3QgZG9tYWluSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG9tYWluJyk7XHJcbiAgICBjb25zdCBnZXREb21haW5JbmZvQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dldERvbWFpbkluZm8nKTtcclxuICAgIGNvbnN0IGNoZWNrQXZhaWxhYmlsaXR5QnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NoZWNrQXZhaWxhYmlsaXR5Jyk7XHJcbiAgICBjb25zdCBsb2FkaW5nID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvYWRpbmcnKTtcclxuICAgIGNvbnN0IHJlc3VsdHMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVzdWx0cycpO1xyXG4gICAgY29uc3QgZG9tYWluRXJyb3IgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG9tYWluRXJyb3InKTtcclxuXHJcbiAgICBmdW5jdGlvbiBzaG93TG9hZGluZygpIHtcclxuICAgICAgICBsb2FkaW5nLmNsYXNzTGlzdC5yZW1vdmUoJ2hpZGRlbicpO1xyXG4gICAgICAgIHJlc3VsdHMuY2xhc3NMaXN0LmFkZCgnaGlkZGVuJyk7XHJcbiAgICAgICAgZG9tYWluSW5wdXQuY2xhc3NMaXN0LnJlbW92ZSgnYm9yZGVyLXJlZC01MDAnKTtcclxuICAgICAgICBkb21haW5FcnJvci5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTtcclxuICAgICAgICBkb21haW5FcnJvci50ZXh0Q29udGVudCA9ICcnO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGhpZGVMb2FkaW5nKCkge1xyXG4gICAgICAgIGxvYWRpbmcuY2xhc3NMaXN0LmFkZCgnaGlkZGVuJyk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gc2hvd1Jlc3VsdHMoZGF0YSkge1xyXG4gICAgICAgIGlmIChkYXRhLnN1Y2Nlc3MgJiYgZGF0YS5kYXRhKSB7XHJcbiAgICAgICAgICAgIHBvcHVsYXRlV2hvaXNUYWJsZShkYXRhLmRhdGEpO1xyXG4gICAgICAgICAgICByZXN1bHRzLmNsYXNzTGlzdC5yZW1vdmUoJ2hpZGRlbicpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YS5kYXRhICYmIGRhdGEuZGF0YS5kb21haW4gJiYgZGF0YS5kYXRhLmF2YWlsYWJsZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIC8vIEF2YWlsYWJpbGl0eSBjaGVjayByZXN1bHRcclxuICAgICAgICAgICAgc2hvd0F2YWlsYWJpbGl0eVJlc3VsdChkYXRhLmRhdGEpO1xyXG4gICAgICAgICAgICByZXN1bHRzLmNsYXNzTGlzdC5yZW1vdmUoJ2hpZGRlbicpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIEZhbGxiYWNrIHRvIGNvbnNvbGUgbG9nIGZvciB1bmV4cGVjdGVkIGZvcm1hdFxyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdVbmV4cGVjdGVkIHJlc3BvbnNlIGZvcm1hdDonLCBkYXRhKTtcclxuICAgICAgICAgICAgcmVzdWx0cy5jbGFzc0xpc3QucmVtb3ZlKCdoaWRkZW4nKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gcG9wdWxhdGVXaG9pc1RhYmxlKGRhdGEpIHtcclxuICAgICAgICAvLyBIaWRlIGF2YWlsYWJpbGl0eSByZXN1bHRzIGFuZCBzaG93IHdob2lzIHRhYmxlXHJcbiAgICAgICAgY29uc3QgYXZhaWxhYmlsaXR5UmVzdWx0cyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhdmFpbGFiaWxpdHlSZXN1bHRzJyk7XHJcbiAgICAgICAgY29uc3Qgd2hvaXNJbmZvID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLndoby1pbmZvIC50YWJsZS1yZXNwb25zaXZlJyk7XHJcbiAgICAgICAgaWYgKGF2YWlsYWJpbGl0eVJlc3VsdHMpIGF2YWlsYWJpbGl0eVJlc3VsdHMuc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuICAgICAgICBpZiAod2hvaXNJbmZvKSB3aG9pc0luZm8uc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XHJcblxyXG4gICAgICAgIC8vIFNldCBkb21haW4gdGl0bGVcclxuICAgICAgICBjb25zdCBkb21haW5UaXRsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkb21haW5UaXRsZScpO1xyXG4gICAgICAgIGlmIChkb21haW5UaXRsZSkgZG9tYWluVGl0bGUudGV4dENvbnRlbnQgPSBkYXRhLmRvbWFpbk5hbWUgfHwgJyc7XHJcblxyXG4gICAgICAgIC8vIFNldCBpbmRpdmlkdWFsIGZpZWxkc1xyXG4gICAgICAgIHNldEVsZW1lbnRUZXh0KCdkb21haW5fbmFtZScsIGRhdGEuZG9tYWluTmFtZSk7XHJcbiAgICAgICAgc2V0RWxlbWVudFRleHQoJ2RvbWFpbl9yZWdfZGF0ZScsIGRhdGEuY3JlYXRpb25EYXRlKTtcclxuICAgICAgICBzZXRFbGVtZW50VGV4dCgnZG9tYWluX2V4cF9kYXRlJywgZGF0YS5leHBpcmF0aW9uRGF0ZSk7XHJcbiAgICAgICAgc2V0RWxlbWVudFRleHQoJ2RvbWFpbl9yZWdpc3RyYXInLCBkYXRhLnJlZ2lzdHJhcik7XHJcbiAgICAgICAgc2V0RWxlbWVudFRleHQoJ2RvbWFpbl9kbnNzZWMnLCBkYXRhLkROU1NFQyk7XHJcblxyXG4gICAgICAgIC8vIEhhbmRsZSByZWdpc3RyYW50IG5hbWVcclxuICAgICAgICBjb25zdCBvd25lclJvdyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkb21haW5fb3duZXJfcm93Jyk7XHJcbiAgICAgICAgY29uc3Qgb3duZXJOYW1lID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RvbWFpbl9vd25fbmFtZScpO1xyXG4gICAgICAgIGlmIChkYXRhLnJlZ2lzdHJhbnROYW1lKSB7XHJcbiAgICAgICAgICAgIHNldEVsZW1lbnRUZXh0KCdkb21haW5fb3duX25hbWUnLCBkYXRhLnJlZ2lzdHJhbnROYW1lKTtcclxuICAgICAgICAgICAgaWYgKG93bmVyUm93KSBvd25lclJvdy5zdHlsZS5kaXNwbGF5ID0gJyc7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKG93bmVyUm93KSBvd25lclJvdy5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gSGFuZGxlIHN0YXR1cyBhcnJheVxyXG4gICAgICAgIGNvbnN0IHN0YXR1c0NvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkb21haW5fc3RhdHVzX2xpc3QnKTtcclxuICAgICAgICBpZiAoc3RhdHVzQ29udGFpbmVyICYmIGRhdGEuc3RhdHVzICYmIEFycmF5LmlzQXJyYXkoZGF0YS5zdGF0dXMpKSB7XHJcbiAgICAgICAgICAgIHN0YXR1c0NvbnRhaW5lci5pbm5lckhUTUwgPSBkYXRhLnN0YXR1cy5tYXAoc3RhdHVzID0+IFxyXG4gICAgICAgICAgICAgICAgYDxzcGFuIGNsYXNzPVwiaW5saW5lLWZsZXggaXRlbXMtY2VudGVyIHB4LTIuNSBweS0wLjUgcm91bmRlZC1mdWxsIHRleHQteHMgZm9udC1tZWRpdW0gYmctYmx1ZS0xMDAgdGV4dC1ibHVlLTgwMCBtci0xIG1iLTFcIj4ke3N0YXR1c308L3NwYW4+YFxyXG4gICAgICAgICAgICApLmpvaW4oJycpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gSGFuZGxlIG5hbWVzZXJ2ZXIgYXJyYXlcclxuICAgICAgICBjb25zdCBuc0NvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkb21haW5fbnNfbGlzdCcpO1xyXG4gICAgICAgIGlmIChuc0NvbnRhaW5lciAmJiBkYXRhLm5hbWVTZXJ2ZXIgJiYgQXJyYXkuaXNBcnJheShkYXRhLm5hbWVTZXJ2ZXIpKSB7XHJcbiAgICAgICAgICAgIG5zQ29udGFpbmVyLmlubmVySFRNTCA9IGRhdGEubmFtZVNlcnZlci5tYXAobnMgPT4gXHJcbiAgICAgICAgICAgICAgICBgPGRpdiBjbGFzcz1cImZvbnQtbW9ubyB0ZXh0LXNtIHRleHQtZ3JheS03MDBcIj4ke25zfTwvZGl2PmBcclxuICAgICAgICAgICAgKS5qb2luKCcnKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIFNldHVwIHNoYXJlIGJ1dHRvblxyXG4gICAgICAgIGNvbnN0IHNoYXJlQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NoYXJlQnRuJyk7XHJcbiAgICAgICAgaWYgKHNoYXJlQnRuICYmIGRhdGEuZG9tYWluTmFtZSkge1xyXG4gICAgICAgICAgICBjb25zdCBzaGFyZVVybCA9IGBodHRwczovL3d3dy5mYWNlYm9vay5jb20vc2hhcmVyL3NoYXJlci5waHA/dT0ke2VuY29kZVVSSUNvbXBvbmVudCh3aW5kb3cubG9jYXRpb24ub3JpZ2luICsgd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lICsgJz9kb21haW49JyArIGRhdGEuZG9tYWluTmFtZSl9YDtcclxuICAgICAgICAgICAgc2hhcmVCdG4uaHJlZiA9IHNoYXJlVXJsO1xyXG4gICAgICAgICAgICBzaGFyZUJ0bi5jbGFzc0xpc3QucmVtb3ZlKCdoaWRkZW4nKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gc2hvd0F2YWlsYWJpbGl0eVJlc3VsdChkYXRhKSB7XHJcbiAgICAgICAgLy8gSGlkZSB3aG9pcyB0YWJsZSBhbmQgc2hvdyBhdmFpbGFiaWxpdHkgcmVzdWx0c1xyXG4gICAgICAgIGNvbnN0IGF2YWlsYWJpbGl0eVJlc3VsdHMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXZhaWxhYmlsaXR5UmVzdWx0cycpO1xyXG4gICAgICAgIGNvbnN0IHdob2lzSW5mbyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy53aG8taW5mbyAudGFibGUtcmVzcG9uc2l2ZScpO1xyXG4gICAgICAgIGlmICh3aG9pc0luZm8pIHdob2lzSW5mby5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTtcclxuICAgICAgICBpZiAoYXZhaWxhYmlsaXR5UmVzdWx0cykgYXZhaWxhYmlsaXR5UmVzdWx0cy5jbGFzc0xpc3QucmVtb3ZlKCdoaWRkZW4nKTtcclxuXHJcbiAgICAgICAgY29uc3QgYWxlcnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXZhaWxhYmlsaXR5QWxlcnQnKTtcclxuICAgICAgICBjb25zdCBpY29uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2F2YWlsYWJpbGl0eUljb24nKTtcclxuICAgICAgICBjb25zdCB0aXRsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhdmFpbGFiaWxpdHlUaXRsZScpO1xyXG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXZhaWxhYmlsaXR5TWVzc2FnZScpO1xyXG5cclxuICAgICAgICBpZiAoZGF0YS5hdmFpbGFibGUpIHtcclxuICAgICAgICAgICAgYWxlcnQuY2xhc3NOYW1lID0gJ3JvdW5kZWQtbGcgcC00IGJnLWdyZWVuLTUwIGJvcmRlciBib3JkZXItZ3JlZW4tMjAwJztcclxuICAgICAgICAgICAgaWNvbi5pbm5lckhUTUwgPSBgPHN2ZyBjbGFzcz1cImgtNSB3LTUgdGV4dC1ncmVlbi02MDBcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIj5cclxuICAgICAgICAgICAgICAgIDxwYXRoIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIHN0cm9rZS13aWR0aD1cIjJcIiBkPVwiTTUgMTNsNCA0TDE5IDdcIj48L3BhdGg+XHJcbiAgICAgICAgICAgIDwvc3ZnPmA7XHJcbiAgICAgICAgICAgIHRpdGxlLnRleHRDb250ZW50ID0gd2luZG93LnRyYW5zbGF0aW9ucz8uZG9tYWluQXZhaWxhYmxlIHx8ICdEb21haW4gQXZhaWxhYmxlJztcclxuICAgICAgICAgICAgdGl0bGUuY2xhc3NOYW1lID0gJ3RleHQtc20gZm9udC1tZWRpdW0gdGV4dC1ncmVlbi04MDAnO1xyXG4gICAgICAgICAgICBtZXNzYWdlLnRleHRDb250ZW50ID0gYCR7ZGF0YS5kb21haW59ICR7d2luZG93LnRyYW5zbGF0aW9ucz8uaXNBdmFpbGFibGUgfHwgJ2lzIGF2YWlsYWJsZSBmb3IgcmVnaXN0cmF0aW9uJ31gO1xyXG4gICAgICAgICAgICBtZXNzYWdlLmNsYXNzTmFtZSA9ICd0ZXh0LXNtIHRleHQtZ3JlZW4tNzAwJztcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBhbGVydC5jbGFzc05hbWUgPSAncm91bmRlZC1sZyBwLTQgYmctcmVkLTUwIGJvcmRlciBib3JkZXItcmVkLTIwMCc7XHJcbiAgICAgICAgICAgIGljb24uaW5uZXJIVE1MID0gYDxzdmcgY2xhc3M9XCJoLTUgdy01IHRleHQtcmVkLTYwMFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiPlxyXG4gICAgICAgICAgICAgICAgPHBhdGggc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIGQ9XCJNNiAxOEwxOCA2TTYgNmwxMiAxMlwiPjwvcGF0aD5cclxuICAgICAgICAgICAgPC9zdmc+YDtcclxuICAgICAgICAgICAgdGl0bGUudGV4dENvbnRlbnQgPSB3aW5kb3cudHJhbnNsYXRpb25zPy5kb21haW5VbmF2YWlsYWJsZSB8fCAnRG9tYWluIFVuYXZhaWxhYmxlJztcclxuICAgICAgICAgICAgdGl0bGUuY2xhc3NOYW1lID0gJ3RleHQtc20gZm9udC1tZWRpdW0gdGV4dC1yZWQtODAwJztcclxuICAgICAgICAgICAgbWVzc2FnZS50ZXh0Q29udGVudCA9IGRhdGEuc3RhdHVzIHx8IGAke2RhdGEuZG9tYWlufSAke3dpbmRvdy50cmFuc2xhdGlvbnM/LmlzTm90QXZhaWxhYmxlIHx8ICdpcyBub3QgYXZhaWxhYmxlIGZvciByZWdpc3RyYXRpb24nfWA7XHJcbiAgICAgICAgICAgIG1lc3NhZ2UuY2xhc3NOYW1lID0gJ3RleHQtc20gdGV4dC1yZWQtNzAwJztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIFNldCBkb21haW4gdGl0bGVcclxuICAgICAgICBjb25zdCBkb21haW5UaXRsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkb21haW5UaXRsZScpO1xyXG4gICAgICAgIGlmIChkb21haW5UaXRsZSkgZG9tYWluVGl0bGUudGV4dENvbnRlbnQgPSBkYXRhLmRvbWFpbiB8fCAnJztcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBzZXRFbGVtZW50VGV4dChlbGVtZW50SWQsIHRleHQpIHtcclxuICAgICAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWxlbWVudElkKTtcclxuICAgICAgICBpZiAoZWxlbWVudCkge1xyXG4gICAgICAgICAgICBlbGVtZW50LnRleHRDb250ZW50ID0gdGV4dCB8fCAnJztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gc2hvd0Vycm9yKG1lc3NhZ2UpIHtcclxuICAgICAgICBkb21haW5JbnB1dC5jbGFzc0xpc3QuYWRkKCdib3JkZXItcmVkLTUwMCcpO1xyXG4gICAgICAgIGRvbWFpbkVycm9yLnRleHRDb250ZW50ID0gbWVzc2FnZTtcclxuICAgICAgICBkb21haW5FcnJvci5jbGFzc0xpc3QucmVtb3ZlKCdoaWRkZW4nKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBtYWtlUmVxdWVzdCh1cmwpIHtcclxuICAgICAgICBjb25zdCBkb21haW4gPSBkb21haW5JbnB1dC52YWx1ZS50cmltKCk7XHJcbiAgICAgICAgaWYgKCFkb21haW4pIHtcclxuICAgICAgICAgICAgc2hvd0Vycm9yKHdpbmRvdy50cmFuc2xhdGlvbnM/LmRvbWFpblJlcXVpcmVkIHx8ICdEb21haW4gbmFtZSBpcyByZXF1aXJlZC4nKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgc2hvd0xvYWRpbmcoKTtcclxuXHJcbiAgICAgICAgZmV0Y2godXJsLCB7XHJcbiAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxyXG4gICAgICAgICAgICBoZWFkZXJzOiB7XHJcbiAgICAgICAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxyXG4gICAgICAgICAgICAgICAgJ1gtQ1NSRi1UT0tFTic6IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ21ldGFbbmFtZT1cImNzcmYtdG9rZW5cIl0nKS5nZXRBdHRyaWJ1dGUoJ2NvbnRlbnQnKVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGRvbWFpbjogZG9tYWluIH0pXHJcbiAgICAgICAgfSlcclxuICAgICAgICAudGhlbihyZXNwb25zZSA9PiByZXNwb25zZS5qc29uKCkpXHJcbiAgICAgICAgLnRoZW4oZGF0YSA9PiB7XHJcbiAgICAgICAgICAgIGhpZGVMb2FkaW5nKCk7XHJcbiAgICAgICAgICAgIHNob3dSZXN1bHRzKGRhdGEpO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgaWYgKCFkYXRhLnN1Y2Nlc3MgJiYgZGF0YS5lcnJvcnMgJiYgZGF0YS5lcnJvcnMuZG9tYWluKSB7XHJcbiAgICAgICAgICAgICAgICBzaG93RXJyb3IoZGF0YS5lcnJvcnMuZG9tYWluWzBdKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgLmNhdGNoKGVycm9yID0+IHtcclxuICAgICAgICAgICAgaGlkZUxvYWRpbmcoKTtcclxuICAgICAgICAgICAgc2hvd0Vycm9yKHdpbmRvdy50cmFuc2xhdGlvbnM/LnJlcXVlc3RFcnJvciB8fCAnQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgcHJvY2Vzc2luZyB5b3VyIHJlcXVlc3QuJyk7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yOicsIGVycm9yKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBFdmVudCBsaXN0ZW5lcnNcclxuICAgIGlmIChnZXREb21haW5JbmZvQnRuKSB7XHJcbiAgICAgICAgZ2V0RG9tYWluSW5mb0J0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICBtYWtlUmVxdWVzdCh3aW5kb3cucm91dGVzPy5kb21haW5JbmZvIHx8ICcvYXBpL3dob2lzL2RvbWFpbi1pbmZvJyk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGNoZWNrQXZhaWxhYmlsaXR5QnRuKSB7XHJcbiAgICAgICAgY2hlY2tBdmFpbGFiaWxpdHlCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgbWFrZVJlcXVlc3Qod2luZG93LnJvdXRlcz8uY2hlY2tBdmFpbGFiaWxpdHkgfHwgJy9hcGkvd2hvaXMvY2hlY2stYXZhaWxhYmlsaXR5Jyk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ2xlYXIgZXJyb3JzIG9uIGlucHV0XHJcbiAgICBpZiAoZG9tYWluSW5wdXQpIHtcclxuICAgICAgICBkb21haW5JbnB1dC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICBkb21haW5JbnB1dC5jbGFzc0xpc3QucmVtb3ZlKCdib3JkZXItcmVkLTUwMCcpO1xyXG4gICAgICAgICAgICBkb21haW5FcnJvci5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTtcclxuICAgICAgICAgICAgZG9tYWluRXJyb3IudGV4dENvbnRlbnQgPSAnJztcclxuICAgICAgICB9KTtcclxuICAgIH1cclxufSk7ICJdLCJtYXBwaW5ncyI6IkFBQUFBLFFBQVEsQ0FBQ0MsZ0JBQWdCLENBQUMsa0JBQWtCLEVBQUUsWUFBVztFQUNyRCxJQUFNQyxXQUFXLEdBQUdGLFFBQVEsQ0FBQ0csY0FBYyxDQUFDLFFBQVEsQ0FBQztFQUNyRCxJQUFNQyxnQkFBZ0IsR0FBR0osUUFBUSxDQUFDRyxjQUFjLENBQUMsZUFBZSxDQUFDO0VBQ2pFLElBQU1FLG9CQUFvQixHQUFHTCxRQUFRLENBQUNHLGNBQWMsQ0FBQyxtQkFBbUIsQ0FBQztFQUN6RSxJQUFNRyxPQUFPLEdBQUdOLFFBQVEsQ0FBQ0csY0FBYyxDQUFDLFNBQVMsQ0FBQztFQUNsRCxJQUFNSSxPQUFPLEdBQUdQLFFBQVEsQ0FBQ0csY0FBYyxDQUFDLFNBQVMsQ0FBQztFQUNsRCxJQUFNSyxXQUFXLEdBQUdSLFFBQVEsQ0FBQ0csY0FBYyxDQUFDLGFBQWEsQ0FBQztFQUUxRCxTQUFTTSxXQUFXQSxDQUFBLEVBQUc7SUFDbkJILE9BQU8sQ0FBQ0ksU0FBUyxDQUFDQyxNQUFNLENBQUMsUUFBUSxDQUFDO0lBQ2xDSixPQUFPLENBQUNHLFNBQVMsQ0FBQ0UsR0FBRyxDQUFDLFFBQVEsQ0FBQztJQUMvQlYsV0FBVyxDQUFDUSxTQUFTLENBQUNDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQztJQUM5Q0gsV0FBVyxDQUFDRSxTQUFTLENBQUNFLEdBQUcsQ0FBQyxRQUFRLENBQUM7SUFDbkNKLFdBQVcsQ0FBQ0ssV0FBVyxHQUFHLEVBQUU7RUFDaEM7RUFFQSxTQUFTQyxXQUFXQSxDQUFBLEVBQUc7SUFDbkJSLE9BQU8sQ0FBQ0ksU0FBUyxDQUFDRSxHQUFHLENBQUMsUUFBUSxDQUFDO0VBQ25DO0VBRUEsU0FBU0csV0FBV0EsQ0FBQ0MsSUFBSSxFQUFFO0lBQ3ZCLElBQUlBLElBQUksQ0FBQ0MsT0FBTyxJQUFJRCxJQUFJLENBQUNBLElBQUksRUFBRTtNQUMzQkUsa0JBQWtCLENBQUNGLElBQUksQ0FBQ0EsSUFBSSxDQUFDO01BQzdCVCxPQUFPLENBQUNHLFNBQVMsQ0FBQ0MsTUFBTSxDQUFDLFFBQVEsQ0FBQztJQUN0QyxDQUFDLE1BQU0sSUFBSUssSUFBSSxDQUFDQSxJQUFJLElBQUlBLElBQUksQ0FBQ0EsSUFBSSxDQUFDRyxNQUFNLElBQUlILElBQUksQ0FBQ0EsSUFBSSxDQUFDSSxTQUFTLEtBQUtDLFNBQVMsRUFBRTtNQUMzRTtNQUNBQyxzQkFBc0IsQ0FBQ04sSUFBSSxDQUFDQSxJQUFJLENBQUM7TUFDakNULE9BQU8sQ0FBQ0csU0FBUyxDQUFDQyxNQUFNLENBQUMsUUFBUSxDQUFDO0lBQ3RDLENBQUMsTUFBTTtNQUNIO01BQ0FZLE9BQU8sQ0FBQ0MsS0FBSyxDQUFDLDZCQUE2QixFQUFFUixJQUFJLENBQUM7TUFDbERULE9BQU8sQ0FBQ0csU0FBUyxDQUFDQyxNQUFNLENBQUMsUUFBUSxDQUFDO0lBQ3RDO0VBQ0o7RUFFQSxTQUFTTyxrQkFBa0JBLENBQUNGLElBQUksRUFBRTtJQUM5QjtJQUNBLElBQU1TLG1CQUFtQixHQUFHekIsUUFBUSxDQUFDRyxjQUFjLENBQUMscUJBQXFCLENBQUM7SUFDMUUsSUFBTXVCLFNBQVMsR0FBRzFCLFFBQVEsQ0FBQzJCLGFBQWEsQ0FBQyw2QkFBNkIsQ0FBQztJQUN2RSxJQUFJRixtQkFBbUIsRUFBRUEsbUJBQW1CLENBQUNHLEtBQUssQ0FBQ0MsT0FBTyxHQUFHLE1BQU07SUFDbkUsSUFBSUgsU0FBUyxFQUFFQSxTQUFTLENBQUNFLEtBQUssQ0FBQ0MsT0FBTyxHQUFHLE9BQU87O0lBRWhEO0lBQ0EsSUFBTUMsV0FBVyxHQUFHOUIsUUFBUSxDQUFDRyxjQUFjLENBQUMsYUFBYSxDQUFDO0lBQzFELElBQUkyQixXQUFXLEVBQUVBLFdBQVcsQ0FBQ2pCLFdBQVcsR0FBR0csSUFBSSxDQUFDZSxVQUFVLElBQUksRUFBRTs7SUFFaEU7SUFDQUMsY0FBYyxDQUFDLGFBQWEsRUFBRWhCLElBQUksQ0FBQ2UsVUFBVSxDQUFDO0lBQzlDQyxjQUFjLENBQUMsaUJBQWlCLEVBQUVoQixJQUFJLENBQUNpQixZQUFZLENBQUM7SUFDcERELGNBQWMsQ0FBQyxpQkFBaUIsRUFBRWhCLElBQUksQ0FBQ2tCLGNBQWMsQ0FBQztJQUN0REYsY0FBYyxDQUFDLGtCQUFrQixFQUFFaEIsSUFBSSxDQUFDbUIsU0FBUyxDQUFDO0lBQ2xESCxjQUFjLENBQUMsZUFBZSxFQUFFaEIsSUFBSSxDQUFDb0IsTUFBTSxDQUFDOztJQUU1QztJQUNBLElBQU1DLFFBQVEsR0FBR3JDLFFBQVEsQ0FBQ0csY0FBYyxDQUFDLGtCQUFrQixDQUFDO0lBQzVELElBQU1tQyxTQUFTLEdBQUd0QyxRQUFRLENBQUNHLGNBQWMsQ0FBQyxpQkFBaUIsQ0FBQztJQUM1RCxJQUFJYSxJQUFJLENBQUN1QixjQUFjLEVBQUU7TUFDckJQLGNBQWMsQ0FBQyxpQkFBaUIsRUFBRWhCLElBQUksQ0FBQ3VCLGNBQWMsQ0FBQztNQUN0RCxJQUFJRixRQUFRLEVBQUVBLFFBQVEsQ0FBQ1QsS0FBSyxDQUFDQyxPQUFPLEdBQUcsRUFBRTtJQUM3QyxDQUFDLE1BQU07TUFDSCxJQUFJUSxRQUFRLEVBQUVBLFFBQVEsQ0FBQ1QsS0FBSyxDQUFDQyxPQUFPLEdBQUcsTUFBTTtJQUNqRDs7SUFFQTtJQUNBLElBQU1XLGVBQWUsR0FBR3hDLFFBQVEsQ0FBQ0csY0FBYyxDQUFDLG9CQUFvQixDQUFDO0lBQ3JFLElBQUlxQyxlQUFlLElBQUl4QixJQUFJLENBQUN5QixNQUFNLElBQUlDLEtBQUssQ0FBQ0MsT0FBTyxDQUFDM0IsSUFBSSxDQUFDeUIsTUFBTSxDQUFDLEVBQUU7TUFDOURELGVBQWUsQ0FBQ0ksU0FBUyxHQUFHNUIsSUFBSSxDQUFDeUIsTUFBTSxDQUFDSSxHQUFHLENBQUMsVUFBQUosTUFBTTtRQUFBLHNJQUFBSyxNQUFBLENBQytFTCxNQUFNO01BQUEsQ0FDdkksQ0FBQyxDQUFDTSxJQUFJLENBQUMsRUFBRSxDQUFDO0lBQ2Q7O0lBRUE7SUFDQSxJQUFNQyxXQUFXLEdBQUdoRCxRQUFRLENBQUNHLGNBQWMsQ0FBQyxnQkFBZ0IsQ0FBQztJQUM3RCxJQUFJNkMsV0FBVyxJQUFJaEMsSUFBSSxDQUFDaUMsVUFBVSxJQUFJUCxLQUFLLENBQUNDLE9BQU8sQ0FBQzNCLElBQUksQ0FBQ2lDLFVBQVUsQ0FBQyxFQUFFO01BQ2xFRCxXQUFXLENBQUNKLFNBQVMsR0FBRzVCLElBQUksQ0FBQ2lDLFVBQVUsQ0FBQ0osR0FBRyxDQUFDLFVBQUFLLEVBQUU7UUFBQSx5REFBQUosTUFBQSxDQUNNSSxFQUFFO01BQUEsQ0FDdEQsQ0FBQyxDQUFDSCxJQUFJLENBQUMsRUFBRSxDQUFDO0lBQ2Q7O0lBRUE7SUFDQSxJQUFNSSxRQUFRLEdBQUduRCxRQUFRLENBQUNHLGNBQWMsQ0FBQyxVQUFVLENBQUM7SUFDcEQsSUFBSWdELFFBQVEsSUFBSW5DLElBQUksQ0FBQ2UsVUFBVSxFQUFFO01BQzdCLElBQU1xQixRQUFRLG1EQUFBTixNQUFBLENBQW1ETyxrQkFBa0IsQ0FBQ0MsTUFBTSxDQUFDQyxRQUFRLENBQUNDLE1BQU0sR0FBR0YsTUFBTSxDQUFDQyxRQUFRLENBQUNFLFFBQVEsR0FBRyxVQUFVLEdBQUd6QyxJQUFJLENBQUNlLFVBQVUsQ0FBQyxDQUFFO01BQ3ZLb0IsUUFBUSxDQUFDTyxJQUFJLEdBQUdOLFFBQVE7TUFDeEJELFFBQVEsQ0FBQ3pDLFNBQVMsQ0FBQ0MsTUFBTSxDQUFDLFFBQVEsQ0FBQztJQUN2QztFQUNKO0VBRUEsU0FBU1csc0JBQXNCQSxDQUFDTixJQUFJLEVBQUU7SUFDbEM7SUFDQSxJQUFNUyxtQkFBbUIsR0FBR3pCLFFBQVEsQ0FBQ0csY0FBYyxDQUFDLHFCQUFxQixDQUFDO0lBQzFFLElBQU11QixTQUFTLEdBQUcxQixRQUFRLENBQUMyQixhQUFhLENBQUMsNkJBQTZCLENBQUM7SUFDdkUsSUFBSUQsU0FBUyxFQUFFQSxTQUFTLENBQUNoQixTQUFTLENBQUNFLEdBQUcsQ0FBQyxRQUFRLENBQUM7SUFDaEQsSUFBSWEsbUJBQW1CLEVBQUVBLG1CQUFtQixDQUFDZixTQUFTLENBQUNDLE1BQU0sQ0FBQyxRQUFRLENBQUM7SUFFdkUsSUFBTWdELEtBQUssR0FBRzNELFFBQVEsQ0FBQ0csY0FBYyxDQUFDLG1CQUFtQixDQUFDO0lBQzFELElBQU15RCxJQUFJLEdBQUc1RCxRQUFRLENBQUNHLGNBQWMsQ0FBQyxrQkFBa0IsQ0FBQztJQUN4RCxJQUFNMEQsS0FBSyxHQUFHN0QsUUFBUSxDQUFDRyxjQUFjLENBQUMsbUJBQW1CLENBQUM7SUFDMUQsSUFBTTJELE9BQU8sR0FBRzlELFFBQVEsQ0FBQ0csY0FBYyxDQUFDLHFCQUFxQixDQUFDO0lBRTlELElBQUlhLElBQUksQ0FBQ0ksU0FBUyxFQUFFO01BQUEsSUFBQTJDLG9CQUFBLEVBQUFDLHFCQUFBO01BQ2hCTCxLQUFLLENBQUNNLFNBQVMsR0FBRyxvREFBb0Q7TUFDdEVMLElBQUksQ0FBQ2hCLFNBQVMscVBBRVA7TUFDUGlCLEtBQUssQ0FBQ2hELFdBQVcsR0FBRyxFQUFBa0Qsb0JBQUEsR0FBQVQsTUFBTSxDQUFDWSxZQUFZLGNBQUFILG9CQUFBLHVCQUFuQkEsb0JBQUEsQ0FBcUJJLGVBQWUsS0FBSSxrQkFBa0I7TUFDOUVOLEtBQUssQ0FBQ0ksU0FBUyxHQUFHLG9DQUFvQztNQUN0REgsT0FBTyxDQUFDakQsV0FBVyxNQUFBaUMsTUFBQSxDQUFNOUIsSUFBSSxDQUFDRyxNQUFNLE9BQUEyQixNQUFBLENBQUksRUFBQWtCLHFCQUFBLEdBQUFWLE1BQU0sQ0FBQ1ksWUFBWSxjQUFBRixxQkFBQSx1QkFBbkJBLHFCQUFBLENBQXFCSSxXQUFXLEtBQUksK0JBQStCLENBQUU7TUFDN0dOLE9BQU8sQ0FBQ0csU0FBUyxHQUFHLHdCQUF3QjtJQUNoRCxDQUFDLE1BQU07TUFBQSxJQUFBSSxxQkFBQSxFQUFBQyxxQkFBQTtNQUNIWCxLQUFLLENBQUNNLFNBQVMsR0FBRyxnREFBZ0Q7TUFDbEVMLElBQUksQ0FBQ2hCLFNBQVMseVBBRVA7TUFDUGlCLEtBQUssQ0FBQ2hELFdBQVcsR0FBRyxFQUFBd0QscUJBQUEsR0FBQWYsTUFBTSxDQUFDWSxZQUFZLGNBQUFHLHFCQUFBLHVCQUFuQkEscUJBQUEsQ0FBcUJFLGlCQUFpQixLQUFJLG9CQUFvQjtNQUNsRlYsS0FBSyxDQUFDSSxTQUFTLEdBQUcsa0NBQWtDO01BQ3BESCxPQUFPLENBQUNqRCxXQUFXLEdBQUdHLElBQUksQ0FBQ3lCLE1BQU0sT0FBQUssTUFBQSxDQUFPOUIsSUFBSSxDQUFDRyxNQUFNLE9BQUEyQixNQUFBLENBQUksRUFBQXdCLHFCQUFBLEdBQUFoQixNQUFNLENBQUNZLFlBQVksY0FBQUkscUJBQUEsdUJBQW5CQSxxQkFBQSxDQUFxQkUsY0FBYyxLQUFJLG1DQUFtQyxDQUFFO01BQ25JVixPQUFPLENBQUNHLFNBQVMsR0FBRyxzQkFBc0I7SUFDOUM7O0lBRUE7SUFDQSxJQUFNbkMsV0FBVyxHQUFHOUIsUUFBUSxDQUFDRyxjQUFjLENBQUMsYUFBYSxDQUFDO0lBQzFELElBQUkyQixXQUFXLEVBQUVBLFdBQVcsQ0FBQ2pCLFdBQVcsR0FBR0csSUFBSSxDQUFDRyxNQUFNLElBQUksRUFBRTtFQUNoRTtFQUVBLFNBQVNhLGNBQWNBLENBQUN5QyxTQUFTLEVBQUVDLElBQUksRUFBRTtJQUNyQyxJQUFNQyxPQUFPLEdBQUczRSxRQUFRLENBQUNHLGNBQWMsQ0FBQ3NFLFNBQVMsQ0FBQztJQUNsRCxJQUFJRSxPQUFPLEVBQUU7TUFDVEEsT0FBTyxDQUFDOUQsV0FBVyxHQUFHNkQsSUFBSSxJQUFJLEVBQUU7SUFDcEM7RUFDSjtFQUVBLFNBQVNFLFNBQVNBLENBQUNkLE9BQU8sRUFBRTtJQUN4QjVELFdBQVcsQ0FBQ1EsU0FBUyxDQUFDRSxHQUFHLENBQUMsZ0JBQWdCLENBQUM7SUFDM0NKLFdBQVcsQ0FBQ0ssV0FBVyxHQUFHaUQsT0FBTztJQUNqQ3RELFdBQVcsQ0FBQ0UsU0FBUyxDQUFDQyxNQUFNLENBQUMsUUFBUSxDQUFDO0VBQzFDO0VBRUEsU0FBU2tFLFdBQVdBLENBQUNDLEdBQUcsRUFBRTtJQUN0QixJQUFNM0QsTUFBTSxHQUFHakIsV0FBVyxDQUFDNkUsS0FBSyxDQUFDQyxJQUFJLENBQUMsQ0FBQztJQUN2QyxJQUFJLENBQUM3RCxNQUFNLEVBQUU7TUFBQSxJQUFBOEQscUJBQUE7TUFDVEwsU0FBUyxDQUFDLEVBQUFLLHFCQUFBLEdBQUEzQixNQUFNLENBQUNZLFlBQVksY0FBQWUscUJBQUEsdUJBQW5CQSxxQkFBQSxDQUFxQkMsY0FBYyxLQUFJLDBCQUEwQixDQUFDO01BQzVFO0lBQ0o7SUFFQXpFLFdBQVcsQ0FBQyxDQUFDO0lBRWIwRSxLQUFLLENBQUNMLEdBQUcsRUFBRTtNQUNQTSxNQUFNLEVBQUUsTUFBTTtNQUNkQyxPQUFPLEVBQUU7UUFDTCxjQUFjLEVBQUUsa0JBQWtCO1FBQ2xDLGNBQWMsRUFBRXJGLFFBQVEsQ0FBQzJCLGFBQWEsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDMkQsWUFBWSxDQUFDLFNBQVM7TUFDNUYsQ0FBQztNQUNEQyxJQUFJLEVBQUVDLElBQUksQ0FBQ0MsU0FBUyxDQUFDO1FBQUV0RSxNQUFNLEVBQUVBO01BQU8sQ0FBQztJQUMzQyxDQUFDLENBQUMsQ0FDRHVFLElBQUksQ0FBQyxVQUFBQyxRQUFRO01BQUEsT0FBSUEsUUFBUSxDQUFDQyxJQUFJLENBQUMsQ0FBQztJQUFBLEVBQUMsQ0FDakNGLElBQUksQ0FBQyxVQUFBMUUsSUFBSSxFQUFJO01BQ1ZGLFdBQVcsQ0FBQyxDQUFDO01BQ2JDLFdBQVcsQ0FBQ0MsSUFBSSxDQUFDO01BRWpCLElBQUksQ0FBQ0EsSUFBSSxDQUFDQyxPQUFPLElBQUlELElBQUksQ0FBQzZFLE1BQU0sSUFBSTdFLElBQUksQ0FBQzZFLE1BQU0sQ0FBQzFFLE1BQU0sRUFBRTtRQUNwRHlELFNBQVMsQ0FBQzVELElBQUksQ0FBQzZFLE1BQU0sQ0FBQzFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNwQztJQUNKLENBQUMsQ0FBQyxTQUNJLENBQUMsVUFBQUssS0FBSyxFQUFJO01BQUEsSUFBQXNFLHFCQUFBO01BQ1poRixXQUFXLENBQUMsQ0FBQztNQUNiOEQsU0FBUyxDQUFDLEVBQUFrQixxQkFBQSxHQUFBeEMsTUFBTSxDQUFDWSxZQUFZLGNBQUE0QixxQkFBQSx1QkFBbkJBLHFCQUFBLENBQXFCQyxZQUFZLEtBQUksa0RBQWtELENBQUM7TUFDbEd4RSxPQUFPLENBQUNDLEtBQUssQ0FBQyxRQUFRLEVBQUVBLEtBQUssQ0FBQztJQUNsQyxDQUFDLENBQUM7RUFDTjs7RUFFQTtFQUNBLElBQUlwQixnQkFBZ0IsRUFBRTtJQUNsQkEsZ0JBQWdCLENBQUNILGdCQUFnQixDQUFDLE9BQU8sRUFBRSxZQUFXO01BQUEsSUFBQStGLGNBQUE7TUFDbERuQixXQUFXLENBQUMsRUFBQW1CLGNBQUEsR0FBQTFDLE1BQU0sQ0FBQzJDLE1BQU0sY0FBQUQsY0FBQSx1QkFBYkEsY0FBQSxDQUFlRSxVQUFVLEtBQUksd0JBQXdCLENBQUM7SUFDdEUsQ0FBQyxDQUFDO0VBQ047RUFFQSxJQUFJN0Ysb0JBQW9CLEVBQUU7SUFDdEJBLG9CQUFvQixDQUFDSixnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsWUFBVztNQUFBLElBQUFrRyxlQUFBO01BQ3REdEIsV0FBVyxDQUFDLEVBQUFzQixlQUFBLEdBQUE3QyxNQUFNLENBQUMyQyxNQUFNLGNBQUFFLGVBQUEsdUJBQWJBLGVBQUEsQ0FBZUMsaUJBQWlCLEtBQUksK0JBQStCLENBQUM7SUFDcEYsQ0FBQyxDQUFDO0VBQ047O0VBRUE7RUFDQSxJQUFJbEcsV0FBVyxFQUFFO0lBQ2JBLFdBQVcsQ0FBQ0QsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLFlBQVc7TUFDN0NDLFdBQVcsQ0FBQ1EsU0FBUyxDQUFDQyxNQUFNLENBQUMsZ0JBQWdCLENBQUM7TUFDOUNILFdBQVcsQ0FBQ0UsU0FBUyxDQUFDRSxHQUFHLENBQUMsUUFBUSxDQUFDO01BQ25DSixXQUFXLENBQUNLLFdBQVcsR0FBRyxFQUFFO0lBQ2hDLENBQUMsQ0FBQztFQUNOO0FBQ0osQ0FBQyxDQUFDIiwiaWdub3JlTGlzdCI6W10sImZpbGUiOiIuL3Jlc291cmNlcy9qcy93aG9pcy5qcyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./resources/js/whois.js\n"); +eval("document.addEventListener('DOMContentLoaded', function () {\n var domainInput = document.getElementById('domain');\n var getDomainInfoBtn = document.getElementById('getDomainInfo');\n var checkAvailabilityBtn = document.getElementById('checkAvailability');\n var loading = document.getElementById('loading');\n var results = document.getElementById('results');\n var domainError = document.getElementById('domainError');\n function showLoading() {\n loading.classList.remove('hidden');\n results.classList.add('hidden');\n domainInput.classList.remove('border-red-500');\n domainError.classList.add('hidden');\n domainError.textContent = '';\n }\n function hideLoading() {\n loading.classList.add('hidden');\n }\n function showResults(data) {\n if (data.success && data.data) {\n populateWhoisTable(data.data);\n results.classList.remove('hidden');\n } else if (data.data && data.data.domain && data.data.available !== undefined) {\n // Availability check result\n showAvailabilityResult(data.data);\n results.classList.remove('hidden');\n } else {\n // Fallback to console log for unexpected format\n console.error('Unexpected response format:', data);\n results.classList.remove('hidden');\n }\n }\n function populateWhoisTable(data) {\n // Hide availability results and show whois table\n var availabilityResults = document.getElementById('availabilityResults');\n var whoisInfo = document.querySelector('.who-info .table-responsive');\n if (availabilityResults) availabilityResults.style.display = 'none';\n if (whoisInfo) whoisInfo.style.display = 'block';\n\n // Set domain title\n var domainTitle = document.getElementById('domainTitle');\n if (domainTitle) domainTitle.textContent = data.domainName || '';\n\n // Set individual fields\n setElementText('domain_name', data.domainName);\n setElementText('domain_reg_date', data.creationDate);\n setElementText('domain_exp_date', data.expirationDate);\n setElementText('domain_registrar', data.registrar);\n setElementText('domain_dnssec', data.DNSSEC);\n\n // Handle registrant name\n var ownerRow = document.getElementById('domain_owner_row');\n var ownerName = document.getElementById('domain_own_name');\n if (data.registrantName) {\n setElementText('domain_own_name', data.registrantName);\n if (ownerRow) ownerRow.style.display = '';\n } else {\n if (ownerRow) ownerRow.style.display = 'none';\n }\n\n // Handle status array\n var statusContainer = document.getElementById('domain_status_list');\n if (statusContainer && data.status && Array.isArray(data.status)) {\n statusContainer.innerHTML = data.status.map(function (status) {\n return \"\".concat(status, \"\");\n }).join('');\n }\n\n // Handle nameserver array\n var nsContainer = document.getElementById('domain_ns_list');\n if (nsContainer && data.nameServer && Array.isArray(data.nameServer)) {\n nsContainer.innerHTML = data.nameServer.map(function (ns) {\n return \"\".concat(ns, \"\");\n }).join('');\n }\n\n // Setup share button\n var shareBtn = document.getElementById('shareBtn');\n if (shareBtn && data.domainName) {\n var shareUrl = \"https://www.facebook.com/sharer/sharer.php?u=\".concat(encodeURIComponent(window.location.origin + window.location.pathname + '?domain=' + data.domainName));\n shareBtn.href = shareUrl;\n shareBtn.classList.remove('hidden');\n }\n }\n function showAvailabilityResult(data) {\n // Hide whois table and show availability results\n var availabilityResults = document.getElementById('availabilityResults');\n var whoisInfo = document.querySelector('.who-info .table-responsive');\n if (whoisInfo) whoisInfo.classList.add('hidden');\n if (availabilityResults) availabilityResults.classList.remove('hidden');\n var alert = document.getElementById('availabilityAlert');\n var icon = document.getElementById('availabilityIcon');\n var title = document.getElementById('availabilityTitle');\n var message = document.getElementById('availabilityMessage');\n if (data.available) {\n var _window$translations, _window$translations2;\n alert.className = 'rounded-lg p-4 bg-green-50 border border-green-200';\n icon.innerHTML = \"\\n \\n \";\n title.textContent = ((_window$translations = window.translations) === null || _window$translations === void 0 ? void 0 : _window$translations.domainAvailable) || 'Domain Available';\n title.className = 'text-sm font-medium text-green-800';\n message.textContent = \"\".concat(data.domain, \" \").concat(((_window$translations2 = window.translations) === null || _window$translations2 === void 0 ? void 0 : _window$translations2.isAvailable) || 'is available for registration');\n message.className = 'text-sm text-green-700';\n } else {\n var _window$translations3, _window$translations4;\n alert.className = 'rounded-lg p-4 bg-red-50 border border-red-200';\n icon.innerHTML = \"\\n \\n \";\n title.textContent = ((_window$translations3 = window.translations) === null || _window$translations3 === void 0 ? void 0 : _window$translations3.domainUnavailable) || 'Domain Unavailable';\n title.className = 'text-sm font-medium text-red-800';\n message.textContent = data.status || \"\".concat(data.domain, \" \").concat(((_window$translations4 = window.translations) === null || _window$translations4 === void 0 ? void 0 : _window$translations4.isNotAvailable) || 'is not available for registration');\n message.className = 'text-sm text-red-700';\n }\n\n // Set domain title\n var domainTitle = document.getElementById('domainTitle');\n if (domainTitle) domainTitle.textContent = data.domain || '';\n }\n function setElementText(elementId, text) {\n var element = document.getElementById(elementId);\n if (element) {\n element.textContent = text || '';\n }\n }\n function showError(message) {\n domainInput.classList.add('border-red-500');\n domainError.textContent = message;\n domainError.classList.remove('hidden');\n }\n function makeRequest(url) {\n var domain = domainInput.value.trim();\n if (!domain) {\n var _window$translations5;\n showError(((_window$translations5 = window.translations) === null || _window$translations5 === void 0 ? void 0 : _window$translations5.domainRequired) || 'Domain name is required.');\n return;\n }\n showLoading();\n fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-CSRF-TOKEN': document.querySelector('meta[name=\"csrf-token\"]').getAttribute('content')\n },\n body: JSON.stringify({\n domain: domain\n })\n }).then(function (response) {\n return response.json();\n }).then(function (data) {\n hideLoading();\n showResults(data);\n if (!data.success && data.errors && data.errors.domain) {\n showError(data.errors.domain[0]);\n }\n })[\"catch\"](function (error) {\n var _window$translations6;\n hideLoading();\n showError(((_window$translations6 = window.translations) === null || _window$translations6 === void 0 ? void 0 : _window$translations6.requestError) || 'An error occurred while processing your request.');\n console.error('Error:', error);\n });\n }\n\n // Event listeners\n if (getDomainInfoBtn) {\n getDomainInfoBtn.addEventListener('click', function () {\n var _window$routes;\n makeRequest(((_window$routes = window.routes) === null || _window$routes === void 0 ? void 0 : _window$routes.domainInfo) || '/api/whois/domain-info');\n });\n }\n if (checkAvailabilityBtn) {\n checkAvailabilityBtn.addEventListener('click', function () {\n var _window$routes2;\n makeRequest(((_window$routes2 = window.routes) === null || _window$routes2 === void 0 ? void 0 : _window$routes2.checkAvailability) || '/api/whois/check-availability');\n });\n }\n\n // Clear errors on input\n if (domainInput) {\n domainInput.addEventListener('input', function () {\n domainInput.classList.remove('border-red-500');\n domainError.classList.add('hidden');\n domainError.textContent = '';\n });\n }\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvd2hvaXMuanMiLCJuYW1lcyI6WyJkb2N1bWVudCIsImFkZEV2ZW50TGlzdGVuZXIiLCJkb21haW5JbnB1dCIsImdldEVsZW1lbnRCeUlkIiwiZ2V0RG9tYWluSW5mb0J0biIsImNoZWNrQXZhaWxhYmlsaXR5QnRuIiwibG9hZGluZyIsInJlc3VsdHMiLCJkb21haW5FcnJvciIsInNob3dMb2FkaW5nIiwiY2xhc3NMaXN0IiwicmVtb3ZlIiwiYWRkIiwidGV4dENvbnRlbnQiLCJoaWRlTG9hZGluZyIsInNob3dSZXN1bHRzIiwiZGF0YSIsInN1Y2Nlc3MiLCJwb3B1bGF0ZVdob2lzVGFibGUiLCJkb21haW4iLCJhdmFpbGFibGUiLCJ1bmRlZmluZWQiLCJzaG93QXZhaWxhYmlsaXR5UmVzdWx0IiwiY29uc29sZSIsImVycm9yIiwiYXZhaWxhYmlsaXR5UmVzdWx0cyIsIndob2lzSW5mbyIsInF1ZXJ5U2VsZWN0b3IiLCJzdHlsZSIsImRpc3BsYXkiLCJkb21haW5UaXRsZSIsImRvbWFpbk5hbWUiLCJzZXRFbGVtZW50VGV4dCIsImNyZWF0aW9uRGF0ZSIsImV4cGlyYXRpb25EYXRlIiwicmVnaXN0cmFyIiwiRE5TU0VDIiwib3duZXJSb3ciLCJvd25lck5hbWUiLCJyZWdpc3RyYW50TmFtZSIsInN0YXR1c0NvbnRhaW5lciIsInN0YXR1cyIsIkFycmF5IiwiaXNBcnJheSIsImlubmVySFRNTCIsIm1hcCIsImNvbmNhdCIsImpvaW4iLCJuc0NvbnRhaW5lciIsIm5hbWVTZXJ2ZXIiLCJucyIsInNoYXJlQnRuIiwic2hhcmVVcmwiLCJlbmNvZGVVUklDb21wb25lbnQiLCJ3aW5kb3ciLCJsb2NhdGlvbiIsIm9yaWdpbiIsInBhdGhuYW1lIiwiaHJlZiIsImFsZXJ0IiwiaWNvbiIsInRpdGxlIiwibWVzc2FnZSIsIl93aW5kb3ckdHJhbnNsYXRpb25zIiwiX3dpbmRvdyR0cmFuc2xhdGlvbnMyIiwiY2xhc3NOYW1lIiwidHJhbnNsYXRpb25zIiwiZG9tYWluQXZhaWxhYmxlIiwiaXNBdmFpbGFibGUiLCJfd2luZG93JHRyYW5zbGF0aW9uczMiLCJfd2luZG93JHRyYW5zbGF0aW9uczQiLCJkb21haW5VbmF2YWlsYWJsZSIsImlzTm90QXZhaWxhYmxlIiwiZWxlbWVudElkIiwidGV4dCIsImVsZW1lbnQiLCJzaG93RXJyb3IiLCJtYWtlUmVxdWVzdCIsInVybCIsInZhbHVlIiwidHJpbSIsIl93aW5kb3ckdHJhbnNsYXRpb25zNSIsImRvbWFpblJlcXVpcmVkIiwiZmV0Y2giLCJtZXRob2QiLCJoZWFkZXJzIiwiZ2V0QXR0cmlidXRlIiwiYm9keSIsIkpTT04iLCJzdHJpbmdpZnkiLCJ0aGVuIiwicmVzcG9uc2UiLCJqc29uIiwiZXJyb3JzIiwiX3dpbmRvdyR0cmFuc2xhdGlvbnM2IiwicmVxdWVzdEVycm9yIiwiX3dpbmRvdyRyb3V0ZXMiLCJyb3V0ZXMiLCJkb21haW5JbmZvIiwiX3dpbmRvdyRyb3V0ZXMyIiwiY2hlY2tBdmFpbGFiaWxpdHkiXSwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3Jlc291cmNlcy9qcy93aG9pcy5qcz9lMGUwIl0sInNvdXJjZXNDb250ZW50IjpbImRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBmdW5jdGlvbigpIHtcclxuICAgIGNvbnN0IGRvbWFpbklucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RvbWFpbicpO1xyXG4gICAgY29uc3QgZ2V0RG9tYWluSW5mb0J0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdnZXREb21haW5JbmZvJyk7XHJcbiAgICBjb25zdCBjaGVja0F2YWlsYWJpbGl0eUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjaGVja0F2YWlsYWJpbGl0eScpO1xyXG4gICAgY29uc3QgbG9hZGluZyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2FkaW5nJyk7XHJcbiAgICBjb25zdCByZXN1bHRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Jlc3VsdHMnKTtcclxuICAgIGNvbnN0IGRvbWFpbkVycm9yID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RvbWFpbkVycm9yJyk7XHJcblxyXG4gICAgZnVuY3Rpb24gc2hvd0xvYWRpbmcoKSB7XHJcbiAgICAgICAgbG9hZGluZy5jbGFzc0xpc3QucmVtb3ZlKCdoaWRkZW4nKTtcclxuICAgICAgICByZXN1bHRzLmNsYXNzTGlzdC5hZGQoJ2hpZGRlbicpO1xyXG4gICAgICAgIGRvbWFpbklucHV0LmNsYXNzTGlzdC5yZW1vdmUoJ2JvcmRlci1yZWQtNTAwJyk7XHJcbiAgICAgICAgZG9tYWluRXJyb3IuY2xhc3NMaXN0LmFkZCgnaGlkZGVuJyk7XHJcbiAgICAgICAgZG9tYWluRXJyb3IudGV4dENvbnRlbnQgPSAnJztcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBoaWRlTG9hZGluZygpIHtcclxuICAgICAgICBsb2FkaW5nLmNsYXNzTGlzdC5hZGQoJ2hpZGRlbicpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHNob3dSZXN1bHRzKGRhdGEpIHtcclxuICAgICAgICBpZiAoZGF0YS5zdWNjZXNzICYmIGRhdGEuZGF0YSkge1xyXG4gICAgICAgICAgICBwb3B1bGF0ZVdob2lzVGFibGUoZGF0YS5kYXRhKTtcclxuICAgICAgICAgICAgcmVzdWx0cy5jbGFzc0xpc3QucmVtb3ZlKCdoaWRkZW4nKTtcclxuICAgICAgICB9IGVsc2UgaWYgKGRhdGEuZGF0YSAmJiBkYXRhLmRhdGEuZG9tYWluICYmIGRhdGEuZGF0YS5hdmFpbGFibGUgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAvLyBBdmFpbGFiaWxpdHkgY2hlY2sgcmVzdWx0XHJcbiAgICAgICAgICAgIHNob3dBdmFpbGFiaWxpdHlSZXN1bHQoZGF0YS5kYXRhKTtcclxuICAgICAgICAgICAgcmVzdWx0cy5jbGFzc0xpc3QucmVtb3ZlKCdoaWRkZW4nKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBGYWxsYmFjayB0byBjb25zb2xlIGxvZyBmb3IgdW5leHBlY3RlZCBmb3JtYXRcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcignVW5leHBlY3RlZCByZXNwb25zZSBmb3JtYXQ6JywgZGF0YSk7XHJcbiAgICAgICAgICAgIHJlc3VsdHMuY2xhc3NMaXN0LnJlbW92ZSgnaGlkZGVuJyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHBvcHVsYXRlV2hvaXNUYWJsZShkYXRhKSB7XHJcbiAgICAgICAgLy8gSGlkZSBhdmFpbGFiaWxpdHkgcmVzdWx0cyBhbmQgc2hvdyB3aG9pcyB0YWJsZVxyXG4gICAgICAgIGNvbnN0IGF2YWlsYWJpbGl0eVJlc3VsdHMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXZhaWxhYmlsaXR5UmVzdWx0cycpO1xyXG4gICAgICAgIGNvbnN0IHdob2lzSW5mbyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy53aG8taW5mbyAudGFibGUtcmVzcG9uc2l2ZScpO1xyXG4gICAgICAgIGlmIChhdmFpbGFiaWxpdHlSZXN1bHRzKSBhdmFpbGFiaWxpdHlSZXN1bHRzLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcbiAgICAgICAgaWYgKHdob2lzSW5mbykgd2hvaXNJbmZvLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xyXG5cclxuICAgICAgICAvLyBTZXQgZG9tYWluIHRpdGxlXHJcbiAgICAgICAgY29uc3QgZG9tYWluVGl0bGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG9tYWluVGl0bGUnKTtcclxuICAgICAgICBpZiAoZG9tYWluVGl0bGUpIGRvbWFpblRpdGxlLnRleHRDb250ZW50ID0gZGF0YS5kb21haW5OYW1lIHx8ICcnO1xyXG5cclxuICAgICAgICAvLyBTZXQgaW5kaXZpZHVhbCBmaWVsZHNcclxuICAgICAgICBzZXRFbGVtZW50VGV4dCgnZG9tYWluX25hbWUnLCBkYXRhLmRvbWFpbk5hbWUpO1xyXG4gICAgICAgIHNldEVsZW1lbnRUZXh0KCdkb21haW5fcmVnX2RhdGUnLCBkYXRhLmNyZWF0aW9uRGF0ZSk7XHJcbiAgICAgICAgc2V0RWxlbWVudFRleHQoJ2RvbWFpbl9leHBfZGF0ZScsIGRhdGEuZXhwaXJhdGlvbkRhdGUpO1xyXG4gICAgICAgIHNldEVsZW1lbnRUZXh0KCdkb21haW5fcmVnaXN0cmFyJywgZGF0YS5yZWdpc3RyYXIpO1xyXG4gICAgICAgIHNldEVsZW1lbnRUZXh0KCdkb21haW5fZG5zc2VjJywgZGF0YS5ETlNTRUMpO1xyXG5cclxuICAgICAgICAvLyBIYW5kbGUgcmVnaXN0cmFudCBuYW1lXHJcbiAgICAgICAgY29uc3Qgb3duZXJSb3cgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG9tYWluX293bmVyX3JvdycpO1xyXG4gICAgICAgIGNvbnN0IG93bmVyTmFtZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkb21haW5fb3duX25hbWUnKTtcclxuICAgICAgICBpZiAoZGF0YS5yZWdpc3RyYW50TmFtZSkge1xyXG4gICAgICAgICAgICBzZXRFbGVtZW50VGV4dCgnZG9tYWluX293bl9uYW1lJywgZGF0YS5yZWdpc3RyYW50TmFtZSk7XHJcbiAgICAgICAgICAgIGlmIChvd25lclJvdykgb3duZXJSb3cuc3R5bGUuZGlzcGxheSA9ICcnO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChvd25lclJvdykgb3duZXJSb3cuc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIEhhbmRsZSBzdGF0dXMgYXJyYXlcclxuICAgICAgICBjb25zdCBzdGF0dXNDb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG9tYWluX3N0YXR1c19saXN0Jyk7XHJcbiAgICAgICAgaWYgKHN0YXR1c0NvbnRhaW5lciAmJiBkYXRhLnN0YXR1cyAmJiBBcnJheS5pc0FycmF5KGRhdGEuc3RhdHVzKSkge1xyXG4gICAgICAgICAgICBzdGF0dXNDb250YWluZXIuaW5uZXJIVE1MID0gZGF0YS5zdGF0dXMubWFwKHN0YXR1cyA9PiBcclxuICAgICAgICAgICAgICAgIGA8c3BhbiBjbGFzcz1cImlubGluZS1mbGV4IGl0ZW1zLWNlbnRlciBweC0yLjUgcHktMC41IHJvdW5kZWQtZnVsbCB0ZXh0LXhzIGZvbnQtbWVkaXVtIGJnLWJsdWUtMTAwIHRleHQtYmx1ZS04MDAgbXItMSBtYi0xXCI+JHtzdGF0dXN9PC9zcGFuPmBcclxuICAgICAgICAgICAgKS5qb2luKCcnKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIEhhbmRsZSBuYW1lc2VydmVyIGFycmF5XHJcbiAgICAgICAgY29uc3QgbnNDb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG9tYWluX25zX2xpc3QnKTtcclxuICAgICAgICBpZiAobnNDb250YWluZXIgJiYgZGF0YS5uYW1lU2VydmVyICYmIEFycmF5LmlzQXJyYXkoZGF0YS5uYW1lU2VydmVyKSkge1xyXG4gICAgICAgICAgICBuc0NvbnRhaW5lci5pbm5lckhUTUwgPSBkYXRhLm5hbWVTZXJ2ZXIubWFwKG5zID0+IFxyXG4gICAgICAgICAgICAgICAgYDxkaXYgY2xhc3M9XCJmb250LW1vbm8gdGV4dC1zbSB0ZXh0LWdyYXktNzAwXCI+JHtuc308L2Rpdj5gXHJcbiAgICAgICAgICAgICkuam9pbignJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBTZXR1cCBzaGFyZSBidXR0b25cclxuICAgICAgICBjb25zdCBzaGFyZUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzaGFyZUJ0bicpO1xyXG4gICAgICAgIGlmIChzaGFyZUJ0biAmJiBkYXRhLmRvbWFpbk5hbWUpIHtcclxuICAgICAgICAgICAgY29uc3Qgc2hhcmVVcmwgPSBgaHR0cHM6Ly93d3cuZmFjZWJvb2suY29tL3NoYXJlci9zaGFyZXIucGhwP3U9JHtlbmNvZGVVUklDb21wb25lbnQod2luZG93LmxvY2F0aW9uLm9yaWdpbiArIHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSArICc/ZG9tYWluPScgKyBkYXRhLmRvbWFpbk5hbWUpfWA7XHJcbiAgICAgICAgICAgIHNoYXJlQnRuLmhyZWYgPSBzaGFyZVVybDtcclxuICAgICAgICAgICAgc2hhcmVCdG4uY2xhc3NMaXN0LnJlbW92ZSgnaGlkZGVuJyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHNob3dBdmFpbGFiaWxpdHlSZXN1bHQoZGF0YSkge1xyXG4gICAgICAgIC8vIEhpZGUgd2hvaXMgdGFibGUgYW5kIHNob3cgYXZhaWxhYmlsaXR5IHJlc3VsdHNcclxuICAgICAgICBjb25zdCBhdmFpbGFiaWxpdHlSZXN1bHRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2F2YWlsYWJpbGl0eVJlc3VsdHMnKTtcclxuICAgICAgICBjb25zdCB3aG9pc0luZm8gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcud2hvLWluZm8gLnRhYmxlLXJlc3BvbnNpdmUnKTtcclxuICAgICAgICBpZiAod2hvaXNJbmZvKSB3aG9pc0luZm8uY2xhc3NMaXN0LmFkZCgnaGlkZGVuJyk7XHJcbiAgICAgICAgaWYgKGF2YWlsYWJpbGl0eVJlc3VsdHMpIGF2YWlsYWJpbGl0eVJlc3VsdHMuY2xhc3NMaXN0LnJlbW92ZSgnaGlkZGVuJyk7XHJcblxyXG4gICAgICAgIGNvbnN0IGFsZXJ0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2F2YWlsYWJpbGl0eUFsZXJ0Jyk7XHJcbiAgICAgICAgY29uc3QgaWNvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhdmFpbGFiaWxpdHlJY29uJyk7XHJcbiAgICAgICAgY29uc3QgdGl0bGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXZhaWxhYmlsaXR5VGl0bGUnKTtcclxuICAgICAgICBjb25zdCBtZXNzYWdlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2F2YWlsYWJpbGl0eU1lc3NhZ2UnKTtcclxuXHJcbiAgICAgICAgaWYgKGRhdGEuYXZhaWxhYmxlKSB7XHJcbiAgICAgICAgICAgIGFsZXJ0LmNsYXNzTmFtZSA9ICdyb3VuZGVkLWxnIHAtNCBiZy1ncmVlbi01MCBib3JkZXIgYm9yZGVyLWdyZWVuLTIwMCc7XHJcbiAgICAgICAgICAgIGljb24uaW5uZXJIVE1MID0gYDxzdmcgY2xhc3M9XCJoLTUgdy01IHRleHQtZ3JlZW4tNjAwXCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCI+XHJcbiAgICAgICAgICAgICAgICA8cGF0aCBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBzdHJva2Utd2lkdGg9XCIyXCIgZD1cIk01IDEzbDQgNEwxOSA3XCI+PC9wYXRoPlxyXG4gICAgICAgICAgICA8L3N2Zz5gO1xyXG4gICAgICAgICAgICB0aXRsZS50ZXh0Q29udGVudCA9IHdpbmRvdy50cmFuc2xhdGlvbnM/LmRvbWFpbkF2YWlsYWJsZSB8fCAnRG9tYWluIEF2YWlsYWJsZSc7XHJcbiAgICAgICAgICAgIHRpdGxlLmNsYXNzTmFtZSA9ICd0ZXh0LXNtIGZvbnQtbWVkaXVtIHRleHQtZ3JlZW4tODAwJztcclxuICAgICAgICAgICAgbWVzc2FnZS50ZXh0Q29udGVudCA9IGAke2RhdGEuZG9tYWlufSAke3dpbmRvdy50cmFuc2xhdGlvbnM/LmlzQXZhaWxhYmxlIHx8ICdpcyBhdmFpbGFibGUgZm9yIHJlZ2lzdHJhdGlvbid9YDtcclxuICAgICAgICAgICAgbWVzc2FnZS5jbGFzc05hbWUgPSAndGV4dC1zbSB0ZXh0LWdyZWVuLTcwMCc7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgYWxlcnQuY2xhc3NOYW1lID0gJ3JvdW5kZWQtbGcgcC00IGJnLXJlZC01MCBib3JkZXIgYm9yZGVyLXJlZC0yMDAnO1xyXG4gICAgICAgICAgICBpY29uLmlubmVySFRNTCA9IGA8c3ZnIGNsYXNzPVwiaC01IHctNSB0ZXh0LXJlZC02MDBcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIj5cclxuICAgICAgICAgICAgICAgIDxwYXRoIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIHN0cm9rZS13aWR0aD1cIjJcIiBkPVwiTTYgMThMMTggNk02IDZsMTIgMTJcIj48L3BhdGg+XHJcbiAgICAgICAgICAgIDwvc3ZnPmA7XHJcbiAgICAgICAgICAgIHRpdGxlLnRleHRDb250ZW50ID0gd2luZG93LnRyYW5zbGF0aW9ucz8uZG9tYWluVW5hdmFpbGFibGUgfHwgJ0RvbWFpbiBVbmF2YWlsYWJsZSc7XHJcbiAgICAgICAgICAgIHRpdGxlLmNsYXNzTmFtZSA9ICd0ZXh0LXNtIGZvbnQtbWVkaXVtIHRleHQtcmVkLTgwMCc7XHJcbiAgICAgICAgICAgIG1lc3NhZ2UudGV4dENvbnRlbnQgPSBkYXRhLnN0YXR1cyB8fCBgJHtkYXRhLmRvbWFpbn0gJHt3aW5kb3cudHJhbnNsYXRpb25zPy5pc05vdEF2YWlsYWJsZSB8fCAnaXMgbm90IGF2YWlsYWJsZSBmb3IgcmVnaXN0cmF0aW9uJ31gO1xyXG4gICAgICAgICAgICBtZXNzYWdlLmNsYXNzTmFtZSA9ICd0ZXh0LXNtIHRleHQtcmVkLTcwMCc7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBTZXQgZG9tYWluIHRpdGxlXHJcbiAgICAgICAgY29uc3QgZG9tYWluVGl0bGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG9tYWluVGl0bGUnKTtcclxuICAgICAgICBpZiAoZG9tYWluVGl0bGUpIGRvbWFpblRpdGxlLnRleHRDb250ZW50ID0gZGF0YS5kb21haW4gfHwgJyc7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gc2V0RWxlbWVudFRleHQoZWxlbWVudElkLCB0ZXh0KSB7XHJcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsZW1lbnRJZCk7XHJcbiAgICAgICAgaWYgKGVsZW1lbnQpIHtcclxuICAgICAgICAgICAgZWxlbWVudC50ZXh0Q29udGVudCA9IHRleHQgfHwgJyc7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHNob3dFcnJvcihtZXNzYWdlKSB7XHJcbiAgICAgICAgZG9tYWluSW5wdXQuY2xhc3NMaXN0LmFkZCgnYm9yZGVyLXJlZC01MDAnKTtcclxuICAgICAgICBkb21haW5FcnJvci50ZXh0Q29udGVudCA9IG1lc3NhZ2U7XHJcbiAgICAgICAgZG9tYWluRXJyb3IuY2xhc3NMaXN0LnJlbW92ZSgnaGlkZGVuJyk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gbWFrZVJlcXVlc3QodXJsKSB7XHJcbiAgICAgICAgY29uc3QgZG9tYWluID0gZG9tYWluSW5wdXQudmFsdWUudHJpbSgpO1xyXG4gICAgICAgIGlmICghZG9tYWluKSB7XHJcbiAgICAgICAgICAgIHNob3dFcnJvcih3aW5kb3cudHJhbnNsYXRpb25zPy5kb21haW5SZXF1aXJlZCB8fCAnRG9tYWluIG5hbWUgaXMgcmVxdWlyZWQuJyk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHNob3dMb2FkaW5nKCk7XHJcblxyXG4gICAgICAgIGZldGNoKHVybCwge1xyXG4gICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcclxuICAgICAgICAgICAgaGVhZGVyczoge1xyXG4gICAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcclxuICAgICAgICAgICAgICAgICdYLUNTUkYtVE9LRU4nOiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdtZXRhW25hbWU9XCJjc3JmLXRva2VuXCJdJykuZ2V0QXR0cmlidXRlKCdjb250ZW50JylcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBkb21haW46IGRvbWFpbiB9KVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgLnRoZW4ocmVzcG9uc2UgPT4gcmVzcG9uc2UuanNvbigpKVxyXG4gICAgICAgIC50aGVuKGRhdGEgPT4ge1xyXG4gICAgICAgICAgICBoaWRlTG9hZGluZygpO1xyXG4gICAgICAgICAgICBzaG93UmVzdWx0cyhkYXRhKTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGlmICghZGF0YS5zdWNjZXNzICYmIGRhdGEuZXJyb3JzICYmIGRhdGEuZXJyb3JzLmRvbWFpbikge1xyXG4gICAgICAgICAgICAgICAgc2hvd0Vycm9yKGRhdGEuZXJyb3JzLmRvbWFpblswXSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgICAgIC5jYXRjaChlcnJvciA9PiB7XHJcbiAgICAgICAgICAgIGhpZGVMb2FkaW5nKCk7XHJcbiAgICAgICAgICAgIHNob3dFcnJvcih3aW5kb3cudHJhbnNsYXRpb25zPy5yZXF1ZXN0RXJyb3IgfHwgJ0FuIGVycm9yIG9jY3VycmVkIHdoaWxlIHByb2Nlc3NpbmcgeW91ciByZXF1ZXN0LicpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvcjonLCBlcnJvcik7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gRXZlbnQgbGlzdGVuZXJzXHJcbiAgICBpZiAoZ2V0RG9tYWluSW5mb0J0bikge1xyXG4gICAgICAgIGdldERvbWFpbkluZm9CdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgbWFrZVJlcXVlc3Qod2luZG93LnJvdXRlcz8uZG9tYWluSW5mbyB8fCAnL2FwaS93aG9pcy9kb21haW4taW5mbycpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChjaGVja0F2YWlsYWJpbGl0eUJ0bikge1xyXG4gICAgICAgIGNoZWNrQXZhaWxhYmlsaXR5QnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgIG1ha2VSZXF1ZXN0KHdpbmRvdy5yb3V0ZXM/LmNoZWNrQXZhaWxhYmlsaXR5IHx8ICcvYXBpL3dob2lzL2NoZWNrLWF2YWlsYWJpbGl0eScpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIENsZWFyIGVycm9ycyBvbiBpbnB1dFxyXG4gICAgaWYgKGRvbWFpbklucHV0KSB7XHJcbiAgICAgICAgZG9tYWluSW5wdXQuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgZG9tYWluSW5wdXQuY2xhc3NMaXN0LnJlbW92ZSgnYm9yZGVyLXJlZC01MDAnKTtcclxuICAgICAgICAgICAgZG9tYWluRXJyb3IuY2xhc3NMaXN0LmFkZCgnaGlkZGVuJyk7XHJcbiAgICAgICAgICAgIGRvbWFpbkVycm9yLnRleHRDb250ZW50ID0gJyc7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbn0pOyAiXSwibWFwcGluZ3MiOiJBQUFBQSxRQUFRLENBQUNDLGdCQUFnQixDQUFDLGtCQUFrQixFQUFFLFlBQVc7RUFDckQsSUFBTUMsV0FBVyxHQUFHRixRQUFRLENBQUNHLGNBQWMsQ0FBQyxRQUFRLENBQUM7RUFDckQsSUFBTUMsZ0JBQWdCLEdBQUdKLFFBQVEsQ0FBQ0csY0FBYyxDQUFDLGVBQWUsQ0FBQztFQUNqRSxJQUFNRSxvQkFBb0IsR0FBR0wsUUFBUSxDQUFDRyxjQUFjLENBQUMsbUJBQW1CLENBQUM7RUFDekUsSUFBTUcsT0FBTyxHQUFHTixRQUFRLENBQUNHLGNBQWMsQ0FBQyxTQUFTLENBQUM7RUFDbEQsSUFBTUksT0FBTyxHQUFHUCxRQUFRLENBQUNHLGNBQWMsQ0FBQyxTQUFTLENBQUM7RUFDbEQsSUFBTUssV0FBVyxHQUFHUixRQUFRLENB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\n//# sourceURL=webpack-internal:///./resources/js/whois.js\n"); /***/ }) diff --git a/resources/js/service/vminfo.js b/resources/js/service/vminfo.js index 9a951fc..1d849c1 100644 --- a/resources/js/service/vminfo.js +++ b/resources/js/service/vminfo.js @@ -67,12 +67,6 @@ $(document).ready(function () { const basePrice = parseFloat($productContainer.data('base-price')); const selectedMonths = parseInt(months); - console.log('Updating price display:', { - basePrice: basePrice, - selectedMonths: selectedMonths, - productContainer: $productContainer.length - }); - // Calculate prices const originalPrice = basePrice * selectedMonths; const savings = selectedMonths >= 12 ? Math.round(originalPrice * 0.1) : 0; @@ -408,50 +402,25 @@ $(document).ready(function () { // Load Guest OS info when page loads loadGuestOSInfo(); - // Debug: Show what data we have - console.log( - "Template IDs available:", - $(".guest-os") - .map(function () { - return { - templateId: $(this).data("template-id"), - hasTemplateId: Boolean($(this).data("template-id")), - }; - }) - .get() - ); - // Expose cache management to global scope for debugging window.vmInfoCache = { clear: function () { localStorage.removeItem(VM_INFO_CACHE_KEY); - console.log("VM Info cache cleared"); }, refresh: function () { this.clear(); loadGuestOSInfo(); - console.log("VM Info cache refreshed"); }, info: function () { const vmInfoCache = getVMInfoCache(); if (!vmInfoCache) { - console.log("No VM Info cache found"); return; } const templateIds = Object.keys(vmInfoCache.data); - console.log(`VM Info cache entries: ${templateIds.length}`); - console.log( - `Last updated: ${new Date( - vmInfoCache.lastUpdated - ).toLocaleString()}` - ); templateIds.forEach((templateId) => { const data = getVMInfoFromCache(templateId); - console.log( - `${templateId}: ${data ? data.formattedOS : "expired"}` - ); }); }, get: function (templateId) { @@ -459,7 +428,6 @@ $(document).ready(function () { }, remove: function (templateId) { removeVMInfoFromCache(templateId); - console.log(`Removed ${templateId} from cache`); }, raw: function () { return getVMInfoCache(); diff --git a/resources/views/admin/user/login.blade.php b/resources/views/admin/user/login.blade.php index ffc0b5f..f30ef98 100644 --- a/resources/views/admin/user/login.blade.php +++ b/resources/views/admin/user/login.blade.php @@ -14,7 +14,7 @@ - + @@ -75,8 +75,7 @@ - - + @include("alerts")