UNPKG

ngx-quill-upload

Version:

A module for images and videos to be uploaded to a server instead of being base64 encoded, in ngx-quill from toolbar editor.

122 lines 20.3 kB
import Styled from './Styled'; import { Constants, Helpers } from '../utils'; class BaseHandler { constructor(quill, options) { this.helpers = new Helpers(); this.quill = quill; this.options = options; this.range = null; new Styled().apply(); if (this.isNotExistLoading()) { const node = document.createElement('div'); node.innerHTML = this.helpers.loadingHTML(); this.quill.container.appendChild(node); } if (typeof this.options.upload !== 'function') { console.warn('[Missing config] upload function that returns a promise is required'); } setTimeout(() => { if (!this.options.accepts) { if (this.handler === Constants.blots.image) { this.options.accepts = ['jpg', 'jpeg', 'png']; } if (this.handler === Constants.blots.video) { this.options.accepts = ['mp4', 'webm']; } } if (this.handler === Constants.blots.image) { this.possibleExtension = new Set(['apng', 'bmp', 'gif', 'ico', 'cur', 'jpg', 'jpeg', 'jfif', 'pjpeg', 'pjp', 'png', 'svg', 'tif', 'tiff', 'webp']); } if (this.handler === Constants.blots.video) { this.possibleExtension = new Set(['mp4', 'webm', '3gp', 'mp4', 'mpeg', 'quickTime', 'ogg']); } this.allowedFormatRegex = new RegExp('^(' + this.options.accepts.filter((el) => this.possibleExtension.has(el.toLowerCase())) .reduce((acc, el, i) => acc.concat(i !== 0 ? `|${el}` : `${el}`), '') + ')$', 'i'); }, 1); } applyForToolbar() { const toolbar = this.quill.getModule('toolbar'); this.loading = document.getElementById(`${Constants.ID_SPLIT_FLAG}.QUILL-LOADING`); toolbar.addHandler(this.handler, this.selectLocalFile.bind(this)); } selectLocalFile() { this.range = this.quill.getSelection(); this.fileHolder = document.createElement('input'); this.fileHolder.setAttribute('type', 'file'); this.fileHolder.setAttribute('accept', `${this.handler}/*`); this.fileHolder.onchange = this.fileChanged.bind(this); this.fileHolder.click(); } loadFile(context) { this.loading.removeAttribute('class'); this.loading.setAttribute('class', Constants.LOADING_CLASS_NAME); const file = context.fileHolder.files[0]; this.handlerId = this.helpers.generateID(); const fileReader = new FileReader(); fileReader.addEventListener('load', () => { this.insertBase64Data(fileReader.result, this.handlerId); }, false); if (!file) { console.warn('[File not found] Something was wrong, please try again!!'); return null; } fileReader.readAsDataURL(file); return { file, handlerId: this.handlerId }; } fileChanged() { const { file, handlerId } = this.loadFile(this); if (!file) { return; } const extension = file.name.split('.').pop(); if (!this.isValidExtension(extension)) { console.warn('[Wrong Format] Format was wrong, please try with correct format!!'); } if (!this.hasValidMimeType(file.type)) { console.warn(`[Incorrect Mime Type] The MIME Type of uploaded file is not ${this.handler}!!`); } this.embedFile(file, handlerId); } embedFile(file, handlerId) { this.options.upload(file).then((url) => { this.insertFileToEditor(url, handlerId); this.loading.removeAttribute('class'); this.loading.setAttribute('class', Constants.NONE_DISPLAY_CLASS_NAME); }, (error) => { this.loading.removeAttribute('class'); this.loading.setAttribute('class', Constants.NONE_DISPLAY_CLASS_NAME); setTimeout(() => { const el = document.getElementById(handlerId); el.remove(); }, 1000); }); } insertBase64Data(url, handlerId) { const range = this.range; this.quill.insertEmbed(range.index, this.handler, `${handlerId}${Constants.ID_SPLIT_FLAG}${url}`); const el = document.getElementById(handlerId); if (el) { el.setAttribute('class', Constants.QUILL_UPLOAD_HOLDER_CLASS_NAME); } } insertFileToEditor(url, handlerId) { const el = document.getElementById(handlerId); if (el) { el.setAttribute('src', url); el.removeAttribute('id'); el.removeAttribute('class'); } } isValidExtension(extension) { return extension && this.allowedFormatRegex.test(extension); } hasValidMimeType(type) { return type && type.startsWith(this.handler); } isNotExistLoading() { const loading = document.getElementById(`${Constants.ID_SPLIT_FLAG}.QUILL-LOADING`); return loading == null; } } export default BaseHandler; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQmFzZUhhbmRsZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvaGFuZGxlcnMvQmFzZUhhbmRsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxNQUFNLE1BQU0sVUFBVSxDQUFDO0FBQzlCLE9BQU8sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBWTlDLE1BQU0sV0FBVztJQVlmLFlBQVksS0FBSyxFQUFFLE9BQWdCO1FBSm5DLFlBQU8sR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBS3RCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ25CLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO1FBRWxCLElBQUksTUFBTSxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7UUFFckIsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsRUFBRTtZQUM1QixNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzNDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUU1QyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDeEM7UUFFRCxJQUFJLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEtBQUssVUFBVSxFQUFFO1lBQzdDLE9BQU8sQ0FBQyxJQUFJLENBQUMscUVBQXFFLENBQUMsQ0FBQztTQUNyRjtRQUVELFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDZCxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUU7Z0JBQ3pCLElBQUksSUFBSSxDQUFDLE9BQU8sS0FBSyxTQUFTLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRTtvQkFD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LE9BQU8sSUFBSSxJQUFJLENBQUM7SUFDekIsQ0FBQztDQUNGO0FBRUQsZUFBZSxXQUFXLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgU3R5bGVkIGZyb20gJy4vU3R5bGVkJztcclxuaW1wb3J0IHsgQ29uc3RhbnRzLCBIZWxwZXJzIH0gZnJvbSAnLi4vdXRpbHMnO1xyXG5cclxuaW50ZXJmYWNlIFJhbmdlIHtcclxuICBpbmRleDogbnVtYmVyO1xyXG4gIGxlbmd0aDogbnVtYmVyO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIE9wdGlvbnMge1xyXG4gIGFjY2VwdHM6IHN0cmluZ1tdO1xyXG4gIHVwbG9hZChmaWxlOiBGaWxlKTogUHJvbWlzZTxzdHJpbmc+O1xyXG59XHJcblxyXG5jbGFzcyBCYXNlSGFuZGxlciB7XHJcbiAgcXVpbGw6IGFueTtcclxuICBvcHRpb25zOiBPcHRpb25zO1xyXG4gIHJhbmdlOiBSYW5nZSB8IG51bGw7XHJcbiAgaGFuZGxlcjogc3RyaW5nO1xyXG4gIGxvYWRpbmc6IEhUTUxFbGVtZW50O1xyXG4gIGZpbGVIb2xkZXI6IEhUTUxJbnB1dEVsZW1lbnQ7XHJcbiAgaGFuZGxlcklkOiBzdHJpbmc7XHJcbiAgaGVscGVycyA9IG5ldyBIZWxwZXJzKCk7XHJcbiAgYWxsb3dlZEZvcm1hdFJlZ2V4OiBSZWdFeHA7XHJcbiAgcG9zc2libGVFeHRlbnNpb246IFNldDxzdHJpbmc+O1xyXG5cclxuICBjb25zdHJ1Y3RvcihxdWlsbCwgb3B0aW9uczogT3B0aW9ucykge1xyXG4gICAgdGhpcy5xdWlsbCA9IHF1aWxsO1xyXG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcclxuICAgIHRoaXMucmFuZ2UgPSBudWxsO1xyXG5cclxuICAgIG5ldyBTdHlsZWQoKS5hcHBseSgpO1xyXG5cclxuICAgIGlmICh0aGlzLmlzTm90RXhpc3RMb2FkaW5nKCkpIHtcclxuICAgICAgY29uc3Qgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICBub2RlLmlubmVySFRNTCA9IHRoaXMuaGVscGVycy5sb2FkaW5nSFRNTCgpO1xyXG5cclxuICAgICAgdGhpcy5xdWlsbC5jb250YWluZXIuYXBwZW5kQ2hpbGQobm9kZSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHR5cGVvZiB0aGlzLm9wdGlvbnMudXBsb2FkICE9PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybignW01pc3NpbmcgY29uZmlnXSB1cGxvYWQgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgcHJvbWlzZSBpcyByZXF1aXJlZCcpO1xyXG4gICAgfVxyXG5cclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICBpZiAoIXRoaXMub3B0aW9ucy5hY2NlcHRzKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuaGFuZGxlciA9PT0gQ29uc3RhbnRzLmJsb3RzLmltYWdlKSB7XHJcbiAgICAgICAgICB0aGlzLm9wdGlvbnMuYWNjZXB0cyA9IFsnanBnJywgJ2pwZWcnLCAncG5nJ107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmhhbmRsZXIgPT09IENvbnN0YW50cy5ibG90cy52aWRlbykge1xyXG4gICAgICAgICAgdGhpcy5vcHRpb25zLmFjY2VwdHMgPSBbJ21wNCcsICd3ZWJtJ107XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodGhpcy5oYW5kbGVyID09PSBDb25zdGFudHMuYmxvdHMuaW1hZ2UpIHtcclxuICAgICAgICB0aGlzLnBvc3NpYmxlRXh0ZW5zaW9uID0gbmV3IFNldChbJ2FwbmcnLCAnYm1wJywgJ2dpZicsICdpY28nLCAnY3VyJywgJ2pwZycsICdqcGVnJywgJ2pmaWYnLCAncGpwZWcnLCAncGpwJywgJ3BuZycsICdzdmcnLCAndGlmJywgJ3RpZmYnLCAnd2VicCddKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAodGhpcy5oYW5kbGVyID09PSBDb25zdGFudHMuYmxvdHMudmlkZW8pIHtcclxuICAgICAgICB0aGlzLnBvc3NpYmxlRXh0ZW5zaW9uID0gbmV3IFNldChbJ21wNCcsICd3ZWJtJywgJzNncCcsICdtcDQnLCAnbXBlZycsICdxdWlja1RpbWUnLCAnb2dnJ10pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLmFsbG93ZWRGb3JtYXRSZWdleCA9IG5ldyBSZWdFeHAoJ14oJyArIHRoaXMub3B0aW9ucy5hY2NlcHRzLmZpbHRlcigoZWwpID0+IHRoaXMucG9zc2libGVFeHRlbnNpb24uaGFzKGVsLnRvTG93ZXJDYXNlKCkpKVxyXG4gICAgICAucmVkdWNlKChhY2MsIGVsLCBpKSA9PiBhY2MuY29uY2F0KGkgIT09IDAgPyBgfCR7ZWx9YCA6IGAke2VsfWApLCAnJykgKyAnKSQnLCAnaScpO1xyXG4gICAgfSwgMSk7XHJcbiAgfVxyXG5cclxuICBhcHBseUZvclRvb2xiYXIoKSB7XHJcbiAgICBjb25zdCB0b29sYmFyID0gdGhpcy5xdWlsbC5nZXRNb2R1bGUoJ3Rvb2xiYXInKTtcclxuICAgIHRoaXMubG9hZGluZyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFxyXG4gICAgICBgJHtDb25zdGFudHMuSURfU1BMSVRfRkxBR30uUVVJTEwtTE9BRElOR2BcclxuICAgICk7XHJcbiAgICB0b29sYmFyLmFkZEhhbmRsZXIodGhpcy5oYW5kbGVyLCB0aGlzLnNlbGVjdExvY2FsRmlsZS5iaW5kKHRoaXMpKTtcclxuICB9XHJcblxyXG4gIHNlbGVjdExvY2FsRmlsZSgpIHtcclxuICAgIHRoaXMucmFuZ2UgPSB0aGlzLnF1aWxsLmdldFNlbGVjdGlvbigpO1xyXG4gICAgdGhpcy5maWxlSG9sZGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTtcclxuICAgIHRoaXMuZmlsZUhvbGRlci5zZXRBdHRyaWJ1dGUoJ3R5cGUnLCAnZmlsZScpO1xyXG4gICAgdGhpcy5maWxlSG9sZGVyLnNldEF0dHJpYnV0ZSgnYWNjZXB0JywgYCR7dGhpcy5oYW5kbGVyfS8qYCk7XHJcbiAgICB0aGlzLmZpbGVIb2xkZXIub25jaGFuZ2UgPSB0aGlzLmZpbGVDaGFuZ2VkLmJpbmQodGhpcyk7XHJcbiAgICB0aGlzLmZpbGVIb2xkZXIuY2xpY2soKTtcclxuICB9XHJcblxyXG4gIGxvYWRGaWxlKGNvbnRleHQpIHtcclxuICAgIHRoaXMubG9hZGluZy5yZW1vdmVBdHRyaWJ1dGUoJ2NsYXNzJyk7XHJcbiAgICB0aGlzLmxvYWRpbmcuc2V0QXR0cmlidXRlKCdjbGFzcycsIENvbnN0YW50cy5MT0FESU5HX0NMQVNTX05BTUUpO1xyXG5cclxuICAgIGNvbnN0IGZpbGUgPSBjb250ZXh0LmZpbGVIb2xkZXIuZmlsZXNbMF07XHJcbiAgICB0aGlzLmhhbmRsZXJJZCA9IHRoaXMuaGVscGVycy5nZW5lcmF0ZUlEKCk7XHJcblxyXG4gICAgY29uc3QgZmlsZVJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XHJcbiAgICBmaWxlUmVhZGVyLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCAoKSA9PiB7XHJcbiAgICAgIHRoaXMuaW5zZXJ0QmFzZTY0RGF0YShmaWxlUmVhZGVyLnJlc3VsdCwgdGhpcy5oYW5kbGVySWQpO1xyXG4gICAgfSwgZmFsc2UpO1xyXG5cclxuICAgIGlmICghZmlsZSkge1xyXG4gICAgICBjb25zb2xlLndhcm4oJ1tGaWxlIG5vdCBmb3VuZF0gU29tZXRoaW5nIHdhcyB3cm9uZywgcGxlYXNlIHRyeSBhZ2FpbiEhJyk7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGZpbGVSZWFkZXIucmVhZEFzRGF0YVVSTChmaWxlKTtcclxuXHJcbiAgICByZXR1cm4geyBmaWxlLCBoYW5kbGVySWQ6IHRoaXMuaGFuZGxlcklkIH07XHJcbiAgfVxyXG5cclxuICBmaWxlQ2hhbmdlZCgpIHtcclxuICAgIGNvbnN0IHsgZmlsZSwgaGFuZGxlcklkIH0gPSB0aGlzLmxvYWRGaWxlKHRoaXMpO1xyXG5cclxuICAgIGlmICghZmlsZSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgZXh0ZW5zaW9uID0gZmlsZS5uYW1lLnNwbGl0KCcuJykucG9wKCk7XHJcblxyXG4gICAgaWYgKCF0aGlzLmlzVmFsaWRFeHRlbnNpb24oZXh0ZW5zaW9uKSkge1xyXG4gICAgICBjb25zb2xlLndhcm4oXHJcbiAgICAgICAgJ1tXcm9uZyBGb3JtYXRdIEZvcm1hdCB3YXMgd3JvbmcsIHBsZWFzZSB0cnkgd2l0aCBjb3JyZWN0IGZvcm1hdCEhJ1xyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghdGhpcy5oYXNWYWxpZE1pbWVUeXBlKGZpbGUudHlwZSkpIHtcclxuICAgICAgY29uc29sZS53YXJuKFxyXG4gICAgICAgIGBbSW5jb3JyZWN0IE1pbWUgVHlwZV0gVGhlIE1JTUUgVHlwZSBvZiB1cGxvYWRlZCBmaWxlIGlzIG5vdCAke3RoaXMuaGFuZGxlcn0hIWBcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmVtYmVkRmlsZShmaWxlLCBoYW5kbGVySWQpO1xyXG4gIH1cclxuXHJcbiAgZW1iZWRGaWxlKGZpbGU6IEZpbGUsIGhhbmRsZXJJZDogc3RyaW5nKSB7XHJcbiAgICB0aGlzLm9wdGlvbnMudXBsb2FkKGZpbGUpLnRoZW4oXHJcbiAgICAgICh1cmwpID0+IHtcclxuICAgICAgICB0aGlzLmluc2VydEZpbGVUb0VkaXRvcih1cmwsIGhhbmRsZXJJZCk7XHJcbiAgICAgICAgdGhpcy5sb2FkaW5nLnJlbW92ZUF0dHJpYnV0ZSgnY2xhc3MnKTtcclxuICAgICAgICB0aGlzLmxvYWRpbmcuc2V0QXR0cmlidXRlKCdjbGFzcycsIENvbnN0YW50cy5OT05FX0RJU1BMQVlfQ0xBU1NfTkFNRSk7XHJcbiAgICAgIH0sXHJcbiAgICAgIChlcnJvcikgPT4ge1xyXG4gICAgICAgIHRoaXMubG9hZGluZy5yZW1vdmVBdHRyaWJ1dGUoJ2NsYXNzJyk7XHJcbiAgICAgICAgdGhpcy5sb2FkaW5nLnNldEF0dHJpYnV0ZSgnY2xhc3MnLCBDb25zdGFudHMuTk9ORV9ESVNQTEFZX0NMQVNTX05BTUUpO1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChoYW5kbGVySWQpO1xyXG4gICAgICAgICAgZWwucmVtb3ZlKCk7XHJcbiAgICAgICAgfSwgMTAwMCk7XHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBpbnNlcnRCYXNlNjREYXRhKHVybDogc3RyaW5nIHwgQXJyYXlCdWZmZXIsIGhhbmRsZXJJZDogc3RyaW5nKSB7XHJcbiAgICBjb25zdCByYW5nZSA9IHRoaXMucmFuZ2U7XHJcbiAgICB0aGlzLnF1aWxsLmluc2VydEVtYmVkKFxyXG4gICAgICByYW5nZS5pbmRleCxcclxuICAgICAgdGhpcy5oYW5kbGVyLFxyXG4gICAgICBgJHtoYW5kbGVySWR9JHtDb25zdGFudHMuSURfU1BMSVRfRkxBR30ke3VybH1gXHJcbiAgICApO1xyXG5cclxuICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaGFuZGxlcklkKTtcclxuXHJcbiAgICBpZiAoZWwpIHtcclxuICAgICAgZWwuc2V0QXR0cmlidXRlKCdjbGFzcycsIENvbnN0YW50cy5RVUlMTF9VUExPQURfSE9MREVSX0NMQVNTX05BTUUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaW5zZXJ0RmlsZVRvRWRpdG9yKHVybDogc3RyaW5nLCBoYW5kbGVySWQ6IHN0cmluZykge1xyXG4gICAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChoYW5kbGVySWQpO1xyXG4gICAgaWYgKGVsKSB7XHJcbiAgICAgIGVsLnNldEF0dHJpYnV0ZSgnc3JjJywgdXJsKTtcclxuICAgICAgZWwucmVtb3ZlQXR0cmlidXRlKCdpZCcpO1xyXG4gICAgICBlbC5yZW1vdmVBdHRyaWJ1dGUoJ2NsYXNzJyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBpc1ZhbGlkRXh0ZW5zaW9uKGV4dGVuc2lvbjogc3RyaW5nKSB7XHJcbiAgICByZXR1cm4gZXh0ZW5zaW9uICYmIHRoaXMuYWxsb3dlZEZvcm1hdFJlZ2V4LnRlc3QoZXh0ZW5zaW9uKTtcclxuICB9XHJcblxyXG4gIGhhc1ZhbGlkTWltZVR5cGUodHlwZTogc3RyaW5nKSB7XHJcbiAgICByZXR1cm4gdHlwZSAmJiB0eXBlLnN0YXJ0c1dpdGgodGhpcy5oYW5kbGVyKTtcclxuICB9XHJcblxyXG4gIGlzTm90RXhpc3RMb2FkaW5nKCkge1xyXG4gICAgY29uc3QgbG9hZGluZyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFxyXG4gICAgICBgJHtDb25zdGFudHMuSURfU1BMSVRfRkxBR30uUVVJTEwtTE9BRElOR2BcclxuICAgICk7XHJcblxyXG4gICAgcmV0dXJuIGxvYWRpbmcgPT0gbnVsbDtcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IEJhc2VIYW5kbGVyO1xyXG4iXX0=