UNPKG

ng-yunzai-mobile

Version:

1. 修改wechat.micro.ts

426 lines 33.2 kB
/** * @fileoverview added by tsickle * Generated from: devices/wechat.mp.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { BaseDevice } from "./base.device"; import { Injectable, Inject } from "@angular/core"; import { HttpClient } from "@angular/common/http"; import { BASE_CLIENT } from "../client/base.client"; import { preloaderFinished } from "../auth/preloader"; import { from } from "rxjs"; import { Title } from "@angular/platform-browser"; import { TokenService } from "../token/token.service"; import { UserService } from "../user/user.service"; import * as i0 from "@angular/core"; import * as i1 from "../token/token.service"; import * as i2 from "@angular/common/http"; import * as i3 from "../user/user.service"; import * as i4 from "@angular/platform-browser"; import * as i5 from "../client/base.client"; /** @type {?} */ const apis = [ "updateAppMessageShareData", "updateTimelineShareData", "onMenuShareTimeline", "onMenuShareAppMessage", "onMenuShareQQ", "onMenuShareWeibo", "onMenuShareQZone", "startRecord", "stopRecord", "onVoiceRecordEnd", "playVoice", "pauseVoice", "stopVoice", "onVoicePlayEnd", "uploadVoice", "downloadVoice", "chooseImage", "previewImage", "uploadImage", "downloadImage", "translateVoice", "getNetworkType", "openLocation", "getLocation", "hideOptionMenu", "showOptionMenu", "hideMenuItems", "showMenuItems", "hideAllNonBaseMenuItem", "showAllNonBaseMenuItem", "closeWindow", "scanQRCode", "chooseWXPay", "openProductSpecificView", "addCard", "chooseCard", "openCard", ]; /** @type {?} */ const openTags = [ 'wx-open-launch-weapp', 'wx-open-launch-app', 'wx-open-subscribe', 'wx-open-audio' ]; export class WechatMp extends BaseDevice { /** * @param {?} tokenService * @param {?} http * @param {?} user * @param {?} title * @param {?} baseclient */ constructor(tokenService, http, user, title, baseclient) { super(); this.tokenService = tokenService; this.http = http; this.user = user; this.title = title; this.baseclient = baseclient; } /** * @return {?} */ auth() { if (this.baseclient.wechat && this.baseclient.wechat.auth === false) { return new Promise((/** * @param {?} resolve * @param {?} reject * @return {?} */ (resolve, reject) => { preloaderFinished(); resolve(true); })); } return new Promise((/** * @param {?} reject * @param {?} resolve * @return {?} */ (reject, resolve) => { /** @type {?} */ const url = encodeURIComponent(window.location.href); this.http .get(`${this.baseclient.gateway}/wechat/mp/token?url=` + url) .subscribe((/** * @param {?} token * @return {?} */ (token) => { if (token.error_code === 200) { this.tokenService.set((/** @type {?} */ ({ accessToken: token.message, tokenType: "bearer", }))); this.http .get(`${this.baseclient.gateway}/auth/user`) .subscribe((/** * @param {?} response * @return {?} */ (response) => { this.user.set(response.principal); // 暂不对微信jssdk进行对接 this.generateWechatConfig(); preloaderFinished(); reject(null); })); } else if (token.error_code === 500) { // 没有token,则重定向到认证页面,认证完成后会跳回本页面 window.location.href = token.path; } })); })); } /** * @param {?} iwindow * @return {?} */ openWindow(iwindow) { window.location.href = iwindow.url; } /** * @param {?} ititle * @return {?} */ setTitle(ititle) { this.title.setTitle(ititle.title); } /** * @param {?} navigationBar * @return {?} */ setNavigationBar(navigationBar) { alert("微信端暂不支持放置按钮,请在APP中使用此功能!"); return; } /** * @param {?} ishare * @return {?} */ share(ishare) { alert("微信端暂不支持分享,请在APP中使用此功能!"); } /** * @return {?} */ getToken() { /** @type {?} */ const itoken = { accessToken: this.tokenService.get().accessToken, tokenType: null, tokenDataLine: null, scope: null, }; return itoken; } /** * @return {?} */ scanCode() { /** @type {?} */ const p = new Promise((/** * @param {?} resolve * @param {?} reject * @return {?} */ (resolve, reject) => { wx.scanQRCode({ needResult: 1, scanType: ['qrCode', 'barCode'], success: (/** * @param {?} res * @return {?} */ (res) => { resolve(res.resultStr); }), }); })); return from(p); } /** * @return {?} */ userLocation() { /** @type {?} */ const p = new Promise((/** * @param {?} resolve * @param {?} reject * @return {?} */ (resolve, reject) => { wx.getLocation({ type: 'wgs84', // 默认为wgs84的gps坐标,如果要返回直接给openLocation用的火星坐标,可传入'gcj02' success: (/** * @param {?} res * @return {?} */ (res) => { if (res.errMsg === 'getLocation:ok') { /** @type {?} */ const latitude = res.latitude; // 纬度,浮点数,范围为90 ~ -90 /** @type {?} */ const longitude = res.longitude; // 经度,浮点数,范围为180 ~ -180。 /** @type {?} */ const address = '微信无address'; resolve({ latitude, longitude, address }); } }), }); })); return from(p); } /** * @param {?} bssids * @return {?} */ validateInWifi(bssids) { alert("微信端暂不支持WIFI验证,请在APP中使用此功能!"); return undefined; } /** * @return {?} */ getWifiMac() { alert("微信端暂不支持获取MAC地址,请在APP中使用此功能!"); return undefined; } /** * @return {?} */ generateWechatConfig() { this.http .get(`${this.baseclient.gateway}/wechat/mp/jssdk?url=${encodeURIComponent(window.location.href)}`) .subscribe((/** * @param {?} response * @return {?} */ (response) => { wx.config({ debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId: response.appId, // 必填,公众号的唯一标识 timestamp: response.timestamp, // 必填,生成签名的时间戳 nonceStr: response.nonceStr, // 必填,生成签名的随机串 signature: response.signature, // 必填,签名 jsApiList: apis, // 必填,需要使用的JS接口列表 openTagList: openTags // 可选,需要使用的开放标签列表,例如['wx-open-launch-app'] }); })); wx.ready((/** * @return {?} */ () => { // config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作, // 所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。 console.log('微信jssdk初始化完成.'); })); wx.error((/** * @param {?} res * @return {?} */ (res) => { // config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名。 console.log('微信jssdk初始化失败:', res); })); } /** * @param {?} count * @return {?} */ chooseContacts(count) { alert("微信端暂不支持获取联系人,请在APP中使用此功能!"); return undefined; } /** * @param {?} targetUserId * @return {?} */ contactDetails(targetUserId) { alert("微信端暂不支持查询联系人详细信息,请在APP中使用此功能!"); return undefined; } /** * @param {?} count * @param {?} sourceType * @return {?} */ uploadImage(count, sourceType) { alert("微信端暂不支持图片上传,请在APP中使用此功能!"); return undefined; } /** * @param {?} url * @param {?} openType * @param {?} title * @param {?} id * @param {?} type * @return {?} */ openReadWithTimer(url, openType, title, id, type) { alert("微信端暂不支持读物时间统计,请在APP中使用此功能!"); return undefined; } /** * @param {?} limitMinute * @return {?} */ uploadMovie(limitMinute) { alert("微信端暂不支持视频上传,请在APP中使用此功能!"); return undefined; } /** * @param {?} url * @param {?} title * @return {?} */ fileBrowser(url, title) { alert("微信端暂不支持此功能,请在APP中使用此功能!"); return undefined; } /** * @param {?} ticket * @param {?} callback * @return {?} */ startSearchBeacons(ticket, callback) { wx.startSearchBeacons({ ticket: ticket, complete: callback, }); } /** * @param {?} callback * @return {?} */ stopSearchBeacons(callback) { wx.stopSearchBeacons({ complete: callback, }); } /** * @param {?} callback * @return {?} */ onSearchBeacons(callback) { wx.onSearchBeacons({ complete: callback, }); } } WechatMp.decorators = [ { type: Injectable, args: [{ providedIn: "root", },] } ]; /** @nocollapse */ WechatMp.ctorParameters = () => [ { type: TokenService }, { type: HttpClient }, { type: UserService }, { type: Title }, { type: undefined, decorators: [{ type: Inject, args: [BASE_CLIENT,] }] } ]; /** @nocollapse */ WechatMp.ngInjectableDef = i0.ɵɵdefineInjectable({ factory: function WechatMp_Factory() { return new WechatMp(i0.ɵɵinject(i1.TokenService), i0.ɵɵinject(i2.HttpClient), i0.ɵɵinject(i3.UserService), i0.ɵɵinject(i4.Title), i0.ɵɵinject(i5.BASE_CLIENT)); }, token: WechatMp, providedIn: "root" }); if (false) { /** * @type {?} * @private */ WechatMp.prototype.tokenService; /** * @type {?} * @private */ WechatMp.prototype.http; /** * @type {?} * @private */ WechatMp.prototype.user; /** * @type {?} * @private */ WechatMp.prototype.title; /** * @type {?} * @private */ WechatMp.prototype.baseclient; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2VjaGF0Lm1wLmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmcteXVuemFpLW1vYmlsZS8iLCJzb3VyY2VzIjpbImRldmljZXMvd2VjaGF0Lm1wLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUFFLFdBQVcsRUFBYyxNQUFNLHVCQUF1QixDQUFDO0FBRWhFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBTXRELE9BQU8sRUFBRSxJQUFJLEVBQWMsTUFBTSxNQUFNLENBQUM7QUFFeEMsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN0RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7Ozs7Ozs7O01BRTdDLElBQUksR0FBRztJQUNYLDJCQUEyQjtJQUMzQix5QkFBeUI7SUFDekIscUJBQXFCO0lBQ3JCLHVCQUF1QjtJQUN2QixlQUFlO0lBQ2Ysa0JBQWtCO0lBQ2xCLGtCQUFrQjtJQUNsQixhQUFhO0lBQ2IsWUFBWTtJQUNaLGtCQUFrQjtJQUNsQixXQUFXO0lBQ1gsWUFBWTtJQUNaLFdBQVc7SUFDWCxnQkFBZ0I7SUFDaEIsYUFBYTtJQUNiLGVBQWU7SUFDZixhQUFhO0lBQ2IsY0FBYztJQUNkLGFBQWE7SUFDYixlQUFlO0lBQ2YsZ0JBQWdCO0lBQ2hCLGdCQUFnQjtJQUNoQixjQUFjO0lBQ2QsYUFBYTtJQUNiLGdCQUFnQjtJQUNoQixnQkFBZ0I7SUFDaEIsZUFBZTtJQUNmLGVBQWU7SUFDZix3QkFBd0I7SUFDeEIsd0JBQXdCO0lBQ3hCLGFB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QyxRQUE2QjtRQUM3QyxFQUFFLENBQUMsaUJBQWlCLENBQUM7WUFDbkIsUUFBUSxFQUFFLFFBQVE7U0FDbkIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7Ozs7SUFDRCxlQUFlLENBQUMsUUFBNkI7UUFDM0MsRUFBRSxDQUFDLGVBQWUsQ0FBQztZQUNqQixRQUFRLEVBQUUsUUFBUTtTQUNuQixDQUFDLENBQUM7SUFDTCxDQUFDOzs7WUEvTEYsVUFBVSxTQUFDO2dCQUNWLFVBQVUsRUFBRSxNQUFNO2FBQ25COzs7O1lBdERRLFlBQVk7WUFaWixVQUFVO1lBYVYsV0FBVztZQUZYLEtBQUs7NENBOERULE1BQU0sU0FBQyxXQUFXOzs7Ozs7OztJQUpuQixnQ0FBa0M7Ozs7O0lBQ2xDLHdCQUF3Qjs7Ozs7SUFDeEIsd0JBQXlCOzs7OztJQUN6Qix5QkFBb0I7Ozs7O0lBQ3BCLDhCQUFtRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJhc2VEZXZpY2UgfSBmcm9tIFwiLi9iYXNlLmRldmljZVwiO1xyXG5pbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3QgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vbi9odHRwXCI7XHJcbmltcG9ydCB7IEJBU0VfQ0xJRU5ULCBCYXNlQ2xpZW50IH0gZnJvbSBcIi4uL2NsaWVudC9iYXNlLmNsaWVudFwiO1xyXG5pbXBvcnQgeyBNeVdlY2hhdE1wVG9rZW4gfSBmcm9tIFwiLi9tb2RlbC93ZWNoYXQubXBcIjtcclxuaW1wb3J0IHsgcHJlbG9hZGVyRmluaXNoZWQgfSBmcm9tIFwiLi4vYXV0aC9wcmVsb2FkZXJcIjtcclxuaW1wb3J0IHsgSVdpbmRvdyB9IGZyb20gXCIuL21vZGVsL3dpbmRvd1wiO1xyXG5pbXBvcnQgeyBJVGl0bGUgfSBmcm9tIFwiLi9tb2RlbC90aXRsZVwiO1xyXG5pbXBvcnQgeyBOYXZpZ2F0aW9uQmFyIH0gZnJvbSBcIi4vbW9kZWwvbmF2aWdhdGlvbmJhclwiO1xyXG5pbXBvcnQgeyBJU2hhcmUgfSBmcm9tIFwiLi9tb2RlbC9zaGFyZVwiO1xyXG5pbXBvcnQgeyBJdG9rZW4gfSBmcm9tIFwiLi4vYXV0aC9pdG9rZW5cIjtcclxuaW1wb3J0IHsgZnJvbSwgT2JzZXJ2YWJsZSB9IGZyb20gXCJyeGpzXCI7XHJcbmltcG9ydCB7IFVzZXJMb2NhdGlvbiB9IGZyb20gXCIuL21vZGVsL2xvY2F0aW9uXCI7XHJcbmltcG9ydCB7IFRpdGxlIH0gZnJvbSBcIkBhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXJcIjtcclxuaW1wb3J0IHsgVG9rZW5TZXJ2aWNlIH0gZnJvbSBcIi4uL3Rva2VuL3Rva2VuLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgVXNlclNlcnZpY2UgfSBmcm9tIFwiLi4vdXNlci91c2VyLnNlcnZpY2VcIjtcclxuXHJcbmNvbnN0IGFwaXMgPSBbXHJcbiAgXCJ1cGRhdGVBcHBNZXNzYWdlU2hhcmVEYXRhXCIsXHJcbiAgXCJ1cGRhdGVUaW1lbGluZVNoYXJlRGF0YVwiLFxyXG4gIFwib25NZW51U2hhcmVUaW1lbGluZVwiLFxyXG4gIFwib25NZW51U2hhcmVBcHBNZXNzYWdlXCIsXHJcbiAgXCJvbk1lbnVTaGFyZVFRXCIsXHJcbiAgXCJvbk1lbnVTaGFyZVdlaWJvXCIsXHJcbiAgXCJvbk1lbnVTaGFyZVFab25lXCIsXHJcbiAgXCJzdGFydFJlY29yZFwiLFxyXG4gIFwic3RvcFJlY29yZFwiLFxyXG4gIFwib25Wb2ljZVJlY29yZEVuZFwiLFxyXG4gIFwicGxheVZvaWNlXCIsXHJcbiAgXCJwYXVzZVZvaWNlXCIsXHJcbiAgXCJzdG9wVm9pY2VcIixcclxuICBcIm9uVm9pY2VQbGF5RW5kXCIsXHJcbiAgXCJ1cGxvYWRWb2ljZVwiLFxyXG4gIFwiZG93bmxvYWRWb2ljZVwiLFxyXG4gIFwiY2hvb3NlSW1hZ2VcIixcclxuICBcInByZXZpZXdJbWFnZVwiLFxyXG4gIFwidXBsb2FkSW1hZ2VcIixcclxuICBcImRvd25sb2FkSW1hZ2VcIixcclxuICBcInRyYW5zbGF0ZVZvaWNlXCIsXHJcbiAgXCJnZXROZXR3b3JrVHlwZVwiLFxyXG4gIFwib3BlbkxvY2F0aW9uXCIsXHJcbiAgXCJnZXRMb2NhdGlvblwiLFxyXG4gIFwiaGlkZU9wdGlvbk1lbnVcIixcclxuICBcInNob3dPcHRpb25NZW51XCIsXHJcbiAgXCJoaWRlTWVudUl0ZW1zXCIsXHJcbiAgXCJzaG93TWVudUl0ZW1zXCIsXHJcbiAgXCJoaWRlQWxsTm9uQmFzZU1lbnVJdGVtXCIsXHJcbiAgXCJzaG93QWxsTm9uQmFzZU1lbnVJdGVtXCIsXHJcbiAgXCJjbG9zZVdpbmRvd1wiLFxyXG4gIFwic2NhblFSQ29kZVwiLFxyXG4gIFwiY2hvb3NlV1hQYXlcIixcclxuICBcIm9wZW5Qcm9kdWN0U3BlY2lmaWNWaWV3XCIsXHJcbiAgXCJhZGRDYXJkXCIsXHJcbiAgXCJjaG9vc2VDYXJkXCIsXHJcbiAgXCJvcGVuQ2FyZFwiLFxyXG5dO1xyXG5cclxuY29uc3Qgb3BlblRhZ3MgPSBbXHJcbiAgJ3d4LW9wZW4tbGF1bmNoLXdlYXBwJyxcclxuICAnd3gtb3Blbi1sYXVuY2gtYXBwJyxcclxuICAnd3gtb3Blbi1zdWJzY3JpYmUnLFxyXG4gICd3eC1vcGVuLWF1ZGlvJ1xyXG5dO1xyXG5cclxuZGVjbGFyZSBsZXQgd3g7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogXCJyb290XCIsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBXZWNoYXRNcCBleHRlbmRzIEJhc2VEZXZpY2Uge1xyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSB0b2tlblNlcnZpY2U6IFRva2VuU2VydmljZSxcclxuICAgIHByaXZhdGUgaHR0cDogSHR0cENsaWVudCxcclxuICAgIHByaXZhdGUgdXNlcjogVXNlclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHRpdGxlOiBUaXRsZSxcclxuICAgIEBJbmplY3QoQkFTRV9DTElFTlQpIHByaXZhdGUgYmFzZWNsaWVudDogQmFzZUNsaWVudFxyXG4gICkge1xyXG4gICAgc3VwZXIoKTtcclxuICB9XHJcblxyXG4gIGF1dGgoKTogUHJvbWlzZTxhbnk+IHtcclxuICAgIGlmICh0aGlzLmJhc2VjbGllbnQud2VjaGF0ICYmIHRoaXMuYmFzZWNsaWVudC53ZWNoYXQuYXV0aCA9PT0gZmFsc2UpIHtcclxuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPGFueT4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgIHByZWxvYWRlckZpbmlzaGVkKCk7XHJcbiAgICAgICAgcmVzb2x2ZSh0cnVlKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2U8YW55PigocmVqZWN0LCByZXNvbHZlKSA9PiB7XHJcbiAgICAgIGNvbnN0IHVybCA9IGVuY29kZVVSSUNvbXBvbmVudCh3aW5kb3cubG9jYXRpb24uaHJlZik7XHJcbiAgICAgIHRoaXMuaHR0cFxyXG4gICAgICAgIC5nZXQoYCR7dGhpcy5iYXNlY2xpZW50LmdhdGV3YXl9L3dlY2hhdC9tcC90b2tlbj91cmw9YCArIHVybClcclxuICAgICAgICAuc3Vic2NyaWJlKCh0b2tlbjogTXlXZWNoYXRNcFRva2VuKSA9PiB7XHJcbiAgICAgICAgICBpZiAodG9rZW4uZXJyb3JfY29kZSA9PT0gMjAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMudG9rZW5TZXJ2aWNlLnNldCh7XHJcbiAgICAgICAgICAgICAgYWNjZXNzVG9rZW46IHRva2VuLm1lc3NhZ2UsXHJcbiAgICAgICAgICAgICAgdG9rZW5UeXBlOiBcImJlYXJlclwiLFxyXG4gICAgICAgICAgICB9IGFzIGFueSk7XHJcbiAgICAgICAgICAgIHRoaXMuaHR0cFxyXG4gICAgICAgICAgICAgIC5nZXQoYCR7dGhpcy5iYXNlY2xpZW50LmdhdGV3YXl9L2F1dGgvdXNlcmApXHJcbiAgICAgICAgICAgICAgLnN1YnNjcmliZSgocmVzcG9uc2U6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy51c2VyLnNldChyZXNwb25zZS5wcmluY2lwYWwpO1xyXG4gICAgICAgICAgICAgICAgLy8g5pqC5LiN5a+55b6u5L+hanNzZGvov5vooYzlr7nmjqVcclxuICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVXZWNoYXRDb25maWcoKTtcclxuICAgICAgICAgICAgICAgIHByZWxvYWRlckZpbmlzaGVkKCk7XHJcbiAgICAgICAgICAgICAgICByZWplY3QobnVsbCk7XHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuLmVycm9yX2NvZGUgPT09IDUwMCkge1xyXG4gICAgICAgICAgICAvLyDmsqHmnIl0b2tlbu+8jOWImemHjeWumuWQkeWIsOiupOivgemhtemdou+8jOiupOivgeWujOaIkOWQjuS8mui3s+WbnuacrOmhtemdolxyXG4gICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IHRva2VuLnBhdGg7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIG9wZW5XaW5kb3coaXdpbmRvdzogSVdpbmRvdyk6IHZvaWQge1xyXG4gICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBpd2luZG93LnVybDtcclxuICB9XHJcblxyXG4gIHNldFRpdGxlKGl0aXRsZTogSVRpdGxlKTogdm9pZCB7XHJcbiAgICB0aGlzLnRpdGxlLnNldFRpdGxlKGl0aXRsZS50aXRsZSk7XHJcbiAgfVxyXG5cclxuICBzZXROYXZpZ2F0aW9uQmFyKG5hdmlnYXRpb25CYXI6IE5hdmlnYXRpb25CYXIpOiB2b2lkIHtcclxuICAgIGFsZXJ0KFwi5b6u5L+h56uv5pqC5LiN5pSv5oyB5pS+572u5oyJ6ZKuLOivt+WcqEFQUOS4reS9v+eUqOatpOWKn+iDvSFcIik7XHJcbiAgICByZXR1cm47XHJcbiAgfVxyXG5cclxuICBzaGFyZShpc2hhcmU6IElTaGFyZSk6IHZvaWQge1xyXG4gICAgYWxlcnQoXCLlvq7kv6Hnq6/mmoLkuI3mlK/mjIHliIbkuqss6K+35ZyoQVBQ5Lit5L2/55So5q2k5Yqf6IO9IVwiKTtcclxuICB9XHJcblxyXG4gIGdldFRva2VuKCk6IEl0b2tlbiB7XHJcbiAgICBjb25zdCBpdG9rZW46IEl0b2tlbiA9IHtcclxuICAgICAgYWNjZXNzVG9rZW46IHRoaXMudG9rZW5TZXJ2aWNlLmdldCgpLmFjY2Vzc1Rva2VuLFxyXG4gICAgICB0b2tlblR5cGU6IG51bGwsXHJcbiAgICAgIHRva2VuRGF0YUxpbmU6IG51bGwsXHJcbiAgICAgIHNjb3BlOiBudWxsLFxyXG4gICAgfTtcclxuICAgIHJldHVybiBpdG9rZW47XHJcbiAgfVxyXG5cclxuICBzY2FuQ29kZSgpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xyXG4gICAgY29uc3QgcCA9IG5ldyBQcm9taXNlPHN0cmluZz4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICB3eC5zY2FuUVJDb2RlKHtcclxuICAgICAgICBuZWVkUmVzdWx0OiAxLFxyXG4gICAgICAgIHNjYW5UeXBlOiBbJ3FyQ29kZScsICdiYXJDb2RlJ10sXHJcbiAgICAgICAgc3VjY2VzczogKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICByZXNvbHZlKHJlcy5yZXN1bHRTdHIpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gZnJvbShwKTtcclxuICB9XHJcblxyXG4gIHVzZXJMb2NhdGlvbigpOiBPYnNlcnZhYmxlPFVzZXJMb2NhdGlvbj4ge1xyXG4gICAgY29uc3QgcCA9IG5ldyBQcm9taXNlPFVzZXJMb2NhdGlvbj4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICB3eC5nZXRMb2NhdGlvbih7XHJcbiAgICAgICAgdHlwZTogJ3dnczg0JywgLy8g6buY6K6k5Li6d2dzODTnmoRncHPlnZDmoIfvvIzlpoLmnpzopoHov5Tlm57nm7TmjqXnu5lvcGVuTG9jYXRpb27nlKjnmoTngavmmJ/lnZDmoIfvvIzlj6/kvKDlhaUnZ2NqMDInXHJcbiAgICAgICAgc3VjY2VzczogKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICBpZiAocmVzLmVyck1zZyA9PT0gJ2dldExvY2F0aW9uOm9rJykge1xyXG4gICAgICAgICAgICBjb25zdCBsYXRpdHVkZSA9IHJlcy5sYXRpdHVkZTsgLy8g57qs5bqm77yM5rWu54K55pWw77yM6IyD5Zu05Li6OTAgfiAtOTBcclxuICAgICAgICAgICAgY29uc3QgbG9uZ2l0dWRlID0gcmVzLmxvbmdpdHVkZTsgLy8g57uP5bqm77yM5rWu54K55pWw77yM6IyD5Zu05Li6MTgwIH4gLTE4MOOAglxyXG4gICAgICAgICAgICBjb25zdCBhZGRyZXNzID0gJ+W+ruS/oeaXoGFkZHJlc3MnO1xyXG4gICAgICAgICAgICByZXNvbHZlKHtsYXRpdHVkZSwgbG9uZ2l0dWRlLCBhZGRyZXNzfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBmcm9tKHApO1xyXG4gIH1cclxuXHJcbiAgdmFsaWRhdGVJbldpZmkoYnNzaWRzOiBzdHJpbmdbXSk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xyXG4gICAgYWxlcnQoXCLlvq7kv6Hnq6/mmoLkuI3mlK/mjIFXSUZJ6aqM6K+BLOivt+WcqEFQUOS4reS9v+eUqOatpOWKn+iDvSFcIik7XHJcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgZ2V0V2lmaU1hYygpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xyXG4gICAgYWxlcnQoXCLlvq7kv6Hnq6/mmoLkuI3mlK/mjIHojrflj5ZNQUPlnLDlnYAs6K+35ZyoQVBQ5Lit5L2/55So5q2k5Yqf6IO9IVwiKTtcclxuICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgfVxyXG5cclxuICBnZW5lcmF0ZVdlY2hhdENvbmZpZygpOiB2b2lkIHtcclxuICAgIHRoaXMuaHR0cFxyXG4gICAgICAuZ2V0KGAke3RoaXMuYmFzZWNsaWVudC5nYXRld2F5fS93ZWNoYXQvbXAvanNzZGs/dXJsPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHdpbmRvdy5sb2NhdGlvbi5ocmVmKX1gKVxyXG4gICAgICAuc3Vic2NyaWJlKChyZXNwb25zZTogYW55KSA9PiB7XHJcbiAgICAgICAgd3guY29uZmlnKHtcclxuICAgICAgICAgIGRlYnVnOiBmYWxzZSwgLy8g5byA5ZCv6LCD6K+V5qih5byPLOiwg+eUqOeahOaJgOaciWFwaeeahOi/lOWbnuWAvOS8muWcqOWuouaIt+err2FsZXJ05Ye65p2l77yM6Iul6KaB5p+l55yL5Lyg5YWl55qE5Y+C5pWw77yM5Y+v5Lul5ZyocGPnq6/miZPlvIDvvIzlj4LmlbDkv6Hmga/kvJrpgJrov4dsb2fmiZPlh7rvvIzku4XlnKhwY+err+aXtuaJjeS8muaJk+WNsOOAglxyXG4gICAgICAgICAgYXBwSWQ6IHJlc3BvbnNlLmFwcElkLCAvLyDlv4XloavvvIzlhazkvJflj7fnmoTllK/kuIDmoIfor4ZcclxuICAgICAgICAgIHRpbWVzdGFtcDogcmVzcG9uc2UudGltZXN0YW1wLCAvLyDlv4XloavvvIznlJ/miJDnrb7lkI3nmoTml7bpl7TmiLNcclxuICAgICAgICAgIG5vbmNlU3RyOiByZXNwb25zZS5ub25jZVN0ciwgLy8g5b+F5aGr77yM55Sf5oiQ562+5ZCN55qE6ZqP5py65LiyXHJcbiAgICAgICAgICBzaWduYXR1cmU6IHJlc3BvbnNlLnNpZ25hdHVyZSwgLy8g5b+F5aGr77yM562+5ZCNXHJcbiAgICAgICAgICBqc0FwaUxpc3Q6IGFwaXMsIC8vIOW/heWhq++8jOmcgOimgeS9v+eUqOeahEpT5o6l5Y+j5YiX6KGoXHJcbiAgICAgICAgICBvcGVuVGFnTGlzdDogb3BlblRhZ3MgLy8g5Y+v6YCJ77yM6ZyA6KaB5L2/55So55qE5byA5pS+5qCH562+5YiX6KGo77yM5L6L5aaCWyd3eC1vcGVuLWxhdW5jaC1hcHAnXVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9KTtcclxuICAgIHd4LnJlYWR5KCgpID0+IHtcclxuICAgICAgLy8gY29uZmln5L+h5oGv6aqM6K+B5ZCO5Lya5omn6KGMcmVhZHnmlrnms5XvvIzmiYDmnInmjqXlj6PosIPnlKjpg73lv4XpobvlnKhjb25maWfmjqXlj6Pojrflvpfnu5PmnpzkuYvlkI7vvIxjb25maWfmmK/kuIDkuKrlrqLmiLfnq6/nmoTlvILmraXmk43kvZzvvIxcclxuICAgICAgLy8g5omA5Lul5aaC5p6c6ZyA6KaB5Zyo6aG16Z2i5Yqg6L295pe25bCx6LCD55So55u45YWz5o6l5Y+j77yM5YiZ6aG75oqK55u45YWz5o6l5Y+j5pS+5ZyocmVhZHnlh73mlbDkuK3osIPnlKjmnaXnoa7kv53mraPnoa7miafooYzjgILlr7nkuo7nlKjmiLfop6blj5Hml7bmiY3osIPnlKjnmoTmjqXlj6PvvIzliJnlj6/ku6Xnm7TmjqXosIPnlKjvvIzkuI3pnIDopoHmlL7lnKhyZWFkeeWHveaVsOS4reOAglxyXG4gICAgICBjb25zb2xlLmxvZygn5b6u5L+hanNzZGvliJ3lp4vljJblrozmiJAuJyk7XHJcbiAgICB9KTtcclxuXHJcbiAgICB3eC5lcnJvcigocmVzKSA9PiB7XHJcbiAgICAgIC8vIGNvbmZpZ+S/oeaBr+mqjOivgeWksei0peS8muaJp+ihjGVycm9y5Ye95pWw77yM5aaC562+5ZCN6L+H5pyf5a+86Ie06aqM6K+B5aSx6LSl77yM5YW35L2T6ZSZ6K+v5L+h5oGv5Y+v5Lul5omT5byAY29uZmln55qEZGVidWfmqKHlvI/mn6XnnIvvvIzkuZ/lj6/ku6XlnKjov5Tlm57nmoRyZXPlj4LmlbDkuK3mn6XnnIvvvIzlr7nkuo5TUEHlj6/ku6XlnKjov5nph4zmm7TmlrDnrb7lkI3jgIJcclxuICAgICAgY29uc29sZS5sb2coJ+W+ruS/oWpzc2Rr5Yid5aeL5YyW5aSx6LSlOicsIHJlcyk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGNob29zZUNvbnRhY3RzKGNvdW50OiBudW1iZXIpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgYWxlcnQoXCLlvq7kv6Hnq6/mmoLkuI3mlK/mjIHojrflj5bogZTns7vkuros6K+35ZyoQVBQ5Lit5L2/55So5q2k5Yqf6IO9IVwiKTtcclxuICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgfVxyXG5cclxuICBjb250YWN0RGV0YWlscyh0YXJnZXRVc2VySWQ6IHN0cmluZyk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICBhbGVydChcIuW+ruS/oeerr+aaguS4jeaUr+aMgeafpeivouiBlOezu+S6uuivpue7huS/oeaBryzor7flnKhBUFDkuK3kvb/nlKjmraTlip/og70hXCIpO1xyXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICB9XHJcblxyXG4gIHVwbG9hZEltYWdlKGNvdW50OiBudW1iZXIsIHNvdXJjZVR5cGU6IGFueSk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICBhbGVydChcIuW+ruS/oeerr+aaguS4jeaUr+aMgeWbvueJh+S4iuS8oCzor7flnKhBUFDkuK3kvb/nlKjmraTlip/og70hXCIpO1xyXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICB9XHJcblxyXG4gIG9wZW5SZWFkV2l0aFRpbWVyKFxyXG4gICAgdXJsOiBhbnksXHJcbiAgICBvcGVuVHlwZTogYW55LFxyXG4gICAgdGl0bGU6IGFueSxcclxuICAgIGlkOiBhbnksXHJcbiAgICB0eXBlOiBhbnlcclxuICApOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgYWxlcnQoXCLlvq7kv6Hnq6/mmoLkuI3mlK/mjIHor7vnianml7bpl7Tnu5/orqEs6K+35ZyoQVBQ5Lit5L2/55So5q2k5Yqf6IO9IVwiKTtcclxuICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgfVxyXG5cclxuICB1cGxvYWRNb3ZpZShsaW1pdE1pbnV0ZTogbnVtYmVyKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIGFsZXJ0KFwi5b6u5L+h56uv5pqC5LiN5pSv5oyB6KeG6aKR5LiK5LygLOivt+WcqEFQUOS4reS9v+eUqOatpOWKn+iDvSFcIik7XHJcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gIH1cclxuICBmaWxlQnJvd3Nlcih1cmw6IHN0cmluZywgdGl0bGU6IHN0cmluZyk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICBhbGVydChcIuW+ruS/oeerr+aaguS4jeaUr+aMgeatpOWKn+iDvSzor7flnKhBUFDkuK3kvb/nlKjmraTlip/og70hXCIpO1xyXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICB9XHJcblxyXG4gIHN0YXJ0U2VhcmNoQmVhY29ucyh0aWNrZXQ6IHN0cmluZywgY2FsbGJhY2s6IChhcmd2OiBhbnkpID0+IHZvaWQpOiB2b2lkIHtcclxuICAgIHd4LnN0YXJ0U2VhcmNoQmVhY29ucyh7XHJcbiAgICAgIHRpY2tldDogdGlja2V0LFxyXG4gICAgICBjb21wbGV0ZTogY2FsbGJhY2ssXHJcbiAgICB9KTtcclxuICB9XHJcbiAgc3RvcFNlYXJjaEJlYWNvbnMoY2FsbGJhY2s6IChhcmd2OiBhbnkpID0+IHZvaWQpOiB2b2lkIHtcclxuICAgIHd4LnN0b3BTZWFyY2hCZWFjb25zKHtcclxuICAgICAgY29tcGxldGU6IGNhbGxiYWNrLFxyXG4gICAgfSk7XHJcbiAgfVxyXG4gIG9uU2VhcmNoQmVhY29ucyhjYWxsYmFjazogKGFyZ3Y6IGFueSkgPT4gdm9pZCk6IHZvaWQge1xyXG4gICAgd3gub25TZWFyY2hCZWFjb25zKHtcclxuICAgICAgY29tcGxldGU6IGNhbGxiYWNrLFxyXG4gICAgfSk7XHJcbiAgfVxyXG59XHJcbiJdfQ==