@duoduo-oba/ng-devui
Version:
DevUI components based on Angular
360 lines • 38.3 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: helper-utils.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Directive, HostListener, Input } from '@angular/core';
import { HttpParams } from '@angular/common/http';
export class HelperUtils {
/**
* @param {?} url
* @param {?=} target
* @return {?}
*/
static jumpOuterUrl(url, target = '_blank') {
if (url !== undefined) {
/** @type {?} */
const tempLink = document.createElement('a');
tempLink.style.display = 'none'; // for IE 11
tempLink.target = target;
tempLink.href = url;
document.body.appendChild(tempLink); // for IE 11, IE11需要append到document.body里面的a链接才会生效
// for IE 11, IE11需要append到document.body里面的a链接才会生效
/** @type {?} */
const event = document.createEvent('MouseEvents');
event.initEvent('click', false, true);
tempLink.dispatchEvent(event);
document.body.removeChild(tempLink); // for IE 11
}
}
/**
* @param {?} url
* @param {?=} option
* @param {?=} onError
* @return {?}
*/
static downloadFile(url, option, onError) {
if (document.querySelector('iframe[name=' + (option && option.iframename || 'download') + ']')) {
document.body.removeChild(document.querySelector('iframe[name=' + (option && option.iframename || 'download') + ']'));
}
/** @type {?} */
const tempiframe = document.createElement('iframe');
tempiframe.name = option && option.iframename || 'download';
tempiframe.style.display = 'none';
/** @type {?} */
const tempform = document.createElement('form');
tempform.action = url;
tempform.method = option && option.method || 'post';
tempform.target = option && option.iframename || 'download';
tempform.enctype = option && option.enctype || 'application/x-www-form-urlencoded';
tempform.style.display = 'none';
if (option && option.params) {
Object.keys(option.params).forEach((/**
* @param {?} key
* @return {?}
*/
key => {
/** @type {?} */
const opt = document.createElement('input');
opt.name = key;
opt.value = option.params[key];
tempform.appendChild(opt);
}));
}
/** @type {?} */
const submit = document.createElement('input');
submit.type = 'submit';
tempform.appendChild(submit);
tempiframe.appendChild(tempform);
document.body.appendChild(tempiframe);
// 下载错误处理。下载成功并不会响应,因为响应头中带有Content-Disposition(下载头)的url,无法监听iframe的load事件,load事件不会触发
tempiframe.addEventListener('load', (/**
* @param {?} event
* @return {?}
*/
(event) => {
try {
/** @type {?} */
const iframeDoc = tempiframe.contentDocument;
if (onError !== undefined) {
/** @type {?} */
let response;
try {
response = JSON.parse(iframeDoc.body && iframeDoc.body.textContent);
}
catch (e) {
response = iframeDoc.body && iframeDoc.body.textContent;
}
if (!response) {
response = 'Error';
}
onError(response);
}
}
catch (e) {
onError('Error');
}
document.body.removeChild(tempiframe);
}));
tempform.submit();
}
/**
* @param {?} httpClient
* @param {?} url
* @param {?=} option
* @param {?=} onError
* @param {?=} onSuccess
* @return {?}
*/
static downloadFileByHttpClient(httpClient, url, option, onError, onSuccess) {
/** @type {?} */
const requestMethod = option && option.method && option.method.toLowerCase() || 'post';
/** @type {?} */
const requestHeaderContentType = option.enctype || 'application/x-www-form-urlencoded';
/** @type {?} */
const requestParams = option.params ? new HttpParams({
fromObject: option.params
}) : null;
/** @type {?} */
const requestUrl = url;
/** @type {?} */
const requestOptionParams = requestMethod === 'get' ? requestParams : undefined;
/** @type {?} */
const requestBody = requestMethod === 'post' ? requestParams && requestParams.toString() : undefined;
/** @type {?} */
const responseOption = option.responseOption;
/** @type {?} */
const requestOption = Object.assign({}, {
body: requestBody,
observe: 'response',
params: requestOptionParams,
headers: {
'Content-Type': requestHeaderContentType
},
responseType: 'arraybuffer'
}, {
headers: option.header
});
/** @type {?} */
const handleResponse = ((/**
* @param {?} resOption
* @return {?}
*/
resOption => {
switch (resOption) {
case 'response':
return (/**
* @param {?} res
* @return {?}
*/
(res) => res);
case 'body':
return (/**
* @param {?} res
* @return {?}
*/
(res) => {
/** @type {?} */
const arrayBuffer = (/** @type {?} */ (((/** @type {?} */ (res))).body)) || ((/** @type {?} */ (res))).error;
/** @type {?} */
const body = HelperUtils.utf8ArrayToStr(arrayBuffer);
return body;
});
case 'json':
default:
return (/**
* @param {?} res
* @return {?}
*/
(res) => {
/** @type {?} */
const arrayBuffer = (/** @type {?} */ (((/** @type {?} */ (res))).body)) || ((/** @type {?} */ (res))).error;
/** @type {?} */
let response;
try {
/** @type {?} */
const body = HelperUtils.utf8ArrayToStr(arrayBuffer);
try {
response = JSON.parse(body);
}
catch (e) {
/** @type {?} */
const parser = new DOMParser();
/** @type {?} */
const html = parser.parseFromString(body, 'text/html');
response = html.body.textContent;
}
}
catch (e) {
throw new Error('Parsing Error:' + e);
}
if (!response) {
response = 'Error';
}
return response;
});
}
}))(responseOption);
/** @type {?} */
const downloadFileFromArrayBuffer = (/**
* @param {?} data
* @param {?} filename
* @param {?} contentType
* @return {?}
*/
(data, filename, contentType) => {
if (window.navigator && window.navigator.msSaveOrOpenBlob) { // IE11 support
// IE11 support
/** @type {?} */
const blob = new Blob([data], { type: contentType });
window.navigator.msSaveOrOpenBlob(blob, filename);
}
else { // other browsers
if ('download' in document.createElement('a')) {
/** @type {?} */
const blob = new Blob([data], { type: contentType });
/** @type {?} */
const link = document.createElement('a');
link.href = URL.createObjectURL(blob);
link.download = filename;
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
URL.revokeObjectURL(link.href);
}
else {
// not support tag a download attribute use file download, filename won't support
/** @type {?} */
const file = new File([data], filename, { type: contentType });
/** @type {?} */
const exportUrl = URL.createObjectURL(file);
window.location.assign(exportUrl);
URL.revokeObjectURL(exportUrl);
}
}
});
/** @type {?} */
const getFilenameFromDisposition = (/**
* @param {?} disposition
* @return {?}
*/
(disposition) => {
/** @type {?} */
const filenamePair = disposition.split(';').filter((/**
* @param {?} str
* @return {?}
*/
str => /^filename=/.test(str.trim()))).pop();
if (filenamePair) {
/** @type {?} */
let str = filenamePair.trim();
str = str.split('=')[1];
str = str.replace(/['"]/g, '');
return decodeURIComponent(str);
}
else {
return null;
}
});
httpClient.request(requestMethod, requestUrl, requestOption).subscribe((/**
* @param {?} res
* @return {?}
*/
(res) => {
/** @type {?} */
const disposition = ((/** @type {?} */ (res.headers))).get('content-disposition');
/** @type {?} */
const contentType = ((/** @type {?} */ (res.headers))).get('content-type');
if (/^attachment/i.test(disposition) || option.downloadWithoutDispositionHeader) {
/** @type {?} */
const downloadFilename = option.filename || disposition && getFilenameFromDisposition(disposition) || url;
downloadFileFromArrayBuffer(res.body, downloadFilename, contentType);
if (onSuccess) {
onSuccess(res);
}
}
else {
if (onError) {
/** @type {?} */
let response;
try {
response = handleResponse(res);
}
catch (e) {
response = res;
}
onError(response);
}
}
}), (/**
* @param {?} err
* @return {?}
*/
err => {
if (onError) {
/** @type {?} */
let response;
try {
response = handleResponse(err);
}
catch (e) {
response = err;
}
onError(response);
}
}));
}
/**
* @private
* @param {?} arrayBuffer
* @return {?}
*/
static utf8ArrayToStr(arrayBuffer) {
if (typeof TextDecoder !== 'undefined') {
return new TextDecoder('utf-8').decode(arrayBuffer);
}
else {
/**
* fallback 方案,无TextDecoder场景使用直接解析,英文无问题,中文会存在乱码
* ie 11 下支持中文需要使用MDN推荐的 fastestsmallesttextencoderdecoder以支持TextDecoder
* npm install fastestsmallesttextencoderdecoder
* polyfill.ts includes
* ```
* // polyfill for TextDecoder on IE 11
* import 'fastestsmallesttextencoderdecoder';
* ```
*/
return String.fromCharCode.apply(null, new Uint8Array(arrayBuffer));
}
}
}
export class SimulateATagDirective {
constructor() {
this.target = '_blank';
}
/**
* @return {?}
*/
onClick() {
HelperUtils.jumpOuterUrl(this.href, this.target);
}
}
SimulateATagDirective.decorators = [
{ type: Directive, args: [{
selector: '[dSimulateATag]'
},] }
];
/** @nocollapse */
SimulateATagDirective.ctorParameters = () => [];
SimulateATagDirective.propDecorators = {
href: [{ type: Input }],
target: [{ type: Input }],
onClick: [{ type: HostListener, args: ['click',] }]
};
if (false) {
/** @type {?} */
SimulateATagDirective.prototype.href;
/** @type {?} */
SimulateATagDirective.prototype.target;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVyLXV0aWxzLmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmctZGV2dWkvY29tbW9uLyIsInNvdXJjZXMiOlsiaGVscGVyLXV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQy9ELE9BQU8sRUFBMkIsVUFBVSxFQUFtQyxNQUFNLHNCQUFzQixDQUFDO0FBRTVHLE1BQU0sT0FBTyxXQUFXOzs7Ozs7SUFDdEIsTUFBTSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsTUFBTSxHQUFHLFFBQVE7UUFDckMsSUFBSSxHQUFHLEtBQUssU0FBUyxFQUFFOztrQkFDZCxRQUFRLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUM7WUFDNUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDLENBQUssWUFBWTtZQUNqRCxRQUFRLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztZQUN6QixRQUFRLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQztZQUNwQixRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLGtEQUFrRDs7O2tCQUNqRixLQUFLLEdBQUcsUUFBUSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUM7WUFDakQsS0FBSyxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3RDLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDOUIsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxZQUFZO1NBQ3BEO0lBQ0wsQ0FBQzs7Ozs7OztJQUVELE1BQU0sQ0FBQyxZQUFZLENBQ2YsR0FBVyxFQUNYLE1BS0MsRUFDRCxPQUE0QjtRQUU1QixJQUFJLFFBQVEsQ0FBQyxhQUFhLENBQUMs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Q3ZDLElBQUksT0FBTyxXQUFXLEtBQUssV0FBVyxFQUFFO1lBQ3RDLE9BQU8sSUFBSSxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1NBQ3JEO2FBQU07WUFDTDs7Ozs7Ozs7O2VBU0c7WUFDSCxPQUFPLE1BQU0sQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxJQUFJLFVBQVUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO1NBQ3JFO0lBQ0gsQ0FBQztDQUNGO0FBS0QsTUFBTSxPQUFPLHFCQUFxQjtJQUc5QjtRQURTLFdBQU0sR0FBdUQsUUFBUSxDQUFDO0lBQ2hFLENBQUM7Ozs7SUFDTyxPQUFPO1FBQzFCLFdBQVcsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDckQsQ0FBQzs7O1lBVEosU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSxpQkFBaUI7YUFDNUI7Ozs7O21CQUVJLEtBQUs7cUJBQ0wsS0FBSztzQkFFTCxZQUFZLFNBQUMsT0FBTzs7OztJQUhyQixxQ0FBc0I7O0lBQ3RCLHVDQUErRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERpcmVjdGl2ZSwgSG9zdExpc3RlbmVyLCBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBIdHRwQ2xpZW50LCBIdHRwSGVhZGVycywgSHR0cFBhcmFtcywgSHR0cFJlc3BvbnNlLCBIdHRwRXJyb3JSZXNwb25zZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuXHJcbmV4cG9ydCBjbGFzcyBIZWxwZXJVdGlscyB7XHJcbiAgc3RhdGljIGp1bXBPdXRlclVybCh1cmwsIHRhcmdldCA9ICdfYmxhbmsnKSB7XHJcbiAgICAgICBpZiAodXJsICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgIGNvbnN0IHRlbXBMaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xyXG4gICAgICAgICAgdGVtcExpbmsuc3R5bGUuZGlzcGxheSA9ICdub25lJzsgICAgIC8vIGZvciBJRSAxMVxyXG4gICAgICAgICAgdGVtcExpbmsudGFyZ2V0ID0gdGFyZ2V0O1xyXG4gICAgICAgICAgdGVtcExpbmsuaHJlZiA9IHVybDtcclxuICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGVtcExpbmspOyAvLyBmb3IgSUUgMTEsIElFMTHpnIDopoFhcHBlbmTliLBkb2N1bWVudC5ib2R56YeM6Z2i55qEYemTvuaOpeaJjeS8mueUn+aViFxyXG4gICAgICAgICAgY29uc3QgZXZlbnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnTW91c2VFdmVudHMnKTtcclxuICAgICAgICAgIGV2ZW50LmluaXRFdmVudCgnY2xpY2snLCBmYWxzZSwgdHJ1ZSk7XHJcbiAgICAgICAgICB0ZW1wTGluay5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcclxuICAgICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQodGVtcExpbmspOyAvLyBmb3IgSUUgMTFcclxuICAgICAgfVxyXG4gIH1cclxuXHJcbiAgc3RhdGljIGRvd25sb2FkRmlsZShcclxuICAgICAgdXJsOiBzdHJpbmcsXHJcbiAgICAgIG9wdGlvbj86IHtcclxuICAgICAgICAgIG1ldGhvZD86ICdQT1NUJ3wgJ0dFVCcgfCAncG9zdCcgfCAnZ2V0JyxcclxuICAgICAgICAgIHBhcmFtcz86IHtbcHJvcGVydHk6IHN0cmluZ106IHN0cmluZ30sXHJcbiAgICAgICAgICBlbmN0eXBlPzogJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcgfCAnbXVsdGlwYXJ0L2Zvcm0tZGF0YSd8ICd0ZXh0L3BsYWluJyxcclxuICAgICAgICAgIGlmcmFtZW5hbWU/OiBzdHJpbmdcclxuICAgICAgfSxcclxuICAgICAgb25FcnJvcj86IChyZXNwb25zZSkgPT4gdm9pZFxyXG4gICkge1xyXG4gICAgICBpZiAoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignaWZyYW1lW25hbWU9JyArIChvcHRpb24gJiYgb3B0aW9uLmlmcmFtZW5hbWUgfHwgJ2Rvd25sb2FkJykgKyAnXScpKSB7XHJcbiAgICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdpZnJhbWVbbmFtZT0nICsgKG9wdGlvbiAmJiBvcHRpb24uaWZyYW1lbmFtZSB8fCAnZG93bmxvYWQnKSArICddJykpO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IHRlbXBpZnJhbWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpZnJhbWUnKTtcclxuICAgICAgdGVtcGlmcmFtZS5uYW1lID0gb3B0aW9uICYmIG9wdGlvbi5pZnJhbWVuYW1lIHx8ICdkb3dubG9hZCc7XHJcbiAgICAgIHRlbXBpZnJhbWUuc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuXHJcbiAgICAgIGNvbnN0IHRlbXBmb3JtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZm9ybScpO1xyXG4gICAgICB0ZW1wZm9ybS5hY3Rpb24gPSB1cmw7XHJcbiAgICAgIHRlbXBmb3JtLm1ldGhvZCA9IG9wdGlvbiAmJiBvcHRpb24ubWV0aG9kIHx8ICdwb3N0JztcclxuICAgICAgdGVtcGZvcm0udGFyZ2V0ID0gb3B0aW9uICYmIG9wdGlvbi5pZnJhbWVuYW1lIHx8ICdkb3dubG9hZCc7XHJcbiAgICAgIHRlbXBmb3JtLmVuY3R5cGUgPSBvcHRpb24gJiYgb3B0aW9uLmVuY3R5cGUgfHwgJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCc7XHJcbiAgICAgIHRlbXBmb3JtLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XHJcblxyXG4gICAgICBpZiAob3B0aW9uICYmIG9wdGlvbi5wYXJhbXMpIHtcclxuICAgICAgICAgIE9iamVjdC5rZXlzKG9wdGlvbi5wYXJhbXMpLmZvckVhY2goa2V5ID0+IHtcclxuICAgICAgICAgICAgICBjb25zdCBvcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpO1xyXG4gICAgICAgICAgICAgIG9wdC5uYW1lID0ga2V5O1xyXG4gICAgICAgICAgICAgIG9wdC52YWx1ZSA9IG9wdGlvbi5wYXJhbXNba2V5XTtcclxuICAgICAgICAgICAgICB0ZW1wZm9ybS5hcHBlbmRDaGlsZChvcHQpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IHN1Ym1pdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7XHJcbiAgICAgIHN1Ym1pdC50eXBlID0gJ3N1Ym1pdCc7XHJcblxyXG4gICAgICB0ZW1wZm9ybS5hcHBlbmRDaGlsZChzdWJtaXQpO1xyXG4gICAgICB0ZW1waWZyYW1lLmFwcGVuZENoaWxkKHRlbXBmb3JtKTtcclxuICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0ZW1waWZyYW1lKTtcclxuXHJcbiAgICAgIC8vIOS4i+i9vemUmeivr+WkhOeQhuOAguS4i+i9veaIkOWKn+W5tuS4jeS8muWTjeW6lO+8jOWboOS4uuWTjeW6lOWktOS4reW4puaciUNvbnRlbnQtRGlzcG9zaXRpb27vvIjkuIvovb3lpLTvvInnmoR1cmzvvIzml6Dms5Xnm5HlkKxpZnJhbWXnmoRsb2Fk5LqL5Lu277yMbG9hZOS6i+S7tuS4jeS8muinpuWPkVxyXG4gICAgICB0ZW1waWZyYW1lLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCAoZXZlbnQpID0+IHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGlmcmFtZURvYyA9ICB0ZW1waWZyYW1lLmNvbnRlbnREb2N1bWVudDtcclxuICAgICAgICAgICAgICAgIGlmIChvbkVycm9yICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgcmVzcG9uc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gSlNPTi5wYXJzZShpZnJhbWVEb2MuYm9keSAmJiBpZnJhbWVEb2MuYm9keS50ZXh0Q29udGVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBpZnJhbWVEb2MuYm9keSAmJiBpZnJhbWVEb2MuYm9keS50ZXh0Q29udGVudDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXNwb25zZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZSA9ICdFcnJvcic7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIG9uRXJyb3IocmVzcG9uc2UpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICBvbkVycm9yKCdFcnJvcicpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQodGVtcGlmcmFtZSk7XHJcbiAgICAgIH0pO1xyXG4gICAgICB0ZW1wZm9ybS5zdWJtaXQoKTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBkb3dubG9hZEZpbGVCeUh0dHBDbGllbnQoXHJcbiAgICBodHRwQ2xpZW50OiBIdHRwQ2xpZW50LFxyXG4gICAgdXJsOiBzdHJpbmcsXHJcbiAgICBvcHRpb24/OiB7XHJcbiAgICAgIG1ldGhvZD86ICdQT1NUJyB8ICdHRVQnIHwgJ3Bvc3QnIHwgJ2dldCcsXHJcbiAgICAgIHBhcmFtcz86IHtbcHJvcGVydHk6IHN0cmluZ106IHN0cmluZ30sXHJcbiAgICAgIGVuY3R5cGU/OiAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJyB8ICdtdWx0aXBhcnQvZm9ybS1kYXRhJyB8ICd0ZXh0L3BsYWluJyxcclxuICAgICAgaGVhZGVyPzoge1xyXG4gICAgICAgIFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB8IHN0cmluZ1tdO1xyXG4gICAgICB9LFxyXG4gICAgICByZXNwb25zZU9wdGlvbj86ICdyZXNwb25zZScgfCAnYm9keScgfCAnanNvbicsXHJcbiAgICAgIGZpbGVuYW1lPzogc3RyaW5nLFxyXG4gICAgICB3aXRoQ3JlZGVudGlhbHM/OiBib29sZWFuLFxyXG4gICAgICBkb3dubG9hZFdpdGhvdXREaXNwb3NpdGlvbkhlYWRlcj86IGJvb2xlYW5cclxuICAgIH0sXHJcbiAgICBvbkVycm9yPzogKHJlc3BvbnNlKSA9PiB2b2lkLFxyXG4gICAgb25TdWNjZXNzPzogKHJlc3BvbnNlKSA9PiB2b2lkLFxyXG4gICkge1xyXG5cclxuICAgIGNvbnN0IHJlcXVlc3RNZXRob2QgPSBvcHRpb24gJiYgb3B0aW9uLm1ldGhvZCAmJiBvcHRpb24ubWV0aG9kLnRvTG93ZXJDYXNlKCkgfHwgJ3Bvc3QnO1xyXG4gICAgY29uc3QgcmVxdWVzdEhlYWRlckNvbnRlbnRUeXBlID0gb3B0aW9uLmVuY3R5cGUgfHwgJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCc7XHJcbiAgICBjb25zdCByZXF1ZXN0UGFyYW1zID0gb3B0aW9uLnBhcmFtcyA/IG5ldyBIdHRwUGFyYW1zKHtcclxuICAgICAgZnJvbU9iamVjdDogb3B0aW9uLnBhcmFtc1xyXG4gICAgfSkgOiBudWxsO1xyXG5cclxuICAgIGNvbnN0IHJlcXVlc3RVcmwgPSB1cmw7XHJcbiAgICBjb25zdCByZXF1ZXN0T3B0aW9uUGFyYW1zID0gcmVxdWVzdE1ldGhvZCA9PT0gJ2dldCcgPyByZXF1ZXN0UGFyYW1zIDogdW5kZWZpbmVkO1xyXG4gICAgY29uc3QgcmVxdWVzdEJvZHkgPSByZXF1ZXN0TWV0aG9kID09PSAncG9zdCcgPyByZXF1ZXN0UGFyYW1zICYmIHJlcXVlc3RQYXJhbXMudG9TdHJpbmcoKSA6IHVuZGVmaW5lZDtcclxuXHJcbiAgICBjb25zdCByZXNwb25zZU9wdGlvbiA9IG9wdGlvbi5yZXNwb25zZU9wdGlvbjtcclxuXHJcbiAgICBjb25zdCByZXF1ZXN0T3B0aW9uID0gT2JqZWN0LmFzc2lnbih7fSwge1xyXG4gICAgICBib2R5OiByZXF1ZXN0Qm9keSxcclxuICAgICAgb2JzZXJ2ZTogJ3Jlc3BvbnNlJyxcclxuICAgICAgcGFyYW1zOiByZXF1ZXN0T3B0aW9uUGFyYW1zLFxyXG4gICAgICBoZWFkZXJzOiB7XHJcbiAgICAgICAgJ0NvbnRlbnQtVHlwZSc6IHJlcXVlc3RIZWFkZXJDb250ZW50VHlwZVxyXG4gICAgICB9LFxyXG4gICAgICByZXNwb25zZVR5cGU6ICdhcnJheWJ1ZmZlcidcclxuICAgIH0sIHtcclxuICAgICAgaGVhZGVyczogb3B0aW9uLmhlYWRlclxyXG4gICAgfSk7XHJcblxyXG4gICAgY29uc3QgaGFuZGxlUmVzcG9uc2UgPSAocmVzT3B0aW9uID0+IHtcclxuICAgICAgc3dpdGNoIChyZXNPcHRpb24pIHtcclxuICAgICAgICBjYXNlICdyZXNwb25zZSc6XHJcbiAgICAgICAgICByZXR1cm4gKHJlczogSHR0cFJlc3BvbnNlPEFycmF5QnVmZmVyPikgPT4gcmVzO1xyXG4gICAgICAgIGNhc2UgJ2JvZHknOlxyXG4gICAgICAgICAgcmV0dXJuIChyZXM6IEh0dHBSZXNwb25zZTxBcnJheUJ1ZmZlcj4gfCBIdHRwRXJyb3JSZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBhcnJheUJ1ZmZlciA9IDxBcnJheUJ1ZmZlcj4oPEh0dHBSZXNwb25zZTxBcnJheUJ1ZmZlcj4+cmVzKS5ib2R5IHx8ICg8SHR0cEVycm9yUmVzcG9uc2U+cmVzKS5lcnJvcjtcclxuICAgICAgICAgICAgY29uc3QgYm9keSA9IEhlbHBlclV0aWxzLnV0ZjhBcnJheVRvU3RyKGFycmF5QnVmZmVyKTtcclxuICAgICAgICAgICAgcmV0dXJuIGJvZHk7XHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgIGNhc2UgJ2pzb24nOlxyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICByZXR1cm4gKHJlczogSHR0cFJlc3BvbnNlPEFycmF5QnVmZmVyPiB8IEh0dHBFcnJvclJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGFycmF5QnVmZmVyID0gPEFycmF5QnVmZmVyPig8SHR0cFJlc3BvbnNlPEFycmF5QnVmZmVyPj5yZXMpLmJvZHkgfHwgKDxIdHRwRXJyb3JSZXNwb25zZT5yZXMpLmVycm9yO1xyXG4gICAgICAgICAgICBsZXQgcmVzcG9uc2U7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgY29uc3QgYm9keSA9IEhlbHBlclV0aWxzLnV0ZjhBcnJheVRvU3RyKGFycmF5QnVmZmVyKTtcclxuICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBKU09OLnBhcnNlKGJvZHkpO1xyXG4gICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlciA9IG5ldyBET01QYXJzZXIoKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGh0bWwgPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKGJvZHksICd0ZXh0L2h0bWwnKTtcclxuICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gaHRtbC5ib2R5LnRleHRDb250ZW50O1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUGFyc2luZyBFcnJvcjonICsgZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCFyZXNwb25zZSkge1xyXG4gICAgICAgICAgICAgICAgcmVzcG9uc2UgPSAnRXJyb3InO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiByZXNwb25zZTtcclxuICAgICAgICAgIH07XHJcbiAgICAgIH1cclxuICAgIH0pKHJlc3BvbnNlT3B0aW9uKTtcclxuXHJcbiAgICBjb25zdCBkb3dubG9hZEZpbGVGcm9tQXJyYXlCdWZmZXIgPSAoZGF0YTogQXJyYXlCdWZmZXIsIGZpbGVuYW1lOiBzdHJpbmcsIGNvbnRlbnRUeXBlOiBzdHJpbmcpID0+IHtcclxuICAgICAgaWYgKHdpbmRvdy5uYXZpZ2F0b3IgJiYgd2luZG93Lm5hdmlnYXRvci5tc1NhdmVPck9wZW5CbG9iKSB7IC8vIElFMTEgc3VwcG9ydFxyXG4gICAgICAgICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtkYXRhXSwge3R5cGU6IGNvbnRlbnRUeXBlfSk7XHJcbiAgICAgICAgICB3aW5kb3cubmF2aWdhdG9yLm1zU2F2ZU9yT3BlbkJsb2IoYmxvYiwgZmlsZW5hbWUpO1xyXG4gICAgICB9IGVsc2Ugey8vIG90aGVyIGJyb3dzZXJzXHJcbiAgICAgICAgICBpZiAoJ2Rvd25sb2FkJyBpbiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJykpIHtcclxuICAgICAgICAgICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtkYXRhXSwge3R5cGU6IGNvbnRlbnRUeXBlfSk7XHJcbiAgICAgICAgICAgIGNvbnN0IGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XHJcbiAgICAgICAgICAgIGxpbmsuaHJlZiA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XHJcbiAgICAgICAgICAgIGxpbmsuZG93bmxvYWQgPSBmaWxlbmFtZTtcclxuICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChsaW5rKTtcclxuICAgICAgICAgICAgbGluay5jbGljaygpO1xyXG4gICAgICAgICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGxpbmspO1xyXG4gICAgICAgICAgICBVUkwucmV2b2tlT2JqZWN0VVJMKGxpbmsuaHJlZik7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBub3Qgc3VwcG9ydCB0YWcgYSBkb3dubG9hZCBhdHRyaWJ1dGUgdXNlIGZpbGUgZG93bmxvYWQsIGZpbGVuYW1lIHdvbid0IHN1cHBvcnRcclxuICAgICAgICAgICAgY29uc3QgZmlsZSA9IG5ldyBGaWxlKFtkYXRhXSwgZmlsZW5hbWUsIHt0eXBlOiBjb250ZW50VHlwZX0pO1xyXG4gICAgICAgICAgICBjb25zdCBleHBvcnRVcmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGZpbGUpO1xyXG4gICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uYXNzaWduKGV4cG9ydFVybCk7XHJcbiAgICAgICAgICAgIFVSTC5yZXZva2VPYmplY3RVUkwoZXhwb3J0VXJsKTtcclxuICAgICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBnZXRGaWxlbmFtZUZyb21EaXNwb3NpdGlvbiA9IChkaXNwb3NpdGlvbjogc3RyaW5nKSA9PiB7XHJcbiAgICAgIGNvbnN0IGZpbGVuYW1lUGFpciA9ICBkaXNwb3NpdGlvbi5zcGxpdCgnOycpLmZpbHRlcihzdHIgPT4gL15maWxlbmFtZT0vLnRlc3Qoc3RyLnRyaW0oKSkpLnBvcCgpO1xyXG4gICAgICBpZiAoZmlsZW5hbWVQYWlyKSB7XHJcbiAgICAgICAgbGV0IHN0ciA9IGZpbGVuYW1lUGFpci50cmltKCk7XHJcbiAgICAgICAgc3RyID0gc3RyLnNwbGl0KCc9JylbMV07XHJcbiAgICAgICAgc3RyID0gc3RyLnJlcGxhY2UoL1snXCJdL2csICcnKTtcclxuICAgICAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KHN0cik7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG5cclxuICAgIGh0dHBDbGllbnQucmVxdWVzdChyZXF1ZXN0TWV0aG9kLCByZXF1ZXN0VXJsLCByZXF1ZXN0T3B0aW9uKS5zdWJzY3JpYmUoKHJlczogSHR0cFJlc3BvbnNlPGFueT4pID0+IHtcclxuICAgICAgY29uc3QgZGlzcG9zaXRpb24gPSAoPEh0dHBIZWFkZXJzPnJlcy5oZWFkZXJzKS5nZXQoJ2NvbnRlbnQtZGlzcG9zaXRpb24nKTtcclxuICAgICAgY29uc3QgY29udGVudFR5cGUgPSAoPEh0dHBIZWFkZXJzPnJlcy5oZWFkZXJzKS5nZXQoJ2NvbnRlbnQtdHlwZScpO1xyXG4gICAgICBpZiAoL15hdHRhY2htZW50L2kudGVzdChkaXNwb3NpdGlvbikgfHwgb3B0aW9uLmRvd25sb2FkV2l0aG91dERpc3Bvc2l0aW9uSGVhZGVyICkge1xyXG4gICAgICAgIGNvbnN0IGRvd25sb2FkRmlsZW5hbWUgPSBvcHRpb24uZmlsZW5hbWUgfHwgZGlzcG9zaXRpb24gJiYgZ2V0RmlsZW5hbWVGcm9tRGlzcG9zaXRpb24oZGlzcG9zaXRpb24pIHx8IHVybCA7XHJcbiAgICAgICAgZG93bmxvYWRGaWxlRnJvbUFycmF5QnVmZmVyKHJlcy5ib2R5LCBkb3dubG9hZEZpbGVuYW1lLCBjb250ZW50VHlwZSk7XHJcbiAgICAgICAgaWYgKG9uU3VjY2Vzcykge1xyXG4gICAgICAgICAgb25TdWNjZXNzKHJlcyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGlmIChvbkVycm9yKSB7XHJcbiAgICAgICAgICBsZXQgcmVzcG9uc2U7XHJcbiAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICByZXNwb25zZSA9IGhhbmRsZVJlc3BvbnNlKHJlcyk7XHJcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIHJlc3BvbnNlID0gcmVzO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgb25FcnJvcihyZXNwb25zZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgfSwgZXJyID0+IHtcclxuICAgICAgaWYgKG9uRXJyb3IpIHtcclxuICAgICAgICBsZXQgcmVzcG9uc2U7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIHJlc3BvbnNlID0gaGFuZGxlUmVzcG9uc2UoZXJyKTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICByZXNwb25zZSA9IGVycjtcclxuICAgICAgICB9XHJcbiAgICAgICAgb25FcnJvcihyZXNwb25zZSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzdGF0aWMgdXRmOEFycmF5VG9TdHIoYXJyYXlCdWZmZXIpIHtcclxuICAgIGlmICh0eXBlb2YgVGV4dERlY29kZXIgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgIHJldHVybiBuZXcgVGV4dERlY29kZXIoJ3V0Zi04JykuZGVjb2RlKGFycmF5QnVmZmVyKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8qKlxyXG4gICAgICAgKiBmYWxsYmFjayDmlrnmoYjvvIzml6BUZXh0RGVjb2RlcuWcuuaZr+S9v+eUqOebtOaOpeino+aekO+8jOiLseaWh+aXoOmXrumimO+8jOS4reaWh+S8muWtmOWcqOS5seeggVxyXG4gICAgICAgKiBpZSAxMSDkuIvmlK/mjIHkuK3mlofpnIDopoHkvb/nlKhNRE7mjqjojZDnmoQgZmFzdGVzdHNtYWxsZXN0dGV4dGVuY29kZXJkZWNvZGVy5Lul5pSv5oyBVGV4dERlY29kZXJcclxuICAgICAgICogbnBtIGluc3RhbGwgZmFzdGVzdHNtYWxsZXN0dGV4dGVuY29kZXJkZWNvZGVyXHJcbiAgICAgICAqIHBvbHlmaWxsLnRzIGluY2x1ZGVzXHJcbiAgICAgICAqIGBgYFxyXG4gICAgICAgKiAvLyBwb2x5ZmlsbCBmb3IgVGV4dERlY29kZXIgb24gSUUgMTFcclxuICAgICAgICogaW1wb3J0ICdmYXN0ZXN0c21hbGxlc3R0ZXh0ZW5jb2RlcmRlY29kZXInO1xyXG4gICAgICAgKiBgYGBcclxuICAgICAgICovXHJcbiAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIG5ldyBVaW50OEFycmF5KGFycmF5QnVmZmVyKSk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG5ARGlyZWN0aXZlKHtcclxuICBzZWxlY3RvcjogJ1tkU2ltdWxhdGVBVGFnXSdcclxufSlcclxuZXhwb3J0IGNsYXNzIFNpbXVsYXRlQVRhZ0RpcmVjdGl2ZSB7XHJcbiAgICBASW5wdXQoKSBocmVmOiBzdHJpbmc7XHJcbiAgICBASW5wdXQoKSB0YXJnZXQ6ICdfYmxhbmsnIHwgJ19zZWxmJyB8ICdfcGFyZW50JyB8ICdfdG9wJyB8IHN0cmluZyAgID0gJ19ibGFuayc7XHJcbiAgICBjb25zdHJ1Y3RvcigpIHt9XHJcbiAgICBASG9zdExpc3RlbmVyKCdjbGljaycpIG9uQ2xpY2soKSB7XHJcbiAgICAgICAgSGVscGVyVXRpbHMuanVtcE91dGVyVXJsKHRoaXMuaHJlZiwgdGhpcy50YXJnZXQpO1xyXG4gICAgfVxyXG59XHJcblxyXG5cclxuXHJcbiJdfQ==