123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234 |
- (function() {
- var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
- var __module = nodeEnv ? module : {exports:{}};
- var __filename = 'preview-scripts/assets/scriptMain/CCCExtend.js';
- var __require = nodeEnv ? function (request) {
- return cc.require(request);
- } : function (request) {
- return __quick_compile_project__.require(request, __filename);
- };
- function __define (exports, require, module) {
- if (!nodeEnv) {__quick_compile_project__.registerModule(__filename, module);}"use strict";
- cc._RF.push(module, '18a5avfLKdBT7kFs/gOIxGw', 'CCCExtend');
- // scriptMain/CCCExtend.ts
- "use strict";
- var __extends = (this && this.__extends) || (function () {
- var extendStatics = function (d, b) {
- extendStatics = Object.setPrototypeOf ||
- ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
- function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
- return extendStatics(d, b);
- };
- return function (d, b) {
- extendStatics(d, b);
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- };
- })();
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
- };
- Object.defineProperty(exports, "__esModule", { value: true });
- /**
- * 重写引擎方法,进行一些功能扩展
- */
- var ccclass = cc._decorator.ccclass;
- var LevelExtend = /** @class */ (function (_super) {
- __extends(LevelExtend, _super);
- function LevelExtend() {
- return _super !== null && _super.apply(this, arguments) || this;
- }
- LevelExtend.prototype.onLoad = function () {
- CCCExtend.init();
- };
- LevelExtend = __decorate([
- ccclass
- ], LevelExtend);
- return LevelExtend;
- }(cc.Component));
- exports.default = LevelExtend;
- var CCCExtend = /** @class */ (function () {
- function CCCExtend() {
- }
- /** 初始化扩展 */
- CCCExtend.init = function () {
- this._extendRenderFlow();
- };
- /** 扩展渲染流,新增层级渲染 */
- CCCExtend._extendRenderFlow = function () {
- var FlagOfset = 0;
- var DONOTHING = 1 << FlagOfset++;
- var BREAK_FLOW = 1 << FlagOfset++;
- var LOCAL_TRANSFORM = 1 << FlagOfset++;
- var WORLD_TRANSFORM = 1 << FlagOfset++;
- var TRANSFORM = LOCAL_TRANSFORM | WORLD_TRANSFORM;
- var UPDATE_RENDER_DATA = 1 << FlagOfset++;
- var OPACITY = 1 << FlagOfset++;
- var COLOR = 1 << FlagOfset++;
- var OPACITY_COLOR = OPACITY | COLOR;
- var RENDER = 1 << FlagOfset++;
- var CHILDREN = 1 << FlagOfset++;
- var POST_RENDER = 1 << FlagOfset++;
- var FINAL = 1 << FlagOfset++;
- var renderFlow = cc["RenderFlow"];
- var _batcher = renderFlow.getBachther();
- var __levelBatcher = [];
- var __renderQueue = [];
- Object.defineProperty(renderFlow.prototype, "_opacity", {
- value: function (node) {
- _batcher.parentOpacityDirty++;
- if (node["__levelRender"] && __levelBatcher[node["__itemIndex"]]) {
- __levelBatcher[node["__itemIndex"]].parentOpacityDirty = 1;
- }
- this._next._func(node);
- node._renderFlag &= ~OPACITY;
- if (node["__levelRender"] && __levelBatcher[node["__itemIndex"]] && node["__lastChildren"]) {
- __levelBatcher[node.__itemIndex].parentOpacityDirty = 0;
- }
- _batcher.parentOpacityDirty--;
- }
- });
- Object.defineProperty(renderFlow.prototype, "_worldTransform", {
- value: function (node) {
- _batcher.worldMatDirty++;
- if (node["__levelRender"] && __levelBatcher[node["__itemIndex"]]) {
- __levelBatcher[node["__itemIndex"]].worldMatDirty = 1;
- }
- var t = node._matrix;
- var trs = node._trs;
- var tm = t.m;
- tm[12] = trs[0];
- tm[13] = trs[1];
- tm[14] = trs[2];
- node._mulMat(node._worldMatrix, node._parent._worldMatrix, t);
- node._renderFlag &= ~WORLD_TRANSFORM;
- this._next._func(node);
- if (node["__levelRender"] && __levelBatcher[node["__itemIndex"]] && node["__lastChildren"]) {
- __levelBatcher[node.__itemIndex].worldMatDirty = 0;
- }
- _batcher.worldMatDirty--;
- }
- });
- var levelSplit = function (node, lv, itemIndex) {
- if (!__renderQueue[lv]) {
- __renderQueue[lv] = [];
- }
- __renderQueue[lv].push(node);
- lv++;
- node["__renderLv"] = lv;
- node["__levelRender"] = true;
- node["__itemIndex"] = itemIndex;
- var cs = node.children;
- for (var i = 0; i < cs.length; ++i) {
- var c = cs[i];
- if (!__renderQueue[lv]) {
- __renderQueue[lv] = [];
- }
- lv = levelSplit(c, lv, itemIndex);
- }
- return lv;
- };
- var checkLevelRender = function (levelRenderNode) {
- var cs = levelRenderNode.children;
- var rootOpacityInHierarchy = levelRenderNode["opacity"] / 255;
- __levelBatcher = [];
- for (var i = 0; i < cs.length; ++i) {
- __levelBatcher.push({ worldMatDirty: 0, parentOpacityDirty: 0 });
- levelSplit(cs[i], 0, i);
- }
- while (__renderQueue.length > 0) {
- var list = __renderQueue.shift();
- if (list.length > 0) {
- while (list.length > 0) {
- var n = list.shift();
- n["__lastChildren"] = __renderQueue.length == 0;
- n["__levelRender"] = true;
- var opacityInHierarchy = n.parent["__opacityInHierarchy"];
- if (opacityInHierarchy === undefined) {
- opacityInHierarchy = rootOpacityInHierarchy;
- }
- var opacity = (opacityInHierarchy * (n["_opacity"] / 255));
- n["__opacityInHierarchy"] = opacity;
- var cullingMask = n["_cullingMask"];
- var worldMatDirty = 0;
- if (__levelBatcher[n["__itemIndex"]]) {
- worldMatDirty = __levelBatcher[n["__itemIndex"]].worldMatDirty || 0;
- }
- var parentOpacityDirty = 0;
- if (__levelBatcher[n["__itemIndex"]]) {
- parentOpacityDirty = __levelBatcher[n["__itemIndex"]].parentOpacityDirty || 0;
- }
- var worldTransformFlag = (worldMatDirty || _batcher.worldMatDirty) ? WORLD_TRANSFORM : 0;
- var worldOpacityFlag = (parentOpacityDirty || _batcher.parentOpacityDirty) ? OPACITY_COLOR : 0;
- var worldDirtyFlag = worldTransformFlag | worldOpacityFlag;
- n["_renderFlag"] |= worldDirtyFlag;
- if (!n["_activeInHierarchy"])
- continue;
- n["_cullingMask"] = n.groupIndex === 0 ? cullingMask : 1 << n.groupIndex;
- // TODO: Maybe has better way to implement cascade opacity
- var colorVal = n["_color"]._val;
- n["_color"]._fastSetA(n["_opacity"] * opacity);
- renderFlow.flows[n["_renderFlag"]]._func(n);
- n["_color"]._val = colorVal;
- }
- }
- }
- };
- Object.defineProperty(renderFlow.prototype, "_children", {
- value: function (node) {
- if (node.__levelRender)
- return;
- var cullingMask = node._cullingMask;
- var enableLevelRender = node["__enableLevelRender"];
- var parentOpacityInHierarchy = node.parent ? node.parent["__opacityInHierarchy"] : undefined;
- var parentOpacity = parentOpacityInHierarchy !== undefined ? parentOpacityInHierarchy : _batcher.parentOpacity;
- if (!enableLevelRender && !node.__levelRender) {
- var opacity = (parentOpacity *= (node._opacity / 255));
- node["__opacityInHierarchy"] = opacity;
- var worldTransformFlag = _batcher.worldMatDirty ? WORLD_TRANSFORM : 0;
- var worldOpacityFlag = _batcher.parentOpacityDirty ? OPACITY_COLOR : 0;
- var worldDirtyFlag = worldTransformFlag | worldOpacityFlag;
- var children = node._children;
- for (var i = 0, l = children.length; i < l; i++) {
- var c = children[i];
- // Advance the modification of the flag to avoid node attribute modification is invalid when opacity === 0.
- c._renderFlag |= worldDirtyFlag;
- c["__opacityInHierarchy"] = c._opacity * opacity / 255;
- if (!c._activeInHierarchy || c._opacity === 0)
- continue;
- c._cullingMask = c.groupIndex === 0 ? cullingMask : 1 << c.groupIndex;
- // TODO: Maybe has better way to implement cascade opacity
- var colorVal = c._color._val;
- c._color._fastSetA(c._opacity * opacity);
- renderFlow.flows[c._renderFlag]._func(c);
- c._color._val = colorVal;
- }
- }
- else {
- checkLevelRender(node);
- }
- _batcher.parentOpacity = parentOpacity;
- this._next._func(node);
- }
- });
- };
- return CCCExtend;
- }());
- cc._RF.pop();
- }
- if (nodeEnv) {
- __define(__module.exports, __require, __module);
- }
- else {
- __quick_compile_project__.registerModuleFunc(__filename, function () {
- __define(__module.exports, __require, __module);
- });
- }
- })();
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0cy9zY3JpcHRNYWluL0NDQ0V4dGVuZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7R0FFRztBQUNLLElBQUEsT0FBTyxHQUFLLEVBQUUsQ0FBQyxVQUFVLFFBQWxCLENBQW1CO0FBRWxDO0lBQXlDLCtCQUFZO0lBQXJEOztJQUlBLENBQUM7SUFIYSw0QkFBTSxHQUFoQjtRQUNJLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBSGdCLFdBQVc7UUFEL0IsT0FBTztPQUNhLFdBQVcsQ0FJL0I7SUFBRCxrQkFBQztDQUpELEFBSUMsQ0FKd0MsRUFBRSxDQUFDLFNBQVMsR0FJcEQ7a0JBSm9CLFdBQVc7QUFNaEM7SUFBQTtJQWtMQSxDQUFDO0lBakxHLFlBQVk7SUFDTCxjQUFJLEdBQVg7UUFDSSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRUQsbUJBQW1CO0lBQ0osMkJBQWlCLEdBQWhDO1FBQ0ksSUFBSSxTQUFTLEdBQUcsQ0FBQyxDQUFDO1FBRWxCLElBQU0sU0FBUyxHQUFHLENBQUMsSUFBSSxTQUFTLEVBQUUsQ0FBQztRQUNuQyxJQUFNLFVBQVUsR0FBRyxDQUFDLElBQUksU0FBUyxFQUFFLENBQUM7UUFDcEMsSUFBTSxlQUFlLEdBQUcsQ0FBQyxJQUFJLFNBQVMsRUFBRSxDQUFDO1FBQ3pDLElBQU0sZUFBZSxHQUFHLENBQUMsSUFBSSxTQUFTLEVBQUUsQ0FBQztRQUN6QyxJQUFNLFNBQVMsR0FBRyxlQUFlLEdBQUcsZUFBZSxDQUFDO1FBQ3BELElBQU0sa0JBQWtCLEdBQUcsQ0FBQyxJQUFJLFNBQVMsRUFBRSxDQUFDO1FBQzVDLElBQU0sT0FBTyxHQUFHLENBQUMsSUFBSSxTQUFTLEVBQUUsQ0FBQztRQUNqQyxJQUFNLEtBQUssR0FBRyxDQUFDLElBQUksU0FBUyxFQUFFLENBQUM7UUFDL0IsSUFBTSxhQUFhLEdB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VyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFBO3dCQUN4QyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksR0FBRyxRQUFRLENBQUM7cUJBQzVCO2lCQUNKO3FCQUFNO29CQUNILGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO2lCQUMxQjtnQkFDRCxRQUFRLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQztnQkFFdkMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDM0IsQ0FBQztTQUNKLENBQUMsQ0FBQTtJQUNOLENBQUM7SUFDTCxnQkFBQztBQUFELENBbExBLEFBa0xDLElBQUEiLCJmaWxlIjoiIiwic291cmNlUm9vdCI6Ii8iLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIOmHjeWGmeW8leaTjuaWueazle+8jOi/m+ihjOS4gOS6m+WKn+iDveaJqeWxlVxuICovXG5jb25zdCB7IGNjY2xhc3MgfSA9IGNjLl9kZWNvcmF0b3I7XG5AY2NjbGFzc1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTGV2ZWxFeHRlbmQgZXh0ZW5kcyBjYy5Db21wb25lbnR7XG4gICAgcHJvdGVjdGVkIG9uTG9hZCgpOiB2b2lkIHtcbiAgICAgICAgQ0NDRXh0ZW5kLmluaXQoKTtcbiAgICB9XG59XG5cbmNsYXNzIENDQ0V4dGVuZCB7XG4gICAgLyoqIOWIneWni+WMluaJqeWxlSAqL1xuICAgIHN0YXRpYyBpbml0KCkge1xuICAgICAgICB0aGlzLl9leHRlbmRSZW5kZXJGbG93KCk7XG4gICAgfVxuXG4gICAgLyoqIOaJqeWxlea4suafk+a1ge+8jOaWsOWinuWxgue6p+a4suafkyAqL1xuICAgIHByaXZhdGUgc3RhdGljIF9leHRlbmRSZW5kZXJGbG93KCkge1xuICAgICAgICBsZXQgRmxhZ09mc2V0ID0gMDtcblxuICAgICAgICBjb25zdCBET05PVEhJTkcgPSAxIDw8IEZsYWdPZnNldCsrO1xuICAgICAgICBjb25zdCBCUkVBS19GTE9XID0gMSA8PCBGbGFnT2ZzZXQrKztcbiAgICAgICAgY29uc3QgTE9DQUxfVFJBTlNGT1JNID0gMSA8PCBGbGFnT2ZzZXQrKztcbiAgICAgICAgY29uc3QgV09STERfVFJBTlNGT1JNID0gMSA8PCBGbGFnT2ZzZXQrKztcbiAgICAgICAgY29uc3QgVFJBTlNGT1JNID0gTE9DQUxfVFJBTlNGT1JNIHwgV09STERfVFJBTlNGT1JNO1xuICAgICAgICBjb25zdCBVUERBVEVfUkVOREVSX0RBVEEgPSAxIDw8IEZsYWdPZnNldCsrO1xuICAgICAgICBjb25zdCBPUEFDSVRZID0gMSA8PCBGbGFnT2ZzZXQrKztcbiAgICAgICAgY29uc3QgQ09MT1IgPSAxIDw8IEZsYWdPZnNldCsrO1xuICAgICAgICBjb25zdCBPUEFDSVRZX0NPTE9SID0gT1BBQ0lUWSB8IENPTE9SO1xuICAgICAgICBjb25zdCBSRU5ERVIgPSAxIDw8IEZsYWdPZnNldCsrO1xuICAgICAgICBjb25zdCBDSElMRFJFTiA9IDEgPDwgRmxhZ09mc2V0Kys7XG4gICAgICAgIGNvbnN0IFBPU1RfUkVOREVSID0gMSA8PCBGbGFnT2ZzZXQrKztcbiAgICAgICAgY29uc3QgRklOQUwgPSAxIDw8IEZsYWdPZnNldCsrO1xuXG4gICAgICAgIGNvbnN0IHJlbmRlckZsb3cgPSBjY1tcIlJlbmRlckZsb3dcIl07XG4gICAgICAgIGNvbnN0IF9iYXRjaGVyID0gcmVuZGVyRmxvdy5nZXRCYWNodGhlcigpO1xuICAgICAgICBsZXQgX19sZXZlbEJhdGNoZXI6IHsgd29ybGRNYXREaXJ0eTogbnVtYmVyLCBwYXJlbnRPcGFjaXR5RGlydHkgfVtdID0gW107XG4gICAgICAgIGxldCBfX3JlbmRlclF1ZXVlOiBjYy5Ob2RlW11bXSA9IFtdO1xuXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZW5kZXJGbG93LnByb3RvdHlwZSwgXCJfb3BhY2l0eVwiLCB7XG4gICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgICAgICAgICBfYmF0Y2hlci5wYXJlbnRPcGFjaXR5RGlydHkrKztcbiAgICAgICAgICAgICAgICBpZiAobm9kZVtcIl9fbGV2ZWxSZW5kZXJcIl0gJiYgX19sZXZlbEJhdGNoZXJbbm9kZVtcIl9faXRlbUluZGV4XCJdXSkge1xuICAgICAgICAgICAgICAgICAgICBfX2xldmVsQmF0Y2hlcltub2RlW1wiX19pdGVtSW5kZXhcIl1dLnBhcmVudE9wYWNpdHlEaXJ0eSA9IDE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuX25leHQuX2Z1bmMobm9kZSk7XG5cbiAgICAgICAgICAgICAgICBub2RlLl9yZW5kZXJGbGFnICY9IH5PUEFDSVRZO1xuICAgICAgICAgICAgICAgIGlmIChub2RlW1wiX19sZXZlbFJlbmRlclwiXSAmJiBfX2xldmVsQmF0Y2hlcltub2RlW1wiX19pdGVtSW5kZXhcIl1dICYmIG5vZGVbXCJfX2xhc3RDaGlsZHJlblwiXSkge1xuICAgICAgICAgICAgICAgICAgICBfX2xldmVsQmF0Y2hlcltub2RlLl9faXRlbUluZGV4XS5wYXJlbnRPcGFjaXR5RGlydHkgPSAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBfYmF0Y2hlci5wYXJlbnRPcGFjaXR5RGlydHktLTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJlbmRlckZsb3cucHJvdG90eXBlLCBcIl93b3JsZFRyYW5zZm9ybVwiLCB7XG4gICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgICAgICAgICBfYmF0Y2hlci53b3JsZE1hdERpcnR5Kys7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGVbXCJfX2xldmVsUmVuZGVyXCJdICYmIF9fbGV2ZWxCYXRjaGVyW25vZGVbXCJfX2l0ZW1JbmRleFwiXV0pIHtcbiAgICAgICAgICAgICAgICAgICAgX19sZXZlbEJhdGNoZXJbbm9kZVtcIl9faXRlbUluZGV4XCJdXS53b3JsZE1hdERpcnR5ID0gMTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsZXQgdCA9IG5vZGUuX21hdHJpeDtcbiAgICAgICAgICAgICAgICBsZXQgdHJzID0gbm9kZS5fdHJzO1xuICAgICAgICAgICAgICAgIGxldCB0bSA9IHQubTtcbiAgICAgICAgICAgICAgICB0bVsxMl0gPSB0cnNbMF07XG4gICAgICAgICAgICAgICAgdG1bMTNdID0gdHJzWzFdO1xuICAgICAgICAgICAgICAgIHRtWzE0XSA9IHRyc1syXTtcblxuICAgICAgICAgICAgICAgIG5vZGUuX211bE1hdChub2RlLl93b3JsZE1hdHJpeCwgbm9kZS5fcGFyZW50Ll93b3JsZE1hdHJpeCwgdCk7XG4gICAgICAgICAgICAgICAgbm9kZS5fcmVuZGVyRmxhZyAmPSB+V09STERfVFJBTlNGT1JNO1xuICAgICAgICAgICAgICAgIHRoaXMuX25leHQuX2Z1bmMobm9kZSk7XG5cbiAgICAgICAgICAgICAgICBpZiAobm9kZVtcIl9fbGV2ZWxSZW5kZXJcIl0gJiYgX19sZXZlbEJhdGNoZXJbbm9kZVtcIl9faXRlbUluZGV4XCJdXSAmJiBub2RlW1wiX19sYXN0Q2hpbGRyZW5cIl0pIHtcbiAgICAgICAgICAgICAgICAgICAgX19sZXZlbEJhdGNoZXJbbm9kZS5fX2l0ZW1JbmRleF0ud29ybGRNYXREaXJ0eSA9IDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIF9iYXRjaGVyLndvcmxkTWF0RGlydHktLTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgbGV2ZWxTcGxpdCA9IChub2RlOiBjYy5Ob2RlLCBsdjogbnVtYmVyLCBpdGVtSW5kZXgpID0+IHtcbiAgICAgICAgICAgIGlmICghX19yZW5kZXJRdWV1ZVtsdl0pIHtcbiAgICAgICAgICAgICAgICBfX3JlbmRlclF1ZXVlW2x2XSA9IFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgX19yZW5kZXJRdWV1ZVtsdl0ucHVzaChub2RlKTtcbiAgICAgICAgICAgIGx2Kys7XG4gICAgICAgICAgICBub2RlW1wiX19yZW5kZXJMdlwiXSA9IGx2O1xuICAgICAgICAgICAgbm9kZVtcIl9fbGV2ZWxSZW5kZXJcIl0gPSB0cnVlO1xuICAgICAgICAgICAgbm9kZVtcIl9faXRlbUluZGV4XCJdID0gaXRlbUluZGV4O1xuICAgICAgICAgICAgY29uc3QgY3MgPSBub2RlLmNoaWxkcmVuO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGMgPSBjc1tpXTtcbiAgICAgICAgICAgICAgICBpZiAoIV9fcmVuZGVyUXVldWVbbHZdKSB7XG4gICAgICAgICAgICAgICAgICAgIF9fcmVuZGVyUXVldWVbbHZdID0gW107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGx2ID0gbGV2ZWxTcGxpdChjLCBsdiwgaXRlbUluZGV4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBsdjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNoZWNrTGV2ZWxSZW5kZXIgPSAobGV2ZWxSZW5kZXJOb2RlOiBjYy5Ob2RlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjcyA9IGxldmVsUmVuZGVyTm9kZS5jaGlsZHJlbjtcbiAgICAgICAgICAgIGxldCByb290T3BhY2l0eUluSGllcmFyY2h5ID0gbGV2ZWxSZW5kZXJOb2RlW1wib3BhY2l0eVwiXSAvIDI1NTtcbiAgICAgICAgICAgIF9fbGV2ZWxCYXRjaGVyID0gW107XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgX19sZXZlbEJhdGNoZXIucHVzaCh7IHdvcmxkTWF0RGlydHk6IDAsIHBhcmVudE9wYWNpdHlEaXJ0eTogMCB9KTtcbiAgICAgICAgICAgICAgICBsZXZlbFNwbGl0KGNzW2ldLCAwLCBpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHdoaWxlIChfX3JlbmRlclF1ZXVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsaXN0ID0gX19yZW5kZXJRdWV1ZS5zaGlmdCgpO1xuICAgICAgICAgICAgICAgIGlmIChsaXN0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGxpc3QubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbiA9IGxpc3Quc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5bXCJfX2xhc3RDaGlsZHJlblwiXSA9IF9fcmVuZGVyUXVldWUubGVuZ3RoID09IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICBuW1wiX19sZXZlbFJlbmRlclwiXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgb3BhY2l0eUluSGllcmFyY2h5ID0gbi5wYXJlbnRbXCJfX29wYWNpdHlJbkhpZXJhcmNoeVwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcGFjaXR5SW5IaWVyYXJjaHkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wYWNpdHlJbkhpZXJhcmNoeSA9IHJvb3RPcGFjaXR5SW5IaWVyYXJjaHk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBvcGFjaXR5ID0gKG9wYWNpdHlJbkhpZXJhcmNoeSAqIChuW1wiX29wYWNpdHlcIl0gLyAyNTUpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5bXCJfX29wYWNpdHlJbkhpZXJhcmNoeVwiXSA9IG9wYWNpdHk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY3VsbGluZ01hc2sgPSBuW1wiX2N1bGxpbmdNYXNrXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHdvcmxkTWF0RGlydHkgPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9fbGV2ZWxCYXRjaGVyW25bXCJfX2l0ZW1JbmRleFwiXV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JsZE1hdERpcnR5ID0gX19sZXZlbEJhdGNoZXJbbltcIl9faXRlbUluZGV4XCJdXS53b3JsZE1hdERpcnR5IHx8IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcGFyZW50T3BhY2l0eURpcnR5ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfX2xldmVsQmF0Y2hlcltuW1wiX19pdGVtSW5kZXhcIl1dKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50T3BhY2l0eURpcnR5ID0gX19sZXZlbEJhdGNoZXJbbltcIl9faXRlbUluZGV4XCJdXS5wYXJlbnRPcGFjaXR5RGlydHkgfHwgMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHdvcmxkVHJhbnNmb3JtRmxhZyA9ICh3b3JsZE1hdERpcnR5IHx8IF9iYXRjaGVyLndvcmxkTWF0RGlydHkpID8gV09STERfVFJBTlNGT1JNIDogMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB3b3JsZE9wYWNpdHlGbGFnID0gKHBhcmVudE9wYWNpdHlEaXJ0eSB8fCBfYmF0Y2hlci5wYXJlbnRPcGFjaXR5RGlydHkpID8gT1BBQ0lUWV9DT0xPUiA6IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgd29ybGREaXJ0eUZsYWcgPSB3b3JsZFRyYW5zZm9ybUZsYWcgfCB3b3JsZE9wYWNpdHlGbGFnO1xuICAgICAgICAgICAgICAgICAgICAgICAgbltcIl9yZW5kZXJGbGFnXCJdIHw9IHdvcmxkRGlydHlGbGFnO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFuW1wiX2FjdGl2ZUluSGllcmFyY2h5XCJdKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5bXCJfY3VsbGluZ01hc2tcIl0gPSBuLmdyb3VwSW5kZXggPT09IDAgPyBjdWxsaW5nTWFzayA6IDEgPDwgbi5ncm91cEluZGV4O1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogTWF5YmUgaGFzIGJldHRlciB3YXkgdG8gaW1wbGVtZW50IGNhc2NhZGUgb3BhY2l0eVxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbG9yVmFsID0gbltcIl9jb2xvclwiXS5fdmFsO1xuICAgICAgICAgICAgICAgICAgICAgICAgbltcIl9jb2xvclwiXS5fZmFzdFNldEEobltcIl9vcGFjaXR5XCJdICogb3BhY2l0eSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZW5kZXJGbG93LmZsb3dzW25bXCJfcmVuZGVyRmxhZ1wiXV0uX2Z1bmMobik7XG4gICAgICAgICAgICAgICAgICAgICAgICBuW1wiX2NvbG9yXCJdLl92YWwgPSBjb2xvclZhbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZW5kZXJGbG93LnByb3RvdHlwZSwgXCJfY2hpbGRyZW5cIiwge1xuICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUuX19sZXZlbFJlbmRlcikgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGxldCBjdWxsaW5nTWFzayA9IG5vZGUuX2N1bGxpbmdNYXNrO1xuXG4gICAgICAgICAgICAgICAgbGV0IGVuYWJsZUxldmVsUmVuZGVyID0gbm9kZVtcIl9fZW5hYmxlTGV2ZWxSZW5kZXJcIl07XG5cbiAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRPcGFjaXR5SW5IaWVyYXJjaHkgPSBub2RlLnBhcmVudCA/IG5vZGUucGFyZW50W1wiX19vcGFjaXR5SW5IaWVyYXJjaHlcIl0gOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgbGV0IHBhcmVudE9wYWNpdHkgPSBwYXJlbnRPcGFjaXR5SW5IaWVyYXJjaHkgIT09IHVuZGVmaW5lZCA/IHBhcmVudE9wYWNpdHlJbkhpZXJhcmNoeSA6IF9iYXRjaGVyLnBhcmVudE9wYWNpdHk7XG4gICAgICAgICAgICAgICAgaWYgKCFlbmFibGVMZXZlbFJlbmRlciAmJiAhbm9kZS5fX2xldmVsUmVuZGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBvcGFjaXR5ID0gKHBhcmVudE9wYWNpdHkgKj0gKG5vZGUuX29wYWNpdHkgLyAyNTUpKTtcbiAgICAgICAgICAgICAgICAgICAgbm9kZVtcIl9fb3BhY2l0eUluSGllcmFyY2h5XCJdID0gb3BhY2l0eTtcblxuICAgICAgICAgICAgICAgICAgICBsZXQgd29ybGRUcmFuc2Zvcm1GbGFnID0gX2JhdGNoZXIud29ybGRNYXREaXJ0eSA/IFdPUkxEX1RSQU5TRk9STSA6IDA7XG4gICAgICAgICAgICAgICAgICAgIGxldCB3b3JsZE9wYWNpdHlGbGFnID0gX2JhdGNoZXIucGFyZW50T3BhY2l0eURpcnR5ID8gT1BBQ0lUWV9DT0xPUiA6IDA7XG4gICAgICAgICAgICAgICAgICAgIGxldCB3b3JsZERpcnR5RmxhZyA9IHdvcmxkVHJhbnNmb3JtRmxhZyB8IHdvcmxkT3BhY2l0eUZsYWc7XG4gICAgICAgICAgICAgICAgICAgIGxldCBjaGlsZHJlbiA9IG5vZGUuX2NoaWxkcmVuO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbCA9IGNoaWxkcmVuLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGMgPSBjaGlsZHJlbltpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFkdmFuY2UgdGhlIG1vZGlmaWNhdGlvbiBvZiB0aGUgZmxhZyB0byBhdm9pZCBub2RlIGF0dHJpYnV0ZSBtb2RpZmljYXRpb24gaXMgaW52YWxpZCB3aGVuIG9wYWNpdHkgPT09IDAuXG4gICAgICAgICAgICAgICAgICAgICAgICBjLl9yZW5kZXJGbGFnIHw9IHdvcmxkRGlydHlGbGFnO1xuICAgICAgICAgICAgICAgICAgICAgICAgY1tcIl9fb3BhY2l0eUluSGllcmFyY2h5XCJdID0gYy5fb3BhY2l0eSAqIG9wYWNpdHkgLyAyNTU7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWMuX2FjdGl2ZUluSGllcmFyY2h5IHx8IGMuX29wYWNpdHkgPT09IDApIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBjLl9jdWxsaW5nTWFzayA9IGMuZ3JvdXBJbmRleCA9PT0gMCA/IGN1bGxpbmdNYXNrIDogMSA8PCBjLmdyb3VwSW5kZXg7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IE1heWJlIGhhcyBiZXR0ZXIgd2F5IHRvIGltcGxlbWVudCBjYXNjYWRlIG9wYWNpdHlcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb2xvclZhbCA9IGMuX2NvbG9yLl92YWw7XG4gICAgICAgICAgICAgICAgICAgICAgICBjLl9jb2xvci5fZmFzdFNldEEoYy5fb3BhY2l0eSAqIG9wYWNpdHkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVuZGVyRmxvdy5mbG93c1tjLl9yZW5kZXJGbGFnXS5fZnVuYyhjKVxuICAgICAgICAgICAgICAgICAgICAgICAgYy5fY29sb3IuX3ZhbCA9IGNvbG9yVmFsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY2hlY2tMZXZlbFJlbmRlcihub2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgX2JhdGNoZXIucGFyZW50T3BhY2l0eSA9IHBhcmVudE9wYWNpdHk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLl9uZXh0Ll9mdW5jKG5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuICAgIH1cbn0iXX0=
|