ng2-3d-editor
Version:
Angular 2 3D Editor/viewer
282 lines (280 loc) • 47.2 kB
JavaScript
"use strict";
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;
};
var __metadata = (this && this.__metadata) || function (k, v) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
var core_1 = require("@angular/core");
var editorControls_1 = require("../controllers/editorControls");
var THREE = require('three');
var FBXLoaderService = require('../jsservice/fbxLoader2.service.js');
var TransformControls = require('three-transformcontrols');
var ObjLoaderService = require('../jsservice/objLoader.service');
var MtlLoaderService = require('../jsservice/mtlLoader.service');
var Viewer3DComponent = (function () {
function Viewer3DComponent() {
this.enableTransformController = true;
this.inGenerate = false;
this.mouseX = 0;
this.mouseY = 0;
this.center = new THREE.Vector3();
this.loading = true;
}
Viewer3DComponent.prototype.ngOnChanges = function (changes) {
if (this.scene && changes.urlFile.currentValue !== changes.urlFile.previousValue.toString()) {
this.loading = true;
this.clearScene();
this.lights();
this.grid();
this.axisHelper();
this.load();
this.animate();
}
};
Viewer3DComponent.prototype.ngOnInit = function () {
var _this = this;
console.log(ObjLoaderService);
console.log(MtlLoaderService);
console.log(FBXLoaderService);
console.log(TransformControls);
this.container = document.getElementById('viewer-3d');
this.camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 1, 2000);
this.camera.position.z = 250;
this.scene = new THREE.Scene();
this.lights();
this.grid();
this.axisHelper();
this.load();
this.renderer = new THREE.WebGLRenderer();
this.renderer.setPixelRatio(window.devicePixelRatio);
this.renderer.setSize(window.innerWidth, window.innerHeight);
if (this.clearColor) {
this.renderer.setClearColor(this.clearColor);
}
this.container.appendChild(this.renderer.domElement);
this.animate();
if (this.enableTransformController) {
this.transformControl = new TransformControls(this.camera, this.renderer.domElement);
this.transformControl.addEventListener('change', this.render.bind(this));
}
this.controllers = new editorControls_1.EditorControls(this.container, this.camera);
window.addEventListener('resize', this.onWindowResize.bind(this), false);
window.addEventListener('keydown', function (event) {
switch (event.keyCode) {
case 81:
_this.transformControl.setSpace(_this.transformControl.space === 'local' ? 'world' : 'local');
break;
case 17:
_this.transformControl.setTranslationSnap(100);
_this.transformControl.setRotationSnap(THREE.Math.degToRad(15));
break;
case 87:
_this.transformControl.setMode('translate');
break;
case 69:
_this.transformControl.setMode('rotate');
break;
case 82:
_this.transformControl.setMode('scale');
break;
case 187:
case 107:
_this.transformControl.setSize(_this.transformControl.size + 0.1);
break;
case 189:
case 109:
_this.transformControl.setSize(Math.max(_this.transformControl.size - 0.1, 0.1));
break;
default:
break;
}
});
window.addEventListener('keyup', function (event) {
switch (event.keyCode) {
case 17:
_this.transformControl.setTranslationSnap(null);
_this.transformControl.setRotationSnap(null);
break;
default:
break;
}
});
};
Viewer3DComponent.prototype.load = function () {
if (!this.extension) {
this.extension = this.getFileExtension(this.urlFile);
}
if (this.extension === 'obj') {
this.loadObjFormatFile();
}
else if (this.extension === 'fbx') {
this.loadFbxFormatFile();
}
};
Viewer3DComponent.prototype.lights = function () {
var ambient = new THREE.AmbientLight(0x444444);
var directionalLight = new THREE.DirectionalLight(0xffffff, 1);
directionalLight.position.set(1, 1, 1).normalize();
var helper = new THREE.DirectionalLightHelper(directionalLight, 5);
this.scene.add(ambient);
this.scene.add(helper);
this.scene.add(directionalLight);
};
Viewer3DComponent.prototype.axisHelper = function () {
var axisHelper = new THREE.AxisHelper(5);
this.scene.add(axisHelper);
};
Viewer3DComponent.prototype.grid = function () {
var lineMaterial = new THREE.LineBasicMaterial({ color: 0x303030 }), geometry = new THREE.Geometry(), floor = -75, step = 25;
for (var i = 0; i <= 40; i++) {
geometry.vertices.push(new THREE.Vector3(-500, floor, i * step - 500));
geometry.vertices.push(new THREE.Vector3(500, floor, i * step - 500));
geometry.vertices.push(new THREE.Vector3(i * step - 500, floor, -500));
geometry.vertices.push(new THREE.Vector3(i * step - 500, floor, 500));
}
var line = new THREE.LineSegments(geometry, lineMaterial);
this.scene.add(line);
};
Viewer3DComponent.prototype.loadObjFormatFile = function () {
var _this = this;
var mtlLoader = new THREE.MTLLoader();
this.setDetailLoad('MATERIALS');
mtlLoader.load(this.urlFile.replace('.obj', '.mtl'), function (materials) {
_this.loadObj(materials);
}, function (progress) {
console.log('progress material loader' + JSON.stringify(progress));
}, function (error) {
console.log('error material loader');
_this.loadObj(null);
});
};
Viewer3DComponent.prototype.loadFbxFormatFile = function () {
var _this = this;
this.setDetailLoad('FBX OBJECTS');
var manager = new THREE.LoadingManager();
manager.onProgress = function (item, loaded, total) {
console.log(item, loaded, total);
};
var loader = new THREE.FBXLoader(manager);
loader.load(this.urlFile, function (object) {
_this.loading = false;
object.mixer = new THREE.AnimationMixer(object);
var action = object.mixer.clipAction(object.animations[0]);
action.play();
_this.scene.add(object);
if (_this.enableTransformController) {
_this.transformControl.attach(object);
_this.scene.add(_this.transformControl);
}
}, function (progress) {
console.log('progress fbx loader' + JSON.stringify(progress));
}, function (error) {
_this.setDetailLoad('ERROR loafing FBX file');
console.log('error' + error);
});
};
Viewer3DComponent.prototype.loadObj = function (materials) {
var _this = this;
var objLoader = new THREE.OBJLoader();
if (materials) {
materials.preload();
objLoader.setMaterials(materials);
}
this.setDetailLoad('OBJ OBJECTS');
objLoader.load(this.urlFile, function (object) {
_this.loading = false;
_this.scene.add(object);
if (_this.enableTransformController) {
_this.transformControl.attach(object);
_this.scene.add(_this.transformControl);
}
_this.cameraPositioning();
}, function (progress) {
console.log('progress obj loader' + JSON.stringify(progress));
}, function (error) {
_this.setDetailLoad('ERROR loafing OBJ file' + error);
console.log('error' + error);
});
};
Viewer3DComponent.prototype.cameraPositioning = function () {
if (this.initialPositionCamera) {
this.camera.position.set(this.initialPositionCamera.x, this.initialPositionCamera.y, this.initialPositionCamera.z);
}
if (this.initialRotationCamera) {
this.camera.rotation.set(this.initialRotationCamera.x, this.initialRotationCamera.y, this.initialRotationCamera.z);
}
this.camera.lookAt(this.center);
};
Viewer3DComponent.prototype.setDetailLoad = function (detail) {
this.detailLoading = detail;
};
;
Viewer3DComponent.prototype.animate = function () {
requestAnimationFrame(this.animate.bind(this));
this.render();
};
Viewer3DComponent.prototype.onWindowResize = function () {
this.windowHalfX = this.container.offsetWidth / 2;
this.windowHalfY = this.container.offsetHeight / 2;
this.camera.aspect = this.container.offsetWidth / this.container.offsetHeight;
this.camera.updateProjectionMatrix();
this.renderer.setSize(this.container.offsetWidth, this.container.offsetHeight);
};
Viewer3DComponent.prototype.render = function () {
if (this.transformControl) {
this.transformControl.update();
}
this.renderer.render(this.scene, this.camera);
};
Viewer3DComponent.prototype.isLoading = function () {
return this.loading;
};
Viewer3DComponent.prototype.getFileExtension = function (fileName) {
return fileName.split('.').pop().toLowerCase();
};
Viewer3DComponent.prototype.clearScene = function () {
var _this = this;
this.extension = undefined;
this.scene.children.forEach(function (object) {
_this.scene.remove(object);
});
};
return Viewer3DComponent;
}());
__decorate([
core_1.Input(),
__metadata("design:type", String)
], Viewer3DComponent.prototype, "urlFile", void 0);
__decorate([
core_1.Input(),
__metadata("design:type", String)
], Viewer3DComponent.prototype, "extension", void 0);
__decorate([
core_1.Input(),
__metadata("design:type", String)
], Viewer3DComponent.prototype, "clearColor", void 0);
__decorate([
core_1.Input(),
__metadata("design:type", Object)
], Viewer3DComponent.prototype, "initialPositionCamera", void 0);
__decorate([
core_1.Input(),
__metadata("design:type", Object)
], Viewer3DComponent.prototype, "initialRotationCamera", void 0);
__decorate([
core_1.Input(),
__metadata("design:type", Object)
], Viewer3DComponent.prototype, "enableTransformController", void 0);
Viewer3DComponent = __decorate([
core_1.Component({
selector: 'threed-viewer',
template: " <div class=\"loader-container\" *ngIf=\"isLoading()\" > <div class=\"loader\"> <h1>LOADING {{detailLoading}}</h1> <span></span> <span></span> <span></span> </div> </div> <div class=\"viewer-3d-content\"> <div class=\"viewer-3d-row\"> <div class=\"viewer-3d-cell\"> <div id=\"viewer-3d\" class=\"viewer-3d\"> </div> </div> </div> </div>",
styles: [" .viewer-3d-content { font-family: Monospace; background-color: #000; color: #fff; margin: 0px; overflow: hidden; } .viewer-3d-row { display: -webkit-box; display: -moz-box; display: -ms-flexbox; display: -webkit-flex; display: flex; -webkit-box-orient: horizontal; -moz-box-orient: horizontal; box-orient: horizontal; flex-direction: row; -webkit-box-pack: center; -moz-box-pack: center; box-pack: center; justify-content: center; -webkit-box-align: center; -moz-box-align: center; box-align: center; align-items: center; } .viewer-3d-cell { -webkit-box-flex: 1; -moz-box-flex: 1; box-flex: 1; -webkit-flex: 1 1 auto; flex: 1 1 auto; padding: 10px; margin: 10px; text-align: center; } .viewer-3d { height: 80vh; max-width: 100%; } .loader-container{ width: 200px; height: 200px; top: 0; bottom: 0; margin: auto; position: absolute; left: 0; right: 0; } .loader{ background:#333; } h1{ font-family: 'Actor', sans-serif; color:#FFF; font-size:16px; letter-spacing:1px; font-weight:200; text-align:center; } .loader span{ width:16px; height:16px; border-radius:50%; display:inline-block; position:absolute; left:50%; margin-left:-10px; -webkit-animation:3s infinite linear; -moz-animation:3s infinite linear; -o-animation:3s infinite linear; } .loader span:nth-child(2){ background:#E84C3D; -webkit-animation:kiri 1.2s infinite linear; -moz-animation:kiri 1.2s infinite linear; -o-animation:kiri 1.2s infinite linear; } .loader span:nth-child(3){ background:#F1C40F; z-index:100; } .loader span:nth-child(4){ background:#2FCC71; -webkit-animation:kanan 1.2s infinite linear; -moz-animation:kanan 1.2s infinite linear; -o-animation:kanan 1.2s infinite linear; } @-webkit-keyframes kanan { 0% {-webkit-transform:translateX(20px); } 50%{-webkit-transform:translateX(-20px); } 100%{-webkit-transform:translateX(20px); z-index:200; } } @-moz-keyframes kanan { 0% {-moz-transform:translateX(20px); } 50%{-moz-transform:translateX(-20px); } 100%{-moz-transform:translateX(20px); z-index:200; } } @-o-keyframes kanan { 0% {-o-transform:translateX(20px); } 50%{-o-transform:translateX(-20px); } 100%{-o-transform:translateX(20px); z-index:200; } } @-webkit-keyframes kiri { 0% {-webkit-transform:translateX(-20px); z-index:200; } 50%{-webkit-transform:translateX(20px); } 100%{-webkit-transform:translateX(-20px); } } @-moz-keyframes kiri { 0% {-moz-transform:translateX(-20px); z-index:200; } 50%{-moz-transform:translateX(20px); } 100%{-moz-transform:translateX(-20px); } } @-o-keyframes kiri { 0% {-o-transform:translateX(-20px); z-index:200; } 50%{-o-transform:translateX(20px); } 100%{-o-transform:translateX(-20px); } }"]
})
], Viewer3DComponent);
exports.Viewer3DComponent = Viewer3DComponent;
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvbXBvbmVudHMvdmlld2VyM0QuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFBQSxzQ0FBaUQ7QUFDakQsZ0VBQStEO0FBRS9ELElBQUksS0FBSyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUM3QixJQUFJLGdCQUFnQixHQUFHLE9BQU8sQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDO0FBQ3JFLElBQUksaUJBQWlCLEdBQUcsT0FBTyxDQUFDLHlCQUF5QixDQUFDLENBQUM7QUFDM0QsSUFBSSxnQkFBZ0IsR0FBRyxPQUFPLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztBQUNqRSxJQUFJLGdCQUFnQixHQUFHLE9BQU8sQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO0FBT2pFLElBQWEsaUJBQWlCO0lBTDlCO1FBdUJJLDhCQUF5QixHQUFRLElBQUksQ0FBQztRQUV0QyxlQUFVLEdBQVksS0FBSyxDQUFDO1FBTTVCLFdBQU0sR0FBVyxDQUFDLENBQUM7UUFDbkIsV0FBTSxHQUFXLENBQUMsQ0FBQztRQUtuQixXQUFNLEdBQVEsSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7UUFFbEMsWUFBTyxHQUFZLElBQUksQ0FBQztJQXdRNUIsQ0FBQztJQXJRRyx1Q0FBVyxHQUFYLFVBQVksT0FBTztRQUNmLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxZQUFZLEtBQUssT0FBTyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQzFGLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1lBQ3BCLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNsQixJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDZCxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDWixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDbEIsSUFBSSxD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QyxJQUFBO0FBdlNHO0lBREMsWUFBSyxFQUFFOztrREFDUTtBQUdoQjtJQURDLFlBQUssRUFBRTs7b0RBQ1U7QUFHbEI7SUFEQyxZQUFLLEVBQUU7O3FEQUNXO0FBR25CO0lBREMsWUFBSyxFQUFFOztnRUFDbUI7QUFHM0I7SUFEQyxZQUFLLEVBQUU7O2dFQUNtQjtBQUczQjtJQURDLFlBQUssRUFBRTs7b0VBQzhCO0FBbEI3QixpQkFBaUI7SUFMN0IsZ0JBQVMsQ0FBQztRQUNQLFFBQVEsRUFBRSxlQUFlO1FBQ3pCLFFBQVEsRUFBRSw0YUFBNGE7UUFDdGIsTUFBTSxFQUFFLENBQUMsaWlHQUFpaUcsQ0FBQztLQUM5aUcsQ0FBQztHQUNXLGlCQUFpQixDQTBTN0I7QUExU1ksOENBQWlCIiwiZmlsZSI6ImNvbXBvbmVudHMvdmlld2VyM0QuY29tcG9uZW50LmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRWRpdG9yQ29udHJvbHMgfSBmcm9tICcuLi9jb250cm9sbGVycy9lZGl0b3JDb250cm9scyc7XG5cbmxldCBUSFJFRSA9IHJlcXVpcmUoJ3RocmVlJyk7XG5sZXQgRkJYTG9hZGVyU2VydmljZSA9IHJlcXVpcmUoJy4uL2pzc2VydmljZS9mYnhMb2FkZXIyLnNlcnZpY2UuanMnKTtcbmxldCBUcmFuc2Zvcm1Db250cm9scyA9IHJlcXVpcmUoJ3RocmVlLXRyYW5zZm9ybWNvbnRyb2xzJyk7XG5sZXQgT2JqTG9hZGVyU2VydmljZSA9IHJlcXVpcmUoJy4uL2pzc2VydmljZS9vYmpMb2FkZXIuc2VydmljZScpO1xubGV0IE10bExvYWRlclNlcnZpY2UgPSByZXF1aXJlKCcuLi9qc3NlcnZpY2UvbXRsTG9hZGVyLnNlcnZpY2UnKTtcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICd0aHJlZWQtdmlld2VyJyxcbiAgICB0ZW1wbGF0ZTogXCIgPGRpdiBjbGFzcz1cXFwibG9hZGVyLWNvbnRhaW5lclxcXCIgICpuZ0lmPVxcXCJpc0xvYWRpbmcoKVxcXCIgPiAgICAgPGRpdiBjbGFzcz1cXFwibG9hZGVyXFxcIj4gICAgICAgICA8aDE+TE9BRElORyB7e2RldGFpbExvYWRpbmd9fTwvaDE+ICAgICAgICAgPHNwYW4+PC9zcGFuPiAgICAgICAgIDxzcGFuPjwvc3Bhbj4gICAgICAgICA8c3Bhbj48L3NwYW4+ICAgICA8L2Rpdj4gPC9kaXY+ICA8ZGl2IGNsYXNzPVxcXCJ2aWV3ZXItM2QtY29udGVudFxcXCI+ICAgICA8ZGl2IGNsYXNzPVxcXCJ2aWV3ZXItM2Qtcm93XFxcIj4gICAgICAgICA8ZGl2IGNsYXNzPVxcXCJ2aWV3ZXItM2QtY2VsbFxcXCI+ICAgICAgICAgICAgIDxkaXYgaWQ9XFxcInZpZXdlci0zZFxcXCIgY2xhc3M9XFxcInZpZXdlci0zZFxcXCI+ICAgICAgICAgICAgIDwvZGl2PiAgICAgICAgIDwvZGl2PiAgICAgPC9kaXY+IDwvZGl2PlwiLFxuICAgIHN0eWxlczogW1wiIC52aWV3ZXItM2QtY29udGVudCB7ICAgICBmb250LWZhbWlseTogTW9ub3NwYWNlOyAgICAgYmFja2dyb3VuZC1jb2xvcjogIzAwMDsgICAgIGNvbG9yOiAjZmZmOyAgICAgbWFyZ2luOiAwcHg7ICAgICBvdmVyZmxvdzogaGlkZGVuOyB9ICAudmlld2VyLTNkLXJvdyB7ICAgICBkaXNwbGF5OiAtd2Via2l0LWJveDsgICAgIGRpc3BsYXk6IC1tb3otYm94OyAgICAgZGlzcGxheTogLW1zLWZsZXhib3g7ICAgICBkaXNwbGF5OiAtd2Via2l0LWZsZXg7ICAgICBkaXNwbGF5OiBmbGV4OyAgICAgIC13ZWJraXQtYm94LW9yaWVudDogaG9yaXpvbnRhbDsgICAgIC1tb3otYm94LW9yaWVudDogaG9yaXpvbnRhbDsgICAgIGJveC1vcmllbnQ6IGhvcml6b250YWw7ICAgICBmbGV4LWRpcmVjdGlvbjogcm93OyAgICAgIC13ZWJraXQtYm94LXBhY2s6IGNlbnRlcjsgICAgIC1tb3otYm94LXBhY2s6IGNlbnRlcjsgICAgIGJveC1wYWNrOiBjZW50ZXI7ICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsgICAgICAtd2Via2l0LWJveC1hbGlnbjogY2VudGVyOyAgICAgLW1vei1ib3gtYWxpZ246IGNlbnRlcjsgICAgIGJveC1hbGlnbjogY2VudGVyOyAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsgfSAgLnZpZXdlci0zZC1jZWxsIHsgICAgIC13ZWJraXQtYm94LWZsZXg6IDE7ICAgICAtbW96LWJveC1mbGV4OiAxOyAgICAgYm94LWZsZXg6IDE7ICAgICAtd2Via2l0LWZsZXg6IDEgMSBhdXRvOyAgICAgZmxleDogMSAxIGF1dG87ICAgICAgcGFkZGluZzogMTBweDsgICAgIG1hcmdpbjogMTBweDsgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7IH0gIC52aWV3ZXItM2QgeyAgICAgaGVpZ2h0OiA4MHZoOyAgICAgbWF4LXdpZHRoOiAxMDAlOyB9ICAubG9hZGVyLWNvbnRhaW5lcnsgICAgIHdpZHRoOiAyMDBweDsgICAgIGhlaWdodDogMjAwcHg7ICAgICB0b3A6IDA7ICAgICBib3R0b206IDA7ICAgICBtYXJnaW46IGF1dG87ICAgICBwb3NpdGlvbjogYWJzb2x1dGU7ICAgICBsZWZ0OiAwOyAgICAgcmlnaHQ6IDA7IH0gIC5sb2FkZXJ7ICAgICBiYWNrZ3JvdW5kOiMzMzM7ICB9ICBoMXsgICAgIGZvbnQtZmFtaWx5OiAnQWN0b3InLCBzYW5zLXNlcmlmOyAgICAgY29sb3I6I0ZGRjsgICAgIGZvbnQtc2l6ZToxNnB4OyAgICAgbGV0dGVyLXNwYWNpbmc6MXB4OyAgICAgZm9udC13ZWlnaHQ6MjAwOyAgICAgdGV4dC1hbGlnbjpjZW50ZXI7IH0gLmxvYWRlciBzcGFueyAgICAgd2lkdGg6MTZweDsgICAgIGhlaWdodDoxNnB4OyAgICAgYm9yZGVyLXJhZGl1czo1MCU7ICAgICBkaXNwbGF5OmlubGluZS1ibG9jazsgICAgIHBvc2l0aW9uOmFic29sdXRlOyAgICAgbGVmdDo1MCU7ICAgICBtYXJnaW4tbGVmdDotMTBweDsgICAgIC13ZWJraXQtYW5pbWF0aW9uOjNzIGluZmluaXRlIGxpbmVhcjsgICAgIC1tb3otYW5pbWF0aW9uOjNzIGluZmluaXRlIGxpbmVhcjsgICAgIC1vLWFuaW1hdGlvbjozcyBpbmZpbml0ZSBsaW5lYXI7ICB9ICAgLmxvYWRlciBzcGFuOm50aC1jaGlsZCgyKXsgICAgIGJhY2tncm91bmQ6I0U4NEMzRDsgICAgIC13ZWJraXQtYW5pbWF0aW9uOmtpcmkgMS4ycyBpbmZpbml0ZSBsaW5lYXI7ICAgICAtbW96LWFuaW1hdGlvbjpraXJpIDEuMnMgaW5maW5pdGUgbGluZWFyOyAgICAgLW8tYW5pbWF0aW9uOmtpcmkgMS4ycyBpbmZpbml0ZSBsaW5lYXI7ICB9IC5sb2FkZXIgc3BhbjpudGgtY2hpbGQoMyl7ICAgICBiYWNrZ3JvdW5kOiNGMUM0MEY7ICAgICB6LWluZGV4OjEwMDsgfSAubG9hZGVyIHNwYW46bnRoLWNoaWxkKDQpeyAgICAgYmFja2dyb3VuZDojMkZDQzcxOyAgICAgLXdlYmtpdC1hbmltYXRpb246a2FuYW4gMS4ycyBpbmZpbml0ZSBsaW5lYXI7ICAgICAtbW96LWFuaW1hdGlvbjprYW5hbiAxLjJzIGluZmluaXRlIGxpbmVhcjsgICAgIC1vLWFuaW1hdGlvbjprYW5hbiAxLjJzIGluZmluaXRlIGxpbmVhcjsgfSAgIEAtd2Via2l0LWtleWZyYW1lcyBrYW5hbiB7ICAgICAwJSB7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWCgyMHB4KTsgICAgIH0gICAgICA1MCV7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlWCgtMjBweCk7ICAgICB9ICAgICAgMTAwJXstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGVYKDIwcHgpOyAgICAgICAgIHotaW5kZXg6MjAwOyAgICAgfSB9IEAtbW96LWtleWZyYW1lcyBrYW5hbiB7ICAgICAwJSB7LW1vei10cmFuc2Zvcm06dHJhbnNsYXRlWCgyMHB4KTsgICAgIH0gICAgICA1MCV7LW1vei10cmFuc2Zvcm06dHJhbnNsYXRlWCgtMjBweCk7ICAgICB9ICAgICAgMTAwJXstbW96LXRyYW5zZm9ybTp0cmFuc2xhdGVYKDIwcHgpOyAgICAgICAgIHotaW5kZXg6MjAwOyAgICAgfSB9IEAtby1rZXlmcmFtZXMga2FuYW4geyAgICAgMCUgey1vLXRyYW5zZm9ybTp0cmFuc2xhdGVYKDIwcHgpOyAgICAgfSAgICAgIDUwJXstby10cmFuc2Zvcm06dHJhbnNsYXRlWCgtMjBweCk7ICAgICB9ICAgICAgMTAwJXstby10cmFuc2Zvcm06dHJhbnNsYXRlWCgyMHB4KTsgICAgICAgICB6LWluZGV4OjIwMDsgICAgIH0gfSAgICAgQC13ZWJraXQta2V5ZnJhbWVzIGtpcmkgeyAgICAgMCUgey13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVgoLTIwcHgpOyAgICAgICAgIHotaW5kZXg6MjAwOyAgICAgfSAgICAgNTAley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVgoMjBweCk7ICAgICB9ICAgICAxMDAley13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVgoLTIwcHgpOyAgICAgfSB9ICBALW1vei1rZXlmcmFtZXMga2lyaSB7ICAgICAwJSB7LW1vei10cmFuc2Zvcm06dHJhbnNsYXRlWCgtMjBweCk7ICAgICAgICAgei1pbmRleDoyMDA7ICAgICB9ICAgICA1MCV7LW1vei10cmFuc2Zvcm06dHJhbnNsYXRlWCgyMHB4KTsgICAgIH0gICAgIDEwMCV7LW1vei10cmFuc2Zvcm06dHJhbnNsYXRlWCgtMjBweCk7ICAgICB9IH0gQC1vLWtleWZyYW1lcyBraXJpIHsgICAgIDAlIHstby10cmFuc2Zvcm06dHJhbnNsYXRlWCgtMjBweCk7ICAgICAgICAgei1pbmRleDoyMDA7ICAgICB9ICAgICA1MCV7LW8tdHJhbnNmb3JtOnRyYW5zbGF0ZVgoMjBweCk7ICAgICB9ICAgICAxMDAley1vLXRyYW5zZm9ybTp0cmFuc2xhdGVYKC0yMHB4KTsgICAgIH0gfVwiXVxufSlcbmV4cG9ydCBjbGFzcyBWaWV3ZXIzRENvbXBvbmVudCB7XG5cbiAgICBASW5wdXQoKVxuICAgIHVybEZpbGU6IHN0cmluZztcblxuICAgIEBJbnB1dCgpXG4gICAgZXh0ZW5zaW9uOiBzdHJpbmc7XG5cbiAgICBASW5wdXQoKVxuICAgIGNsZWFyQ29sb3I6IHN0cmluZztcblxuICAgIEBJbnB1dCgpXG4gICAgaW5pdGlhbFBvc2l0aW9uQ2FtZXJhOiBhbnk7XG5cbiAgICBASW5wdXQoKVxuICAgIGluaXRpYWxSb3RhdGlvbkNhbWVyYTogYW55O1xuXG4gICAgQElucHV0KClcbiAgICBlbmFibGVUcmFuc2Zvcm1Db250cm9sbGVyOiBhbnkgPSB0cnVlO1xuXG4gICAgaW5HZW5lcmF0ZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgY29udGFpbmVyOiBhbnk7XG4gICAgY2FtZXJhOiBhbnk7XG4gICAgc2NlbmU6IGFueTtcbiAgICByZW5kZXJlcjogYW55O1xuICAgIG1vdXNlWDogbnVtYmVyID0gMDtcbiAgICBtb3VzZVk6IG51bWJlciA9IDA7XG4gICAgd2luZG93SGFsZlk6IGFueTtcbiAgICB3aW5kb3dIYWxmWDogYW55O1xuICAgIGNvbnRyb2xsZXJzOiBFZGl0b3JDb250cm9scztcbiAgICB0cmFuc2Zvcm1Db250cm9sOiBhbnk7XG4gICAgY2VudGVyOiBhbnkgPSBuZXcgVEhSRUUuVmVjdG9yMygpO1xuXG4gICAgbG9hZGluZzogYm9vbGVhbiA9IHRydWU7XG4gICAgZGV0YWlsTG9hZGluZzogc3RyaW5nO1xuXG4gICAgbmdPbkNoYW5nZXMoY2hhbmdlcykge1xuICAgICAgICBpZiAodGhpcy5zY2VuZSAmJiBjaGFuZ2VzLnVybEZpbGUuY3VycmVudFZhbHVlICE9PSBjaGFuZ2VzLnVybEZpbGUucHJldmlvdXNWYWx1ZS50b1N0cmluZygpKSB7XG4gICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5jbGVhclNjZW5lKCk7XG4gICAgICAgICAgICB0aGlzLmxpZ2h0cygpO1xuICAgICAgICAgICAgdGhpcy5ncmlkKCk7XG4gICAgICAgICAgICB0aGlzLmF4aXNIZWxwZXIoKTtcbiAgICAgICAgICAgIHRoaXMubG9hZCgpO1xuICAgICAgICAgICAgdGhpcy5hbmltYXRlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpIHtcbiAgICAgICAgY29uc29sZS5sb2coT2JqTG9hZGVyU2VydmljZSk7XG4gICAgICAgIGNvbnNvbGUubG9nKE10bExvYWRlclNlcnZpY2UpO1xuICAgICAgICBjb25zb2xlLmxvZyhGQlhMb2FkZXJTZXJ2aWNlKTtcbiAgICAgICAgY29uc29sZS5sb2coVHJhbnNmb3JtQ29udHJvbHMpO1xuICAgICAgICB0aGlzLmNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd2aWV3ZXItM2QnKTtcblxuICAgICAgICB0aGlzLmNhbWVyYSA9IG5ldyBUSFJFRS5QZXJzcGVjdGl2ZUNhbWVyYSg0NSwgd2luZG93LmlubmVyV2lkdGggLyB3aW5kb3cuaW5uZXJIZWlnaHQsIDEsIDIwMDApO1xuICAgICAgICB0aGlzLmNhbWVyYS5wb3NpdGlvbi56ID0gMjUwO1xuICAgICAgICAvLyBzY2VuZVxuICAgICAgICB0aGlzLnNjZW5lID0gbmV3IFRIUkVFLlNjZW5lKCk7XG5cbiAgICAgICAgdGhpcy5saWdodHMoKTtcbiAgICAgICAgdGhpcy5ncmlkKCk7XG4gICAgICAgIHRoaXMuYXhpc0hlbHBlcigpO1xuICAgICAgICB0aGlzLmxvYWQoKTtcblxuICAgICAgICB0aGlzLnJlbmRlcmVyID0gbmV3IFRIUkVFLldlYkdMUmVuZGVyZXIoKTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRQaXhlbFJhdGlvKHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvKTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTaXplKHdpbmRvdy5pbm5lcldpZHRoLCB3aW5kb3cuaW5uZXJIZWlnaHQpO1xuXG4gICAgICAgIGlmICh0aGlzLmNsZWFyQ29sb3IpIHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0Q2xlYXJDb2xvcih0aGlzLmNsZWFyQ29sb3IpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5yZW5kZXJlci5kb21FbGVtZW50KTtcblxuICAgICAgICB0aGlzLmFuaW1hdGUoKTtcblxuICAgICAgICBpZiAodGhpcy5lbmFibGVUcmFuc2Zvcm1Db250cm9sbGVyKSB7XG4gICAgICAgICAgICB0aGlzLnRyYW5zZm9ybUNvbnRyb2wgPSBuZXcgVHJhbnNmb3JtQ29udHJvbHModGhpcy5jYW1lcmEsIHRoaXMucmVuZGVyZXIuZG9tRWxlbWVudCk7XG4gICAgICAgICAgICB0aGlzLnRyYW5zZm9ybUNvbnRyb2wuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgdGhpcy5yZW5kZXIuYmluZCh0aGlzKSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbnRyb2xsZXJzID0gbmV3IEVkaXRvckNvbnRyb2xzKHRoaXMuY29udGFpbmVyLCB0aGlzLmNhbWVyYSk7XG5cbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMub25XaW5kb3dSZXNpemUuYmluZCh0aGlzKSwgZmFsc2UpO1xuXG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBzd2l0Y2ggKGV2ZW50LmtleUNvZGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDgxOiAvLyBRXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudHJhbnNmb3JtQ29udHJvbC5zZXRTcGFjZSh0aGlzLnRyYW5zZm9ybUNvbnRyb2wuc3BhY2UgPT09ICdsb2NhbCcgPyAnd29ybGQnIDogJ2xvY2FsJyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMTc6IC8vIEN0cmxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm1Db250cm9sLnNldFRyYW5zbGF0aW9uU25hcCgxMDApO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRyYW5zZm9ybUNvbnRyb2wuc2V0Um90YXRpb25TbmFwKFRIUkVFLk1hdGguZGVnVG9SYWQoMTUpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA4NzogLy8gV1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRyYW5zZm9ybUNvbnRyb2wuc2V0TW9kZSgndHJhbnNsYXRlJyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNjk6IC8vIEVcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm1Db250cm9sLnNldE1vZGUoJ3JvdGF0ZScpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDgyOiAvLyBSXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudHJhbnNmb3JtQ29udHJvbC5zZXRNb2RlKCdzY2FsZScpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDE4NzpcbiAgICAgICAgICAgICAgICBjYXNlIDEwNzogLy8gKywgPSwgbnVtK1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRyYW5zZm9ybUNvbnRyb2wuc2V0U2l6ZSh0aGlzLnRyYW5zZm9ybUNvbnRyb2wuc2l6ZSArIDAuMSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMTg5OlxuICAgICAgICAgICAgICAgIGNhc2UgMTA5OiAvLyAtLCBfLCBudW0tXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudHJhbnNmb3JtQ29udHJvbC5zZXRTaXplKE1hdGgubWF4KHRoaXMudHJhbnNmb3JtQ29udHJvbC5zaXplIC0gMC4xLCAwLjEpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdrZXl1cCcsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgc3dpdGNoIChldmVudC5rZXlDb2RlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxNzogLy8gQ3RybFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRyYW5zZm9ybUNvbnRyb2wuc2V0VHJhbnNsYXRpb25TbmFwKG51bGwpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRyYW5zZm9ybUNvbnRyb2wuc2V0Um90YXRpb25TbmFwKG51bGwpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbG9hZCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmV4dGVuc2lvbikge1xuICAgICAgICAgICAgdGhpcy5leHRlbnNpb24gPSB0aGlzLmdldEZpbGVFeHRlbnNpb24odGhpcy51cmxGaWxlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmV4dGVuc2lvbiA9PT0gJ29iaicpIHtcbiAgICAgICAgICAgIHRoaXMubG9hZE9iakZvcm1hdEZpbGUoKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmV4dGVuc2lvbiA9PT0gJ2ZieCcpIHtcbiAgICAgICAgICAgIHRoaXMubG9hZEZieEZvcm1hdEZpbGUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGxpZ2h0cygpIHtcbiAgICAgICAgbGV0IGFtYmllbnQgPSBuZXcgVEhSRUUuQW1iaWVudExpZ2h0KDB4NDQ0NDQ0KTtcblxuICAgICAgICBsZXQgZGlyZWN0aW9uYWxMaWdodCA9IG5ldyBUSFJFRS5EaXJlY3Rpb25hbExpZ2h0KDB4ZmZmZmZmLCAxKTtcbiAgICAgICAgZGlyZWN0aW9uYWxMaWdodC5wb3NpdGlvbi5zZXQoMSwgMSwgMSkubm9ybWFsaXplKCk7XG5cbiAgICAgICAgbGV0IGhlbHBlciA9IG5ldyBUSFJFRS5EaXJlY3Rpb25hbExpZ2h0SGVscGVyKGRpcmVjdGlvbmFsTGlnaHQsIDUpO1xuXG4gICAgICAgIHRoaXMuc2NlbmUuYWRkKGFtYmllbnQpO1xuICAgICAgICB0aGlzLnNjZW5lLmFkZChoZWxwZXIpO1xuICAgICAgICB0aGlzLnNjZW5lLmFkZChkaXJlY3Rpb25hbExpZ2h0KTtcbiAgICB9XG5cbiAgICBheGlzSGVscGVyKCkge1xuICAgICAgICBsZXQgYXhpc0hlbHBlciA9IG5ldyBUSFJFRS5BeGlzSGVscGVyKDUpO1xuICAgICAgICB0aGlzLnNjZW5lLmFkZChheGlzSGVscGVyKTtcbiAgICB9XG5cbiAgICBncmlkKCkge1xuICAgICAgICBsZXQgbGluZU1hdGVyaWFsID0gbmV3IFRIUkVFLkxpbmVCYXNpY01hdGVyaWFsKHtjb2xvcjogMHgzMDMwMzB9KSxcbiAgICAgICAgICAgIGdlb21ldHJ5ID0gbmV3IFRIUkVFLkdlb21ldHJ5KCksXG4gICAgICAgICAgICBmbG9vciA9IC03NSwgc3RlcCA9IDI1O1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8PSA0MDsgaSsrKSB7XG4gICAgICAgICAgICBnZW9tZXRyeS52ZXJ0aWNlcy5wdXNoKG5ldyBUSFJFRS5WZWN0b3IzKC01MDAsIGZsb29yLCBpICogc3RlcCAtIDUwMCkpO1xuICAgICAgICAgICAgZ2VvbWV0cnkudmVydGljZXMucHVzaChuZXcgVEhSRUUuVmVjdG9yMyg1MDAsIGZsb29yLCBpICogc3RlcCAtIDUwMCkpO1xuICAgICAgICAgICAgZ2VvbWV0cnkudmVydGljZXMucHVzaChuZXcgVEhSRUUuVmVjdG9yMyhpICogc3RlcCAtIDUwMCwgZmxvb3IsIC01MDApKTtcbiAgICAgICAgICAgIGdlb21ldHJ5LnZlcnRpY2VzLnB1c2gobmV3IFRIUkVFLlZlY3RvcjMoaSAqIHN0ZXAgLSA1MDAsIGZsb29yLCA1MDApKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbGluZSA9IG5ldyBUSFJFRS5MaW5lU2VnbWVudHMoZ2VvbWV0cnksIGxpbmVNYXRlcmlhbCk7XG4gICAgICAgIHRoaXMuc2NlbmUuYWRkKGxpbmUpO1xuICAgIH1cblxuICAgIGxvYWRPYmpGb3JtYXRGaWxlKCkge1xuICAgICAgICBsZXQgbXRsTG9hZGVyID0gbmV3IFRIUkVFLk1UTExvYWRlcigpO1xuXG4gICAgICAgIHRoaXMuc2V0RGV0YWlsTG9hZCgnTUFURVJJQUxTJyk7XG5cbiAgICAgICAgbXRsTG9hZGVyLmxvYWQodGhpcy51cmxGaWxlLnJlcGxhY2UoJy5vYmonLCAnLm10bCcpLCAobWF0ZXJpYWxzKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmxvYWRPYmoobWF0ZXJpYWxzKTtcbiAgICAgICAgfSwgKHByb2dyZXNzKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygncHJvZ3Jlc3MgbWF0ZXJpYWwgbG9hZGVyJyArIEpTT04uc3RyaW5naWZ5KHByb2dyZXNzKSk7XG4gICAgICAgIH0sIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ2Vycm9yIG1hdGVyaWFsIGxvYWRlcicpO1xuICAgICAgICAgICAgdGhpcy5sb2FkT2JqKG51bGwpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBsb2FkRmJ4Rm9ybWF0RmlsZSgpIHtcbiAgICAgICAgdGhpcy5zZXREZXRhaWxMb2FkKCdGQlggT0JKRUNUUycpO1xuXG4gICAgICAgIGxldCBtYW5hZ2VyID0gbmV3IFRIUkVFLkxvYWRpbmdNYW5hZ2VyKCk7XG4gICAgICAgIG1hbmFnZXIub25Qcm9ncmVzcyA9IGZ1bmN0aW9uIChpdGVtLCBsb2FkZWQsIHRvdGFsKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhpdGVtLCBsb2FkZWQsIHRvdGFsKTtcbiAgICAgICAgfTtcblxuICAgICAgICBsZXQgbG9hZGVyID0gbmV3IFRIUkVFLkZCWExvYWRlcihtYW5hZ2VyKTtcbiAgICAgICAgbG9hZGVyLmxvYWQodGhpcy51cmxGaWxlLCAob2JqZWN0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcblxuICAgICAgICAgICAgb2JqZWN0Lm1peGVyID0gbmV3IFRIUkVFLkFuaW1hdGlvbk1peGVyKG9iamVjdCk7XG4gICAgICAgICAgICBsZXQgYWN0aW9uID0gb2JqZWN0Lm1peGVyLmNsaXBBY3Rpb24ob2JqZWN0LmFuaW1hdGlvbnNbMF0pO1xuICAgICAgICAgICAgYWN0aW9uLnBsYXkoKTtcbiAgICAgICAgICAgIHRoaXMuc2NlbmUuYWRkKG9iamVjdCk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmVuYWJsZVRyYW5zZm9ybUNvbnRyb2xsZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRyYW5zZm9ybUNvbnRyb2wuYXR0YWNoKG9iamVjdCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zY2VuZS5hZGQodGhpcy50cmFuc2Zvcm1Db250cm9sKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9LCAocHJvZ3Jlc3MpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdwcm9ncmVzcyBmYnggbG9hZGVyJyArIEpTT04uc3RyaW5naWZ5KHByb2dyZXNzKSk7XG4gICAgICAgIH0sIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZXREZXRhaWxMb2FkKCdFUlJPUiBsb2FmaW5nIEZCWCBmaWxlJyk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnZXJyb3InICsgZXJyb3IpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBsb2FkT2JqKG1hdGVyaWFsczogYW55KSB7XG4gICAgICAgIGxldCBvYmpMb2FkZXIgPSBuZXcgVEhSRUUuT0JKTG9hZGVyKCk7XG5cbiAgICAgICAgaWYgKG1hdGVyaWFscykge1xuICAgICAgICAgICAgbWF0ZXJpYWxzLnByZWxvYWQoKTtcbiAgICAgICAgICAgIG9iakxvYWRlci5zZXRNYXRlcmlhbHMobWF0ZXJpYWxzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2V0RGV0YWlsTG9hZCgnT0JKIE9CSkVDVFMnKTtcblxuICAgICAgICBvYmpMb2FkZXIubG9hZCh0aGlzLnVybEZpbGUsIChvYmplY3QpID0+IHtcbiAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5zY2VuZS5hZGQob2JqZWN0KTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuZW5hYmxlVHJhbnNmb3JtQ29udHJvbGxlcikge1xuICAgICAgICAgICAgICAgIHRoaXMudHJhbnNmb3JtQ29udHJvbC5hdHRhY2gob2JqZWN0KTtcbiAgICAgICAgICAgICAgICB0aGlzLnNjZW5lLmFkZCh0aGlzLnRyYW5zZm9ybUNvbnRyb2wpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmNhbWVyYVBvc2l0aW9uaW5nKCk7XG5cbiAgICAgICAgfSwgKHByb2dyZXNzKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygncHJvZ3Jlc3Mgb2JqIGxvYWRlcicgKyBKU09OLnN0cmluZ2lmeShwcm9ncmVzcykpO1xuICAgICAgICB9LCAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2V0RGV0YWlsTG9hZCgnRVJST1IgbG9hZmluZyBPQkogZmlsZScgKyBlcnJvcik7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnZXJyb3InICsgZXJyb3IpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBjYW1lcmFQb3NpdGlvbmluZygpIHtcbiAgICAgICAgaWYgKHRoaXMuaW5pdGlhbFBvc2l0aW9uQ2FtZXJhKSB7XG4gICAgICAgICAgICB0aGlzLmNhbWVyYS5wb3NpdGlvbi5zZXQodGhpcy5pbml0aWFsUG9zaXRpb25DYW1lcmEueCwgdGhpcy5pbml0aWFsUG9zaXRpb25DYW1lcmEueSwgdGhpcy5pbml0aWFsUG9zaXRpb25DYW1lcmEueik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5pbml0aWFsUm90YXRpb25DYW1lcmEpIHtcbiAgICAgICAgICAgIHRoaXMuY2FtZXJhLnJvdGF0aW9uLnNldCh0aGlzLmluaXRpYWxSb3RhdGlvbkNhbWVyYS54LCB0aGlzLmluaXRpYWxSb3RhdGlvbkNhbWVyYS55LCB0aGlzLmluaXRpYWxSb3RhdGlvbkNhbWVyYS56KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2FtZXJhLmxvb2tBdCh0aGlzLmNlbnRlcik7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXREZXRhaWxMb2FkKGRldGFpbCkge1xuICAgICAgICB0aGlzLmRldGFpbExvYWRpbmcgPSBkZXRhaWw7XG4gICAgfTtcblxuICAgIGFuaW1hdGUoKSB7XG4gICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSh0aGlzLmFuaW1hdGUuYmluZCh0aGlzKSk7XG4gICAgICAgIHRoaXMucmVuZGVyKCk7XG4gICAgfVxuXG4gICAgb25XaW5kb3dSZXNpemUoKSB7XG4gICAgICAgIHRoaXMud2luZG93SGFsZlggPSB0aGlzLmNvbnRhaW5lci5vZmZzZXRXaWR0aCAvIDI7XG4gICAgICAgIHRoaXMud2luZG93SGFsZlkgPSB0aGlzLmNvbnRhaW5lci5vZmZzZXRIZWlnaHQgLyAyO1xuICAgICAgICB0aGlzLmNhbWVyYS5hc3BlY3QgPSB0aGlzLmNvbnRhaW5lci5vZmZzZXRXaWR0aCAvIHRoaXMuY29udGFpbmVyLm9mZnNldEhlaWdodDtcbiAgICAgICAgdGhpcy5jYW1lcmEudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFNpemUodGhpcy5jb250YWluZXIub2Zmc2V0V2lkdGgsIHRoaXMuY29udGFpbmVyLm9mZnNldEhlaWdodCk7XG4gICAgfVxuXG4gICAgcmVuZGVyKCkge1xuICAgICAgICBpZiAodGhpcy50cmFuc2Zvcm1Db250cm9sKSB7XG4gICAgICAgICAgICB0aGlzLnRyYW5zZm9ybUNvbnRyb2wudXBkYXRlKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZW5kZXJlci5yZW5kZXIodGhpcy5zY2VuZSwgdGhpcy5jYW1lcmEpO1xuICAgIH1cblxuICAgIGlzTG9hZGluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9hZGluZztcbiAgICB9XG5cbiAgICBnZXRGaWxlRXh0ZW5zaW9uKGZpbGVOYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIGZpbGVOYW1lLnNwbGl0KCcuJykucG9wKCkudG9Mb3dlckNhc2UoKTtcbiAgICB9XG5cbiAgICBjbGVhclNjZW5lKCkge1xuICAgICAgICB0aGlzLmV4dGVuc2lvbiA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5zY2VuZS5jaGlsZHJlbi5mb3JFYWNoKChvYmplY3QpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2NlbmUucmVtb3ZlKG9iamVjdCk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiJdfQ==