UNPKG

@lxlib/seed

Version:

This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 9.1.1.

439 lines 30.9 kB
/** * @fileoverview added by tsickle * Generated from: lodop.service.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { __assign, __read, __spread } from "tslib"; import { Injectable } from '@angular/core'; import { LazyService } from '@lxlib/util'; import { of, Subject } from 'rxjs'; import { LodopConfig } from './lodop.config'; import * as i0 from "@angular/core"; import * as i1 from "./lodop.config"; import * as i2 from "@lxlib/util"; var LodopService = /** @class */ (function () { function LodopService(defCog, scriptSrv) { this.defCog = defCog; this.scriptSrv = scriptSrv; this.pending = false; this._lodop = null; this._init = new Subject(); this._events = new Subject(); this.printBuffer = []; this.cog = defCog; } Object.defineProperty(LodopService.prototype, "cog", { /** * 获取或重新设置配置 * * **注:**重新设置会倒置重新加载脚本资源 */ get: /** * 获取或重新设置配置 * * **注:**重新设置会倒置重新加载脚本资源 * @return {?} */ function () { return this._cog; }, set: /** * @param {?} value * @return {?} */ function (value) { this._cog = __assign(__assign({ url: 'https://localhost:8443/CLodopfuncs.js', name: 'CLODOP', companyName: '', checkMaxCount: 100 }, this.defCog), value); }, enumerable: true, configurable: true }); Object.defineProperty(LodopService.prototype, "events", { /** 事件变更通知 */ get: /** * 事件变更通知 * @return {?} */ function () { return this._events.asObservable(); }, enumerable: true, configurable: true }); Object.defineProperty(LodopService.prototype, "lodop", { /** 获取 lodop 对象 */ get: /** * 获取 lodop 对象 * @return {?} */ function () { if (this._lodop) return of((/** @type {?} */ ({ ok: true, lodop: this._lodop }))); if (this.pending) return this._init.asObservable(); this.request(); return this._init.asObservable(); }, enumerable: true, configurable: true }); Object.defineProperty(LodopService.prototype, "printer", { /** 获取打印机列表 */ get: /** * 获取打印机列表 * @return {?} */ function () { this.check(); /** @type {?} */ var ret = []; /** @type {?} */ var count = (/** @type {?} */ (this._lodop)).GET_PRINTER_COUNT(); for (var index = 0; index < count; index++) { ret.push((/** @type {?} */ (this._lodop)).GET_PRINTER_NAME(index)); } return ret; }, enumerable: true, configurable: true }); /** * @private * @return {?} */ LodopService.prototype.check = /** * @private * @return {?} */ function () { if (!this._lodop) throw new Error("\u8BF7\u52A1\u5FC5\u5148\u8C03\u7528 lodop \u83B7\u53D6\u5BF9\u8C61"); }; /** * @private * @return {?} */ LodopService.prototype.request = /** * @private * @return {?} */ function () { var _this = this; this.pending = true; /** @type {?} */ var url = this.cog.url + "?name=" + this.cog.name; /** @type {?} */ var checkMaxCount = (/** @type {?} */ (this.cog.checkMaxCount)); /** @type {?} */ var onResolve = (/** * @param {?} status * @param {?=} error * @return {?} */ function (status, error) { _this._init.next({ ok: status === 'ok', status: status, error: error, lodop: (/** @type {?} */ (_this._lodop)), }); }); /** @type {?} */ var checkStatus = (/** * @return {?} */ function () { --checkMaxCount; if ((/** @type {?} */ (_this._lodop)).webskt && (/** @type {?} */ (_this._lodop)).webskt.readyState === 1) { onResolve('ok'); } else { if (checkMaxCount < 0) { onResolve('check-limit'); return; } setTimeout((/** * @return {?} */ function () { return checkStatus(); }), 100); } }); this.scriptSrv.loadScript(url).then((/** * @param {?} res * @return {?} */ function (res) { if (res.status !== 'ok') { _this.pending = false; onResolve('script-load-error', res[0]); return; } /** @type {?} */ var win = (/** @type {?} */ (window)); if (win.hasOwnProperty((/** @type {?} */ (_this.cog.name)))) { _this._lodop = (/** @type {?} */ (win[(/** @type {?} */ (_this.cog.name))])); } if (_this._lodop === null) { onResolve('load-variable-name-error', { name: _this.cog.name }); return; } _this._lodop.SET_LICENSES((/** @type {?} */ (_this.cog.companyName)), _this.cog.license, _this.cog.licenseA, _this.cog.licenseB); checkStatus(); })); }; /** 重置 lodop 对象 */ /** * 重置 lodop 对象 * @return {?} */ LodopService.prototype.reset = /** * 重置 lodop 对象 * @return {?} */ function () { this._lodop = null; this.pending = false; this.request(); }; /** * 附加代码至 `lodop` 对象上,字符串类支持 `{{key}}` 的动态参数 * * **注:** 代码是指打印设计所产生字符串数据 * * @param code 代码 * @param contextObj 动态参数上下文对象 * @param parser 自定义解析表达式,默认:`/LODOP\.([^(]+)\(([^\n]+)\);/i` */ /** * 附加代码至 `lodop` 对象上,字符串类支持 `{{key}}` 的动态参数 * * **注:** 代码是指打印设计所产生字符串数据 * * @param {?} code 代码 * @param {?=} contextObj 动态参数上下文对象 * @param {?=} parser 自定义解析表达式,默认:`/LODOP\.([^(]+)\(([^\n]+)\);/i` * @return {?} */ LodopService.prototype.attachCode = /** * 附加代码至 `lodop` 对象上,字符串类支持 `{{key}}` 的动态参数 * * **注:** 代码是指打印设计所产生字符串数据 * * @param {?} code 代码 * @param {?=} contextObj 动态参数上下文对象 * @param {?=} parser 自定义解析表达式,默认:`/LODOP\.([^(]+)\(([^\n]+)\);/i` * @return {?} */ function (code, contextObj, parser) { var _this = this; this.check(); if (!parser) parser = /LODOP\.([^(]+)\(([^\n]+)\);/i; code.split('\n').forEach((/** * @param {?} line * @return {?} */ function (line) { /** @type {?} */ var res = (/** @type {?} */ (parser)).exec(line.trim()); if (!res) return; /** @type {?} */ var fn = (/** @type {?} */ (_this._lodop))[res[1]]; if (fn) { /** @type {?} */ var arr = null; try { // tslint:disable-next-line: function-constructor /** @type {?} */ var fakeFn = new Function("return [" + res[2] + "]"); arr = fakeFn(); } catch (_a) { } if (arr != null && Array.isArray(arr) && contextObj) { for (var i = 0; i < arr.length; i++) { if (typeof arr[i] === 'string') { arr[i] = ((/** @type {?} */ (arr[i]))).replace(/{{(.*?)}}/g, (/** * @param {?} _match * @param {?} key * @return {?} */ function (_match, key) { return contextObj[key.trim()] || ''; })); } } } fn.apply(_this._lodop, (/** @type {?} */ (arr))); } })); }; /** * 打开打印设计关闭后自动返回代码 * * **注:** 自动监听 `On_Return` 事件,运行后会移除 */ /** * 打开打印设计关闭后自动返回代码 * * **注:** 自动监听 `On_Return` 事件,运行后会移除 * @return {?} */ LodopService.prototype.design = /** * 打开打印设计关闭后自动返回代码 * * **注:** 自动监听 `On_Return` 事件,运行后会移除 * @return {?} */ function () { var _this = this; this.check(); /** @type {?} */ var tid = (/** @type {?} */ (this._lodop)).PRINT_DESIGN(); return new Promise((/** * @param {?} resolve * @return {?} */ function (resolve) { (/** @type {?} */ (_this._lodop)).On_Return = (/** * @param {?} taskID * @param {?} value * @return {?} */ function (taskID, value) { if (tid !== taskID) return; (/** @type {?} */ (_this._lodop)).On_Return = null; resolve('' + value); }); })); }; /** * @private * @return {?} */ LodopService.prototype.printDo = /** * @private * @return {?} */ function () { var _this = this; /** @type {?} */ var data = this.printBuffer.shift(); if (!data) return; this.attachCode(data.code, data.item, data.parser); /** @type {?} */ var tid = (/** @type {?} */ (this._lodop)).PRINT(); (/** @type {?} */ (this._lodop)).On_Return = (/** * @param {?} taskID * @param {?} value * @return {?} */ function (taskID, value) { if (tid !== taskID) return; (/** @type {?} */ (_this._lodop)).On_Return = null; _this._events.next(__assign({ ok: value === true, error: value === true ? null : value }, data)); _this.printDo(); }); }; /** * 立即打印,一般用于批量套打 * * @param code 代码 * @param contextObj 动态参数上下文对象 * @param parser 自定义解析表达式,默认:`/LODOP\.([^(]+)\(([^\n]+)\);/i` */ /** * 立即打印,一般用于批量套打 * * @param {?} code 代码 * @param {?} contextObj 动态参数上下文对象 * @param {?=} parser 自定义解析表达式,默认:`/LODOP\.([^(]+)\(([^\n]+)\);/i` * @return {?} */ LodopService.prototype.print = /** * 立即打印,一般用于批量套打 * * @param {?} code 代码 * @param {?} contextObj 动态参数上下文对象 * @param {?=} parser 自定义解析表达式,默认:`/LODOP\.([^(]+)\(([^\n]+)\);/i` * @return {?} */ function (code, contextObj, parser) { var _a; this.check(); if (contextObj) { (_a = this.printBuffer).push.apply(_a, __spread((Array.isArray(contextObj) ? contextObj : [contextObj]).map((/** * @param {?} item * @return {?} */ function (item) { return { code: code, parser: parser, item: item }; })))); } this.printDo(); }; /** * @return {?} */ LodopService.prototype.ngOnDestroy = /** * @return {?} */ function () { this._init.unsubscribe(); this._events.unsubscribe(); }; LodopService.decorators = [ { type: Injectable, args: [{ providedIn: 'root' },] } ]; /** @nocollapse */ LodopService.ctorParameters = function () { return [ { type: LodopConfig }, { type: LazyService } ]; }; /** @nocollapse */ LodopService.ɵprov = i0.ɵɵdefineInjectable({ factory: function LodopService_Factory() { return new LodopService(i0.ɵɵinject(i1.LodopConfig), i0.ɵɵinject(i2.LazyService)); }, token: LodopService, providedIn: "root" }); return LodopService; }()); export { LodopService }; if (false) { /** * @type {?} * @private */ LodopService.prototype._cog; /** * @type {?} * @private */ LodopService.prototype.pending; /** * @type {?} * @private */ LodopService.prototype._lodop; /** * @type {?} * @private */ LodopService.prototype._init; /** * @type {?} * @private */ LodopService.prototype._events; /** * @type {?} * @private */ LodopService.prototype.printBuffer; /** * @type {?} * @private */ LodopService.prototype.defCog; /** * @type {?} * @private */ LodopService.prototype.scriptSrv; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9kb3Auc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BseGxpYi9zZWVkL2xvZG9wLyIsInNvdXJjZXMiOlsibG9kb3Auc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFhLE1BQU0sZUFBZSxDQUFDO0FBQ3RELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFMUMsT0FBTyxFQUFjLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7O0FBRzdDO0lBRUUsc0JBQW9CLE1BQW1CLEVBQVUsU0FBc0I7UUFBbkQsV0FBTSxHQUFOLE1BQU0sQ0FBYTtRQUFVLGNBQVMsR0FBVCxTQUFTLENBQWE7UUFrRC9ELFlBQU8sR0FBRyxLQUFLLENBQUM7UUFDaEIsV0FBTSxHQUFpQixJQUFJLENBQUM7UUFDNUIsVUFBSyxHQUFHLElBQUksT0FBTyxFQUFlLENBQUM7UUFDbkMsWUFBTyxHQUFHLElBQUksT0FBTyxFQUFvQixDQUFDO1FBQzFDLGdCQUFXLEdBQVUsRUFBRSxDQUFDO1FBckQ5QixJQUFJLENBQUMsR0FBRyxHQUFHLE1BQU0sQ0FBQztJQUNwQixDQUFDO0lBT0Qsc0JBQUksNkJBQUc7UUFMUDs7OztXQUlHOzs7Ozs7O1FBQ0g7WUFDRSxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDbkIsQ0FBQzs7Ozs7UUFDRCxVQUFRLEtBQWtCO1lBQ3hCLElBQUksQ0FBQyxJQUFJLHVCQUNQLEdBQUcsRUFBRSx1Q0FBdUMsRUFDNUMsSUFBSSxFQUFFLFFBQVEsRUFDZCxXQUFXLEVBQUUsRUFBRSxFQUNmLGFBQWEsRUFBRSxHQUFHLElBQ2YsSUFBSSxDQUFDLE1BQU0sR0FDWCxLQUFLLENBQ1QsQ0FBQztRQUNKLENBQUM7OztPQVZBO0lBYUQsc0JBQUksZ0NBQU07UUFEVixhQUFhOzs7OztR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LFdBQVc7Ozt1QkFEcEI7Q0FxTkMsQUE5TUQsSUE4TUM7U0E3TVksWUFBWTs7Ozs7O0lBa0R2Qiw0QkFBMEI7Ozs7O0lBQzFCLCtCQUF3Qjs7Ozs7SUFDeEIsOEJBQW9DOzs7OztJQUNwQyw2QkFBMkM7Ozs7O0lBQzNDLCtCQUFrRDs7Ozs7SUFDbEQsbUNBQWdDOzs7OztJQXREcEIsOEJBQTJCOzs7OztJQUFFLGlDQUE4QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIE9uRGVzdHJveSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTGF6eVNlcnZpY2UgfSBmcm9tICdAbHhsaWIvdXRpbCc7XG5pbXBvcnQgeyBOelNhZmVBbnkgfSBmcm9tICduZy16b3Jyby1hbnRkL2NvcmUvdHlwZXMnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgb2YsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IExvZG9wQ29uZmlnIH0gZnJvbSAnLi9sb2RvcC5jb25maWcnO1xuaW1wb3J0IHsgTG9kb3AsIExvZG9wUHJpbnRSZXN1bHQsIExvZG9wUmVzdWx0IH0gZnJvbSAnLi9sb2RvcC50eXBlcyc7XG5cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgTG9kb3BTZXJ2aWNlIGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBkZWZDb2c6IExvZG9wQ29uZmlnLCBwcml2YXRlIHNjcmlwdFNydjogTGF6eVNlcnZpY2UpIHtcbiAgICB0aGlzLmNvZyA9IGRlZkNvZztcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5bmiJbph43mlrDorr7nva7phY3nva5cbiAgICpcbiAgICogKirms6jvvJoqKumHjeaWsOiuvue9ruS8muWAkue9rumHjeaWsOWKoOi9veiEmuacrOi1hOa6kFxuICAgKi9cbiAgZ2V0IGNvZygpIHtcbiAgICByZXR1cm4gdGhpcy5fY29nO1xuICB9XG4gIHNldCBjb2codmFsdWU6IExvZG9wQ29uZmlnKSB7XG4gICAgdGhpcy5fY29nID0ge1xuICAgICAgdXJsOiAnaHR0cHM6Ly9sb2NhbGhvc3Q6ODQ0My9DTG9kb3BmdW5jcy5qcycsXG4gICAgICBuYW1lOiAnQ0xPRE9QJyxcbiAgICAgIGNvbXBhbnlOYW1lOiAnJyxcbiAgICAgIGNoZWNrTWF4Q291bnQ6IDEwMCxcbiAgICAgIC4uLnRoaXMuZGVmQ29nLFxuICAgICAgLi4udmFsdWUsXG4gICAgfTtcbiAgfVxuXG4gIC8qKiDkuovku7blj5jmm7TpgJrnn6UgKi9cbiAgZ2V0IGV2ZW50cygpOiBPYnNlcnZhYmxlPExvZG9wUHJpbnRSZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy5fZXZlbnRzLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLyoqIOiOt+WPliBsb2RvcCDlr7nosaEgKi9cbiAgZ2V0IGxvZG9wKCk6IE9ic2VydmFibGU8TG9kb3BSZXN1bHQ+IHtcbiAgICBpZiAodGhpcy5fbG9kb3ApIHJldHVybiBvZih7IG9rOiB0cnVlLCBsb2RvcDogdGhpcy5fbG9kb3AgfSBhcyBMb2RvcFJlc3VsdCk7XG4gICAgaWYgKHRoaXMucGVuZGluZykgcmV0dXJuIHRoaXMuX2luaXQuYXNPYnNlcnZhYmxlKCk7XG5cbiAgICB0aGlzLnJlcXVlc3QoKTtcblxuICAgIHJldHVybiB0aGlzLl9pbml0LmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLyoqIOiOt+WPluaJk+WNsOacuuWIl+ihqCAqL1xuICBnZXQgcHJpbnRlcigpOiBzdHJpbmdbXSB7XG4gICAgdGhpcy5jaGVjaygpO1xuICAgIGNvbnN0IHJldDogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBjb3VudCA9IHRoaXMuX2xvZG9wIS5HRVRfUFJJTlRFUl9DT1VOVCgpO1xuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBjb3VudDsgaW5kZXgrKykge1xuICAgICAgcmV0LnB1c2godGhpcy5fbG9kb3AhLkdFVF9QUklOVEVSX05BTUUoaW5kZXgpKTtcbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbiAgfVxuXG4gIHByaXZhdGUgX2NvZzogTG9kb3BDb25maWc7XG4gIHByaXZhdGUgcGVuZGluZyA9IGZhbHNlO1xuICBwcml2YXRlIF9sb2RvcDogTG9kb3AgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBfaW5pdCA9IG5ldyBTdWJqZWN0PExvZG9wUmVzdWx0PigpO1xuICBwcml2YXRlIF9ldmVudHMgPSBuZXcgU3ViamVjdDxMb2RvcFByaW50UmVzdWx0PigpO1xuICBwcml2YXRlIHByaW50QnVmZmVyOiBhbnlbXSA9IFtdO1xuXG4gIHByaXZhdGUgY2hlY2soKSB7XG4gICAgaWYgKCF0aGlzLl9sb2RvcCkgdGhyb3cgbmV3IEVycm9yKGDor7fliqHlv4XlhYjosIPnlKggbG9kb3Ag6I635Y+W5a+56LGhYCk7XG4gIH1cblxuICBwcml2YXRlIHJlcXVlc3QoKTogdm9pZCB7XG4gICAgdGhpcy5wZW5kaW5nID0gdHJ1ZTtcblxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMuY29nLnVybH0/bmFtZT0ke3RoaXMuY29nLm5hbWV9YDtcbiAgICBsZXQgY2hlY2tNYXhDb3VudCA9IHRoaXMuY29nLmNoZWNrTWF4Q291bnQgYXMgbnVtYmVyO1xuICAgIGNvbnN0IG9uUmVzb2x2ZSA9IChzdGF0dXM6IE56U2FmZUFueSwgZXJyb3I/OiB7fSkgPT4ge1xuICAgICAgdGhpcy5faW5pdC5uZXh0KHtcbiAgICAgICAgb2s6IHN0YXR1cyA9PT0gJ29rJyxcbiAgICAgICAgc3RhdHVzLFxuICAgICAgICBlcnJvcixcbiAgICAgICAgbG9kb3A6IHRoaXMuX2xvZG9wISxcbiAgICAgIH0pO1xuICAgIH07XG4gICAgY29uc3QgY2hlY2tTdGF0dXMgPSAoKSA9PiB7XG4gICAgICAtLWNoZWNrTWF4Q291bnQ7XG4gICAgICBpZiAodGhpcy5fbG9kb3AhLndlYnNrdCAmJiB0aGlzLl9sb2RvcCEud2Vic2t0LnJlYWR5U3RhdGUgPT09IDEpIHtcbiAgICAgICAgb25SZXNvbHZlKCdvaycpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGNoZWNrTWF4Q291bnQgPCAwKSB7XG4gICAgICAgICAgb25SZXNvbHZlKCdjaGVjay1saW1pdCcpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IGNoZWNrU3RhdHVzKCksIDEwMCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHRoaXMuc2NyaXB0U3J2LmxvYWRTY3JpcHQodXJsKS50aGVuKChyZXM6IE56U2FmZUFueSkgPT4ge1xuICAgICAgaWYgKHJlcy5zdGF0dXMgIT09ICdvaycpIHtcbiAgICAgICAgdGhpcy5wZW5kaW5nID0gZmFsc2U7XG4gICAgICAgIG9uUmVzb2x2ZSgnc2NyaXB0LWxvYWQtZXJyb3InLCByZXNbMF0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCB3aW4gPSB3aW5kb3cgYXMgTnpTYWZlQW55O1xuICAgICAgaWYgKHdpbi5oYXNPd25Qcm9wZXJ0eSh0aGlzLmNvZy5uYW1lISkpIHtcbiAgICAgICAgdGhpcy5fbG9kb3AgPSB3aW5bdGhpcy5jb2cubmFtZSFdIGFzIExvZG9wO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuX2xvZG9wID09PSBudWxsKSB7XG4gICAgICAgIG9uUmVzb2x2ZSgnbG9hZC12YXJpYWJsZS1uYW1lLWVycm9yJywgeyBuYW1lOiB0aGlzLmNvZy5uYW1lIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLl9sb2RvcC5TRVRfTElDRU5TRVModGhpcy5jb2cuY29tcGFueU5hbWUhLCB0aGlzLmNvZy5saWNlbnNlLCB0aGlzLmNvZy5saWNlbnNlQSwgdGhpcy5jb2cubGljZW5zZUIpO1xuICAgICAgY2hlY2tTdGF0dXMoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiDph43nva4gbG9kb3Ag5a+56LGhICovXG4gIHJlc2V0KCkge1xuICAgIHRoaXMuX2xvZG9wID0gbnVsbDtcbiAgICB0aGlzLnBlbmRpbmcgPSBmYWxzZTtcbiAgICB0aGlzLnJlcXVlc3QoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDpmYTliqDku6PnoIHoh7MgYGxvZG9wYCDlr7nosaHkuIrvvIzlrZfnrKbkuLLnsbvmlK/mjIEgYHt7a2V5fX1gIOeahOWKqOaAgeWPguaVsFxuICAgKlxuICAgKiAqKuazqO+8mioqIOS7o+eggeaYr+aMh+aJk+WNsOiuvuiuoeaJgOS6p+eUn+Wtl+espuS4suaVsOaNrlxuICAgKlxuICAgKiBAcGFyYW0gY29kZSDku6PnoIFcbiAgICogQHBhcmFtIGNvbnRleHRPYmog5Yqo5oCB5Y+C5pWw5LiK5LiL5paH5a+56LGhXG4gICAqIEBwYXJhbSBwYXJzZXIg6Ieq5a6a5LmJ6Kej5p6Q6KGo6L6+5byP77yM6buY6K6k77yaYC9MT0RPUFxcLihbXihdKylcXCgoW15cXG5dKylcXCk7L2lgXG4gICAqL1xuICBhdHRhY2hDb2RlKGNvZGU6IHN0cmluZywgY29udGV4dE9iaj86IE56U2FmZUFueSwgcGFyc2VyPzogUmVnRXhwKTogdm9pZCB7XG4gICAgdGhpcy5jaGVjaygpO1xuICAgIGlmICghcGFyc2VyKSBwYXJzZXIgPSAvTE9ET1BcXC4oW14oXSspXFwoKFteXFxuXSspXFwpOy9pO1xuICAgIGNvZGUuc3BsaXQoJ1xcbicpLmZvckVhY2gobGluZSA9PiB7XG4gICAgICBjb25zdCByZXMgPSBwYXJzZXIhLmV4ZWMobGluZS50cmltKCkpO1xuICAgICAgaWYgKCFyZXMpIHJldHVybjtcbiAgICAgIGNvbnN0IGZuID0gdGhpcy5fbG9kb3AhW3Jlc1sxXV07XG4gICAgICBpZiAoZm4pIHtcbiAgICAgICAgbGV0IGFycjogYW55W10gfCBudWxsID0gbnVsbDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IGZ1bmN0aW9uLWNvbnN0cnVjdG9yXG4gICAgICAgICAgY29uc3QgZmFrZUZuID0gbmV3IEZ1bmN0aW9uKGByZXR1cm4gWyR7cmVzWzJdfV1gKTtcbiAgICAgICAgICBhcnIgPSBmYWtlRm4oKTtcbiAgICAgICAgfSBjYXRjaCB7fVxuXG4gICAgICAgIGlmIChhcnIgIT0gbnVsbCAmJiBBcnJheS5pc0FycmF5KGFycikgJiYgY29udGV4dE9iaikge1xuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGFycltpXSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgYXJyW2ldID0gKGFycltpXSBhcyBzdHJpbmcpLnJlcGxhY2UoL3t7KC4qPyl9fS9nLCAoX21hdGNoLCBrZXkpID0+IGNvbnRleHRPYmpba2V5LnRyaW0oKV0gfHwgJycpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmbi5hcHBseSh0aGlzLl9sb2RvcCwgYXJyISk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICog5omT5byA5omT5Y2w6K6+6K6h5YWz6Zet5ZCO6Ieq5Yqo6L+U5Zue5Luj56CBXG4gICAqXG4gICAqICoq5rOo77yaKiog6Ieq5Yqo55uR5ZCsIGBPbl9SZXR1cm5gIOS6i+S7tu+8jOi/kOihjOWQjuS8muenu+mZpFxuICAgKi9cbiAgZGVzaWduKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgdGhpcy5jaGVjaygpO1xuICAgIGNvbnN0IHRpZCA9IHRoaXMuX2xvZG9wIS5QUklOVF9ERVNJR04oKTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICB0aGlzLl9sb2RvcCEuT25fUmV0dXJuID0gKHRhc2tJRDogc3RyaW5nLCB2YWx1ZTogYm9vbGVhbiB8IHN0cmluZykgPT4ge1xuICAgICAgICBpZiAodGlkICE9PSB0YXNrSUQpIHJldHVybjtcbiAgICAgICAgdGhpcy5fbG9kb3AhLk9uX1JldHVybiA9IG51bGw7XG4gICAgICAgIHJlc29sdmUoJycgKyB2YWx1ZSk7XG4gICAgICB9O1xuICAgIH0pO1xuICB9XG4gIHByaXZhdGUgcHJpbnREbygpIHtcbiAgICBjb25zdCBkYXRhID0gdGhpcy5wcmludEJ1ZmZlci5zaGlmdCgpO1xuICAgIGlmICghZGF0YSkgcmV0dXJuO1xuICAgIHRoaXMuYXR0YWNoQ29kZShkYXRhLmNvZGUsIGRhdGEuaXRlbSwgZGF0YS5wYXJzZXIpO1xuICAgIGNvbnN0IHRpZCA9IHRoaXMuX2xvZG9wIS5QUklOVCgpO1xuICAgIHRoaXMuX2xvZG9wIS5Pbl9SZXR1cm4gPSAodGFza0lEOiBzdHJpbmcsIHZhbHVlOiBib29sZWFuIHwgc3RyaW5nKSA9PiB7XG4gICAgICBpZiAodGlkICE9PSB0YXNrSUQpIHJldHVybjtcbiAgICAgIHRoaXMuX2xvZG9wIS5Pbl9SZXR1cm4gPSBudWxsO1xuICAgICAgdGhpcy5fZXZlbnRzLm5leHQoe1xuICAgICAgICBvazogdmFsdWUgPT09IHRydWUsXG4gICAgICAgIGVycm9yOiB2YWx1ZSA9PT0gdHJ1ZSA/IG51bGwgOiB2YWx1ZSxcbiAgICAgICAgLi4uZGF0YSxcbiAgICAgIH0pO1xuICAgICAgdGhpcy5wcmludERvKCk7XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDnq4vljbPmiZPljbDvvIzkuIDoiKznlKjkuo7mibnph4/lpZfmiZNcbiAgICpcbiAgICogQHBhcmFtIGNvZGUg5Luj56CBXG4gICAqIEBwYXJhbSBjb250ZXh0T2JqIOWKqOaAgeWPguaVsOS4iuS4i+aWh+WvueixoVxuICAgKiBAcGFyYW0gcGFyc2VyIOiHquWumuS5ieino+aekOihqOi+vuW8j++8jOm7mOiupO+8mmAvTE9ET1BcXC4oW14oXSspXFwoKFteXFxuXSspXFwpOy9pYFxuICAgKi9cbiAgcHJpbnQoY29kZTogc3RyaW5nLCBjb250ZXh0T2JqOiB7fSB8IEFycmF5PHt9PiwgcGFyc2VyPzogUmVnRXhwKTogdm9pZCB7XG4gICAgdGhpcy5jaGVjaygpO1xuICAgIGlmIChjb250ZXh0T2JqKSB7XG4gICAgICB0aGlzLnByaW50QnVmZmVyLnB1c2goXG4gICAgICAgIC4uLihBcnJheS5pc0FycmF5KGNvbnRleHRPYmopID8gY29udGV4dE9iaiA6IFtjb250ZXh0T2JqXSkubWFwKGl0ZW0gPT4ge1xuICAgICAgICAgIHJldHVybiB7IGNvZGUsIHBhcnNlciwgaXRlbSB9O1xuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMucHJpbnREbygpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5faW5pdC51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuX2V2ZW50cy51bnN1YnNjcmliZSgpO1xuICB9XG59XG4iXX0=