ng-yunzai-mobile
Version:
1. 适配yunzai_uni_app_x
286 lines • 30.9 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: location/location.service.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Injectable } from "@angular/core";
export class LocationService {
constructor() {
// 定义一些常量
this.bdsUtils = {
x_PI: 3.14159265358979324 * 3000.0 / 180.0,
PI: 3.1415926535897932384626,
a: 6378245.0,
ee: 0.00669342162296594323,
};
}
/**
* 获取地址前需要将gcj02 、bd09 转换为wgs84
* @param {?} option
* @return {?}
*/
getLocation(option) {
if (!option.longitude || !option.longitude)
return;
if (option.onOk) {
/** @type {?} */
let xy;
switch (option.type) {
case TYPE_ENUM.GCJ02:
xy = this.gcj02towgs84(option.longitude, option.latitude);
break;
case TYPE_ENUM.BD09:
xy = this.bd09towgs84(option.longitude, option.latitude);
break;
case TYPE_ENUM.WGS84:
xy = [option.longitude, option.latitude];
break;
}
this.queryAddressInfo(xy[0], xy[1]).then((/**
* @param {?} data
* @return {?}
*/
data => {
option.onOk(data);
})).catch((/**
* @return {?}
*/
() => {
option.onOk(null);
}));
}
}
/**
* 获取地址信息
* @param {?} lon 坐标的x值
* @param {?} lat 坐标的y值
* @return {?}
*/
queryAddressInfo(lon, lat) {
return new Promise((/**
* @param {?} resolve
* @param {?} reject
* @return {?}
*/
(resolve, reject) => {
/** @type {?} */
const param = {
lon: lon,
lat: lat,
ver: 1 // 接口版本
};
/** @type {?} */
const url = '//api.tianditu.gov.cn' + '/geocoder?postStr=' + JSON.stringify(param) + '&type=geocode&tk=40b42d3bf171b3e50dd21cd002efaa23';
/** @type {?} */
const xmlHttp = new XMLHttpRequest();
xmlHttp.open('GET', url);
xmlHttp.withCredentials = false;
xmlHttp.send();
xmlHttp.onreadystatechange = (/**
* @return {?}
*/
function () {
if (xmlHttp.readyState == 4 && xmlHttp.status == 200) {
/** @type {?} */
const res = JSON.parse(xmlHttp.responseText);
if (res.status == '0') {
resolve(res.result);
}
else {
reject(null);
console.error('错误1' + res.msg);
}
}
});
xmlHttp.onerror = (/**
* @param {?} error
* @return {?}
*/
function (error) {
console.error("错误2" + error);
reject(null);
});
}));
}
/**
* 判断是否在国内,不在国内则不做偏移
* @param {?} lng
* @param {?} lat
* @return {?}
*/
outOfChina(lng, lat) {
return (lng < 72.004 || lng > 137.8347) || ((lat < 0.8293 || lat > 55.8271) || false);
}
/**
* 纬度转换
* @param {?} lng
* @param {?} lat
* @return {?}
*/
transformlng(lng, lat) {
/** @type {?} */
let ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + 0.1 * lng * lat + 0.1 * Math.sqrt(Math.abs(lng));
ret += (20.0 * Math.sin(6.0 * lng * this.bdsUtils.PI) + 20.0 * Math.sin(2.0 * lng * this.bdsUtils.PI)) * 2.0 / 3.0;
ret += (20.0 * Math.sin(lng * this.bdsUtils.PI) + 40.0 * Math.sin(lng / 3.0 * this.bdsUtils.PI)) * 2.0 / 3.0;
ret += (150.0 * Math.sin(lng / 12.0 * this.bdsUtils.PI) + 300.0 * Math.sin(lng / 30.0 * this.bdsUtils.PI)) * 2.0 / 3.0;
return ret;
}
/**
* 经度转换
* @param {?} lng
* @param {?} lat
* @return {?}
*/
transformlat(lng, lat) {
/** @type {?} */
let ret = -100.0 + 2.0 * lng + 3.0 * lat + 0.2 * lat * lat + 0.1 * lng * lat + 0.2 * Math.sqrt(Math.abs(lng));
ret += (20.0 * Math.sin(6.0 * lng * this.bdsUtils.PI) + 20.0 * Math.sin(2.0 * lng * this.bdsUtils.PI)) * 2.0 / 3.0;
ret += (20.0 * Math.sin(lat * this.bdsUtils.PI) + 40.0 * Math.sin(lat / 3.0 * this.bdsUtils.PI)) * 2.0 / 3.0;
ret += (160.0 * Math.sin(lat / 12.0 * this.bdsUtils.PI) + 320 * Math.sin(lat * this.bdsUtils.PI / 30.0)) * 2.0 / 3.0;
return ret;
}
/**
* 百度坐标系 (BD-09) 与 火星坐标系 (GCJ-02)的转换 / 即百度转谷歌、高德
* @param {?} bd_lon
* @param {?} bd_lat
* @return {?}
*/
bd09togcj02(bd_lon, bd_lat) {
/** @type {?} */
const x = bd_lon - 0.0065;
/** @type {?} */
const y = bd_lat - 0.006;
/** @type {?} */
const z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * this.bdsUtils.x_PI);
/** @type {?} */
const theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * this.bdsUtils.x_PI);
/** @type {?} */
const gg_lng = z * Math.cos(theta);
/** @type {?} */
const gg_lat = z * Math.sin(theta);
return [gg_lng, gg_lat];
}
/**
* 火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的转换 / 即谷歌、高德 转 百度
* @param {?} lng
* @param {?} lat
* @return {?}
*/
gcj02tobd09(lng, lat) {
/** @type {?} */
const z = Math.sqrt(lng * lng + lat * lat) + 0.00002 * Math.sin(lat * this.bdsUtils.x_PI);
/** @type {?} */
const theta = Math.atan2(lat, lng) + 0.000003 * Math.cos(lng * this.bdsUtils.x_PI);
/** @type {?} */
const bd_lng = z * Math.cos(theta) + 0.0065;
/** @type {?} */
const bd_lat = z * Math.sin(theta) + 0.006;
return [bd_lng, bd_lat];
}
/**
* WGS84坐标系转火星坐标系GCj02 / 即WGS84 转谷歌、高德
* @param {?} lng
* @param {?} lat
* @return {?}
*/
wgs84togcj02(lng, lat) {
if (this.outOfChina(lng, lat)) {
return [lng, lat];
}
else {
/** @type {?} */
let dlat = this.transformlat(lng - 105.0, lat - 35.0);
/** @type {?} */
let dlng = this.transformlng(lng - 105.0, lat - 35.0);
/** @type {?} */
const radlat = lat / 180.0 * this.bdsUtils.PI;
/** @type {?} */
let magic = Math.sin(radlat);
magic = 1 - this.bdsUtils.ee * magic * magic;
/** @type {?} */
const sqrtmagic = Math.sqrt(magic);
dlat = (dlat * 180.0) / ((this.bdsUtils.a * (1 - this.bdsUtils.ee)) / (magic * sqrtmagic) * this.bdsUtils.PI);
dlng = (dlng * 180.0) / (this.bdsUtils.a / sqrtmagic * Math.cos(radlat) * this.bdsUtils.PI);
/** @type {?} */
const mglat = lat + dlat;
/** @type {?} */
const mglng = lng + dlng;
return [mglng, mglat];
}
}
/**
* GCJ02(火星坐标系) 转换为 WGS84 / 即谷歌高德转WGS84
* @param {?} lng
* @param {?} lat
* @return {?}
*/
gcj02towgs84(lng, lat) {
if (this.outOfChina(lng, lat)) {
return [lng, lat];
}
else {
/** @type {?} */
let dlat = this.transformlat(lng - 105.0, lat - 35.0);
/** @type {?} */
let dlng = this.transformlng(lng - 105.0, lat - 35.0);
/** @type {?} */
const radlat = lat / 180.0 * this.bdsUtils.PI;
/** @type {?} */
let magic = Math.sin(radlat);
magic = 1 - this.bdsUtils.ee * magic * magic;
/** @type {?} */
const sqrtmagic = Math.sqrt(magic);
dlat = (dlat * 180.0) / ((this.bdsUtils.a * (1 - this.bdsUtils.ee)) / (magic * sqrtmagic) * this.bdsUtils.PI);
dlng = (dlng * 180.0) / (this.bdsUtils.a / sqrtmagic * Math.cos(radlat) * this.bdsUtils.PI);
/** @type {?} */
const mglat = lat + dlat;
/** @type {?} */
const mglng = lng + dlng;
return [lng * 2 - mglng, lat * 2 - mglat];
}
}
/**
* 百度坐标系转wgs84坐标系
* @param {?} lng
* @param {?} lat
* @return {?}
*/
bd09towgs84(lng, lat) {
// 百度坐标系先转为火星坐标系
/** @type {?} */
const gcj02 = this.bd09togcj02(lng, lat);
// 火星坐标系转wgs84坐标系
return this.gcj02towgs84(gcj02[0], gcj02[1]);
}
/**
* wgs84坐标系转百度坐标系
* @param {?} lng
* @param {?} lat
* @return {?}
*/
wgs84tobd09(lng, lat) {
// wgs84先转为火星坐标系
/** @type {?} */
const gcj02 = this.wgs84togcj02(lng, lat);
// 火星坐标系转百度坐标系
return this.gcj02tobd09(gcj02[0], gcj02[1]);
}
}
LocationService.decorators = [
{ type: Injectable }
];
/** @nocollapse */
LocationService.ctorParameters = () => [];
if (false) {
/** @type {?} */
LocationService.prototype.bdsUtils;
}
/** @enum {string} */
const TYPE_ENUM = {
GCJ02: "gcj02",
BD09: "bd09",
WGS84: "wgs84" // WGS84坐标系
,
};
export { TYPE_ENUM };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jYXRpb24uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25nLXl1bnphaS1tb2JpbGUvIiwic291cmNlcyI6WyJsb2NhdGlvbi9sb2NhdGlvbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUl6QyxNQUFNLE9BQU8sZUFBZTtJQVUxQjs7UUFQQSxhQUFRLEdBQUc7WUFDVCxJQUFJLEVBQUUsbUJBQW1CLEdBQUcsTUFBTSxHQUFHLEtBQUs7WUFDMUMsRUFBRSxFQUFFLHdCQUF3QjtZQUM1QixDQUFDLEVBQUUsU0FBUztZQUNaLEVBQUUsRUFBRSxzQkFBc0I7U0FDM0IsQ0FBQztJQUdGLENBQUM7Ozs7OztJQU1ELFdBQVcsQ0FBQyxNQUFzRjtRQUNoRyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTO1lBQUUsT0FBTztRQUNuRCxJQUFJLE1BQU0sQ0FBQyxJQUFJLEVBQUU7O2dCQUNYLEVBQWM7WUFDbEIsUUFBUSxNQUFNLENBQUMsSUFBSSxFQUFFO2dCQUNuQixLQUFLLFNBQVMsQ0FBQyxLQUFLO29CQUNsQixFQUFFLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztvQkFDMUQsTUFBTTtnQkFDUixLQUFLLFNBQVMsQ0FBQyxJQUFJO29CQUNqQixFQUFFLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztvQkFDekQsTUFBTTtnQkFDUixLQUFLLFNBQVMsQ0FBQyxLQUFLO29CQUNsQixFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztvQkFDekMsTUFBTTthQUNUO1lBRUQsSUFBSSxDQUFDLGdCQUFn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Q0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7UUFDbkgsR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztRQUM3RyxHQUFHLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztRQUN2SCxPQUFPLEdBQUcsQ0FBQTtJQUNaLENBQUM7Ozs7Ozs7SUFPRCxZQUFZLENBQUMsR0FBRyxFQUFFLEdBQUc7O1lBQ2YsR0FBRyxHQUFHLENBQUMsS0FBSyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzdHLEdBQUcsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO1FBQ25ILEdBQUcsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7UUFDN0csR0FBRyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7UUFDckgsT0FBTyxHQUFHLENBQUE7SUFDWixDQUFDOzs7Ozs7O0lBT0QsV0FBVyxDQUFDLE1BQU0sRUFBRSxNQUFNOztjQUNsQixDQUFDLEdBQUcsTUFBTSxHQUFHLE1BQU07O2NBQ25CLENBQUMsR0FBRyxNQUFNLEdBQUcsS0FBSzs7Y0FDbEIsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDOztjQUN6RSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDOztjQUN0RSxNQUFNLEdBQUcs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LENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQztTQUMzQztJQUNILENBQUM7Ozs7Ozs7SUFPRCxXQUFXLENBQUMsR0FBRyxFQUFFLEdBQUc7OztjQUVaLEtBQUssR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUM7UUFDeEMsaUJBQWlCO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDL0MsQ0FBQzs7Ozs7OztJQU9ELFdBQVcsQ0FBQyxHQUFHLEVBQUUsR0FBRzs7O2NBRVosS0FBSyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQztRQUN6QyxjQUFjO1FBQ2QsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM5QyxDQUFDOzs7WUFsTkYsVUFBVTs7Ozs7O0lBSVQsbUNBS0U7OztBQThNSixNQUFZLFNBQVM7SUFDbkIsS0FBSyxTQUFVO0lBQ2YsSUFBSSxRQUFTO0lBQ2IsS0FBSyxTQUFVLENBQUUsV0FBVzs7RUFDN0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0luamVjdGFibGV9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7TG9jYXRpb25Nb2RlbH0gZnJvbSBcIi4vbG9jYXRpb24ubW9kZWxcIjtcclxuXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIExvY2F0aW9uU2VydmljZSB7XHJcblxyXG4gIC8vIOWumuS5ieS4gOS6m+W4uOmHj1xyXG4gIGJkc1V0aWxzID0ge1xyXG4gICAgeF9QSTogMy4xNDE1OTI2NTM1ODk3OTMyNCAqIDMwMDAuMCAvIDE4MC4wLFxyXG4gICAgUEk6IDMuMTQxNTkyNjUzNTg5NzkzMjM4NDYyNixcclxuICAgIGE6IDYzNzgyNDUuMCxcclxuICAgIGVlOiAwLjAwNjY5MzQyMTYyMjk2NTk0MzIzLFxyXG4gIH07XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkge1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICog6I635Y+W5Zyw5Z2A5YmN6ZyA6KaB5bCGZ2NqMDIg44CBYmQwOSDovazmjaLkuLp3Z3M4NFxyXG4gICAqIEBwYXJhbSBvcHRpb25cclxuICAgKi9cclxuICBnZXRMb2NhdGlvbihvcHRpb246IHsgbG9uZ2l0dWRlOiBhbnksIGxhdGl0dWRlOiBhbnksIHR5cGU6IFRZUEVfRU5VTSwgb25PazogKHZhbHVlOiBhbnkpID0+IHZvaWQgfSkge1xyXG4gICAgaWYgKCFvcHRpb24ubG9uZ2l0dWRlIHx8ICFvcHRpb24ubG9uZ2l0dWRlKSByZXR1cm47XHJcbiAgICBpZiAob3B0aW9uLm9uT2spIHtcclxuICAgICAgbGV0IHh5OiBBcnJheTxhbnk+O1xyXG4gICAgICBzd2l0Y2ggKG9wdGlvbi50eXBlKSB7XHJcbiAgICAgICAgY2FzZSBUWVBFX0VOVU0uR0NKMDI6XHJcbiAgICAgICAgICB4eSA9IHRoaXMuZ2NqMDJ0b3dnczg0KG9wdGlvbi5sb25naXR1ZGUsIG9wdGlvbi5sYXRpdHVkZSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFRZUEVfRU5VTS5CRDA5OlxyXG4gICAgICAgICAgeHkgPSB0aGlzLmJkMDl0b3dnczg0KG9wdGlvbi5sb25naXR1ZGUsIG9wdGlvbi5sYXRpdHVkZSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFRZUEVfRU5VTS5XR1M4NDpcclxuICAgICAgICAgIHh5ID0gW29wdGlvbi5sb25naXR1ZGUsIG9wdGlvbi5sYXRpdHVkZV07XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5xdWVyeUFkZHJlc3NJbmZvKHh5WzBdLCB4eVsxXSkudGhlbihkYXRhID0+IHtcclxuICAgICAgICBvcHRpb24ub25PayhkYXRhKTtcclxuICAgICAgfSkuY2F0Y2goKCkgPT4ge1xyXG4gICAgICAgIG9wdGlvbi5vbk9rKG51bGwpO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgLyoqXHJcbiAgICog6I635Y+W5Zyw5Z2A5L+h5oGvXHJcbiAgICogQHBhcmFtIGxvbiDlnZDmoIfnmoR45YC8XHJcbiAgICogQHBhcmFtIGxhdCDlnZDmoIfnmoR55YC8XHJcbiAgICovXHJcbiAgcXVlcnlBZGRyZXNzSW5mbyhsb246IGFueSwgbGF0OiBhbnkpOiBMb2NhdGlvbk1vZGVsIHwgYW55IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIGNvbnN0IHBhcmFtID0ge1xyXG4gICAgICAgIGxvbjogbG9uLFxyXG4gICAgICAgIGxhdDogbGF0LFxyXG4gICAgICAgIHZlcjogMSAvLyDmjqXlj6PniYjmnKxcclxuICAgICAgfTtcclxuICAgICAgY29uc3QgdXJsID0gJy8vYXBpLnRpYW5kaXR1Lmdvdi5jbicgKyAnL2dlb2NvZGVyP3Bvc3RTdHI9JyArIEpTT04uc3RyaW5naWZ5KHBhcmFtKSArICcmdHlwZT1nZW9jb2RlJnRrPTQwYjQyZDNiZjE3MWIzZTUwZGQyMWNkMDAyZWZhYTIzJztcclxuICAgICAgY29uc3QgeG1sSHR0cCA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xyXG4gICAgICB4bWxIdHRwLm9wZW4oJ0dFVCcsIHVybCk7XHJcbiAgICAgIHhtbEh0dHAud2l0aENyZWRlbnRpYWxzID0gZmFsc2U7XHJcbiAgICAgIHhtbEh0dHAuc2VuZCgpO1xyXG4gICAgICB4bWxIdHRwLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBpZiAoeG1sSHR0cC5yZWFkeVN0YXRlID09IDQgJiYgeG1sSHR0cC5zdGF0dXMgPT0gMjAwKSB7XHJcbiAgICAgICAgICAgICAgY29uc3QgcmVzID0gSlNPTi5wYXJzZSh4bWxIdHRwLnJlc3BvbnNlVGV4dCk7XHJcbiAgICAgICAgICAgICAgaWYgKHJlcy5zdGF0dXMgPT0gJzAnKSB7XHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKHJlcy5yZXN1bHQpO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZWplY3QobnVsbCk7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCfplJnor68xJyArIHJlcy5tc2cpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH07XHJcbiAgICAgIHhtbEh0dHAub25lcnJvciA9IGZ1bmN0aW9uIChlcnJvcikge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwi6ZSZ6K+vMlwiICsgZXJyb3IpO1xyXG4gICAgICAgICAgICByZWplY3QobnVsbClcclxuICAgICAgfTtcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiDliKTmlq3mmK/lkKblnKjlm73lhoXvvIzkuI3lnKjlm73lhoXliJnkuI3lgZrlgY/np7tcclxuICAgKiBAcGFyYW0gbG5nXHJcbiAgICogQHBhcmFtIGxhdFxyXG4gICAqL1xyXG4gIG91dE9mQ2hpbmEobG5nLCBsYXQpIHtcclxuICAgIHJldHVybiAobG5nIDwgNzIuMDA0IHx8IGxuZyA+IDEzNy44MzQ3KSB8fCAoKGxhdCA8IDAuODI5MyB8fCBsYXQgPiA1NS44MjcxKSB8fCBmYWxzZSlcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIOe6rOW6pui9rOaNolxyXG4gICAqIEBwYXJhbSBsbmdcclxuICAgKiBAcGFyYW0gbGF0XHJcbiAgICovXHJcbiAgdHJhbnNmb3JtbG5nKGxuZywgbGF0KSB7XHJcbiAgICBsZXQgcmV0ID0gMzAwLjAgKyBsbmcgKyAyLjAgKiBsYXQgKyAwLjEgKiBsbmcgKiBsbmcgKyAwLjEgKiBsbmcgKiBsYXQgKyAwLjEgKiBNYXRoLnNxcnQoTWF0aC5hYnMobG5nKSk7XHJcbiAgICByZXQgKz0gKDIwLjAgKiBNYXRoLnNpbig2LjAgKiBsbmcgKiB0aGlzLmJkc1V0aWxzLlBJKSArIDIwLjAgKiBNYXRoLnNpbigyLjAgKiBsbmcgKiB0aGlzLmJkc1V0aWxzLlBJKSkgKiAyLjAgLyAzLjA7XHJcbiAgICByZXQgKz0gKDIwLjAgKiBNYXRoLnNpbihsbmcgKiB0aGlzLmJkc1V0aWxzLlBJKSArIDQwLjAgKiBNYXRoLnNpbihsbmcgLyAzLjAgKiB0aGlzLmJkc1V0aWxzLlBJKSkgKiAyLjAgLyAzLjA7XHJcbiAgICByZXQgKz0gKDE1MC4wICogTWF0aC5zaW4obG5nIC8gMTIuMCAqIHRoaXMuYmRzVXRpbHMuUEkpICsgMzAwLjAgKiBNYXRoLnNpbihsbmcgLyAzMC4wICogdGhpcy5iZHNVdGlscy5QSSkpICogMi4wIC8gMy4wO1xyXG4gICAgcmV0dXJuIHJldFxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICog57uP5bqm6L2s5o2iXHJcbiAgICogQHBhcmFtIGxuZ1xyXG4gICAqIEBwYXJhbSBsYXRcclxuICAgKi9cclxuICB0cmFuc2Zvcm1sYXQobG5nLCBsYXQpIHtcclxuICAgIGxldCByZXQgPSAtMTAwLjAgKyAyLjAgKiBsbmcgKyAzLjAgKiBsYXQgKyAwLjIgKiBsYXQgKiBsYXQgKyAwLjEgKiBsbmcgKiBsYXQgKyAwLjIgKiBNYXRoLnNxcnQoTWF0aC5hYnMobG5nKSk7XHJcbiAgICByZXQgKz0gKDIwLjAgKiBNYXRoLnNpbig2LjAgKiBsbmcgKiB0aGlzLmJkc1V0aWxzLlBJKSArIDIwLjAgKiBNYXRoLnNpbigyLjAgKiBsbmcgKiB0aGlzLmJkc1V0aWxzLlBJKSkgKiAyLjAgLyAzLjA7XHJcbiAgICByZXQgKz0gKDIwLjAgKiBNYXRoLnNpbihsYXQgKiB0aGlzLmJkc1V0aWxzLlBJKSArIDQwLjAgKiBNYXRoLnNpbihsYXQgLyAzLjAgKiB0aGlzLmJkc1V0aWxzLlBJKSkgKiAyLjAgLyAzLjA7XHJcbiAgICByZXQgKz0gKDE2MC4wICogTWF0aC5zaW4obGF0IC8gMTIuMCAqIHRoaXMuYmRzVXRpbHMuUEkpICsgMzIwICogTWF0aC5zaW4obGF0ICogdGhpcy5iZHNVdGlscy5QSSAvIDMwLjApKSAqIDIuMCAvIDMuMDtcclxuICAgIHJldHVybiByZXRcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIOeZvuW6puWdkOagh+ezuyAoQkQtMDkpIOS4jiDngavmmJ/lnZDmoIfns7sgKEdDSi0wMinnmoTovazmjaIgLyDljbPnmb7luqbovazosLfmrYzjgIHpq5jlvrdcclxuICAgKiBAcGFyYW0gYmRfbG9uXHJcbiAgICogQHBhcmFtIGJkX2xhdFxyXG4gICAqL1xyXG4gIGJkMDl0b2djajAyKGJkX2xvbiwgYmRfbGF0KSB7XHJcbiAgICBjb25zdCB4ID0gYmRfbG9uIC0gMC4wMDY1O1xyXG4gICAgY29uc3QgeSA9IGJkX2xhdCAtIDAuMDA2O1xyXG4gICAgY29uc3QgeiA9IE1hdGguc3FydCh4ICogeCArIHkgKiB5KSAtIDAuMDAwMDIgKiBNYXRoLnNpbih5ICogdGhpcy5iZHNVdGlscy54X1BJKTtcclxuICAgIGNvbnN0IHRoZXRhID0gTWF0aC5hdGFuMih5LCB4KSAtIDAuMDAwMDAzICogTWF0aC5jb3MoeCAqIHRoaXMuYmRzVXRpbHMueF9QSSk7XHJcbiAgICBjb25zdCBnZ19sbmcgPSB6ICogTWF0aC5jb3ModGhldGEpO1xyXG4gICAgY29uc3QgZ2dfbGF0ID0geiAqIE1hdGguc2luKHRoZXRhKTtcclxuICAgIHJldHVybiBbZ2dfbG5nLCBnZ19sYXRdO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICog54Gr5pif5Z2Q5qCH57O7IChHQ0otMDIpIOS4jueZvuW6puWdkOagh+ezuyAoQkQtMDkpIOeahOi9rOaNoiAvIOWNs+iwt+atjOOAgemrmOW+tyDovawg55m+5bqmXHJcbiAgICogQHBhcmFtIGxuZ1xyXG4gICAqIEBwYXJhbSBsYXRcclxuICAgKi9cclxuICBnY2owMnRvYmQwOShsbmcsIGxhdCkge1xyXG4gICAgY29uc3QgeiA9IE1hdGguc3FydChsbmcgKiBsbmcgKyBsYXQgKiBsYXQpICsgMC4wMDAwMiAqIE1hdGguc2luKGxhdCAqIHRoaXMuYmRzVXRpbHMueF9QSSk7XHJcbiAgICBjb25zdCB0aGV0YSA9IE1hdGguYXRhbjIobGF0LCBsbmcpICsgMC4wMDAwMDMgKiBNYXRoLmNvcyhsbmcgKiB0aGlzLmJkc1V0aWxzLnhfUEkpO1xyXG4gICAgY29uc3QgYmRfbG5nID0geiAqIE1hdGguY29zKHRoZXRhKSArIDAuMDA2NTtcclxuICAgIGNvbnN0IGJkX2xhdCA9IHogKiBNYXRoLnNpbih0aGV0YSkgKyAwLjAwNjtcclxuICAgIHJldHVybiBbYmRfbG5nLCBiZF9sYXRdO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogV0dTODTlnZDmoIfns7vovazngavmmJ/lnZDmoIfns7tHQ2owMiAvIOWNs1dHUzg0IOi9rOiwt+atjOOAgemrmOW+t1xyXG4gICAqIEBwYXJhbSBsbmdcclxuICAgKiBAcGFyYW0gbGF0XHJcbiAgICovXHJcbiAgd2dzODR0b2djajAyKGxuZywgbGF0KSB7XHJcbiAgICBpZiAodGhpcy5vdXRPZkNoaW5hKGxuZywgbGF0KSkge1xyXG4gICAgICByZXR1cm4gW2xuZywgbGF0XVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgbGV0IGRsYXQgPSB0aGlzLnRyYW5zZm9ybWxhdChsbmcgLSAxMDUuMCwgbGF0IC0gMzUuMCk7XHJcbiAgICAgIGxldCBkbG5nID0gdGhpcy50cmFuc2Zvcm1sbmcobG5nIC0gMTA1LjAsIGxhdCAtIDM1LjApO1xyXG4gICAgICBjb25zdCByYWRsYXQgPSBsYXQgLyAxODAuMCAqIHRoaXMuYmRzVXRpbHMuUEk7XHJcbiAgICAgIGxldCBtYWdpYyA9IE1hdGguc2luKHJhZGxhdCk7XHJcbiAgICAgIG1hZ2ljID0gMSAtIHRoaXMuYmRzVXRpbHMuZWUgKiBtYWdpYyAqIG1hZ2ljO1xyXG4gICAgICBjb25zdCBzcXJ0bWFnaWMgPSBNYXRoLnNxcnQobWFnaWMpO1xyXG4gICAgICBkbGF0ID0gKGRsYXQgKiAxODAuMCkgLyAoKHRoaXMuYmRzVXRpbHMuYSAqICgxIC0gdGhpcy5iZHNVdGlscy5lZSkpIC8gKG1hZ2ljICogc3FydG1hZ2ljKSAqIHRoaXMuYmRzVXRpbHMuUEkpO1xyXG4gICAgICBkbG5nID0gKGRsbmcgKiAxODAuMCkgLyAodGhpcy5iZHNVdGlscy5hIC8gc3FydG1hZ2ljICogTWF0aC5jb3MocmFkbGF0KSAqIHRoaXMuYmRzVXRpbHMuUEkpO1xyXG4gICAgICBjb25zdCBtZ2xhdCA9IGxhdCArIGRsYXQ7XHJcbiAgICAgIGNvbnN0IG1nbG5nID0gbG5nICsgZGxuZztcclxuICAgICAgcmV0dXJuIFttZ2xuZywgbWdsYXRdO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR0NKMDLvvIjngavmmJ/lnZDmoIfns7vvvIkg6L2s5o2i5Li6IFdHUzg0IC8g5Y2z6LC35q2M6auY5b636L2sV0dTODRcclxuICAgKiBAcGFyYW0gbG5nXHJcbiAgICogQHBhcmFtIGxhdFxyXG4gICAqL1xyXG4gIGdjajAydG93Z3M4NChsbmcsIGxhdCkge1xyXG4gICAgaWYgKHRoaXMub3V0T2ZDaGluYShsbmcsIGxhdCkpIHtcclxuICAgICAgcmV0dXJuIFtsbmcsIGxhdF1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGxldCBkbGF0ID0gdGhpcy50cmFuc2Zvcm1sYXQobG5nIC0gMTA1LjAsIGxhdCAtIDM1LjApO1xyXG4gICAgICBsZXQgZGxuZyA9IHRoaXMudHJhbnNmb3JtbG5nKGxuZyAtIDEwNS4wLCBsYXQgLSAzNS4wKTtcclxuICAgICAgY29uc3QgcmFkbGF0ID0gbGF0IC8gMTgwLjAgKiB0aGlzLmJkc1V0aWxzLlBJO1xyXG4gICAgICBsZXQgbWFnaWMgPSBNYXRoLnNpbihyYWRsYXQpO1xyXG4gICAgICBtYWdpYyA9IDEgLSB0aGlzLmJkc1V0aWxzLmVlICogbWFnaWMgKiBtYWdpYztcclxuICAgICAgY29uc3Qgc3FydG1hZ2ljID0gTWF0aC5zcXJ0KG1hZ2ljKTtcclxuICAgICAgZGxhdCA9IChkbGF0ICogMTgwLjApIC8gKCh0aGlzLmJkc1V0aWxzLmEgKiAoMSAtIHRoaXMuYmRzVXRpbHMuZWUpKSAvIChtYWdpYyAqIHNxcnRtYWdpYykgKiB0aGlzLmJkc1V0aWxzLlBJKTtcclxuICAgICAgZGxuZyA9IChkbG5nICogMTgwLjApIC8gKHRoaXMuYmRzVXRpbHMuYSAvIHNxcnRtYWdpYyAqIE1hdGguY29zKHJhZGxhdCkgKiB0aGlzLmJkc1V0aWxzLlBJKTtcclxuICAgICAgY29uc3QgbWdsYXQgPSBsYXQgKyBkbGF0O1xyXG4gICAgICBjb25zdCBtZ2xuZyA9IGxuZyArIGRsbmc7XHJcbiAgICAgIHJldHVybiBbbG5nICogMiAtIG1nbG5nLCBsYXQgKiAyIC0gbWdsYXRdO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICog55m+5bqm5Z2Q5qCH57O76L2sd2dzODTlnZDmoIfns7tcclxuICAgKiBAcGFyYW0gbG5nXHJcbiAgICogQHBhcmFtIGxhdFxyXG4gICAqL1xyXG4gIGJkMDl0b3dnczg0KGxuZywgbGF0KSB7XHJcbiAgICAvLyDnmb7luqblnZDmoIfns7vlhYjovazkuLrngavmmJ/lnZDmoIfns7tcclxuICAgIGNvbnN0IGdjajAyID0gdGhpcy5iZDA5dG9nY2owMihsbmcsIGxhdCk7XHJcbiAgICAvLyDngavmmJ/lnZDmoIfns7vovax3Z3M4NOWdkOagh+ezu1xyXG4gICAgcmV0dXJuIHRoaXMuZ2NqMDJ0b3dnczg0KGdjajAyWzBdLCBnY2owMlsxXSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiB3Z3M4NOWdkOagh+ezu+i9rOeZvuW6puWdkOagh+ezu1xyXG4gICAqIEBwYXJhbSBsbmdcclxuICAgKiBAcGFyYW0gbGF0XHJcbiAgICovXHJcbiAgd2dzODR0b2JkMDkobG5nLCBsYXQpIHtcclxuICAgIC8vIHdnczg05YWI6L2s5Li654Gr5pif5Z2Q5qCH57O7XHJcbiAgICBjb25zdCBnY2owMiA9IHRoaXMud2dzODR0b2djajAyKGxuZywgbGF0KTtcclxuICAgIC8vIOeBq+aYn+WdkOagh+ezu+i9rOeZvuW6puWdkOagh+ezu1xyXG4gICAgcmV0dXJuIHRoaXMuZ2NqMDJ0b2JkMDkoZ2NqMDJbMF0sIGdjajAyWzFdKTtcclxuICB9XHJcbn1cclxuXHJcblxyXG4vLyDlnZDmoIfns7vmnprkuL5cclxuZXhwb3J0IGVudW0gVFlQRV9FTlVNIHtcclxuICBHQ0owMiA9ICdnY2owMicsIC8vIOeBq+aYn+WdkOagh+ezu1xyXG4gIEJEMDkgPSAnYmQwOScsIC8vIOeZvuW6puWdkOagh+ezu1xyXG4gIFdHUzg0ID0gJ3dnczg0JyAgLy8gV0dTODTlnZDmoIfns7tcclxufVxyXG4iXX0=