acr-assist-simulator-module
Version:
This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 1.7.4.
268 lines (267 loc) • 33.8 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
import { Component, Input } from '@angular/core';
import { ChoiceDataElement } from '../../../core/elements/models/choice-data-element-model';
import { DomSanitizer } from '@angular/platform-browser';
export class ImageMapComponent {
/**
* @param {?} domSanitizer
*/
constructor(domSanitizer) {
this.$ = require('jquery');
this.DataElements = {};
this.FormValues = {};
this.isDataURL = /^\s*data:([a-z]+\/[a-z]+(;[a-z\-]+\=[a-z\-]+)?)?(;base64)?,[a-z0-9\!\$\&\'\,\(\)\*\+\,\;\=\-\.\_\~\:\@\/\?\%\s]*\s*$/i;
this.imageExist = true;
this.SelectionValue = '';
this.domSanitizer = domSanitizer;
}
/**
* @return {?}
*/
ngOnInit() {
if (this.DataElement === undefined) {
return;
}
this.displayValue('');
}
/**
* @param {?} mouseX
* @param {?} mouseY
* @param {?} Coordinates
* @return {?}
*/
isInRectangle(mouseX, mouseY, Coordinates) {
const /** @type {?} */ COArray = Coordinates.split(',');
if (COArray[0] < mouseX
&& (COArray[0] + COArray[2]) > mouseX
&& COArray[1] < mouseY
&& (COArray[1] + COArray[3]) > mouseY) {
return true;
}
return false;
}
/**
* @param {?} mouseX
* @param {?} mouseY
* @param {?} Coordinates
* @return {?}
*/
isInCircle(mouseX, mouseY, Coordinates) {
const /** @type {?} */ COArray = Coordinates.split(',');
if (Math.sqrt(Math.pow((mouseX - COArray[0]), 2) + Math.pow((mouseY - COArray[1]), 2)) < COArray[2]) {
return true;
}
else {
return false;
}
}
/**
* @param {?} x
* @param {?} y
* @param {?} Coordinates
* @return {?}
*/
isInPolygon(x, y, Coordinates) {
const /** @type {?} */ COArray = Coordinates.split(',');
const /** @type {?} */ vs = [];
for (let /** @type {?} */ i = 0; i < COArray.length; i++) {
const /** @type {?} */ point = [];
point.push(COArray[i]);
point.push(COArray[i + 1]);
i += 1;
vs.push(point);
}
let /** @type {?} */ inside = false;
for (let /** @type {?} */ i = 0, /** @type {?} */ j = vs.length - 1; i < vs.length; j = i++) {
const /** @type {?} */ xi = vs[i][0], /** @type {?} */ yi = vs[i][1];
const /** @type {?} */ xj = vs[j][0], /** @type {?} */ yj = vs[j][1];
const /** @type {?} */ intersect = ((yi > y) !== (yj > y))
&& (x < (xj - xi) * (y - yi) / (yj - yi) + xi);
if (intersect) {
inside = !inside;
}
}
return inside;
}
/**
* @param {?} e
* @param {?} dataElement
* @return {?}
*/
imageClick(e, dataElement) {
const /** @type {?} */ O_height = dataElement.ImageProp.height;
const /** @type {?} */ O_width = dataElement.ImageProp.width;
const /** @type {?} */ $elem = this.$(e.target);
const /** @type {?} */ N_height = $elem.height();
const /** @type {?} */ N_width = $elem.width();
const /** @type {?} */ offset = $elem.offset();
const /** @type {?} */ offset_t = offset.top - this.$(window).scrollTop();
const /** @type {?} */ offset_l = offset.left - this.$(window).scrollLeft();
const /** @type {?} */ x = e.clientX - offset_l;
const /** @type {?} */ y = e.clientY - offset_t;
for (const /** @type {?} */ opt of dataElement.ImageOptions) {
if (opt.Shape === 'rect') {
if (this.isInRectangle(x, y, opt.Coordinates)) {
this.FormValues[dataElement.ID] = opt.Value;
break;
}
}
else if (opt.Shape === 'circle') {
if (this.isInCircle(x, y, opt.Coordinates)) {
this.FormValues[dataElement.ID] = opt.Value;
break;
}
}
else if (opt.Shape === 'poly') {
if (this.isInPolygon(x, y, opt.Coordinates)) {
this.FormValues[dataElement.ID] = opt.Value;
break;
}
}
}
}
/**
* @param {?} val
* @return {?}
*/
setValue(val) {
for (const /** @type {?} */ optValue of this.DataElement.choiceInfo) {
if (this.DataElement.choiceInfo.length <= 5 && this.DataElement.choiceInfo.length > 0) {
if (optValue.value === val) {
this.$('#' + val + '_' + this.DataElement.id).prop('checked', true);
const /** @type {?} */ customEvent = document.createEvent('Event');
customEvent.initEvent('change', true, true);
this.$('#' + val + '_' + this.DataElement.id)[0].dispatchEvent(customEvent);
}
else {
this.$('#' + optValue.value + '_' + this.DataElement.id).prop('checked', false);
}
}
else {
if (optValue.value === val) {
this.$('#' + this.DataElement.id).val(optValue.value);
const /** @type {?} */ customEvent = document.createEvent('Event');
customEvent.initEvent('change', true, true);
this.$('#' + this.DataElement.id)[0].dispatchEvent(customEvent);
break;
}
}
}
this.DataElement.currentValue = val;
// this.FormValues[this.DataElement.id] = val;
}
/**
* @param {?} val
* @return {?}
*/
displayValue(val) {
if (val === '') {
this.SelectionValue = 'Image Map Diagram';
}
else {
this.SelectionValue = 'Selected Value : ' + val;
}
}
/**
* @param {?} location
* @return {?}
*/
getImageDataUrl(location) {
const /** @type {?} */ isDataURL = !!location.match(this.isDataURL);
if (isDataURL) {
location = location.replace('unsafe:', '');
return location;
}
else {
return this.imagePath + '/' + location;
}
}
}
ImageMapComponent.decorators = [
{ type: Component, args: [{
selector: 'acr-image-map',
template: `<div class="col-sm-8">
<label class="control-label font-weight-400">Not sure? try out this image </label>
<button type="button" class="btn btn-default" data-toggle="modal" attr.data-target="#{{'imgMap_Modal_'+DataElement.id}}">
<span class="glyphicon glyphicon-picture" aria-hidden="true" data-toggle="tooltip" data-placement="top" title="Image Map"></span>
</button>
</div>
<ng-container *ngIf="imagePath != undefined">
<div class="modal inmodal fade" id="{{'imgMap_Modal_'+DataElement.id}}" tabindex="-1" role="dialog" aria-hidden="true">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal">
<span aria-hidden="true">×</span>
<span class="sr-only">Close</span>
</button>
<h4 class="modal-title"> {{SelectionValue}}</h4>
</div>
<div class="modal-body">
<div class="row">
<div class="col-md-12">
<ng-container *ngIf="imageExist == true">
<img class="ImgOption danger img-responsive max-w-h-100" alt="{{ DataElement.imageMap.label }}" data-dismiss="modal" attr.id="{{'imgMap_Img_'+DataElement.id}}"
(click)="imageClick($event,DataElement);" attr.data-elementID="{{DataElement.id}}" attr.usemap="#{{'imgMap_'+DataElement.id}}"
[src]="domSanitizer.bypassSecurityTrustUrl(getImageDataUrl(DataElement.imageMap.location))">
<map name="{{'imgMap_'+DataElement.id}}">
<ng-container *ngFor="let imgOpt of DataElement.imageMap.map.areas">
<area attr.shape="{{imgOpt.shape}}" attr.imgID="{{'imgMap_Img_'+DataElement.id}}" attr.coords="{{imgOpt.coords}}"
attr.alt="{{imgOpt.choiceValue}}" (mouseover)='displayValue(imgOpt.choiceValue);' (mouseout)='displayValue("");'
(click)="setValue(imgOpt.choiceValue);" data-dismiss="modal">
</ng-container>
</map>
</ng-container>
<ng-container *ngIf="imageExist == false">
<div class="">
No Image Map Available...
</div>
</ng-container>
</div>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-primary" data-dismiss="modal">Close</button>
</div>
</div>
</div>
</div>
</ng-container>
`,
styles: [``, `.required-field{color:red}.padding-l-5{padding-left:5px}.whitespace{margin-left:5px}.max-w-h-100{max-width:100%;max-height:100%}.carousel-control>.fa{font-size:40px;position:absolute;top:50%;z-index:5;display:inline-block;margin-top:-20px}.carousel-control.left{background-repeat:repeat-x}.carousel-control.left,.carousel-control.right{background-image:none}.carousel-control.right{background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-repeat:repeat-x}.scroll{overflow-y:scroll;overflow-x:hidden}.div-simulator-form-height{height:calc(100vh - 100px);overflow-y:scroll;overflow-x:hidden}.div-report-text-scroll{overflow-x:hidden;overflow-y:auto;max-height:calc(100vh - 300px)}.padding-r-10{padding-right:10px}.slide-left{left:30px}.slide-right{right:30px}hr{margin-top:10px;margin-bottom:10px}.white-space-line{white-space:pre-line;word-wrap:break-word}p{margin:0 0 10px}.form-control{border-radius:0;box-shadow:none;border-color:#d2d6de}h4.modal-title.float-left{float:left}.margin-b-0{margin-bottom:0}.font-weight-400{font-weight:400}.custom-radio-style{float:left;margin-right:15px}.zoom{width:100%;overflow:auto}.zoom img{height:auto;width:100%;min-width:100%;max-width:inherit!important}.btn-zoom{background-color:#f4f4f4;color:#444;border-color:#ddd}.btn-zoom.hover,.btn-zoom:active,.btn-zoom:hover{background-color:#e7e7e7}@media (min-width:768px){label.control-label{padding-left:20px}}.padding-5{padding:5px}`]
},] },
];
/** @nocollapse */
ImageMapComponent.ctorParameters = () => [
{ type: DomSanitizer }
];
ImageMapComponent.propDecorators = {
DataElement: [{ type: Input }],
DataElements: [{ type: Input }],
FormValues: [{ type: Input }],
imagePath: [{ type: Input }]
};
function ImageMapComponent_tsickle_Closure_declarations() {
/** @type {?} */
ImageMapComponent.prototype.$;
/** @type {?} */
ImageMapComponent.prototype.DataElement;
/** @type {?} */
ImageMapComponent.prototype.DataElements;
/** @type {?} */
ImageMapComponent.prototype.FormValues;
/** @type {?} */
ImageMapComponent.prototype.imagePath;
/** @type {?} */
ImageMapComponent.prototype.isDataURL;
/** @type {?} */
ImageMapComponent.prototype.domSanitizer;
/** @type {?} */
ImageMapComponent.prototype.imageExist;
/** @type {?} */
ImageMapComponent.prototype.SelectionValue;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UtbWFwLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2Fjci1hc3Npc3Qtc2ltdWxhdG9yLW1vZHVsZS8iLCJzb3VyY2VzIjpbInNyYy9hcHAvbW9kdWxlcy9hY3ItYXNzaXN0LXNpbXVsYXRvci9hc3Npc3QtZGF0YS1lbGVtZW50L2ltYWdlLW1hcC9pbWFnZS1tYXAuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFXLEtBQUssRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUV6RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx5REFBeUQsQ0FBQztBQUM1RixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUF5RHpELE1BQU07Ozs7SUFXRixZQUFZLFlBQTBCO2lCQVZsQyxPQUFPLENBQUMsUUFBUSxDQUFDOzRCQUVXLEVBQUU7MEJBQ0osRUFBRTt5QkFFcEIsdUhBQXVIOzBCQUV0SCxJQUFJOzhCQUNBLEVBQUU7UUFHZixJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQztLQUNwQzs7OztJQUVELFFBQVE7UUFFSixFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDakMsTUFBTSxDQUFDO1NBQ1Y7UUFDRCxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0tBQ3pCOzs7Ozs7O0lBRUQsYUFBYSxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsV0FBVztRQUNyQyx1QkFBTSxPQUFPLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN2QyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTTtlQUNoQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNO2VBQ2xDLE9BQU8sQ0FB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ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0ICwgSW5wdXR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBEYXRhRWxlbWVudCB9IGZyb20gJy4uLy4uLy4uL2NvcmUvbW9kZWxzL2RhdGEtZWxlbWVudC5tb2RlbCc7XHJcbmltcG9ydCB7IENob2ljZURhdGFFbGVtZW50IH0gZnJvbSAnLi4vLi4vLi4vY29yZS9lbGVtZW50cy9tb2RlbHMvY2hvaWNlLWRhdGEtZWxlbWVudC1tb2RlbCc7XHJcbmltcG9ydCB7IERvbVNhbml0aXplciB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xyXG5cclxuZGVjbGFyZSB2YXIgcmVxdWlyZTogYW55O1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdhY3ItaW1hZ2UtbWFwJyxcclxuICB0ZW1wbGF0ZTogYDxkaXYgY2xhc3M9XCJjb2wtc20tOFwiPlxyXG4gIDxsYWJlbCBjbGFzcz1cImNvbnRyb2wtbGFiZWwgZm9udC13ZWlnaHQtNDAwXCI+Tm90IHN1cmU/IHRyeSBvdXQgdGhpcyBpbWFnZSA8L2xhYmVsPlxyXG4gIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0XCIgZGF0YS10b2dnbGU9XCJtb2RhbFwiIGF0dHIuZGF0YS10YXJnZXQ9XCIje3snaW1nTWFwX01vZGFsXycrRGF0YUVsZW1lbnQuaWR9fVwiPlxyXG4gICAgPHNwYW4gY2xhc3M9XCJnbHlwaGljb24gZ2x5cGhpY29uLXBpY3R1cmVcIiBhcmlhLWhpZGRlbj1cInRydWVcIiBkYXRhLXRvZ2dsZT1cInRvb2x0aXBcIiBkYXRhLXBsYWNlbWVudD1cInRvcFwiIHRpdGxlPVwiSW1hZ2UgTWFwXCI+PC9zcGFuPlxyXG4gIDwvYnV0dG9uPlxyXG48L2Rpdj5cclxuPG5nLWNvbnRhaW5lciAqbmdJZj1cImltYWdlUGF0aCAhPSB1bmRlZmluZWRcIj5cclxuICA8ZGl2IGNsYXNzPVwibW9kYWwgaW5tb2RhbCBmYWRlXCIgaWQ9XCJ7eydpbWdNYXBfTW9kYWxfJytEYXRhRWxlbWVudC5pZH19XCIgdGFiaW5kZXg9XCItMVwiIHJvbGU9XCJkaWFsb2dcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1kaWFsb2cgbW9kYWwtbGdcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWNvbnRlbnRcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyXCI+XHJcbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImNsb3NlXCIgZGF0YS1kaXNtaXNzPVwibW9kYWxcIj5cclxuICAgICAgICAgICAgPHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCI+JnRpbWVzOzwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzci1vbmx5XCI+Q2xvc2U8L3NwYW4+XHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIDxoNCBjbGFzcz1cIm1vZGFsLXRpdGxlXCI+IHt7U2VsZWN0aW9uVmFsdWV9fTwvaDQ+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHlcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMlwiPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpbWFnZUV4aXN0ID09IHRydWVcIj5cclxuICAgICAgICAgICAgICAgICAgPGltZyBjbGFzcz1cIkltZ09wdGlvbiBkYW5nZXIgaW1nLXJlc3BvbnNpdmUgbWF4LXctaC0xMDBcIiBhbHQ9XCJ7eyBEYXRhRWxlbWVudC5pbWFnZU1hcC5sYWJlbCB9fVwiIGRhdGEtZGlzbWlzcz1cIm1vZGFsXCIgYXR0ci5pZD1cInt7J2ltZ01hcF9JbWdfJytEYXRhRWxlbWVudC5pZH19XCJcclxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiaW1hZ2VDbGljaygkZXZlbnQsRGF0YUVsZW1lbnQpO1wiIGF0dHIuZGF0YS1lbGVtZW50SUQ9XCJ7e0RhdGFFbGVtZW50LmlkfX1cIiBhdHRyLnVzZW1hcD1cIiN7eydpbWdNYXBfJytEYXRhRWxlbWVudC5pZH19XCJcclxuICAgICAgICAgICAgICAgICAgICBbc3JjXT1cImRvbVNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0VXJsKGdldEltYWdlRGF0YVVybChEYXRhRWxlbWVudC5pbWFnZU1hcC5sb2NhdGlvbikpXCI+XHJcbiAgICAgICAgICAgICAgICA8bWFwIG5hbWU9XCJ7eydpbWdNYXBfJytEYXRhRWxlbWVudC5pZH19XCI+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGltZ09wdCBvZiBEYXRhRWxlbWVudC5pbWFnZU1hcC5tYXAuYXJlYXNcIj5cclxuICAgICAgICAgICAgICAgICAgICA8YXJlYSBhdHRyLnNoYXBlPVwie3tpbWdPcHQuc2hhcGV9fVwiIGF0dHIuaW1nSUQ9XCJ7eydpbWdNYXBfSW1nXycrRGF0YUVsZW1lbnQuaWR9fVwiIGF0dHIuY29vcmRzPVwie3tpbWdPcHQuY29vcmRzfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgYXR0ci5hbHQ9XCJ7e2ltZ09wdC5jaG9pY2VWYWx1ZX19XCIgKG1vdXNlb3Zlcik9J2Rpc3BsYXlWYWx1ZShpbWdPcHQuY2hvaWNlVmFsdWUpOycgKG1vdXNlb3V0KT0nZGlzcGxheVZhbHVlKFwiXCIpOydcclxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZXRWYWx1ZShpbWdPcHQuY2hvaWNlVmFsdWUpO1wiIGRhdGEtZGlzbWlzcz1cIm1vZGFsXCI+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9tYXA+XHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImltYWdlRXhpc3QgPT0gZmFsc2VcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJcIj5cclxuICAgICAgICAgICAgICAgICAgTm8gSW1hZ2UgTWFwIEF2YWlsYWJsZS4uLlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWZvb3RlclwiPlxyXG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnlcIiBkYXRhLWRpc21pc3M9XCJtb2RhbFwiPkNsb3NlPC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvbmctY29udGFpbmVyPlxyXG5gLFxyXG4gIHN0eWxlczogW2BgLCBgLnJlcXVpcmVkLWZpZWxke2NvbG9yOnJlZH0ucGFkZGluZy1sLTV7cGFkZGluZy1sZWZ0OjVweH0ud2hpdGVzcGFjZXttYXJnaW4tbGVmdDo1cHh9Lm1heC13LWgtMTAwe21heC13aWR0aDoxMDAlO21heC1oZWlnaHQ6MTAwJX0uY2Fyb3VzZWwtY29udHJvbD4uZmF7Zm9udC1zaXplOjQwcHg7cG9zaXRpb246YWJzb2x1dGU7dG9wOjUwJTt6LWluZGV4OjU7ZGlzcGxheTppbmxpbmUtYmxvY2s7bWFyZ2luLXRvcDotMjBweH0uY2Fyb3VzZWwtY29udHJvbC5sZWZ0e2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14fS5jYXJvdXNlbC1jb250cm9sLmxlZnQsLmNhcm91c2VsLWNvbnRyb2wucmlnaHR7YmFja2dyb3VuZC1pbWFnZTpub25lfS5jYXJvdXNlbC1jb250cm9sLnJpZ2h0e2JhY2tncm91bmQtaW1hZ2U6bGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LHJnYmEoMCwwLDAsLjAwMDEpIDAscmdiYSgwLDAsMCwuNSkgMTAwJSk7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXh9LnNjcm9sbHtvdmVyZmxvdy15OnNjcm9sbDtvdmVyZmxvdy14OmhpZGRlbn0uZGl2LXNpbXVsYXRvci1mb3JtLWhlaWdodHtoZWlnaHQ6Y2FsYygxMDB2aCAtIDEwMHB4KTtvdmVyZmxvdy15OnNjcm9sbDtvdmVyZmxvdy14OmhpZGRlbn0uZGl2LXJlcG9ydC10ZXh0LXNjcm9sbHtvdmVyZmxvdy14OmhpZGRlbjtvdmVyZmxvdy15OmF1dG87bWF4LWhlaWdodDpjYWxjKDEwMHZoIC0gMzAwcHgpfS5wYWRkaW5nLXItMTB7cGFkZGluZy1yaWdodDoxMHB4fS5zbGlkZS1sZWZ0e2xlZnQ6MzBweH0uc2xpZGUtcmlnaHR7cmlnaHQ6MzBweH1ocnttYXJnaW4tdG9wOjEwcHg7bWFyZ2luLWJvdHRvbToxMHB4fS53aGl0ZS1zcGFjZS1saW5le3doaXRlLXNwYWNlOnByZS1saW5lO3dvcmQtd3JhcDpicmVhay13b3JkfXB7bWFyZ2luOjAgMCAxMHB4fS5mb3JtLWNvbnRyb2x7Ym9yZGVyLXJhZGl1czowO2JveC1zaGFkb3c6bm9uZTtib3JkZXItY29sb3I6I2QyZDZkZX1oNC5tb2RhbC10aXRsZS5mbG9hdC1sZWZ0e2Zsb2F0OmxlZnR9Lm1hcmdpbi1iLTB7bWFyZ2luLWJvdHRvbTowfS5mb250LXdlaWdodC00MDB7Zm9udC13ZWlnaHQ6NDAwfS5jdXN0b20tcmFkaW8tc3R5bGV7ZmxvYXQ6bGVmdDttYXJnaW4tcmlnaHQ6MTVweH0uem9vbXt3aWR0aDoxMDAlO292ZXJmbG93OmF1dG99Lnpvb20gaW1ne2hlaWdodDphdXRvO3dpZHRoOjEwMCU7bWluLXdpZHRoOjEwMCU7bWF4LXdpZHRoOmluaGVyaXQhaW1wb3J0YW50fS5idG4tem9vbXtiYWNrZ3JvdW5kLWNvbG9yOiNmNGY0ZjQ7Y29sb3I6IzQ0NDtib3JkZXItY29sb3I6I2RkZH0uYnRuLXpvb20uaG92ZXIsLmJ0bi16b29tOmFjdGl2ZSwuYnRuLXpvb206aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojZTdlN2U3fUBtZWRpYSAobWluLXdpZHRoOjc2OHB4KXtsYWJlbC5jb250cm9sLWxhYmVse3BhZGRpbmctbGVmdDoyMHB4fX0ucGFkZGluZy01e3BhZGRpbmc6NXB4fWBdXHJcbn0pXHJcblxyXG5leHBvcnQgY2xhc3MgSW1hZ2VNYXBDb21wb25lbnQgIGltcGxlbWVudHMgT25Jbml0IHtcclxuICAgICQgPSByZXF1aXJlKCdqcXVlcnknKTtcclxuICAgIEBJbnB1dCgpIERhdGFFbGVtZW50OiBDaG9pY2VEYXRhRWxlbWVudDtcclxuICAgIEBJbnB1dCgpIERhdGFFbGVtZW50czogT2JqZWN0ID0ge307XHJcbiAgICBASW5wdXQoKSBGb3JtVmFsdWVzOiBPYmplY3QgPSB7fTtcclxuICAgIEBJbnB1dCgpIGltYWdlUGF0aDogc3RyaW5nO1xyXG4gICAgaXNEYXRhVVJMID0gL15cXHMqZGF0YTooW2Etel0rXFwvW2Etel0rKDtbYS16XFwtXStcXD1bYS16XFwtXSspPyk/KDtiYXNlNjQpPyxbYS16MC05XFwhXFwkXFwmXFwnXFwsXFwoXFwpXFwqXFwrXFwsXFw7XFw9XFwtXFwuXFxfXFx+XFw6XFxAXFwvXFw/XFwlXFxzXSpcXHMqJC9pO1xyXG4gICAgZG9tU2FuaXRpemVyOiBEb21TYW5pdGl6ZXI7XHJcbiAgICBpbWFnZUV4aXN0ID0gdHJ1ZTtcclxuICAgIFNlbGVjdGlvblZhbHVlID0gJyc7XHJcblxyXG4gICAgY29uc3RydWN0b3IoZG9tU2FuaXRpemVyOiBEb21TYW5pdGl6ZXIpIHtcclxuICAgICAgICB0aGlzLmRvbVNhbml0aXplciA9IGRvbVNhbml0aXplcjtcclxuICAgIH1cclxuXHJcbiAgICBuZ09uSW5pdCgpIHtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuRGF0YUVsZW1lbnQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuZGlzcGxheVZhbHVlKCcnKTtcclxuICAgIH1cclxuXHJcbiAgICBpc0luUmVjdGFuZ2xlKG1vdXNlWCwgbW91c2VZLCBDb29yZGluYXRlcykge1xyXG4gICAgICAgIGNvbnN0IENPQXJyYXkgPSBDb29yZGluYXRlcy5zcGxpdCgnLCcpO1xyXG4gICAgICAgIGlmIChDT0FycmF5WzBdIDwgbW91c2VYXHJcbiAgICAgICAgICAgICYmIChDT0FycmF5WzBdICsgQ09BcnJheVsyXSkgPiBtb3VzZVhcclxuICAgICAgICAgICAgJiYgQ09BcnJheVsxXSA8IG1vdXNlWVxyXG4gICAgICAgICAgICAmJiAoQ09BcnJheVsxXSArIENPQXJyYXlbM10pID4gbW91c2VZKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgaXNJbkNpcmNsZShtb3VzZVgsIG1vdXNlWSwgQ29vcmRpbmF0ZXMpIHtcclxuICAgICAgICBjb25zdCBDT0FycmF5ID0gQ29vcmRpbmF0ZXMuc3BsaXQoJywnKTtcclxuICAgICAgICBpZiAoTWF0aC5zcXJ0KE1hdGgucG93KChtb3VzZVggLSBDT0FycmF5WzBdKSwgMikgKyBNYXRoLnBvdygobW91c2VZIC0gQ09BcnJheVsxXSksIDIpKSA8IENPQXJyYXlbMl0pIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpc0luUG9seWdvbih4LCB5LCBDb29yZGluYXRlcykge1xyXG4gICAgICAgIGNvbnN0IENPQXJyYXkgPSBDb29yZGluYXRlcy5zcGxpdCgnLCcpO1xyXG4gICAgICAgIGNvbnN0IHZzID0gW107XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBDT0FycmF5Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHBvaW50ID0gW107XHJcbiAgICAgICAgICAgIHBvaW50LnB1c2goQ09BcnJheVtpXSk7XHJcbiAgICAgICAgICAgIHBvaW50LnB1c2goQ09BcnJheVtpICsgMV0pO1xyXG4gICAgICAgICAgICBpICs9IDE7XHJcbiAgICAgICAgICAgIHZzLnB1c2gocG9pbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgaW5zaWRlID0gZmFsc2U7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGogPSB2cy5sZW5ndGggLSAxOyBpIDwgdnMubGVuZ3RoOyBqID0gaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHhpID0gdnNbaV1bMF0sIHlpID0gdnNbaV1bMV07XHJcbiAgICAgICAgICAgIGNvbnN0IHhqID0gdnNbal1bMF0sIHlqID0gdnNbal1bMV07XHJcbiAgICAgICAgICAgIGNvbnN0IGludGVyc2VjdCA9ICgoeWkgPiB5KSAhPT0gKHlqID4geSkpXHJcbiAgICAgICAgICAgICAgICAmJiAoeCA8ICh4aiAtIHhpKSAqICh5IC0geWkpIC8gKHlqIC0geWkpICsgeGkpO1xyXG4gICAgICAgICAgICBpZiAoaW50ZXJzZWN0KSB7XHJcbiAgICAgICAgICAgICAgICBpbnNpZGUgPSAhaW5zaWRlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBpbnNpZGU7XHJcbiAgICB9XHJcblxyXG4gICAgaW1hZ2VDbGljayhlLCBkYXRhRWxlbWVudCkge1xyXG4gICAgICAgIGNvbnN0IE9faGVpZ2h0ID0gZGF0YUVsZW1lbnQuSW1hZ2VQcm9wLmhlaWdodDtcclxuICAgICAgICBjb25zdCBPX3dpZHRoID0gZGF0YUVsZW1lbnQuSW1hZ2VQcm9wLndpZHRoO1xyXG4gICAgICAgIGNvbnN0ICRlbGVtID0gdGhpcy4kKGUudGFyZ2V0KTtcclxuXHJcbiAgICAgICAgY29uc3QgTl9oZWlnaHQgPSAkZWxlbS5oZWlnaHQoKTtcclxuICAgICAgICBjb25zdCBOX3dpZHRoID0gJGVsZW0ud2lkdGgoKTtcclxuXHJcblxyXG4gICAgICAgIGNvbnN0IG9mZnNldCA9ICRlbGVtLm9mZnNldCgpO1xyXG5cclxuICAgICAgICBjb25zdCBvZmZzZXRfdCA9IG9mZnNldC50b3AgLSB0aGlzLiQod2luZG93KS5zY3JvbGxUb3AoKTtcclxuICAgICAgICBjb25zdCBvZmZzZXRfbCA9IG9mZnNldC5sZWZ0IC0gdGhpcy4kKHdpbmRvdykuc2Nyb2xsTGVmdCgpO1xyXG5cclxuICAgICAgICBjb25zdCB4ID0gZS5jbGllbnRYIC0gb2Zmc2V0X2w7XHJcbiAgICAgICAgY29uc3QgeSA9IGUuY2xpZW50WSAtIG9mZnNldF90O1xyXG4gICAgICAgIGZvciAoY29uc3Qgb3B0IG9mIGRhdGFFbGVtZW50LkltYWdlT3B0aW9ucykge1xyXG4gICAgICAgICAgICBpZiAob3B0LlNoYXBlID09PSAncmVjdCcpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzSW5SZWN0YW5nbGUoeCwgeSwgb3B0LkNvb3JkaW5hdGVzKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRm9ybVZhbHVlc1tkYXRhRWxlbWVudC5JRF0gPSBvcHQuVmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAob3B0LlNoYXBlID09PSAnY2lyY2xlJykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNJbkNpcmNsZSh4LCB5LCBvcHQuQ29vcmRpbmF0ZXMpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5Gb3JtVmFsdWVzW2RhdGFFbGVtZW50LklEXSA9IG9wdC5WYWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIGlmIChvcHQuU2hhcGUgPT09ICdwb2x5Jykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNJblBvbHlnb24oeCwgeSwgb3B0LkNvb3JkaW5hdGVzKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuRm9ybVZhbHVlc1tkYXRhRWxlbWVudC5JRF0gPSBvcHQuVmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICBzZXRWYWx1ZSh2YWwpIHtcclxuICAgICAgICBmb3IgKGNvbnN0IG9wdFZhbHVlIG9mIHRoaXMuRGF0YUVsZW1lbnQuY2hvaWNlSW5mbykge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5EYXRhRWxlbWVudC5jaG9pY2VJbmZvLmxlbmd0aCA8PSA1ICYmIHRoaXMuRGF0YUVsZW1lbnQuY2hvaWNlSW5mby5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAob3B0VmFsdWUudmFsdWUgPT09IHZhbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJCgnIycgKyB2YWwgKyAnXycgKyB0aGlzLkRhdGFFbGVtZW50LmlkKS5wcm9wKCdjaGVja2VkJywgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY3VzdG9tRXZlbnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnRXZlbnQnKTtcclxuICAgICAgICAgICAgICAgICAgICBjdXN0b21FdmVudC5pbml0RXZlbnQoJ2NoYW5nZScsIHRydWUsIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJCgnIycgKyB2YWwgKyAnXycgKyB0aGlzLkRhdGFFbGVtZW50LmlkKVswXS5kaXNwYXRjaEV2ZW50KGN1c3RvbUV2ZW50KTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kKCcjJyArIG9wdFZhbHVlLnZhbHVlICsgJ18nICsgdGhpcy5EYXRhRWxlbWVudC5pZCkucHJvcCgnY2hlY2tlZCcsIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmIChvcHRWYWx1ZS52YWx1ZSA9PT0gdmFsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kKCcjJyArIHRoaXMuRGF0YUVsZW1lbnQuaWQpLnZhbChvcHRWYWx1ZS52YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY3VzdG9tRXZlbnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnRXZlbnQnKTtcclxuICAgICAgICAgICAgICAgICAgICBjdXN0b21FdmVudC5pbml0RXZlbnQoJ2NoYW5nZScsIHRydWUsIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJCgnIycgKyB0aGlzLkRhdGFFbGVtZW50LmlkKVswXS5kaXNwYXRjaEV2ZW50KGN1c3RvbUV2ZW50KTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLkRhdGFFbGVtZW50LmN1cnJlbnRWYWx1ZSA9IHZhbDtcclxuICAgICAgICAvLyB0aGlzLkZvcm1WYWx1ZXNbdGhpcy5EYXRhRWxlbWVudC5pZF0gPSB2YWw7XHJcbiAgICB9XHJcblxyXG4gICAgZGlzcGxheVZhbHVlKHZhbCkge1xyXG4gICAgICAgIGlmICh2YWwgPT09ICcnKSB7XHJcbiAgICAgICAgICAgIHRoaXMuU2VsZWN0aW9uVmFsdWUgPSAnSW1hZ2UgTWFwIERpYWdyYW0nO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuU2VsZWN0aW9uVmFsdWUgPSAnU2VsZWN0ZWQgVmFsdWUgOiAnICsgdmFsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXRJbWFnZURhdGFVcmwobG9jYXRpb246IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICAgICAgY29uc3QgaXNEYXRhVVJMID0gISFsb2NhdGlvbi5tYXRjaCh0aGlzLmlzRGF0YVVSTCk7XHJcbiAgICAgICAgaWYgKGlzRGF0YVVSTCkge1xyXG4gICAgICAgIGxvY2F0aW9uID0gbG9jYXRpb24ucmVwbGFjZSgndW5zYWZlOicsICcnKTtcclxuICAgICAgICAgIHJldHVybiBsb2NhdGlvbjtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuaW1hZ2VQYXRoICsgJy8nICsgbG9jYXRpb247XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiJdfQ==