ng-zorro-antd-mobile
Version:
An enterprise-class mobile UI components based on Ant Design and Angular
366 lines (365 loc) • 28.1 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
import { Component, Input, Output, EventEmitter, ViewChild, ViewContainerRef } from '@angular/core';
/**
* @record
*/
export function ElementType() { }
/** @type {?} */
ElementType.prototype.type;
/** @type {?} */
ElementType.prototype.backgroundImage;
/** @type {?} */
ElementType.prototype.transform;
export class ImagePicker {
constructor() {
this.prefixCls = 'am-image-picker';
this.flexEl = [];
this._accept = 'image/*';
this._count = 4;
this._selectable = true;
this._files = [];
this._multiple = false;
this.onFail = new EventEmitter();
this.onChange = new EventEmitter();
this.onImageClick = new EventEmitter();
this.onAddImageClick = new EventEmitter();
}
/**
* @return {?}
*/
get files() {
return this._files;
}
/**
* @param {?} value
* @return {?}
*/
set files(value) {
this._files = value;
this.sortItem();
}
/**
* @return {?}
*/
get accept() {
return this._accept;
}
/**
* @param {?} value
* @return {?}
*/
set accept(value) {
this._accept = value;
this.sortItem();
}
/**
* @return {?}
*/
get length() {
return this._count;
}
/**
* @param {?} value
* @return {?}
*/
set length(value) {
if (value > 0) {
this._count = value;
}
else {
this._count = 4;
}
this.sortItem();
}
/**
* @return {?}
*/
get multiple() {
return this._multiple;
}
/**
* @param {?} value
* @return {?}
*/
set multiple(value) {
this._multiple = value;
this.sortItem();
}
/**
* @return {?}
*/
get selectable() {
return this._selectable;
}
/**
* @param {?} value
* @return {?}
*/
set selectable(value) {
this._selectable = value;
this.sortItem();
}
/**
* @return {?}
*/
sortItem() {
if (!this._files) {
return;
}
/** @type {?} */
let count = parseInt('' + this._count, 10);
if (count <= 0) {
count = 4;
}
/** @type {?} */
let allEl = this._files.map(item => {
return {
type: 'img',
backgroundImage: 'url(' + item.url + ')',
transform: 'rotate(' + this.getRotation(item.orientation) + ')deg'
};
});
if (this._selectable) {
allEl.push({
type: 'select',
backgroundImage: '',
transform: ''
});
}
/** @type {?} */
const length = allEl.length;
if (length !== 0 && length % count !== 0) {
/** @type {?} */
const blankCount = count - (length % count);
/** @type {?} */
const fillBlankEl = [];
for (let i = 0; i < blankCount; i++) {
fillBlankEl.push({
type: 'white',
backgroundImage: '',
transform: ''
});
}
allEl = allEl.concat(fillBlankEl);
}
this.flexEl = [];
for (let i = 0; i < allEl.length / count; i++) {
/** @type {?} */
const rowEl = allEl.slice(i * count, i * count + count);
this.flexEl.push(rowEl);
}
}
/**
* @param {?} imgItem
* @return {?}
*/
addImage(imgItem) {
this._files.push({
type: 'img',
url: imgItem.url,
orientation: imgItem.orientation
});
this.sortItem();
this.onChange.emit({
files: this._files,
operationType: 'add',
index: this._files.length - 1
});
}
/**
* @param {?} index
* @return {?}
*/
removeImage(index) {
this._files.splice(index, 1);
this.sortItem();
this.onChange.emit({
files: this._files,
operationType: 'remove',
index: index
});
}
/**
* @param {?} index
* @return {?}
*/
imageClick(index) {
this.onImageClick.emit({
index: index,
files: this._files
});
}
/**
* @param {?} e
* @return {?}
*/
addImageClick(e) {
this.onAddImageClick.emit(e);
}
/**
* @param {?} file
* @param {?} index
* @return {?}
*/
parseFile(file, index) {
/** @type {?} */
const reader = new FileReader();
reader.onload = e => {
/** @type {?} */
const dataURL = (/** @type {?} */ (e.target)).result;
if (!dataURL) {
this.onFail.emit(`Fail to get the ${index} image`);
return;
}
/** @type {?} */
let orientation = 1;
this.getOrientation(file, res => {
// -2: not jpeg , -1: not defined
if (res > 0) {
orientation = res;
}
this.addImage({
url: dataURL,
orientation,
file
});
});
};
reader.readAsDataURL(file);
}
/**
* @param {?} event
* @return {?}
*/
fileChange(event) {
/** @type {?} */
const fileList = event.target.files;
if (fileList && fileList.length) {
for (let i = 0; i < fileList.length; i++) {
this.parseFile(fileList[i], i);
}
}
}
/**
* @param {?=} orientation
* @return {?}
*/
getRotation(orientation = 1) {
/** @type {?} */
let imgRotation = 0;
switch (orientation) {
case 3:
imgRotation = 180;
break;
case 6:
imgRotation = 90;
break;
case 8:
imgRotation = 270;
break;
default:
}
return imgRotation;
}
/**
* @param {?} file
* @param {?} callback
* @return {?}
*/
getOrientation(file, callback) {
/** @type {?} */
const reader = new FileReader();
reader.onload = e => {
/** @type {?} */
const view = new DataView((/** @type {?} */ (e.target)).result);
if (view.getUint16(0, false) !== 0xffd8) {
return callback(-2);
}
/** @type {?} */
const length = view.byteLength;
/** @type {?} */
let offset = 2;
while (offset < length) {
/** @type {?} */
const marker = view.getUint16(offset, false);
offset += 2;
if (marker === 0xffe1) {
/** @type {?} */
const tmp = view.getUint32((offset += 2), false);
if (tmp !== 0x45786966) {
return callback(-1);
}
/** @type {?} */
const little = view.getUint16((offset += 6), false) === 0x4949;
offset += view.getUint32(offset + 4, little);
/** @type {?} */
const tags = view.getUint16(offset, little);
offset += 2;
for (let i = 0; i < tags; i++) {
if (view.getUint16(offset + i * 12, little) === 0x0112) {
return callback(view.getUint16(offset + i * 12 + 8, little));
}
}
}
else if ((marker & 0xff00) !== 0xff00) {
break;
}
else {
offset += view.getUint16(offset, false);
}
}
return callback(-1);
};
reader.readAsArrayBuffer(file.slice(0, 64 * 1024));
}
}
ImagePicker.decorators = [
{ type: Component, args: [{
selector: 'ImagePicker, nzm-image-picker',
template: "<div class=\"{{prefixCls}}-list\" role=\"group\">\n <Flex *ngFor=\"let rowItem of flexEl;let i = index;\">\n <FlexItem *ngFor=\"let item of rowItem;let j =index;\">\n <div *ngIf=\"item && 'img' === item.type && item.backgroundImage\" class=\"{{prefixCls}}-item\">\n <div role=\"button\"\n aria-label=\"Click and Remove this image\"\n class=\"{{prefixCls}}-item-remove\"\n (click)=\"removeImage(i * length + j)\"\n ></div>\n <div role=\"button\"\n aria-label=\"Image can be clicked\"\n class=\"{{prefixCls}}-item-content\"\n [ngStyle]=\"{'background-image': item.backgroundImage, 'transform': item.transform}\"\n (click)=\"imageClick(i * length + j)\"\n ></div>\n </div>\n <div role=\"button\"\n aria-label=\"Choose and add image\"\n *ngIf=\"item && 'select' === item.type\"\n class=\"{{prefixCls}}-item {{prefixCls}}-upload-btn\"\n (click)=\"addImageClick($event)\"\n >\n <input #fileSelectorInput\n type=\"file\"\n [accept]=\"accept\"\n [multiple]=\"multiple\"\n (change)=\"fileChange($event)\"\n />\n </div>\n <div *ngIf=\"item && 'white' === item.type\" class=\"{{prefixCls}}-item-white\">\n </div>\n </FlexItem>\n </Flex>\n</div>\n"
}] }
];
/** @nocollapse */
ImagePicker.ctorParameters = () => [];
ImagePicker.propDecorators = {
_fileSelectorInput: [{ type: ViewChild, args: ['fileSelectorInput', { read: ViewContainerRef },] }],
files: [{ type: Input }],
accept: [{ type: Input }],
length: [{ type: Input }],
multiple: [{ type: Input }],
selectable: [{ type: Input }],
onFail: [{ type: Output }],
onChange: [{ type: Output }],
onImageClick: [{ type: Output }],
onAddImageClick: [{ type: Output }]
};
if (false) {
/** @type {?} */
ImagePicker.prototype.prefixCls;
/** @type {?} */
ImagePicker.prototype.flexEl;
/** @type {?} */
ImagePicker.prototype._accept;
/** @type {?} */
ImagePicker.prototype._count;
/** @type {?} */
ImagePicker.prototype._selectable;
/** @type {?} */
ImagePicker.prototype._files;
/** @type {?} */
ImagePicker.prototype._multiple;
/** @type {?} */
ImagePicker.prototype._fileSelectorInput;
/** @type {?} */
ImagePicker.prototype.onFail;
/** @type {?} */
ImagePicker.prototype.onChange;
/** @type {?} */
ImagePicker.prototype.onImageClick;
/** @type {?} */
ImagePicker.prototype.onAddImageClick;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UtcGlja2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25nLXpvcnJvLWFudGQtbW9iaWxlLyIsInNvdXJjZXMiOlsiaW1hZ2UtcGlja2VyL2ltYWdlLXBpY2tlci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sZUFBZSxDQUFDOzs7Ozs7Ozs7OztBQVlwRyxNQUFNO0lBa0VKO3lCQWpFb0IsaUJBQWlCO3NCQUNYLEVBQUU7dUJBRUYsU0FBUztzQkFDVixDQUFDOzJCQUNLLElBQUk7c0JBQ04sRUFBRTt5QkFDRixLQUFLO3NCQWtETixJQUFJLFlBQVksRUFBRTt3QkFFaEIsSUFBSSxZQUFZLEVBQUU7NEJBRWQsSUFBSSxZQUFZLEVBQUU7K0JBRWYsSUFBSSxZQUFZLEVBQUU7S0FFdkM7Ozs7SUFyRGhCLElBQ0ksS0FBSztRQUNQLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztLQUNwQjs7Ozs7SUFDRCxJQUFJLEtBQUssQ0FBQyxLQUFpQjtRQUN6QixJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztRQUNwQixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7S0FDakI7Ozs7SUFDRCxJQUNJLE1BQU07UUFDUixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7S0FDckI7Ozs7O0lBQ0QsSUFBSSxNQUFNLENBQUMsS0FBYTtRQUN0QixJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztRQUNyQixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7S0FDakI7Ozs7SUFDRCxJQUNJLE1BQU07UUFDUixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7S0FDcEI7Ozs7O0lBQ0QsSUFBSSxNQUFNLENBQUMsS0FBYTtRQUN0QixJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUU7WUFDYixJQUFJ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TCxLQUFLO3VCQVlMLEtBQUs7eUJBUUwsS0FBSztxQkFRTCxNQUFNO3VCQUVOLE1BQU07MkJBRU4sTUFBTTs4QkFFTixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIFZpZXdDaGlsZCwgVmlld0NvbnRhaW5lclJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEVsZW1lbnRUeXBlIHtcbiAgdHlwZTogc3RyaW5nOyAvLyAnaW1nJyB8ICdzZWxlY3QnIHwgJ3doaXRlJ1xuICBiYWNrZ3JvdW5kSW1hZ2U6IHN0cmluZztcbiAgdHJhbnNmb3JtOiBzdHJpbmc7XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ0ltYWdlUGlja2VyLCBuem0taW1hZ2UtcGlja2VyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2ltYWdlLXBpY2tlci5jb21wb25lbnQuaHRtbCdcbn0pXG5leHBvcnQgY2xhc3MgSW1hZ2VQaWNrZXIge1xuICBwcmVmaXhDbHM6IHN0cmluZyA9ICdhbS1pbWFnZS1waWNrZXInO1xuICBmbGV4RWw6IEVsZW1lbnRUeXBlW11bXSA9IFtdO1xuXG4gIHByaXZhdGUgX2FjY2VwdDogc3RyaW5nID0gJ2ltYWdlLyonO1xuICBwcml2YXRlIF9jb3VudDogbnVtYmVyID0gNDtcbiAgcHJpdmF0ZSBfc2VsZWN0YWJsZTogYm9vbGVhbiA9IHRydWU7XG4gIHByaXZhdGUgX2ZpbGVzOiBBcnJheTxhbnk+ID0gW107XG4gIHByaXZhdGUgX211bHRpcGxlOiBib29sZWFuID0gZmFsc2U7XG5cbiAgQFZpZXdDaGlsZCgnZmlsZVNlbGVjdG9ySW5wdXQnLCB7IHJlYWQ6IFZpZXdDb250YWluZXJSZWYgfSlcbiAgcHJpdmF0ZSBfZmlsZVNlbGVjdG9ySW5wdXQ6IFZpZXdDb250YWluZXJSZWY7XG5cbiAgQElucHV0KClcbiAgZ2V0IGZpbGVzKCkge1xuICAgIHJldHVybiB0aGlzLl9maWxlcztcbiAgfVxuICBzZXQgZmlsZXModmFsdWU6IEFycmF5PGFueT4pIHtcbiAgICB0aGlzLl9maWxlcyA9IHZhbHVlO1xuICAgIHRoaXMuc29ydEl0ZW0oKTtcbiAgfVxuICBASW5wdXQoKVxuICBnZXQgYWNjZXB0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2FjY2VwdDtcbiAgfVxuICBzZXQgYWNjZXB0KHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9hY2NlcHQgPSB2YWx1ZTtcbiAgICB0aGlzLnNvcnRJdGVtKCk7XG4gIH1cbiAgQElucHV0KClcbiAgZ2V0IGxlbmd0aCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9jb3VudDtcbiAgfVxuICBzZXQgbGVuZ3RoKHZhbHVlOiBudW1iZXIpIHtcbiAgICBpZiAodmFsdWUgPiAwKSB7XG4gICAgICB0aGlzLl9jb3VudCA9IHZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9jb3VudCA9IDQ7XG4gICAgfVxuICAgIHRoaXMuc29ydEl0ZW0oKTtcbiAgfVxuICBASW5wdXQoKVxuICBnZXQgbXVsdGlwbGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX211bHRpcGxlO1xuICB9XG4gIHNldCBtdWx0aXBsZSh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX211bHRpcGxlID0gdmFsdWU7XG4gICAgdGhpcy5zb3J0SXRlbSgpO1xuICB9XG4gIEBJbnB1dCgpXG4gIGdldCBzZWxlY3RhYmxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9zZWxlY3RhYmxlO1xuICB9XG4gIHNldCBzZWxlY3RhYmxlKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fc2VsZWN0YWJsZSA9IHZhbHVlO1xuICAgIHRoaXMuc29ydEl0ZW0oKTtcbiAgfVxuICBAT3V0cHV0KClcbiAgb25GYWlsOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpXG4gIG9uQ2hhbmdlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpXG4gIG9uSW1hZ2VDbGljazogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKVxuICBvbkFkZEltYWdlQ2xpY2s6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIGNvbnN0cnVjdG9yKCkge31cblxuICBzb3J0SXRlbSgpIHtcbiAgICBpZiAoIXRoaXMuX2ZpbGVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCBjb3VudCA9IHBhcnNlSW50KCcnICsgdGhpcy5fY291bnQsIDEwKTtcbiAgICBpZiAoY291bnQgPD0gMCkge1xuICAgICAgY291bnQgPSA0O1xuICAgIH1cbiAgICBsZXQgYWxsRWw6IEVsZW1lbnRUeXBlW10gPSB0aGlzLl9maWxlcy5tYXAoaXRlbSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiAnaW1nJyxcbiAgICAgICAgYmFja2dyb3VuZEltYWdlOiAndXJsKCcgKyBpdGVtLnVybCArICcpJyxcbiAgICAgICAgdHJhbnNmb3JtOiAncm90YXRlKCcgKyB0aGlzLmdldFJvdGF0aW9uKGl0ZW0ub3JpZW50YXRpb24pICsgJylkZWcnXG4gICAgICB9O1xuICAgIH0pO1xuICAgIGlmICh0aGlzLl9zZWxlY3RhYmxlKSB7XG4gICAgICBhbGxFbC5wdXNoKHtcbiAgICAgICAgdHlwZTogJ3NlbGVjdCcsXG4gICAgICAgIGJhY2tncm91bmRJbWFnZTogJycsXG4gICAgICAgIHRyYW5zZm9ybTogJydcbiAgICAgIH0pO1xuICAgIH1cbiAgICBjb25zdCBsZW5ndGggPSBhbGxFbC5sZW5ndGg7XG4gICAgaWYgKGxlbmd0aCAhPT0gMCAmJiBsZW5ndGggJSBjb3VudCAhPT0gMCkge1xuICAgICAgY29uc3QgYmxhbmtDb3VudCA9IGNvdW50IC0gKGxlbmd0aCAlIGNvdW50KTtcbiAgICAgIGNvbnN0IGZpbGxCbGFua0VsOiBhbnlbXSA9IFtdO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBibGFua0NvdW50OyBpKyspIHtcbiAgICAgICAgZmlsbEJsYW5rRWwucHVzaCh7XG4gICAgICAgICAgdHlwZTogJ3doaXRlJyxcbiAgICAgICAgICBiYWNrZ3JvdW5kSW1hZ2U6ICcnLFxuICAgICAgICAgIHRyYW5zZm9ybTogJydcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBhbGxFbCA9IGFsbEVsLmNvbmNhdChmaWxsQmxhbmtFbCk7XG4gICAgfVxuICAgIHRoaXMuZmxleEVsID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhbGxFbC5sZW5ndGggLyBjb3VudDsgaSsrKSB7XG4gICAgICBjb25zdCByb3dFbCA9IGFsbEVsLnNsaWNlKGkgKiBjb3VudCwgaSAqIGNvdW50ICsgY291bnQpO1xuICAgICAgdGhpcy5mbGV4RWwucHVzaChyb3dFbCk7XG4gICAgfVxuICB9XG5cbiAgYWRkSW1hZ2UoaW1nSXRlbTogYW55KSB7XG4gICAgdGhpcy5fZmlsZXMucHVzaCh7XG4gICAgICB0eXBlOiAnaW1nJyxcbiAgICAgIHVybDogaW1nSXRlbS51cmwsXG4gICAgICBvcmllbnRhdGlvbjogaW1nSXRlbS5vcmllbnRhdGlvblxuICAgIH0pO1xuICAgIHRoaXMuc29ydEl0ZW0oKTtcbiAgICB0aGlzLm9uQ2hhbmdlLmVtaXQoe1xuICAgICAgZmlsZXM6IHRoaXMuX2ZpbGVzLFxuICAgICAgb3BlcmF0aW9uVHlwZTogJ2FkZCcsXG4gICAgICBpbmRleDogdGhpcy5fZmlsZXMubGVuZ3RoIC0gMVxuICAgIH0pO1xuICB9XG5cbiAgcmVtb3ZlSW1hZ2UoaW5kZXg6IG51bWJlcikge1xuICAgIHRoaXMuX2ZpbGVzLnNwbGljZShpbmRleCwgMSk7XG4gICAgdGhpcy5zb3J0SXRlbSgpO1xuICAgIHRoaXMub25DaGFuZ2UuZW1pdCh7XG4gICAgICBmaWxlczogdGhpcy5fZmlsZXMsXG4gICAgICBvcGVyYXRpb25UeXBlOiAncmVtb3ZlJyxcbiAgICAgIGluZGV4OiBpbmRleFxuICAgIH0pO1xuICB9XG5cbiAgaW1hZ2VDbGljayhpbmRleDogbnVtYmVyKSB7XG4gICAgdGhpcy5vbkltYWdlQ2xpY2suZW1pdCh7XG4gICAgICBpbmRleDogaW5kZXgsXG4gICAgICBmaWxlczogdGhpcy5fZmlsZXNcbiAgICB9KTtcbiAgfVxuXG4gIGFkZEltYWdlQ2xpY2soZSkge1xuICAgIHRoaXMub25BZGRJbWFnZUNsaWNrLmVtaXQoZSk7XG4gIH1cblxuICBwYXJzZUZpbGUoZmlsZTogYW55LCBpbmRleDogbnVtYmVyKSB7XG4gICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICByZWFkZXIub25sb2FkID0gZSA9PiB7XG4gICAgICBjb25zdCBkYXRhVVJMID0gKGUudGFyZ2V0IGFzIGFueSkucmVzdWx0O1xuICAgICAgaWYgKCFkYXRhVVJMKSB7XG4gICAgICAgIHRoaXMub25GYWlsLmVtaXQoYEZhaWwgdG8gZ2V0IHRoZSAke2luZGV4fSBpbWFnZWApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGxldCBvcmllbnRhdGlvbiA9IDE7XG4gICAgICB0aGlzLmdldE9yaWVudGF0aW9uKGZpbGUsIHJlcyA9PiB7XG4gICAgICAgIC8vIC0yOiBub3QganBlZyAsIC0xOiBub3QgZGVmaW5lZFxuICAgICAgICBpZiAocmVzID4gMCkge1xuICAgICAgICAgIG9yaWVudGF0aW9uID0gcmVzO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYWRkSW1hZ2Uoe1xuICAgICAgICAgIHVybDogZGF0YVVSTCxcbiAgICAgICAgICBvcmllbnRhdGlvbixcbiAgICAgICAgICBmaWxlXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfTtcbiAgICByZWFkZXIucmVhZEFzRGF0YVVSTChmaWxlKTtcbiAgfVxuXG4gIGZpbGVDaGFuZ2UoZXZlbnQpIHtcbiAgICBjb25zdCBmaWxlTGlzdDogRmlsZUxpc3QgPSBldmVudC50YXJnZXQuZmlsZXM7XG4gICAgaWYgKGZpbGVMaXN0ICYmIGZpbGVMaXN0Lmxlbmd0aCkge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmaWxlTGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICB0aGlzLnBhcnNlRmlsZShmaWxlTGlzdFtpXSwgaSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZ2V0Um90YXRpb24ob3JpZW50YXRpb24gPSAxKSB7XG4gICAgbGV0IGltZ1JvdGF0aW9uID0gMDtcbiAgICBzd2l0Y2ggKG9yaWVudGF0aW9uKSB7XG4gICAgICBjYXNlIDM6XG4gICAgICAgIGltZ1JvdGF0aW9uID0gMTgwO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgNjpcbiAgICAgICAgaW1nUm90YXRpb24gPSA5MDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDg6XG4gICAgICAgIGltZ1JvdGF0aW9uID0gMjcwO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgfVxuICAgIHJldHVybiBpbWdSb3RhdGlvbjtcbiAgfVxuXG4gIC8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNzU4NDc5NC9hY2Nlc3NpbmctanBlZy1leGlmLXJvdGF0aW9uLWRhdGEtaW4tamF2YXNjcmlwdC1vbi10aGUtY2xpZW50LXNpZGVcbiAgZ2V0T3JpZW50YXRpb24oZmlsZTogYW55LCBjYWxsYmFjazogKF86IG51bWJlcikgPT4gdm9pZCkge1xuICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgcmVhZGVyLm9ubG9hZCA9IGUgPT4ge1xuICAgICAgY29uc3QgdmlldyA9IG5ldyBEYXRhVmlldygoZS50YXJnZXQgYXMgYW55KS5yZXN1bHQpO1xuICAgICAgaWYgKHZpZXcuZ2V0VWludDE2KDAsIGZhbHNlKSAhPT0gMHhmZmQ4KSB7XG4gICAgICAgIHJldHVybiBjYWxsYmFjaygtMik7XG4gICAgICB9XG4gICAgICBjb25zdCBsZW5ndGggPSB2aWV3LmJ5dGVMZW5ndGg7XG4gICAgICBsZXQgb2Zmc2V0ID0gMjtcbiAgICAgIHdoaWxlIChvZmZzZXQgPCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3QgbWFya2VyID0gdmlldy5nZXRVaW50MTYob2Zmc2V0LCBmYWxzZSk7XG4gICAgICAgIG9mZnNldCArPSAyO1xuICAgICAgICBpZiAobWFya2VyID09PSAweGZmZTEpIHtcbiAgICAgICAgICBjb25zdCB0bXAgPSB2aWV3LmdldFVpbnQzMigob2Zmc2V0ICs9IDIpLCBmYWxzZSk7XG4gICAgICAgICAgaWYgKHRtcCAhPT0gMHg0NTc4Njk2Nikge1xuICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKC0xKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgbGl0dGxlID0gdmlldy5nZXRVaW50MTYoKG9mZnNldCArPSA2KSwgZmFsc2UpID09PSAweDQ5NDk7XG4gICAgICAgICAgb2Zmc2V0ICs9IHZpZXcuZ2V0VWludDMyKG9mZnNldCArIDQsIGxpdHRsZSk7XG4gICAgICAgICAgY29uc3QgdGFncyA9IHZpZXcuZ2V0VWludDE2KG9mZnNldCwgbGl0dGxlKTtcbiAgICAgICAgICBvZmZzZXQgKz0gMjtcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRhZ3M7IGkrKykge1xuICAgICAgICAgICAgaWYgKHZpZXcuZ2V0VWludDE2KG9mZnNldCArIGkgKiAxMiwgbGl0dGxlKSA9PT0gMHgwMTEyKSB7XG4gICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayh2aWV3LmdldFVpbnQxNihvZmZzZXQgKyBpICogMTIgKyA4LCBsaXR0bGUpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoKG1hcmtlciAmIDB4ZmYwMCkgIT09IDB4ZmYwMCkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG9mZnNldCArPSB2aWV3LmdldFVpbnQxNihvZmZzZXQsIGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGNhbGxiYWNrKC0xKTtcbiAgICB9O1xuICAgIHJlYWRlci5yZWFkQXNBcnJheUJ1ZmZlcihmaWxlLnNsaWNlKDAsIDY0ICogMTAyNCkpO1xuICB9XG59XG4iXX0=