'use strict';(function(){function l(d,b){const a=b?b:{};return a.signal&&a.signal.aborted?Promise.reject({type:"cancel",reason:a.signal.reason}):new Promise(function(f,e){a.signal&&"function"===typeof a.signal.addEventListener&&a.signal.addEventListener("abort",function(){e({type:"cancel",reason:a.signal.reason})});d(f,e,a)})}function m(d,b){return l(function(a){setTimeout(a,d)},b?b:{})}window.Reci||(window.Reci={});window.Reci.Utils||(window.Reci.Utils={});window.Reci.Utils.promise={abortable:l, delay:m,instance:function(){function d(){return"function"===typeof b.resolve?!0:!1}const b={};return{start:function(){return d()?Promise.reject({type:"busy"}):(new Promise(function(a,f){b.resolve=a;b.reject=f})).finally(function(){b.resolve=null;b.reject=null})},resolve:function(a){"function"===typeof b.resolve&&b.resolve(a)},reject:function(a){"function"===typeof b.reject&&b.reject(a)},isBusy:d}},singleton:function(){function d(){return e.abort_ctrl?!0:!1}function b(g){return e.abort_ctrl?new Promise(function(c){e.abort_hdl.push(c); e.abort_ctrl.abort(g)}):Promise.resolve()}function a(g,c){const h=c?c:{};if(d())return Promise.reject({type:"busy"});c=new AbortController;e.abort_ctrl=c;const k={};k.signal=c.signal;c=Promise.resolve();"undefined"!==typeof h.ms&&(c=c.then(function(){return m(h.ms,k).catch(n=>{throw n;})}));c=c.then(function(){return l(g,k)});return c.finally(function(){for(e.abort_ctrl=null;e.abort_hdl.length;)e.abort_hdl.splice(0,1)[0]()})}function f(g,c){return a(function(h){const k={};k.signal=e.abort_ctrl.signal; h(g(k))},c?c:{})}const e={abort_ctrl:null,abort_hdl:[]};return{isBusy:d,cancel:b,start:a,exec:f,interrupt:function(g,c){const h=c?c:{};return b("by new thread").then(function(){return a(g,h)})},interruptExec:function(g,c){const h=c?c:{};return b("by new thread").then(function(){return f(g,h)})}}},blob2DataURL:function(d){return d instanceof Blob?new Promise(function(b,a){const f=new FileReader;f.addEventListener("load",function(){b(f.result)},!1);f.addEventListener("error",a);f.readAsDataURL(d)}): Promise.reject(new TypeError("argument blob required"))},confirm:function(d){return new Promise(function(b,a){window.confirm(d)?b():a({type:"cancel",reason:"by user"})})}}})();