Commit ed52c049 authored by rockyl's avatar rockyl

Merge branch 'dev' into res-group

# Conflicts:
#	debug/engine.js
#	debug/engine.js.map
#	src/zeroing/web.ts
parents 1db39c8e bd7b8e7c
{"id":"engine","url":"engine.c62a7b1e88c4bcbbf86609a9b9fe3c2fd353dad2.js"}
\ No newline at end of file
{"id":"engine","url":"engine.d2f4eafa108b00ed5ac00e2d30ee98f8af4a9118.js"}
\ No newline at end of file
function getPxToken(n){if(window.ohjaiohdf){var o=new XMLHttpRequest;o.open("get","getToken",!0),o.onreadystatechange=function(){if(4===o.readyState&&200===o.status){var e=JSON.parse(o.response);if(e.success)window.eval(e.data),n(null,window.ohjaiohdf());else switch(e.code){case"100001":n("need login");break;case"100024":n("state invalid");break;default:n(e.code)}}},o.onerror=function(e){t()},o.onloadend=function(){404===o.status&&t()},o.send()}else n("need login");function t(){n("net error")}}
\ No newline at end of file
......@@ -467,14 +467,7 @@ export default class Container extends DisplayObject {
}
}
let widthSetted = !!this._width && this._width !== 0;
let heightSetted = !!this._height && this._height !== 0;
if (widthSetted) {
this._bounds.width = this._width;
}
if (heightSetted) {
this._bounds.height = this._height;
}
}
/**
......@@ -482,6 +475,28 @@ export default class Container extends DisplayObject {
*/
protected _calculateBounds() {
//子类自己重写
//let wp = this.worldMatrix.transformPoint(this.x, this.y);
let widthSetted = !!this._width && this._width !== 0;
let heightSetted = !!this._height && this._height !== 0;
/*if (widthSetted) {
this._bounds.x = this.x;
this._bounds.width = this._width;
}
if (heightSetted) {
this._bounds.y = this.y;
this._bounds.height = this._height;
}*/
if(widthSetted || heightSetted){
const rect = this._localBoundsSelf;
var matrix = this.transform.worldMatrix;
matrix.transformPoint(rect.x, rect.y, DisplayObject._p1);
matrix.transformPoint(rect.x + rect.width, rect.y, DisplayObject._p2);
matrix.transformPoint(rect.x + rect.width, rect.y + rect.height, DisplayObject._p3);
matrix.transformPoint(rect.x, rect.y + rect.height, DisplayObject._p4);
Rectangle.createFromPoints(this._bounds, DisplayObject._p1, DisplayObject._p2, DisplayObject._p3, DisplayObject._p4);
}
}
/**
......@@ -492,8 +507,9 @@ export default class Container extends DisplayObject {
//如果不可见
if (!this.visible) return null
//如果禁止子级的鼠标事件
let result = this.hitTestSelf(globalPoint);
if (isMouseEvent && !this.mouseChildren) return result;
if (isMouseEvent && !this.mouseChildren){
return this.hitTestSelf(globalPoint);
}
var children = this.children;
var length = children.length;
let child, hitDisplayObject;
......@@ -510,7 +526,7 @@ export default class Container extends DisplayObject {
if (hitDisplayObject) return hitDisplayObject;
}
return this.hitTestSelf(globalPoint);
return this.displayObjectHitTestPoint(globalPoint, isMouseEvent);
}
hitTestSelf(globalPoint) {
......@@ -521,8 +537,9 @@ export default class Container extends DisplayObject {
}
hitTestSelfBounds(globalPoint) {
if (this.width && this.height) {
let {x: tx, y: ty} = this.getBounds();
if (this._width && this._height) {
//let {x: tx, y: ty} = this.getBounds();
let {tx, ty} = this.worldMatrix;
const {x, y} = globalPoint;
if (x > tx &&
x < tx + this.width &&
......@@ -701,6 +718,7 @@ export default class Container extends DisplayObject {
if (this._width !== value) {
//子类有用,有_width,才需设置scaleX
this._width = value;
this._localBoundsSelf.width = value;
//if (this.stage) this.stage.layoutInvalid = true;
this.dispatchEvent(Event.RESIZE);
}
......@@ -724,6 +742,7 @@ export default class Container extends DisplayObject {
// }
if (this._height !== value) {
this._height = value;
this._localBoundsSelf.height = value;
//if (this.stage) this.stage.layoutInvalid = true;
this.dispatchEvent(Event.RESIZE);
}
......
......@@ -280,6 +280,10 @@ export class DisplayObject extends EventDispatcher {
this.parent = parentRef;
this.transform = transformRef;
if (this.parent && this.stage) {
this.updateTransform();
}
return bounds;
}
......@@ -609,7 +613,7 @@ export class DisplayObject extends EventDispatcher {
}
set mask(value) {
if(value === this){
if (value === this) {
return;
}
if (this.$mask) {
......
import { Point, Rectangle } from "../math";
import { Polygon } from "../graphics/shapes";
import Container from "../display/Container";
import Texture from "../texture/Texture";
import { BLEND_MODES } from "../const";
import TextureMatrix from "../texture/TextureMatrix";
import CanvasRenderer from "../renderers/CanvasRenderer";
import { WebglRenderer } from "../renderers/WebglRenderer";
import { DisplayObject } from "../display";
//两个用于计算hitTest
const tempPoint = new Point();
const tempPolygon = new Polygon();
/**
* Mesh网格类,其实最优的是仿pixiV5和threejs用geometry和material
* 简便起见,顶点,索引,uv都干一起吧
* 用batch渲染
* canvas模式下,暂时只有九宫格有效,以后再说
*/
export class Mesh extends Container {
/**
* 混色模式
* @default BLEND_MODES.NORMAL
*/
private _blendMode: BLEND_MODES = BLEND_MODES.NORMAL;
//以后修改
get blendMode(): BLEND_MODES {
return this._blendMode
}
/**
* 很多效果暂时无效,再查原因,先不能设置吧
*/
set blendMode(value: BLEND_MODES) {
// if (value != this._blendMode) this._blendMode = value
}
/**
* 贴图
* @member {Texture}
* @default Texture.EMPTY
* @private
*/
private _texture: Texture;
/**
* 原先自身的顶点数据,到时候封装几何全进
*/
_vertices: Float32Array;
/**
* 是否要更新执行_refresh
*/
protected _needRefresh: boolean;
/**
* 索引
*/
_indices: Uint16Array;
/**
* uv。比sprite复杂,图集和自身顶点的都要考虑
*/
_uvs: Float32Array;
/**
* 要传入批的顶点数据
*/
_vertexData: Float32Array;
/**
* 传入批处理的永远是上面三个,上面三个的计算需要记录dirty
* 但是每次都需要传Gpu,性能再说吧
* 标记自身顶点数据_vertices是否修改了
* @member {number}
*/
protected _vertexDirty: number;
/**
* 记录全局顶点_vertexData原标记Id,确保与_vertexDirty保持一致
* 默认-1,保证算一次
*/
private _vertexId: number;
/**
* 记录LocalBoundsSelf的id,确保与_vertexDirty保持一致
* 默认-1,保证算一次
*/
private _localBoundsSelfId: number;
/**
* 需要与transform._worldID的保持一致
* 用于标记是否重新计算全局顶点数据
*/
private _transformID: number
/**
* canvas模式下用,还没做
* 用于绘制时允许重叠,否则锯齿等问题严重
* @member {number}
*/
canvasPadding: number;
/**
* 色值调色
* 十六进制
*/
private _tint: number;
/**
* RGB形式色值,webgl用
*/
private _tintRGB: number;
/**
* 用于处理贴图的uv,进而计算自身的uv
* @member {TextureMatrix}
* @private
*/
private _uvTransform: TextureMatrix;
/**
* @param {Texture} texture - 贴图
* @param {Float32Array} [vertices] - 顶点
* @param {Float32Array} [uvs] - uv
* @param {Uint16Array} [indices] - 索引
*/
constructor(texture?: Texture, vertices?: Float32Array, uvs?: Float32Array, indices?: Uint16Array) {
super();
/**
* 赋值有问题,再处理
*/
this._texture = texture || Texture.EMPTY;
this._uvs = uvs || new Float32Array([
0, 0,
1, 0,
1, 1,
0, 1]);
this._vertices = vertices || new Float32Array([
0, 0,
100, 0,
100, 100,
0, 100]);
this._indices = indices || new Uint16Array([0, 1, 3, 2]);
this._vertexDirty = 0;
//置为-1,确保计算
this._vertexId = -1;
this._localBoundsSelfId = -1;
this.blendMode = BLEND_MODES.NORMAL;
this.canvasPadding = 0;
this._tint = null;
this._tintRGB = null;
this.tint = 0xFFFFFF;
this._uvTransform = new TextureMatrix(this._texture);
//标记,至少更新一次
this._needRefresh = true;
}
/**
* 自身绘制方法
* @param renderer
*/
_renderWebGL(renderer: WebglRenderer) {
//刷一次
this.refresh();
//计算全局顶点
this.calculateVertices();
renderer.batchManager.setObjectRenderer(renderer.plugins["batch"]);
renderer.plugins["batch"].render(this);
}
/**
* 自身canvas绘制方法,mesh插件没写,九宫格用自身方法绘制
* @param renderer
*/
_renderCanvas(renderer: CanvasRenderer) {
this.refresh();
renderer.plugins["mesh"].render(this);
}
/**
* 贴图改变时需标记更新uv
* @private
*/
protected _onTextureUpdate() {
this._uvTransform.texture = this._texture;
this._needRefresh = true;
}
/**
* 重新计算uv,为了图集上的uv和自身uv
*/
multiplyUvs() {
this._uvTransform.multiplyUvs(this._uvs);
}
/**
* mesh统一刷新方法,顶点,uv,索引更新
* @param {boolean} [forceUpdate=false] 标记true时,必刷新一次
*/
refresh(forceUpdate: boolean = false) {
//贴图不可用,不更新
if (!this._texture || !this._texture.valid) return;
//更新贴图的uv
if (this._uvTransform.update(forceUpdate) || this._needRefresh) {
this._needRefresh = false;
this._refresh();
}
}
/**
* 子类重写,用来计算 顶点,uv,索引
* @protected
*/
protected _refresh() {
/* empty */
}
/**
* 计算一边全局的顶点
*/
calculateVertices() {
//顶点没变,坐标没变,就返回
if (this._vertexId === this._vertexDirty && this._transformID === this.transform._worldID) return;
this._vertexId = this._vertexDirty
this._transformID = this.transform._worldID;
if (this._vertices.length <= 2) return
//首次新建
if (!this._vertexData) this._vertexData = new Float32Array(this._vertices.length)
const wt = this.transform.worldMatrix;
const a = wt.a;
const b = wt.b;
const c = wt.c;
const d = wt.d;
const tx = wt.tx;
const ty = wt.ty;
const vertexData = this._vertexData;
for (let i = 0; i < vertexData.length / 2; i++) {
const x = this._vertices[(i * 2)];
const y = this._vertices[(i * 2) + 1];
vertexData[(i * 2)] = (a * x) + (c * y) + tx;
vertexData[(i * 2) + 1] = (b * x) + (d * y) + ty;
}
}
/**
* 用localBounds计算
* 考虑用localBoundsSelf计算好,还是全局顶点计算好,顶点复杂的用localBoundsSelf,
* sprite和graphics都有同样的问题,都不好缓存,以后再说
* Mesh和graphics用的是localBoundsSelf,sprite用全局顶点计算
*/
_calculateBounds() {
// 考虑缓存,判断是否要执行,有两个要判断_vertexDirty(自身顶点),worldMatrix(是否改变过)
this.updateLocalBoundsSelf();
const rect = this._localBoundsSelf;
var matrix = this.transform.worldMatrix;
matrix.transformPoint(rect.x, rect.y, DisplayObject._p1);
matrix.transformPoint(rect.x + rect.width, rect.y, DisplayObject._p2);
matrix.transformPoint(rect.x + rect.width, rect.y + rect.height, DisplayObject._p3);
matrix.transformPoint(rect.x, rect.y + rect.height, DisplayObject._p4);
Rectangle.createFromPoints(this._bounds, DisplayObject._p1, DisplayObject._p2, DisplayObject._p3, DisplayObject._p4);
}
/**
* 用全局顶点计算
*/
// _calculateBounds() {
// this.calculateVertices();
// Rectangle.createFromVertexData(this._bounds, this._vertexData);
// }
/**
* 更新自身包围盒
* 通过原先的顶点数据玩,不经过transform
*/
updateLocalBoundsSelf() {
if (this._localBoundsSelfId == this._vertexDirty) return;
this._localBoundsSelfId = this._vertexDirty;
//如果小于等于1个点清空
if (this._vertices.length <= 2) this._localBoundsSelf.clear();
Rectangle.createFromVertexData(this._localBoundsSelf, this._vertices);
}
/**
* 碰撞检测方法,和graphics类似
* @param point 全局点
* @param isMouseEvent
*/
hitTestPoint(point: Point, isMouseEvent: boolean = false): DisplayObject {
//不可见,直接返回
if (!this.visible) return null;
let hitDisplayObject;
//先检查子级,因为子级层级更高
hitDisplayObject = super.hitTestPoint(point, isMouseEvent);
//子级已有,返回
if (hitDisplayObject) return hitDisplayObject;
//子级没有的话,为了可以不updateLocalBoundsSelf,判断一下
if (isMouseEvent && !this.mouseEnable) return null;
//再粗略检查自己,先计算自身盒子
this.updateLocalBoundsSelf();
//简单检测
hitDisplayObject = this.displayObjectHitTestPoint(point, isMouseEvent);
//如果在LocalBoundsSelf内,再继续查点组成的
if (hitDisplayObject) return this.hitTestPointAccuratly(point, isMouseEvent)
return null
}
/**
* 用几何方法精确检测
* @param point
* @param isMouseEvent
*/
private hitTestPointAccuratly(point: Point, isMouseEvent): DisplayObject {
if (isMouseEvent) {
this.globalToLocal(point, tempPoint);
} else {
tempPoint.set(point.x, point.y);
}
const vertices = this._vertices;
const points = tempPolygon.points;
const indices = this._indices;
const len = this._indices.length;
for (let i = 0; i + 2 < len; i += 3) {
const ind0 = indices[i] * 2;
const ind1 = indices[i + 1] * 2;
const ind2 = indices[i + 2] * 2;
points[0] = vertices[ind0];
points[1] = vertices[ind0 + 1];
points[2] = vertices[ind1];
points[3] = vertices[ind1 + 1];
points[4] = vertices[ind2];
points[5] = vertices[ind2 + 1];
if (tempPolygon.isPointIn(tempPoint)) return this;
}
return null
}
get texture():Texture {
return this._texture;
}
set texture(value:Texture) {
if (this._texture === value) return;
this._texture = value;
if (value) {
// wait for the texture to load
if (value.baseTexture.hasLoaded) {
this._onTextureUpdate();
}
else {
value.once('update', this._onTextureUpdate, this);
}
}
}
get tint() {
return this._tint;
}
set tint(value: number) {
if (value === this._tint) return;
this._tint = value;
this._tintRGB = (value >> 16) + (value & 0xff00) + ((value & 0xff) << 16);
}
/**
* 销毁方法
*/
destroy() {
super.destroy();
//相应texture移除监听
this._texture.removeEventListener('update', this._onTextureUpdate, this);
this._texture =null;
//TextureMatrix居然没写过销毁方法,再说
this._uvTransform = null;
this._uvs = null;
this._vertices = null;
this._indices = null;
this._vertexData = null
}
}
import { calculatePlaneIndices } from './Plane';
import { Texture } from '../texture';
import CanvasRenderer from '../renderers/CanvasRenderer';
import { Mesh } from './Mesh';
//提前计算好的索引
const indicesNN = calculatePlaneIndices(4, 4)
/**
* 九宫格
*```js
* let Plane9 = new NineSlicePlane(Texture.fromUrl('BoxWithRoundedCorners.png'), 15, 15, 15, 15);
* ```0,1,3,5,7,8,16,24,都是0
*
* 0...1...2...3
* . . . .
* 4...5...6...7
* . . . .
* 8...9...10..11
* . . . .
* 12..13..14..15
* <pre>
* A B
* +---+----------------------+---+
* C | 1 | 2 | 3 |
* +---+----------------------+---+
* | | | |
* | 4 | 5 | 6 |
* | | | |
* +---+----------------------+---+
* D | 7 | 8 | 9 |
* +---+----------------------+---+
* 当修改宽高width height时,不再改变scale属性
* 1 3 7 9 永远不变
* 2 8 只会水平横向拉伸
* 4 6 只会垂直纵向拉伸
* 5 都会拉伸
* </pre>
*
*
*/
export class NineSlicePlane extends Mesh {
/**
* 宽高get set都重写,不再修改缩放,修改uv和顶点
*/
get width(): number {
return this._width;
}
set width(value: number) {
this._width = value;
this._needRefresh = true;
}
get height(): number {
return this._height;
}
set height(value: number) {
this._height = value;
this._needRefresh = true;
}
/**
* 原始宽度
*/
private _origWidth: number;
/**
* 原始高度
*/
private _origHeight: number;
/**
* 左边宽度
*/
private _leftWidth: number;
get leftWidth(): number {
return this._leftWidth;
}
set leftWidth(value: number) {
this._leftWidth = value;
this._needRefresh = true;
}
/**
* 右边宽度
*/
private _rightWidth: number;
get rightWidth(): number {
return this._rightWidth;
}
set rightWidth(value: number) {
this._rightWidth = value;
this._needRefresh = true;
}
/**
* 上边高度
*/
private _topHeight: number;
get topHeight(): number {
return this._topHeight;
}
set topHeight(value: number) {
this._topHeight = value;
this._needRefresh = true;
}
/**
* 下边高度
*/
private _bottomHeight: number;
get bottomHeight(): number {
return this._bottomHeight;
}
set bottomHeight(value: number) {
this._bottomHeight = value;
this._needRefresh = true;
}
/**
* @param {Texture} texture
* @param {number} [leftWidth=10]
* @param {number} [topHeight=10]
* @param {number} [rightWidth=10]
* @param {number} [bottomHeight=10]
*/
constructor(texture: Texture, leftWidth: number = 10, topHeight: number = 10, rightWidth: number = 10, bottomHeight: number = 10) {
super(texture);
//考虑对于未加载好的图片怎么处理吧,肯定需要加在onTextureUpdate的
this._origWidth = texture.orig.width;
this._origHeight = texture.orig.height;
this._width = this._origWidth;
this._height = this._origHeight;
this._leftWidth = leftWidth;
this._rightWidth = rightWidth;
this._topHeight = topHeight;
this._bottomHeight = bottomHeight;
//计算索引,完全不用变,所以提前计算
this._indices = indicesNN;
//顶点数量长度可以确定先
this._vertices = new Float32Array(4 * 4 * 2);
//uv长度也可以确定先
this._uvs = new Float32Array(4 * 4 * 2);
this.refresh(true);
}
/**
* 额外增加修改原始宽高
*/
protected _onTextureUpdate() {
super._onTextureUpdate();
this._origWidth = this.texture.orig.width;
this._origHeight = this.texture.orig.height;
}
/**
* 计算横向顶点
*/
private updateHorizontalVertices() {
const vertices = this._vertices;
const h = this._topHeight + this._bottomHeight;
const scale = this._height > h ? 1.0 : this._height / h;
vertices[9] = vertices[11] = vertices[13] = vertices[15] = this._topHeight * scale;
vertices[17] = vertices[19] = vertices[21] = vertices[23] = this._height - (this._bottomHeight * scale);
vertices[25] = vertices[27] = vertices[29] = vertices[31] = this._height;
}
/**
* 计算纵向顶点
*/
private updateVerticalVertices() {
const vertices = this._vertices;
const w = this._leftWidth + this._rightWidth;
const scale = this._width > w ? 1.0 : this._width / w;
vertices[2] = vertices[10] = vertices[18] = vertices[26] = this._leftWidth * scale;
vertices[4] = vertices[12] = vertices[20] = vertices[28] = this._width - (this._rightWidth * scale);
vertices[6] = vertices[14] = vertices[22] = vertices[30] = this._width;
}
/**
*
* 考虑是否用缓存,不然每次相当于9次绘制,到时应该是集成到一个插件里的
* @private
* @param {CanvasRenderer} renderer
*/
_renderCanvas(renderer: CanvasRenderer) {
const context = renderer.context;
context.globalAlpha = this._worldAlpha;
renderer.setBlendMode(this.blendMode);
const transform = this.worldMatrix;
context.setTransform(
transform.a,
transform.b,
transform.c,
transform.d,
transform.tx,
transform.ty
);
const base = this.texture.baseTexture;
const textureSource = base.source;
const w = base.width;
const h = base.height;
this.drawSegment(context, textureSource, w, h, 0, 1, 10, 11);
this.drawSegment(context, textureSource, w, h, 2, 3, 12, 13);
this.drawSegment(context, textureSource, w, h, 4, 5, 14, 15);
this.drawSegment(context, textureSource, w, h, 8, 9, 18, 19);
this.drawSegment(context, textureSource, w, h, 10, 11, 20, 21);
this.drawSegment(context, textureSource, w, h, 12, 13, 22, 23);
this.drawSegment(context, textureSource, w, h, 16, 17, 26, 27);
this.drawSegment(context, textureSource, w, h, 18, 19, 28, 29);
this.drawSegment(context, textureSource, w, h, 20, 21, 30, 31);
}
/**
* 分部画
* 每部分保证至少有1像素
* @private
* @param {CanvasRenderingContext2D} context
* @param {CanvasImageSource} textureSource - 图片资源
* @param {number} w - 贴图宽
* @param {number} h - 贴图高
* @param {number} x1 - x index 1
* @param {number} y1 - y index 1
* @param {number} x2 - x index 2
* @param {number} y2 - y index 2
*/
private drawSegment(
context: CanvasRenderingContext2D,
textureSource: HTMLImageElement | HTMLCanvasElement,
w: number,
h: number,
x1: number,
y1: number,
x2: number,
y2: number
) {
const uvs = this._uvs;
const vertices = this._vertices;
let sw = (uvs[x2] - uvs[x1]) * w;
let sh = (uvs[y2] - uvs[y1]) * h;
let dw = vertices[x2] - vertices[x1];
let dh = vertices[y2] - vertices[y1];
//绘制源保证至少有一像素
if (sw < 1) sw = 1;
if (sh < 1) sh = 1;
//绘制体保证至少一像素
if (dw < 1) dw = 1;
if (dh < 1) dh = 1;
context.drawImage(textureSource, uvs[x1] * w, uvs[y1] * h, sw, sh, vertices[x1], vertices[y1], dw, dh);
}
/**
* 计算所有坐标
*/
_refresh() {
const uvs = this._uvs;
const texture = this.texture;
this._origWidth = texture.orig.width;
this._origHeight = texture.orig.height;
const _uvw = 1.0 / this._origWidth;
const _uvh = 1.0 / this._origHeight;
uvs[0] = uvs[8] = uvs[16] = uvs[24] = 0;
uvs[1] = uvs[3] = uvs[5] = uvs[7] = 0;
uvs[6] = uvs[14] = uvs[22] = uvs[30] = 1;
uvs[25] = uvs[27] = uvs[29] = uvs[31] = 1;
uvs[2] = uvs[10] = uvs[18] = uvs[26] = _uvw * this._leftWidth;
uvs[4] = uvs[12] = uvs[20] = uvs[28] = 1 - (_uvw * this._rightWidth);
uvs[9] = uvs[11] = uvs[13] = uvs[15] = _uvh * this._topHeight;
uvs[17] = uvs[19] = uvs[21] = uvs[23] = 1 - (_uvh * this._bottomHeight);
this.updateHorizontalVertices();
this.updateVerticalVertices();
this._vertexDirty++;
this.multiplyUvs();
}
}
import { Mesh } from './Mesh';
import { Texture } from '../texture';
/**
* 根据分段数的平面
* verticesX和verticesY都是xy轴上的顶点数,比分段数多1
*
*/
export class Plane extends Mesh {
/**
* x轴顶点数目
*/
private _verticesX: number;
get verticesX(): number {
return this._verticesX
}
set verticesX(value: number) {
if (this._verticesX !== value) {
this._verticesX = value
this._needRefresh = true;
}
}
/**
* y轴顶点数目
*/
private _verticesY: number;
get verticesY(): number {
return this._verticesY
}
set verticesY(value: number) {
if (this._verticesY !== value) {
this._verticesY = value
this._needRefresh = true;
}
}
/**
* @param {Texture} texture
* @param {int} [verticesX=10]
* @param {int} [verticesY=10]
*/
constructor(texture: Texture, verticesX: number = 10, verticesY: number = 10) {
super(texture);
this._verticesX = verticesX;
this._verticesY = verticesY;
this.refresh();
}
/**
* 计算所有坐标
*/
_refresh() {
const texture = this.texture;
const total = this.verticesX * this.verticesY;
const verts = [];
const uvs = [];
const segmentsX = this.verticesX - 1;
const segmentsY = this.verticesY - 1;
const sizeX = texture.width / segmentsX;
const sizeY = texture.height / segmentsY;
for (let i = 0; i < total; i++) {
const x = (i % this.verticesX);
const y = ((i / this.verticesX) | 0);
verts.push(x * sizeX, y * sizeY);
uvs.push(x / segmentsX, y / segmentsY);
}
this._vertices = new Float32Array(verts);
this._uvs = new Float32Array(uvs);
this._indices = calculatePlaneIndices(this.verticesX, this.verticesY);
//标记dirty
this._vertexDirty++;
this.multiplyUvs();
}
}
/**
* 计算平面的索引
* @param verticesX x轴上的顶点数量,最小2
* @param verticesY y轴上的顶点数量,最小2
*/
export function calculatePlaneIndices(verticesX: number, verticesY: number): Uint16Array {
const segmentsX = verticesX - 1;
const segmentsY = verticesY - 1;
const totalSub = segmentsX * segmentsY;
const indices = [];
for (let i = 0; i < totalSub; i++) {
const xpos = i % segmentsX;
const ypos = (i / segmentsX) | 0;
const value = (ypos * verticesX) + xpos;
const value2 = (ypos * verticesX) + xpos + 1;
const value3 = ((ypos + 1) * verticesX) + xpos;
const value4 = ((ypos + 1) * verticesX) + xpos + 1;
indices.push(value, value2, value3);
indices.push(value2, value4, value3);
}
return new Uint16Array(indices);
}
import { Mesh } from './Mesh';
import { Texture } from '../texture';
import { Point } from '../math';
/**
* 为了能加入批处理,不用TRIANGLE_STRIP方式渲染(有需要看v4版本的pixi),还是用TRIANGLE
*```js
* for (let i = 0; i < 20; i++) {
* points.push(new Point(i * 50, 0));
* };
* let rope = new Rope(Texture.fromUrl("snake.png"), points);
* ```
*
*
*/
export class Rope extends Mesh {
/**
* 一组点
*/
points: Point[];
/**
* 是否自动更新顶点,为true,自动更新顶点,否则在points里顶点修改后,自行refreshVertices
*/
autoUpdateVertices: boolean;
/**
* 以横向的为基准,纹理高度
*/
private textureHeight: number;
/**
* @param {Texture} texture
* @param {Point[]} points
*/
constructor(texture: Texture, points: Point[]) {
super(texture);
this.points = points;
this._vertices = new Float32Array(points.length * 4);
this._uvs = new Float32Array(points.length * 4);
this._indices = new Uint16Array((points.length - 1) * 6);
this.textureHeight = texture.height;
this.refresh(true);
this.refreshVertices();
}
/**
* 计算索引和uv,和顶点计算的要分开
*/
_refresh() {
const points = this.points;
//没点,或贴图uv为空
if (points.length < 1 || !this.texture._uvs) return;
//如果顶点数量有变
if (this._vertices.length / 4 !== points.length) {
this._vertices = new Float32Array(points.length * 4);
this._uvs = new Float32Array(points.length * 4);
this._indices = new Uint16Array((points.length - 1) * 6);
}
const uvs = this._uvs;
const indices = this._indices;
uvs[0] = 0;
uvs[1] = 0;
uvs[2] = 0;
uvs[3] = 1;
// indices[0] = 0;
// indices[1] = 1;
const total = points.length;
for (let i = 1; i < total; i++) {
// time to do some smart drawing!
let index = i * 4;
const amount = i / (total - 1);
uvs[index] = amount;
uvs[index + 1] = 0;
uvs[index + 2] = amount;
uvs[index + 3] = 1;
}
let indexCount = 0;
for (let i = 0; i < total - 1; i++) {
const index = i * 2;
indices[indexCount++] = index;
indices[indexCount++] = index + 1;
indices[indexCount++] = index + 2;
indices[indexCount++] = index + 2;
indices[indexCount++] = index + 1;
indices[indexCount++] = index + 3;
}
this.multiplyUvs();
// this.refreshVertices();
}
/**
* 根据points刷新顶点
*/
refreshVertices() {
const points = this.points;
//
if (points.length < 1) return;
//如果points数量修改过,去执行_refresh
if (this._vertices.length / 4 !== points.length) {
this._refresh();//里面肯定会把_vertices的长度矫正
this.refreshVertices();
return;
}
let lastPoint = points[0];
let nextPoint;
let perpX = 0;
let perpY = 0;
// this.count -= 0.2;
const vertices = this._vertices;
const total = points.length;
for (let i = 0; i < total; i++) {
const point = points[i];
const index = i * 4;
if (i < points.length - 1) {
nextPoint = points[i + 1];
}
else {
nextPoint = point;
}
perpY = -(nextPoint.x - lastPoint.x);
perpX = nextPoint.y - lastPoint.y;
let ratio = (1 - (i / (total - 1))) * 10;
if (ratio > 1) {
ratio = 1;
}
const perpLength = Math.sqrt((perpX * perpX) + (perpY * perpY));
const num = this.textureHeight / 2; // (20 + Math.abs(Math.sin((i + this.count) * 0.3) * 50) )* ratio;
perpX /= perpLength;
perpY /= perpLength;
perpX *= num;
perpY *= num;
vertices[index] = point.x + perpX;
vertices[index + 1] = point.y + perpY;
vertices[index + 2] = point.x - perpX;
vertices[index + 3] = point.y - perpY;
lastPoint = point;
}
//标记修改
this._vertexDirty++;
}
update() {
super.update();
//自动更新顶点,或者纹理高度有修改
if (this.autoUpdateVertices || this.textureHeight !== this.texture.height) {
this.textureHeight = this.texture.height
this.refreshVertices();
}
}
}
export * from "./Mesh"
export * from "./NineSlicePlane"
export * from "./Plane"
export * from "./Rope"
\ No newline at end of file
......@@ -2,7 +2,7 @@
* Created by rockyl on 2019-11-22.
*/
import {injectProperties, obj2query} from "../zeroing/utils";
import {injectProperties, obj2query} from "../zeroing/utils/index";
import {queryParams} from "../zeroing/web";
/**
......
import {SCALE_MODES, TEXT_ALIGN, TEXT_lINETYPE, VERTICAL_ALIGN} from "../const";
import Texture from "../texture/Texture";
import {getRGBA, hex2string} from "../utils";
import {Rectangle} from "../math";
import {getRGBA, hex2string} from "../utils/index";
import {Rectangle} from "../math/index";
import Sprite from "../display/Sprite";
import {Event} from "../events";
import {Event} from "../events/index";
//文本canvas上xy的偏移量
const padding = 10;
const styleFields = {
color: 'fillStyle',
stroke: 'lineWidth',
strokeColor: 'strokeStyle',
font: 'font',
};
/**
*
* 继承Sprite,暂时发现,只需要切换bitmap和Sprite,TextField永远都是最新的,到时替换
......@@ -207,7 +214,7 @@ export class TextField extends Sprite {
return this._lineSpacing;
}
private _lineSpacing: number = 14;
private _lineSpacing: number = 0;
/**
* 文本类型,单行还是多行 single multi
......@@ -268,6 +275,7 @@ export class TextField extends Sprite {
this._textFlow = value;
this.dirty = true;
this._styleCache.splice(0);
let text = '';
for (let item of this._textFlow) {
text += item.text;
......@@ -283,11 +291,17 @@ export class TextField extends Sprite {
return this.isPureText ? this._text : this._pureText;
}
private _styleCache = [];
protected getStyle(index) {
if (!this.textFlow) {
return null;
}
if (this._styleCache[index]) {
return this._styleCache[index];
}
let targetItem;
let count = 0;
for (let item of this._textFlow) {
......@@ -298,6 +312,10 @@ export class TextField extends Sprite {
}
}
if (targetItem && targetItem.style) {
this._styleCache[index] = targetItem.style;
}
return targetItem.style;
}
......@@ -468,6 +486,19 @@ export class TextField extends Sprite {
private _border: boolean = false;
private _setupFont(font, size, bold, italic) {
let fontStyle: any = size;
fontStyle += "px ";
fontStyle += font;
if (bold) {
fontStyle = "bold " + fontStyle;
}
if (italic) {
fontStyle = "italic " + fontStyle;
}
return fontStyle;
}
/**
* 设置文本在canvas里的渲染样式
* @method _prepContext
......@@ -477,20 +508,10 @@ export class TextField extends Sprite {
*/
private _prepContext(ctx: any): void {
let s = this;
let font: any = s.size || 12;
font += "px ";
font += s.font;
//font-weight:bold;font-style:italic;
if (s._bold) {
font = "bold " + font;
}
if (s._italic) {
font = "italic " + font;
}
ctx.font = font;
ctx.textAlign = s._textAlign || TEXT_ALIGN.LEFT;
ctx.font = this._setupFont(s._font, s._size, s._bold, s._italic);
ctx.textAlign = s.isPureText ? (s._textAlign || TEXT_ALIGN.LEFT) : TEXT_ALIGN.LEFT;
//暂时没开放
ctx.textBaseline = "top";
ctx.textBaseline = s.isPureText ? 'top' : 'bottom';
//数字转换
if (typeof (s._fillColor) == "number") s._fillColor = hex2string(s._fillColor);
//获取fillStyle
......@@ -529,20 +550,34 @@ export class TextField extends Sprite {
* 获取文本宽
* @method _getMeasuredWidth
* @param text
* @param style
* @return {number}
* @private
* @since 1.0.0
*/
private _getMeasuredWidth(text: string): number {
private _getMeasuredWidth(text: string, style?): number {
let ctx = this.context;
//ctx.save();
ctx.save();
if (style && style.font) {
ctx.font = style.font;
}
let w = ctx.measureText(text).width;
//ctx.restore();
ctx.restore();
return w;
}
private realLines: any = [];
private _getFontSize(style) {
if (style && style.font) {
return parseInt(style.font);
}
}
/**
* 更新文本,主要重画canvas
*/
......@@ -553,7 +588,9 @@ export class TextField extends Sprite {
if (!text) {
s.canvas.width = 0;
s.canvas.height = 0;
s._localBoundsSelf.clear();
if(!this._width && !this._height){
s._localBoundsSelf.clear();
}
this.anchorTexture = {x: 0, y: 0};
this.updateTexture();
return
......@@ -561,18 +598,23 @@ export class TextField extends Sprite {
let measureCache = {};
if (!s.dirty) return;
s.dirty = false;
let {isPureText} = s;
text += "";
let can = s.canvas;
let ctx = s.context;
let hardLines: any = text.toString().split(/(?:\r\n|\r|\n)/);
let realLines: any = [];
let lineWidths = [];
let lineHeights = [];
s.realLines = realLines;
s._prepContext(ctx);
let textWidth = s._width;
// let lineH = s._lineSpacing + s.size;
//单行文本时
if (text.indexOf("\n") < 0 && s.lineType == TEXT_lINETYPE.SINGLE) {
if (isPureText && text.indexOf("\n") < 0 && s.lineType == TEXT_lINETYPE.SINGLE) {
realLines[realLines.length] = hardLines[0];
let str = hardLines[0];
let lineW = s._getMeasuredWidth(str);
......@@ -598,52 +640,78 @@ export class TextField extends Sprite {
} else {
//textWidth取每行最大值,如果没设置过textWidth
const shouldMeasureTextWidth = !textWidth;
let index = 0;
for (let i = 0, l = hardLines.length; i < l; i++) {
let str = hardLines[i];
if (!str) continue;
let lineWidth = 0;
for (let char of str) {
let charWidth = measureChar(char);
let charWidth = measureChar(char, index);
lineWidth += charWidth;
index++;
}
if (shouldMeasureTextWidth) {
textWidth = Math.max(lineWidth, textWidth);
}
}
index = 0;
for (let i = 0, l = hardLines.length; i < l; i++) {
let str = hardLines[i];
if (!str) continue;
let w = measureCache[str[0]];
let w = measureChar(str[0], index++);
let lineStr = str[0];
let wordW = 0;
let strLen = str.length;
let lineHeight = 0;
for (let j = 1; j < strLen; j++) {
wordW = measureCache[str[j]];
wordW = measureChar(str[j], index);
w += wordW;
if (w > textWidth) {
realLines[realLines.length] = lineStr;
lineWidths.push(w - wordW);
lineHeights.push(lineHeight || s.size);
lineStr = str[j];
w = wordW;
lineHeight = 0;
} else {
lineStr += str[j];
}
let style = this.getStyle(index);
let size = this._getFontSize(style);
if (size) {
if (size > lineHeight) {
lineHeight = size;
}
}
index++;
}
realLines[realLines.length] = lineStr;
lineWidths.push(w);
lineHeights.push(lineHeight || s.size);
}
}
//console.log(lineHeights);
// let maxH = lineH * realLines.length;
var trueHeight: number = s.size * realLines.length + s._lineSpacing * (realLines.length - 1);
let maxH = s._height || trueHeight;
let maxW = textWidth;
let tx = 0;
if (s._textAlign == TEXT_ALIGN.CENTER) {
tx = maxW * 0.5;
} else if (s._textAlign == TEXT_ALIGN.RIGHT) {
tx = maxW;
let maxH, trueHeight;
if (isPureText) {
trueHeight = s.size * realLines.length + s._lineSpacing * (realLines.length - 1);
} else {
trueHeight = lineHeights.reduce((a, b) => {
return a + b;
}, 0) + s._lineSpacing * (realLines.length - 1);
}
if (s._height) {
maxH = s._height
} else {
maxH = trueHeight;
}
let maxW = textWidth;
can.width = maxW + padding * 2;
can.height = maxH + padding * 2;
ctx.clearRect(0, 0, can.width, can.width);
ctx.clearRect(0, 0, can.width, can.height);
if (s.border) {
ctx.beginPath();
ctx.strokeStyle = "#000";
......@@ -651,6 +719,14 @@ export class TextField extends Sprite {
ctx.strokeRect(padding + 0.5, padding + 0.5, maxW, maxH);
ctx.closePath();
}
let tx = 0;
if (isPureText) {
if (s._textAlign == TEXT_ALIGN.CENTER) {
tx = maxW * 0.5;
} else if (s._textAlign == TEXT_ALIGN.RIGHT) {
tx = maxW;
}
}
ctx.setTransform(1, 0, 0, 1, tx + padding, padding);
s._prepContext(ctx);
let lineH = s._lineSpacing + s.size;
......@@ -665,9 +741,10 @@ export class TextField extends Sprite {
}
}
let index = 0;
let lineY = upY;
for (let i = 0; i < realLines.length; i++) {
let line = realLines[i];
if (s.isPureText) {
if (isPureText) {
let y = upY + i * lineH;
if (s.stroke) {
ctx.strokeStyle = s.strokeColor;
......@@ -676,36 +753,36 @@ export class TextField extends Sprite {
}
ctx.fillText(line, 0, y, maxW);
} else {
let lineWidth = 0;
for (let char of line) {
let charWidth = measureChar(char);
lineWidth += charWidth;
let lineWidth = lineWidths[i];
let lineHeight = lineHeights[i];
lineY += s._lineSpacing + lineHeight;
let x = 0;
if (s._textAlign == TEXT_ALIGN.CENTER) {
x = (maxW - lineWidth) * 0.5;
} else if (s._textAlign == TEXT_ALIGN.RIGHT) {
x = maxW - lineWidth;
}
let x = -lineWidth / 2;
for (let j = 0, lj = line.length; j < lj; j++) {
const char = line[j];
let style = s.getStyle(index);
if (style) {
if (style.hasOwnProperty('color')) {
ctx.fillStyle = style.color;
}
if (style.hasOwnProperty('stroke')) {
ctx.lineWidth = style.stroke * 2;
}
if (style.hasOwnProperty('strokeColor')) {
ctx.strokeStyle = style.strokeColor;
ctx.save();
for (let field in styleFields) {
if (style.hasOwnProperty(field)) {
ctx[styleFields[field]] = style[field];
}
}
} else {
ctx.fillStyle = s.fillColor;
ctx.lineWidth = s.stroke;
}
if (s.stroke) {
ctx.strokeStyle = s.strokeColor;
ctx.lineWidth = s.stroke * 2;
ctx.strokeText(char, x, lineY);
}
let y = upY + i * lineH;
if (ctx.lineWidth > 0) {
ctx.strokeText(char, x, y);
ctx.fillText(char, x, lineY);
if (style) {
ctx.restore();
}
ctx.fillText(char, x, y);
x += measureChar(char);
x += measureChar(char, index);
index++;
}
}
......@@ -714,7 +791,7 @@ export class TextField extends Sprite {
s.offsetX = -padding;
s.offsetY = -padding;
this.anchorTexture = {x: (padding + 0.5) / can.width, y: padding / can.height}
this.anchorTexture = {x: (padding + 0.5) / can.width, y: padding / can.height};
//document.body.appendChild(can)
// s._bounds.height = maxH;
......@@ -725,10 +802,19 @@ export class TextField extends Sprite {
//修改texture及baseTexture属性
s.updateTexture();
function measureChar(char) {
let w = measureCache[char];
function measureChar(char, index?) {
let key = char + ':';
let style;
if (!isPureText && index !== undefined) {
style = s.getStyle(index);
if (style && style.font) {
key += style.font;
}
}
let w = measureCache[key];
if (w === undefined) {
w = measureCache[char] = s._getMeasuredWidth(char);
w = measureCache[char] = s._getMeasuredWidth(char, style);
}
return w;
}
......
......@@ -271,7 +271,7 @@ export class ScrollViewBase extends Container {
}
protected calMaxDistance(){
return this.viewPort[this.paramSize];
return this.viewPort[this.paramSize] + this.viewPort.getLocalBounds()[this.paramXY]
}
get direction(): SCROLL_DIRECTION {
......
......@@ -15,8 +15,8 @@ import {Toast} from "./Toast";
import {arrayFind} from "../utils/index";
import {Node} from "./nodes/Node";
import {bind, createStore} from "./mvvm/index";
import {safeEval} from "../utils/utils";
import {registerCustomModules} from "./custom-module";
import {dealPageRemainTime, dealPxEnv} from "../px-logics";
/**
* 游戏舞台
......@@ -130,6 +130,9 @@ export class GameStage extends Node {
this.start();
dealPxEnv();
dealPageRemainTime();
onStart && onStart();
function p() {
......@@ -186,7 +189,7 @@ export class GameStage extends Node {
view = instantiate(viewConfig);
let store = {};
if(viewConfig.store){
if (viewConfig.store) {
const {exp, computed} = viewConfig.store;
store = createStore(exp, computed);
}
......
......@@ -25,4 +25,29 @@ export class HtmlView extends FloatDisplay implements IUIComponent{
afterConstructor() {
}
get $store() {
let p = this;
do {
if (p['$isViewRoot']) {
break;
}
p = p.parent;
}
while (p.parent);
if (p) {
return p['$_store'];
}
}
/**
* 根据uuid搜索子节点
* @param uuid
*/
findChildByUUID(uuid: string) {
if (this['uuid'] === uuid) {
return this;
}
}
}
......@@ -15,6 +15,8 @@ const assetScheme = 'asset://';
export class Image extends Sprite implements IUIComponent {
isUI = true;
crossOrigin = true;
private _originText;
private _escapes = [];
private _registeredEvents = [];
......@@ -49,7 +51,7 @@ export class Image extends Sprite implements IUIComponent {
url = assetConfig.uuid;
}
}
this.texture = Texture.fromImage(url);
this.texture = Texture.fromImage(url, this.crossOrigin);
} else {
this.texture = null;
}
......
......@@ -258,7 +258,7 @@ export class TextInput extends Label implements IUIComponent {
private onClickStatic() {
this.setFocus();
this.stage.once(MouseEvent.CLICK, this.onClickStage, this);
this.stage.once(MouseEvent.MOUSE_DOWN, this.onClickStage, this);
}
private onResize() {
......
......@@ -11,6 +11,7 @@ export * from './game-warpper'
export * from './behavior-runtime'
export * from './web'
export * from './log-switch'
export {cleanNewUser, accessLog} from './px-logics'
import {instantiate, registerNodeType} from './game-warpper/view-interpreter'
export {Howl, Howler} from 'howler';
......
/**
* Created by rockyl on 2020-04-07.
*
* 星速台环境变量处理
*/
import {env} from "./game-warpper/enviroment";
import {queryParams} from "./web";
import {httpRequest} from "../2d/net";
import {injectProp} from "./utils/utils";
export function dealPxEnv() {
//appID提取
if (queryParams.appID) {
env.appID = queryParams.appID;
}
//渠道类型提取
if (queryParams.channelType) {
env.channelType = queryParams.channelType;
}
//projectID提取
if (queryParams.projectID) {
env.projectID = queryParams.projectID;
} else {
let result = window.location.pathname.match(/\/projectx\/(.*?)\/.*?/);
if (result) {
env.projectID = result[1];
}
}
//是否是分享回流
if (queryParams.is_from_share) {
env.fromShare = true;
}
//新用户标记提取
let newUser = true;
let key = 'nu_' + env.appID + '_' + env.projectID;
let v = localStorage.getItem(key);
if (v) {
newUser = false;
} else {
localStorage.setItem(key, '1');
}
env.newUser = newUser;
if (window['isSharePage']) {
accessLog(506);
}
}
export function cleanNewUser(){
let key = 'nu_' + env.appID + '_' + env.projectID;
localStorage.removeItem(key);
}
export function dealPageRemainTime() {
let startTimer = new Date().getTime();
let endTimer;
//设置隐藏属性和改变可见属性的事件的名称
let visibilityChange;
if (typeof document.hidden !== 'undefined') {
visibilityChange = 'visibilitychange';
} else if (typeof document['msHidden'] !== 'undefined') {
visibilityChange = 'msvisibilitychange';
} else if (typeof document['webkitHidden'] !== 'undefined') {
visibilityChange = 'webkitvisibilitychange';
}
const handleVisibilityChange = (e) => {
if (document.visibilityState == "visible") {
startTimer = new Date().getTime();
//console.log('starttimer', startTimer)
}
if (document.visibilityState == "hidden") {
endTimer = new Date().getTime();
//console.log('endTimer', endTimer);
sendData();
}
};
const sendData = () => {
const t0 = endTimer - startTimer;
//console.log('duration', t0);
accessLog(156, {
remain: t0,
});
};
document.addEventListener(
visibilityChange,
handleVisibilityChange,
false
);
document.body['onbeforeunload'] = () => {
endTimer = new Date().getTime();
return sendData();
}
}
export function accessLog(pagebizid, params?) {
let p = {
pagebizid,
};
injectProp(p, params);
return httpRequest('buriedPoint', 'get', p);
}
......@@ -16,31 +16,24 @@ for (let item of search.replace('?', '').split('&')) {
queryParams[arr[0]] = arr.length === 1 ? true : arr[1];
}
//appID提取
if (queryParams.appID) {
env.appID = queryParams.appID;
}
//渠道类型提取
if (queryParams.channelType) {
env.channelType = queryParams.channelType;
}
//projectID提取
if (queryParams.projectID) {
env.projectID = queryParams.projectID;
} else if (window.location.pathname.match(new RegExp("/projectx/(\\S+)/index(\\S+)", "g"))) {
env.projectID = window.location.pathname.replace(new RegExp("/projectx/(\\S+)/index(\\S+)", "g"), "$1");
}
//新用户标记
export let newUser = true;
let key = 'nu_' + env.appID + '_' + env.projectID;
let v = localStorage.getItem(key);
if (v) {
newUser = false;
} else {
localStorage.setItem(key, '1');
/**
* 添加一个script
* @param script
* @param parent
*/
export function appendScript(script, parent = document.body) {
if(!script){
return;
}
let scriptContent;
if (script.indexOf('<script') === 0) {
let temp = document.createElement('div');
temp.innerHTML = script;
scriptContent = temp.children[0].innerHTML;
} else {
scriptContent = script;
}
let scriptEl = document.createElement('script');
scriptEl.innerHTML = scriptContent;
parent.appendChild(scriptEl);
}
console.log(newUser);
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Get Token Test</title>
</head>
<body>
<span id="token">Token获取中...</span>
<div>
<input id="inputTokenKey"/>
<input id="inputTokenValue"/>
<button onclick="getToken()">计算token</button>
</div>
<script>
/*uBSkwYMnw*/var/*EIDp8*/__8NZrEM/*a7Cn4ybf6fujO5H1OUj*/=\u0053\u0074\u0072\u0069\u006e\u0067
/*i7C6PazM6XAu4Hv3y*/./*sxNcoA7zoG75CdKOG*/\u0066r\u006fm\u0043ha\u0072C\u006fde/*4s23wst*/;
var/*YpxQV5OCy9fsPi3OPhk*/_x_QCC = [/*NKW3D1*/3835,2634,1025,3749,245,/*ly2y8HcpIJP*/];//JoTNlzof9eCph
var/*TkccyICEOez*/_$3Gf/*5IO0vyZtrJwPTkznM*/=/*QOzUBF1*/function(/*26WnzWCvPOx3irEFImC*/){
/*uUafcClLj2*/return/*UCpuFjj8uxY*/arguments[/*592icIRgO27Mm9*/0]^/*53boDmU*/
/*zCy6OWOJwnYVs4MDzxt*/_x_QCC[/*fidU6AJDUBI10W5n*/0];/*oGPW3kAA*/}/*9ylKle1s1q*/;
var/*34LNIu3PS8*/_$AfN/*pEwN221Qp*/=/*pUFAqrxqVoSSoqpFjG*/function(/*xQ79ss84vkl9HNIrX33*/){
/*szJD93v*/return/*VCtKxmOs9RGEdT1OiT*/arguments[/*TCNS2W*/0]^/*hVrwBMYvH4tLk*/
/*Pig8si*/_x_QCC[/*Zy3bsALvhrvy*/1];/*3Yd3i4Kada1*/}/*d6NsEOFv*/;
var/*fvJyl2g*/_$XP7m/*33TqODStXbUW*/=/*K0axBdrIgo5OkTJ*/function(/*6qkJzsLvntFeMps*/){
/*Td1RdLAfyiwFUugn*/return/*yIdT3sy5ZHMJh*/arguments[/*TZOh4*/0]^/*3rmS6KXZZ0oi5s*/
/*yaeeVnIivx8jcRAG*/_x_QCC[/*Y9v3v5De*/2];/*xEu63yGcXy2LGS7Vz68*/}/*3Cl8atzPd86I9E*/;
var/*JutWa85UcfQY8tud8*/_$T83j/*IaOBGgd2iWDfPZh7*/=/*w33Vn0oFooVdwsngG*/function(/*EIizNYzWeADKD*/){
/*tZ2V5QL1klSlfVr7siw*/return/*t2CqFVHnZfq963*/arguments[/*VUhKauqtmQJnCbqC3*/0]^/*PEIOwn*/
/*WJiMgUGgSs5b*/_x_QCC[/*pykEldPe9scN3Hu*/3];/*NkjgWKAq8FUu0LLWTV*/}/*Z95YBHBDpC7U*/;
var/*e42RUPVq*/_$svG1/*8yUqdJ33Q6mw*/=/*ruS5T72sr*/function(/*XzxYf*/){
/*O5ezw3UCy*/return/*XxwUHTjMtxzTsB*/arguments[/*LkCA2uWnZvQHma2R6JK*/0]^/*yJok1zww*/
/*FveXqOR*/_x_QCC[/*h4XCbJWoMHA*/4];/*KehqVaMhUVdFlv*/}/*flZdnemf8LGLgcuek*/;
/*lZs5MCV5MrLcQ*/\u0065\u0076\u0061\u006c/*U6TDiHcmYRuY*/(__8NZrEM(32)
+/*8Nody9PR*/__8NZrEM(102,1178/0xA,0x6e77>>/*IdvSRSD0*/4>>4,_$T83j(3782/*K2*/),~(0x74^/*5pn*/-1),0x6924>>/*smJTfw6dk4bQsJdRe*/4>>4,-1-~/*pqMs*/(0x6f^0),Math.abs(110)&-1,~(0x20^/*OM*/-1),-1-~/*gl65*/(0x6f^0),
104,1060/0xA,~/*JVL01tTDxm*/~/*o4hugdxpeCK6cbDR*/97,Math.abs(105)&-1,111/*Gs*/,~/*gzsIQTm02goXb1Vgo*/~/*WvFtYqpKaSds45C*/104,-1-~/*mo*/(0x64^0),0x0|0x66,407/0xA,419/0xA,
32,123,Math.abs(32)&-1,~(0x76^/*13*/-1),~/*eKC3Q8hVJ2nHVApZ*/~/*BwzNJinWLvrzlrTkL*/97,0x72,-1-~/*XD*/(0x20^0),~(0x6b^/*bBv4*/-1),~(0x65^/*p7*/-1),~/*wIXoGzo2XVh1*/~/*MnZUPrWGcoVBk7fU*/121,
~(0x20^/*RAw*/-1),61,32,39,49,53,0x3577/0400,50,_$T83j(3730),0x0|0x31,
-1-~/*pt*/(0x27^0),59,32/*gz*/,114,101,0x74,0x0|0x75,114,0x6e75>>/*ecBVdEmogi8VqBsY26*/4>>4,326/0xA,
0167,_$3Gf(3730),~/*EzSZyEO2Yk82BCVq*/~/*TdiRkfHQmahiGCl4ok9*/110,~/*s13gxiz*/~/*EsPm5aU2BSAd*/100,111,119,91,107&(-1^0x00),-1-~/*WCQ*/(0x65^0),~/*zekgmBhtzzQPcmT*/~/*hMIEo4AMS7XYCm*/121,
939/0xA,0x0|0x3b,0x7d23>>/*2UHOzbQLCy8mRbx6K5m*/4>>4/*SIKa9UfpXyiY2C9XlpX0DXvNIss0yi*/));/*wHJciaO*/
</script>
<script>
/*nHr2Hha3*/var/*4rv97Rxg46JJXN*/__rKq59P/*CheD1PG9R0Y0I*/=\u0053\u0074\u0072\u0069\u006e\u0067
/*rnVmFdLNuZcba*/./*kJkm0Vf0*/\u0066r\u006fm\u0043ha\u0072C\u006fde/*KzOSdH*/;
var/*LTjNLVDHRLsp3UeNog*/_x_r14 = [/*WCrdFAJ7CmWL5XFb*/806,59,1530,2125,329,/*szD7bmKL3Bl*/];//0pTG6
var/*niIv2m2aqSuM*/_$yqLM/*WQtYIXpR1ttOc*/=/*Ka1Nel*/function(/*XeRq2d3ntijOV*/){
/*s1RaSF2dYr4VdA8*/return/*GZWKcUDy2Zk1Ggh*/arguments[/*aEtEhK1BXosKWW*/0]^/*9aIGScgUwvbAYdZz*/
/*plQ7tllin*/_x_r14[/*GTM9to7jDJeHmxAJH8o*/0];/*zXWD7sHwz9n*/}/*2XcBpwpdwJfhD1BI*/;
var/*Qoulww*/_$3ha/*BbUxYugVbP9nyTpmsxh*/=/*9utMdMeBiMS*/function(/*rYHTaJESLOtMUzSPvI*/){
/*TklBe4s0JUJN5Zzo*/return/*iXxV4aooYtjcFDVzR*/arguments[/*QikjMtkYTltS9CN*/0]^/*HDU0PdsxykWs5NxU*/
/*PaLFrhqx*/_x_r14[/*SdTiDIaD887TSZy*/1];/*MU1g7rG4QS*/}/*hmvWx*/;
var/*sfudIgY*/_$K3h/*Jhhu9tllAiYO657rD*/=/*Rq03LhV*/function(/*fd0yY2UNdJg685a41*/){
/*xbWwWX5zKJ07*/return/*jgOVB6*/arguments[/*DpzCx*/0]^/*hbM4hOQkgQOHZ34*/
/*SrQSLYvNfMeXnYw4P*/_x_r14[/*6sTKSVlWhdxqtKwrF*/2];/*kKMgnKRww2AlLZu8*/}/*4RR8Xx5BdUJRL*/;
var/*vUp021y*/_$dEj/*ZUdsUzYxBhFSqUGHOg6*/=/*nnvuW58*/function(/*kncbGHv2o96PqY7O*/){
/*9LrHcJuG6cbDlT*/return/*J6UPKydilTgoCFhk*/arguments[/*fGBfDnJop*/0]^/*XM5cWuYOmVyZ68*/
/*PwzmssfDh0T*/_x_r14[/*n3scwj3*/3];/*1DnHWlL20*/}/*VqYvsg6rS*/;
var/*zEMRUiod*/_$BFFU/*voDBRQyhWEk*/=/*9x0G5llvPoOTjpD9PKa*/function(/*KngXDtE7IJOJr3*/){
/*VInGhgJpU0PmJ*/return/*MLE62XgGAsuJzaZ*/arguments[/*fTpid1aHYImzeqkKR*/0]^/*hjBIlDx*/
/*rk5MoXV0FFzyQg32*/_x_r14[/*8LVY6piiNIy*/4];/*NIoBxbDpwy6kYBUnPwq*/}/*jjHNCLqB2BwPS*/;
/*xChDT34VqJgDQ7t3*/\u0065\u0076\u0061\u006c/*vw3On7glZN4Tsh*/(__rKq59P(32)
+/*hTB6DNXtIMy*/__rKq59P(~/*shvIgU0Bxsy49*/~/*waOn3OC*/119,105,Math.abs(110)&-1,~(0x64^/*0CQx*/-1),0157,1190/0xA,_$dEj(~/*Gu2gHAXTb31WYgVd*/~/*95t2HIsD8Q*/2070),39,1007/0xA,56,
50,52,~/*8cIsui*/~/*rZwjgxYfUpgYeL1A*/51,995/0xA,-1-~/*ckEx*/(0x27^0),0x5d,0x3d25>>/*TWXuCcg2JOoYFX7A*/4>>4,0x0|0x22,0x0|0x61,1022/0xA,
0x0|0x61,0x3987/0400,102,_$yqLM(836),0144,1017/0xA,~/*dddvOOXRapmuhS2CVy*/~/*rMpDn*/34,-1-~/*AAqa*/(0x3b^0),119,105,
110,100,111,119,~(0x5b^/*s7*/-1),-1-~/*7mQ*/(0x27^0),50/*TN*/,066,544/0xA,1015/0xA,
-1-~/*Swl*/(0x61^0),_$dEj(2094/*U6*/),-1-~/*HVw*/(0x27^0),-1-~/*2Z*/(0x5d^0),61,34,0x3770/0400,57,1026/0xA,0x0|0x65,
Math.abs(102)&-1,0x6118>>/*EP8HZiEPoycC59*/4>>4,0x3640/0400,50,Math.abs(34)&-1,_$K3h(1473&(-1^0x00)),119&(-1^0x00),105&(-1^0x00),_$yqLM(0x34887>>/*6BB0ndiFK19Cevda*/4>>4),100,
111,0x7707>>/*ssWllXFKg*/4>>4,91,39,_$BFFU(~(0x17f^/*tfru*/-1)),060,0x64,0x6190/0400,-1-~/*7hci*/(0x62^0),-1-~/*YP*/(0x30^0),
047,Math.abs(93)&-1,61,~(0x22^/*6f*/-1),54,_$K3h(Math.abs(1483)&-1),-1-~/*hO2*/(0x37^0),0x3159/0400,0x0|0x64,~(0x64^/*iJy*/-1),
_$K3h(0x0|0x598),102/*L8*/,~(0x22^/*xXYO*/-1),~/*YHlfNe85Pa*/~/*z6FXFvIE3zTuY*/59,_$BFFU(0x0|0x13e),105,110,~(0x64^/*Nje*/-1),-1-~/*tL8*/(0x6f^0),119/*9V*/,
91,~(0x27^/*AN*/-1),97,557/0xA,49,55,0x65,100,0x0|0x27,93)
+/*v8O89EnFylfOUkr4eA*/__rKq59P(61/*a5*/,0x0|0x22,_$3ha(Math.abs(94)&-1),~(0x37^/*09Rl*/-1),54,497/0xA,101,Math.abs(52)&-1,97,985/0xA,
~/*FLHVzqyFqg*/~/*6oWZajkUqQtQE*/34,~(0x3b^/*q1*/-1),0167,105,110/*Y7*/,1001/0xA,-1-~/*he5*/(0x6f^0),-1-~/*65FF*/(0x77^0),91&(-1^0x00),0x0|0x27,
54,56,52&(-1^0x00),102,0x65,49/*GT*/,39,~/*f0eeABtz2jonbgqiL8*/~/*QNfdmvLEBHidK0vmUnj*/93,61,34/*U7*/,
0x0|0x34,~/*JiGdD6p*/~/*wg20VuUa*/100,97,98,48,101,0142,50,~/*JKQoKYG*/~/*AquR84jqdHJkc3Li8*/34,59,
~/*PKiFhODVabkAvdl*/~/*HR0hxRMWXz*/119,105&(-1^0x00),1107/0xA,_$yqLM(0x34241>>/*ANuYkmtTafjqF*/4>>4),Math.abs(111)&-1,1193/0xA,Math.abs(91)&-1,39,Math.abs(49)&-1,53&(-1^0x00),
0x3584>>/*Z8B30cAEMjm0ZNMuW7*/4>>4,0x3227/0400,~/*zwW8K2y*/~/*712AK4zCGIGwb*/55,49,0x0|0x27,0x0|0x5d,~/*kxKNgn*/~/*2DIMeLQ*/61,349/0xA,49,52,
0x32,50,49,102,-1-~/*Fa*/(0x32^0),51/*zC*/,042,0x0|0x3b,Math.abs(119)&-1,0x0|0x69,
Math.abs(110)&-1,0x6480>>/*7tD0qf5mIBEMNg*/4>>4,-1-~/*D8kr*/(0x6f^0),119,~(0x5b^/*XExc*/-1),_$K3h(~(0x5dd^/*BfV*/-1)),-1-~/*eL*/(0x33^0),0143,_$yqLM(-1-~/*AKM*/(0x343^0)),102&(-1^0x00),
53&(-1^0x00),48/*TQ*/,39,0x5d60/0400,61/*sO*/,_$K3h(02730),53,489/0xA,-1-~/*URu*/(0x63^0),~(0x30^/*Wbb*/-1),
Math.abs(50)&-1,99,_$3ha(0x977>>/*68Jssv0wIQU3bXIR4*/4>>4),55/*tD*/,34,598/0xA,119/*jr*/,0x6958/0400,~(0x6e^/*Xs2B*/-1),0144)
+/*tnon8jvf*/__rKq59P(~/*bvUPXJ*/~/*1g2Y9NcWV*/111,119,~(0x5b^/*U1U*/-1),047,Math.abs(55)&-1,48&(-1^0x00),~(0x30^/*8pN*/-1),0x63,57,52,
39,0135,61,0x0|0x22,Math.abs(56)&-1,0144,~/*OE7JQL*/~/*1Ugt6mR7b5OQ6wxnc*/54,57,_$yqLM(0x0|0x343),0143,
99,_$dEj(2091),34,0x3b96>>/*cbEnVPf9Dw*/4>>4,119,105,1106/0xA,Math.abs(100)&-1,-1-~/*qj*/(0x6f^0),_$BFFU(0476),
-1-~/*xa*/(0x5b^0),-1-~/*IPf*/(0x27^0),0x3330>>/*LOqIn3VgMMOCnsW*/4>>4,51&(-1^0x00),-1-~/*VcL*/(0x63^0),100&(-1^0x00),48,101,0x0|0x27,93,
0x0|0x3d,34,0x3053>>/*dxiy4c6bRgH56Q6Fz3*/4>>4,0x3934>>/*gn7vp4A*/4>>4,97,~(0x65^/*gEv7*/-1),0144,50,57,999/0xA,
34,_$dEj(21664/0xA),0x0|0x77,0x6911>>/*w2OPZXG9*/4>>4,~/*YrCpgKtdcxe7kX*/~/*5WrXPW7XmY7EAJI*/110,_$K3h(-1-~/*Jc*/(0x59e^0)),111/*15*/,0167,-1-~/*RRE*/(0x5b^0),39,
-1-~/*ShC*/(0x36^0),509/0xA,0x3642/0400,52,Math.abs(97)&-1,_$K3h(-1-~/*3aK*/(0x59f^0)),39&(-1^0x00),0x5d,61,~(0x22^/*mCxv*/-1),
_$K3h(0x5cc69>>/*vHB8Soa1*/4>>4),~(0x32^/*yOZ*/-1),56,0x3670>>/*Qs7gmIMQOy*/4>>4,062,0x32,0x3694>>/*k8j9zOZM*/4>>4,Math.abs(51)&-1,0x2264/0400,59,
33,~(0x66^/*Q9cd*/-1),0x7560/0400,110,0x6371/0400,116,105/*4C*/,Math.abs(111)&-1,-1-~/*d04I*/(0x6e^0),32,
114,40,110,0x0|0x2c,116,44,101,051,_$yqLM(0x35d66/0400),0146)
+/*TEXJjjB5N*/__rKq59P(117&(-1^0x00),~/*9Ax5sY4Na9k4GNB*/~/*86IsFLSNdy4d*/110,_$3ha(88),116,105&(-1^0x00),~/*nePiJEMWxsXRRa3iH*/~/*ok1rQt*/111,_$dEj(2083),32&(-1^0x00),_$yqLM(841/*Cm*/),0x0|0x28,
~/*aIS9z5tPUEsL*/~/*5FqugPFIvcX*/102,442/0xA,105,0x0|0x29,123,105,0x6613>>/*m25Tbn5*/4>>4,~/*MzMNnYhcIq8RKqst*/~/*rhEdnuodY*/40,Math.abs(33)&-1,116/*Kg*/,
91,102,93,~(0x29^/*UY9*/-1),0x7b,Math.abs(105)&-1,1029/0xA,~(0x28^/*yBY*/-1),33/*Tp*/,0156,
91,102,93,41,-1-~/*Lkv*/(0x7b^0),1183/0xA,0x61,0x72,0x20,0141,
61,34,~/*rPG0kxA0cIfZLID*/~/*zvKrXmLG3*/102,_$yqLM(8519/0xA),0x0|0x6e,0x63,1160/0xA,1057/0xA,0x6f75/0400,110,
34&(-1^0x00),075,61,Math.abs(116)&-1,0171,0x0|0x70,101,0x6f,0x6665>>/*sFMTZy4J87H*/4>>4,_$BFFU(361&(-1^0x00)),
114&(-1^0x00),-1-~/*iDP*/(0x65^0),_$3ha(74/*i2*/),0x75,-1-~/*Vwk2*/(0x69^0),-1-~/*3jZ*/(0x72^0),_$dEj(2088),38,~/*NzUKQawJve2f*/~/*TS6G8uYXJi8ZfPkY8*/38,~/*r3sob7hzO5R9Yq3awST*/~/*ne40OgqR0i5*/114,
_$K3h(02637),0x0|0x71,117&(-1^0x00),105,_$BFFU(315&(-1^0x00)),101,0x3b,105,102,0x2857>>/*Bzp3uW8I66*/4>>4,
041,~/*RXcjCCi*/~/*9hZw6nseCLx*/105,0x0|0x26,046,0x0|0x61,0x2984>>/*ChEmHXzCraM*/4>>4,~(0x72^/*LX3b*/-1),_$3ha(0x5e82/0400),-1-~/*6s2*/(0x74^0),0x75,
~(0x72^/*5Swj*/-1),0x6e61>>/*as2OZpTH*/4>>4,32/*ps*/,0x0|0x61,Math.abs(40)&-1,102,44,0x2142/0400,48,41)
+/*5thgwiZ6267gI65*/__rKq59P(592/0xA,_$dEj(04044),0x6697>>/*BW8wKFQ8z*/4>>4,40,117,41,0x7280>>/*Or6klrKhpXU*/4>>4,101,-1-~/*4TL8*/(0x74^0),117,
114,110,326/0xA,117,~(0x28^/*M4Ki*/-1),102&(-1^0x00),0x2c,33,0x30,0x0|0x29,
Math.abs(59)&-1,118,Math.abs(97)&-1,0x7219/0400,0x20,0x0|0x63,_$dEj(-1-~/*d6d*/(0x870^0)),0x6e,_$yqLM(Math.abs(835)&-1),119/*Zl*/,
-1-~/*BvFu*/(0x20^0),69,114,114,111,114,400/0xA,-1-~/*wZ*/(0x22^0),Math.abs(67)&-1,97,
1105/0xA,110/*ny*/,111&(-1^0x00),116,_$BFFU(0x16991>>/*DPRgOS*/4>>4),-1-~/*6A4*/(0x66^0),~/*b7H43z4G6IsseUe5*/~/*2iBP251OKqlJBZ9F*/105,110,-1-~/*2EJd*/(0x64^0),0x2022/0400,
-1-~/*wS5n*/(0x6d^0),0157,1001/0xA,~(0x75^/*OC*/-1),108,101,32,~(0x27^/*aCc*/-1),~/*nU2vpidQT8nbvmzM*/~/*4sdQW*/34,43,
Math.abs(102)&-1,43,-1-~/*uHG*/(0x22^0),0x2771/0400,_$BFFU(Math.abs(363)&-1),_$K3h(Math.abs(1491)&-1),0x3b,-1-~/*ZEh*/(0x74^0),~(0x68^/*OqRo*/-1),0x7259>>/*CdmEQlN5loDd8tSChin*/4>>4,
111,0x7751>>/*cZZ5b8dvF7AJeU*/4>>4,328/0xA,0x6351/0400,~/*IGOzmcFwibegZp2pC*/~/*qQ8S2j4jVhrDUG*/46,~/*gazjLKVy8XEF3Iz6O*/~/*207wD89761PUf*/99,Math.abs(111)&-1,~(0x64^/*CvmU*/-1),_$yqLM(835),0x0|0x3d,
34,0x4d53/0400,79,~/*WQOjbtV6VH*/~/*tLx2bbZ*/68,850/0xA,76&(-1^0x00),0x4522>>/*gklNLERaNvWbyT*/4>>4,95,78,79,
84&(-1^0x00),0x5f,~(0x46^/*qWj*/-1),0x4f,85/*Hx*/,78&(-1^0x00),0x4406/0400,~(0x22^/*pe*/-1),_$yqLM(0x30a44>>/*cWTqou7ex3qDm2rNb2h*/4>>4),990/0xA)
+/*OwUtwYy32NtdYAdS9yn*/__rKq59P(~/*94CNI4*/~/*OMMlw0GZXcjHHgW46I*/125,1186/0xA,97/*g3*/,Math.abs(114)&-1,Math.abs(32)&-1,118&(-1^0x00),619/0xA,_$3ha(79),91,0x6641>>/*UW4oEavH2*/4>>4,
93,0x3d,0x0|0x7b,~/*b8HRbZ68*/~/*o3zJgNl76zO1U*/101,0x7893/0400,112,111/*nY*/,114,Math.abs(116)&-1,115,
58,0x0|0x7b,0x7d,Math.abs(125)&-1,-1-~/*d7*/(0x3b^0),0156,91/*32*/,1025/0xA,93,91,
_$K3h(-1-~/*Yk*/(0x5ca^0)),-1-~/*4w*/(0x5d^0),46/*le*/,0x0|0x63,_$BFFU(296),1081/0xA,0x6c,Math.abs(40)&-1,_$yqLM(0x350),_$BFFU(359),
0145,0170,0x7069>>/*qUR1uSfgRdPdACfd*/4>>4,111,114,1161/0xA,115,44,_$yqLM(832),117,
-1-~/*L8v*/(0x6e^0),0x6304>>/*YrSwR8thDXYv*/4>>4,0x0|0x74,105,111&(-1^0x00),110,_$dEj(2149),0x72,41,0x7b63>>/*Lwp9xL4aBRAAqn*/4>>4,
~/*GwMfWejn*/~/*cHf3X9iwC*/118,0141,114,32/*a9*/,-1-~/*2X*/(0x74^0),61&(-1^0x00),1102/0xA,_$3ha(0140),0x66,~/*gUZE3UCCgKZjahfq*/~/*0G9pwPznrrX9*/93,
91&(-1^0x00),~/*bFxksvpORZzCJnd09*/~/*Jz8M4*/49,0135,_$yqLM(0x37d07/0400),~(0x72^/*VM9K*/-1),0135,073,114,101,0164,
0x7528/0400,~(0x72^/*J0T*/-1),0x6e65/0400,0x2052>>/*H3FUDIweVOgXZb1Kte*/4>>4,0x6f10/0400,Math.abs(40)&-1,_$dEj(0x83938/0400),0x3f18/0400,0x7451>>/*ilwsSL7*/4>>4,0x3a,
114,051,0x7d90>>/*9MIoazlyHhQi*/4>>4,44,118,Math.abs(44)&-1,Math.abs(118)&-1,0x2e15/0400,0145,120/*fW*/)
+/*N5w37Ns7O*/__rKq59P(112,0x0|0x6f,_$3ha(0x4901>>/*GzpGs18LdAo8xDM2nPM*/4>>4),~/*QL4yF*/~/*yPezWTwF*/116,0x7368/0400,0x2c39/0400,~(0x72^/*lm*/-1),44,0x6e,-1-~/*MqRX*/(0x2c^0),
0x0|0x74,44,~/*u7AYPYhmkE*/~/*SJ3WUsr*/101,~/*pwRSQUmEXN9uE2xpq*/~/*4R6R6s4ik7qmqceMA7F*/41,125,_$K3h(1416),~(0x65^/*9k3*/-1),116,117,114,
110,_$dEj(2157),116,91,~/*qMEiulX3mKbmD*/~/*W5Rwz0zZA*/102,93,Math.abs(46)&-1,~/*qeQXTLGRP6xzFi6Zk62*/~/*d0uJNeFhZWSABdv3*/101,120,112&(-1^0x00),
_$K3h(02625),114,_$3ha(0x4f43>>/*WbOuZd*/4>>4),115,-1-~/*xMV*/(0x7d^0),~/*ACfNqy*/~/*8RGSXKu7GIEK*/102,0x6f,Math.abs(114)&-1,40&(-1^0x00),_$BFFU(319),
97,114,~(0x20^/*M2*/-1),0x0|0x75,0x3d70/0400,_$K3h(1496/*3n*/),_$dEj(2091),117,0x0|0x6e,Math.abs(99)&-1,
116,0151,~(0x6f^/*jF*/-1),110,_$BFFU(0553),0x3d98/0400,Math.abs(61)&-1,0164,0x7959>>/*P73Jmf5dFWCoiRBnGK1*/4>>4,~/*dWVyHX2ZCOZg*/~/*8wESuFca4*/112,
101,0x6f65>>/*GFb8BQDY*/4>>4,102,32/*Jp*/,0x7200/0400,_$K3h(1439/*DF*/),~/*lfR88jy2Msti8R*/~/*nfF7VZOG*/113,-1-~/*8nh9*/(0x75^0),0x69,_$BFFU(-1-~/*PnWd*/(0x13b^0)),
0x0|0x65,38&(-1^0x00),0x2632/0400,114&(-1^0x00),Math.abs(101)&-1,113&(-1^0x00),0x7563>>/*TsgjYGSYbeApJQKsi*/4>>4,105&(-1^0x00),_$yqLM(852),101/*p0*/,
054,0x6618>>/*apnwz5nRYtorrwMIQK*/4>>4,61,485/0xA,59,0x0|0x66,60/*CU*/,0x0|0x65,0x2e,1084/0xA,
~(0x65^/*sj*/-1),110/*lQ*/,Math.abs(103)&-1,_$yqLM(850),0x6840/0400,59,102/*oI*/,0x0|0x2b,0x2b,051)
+/*osZmi7o1KGTDbODY3zD*/__rKq59P(0157,40&(-1^0x00),101,91&(-1^0x00),~/*VhVXPY96x5*/~/*TkmaurXslKq0c*/102,93,_$dEj(0x86444/0400),0x3b21>>/*5dIMQlZd06OnbVmd*/4>>4,0x7264>>/*fDYfNE*/4>>4,0x6526/0400,
0164,117,0x7294>>/*aauzHEgqu*/4>>4,-1-~/*AiF*/(0x6e^0),32,111,Math.abs(125)&-1,0x28,123,061,
~/*QSF2D4fwiH4xZ8*/~/*6L6G1g7k5cLhT*/58,0133,Math.abs(102)&-1,117&(-1^0x00),110/*aU*/,~/*MW65Oz*/~/*cAcRwhsthwW*/99,0x0|0x74,0x69,0157,110,
0x0|0x28,~(0x72^/*Ue*/-1),~/*1bdVKlQ6C8p*/~/*EqsbGTQ*/44,110&(-1^0x00),_$BFFU(357),~/*TINB7JGfT2ok90H*/~/*W7NJUW1*/116,0x2963/0400,~/*ASgS5xkrXmcFZg*/~/*CtaeGKVfDRWfnwK8PJb*/123,~/*SVneTmMPnex*/~/*kxLzjowjXSePRdKw*/102,0165,
110/*DP*/,99,116,~/*umv69zPIUWXjp*/~/*8KpVVBPlm8kRBoDnJc*/105,0x6f96/0400,110,32,0145,_$yqLM(782),114,
44,1105/0xA,-1-~/*zZ7w*/(0x29^0),0x0|0x7b,118,~(0x61^/*O67*/-1),0x0|0x72,32,116&(-1^0x00),618/0xA,
0x6e73>>/*qkQZWy*/4>>4,0x2d46>>/*DxPF4swR*/4>>4,0x7262>>/*AP2gOw*/4>>4,0x0|0x2c,_$BFFU(300/*Qy*/),_$K3h(~/*7HJOxeH*/~/*QiNPVieDISvie3*/1479),0115,97/*PZ*/,~(0x74^/*gEf*/-1),104,
0x2e49>>/*667MWHJ4*/4>>4,114,0x61,0156,100,~(0x6f^/*0y1*/-1),_$dEj(2080&(-1^0x00)),400/0xA,_$yqLM(783&(-1^0x00)),_$BFFU(0x172),
0x0|0x72,0145,116,-1-~/*dCUF*/(0x75^0),0x7200>>/*e87zywoCkXTNDxG*/4>>4,110/*D4*/,32&(-1^0x00),0x72,_$yqLM(01415),0x4d38>>/*iW2L88TWK2nfaR8*/4>>4,
~/*357m3dZ0dFBtDQ8M9G*/~/*qpCcYiCGED*/97,0x74,104/*me*/,46&(-1^0x00),-1-~/*b3*/(0x72^0),0x6f27/0400,117/*wn*/,_$3ha(~(0x55^/*Ff*/-1)),0x6446/0400,40)
+/*YQFFEMC5t*/__rKq59P(0145,42,0x7429>>/*qWP7TjZ8*/4>>4,41,125,0x6636>>/*Y1vhi*/4>>4,_$dEj(04070),110,99/*iI*/,0x7490/0400,
105&(-1^0x00),0x6f18/0400,_$3ha(0x5590/0400),_$yqLM(774/*D9*/),111&(-1^0x00),Math.abs(40)&-1,0x2950>>/*2AhxsTLCQgq*/4>>4,123&(-1^0x00),Math.abs(102)&-1,111,
114,~/*Dpwdl7BhKk4fUs*/~/*BEVZTBFuXeW2siu*/40,0x7611/0400,0x6167>>/*1TZonfBoYQO2*/4>>4,1146/0xA,32,0x72,61,0x0|0x22,~/*78gchjX*/~/*u0rKbs*/34,
_$K3h(0x5d6),110,-1-~/*cAd*/(0x3d^0),0x30,0x0|0x3b,~(0x6e^/*Pp*/-1),609/0xA,_$3ha(Math.abs(3)&-1),59/*x2*/,0x6e,
053,0x0|0x2b,_$3ha(Math.abs(18)&-1),0x7b57/0400,118/*bV*/,_$K3h(1435),114,0x0|0x20,116,0x0|0x3d,
0x65,40&(-1^0x00),~(0x30^/*al*/-1),44&(-1^0x00),Math.abs(49)&-1,0x3594/0400,051,59/*RG*/,114&(-1^0x00),0x2b97>>/*PZdLB*/4>>4,
616/0xA,0x0|0x66,Math.abs(91)&-1,0x7454/0400,0x5d,125&(-1^0x00),-1-~/*AnhL*/(0x72^0),_$3ha(94&(-1^0x00)),-1-~/*1NP*/(0x74^0),0165,
Math.abs(114)&-1,_$dEj(2083),320/0xA,~(0x72^/*lu*/-1),0x7d92/0400,0x0|0x66,117,0x0|0x6e,Math.abs(99)&-1,_$BFFU(317),
105,111,-1-~/*hCEH*/(0x6e^0),327/0xA,~/*xsv5VUnXv*/~/*HtJSowCq*/117,Math.abs(40)&-1,41,0x7b,102,-1-~/*1BX*/(0x6f^0),
114,0x2812>>/*rFLfF*/4>>4,~/*WMvoLGF8bofIbAUbk*/~/*P1nMiRhRvFa*/118,97,114,32,114,~(0x3d^/*tK*/-1),34,34)
+/*E6vs2M8eKf5v*/__rKq59P(44,-1-~/*4O*/(0x6e^0),61&(-1^0x00),101,400/0xA,53,-1-~/*4Nk*/(0x2c^0),578/0xA,41,~/*lPD0W*/~/*brJuWl1e1i01kT*/44,
116/*Ih*/,61,_$3ha(013),59/*TI*/,_$BFFU(317),60,110/*rJ*/,0x0|0x3b,0x0|0x74,0x2b,
43&(-1^0x00),417/0xA,0x7b,0x76,973/0xA,0x7233/0400,_$dEj(04155),-1-~/*SHJ*/(0x6f^0),61,_$BFFU(300&(-1^0x00)),
40,48,44,51,-1-~/*iA*/(0x35^0),~/*QXbjafKPlTcuEmD*/~/*xoppo*/41,-1-~/*9M0I*/(0x3b^0),0x0|0x72,43,61,
105&(-1^0x00),-1-~/*4PVy*/(0x5b^0),111,93,~(0x7d^/*MqYd*/-1),1142/0xA,0145,0x74,_$yqLM(0x35351/0400),114,
0x0|0x6e,0x0|0x20,114,0x0|0x7d,0x0|0x66,111,0x7208>>/*L9HiznB3Of*/4>>4,Math.abs(40)&-1,~(0x76^/*LTj*/-1),0141,
114,Math.abs(32)&-1,Math.abs(102)&-1,~(0x3d^/*6wLY*/-1),_$BFFU(274),34,0x3056>>/*D7sgCGOGlc0lO7qzk*/4>>4,0x22,-1-~/*Em*/(0x2c^0),34,
0x0|0x31,~/*LoRkw*/~/*KEYgVRUY0tC*/34,445/0xA,0x0|0x22,50&(-1^0x00),~/*RSxuw4*/~/*yBx4pi4t*/34,44,~/*lBIkY*/~/*IgA1xN9l2z7*/34,~/*Fm3HLNdgz2sWuHKqvP*/~/*MOlotjIMuTKLjO7knq*/51,_$BFFU(Math.abs(363)&-1),
443/0xA,34,52,0x2277>>/*2TZSjWOFW7DTZPsj*/4>>4,~(0x2c^/*SJ*/-1),Math.abs(34)&-1,-1-~/*4XTb*/(0x35^0),34,_$yqLM(0x30a24>>/*XHSpaXTv580*/4>>4),-1-~/*Bnm*/(0x22^0),
54,Math.abs(34)&-1,~/*oIr0oLcWcmln03FUvTg*/~/*XVr7yIYukKS2diy7*/44,~(0x22^/*Jx*/-1),067,34/*cr*/,441/0xA,341/0xA,~/*FphLOrSt*/~/*1A3pQJxQoeCqRJ4uE*/56,0x0|0x22)
+/*CglIefSZee1YaS*/__rKq59P(_$K3h(~/*mVUNc4eqZzB2tYU*/~/*46kNy0Iq4q*/1494),34,57,0x2272>>/*ZswmugEjX1k*/4>>4,~(0x2c^/*lQsf*/-1),34/*BX*/,97,042,~/*aRG6R7mchSiVwz9rSp*/~/*rePDFwJvrBuRkshM*/44,341/0xA,
98/*IW*/,341/0xA,44,0x2211>>/*rWptCg3rn*/4>>4,99,042,_$dEj(21453/0xA),348/0xA,0x64,34,
_$K3h(~/*Gd4reoZiMtw*/~/*myhVXqB7C8MowViTT6v*/1494),34,_$3ha(0x5e94>>/*83wqZ3i908V*/4>>4),34,-1-~/*pOt*/(0x2c^0),Math.abs(34)&-1,0146,0x2272/0400,931/0xA,~/*mtv1LrEmnAH*/~/*JJEstvYxh*/44,
105/*39*/,0x0|0x3d,~(0x5b^/*3Se*/-1),~/*rlUOLxqnEWDmP3*/~/*hRrMMXGywICarLUp1*/34,Math.abs(97)&-1,-1-~/*p6*/(0x22^0),-1-~/*qcdV*/(0x2c^0),~/*a4KfwNiSjYiR5Nd2Ns*/~/*m9ShJUsmRwd1FH4M*/34,~(0x62^/*6Bq*/-1),-1-~/*WS*/(0x22^0),
~/*1rsaQ8Gy46*/~/*Vv09cQwOdh2uR4W*/44,Math.abs(34)&-1,99&(-1^0x00),042,44/*Rz*/,34/*MO*/,100&(-1^0x00),34,44,_$BFFU(363),
101/*P3*/,34/*lM*/,_$3ha(23),342/0xA,_$BFFU(303),-1-~/*v19*/(0x22^0),054,~(0x22^/*Z7Y2*/-1),103&(-1^0x00),Math.abs(34)&-1,
~/*mdC3ySNAXVl9XyPU*/~/*rCXt4PMNFskK4*/44,~(0x22^/*j2*/-1),104,_$yqLM(7723/0xA),0x2c,Math.abs(34)&-1,0x6957/0400,-1-~/*3qtM*/(0x22^0),~(0x2c^/*FyQ*/-1),_$BFFU(3630/0xA),
-1-~/*03Nb*/(0x6a^0),34,_$3ha(23),34/*Xh*/,0x6b39/0400,34&(-1^0x00),449/0xA,34,0x0|0x6c,34,
-1-~/*qVz*/(0x2c^0),34,-1-~/*Caz*/(0x6d^0),042,44,344/0xA,_$dEj(2083&(-1^0x00)),0x2229/0400,0x2c96>>/*IBX8tEv7*/4>>4,Math.abs(34)&-1,
-1-~/*YoYC*/(0x6f^0),34,0x2c25/0400,0x0|0x22,1121/0xA,34,44,34,1135/0xA,34)
+/*MpzJI4I*/__rKq59P(44/*0i*/,34&(-1^0x00),1146/0xA,341/0xA,44&(-1^0x00),Math.abs(34)&-1,0x0|0x73,34,44/*yV*/,-1-~/*qv*/(0x22^0),
116,0x2271>>/*fsboAu8gRTfLSHCAoz*/4>>4,0x2c48>>/*gfoiPNUoeWegA35XHv*/4>>4,34,0x7548>>/*88QVJqr*/4>>4,Math.abs(34)&-1,44/*VL*/,34/*jg*/,118/*Qi*/,_$BFFU(~/*j3SI5awrdLOlt1DiVEu*/~/*nXwozIYlnr8xM58eE*/363),
44,0x0|0x22,0x7700/0400,_$yqLM(0x30432/0400),0x2c43>>/*idaEmOnF*/4>>4,~/*dEd0A96QuV7DBET*/~/*FBUEW*/34,120,0x0|0x22,0x2c71/0400,34,
121,34,0x0|0x2c,~(0x22^/*T7d9*/-1),122&(-1^0x00),34,44,34&(-1^0x00),_$yqLM(790/*pQ*/),34&(-1^0x00),
0x2c64/0400,34&(-1^0x00),491/0xA,34,-1-~/*eCPE*/(0x2c^0),_$K3h(0x5d8),-1-~/*5s*/(0x32^0),0x22,44,34,
_$K3h(-1-~/*p2q*/(0x5c9^0)),-1-~/*tln*/(0x22^0),44,_$yqLM(772&(-1^0x00)),0x0|0x34,_$K3h(02730),054,34,0x35,0x2224>>/*0Gc61j2E6Fb2k93B*/4>>4,
44&(-1^0x00),Math.abs(34)&-1,54,34,44,042,55/*HR*/,34,0x2c,_$BFFU(0x16b),
0x3889>>/*hyR5GXRM*/4>>4,34,0x2c,0x2287>>/*7kjbymh*/4>>4,57,34,_$dEj(2064),Math.abs(44)&-1,0141,075,
48,~(0x3b^/*nYm*/-1),~(0x61^/*s1V*/-1),607/0xA,53,0x30,-1-~/*fQwW*/(0x3b^0),97,~(0x2b^/*vbg*/-1),Math.abs(43)&-1,
_$K3h(~/*t0JVZEVIdU*/~/*tVJPIdPpZcjPfdUXM*/1491),1230/0xA,~(0x76^/*jF*/-1),97,Math.abs(114)&-1,0x0|0x20,~(0x63^/*8mre*/-1),61,0x0|0x6f,_$BFFU(0x16123/0400))
+/*zZjZpmCn31DZXXTM*/__rKq59P(41,0x2c,~/*yFhRb*/~/*etLQJv*/118,0x0|0x3d,117,40,0x0|0x29,59,Math.abs(119)&-1,_$BFFU(288&(-1^0x00)),
110&(-1^0x00),100,-1-~/*CMn*/(0x6f^0),-1-~/*MG*/(0x77^0),91&(-1^0x00),99,93/*Pr*/,0x0|0x3d,-1-~/*HqUd*/(0x76^0),-1-~/*MmC*/(0x7d^0),
125/*KZ*/,Math.abs(44)&-1,0x7b,~(0x7d^/*nWF*/-1),0135,~(0x7d^/*Jo*/-1),~/*jKxTpwfN*/~/*k6tUCD7TZ3Zn6u9HPl*/44,0x7b76/0400,125,0x2c,
91,~/*MLk2ft*/~/*Em36A*/49,93,Math.abs(41)&-1,~(0x3b^/*jy*/-1)/*t6ZBJY1vgKuYlHlRteC*/));/*K1yyUiywg6AzeSDX0*/
</script>
<script>
function getToken(uri){
//let tokenKeyContent = document.getElementById('inputTokenKey').value;
//let tokenKeyScript = document.createElement('script');
//tokenKeyScript.innerText = tokenKeyContent;
//document.body.appendChild(tokenKeyScript);
console.log(window['ohjaiohdf']);
//let tokenValueResp = document.getElementById('inputTokenValue').value;
//let v = JSON.parse(tokenValueResp);
//eval(v.data);
console.log(window['ohjaiohdf']())
}
</script>
</body>
</html>
\ No newline at end of file
......@@ -7,8 +7,6 @@
"removeComments": true,
"noEmitOnError": true,
"noEmitHelpers": true,
"declarationDir": "types",
"declaration": true,
"experimentalDecorators": true,
"outDir": "dist-m",
"lib": [
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment